israeli-bank-scrapers 4.2.1 → 4.3.0

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 (62) hide show
  1. package/README.md +14 -0
  2. package/lib/assertNever.js +1 -2
  3. package/lib/constants.js +1 -1
  4. package/lib/definitions.d.ts +5 -0
  5. package/lib/definitions.js +7 -4
  6. package/lib/helpers/dates.js +1 -7
  7. package/lib/helpers/debug.js +1 -4
  8. package/lib/helpers/elements-interactions.js +5 -27
  9. package/lib/helpers/fetch.js +1 -21
  10. package/lib/helpers/navigation.js +1 -9
  11. package/lib/helpers/storage.js +1 -3
  12. package/lib/helpers/transactions.js +1 -17
  13. package/lib/helpers/waiting.js +4 -12
  14. package/lib/index.js +2 -12
  15. package/lib/scrapers/amex.js +1 -7
  16. package/lib/scrapers/amex.test.js +1 -14
  17. package/lib/scrapers/base-beinleumi-group.js +4 -67
  18. package/lib/scrapers/base-isracard-amex.js +1 -75
  19. package/lib/scrapers/base-scraper-with-browser.js +14 -82
  20. package/lib/scrapers/base-scraper-with-browser.test.js +13 -23
  21. package/lib/scrapers/base-scraper.js +13 -36
  22. package/lib/scrapers/behatsdaa.js +5 -26
  23. package/lib/scrapers/behatsdaa.test.js +1 -10
  24. package/lib/scrapers/beinleumi.js +1 -11
  25. package/lib/scrapers/beinleumi.test.js +1 -14
  26. package/lib/scrapers/beyahad-bishvilha.js +1 -35
  27. package/lib/scrapers/beyahad-bishvilha.test.js +1 -14
  28. package/lib/scrapers/discount.js +1 -31
  29. package/lib/scrapers/discount.test.js +1 -14
  30. package/lib/scrapers/errors.js +1 -5
  31. package/lib/scrapers/factory.js +4 -39
  32. package/lib/scrapers/factory.test.js +2 -4
  33. package/lib/scrapers/hapoalim.js +4 -50
  34. package/lib/scrapers/hapoalim.test.js +1 -14
  35. package/lib/scrapers/interface.js +1 -1
  36. package/lib/scrapers/isracard.js +1 -7
  37. package/lib/scrapers/isracard.test.js +1 -14
  38. package/lib/scrapers/leumi.js +13 -45
  39. package/lib/scrapers/leumi.test.js +1 -14
  40. package/lib/scrapers/massad.js +1 -11
  41. package/lib/scrapers/max.d.ts +20 -0
  42. package/lib/scrapers/max.js +76 -111
  43. package/lib/scrapers/max.test.js +21 -16
  44. package/lib/scrapers/mercantile.d.ts +20 -0
  45. package/lib/scrapers/mercantile.js +21 -0
  46. package/lib/scrapers/mercantile.test.d.ts +1 -0
  47. package/lib/scrapers/mercantile.test.js +48 -0
  48. package/lib/scrapers/mizrahi.js +14 -40
  49. package/lib/scrapers/mizrahi.test.js +1 -15
  50. package/lib/scrapers/one-zero-queries.js +1 -1
  51. package/lib/scrapers/one-zero.js +2 -54
  52. package/lib/scrapers/one-zero.test.js +1 -14
  53. package/lib/scrapers/otsar-hahayal.js +9 -47
  54. package/lib/scrapers/otsar-hahayal.test.js +1 -14
  55. package/lib/scrapers/union-bank.js +2 -60
  56. package/lib/scrapers/union-bank.test.js +1 -14
  57. package/lib/scrapers/visa-cal.js +3 -55
  58. package/lib/scrapers/visa-cal.test.js +3 -16
  59. package/lib/scrapers/yahav.js +25 -52
  60. package/lib/scrapers/yahav.test.js +1 -14
  61. package/lib/transactions.js +1 -4
  62. package/package.json +2 -7
@@ -1,72 +1,48 @@
1
1
  "use strict";
2
2
 
3
3
  require("core-js/modules/es.array.iterator");
4
-
5
4
  require("core-js/modules/es.promise");
6
-
7
5
  Object.defineProperty(exports, "__esModule", {
8
6
  value: true
9
7
  });
10
8
  exports.BaseScraperWithBrowser = exports.LoginResults = void 0;
11
-
12
9
  var _puppeteer = _interopRequireDefault(require("puppeteer"));
13
-
14
10
  var _baseScraper = require("./base-scraper");
15
-
16
11
  var _navigation = require("../helpers/navigation");
17
-
18
12
  var _elementsInteractions = require("../helpers/elements-interactions");
19
-
20
13
  var _debug = require("../helpers/debug");
21
-
22
14
  var _errors = require("./errors");
23
-
24
15
  var _definitions = require("../definitions");
25
-
26
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
-
28
17
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
29
-
30
18
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
31
-
32
19
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
33
-
34
20
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
35
-
36
21
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
37
-
38
22
  const VIEWPORT_WIDTH = 1024;
39
23
  const VIEWPORT_HEIGHT = 768;
40
24
  const OK_STATUS = 200;
41
25
  const debug = (0, _debug.getDebug)('base-scraper-with-browser');
42
26
  var LoginBaseResults;
43
-
44
27
  (function (LoginBaseResults) {
45
28
  LoginBaseResults["Success"] = "SUCCESS";
46
29
  LoginBaseResults["UnknownError"] = "UNKNOWN_ERROR";
47
30
  })(LoginBaseResults || (LoginBaseResults = {}));
48
-
49
31
  const {
50
- Timeout,
51
- Generic,
52
- General
53
- } = _errors.ScraperErrorTypes,
54
- rest = _objectWithoutProperties(_errors.ScraperErrorTypes, ["Timeout", "Generic", "General"]);
55
-
32
+ Timeout,
33
+ Generic,
34
+ General
35
+ } = _errors.ScraperErrorTypes,
36
+ rest = _objectWithoutProperties(_errors.ScraperErrorTypes, ["Timeout", "Generic", "General"]);
56
37
  const LoginResults = _objectSpread({}, rest, {}, LoginBaseResults);
57
-
58
38
  exports.LoginResults = LoginResults;
59
-
60
39
  async function getKeyByValue(object, value, page) {
61
40
  const keys = Object.keys(object);
62
-
63
41
  for (const key of keys) {
64
42
  // @ts-ignore
65
43
  const conditions = object[key];
66
-
67
44
  for (const condition of conditions) {
68
45
  let result = false;
69
-
70
46
  if (condition instanceof RegExp) {
71
47
  result = condition.test(value);
72
48
  } else if (typeof condition === 'function') {
@@ -77,52 +53,45 @@ async function getKeyByValue(object, value, page) {
77
53
  } else {
78
54
  result = value.toLowerCase() === condition.toLowerCase();
79
55
  }
80
-
81
56
  if (result) {
82
57
  // @ts-ignore
83
58
  return Promise.resolve(key);
84
59
  }
85
60
  }
86
61
  }
87
-
88
62
  return Promise.resolve(LoginResults.UnknownError);
89
63
  }
90
-
91
64
  function createGeneralError() {
92
65
  return {
93
66
  success: false,
94
67
  errorType: _errors.ScraperErrorTypes.General
95
68
  };
96
69
  }
97
-
98
70
  class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
99
71
  constructor(...args) {
100
72
  super(...args);
101
-
102
73
  _defineProperty(this, "browser", void 0);
103
-
104
74
  _defineProperty(this, "page", void 0);
105
- }
106
-
75
+ } // NOTICE - it is discouraged to use bang (!) in general. It is used here because
76
+ // all the classes that inherit from this base assume is it mandatory.
77
+ // NOTICE - it is discouraged to use bang (!) in general. It is used here because
78
+ // all the classes that inherit from this base assume is it mandatory.
107
79
  getViewPort() {
108
80
  return {
109
81
  width: VIEWPORT_WIDTH,
110
82
  height: VIEWPORT_HEIGHT
111
83
  };
112
84
  }
113
-
114
85
  async initialize() {
115
86
  await super.initialize();
116
87
  debug('initialize scraper');
117
88
  this.emitProgress(_definitions.ScraperProgressTypes.Initializing);
118
89
  let env;
119
-
120
90
  if (this.options.verbose) {
121
91
  env = _objectSpread({
122
92
  DEBUG: '*'
123
93
  }, process.env);
124
94
  }
125
-
126
95
  if (typeof this.options.browser !== 'undefined' && this.options.browser !== null) {
127
96
  debug('use custom browser instance provided in options');
128
97
  this.browser = this.options.browser;
@@ -142,19 +111,15 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
142
111
  timeout
143
112
  });
144
113
  }
145
-
146
114
  if (this.options.prepareBrowser) {
147
115
  debug('execute \'prepareBrowser\' interceptor provided in options');
148
116
  await this.options.prepareBrowser(this.browser);
149
117
  }
150
-
151
118
  if (!this.browser) {
152
119
  debug('failed to initiate a browser, exit');
153
120
  return;
154
121
  }
155
-
156
122
  const pages = await this.browser.pages();
157
-
158
123
  if (pages.length) {
159
124
  debug('browser has already pages open, use the first one');
160
125
  [this.page] = pages;
@@ -162,16 +127,13 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
162
127
  debug('create a new browser page');
163
128
  this.page = await this.browser.newPage();
164
129
  }
165
-
166
130
  if (this.options.defaultTimeout) {
167
131
  this.page.setDefaultTimeout(this.options.defaultTimeout);
168
132
  }
169
-
170
133
  if (this.options.preparePage) {
171
134
  debug('execute \'preparePage\' interceptor provided in options');
172
135
  await this.options.preparePage(this.page);
173
136
  }
174
-
175
137
  const viewport = this.getViewPort();
176
138
  debug(`set viewport to width ${viewport.width}, height ${viewport.height}`);
177
139
  await this.page.setViewport({
@@ -180,67 +142,54 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
180
142
  });
181
143
  this.page.on('requestfailed', request => {
182
144
  var _request$failure;
183
-
184
145
  debug('Request failed: %s %s', (_request$failure = request.failure()) === null || _request$failure === void 0 ? void 0 : _request$failure.errorText, request.url());
185
146
  });
186
147
  }
187
-
188
148
  async navigateTo(url, page, timeout, waitUntil = 'load') {
189
149
  const pageToUse = page || this.page;
190
-
191
150
  if (!pageToUse) {
192
151
  return;
193
152
  }
194
-
195
153
  const options = _objectSpread({}, timeout === null ? null : {
196
154
  timeout
197
155
  }, {
198
156
  waitUntil
199
157
  });
158
+ const response = await pageToUse.goto(url, options);
200
159
 
201
- const response = await pageToUse.goto(url, options); // note: response will be null when navigating to same url while changing the hash part. the condition below will always accept null as valid result.
202
-
160
+ // note: response will be null when navigating to same url while changing the hash part. the condition below will always accept null as valid result.
203
161
  if (response !== null && (response === undefined || response.status() !== OK_STATUS)) {
204
162
  throw new Error(`Error while trying to navigate to url ${url}`);
205
163
  }
206
- } // eslint-disable-next-line @typescript-eslint/no-unused-vars
207
-
164
+ }
208
165
 
166
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
209
167
  getLoginOptions(_credentials) {
210
168
  throw new Error(`getLoginOptions() is not created in ${this.options.companyId}`);
211
169
  }
212
-
213
170
  async fillInputs(pageOrFrame, fields) {
214
171
  const modified = [...fields];
215
172
  const input = modified.shift();
216
-
217
173
  if (!input) {
218
174
  return;
219
175
  }
220
-
221
176
  await (0, _elementsInteractions.fillInput)(pageOrFrame, input.selector, input.value);
222
-
223
177
  if (modified.length) {
224
178
  await this.fillInputs(pageOrFrame, modified);
225
179
  }
226
180
  }
