@colijnit/transaction 12.1.226 → 254.1.2

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 (102) hide show
  1. package/bundles/colijnit-transaction.umd.js +2708 -656
  2. package/bundles/colijnit-transaction.umd.js.map +1 -1
  3. package/colijnit-transaction.d.ts +308 -295
  4. package/colijnit-transaction.metadata.json +1 -1
  5. package/esm2015/colijnit-transaction.js +309 -296
  6. package/esm2015/lib/component/checkout/checkout.component.js +30 -1
  7. package/esm2015/lib/component/checkout-simple/checkout-simple-overview-delivery-edit/checkout-simple-overview-delivery-edit.component.js +213 -0
  8. package/esm2015/lib/component/checkout-simple/checkout-simple-overview-payment/checkout-simple-overview-payment.component.js +105 -0
  9. package/esm2015/lib/component/checkout-simple/checkout-simple-overview-relation-edit/checkout-simple-overview-relation-edit.component.js +256 -0
  10. package/esm2015/lib/component/checkout-simple/checkout-simple.component.js +186 -0
  11. package/esm2015/lib/component/checkout-simple/checkout-simple.module.js +88 -0
  12. package/esm2015/lib/component/dialog/catalog/dialog-catalog/dialog-catalog.component.js +11 -4
  13. package/esm2015/lib/component/dialog/transaction-line/dialog-transaction-line-warehouse-cc/dialog-direct-sell.component.js +160 -9
  14. package/esm2015/lib/component/dialog/transaction-line/dialog-transaction-line-warehouse-cc/dialog-transaction-line-warehouse-cc.component.js +12 -10
  15. package/esm2015/lib/component/dialog/transaction-line/dialog-transaction-line-warehouse-cc/dialog-transaction-line-warehouse-cc.module.js +5 -3
  16. package/esm2015/lib/component/relation/relation-general/relation-general.component.js +28 -20
  17. package/esm2015/lib/component/service-wizard-qa/question-answer-item/question-answer-item.component.js +72 -0
  18. package/esm2015/lib/component/service-wizard-qa/question-answer-item/question-answer-item.module.js +23 -0
  19. package/esm2015/lib/component/service-wizard-qa/service-wizard-qa.component.js +38 -0
  20. package/esm2015/lib/component/service-wizard-qa/service-wizard-qa.module.js +25 -0
  21. package/esm2015/lib/component/transaction-create-wizard/transaction-create-wizard.component.js +137 -0
  22. package/esm2015/lib/component/transaction-create-wizard/transaction-create-wizard.module.js +38 -0
  23. package/esm2015/lib/component/transaction-header/transaction-header-popup/transaction-header-popup-create-service.component.js +134 -0
  24. package/esm2015/lib/component/transaction-header/transaction-header-popup/transaction-header-popup-relation.component.js +18 -11
  25. package/esm2015/lib/component/transaction-header/transaction-header-popup/transaction-header-popup-service-fields.component.js +41 -0
  26. package/esm2015/lib/component/transaction-header/transaction-header-popup/transaction-header-popup-service-wizard.component.js +40 -0
  27. package/esm2015/lib/component/transaction-header/transaction-header-popup/transaction-header-popup.module.js +21 -5
  28. package/esm2015/lib/component/transaction-internal/transaction-internal.component.js +16 -2
  29. package/esm2015/lib/component/transaction-line/transaction-invoice-line/transaction-invoice-line-base.component.js +4 -2
  30. package/esm2015/lib/component/transaction-line/transaction-order-delivery-line/transaction-order-delivery-line-base.component.js +1 -2
  31. package/esm2015/lib/component/transaction-line-action-buttons/transaction-line-action-buttons-popup.component.js +20 -9
  32. package/esm2015/lib/component/transaction-line-action-buttons/transaction-line-action-buttons.component.js +10 -7
  33. package/esm2015/lib/component/transaction-quick-access/transaction-quick-access-invoice/transaction-quick-access-invoice.component.js +1 -1
  34. package/esm2015/lib/component/transaction-search/transaction-filter-content/cash-desk-filter-content/transaction-cash-desk-filter-content-article/transaction-cash-desk-filter-content-article.component.js +2 -2
  35. package/esm2015/lib/component/transaction-search/transaction-filter-content/cash-desk-filter-content/transaction-cash-desk-filter-content-logistics/transaction-cash-desk-filter-content-logistics.component.js +3 -3
  36. package/esm2015/lib/component/transaction-search/transaction-filter-content/cash-desk-filter-content/transaction-cash-desk-filter-content-order/transaction-cash-desk-filter-content-order.component.js +2 -2
  37. package/esm2015/lib/component/transaction-search/transaction-filter-content/purchase-order-filter-content/transaction-purchase-order-filter-content-article/transaction-purchase-order-filter-content-article.component.js +2 -2
  38. package/esm2015/lib/component/transaction-search/transaction-filter-content/purchase-order-filter-content/transaction-purchase-order-filter-content-logistics/transaction-purchase-order-filter-content-logistics.component.js +3 -3
  39. package/esm2015/lib/component/transaction-search/transaction-filter-content/sales-order-filter-content/transaction-sales-order-filter-content-article/transaction-sales-order-filter-content-article.component.js +2 -2
  40. package/esm2015/lib/component/transaction-search/transaction-filter-content/sales-order-filter-content/transaction-sales-order-filter-content-logistics/transaction-sales-order-filter-content-logistics.component.js +3 -3
  41. package/esm2015/lib/component/transaction-search/transaction-filter-content/sales-order-filter-content/transaction-sales-order-filter-content-order/transaction-sales-order-filter-content-order.component.js +2 -2
  42. package/esm2015/lib/component/transaction-search/transaction-filter-content/sales-quotation-filter-content/transaction-sales-quotation-filter-content-article/transaction-sales-quotation-filter-content-article.component.js +2 -2
  43. package/esm2015/lib/component/transaction-search/transaction-filter-content/sales-quotation-filter-content/transaction-sales-quotation-filter-content-logistics/transaction-sales-quotation-filter-content-logistics.component.js +2 -2
  44. package/esm2015/lib/component/transaction-search/transaction-filter-content/sales-quotation-filter-content/transaction-sales-quotation-filter-content-order/transaction-sales-quotation-filter-content-order.component.js +2 -2
  45. package/esm2015/lib/component/transaction-search/transaction-search-result/transaction-search-result.module.js +1 -1
  46. package/esm2015/lib/component/transaction-service-overview/transaction-service-overview.component.js +32 -2
  47. package/esm2015/lib/component/transaction-service-overview/transaction-service-overview.module.js +4 -3
  48. package/esm2015/lib/service/dialog.service.js +4 -3
  49. package/esm2015/lib/service/pending-reason.service.js +4 -4
  50. package/esm2015/lib/service/transaction-base.service.js +7 -3
  51. package/esm2015/lib/service/transaction-connector-adapter.service.js +165 -1
  52. package/esm2015/lib/service/transaction-connector.service.js +69 -1
  53. package/esm2015/lib/service/transaction-create.service.js +67 -0
  54. package/esm2015/lib/service/transaction-creation.service.js +3 -2
  55. package/esm2015/lib/service/transaction-event.service.js +3 -1
  56. package/esm2015/lib/service/transaction-relation-connector.service.js +22 -1
  57. package/esm2015/lib/service/transaction-relation.service.js +7 -1
  58. package/esm2015/lib/service/transaction.service.js +136 -11
  59. package/esm2015/lib/transaction-version.js +3 -3
  60. package/esm2015/public_api.js +3 -1
  61. package/fesm2015/colijnit-transaction.js +2409 -388
  62. package/fesm2015/colijnit-transaction.js.map +1 -1
  63. package/lib/component/checkout/checkout.component.d.ts +9 -1
  64. package/lib/component/checkout-simple/checkout-simple-overview-delivery-edit/checkout-simple-overview-delivery-edit.component.d.ts +55 -0
  65. package/lib/component/checkout-simple/checkout-simple-overview-payment/checkout-simple-overview-payment.component.d.ts +22 -0
  66. package/lib/component/checkout-simple/checkout-simple-overview-relation-edit/checkout-simple-overview-relation-edit.component.d.ts +46 -0
  67. package/lib/component/checkout-simple/checkout-simple.component.d.ts +50 -0
  68. package/lib/component/checkout-simple/checkout-simple.module.d.ts +2 -0
  69. package/lib/component/dialog/catalog/dialog-catalog/dialog-catalog.component.d.ts +1 -0
  70. package/lib/component/dialog/transaction-line/dialog-transaction-line-warehouse-cc/dialog-direct-sell.component.d.ts +26 -3
  71. package/lib/component/dialog/transaction-line/dialog-transaction-line-warehouse-cc/style/_layout.scss +107 -1
  72. package/lib/component/relation/relation-general/relation-general.component.d.ts +3 -1
  73. package/lib/component/service-wizard-qa/question-answer-item/question-answer-item.component.d.ts +19 -0
  74. package/lib/component/service-wizard-qa/question-answer-item/question-answer-item.module.d.ts +2 -0
  75. package/lib/component/service-wizard-qa/question-answer-item/style/_layout.scss +28 -0
  76. package/lib/component/service-wizard-qa/question-answer-item/style/_material-definition.scss +24 -0
  77. package/lib/component/service-wizard-qa/question-answer-item/style/_theme.scss +5 -0
  78. package/lib/component/service-wizard-qa/question-answer-item/style/material.scss +3 -0
  79. package/lib/component/service-wizard-qa/service-wizard-qa.component.d.ts +12 -0
  80. package/lib/component/service-wizard-qa/service-wizard-qa.module.d.ts +2 -0
  81. package/lib/component/transaction-create-wizard/transaction-create-wizard.component.d.ts +34 -0
  82. package/lib/component/transaction-create-wizard/transaction-create-wizard.module.d.ts +2 -0
  83. package/lib/component/transaction-header/transaction-header-popup/style/_layout.scss +32 -1
  84. package/lib/component/transaction-header/transaction-header-popup/transaction-header-popup-create-service.component.d.ts +30 -0
  85. package/lib/component/transaction-header/transaction-header-popup/transaction-header-popup-relation.component.d.ts +3 -0
  86. package/lib/component/transaction-header/transaction-header-popup/transaction-header-popup-service-fields.component.d.ts +9 -0
  87. package/lib/component/transaction-header/transaction-header-popup/transaction-header-popup-service-wizard.component.d.ts +12 -0
  88. package/lib/component/transaction-internal/transaction-internal.component.d.ts +1 -0
  89. package/lib/component/transaction-line-action-buttons/transaction-line-action-buttons-popup.component.d.ts +2 -0
  90. package/lib/component/transaction-line-action-buttons/transaction-line-action-buttons.component.d.ts +2 -2
  91. package/lib/component/transaction-service-overview/transaction-service-overview.component.d.ts +6 -0
  92. package/lib/service/dialog.service.d.ts +2 -1
  93. package/lib/service/transaction-base.service.d.ts +3 -1
  94. package/lib/service/transaction-connector-adapter.service.d.ts +22 -0
  95. package/lib/service/transaction-connector.service.d.ts +22 -0
  96. package/lib/service/transaction-create.service.d.ts +7 -0
  97. package/lib/service/transaction-event.service.d.ts +5 -0
  98. package/lib/service/transaction-relation-connector.service.d.ts +1 -0
  99. package/lib/service/transaction-relation.service.d.ts +1 -0
  100. package/lib/service/transaction.service.d.ts +25 -1
  101. package/package.json +13 -12
  102. package/public_api.d.ts +2 -0
