@hmcts/ccpay-web-component 6.5.14-rc1 → 6.5.15-beta1
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.
- package/esm2022/hmcts-ccpay-web-component.mjs +5 -0
- package/esm2022/lib/components/add-remission/add-remission.component.mjs +1276 -0
- package/esm2022/lib/components/allocate-payments/allocate-payments.component.mjs +423 -0
- package/esm2022/lib/components/card-details/card-details.component.mjs +32 -0
- package/esm2022/lib/components/case-transactions/case-transactions.component.mjs +885 -0
- package/esm2022/lib/components/contact-details/contact-details.component.mjs +338 -0
- package/esm2022/lib/components/error-banner/error-banner.component.mjs +18 -0
- package/esm2022/lib/components/fee-summary/fee-summary.component.mjs +280 -0
- package/esm2022/lib/components/mark-unidentified-payment/mark-unidentified-payment.component.mjs +195 -0
- package/esm2022/lib/components/mark-unsolicited-payment/mark-unsolicited-payment.component.mjs +275 -0
- package/esm2022/lib/components/notification-preview/notification-preview.component.mjs +79 -0
- package/esm2022/lib/components/page-not-found.component.mjs +17 -0
- package/esm2022/lib/components/payment-list/payment-list.component.mjs +36 -0
- package/esm2022/lib/components/payment-view/payment-view.component.mjs +467 -0
- package/esm2022/lib/components/pba-details/pba-details.component.mjs +18 -0
- package/esm2022/lib/components/pba-payment/pba-payment.component.mjs +163 -0
- package/esm2022/lib/components/process-refund/process-refund.component.mjs +417 -0
- package/esm2022/lib/components/processed-payments/processed-payments.component.mjs +37 -0
- package/esm2022/lib/components/refund-list/refund-list.component.mjs +73 -0
- package/esm2022/lib/components/refund-status/refund-status.component.mjs +481 -0
- package/esm2022/lib/components/reports/reports.component.mjs +337 -0
- package/esm2022/lib/components/service-request/service-request.component.mjs +516 -0
- package/esm2022/lib/components/status-history/status-history.component.mjs +33 -0
- package/esm2022/lib/components/table/table.component.mjs +127 -0
- package/esm2022/lib/components/unprocessed-payments/unprocessed-payments.component.mjs +236 -0
- package/esm2022/lib/interfaces/AddRemissionRequest.mjs +17 -0
- package/esm2022/lib/interfaces/AddRetroRemissionRequest.mjs +9 -0
- package/esm2022/lib/interfaces/AllocatePaymentRequest.mjs +41 -0
- package/esm2022/lib/interfaces/IAllocationPaymentsRequest.mjs +20 -0
- package/esm2022/lib/interfaces/IBSPayments.mjs +2 -0
- package/esm2022/lib/interfaces/ICardDetails.mjs +2 -0
- package/esm2022/lib/interfaces/IFee.mjs +2 -0
- package/esm2022/lib/interfaces/INotificationPreview.mjs +2 -0
- package/esm2022/lib/interfaces/IOrderReferenceFee.mjs +2 -0
- package/esm2022/lib/interfaces/IPatchRefundAction.mjs +2 -0
- package/esm2022/lib/interfaces/IPayment.mjs +2 -0
- package/esm2022/lib/interfaces/IPaymentFailure.mjs +2 -0
- package/esm2022/lib/interfaces/IPaymentGroup.mjs +2 -0
- package/esm2022/lib/interfaces/IPaymentStatus.mjs +12 -0
- package/esm2022/lib/interfaces/IPaymentView.mjs +2 -0
- package/esm2022/lib/interfaces/IPayments.mjs +2 -0
- package/esm2022/lib/interfaces/IPutNotificationRequest.mjs +13 -0
- package/esm2022/lib/interfaces/IRefundAction.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundContactDetails.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundFee.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundList.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundReasons.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundRejectReason.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundStatus.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundStatusHistory.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundsNotifications.mjs +2 -0
- package/esm2022/lib/interfaces/IRemission.mjs +2 -0
- package/esm2022/lib/interfaces/IResubmitRefundRequest.mjs +13 -0
- package/esm2022/lib/interfaces/IStatusHistories.mjs +2 -0
- package/esm2022/lib/interfaces/IStatusHistory.mjs +2 -0
- package/esm2022/lib/interfaces/IserviceRequestCardPayment.mjs +11 -0
- package/esm2022/lib/interfaces/IserviceRequestPbaPayment.mjs +15 -0
- package/esm2022/lib/interfaces/IssueRefundRequest.mjs +11 -0
- package/esm2022/lib/interfaces/NotificationPreviewRequest.mjs +46 -0
- package/esm2022/lib/interfaces/PayhubAntennaRequest.mjs +14 -0
- package/esm2022/lib/interfaces/PaymentToPayhubRequest.mjs +17 -0
- package/esm2022/lib/interfaces/PostIssueRefundRetroRemission.mjs +9 -0
- package/esm2022/lib/interfaces/PostRefundRetroRemission.mjs +18 -0
- package/esm2022/lib/interfaces/RefundsRequest.mjs +9 -0
- package/esm2022/lib/interfaces/UnidentifiedPaymentsRequest.mjs +16 -0
- package/esm2022/lib/interfaces/UnsolicitedPaymentsRequest.mjs +22 -0
- package/esm2022/lib/payment-lib.component.mjs +430 -0
- package/esm2022/lib/payment-lib.module.mjs +181 -0
- package/esm2022/lib/payment-lib.service.mjs +49 -0
- package/esm2022/lib/pipes/capitalize.pipe.mjs +18 -0
- package/esm2022/lib/pipes/ccd-hyphens.pipe.mjs +22 -0
- package/esm2022/lib/pipes/key-value.pipe.mjs +23 -0
- package/esm2022/lib/pipes/sanitize-html.pipe.mjs +20 -0
- package/esm2022/lib/services/bulk-scaning-payment/bulk-scaning-payment.service.mjs +87 -0
- package/esm2022/lib/services/card-details/card-details.service.mjs +39 -0
- package/esm2022/lib/services/case-transactions/case-transactions.service.mjs +39 -0
- package/esm2022/lib/services/notification/notification.service.mjs +70 -0
- package/esm2022/lib/services/orderslist.service.mjs +154 -0
- package/esm2022/lib/services/payment-list/payment-list.service.mjs +40 -0
- package/esm2022/lib/services/payment-view/payment-view.service.mjs +156 -0
- package/esm2022/lib/services/refunds/refunds.service.mjs +120 -0
- package/esm2022/lib/services/shared/error-handler.service.mjs +76 -0
- package/esm2022/lib/services/shared/httpclient/webcomponent.http.client.mjs +64 -0
- package/esm2022/lib/services/shared/logger/console-logger.service.mjs +43 -0
- package/esm2022/lib/services/shared/logger/logger.service.mjs +23 -0
- package/esm2022/lib/services/status-history/status-history.service.mjs +41 -0
- package/esm2022/lib/services/xl-file/xl-file.service.mjs +197 -0
- package/esm2022/public_api.mjs +7 -0
- package/fesm2022/hmcts-ccpay-web-component.mjs +217 -262
- package/fesm2022/hmcts-ccpay-web-component.mjs.map +1 -1
- package/index.d.ts +5 -2340
- package/lib/components/add-remission/add-remission.component.d.ts +208 -0
- package/lib/components/allocate-payments/allocate-payments.component.d.ts +115 -0
- package/lib/components/card-details/card-details.component.d.ts +18 -0
- package/lib/components/case-transactions/case-transactions.component.d.ts +143 -0
- package/lib/components/contact-details/contact-details.component.d.ts +54 -0
- package/lib/components/error-banner/error-banner.component.d.ts +9 -0
- package/lib/components/fee-summary/fee-summary.component.d.ts +72 -0
- package/lib/components/mark-unidentified-payment/mark-unidentified-payment.component.d.ts +52 -0
- package/lib/components/mark-unsolicited-payment/mark-unsolicited-payment.component.d.ts +63 -0
- package/lib/components/notification-preview/notification-preview.component.d.ts +30 -0
- package/lib/components/page-not-found.component.d.ts +5 -0
- package/lib/components/payment-list/payment-list.component.d.ts +19 -0
- package/lib/components/payment-view/payment-view.component.d.ts +110 -0
- package/lib/components/pba-details/pba-details.component.d.ts +10 -0
- package/lib/components/pba-payment/pba-payment.component.d.ts +41 -0
- package/lib/components/process-refund/process-refund.component.d.ts +82 -0
- package/lib/components/processed-payments/processed-payments.component.d.ts +17 -0
- package/lib/components/refund-list/refund-list.component.d.ts +26 -0
- package/lib/components/refund-status/refund-status.component.d.ts +119 -0
- package/lib/components/reports/reports.component.d.ts +49 -0
- package/lib/components/service-request/service-request.component.d.ts +141 -0
- package/lib/components/status-history/status-history.component.d.ts +19 -0
- package/lib/components/table/table.component.d.ts +45 -0
- package/lib/components/unprocessed-payments/unprocessed-payments.component.d.ts +61 -0
- package/lib/interfaces/AddRemissionRequest.d.ts +11 -0
- package/lib/interfaces/AddRetroRemissionRequest.d.ts +5 -0
- package/lib/interfaces/AllocatePaymentRequest.d.ts +31 -0
- package/lib/interfaces/IAllocationPaymentsRequest.d.ts +9 -0
- package/lib/interfaces/IBSPayments.d.ts +19 -0
- package/lib/interfaces/ICardDetails.d.ts +7 -0
- package/lib/interfaces/IFee.d.ts +29 -0
- package/lib/interfaces/INotificationPreview.d.ts +27 -0
- package/lib/interfaces/IOrderReferenceFee.d.ts +9 -0
- package/lib/interfaces/IPatchRefundAction.d.ts +4 -0
- package/lib/interfaces/IPayment.d.ts +35 -0
- package/lib/interfaces/IPaymentFailure.d.ts +13 -0
- package/lib/interfaces/IPaymentGroup.d.ts +11 -0
- package/lib/interfaces/IPaymentStatus.d.ts +11 -0
- package/lib/interfaces/IPaymentView.d.ts +5 -0
- package/lib/interfaces/IPayments.d.ts +4 -0
- package/lib/interfaces/IPutNotificationRequest.d.ts +6 -0
- package/lib/interfaces/IRefundAction.d.ts +4 -0
- package/lib/interfaces/IRefundContactDetails.d.ts +9 -0
- package/lib/interfaces/IRefundFee.d.ts +7 -0
- package/lib/interfaces/IRefundList.d.ts +20 -0
- package/lib/interfaces/IRefundReasons.d.ts +6 -0
- package/lib/interfaces/IRefundRejectReason.d.ts +4 -0
- package/lib/interfaces/IRefundStatus.d.ts +8 -0
- package/lib/interfaces/IRefundStatusHistory.d.ts +5 -0
- package/lib/interfaces/IRefundsNotifications.d.ts +16 -0
- package/lib/interfaces/IRemission.d.ts +14 -0
- package/lib/interfaces/IResubmitRefundRequest.d.ts +9 -0
- package/lib/interfaces/IStatusHistories.d.ts +7 -0
- package/lib/interfaces/IStatusHistory.d.ts +7 -0
- package/lib/interfaces/IserviceRequestCardPayment.d.ts +6 -0
- package/lib/interfaces/IserviceRequestPbaPayment.d.ts +8 -0
- package/lib/interfaces/IssueRefundRequest.d.ts +6 -0
- package/lib/interfaces/NotificationPreviewRequest.d.ts +25 -0
- package/lib/interfaces/PayhubAntennaRequest.d.ts +8 -0
- package/lib/interfaces/PaymentToPayhubRequest.d.ts +11 -0
- package/lib/interfaces/PostIssueRefundRetroRemission.d.ts +6 -0
- package/lib/interfaces/PostRefundRetroRemission.d.ts +11 -0
- package/lib/interfaces/RefundsRequest.d.ts +5 -0
- package/lib/interfaces/UnidentifiedPaymentsRequest.d.ts +7 -0
- package/lib/interfaces/UnsolicitedPaymentsRequest.d.ts +10 -0
- package/lib/payment-lib.component.d.ts +156 -0
- package/lib/payment-lib.module.d.ts +42 -0
- package/lib/payment-lib.service.d.ts +21 -0
- package/lib/pipes/capitalize.pipe.d.ts +8 -0
- package/lib/pipes/ccd-hyphens.pipe.d.ts +8 -0
- package/lib/pipes/key-value.pipe.d.ts +8 -0
- package/lib/pipes/sanitize-html.pipe.d.ts +10 -0
- package/lib/services/bulk-scaning-payment/bulk-scaning-payment.service.d.ts +27 -0
- package/lib/services/card-details/card-details.service.d.ts +17 -0
- package/lib/services/case-transactions/case-transactions.service.d.ts +17 -0
- package/lib/services/notification/notification.service.d.ts +21 -0
- package/lib/services/orderslist.service.d.ts +77 -0
- package/lib/services/payment-list/payment-list.service.d.ts +18 -0
- package/lib/services/payment-view/payment-view.service.d.ts +61 -0
- package/lib/services/refunds/refunds.service.d.ts +36 -0
- package/lib/services/shared/error-handler.service.d.ts +14 -0
- package/lib/services/shared/httpclient/webcomponent.http.client.d.ts +17 -0
- package/lib/services/shared/logger/console-logger.service.d.ts +11 -0
- package/lib/services/shared/logger/logger.service.d.ts +14 -0
- package/lib/services/status-history/status-history.service.d.ts +17 -0
- package/lib/services/xl-file/xl-file.service.d.ts +16 -0
- package/package.json +5 -3
- package/public_api.d.ts +3 -0
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
import { ChangeDetectorRef, Component, forwardRef, Input } from '@angular/core';
|
|
2
|
+
import { PaymentLibService } from './payment-lib.service';
|
|
3
|
+
import { OrderslistService } from './services/orderslist.service';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "./payment-lib.service";
|
|
6
|
+
import * as i2 from "./services/orderslist.service";
|
|
7
|
+
import * as i3 from "@angular/common";
|
|
8
|
+
import * as i4 from "./components/payment-view/payment-view.component";
|
|
9
|
+
import * as i5 from "./components/case-transactions/case-transactions.component";
|
|
10
|
+
import * as i6 from "./components/refund-status/refund-status.component";
|
|
11
|
+
import * as i7 from "./components/pba-payment/pba-payment.component";
|
|
12
|
+
import * as i8 from "./components/payment-list/payment-list.component";
|
|
13
|
+
import * as i9 from "./components/process-refund/process-refund.component";
|
|
14
|
+
import * as i10 from "./components/refund-list/refund-list.component";
|
|
15
|
+
import * as i11 from "./components/mark-unidentified-payment/mark-unidentified-payment.component";
|
|
16
|
+
import * as i12 from "./components/mark-unsolicited-payment/mark-unsolicited-payment.component";
|
|
17
|
+
import * as i13 from "./components/allocate-payments/allocate-payments.component";
|
|
18
|
+
import * as i14 from "./components/fee-summary/fee-summary.component";
|
|
19
|
+
import * as i15 from "./components/reports/reports.component";
|
|
20
|
+
export class PaymentLibComponent {
|
|
21
|
+
paymentLibService;
|
|
22
|
+
cd;
|
|
23
|
+
OrderslistService;
|
|
24
|
+
API_ROOT;
|
|
25
|
+
BULKSCAN_API_ROOT;
|
|
26
|
+
REFUNDS_API_ROOT;
|
|
27
|
+
NOTIFICATION_API_ROOT;
|
|
28
|
+
CARDPAYMENTRETURNURL;
|
|
29
|
+
CCD_CASE_NUMBER;
|
|
30
|
+
EXC_REFERENCE;
|
|
31
|
+
PAYMENT_METHOD;
|
|
32
|
+
VIEW;
|
|
33
|
+
VIEWSERVICE;
|
|
34
|
+
PAYMENT_GROUP_REF;
|
|
35
|
+
TAKEPAYMENT;
|
|
36
|
+
SERVICEREQUEST;
|
|
37
|
+
DCN_NUMBER;
|
|
38
|
+
SELECTED_OPTION;
|
|
39
|
+
ISBSENABLE;
|
|
40
|
+
ISSFENABLE;
|
|
41
|
+
ISTURNOFF;
|
|
42
|
+
CASETYPE;
|
|
43
|
+
ISPAYMENTSTATUSENABLED;
|
|
44
|
+
rootUrl;
|
|
45
|
+
REFUNDLIST;
|
|
46
|
+
USERID;
|
|
47
|
+
LOGGEDINUSERROLES;
|
|
48
|
+
LOGGEDINUSEREMAIL;
|
|
49
|
+
isFromServiceRequestPage;
|
|
50
|
+
telephonySelectionEnable;
|
|
51
|
+
paymentMethod;
|
|
52
|
+
bspaymentdcn;
|
|
53
|
+
unProcessedPaymentServiceId = null;
|
|
54
|
+
paymentGroupReference;
|
|
55
|
+
paymentReference;
|
|
56
|
+
refundReference;
|
|
57
|
+
isFromPayBubble = false;
|
|
58
|
+
refundlistsource;
|
|
59
|
+
viewName;
|
|
60
|
+
isTurnOff;
|
|
61
|
+
caseType;
|
|
62
|
+
unProcessedPayment = null;
|
|
63
|
+
isRefundStatusView;
|
|
64
|
+
isRedirectFromCaseTransactionPage;
|
|
65
|
+
isCallFromRefundList;
|
|
66
|
+
isFromRefundStatusPage;
|
|
67
|
+
iscancelClicked;
|
|
68
|
+
isFromPaymentDetailPage;
|
|
69
|
+
pbaPayOrderRef;
|
|
70
|
+
isTakePayment;
|
|
71
|
+
orderDetail;
|
|
72
|
+
orderRef;
|
|
73
|
+
orderStatus;
|
|
74
|
+
orderParty;
|
|
75
|
+
orderCreated;
|
|
76
|
+
orderCCDEvent;
|
|
77
|
+
serviceRequestValue;
|
|
78
|
+
orderAddBtnEnable;
|
|
79
|
+
orderFeesTotal = 0.00;
|
|
80
|
+
orderRemissionTotal = 0.00;
|
|
81
|
+
orderTotalPayments = 0.00;
|
|
82
|
+
orderPendingPayments = 0.00;
|
|
83
|
+
paymentGroup;
|
|
84
|
+
overPaymentAmount = 0.00;
|
|
85
|
+
refunds;
|
|
86
|
+
constructor(paymentLibService, cd, OrderslistService) {
|
|
87
|
+
this.paymentLibService = paymentLibService;
|
|
88
|
+
this.cd = cd;
|
|
89
|
+
this.OrderslistService = OrderslistService;
|
|
90
|
+
}
|
|
91
|
+
ngAfterContentChecked() {
|
|
92
|
+
this.cd.detectChanges();
|
|
93
|
+
}
|
|
94
|
+
ngOnInit() {
|
|
95
|
+
this.paymentLibService.setApiRootUrl(this.API_ROOT);
|
|
96
|
+
this.paymentLibService.setBulkScanApiRootUrl(this.BULKSCAN_API_ROOT);
|
|
97
|
+
this.paymentLibService.setRefundndsApiRootUrl(this.REFUNDS_API_ROOT);
|
|
98
|
+
this.paymentLibService.setNoticationApiRootUrl(this.NOTIFICATION_API_ROOT);
|
|
99
|
+
this.paymentLibService.setCardPaymentReturnUrl(this.CARDPAYMENTRETURNURL);
|
|
100
|
+
if (this.LOGGEDINUSERROLES.length > 0) {
|
|
101
|
+
this.OrderslistService.setUserRolesList(this.LOGGEDINUSERROLES);
|
|
102
|
+
}
|
|
103
|
+
if (this.PAYMENT_GROUP_REF) {
|
|
104
|
+
this.paymentGroupReference = this.PAYMENT_GROUP_REF;
|
|
105
|
+
}
|
|
106
|
+
if (this.DCN_NUMBER) {
|
|
107
|
+
this.bspaymentdcn = this.DCN_NUMBER;
|
|
108
|
+
}
|
|
109
|
+
if (this.REFUNDLIST === "true") {
|
|
110
|
+
this.VIEW = 'refund-list';
|
|
111
|
+
this.viewName = this.VIEW;
|
|
112
|
+
}
|
|
113
|
+
if (this.VIEW === 'fee-summary') {
|
|
114
|
+
this.viewName = 'fee-summary';
|
|
115
|
+
}
|
|
116
|
+
else if (this.VIEW !== 'reports' && this.VIEW !== 'refund-list') {
|
|
117
|
+
this.viewName = 'case-transactions';
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
this.viewName = this.VIEW;
|
|
121
|
+
}
|
|
122
|
+
if (this.isTakePayment) {
|
|
123
|
+
this.TAKEPAYMENT = true;
|
|
124
|
+
}
|
|
125
|
+
if (this.API_ROOT == 'api/payment-history') {
|
|
126
|
+
this.isFromPayBubble = true;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Adds a remission to the payment group using data from the provided form group.
|
|
131
|
+
*
|
|
132
|
+
* This method checks if the `paymentGroup` is not null before attempting to add the remission.
|
|
133
|
+
* If the `paymentGroup` exists, a new remission is created using the values from the provided
|
|
134
|
+
* form group (`currentRemissionFormGroup`), and it is pushed into the `remissions` array of the payment group.
|
|
135
|
+
*
|
|
136
|
+
* @param {AddRetroRemissionRequest} currentRemissionFormGroup - The form group containing remission data
|
|
137
|
+
* (e.g., `hwf_amount`, `hwf_reference`).
|
|
138
|
+
*/
|
|
139
|
+
addRemission(currentRemissionFormGroup) {
|
|
140
|
+
if (this.paymentGroup != null) {
|
|
141
|
+
const remission = {
|
|
142
|
+
remission_reference: null,
|
|
143
|
+
hwf_reference: currentRemissionFormGroup.hwf_reference,
|
|
144
|
+
hwf_amount: currentRemissionFormGroup.hwf_amount,
|
|
145
|
+
beneficiary_name: null,
|
|
146
|
+
ccd_case_number: null,
|
|
147
|
+
fee_code: null,
|
|
148
|
+
date_created: null,
|
|
149
|
+
fee_id: null,
|
|
150
|
+
issue_refund_add_refund_add_remission: false,
|
|
151
|
+
add_refund: false,
|
|
152
|
+
overall_balance: currentRemissionFormGroup.hwf_amount,
|
|
153
|
+
acollection_of_fess: true
|
|
154
|
+
};
|
|
155
|
+
this.paymentGroup.remissions.push(remission);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* This method is used to set the paymentGroup for the add remission journey.
|
|
160
|
+
* @param updatedPaymentGroup this is an updated paymentGroup version.
|
|
161
|
+
*/
|
|
162
|
+
addPaymentGroup(updatedPaymentGroup) {
|
|
163
|
+
if (this.paymentGroup == null) {
|
|
164
|
+
this.paymentGroup = updatedPaymentGroup;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Calculates the total remission amount for the current payment group.
|
|
169
|
+
*
|
|
170
|
+
* This method checks if the payment group contains any remissions and, if so,
|
|
171
|
+
* sums up the `hwf_amount` of all remissions using the `reduce()` method.
|
|
172
|
+
* If no remissions are found, it returns a default value of 0.
|
|
173
|
+
*
|
|
174
|
+
* @returns {number} The total remission amount, or 0 if no remissions are present.
|
|
175
|
+
*/
|
|
176
|
+
getTotalRemission() {
|
|
177
|
+
let remissionTotal = 0;
|
|
178
|
+
if (this.paymentGroup.remissions) {
|
|
179
|
+
remissionTotal = this.paymentGroup.remissions.reduce((totalRemission, remission) => totalRemission + remission.hwf_amount, 0);
|
|
180
|
+
}
|
|
181
|
+
return remissionTotal;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Calculates the total fee amount for the current payment group.
|
|
185
|
+
*
|
|
186
|
+
* This method checks if the payment group contains any fees and, if so,
|
|
187
|
+
* sums up the `calculated_amount` of all fees using the `reduce()` method.
|
|
188
|
+
* If no fees are found, it returns a default value of 0.
|
|
189
|
+
*
|
|
190
|
+
* @returns {number} The total fee amount, or 0 if no fees are present.
|
|
191
|
+
*/
|
|
192
|
+
getTotalFees() {
|
|
193
|
+
let feesTotal = 0;
|
|
194
|
+
if (this.paymentGroup.fees) {
|
|
195
|
+
feesTotal = this.paymentGroup.fees.reduce((totalFees, fee) => totalFees + fee.calculated_amount, 0);
|
|
196
|
+
}
|
|
197
|
+
return feesTotal;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Calculates the total payment amount for the current payment group.
|
|
201
|
+
*
|
|
202
|
+
* This method checks if the payment group contains any payments and, if so,
|
|
203
|
+
* sums up the `amount` of all payments using the `reduce()` method.
|
|
204
|
+
* If no payments are found, it returns a default value of 0.
|
|
205
|
+
*
|
|
206
|
+
* @returns {number} The total payment amount, or 0 if no payments are present.
|
|
207
|
+
*/
|
|
208
|
+
getTotalPayments() {
|
|
209
|
+
let paymentsTotal = 0;
|
|
210
|
+
if (this.paymentGroup.payments) {
|
|
211
|
+
paymentsTotal = this.paymentGroup.payments.reduce((totalFees, payment) => totalFees + payment.amount, 0);
|
|
212
|
+
}
|
|
213
|
+
return paymentsTotal;
|
|
214
|
+
}
|
|
215
|
+
// Refunds libs section.
|
|
216
|
+
/**
|
|
217
|
+
* This function is used to find out if the current refunds list are in progress for the fee passed as parameter
|
|
218
|
+
* @param fee this is the fee used to find out if the refunds are in progress.
|
|
219
|
+
*/
|
|
220
|
+
isTheCurrentRefundInProcessForThisFee(fee) {
|
|
221
|
+
// No refunds
|
|
222
|
+
if (this.refunds == null || this.refunds.length === 0) {
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
return !this.isTheCurrentRefundRejectedForTheFee(fee.id.toString());
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* This function is used to find out if in current list of refunds all refunds has been rejected
|
|
229
|
+
* for the fee passed as parameter.
|
|
230
|
+
* @param feeCode this is the fee code used to find out all refunds rejected refunds.
|
|
231
|
+
*/
|
|
232
|
+
isTheCurrentRefundRejectedForTheFee(feeCode) {
|
|
233
|
+
let refundsByFee = this.refunds.filter(refund => refund.fee_ids === feeCode);
|
|
234
|
+
let refundsByFeeAndRejected = this.refunds.filter(refund => refund.refund_status.name === 'Rejected');
|
|
235
|
+
// Refunds > 0 and overPayment --> refunds in process or Rejected.
|
|
236
|
+
if (refundsByFee.length === refundsByFeeAndRejected.length) {
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Rounds very small values to zero if they fall below a specified threshold.
|
|
243
|
+
*
|
|
244
|
+
* This is useful for eliminating floating-point precision errors that result in
|
|
245
|
+
* extremely small non-zero values (e.g., 1.1368683772161603e-13) which should
|
|
246
|
+
* logically be treated as zero.
|
|
247
|
+
*
|
|
248
|
+
* @param value - The numeric value to evaluate and potentially round.
|
|
249
|
+
* @param threshold - The minimum absolute value considered significant. Defaults to 1e-10.
|
|
250
|
+
* @returns The original value if it's above the threshold, or 0 if it's below.
|
|
251
|
+
*
|
|
252
|
+
* @example
|
|
253
|
+
* roundTinyValue(1.1368683772161603e-13); // returns 0
|
|
254
|
+
* roundTinyValue(0.00001); // returns 0.00001
|
|
255
|
+
*/
|
|
256
|
+
roundTinyValue(value, threshold = 1e-4) {
|
|
257
|
+
return Math.abs(value) < threshold ? 0 : value;
|
|
258
|
+
}
|
|
259
|
+
getRoundedOverPayment() {
|
|
260
|
+
return this.roundTinyValue(this.overPaymentAmount);
|
|
261
|
+
}
|
|
262
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaymentLibComponent, deps: [{ token: i1.PaymentLibService }, { token: i0.ChangeDetectorRef }, { token: i2.OrderslistService }], target: i0.ɵɵFactoryTarget.Component });
|
|
263
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PaymentLibComponent, selector: "ccpay-payment-lib", inputs: { API_ROOT: "API_ROOT", BULKSCAN_API_ROOT: "BULKSCAN_API_ROOT", REFUNDS_API_ROOT: "REFUNDS_API_ROOT", NOTIFICATION_API_ROOT: "NOTIFICATION_API_ROOT", CARDPAYMENTRETURNURL: "CARDPAYMENTRETURNURL", CCD_CASE_NUMBER: "CCD_CASE_NUMBER", EXC_REFERENCE: "EXC_REFERENCE", PAYMENT_METHOD: "PAYMENT_METHOD", VIEW: "VIEW", VIEWSERVICE: "VIEWSERVICE", PAYMENT_GROUP_REF: "PAYMENT_GROUP_REF", TAKEPAYMENT: "TAKEPAYMENT", SERVICEREQUEST: "SERVICEREQUEST", DCN_NUMBER: "DCN_NUMBER", SELECTED_OPTION: "SELECTED_OPTION", ISBSENABLE: "ISBSENABLE", ISSFENABLE: "ISSFENABLE", ISTURNOFF: "ISTURNOFF", CASETYPE: "CASETYPE", ISPAYMENTSTATUSENABLED: "ISPAYMENTSTATUSENABLED", rootUrl: "rootUrl", REFUNDLIST: "REFUNDLIST", USERID: "USERID", LOGGEDINUSERROLES: "LOGGEDINUSERROLES", LOGGEDINUSEREMAIL: "LOGGEDINUSEREMAIL", isFromServiceRequestPage: "isFromServiceRequestPage", telephonySelectionEnable: "telephonySelectionEnable" }, providers: [{ provide: 'PAYMENT_LIB', useExisting: forwardRef(() => PaymentLibComponent) }], ngImport: i0, template: `
|
|
264
|
+
<ccpay-refund-list [USERID]="USERID" [LOGGEDINUSERROLES]="LOGGEDINUSERROLES" [LOGGEDINUSEREMAIL]="LOGGEDINUSEREMAIL" *ngIf="viewName === 'refund-list'"></ccpay-refund-list>
|
|
265
|
+
<ccpay-payment-list *ngIf="viewName === 'payment-list'"></ccpay-payment-list>
|
|
266
|
+
<ccpay-refund-status
|
|
267
|
+
[LOGGEDINUSERROLES]="LOGGEDINUSERROLES"
|
|
268
|
+
[API_ROOT]="API_ROOT"
|
|
269
|
+
*ngIf="viewName === 'refundstatuslist'"> </ccpay-refund-status >
|
|
270
|
+
<ccpay-payment-view [LOGGEDINUSERROLES]="LOGGEDINUSERROLES" *ngIf="viewName === 'payment-view'"
|
|
271
|
+
[isTurnOff]="ISTURNOFF" [isTakePayment]="TAKEPAYMENT" [caseType]="CASETYPE"
|
|
272
|
+
[ISPAYMENTSTATUSENABLED] = "ISPAYMENTSTATUSENABLED"
|
|
273
|
+
></ccpay-payment-view>
|
|
274
|
+
|
|
275
|
+
<ccpay-process-refund *ngIf="viewName === 'process-refund'"
|
|
276
|
+
[refundReference]="refundReference"
|
|
277
|
+
[refundlistsource]="refundlistsource"
|
|
278
|
+
></ccpay-process-refund>
|
|
279
|
+
<ccpay-pba-payment *ngIf="viewName === 'pba-payment'"
|
|
280
|
+
[pbaPayOrderRef]="pbaPayOrderRef"
|
|
281
|
+
></ccpay-pba-payment>
|
|
282
|
+
<ccpay-case-transactions [isTakePayment]="isTakePayment" [isFromServiceRequestPage]="isFromServiceRequestPage" [LOGGEDINUSERROLES]="LOGGEDINUSERROLES" *ngIf="viewName === 'case-transactions'"></ccpay-case-transactions>
|
|
283
|
+
<app-mark-unidentified-payment *ngIf="viewName === 'unidentifiedPage'"
|
|
284
|
+
[caseType]="CASETYPE"></app-mark-unidentified-payment>
|
|
285
|
+
<app-mark-unsolicited-payment *ngIf="viewName === 'unsolicitedPage'"
|
|
286
|
+
[caseType]="CASETYPE"></app-mark-unsolicited-payment>
|
|
287
|
+
<app-allocate-payments *ngIf="viewName === 'allocate-payments'"
|
|
288
|
+
[isTurnOff]="ISTURNOFF"
|
|
289
|
+
[caseType]="CASETYPE"
|
|
290
|
+
></app-allocate-payments>
|
|
291
|
+
<ccpay-fee-summary *ngIf="viewName === 'fee-summary'"
|
|
292
|
+
[ccdCaseNumber]="CCD_CASE_NUMBER"
|
|
293
|
+
[paymentGroupRef]="paymentGroupReference"
|
|
294
|
+
[isTurnOff]="ISTURNOFF"
|
|
295
|
+
[caseType]="CASETYPE"
|
|
296
|
+
[telephonySelectionEnable] ="telephonySelectionEnable"
|
|
297
|
+
></ccpay-fee-summary>
|
|
298
|
+
<ccpay-reports *ngIf="viewName === 'reports'"
|
|
299
|
+
[ISPAYMENTSTATUSENABLED] = "ISPAYMENTSTATUSENABLED"
|
|
300
|
+
></ccpay-reports>
|
|
301
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.PaymentViewComponent, selector: "ccpay-payment-view", inputs: ["isTurnOff", "isTakePayment", "caseType", "orderRef", "orderStatus", "orderTotalPayments", "payment", "LOGGEDINUSERROLES", "ISPAYMENTSTATUSENABLED", "orderParty", "orderCreated", "orderCCDEvent", "orderFeesTotal", "orderRemissionTotal", "orderDetail", "isServiceRequest"] }, { kind: "component", type: i5.CaseTransactionsComponent, selector: "ccpay-case-transactions", inputs: ["LOGGEDINUSERROLES", "isTakePayment", "isFromServiceRequestPage"] }, { kind: "component", type: i6.RefundStatusComponent, selector: "ccpay-refund-status", inputs: ["LOGGEDINUSERROLES", "API_ROOT", "ccdCaseNumber", "isTurnOff", "orderParty"] }, { kind: "component", type: i7.PbaPaymentComponent, selector: "ccpay-pba-payment", inputs: ["pbaPayOrderRef"] }, { kind: "component", type: i8.PaymentListComponent, selector: "ccpay-payment-list" }, { kind: "component", type: i9.ProcessRefundComponent, selector: "ccpay-process-refund", inputs: ["refundReference", "refundlistsource"] }, { kind: "component", type: i10.RefundListComponent, selector: "ccpay-refund-list", inputs: ["USERID", "LOGGEDINUSERROLES", "LOGGEDINUSEREMAIL"] }, { kind: "component", type: i11.MarkUnidentifiedPaymentComponent, selector: "app-mark-unidentified-payment", inputs: ["caseType"] }, { kind: "component", type: i12.MarkUnsolicitedPaymentComponent, selector: "app-mark-unsolicited-payment", inputs: ["caseType"] }, { kind: "component", type: i13.AllocatePaymentsComponent, selector: "app-allocate-payments", inputs: ["isTurnOff", "caseType"], outputs: ["reasonEventEmitter", "explanationEventEmitter"] }, { kind: "component", type: i14.FeeSummaryComponent, selector: "ccpay-fee-summary", inputs: ["paymentGroupRef", "ccdCaseNumber", "isTurnOff", "caseType", "telephonySelectionEnable"] }, { kind: "component", type: i15.ReportsComponent, selector: "ccpay-reports", inputs: ["ISPAYMENTSTATUSENABLED"] }] });
|
|
302
|
+
}
|
|
303
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaymentLibComponent, decorators: [{
|
|
304
|
+
type: Component,
|
|
305
|
+
args: [{
|
|
306
|
+
selector: 'ccpay-payment-lib',
|
|
307
|
+
template: `
|
|
308
|
+
<ccpay-refund-list [USERID]="USERID" [LOGGEDINUSERROLES]="LOGGEDINUSERROLES" [LOGGEDINUSEREMAIL]="LOGGEDINUSEREMAIL" *ngIf="viewName === 'refund-list'"></ccpay-refund-list>
|
|
309
|
+
<ccpay-payment-list *ngIf="viewName === 'payment-list'"></ccpay-payment-list>
|
|
310
|
+
<ccpay-refund-status
|
|
311
|
+
[LOGGEDINUSERROLES]="LOGGEDINUSERROLES"
|
|
312
|
+
[API_ROOT]="API_ROOT"
|
|
313
|
+
*ngIf="viewName === 'refundstatuslist'"> </ccpay-refund-status >
|
|
314
|
+
<ccpay-payment-view [LOGGEDINUSERROLES]="LOGGEDINUSERROLES" *ngIf="viewName === 'payment-view'"
|
|
315
|
+
[isTurnOff]="ISTURNOFF" [isTakePayment]="TAKEPAYMENT" [caseType]="CASETYPE"
|
|
316
|
+
[ISPAYMENTSTATUSENABLED] = "ISPAYMENTSTATUSENABLED"
|
|
317
|
+
></ccpay-payment-view>
|
|
318
|
+
|
|
319
|
+
<ccpay-process-refund *ngIf="viewName === 'process-refund'"
|
|
320
|
+
[refundReference]="refundReference"
|
|
321
|
+
[refundlistsource]="refundlistsource"
|
|
322
|
+
></ccpay-process-refund>
|
|
323
|
+
<ccpay-pba-payment *ngIf="viewName === 'pba-payment'"
|
|
324
|
+
[pbaPayOrderRef]="pbaPayOrderRef"
|
|
325
|
+
></ccpay-pba-payment>
|
|
326
|
+
<ccpay-case-transactions [isTakePayment]="isTakePayment" [isFromServiceRequestPage]="isFromServiceRequestPage" [LOGGEDINUSERROLES]="LOGGEDINUSERROLES" *ngIf="viewName === 'case-transactions'"></ccpay-case-transactions>
|
|
327
|
+
<app-mark-unidentified-payment *ngIf="viewName === 'unidentifiedPage'"
|
|
328
|
+
[caseType]="CASETYPE"></app-mark-unidentified-payment>
|
|
329
|
+
<app-mark-unsolicited-payment *ngIf="viewName === 'unsolicitedPage'"
|
|
330
|
+
[caseType]="CASETYPE"></app-mark-unsolicited-payment>
|
|
331
|
+
<app-allocate-payments *ngIf="viewName === 'allocate-payments'"
|
|
332
|
+
[isTurnOff]="ISTURNOFF"
|
|
333
|
+
[caseType]="CASETYPE"
|
|
334
|
+
></app-allocate-payments>
|
|
335
|
+
<ccpay-fee-summary *ngIf="viewName === 'fee-summary'"
|
|
336
|
+
[ccdCaseNumber]="CCD_CASE_NUMBER"
|
|
337
|
+
[paymentGroupRef]="paymentGroupReference"
|
|
338
|
+
[isTurnOff]="ISTURNOFF"
|
|
339
|
+
[caseType]="CASETYPE"
|
|
340
|
+
[telephonySelectionEnable] ="telephonySelectionEnable"
|
|
341
|
+
></ccpay-fee-summary>
|
|
342
|
+
<ccpay-reports *ngIf="viewName === 'reports'"
|
|
343
|
+
[ISPAYMENTSTATUSENABLED] = "ISPAYMENTSTATUSENABLED"
|
|
344
|
+
></ccpay-reports>
|
|
345
|
+
`,
|
|
346
|
+
providers: [{ provide: 'PAYMENT_LIB', useExisting: forwardRef(() => PaymentLibComponent) }]
|
|
347
|
+
}]
|
|
348
|
+
}], ctorParameters: () => [{ type: i1.PaymentLibService }, { type: i0.ChangeDetectorRef }, { type: i2.OrderslistService }], propDecorators: { API_ROOT: [{
|
|
349
|
+
type: Input,
|
|
350
|
+
args: ['API_ROOT']
|
|
351
|
+
}], BULKSCAN_API_ROOT: [{
|
|
352
|
+
type: Input,
|
|
353
|
+
args: ['BULKSCAN_API_ROOT']
|
|
354
|
+
}], REFUNDS_API_ROOT: [{
|
|
355
|
+
type: Input,
|
|
356
|
+
args: ['REFUNDS_API_ROOT']
|
|
357
|
+
}], NOTIFICATION_API_ROOT: [{
|
|
358
|
+
type: Input,
|
|
359
|
+
args: ['NOTIFICATION_API_ROOT']
|
|
360
|
+
}], CARDPAYMENTRETURNURL: [{
|
|
361
|
+
type: Input,
|
|
362
|
+
args: ['CARDPAYMENTRETURNURL']
|
|
363
|
+
}], CCD_CASE_NUMBER: [{
|
|
364
|
+
type: Input,
|
|
365
|
+
args: ['CCD_CASE_NUMBER']
|
|
366
|
+
}], EXC_REFERENCE: [{
|
|
367
|
+
type: Input,
|
|
368
|
+
args: ['EXC_REFERENCE']
|
|
369
|
+
}], PAYMENT_METHOD: [{
|
|
370
|
+
type: Input,
|
|
371
|
+
args: ['PAYMENT_METHOD']
|
|
372
|
+
}], VIEW: [{
|
|
373
|
+
type: Input,
|
|
374
|
+
args: ['VIEW']
|
|
375
|
+
}], VIEWSERVICE: [{
|
|
376
|
+
type: Input,
|
|
377
|
+
args: ['VIEWSERVICE']
|
|
378
|
+
}], PAYMENT_GROUP_REF: [{
|
|
379
|
+
type: Input,
|
|
380
|
+
args: ['PAYMENT_GROUP_REF']
|
|
381
|
+
}], TAKEPAYMENT: [{
|
|
382
|
+
type: Input,
|
|
383
|
+
args: ['TAKEPAYMENT']
|
|
384
|
+
}], SERVICEREQUEST: [{
|
|
385
|
+
type: Input,
|
|
386
|
+
args: ['SERVICEREQUEST']
|
|
387
|
+
}], DCN_NUMBER: [{
|
|
388
|
+
type: Input,
|
|
389
|
+
args: ['DCN_NUMBER']
|
|
390
|
+
}], SELECTED_OPTION: [{
|
|
391
|
+
type: Input,
|
|
392
|
+
args: ['SELECTED_OPTION']
|
|
393
|
+
}], ISBSENABLE: [{
|
|
394
|
+
type: Input,
|
|
395
|
+
args: ['ISBSENABLE']
|
|
396
|
+
}], ISSFENABLE: [{
|
|
397
|
+
type: Input,
|
|
398
|
+
args: ['ISSFENABLE']
|
|
399
|
+
}], ISTURNOFF: [{
|
|
400
|
+
type: Input,
|
|
401
|
+
args: ['ISTURNOFF']
|
|
402
|
+
}], CASETYPE: [{
|
|
403
|
+
type: Input,
|
|
404
|
+
args: ['CASETYPE']
|
|
405
|
+
}], ISPAYMENTSTATUSENABLED: [{
|
|
406
|
+
type: Input,
|
|
407
|
+
args: ['ISPAYMENTSTATUSENABLED']
|
|
408
|
+
}], rootUrl: [{
|
|
409
|
+
type: Input,
|
|
410
|
+
args: ['rootUrl']
|
|
411
|
+
}], REFUNDLIST: [{
|
|
412
|
+
type: Input,
|
|
413
|
+
args: ['REFUNDLIST']
|
|
414
|
+
}], USERID: [{
|
|
415
|
+
type: Input,
|
|
416
|
+
args: ['USERID']
|
|
417
|
+
}], LOGGEDINUSERROLES: [{
|
|
418
|
+
type: Input,
|
|
419
|
+
args: ['LOGGEDINUSERROLES']
|
|
420
|
+
}], LOGGEDINUSEREMAIL: [{
|
|
421
|
+
type: Input,
|
|
422
|
+
args: ['LOGGEDINUSEREMAIL']
|
|
423
|
+
}], isFromServiceRequestPage: [{
|
|
424
|
+
type: Input,
|
|
425
|
+
args: ['isFromServiceRequestPage']
|
|
426
|
+
}], telephonySelectionEnable: [{
|
|
427
|
+
type: Input,
|
|
428
|
+
args: ['telephonySelectionEnable']
|
|
429
|
+
}] } });
|
|
430
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1saWIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF5bWVudC1saWIvc3JjL2xpYi9wYXltZW50LWxpYi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLCtCQUErQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQXFEaEUsTUFBTSxPQUFPLG1CQUFtQjtJQXFFVjtJQUNWO0lBQ0E7SUF0RVMsUUFBUSxDQUFTO0lBQ1IsaUJBQWlCLENBQVM7SUFDM0IsZ0JBQWdCLENBQVM7SUFDcEIscUJBQXFCLENBQVM7SUFDL0Isb0JBQW9CLENBQVM7SUFDbEMsZUFBZSxDQUFTO0lBQzFCLGFBQWEsQ0FBUztJQUNyQixjQUFjLENBQVM7SUFDakMsSUFBSSxDQUFTO0lBQ04sV0FBVyxDQUFTO0lBQ2QsaUJBQWlCLENBQVU7SUFDakMsV0FBVyxDQUFVO0lBQ2xCLGNBQWMsQ0FBUztJQUMzQixVQUFVLENBQVM7SUFDZCxlQUFlLENBQVM7SUFDN0IsVUFBVSxDQUFVO0lBQ3BCLFVBQVUsQ0FBVTtJQUNyQixTQUFTLENBQVU7SUFDcEIsUUFBUSxDQUFTO0lBQ0gsc0JBQXNCLENBQVU7SUFDL0MsT0FBTyxDQUFVO0lBQ2QsVUFBVSxDQUFTO0lBQ3ZCLE1BQU0sQ0FBUztJQUNKLGlCQUFpQixDQUFRO0lBQ3pCLGlCQUFpQixDQUFTO0lBQ25CLHdCQUF3QixDQUFVO0lBQ2xDLHdCQUF3QixDQUFVO0lBSXJFLGFBQWEsQ0FBUztJQUN0QixZQUFZLENBQVM7SUFDckIsMkJBQTJCLEdBQVcsSUFBSSxDQUFDO0lBQzNDLHFCQUFx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QkFBQyxpQkFBaUI7Z0JBQ0gsVUFBVTtzQkFBOUIsS0FBSzt1QkFBQyxZQUFZO2dCQUNFLFVBQVU7c0JBQTlCLEtBQUs7dUJBQUMsWUFBWTtnQkFDQyxTQUFTO3NCQUE1QixLQUFLO3VCQUFDLFdBQVc7Z0JBQ0MsUUFBUTtzQkFBMUIsS0FBSzt1QkFBQyxVQUFVO2dCQUNnQixzQkFBc0I7c0JBQXRELEtBQUs7dUJBQUMsd0JBQXdCO2dCQUNiLE9BQU87c0JBQXhCLEtBQUs7dUJBQUMsU0FBUztnQkFDSyxVQUFVO3NCQUE5QixLQUFLO3VCQUFDLFlBQVk7Z0JBQ0YsTUFBTTtzQkFBdEIsS0FBSzt1QkFBQyxRQUFRO2dCQUNhLGlCQUFpQjtzQkFBNUMsS0FBSzt1QkFBQyxtQkFBbUI7Z0JBQ0UsaUJBQWlCO3NCQUE1QyxLQUFLO3VCQUFDLG1CQUFtQjtnQkFDUyx3QkFBd0I7c0JBQTFELEtBQUs7dUJBQUMsMEJBQTBCO2dCQUNFLHdCQUF3QjtzQkFBMUQsS0FBSzt1QkFBQywwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGZvcndhcmRSZWYsIElucHV0LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtQYXltZW50TGliU2VydmljZX0gZnJvbSAnLi9wYXltZW50LWxpYi5zZXJ2aWNlJztcbmltcG9ydCB7SUJTUGF5bWVudHN9IGZyb20gJy4vaW50ZXJmYWNlcy9JQlNQYXltZW50cyc7XG5pbXBvcnQge09yZGVyc2xpc3RTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzL29yZGVyc2xpc3Quc2VydmljZSc7XG5pbXBvcnQge0lQYXltZW50fSBmcm9tICcuL2ludGVyZmFjZXMvSVBheW1lbnQnO1xuaW1wb3J0IHtJUGF5bWVudEdyb3VwfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0lQYXltZW50R3JvdXBcIjtcbmltcG9ydCB7SVJlZnVuZExpc3R9IGZyb20gXCIuL2ludGVyZmFjZXMvSVJlZnVuZExpc3RcIjtcbmltcG9ydCB7SUZlZX0gZnJvbSBcIi4vaW50ZXJmYWNlcy9JRmVlXCI7XG5pbXBvcnQge0lSZW1pc3Npb259IGZyb20gXCIuL2ludGVyZmFjZXMvSVJlbWlzc2lvblwiO1xuaW1wb3J0IHtBZGRSZXRyb1JlbWlzc2lvblJlcXVlc3R9IGZyb20gXCIuL2ludGVyZmFjZXMvQWRkUmV0cm9SZW1pc3Npb25SZXF1ZXN0XCI7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2NwYXktcGF5bWVudC1saWInLFxuICB0ZW1wbGF0ZTogYFxuICA8Y2NwYXktcmVmdW5kLWxpc3QgW1VTRVJJRF09XCJVU0VSSURcIiBbTE9HR0VESU5VU0VSUk9MRVNdPVwiTE9HR0VESU5VU0VSUk9MRVNcIiBbTE9HR0VESU5VU0VSRU1BSUxdPVwiTE9HR0VESU5VU0VSRU1BSUxcIiAqbmdJZj1cInZpZXdOYW1lID09PSAncmVmdW5kLWxpc3QnXCI+PC9jY3BheS1yZWZ1bmQtbGlzdD5cbiAgICA8Y2NwYXktcGF5bWVudC1saXN0ICpuZ0lmPVwidmlld05hbWUgPT09ICdwYXltZW50LWxpc3QnXCI+PC9jY3BheS1wYXltZW50LWxpc3Q+XG4gICAgPGNjcGF5LXJlZnVuZC1zdGF0dXNcbiAgICBbTE9HR0VESU5VU0VSUk9MRVNdPVwiTE9HR0VESU5VU0VSUk9MRVNcIlxuICAgIFtBUElfUk9PVF09XCJBUElfUk9PVFwiXG4gICAgKm5nSWY9XCJ2aWV3TmFtZSA9PT0gJ3JlZnVuZHN0YXR1c2xpc3QnXCI+IDwvY2NwYXktcmVmdW5kLXN0YXR1cyA+XG4gICAgPGNjcGF5LXBheW1lbnQtdmlldyBbTE9HR0VESU5VU0VSUk9MRVNdPVwiTE9HR0VESU5VU0VSUk9MRVNcIiAqbmdJZj1cInZpZXdOYW1lID09PSAncGF5bWVudC12aWV3J1wiXG4gICAgW2lzVHVybk9mZl09XCJJU1RVUk5PRkZcIiBbaXNUYWtlUGF5bWVudF09XCJUQUtFUEFZTUVOVFwiICBbY2FzZVR5cGVdPVwiQ0FTRVRZUEVcIlxuICAgIFtJU1BBWU1FTlRTVEFUVVNFTkFCTEVEXSA9IFwiSVNQQVlNRU5UU1RBVFVTRU5BQkxFRFwiXG4gICAgPjwvY2NwYXktcGF5bWVudC12aWV3PlxuXG4gICAgPGNjcGF5LXByb2Nlc3MtcmVmdW5kICpuZ0lmPVwidmlld05hbWUgPT09ICdwcm9jZXNzLXJlZnVuZCdcIlxuICAgIFtyZWZ1bmRSZWZlcmVuY2VdPVwicmVmdW5kUmVmZXJlbmNlXCJcbiAgICBbcmVmdW5kbGlzdHNvdXJjZV09XCJyZWZ1bmRsaXN0c291cmNlXCJcbiAgICA+PC9jY3BheS1wcm9jZXNzLXJlZnVuZD5cbiAgICA8Y2NwYXktcGJhLXBheW1lbnQgKm5nSWY9XCJ2aWV3TmFtZSA9PT0gJ3BiYS1wYXltZW50J1wiXG4gICAgW3BiYVBheU9yZGVyUmVmXT1cInBiYVBheU9yZGVyUmVmXCJcbiAgICA+PC9jY3BheS1wYmEtcGF5bWVudD5cbiAgICA8Y2NwYXktY2FzZS10cmFuc2FjdGlvbnMgW2lzVGFrZVBheW1lbnRdPVwiaXNUYWtlUGF5bWVudFwiIFtpc0Zyb21TZXJ2aWNlUmVxdWVzdFBhZ2VdPVwiaXNGcm9tU2VydmljZVJlcXVlc3RQYWdlXCIgW0xPR0dFRElOVVNFUlJPTEVTXT1cIkxPR0dFRElOVVNFUlJPTEVTXCIgKm5nSWY9XCJ2aWV3TmFtZSA9PT0gJ2Nhc2UtdHJhbnNhY3Rpb25zJ1wiPjwvY2NwYXktY2FzZS10cmFuc2FjdGlvbnM+XG4gICAgPGFwcC1tYXJrLXVuaWRlbnRpZmllZC1wYXltZW50ICpuZ0lmPVwidmlld05hbWUgPT09ICd1bmlkZW50aWZpZWRQYWdlJ1wiXG4gICAgW2Nhc2VUeXBlXT1cIkNBU0VUWVBFXCI+PC9hcHAtbWFyay11bmlkZW50aWZpZWQtcGF5bWVudD5cbiAgICA8YXBwLW1hcmstdW5zb2xpY2l0ZWQtcGF5bWVudCAqbmdJZj1cInZpZXdOYW1lID09PSAndW5zb2xpY2l0ZWRQYWdlJ1wiXG4gICAgW2Nhc2VUeXBlXT1cIkNBU0VUWVBFXCI+PC9hcHAtbWFyay11bnNvbGljaXRlZC1wYXltZW50PlxuICAgIDxhcHAtYWxsb2NhdGUtcGF5bWVudHMgKm5nSWY9XCJ2aWV3TmFtZSA9PT0gJ2FsbG9jYXRlLXBheW1lbnRzJ1wiXG4gICAgW2lzVHVybk9mZl09XCJJU1RVUk5PRkZcIlxuICAgIFtjYXNlVHlwZV09XCJDQVNFVFlQRVwiXG4gICAgPjwvYXBwLWFsbG9jYXRlLXBheW1lbnRzPlxuICAgIDxjY3BheS1mZWUtc3VtbWFyeSAqbmdJZj1cInZpZXdOYW1lID09PSAnZmVlLXN1bW1hcnknXCJcbiAgICAgIFtjY2RDYXNlTnVtYmVyXT1cIkNDRF9DQVNFX05VTUJFUlwiXG4gICAgICBbcGF5bWVudEdyb3VwUmVmXT1cInBheW1lbnRHcm91cFJlZmVyZW5jZVwiXG4gICAgICBbaXNUdXJuT2ZmXT1cIklTVFVSTk9GRlwiXG4gICAgICBbY2FzZVR5cGVdPVwiQ0FTRVRZUEVcIlxuICAgICAgW3RlbGVwaG9ueVNlbGVjdGlvbkVuYWJsZV0gPVwidGVsZXBob255U2VsZWN0aW9uRW5hYmxlXCJcbiAgICAgID48L2NjcGF5LWZlZS1zdW1tYXJ5PlxuICAgIDxjY3BheS1yZXBvcnRzICpuZ0lmPVwidmlld05hbWUgPT09ICdyZXBvcnRzJ1wiXG4gICAgW0lTUEFZTUVOVFNUQVRVU0VOQUJMRURdID0gXCJJU1BBWU1FTlRTVEFUVVNFTkFCTEVEXCJcbiAgICA+PC9jY3BheS1yZXBvcnRzPlxuICAgIGAsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogJ1BBWU1FTlRfTElCJywgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUGF5bWVudExpYkNvbXBvbmVudCkgfV1cbn0pXG5cbmV4cG9ydCBjbGFzcyBQYXltZW50TGliQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCdBUElfUk9PVCcpIEFQSV9ST09UOiBzdHJpbmc7XG4gIEBJbnB1dCgnQlVMS1NDQU5fQVBJX1JPT1QnKSBCVUxLU0NBTl9BUElfUk9PVDogc3RyaW5nO1xuICBASW5wdXQoJ1JFRlVORFNfQVBJX1JPT1QnKSBSRUZVTkRTX0FQSV9ST09UOiBzdHJpbmc7XG4gIEBJbnB1dCgnTk9USUZJQ0FUSU9OX0FQSV9ST09UJykgTk9USUZJQ0FUSU9OX0FQSV9ST09UOiBzdHJpbmc7XG4gIEBJbnB1dCgnQ0FSRFBBWU1FTlRSRVRVUk5VUkwnKSBDQVJEUEFZTUVOVFJFVFVSTlVSTDogc3RyaW5nO1xuICBASW5wdXQoJ0NDRF9DQVNFX05VTUJFUicpIENDRF9DQVNFX05VTUJFUjogc3RyaW5nO1xuICBASW5wdXQoJ0VYQ19SRUZFUkVOQ0UnKSBFWENfUkVGRVJFTkNFOiBzdHJpbmc7XG4gIEBJbnB1dCgnUEFZTUVOVF9NRVRIT0QnKSBQQVlNRU5UX01FVEhPRDogc3RyaW5nO1xuICBASW5wdXQoJ1ZJRVcnKSBWSUVXOiBzdHJpbmc7XG4gIEBJbnB1dCgnVklFV1NFUlZJQ0UnKSBWSUVXU0VSVklDRTogc3RyaW5nO1xuICBASW5wdXQoJ1BBWU1FTlRfR1JPVVBfUkVGJykgUEFZTUVOVF9HUk9VUF9SRUY/OiBzdHJpbmc7XG4gIEBJbnB1dCgnVEFLRVBBWU1FTlQnKSBUQUtFUEFZTUVOVDogYm9vbGVhbjtcbiAgQElucHV0KCdTRVJWSUNFUkVRVUVTVCcpIFNFUlZJQ0VSRVFVRVNUOiBzdHJpbmc7XG4gIEBJbnB1dCgnRENOX05VTUJFUicpIERDTl9OVU1CRVI6IHN0cmluZztcbiAgQElucHV0KCdTRUxFQ1RFRF9PUFRJT04nKSBTRUxFQ1RFRF9PUFRJT046IHN0cmluZztcbiAgQElucHV0KCdJU0JTRU5BQkxFJykgSVNCU0VOQUJMRTogQm9vbGVhbjtcbiAgQElucHV0KCdJU1NGRU5BQkxFJykgSVNTRkVOQUJMRTogYm9vbGVhbjtcbiAgQElucHV0KCdJU1RVUk5PRkYnKSBJU1RVUk5PRkY6IGJvb2xlYW47XG4gIEBJbnB1dCgnQ0FTRVRZUEUnKSBDQVNFVFlQRTogc3RyaW5nO1xuICBASW5wdXQoJ0lTUEFZTUVOVFNUQVRVU0VOQUJMRUQnKSBJU1BBWU1FTlRTVEFUVVNFTkFCTEVEOiBib29sZWFuO1xuICBASW5wdXQoJ3Jvb3RVcmwnKSByb290VXJsOiBib29sZWFuO1xuICBASW5wdXQoJ1JFRlVORExJU1QnKSBSRUZVTkRMSVNUOiBzdHJpbmc7XG4gIEBJbnB1dCgnVVNFUklEJykgVVNFUklEOiBzdHJpbmc7XG4gIEBJbnB1dCgnTE9HR0VESU5VU0VSUk9MRVMnKSBMT0dHRURJTlVTRVJST0xFUzogYW55W107XG4gIEBJbnB1dCgnTE9HR0VESU5VU0VSRU1BSUwnKSBMT0dHRURJTlVTRVJFTUFJTDogc3RyaW5nO1xuICBASW5wdXQoJ2lzRnJvbVNlcnZpY2VSZXF1ZXN0UGFnZScpIGlzRnJvbVNlcnZpY2VSZXF1ZXN0UGFnZTogYm9vbGVhbjtcbiAgQElucHV0KCd0ZWxlcGhvbnlTZWxlY3Rpb25FbmFibGUnKSB0ZWxlcGhvbnlTZWxlY3Rpb25FbmFibGU6IGJvb2xlYW47XG5cblxuXG4gIHBheW1lbnRNZXRob2Q6IHN0cmluZztcbiAgYnNwYXltZW50ZGNuOiBzdHJpbmc7XG4gIHVuUHJvY2Vzc2VkUGF5bWVudFNlcnZpY2VJZDogc3RyaW5nID0gbnVsbDtcbiAgcGF5bWVudEdyb3VwUmVmZXJlbmNlOiBzdHJpbmc7XG4gIHBheW1lbnRSZWZlcmVuY2U6IHN0cmluZztcbiAgcmVmdW5kUmVmZXJlbmNlOiBzdHJpbmc7XG4gIGlzRnJvbVBheUJ1YmJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICByZWZ1bmRsaXN0c291cmNlOiBhbnk7XG4gIHZpZXdOYW1lOiBzdHJpbmc7XG4gIGlzVHVybk9mZjogYm9vbGVhbjtcbiAgY2FzZVR5cGU6IHN0cmluZztcbiAgdW5Qcm9jZXNzZWRQYXltZW50OiBJQlNQYXltZW50cyA9IG51bGw7XG4gIGlzUmVmdW5kU3RhdHVzVmlldzogYm9vbGVhbjtcbiAgaXNSZWRpcmVjdEZyb21DYXNlVHJhbnNhY3Rpb25QYWdlOiBzdHJpbmc7XG4gIGlzQ2FsbEZyb21SZWZ1bmRMaXN0OiBib29sZWFuO1xuICBpc0Zyb21SZWZ1bmRTdGF0dXNQYWdlOiBib29sZWFuO1xuICBpc2NhbmNlbENsaWNrZWQ6IGJvb2xlYW47XG4gIGlzRnJvbVBheW1lbnREZXRhaWxQYWdlOiBib29sZWFuO1xuICBwYmFQYXlPcmRlclJlZjogSVBheW1lbnQ7XG4gIGlzVGFrZVBheW1lbnQ6IGJvb2xlYW47XG5cbiAgb3JkZXJEZXRhaWw6IGFueVtdO1xuICBvcmRlclJlZjogc3RyaW5nO1xuICBvcmRlclN0YXR1czogc3RyaW5nO1xuICBvcmRlclBhcnR5OiBzdHJpbmc7XG4gIG9yZGVyQ3JlYXRlZDogRGF0ZTtcbiAgb3JkZXJDQ0RFdmVudDogc3RyaW5nO1xuICBzZXJ2aWNlUmVxdWVzdFZhbHVlOiBzdHJpbmc7XG4gIG9yZGVyQWRkQnRuRW5hYmxlOiBib29sZWFuO1xuICBvcmRlckZlZXNUb3RhbDogbnVtYmVyID0gMC4wMDtcbiAgb3JkZXJSZW1pc3Npb25Ub3RhbDogbnVtYmVyID0gMC4wMDtcbiAgb3JkZXJUb3RhbFBheW1lbnRzOiBudW1iZXIgPSAwLjAwO1xuICBvcmRlclBlbmRpbmdQYXltZW50czogbnVtYmVyID0gMC4wMDtcblxuICBwYXltZW50R3JvdXA6SVBheW1lbnRHcm91cFxuICBvdmVyUGF5bWVudEFtb3VudDogbnVtYmVyID0gMC4wMDtcbiAgcmVmdW5kczogSVJlZnVuZExpc3RbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBheW1lbnRMaWJTZXJ2aWNlOiBQYXltZW50TGliU2VydmljZSxcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIE9yZGVyc2xpc3RTZXJ2aWNlOiBPcmRlcnNsaXN0U2VydmljZSkgeyB9XG4gIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICB0aGlzLnBheW1lbnRMaWJTZXJ2aWNlLnNldEFwaVJvb3RVcmwodGhpcy5BUElfUk9PVCk7XG4gICAgdGhpcy5wYXltZW50TGliU2VydmljZS5zZXRCdWxrU2NhbkFwaVJvb3RVcmwodGhpcy5CVUxLU0NBTl9BUElfUk9PVCk7XG4gICAgdGhpcy5wYXltZW50TGliU2VydmljZS5zZXRSZWZ1bmRuZHNBcGlSb290VXJsKHRoaXMuUkVGVU5EU19BUElfUk9PVCk7XG4gICAgdGhpcy5wYXltZW50TGliU2VydmljZS5zZXROb3RpY2F0aW9uQXBpUm9vdFVybCh0aGlzLk5PVElGSUNBVElPTl9BUElfUk9PVCk7XG4gICAgdGhpcy5wYXltZW50TGliU2VydmljZS5zZXRDYXJkUGF5bWVudFJldHVyblVybCh0aGlzLkNBUkRQQVlNRU5UUkVUVVJOVVJMKTtcblxuICAgIGlmICh0aGlzLkxPR0dFRElOVVNFUlJPTEVTLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2Uuc2V0VXNlclJvbGVzTGlzdCh0aGlzLkxPR0dFRElOVVNFUlJPTEVTKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuUEFZTUVOVF9HUk9VUF9SRUYpIHtcbiAgICAgIHRoaXMucGF5bWVudEdyb3VwUmVmZXJlbmNlID0gdGhpcy5QQVlNRU5UX0dST1VQX1JFRjtcbiAgICB9XG4gICAgaWYgKHRoaXMuRENOX05VTUJFUikge1xuICAgICAgdGhpcy5ic3BheW1lbnRkY24gPSB0aGlzLkRDTl9OVU1CRVI7XG4gICAgfVxuICAgIGlmICh0aGlzLlJFRlVORExJU1QgPT09IFwidHJ1ZVwiKSB7XG4gICAgICB0aGlzLlZJRVcgPSAncmVmdW5kLWxpc3QnO1xuICAgICAgdGhpcy52aWV3TmFtZSA9IHRoaXMuVklFVztcbiAgICB9XG4gICAgaWYgKHRoaXMuVklFVyA9PT0gJ2ZlZS1zdW1tYXJ5Jykge1xuICAgICAgdGhpcy52aWV3TmFtZSA9ICdmZWUtc3VtbWFyeSc7XG4gICAgfSBlbHNlIGlmICh0aGlzLlZJRVcgIT09ICdyZXBvcnRzJyAmJiB0aGlzLlZJRVcgIT09ICdyZWZ1bmQtbGlzdCcpIHtcbiAgICAgIHRoaXMudmlld05hbWUgPSAnY2FzZS10cmFuc2FjdGlvbnMnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZpZXdOYW1lID0gdGhpcy5WSUVXO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzVGFrZVBheW1lbnQpIHtcbiAgICAgIHRoaXMuVEFLRVBBWU1FTlQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5BUElfUk9PVCA9PSAnYXBpL3BheW1lbnQtaGlzdG9yeScpIHtcbiAgICAgIHRoaXMuaXNGcm9tUGF5QnViYmxlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVtaXNzaW9uIHRvIHRoZSBwYXltZW50IGdyb3VwIHVzaW5nIGRhdGEgZnJvbSB0aGUgcHJvdmlkZWQgZm9ybSBncm91cC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSBgcGF5bWVudEdyb3VwYCBpcyBub3QgbnVsbCBiZWZvcmUgYXR0ZW1wdGluZyB0byBhZGQgdGhlIHJlbWlzc2lvbi5cbiAgICogSWYgdGhlIGBwYXltZW50R3JvdXBgIGV4aXN0cywgYSBuZXcgcmVtaXNzaW9uIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIHZhbHVlcyBmcm9tIHRoZSBwcm92aWRlZFxuICAgKiBmb3JtIGdyb3VwIChgY3VycmVudFJlbWlzc2lvbkZvcm1Hcm91cGApLCBhbmQgaXQgaXMgcHVzaGVkIGludG8gdGhlIGByZW1pc3Npb25zYCBhcnJheSBvZiB0aGUgcGF5bWVudCBncm91cC5cbiAgICpcbiAgICogQHBhcmFtIHtBZGRSZXRyb1JlbWlzc2lvblJlcXVlc3R9IGN1cnJlbnRSZW1pc3Npb25Gb3JtR3JvdXAgLSBUaGUgZm9ybSBncm91cCBjb250YWluaW5nIHJlbWlzc2lvbiBkYXRhXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4sIGBod2ZfYW1vdW50YCwgYGh3Zl9yZWZlcmVuY2VgKS5cbiAgICovXG4gIGFkZFJlbWlzc2lvbihjdXJyZW50UmVtaXNzaW9uRm9ybUdyb3VwOiBBZGRSZXRyb1JlbWlzc2lvblJlcXVlc3QpIHtcblxuICAgIGlmICh0aGlzLnBheW1lbnRHcm91cCAhPSBudWxsKSB7XG5cbiAgICAgIGNvbnN0IHJlbWlzc2lvbjogSVJlbWlzc2lvbiA9IHtcblxuICAgICAgICByZW1pc3Npb25fcmVmZXJlbmNlOiBudWxsLFxuICAgICAgICBod2ZfcmVmZXJlbmNlOiBjdXJyZW50UmVtaXNzaW9uRm9ybUdyb3VwLmh3Zl9yZWZlcmVuY2UsXG4gICAgICAgIGh3Zl9hbW91bnQ6IGN1cnJlbnRSZW1pc3Npb25Gb3JtR3JvdXAuaHdmX2Ftb3VudCxcbiAgICAgICAgYmVuZWZpY2lhcnlfbmFtZTogbnVsbCxcbiAgICAgICAgY2NkX2Nhc2VfbnVtYmVyOiBudWxsLFxuICAgICAgICBmZWVfY29kZTogbnVsbCxcbiAgICAgICAgZGF0ZV9jcmVhdGVkOiBudWxsLFxuICAgICAgICBmZWVfaWQ6IG51bGwsXG4gICAgICAgIGlzc3VlX3JlZnVuZF9hZGRfcmVmdW5kX2FkZF9yZW1pc3Npb246IGZhbHNlLFxuICAgICAgICBhZGRfcmVmdW5kOiBmYWxzZSxcbiAgICAgICAgb3ZlcmFsbF9iYWxhbmNlOmN1cnJlbnRSZW1pc3Npb25Gb3JtR3JvdXAuaHdmX2Ftb3VudCxcbiAgICAgICAgYWNvbGxlY3Rpb25fb2ZfZmVzczogdHJ1ZVxuICAgICAgfTtcbiAgICAgIHRoaXMucGF5bWVudEdyb3VwLnJlbWlzc2lvbnMucHVzaChyZW1pc3Npb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCB0aGUgcGF5bWVudEdyb3VwIGZvciB0aGUgYWRkIHJlbWlzc2lvbiBqb3VybmV5LlxuICAgKiBAcGFyYW0gdXBkYXRlZFBheW1lbnRHcm91cCB0aGlzIGlzIGFuIHVwZGF0ZWQgcGF5bWVudEdyb3VwIHZlcnNpb24uXG4gICAqL1xuICBhZGRQYXltZW50R3JvdXAodXBkYXRlZFBheW1lbnRHcm91cDpJUGF5bWVudEdyb3VwKXtcbiAgICBpZiAodGhpcy5wYXltZW50R3JvdXAgPT0gbnVsbCl7XG4gICAgICAgIHRoaXMucGF5bWVudEdyb3VwID0gdXBkYXRlZFBheW1lbnRHcm91cDtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSB0b3RhbCByZW1pc3Npb24gYW1vdW50IGZvciB0aGUgY3VycmVudCBwYXltZW50IGdyb3VwLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHBheW1lbnQgZ3JvdXAgY29udGFpbnMgYW55IHJlbWlzc2lvbnMgYW5kLCBpZiBzbyxcbiAgICogc3VtcyB1cCB0aGUgYGh3Zl9hbW91bnRgIG9mIGFsbCByZW1pc3Npb25zIHVzaW5nIHRoZSBgcmVkdWNlKClgIG1ldGhvZC5cbiAgICogSWYgbm8gcmVtaXNzaW9ucyBhcmUgZm91bmQsIGl0IHJldHVybnMgYSBkZWZhdWx0IHZhbHVlIG9mIDAuXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB0b3RhbCByZW1pc3Npb24gYW1vdW50LCBvciAwIGlmIG5vIHJlbWlzc2lvbnMgYXJlIHByZXNlbnQuXG4gICAqL1xuXG4gIGdldFRvdGFsUmVtaXNzaW9uKCk6IG51bWJlciB7XG4gICAgbGV0IHJlbWlzc2lvblRvdGFsID0gMDtcbiAgICBpZiAodGhpcy5wYXltZW50R3JvdXAucmVtaXNzaW9ucykge1xuICAgICAgcmVtaXNzaW9uVG90YWwgPSB0aGlzLnBheW1lbnRHcm91cC5yZW1pc3Npb25zLnJlZHVjZSgodG90YWxSZW1pc3Npb24sIHJlbWlzc2lvbikgPT4gdG90YWxSZW1pc3Npb24gKyByZW1pc3Npb24uaHdmX2Ftb3VudCwgMCk7XG4gICAgfVxuICAgIHJldHVybiByZW1pc3Npb25Ub3RhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSB0b3RhbCBmZWUgYW1vdW50IGZvciB0aGUgY3VycmVudCBwYXltZW50IGdyb3VwLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHBheW1lbnQgZ3JvdXAgY29udGFpbnMgYW55IGZlZXMgYW5kLCBpZiBzbyxcbiAgICogc3VtcyB1cCB0aGUgYGNhbGN1bGF0ZWRfYW1vdW50YCBvZiBhbGwgZmVlcyB1c2luZyB0aGUgYHJlZHVjZSgpYCBtZXRob2QuXG4gICAqIElmIG5vIGZlZXMgYXJlIGZvdW5kLCBpdCByZXR1cm5zIGEgZGVmYXVsdCB2YWx1ZSBvZiAwLlxuICAgKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgdG90YWwgZmVlIGFtb3VudCwgb3IgMCBpZiBubyBmZWVzIGFyZSBwcmVzZW50LlxuICAgKi9cbiAgZ2V0VG90YWxGZWVzKCk6IG51bWJlciB7XG4gICAgbGV0IGZlZXNUb3RhbCA9IDA7XG4gICAgaWYgKHRoaXMucGF5bWVudEdyb3VwLmZlZXMpIHtcbiAgICAgIGZlZXNUb3RhbCA9IHRoaXMucGF5bWVudEdyb3VwLmZlZXMucmVkdWNlKCh0b3RhbEZlZXMsIGZlZSkgPT4gdG90YWxGZWVzICsgZmVlLmNhbGN1bGF0ZWRfYW1vdW50LCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGZlZXNUb3RhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSB0b3RhbCBwYXltZW50IGFtb3VudCBmb3IgdGhlIGN1cnJlbnQgcGF5bWVudCBncm91cC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSBwYXltZW50IGdyb3VwIGNvbnRhaW5zIGFueSBwYXltZW50cyBhbmQsIGlmIHNvLFxuICAgKiBzdW1zIHVwIHRoZSBgYW1vdW50YCBvZiBhbGwgcGF5bWVudHMgdXNpbmcgdGhlIGByZWR1Y2UoKWAgbWV0aG9kLlxuICAgKiBJZiBubyBwYXltZW50cyBhcmUgZm91bmQsIGl0IHJldHVybnMgYSBkZWZhdWx0IHZhbHVlIG9mIDAuXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB0b3RhbCBwYXltZW50IGFtb3VudCwgb3IgMCBpZiBubyBwYXltZW50cyBhcmUgcHJlc2VudC5cbiAgICovXG4gIGdldFRvdGFsUGF5bWVudHMoKTogbnVtYmVyIHtcbiAgICBsZXQgcGF5bWVudHNUb3RhbCA9IDA7XG4gICAgaWYgKHRoaXMucGF5bWVudEdyb3VwLnBheW1lbnRzKSB7XG4gICAgICBwYXltZW50c1RvdGFsID0gdGhpcy5wYXltZW50R3JvdXAucGF5bWVudHMucmVkdWNlKCh0b3RhbEZlZXMsIHBheW1lbnQpID0+IHRvdGFsRmVlcyArIHBheW1lbnQuYW1vdW50LCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIHBheW1lbnRzVG90YWw7XG4gIH1cblxuXG4gIC8vIFJlZnVuZHMgbGlicyBzZWN0aW9uLlxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZmluZCBvdXQgaWYgdGhlIGN1cnJlbnQgcmVmdW5kcyBsaXN0IGFyZSBpbiBwcm9ncmVzcyBmb3IgdGhlIGZlZSBwYXNzZWQgYXMgcGFyYW1ldGVyXG4gICAqIEBwYXJhbSBmZWUgdGhpcyBpcyB0aGUgZmVlIHVzZWQgdG8gZmluZCBvdXQgaWYgdGhlIHJlZnVuZHMgYXJlIGluIHByb2dyZXNzLlxuICAgKi9cbiAgaXNUaGVDdXJyZW50UmVmdW5kSW5Qcm9jZXNzRm9yVGhpc0ZlZShmZWU6IElGZWUpOiBib29sZWFue1xuICAgIC8vIE5vIHJlZnVuZHNcbiAgICBpZiAodGhpcy5yZWZ1bmRzID09IG51bGwgfHwgdGhpcy5yZWZ1bmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gIXRoaXMuaXNUaGVDdXJyZW50UmVmdW5kUmVqZWN0ZWRGb3JUaGVGZWUoZmVlLmlkLnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBmaW5kIG91dCBpZiBpbiBjdXJyZW50IGxpc3Qgb2YgcmVmdW5kcyBhbGwgcmVmdW5kcyBoYXMgYmVlbiByZWplY3RlZFxuICAgKiBmb3IgdGhlIGZlZSBwYXNzZWQgYXMgcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0gZmVlQ29kZSB0aGlzIGlzIHRoZSBmZWUgY29kZSB1c2VkIHRvIGZpbmQgb3V0IGFsbCByZWZ1bmRzIHJlamVjdGVkIHJlZnVuZHMuXG4gICAqL1xuICBpc1RoZUN1cnJlbnRSZWZ1bmRSZWplY3RlZEZvclRoZUZlZShmZWVDb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgIGxldCByZWZ1bmRzQnlGZWUgPSB0aGlzLnJlZnVuZHMuZmlsdGVyKHJlZnVuZCA9PiByZWZ1bmQuZmVlX2lkcyA9PT0gZmVlQ29kZSk7XG4gICAgbGV0IHJlZnVuZHNCeUZlZUFuZFJlamVjdGVkID0gdGhpcy5yZWZ1bmRzLmZpbHRlcihyZWZ1bmQgPT4gcmVmdW5kLnJlZnVuZF9zdGF0dXMubmFtZSA9PT0gJ1JlamVjdGVkJyk7XG5cbiAgICAvLyBSZWZ1bmRzID4gMCAgYW5kIG92ZXJQYXltZW50IC0tPiByZWZ1bmRzIGluIHByb2Nlc3Mgb3IgUmVqZWN0ZWQuXG4gICAgaWYgKHJlZnVuZHNCeUZlZS5sZW5ndGggPT09IHJlZnVuZHNCeUZlZUFuZFJlamVjdGVkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJvdW5kcyB2ZXJ5IHNtYWxsIHZhbHVlcyB0byB6ZXJvIGlmIHRoZXkgZmFsbCBiZWxvdyBhIHNwZWNpZmllZCB0aHJlc2hvbGQuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBlbGltaW5hdGluZyBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24gZXJyb3JzIHRoYXQgcmVzdWx0IGluXG4gICAqIGV4dHJlbWVseSBzbWFsbCBub24temVybyB2YWx1ZXMgKGUuZy4sIDEuMTM2ODY4Mzc3MjE2MTYwM2UtMTMpIHdoaWNoIHNob3VsZFxuICAgKiBsb2dpY2FsbHkgYmUgdHJlYXRlZCBhcyB6ZXJvLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbnVtZXJpYyB2YWx1ZSB0byBldmFsdWF0ZSBhbmQgcG90ZW50aWFsbHkgcm91bmQuXG4gICAqIEBwYXJhbSB0aHJlc2hvbGQgLSBUaGUgbWluaW11bSBhYnNvbHV0ZSB2YWx1ZSBjb25zaWRlcmVkIHNpZ25pZmljYW50LiBEZWZhdWx0cyB0byAxZS0xMC5cbiAgICogQHJldHVybnMgVGhlIG9yaWdpbmFsIHZhbHVlIGlmIGl0J3MgYWJvdmUgdGhlIHRocmVzaG9sZCwgb3IgMCBpZiBpdCdzIGJlbG93LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiByb3VuZFRpbnlWYWx1ZSgxLjEzNjg2ODM3NzIxNjE2MDNlLTEzKTsgLy8gcmV0dXJucyAwXG4gICAqIHJvdW5kVGlueVZhbHVlKDAuMDAwMDEpOyAvLyByZXR1cm5zIDAuMDAwMDFcbiAgICovXG4gIHJvdW5kVGlueVZhbHVlKHZhbHVlOiBudW1iZXIsIHRocmVzaG9sZDogbnVtYmVyID0gMWUtNCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguYWJzKHZhbHVlKSA8IHRocmVzaG9sZCA/IDAgOiB2YWx1ZTtcbiAgfVxuXG5cbiAgZ2V0Um91bmRlZE92ZXJQYXltZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucm91bmRUaW55VmFsdWUodGhpcy5vdmVyUGF5bWVudEFtb3VudCk7XG4gIH1cbn1cblxuXG5cbiJdfQ==
|