system-testing 1.0.84 → 1.0.86

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.
@@ -77,6 +77,7 @@ function getSendKeysUsesSelectAllAndDelete(...args) {
77
77
  * @typedef {object} FindArgs
78
78
  * @property {number} [timeout] Override timeout for lookup.
79
79
  * @property {boolean | null} [visible] Whether to require elements to be visible (`true`) or hidden (`false`). Use `null` to disable visibility filtering.
80
+ * @property {boolean} [scrollTo] Whether to scroll found elements into view before returning them.
80
81
  * @property {boolean} [useBaseSelector] Whether to scope by the base selector.
81
82
  */
82
83
  /**
@@ -246,7 +247,7 @@ export default class WebDriverDriver {
246
247
  * @returns {Promise<import("selenium-webdriver").WebElement[]>}
247
248
  */
248
249
  async all(selector, args = {}) {
249
- const { visible = true, timeout, useBaseSelector = true, ...restArgs } = args;
250
+ const { scrollTo = false, visible = true, timeout, useBaseSelector = true, ...restArgs } = args;
250
251
  const restArgsKeys = Object.keys(restArgs);
251
252
  let actualTimeout;
252
253
  if (timeout === undefined) {
@@ -306,6 +307,11 @@ export default class WebDriverDriver {
306
307
  throw errorWithCause(`Couldn't get elements with selector: ${actualSelector}: ${error instanceof Error ? error.message : error}`, error);
307
308
  }
308
309
  }
310
+ if (scrollTo) {
311
+ for (const element of elements) {
312
+ await this.scrollElementIntoView(element);
313
+ }
314
+ }
309
315
  return elements;
310
316
  }
311
317
  /**
@@ -667,4 +673,4 @@ export default class WebDriverDriver {
667
673
  }
668
674
  }
669
675
  }
670
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViZHJpdmVyLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL3dlYmRyaXZlci1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDN0QsT0FBTyxPQUFPLE1BQU0sbUNBQW1DLENBQUE7QUFDdkQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUUvQzs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUs7SUFDcEMsTUFBTSxLQUFLLEdBQUcsdUNBQXVDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQzFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ25CLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsa0JBQWtCLENBQUMsT0FBTztJQUNqQyxPQUFPLE9BQU8sQ0FDWixPQUFPO1FBQ1AsT0FBTyxPQUFPLEtBQUssUUFBUTtRQUMzQixPQUFPLElBQUksT0FBTztRQUNsQixPQUFPLE9BQU8sQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUNwQyxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQUs7SUFDekIsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7UUFDM0IsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQTtJQUMvQixDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsNkJBQTZCLENBQUMsS0FBSztJQUMxQyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUE7SUFFeEIsT0FBTyxZQUFZ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QU8sTUFBTSxRQUFRLEVBQUUsQ0FBQTtRQUN6QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksS0FBSyxZQUFZLGNBQWMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLGNBQWMsQ0FBQyxZQUFZLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUNyRixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxLQUFLLENBQUE7WUFDYixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QnksIGVycm9yIGFzIFNlbGVuaXVtRXJyb3J9IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXJcIlxuaW1wb3J0IGxvZ2dpbmcgZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlci9saWIvbG9nZ2luZy5qc1wiXG5pbXBvcnQge3dhaXR9IGZyb20gXCJhd2FpdGVyeVwiXG5pbXBvcnQgdGltZW91dCBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2F1c2VcbiAqIEByZXR1cm5zIHtFcnJvciAmIHtjYXVzZTogdW5rbm93bn19XG4gKi9cbmZ1bmN0aW9uIGVycm9yV2l0aENhdXNlKG1lc3NhZ2UsIGNhdXNlKSB7XG4gIGNvbnN0IGVycm9yID0gLyoqIEB0eXBlIHtFcnJvciAmIHtjYXVzZTogdW5rbm93bn19ICovIChuZXcgRXJyb3IobWVzc2FnZSkpXG4gIGVycm9yLmNhdXNlID0gY2F1c2VcbiAgcmV0dXJuIGVycm9yXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBlbGVtZW50XG4gKiBAcmV0dXJucyB7ZWxlbWVudCBpcyBpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gaXNXZWJEcml2ZXJFbGVtZW50KGVsZW1lbnQpIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgZWxlbWVudCAmJlxuICAgIHR5cGVvZiBlbGVtZW50ID09PSBcIm9iamVjdFwiICYmXG4gICAgXCJnZXRJZFwiIGluIGVsZW1lbnQgJiZcbiAgICB0eXBlb2YgZWxlbWVudC5nZXRJZCA9PT0gXCJmdW5jdGlvblwiXG4gIClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBnZXRFcnJvck5hbWUoZXJyb3IpIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IuY29uc3RydWN0b3IubmFtZVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3JcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGdldFJldHJ5YWJsZUludGVyYWN0RXJyb3JOYW1lKGVycm9yKSB7XG4gIGxldCBjdXJyZW50RXJyb3IgPSBlcnJvclxuXG4gIHdoaWxlIChjdXJyZW50RXJyb3IpIHtcbiAgICBjb25zdCBlcnJvck5hbWUgPSBnZXRFcnJvck5hbWUoY3VycmVudEVycm9yKVxuXG4gICAgaWYgKGVycm9yTmFtZSA9PT0gXCJFbGVtZW50Tm90SW50ZXJhY3RhYmxlRXJyb3JcIiB8fCBlcnJvck5hbWUgPT09IFwiRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvclwiIHx8IGVycm9yTmFtZSA9PT0gXCJTdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvclwiKSB7XG4gICAgICByZXR1cm4gZXJyb3JOYW1lXG4gICAgfVxuXG4gICAgaWYgKCEoY3VycmVudEVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHx8ICEoXCJjYXVzZVwiIGluIGN1cnJlbnRFcnJvcikpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjdXJyZW50RXJyb3IgPSBjdXJyZW50RXJyb3IuY2F1c2VcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0U2VuZEtleXNUZXh0QXBwZW5kKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3NcbiAgICAubWFwKChhcmcpID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZ0FyZyA9IFN0cmluZyhhcmcpXG5cbiAgICAgIGlmICgvW1xcdUUwMDlcXHVFMDNEXWFcXHVFMDAwL2kudGVzdChzdHJpbmdBcmcpKSB7XG4gICAgICAgIHJldHVybiBcIlwiXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdHJpbmdBcmcucmVwbGFjZSgvW1xcdUUwMDAtXFx1RjhGRl0vZywgXCJcIilcbiAgICB9KVxuICAgIC5qb2luKFwiXCIpXG59XG5cbi8qKlxuICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBnZXRTZW5kS2V5c1VzZXNTZWxlY3RBbGxBbmREZWxldGUoLi4uYXJncykge1xuICByZXR1cm4gYXJncy5zb21lKChhcmcpID0+IC9bXFx1RTAwOVxcdUUwM0RdYVxcdUUwMDAvaS50ZXN0KFN0cmluZyhhcmcpKSkgJiZcbiAgICBhcmdzLnNvbWUoKGFyZykgPT4gU3RyaW5nKGFyZykuaW5jbHVkZXMoXCJcXHVFMDAzXCIpIHx8IFN0cmluZyhhcmcpLmluY2x1ZGVzKFwiXFx1RTAxN1wiKSlcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGaW5kQXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSBPdmVycmlkZSB0aW1lb3V0IGZvciBsb29rdXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBudWxsfSBbdmlzaWJsZV0gV2hldGhlciB0byByZXF1aXJlIGVsZW1lbnRzIHRvIGJlIHZpc2libGUgKGB0cnVlYCkgb3IgaGlkZGVuIChgZmFsc2VgKS4gVXNlIGBudWxsYCB0byBkaXNhYmxlIHZpc2liaWxpdHkgZmlsdGVyaW5nLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtGaW5kQXJncyAmIHt3aXRoRmFsbGJhY2s/OiBib29sZWFufX0gSW50ZXJhY3RBcmdzXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gV2FpdEZvck5vU2VsZWN0b3JBcmdzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VCYXNlU2VsZWN0b3JdIFdoZXRoZXIgdG8gc2NvcGUgYnkgdGhlIGJhc2Ugc2VsZWN0b3IuXG4gKi9cblxuY2xhc3MgRWxlbWVudE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBFcnJvciB7IH1cbmNvbnN0IHtXZWJEcml2ZXJFcnJvcn0gPSBTZWxlbml1bUVycm9yXG5cbi8qKlxuICogQmFzZSBkcml2ZXIgdXNpbmcgc2VsZW5pdW0td2ViZHJpdmVyIHNlc3Npb25zLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJEcml2ZXJEcml2ZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9icm93c2VyLmpzXCIpLmRlZmF1bHR9IGFyZ3MuYnJvd3NlclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFthcmdzLm9wdGlvbnNdXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7YnJvd3Nlciwgb3B0aW9ucyA9IHt9fSkge1xuICAgIHRoaXMuYnJvd3NlciA9IGJyb3dzZXJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5iYXNlVXJsID0gdW5kZWZpbmVkXG4gICAgdGhpcy53ZWJEcml2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLl9kcml2ZXJUaW1lb3V0cyA9IDUwMDBcbiAgICB0aGlzLl90aW1lb3V0cyA9IDUwMDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVybFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldEJhc2VVcmwoYmFzZVVybCkge1xuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmxcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBnZXRCYXNlVXJsKCkge1xuICAgIGlmICghdGhpcy5iYXNlVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEcml2ZXIgYmFzZSBVUkwgaGFzIG5vdCBiZWVuIHNldFwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJhc2VVcmxcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuICBnZXRUaW1lb3V0cygpIHsgcmV0dXJuIHRoaXMuX3RpbWVvdXRzIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJEcml2ZXJ9XG4gICAqL1xuICBnZXRXZWJEcml2ZXIoKSB7XG4gICAgaWYgKCF0aGlzLndlYkRyaXZlcikgdGhyb3cgbmV3IEVycm9yKFwiRHJpdmVyIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKVxuICAgIHRoaXMuYnJvd3Nlci50aHJvd0lmSHR0cFNlcnZlckVycm9yKClcblxuICAgIHJldHVybiB0aGlzLndlYkRyaXZlclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkRyaXZlcn0gd2ViRHJpdmVyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0V2ViRHJpdmVyKHdlYkRyaXZlcikge1xuICAgIHRoaXMud2ViRHJpdmVyID0gd2ViRHJpdmVyXG4gICAgdGhpcy5icm93c2VyLmRyaXZlciA9IHdlYkRyaXZlclxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic3RhcnQoKSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkcml2ZXJcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgaWYgKHRoaXMud2ViRHJpdmVyKSB7XG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHF1aXR0aW5nIFdlYkRyaXZlclwifSwgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy53ZWJEcml2ZXIucXVpdCgpKVxuICAgIH1cblxuICAgIHRoaXMud2ViRHJpdmVyID0gdW5kZWZpbmVkXG4gICAgdGhpcy5icm93c2VyLmRyaXZlciA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdUaW1lb3V0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZHJpdmVyU2V0VGltZW91dHMobmV3VGltZW91dCkge1xuICAgIHRoaXMuX2RyaXZlclRpbWVvdXRzID0gbmV3VGltZW91dFxuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkuc2V0VGltZW91dHMoe2ltcGxpY2l0OiBuZXdUaW1lb3V0fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlc3RvcmVUaW1lb3V0cygpIHtcbiAgICBpZiAoIXRoaXMuZ2V0VGltZW91dHMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGltZW91dHMgaGF2ZW4ndCBwcmV2aW91c2x5IGJlZW4gc2V0XCIpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5kcml2ZXJTZXRUaW1lb3V0cyh0aGlzLmdldFRpbWVvdXRzKCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1RpbWVvdXRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzZXRUaW1lb3V0cyhuZXdUaW1lb3V0KSB7XG4gICAgdGhpcy5fdGltZW91dHMgPSBuZXdUaW1lb3V0XG4gICAgYXdhaXQgdGhpcy5yZXN0b3JlVGltZW91dHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5icm93c2VyLmdldFNlbGVjdG9yKHNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZHJpdmVyVmlzaXQocGF0aCkge1xuICAgIGNvbnN0IGlzQWJzb2x1dGVVcmwgPSAvXlthLXpdKzpcXC9cXC8vaS50ZXN0KHBhdGgpXG4gICAgY29uc3QgdXJsID0gaXNBYnNvbHV0ZVVybCA/IHBhdGggOiBgJHt0aGlzLmdldEJhc2VVcmwoKX0ke3BhdGh9YFxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5nZXQodXJsKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59ICovXG4gIGFzeW5jIGdldEN1cnJlbnRVcmwoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmdldEN1cnJlbnRVcmwoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFwiXCJcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gKi9cbiAgYXN5bmMgZ2V0SFRNTCgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5nZXRQYWdlU291cmNlKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyB0YWtlU2NyZWVuc2hvdCgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS50YWtlU2NyZWVuc2hvdCgpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBicm93c2VyIGxvZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgZ2V0QnJvd3NlckxvZ3MoKSB7XG4gICAgbGV0IGVudHJpZXNcblxuICAgIHRyeSB7XG4gICAgICBlbnRyaWVzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5sb2dzKCkuZ2V0KGxvZ2dpbmcuVHlwZS5CUk9XU0VSKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICAgIGNvbnN0IGJyb3dzZXJMb2dzID0gW11cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3QgbWVzc2FnZU1hdGNoID0gZW50cnkubWVzc2FnZS5tYXRjaCgvXiguKykgKFxcZCspOihcXGQrKSAoLispJC8pXG4gICAgICBsZXQgbWVzc2FnZVxuXG4gICAgICBpZiAobWVzc2FnZU1hdGNoKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlTWF0Y2hbNF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UgPSBlbnRyeS5tZXNzYWdlXG4gICAgICB9XG5cbiAgICAgIGJyb3dzZXJMb2dzLnB1c2goYCR7ZW50cnkubGV2ZWwubmFtZX06ICR7bWVzc2FnZX1gKVxuICAgIH1cblxuICAgIHJldHVybiBicm93c2VyTG9nc1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBieSBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdPn1cbiAgICovXG4gIGFzeW5jIGFsbChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge3Zpc2libGUgPSB0cnVlLCB0aW1lb3V0LCB1c2VCYXNlU2VsZWN0b3IgPSB0cnVlLCAuLi5yZXN0QXJnc30gPSBhcmdzXG4gICAgY29uc3QgcmVzdEFyZ3NLZXlzID0gT2JqZWN0LmtleXMocmVzdEFyZ3MpXG4gICAgbGV0IGFjdHVhbFRpbWVvdXRcblxuICAgIGlmICh0aW1lb3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFjdHVhbFRpbWVvdXQgPSB0aGlzLl9kcml2ZXJUaW1lb3V0c1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGltZW91dFxuICAgIH1cblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFyZ3VtZW50czogJHtyZXN0QXJnc0tleXMuam9pbihcIiwgXCIpfWApXG5cbiAgICBjb25zdCBhY3R1YWxTZWxlY3RvciA9IHVzZUJhc2VTZWxlY3RvciA/IHRoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpIDogc2VsZWN0b3JcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgY29uc3QgZ2V0VGltZUxlZnQgPSAoKSA9PiBNYXRoLm1heChhY3R1YWxUaW1lb3V0IC0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpLCAwKVxuICAgIGNvbnN0IGdldEVsZW1lbnRzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZm91bmRFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKEJ5LmNzcyhhY3R1YWxTZWxlY3RvcikpXG5cbiAgICAgIGlmICh2aXNpYmxlICE9PSB0cnVlICYmIHZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmb3VuZEVsZW1lbnRzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZm91bmRFbGVtZW50cykge1xuICAgICAgICBjb25zdCBpc0Rpc3BsYXllZCA9IGF3YWl0IGVsZW1lbnQuaXNEaXNwbGF5ZWQoKVxuXG4gICAgICAgIGlmICh2aXNpYmxlICYmICFpc0Rpc3BsYXllZCkgY29udGludWVcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGlzRGlzcGxheWVkKSBjb250aW51ZVxuXG4gICAgICAgIGZpbHRlcmVkRWxlbWVudHMucHVzaChlbGVtZW50KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsdGVyZWRFbGVtZW50c1xuICAgIH1cbiAgICBsZXQgZWxlbWVudHMgPSBbXVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHRpbWVMZWZ0ID0gYWN0dWFsVGltZW91dCA9PSAwID8gMCA6IGdldFRpbWVMZWZ0KClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRpbWVMZWZ0ID09IDApIHtcbiAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLndhaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgfSwgdGltZUxlZnQpXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGV0IGlzU3RhbGVFbGVtZW50RXJyb3IgPSBmYWxzZVxuXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlbGVuaXVtRXJyb3IuU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IpIHtcbiAgICAgICAgICBpc1N0YWxlRWxlbWVudEVycm9yID0gdHJ1ZVxuICAgICAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgV2ViRHJpdmVyRXJyb3IgJiYgZXJyb3IubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwic3RhbGUgZWxlbWVudCByZWZlcmVuY2VcIikpIHtcbiAgICAgICAgICBpc1N0YWxlRWxlbWVudEVycm9yID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIChlcnJvciBpbnN0YW5jZW9mIFNlbGVuaXVtRXJyb3IuVGltZW91dEVycm9yIHx8IGlzU3RhbGVFbGVtZW50RXJyb3IpXG4gICAgICAgICAgJiYgZ2V0VGltZUxlZnQoKSA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBDb3VsZG4ndCBnZXQgZWxlbWVudHMgd2l0aCBzZWxlY3RvcjogJHthY3R1YWxTZWxlY3Rvcn06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50c1xuXG4gICAgdHJ5IHtcbiAgICAgIGVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoc2VsZWN0b3IsIGFyZ3MpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9IC0gJHtlcnJvci5tZXNzYWdlfSAoc2VsZWN0b3I6ICR7dGhpcy5nZXRTZWxlY3RvcihzZWxlY3Rvcil9KWAsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHt0eXBlb2YgZXJyb3J9IC0gJHtlcnJvcn0gKHNlbGVjdG9yOiAke3RoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpfSlgLCBlcnJvcilcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gMSBlbGVtZW50cyAoJHtlbGVtZW50cy5sZW5ndGh9KSB3YXMgZm91bmQgYnkgQ1NTOiAke3RoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpfWApXG4gICAgfVxuXG4gICAgaWYgKCFlbGVtZW50c1swXSkge1xuICAgICAgY29uc3QgZWxhcHNlZFNlY29uZHMgPSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSkgLyAxMDAwXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoYEVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYWZ0ZXIgJHtlbGFwc2VkU2Vjb25kcy50b0ZpeGVkKDIpfXMgYnkgQ1NTOiAke3RoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzWzBdXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSB0ZXN0IElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeVRlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kKGBbZGF0YS10ZXN0aWQ9JyR7dGVzdElEfSddYCwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHwoe3NlbGVjdG9yOiBzdHJpbmd9ICYgRmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn0pfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBfZmluZEVsZW1lbnQoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9ICovXG4gICAgbGV0IGVsZW1lbnRcblxuICAgIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kKGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PSBcIm9iamVjdFwiICYmIGVsZW1lbnRPcklkZW50aWZpZXIgIT09IG51bGwgJiYgXCJzZWxlY3RvclwiIGluIGVsZW1lbnRPcklkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IHtzZWxlY3RvciwgLi4ucmVzdEFyZ3N9ID0gZWxlbWVudE9ySWRlbnRpZmllclxuXG4gICAgICBkZWxldGUgcmVzdEFyZ3Mud2l0aEZhbGxiYWNrXG5cbiAgICAgIGVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmQoc2VsZWN0b3IsIHJlc3RBcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gKi8gKGVsZW1lbnRPcklkZW50aWZpZXIpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IENTUyBzZWxlY3RvciB3aXRob3V0IHdhaXRpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kTm9XYWl0KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmRyaXZlclNldFRpbWVvdXRzKDApXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZChzZWxlY3RvciwgYXJncylcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlVGltZW91dHMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGlja3MgYW4gZWxlbWVudCwgYWxsb3dpbmcgc2VsZWN0b3IgYXJncyB3aGVuIHVzaW5nIGEgQ1NTIHNlbGVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjbGljayhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKSB7XG4gICAgbGV0IHRyaWVzID0gMFxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyaWVzKytcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuX2ZpbmRFbGVtZW50KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLmdldFdlYkRyaXZlcigpLmFjdGlvbnMoe2FzeW5jOiB0cnVlfSlcblxuICAgICAgICBhd2FpdCBhY3Rpb25zLm1vdmUoe29yaWdpbjogZWxlbWVudH0pLmNsaWNrKCkucGVyZm9ybSgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvci5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIkVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3JcIiB8fCBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yXCIpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgICAgfSBlbHNlIGlmIChlcnJvci5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIkVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvclwiKSB7XG4gICAgICAgICAgICBpZiAodHJpZXMgPj0gMykge1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgRWxlbWVudCAke2VsZW1lbnRPcklkZW50aWZpZXIuY29uc3RydWN0b3IubmFtZX0gY2xpY2sgZmFpbGVkIGFmdGVyICR7dHJpZXN9IHRyaWVzIC0gJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWAsIGVycm9yKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXdhaXQgd2FpdCg1MClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYEVsZW1lbnQgJHtlbGVtZW50T3JJZGVudGlmaWVyLmNvbnN0cnVjdG9yLm5hbWV9IGNsaWNrIGZhaWxlZCAtICR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLCBlcnJvcilcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYEVsZW1lbnQgJHtlbGVtZW50T3JJZGVudGlmaWVyLmNvbnN0cnVjdG9yLm5hbWV9IGNsaWNrIGZhaWxlZCAtICR7dHlwZW9mIGVycm9yfTogJHtlcnJvcn1gLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsRWxlbWVudEludG9WaWV3KGVsZW1lbnQpIHtcbiAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmFjdGlvbnMoe2FzeW5jOiB0cnVlfSkubW92ZSh7b3JpZ2luOiBlbGVtZW50fSkucGVyZm9ybSgpXG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyBhbiBlbGVtZW50IGludG8gdmlldy5cbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8KHtzZWxlY3Rvcjogc3RyaW5nfSAmIEZpbmRBcmdzICYge3dpdGhGYWxsYmFjaz86IGJvb2xlYW59KX0gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzY3JvbGxJbnRvVmlldyhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuX2ZpbmRFbGVtZW50KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG4gICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIHRoZSBlbGVtZW50IHdpdGggdGhlIGdpdmVuIHRlc3QgSUQgaW50byB2aWV3LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNjcm9sbFRlc3RJZEludG9WaWV3KHRlc3RJRCwgYXJncykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmRCeVRlc3RJRCh0ZXN0SUQsIGFyZ3MpXG4gICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcmFjdHMgd2l0aCBhbiBlbGVtZW50IGJ5IGNhbGxpbmcgYSBtZXRob2Qgb24gaXQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLlxuICAgKiBSZXRyeWluZyBvbiBFbGVtZW50Tm90SW50ZXJhY3RhYmxlRXJyb3IsIEVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3IsIG9yIFN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fHN0cmluZ3x7c2VsZWN0b3I6IHN0cmluZ30gJiBJbnRlcmFjdEFyZ3N9IGVsZW1lbnRPcklkZW50aWZpZXIgVGhlIGVsZW1lbnQgb3IgYSBDU1Mgc2VsZWN0b3IgdG8gZmluZCB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBuYW1lIHRvIGNhbGwgb24gdGhlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBpbnRlcmFjdChlbGVtZW50T3JJZGVudGlmaWVyLCBtZXRob2ROYW1lLCAuLi5hcmdzKSB7XG4gICAgbGV0IHRyaWVzID0gMFxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyaWVzKytcblxuICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuX2ZpbmRFbGVtZW50KGVsZW1lbnRPcklkZW50aWZpZXIpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSBcInNlbmRLZXlzXCIpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnRPcklkZW50aWZpZXIgPT09IFwib2JqZWN0XCIgJiYgZWxlbWVudE9ySWRlbnRpZmllciAmJiBcIndpdGhGYWxsYmFja1wiIGluIGVsZW1lbnRPcklkZW50aWZpZXIgJiYgZWxlbWVudE9ySWRlbnRpZmllci53aXRoRmFsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmludGVyYWN0U2VuZEtleXNXaXRoRmFsbGJhY2soZWxlbWVudCwgLi4uYXJncylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgZWxlbWVudC5zZW5kS2V5cyguLi5hcmdzKVxuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09IFwiY2xpY2tcIikge1xuICAgICAgICAgIGlmIChpc1dlYkRyaXZlckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xpY2soZWxlbWVudClcblxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBhd2FpdCAvKiogQHR5cGUge3tjbGljazogKC4uLmNsaWNrQXJnczogYW55W10pID0+IFByb21pc2U8YW55Pn19ICovIChlbGVtZW50KS5jbGljayguLi5hcmdzKVxuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09IFwicHJlc3NcIikge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW50ZXJhY3RQcmVzcyhlbGVtZW50KVxuXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2UgaWYgKCFlbGVtZW50W21ldGhvZE5hbWVdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0gaGFzbid0IGFuIGF0dHJpYnV0ZSBuYW1lZDogJHttZXRob2ROYW1lfWApXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnRbbWV0aG9kTmFtZV0gIT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0jJHttZXRob2ROYW1lfSBpcyBub3QgYSBmdW5jdGlvbmApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBEb250IGNhbGwgd2l0aCBjYW5kaWRhdGUsIGJlY2F1c2UgdGhhdCB3aWxsIGJpbmQgdGhlIGZ1bmN0aW9uIHdyb25nLlxuICAgICAgICByZXR1cm4gYXdhaXQgZWxlbWVudFttZXRob2ROYW1lXSguLi5hcmdzKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBjb25zdCByZXRyeWFibGVFcnJvck5hbWUgPSBnZXRSZXRyeWFibGVJbnRlcmFjdEVycm9yTmFtZShlcnJvcilcblxuICAgICAgICAgIGlmIChyZXRyeWFibGVFcnJvck5hbWUpIHtcbiAgICAgICAgICAgIC8vIFJldHJ5IGZpbmRpbmcgdGhlIGVsZW1lbnQgYW5kIGludGVyYWN0aW5nIHdpdGggaXRcbiAgICAgICAgICAgIGlmICh0cmllcyA+PSAzKSB7XG4gICAgICAgICAgICAgIGxldCBlbGVtZW50RGVzY3JpcHRpb25cblxuICAgICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnRPcklkZW50aWZpZXIgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGVsZW1lbnREZXNjcmlwdGlvbiA9IGBDU1Mgc2VsZWN0b3IgJHtlbGVtZW50T3JJZGVudGlmaWVyfWBcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGVzY3JpcHRpb24gPSBgJHtlbGVtZW50LmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZWxlbWVudERlc2NyaXB0aW9ufSAke21ldGhvZE5hbWV9IGZhaWxlZCBhZnRlciAke3RyaWVzfSB0cmllcyAtICR7cmV0cnlhYmxlRXJyb3JOYW1lfTogJHtlcnJvci5tZXNzYWdlfWAsIGVycm9yKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXdhaXQgd2FpdCg1MClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZWxlbWVudC5jb25zdHJ1Y3Rvci5uYW1lfSAke21ldGhvZE5hbWV9IGZhaWxlZCAtICR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLCBlcnJvcilcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZWxlbWVudC5jb25zdHJ1Y3Rvci5uYW1lfSAke21ldGhvZE5hbWV9IGZhaWxlZCAtICR7dHlwZW9mIGVycm9yfTogJHtlcnJvcn1gLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD59XG4gICAqL1xuICBhc3luYyByZWFkSW50ZXJhY3RhYmxlVmFsdWUoZWxlbWVudCkge1xuICAgIGNvbnN0IHZhbHVlUHJvcGVydHkgPSBhd2FpdCBlbGVtZW50LmdldEF0dHJpYnV0ZShcInZhbHVlXCIpXG5cbiAgICBpZiAodHlwZW9mIHZhbHVlUHJvcGVydHkgPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHZhbHVlUHJvcGVydHlcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0Q29udGVudCA9IGF3YWl0IGVsZW1lbnQuZ2V0VGV4dCgpXG5cbiAgICBpZiAodHlwZW9mIHRleHRDb250ZW50ID09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB0ZXh0Q29udGVudFxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fVxuICAgKi9cbiAgYXN5bmMgaW50ZXJhY3RTZW5kS2V5c1dpdGhGYWxsYmFjayhlbGVtZW50LCAuLi5hcmdzKSB7XG4gICAgY29uc3QgZXhwZWN0ZWRBcHBlbmQgPSBnZXRTZW5kS2V5c1RleHRBcHBlbmQoLi4uYXJncylcbiAgICBjb25zdCBiZWZvcmVWYWx1ZSA9IGF3YWl0IHRoaXMucmVhZEludGVyYWN0YWJsZVZhbHVlKGVsZW1lbnQpXG4gICAgY29uc3Qgc2VuZEtleXNSZXN1bHQgPSBhd2FpdCBlbGVtZW50LnNlbmRLZXlzKC4uLmFyZ3MpXG4gICAgY29uc3QgYWZ0ZXJWYWx1ZSA9IGF3YWl0IHRoaXMucmVhZEludGVyYWN0YWJsZVZhbHVlKGVsZW1lbnQpXG5cbiAgICBpZiAodHlwZW9mIGJlZm9yZVZhbHVlID09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGFmdGVyVmFsdWUgPT0gXCJzdHJpbmdcIiAmJiBhZnRlclZhbHVlICE9PSBiZWZvcmVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHNlbmRLZXlzUmVzdWx0XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dFZhbHVlID0gZ2V0U2VuZEtleXNVc2VzU2VsZWN0QWxsQW5kRGVsZXRlKC4uLmFyZ3MpID8gZXhwZWN0ZWRBcHBlbmQgOiBgJHtiZWZvcmVWYWx1ZSB8fCBcIlwifSR7ZXhwZWN0ZWRBcHBlbmR9YFxuXG4gICAgaWYgKHR5cGVvZiBiZWZvcmVWYWx1ZSA9PSBcInN0cmluZ1wiICYmIG5leHRWYWx1ZSA9PT0gYmVmb3JlVmFsdWUpIHtcbiAgICAgIHJldHVybiBzZW5kS2V5c1Jlc3VsdFxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZXhlY3V0ZVNjcmlwdChgXG4gICAgICBjb25zdCBlbGVtZW50ID0gYXJndW1lbnRzWzBdXG4gICAgICBjb25zdCBuZXh0VmFsdWUgPSBTdHJpbmcoYXJndW1lbnRzWzFdID8/IFwiXCIpXG5cbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5mb2N1cyA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZWxlbWVudC5mb2N1cygpXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihlbGVtZW50KVxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIFwidmFsdWVcIikgfHwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTFRleHRBcmVhRWxlbWVudC5wcm90b3R5cGUsIFwidmFsdWVcIikgfHwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTElucHV0RWxlbWVudC5wcm90b3R5cGUsIFwidmFsdWVcIilcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IFN0cmluZyhlbGVtZW50LnZhbHVlKVxuXG4gICAgICAgIGlmIChkZXNjcmlwdG9yICYmIHR5cGVvZiBkZXNjcmlwdG9yLnNldCA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBkZXNjcmlwdG9yLnNldC5jYWxsKGVsZW1lbnQsIG5leHRWYWx1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LnZhbHVlID0gbmV4dFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWxlbWVudC5fdmFsdWVUcmFja2VyICYmIHR5cGVvZiBlbGVtZW50Ll92YWx1ZVRyYWNrZXIuc2V0VmFsdWUgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZWxlbWVudC5fdmFsdWVUcmFja2VyLnNldFZhbHVlKHByZXZpb3VzVmFsdWUpXG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIiwge2J1YmJsZXM6IHRydWV9KSlcbiAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImNoYW5nZVwiLCB7YnViYmxlczogdHJ1ZX0pKVxuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gbmV4dFZhbHVlXG4gICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7YnViYmxlczogdHJ1ZX0pKVxuICAgICAgICByZXR1cm4gZWxlbWVudC50ZXh0Q29udGVudFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbFxuICAgIGAsIGVsZW1lbnQsIG5leHRWYWx1ZSlcblxuICAgIHJldHVybiBzZW5kS2V5c1Jlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBpbnRlcmFjdFByZXNzKGVsZW1lbnQpIHtcbiAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmV4ZWN1dGVTY3JpcHQoYFxuICAgICAgY29uc3QgZWxlbWVudCA9IGFyZ3VtZW50c1swXVxuXG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQuZm9jdXMgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGVsZW1lbnQuZm9jdXMoKVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBvZiBbXCJwb2ludGVyZG93blwiLCBcIm1vdXNlZG93blwiLCBcInBvaW50ZXJ1cFwiLCBcIm1vdXNldXBcIiwgXCJjbGlja1wiXSkge1xuICAgICAgICBjb25zdCBtb3VzZUV2ZW50ID0gbmV3IE1vdXNlRXZlbnQoZXZlbnROYW1lLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIHZpZXc6IHdpbmRvd1xuICAgICAgICB9KVxuXG4gICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChtb3VzZUV2ZW50KVxuICAgICAgfVxuICAgIGAsIGVsZW1lbnQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7V2FpdEZvck5vU2VsZWN0b3JBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yTm9TZWxlY3RvcihzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge3VzZUJhc2VTZWxlY3RvciwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3RBcmdzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXJnczogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsU2VsZWN0b3IgPSB1c2VCYXNlU2VsZWN0b3IgPyB0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKSA6IHNlbGVjdG9yXG5cbiAgICBhd2FpdCB0aGlzLmRyaXZlclNldFRpbWVvdXRzKDApXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fd2l0aFJldGhyb3duRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS53YWl0KFxuICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMoQnkuY3NzKGFjdHVhbFNlbGVjdG9yKSlcblxuICAgICAgICAgICAgLy8gTm90IGZvdW5kIGF0IGFsbFxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3VuZCBidXQgbm90IHZpc2libGVcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlzRGlzcGxheWVkID0gYXdhaXQgZWxlbWVudHNbMF0uaXNEaXNwbGF5ZWQoKVxuXG4gICAgICAgICAgICAgIHJldHVybiAhaXNEaXNwbGF5ZWRcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgICAgICAgICAgKGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3JcIiB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwic3RhbGUgZWxlbWVudCByZWZlcmVuY2VcIikpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMuZ2V0VGltZW91dHMoKVxuICAgICAgICApXG4gICAgICB9KVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLnJlc3RvcmVUaW1lb3V0cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxhbnk+fSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgX3dpdGhSZXRocm93bkVycm9ycyhjYWxsYmFjaykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXZWJEcml2ZXJFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgU2VsZW5pdW0gJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWAsIGVycm9yKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
676
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViZHJpdmVyLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL3dlYmRyaXZlci1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDN0QsT0FBTyxPQUFPLE1BQU0sbUNBQW1DLENBQUE7QUFDdkQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUUvQzs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUs7SUFDcEMsTUFBTSxLQUFLLEdBQUcsdUNBQXVDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQzFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ25CLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsa0JBQWtCLENBQUMsT0FBTztJQUNqQyxPQUFPLE9BQU8sQ0FDWixPQUFPO1FBQ1AsT0FBTyxPQUFPLEtBQUssUUFBUTtRQUMzQixPQUFPLElBQUksT0FBTztRQUNsQixPQUFPLE9BQU8sQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUNwQyxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQUs7SUFDekIsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7UUFDM0IsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQTtJQUMvQixDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsNkJBQTZCLENBQUMsS0FBSztJQUMxQyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUE7SUFFeEIsT0FBTyxZQUFZ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QyxDQUFDLENBQUE7UUFDSixDQUFDO2dCQUFTLENBQUM7WUFDVCxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTtRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRO1FBQ2hDLElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxRQUFRLEVBQUUsQ0FBQTtRQUN6QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksS0FBSyxZQUFZLGNBQWMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLGNBQWMsQ0FBQyxZQUFZLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUNyRixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxLQUFLLENBQUE7WUFDYixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QnksIGVycm9yIGFzIFNlbGVuaXVtRXJyb3J9IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXJcIlxuaW1wb3J0IGxvZ2dpbmcgZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlci9saWIvbG9nZ2luZy5qc1wiXG5pbXBvcnQge3dhaXR9IGZyb20gXCJhd2FpdGVyeVwiXG5pbXBvcnQgdGltZW91dCBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2F1c2VcbiAqIEByZXR1cm5zIHtFcnJvciAmIHtjYXVzZTogdW5rbm93bn19XG4gKi9cbmZ1bmN0aW9uIGVycm9yV2l0aENhdXNlKG1lc3NhZ2UsIGNhdXNlKSB7XG4gIGNvbnN0IGVycm9yID0gLyoqIEB0eXBlIHtFcnJvciAmIHtjYXVzZTogdW5rbm93bn19ICovIChuZXcgRXJyb3IobWVzc2FnZSkpXG4gIGVycm9yLmNhdXNlID0gY2F1c2VcbiAgcmV0dXJuIGVycm9yXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBlbGVtZW50XG4gKiBAcmV0dXJucyB7ZWxlbWVudCBpcyBpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gaXNXZWJEcml2ZXJFbGVtZW50KGVsZW1lbnQpIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgZWxlbWVudCAmJlxuICAgIHR5cGVvZiBlbGVtZW50ID09PSBcIm9iamVjdFwiICYmXG4gICAgXCJnZXRJZFwiIGluIGVsZW1lbnQgJiZcbiAgICB0eXBlb2YgZWxlbWVudC5nZXRJZCA9PT0gXCJmdW5jdGlvblwiXG4gIClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBnZXRFcnJvck5hbWUoZXJyb3IpIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IuY29uc3RydWN0b3IubmFtZVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3JcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGdldFJldHJ5YWJsZUludGVyYWN0RXJyb3JOYW1lKGVycm9yKSB7XG4gIGxldCBjdXJyZW50RXJyb3IgPSBlcnJvclxuXG4gIHdoaWxlIChjdXJyZW50RXJyb3IpIHtcbiAgICBjb25zdCBlcnJvck5hbWUgPSBnZXRFcnJvck5hbWUoY3VycmVudEVycm9yKVxuXG4gICAgaWYgKGVycm9yTmFtZSA9PT0gXCJFbGVtZW50Tm90SW50ZXJhY3RhYmxlRXJyb3JcIiB8fCBlcnJvck5hbWUgPT09IFwiRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvclwiIHx8IGVycm9yTmFtZSA9PT0gXCJTdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvclwiKSB7XG4gICAgICByZXR1cm4gZXJyb3JOYW1lXG4gICAgfVxuXG4gICAgaWYgKCEoY3VycmVudEVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHx8ICEoXCJjYXVzZVwiIGluIGN1cnJlbnRFcnJvcikpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjdXJyZW50RXJyb3IgPSBjdXJyZW50RXJyb3IuY2F1c2VcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0U2VuZEtleXNUZXh0QXBwZW5kKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3NcbiAgICAubWFwKChhcmcpID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZ0FyZyA9IFN0cmluZyhhcmcpXG5cbiAgICAgIGlmICgvW1xcdUUwMDlcXHVFMDNEXWFcXHVFMDAwL2kudGVzdChzdHJpbmdBcmcpKSB7XG4gICAgICAgIHJldHVybiBcIlwiXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdHJpbmdBcmcucmVwbGFjZSgvW1xcdUUwMDAtXFx1RjhGRl0vZywgXCJcIilcbiAgICB9KVxuICAgIC5qb2luKFwiXCIpXG59XG5cbi8qKlxuICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBnZXRTZW5kS2V5c1VzZXNTZWxlY3RBbGxBbmREZWxldGUoLi4uYXJncykge1xuICByZXR1cm4gYXJncy5zb21lKChhcmcpID0+IC9bXFx1RTAwOVxcdUUwM0RdYVxcdUUwMDAvaS50ZXN0KFN0cmluZyhhcmcpKSkgJiZcbiAgICBhcmdzLnNvbWUoKGFyZykgPT4gU3RyaW5nKGFyZykuaW5jbHVkZXMoXCJcXHVFMDAzXCIpIHx8IFN0cmluZyhhcmcpLmluY2x1ZGVzKFwiXFx1RTAxN1wiKSlcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGaW5kQXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSBPdmVycmlkZSB0aW1lb3V0IGZvciBsb29rdXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBudWxsfSBbdmlzaWJsZV0gV2hldGhlciB0byByZXF1aXJlIGVsZW1lbnRzIHRvIGJlIHZpc2libGUgKGB0cnVlYCkgb3IgaGlkZGVuIChgZmFsc2VgKS4gVXNlIGBudWxsYCB0byBkaXNhYmxlIHZpc2liaWxpdHkgZmlsdGVyaW5nLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2Nyb2xsVG9dIFdoZXRoZXIgdG8gc2Nyb2xsIGZvdW5kIGVsZW1lbnRzIGludG8gdmlldyBiZWZvcmUgcmV0dXJuaW5nIHRoZW0uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VCYXNlU2VsZWN0b3JdIFdoZXRoZXIgdG8gc2NvcGUgYnkgdGhlIGJhc2Ugc2VsZWN0b3IuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge0ZpbmRBcmdzICYge3dpdGhGYWxsYmFjaz86IGJvb2xlYW59fSBJbnRlcmFjdEFyZ3NcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXYWl0Rm9yTm9TZWxlY3RvckFyZ3NcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZUJhc2VTZWxlY3Rvcl0gV2hldGhlciB0byBzY29wZSBieSB0aGUgYmFzZSBzZWxlY3Rvci5cbiAqL1xuXG5jbGFzcyBFbGVtZW50Tm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHsgfVxuY29uc3Qge1dlYkRyaXZlckVycm9yfSA9IFNlbGVuaXVtRXJyb3JcblxuLyoqXG4gKiBCYXNlIGRyaXZlciB1c2luZyBzZWxlbml1bS13ZWJkcml2ZXIgc2Vzc2lvbnMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYkRyaXZlckRyaXZlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jyb3dzZXIuanNcIikuZGVmYXVsdH0gYXJncy5icm93c2VyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2FyZ3Mub3B0aW9uc11cbiAgICovXG4gIGNvbnN0cnVjdG9yKHticm93c2VyLCBvcHRpb25zID0ge319KSB7XG4gICAgdGhpcy5icm93c2VyID0gYnJvd3NlclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmJhc2VVcmwgPSB1bmRlZmluZWRcbiAgICB0aGlzLndlYkRyaXZlciA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX2RyaXZlclRpbWVvdXRzID0gNTAwMFxuICAgIHRoaXMuX3RpbWVvdXRzID0gNTAwMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVXJsXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0QmFzZVVybChiYXNlVXJsKSB7XG4gICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIGdldEJhc2VVcmwoKSB7XG4gICAgaWYgKCF0aGlzLmJhc2VVcmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRyaXZlciBiYXNlIFVSTCBoYXMgbm90IGJlZW4gc2V0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYmFzZVVybFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gIGdldFRpbWVvdXRzKCkgeyByZXR1cm4gdGhpcy5fdGltZW91dHMgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkRyaXZlcn1cbiAgICovXG4gIGdldFdlYkRyaXZlcigpIHtcbiAgICBpZiAoIXRoaXMud2ViRHJpdmVyKSB0aHJvdyBuZXcgRXJyb3IoXCJEcml2ZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XCIpXG4gICAgdGhpcy5icm93c2VyLnRocm93SWZIdHRwU2VydmVyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHRoaXMud2ViRHJpdmVyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRHJpdmVyfSB3ZWJEcml2ZXJcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRXZWJEcml2ZXIod2ViRHJpdmVyKSB7XG4gICAgdGhpcy53ZWJEcml2ZXIgPSB3ZWJEcml2ZXJcbiAgICB0aGlzLmJyb3dzZXIuZHJpdmVyID0gd2ViRHJpdmVyXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdGFydCgpIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRyaXZlclwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RvcCgpIHtcbiAgICBpZiAodGhpcy53ZWJEcml2ZXIpIHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRoaXMuZ2V0VGltZW91dHMoKSwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgcXVpdHRpbmcgV2ViRHJpdmVyXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLndlYkRyaXZlci5xdWl0KCkpXG4gICAgfVxuXG4gICAgdGhpcy53ZWJEcml2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLmJyb3dzZXIuZHJpdmVyID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1RpbWVvdXRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcml2ZXJTZXRUaW1lb3V0cyhuZXdUaW1lb3V0KSB7XG4gICAgdGhpcy5fZHJpdmVyVGltZW91dHMgPSBuZXdUaW1lb3V0XG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5zZXRUaW1lb3V0cyh7aW1wbGljaXQ6IG5ld1RpbWVvdXR9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVzdG9yZVRpbWVvdXRzKCkge1xuICAgIGlmICghdGhpcy5nZXRUaW1lb3V0cygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaW1lb3V0cyBoYXZlbid0IHByZXZpb3VzbHkgYmVlbiBzZXRcIilcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmRyaXZlclNldFRpbWVvdXRzKHRoaXMuZ2V0VGltZW91dHMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbmV3VGltZW91dFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNldFRpbWVvdXRzKG5ld1RpbWVvdXQpIHtcbiAgICB0aGlzLl90aW1lb3V0cyA9IG5ld1RpbWVvdXRcbiAgICBhd2FpdCB0aGlzLnJlc3RvcmVUaW1lb3V0cygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLmJyb3dzZXIuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcml2ZXJWaXNpdChwYXRoKSB7XG4gICAgY29uc3QgaXNBYnNvbHV0ZVVybCA9IC9eW2Etel0rOlxcL1xcLy9pLnRlc3QocGF0aClcbiAgICBjb25zdCB1cmwgPSBpc0Fic29sdXRlVXJsID8gcGF0aCA6IGAke3RoaXMuZ2V0QmFzZVVybCgpfSR7cGF0aH1gXG5cbiAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmdldCh1cmwpXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gKi9cbiAgYXN5bmMgZ2V0Q3VycmVudFVybCgpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZ2V0Q3VycmVudFVybCgpXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gXCJcIlxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyBnZXRIVE1MKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmdldFBhZ2VTb3VyY2UoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59ICovXG4gIGFzeW5jIHRha2VTY3JlZW5zaG90KCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLnRha2VTY3JlZW5zaG90KClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGJyb3dzZXIgbG9nc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59XG4gICAqL1xuICBhc3luYyBnZXRCcm93c2VyTG9ncygpIHtcbiAgICBsZXQgZW50cmllc1xuXG4gICAgdHJ5IHtcbiAgICAgIGVudHJpZXMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLmxvZ3MoKS5nZXQobG9nZ2luZy5UeXBlLkJST1dTRVIpXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgY29uc3QgYnJvd3NlckxvZ3MgPSBbXVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtZXNzYWdlTWF0Y2ggPSBlbnRyeS5tZXNzYWdlLm1hdGNoKC9eKC4rKSAoXFxkKyk6KFxcZCspICguKykkLylcbiAgICAgIGxldCBtZXNzYWdlXG5cbiAgICAgIGlmIChtZXNzYWdlTWF0Y2gpIHtcbiAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VNYXRjaFs0XVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVzc2FnZSA9IGVudHJ5Lm1lc3NhZ2VcbiAgICAgIH1cblxuICAgICAgYnJvd3NlckxvZ3MucHVzaChgJHtlbnRyeS5sZXZlbC5uYW1lfTogJHttZXNzYWdlfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGJyb3dzZXJMb2dzXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7c2Nyb2xsVG8gPSBmYWxzZSwgdmlzaWJsZSA9IHRydWUsIHRpbWVvdXQsIHVzZUJhc2VTZWxlY3RvciA9IHRydWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcbiAgICBsZXQgYWN0dWFsVGltZW91dFxuXG4gICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRoaXMuX2RyaXZlclRpbWVvdXRzXG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbFRpbWVvdXQgPSB0aW1lb3V0XG4gICAgfVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcblxuICAgIGNvbnN0IGFjdHVhbFNlbGVjdG9yID0gdXNlQmFzZVNlbGVjdG9yID8gdGhpcy5nZXRTZWxlY3RvcihzZWxlY3RvcikgOiBzZWxlY3RvclxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICBjb25zdCBnZXRUaW1lTGVmdCA9ICgpID0+IE1hdGgubWF4KGFjdHVhbFRpbWVvdXQgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSksIDApXG4gICAgY29uc3QgZ2V0RWxlbWVudHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmb3VuZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMoQnkuY3NzKGFjdHVhbFNlbGVjdG9yKSlcblxuICAgICAgaWYgKHZpc2libGUgIT09IHRydWUgJiYgdmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyZWRFbGVtZW50cyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBmb3VuZEVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IGlzRGlzcGxheWVkID0gYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpXG5cbiAgICAgICAgaWYgKHZpc2libGUgJiYgIWlzRGlzcGxheWVkKSBjb250aW51ZVxuICAgICAgICBpZiAoIXZpc2libGUgJiYgaXNEaXNwbGF5ZWQpIGNvbnRpbnVlXG5cbiAgICAgICAgZmlsdGVyZWRFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWx0ZXJlZEVsZW1lbnRzXG4gICAgfVxuICAgIGxldCBlbGVtZW50cyA9IFtdXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgdGltZUxlZnQgPSBhY3R1YWxUaW1lb3V0ID09IDAgPyAwIDogZ2V0VGltZUxlZnQoKVxuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGltZUxlZnQgPT0gMCkge1xuICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkud2FpdChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcblxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICB9LCB0aW1lTGVmdClcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsZXQgaXNTdGFsZUVsZW1lbnRFcnJvciA9IGZhbHNlXG5cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VsZW5pdW1FcnJvci5TdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvcikge1xuICAgICAgICAgIGlzU3RhbGVFbGVtZW50RXJyb3IgPSB0cnVlXG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXZWJEcml2ZXJFcnJvciAmJiBlcnJvci5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJzdGFsZSBlbGVtZW50IHJlZmVyZW5jZVwiKSkge1xuICAgICAgICAgIGlzU3RhbGVFbGVtZW50RXJyb3IgPSB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGVycm9yIGluc3RhbmNlb2YgU2VsZW5pdW1FcnJvci5UaW1lb3V0RXJyb3IgfHwgaXNTdGFsZUVsZW1lbnRFcnJvcilcbiAgICAgICAgICAmJiBnZXRUaW1lTGVmdCgpID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYENvdWxkbid0IGdldCBlbGVtZW50cyB3aXRoIHNlbGVjdG9yOiAke2FjdHVhbFNlbGVjdG9yfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWAsIGVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2Nyb2xsVG8pIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgc2luZ2xlIGVsZW1lbnQgYnkgQ1NTIHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXX0gKi9cbiAgICBsZXQgZWxlbWVudHNcblxuICAgIHRyeSB7XG4gICAgICBlbGVtZW50cyA9IGF3YWl0IHRoaXMuYWxsKHNlbGVjdG9yLCBhcmdzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfSAtICR7ZXJyb3IubWVzc2FnZX0gKHNlbGVjdG9yOiAke3RoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpfSlgLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7dHlwZW9mIGVycm9yfSAtICR7ZXJyb3J9IChzZWxlY3RvcjogJHt0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKX0pYCwgZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIDEgZWxlbWVudHMgKCR7ZWxlbWVudHMubGVuZ3RofSkgd2FzIGZvdW5kIGJ5IENTUzogJHt0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKX1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IENTUzogJHt0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKX1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1swXVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgc2luZ2xlIGVsZW1lbnQgYnkgdGVzdCBJRFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kQnlUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZChgW2RhdGEtdGVzdGlkPScke3Rlc3RJRH0nXWAsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8KHtzZWxlY3Rvcjogc3RyaW5nfSAmIEZpbmRBcmdzICYge3dpdGhGYWxsYmFjaz86IGJvb2xlYW59KX0gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgX2ZpbmRFbGVtZW50KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSAqL1xuICAgIGxldCBlbGVtZW50XG5cbiAgICBpZiAodHlwZW9mIGVsZW1lbnRPcklkZW50aWZpZXIgPT0gXCJzdHJpbmdcIikge1xuICAgICAgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZChlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnRPcklkZW50aWZpZXIgPT0gXCJvYmplY3RcIiAmJiBlbGVtZW50T3JJZGVudGlmaWVyICE9PSBudWxsICYmIFwic2VsZWN0b3JcIiBpbiBlbGVtZW50T3JJZGVudGlmaWVyKSB7XG4gICAgICBjb25zdCB7c2VsZWN0b3IsIC4uLnJlc3RBcmdzfSA9IGVsZW1lbnRPcklkZW50aWZpZXJcblxuICAgICAgZGVsZXRlIHJlc3RBcmdzLndpdGhGYWxsYmFja1xuXG4gICAgICBlbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kKHNlbGVjdG9yLCByZXN0QXJncylcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9ICovIChlbGVtZW50T3JJZGVudGlmaWVyKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3Igd2l0aG91dCB3YWl0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZE5vV2FpdChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5kcml2ZXJTZXRUaW1lb3V0cygwKVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmQoc2VsZWN0b3IsIGFyZ3MpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVzdG9yZVRpbWVvdXRzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xpY2tzIGFuIGVsZW1lbnQsIGFsbG93aW5nIHNlbGVjdG9yIGFyZ3Mgd2hlbiB1c2luZyBhIENTUyBzZWxlY3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIGxldCB0cmllcyA9IDBcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cmllcysrXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLl9maW5kRWxlbWVudChlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICAgICAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5nZXRXZWJEcml2ZXIoKS5hY3Rpb25zKHthc3luYzogdHJ1ZX0pXG5cbiAgICAgICAgYXdhaXQgYWN0aW9ucy5tb3ZlKHtvcmlnaW46IGVsZW1lbnR9KS5jbGljaygpLnBlcmZvcm0oKVxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yXCIgfHwgZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJTdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJFbGVtZW50Tm90SW50ZXJhY3RhYmxlRXJyb3JcIikge1xuICAgICAgICAgICAgaWYgKHRyaWVzID49IDMpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYEVsZW1lbnQgJHtlbGVtZW50T3JJZGVudGlmaWVyLmNvbnN0cnVjdG9yLm5hbWV9IGNsaWNrIGZhaWxlZCBhZnRlciAke3RyaWVzfSB0cmllcyAtICR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLCBlcnJvcilcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGF3YWl0IHdhaXQoNTApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBFbGVtZW50ICR7ZWxlbWVudE9ySWRlbnRpZmllci5jb25zdHJ1Y3Rvci5uYW1lfSBjbGljayBmYWlsZWQgLSAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCwgZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBFbGVtZW50ICR7ZWxlbWVudE9ySWRlbnRpZmllci5jb25zdHJ1Y3Rvci5uYW1lfSBjbGljayBmYWlsZWQgLSAke3R5cGVvZiBlcnJvcn06ICR7ZXJyb3J9YCwgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KSB7XG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5hY3Rpb25zKHthc3luYzogdHJ1ZX0pLm1vdmUoe29yaWdpbjogZWxlbWVudH0pLnBlcmZvcm0oKVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgYW4gZWxlbWVudCBpbnRvIHZpZXcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fCh7c2VsZWN0b3I6IHN0cmluZ30gJiBGaW5kQXJncyAmIHt3aXRoRmFsbGJhY2s/OiBib29sZWFufSl9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsSW50b1ZpZXcoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLl9maW5kRWxlbWVudChlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICAgIGF3YWl0IHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KGVsZW1lbnQpXG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyB0aGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0ZXN0IElEIGludG8gdmlldy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzY3JvbGxUZXN0SWRJbnRvVmlldyh0ZXN0SUQsIGFyZ3MpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kQnlUZXN0SUQodGVzdElELCBhcmdzKVxuICAgIGF3YWl0IHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KGVsZW1lbnQpXG4gIH1cblxuICAvKipcbiAgICogSW50ZXJhY3RzIHdpdGggYW4gZWxlbWVudCBieSBjYWxsaW5nIGEgbWV0aG9kIG9uIGl0IHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy5cbiAgICogUmV0cnlpbmcgb24gRWxlbWVudE5vdEludGVyYWN0YWJsZUVycm9yLCBFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yLCBvciBTdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHxzdHJpbmd8e3NlbGVjdG9yOiBzdHJpbmd9ICYgSW50ZXJhY3RBcmdzfSBlbGVtZW50T3JJZGVudGlmaWVyIFRoZSBlbGVtZW50IG9yIGEgQ1NTIHNlbGVjdG9yIHRvIGZpbmQgdGhlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZSB0byBjYWxsIG9uIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kTmFtZSwgLi4uYXJncykge1xuICAgIGxldCB0cmllcyA9IDBcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cmllcysrXG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLl9maW5kRWxlbWVudChlbGVtZW50T3JJZGVudGlmaWVyKVxuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAobWV0aG9kTmFtZSA9PT0gXCJzZW5kS2V5c1wiKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50T3JJZGVudGlmaWVyID09PSBcIm9iamVjdFwiICYmIGVsZW1lbnRPcklkZW50aWZpZXIgJiYgXCJ3aXRoRmFsbGJhY2tcIiBpbiBlbGVtZW50T3JJZGVudGlmaWVyICYmIGVsZW1lbnRPcklkZW50aWZpZXIud2l0aEZhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pbnRlcmFjdFNlbmRLZXlzV2l0aEZhbGxiYWNrKGVsZW1lbnQsIC4uLmFyZ3MpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGVsZW1lbnQuc2VuZEtleXMoLi4uYXJncylcbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2ROYW1lID09PSBcImNsaWNrXCIpIHtcbiAgICAgICAgICBpZiAoaXNXZWJEcml2ZXJFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWNrKGVsZW1lbnQpXG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgLyoqIEB0eXBlIHt7Y2xpY2s6ICguLi5jbGlja0FyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT59fSAqLyAoZWxlbWVudCkuY2xpY2soLi4uYXJncylcbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2ROYW1lID09PSBcInByZXNzXCIpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmludGVyYWN0UHJlc3MoZWxlbWVudClcblxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfSBlbHNlIGlmICghZWxlbWVudFttZXRob2ROYW1lXSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbGVtZW50LmNvbnN0cnVjdG9yLm5hbWV9IGhhc24ndCBhbiBhdHRyaWJ1dGUgbmFtZWQ6ICR7bWV0aG9kTmFtZX1gKVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50W21ldGhvZE5hbWVdICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbGVtZW50LmNvbnN0cnVjdG9yLm5hbWV9IyR7bWV0aG9kTmFtZX0gaXMgbm90IGEgZnVuY3Rpb25gKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9udCBjYWxsIHdpdGggY2FuZGlkYXRlLCBiZWNhdXNlIHRoYXQgd2lsbCBiaW5kIHRoZSBmdW5jdGlvbiB3cm9uZy5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGVsZW1lbnRbbWV0aG9kTmFtZV0oLi4uYXJncylcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY29uc3QgcmV0cnlhYmxlRXJyb3JOYW1lID0gZ2V0UmV0cnlhYmxlSW50ZXJhY3RFcnJvck5hbWUoZXJyb3IpXG5cbiAgICAgICAgICBpZiAocmV0cnlhYmxlRXJyb3JOYW1lKSB7XG4gICAgICAgICAgICAvLyBSZXRyeSBmaW5kaW5nIHRoZSBlbGVtZW50IGFuZCBpbnRlcmFjdGluZyB3aXRoIGl0XG4gICAgICAgICAgICBpZiAodHJpZXMgPj0gMykge1xuICAgICAgICAgICAgICBsZXQgZWxlbWVudERlc2NyaXB0aW9uXG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50T3JJZGVudGlmaWVyID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGVzY3JpcHRpb24gPSBgQ1NTIHNlbGVjdG9yICR7ZWxlbWVudE9ySWRlbnRpZmllcn1gXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERlc2NyaXB0aW9uID0gYCR7ZWxlbWVudC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2VsZW1lbnREZXNjcmlwdGlvbn0gJHttZXRob2ROYW1lfSBmYWlsZWQgYWZ0ZXIgJHt0cmllc30gdHJpZXMgLSAke3JldHJ5YWJsZUVycm9yTmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLCBlcnJvcilcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGF3YWl0IHdhaXQoNTApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0gJHttZXRob2ROYW1lfSBmYWlsZWQgLSAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCwgZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0gJHttZXRob2ROYW1lfSBmYWlsZWQgLSAke3R5cGVvZiBlcnJvcn06ICR7ZXJyb3J9YCwgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVhZEludGVyYWN0YWJsZVZhbHVlKGVsZW1lbnQpIHtcbiAgICBjb25zdCB2YWx1ZVByb3BlcnR5ID0gYXdhaXQgZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZVByb3BlcnR5ID09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZVByb3BlcnR5XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSBhd2FpdCBlbGVtZW50LmdldFRleHQoKVxuXG4gICAgaWYgKHR5cGVvZiB0ZXh0Q29udGVudCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGV4dENvbnRlbnRcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICovXG4gIGFzeW5jIGludGVyYWN0U2VuZEtleXNXaXRoRmFsbGJhY2soZWxlbWVudCwgLi4uYXJncykge1xuICAgIGNvbnN0IGV4cGVjdGVkQXBwZW5kID0gZ2V0U2VuZEtleXNUZXh0QXBwZW5kKC4uLmFyZ3MpXG4gICAgY29uc3QgYmVmb3JlVmFsdWUgPSBhd2FpdCB0aGlzLnJlYWRJbnRlcmFjdGFibGVWYWx1ZShlbGVtZW50KVxuICAgIGNvbnN0IHNlbmRLZXlzUmVzdWx0ID0gYXdhaXQgZWxlbWVudC5zZW5kS2V5cyguLi5hcmdzKVxuICAgIGNvbnN0IGFmdGVyVmFsdWUgPSBhd2FpdCB0aGlzLnJlYWRJbnRlcmFjdGFibGVWYWx1ZShlbGVtZW50KVxuXG4gICAgaWYgKHR5cGVvZiBiZWZvcmVWYWx1ZSA9PSBcInN0cmluZ1wiICYmIHR5cGVvZiBhZnRlclZhbHVlID09IFwic3RyaW5nXCIgJiYgYWZ0ZXJWYWx1ZSAhPT0gYmVmb3JlVmFsdWUpIHtcbiAgICAgIHJldHVybiBzZW5kS2V5c1Jlc3VsdFxuICAgIH1cblxuICAgIGNvbnN0IG5leHRWYWx1ZSA9IGdldFNlbmRLZXlzVXNlc1NlbGVjdEFsbEFuZERlbGV0ZSguLi5hcmdzKSA/IGV4cGVjdGVkQXBwZW5kIDogYCR7YmVmb3JlVmFsdWUgfHwgXCJcIn0ke2V4cGVjdGVkQXBwZW5kfWBcblxuICAgIGlmICh0eXBlb2YgYmVmb3JlVmFsdWUgPT0gXCJzdHJpbmdcIiAmJiBuZXh0VmFsdWUgPT09IGJlZm9yZVZhbHVlKSB7XG4gICAgICByZXR1cm4gc2VuZEtleXNSZXN1bHRcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmV4ZWN1dGVTY3JpcHQoYFxuICAgICAgY29uc3QgZWxlbWVudCA9IGFyZ3VtZW50c1swXVxuICAgICAgY29uc3QgbmV4dFZhbHVlID0gU3RyaW5nKGFyZ3VtZW50c1sxXSA/PyBcIlwiKVxuXG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQuZm9jdXMgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGVsZW1lbnQuZm9jdXMoKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZWxlbWVudClcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBcInZhbHVlXCIpIHx8IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQucHJvdG90eXBlLCBcInZhbHVlXCIpIHx8IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LkhUTUxJbnB1dEVsZW1lbnQucHJvdG90eXBlLCBcInZhbHVlXCIpXG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBTdHJpbmcoZWxlbWVudC52YWx1ZSlcblxuICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiB0eXBlb2YgZGVzY3JpcHRvci5zZXQgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZGVzY3JpcHRvci5zZXQuY2FsbChlbGVtZW50LCBuZXh0VmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC52YWx1ZSA9IG5leHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnQuX3ZhbHVlVHJhY2tlciAmJiB0eXBlb2YgZWxlbWVudC5fdmFsdWVUcmFja2VyLnNldFZhbHVlID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGVsZW1lbnQuX3ZhbHVlVHJhY2tlci5zZXRWYWx1ZShwcmV2aW91c1ZhbHVlKVxuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHtidWJibGVzOiB0cnVlfSkpXG4gICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJjaGFuZ2VcIiwge2J1YmJsZXM6IHRydWV9KSlcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWVcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG5leHRWYWx1ZVxuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIiwge2J1YmJsZXM6IHRydWV9KSlcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudGV4dENvbnRlbnRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGxcbiAgICBgLCBlbGVtZW50LCBuZXh0VmFsdWUpXG5cbiAgICByZXR1cm4gc2VuZEtleXNSZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgaW50ZXJhY3RQcmVzcyhlbGVtZW50KSB7XG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KGBcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhcmd1bWVudHNbMF1cblxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LmZvY3VzID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBlbGVtZW50LmZvY3VzKClcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgb2YgW1wicG9pbnRlcmRvd25cIiwgXCJtb3VzZWRvd25cIiwgXCJwb2ludGVydXBcIiwgXCJtb3VzZXVwXCIsIFwiY2xpY2tcIl0pIHtcbiAgICAgICAgY29uc3QgbW91c2VFdmVudCA9IG5ldyBNb3VzZUV2ZW50KGV2ZW50TmFtZSwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICB2aWV3OiB3aW5kb3dcbiAgICAgICAgfSlcblxuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobW91c2VFdmVudClcbiAgICAgIH1cbiAgICBgLCBlbGVtZW50KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge1dhaXRGb3JOb1NlbGVjdG9yQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvck5vU2VsZWN0b3Ioc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHt1c2VCYXNlU2VsZWN0b3IsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIGlmIChPYmplY3Qua2V5cyhyZXN0QXJncykubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGFyZ3M6ICR7T2JqZWN0LmtleXMocmVzdEFyZ3MpLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIGNvbnN0IGFjdHVhbFNlbGVjdG9yID0gdXNlQmFzZVNlbGVjdG9yID8gdGhpcy5nZXRTZWxlY3RvcihzZWxlY3RvcikgOiBzZWxlY3RvclxuXG4gICAgYXdhaXQgdGhpcy5kcml2ZXJTZXRUaW1lb3V0cygwKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhSZXRocm93bkVycm9ycyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkud2FpdChcbiAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKEJ5LmNzcyhhY3R1YWxTZWxlY3RvcikpXG5cbiAgICAgICAgICAgIC8vIE5vdCBmb3VuZCBhdCBhbGxcbiAgICAgICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm91bmQgYnV0IG5vdCB2aXNpYmxlXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBpc0Rpc3BsYXllZCA9IGF3YWl0IGVsZW1lbnRzWzBdLmlzRGlzcGxheWVkKClcblxuICAgICAgICAgICAgICByZXR1cm4gIWlzRGlzcGxheWVkXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgICAgICAgICAgIChlcnJvci5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yXCIgfHwgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcInN0YWxlIGVsZW1lbnQgcmVmZXJlbmNlXCIpKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLmdldFRpbWVvdXRzKClcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlVGltZW91dHMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8YW55Pn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIF93aXRoUmV0aHJvd25FcnJvcnMoY2FsbGJhY2spIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2ViRHJpdmVyRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYFNlbGVuaXVtICR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLCBlcnJvcilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -2,6 +2,12 @@ export default class SystemTestBrowserHelper {
2
2
  /** @returns {SystemTestBrowserHelper | null} */
3
3
  static getCurrent(): SystemTestBrowserHelper | null;
4
4
  static current(): SystemTestBrowserHelper;
5
+ /**
6
+ * @param {string} parameterName
7
+ * @param {number} fallback
8
+ * @returns {number}
9
+ */
10
+ getSystemTestPort(parameterName: string, fallback: number): number;
5
11
  communicator: SystemTestCommunicator;
6
12
  _enabled: boolean;
7
13
  _hasInitialized: boolean;
@@ -9,6 +9,24 @@ const shared = {
9
9
  systemTestBrowserHelper: null
10
10
  };
11
11
  export default class SystemTestBrowserHelper {
12
+ /**
13
+ * @param {string} parameterName
14
+ * @param {number} fallback
15
+ * @returns {number}
16
+ */
17
+ getSystemTestPort(parameterName, fallback) {
18
+ const location = globalThis.location;
19
+ const search = location?.search;
20
+ if (!search) {
21
+ return fallback;
22
+ }
23
+ const value = new URLSearchParams(search).get(parameterName);
24
+ if (!value) {
25
+ return fallback;
26
+ }
27
+ const parsed = Number(value);
28
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;
29
+ }
12
30
  /** @returns {SystemTestBrowserHelper | null} */
13
31
  static getCurrent() {
14
32
  return shared.systemTestBrowserHelper;
@@ -83,7 +101,8 @@ export default class SystemTestBrowserHelper {
83
101
  }
84
102
  async startScoundrel() {
85
103
  const host = this.getSystemTestHost();
86
- this.scoundrelWs = new WebSocket(`ws://${host}:8090`);
104
+ const scoundrelPort = this.getSystemTestPort("systemTestScoundrelPort", 8090);
105
+ this.scoundrelWs = new WebSocket(`ws://${host}:${scoundrelPort}`);
87
106
  // @ts-expect-error
88
107
  this.scoundrelClientWebSocket = new ClientWebSocket(this.scoundrelWs);
89
108
  await this.scoundrelClientWebSocket.waitForOpened();
@@ -164,7 +183,8 @@ export default class SystemTestBrowserHelper {
164
183
  /** @returns {void} */
165
184
  connectWebSocket() {
166
185
  const host = this.getSystemTestHost();
167
- this.ws = new WebSocket(`ws://${host}:1985`);
186
+ const clientWsPort = this.getSystemTestPort("systemTestClientWsPort", 1985);
187
+ this.ws = new WebSocket(`ws://${host}:${clientWsPort}`);
168
188
  this.communicator.ws = this.ws;
169
189
  this.ws.addEventListener("error", digg(this, "communicator", "onError"));
170
190
  this.ws.addEventListener("open", digg(this, "communicator", "onOpen"));
@@ -287,4 +307,4 @@ export default class SystemTestBrowserHelper {
287
307
  return await this.communicator.sendCommand({ type: "query", sql });
288
308
  }
289
309
  }
290
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sTUFBTSxNQUFNLDZDQUE2QyxDQUFBO0FBQ2hFLE9BQU8sZUFBZSxNQUFNLG9FQUFvRSxDQUFBO0FBQ2hHLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUUxQyxPQUFPLHNCQUFzQixNQUFNLCtCQUErQixDQUFBO0FBRWxFLHdFQUF3RTtBQUN4RSxNQUFNLE1BQU0sR0FBRztJQUNiLHVCQUF1QixFQUFFLElBQUk7Q0FDOUIsQ0FBQTtBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8sdUJBQXVCO0lBQzFDLGdEQUFnRDtJQUNoRCxNQUFNLENBQUMsVUFBVTtRQUNmLE9BQU8sTUFBTSxDQUFDLHVCQUF1QixDQUFBO0lBQ3ZDLENBQUM7SUFFRCxNQUFNLENBQUMsT0FBTztRQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUE7UUFDM0QsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLHVCQUF1QixDQUFBO0lBQ3ZDLENBQUM7SUFFRDtRQXNLQTs7O1dBR0c7UUFDSCxxQkFBZ0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUMsQ0FBQyxDQUFBO1lBRTNGLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzlCLE9BQU8sSUFB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LG1CQUFtQjtRQUNuQixPQUFPLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUE7SUFDbEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBDbGllbnQgZnJvbSBcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9jbGllbnQvaW5kZXguanNcIlxuaW1wb3J0IENsaWVudFdlYlNvY2tldCBmcm9tIFwic2NvdW5kcmVsLXJlbW90ZS1ldmFsL2J1aWxkL2NsaWVudC9jb25uZWN0aW9ucy93ZWItc29ja2V0L2luZGV4LmpzXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSBcImV2ZW50ZW1pdHRlcjNcIlxuXG5pbXBvcnQgU3lzdGVtVGVzdENvbW11bmljYXRvciBmcm9tIFwiLi9zeXN0ZW0tdGVzdC1jb21tdW5pY2F0b3IuanNcIlxuXG4vKiogQHR5cGUge3tzeXN0ZW1UZXN0QnJvd3NlckhlbHBlcjogU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIgfCBudWxsfX0gKi9cbmNvbnN0IHNoYXJlZCA9IHtcbiAgc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI6IG51bGxcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIge1xuICAvKiogQHJldHVybnMge1N5c3RlbVRlc3RCcm93c2VySGVscGVyIHwgbnVsbH0gKi9cbiAgc3RhdGljIGdldEN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlclxuICB9XG5cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgaWYgKCFzaGFyZWQuc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGN1cnJlbnQgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIgc2V0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlclxuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBuZXcgU3lzdGVtVGVzdENvbW11bmljYXRvcih7cGFyZW50OiB0aGlzLCBvbkNvbW1hbmQ6IHRoaXMub25Db21tYW5kfSlcbiAgICB0aGlzLl9lbmFibGVkID0gZmFsc2VcbiAgICB0aGlzLl9oYXNJbml0aWFsaXplZCA9IGZhbHNlXG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICAgIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlciA9IHRoaXNcblxuICAgIHRoaXMuc3RhcnRTY291bmRyZWwoKVxuICB9XG5cbiAgYXN5bmMgc3RhcnRTY291bmRyZWwoKSB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZ2V0U3lzdGVtVGVzdEhvc3QoKVxuICAgIHRoaXMuc2NvdW5kcmVsV3MgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7aG9zdH06ODA5MGApXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy5zY291bmRyZWxDbGllbnRXZWJTb2NrZXQgPSBuZXcgQ2xpZW50V2ViU29ja2V0KHRoaXMuc2NvdW5kcmVsV3MpXG5cbiAgICBhd2FpdCB0aGlzLnNjb3VuZHJlbENsaWVudFdlYlNvY2tldC53YWl0Rm9yT3BlbmVkKClcblxuICAgIHRoaXMuc2NvdW5kcmVsQ2xpZW50ID0gbmV3IENsaWVudCh0aGlzLnNjb3VuZHJlbENsaWVudFdlYlNvY2tldCwge2VuYWJsZVNlcnZlckNvbnRyb2w6IHRydWV9KVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJzY291bmRyZWxTdGFydGVkXCIpXG4gIH1cblxuICB3YWl0Rm9yU2NvdW5kcmVsU3RhcnRlZCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGlmICh0aGlzLnNjb3VuZHJlbENsaWVudCkge1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXZlbnRzLm9uY2UoXCJzY291bmRyZWxTdGFydGVkXCIsICgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0U2NvdW5kcmVsKCkge1xuICAgIGlmICghdGhpcy5zY291bmRyZWxDbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBjbGllbnQgaXMgbm90IHN0YXJ0ZWQgeWV0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2NvdW5kcmVsQ2xpZW50XG4gIH1cblxuICBjb25uZWN0T25FcnJvcigpIHtcbiAgICBpZiAoIXdpbmRvdz8uYWRkRXZlbnRMaXN0ZW5lcikgcmV0dXJuXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIChldmVudCkgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcih7XG4gICAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgZXJyb3I6IGV2ZW50LmVycm9yLFxuICAgICAgICBlcnJvckNsYXNzOiBldmVudC5lcnJvcj8ubmFtZSxcbiAgICAgICAgZmlsZTogZXZlbnQuZmlsZW5hbWUsXG4gICAgICAgIGxpbmU6IGV2ZW50LmxpbmVubyxcbiAgICAgICAgbWVzc2FnZTogZXZlbnQubWVzc2FnZSB8fCBcIlVua25vd24gZXJyb3JcIixcbiAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgY29ubmVjdFVuaGFuZGxlZFJlamVjdGlvbigpIHtcbiAgICBpZiAoIXdpbmRvdz8uYWRkRXZlbnRMaXN0ZW5lcikgcmV0dXJuXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInVuaGFuZGxlZHJlamVjdGlvblwiLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3Ioe1xuICAgICAgICB0eXBlOiBcInVuaGFuZGxlZHJlamVjdGlvblwiLFxuICAgICAgICBlcnJvcjogZXZlbnQucmVhc29uLFxuICAgICAgICBlcnJvckNsYXNzOiBcIlVuaGFuZGxlZFJlamVjdGlvblwiLFxuICAgICAgICBtZXNzYWdlOiBldmVudC5yZWFzb24ubWVzc2FnZSB8fCBldmVudC5yZWFzb24gfHwgXCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gd2l0aG91dCBhIG1lc3NhZ2VcIixcbiAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5iYWNrdHJhY2VdXG4gICAqIEBwYXJhbSB7RXJyb3J9IFtkYXRhLmVycm9yXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuZXJyb3JDbGFzc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmZpbGVdXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF0YS5saW5lXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEubWVzc2FnZV1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLnR5cGVdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS51cmxdXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgaGFuZGxlRXJyb3IoZGF0YSkge1xuICAgIGxldCBiYWNrdHJhY2VcblxuICAgIGlmIChkYXRhLmVycm9yICYmIGRhdGEuZXJyb3Iuc3RhY2spIHtcbiAgICAgIGJhY2t0cmFjZSA9IGRhdGEuZXJyb3Iuc3RhY2suc3BsaXQoXCJcXG5cIilcbiAgICAgIGJhY2t0cmFjZS5zaGlmdCgpXG4gICAgICBiYWNrdHJhY2UgPSBiYWNrdHJhY2Uuam9pbihcIlxcblwiKVxuICAgIH0gZWxzZSBpZiAoZGF0YS5maWxlKSB7XG4gICAgICBiYWNrdHJhY2UgPSBgJHtkYXRhLmZpbGV9OiR7ZGF0YS5saW5lfWBcbiAgICB9XG5cbiAgICBkYXRhLmJhY2t0cmFjZSA9IGJhY2t0cmFjZVxuXG4gICAgdGhpcy5jb21tdW5pY2F0b3Iuc2VuZENvbW1hbmQoZGF0YSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgY29ubmVjdFdlYlNvY2tldCgpIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5nZXRTeXN0ZW1UZXN0SG9zdCgpXG4gICAgdGhpcy53cyA9IG5ldyBXZWJTb2NrZXQoYHdzOi8vJHtob3N0fToxOTg1YClcbiAgICB0aGlzLmNvbW11bmljYXRvci53cyA9IHRoaXMud3NcbiAgICB0aGlzLndzLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBkaWdnKHRoaXMsIFwiY29tbXVuaWNhdG9yXCIsIFwib25FcnJvclwiKSlcbiAgICB0aGlzLndzLmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsIGRpZ2codGhpcywgXCJjb21tdW5pY2F0b3JcIiwgXCJvbk9wZW5cIikpXG4gICAgdGhpcy53cy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoZXZlbnQpID0+IHRoaXMuY29tbXVuaWNhdG9yLm9uTWVzc2FnZShldmVudC5kYXRhKSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBnZXRTeXN0ZW1UZXN0SG9zdCgpIHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IGdsb2JhbFRoaXMubG9jYXRpb25cbiAgICBjb25zdCBkZWZhdWx0SG9zdCA9IGxvY2F0aW9uPy5ob3N0bmFtZSB8fCBcImxvY2FsaG9zdFwiXG4gICAgY29uc3Qgc2VhcmNoID0gbG9jYXRpb24/LnNlYXJjaFxuICAgIGNvbnN0IGVudkhvc3QgPSBwcm9jZXNzLmVudi5FWFBPX1BVQkxJQ19TWVNURU1fVEVTVF9IT1NUXG5cbiAgICBpZiAoZW52SG9zdCkgcmV0dXJuIGVudkhvc3RcblxuICAgIGlmICghc2VhcmNoKSByZXR1cm4gZGVmYXVsdEhvc3RcblxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoc2VhcmNoKVxuICAgIGNvbnN0IGhvc3QgPSBwYXJhbXMuZ2V0KFwic3lzdGVtVGVzdEhvc3RcIilcblxuICAgIGNvbnN0IHJlc29sdmVkSG9zdCA9IGhvc3QgfHwgZGVmYXVsdEhvc3RcblxuICAgIGlmIChyZXNvbHZlZEhvc3QgPT09IFwiMC4wLjAuMFwiKSByZXR1cm4gXCIxMjcuMC4wLjFcIlxuXG4gICAgcmV0dXJuIHJlc29sdmVkSG9zdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBlbmFibGVPbkJyb3dzZXIoKSB7XG4gICAgaWYgKHRoaXMuX2VuYWJsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlXG4gICAgdGhpcy5jb25uZWN0V2ViU29ja2V0KClcbiAgICB0aGlzLmNvbm5lY3RPbkVycm9yKClcbiAgICB0aGlzLmNvbm5lY3RVbmhhbmRsZWRSZWplY3Rpb24oKVxuICAgIHRoaXMub3ZlcnJpZGVDb25zb2xlTG9nKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgZ2V0RW5hYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2VuYWJsZWQgfVxuXG4gIC8qKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSAqL1xuICBnZXRFdmVudHMoKSB7IHJldHVybiB0aGlzLmV2ZW50cyB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgY29tbWFuZCBldmVudCBhbmQgdGhyb3dzIHdoZW4gbm8gbGlzdGVuZXIgaGFuZGxlZCBpdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3twYXRoOiBzdHJpbmd9fSBwYXlsb2FkXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZW1pdENvbW1hbmRFdmVudChldmVudE5hbWUsIHBheWxvYWQpIHtcbiAgICBjb25zdCBkaWRFbWl0ID0gdGhpcy5ldmVudHMuZW1pdChldmVudE5hbWUsIHBheWxvYWQpXG5cbiAgICBpZiAoIWRpZEVtaXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gbGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3IgY29tbWFuZCBldmVudDogJHtldmVudE5hbWV9ICgke3BheWxvYWQucGF0aH0pYClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZha2VDb25zb2xlRXJyb3IgPSAoLi4uYXJncykgPT4ge1xuICAgIHRoaXMuY29tbXVuaWNhdG9yLnNlbmRDb21tYW5kKHt0eXBlOiBcImNvbnNvbGUuZXJyb3JcIiwgdmFsdWU6IHRoaXMuY29uc29sZUxvZ01lc3NhZ2UoYXJncyl9KVxuXG4gICAgaWYgKHRoaXMub3JpZ2luYWxDb25zb2xlRXJyb3IpIHtcbiAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsQ29uc29sZUVycm9yKC4uLmFyZ3MpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmYWtlQ29uc29sZUxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgdGhpcy5jb21tdW5pY2F0b3Iuc2VuZENvbW1hbmQoe3R5cGU6IFwiY29uc29sZS5sb2dcIiwgdmFsdWU6IHRoaXMuY29uc29sZUxvZ01lc3NhZ2UoYXJncyl9KVxuXG4gICAgaWYgKHRoaXMub3JpZ2luYWxDb25zb2xlTG9nKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbENvbnNvbGVMb2coLi4uYXJncylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGFyZ1xuICAgKiBAcGFyYW0ge2FueVtdfSBbc2Nhbm5lZE9iamVjdHNdXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBjb25zb2xlTG9nTWVzc2FnZShhcmcsIHNjYW5uZWRPYmplY3RzID0gW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICBpZiAoc2Nhbm5lZE9iamVjdHMuaW5jbHVkZXMoYXJnKSkge1xuICAgICAgICByZXR1cm4gXCJbcmVjdXJzaXZlXVwiXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2FubmVkT2JqZWN0cy5wdXNoKGFyZylcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhcmcpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jb25zb2xlTG9nTWVzc2FnZSh2YWx1ZSwgc2Nhbm5lZE9iamVjdHMpKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSBlbHNlIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIGlmIChzY2FubmVkT2JqZWN0cy5pbmNsdWRlcyhhcmcpKSB7XG4gICAgICAgIHJldHVybiBcIltyZWN1cnNpdmVdXCJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjYW5uZWRPYmplY3RzLnB1c2goYXJnKVxuICAgICAgfVxuXG4gICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhcmcpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmNvbnNvbGVMb2dNZXNzYWdlKGFyZ1trZXldLCBzY2FubmVkT2JqZWN0cylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZyA9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gYFtvYmplY3QgJHthcmc/LmNvbnN0cnVjdG9yPy5uYW1lfV1gXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhcmdcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7ZGF0YToge3BhdGg6IHN0cmluZywgdHlwZTogc3RyaW5nfX19IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8e3Jlc3VsdDogc3RyaW5nfSB8IHZvaWQ+fVxuICAgKi9cbiAgb25Db21tYW5kID0gYXN5bmMgKHtkYXRhfSkgPT4ge1xuICAgIGlmIChkYXRhLnR5cGUgPT0gXCJpbml0aWFsaXplXCIpIHtcbiAgICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJpbml0aWFsaXplXCIpXG5cbiAgICAgIGlmICghdGhpcy5faGFzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgdGhpcy5faGFzSW5pdGlhbGl6ZWQgPSB0cnVlXG5cbiAgICAgICAgaWYgKHRoaXMuX29uRmlyc3RJbml0aWFsaXplQ2FsbGJhY2spIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9vbkZpcnN0SW5pdGlhbGl6ZUNhbGxiYWNrKClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fb25Jbml0aWFsaXplQ2FsbGJhY2spIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fb25Jbml0aWFsaXplQ2FsbGJhY2soKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge3Jlc3VsdDogXCJpbml0aWFsaXplZFwifVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwid2FpdEZvclNjb3VuZHJlbFwiKSB7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JTY291bmRyZWxTdGFydGVkKClcbiAgICAgIHJldHVybiB7cmVzdWx0OiBcInNjb3VuZHJlbC1yZWFkeVwifVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwidmlzaXRcIikge1xuICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KFwibmF2aWdhdGVcIiwge3BhdGg6IGRhdGEucGF0aH0pXG4gICAgICByZXR1cm4ge3Jlc3VsdDogXCJ2aXNpdGVkXCJ9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJkaXNtaXNzVG9cIikge1xuICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KFwiZGlzbWlzc1RvXCIsIHtwYXRoOiBkYXRhLnBhdGh9KVxuICAgICAgcmV0dXJuIHtyZXN1bHQ6IFwiZGlzbWlzc2VkXCJ9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21tYW5kIHR5cGUgZm9yIFN5c3RlbVRlc3RCcm93c2VySGVscGVyOiAke2RhdGEudHlwZX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiB2b2lkfSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uSW5pdGlhbGl6ZShjYWxsYmFjaykge1xuICAgIHRoaXMuX29uSW5pdGlhbGl6ZUNhbGxiYWNrID0gY2FsbGJhY2tcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiB2b2lkfSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uRmlyc3RJbml0aWFsaXplKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fb25GaXJzdEluaXRpYWxpemVDYWxsYmFjayA9IGNhbGxiYWNrXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIG92ZXJyaWRlQ29uc29sZUxvZygpIHtcbiAgICBpZiAodGhpcy5vcmlnaW5hbENvbnNvbGVFcnJvciB8fCB0aGlzLm9yaWdpbmFsQ29uc29sZUxvZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29uc29sZSBtZXRob2RzIGhhcyBhbHJlYWR5IGJlZW4gb3ZlcnJpZGRlbiFcIilcbiAgICB9XG5cbiAgICB0aGlzLm9yaWdpbmFsQ29uc29sZUVycm9yID0gY29uc29sZS5lcnJvclxuICAgIHRoaXMub3JpZ2luYWxDb25zb2xlTG9nID0gY29uc29sZS5sb2dcblxuICAgIGNvbnNvbGUuZXJyb3IgPSB0aGlzLmZha2VDb25zb2xlRXJyb3JcbiAgICBjb25zb2xlLmxvZyA9IHRoaXMuZmFrZUNvbnNvbGVMb2dcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn1cbiAgICovXG4gIGFzeW5jIHNlbmRRdWVyeShzcWwpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29tbXVuaWNhdG9yLnNlbmRDb21tYW5kKHt0eXBlOiBcInF1ZXJ5XCIsIHNxbH0pXG4gIH1cbn1cbiJdfQ==
310
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sTUFBTSxNQUFNLDZDQUE2QyxDQUFBO0FBQ2hFLE9BQU8sZUFBZSxNQUFNLG9FQUFvRSxDQUFBO0FBQ2hHLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUUxQyxPQUFPLHNCQUFzQixNQUFNLCtCQUErQixDQUFBO0FBRWxFLHdFQUF3RTtBQUN4RSxNQUFNLE1BQU0sR0FBRztJQUNiLHVCQUF1QixFQUFFLElBQUk7Q0FDOUIsQ0FBQTtBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8sdUJBQXVCO0lBQzFDOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsUUFBUTtRQUN2QyxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFBO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLFFBQVEsRUFBRSxNQUFNLENBQUE7UUFFL0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxRQUFRLENBQUE7UUFDakIsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUU1RCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLFFBQVEsQ0FBQTtRQUNqQixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTVCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFD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LEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxHQUFHLENBQUE7UUFDN0MsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEdBQUcsQ0FBQTtRQUNaLENBQUM7SUFDSCxDQUFDO0lBcUNEOzs7T0FHRztJQUNILFlBQVksQ0FBQyxRQUFRO1FBQ25CLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxRQUFRLENBQUE7SUFDdkMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQixDQUFDLFFBQVE7UUFDeEIsSUFBSSxDQUFDLDBCQUEwQixHQUFHLFFBQVEsQ0FBQTtJQUM1QyxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLGtCQUFrQjtRQUNoQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN6RCxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUE7UUFDakUsQ0FBQztRQUVELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFBO1FBQ3pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFBO1FBRXJDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFBO1FBQ3JDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQTtJQUNuQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHO1FBQ2pCLG1CQUFtQjtRQUNuQixPQUFPLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUE7SUFDbEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBDbGllbnQgZnJvbSBcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9jbGllbnQvaW5kZXguanNcIlxuaW1wb3J0IENsaWVudFdlYlNvY2tldCBmcm9tIFwic2NvdW5kcmVsLXJlbW90ZS1ldmFsL2J1aWxkL2NsaWVudC9jb25uZWN0aW9ucy93ZWItc29ja2V0L2luZGV4LmpzXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSBcImV2ZW50ZW1pdHRlcjNcIlxuXG5pbXBvcnQgU3lzdGVtVGVzdENvbW11bmljYXRvciBmcm9tIFwiLi9zeXN0ZW0tdGVzdC1jb21tdW5pY2F0b3IuanNcIlxuXG4vKiogQHR5cGUge3tzeXN0ZW1UZXN0QnJvd3NlckhlbHBlcjogU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIgfCBudWxsfX0gKi9cbmNvbnN0IHNoYXJlZCA9IHtcbiAgc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI6IG51bGxcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtZXRlck5hbWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGZhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXRTeXN0ZW1UZXN0UG9ydChwYXJhbWV0ZXJOYW1lLCBmYWxsYmFjaykge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gZ2xvYmFsVGhpcy5sb2NhdGlvblxuICAgIGNvbnN0IHNlYXJjaCA9IGxvY2F0aW9uPy5zZWFyY2hcblxuICAgIGlmICghc2VhcmNoKSB7XG4gICAgICByZXR1cm4gZmFsbGJhY2tcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoc2VhcmNoKS5nZXQocGFyYW1ldGVyTmFtZSlcblxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxsYmFja1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSlcblxuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlZCkgJiYgcGFyc2VkID4gMCA/IHBhcnNlZCA6IGZhbGxiYWNrXG4gIH1cblxuICAvKiogQHJldHVybnMge1N5c3RlbVRlc3RCcm93c2VySGVscGVyIHwgbnVsbH0gKi9cbiAgc3RhdGljIGdldEN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlclxuICB9XG5cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgaWYgKCFzaGFyZWQuc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGN1cnJlbnQgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIgc2V0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlclxuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBuZXcgU3lzdGVtVGVzdENvbW11bmljYXRvcih7cGFyZW50OiB0aGlzLCBvbkNvbW1hbmQ6IHRoaXMub25Db21tYW5kfSlcbiAgICB0aGlzLl9lbmFibGVkID0gZmFsc2VcbiAgICB0aGlzLl9oYXNJbml0aWFsaXplZCA9IGZhbHNlXG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICAgIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlciA9IHRoaXNcblxuICAgIHRoaXMuc3RhcnRTY291bmRyZWwoKVxuICB9XG5cbiAgYXN5bmMgc3RhcnRTY291bmRyZWwoKSB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZ2V0U3lzdGVtVGVzdEhvc3QoKVxuICAgIGNvbnN0IHNjb3VuZHJlbFBvcnQgPSB0aGlzLmdldFN5c3RlbVRlc3RQb3J0KFwic3lzdGVtVGVzdFNjb3VuZHJlbFBvcnRcIiwgODA5MClcblxuICAgIHRoaXMuc2NvdW5kcmVsV3MgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7aG9zdH06JHtzY291bmRyZWxQb3J0fWApXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy5zY291bmRyZWxDbGllbnRXZWJTb2NrZXQgPSBuZXcgQ2xpZW50V2ViU29ja2V0KHRoaXMuc2NvdW5kcmVsV3MpXG5cbiAgICBhd2FpdCB0aGlzLnNjb3VuZHJlbENsaWVudFdlYlNvY2tldC53YWl0Rm9yT3BlbmVkKClcblxuICAgIHRoaXMuc2NvdW5kcmVsQ2xpZW50ID0gbmV3IENsaWVudCh0aGlzLnNjb3VuZHJlbENsaWVudFdlYlNvY2tldCwge2VuYWJsZVNlcnZlckNvbnRyb2w6IHRydWV9KVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJzY291bmRyZWxTdGFydGVkXCIpXG4gIH1cblxuICB3YWl0Rm9yU2NvdW5kcmVsU3RhcnRlZCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGlmICh0aGlzLnNjb3VuZHJlbENsaWVudCkge1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXZlbnRzLm9uY2UoXCJzY291bmRyZWxTdGFydGVkXCIsICgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0U2NvdW5kcmVsKCkge1xuICAgIGlmICghdGhpcy5zY291bmRyZWxDbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBjbGllbnQgaXMgbm90IHN0YXJ0ZWQgeWV0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2NvdW5kcmVsQ2xpZW50XG4gIH1cblxuICBjb25uZWN0T25FcnJvcigpIHtcbiAgICBpZiAoIXdpbmRvdz8uYWRkRXZlbnRMaXN0ZW5lcikgcmV0dXJuXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIChldmVudCkgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcih7XG4gICAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgZXJyb3I6IGV2ZW50LmVycm9yLFxuICAgICAgICBlcnJvckNsYXNzOiBldmVudC5lcnJvcj8ubmFtZSxcbiAgICAgICAgZmlsZTogZXZlbnQuZmlsZW5hbWUsXG4gICAgICAgIGxpbmU6IGV2ZW50LmxpbmVubyxcbiAgICAgICAgbWVzc2FnZTogZXZlbnQubWVzc2FnZSB8fCBcIlVua25vd24gZXJyb3JcIixcbiAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgY29ubmVjdFVuaGFuZGxlZFJlamVjdGlvbigpIHtcbiAgICBpZiAoIXdpbmRvdz8uYWRkRXZlbnRMaXN0ZW5lcikgcmV0dXJuXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInVuaGFuZGxlZHJlamVjdGlvblwiLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3Ioe1xuICAgICAgICB0eXBlOiBcInVuaGFuZGxlZHJlamVjdGlvblwiLFxuICAgICAgICBlcnJvcjogZXZlbnQucmVhc29uLFxuICAgICAgICBlcnJvckNsYXNzOiBcIlVuaGFuZGxlZFJlamVjdGlvblwiLFxuICAgICAgICBtZXNzYWdlOiBldmVudC5yZWFzb24ubWVzc2FnZSB8fCBldmVudC5yZWFzb24gfHwgXCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gd2l0aG91dCBhIG1lc3NhZ2VcIixcbiAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5iYWNrdHJhY2VdXG4gICAqIEBwYXJhbSB7RXJyb3J9IFtkYXRhLmVycm9yXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuZXJyb3JDbGFzc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmZpbGVdXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF0YS5saW5lXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEubWVzc2FnZV1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLnR5cGVdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS51cmxdXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgaGFuZGxlRXJyb3IoZGF0YSkge1xuICAgIGxldCBiYWNrdHJhY2VcblxuICAgIGlmIChkYXRhLmVycm9yICYmIGRhdGEuZXJyb3Iuc3RhY2spIHtcbiAgICAgIGJhY2t0cmFjZSA9IGRhdGEuZXJyb3Iuc3RhY2suc3BsaXQoXCJcXG5cIilcbiAgICAgIGJhY2t0cmFjZS5zaGlmdCgpXG4gICAgICBiYWNrdHJhY2UgPSBiYWNrdHJhY2Uuam9pbihcIlxcblwiKVxuICAgIH0gZWxzZSBpZiAoZGF0YS5maWxlKSB7XG4gICAgICBiYWNrdHJhY2UgPSBgJHtkYXRhLmZpbGV9OiR7ZGF0YS5saW5lfWBcbiAgICB9XG5cbiAgICBkYXRhLmJhY2t0cmFjZSA9IGJhY2t0cmFjZVxuXG4gICAgdGhpcy5jb21tdW5pY2F0b3Iuc2VuZENvbW1hbmQoZGF0YSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgY29ubmVjdFdlYlNvY2tldCgpIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5nZXRTeXN0ZW1UZXN0SG9zdCgpXG4gICAgY29uc3QgY2xpZW50V3NQb3J0ID0gdGhpcy5nZXRTeXN0ZW1UZXN0UG9ydChcInN5c3RlbVRlc3RDbGllbnRXc1BvcnRcIiwgMTk4NSlcblxuICAgIHRoaXMud3MgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7aG9zdH06JHtjbGllbnRXc1BvcnR9YClcbiAgICB0aGlzLmNvbW11bmljYXRvci53cyA9IHRoaXMud3NcbiAgICB0aGlzLndzLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBkaWdnKHRoaXMsIFwiY29tbXVuaWNhdG9yXCIsIFwib25FcnJvclwiKSlcbiAgICB0aGlzLndzLmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsIGRpZ2codGhpcywgXCJjb21tdW5pY2F0b3JcIiwgXCJvbk9wZW5cIikpXG4gICAgdGhpcy53cy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoZXZlbnQpID0+IHRoaXMuY29tbXVuaWNhdG9yLm9uTWVzc2FnZShldmVudC5kYXRhKSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBnZXRTeXN0ZW1UZXN0SG9zdCgpIHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IGdsb2JhbFRoaXMubG9jYXRpb25cbiAgICBjb25zdCBkZWZhdWx0SG9zdCA9IGxvY2F0aW9uPy5ob3N0bmFtZSB8fCBcImxvY2FsaG9zdFwiXG4gICAgY29uc3Qgc2VhcmNoID0gbG9jYXRpb24/LnNlYXJjaFxuICAgIGNvbnN0IGVudkhvc3QgPSBwcm9jZXNzLmVudi5FWFBPX1BVQkxJQ19TWVNURU1fVEVTVF9IT1NUXG5cbiAgICBpZiAoZW52SG9zdCkgcmV0dXJuIGVudkhvc3RcblxuICAgIGlmICghc2VhcmNoKSByZXR1cm4gZGVmYXVsdEhvc3RcblxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoc2VhcmNoKVxuICAgIGNvbnN0IGhvc3QgPSBwYXJhbXMuZ2V0KFwic3lzdGVtVGVzdEhvc3RcIilcblxuICAgIGNvbnN0IHJlc29sdmVkSG9zdCA9IGhvc3QgfHwgZGVmYXVsdEhvc3RcblxuICAgIGlmIChyZXNvbHZlZEhvc3QgPT09IFwiMC4wLjAuMFwiKSByZXR1cm4gXCIxMjcuMC4wLjFcIlxuXG4gICAgcmV0dXJuIHJlc29sdmVkSG9zdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBlbmFibGVPbkJyb3dzZXIoKSB7XG4gICAgaWYgKHRoaXMuX2VuYWJsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlXG4gICAgdGhpcy5jb25uZWN0V2ViU29ja2V0KClcbiAgICB0aGlzLmNvbm5lY3RPbkVycm9yKClcbiAgICB0aGlzLmNvbm5lY3RVbmhhbmRsZWRSZWplY3Rpb24oKVxuICAgIHRoaXMub3ZlcnJpZGVDb25zb2xlTG9nKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgZ2V0RW5hYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2VuYWJsZWQgfVxuXG4gIC8qKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSAqL1xuICBnZXRFdmVudHMoKSB7IHJldHVybiB0aGlzLmV2ZW50cyB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgY29tbWFuZCBldmVudCBhbmQgdGhyb3dzIHdoZW4gbm8gbGlzdGVuZXIgaGFuZGxlZCBpdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3twYXRoOiBzdHJpbmd9fSBwYXlsb2FkXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZW1pdENvbW1hbmRFdmVudChldmVudE5hbWUsIHBheWxvYWQpIHtcbiAgICBjb25zdCBkaWRFbWl0ID0gdGhpcy5ldmVudHMuZW1pdChldmVudE5hbWUsIHBheWxvYWQpXG5cbiAgICBpZiAoIWRpZEVtaXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gbGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3IgY29tbWFuZCBldmVudDogJHtldmVudE5hbWV9ICgke3BheWxvYWQucGF0aH0pYClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZha2VDb25zb2xlRXJyb3IgPSAoLi4uYXJncykgPT4ge1xuICAgIHRoaXMuY29tbXVuaWNhdG9yLnNlbmRDb21tYW5kKHt0eXBlOiBcImNvbnNvbGUuZXJyb3JcIiwgdmFsdWU6IHRoaXMuY29uc29sZUxvZ01lc3NhZ2UoYXJncyl9KVxuXG4gICAgaWYgKHRoaXMub3JpZ2luYWxDb25zb2xlRXJyb3IpIHtcbiAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsQ29uc29sZUVycm9yKC4uLmFyZ3MpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmYWtlQ29uc29sZUxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgdGhpcy5jb21tdW5pY2F0b3Iuc2VuZENvbW1hbmQoe3R5cGU6IFwiY29uc29sZS5sb2dcIiwgdmFsdWU6IHRoaXMuY29uc29sZUxvZ01lc3NhZ2UoYXJncyl9KVxuXG4gICAgaWYgKHRoaXMub3JpZ2luYWxDb25zb2xlTG9nKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbENvbnNvbGVMb2coLi4uYXJncylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGFyZ1xuICAgKiBAcGFyYW0ge2FueVtdfSBbc2Nhbm5lZE9iamVjdHNdXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBjb25zb2xlTG9nTWVzc2FnZShhcmcsIHNjYW5uZWRPYmplY3RzID0gW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICBpZiAoc2Nhbm5lZE9iamVjdHMuaW5jbHVkZXMoYXJnKSkge1xuICAgICAgICByZXR1cm4gXCJbcmVjdXJzaXZlXVwiXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2FubmVkT2JqZWN0cy5wdXNoKGFyZylcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhcmcpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jb25zb2xlTG9nTWVzc2FnZSh2YWx1ZSwgc2Nhbm5lZE9iamVjdHMpKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSBlbHNlIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIGlmIChzY2FubmVkT2JqZWN0cy5pbmNsdWRlcyhhcmcpKSB7XG4gICAgICAgIHJldHVybiBcIltyZWN1cnNpdmVdXCJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjYW5uZWRPYmplY3RzLnB1c2goYXJnKVxuICAgICAgfVxuXG4gICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhcmcpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmNvbnNvbGVMb2dNZXNzYWdlKGFyZ1trZXldLCBzY2FubmVkT2JqZWN0cylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZyA9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gYFtvYmplY3QgJHthcmc/LmNvbnN0cnVjdG9yPy5uYW1lfV1gXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhcmdcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7ZGF0YToge3BhdGg6IHN0cmluZywgdHlwZTogc3RyaW5nfX19IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8e3Jlc3VsdDogc3RyaW5nfSB8IHZvaWQ+fVxuICAgKi9cbiAgb25Db21tYW5kID0gYXN5bmMgKHtkYXRhfSkgPT4ge1xuICAgIGlmIChkYXRhLnR5cGUgPT0gXCJpbml0aWFsaXplXCIpIHtcbiAgICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJpbml0aWFsaXplXCIpXG5cbiAgICAgIGlmICghdGhpcy5faGFzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgdGhpcy5faGFzSW5pdGlhbGl6ZWQgPSB0cnVlXG5cbiAgICAgICAgaWYgKHRoaXMuX29uRmlyc3RJbml0aWFsaXplQ2FsbGJhY2spIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9vbkZpcnN0SW5pdGlhbGl6ZUNhbGxiYWNrKClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fb25Jbml0aWFsaXplQ2FsbGJhY2spIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fb25Jbml0aWFsaXplQ2FsbGJhY2soKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge3Jlc3VsdDogXCJpbml0aWFsaXplZFwifVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwid2FpdEZvclNjb3VuZHJlbFwiKSB7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JTY291bmRyZWxTdGFydGVkKClcbiAgICAgIHJldHVybiB7cmVzdWx0OiBcInNjb3VuZHJlbC1yZWFkeVwifVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwidmlzaXRcIikge1xuICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KFwibmF2aWdhdGVcIiwge3BhdGg6IGRhdGEucGF0aH0pXG4gICAgICByZXR1cm4ge3Jlc3VsdDogXCJ2aXNpdGVkXCJ9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJkaXNtaXNzVG9cIikge1xuICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KFwiZGlzbWlzc1RvXCIsIHtwYXRoOiBkYXRhLnBhdGh9KVxuICAgICAgcmV0dXJuIHtyZXN1bHQ6IFwiZGlzbWlzc2VkXCJ9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21tYW5kIHR5cGUgZm9yIFN5c3RlbVRlc3RCcm93c2VySGVscGVyOiAke2RhdGEudHlwZX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiB2b2lkfSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uSW5pdGlhbGl6ZShjYWxsYmFjaykge1xuICAgIHRoaXMuX29uSW5pdGlhbGl6ZUNhbGxiYWNrID0gY2FsbGJhY2tcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiB2b2lkfSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uRmlyc3RJbml0aWFsaXplKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fb25GaXJzdEluaXRpYWxpemVDYWxsYmFjayA9IGNhbGxiYWNrXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIG92ZXJyaWRlQ29uc29sZUxvZygpIHtcbiAgICBpZiAodGhpcy5vcmlnaW5hbENvbnNvbGVFcnJvciB8fCB0aGlzLm9yaWdpbmFsQ29uc29sZUxvZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29uc29sZSBtZXRob2RzIGhhcyBhbHJlYWR5IGJlZW4gb3ZlcnJpZGRlbiFcIilcbiAgICB9XG5cbiAgICB0aGlzLm9yaWdpbmFsQ29uc29sZUVycm9yID0gY29uc29sZS5lcnJvclxuICAgIHRoaXMub3JpZ2luYWxDb25zb2xlTG9nID0gY29uc29sZS5sb2dcblxuICAgIGNvbnNvbGUuZXJyb3IgPSB0aGlzLmZha2VDb25zb2xlRXJyb3JcbiAgICBjb25zb2xlLmxvZyA9IHRoaXMuZmFrZUNvbnNvbGVMb2dcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn1cbiAgICovXG4gIGFzeW5jIHNlbmRRdWVyeShzcWwpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29tbXVuaWNhdG9yLnNlbmRDb21tYW5kKHt0eXBlOiBcInF1ZXJ5XCIsIHNxbH0pXG4gIH1cbn1cbiJdfQ==
@@ -7,6 +7,8 @@
7
7
  * @property {string} [httpConnectHost] Hostname used by the driver to reach the HTTP server.
8
8
  * @property {boolean} [debug] Enable debug logging.
9
9
  * @property {(error: any) => boolean} [errorFilter] Filter for browser errors (return false to ignore).
10
+ * @property {number} [clientWsPort] Port for the browser-command WebSocket server.
11
+ * @property {number} [scoundrelPort] Port for the Scoundrel WebSocket server.
10
12
  * @property {Record<string, any>} [urlArgs] Query params appended to the root path.
11
13
  * @property {SystemTestDriverConfig} [driver] Driver configuration.
12
14
  */
@@ -19,6 +21,7 @@
19
21
  * @typedef {object} FindArgs
20
22
  * @property {number} [timeout] Override timeout for lookup.
21
23
  * @property {boolean | null} [visible] Whether to require elements to be visible (`true`) or hidden (`false`). Use `null` to disable visibility filtering.
24
+ * @property {boolean} [scrollTo] Whether to scroll found elements into view before returning them.
22
25
  * @property {boolean} [useBaseSelector] Whether to scope by the base selector.
23
26
  */
24
27
  /**
@@ -59,12 +62,14 @@ export default class SystemTest extends Browser {
59
62
  * Creates a new SystemTest instance
60
63
  * @param {SystemTestArgs} [args]
61
64
  */
62
- constructor({ host, port, httpHost, httpPort, httpConnectHost, debug, errorFilter, urlArgs, driver, ...restArgs }?: SystemTestArgs);
65
+ constructor({ clientWsPort, host, port, httpHost, httpPort, httpConnectHost, debug, errorFilter, scoundrelPort, urlArgs, driver, ...restArgs }?: SystemTestArgs);
63
66
  _started: boolean;
67
+ _clientWsPort: number;
64
68
  _httpHost: string;
65
69
  _httpPort: number;
66
70
  /** @type {(error: any) => boolean | undefined} */
67
71
  _errorFilter: (error: any) => boolean | undefined;
72
+ _scoundrelPort: number;
68
73
  /** @type {WebSocketServer | undefined} */
69
74
  scoundrelWss: WebSocketServer | undefined;
70
75
  /** @type {WebSocketServer | undefined} */
@@ -252,6 +257,14 @@ export type SystemTestArgs = {
252
257
  * Filter for browser errors (return false to ignore).
253
258
  */
254
259
  errorFilter?: (error: any) => boolean;
260
+ /**
261
+ * Port for the browser-command WebSocket server.
262
+ */
263
+ clientWsPort?: number;
264
+ /**
265
+ * Port for the Scoundrel WebSocket server.
266
+ */
267
+ scoundrelPort?: number;
255
268
  /**
256
269
  * Query params appended to the root path.
257
270
  */
@@ -280,6 +293,10 @@ export type FindArgs = {
280
293
  * Whether to require elements to be visible (`true`) or hidden (`false`). Use `null` to disable visibility filtering.
281
294
  */
282
295
  visible?: boolean | null;
296
+ /**
297
+ * Whether to scroll found elements into view before returning them.
298
+ */
299
+ scrollTo?: boolean;
283
300
  /**
284
301
  * Whether to scope by the base selector.
285
302
  */