@@ -0,0 +1,256 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Component, EventEmitter, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core';
3
+ import { TransactionService } from '../../../service/transaction.service';
4
+ import { FormMasterService } from '@colijnit/corecomponents_v12';
5
+ import { animate, state, style, transition, trigger } from '@angular/animations';
6
+ import { Icon } from '../../../enum/icon.enum';
7
+ import { CustomerFullObject } from '@colijnit/relationapi/build/model/customer-full-object.bo';
8
+ import { RelationKind } from '@colijnit/relationapi/build/enum/relation-kind.enum';
9
+ import { AddressType } from '@colijnit/relationapi/build/enum/address-type.enum';
10
+ import { RelationNameKind } from '@colijnit/relationapi/build/enum/relation-name-kind.enum';
11
+ import { SupplierFullObject } from '@colijnit/relationapi/build/model/supplier-full-object.bo';
12
+ export class CheckoutSimpleOverviewRelationEditComponent {
13
+ constructor(_formMaster, service) {
14
+ this._formMaster = _formMaster;
15
+ this.service = service;
16
+ this.relKind = RelationKind;
17
+ this.icons = Icon;
18
+ this.addressType = AddressType;
19
+ this.validSubmit = new EventEmitter();
20
+ this.invalidSubmit = new EventEmitter();
21
+ this.deliveryAddressChange = new EventEmitter();
22
+ this.invoiceAddressChange = new EventEmitter();
23
+ this.relationChange = new EventEmitter();
24
+ this._relation = new CustomerFullObject();
25
+ this._relationKind = RelationKind.Customer;
26
+ this.relationType = RelationNameKind.Private;
27
+ }
28
+ set relation(value) {
29
+ if (this._relation && value && this._relation.relationId === value.relationId) {
30
+ return;
31
+ }
32
+ this._relation = value;
33
+ if (this._relation) {
34
+ if (this._relation instanceof SupplierFullObject) {
35
+ this._relation.type = RelationNameKind.Company;
36
+ this.relationType = RelationNameKind.Company;
37
+ }
38
+ if (this._relation instanceof CustomerFullObject) {
39
+ this.customerGroup = this._relation.customerGroup;
40
+ }
41
+ this.address = this._relation.getFirstAddressOrCreateNew();
42
+ }
43
+ }
44
+ get relation() {
45
+ return this._relation;
46
+ }
47
+ set relationKind(value) {
48
+ this._relationKind = value;
49
+ if (this._relationKind === RelationKind.Supplier) {
50
+ this.relationType = RelationNameKind.Company;
51
+ }
52
+ }
53
+ get relationKind() {
54
+ return this._relationKind;
55
+ }
56
+ showClass() {
57
+ return true;
58
+ }
59
+ get applicationUser() {
60
+ return this.service.applicationUser;
61
+ }
62
+ ngOnInit() {
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ if (this._relation) {
65
+ this.address = this._relation.getFirstAddressOrCreateNew();
66
+ }
67
+ });
68
+ }
69
+ ngAfterViewInit() {
70
+ const firstActiveAddress = this._relation.activeAddresses.length > 0 ? this._relation.activeAddresses[0] : undefined;
71
+ if (!this.deliveryAddressNawNr) {
72
+ this.deliveryAddressNawNr = firstActiveAddress ? firstActiveAddress.nawNr : 0;
73
+ this.deliveryAddressChange.emit(this.deliveryAddressNawNr);
74
+ }
75
+ if (!this.invoiceAddressNawNr) {
76
+ this.invoiceAddressNawNr = firstActiveAddress ? firstActiveAddress.nawNr : 0;
77
+ this.invoiceAddressChange.emit(this.invoiceAddressNawNr);
78
+ }
79
+ }
80
+ handleRelationTypeChange(relation) {
81
+ this.relationType = relation.type;
82
+ }
83
+ emptyRelation(event) {
84
+ this.service.createNewRelation();
85
+ this.updateRelation(this.service.relation);
86
+ }
87
+ handleCustomerGroupChange(group) {
88
+ this.customerGroup = group;
89
+ if (this._relation instanceof CustomerFullObject) {
90
+ this._relation.customerGroup = this.customerGroup;
91
+ }
92
+ }
93
+ updateRelation(rel) {
94
+ this.relation = rel;
95
+ const firstActiveAddress = this._relation.activeAddresses.length > 0 ? this._relation.activeAddresses[0] : undefined;
96
+ this.address = firstActiveAddress;
97
+ this.deliveryAddressNawNr = firstActiveAddress ? firstActiveAddress.nawNr : 0;
98
+ this.deliveryAddressChange.emit(this.deliveryAddressNawNr);
99
+ this.invoiceAddressNawNr = firstActiveAddress ? firstActiveAddress.nawNr : 0;
100
+ this.invoiceAddressChange.emit(this.invoiceAddressNawNr);
101
+ this.relationChange.emit(this.relation);
102
+ }
103
+ submit() {
104
+ return this._formMaster.submitSlaves();
105
+ }
106
+ handleDeliveryAddressChange(nawNr) {
107
+ this.deliveryAddressChange.emit(nawNr);
108
+ if (this.service.invoiceAddressSameAsDelivery) {
109
+ this.invoiceAddressChange.emit(nawNr);
110
+ }
111
+ }
112
+ checkSameAddress(checked) {
113
+ this.invoiceAddressNawNr = this.deliveryAddressNawNr;
114
+ this.invoiceAddressChange.next(this.invoiceAddressNawNr);
115
+ }
116
+ _setCountryNameToAddress(address) {
117
+ return __awaiter(this, void 0, void 0, function* () {
118
+ if (address.countryId && !address.countryName) {
119
+ const country = yield this.service.getCountry(address.countryId);
120
+ address.countryName = country.description;
121
+ }
122
+ });
123
+ }
124
+ }
125
+ CheckoutSimpleOverviewRelationEditComponent.decorators = [
126
+ { type: Component, args: [{
127
+ selector: "co-checkout-simple-overview-relation-edit",
128
+ template: `
129
+ <div class="relation-edit-content">
130
+ <co-form>
131
+ <div class="checkout-form-wrapper">
132
+ <div class="checkout-label-column">
133
+ <span>01</span>
134
+ <span class="label-description" [textContent]="'PERSONAL_DATA' | localize"></span>
135
+ </div>
136
+ <div class="checkout-data-column">
137
+ <div class="checkout-data-row">
138
+ <co-relation-type *ngIf="relationKind === relKind.Customer"
139
+ [relation]="relation"
140
+ (relationChange)="handleRelationTypeChange($event)"
141
+ ></co-relation-type>
142
+ <co-button class="empty-relation-button default-width" [label]="'EMPTY' | localize" (click)="emptyRelation($event)"></co-button>
143
+ </div>
144
+ <div class="checkout-data-row" *ngIf="relationKind === relKind.Customer">
145
+ <relation-customer-groups [model]="customerGroup" (modelChange)="handleCustomerGroupChange($event)" required></relation-customer-groups>
146
+ </div>
147
+ <div class="checkout-data-row">
148
+ <co-relation-general [relation]="relation" [relationType]="relationType" (relationChange)="updateRelation($event)"></co-relation-general>
149
+ </div>
150
+ <div class="checkout-data-row">
151
+ <co-relation-address [address]="address"></co-relation-address>
152
+ </div>
153
+ </div>
154
+ <div class="checkout-data-column">
155
+ <div class="checkout-data-row">
156
+ <co-relation-addresses
157
+ [relation]="relation"
158
+ [addresses]="relation.addresses"
159
+ [type]="addressType.DeliveryAddress"
160
+ [selectedNawNr]="deliveryAddressNawNr"
161
+ (selectedNawNrChange)="handleDeliveryAddressChange($event)"
162
+ ></co-relation-addresses>
163
+ </div>
164
+ </div>
165
+ <div class="checkout-label-column" *ngIf="relationKind === relKind.Customer">
166
+ <span>02</span>
167
+ <span class="label-description" [textContent]="'INVOICE_ADDRESS' | localize"></span>
168
+ </div>
169
+ <div class="checkout-data-column" *ngIf="relationKind === relKind.Customer">
170
+ <div class="checkout-data-row">
171
+ <co-input-checkbox [(model)]="service.invoiceAddressSameAsDelivery" (modelChange)="checkSameAddress($event)" [label]="'SAME_AS_DELIVERY' | localize"></co-input-checkbox>
172
+ </div>
173
+ <div class="overview-delivery-invoice-address" *ngIf="!service.invoiceAddressSameAsDelivery" @showHideInvoiceAddress>
174
+ <div class="checkout-data-row">
175
+ <co-relation-addresses
176
+ [relation]="relation"
177
+ [addresses]="relation.activeAddresses"
178
+ [type]="addressType.BillingAddress"
179
+ [selectedNawNr]="invoiceAddressNawNr"
180
+ (selectedNawNrChange)="invoiceAddressChange.emit($event)"
181
+ ></co-relation-addresses>
182
+ </div>
183
+ </div>
184
+ </div>
185
+ <div class="checkout-label-column">
186
+ <span>{{ relationKind === relKind.Customer ? '03' : '02'}}</span>
187
+ <span class="label-description" [textContent]="'CONTACT_DETAILS' | localize"></span>
188
+ </div>
189
+ <div class="checkout-data-column">
190
+ <div class="checkout-data-row">
191
+ <co-relation-contact-details [showPhone]="false" [(relation)]="relation" [relationKind]="relationKind"></co-relation-contact-details>
192
+ </div>
193
+ </div>
194
+ <ng-container *ngIf="relationKind === relKind.Customer">
195
+ <div class="checkout-label-column">
196
+ <span>04</span>
197
+ <span class="label-description" [textContent]="'PRIVACY_PREFERENCES' | localize"></span>
198
+ </div>
199
+ <div class="checkout-data-column">
200
+ <div class="checkout-data-row">
201
+ <co-relation-preferences [(relation)]="relation"></co-relation-preferences>
202
+ </div>
203
+ </div>
204
+ </ng-container>
205
+ </div>
206
+ </co-form>
207
+ </div>
208
+ `,
209
+ providers: [
210
+ FormMasterService
211
+ ],
212
+ animations: [
213
+ trigger("showHidePrivateRelationFields", [
214
+ state("void", style({ height: 0 })),
215
+ state("*", style({ height: "*" })),
216
+ transition("void => *", animate("200ms ease-in-out")),
217
+ transition("* => void", animate("200ms ease-out"))
218
+ ]),
219
+ trigger("showHideCompanyRelationFields", [
220
+ state("void", style({ height: 0 })),
221
+ state("*", style({ height: "*" })),
222
+ transition("void => *", animate("200ms ease-in-out")),
223
+ transition("* => void", animate("200ms ease-out"))
224
+ ]),
225
+ trigger("showHideSidebar", [
226
+ state("void", style({ transform: "translateX(100%)" })),
227
+ state("*", style({ transform: "translateX(0)" })),
228
+ transition("void <=> *", animate("200ms ease-in-out"))
229
+ ]),
230
+ trigger("showHideInvoiceAddress", [
231
+ state("void", style({ height: 0, opacity: 0 })),
232
+ state("*", style({ height: "*", opacity: 1 })),
233
+ transition("void => *", animate("200ms ease-in-out")),
234
+ transition("* => void", animate("200ms ease-out"))
235
+ ])
236
+ ],
237
+ encapsulation: ViewEncapsulation.None
238
+ },] }
239
+ ];
240
+ CheckoutSimpleOverviewRelationEditComponent.ctorParameters = () => [
241
+ { type: FormMasterService },
242
+ { type: TransactionService }
243
+ ];
244
+ CheckoutSimpleOverviewRelationEditComponent.propDecorators = {
245
+ relation: [{ type: Input }],
246
+ relationKind: [{ type: Input }],
247
+ deliveryAddressNawNr: [{ type: Input }],
248
+ invoiceAddressNawNr: [{ type: Input }],
249
+ validSubmit: [{ type: Output }],
250
+ invalidSubmit: [{ type: Output }],
251
+ deliveryAddressChange: [{ type: Output }],
252
+ invoiceAddressChange: [{ type: Output }],
253
+ relationChange: [{ type: Output }],
254
+ showClass: [{ type: HostBinding, args: ["class.co-checkout-simple-overview-relation-edit",] }]
255
+ };
256
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tvdXQtc2ltcGxlLW92ZXJ2aWV3LXJlbGF0aW9uLWVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJhbnNhY3Rpb24vc3JjL2xpYi9jb21wb25lbnQvY2hlY2tvdXQtc2ltcGxlL2NoZWNrb3V0LXNpbXBsZS1vdmVydmlldy1yZWxhdGlvbi1lZGl0L2NoZWNrb3V0LXNpbXBsZS1vdmVydmlldy1yZWxhdGlvbi1lZGl0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFnQixTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzVILE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFL0UsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDJEQUEyRCxDQUFDO0FBQzdGLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxxREFBcUQsQ0FBQztBQUNqRixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sb0RBQW9ELENBQUM7QUFHL0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDMUYsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMkRBQTJELENBQUM7QUFvSDdGLE1BQU0sT0FBTywyQ0FBMkM7SUE0RXBELFlBQ1ksV0FBOEIsRUFDL0IsT0FBMkI7UUFEMUIsZ0JBQVcsR0FBWCxXQUFX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O29CQUNGLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTt3QkFDdkIsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUMsQ0FBQyxDQUFDO3dCQUNyRCxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUFDO3dCQUMvQyxVQUFVLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO3FCQUN6RCxDQUFDO29CQUNGLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRTt3QkFDOUIsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO3dCQUM3QyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7d0JBQzVDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7d0JBQ3JELFVBQVUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7cUJBQ3JELENBQUM7aUJBQ0w7Z0JBQ0QsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7YUFDeEM7OztZQTdITyxpQkFBaUI7WUFEakIsa0JBQWtCOzs7dUJBb0lyQixLQUFLOzJCQXNCTCxLQUFLO21DQVlMLEtBQUs7a0NBR0wsS0FBSzswQkFHTCxNQUFNOzRCQUdOLE1BQU07b0NBR04sTUFBTTttQ0FHTixNQUFNOzZCQUdOLE1BQU07d0JBR04sV0FBVyxTQUFDLGlEQUFpRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtUcmFuc2FjdGlvblNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvdHJhbnNhY3Rpb24uc2VydmljZSc7XHJcbmltcG9ydCB7Rm9ybU1hc3RlclNlcnZpY2V9IGZyb20gJ0Bjb2xpam5pdC9jb3JlY29tcG9uZW50c192MTInO1xyXG5pbXBvcnQge2FuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlcn0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7Q291bnRyeX0gZnJvbSAnQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2NvdW50cnkuYm8nO1xyXG5pbXBvcnQge0ljb259IGZyb20gJy4uLy4uLy4uL2VudW0vaWNvbi5lbnVtJztcclxuaW1wb3J0IHtDdXN0b21lckZ1bGxPYmplY3R9IGZyb20gJ0Bjb2xpam5pdC9yZWxhdGlvbmFwaS9idWlsZC9tb2RlbC9jdXN0b21lci1mdWxsLW9iamVjdC5ibyc7XHJcbmltcG9ydCB7UmVsYXRpb25LaW5kfSBmcm9tICdAY29saWpuaXQvcmVsYXRpb25hcGkvYnVpbGQvZW51bS9yZWxhdGlvbi1raW5kLmVudW0nO1xyXG5pbXBvcnQge0FkZHJlc3NUeXBlfSBmcm9tICdAY29saWpuaXQvcmVsYXRpb25hcGkvYnVpbGQvZW51bS9hZGRyZXNzLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7UmVsYXRpb25BbnlUeXBlfSBmcm9tICcuLi8uLi8uLi9tb2RlbC9yZWxhdGlvbi1hbnktdHlwZSc7XHJcbmltcG9ydCB7QWRkcmVzc30gZnJvbSAnQGNvbGlqbml0L3JlbGF0aW9uYXBpL2J1aWxkL21vZGVsL2FkZHJlc3MuYm8nO1xyXG5pbXBvcnQge1JlbGF0aW9uTmFtZUtpbmR9IGZyb20gJ0Bjb2xpam5pdC9yZWxhdGlvbmFwaS9idWlsZC9lbnVtL3JlbGF0aW9uLW5hbWUta2luZC5lbnVtJztcclxuaW1wb3J0IHtTdXBwbGllckZ1bGxPYmplY3R9IGZyb20gJ0Bjb2xpam5pdC9yZWxhdGlvbmFwaS9idWlsZC9tb2RlbC9zdXBwbGllci1mdWxsLW9iamVjdC5ibyc7XHJcbmltcG9ydCB7UmVsYXRpb259IGZyb20gJ0Bjb2xpam5pdC9yZWxhdGlvbmFwaS9idWlsZC9tb2RlbC9yZWxhdGlvbi5ibyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiBcImNvLWNoZWNrb3V0LXNpbXBsZS1vdmVydmlldy1yZWxhdGlvbi1lZGl0XCIsXHJcbiAgICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cInJlbGF0aW9uLWVkaXQtY29udGVudFwiPlxyXG4gICAgICA8Y28tZm9ybT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tvdXQtZm9ybS13cmFwcGVyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tvdXQtbGFiZWwtY29sdW1uXCI+XHJcbiAgICAgICAgICAgIDxzcGFuPjAxPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLWRlc2NyaXB0aW9uXCIgW3RleHRDb250ZW50XT1cIidQRVJTT05BTF9EQVRBJyB8IGxvY2FsaXplXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tvdXQtZGF0YS1jb2x1bW5cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrb3V0LWRhdGEtcm93XCI+XHJcbiAgICAgICAgICAgICAgPGNvLXJlbGF0aW9uLXR5cGUgKm5nSWY9XCJyZWxhdGlvbktpbmQgPT09IHJlbEtpbmQuQ3VzdG9tZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWxhdGlvbl09XCJyZWxhdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbGF0aW9uQ2hhbmdlKT1cImhhbmRsZVJlbGF0aW9uVHlwZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICA+PC9jby1yZWxhdGlvbi10eXBlPlxyXG4gICAgICAgICAgICAgIDxjby1idXR0b24gY2xhc3M9XCJlbXB0eS1yZWxhdGlvbi1idXR0b24gZGVmYXVsdC13aWR0aFwiIFtsYWJlbF09XCInRU1QVFknIHwgbG9jYWxpemVcIiAoY2xpY2spPVwiZW1wdHlSZWxhdGlvbigkZXZlbnQpXCI+PC9jby1idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tvdXQtZGF0YS1yb3dcIiAqbmdJZj1cInJlbGF0aW9uS2luZCA9PT0gcmVsS2luZC5DdXN0b21lclwiPlxyXG4gICAgICAgICAgICAgIDxyZWxhdGlvbi1jdXN0b21lci1ncm91cHMgW21vZGVsXT1cImN1c3RvbWVyR3JvdXBcIiAobW9kZWxDaGFuZ2UpPVwiaGFuZGxlQ3VzdG9tZXJHcm91cENoYW5nZSgkZXZlbnQpXCIgcmVxdWlyZWQ+PC9yZWxhdGlvbi1jdXN0b21lci1ncm91cHM+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tvdXQtZGF0YS1yb3dcIj5cclxuICAgICAgICAgICAgICA8Y28tcmVsYXRpb24tZ2VuZXJhbCBbcmVsYXRpb25dPVwicmVsYXRpb25cIiBbcmVsYXRpb25UeXBlXT1cInJlbGF0aW9uVHlwZVwiIChyZWxhdGlvbkNoYW5nZSk9XCJ1cGRhdGVSZWxhdGlvbigkZXZlbnQpXCI+PC9jby1yZWxhdGlvbi1nZW5lcmFsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrb3V0LWRhdGEtcm93XCI+XHJcbiAgICAgICAgICAgICAgPGNvLXJlbGF0aW9uLWFkZHJlc3MgW2FkZHJlc3NdPVwiYWRkcmVzc1wiPjwvY28tcmVsYXRpb24tYWRkcmVzcz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja291dC1kYXRhLWNvbHVtblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tvdXQtZGF0YS1yb3dcIj5cclxuICAgICAgICAgICAgICA8Y28tcmVsYXRpb24tYWRkcmVzc2VzXHJcbiAgICAgICAgICAgICAgICBbcmVsYXRpb25dPVwicmVsYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgW2FkZHJlc3Nlc109XCJyZWxhdGlvbi5hZGRyZXNzZXNcIlxyXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiYWRkcmVzc1R5cGUuRGVsaXZlcnlBZGRyZXNzXCJcclxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZE5hd05yXT1cImRlbGl2ZXJ5QWRkcmVzc05hd05yXCJcclxuICAgICAgICAgICAgICAgIChzZWxlY3RlZE5hd05yQ2hhbmdlKT1cImhhbmRsZURlbGl2ZXJ5QWRkcmVzc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICA+PC9jby1yZWxhdGlvbi1hZGRyZXNzZXM+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tvdXQtbGFiZWwtY29sdW1uXCIgKm5nSWY9XCJyZWxhdGlvbktpbmQgPT09IHJlbEtpbmQuQ3VzdG9tZXJcIj5cclxuICAgICAgICAgICAgPHNwYW4+MDI8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtZGVzY3JpcHRpb25cIiBbdGV4dENvbnRlbnRdPVwiJ0lOVk9JQ0VfQUREUkVTUycgfCBsb2NhbGl6ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrb3V0LWRhdGEtY29sdW1uXCIgKm5nSWY9XCJyZWxhdGlvbktpbmQgPT09IHJlbEtpbmQuQ3VzdG9tZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrb3V0LWRhdGEtcm93XCI+XHJcbiAgICAgICAgICAgICAgPGNvLWlucHV0LWNoZWNrYm94IFsobW9kZWwpXT1cInNlcnZpY2UuaW52b2ljZUFkZHJlc3NTYW1lQXNEZWxpdmVyeVwiIChtb2RlbENoYW5nZSk9XCJjaGVja1NhbWVBZGRyZXNzKCRldmVudClcIiBbbGFiZWxdPVwiJ1NBTUVfQVNfREVMSVZFUlknIHwgbG9jYWxpemVcIj48L2NvLWlucHV0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJ2aWV3LWRlbGl2ZXJ5LWludm9pY2UtYWRkcmVzc1wiICpuZ0lmPVwiIXNlcnZpY2UuaW52b2ljZUFkZHJlc3NTYW1lQXNEZWxpdmVyeVwiIEBzaG93SGlkZUludm9pY2VBZGRyZXNzPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja291dC1kYXRhLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGNvLXJlbGF0aW9uLWFkZHJlc3Nlc1xyXG4gICAgICAgICAgICAgICAgICBbcmVsYXRpb25dPVwicmVsYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICBbYWRkcmVzc2VzXT1cInJlbGF0aW9uLmFjdGl2ZUFkZHJlc3Nlc1wiXHJcbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImFkZHJlc3NUeXBlLkJpbGxpbmdBZGRyZXNzXCJcclxuICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkTmF3TnJdPVwiaW52b2ljZUFkZHJlc3NOYXdOclwiXHJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3RlZE5hd05yQ2hhbmdlKT1cImludm9pY2VBZGRyZXNzQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICA+PC9jby1yZWxhdGlvbi1hZGRyZXNzZXM+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tvdXQtbGFiZWwtY29sdW1uXCI+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7ICByZWxhdGlvbktpbmQgPT09IHJlbEtpbmQuQ3VzdG9tZXIgPyAnMDMnIDogJzAyJ319PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLWRlc2NyaXB0aW9uXCIgW3RleHRDb250ZW50XT1cIidDT05UQUNUX0RFVEFJTFMnIHwgbG9jYWxpemVcIj48L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja291dC1kYXRhLWNvbHVtblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tvdXQtZGF0YS1yb3dcIj5cclxuICAgICAgICAgICAgICA8Y28tcmVsYXRpb24tY29udGFjdC1kZXRhaWxzIFtzaG93UGhvbmVdPVwiZmFsc2VcIiBbKHJlbGF0aW9uKV09XCJyZWxhdGlvblwiIFtyZWxhdGlvbktpbmRdPVwicmVsYXRpb25LaW5kXCI+PC9jby1yZWxhdGlvbi1jb250YWN0LWRldGFpbHM+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVsYXRpb25LaW5kID09PSByZWxLaW5kLkN1c3RvbWVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja291dC1sYWJlbC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICA8c3Bhbj4wNDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLWRlc2NyaXB0aW9uXCIgW3RleHRDb250ZW50XT1cIidQUklWQUNZX1BSRUZFUkVOQ0VTJyB8IGxvY2FsaXplXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrb3V0LWRhdGEtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrb3V0LWRhdGEtcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8Y28tcmVsYXRpb24tcHJlZmVyZW5jZXMgWyhyZWxhdGlvbildPVwicmVsYXRpb25cIj48L2NvLXJlbGF0aW9uLXByZWZlcmVuY2VzPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2NvLWZvcm0+XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgRm9ybU1hc3RlclNlcnZpY2VcclxuICAgIF0sXHJcbiAgICBhbmltYXRpb25zOiBbXHJcbiAgICAgICAgdHJpZ2dlcihcInNob3dIaWRlUHJpdmF0ZVJlbGF0aW9uRmllbGRzXCIsIFtcclxuICAgICAgICAgICAgc3RhdGUoXCJ2b2lkXCIsIHN0eWxlKHtoZWlnaHQ6IDB9KSksXHJcbiAgICAgICAgICAgIHN0YXRlKFwiKlwiLCBzdHlsZSh7aGVpZ2h0OiBcIipcIn0pKSxcclxuICAgICAgICAgICAgdHJhbnNpdGlvbihcInZvaWQgPT4gKlwiLCBhbmltYXRlKFwiMjAwbXMgZWFzZS1pbi1vdXRcIikpLFxyXG4gICAgICAgICAgICB0cmFuc2l0aW9uKFwiKiA9PiB2b2lkXCIsIGFuaW1hdGUoXCIyMDBtcyBlYXNlLW91dFwiKSlcclxuICAgICAgICBdKSxcclxuICAgICAgICB0cmlnZ2VyKFwic2hvd0hpZGVDb21wYW55UmVsYXRpb25GaWVsZHNcIiwgW1xyXG4gICAgICAgICAgICBzdGF0ZShcInZvaWRcIiwgc3R5bGUoe2hlaWdodDogMH0pKSxcclxuICAgICAgICAgICAgc3RhdGUoXCIqXCIsIHN0eWxlKHtoZWlnaHQ6IFwiKlwifSkpLFxyXG4gICAgICAgICAgICB0cmFuc2l0aW9uKFwidm9pZCA9PiAqXCIsIGFuaW1hdGUoXCIyMDBtcyBlYXNlLWluLW91dFwiKSksXHJcbiAgICAgICAgICAgIHRyYW5zaXRpb24oXCIqID0+IHZvaWRcIiwgYW5pbWF0ZShcIjIwMG1zIGVhc2Utb3V0XCIpKVxyXG4gICAgICAgIF0pLFxyXG4gICAgICAgIHRyaWdnZXIoXCJzaG93SGlkZVNpZGViYXJcIiwgW1xyXG4gICAgICAgICAgICBzdGF0ZShcInZvaWRcIiwgc3R5bGUoe3RyYW5zZm9ybTogXCJ0cmFuc2xhdGVYKDEwMCUpXCJ9KSksXHJcbiAgICAgICAgICAgIHN0YXRlKFwiKlwiLCBzdHlsZSh7dHJhbnNmb3JtOiBcInRyYW5zbGF0ZVgoMClcIn0pKSxcclxuICAgICAgICAgICAgdHJhbnNpdGlvbihcInZvaWQgPD0+ICpcIiwgYW5pbWF0ZShcIjIwMG1zIGVhc2UtaW4tb3V0XCIpKVxyXG4gICAgICAgIF0pLFxyXG4gICAgICAgIHRyaWdnZXIoXCJzaG93SGlkZUludm9pY2VBZGRyZXNzXCIsIFtcclxuICAgICAgICAgICAgc3RhdGUoXCJ2b2lkXCIsIHN0eWxlKHtoZWlnaHQ6IDAsIG9wYWNpdHk6IDB9KSksXHJcbiAgICAgICAgICAgIHN0YXRlKFwiKlwiLCBzdHlsZSh7aGVpZ2h0OiBcIipcIiwgb3BhY2l0eTogMX0pKSxcclxuICAgICAgICAgICAgdHJhbnNpdGlvbihcInZvaWQgPT4gKlwiLCBhbmltYXRlKFwiMjAwbXMgZWFzZS1pbi1vdXRcIikpLFxyXG4gICAgICAgICAgICB0cmFuc2l0aW9uKFwiKiA9PiB2b2lkXCIsIGFuaW1hdGUoXCIyMDBtcyBlYXNlLW91dFwiKSlcclxuICAgICAgICBdKVxyXG4gICAgXSxcclxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcclxufSlcclxuZXhwb3J0IGNsYXNzIENoZWNrb3V0U2ltcGxlT3ZlcnZpZXdSZWxhdGlvbkVkaXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gICAgcHVibGljIHJlYWRvbmx5IHJlbEtpbmQ6IHR5cGVvZiBSZWxhdGlvbktpbmQgPSBSZWxhdGlvbktpbmQ7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWNvbnM6IHR5cGVvZiBJY29uID0gSWNvbjtcclxuICAgIHB1YmxpYyByZWFkb25seSBhZGRyZXNzVHlwZTogdHlwZW9mIEFkZHJlc3NUeXBlID0gQWRkcmVzc1R5cGU7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZXQgcmVsYXRpb24odmFsdWU6IFJlbGF0aW9uQW55VHlwZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9yZWxhdGlvbiAmJiB2YWx1ZSAmJiB0aGlzLl9yZWxhdGlvbi5yZWxhdGlvbklkID09PSB2YWx1ZS5yZWxhdGlvbklkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcmVsYXRpb24gPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5fcmVsYXRpb24pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3JlbGF0aW9uIGluc3RhbmNlb2YgU3VwcGxpZXJGdWxsT2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWxhdGlvbi50eXBlID0gUmVsYXRpb25OYW1lS2luZC5Db21wYW55O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWxhdGlvblR5cGUgPSBSZWxhdGlvbk5hbWVLaW5kLkNvbXBhbnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3JlbGF0aW9uIGluc3RhbmNlb2YgQ3VzdG9tZXJGdWxsT2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbWVyR3JvdXAgPSB0aGlzLl9yZWxhdGlvbi5jdXN0b21lckdyb3VwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzcyA9IHRoaXMuX3JlbGF0aW9uLmdldEZpcnN0QWRkcmVzc09yQ3JlYXRlTmV3KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcmVsYXRpb24oKTogUmVsYXRpb25BbnlUeXBlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVsYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZXQgcmVsYXRpb25LaW5kKHZhbHVlOiBSZWxhdGlvbktpbmQpIHtcclxuICAgICAgICB0aGlzLl9yZWxhdGlvbktpbmQgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5fcmVsYXRpb25LaW5kID09PSBSZWxhdGlvbktpbmQuU3VwcGxpZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWxhdGlvblR5cGUgPSBSZWxhdGlvbk5hbWVLaW5kLkNvbXBhbnk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcmVsYXRpb25LaW5kKCk6IFJlbGF0aW9uS2luZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbGF0aW9uS2luZDtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGRlbGl2ZXJ5QWRkcmVzc05hd05yOiBudW1iZXI7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBpbnZvaWNlQWRkcmVzc05hd05yOiBudW1iZXI7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgdmFsaWRTdWJtaXQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBpbnZhbGlkU3VibWl0OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgZGVsaXZlcnlBZGRyZXNzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGludm9pY2VBZGRyZXNzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHJlbGF0aW9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8UmVsYXRpb25BbnlUeXBlPiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVsYXRpb25BbnlUeXBlPigpO1xyXG5cclxuICAgIEBIb3N0QmluZGluZyhcImNsYXNzLmNvLWNoZWNrb3V0LXNpbXBsZS1vdmVydmlldy1yZWxhdGlvbi1lZGl0XCIpXHJcbiAgICBwdWJsaWMgc2hvd0NsYXNzKCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3JlbGF0aW9uOiBSZWxhdGlvbkFueVR5cGUgPSBuZXcgQ3VzdG9tZXJGdWxsT2JqZWN0KCk7XHJcbiAgICBwcml2YXRlIF9yZWxhdGlvbktpbmQ6IFJlbGF0aW9uS2luZCA9IFJlbGF0aW9uS2luZC5DdXN0b21lcjtcclxuXHJcbiAgICBwdWJsaWMgYWRkcmVzczogQWRkcmVzcztcclxuICAgIHB1YmxpYyBjdXN0b21lckdyb3VwOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgcmVsYXRpb25UeXBlOiBSZWxhdGlvbk5hbWVLaW5kID0gUmVsYXRpb25OYW1lS2luZC5Qcml2YXRlO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgYXBwbGljYXRpb25Vc2VyKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2UuYXBwbGljYXRpb25Vc2VyO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgX2Zvcm1NYXN0ZXI6IEZvcm1NYXN0ZXJTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBzZXJ2aWNlOiBUcmFuc2FjdGlvblNlcnZpY2VcclxuICAgICkge1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICh0aGlzLl9yZWxhdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmFkZHJlc3MgPSB0aGlzLl9yZWxhdGlvbi5nZXRGaXJzdEFkZHJlc3NPckNyZWF0ZU5ldygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZmlyc3RBY3RpdmVBZGRyZXNzOiBBZGRyZXNzID0gdGhpcy5fcmVsYXRpb24uYWN0aXZlQWRkcmVzc2VzLmxlbmd0aCA+IDAgPyB0aGlzLl9yZWxhdGlvbi5hY3RpdmVBZGRyZXNzZXNbMF0gOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRlbGl2ZXJ5QWRkcmVzc05hd05yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVsaXZlcnlBZGRyZXNzTmF3TnIgPSBmaXJzdEFjdGl2ZUFkZHJlc3MgPyBmaXJzdEFjdGl2ZUFkZHJlc3MubmF3TnIgOiAwO1xyXG4gICAgICAgICAgICB0aGlzLmRlbGl2ZXJ5QWRkcmVzc0NoYW5nZS5lbWl0KHRoaXMuZGVsaXZlcnlBZGRyZXNzTmF3TnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaW52b2ljZUFkZHJlc3NOYXdOcikge1xyXG4gICAgICAgICAgICB0aGlzLmludm9pY2VBZGRyZXNzTmF3TnIgPSBmaXJzdEFjdGl2ZUFkZHJlc3MgPyBmaXJzdEFjdGl2ZUFkZHJlc3MubmF3TnIgOiAwO1xyXG4gICAgICAgICAgICB0aGlzLmludm9pY2VBZGRyZXNzQ2hhbmdlLmVtaXQodGhpcy5pbnZvaWNlQWRkcmVzc05hd05yKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZVJlbGF0aW9uVHlwZUNoYW5nZShyZWxhdGlvbjogUmVsYXRpb24pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlbGF0aW9uVHlwZSA9IHJlbGF0aW9uLnR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVtcHR5UmVsYXRpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlcnZpY2UuY3JlYXRlTmV3UmVsYXRpb24oKVxyXG4gICAgICAgIHRoaXMudXBkYXRlUmVsYXRpb24odGhpcy5zZXJ2aWNlLnJlbGF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlQ3VzdG9tZXJHcm91cENoYW5nZShncm91cDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jdXN0b21lckdyb3VwID0gZ3JvdXA7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JlbGF0aW9uIGluc3RhbmNlb2YgQ3VzdG9tZXJGdWxsT2JqZWN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbGF0aW9uLmN1c3RvbWVyR3JvdXAgPSB0aGlzLmN1c3RvbWVyR3JvdXA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVSZWxhdGlvbihyZWw6IFJlbGF0aW9uQW55VHlwZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVsYXRpb24gPSByZWw7XHJcbiAgICAgICAgY29uc3QgZmlyc3RBY3RpdmVBZGRyZXNzOiBBZGRyZXNzID0gdGhpcy5fcmVsYXRpb24uYWN0aXZlQWRkcmVzc2VzLmxlbmd0aCA+IDAgPyB0aGlzLl9yZWxhdGlvbi5hY3RpdmVBZGRyZXNzZXNbMF0gOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5hZGRyZXNzID0gZmlyc3RBY3RpdmVBZGRyZXNzO1xyXG4gICAgICAgIHRoaXMuZGVsaXZlcnlBZGRyZXNzTmF3TnIgPSBmaXJzdEFjdGl2ZUFkZHJlc3MgPyBmaXJzdEFjdGl2ZUFkZHJlc3MubmF3TnIgOiAwO1xyXG4gICAgICAgIHRoaXMuZGVsaXZlcnlBZGRyZXNzQ2hhbmdlLmVtaXQodGhpcy5kZWxpdmVyeUFkZHJlc3NOYXdOcik7XHJcbiAgICAgICAgdGhpcy5pbnZvaWNlQWRkcmVzc05hd05yID0gZmlyc3RBY3RpdmVBZGRyZXNzID8gZmlyc3RBY3RpdmVBZGRyZXNzLm5hd05yIDogMDtcclxuICAgICAgICB0aGlzLmludm9pY2VBZGRyZXNzQ2hhbmdlLmVtaXQodGhpcy5pbnZvaWNlQWRkcmVzc05hd05yKTtcclxuICAgICAgICB0aGlzLnJlbGF0aW9uQ2hhbmdlLmVtaXQodGhpcy5yZWxhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN1Ym1pdCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybU1hc3Rlci5zdWJtaXRTbGF2ZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlRGVsaXZlcnlBZGRyZXNzQ2hhbmdlKG5hd05yOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRlbGl2ZXJ5QWRkcmVzc0NoYW5nZS5lbWl0KG5hd05yKTtcclxuICAgICAgICBpZiAodGhpcy5zZXJ2aWNlLmludm9pY2VBZGRyZXNzU2FtZUFzRGVsaXZlcnkpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnZvaWNlQWRkcmVzc0NoYW5nZS5lbWl0KG5hd05yKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNoZWNrU2FtZUFkZHJlc3MoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW52b2ljZUFkZHJlc3NOYXdOciA9IHRoaXMuZGVsaXZlcnlBZGRyZXNzTmF3TnI7XHJcbiAgICAgICAgdGhpcy5pbnZvaWNlQWRkcmVzc0NoYW5nZS5uZXh0KHRoaXMuaW52b2ljZUFkZHJlc3NOYXdOcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBfc2V0Q291bnRyeU5hbWVUb0FkZHJlc3MoYWRkcmVzczogQWRkcmVzcyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmIChhZGRyZXNzLmNvdW50cnlJZCAmJiAhYWRkcmVzcy5jb3VudHJ5TmFtZSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb3VudHJ5OiBDb3VudHJ5ID0gYXdhaXQgdGhpcy5zZXJ2aWNlLmdldENvdW50cnkoYWRkcmVzcy5jb3VudHJ5SWQpO1xyXG4gICAgICAgICAgICBhZGRyZXNzLmNvdW50cnlOYW1lID0gY291bnRyeS5kZXNjcmlwdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==
@@ -0,0 +1,186 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Component, EventEmitter, HostBinding, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
3
+ import { TransactionService } from '../../service/transaction.service';
4
+ import { DictionaryService } from '../../service/dictionary.service';
5
+ import { DialogService } from '../../service/dialog.service';
6
+ import { TransactionKind } from '@colijnit/transactionapi/build/enum/transaction-kind.enum';
7
+ export class CheckoutSimpleComponent {
8
+ constructor(service, _dictionary, _dialogService) {
9
+ this.service = service;
10
+ this._dictionary = _dictionary;
11
+ this._dialogService = _dialogService;
12
+ this.transKind = TransactionKind;
13
+ this.newTransaction = false;
14
+ this.transactionType = TransactionKind.SalesOrder;
15
+ this.showCreateTransactionButton = false;
16
+ this.transactionFinished = new EventEmitter();
17
+ this.editCartClick = new EventEmitter();
18
+ this.deliveryAddressNawNr = 0;
19
+ this.invoiceAddressNawNr = 0;
20
+ }
21
+ showClass() {
22
+ return true;
23
+ }
24
+ ngOnInit() {
25
+ if (this.newTransaction) {
26
+ this.service.resetCurrentTransaction();
27
+ }
28
+ this.service.transactionKind = this.transactionType;
29
+ this.relationType = this.service.getRelationKindFromTransactionKind();
30
+ this.service.createNewRelation();
31
+ }
32
+ handleCreateTransaction(event) {
33
+ return __awaiter(this, void 0, void 0, function* () {
34
+ let success = true;
35
+ if (this.stepper.activeStep === 0 && (yield this.handleRelationValidation())) {
36
+ success = yield this.service.saveRelation();
37
+ if (success) {
38
+ yield this.service.updateHeaderTransactionDefinitive(this.service.currentTransaction.transactionInfo.uuid, true, true);
39
+ }
40
+ }
41
+ if (!success) {
42
+ return;
43
+ }
44
+ const saveSuccess = yield this.service.saveTransactionAndCommit();
45
+ if (saveSuccess) {
46
+ this.handleTransactionFinished(this.service.currentTransaction.transactionInfo.transactionNr);
47
+ }
48
+ });
49
+ }
50
+ handleRelationValidation() {
51
+ return __awaiter(this, void 0, void 0, function* () {
52
+ if (this.checkoutRelation && this.stepRelation) {
53
+ const valid = this.checkoutRelation.submit();
54
+ if (valid) {
55
+ this.stepRelation.completed = yield this.saveRelation();
56
+ }
57
+ return valid;
58
+ }
59
+ });
60
+ }
61
+ handleDeliveryValidation() {
62
+ return __awaiter(this, void 0, void 0, function* () {
63
+ if (this.checkoutDelivery && this.stepDelivery) {
64
+ const valid = this.checkoutDelivery.submit();
65
+ if (valid) {
66
+ const saveSuccess = yield this.service.saveTransactionAndCommit();
67
+ if (saveSuccess) {
68
+ const lockSuccess = yield this.service.tryToLockTransaction(this.service.currentTransaction.transactionInfo.id, this.service.currentTransaction.transactionInfo.version);
69
+ if (lockSuccess) {
70
+ this.stepDelivery.completed = yield this.handleSaveDelivery();
71
+ }
72
+ }
73
+ }
74
+ return valid;
75
+ }
76
+ });
77
+ }
78
+ saveRelation() {
79
+ return __awaiter(this, void 0, void 0, function* () {
80
+ const success = yield this.service.saveRelation();
81
+ if (success) {
82
+ if (this.deliveryAddressNawNr === null || this.deliveryAddressNawNr === undefined || this.deliveryAddressNawNr === 0 && this.service.relation.addresses && this.service.relation.addresses.length === 1) {
83
+ this.deliveryAddressNawNr = this.service.relation.addresses[0].nawNr;
84
+ }
85
+ if (this.deliveryAddressNawNr && this.service.currentTransaction.transactionInfo.transactionAddress !== this.deliveryAddressNawNr) {
86
+ yield this.service.updateHeaderDeliveryAddress(this.service.currentTransaction.transactionInfo.uuid, this.deliveryAddressNawNr);
87
+ }
88
+ const invoiceAddressNawNr = this.invoiceAddressNawNr ? this.invoiceAddressNawNr : this.deliveryAddressNawNr;
89
+ if (this.service.currentTransaction.transactionInfo.invoiceAddress !== invoiceAddressNawNr) {
90
+ yield this.service.updateHeaderInvoiceAddress(this.service.currentTransaction.transactionInfo.uuid, invoiceAddressNawNr);
91
+ }
92
+ }
93
+ return success;
94
+ });
95
+ }
96
+ handleSaveDelivery() {
97
+ return __awaiter(this, void 0, void 0, function* () {
98
+ return true;
99
+ });
100
+ }
101
+ handleDeliveryAddressChange(nawNr) {
102
+ this.deliveryAddressNawNr = nawNr;
103
+ }
104
+ handleInvoiceAddressChange(nawNr) {
105
+ this.invoiceAddressNawNr = nawNr;
106
+ }
107
+ handleTransactionFinished(id) {
108
+ this.service.resetCurrentTransaction();
109
+ this.transactionFinished.emit({ id: id, fromCheckout: this.showCreateTransactionButton });
110
+ }
111
+ }
112
+ CheckoutSimpleComponent.decorators = [
113
+ { type: Component, args: [{
114
+ selector: "co-checkout-simple",
115
+ template: `
116
+ <co-stepper #stepper
117
+ [title]="service.titleForCheckout"
118
+ [showStepper]="transactionType !== transKind.PurchaseOrder"
119
+ [titleIcon]="service.iconForCheckout"
120
+ [finishButtonLabel]="'CHECKOUT_FINISH' | localize"
121
+ (createClicked)="handleCreateTransaction($event)"
122
+ >
123
+ <co-stepper-step #stepRelation [index]="1" [label]="'YOUR_DATA' | localize" (validateStep)="handleRelationValidation()">
124
+ <co-checkout-simple-overview-relation-edit #checkoutRelation *ngIf="stepRelation.show"
125
+ [(relation)]="service.relation"
126
+ [relationKind]="relationType"
127
+ [deliveryAddressNawNr]="deliveryAddressNawNr"
128
+ [invoiceAddressNawNr]="invoiceAddressNawNr"
129
+ (deliveryAddressChange)="handleDeliveryAddressChange($event)"
130
+ (invoiceAddressChange)="handleInvoiceAddressChange($event)"
131
+ (relationChange)="service.relation = $event"
132
+ ></co-checkout-simple-overview-relation-edit>
133
+ </co-stepper-step>
134
+ <co-stepper-step #stepDelivery [index]="2" [label]="'DELIVERY' | localize" (validateStep)="handleDeliveryValidation()">
135
+ <co-checkout-simple-overview-delivery-edit #checkoutDelivery *ngIf="stepDelivery.show"
136
+ [transaction]="service.currentTransaction"
137
+ ></co-checkout-simple-overview-delivery-edit>
138
+ </co-stepper-step>
139
+ <co-stepper-step #stepOverview [index]="3" [label]="service.paymentStepTitleForCheckout | localize">
140
+ <co-checkout-simple-overview-payment *ngIf="stepOverview.show"
141
+ [relation]="service.relation"
142
+ [transaction]="service.currentTransaction"
143
+ [showPayment]="transactionType === transKind.SalesOrder"
144
+ (changeYourDataClick)="stepper.goto(0)"
145
+ (changeDeliveryClick)="stepper.goto(1)"
146
+ (payed)="handleTransactionFinished($event)"
147
+ ></co-checkout-simple-overview-payment>
148
+ </co-stepper-step>
149
+ <div class="co-checkout-right-panel">
150
+ <div class="co-checkout-right-panel-relation">
151
+ <co-avatar [relationId]="sellerId"></co-avatar>
152
+ </div>
153
+ <co-shopping-cart-preview *ngIf="!showCreateTransactionButton"
154
+ [showCheckoutButton]="false"
155
+ [withoutBorder]="true"
156
+ (editCartClick)="editCartClick.emit($event)"
157
+ ></co-shopping-cart-preview>
158
+ </div>
159
+ </co-stepper>
160
+ `,
161
+ encapsulation: ViewEncapsulation.None
162
+ },] }
163
+ ];
164
+ CheckoutSimpleComponent.ctorParameters = () => [
165
+ { type: TransactionService },
166
+ { type: DictionaryService },
167
+ { type: DialogService }
168
+ ];
169
+ CheckoutSimpleComponent.propDecorators = {
170
+ stepper: [{ type: ViewChild, args: ["stepper",] }],
171
+ stepRelation: [{ type: ViewChild, args: ["stepRelation",] }],
172
+ stepDelivery: [{ type: ViewChild, args: ["stepDelivery",] }],
173
+ stepOverview: [{ type: ViewChild, args: ["stepOverview",] }],
174
+ stepPay: [{ type: ViewChild, args: ["stepPay",] }],
175
+ checkoutRelation: [{ type: ViewChild, args: ["checkoutRelation",] }],
176
+ checkoutDelivery: [{ type: ViewChild, args: ["checkoutDelivery",] }],
177
+ checkoutPayment: [{ type: ViewChild, args: ["checkoutPayment",] }],
178
+ newTransaction: [{ type: Input }],
179
+ sellerId: [{ type: Input }],
180
+ transactionType: [{ type: Input }],
181
+ showCreateTransactionButton: [{ type: Input }],
182
+ transactionFinished: [{ type: Output }],
183
+ editCartClick: [{ type: Output }],
184
+ showClass: [{ type: HostBinding, args: ["class.co-checkout-simple",] }]
185
+ };
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tvdXQtc2ltcGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RyYW5zYWN0aW9uL3NyYy9saWIvY29tcG9uZW50L2NoZWNrb3V0LXNpbXBsZS9jaGVja291dC1zaW1wbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEgsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDckUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFHbkUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRzNELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwyREFBMkQsQ0FBQztBQTJEMUYsTUFBTSxPQUFPLHVCQUF1QjtJQXVEaEMsWUFDVyxPQUEyQixFQUMxQixXQUE4QixFQUM5QixjQUE2QjtRQUY5QixZQUFPLEdBQVAsT0FBTyxDQUFvQjtRQUMxQixnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFDOUIsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUF6RHpCLGNBQVMsR0FBMkIsZUFBZSxDQUFDO1FBMkI3RCxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQU1oQyxvQkFBZSxHQUFvQixlQUFlLENBQUMsVUFBVSxDQUFDO1FBRzlELGdDQUEyQixHQUFZLEtBQUssQ0FBQztRQUc3Qyx3QkFBbUIsR0FBc0QsSUFBSSxZQUFZLEVBQXVDLENBQUM7UUFHakksa0JBQWEsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQVE3RCx5QkFBb0IsR0FBVyxDQUFDLENBQUM7UUFDakMsd0JBQW1CLEdBQVcsQ0FBQyxDQUFDO0lBUXZDLENBQUM7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M0IsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztLQUFBO0lBRU0sMkJBQTJCLENBQUMsS0FBYTtRQUM1QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBQ3RDLENBQUM7SUFFTSwwQkFBMEIsQ0FBQyxLQUFhO1FBQzNDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDckMsQ0FBQztJQUVNLHlCQUF5QixDQUFDLEVBQVU7UUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsMkJBQTJCLEVBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUM7OztZQXJNSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q1g7Z0JBQ0MsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7YUFDeEM7OztZQWpFTyxrQkFBa0I7WUFDbEIsaUJBQWlCO1lBR2pCLGFBQWE7OztzQkFpRWhCLFNBQVMsU0FBQyxTQUFTOzJCQUduQixTQUFTLFNBQUMsY0FBYzsyQkFHeEIsU0FBUyxTQUFDLGNBQWM7MkJBR3hCLFNBQVMsU0FBQyxjQUFjO3NCQUd4QixTQUFTLFNBQUMsU0FBUzsrQkFHbkIsU0FBUyxTQUFDLGtCQUFrQjsrQkFHNUIsU0FBUyxTQUFDLGtCQUFrQjs4QkFHNUIsU0FBUyxTQUFDLGlCQUFpQjs2QkFHM0IsS0FBSzt1QkFHTCxLQUFLOzhCQUdMLEtBQUs7MENBR0wsS0FBSztrQ0FHTCxNQUFNOzRCQUdOLE1BQU07d0JBR04sV0FBVyxTQUFDLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCwgVmlld0VuY2Fwc3VsYXRpb259IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1RyYW5zYWN0aW9uU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZS90cmFuc2FjdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtEaWN0aW9uYXJ5U2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZS9kaWN0aW9uYXJ5LnNlcnZpY2UnO1xyXG5pbXBvcnQge1RyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlfSBmcm9tICdAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvdHJhbnNhY3Rpb24taW5mby1yZXNwb25zZS5ibyc7XHJcbmltcG9ydCB7U3RlcHBlclN0ZXBDb21wb25lbnR9IGZyb20gJy4uL3N0ZXBwZXIvY29tcG9uZW50L3N0ZXBwZXItc3RlcC5jb21wb25lbnQnO1xyXG5pbXBvcnQge0RpYWxvZ1NlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2UvZGlhbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQge1BheW1lbnRDb21wb25lbnR9IGZyb20gJy4uL3BheW1lbnQvcGF5bWVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQge1N0ZXBwZXJDb21wb25lbnR9IGZyb20gJy4uL3N0ZXBwZXIvc3RlcHBlci5jb21wb25lbnQnO1xyXG5pbXBvcnQge1RyYW5zYWN0aW9uS2luZH0gZnJvbSAnQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL2VudW0vdHJhbnNhY3Rpb24ta2luZC5lbnVtJztcclxuaW1wb3J0IHtSZWxhdGlvbktpbmR9IGZyb20gJ0Bjb2xpam5pdC9yZWxhdGlvbmFwaS9idWlsZC9lbnVtL3JlbGF0aW9uLWtpbmQuZW51bSc7XHJcbmltcG9ydCB7XHJcbiAgICBDaGVja291dFNpbXBsZU92ZXJ2aWV3UmVsYXRpb25FZGl0Q29tcG9uZW50XHJcbn0gZnJvbSAnLi9jaGVja291dC1zaW1wbGUtb3ZlcnZpZXctcmVsYXRpb24tZWRpdC9jaGVja291dC1zaW1wbGUtb3ZlcnZpZXctcmVsYXRpb24tZWRpdC5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gICAgQ2hlY2tvdXRTaW1wbGVPdmVydmlld0RlbGl2ZXJ5RWRpdENvbXBvbmVudFxyXG59IGZyb20gJy4vY2hlY2tvdXQtc2ltcGxlLW92ZXJ2aWV3LWRlbGl2ZXJ5LWVkaXQvY2hlY2tvdXQtc2ltcGxlLW92ZXJ2aWV3LWRlbGl2ZXJ5LWVkaXQuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6IFwiY28tY2hlY2tvdXQtc2ltcGxlXCIsXHJcbiAgICB0ZW1wbGF0ZTogYFxyXG4gICAgPGNvLXN0ZXBwZXIgI3N0ZXBwZXJcclxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJzZXJ2aWNlLnRpdGxlRm9yQ2hlY2tvdXRcIlxyXG4gICAgICAgICAgICAgICAgW3Nob3dTdGVwcGVyXT1cInRyYW5zYWN0aW9uVHlwZSAhPT0gdHJhbnNLaW5kLlB1cmNoYXNlT3JkZXJcIlxyXG4gICAgICAgICAgICAgICAgW3RpdGxlSWNvbl09XCJzZXJ2aWNlLmljb25Gb3JDaGVja291dFwiXHJcbiAgICAgICAgICAgICAgICBbZmluaXNoQnV0dG9uTGFiZWxdPVwiJ0NIRUNLT1VUX0ZJTklTSCcgfCBsb2NhbGl6ZVwiXHJcbiAgICAgICAgICAgICAgICAoY3JlYXRlQ2xpY2tlZCk9XCJoYW5kbGVDcmVhdGVUcmFuc2FjdGlvbigkZXZlbnQpXCJcclxuICAgID5cclxuICAgICAgPGNvLXN0ZXBwZXItc3RlcCAjc3RlcFJlbGF0aW9uIFtpbmRleF09XCIxXCIgW2xhYmVsXT1cIidZT1VSX0RBVEEnIHwgbG9jYWxpemVcIiAodmFsaWRhdGVTdGVwKT1cImhhbmRsZVJlbGF0aW9uVmFsaWRhdGlvbigpXCI+XHJcbiAgICAgICAgPGNvLWNoZWNrb3V0LXNpbXBsZS1vdmVydmlldy1yZWxhdGlvbi1lZGl0ICNjaGVja291dFJlbGF0aW9uICpuZ0lmPVwic3RlcFJlbGF0aW9uLnNob3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsocmVsYXRpb24pXT1cInNlcnZpY2UucmVsYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWxhdGlvbktpbmRdPVwicmVsYXRpb25UeXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVsaXZlcnlBZGRyZXNzTmF3TnJdPVwiZGVsaXZlcnlBZGRyZXNzTmF3TnJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnZvaWNlQWRkcmVzc05hd05yXT1cImludm9pY2VBZGRyZXNzTmF3TnJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWxpdmVyeUFkZHJlc3NDaGFuZ2UpPVwiaGFuZGxlRGVsaXZlcnlBZGRyZXNzQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnZvaWNlQWRkcmVzc0NoYW5nZSk9XCJoYW5kbGVJbnZvaWNlQWRkcmVzc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVsYXRpb25DaGFuZ2UpPVwic2VydmljZS5yZWxhdGlvbiA9ICRldmVudFwiXHJcbiAgICAgICAgPjwvY28tY2hlY2tvdXQtc2ltcGxlLW92ZXJ2aWV3LXJlbGF0aW9uLWVkaXQ+XHJcbiAgICAgIDwvY28tc3RlcHBlci1zdGVwPlxyXG4gICAgICA8Y28tc3RlcHBlci1zdGVwICNzdGVwRGVsaXZlcnkgW2luZGV4XT1cIjJcIiBbbGFiZWxdPVwiJ0RFTElWRVJZJyB8IGxvY2FsaXplXCIgKHZhbGlkYXRlU3RlcCk9XCJoYW5kbGVEZWxpdmVyeVZhbGlkYXRpb24oKVwiPlxyXG4gICAgICAgIDxjby1jaGVja291dC1zaW1wbGUtb3ZlcnZpZXctZGVsaXZlcnktZWRpdCAjY2hlY2tvdXREZWxpdmVyeSAqbmdJZj1cInN0ZXBEZWxpdmVyeS5zaG93XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNhY3Rpb25dPVwic2VydmljZS5jdXJyZW50VHJhbnNhY3Rpb25cIlxyXG4gICAgICAgID48L2NvLWNoZWNrb3V0LXNpbXBsZS1vdmVydmlldy1kZWxpdmVyeS1lZGl0PlxyXG4gICAgICA8L2NvLXN0ZXBwZXItc3RlcD5cclxuICAgICAgPGNvLXN0ZXBwZXItc3RlcCAjc3RlcE92ZXJ2aWV3IFtpbmRleF09XCIzXCIgW2xhYmVsXT1cInNlcnZpY2UucGF5bWVudFN0ZXBUaXRsZUZvckNoZWNrb3V0IHwgbG9jYWxpemVcIj5cclxuICAgICAgICA8Y28tY2hlY2tvdXQtc2ltcGxlLW92ZXJ2aWV3LXBheW1lbnQgKm5nSWY9XCJzdGVwT3ZlcnZpZXcuc2hvd1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlbGF0aW9uXT1cInNlcnZpY2UucmVsYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0cmFuc2FjdGlvbl09XCJzZXJ2aWNlLmN1cnJlbnRUcmFuc2FjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dQYXltZW50XT1cInRyYW5zYWN0aW9uVHlwZSA9PT0gdHJhbnNLaW5kLlNhbGVzT3JkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VZb3VyRGF0YUNsaWNrKT1cInN0ZXBwZXIuZ290bygwKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZURlbGl2ZXJ5Q2xpY2spPVwic3RlcHBlci5nb3RvKDEpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF5ZWQpPVwiaGFuZGxlVHJhbnNhY3Rpb25GaW5pc2hlZCgkZXZlbnQpXCJcclxuICAgICAgICA+PC9jby1jaGVja291dC1zaW1wbGUtb3ZlcnZpZXctcGF5bWVudD5cclxuICAgICAgPC9jby1zdGVwcGVyLXN0ZXA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjby1jaGVja291dC1yaWdodC1wYW5lbFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjby1jaGVja291dC1yaWdodC1wYW5lbC1yZWxhdGlvblwiPlxyXG4gICAgICAgICAgPGNvLWF2YXRhciBbcmVsYXRpb25JZF09XCJzZWxsZXJJZFwiPjwvY28tYXZhdGFyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxjby1zaG9wcGluZy1jYXJ0LXByZXZpZXcgKm5nSWY9XCIhc2hvd0NyZWF0ZVRyYW5zYWN0aW9uQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2hlY2tvdXRCdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3dpdGhvdXRCb3JkZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWRpdENhcnRDbGljayk9XCJlZGl0Q2FydENsaWNrLmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgICAgPjwvY28tc2hvcHBpbmctY2FydC1wcmV2aWV3PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvY28tc3RlcHBlcj5cclxuICBgLFxyXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2hlY2tvdXRTaW1wbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gICAgcHVibGljIHJlYWRvbmx5IHRyYW5zS2luZDogdHlwZW9mIFRyYW5zYWN0aW9uS2luZCA9IFRyYW5zYWN0aW9uS2luZDtcclxuXHJcbiAgICBAVmlld0NoaWxkKFwic3RlcHBlclwiKVxyXG4gICAgcHVibGljIHN0ZXBwZXI6IFN0ZXBwZXJDb21wb25lbnQ7XHJcblxyXG4gICAgQFZpZXdDaGlsZChcInN0ZXBSZWxhdGlvblwiKVxyXG4gICAgcHVibGljIHN0ZXBSZWxhdGlvbjogU3RlcHBlclN0ZXBDb21wb25lbnQ7XHJcblxyXG4gICAgQFZpZXdDaGlsZChcInN0ZXBEZWxpdmVyeVwiKVxyXG4gICAgcHVibGljIHN0ZXBEZWxpdmVyeTogU3RlcHBlclN0ZXBDb21wb25lbnQ7XHJcblxyXG4gICAgQFZpZXdDaGlsZChcInN0ZXBPdmVydmlld1wiKVxyXG4gICAgcHVibGljIHN0ZXBPdmVydmlldzogU3RlcHBlclN0ZXBDb21wb25lbnQ7XHJcblxyXG4gICAgQFZpZXdDaGlsZChcInN0ZXBQYXlcIilcclxuICAgIHB1YmxpYyBzdGVwUGF5OiBTdGVwcGVyU3RlcENvbXBvbmVudDtcclxuXHJcbiAgICBAVmlld0NoaWxkKFwiY2hlY2tvdXRSZWxhdGlvblwiKVxyXG4gICAgcHVibGljIGNoZWNrb3V0UmVsYXRpb246IENoZWNrb3V0U2ltcGxlT3ZlcnZpZXdSZWxhdGlvbkVkaXRDb21wb25lbnQ7XHJcblxyXG4gICAgQFZpZXdDaGlsZChcImNoZWNrb3V0RGVsaXZlcnlcIilcclxuICAgIHB1YmxpYyBjaGVja291dERlbGl2ZXJ5OiBDaGVja291dFNpbXBsZU92ZXJ2aWV3RGVsaXZlcnlFZGl0Q29tcG9uZW50O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoXCJjaGVja291dFBheW1lbnRcIilcclxuICAgIHB1YmxpYyBjaGVja291dFBheW1lbnQ6IFBheW1lbnRDb21wb25lbnQ7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBuZXdUcmFuc2FjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2VsbGVySWQ6IG51bWJlcjtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25LaW5kID0gVHJhbnNhY3Rpb25LaW5kLlNhbGVzT3JkZXI7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzaG93Q3JlYXRlVHJhbnNhY3Rpb25CdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyB0cmFuc2FjdGlvbkZpbmlzaGVkOiBFdmVudEVtaXR0ZXI8e2lkOiBudW1iZXIsIGZyb21DaGVja291dDogYm9vbGVhbn0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7aWQ6IG51bWJlciwgZnJvbUNoZWNrb3V0OiBib29sZWFufT4oKTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBlZGl0Q2FydENsaWNrOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKFwiY2xhc3MuY28tY2hlY2tvdXQtc2ltcGxlXCIpXHJcbiAgICBwdWJsaWMgc2hvd0NsYXNzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U7XHJcbiAgICBwdWJsaWMgZGVsaXZlcnlBZGRyZXNzTmF3TnI6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgaW52b2ljZUFkZHJlc3NOYXdOcjogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyByZWxhdGlvblR5cGU6IFJlbGF0aW9uS2luZDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwdWJsaWMgc2VydmljZTogVHJhbnNhY3Rpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2RpY3Rpb25hcnk6IERpY3Rpb25hcnlTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2RpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2VcclxuICAgICkge1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLm5ld1RyYW5zYWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5yZXNldEN1cnJlbnRUcmFuc2FjdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlcnZpY2UudHJhbnNhY3Rpb25LaW5kID0gdGhpcy50cmFuc2FjdGlvblR5cGU7XHJcbiAgICAgICAgdGhpcy5yZWxhdGlvblR5cGUgPSB0aGlzLnNlcnZpY2UuZ2V0UmVsYXRpb25LaW5kRnJvbVRyYW5zYWN0aW9uS2luZCgpO1xyXG4gICAgICAgIHRoaXMuc2VydmljZS5jcmVhdGVOZXdSZWxhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVDcmVhdGVUcmFuc2FjdGlvbihldmVudDogTW91c2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGxldCBzdWNjZXNzOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5zdGVwcGVyLmFjdGl2ZVN0ZXAgPT09IDAgJiYgYXdhaXQgdGhpcy5oYW5kbGVSZWxhdGlvblZhbGlkYXRpb24oKSkge1xyXG4gICAgICAgICAgICBzdWNjZXNzID0gYXdhaXQgdGhpcy5zZXJ2aWNlLnNhdmVSZWxhdGlvbigpO1xyXG4gICAgICAgICAgICBpZiAoc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnVwZGF0ZUhlYWRlclRyYW5zYWN0aW9uRGVmaW5pdGl2ZSh0aGlzLnNlcnZpY2UuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby51dWlkLCB0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzYXZlU3VjY2VzczogYm9vbGVhbiA9IGF3YWl0IHRoaXMuc2VydmljZS5zYXZlVHJhbnNhY3Rpb25BbmRDb21taXQoKTtcclxuICAgICAgICBpZiAoc2F2ZVN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmFuc2FjdGlvbkZpbmlzaGVkKHRoaXMuc2VydmljZS5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnRyYW5zYWN0aW9uTnIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlUmVsYXRpb25WYWxpZGF0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0UmVsYXRpb24gJiYgdGhpcy5zdGVwUmVsYXRpb24pIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsaWQgPSB0aGlzLmNoZWNrb3V0UmVsYXRpb24uc3VibWl0KCk7XHJcbiAgICAgICAgICAgIGlmICh2YWxpZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGVwUmVsYXRpb24uY29tcGxldGVkID0gYXdhaXQgdGhpcy5zYXZlUmVsYXRpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdmFsaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVEZWxpdmVyeVZhbGlkYXRpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXREZWxpdmVyeSAmJiB0aGlzLnN0ZXBEZWxpdmVyeSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWxpZCA9IHRoaXMuY2hlY2tvdXREZWxpdmVyeS5zdWJtaXQoKTtcclxuICAgICAgICAgICAgaWYgKHZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzYXZlU3VjY2VzczogYm9vbGVhbiA9IGF3YWl0IHRoaXMuc2VydmljZS5zYXZlVHJhbnNhY3Rpb25BbmRDb21taXQoKTtcclxuICAgICAgICAgICAgICAgIGlmIChzYXZlU3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2tTdWNjZXNzOiBib29sZWFuID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnRyeVRvTG9ja1RyYW5zYWN0aW9uKHRoaXMuc2VydmljZS5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLmlkLCB0aGlzLnNlcnZpY2UuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby52ZXJzaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobG9ja1N1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGVwRGVsaXZlcnkuY29tcGxldGVkID0gYXdhaXQgdGhpcy5oYW5kbGVTYXZlRGVsaXZlcnkoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHZhbGlkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2F2ZVJlbGF0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3M6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLnNlcnZpY2Uuc2F2ZVJlbGF0aW9uKCk7XHJcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGVsaXZlcnlBZGRyZXNzTmF3TnIgPT09IG51bGwgfHwgdGhpcy5kZWxpdmVyeUFkZHJlc3NOYXdOciA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuZGVsaXZlcnlBZGRyZXNzTmF3TnIgPT09IDAgJiYgdGhpcy5zZXJ2aWNlLnJlbGF0aW9uLmFkZHJlc3NlcyAmJiB0aGlzLnNlcnZpY2UucmVsYXRpb24uYWRkcmVzc2VzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxpdmVyeUFkZHJlc3NOYXdOciA9IHRoaXMuc2VydmljZS5yZWxhdGlvbi5hZGRyZXNzZXNbMF0ubmF3TnI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuZGVsaXZlcnlBZGRyZXNzTmF3TnIgJiYgdGhpcy5zZXJ2aWNlLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8udHJhbnNhY3Rpb25BZGRyZXNzICE9PSB0aGlzLmRlbGl2ZXJ5QWRkcmVzc05hd05yKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlcnZpY2UudXBkYXRlSGVhZGVyRGVsaXZlcnlBZGRyZXNzKHRoaXMuc2VydmljZS5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnV1aWQsIHRoaXMuZGVsaXZlcnlBZGRyZXNzTmF3TnIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGludm9pY2VBZGRyZXNzTmF3TnI6IG51bWJlciA9IHRoaXMuaW52b2ljZUFkZHJlc3NOYXdOciA/IHRoaXMuaW52b2ljZUFkZHJlc3NOYXdOciA6IHRoaXMuZGVsaXZlcnlBZGRyZXNzTmF3TnI7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlcnZpY2UuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby5pbnZvaWNlQWRkcmVzcyAhPT0gaW52b2ljZUFkZHJlc3NOYXdOcikge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnVwZGF0ZUhlYWRlckludm9pY2VBZGRyZXNzKHRoaXMuc2VydmljZS5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnV1aWQsIGludm9pY2VBZGRyZXNzTmF3TnIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVTYXZlRGVsaXZlcnkoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZURlbGl2ZXJ5QWRkcmVzc0NoYW5nZShuYXdOcjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kZWxpdmVyeUFkZHJlc3NOYXdOciA9IG5hd05yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVJbnZvaWNlQWRkcmVzc0NoYW5nZShuYXdOcjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbnZvaWNlQWRkcmVzc05hd05yID0gbmF3TnI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZVRyYW5zYWN0aW9uRmluaXNoZWQoaWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VydmljZS5yZXNldEN1cnJlbnRUcmFuc2FjdGlvbigpO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25GaW5pc2hlZC5lbWl0KHtpZDogaWQsIGZyb21DaGVja291dDogdGhpcy5zaG93Q3JlYXRlVHJhbnNhY3Rpb25CdXR0b259KTtcclxuICAgIH1cclxufVxyXG4iXX0=