227
-
228
181
  async login(credentials) {
229
182
  if (!credentials || !this.page) {
230
183
  return createGeneralError();
231
184
  }
232
-
233
185
  debug('execute login process');
234
186
  const loginOptions = this.getLoginOptions(credentials);
235
-
236
187
  if (loginOptions.userAgent) {
237
188
  debug('set custom user agent provided in options');
238
189
  await this.page.setUserAgent(loginOptions.userAgent);
239
190
  }
240
-
241
191
  debug('navigate to login url');
242
192
  await this.navigateTo(loginOptions.loginUrl, undefined, undefined, loginOptions.waitUntil);
243
-
244
193
  if (loginOptions.checkReadiness) {
245
194
  debug('execute \'checkReadiness\' interceptor provided in login options');
246
195
  await loginOptions.checkReadiness();
@@ -248,26 +197,20 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
248
197
  debug('wait until submit button is available');
249
198
  await (0, _elementsInteractions.waitUntilElementFound)(this.page, loginOptions.submitButtonSelector);
250
199
  }
251
-
252
200
  let loginFrameOrPage = this.page;
253
-
254
201
  if (loginOptions.preAction) {
255
202
  debug('execute \'preAction\' interceptor provided in login options');
256
203
  loginFrameOrPage = (await loginOptions.preAction()) || this.page;
257
204
  }
258
-
259
205
  debug('fill login components input with relevant values');
260
206
  await this.fillInputs(loginFrameOrPage, loginOptions.fields);
261
207
  debug('click on login submit button');
262
-
263
208
  if (typeof loginOptions.submitButtonSelector === 'string') {
264
209
  await (0, _elementsInteractions.clickButton)(loginFrameOrPage, loginOptions.submitButtonSelector);
265
210
  } else {
266
211
  await loginOptions.submitButtonSelector();
267
212
  }
268
-
269
213
  this.emitProgress(_definitions.ScraperProgressTypes.LoggingIn);
270
-
271
214
  if (loginOptions.postAction) {
272
215
  debug('execute \'postAction\' interceptor provided in login options');
273
216
  await loginOptions.postAction();
@@ -275,18 +218,15 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
275
218
  debug('wait for page navigation');
276
219
  await (0, _navigation.waitForNavigation)(this.page);
277
220
  }
278
-
279
221
  debug('check login result');
280
222
  const current = await (0, _navigation.getCurrentUrl)(this.page, true);
281
223
  const loginResult = await getKeyByValue(loginOptions.possibleResults, current, this.page);
282
224
  debug(`handle login results ${loginResult}`);
283
225
  return this.handleLoginResult(loginResult);
284
226
  }
285
-
286
227
  async terminate(_success) {
287
228
  debug(`terminating browser with success = ${_success}`);
288
229
  this.emitProgress(_definitions.ScraperProgressTypes.Terminating);
289
-
290
230
  if (!_success && !!this.options.storeFailureScreenShotPath) {
291
231
  debug(`create a snapshot before terminated in ${this.options.storeFailureScreenShotPath}`);
292
232
  await this.page.screenshot({
@@ -294,14 +234,11 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
294
234
  fullPage: true
295
235
  });
296
236
  }
297
-
298
237
  if (!this.browser) {
299
238
  return;
300
239
  }
301
-
302
240
  await this.browser.close();
303
241
  }
304
-
305
242
  handleLoginResult(loginResult) {
306
243
  switch (loginResult) {
307
244
  case LoginResults.Success:
@@ -309,7 +246,6 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
309
246
  return {
310
247
  success: true
311
248
  };
312
-
313
249
  case LoginResults.InvalidPassword:
314
250
  case LoginResults.UnknownError:
315
251
  this.emitProgress(_definitions.ScraperProgressTypes.LoginFailed);
@@ -318,20 +254,16 @@ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
318
254
  errorType: loginResult === LoginResults.InvalidPassword ? _errors.ScraperErrorTypes.InvalidPassword : _errors.ScraperErrorTypes.General,
319
255
  errorMessage: `Login failed with ${loginResult} error`
320
256
  };
321
-
322
257
  case LoginResults.ChangePassword:
323
258
  this.emitProgress(_definitions.ScraperProgressTypes.ChangePassword);
324
259
  return {
325
260
  success: false,
326
261
  errorType: _errors.ScraperErrorTypes.ChangePassword
327
262
  };
328
-
329
263
  default:
330
264
  throw new Error(`unexpected login result "${loginResult}"`);
331
265
  }
332
266
  }
333
-
334
267
  }
335
-
336
268
  exports.BaseScraperWithBrowser = BaseScraperWithBrowser;
