israeli-bank-scrapers 6.0.0 → 6.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +1 -0
  2. package/lib/assertNever.js +5 -7
  3. package/lib/constants.js +13 -16
  4. package/lib/definitions.js +109 -113
  5. package/lib/helpers/browser.d.ts +8 -0
  6. package/lib/helpers/browser.js +14 -11
  7. package/lib/helpers/dates.js +18 -19
  8. package/lib/helpers/debug.js +9 -9
  9. package/lib/helpers/elements-interactions.js +78 -84
  10. package/lib/helpers/fetch.js +82 -89
  11. package/lib/helpers/navigation.js +24 -31
  12. package/lib/helpers/storage.js +10 -12
  13. package/lib/helpers/transactions.js +33 -35
  14. package/lib/helpers/waiting.js +45 -44
  15. package/lib/index.js +15 -82
  16. package/lib/scrapers/amex.js +11 -13
  17. package/lib/scrapers/base-beinleumi-group.js +233 -252
  18. package/lib/scrapers/base-isracard-amex.js +273 -286
  19. package/lib/scrapers/base-scraper-with-browser.d.ts +2 -1
  20. package/lib/scrapers/base-scraper-with-browser.js +240 -269
  21. package/lib/scrapers/base-scraper.js +82 -86
  22. package/lib/scrapers/behatsdaa.js +98 -107
  23. package/lib/scrapers/beinleumi.js +11 -20
  24. package/lib/scrapers/beyahad-bishvilha.js +132 -138
  25. package/lib/scrapers/discount.js +97 -103
  26. package/lib/scrapers/errors.js +22 -25
  27. package/lib/scrapers/factory.js +66 -67
  28. package/lib/scrapers/hapoalim.js +162 -182
  29. package/lib/scrapers/interface.d.ts +12 -0
  30. package/lib/scrapers/interface.js +2 -5
  31. package/lib/scrapers/isracard.js +11 -13
  32. package/lib/scrapers/leumi.js +167 -176
  33. package/lib/scrapers/massad.js +11 -20
  34. package/lib/scrapers/max.js +256 -268
  35. package/lib/scrapers/mercantile.js +14 -20
  36. package/lib/scrapers/mizrahi.js +158 -159
  37. package/lib/scrapers/one-zero-queries.js +4 -7
  38. package/lib/scrapers/one-zero.js +176 -240
  39. package/lib/scrapers/otsar-hahayal.js +11 -20
  40. package/lib/scrapers/pagi.js +11 -20
  41. package/lib/scrapers/union-bank.js +172 -179
  42. package/lib/scrapers/visa-cal.js +254 -263
  43. package/lib/scrapers/yahav.js +190 -211
  44. package/lib/transactions.js +13 -16
  45. package/package.json +12 -14
  46. package/lib/scrapers/amex.test.d.ts +0 -1
  47. package/lib/scrapers/amex.test.js +0 -54
  48. package/lib/scrapers/base-scraper-with-browser.test.d.ts +0 -1
  49. package/lib/scrapers/base-scraper-with-browser.test.js +0 -58
  50. package/lib/scrapers/behatsdaa.test.d.ts +0 -1
  51. package/lib/scrapers/behatsdaa.test.js +0 -50
  52. package/lib/scrapers/beinleumi.test.d.ts +0 -1
  53. package/lib/scrapers/beinleumi.test.js +0 -52
  54. package/lib/scrapers/beyahad-bishvilha.test.d.ts +0 -1
  55. package/lib/scrapers/beyahad-bishvilha.test.js +0 -52
  56. package/lib/scrapers/discount.test.d.ts +0 -1
  57. package/lib/scrapers/discount.test.js +0 -54
  58. package/lib/scrapers/factory.test.d.ts +0 -1
  59. package/lib/scrapers/factory.test.js +0 -19
  60. package/lib/scrapers/hapoalim.test.d.ts +0 -1
  61. package/lib/scrapers/hapoalim.test.js +0 -52
  62. package/lib/scrapers/isracard.test.d.ts +0 -1
  63. package/lib/scrapers/isracard.test.js +0 -54
  64. package/lib/scrapers/leumi.test.d.ts +0 -1
  65. package/lib/scrapers/leumi.test.js +0 -52
  66. package/lib/scrapers/max.test.d.ts +0 -1
  67. package/lib/scrapers/max.test.js +0 -71
  68. package/lib/scrapers/mercantile.test.d.ts +0 -1
  69. package/lib/scrapers/mercantile.test.js +0 -50
  70. package/lib/scrapers/mizrahi.test.d.ts +0 -1
  71. package/lib/scrapers/mizrahi.test.js +0 -58
  72. package/lib/scrapers/one-zero.test.d.ts +0 -1
  73. package/lib/scrapers/one-zero.test.js +0 -56
  74. package/lib/scrapers/otsar-hahayal.test.d.ts +0 -1
  75. package/lib/scrapers/otsar-hahayal.test.js +0 -52
  76. package/lib/scrapers/pagi.test.d.ts +0 -1
  77. package/lib/scrapers/pagi.test.js +0 -52
  78. package/lib/scrapers/union-bank.test.d.ts +0 -1
  79. package/lib/scrapers/union-bank.test.js +0 -52
  80. package/lib/scrapers/visa-cal.test.d.ts +0 -1
  81. package/lib/scrapers/visa-cal.test.js +0 -54
  82. package/lib/scrapers/yahav.test.d.ts +0 -1
  83. package/lib/scrapers/yahav.test.js +0 -54
@@ -1,331 +1,318 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- require("core-js/modules/es.array.iterator.js");
8
- require("core-js/modules/es.promise.js");
9
- require("core-js/modules/es.regexp.exec.js");
10
- require("core-js/modules/es.string.trim.js");
11
- var _buildUrl = _interopRequireDefault(require("build-url"));
12
- var _lodash = _interopRequireDefault(require("lodash"));
13
- var _moment = _interopRequireDefault(require("moment"));
14
- var _constants = require("../constants");
15
- var _definitions = require("../definitions");
16
- var _dates = _interopRequireDefault(require("../helpers/dates"));
17
- var _debug = require("../helpers/debug");
18
- var _fetch = require("../helpers/fetch");
19
- var _transactions = require("../helpers/transactions");
20
- var _waiting = require("../helpers/waiting");
21
- var _transactions2 = require("../transactions");
22
- var _baseScraperWithBrowser = require("./base-scraper-with-browser");
23
- var _errors = require("./errors");
24
- var _browser = require("../helpers/browser");
25
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
26
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
27
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
28
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
29
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
30
- function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const build_url_1 = __importDefault(require("build-url"));
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const moment_1 = __importDefault(require("moment"));
9
+ const constants_1 = require("../constants");
10
+ const definitions_1 = require("../definitions");
11
+ const dates_1 = __importDefault(require("../helpers/dates"));
12
+ const debug_1 = require("../helpers/debug");
13
+ const fetch_1 = require("../helpers/fetch");
14
+ const transactions_1 = require("../helpers/transactions");
15
+ const waiting_1 = require("../helpers/waiting");
16
+ const transactions_2 = require("../transactions");
17
+ const base_scraper_with_browser_1 = require("./base-scraper-with-browser");
18
+ const errors_1 = require("./errors");
19
+ const browser_1 = require("../helpers/browser");
31
20
  const COUNTRY_CODE = '212';
32
21
  const ID_TYPE = '1';
33
22
  const INSTALLMENTS_KEYWORD = 'תשלום';
34
23
  const DATE_FORMAT = 'DD/MM/YYYY';
35
- const debug = (0, _debug.getDebug)('base-isracard-amex');
24
+ const debug = (0, debug_1.getDebug)('base-isracard-amex');
36
25
  function getAccountsUrl(servicesUrl, monthMoment) {
37
- const billingDate = monthMoment.format('YYYY-MM-DD');
38
- return (0, _buildUrl.default)(servicesUrl, {
39
- queryParams: {
40
- reqName: 'DashboardMonth',
41
- actionCode: '0',
42
- billingDate,
43
- format: 'Json'
44
- }
45
- });
26
+ const billingDate = monthMoment.format('YYYY-MM-DD');
27
+ return (0, build_url_1.default)(servicesUrl, {
28
+ queryParams: {
29
+ reqName: 'DashboardMonth',
30
+ actionCode: '0',
31
+ billingDate,
32
+ format: 'Json',
33
+ },
34
+ });
46
35
  }
