israeli-bank-scrapers 6.1.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 (79) hide show
  1. package/lib/assertNever.js +5 -7
  2. package/lib/constants.js +13 -16
  3. package/lib/definitions.js +109 -113
  4. package/lib/helpers/browser.js +9 -16
  5. package/lib/helpers/dates.js +18 -19
  6. package/lib/helpers/debug.js +9 -9
  7. package/lib/helpers/elements-interactions.js +78 -84
  8. package/lib/helpers/fetch.js +82 -89
  9. package/lib/helpers/navigation.js +24 -31
  10. package/lib/helpers/storage.js +10 -12
  11. package/lib/helpers/transactions.js +33 -35
  12. package/lib/helpers/waiting.js +45 -44
  13. package/lib/index.js +15 -82
  14. package/lib/scrapers/amex.js +11 -13
  15. package/lib/scrapers/base-beinleumi-group.js +233 -252
  16. package/lib/scrapers/base-isracard-amex.js +273 -286
  17. package/lib/scrapers/base-scraper-with-browser.js +240 -274
  18. package/lib/scrapers/base-scraper.js +82 -86
  19. package/lib/scrapers/behatsdaa.js +98 -107
  20. package/lib/scrapers/beinleumi.js +11 -20
  21. package/lib/scrapers/beyahad-bishvilha.js +132 -138
  22. package/lib/scrapers/discount.js +97 -103
  23. package/lib/scrapers/errors.js +22 -25
  24. package/lib/scrapers/factory.js +66 -67
  25. package/lib/scrapers/hapoalim.js +162 -182
  26. package/lib/scrapers/interface.js +2 -5
  27. package/lib/scrapers/isracard.js +11 -13
  28. package/lib/scrapers/leumi.js +167 -176
  29. package/lib/scrapers/massad.js +11 -20
  30. package/lib/scrapers/max.js +256 -268
  31. package/lib/scrapers/mercantile.js +14 -20
  32. package/lib/scrapers/mizrahi.js +158 -159
  33. package/lib/scrapers/one-zero-queries.js +4 -7
  34. package/lib/scrapers/one-zero.js +176 -240
  35. package/lib/scrapers/otsar-hahayal.js +11 -20
  36. package/lib/scrapers/pagi.js +11 -20
  37. package/lib/scrapers/union-bank.js +172 -179
  38. package/lib/scrapers/visa-cal.js +254 -263
  39. package/lib/scrapers/yahav.js +190 -211
  40. package/lib/transactions.js +13 -16
  41. package/package.json +12 -14
  42. package/lib/scrapers/amex.test.d.ts +0 -1
  43. package/lib/scrapers/amex.test.js +0 -54
  44. package/lib/scrapers/base-scraper-with-browser.test.d.ts +0 -1
  45. package/lib/scrapers/base-scraper-with-browser.test.js +0 -58
  46. package/lib/scrapers/behatsdaa.test.d.ts +0 -1
  47. package/lib/scrapers/behatsdaa.test.js +0 -50
  48. package/lib/scrapers/beinleumi.test.d.ts +0 -1
  49. package/lib/scrapers/beinleumi.test.js +0 -52
  50. package/lib/scrapers/beyahad-bishvilha.test.d.ts +0 -1
  51. package/lib/scrapers/beyahad-bishvilha.test.js +0 -52
  52. package/lib/scrapers/discount.test.d.ts +0 -1
  53. package/lib/scrapers/discount.test.js +0 -54
  54. package/lib/scrapers/factory.test.d.ts +0 -1
  55. package/lib/scrapers/factory.test.js +0 -19
  56. package/lib/scrapers/hapoalim.test.d.ts +0 -1
  57. package/lib/scrapers/hapoalim.test.js +0 -52
  58. package/lib/scrapers/isracard.test.d.ts +0 -1
  59. package/lib/scrapers/isracard.test.js +0 -54
  60. package/lib/scrapers/leumi.test.d.ts +0 -1
  61. package/lib/scrapers/leumi.test.js +0 -52
  62. package/lib/scrapers/max.test.d.ts +0 -1
  63. package/lib/scrapers/max.test.js +0 -71
  64. package/lib/scrapers/mercantile.test.d.ts +0 -1
  65. package/lib/scrapers/mercantile.test.js +0 -50
  66. package/lib/scrapers/mizrahi.test.d.ts +0 -1
  67. package/lib/scrapers/mizrahi.test.js +0 -58
  68. package/lib/scrapers/one-zero.test.d.ts +0 -1
  69. package/lib/scrapers/one-zero.test.js +0 -56
  70. package/lib/scrapers/otsar-hahayal.test.d.ts +0 -1
  71. package/lib/scrapers/otsar-hahayal.test.js +0 -52
  72. package/lib/scrapers/pagi.test.d.ts +0 -1
  73. package/lib/scrapers/pagi.test.js +0 -52
  74. package/lib/scrapers/union-bank.test.d.ts +0 -1
  75. package/lib/scrapers/union-bank.test.js +0 -52
  76. package/lib/scrapers/visa-cal.test.d.ts +0 -1
  77. package/lib/scrapers/visa-cal.test.js +0 -54
  78. package/lib/scrapers/yahav.test.d.ts +0 -1
  79. 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(undefined, _browser.interceptionPriorities.abort);