337
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyLnRzIl0sIm5hbWVzIjpbIlZJRVdQT1JUX1dJRFRIIiwiVklFV1BPUlRfSEVJR0hUIiwiT0tfU1RBVFVTIiwiZGVidWciLCJMb2dpbkJhc2VSZXN1bHRzIiwiVGltZW91dCIsIkdlbmVyaWMiLCJHZW5lcmFsIiwiU2NyYXBlckVycm9yVHlwZXMiLCJyZXN0IiwiTG9naW5SZXN1bHRzIiwiZ2V0S2V5QnlWYWx1ZSIsIm9iamVjdCIsInZhbHVlIiwicGFnZSIsImtleXMiLCJPYmplY3QiLCJrZXkiLCJjb25kaXRpb25zIiwiY29uZGl0aW9uIiwicmVzdWx0IiwiUmVnRXhwIiwidGVzdCIsInRvTG93ZXJDYXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJVbmtub3duRXJyb3IiLCJjcmVhdGVHZW5lcmFsRXJyb3IiLCJzdWNjZXNzIiwiZXJyb3JUeXBlIiwiQmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsIkJhc2VTY3JhcGVyIiwiZ2V0Vmlld1BvcnQiLCJ3aWR0aCIsImhlaWdodCIsImluaXRpYWxpemUiLCJlbWl0UHJvZ3Jlc3MiLCJTY3JhcGVyUHJvZ3Jlc3NUeXBlcyIsIkluaXRpYWxpemluZyIsImVudiIsIm9wdGlvbnMiLCJ2ZXJib3NlIiwiREVCVUciLCJwcm9jZXNzIiwiYnJvd3NlciIsImV4ZWN1dGFibGVQYXRoIiwidW5kZWZpbmVkIiwiYXJncyIsInRpbWVvdXQiLCJoZWFkbGVzcyIsInNob3dCcm93c2VyIiwicHVwcGV0ZWVyIiwibGF1bmNoIiwicHJlcGFyZUJyb3dzZXIiLCJwYWdlcyIsImxlbmd0aCIsIm5ld1BhZ2UiLCJkZWZhdWx0VGltZW91dCIsInNldERlZmF1bHRUaW1lb3V0IiwicHJlcGFyZVBhZ2UiLCJ2aWV3cG9ydCIsInNldFZpZXdwb3J0Iiwib24iLCJyZXF1ZXN0IiwiZmFpbHVyZSIsImVycm9yVGV4dCIsInVybCIsIm5hdmlnYXRlVG8iLCJ3YWl0VW50aWwiLCJwYWdlVG9Vc2UiLCJyZXNwb25zZSIsImdvdG8iLCJzdGF0dXMiLCJFcnJvciIsImdldExvZ2luT3B0aW9ucyIsIl9jcmVkZW50aWFscyIsImNvbXBhbnlJZCIsImZpbGxJbnB1dHMiLCJwYWdlT3JGcmFtZSIsImZpZWxkcyIsIm1vZGlmaWVkIiwiaW5wdXQiLCJzaGlmdCIsInNlbGVjdG9yIiwibG9naW4iLCJjcmVkZW50aWFscyIsImxvZ2luT3B0aW9ucyIsInVzZXJBZ2VudCIsInNldFVzZXJBZ2VudCIsImxvZ2luVXJsIiwiY2hlY2tSZWFkaW5lc3MiLCJzdWJtaXRCdXR0b25TZWxlY3RvciIsImxvZ2luRnJhbWVPclBhZ2UiLCJwcmVBY3Rpb24iLCJMb2dnaW5nSW4iLCJwb3N0QWN0aW9uIiwiY3VycmVudCIsImxvZ2luUmVzdWx0IiwicG9zc2libGVSZXN1bHRzIiwiaGFuZGxlTG9naW5SZXN1bHQiLCJ0ZXJtaW5hdGUiLCJfc3VjY2VzcyIsIlRlcm1pbmF0aW5nIiwic3RvcmVGYWlsdXJlU2NyZWVuU2hvdFBhdGgiLCJzY3JlZW5zaG90IiwicGF0aCIsImZ1bGxQYWdlIiwiY2xvc2UiLCJTdWNjZXNzIiwiTG9naW5TdWNjZXNzIiwiSW52YWxpZFBhc3N3b3JkIiwiTG9naW5GYWlsZWQiLCJlcnJvck1lc3NhZ2UiLCJDaGFuZ2VQYXNzd29yZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFJQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7QUFFQSxNQUFNQSxjQUFjLEdBQUcsSUFBdkI7QUFDQSxNQUFNQyxlQUFlLEdBQUcsR0FBeEI7QUFDQSxNQUFNQyxTQUFTLEdBQUcsR0FBbEI7QUFFQSxNQUFNQyxLQUFLLEdBQUcscUJBQVMsMkJBQVQsQ0FBZDtJQUVLQyxnQjs7V0FBQUEsZ0I7QUFBQUEsRUFBQUEsZ0I7QUFBQUEsRUFBQUEsZ0I7R0FBQUEsZ0IsS0FBQUEsZ0I7O0FBS0wsTUFBTTtBQUNKQyxFQUFBQSxPQURJO0FBQ0tDLEVBQUFB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RmUsT0FBckIsQ0FBTjtBQUlEOztBQUVELFFBQUksQ0FBQyxLQUFLOUQsT0FBVixFQUFtQjtBQUNqQjtBQUNEOztBQUVELFVBQU0sS0FBS0EsT0FBTCxDQUFhK0QsS0FBYixFQUFOO0FBQ0Q7O0FBRU9SLEVBQUFBLGlCQUFSLENBQTBCRixXQUExQixFQUFxRDtBQUNuRCxZQUFRQSxXQUFSO0FBQ0UsV0FBS3ZGLFlBQVksQ0FBQ2tHLE9BQWxCO0FBQ0UsYUFBS3hFLFlBQUwsQ0FBa0JDLGtDQUFxQndFLFlBQXZDO0FBQ0EsZUFBTztBQUFFakYsVUFBQUEsT0FBTyxFQUFFO0FBQVgsU0FBUDs7QUFDRixXQUFLbEIsWUFBWSxDQUFDb0csZUFBbEI7QUFDQSxXQUFLcEcsWUFBWSxDQUFDZ0IsWUFBbEI7QUFDRSxhQUFLVSxZQUFMLENBQWtCQyxrQ0FBcUIwRSxXQUF2QztBQUNBLGVBQU87QUFDTG5GLFVBQUFBLE9BQU8sRUFBRSxLQURKO0FBRUxDLFVBQUFBLFNBQVMsRUFBRW9FLFdBQVcsS0FBS3ZGLFlBQVksQ0FBQ29HLGVBQTdCLEdBQStDdEcsMEJBQWtCc0csZUFBakUsR0FDVHRHLDBCQUFrQkQsT0FIZjtBQUlMeUcsVUFBQUEsWUFBWSxFQUFHLHFCQUFvQmYsV0FBWTtBQUoxQyxTQUFQOztBQU1GLFdBQUt2RixZQUFZLENBQUN1RyxjQUFsQjtBQUNFLGFBQUs3RSxZQUFMLENBQWtCQyxrQ0FBcUI0RSxjQUF2QztBQUNBLGVBQU87QUFDTHJGLFVBQUFBLE9BQU8sRUFBRSxLQURKO0FBRUxDLFVBQUFBLFNBQVMsRUFBRXJCLDBCQUFrQnlHO0FBRnhCLFNBQVA7O0FBSUY7QUFDRSxjQUFNLElBQUl4QyxLQUFKLENBQVcsNEJBQTJCd0IsV0FBWSxHQUFsRCxDQUFOO0FBcEJKO0FBc0JEOztBQXZOcUciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcHVwcGV0ZWVyLCB7XG4gIEJyb3dzZXIsIEZyYW1lLCBQYWdlLCBMb2FkRXZlbnQsXG59IGZyb20gJ3B1cHBldGVlcic7XG5cbmltcG9ydCB7XG4gIEJhc2VTY3JhcGVyLFxuXG59IGZyb20gJy4vYmFzZS1zY3JhcGVyJztcbmltcG9ydCB7IGdldEN1cnJlbnRVcmwsIHdhaXRGb3JOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vaGVscGVycy9uYXZpZ2F0aW9uJztcbmltcG9ydCB7IGNsaWNrQnV0dG9uLCBmaWxsSW5wdXQsIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCB9IGZyb20gJy4uL2hlbHBlcnMvZWxlbWVudHMtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB7IGdldERlYnVnIH0gZnJvbSAnLi4vaGVscGVycy9kZWJ1Zyc7XG5pbXBvcnQgeyBTY3JhcGVyRXJyb3JUeXBlcyB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IFNjcmFwZXJTY3JhcGluZ1Jlc3VsdCwgU2NyYXBlckNyZWRlbnRpYWxzIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2NyYXBlclByb2dyZXNzVHlwZXMgfSBmcm9tICcuLi9kZWZpbml0aW9ucyc7XG5cbmNvbnN0IFZJRVdQT1JUX1dJRFRIID0gMTAyNDtcbmNvbnN0IFZJRVdQT1JUX0hFSUdIVCA9IDc2ODtcbmNvbnN0IE9LX1NUQVRVUyA9IDIwMDtcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZygnYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3NlcicpO1xuXG5lbnVtIExvZ2luQmFzZVJlc3VsdHMge1xuICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICBVbmtub3duRXJyb3IgPSAnVU5LTk9XTl9FUlJPUidcbn1cblxuY29uc3Qge1xuICBUaW1lb3V0LCBHZW5lcmljLCBHZW5lcmFsLCAuLi5yZXN0XG59ID0gU2NyYXBlckVycm9yVHlwZXM7XG5leHBvcnQgY29uc3QgTG9naW5SZXN1bHRzID0ge1xuICAuLi5yZXN0LFxuICAuLi5Mb2dpbkJhc2VSZXN1bHRzLFxufTtcblxuZXhwb3J0IHR5cGUgTG9naW5SZXN1bHRzID0gRXhjbHVkZTxTY3JhcGVyRXJyb3JUeXBlcyxcblNjcmFwZXJFcnJvclR5cGVzLlRpbWVvdXRcbnwgU2NyYXBlckVycm9yVHlwZXMuR2VuZXJpY1xufCBTY3JhcGVyRXJyb3JUeXBlcy5HZW5lcmFsPiB8IExvZ2luQmFzZVJlc3VsdHM7XG5cbmV4cG9ydCB0eXBlIFBvc3NpYmxlTG9naW5SZXN1bHRzID0ge1xuICBba2V5IGluIExvZ2luUmVzdWx0c10/OiAoc3RyaW5nIHwgUmVnRXhwIHwgKChvcHRpb25zPzogeyBwYWdlPzogUGFnZX0pID0+IFByb21pc2U8Ym9vbGVhbj4pKVtdXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2luT3B0aW9ucyB7XG4gIGxvZ2luVXJsOiBzdHJpbmc7XG4gIGNoZWNrUmVhZGluZXNzPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgZmllbGRzOiB7c2VsZWN0b3I6IHN0cmluZywgdmFsdWU6IHN0cmluZ31bXTtcbiAgc3VibWl0QnV0dG9uU2VsZWN0b3I6IHN0cmluZyB8ICgoKSA9PiBQcm9taXNlPHZvaWQ+KTtcbiAgcHJlQWN0aW9uPzogKCkgPT4gUHJvbWlzZTxGcmFtZSB8IHZvaWQ+O1xuICBwb3N0QWN0aW9uPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcG9zc2libGVSZXN1bHRzOiBQb3NzaWJsZUxvZ2luUmVzdWx0cztcbiAgdXNlckFnZW50Pzogc3RyaW5nO1xuICB3YWl0VW50aWw/OiBMb2FkRXZlbnQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEtleUJ5VmFsdWUob2JqZWN0OiBQb3NzaWJsZUxvZ2luUmVzdWx0cywgdmFsdWU6IHN0cmluZywgcGFnZTogUGFnZSk6IFByb21pc2U8TG9naW5SZXN1bHRzPiB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBvYmplY3Rba2V5XTtcblxuICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcbiAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcblxuICAgICAgaWYgKGNvbmRpdGlvbiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXN1bHQgPSBjb25kaXRpb24udGVzdCh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgY29uZGl0aW9uKHsgcGFnZSwgdmFsdWUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBjb25kaXRpb24udG9Mb3dlckNhc2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKExvZ2luUmVzdWx0cy5Vbmtub3duRXJyb3IpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVHZW5lcmFsRXJyb3IoKTogU2NyYXBlclNjcmFwaW5nUmVzdWx0IHtcbiAgcmV0dXJuIHtcbiAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICBlcnJvclR5cGU6IFNjcmFwZXJFcnJvclR5cGVzLkdlbmVyYWwsXG4gIH07XG59XG5cbmNsYXNzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8VENyZWRlbnRpYWxzIGV4dGVuZHMgU2NyYXBlckNyZWRlbnRpYWxzPiBleHRlbmRzIEJhc2VTY3JhcGVyPFRDcmVkZW50aWFscz4ge1xuICAvLyBOT1RJQ0UgLSBpdCBpcyBkaXNjb3VyYWdlZCB0byB1c2UgYmFuZyAoISkgaW4gZ2VuZXJhbC4gSXQgaXMgdXNlZCBoZXJlIGJlY2F1c2VcbiAgLy8gYWxsIHRoZSBjbGFzc2VzIHRoYXQgaW5oZXJpdCBmcm9tIHRoaXMgYmFzZSBhc3N1bWUgaXMgaXQgbWFuZGF0b3J5LlxuICBwcm90ZWN0ZWQgYnJvd3NlciE6IEJyb3dzZXI7XG5cbiAgLy8gTk9USUNFIC0gaXQgaXMgZGlzY291cmFnZWQgdG8gdXNlIGJhbmcgKCEpIGluIGdlbmVyYWwuIEl0IGlzIHVzZWQgaGVyZSBiZWNhdXNlXG4gIC8vIGFsbCB0aGUgY2xhc3NlcyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIGJhc2UgYXNzdW1lIGlzIGl0IG1hbmRhdG9yeS5cbiAgcHJvdGVjdGVkIHBhZ2UhOiBQYWdlO1xuXG4gIHByb3RlY3RlZCBnZXRWaWV3UG9ydCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IFZJRVdQT1JUX1dJRFRILFxuICAgICAgaGVpZ2h0OiBWSUVXUE9SVF9IRUlHSFQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemUoKSB7XG4gICAgYXdhaXQgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIGRlYnVnKCdpbml0aWFsaXplIHNjcmFwZXInKTtcbiAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Jbml0aWFsaXppbmcpO1xuXG4gICAgbGV0IGVudjogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5vcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgIGVudiA9IHsgREVCVUc6ICcqJywgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5icm93c2VyICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm9wdGlvbnMuYnJvd3NlciAhPT0gbnVsbCkge1xuICAgICAgZGVidWcoJ3VzZSBjdXN0b20gYnJvd3NlciBpbnN0YW5jZSBwcm92aWRlZCBpbiBvcHRpb25zJyk7XG4gICAgICB0aGlzLmJyb3dzZXIgPSB0aGlzLm9wdGlvbnMuYnJvd3NlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXhlY3V0YWJsZVBhdGggPSB0aGlzLm9wdGlvbnMuZXhlY3V0YWJsZVBhdGggfHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgYXJncyA9IHRoaXMub3B0aW9ucy5hcmdzIHx8IFtdO1xuICAgICAgY29uc3QgeyB0aW1lb3V0IH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIGNvbnN0IGhlYWRsZXNzID0gIXRoaXMub3B0aW9ucy5zaG93QnJvd3NlcjtcbiAgICAgIGRlYnVnKGBsYXVuY2ggYSBicm93c2VyIHdpdGggaGVhZGxlc3MgbW9kZSA9ICR7aGVhZGxlc3N9YCk7XG4gICAgICB0aGlzLmJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKHtcbiAgICAgICAgZW52LFxuICAgICAgICBoZWFkbGVzcyxcbiAgICAgICAgZXhlY3V0YWJsZVBhdGgsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHRpbWVvdXQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnByZXBhcmVCcm93c2VyKSB7XG4gICAgICBkZWJ1ZygnZXhlY3V0ZSBcXCdwcmVwYXJlQnJvd3NlclxcJyBpbnRlcmNlcHRvciBwcm92aWRlZCBpbiBvcHRpb25zJyk7XG4gICAgICBhd2FpdCB0aGlzLm9wdGlvbnMucHJlcGFyZUJyb3dzZXIodGhpcy5icm93c2VyKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYnJvd3Nlcikge1xuICAgICAgZGVidWcoJ2ZhaWxlZCB0byBpbml0aWF0ZSBhIGJyb3dzZXIsIGV4aXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlcyA9IGF3YWl0IHRoaXMuYnJvd3Nlci5wYWdlcygpO1xuICAgIGlmIChwYWdlcy5sZW5ndGgpIHtcbiAgICAgIGRlYnVnKCdicm93c2VyIGhhcyBhbHJlYWR5IHBhZ2VzIG9wZW4sIHVzZSB0aGUgZmlyc3Qgb25lJyk7XG4gICAgICBbdGhpcy5wYWdlXSA9IHBhZ2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1ZygnY3JlYXRlIGEgbmV3IGJyb3dzZXIgcGFnZScpO1xuICAgICAgdGhpcy5wYWdlID0gYXdhaXQgdGhpcy5icm93c2VyLm5ld1BhZ2UoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmRlZmF1bHRUaW1lb3V0KSB7XG4gICAgICB0aGlzLnBhZ2Uuc2V0RGVmYXVsdFRpbWVvdXQodGhpcy5vcHRpb25zLmRlZmF1bHRUaW1lb3V0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnByZXBhcmVQYWdlKSB7XG4gICAgICBkZWJ1ZygnZXhlY3V0ZSBcXCdwcmVwYXJlUGFnZVxcJyBpbnRlcmNlcHRvciBwcm92aWRlZCBpbiBvcHRpb25zJyk7XG4gICAgICBhd2FpdCB0aGlzLm9wdGlvbnMucHJlcGFyZVBhZ2UodGhpcy5wYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld1BvcnQoKTtcbiAgICBkZWJ1Zyhgc2V0IHZpZXdwb3J0IHRvIHdpZHRoICR7dmlld3BvcnQud2lkdGh9LCBoZWlnaHQgJHt2aWV3cG9ydC5oZWlnaHR9YCk7XG4gICAgYXdhaXQgdGhpcy5wYWdlLnNldFZpZXdwb3J0KHtcbiAgICAgIHdpZHRoOiB2aWV3cG9ydC53aWR0aCxcbiAgICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LFxuICAgIH0pO1xuXG4gICAgdGhpcy5wYWdlLm9uKCdyZXF1ZXN0ZmFpbGVkJywgKHJlcXVlc3QpID0+IHtcbiAgICAgIGRlYnVnKCdSZXF1ZXN0IGZhaWxlZDogJXMgJXMnLCByZXF1ZXN0LmZhaWx1cmUoKT8uZXJyb3JUZXh0LCByZXF1ZXN0LnVybCgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIG5hdmlnYXRlVG8odXJsOiBzdHJpbmcsIHBhZ2U/OiBQYWdlLCB0aW1lb3V0PzogbnVtYmVyLCB3YWl0VW50aWw6IExvYWRFdmVudCB8IHVuZGVmaW5lZCA9ICdsb2FkJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhZ2VUb1VzZSA9IHBhZ2UgfHwgdGhpcy5wYWdlO1xuXG4gICAgaWYgKCFwYWdlVG9Vc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0geyAuLi4odGltZW91dCA9PT0gbnVsbCA/IG51bGwgOiB7IHRpbWVvdXQgfSksIHdhaXRVbnRpbCB9O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcGFnZVRvVXNlLmdvdG8odXJsLCBvcHRpb25zKTtcblxuICAgIC8vIG5vdGU6IHJlc3BvbnNlIHdpbGwgYmUgbnVsbCB3aGVuIG5hdmlnYXRpbmcgdG8gc2FtZSB1cmwgd2hpbGUgY2hhbmdpbmcgdGhlIGhhc2ggcGFydC4gdGhlIGNvbmRpdGlvbiBiZWxvdyB3aWxsIGFsd2F5cyBhY2NlcHQgbnVsbCBhcyB2YWxpZCByZXN1bHQuXG4gICAgaWYgKHJlc3BvbnNlICE9PSBudWxsICYmIChyZXNwb25zZSA9PT0gdW5kZWZpbmVkIHx8IHJlc3BvbnNlLnN0YXR1cygpICE9PSBPS19TVEFUVVMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIHRyeWluZyB0byBuYXZpZ2F0ZSB0byB1cmwgJHt1cmx9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBnZXRMb2dpbk9wdGlvbnMoX2NyZWRlbnRpYWxzOiBTY3JhcGVyQ3JlZGVudGlhbHMpOiBMb2dpbk9wdGlvbnMge1xuICAgIHRocm93IG5ldyBFcnJvcihgZ2V0TG9naW5PcHRpb25zKCkgaXMgbm90IGNyZWF0ZWQgaW4gJHt0aGlzLm9wdGlvbnMuY29tcGFueUlkfWApO1xuICB9XG5cbiAgYXN5bmMgZmlsbElucHV0cyhwYWdlT3JGcmFtZTogUGFnZSB8IEZyYW1lLCBmaWVsZHM6IHsgc2VsZWN0b3I6IHN0cmluZywgdmFsdWU6IHN0cmluZ31bXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1vZGlmaWVkID0gWy4uLmZpZWxkc107XG4gICAgY29uc3QgaW5wdXQgPSBtb2RpZmllZC5zaGlmdCgpO1xuXG4gICAgaWYgKCFpbnB1dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBmaWxsSW5wdXQocGFnZU9yRnJhbWUsIGlucHV0LnNlbGVjdG9yLCBpbnB1dC52YWx1ZSk7XG4gICAgaWYgKG1vZGlmaWVkLmxlbmd0aCkge1xuICAgICAgYXdhaXQgdGhpcy5maWxsSW5wdXRzKHBhZ2VPckZyYW1lLCBtb2RpZmllZCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9naW4oY3JlZGVudGlhbHM6IFNjcmFwZXJDcmVkZW50aWFscyk6IFByb21pc2U8U2NyYXBlclNjcmFwaW5nUmVzdWx0PiB7XG4gICAgaWYgKCFjcmVkZW50aWFscyB8fCAhdGhpcy5wYWdlKSB7XG4gICAgICByZXR1cm4gY3JlYXRlR2VuZXJhbEVycm9yKCk7XG4gICAgfVxuXG4gICAgZGVidWcoJ2V4ZWN1dGUgbG9naW4gcHJvY2VzcycpO1xuICAgIGNvbnN0IGxvZ2luT3B0aW9ucyA9IHRoaXMuZ2V0TG9naW5PcHRpb25zKGNyZWRlbnRpYWxzKTtcblxuICAgIGlmIChsb2dpbk9wdGlvbnMudXNlckFnZW50KSB7XG4gICAgICBkZWJ1Zygnc2V0IGN1c3RvbSB1c2VyIGFnZW50IHByb3ZpZGVkIGluIG9wdGlvbnMnKTtcbiAgICAgIGF3YWl0IHRoaXMucGFnZS5zZXRVc2VyQWdlbnQobG9naW5PcHRpb25zLnVzZXJBZ2VudCk7XG4gICAgfVxuXG4gICAgZGVidWcoJ25hdmlnYXRlIHRvIGxvZ2luIHVybCcpO1xuICAgIGF3YWl0IHRoaXMubmF2aWdhdGVUbyhsb2dpbk9wdGlvbnMubG9naW5VcmwsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBsb2dpbk9wdGlvbnMud2FpdFVudGlsKTtcbiAgICBpZiAobG9naW5PcHRpb25zLmNoZWNrUmVhZGluZXNzKSB7XG4gICAgICBkZWJ1ZygnZXhlY3V0ZSBcXCdjaGVja1JlYWRpbmVzc1xcJyBpbnRlcmNlcHRvciBwcm92aWRlZCBpbiBsb2dpbiBvcHRpb25zJyk7XG4gICAgICBhd2FpdCBsb2dpbk9wdGlvbnMuY2hlY2tSZWFkaW5lc3MoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBsb2dpbk9wdGlvbnMuc3VibWl0QnV0dG9uU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkZWJ1Zygnd2FpdCB1bnRpbCBzdWJtaXQgYnV0dG9uIGlzIGF2YWlsYWJsZScpO1xuICAgICAgYXdhaXQgd2FpdFVudGlsRWxlbWVudEZvdW5kKHRoaXMucGFnZSwgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICBsZXQgbG9naW5GcmFtZU9yUGFnZTogKFBhZ2UgfCBGcmFtZSB8IG51bGwpID0gdGhpcy5wYWdlO1xuICAgIGlmIChsb2dpbk9wdGlvbnMucHJlQWN0aW9uKSB7XG4gICAgICBkZWJ1ZygnZXhlY3V0ZSBcXCdwcmVBY3Rpb25cXCcgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gbG9naW4gb3B0aW9ucycpO1xuICAgICAgbG9naW5GcmFtZU9yUGFnZSA9IGF3YWl0IGxvZ2luT3B0aW9ucy5wcmVBY3Rpb24oKSB8fCB0aGlzLnBhZ2U7XG4gICAgfVxuXG4gICAgZGVidWcoJ2ZpbGwgbG9naW4gY29tcG9uZW50cyBpbnB1dCB3aXRoIHJlbGV2YW50IHZhbHVlcycpO1xuICAgIGF3YWl0IHRoaXMuZmlsbElucHV0cyhsb2dpbkZyYW1lT3JQYWdlLCBsb2dpbk9wdGlvbnMuZmllbGRzKTtcbiAgICBkZWJ1ZygnY2xpY2sgb24gbG9naW4gc3VibWl0IGJ1dHRvbicpO1xuICAgIGlmICh0eXBlb2YgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgYXdhaXQgY2xpY2tCdXR0b24obG9naW5GcmFtZU9yUGFnZSwgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yKCk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2dpbmdJbik7XG5cbiAgICBpZiAobG9naW5PcHRpb25zLnBvc3RBY3Rpb24pIHtcbiAgICAgIGRlYnVnKCdleGVjdXRlIFxcJ3Bvc3RBY3Rpb25cXCcgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gbG9naW4gb3B0aW9ucycpO1xuICAgICAgYXdhaXQgbG9naW5PcHRpb25zLnBvc3RBY3Rpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoJ3dhaXQgZm9yIHBhZ2UgbmF2aWdhdGlvbicpO1xuICAgICAgYXdhaXQgd2FpdEZvck5hdmlnYXRpb24odGhpcy5wYWdlKTtcbiAgICB9XG5cbiAgICBkZWJ1ZygnY2hlY2sgbG9naW4gcmVzdWx0Jyk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGdldEN1cnJlbnRVcmwodGhpcy5wYWdlLCB0cnVlKTtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGF3YWl0IGdldEtleUJ5VmFsdWUobG9naW5PcHRpb25zLnBvc3NpYmxlUmVzdWx0cywgY3VycmVudCwgdGhpcy5wYWdlKTtcbiAgICBkZWJ1ZyhgaGFuZGxlIGxvZ2luIHJlc3VsdHMgJHtsb2dpblJlc3VsdH1gKTtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVMb2dpblJlc3VsdChsb2dpblJlc3VsdCk7XG4gIH1cblxuICBhc3luYyB0ZXJtaW5hdGUoX3N1Y2Nlc3M6IGJvb2xlYW4pIHtcbiAgICBkZWJ1ZyhgdGVybWluYXRpbmcgYnJvd3NlciB3aXRoIHN1Y2Nlc3MgPSAke19zdWNjZXNzfWApO1xuICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLlRlcm1pbmF0aW5nKTtcblxuICAgIGlmICghX3N1Y2Nlc3MgJiYgISF0aGlzLm9wdGlvbnMuc3RvcmVGYWlsdXJlU2NyZWVuU2hvdFBhdGgpIHtcbiAgICAgIGRlYnVnKGBjcmVhdGUgYSBzbmFwc2hvdCBiZWZvcmUgdGVybWluYXRlZCBpbiAke3RoaXMub3B0aW9ucy5zdG9yZUZhaWx1cmVTY3JlZW5TaG90UGF0aH1gKTtcbiAgICAgIGF3YWl0IHRoaXMucGFnZS5zY3JlZW5zaG90KHtcbiAgICAgICAgcGF0aDogdGhpcy5vcHRpb25zLnN0b3JlRmFpbHVyZVNjcmVlblNob3RQYXRoLFxuICAgICAgICBmdWxsUGFnZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5icm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5icm93c2VyLmNsb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUxvZ2luUmVzdWx0KGxvZ2luUmVzdWx0OiBMb2dpblJlc3VsdHMpIHtcbiAgICBzd2l0Y2ggKGxvZ2luUmVzdWx0KSB7XG4gICAgICBjYXNlIExvZ2luUmVzdWx0cy5TdWNjZXNzOlxuICAgICAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Mb2dpblN1Y2Nlc3MpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICBjYXNlIExvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmQ6XG4gICAgICBjYXNlIExvZ2luUmVzdWx0cy5Vbmtub3duRXJyb3I6XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2luRmFpbGVkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvclR5cGU6IGxvZ2luUmVzdWx0ID09PSBMb2dpblJlc3VsdHMuSW52YWxpZFBhc3N3b3JkID8gU2NyYXBlckVycm9yVHlwZXMuSW52YWxpZFBhc3N3b3JkIDpcbiAgICAgICAgICAgIFNjcmFwZXJFcnJvclR5cGVzLkdlbmVyYWwsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBgTG9naW4gZmFpbGVkIHdpdGggJHtsb2dpblJlc3VsdH0gZXJyb3JgLFxuICAgICAgICB9O1xuICAgICAgY2FzZSBMb2dpblJlc3VsdHMuQ2hhbmdlUGFzc3dvcmQ6XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkNoYW5nZVBhc3N3b3JkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvclR5cGU6IFNjcmFwZXJFcnJvclR5cGVzLkNoYW5nZVBhc3N3b3JkLFxuICAgICAgICB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIGxvZ2luIHJlc3VsdCBcIiR7bG9naW5SZXN1bHR9XCJgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgQmFzZVNjcmFwZXJXaXRoQnJvd3NlciB9O1xuIl19
269
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcHVwcGV0ZWVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYmFzZVNjcmFwZXIiLCJfbmF2aWdhdGlvbiIsIl9lbGVtZW50c0ludGVyYWN0aW9ucyIsIl9kZWJ1ZyIsIl9lcnJvcnMiLCJfZGVmaW5pdGlvbnMiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIm93bktleXMiLCJvYmplY3QiLCJlbnVtZXJhYmxlT25seSIsImtleXMiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJzeW1ib2xzIiwiZmlsdGVyIiwic3ltIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJ0YXJnZXQiLCJpIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwiZm9yRWFjaCIsImtleSIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiZXhjbHVkZWQiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSIsInNvdXJjZVN5bWJvbEtleXMiLCJpbmRleE9mIiwicHJvdG90eXBlIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJjYWxsIiwic291cmNlS2V5cyIsIlZJRVdQT1JUX1dJRFRIIiwiVklFV1BPUlRfSEVJR0hUIiwiT0tfU1RBVFVTIiwiZGVidWciLCJnZXREZWJ1ZyIsIkxvZ2luQmFzZVJlc3VsdHMiLCJUaW1lb3V0IiwiR2VuZXJpYyIsIkdlbmVyYWwiLCJTY3JhcGVyRXJyb3JUeXBlcyIsInJlc3QiLCJMb2dpblJlc3VsdHMiLCJleHBvcnRzIiwiZ2V0S2V5QnlWYWx1ZSIsInBhZ2UiLCJjb25kaXRpb25zIiwiY29uZGl0aW9uIiwicmVzdWx0IiwiUmVnRXhwIiwidGVzdCIsInRvTG93ZXJDYXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJVbmtub3duRXJyb3IiLCJjcmVhdGVHZW5lcmFsRXJyb3IiLCJzdWNjZXNzIiwiZXJyb3JUeXBlIiwiQmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsIkJhc2VTY3JhcGVyIiwiY29uc3RydWN0b3IiLCJhcmdzIiwiZ2V0Vmlld1BvcnQiLCJ3aWR0aCIsImhlaWdodCIsImluaXRpYWxpemUiLCJlbWl0UHJvZ3Jlc3MiLCJTY3JhcGVyUHJvZ3Jlc3NUeXBlcyIsIkluaXRpYWxpemluZyIsImVudiIsIm9wdGlvbnMiLCJ2ZXJib3NlIiwiREVCVUciLCJwcm9jZXNzIiwiYnJvd3NlciIsImV4ZWN1dGFibGVQYXRoIiwidW5kZWZpbmVkIiwidGltZW91dCIsImhlYWRsZXNzIiwic2hvd0Jyb3dzZXIiLCJwdXBwZXRlZXIiLCJsYXVuY2giLCJwcmVwYXJlQnJvd3NlciIsInBhZ2VzIiwibmV3UGFnZSIsImRlZmF1bHRUaW1lb3V0Iiwic2V0RGVmYXVsdFRpbWVvdXQiLCJwcmVwYXJlUGFnZSIsInZpZXdwb3J0Iiwic2V0Vmlld3BvcnQiLCJvbiIsInJlcXVlc3QiLCJfcmVxdWVzdCRmYWlsdXJlIiwiZmFpbHVyZSIsImVycm9yVGV4dCIsInVybCIsIm5hdmlnYXRlVG8iLCJ3YWl0VW50aWwiLCJwYWdlVG9Vc2UiLCJyZXNwb25zZSIsImdvdG8iLCJzdGF0dXMiLCJFcnJvciIsImdldExvZ2luT3B0aW9ucyIsIl9jcmVkZW50aWFscyIsImNvbXBhbnlJZCIsImZpbGxJbnB1dHMiLCJwYWdlT3JGcmFtZSIsImZpZWxkcyIsIm1vZGlmaWVkIiwiaW5wdXQiLCJzaGlmdCIsImZpbGxJbnB1dCIsInNlbGVjdG9yIiwibG9naW4iLCJjcmVkZW50aWFscyIsImxvZ2luT3B0aW9ucyIsInVzZXJBZ2VudCIsInNldFVzZXJBZ2VudCIsImxvZ2luVXJsIiwiY2hlY2tSZWFkaW5lc3MiLCJzdWJtaXRCdXR0b25TZWxlY3RvciIsIndhaXRVbnRpbEVsZW1lbnRGb3VuZCIsImxvZ2luRnJhbWVPclBhZ2UiLCJwcmVBY3Rpb24iLCJjbGlja0J1dHRvbiIsIkxvZ2dpbmdJbiIsInBvc3RBY3Rpb24iLCJ3YWl0Rm9yTmF2aWdhdGlvbiIsImN1cnJlbnQiLCJnZXRDdXJyZW50VXJsIiwibG9naW5SZXN1bHQiLCJwb3NzaWJsZVJlc3VsdHMiLCJoYW5kbGVMb2dpblJlc3VsdCIsInRlcm1pbmF0ZSIsIl9zdWNjZXNzIiwiVGVybWluYXRpbmciLCJzdG9yZUZhaWx1cmVTY3JlZW5TaG90UGF0aCIsInNjcmVlbnNob3QiLCJwYXRoIiwiZnVsbFBhZ2UiLCJjbG9zZSIsIlN1Y2Nlc3MiLCJMb2dpblN1Y2Nlc3MiLCJJbnZhbGlkUGFzc3dvcmQiLCJMb2dpbkZhaWxlZCIsImVycm9yTWVzc2FnZSIsIkNoYW5nZVBhc3N3b3JkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHB1cHBldGVlciwge1xuICBCcm93c2VyLCBGcmFtZSwgUGFnZSwgTG9hZEV2ZW50LFxufSBmcm9tICdwdXBwZXRlZXInO1xuXG5pbXBvcnQge1xuICBCYXNlU2NyYXBlcixcblxufSBmcm9tICcuL2Jhc2Utc2NyYXBlcic7XG5pbXBvcnQgeyBnZXRDdXJyZW50VXJsLCB3YWl0Rm9yTmF2aWdhdGlvbiB9IGZyb20gJy4uL2hlbHBlcnMvbmF2aWdhdGlvbic7XG5pbXBvcnQgeyBjbGlja0J1dHRvbiwgZmlsbElucHV0LCB3YWl0VW50aWxFbGVtZW50Rm91bmQgfSBmcm9tICcuLi9oZWxwZXJzL2VsZW1lbnRzLWludGVyYWN0aW9ucyc7XG5pbXBvcnQgeyBnZXREZWJ1ZyB9IGZyb20gJy4uL2hlbHBlcnMvZGVidWcnO1xuaW1wb3J0IHsgU2NyYXBlckVycm9yVHlwZXMgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBTY3JhcGVyU2NyYXBpbmdSZXN1bHQsIFNjcmFwZXJDcmVkZW50aWFscyB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFNjcmFwZXJQcm9ncmVzc1R5cGVzIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMnO1xuXG5jb25zdCBWSUVXUE9SVF9XSURUSCA9IDEwMjQ7XG5jb25zdCBWSUVXUE9SVF9IRUlHSFQgPSA3Njg7XG5jb25zdCBPS19TVEFUVVMgPSAyMDA7XG5cbmNvbnN0IGRlYnVnID0gZ2V0RGVidWcoJ2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInKTtcblxuZW51bSBMb2dpbkJhc2VSZXN1bHRzIHtcbiAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgVW5rbm93bkVycm9yID0gJ1VOS05PV05fRVJST1InXG59XG5cbmNvbnN0IHtcbiAgVGltZW91dCwgR2VuZXJpYywgR2VuZXJhbCwgLi4ucmVzdFxufSA9IFNjcmFwZXJFcnJvclR5cGVzO1xuZXhwb3J0IGNvbnN0IExvZ2luUmVzdWx0cyA9IHtcbiAgLi4ucmVzdCxcbiAgLi4uTG9naW5CYXNlUmVzdWx0cyxcbn07XG5cbmV4cG9ydCB0eXBlIExvZ2luUmVzdWx0cyA9IEV4Y2x1ZGU8U2NyYXBlckVycm9yVHlwZXMsXG5TY3JhcGVyRXJyb3JUeXBlcy5UaW1lb3V0XG58IFNjcmFwZXJFcnJvclR5cGVzLkdlbmVyaWNcbnwgU2NyYXBlckVycm9yVHlwZXMuR2VuZXJhbD4gfCBMb2dpbkJhc2VSZXN1bHRzO1xuXG5leHBvcnQgdHlwZSBQb3NzaWJsZUxvZ2luUmVzdWx0cyA9IHtcbiAgW2tleSBpbiBMb2dpblJlc3VsdHNdPzogKHN0cmluZyB8IFJlZ0V4cCB8ICgob3B0aW9ucz86IHsgcGFnZT86IFBhZ2V9KSA9PiBQcm9taXNlPGJvb2xlYW4+KSlbXVxufTtcblxuZXhwb3J0IGludGVyZmFjZSBMb2dpbk9wdGlvbnMge1xuICBsb2dpblVybDogc3RyaW5nO1xuICBjaGVja1JlYWRpbmVzcz86ICgpID0+IFByb21pc2U8dm9pZD47XG4gIGZpZWxkczoge3NlbGVjdG9yOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmd9W107XG4gIHN1Ym1pdEJ1dHRvblNlbGVjdG9yOiBzdHJpbmcgfCAoKCkgPT4gUHJvbWlzZTx2b2lkPik7XG4gIHByZUFjdGlvbj86ICgpID0+IFByb21pc2U8RnJhbWUgfCB2b2lkPjtcbiAgcG9zdEFjdGlvbj86ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHBvc3NpYmxlUmVzdWx0czogUG9zc2libGVMb2dpblJlc3VsdHM7XG4gIHVzZXJBZ2VudD86IHN0cmluZztcbiAgd2FpdFVudGlsPzogTG9hZEV2ZW50O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRLZXlCeVZhbHVlKG9iamVjdDogUG9zc2libGVMb2dpblJlc3VsdHMsIHZhbHVlOiBzdHJpbmcsIHBhZ2U6IFBhZ2UpOiBQcm9taXNlPExvZ2luUmVzdWx0cz4ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBjb25kaXRpb25zID0gb2JqZWN0W2tleV07XG5cbiAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG4gICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgIGlmIChjb25kaXRpb24gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmVzdWx0ID0gY29uZGl0aW9uLnRlc3QodmFsdWUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29uZGl0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGNvbmRpdGlvbih7IHBhZ2UsIHZhbHVlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gY29uZGl0aW9uLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShMb2dpblJlc3VsdHMuVW5rbm93bkVycm9yKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlR2VuZXJhbEVycm9yKCk6IFNjcmFwZXJTY3JhcGluZ1Jlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgc3VjY2VzczogZmFsc2UsXG4gICAgZXJyb3JUeXBlOiBTY3JhcGVyRXJyb3JUeXBlcy5HZW5lcmFsLFxuICB9O1xufVxuXG5jbGFzcyBCYXNlU2NyYXBlcldpdGhCcm93c2VyPFRDcmVkZW50aWFscyBleHRlbmRzIFNjcmFwZXJDcmVkZW50aWFscz4gZXh0ZW5kcyBCYXNlU2NyYXBlcjxUQ3JlZGVudGlhbHM+IHtcbiAgLy8gTk9USUNFIC0gaXQgaXMgZGlzY291cmFnZWQgdG8gdXNlIGJhbmcgKCEpIGluIGdlbmVyYWwuIEl0IGlzIHVzZWQgaGVyZSBiZWNhdXNlXG4gIC8vIGFsbCB0aGUgY2xhc3NlcyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIGJhc2UgYXNzdW1lIGlzIGl0IG1hbmRhdG9yeS5cbiAgcHJvdGVjdGVkIGJyb3dzZXIhOiBCcm93c2VyO1xuXG4gIC8vIE5PVElDRSAtIGl0IGlzIGRpc2NvdXJhZ2VkIHRvIHVzZSBiYW5nICghKSBpbiBnZW5lcmFsLiBJdCBpcyB1c2VkIGhlcmUgYmVjYXVzZVxuICAvLyBhbGwgdGhlIGNsYXNzZXMgdGhhdCBpbmhlcml0IGZyb20gdGhpcyBiYXNlIGFzc3VtZSBpcyBpdCBtYW5kYXRvcnkuXG4gIHByb3RlY3RlZCBwYWdlITogUGFnZTtcblxuICBwcm90ZWN0ZWQgZ2V0Vmlld1BvcnQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiBWSUVXUE9SVF9XSURUSCxcbiAgICAgIGhlaWdodDogVklFV1BPUlRfSEVJR0hULFxuICAgIH07XG4gIH1cblxuICBhc3luYyBpbml0aWFsaXplKCkge1xuICAgIGF3YWl0IHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICBkZWJ1ZygnaW5pdGlhbGl6ZSBzY3JhcGVyJyk7XG4gICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuSW5pdGlhbGl6aW5nKTtcblxuICAgIGxldCBlbnY6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMub3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICBlbnYgPSB7IERFQlVHOiAnKicsIC4uLnByb2Nlc3MuZW52IH07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuYnJvd3NlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5vcHRpb25zLmJyb3dzZXIgIT09IG51bGwpIHtcbiAgICAgIGRlYnVnKCd1c2UgY3VzdG9tIGJyb3dzZXIgaW5zdGFuY2UgcHJvdmlkZWQgaW4gb3B0aW9ucycpO1xuICAgICAgdGhpcy5icm93c2VyID0gdGhpcy5vcHRpb25zLmJyb3dzZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4ZWN1dGFibGVQYXRoID0gdGhpcy5vcHRpb25zLmV4ZWN1dGFibGVQYXRoIHx8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzLm9wdGlvbnMuYXJncyB8fCBbXTtcbiAgICAgIGNvbnN0IHsgdGltZW91dCB9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICBjb25zdCBoZWFkbGVzcyA9ICF0aGlzLm9wdGlvbnMuc2hvd0Jyb3dzZXI7XG4gICAgICBkZWJ1ZyhgbGF1bmNoIGEgYnJvd3NlciB3aXRoIGhlYWRsZXNzIG1vZGUgPSAke2hlYWRsZXNzfWApO1xuICAgICAgdGhpcy5icm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCh7XG4gICAgICAgIGVudixcbiAgICAgICAgaGVhZGxlc3MsXG4gICAgICAgIGV4ZWN1dGFibGVQYXRoLFxuICAgICAgICBhcmdzLFxuICAgICAgICB0aW1lb3V0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcmVwYXJlQnJvd3Nlcikge1xuICAgICAgZGVidWcoJ2V4ZWN1dGUgXFwncHJlcGFyZUJyb3dzZXJcXCcgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gb3B0aW9ucycpO1xuICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLnByZXBhcmVCcm93c2VyKHRoaXMuYnJvd3Nlcik7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmJyb3dzZXIpIHtcbiAgICAgIGRlYnVnKCdmYWlsZWQgdG8gaW5pdGlhdGUgYSBicm93c2VyLCBleGl0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZXMgPSBhd2FpdCB0aGlzLmJyb3dzZXIucGFnZXMoKTtcbiAgICBpZiAocGFnZXMubGVuZ3RoKSB7XG4gICAgICBkZWJ1ZygnYnJvd3NlciBoYXMgYWxyZWFkeSBwYWdlcyBvcGVuLCB1c2UgdGhlIGZpcnN0IG9uZScpO1xuICAgICAgW3RoaXMucGFnZV0gPSBwYWdlcztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoJ2NyZWF0ZSBhIG5ldyBicm93c2VyIHBhZ2UnKTtcbiAgICAgIHRoaXMucGFnZSA9IGF3YWl0IHRoaXMuYnJvd3Nlci5uZXdQYWdlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kZWZhdWx0VGltZW91dCkge1xuICAgICAgdGhpcy5wYWdlLnNldERlZmF1bHRUaW1lb3V0KHRoaXMub3B0aW9ucy5kZWZhdWx0VGltZW91dCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcmVwYXJlUGFnZSkge1xuICAgICAgZGVidWcoJ2V4ZWN1dGUgXFwncHJlcGFyZVBhZ2VcXCcgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gb3B0aW9ucycpO1xuICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLnByZXBhcmVQYWdlKHRoaXMucGFnZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLmdldFZpZXdQb3J0KCk7XG4gICAgZGVidWcoYHNldCB2aWV3cG9ydCB0byB3aWR0aCAke3ZpZXdwb3J0LndpZHRofSwgaGVpZ2h0ICR7dmlld3BvcnQuaGVpZ2h0fWApO1xuICAgIGF3YWl0IHRoaXMucGFnZS5zZXRWaWV3cG9ydCh7XG4gICAgICB3aWR0aDogdmlld3BvcnQud2lkdGgsXG4gICAgICBoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCxcbiAgICB9KTtcblxuICAgIHRoaXMucGFnZS5vbigncmVxdWVzdGZhaWxlZCcsIChyZXF1ZXN0KSA9PiB7XG4gICAgICBkZWJ1ZygnUmVxdWVzdCBmYWlsZWQ6ICVzICVzJywgcmVxdWVzdC5mYWlsdXJlKCk/LmVycm9yVGV4dCwgcmVxdWVzdC51cmwoKSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBuYXZpZ2F0ZVRvKHVybDogc3RyaW5nLCBwYWdlPzogUGFnZSwgdGltZW91dD86IG51bWJlciwgd2FpdFVudGlsOiBMb2FkRXZlbnQgfCB1bmRlZmluZWQgPSAnbG9hZCcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYWdlVG9Vc2UgPSBwYWdlIHx8IHRoaXMucGFnZTtcblxuICAgIGlmICghcGFnZVRvVXNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4uKHRpbWVvdXQgPT09IG51bGwgPyBudWxsIDogeyB0aW1lb3V0IH0pLCB3YWl0VW50aWwgfTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBhZ2VUb1VzZS5nb3RvKHVybCwgb3B0aW9ucyk7XG5cbiAgICAvLyBub3RlOiByZXNwb25zZSB3aWxsIGJlIG51bGwgd2hlbiBuYXZpZ2F0aW5nIHRvIHNhbWUgdXJsIHdoaWxlIGNoYW5naW5nIHRoZSBoYXNoIHBhcnQuIHRoZSBjb25kaXRpb24gYmVsb3cgd2lsbCBhbHdheXMgYWNjZXB0IG51bGwgYXMgdmFsaWQgcmVzdWx0LlxuICAgIGlmIChyZXNwb25zZSAhPT0gbnVsbCAmJiAocmVzcG9uc2UgPT09IHVuZGVmaW5lZCB8fCByZXNwb25zZS5zdGF0dXMoKSAhPT0gT0tfU1RBVFVTKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSB0cnlpbmcgdG8gbmF2aWdhdGUgdG8gdXJsICR7dXJsfWApO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZ2V0TG9naW5PcHRpb25zKF9jcmVkZW50aWFsczogU2NyYXBlckNyZWRlbnRpYWxzKTogTG9naW5PcHRpb25zIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGdldExvZ2luT3B0aW9ucygpIGlzIG5vdCBjcmVhdGVkIGluICR7dGhpcy5vcHRpb25zLmNvbXBhbnlJZH1gKTtcbiAgfVxuXG4gIGFzeW5jIGZpbGxJbnB1dHMocGFnZU9yRnJhbWU6IFBhZ2UgfCBGcmFtZSwgZmllbGRzOiB7IHNlbGVjdG9yOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmd9W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtb2RpZmllZCA9IFsuLi5maWVsZHNdO1xuICAgIGNvbnN0IGlucHV0ID0gbW9kaWZpZWQuc2hpZnQoKTtcblxuICAgIGlmICghaW5wdXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZmlsbElucHV0KHBhZ2VPckZyYW1lLCBpbnB1dC5zZWxlY3RvciwgaW5wdXQudmFsdWUpO1xuICAgIGlmIChtb2RpZmllZC5sZW5ndGgpIHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsbElucHV0cyhwYWdlT3JGcmFtZSwgbW9kaWZpZWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGxvZ2luKGNyZWRlbnRpYWxzOiBTY3JhcGVyQ3JlZGVudGlhbHMpOiBQcm9taXNlPFNjcmFwZXJTY3JhcGluZ1Jlc3VsdD4ge1xuICAgIGlmICghY3JlZGVudGlhbHMgfHwgIXRoaXMucGFnZSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUdlbmVyYWxFcnJvcigpO1xuICAgIH1cblxuICAgIGRlYnVnKCdleGVjdXRlIGxvZ2luIHByb2Nlc3MnKTtcbiAgICBjb25zdCBsb2dpbk9wdGlvbnMgPSB0aGlzLmdldExvZ2luT3B0aW9ucyhjcmVkZW50aWFscyk7XG5cbiAgICBpZiAobG9naW5PcHRpb25zLnVzZXJBZ2VudCkge1xuICAgICAgZGVidWcoJ3NldCBjdXN0b20gdXNlciBhZ2VudCBwcm92aWRlZCBpbiBvcHRpb25zJyk7XG4gICAgICBhd2FpdCB0aGlzLnBhZ2Uuc2V0VXNlckFnZW50KGxvZ2luT3B0aW9ucy51c2VyQWdlbnQpO1xuICAgIH1cblxuICAgIGRlYnVnKCduYXZpZ2F0ZSB0byBsb2dpbiB1cmwnKTtcbiAgICBhd2FpdCB0aGlzLm5hdmlnYXRlVG8obG9naW5PcHRpb25zLmxvZ2luVXJsLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbG9naW5PcHRpb25zLndhaXRVbnRpbCk7XG4gICAgaWYgKGxvZ2luT3B0aW9ucy5jaGVja1JlYWRpbmVzcykge1xuICAgICAgZGVidWcoJ2V4ZWN1dGUgXFwnY2hlY2tSZWFkaW5lc3NcXCcgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gbG9naW4gb3B0aW9ucycpO1xuICAgICAgYXdhaXQgbG9naW5PcHRpb25zLmNoZWNrUmVhZGluZXNzKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgZGVidWcoJ3dhaXQgdW50aWwgc3VibWl0IGJ1dHRvbiBpcyBhdmFpbGFibGUnKTtcbiAgICAgIGF3YWl0IHdhaXRVbnRpbEVsZW1lbnRGb3VuZCh0aGlzLnBhZ2UsIGxvZ2luT3B0aW9ucy5zdWJtaXRCdXR0b25TZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgbGV0IGxvZ2luRnJhbWVPclBhZ2U6IChQYWdlIHwgRnJhbWUgfCBudWxsKSA9IHRoaXMucGFnZTtcbiAgICBpZiAobG9naW5PcHRpb25zLnByZUFjdGlvbikge1xuICAgICAgZGVidWcoJ2V4ZWN1dGUgXFwncHJlQWN0aW9uXFwnIGludGVyY2VwdG9yIHByb3ZpZGVkIGluIGxvZ2luIG9wdGlvbnMnKTtcbiAgICAgIGxvZ2luRnJhbWVPclBhZ2UgPSBhd2FpdCBsb2dpbk9wdGlvbnMucHJlQWN0aW9uKCkgfHwgdGhpcy5wYWdlO1xuICAgIH1cblxuICAgIGRlYnVnKCdmaWxsIGxvZ2luIGNvbXBvbmVudHMgaW5wdXQgd2l0aCByZWxldmFudCB2YWx1ZXMnKTtcbiAgICBhd2FpdCB0aGlzLmZpbGxJbnB1dHMobG9naW5GcmFtZU9yUGFnZSwgbG9naW5PcHRpb25zLmZpZWxkcyk7XG4gICAgZGVidWcoJ2NsaWNrIG9uIGxvZ2luIHN1Ym1pdCBidXR0b24nKTtcbiAgICBpZiAodHlwZW9mIGxvZ2luT3B0aW9ucy5zdWJtaXRCdXR0b25TZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGF3YWl0IGNsaWNrQnV0dG9uKGxvZ2luRnJhbWVPclBhZ2UsIGxvZ2luT3B0aW9ucy5zdWJtaXRCdXR0b25TZWxlY3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGxvZ2luT3B0aW9ucy5zdWJtaXRCdXR0b25TZWxlY3RvcigpO1xuICAgIH1cbiAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Mb2dnaW5nSW4pO1xuXG4gICAgaWYgKGxvZ2luT3B0aW9ucy5wb3N0QWN0aW9uKSB7XG4gICAgICBkZWJ1ZygnZXhlY3V0ZSBcXCdwb3N0QWN0aW9uXFwnIGludGVyY2VwdG9yIHByb3ZpZGVkIGluIGxvZ2luIG9wdGlvbnMnKTtcbiAgICAgIGF3YWl0IGxvZ2luT3B0aW9ucy5wb3N0QWN0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKCd3YWl0IGZvciBwYWdlIG5hdmlnYXRpb24nKTtcbiAgICAgIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHRoaXMucGFnZSk7XG4gICAgfVxuXG4gICAgZGVidWcoJ2NoZWNrIGxvZ2luIHJlc3VsdCcpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBnZXRDdXJyZW50VXJsKHRoaXMucGFnZSwgdHJ1ZSk7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCBnZXRLZXlCeVZhbHVlKGxvZ2luT3B0aW9ucy5wb3NzaWJsZVJlc3VsdHMsIGN1cnJlbnQsIHRoaXMucGFnZSk7XG4gICAgZGVidWcoYGhhbmRsZSBsb2dpbiByZXN1bHRzICR7bG9naW5SZXN1bHR9YCk7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlTG9naW5SZXN1bHQobG9naW5SZXN1bHQpO1xuICB9XG5cbiAgYXN5bmMgdGVybWluYXRlKF9zdWNjZXNzOiBib29sZWFuKSB7XG4gICAgZGVidWcoYHRlcm1pbmF0aW5nIGJyb3dzZXIgd2l0aCBzdWNjZXNzID0gJHtfc3VjY2Vzc31gKTtcbiAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5UZXJtaW5hdGluZyk7XG5cbiAgICBpZiAoIV9zdWNjZXNzICYmICEhdGhpcy5vcHRpb25zLnN0b3JlRmFpbHVyZVNjcmVlblNob3RQYXRoKSB7XG4gICAgICBkZWJ1ZyhgY3JlYXRlIGEgc25hcHNob3QgYmVmb3JlIHRlcm1pbmF0ZWQgaW4gJHt0aGlzLm9wdGlvbnMuc3RvcmVGYWlsdXJlU2NyZWVuU2hvdFBhdGh9YCk7XG4gICAgICBhd2FpdCB0aGlzLnBhZ2Uuc2NyZWVuc2hvdCh7XG4gICAgICAgIHBhdGg6IHRoaXMub3B0aW9ucy5zdG9yZUZhaWx1cmVTY3JlZW5TaG90UGF0aCxcbiAgICAgICAgZnVsbFBhZ2U6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVMb2dpblJlc3VsdChsb2dpblJlc3VsdDogTG9naW5SZXN1bHRzKSB7XG4gICAgc3dpdGNoIChsb2dpblJlc3VsdCkge1xuICAgICAgY2FzZSBMb2dpblJlc3VsdHMuU3VjY2VzczpcbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuTG9naW5TdWNjZXNzKTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgY2FzZSBMb2dpblJlc3VsdHMuSW52YWxpZFBhc3N3b3JkOlxuICAgICAgY2FzZSBMb2dpblJlc3VsdHMuVW5rbm93bkVycm9yOlxuICAgICAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Mb2dpbkZhaWxlZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3JUeXBlOiBsb2dpblJlc3VsdCA9PT0gTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZCA/IFNjcmFwZXJFcnJvclR5cGVzLkludmFsaWRQYXNzd29yZCA6XG4gICAgICAgICAgICBTY3JhcGVyRXJyb3JUeXBlcy5HZW5lcmFsLFxuICAgICAgICAgIGVycm9yTWVzc2FnZTogYExvZ2luIGZhaWxlZCB3aXRoICR7bG9naW5SZXN1bHR9IGVycm9yYCxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgTG9naW5SZXN1bHRzLkNoYW5nZVBhc3N3b3JkOlxuICAgICAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5DaGFuZ2VQYXNzd29yZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3JUeXBlOiBTY3JhcGVyRXJyb3JUeXBlcy5DaGFuZ2VQYXNzd29yZCxcbiAgICAgICAgfTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBsb2dpbiByZXN1bHQgXCIke2xvZ2luUmVzdWx0fVwiYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIgfTtcbiJdLCJt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
@@ -1,25 +1,17 @@
1
1
  "use strict";