47
36
  async function fetchAccounts(page, servicesUrl, monthMoment) {
48
- const dataUrl = getAccountsUrl(servicesUrl, monthMoment);
49
- const dataResult = await (0, _fetch.fetchGetWithinPage)(page, dataUrl);
50
- if (dataResult && _lodash.default.get(dataResult, 'Header.Status') === '1' && dataResult.DashboardMonthBean) {
51
- const {
52
- cardsCharges
53
- } = dataResult.DashboardMonthBean;
54
- if (cardsCharges) {
55
- return cardsCharges.map(cardCharge => {
56
- return {
57
- index: parseInt(cardCharge.cardIndex, 10),
58
- accountNumber: cardCharge.cardNumber,
59
- processedDate: (0, _moment.default)(cardCharge.billingDate, DATE_FORMAT).toISOString()
60
- };
61
- });
37
+ const dataUrl = getAccountsUrl(servicesUrl, monthMoment);
38
+ const dataResult = await (0, fetch_1.fetchGetWithinPage)(page, dataUrl);
39
+ if (dataResult && lodash_1.default.get(dataResult, 'Header.Status') === '1' && dataResult.DashboardMonthBean) {
40
+ const { cardsCharges } = dataResult.DashboardMonthBean;
41
+ if (cardsCharges) {
42
+ return cardsCharges.map(cardCharge => {
43
+ return {
44
+ index: parseInt(cardCharge.cardIndex, 10),
45
+ accountNumber: cardCharge.cardNumber,
46
+ processedDate: (0, moment_1.default)(cardCharge.billingDate, DATE_FORMAT).toISOString(),
47
+ };
48
+ });
49
+ }
62
50
  }
63
- }
64
- return [];
51
+ return [];
65
52
  }
66
53
  function getTransactionsUrl(servicesUrl, monthMoment) {
67
- const month = monthMoment.month() + 1;
68
- const year = monthMoment.year();
69
- const monthStr = month < 10 ? `0${month}` : month.toString();
70
- return (0, _buildUrl.default)(servicesUrl, {
71
- queryParams: {
72
- reqName: 'CardsTransactionsList',
73
- month: monthStr,
74
- year: `${year}`,
75
- requiredDate: 'N'
76
- }
77
- });
54
+ const month = monthMoment.month() + 1;
55
+ const year = monthMoment.year();
56
+ const monthStr = month < 10 ? `0${month}` : month.toString();
57
+ return (0, build_url_1.default)(servicesUrl, {
58
+ queryParams: {
59
+ reqName: 'CardsTransactionsList',
60
+ month: monthStr,
61
+ year: `${year}`,
62
+ requiredDate: 'N',
63
+ },
64
+ });
78
65
  }
79
66
  function convertCurrency(currencyStr) {
80
- if (currencyStr === _constants.SHEKEL_CURRENCY_KEYWORD || currencyStr === _constants.ALT_SHEKEL_CURRENCY) {
81
- return _constants.SHEKEL_CURRENCY;
82
- }
83
- return currencyStr;
67
+ if (currencyStr === constants_1.SHEKEL_CURRENCY_KEYWORD || currencyStr === constants_1.ALT_SHEKEL_CURRENCY) {
68
+ return constants_1.SHEKEL_CURRENCY;
69
+ }
70
+ return currencyStr;
84
71
  }
85
72
  function getInstallmentsInfo(txn) {
86
- if (!txn.moreInfo || !txn.moreInfo.includes(INSTALLMENTS_KEYWORD)) {
87
- return undefined;
88
- }
89
- const matches = txn.moreInfo.match(/\d+/g);
90
- if (!matches || matches.length < 2) {
91
- return undefined;
92
- }
93
- return {
94
- number: parseInt(matches[0], 10),
95
- total: parseInt(matches[1], 10)
96
- };
73
+ if (!txn.moreInfo || !txn.moreInfo.includes(INSTALLMENTS_KEYWORD)) {
74
+ return undefined;
75
+ }
76
+ const matches = txn.moreInfo.match(/\d+/g);
77
+ if (!matches || matches.length < 2) {
78
+ return undefined;
79
+ }
80
+ return {
81
+ number: parseInt(matches[0], 10),
82
+ total: parseInt(matches[1], 10),
83
+ };
97
84
  }
98
85
  function getTransactionType(txn) {
99
- return getInstallmentsInfo(txn) ? _transactions2.TransactionTypes.Installments : _transactions2.TransactionTypes.Normal;
86
+ return getInstallmentsInfo(txn) ? transactions_2.TransactionTypes.Installments : transactions_2.TransactionTypes.Normal;
100
87
  }
101
88
  function convertTransactions(txns, processedDate) {
102
- const filteredTxns = txns.filter(txn => txn.dealSumType !== '1' && txn.voucherNumberRatz !== '000000000' && txn.voucherNumberRatzOutbound !== '000000000');
103
- return filteredTxns.map(txn => {
104
- var _txn$currentPaymentCu;
105
- const isOutbound = txn.dealSumOutbound;
106
- const txnDateStr = isOutbound ? txn.fullPurchaseDateOutbound : txn.fullPurchaseDate;
107
- const txnMoment = (0, _moment.default)(txnDateStr, DATE_FORMAT);
108
- const currentProcessedDate = txn.fullPaymentDate ? (0, _moment.default)(txn.fullPaymentDate, DATE_FORMAT).toISOString() : processedDate;
109
- const result = {
110
- type: getTransactionType(txn),
111
- identifier: parseInt(isOutbound ? txn.voucherNumberRatzOutbound : txn.voucherNumberRatz, 10),
112
- date: txnMoment.toISOString(),
113
- processedDate: currentProcessedDate,
114
- originalAmount: isOutbound ? -txn.dealSumOutbound : -txn.dealSum,
115
- originalCurrency: convertCurrency((_txn$currentPaymentCu = txn.currentPaymentCurrency) !== null && _txn$currentPaymentCu !== void 0 ? _txn$currentPaymentCu : txn.currencyId),
116
- chargedAmount: isOutbound ? -txn.paymentSumOutbound : -txn.paymentSum,
117
- chargedCurrency: convertCurrency(txn.currencyId),
118
- description: isOutbound ? txn.fullSupplierNameOutbound : txn.fullSupplierNameHeb,
119
- memo: txn.moreInfo || '',
120
- installments: getInstallmentsInfo(txn) || undefined,
121
- status: _transactions2.TransactionStatuses.Completed
122
- };
123
- return result;
124
- });
89
+ const filteredTxns = txns.filter(txn => txn.dealSumType !== '1' && txn.voucherNumberRatz !== '000000000' && txn.voucherNumberRatzOutbound !== '000000000');
90
+ return filteredTxns.map(txn => {
91
+ const isOutbound = txn.dealSumOutbound;
92
+ const txnDateStr = isOutbound ? txn.fullPurchaseDateOutbound : txn.fullPurchaseDate;
93
+ const txnMoment = (0, moment_1.default)(txnDateStr, DATE_FORMAT);
94
+ const currentProcessedDate = txn.fullPaymentDate
95
+ ? (0, moment_1.default)(txn.fullPaymentDate, DATE_FORMAT).toISOString()
96
+ : processedDate;
97
+ const result = {
98
+ type: getTransactionType(txn),
99
+ identifier: parseInt(isOutbound ? txn.voucherNumberRatzOutbound : txn.voucherNumberRatz, 10),
100
+ date: txnMoment.toISOString(),
101
+ processedDate: currentProcessedDate,
102
+ originalAmount: isOutbound ? -txn.dealSumOutbound : -txn.dealSum,
103
+ originalCurrency: convertCurrency(txn.currentPaymentCurrency ?? txn.currencyId),
104
+ chargedAmount: isOutbound ? -txn.paymentSumOutbound : -txn.paymentSum,
105
+ chargedCurrency: convertCurrency(txn.currencyId),
106
+ description: isOutbound ? txn.fullSupplierNameOutbound : txn.fullSupplierNameHeb,
107
+ memo: txn.moreInfo || '',
108
+ installments: getInstallmentsInfo(txn) || undefined,
109
+ status: transactions_2.TransactionStatuses.Completed,
110
+ };
111
+ return result;
112
+ });
125
113
  }
126
114
  async function fetchTransactions(page, options, companyServiceOptions, startMoment, monthMoment) {
127
- const accounts = await fetchAccounts(page, companyServiceOptions.servicesUrl, monthMoment);
128
- const dataUrl = getTransactionsUrl(companyServiceOptions.servicesUrl, monthMoment);
129
- const dataResult = await (0, _fetch.fetchGetWithinPage)(page, dataUrl);
130
- if (dataResult && _lodash.default.get(dataResult, 'Header.Status') === '1' && dataResult.CardsTransactionsListBean) {
131
- const accountTxns = {};
132
- accounts.forEach(account => {
133
- const txnGroups = _lodash.default.get(dataResult, `CardsTransactionsListBean.Index${account.index}.CurrentCardTransactions`);
134
- if (txnGroups) {
135
- var _options$outputData$e, _options$outputData;
136
- let allTxns = [];
137
- txnGroups.forEach(txnGroup => {
138
- if (txnGroup.txnIsrael) {
139
- const txns = convertTransactions(txnGroup.txnIsrael, account.processedDate);
140
- allTxns.push(...txns);
141
- }
142
- if (txnGroup.txnAbroad) {
143
- const txns = convertTransactions(txnGroup.txnAbroad, account.processedDate);
144
- allTxns.push(...txns);
145
- }
115
+ const accounts = await fetchAccounts(page, companyServiceOptions.servicesUrl, monthMoment);
116
+ const dataUrl = getTransactionsUrl(companyServiceOptions.servicesUrl, monthMoment);
117
+ const dataResult = await (0, fetch_1.fetchGetWithinPage)(page, dataUrl);
118
+ if (dataResult && lodash_1.default.get(dataResult, 'Header.Status') === '1' && dataResult.CardsTransactionsListBean) {
119
+ const accountTxns = {};
120
+ accounts.forEach(account => {
121
+ const txnGroups = lodash_1.default.get(dataResult, `CardsTransactionsListBean.Index${account.index}.CurrentCardTransactions`);
122
+ if (txnGroups) {
123
+ let allTxns = [];
124
+ txnGroups.forEach(txnGroup => {
125
+ if (txnGroup.txnIsrael) {
126
+ const txns = convertTransactions(txnGroup.txnIsrael, account.processedDate);
127
+ allTxns.push(...txns);
128
+ }
129
+ if (txnGroup.txnAbroad) {
130
+ const txns = convertTransactions(txnGroup.txnAbroad, account.processedDate);
131
+ allTxns.push(...txns);
132
+ }
133
+ });
134
+ if (!options.combineInstallments) {
135
+ allTxns = (0, transactions_1.fixInstallments)(allTxns);
136
+ }
137
+ if (options.outputData?.enableTransactionsFilterByDate ?? true) {
138
+ allTxns = (0, transactions_1.filterOldTransactions)(allTxns, startMoment, options.combineInstallments || false);
139
+ }
140
+ accountTxns[account.accountNumber] = {
141
+ accountNumber: account.accountNumber,
142
+ index: account.index,
143
+ txns: allTxns,
144
+ };
145
+ }
146
146
  });
147
- if (!options.combineInstallments) {
148
- allTxns = (0, _transactions.fixInstallments)(allTxns);
149
- }
150
- if ((_options$outputData$e = (_options$outputData = options.outputData) === null || _options$outputData === void 0 ? void 0 : _options$outputData.enableTransactionsFilterByDate) !== null && _options$outputData$e !== void 0 ? _options$outputData$e : true) {
151
- allTxns = (0, _transactions.filterOldTransactions)(allTxns, startMoment, options.combineInstallments || false);
152
- }
153
- accountTxns[account.accountNumber] = {
154
- accountNumber: account.accountNumber,
155
- index: account.index,
156
- txns: allTxns
157
- };
158
- }
159
- });
160
- return accountTxns;
161
- }
162
- return {};
147
+ return accountTxns;
148
+ }
149
+ return {};
163
150
  }
164
151
  function getTransactionExtraDetails(servicesUrl, month, accountIndex, transaction) {
165
- const moedChiuv = month.format('MMYYYY');
166
- return (0, _buildUrl.default)(servicesUrl, {
167
- queryParams: {
168
- reqName: 'PirteyIska_204',
169
- CardIndex: accountIndex.toString(),
170
- shovarRatz: transaction.identifier.toString(),
171
- moedChiuv
172
- }
173
- });
152
+ const moedChiuv = month.format('MMYYYY');
153
+ return (0, build_url_1.default)(servicesUrl, {
154
+ queryParams: {
155
+ reqName: 'PirteyIska_204',
156
+ CardIndex: accountIndex.toString(),
157
+ shovarRatz: transaction.identifier.toString(),
158
+ moedChiuv,
159
+ },
160
+ });
174
161
  }
175
162
  async function getExtraScrapTransaction(page, options, month, accountIndex, transaction) {
176
- var _$get;
177
- const dataUrl = getTransactionExtraDetails(options.servicesUrl, month, accountIndex, transaction);
178
- const data = await (0, _fetch.fetchGetWithinPage)(page, dataUrl);
179
- if (!data) {
180
- return transaction;
181
- }
182
- const rawCategory = (_$get = _lodash.default.get(data, 'PirteyIska_204Bean.sector')) !== null && _$get !== void 0 ? _$get : '';
183
- return _objectSpread(_objectSpread({}, transaction), {}, {
184
- category: rawCategory.trim()
185
- });
163
+ const dataUrl = getTransactionExtraDetails(options.servicesUrl, month, accountIndex, transaction);
164
+ const data = await (0, fetch_1.fetchGetWithinPage)(page, dataUrl);
165
+ if (!data) {
166
+ return transaction;
167
+ }
168
+ const rawCategory = lodash_1.default.get(data, 'PirteyIska_204Bean.sector') ?? '';
169
+ return {
170
+ ...transaction,
171
+ category: rawCategory.trim(),
172
+ };
186
173
  }
187
174
  function getExtraScrapTransactions(accountWithIndex, page, options, month) {
188
- const promises = accountWithIndex.txns.map(t => getExtraScrapTransaction(page, options, month, accountWithIndex.index, t));
189
- return Promise.all(promises);
175
+ const promises = accountWithIndex.txns.map(t => getExtraScrapTransaction(page, options, month, accountWithIndex.index, t));
176
+ return Promise.all(promises);
190
177
  }
191
178
  async function getExtraScrapAccount(page, options, accountMap, month) {
192
- const promises = Object.keys(accountMap).map(async a => _objectSpread(_objectSpread({}, accountMap[a]), {}, {
193
- txns: await getExtraScrapTransactions(accountMap[a], page, options, month)
194
- }));
195
- const accounts = await Promise.all(promises);
196
- return accounts.reduce((m, x) => _objectSpread(_objectSpread({}, m), {}, {
197
- [x.accountNumber]: x
198
- }), {});
179
+ const promises = Object.keys(accountMap).map(async (a) => ({
180
+ ...accountMap[a],
181
+ txns: await getExtraScrapTransactions(accountMap[a], page, options, month),
182
+ }));
183
+ const accounts = await Promise.all(promises);
184
+ return accounts.reduce((m, x) => ({ ...m, [x.accountNumber]: x }), {});
199
185
  }
200
186
  function getExtraScrap(accountsWithIndex, page, options, allMonths) {
201
- const actions = accountsWithIndex.map((a, i) => () => getExtraScrapAccount(page, options, a, allMonths[i]));
202
- return (0, _waiting.runSerial)(actions);
187
+ const actions = accountsWithIndex.map((a, i) => () => getExtraScrapAccount(page, options, a, allMonths[i]));
188
+ return (0, waiting_1.runSerial)(actions);
203
189
  }
204
190
  async function fetchAllTransactions(page, options, companyServiceOptions, startMoment) {
205
- var _options$futureMonths;
206
- const futureMonthsToScrape = (_options$futureMonths = options.futureMonthsToScrape) !== null && _options$futureMonths !== void 0 ? _options$futureMonths : 1;
207
- const allMonths = (0, _dates.default)(startMoment, futureMonthsToScrape);
208
- const results = await Promise.all(allMonths.map(async monthMoment => {
209
- return fetchTransactions(page, options, companyServiceOptions, startMoment, monthMoment);
210
- }));
211
- const finalResult = options.additionalTransactionInformation ? await getExtraScrap(results, page, companyServiceOptions, allMonths) : results;
212
- const combinedTxns = {};
213
- finalResult.forEach(result => {
214
- Object.keys(result).forEach(accountNumber => {
215
- let txnsForAccount = combinedTxns[accountNumber];
216
- if (!txnsForAccount) {
217
- txnsForAccount = [];
218
- combinedTxns[accountNumber] = txnsForAccount;
219
- }
220
- const toBeAddedTxns = result[accountNumber].txns;
221
- combinedTxns[accountNumber].push(...toBeAddedTxns);
191
+ const futureMonthsToScrape = options.futureMonthsToScrape ?? 1;
192
+ const allMonths = (0, dates_1.default)(startMoment, futureMonthsToScrape);
193
+ const results = await Promise.all(allMonths.map(async (monthMoment) => {
194
+ return fetchTransactions(page, options, companyServiceOptions, startMoment, monthMoment);
195
+ }));
196
+ const finalResult = options.additionalTransactionInformation
197
+ ? await getExtraScrap(results, page, companyServiceOptions, allMonths)
198
+ : results;
199
+ const combinedTxns = {};
200
+ finalResult.forEach(result => {
201
+ Object.keys(result).forEach(accountNumber => {
202
+ let txnsForAccount = combinedTxns[accountNumber];
203
+ if (!txnsForAccount) {
204
+ txnsForAccount = [];
205
+ combinedTxns[accountNumber] = txnsForAccount;
206
+ }
207
+ const toBeAddedTxns = result[accountNumber].txns;
208
+ combinedTxns[accountNumber].push(...toBeAddedTxns);
209
+ });
210
+ });
211
+ const accounts = Object.keys(combinedTxns).map(accountNumber => {
212
+ return {
213
+ accountNumber,
214
+ txns: combinedTxns[accountNumber],
215
+ };
222
216
  });
223
- });
224
- const accounts = Object.keys(combinedTxns).map(accountNumber => {
225
217
  return {
226
- accountNumber,
227
- txns: combinedTxns[accountNumber]
218
+ success: true,
219
+ accounts,
228
220
  };
229
- });
230
- return {
231
- success: true,
232
- accounts
233
- };
234
221
  }
235
- class IsracardAmexBaseScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
236
- constructor(options, baseUrl, companyCode) {
237
- super(options);
238
- _defineProperty(this, "baseUrl", void 0);
239
- _defineProperty(this, "companyCode", void 0);
240
- _defineProperty(this, "servicesUrl", void 0);
241
- this.baseUrl = baseUrl;
242
- this.companyCode = companyCode;
243
- this.servicesUrl = `${baseUrl}/services/ProxyRequestHandler.ashx`;
244
- }
245
- async login(credentials) {
246
- await this.page.setRequestInterception(true);
247
- this.page.on('request', request => {
248
- if (request.url().includes('detector-dom.min.js')) {
249
- debug('force abort for request do download detector-dom.min.js resource');
250
- void request.abort();
251
- } else {
252
- void request.continue();
253
- }
254
- });
255
- await (0, _browser.maskHeadlessUserAgent)(this.page);
256
- await this.navigateTo(`${this.baseUrl}/personalarea/Login`);
257
- this.emitProgress(_definitions.ScraperProgressTypes.LoggingIn);
258
- const validateUrl = `${this.servicesUrl}?reqName=ValidateIdData`;
259
- const validateRequest = {
260
- id: credentials.id,
261
- cardSuffix: credentials.card6Digits,
262
- countryCode: COUNTRY_CODE,
263
- idType: ID_TYPE,
264
- checkLevel: '1',
265
- companyCode: this.companyCode
266
- };
267
- const validateResult = await (0, _fetch.fetchPostWithinPage)(this.page, validateUrl, validateRequest);
268
- if (!validateResult || !validateResult.Header || validateResult.Header.Status !== '1' || !validateResult.ValidateIdDataBean) {
269
- throw new Error('unknown error during login');
222
+ class IsracardAmexBaseScraper extends base_scraper_with_browser_1.BaseScraperWithBrowser {
223
+ baseUrl;
224
+ companyCode;
225
+ servicesUrl;
226
+ constructor(options, baseUrl, companyCode) {
227
+ super(options);
228
+ this.baseUrl = baseUrl;
229
+ this.companyCode = companyCode;
230
+ this.servicesUrl = `${baseUrl}/services/ProxyRequestHandler.ashx`;
270
231
  }
271
- const validateReturnCode = validateResult.ValidateIdDataBean.returnCode;
272
- debug(`user validate with return code '${validateReturnCode}'`);
273
- if (validateReturnCode === '1') {
274
- const {
275
- userName
276
- } = validateResult.ValidateIdDataBean;
277
- const loginUrl = `${this.servicesUrl}?reqName=performLogonI`;
278
- const request = {
279
- KodMishtamesh: userName,
280
- MisparZihuy: credentials.id,
281
- Sisma: credentials.password,
282
- cardSuffix: credentials.card6Digits,
283
- countryCode: COUNTRY_CODE,
284
- idType: ID_TYPE
285
- };
286
- const loginResult = await (0, _fetch.fetchPostWithinPage)(this.page, loginUrl, request);
287
- debug(`user login with status '${loginResult === null || loginResult === void 0 ? void 0 : loginResult.status}'`);
288
- if (loginResult && loginResult.status === '1') {
289
- this.emitProgress(_definitions.ScraperProgressTypes.LoginSuccess);
290
- return {
291
- success: true
232
+ async login(credentials) {
233
+ await this.page.setRequestInterception(true);
234
+ this.page.on('request', request => {
235
+ if (request.url().includes('detector-dom.min.js')) {
236
+ debug('force abort for request do download detector-dom.min.js resource');
237
+ void request.abort(undefined, browser_1.interceptionPriorities.abort);
238
+ }
239
+ else {
240
+ void request.continue(undefined, browser_1.interceptionPriorities.continue);
241
+ }
242
+ });
243
+ await (0, browser_1.maskHeadlessUserAgent)(this.page);
244
+ await this.navigateTo(`${this.baseUrl}/personalarea/Login`);
245
+ this.emitProgress(definitions_1.ScraperProgressTypes.LoggingIn);
246
+ const validateUrl = `${this.servicesUrl}?reqName=ValidateIdData`;
247
+ const validateRequest = {
248
+ id: credentials.id,
249
+ cardSuffix: credentials.card6Digits,
250
+ countryCode: COUNTRY_CODE,
251
+ idType: ID_TYPE,
252
+ checkLevel: '1',
253
+ companyCode: this.companyCode,
292
254
  };
293
- }
294
- if (loginResult && loginResult.status === '3') {
295
- this.emitProgress(_definitions.ScraperProgressTypes.ChangePassword);
255
+ const validateResult = await (0, fetch_1.fetchPostWithinPage)(this.page, validateUrl, validateRequest);
256
+ if (!validateResult ||
257
+ !validateResult.Header ||
258
+ validateResult.Header.Status !== '1' ||
259
+ !validateResult.ValidateIdDataBean) {
260
+ throw new Error('unknown error during login');
261
+ }
262
+ const validateReturnCode = validateResult.ValidateIdDataBean.returnCode;
263
+ debug(`user validate with return code '${validateReturnCode}'`);
264
+ if (validateReturnCode === '1') {
265
+ const { userName } = validateResult.ValidateIdDataBean;
266
+ const loginUrl = `${this.servicesUrl}?reqName=performLogonI`;
267
+ const request = {
268
+ KodMishtamesh: userName,
269
+ MisparZihuy: credentials.id,
270
+ Sisma: credentials.password,
271
+ cardSuffix: credentials.card6Digits,
272
+ countryCode: COUNTRY_CODE,
273
+ idType: ID_TYPE,
274
+ };
275
+ const loginResult = await (0, fetch_1.fetchPostWithinPage)(this.page, loginUrl, request);
276
+ debug(`user login with status '${loginResult?.status}'`);
277
+ if (loginResult && loginResult.status === '1') {
278
+ this.emitProgress(definitions_1.ScraperProgressTypes.LoginSuccess);
279
+ return { success: true };
280
+ }
281
+ if (loginResult && loginResult.status === '3') {
282
+ this.emitProgress(definitions_1.ScraperProgressTypes.ChangePassword);
283
+ return {
284
+ success: false,
285
+ errorType: errors_1.ScraperErrorTypes.ChangePassword,
286
+ };
287
+ }
288
+ this.emitProgress(definitions_1.ScraperProgressTypes.LoginFailed);
289
+ return {
290
+ success: false,
291
+ errorType: errors_1.ScraperErrorTypes.InvalidPassword,
292
+ };
293
+ }
294
+ if (validateReturnCode === '4') {
295
+ this.emitProgress(definitions_1.ScraperProgressTypes.ChangePassword);
296
+ return {
297
+ success: false,
298
+ errorType: errors_1.ScraperErrorTypes.ChangePassword,
299
+ };
300
+ }
301
+ this.emitProgress(definitions_1.ScraperProgressTypes.LoginFailed);
296
302
  return {
297
- success: false,
298
- errorType: _errors.ScraperErrorTypes.ChangePassword
303
+ success: false,
304
+ errorType: errors_1.ScraperErrorTypes.InvalidPassword,
299
305
  };
300
- }
301
- this.emitProgress(_definitions.ScraperProgressTypes.LoginFailed);
302
- return {
303
- success: false,
304
- errorType: _errors.ScraperErrorTypes.InvalidPassword
305
- };
306
306
  }
307
- if (validateReturnCode === '4') {
308
- this.emitProgress(_definitions.ScraperProgressTypes.ChangePassword);
309
- return {
310
- success: false,
311
- errorType: _errors.ScraperErrorTypes.ChangePassword
312
- };
307
+ async fetchData() {
308
+ const defaultStartMoment = (0, moment_1.default)().subtract(1, 'years');
309
+ const startDate = this.options.startDate || defaultStartMoment.toDate();
310
+ const startMoment = moment_1.default.max(defaultStartMoment, (0, moment_1.default)(startDate));
311
+ return fetchAllTransactions(this.page, this.options, {
312
+ servicesUrl: this.servicesUrl,
313
+ companyCode: this.companyCode,
314
+ }, startMoment);
313
315
  }
314
- this.emitProgress(_definitions.ScraperProgressTypes.LoginFailed);
315
- return {
316
- success: false,
317
- errorType: _errors.ScraperErrorTypes.InvalidPassword
318
- };
319
- }
320
- async fetchData() {
321
- const defaultStartMoment = (0, _moment.default)().subtract(1, 'years');
322
- const startDate = this.options.startDate || defaultStartMoment.toDate();
323
- const startMoment = _moment.default.max(defaultStartMoment, (0, _moment.default)(startDate));
324
- return fetchAllTransactions(this.page, this.options, {
325
- servicesUrl: this.servicesUrl,
326
- companyCode: this.companyCode
327
- }, startMoment);
328
- }
329
316
  }
330
- var _default = exports.default = IsracardAmexBaseScraper;
331
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYnVpbGRVcmwiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9sb2Rhc2giLCJfbW9tZW50IiwiX2NvbnN0YW50cyIsIl9kZWZpbml0aW9ucyIsIl9kYXRlcyIsIl9kZWJ1ZyIsIl9mZXRjaCIsIl90cmFuc2FjdGlvbnMiLCJfd2FpdGluZyIsIl90cmFuc2FjdGlvbnMyIiwiX2Jhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJfZXJyb3JzIiwiX2Jyb3dzZXIiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJvd25LZXlzIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJpIiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJjYWxsIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwiQ09VTlRSWV9DT0RFIiwiSURfVFlQRSIsIklOU1RBTExNRU5UU19LRVlXT1JEIiwiREFURV9GT1JNQVQiLCJkZWJ1ZyIsImdldERlYnVnIiwiZ2V0QWNjb3VudHNVcmwiLCJzZXJ2aWNlc1VybCIsIm1vbnRoTW9tZW50IiwiYmlsbGluZ0RhdGUiLCJmb3JtYXQiLCJidWlsZFVybCIsInF1ZXJ5UGFyYW1zIiwicmVxTmFtZSIsImFjdGlvbkNvZGUiLCJmZXRjaEFjY291bnRzIiwicGFnZSIsImRhdGFVcmwiLCJkYXRhUmVzdWx0IiwiZmV0Y2hHZXRXaXRoaW5QYWdlIiwiXyIsImdldCIsIkRhc2hib2FyZE1vbnRoQmVhbiIsImNhcmRzQ2hhcmdlcyIsIm1hcCIsImNhcmRDaGFyZ2UiLCJpbmRleCIsInBhcnNlSW50IiwiY2FyZEluZGV4IiwiYWNjb3VudE51bWJlciIsImNhcmROdW1iZXIiLCJwcm9jZXNzZWREYXRlIiwibW9tZW50IiwidG9JU09TdHJpbmciLCJnZXRUcmFuc2FjdGlvbnNVcmwiLCJtb250aCIsInllYXIiLCJtb250aFN0ciIsInRvU3RyaW5nIiwicmVxdWlyZWREYXRlIiwiY29udmVydEN1cnJlbmN5IiwiY3VycmVuY3lTdHIiLCJTSEVLRUxfQ1VSUkVOQ1lfS0VZV09SRCIsIkFMVF9TSEVLRUxfQ1VSUkVOQ1kiLCJTSEVLRUxfQ1VSUkVOQ1kiLCJnZXRJbnN0YWxsbWVudHNJbmZvIiwidHhuIiwibW9yZUluZm8iLCJpbmNsdWRlcyIsInVuZGVmaW5lZCIsIm1hdGNoZXMiLCJtYXRjaCIsIm51bWJlciIsInRvdGFsIiwiZ2V0VHJhbnNhY3Rpb25UeXBlIiwiVHJhbnNhY3Rpb25UeXBlcyIsIkluc3RhbGxtZW50cyIsIk5vcm1hbCIsImNvbnZlcnRUcmFuc2FjdGlvbnMiLCJ0eG5zIiwiZmlsdGVyZWRUeG5zIiwiZGVhbFN1bVR5cGUiLCJ2b3VjaGVyTnVtYmVyUmF0eiIsInZvdWNoZXJOdW1iZXJSYXR6T3V0Ym91bmQiLCJfdHhuJGN1cnJlbnRQYXltZW50Q3UiLCJpc091dGJvdW5kIiwiZGVhbFN1bU91dGJvdW5kIiwidHhuRGF0ZVN0ciIsImZ1bGxQdXJjaGFzZURhdGVPdXRib3VuZCIsImZ1bGxQdXJjaGFzZURhdGUiLCJ0eG5Nb21lbnQiLCJjdXJyZW50UHJvY2Vzc2VkRGF0ZSIsImZ1bGxQYXltZW50RGF0ZSIsInJlc3VsdCIsInR5cGUiLCJpZGVudGlmaWVyIiwiZGF0ZSIsIm9yaWdpbmFsQW1vdW50IiwiZGVhbFN1bSIsIm9yaWdpbmFsQ3VycmVuY3kiLCJjdXJyZW50UGF5bWVudEN1cnJlbmN5IiwiY3VycmVuY3lJZCIsImNoYXJnZWRBbW91bnQiLCJwYXltZW50U3VtT3V0Ym91bmQiLCJwYXltZW50U3VtIiwiY2hhcmdlZEN1cnJlbmN5IiwiZGVzY3JpcHRpb24iLCJmdWxsU3VwcGxpZXJOYW1lT3V0Ym91bmQiLCJmdWxsU3VwcGxpZXJOYW1lSGViIiwibWVtbyIsImluc3RhbGxtZW50cyIsInN0YXR1cyIsIlRyYW5zYWN0aW9uU3RhdHVzZXMiLCJDb21wbGV0ZWQiLCJmZXRjaFRyYW5zYWN0aW9ucyIsIm9wdGlvbnMiLCJjb21wYW55U2VydmljZU9wdGlvbnMiLCJzdGFydE1vbWVudCIsImFjY291bnRzIiwiQ2FyZHNUcmFuc2FjdGlvbnNMaXN0QmVhbiIsImFjY291bnRUeG5zIiwiYWNjb3VudCIsInR4bkdyb3VwcyIsIl9vcHRpb25zJG91dHB1dERhdGEkZSIsIl9vcHRpb25zJG91dHB1dERhdGEiLCJhbGxUeG5zIiwidHhuR3JvdXAiLCJ0eG5Jc3JhZWwiLCJ0eG5BYnJvYWQiLCJjb21iaW5lSW5zdGFsbG1lbnRzIiwiZml4SW5zdGFsbG1lbnRzIiwib3V0cHV0RGF0YSIsImVuYWJsZVRyYW5zYWN0aW9uc0ZpbHRlckJ5RGF0ZSIsImZpbHRlck9sZFRyYW5zYWN0aW9ucyIsImdldFRyYW5zYWN0aW9uRXh0cmFEZXRhaWxzIiwiYWNjb3VudEluZGV4IiwidHJhbnNhY3Rpb24iLCJtb2VkQ2hpdXYiLCJDYXJkSW5kZXgiLCJzaG92YXJSYXR6IiwiZ2V0RXh0cmFTY3JhcFRyYW5zYWN0aW9uIiwiXyRnZXQiLCJkYXRhIiwicmF3Q2F0ZWdvcnkiLCJjYXRlZ29yeSIsInRyaW0iLCJnZXRFeHRyYVNjcmFwVHJhbnNhY3Rpb25zIiwiYWNjb3VudFdpdGhJbmRleCIsInByb21pc2VzIiwiUHJvbWlzZSIsImFsbCIsImdldEV4dHJhU2NyYXBBY2NvdW50IiwiYWNjb3VudE1hcCIsImEiLCJyZWR1Y2UiLCJtIiwieCIsImdldEV4dHJhU2NyYXAiLCJhY2NvdW50c1dpdGhJbmRleCIsImFsbE1vbnRocyIsImFjdGlvbnMiLCJydW5TZXJpYWwiLCJmZXRjaEFsbFRyYW5zYWN0aW9ucyIsIl9vcHRpb25zJGZ1dHVyZU1vbnRocyIsImZ1dHVyZU1vbnRoc1RvU2NyYXBlIiwiZ2V0QWxsTW9udGhNb21lbnRzIiwicmVzdWx0cyIsImZpbmFsUmVzdWx0IiwiYWRkaXRpb25hbFRyYW5zYWN0aW9uSW5mb3JtYXRpb24iLCJjb21iaW5lZFR4bnMiLCJ0eG5zRm9yQWNjb3VudCIsInRvQmVBZGRlZFR4bnMiLCJzdWNjZXNzIiwiSXNyYWNhcmRBbWV4QmFzZVNjcmFwZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiY29uc3RydWN0b3IiLCJiYXNlVXJsIiwiY29tcGFueUNvZGUiLCJsb2dpbiIsImNyZWRlbnRpYWxzIiwic2V0UmVxdWVzdEludGVyY2VwdGlvbiIsIm9uIiwicmVxdWVzdCIsInVybCIsImFib3J0IiwiY29udGludWUiLCJtYXNrSGVhZGxlc3NVc2VyQWdlbnQiLCJuYXZpZ2F0ZVRvIiwiZW1pdFByb2dyZXNzIiwiU2NyYXBlclByb2dyZXNzVHlwZXMiLCJMb2dnaW5nSW4iLCJ2YWxpZGF0ZVVybCIsInZhbGlkYXRlUmVxdWVzdCIsImlkIiwiY2FyZFN1ZmZpeCIsImNhcmQ2RGlnaXRzIiwiY291bnRyeUNvZGUiLCJpZFR5cGUiLCJjaGVja0xldmVsIiwidmFsaWRhdGVSZXN1bHQiLCJmZXRjaFBvc3RXaXRoaW5QYWdlIiwiSGVhZGVyIiwiU3RhdHVzIiwiVmFsaWRhdGVJZERhdGFCZWFuIiwiRXJyb3IiLCJ2YWxpZGF0ZVJldHVybkNvZGUiLCJyZXR1cm5Db2RlIiwidXNlck5hbWUiLCJsb2dpblVybCIsIktvZE1pc2h0YW1lc2giLCJNaXNwYXJaaWh1eSIsIlNpc21hIiwicGFzc3dvcmQiLCJsb2dpblJlc3VsdCIsIkxvZ2luU3VjY2VzcyIsIkNoYW5nZVBhc3N3b3JkIiwiZXJyb3JUeXBlIiwiU2NyYXBlckVycm9yVHlwZXMiLCJMb2dpbkZhaWxlZCIsIkludmFsaWRQYXNzd29yZCIsImZldGNoRGF0YSIsImRlZmF1bHRTdGFydE1vbWVudCIsInN1YnRyYWN0Iiwic3RhcnREYXRlIiwidG9EYXRlIiwibWF4IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL2Jhc2UtaXNyYWNhcmQtYW1leC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYnVpbGRVcmwgZnJvbSAnYnVpbGQtdXJsJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbW9tZW50LCB7IHR5cGUgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IHR5cGUgUGFnZSB9IGZyb20gJ3B1cHBldGVlcic7XG5pbXBvcnQge1xuICBBTFRfU0hFS0VMX0NVUlJFTkNZLFxuICBTSEVLRUxfQ1VSUkVOQ1ksXG4gIFNIRUtFTF9DVVJSRU5DWV9LRVlXT1JELFxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgU2NyYXBlclByb2dyZXNzVHlwZXMgfSBmcm9tICcuLi9kZWZpbml0aW9ucyc7XG5pbXBvcnQgZ2V0QWxsTW9udGhNb21lbnRzIGZyb20gJy4uL2hlbHBlcnMvZGF0ZXMnO1xuaW1wb3J0IHsgZ2V0RGVidWcgfSBmcm9tICcuLi9oZWxwZXJzL2RlYnVnJztcbmltcG9ydCB7IGZldGNoR2V0V2l0aGluUGFnZSwgZmV0Y2hQb3N0V2l0aGluUGFnZSB9IGZyb20gJy4uL2hlbHBlcnMvZmV0Y2gnO1xuaW1wb3J0IHsgZmlsdGVyT2xkVHJhbnNhY3Rpb25zLCBmaXhJbnN0YWxsbWVudHMgfSBmcm9tICcuLi9oZWxwZXJzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBydW5TZXJpYWwgfSBmcm9tICcuLi9oZWxwZXJzL3dhaXRpbmcnO1xuaW1wb3J0IHtcbiAgVHJhbnNhY3Rpb25TdGF0dXNlcywgVHJhbnNhY3Rpb25UeXBlcyxcbiAgdHlwZSBUcmFuc2FjdGlvbiwgdHlwZSBUcmFuc2FjdGlvbkluc3RhbGxtZW50cyxcbiAgdHlwZSBUcmFuc2FjdGlvbnNBY2NvdW50LFxufSBmcm9tICcuLi90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgQmFzZVNjcmFwZXJXaXRoQnJvd3NlciB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5pbXBvcnQgeyBTY3JhcGVyRXJyb3JUeXBlcyB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgU2NyYXBlck9wdGlvbnMsIHR5cGUgU2NyYXBlclNjcmFwaW5nUmVzdWx0IH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgbWFza0hlYWRsZXNzVXNlckFnZW50IH0gZnJvbSAnLi4vaGVscGVycy9icm93c2VyJztcblxuY29uc3QgQ09VTlRSWV9DT0RFID0gJzIxMic7XG5jb25zdCBJRF9UWVBFID0gJzEnO1xuY29uc3QgSU5TVEFMTE1FTlRTX0tFWVdPUkQgPSAn16rXqdec15XXnSc7XG5cbmNvbnN0IERBVEVfRk9STUFUID0gJ0REL01NL1lZWVknO1xuXG5jb25zdCBkZWJ1ZyA9IGdldERlYnVnKCdiYXNlLWlzcmFjYXJkLWFtZXgnKTtcblxudHlwZSBDb21wYW55U2VydmljZU9wdGlvbnMgPSB7XG4gIHNlcnZpY2VzVXJsOiBzdHJpbmc7XG4gIGNvbXBhbnlDb2RlOiBzdHJpbmc7XG59O1xuXG50eXBlIFNjcmFwZWRBY2NvdW50c1dpdGhJbmRleCA9IFJlY29yZDxzdHJpbmcsIFRyYW5zYWN0aW9uc0FjY291bnQgJiB7IGluZGV4OiBudW1iZXIgfT47XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBkZWFsU3VtVHlwZTogc3RyaW5nO1xuICB2b3VjaGVyTnVtYmVyUmF0ek91dGJvdW5kOiBzdHJpbmc7XG4gIHZvdWNoZXJOdW1iZXJSYXR6OiBzdHJpbmc7XG4gIG1vcmVJbmZvPzogc3RyaW5nO1xuICBkZWFsU3VtT3V0Ym91bmQ6IGJvb2xlYW47XG4gIGN1cnJlbmN5SWQ6IHN0cmluZztcbiAgY3VycmVudFBheW1lbnRDdXJyZW5jeTogc3RyaW5nO1xuICBkZWFsU3VtOiBudW1iZXI7XG4gIGZ1bGxQYXltZW50RGF0ZT86IHN0cmluZztcbiAgZnVsbFB1cmNoYXNlRGF0ZT86IHN0cmluZztcbiAgZnVsbFB1cmNoYXNlRGF0ZU91dGJvdW5kPzogc3RyaW5nO1xuICBmdWxsU3VwcGxpZXJOYW1lSGViOiBzdHJpbmc7XG4gIGZ1bGxTdXBwbGllck5hbWVPdXRib3VuZDogc3RyaW5nO1xuICBwYXltZW50U3VtOiBudW1iZXI7XG4gIHBheW1lbnRTdW1PdXRib3VuZDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU2NyYXBlZEFjY291bnQge1xuICBpbmRleDogbnVtYmVyO1xuICBhY2NvdW50TnVtYmVyOiBzdHJpbmc7XG4gIHByb2Nlc3NlZERhdGU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFNjcmFwZWRMb2dpblZhbGlkYXRpb24ge1xuICBIZWFkZXI6IHtcbiAgICBTdGF0dXM6IHN0cmluZztcbiAgfTtcbiAgVmFsaWRhdGVJZERhdGFCZWFuPzoge1xuICAgIHVzZXJOYW1lPzogc3RyaW5nO1xuICAgIHJldHVybkNvZGU6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNjcmFwZWRBY2NvdW50c1dpdGhpblBhZ2VSZXNwb25zZSB7XG4gIEhlYWRlcjoge1xuICAgIFN0YXR1czogc3RyaW5nO1xuICB9O1xuICBEYXNoYm9hcmRNb250aEJlYW4/OiB7XG4gICAgY2FyZHNDaGFyZ2VzOiB7XG4gICAgICBjYXJkSW5kZXg6IHN0cmluZztcbiAgICAgIGNhcmROdW1iZXI6IHN0cmluZztcbiAgICAgIGJpbGxpbmdEYXRlOiBzdHJpbmc7XG4gICAgfVtdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgU2NyYXBlZEN1cnJlbnRDYXJkVHJhbnNhY3Rpb25zIHtcbiAgdHhuSXNyYWVsPzogU2NyYXBlZFRyYW5zYWN0aW9uW107XG4gIHR4bkFicm9hZD86IFNjcmFwZWRUcmFuc2FjdGlvbltdO1xufVxuXG5pbnRlcmZhY2UgU2NyYXBlZFRyYW5zYWN0aW9uRGF0YSB7XG4gIEhlYWRlcj86IHtcbiAgICBTdGF0dXM6IHN0cmluZztcbiAgfTtcbiAgUGlydGV5SXNrYV8yMDRCZWFuPzoge1xuICAgIHNlY3Rvcjogc3RyaW5nO1xuICB9O1xuICBcbiAgQ2FyZHNUcmFuc2FjdGlvbnNMaXN0QmVhbj86IFJlY29yZDxzdHJpbmcsIHtcbiAgICBDdXJyZW50Q2FyZFRyYW5zYWN0aW9uczogU2NyYXBlZEN1cnJlbnRDYXJkVHJhbnNhY3Rpb25zW107XG4gIH0+O1xufVxuXG5mdW5jdGlvbiBnZXRBY2NvdW50c1VybChzZXJ2aWNlc1VybDogc3RyaW5nLCBtb250aE1vbWVudDogTW9tZW50KSB7XG4gIGNvbnN0IGJpbGxpbmdEYXRlID0gbW9udGhNb21lbnQuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gIHJldHVybiBidWlsZFVybChzZXJ2aWNlc1VybCwge1xuICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICByZXFOYW1lOiAnRGFzaGJvYXJkTW9udGgnLFxuICAgICAgYWN0aW9uQ29kZTogJzAnLFxuICAgICAgYmlsbGluZ0RhdGUsXG4gICAgICBmb3JtYXQ6ICdKc29uJyxcbiAgICB9LFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBY2NvdW50cyhwYWdlOiBQYWdlLCBzZXJ2aWNlc1VybDogc3RyaW5nLCBtb250aE1vbWVudDogTW9tZW50KTogUHJvbWlzZTxTY3JhcGVkQWNjb3VudFtdPiB7XG4gIGNvbnN0IGRhdGFVcmwgPSBnZXRBY2NvdW50c1VybChzZXJ2aWNlc1VybCwgbW9udGhNb21lbnQpO1xuICBjb25zdCBkYXRhUmVzdWx0ID0gYXdhaXQgZmV0Y2hHZXRXaXRoaW5QYWdlPFNjcmFwZWRBY2NvdW50c1dpdGhpblBhZ2VSZXNwb25zZT4ocGFnZSwgZGF0YVVybCk7XG4gIGlmIChkYXRhUmVzdWx0ICYmIF8uZ2V0KGRhdGFSZXN1bHQsICdIZWFkZXIuU3RhdHVzJykgPT09ICcxJyAmJiBkYXRhUmVzdWx0LkRhc2hib2FyZE1vbnRoQmVhbikge1xuICAgIGNvbnN0IHsgY2FyZHNDaGFyZ2VzIH0gPSBkYXRhUmVzdWx0LkRhc2hib2FyZE1vbnRoQmVhbjtcbiAgICBpZiAoY2FyZHNDaGFyZ2VzKSB7XG4gICAgICByZXR1cm4gY2FyZHNDaGFyZ2VzLm1hcCgoY2FyZENoYXJnZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGluZGV4OiBwYXJzZUludChjYXJkQ2hhcmdlLmNhcmRJbmRleCwgMTApLFxuICAgICAgICAgIGFjY291bnROdW1iZXI6IGNhcmRDaGFyZ2UuY2FyZE51bWJlcixcbiAgICAgICAgICBwcm9jZXNzZWREYXRlOiBtb21lbnQoY2FyZENoYXJnZS5iaWxsaW5nRGF0ZSwgREFURV9GT1JNQVQpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbnNVcmwoc2VydmljZXNVcmw6IHN0cmluZywgbW9udGhNb21lbnQ6IE1vbWVudCkge1xuICBjb25zdCBtb250aCA9IG1vbnRoTW9tZW50Lm1vbnRoKCkgKyAxO1xuICBjb25zdCB5ZWFyID0gbW9udGhNb21lbnQueWVhcigpO1xuICBjb25zdCBtb250aFN0ciA9IG1vbnRoIDwgMTAgPyBgMCR7bW9udGh9YCA6IG1vbnRoLnRvU3RyaW5nKCk7XG4gIHJldHVybiBidWlsZFVybChzZXJ2aWNlc1VybCwge1xuICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICByZXFOYW1lOiAnQ2FyZHNUcmFuc2FjdGlvbnNMaXN0JyxcbiAgICAgIG1vbnRoOiBtb250aFN0cixcbiAgICAgIHllYXI6IGAke3llYXJ9YCxcbiAgICAgIHJlcXVpcmVkRGF0ZTogJ04nLFxuICAgIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0Q3VycmVuY3koY3VycmVuY3lTdHI6IHN0cmluZykge1xuICBpZiAoY3VycmVuY3lTdHIgPT09IFNIRUtFTF9DVVJSRU5DWV9LRVlXT1JEIHx8IGN1cnJlbmN5U3RyID09PSBBTFRfU0hFS0VMX0NVUlJFTkNZKSB7XG4gICAgcmV0dXJuIFNIRUtFTF9DVVJSRU5DWTtcbiAgfVxuICByZXR1cm4gY3VycmVuY3lTdHI7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RhbGxtZW50c0luZm8odHhuOiBTY3JhcGVkVHJhbnNhY3Rpb24pOiBUcmFuc2FjdGlvbkluc3RhbGxtZW50cyB8IHVuZGVmaW5lZCB7XG4gIGlmICghdHhuLm1vcmVJbmZvIHx8ICF0eG4ubW9yZUluZm8uaW5jbHVkZXMoSU5TVEFMTE1FTlRTX0tFWVdPUkQpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBtYXRjaGVzID0gdHhuLm1vcmVJbmZvLm1hdGNoKC9cXGQrL2cpO1xuICBpZiAoIW1hdGNoZXMgfHwgbWF0Y2hlcy5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbnVtYmVyOiBwYXJzZUludChtYXRjaGVzWzBdLCAxMCksXG4gICAgdG90YWw6IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25UeXBlKHR4bjogU2NyYXBlZFRyYW5zYWN0aW9uKSB7XG4gIHJldHVybiBnZXRJbnN0YWxsbWVudHNJbmZvKHR4bikgPyBUcmFuc2FjdGlvblR5cGVzLkluc3RhbGxtZW50cyA6IFRyYW5zYWN0aW9uVHlwZXMuTm9ybWFsO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdLCBwcm9jZXNzZWREYXRlOiBzdHJpbmcpOiBUcmFuc2FjdGlvbltdIHtcbiAgY29uc3QgZmlsdGVyZWRUeG5zID0gdHhucy5maWx0ZXIoKHR4bikgPT4gdHhuLmRlYWxTdW1UeXBlICE9PSAnMScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhuLnZvdWNoZXJOdW1iZXJSYXR6ICE9PSAnMDAwMDAwMDAwJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eG4udm91Y2hlck51bWJlclJhdHpPdXRib3VuZCAhPT0gJzAwMDAwMDAwMCcpO1xuXG4gIHJldHVybiBmaWx0ZXJlZFR4bnMubWFwKCh0eG4pID0+IHtcbiAgICBjb25zdCBpc091dGJvdW5kID0gdHhuLmRlYWxTdW1PdXRib3VuZDtcbiAgICBjb25zdCB0eG5EYXRlU3RyID0gaXNPdXRib3VuZCA/IHR4bi5mdWxsUHVyY2hhc2VEYXRlT3V0Ym91bmQgOiB0eG4uZnVsbFB1cmNoYXNlRGF0ZTtcbiAgICBjb25zdCB0eG5Nb21lbnQgPSBtb21lbnQodHhuRGF0ZVN0ciwgREFURV9GT1JNQVQpO1xuXG4gICAgY29uc3QgY3VycmVudFByb2Nlc3NlZERhdGUgPSB0eG4uZnVsbFBheW1lbnREYXRlID9cbiAgICAgIG1vbWVudCh0eG4uZnVsbFBheW1lbnREYXRlLCBEQVRFX0ZPUk1BVCkudG9JU09TdHJpbmcoKSA6XG4gICAgICBwcm9jZXNzZWREYXRlO1xuICAgIGNvbnN0IHJlc3VsdDogVHJhbnNhY3Rpb24gPSB7XG4gICAgICB0eXBlOiBnZXRUcmFuc2FjdGlvblR5cGUodHhuKSxcbiAgICAgIGlkZW50aWZpZXI6IHBhcnNlSW50KGlzT3V0Ym91bmQgPyB0eG4udm91Y2hlck51bWJlclJhdHpPdXRib3VuZCA6IHR4bi52b3VjaGVyTnVtYmVyUmF0eiwgMTApLFxuICAgICAgZGF0ZTogdHhuTW9tZW50LnRvSVNPU3RyaW5nKCksXG4gICAgICBwcm9jZXNzZWREYXRlOiBjdXJyZW50UHJvY2Vzc2VkRGF0ZSxcbiAgICAgIG9yaWdpbmFsQW1vdW50OiBpc091dGJvdW5kID8gLXR4bi5kZWFsU3VtT3V0Ym91bmQgOiAtdHhuLmRlYWxTdW0sXG4gICAgICBvcmlnaW5hbEN1cnJlbmN5OiBjb252ZXJ0Q3VycmVuY3kodHhuLmN1cnJlbnRQYXltZW50Q3VycmVuY3kgPz8gdHhuLmN1cnJlbmN5SWQpLFxuICAgICAgY2hhcmdlZEFtb3VudDogaXNPdXRib3VuZCA/IC10eG4ucGF5bWVudFN1bU91dGJvdW5kIDogLXR4bi5wYXltZW50U3VtLFxuICAgICAgY2hhcmdlZEN1cnJlbmN5OiBjb252ZXJ0Q3VycmVuY3kodHhuLmN1cnJlbmN5SWQpLFxuICAgICAgZGVzY3JpcHRpb246IGlzT3V0Ym91bmQgPyB0eG4uZnVsbFN1cHBsaWVyTmFtZU91dGJvdW5kIDogdHhuLmZ1bGxTdXBwbGllck5hbWVIZWIsXG4gICAgICBtZW1vOiB0eG4ubW9yZUluZm8gfHwgJycsXG4gICAgICBpbnN0YWxsbWVudHM6IGdldEluc3RhbGxtZW50c0luZm8odHhuKSB8fCB1bmRlZmluZWQsXG4gICAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXMuQ29tcGxldGVkLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hUcmFuc2FjdGlvbnMocGFnZTogUGFnZSwgb3B0aW9uczogU2NyYXBlck9wdGlvbnMsIGNvbXBhbnlTZXJ2aWNlT3B0aW9uczpDb21wYW55U2VydmljZU9wdGlvbnMsIHN0YXJ0TW9tZW50OiBNb21lbnQsIG1vbnRoTW9tZW50OiBNb21lbnQpOiBQcm9taXNlPFNjcmFwZWRBY2NvdW50c1dpdGhJbmRleD4ge1xuICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IGZldGNoQWNjb3VudHMocGFnZSwgY29tcGFueVNlcnZpY2VPcHRpb25zLnNlcnZpY2VzVXJsLCBtb250aE1vbWVudCk7XG4gIGNvbnN0IGRhdGFVcmwgPSBnZXRUcmFuc2FjdGlvbnNVcmwoY29tcGFueVNlcnZpY2VPcHRpb25zLnNlcnZpY2VzVXJsLCBtb250aE1vbWVudCk7XG4gIGNvbnN0IGRhdGFSZXN1bHQgPSBhd2FpdCBmZXRjaEdldFdpdGhpblBhZ2U8U2NyYXBlZFRyYW5zYWN0aW9uRGF0YT4ocGFnZSwgZGF0YVVybCk7XG4gIGlmIChkYXRhUmVzdWx0ICYmIF8uZ2V0KGRhdGFSZXN1bHQsICdIZWFkZXIuU3RhdHVzJykgPT09ICcxJyAmJiBkYXRhUmVzdWx0LkNhcmRzVHJhbnNhY3Rpb25zTGlzdEJlYW4pIHtcbiAgICBjb25zdCBhY2NvdW50VHhuczogU2NyYXBlZEFjY291bnRzV2l0aEluZGV4ID0ge307XG4gICAgYWNjb3VudHMuZm9yRWFjaCgoYWNjb3VudCkgPT4ge1xuICAgICAgY29uc3QgdHhuR3JvdXBzOiBTY3JhcGVkQ3VycmVudENhcmRUcmFuc2FjdGlvbnNbXSB8IHVuZGVmaW5lZCA9IF8uZ2V0KGRhdGFSZXN1bHQsIGBDYXJkc1RyYW5zYWN0aW9uc0xpc3RCZWFuLkluZGV4JHthY2NvdW50LmluZGV4fS5DdXJyZW50Q2FyZFRyYW5zYWN0aW9uc2ApO1xuICAgICAgaWYgKHR4bkdyb3Vwcykge1xuICAgICAgICBsZXQgYWxsVHhuczogVHJhbnNhY3Rpb25bXSA9IFtdO1xuICAgICAgICB0eG5Hcm91cHMuZm9yRWFjaCgodHhuR3JvdXApID0+IHtcbiAgICAgICAgICBpZiAodHhuR3JvdXAudHhuSXNyYWVsKSB7XG4gICAgICAgICAgICBjb25zdCB0eG5zID0gY29udmVydFRyYW5zYWN0aW9ucyh0eG5Hcm91cC50eG5Jc3JhZWwsIGFjY291bnQucHJvY2Vzc2VkRGF0ZSk7XG4gICAgICAgICAgICBhbGxUeG5zLnB1c2goLi4udHhucyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eG5Hcm91cC50eG5BYnJvYWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHR4bnMgPSBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bkdyb3VwLnR4bkFicm9hZCwgYWNjb3VudC5wcm9jZXNzZWREYXRlKTtcbiAgICAgICAgICAgIGFsbFR4bnMucHVzaCguLi50eG5zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5jb21iaW5lSW5zdGFsbG1lbnRzKSB7XG4gICAgICAgICAgYWxsVHhucyA9IGZpeEluc3RhbGxtZW50cyhhbGxUeG5zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5vdXRwdXREYXRhPy5lbmFibGVUcmFuc2FjdGlvbnNGaWx0ZXJCeURhdGUgPz8gdHJ1ZSkge1xuICAgICAgICAgIGFsbFR4bnMgPSBmaWx0ZXJPbGRUcmFuc2FjdGlvbnMoYWxsVHhucywgc3RhcnRNb21lbnQsIG9wdGlvbnMuY29tYmluZUluc3RhbGxtZW50cyB8fCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgYWNjb3VudFR4bnNbYWNjb3VudC5hY2NvdW50TnVtYmVyXSA9IHtcbiAgICAgICAgICBhY2NvdW50TnVtYmVyOiBhY2NvdW50LmFjY291bnROdW1iZXIsXG4gICAgICAgICAgaW5kZXg6IGFjY291bnQuaW5kZXgsXG4gICAgICAgICAgdHhuczogYWxsVHhucyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYWNjb3VudFR4bnM7XG4gIH1cblxuICByZXR1cm4ge307XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRXh0cmFEZXRhaWxzKHNlcnZpY2VzVXJsOiBzdHJpbmcsIG1vbnRoOiBNb21lbnQsIGFjY291bnRJbmRleDogbnVtYmVyLCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiBzdHJpbmcge1xuICBjb25zdCBtb2VkQ2hpdXYgPSBtb250aC5mb3JtYXQoJ01NWVlZWScpO1xuICByZXR1cm4gYnVpbGRVcmwoc2VydmljZXNVcmwsIHtcbiAgICBxdWVyeVBhcmFtczoge1xuICAgICAgcmVxTmFtZTogJ1BpcnRleUlza2FfMjA0JyxcbiAgICAgIENhcmRJbmRleDogYWNjb3VudEluZGV4LnRvU3RyaW5nKCksXG4gICAgICBzaG92YXJSYXR6OiB0cmFuc2FjdGlvbi5pZGVudGlmaWVyIS50b1N0cmluZygpLFxuICAgICAgbW9lZENoaXV2LFxuICAgIH0sXG4gIH0pO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0RXh0cmFTY3JhcFRyYW5zYWN0aW9uKHBhZ2U6IFBhZ2UsIG9wdGlvbnM6Q29tcGFueVNlcnZpY2VPcHRpb25zLCBtb250aDogTW9tZW50LCBhY2NvdW50SW5kZXg6IG51bWJlciwgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICBjb25zdCBkYXRhVXJsID0gZ2V0VHJhbnNhY3Rpb25FeHRyYURldGFpbHMob3B0aW9ucy5zZXJ2aWNlc1VybCwgbW9udGgsIGFjY291bnRJbmRleCwgdHJhbnNhY3Rpb24pO1xuICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2hHZXRXaXRoaW5QYWdlPFNjcmFwZWRUcmFuc2FjdGlvbkRhdGE+KHBhZ2UsIGRhdGFVcmwpO1xuICBcbiAgaWYgKCFkYXRhKSB7XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICB9XG5cbiAgY29uc3QgcmF3Q2F0ZWdvcnkgPSBfLmdldChkYXRhLCAnUGlydGV5SXNrYV8yMDRCZWFuLnNlY3RvcicpID8/ICcnO1xuICByZXR1cm4ge1xuICAgIC4uLnRyYW5zYWN0aW9uLFxuICAgIGNhdGVnb3J5OiByYXdDYXRlZ29yeS50cmltKCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldEV4dHJhU2NyYXBUcmFuc2FjdGlvbnMoYWNjb3VudFdpdGhJbmRleDogVHJhbnNhY3Rpb25zQWNjb3VudCAmIHsgaW5kZXg6IG51bWJlciB9LCBwYWdlOiBQYWdlLCBvcHRpb25zOiBDb21wYW55U2VydmljZU9wdGlvbnMsIG1vbnRoOiBtb21lbnQuTW9tZW50KTogUHJvbWlzZTxUcmFuc2FjdGlvbltdPiB7XG4gIGNvbnN0IHByb21pc2VzID0gYWNjb3VudFdpdGhJbmRleC50eG5zXG4gICAgLm1hcCgodCkgPT4gZ2V0RXh0cmFTY3JhcFRyYW5zYWN0aW9uKHBhZ2UsIG9wdGlvbnMsIG1vbnRoLCBhY2NvdW50V2l0aEluZGV4LmluZGV4LCB0KSk7XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4dHJhU2NyYXBBY2NvdW50KHBhZ2U6IFBhZ2UsIG9wdGlvbnM6IENvbXBhbnlTZXJ2aWNlT3B0aW9ucywgYWNjb3VudE1hcDogU2NyYXBlZEFjY291bnRzV2l0aEluZGV4LCBtb250aDogbW9tZW50Lk1vbWVudCk6IFByb21pc2U8U2NyYXBlZEFjY291bnRzV2l0aEluZGV4PiB7XG4gIGNvbnN0IHByb21pc2VzID0gT2JqZWN0LmtleXMoYWNjb3VudE1hcClcbiAgICAubWFwKGFzeW5jIChhKSA9PiAoe1xuICAgICAgLi4uYWNjb3VudE1hcFthXSxcbiAgICAgIHR4bnM6IGF3YWl0IGdldEV4dHJhU2NyYXBUcmFuc2FjdGlvbnMoYWNjb3VudE1hcFthXSwgcGFnZSwgb3B0aW9ucywgbW9udGgpLFxuICAgIH0pKTtcbiAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIHJldHVybiBhY2NvdW50cy5yZWR1Y2UoKG0sIHgpID0+ICh7IC4uLm0sIFt4LmFjY291bnROdW1iZXJdOiB4IH0pLCB7fSk7XG59XG5cbmZ1bmN0aW9uIGdldEV4dHJhU2NyYXAoYWNjb3VudHNXaXRoSW5kZXg6IFNjcmFwZWRBY2NvdW50c1dpdGhJbmRleFtdLCBwYWdlOiBQYWdlLCBvcHRpb25zOiBDb21wYW55U2VydmljZU9wdGlvbnMsIGFsbE1vbnRoczogbW9tZW50Lk1vbWVudFtdKTogUHJvbWlzZTxTY3JhcGVkQWNjb3VudHNXaXRoSW5kZXhbXT4ge1xuICBjb25zdCBhY3Rpb25zID0gYWNjb3VudHNXaXRoSW5kZXgubWFwKChhLCBpKSA9PiAoKSA9PiBnZXRFeHRyYVNjcmFwQWNjb3VudChwYWdlLCBvcHRpb25zLCBhLCBhbGxNb250aHNbaV0pKTtcbiAgcmV0dXJuIHJ1blNlcmlhbChhY3Rpb25zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBbGxUcmFuc2FjdGlvbnMocGFnZTogUGFnZSwgb3B0aW9uczogU2NyYXBlck9wdGlvbnMsIGNvbXBhbnlTZXJ2aWNlT3B0aW9uczpDb21wYW55U2VydmljZU9wdGlvbnMsIHN0YXJ0TW9tZW50OiBNb21lbnQpIHtcbiAgY29uc3QgZnV0dXJlTW9udGhzVG9TY3JhcGUgPSBvcHRpb25zLmZ1dHVyZU1vbnRoc1RvU2NyYXBlID8/IDE7XG4gIGNvbnN0IGFsbE1vbnRocyA9IGdldEFsbE1vbnRoTW9tZW50cyhzdGFydE1vbWVudCwgZnV0dXJlTW9udGhzVG9TY3JhcGUpO1xuICBjb25zdCByZXN1bHRzOiBTY3JhcGVkQWNjb3VudHNXaXRoSW5kZXhbXSA9IGF3YWl0IFByb21pc2UuYWxsKGFsbE1vbnRocy5tYXAoYXN5bmMgKG1vbnRoTW9tZW50KSA9PiB7XG4gICAgcmV0dXJuIGZldGNoVHJhbnNhY3Rpb25zKHBhZ2UsIG9wdGlvbnMsIGNvbXBhbnlTZXJ2aWNlT3B0aW9ucywgc3RhcnRNb21lbnQsIG1vbnRoTW9tZW50KTtcbiAgfSkpO1xuXG4gIGNvbnN0IGZpbmFsUmVzdWx0ID0gb3B0aW9ucy5hZGRpdGlvbmFsVHJhbnNhY3Rpb25JbmZvcm1hdGlvbiA/XG4gICAgYXdhaXQgZ2V0RXh0cmFTY3JhcChyZXN1bHRzLCBwYWdlLCBjb21wYW55U2VydmljZU9wdGlvbnMsIGFsbE1vbnRocykgOiByZXN1bHRzO1xuXG4gIGNvbnN0IGNvbWJpbmVkVHhuczogUmVjb3JkPHN0cmluZywgVHJhbnNhY3Rpb25bXT4gPSB7fTtcblxuICBmaW5hbFJlc3VsdC5mb3JFYWNoKChyZXN1bHQpID0+IHtcbiAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmZvckVhY2goKGFjY291bnROdW1iZXIpID0+IHtcbiAgICAgIGxldCB0eG5zRm9yQWNjb3VudCA9IGNvbWJpbmVkVHhuc1thY2NvdW50TnVtYmVyXTtcbiAgICAgIGlmICghdHhuc0ZvckFjY291bnQpIHtcbiAgICAgICAgdHhuc0ZvckFjY291bnQgPSBbXTtcbiAgICAgICAgY29tYmluZWRUeG5zW2FjY291bnROdW1iZXJdID0gdHhuc0ZvckFjY291bnQ7XG4gICAgICB9XG4gICAgICBjb25zdCB0b0JlQWRkZWRUeG5zID0gcmVzdWx0W2FjY291bnROdW1iZXJdLnR4bnM7XG4gICAgICBjb21iaW5lZFR4bnNbYWNjb3VudE51bWJlcl0ucHVzaCguLi50b0JlQWRkZWRUeG5zKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgYWNjb3VudHMgPSBPYmplY3Qua2V5cyhjb21iaW5lZFR4bnMpLm1hcCgoYWNjb3VudE51bWJlcikgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBhY2NvdW50TnVtYmVyLFxuICAgICAgdHhuczogY29tYmluZWRUeG5zW2FjY291bnROdW1iZXJdLFxuICAgIH07XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgc3VjY2VzczogdHJ1ZSxcbiAgICBhY2NvdW50cyxcbiAgfTtcbn1cblxudHlwZSBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscyA9IHsgaWQ6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZywgY2FyZDZEaWdpdHM6IHN0cmluZyB9O1xuY2xhc3MgSXNyYWNhcmRBbWV4QmFzZVNjcmFwZXIgZXh0ZW5kcyBCYXNlU2NyYXBlcldpdGhCcm93c2VyPFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzPiB7XG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29tcGFueUNvZGU6IHN0cmluZztcblxuICBwcml2YXRlIHNlcnZpY2VzVXJsOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogU2NyYXBlck9wdGlvbnMsIGJhc2VVcmw6IHN0cmluZywgY29tcGFueUNvZGU6IHN0cmluZykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybDtcbiAgICB0aGlzLmNvbXBhbnlDb2RlID0gY29tcGFueUNvZGU7XG4gICAgdGhpcy5zZXJ2aWNlc1VybCA9IGAke2Jhc2VVcmx9L3NlcnZpY2VzL1Byb3h5UmVxdWVzdEhhbmRsZXIuYXNoeGA7XG4gIH1cblxuICBhc3luYyBsb2dpbihjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpOiBQcm9taXNlPFNjcmFwZXJTY3JhcGluZ1Jlc3VsdD4ge1xuICAgIGF3YWl0IHRoaXMucGFnZS5zZXRSZXF1ZXN0SW50ZXJjZXB0aW9uKHRydWUpO1xuICAgIHRoaXMucGFnZS5vbigncmVxdWVzdCcsIChyZXF1ZXN0KSA9PiB7XG4gICAgICBpZiAocmVxdWVzdC51cmwoKS5pbmNsdWRlcygnZGV0ZWN0b3ItZG9tLm1pbi5qcycpKSB7XG4gICAgICAgIGRlYnVnKCdmb3JjZSBhYm9ydCBmb3IgcmVxdWVzdCBkbyBkb3dubG9hZCBkZXRlY3Rvci1kb20ubWluLmpzIHJlc291cmNlJyk7XG4gICAgICAgIHZvaWQgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm9pZCByZXF1ZXN0LmNvbnRpbnVlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhd2FpdCBtYXNrSGVhZGxlc3NVc2VyQWdlbnQodGhpcy5wYWdlKTtcblxuICAgIGF3YWl0IHRoaXMubmF2aWdhdGVUbyhgJHt0aGlzLmJhc2VVcmx9L3BlcnNvbmFsYXJlYS9Mb2dpbmApO1xuXG4gICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuTG9nZ2luZ0luKTtcblxuICAgIGNvbnN0IHZhbGlkYXRlVXJsID0gYCR7dGhpcy5zZXJ2aWNlc1VybH0/cmVxTmFtZT1WYWxpZGF0ZUlkRGF0YWA7XG4gICAgY29uc3QgdmFsaWRhdGVSZXF1ZXN0ID0ge1xuICAgICAgaWQ6IGNyZWRlbnRpYWxzLmlkLFxuICAgICAgY2FyZFN1ZmZpeDogY3JlZGVudGlhbHMuY2FyZDZEaWdpdHMsXG4gICAgICBjb3VudHJ5Q29kZTogQ09VTlRSWV9DT0RFLFxuICAgICAgaWRUeXBlOiBJRF9UWVBFLFxuICAgICAgY2hlY2tMZXZlbDogJzEnLFxuICAgICAgY29tcGFueUNvZGU6IHRoaXMuY29tcGFueUNvZGUsXG4gICAgfTtcbiAgICBjb25zdCB2YWxpZGF0ZVJlc3VsdCA9IGF3YWl0IGZldGNoUG9zdFdpdGhpblBhZ2U8U2NyYXBlZExvZ2luVmFsaWRhdGlvbj4odGhpcy5wYWdlLCB2YWxpZGF0ZVVybCwgdmFsaWRhdGVSZXF1ZXN0KTtcbiAgICBpZiAoIXZhbGlkYXRlUmVzdWx0IHx8ICF2YWxpZGF0ZVJlc3VsdC5IZWFkZXIgfHwgdmFsaWRhdGVSZXN1bHQuSGVhZGVyLlN0YXR1cyAhPT0gJzEnIHx8ICF2YWxpZGF0ZVJlc3VsdC5WYWxpZGF0ZUlkRGF0YUJlYW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBlcnJvciBkdXJpbmcgbG9naW4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZVJldHVybkNvZGUgPSB2YWxpZGF0ZVJlc3VsdC5WYWxpZGF0ZUlkRGF0YUJlYW4ucmV0dXJuQ29kZTtcbiAgICBkZWJ1ZyhgdXNlciB2YWxpZGF0ZSB3aXRoIHJldHVybiBjb2RlICcke3ZhbGlkYXRlUmV0dXJuQ29kZX0nYCk7XG4gICAgaWYgKHZhbGlkYXRlUmV0dXJuQ29kZSA9PT0gJzEnKSB7XG4gICAgICBjb25zdCB7IHVzZXJOYW1lIH0gPSB2YWxpZGF0ZVJlc3VsdC5WYWxpZGF0ZUlkRGF0YUJlYW47XG5cbiAgICAgIGNvbnN0IGxvZ2luVXJsID0gYCR7dGhpcy5zZXJ2aWNlc1VybH0/cmVxTmFtZT1wZXJmb3JtTG9nb25JYDtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgIEtvZE1pc2h0YW1lc2g6IHVzZXJOYW1lLFxuICAgICAgICBNaXNwYXJaaWh1eTogY3JlZGVudGlhbHMuaWQsXG4gICAgICAgIFNpc21hOiBjcmVkZW50aWFscy5wYXNzd29yZCxcbiAgICAgICAgY2FyZFN1ZmZpeDogY3JlZGVudGlhbHMuY2FyZDZEaWdpdHMsXG4gICAgICAgIGNvdW50cnlDb2RlOiBDT1VOVFJZX0NPREUsXG4gICAgICAgIGlkVHlwZTogSURfVFlQRSxcbiAgICAgIH07XG4gICAgICBjb25zdCBsb2dpblJlc3VsdCA9IGF3YWl0IGZldGNoUG9zdFdpdGhpblBhZ2U8eyBzdGF0dXM6IHN0cmluZyB9Pih0aGlzLnBhZ2UsIGxvZ2luVXJsLCByZXF1ZXN0KTtcbiAgICAgIGRlYnVnKGB1c2VyIGxvZ2luIHdpdGggc3RhdHVzICcke2xvZ2luUmVzdWx0Py5zdGF0dXN9J2ApO1xuXG4gICAgICBpZiAobG9naW5SZXN1bHQgJiYgbG9naW5SZXN1bHQuc3RhdHVzID09PSAnMScpIHtcbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuTG9naW5TdWNjZXNzKTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICBpZiAobG9naW5SZXN1bHQgJiYgbG9naW5SZXN1bHQuc3RhdHVzID09PSAnMycpIHtcbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuQ2hhbmdlUGFzc3dvcmQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yVHlwZTogU2NyYXBlckVycm9yVHlwZXMuQ2hhbmdlUGFzc3dvcmQsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2luRmFpbGVkKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvclR5cGU6IFNjcmFwZXJFcnJvclR5cGVzLkludmFsaWRQYXNzd29yZCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRlUmV0dXJuQ29kZSA9PT0gJzQnKSB7XG4gICAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5DaGFuZ2VQYXNzd29yZCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3JUeXBlOiBTY3JhcGVyRXJyb3JUeXBlcy5DaGFuZ2VQYXNzd29yZCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuTG9naW5GYWlsZWQpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yVHlwZTogU2NyYXBlckVycm9yVHlwZXMuSW52YWxpZFBhc3N3b3JkLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmZXRjaERhdGEoKSB7XG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0TW9tZW50ID0gbW9tZW50KCkuc3VidHJhY3QoMSwgJ3llYXJzJyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KGRlZmF1bHRTdGFydE1vbWVudCwgbW9tZW50KHN0YXJ0RGF0ZSkpO1xuXG4gICAgcmV0dXJuIGZldGNoQWxsVHJhbnNhY3Rpb25zKHRoaXMucGFnZSwgdGhpcy5vcHRpb25zLCB7XG5cbiAgICAgIHNlcnZpY2VzVXJsOiB0aGlzLnNlcnZpY2VzVXJsLFxuICAgICAgY29tcGFueUNvZGU6IHRoaXMuY29tcGFueUNvZGUsXG4gICAgfSwgc3RhcnRNb21lbnQpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IElzcmFjYXJkQW1leEJhc2VTY3JhcGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsSUFBQUEsU0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUcsVUFBQSxHQUFBSCxPQUFBO0FBS0EsSUFBQUksWUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sTUFBQSxHQUFBUCxPQUFB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
317
+ exports.default = IsracardAmexBaseScraper;
318
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1pc3JhY2FyZC1hbWV4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL2Jhc2UtaXNyYWNhcmQtYW1leC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDBEQUFpQztBQUNqQyxvREFBdUI7QUFDdkIsb0RBQTZDO0FBRTdDLDRDQUE2RjtBQUM3RixnREFBc0Q7QUFDdEQsNkRBQWtEO0FBQ2xELDRDQUE0QztBQUM1Qyw0Q0FBMkU7QUFDM0UsMERBQWlGO0FBQ2pGLGdEQUErQztBQUMvQyxrREFNeUI7QUFDekIsMkVBQXFFO0FBQ3JFLHFDQUE2QztBQUU3QyxnREFBbUY7QUFFbkYsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQzNCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQztBQUNwQixNQUFNLG9CQUFvQixHQUFHLE9BQU8sQ0FBQztBQUVyQyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUM7QUFFakMsTUFBTSxLQUFLLEdBQUcsSUFBQSxnQkFBUSxFQUFDLG9CQUFvQixDQUFDLENBQUM7QUE2RTdDLFNBQVMsY0FBYyxDQUFDLFdBQW1CLEVBQUUsV0FBbUI7SUFDOUQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNyRCxPQUFPLElBQUEsbUJBQVEsRUFBQyxXQUFXLEVBQUU7UUFDM0IsV0FBVyxFQUFFO1lBQ1gsT0FBTyxFQUFFLGdCQUFnQjtZQUN6QixVQUFVLEVBQUUsR0FBRztZQUNmLFdBQVc7WUFDWCxNQUFNLEVBQUUsTUFBTTtTQUNmO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELEtBQUssVUFBVSxhQUFhLENBQUMsSUFBVSxFQUFFLFdBQW1CLEVBQUUsV0FBbUI7SUFDL0UsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN6RCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUEsMEJBQWtC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bSAnbG9kYXNoJztcbmltcG9ydCBtb21lbnQsIHsgdHlwZSBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgdHlwZSBQYWdlIH0gZnJvbSAncHVwcGV0ZWVyJztcbmltcG9ydCB7IEFMVF9TSEVLRUxfQ1VSUkVOQ1ksIFNIRUtFTF9DVVJSRU5DWSwgU0hFS0VMX0NVUlJFTkNZX0tFWVdPUkQgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgU2NyYXBlclByb2dyZXNzVHlwZXMgfSBmcm9tICcuLi9kZWZpbml0aW9ucyc7XG5pbXBvcnQgZ2V0QWxsTW9udGhNb21lbnRzIGZyb20gJy4uL2hlbHBlcnMvZGF0ZXMnO1xuaW1wb3J0IHsgZ2V0RGVidWcgfSBmcm9tICcuLi9oZWxwZXJzL2RlYnVnJztcbmltcG9ydCB7IGZldGNoR2V0V2l0aGluUGFnZSwgZmV0Y2hQb3N0V2l0aGluUGFnZSB9IGZyb20gJy4uL2hlbHBlcnMvZmV0Y2gnO1xuaW1wb3J0IHsgZmlsdGVyT2xkVHJhbnNhY3Rpb25zLCBmaXhJbnN0YWxsbWVudHMgfSBmcm9tICcuLi9oZWxwZXJzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBydW5TZXJpYWwgfSBmcm9tICcuLi9oZWxwZXJzL3dhaXRpbmcnO1xuaW1wb3J0IHtcbiAgVHJhbnNhY3Rpb25TdGF0dXNlcyxcbiAgVHJhbnNhY3Rpb25UeXBlcyxcbiAgdHlwZSBUcmFuc2FjdGlvbixcbiAgdHlwZSBUcmFuc2FjdGlvbkluc3RhbGxtZW50cyxcbiAgdHlwZSBUcmFuc2FjdGlvbnNBY2NvdW50LFxufSBmcm9tICcuLi90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgQmFzZVNjcmFwZXJXaXRoQnJvd3NlciB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5pbXBvcnQgeyBTY3JhcGVyRXJyb3JUeXBlcyB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgU2NyYXBlck9wdGlvbnMsIHR5cGUgU2NyYXBlclNjcmFwaW5nUmVzdWx0IH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgaW50ZXJjZXB0aW9uUHJpb3JpdGllcywgbWFza0hlYWRsZXNzVXNlckFnZW50IH0gZnJvbSAnLi4vaGVscGVycy9icm93c2VyJztcblxuY29uc3QgQ09VTlRSWV9DT0RFID0gJzIxMic7XG5jb25zdCBJRF9UWVBFID0gJzEnO1xuY29uc3QgSU5TVEFMTE1FTlRTX0tFWVdPUkQgPSAn16rXqdec15XXnSc7XG5cbmNvbnN0IERBVEVfRk9STUFUID0gJ0REL01NL1lZWVknO1xuXG5jb25zdCBkZWJ1ZyA9IGdldERlYnVnKCdiYXNlLWlzcmFjYXJkLWFtZXgnKTtcblxudHlwZSBDb21wYW55U2VydmljZU9wdGlvbnMgPSB7XG4gIHNlcnZpY2VzVXJsOiBzdHJpbmc7XG4gIGNvbXBhbnlDb2RlOiBzdHJpbmc7XG59O1xuXG50eXBlIFNjcmFwZWRBY2NvdW50c1dpdGhJbmRleCA9IFJlY29yZDxzdHJpbmcsIFRyYW5zYWN0aW9uc0FjY291bnQgJiB7IGluZGV4OiBudW1iZXIgfT47XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBkZWFsU3VtVHlwZTogc3RyaW5nO1xuICB2b3VjaGVyTnVtYmVyUmF0ek91dGJvdW5kOiBzdHJpbmc7XG4gIHZvdWNoZXJOdW1iZXJSYXR6OiBzdHJpbmc7XG4gIG1vcmVJbmZvPzogc3RyaW5nO1xuICBkZWFsU3VtT3V0Ym91bmQ6IGJvb2xlYW47XG4gIGN1cnJlbmN5SWQ6IHN0cmluZztcbiAgY3VycmVudFBheW1lbnRDdXJyZW5jeTogc3RyaW5nO1xuICBkZWFsU3VtOiBudW1iZXI7XG4gIGZ1bGxQYXltZW50RGF0ZT86IHN0cmluZztcbiAgZnVsbFB1cmNoYXNlRGF0ZT86IHN0cmluZztcbiAgZnVsbFB1cmNoYXNlRGF0ZU91dGJvdW5kPzogc3RyaW5nO1xuICBmdWxsU3VwcGxpZXJOYW1lSGViOiBzdHJpbmc7XG4gIGZ1bGxTdXBwbGllck5hbWVPdXRib3VuZDogc3RyaW5nO1xuICBwYXltZW50U3VtOiBudW1iZXI7XG4gIHBheW1lbnRTdW1PdXRib3VuZDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU2NyYXBlZEFjY291bnQge1xuICBpbmRleDogbnVtYmVyO1xuICBhY2NvdW50TnVtYmVyOiBzdHJpbmc7XG4gIHByb2Nlc3NlZERhdGU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFNjcmFwZWRMb2dpblZhbGlkYXRpb24ge1xuICBIZWFkZXI6IHtcbiAgICBTdGF0dXM6IHN0cmluZztcbiAgfTtcbiAgVmFsaWRhdGVJZERhdGFCZWFuPzoge1xuICAgIHVzZXJOYW1lPzogc3RyaW5nO1xuICAgIHJldHVybkNvZGU6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNjcmFwZWRBY2NvdW50c1dpdGhpblBhZ2VSZXNwb25zZSB7XG4gIEhlYWRlcjoge1xuICAgIFN0YXR1czogc3RyaW5nO1xuICB9O1xuICBEYXNoYm9hcmRNb250aEJlYW4/OiB7XG4gICAgY2FyZHNDaGFyZ2VzOiB7XG4gICAgICBjYXJkSW5kZXg6IHN0cmluZztcbiAgICAgIGNhcmROdW1iZXI6IHN0cmluZztcbiAgICAgIGJpbGxpbmdEYXRlOiBzdHJpbmc7XG4gICAgfVtdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgU2NyYXBlZEN1cnJlbnRDYXJkVHJhbnNhY3Rpb25zIHtcbiAgdHhuSXNyYWVsPzogU2NyYXBlZFRyYW5zYWN0aW9uW107XG4gIHR4bkFicm9hZD86IFNjcmFwZWRUcmFuc2FjdGlvbltdO1xufVxuXG5pbnRlcmZhY2UgU2NyYXBlZFRyYW5zYWN0aW9uRGF0YSB7XG4gIEhlYWRlcj86IHtcbiAgICBTdGF0dXM6IHN0cmluZztcbiAgfTtcbiAgUGlydGV5SXNrYV8yMDRCZWFuPzoge1xuICAgIHNlY3Rvcjogc3RyaW5nO1xuICB9O1xuXG4gIENhcmRzVHJhbnNhY3Rpb25zTGlzdEJlYW4/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHtcbiAgICAgIEN1cnJlbnRDYXJkVHJhbnNhY3Rpb25zOiBTY3JhcGVkQ3VycmVudENhcmRUcmFuc2FjdGlvbnNbXTtcbiAgICB9XG4gID47XG59XG5cbmZ1bmN0aW9uIGdldEFjY291bnRzVXJsKHNlcnZpY2VzVXJsOiBzdHJpbmcsIG1vbnRoTW9tZW50OiBNb21lbnQpIHtcbiAgY29uc3QgYmlsbGluZ0RhdGUgPSBtb250aE1vbWVudC5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgcmV0dXJuIGJ1aWxkVXJsKHNlcnZpY2VzVXJsLCB7XG4gICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgIHJlcU5hbWU6ICdEYXNoYm9hcmRNb250aCcsXG4gICAgICBhY3Rpb25Db2RlOiAnMCcsXG4gICAgICBiaWxsaW5nRGF0ZSxcbiAgICAgIGZvcm1hdDogJ0pzb24nLFxuICAgIH0sXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFjY291bnRzKHBhZ2U6IFBhZ2UsIHNlcnZpY2VzVXJsOiBzdHJpbmcsIG1vbnRoTW9tZW50OiBNb21lbnQpOiBQcm9taXNlPFNjcmFwZWRBY2NvdW50W10+IHtcbiAgY29uc3QgZGF0YVVybCA9IGdldEFjY291bnRzVXJsKHNlcnZpY2VzVXJsLCBtb250aE1vbWVudCk7XG4gIGNvbnN0IGRhdGFSZXN1bHQgPSBhd2FpdCBmZXRjaEdldFdpdGhpblBhZ2U8U2NyYXBlZEFjY291bnRzV2l0aGluUGFnZVJlc3BvbnNlPihwYWdlLCBkYXRhVXJsKTtcbiAgaWYgKGRhdGFSZXN1bHQgJiYgXy5nZXQoZGF0YVJlc3VsdCwgJ0hlYWRlci5TdGF0dXMnKSA9PT0gJzEnICYmIGRhdGFSZXN1bHQuRGFzaGJvYXJkTW9udGhCZWFuKSB7XG4gICAgY29uc3QgeyBjYXJkc0NoYXJnZXMgfSA9IGRhdGFSZXN1bHQuRGFzaGJvYXJkTW9udGhCZWFuO1xuICAgIGlmIChjYXJkc0NoYXJnZXMpIHtcbiAgICAgIHJldHVybiBjYXJkc0NoYXJnZXMubWFwKGNhcmRDaGFyZ2UgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGluZGV4OiBwYXJzZUludChjYXJkQ2hhcmdlLmNhcmRJbmRleCwgMTApLFxuICAgICAgICAgIGFjY291bnROdW1iZXI6IGNhcmRDaGFyZ2UuY2FyZE51bWJlcixcbiAgICAgICAgICBwcm9jZXNzZWREYXRlOiBtb21lbnQoY2FyZENoYXJnZS5iaWxsaW5nRGF0ZSwgREFURV9GT1JNQVQpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbnNVcmwoc2VydmljZXNVcmw6IHN0cmluZywgbW9udGhNb21lbnQ6IE1vbWVudCkge1xuICBjb25zdCBtb250aCA9IG1vbnRoTW9tZW50Lm1vbnRoKCkgKyAxO1xuICBjb25zdCB5ZWFyID0gbW9udGhNb21lbnQueWVhcigpO1xuICBjb25zdCBtb250aFN0ciA9IG1vbnRoIDwgMTAgPyBgMCR7bW9udGh9YCA6IG1vbnRoLnRvU3RyaW5nKCk7XG4gIHJldHVybiBidWlsZFVybChzZXJ2aWNlc1VybCwge1xuICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICByZXFOYW1lOiAnQ2FyZHNUcmFuc2FjdGlvbnNMaXN0JyxcbiAgICAgIG1vbnRoOiBtb250aFN0cixcbiAgICAgIHllYXI6IGAke3llYXJ9YCxcbiAgICAgIHJlcXVpcmVkRGF0ZTogJ04nLFxuICAgIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0Q3VycmVuY3koY3VycmVuY3lTdHI6IHN0cmluZykge1xuICBpZiAoY3VycmVuY3lTdHIgPT09IFNIRUtFTF9DVVJSRU5DWV9LRVlXT1JEIHx8IGN1cnJlbmN5U3RyID09PSBBTFRfU0hFS0VMX0NVUlJFTkNZKSB7XG4gICAgcmV0dXJuIFNIRUtFTF9DVVJSRU5DWTtcbiAgfVxuICByZXR1cm4gY3VycmVuY3lTdHI7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RhbGxtZW50c0luZm8odHhuOiBTY3JhcGVkVHJhbnNhY3Rpb24pOiBUcmFuc2FjdGlvbkluc3RhbGxtZW50cyB8IHVuZGVmaW5lZCB7XG4gIGlmICghdHhuLm1vcmVJbmZvIHx8ICF0eG4ubW9yZUluZm8uaW5jbHVkZXMoSU5TVEFMTE1FTlRTX0tFWVdPUkQpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBtYXRjaGVzID0gdHhuLm1vcmVJbmZvLm1hdGNoKC9cXGQrL2cpO1xuICBpZiAoIW1hdGNoZXMgfHwgbWF0Y2hlcy5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbnVtYmVyOiBwYXJzZUludChtYXRjaGVzWzBdLCAxMCksXG4gICAgdG90YWw6IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25UeXBlKHR4bjogU2NyYXBlZFRyYW5zYWN0aW9uKSB7XG4gIHJldHVybiBnZXRJbnN0YWxsbWVudHNJbmZvKHR4bikgPyBUcmFuc2FjdGlvblR5cGVzLkluc3RhbGxtZW50cyA6IFRyYW5zYWN0aW9uVHlwZXMuTm9ybWFsO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VHJhbnNhY3Rpb25zKHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdLCBwcm9jZXNzZWREYXRlOiBzdHJpbmcpOiBUcmFuc2FjdGlvbltdIHtcbiAgY29uc3QgZmlsdGVyZWRUeG5zID0gdHhucy5maWx0ZXIoXG4gICAgdHhuID0+XG4gICAgICB0eG4uZGVhbFN1bVR5cGUgIT09ICcxJyAmJiB0eG4udm91Y2hlck51bWJlclJhdHogIT09ICcwMDAwMDAwMDAnICYmIHR4bi52b3VjaGVyTnVtYmVyUmF0ek91dGJvdW5kICE9PSAnMDAwMDAwMDAwJyxcbiAgKTtcblxuICByZXR1cm4gZmlsdGVyZWRUeG5zLm1hcCh0eG4gPT4ge1xuICAgIGNvbnN0IGlzT3V0Ym91bmQgPSB0eG4uZGVhbFN1bU91dGJvdW5kO1xuICAgIGNvbnN0IHR4bkRhdGVTdHIgPSBpc091dGJvdW5kID8gdHhuLmZ1bGxQdXJjaGFzZURhdGVPdXRib3VuZCA6IHR4bi5mdWxsUHVyY2hhc2VEYXRlO1xuICAgIGNvbnN0IHR4bk1vbWVudCA9IG1vbWVudCh0eG5EYXRlU3RyLCBEQVRFX0ZPUk1BVCk7XG5cbiAgICBjb25zdCBjdXJyZW50UHJvY2Vzc2VkRGF0ZSA9IHR4bi5mdWxsUGF5bWVudERhdGVcbiAgICAgID8gbW9tZW50KHR4bi5mdWxsUGF5bWVudERhdGUsIERBVEVfRk9STUFUKS50b0lTT1N0cmluZygpXG4gICAgICA6IHByb2Nlc3NlZERhdGU7XG4gICAgY29uc3QgcmVzdWx0OiBUcmFuc2FjdGlvbiA9IHtcbiAgICAgIHR5cGU6IGdldFRyYW5zYWN0aW9uVHlwZSh0eG4pLFxuICAgICAgaWRlbnRpZmllcjogcGFyc2VJbnQoaXNPdXRib3VuZCA/IHR4bi52b3VjaGVyTnVtYmVyUmF0ek91dGJvdW5kIDogdHhuLnZvdWNoZXJOdW1iZXJSYXR6LCAxMCksXG4gICAgICBkYXRlOiB0eG5Nb21lbnQudG9JU09TdHJpbmcoKSxcbiAgICAgIHByb2Nlc3NlZERhdGU6IGN1cnJlbnRQcm9jZXNzZWREYXRlLFxuICAgICAgb3JpZ2luYWxBbW91bnQ6IGlzT3V0Ym91bmQgPyAtdHhuLmRlYWxTdW1PdXRib3VuZCA6IC10eG4uZGVhbFN1bSxcbiAgICAgIG9yaWdpbmFsQ3VycmVuY3k6IGNvbnZlcnRDdXJyZW5jeSh0eG4uY3VycmVudFBheW1lbnRDdXJyZW5jeSA/PyB0eG4uY3VycmVuY3lJZCksXG4gICAgICBjaGFyZ2VkQW1vdW50OiBpc091dGJvdW5kID8gLXR4bi5wYXltZW50U3VtT3V0Ym91bmQgOiAtdHhuLnBheW1lbnRTdW0sXG4gICAgICBjaGFyZ2VkQ3VycmVuY3k6IGNvbnZlcnRDdXJyZW5jeSh0eG4uY3VycmVuY3lJZCksXG4gICAgICBkZXNjcmlwdGlvbjogaXNPdXRib3VuZCA/IHR4bi5mdWxsU3VwcGxpZXJOYW1lT3V0Ym91bmQgOiB0eG4uZnVsbFN1cHBsaWVyTmFtZUhlYixcbiAgICAgIG1lbW86IHR4bi5tb3JlSW5mbyB8fCAnJyxcbiAgICAgIGluc3RhbGxtZW50czogZ2V0SW5zdGFsbG1lbnRzSW5mbyh0eG4pIHx8IHVuZGVmaW5lZCxcbiAgICAgIHN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcy5Db21wbGV0ZWQsXG4gICAgfTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFRyYW5zYWN0aW9ucyhcbiAgcGFnZTogUGFnZSxcbiAgb3B0aW9uczogU2NyYXBlck9wdGlvbnMsXG4gIGNvbXBhbnlTZXJ2aWNlT3B0aW9uczogQ29tcGFueVNlcnZpY2VPcHRpb25zLFxuICBzdGFydE1vbWVudDogTW9tZW50LFxuICBtb250aE1vbWVudDogTW9tZW50LFxuKTogUHJvbWlzZTxTY3JhcGVkQWNjb3VudHNXaXRoSW5kZXg+IHtcbiAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBmZXRjaEFjY291bnRzKHBhZ2UsIGNvbXBhbnlTZXJ2aWNlT3B0aW9ucy5zZXJ2aWNlc1VybCwgbW9udGhNb21lbnQpO1xuICBjb25zdCBkYXRhVXJsID0gZ2V0VHJhbnNhY3Rpb25zVXJsKGNvbXBhbnlTZXJ2aWNlT3B0aW9ucy5zZXJ2aWNlc1VybCwgbW9udGhNb21lbnQpO1xuICBjb25zdCBkYXRhUmVzdWx0ID0gYXdhaXQgZmV0Y2hHZXRXaXRoaW5QYWdlPFNjcmFwZWRUcmFuc2FjdGlvbkRhdGE+KHBhZ2UsIGRhdGFVcmwpO1xuICBpZiAoZGF0YVJlc3VsdCAmJiBfLmdldChkYXRhUmVzdWx0LCAnSGVhZGVyLlN0YXR1cycpID09PSAnMScgJiYgZGF0YVJlc3VsdC5DYXJkc1RyYW5zYWN0aW9uc0xpc3RCZWFuKSB7XG4gICAgY29uc3QgYWNjb3VudFR4bnM6IFNjcmFwZWRBY2NvdW50c1dpdGhJbmRleCA9IHt9O1xuICAgIGFjY291bnRzLmZvckVhY2goYWNjb3VudCA9PiB7XG4gICAgICBjb25zdCB0eG5Hcm91cHM6IFNjcmFwZWRDdXJyZW50Q2FyZFRyYW5zYWN0aW9uc1tdIHwgdW5kZWZpbmVkID0gXy5nZXQoXG4gICAgICAgIGRhdGFSZXN1bHQsXG4gICAgICAgIGBDYXJkc1RyYW5zYWN0aW9uc0xpc3RCZWFuLkluZGV4JHthY2NvdW50LmluZGV4fS5DdXJyZW50Q2FyZFRyYW5zYWN0aW9uc2AsXG4gICAgICApO1xuICAgICAgaWYgKHR4bkdyb3Vwcykge1xuICAgICAgICBsZXQgYWxsVHhuczogVHJhbnNhY3Rpb25bXSA9IFtdO1xuICAgICAgICB0eG5Hcm91cHMuZm9yRWFjaCh0eG5Hcm91cCA9PiB7XG4gICAgICAgICAgaWYgKHR4bkdyb3VwLnR4bklzcmFlbCkge1xuICAgICAgICAgICAgY29uc3QgdHhucyA9IGNvbnZlcnRUcmFuc2FjdGlvbnModHhuR3JvdXAudHhuSXNyYWVsLCBhY2NvdW50LnByb2Nlc3NlZERhdGUpO1xuICAgICAgICAgICAgYWxsVHhucy5wdXNoKC4uLnR4bnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHhuR3JvdXAudHhuQWJyb2FkKSB7XG4gICAgICAgICAgICBjb25zdCB0eG5zID0gY29udmVydFRyYW5zYWN0aW9ucyh0eG5Hcm91cC50eG5BYnJvYWQsIGFjY291bnQucHJvY2Vzc2VkRGF0ZSk7XG4gICAgICAgICAgICBhbGxUeG5zLnB1c2goLi4udHhucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMuY29tYmluZUluc3RhbGxtZW50cykge1xuICAgICAgICAgIGFsbFR4bnMgPSBmaXhJbnN0YWxsbWVudHMoYWxsVHhucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMub3V0cHV0RGF0YT8uZW5hYmxlVHJhbnNhY3Rpb25zRmlsdGVyQnlEYXRlID8/IHRydWUpIHtcbiAgICAgICAgICBhbGxUeG5zID0gZmlsdGVyT2xkVHJhbnNhY3Rpb25zKGFsbFR4bnMsIHN0YXJ0TW9tZW50LCBvcHRpb25zLmNvbWJpbmVJbnN0YWxsbWVudHMgfHwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGFjY291bnRUeG5zW2FjY291bnQuYWNjb3VudE51bWJlcl0gPSB7XG4gICAgICAgICAgYWNjb3VudE51bWJlcjogYWNjb3VudC5hY2NvdW50TnVtYmVyLFxuICAgICAgICAgIGluZGV4OiBhY2NvdW50LmluZGV4LFxuICAgICAgICAgIHR4bnM6IGFsbFR4bnMsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjY291bnRUeG5zO1xuICB9XG5cbiAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbkV4dHJhRGV0YWlscyhcbiAgc2VydmljZXNVcmw6IHN0cmluZyxcbiAgbW9udGg6IE1vbWVudCxcbiAgYWNjb3VudEluZGV4OiBudW1iZXIsXG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbixcbik6IHN0cmluZyB7XG4gIGNvbnN0IG1vZWRDaGl1diA9IG1vbnRoLmZvcm1hdCgnTU1ZWVlZJyk7XG4gIHJldHVybiBidWlsZFVybChzZXJ2aWNlc1VybCwge1xuICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICByZXFOYW1lOiAnUGlydGV5SXNrYV8yMDQnLFxuICAgICAgQ2FyZEluZGV4OiBhY2NvdW50SW5kZXgudG9TdHJpbmcoKSxcbiAgICAgIHNob3ZhclJhdHo6IHRyYW5zYWN0aW9uLmlkZW50aWZpZXIhLnRvU3RyaW5nKCksXG4gICAgICBtb2VkQ2hpdXYsXG4gICAgfSxcbiAgfSk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRFeHRyYVNjcmFwVHJhbnNhY3Rpb24oXG4gIHBhZ2U6IFBhZ2UsXG4gIG9wdGlvbnM6IENvbXBhbnlTZXJ2aWNlT3B0aW9ucyxcbiAgbW9udGg6IE1vbWVudCxcbiAgYWNjb3VudEluZGV4OiBudW1iZXIsXG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbixcbik6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgY29uc3QgZGF0YVVybCA9IGdldFRyYW5zYWN0aW9uRXh0cmFEZXRhaWxzKG9wdGlvbnMuc2VydmljZXNVcmwsIG1vbnRoLCBhY2NvdW50SW5kZXgsIHRyYW5zYWN0aW9uKTtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoR2V0V2l0aGluUGFnZTxTY3JhcGVkVHJhbnNhY3Rpb25EYXRhPihwYWdlLCBkYXRhVXJsKTtcblxuICBpZiAoIWRhdGEpIHtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb247XG4gIH1cblxuICBjb25zdCByYXdDYXRlZ29yeSA9IF8uZ2V0KGRhdGEsICdQaXJ0ZXlJc2thXzIwNEJlYW4uc2VjdG9yJykgPz8gJyc7XG4gIHJldHVybiB7XG4gICAgLi4udHJhbnNhY3Rpb24sXG4gICAgY2F0ZWdvcnk6IHJhd0NhdGVnb3J5LnRyaW0oKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RXh0cmFTY3JhcFRyYW5zYWN0aW9ucyhcbiAgYWNjb3VudFdpdGhJbmRleDogVHJhbnNhY3Rpb25zQWNjb3VudCAmIHsgaW5kZXg6IG51bWJlciB9LFxuICBwYWdlOiBQYWdlLFxuICBvcHRpb25zOiBDb21wYW55U2VydmljZU9wdGlvbnMsXG4gIG1vbnRoOiBtb21lbnQuTW9tZW50LFxuKTogUHJvbWlzZTxUcmFuc2FjdGlvbltdPiB7XG4gIGNvbnN0IHByb21pc2VzID0gYWNjb3VudFdpdGhJbmRleC50eG5zLm1hcCh0ID0+XG4gICAgZ2V0RXh0cmFTY3JhcFRyYW5zYWN0aW9uKHBhZ2UsIG9wdGlvbnMsIG1vbnRoLCBhY2NvdW50V2l0aEluZGV4LmluZGV4LCB0KSxcbiAgKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RXh0cmFTY3JhcEFjY291bnQoXG4gIHBhZ2U6IFBhZ2UsXG4gIG9wdGlvbnM6IENvbXBhbnlTZXJ2aWNlT3B0aW9ucyxcbiAgYWNjb3VudE1hcDogU2NyYXBlZEFjY291bnRzV2l0aEluZGV4LFxuICBtb250aDogbW9tZW50Lk1vbWVudCxcbik6IFByb21pc2U8U2NyYXBlZEFjY291bnRzV2l0aEluZGV4PiB7XG4gIGNvbnN0IHByb21pc2VzID0gT2JqZWN0LmtleXMoYWNjb3VudE1hcCkubWFwKGFzeW5jIGEgPT4gKHtcbiAgICAuLi5hY2NvdW50TWFwW2FdLFxuICAgIHR4bnM6IGF3YWl0IGdldEV4dHJhU2NyYXBUcmFuc2FjdGlvbnMoYWNjb3VudE1hcFthXSwgcGFnZSwgb3B0aW9ucywgbW9udGgpLFxuICB9KSk7XG4gIGNvbnN0IGFjY291bnRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICByZXR1cm4gYWNjb3VudHMucmVkdWNlKChtLCB4KSA9PiAoeyAuLi5tLCBbeC5hY2NvdW50TnVtYmVyXTogeCB9KSwge30pO1xufVxuXG5mdW5jdGlvbiBnZXRFeHRyYVNjcmFwKFxuICBhY2NvdW50c1dpdGhJbmRleDogU2NyYXBlZEFjY291bnRzV2l0aEluZGV4W10sXG4gIHBhZ2U6IFBhZ2UsXG4gIG9wdGlvbnM6IENvbXBhbnlTZXJ2aWNlT3B0aW9ucyxcbiAgYWxsTW9udGhzOiBtb21lbnQuTW9tZW50W10sXG4pOiBQcm9taXNlPFNjcmFwZWRBY2NvdW50c1dpdGhJbmRleFtdPiB7XG4gIGNvbnN0IGFjdGlvbnMgPSBhY2NvdW50c1dpdGhJbmRleC5tYXAoKGEsIGkpID0+ICgpID0+IGdldEV4dHJhU2NyYXBBY2NvdW50KHBhZ2UsIG9wdGlvbnMsIGEsIGFsbE1vbnRoc1tpXSkpO1xuICByZXR1cm4gcnVuU2VyaWFsKGFjdGlvbnMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFsbFRyYW5zYWN0aW9ucyhcbiAgcGFnZTogUGFnZSxcbiAgb3B0aW9uczogU2NyYXBlck9wdGlvbnMsXG4gIGNvbXBhbnlTZXJ2aWNlT3B0aW9uczogQ29tcGFueVNlcnZpY2VPcHRpb25zLFxuICBzdGFydE1vbWVudDogTW9tZW50LFxuKSB7XG4gIGNvbnN0IGZ1dHVyZU1vbnRoc1RvU2NyYXBlID0gb3B0aW9ucy5mdXR1cmVNb250aHNUb1NjcmFwZSA/PyAxO1xuICBjb25zdCBhbGxNb250aHMgPSBnZXRBbGxNb250aE1vbWVudHMoc3RhcnRNb21lbnQsIGZ1dHVyZU1vbnRoc1RvU2NyYXBlKTtcbiAgY29uc3QgcmVzdWx0czogU2NyYXBlZEFjY291bnRzV2l0aEluZGV4W10gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBhbGxNb250aHMubWFwKGFzeW5jIG1vbnRoTW9tZW50ID0+IHtcbiAgICAgIHJldHVybiBmZXRjaFRyYW5zYWN0aW9ucyhwYWdlLCBvcHRpb25zLCBjb21wYW55U2VydmljZU9wdGlvbnMsIHN0YXJ0TW9tZW50LCBtb250aE1vbWVudCk7XG4gICAgfSksXG4gICk7XG5cbiAgY29uc3QgZmluYWxSZXN1bHQgPSBvcHRpb25zLmFkZGl0aW9uYWxUcmFuc2FjdGlvbkluZm9ybWF0aW9uXG4gICAgPyBhd2FpdCBnZXRFeHRyYVNjcmFwKHJlc3VsdHMsIHBhZ2UsIGNvbXBhbnlTZXJ2aWNlT3B0aW9ucywgYWxsTW9udGhzKVxuICAgIDogcmVzdWx0cztcblxuICBjb25zdCBjb21iaW5lZFR4bnM6IFJlY29yZDxzdHJpbmcsIFRyYW5zYWN0aW9uW10+ID0ge307XG5cbiAgZmluYWxSZXN1bHQuZm9yRWFjaChyZXN1bHQgPT4ge1xuICAgIE9iamVjdC5rZXlzKHJlc3VsdCkuZm9yRWFjaChhY2NvdW50TnVtYmVyID0+IHtcbiAgICAgIGxldCB0eG5zRm9yQWNjb3VudCA9IGNvbWJpbmVkVHhuc1thY2NvdW50TnVtYmVyXTtcbiAgICAgIGlmICghdHhuc0ZvckFjY291bnQpIHtcbiAgICAgICAgdHhuc0ZvckFjY291bnQgPSBbXTtcbiAgICAgICAgY29tYmluZWRUeG5zW2FjY291bnROdW1iZXJdID0gdHhuc0ZvckFjY291bnQ7XG4gICAgICB9XG4gICAgICBjb25zdCB0b0JlQWRkZWRUeG5zID0gcmVzdWx0W2FjY291bnROdW1iZXJdLnR4bnM7XG4gICAgICBjb21iaW5lZFR4bnNbYWNjb3VudE51bWJlcl0ucHVzaCguLi50b0JlQWRkZWRUeG5zKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgYWNjb3VudHMgPSBPYmplY3Qua2V5cyhjb21iaW5lZFR4bnMpLm1hcChhY2NvdW50TnVtYmVyID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudE51bWJlcixcbiAgICAgIHR4bnM6IGNvbWJpbmVkVHhuc1thY2NvdW50TnVtYmVyXSxcbiAgICB9O1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgYWNjb3VudHMsXG4gIH07XG59XG5cbnR5cGUgU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMgPSB7IGlkOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmc7IGNhcmQ2RGlnaXRzOiBzdHJpbmcgfTtcbmNsYXNzIElzcmFjYXJkQW1leEJhc2VTY3JhcGVyIGV4dGVuZHMgQmFzZVNjcmFwZXJXaXRoQnJvd3NlcjxTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscz4ge1xuICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcblxuICBwcml2YXRlIGNvbXBhbnlDb2RlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBzZXJ2aWNlc1VybDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNjcmFwZXJPcHRpb25zLCBiYXNlVXJsOiBzdHJpbmcsIGNvbXBhbnlDb2RlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG4gICAgdGhpcy5jb21wYW55Q29kZSA9IGNvbXBhbnlDb2RlO1xuICAgIHRoaXMuc2VydmljZXNVcmwgPSBgJHtiYXNlVXJsfS9zZXJ2aWNlcy9Qcm94eVJlcXVlc3RIYW5kbGVyLmFzaHhgO1xuICB9XG5cbiAgYXN5bmMgbG9naW4oY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKTogUHJvbWlzZTxTY3JhcGVyU2NyYXBpbmdSZXN1bHQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhZ2Uuc2V0UmVxdWVzdEludGVyY2VwdGlvbih0cnVlKTtcbiAgICB0aGlzLnBhZ2Uub24oJ3JlcXVlc3QnLCByZXF1ZXN0ID0+IHtcbiAgICAgIGlmIChyZXF1ZXN0LnVybCgpLmluY2x1ZGVzKCdkZXRlY3Rvci1kb20ubWluLmpzJykpIHtcbiAgICAgICAgZGVidWcoJ2ZvcmNlIGFib3J0IGZvciByZXF1ZXN0IGRvIGRvd25sb2FkIGRldGVjdG9yLWRvbS5taW4uanMgcmVzb3VyY2UnKTtcbiAgICAgICAgdm9pZCByZXF1ZXN0LmFib3J0KHVuZGVmaW5lZCwgaW50ZXJjZXB0aW9uUHJpb3JpdGllcy5hYm9ydCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2b2lkIHJlcXVlc3QuY29udGludWUodW5kZWZpbmVkLCBpbnRlcmNlcHRpb25Qcmlvcml0aWVzLmNvbnRpbnVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGF3YWl0IG1hc2tIZWFkbGVzc1VzZXJBZ2VudCh0aGlzLnBhZ2UpO1xuXG4gICAgYXdhaXQgdGhpcy5uYXZpZ2F0ZVRvKGAke3RoaXMuYmFzZVVybH0vcGVyc29uYWxhcmVhL0xvZ2luYCk7XG5cbiAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Mb2dnaW5nSW4pO1xuXG4gICAgY29uc3QgdmFsaWRhdGVVcmwgPSBgJHt0aGlzLnNlcnZpY2VzVXJsfT9yZXFOYW1lPVZhbGlkYXRlSWREYXRhYDtcbiAgICBjb25zdCB2YWxpZGF0ZVJlcXVlc3QgPSB7XG4gICAgICBpZDogY3JlZGVudGlhbHMuaWQsXG4gICAgICBjYXJkU3VmZml4OiBjcmVkZW50aWFscy5jYXJkNkRpZ2l0cyxcbiAgICAgIGNvdW50cnlDb2RlOiBDT1VOVFJZX0NPREUsXG4gICAgICBpZFR5cGU6IElEX1RZUEUsXG4gICAgICBjaGVja0xldmVsOiAnMScsXG4gICAgICBjb21wYW55Q29kZTogdGhpcy5jb21wYW55Q29kZSxcbiAgICB9O1xuICAgIGNvbnN0IHZhbGlkYXRlUmVzdWx0ID0gYXdhaXQgZmV0Y2hQb3N0V2l0aGluUGFnZTxTY3JhcGVkTG9naW5WYWxpZGF0aW9uPih0aGlzLnBhZ2UsIHZhbGlkYXRlVXJsLCB2YWxpZGF0ZVJlcXVlc3QpO1xuICAgIGlmIChcbiAgICAgICF2YWxpZGF0ZVJlc3VsdCB8fFxuICAgICAgIXZhbGlkYXRlUmVzdWx0LkhlYWRlciB8fFxuICAgICAgdmFsaWRhdGVSZXN1bHQuSGVhZGVyLlN0YXR1cyAhPT0gJzEnIHx8XG4gICAgICAhdmFsaWRhdGVSZXN1bHQuVmFsaWRhdGVJZERhdGFCZWFuXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gZXJyb3IgZHVyaW5nIGxvZ2luJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGVSZXR1cm5Db2RlID0gdmFsaWRhdGVSZXN1bHQuVmFsaWRhdGVJZERhdGFCZWFuLnJldHVybkNvZGU7XG4gICAgZGVidWcoYHVzZXIgdmFsaWRhdGUgd2l0aCByZXR1cm4gY29kZSAnJHt2YWxpZGF0ZVJldHVybkNvZGV9J2ApO1xuICAgIGlmICh2YWxpZGF0ZVJldHVybkNvZGUgPT09ICcxJykge1xuICAgICAgY29uc3QgeyB1c2VyTmFtZSB9ID0gdmFsaWRhdGVSZXN1bHQuVmFsaWRhdGVJZERhdGFCZWFuO1xuXG4gICAgICBjb25zdCBsb2dpblVybCA9IGAke3RoaXMuc2VydmljZXNVcmx9P3JlcU5hbWU9cGVyZm9ybUxvZ29uSWA7XG4gICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICBLb2RNaXNodGFtZXNoOiB1c2VyTmFtZSxcbiAgICAgICAgTWlzcGFyWmlodXk6IGNyZWRlbnRpYWxzLmlkLFxuICAgICAgICBTaXNtYTogY3JlZGVudGlhbHMucGFzc3dvcmQsXG4gICAgICAgIGNhcmRTdWZmaXg6IGNyZWRlbnRpYWxzLmNhcmQ2RGlnaXRzLFxuICAgICAgICBjb3VudHJ5Q29kZTogQ09VTlRSWV9DT0RFLFxuICAgICAgICBpZFR5cGU6IElEX1RZUEUsXG4gICAgICB9O1xuICAgICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCBmZXRjaFBvc3RXaXRoaW5QYWdlPHsgc3RhdHVzOiBzdHJpbmcgfT4odGhpcy5wYWdlLCBsb2dpblVybCwgcmVxdWVzdCk7XG4gICAgICBkZWJ1ZyhgdXNlciBsb2dpbiB3aXRoIHN0YXR1cyAnJHtsb2dpblJlc3VsdD8uc3RhdHVzfSdgKTtcblxuICAgICAgaWYgKGxvZ2luUmVzdWx0ICYmIGxvZ2luUmVzdWx0LnN0YXR1cyA9PT0gJzEnKSB7XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2luU3VjY2Vzcyk7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxvZ2luUmVzdWx0ICYmIGxvZ2luUmVzdWx0LnN0YXR1cyA9PT0gJzMnKSB7XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkNoYW5nZVBhc3N3b3JkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvclR5cGU6IFNjcmFwZXJFcnJvclR5cGVzLkNoYW5nZVBhc3N3b3JkLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Mb2dpbkZhaWxlZCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3JUeXBlOiBTY3JhcGVyRXJyb3JUeXBlcy5JbnZhbGlkUGFzc3dvcmQsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZVJldHVybkNvZGUgPT09ICc0Jykge1xuICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuQ2hhbmdlUGFzc3dvcmQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yVHlwZTogU2NyYXBlckVycm9yVHlwZXMuQ2hhbmdlUGFzc3dvcmQsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2luRmFpbGVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBlcnJvclR5cGU6IFNjcmFwZXJFcnJvclR5cGVzLkludmFsaWRQYXNzd29yZCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCkge1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydE1vbWVudCA9IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFycycpO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMub3B0aW9ucy5zdGFydERhdGUgfHwgZGVmYXVsdFN0YXJ0TW9tZW50LnRvRGF0ZSgpO1xuICAgIGNvbnN0IHN0YXJ0TW9tZW50ID0gbW9tZW50Lm1heChkZWZhdWx0U3RhcnRNb21lbnQsIG1vbWVudChzdGFydERhdGUpKTtcblxuICAgIHJldHVybiBmZXRjaEFsbFRyYW5zYWN0aW9ucyhcbiAgICAgIHRoaXMucGFnZSxcbiAgICAgIHRoaXMub3B0aW9ucyxcbiAgICAgIHtcbiAgICAgICAgc2VydmljZXNVcmw6IHRoaXMuc2VydmljZXNVcmwsXG4gICAgICAgIGNvbXBhbnlDb2RlOiB0aGlzLmNvbXBhbnlDb2RlLFxuICAgICAgfSxcbiAgICAgIHN0YXJ0TW9tZW50LFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSXNyYWNhcmRBbWV4QmFzZVNjcmFwZXI7XG4iXX0=