251
- } else {
252
- void request.continue(undefined, _browser.interceptionPriorities.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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYnVpbGRVcmwiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9sb2Rhc2giLCJfbW9tZW50IiwiX2NvbnN0YW50cyIsIl9kZWZpbml0aW9ucyIsIl9kYXRlcyIsIl9kZWJ1ZyIsIl9mZXRjaCIsIl90cmFuc2FjdGlvbnMiLCJfd2FpdGluZyIsIl90cmFuc2FjdGlvbnMyIiwiX2Jhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJfZXJyb3JzIiwiX2Jyb3dzZXIiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJvd25LZXlzIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJpIiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJjYWxsIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwiQ09VTlRSWV9DT0RFIiwiSURfVFlQRSIsIklOU1RBTExNRU5UU19LRVlXT1JEIiwiREFURV9GT1JNQVQiLCJkZWJ1ZyIsImdldERlYnVnIiwiZ2V0QWNjb3VudHNVcmwiLCJzZXJ2aWNlc1VybCIsIm1vbnRoTW9tZW50IiwiYmlsbGluZ0RhdGUiLCJmb3JtYXQiLCJidWlsZFVybCIsInF1ZXJ5UGFyYW1zIiwicmVxTmFtZSIsImFjdGlvbkNvZGUiLCJmZXRjaEFjY291bnRzIiwicGFnZSIsImRhdGFVcmwiLCJkYXRhUmVzdWx0IiwiZmV0Y2hHZXRXaXRoaW5QYWdlIiwiXyIsImdldCIsIkRhc2hib2FyZE1vbnRoQmVhbiIsImNhcmRzQ2hhcmdlcyIsIm1hcCIsImNhcmRDaGFyZ2UiLCJpbmRleCIsInBhcnNlSW50IiwiY2FyZEluZGV4IiwiYWNjb3VudE51bWJlciIsImNhcmROdW1iZXIiLCJwcm9jZXNzZWREYXRlIiwibW9tZW50IiwidG9JU09TdHJpbmciLCJnZXRUcmFuc2FjdGlvbnNVcmwiLCJtb250aCIsInllYXIiLCJtb250aFN0ciIsInRvU3RyaW5nIiwicmVxdWlyZWREYXRlIiwiY29udmVydEN1cnJlbmN5IiwiY3VycmVuY3lTdHIiLCJTSEVLRUxfQ1VSUkVOQ1lfS0VZV09SRCIsIkFMVF9TSEVLRUxfQ1VSUkVOQ1kiLCJTSEVLRUxfQ1VSUkVOQ1kiLCJnZXRJbnN0YWxsbWVudHNJbmZvIiwidHhuIiwibW9yZUluZm8iLCJpbmNsdWRlcyIsInVuZGVmaW5lZCIsIm1hdGNoZXMiLCJtYXRjaCIsIm51bWJlciIsInRvdGFsIiwiZ2V0VHJhbnNhY3Rpb25UeXBlIiwiVHJhbnNhY3Rpb25UeXBlcyIsIkluc3RhbGxtZW50cyIsIk5vcm1hbCIsImNvbnZlcnRUcmFuc2FjdGlvbnMiLCJ0eG5zIiwiZmlsdGVyZWRUeG5zIiwiZGVhbFN1bVR5cGUiLCJ2b3VjaGVyTnVtYmVyUmF0eiIsInZvdWNoZXJOdW1iZXJSYXR6T3V0Ym91bmQiLCJfdHhuJGN1cnJlbnRQYXltZW50Q3UiLCJpc091dGJvdW5kIiwiZGVhbFN1bU91dGJvdW5kIiwidHhuRGF0ZVN0ciIsImZ1bGxQdXJjaGFzZURhdGVPdXRib3VuZCIsImZ1bGxQdXJjaGFzZURhdGUiLCJ0eG5Nb21lbnQiLCJjdXJyZW50UHJvY2Vzc2VkRGF0ZSIsImZ1bGxQYXltZW50RGF0ZSIsInJlc3VsdCIsInR5cGUiLCJpZGVudGlmaWVyIiwiZGF0ZSIsIm9yaWdpbmFsQW1vdW50IiwiZGVhbFN1bSIsIm9yaWdpbmFsQ3VycmVuY3kiLCJjdXJyZW50UGF5bWVudEN1cnJlbmN5IiwiY3VycmVuY3lJZCIsImNoYXJnZWRBbW91bnQiLCJwYXltZW50U3VtT3V0Ym91bmQiLCJwYXltZW50U3VtIiwiY2hhcmdlZEN1cnJlbmN5IiwiZGVzY3JpcHRpb24iLCJmdWxsU3VwcGxpZXJOYW1lT3V0Ym91bmQiLCJmdWxsU3VwcGxpZXJOYW1lSGViIiwibWVtbyIsImluc3RhbGxtZW50cyIsInN0YXR1cyIsIlRyYW5zYWN0aW9uU3RhdHVzZXMiLCJDb21wbGV0ZWQiLCJmZXRjaFRyYW5zYWN0aW9ucyIsIm9wdGlvbnMiLCJjb21wYW55U2VydmljZU9wdGlvbnMiLCJzdGFydE1vbWVudCIsImFjY291bnRzIiwiQ2FyZHNUcmFuc2FjdGlvbnNMaXN0QmVhbiIsImFjY291bnRUeG5zIiwiYWNjb3VudCIsInR4bkdyb3VwcyIsIl9vcHRpb25zJG91dHB1dERhdGEkZSIsIl9vcHRpb25zJG91dHB1dERhdGEiLCJhbGxUeG5zIiwidHhuR3JvdXAiLCJ0eG5Jc3JhZWwiLCJ0eG5BYnJvYWQiLCJjb21iaW5lSW5zdGFsbG1lbnRzIiwiZml4SW5zdGFsbG1lbnRzIiwib3V0cHV0RGF0YSIsImVuYWJsZVRyYW5zYWN0aW9uc0ZpbHRlckJ5RGF0ZSIsImZpbHRlck9sZFRyYW5zYWN0aW9ucyIsImdldFRyYW5zYWN0aW9uRXh0cmFEZXRhaWxzIiwiYWNjb3VudEluZGV4IiwidHJhbnNhY3Rpb24iLCJtb2VkQ2hpdXYiLCJDYXJkSW5kZXgiLCJzaG92YXJSYXR6IiwiZ2V0RXh0cmFTY3JhcFRyYW5zYWN0aW9uIiwiXyRnZXQiLCJkYXRhIiwicmF3Q2F0ZWdvcnkiLCJjYXRlZ29yeSIsInRyaW0iLCJnZXRFeHRyYVNjcmFwVHJhbnNhY3Rpb25zIiwiYWNjb3VudFdpdGhJbmRleCIsInByb21pc2VzIiwiUHJvbWlzZSIsImFsbCIsImdldEV4dHJhU2NyYXBBY2NvdW50IiwiYWNjb3VudE1hcCIsImEiLCJyZWR1Y2UiLCJtIiwieCIsImdldEV4dHJhU2NyYXAiLCJhY2NvdW50c1dpdGhJbmRleCIsImFsbE1vbnRocyIsImFjdGlvbnMiLCJydW5TZXJpYWwiLCJmZXRjaEFsbFRyYW5zYWN0aW9ucyIsIl9vcHRpb25zJGZ1dHVyZU1vbnRocyIsImZ1dHVyZU1vbnRoc1RvU2NyYXBlIiwiZ2V0QWxsTW9udGhNb21lbnRzIiwicmVzdWx0cyIsImZpbmFsUmVzdWx0IiwiYWRkaXRpb25hbFRyYW5zYWN0aW9uSW5mb3JtYXRpb24iLCJjb21iaW5lZFR4bnMiLCJ0eG5zRm9yQWNjb3VudCIsInRvQmVBZGRlZFR4bnMiLCJzdWNjZXNzIiwiSXNyYWNhcmRBbWV4QmFzZVNjcmFwZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiY29uc3RydWN0b3IiLCJiYXNlVXJsIiwiY29tcGFueUNvZGUiLCJsb2dpbiIsImNyZWRlbnRpYWxzIiwic2V0UmVxdWVzdEludGVyY2VwdGlvbiIsIm9uIiwicmVxdWVzdCIsInVybCIsImFib3J0IiwiaW50ZXJjZXB0aW9uUHJpb3JpdGllcyIsImNvbnRpbnVlIiwibWFza0hlYWRsZXNzVXNlckFnZW50IiwibmF2aWdhdGVUbyIsImVtaXRQcm9ncmVzcyIsIlNjcmFwZXJQcm9ncmVzc1R5cGVzIiwiTG9nZ2luZ0luIiwidmFsaWRhdGVVcmwiLCJ2YWxpZGF0ZVJlcXVlc3QiLCJpZCIsImNhcmRTdWZmaXgiLCJjYXJkNkRpZ2l0cyIsImNvdW50cnlDb2RlIiwiaWRUeXBlIiwiY2hlY2tMZXZlbCIsInZhbGlkYXRlUmVzdWx0IiwiZmV0Y2hQb3N0V2l0aGluUGFnZSIsIkhlYWRlciIsIlN0YXR1cyIsIlZhbGlkYXRlSWREYXRhQmVhbiIsIkVycm9yIiwidmFsaWRhdGVSZXR1cm5Db2RlIiwicmV0dXJuQ29kZSIsInVzZXJOYW1lIiwibG9naW5VcmwiLCJLb2RNaXNodGFtZXNoIiwiTWlzcGFyWmlodXkiLCJTaXNtYSIsInBhc3N3b3JkIiwibG9naW5SZXN1bHQiLCJMb2dpblN1Y2Nlc3MiLCJDaGFuZ2VQYXNzd29yZCIsImVycm9yVHlwZSIsIlNjcmFwZXJFcnJvclR5cGVzIiwiTG9naW5GYWlsZWQiLCJJbnZhbGlkUGFzc3dvcmQiLCJmZXRjaERhdGEiLCJkZWZhdWx0U3RhcnRNb21lbnQiLCJzdWJ0cmFjdCIsInN0YXJ0RGF0ZSIsInRvRGF0ZSIsIm1heCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9iYXNlLWlzcmFjYXJkLWFtZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGJ1aWxkVXJsIGZyb20gJ2J1aWxkLXVybCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG1vbWVudCwgeyB0eXBlIE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyB0eXBlIFBhZ2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHtcbiAgQUxUX1NIRUtFTF9DVVJSRU5DWSxcbiAgU0hFS0VMX0NVUlJFTkNZLFxuICBTSEVLRUxfQ1VSUkVOQ1lfS0VZV09SRCxcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFNjcmFwZXJQcm9ncmVzc1R5cGVzIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IGdldEFsbE1vbnRoTW9tZW50cyBmcm9tICcuLi9oZWxwZXJzL2RhdGVzJztcbmltcG9ydCB7IGdldERlYnVnIH0gZnJvbSAnLi4vaGVscGVycy9kZWJ1Zyc7XG5pbXBvcnQgeyBmZXRjaEdldFdpdGhpblBhZ2UsIGZldGNoUG9zdFdpdGhpblBhZ2UgfSBmcm9tICcuLi9oZWxwZXJzL2ZldGNoJztcbmltcG9ydCB7IGZpbHRlck9sZFRyYW5zYWN0aW9ucywgZml4SW5zdGFsbG1lbnRzIH0gZnJvbSAnLi4vaGVscGVycy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgcnVuU2VyaWFsIH0gZnJvbSAnLi4vaGVscGVycy93YWl0aW5nJztcbmltcG9ydCB7XG4gIFRyYW5zYWN0aW9uU3RhdHVzZXMsIFRyYW5zYWN0aW9uVHlwZXMsXG4gIHR5cGUgVHJhbnNhY3Rpb24sIHR5cGUgVHJhbnNhY3Rpb25JbnN0YWxsbWVudHMsXG4gIHR5cGUgVHJhbnNhY3Rpb25zQWNjb3VudCxcbn0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIgfSBmcm9tICcuL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInO1xuaW1wb3J0IHsgU2NyYXBlckVycm9yVHlwZXMgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyB0eXBlIFNjcmFwZXJPcHRpb25zLCB0eXBlIFNjcmFwZXJTY3JhcGluZ1Jlc3VsdCB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IGludGVyY2VwdGlvblByaW9yaXRpZXMsIG1hc2tIZWFkbGVzc1VzZXJBZ2VudCB9IGZyb20gJy4uL2hlbHBlcnMvYnJvd3Nlcic7XG5cbmNvbnN0IENPVU5UUllfQ09ERSA9ICcyMTInO1xuY29uc3QgSURfVFlQRSA9ICcxJztcbmNvbnN0IElOU1RBTExNRU5UU19LRVlXT1JEID0gJ9eq16nXnNeV150nO1xuXG5jb25zdCBEQVRFX0ZPUk1BVCA9ICdERC9NTS9ZWVlZJztcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZygnYmFzZS1pc3JhY2FyZC1hbWV4Jyk7XG5cbnR5cGUgQ29tcGFueVNlcnZpY2VPcHRpb25zID0ge1xuICBzZXJ2aWNlc1VybDogc3RyaW5nO1xuICBjb21wYW55Q29kZTogc3RyaW5nO1xufTtcblxudHlwZSBTY3JhcGVkQWNjb3VudHNXaXRoSW5kZXggPSBSZWNvcmQ8c3RyaW5nLCBUcmFuc2FjdGlvbnNBY2NvdW50ICYgeyBpbmRleDogbnVtYmVyIH0+O1xuXG5pbnRlcmZhY2UgU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgZGVhbFN1bVR5cGU6IHN0cmluZztcbiAgdm91Y2hlck51bWJlclJhdHpPdXRib3VuZDogc3RyaW5nO1xuICB2b3VjaGVyTnVtYmVyUmF0ejogc3RyaW5nO1xuICBtb3JlSW5mbz86IHN0cmluZztcbiAgZGVhbFN1bU91dGJvdW5kOiBib29sZWFuO1xuICBjdXJyZW5jeUlkOiBzdHJpbmc7XG4gIGN1cnJlbnRQYXltZW50Q3VycmVuY3k6IHN0cmluZztcbiAgZGVhbFN1bTogbnVtYmVyO1xuICBmdWxsUGF5bWVudERhdGU/OiBzdHJpbmc7XG4gIGZ1bGxQdXJjaGFzZURhdGU/OiBzdHJpbmc7XG4gIGZ1bGxQdXJjaGFzZURhdGVPdXRib3VuZD86IHN0cmluZztcbiAgZnVsbFN1cHBsaWVyTmFtZUhlYjogc3RyaW5nO1xuICBmdWxsU3VwcGxpZXJOYW1lT3V0Ym91bmQ6IHN0cmluZztcbiAgcGF5bWVudFN1bTogbnVtYmVyO1xuICBwYXltZW50U3VtT3V0Ym91bmQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFNjcmFwZWRBY2NvdW50IHtcbiAgaW5kZXg6IG51bWJlcjtcbiAgYWNjb3VudE51bWJlcjogc3RyaW5nO1xuICBwcm9jZXNzZWREYXRlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTY3JhcGVkTG9naW5WYWxpZGF0aW9uIHtcbiAgSGVhZGVyOiB7XG4gICAgU3RhdHVzOiBzdHJpbmc7XG4gIH07XG4gIFZhbGlkYXRlSWREYXRhQmVhbj86IHtcbiAgICB1c2VyTmFtZT86IHN0cmluZztcbiAgICByZXR1cm5Db2RlOiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBTY3JhcGVkQWNjb3VudHNXaXRoaW5QYWdlUmVzcG9uc2Uge1xuICBIZWFkZXI6IHtcbiAgICBTdGF0dXM6IHN0cmluZztcbiAgfTtcbiAgRGFzaGJvYXJkTW9udGhCZWFuPzoge1xuICAgIGNhcmRzQ2hhcmdlczoge1xuICAgICAgY2FyZEluZGV4OiBzdHJpbmc7XG4gICAgICBjYXJkTnVtYmVyOiBzdHJpbmc7XG4gICAgICBiaWxsaW5nRGF0ZTogc3RyaW5nO1xuICAgIH1bXTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNjcmFwZWRDdXJyZW50Q2FyZFRyYW5zYWN0aW9ucyB7XG4gIHR4bklzcmFlbD86IFNjcmFwZWRUcmFuc2FjdGlvbltdO1xuICB0eG5BYnJvYWQ/OiBTY3JhcGVkVHJhbnNhY3Rpb25bXTtcbn1cblxuaW50ZXJmYWNlIFNjcmFwZWRUcmFuc2FjdGlvbkRhdGEge1xuICBIZWFkZXI/OiB7XG4gICAgU3RhdHVzOiBzdHJpbmc7XG4gIH07XG4gIFBpcnRleUlza2FfMjA0QmVhbj86IHtcbiAgICBzZWN0b3I6IHN0cmluZztcbiAgfTtcbiAgXG4gIENhcmRzVHJhbnNhY3Rpb25zTGlzdEJlYW4/OiBSZWNvcmQ8c3RyaW5nLCB7XG4gICAgQ3VycmVudENhcmRUcmFuc2FjdGlvbnM6IFNjcmFwZWRDdXJyZW50Q2FyZFRyYW5zYWN0aW9uc1tdO1xuICB9Pjtcbn1cblxuZnVuY3Rpb24gZ2V0QWNjb3VudHNVcmwoc2VydmljZXNVcmw6IHN0cmluZywgbW9udGhNb21lbnQ6IE1vbWVudCkge1xuICBjb25zdCBiaWxsaW5nRGF0ZSA9IG1vbnRoTW9tZW50LmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICByZXR1cm4gYnVpbGRVcmwoc2VydmljZXNVcmwsIHtcbiAgICBxdWVyeVBhcmFtczoge1xuICAgICAgcmVxTmFtZTogJ0Rhc2hib2FyZE1vbnRoJyxcbiAgICAgIGFjdGlvbkNvZGU6ICcwJyxcbiAgICAgIGJpbGxpbmdEYXRlLFxuICAgICAgZm9ybWF0OiAnSnNvbicsXG4gICAgfSxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQWNjb3VudHMocGFnZTogUGFnZSwgc2VydmljZXNVcmw6IHN0cmluZywgbW9udGhNb21lbnQ6IE1vbWVudCk6IFByb21pc2U8U2NyYXBlZEFjY291bnRbXT4ge1xuICBjb25zdCBkYXRhVXJsID0gZ2V0QWNjb3VudHNVcmwoc2VydmljZXNVcmwsIG1vbnRoTW9tZW50KTtcbiAgY29uc3QgZGF0YVJlc3VsdCA9IGF3YWl0IGZldGNoR2V0V2l0aGluUGFnZTxTY3JhcGVkQWNjb3VudHNXaXRoaW5QYWdlUmVzcG9uc2U+KHBhZ2UsIGRhdGFVcmwpO1xuICBpZiAoZGF0YVJlc3VsdCAmJiBfLmdldChkYXRhUmVzdWx0LCAnSGVhZGVyLlN0YXR1cycpID09PSAnMScgJiYgZGF0YVJlc3VsdC5EYXNoYm9hcmRNb250aEJlYW4pIHtcbiAgICBjb25zdCB7IGNhcmRzQ2hhcmdlcyB9ID0gZGF0YVJlc3VsdC5EYXNoYm9hcmRNb250aEJlYW47XG4gICAgaWYgKGNhcmRzQ2hhcmdlcykge1xuICAgICAgcmV0dXJuIGNhcmRzQ2hhcmdlcy5tYXAoKGNhcmRDaGFyZ2UpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpbmRleDogcGFyc2VJbnQoY2FyZENoYXJnZS5jYXJkSW5kZXgsIDEwKSxcbiAgICAgICAgICBhY2NvdW50TnVtYmVyOiBjYXJkQ2hhcmdlLmNhcmROdW1iZXIsXG4gICAgICAgICAgcHJvY2Vzc2VkRGF0ZTogbW9tZW50KGNhcmRDaGFyZ2UuYmlsbGluZ0RhdGUsIERBVEVfRk9STUFUKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25zVXJsKHNlcnZpY2VzVXJsOiBzdHJpbmcsIG1vbnRoTW9tZW50OiBNb21lbnQpIHtcbiAgY29uc3QgbW9udGggPSBtb250aE1vbWVudC5tb250aCgpICsgMTtcbiAgY29uc3QgeWVhciA9IG1vbnRoTW9tZW50LnllYXIoKTtcbiAgY29uc3QgbW9udGhTdHIgPSBtb250aCA8IDEwID8gYDAke21vbnRofWAgOiBtb250aC50b1N0cmluZygpO1xuICByZXR1cm4gYnVpbGRVcmwoc2VydmljZXNVcmwsIHtcbiAgICBxdWVyeVBhcmFtczoge1xuICAgICAgcmVxTmFtZTogJ0NhcmRzVHJhbnNhY3Rpb25zTGlzdCcsXG4gICAgICBtb250aDogbW9udGhTdHIsXG4gICAgICB5ZWFyOiBgJHt5ZWFyfWAsXG4gICAgICByZXF1aXJlZERhdGU6ICdOJyxcbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gY29udmVydEN1cnJlbmN5KGN1cnJlbmN5U3RyOiBzdHJpbmcpIHtcbiAgaWYgKGN1cnJlbmN5U3RyID09PSBTSEVLRUxfQ1VSUkVOQ1lfS0VZV09SRCB8fCBjdXJyZW5jeVN0ciA9PT0gQUxUX1NIRUtFTF9DVVJSRU5DWSkge1xuICAgIHJldHVybiBTSEVLRUxfQ1VSUkVOQ1k7XG4gIH1cbiAgcmV0dXJuIGN1cnJlbmN5U3RyO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YWxsbWVudHNJbmZvKHR4bjogU2NyYXBlZFRyYW5zYWN0aW9uKTogVHJhbnNhY3Rpb25JbnN0YWxsbWVudHMgfCB1bmRlZmluZWQge1xuICBpZiAoIXR4bi5tb3JlSW5mbyB8fCAhdHhuLm1vcmVJbmZvLmluY2x1ZGVzKElOU1RBTExNRU5UU19LRVlXT1JEKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgbWF0Y2hlcyA9IHR4bi5tb3JlSW5mby5tYXRjaCgvXFxkKy9nKTtcbiAgaWYgKCFtYXRjaGVzIHx8IG1hdGNoZXMubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG51bWJlcjogcGFyc2VJbnQobWF0Y2hlc1swXSwgMTApLFxuICAgIHRvdGFsOiBwYXJzZUludChtYXRjaGVzWzFdLCAxMCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uVHlwZSh0eG46IFNjcmFwZWRUcmFuc2FjdGlvbikge1xuICByZXR1cm4gZ2V0SW5zdGFsbG1lbnRzSW5mbyh0eG4pID8gVHJhbnNhY3Rpb25UeXBlcy5JbnN0YWxsbWVudHMgOiBUcmFuc2FjdGlvblR5cGVzLk5vcm1hbDtcbn1cblxuZnVuY3Rpb24gY29udmVydFRyYW5zYWN0aW9ucyh0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSwgcHJvY2Vzc2VkRGF0ZTogc3RyaW5nKTogVHJhbnNhY3Rpb25bXSB7XG4gIGNvbnN0IGZpbHRlcmVkVHhucyA9IHR4bnMuZmlsdGVyKCh0eG4pID0+IHR4bi5kZWFsU3VtVHlwZSAhPT0gJzEnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4bi52b3VjaGVyTnVtYmVyUmF0eiAhPT0gJzAwMDAwMDAwMCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhuLnZvdWNoZXJOdW1iZXJSYXR6T3V0Ym91bmQgIT09ICcwMDAwMDAwMDAnKTtcblxuICByZXR1cm4gZmlsdGVyZWRUeG5zLm1hcCgodHhuKSA9PiB7XG4gICAgY29uc3QgaXNPdXRib3VuZCA9IHR4bi5kZWFsU3VtT3V0Ym91bmQ7XG4gICAgY29uc3QgdHhuRGF0ZVN0ciA9IGlzT3V0Ym91bmQgPyB0eG4uZnVsbFB1cmNoYXNlRGF0ZU91dGJvdW5kIDogdHhuLmZ1bGxQdXJjaGFzZURhdGU7XG4gICAgY29uc3QgdHhuTW9tZW50ID0gbW9tZW50KHR4bkRhdGVTdHIsIERBVEVfRk9STUFUKTtcblxuICAgIGNvbnN0IGN1cnJlbnRQcm9jZXNzZWREYXRlID0gdHhuLmZ1bGxQYXltZW50RGF0ZSA/XG4gICAgICBtb21lbnQodHhuLmZ1bGxQYXltZW50RGF0ZSwgREFURV9GT1JNQVQpLnRvSVNPU3RyaW5nKCkgOlxuICAgICAgcHJvY2Vzc2VkRGF0ZTtcbiAgICBjb25zdCByZXN1bHQ6IFRyYW5zYWN0aW9uID0ge1xuICAgICAgdHlwZTogZ2V0VHJhbnNhY3Rpb25UeXBlKHR4biksXG4gICAgICBpZGVudGlmaWVyOiBwYXJzZUludChpc091dGJvdW5kID8gdHhuLnZvdWNoZXJOdW1iZXJSYXR6T3V0Ym91bmQgOiB0eG4udm91Y2hlck51bWJlclJhdHosIDEwKSxcbiAgICAgIGRhdGU6IHR4bk1vbWVudC50b0lTT1N0cmluZygpLFxuICAgICAgcHJvY2Vzc2VkRGF0ZTogY3VycmVudFByb2Nlc3NlZERhdGUsXG4gICAgICBvcmlnaW5hbEFtb3VudDogaXNPdXRib3VuZCA/IC10eG4uZGVhbFN1bU91dGJvdW5kIDogLXR4bi5kZWFsU3VtLFxuICAgICAgb3JpZ2luYWxDdXJyZW5jeTogY29udmVydEN1cnJlbmN5KHR4bi5jdXJyZW50UGF5bWVudEN1cnJlbmN5ID8/IHR4bi5jdXJyZW5jeUlkKSxcbiAgICAgIGNoYXJnZWRBbW91bnQ6IGlzT3V0Ym91bmQgPyAtdHhuLnBheW1lbnRTdW1PdXRib3VuZCA6IC10eG4ucGF5bWVudFN1bSxcbiAgICAgIGNoYXJnZWRDdXJyZW5jeTogY29udmVydEN1cnJlbmN5KHR4bi5jdXJyZW5jeUlkKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBpc091dGJvdW5kID8gdHhuLmZ1bGxTdXBwbGllck5hbWVPdXRib3VuZCA6IHR4bi5mdWxsU3VwcGxpZXJOYW1lSGViLFxuICAgICAgbWVtbzogdHhuLm1vcmVJbmZvIHx8ICcnLFxuICAgICAgaW5zdGFsbG1lbnRzOiBnZXRJbnN0YWxsbWVudHNJbmZvKHR4bikgfHwgdW5kZWZpbmVkLFxuICAgICAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzLkNvbXBsZXRlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoVHJhbnNhY3Rpb25zKHBhZ2U6IFBhZ2UsIG9wdGlvbnM6IFNjcmFwZXJPcHRpb25zLCBjb21wYW55U2VydmljZU9wdGlvbnM6Q29tcGFueVNlcnZpY2VPcHRpb25zLCBzdGFydE1vbWVudDogTW9tZW50LCBtb250aE1vbWVudDogTW9tZW50KTogUHJvbWlzZTxTY3JhcGVkQWNjb3VudHNXaXRoSW5kZXg+IHtcbiAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBmZXRjaEFjY291bnRzKHBhZ2UsIGNvbXBhbnlTZXJ2aWNlT3B0aW9ucy5zZXJ2aWNlc1VybCwgbW9udGhNb21lbnQpO1xuICBjb25zdCBkYXRhVXJsID0gZ2V0VHJhbnNhY3Rpb25zVXJsKGNvbXBhbnlTZXJ2aWNlT3B0aW9ucy5zZXJ2aWNlc1VybCwgbW9udGhNb21lbnQpO1xuICBjb25zdCBkYXRhUmVzdWx0ID0gYXdhaXQgZmV0Y2hHZXRXaXRoaW5QYWdlPFNjcmFwZWRUcmFuc2FjdGlvbkRhdGE+KHBhZ2UsIGRhdGFVcmwpO1xuICBpZiAoZGF0YVJlc3VsdCAmJiBfLmdldChkYXRhUmVzdWx0LCAnSGVhZGVyLlN0YXR1cycpID09PSAnMScgJiYgZGF0YVJlc3VsdC5DYXJkc1RyYW5zYWN0aW9uc0xpc3RCZWFuKSB7XG4gICAgY29uc3QgYWNjb3VudFR4bnM6IFNjcmFwZWRBY2NvdW50c1dpdGhJbmRleCA9IHt9O1xuICAgIGFjY291bnRzLmZvckVhY2goKGFjY291bnQpID0+IHtcbiAgICAgIGNvbnN0IHR4bkdyb3VwczogU2NyYXBlZEN1cnJlbnRDYXJkVHJhbnNhY3Rpb25zW10gfCB1bmRlZmluZWQgPSBfLmdldChkYXRhUmVzdWx0LCBgQ2FyZHNUcmFuc2FjdGlvbnNMaXN0QmVhbi5JbmRleCR7YWNjb3VudC5pbmRleH0uQ3VycmVudENhcmRUcmFuc2FjdGlvbnNgKTtcbiAgICAgIGlmICh0eG5Hcm91cHMpIHtcbiAgICAgICAgbGV0IGFsbFR4bnM6IFRyYW5zYWN0aW9uW10gPSBbXTtcbiAgICAgICAgdHhuR3JvdXBzLmZvckVhY2goKHR4bkdyb3VwKSA9PiB7XG4gICAgICAgICAgaWYgKHR4bkdyb3VwLnR4bklzcmFlbCkge1xuICAgICAgICAgICAgY29uc3QgdHhucyA9IGNvbnZlcnRUcmFuc2FjdGlvbnModHhuR3JvdXAudHhuSXNyYWVsLCBhY2NvdW50LnByb2Nlc3NlZERhdGUpO1xuICAgICAgICAgICAgYWxsVHhucy5wdXNoKC4uLnR4bnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHhuR3JvdXAudHhuQWJyb2FkKSB7XG4gICAgICAgICAgICBjb25zdCB0eG5zID0gY29udmVydFRyYW5zYWN0aW9ucyh0eG5Hcm91cC50eG5BYnJvYWQsIGFjY291bnQucHJvY2Vzc2VkRGF0ZSk7XG4gICAgICAgICAgICBhbGxUeG5zLnB1c2goLi4udHhucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMuY29tYmluZUluc3RhbGxtZW50cykge1xuICAgICAgICAgIGFsbFR4bnMgPSBmaXhJbnN0YWxsbWVudHMoYWxsVHhucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMub3V0cHV0RGF0YT8uZW5hYmxlVHJhbnNhY3Rpb25zRmlsdGVyQnlEYXRlID8/IHRydWUpIHtcbiAgICAgICAgICBhbGxUeG5zID0gZmlsdGVyT2xkVHJhbnNhY3Rpb25zKGFsbFR4bnMsIHN0YXJ0TW9tZW50LCBvcHRpb25zLmNvbWJpbmVJbnN0YWxsbWVudHMgfHwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGFjY291bnRUeG5zW2FjY291bnQuYWNjb3VudE51bWJlcl0gPSB7XG4gICAgICAgICAgYWNjb3VudE51bWJlcjogYWNjb3VudC5hY2NvdW50TnVtYmVyLFxuICAgICAgICAgIGluZGV4OiBhY2NvdW50LmluZGV4LFxuICAgICAgICAgIHR4bnM6IGFsbFR4bnMsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjY291bnRUeG5zO1xuICB9XG5cbiAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbkV4dHJhRGV0YWlscyhzZXJ2aWNlc1VybDogc3RyaW5nLCBtb250aDogTW9tZW50LCBhY2NvdW50SW5kZXg6IG51bWJlciwgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKTogc3RyaW5nIHtcbiAgY29uc3QgbW9lZENoaXV2ID0gbW9udGguZm9ybWF0KCdNTVlZWVknKTtcbiAgcmV0dXJuIGJ1aWxkVXJsKHNlcnZpY2VzVXJsLCB7XG4gICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgIHJlcU5hbWU6ICdQaXJ0ZXlJc2thXzIwNCcsXG4gICAgICBDYXJkSW5kZXg6IGFjY291bnRJbmRleC50b1N0cmluZygpLFxuICAgICAgc2hvdmFyUmF0ejogdHJhbnNhY3Rpb24uaWRlbnRpZmllciEudG9TdHJpbmcoKSxcbiAgICAgIG1vZWRDaGl1dixcbiAgICB9LFxuICB9KTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldEV4dHJhU2NyYXBUcmFuc2FjdGlvbihwYWdlOiBQYWdlLCBvcHRpb25zOkNvbXBhbnlTZXJ2aWNlT3B0aW9ucywgbW9udGg6IE1vbWVudCwgYWNjb3VudEluZGV4OiBudW1iZXIsIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgY29uc3QgZGF0YVVybCA9IGdldFRyYW5zYWN0aW9uRXh0cmFEZXRhaWxzKG9wdGlvbnMuc2VydmljZXNVcmwsIG1vbnRoLCBhY2NvdW50SW5kZXgsIHRyYW5zYWN0aW9uKTtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoR2V0V2l0aGluUGFnZTxTY3JhcGVkVHJhbnNhY3Rpb25EYXRhPihwYWdlLCBkYXRhVXJsKTtcbiAgXG4gIGlmICghZGF0YSkge1xuICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIGNvbnN0IHJhd0NhdGVnb3J5ID0gXy5nZXQoZGF0YSwgJ1BpcnRleUlza2FfMjA0QmVhbi5zZWN0b3InKSA/PyAnJztcbiAgcmV0dXJuIHtcbiAgICAuLi50cmFuc2FjdGlvbixcbiAgICBjYXRlZ29yeTogcmF3Q2F0ZWdvcnkudHJpbSgpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRFeHRyYVNjcmFwVHJhbnNhY3Rpb25zKGFjY291bnRXaXRoSW5kZXg6IFRyYW5zYWN0aW9uc0FjY291bnQgJiB7IGluZGV4OiBudW1iZXIgfSwgcGFnZTogUGFnZSwgb3B0aW9uczogQ29tcGFueVNlcnZpY2VPcHRpb25zLCBtb250aDogbW9tZW50Lk1vbWVudCk6IFByb21pc2U8VHJhbnNhY3Rpb25bXT4ge1xuICBjb25zdCBwcm9taXNlcyA9IGFjY291bnRXaXRoSW5kZXgudHhuc1xuICAgIC5tYXAoKHQpID0+IGdldEV4dHJhU2NyYXBUcmFuc2FjdGlvbihwYWdlLCBvcHRpb25zLCBtb250aCwgYWNjb3VudFdpdGhJbmRleC5pbmRleCwgdCkpO1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeHRyYVNjcmFwQWNjb3VudChwYWdlOiBQYWdlLCBvcHRpb25zOiBDb21wYW55U2VydmljZU9wdGlvbnMsIGFjY291bnRNYXA6IFNjcmFwZWRBY2NvdW50c1dpdGhJbmRleCwgbW9udGg6IG1vbWVudC5Nb21lbnQpOiBQcm9taXNlPFNjcmFwZWRBY2NvdW50c1dpdGhJbmRleD4ge1xuICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC5rZXlzKGFjY291bnRNYXApXG4gICAgLm1hcChhc3luYyAoYSkgPT4gKHtcbiAgICAgIC4uLmFjY291bnRNYXBbYV0sXG4gICAgICB0eG5zOiBhd2FpdCBnZXRFeHRyYVNjcmFwVHJhbnNhY3Rpb25zKGFjY291bnRNYXBbYV0sIHBhZ2UsIG9wdGlvbnMsIG1vbnRoKSxcbiAgICB9KSk7XG4gIGNvbnN0IGFjY291bnRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICByZXR1cm4gYWNjb3VudHMucmVkdWNlKChtLCB4KSA9PiAoeyAuLi5tLCBbeC5hY2NvdW50TnVtYmVyXTogeCB9KSwge30pO1xufVxuXG5mdW5jdGlvbiBnZXRFeHRyYVNjcmFwKGFjY291bnRzV2l0aEluZGV4OiBTY3JhcGVkQWNjb3VudHNXaXRoSW5kZXhbXSwgcGFnZTogUGFnZSwgb3B0aW9uczogQ29tcGFueVNlcnZpY2VPcHRpb25zLCBhbGxNb250aHM6IG1vbWVudC5Nb21lbnRbXSk6IFByb21pc2U8U2NyYXBlZEFjY291bnRzV2l0aEluZGV4W10+IHtcbiAgY29uc3QgYWN0aW9ucyA9IGFjY291bnRzV2l0aEluZGV4Lm1hcCgoYSwgaSkgPT4gKCkgPT4gZ2V0RXh0cmFTY3JhcEFjY291bnQocGFnZSwgb3B0aW9ucywgYSwgYWxsTW9udGhzW2ldKSk7XG4gIHJldHVybiBydW5TZXJpYWwoYWN0aW9ucyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQWxsVHJhbnNhY3Rpb25zKHBhZ2U6IFBhZ2UsIG9wdGlvbnM6IFNjcmFwZXJPcHRpb25zLCBjb21wYW55U2VydmljZU9wdGlvbnM6Q29tcGFueVNlcnZpY2VPcHRpb25zLCBzdGFydE1vbWVudDogTW9tZW50KSB7XG4gIGNvbnN0IGZ1dHVyZU1vbnRoc1RvU2NyYXBlID0gb3B0aW9ucy5mdXR1cmVNb250aHNUb1NjcmFwZSA/PyAxO1xuICBjb25zdCBhbGxNb250aHMgPSBnZXRBbGxNb250aE1vbWVudHMoc3RhcnRNb21lbnQsIGZ1dHVyZU1vbnRoc1RvU2NyYXBlKTtcbiAgY29uc3QgcmVzdWx0czogU2NyYXBlZEFjY291bnRzV2l0aEluZGV4W10gPSBhd2FpdCBQcm9taXNlLmFsbChhbGxNb250aHMubWFwKGFzeW5jIChtb250aE1vbWVudCkgPT4ge1xuICAgIHJldHVybiBmZXRjaFRyYW5zYWN0aW9ucyhwYWdlLCBvcHRpb25zLCBjb21wYW55U2VydmljZU9wdGlvbnMsIHN0YXJ0TW9tZW50LCBtb250aE1vbWVudCk7XG4gIH0pKTtcblxuICBjb25zdCBmaW5hbFJlc3VsdCA9IG9wdGlvbnMuYWRkaXRpb25hbFRyYW5zYWN0aW9uSW5mb3JtYXRpb24gP1xuICAgIGF3YWl0IGdldEV4dHJhU2NyYXAocmVzdWx0cywgcGFnZSwgY29tcGFueVNlcnZpY2VPcHRpb25zLCBhbGxNb250aHMpIDogcmVzdWx0cztcblxuICBjb25zdCBjb21iaW5lZFR4bnM6IFJlY29yZDxzdHJpbmcsIFRyYW5zYWN0aW9uW10+ID0ge307XG5cbiAgZmluYWxSZXN1bHQuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKChhY2NvdW50TnVtYmVyKSA9PiB7XG4gICAgICBsZXQgdHhuc0ZvckFjY291bnQgPSBjb21iaW5lZFR4bnNbYWNjb3VudE51bWJlcl07XG4gICAgICBpZiAoIXR4bnNGb3JBY2NvdW50KSB7XG4gICAgICAgIHR4bnNGb3JBY2NvdW50ID0gW107XG4gICAgICAgIGNvbWJpbmVkVHhuc1thY2NvdW50TnVtYmVyXSA9IHR4bnNGb3JBY2NvdW50O1xuICAgICAgfVxuICAgICAgY29uc3QgdG9CZUFkZGVkVHhucyA9IHJlc3VsdFthY2NvdW50TnVtYmVyXS50eG5zO1xuICAgICAgY29tYmluZWRUeG5zW2FjY291bnROdW1iZXJdLnB1c2goLi4udG9CZUFkZGVkVHhucyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IGFjY291bnRzID0gT2JqZWN0LmtleXMoY29tYmluZWRUeG5zKS5tYXAoKGFjY291bnROdW1iZXIpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudE51bWJlcixcbiAgICAgIHR4bnM6IGNvbWJpbmVkVHhuc1thY2NvdW50TnVtYmVyXSxcbiAgICB9O1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgYWNjb3VudHMsXG4gIH07XG59XG5cbnR5cGUgU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMgPSB7IGlkOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIGNhcmQ2RGlnaXRzOiBzdHJpbmcgfTtcbmNsYXNzIElzcmFjYXJkQW1leEJhc2VTY3JhcGVyIGV4dGVuZHMgQmFzZVNjcmFwZXJXaXRoQnJvd3NlcjxTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscz4ge1xuICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcblxuICBwcml2YXRlIGNvbXBhbnlDb2RlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBzZXJ2aWNlc1VybDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNjcmFwZXJPcHRpb25zLCBiYXNlVXJsOiBzdHJpbmcsIGNvbXBhbnlDb2RlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG4gICAgdGhpcy5jb21wYW55Q29kZSA9IGNvbXBhbnlDb2RlO1xuICAgIHRoaXMuc2VydmljZXNVcmwgPSBgJHtiYXNlVXJsfS9zZXJ2aWNlcy9Qcm94eVJlcXVlc3RIYW5kbGVyLmFzaHhgO1xuICB9XG5cbiAgYXN5bmMgbG9naW4oY3JlZGVudGlhbHM6IFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzKTogUHJvbWlzZTxTY3JhcGVyU2NyYXBpbmdSZXN1bHQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhZ2Uuc2V0UmVxdWVzdEludGVyY2VwdGlvbih0cnVlKTtcbiAgICB0aGlzLnBhZ2Uub24oJ3JlcXVlc3QnLCAocmVxdWVzdCkgPT4ge1xuICAgICAgaWYgKHJlcXVlc3QudXJsKCkuaW5jbHVkZXMoJ2RldGVjdG9yLWRvbS5taW4uanMnKSkge1xuICAgICAgICBkZWJ1ZygnZm9yY2UgYWJvcnQgZm9yIHJlcXVlc3QgZG8gZG93bmxvYWQgZGV0ZWN0b3ItZG9tLm1pbi5qcyByZXNvdXJjZScpO1xuICAgICAgICB2b2lkIHJlcXVlc3QuYWJvcnQodW5kZWZpbmVkLCBpbnRlcmNlcHRpb25Qcmlvcml0aWVzLmFib3J0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZvaWQgcmVxdWVzdC5jb250aW51ZSh1bmRlZmluZWQsIGludGVyY2VwdGlvblByaW9yaXRpZXMuY29udGludWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgYXdhaXQgbWFza0hlYWRsZXNzVXNlckFnZW50KHRoaXMucGFnZSk7XG5cbiAgICBhd2FpdCB0aGlzLm5hdmlnYXRlVG8oYCR7dGhpcy5iYXNlVXJsfS9wZXJzb25hbGFyZWEvTG9naW5gKTtcblxuICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2dpbmdJbik7XG5cbiAgICBjb25zdCB2YWxpZGF0ZVVybCA9IGAke3RoaXMuc2VydmljZXNVcmx9P3JlcU5hbWU9VmFsaWRhdGVJZERhdGFgO1xuICAgIGNvbnN0IHZhbGlkYXRlUmVxdWVzdCA9IHtcbiAgICAgIGlkOiBjcmVkZW50aWFscy5pZCxcbiAgICAgIGNhcmRTdWZmaXg6IGNyZWRlbnRpYWxzLmNhcmQ2RGlnaXRzLFxuICAgICAgY291bnRyeUNvZGU6IENPVU5UUllfQ09ERSxcbiAgICAgIGlkVHlwZTogSURfVFlQRSxcbiAgICAgIGNoZWNrTGV2ZWw6ICcxJyxcbiAgICAgIGNvbXBhbnlDb2RlOiB0aGlzLmNvbXBhbnlDb2RlLFxuICAgIH07XG4gICAgY29uc3QgdmFsaWRhdGVSZXN1bHQgPSBhd2FpdCBmZXRjaFBvc3RXaXRoaW5QYWdlPFNjcmFwZWRMb2dpblZhbGlkYXRpb24+KHRoaXMucGFnZSwgdmFsaWRhdGVVcmwsIHZhbGlkYXRlUmVxdWVzdCk7XG4gICAgaWYgKCF2YWxpZGF0ZVJlc3VsdCB8fCAhdmFsaWRhdGVSZXN1bHQuSGVhZGVyIHx8IHZhbGlkYXRlUmVzdWx0LkhlYWRlci5TdGF0dXMgIT09ICcxJyB8fCAhdmFsaWRhdGVSZXN1bHQuVmFsaWRhdGVJZERhdGFCZWFuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gZXJyb3IgZHVyaW5nIGxvZ2luJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGVSZXR1cm5Db2RlID0gdmFsaWRhdGVSZXN1bHQuVmFsaWRhdGVJZERhdGFCZWFuLnJldHVybkNvZGU7XG4gICAgZGVidWcoYHVzZXIgdmFsaWRhdGUgd2l0aCByZXR1cm4gY29kZSAnJHt2YWxpZGF0ZVJldHVybkNvZGV9J2ApO1xuICAgIGlmICh2YWxpZGF0ZVJldHVybkNvZGUgPT09ICcxJykge1xuICAgICAgY29uc3QgeyB1c2VyTmFtZSB9ID0gdmFsaWRhdGVSZXN1bHQuVmFsaWRhdGVJZERhdGFCZWFuO1xuXG4gICAgICBjb25zdCBsb2dpblVybCA9IGAke3RoaXMuc2VydmljZXNVcmx9P3JlcU5hbWU9cGVyZm9ybUxvZ29uSWA7XG4gICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICBLb2RNaXNodGFtZXNoOiB1c2VyTmFtZSxcbiAgICAgICAgTWlzcGFyWmlodXk6IGNyZWRlbnRpYWxzLmlkLFxuICAgICAgICBTaXNtYTogY3JlZGVudGlhbHMucGFzc3dvcmQsXG4gICAgICAgIGNhcmRTdWZmaXg6IGNyZWRlbnRpYWxzLmNhcmQ2RGlnaXRzLFxuICAgICAgICBjb3VudHJ5Q29kZTogQ09VTlRSWV9DT0RFLFxuICAgICAgICBpZFR5cGU6IElEX1RZUEUsXG4gICAgICB9O1xuICAgICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCBmZXRjaFBvc3RXaXRoaW5QYWdlPHsgc3RhdHVzOiBzdHJpbmcgfT4odGhpcy5wYWdlLCBsb2dpblVybCwgcmVxdWVzdCk7XG4gICAgICBkZWJ1ZyhgdXNlciBsb2dpbiB3aXRoIHN0YXR1cyAnJHtsb2dpblJlc3VsdD8uc3RhdHVzfSdgKTtcblxuICAgICAgaWYgKGxvZ2luUmVzdWx0ICYmIGxvZ2luUmVzdWx0LnN0YXR1cyA9PT0gJzEnKSB7XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2luU3VjY2Vzcyk7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxvZ2luUmVzdWx0ICYmIGxvZ2luUmVzdWx0LnN0YXR1cyA9PT0gJzMnKSB7XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkNoYW5nZVBhc3N3b3JkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvclR5cGU6IFNjcmFwZXJFcnJvclR5cGVzLkNoYW5nZVBhc3N3b3JkLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Mb2dpbkZhaWxlZCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3JUeXBlOiBTY3JhcGVyRXJyb3JUeXBlcy5JbnZhbGlkUGFzc3dvcmQsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZVJldHVybkNvZGUgPT09ICc0Jykge1xuICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuQ2hhbmdlUGFzc3dvcmQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yVHlwZTogU2NyYXBlckVycm9yVHlwZXMuQ2hhbmdlUGFzc3dvcmQsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2luRmFpbGVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICBlcnJvclR5cGU6IFNjcmFwZXJFcnJvclR5cGVzLkludmFsaWRQYXNzd29yZCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCkge1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydE1vbWVudCA9IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFycycpO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMub3B0aW9ucy5zdGFydERhdGUgfHwgZGVmYXVsdFN0YXJ0TW9tZW50LnRvRGF0ZSgpO1xuICAgIGNvbnN0IHN0YXJ0TW9tZW50ID0gbW9tZW50Lm1heChkZWZhdWx0U3RhcnRNb21lbnQsIG1vbWVudChzdGFydERhdGUpKTtcblxuICAgIHJldHVybiBmZXRjaEFsbFRyYW5zYWN0aW9ucyh0aGlzLnBhZ2UsIHRoaXMub3B0aW9ucywge1xuXG4gICAgICBzZXJ2aWNlc1VybDogdGhpcy5zZXJ2aWNlc1VybCxcbiAgICAgIGNvbXBhbnlDb2RlOiB0aGlzLmNvbXBhbnlDb2RlLFxuICAgIH0sIHN0YXJ0TW9tZW50KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJc3JhY2FyZEFtZXhCYXNlU2NyYXBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLElBQUFBLFNBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFHLFVBQUEs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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=