israeli-bank-scrapers 6.1.1 → 6.1.3

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 (81) hide show
  1. package/lib/assertNever.js +7 -5
  2. package/lib/constants.js +16 -13
  3. package/lib/definitions.js +113 -109
  4. package/lib/helpers/browser.js +13 -9
  5. package/lib/helpers/dates.js +19 -18
  6. package/lib/helpers/debug.js +9 -9
  7. package/lib/helpers/elements-interactions.js +82 -78
  8. package/lib/helpers/fetch.js +85 -82
  9. package/lib/helpers/navigation.js +28 -24
  10. package/lib/helpers/storage.js +11 -10
  11. package/lib/helpers/transactions.js +32 -33
  12. package/lib/helpers/waiting.js +42 -45
  13. package/lib/index.js +82 -15
  14. package/lib/scrapers/amex.js +13 -11
  15. package/lib/scrapers/amex.test.d.ts +1 -0
  16. package/lib/scrapers/amex.test.js +49 -0
  17. package/lib/scrapers/base-beinleumi-group.d.ts +32 -0
  18. package/lib/scrapers/base-beinleumi-group.js +350 -234
  19. package/lib/scrapers/base-isracard-amex.js +273 -273
  20. package/lib/scrapers/base-scraper-with-browser.js +263 -241
  21. package/lib/scrapers/base-scraper-with-browser.test.d.ts +1 -0
  22. package/lib/scrapers/base-scraper-with-browser.test.js +53 -0
  23. package/lib/scrapers/base-scraper.js +82 -82
  24. package/lib/scrapers/behatsdaa.js +103 -98
  25. package/lib/scrapers/behatsdaa.test.d.ts +1 -0
  26. package/lib/scrapers/behatsdaa.test.js +46 -0
  27. package/lib/scrapers/beinleumi.js +13 -11
  28. package/lib/scrapers/beinleumi.test.d.ts +1 -0
  29. package/lib/scrapers/beinleumi.test.js +47 -0
  30. package/lib/scrapers/beyahad-bishvilha.js +132 -132
  31. package/lib/scrapers/beyahad-bishvilha.test.d.ts +1 -0
  32. package/lib/scrapers/beyahad-bishvilha.test.js +47 -0
  33. package/lib/scrapers/discount.js +101 -97
  34. package/lib/scrapers/discount.test.d.ts +1 -0
  35. package/lib/scrapers/discount.test.js +49 -0
  36. package/lib/scrapers/errors.js +25 -22
  37. package/lib/scrapers/factory.js +67 -66
  38. package/lib/scrapers/factory.test.d.ts +1 -0
  39. package/lib/scrapers/factory.test.js +19 -0
  40. package/lib/scrapers/hapoalim.js +175 -162
  41. package/lib/scrapers/hapoalim.test.d.ts +1 -0
  42. package/lib/scrapers/hapoalim.test.js +47 -0
  43. package/lib/scrapers/interface.js +5 -2
  44. package/lib/scrapers/isracard.js +13 -11
  45. package/lib/scrapers/isracard.test.d.ts +1 -0
  46. package/lib/scrapers/isracard.test.js +49 -0
  47. package/lib/scrapers/leumi.js +170 -167
  48. package/lib/scrapers/leumi.test.d.ts +1 -0
  49. package/lib/scrapers/leumi.test.js +47 -0
  50. package/lib/scrapers/massad.js +13 -11
  51. package/lib/scrapers/max.js +261 -261
  52. package/lib/scrapers/max.test.d.ts +1 -0
  53. package/lib/scrapers/max.test.js +65 -0
  54. package/lib/scrapers/mercantile.js +16 -14
  55. package/lib/scrapers/mercantile.test.d.ts +1 -0
  56. package/lib/scrapers/mercantile.test.js +45 -0
  57. package/lib/scrapers/mizrahi.js +154 -158
  58. package/lib/scrapers/mizrahi.test.d.ts +1 -0
  59. package/lib/scrapers/mizrahi.test.js +53 -0
  60. package/lib/scrapers/one-zero-queries.js +7 -4
  61. package/lib/scrapers/one-zero.js +221 -176
  62. package/lib/scrapers/one-zero.test.d.ts +1 -0
  63. package/lib/scrapers/one-zero.test.js +51 -0
  64. package/lib/scrapers/otsar-hahayal.js +13 -11
  65. package/lib/scrapers/otsar-hahayal.test.d.ts +1 -0
  66. package/lib/scrapers/otsar-hahayal.test.js +47 -0
  67. package/lib/scrapers/pagi.js +13 -11
  68. package/lib/scrapers/pagi.test.d.ts +1 -0
  69. package/lib/scrapers/pagi.test.js +47 -0
  70. package/lib/scrapers/union-bank.js +173 -172
  71. package/lib/scrapers/union-bank.test.d.ts +1 -0
  72. package/lib/scrapers/union-bank.test.js +47 -0
  73. package/lib/scrapers/visa-cal.d.ts +2 -0
  74. package/lib/scrapers/visa-cal.js +263 -254
  75. package/lib/scrapers/visa-cal.test.d.ts +1 -0
  76. package/lib/scrapers/visa-cal.test.js +49 -0
  77. package/lib/scrapers/yahav.js +206 -190
  78. package/lib/scrapers/yahav.test.d.ts +1 -0
  79. package/lib/scrapers/yahav.test.js +49 -0
  80. package/lib/transactions.js +16 -13
  81. package/package.json +9 -4
@@ -1,16 +1,22 @@
1
1
  "use strict";
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
- exports.waitForPostLogin = exports.createLoginFields = exports.getPossibleLoginResults = void 0;
7
- const moment_1 = __importDefault(require("moment"));
8
- const constants_1 = require("../constants");
9
- const elements_interactions_1 = require("../helpers/elements-interactions");
10
- const navigation_1 = require("../helpers/navigation");
11
- const waiting_1 = require("../helpers/waiting");
12
- const transactions_1 = require("../transactions");
13
- const base_scraper_with_browser_1 = require("./base-scraper-with-browser");
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.clickAccountSelectorGetAccountIds = clickAccountSelectorGetAccountIds;
7
+ exports.createLoginFields = createLoginFields;
8
+ exports.default = void 0;
9
+ exports.getPossibleLoginResults = getPossibleLoginResults;
10
+ exports.selectAccountFromDropdown = selectAccountFromDropdown;
11
+ exports.waitForPostLogin = waitForPostLogin;
12
+ var _moment = _interopRequireDefault(require("moment"));
13
+ var _constants = require("../constants");
14
+ var _elementsInteractions = require("../helpers/elements-interactions");
15
+ var _navigation = require("../helpers/navigation");
16
+ var _waiting = require("../helpers/waiting");
17
+ var _transactions = require("../transactions");
18
+ var _baseScraperWithBrowser = require("./base-scraper-with-browser");
19
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
20
  const DATE_FORMAT = 'DD/MM/YYYY';
15
21
  const NO_TRANSACTION_IN_DATE_RANGE_TEXT = 'לא נמצאו נתונים בנושא המבוקש';
16
22
  const DATE_COLUMN_CLASS_COMPLETED = 'date first';
@@ -30,286 +36,396 @@ const NEXT_PAGE_LINK = 'a#Npage.paging';
30
36
  const CURRENT_BALANCE = '.main_balance';
31
37
  const IFRAME_NAME = 'iframe-old-pages';
32
38
  function getPossibleLoginResults() {
33
- const urls = {};
34
- urls[base_scraper_with_browser_1.LoginResults.Success] = [
35
- /fibi.*accountSummary/,
36
- /FibiMenu\/Online/, // Old UI pattern
37
- ];
38
- urls[base_scraper_with_browser_1.LoginResults.InvalidPassword] = [/FibiMenu\/Marketing\/Private\/Home/];
39
- return urls;
39
+ const urls = {};
40
+ urls[_baseScraperWithBrowser.LoginResults.Success] = [/fibi.*accountSummary/,
41
+ // New UI pattern
42
+ /FibiMenu\/Online/ // Old UI pattern
43
+ ];
44
+ urls[_baseScraperWithBrowser.LoginResults.InvalidPassword] = [/FibiMenu\/Marketing\/Private\/Home/];
45
+ return urls;
40
46
  }
41
- exports.getPossibleLoginResults = getPossibleLoginResults;
42
47
  function createLoginFields(credentials) {
43
- return [
44
- { selector: '#username', value: credentials.username },
45
- { selector: '#password', value: credentials.password },
46
- ];
48
+ return [{
49
+ selector: '#username',
50
+ value: credentials.username
51
+ }, {
52
+ selector: '#password',
53
+ value: credentials.password
54
+ }];
47
55
  }
48
- exports.createLoginFields = createLoginFields;
49
56
  function getAmountData(amountStr) {
50
- let amountStrCopy = amountStr.replace(constants_1.SHEKEL_CURRENCY_SYMBOL, '');
51
- amountStrCopy = amountStrCopy.replaceAll(',', '');
52
- return parseFloat(amountStrCopy);
57
+ let amountStrCopy = amountStr.replace(_constants.SHEKEL_CURRENCY_SYMBOL, '');
58
+ amountStrCopy = amountStrCopy.replaceAll(',', '');
59
+ return parseFloat(amountStrCopy);
53
60
  }
54
61
  function getTxnAmount(txn) {
55
- const credit = getAmountData(txn.credit);
56
- const debit = getAmountData(txn.debit);
57
- return (Number.isNaN(credit) ? 0 : credit) - (Number.isNaN(debit) ? 0 : debit);
62
+ const credit = getAmountData(txn.credit);
63
+ const debit = getAmountData(txn.debit);
64
+ return (Number.isNaN(credit) ? 0 : credit) - (Number.isNaN(debit) ? 0 : debit);
58
65
  }
59
66
  function convertTransactions(txns) {
60
- return txns.map((txn) => {
61
- const convertedDate = (0, moment_1.default)(txn.date, DATE_FORMAT).toISOString();
62
- const convertedAmount = getTxnAmount(txn);
63
- return {
64
- type: transactions_1.TransactionTypes.Normal,
65
- identifier: txn.reference ? parseInt(txn.reference, 10) : undefined,
66
- date: convertedDate,
67
- processedDate: convertedDate,
68
- originalAmount: convertedAmount,
69
- originalCurrency: constants_1.SHEKEL_CURRENCY,
70
- chargedAmount: convertedAmount,
71
- status: txn.status,
72
- description: txn.description,
73
- memo: txn.memo,
74
- };
75
- });
67
+ return txns.map(txn => {
68
+ const convertedDate = (0, _moment.default)(txn.date, DATE_FORMAT).toISOString();
69
+ const convertedAmount = getTxnAmount(txn);
70
+ return {
71
+ type: _transactions.TransactionTypes.Normal,
72
+ identifier: txn.reference ? parseInt(txn.reference, 10) : undefined,
73
+ date: convertedDate,
74
+ processedDate: convertedDate,
75
+ originalAmount: convertedAmount,
76
+ originalCurrency: _constants.SHEKEL_CURRENCY,
77
+ chargedAmount: convertedAmount,
78
+ status: txn.status,
79
+ description: txn.description,
80
+ memo: txn.memo
81
+ };
82
+ });
76
83
  }
77
84
  function getTransactionDate(tds, transactionType, transactionsColsTypes) {
78
- if (transactionType === 'completed') {
79
- return (tds[transactionsColsTypes[DATE_COLUMN_CLASS_COMPLETED]] || '').trim();
80
- }
81
- return (tds[transactionsColsTypes[DATE_COLUMN_CLASS_PENDING]] || '').trim();
85
+ if (transactionType === 'completed') {
86
+ return (tds[transactionsColsTypes[DATE_COLUMN_CLASS_COMPLETED]] || '').trim();
87
+ }
88
+ return (tds[transactionsColsTypes[DATE_COLUMN_CLASS_PENDING]] || '').trim();
82
89
  }
83
90
  function getTransactionDescription(tds, transactionType, transactionsColsTypes) {
84
- if (transactionType === 'completed') {
85
- return (tds[transactionsColsTypes[DESCRIPTION_COLUMN_CLASS_COMPLETED]] || '').trim();
86
- }
87
- return (tds[transactionsColsTypes[DESCRIPTION_COLUMN_CLASS_PENDING]] || '').trim();
91
+ if (transactionType === 'completed') {
92
+ return (tds[transactionsColsTypes[DESCRIPTION_COLUMN_CLASS_COMPLETED]] || '').trim();
93
+ }
94
+ return (tds[transactionsColsTypes[DESCRIPTION_COLUMN_CLASS_PENDING]] || '').trim();
88
95
  }
89
96
  function getTransactionReference(tds, transactionsColsTypes) {
90
- return (tds[transactionsColsTypes[REFERENCE_COLUMN_CLASS]] || '').trim();
97
+ return (tds[transactionsColsTypes[REFERENCE_COLUMN_CLASS]] || '').trim();
91
98
  }
92
99
  function getTransactionDebit(tds, transactionsColsTypes) {
93
- return (tds[transactionsColsTypes[DEBIT_COLUMN_CLASS]] || '').trim();
100
+ return (tds[transactionsColsTypes[DEBIT_COLUMN_CLASS]] || '').trim();
94
101
  }
95
102
  function getTransactionCredit(tds, transactionsColsTypes) {
96
- return (tds[transactionsColsTypes[CREDIT_COLUMN_CLASS]] || '').trim();
103
+ return (tds[transactionsColsTypes[CREDIT_COLUMN_CLASS]] || '').trim();
97
104
  }
98
105
  function extractTransactionDetails(txnRow, transactionStatus, transactionsColsTypes) {
99
- const tds = txnRow.innerTds;
100
- const item = {
101
- status: transactionStatus,
102
- date: getTransactionDate(tds, transactionStatus, transactionsColsTypes),
103
- description: getTransactionDescription(tds, transactionStatus, transactionsColsTypes),
104
- reference: getTransactionReference(tds, transactionsColsTypes),
105
- debit: getTransactionDebit(tds, transactionsColsTypes),
106
- credit: getTransactionCredit(tds, transactionsColsTypes),
107
- };
108
- return item;
106
+ const tds = txnRow.innerTds;
107
+ const item = {
108
+ status: transactionStatus,
109
+ date: getTransactionDate(tds, transactionStatus, transactionsColsTypes),
110
+ description: getTransactionDescription(tds, transactionStatus, transactionsColsTypes),
111
+ reference: getTransactionReference(tds, transactionsColsTypes),
112
+ debit: getTransactionDebit(tds, transactionsColsTypes),
113
+ credit: getTransactionCredit(tds, transactionsColsTypes)
114
+ };
115
+ return item;
109
116
  }