2
2
 
3
3
  require("core-js/modules/es.promise");
4
-
5
4
  var _testsUtils = require("../tests/tests-utils");
6
-
7
5
  var _baseScraperWithBrowser = require("./base-scraper-with-browser");
8
-
9
6
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
10
-
11
7
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
12
-
13
8
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
14
-
15
9
  const testsConfig = (0, _testsUtils.getTestsConfig)();
16
-
17
10
  function isNoSandbox(browser) {
18
11
  // eslint-disable-next-line no-underscore-dangle
19
12
  const args = browser._process.spawnargs;
20
13
  return args.includes('--no-sandbox');
21
14
  }
22
-
23
15
  describe('Base scraper with browser', () => {
24
16
  beforeAll(() => {
25
17
  (0, _testsUtils.extendAsyncTimeout)(); // The default timeout is 5 seconds per async test, this function extends the timeout value
@@ -29,32 +21,30 @@ describe('Base scraper with browser', () => {
29
21
  companyId: 'test',
30
22
  showBrowser: false,
31
23
  args: []
32
- }); // avoid false-positive result by confirming that --no-sandbox is not a default flag provided by puppeteer
33
-
24
+ });
34
25
 
26
+ // avoid false-positive result by confirming that --no-sandbox is not a default flag provided by puppeteer
35
27
  let baseScraperWithBrowser = new _baseScraperWithBrowser.BaseScraperWithBrowser(options);
36
-
37
28
  try {
38
- await baseScraperWithBrowser.initialize(); // @ts-ignore
39
-
40
- expect(baseScraperWithBrowser.browser).toBeDefined(); // @ts-ignore
41
-
29
+ await baseScraperWithBrowser.initialize();
30
+ // @ts-ignore
31
+ expect(baseScraperWithBrowser.browser).toBeDefined();
32
+ // @ts-ignore
42
33
  expect(isNoSandbox(baseScraperWithBrowser.browser)).toBe(false);
43
34
  await baseScraperWithBrowser.terminate(true);
44
35
  } catch (e) {
45
36
  await baseScraperWithBrowser.terminate(false);
46
37
  throw e;
47
- } // set --no-sandbox flag and expect it to be passed by puppeteer.lunch to the new created browser instance
48
-
38
+ }
49
39
 
40
+ // set --no-sandbox flag and expect it to be passed by puppeteer.lunch to the new created browser instance
50
41
  options.args = ['--no-sandbox', '--disable-gpu', '--window-size=1920x1080'];
51
42
  baseScraperWithBrowser = new _baseScraperWithBrowser.BaseScraperWithBrowser(options);
52
-
53
43
  try {
54
- await baseScraperWithBrowser.initialize(); // @ts-ignore
55
-
56
- expect(baseScraperWithBrowser.browser).toBeDefined(); // @ts-ignore
57
-
44
+ await baseScraperWithBrowser.initialize();
45
+ // @ts-ignore
46
+ expect(baseScraperWithBrowser.browser).toBeDefined();
47
+ // @ts-ignore
58
48
  expect(isNoSandbox(baseScraperWithBrowser.browser)).toBe(true);
59
49
  await baseScraperWithBrowser.terminate(true);
60
50
  } catch (e) {
@@ -63,4 +53,4 @@ describe('Base scraper with browser', () => {
63
53
  }
64
54
  });
65
55
  });
