israeli-bank-scrapers 6.1.1 → 6.1.2

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