110
117
  async function getTransactionsColsTypeClasses(page, tableLocator) {
111
- const result = {};
112
- const typeClassesObjs = await (0, elements_interactions_1.pageEvalAll)(page, `${tableLocator} tbody tr:first-of-type td`, null, tds => {
113
- return tds.map((td, index) => ({
114
- colClass: td.getAttribute('class'),
115
- index,
116
- }));
117
- });
118
- for (const typeClassObj of typeClassesObjs) {
119
- if (typeClassObj.colClass) {
120
- result[typeClassObj.colClass] = typeClassObj.index;
121
- }
118
+ const result = {};
119
+ const typeClassesObjs = await (0, _elementsInteractions.pageEvalAll)(page, `${tableLocator} tbody tr:first-of-type td`, null, tds => {
120
+ return tds.map((td, index) => ({
121
+ colClass: td.getAttribute('class'),
122
+ index
123
+ }));
124
+ });
125
+ for (const typeClassObj of typeClassesObjs) {
126
+ if (typeClassObj.colClass) {
127
+ result[typeClassObj.colClass] = typeClassObj.index;
122
128
  }
123
- return result;
129
+ }
130
+ return result;
124
131
  }
125
132
  function extractTransaction(txns, transactionStatus, txnRow, transactionsColsTypes) {
126
- const txn = extractTransactionDetails(txnRow, transactionStatus, transactionsColsTypes);
127
- if (txn.date !== '') {
128
- txns.push(txn);
129
- }
133
+ const txn = extractTransactionDetails(txnRow, transactionStatus, transactionsColsTypes);
134
+ if (txn.date !== '') {
135
+ txns.push(txn);
136
+ }
130
137
  }
131
138
  async function extractTransactions(page, tableLocator, transactionStatus) {
132
- const txns = [];
133
- const transactionsColsTypes = await getTransactionsColsTypeClasses(page, tableLocator);
134
- const transactionsRows = await (0, elements_interactions_1.pageEvalAll)(page, `${tableLocator} tbody tr`, [], trs => {
135
- return trs.map(tr => ({
136
- innerTds: Array.from(tr.getElementsByTagName('td')).map(td => td.innerText),
137
- }));
138
- });
139
- for (const txnRow of transactionsRows) {
140
- extractTransaction(txns, transactionStatus, txnRow, transactionsColsTypes);
141
- }
142
- return txns;
139
+ const txns = [];
140
+ const transactionsColsTypes = await getTransactionsColsTypeClasses(page, tableLocator);
141
+ const transactionsRows = await (0, _elementsInteractions.pageEvalAll)(page, `${tableLocator} tbody tr`, [], trs => {
142
+ return trs.map(tr => ({
143
+ innerTds: Array.from(tr.getElementsByTagName('td')).map(td => td.innerText)
144
+ }));
145
+ });
146
+ for (const txnRow of transactionsRows) {
147
+ extractTransaction(txns, transactionStatus, txnRow, transactionsColsTypes);
148
+ }
149
+ return txns;
143
150
  }
144
151
  async function isNoTransactionInDateRangeError(page) {
145
- const hasErrorInfoElement = await (0, elements_interactions_1.elementPresentOnPage)(page, `.${ERROR_MESSAGE_CLASS}`);
146
- if (hasErrorInfoElement) {
147
- const errorText = await page.$eval(`.${ERROR_MESSAGE_CLASS}`, errorElement => {
148
- return errorElement.innerText;
149
- });
150
- return errorText.trim() === NO_TRANSACTION_IN_DATE_RANGE_TEXT;
151
- }
152
- return false;
152
+ const hasErrorInfoElement = await (0, _elementsInteractions.elementPresentOnPage)(page, `.${ERROR_MESSAGE_CLASS}`);
153
+ if (hasErrorInfoElement) {
154
+ const errorText = await page.$eval(`.${ERROR_MESSAGE_CLASS}`, errorElement => {
155
+ return errorElement.innerText;
156
+ });
157
+ return errorText.trim() === NO_TRANSACTION_IN_DATE_RANGE_TEXT;
158
+ }
159
+ return false;
153
160
  }
154
161
  async function searchByDates(page, startDate) {
155
- await (0, elements_interactions_1.clickButton)(page, 'a#tabHeader4');
156
- await (0, elements_interactions_1.waitUntilElementFound)(page, 'div#fibi_dates');
157
- await (0, elements_interactions_1.fillInput)(page, 'input#fromDate', startDate.format(DATE_FORMAT));
158
- await (0, elements_interactions_1.clickButton)(page, `button[class*=${CLOSE_SEARCH_BY_DATES_BUTTON_CLASS}]`);
159
- await (0, elements_interactions_1.clickButton)(page, `input[value=${SHOW_SEARCH_BY_DATES_BUTTON_VALUE}]`);
160
- await (0, navigation_1.waitForNavigation)(page);
162
+ await (0, _elementsInteractions.clickButton)(page, 'a#tabHeader4');
163
+ await (0, _elementsInteractions.waitUntilElementFound)(page, 'div#fibi_dates');
164
+ await (0, _elementsInteractions.fillInput)(page, 'input#fromDate', startDate.format(DATE_FORMAT));
165
+ await (0, _elementsInteractions.clickButton)(page, `button[class*=${CLOSE_SEARCH_BY_DATES_BUTTON_CLASS}]`);
166
+ await (0, _elementsInteractions.clickButton)(page, `input[value=${SHOW_SEARCH_BY_DATES_BUTTON_VALUE}]`);
167
+ await (0, _navigation.waitForNavigation)(page);
161
168
  }
162
169
  async function getAccountNumber(page) {
163
- const selectedSnifAccount = await page.$eval(ACCOUNTS_NUMBER, option => {
164
- return option.innerText;
165
- });
166
- return selectedSnifAccount.replace('/', '_').trim();
170
+ const selectedSnifAccount = await page.$eval(ACCOUNTS_NUMBER, option => {
171
+ return option.innerText;
172
+ });
173
+ return selectedSnifAccount.replace('/', '_').trim();
167
174
  }
168
175
  async function checkIfHasNextPage(page) {
169
- return (0, elements_interactions_1.elementPresentOnPage)(page, NEXT_PAGE_LINK);
176
+ return (0, _elementsInteractions.elementPresentOnPage)(page, NEXT_PAGE_LINK);
170
177
  }
171
178
  async function navigateToNextPage(page) {
172
- await (0, elements_interactions_1.clickButton)(page, NEXT_PAGE_LINK);
173
- await (0, navigation_1.waitForNavigation)(page);
179
+ await (0, _elementsInteractions.clickButton)(page, NEXT_PAGE_LINK);
180
+ await (0, _navigation.waitForNavigation)(page);
174
181
  }
182
+
175
183
  /* Couldn't reproduce scenario with multiple pages of pending transactions - Should support if exists such case.
176
184
  needToPaginate is false if scraping pending transactions */
177
185
  async function scrapeTransactions(page, tableLocator, transactionStatus, needToPaginate) {
178
- const txns = [];
179
- let hasNextPage = false;
180
- do {
181
- const currentPageTxns = await extractTransactions(page, tableLocator, transactionStatus);
182
- txns.push(...currentPageTxns);
183
- if (needToPaginate) {
184
- hasNextPage = await checkIfHasNextPage(page);
185
- if (hasNextPage) {
186
- await navigateToNextPage(page);
187
- }
188
- }
189
- } while (hasNextPage);
190
- return convertTransactions(txns);
186
+ const txns = [];
187
+ let hasNextPage = false;
188
+ do {
189
+ const currentPageTxns = await extractTransactions(page, tableLocator, transactionStatus);
190
+ txns.push(...currentPageTxns);
191
+ if (needToPaginate) {
192
+ hasNextPage = await checkIfHasNextPage(page);
193
+ if (hasNextPage) {
194
+ await navigateToNextPage(page);
195
+ }
196
+ }
197
+ } while (hasNextPage);
198
+ return convertTransactions(txns);
191
199
  }
192
200
  async function getAccountTransactions(page) {
193
- await Promise.race([
194
- (0, elements_interactions_1.waitUntilElementFound)(page, "div[id*='divTable']", false),
195
- (0, elements_interactions_1.waitUntilElementFound)(page, `.${ERROR_MESSAGE_CLASS}`, false),
196
- ]);
197
- const noTransactionInRangeError = await isNoTransactionInDateRangeError(page);
198
- if (noTransactionInRangeError) {
199
- return [];
200
- }
201
- const pendingTxns = await scrapeTransactions(page, PENDING_TRANSACTIONS_TABLE, transactions_1.TransactionStatuses.Pending, false);
202
- const completedTxns = await scrapeTransactions(page, COMPLETED_TRANSACTIONS_TABLE, transactions_1.TransactionStatuses.Completed, true);
203
- const txns = [...pendingTxns, ...completedTxns];
204
- return txns;
201
+ await Promise.race([(0, _elementsInteractions.waitUntilElementFound)(page, "div[id*='divTable']", false), (0, _elementsInteractions.waitUntilElementFound)(page, `.${ERROR_MESSAGE_CLASS}`, false)]);
202
+ const noTransactionInRangeError = await isNoTransactionInDateRangeError(page);
203
+ if (noTransactionInRangeError) {
204
+ return [];
205
+ }
206
+ const pendingTxns = await scrapeTransactions(page, PENDING_TRANSACTIONS_TABLE, _transactions.TransactionStatuses.Pending, false);
207
+ const completedTxns = await scrapeTransactions(page, COMPLETED_TRANSACTIONS_TABLE, _transactions.TransactionStatuses.Completed, true);
208
+ const txns = [...pendingTxns, ...completedTxns];
209
+ return txns;
205
210
  }
206
211
  async function getCurrentBalance(page) {
207
- const balanceElement = await page.$(CURRENT_BALANCE);
208
- if (!balanceElement) {
209
- return undefined;
210
- }
211
- const balanceStr = await balanceElement.evaluate(option => {
212
- return option.innerText;
213
- });
214
- return getAmountData(balanceStr);
212
+ const balanceElement = await page.$(CURRENT_BALANCE);
213
+ if (!balanceElement) {
214
+ return undefined;
215
+ }
216
+ const balanceStr = await balanceElement.evaluate(option => {
217
+ return option.innerText;
218
+ });
219
+ return getAmountData(balanceStr);
215
220
  }
216
221
  async function waitForPostLogin(page) {
217
- return Promise.race([
218
- (0, elements_interactions_1.waitUntilElementFound)(page, '#card-header', true),
219
- (0, elements_interactions_1.waitUntilElementFound)(page, '#account_num', true),
220
- (0, elements_interactions_1.waitUntilElementFound)(page, '#matafLogoutLink', true),
221
- (0, elements_interactions_1.waitUntilElementFound)(page, '#validationMsg', true), // Old UI
222
- ]);
222
+ return Promise.race([(0, _elementsInteractions.waitUntilElementFound)(page, '#card-header', true),
223
+ // New UI
224
+ (0, _elementsInteractions.waitUntilElementFound)(page, '#account_num', true),
225
+ // New UI
226
+ (0, _elementsInteractions.waitUntilElementFound)(page, '#matafLogoutLink', true),
227
+ // Old UI
228
+ (0, _elementsInteractions.waitUntilElementFound)(page, '#validationMsg', true) // Old UI
229
+ ]);
223
230
  }
224
- exports.waitForPostLogin = waitForPostLogin;
225
231
  async function fetchAccountData(page, startDate) {
226
- await searchByDates(page, startDate);
227
- const accountNumber = await getAccountNumber(page);
228
- const balance = await getCurrentBalance(page);
229
- const txns = await getAccountTransactions(page);
230
- return {
231
- accountNumber,
232
- txns,
233
- balance,
234
- };
232
+ const accountNumber = await getAccountNumber(page);
233
+ const balance = await getCurrentBalance(page);
234
+ await searchByDates(page, startDate);
235
+ const txns = await getAccountTransactions(page);
236
+ return {
237
+ accountNumber,
238
+ txns,
239
+ balance
240
+ };
241
+ }
242
+ async function getAccountIdsOldUI(page) {
243
+ return page.evaluate(() => {
244
+ const selectElement = document.getElementById('account_num_select');
245
+ const options = selectElement ? selectElement.querySelectorAll('option') : [];
246
+ if (!options) return [];
247
+ return Array.from(options, option => option.value);
248
+ });
235
249
  }
236
- async function getAccountIdsBySelector(page) {
237
- const accountsIds = await page.evaluate(() => {
238
- const selectElement = document.getElementById('account_num_select');
239
- const options = selectElement ? selectElement.querySelectorAll('option') : [];
240
- if (!options)
241
- return [];
242
- return Array.from(options, option => option.value);
250
+
251
+ /**
252
+ * Ensures the account dropdown is open, then returns the available account labels.
253
+ *
254
+ * This method:
255
+ * - Checks if the dropdown is already open.
256
+ * - If not open, clicks the account selector to open it.
257
+ * - Waits for the dropdown to render.
258
+ * - Extracts and returns the list of available account labels.
259
+ *
260
+ * Graceful handling:
261
+ * - If any error occurs (e.g., selectors not found, timing issues, UI version changes),
262
+ * the function returns an empty list.
263
+ *
264
+ * @param page Puppeteer Page object.
265
+ * @returns An array of available account labels (e.g., ["127 | XXXX1", "127 | XXXX2"]),
266
+ * or an empty array if something goes wrong.
267
+ */
268
+ async function clickAccountSelectorGetAccountIds(page) {
269
+ try {
270
+ const accountSelector = 'div.current-account'; // Direct selector to clickable element
271
+ const dropdownPanelSelector = 'div.mat-mdc-autocomplete-panel.account-select-dd'; // The dropdown list box
272
+ const optionSelector = 'mat-option .mdc-list-item__primary-text'; // Account option labels
273
+
274
+ // Check if dropdown is already open
275
+ const dropdownVisible = await page.$eval(dropdownPanelSelector, el => {
276
+ return el && window.getComputedStyle(el).display !== 'none' && el.offsetParent !== null;
277
+ }).catch(() => false); // catch if dropdown is not in the DOM yet
278
+
279
+ if (!dropdownVisible) {
280
+ await page.waitForSelector(accountSelector, {
281
+ visible: true,
282
+ timeout: 10000
283
+ });
284
+
285
+ // Click the account selector to open the dropdown
286
+ await (0, _elementsInteractions.clickButton)(page, accountSelector);
287
+
288
+ // Wait for the dropdown to open
289
+ await page.waitForSelector(dropdownPanelSelector, {
290
+ visible: true,
291
+ timeout: 10000
292
+ });
293
+ }
294
+
295
+ // Extract account labels from the dropdown options
296
+ const accountLabels = await page.$$eval(optionSelector, options => {
297
+ return options.map(option => option.textContent?.trim() || '').filter(label => label !== '');
243
298
  });
244
- return accountsIds;
299
+ return accountLabels;
300
+ } catch (error) {
301
+ return []; // Graceful fallback
302
+ }
303
+ }
304
+ async function getAccountIdsBothUIs(page) {
305
+ let accountsIds = await clickAccountSelectorGetAccountIds(page);
306
+ if (accountsIds.length === 0) {
307
+ accountsIds = await getAccountIdsOldUI(page);
308
+ }
309
+ return accountsIds;
310
+ }
311
+
312
+ /**
313
+ * Selects an account from the dropdown based on the provided account label.
314
+ *
315
+ * This method:
316
+ * - Clicks the account selector button to open the dropdown.
317
+ * - Retrieves the list of available account labels.
318
+ * - Checks if the provided account label exists in the list.
319
+ * - Finds and clicks the matching account option if found.
320
+ *
321
+ * @param page Puppeteer Page object.
322
+ * @param accountLabel The text of the account to select (e.g., "127 | XXXXX").
323
+ * @returns True if the account option was found and clicked; false otherwise.
324
+ */
325
+ async function selectAccountFromDropdown(page, accountLabel) {
326
+ // Call clickAccountSelector to get the available accounts and open the dropdown
327
+ const availableAccounts = await clickAccountSelectorGetAccountIds(page);
328
+
329
+ // Check if the account label exists in the available accounts
330
+ if (!availableAccounts.includes(accountLabel)) {
331
+ return false;
332
+ }
333
+
334
+ // Wait for the dropdown options to be rendered
335
+ const optionSelector = 'mat-option .mdc-list-item__primary-text';
336
+ await page.waitForSelector(optionSelector, {
337
+ timeout: 3000
338
+ });
339
+
340
+ // Query all matching options
341
+ const accountOptions = await page.$$(optionSelector);
342
+
343
+ // Find and click the option matching the accountLabel
344
+ for (const option of accountOptions) {
345
+ const text = await page.evaluate(el => el.textContent?.trim(), option);
346
+ if (text === accountLabel) {
347
+ const optionHandle = await option.evaluateHandle(el => el);
348
+ await page.evaluate(el => el.click(), optionHandle);
349
+ return true;
350
+ }
351
+ }
352
+ return false;
245
353
  }
246
354
  async function getTransactionsFrame(page) {
247
- // Try a few times to find the iframe, as it might not be immediately available
248
- for (let attempt = 0; attempt < 3; attempt++) {
249
- await (0, waiting_1.sleep)(2000);
250
- const frames = page.frames();
251
- const targetFrame = frames.find(f => f.name() === IFRAME_NAME);
252
- if (targetFrame) {
253
- return targetFrame;
254
- }
355
+ // Try a few times to find the iframe, as it might not be immediately available
356
+ for (let attempt = 0; attempt < 3; attempt++) {
357
+ await (0, _waiting.sleep)(2000);
358
+ const frames = page.frames();
359
+ const targetFrame = frames.find(f => f.name() === IFRAME_NAME);
360
+ if (targetFrame) {
361
+ return targetFrame;
255
362
  }
256
- return null;
363
+ }
364
+ return null;
257
365
  }
258
- async function selectAccount(page, accountId) {
366
+ async function selectAccountBothUIs(page, accountId) {
367
+ const accountSelected = await selectAccountFromDropdown(page, accountId);
368
+ if (!accountSelected) {
369
+ // Old UI format
259
370
  await page.select('#account_num_select', accountId);
260
- await (0, elements_interactions_1.waitUntilElementFound)(page, '#account_num_select', true);
371
+ await (0, _elementsInteractions.waitUntilElementFound)(page, '#account_num_select', true);
372
+ }
261
373
  }
262
374
  async function fetchAccountDataBothUIs(page, startDate) {
263
- // Try to get the iframe for the new UI
264
- const frame = await getTransactionsFrame(page);
265
- // Use the frame if available (new UI), otherwise use the page directly (old UI)
266
- const targetPage = frame || page;
267
- return fetchAccountData(targetPage, startDate);
375
+ // Try to get the iframe for the new UI
376
+ const frame = await getTransactionsFrame(page);
377
+
378
+ // Use the frame if available (new UI), otherwise use the page directly (old UI)
379
+ const targetPage = frame || page;
380
+ return fetchAccountData(targetPage, startDate);
268
381
  }
269
382
  async function fetchAccounts(page, startDate) {
270
- const accountsIds = await getAccountIdsBySelector(page);
271
- if (accountsIds.length <= 1) {
272
- const accountData = await fetchAccountDataBothUIs(page, startDate);
273
- return [accountData];
274
- }
275
- const accounts = [];
276
- for (const accountId of accountsIds) {
277
- await selectAccount(page, accountId);
278
- const accountData = await fetchAccountDataBothUIs(page, startDate);
279
- accounts.push(accountData);
280
- }
281
- return accounts;
282
- }
283
- class BeinleumiGroupBaseScraper extends base_scraper_with_browser_1.BaseScraperWithBrowser {
284
- BASE_URL = '';
285
- LOGIN_URL = '';
286
- TRANSACTIONS_URL = '';
287
- getLoginOptions(credentials) {
288
- return {
289
- loginUrl: `${this.LOGIN_URL}`,
290
- fields: createLoginFields(credentials),
291
- submitButtonSelector: '#continueBtn',
292
- postAction: async () => waitForPostLogin(this.page),
293
- possibleResults: getPossibleLoginResults(),
294
- // HACK: For some reason, though the login button (#continueBtn) is present and visible, the click action does not perform.
295
- // Adding this delay fixes the issue.
296
- preAction: async () => {
297
- await (0, waiting_1.sleep)(1000);
298
- },
299
- };
300
- }
301
- async fetchData() {
302
- const defaultStartMoment = (0, moment_1.default)().subtract(1, 'years').add(1, 'day');
303
- const startMomentLimit = (0, moment_1.default)({ year: 1600 });
304
- const startDate = this.options.startDate || defaultStartMoment.toDate();
305
- const startMoment = moment_1.default.max(startMomentLimit, (0, moment_1.default)(startDate));
306
- await this.navigateTo(this.TRANSACTIONS_URL);
307
- const accounts = await fetchAccounts(this.page, startMoment);
308
- return {
309
- success: true,
310
- accounts,
311
- };
312
- }
383
+ const accountsIds = await getAccountIdsBothUIs(page);
384
+ if (accountsIds.length === 0) {
385
+ // In case accountsIds could no be parsed just return the transactions of the currently selected account
386
+ const accountData = await fetchAccountDataBothUIs(page, startDate);
387
+ return [accountData];
388
+ }
389
+ const accounts = [];
390
+ for (const accountId of accountsIds) {
391
+ await selectAccountBothUIs(page, accountId);
392
+ const accountData = await fetchAccountDataBothUIs(page, startDate);
393
+ accounts.push(accountData);
394
+ }
395
+ return accounts;
396
+ }
397
+ class BeinleumiGroupBaseScraper extends _baseScraperWithBrowser.BaseScraperWithBrowser {
398
+ BASE_URL = '';
399
+ LOGIN_URL = '';
400
+ TRANSACTIONS_URL = '';
401
+ getLoginOptions(credentials) {
402
+ return {
403
+ loginUrl: `${this.LOGIN_URL}`,
404
+ fields: createLoginFields(credentials),
405
+ submitButtonSelector: '#continueBtn',
406
+ postAction: async () => waitForPostLogin(this.page),
407
+ possibleResults: getPossibleLoginResults(),
408
+ // HACK: For some reason, though the login button (#continueBtn) is present and visible, the click action does not perform.
409
+ // Adding this delay fixes the issue.
410
+ preAction: async () => {
411
+ await (0, _waiting.sleep)(1000);
412
+ }
413
+ };
414
+ }
415
+ async fetchData() {
416
+ const defaultStartMoment = (0, _moment.default)().subtract(1, 'years').add(1, 'day');
417
+ const startMomentLimit = (0, _moment.default)({
418
+ year: 1600
419
+ });
420
+ const startDate = this.options.startDate || defaultStartMoment.toDate();
421
+ const startMoment = _moment.default.max(startMomentLimit, (0, _moment.default)(startDate));
422
+ await this.navigateTo(this.TRANSACTIONS_URL);
423
+ const accounts = await fetchAccounts(this.page, startMoment);
424
+ return {
425
+ success: true,
426
+ accounts
427
+ };
428
+ }
313
429
  }
314
- exports.default = BeinleumiGroupBaseScraper;
315
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1iZWlubGV1bWktZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvYmFzZS1iZWlubGV1bWktZ3JvdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsb0RBQTZDO0FBRTdDLDRDQUF1RTtBQUN2RSw0RUFNMEM7QUFDMUMsc0RBQTBEO0FBQzFELGdEQUEyQztBQUMzQyxrREFBb0g7QUFDcEgsMkVBQThHO0FBRTlHLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQztBQUNqQyxNQUFNLGlDQUFpQyxHQUFHLDhCQUE4QixDQUFDO0FBQ3pFLE1BQU0sMkJBQTJCLEdBQUcsWUFBWSxDQUFDO0FBQ2pELE1BQU0seUJBQXlCLEdBQUcsWUFBWSxDQUFDO0FBQy9DLE1BQU0sa0NBQWtDLEdBQUcsdUJBQXVCLENBQUM7QUFDbkUsTUFBTSxnQ0FBZ0MsR0FBRyxxQkFBcUIsQ0FBQztBQUMvRCxNQUFNLHNCQUFzQixHQUFHLFNBQVMsQ0FBQztBQUN6QyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztBQUNuQyxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQztBQUNyQyxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQztBQUN0QyxNQUFNLGVBQWUsR0FBRywrQkFBK0IsQ0FBQztBQUN4RCxNQUFNLGtDQUFrQyxHQUFHLHFCQUFxQixDQUFDO0FBQ2pFLE1BQU0saUNBQWlDLEdBQUcsS0FBSyxDQUFDO0FBQ2hELE1BQU0sNEJBQTRCLEdBQUcsb0JBQW9CLENBQUM7QUFDMUQsTUFBTSwwQkFBMEIsR0FBRyxvQkFBb0IsQ0FBQztBQUN4RCxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQztBQUN4QyxNQUFNLGVBQWUsR0FBRyxlQUFlLENBQUM7QUFDeEMsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUM7QUFnQnZDLFNBQWdCLHVCQUF1QjtJQUNyQyxNQUFNLElBQUksR0FBeUIsRUFBRSxDQUFDO0lBQ3RDLElB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QU0sZ0JBQWdCLEdBQUcsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEUsTUFBTSxXQUFXLEdBQUcsZ0JBQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBQSxnQkFBTSxFQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFcEUsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTdDLE1BQU0sUUFBUSxHQUFHLE1BQU0sYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFN0QsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJO1lBQ2IsUUFBUTtTQUNULENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxrQkFBZSx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQsIHsgdHlwZSBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgdHlwZSBGcmFtZSwgdHlwZSBQYWdlIH0gZnJvbSAncHVwcGV0ZWVyJztcbmltcG9ydCB7IFNIRUtFTF9DVVJSRU5DWSwgU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBjbGlja0J1dHRvbixcbiAgZWxlbWVudFByZXNlbnRPblBhZ2UsXG4gIGZpbGxJbnB1dCxcbiAgcGFnZUV2YWxBbGwsXG4gIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCxcbn0gZnJvbSAnLi4vaGVscGVycy9lbGVtZW50cy1pbnRlcmFjdGlvbnMnO1xuaW1wb3J0IHsgd2FpdEZvck5hdmlnYXRpb24gfSBmcm9tICcuLi9oZWxwZXJzL25hdmlnYXRpb24nO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuLi9oZWxwZXJzL3dhaXRpbmcnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdGF0dXNlcywgVHJhbnNhY3Rpb25UeXBlcywgdHlwZSBUcmFuc2FjdGlvbiwgdHlwZSBUcmFuc2FjdGlvbnNBY2NvdW50IH0gZnJvbSAnLi4vdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIsIExvZ2luUmVzdWx0cywgdHlwZSBQb3NzaWJsZUxvZ2luUmVzdWx0cyB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5cbmNvbnN0IERBVEVfRk9STUFUID0gJ0REL01NL1lZWVknO1xuY29uc3QgTk9fVFJBTlNBQ1RJT05fSU5fREFURV9SQU5HRV9URVhUID0gJ9ec15Ag16DXntem15DXlSDXoNeq15XXoNeZ150g15HXoNeV16nXkCDXlNee15HXlden16knO1xuY29uc3QgREFURV9DT0xVTU5fQ0xBU1NfQ09NUExFVEVEID0gJ2RhdGUgZmlyc3QnO1xuY29uc3QgREFURV9DT0xVTU5fQ0xBU1NfUEVORElORyA9ICdmaXJzdCBkYXRlJztcbmNvbnN0IERFU0NSSVBUSU9OX0NPTFVNTl9DTEFTU19DT01QTEVURUQgPSAncmVmZXJlbmNlIHdyYXBfbm9ybWFsJztcbmNvbnN0IERFU0NSSVBUSU9OX0NPTFVNTl9DTEFTU19QRU5ESU5HID0gJ2RldGFpbHMgd3JhcF9ub3JtYWwnO1xuY29uc3QgUkVGRVJFTkNFX0NPTFVNTl9DTEFTUyA9ICdkZXRhaWxzJztcbmNvbnN0IERFQklUX0NPTFVNTl9DTEFTUyA9ICdkZWJpdCc7XG5jb25zdCBDUkVESVRfQ09MVU1OX0NMQVNTID0gJ2NyZWRpdCc7XG5jb25zdCBFUlJPUl9NRVNTQUdFX0NMQVNTID0gJ05PX0RBVEEnO1xuY29uc3QgQUNDT1VOVFNfTlVNQkVSID0gJ2Rpdi5maWJpX2FjY291bnQgc3Bhbi5hY2NfbnVtJztcbmNvbnN0IENMT1NFX1NFQVJDSF9CWV9EQVRFU19CVVRUT05fQ0xBU1MgPSAndWktZGF0ZXBpY2tlci1jbG9zZSc7XG5jb25zdCBTSE9XX1NFQVJDSF9CWV9EQVRFU19CVVRUT05fVkFMVUUgPSAn15TXpteSJztcbmNvbnN0IENPTVBMRVRFRF9UUkFOU0FDVElPTlNfVEFCTEUgPSAndGFibGUjZGF0YVRhYmxlMDc3JztcbmNvbnN0IFBFTkRJTkdfVFJBTlNBQ1RJT05TX1RBQkxFID0gJ3RhYmxlI2RhdGFUYWJsZTAyMyc7XG5jb25zdCBORVhUX1BBR0VfTElOSyA9ICdhI05wYWdlLnBhZ2luZyc7XG5jb25zdCBDVVJSRU5UX0JBTEFOQ0UgPSAnLm1haW5fYmFsYW5jZSc7XG5jb25zdCBJRlJBTUVfTkFNRSA9ICdpZnJhbWUtb2xkLXBhZ2VzJztcblxudHlwZSBUcmFuc2FjdGlvbnNDb2xzVHlwZXMgPSBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xudHlwZSBUcmFuc2FjdGlvbnNUclRkcyA9IHN0cmluZ1tdO1xudHlwZSBUcmFuc2FjdGlvbnNUciA9IHsgaW5uZXJUZHM6IFRyYW5zYWN0aW9uc1RyVGRzIH07XG5cbmludGVyZmFjZSBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICByZWZlcmVuY2U6IHN0cmluZztcbiAgZGF0ZTogc3RyaW5nO1xuICBjcmVkaXQ6IHN0cmluZztcbiAgZGViaXQ6IHN0cmluZztcbiAgbWVtbz86IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKTogUG9zc2libGVMb2dpblJlc3VsdHMge1xuICBjb25zdCB1cmxzOiBQb3NzaWJsZUxvZ2luUmVzdWx0cyA9IHt9O1xuICB1cmxzW0xvZ2luUmVzdWx0cy5TdWNjZXNzXSA9IFtcbiAgICAvZmliaS4qYWNjb3VudFN1bW1hcnkvLCAvLyBOZXcgVUkgcGF0dGVyblxuICAgIC9GaWJpTWVudVxcL09ubGluZS8sIC8vIE9sZCBVSSBwYXR0ZXJuXG4gIF07XG4gIHVybHNbTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZF0gPSBbL0ZpYmlNZW51XFwvTWFya2V0aW5nXFwvUHJpdmF0ZVxcL0hvbWUvXTtcbiAgcmV0dXJuIHVybHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dpbkZpZWxkcyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgcmV0dXJuIFtcbiAgICB7IHNlbGVjdG9yOiAnI3VzZXJuYW1lJywgdmFsdWU6IGNyZWRlbnRpYWxzLnVzZXJuYW1lIH0sXG4gICAgeyBzZWxlY3RvcjogJyNwYXNzd29yZCcsIHZhbHVlOiBjcmVkZW50aWFscy5wYXNzd29yZCB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBnZXRBbW91bnREYXRhKGFtb3VudFN0cjogc3RyaW5nKSB7XG4gIGxldCBhbW91bnRTdHJDb3B5ID0gYW1vdW50U3RyLnJlcGxhY2UoU0hFS0VMX0NVUlJFTkNZX1NZTUJPTCwgJycpO1xuICBhbW91bnRTdHJDb3B5ID0gYW1vdW50U3RyQ29weS5yZXBsYWNlQWxsKCcsJywgJycpO1xuICByZXR1cm4gcGFyc2VGbG9hdChhbW91bnRTdHJDb3B5KTtcbn1cblxuZnVuY3Rpb24gZ2V0VHhuQW1vdW50KHR4bjogU2NyYXBlZFRyYW5zYWN0aW9uKSB7XG4gIGNvbnN0IGNyZWRpdCA9IGdldEFtb3VudERhdGEodHhuLmNyZWRpdCk7XG4gIGNvbnN0IGRlYml0ID0gZ2V0QW1vdW50RGF0YSh0eG4uZGViaXQpO1xuICByZXR1cm4gKE51bWJlci5pc05hTihjcmVkaXQpID8gMCA6IGNyZWRpdCkgLSAoTnVtYmVyLmlzTmFOKGRlYml0KSA/IDAgOiBkZWJpdCk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRUcmFuc2FjdGlvbnModHhuczogU2NyYXBlZFRyYW5zYWN0aW9uW10pOiBUcmFuc2FjdGlvbltdIHtcbiAgcmV0dXJuIHR4bnMubWFwKCh0eG4pOiBUcmFuc2FjdGlvbiA9PiB7XG4gICAgY29uc3QgY29udmVydGVkRGF0ZSA9IG1vbWVudCh0eG4uZGF0ZSwgREFURV9GT1JNQVQpLnRvSVNPU3RyaW5nKCk7XG4gICAgY29uc3QgY29udmVydGVkQW1vdW50ID0gZ2V0VHhuQW1vdW50KHR4bik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZXMuTm9ybWFsLFxuICAgICAgaWRlbnRpZmllcjogdHhuLnJlZmVyZW5jZSA/IHBhcnNlSW50KHR4bi5yZWZlcmVuY2UsIDEwKSA6IHVuZGVmaW5lZCxcbiAgICAgIGRhdGU6IGNvbnZlcnRlZERhdGUsXG4gICAgICBwcm9jZXNzZWREYXRlOiBjb252ZXJ0ZWREYXRlLFxuICAgICAgb3JpZ2luYWxBbW91bnQ6IGNvbnZlcnRlZEFtb3VudCxcbiAgICAgIG9yaWdpbmFsQ3VycmVuY3k6IFNIRUtFTF9DVVJSRU5DWSxcbiAgICAgIGNoYXJnZWRBbW91bnQ6IGNvbnZlcnRlZEFtb3VudCxcbiAgICAgIHN0YXR1czogdHhuLnN0YXR1cyxcbiAgICAgIGRlc2NyaXB0aW9uOiB0eG4uZGVzY3JpcHRpb24sXG4gICAgICBtZW1vOiB0eG4ubWVtbyxcbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25EYXRlKFxuICB0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLFxuICB0cmFuc2FjdGlvblR5cGU6IHN0cmluZyxcbiAgdHJhbnNhY3Rpb25zQ29sc1R5cGVzOiBUcmFuc2FjdGlvbnNDb2xzVHlwZXMsXG4pIHtcbiAgaWYgKHRyYW5zYWN0aW9uVHlwZSA9PT0gJ2NvbXBsZXRlZCcpIHtcbiAgICByZXR1cm4gKHRkc1t0cmFuc2FjdGlvbnNDb2xzVHlwZXNbREFURV9DT0xVTU5fQ0xBU1NfQ09NUExFVEVEXV0gfHwgJycpLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gKHRkc1t0cmFuc2FjdGlvbnNDb2xzVHlwZXNbREFURV9DT0xVTU5fQ0xBU1NfUEVORElOR11dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24oXG4gIHRkczogVHJhbnNhY3Rpb25zVHJUZHMsXG4gIHRyYW5zYWN0aW9uVHlwZTogc3RyaW5nLFxuICB0cmFuc2FjdGlvbnNDb2xzVHlwZXM6IFRyYW5zYWN0aW9uc0NvbHNUeXBlcyxcbikge1xuICBpZiAodHJhbnNhY3Rpb25UeXBlID09PSAnY29tcGxldGVkJykge1xuICAgIHJldHVybiAodGRzW3RyYW5zYWN0aW9uc0NvbHNUeXBlc1tERVNDUklQVElPTl9DT0xVTU5fQ0xBU1NfQ09NUExFVEVEXV0gfHwgJycpLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gKHRkc1t0cmFuc2FjdGlvbnNDb2xzVHlwZXNbREVTQ1JJUFRJT05fQ09MVU1OX0NMQVNTX1BFTkRJTkddXSB8fCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvblJlZmVyZW5jZSh0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLCB0cmFuc2FjdGlvbnNDb2xzVHlwZXM6IFRyYW5zYWN0aW9uc0NvbHNUeXBlcykge1xuICByZXR1cm4gKHRkc1t0cmFuc2FjdGlvbnNDb2xzVHlwZXNbUkVGRVJFTkNFX0NPTFVNTl9DTEFTU11dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRGViaXQodGRzOiBUcmFuc2FjdGlvbnNUclRkcywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzOiBUcmFuc2FjdGlvbnNDb2xzVHlwZXMpIHtcbiAgcmV0dXJuICh0ZHNbdHJhbnNhY3Rpb25zQ29sc1R5cGVzW0RFQklUX0NPTFVNTl9DTEFTU11dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uQ3JlZGl0KHRkczogVHJhbnNhY3Rpb25zVHJUZHMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlczogVHJhbnNhY3Rpb25zQ29sc1R5cGVzKSB7XG4gIHJldHVybiAodGRzW3RyYW5zYWN0aW9uc0NvbHNUeXBlc1tDUkVESVRfQ09MVU1OX0NMQVNTXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFRyYW5zYWN0aW9uRGV0YWlscyhcbiAgdHhuUm93OiBUcmFuc2FjdGlvbnNUcixcbiAgdHJhbnNhY3Rpb25TdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXMsXG4gIHRyYW5zYWN0aW9uc0NvbHNUeXBlczogVHJhbnNhY3Rpb25zQ29sc1R5cGVzLFxuKTogU2NyYXBlZFRyYW5zYWN0aW9uIHtcbiAgY29uc3QgdGRzID0gdHhuUm93LmlubmVyVGRzO1xuICBjb25zdCBpdGVtID0ge1xuICAgIHN0YXR1czogdHJhbnNhY3Rpb25TdGF0dXMsXG4gICAgZGF0ZTogZ2V0VHJhbnNhY3Rpb25EYXRlKHRkcywgdHJhbnNhY3Rpb25TdGF0dXMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlcyksXG4gICAgZGVzY3JpcHRpb246IGdldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24odGRzLCB0cmFuc2FjdGlvblN0YXR1cywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzKSxcbiAgICByZWZlcmVuY2U6IGdldFRyYW5zYWN0aW9uUmVmZXJlbmNlKHRkcywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzKSxcbiAgICBkZWJpdDogZ2V0VHJhbnNhY3Rpb25EZWJpdCh0ZHMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlcyksXG4gICAgY3JlZGl0OiBnZXRUcmFuc2FjdGlvbkNyZWRpdCh0ZHMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlcyksXG4gIH07XG5cbiAgcmV0dXJuIGl0ZW07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uc0NvbHNUeXBlQ2xhc3NlcyhcbiAgcGFnZTogUGFnZSB8IEZyYW1lLFxuICB0YWJsZUxvY2F0b3I6IHN0cmluZyxcbik6IFByb21pc2U8VHJhbnNhY3Rpb25zQ29sc1R5cGVzPiB7XG4gIGNvbnN0IHJlc3VsdDogVHJhbnNhY3Rpb25zQ29sc1R5cGVzID0ge307XG4gIGNvbnN0IHR5cGVDbGFzc2VzT2JqcyA9IGF3YWl0IHBhZ2VFdmFsQWxsKHBhZ2UsIGAke3RhYmxlTG9jYXRvcn0gdGJvZHkgdHI6Zmlyc3Qtb2YtdHlwZSB0ZGAsIG51bGwsIHRkcyA9PiB7XG4gICAgcmV0dXJuIHRkcy5tYXAoKHRkLCBpbmRleCkgPT4gKHtcbiAgICAgIGNvbENsYXNzOiB0ZC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJyksXG4gICAgICBpbmRleCxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgdHlwZUNsYXNzT2JqIG9mIHR5cGVDbGFzc2VzT2Jqcykge1xuICAgIGlmICh0eXBlQ2xhc3NPYmouY29sQ2xhc3MpIHtcbiAgICAgIHJlc3VsdFt0eXBlQ2xhc3NPYmouY29sQ2xhc3NdID0gdHlwZUNsYXNzT2JqLmluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBleHRyYWN0VHJhbnNhY3Rpb24oXG4gIHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdLFxuICB0cmFuc2FjdGlvblN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcyxcbiAgdHhuUm93OiBUcmFuc2FjdGlvbnNUcixcbiAgdHJhbnNhY3Rpb25zQ29sc1R5cGVzOiBUcmFuc2FjdGlvbnNDb2xzVHlwZXMsXG4pIHtcbiAgY29uc3QgdHhuID0gZXh0cmFjdFRyYW5zYWN0aW9uRGV0YWlscyh0eG5Sb3csIHRyYW5zYWN0aW9uU3RhdHVzLCB0cmFuc2FjdGlvbnNDb2xzVHlwZXMpO1xuICBpZiAodHhuLmRhdGUgIT09ICcnKSB7XG4gICAgdHhucy5wdXNoKHR4bik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFRyYW5zYWN0aW9ucyhwYWdlOiBQYWdlIHwgRnJhbWUsIHRhYmxlTG9jYXRvcjogc3RyaW5nLCB0cmFuc2FjdGlvblN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcykge1xuICBjb25zdCB0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSA9IFtdO1xuICBjb25zdCB0cmFuc2FjdGlvbnNDb2xzVHlwZXMgPSBhd2FpdCBnZXRUcmFuc2FjdGlvbnNDb2xzVHlwZUNsYXNzZXMocGFnZSwgdGFibGVMb2NhdG9yKTtcblxuICBjb25zdCB0cmFuc2FjdGlvbnNSb3dzID0gYXdhaXQgcGFnZUV2YWxBbGw8VHJhbnNhY3Rpb25zVHJbXT4ocGFnZSwgYCR7dGFibGVMb2NhdG9yfSB0Ym9keSB0cmAsIFtdLCB0cnMgPT4ge1xuICAgIHJldHVybiB0cnMubWFwKHRyID0+ICh7XG4gICAgICBpbm5lclRkczogQXJyYXkuZnJvbSh0ci5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGQnKSkubWFwKHRkID0+IHRkLmlubmVyVGV4dCksXG4gICAgfSkpO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IHR4blJvdyBvZiB0cmFuc2FjdGlvbnNSb3dzKSB7XG4gICAgZXh0cmFjdFRyYW5zYWN0aW9uKHR4bnMsIHRyYW5zYWN0aW9uU3RhdHVzLCB0eG5Sb3csIHRyYW5zYWN0aW9uc0NvbHNUeXBlcyk7XG4gIH1cbiAgcmV0dXJuIHR4bnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzTm9UcmFuc2FjdGlvbkluRGF0ZVJhbmdlRXJyb3IocGFnZTogUGFnZSB8IEZyYW1lKSB7XG4gIGNvbnN0IGhhc0Vycm9ySW5mb0VsZW1lbnQgPSBhd2FpdCBlbGVtZW50UHJlc2VudE9uUGFnZShwYWdlLCBgLiR7RVJST1JfTUVTU0FHRV9DTEFTU31gKTtcbiAgaWYgKGhhc0Vycm9ySW5mb0VsZW1lbnQpIHtcbiAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCBwYWdlLiRldmFsKGAuJHtFUlJPUl9NRVNTQUdFX0NMQVNTfWAsIGVycm9yRWxlbWVudCA9PiB7XG4gICAgICByZXR1cm4gKGVycm9yRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgIH0pO1xuICAgIHJldHVybiBlcnJvclRleHQudHJpbSgpID09PSBOT19UUkFOU0FDVElPTl9JTl9EQVRFX1JBTkdFX1RFWFQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZWFyY2hCeURhdGVzKHBhZ2U6IFBhZ2UgfCBGcmFtZSwgc3RhcnREYXRlOiBNb21lbnQpIHtcbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgJ2EjdGFiSGVhZGVyNCcpO1xuICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJ2RpdiNmaWJpX2RhdGVzJyk7XG4gIGF3YWl0IGZpbGxJbnB1dChwYWdlLCAnaW5wdXQjZnJvbURhdGUnLCBzdGFydERhdGUuZm9ybWF0KERBVEVfRk9STUFUKSk7XG4gIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsIGBidXR0b25bY2xhc3MqPSR7Q0xPU0VfU0VBUkNIX0JZX0RBVEVTX0JVVFRPTl9DTEFTU31dYCk7XG4gIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsIGBpbnB1dFt2YWx1ZT0ke1NIT1dfU0VBUkNIX0JZX0RBVEVTX0JVVFRPTl9WQUxVRX1dYCk7XG4gIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHBhZ2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50TnVtYmVyKHBhZ2U6IFBhZ2UgfCBGcmFtZSkge1xuICBjb25zdCBzZWxlY3RlZFNuaWZBY2NvdW50ID0gYXdhaXQgcGFnZS4kZXZhbChBQ0NPVU5UU19OVU1CRVIsIG9wdGlvbiA9PiB7XG4gICAgcmV0dXJuIChvcHRpb24gYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dDtcbiAgfSk7XG5cbiAgcmV0dXJuIHNlbGVjdGVkU25pZkFjY291bnQucmVwbGFjZSgnLycsICdfJykudHJpbSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja0lmSGFzTmV4dFBhZ2UocGFnZTogUGFnZSB8IEZyYW1lKSB7XG4gIHJldHVybiBlbGVtZW50UHJlc2VudE9uUGFnZShwYWdlLCBORVhUX1BBR0VfTElOSyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5hdmlnYXRlVG9OZXh0UGFnZShwYWdlOiBQYWdlIHwgRnJhbWUpIHtcbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgTkVYVF9QQUdFX0xJTkspO1xuICBhd2FpdCB3YWl0Rm9yTmF2aWdhdGlvbihwYWdlKTtcbn1cblxuLyogQ291bGRuJ3QgcmVwcm9kdWNlIHNjZW5hcmlvIHdpdGggbXVsdGlwbGUgcGFnZXMgb2YgcGVuZGluZyB0cmFuc2FjdGlvbnMgLSBTaG91bGQgc3VwcG9ydCBpZiBleGlzdHMgc3VjaCBjYXNlLlxuICAgbmVlZFRvUGFnaW5hdGUgaXMgZmFsc2UgaWYgc2NyYXBpbmcgcGVuZGluZyB0cmFuc2FjdGlvbnMgKi9cbmFzeW5jIGZ1bmN0aW9uIHNjcmFwZVRyYW5zYWN0aW9ucyhcbiAgcGFnZTogUGFnZSB8IEZyYW1lLFxuICB0YWJsZUxvY2F0b3I6IHN0cmluZyxcbiAgdHJhbnNhY3Rpb25TdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXMsXG4gIG5lZWRUb1BhZ2luYXRlOiBib29sZWFuLFxuKSB7XG4gIGNvbnN0IHR4bnMgPSBbXTtcbiAgbGV0IGhhc05leHRQYWdlID0gZmFsc2U7XG5cbiAgZG8ge1xuICAgIGNvbnN0IGN1cnJlbnRQYWdlVHhucyA9IGF3YWl0IGV4dHJhY3RUcmFuc2FjdGlvbnMocGFnZSwgdGFibGVMb2NhdG9yLCB0cmFuc2FjdGlvblN0YXR1cyk7XG4gICAgdHhucy5wdXNoKC4uLmN1cnJlbnRQYWdlVHhucyk7XG4gICAgaWYgKG5lZWRUb1BhZ2luYXRlKSB7XG4gICAgICBoYXNOZXh0UGFnZSA9IGF3YWl0IGNoZWNrSWZIYXNOZXh0UGFnZShwYWdlKTtcbiAgICAgIGlmIChoYXNOZXh0UGFnZSkge1xuICAgICAgICBhd2FpdCBuYXZpZ2F0ZVRvTmV4dFBhZ2UocGFnZSk7XG4gICAgICB9XG4gICAgfVxuICB9IHdoaWxlIChoYXNOZXh0UGFnZSk7XG5cbiAgcmV0dXJuIGNvbnZlcnRUcmFuc2FjdGlvbnModHhucyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnRUcmFuc2FjdGlvbnMocGFnZTogUGFnZSB8IEZyYW1lKSB7XG4gIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIFwiZGl2W2lkKj0nZGl2VGFibGUnXVwiLCBmYWxzZSksXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsIGAuJHtFUlJPUl9NRVNTQUdFX0NMQVNTfWAsIGZhbHNlKSxcbiAgXSk7XG5cbiAgY29uc3Qgbm9UcmFuc2FjdGlvbkluUmFuZ2VFcnJvciA9IGF3YWl0IGlzTm9UcmFuc2FjdGlvbkluRGF0ZVJhbmdlRXJyb3IocGFnZSk7XG4gIGlmIChub1RyYW5zYWN0aW9uSW5SYW5nZUVycm9yKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgcGVuZGluZ1R4bnMgPSBhd2FpdCBzY3JhcGVUcmFuc2FjdGlvbnMocGFnZSwgUEVORElOR19UUkFOU0FDVElPTlNfVEFCTEUsIFRyYW5zYWN0aW9uU3RhdHVzZXMuUGVuZGluZywgZmFsc2UpO1xuICBjb25zdCBjb21wbGV0ZWRUeG5zID0gYXdhaXQgc2NyYXBlVHJhbnNhY3Rpb25zKFxuICAgIHBhZ2UsXG4gICAgQ09NUExFVEVEX1RSQU5TQUNUSU9OU19UQUJMRSxcbiAgICBUcmFuc2FjdGlvblN0YXR1c2VzLkNvbXBsZXRlZCxcbiAgICB0cnVlLFxuICApO1xuICBjb25zdCB0eG5zID0gWy4uLnBlbmRpbmdUeG5zLCAuLi5jb21wbGV0ZWRUeG5zXTtcbiAgcmV0dXJuIHR4bnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRCYWxhbmNlKHBhZ2U6IFBhZ2UgfCBGcmFtZSkge1xuICBjb25zdCBiYWxhbmNlRWxlbWVudCA9IGF3YWl0IHBhZ2UuJChDVVJSRU5UX0JBTEFOQ0UpO1xuICBpZiAoIWJhbGFuY2VFbGVtZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBiYWxhbmNlU3RyID0gYXdhaXQgYmFsYW5jZUVsZW1lbnQuZXZhbHVhdGUob3B0aW9uID0+IHtcbiAgICByZXR1cm4gKG9wdGlvbiBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICB9KTtcbiAgcmV0dXJuIGdldEFtb3VudERhdGEoYmFsYW5jZVN0cik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yUG9zdExvZ2luKHBhZ2U6IFBhZ2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmFjZShbXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjY2FyZC1oZWFkZXInLCB0cnVlKSwgLy8gTmV3IFVJXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjYWNjb3VudF9udW0nLCB0cnVlKSwgLy8gTmV3IFVJXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjbWF0YWZMb2dvdXRMaW5rJywgdHJ1ZSksIC8vIE9sZCBVSVxuICAgIHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnI3ZhbGlkYXRpb25Nc2cnLCB0cnVlKSwgLy8gT2xkIFVJXG4gIF0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFjY291bnREYXRhKHBhZ2U6IFBhZ2UgfCBGcmFtZSwgc3RhcnREYXRlOiBNb21lbnQpIHtcbiAgYXdhaXQgc2VhcmNoQnlEYXRlcyhwYWdlLCBzdGFydERhdGUpO1xuICBjb25zdCBhY2NvdW50TnVtYmVyID0gYXdhaXQgZ2V0QWNjb3VudE51bWJlcihwYWdlKTtcbiAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGdldEN1cnJlbnRCYWxhbmNlKHBhZ2UpO1xuICBjb25zdCB0eG5zID0gYXdhaXQgZ2V0QWNjb3VudFRyYW5zYWN0aW9ucyhwYWdlKTtcblxuICByZXR1cm4ge1xuICAgIGFjY291bnROdW1iZXIsXG4gICAgdHhucyxcbiAgICBiYWxhbmNlLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50SWRzQnlTZWxlY3RvcihwYWdlOiBQYWdlKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBhY2NvdW50c0lkcyA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNjb3VudF9udW1fc2VsZWN0Jyk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHNlbGVjdEVsZW1lbnQgPyBzZWxlY3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbicpIDogW107XG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm4gW107XG4gICAgcmV0dXJuIEFycmF5LmZyb20ob3B0aW9ucywgb3B0aW9uID0+IG9wdGlvbi52YWx1ZSk7XG4gIH0pO1xuICByZXR1cm4gYWNjb3VudHNJZHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uc0ZyYW1lKHBhZ2U6IFBhZ2UpOiBQcm9taXNlPEZyYW1lIHwgbnVsbD4ge1xuICAvLyBUcnkgYSBmZXcgdGltZXMgdG8gZmluZCB0aGUgaWZyYW1lLCBhcyBpdCBtaWdodCBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgMzsgYXR0ZW1wdCsrKSB7XG4gICAgYXdhaXQgc2xlZXAoMjAwMCk7XG4gICAgY29uc3QgZnJhbWVzID0gcGFnZS5mcmFtZXMoKTtcbiAgICBjb25zdCB0YXJnZXRGcmFtZSA9IGZyYW1lcy5maW5kKGYgPT4gZi5uYW1lKCkgPT09IElGUkFNRV9OQU1FKTtcblxuICAgIGlmICh0YXJnZXRGcmFtZSkge1xuICAgICAgcmV0dXJuIHRhcmdldEZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZWxlY3RBY2NvdW50KHBhZ2U6IFBhZ2UsIGFjY291bnRJZDogc3RyaW5nKSB7XG4gIGF3YWl0IHBhZ2Uuc2VsZWN0KCcjYWNjb3VudF9udW1fc2VsZWN0JywgYWNjb3VudElkKTtcbiAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjYWNjb3VudF9udW1fc2VsZWN0JywgdHJ1ZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQWNjb3VudERhdGFCb3RoVUlzKHBhZ2U6IFBhZ2UsIHN0YXJ0RGF0ZTogTW9tZW50KSB7XG4gIC8vIFRyeSB0byBnZXQgdGhlIGlmcmFtZSBmb3IgdGhlIG5ldyBVSVxuICBjb25zdCBmcmFtZSA9IGF3YWl0IGdldFRyYW5zYWN0aW9uc0ZyYW1lKHBhZ2UpO1xuXG4gIC8vIFVzZSB0aGUgZnJhbWUgaWYgYXZhaWxhYmxlIChuZXcgVUkpLCBvdGhlcndpc2UgdXNlIHRoZSBwYWdlIGRpcmVjdGx5IChvbGQgVUkpXG4gIGNvbnN0IHRhcmdldFBhZ2UgPSBmcmFtZSB8fCBwYWdlO1xuICByZXR1cm4gZmV0Y2hBY2NvdW50RGF0YSh0YXJnZXRQYWdlLCBzdGFydERhdGUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFjY291bnRzKHBhZ2U6IFBhZ2UsIHN0YXJ0RGF0ZTogTW9tZW50KTogUHJvbWlzZTxUcmFuc2FjdGlvbnNBY2NvdW50W10+IHtcbiAgY29uc3QgYWNjb3VudHNJZHMgPSBhd2FpdCBnZXRBY2NvdW50SWRzQnlTZWxlY3RvcihwYWdlKTtcblxuICBpZiAoYWNjb3VudHNJZHMubGVuZ3RoIDw9IDEpIHtcbiAgICBjb25zdCBhY2NvdW50RGF0YSA9IGF3YWl0IGZldGNoQWNjb3VudERhdGFCb3RoVUlzKHBhZ2UsIHN0YXJ0RGF0ZSk7XG4gICAgcmV0dXJuIFthY2NvdW50RGF0YV07XG4gIH1cblxuICBjb25zdCBhY2NvdW50czogVHJhbnNhY3Rpb25zQWNjb3VudFtdID0gW107XG4gIGZvciAoY29uc3QgYWNjb3VudElkIG9mIGFjY291bnRzSWRzKSB7XG4gICAgYXdhaXQgc2VsZWN0QWNjb3VudChwYWdlLCBhY2NvdW50SWQpO1xuXG4gICAgY29uc3QgYWNjb3VudERhdGEgPSBhd2FpdCBmZXRjaEFjY291bnREYXRhQm90aFVJcyhwYWdlLCBzdGFydERhdGUpO1xuICAgIGFjY291bnRzLnB1c2goYWNjb3VudERhdGEpO1xuICB9XG5cbiAgcmV0dXJuIGFjY291bnRzO1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG5cbmNsYXNzIEJlaW5sZXVtaUdyb3VwQmFzZVNjcmFwZXIgZXh0ZW5kcyBCYXNlU2NyYXBlcldpdGhCcm93c2VyPFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzPiB7XG4gIEJBU0VfVVJMID0gJyc7XG5cbiAgTE9HSU5fVVJMID0gJyc7XG5cbiAgVFJBTlNBQ1RJT05TX1VSTCA9ICcnO1xuXG4gIGdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9naW5Vcmw6IGAke3RoaXMuTE9HSU5fVVJMfWAsXG4gICAgICBmaWVsZHM6IGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzKSxcbiAgICAgIHN1Ym1pdEJ1dHRvblNlbGVjdG9yOiAnI2NvbnRpbnVlQnRuJyxcbiAgICAgIHBvc3RBY3Rpb246IGFzeW5jICgpID0+IHdhaXRGb3JQb3N0TG9naW4odGhpcy5wYWdlKSxcbiAgICAgIHBvc3NpYmxlUmVzdWx0czogZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKSxcbiAgICAgIC8vIEhBQ0s6IEZvciBzb21lIHJlYXNvbiwgdGhvdWdoIHRoZSBsb2dpbiBidXR0b24gKCNjb250aW51ZUJ0bikgaXMgcHJlc2VudCBhbmQgdmlzaWJsZSwgdGhlIGNsaWNrIGFjdGlvbiBkb2VzIG5vdCBwZXJmb3JtLlxuICAgICAgLy8gQWRkaW5nIHRoaXMgZGVsYXkgZml4ZXMgdGhlIGlzc3VlLlxuICAgICAgcHJlQWN0aW9uOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHNsZWVwKDEwMDApO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCkge1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydE1vbWVudCA9IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFycycpLmFkZCgxLCAnZGF5Jyk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnRMaW1pdCA9IG1vbWVudCh7IHllYXI6IDE2MDAgfSk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KHN0YXJ0TW9tZW50TGltaXQsIG1vbWVudChzdGFydERhdGUpKTtcblxuICAgIGF3YWl0IHRoaXMubmF2aWdhdGVUbyh0aGlzLlRSQU5TQUNUSU9OU19VUkwpO1xuXG4gICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBmZXRjaEFjY291bnRzKHRoaXMucGFnZSwgc3RhcnRNb21lbnQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhY2NvdW50cyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJlaW5sZXVtaUdyb3VwQmFzZVNjcmFwZXI7XG4iXX0=
430
+ var _default = exports.default = BeinleumiGroupBaseScraper;
431
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29uc3RhbnRzIiwiX2VsZW1lbnRzSW50ZXJhY3Rpb25zIiwiX25hdmlnYXRpb24iLCJfd2FpdGluZyIsIl90cmFuc2FjdGlvbnMiLCJfYmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIkRBVEVfRk9STUFUIiwiTk9fVFJBTlNBQ1RJT05fSU5fREFURV9SQU5HRV9URVhUIiwiREFURV9DT0xVTU5fQ0xBU1NfQ09NUExFVEVEIiwiREFURV9DT0xVTU5fQ0xBU1NfUEVORElORyIsIkRFU0NSSVBUSU9OX0NPTFVNTl9DTEFTU19DT01QTEVURUQiLCJERVNDUklQVElPTl9DT0xVTU5fQ0xBU1NfUEVORElORyIsIlJFRkVSRU5DRV9DT0xVTU5fQ0xBU1MiLCJERUJJVF9DT0xVTU5fQ0xBU1MiLCJDUkVESVRfQ09MVU1OX0NMQVNTIiwiRVJST1JfTUVTU0FHRV9DTEFTUyIsIkFDQ09VTlRTX05VTUJFUiIsIkNMT1NFX1NFQVJDSF9CWV9EQVRFU19CVVRUT05fQ0xBU1MiLCJTSE9XX1NFQVJDSF9CWV9EQVRFU19CVVRUT05fVkFMVUUiLCJDT01QTEVURURfVFJBTlNBQ1RJT05TX1RBQkxFIiwiUEVORElOR19UUkFOU0FDVElPTlNfVEFCTEUiLCJORVhUX1BBR0VfTElOSyIsIkNVUlJFTlRfQkFMQU5DRSIsIklGUkFNRV9OQU1FIiwiZ2V0UG9zc2libGVMb2dpblJlc3VsdHMiLCJ1cmxzIiwiTG9naW5SZXN1bHRzIiwiU3VjY2VzcyIsIkludmFsaWRQYXNzd29yZCIsImNyZWF0ZUxvZ2luRmllbGRzIiwiY3JlZGVudGlhbHMiLCJzZWxlY3RvciIsInZhbHVlIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImdldEFtb3VudERhdGEiLCJhbW91bnRTdHIiLCJhbW91bnRTdHJDb3B5IiwicmVwbGFjZSIsIlNIRUtFTF9DVVJSRU5DWV9TWU1CT0wiLCJyZXBsYWNlQWxsIiwicGFyc2VGbG9hdCIsImdldFR4bkFtb3VudCIsInR4biIsImNyZWRpdCIsImRlYml0IiwiTnVtYmVyIiwiaXNOYU4iLCJjb252ZXJ0VHJhbnNhY3Rpb25zIiwidHhucyIsIm1hcCIsImNvbnZlcnRlZERhdGUiLCJtb21lbnQiLCJkYXRlIiwidG9JU09TdHJpbmciLCJjb252ZXJ0ZWRBbW91bnQiLCJ0eXBlIiwiVHJhbnNhY3Rpb25UeXBlcyIsIk5vcm1hbCIsImlkZW50aWZpZXIiLCJyZWZlcmVuY2UiLCJwYXJzZUludCIsInVuZGVmaW5lZCIsInByb2Nlc3NlZERhdGUiLCJvcmlnaW5hbEFtb3VudCIsIm9yaWdpbmFsQ3VycmVuY3kiLCJTSEVLRUxfQ1VSUkVOQ1kiLCJjaGFyZ2VkQW1vdW50Iiwic3RhdHVzIiwiZGVzY3JpcHRpb24iLCJtZW1vIiwiZ2V0VHJhbnNhY3Rpb25EYXRlIiwidGRzIiwidHJhbnNhY3Rpb25UeXBlIiwidHJhbnNhY3Rpb25zQ29sc1R5cGVzIiwidHJpbSIsImdldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24iLCJnZXRUcmFuc2FjdGlvblJlZmVyZW5jZSIsImdldFRyYW5zYWN0aW9uRGViaXQiLCJnZXRUcmFuc2FjdGlvbkNyZWRpdCIsImV4dHJhY3RUcmFuc2FjdGlvbkRldGFpbHMiLCJ0eG5Sb3ciLCJ0cmFuc2FjdGlvblN0YXR1cyIsImlubmVyVGRzIiwiaXRlbSIsImdldFRyYW5zYWN0aW9uc0NvbHNUeXBlQ2xhc3NlcyIsInBhZ2UiLCJ0YWJsZUxvY2F0b3IiLCJyZXN1bHQiLCJ0eXBlQ2xhc3Nlc09ianMiLCJwYWdlRXZhbEFsbCIsInRkIiwiaW5kZXgiLCJjb2xDbGFzcyIsImdldEF0dHJpYnV0ZSIsInR5cGVDbGFzc09iaiIsImV4dHJhY3RUcmFuc2FjdGlvbiIsInB1c2giLCJleHRyYWN0VHJhbnNhY3Rpb25zIiwidHJhbnNhY3Rpb25zUm93cyIsInRycyIsInRyIiwiQXJyYXkiLCJmcm9tIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJpbm5lclRleHQiLCJpc05vVHJhbnNhY3Rpb25JbkRhdGVSYW5nZUVycm9yIiwiaGFzRXJyb3JJbmZvRWxlbWVudCIsImVsZW1lbnRQcmVzZW50T25QYWdlIiwiZXJyb3JUZXh0IiwiJGV2YWwiLCJlcnJvckVsZW1lbnQiLCJzZWFyY2hCeURhdGVzIiwic3RhcnREYXRlIiwiY2xpY2tCdXR0b24iLCJ3YWl0VW50aWxFbGVtZW50Rm91bmQiLCJmaWxsSW5wdXQiLCJmb3JtYXQiLCJ3YWl0Rm9yTmF2aWdhdGlvbiIsImdldEFjY291bnROdW1iZXIiLCJzZWxlY3RlZFNuaWZBY2NvdW50Iiwib3B0aW9uIiwiY2hlY2tJZkhhc05leHRQYWdlIiwibmF2aWdhdGVUb05leHRQYWdlIiwic2NyYXBlVHJhbnNhY3Rpb25zIiwibmVlZFRvUGFnaW5hdGUiLCJoYXNOZXh0UGFnZSIsImN1cnJlbnRQYWdlVHhucyIsImdldEFjY291bnRUcmFuc2FjdGlvbnMiLCJQcm9taXNlIiwicmFjZSIsIm5vVHJhbnNhY3Rpb25JblJhbmdlRXJyb3IiLCJwZW5kaW5nVHhucyIsIlRyYW5zYWN0aW9uU3RhdHVzZXMiLCJQZW5kaW5nIiwiY29tcGxldGVkVHhucyIsIkNvbXBsZXRlZCIsImdldEN1cnJlbnRCYWxhbmNlIiwiYmFsYW5jZUVsZW1lbnQiLCIkIiwiYmFsYW5jZVN0ciIsImV2YWx1YXRlIiwid2FpdEZvclBvc3RMb2dpbiIsImZldGNoQWNjb3VudERhdGEiLCJhY2NvdW50TnVtYmVyIiwiYmFsYW5jZSIsImdldEFjY291bnRJZHNPbGRVSSIsInNlbGVjdEVsZW1lbnQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwib3B0aW9ucyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJjbGlja0FjY291bnRTZWxlY3RvckdldEFjY291bnRJZHMiLCJhY2NvdW50U2VsZWN0b3IiLCJkcm9wZG93blBhbmVsU2VsZWN0b3IiLCJvcHRpb25TZWxlY3RvciIsImRyb3Bkb3duVmlzaWJsZSIsImVsIiwid2luZG93IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImRpc3BsYXkiLCJvZmZzZXRQYXJlbnQiLCJjYXRjaCIsIndhaXRGb3JTZWxlY3RvciIsInZpc2libGUiLCJ0aW1lb3V0IiwiYWNjb3VudExhYmVscyIsIiQkZXZhbCIsInRleHRDb250ZW50IiwiZmlsdGVyIiwibGFiZWwiLCJlcnJvciIsImdldEFjY291bnRJZHNCb3RoVUlzIiwiYWNjb3VudHNJZHMiLCJsZW5ndGgiLCJzZWxlY3RBY2NvdW50RnJvbURyb3Bkb3duIiwiYWNjb3VudExhYmVsIiwiYXZhaWxhYmxlQWNjb3VudHMiLCJpbmNsdWRlcyIsImFjY291bnRPcHRpb25zIiwiJCQiLCJ0ZXh0Iiwib3B0aW9uSGFuZGxlIiwiZXZhbHVhdGVIYW5kbGUiLCJjbGljayIsImdldFRyYW5zYWN0aW9uc0ZyYW1lIiwiYXR0ZW1wdCIsInNsZWVwIiwiZnJhbWVzIiwidGFyZ2V0RnJhbWUiLCJmaW5kIiwiZiIsIm5hbWUiLCJzZWxlY3RBY2NvdW50Qm90aFVJcyIsImFjY291bnRJZCIsImFjY291bnRTZWxlY3RlZCIsInNlbGVjdCIsImZldGNoQWNjb3VudERhdGFCb3RoVUlzIiwiZnJhbWUiLCJ0YXJnZXRQYWdlIiwiZmV0Y2hBY2NvdW50cyIsImFjY291bnREYXRhIiwiYWNjb3VudHMiLCJCZWlubGV1bWlHcm91cEJhc2VTY3JhcGVyIiwiQmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsIkJBU0VfVVJMIiwiTE9HSU5fVVJMIiwiVFJBTlNBQ1RJT05TX1VSTCIsImdldExvZ2luT3B0aW9ucyIsImxvZ2luVXJsIiwiZmllbGRzIiwic3VibWl0QnV0dG9uU2VsZWN0b3IiLCJwb3N0QWN0aW9uIiwicG9zc2libGVSZXN1bHRzIiwicHJlQWN0aW9uIiwiZmV0Y2hEYXRhIiwiZGVmYXVsdFN0YXJ0TW9tZW50Iiwic3VidHJhY3QiLCJhZGQiLCJzdGFydE1vbWVudExpbWl0IiwieWVhciIsInRvRGF0ZSIsInN0YXJ0TW9tZW50IiwibWF4IiwibmF2aWdhdGVUbyIsInN1Y2Nlc3MiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvYmFzZS1iZWlubGV1bWktZ3JvdXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCwgeyB0eXBlIE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyB0eXBlIEZyYW1lLCB0eXBlIFBhZ2UgfSBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgU0hFS0VMX0NVUlJFTkNZLCBTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGNsaWNrQnV0dG9uLFxuICBlbGVtZW50UHJlc2VudE9uUGFnZSxcbiAgZmlsbElucHV0LFxuICBwYWdlRXZhbEFsbCxcbiAgd2FpdFVudGlsRWxlbWVudEZvdW5kLFxufSBmcm9tICcuLi9oZWxwZXJzL2VsZW1lbnRzLWludGVyYWN0aW9ucyc7XG5pbXBvcnQgeyB3YWl0Rm9yTmF2aWdhdGlvbiB9IGZyb20gJy4uL2hlbHBlcnMvbmF2aWdhdGlvbic7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4uL2hlbHBlcnMvd2FpdGluZyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblN0YXR1c2VzLCBUcmFuc2FjdGlvblR5cGVzLCB0eXBlIFRyYW5zYWN0aW9uLCB0eXBlIFRyYW5zYWN0aW9uc0FjY291bnQgfSBmcm9tICcuLi90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgQmFzZVNjcmFwZXJXaXRoQnJvd3NlciwgTG9naW5SZXN1bHRzLCB0eXBlIFBvc3NpYmxlTG9naW5SZXN1bHRzIH0gZnJvbSAnLi9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyJztcblxuY29uc3QgREFURV9GT1JNQVQgPSAnREQvTU0vWVlZWSc7XG5jb25zdCBOT19UUkFOU0FDVElPTl9JTl9EQVRFX1JBTkdFX1RFWFQgPSAn15zXkCDXoNee16bXkNeVINeg16rXldeg15nXnSDXkdeg15XXqdeQINeU157XkdeV16fXqSc7XG5jb25zdCBEQVRFX0NPTFVNTl9DTEFTU19DT01QTEVURUQgPSAnZGF0ZSBmaXJzdCc7XG5jb25zdCBEQVRFX0NPTFVNTl9DTEFTU19QRU5ESU5HID0gJ2ZpcnN0IGRhdGUnO1xuY29uc3QgREVTQ1JJUFRJT05fQ09MVU1OX0NMQVNTX0NPTVBMRVRFRCA9ICdyZWZlcmVuY2Ugd3JhcF9ub3JtYWwnO1xuY29uc3QgREVTQ1JJUFRJT05fQ09MVU1OX0NMQVNTX1BFTkRJTkcgPSAnZGV0YWlscyB3cmFwX25vcm1hbCc7XG5jb25zdCBSRUZFUkVOQ0VfQ09MVU1OX0NMQVNTID0gJ2RldGFpbHMnO1xuY29uc3QgREVCSVRfQ09MVU1OX0NMQVNTID0gJ2RlYml0JztcbmNvbnN0IENSRURJVF9DT0xVTU5fQ0xBU1MgPSAnY3JlZGl0JztcbmNvbnN0IEVSUk9SX01FU1NBR0VfQ0xBU1MgPSAnTk9fREFUQSc7XG5jb25zdCBBQ0NPVU5UU19OVU1CRVIgPSAnZGl2LmZpYmlfYWNjb3VudCBzcGFuLmFjY19udW0nO1xuY29uc3QgQ0xPU0VfU0VBUkNIX0JZX0RBVEVTX0JVVFRPTl9DTEFTUyA9ICd1aS1kYXRlcGlja2VyLWNsb3NlJztcbmNvbnN0IFNIT1dfU0VBUkNIX0JZX0RBVEVTX0JVVFRPTl9WQUxVRSA9ICfXlNem15InO1xuY29uc3QgQ09NUExFVEVEX1RSQU5TQUNUSU9OU19UQUJMRSA9ICd0YWJsZSNkYXRhVGFibGUwNzcnO1xuY29uc3QgUEVORElOR19UUkFOU0FDVElPTlNfVEFCTEUgPSAndGFibGUjZGF0YVRhYmxlMDIzJztcbmNvbnN0IE5FWFRfUEFHRV9MSU5LID0gJ2EjTnBhZ2UucGFnaW5nJztcbmNvbnN0IENVUlJFTlRfQkFMQU5DRSA9ICcubWFpbl9iYWxhbmNlJztcbmNvbnN0IElGUkFNRV9OQU1FID0gJ2lmcmFtZS1vbGQtcGFnZXMnO1xuXG50eXBlIFRyYW5zYWN0aW9uc0NvbHNUeXBlcyA9IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG50eXBlIFRyYW5zYWN0aW9uc1RyVGRzID0gc3RyaW5nW107XG50eXBlIFRyYW5zYWN0aW9uc1RyID0geyBpbm5lclRkczogVHJhbnNhY3Rpb25zVHJUZHMgfTtcblxuaW50ZXJmYWNlIFNjcmFwZWRUcmFuc2FjdGlvbiB7XG4gIHJlZmVyZW5jZTogc3RyaW5nO1xuICBkYXRlOiBzdHJpbmc7XG4gIGNyZWRpdDogc3RyaW5nO1xuICBkZWJpdDogc3RyaW5nO1xuICBtZW1vPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3NzaWJsZUxvZ2luUmVzdWx0cygpOiBQb3NzaWJsZUxvZ2luUmVzdWx0cyB7XG4gIGNvbnN0IHVybHM6IFBvc3NpYmxlTG9naW5SZXN1bHRzID0ge307XG4gIHVybHNbTG9naW5SZXN1bHRzLlN1Y2Nlc3NdID0gW1xuICAgIC9maWJpLiphY2NvdW50U3VtbWFyeS8sIC8vIE5ldyBVSSBwYXR0ZXJuXG4gICAgL0ZpYmlNZW51XFwvT25saW5lLywgLy8gT2xkIFVJIHBhdHRlcm5cbiAgXTtcbiAgdXJsc1tMb2dpblJlc3VsdHMuSW52YWxpZFBhc3N3b3JkXSA9IFsvRmliaU1lbnVcXC9NYXJrZXRpbmdcXC9Qcml2YXRlXFwvSG9tZS9dO1xuICByZXR1cm4gdXJscztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzOiBTY3JhcGVyU3BlY2lmaWNDcmVkZW50aWFscykge1xuICByZXR1cm4gW1xuICAgIHsgc2VsZWN0b3I6ICcjdXNlcm5hbWUnLCB2YWx1ZTogY3JlZGVudGlhbHMudXNlcm5hbWUgfSxcbiAgICB7IHNlbGVjdG9yOiAnI3Bhc3N3b3JkJywgdmFsdWU6IGNyZWRlbnRpYWxzLnBhc3N3b3JkIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGdldEFtb3VudERhdGEoYW1vdW50U3RyOiBzdHJpbmcpIHtcbiAgbGV0IGFtb3VudFN0ckNvcHkgPSBhbW91bnRTdHIucmVwbGFjZShTSEVLRUxfQ1VSUkVOQ1lfU1lNQk9MLCAnJyk7XG4gIGFtb3VudFN0ckNvcHkgPSBhbW91bnRTdHJDb3B5LnJlcGxhY2VBbGwoJywnLCAnJyk7XG4gIHJldHVybiBwYXJzZUZsb2F0KGFtb3VudFN0ckNvcHkpO1xufVxuXG5mdW5jdGlvbiBnZXRUeG5BbW91bnQodHhuOiBTY3JhcGVkVHJhbnNhY3Rpb24pIHtcbiAgY29uc3QgY3JlZGl0ID0gZ2V0QW1vdW50RGF0YSh0eG4uY3JlZGl0KTtcbiAgY29uc3QgZGViaXQgPSBnZXRBbW91bnREYXRhKHR4bi5kZWJpdCk7XG4gIHJldHVybiAoTnVtYmVyLmlzTmFOKGNyZWRpdCkgPyAwIDogY3JlZGl0KSAtIChOdW1iZXIuaXNOYU4oZGViaXQpID8gMCA6IGRlYml0KTtcbn1cblxuZnVuY3Rpb24gY29udmVydFRyYW5zYWN0aW9ucyh0eG5zOiBTY3JhcGVkVHJhbnNhY3Rpb25bXSk6IFRyYW5zYWN0aW9uW10ge1xuICByZXR1cm4gdHhucy5tYXAoKHR4bik6IFRyYW5zYWN0aW9uID0+IHtcbiAgICBjb25zdCBjb252ZXJ0ZWREYXRlID0gbW9tZW50KHR4bi5kYXRlLCBEQVRFX0ZPUk1BVCkudG9JU09TdHJpbmcoKTtcbiAgICBjb25zdCBjb252ZXJ0ZWRBbW91bnQgPSBnZXRUeG5BbW91bnQodHhuKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlcy5Ob3JtYWwsXG4gICAgICBpZGVudGlmaWVyOiB0eG4ucmVmZXJlbmNlID8gcGFyc2VJbnQodHhuLnJlZmVyZW5jZSwgMTApIDogdW5kZWZpbmVkLFxuICAgICAgZGF0ZTogY29udmVydGVkRGF0ZSxcbiAgICAgIHByb2Nlc3NlZERhdGU6IGNvbnZlcnRlZERhdGUsXG4gICAgICBvcmlnaW5hbEFtb3VudDogY29udmVydGVkQW1vdW50LFxuICAgICAgb3JpZ2luYWxDdXJyZW5jeTogU0hFS0VMX0NVUlJFTkNZLFxuICAgICAgY2hhcmdlZEFtb3VudDogY29udmVydGVkQW1vdW50LFxuICAgICAgc3RhdHVzOiB0eG4uc3RhdHVzLFxuICAgICAgZGVzY3JpcHRpb246IHR4bi5kZXNjcmlwdGlvbixcbiAgICAgIG1lbW86IHR4bi5tZW1vLFxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbkRhdGUoXG4gIHRkczogVHJhbnNhY3Rpb25zVHJUZHMsXG4gIHRyYW5zYWN0aW9uVHlwZTogc3RyaW5nLFxuICB0cmFuc2FjdGlvbnNDb2xzVHlwZXM6IFRyYW5zYWN0aW9uc0NvbHNUeXBlcyxcbikge1xuICBpZiAodHJhbnNhY3Rpb25UeXBlID09PSAnY29tcGxldGVkJykge1xuICAgIHJldHVybiAodGRzW3RyYW5zYWN0aW9uc0NvbHNUeXBlc1tEQVRFX0NPTFVNTl9DTEFTU19DT01QTEVURURdXSB8fCAnJykudHJpbSgpO1xuICB9XG4gIHJldHVybiAodGRzW3RyYW5zYWN0aW9uc0NvbHNUeXBlc1tEQVRFX0NPTFVNTl9DTEFTU19QRU5ESU5HXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbihcbiAgdGRzOiBUcmFuc2FjdGlvbnNUclRkcyxcbiAgdHJhbnNhY3Rpb25UeXBlOiBzdHJpbmcsXG4gIHRyYW5zYWN0aW9uc0NvbHNUeXBlczogVHJhbnNhY3Rpb25zQ29sc1R5cGVzLFxuKSB7XG4gIGlmICh0cmFuc2FjdGlvblR5cGUgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgcmV0dXJuICh0ZHNbdHJhbnNhY3Rpb25zQ29sc1R5cGVzW0RFU0NSSVBUSU9OX0NPTFVNTl9DTEFTU19DT01QTEVURURdXSB8fCAnJykudHJpbSgpO1xuICB9XG4gIHJldHVybiAodGRzW3RyYW5zYWN0aW9uc0NvbHNUeXBlc1tERVNDUklQVElPTl9DT0xVTU5fQ0xBU1NfUEVORElOR11dIHx8ICcnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uUmVmZXJlbmNlKHRkczogVHJhbnNhY3Rpb25zVHJUZHMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlczogVHJhbnNhY3Rpb25zQ29sc1R5cGVzKSB7XG4gIHJldHVybiAodGRzW3RyYW5zYWN0aW9uc0NvbHNUeXBlc1tSRUZFUkVOQ0VfQ09MVU1OX0NMQVNTXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25EZWJpdCh0ZHM6IFRyYW5zYWN0aW9uc1RyVGRzLCB0cmFuc2FjdGlvbnNDb2xzVHlwZXM6IFRyYW5zYWN0aW9uc0NvbHNUeXBlcykge1xuICByZXR1cm4gKHRkc1t0cmFuc2FjdGlvbnNDb2xzVHlwZXNbREVCSVRfQ09MVU1OX0NMQVNTXV0gfHwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25DcmVkaXQodGRzOiBUcmFuc2FjdGlvbnNUclRkcywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzOiBUcmFuc2FjdGlvbnNDb2xzVHlwZXMpIHtcbiAgcmV0dXJuICh0ZHNbdHJhbnNhY3Rpb25zQ29sc1R5cGVzW0NSRURJVF9DT0xVTU5fQ0xBU1NdXSB8fCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0VHJhbnNhY3Rpb25EZXRhaWxzKFxuICB0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyLFxuICB0cmFuc2FjdGlvblN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcyxcbiAgdHJhbnNhY3Rpb25zQ29sc1R5cGVzOiBUcmFuc2FjdGlvbnNDb2xzVHlwZXMsXG4pOiBTY3JhcGVkVHJhbnNhY3Rpb24ge1xuICBjb25zdCB0ZHMgPSB0eG5Sb3cuaW5uZXJUZHM7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgc3RhdHVzOiB0cmFuc2FjdGlvblN0YXR1cyxcbiAgICBkYXRlOiBnZXRUcmFuc2FjdGlvbkRhdGUodGRzLCB0cmFuc2FjdGlvblN0YXR1cywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzKSxcbiAgICBkZXNjcmlwdGlvbjogZ2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbih0ZHMsIHRyYW5zYWN0aW9uU3RhdHVzLCB0cmFuc2FjdGlvbnNDb2xzVHlwZXMpLFxuICAgIHJlZmVyZW5jZTogZ2V0VHJhbnNhY3Rpb25SZWZlcmVuY2UodGRzLCB0cmFuc2FjdGlvbnNDb2xzVHlwZXMpLFxuICAgIGRlYml0OiBnZXRUcmFuc2FjdGlvbkRlYml0KHRkcywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzKSxcbiAgICBjcmVkaXQ6IGdldFRyYW5zYWN0aW9uQ3JlZGl0KHRkcywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzKSxcbiAgfTtcblxuICByZXR1cm4gaXRlbTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25zQ29sc1R5cGVDbGFzc2VzKFxuICBwYWdlOiBQYWdlIHwgRnJhbWUsXG4gIHRhYmxlTG9jYXRvcjogc3RyaW5nLFxuKTogUHJvbWlzZTxUcmFuc2FjdGlvbnNDb2xzVHlwZXM+IHtcbiAgY29uc3QgcmVzdWx0OiBUcmFuc2FjdGlvbnNDb2xzVHlwZXMgPSB7fTtcbiAgY29uc3QgdHlwZUNsYXNzZXNPYmpzID0gYXdhaXQgcGFnZUV2YWxBbGwocGFnZSwgYCR7dGFibGVMb2NhdG9yfSB0Ym9keSB0cjpmaXJzdC1vZi10eXBlIHRkYCwgbnVsbCwgdGRzID0+IHtcbiAgICByZXR1cm4gdGRzLm1hcCgodGQsIGluZGV4KSA9PiAoe1xuICAgICAgY29sQ2xhc3M6IHRkLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSxcbiAgICAgIGluZGV4LFxuICAgIH0pKTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCB0eXBlQ2xhc3NPYmogb2YgdHlwZUNsYXNzZXNPYmpzKSB7XG4gICAgaWYgKHR5cGVDbGFzc09iai5jb2xDbGFzcykge1xuICAgICAgcmVzdWx0W3R5cGVDbGFzc09iai5jb2xDbGFzc10gPSB0eXBlQ2xhc3NPYmouaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RUcmFuc2FjdGlvbihcbiAgdHhuczogU2NyYXBlZFRyYW5zYWN0aW9uW10sXG4gIHRyYW5zYWN0aW9uU3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzLFxuICB0eG5Sb3c6IFRyYW5zYWN0aW9uc1RyLFxuICB0cmFuc2FjdGlvbnNDb2xzVHlwZXM6IFRyYW5zYWN0aW9uc0NvbHNUeXBlcyxcbikge1xuICBjb25zdCB0eG4gPSBleHRyYWN0VHJhbnNhY3Rpb25EZXRhaWxzKHR4blJvdywgdHJhbnNhY3Rpb25TdGF0dXMsIHRyYW5zYWN0aW9uc0NvbHNUeXBlcyk7XG4gIGlmICh0eG4uZGF0ZSAhPT0gJycpIHtcbiAgICB0eG5zLnB1c2godHhuKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0VHJhbnNhY3Rpb25zKHBhZ2U6IFBhZ2UgfCBGcmFtZSwgdGFibGVMb2NhdG9yOiBzdHJpbmcsIHRyYW5zYWN0aW9uU3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1c2VzKSB7XG4gIGNvbnN0IHR4bnM6IFNjcmFwZWRUcmFuc2FjdGlvbltdID0gW107XG4gIGNvbnN0IHRyYW5zYWN0aW9uc0NvbHNUeXBlcyA9IGF3YWl0IGdldFRyYW5zYWN0aW9uc0NvbHNUeXBlQ2xhc3NlcyhwYWdlLCB0YWJsZUxvY2F0b3IpO1xuXG4gIGNvbnN0IHRyYW5zYWN0aW9uc1Jvd3MgPSBhd2FpdCBwYWdlRXZhbEFsbDxUcmFuc2FjdGlvbnNUcltdPihwYWdlLCBgJHt0YWJsZUxvY2F0b3J9IHRib2R5IHRyYCwgW10sIHRycyA9PiB7XG4gICAgcmV0dXJuIHRycy5tYXAodHIgPT4gKHtcbiAgICAgIGlubmVyVGRzOiBBcnJheS5mcm9tKHRyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0ZCcpKS5tYXAodGQgPT4gdGQuaW5uZXJUZXh0KSxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgdHhuUm93IG9mIHRyYW5zYWN0aW9uc1Jvd3MpIHtcbiAgICBleHRyYWN0VHJhbnNhY3Rpb24odHhucywgdHJhbnNhY3Rpb25TdGF0dXMsIHR4blJvdywgdHJhbnNhY3Rpb25zQ29sc1R5cGVzKTtcbiAgfVxuICByZXR1cm4gdHhucztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNOb1RyYW5zYWN0aW9uSW5EYXRlUmFuZ2VFcnJvcihwYWdlOiBQYWdlIHwgRnJhbWUpIHtcbiAgY29uc3QgaGFzRXJyb3JJbmZvRWxlbWVudCA9IGF3YWl0IGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsIGAuJHtFUlJPUl9NRVNTQUdFX0NMQVNTfWApO1xuICBpZiAoaGFzRXJyb3JJbmZvRWxlbWVudCkge1xuICAgIGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHBhZ2UuJGV2YWwoYC4ke0VSUk9SX01FU1NBR0VfQ0xBU1N9YCwgZXJyb3JFbGVtZW50ID0+IHtcbiAgICAgIHJldHVybiAoZXJyb3JFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGVycm9yVGV4dC50cmltKCkgPT09IE5PX1RSQU5TQUNUSU9OX0lOX0RBVEVfUkFOR0VfVEVYVDtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNlYXJjaEJ5RGF0ZXMocGFnZTogUGFnZSB8IEZyYW1lLCBzdGFydERhdGU6IE1vbWVudCkge1xuICBhd2FpdCBjbGlja0J1dHRvbihwYWdlLCAnYSN0YWJIZWFkZXI0Jyk7XG4gIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZChwYWdlLCAnZGl2I2ZpYmlfZGF0ZXMnKTtcbiAgYXdhaXQgZmlsbElucHV0KHBhZ2UsICdpbnB1dCNmcm9tRGF0ZScsIHN0YXJ0RGF0ZS5mb3JtYXQoREFURV9GT1JNQVQpKTtcbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgYGJ1dHRvbltjbGFzcyo9JHtDTE9TRV9TRUFSQ0hfQllfREFURVNfQlVUVE9OX0NMQVNTfV1gKTtcbiAgYXdhaXQgY2xpY2tCdXR0b24ocGFnZSwgYGlucHV0W3ZhbHVlPSR7U0hPV19TRUFSQ0hfQllfREFURVNfQlVUVE9OX1ZBTFVFfV1gKTtcbiAgYXdhaXQgd2FpdEZvck5hdmlnYXRpb24ocGFnZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnROdW1iZXIocGFnZTogUGFnZSB8IEZyYW1lKSB7XG4gIGNvbnN0IHNlbGVjdGVkU25pZkFjY291bnQgPSBhd2FpdCBwYWdlLiRldmFsKEFDQ09VTlRTX05VTUJFUiwgb3B0aW9uID0+IHtcbiAgICByZXR1cm4gKG9wdGlvbiBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICB9KTtcblxuICByZXR1cm4gc2VsZWN0ZWRTbmlmQWNjb3VudC5yZXBsYWNlKCcvJywgJ18nKS50cmltKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrSWZIYXNOZXh0UGFnZShwYWdlOiBQYWdlIHwgRnJhbWUpIHtcbiAgcmV0dXJuIGVsZW1lbnRQcmVzZW50T25QYWdlKHBhZ2UsIE5FWFRfUEFHRV9MSU5LKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbmF2aWdhdGVUb05leHRQYWdlKHBhZ2U6IFBhZ2UgfCBGcmFtZSkge1xuICBhd2FpdCBjbGlja0J1dHRvbihwYWdlLCBORVhUX1BBR0VfTElOSyk7XG4gIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHBhZ2UpO1xufVxuXG4vKiBDb3VsZG4ndCByZXByb2R1Y2Ugc2NlbmFyaW8gd2l0aCBtdWx0aXBsZSBwYWdlcyBvZiBwZW5kaW5nIHRyYW5zYWN0aW9ucyAtIFNob3VsZCBzdXBwb3J0IGlmIGV4aXN0cyBzdWNoIGNhc2UuXG4gICBuZWVkVG9QYWdpbmF0ZSBpcyBmYWxzZSBpZiBzY3JhcGluZyBwZW5kaW5nIHRyYW5zYWN0aW9ucyAqL1xuYXN5bmMgZnVuY3Rpb24gc2NyYXBlVHJhbnNhY3Rpb25zKFxuICBwYWdlOiBQYWdlIHwgRnJhbWUsXG4gIHRhYmxlTG9jYXRvcjogc3RyaW5nLFxuICB0cmFuc2FjdGlvblN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXNlcyxcbiAgbmVlZFRvUGFnaW5hdGU6IGJvb2xlYW4sXG4pIHtcbiAgY29uc3QgdHhucyA9IFtdO1xuICBsZXQgaGFzTmV4dFBhZ2UgPSBmYWxzZTtcblxuICBkbyB7XG4gICAgY29uc3QgY3VycmVudFBhZ2VUeG5zID0gYXdhaXQgZXh0cmFjdFRyYW5zYWN0aW9ucyhwYWdlLCB0YWJsZUxvY2F0b3IsIHRyYW5zYWN0aW9uU3RhdHVzKTtcbiAgICB0eG5zLnB1c2goLi4uY3VycmVudFBhZ2VUeG5zKTtcbiAgICBpZiAobmVlZFRvUGFnaW5hdGUpIHtcbiAgICAgIGhhc05leHRQYWdlID0gYXdhaXQgY2hlY2tJZkhhc05leHRQYWdlKHBhZ2UpO1xuICAgICAgaWYgKGhhc05leHRQYWdlKSB7XG4gICAgICAgIGF3YWl0IG5hdmlnYXRlVG9OZXh0UGFnZShwYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gd2hpbGUgKGhhc05leHRQYWdlKTtcblxuICByZXR1cm4gY29udmVydFRyYW5zYWN0aW9ucyh0eG5zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWNjb3VudFRyYW5zYWN0aW9ucyhwYWdlOiBQYWdlIHwgRnJhbWUpIHtcbiAgYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgXCJkaXZbaWQqPSdkaXZUYWJsZSddXCIsIGZhbHNlKSxcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgYC4ke0VSUk9SX01FU1NBR0VfQ0xBU1N9YCwgZmFsc2UpLFxuICBdKTtcblxuICBjb25zdCBub1RyYW5zYWN0aW9uSW5SYW5nZUVycm9yID0gYXdhaXQgaXNOb1RyYW5zYWN0aW9uSW5EYXRlUmFuZ2VFcnJvcihwYWdlKTtcbiAgaWYgKG5vVHJhbnNhY3Rpb25JblJhbmdlRXJyb3IpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBwZW5kaW5nVHhucyA9IGF3YWl0IHNjcmFwZVRyYW5zYWN0aW9ucyhwYWdlLCBQRU5ESU5HX1RSQU5TQUNUSU9OU19UQUJMRSwgVHJhbnNhY3Rpb25TdGF0dXNlcy5QZW5kaW5nLCBmYWxzZSk7XG4gIGNvbnN0IGNvbXBsZXRlZFR4bnMgPSBhd2FpdCBzY3JhcGVUcmFuc2FjdGlvbnMoXG4gICAgcGFnZSxcbiAgICBDT01QTEVURURfVFJBTlNBQ1RJT05TX1RBQkxFLFxuICAgIFRyYW5zYWN0aW9uU3RhdHVzZXMuQ29tcGxldGVkLFxuICAgIHRydWUsXG4gICk7XG4gIGNvbnN0IHR4bnMgPSBbLi4ucGVuZGluZ1R4bnMsIC4uLmNvbXBsZXRlZFR4bnNdO1xuICByZXR1cm4gdHhucztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudEJhbGFuY2UocGFnZTogUGFnZSB8IEZyYW1lKSB7XG4gIGNvbnN0IGJhbGFuY2VFbGVtZW50ID0gYXdhaXQgcGFnZS4kKENVUlJFTlRfQkFMQU5DRSk7XG4gIGlmICghYmFsYW5jZUVsZW1lbnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGJhbGFuY2VTdHIgPSBhd2FpdCBiYWxhbmNlRWxlbWVudC5ldmFsdWF0ZShvcHRpb24gPT4ge1xuICAgIHJldHVybiAob3B0aW9uIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gIH0pO1xuICByZXR1cm4gZ2V0QW1vdW50RGF0YShiYWxhbmNlU3RyKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JQb3N0TG9naW4ocGFnZTogUGFnZSkge1xuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJyNjYXJkLWhlYWRlcicsIHRydWUpLCAvLyBOZXcgVUlcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJyNhY2NvdW50X251bScsIHRydWUpLCAvLyBOZXcgVUlcbiAgICB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJyNtYXRhZkxvZ291dExpbmsnLCB0cnVlKSwgLy8gT2xkIFVJXG4gICAgd2FpdFVudGlsRWxlbWVudEZvdW5kKHBhZ2UsICcjdmFsaWRhdGlvbk1zZycsIHRydWUpLCAvLyBPbGQgVUlcbiAgXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQWNjb3VudERhdGEocGFnZTogUGFnZSB8IEZyYW1lLCBzdGFydERhdGU6IE1vbWVudCkge1xuICBjb25zdCBhY2NvdW50TnVtYmVyID0gYXdhaXQgZ2V0QWNjb3VudE51bWJlcihwYWdlKTtcbiAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGdldEN1cnJlbnRCYWxhbmNlKHBhZ2UpO1xuICBhd2FpdCBzZWFyY2hCeURhdGVzKHBhZ2UsIHN0YXJ0RGF0ZSk7XG4gIGNvbnN0IHR4bnMgPSBhd2FpdCBnZXRBY2NvdW50VHJhbnNhY3Rpb25zKHBhZ2UpO1xuXG4gIHJldHVybiB7XG4gICAgYWNjb3VudE51bWJlcixcbiAgICB0eG5zLFxuICAgIGJhbGFuY2UsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnRJZHNPbGRVSShwYWdlOiBQYWdlKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICByZXR1cm4gcGFnZS5ldmFsdWF0ZSgoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2NvdW50X251bV9zZWxlY3QnKTtcbiAgICBjb25zdCBvcHRpb25zID0gc2VsZWN0RWxlbWVudCA/IHNlbGVjdEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uJykgOiBbXTtcbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybiBbXTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShvcHRpb25zLCBvcHRpb24gPT4gb3B0aW9uLnZhbHVlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgYWNjb3VudCBkcm9wZG93biBpcyBvcGVuLCB0aGVuIHJldHVybnMgdGhlIGF2YWlsYWJsZSBhY2NvdW50IGxhYmVscy5cbiAqXG4gKiBUaGlzIG1ldGhvZDpcbiAqIC0gQ2hlY2tzIGlmIHRoZSBkcm9wZG93biBpcyBhbHJlYWR5IG9wZW4uXG4gKiAtIElmIG5vdCBvcGVuLCBjbGlja3MgdGhlIGFjY291bnQgc2VsZWN0b3IgdG8gb3BlbiBpdC5cbiAqIC0gV2FpdHMgZm9yIHRoZSBkcm9wZG93biB0byByZW5kZXIuXG4gKiAtIEV4dHJhY3RzIGFuZCByZXR1cm5zIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBhY2NvdW50IGxhYmVscy5cbiAqXG4gKiBHcmFjZWZ1bCBoYW5kbGluZzpcbiAqIC0gSWYgYW55IGVycm9yIG9jY3VycyAoZS5nLiwgc2VsZWN0b3JzIG5vdCBmb3VuZCwgdGltaW5nIGlzc3VlcywgVUkgdmVyc2lvbiBjaGFuZ2VzKSxcbiAqICAgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gZW1wdHkgbGlzdC5cbiAqXG4gKiBAcGFyYW0gcGFnZSBQdXBwZXRlZXIgUGFnZSBvYmplY3QuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhdmFpbGFibGUgYWNjb3VudCBsYWJlbHMgKGUuZy4sIFtcIjEyNyB8IFhYWFgxXCIsIFwiMTI3IHwgWFhYWDJcIl0pLFxuICogICAgICAgICAgb3IgYW4gZW1wdHkgYXJyYXkgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGlja0FjY291bnRTZWxlY3RvckdldEFjY291bnRJZHMocGFnZTogUGFnZSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBhY2NvdW50U2VsZWN0b3IgPSAnZGl2LmN1cnJlbnQtYWNjb3VudCc7IC8vIERpcmVjdCBzZWxlY3RvciB0byBjbGlja2FibGUgZWxlbWVudFxuICAgIGNvbnN0IGRyb3Bkb3duUGFuZWxTZWxlY3RvciA9ICdkaXYubWF0LW1kYy1hdXRvY29tcGxldGUtcGFuZWwuYWNjb3VudC1zZWxlY3QtZGQnOyAvLyBUaGUgZHJvcGRvd24gbGlzdCBib3hcbiAgICBjb25zdCBvcHRpb25TZWxlY3RvciA9ICdtYXQtb3B0aW9uIC5tZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHQnOyAvLyBBY2NvdW50IG9wdGlvbiBsYWJlbHNcblxuICAgIC8vIENoZWNrIGlmIGRyb3Bkb3duIGlzIGFscmVhZHkgb3BlblxuICAgIGNvbnN0IGRyb3Bkb3duVmlzaWJsZSA9IGF3YWl0IHBhZ2VcbiAgICAgIC4kZXZhbChkcm9wZG93blBhbmVsU2VsZWN0b3IsIGVsID0+IHtcbiAgICAgICAgcmV0dXJuIGVsICYmIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5kaXNwbGF5ICE9PSAnbm9uZScgJiYgZWwub2Zmc2V0UGFyZW50ICE9PSBudWxsO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiBmYWxzZSk7IC8vIGNhdGNoIGlmIGRyb3Bkb3duIGlzIG5vdCBpbiB0aGUgRE9NIHlldFxuXG4gICAgaWYgKCFkcm9wZG93blZpc2libGUpIHtcbiAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKGFjY291bnRTZWxlY3RvciwgeyB2aXNpYmxlOiB0cnVlLCB0aW1lb3V0OiAxMDAwMCB9KTtcblxuICAgICAgLy8gQ2xpY2sgdGhlIGFjY291bnQgc2VsZWN0b3IgdG8gb3BlbiB0aGUgZHJvcGRvd25cbiAgICAgIGF3YWl0IGNsaWNrQnV0dG9uKHBhZ2UsIGFjY291bnRTZWxlY3Rvcik7XG5cbiAgICAgIC8vIFdhaXQgZm9yIHRoZSBkcm9wZG93biB0byBvcGVuXG4gICAgICBhd2FpdCBwYWdlLndhaXRGb3JTZWxlY3Rvcihkcm9wZG93blBhbmVsU2VsZWN0b3IsIHsgdmlzaWJsZTogdHJ1ZSwgdGltZW91dDogMTAwMDAgfSk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBhY2NvdW50IGxhYmVscyBmcm9tIHRoZSBkcm9wZG93biBvcHRpb25zXG4gICAgY29uc3QgYWNjb3VudExhYmVscyA9IGF3YWl0IHBhZ2UuJCRldmFsKG9wdGlvblNlbGVjdG9yLCBvcHRpb25zID0+IHtcbiAgICAgIHJldHVybiBvcHRpb25zLm1hcChvcHRpb24gPT4gb3B0aW9uLnRleHRDb250ZW50Py50cmltKCkgfHwgJycpLmZpbHRlcihsYWJlbCA9PiBsYWJlbCAhPT0gJycpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFjY291bnRMYWJlbHM7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFtdOyAvLyBHcmFjZWZ1bCBmYWxsYmFja1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnRJZHNCb3RoVUlzKHBhZ2U6IFBhZ2UpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGxldCBhY2NvdW50c0lkczogc3RyaW5nW10gPSBhd2FpdCBjbGlja0FjY291bnRTZWxlY3RvckdldEFjY291bnRJZHMocGFnZSk7XG4gIGlmIChhY2NvdW50c0lkcy5sZW5ndGggPT09IDApIHtcbiAgICBhY2NvdW50c0lkcyA9IGF3YWl0IGdldEFjY291bnRJZHNPbGRVSShwYWdlKTtcbiAgfVxuICByZXR1cm4gYWNjb3VudHNJZHM7XG59XG5cbi8qKlxuICogU2VsZWN0cyBhbiBhY2NvdW50IGZyb20gdGhlIGRyb3Bkb3duIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhY2NvdW50IGxhYmVsLlxuICpcbiAqIFRoaXMgbWV0aG9kOlxuICogLSBDbGlja3MgdGhlIGFjY291bnQgc2VsZWN0b3IgYnV0dG9uIHRvIG9wZW4gdGhlIGRyb3Bkb3duLlxuICogLSBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGFjY291bnQgbGFiZWxzLlxuICogLSBDaGVja3MgaWYgdGhlIHByb3ZpZGVkIGFjY291bnQgbGFiZWwgZXhpc3RzIGluIHRoZSBsaXN0LlxuICogLSBGaW5kcyBhbmQgY2xpY2tzIHRoZSBtYXRjaGluZyBhY2NvdW50IG9wdGlvbiBpZiBmb3VuZC5cbiAqXG4gKiBAcGFyYW0gcGFnZSBQdXBwZXRlZXIgUGFnZSBvYmplY3QuXG4gKiBAcGFyYW0gYWNjb3VudExhYmVsIFRoZSB0ZXh0IG9mIHRoZSBhY2NvdW50IHRvIHNlbGVjdCAoZS5nLiwgXCIxMjcgfCBYWFhYWFwiKS5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGFjY291bnQgb3B0aW9uIHdhcyBmb3VuZCBhbmQgY2xpY2tlZDsgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VsZWN0QWNjb3VudEZyb21Ecm9wZG93bihwYWdlOiBQYWdlLCBhY2NvdW50TGFiZWw6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBDYWxsIGNsaWNrQWNjb3VudFNlbGVjdG9yIHRvIGdldCB0aGUgYXZhaWxhYmxlIGFjY291bnRzIGFuZCBvcGVuIHRoZSBkcm9wZG93blxuICBjb25zdCBhdmFpbGFibGVBY2NvdW50cyA9IGF3YWl0IGNsaWNrQWNjb3VudFNlbGVjdG9yR2V0QWNjb3VudElkcyhwYWdlKTtcblxuICAvLyBDaGVjayBpZiB0aGUgYWNjb3VudCBsYWJlbCBleGlzdHMgaW4gdGhlIGF2YWlsYWJsZSBhY2NvdW50c1xuICBpZiAoIWF2YWlsYWJsZUFjY291bnRzLmluY2x1ZGVzKGFjY291bnRMYWJlbCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBXYWl0IGZvciB0aGUgZHJvcGRvd24gb3B0aW9ucyB0byBiZSByZW5kZXJlZFxuICBjb25zdCBvcHRpb25TZWxlY3RvciA9ICdtYXQtb3B0aW9uIC5tZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHQnO1xuICBhd2FpdCBwYWdlLndhaXRGb3JTZWxlY3RvcihvcHRpb25TZWxlY3RvciwgeyB0aW1lb3V0OiAzMDAwIH0pO1xuXG4gIC8vIFF1ZXJ5IGFsbCBtYXRjaGluZyBvcHRpb25zXG4gIGNvbnN0IGFjY291bnRPcHRpb25zID0gYXdhaXQgcGFnZS4kJChvcHRpb25TZWxlY3Rvcik7XG5cbiAgLy8gRmluZCBhbmQgY2xpY2sgdGhlIG9wdGlvbiBtYXRjaGluZyB0aGUgYWNjb3VudExhYmVsXG4gIGZvciAoY29uc3Qgb3B0aW9uIG9mIGFjY291bnRPcHRpb25zKSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoZWwgPT4gZWwudGV4dENvbnRlbnQ/LnRyaW0oKSwgb3B0aW9uKTtcblxuICAgIGlmICh0ZXh0ID09PSBhY2NvdW50TGFiZWwpIHtcbiAgICAgIGNvbnN0IG9wdGlvbkhhbmRsZSA9IGF3YWl0IG9wdGlvbi5ldmFsdWF0ZUhhbmRsZShlbCA9PiBlbCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICBhd2FpdCBwYWdlLmV2YWx1YXRlKChlbDogSFRNTEVsZW1lbnQpID0+IGVsLmNsaWNrKCksIG9wdGlvbkhhbmRsZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uc0ZyYW1lKHBhZ2U6IFBhZ2UpOiBQcm9taXNlPEZyYW1lIHwgbnVsbD4ge1xuICAvLyBUcnkgYSBmZXcgdGltZXMgdG8gZmluZCB0aGUgaWZyYW1lLCBhcyBpdCBtaWdodCBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgMzsgYXR0ZW1wdCsrKSB7XG4gICAgYXdhaXQgc2xlZXAoMjAwMCk7XG4gICAgY29uc3QgZnJhbWVzID0gcGFnZS5mcmFtZXMoKTtcbiAgICBjb25zdCB0YXJnZXRGcmFtZSA9IGZyYW1lcy5maW5kKGYgPT4gZi5uYW1lKCkgPT09IElGUkFNRV9OQU1FKTtcblxuICAgIGlmICh0YXJnZXRGcmFtZSkge1xuICAgICAgcmV0dXJuIHRhcmdldEZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZWxlY3RBY2NvdW50Qm90aFVJcyhwYWdlOiBQYWdlLCBhY2NvdW50SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhY2NvdW50U2VsZWN0ZWQgPSBhd2FpdCBzZWxlY3RBY2NvdW50RnJvbURyb3Bkb3duKHBhZ2UsIGFjY291bnRJZCk7XG4gIGlmICghYWNjb3VudFNlbGVjdGVkKSB7XG4gICAgLy8gT2xkIFVJIGZvcm1hdFxuICAgIGF3YWl0IHBhZ2Uuc2VsZWN0KCcjYWNjb3VudF9udW1fc2VsZWN0JywgYWNjb3VudElkKTtcbiAgICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQocGFnZSwgJyNhY2NvdW50X251bV9zZWxlY3QnLCB0cnVlKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFjY291bnREYXRhQm90aFVJcyhwYWdlOiBQYWdlLCBzdGFydERhdGU6IE1vbWVudCkge1xuICAvLyBUcnkgdG8gZ2V0IHRoZSBpZnJhbWUgZm9yIHRoZSBuZXcgVUlcbiAgY29uc3QgZnJhbWUgPSBhd2FpdCBnZXRUcmFuc2FjdGlvbnNGcmFtZShwYWdlKTtcblxuICAvLyBVc2UgdGhlIGZyYW1lIGlmIGF2YWlsYWJsZSAobmV3IFVJKSwgb3RoZXJ3aXNlIHVzZSB0aGUgcGFnZSBkaXJlY3RseSAob2xkIFVJKVxuICBjb25zdCB0YXJnZXRQYWdlID0gZnJhbWUgfHwgcGFnZTtcbiAgcmV0dXJuIGZldGNoQWNjb3VudERhdGEodGFyZ2V0UGFnZSwgc3RhcnREYXRlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBY2NvdW50cyhwYWdlOiBQYWdlLCBzdGFydERhdGU6IE1vbWVudCk6IFByb21pc2U8VHJhbnNhY3Rpb25zQWNjb3VudFtdPiB7XG4gIGNvbnN0IGFjY291bnRzSWRzID0gYXdhaXQgZ2V0QWNjb3VudElkc0JvdGhVSXMocGFnZSk7XG5cbiAgaWYgKGFjY291bnRzSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIEluIGNhc2UgYWNjb3VudHNJZHMgY291bGQgbm8gYmUgcGFyc2VkIGp1c3QgcmV0dXJuIHRoZSB0cmFuc2FjdGlvbnMgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBhY2NvdW50XG4gICAgY29uc3QgYWNjb3VudERhdGEgPSBhd2FpdCBmZXRjaEFjY291bnREYXRhQm90aFVJcyhwYWdlLCBzdGFydERhdGUpO1xuICAgIHJldHVybiBbYWNjb3VudERhdGFdO1xuICB9XG5cbiAgY29uc3QgYWNjb3VudHM6IFRyYW5zYWN0aW9uc0FjY291bnRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGFjY291bnRJZCBvZiBhY2NvdW50c0lkcykge1xuICAgIGF3YWl0IHNlbGVjdEFjY291bnRCb3RoVUlzKHBhZ2UsIGFjY291bnRJZCk7XG4gICAgY29uc3QgYWNjb3VudERhdGEgPSBhd2FpdCBmZXRjaEFjY291bnREYXRhQm90aFVJcyhwYWdlLCBzdGFydERhdGUpO1xuICAgIGFjY291bnRzLnB1c2goYWNjb3VudERhdGEpO1xuICB9XG5cbiAgcmV0dXJuIGFjY291bnRzO1xufVxuXG50eXBlIFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzID0geyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG5cbmNsYXNzIEJlaW5sZXVtaUdyb3VwQmFzZVNjcmFwZXIgZXh0ZW5kcyBCYXNlU2NyYXBlcldpdGhCcm93c2VyPFNjcmFwZXJTcGVjaWZpY0NyZWRlbnRpYWxzPiB7XG4gIEJBU0VfVVJMID0gJyc7XG5cbiAgTE9HSU5fVVJMID0gJyc7XG5cbiAgVFJBTlNBQ1RJT05TX1VSTCA9ICcnO1xuXG4gIGdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFsczogU2NyYXBlclNwZWNpZmljQ3JlZGVudGlhbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9naW5Vcmw6IGAke3RoaXMuTE9HSU5fVVJMfWAsXG4gICAgICBmaWVsZHM6IGNyZWF0ZUxvZ2luRmllbGRzKGNyZWRlbnRpYWxzKSxcbiAgICAgIHN1Ym1pdEJ1dHRvblNlbGVjdG9yOiAnI2NvbnRpbnVlQnRuJyxcbiAgICAgIHBvc3RBY3Rpb246IGFzeW5jICgpID0+IHdhaXRGb3JQb3N0TG9naW4odGhpcy5wYWdlKSxcbiAgICAgIHBvc3NpYmxlUmVzdWx0czogZ2V0UG9zc2libGVMb2dpblJlc3VsdHMoKSxcbiAgICAgIC8vIEhBQ0s6IEZvciBzb21lIHJlYXNvbiwgdGhvdWdoIHRoZSBsb2dpbiBidXR0b24gKCNjb250aW51ZUJ0bikgaXMgcHJlc2VudCBhbmQgdmlzaWJsZSwgdGhlIGNsaWNrIGFjdGlvbiBkb2VzIG5vdCBwZXJmb3JtLlxuICAgICAgLy8gQWRkaW5nIHRoaXMgZGVsYXkgZml4ZXMgdGhlIGlzc3VlLlxuICAgICAgcHJlQWN0aW9uOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHNsZWVwKDEwMDApO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKCkge1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydE1vbWVudCA9IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFycycpLmFkZCgxLCAnZGF5Jyk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnRMaW1pdCA9IG1vbWVudCh7IHllYXI6IDE2MDAgfSk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5vcHRpb25zLnN0YXJ0RGF0ZSB8fCBkZWZhdWx0U3RhcnRNb21lbnQudG9EYXRlKCk7XG4gICAgY29uc3Qgc3RhcnRNb21lbnQgPSBtb21lbnQubWF4KHN0YXJ0TW9tZW50TGltaXQsIG1vbWVudChzdGFydERhdGUpKTtcblxuICAgIGF3YWl0IHRoaXMubmF2aWdhdGVUbyh0aGlzLlRSQU5TQUNUSU9OU19VUkwpO1xuXG4gICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBmZXRjaEFjY291bnRzKHRoaXMucGFnZSwgc3RhcnRNb21lbnQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhY2NvdW50cyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJlaW5sZXVtaUdyb3VwQmFzZVNjcmFwZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsVUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUscUJBQUEsR0FBQUYsT0FBQTtBQU9BLElBQUFHLFdBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFFBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLGFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLHVCQUFBLEdBQUFOLE9BQUE7QUFBOEcsU0FBQUQsdUJBQUFRLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFFOUcsTUFBTUcsV0FBVyxHQUFHLFlBQVk7QUFDaEMsTUFBTUMsaUNBQWlDLEdBQUcsOEJBQThCO0FBQ3hFLE1BQU1DLDJCQUEyQixHQUFHLFlBQVk7QUFDaEQsTUFBTUMseUJBQXlCLEdBQUcsWUFBWTtBQUM5QyxNQUFNQyxrQ0FBa0MsR0FBRyx1QkFBdUI7QUFDbEUsTUFBTUMsZ0NBQWdDLEdBQUcscUJBQXFCO0FBQzlELE1BQU1DLHNCQUFzQixHQUFHLFNBQVM7QUFDeEMsTUFBTUMsa0JBQWtCLEdBQUcsT0FBTztBQUNsQyxNQUFNQyxtQkFBbUIsR0FBRyxRQUFRO0FBQ3BDLE1BQU1DLG1CQUFtQixHQUFHLFNBQVM7QUFDckMsTUFBTUMsZUFBZSxHQUFHLCtCQUErQjtBQUN2RCxNQUFNQyxrQ0FBa0MsR0FBRyxxQkFBcUI7QUFDaEUsTUFBTUMsaUNBQWlDLEdBQUcsS0FBSztBQUMvQyxNQUFNQyw0QkFBNEIsR0FBRyxvQkFBb0I7QUFDekQsTUFBTUMsMEJBQTBCLEdBQUcsb0JBQW9CO0FBQ3ZELE1BQU1DLGNBQWMsR0FBRyxnQkFBZ0I7QUFDdkMsTUFBTUMsZUFBZSxHQUFHLGVBQWU7QUFDdkMsTUFBTUMsV0FBVyxHQUFHLGtCQUFrQjtBQWdCL0IsU0FBU0MsdUJBQXVCQSxDQUFBLEVBQXlCO0VBQzlELE1BQU1DLElBQTBCLEdBQUcsQ0FBQyxDQUFDO0VBQ3JDQSxJQUFJLENBQUNDLG9DQUFZLENBQUNDLE9BQU8sQ0FBQyxHQUFHLENBQzNCLHNCQUFzQjtFQUFFO0VBQ3hCLGtCQUFrQixDQUFFO0VBQUEsQ0FDckI7RUFDREYsSUFBSSxDQUFDQyxvQ0FBWSxDQUFDRSxlQUFlLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDO0VBQzNFLE9BQU9ILElBQUk7QUFDYjtBQUVPLFNBQVNJLGlCQUFpQkEsQ0FBQ0MsV0FBdUMsRUFBRTtFQUN6RSxPQUFPLENBQ0w7SUFBRUMsUUFBUSxFQUFFLFdBQVc7SUFBRUMsS0FBSyxFQUFFRixXQUFXLENBQUNHO0VBQVMsQ0FBQyxFQUN0RDtJQUFFRixRQUFRLEVBQUUsV0FBVztJQUFFQyxLQUFLLEVBQUVGLFdBQVcsQ0FBQ0k7RUFBUyxDQUFDLENBQ3ZEO0FBQ0g7QUFFQSxTQUFTQyxhQUFhQSxDQUFDQyxTQUFpQixFQUFFO0VBQ3hDLElBQUlDLGFBQWEsR0FBR0QsU0FBUyxDQUFDRSxPQUFPLENBQUNDLGlDQUFzQixFQUFFLEVBQUUsQ0FBQztFQUNqRUYsYUFBYSxHQUFHQSxhQUFhLENBQUNHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO0VBQ2pELE9BQU9DLFVBQVUsQ0FBQ0osYUFBYSxDQUFDO0FBQ2xDO0FBRUEsU0FBU0ssWUFBWUEsQ0FBQ0MsR0FBdUIsRUFBRTtFQUM3QyxNQUFNQyxNQUFNLEdBQUdULGFBQWEsQ0FBQ1EsR0FBRyxDQUFDQyxNQUFNLENBQUM7RUFDeEMsTUFBTUMsS0FBSyxHQUFHVixhQUFhLENBQUNRLEdBQUcsQ0FBQ0UsS0FBSyxDQUFDO0VBQ3RDLE9BQU8sQ0FBQ0MsTUFBTSxDQUFDQyxLQUFLLENBQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBR0EsTUFBTSxLQUFLRSxNQUFNLENBQUNDLEtBQUssQ0FBQ0YsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHQSxLQUFLLENBQUM7QUFDaEY7QUFFQSxTQUFTRyxtQkFBbUJBLENBQUNDLElBQTBCLEVBQWlCO0VBQ3RFLE9BQU9BLElBQUksQ0FBQ0MsR0FBRyxDQUFFUCxHQUFHLElBQWtCO0lBQ3BDLE1BQU1RLGFBQWEsR0FBRyxJQUFBQyxlQUFNLEVBQUNULEdBQUcsQ0FBQ1UsSUFBSSxFQUFFL0MsV0FBVyxDQUFDLENBQUNnRCxXQUFXLENBQUMsQ0FBQztJQUNqRSxNQUFNQyxlQUFlLEdBQUdiLFlBQVksQ0FBQ0MsR0FBRyxDQUFDO0lBQ3pDLE9BQU87TUFDTGEsSUFBSSxFQUFFQyw4QkFBZ0IsQ0FBQ0MsTUFBTTtNQUM3QkMsVUFBVSxFQUFFaEIsR0FBRyxDQUFDaUIsU0FBUyxHQUFHQyxRQUFRLENBQUNsQixHQUFHLENBQUNpQixTQUFTLEVBQUUsRUFBRSxDQUFDLEdBQUdFLFNBQVM7TUFDbkVULElBQUksRUFBRUYsYUFBYTtNQUNuQlksYUFBYSxFQUFFWixhQUFhO01BQzVCYSxjQUFjLEVBQUVULGVBQWU7TUFDL0JVLGdCQUFnQixFQUFFQywwQkFBZTtNQUNqQ0MsYUFBYSxFQUFFWixlQUFlO01BQzlCYSxNQUFNLEVBQUV6QixHQUFHLENBQUN5QixNQUFNO01BQ2xCQyxXQUFXLEVBQUUxQixHQUFHLENBQUMwQixXQUFXO01BQzVCQyxJQUFJLEVBQUUzQixHQUFHLENBQUMyQjtJQUNaLENBQUM7RUFDSCxDQUFDLENBQUM7QUFDSjtBQUVBLFNBQVNDLGtCQUFrQkEsQ0FDekJDLEdBQXNCLEVBQ3RCQyxlQUF1QixFQUN2QkMscUJBQTRDLEVBQzVDO0VBQ0EsSUFBSUQsZUFBZSxLQUFLLFdBQVcsRUFBRTtJQUNuQyxPQUFPLENBQUNELEdBQUcsQ0FBQ0UscUJBQXFCLENBQUNsRSwyQkFBMkIsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFbUUsSUFBSSxDQUFDLENBQUM7RUFDL0U7RUFDQSxPQUFPLENBQUNILEdBQUcsQ0FBQ0UscUJBQXFCLENBQUNqRSx5QkFBeUIsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFa0UsSUFBSSxDQUFDLENBQUM7QUFDN0U7QUFFQSxTQUFTQyx5QkFBeUJBLENBQ2hDSixHQUFzQixFQUN0QkMsZUFBdUIsRUFDdkJDLHFCQUE0QyxFQUM1QztFQUNBLElBQUlELGVBQWUsS0FBSyxXQUFXLEVBQUU7SUFDbkMsT0FBTyxDQUFDRCxHQUFHLENBQUNFLHFCQUFxQixDQUFDaEUsa0NBQWtDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRWlFLElBQUksQ0FBQyxDQUFDO0VBQ3RGO0VBQ0EsT0FBTyxDQUFDSCxHQUFHLENBQUNFLHFCQUFxQixDQUFDL0QsZ0NBQWdDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRWdFLElBQUksQ0FBQyxDQUFDO0FBQ3BGO0FBRUEsU0FBU0UsdUJBQXVCQSxDQUFDTCxHQUFzQixFQUFFRSxxQkFBNEMsRUFBRTtFQUNyRyxPQUFPLENBQUNGLEdBQUcsQ0FBQ0UscUJBQXFCLENBQUM5RCxzQkFBc0IsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFK0QsSUFBSSxDQUFDLENBQUM7QUFDMUU7QUFFQSxTQUFTRyxtQkFBbUJBLENBQUNOLEdBQXNCLEVBQUVFLHFCQUE0QyxFQUFFO0VBQ2pHLE9BQU8sQ0FBQ0YsR0FBRyxDQUFDRSxxQkFBcUIsQ0FBQzdELGtCQUFrQixDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU4RCxJQUFJLENBQUMsQ0FBQztBQUN0RTtBQUVBLFNBQVNJLG9CQUFvQkEsQ0FBQ1AsR0FBc0IsRUFBRUUscUJBQTRDLEVBQUU7RUFDbEcsT0FBTyxDQUFDRixHQUFHLENBQUNFLHFCQUFxQixDQUFDNUQsbUJBQW1CLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTZELElBQUksQ0FBQyxDQUFDO0FBQ3ZFO0FBRUEsU0FBU0sseUJBQXlCQSxDQUNoQ0MsTUFBc0IsRUFDdEJDLGlCQUFzQyxFQUN0Q1IscUJBQTRDLEVBQ3hCO0VBQ3BCLE1BQU1GLEdBQUcsR0FBR1MsTUFBTSxDQUFDRSxRQUFRO0VBQzNCLE1BQU1DLElBQUksR0FBRztJQUNYaEIsTUFBTSxFQUFFYyxpQkFBaUI7SUFDekI3QixJQUFJLEVBQUVrQixrQkFBa0IsQ0FBQ0MsR0FBRyxFQUFFVSxpQkFBaUIsRUFBRVIscUJBQXFCLENBQUM7SUFDdkVMLFdBQVcsRUFBRU8seUJBQXlCLENBQUNKLEdBQUcsRUFBRVUsaUJBQWlCLEVBQUVSLHFCQUFxQixDQUFDO0lBQ3JGZCxTQUFTLEVBQUVpQix1QkFBdUIsQ0FBQ0wsR0FBRyxFQUFFRSxxQkFBcUIsQ0FBQztJQUM5RDdCLEtBQUssRUFBRWlDLG1CQUFtQixDQUFDTixHQUFHLEVBQUVFLHFCQUFxQixDQUFDO0lBQ3REOUIsTUFBTSxFQUFFbUMsb0JBQW9CLENBQUNQLEdBQUcsRUFBRUUscUJBQXFCO0VBQ3pELENBQUM7RUFFRCxPQUFPVSxJQUFJO0FBQ2I7QUFFQSxlQUFlQyw4QkFBOEJBLENBQzNDQyxJQUFrQixFQUNsQkMsWUFBb0IsRUFDWTtFQUNoQyxNQUFNQyxNQUE2QixHQUFHLENBQUMsQ0FBQztFQUN4QyxNQUFNQyxlQUFlLEdBQUcsTUFBTSxJQUFBQyxpQ0FBVyxFQUFDSixJQUFJLEVBQUUsR0FBR0MsWUFBWSw0QkFBNEIsRUFBRSxJQUFJLEVBQUVmLEdBQUcsSUFBSTtJQUN4RyxPQUFPQSxHQUFHLENBQUN0QixHQUFHLENBQUMsQ0FBQ3lDLEVBQUUsRUFBRUMsS0FBSyxNQUFNO01BQzdCQyxRQUFRLEVBQUVGLEVBQUUsQ0FBQ0csWUFBWSxDQUFDLE9BQU8sQ0FBQztNQUNsQ0Y7SUFDRixDQUFDLENBQUMsQ0FBQztFQUNMLENBQUMsQ0FBQztFQUVGLEtBQUssTUFBTUcsWUFBWSxJQUFJTixlQUFlLEVBQUU7SUFDMUMsSUFBSU0sWUFBWSxDQUFDRixRQUFRLEVBQUU7TUFDekJMLE1BQU0sQ0FBQ08sWUFBWSxDQUFDRixRQUFRLENBQUMsR0FBR0UsWUFBWSxDQUFDSCxLQUFLO0lBQ3BEO0VBQ0Y7RUFDQSxPQUFPSixNQUFNO0FBQ2Y7QUFFQSxTQUFTUSxrQkFBa0JBLENBQ3pCL0MsSUFBMEIsRUFDMUJpQyxpQkFBc0MsRUFDdENELE1BQXNCLEVBQ3RCUCxxQkFBNEMsRUFDNUM7RUFDQSxNQUFNL0IsR0FBRyxHQUFHcUMseUJBQXlCLENBQUNDLE1BQU0sRUFBRUMsaUJBQWlCLEVBQUVSLHFCQUFxQixDQUFDO0VBQ3ZGLElBQUkvQixHQUFHLENBQUNVLElBQUksS0FBSyxFQUFFLEVBQUU7SUFDbkJKLElBQUksQ0FBQ2dELElBQUksQ0FBQ3RELEdBQUcsQ0FBQztFQUNoQjtBQUNGO0FBRUEsZUFBZXVELG1CQUFtQkEsQ0FBQ1osSUFBa0IsRUFBRUMsWUFBb0IsRUFBRUwsaUJBQXNDLEVBQUU7RUFDbkgsTUFBTWpDLElBQTBCLEdBQUcsRUFBRTtFQUNyQyxNQUFNeUIscUJBQXFCLEdBQUcsTUFBTVcsOEJBQThCLENBQUNDLElBQUksRUFBRUMsWUFBWSxDQUFDO0VBRXRGLE1BQU1ZLGdCQUFnQixHQUFHLE1BQU0sSUFBQVQsaUNBQVcsRUFBbUJKLElBQUksRUFBRSxHQUFHQyxZQUFZLFdBQVcsRUFBRSxFQUFFLEVBQUVhLEdBQUcsSUFBSTtJQUN4RyxPQUFPQSxHQUFHLENBQUNsRCxHQUFHLENBQUNtRCxFQUFFLEtBQUs7TUFDcEJsQixRQUFRLEVBQUVtQixLQUFLLENBQUNDLElBQUksQ0FBQ0YsRUFBRSxDQUFDRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDdEQsR0FBRyxDQUFDeUMsRUFBRSxJQUFJQSxFQUFFLENBQUNjLFNBQVM7SUFDNUUsQ0FBQyxDQUFDLENBQUM7RUFDTCxDQUFDLENBQUM7RUFFRixLQUFLLE1BQU14QixNQUFNLElBQUlrQixnQkFBZ0IsRUFBRTtJQUNyQ0gsa0JBQWtCLENBQUMvQyxJQUFJLEVBQUVpQyxpQkFBaUIsRUFBRUQsTUFBTSxFQUFFUCxxQkFBcUIsQ0FBQztFQUM1RTtFQUNBLE9BQU96QixJQUFJO0FBQ2I7QUFFQSxlQUFleUQsK0JBQStCQSxDQUFDcEIsSUFBa0IsRUFBRTtFQUNqRSxNQUFNcUIsbUJBQW1CLEdBQUcsTUFBTSxJQUFBQywwQ0FBb0IsRUFBQ3RCLElBQUksRUFBRSxJQUFJdkUsbUJBQW1CLEVBQUUsQ0FBQztFQUN2RixJQUFJNEYsbUJBQW1CLEVBQUU7SUFDdkIsTUFBTUUsU0FBUyxHQUFHLE1BQU12QixJQUFJLENBQUN3QixLQUFLLENBQUMsSUFBSS9GLG1CQUFtQixFQUFFLEVBQUVnRyxZQUFZLElBQUk7TUFDNUUsT0FBUUEsWUFBWSxDQUFpQk4sU0FBUztJQUNoRCxDQUFDLENBQUM7SUFDRixPQUFPSSxTQUFTLENBQUNsQyxJQUFJLENBQUMsQ0FBQyxLQUFLcEUsaUNBQWlDO0VBQy9EO0VBQ0EsT0FBTyxLQUFLO0FBQ2Q7QUFFQSxlQUFleUcsYUFBYUEsQ0FBQzFCLElBQWtCLEVBQUUyQixTQUFpQixFQUFFO0VBQ2xFLE1BQU0sSUFBQUMsaUNBQVcsRUFBQzVCLElBQUksRUFBRSxjQUFjLENBQUM7RUFDdkMsTUFBTSxJQUFBNkIsMkNBQXFCLEVBQUM3QixJQUFJLEVBQUUsZ0JBQWdCLENBQUM7RUFDbkQsTUFBTSxJQUFBOEIsK0JBQVMsRUFBQzlCLElBQUksRUFBRSxnQkFBZ0IsRUFBRTJCLFNBQVMsQ0FBQ0ksTUFBTSxDQUFDL0csV0FBVyxDQUFDLENBQUM7RUFDdEUsTUFBTSxJQUFBNEcsaUNBQVcsRUFBQzVCLElBQUksRUFBRSxpQkFBaUJyRSxrQ0FBa0MsR0FBRyxDQUFDO0VBQy9FLE1BQU0sSUFBQWlHLGlDQUFXLEVBQUM1QixJQUFJLEVBQUUsZUFBZXBFLGlDQUFpQyxHQUFHLENBQUM7RUFDNUUsTUFBTSxJQUFBb0csNkJBQWlCLEVBQUNoQyxJQUFJLENBQUM7QUFDL0I7QUFFQSxlQUFlaUMsZ0JBQWdCQSxDQUFDakMsSUFBa0IsRUFBRTtFQUNsRCxNQUFNa0MsbUJBQW1CLEdBQUcsTUFBTWxDLElBQUksQ0FBQ3dCLEtBQUssQ0FBQzlGLGVBQWUsRUFBRXlHLE1BQU0sSUFBSTtJQUN0RSxPQUFRQSxNQUFNLENBQWlCaEIsU0FBUztFQUMxQyxDQUFDLENBQUM7RUFFRixPQUFPZSxtQkFBbUIsQ0FBQ2xGLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUNxQyxJQUFJLENBQUMsQ0FBQztBQUNyRDtBQUVBLGVBQWUrQyxrQkFBa0JBLENBQUNwQyxJQUFrQixFQUFFO0VBQ3BELE9BQU8sSUFBQXNCLDBDQUFvQixFQUFDdEIsSUFBSSxFQUFFakUsY0FBYyxDQUFDO0FBQ25EO0FBRUEsZUFBZXNHLGtCQUFrQkEsQ0FBQ3JDLElBQWtCLEVBQUU7RUFDcEQsTUFBTSxJQUFBNEIsaUNBQVcsRUFBQzVCLElBQUksRUFBRWpFLGNBQWMsQ0FBQztFQUN2QyxNQUFNLElBQUFpRyw2QkFBaUIsRUFBQ2hDLElBQUksQ0FBQztBQUMvQjs7QUFFQTtBQUNBO0FBQ0EsZUFBZXNDLGtCQUFrQkEsQ0FDL0J0QyxJQUFrQixFQUNsQkMsWUFBb0IsRUFDcEJMLGlCQUFzQyxFQUN0QzJDLGNBQXVCLEVBQ3ZCO0VBQ0EsTUFBTTVFLElBQUksR0FBRyxFQUFFO0VBQ2YsSUFBSTZFLFdBQVcsR0FBRyxLQUFLO0VBRXZCLEdBQUc7SUFDRCxNQUFNQyxlQUFlLEdBQUcsTUFBTTdCLG1CQUFtQixDQUFDWixJQUFJLEVBQUVDLFlBQVksRUFBRUwsaUJBQWlCLENBQUM7SUFDeEZqQyxJQUFJLENBQUNnRCxJQUFJLENBQUMsR0FBRzhCLGVBQWUsQ0FBQztJQUM3QixJQUFJRixjQUFjLEVBQUU7TUFDbEJDLFdBQVcsR0FBRyxNQUFNSixrQkFBa0IsQ0FBQ3BDLElBQUksQ0FBQztNQUM1QyxJQUFJd0MsV0FBVyxFQUFFO1FBQ2YsTUFBTUgsa0JBQWtCLENBQUNyQyxJQUFJLENBQUM7TUFDaEM7SUFDRjtFQUNGLENBQUMsUUFBUXdDLFdBQVc7RUFFcEIsT0FBTzlFLG1CQUFtQixDQUFDQyxJQUFJLENBQUM7QUFDbEM7QUFFQSxlQUFlK0Usc0JBQXNCQSxDQUFDMUMsSUFBa0IsRUFBRTtFQUN4RCxNQUFNMkMsT0FBTyxDQUFDQyxJQUFJLENBQUMsQ0FDakIsSUFBQWYsMkNBQXFCLEVBQUM3QixJQUFJLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxDQUFDLEVBQ3pELElBQUE2QiwyQ0FBcUIsRUFBQzdCLElBQUksRUFBRSxJQUFJdkUsbUJBQW1CLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FDOUQsQ0FBQztFQUVGLE1BQU1vSCx5QkFBeUIsR0FBRyxNQUFNekIsK0JBQStCLENBQUNwQixJQUFJLENBQUM7RUFDN0UsSUFBSTZDLHlCQUF5QixFQUFFO0lBQzdCLE9BQU8sRUFBRTtFQUNYO0VBRUEsTUFBTUMsV0FBVyxHQUFHLE1BQU1SLGtCQUFrQixDQUFDdEMsSUFBSSxFQUFFbEUsMEJBQTBCLEVBQUVpSCxpQ0FBbUIsQ0FBQ0MsT0FBTyxFQUFFLEtBQUssQ0FBQztFQUNsSCxNQUFNQyxhQUFhLEdBQUcsTUFBTVgsa0JBQWtCLENBQzVDdEMsSUFBSSxFQUNKbkUsNEJBQTRCLEVBQzVCa0gsaUNBQW1CLENBQUNHLFNBQVMsRUFDN0IsSUFDRixDQUFDO0VBQ0QsTUFBTXZGLElBQUksR0FBRyxDQUFDLEdBQUdtRixXQUFXLEVBQUUsR0FBR0csYUFBYSxDQUFDO0VBQy9DLE9BQU90RixJQUFJO0FBQ2I7QUFFQSxlQUFld0YsaUJBQWlCQSxDQUFDbkQsSUFBa0IsRUFBRTtFQUNuRCxNQUFNb0QsY0FBYyxHQUFHLE1BQU1wRCxJQUFJLENBQUNxRCxDQUFDLENBQUNySCxlQUFlLENBQUM7RUFDcEQsSUFBSSxDQUFDb0gsY0FBYyxFQUFFO0lBQ25CLE9BQU81RSxTQUFTO0VBQ2xCO0VBQ0EsTUFBTThFLFVBQVUsR0FBRyxNQUFNRixjQUFjLENBQUNHLFFBQVEsQ0FBQ3BCLE1BQU0sSUFBSTtJQUN6RCxPQUFRQSxNQUFNLENBQWlCaEIsU0FBUztFQUMxQyxDQUFDLENBQUM7RUFDRixPQUFPdEUsYUFBYSxDQUFDeUcsVUFBVSxDQUFDO0FBQ2xDO0FBRU8sZUFBZUUsZ0JBQWdCQSxDQUFDeEQsSUFBVSxFQUFFO0VBQ2pELE9BQU8yQyxPQUFPLENBQUNDLElBQUksQ0FBQyxDQUNsQixJQUFBZiwyQ0FBcUIsRUFBQzdCLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDO0VBQUU7RUFDbkQsSUFBQTZCLDJDQUFxQixFQUFDN0IsSUFBSSxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUM7RUFBRTtFQUNuRCxJQUFBNkIsMkNBQXFCLEVBQUM3QixJQUFJLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDO0VBQUU7RUFDdkQsSUFBQTZCLDJDQUFxQixFQUFDN0IsSUFBSSxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFFO0VBQUEsQ0FDdEQsQ0FBQztBQUNKO0FBRUEsZUFBZXlELGdCQUFnQkEsQ0FBQ3pELElBQWtCLEVBQUUyQixTQUFpQixFQUFFO0VBQ3JFLE1BQU0rQixhQUFhLEdBQUcsTUFBTXpCLGdCQUFnQixDQUFDakMsSUFBSSxDQUFDO0VBQ2xELE1BQU0yRCxPQUFPLEdBQUcsTUFBTVIsaUJBQWlCLENBQUNuRCxJQUFJLENBQUM7RUFDN0MsTUFBTTBCLGFBQWEsQ0FBQzFCLElBQUksRUFBRTJCLFNBQVMsQ0FBQztFQUNwQyxNQUFNaEUsSUFBSSxHQUFHLE1BQU0rRSxzQkFBc0IsQ0FBQzFDLElBQUksQ0FBQztFQUUvQyxPQUFPO0lBQ0wwRCxhQUFhO0lBQ2IvRixJQUFJO0lBQ0pnRztFQUNGLENBQUM7QUFDSDtBQUVBLGVBQWVDLGtCQUFrQkEsQ0FBQzVELElBQVUsRUFBcUI7RUFDL0QsT0FBT0EsSUFBSSxDQUFDdUQsUUFBUSxDQUFDLE1BQU07SUFDekIsTUFBTU0sYUFBYSxHQUFHQyxRQUFRLENBQUNDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQztJQUNuRSxNQUFNQyxPQUFPLEdBQUdILGFBQWEsR0FBR0EsYUFBYSxDQUFDSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFO0lBQzdFLElBQUksQ0FBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRTtJQUN2QixPQUFPaEQsS0FBSyxDQUFDQyxJQUFJLENBQUMrQyxPQUFPLEVBQUU3QixNQUFNLElBQUlBLE1BQU0sQ0FBQ3pGLEtBQUssQ0FBQztFQUNwRCxDQUFDLENBQUM7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sZUFBZXdILGlDQUFpQ0EsQ0FBQ2xFLElBQVUsRUFBcUI7RUFDckYsSUFBSTtJQUNGLE1BQU1tRSxlQUFlLEdBQUcscUJBQXFCLENBQUMsQ0FBQztJQUMvQyxNQUFNQyxxQkFBcUIsR0FBRyxrREFBa0QsQ0FBQyxDQUFDO0lBQ2xGLE1BQU1DLGNBQWMsR0FBRyx5Q0FBeUMsQ0FBQyxDQUFDOztJQUVsRTtJQUNBLE1BQU1DLGVBQWUsR0FBRyxNQUFNdEUsSUFBSSxDQUMvQndCLEtBQUssQ0FBQzRDLHFCQUFxQixFQUFFRyxFQUFFLElBQUk7TUFDbEMsT0FBT0EsRUFBRSxJQUFJQyxNQUFNLENBQUNDLGdCQUFnQixDQUFDRixFQUFFLENBQUMsQ0FBQ0csT0FBTyxLQUFLLE1BQU0sSUFBSUgsRUFBRSxDQUFDSSxZQUFZLEtBQUssSUFBSTtJQUN6RixDQUFDLENBQUMsQ0FDREMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQzs7SUFFdkIsSUFBSSxDQUFDTixlQUFlLEVBQUU7TUFDcEIsTUFBTXRFLElBQUksQ0FBQzZFLGVBQWUsQ0FBQ1YsZUFBZSxFQUFFO1FBQUVXLE9BQU8sRUFBRSxJQUFJO1FBQUVDLE9BQU8sRUFBRTtNQUFNLENBQUMsQ0FBQzs7TUFFOUU7TUFDQSxNQUFNLElBQUFuRCxpQ0FBVyxFQUFDNUIsSUFBSSxFQUFFbUUsZUFBZSxDQUFDOztNQUV4QztNQUNBLE1BQU1uRSxJQUFJLENBQUM2RSxlQUFlLENBQUNULHFCQUFxQixFQUFFO1FBQUVVLE9BQU8sRUFBRSxJQUFJO1FBQUVDLE9BQU8sRUFBRTtNQUFNLENBQUMsQ0FBQztJQUN0Rjs7SUFFQTtJQUNBLE1BQU1DLGFBQWEsR0FBRyxNQUFNaEYsSUFBSSxDQUFDaUYsTUFBTSxDQUFDWixjQUFjLEVBQUVMLE9BQU8sSUFBSTtNQUNqRSxPQUFPQSxPQUFPLENBQUNwRyxHQUFHLENBQUN1RSxNQUFNLElBQUlBLE1BQU0sQ0FBQytDLFdBQVcsRUFBRTdGLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM4RixNQUFNLENBQUNDLEtBQUssSUFBSUEsS0FBSyxLQUFLLEVBQUUsQ0FBQztJQUM5RixDQUFDLENBQUM7SUFFRixPQUFPSixhQUFhO0VBQ3RCLENBQUMsQ0FBQyxPQUFPSyxLQUFLLEVBQUU7SUFDZCxPQUFPLEVBQUUsQ0FBQyxDQUFDO0VBQ2I7QUFDRjtBQUVBLGVBQWVDLG9CQUFvQkEsQ0FBQ3RGLElBQVUsRUFBcUI7RUFDakUsSUFBSXVGLFdBQXFCLEdBQUcsTUFBTXJCLGlDQUFpQyxDQUFDbEUsSUFBSSxDQUFDO0VBQ3pFLElBQUl1RixXQUFXLENBQUNDLE1BQU0sS0FBSyxDQUFDLEVBQUU7SUFDNUJELFdBQVcsR0FBRyxNQUFNM0Isa0JBQWtCLENBQUM1RCxJQUFJLENBQUM7RUFDOUM7RUFDQSxPQUFPdUYsV0FBVztBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGVBQWVFLHlCQUF5QkEsQ0FBQ3pGLElBQVUsRUFBRTBGLFlBQW9CLEVBQW9CO0VBQ2xHO0VBQ0EsTUFBTUMsaUJBQWlCLEdBQUcsTUFBTXpCLGlDQUFpQyxDQUFDbEUsSUFBSSxDQUFDOztFQUV2RTtFQUNBLElBQUksQ0FBQzJGLGlCQUFpQixDQUFDQyxRQUFRLENBQUNGLFlBQVksQ0FBQyxFQUFFO0lBQzdDLE9BQU8sS0FBSztFQUNkOztFQUVBO0VBQ0EsTUFBTXJCLGNBQWMsR0FBRyx5Q0FBeUM7RUFDaEUsTUFBTXJFLElBQUksQ0FBQzZFLGVBQWUsQ0FBQ1IsY0FBYyxFQUFFO0lBQUVVLE9BQU8sRUFBRTtFQUFLLENBQUMsQ0FBQzs7RUFFN0Q7RUFDQSxNQUFNYyxjQUFjLEdBQUcsTUFBTTdGLElBQUksQ0FBQzhGLEVBQUUsQ0FBQ3pCLGNBQWMsQ0FBQzs7RUFFcEQ7RUFDQSxLQUFLLE1BQU1sQyxNQUFNLElBQUkwRCxjQUFjLEVBQUU7SUFDbkMsTUFBTUUsSUFBSSxHQUFHLE1BQU0vRixJQUFJLENBQUN1RCxRQUFRLENBQUNnQixFQUFFLElBQUlBLEVBQUUsQ0FBQ1csV0FBVyxFQUFFN0YsSUFBSSxDQUFDLENBQUMsRUFBRThDLE1BQU0sQ0FBQztJQUV0RSxJQUFJNEQsSUFBSSxLQUFLTCxZQUFZLEVBQUU7TUFDekIsTUFBTU0sWUFBWSxHQUFHLE1BQU03RCxNQUFNLENBQUM4RCxjQUFjLENBQUMxQixFQUFFLElBQUlBLEVBQWlCLENBQUM7TUFDekUsTUFBTXZFLElBQUksQ0FBQ3VELFFBQVEsQ0FBRWdCLEVBQWUsSUFBS0EsRUFBRSxDQUFDMkIsS0FBSyxDQUFDLENBQUMsRUFBRUYsWUFBWSxDQUFDO01BQ2xFLE9BQU8sSUFBSTtJQUNiO0VBQ0Y7RUFFQSxPQUFPLEtBQUs7QUFDZDtBQUVBLGVBQWVHLG9CQUFvQkEsQ0FBQ25HLElBQVUsRUFBeUI7RUFDckU7RUFDQSxLQUFLLElBQUlvRyxPQUFPLEdBQUcsQ0FBQyxFQUFFQSxPQUFPLEdBQUcsQ0FBQyxFQUFFQSxPQUFPLEVBQUUsRUFBRTtJQUM1QyxNQUFNLElBQUFDLGNBQUssRUFBQyxJQUFJLENBQUM7SUFDakIsTUFBTUMsTUFBTSxHQUFHdEcsSUFBSSxDQUFDc0csTUFBTSxDQUFDLENBQUM7SUFDNUIsTUFBTUMsV0FBVyxHQUFHRCxNQUFNLENBQUNFLElBQUksQ0FBQ0MsQ0FBQyxJQUFJQSxDQUFDLENBQUNDLElBQUksQ0FBQyxDQUFDLEtBQUt6SyxXQUFXLENBQUM7SUFFOUQsSUFBSXNLLFdBQVcsRUFBRTtNQUNmLE9BQU9BLFdBQVc7SUFDcEI7RUFDRjtFQUVBLE9BQU8sSUFBSTtBQUNiO0FBRUEsZUFBZUksb0JBQW9CQSxDQUFDM0csSUFBVSxFQUFFNEcsU0FBaUIsRUFBaUI7RUFDaEYsTUFBTUMsZUFBZSxHQUFHLE1BQU1wQix5QkFBeUIsQ0FBQ3pGLElBQUksRUFBRTRHLFNBQVMsQ0FBQztFQUN4RSxJQUFJLENBQUNDLGVBQWUsRUFBRTtJQUNwQjtJQUNBLE1BQU03RyxJQUFJLENBQUM4RyxNQUFNLENBQUMscUJBQXFCLEVBQUVGLFNBQVMsQ0FBQztJQUNuRCxNQUFNLElBQUEvRSwyQ0FBcUIsRUFBQzdCLElBQUksRUFBRSxxQkFBcUIsRUFBRSxJQUFJLENBQUM7RUFDaEU7QUFDRjtBQUVBLGVBQWUrRyx1QkFBdUJBLENBQUMvRyxJQUFVLEVBQUUyQixTQUFpQixFQUFFO0VBQ3BFO0VBQ0EsTUFBTXFGLEtBQUssR0FBRyxNQUFNYixvQkFBb0IsQ0FBQ25HLElBQUksQ0FBQzs7RUFFOUM7RUFDQSxNQUFNaUgsVUFBVSxHQUFHRCxLQUFLLElBQUloSCxJQUFJO0VBQ2hDLE9BQU95RCxnQkFBZ0IsQ0FBQ3dELFVBQVUsRUFBRXRGLFNBQVMsQ0FBQztBQUNoRDtBQUVBLGVBQWV1RixhQUFhQSxDQUFDbEgsSUFBVSxFQUFFMkIsU0FBaUIsRUFBa0M7RUFDMUYsTUFBTTRELFdBQVcsR0FBRyxNQUFNRCxvQkFBb0IsQ0FBQ3RGLElBQUksQ0FBQztFQUVwRCxJQUFJdUYsV0FBVyxDQUFDQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0lBQzVCO0lBQ0EsTUFBTTJCLFdBQVcsR0FBRyxNQUFNSix1QkFBdUIsQ0FBQy9HLElBQUksRUFBRTJCLFNBQVMsQ0FBQztJQUNsRSxPQUFPLENBQUN3RixXQUFXLENBQUM7RUFDdEI7RUFFQSxNQUFNQyxRQUErQixHQUFHLEVBQUU7RUFDMUMsS0FBSyxNQUFNUixTQUFTLElBQUlyQixXQUFXLEVBQUU7SUFDbkMsTUFBTW9CLG9CQUFvQixDQUFDM0csSUFBSSxFQUFFNEcsU0FBUyxDQUFDO0lBQzNDLE1BQU1PLFdBQVcsR0FBRyxNQUFNSix1QkFBdUIsQ0FBQy9HLElBQUksRUFBRTJCLFNBQVMsQ0FBQztJQUNsRXlGLFFBQVEsQ0FBQ3pHLElBQUksQ0FBQ3dHLFdBQVcsQ0FBQztFQUM1QjtFQUVBLE9BQU9DLFFBQVE7QUFDakI7QUFJQSxNQUFNQyx5QkFBeUIsU0FBU0MsOENBQXNCLENBQTZCO0VBQ3pGQyxRQUFRLEdBQUcsRUFBRTtFQUViQyxTQUFTLEdBQUcsRUFBRTtFQUVkQyxnQkFBZ0IsR0FBRyxFQUFFO0VBRXJCQyxlQUFlQSxDQUFDbEwsV0FBdUMsRUFBRTtJQUN2RCxPQUFPO01BQ0xtTCxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUNILFNBQVMsRUFBRTtNQUM3QkksTUFBTSxFQUFFckwsaUJBQWlCLENBQUNDLFdBQVcsQ0FBQztNQUN0Q3FMLG9CQUFvQixFQUFFLGNBQWM7TUFDcENDLFVBQVUsRUFBRSxNQUFBQSxDQUFBLEtBQVl0RSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUN4RCxJQUFJLENBQUM7TUFDbkQrSCxlQUFlLEVBQUU3TCx1QkFBdUIsQ0FBQyxDQUFDO01BQzFDO01BQ0E7TUFDQThMLFNBQVMsRUFBRSxNQUFBQSxDQUFBLEtBQVk7UUFDckIsTUFBTSxJQUFBM0IsY0FBSyxFQUFDLElBQUksQ0FBQztNQUNuQjtJQUNGLENBQUM7RUFDSDtFQUVBLE1BQU00QixTQUFTQSxDQUFBLEVBQUc7SUFDaEIsTUFBTUMsa0JBQWtCLEdBQUcsSUFBQXBLLGVBQU0sRUFBQyxDQUFDLENBQUNxSyxRQUFRLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUN0RSxNQUFNQyxnQkFBZ0IsR0FBRyxJQUFBdkssZUFBTSxFQUFDO01BQUV3SyxJQUFJLEVBQUU7SUFBSyxDQUFDLENBQUM7SUFDL0MsTUFBTTNHLFNBQVMsR0FBRyxJQUFJLENBQUNxQyxPQUFPLENBQUNyQyxTQUFTLElBQUl1RyxrQkFBa0IsQ0FBQ0ssTUFBTSxDQUFDLENBQUM7SUFDdkUsTUFBTUMsV0FBVyxHQUFHMUssZUFBTSxDQUFDMkssR0FBRyxDQUFDSixnQkFBZ0IsRUFBRSxJQUFBdkssZUFBTSxFQUFDNkQsU0FBUyxDQUFDLENBQUM7SUFFbkUsTUFBTSxJQUFJLENBQUMrRyxVQUFVLENBQUMsSUFBSSxDQUFDakIsZ0JBQWdCLENBQUM7SUFFNUMsTUFBTUwsUUFBUSxHQUFHLE1BQU1GLGFBQWEsQ0FBQyxJQUFJLENBQUNsSCxJQUFJLEVBQUV3SSxXQUFXLENBQUM7SUFFNUQsT0FBTztNQUNMRyxPQUFPLEVBQUUsSUFBSTtNQUNidkI7SUFDRixDQUFDO0VBQ0g7QUFDRjtBQUFDLElBQUF3QixRQUFBLEdBQUFDLE9BQUEsQ0FBQTlOLE9BQUEsR0FFY3NNLHlCQUF5QiIsImlnbm9yZUxpc3QiOltdfQ==