66
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyLnRlc3QudHMiXSwibmFtZXMiOlsidGVzdHNDb25maWciLCJpc05vU2FuZGJveCIsImJyb3dzZXIiLCJhcmdzIiwiX3Byb2Nlc3MiLCJzcGF3bmFyZ3MiLCJpbmNsdWRlcyIsImRlc2NyaWJlIiwiYmVmb3JlQWxsIiwieHRlc3QiLCJvcHRpb25zIiwiY29tcGFueUlkIiwic2hvd0Jyb3dzZXIiLCJiYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiQmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsImluaXRpYWxpemUiLCJleHBlY3QiLCJ0b0JlRGVmaW5lZCIsInRvQmUiLCJ0ZXJtaW5hdGUiLCJlIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7O0FBR0E7Ozs7Ozs7O0FBRUEsTUFBTUEsV0FBVyxHQUFHLGlDQUFwQjs7QUFFQSxTQUFTQyxXQUFULENBQXFCQyxPQUFyQixFQUFtQztBQUNqQztBQUNBLFFBQU1DLElBQUksR0FBR0QsT0FBTyxDQUFDRSxRQUFSLENBQWlCQyxTQUE5QjtBQUNBLFNBQU9GLElBQUksQ0FBQ0csUUFBTCxDQUFjLGNBQWQsQ0FBUDtBQUNEOztBQUVEQyxRQUFRLENBQUMsMkJBQUQsRUFBOEIsTUFBTTtBQUMxQ0MsRUFBQUEsU0FBUyxDQUFDLE1BQU07QUFDZCwwQ0FEYyxDQUNRO0FBQ3ZCLEdBRlEsQ0FBVDtBQUlBQyxFQUFBQSxLQUFLLENBQUMsZ0RBQUQsRUFBbUQsWUFBWTtBQUNsRSxVQUFNQyxPQUFPLHFCQUNSVixXQUFXLENBQUNVLE9BREo7QUFFWEMsTUFBQUEsU0FBUyxFQUFFLE1BRkE7QUFHWEMsTUFBQUEsV0FBVyxFQUFFLEtBSEY7QUFJWFQsTUFBQUEsSUFBSSxFQUFFO0FBSkssTUFBYixDQURrRSxDQVFsRTs7O0FBQ0EsUUFBSVUsc0JBQXNCLEdBQUcsSUFBSUMsOENBQUosQ0FBMkJKLE9BQTNCLENBQTdCOztBQUNBLFFBQUk7QUFDRixZQUFNRyxzQkFBc0IsQ0FBQ0UsVUFBdkIsRUFBTixDQURFLENBRUY7O0FBQ0FDLE1BQUFBLE1BQU0sQ0FBQ0gsc0JBQXNCLENBQUNYLE9BQXhCLENBQU4sQ0FBdUNlLFdBQXZDLEdBSEUsQ0FJRjs7QUFDQUQsTUFBQUEsTUFBTSxDQUFDZixXQUFXLENBQUNZLHNCQUFzQixDQUFDWCxPQUF4QixDQUFaLENBQU4sQ0FBb0RnQixJQUFwRCxDQUF5RCxLQUF6RDtBQUNBLFlBQU1MLHNCQUFzQixDQUFDTSxTQUF2QixDQUFpQyxJQUFqQyxDQUFOO0FBQ0QsS0FQRCxDQU9FLE9BQU9DLENBQVAsRUFBVTtBQUNWLFlBQU1QLHNCQUFzQixDQUFDTSxTQUF2QixDQUFpQyxLQUFqQyxDQUFOO0FBQ0EsWUFBTUMsQ0FBTjtBQUNELEtBcEJpRSxDQXNCbEU7OztBQUNBVixJQUFBQSxPQUFPLENBQUNQLElBQVIsR0FBZSxDQUNiLGNBRGEsRUFFYixlQUZhLEVBR2IseUJBSGEsQ0FBZjtBQUtBVSxJQUFBQSxzQkFBc0IsR0FBRyxJQUFJQyw4Q0FBSixDQUEyQkosT0FBM0IsQ0FBekI7O0FBQ0EsUUFBSTtBQUNGLFlBQU1HLHNCQUFzQixDQUFDRSxVQUF2QixFQUFOLENBREUsQ0FFRjs7QUFDQUMsTUFBQUEsTUFBTSxDQUFDSCxzQkFBc0IsQ0FBQ1gsT0FBeEIsQ0FBTixDQUF1Q2UsV0FBdkMsR0FIRSxDQUlGOztBQUNBRCxNQUFBQSxNQUFNLENBQUNmLFdBQVcsQ0FBQ1ksc0JBQXNCLENBQUNYLE9BQXhCLENBQVosQ0FBTixDQUFvRGdCLElBQXBELENBQXlELElBQXpEO0FBQ0EsWUFBTUwsc0JBQXNCLENBQUNNLFNBQXZCLENBQWlDLElBQWpDLENBQU47QUFDRCxLQVBELENBT0UsT0FBT0MsQ0FBUCxFQUFVO0FBQ1YsWUFBTVAsc0JBQXNCLENBQUNNLFNBQXZCLENBQWlDLEtBQWpDLENBQU47QUFDQSxZQUFNQyxDQUFOO0FBQ0Q7QUFDRixHQXhDSSxDQUFMO0FBeUNELENBOUNPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBleHRlbmRBc3luY1RpbWVvdXQsIGdldFRlc3RzQ29uZmlnLFxufSBmcm9tICcuLi90ZXN0cy90ZXN0cy11dGlscyc7XG5pbXBvcnQgeyBCYXNlU2NyYXBlcldpdGhCcm93c2VyIH0gZnJvbSAnLi9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyJztcblxuY29uc3QgdGVzdHNDb25maWcgPSBnZXRUZXN0c0NvbmZpZygpO1xuXG5mdW5jdGlvbiBpc05vU2FuZGJveChicm93c2VyOiBhbnkpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVyc2NvcmUtZGFuZ2xlXG4gIGNvbnN0IGFyZ3MgPSBicm93c2VyLl9wcm9jZXNzLnNwYXduYXJncztcbiAgcmV0dXJuIGFyZ3MuaW5jbHVkZXMoJy0tbm8tc2FuZGJveCcpO1xufVxuXG5kZXNjcmliZSgnQmFzZSBzY3JhcGVyIHdpdGggYnJvd3NlcicsICgpID0+IHtcbiAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICBleHRlbmRBc3luY1RpbWVvdXQoKTsgLy8gVGhlIGRlZmF1bHQgdGltZW91dCBpcyA1IHNlY29uZHMgcGVyIGFzeW5jIHRlc3QsIHRoaXMgZnVuY3Rpb24gZXh0ZW5kcyB0aGUgdGltZW91dCB2YWx1ZVxuICB9KTtcblxuICB4dGVzdCgnc2hvdWxkIHBhc3MgY3VzdG9tIGFyZ3MgdG8gc2NyYXBlciBpZiBwcm92aWRlZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgLi4udGVzdHNDb25maWcub3B0aW9ucyxcbiAgICAgIGNvbXBhbnlJZDogJ3Rlc3QnLFxuICAgICAgc2hvd0Jyb3dzZXI6IGZhbHNlLFxuICAgICAgYXJnczogW10sXG4gICAgfTtcblxuICAgIC8vIGF2b2lkIGZhbHNlLXBvc2l0aXZlIHJlc3VsdCBieSBjb25maXJtaW5nIHRoYXQgLS1uby1zYW5kYm94IGlzIG5vdCBhIGRlZmF1bHQgZmxhZyBwcm92aWRlZCBieSBwdXBwZXRlZXJcbiAgICBsZXQgYmFzZVNjcmFwZXJXaXRoQnJvd3NlciA9IG5ldyBCYXNlU2NyYXBlcldpdGhCcm93c2VyKG9wdGlvbnMpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBiYXNlU2NyYXBlcldpdGhCcm93c2VyLmluaXRpYWxpemUoKTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGV4cGVjdChiYXNlU2NyYXBlcldpdGhCcm93c2VyLmJyb3dzZXIpLnRvQmVEZWZpbmVkKCk7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBleHBlY3QoaXNOb1NhbmRib3goYmFzZVNjcmFwZXJXaXRoQnJvd3Nlci5icm93c2VyKSkudG9CZShmYWxzZSk7XG4gICAgICBhd2FpdCBiYXNlU2NyYXBlcldpdGhCcm93c2VyLnRlcm1pbmF0ZSh0cnVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCBiYXNlU2NyYXBlcldpdGhCcm93c2VyLnRlcm1pbmF0ZShmYWxzZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIC8vIHNldCAtLW5vLXNhbmRib3ggZmxhZyBhbmQgZXhwZWN0IGl0IHRvIGJlIHBhc3NlZCBieSBwdXBwZXRlZXIubHVuY2ggdG8gdGhlIG5ldyBjcmVhdGVkIGJyb3dzZXIgaW5zdGFuY2VcbiAgICBvcHRpb25zLmFyZ3MgPSBbXG4gICAgICAnLS1uby1zYW5kYm94JyxcbiAgICAgICctLWRpc2FibGUtZ3B1JyxcbiAgICAgICctLXdpbmRvdy1zaXplPTE5MjB4MTA4MCcsXG4gICAgXTtcbiAgICBiYXNlU2NyYXBlcldpdGhCcm93c2VyID0gbmV3IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIob3B0aW9ucyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZXhwZWN0KGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIuYnJvd3NlcikudG9CZURlZmluZWQoKTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGV4cGVjdChpc05vU2FuZGJveChiYXNlU2NyYXBlcldpdGhCcm93c2VyLmJyb3dzZXIpKS50b0JlKHRydWUpO1xuICAgICAgYXdhaXQgYmFzZVNjcmFwZXJXaXRoQnJvd3Nlci50ZXJtaW5hdGUodHJ1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgYmFzZVNjcmFwZXJXaXRoQnJvd3Nlci50ZXJtaW5hdGUoZmFsc2UpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH0pO1xufSk7XG4iXX0=
56
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdHNVdGlscyIsInJlcXVpcmUiLCJfYmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsIm93bktleXMiLCJvYmplY3QiLCJlbnVtZXJhYmxlT25seSIsImtleXMiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJzeW1ib2xzIiwiZmlsdGVyIiwic3ltIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJ0YXJnZXQiLCJpIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwiZm9yRWFjaCIsImtleSIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJvYmoiLCJ2YWx1ZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwidGVzdHNDb25maWciLCJnZXRUZXN0c0NvbmZpZyIsImlzTm9TYW5kYm94IiwiYnJvd3NlciIsImFyZ3MiLCJfcHJvY2VzcyIsInNwYXduYXJncyIsImluY2x1ZGVzIiwiZGVzY3JpYmUiLCJiZWZvcmVBbGwiLCJleHRlbmRBc3luY1RpbWVvdXQiLCJ4dGVzdCIsIm9wdGlvbnMiLCJjb21wYW55SWQiLCJzaG93QnJvd3NlciIsImJhc2VTY3JhcGVyV2l0aEJyb3dzZXIiLCJCYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiaW5pdGlhbGl6ZSIsImV4cGVjdCIsInRvQmVEZWZpbmVkIiwidG9CZSIsInRlcm1pbmF0ZSIsImUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyYXBlcnMvYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlci50ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGV4dGVuZEFzeW5jVGltZW91dCwgZ2V0VGVzdHNDb25maWcsXG59IGZyb20gJy4uL3Rlc3RzL3Rlc3RzLXV0aWxzJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIgfSBmcm9tICcuL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInO1xuXG5jb25zdCB0ZXN0c0NvbmZpZyA9IGdldFRlc3RzQ29uZmlnKCk7XG5cbmZ1bmN0aW9uIGlzTm9TYW5kYm94KGJyb3dzZXI6IGFueSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcbiAgY29uc3QgYXJncyA9IGJyb3dzZXIuX3Byb2Nlc3Muc3Bhd25hcmdzO1xuICByZXR1cm4gYXJncy5pbmNsdWRlcygnLS1uby1zYW5kYm94Jyk7XG59XG5cbmRlc2NyaWJlKCdCYXNlIHNjcmFwZXIgd2l0aCBicm93c2VyJywgKCkgPT4ge1xuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIGV4dGVuZEFzeW5jVGltZW91dCgpOyAvLyBUaGUgZGVmYXVsdCB0aW1lb3V0IGlzIDUgc2Vjb25kcyBwZXIgYXN5bmMgdGVzdCwgdGhpcyBmdW5jdGlvbiBleHRlbmRzIHRoZSB0aW1lb3V0IHZhbHVlXG4gIH0pO1xuXG4gIHh0ZXN0KCdzaG91bGQgcGFzcyBjdXN0b20gYXJncyB0byBzY3JhcGVyIGlmIHByb3ZpZGVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAuLi50ZXN0c0NvbmZpZy5vcHRpb25zLFxuICAgICAgY29tcGFueUlkOiAndGVzdCcsXG4gICAgICBzaG93QnJvd3NlcjogZmFsc2UsXG4gICAgICBhcmdzOiBbXSxcbiAgICB9O1xuXG4gICAgLy8gYXZvaWQgZmFsc2UtcG9zaXRpdmUgcmVzdWx0IGJ5IGNvbmZpcm1pbmcgdGhhdCAtLW5vLXNhbmRib3ggaXMgbm90IGEgZGVmYXVsdCBmbGFnIHByb3ZpZGVkIGJ5IHB1cHBldGVlclxuICAgIGxldCBiYXNlU2NyYXBlcldpdGhCcm93c2VyID0gbmV3IEJhc2VTY3JhcGVyV2l0aEJyb3dzZXIob3B0aW9ucyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZXhwZWN0KGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIuYnJvd3NlcikudG9CZURlZmluZWQoKTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGV4cGVjdChpc05vU2FuZGJveChiYXNlU2NyYXBlcldpdGhCcm93c2VyLmJyb3dzZXIpKS50b0JlKGZhbHNlKTtcbiAgICAgIGF3YWl0IGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIudGVybWluYXRlKHRydWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF3YWl0IGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIudGVybWluYXRlKGZhbHNlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgLy8gc2V0IC0tbm8tc2FuZGJveCBmbGFnIGFuZCBleHBlY3QgaXQgdG8gYmUgcGFzc2VkIGJ5IHB1cHBldGVlci5sdW5jaCB0byB0aGUgbmV3IGNyZWF0ZWQgYnJvd3NlciBpbnN0YW5jZVxuICAgIG9wdGlvbnMuYXJncyA9IFtcbiAgICAgICctLW5vLXNhbmRib3gnLFxuICAgICAgJy0tZGlzYWJsZS1ncHUnLFxuICAgICAgJy0td2luZG93LXNpemU9MTkyMHgxMDgwJyxcbiAgICBdO1xuICAgIGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIgPSBuZXcgQmFzZVNjcmFwZXJXaXRoQnJvd3NlcihvcHRpb25zKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYmFzZVNjcmFwZXJXaXRoQnJvd3Nlci5pbml0aWFsaXplKCk7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBleHBlY3QoYmFzZVNjcmFwZXJXaXRoQnJvd3Nlci5icm93c2VyKS50b0JlRGVmaW5lZCgpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZXhwZWN0KGlzTm9TYW5kYm94KGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIuYnJvd3NlcikpLnRvQmUodHJ1ZSk7XG4gICAgICBhd2FpdCBiYXNlU2NyYXBlcldpdGhCcm93c2VyLnRlcm1pbmF0ZSh0cnVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCBiYXNlU2NyYXBlcldpdGhCcm93c2VyLnRlcm1pbmF0ZShmYWxzZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsV0FBQSxHQUFBQyxPQUFBO0FBR0EsSUFBQUMsdUJBQUEsR0FBQUQsT0FBQTtBQUFxRSxTQUFBRSxRQUFBQyxNQUFBLEVBQUFDLGNBQUEsUUFBQUMsSUFBQSxHQUFBQyxNQUFBLENBQUFELElBQUEsQ0FBQUYsTUFBQSxPQUFBRyxNQUFBLENBQUFDLHFCQUFBLFFBQUFDLE9BQUEsR0FBQUYsTUFBQSxDQUFBQyxxQkFBQSxDQUFBSixNQUFBLE9BQUFDLGNBQUEsRUFBQUksT0FBQSxHQUFBQSxPQUFBLENBQUFDLE1BQUEsV0FBQUMsR0FBQSxXQUFBSixNQUFBLENBQUFLLHdCQUFBLENBQUFSLE1BQUEsRUFBQU8sR0FBQSxFQUFBRSxVQUFBLE1BQUFQLElBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULElBQUEsRUFBQUcsT0FBQSxZQUFBSCxJQUFBO0FBQUEsU0FBQVUsY0FBQUMsTUFBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLEVBQUFGLENBQUEsVUFBQUcsTUFBQSxHQUFBRixTQUFBLENBQUFELENBQUEsWUFBQUMsU0FBQSxDQUFBRCxDQUFBLFlBQUFBLENBQUEsUUFBQWYsT0FBQSxDQUFBSSxNQUFBLENBQUFjLE1BQUEsU0FBQUMsT0FBQSxXQUFBQyxHQUFBLElBQUFDLGVBQUEsQ0FBQVAsTUFBQSxFQUFBTSxHQUFBLEVBQUFGLE1BQUEsQ0FBQUUsR0FBQSxtQkFBQWhCLE1BQUEsQ0FBQWtCLHlCQUFBLElBQUFsQixNQUFBLENBQUFtQixnQkFBQSxDQUFBVCxNQUFBLEVBQUFWLE1BQUEsQ0FBQWtCLHlCQUFBLENBQUFKLE1BQUEsYUFBQWxCLE9BQUEsQ0FB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