israeli-bank-scrapers 6.1.1 → 6.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.
- package/lib/assertNever.js +7 -5
- package/lib/constants.js +16 -13
- package/lib/definitions.js +113 -109
- package/lib/helpers/browser.js +13 -9
- package/lib/helpers/dates.js +19 -18
- package/lib/helpers/debug.js +9 -9
- package/lib/helpers/elements-interactions.js +82 -78
- package/lib/helpers/fetch.js +85 -82
- package/lib/helpers/navigation.js +28 -24
- package/lib/helpers/storage.js +11 -10
- package/lib/helpers/transactions.js +32 -33
- package/lib/helpers/waiting.js +42 -45
- package/lib/index.js +82 -15
- package/lib/scrapers/amex.js +13 -11
- package/lib/scrapers/amex.test.d.ts +1 -0
- package/lib/scrapers/amex.test.js +49 -0
- package/lib/scrapers/base-beinleumi-group.js +239 -233
- package/lib/scrapers/base-isracard-amex.js +273 -273
- package/lib/scrapers/base-scraper-with-browser.js +263 -241
- package/lib/scrapers/base-scraper-with-browser.test.d.ts +1 -0
- package/lib/scrapers/base-scraper-with-browser.test.js +53 -0
- package/lib/scrapers/base-scraper.js +82 -82
- package/lib/scrapers/behatsdaa.js +103 -98
- package/lib/scrapers/behatsdaa.test.d.ts +1 -0
- package/lib/scrapers/behatsdaa.test.js +46 -0
- package/lib/scrapers/beinleumi.js +13 -11
- package/lib/scrapers/beinleumi.test.d.ts +1 -0
- package/lib/scrapers/beinleumi.test.js +47 -0
- package/lib/scrapers/beyahad-bishvilha.js +132 -132
- package/lib/scrapers/beyahad-bishvilha.test.d.ts +1 -0
- package/lib/scrapers/beyahad-bishvilha.test.js +47 -0
- package/lib/scrapers/discount.js +101 -97
- package/lib/scrapers/discount.test.d.ts +1 -0
- package/lib/scrapers/discount.test.js +49 -0
- package/lib/scrapers/errors.js +25 -22
- package/lib/scrapers/factory.js +67 -66
- package/lib/scrapers/factory.test.d.ts +1 -0
- package/lib/scrapers/factory.test.js +19 -0
- package/lib/scrapers/hapoalim.js +175 -162
- package/lib/scrapers/hapoalim.test.d.ts +1 -0
- package/lib/scrapers/hapoalim.test.js +47 -0
- package/lib/scrapers/interface.js +5 -2
- package/lib/scrapers/isracard.js +13 -11
- package/lib/scrapers/isracard.test.d.ts +1 -0
- package/lib/scrapers/isracard.test.js +49 -0
- package/lib/scrapers/leumi.js +170 -167
- package/lib/scrapers/leumi.test.d.ts +1 -0
- package/lib/scrapers/leumi.test.js +47 -0
- package/lib/scrapers/massad.js +13 -11
- package/lib/scrapers/max.js +261 -261
- package/lib/scrapers/max.test.d.ts +1 -0
- package/lib/scrapers/max.test.js +65 -0
- package/lib/scrapers/mercantile.js +16 -14
- package/lib/scrapers/mercantile.test.d.ts +1 -0
- package/lib/scrapers/mercantile.test.js +45 -0
- package/lib/scrapers/mizrahi.js +154 -158
- package/lib/scrapers/mizrahi.test.d.ts +1 -0
- package/lib/scrapers/mizrahi.test.js +53 -0
- package/lib/scrapers/one-zero-queries.js +7 -4
- package/lib/scrapers/one-zero.js +221 -176
- package/lib/scrapers/one-zero.test.d.ts +1 -0
- package/lib/scrapers/one-zero.test.js +51 -0
- package/lib/scrapers/otsar-hahayal.js +13 -11
- package/lib/scrapers/otsar-hahayal.test.d.ts +1 -0
- package/lib/scrapers/otsar-hahayal.test.js +47 -0
- package/lib/scrapers/pagi.js +13 -11
- package/lib/scrapers/pagi.test.d.ts +1 -0
- package/lib/scrapers/pagi.test.js +47 -0
- package/lib/scrapers/union-bank.js +173 -172
- package/lib/scrapers/union-bank.test.d.ts +1 -0
- package/lib/scrapers/union-bank.test.js +47 -0
- package/lib/scrapers/visa-cal.js +250 -254
- package/lib/scrapers/visa-cal.test.d.ts +1 -0
- package/lib/scrapers/visa-cal.test.js +49 -0
- package/lib/scrapers/yahav.js +206 -190
- package/lib/scrapers/yahav.test.d.ts +1 -0
- package/lib/scrapers/yahav.test.js +49 -0
- package/lib/transactions.js +16 -13
- package/package.json +8 -3
package/lib/scrapers/max.js
CHANGED
|
@@ -1,299 +1,299 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
exports.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
exports.getMemo = getMemo;
|
|
8
|
+
var _buildUrl = _interopRequireDefault(require("build-url"));
|
|
9
|
+
var _moment = _interopRequireDefault(require("moment"));
|
|
10
|
+
var _constants = require("../constants");
|
|
11
|
+
var _dates = _interopRequireDefault(require("../helpers/dates"));
|
|
12
|
+
var _debug = require("../helpers/debug");
|
|
13
|
+
var _elementsInteractions = require("../helpers/elements-interactions");
|
|
14
|
+
var _fetch = require("../helpers/fetch");
|
|
15
|
+
var _navigation = require("../helpers/navigation");
|
|
16
|
+
var _transactions = require("../helpers/transactions");
|
|
17
|
+
var _transactions2 = require("../transactions");
|
|
18
|
+
var _baseScraperWithBrowser = require("./base-scraper-with-browser");
|
|
19
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
20
|
+
const debug = (0, _debug.getDebug)('max');
|
|
19
21
|
const BASE_API_ACTIONS_URL = 'https://onlinelcapi.max.co.il';
|
|
20
22
|
const BASE_WELCOME_URL = 'https://www.max.co.il';
|
|
21
23
|
const LOGIN_URL = `${BASE_WELCOME_URL}/homepage/welcome`;
|
|
22
24
|
const PASSWORD_EXPIRED_URL = `${BASE_WELCOME_URL}/renew-password`;
|
|
23
25
|
const SUCCESS_URL = `${BASE_WELCOME_URL}/homepage/personal`;
|
|
24
|
-
var MaxPlanName
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
26
|
+
var MaxPlanName = /*#__PURE__*/function (MaxPlanName) {
|
|
27
|
+
MaxPlanName["Normal"] = "\u05E8\u05D2\u05D9\u05DC\u05D4";
|
|
28
|
+
MaxPlanName["ImmediateCharge"] = "\u05D7\u05D9\u05D5\u05D1 \u05E2\u05E1\u05E7\u05D5\u05EA \u05DE\u05D9\u05D9\u05D3\u05D9";
|
|
29
|
+
MaxPlanName["InternetShopping"] = "\u05D0\u05D9\u05E0\u05D8\u05E8\u05E0\u05D8/\u05D7\u05D5\"\u05DC";
|
|
30
|
+
MaxPlanName["Installments"] = "\u05EA\u05E9\u05DC\u05D5\u05DE\u05D9\u05DD";
|
|
31
|
+
MaxPlanName["MonthlyCharge"] = "\u05D7\u05D9\u05D5\u05D1 \u05D7\u05D5\u05D3\u05E9\u05D9";
|
|
32
|
+
MaxPlanName["OneMonthPostponed"] = "\u05D3\u05D7\u05D5\u05D9 \u05D7\u05D5\u05D3\u05E9";
|
|
33
|
+
MaxPlanName["MonthlyPostponed"] = "\u05D3\u05D7\u05D5\u05D9 \u05DC\u05D7\u05D9\u05D5\u05D1 \u05D4\u05D7\u05D5\u05D3\u05E9\u05D9";
|
|
34
|
+
MaxPlanName["MonthlyPayment"] = "\u05EA\u05E9\u05DC\u05D5\u05DD \u05D7\u05D5\u05D3\u05E9\u05D9";
|
|
35
|
+
MaxPlanName["FuturePurchaseFinancing"] = "\u05DE\u05D9\u05DE\u05D5\u05DF \u05DC\u05E8\u05DB\u05D9\u05E9\u05D4 \u05E2\u05EA\u05D9\u05D3\u05D9\u05EA";
|
|
36
|
+
MaxPlanName["MonthlyPostponedInstallments"] = "\u05D3\u05D7\u05D5\u05D9 \u05D7\u05D5\u05D3\u05E9 \u05EA\u05E9\u05DC\u05D5\u05DE\u05D9\u05DD";
|
|
37
|
+
MaxPlanName["ThirtyDaysPlus"] = "\u05E2\u05E1\u05E7\u05EA 30 \u05E4\u05DC\u05D5\u05E1";
|
|
38
|
+
MaxPlanName["TwoMonthsPostponed"] = "\u05D3\u05D7\u05D5\u05D9 \u05D7\u05D5\u05D3\u05E9\u05D9\u05D9\u05DD";
|
|
39
|
+
MaxPlanName["TwoMonthsPostponed2"] = "\u05D3\u05D7\u05D5\u05D9 2 \u05D7' \u05EA\u05E9\u05DC\u05D5\u05DE\u05D9\u05DD";
|
|
40
|
+
MaxPlanName["MonthlyChargePlusInterest"] = "\u05D7\u05D5\u05D3\u05E9\u05D9 + \u05E8\u05D9\u05D1\u05D9\u05EA";
|
|
41
|
+
MaxPlanName["Credit"] = "\u05E7\u05E8\u05D3\u05D9\u05D8";
|
|
42
|
+
MaxPlanName["CreditOutsideTheLimit"] = "\u05E7\u05E8\u05D3\u05D9\u05D8-\u05DE\u05D7\u05D5\u05E5 \u05DC\u05DE\u05E1\u05D2\u05E8\u05EA";
|
|
43
|
+
MaxPlanName["AccumulatingBasket"] = "\u05E1\u05DC \u05DE\u05E6\u05D8\u05D1\u05E8";
|
|
44
|
+
MaxPlanName["PostponedTransactionInstallments"] = "\u05E4\u05E8\u05D9\u05E1\u05EA \u05D4\u05E2\u05E1\u05E7\u05D4 \u05D4\u05D3\u05D7\u05D5\u05D9\u05D4";
|
|
45
|
+
MaxPlanName["ReplacementCard"] = "\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D7\u05DC\u05D9\u05E4\u05D9";
|
|
46
|
+
MaxPlanName["EarlyRepayment"] = "\u05E4\u05E8\u05E2\u05D5\u05DF \u05DE\u05D5\u05E7\u05D3\u05DD";
|
|
47
|
+
MaxPlanName["MonthlyCardFee"] = "\u05D3\u05DE\u05D9 \u05DB\u05E8\u05D8\u05D9\u05E1";
|
|
48
|
+
MaxPlanName["CurrencyPocket"] = "\u05D7\u05D9\u05D5\u05D1 \u05D0\u05E8\u05E0\u05E7 \u05DE\u05D8\u05D7";
|
|
49
|
+
return MaxPlanName;
|
|
50
|
+
}(MaxPlanName || {});
|
|
49
51
|
const INVALID_DETAILS_SELECTOR = '#popupWrongDetails';
|
|
50
52
|
const LOGIN_ERROR_SELECTOR = '#popupCardHoldersLoginError';
|
|
51
53
|
const categories = new Map();
|
|
52
54
|
function redirectOrDialog(page) {
|
|
53
|
-
|
|
54
|
-
(0, navigation_1.waitForRedirect)(page, 20000, false, [BASE_WELCOME_URL, `${BASE_WELCOME_URL}/`]),
|
|
55
|
-
(0, elements_interactions_1.waitUntilElementFound)(page, INVALID_DETAILS_SELECTOR, true),
|
|
56
|
-
(0, elements_interactions_1.waitUntilElementFound)(page, LOGIN_ERROR_SELECTOR, true),
|
|
57
|
-
]);
|
|
55
|
+
return Promise.race([(0, _navigation.waitForRedirect)(page, 20000, false, [BASE_WELCOME_URL, `${BASE_WELCOME_URL}/`]), (0, _elementsInteractions.waitUntilElementFound)(page, INVALID_DETAILS_SELECTOR, true), (0, _elementsInteractions.waitUntilElementFound)(page, LOGIN_ERROR_SELECTOR, true)]);
|
|
58
56
|
}
|
|
59
57
|
function getTransactionsUrl(monthMoment) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
58
|
+
const month = monthMoment.month() + 1;
|
|
59
|
+
const year = monthMoment.year();
|
|
60
|
+
const date = `${year}-${month}-01`;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* url explanation:
|
|
64
|
+
* userIndex: -1 for all account owners
|
|
65
|
+
* cardIndex: -1 for all cards under the account
|
|
66
|
+
* all other query params are static, beside the date which changes for request per month
|
|
67
|
+
*/
|
|
68
|
+
return (0, _buildUrl.default)(BASE_API_ACTIONS_URL, {
|
|
69
|
+
path: `/api/registered/transactionDetails/getTransactionsAndGraphs?filterData={"userIndex":-1,"cardIndex":-1,"monthView":true,"date":"${date}","dates":{"startDate":"0","endDate":"0"},"bankAccount":{"bankAccountIndex":-1,"cards":null}}&firstCallCardIndex=-1`
|
|
70
|
+
});
|
|
72
71
|
}
|
|
73
72
|
async function loadCategories(page) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
73
|
+
debug('Loading categories');
|
|
74
|
+
const res = await (0, _fetch.fetchGetWithinPage)(page, `${BASE_API_ACTIONS_URL}/api/contents/getCategories`);
|
|
75
|
+
if (res && Array.isArray(res.result)) {
|
|
76
|
+
debug(`${res.result.length} categories loaded`);
|
|
77
|
+
res.result?.forEach(({
|
|
78
|
+
id,
|
|
79
|
+
name
|
|
80
|
+
}) => categories.set(id, name));
|
|
81
|
+
}
|
|
80
82
|
}
|
|
81
83
|
function getTransactionType(planName, planTypeId) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
84
|
+
const cleanedUpTxnTypeStr = planName.replace('\t', ' ').trim();
|
|
85
|
+
switch (cleanedUpTxnTypeStr) {
|
|
86
|
+
case MaxPlanName.ImmediateCharge:
|
|
87
|
+
case MaxPlanName.Normal:
|
|
88
|
+
case MaxPlanName.MonthlyCharge:
|
|
89
|
+
case MaxPlanName.OneMonthPostponed:
|
|
90
|
+
case MaxPlanName.MonthlyPostponed:
|
|
91
|
+
case MaxPlanName.FuturePurchaseFinancing:
|
|
92
|
+
case MaxPlanName.MonthlyPayment:
|
|
93
|
+
case MaxPlanName.MonthlyPostponedInstallments:
|
|
94
|
+
case MaxPlanName.ThirtyDaysPlus:
|
|
95
|
+
case MaxPlanName.TwoMonthsPostponed:
|
|
96
|
+
case MaxPlanName.TwoMonthsPostponed2:
|
|
97
|
+
case MaxPlanName.AccumulatingBasket:
|
|
98
|
+
case MaxPlanName.InternetShopping:
|
|
99
|
+
case MaxPlanName.MonthlyChargePlusInterest:
|
|
100
|
+
case MaxPlanName.PostponedTransactionInstallments:
|
|
101
|
+
case MaxPlanName.ReplacementCard:
|
|
102
|
+
case MaxPlanName.EarlyRepayment:
|
|
103
|
+
case MaxPlanName.MonthlyCardFee:
|
|
104
|
+
case MaxPlanName.CurrencyPocket:
|
|
105
|
+
return _transactions2.TransactionTypes.Normal;
|
|
106
|
+
case MaxPlanName.Installments:
|
|
107
|
+
case MaxPlanName.Credit:
|
|
108
|
+
case MaxPlanName.CreditOutsideTheLimit:
|
|
109
|
+
return _transactions2.TransactionTypes.Installments;
|
|
110
|
+
default:
|
|
111
|
+
switch (planTypeId) {
|
|
112
|
+
case 2:
|
|
113
|
+
case 3:
|
|
114
|
+
return _transactions2.TransactionTypes.Installments;
|
|
115
|
+
case 5:
|
|
116
|
+
return _transactions2.TransactionTypes.Normal;
|
|
108
117
|
default:
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
return transactions_2.TransactionTypes.Installments;
|
|
113
|
-
case 5:
|
|
114
|
-
return transactions_2.TransactionTypes.Normal;
|
|
115
|
-
default:
|
|
116
|
-
throw new Error(`Unknown transaction type ${cleanedUpTxnTypeStr}`);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
118
|
+
throw new Error(`Unknown transaction type ${cleanedUpTxnTypeStr}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
119
121
|
}
|
|
120
122
|
function getInstallmentsInfo(comments) {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
123
|
+
if (!comments) {
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
const matches = comments.match(/\d+/g);
|
|
127
|
+
if (!matches || matches.length < 2) {
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
number: parseInt(matches[0], 10),
|
|
132
|
+
total: parseInt(matches[1], 10)
|
|
133
|
+
};
|
|
132
134
|
}
|
|
133
135
|
function getChargedCurrency(currencyId) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
136
|
+
switch (currencyId) {
|
|
137
|
+
case 376:
|
|
138
|
+
return _constants.SHEKEL_CURRENCY;
|
|
139
|
+
case 840:
|
|
140
|
+
return _constants.DOLLAR_CURRENCY;
|
|
141
|
+
case 978:
|
|
142
|
+
return _constants.EURO_CURRENCY;
|
|
143
|
+
default:
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
144
146
|
}
|
|
145
|
-
function getMemo({
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
147
|
+
function getMemo({
|
|
148
|
+
comments,
|
|
149
|
+
fundsTransferReceiverOrTransfer,
|
|
150
|
+
fundsTransferComment
|
|
151
|
+
}) {
|
|
152
|
+
if (fundsTransferReceiverOrTransfer) {
|
|
153
|
+
const memo = comments ? `${comments} ${fundsTransferReceiverOrTransfer}` : fundsTransferReceiverOrTransfer;
|
|
154
|
+
return fundsTransferComment ? `${memo}: ${fundsTransferComment}` : memo;
|
|
155
|
+
}
|
|
156
|
+
return comments;
|
|
151
157
|
}
|
|
152
|
-
exports.getMemo = getMemo;
|
|
153
158
|
function mapTransaction(rawTransaction) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
status,
|
|
175
|
-
};
|
|
159
|
+
const isPending = rawTransaction.paymentDate === null;
|
|
160
|
+
const processedDate = (0, _moment.default)(isPending ? rawTransaction.purchaseDate : rawTransaction.paymentDate).toISOString();
|
|
161
|
+
const status = isPending ? _transactions2.TransactionStatuses.Pending : _transactions2.TransactionStatuses.Completed;
|
|
162
|
+
const installments = getInstallmentsInfo(rawTransaction.comments);
|
|
163
|
+
const identifier = installments ? `${rawTransaction.dealData?.arn}_${installments.number}` : rawTransaction.dealData?.arn;
|
|
164
|
+
return {
|
|
165
|
+
type: getTransactionType(rawTransaction.planName, rawTransaction.planTypeId),
|
|
166
|
+
date: (0, _moment.default)(rawTransaction.purchaseDate).toISOString(),
|
|
167
|
+
processedDate,
|
|
168
|
+
originalAmount: -rawTransaction.originalAmount,
|
|
169
|
+
originalCurrency: rawTransaction.originalCurrency,
|
|
170
|
+
chargedAmount: -rawTransaction.actualPaymentAmount,
|
|
171
|
+
chargedCurrency: getChargedCurrency(rawTransaction.paymentCurrency),
|
|
172
|
+
description: rawTransaction.merchantName.trim(),
|
|
173
|
+
memo: getMemo(rawTransaction),
|
|
174
|
+
category: categories.get(rawTransaction?.categoryId),
|
|
175
|
+
installments,
|
|
176
|
+
identifier,
|
|
177
|
+
status
|
|
178
|
+
};
|
|
176
179
|
}
|
|
177
180
|
async function fetchTransactionsForMonth(page, monthMoment) {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
});
|
|
193
|
-
return transactionsByAccount;
|
|
181
|
+
const url = getTransactionsUrl(monthMoment);
|
|
182
|
+
const data = await (0, _fetch.fetchGetWithinPage)(page, url);
|
|
183
|
+
const transactionsByAccount = {};
|
|
184
|
+
if (!data || !data.result) return transactionsByAccount;
|
|
185
|
+
data.result.transactions
|
|
186
|
+
// Filter out non-transactions without a plan type, e.g. summary rows
|
|
187
|
+
.filter(transaction => !!transaction.planName).forEach(transaction => {
|
|
188
|
+
if (!transactionsByAccount[transaction.shortCardNumber]) {
|
|
189
|
+
transactionsByAccount[transaction.shortCardNumber] = [];
|
|
190
|
+
}
|
|
191
|
+
const mappedTransaction = mapTransaction(transaction);
|
|
192
|
+
transactionsByAccount[transaction.shortCardNumber].push(mappedTransaction);
|
|
193
|
+
});
|
|
194
|
+
return transactionsByAccount;
|
|
194
195
|
}
|
|
195
196
|
function addResult(allResults, result) {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
|
|
197
|
+
const clonedResults = {
|
|
198
|
+
...allResults
|
|
199
|
+
};
|
|
200
|
+
Object.keys(result).forEach(accountNumber => {
|
|
201
|
+
if (!clonedResults[accountNumber]) {
|
|
202
|
+
clonedResults[accountNumber] = [];
|
|
203
|
+
}
|
|
204
|
+
clonedResults[accountNumber].push(...result[accountNumber]);
|
|
205
|
+
});
|
|
206
|
+
return clonedResults;
|
|
204
207
|
}
|
|
205
208
|
function prepareTransactions(txns, startMoment, combineInstallments, enableTransactionsFilterByDate) {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
: clonedTxns;
|
|
214
|
-
return clonedTxns;
|
|
209
|
+
let clonedTxns = Array.from(txns);
|
|
210
|
+
if (!combineInstallments) {
|
|
211
|
+
clonedTxns = (0, _transactions.fixInstallments)(clonedTxns);
|
|
212
|
+
}
|
|
213
|
+
clonedTxns = (0, _transactions.sortTransactionsByDate)(clonedTxns);
|
|
214
|
+
clonedTxns = enableTransactionsFilterByDate ? (0, _transactions.filterOldTransactions)(clonedTxns, startMoment, combineInstallments || false) : clonedTxns;
|
|
215
|
+
return clonedTxns;
|
|
215
216
|
}
|
|
216
217
|
async function fetchTransactions(page, options) {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
218
|
+
const futureMonthsToScrape = options.futureMonthsToScrape ?? 1;
|
|
219
|
+
const defaultStartMoment = (0, _moment.default)().subtract(1, 'years');
|
|
220
|
+
const startMomentLimit = (0, _moment.default)().subtract(4, 'years');
|
|
221
|
+
const startDate = options.startDate || defaultStartMoment.toDate();
|
|
222
|
+
const startMoment = _moment.default.max(startMomentLimit, (0, _moment.default)(startDate));
|
|
223
|
+
const allMonths = (0, _dates.default)(startMoment, futureMonthsToScrape);
|
|
224
|
+
await loadCategories(page);
|
|
225
|
+
let allResults = {};
|
|
226
|
+
for (let i = 0; i < allMonths.length; i += 1) {
|
|
227
|
+
const result = await fetchTransactionsForMonth(page, allMonths[i]);
|
|
228
|
+
allResults = addResult(allResults, result);
|
|
229
|
+
}
|
|
230
|
+
Object.keys(allResults).forEach(accountNumber => {
|
|
231
|
+
let txns = allResults[accountNumber];
|
|
232
|
+
txns = prepareTransactions(txns, startMoment, options.combineInstallments || false, options.outputData?.enableTransactionsFilterByDate ?? true);
|
|
233
|
+
allResults[accountNumber] = txns;
|
|
234
|
+
});
|
|
235
|
+
return allResults;
|
|
235
236
|
}
|
|
236
237
|
function getPossibleLoginResults(page) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
return (0, elements_interactions_1.elementPresentOnPage)(page, LOGIN_ERROR_SELECTOR);
|
|
248
|
-
},
|
|
249
|
-
];
|
|
250
|
-
return urls;
|
|
238
|
+
const urls = {};
|
|
239
|
+
urls[_baseScraperWithBrowser.LoginResults.Success] = [SUCCESS_URL];
|
|
240
|
+
urls[_baseScraperWithBrowser.LoginResults.ChangePassword] = [PASSWORD_EXPIRED_URL];
|
|
241
|
+
urls[_baseScraperWithBrowser.LoginResults.InvalidPassword] = [async () => {
|
|
242
|
+
return (0, _elementsInteractions.elementPresentOnPage)(page, INVALID_DETAILS_SELECTOR);
|
|
243
|
+
}];
|
|
244
|
+
urls[_baseScraperWithBrowser.LoginResults.UnknownError] = [async () => {
|
|
245
|
+
return (0, _elementsInteractions.elementPresentOnPage)(page, LOGIN_ERROR_SELECTOR);
|
|
246
|
+
}];
|
|
247
|
+
return urls;
|
|
251
248
|
}
|
|
252
249
|
function createLoginFields(credentials) {
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
250
|
+
return [{
|
|
251
|
+
selector: '#user-name',
|
|
252
|
+
value: credentials.username
|
|
253
|
+
}, {
|
|
254
|
+
selector: '#password',
|
|
255
|
+
value: credentials.password
|
|
256
|
+
}];
|
|
257
257
|
}
|
|
258
|
-
class MaxScraper extends
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
258
|
+
class MaxScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
|
|
259
|
+
getLoginOptions(credentials) {
|
|
260
|
+
return {
|
|
261
|
+
loginUrl: LOGIN_URL,
|
|
262
|
+
fields: createLoginFields(credentials),
|
|
263
|
+
submitButtonSelector: 'app-user-login-form .general-button.send-me-code',
|
|
264
|
+
preAction: async () => {
|
|
265
|
+
if (await (0, _elementsInteractions.elementPresentOnPage)(this.page, '#closePopup')) {
|
|
266
|
+
await (0, _elementsInteractions.clickButton)(this.page, '#closePopup');
|
|
267
|
+
}
|
|
268
|
+
await (0, _elementsInteractions.clickButton)(this.page, '.personal-area > a.go-to-personal-area');
|
|
269
|
+
if (await (0, _elementsInteractions.elementPresentOnPage)(this.page, '.login-link#private')) {
|
|
270
|
+
await (0, _elementsInteractions.clickButton)(this.page, '.login-link#private');
|
|
271
|
+
}
|
|
272
|
+
await (0, _elementsInteractions.waitUntilElementFound)(this.page, '#login-password-link', true);
|
|
273
|
+
await (0, _elementsInteractions.clickButton)(this.page, '#login-password-link');
|
|
274
|
+
await (0, _elementsInteractions.waitUntilElementFound)(this.page, '#login-password.tab-pane.active app-user-login-form', true);
|
|
275
|
+
},
|
|
276
|
+
checkReadiness: async () => {
|
|
277
|
+
await (0, _elementsInteractions.waitUntilElementFound)(this.page, '.personal-area > a.go-to-personal-area', true);
|
|
278
|
+
},
|
|
279
|
+
postAction: async () => redirectOrDialog(this.page),
|
|
280
|
+
possibleResults: getPossibleLoginResults(this.page),
|
|
281
|
+
waitUntil: 'domcontentloaded'
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
async fetchData() {
|
|
285
|
+
const results = await fetchTransactions(this.page, this.options);
|
|
286
|
+
const accounts = Object.keys(results).map(accountNumber => {
|
|
287
|
+
return {
|
|
288
|
+
accountNumber,
|
|
289
|
+
txns: results[accountNumber]
|
|
290
|
+
};
|
|
291
|
+
});
|
|
292
|
+
return {
|
|
293
|
+
success: true,
|
|
294
|
+
accounts
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
297
|
}
|
|
298
|
-
exports.default = MaxScraper;
|
|
299
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL21heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwREFBaUM7QUFDakMsb0RBQTZDO0FBRTdDLDRDQUErRTtBQUMvRSw2REFBa0Q7QUFDbEQsNENBQTRDO0FBQzVDLDRFQUE0RztBQUM1Ryw0Q0FBc0Q7QUFDdEQsc0RBQXdEO0FBQ3hELDBEQUF5RztBQUN6RyxrREFBMEY7QUFDMUYsMkVBS3FDO0FBR3JDLE1BQU0sS0FBSyxHQUFHLElBQUEsZ0JBQVEsRUFBQyxLQUFLLENBQUMsQ0FBQztBQXNCOUIsTUFBTSxvQkFBb0IsR0FBRywrQkFBK0IsQ0FBQztBQUM3RCxNQUFNLGdCQUFnQixHQUFHLHVCQUF1QixDQUFDO0FBRWpELE1BQU0sU0FBUyxHQUFHLEdBQUcsZ0JBQWdCLG1CQUFtQixDQUFDO0FBQ3pELE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxnQkFBZ0IsaUJBQWlCLENBQUM7QUFDbEUsTUFBTSxXQUFXLEdBQUcsR0FBRyxnQkFBZ0Isb0JBQW9CLENBQUM7QUFFNUQsSUFBSyxXQXVCSjtBQXZCRCxXQUFLLFdBQVc7SUFDZCx3REFBZ0IsQ0FBQTtJQUNoQix5SEFBb0MsQ0FBQTtJQUNwQyxtR0FBaUMsQ0FBQTtJQUNqQywwRUFBd0IsQ0FBQTtJQUN4Qix3RkFBNEIsQ0FBQTtJQUM1QixzRkFBK0IsQ0FBQTtJQUMvQixnSUFBc0MsQ0FBQTtJQUN0QywrRkFBOEIsQ0FBQTtJQUM5QixtSkFBK0MsQ0FBQTtJQUMvQyw0SUFBa0QsQ0FBQTtJQUNsRCxzRkFBK0IsQ0FBQTtJQUMvQix5R0FBbUMsQ0FBQTtJQUNuQyxvSEFBeUMsQ0FBQTtJQUN6Qyw0R0FBMkMsQ0FBQTtJQUMzQyx3REFBZ0IsQ0FBQTtJQUNoQixxSUFBMkMsQ0FBQTtJQUMzQyxpRkFBK0IsQ0FBQTtJQUMvQixzSkFBdUQsQ0FBQTtJQUN2RCxnR0FBK0IsQ0FBQTtJQUMvQiwrRkFB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LHNCQUFzQixDQUFDLENBQUM7Z0JBQ3JELE1BQU0sSUFBQSw2Q0FBcUIsRUFBQyxJQUFJLENBQUMsSUFBSSxFQUFFLHFEQUFxRCxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RHLENBQUM7WUFDRCxjQUFjLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3pCLE1BQU0sSUFBQSw2Q0FBcUIsRUFBQyxJQUFJLENBQUMsSUFBSSxFQUFFLHdDQUF3QyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pGLENBQUM7WUFDRCxVQUFVLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ25ELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ25ELFNBQVMsRUFBRSxrQkFBa0I7U0FDOUIsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUztRQUNiLE1BQU0sT0FBTyxHQUFHLE1BQU0saUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDeEQsT0FBTztnQkFDTCxhQUFhO2dCQUNiLElBQUksRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDO2FBQzdCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVE7U0FDVCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQsa0JBQWUsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGJ1aWxkVXJsIGZyb20gJ2J1aWxkLXVybCc7XG5pbXBvcnQgbW9tZW50LCB7IHR5cGUgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IHR5cGUgUGFnZSB9IGZyb20gJ3B1cHBldGVlcic7XG5pbXBvcnQgeyBET0xMQVJfQ1VSUkVOQ1ksIEVVUk9fQ1VSUkVOQ1ksIFNIRUtFTF9DVVJSRU5DWSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgZ2V0QWxsTW9udGhNb21lbnRzIGZyb20gJy4uL2hlbHBlcnMvZGF0ZXMnO1xuaW1wb3J0IHsgZ2V0RGVidWcgfSBmcm9tICcuLi9oZWxwZXJzL2RlYnVnJztcbmltcG9ydCB7IGNsaWNrQnV0dG9uLCBlbGVtZW50UHJlc2VudE9uUGFnZSwgd2FpdFVudGlsRWxlbWVudEZvdW5kIH0gZnJvbSAnLi4vaGVscGVycy9lbGVtZW50cy1pbnRlcmFjdGlvbnMnO1xuaW1wb3J0IHsgZmV0Y2hHZXRXaXRoaW5QYWdlIH0gZnJvbSAnLi4vaGVscGVycy9mZXRjaCc7XG5pbXBvcnQgeyB3YWl0Rm9yUmVkaXJlY3QgfSBmcm9tICcuLi9oZWxwZXJzL25hdmlnYXRpb24nO1xuaW1wb3J0IHsgZmlsdGVyT2xkVHJhbnNhY3Rpb25zLCBmaXhJbnN0YWxsbWVudHMsIHNvcnRUcmFuc2FjdGlvbnNCeURhdGUgfSBmcm9tICcuLi9oZWxwZXJzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblN0YXR1c2VzLCBUcmFuc2FjdGlvblR5cGVzLCB0eXBlIFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7XG4gIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsXG4gIExvZ2luUmVzdWx0cyxcbiAgdHlwZSBMb2dpbk9wdGlvbnMsXG4gIHR5cGUgUG9zc2libGVMb2dpblJlc3VsdHMsXG59IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5pbXBvcnQgeyB0eXBlIFNjcmFwZXJPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5jb25zdCBkZWJ1ZyA9IGdldERlYnVnKCdtYXgnKTtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBzaG9ydENhcmROdW1iZXI6IHN0cmluZztcbiAgcGF5bWVudERhdGU/OiBzdHJpbmc7XG4gIHB1cmNoYXNlRGF0ZTogc3RyaW5nO1xuICBhY3R1YWxQYXltZW50QW1vdW50OiBzdHJpbmc7XG4gIHBheW1lbnRDdXJyZW5jeTogbnVtYmVyIHwgbnVsbDtcbiAgb3JpZ2luYWxDdXJyZW5jeTogc3RyaW5nO1xuICBvcmlnaW5hbEFtb3VudDogbnVtYmVyO1xuICBwbGFuTmFtZTogc3RyaW5nO1xuICBwbGFuVHlwZUlkOiBudW1iZXI7XG4gIGNvbW1lbnRzOiBzdHJpbmc7XG4gIG1lcmNoYW50TmFtZTogc3RyaW5nO1xuICBjYXRlZ29yeUlkOiBudW1iZXI7XG4gIGZ1bmRzVHJhbnNmZXJDb21tZW50Pzogc3RyaW5nO1xuICBmdW5kc1RyYW5zZmVyUmVjZWl2ZXJPclRyYW5zZmVyPzogc3RyaW5nO1xuICBkZWFsRGF0YT86IHtcbiAgICBhcm46IHN0cmluZztcbiAgfTtcbn1cblxuY29uc3QgQkFTRV9BUElfQUNUSU9OU19VUkwgPSAnaHR0cHM6Ly9vbmxpbmVsY2FwaS5tYXguY28uaWwnO1xuY29uc3QgQkFTRV9XRUxDT01FX1VSTCA9ICdodHRwczovL3d3dy5tYXguY28uaWwnO1xuXG5jb25zdCBMT0dJTl9VUkwgPSBgJHtCQVNFX1dFTENPTUVfVVJMfS9ob21lcGFnZS93ZWxjb21lYDtcbmNvbnN0IFBBU1NXT1JEX0VYUElSRURfVVJMID0gYCR7QkFTRV9XRUxDT01FX1VSTH0vcmVuZXctcGFzc3dvcmRgO1xuY29uc3QgU1VDQ0VTU19VUkwgPSBgJHtCQVNFX1dFTENPTUVfVVJMfS9ob21lcGFnZS9wZXJzb25hbGA7XG5cbmVudW0gTWF4UGxhbk5hbWUge1xuICBOb3JtYWwgPSAn16jXkteZ15zXlCcsXG4gIEltbWVkaWF0ZUNoYXJnZSA9ICfXl9eZ15XXkSDXoteh16fXldeqINee15nXmdeT15knLFxuICBJbnRlcm5ldFNob3BwaW5nID0gJ9eQ15nXoNeY16jXoNeYL9eX15VcItecJyxcbiAgSW5zdGFsbG1lbnRzID0gJ9eq16nXnNeV157XmdedJyxcbiAgTW9udGhseUNoYXJnZSA9ICfXl9eZ15XXkSDXl9eV15PXqdeZJyxcbiAgT25lTW9udGhQb3N0cG9uZWQgPSAn15PXl9eV15kg15fXldeT16knLFxuICBNb250aGx5UG9zdHBvbmVkID0gJ9eT15fXldeZINec15fXmdeV15Eg15TXl9eV15PXqdeZJyxcbiAgTW9udGhseVBheW1lbnQgPSAn16rXqdec15XXnSDXl9eV15PXqdeZJyxcbiAgRnV0dXJlUHVyY2hhc2VGaW5hbmNpbmcgPSAn157Xmdee15XXnyDXnNeo15vXmdep15Qg16LXqteZ15PXmdeqJyxcbiAgTW9udGhseVBvc3Rwb25lZEluc3RhbGxtZW50cyA9ICfXk9eX15XXmSDXl9eV15PXqSDXqtep15zXldee15nXnScsXG4gIFRoaXJ0eURheXNQbHVzID0gJ9ei16HXp9eqIDMwINek15zXldehJyxcbiAgVHdvTW9udGhzUG9zdHBvbmVkID0gJ9eT15fXldeZINeX15XXk9ep15nXmdedJyxcbiAgVHdvTW9udGhzUG9zdHBvbmVkMiA9IFwi15PXl9eV15kgMiDXlycg16rXqdec15XXnteZ151cIixcbiAgTW9udGhseUNoYXJnZVBsdXNJbnRlcmVzdCA9ICfXl9eV15PXqdeZICsg16jXmdeR15nXqicsXG4gIENyZWRpdCA9ICfXp9eo15PXmdeYJyxcbiAgQ3JlZGl0T3V0c2lkZVRoZUxpbWl0ID0gJ9en16jXk9eZ15gt157Xl9eV16Ug15zXnteh15LXqNeqJyxcbiAgQWNjdW11bGF0aW5nQmFza2V0ID0gJ9eh15wg157XpteY15HXqCcsXG4gIFBvc3Rwb25lZFRyYW5zYWN0aW9uSW5zdGFsbG1lbnRzID0gJ9ek16jXmdeh16og15TXoteh16fXlCDXlNeT15fXldeZ15QnLFxuICBSZXBsYWNlbWVudENhcmQgPSAn15vXqNeY15nXoSDXl9ec15nXpNeZJyxcbiAgRWFybHlSZXBheW1lbnQgPSAn16TXqNei15XXnyDXnteV16fXk9edJyxcbiAgTW9udGhseUNhcmRGZWUgPSAn15PXnteZINeb16jXmNeZ16EnLFxuICBDdXJyZW5jeVBvY2tldCA9ICfXl9eZ15XXkSDXkNeo16DXpyDXnteY15cnLFxufVxuXG5jb25zdCBJTlZBTElEX0RFVEFJTFNfU0VMRUNUT1IgPSAnI3BvcHVwV3JvbmdEZXRhaWxzJztcbmNvbnN0IExPR0lOX0VSUk9SX1NFTEVDVE9SID0gJyNwb3B1cENhcmRIb2xkZXJzTG9naW5FcnJvcic7XG5cbmNvbnN0IGNhdGVnb3JpZXMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuXG5mdW5jdGlvbiByZWRpcmVjdE9yRGlhbG9nKHBhZ2U6IFBhZ2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmFjZShbXG4gICAgd2FpdEZvclJlZGlyZWN0KHBhZ2UsIDIwMDAwLCBmYWxzZSwgW0JBU0VfV0VMQ09NRV9VUkwsIGAke0JBU0VfV0VMQ09NRV9VUkx9L2BdKSxcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgSU5WQUxJRF9ERVRBSUxTX1NFTEVDVE9SLCB0cnVlKSxcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgTE9HSU5fRVJST1JfU0VMRUNUT1IsIHRydWUpLFxuICBdKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25zVXJsKG1vbnRoTW9tZW50OiBNb21lbnQpIHtcbiAgY29uc3QgbW9udGggPSBtb250aE1vbWVudC5tb250aCgpICsgMTtcbiAgY29uc3QgeWVhciA9IG1vbnRoTW9tZW50LnllYXIoKTtcbiAgY29uc3QgZGF0ZSA9IGAke3llYXJ9LSR7bW9udGh9LTAxYDtcblxuICAvKipcbiAgICogdXJsIGV4cGxhbmF0aW9uOlxuICAgKiB1c2VySW5kZXg6IC0xIGZvciBhbGwgYWNjb3VudCBvd25lcnNcbiAgICogY2FyZEluZGV4OiAtMSBmb3IgYWxsIGNhcmRzIHVuZGVyIHRoZSBhY2NvdW50XG4gICAqIGFsbCBvdGhlciBxdWVyeSBwYXJhbXMgYXJlIHN0YXRpYywgYmVzaWRlIHRoZSBkYXRlIHdoaWNoIGNoYW5nZXMgZm9yIHJlcXVlc3QgcGVyIG1vbnRoXG4gICAqL1xuICByZXR1cm4gYnVpbGRVcmwoQkFTRV9BUElfQUNUSU9OU19VUkwsIHtcbiAgICBwYXRoOiBgL2FwaS9yZWdpc3RlcmVkL3RyYW5zYWN0aW9uRGV0YWlscy9nZXRUcmFuc2FjdGlvbnNBbmRHcmFwaHM/ZmlsdGVyRGF0YT17XCJ1c2VySW5kZXhcIjotMSxcImNhcmRJbmRleFwiOi0xLFwibW9udGhWaWV3XCI6dHJ1ZSxcImRhdGVcIjpcIiR7ZGF0ZX1cIixcImRhdGVzXCI6e1wic3RhcnREYXRlXCI6XCIwXCIsXCJlbmREYXRlXCI6XCIwXCJ9LFwiYmFua0FjY291bnRcIjp7XCJiYW5rQWNjb3VudEluZGV4XCI6LTEsXCJjYXJkc1wiOm51bGx9fSZmaXJzdENhbGxDYXJkSW5kZXg9LTFgLFxuICB9KTtcbn1cblxuaW50ZXJmYWNlIEZldGNoQ2F0ZWdvcnlSZXN1bHQge1xuICByZXN1bHQ/OiBBcnJheTx7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gIH0+O1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkQ2F0ZWdvcmllcyhwYWdlOiBQYWdlKSB7XG4gIGRlYnVnKCdMb2FkaW5nIGNhdGVnb3JpZXMnKTtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hHZXRXaXRoaW5QYWdlPEZldGNoQ2F0ZWdvcnlSZXN1bHQ+KHBhZ2UsIGAke0JBU0VfQVBJX0FDVElPTlNfVVJMfS9hcGkvY29udGVudHMvZ2V0Q2F0ZWdvcmllc2ApO1xuICBpZiAocmVzICYmIEFycmF5LmlzQXJyYXkocmVzLnJlc3VsdCkpIHtcbiAgICBkZWJ1ZyhgJHtyZXMucmVzdWx0Lmxlbmd0aH0gY2F0ZWdvcmllcyBsb2FkZWRgKTtcbiAgICByZXMucmVzdWx0Py5mb3JFYWNoKCh7IGlkLCBuYW1lIH0pID0+IGNhdGVnb3JpZXMuc2V0KGlkLCBuYW1lKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25UeXBlKHBsYW5OYW1lOiBzdHJpbmcsIHBsYW5UeXBlSWQ6IG51bWJlcikge1xuICBjb25zdCBjbGVhbmVkVXBUeG5UeXBlU3RyID0gcGxhbk5hbWUucmVwbGFjZSgnXFx0JywgJyAnKS50cmltKCkgYXMgTWF4UGxhbk5hbWU7XG4gIHN3aXRjaCAoY2xlYW5lZFVwVHhuVHlwZVN0cikge1xuICAgIGNhc2UgTWF4UGxhbk5hbWUuSW1tZWRpYXRlQ2hhcmdlOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuTm9ybWFsOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuTW9udGhseUNoYXJnZTpcbiAgICBjYXNlIE1heFBsYW5OYW1lLk9uZU1vbnRoUG9zdHBvbmVkOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuTW9udGhseVBvc3Rwb25lZDpcbiAgICBjYXNlIE1heFBsYW5OYW1lLkZ1dHVyZVB1cmNoYXNlRmluYW5jaW5nOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuTW9udGhseVBheW1lbnQ6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5Nb250aGx5UG9zdHBvbmVkSW5zdGFsbG1lbnRzOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuVGhpcnR5RGF5c1BsdXM6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5Ud29Nb250aHNQb3N0cG9uZWQ6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5Ud29Nb250aHNQb3N0cG9uZWQyOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuQWNjdW11bGF0aW5nQmFza2V0OlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuSW50ZXJuZXRTaG9wcGluZzpcbiAgICBjYXNlIE1heFBsYW5OYW1lLk1vbnRobHlDaGFyZ2VQbHVzSW50ZXJlc3Q6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5Qb3N0cG9uZWRUcmFuc2FjdGlvbkluc3RhbGxtZW50czpcbiAgICBjYXNlIE1heFBsYW5OYW1lLlJlcGxhY2VtZW50Q2FyZDpcbiAgICBjYXNlIE1heFBsYW5OYW1lLkVhcmx5UmVwYXltZW50OlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuTW9udGhseUNhcmRGZWU6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5DdXJyZW5jeVBvY2tldDpcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbDtcbiAgICBjYXNlIE1heFBsYW5OYW1lLkluc3RhbGxtZW50czpcbiAgICBjYXNlIE1heFBsYW5OYW1lLkNyZWRpdDpcbiAgICBjYXNlIE1heFBsYW5OYW1lLkNyZWRpdE91dHNpZGVUaGVMaW1pdDpcbiAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGVzLkluc3RhbGxtZW50cztcbiAgICBkZWZhdWx0OlxuICAgICAgc3dpdGNoIChwbGFuVHlwZUlkKSB7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGVzLkluc3RhbGxtZW50cztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHJhbnNhY3Rpb24gdHlwZSAke2NsZWFuZWRVcFR4blR5cGVTdHIgYXMgc3RyaW5nfWApO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEluc3RhbGxtZW50c0luZm8oY29tbWVudHM6IHN0cmluZykge1xuICBpZiAoIWNvbW1lbnRzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBtYXRjaGVzID0gY29tbWVudHMubWF0Y2goL1xcZCsvZyk7XG4gIGlmICghbWF0Y2hlcyB8fCBtYXRjaGVzLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBudW1iZXI6IHBhcnNlSW50KG1hdGNoZXNbMF0sIDEwKSxcbiAgICB0b3RhbDogcGFyc2VJbnQobWF0Y2hlc1sxXSwgMTApLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDaGFyZ2VkQ3VycmVuY3koY3VycmVuY3lJZDogbnVtYmVyIHwgbnVsbCkge1xuICBzd2l0Y2ggKGN1cnJlbmN5SWQpIHtcbiAgICBjYXNlIDM3NjpcbiAgICAgIHJldHVybiBTSEVLRUxfQ1VSUkVOQ1k7XG4gICAgY2FzZSA4NDA6XG4gICAgICByZXR1cm4gRE9MTEFSX0NVUlJFTkNZO1xuICAgIGNhc2UgOTc4OlxuICAgICAgcmV0dXJuIEVVUk9fQ1VSUkVOQ1k7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1lbW8oe1xuICBjb21tZW50cyxcbiAgZnVuZHNUcmFuc2ZlclJlY2VpdmVyT3JUcmFuc2ZlcixcbiAgZnVuZHNUcmFuc2ZlckNvbW1lbnQsXG59OiBQaWNrPFNjcmFwZWRUcmFuc2FjdGlvbiwgJ2NvbW1lbnRzJyB8ICdmdW5kc1RyYW5zZmVyUmVjZWl2ZXJPclRyYW5zZmVyJyB8ICdmdW5kc1RyYW5zZmVyQ29tbWVudCc+KSB7XG4gIGlmIChmdW5kc1RyYW5zZmVyUmVjZWl2ZXJPclRyYW5zZmVyKSB7XG4gICAgY29uc3QgbWVtbyA9IGNvbW1lbnRzID8gYCR7Y29tbWVudHN9ICR7ZnVuZHNUcmFuc2ZlclJlY2VpdmVyT3JUcmFuc2Zlcn1gIDogZnVuZHNUcmFuc2ZlclJlY2VpdmVyT3JUcmFuc2ZlcjtcbiAgICByZXR1cm4gZnVuZHNUcmFuc2ZlckNvbW1lbnQgPyBgJHttZW1vfTogJHtmdW5kc1RyYW5zZmVyQ29tbWVudH1gIDogbWVtbztcbiAgfVxuXG4gIHJldHVybiBjb21tZW50cztcbn1cblxuZnVuY3Rpb24gbWFwVHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IFNjcmFwZWRUcmFuc2FjdGlvbik6IFRyYW5zYWN0aW9uIHtcbiAgY29uc3QgaXNQZW5kaW5nID0gcmF3VHJhbnNhY3Rpb24ucGF5bWVudERhdGUgPT09IG51bGw7XG4gIGNvbnN0IHByb2Nlc3NlZERhdGUgPSBtb21lbnQoaXNQZW5kaW5nID8gcmF3VHJhbnNhY3Rpb24ucHVyY2hhc2VEYXRlIDogcmF3VHJhbnNhY3Rpb24ucGF5bWVudERhdGUpLnRvSVNPU3RyaW5nKCk7XG4gIGNvbnN0IHN0YXR1cyA9IGlzUGVuZGluZyA/IFRyYW5zYWN0aW9uU3RhdHVzZXMuUGVuZGluZyA6IFRyYW5zYWN0aW9uU3RhdHVzZXMuQ29tcGxldGVkO1xuXG4gIGNvbnN0IGluc3RhbGxtZW50cyA9IGdldEluc3RhbGxtZW50c0luZm8ocmF3VHJhbnNhY3Rpb24uY29tbWVudHMpO1xuICBjb25zdCBpZGVudGlmaWVyID0gaW5zdGFsbG1lbnRzXG4gICAgPyBgJHtyYXdUcmFuc2FjdGlvbi5kZWFsRGF0YT8uYXJufV8ke2luc3RhbGxtZW50cy5udW1iZXJ9YFxuICAgIDogcmF3VHJhbnNhY3Rpb24uZGVhbERhdGE/LmFybjtcblxuICByZXR1cm4ge1xuICAgIHR5cGU6IGdldFRyYW5zYWN0aW9uVHlwZShyYXdUcmFuc2FjdGlvbi5wbGFuTmFtZSwgcmF3VHJhbnNhY3Rpb24ucGxhblR5cGVJZCksXG4gICAgZGF0ZTogbW9tZW50KHJhd1RyYW5zYWN0aW9uLnB1cmNoYXNlRGF0ZSkudG9JU09TdHJpbmcoKSxcbiAgICBwcm9jZXNzZWREYXRlLFxuICAgIG9yaWdpbmFsQW1vdW50OiAtcmF3VHJhbnNhY3Rpb24ub3JpZ2luYWxBbW91bnQsXG4gICAgb3JpZ2luYWxDdXJyZW5jeTogcmF3VHJhbnNhY3Rpb24ub3JpZ2luYWxDdXJyZW5jeSxcbiAgICBjaGFyZ2VkQW1vdW50OiAtcmF3VHJhbnNhY3Rpb24uYWN0dWFsUGF5bWVudEFtb3VudCxcbiAgICBjaGFyZ2VkQ3VycmVuY3k6IGdldENoYXJnZWRDdXJyZW5jeShyYXdUcmFuc2FjdGlvbi5wYXltZW50Q3VycmVuY3kpLFxuICAgIGRlc2NyaXB0aW9uOiByYXdUcmFuc2FjdGlvbi5tZXJjaGFudE5hbWUudHJpbSgpLFxuICAgIG1lbW86IGdldE1lbW8ocmF3VHJhbnNhY3Rpb24pLFxuICAgIGNhdGVnb3J5OiBjYXRlZ29yaWVzLmdldChyYXdUcmFuc2FjdGlvbj8uY2F0ZWdvcnlJZCksXG4gICAgaW5zdGFsbG1lbnRzLFxuICAgIGlkZW50aWZpZXIsXG4gICAgc3RhdHVzLFxuICB9O1xufVxuaW50ZXJmYWNlIFNjcmFwZWRUcmFuc2FjdGlvbnNSZXN1bHQge1xuICByZXN1bHQ/OiB7XG4gICAgdHJhbnNhY3Rpb25zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXTtcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hUcmFuc2FjdGlvbnNGb3JNb250aChwYWdlOiBQYWdlLCBtb250aE1vbWVudDogTW9tZW50KSB7XG4gIGNvbnN0IHVybCA9IGdldFRyYW5zYWN0aW9uc1VybChtb250aE1vbWVudCk7XG5cbiAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoR2V0V2l0aGluUGFnZTxTY3JhcGVkVHJhbnNhY3Rpb25zUmVzdWx0PihwYWdlLCB1cmwpO1xuICBjb25zdCB0cmFuc2FjdGlvbnNCeUFjY291bnQ6IFJlY29yZDxzdHJpbmcsIFRyYW5zYWN0aW9uW10+ID0ge307XG5cbiAgaWYgKCFkYXRhIHx8ICFkYXRhLnJlc3VsdCkgcmV0dXJuIHRyYW5zYWN0aW9uc0J5QWNjb3VudDtcblxuICBkYXRhLnJlc3VsdC50cmFuc2FjdGlvbnNcbiAgICAvLyBGaWx0ZXIgb3V0IG5vbi10cmFuc2FjdGlvbnMgd2l0aG91dCBhIHBsYW4gdHlwZSwgZS5nLiBzdW1tYXJ5IHJvd3NcbiAgICAuZmlsdGVyKHRyYW5zYWN0aW9uID0+ICEhdHJhbnNhY3Rpb24ucGxhbk5hbWUpXG4gICAgLmZvckVhY2goKHRyYW5zYWN0aW9uOiBTY3JhcGVkVHJhbnNhY3Rpb24pID0+IHtcbiAgICAgIGlmICghdHJhbnNhY3Rpb25zQnlBY2NvdW50W3RyYW5zYWN0aW9uLnNob3J0Q2FyZE51bWJlcl0pIHtcbiAgICAgICAgdHJhbnNhY3Rpb25zQnlBY2NvdW50W3RyYW5zYWN0aW9uLnNob3J0Q2FyZE51bWJlcl0gPSBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFwcGVkVHJhbnNhY3Rpb24gPSBtYXBUcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgICB0cmFuc2FjdGlvbnNCeUFjY291bnRbdHJhbnNhY3Rpb24uc2hvcnRDYXJkTnVtYmVyXS5wdXNoKG1hcHBlZFRyYW5zYWN0aW9uKTtcbiAgICB9KTtcblxuICByZXR1cm4gdHJhbnNhY3Rpb25zQnlBY2NvdW50O1xufVxuXG5mdW5jdGlvbiBhZGRSZXN1bHQoYWxsUmVzdWx0czogUmVjb3JkPHN0cmluZywgVHJhbnNhY3Rpb25bXT4sIHJlc3VsdDogUmVjb3JkPHN0cmluZywgVHJhbnNhY3Rpb25bXT4pIHtcbiAgY29uc3QgY2xvbmVkUmVzdWx0czogUmVjb3JkPHN0cmluZywgVHJhbnNhY3Rpb25bXT4gPSB7IC4uLmFsbFJlc3VsdHMgfTtcbiAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKGFjY291bnROdW1iZXIgPT4ge1xuICAgIGlmICghY2xvbmVkUmVzdWx0c1thY2NvdW50TnVtYmVyXSkge1xuICAgICAgY2xvbmVkUmVzdWx0c1thY2NvdW50TnVtYmVyXSA9IFtdO1xuICAgIH1cbiAgICBjbG9uZWRSZXN1bHRzW2FjY291bnROdW1iZXJdLnB1c2goLi4ucmVzdWx0W2FjY291bnROdW1iZXJdKTtcbiAgfSk7XG4gIHJldHVybiBjbG9uZWRSZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVHJhbnNhY3Rpb25zKFxuICB0eG5zOiBUcmFuc2FjdGlvbltdLFxuICBzdGFydE1vbWVudDogbW9tZW50Lk1vbWVudCxcbiAgY29tYmluZUluc3RhbGxtZW50czogYm9vbGVhbixcbiAgZW5hYmxlVHJhbnNhY3Rpb25zRmlsdGVyQnlEYXRlOiBib29sZWFuLFxuKSB7XG4gIGxldCBjbG9uZWRUeG5zID0gQXJyYXkuZnJvbSh0eG5zKTtcbiAgaWYgKCFjb21iaW5lSW5zdGFsbG1lbnRzKSB7XG4gICAgY2xvbmVkVHhucyA9IGZpeEluc3RhbGxtZW50cyhjbG9uZWRUeG5zKTtcbiAgfVxuICBjbG9uZWRUeG5zID0gc29ydFRyYW5zYWN0aW9uc0J5RGF0ZShjbG9uZWRUeG5zKTtcbiAgY2xvbmVkVHhucyA9IGVuYWJsZVRyYW5zYWN0aW9uc0ZpbHRlckJ5RGF0ZVxuICAgID8gZmlsdGVyT2xkVHJhbnNhY3Rpb25zKGNsb25lZFR4bnMsIHN0YXJ0TW9tZW50LCBjb21iaW5lSW5zdGFsbG1lbnRzIHx8IGZhbHNlKVxuICAgIDogY2xvbmVkVHhucztcbiAgcmV0dXJuIGNsb25lZFR4bnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoVHJhbnNhY3Rpb25zKHBhZ2U6IFBhZ2UsIG9wdGlvbnM6IFNjcmFwZXJPcHRpb25zKSB7XG4gIGNvbnN0IGZ1dHVyZU1vbnRoc1RvU2NyYXBlID0gb3B0aW9ucy5mdXR1cmVNb250aHNUb1NjcmFwZSA/PyAxO1xuICBjb25zdCBkZWZhdWx0U3RhcnRNb21lbnQgPSBtb21lbnQoKS5zdWJ0cmFjdCgxLCAneWVhcnMnKTtcbiAgY29uc3Qgc3RhcnRNb21lbnRMaW1pdCA9IG1vbWVudCgpLnN1YnRyYWN0KDQsICd5ZWFycycpO1xuICBjb25zdCBzdGFydERhdGUgPSBvcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gIGNvbnN0IHN0YXJ0TW9tZW50ID0gbW9tZW50Lm1heChzdGFydE1vbWVudExpbWl0LCBtb21lbnQoc3RhcnREYXRlKSk7XG4gIGNvbnN0IGFsbE1vbnRocyA9IGdldEFsbE1vbnRoTW9tZW50cyhzdGFydE1vbWVudCwgZnV0dXJlTW9udGhzVG9TY3JhcGUpO1xuXG4gIGF3YWl0IGxvYWRDYXRlZ29yaWVzKHBhZ2UpO1xuXG4gIGxldCBhbGxSZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCBUcmFuc2FjdGlvbltdPiA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbE1vbnRocy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoVHJhbnNhY3Rpb25zRm9yTW9udGgocGFnZSwgYWxsTW9udGhzW2ldKTtcbiAgICBhbGxSZXN1bHRzID0gYWRkUmVzdWx0KGFsbFJlc3VsdHMsIHJlc3VsdCk7XG4gIH1cblxuICBPYmplY3Qua2V5cyhhbGxSZXN1bHRzKS5mb3JFYWNoKGFjY291bnROdW1iZXIgPT4ge1xuICAgIGxldCB0eG5zID0gYWxsUmVzdWx0c1thY2NvdW50TnVtYmVyXTtcbiAgICB0eG5zID0gcHJlcGFyZVRyYW5zYWN0aW9ucyhcbiAgICAgIHR4bnMsXG4gICAgICBzdGFydE1vbWVudCxcbiAgICAgIG9wdGlvbnMuY29tYmluZUluc3RhbGxtZW50cyB8fCBmYWxzZSxcbiAgICAgIG9wdGlvbnMub3V0cHV0RGF0YT8uZW5hYmxlVHJhbnNhY3Rpb25zRmlsdGVyQnlEYXRlID8/IHRydWUsXG4gICAgKTtcbiAgICBhbGxSZXN1bHRzW2FjY291bnROdW1iZXJdID0gdHhucztcbiAgfSk7XG5cbiAgcmV0dXJuIGFsbFJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKHBhZ2U6IFBhZ2UpOiBQb3NzaWJsZUxvZ2luUmVzdWx0cyB7XG4gIGNvbnN0IHVybHM6IFBvc3NpYmxlTG9naW5SZXN1bHRzID0ge307XG4gIHVybHNbTG9naW5SZXN1bHRzLlN1Y2Nlc3NdID0gW1NVQ0NFU1NfVVJMXTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuQ2hhbmdlUGFzc3dvcmRdID0gW1BBU1NXT1JEX0VYUElSRURfVVJMXTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuSW52YWxpZFBhc3N3b3JkXSA9IFtcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gZWxlbWVudFByZXNlbnRPblBhZ2UocGFnZSwgSU5WQUxJRF9ERVRBSUxTX1NFTEVDVE9SKTtcbiAgICB9LFxuICBdO1xuICB1cmxzW0xvZ2luUmVzdWx0cy5Vbmtub3duRXJyb3JdID0gW1xuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiBlbGVtZW50UHJlc2VudE9uUGFnZShwYWdlLCBMT0dJTl9FUlJPUl9TRUxFQ1RPUik7XG4gICAgfSxcbiAgXTtcbiAgcmV0dXJuIHVybHM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICByZXR1cm4gW1xuICAgIHsgc2VsZWN0b3I6ICcjdXNlci1uYW1lJywgdmFsdWU6IGNyZWRlbnRpYWxzLnVzZXJuYW1lIH0sXG4gICAgeyBzZWxlY3RvcjogJyNwYXNzd29yZCcsIHZhbHVlOiBjcmVkZW50aWFscy5wYXNzd29yZCB9LFxuICBdO1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG5cbmNsYXNzIE1heFNjcmFwZXIgZXh0ZW5kcyBCYXNlU2NyYXBlcldpdGhCcm93c2VyPFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzPiB7XG4gIGdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpOiBMb2dpbk9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICBsb2dpblVybDogTE9HSU5fVVJMLFxuICAgICAgZmllbGRzOiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFscyksXG4gICAgICBzdWJtaXRCdXR0b25TZWxlY3RvcjogJ2FwcC11c2VyLWxvZ2luLWZvcm0gLmdlbmVyYWwtYnV0dG9uLnNlbmQtbWUtY29kZScsXG4gICAgICBwcmVBY3Rpb246IGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKGF3YWl0IGVsZW1lbnRQcmVzZW50T25QYWdlKHRoaXMucGFnZSwgJyNjbG9zZVBvcHVwJykpIHtcbiAgICAgICAgICBhd2FpdCBjbGlja0J1dHRvbih0aGlzLnBhZ2UsICcjY2xvc2VQb3B1cCcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNsaWNrQnV0dG9uKHRoaXMucGFnZSwgJy5wZXJzb25hbC1hcmVhID4gYS5nby10by1wZXJzb25hbC1hcmVhJyk7XG4gICAgICAgIGlmIChhd2FpdCBlbGVtZW50UHJlc2VudE9uUGFnZSh0aGlzLnBhZ2UsICcubG9naW4tbGluayNwcml2YXRlJykpIHtcbiAgICAgICAgICBhd2FpdCBjbGlja0J1dHRvbih0aGlzLnBhZ2UsICcubG9naW4tbGluayNwcml2YXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHRoaXMucGFnZSwgJyNsb2dpbi1wYXNzd29yZC1saW5rJywgdHJ1ZSk7XG4gICAgICAgIGF3YWl0IGNsaWNrQnV0dG9uKHRoaXMucGFnZSwgJyNsb2dpbi1wYXNzd29yZC1saW5rJyk7XG4gICAgICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZCh0aGlzLnBhZ2UsICcjbG9naW4tcGFzc3dvcmQudGFiLXBhbmUuYWN0aXZlIGFwcC11c2VyLWxvZ2luLWZvcm0nLCB0cnVlKTtcbiAgICAgIH0sXG4gICAgICBjaGVja1JlYWRpbmVzczogYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQodGhpcy5wYWdlLCAnLnBlcnNvbmFsLWFyZWEgPiBhLmdvLXRvLXBlcnNvbmFsLWFyZWEnLCB0cnVlKTtcbiAgICAgIH0sXG4gICAgICBwb3N0QWN0aW9uOiBhc3luYyAoKSA9PiByZWRpcmVjdE9yRGlhbG9nKHRoaXMucGFnZSksXG4gICAgICBwb3NzaWJsZVJlc3VsdHM6IGdldFBvc3NpYmxlTG9naW5SZXN1bHRzKHRoaXMucGFnZSksXG4gICAgICB3YWl0VW50aWw6ICdkb21jb250ZW50bG9hZGVkJyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBmZXRjaFRyYW5zYWN0aW9ucyh0aGlzLnBhZ2UsIHRoaXMub3B0aW9ucyk7XG4gICAgY29uc3QgYWNjb3VudHMgPSBPYmplY3Qua2V5cyhyZXN1bHRzKS5tYXAoYWNjb3VudE51bWJlciA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY2NvdW50TnVtYmVyLFxuICAgICAgICB0eG5zOiByZXN1bHRzW2FjY291bnROdW1iZXJdLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgYWNjb3VudHMsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXhTY3JhcGVyO1xuIl19
|
|
298
|
+
var _default = exports.default = MaxScraper;
|
|
299
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYnVpbGRVcmwiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tb21lbnQiLCJfY29uc3RhbnRzIiwiX2RhdGVzIiwiX2RlYnVnIiwiX2VsZW1lbnRzSW50ZXJhY3Rpb25zIiwiX2ZldGNoIiwiX25hdmlnYXRpb24iLCJfdHJhbnNhY3Rpb25zIiwiX3RyYW5zYWN0aW9uczIiLCJfYmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImRlYnVnIiwiZ2V0RGVidWciLCJCQVNFX0FQSV9BQ1RJT05TX1VSTCIsIkJBU0VfV0VMQ09NRV9VUkwiLCJMT0dJTl9VUkwiLCJQQVNTV09SRF9FWFBJUkVEX1VSTCIsIlNVQ0NFU1NfVVJMIiwiTWF4UGxhbk5hbWUiLCJJTlZBTElEX0RFVEFJTFNfU0VMRUNUT1IiLCJMT0dJTl9FUlJPUl9TRUxFQ1RPUiIsImNhdGVnb3JpZXMiLCJNYXAiLCJyZWRpcmVjdE9yRGlhbG9nIiwicGFnZSIsIlByb21pc2UiLCJyYWNlIiwid2FpdEZvclJlZGlyZWN0Iiwid2FpdFVudGlsRWxlbWVudEZvdW5kIiwiZ2V0VHJhbnNhY3Rpb25zVXJsIiwibW9udGhNb21lbnQiLCJtb250aCIsInllYXIiLCJkYXRlIiwiYnVpbGRVcmwiLCJwYXRoIiwibG9hZENhdGVnb3JpZXMiLCJyZXMiLCJmZXRjaEdldFdpdGhpblBhZ2UiLCJBcnJheSIsImlzQXJyYXkiLCJyZXN1bHQiLCJsZW5ndGgiLCJmb3JFYWNoIiwiaWQiLCJuYW1lIiwic2V0IiwiZ2V0VHJhbnNhY3Rpb25UeXBlIiwicGxhbk5hbWUiLCJwbGFuVHlwZUlkIiwiY2xlYW5lZFVwVHhuVHlwZVN0ciIsInJlcGxhY2UiLCJ0cmltIiwiSW1tZWRpYXRlQ2hhcmdlIiwiTm9ybWFsIiwiTW9udGhseUNoYXJnZSIsIk9uZU1vbnRoUG9zdHBvbmVkIiwiTW9udGhseVBvc3Rwb25lZCIsIkZ1dHVyZVB1cmNoYXNlRmluYW5jaW5nIiwiTW9udGhseVBheW1lbnQiLCJNb250aGx5UG9zdHBvbmVkSW5zdGFsbG1lbnRzIiwiVGhpcnR5RGF5c1BsdXMiLCJUd29Nb250aHNQb3N0cG9uZWQiLCJUd29Nb250aHNQb3N0cG9uZWQyIiwiQWNjdW11bGF0aW5nQmFza2V0IiwiSW50ZXJuZXRTaG9wcGluZyIsIk1vbnRobHlDaGFyZ2VQbHVzSW50ZXJlc3QiLCJQb3N0cG9uZWRUcmFuc2FjdGlvbkluc3RhbGxtZW50cyIsIlJlcGxhY2VtZW50Q2FyZCIsIkVhcmx5UmVwYXltZW50IiwiTW9udGhseUNhcmRGZWUiLCJDdXJyZW5jeVBvY2tldCIsIlRyYW5zYWN0aW9uVHlwZXMiLCJJbnN0YWxsbWVudHMiLCJDcmVkaXQiLCJDcmVkaXRPdXRzaWRlVGhlTGltaXQiLCJFcnJvciIsImdldEluc3RhbGxtZW50c0luZm8iLCJjb21tZW50cyIsInVuZGVmaW5lZCIsIm1hdGNoZXMiLCJtYXRjaCIsIm51bWJlciIsInBhcnNlSW50IiwidG90YWwiLCJnZXRDaGFyZ2VkQ3VycmVuY3kiLCJjdXJyZW5jeUlkIiwiU0hFS0VMX0NVUlJFTkNZIiwiRE9MTEFSX0NVUlJFTkNZIiwiRVVST19DVVJSRU5DWSIsImdldE1lbW8iLCJmdW5kc1RyYW5zZmVyUmVjZWl2ZXJPclRyYW5zZmVyIiwiZnVuZHNUcmFuc2ZlckNvbW1lbnQiLCJtZW1vIiwibWFwVHJhbnNhY3Rpb24iLCJyYXdUcmFuc2FjdGlvbiIsImlzUGVuZGluZyIsInBheW1lbnREYXRlIiwicHJvY2Vzc2VkRGF0ZSIsIm1vbWVudCIsInB1cmNoYXNlRGF0ZSIsInRvSVNPU3RyaW5nIiwic3RhdHVzIiwiVHJhbnNhY3Rpb25TdGF0dXNlcyIsIlBlbmRpbmciLCJDb21wbGV0ZWQiLCJpbnN0YWxsbWVudHMiLCJpZGVudGlmaWVyIiwiZGVhbERhdGEiLCJhcm4iLCJ0eXBlIiwib3JpZ2luYWxBbW91bnQiLCJvcmlnaW5hbEN1cnJlbmN5IiwiY2hhcmdlZEFtb3VudCIsImFjdHVhbFBheW1lbnRBbW91bnQiLCJjaGFyZ2VkQ3VycmVuY3kiLCJwYXltZW50Q3VycmVuY3kiLCJkZXNjcmlwdGlvbiIsIm1lcmNoYW50TmFtZSIsImNhdGVnb3J5IiwiZ2V0IiwiY2F0ZWdvcnlJZCIsImZldGNoVHJhbnNhY3Rpb25zRm9yTW9udGgiLCJ1cmwiLCJkYXRhIiwidHJhbnNhY3Rpb25zQnlBY2NvdW50IiwidHJhbnNhY3Rpb25zIiwiZmlsdGVyIiwidHJhbnNhY3Rpb24iLCJzaG9ydENhcmROdW1iZXIiLCJtYXBwZWRUcmFuc2FjdGlvbiIsInB1c2giLCJhZGRSZXN1bHQiLCJhbGxSZXN1bHRzIiwiY2xvbmVkUmVzdWx0cyIsIk9iamVjdCIsImtleXMiLCJhY2NvdW50TnVtYmVyIiwicHJlcGFyZVRyYW5zYWN0aW9ucyIsInR4bnMiLCJzdGFydE1vbWVudCIsImNvbWJpbmVJbnN0YWxsbWVudHMiLCJlbmFibGVUcmFuc2FjdGlvbnNGaWx0ZXJCeURhdGUiLCJjbG9uZWRUeG5zIiwiZnJvbSIsImZpeEluc3RhbGxtZW50cyIsInNvcnRUcmFuc2FjdGlvbnNCeURhdGUiLCJmaWx0ZXJPbGRUcmFuc2FjdGlvbnMiLCJmZXRjaFRyYW5zYWN0aW9ucyIsIm9wdGlvbnMiLCJmdXR1cmVNb250aHNUb1NjcmFwZSIsImRlZmF1bHRTdGFydE1vbWVudCIsInN1YnRyYWN0Iiwic3RhcnRNb21lbnRMaW1pdCIsInN0YXJ0RGF0ZSIsInRvRGF0ZSIsIm1heCIsImFsbE1vbnRocyIsImdldEFsbE1vbnRoTW9tZW50cyIsImkiLCJvdXRwdXREYXRhIiwiZ2V0UG9zc2libGVMb2dpblJlc3VsdHMiLCJ1cmxzIiwiTG9naW5SZXN1bHRzIiwiU3VjY2VzcyIsIkNoYW5nZVBhc3N3b3JkIiwiSW52YWxpZFBhc3N3b3JkIiwiZWxlbWVudFByZXNlbnRPblBhZ2UiLCJVbmtub3duRXJyb3IiLCJjcmVhdGVMb2dpbkZpZWxkcyIsImNyZWRlbnRpYWxzIiwic2VsZWN0b3IiLCJ2YWx1ZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJNYXhTY3JhcGVyIiwiQmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsImdldExvZ2luT3B0aW9ucyIsImxvZ2luVXJsIiwiZmllbGRzIiwic3VibWl0QnV0dG9uU2VsZWN0b3IiLCJwcmVBY3Rpb24iLCJjbGlja0J1dHRvbiIsImNoZWNrUmVhZGluZXNzIiwicG9zdEFjdGlvbiIsInBvc3NpYmxlUmVzdWx0cyIsIndhaXRVbnRpbCIsImZldGNoRGF0YSIsInJlc3VsdHMiLCJhY2NvdW50cyIsIm1hcCIsInN1Y2Nlc3MiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvbWF4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBidWlsZFVybCBmcm9tICdidWlsZC11cmwnO1xuaW1wb3J0IG1vbWVudCwgeyB0eXBlIE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyB0eXBlIFBhZ2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgRE9MTEFSX0NVUlJFTkNZLCBFVVJPX0NVUlJFTkNZLCBTSEVLRUxfQ1VSUkVOQ1kgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IGdldEFsbE1vbnRoTW9tZW50cyBmcm9tICcuLi9oZWxwZXJzL2RhdGVzJztcbmltcG9ydCB7IGdldERlYnVnIH0gZnJvbSAnLi4vaGVscGVycy9kZWJ1Zyc7XG5pbXBvcnQgeyBjbGlja0J1dHRvbiwgZWxlbWVudFByZXNlbnRPblBhZ2UsIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCB9IGZyb20gJy4uL2hlbHBlcnMvZWxlbWVudHMtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB7IGZldGNoR2V0V2l0aGluUGFnZSB9IGZyb20gJy4uL2hlbHBlcnMvZmV0Y2gnO1xuaW1wb3J0IHsgd2FpdEZvclJlZGlyZWN0IH0gZnJvbSAnLi4vaGVscGVycy9uYXZpZ2F0aW9uJztcbmltcG9ydCB7IGZpbHRlck9sZFRyYW5zYWN0aW9ucywgZml4SW5zdGFsbG1lbnRzLCBzb3J0VHJhbnNhY3Rpb25zQnlEYXRlIH0gZnJvbSAnLi4vaGVscGVycy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdGF0dXNlcywgVHJhbnNhY3Rpb25UeXBlcywgdHlwZSBUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQge1xuICBCYXNlU2NyYXBlcldpdGhCcm93c2VyLFxuICBMb2dpblJlc3VsdHMsXG4gIHR5cGUgTG9naW5PcHRpb25zLFxuICB0eXBlIFBvc3NpYmxlTG9naW5SZXN1bHRzLFxufSBmcm9tICcuL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInO1xuaW1wb3J0IHsgdHlwZSBTY3JhcGVyT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZygnbWF4Jyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgc2hvcnRDYXJkTnVtYmVyOiBzdHJpbmc7XG4gIHBheW1lbnREYXRlPzogc3RyaW5nO1xuICBwdXJjaGFzZURhdGU6IHN0cmluZztcbiAgYWN0dWFsUGF5bWVudEFtb3VudDogc3RyaW5nO1xuICBwYXltZW50Q3VycmVuY3k6IG51bWJlciB8IG51bGw7XG4gIG9yaWdpbmFsQ3VycmVuY3k6IHN0cmluZztcbiAgb3JpZ2luYWxBbW91bnQ6IG51bWJlcjtcbiAgcGxhbk5hbWU6IHN0cmluZztcbiAgcGxhblR5cGVJZDogbnVtYmVyO1xuICBjb21tZW50czogc3RyaW5nO1xuICBtZXJjaGFudE5hbWU6IHN0cmluZztcbiAgY2F0ZWdvcnlJZDogbnVtYmVyO1xuICBmdW5kc1RyYW5zZmVyQ29tbWVudD86IHN0cmluZztcbiAgZnVuZHNUcmFuc2ZlclJlY2VpdmVyT3JUcmFuc2Zlcj86IHN0cmluZztcbiAgZGVhbERhdGE/OiB7XG4gICAgYXJuOiBzdHJpbmc7XG4gIH07XG59XG5cbmNvbnN0IEJBU0VfQVBJX0FDVElPTlNfVVJMID0gJ2h0dHBzOi8vb25saW5lbGNhcGkubWF4LmNvLmlsJztcbmNvbnN0IEJBU0VfV0VMQ09NRV9VUkwgPSAnaHR0cHM6Ly93d3cubWF4LmNvLmlsJztcblxuY29uc3QgTE9HSU5fVVJMID0gYCR7QkFTRV9XRUxDT01FX1VSTH0vaG9tZXBhZ2Uvd2VsY29tZWA7XG5jb25zdCBQQVNTV09SRF9FWFBJUkVEX1VSTCA9IGAke0JBU0VfV0VMQ09NRV9VUkx9L3JlbmV3LXBhc3N3b3JkYDtcbmNvbnN0IFNVQ0NFU1NfVVJMID0gYCR7QkFTRV9XRUxDT01FX1VSTH0vaG9tZXBhZ2UvcGVyc29uYWxgO1xuXG5lbnVtIE1heFBsYW5OYW1lIHtcbiAgTm9ybWFsID0gJ9eo15LXmdec15QnLFxuICBJbW1lZGlhdGVDaGFyZ2UgPSAn15fXmdeV15Eg16LXoden15XXqiDXnteZ15nXk9eZJyxcbiAgSW50ZXJuZXRTaG9wcGluZyA9ICfXkNeZ16DXmNeo16DXmC/Xl9eVXCLXnCcsXG4gIEluc3RhbGxtZW50cyA9ICfXqtep15zXldee15nXnScsXG4gIE1vbnRobHlDaGFyZ2UgPSAn15fXmdeV15Eg15fXldeT16nXmScsXG4gIE9uZU1vbnRoUG9zdHBvbmVkID0gJ9eT15fXldeZINeX15XXk9epJyxcbiAgTW9udGhseVBvc3Rwb25lZCA9ICfXk9eX15XXmSDXnNeX15nXldeRINeU15fXldeT16nXmScsXG4gIE1vbnRobHlQYXltZW50ID0gJ9eq16nXnNeV150g15fXldeT16nXmScsXG4gIEZ1dHVyZVB1cmNoYXNlRmluYW5jaW5nID0gJ9ee15nXnteV158g15zXqNeb15nXqdeUINei16rXmdeT15nXqicsXG4gIE1vbnRobHlQb3N0cG9uZWRJbnN0YWxsbWVudHMgPSAn15PXl9eV15kg15fXldeT16kg16rXqdec15XXnteZ150nLFxuICBUaGlydHlEYXlzUGx1cyA9ICfXoteh16fXqiAzMCDXpNec15XXoScsXG4gIFR3b01vbnRoc1Bvc3Rwb25lZCA9ICfXk9eX15XXmSDXl9eV15PXqdeZ15nXnScsXG4gIFR3b01vbnRoc1Bvc3Rwb25lZDIgPSBcIteT15fXldeZIDIg15cnINeq16nXnNeV157XmdedXCIsXG4gIE1vbnRobHlDaGFyZ2VQbHVzSW50ZXJlc3QgPSAn15fXldeT16nXmSArINeo15nXkdeZ16onLFxuICBDcmVkaXQgPSAn16fXqNeT15nXmCcsXG4gIENyZWRpdE91dHNpZGVUaGVMaW1pdCA9ICfXp9eo15PXmdeYLdee15fXldelINec157XodeS16jXqicsXG4gIEFjY3VtdWxhdGluZ0Jhc2tldCA9ICfXodecINee16bXmNeR16gnLFxuICBQb3N0cG9uZWRUcmFuc2FjdGlvbkluc3RhbGxtZW50cyA9ICfXpNeo15nXodeqINeU16LXoden15Qg15TXk9eX15XXmdeUJyxcbiAgUmVwbGFjZW1lbnRDYXJkID0gJ9eb16jXmNeZ16Eg15fXnNeZ16TXmScsXG4gIEVhcmx5UmVwYXltZW50ID0gJ9ek16jXoteV158g157Xlden15PXnScsXG4gIE1vbnRobHlDYXJkRmVlID0gJ9eT157XmSDXm9eo15jXmdehJyxcbiAgQ3VycmVuY3lQb2NrZXQgPSAn15fXmdeV15Eg15DXqNeg16cg157XmNeXJyxcbn1cblxuY29uc3QgSU5WQUxJRF9ERVRBSUxTX1NFTEVDVE9SID0gJyNwb3B1cFdyb25nRGV0YWlscyc7XG5jb25zdCBMT0dJTl9FUlJPUl9TRUxFQ1RPUiA9ICcjcG9wdXBDYXJkSG9sZGVyc0xvZ2luRXJyb3InO1xuXG5jb25zdCBjYXRlZ29yaWVzID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcblxuZnVuY3Rpb24gcmVkaXJlY3RPckRpYWxvZyhwYWdlOiBQYWdlKSB7XG4gIHJldHVybiBQcm9taXNlLnJhY2UoW1xuICAgIHdhaXRGb3JSZWRpcmVjdChwYWdlLCAyMDAwMCwgZmFsc2UsIFtCQVNFX1dFTENPTUVfVVJMLCBgJHtCQVNFX1dFTENPTUVfVVJMfS9gXSksXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIElOVkFMSURfREVUQUlMU19TRUxFQ1RPUiwgdHJ1ZSksXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIExPR0lOX0VSUk9SX1NFTEVDVE9SLCB0cnVlKSxcbiAgXSk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uc1VybChtb250aE1vbWVudDogTW9tZW50KSB7XG4gIGNvbnN0IG1vbnRoID0gbW9udGhNb21lbnQubW9udGgoKSArIDE7XG4gIGNvbnN0IHllYXIgPSBtb250aE1vbWVudC55ZWFyKCk7XG4gIGNvbnN0IGRhdGUgPSBgJHt5ZWFyfS0ke21vbnRofS0wMWA7XG5cbiAgLyoqXG4gICAqIHVybCBleHBsYW5hdGlvbjpcbiAgICogdXNlckluZGV4OiAtMSBmb3IgYWxsIGFjY291bnQgb3duZXJzXG4gICAqIGNhcmRJbmRleDogLTEgZm9yIGFsbCBjYXJkcyB1bmRlciB0aGUgYWNjb3VudFxuICAgKiBhbGwgb3RoZXIgcXVlcnkgcGFyYW1zIGFyZSBzdGF0aWMsIGJlc2lkZSB0aGUgZGF0ZSB3aGljaCBjaGFuZ2VzIGZvciByZXF1ZXN0IHBlciBtb250aFxuICAgKi9cbiAgcmV0dXJuIGJ1aWxkVXJsKEJBU0VfQVBJX0FDVElPTlNfVVJMLCB7XG4gICAgcGF0aDogYC9hcGkvcmVnaXN0ZXJlZC90cmFuc2FjdGlvbkRldGFpbHMvZ2V0VHJhbnNhY3Rpb25zQW5kR3JhcGhzP2ZpbHRlckRhdGE9e1widXNlckluZGV4XCI6LTEsXCJjYXJkSW5kZXhcIjotMSxcIm1vbnRoVmlld1wiOnRydWUsXCJkYXRlXCI6XCIke2RhdGV9XCIsXCJkYXRlc1wiOntcInN0YXJ0RGF0ZVwiOlwiMFwiLFwiZW5kRGF0ZVwiOlwiMFwifSxcImJhbmtBY2NvdW50XCI6e1wiYmFua0FjY291bnRJbmRleFwiOi0xLFwiY2FyZHNcIjpudWxsfX0mZmlyc3RDYWxsQ2FyZEluZGV4PS0xYCxcbiAgfSk7XG59XG5cbmludGVyZmFjZSBGZXRjaENhdGVnb3J5UmVzdWx0IHtcbiAgcmVzdWx0PzogQXJyYXk8e1xuICAgIGlkOiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICB9Pjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZENhdGVnb3JpZXMocGFnZTogUGFnZSkge1xuICBkZWJ1ZygnTG9hZGluZyBjYXRlZ29yaWVzJyk7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoR2V0V2l0aGluUGFnZTxGZXRjaENhdGVnb3J5UmVzdWx0PihwYWdlLCBgJHtCQVNFX0FQSV9BQ1RJT05TX1VSTH0vYXBpL2NvbnRlbnRzL2dldENhdGVnb3JpZXNgKTtcbiAgaWYgKHJlcyAmJiBBcnJheS5pc0FycmF5KHJlcy5yZXN1bHQpKSB7XG4gICAgZGVidWcoYCR7cmVzLnJlc3VsdC5sZW5ndGh9IGNhdGVnb3JpZXMgbG9hZGVkYCk7XG4gICAgcmVzLnJlc3VsdD8uZm9yRWFjaCgoeyBpZCwgbmFtZSB9KSA9PiBjYXRlZ29yaWVzLnNldChpZCwgbmFtZSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uVHlwZShwbGFuTmFtZTogc3RyaW5nLCBwbGFuVHlwZUlkOiBudW1iZXIpIHtcbiAgY29uc3QgY2xlYW5lZFVwVHhuVHlwZVN0ciA9IHBsYW5OYW1lLnJlcGxhY2UoJ1xcdCcsICcgJykudHJpbSgpIGFzIE1heFBsYW5OYW1lO1xuICBzd2l0Y2ggKGNsZWFuZWRVcFR4blR5cGVTdHIpIHtcbiAgICBjYXNlIE1heFBsYW5OYW1lLkltbWVkaWF0ZUNoYXJnZTpcbiAgICBjYXNlIE1heFBsYW5OYW1lLk5vcm1hbDpcbiAgICBjYXNlIE1heFBsYW5OYW1lLk1vbnRobHlDaGFyZ2U6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5PbmVNb250aFBvc3Rwb25lZDpcbiAgICBjYXNlIE1heFBsYW5OYW1lLk1vbnRobHlQb3N0cG9uZWQ6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5GdXR1cmVQdXJjaGFzZUZpbmFuY2luZzpcbiAgICBjYXNlIE1heFBsYW5OYW1lLk1vbnRobHlQYXltZW50OlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuTW9udGhseVBvc3Rwb25lZEluc3RhbGxtZW50czpcbiAgICBjYXNlIE1heFBsYW5OYW1lLlRoaXJ0eURheXNQbHVzOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuVHdvTW9udGhzUG9zdHBvbmVkOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuVHdvTW9udGhzUG9zdHBvbmVkMjpcbiAgICBjYXNlIE1heFBsYW5OYW1lLkFjY3VtdWxhdGluZ0Jhc2tldDpcbiAgICBjYXNlIE1heFBsYW5OYW1lLkludGVybmV0U2hvcHBpbmc6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5Nb250aGx5Q2hhcmdlUGx1c0ludGVyZXN0OlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuUG9zdHBvbmVkVHJhbnNhY3Rpb25JbnN0YWxsbWVudHM6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5SZXBsYWNlbWVudENhcmQ6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5FYXJseVJlcGF5bWVudDpcbiAgICBjYXNlIE1heFBsYW5OYW1lLk1vbnRobHlDYXJkRmVlOlxuICAgIGNhc2UgTWF4UGxhbk5hbWUuQ3VycmVuY3lQb2NrZXQ6XG4gICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlcy5Ob3JtYWw7XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5JbnN0YWxsbWVudHM6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5DcmVkaXQ6XG4gICAgY2FzZSBNYXhQbGFuTmFtZS5DcmVkaXRPdXRzaWRlVGhlTGltaXQ6XG4gICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlcy5JbnN0YWxsbWVudHM7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN3aXRjaCAocGxhblR5cGVJZCkge1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlcy5JbnN0YWxsbWVudHM7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlcy5Ob3JtYWw7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHRyYW5zYWN0aW9uIHR5cGUgJHtjbGVhbmVkVXBUeG5UeXBlU3RyIGFzIHN0cmluZ31gKTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRJbnN0YWxsbWVudHNJbmZvKGNvbW1lbnRzOiBzdHJpbmcpIHtcbiAgaWYgKCFjb21tZW50cykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgbWF0Y2hlcyA9IGNvbW1lbnRzLm1hdGNoKC9cXGQrL2cpO1xuICBpZiAoIW1hdGNoZXMgfHwgbWF0Y2hlcy5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbnVtYmVyOiBwYXJzZUludChtYXRjaGVzWzBdLCAxMCksXG4gICAgdG90YWw6IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hhcmdlZEN1cnJlbmN5KGN1cnJlbmN5SWQ6IG51bWJlciB8IG51bGwpIHtcbiAgc3dpdGNoIChjdXJyZW5jeUlkKSB7XG4gICAgY2FzZSAzNzY6XG4gICAgICByZXR1cm4gU0hFS0VMX0NVUlJFTkNZO1xuICAgIGNhc2UgODQwOlxuICAgICAgcmV0dXJuIERPTExBUl9DVVJSRU5DWTtcbiAgICBjYXNlIDk3ODpcbiAgICAgIHJldHVybiBFVVJPX0NVUlJFTkNZO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZW1vKHtcbiAgY29tbWVudHMsXG4gIGZ1bmRzVHJhbnNmZXJSZWNlaXZlck9yVHJhbnNmZXIsXG4gIGZ1bmRzVHJhbnNmZXJDb21tZW50LFxufTogUGljazxTY3JhcGVkVHJhbnNhY3Rpb24sICdjb21tZW50cycgfCAnZnVuZHNUcmFuc2ZlclJlY2VpdmVyT3JUcmFuc2ZlcicgfCAnZnVuZHNUcmFuc2ZlckNvbW1lbnQnPikge1xuICBpZiAoZnVuZHNUcmFuc2ZlclJlY2VpdmVyT3JUcmFuc2Zlcikge1xuICAgIGNvbnN0IG1lbW8gPSBjb21tZW50cyA/IGAke2NvbW1lbnRzfSAke2Z1bmRzVHJhbnNmZXJSZWNlaXZlck9yVHJhbnNmZXJ9YCA6IGZ1bmRzVHJhbnNmZXJSZWNlaXZlck9yVHJhbnNmZXI7XG4gICAgcmV0dXJuIGZ1bmRzVHJhbnNmZXJDb21tZW50ID8gYCR7bWVtb306ICR7ZnVuZHNUcmFuc2ZlckNvbW1lbnR9YCA6IG1lbW87XG4gIH1cblxuICByZXR1cm4gY29tbWVudHM7XG59XG5cbmZ1bmN0aW9uIG1hcFRyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBTY3JhcGVkVHJhbnNhY3Rpb24pOiBUcmFuc2FjdGlvbiB7XG4gIGNvbnN0IGlzUGVuZGluZyA9IHJhd1RyYW5zYWN0aW9uLnBheW1lbnREYXRlID09PSBudWxsO1xuICBjb25zdCBwcm9jZXNzZWREYXRlID0gbW9tZW50KGlzUGVuZGluZyA/IHJhd1RyYW5zYWN0aW9uLnB1cmNoYXNlRGF0ZSA6IHJhd1RyYW5zYWN0aW9uLnBheW1lbnREYXRlKS50b0lTT1N0cmluZygpO1xuICBjb25zdCBzdGF0dXMgPSBpc1BlbmRpbmcgPyBUcmFuc2FjdGlvblN0YXR1c2VzLlBlbmRpbmcgOiBUcmFuc2FjdGlvblN0YXR1c2VzLkNvbXBsZXRlZDtcblxuICBjb25zdCBpbnN0YWxsbWVudHMgPSBnZXRJbnN0YWxsbWVudHNJbmZvKHJhd1RyYW5zYWN0aW9uLmNvbW1lbnRzKTtcbiAgY29uc3QgaWRlbnRpZmllciA9IGluc3RhbGxtZW50c1xuICAgID8gYCR7cmF3VHJhbnNhY3Rpb24uZGVhbERhdGE/LmFybn1fJHtpbnN0YWxsbWVudHMubnVtYmVyfWBcbiAgICA6IHJhd1RyYW5zYWN0aW9uLmRlYWxEYXRhPy5hcm47XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBnZXRUcmFuc2FjdGlvblR5cGUocmF3VHJhbnNhY3Rpb24ucGxhbk5hbWUsIHJhd1RyYW5zYWN0aW9uLnBsYW5UeXBlSWQpLFxuICAgIGRhdGU6IG1vbWVudChyYXdUcmFuc2FjdGlvbi5wdXJjaGFzZURhdGUpLnRvSVNPU3RyaW5nKCksXG4gICAgcHJvY2Vzc2VkRGF0ZSxcbiAgICBvcmlnaW5hbEFtb3VudDogLXJhd1RyYW5zYWN0aW9uLm9yaWdpbmFsQW1vdW50LFxuICAgIG9yaWdpbmFsQ3VycmVuY3k6IHJhd1RyYW5zYWN0aW9uLm9yaWdpbmFsQ3VycmVuY3ksXG4gICAgY2hhcmdlZEFtb3VudDogLXJhd1RyYW5zYWN0aW9uLmFjdHVhbFBheW1lbnRBbW91bnQsXG4gICAgY2hhcmdlZEN1cnJlbmN5OiBnZXRDaGFyZ2VkQ3VycmVuY3kocmF3VHJhbnNhY3Rpb24ucGF5bWVudEN1cnJlbmN5KSxcbiAgICBkZXNjcmlwdGlvbjogcmF3VHJhbnNhY3Rpb24ubWVyY2hhbnROYW1lLnRyaW0oKSxcbiAgICBtZW1vOiBnZXRNZW1vKHJhd1RyYW5zYWN0aW9uKSxcbiAgICBjYXRlZ29yeTogY2F0ZWdvcmllcy5nZXQocmF3VHJhbnNhY3Rpb24/LmNhdGVnb3J5SWQpLFxuICAgIGluc3RhbGxtZW50cyxcbiAgICBpZGVudGlmaWVyLFxuICAgIHN0YXR1cyxcbiAgfTtcbn1cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb25zUmVzdWx0IHtcbiAgcmVzdWx0Pzoge1xuICAgIHRyYW5zYWN0aW9uczogU2NyYXBlZFRyYW5zYWN0aW9uW107XG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoVHJhbnNhY3Rpb25zRm9yTW9udGgocGFnZTogUGFnZSwgbW9udGhNb21lbnQ6IE1vbWVudCkge1xuICBjb25zdCB1cmwgPSBnZXRUcmFuc2FjdGlvbnNVcmwobW9udGhNb21lbnQpO1xuXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaEdldFdpdGhpblBhZ2U8U2NyYXBlZFRyYW5zYWN0aW9uc1Jlc3VsdD4ocGFnZSwgdXJsKTtcbiAgY29uc3QgdHJhbnNhY3Rpb25zQnlBY2NvdW50OiBSZWNvcmQ8c3RyaW5nLCBUcmFuc2FjdGlvbltdPiA9IHt9O1xuXG4gIGlmICghZGF0YSB8fCAhZGF0YS5yZXN1bHQpIHJldHVybiB0cmFuc2FjdGlvbnNCeUFjY291bnQ7XG5cbiAgZGF0YS5yZXN1bHQudHJhbnNhY3Rpb25zXG4gICAgLy8gRmlsdGVyIG91dCBub24tdHJhbnNhY3Rpb25zIHdpdGhvdXQgYSBwbGFuIHR5cGUsIGUuZy4gc3VtbWFyeSByb3dzXG4gICAgLmZpbHRlcih0cmFuc2FjdGlvbiA9PiAhIXRyYW5zYWN0aW9uLnBsYW5OYW1lKVxuICAgIC5mb3JFYWNoKCh0cmFuc2FjdGlvbjogU2NyYXBlZFRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICBpZiAoIXRyYW5zYWN0aW9uc0J5QWNjb3VudFt0cmFuc2FjdGlvbi5zaG9ydENhcmROdW1iZXJdKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uc0J5QWNjb3VudFt0cmFuc2FjdGlvbi5zaG9ydENhcmROdW1iZXJdID0gW107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hcHBlZFRyYW5zYWN0aW9uID0gbWFwVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pO1xuICAgICAgdHJhbnNhY3Rpb25zQnlBY2NvdW50W3RyYW5zYWN0aW9uLnNob3J0Q2FyZE51bWJlcl0ucHVzaChtYXBwZWRUcmFuc2FjdGlvbik7XG4gICAgfSk7XG5cbiAgcmV0dXJuIHRyYW5zYWN0aW9uc0J5QWNjb3VudDtcbn1cblxuZnVuY3Rpb24gYWRkUmVzdWx0KGFsbFJlc3VsdHM6IFJlY29yZDxzdHJpbmcsIFRyYW5zYWN0aW9uW10+LCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIFRyYW5zYWN0aW9uW10+KSB7XG4gIGNvbnN0IGNsb25lZFJlc3VsdHM6IFJlY29yZDxzdHJpbmcsIFRyYW5zYWN0aW9uW10+ID0geyAuLi5hbGxSZXN1bHRzIH07XG4gIE9iamVjdC5rZXlzKHJlc3VsdCkuZm9yRWFjaChhY2NvdW50TnVtYmVyID0+IHtcbiAgICBpZiAoIWNsb25lZFJlc3VsdHNbYWNjb3VudE51bWJlcl0pIHtcbiAgICAgIGNsb25lZFJlc3VsdHNbYWNjb3VudE51bWJlcl0gPSBbXTtcbiAgICB9XG4gICAgY2xvbmVkUmVzdWx0c1thY2NvdW50TnVtYmVyXS5wdXNoKC4uLnJlc3VsdFthY2NvdW50TnVtYmVyXSk7XG4gIH0pO1xuICByZXR1cm4gY2xvbmVkUmVzdWx0cztcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRyYW5zYWN0aW9ucyhcbiAgdHhuczogVHJhbnNhY3Rpb25bXSxcbiAgc3RhcnRNb21lbnQ6IG1vbWVudC5Nb21lbnQsXG4gIGNvbWJpbmVJbnN0YWxsbWVudHM6IGJvb2xlYW4sXG4gIGVuYWJsZVRyYW5zYWN0aW9uc0ZpbHRlckJ5RGF0ZTogYm9vbGVhbixcbikge1xuICBsZXQgY2xvbmVkVHhucyA9IEFycmF5LmZyb20odHhucyk7XG4gIGlmICghY29tYmluZUluc3RhbGxtZW50cykge1xuICAgIGNsb25lZFR4bnMgPSBmaXhJbnN0YWxsbWVudHMoY2xvbmVkVHhucyk7XG4gIH1cbiAgY2xvbmVkVHhucyA9IHNvcnRUcmFuc2FjdGlvbnNCeURhdGUoY2xvbmVkVHhucyk7XG4gIGNsb25lZFR4bnMgPSBlbmFibGVUcmFuc2FjdGlvbnNGaWx0ZXJCeURhdGVcbiAgICA/IGZpbHRlck9sZFRyYW5zYWN0aW9ucyhjbG9uZWRUeG5zLCBzdGFydE1vbWVudCwgY29tYmluZUluc3RhbGxtZW50cyB8fCBmYWxzZSlcbiAgICA6IGNsb25lZFR4bnM7XG4gIHJldHVybiBjbG9uZWRUeG5zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFRyYW5zYWN0aW9ucyhwYWdlOiBQYWdlLCBvcHRpb25zOiBTY3JhcGVyT3B0aW9ucykge1xuICBjb25zdCBmdXR1cmVNb250aHNUb1NjcmFwZSA9IG9wdGlvbnMuZnV0dXJlTW9udGhzVG9TY3JhcGUgPz8gMTtcbiAgY29uc3QgZGVmYXVsdFN0YXJ0TW9tZW50ID0gbW9tZW50KCkuc3VidHJhY3QoMSwgJ3llYXJzJyk7XG4gIGNvbnN0IHN0YXJ0TW9tZW50TGltaXQgPSBtb21lbnQoKS5zdWJ0cmFjdCg0LCAneWVhcnMnKTtcbiAgY29uc3Qgc3RhcnREYXRlID0gb3B0aW9ucy5zdGFydERhdGUgfHwgZGVmYXVsdFN0YXJ0TW9tZW50LnRvRGF0ZSgpO1xuICBjb25zdCBzdGFydE1vbWVudCA9IG1vbWVudC5tYXgoc3RhcnRNb21lbnRMaW1pdCwgbW9tZW50KHN0YXJ0RGF0ZSkpO1xuICBjb25zdCBhbGxNb250aHMgPSBnZXRBbGxNb250aE1vbWVudHMoc3RhcnRNb21lbnQsIGZ1dHVyZU1vbnRoc1RvU2NyYXBlKTtcblxuICBhd2FpdCBsb2FkQ2F0ZWdvcmllcyhwYWdlKTtcblxuICBsZXQgYWxsUmVzdWx0czogUmVjb3JkPHN0cmluZywgVHJhbnNhY3Rpb25bXT4gPSB7fTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxNb250aHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaFRyYW5zYWN0aW9uc0Zvck1vbnRoKHBhZ2UsIGFsbE1vbnRoc1tpXSk7XG4gICAgYWxsUmVzdWx0cyA9IGFkZFJlc3VsdChhbGxSZXN1bHRzLCByZXN1bHQpO1xuICB9XG5cbiAgT2JqZWN0LmtleXMoYWxsUmVzdWx0cykuZm9yRWFjaChhY2NvdW50TnVtYmVyID0+IHtcbiAgICBsZXQgdHhucyA9IGFsbFJlc3VsdHNbYWNjb3VudE51bWJlcl07XG4gICAgdHhucyA9IHByZXBhcmVUcmFuc2FjdGlvbnMoXG4gICAgICB0eG5zLFxuICAgICAgc3RhcnRNb21lbnQsXG4gICAgICBvcHRpb25zLmNvbWJpbmVJbnN0YWxsbWVudHMgfHwgZmFsc2UsXG4gICAgICBvcHRpb25zLm91dHB1dERhdGE/LmVuYWJsZVRyYW5zYWN0aW9uc0ZpbHRlckJ5RGF0ZSA/PyB0cnVlLFxuICAgICk7XG4gICAgYWxsUmVzdWx0c1thY2NvdW50TnVtYmVyXSA9IHR4bnM7XG4gIH0pO1xuXG4gIHJldHVybiBhbGxSZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cyhwYWdlOiBQYWdlKTogUG9zc2libGVMb2dpblJlc3VsdHMge1xuICBjb25zdCB1cmxzOiBQb3NzaWJsZUxvZ2luUmVzdWx0cyA9IHt9O1xuICB1cmxzW0xvZ2luUmVzdWx0cy5TdWNjZXNzXSA9IFtTVUNDRVNTX1VSTF07XG4gIHVybHNbTG9naW5SZXN1bHRzLkNoYW5nZVBhc3N3b3JkXSA9IFtQQVNTV09SRF9FWFBJUkVEX1VSTF07XG4gIHVybHNbTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZF0gPSBbXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsIElOVkFMSURfREVUQUlMU19TRUxFQ1RPUik7XG4gICAgfSxcbiAgXTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuVW5rbm93bkVycm9yXSA9IFtcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gZWxlbWVudFByZXNlbnRPblBhZ2UocGFnZSwgTE9HSU5fRVJST1JfU0VMRUNUT1IpO1xuICAgIH0sXG4gIF07XG4gIHJldHVybiB1cmxzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgcmV0dXJuIFtcbiAgICB7IHNlbGVjdG9yOiAnI3VzZXItbmFtZScsIHZhbHVlOiBjcmVkZW50aWFscy51c2VybmFtZSB9LFxuICAgIHsgc2VsZWN0b3I6ICcjcGFzc3dvcmQnLCB2YWx1ZTogY3JlZGVudGlhbHMucGFzc3dvcmQgfSxcbiAgXTtcbn1cblxudHlwZSBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyA9IHsgdXNlcm5hbWU6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9O1xuXG5jbGFzcyBNYXhTY3JhcGVyIGV4dGVuZHMgQmFzZVNjcmFwZXJXaXRoQnJvd3NlcjxTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscz4ge1xuICBnZXRMb2dpbk9wdGlvbnMoY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKTogTG9naW5PcHRpb25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9naW5Vcmw6IExPR0lOX1VSTCxcbiAgICAgIGZpZWxkczogY3JlYXRlTG9naW5GaWVsZHMoY3JlZGVudGlhbHMpLFxuICAgICAgc3VibWl0QnV0dG9uU2VsZWN0b3I6ICdhcHAtdXNlci1sb2dpbi1mb3JtIC5nZW5lcmFsLWJ1dHRvbi5zZW5kLW1lLWNvZGUnLFxuICAgICAgcHJlQWN0aW9uOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChhd2FpdCBlbGVtZW50UHJlc2VudE9uUGFnZSh0aGlzLnBhZ2UsICcjY2xvc2VQb3B1cCcpKSB7XG4gICAgICAgICAgYXdhaXQgY2xpY2tCdXR0b24odGhpcy5wYWdlLCAnI2Nsb3NlUG9wdXAnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjbGlja0J1dHRvbih0aGlzLnBhZ2UsICcucGVyc29uYWwtYXJlYSA+IGEuZ28tdG8tcGVyc29uYWwtYXJlYScpO1xuICAgICAgICBpZiAoYXdhaXQgZWxlbWVudFByZXNlbnRPblBhZ2UodGhpcy5wYWdlLCAnLmxvZ2luLWxpbmsjcHJpdmF0ZScpKSB7XG4gICAgICAgICAgYXdhaXQgY2xpY2tCdXR0b24odGhpcy5wYWdlLCAnLmxvZ2luLWxpbmsjcHJpdmF0ZScpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZCh0aGlzLnBhZ2UsICcjbG9naW4tcGFzc3dvcmQtbGluaycsIHRydWUpO1xuICAgICAgICBhd2FpdCBjbGlja0J1dHRvbih0aGlzLnBhZ2UsICcjbG9naW4tcGFzc3dvcmQtbGluaycpO1xuICAgICAgICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQodGhpcy5wYWdlLCAnI2xvZ2luLXBhc3N3b3JkLnRhYi1wYW5lLmFjdGl2ZSBhcHAtdXNlci1sb2dpbi1mb3JtJywgdHJ1ZSk7XG4gICAgICB9LFxuICAgICAgY2hlY2tSZWFkaW5lc3M6IGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHRoaXMucGFnZSwgJy5wZXJzb25hbC1hcmVhID4gYS5nby10by1wZXJzb25hbC1hcmVhJywgdHJ1ZSk7XG4gICAgICB9LFxuICAgICAgcG9zdEFjdGlvbjogYXN5bmMgKCkgPT4gcmVkaXJlY3RPckRpYWxvZyh0aGlzLnBhZ2UpLFxuICAgICAgcG9zc2libGVSZXN1bHRzOiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cyh0aGlzLnBhZ2UpLFxuICAgICAgd2FpdFVudGlsOiAnZG9tY29udGVudGxvYWRlZCcsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoRGF0YSgpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgZmV0Y2hUcmFuc2FjdGlvbnModGhpcy5wYWdlLCB0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IGFjY291bnRzID0gT2JqZWN0LmtleXMocmVzdWx0cykubWFwKGFjY291bnROdW1iZXIgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWNjb3VudE51bWJlcixcbiAgICAgICAgdHhuczogcmVzdWx0c1thY2NvdW50TnVtYmVyXSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGFjY291bnRzLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWF4U2NyYXBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLElBQUFBLFNBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFFLFVBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLHFCQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxNQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxXQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxhQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxjQUFBLEdBQUFULE9BQUE7QUFDQSxJQUFB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
|