PageSourceSearch

https://www.blutoothbrush.com/cdn/shop/t/60/assets/app.js?v=104344540167097334551788283778

js blutoothbrush.com collected 2026-10-02 00:05:55 UTC 710,976 bytes, 2 lines download raw bytes

1(function(){var __webpack_modules__={
vendor: 18,178 bytes, line 1
1"./node_modules/@pixelunion/age-gate/dist/index.es.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   "PageAgeGate": () => (/* binding */ PageAgeGate),\n/* harmony export */   "SiteAgeGate": () => (/* binding */ SiteAgeGate)\n/* harmony export */ });\n\n/*!\n * @pixelunion/age-gate v1.2.0\n * (c) 2025 Pixel Union\n */\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError("Cannot call a class as a function");\n  }\n}\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if ("value" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  Object.defineProperty(Constructor, "prototype", {\n    writable: false\n  });\n  return Constructor;\n}\n\nvar scrollLock = __webpack_require__(/*! scroll-lock */ "./node_modules/scroll-lock/dist/scroll-lock.js");\n\n// Bot patterns from isbot v5.1.32\'s patterns.json (copied as JavaScript array)\nvar botPatterns = [" daum[ /]", " deusu/", "(?:^|[^g])news(?!sapphire)", "(?<! (?:channel/|google/))google(?!(app|/google| pixel))", "(?<! cu)bots?(?:\\\\b|_)", "(?<!(?:lib))http", "(?<![hg]m)score", "(?<!cam)scan", "24x7", "@[a-z][\\\\w-]+\\\\.", "\\\\(\\\\)", "\\\\.com\\\\b", "\\\\bperl\\\\b", "\\\\btime/", "\\\\|", "^[\\\\w \\\\.\\\\-\\\\(?:\\\\):%]+(?:/v?\\\\d+(?:\\\\.\\\\d+)?(?:\\\\.\\\\d{1,10})*?)?(?:,|$)", "^[^ ]{50,}$", "^\\\\d+\\\\b", "^\\\\W", "^\\\\w*search\\\\b", "^\\\\w+/[\\\\w\\\\(\\\\)]*$", "^active", "^ad muncher", "^amaya", "^avsdevicesdk/", "^azure", "^biglotron", "^bot", "^bw/", "^clamav[ /]", "^client/", "^cobweb/", "^custom", "^ddg[_-]android", "^discourse", "^dispatch/\\\\d", "^downcast/", "^duckduckgo", "^email", "^facebook", "^getright/", "^gozilla/", "^hobbit", "^hotzonu", "^hwcdn/", "^igetter/", "^jeode/", "^jetty/", "^jigsaw", "^microsoft bits", "^movabletype", "^mozilla/\\\\d\\\\.\\\\d\\\\s[\\\\w\\\\.-]+$", "^mozilla/\\\\d\\\\.\\\\d\\\\s\\\\(compatible;?(?:\\\\s\\\\w+\\\\/\\\\d+\\\\.\\\\d+)?\\\\)$", "^navermailapp", "^netsurf", "^offline", "^openai/", "^owler", "^php", "^postman", "^python", "^rank", "^read", "^reed", "^rest", "^rss", "^snapchat", "^space bison", "^svn", "^swcd ", "^taringa", "^thumbor/", "^track", "^w3c", "^webbandit/", "^webcopier", "^wget", "^whatsapp", "^wordpress", "^xenu link sleuth", "^yahoo", "^yandex", "^zdm/\\\\d", "^zoom marketplace/", "agent\\\\b", "analyzer", "archive", "ask jeeves/teoma", "audit", "bit\\\\.ly/", "bluecoat drtr", "browsex", "burpcollaborator", "capture", "catch", "check\\\\b", "checker", "chrome-lighthouse", "chromeframe", "classifier", "cloudflare", "convertify", "crawl", "cypress/", "dareboost", "datanyze", "dejaclick", "detect", "dmbrowser", "download", "evc-batch/", "exaleadcloudview", "feed", "fetcher", "firephp", "functionize", "grab", "headless", "httrack", "hubspot marketing grader", "hydra", "ibisbrowser", "infrawatch", "insight", "inspect", "iplabel", "java(?!;)", "library", "linkcheck", "mail\\\\.ru/", "manager", "measure", "neustar wpm", "node\\\\b", "nutch", "offbyone", "onetrust", "optimize", "pageburst", "pagespeed", "parser", "phantomjs", "pingdom", "powermarks", "preview", "proxy", "ptst[ /]\\\\d", "retriever", "rexx;", "rigor", "rss\\\\b", "scrape", "server", "sogou", "sparkler/", "speedcurve", "spider", "splash", "statuscake", "supercleaner", "synapse", "synthetic", "tools", "torrent", "transcoder", "url", "validator", "virtuoso", "wappalyzer", "webglance", "webkit2png", "whatcms/", "xtate/"];\n\n//Check if the user agent is a bot/crawler\nfunction isBot(userAgent) {\n  if (!userAgent) return false;\n\n  // Create a single RegExp pattern from all patterns (same approach as isbot)\n  var pattern = new RegExp(botPatterns.join(\'|\'), \'i\');\n  return pattern.test(userAgent);\n}\nfunction getAge(birthdate) {\n  var today = new Date();\n  var age = today.getFullYear() - birthdate.getFullYear();\n  var m = today.getMonth() - birthdate.getMonth();\n  if (m < 0 || m === 0 && today.getDate() < birthdate.getDate()) {\n    age--;\n  }\n  return age;\n}\nvar SiteAgeGate = /*#__PURE__*/function () {\n  function SiteAgeGate(el) {\n    _classCallCheck(this, SiteAgeGate);\n    this._el = el;\n    this._ageGateForm = el.querySelector(\'[data-age-gate]\');\n    this._ageGateErrorEl = this._ageGateForm.querySelector(\'[data-age-gate-error]\');\n    this._requiredAge = this._ageGateForm.dataset.requiredAge;\n    this._el.addEventListener(\'age-gate:open\', this._open.bind(this));\n    this._el.addEventListener(\'age-gate:close\', this._close.bind(this));\n    this._ageGateForm.addEventListener(\'submit\', this._onFormSubmit.bind(this));\n    if (isBot(navigator.userAgent)) {\n      this._close();\n    } else if (this._el.style.display === \'\') {\n      this._open();\n    }\n  }\n  _createClass(SiteAgeGate, [{\n    key: "_open",\n    value: function _open() {\n      scrollLock.disablePageScroll();\n      this._el.style.display = \'\';\n    }\n  }, {\n    key: "_close",\n    value: function _close() {\n      scrollLock.enablePageScroll();\n      this._el.style.display = \'none\';\n    }\n  }, {\n    key: "_onFormSubmit",\n    value: function _onFormSubmit(event) {\n      event.preventDefault();\n      event.stopPropagation();\n      var data = new FormData(event.target);\n      var day = data.get(\'day\');\n      var month = data.get(\'month\');\n      var year = data.get(\'year\');\n      if (day === \'\' || month === \'\' || year === \'\') return;\n      var age = getAge(new Date(year, month, day));\n      if (age >= this._requiredAge) {\n        this._close();\n        sessionStorage.setItem(\'age-gate\', age);\n      } else {\n        this._ageGateErrorEl.style.display = \'\';\n      }\n    }\n  }]);\n  return SiteAgeGate;\n}();\n\nvar PageAgeGate = /*#__PURE__*/function () {\n  function PageAgeGate() {\n    _classCallCheck(this, PageAgeGate);\n    this._ageGateEl = document.getElementById(\'age-gate-page\');\n  }\n  _createClass(PageAgeGate, [{\n    key: "onSectionLoad",\n    value: function onSectionLoad() {\n      var openEvent = new CustomEvent(\'age-gate:open\');\n      if (this._ageGateEl) {\n        this._ageGateEl.dispatchEvent(openEvent);\n      }\n    }\n  }, {\n    key: "onSectionSelect",\n    value: function onSectionSelect() {\n      var openEvent = new CustomEvent(\'age-gate:open\');\n      if (this._ageGateEl) {\n        this._ageGateEl.dispatchEvent(openEvent);\n      }\n    }\n  }, {\n    key: "onSectionDeselect",\n    value: function onSectionDeselect() {\n      var closeEvent = new CustomEvent(\'age-gate:close\');\n      if (this._ageGateEl) {\n        this._ageGateEl.dispatchEvent(closeEvent);\n      }\n    }\n  }]);\n  return PageAgeGate;\n}();\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vYWdlLWdhdGUvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vbm9kZV9tb2R1bGVzL0BwaXhlbHVuaW9uL2FnZS1nYXRlL2Rpc3QvaW5kZXguZXMuanM/YWFmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qIVxuICogQHBpeGVsdW5pb24vYWdlLWdhdGUgdjEuMi4wXG4gKiAoYykgMjAyNSBQaXhlbCBVbmlvblxuICovXG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbnZhciBzY3JvbGxMb2NrID0gcmVxdWlyZSgnc2Nyb2xsLWxvY2snKTtcblxuLy8gQm90IHBhdHRlcm5zIGZyb20gaXNib3QgdjUuMS4zMidzIHBhdHRlcm5zLmpzb24gKGNvcGllZCBhcyBKYXZhU2NyaXB0IGFycmF5KVxudmFyIGJvdFBhdHRlcm5zID0gW1wiIGRhdW1bIC9dXCIsIFwiIGRldXN1L1wiLCBcIig/Ol58W15nXSluZXdzKD8hc2FwcGhpcmUpXCIsIFwiKD88ISAoPzpjaGFubmVsL3xnb29nbGUvKSlnb29nbGUoPyEoYXBwfC9nb29nbGV8IHBpeGVsKSlcIiwgXCIoPzwhIGN1KWJvdHM/KD86XFxcXGJ8XylcIiwgXCIoPzwhKD86bGliKSlodHRwXCIsIFwiKD88IVtoZ11tKXNjb3JlXCIsIFwiKD88IWNhbSlzY2FuXCIsIFwiMjR4N1wiLCBcIkBbYS16XVtcXFxcdy1dK1xcXFwuXCIsIFwiXFxcXChcXFxcKVwiLCBcIlxcXFwuY29tXFxcXGJcIiwgXCJcXFxcYnBlcmxcXFxcYlwiLCBcIlxcXFxidGltZS9cIiwgXCJcXFxcfFwiLCBcIl5bXFxcXHcgXFxcXC5cXFxcLVxcXFwoPzpcXFxcKTolXSsoPzovdj9cXFxcZCsoPzpcXFxcLlxcXFxkKyk/KD86XFxcXC5cXFxcZHsxLDEwfSkqPyk/KD86LHwkKVwiLCBcIl5bXiBdezUwLH0kXCIsIFwiXlxcXFxkK1xcXFxiXCIsIFwiXlxcXFxXXCIsIFwiXlxcXFx3KnNlYXJjaFxcXFxiXCIsIFwiXlxcXFx3Ky9bXFxcXHdcXFxcKFxcXFwpXSokXCIsIFwiXmFjdGl2ZVwiLCBcIl5hZCBtdW5jaGVyXCIsIFwiXmFtYXlhXCIsIFwiXmF2c2RldmljZXNkay9cIiwgXCJeYXp1cmVcIiwgXCJeYmlnbG90cm9uXCIsIFwiXmJvdFwiLCBcIl5idy9cIiwgXCJeY2xhbWF2WyAvXVwiLCBcIl5jbGllbnQvXCIsIFwiXmNvYndlYi9cIiwgXCJeY3VzdG9tXCIsIFwiXmRkZ1tfLV1hbmRyb2lkXCIsIFwiXmRpc2NvdXJzZVwiLCBcIl5kaXNwYXRjaC9cXFxcZFwiLCBcIl5kb3duY2FzdC9cIiwgXCJeZHVja2R1Y2tnb1wiLCBcIl5lbWFpbFwiLCBcIl5mYWNlYm9va1wiLCBcIl5nZXRyaWdodC9cIiwgXCJeZ296aWxsYS9cIiwgXCJeaG9iYml0XCIsIFwiXmhvdHpvbnVcIiwgXCJeaHdjZG4vXCIsIFwiXmlnZXR0ZXIvXCIsIFwiXmplb2RlL1wiLCBcIl5qZXR0eS9cIiwgXCJeamlnc2F3XCIsIFwiXm1pY3Jvc29mdCBiaXRzXCIsIFwiXm1vdmFibGV0eXBlXCIsIFwiXm1vemlsbGEvXFxcXGRcXFxcLlxcXFxkXFxcXHNbXFxcXHdcXFxcLi1dKyRcIiwgXCJebW96aWxsYS9cXFxcZFxcXFwuXFxcXGRcXFxcc1xcXFwoY29tcGF0aWJsZTs/KD86XFxcXHNcXFxcdytcXFxcL1xcXFxkK1xcXFwuXFxcXGQrKT9cXFxcKSRcIiwgXCJebmF2ZXJtYWlsYXBwXCIsIFwiXm5ldHN1cmZcIiwgXCJeb2ZmbGluZVwiLCBcIl5vcGVuYWkvXCIsIFwiXm93bGVyXCIsIFwiXnBocFwiLCBcIl5wb3N0bWFuXCIsIFwiXnB5dGhvblwiLCBcIl5yYW5rXCIsIFwiXnJlYWRcIiwgXCJecmVlZFwiLCBcIl5yZXN0XCIsIFwiXnJzc1wiLCBcIl5zbmFwY2hhdFwiLCBcIl5zcGFjZSBiaXNvblwiLCBcIl5zdm5cIiwgXCJec3djZCBcIiwgXCJedGFyaW5nYVwiLCBcIl50aHVtYm9yL1wiLCBcIl50cmFja1wiLCBcIl53M2NcIiwgXCJed2ViYmFuZGl0L1wiLCBcIl53ZWJjb3BpZXJcIiwgXCJed2dldFwiLCBcIl53aGF0c2FwcFwiLCBcIl53b3JkcHJlc3NcIiwgXCJeeGVudSBsaW5rIHNsZXV0aFwiLCBcIl55YWhvb1wiLCBcIl55YW5kZXhcIiwgXCJeemRtL1xcXFxkXCIsIFwiXnpvb20gbWFya2V0cGxhY2UvXCIsIFwiYWdlbnRcXFxcYlwiLCBcImFuYWx5emVyXCIsIFwiYXJjaGl2ZVwiLCBcImFzayBqZWV2ZXMvdGVvbWFcIiwgXCJhdWRpdFwiLCBcImJpdFxcXFwubHkvXCIsIFwiYmx1ZWNvYXQgZHJ0clwiLCBcImJyb3dzZXhcIiwgXCJidXJwY29sbGFib3JhdG9yXCIsIFwiY2FwdHVyZVwiLCBcImNhdGNoXCIsIFwiY2hlY2tcXFxcYlwiLCBcImNoZWNrZXJcIiwgXCJjaHJvbWUtbGlnaHRob3VzZVwiLCBcImNocm9tZWZyYW1lXCIsIFwiY2xhc3NpZmllclwiLCBcImNsb3VkZmxhcmVcIiwgXCJjb252ZXJ0aWZ5XCIsIFwiY3Jhd2xcIiwgXCJjeXByZXNzL1wiLCBcImRhcmVib29zdFwiLCBcImRhdGFueXplXCIsIFwiZGVqYWNsaWNrXCIsIFwiZGV0ZWN0XCIsIFwiZG1icm93c2VyXCIsIFwiZG93bmxvYWRcIiwgXCJldmMtYmF0Y2gvXCIsIFwiZXhhbGVhZGNsb3Vkdmlld1wiLCBcImZlZWRcIiwgXCJmZXRjaGVyXCIsIFwiZmlyZXBocFwiLCBcImZ1bmN0aW9uaXplXCIsIFwiZ3JhYlwiLCBcImhlYWRsZXNzXCIsIFwiaHR0cmFja1wiLCBcImh1YnNwb3QgbWFya2V0aW5nIGdyYWRlclwiLCBcImh5ZHJhXCIsIFwiaWJpc2Jyb3dzZXJcIiwgXCJpbmZyYXdhdGNoXCIsIFwiaW5zaWdodFwiLCBcImluc3BlY3RcIiwgXCJpcGxhYmVsXCIsIFwiamF2YSg/ITspXCIsIFwibGlicmFyeVwiLCBcImxpbmtjaGVja1wiLCBcIm1haWxcXFxcLnJ1L1wiLCBcIm1hbmFnZXJcIiwgXCJtZWFzdXJlXCIsIFwibmV1c3RhciB3cG1cIiwgXCJub2RlXFxcXGJcIiwgXCJudXRjaFwiLCBcIm9mZmJ5b25lXCIsIFwib25ldHJ1c3RcIiwgXCJvcHRpbWl6ZVwiLCBcInBhZ2VidXJzdFwiLCBcInBhZ2VzcGVlZFwiLCBcInBhcnNlclwiLCBcInBoYW50b21qc1wiLCBcInBpbmdkb21cIiwgXCJwb3dlcm1hcmtzXCIsIFwicHJldmlld1wiLCBcInByb3h5XCIsIFwicHRzdFsgL11cXFxcZFwiLCBcInJldHJpZXZlclwiLCBcInJleHg7XCIsIFwicmlnb3JcIiwgXCJyc3NcXFxcYlwiLCBcInNjcmFwZVwiLCBcInNlcnZlclwiLCBcInNvZ291XCIsIFwic3BhcmtsZXIvXCIsIFwic3BlZWRjdXJ2ZVwiLCBcInNwaWRlclwiLCBcInNwbGFzaFwiLCBcInN0YXR1c2Nha2VcIiwgXCJzdXBlcmNsZWFuZXJcIiwgXCJzeW5hcHNlXCIsIFwic3ludGhldGljXCIsIFwidG9vbHNcIiwgXCJ0b3JyZW50XCIsIFwidHJhbnNjb2RlclwiLCBcInVybFwiLCBcInZhbGlkYXRvclwiLCBcInZpcnR1b3NvXCIsIFwid2FwcGFseXplclwiLCBcIndlYmdsYW5jZVwiLCBcIndlYmtpdDJwbmdcIiwgXCJ3aGF0Y21zL1wiLCBcInh0YXRlL1wiXTtcblxuLy9DaGVjayBpZiB0aGUgdXNlciBhZ2VudCBpcyBhIGJvdC9jcmF3bGVyXG5mdW5jdGlvbiBpc0JvdCh1c2VyQWdlbnQpIHtcbiAgaWYgKCF1c2VyQWdlbnQpIHJldHVybiBmYWxzZTtcblxuICAvLyBDcmVhdGUgYSBzaW5nbGUgUmVnRXhwIHBhdHRlcm4gZnJvbSBhbGwgcGF0dGVybnMgKHNhbWUgYXBwcm9hY2ggYXMgaXNib3QpXG4gIHZhciBwYXR0ZXJuID0gbmV3IFJlZ0V4cChib3RQYXR0ZXJucy5qb2luKCd8JyksICdpJyk7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodXNlckFnZW50KTtcbn1cbmZ1bmN0aW9uIGdldEFnZShiaXJ0aGRhdGUpIHtcbiAgdmFyIHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgdmFyIGFnZSA9IHRvZGF5LmdldEZ1bGxZZWFyKCkgLSBiaXJ0aGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgdmFyIG0gPSB0b2RheS5nZXRNb250aCgpIC0gYmlydGhkYXRlLmdldE1vbnRoKCk7XG4gIGlmIChtIDwgMCB8fCBtID09PSAwICYmIHRvZGF5LmdldERhdGUoKSA8IGJpcnRoZGF0ZS5nZXREYXRlKCkpIHtcbiAgICBhZ2UtLTtcbiAgfVxuICByZXR1cm4gYWdlO1xufVxudmFyIFNpdGVBZ2VHYXRlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2l0ZUFnZUdhdGUoZWwpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2l0ZUFnZUdhdGUpO1xuICAgIHRoaXMuX2VsID0gZWw7XG4gICAgdGhpcy5fYWdlR2F0ZUZvcm0gPSBlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hZ2UtZ2F0ZV0nKTtcbiAgICB0aGlzLl9hZ2VHYXRlRXJyb3JFbCA9IHRoaXMuX2FnZUdhdGVGb3JtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFnZS1nYXRlLWVycm9yXScpO1xuICAgIHRoaXMuX3JlcXVpcmVkQWdlID0gdGhpcy5fYWdlR2F0ZUZvcm0uZGF0YXNldC5yZXF1aXJlZEFnZTtcbiAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdhZ2UtZ2F0ZTpvcGVuJywgdGhpcy5fb3Blbi5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdhZ2UtZ2F0ZTpjbG9zZScsIHRoaXMuX2Nsb3NlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX2FnZUdhdGVGb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIHRoaXMuX29uRm9ybVN1Ym1pdC5iaW5kKHRoaXMpKTtcbiAgICBpZiAoaXNCb3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9lbC5zdHlsZS5kaXNwbGF5ID09PSAnJykge1xuICAgICAgdGhpcy5fb3BlbigpO1xuICAgIH1cbiAgfVxuICBfY3JlYXRlQ2xhc3MoU2l0ZUFnZUdhdGUsIFt7XG4gICAga2V5OiBcIl9vcGVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vcGVuKCkge1xuICAgICAgc2Nyb2xsTG9jay5kaXNhYmxlUGFnZVNjcm9sbCgpO1xuICAgICAgdGhpcy5fZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfY2xvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2Nsb3NlKCkge1xuICAgICAgc2Nyb2xsTG9jay5lbmFibGVQYWdlU2Nyb2xsKCk7XG4gICAgICB0aGlzLl9lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25Gb3JtU3VibWl0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vbkZvcm1TdWJtaXQoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHZhciBkYXRhID0gbmV3IEZvcm1EYXRhKGV2ZW50LnRhcmdldCk7XG4gICAgICB2YXIgZGF5ID0gZGF0YS5nZXQoJ2RheScpO1xuICAgICAgdmFyIG1vbnRoID0gZGF0YS5nZXQoJ21vbnRoJyk7XG4gICAgICB2YXIgeWVhciA9IGRhdGEuZ2V0KCd5ZWFyJyk7XG4gICAgICBpZiAoZGF5ID09PSAnJyB8fCBtb250aCA9PT0gJycgfHwgeWVhciA9PT0gJycpIHJldHVybjtcbiAgICAgIHZhciBhZ2UgPSBnZXRBZ2UobmV3IERhdGUoeWVhciwgbW9udGgsIGRheSkpO1xuICAgICAgaWYgKGFnZSA+PSB0aGlzLl9yZXF1aXJlZEFnZSkge1xuICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdhZ2UtZ2F0ZScsIGFnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBTaXRlQWdlR2F0ZTtcbn0oKTtcblxudmFyIFBhZ2VBZ2VHYXRlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUGFnZUFnZUdhdGUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBhZ2VBZ2VHYXRlKTtcbiAgICB0aGlzLl9hZ2VHYXRlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWdlLWdhdGUtcGFnZScpO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhQYWdlQWdlR2F0ZSwgW3tcbiAgICBrZXk6IFwib25TZWN0aW9uTG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblNlY3Rpb25Mb2FkKCkge1xuICAgICAgdmFyIG9wZW5FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnYWdlLWdhdGU6b3BlbicpO1xuICAgICAgaWYgKHRoaXMuX2FnZUdhdGVFbCkge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRWwuZGlzcGF0Y2hFdmVudChvcGVuRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvblNlY3Rpb25TZWxlY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25TZWN0aW9uU2VsZWN0KCkge1xuICAgICAgdmFyIG9wZW5FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnYWdlLWdhdGU6b3BlbicpO1xuICAgICAgaWYgKHRoaXMuX2FnZUdhdGVFbCkge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRWwuZGlzcGF0Y2hFdmVudChvcGVuRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvblNlY3Rpb25EZXNlbGVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblNlY3Rpb25EZXNlbGVjdCgpIHtcbiAgICAgIHZhciBjbG9zZUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdhZ2UtZ2F0ZTpjbG9zZScpO1xuICAgICAgaWYgKHRoaXMuX2FnZUdhdGVFbCkge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRWwuZGlzcGF0Y2hFdmVudChjbG9zZUV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFBhZ2VBZ2VHYXRlO1xufSgpO1xuXG5leHBvcnQgeyBQYWdlQWdlR2F0ZSwgU2l0ZUFnZUdhdGUgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/age-gate/dist/index.es.js\n')},
vendor: 29,213 bytes, line 1
1"./node_modules/@pixelunion/animations/dist/animations.es.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   "Animation": () => (/* binding */ Animation),\n/* harmony export */   "AnimationsManager": () => (/* binding */ AnimationsManager),\n/* harmony export */   "animation": () => (/* binding */ animation),\n/* harmony export */   "transition": () => (/* binding */ transition)\n/* harmony export */ });\n\n  /*!\n   * @pixelunion/animations v0.1.0\n   * (c) 2019 Pixel Union\n   * Released under the UNLICENSED license.\n  */\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError("Cannot call a class as a function");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if ("value" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    });\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(source, true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(source).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\n/**\n * Promisified version of window.requestAnimationFrame.\n * @returns {Promise} Promise will resolve when requestAnimationFrame callback is run.\n */\nfunction raf() {\n  return new Promise(function (resolve) {\n    window.requestAnimationFrame(resolve);\n  });\n}\n/**\n * Represents an HTML element with associate states\n */\n\n\nvar Animation =\n/*#__PURE__*/\nfunction () {\n  /**\n   * @param {Object} options\n   * @param {HTMLElement}  options.el Target element\n   * @param {String} [options.state=initial] Initial state. This is also the default state.\n   * @param {String} [options.stateAttribute=data-revealer] Attribute name to update with state.\n   * @param {String} [options.stateChangeAttribute=data-revealer-transition] Attribute name to\n   * update with change of state.\n   * @param {String} [options.endEvent=transitionend] Event to listen for at end of state change.\n   * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the\n   * next state change.\n   * @param {Function} [options.onStart] Callback to execute immediate after\n   * applying stateChangeAttribute.\n   */\n  function Animation(options) {\n    _classCallCheck(this, Animation);\n\n    this._el = options.el;\n    this.cancelRunning = null;\n    this._state = options.state || \'initial\';\n    this.initialState = this._state;\n    this.stateAttribute = options.stateAttribute || \'data-animation-state\';\n    this.stateChangeAttribute = options.stateChangeAttribute || \'data-animation\';\n    this.endEvent = options.endEvent || \'transitionend\';\n    this.hold = !!options.hold;\n\n    this.onStart = options.onStart || function () {\n      /* do nothing */\n    };\n\n    this.activeEventHandler = null;\n  }\n  /**\n   * Returns target element\n   *\n   * @return {HTMLElement} Target element\n   */\n\n\n  _createClass(Animation, [{\n    key: "isState",\n\n    /**\n     * Check if a state is active\n     * @param {String} state State to compare\n     *\n     * @return {Boolean}\n     */\n    value: function isState(state) {\n      return state === this._state;\n    }\n    /**\n     * Sequences a change to a new state.\n     * @param {String} state Target state\n     *\n     * @param {Boolean} options.force Switch to final state immediately\n     *\n     * @param {Function} options.onStart Callback to execute immediately after\n     * applying stateChangeAttribute for this state change only.\n     *\n     * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the\n     * next state change.\n     *\n     * @return {Promise} Resolves when endEvent triggered\n     */\n\n  }, {\n    key: "animateTo",\n    value: function animateTo(state) {\n      var _this = this;\n\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var from = this._el.dataset[this.stateAttribute] || this._state;\n      var to = state || this.initialState;\n      var force = options.force;\n      var hold = \'hold\' in options ? options.hold : this.hold;\n      return new Promise(function (resolve) {\n        if (_this.cancelRunning) {\n          _this.cancelRunning();\n        }\n\n        if (from === to) {\n          // Removing this here fixes some lingering attributes. But why?\n          _this._el.removeAttribute(_this.stateChangeAttribute);\n\n          resolve(from, null);\n          return;\n        }\n\n        var running = true;\n\n        _this.cancelRunning = function () {\n          running = false;\n          resolve(null, null);\n        };\n\n        _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n        _this.activeEventHandler = null;\n\n        if (force) {\n          _this._el.setAttribute(_this.stateChangeAttribute, "".concat(from, "=>").concat(to));\n\n          _this.onStart({\n            el: _this._el,\n            from: from,\n            to: to\n          });\n\n          if (typeof options.onStart === \'function\') {\n            options.onStart({\n              el: _this._el,\n              from: from,\n              to: to\n            });\n          }\n\n          _this._el.setAttribute(_this.stateAttribute, to);\n\n          _this._state = to;\n\n          if (!hold) {\n            _this._el.removeAttribute(_this.stateChangeAttribute);\n          }\n\n          resolve(to, null);\n          return;\n        }\n\n        raf().then(function () {\n          if (!running) throw new Error(\'cancelled\');\n\n          _this._el.setAttribute(_this.stateChangeAttribute, "".concat(from, "=>").concat(to));\n\n          _this.onStart({\n            el: _this._el,\n            from: from,\n            to: to\n          });\n\n          if (typeof options.onStart === \'function\') {\n            options.onStart({\n              el: _this._el,\n              from: from,\n              to: to\n            });\n          }\n\n          return raf();\n        }).then(function () {\n          if (!running) throw new Error(\'cancelled\');\n\n          _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n          _this.activeEventHandler = function (e) {\n            // Ignore any events bubbling up\n            if (e.target !== _this._el || !running) return;\n\n            _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n            if (!hold) {\n              _this._el.removeAttribute(_this.stateChangeAttribute);\n            }\n\n            resolve(to, e);\n          };\n\n          _this._el.addEventListener(_this.endEvent, _this.activeEventHandler);\n\n          _this._el.setAttribute(_this.stateAttribute, to);\n\n          _this._state = to;\n        })["catch"](function (error) {\n          // Only catch \'cancelled\' errors.\n          if (error.message !== \'cancelled\') throw error;\n        });\n      });\n    }\n    /**\n     * Remove any event listeners\n     */\n\n  }, {\n    key: "unload",\n    value: function unload() {\n      this._el.removeEventListener(this.endEvent, this.activeEventHandler);\n\n      this.activeEventHandler = null;\n    }\n  }, {\n    key: "el",\n    get: function get() {\n      return this._el;\n    }\n    /**\n     * Returns current state\n     *\n     * @return {String} Current state\n     */\n\n  }, {\n    key: "state",\n    get: function get() {\n      return this._state;\n    }\n  }]);\n\n  return Animation;\n}();\n\n/**\n * Manage state changes for a set of elements\n */\n\nvar AnimationsManager =\n/*#__PURE__*/\nfunction () {\n  function AnimationsManager() {\n    _classCallCheck(this, AnimationsManager);\n\n    this.animations = new Map();\n  }\n  /**\n   * Add a new element and return an animation for that element. If element already has an associated animation, return that animation.\n   * @param {Object} options\n   * @param {HTMLElement}  options.el Target element\n   * @param {String} [options.state=initial] Initial state. This is also the default state.\n   * @param {String} [options.stateAttribute=data-revealer] Attribute name to update with state.\n   * @param {String} [options.stateChangeAttribute=data-revealer-transition] Attribute name to update with change of state.\n   * @param {String} [options.endEvent=transitionend] Event name to listen for at end of state change.\n   * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the next state change.\n   * @param {Function} [options.onStart] Callback to execute immediate after applying stateChangeAttribute.\n   *\n   * @return {Animation}\n   */\n\n\n  _createClass(AnimationsManager, [{\n    key: "add",\n    value: function add(options) {\n      if (this.animations.has(options.el)) return this.animations.get(options.el);\n      var animation = new Animation(options);\n      this.animations.set(options.el, animation);\n      return animation;\n    }\n    /**\n     * Remove a single animation\n     * @param {Animation} animation Animation to remove. Any event listeners will also be removed.\n     */\n\n  }, {\n    key: "remove",\n    value: function remove(animation) {\n      this.animations["delete"](animation.el);\n      animation.unload();\n    }\n    /**\n     * Remove all animations, including all event listeners.\n     */\n\n  }, {\n    key: "removeAll",\n    value: function removeAll() {\n      this.animations.forEach(function (animation) {\n        return animation.unload();\n      });\n    }\n  }]);\n\n  return AnimationsManager;\n}();\n\nfunction animation(options) {\n  var setOptions = {\n    endEvent: \'animationend\',\n    hold: true\n  };\n  return new Animation(_objectSpread2({\n    options: options\n  }, setOptions));\n}\n\nfunction transition(options) {\n  return new Animation(options);\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vYW5pbWF0aW9ucy9kaXN0L2FuaW1hdGlvbnMuZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wYXJhbGxheC8uL25vZGVfbW9kdWxlcy9AcGl4ZWx1bmlvbi9hbmltYXRpb25zL2Rpc3QvYW5pbWF0aW9ucy5lcy5qcz9lOTU3Il0sInNvdXJjZXNDb250ZW50IjpbIlxuICAvKiFcbiAgICogQHBpeGVsdW5pb24vYW5pbWF0aW9ucyB2MC4xLjBcbiAgICogKGMpIDIwMTkgUGl4ZWwgVW5pb25cbiAgICogUmVsZWFzZWQgdW5kZXIgdGhlIFVOTElDRU5TRUQgbGljZW5zZS5cbiAgKi9cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhzb3VyY2UsIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIFByb21pc2lmaWVkIHZlcnNpb24gb2Ygd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdpbGwgcmVzb2x2ZSB3aGVuIHJlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxsYmFjayBpcyBydW4uXG4gKi9cbmZ1bmN0aW9uIHJhZigpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShyZXNvbHZlKTtcbiAgfSk7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gSFRNTCBlbGVtZW50IHdpdGggYXNzb2NpYXRlIHN0YXRlc1xuICovXG5cblxudmFyIEFuaW1hdGlvbiA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSAgb3B0aW9ucy5lbCBUYXJnZXQgZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc3RhdGU9aW5pdGlhbF0gSW5pdGlhbCBzdGF0ZS4gVGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IHN0YXRlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc3RhdGVBdHRyaWJ1dGU9ZGF0YS1yZXZlYWxlcl0gQXR0cmlidXRlIG5hbWUgdG8gdXBkYXRlIHdpdGggc3RhdGUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZT1kYXRhLXJldmVhbGVyLXRyYW5zaXRpb25dIEF0dHJpYnV0ZSBuYW1lIHRvXG4gICAqIHVwZGF0ZSB3aXRoIGNoYW5nZSBvZiBzdGF0ZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmVuZEV2ZW50PXRyYW5zaXRpb25lbmRdIEV2ZW50IHRvIGxpc3RlbiBmb3IgYXQgZW5kIG9mIHN0YXRlIGNoYW5nZS5cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5ob2xkPWZhbHNlXSBJZiB0cnVlLCBjaGFuZ2VBdHRyaWJ1dGUgd2lsbCBub3QgYmUgcmVtb3ZlZCB1bnRpbCB0aGVcbiAgICogbmV4dCBzdGF0ZSBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uU3RhcnRdIENhbGxiYWNrIHRvIGV4ZWN1dGUgaW1tZWRpYXRlIGFmdGVyXG4gICAqIGFwcGx5aW5nIHN0YXRlQ2hhbmdlQXR0cmlidXRlLlxuICAgKi9cbiAgZnVuY3Rpb24gQW5pbWF0aW9uKG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQW5pbWF0aW9uKTtcblxuICAgIHRoaXMuX2VsID0gb3B0aW9ucy5lbDtcbiAgICB0aGlzLmNhbmNlbFJ1bm5pbmcgPSBudWxsO1xuICAgIHRoaXMuX3N0YXRlID0gb3B0aW9ucy5zdGF0ZSB8fCAnaW5pdGlhbCc7XG4gICAgdGhpcy5pbml0aWFsU3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICB0aGlzLnN0YXRlQXR0cmlidXRlID0gb3B0aW9ucy5zdGF0ZUF0dHJpYnV0ZSB8fCAnZGF0YS1hbmltYXRpb24tc3RhdGUnO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGUgPSBvcHRpb25zLnN0YXRlQ2hhbmdlQXR0cmlidXRlIHx8ICdkYXRhLWFuaW1hdGlvbic7XG4gICAgdGhpcy5lbmRFdmVudCA9IG9wdGlvbnMuZW5kRXZlbnQgfHwgJ3RyYW5zaXRpb25lbmQnO1xuICAgIHRoaXMuaG9sZCA9ICEhb3B0aW9ucy5ob2xkO1xuXG4gICAgdGhpcy5vblN0YXJ0ID0gb3B0aW9ucy5vblN0YXJ0IHx8IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qIGRvIG5vdGhpbmcgKi9cbiAgICB9O1xuXG4gICAgdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIgPSBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRhcmdldCBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSBUYXJnZXQgZWxlbWVudFxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhBbmltYXRpb24sIFt7XG4gICAga2V5OiBcImlzU3RhdGVcIixcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgc3RhdGUgaXMgYWN0aXZlXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlIFN0YXRlIHRvIGNvbXBhcmVcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzU3RhdGUoc3RhdGUpIHtcbiAgICAgIHJldHVybiBzdGF0ZSA9PT0gdGhpcy5fc3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlcXVlbmNlcyBhIGNoYW5nZSB0byBhIG5ldyBzdGF0ZS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhdGUgVGFyZ2V0IHN0YXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMuZm9yY2UgU3dpdGNoIHRvIGZpbmFsIHN0YXRlIGltbWVkaWF0ZWx5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uU3RhcnQgQ2FsbGJhY2sgdG8gZXhlY3V0ZSBpbW1lZGlhdGVseSBhZnRlclxuICAgICAqIGFwcGx5aW5nIHN0YXRlQ2hhbmdlQXR0cmlidXRlIGZvciB0aGlzIHN0YXRlIGNoYW5nZSBvbmx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5ob2xkPWZhbHNlXSBJZiB0cnVlLCBjaGFuZ2VBdHRyaWJ1dGUgd2lsbCBub3QgYmUgcmVtb3ZlZCB1bnRpbCB0aGVcbiAgICAgKiBuZXh0IHN0YXRlIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IFJlc29sdmVzIHdoZW4gZW5kRXZlbnQgdHJpZ2dlcmVkXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhbmltYXRlVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYW5pbWF0ZVRvKHN0YXRlKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICB2YXIgZnJvbSA9IHRoaXMuX2VsLmRhdGFzZXRbdGhpcy5zdGF0ZUF0dHJpYnV0ZV0gfHwgdGhpcy5fc3RhdGU7XG4gICAgICB2YXIgdG8gPSBzdGF0ZSB8fCB0aGlzLmluaXRpYWxTdGF0ZTtcbiAgICAgIHZhciBmb3JjZSA9IG9wdGlvbnMuZm9yY2U7XG4gICAgICB2YXIgaG9sZCA9ICdob2xkJyBpbiBvcHRpb25zID8gb3B0aW9ucy5ob2xkIDogdGhpcy5ob2xkO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIGlmIChfdGhpcy5jYW5jZWxSdW5uaW5nKSB7XG4gICAgICAgICAgX3RoaXMuY2FuY2VsUnVubmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICAgICAgLy8gUmVtb3ZpbmcgdGhpcyBoZXJlIGZpeGVzIHNvbWUgbGluZ2VyaW5nIGF0dHJpYnV0ZXMuIEJ1dCB3aHk/XG4gICAgICAgICAgX3RoaXMuX2VsLnJlbW92ZUF0dHJpYnV0ZShfdGhpcy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZSk7XG5cbiAgICAgICAgICByZXNvbHZlKGZyb20sIG51bGwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBydW5uaW5nID0gdHJ1ZTtcblxuICAgICAgICBfdGhpcy5jYW5jZWxSdW5uaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICByZXNvbHZlKG51bGwsIG51bGwpO1xuICAgICAgICB9O1xuXG4gICAgICAgIF90aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKF90aGlzLmVuZEV2ZW50LCBfdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIpO1xuXG4gICAgICAgIF90aGlzLmFjdGl2ZUV2ZW50SGFuZGxlciA9IG51bGw7XG5cbiAgICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgX3RoaXMuX2VsLnNldEF0dHJpYnV0ZShfdGhpcy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZSwgXCJcIi5jb25jYXQoZnJvbSwgXCI9PlwiKS5jb25jYXQodG8pKTtcblxuICAgICAgICAgIF90aGlzLm9uU3RhcnQoe1xuICAgICAgICAgICAgZWw6IF90aGlzLl9lbCxcbiAgICAgICAgICAgIGZyb206IGZyb20sXG4gICAgICAgICAgICB0bzogdG9cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vblN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uU3RhcnQoe1xuICAgICAgICAgICAgICBlbDogX3RoaXMuX2VsLFxuICAgICAgICAgICAgICBmcm9tOiBmcm9tLFxuICAgICAgICAgICAgICB0bzogdG9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzLl9lbC5zZXRBdHRyaWJ1dGUoX3RoaXMuc3RhdGVBdHRyaWJ1dGUsIHRvKTtcblxuICAgICAgICAgIF90aGlzLl9zdGF0ZSA9IHRvO1xuXG4gICAgICAgICAgaWYgKCFob2xkKSB7XG4gICAgICAgICAgICBfdGhpcy5fZWwucmVtb3ZlQXR0cmlidXRlKF90aGlzLnN0YXRlQ2hhbmdlQXR0cmlidXRlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKHRvLCBudWxsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByYWYoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIXJ1bm5pbmcpIHRocm93IG5ldyBFcnJvcignY2FuY2VsbGVkJyk7XG5cbiAgICAgICAgICBfdGhpcy5fZWwuc2V0QXR0cmlidXRlKF90aGlzLnN0YXRlQ2hhbmdlQXR0cmlidXRlLCBcIlwiLmNvbmNhdChmcm9tLCBcIj0+XCIpLmNvbmNhdCh0bykpO1xuXG4gICAgICAgICAgX3RoaXMub25TdGFydCh7XG4gICAgICAgICAgICBlbDogX3RoaXMuX2VsLFxuICAgICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICAgIHRvOiB0b1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9uU3RhcnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25TdGFydCh7XG4gICAgICAgICAgICAgIGVsOiBfdGhpcy5fZWwsXG4gICAgICAgICAgICAgIGZyb206IGZyb20sXG4gICAgICAgICAgICAgIHRvOiB0b1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJhZigpO1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIXJ1bm5pbmcpIHRocm93IG5ldyBFcnJvcignY2FuY2VsbGVkJyk7XG5cbiAgICAgICAgICBfdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihfdGhpcy5lbmRFdmVudCwgX3RoaXMuYWN0aXZlRXZlbnRIYW5kbGVyKTtcblxuICAgICAgICAgIF90aGlzLmFjdGl2ZUV2ZW50SGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgYW55IGV2ZW50cyBidWJibGluZyB1cFxuICAgICAgICAgICAgaWYgKGUudGFyZ2V0ICE9PSBfdGhpcy5fZWwgfHwgIXJ1bm5pbmcpIHJldHVybjtcblxuICAgICAgICAgICAgX3RoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoX3RoaXMuZW5kRXZlbnQsIF90aGlzLmFjdGl2ZUV2ZW50SGFuZGxlcik7XG5cbiAgICAgICAgICAgIGlmICghaG9sZCkge1xuICAgICAgICAgICAgICBfdGhpcy5fZWwucmVtb3ZlQXR0cmlidXRlKF90aGlzLnN0YXRlQ2hhbmdlQXR0cmlidXRlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZSh0bywgZSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIF90aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKF90aGlzLmVuZEV2ZW50LCBfdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIpO1xuXG4gICAgICAgICAgX3RoaXMuX2VsLnNldEF0dHJpYnV0ZShfdGhpcy5zdGF0ZUF0dHJpYnV0ZSwgdG8pO1xuXG4gICAgICAgICAgX3RoaXMuX3N0YXRlID0gdG87XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgLy8gT25seSBjYXRjaCAnY2FuY2VsbGVkJyBlcnJvcnMuXG4gICAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgIT09ICdjYW5jZWxsZWQnKSB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFueSBldmVudCBsaXN0ZW5lcnNcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInVubG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bmxvYWQoKSB7XG4gICAgICB0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuZW5kRXZlbnQsIHRoaXMuYWN0aXZlRXZlbnRIYW5kbGVyKTtcblxuICAgICAgdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIgPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGN1cnJlbnQgc3RhdGVcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gQ3VycmVudCBzdGF0ZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic3RhdGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQW5pbWF0aW9uO1xufSgpO1xuXG4vKipcbiAqIE1hbmFnZSBzdGF0ZSBjaGFuZ2VzIGZvciBhIHNldCBvZiBlbGVtZW50c1xuICovXG5cbnZhciBBbmltYXRpb25zTWFuYWdlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFuaW1hdGlvbnNNYW5hZ2VyKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBbmltYXRpb25zTWFuYWdlcik7XG5cbiAgICB0aGlzLmFuaW1hdGlvbnMgPSBuZXcgTWFwKCk7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBlbGVtZW50IGFuZCByZXR1cm4gYW4gYW5pbWF0aW9uIGZvciB0aGF0IGVsZW1lbnQuIElmIGVsZW1lbnQgYWxyZWFkeSBoYXMgYW4gYXNzb2NpYXRlZCBhbmltYXRpb24sIHJldHVybiB0aGF0IGFuaW1hdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gIG9wdGlvbnMuZWwgVGFyZ2V0IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnN0YXRlPWluaXRpYWxdIEluaXRpYWwgc3RhdGUuIFRoaXMgaXMgYWxzbyB0aGUgZGVmYXVsdCBzdGF0ZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnN0YXRlQXR0cmlidXRlPWRhdGEtcmV2ZWFsZXJdIEF0dHJpYnV0ZSBuYW1lIHRvIHVwZGF0ZSB3aXRoIHN0YXRlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGU9ZGF0YS1yZXZlYWxlci10cmFuc2l0aW9uXSBBdHRyaWJ1dGUgbmFtZSB0byB1cGRhdGUgd2l0aCBjaGFuZ2Ugb2Ygc3RhdGUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5lbmRFdmVudD10cmFuc2l0aW9uZW5kXSBFdmVudCBuYW1lIHRvIGxpc3RlbiBmb3IgYXQgZW5kIG9mIHN0YXRlIGNoYW5nZS5cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5ob2xkPWZhbHNlXSBJZiB0cnVlLCBjaGFuZ2VBdHRyaWJ1dGUgd2lsbCBub3QgYmUgcmVtb3ZlZCB1bnRpbCB0aGUgbmV4dCBzdGF0ZSBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uU3RhcnRdIENhbGxiYWNrIHRvIGV4ZWN1dGUgaW1tZWRpYXRlIGFmdGVyIGFwcGx5aW5nIHN0YXRlQ2hhbmdlQXR0cmlidXRlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtBbmltYXRpb259XG4gICAqL1xuXG5cbiAgX2NyZWF0ZUNsYXNzKEFuaW1hdGlvbnNNYW5hZ2VyLCBbe1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKG9wdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLmFuaW1hdGlvbnMuaGFzKG9wdGlvbnMuZWwpKSByZXR1cm4gdGhpcy5hbmltYXRpb25zLmdldChvcHRpb25zLmVsKTtcbiAgICAgIHZhciBhbmltYXRpb24gPSBuZXcgQW5pbWF0aW9uKG9wdGlvbnMpO1xuICAgICAgdGhpcy5hbmltYXRpb25zLnNldChvcHRpb25zLmVsLCBhbmltYXRpb24pO1xuICAgICAgcmV0dXJuIGFuaW1hdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgc2luZ2xlIGFuaW1hdGlvblxuICAgICAqIEBwYXJhbSB7QW5pbWF0aW9ufSBhbmltYXRpb24gQW5pbWF0aW9uIHRvIHJlbW92ZS4gQW55IGV2ZW50IGxpc3RlbmVycyB3aWxsIGFsc28gYmUgcmVtb3ZlZC5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmUoYW5pbWF0aW9uKSB7XG4gICAgICB0aGlzLmFuaW1hdGlvbnNbXCJkZWxldGVcIl0oYW5pbWF0aW9uLmVsKTtcbiAgICAgIGFuaW1hdGlvbi51bmxvYWQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCBhbmltYXRpb25zLCBpbmNsdWRpbmcgYWxsIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUFsbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVBbGwoKSB7XG4gICAgICB0aGlzLmFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYW5pbWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBhbmltYXRpb24udW5sb2FkKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQW5pbWF0aW9uc01hbmFnZXI7XG59KCk7XG5cbmZ1bmN0aW9uIGFuaW1hdGlvbihvcHRpb25zKSB7XG4gIHZhciBzZXRPcHRpb25zID0ge1xuICAgIGVuZEV2ZW50OiAnYW5pbWF0aW9uZW5kJyxcbiAgICBob2xkOiB0cnVlXG4gIH07XG4gIHJldHVybiBuZXcgQW5pbWF0aW9uKF9vYmplY3RTcHJlYWQyKHtcbiAgICBvcHRpb25zOiBvcHRpb25zXG4gIH0sIHNldE9wdGlvbnMpKTtcbn1cblxuZnVuY3Rpb24gdHJhbnNpdGlvbihvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgQW5pbWF0aW9uKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgeyBBbmltYXRpb24sIEFuaW1hdGlvbnNNYW5hZ2VyLCBhbmltYXRpb24sIHRyYW5zaXRpb24gfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/animations/dist/animations.es.js\n')},
vendor: 3,817 bytes, line 1
1"./node_modules/@pixelunion/events/dist/EventHandler.js":function(__unused_webpack_module,exports){"use strict";eval("\nexports.__esModule = true;\nvar EventHandler = /** @class */ (function () {\n    function EventHandler() {\n        this.events = [];\n    }\n    EventHandler.prototype.register = function (el, event, listener) {\n        if (!el || !event || !listener)\n            return null;\n        this.events.push({ el: el, event: event, listener: listener });\n        el.addEventListener(event, listener);\n        return { el: el, event: event, listener: listener };\n    };\n    EventHandler.prototype.unregister = function (_a) {\n        var el = _a.el, event = _a.event, listener = _a.listener;\n        if (!el || !event || !listener)\n            return null;\n        this.events = this.events.filter(function (e) { return el !== e.el\n            || event !== e.event || listener !== e.listener; });\n        el.removeEventListener(event, listener);\n        return { el: el, event: event, listener: listener };\n    };\n    EventHandler.prototype.unregisterAll = function () {\n        this.events.forEach(function (_a) {\n            var el = _a.el, event = _a.event, listener = _a.listener;\n            return el.removeEventListener(event, listener);\n        });\n        this.events = [];\n    };\n    return EventHandler;\n}());\nexports.default = EventHandler;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vZXZlbnRzL2Rpc3QvRXZlbnRIYW5kbGVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcGFyYWxsYXgvLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vZXZlbnRzL2Rpc3QvRXZlbnRIYW5kbGVyLmpzP2Q1OTkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIEV2ZW50SGFuZGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFdmVudEhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgfVxuICAgIEV2ZW50SGFuZGxlci5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiAoZWwsIGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoIWVsIHx8ICFldmVudCB8fCAhbGlzdGVuZXIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgdGhpcy5ldmVudHMucHVzaCh7IGVsOiBlbCwgZXZlbnQ6IGV2ZW50LCBsaXN0ZW5lcjogbGlzdGVuZXIgfSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHsgZWw6IGVsLCBldmVudDogZXZlbnQsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICAgIH07XG4gICAgRXZlbnRIYW5kbGVyLnByb3RvdHlwZS51bnJlZ2lzdGVyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBlbCA9IF9hLmVsLCBldmVudCA9IF9hLmV2ZW50LCBsaXN0ZW5lciA9IF9hLmxpc3RlbmVyO1xuICAgICAgICBpZiAoIWVsIHx8ICFldmVudCB8fCAhbGlzdGVuZXIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgdGhpcy5ldmVudHMgPSB0aGlzLmV2ZW50cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGVsICE9PSBlLmVsXG4gICAgICAgICAgICB8fCBldmVudCAhPT0gZS5ldmVudCB8fCBsaXN0ZW5lciAhPT0gZS5saXN0ZW5lcjsgfSk7XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHsgZWw6IGVsLCBldmVudDogZXZlbnQsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICAgIH07XG4gICAgRXZlbnRIYW5kbGVyLnByb3RvdHlwZS51bnJlZ2lzdGVyQWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgdmFyIGVsID0gX2EuZWwsIGV2ZW50ID0gX2EuZXZlbnQsIGxpc3RlbmVyID0gX2EubGlzdGVuZXI7XG4gICAgICAgICAgICByZXR1cm4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ldmVudHMgPSBbXTtcbiAgICB9O1xuICAgIHJldHVybiBFdmVudEhhbmRsZXI7XG59KCkpO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBFdmVudEhhbmRsZXI7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/events/dist/EventHandler.js\n")},
vendor: 55,096 bytes, line 1
1"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/*!\n * @pixelunion/rimg-shopify v2.7.1\n * (c) 2023 Pixel Union\n */\n/*!\n * @pixelunion/rimg v2.2.2\n * (c) 2022 Pixel Union\n */\n\n/**\n * The default template render function. Turns a template string into an image\n * URL.\n *\n * @param {String} template\n * @param {Size} size\n * @returns {String}\n */\nfunction defaultTemplateRender(template, size) {\n  return template.replace('{size}', \"\".concat(size.width, \"x\").concat(size.height));\n}\n/**\n * @type Settings\n */\n\n\nvar defaults = {\n  scale: 1,\n  template: false,\n  templateRender: defaultTemplateRender,\n  max: {\n    width: Infinity,\n    height: Infinity\n  },\n  round: 32,\n  placeholder: false,\n  crop: null\n};\n/**\n * Get a data attribute value from an element, with a default fallback and\n * sanitization step.\n *\n * @param {Element} el\n *\n * @param {String} name\n *        The data attribute name.\n *\n * @param {Object} options\n *        An object holding fallback values if the data attribute does not\n *        exist. If this object doesn't have the property, we further fallback\n *        to our defaults.\n *\n * @param {Function} [sanitize]\n *        A function to sanitize the data attribute value with.\n *\n * @returns {String|*}\n */\n\nfunction getData(el, name, options, sanitize) {\n  var attr = \"data-rimg-\".concat(name);\n  if (!el.hasAttribute(attr)) return options[name] || defaults[name];\n  var value = el.getAttribute(attr);\n  return sanitize ? sanitize(value) : value;\n}\n/**\n * Sanitize data attributes that represent a size (in the form of `10x10`).\n *\n * @param {String} value\n * @returns {Object} An object with `width` and `height` properties.\n */\n\n\nfunction parseSize(value) {\n  value = value.split('x');\n  return {\n    width: parseInt(value[0], 10),\n    height: parseInt(value[1], 10)\n  };\n}\n/**\n * Sanitize crop values to ensure they are valid, or null\n *\n * @param {String} value\n * @returns {Object} Shopify crop parameter ('top', 'center', 'bottom', 'left', 'right') or null, if an unsupported value is found\n */\n\n\nfunction processCropValue(value) {\n  switch (value) {\n    case 'top':\n    case 'center':\n    case 'bottom':\n    case 'left':\n    case 'right':\n      return value;\n\n    default:\n      return null;\n  }\n}\n/**\n * Loads information about an element.\n *\n * Options can be set on the element itself using data attributes, or through\n * the `options` parameter. Data attributes take priority.\n *\n * @param {HTMLElement} el\n * @param {Settings} options\n * @returns {Item}\n */\n\n\nfunction parseItem(el) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var isImage = el.hasAttribute('data-rimg-template');\n  /**\n   * @typedef {Settings} Item\n   */\n\n  return {\n    el: el,\n    // Type of element\n    isImage: isImage,\n    isBackgroundImage: isImage && el.tagName !== 'IMG',\n    // Image scale\n    scale: parseInt(getData(el, 'scale', options)),\n    // Device density\n    density: window.devicePixelRatio || 1,\n    // Image template URL\n    template: getData(el, 'template', options),\n    templateRender: options.templateRender || defaults.templateRender,\n    // Maximum image dimensions\n    max: getData(el, 'max', options, parseSize),\n    // Round image dimensions to the nearest multiple\n    round: getData(el, 'round', options),\n    // Placeholder image dimensions\n    placeholder: getData(el, 'placeholder', options, parseSize),\n    // Crop value; null if image is uncropped, otherwise equal to the Shopify crop parameter ('center', 'top', etc.)\n    crop: getData(el, 'crop', options, processCropValue)\n  };\n}\n/**\n * Round to the nearest multiple.\n *\n * This is so we don't tax the image server too much.\n *\n * @param {Number} size The size, in pixels.\n * @param {Number} [multiple] The multiple to round to the nearest.\n * @param {Number} [maxLimit] Maximum allowed value - value to return if rounded multiple is above this limit\n * @returns {Number}\n */\n\n\nfunction roundSize(size) {\n  var multiple = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 32;\n  var maxLimit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Infinity;\n  return size === 0 ? multiple : Math.min(Math.ceil(size / multiple) * multiple, maxLimit);\n}\n/**\n * Get the size of an element.\n *\n * If it is too small, it's parent element is checked, and so on. This helps\n * avoid the situation where an element doesn't have a size yet or is positioned\n * out of the layout.\n *\n * @param {HTMLElement} el\n * @return {Object} size\n * @return {Number} size.width The width, in pixels.\n * @return {Number} size.height The height, in pixels.\n */\n\n\nfunction getElementSize(el) {\n  var size = {\n    width: 0,\n    height: 0\n  };\n\n  while (el) {\n    size.width = el.offsetWidth;\n    size.height = el.offsetHeight;\n    if (size.width > 20 && size.height > 20) break;\n    el = el.parentNode;\n  }\n\n  return size;\n}\n/**\n * Return the maximum supported density of the image, given the container.\n *\n * @param {Item} item\n * @param {Size} size\n */\n\n\nfunction supportedDensity(item, size) {\n  return Math.min(Math.min(Math.max(item.max.width / size.width, 1), item.density), Math.min(Math.max(item.max.height / size.height, 1), item.density)).toFixed(2);\n}\n/**\n * Trigger a custom event.\n *\n * Note: this approach is deprecated, but still required to support older\n * browsers such as IE 10.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events\n *\n * @param {HTMLElement} el\n *        The element to trigger the event on.\n *\n * @param {String} name\n *        The event name.\n *\n * @returns {Boolean}\n *          True if the event was canceled.\n */\n\n\nfunction trigger(el, name) {\n  var event = document.createEvent('Event');\n  event.initEvent(name, true, true);\n  return !el.dispatchEvent(event);\n}\n/**\n * Set the image URL on the element. Supports background images and `srcset`.\n *\n * @param {Item} item\n * @param {Size} size\n * @param {Boolean} isPlaceholder\n */\n\n\nfunction setImage(item, size, isPlaceholder, onLoad) {\n  var render = item.templateRender;\n  var density = isPlaceholder ? 1 : supportedDensity(item, size);\n  var round = isPlaceholder ? 1 : item.round; // Calculate the final display size, taking into account the image's\n  // maximum dimensions.\n\n  var targetWidth = size.width * density;\n  var targetHeight = size.height * density;\n  var displaySize;\n\n  if (item.crop) {\n    displaySize = {\n      width: roundSize(targetWidth, round, item.max.width),\n      height: roundSize(targetHeight, round, item.max.height)\n    };\n  } else {\n    // Shopify serves images clamped by the requested dimensions (fitted to the smallest dimension).\n    // To get the desired and expected pixel density we need to request cover dimensions (fitted to largest dimension).\n    // This isn't a problem with cropped images which are served at the exact dimension requested.\n    var containerAspectRatio = size.width / size.height;\n    var imageAspectRatio = item.max.width / item.max.height;\n\n    if (containerAspectRatio > imageAspectRatio) {\n      // fit width\n      displaySize = {\n        width: roundSize(targetWidth, round, item.max.width),\n        height: roundSize(targetWidth / imageAspectRatio, round, item.max.height)\n      };\n    } else {\n      // fit height\n      displaySize = {\n        width: roundSize(targetHeight * imageAspectRatio, round, item.max.width),\n        height: roundSize(targetHeight, round, item.max.height)\n      };\n    }\n  }\n\n  var url = render(item.template, displaySize); // On load callback\n\n  var image = new Image();\n  image.onload = onLoad;\n  image.src = url; // Set image\n\n  if (item.isBackgroundImage) {\n    item.el.style.backgroundImage = \"url('\".concat(url, \"')\");\n  } else {\n    item.el.setAttribute('srcset', \"\".concat(url, \" \").concat(density, \"x\"));\n  }\n}\n/**\n * Load the image, set loaded status, and trigger the load event.\n *\n * @fires rimg:load\n * @fires rimg:error\n * @param {Item} item\n * @param {Size} size\n */\n\n\nfunction loadFullImage(item, size) {\n  var el = item.el;\n  setImage(item, size, false, function (event) {\n    if (event.type === 'load') {\n      el.setAttribute('data-rimg', 'loaded');\n    } else {\n      el.setAttribute('data-rimg', 'error');\n      trigger(el, 'rimg:error');\n    }\n\n    trigger(el, 'rimg:load');\n  });\n}\n/**\n * Load in a responsive image.\n *\n * Sets the image's `srcset` attribute to the final image URLs, calculated based\n * on the actual size the image is being shown at.\n *\n * @fires rimg:loading\n *        The image URLs have been set and we are waiting for them to load.\n *\n * @fires rimg:loaded\n *        The final image has loaded.\n *\n * @fires rimg:error\n *        The final image failed loading.\n *\n * @param {Item} item\n */\n\n\nfunction loadImage(item) {\n  var el = item.el; // Already loaded?\n\n  var status = el.getAttribute('data-rimg');\n  if (status === 'loading' || status === 'loaded') return; // Is the SVG loaded?\n  // In Firefox, el.complete always returns true [citation needed, may not be the case anymore, Jan/2022]\n  // so we also check el.naturalWidth, which equals 0 until the image loads\n\n  if (!item.isBackgroundImage) {\n    if (el.naturalWidth === 0 || !el.complete) {\n      // Wait for the load event, then call load image\n      el.addEventListener('load', function cb() {\n        el.removeEventListener('load', cb);\n        loadImage(item);\n      });\n      return;\n    }\n  } // Trigger loading event, and stop if cancelled\n\n\n  if (trigger(el, 'rimg:loading')) return; // Mark as loading\n\n  el.setAttribute('data-rimg', 'loading'); // Get element size. This is used as the ideal display size.\n\n  var size = getElementSize(item.el);\n  size.width *= item.scale;\n  size.height *= item.scale;\n\n  if (item.placeholder) {\n    // Load a placeholder image first, followed by the full image. Force the\n    // element to keep its dimensions while it loads. If the image is smaller\n    // than the element size, use the image's size. Density is taken into account\n    // for HiDPI devices to avoid blurry images.\n    if (!item.isBackgroundImage) {\n      el.setAttribute('width', Math.min(Math.floor(item.max.width / item.density), size.width));\n      el.setAttribute('height', Math.min(Math.floor(item.max.height / item.density), size.height));\n    }\n\n    setImage(item, item.placeholder, true, function () {\n      return loadFullImage(item, size);\n    });\n  } else {\n    loadFullImage(item, size);\n  }\n}\n/**\n * Prepare an element to be displayed on the screen.\n *\n * Images have special logic applied to them to swap out the different sources.\n *\n * @fires rimg:enter\n *        The element is entering the viewport.\n *\n * @param {HTMLElement} el\n * @param {Settings} options\n */\n\n\nfunction load(el, options) {\n  if (!el) return;\n  trigger(el, 'rimg:enter');\n  var item = parseItem(el, options);\n\n  if (item.isImage) {\n    if (!item.isBackgroundImage) {\n      el.setAttribute('data-rimg-template-svg', el.getAttribute('srcset'));\n    }\n\n    loadImage(item);\n  }\n}\n/**\n * Reset an element's state so that its image can be recalculated.\n *\n * @fires rimg:update\n *        The element is being updated.\n *\n * @param {HTMLElement} el\n * @param {Settings} options\n */\n\n\nfunction update(el, options) {\n  if (!el) return;\n  trigger(el, 'rimg:update');\n  var item = parseItem(el, options);\n\n  if (item.isImage) {\n    if (!item.isBackgroundImage) {\n      el.setAttribute('data-rimg', 'lazy');\n      el.setAttribute('srcset', el.getAttribute('data-rimg-template-svg'));\n    }\n\n    loadImage(item);\n  }\n}\n/**\n * Returns true if the element is within the viewport.\n * @param {HTMLElement} el\n * @returns {Boolean}\n */\n\n\nfunction inViewport(el) {\n  if (!el.offsetWidth || !el.offsetHeight || !el.getClientRects().length) {\n    return false;\n  }\n\n  var root = document.documentElement;\n  var width = Math.min(root.clientWidth, window.innerWidth);\n  var height = Math.min(root.clientHeight, window.innerHeight);\n  var rect = el.getBoundingClientRect();\n  return rect.bottom >= 0 && rect.right >= 0 && rect.top <= height && rect.left <= width;\n}\n/**\n * @typedef {Object} Size\n * @property {Number} width\n * @property {Number} height\n */\n\n/**\n * A function to turn a template string into a URL.\n *\n * @callback TemplateRenderer\n * @param {String} template\n * @param {Size} size\n * @returns {String}\n */\n\n/**\n * @typedef {Object} Settings\n *\n * @property {String} [template]\n *           A template string used to generate URLs for an image. This allows us to\n *           dynamically load images with sizes to match the container's size.\n *\n * @property {TemplateRenderer} [templateRender]\n *           A function to turn a template string into a URL.\n *\n * @property {Size} [max]\n *           The maximum available size for the image. This ensures we don't\n *           try to load an image larger than is possible.\n * \n * @property {Number} [scale]\n *           A number to scale the final image dimensions by. \n *           Only applies to lazy-loaded images. Defaults to 1.\n *\n * @property {Number} [round]\n *           Round image dimensions to the nearest multiple. This is intended to\n *           tax the image server less by lowering the number of possible image\n *           sizes requested.\n *\n * @property {Size} [placeholder]\n *           The size of the lo-fi image to load before the full image.\n * \n * @property {String} [crop]\n *           Crop value; null if image is uncropped, otherwise equal \n *           to the Shopify crop parameter ('center', 'top', etc.).\n */\n\n/**\n * Initialize the responsive image handler.\n *\n * @param {String|HTMLElement|NodeList} selector\n *        The CSS selector, element, or elements to track for lazy-loading.\n *\n * @param {Settings} options\n *\n * @returns {PublicApi}\n */\n\n\nfunction rimg() {\n  var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"lazy\"]';\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; // Intersections\n\n  var io = new IntersectionObserver(function (entries) {\n    entries.forEach(function (entry) {\n      if (entry.isIntersecting || entry.intersectionRatio > 0) {\n        io.unobserve(entry.target);\n        load(entry.target, options);\n      }\n    });\n  }, {\n    // Watch the viewport, with 20% vertical margins\n    rootMargin: '20% 0px'\n  });\n  /**\n   * @typedef {Object} PublicApi\n   */\n\n  var api = {\n    /**\n     * Track a new selector, element, or nodelist for lazy-loading.\n     * @type Function\n     * @param {String|HTMLElement|NodeList} selector\n     */\n    track: function track() {\n      var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"lazy\"]';\n      var els = querySelector(selector);\n\n      for (var i = 0; i < els.length; i++) {\n        // If an element is already in the viewport, load it right away. This\n        // fixes a race-condition with dynamically added elements.\n        if (inViewport(els[i])) {\n          load(els[i], options);\n        } else {\n          io.observe(els[i]);\n        }\n      }\n    },\n\n    /**\n     * Update element(s) that have already been loaded to force their images\n     * to be recalculated.\n     * @type Function\n     * @param {String|HTMLElement|NodeList} selector\n     */\n    update: function update$1() {\n      var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"loaded\"]';\n      var els = querySelector(selector);\n\n      for (var i = 0; i < els.length; i++) {\n        update(els[i], options);\n      }\n    },\n\n    /**\n     * Stop tracking element(s) for lazy-loading.\n     * @type Function\n     * @param {String|HTMLElement|NodeList} selector\n     */\n    untrack: function untrack() {\n      var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg]';\n      var els = querySelector(selector);\n\n      for (var i = 0; i < els.length; i++) {\n        io.unobserve(els[i]);\n      }\n    },\n\n    /**\n     * Manually load images.\n     * @type Function\n     * @param {String|HTMLElement|NodeList} selector\n     */\n    load: function load$1() {\n      var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg]';\n      var els = querySelector(selector);\n\n      for (var i = 0; i < els.length; i++) {\n        load(els[i], options);\n      }\n    },\n\n    /**\n     * Unload all event handlers and observers.\n     * @type Function\n     */\n    unload: function unload() {\n      io.disconnect();\n    }\n  }; // Add initial elements\n\n  api.track(selector);\n  return api;\n}\n/**\n * Finds a group of elements on the page.\n *\n * @param {String|HTMLElement|NodeList} selector\n * @returns {Object} An array-like object.\n */\n\n\nfunction querySelector(selector) {\n  if (typeof selector === 'string') {\n    return document.querySelectorAll(selector);\n  }\n\n  if (selector instanceof HTMLElement) {\n    return [selector];\n  }\n\n  if (selector instanceof NodeList) {\n    return selector;\n  }\n\n  return [];\n}\n\n/**\n * Polyfill for Element.matches().\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/matches\n */\nif (!Element.prototype.matches) {\n  Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) {\n    var matches = (this.document || this.ownerDocument).querySelectorAll(s),\n        i = matches.length;\n\n    while (--i >= 0 && matches.item(i) !== this) {}\n\n    return i > -1;\n  };\n}\n\nvar state = {\n  init: init,\n  watch: watch,\n  unwatch: unwatch,\n  load: load$1\n};\n\nfunction init() {\n  var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"lazy\"]';\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  state.selector = selector;\n  state.instance = rimg(selector, options);\n  state.loadedWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); // Listen for Shopify theme editor events\n\n  document.addEventListener('shopify:section:load', function (event) {\n    return watch(event.target);\n  });\n  window.addEventListener('resize', function () {\n    return _update();\n  });\n  document.addEventListener('shopify:section:unload', function (event) {\n    return unwatch(event.target);\n  }); // Listen for custom events to allow themes to hook into rimg\n\n  document.addEventListener('theme:rimg:watch', function (event) {\n    return watch(event.target);\n  });\n  document.addEventListener('theme:rimg:unwatch', function (event) {\n    return unwatch(event.target);\n  }); // Support custom events triggered through jQuery\n  // See: https://github.com/jquery/jquery/issues/3347\n\n  if (window.jQuery) {\n    jQuery(document).on({\n      'theme:rimg:watch': function themeRimgWatch(event) {\n        return watch(event.target);\n      },\n      'theme:rimg:unwatch': function themeRimgUnwatch(event) {\n        return unwatch(event.target);\n      }\n    });\n  }\n}\n/**\n * Track an element, and its children.\n *\n * @param {HTMLElement} el\n */\n\n\nfunction watch(el) {\n  // Track element\n  if (typeof el.matches === 'function' && el.matches(state.selector)) {\n    state.instance.track(el);\n  } // Track element's children\n\n\n  state.instance.track(el.querySelectorAll(state.selector));\n}\n/**\n * Untrack an element, and its children\n *\n * @param {HTMLElement} el\n * @private\n */\n\n\nfunction unwatch(el) {\n  // Untrack element's children\n  state.instance.untrack(el.querySelectorAll(state.selector)); // Untrack element\n\n  if (typeof el.matches === 'function' && el.matches(state.selector)) {\n    state.instance.untrack(el);\n  }\n}\n/**\n * Manually load an image\n *\n * @param {HTMLElement} el\n */\n\n\nfunction load$1(el) {\n  // Load element\n  if (typeof el.matches === 'function' && el.matches(state.selector)) {\n    state.instance.load(el);\n  } // Load element's children\n\n\n  state.instance.load(el.querySelectorAll(state.selector));\n}\n/**\n * Update an element, and its children.\n *\n * @param {HTMLElement} el\n */\n\n\nfunction _update() {\n  var currentWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); // Return if we're not 2x smaller, or larger than the existing loading size\n\n  if (currentWidth / state.loadedWidth > 0.5 && currentWidth / state.loadedWidth < 2) {\n    return;\n  }\n\n  state.loadedWidth = currentWidth;\n  state.instance.update();\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (state);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vcmltZy1zaG9waWZ5L2Rpc3QvaW5kZXguZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wYXJhbGxheC8uL25vZGVfbW9kdWxlcy9AcGl4ZWx1bmlvbi9yaW1nLXNob3BpZnkvZGlzdC9pbmRleC5lcy5qcz9kOTJhIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQHBpeGVsdW5pb24vcmltZy1zaG9waWZ5IHYyLjcuMVxuICogKGMpIDIwMjMgUGl4ZWwgVW5pb25cbiAqL1xuLyohXG4gKiBAcGl4ZWx1bmlvbi9yaW1nIHYyLjIuMlxuICogKGMpIDIwMjIgUGl4ZWwgVW5pb25cbiAqL1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHRlbXBsYXRlIHJlbmRlciBmdW5jdGlvbi4gVHVybnMgYSB0ZW1wbGF0ZSBzdHJpbmcgaW50byBhbiBpbWFnZVxuICogVVJMLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZVxuICogQHBhcmFtIHtTaXplfSBzaXplXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBkZWZhdWx0VGVtcGxhdGVSZW5kZXIodGVtcGxhdGUsIHNpemUpIHtcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoJ3tzaXplfScsIFwiXCIuY29uY2F0KHNpemUud2lkdGgsIFwieFwiKS5jb25jYXQoc2l6ZS5oZWlnaHQpKTtcbn1cbi8qKlxuICogQHR5cGUgU2V0dGluZ3NcbiAqL1xuXG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgc2NhbGU6IDEsXG4gIHRlbXBsYXRlOiBmYWxzZSxcbiAgdGVtcGxhdGVSZW5kZXI6IGRlZmF1bHRUZW1wbGF0ZVJlbmRlcixcbiAgbWF4OiB7XG4gICAgd2lkdGg6IEluZmluaXR5LFxuICAgIGhlaWdodDogSW5maW5pdHlcbiAgfSxcbiAgcm91bmQ6IDMyLFxuICBwbGFjZWhvbGRlcjogZmFsc2UsXG4gIGNyb3A6IG51bGxcbn07XG4vKipcbiAqIEdldCBhIGRhdGEgYXR0cmlidXRlIHZhbHVlIGZyb20gYW4gZWxlbWVudCwgd2l0aCBhIGRlZmF1bHQgZmFsbGJhY2sgYW5kXG4gKiBzYW5pdGl6YXRpb24gc3RlcC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqICAgICAgICBUaGUgZGF0YSBhdHRyaWJ1dGUgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogICAgICAgIEFuIG9iamVjdCBob2xkaW5nIGZhbGxiYWNrIHZhbHVlcyBpZiB0aGUgZGF0YSBhdHRyaWJ1dGUgZG9lcyBub3RcbiAqICAgICAgICBleGlzdC4gSWYgdGhpcyBvYmplY3QgZG9lc24ndCBoYXZlIHRoZSBwcm9wZXJ0eSwgd2UgZnVydGhlciBmYWxsYmFja1xuICogICAgICAgIHRvIG91ciBkZWZhdWx0cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbc2FuaXRpemVdXG4gKiAgICAgICAgQSBmdW5jdGlvbiB0byBzYW5pdGl6ZSB0aGUgZGF0YSBhdHRyaWJ1dGUgdmFsdWUgd2l0aC5cbiAqXG4gKiBAcmV0dXJucyB7U3RyaW5nfCp9XG4gKi9cblxuZnVuY3Rpb24gZ2V0RGF0YShlbCwgbmFtZSwgb3B0aW9ucywgc2FuaXRpemUpIHtcbiAgdmFyIGF0dHIgPSBcImRhdGEtcmltZy1cIi5jb25jYXQobmFtZSk7XG4gIGlmICghZWwuaGFzQXR0cmlidXRlKGF0dHIpKSByZXR1cm4gb3B0aW9uc1tuYW1lXSB8fCBkZWZhdWx0c1tuYW1lXTtcbiAgdmFyIHZhbHVlID0gZWwuZ2V0QXR0cmlidXRlKGF0dHIpO1xuICByZXR1cm4gc2FuaXRpemUgPyBzYW5pdGl6ZSh2YWx1ZSkgOiB2YWx1ZTtcbn1cbi8qKlxuICogU2FuaXRpemUgZGF0YSBhdHRyaWJ1dGVzIHRoYXQgcmVwcmVzZW50IGEgc2l6ZSAoaW4gdGhlIGZvcm0gb2YgYDEweDEwYCkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBwcm9wZXJ0aWVzLlxuICovXG5cblxuZnVuY3Rpb24gcGFyc2VTaXplKHZhbHVlKSB7XG4gIHZhbHVlID0gdmFsdWUuc3BsaXQoJ3gnKTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogcGFyc2VJbnQodmFsdWVbMF0sIDEwKSxcbiAgICBoZWlnaHQ6IHBhcnNlSW50KHZhbHVlWzFdLCAxMClcbiAgfTtcbn1cbi8qKlxuICogU2FuaXRpemUgY3JvcCB2YWx1ZXMgdG8gZW5zdXJlIHRoZXkgYXJlIHZhbGlkLCBvciBudWxsXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTaG9waWZ5IGNyb3AgcGFyYW1ldGVyICgndG9wJywgJ2NlbnRlcicsICdib3R0b20nLCAnbGVmdCcsICdyaWdodCcpIG9yIG51bGwsIGlmIGFuIHVuc3VwcG9ydGVkIHZhbHVlIGlzIGZvdW5kXG4gKi9cblxuXG5mdW5jdGlvbiBwcm9jZXNzQ3JvcFZhbHVlKHZhbHVlKSB7XG4gIHN3aXRjaCAodmFsdWUpIHtcbiAgICBjYXNlICd0b3AnOlxuICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICBjYXNlICdsZWZ0JzpcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogTG9hZHMgaW5mb3JtYXRpb24gYWJvdXQgYW4gZWxlbWVudC5cbiAqXG4gKiBPcHRpb25zIGNhbiBiZSBzZXQgb24gdGhlIGVsZW1lbnQgaXRzZWxmIHVzaW5nIGRhdGEgYXR0cmlidXRlcywgb3IgdGhyb3VnaFxuICogdGhlIGBvcHRpb25zYCBwYXJhbWV0ZXIuIERhdGEgYXR0cmlidXRlcyB0YWtlIHByaW9yaXR5LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcGFyYW0ge1NldHRpbmdzfSBvcHRpb25zXG4gKiBAcmV0dXJucyB7SXRlbX1cbiAqL1xuXG5cbmZ1bmN0aW9uIHBhcnNlSXRlbShlbCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciBpc0ltYWdlID0gZWwuaGFzQXR0cmlidXRlKCdkYXRhLXJpbWctdGVtcGxhdGUnKTtcbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtTZXR0aW5nc30gSXRlbVxuICAgKi9cblxuICByZXR1cm4ge1xuICAgIGVsOiBlbCxcbiAgICAvLyBUeXBlIG9mIGVsZW1lbnRcbiAgICBpc0ltYWdlOiBpc0ltYWdlLFxuICAgIGlzQmFja2dyb3VuZEltYWdlOiBpc0ltYWdlICYmIGVsLnRhZ05hbWUgIT09ICdJTUcnLFxuICAgIC8vIEltYWdlIHNjYWxlXG4gICAgc2NhbGU6IHBhcnNlSW50KGdldERhdGEoZWwsICdzY2FsZScsIG9wdGlvbnMpKSxcbiAgICAvLyBEZXZpY2UgZGVuc2l0eVxuICAgIGRlbnNpdHk6IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEsXG4gICAgLy8gSW1hZ2UgdGVtcGxhdGUgVVJMXG4gICAgdGVtcGxhdGU6IGdldERhdGEoZWwsICd0ZW1wbGF0ZScsIG9wdGlvbnMpLFxuICAgIHRlbXBsYXRlUmVuZGVyOiBvcHRpb25zLnRlbXBsYXRlUmVuZGVyIHx8IGRlZmF1bHRzLnRlbXBsYXRlUmVuZGVyLFxuICAgIC8vIE1heGltdW0gaW1hZ2UgZGltZW5zaW9uc1xuICAgIG1heDogZ2V0RGF0YShlbCwgJ21heCcsIG9wdGlvbnMsIHBhcnNlU2l6ZSksXG4gICAgLy8gUm91bmQgaW1hZ2UgZGltZW5zaW9ucyB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZVxuICAgIHJvdW5kOiBnZXREYXRhKGVsLCAncm91bmQnLCBvcHRpb25zKSxcbiAgICAvLyBQbGFjZWhvbGRlciBpbWFnZSBkaW1lbnNpb25zXG4gICAgcGxhY2Vob2xkZXI6IGdldERhdGEoZWwsICdwbGFjZWhvbGRlcicsIG9wdGlvbnMsIHBhcnNlU2l6ZSksXG4gICAgLy8gQ3JvcCB2YWx1ZTsgbnVsbCBpZiBpbWFnZSBpcyB1bmNyb3BwZWQsIG90aGVyd2lzZSBlcXVhbCB0byB0aGUgU2hvcGlmeSBjcm9wIHBhcmFtZXRlciAoJ2NlbnRlcicsICd0b3AnLCBldGMuKVxuICAgIGNyb3A6IGdldERhdGEoZWwsICdjcm9wJywgb3B0aW9ucywgcHJvY2Vzc0Nyb3BWYWx1ZSlcbiAgfTtcbn1cbi8qKlxuICogUm91bmQgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUuXG4gKlxuICogVGhpcyBpcyBzbyB3ZSBkb24ndCB0YXggdGhlIGltYWdlIHNlcnZlciB0b28gbXVjaC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gc2l6ZSBUaGUgc2l6ZSwgaW4gcGl4ZWxzLlxuICogQHBhcmFtIHtOdW1iZXJ9IFttdWx0aXBsZV0gVGhlIG11bHRpcGxlIHRvIHJvdW5kIHRvIHRoZSBuZWFyZXN0LlxuICogQHBhcmFtIHtOdW1iZXJ9IFttYXhMaW1pdF0gTWF4aW11bSBhbGxvd2VkIHZhbHVlIC0gdmFsdWUgdG8gcmV0dXJuIGlmIHJvdW5kZWQgbXVsdGlwbGUgaXMgYWJvdmUgdGhpcyBsaW1pdFxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuXG5cbmZ1bmN0aW9uIHJvdW5kU2l6ZShzaXplKSB7XG4gIHZhciBtdWx0aXBsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMzI7XG4gIHZhciBtYXhMaW1pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogSW5maW5pdHk7XG4gIHJldHVybiBzaXplID09PSAwID8gbXVsdGlwbGUgOiBNYXRoLm1pbihNYXRoLmNlaWwoc2l6ZSAvIG11bHRpcGxlKSAqIG11bHRpcGxlLCBtYXhMaW1pdCk7XG59XG4vKipcbiAqIEdldCB0aGUgc2l6ZSBvZiBhbiBlbGVtZW50LlxuICpcbiAqIElmIGl0IGlzIHRvbyBzbWFsbCwgaXQncyBwYXJlbnQgZWxlbWVudCBpcyBjaGVja2VkLCBhbmQgc28gb24uIFRoaXMgaGVscHNcbiAqIGF2b2lkIHRoZSBzaXR1YXRpb24gd2hlcmUgYW4gZWxlbWVudCBkb2Vzbid0IGhhdmUgYSBzaXplIHlldCBvciBpcyBwb3NpdGlvbmVkXG4gKiBvdXQgb2YgdGhlIGxheW91dC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICogQHJldHVybiB7T2JqZWN0fSBzaXplXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHNpemUud2lkdGggVGhlIHdpZHRoLCBpbiBwaXhlbHMuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHNpemUuaGVpZ2h0IFRoZSBoZWlnaHQsIGluIHBpeGVscy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRTaXplKGVsKSB7XG4gIHZhciBzaXplID0ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xuXG4gIHdoaWxlIChlbCkge1xuICAgIHNpemUud2lkdGggPSBlbC5vZmZzZXRXaWR0aDtcbiAgICBzaXplLmhlaWdodCA9IGVsLm9mZnNldEhlaWdodDtcbiAgICBpZiAoc2l6ZS53aWR0aCA+IDIwICYmIHNpemUuaGVpZ2h0ID4gMjApIGJyZWFrO1xuICAgIGVsID0gZWwucGFyZW50Tm9kZTtcbiAgfVxuXG4gIHJldHVybiBzaXplO1xufVxuLyoqXG4gKiBSZXR1cm4gdGhlIG1heGltdW0gc3VwcG9ydGVkIGRlbnNpdHkgb2YgdGhlIGltYWdlLCBnaXZlbiB0aGUgY29udGFpbmVyLlxuICpcbiAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICogQHBhcmFtIHtTaXplfSBzaXplXG4gKi9cblxuXG5mdW5jdGlvbiBzdXBwb3J0ZWREZW5zaXR5KGl0ZW0sIHNpemUpIHtcbiAgcmV0dXJuIE1hdGgubWluKE1hdGgubWluKE1hdGgubWF4KGl0ZW0ubWF4LndpZHRoIC8gc2l6ZS53aWR0aCwgMSksIGl0ZW0uZGVuc2l0eSksIE1hdGgubWluKE1hdGgubWF4KGl0ZW0ubWF4LmhlaWdodCAvIHNpemUuaGVpZ2h0LCAxKSwgaXRlbS5kZW5zaXR5KSkudG9GaXhlZCgyKTtcbn1cbi8qKlxuICogVHJpZ2dlciBhIGN1c3RvbSBldmVudC5cbiAqXG4gKiBOb3RlOiB0aGlzIGFwcHJvYWNoIGlzIGRlcHJlY2F0ZWQsIGJ1dCBzdGlsbCByZXF1aXJlZCB0byBzdXBwb3J0IG9sZGVyXG4gKiBicm93c2VycyBzdWNoIGFzIElFIDEwLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvR3VpZGUvRXZlbnRzL0NyZWF0aW5nX2FuZF90cmlnZ2VyaW5nX2V2ZW50c1xuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKiAgICAgICAgVGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb24uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqICAgICAgICBUaGUgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqICAgICAgICAgIFRydWUgaWYgdGhlIGV2ZW50IHdhcyBjYW5jZWxlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIHRyaWdnZXIoZWwsIG5hbWUpIHtcbiAgdmFyIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gIGV2ZW50LmluaXRFdmVudChuYW1lLCB0cnVlLCB0cnVlKTtcbiAgcmV0dXJuICFlbC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cbi8qKlxuICogU2V0IHRoZSBpbWFnZSBVUkwgb24gdGhlIGVsZW1lbnQuIFN1cHBvcnRzIGJhY2tncm91bmQgaW1hZ2VzIGFuZCBgc3Jjc2V0YC5cbiAqXG4gKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAqIEBwYXJhbSB7U2l6ZX0gc2l6ZVxuICogQHBhcmFtIHtCb29sZWFufSBpc1BsYWNlaG9sZGVyXG4gKi9cblxuXG5mdW5jdGlvbiBzZXRJbWFnZShpdGVtLCBzaXplLCBpc1BsYWNlaG9sZGVyLCBvbkxvYWQpIHtcbiAgdmFyIHJlbmRlciA9IGl0ZW0udGVtcGxhdGVSZW5kZXI7XG4gIHZhciBkZW5zaXR5ID0gaXNQbGFjZWhvbGRlciA/IDEgOiBzdXBwb3J0ZWREZW5zaXR5KGl0ZW0sIHNpemUpO1xuICB2YXIgcm91bmQgPSBpc1BsYWNlaG9sZGVyID8gMSA6IGl0ZW0ucm91bmQ7IC8vIENhbGN1bGF0ZSB0aGUgZmluYWwgZGlzcGxheSBzaXplLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBpbWFnZSdzXG4gIC8vIG1heGltdW0gZGltZW5zaW9ucy5cblxuICB2YXIgdGFyZ2V0V2lkdGggPSBzaXplLndpZHRoICogZGVuc2l0eTtcbiAgdmFyIHRhcmdldEhlaWdodCA9IHNpemUuaGVpZ2h0ICogZGVuc2l0eTtcbiAgdmFyIGRpc3BsYXlTaXplO1xuXG4gIGlmIChpdGVtLmNyb3ApIHtcbiAgICBkaXNwbGF5U2l6ZSA9IHtcbiAgICAgIHdpZHRoOiByb3VuZFNpemUodGFyZ2V0V2lkdGgsIHJvdW5kLCBpdGVtLm1heC53aWR0aCksXG4gICAgICBoZWlnaHQ6IHJvdW5kU2l6ZSh0YXJnZXRIZWlnaHQsIHJvdW5kLCBpdGVtLm1heC5oZWlnaHQpXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBTaG9waWZ5IHNlcnZlcyBpbWFnZXMgY2xhbXBlZCBieSB0aGUgcmVxdWVzdGVkIGRpbWVuc2lvbnMgKGZpdHRlZCB0byB0aGUgc21hbGxlc3QgZGltZW5zaW9uKS5cbiAgICAvLyBUbyBnZXQgdGhlIGRlc2lyZWQgYW5kIGV4cGVjdGVkIHBpeGVsIGRlbnNpdHkgd2UgbmVlZCB0byByZXF1ZXN0IGNvdmVyIGRpbWVuc2lvbnMgKGZpdHRlZCB0byBsYXJnZXN0IGRpbWVuc2lvbikuXG4gICAgLy8gVGhpcyBpc24ndCBhIHByb2JsZW0gd2l0aCBjcm9wcGVkIGltYWdlcyB3aGljaCBhcmUgc2VydmVkIGF0IHRoZSBleGFjdCBkaW1lbnNpb24gcmVxdWVzdGVkLlxuICAgIHZhciBjb250YWluZXJBc3BlY3RSYXRpbyA9IHNpemUud2lkdGggLyBzaXplLmhlaWdodDtcbiAgICB2YXIgaW1hZ2VBc3BlY3RSYXRpbyA9IGl0ZW0ubWF4LndpZHRoIC8gaXRlbS5tYXguaGVpZ2h0O1xuXG4gICAgaWYgKGNvbnRhaW5lckFzcGVjdFJhdGlvID4gaW1hZ2VBc3BlY3RSYXRpbykge1xuICAgICAgLy8gZml0IHdpZHRoXG4gICAgICBkaXNwbGF5U2l6ZSA9IHtcbiAgICAgICAgd2lkdGg6IHJvdW5kU2l6ZSh0YXJnZXRXaWR0aCwgcm91bmQsIGl0ZW0ubWF4LndpZHRoKSxcbiAgICAgICAgaGVpZ2h0OiByb3VuZFNpemUodGFyZ2V0V2lkdGggLyBpbWFnZUFzcGVjdFJhdGlvLCByb3VuZCwgaXRlbS5tYXguaGVpZ2h0KVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZml0IGhlaWdodFxuICAgICAgZGlzcGxheVNpemUgPSB7XG4gICAgICAgIHdpZHRoOiByb3VuZFNpemUodGFyZ2V0SGVpZ2h0ICogaW1hZ2VBc3BlY3RSYXRpbywgcm91bmQsIGl0ZW0ubWF4LndpZHRoKSxcbiAgICAgICAgaGVpZ2h0OiByb3VuZFNpemUodGFyZ2V0SGVpZ2h0LCByb3VuZCwgaXRlbS5tYXguaGVpZ2h0KVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgdXJsID0gcmVuZGVyKGl0ZW0udGVtcGxhdGUsIGRpc3BsYXlTaXplKTsgLy8gT24gbG9hZCBjYWxsYmFja1xuXG4gIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICBpbWFnZS5vbmxvYWQgPSBvbkxvYWQ7XG4gIGltYWdlLnNyYyA9IHVybDsgLy8gU2V0IGltYWdlXG5cbiAgaWYgKGl0ZW0uaXNCYWNrZ3JvdW5kSW1hZ2UpIHtcbiAgICBpdGVtLmVsLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IFwidXJsKCdcIi5jb25jYXQodXJsLCBcIicpXCIpO1xuICB9IGVsc2Uge1xuICAgIGl0ZW0uZWwuc2V0QXR0cmlidXRlKCdzcmNzZXQnLCBcIlwiLmNvbmNhdCh1cmwsIFwiIFwiKS5jb25jYXQoZGVuc2l0eSwgXCJ4XCIpKTtcbiAgfVxufVxuLyoqXG4gKiBMb2FkIHRoZSBpbWFnZSwgc2V0IGxvYWRlZCBzdGF0dXMsIGFuZCB0cmlnZ2VyIHRoZSBsb2FkIGV2ZW50LlxuICpcbiAqIEBmaXJlcyByaW1nOmxvYWRcbiAqIEBmaXJlcyByaW1nOmVycm9yXG4gKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAqIEBwYXJhbSB7U2l6ZX0gc2l6ZVxuICovXG5cblxuZnVuY3Rpb24gbG9hZEZ1bGxJbWFnZShpdGVtLCBzaXplKSB7XG4gIHZhciBlbCA9IGl0ZW0uZWw7XG4gIHNldEltYWdlKGl0ZW0sIHNpemUsIGZhbHNlLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2xvYWQnKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmltZycsICdsb2FkZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLXJpbWcnLCAnZXJyb3InKTtcbiAgICAgIHRyaWdnZXIoZWwsICdyaW1nOmVycm9yJyk7XG4gICAgfVxuXG4gICAgdHJpZ2dlcihlbCwgJ3JpbWc6bG9hZCcpO1xuICB9KTtcbn1cbi8qKlxuICogTG9hZCBpbiBhIHJlc3BvbnNpdmUgaW1hZ2UuXG4gKlxuICogU2V0cyB0aGUgaW1hZ2UncyBgc3Jjc2V0YCBhdHRyaWJ1dGUgdG8gdGhlIGZpbmFsIGltYWdlIFVSTHMsIGNhbGN1bGF0ZWQgYmFzZWRcbiAqIG9uIHRoZSBhY3R1YWwgc2l6ZSB0aGUgaW1hZ2UgaXMgYmVpbmcgc2hvd24gYXQuXG4gKlxuICogQGZpcmVzIHJpbWc6bG9hZGluZ1xuICogICAgICAgIFRoZSBpbWFnZSBVUkxzIGhhdmUgYmVlbiBzZXQgYW5kIHdlIGFyZSB3YWl0aW5nIGZvciB0aGVtIHRvIGxvYWQuXG4gKlxuICogQGZpcmVzIHJpbWc6bG9hZGVkXG4gKiAgICAgICAgVGhlIGZpbmFsIGltYWdlIGhhcyBsb2FkZWQuXG4gKlxuICogQGZpcmVzIHJpbWc6ZXJyb3JcbiAqICAgICAgICBUaGUgZmluYWwgaW1hZ2UgZmFpbGVkIGxvYWRpbmcuXG4gKlxuICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gKi9cblxuXG5mdW5jdGlvbiBsb2FkSW1hZ2UoaXRlbSkge1xuICB2YXIgZWwgPSBpdGVtLmVsOyAvLyBBbHJlYWR5IGxvYWRlZD9cblxuICB2YXIgc3RhdHVzID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXJpbWcnKTtcbiAgaWYgKHN0YXR1cyA9PT0gJ2xvYWRpbmcnIHx8IHN0YXR1cyA9PT0gJ2xvYWRlZCcpIHJldHVybjsgLy8gSXMgdGhlIFNWRyBsb2FkZWQ/XG4gIC8vIEluIEZpcmVmb3gsIGVsLmNvbXBsZXRlIGFsd2F5cyByZXR1cm5zIHRydWUgW2NpdGF0aW9uIG5lZWRlZCwgbWF5IG5vdCBiZSB0aGUgY2FzZSBhbnltb3JlLCBKYW4vMjAyMl1cbiAgLy8gc28gd2UgYWxzbyBjaGVjayBlbC5uYXR1cmFsV2lkdGgsIHdoaWNoIGVxdWFscyAwIHVudGlsIHRoZSBpbWFnZSBsb2Fkc1xuXG4gIGlmICghaXRlbS5pc0JhY2tncm91bmRJbWFnZSkge1xuICAgIGlmIChlbC5uYXR1cmFsV2lkdGggPT09IDAgfHwgIWVsLmNvbXBsZXRlKSB7XG4gICAgICAvLyBXYWl0IGZvciB0aGUgbG9hZCBldmVudCwgdGhlbiBjYWxsIGxvYWQgaW1hZ2VcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiBjYigpIHtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIGNiKTtcbiAgICAgICAgbG9hZEltYWdlKGl0ZW0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IC8vIFRyaWdnZXIgbG9hZGluZyBldmVudCwgYW5kIHN0b3AgaWYgY2FuY2VsbGVkXG5cblxuICBpZiAodHJpZ2dlcihlbCwgJ3JpbWc6bG9hZGluZycpKSByZXR1cm47IC8vIE1hcmsgYXMgbG9hZGluZ1xuXG4gIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1yaW1nJywgJ2xvYWRpbmcnKTsgLy8gR2V0IGVsZW1lbnQgc2l6ZS4gVGhpcyBpcyB1c2VkIGFzIHRoZSBpZGVhbCBkaXNwbGF5IHNpemUuXG5cbiAgdmFyIHNpemUgPSBnZXRFbGVtZW50U2l6ZShpdGVtLmVsKTtcbiAgc2l6ZS53aWR0aCAqPSBpdGVtLnNjYWxlO1xuICBzaXplLmhlaWdodCAqPSBpdGVtLnNjYWxlO1xuXG4gIGlmIChpdGVtLnBsYWNlaG9sZGVyKSB7XG4gICAgLy8gTG9hZCBhIHBsYWNlaG9sZGVyIGltYWdlIGZpcnN0LCBmb2xsb3dlZCBieSB0aGUgZnVsbCBpbWFnZS4gRm9yY2UgdGhlXG4gICAgLy8gZWxlbWVudCB0byBrZWVwIGl0cyBkaW1lbnNpb25zIHdoaWxlIGl0IGxvYWRzLiBJZiB0aGUgaW1hZ2UgaXMgc21hbGxlclxuICAgIC8vIHRoYW4gdGhlIGVsZW1lbnQgc2l6ZSwgdXNlIHRoZSBpbWFnZSdzIHNpemUuIERlbnNpdHkgaXMgdGFrZW4gaW50byBhY2NvdW50XG4gICAgLy8gZm9yIEhpRFBJIGRldmljZXMgdG8gYXZvaWQgYmx1cnJ5IGltYWdlcy5cbiAgICBpZiAoIWl0ZW0uaXNCYWNrZ3JvdW5kSW1hZ2UpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBNYXRoLm1pbihNYXRoLmZsb29yKGl0ZW0ubWF4LndpZHRoIC8gaXRlbS5kZW5zaXR5KSwgc2l6ZS53aWR0aCkpO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBNYXRoLm1pbihNYXRoLmZsb29yKGl0ZW0ubWF4LmhlaWdodCAvIGl0ZW0uZGVuc2l0eSksIHNpemUuaGVpZ2h0KSk7XG4gICAgfVxuXG4gICAgc2V0SW1hZ2UoaXRlbSwgaXRlbS5wbGFjZWhvbGRlciwgdHJ1ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGxvYWRGdWxsSW1hZ2UoaXRlbSwgc2l6ZSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbG9hZEZ1bGxJbWFnZShpdGVtLCBzaXplKTtcbiAgfVxufVxuLyoqXG4gKiBQcmVwYXJlIGFuIGVsZW1lbnQgdG8gYmUgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4uXG4gKlxuICogSW1hZ2VzIGhhdmUgc3BlY2lhbCBsb2dpYyBhcHBsaWVkIHRvIHRoZW0gdG8gc3dhcCBvdXQgdGhlIGRpZmZlcmVudCBzb3VyY2VzLlxuICpcbiAqIEBmaXJlcyByaW1nOmVudGVyXG4gKiAgICAgICAgVGhlIGVsZW1lbnQgaXMgZW50ZXJpbmcgdGhlIHZpZXdwb3J0LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcGFyYW0ge1NldHRpbmdzfSBvcHRpb25zXG4gKi9cblxuXG5mdW5jdGlvbiBsb2FkKGVsLCBvcHRpb25zKSB7XG4gIGlmICghZWwpIHJldHVybjtcbiAgdHJpZ2dlcihlbCwgJ3JpbWc6ZW50ZXInKTtcbiAgdmFyIGl0ZW0gPSBwYXJzZUl0ZW0oZWwsIG9wdGlvbnMpO1xuXG4gIGlmIChpdGVtLmlzSW1hZ2UpIHtcbiAgICBpZiAoIWl0ZW0uaXNCYWNrZ3JvdW5kSW1hZ2UpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1yaW1nLXRlbXBsYXRlLXN2ZycsIGVsLmdldEF0dHJpYnV0ZSgnc3Jjc2V0JykpO1xuICAgIH1cblxuICAgIGxvYWRJbWFnZShpdGVtKTtcbiAgfVxufVxuLyoqXG4gKiBSZXNldCBhbiBlbGVtZW50J3Mgc3RhdGUgc28gdGhhdCBpdHMgaW1hZ2UgY2FuIGJlIHJlY2FsY3VsYXRlZC5cbiAqXG4gKiBAZmlyZXMgcmltZzp1cGRhdGVcbiAqICAgICAgICBUaGUgZWxlbWVudCBpcyBiZWluZyB1cGRhdGVkLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcGFyYW0ge1NldHRpbmdzfSBvcHRpb25zXG4gKi9cblxuXG5mdW5jdGlvbiB1cGRhdGUoZWwsIG9wdGlvbnMpIHtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICB0cmlnZ2VyKGVsLCAncmltZzp1cGRhdGUnKTtcbiAgdmFyIGl0ZW0gPSBwYXJzZUl0ZW0oZWwsIG9wdGlvbnMpO1xuXG4gIGlmIChpdGVtLmlzSW1hZ2UpIHtcbiAgICBpZiAoIWl0ZW0uaXNCYWNrZ3JvdW5kSW1hZ2UpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1yaW1nJywgJ2xhenknKTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3Jjc2V0JywgZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXJpbWctdGVtcGxhdGUtc3ZnJykpO1xuICAgIH1cblxuICAgIGxvYWRJbWFnZShpdGVtKTtcbiAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgd2l0aGluIHRoZSB2aWV3cG9ydC5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuXG5cbmZ1bmN0aW9uIGluVmlld3BvcnQoZWwpIHtcbiAgaWYgKCFlbC5vZmZzZXRXaWR0aCB8fCAhZWwub2Zmc2V0SGVpZ2h0IHx8ICFlbC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB2YXIgd2lkdGggPSBNYXRoLm1pbihyb290LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCk7XG4gIHZhciBoZWlnaHQgPSBNYXRoLm1pbihyb290LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0KTtcbiAgdmFyIHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIHJlY3QuYm90dG9tID49IDAgJiYgcmVjdC5yaWdodCA+PSAwICYmIHJlY3QudG9wIDw9IGhlaWdodCAmJiByZWN0LmxlZnQgPD0gd2lkdGg7XG59XG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNpemVcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB3aWR0aFxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGhlaWdodFxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0byB0dXJuIGEgdGVtcGxhdGUgc3RyaW5nIGludG8gYSBVUkwuXG4gKlxuICogQGNhbGxiYWNrIFRlbXBsYXRlUmVuZGVyZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZVxuICogQHBhcmFtIHtTaXplfSBzaXplXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2V0dGluZ3NcbiAqXG4gKiBAcHJvcGVydHkge1N0cmluZ30gW3RlbXBsYXRlXVxuICogICAgICAgICAgIEEgdGVtcGxhdGUgc3RyaW5nIHVzZWQgdG8gZ2VuZXJhdGUgVVJMcyBmb3IgYW4gaW1hZ2UuIFRoaXMgYWxsb3dzIHVzIHRvXG4gKiAgICAgICAgICAgZHluYW1pY2FsbHkgbG9hZCBpbWFnZXMgd2l0aCBzaXplcyB0byBtYXRjaCB0aGUgY29udGFpbmVyJ3Mgc2l6ZS5cbiAqXG4gKiBAcHJvcGVydHkge1RlbXBsYXRlUmVuZGVyZXJ9IFt0ZW1wbGF0ZVJlbmRlcl1cbiAqICAgICAgICAgICBBIGZ1bmN0aW9uIHRvIHR1cm4gYSB0ZW1wbGF0ZSBzdHJpbmcgaW50byBhIFVSTC5cbiAqXG4gKiBAcHJvcGVydHkge1NpemV9IFttYXhdXG4gKiAgICAgICAgICAgVGhlIG1heGltdW0gYXZhaWxhYmxlIHNpemUgZm9yIHRoZSBpbWFnZS4gVGhpcyBlbnN1cmVzIHdlIGRvbid0XG4gKiAgICAgICAgICAgdHJ5IHRvIGxvYWQgYW4gaW1hZ2UgbGFyZ2VyIHRoYW4gaXMgcG9zc2libGUuXG4gKiBcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbc2NhbGVdXG4gKiAgICAgICAgICAgQSBudW1iZXIgdG8gc2NhbGUgdGhlIGZpbmFsIGltYWdlIGRpbWVuc2lvbnMgYnkuIFxuICogICAgICAgICAgIE9ubHkgYXBwbGllcyB0byBsYXp5LWxvYWRlZCBpbWFnZXMuIERlZmF1bHRzIHRvIDEuXG4gKlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFtyb3VuZF1cbiAqICAgICAgICAgICBSb3VuZCBpbWFnZSBkaW1lbnNpb25zIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlLiBUaGlzIGlzIGludGVuZGVkIHRvXG4gKiAgICAgICAgICAgdGF4IHRoZSBpbWFnZSBzZXJ2ZXIgbGVzcyBieSBsb3dlcmluZyB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIGltYWdlXG4gKiAgICAgICAgICAgc2l6ZXMgcmVxdWVzdGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7U2l6ZX0gW3BsYWNlaG9sZGVyXVxuICogICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBsby1maSBpbWFnZSB0byBsb2FkIGJlZm9yZSB0aGUgZnVsbCBpbWFnZS5cbiAqIFxuICogQHByb3BlcnR5IHtTdHJpbmd9IFtjcm9wXVxuICogICAgICAgICAgIENyb3AgdmFsdWU7IG51bGwgaWYgaW1hZ2UgaXMgdW5jcm9wcGVkLCBvdGhlcndpc2UgZXF1YWwgXG4gKiAgICAgICAgICAgdG8gdGhlIFNob3BpZnkgY3JvcCBwYXJhbWV0ZXIgKCdjZW50ZXInLCAndG9wJywgZXRjLikuXG4gKi9cblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSByZXNwb25zaXZlIGltYWdlIGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8Tm9kZUxpc3R9IHNlbGVjdG9yXG4gKiAgICAgICAgVGhlIENTUyBzZWxlY3RvciwgZWxlbWVudCwgb3IgZWxlbWVudHMgdG8gdHJhY2sgZm9yIGxhenktbG9hZGluZy5cbiAqXG4gKiBAcGFyYW0ge1NldHRpbmdzfSBvcHRpb25zXG4gKlxuICogQHJldHVybnMge1B1YmxpY0FwaX1cbiAqL1xuXG5cbmZ1bmN0aW9uIHJpbWcoKSB7XG4gIHZhciBzZWxlY3RvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ1tkYXRhLXJpbWc9XCJsYXp5XCJdJztcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9OyAvLyBJbnRlcnNlY3Rpb25zXG5cbiAgdmFyIGlvID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nIHx8IGVudHJ5LmludGVyc2VjdGlvblJhdGlvID4gMCkge1xuICAgICAgICBpby51bm9ic2VydmUoZW50cnkudGFyZ2V0KTtcbiAgICAgICAgbG9hZChlbnRyeS50YXJnZXQsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCB7XG4gICAgLy8gV2F0Y2ggdGhlIHZpZXdwb3J0LCB3aXRoIDIwJSB2ZXJ0aWNhbCBtYXJnaW5zXG4gICAgcm9vdE1hcmdpbjogJzIwJSAwcHgnXG4gIH0pO1xuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gUHVibGljQXBpXG4gICAqL1xuXG4gIHZhciBhcGkgPSB7XG4gICAgLyoqXG4gICAgICogVHJhY2sgYSBuZXcgc2VsZWN0b3IsIGVsZW1lbnQsIG9yIG5vZGVsaXN0IGZvciBsYXp5LWxvYWRpbmcuXG4gICAgICogQHR5cGUgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxOb2RlTGlzdH0gc2VsZWN0b3JcbiAgICAgKi9cbiAgICB0cmFjazogZnVuY3Rpb24gdHJhY2soKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdbZGF0YS1yaW1nPVwibGF6eVwiXSc7XG4gICAgICB2YXIgZWxzID0gcXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIElmIGFuIGVsZW1lbnQgaXMgYWxyZWFkeSBpbiB0aGUgdmlld3BvcnQsIGxvYWQgaXQgcmlnaHQgYXdheS4gVGhpc1xuICAgICAgICAvLyBmaXhlcyBhIHJhY2UtY29uZGl0aW9uIHdpdGggZHluYW1pY2FsbHkgYWRkZWQgZWxlbWVudHMuXG4gICAgICAgIGlmIChpblZpZXdwb3J0KGVsc1tpXSkpIHtcbiAgICAgICAgICBsb2FkKGVsc1tpXSwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW8ub2JzZXJ2ZShlbHNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBlbGVtZW50KHMpIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gbG9hZGVkIHRvIGZvcmNlIHRoZWlyIGltYWdlc1xuICAgICAqIHRvIGJlIHJlY2FsY3VsYXRlZC5cbiAgICAgKiBAdHlwZSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fE5vZGVMaXN0fSBzZWxlY3RvclxuICAgICAqL1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlJDEoKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdbZGF0YS1yaW1nPVwibG9hZGVkXCJdJztcbiAgICAgIHZhciBlbHMgPSBxdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdXBkYXRlKGVsc1tpXSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgdHJhY2tpbmcgZWxlbWVudChzKSBmb3IgbGF6eS1sb2FkaW5nLlxuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8Tm9kZUxpc3R9IHNlbGVjdG9yXG4gICAgICovXG4gICAgdW50cmFjazogZnVuY3Rpb24gdW50cmFjaygpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ1tkYXRhLXJpbWddJztcbiAgICAgIHZhciBlbHMgPSBxdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW8udW5vYnNlcnZlKGVsc1tpXSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1hbnVhbGx5IGxvYWQgaW1hZ2VzLlxuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8Tm9kZUxpc3R9IHNlbGVjdG9yXG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24gbG9hZCQxKCkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnW2RhdGEtcmltZ10nO1xuICAgICAgdmFyIGVscyA9IHF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsb2FkKGVsc1tpXSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVubG9hZCBhbGwgZXZlbnQgaGFuZGxlcnMgYW5kIG9ic2VydmVycy5cbiAgICAgKiBAdHlwZSBGdW5jdGlvblxuICAgICAqL1xuICAgIHVubG9hZDogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgaW8uZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgfTsgLy8gQWRkIGluaXRpYWwgZWxlbWVudHNcblxuICBhcGkudHJhY2soc2VsZWN0b3IpO1xuICByZXR1cm4gYXBpO1xufVxuLyoqXG4gKiBGaW5kcyBhIGdyb3VwIG9mIGVsZW1lbnRzIG9uIHRoZSBwYWdlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fE5vZGVMaXN0fSBzZWxlY3RvclxuICogQHJldHVybnMge09iamVjdH0gQW4gYXJyYXktbGlrZSBvYmplY3QuXG4gKi9cblxuXG5mdW5jdGlvbiBxdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9XG5cbiAgaWYgKHNlbGVjdG9yIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICByZXR1cm4gW3NlbGVjdG9yXTtcbiAgfVxuXG4gIGlmIChzZWxlY3RvciBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9XG5cbiAgcmV0dXJuIFtdO1xufVxuXG4vKipcbiAqIFBvbHlmaWxsIGZvciBFbGVtZW50Lm1hdGNoZXMoKS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L21hdGNoZXNcbiAqL1xuaWYgKCFFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzKSB7XG4gIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMgPSBFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUubW96TWF0Y2hlc1NlbGVjdG9yIHx8IEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yIHx8IEVsZW1lbnQucHJvdG90eXBlLm9NYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIG1hdGNoZXMgPSAodGhpcy5kb2N1bWVudCB8fCB0aGlzLm93bmVyRG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwocyksXG4gICAgICAgIGkgPSBtYXRjaGVzLmxlbmd0aDtcblxuICAgIHdoaWxlICgtLWkgPj0gMCAmJiBtYXRjaGVzLml0ZW0oaSkgIT09IHRoaXMpIHt9XG5cbiAgICByZXR1cm4gaSA+IC0xO1xuICB9O1xufVxuXG52YXIgc3RhdGUgPSB7XG4gIGluaXQ6IGluaXQsXG4gIHdhdGNoOiB3YXRjaCxcbiAgdW53YXRjaDogdW53YXRjaCxcbiAgbG9hZDogbG9hZCQxXG59O1xuXG5mdW5jdGlvbiBpbml0KCkge1xuICB2YXIgc2VsZWN0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdbZGF0YS1yaW1nPVwibGF6eVwiXSc7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgc3RhdGUuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgc3RhdGUuaW5zdGFuY2UgPSByaW1nKHNlbGVjdG9yLCBvcHRpb25zKTtcbiAgc3RhdGUubG9hZGVkV2lkdGggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApOyAvLyBMaXN0ZW4gZm9yIFNob3BpZnkgdGhlbWUgZWRpdG9yIGV2ZW50c1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpsb2FkJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIHdhdGNoKGV2ZW50LnRhcmdldCk7XG4gIH0pO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfdXBkYXRlKCk7XG4gIH0pO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246dW5sb2FkJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIHVud2F0Y2goZXZlbnQudGFyZ2V0KTtcbiAgfSk7IC8vIExpc3RlbiBmb3IgY3VzdG9tIGV2ZW50cyB0byBhbGxvdyB0aGVtZXMgdG8gaG9vayBpbnRvIHJpbWdcblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0aGVtZTpyaW1nOndhdGNoJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIHdhdGNoKGV2ZW50LnRhcmdldCk7XG4gIH0pO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0aGVtZTpyaW1nOnVud2F0Y2gnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gdW53YXRjaChldmVudC50YXJnZXQpO1xuICB9KTsgLy8gU3VwcG9ydCBjdXN0b20gZXZlbnRzIHRyaWdnZXJlZCB0aHJvdWdoIGpRdWVyeVxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L2lzc3Vlcy8zMzQ3XG5cbiAgaWYgKHdpbmRvdy5qUXVlcnkpIHtcbiAgICBqUXVlcnkoZG9jdW1lbnQpLm9uKHtcbiAgICAgICd0aGVtZTpyaW1nOndhdGNoJzogZnVuY3Rpb24gdGhlbWVSaW1nV2F0Y2goZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIHdhdGNoKGV2ZW50LnRhcmdldCk7XG4gICAgICB9LFxuICAgICAgJ3RoZW1lOnJpbWc6dW53YXRjaCc6IGZ1bmN0aW9uIHRoZW1lUmltZ1Vud2F0Y2goZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIHVud2F0Y2goZXZlbnQudGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuLyoqXG4gKiBUcmFjayBhbiBlbGVtZW50LCBhbmQgaXRzIGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKi9cblxuXG5mdW5jdGlvbiB3YXRjaChlbCkge1xuICAvLyBUcmFjayBlbGVtZW50XG4gIGlmICh0eXBlb2YgZWwubWF0Y2hlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBlbC5tYXRjaGVzKHN0YXRlLnNlbGVjdG9yKSkge1xuICAgIHN0YXRlLmluc3RhbmNlLnRyYWNrKGVsKTtcbiAgfSAvLyBUcmFjayBlbGVtZW50J3MgY2hpbGRyZW5cblxuXG4gIHN0YXRlLmluc3RhbmNlLnRyYWNrKGVsLnF1ZXJ5U2VsZWN0b3JBbGwoc3RhdGUuc2VsZWN0b3IpKTtcbn1cbi8qKlxuICogVW50cmFjayBhbiBlbGVtZW50LCBhbmQgaXRzIGNoaWxkcmVuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqIEBwcml2YXRlXG4gKi9cblxuXG5mdW5jdGlvbiB1bndhdGNoKGVsKSB7XG4gIC8vIFVudHJhY2sgZWxlbWVudCdzIGNoaWxkcmVuXG4gIHN0YXRlLmluc3RhbmNlLnVudHJhY2soZWwucXVlcnlTZWxlY3RvckFsbChzdGF0ZS5zZWxlY3RvcikpOyAvLyBVbnRyYWNrIGVsZW1lbnRcblxuICBpZiAodHlwZW9mIGVsLm1hdGNoZXMgPT09ICdmdW5jdGlvbicgJiYgZWwubWF0Y2hlcyhzdGF0ZS5zZWxlY3RvcikpIHtcbiAgICBzdGF0ZS5pbnN0YW5jZS51bnRyYWNrKGVsKTtcbiAgfVxufVxuLyoqXG4gKiBNYW51YWxseSBsb2FkIGFuIGltYWdlXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqL1xuXG5cbmZ1bmN0aW9uIGxvYWQkMShlbCkge1xuICAvLyBMb2FkIGVsZW1lbnRcbiAgaWYgKHR5cGVvZiBlbC5tYXRjaGVzID09PSAnZnVuY3Rpb24nICYmIGVsLm1hdGNoZXMoc3RhdGUuc2VsZWN0b3IpKSB7XG4gICAgc3RhdGUuaW5zdGFuY2UubG9hZChlbCk7XG4gIH0gLy8gTG9hZCBlbGVtZW50J3MgY2hpbGRyZW5cblxuXG4gIHN0YXRlLmluc3RhbmNlLmxvYWQoZWwucXVlcnlTZWxlY3RvckFsbChzdGF0ZS5zZWxlY3RvcikpO1xufVxuLyoqXG4gKiBVcGRhdGUgYW4gZWxlbWVudCwgYW5kIGl0cyBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICovXG5cblxuZnVuY3Rpb24gX3VwZGF0ZSgpIHtcbiAgdmFyIGN1cnJlbnRXaWR0aCA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7IC8vIFJldHVybiBpZiB3ZSdyZSBub3QgMnggc21hbGxlciwgb3IgbGFyZ2VyIHRoYW4gdGhlIGV4aXN0aW5nIGxvYWRpbmcgc2l6ZVxuXG4gIGlmIChjdXJyZW50V2lkdGggLyBzdGF0ZS5sb2FkZWRXaWR0aCA+IDAuNSAmJiBjdXJyZW50V2lkdGggLyBzdGF0ZS5sb2FkZWRXaWR0aCA8IDIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdGF0ZS5sb2FkZWRXaWR0aCA9IGN1cnJlbnRXaWR0aDtcbiAgc3RhdGUuaW5zdGFuY2UudXBkYXRlKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0YXRlO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\n")},
vendor: 23,983 bytes, line 1
1"./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n  /*!\n   * @pixelunion/shopify-asyncview v2.0.5\n   * (c) 2020 Pixel Union\n  */\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    });\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(n);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n  return arr2;\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar deferred = {};\n\nvar AsyncView = /*#__PURE__*/function () {\n  function AsyncView() {\n    _classCallCheck(this, AsyncView);\n  }\n\n  _createClass(AsyncView, null, [{\n    key: \"load\",\n\n    /**\n     * Load the template given by the provided URL into the provided\n     * view\n     *\n     * @param {string} url - The url to load\n     * @param {object} query - An object containing additional query parameters of the URL\n     * @param {string} query.view - A required query parameter indicating which view to load\n     * @param {object} [options] - Config options\n     * @param {string} [options.hash] - A hash of the current page content\n     */\n    value: function load(url) {\n      var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n      if (!('view' in query)) {\n        return Promise.reject(new Error('\\'view\\' not found in \\'query\\' parameter'));\n      }\n\n      var querylessUrl = url.replace(/\\?[^#]+/, '');\n      var queryParamsString = new RegExp(/.+\\?([^#]+)/).exec(url);\n      var queryParams = query;\n\n      if (queryParamsString && queryParamsString.length >= 2) {\n        queryParamsString[1].split('&').forEach(function (param) {\n          var _param$split = param.split('='),\n              _param$split2 = _slicedToArray(_param$split, 2),\n              key = _param$split2[0],\n              value = _param$split2[1];\n\n          queryParams[key] = value;\n        });\n      } // NOTE: We're adding an additional timestamp to the query.\n      // This is to prevent certain browsers from returning cached\n      // versions of the url we are requesting.\n      // See this PR for more info: https://github.com/pixelunion/shopify-asyncview/pull/4\n\n\n      var cachebustingParams = _objectSpread2({}, queryParams, {\n        _: new Date().getTime()\n      });\n\n      var hashUrl = querylessUrl.replace(/([^#]+)(.*)/, function (match, address, hash) {\n        return \"\".concat(address, \"?\").concat(Object.keys(queryParams).sort().map(function (key) {\n          return \"\".concat(key, \"=\").concat(encodeURIComponent(queryParams[key]));\n        }).join('&')).concat(hash);\n      });\n      var requestUrl = querylessUrl.replace(/([^#]+)(.*)/, function (match, address, hash) {\n        return \"\".concat(address, \"?\").concat(Object.keys(cachebustingParams).sort().map(function (key) {\n          return \"\".concat(key, \"=\").concat(encodeURIComponent(cachebustingParams[key]));\n        }).join('&')).concat(hash);\n      });\n      var promise = new Promise(function (resolve, reject) {\n        var data;\n\n        if (hashUrl in deferred) {\n          resolve(deferred[hashUrl]);\n          return;\n        }\n\n        deferred[hashUrl] = promise;\n\n        if (options.hash) {\n          data = sessionStorage.getItem(hashUrl);\n\n          if (data) {\n            var deserialized = JSON.parse(data);\n\n            if (options.hash === deserialized.options.hash) {\n              delete deferred[hashUrl];\n              resolve(deserialized);\n              return;\n            }\n          }\n        }\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', requestUrl, true);\n\n        xhr.onload = function () {\n          var el = xhr.response;\n          var newOptions = {};\n          var optionsEl = el.querySelector('[data-options]');\n\n          if (optionsEl && optionsEl.innerHTML) {\n            newOptions = JSON.parse(el.querySelector('[data-options]').innerHTML);\n          }\n\n          var htmlEls = el.querySelectorAll('[data-html]');\n          var newHtml = {};\n\n          if (htmlEls.length === 1 && htmlEls[0].getAttribute('data-html') === '') {\n            newHtml = htmlEls[0].innerHTML;\n          } else {\n            for (var i = 0; i < htmlEls.length; i++) {\n              newHtml[htmlEls[i].getAttribute('data-html')] = htmlEls[i].innerHTML;\n            }\n          }\n\n          var dataEls = el.querySelectorAll('[data-data]');\n          var newData = {};\n\n          if (dataEls.length === 1 && dataEls[0].getAttribute('data-data') === '') {\n            newData = JSON.parse(dataEls[0].innerHTML);\n          } else {\n            for (var _i = 0; _i < dataEls.length; _i++) {\n              newData[dataEls[_i].getAttribute('data-data')] = JSON.parse(dataEls[_i].innerHTML);\n            }\n          }\n\n          if (options.hash) {\n            try {\n              sessionStorage.setItem(hashUrl, JSON.stringify({\n                options: newOptions,\n                data: newData,\n                html: newHtml\n              }));\n            } catch (error) {\n              console.error(error);\n            }\n          }\n\n          delete deferred[hashUrl];\n          resolve({\n            data: newData,\n            html: newHtml\n          });\n        };\n\n        xhr.onerror = function () {\n          delete deferred[hashUrl];\n          reject();\n        };\n\n        xhr.responseType = 'document';\n        xhr.send();\n      });\n      return promise;\n    }\n  }]);\n\n  return AsyncView;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AsyncView);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vbm9kZV9tb2R1bGVzL0BwaXhlbHVuaW9uL3Nob3BpZnktYXN5bmN2aWV3L2Rpc3QvaW5kZXguZXMuanM/MzAwZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcbiAgLyohXG4gICAqIEBwaXhlbHVuaW9uL3Nob3BpZnktYXN5bmN2aWV3IHYyLjAuNVxuICAgKiAoYykgMjAyMCBQaXhlbCBVbmlvblxuICAqL1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obik7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldO1xuXG4gIHJldHVybiBhcnIyO1xufVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuXG52YXIgZGVmZXJyZWQgPSB7fTtcblxudmFyIEFzeW5jVmlldyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFzeW5jVmlldygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXN5bmNWaWV3KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBc3luY1ZpZXcsIG51bGwsIFt7XG4gICAga2V5OiBcImxvYWRcIixcblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIHRlbXBsYXRlIGdpdmVuIGJ5IHRoZSBwcm92aWRlZCBVUkwgaW50byB0aGUgcHJvdmlkZWRcbiAgICAgKiB2aWV3XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHVybCB0byBsb2FkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHF1ZXJ5IC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzIG9mIHRoZSBVUkxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkudmlldyAtIEEgcmVxdWlyZWQgcXVlcnkgcGFyYW1ldGVyIGluZGljYXRpbmcgd2hpY2ggdmlldyB0byBsb2FkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIENvbmZpZyBvcHRpb25zXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmhhc2hdIC0gQSBoYXNoIG9mIHRoZSBjdXJyZW50IHBhZ2UgY29udGVudFxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCkge1xuICAgICAgdmFyIHF1ZXJ5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgICAgaWYgKCEoJ3ZpZXcnIGluIHF1ZXJ5KSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdcXCd2aWV3XFwnIG5vdCBmb3VuZCBpbiBcXCdxdWVyeVxcJyBwYXJhbWV0ZXInKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBxdWVyeWxlc3NVcmwgPSB1cmwucmVwbGFjZSgvXFw/W14jXSsvLCAnJyk7XG4gICAgICB2YXIgcXVlcnlQYXJhbXNTdHJpbmcgPSBuZXcgUmVnRXhwKC8uK1xcPyhbXiNdKykvKS5leGVjKHVybCk7XG4gICAgICB2YXIgcXVlcnlQYXJhbXMgPSBxdWVyeTtcblxuICAgICAgaWYgKHF1ZXJ5UGFyYW1zU3RyaW5nICYmIHF1ZXJ5UGFyYW1zU3RyaW5nLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zU3RyaW5nWzFdLnNwbGl0KCcmJykuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgICAgICB2YXIgX3BhcmFtJHNwbGl0ID0gcGFyYW0uc3BsaXQoJz0nKSxcbiAgICAgICAgICAgICAgX3BhcmFtJHNwbGl0MiA9IF9zbGljZWRUb0FycmF5KF9wYXJhbSRzcGxpdCwgMiksXG4gICAgICAgICAgICAgIGtleSA9IF9wYXJhbSRzcGxpdDJbMF0sXG4gICAgICAgICAgICAgIHZhbHVlID0gX3BhcmFtJHNwbGl0MlsxXTtcblxuICAgICAgICAgIHF1ZXJ5UGFyYW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9IC8vIE5PVEU6IFdlJ3JlIGFkZGluZyBhbiBhZGRpdGlvbmFsIHRpbWVzdGFtcCB0byB0aGUgcXVlcnkuXG4gICAgICAvLyBUaGlzIGlzIHRvIHByZXZlbnQgY2VydGFpbiBicm93c2VycyBmcm9tIHJldHVybmluZyBjYWNoZWRcbiAgICAgIC8vIHZlcnNpb25zIG9mIHRoZSB1cmwgd2UgYXJlIHJlcXVlc3RpbmcuXG4gICAgICAvLyBTZWUgdGhpcyBQUiBmb3IgbW9yZSBpbmZvOiBodHRwczovL2dpdGh1Yi5jb20vcGl4ZWx1bmlvbi9zaG9waWZ5LWFzeW5jdmlldy9wdWxsLzRcblxuXG4gICAgICB2YXIgY2FjaGVidXN0aW5nUGFyYW1zID0gX29iamVjdFNwcmVhZDIoe30sIHF1ZXJ5UGFyYW1zLCB7XG4gICAgICAgIF86IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICB9KTtcblxuICAgICAgdmFyIGhhc2hVcmwgPSBxdWVyeWxlc3NVcmwucmVwbGFjZSgvKFteI10rKSguKikvLCBmdW5jdGlvbiAobWF0Y2gsIGFkZHJlc3MsIGhhc2gpIHtcbiAgICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KGFkZHJlc3MsIFwiP1wiKS5jb25jYXQoT2JqZWN0LmtleXMocXVlcnlQYXJhbXMpLnNvcnQoKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChrZXksIFwiPVwiKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5UGFyYW1zW2tleV0pKTtcbiAgICAgICAgfSkuam9pbignJicpKS5jb25jYXQoaGFzaCk7XG4gICAgICB9KTtcbiAgICAgIHZhciByZXF1ZXN0VXJsID0gcXVlcnlsZXNzVXJsLnJlcGxhY2UoLyhbXiNdKykoLiopLywgZnVuY3Rpb24gKG1hdGNoLCBhZGRyZXNzLCBoYXNoKSB7XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChhZGRyZXNzLCBcIj9cIikuY29uY2F0KE9iamVjdC5rZXlzKGNhY2hlYnVzdGluZ1BhcmFtcykuc29ydCgpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KGtleSwgXCI9XCIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQoY2FjaGVidXN0aW5nUGFyYW1zW2tleV0pKTtcbiAgICAgICAgfSkuam9pbignJicpKS5jb25jYXQoaGFzaCk7XG4gICAgICB9KTtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZGF0YTtcblxuICAgICAgICBpZiAoaGFzaFVybCBpbiBkZWZlcnJlZCkge1xuICAgICAgICAgIHJlc29sdmUoZGVmZXJyZWRbaGFzaFVybF0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmVycmVkW2hhc2hVcmxdID0gcHJvbWlzZTtcblxuICAgICAgICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgICAgICAgZGF0YSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGFzaFVybCk7XG5cbiAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZCA9IEpTT04ucGFyc2UoZGF0YSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmhhc2ggPT09IGRlc2VyaWFsaXplZC5vcHRpb25zLmhhc2gpIHtcbiAgICAgICAgICAgICAgZGVsZXRlIGRlZmVycmVkW2hhc2hVcmxdO1xuICAgICAgICAgICAgICByZXNvbHZlKGRlc2VyaWFsaXplZCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKCdHRVQnLCByZXF1ZXN0VXJsLCB0cnVlKTtcblxuICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBlbCA9IHhoci5yZXNwb25zZTtcbiAgICAgICAgICB2YXIgbmV3T3B0aW9ucyA9IHt9O1xuICAgICAgICAgIHZhciBvcHRpb25zRWwgPSBlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1vcHRpb25zXScpO1xuXG4gICAgICAgICAgaWYgKG9wdGlvbnNFbCAmJiBvcHRpb25zRWwuaW5uZXJIVE1MKSB7XG4gICAgICAgICAgICBuZXdPcHRpb25zID0gSlNPTi5wYXJzZShlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1vcHRpb25zXScpLmlubmVySFRNTCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGh0bWxFbHMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1odG1sXScpO1xuICAgICAgICAgIHZhciBuZXdIdG1sID0ge307XG5cbiAgICAgICAgICBpZiAoaHRtbEVscy5sZW5ndGggPT09IDEgJiYgaHRtbEVsc1swXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaHRtbCcpID09PSAnJykge1xuICAgICAgICAgICAgbmV3SHRtbCA9IGh0bWxFbHNbMF0uaW5uZXJIVE1MO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bWxFbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgbmV3SHRtbFtodG1sRWxzW2ldLmdldEF0dHJpYnV0ZSgnZGF0YS1odG1sJyldID0gaHRtbEVsc1tpXS5pbm5lckhUTUw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGRhdGFFbHMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1kYXRhXScpO1xuICAgICAgICAgIHZhciBuZXdEYXRhID0ge307XG5cbiAgICAgICAgICBpZiAoZGF0YUVscy5sZW5ndGggPT09IDEgJiYgZGF0YUVsc1swXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGF0YScpID09PSAnJykge1xuICAgICAgICAgICAgbmV3RGF0YSA9IEpTT04ucGFyc2UoZGF0YUVsc1swXS5pbm5lckhUTUwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZGF0YUVscy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgbmV3RGF0YVtkYXRhRWxzW19pXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGF0YScpXSA9IEpTT04ucGFyc2UoZGF0YUVsc1tfaV0uaW5uZXJIVE1MKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhhc2hVcmwsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBuZXdPcHRpb25zLFxuICAgICAgICAgICAgICAgIGRhdGE6IG5ld0RhdGEsXG4gICAgICAgICAgICAgICAgaHRtbDogbmV3SHRtbFxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWxldGUgZGVmZXJyZWRbaGFzaFVybF07XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBkYXRhOiBuZXdEYXRhLFxuICAgICAgICAgICAgaHRtbDogbmV3SHRtbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGRlbGV0ZSBkZWZlcnJlZFtoYXNoVXJsXTtcbiAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgfTtcblxuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2RvY3VtZW50JztcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEFzeW5jVmlldztcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgQXN5bmNWaWV3O1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\n")},
vendor: 38,398 bytes, line 1
1"./node_modules/@pixelunion/shopify-sections-manager/dist/shopify-sections-manager.es.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n/*!\n * @pixelunion/shopify-sections-manager v1.1.0\n * (c) 2021 Pixel Union\n */\n\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    });\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\n/**\n * Allows a callback to be run once, when a target intersects the viewport.\n * @constructor\n * @param {Object} [options] options with which to construct the IntersectionObserver\n * @param {string} [options.rootMargin='30%'] A string which specifies a set of offsets to add to\n *                                          the root's bounding_box when calculating intersections.\n * @param {number} [options.threshold=0] Ratio of intersection required to trigger callback\n */\nvar LazyLoader = /*#__PURE__*/function () {\n  function LazyLoader(options) {\n    _classCallCheck(this, LazyLoader);\n\n    var defaultOptions = {\n      rootMargin: '30%',\n      threshold: 0\n    };\n    this.callbacks = new WeakMap();\n    this._observerCallback = this._observerCallback.bind(this);\n    this.observer = new IntersectionObserver(this._observerCallback, _objectSpread2(_objectSpread2({}, defaultOptions), options));\n  }\n  /**\n   * Add target and callback. Callback is only run once.\n   * @add\n   * @param {HTMLElement} target Target element\n   * @param {function} callback Callback to run when target begins intersecting\n   */\n\n\n  _createClass(LazyLoader, [{\n    key: \"add\",\n    value: function add(target, callback) {\n      this.callbacks.set(target, callback);\n      this.observer.observe(target);\n    }\n    /**\n     * Remove target. Associated callback is also removed.\n     * @remove\n     * @param {HTMLElement} target Target element\n     */\n\n  }, {\n    key: \"remove\",\n    value: function remove(target) {\n      this.observer.unobserve(target);\n      this.callbacks[\"delete\"](target);\n    }\n    /**\n     * Disconnects IntersectionObserver if active\n     * @unload\n     */\n\n  }, {\n    key: \"unload\",\n    value: function unload() {\n      this.observer.disconnect();\n    }\n    /**\n     * Runs associated callbacks for each entry, then removes that entry and callback\n     * @_observerCallback\n     * @param {IntersectionObserverEntry[]} entries Entries to check\n     * @param {InterserctionObserver} observer IntersectionObserver instance\n     */\n\n  }, {\n    key: \"_observerCallback\",\n    value: function _observerCallback(entries, observer) {\n      var _this = this;\n\n      entries.forEach(function (_ref) {\n        var isIntersecting = _ref.isIntersecting,\n            target = _ref.target;\n\n        // do nothing unless target moved into state of intersection\n        if (isIntersecting === true) {\n          // make sure we stop observing before running the callback, so we don't\n          // somehow run the callback twice if element intersects twice quickly\n          observer.unobserve(target);\n\n          var callback = _this.callbacks.get(target);\n\n          if (typeof callback === 'function') {\n            callback();\n          }\n\n          _this.callbacks[\"delete\"](target);\n        }\n      });\n    }\n  }]);\n\n  return LazyLoader;\n}();\n\nfunction triggerInstanceEvent(instance, eventName) {\n  if (instance && instance[eventName]) {\n    for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n      args[_key - 2] = arguments[_key];\n    }\n\n    instance[eventName].apply(instance, args);\n  }\n}\n\nfunction loadData(el) {\n  var dataEl = el.querySelector('[data-section-data]');\n  if (!dataEl) return {}; // Load data from attribute, or innerHTML\n\n  var data = dataEl.getAttribute('data-section-data') || dataEl.innerHTML;\n\n  try {\n    return JSON.parse(data);\n  } catch (error) {\n    console.warn(\"Sections: invalid section data found. \".concat(error.message));\n    return {};\n  }\n}\n\nvar ShopifySectionsManager = /*#__PURE__*/function () {\n  function ShopifySectionsManager() {\n    _classCallCheck(this, ShopifySectionsManager);\n\n    this.handlers = {};\n    this.instances = {};\n    this.options = {};\n    this.lazyLoader = null;\n    this._onSectionEvent = this._onSectionEvent.bind(this);\n    document.addEventListener('shopify:section:load', this._onSectionEvent);\n    document.addEventListener('shopify:section:unload', this._onSectionEvent);\n    document.addEventListener('shopify:section:select', this._onSectionEvent);\n    document.addEventListener('shopify:section:deselect', this._onSectionEvent);\n    document.addEventListener('shopify:section:reorder', this._onSectionEvent);\n    document.addEventListener('shopify:block:select', this._onSectionEvent);\n    document.addEventListener('shopify:block:deselect', this._onSectionEvent);\n  }\n  /**\n   * Stop listening for section events, and unbind all handlers.\n   */\n\n\n  _createClass(ShopifySectionsManager, [{\n    key: \"unbind\",\n    value: function unbind() {\n      document.removeEventListener('shopify:section:load', this._onSectionEvent);\n      document.removeEventListener('shopify:section:unload', this._onSectionEvent);\n      document.removeEventListener('shopify:section:select', this._onSectionEvent);\n      document.removeEventListener('shopify:section:deselect', this._onSectionEvent);\n      document.removeEventListener('shopify:section:reorder', this._onSectionEvent);\n      document.removeEventListener('shopify:block:select', this._onSectionEvent);\n      document.removeEventListener('shopify:block:deselect', this._onSectionEvent); // Unload all instances\n\n      for (var i = 0; i < this.instances.length; i++) {\n        triggerInstanceEvent(this.instances[i], 'onSectionUnload');\n      }\n\n      this.handlers = {};\n      this.options = {};\n      this.lazyLoader.unload();\n      this.lazyLoader = null;\n      this.instances = {};\n    }\n    /**\n     * Register a section handler.\n     *\n     * @param {string} type\n     *        The section type to handle. The handler will be called for all\n     *        sections with this type.\n     *\n     * @param {function} handler\n     *        The handler function is passed information about a specific section\n     *        instance. The handler is expected to return an object that will be\n     *        associated with the section instance.\n     *\n     *        Section handlers are passed an object with the following parameters:\n     *          {string} id\n     *          An ID that maps to a specific section instance. Typically the\n     *          section's filename for static sections, or a generated ID for\n     *          dynamic sections.\n     *\n     *          {string} type\n     *          The section type, as supplied when registered.\n     *\n     *          {Element} el\n     *          The root DOM element for the section instance.\n     *\n     *          {Object} data\n     *          Data loaded from the section script element. Defaults to an\n     *          empty object.\n     *\n     *          {Function} postMessage\n     *          A function that can be called to pass messages between sections.\n     *          The function should be called with a message \"name\", and\n     *          optionally some data.\n     *\n     * @param {object} options\n     *\n     * @param {boolean} options.lazy\n     *     If true, sections will only be initialized after they intersect the viewport + 30% margin\n     */\n\n  }, {\n    key: \"register\",\n    value: function register(type, handler) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n      if (this.handlers[type]) {\n        console.warn(\"Sections: section handler already exists of type '\".concat(type, \"'.\"));\n      } // Store the section handler\n\n\n      this.handlers[type] = handler; // Store options\n\n      this.options[type] = options; // Init sections for this type\n\n      this._initSections(type);\n    }\n    /**\n     * Initialize sections already on the page.\n     */\n\n  }, {\n    key: \"_initSections\",\n    value: function _initSections(type) {\n      var _this = this;\n\n      // Fetch all existing sections of our type on the page\n      var dataEls = document.querySelectorAll(\"[data-section-type=\\\"\".concat(type, \"\\\"]\"));\n      if (!dataEls) return; // Create an instance for each section\n\n      var _loop = function _loop(i) {\n        var dataEl = dataEls[i];\n        var el = dataEl.parentNode; // Get instance ID\n\n        var idEl = el.querySelector('[data-section-id]');\n\n        if (!idEl) {\n          console.warn(\"Sections: unable to find section id for '\".concat(type, \"'.\"), el);\n          return {\n            v: void 0\n          };\n        }\n\n        var sectionId = idEl.getAttribute('data-section-id');\n\n        if (!sectionId) {\n          console.warn(\"Sections: unable to find section id for '\".concat(type, \"'.\"), el);\n          return {\n            v: void 0\n          };\n        }\n\n        if (_this.options[type] && _this.options[type].lazy) {\n          if (_this.lazyLoader === null) {\n            _this.lazyLoader = new LazyLoader();\n          }\n\n          _this.lazyLoader.add(el, function () {\n            return _this._createInstance(sectionId, el);\n          });\n        } else {\n          _this._createInstance(sectionId, el);\n        }\n      };\n\n      for (var i = 0; i < dataEls.length; i++) {\n        var _ret = _loop(i);\n\n        if (_typeof(_ret) === \"object\") return _ret.v;\n      }\n    }\n  }, {\n    key: \"_onSectionEvent\",\n    value: function _onSectionEvent(event) {\n      var el = event.target;\n      var _event$detail = event.detail,\n          sectionId = _event$detail.sectionId,\n          blockId = _event$detail.blockId;\n      var instance = this.instances[sectionId];\n\n      switch (event.type) {\n        case 'shopify:section:load':\n          this._createInstance(sectionId, el);\n\n          break;\n\n        case 'shopify:section:unload':\n          triggerInstanceEvent(instance, 'onSectionUnload', {\n            el: el,\n            id: sectionId\n          });\n\n          if (this.lazyLoader) {\n            this.lazyLoader.remove(el);\n          }\n\n          delete this.instances[sectionId];\n          break;\n\n        case 'shopify:section:select':\n          triggerInstanceEvent(instance, 'onSectionSelect', {\n            el: el,\n            id: sectionId\n          });\n          break;\n\n        case 'shopify:section:deselect':\n          triggerInstanceEvent(instance, 'onSectionDeselect', {\n            el: el,\n            id: sectionId\n          });\n          break;\n\n        case 'shopify:section:reorder':\n          triggerInstanceEvent(instance, 'onSectionReorder', {\n            el: el,\n            id: sectionId\n          });\n          break;\n\n        case 'shopify:block:select':\n          triggerInstanceEvent(instance, 'onSectionBlockSelect', {\n            el: el,\n            id: blockId\n          });\n          break;\n\n        case 'shopify:block:deselect':\n          triggerInstanceEvent(instance, 'onSectionBlockDeselect', {\n            el: el,\n            id: blockId\n          });\n          break;\n      }\n    }\n  }, {\n    key: \"_postMessage\",\n    value: function _postMessage(name, data) {\n      var _this2 = this;\n\n      Object.keys(this.instances).forEach(function (id) {\n        triggerInstanceEvent(_this2.instances[id], 'onSectionMessage', name, data);\n      });\n    }\n  }, {\n    key: \"_createInstance\",\n    value: function _createInstance(id, el) {\n      var typeEl = el.querySelector('[data-section-type]');\n      if (!typeEl) return;\n      var type = typeEl.getAttribute('data-section-type');\n      if (!type) return;\n      var handler = this.handlers[type];\n\n      if (!handler) {\n        console.warn(\"Sections: unable to find section handler for type '\".concat(type, \"'.\"));\n        return;\n      }\n\n      var data = loadData(el);\n\n      var postMessage = this._postMessage.bind(this);\n\n      this.instances[id] = handler({\n        id: id,\n        type: type,\n        el: el,\n        data: data,\n        postMessage: postMessage\n      });\n    }\n  }]);\n\n  return ShopifySectionsManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ShopifySectionsManager);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1zZWN0aW9ucy1tYW5hZ2VyL2Rpc3Qvc2hvcGlmeS1zZWN0aW9ucy1tYW5hZ2VyLmVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcGFyYWxsYXgvLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1zZWN0aW9ucy1tYW5hZ2VyL2Rpc3Qvc2hvcGlmeS1zZWN0aW9ucy1tYW5hZ2VyLmVzLmpzPzBkZjciXSwic291cmNlc0NvbnRlbnQiOlsiXG4vKiFcbiAqIEBwaXhlbHVuaW9uL3Nob3BpZnktc2VjdGlvbnMtbWFuYWdlciB2MS4xLjBcbiAqIChjKSAyMDIxIFBpeGVsIFVuaW9uXG4gKi9cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyoqXG4gKiBBbGxvd3MgYSBjYWxsYmFjayB0byBiZSBydW4gb25jZSwgd2hlbiBhIHRhcmdldCBpbnRlcnNlY3RzIHRoZSB2aWV3cG9ydC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBvcHRpb25zIHdpdGggd2hpY2ggdG8gY29uc3RydWN0IHRoZSBJbnRlcnNlY3Rpb25PYnNlcnZlclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnJvb3RNYXJnaW49JzMwJSddIEEgc3RyaW5nIHdoaWNoIHNwZWNpZmllcyBhIHNldCBvZiBvZmZzZXRzIHRvIGFkZCB0b1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcm9vdCdzIGJvdW5kaW5nX2JveCB3aGVuIGNhbGN1bGF0aW5nIGludGVyc2VjdGlvbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGhyZXNob2xkPTBdIFJhdGlvIG9mIGludGVyc2VjdGlvbiByZXF1aXJlZCB0byB0cmlnZ2VyIGNhbGxiYWNrXG4gKi9cbnZhciBMYXp5TG9hZGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTGF6eUxvYWRlcihvcHRpb25zKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExhenlMb2FkZXIpO1xuXG4gICAgdmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgcm9vdE1hcmdpbjogJzMwJScsXG4gICAgICB0aHJlc2hvbGQ6IDBcbiAgICB9O1xuICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IFdlYWtNYXAoKTtcbiAgICB0aGlzLl9vYnNlcnZlckNhbGxiYWNrID0gdGhpcy5fb2JzZXJ2ZXJDYWxsYmFjay5iaW5kKHRoaXMpO1xuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIodGhpcy5fb2JzZXJ2ZXJDYWxsYmFjaywgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGRlZmF1bHRPcHRpb25zKSwgb3B0aW9ucykpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgdGFyZ2V0IGFuZCBjYWxsYmFjay4gQ2FsbGJhY2sgaXMgb25seSBydW4gb25jZS5cbiAgICogQGFkZFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0YXJnZXQgVGFyZ2V0IGVsZW1lbnRcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuIHdoZW4gdGFyZ2V0IGJlZ2lucyBpbnRlcnNlY3RpbmdcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoTGF6eUxvYWRlciwgW3tcbiAgICBrZXk6IFwiYWRkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZCh0YXJnZXQsIGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrcy5zZXQodGFyZ2V0LCBjYWxsYmFjayk7XG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGFyZ2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRhcmdldC4gQXNzb2NpYXRlZCBjYWxsYmFjayBpcyBhbHNvIHJlbW92ZWQuXG4gICAgICogQHJlbW92ZVxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRhcmdldCBUYXJnZXQgZWxlbWVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZSh0YXJnZXQpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIudW5vYnNlcnZlKHRhcmdldCk7XG4gICAgICB0aGlzLmNhbGxiYWNrc1tcImRlbGV0ZVwiXSh0YXJnZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyBJbnRlcnNlY3Rpb25PYnNlcnZlciBpZiBhY3RpdmVcbiAgICAgKiBAdW5sb2FkXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bmxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJ1bnMgYXNzb2NpYXRlZCBjYWxsYmFja3MgZm9yIGVhY2ggZW50cnksIHRoZW4gcmVtb3ZlcyB0aGF0IGVudHJ5IGFuZCBjYWxsYmFja1xuICAgICAqIEBfb2JzZXJ2ZXJDYWxsYmFja1xuICAgICAqIEBwYXJhbSB7SW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeVtdfSBlbnRyaWVzIEVudHJpZXMgdG8gY2hlY2tcbiAgICAgKiBAcGFyYW0ge0ludGVyc2VyY3Rpb25PYnNlcnZlcn0gb2JzZXJ2ZXIgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgaW5zdGFuY2VcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIl9vYnNlcnZlckNhbGxiYWNrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vYnNlcnZlckNhbGxiYWNrKGVudHJpZXMsIG9ic2VydmVyKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIGlzSW50ZXJzZWN0aW5nID0gX3JlZi5pc0ludGVyc2VjdGluZyxcbiAgICAgICAgICAgIHRhcmdldCA9IF9yZWYudGFyZ2V0O1xuXG4gICAgICAgIC8vIGRvIG5vdGhpbmcgdW5sZXNzIHRhcmdldCBtb3ZlZCBpbnRvIHN0YXRlIG9mIGludGVyc2VjdGlvblxuICAgICAgICBpZiAoaXNJbnRlcnNlY3RpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgd2Ugc3RvcCBvYnNlcnZpbmcgYmVmb3JlIHJ1bm5pbmcgdGhlIGNhbGxiYWNrLCBzbyB3ZSBkb24ndFxuICAgICAgICAgIC8vIHNvbWVob3cgcnVuIHRoZSBjYWxsYmFjayB0d2ljZSBpZiBlbGVtZW50IGludGVyc2VjdHMgdHdpY2UgcXVpY2tseVxuICAgICAgICAgIG9ic2VydmVyLnVub2JzZXJ2ZSh0YXJnZXQpO1xuXG4gICAgICAgICAgdmFyIGNhbGxiYWNrID0gX3RoaXMuY2FsbGJhY2tzLmdldCh0YXJnZXQpO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpcy5jYWxsYmFja3NbXCJkZWxldGVcIl0odGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExhenlMb2FkZXI7XG59KCk7XG5cbmZ1bmN0aW9uIHRyaWdnZXJJbnN0YW5jZUV2ZW50KGluc3RhbmNlLCBldmVudE5hbWUpIHtcbiAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlW2V2ZW50TmFtZV0pIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMiA/IF9sZW4gLSAyIDogMCksIF9rZXkgPSAyOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZVtldmVudE5hbWVdLmFwcGx5KGluc3RhbmNlLCBhcmdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2FkRGF0YShlbCkge1xuICB2YXIgZGF0YUVsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2VjdGlvbi1kYXRhXScpO1xuICBpZiAoIWRhdGFFbCkgcmV0dXJuIHt9OyAvLyBMb2FkIGRhdGEgZnJvbSBhdHRyaWJ1dGUsIG9yIGlubmVySFRNTFxuXG4gIHZhciBkYXRhID0gZGF0YUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zZWN0aW9uLWRhdGEnKSB8fCBkYXRhRWwuaW5uZXJIVE1MO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKFwiU2VjdGlvbnM6IGludmFsaWQgc2VjdGlvbiBkYXRhIGZvdW5kLiBcIi5jb25jYXQoZXJyb3IubWVzc2FnZSkpO1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG52YXIgU2hvcGlmeVNlY3Rpb25zTWFuYWdlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNob3BpZnlTZWN0aW9uc01hbmFnZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNob3BpZnlTZWN0aW9uc01hbmFnZXIpO1xuXG4gICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuaW5zdGFuY2VzID0ge307XG4gICAgdGhpcy5vcHRpb25zID0ge307XG4gICAgdGhpcy5sYXp5TG9hZGVyID0gbnVsbDtcbiAgICB0aGlzLl9vblNlY3Rpb25FdmVudCA9IHRoaXMuX29uU2VjdGlvbkV2ZW50LmJpbmQodGhpcyk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOmxvYWQnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOnVubG9hZCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246c2VsZWN0JywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpkZXNlbGVjdCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246cmVvcmRlcicsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OmJsb2NrOnNlbGVjdCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OmJsb2NrOmRlc2VsZWN0JywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICB9XG4gIC8qKlxuICAgKiBTdG9wIGxpc3RlbmluZyBmb3Igc2VjdGlvbiBldmVudHMsIGFuZCB1bmJpbmQgYWxsIGhhbmRsZXJzLlxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhTaG9waWZ5U2VjdGlvbnNNYW5hZ2VyLCBbe1xuICAgIGtleTogXCJ1bmJpbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5iaW5kKCkge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOmxvYWQnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246dW5sb2FkJywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOnNlbGVjdCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpkZXNlbGVjdCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpyZW9yZGVyJywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpibG9jazpzZWxlY3QnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzaG9waWZ5OmJsb2NrOmRlc2VsZWN0JywgdGhpcy5fb25TZWN0aW9uRXZlbnQpOyAvLyBVbmxvYWQgYWxsIGluc3RhbmNlc1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyaWdnZXJJbnN0YW5jZUV2ZW50KHRoaXMuaW5zdGFuY2VzW2ldLCAnb25TZWN0aW9uVW5sb2FkJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlcnMgPSB7fTtcbiAgICAgIHRoaXMub3B0aW9ucyA9IHt9O1xuICAgICAgdGhpcy5sYXp5TG9hZGVyLnVubG9hZCgpO1xuICAgICAgdGhpcy5sYXp5TG9hZGVyID0gbnVsbDtcbiAgICAgIHRoaXMuaW5zdGFuY2VzID0ge307XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgc2VjdGlvbiBoYW5kbGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICAgKiAgICAgICAgVGhlIHNlY3Rpb24gdHlwZSB0byBoYW5kbGUuIFRoZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIGZvciBhbGxcbiAgICAgKiAgICAgICAgc2VjdGlvbnMgd2l0aCB0aGlzIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBoYW5kbGVyXG4gICAgICogICAgICAgIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIGlzIHBhc3NlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIHNlY3Rpb25cbiAgICAgKiAgICAgICAgaW5zdGFuY2UuIFRoZSBoYW5kbGVyIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhbiBvYmplY3QgdGhhdCB3aWxsIGJlXG4gICAgICogICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VjdGlvbiBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqICAgICAgICBTZWN0aW9uIGhhbmRsZXJzIGFyZSBwYXNzZWQgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICAgICAqICAgICAgICAgIHtzdHJpbmd9IGlkXG4gICAgICogICAgICAgICAgQW4gSUQgdGhhdCBtYXBzIHRvIGEgc3BlY2lmaWMgc2VjdGlvbiBpbnN0YW5jZS4gVHlwaWNhbGx5IHRoZVxuICAgICAqICAgICAgICAgIHNlY3Rpb24ncyBmaWxlbmFtZSBmb3Igc3RhdGljIHNlY3Rpb25zLCBvciBhIGdlbmVyYXRlZCBJRCBmb3JcbiAgICAgKiAgICAgICAgICBkeW5hbWljIHNlY3Rpb25zLlxuICAgICAqXG4gICAgICogICAgICAgICAge3N0cmluZ30gdHlwZVxuICAgICAqICAgICAgICAgIFRoZSBzZWN0aW9uIHR5cGUsIGFzIHN1cHBsaWVkIHdoZW4gcmVnaXN0ZXJlZC5cbiAgICAgKlxuICAgICAqICAgICAgICAgIHtFbGVtZW50fSBlbFxuICAgICAqICAgICAgICAgIFRoZSByb290IERPTSBlbGVtZW50IGZvciB0aGUgc2VjdGlvbiBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqICAgICAgICAgIHtPYmplY3R9IGRhdGFcbiAgICAgKiAgICAgICAgICBEYXRhIGxvYWRlZCBmcm9tIHRoZSBzZWN0aW9uIHNjcmlwdCBlbGVtZW50LiBEZWZhdWx0cyB0byBhblxuICAgICAqICAgICAgICAgIGVtcHR5IG9iamVjdC5cbiAgICAgKlxuICAgICAqICAgICAgICAgIHtGdW5jdGlvbn0gcG9zdE1lc3NhZ2VcbiAgICAgKiAgICAgICAgICBBIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCB0byBwYXNzIG1lc3NhZ2VzIGJldHdlZW4gc2VjdGlvbnMuXG4gICAgICogICAgICAgICAgVGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBhIG1lc3NhZ2UgXCJuYW1lXCIsIGFuZFxuICAgICAqICAgICAgICAgIG9wdGlvbmFsbHkgc29tZSBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5sYXp5XG4gICAgICogICAgIElmIHRydWUsIHNlY3Rpb25zIHdpbGwgb25seSBiZSBpbml0aWFsaXplZCBhZnRlciB0aGV5IGludGVyc2VjdCB0aGUgdmlld3BvcnQgKyAzMCUgbWFyZ2luXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZWdpc3RlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWdpc3Rlcih0eXBlLCBoYW5kbGVyKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICAgIGlmICh0aGlzLmhhbmRsZXJzW3R5cGVdKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIlNlY3Rpb25zOiBzZWN0aW9uIGhhbmRsZXIgYWxyZWFkeSBleGlzdHMgb2YgdHlwZSAnXCIuY29uY2F0KHR5cGUsIFwiJy5cIikpO1xuICAgICAgfSAvLyBTdG9yZSB0aGUgc2VjdGlvbiBoYW5kbGVyXG5cblxuICAgICAgdGhpcy5oYW5kbGVyc1t0eXBlXSA9IGhhbmRsZXI7IC8vIFN0b3JlIG9wdGlvbnNcblxuICAgICAgdGhpcy5vcHRpb25zW3R5cGVdID0gb3B0aW9uczsgLy8gSW5pdCBzZWN0aW9ucyBmb3IgdGhpcyB0eXBlXG5cbiAgICAgIHRoaXMuX2luaXRTZWN0aW9ucyh0eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBzZWN0aW9ucyBhbHJlYWR5IG9uIHRoZSBwYWdlLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiX2luaXRTZWN0aW9uc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaW5pdFNlY3Rpb25zKHR5cGUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIC8vIEZldGNoIGFsbCBleGlzdGluZyBzZWN0aW9ucyBvZiBvdXIgdHlwZSBvbiB0aGUgcGFnZVxuICAgICAgdmFyIGRhdGFFbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtc2VjdGlvbi10eXBlPVxcXCJcIi5jb25jYXQodHlwZSwgXCJcXFwiXVwiKSk7XG4gICAgICBpZiAoIWRhdGFFbHMpIHJldHVybjsgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIGZvciBlYWNoIHNlY3Rpb25cblxuICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoaSkge1xuICAgICAgICB2YXIgZGF0YUVsID0gZGF0YUVsc1tpXTtcbiAgICAgICAgdmFyIGVsID0gZGF0YUVsLnBhcmVudE5vZGU7IC8vIEdldCBpbnN0YW5jZSBJRFxuXG4gICAgICAgIHZhciBpZEVsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2VjdGlvbi1pZF0nKTtcblxuICAgICAgICBpZiAoIWlkRWwpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJTZWN0aW9uczogdW5hYmxlIHRvIGZpbmQgc2VjdGlvbiBpZCBmb3IgJ1wiLmNvbmNhdCh0eXBlLCBcIicuXCIpLCBlbCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHY6IHZvaWQgMFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2VjdGlvbklkID0gaWRFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2VjdGlvbi1pZCcpO1xuXG4gICAgICAgIGlmICghc2VjdGlvbklkKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiU2VjdGlvbnM6IHVuYWJsZSB0byBmaW5kIHNlY3Rpb24gaWQgZm9yICdcIi5jb25jYXQodHlwZSwgXCInLlwiKSwgZWwpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2OiB2b2lkIDBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF90aGlzLm9wdGlvbnNbdHlwZV0gJiYgX3RoaXMub3B0aW9uc1t0eXBlXS5sYXp5KSB7XG4gICAgICAgICAgaWYgKF90aGlzLmxhenlMb2FkZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIF90aGlzLmxhenlMb2FkZXIgPSBuZXcgTGF6eUxvYWRlcigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzLmxhenlMb2FkZXIuYWRkKGVsLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX2NyZWF0ZUluc3RhbmNlKHNlY3Rpb25JZCwgZWwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzLl9jcmVhdGVJbnN0YW5jZShzZWN0aW9uSWQsIGVsKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhRWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBfcmV0ID0gX2xvb3AoaSk7XG5cbiAgICAgICAgaWYgKF90eXBlb2YoX3JldCkgPT09IFwib2JqZWN0XCIpIHJldHVybiBfcmV0LnY7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblNlY3Rpb25FdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25TZWN0aW9uRXZlbnQoZXZlbnQpIHtcbiAgICAgIHZhciBlbCA9IGV2ZW50LnRhcmdldDtcbiAgICAgIHZhciBfZXZlbnQkZGV0YWlsID0gZXZlbnQuZGV0YWlsLFxuICAgICAgICAgIHNlY3Rpb25JZCA9IF9ldmVudCRkZXRhaWwuc2VjdGlvbklkLFxuICAgICAgICAgIGJsb2NrSWQgPSBfZXZlbnQkZGV0YWlsLmJsb2NrSWQ7XG4gICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlc1tzZWN0aW9uSWRdO1xuXG4gICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnc2hvcGlmeTpzZWN0aW9uOmxvYWQnOlxuICAgICAgICAgIHRoaXMuX2NyZWF0ZUluc3RhbmNlKHNlY3Rpb25JZCwgZWwpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2hvcGlmeTpzZWN0aW9uOnVubG9hZCc6XG4gICAgICAgICAgdHJpZ2dlckluc3RhbmNlRXZlbnQoaW5zdGFuY2UsICdvblNlY3Rpb25VbmxvYWQnLCB7XG4gICAgICAgICAgICBlbDogZWwsXG4gICAgICAgICAgICBpZDogc2VjdGlvbklkXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAodGhpcy5sYXp5TG9hZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmxhenlMb2FkZXIucmVtb3ZlKGVsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWxldGUgdGhpcy5pbnN0YW5jZXNbc2VjdGlvbklkXTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzaG9waWZ5OnNlY3Rpb246c2VsZWN0JzpcbiAgICAgICAgICB0cmlnZ2VySW5zdGFuY2VFdmVudChpbnN0YW5jZSwgJ29uU2VjdGlvblNlbGVjdCcsIHtcbiAgICAgICAgICAgIGVsOiBlbCxcbiAgICAgICAgICAgIGlkOiBzZWN0aW9uSWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzaG9waWZ5OnNlY3Rpb246ZGVzZWxlY3QnOlxuICAgICAgICAgIHRyaWdnZXJJbnN0YW5jZUV2ZW50KGluc3RhbmNlLCAnb25TZWN0aW9uRGVzZWxlY3QnLCB7XG4gICAgICAgICAgICBlbDogZWwsXG4gICAgICAgICAgICBpZDogc2VjdGlvbklkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2hvcGlmeTpzZWN0aW9uOnJlb3JkZXInOlxuICAgICAgICAgIHRyaWdnZXJJbnN0YW5jZUV2ZW50KGluc3RhbmNlLCAnb25TZWN0aW9uUmVvcmRlcicsIHtcbiAgICAgICAgICAgIGVsOiBlbCxcbiAgICAgICAgICAgIGlkOiBzZWN0aW9uSWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzaG9waWZ5OmJsb2NrOnNlbGVjdCc6XG4gICAgICAgICAgdHJpZ2dlckluc3RhbmNlRXZlbnQoaW5zdGFuY2UsICdvblNlY3Rpb25CbG9ja1NlbGVjdCcsIHtcbiAgICAgICAgICAgIGVsOiBlbCxcbiAgICAgICAgICAgIGlkOiBibG9ja0lkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2hvcGlmeTpibG9jazpkZXNlbGVjdCc6XG4gICAgICAgICAgdHJpZ2dlckluc3RhbmNlRXZlbnQoaW5zdGFuY2UsICdvblNlY3Rpb25CbG9ja0Rlc2VsZWN0Jywge1xuICAgICAgICAgICAgZWw6IGVsLFxuICAgICAgICAgICAgaWQ6IGJsb2NrSWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3Bvc3RNZXNzYWdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9wb3N0TWVzc2FnZShuYW1lLCBkYXRhKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgT2JqZWN0LmtleXModGhpcy5pbnN0YW5jZXMpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHRyaWdnZXJJbnN0YW5jZUV2ZW50KF90aGlzMi5pbnN0YW5jZXNbaWRdLCAnb25TZWN0aW9uTWVzc2FnZScsIG5hbWUsIGRhdGEpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9jcmVhdGVJbnN0YW5jZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY3JlYXRlSW5zdGFuY2UoaWQsIGVsKSB7XG4gICAgICB2YXIgdHlwZUVsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2VjdGlvbi10eXBlXScpO1xuICAgICAgaWYgKCF0eXBlRWwpIHJldHVybjtcbiAgICAgIHZhciB0eXBlID0gdHlwZUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zZWN0aW9uLXR5cGUnKTtcbiAgICAgIGlmICghdHlwZSkgcmV0dXJuO1xuICAgICAgdmFyIGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzW3R5cGVdO1xuXG4gICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiU2VjdGlvbnM6IHVuYWJsZSB0byBmaW5kIHNlY3Rpb24gaGFuZGxlciBmb3IgdHlwZSAnXCIuY29uY2F0KHR5cGUsIFwiJy5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBkYXRhID0gbG9hZERhdGEoZWwpO1xuXG4gICAgICB2YXIgcG9zdE1lc3NhZ2UgPSB0aGlzLl9wb3N0TWVzc2FnZS5iaW5kKHRoaXMpO1xuXG4gICAgICB0aGlzLmluc3RhbmNlc1tpZF0gPSBoYW5kbGVyKHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBlbDogZWwsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIHBvc3RNZXNzYWdlOiBwb3N0TWVzc2FnZVxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNob3BpZnlTZWN0aW9uc01hbmFnZXI7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFNob3BpZnlTZWN0aW9uc01hbmFnZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/shopify-sections-manager/dist/shopify-sections-manager.es.js\n")},
vendor: 36,763 bytes, line 1
1"./node_modules/@pixelunion/shopify-surface-pick-up/dist/index.es.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n  try {\n    var info = gen[key](arg);\n    var value = info.value;\n  } catch (error) {\n    reject(error);\n    return;\n  }\n\n  if (info.done) {\n    resolve(value);\n  } else {\n    Promise.resolve(value).then(_next, _throw);\n  }\n}\n\nfunction _asyncToGenerator(fn) {\n  return function () {\n    var self = this,\n        args = arguments;\n    return new Promise(function (resolve, reject) {\n      var gen = fn.apply(self, args);\n\n      function _next(value) {\n        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n      }\n\n      function _throw(err) {\n        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n      }\n\n      _next(undefined);\n    });\n  };\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    });\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\nvar LOCAL_STORAGE_KEY = 'pxu-shopify-surface-pick-up';\nvar loadingClass = 'surface-pick-up--loading';\n\nvar isNotExpired = function isNotExpired(timestamp) {\n  return timestamp + 1000 * 60 * 60 >= Date.now();\n};\n\nvar removeTrailingSlash = function removeTrailingSlash(s) {\n  return s.replace(/(.*)\\/$/, '$1');\n}; // Haversine Distance\n// The haversine formula is an equation giving great-circle distances between\n// two points on a sphere from their longitudes and latitudes\n\n\nfunction calculateDistance(latitude1, longitude1, latitude2, longitude2, unitSystem) {\n  var dtor = Math.PI / 180;\n  var radius = unitSystem === 'metric' ? 6378.14 : 3959;\n  var rlat1 = latitude1 * dtor;\n  var rlong1 = longitude1 * dtor;\n  var rlat2 = latitude2 * dtor;\n  var rlong2 = longitude2 * dtor;\n  var dlon = rlong1 - rlong2;\n  var dlat = rlat1 - rlat2;\n  var a = Math.pow(Math.sin(dlat / 2), 2) + Math.cos(rlat1) * Math.cos(rlat2) * Math.pow(Math.sin(dlon / 2), 2);\n  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n  return radius * c;\n}\n\nfunction getGeoLocation() {\n  return _getGeoLocation.apply(this, arguments);\n}\n\nfunction _getGeoLocation() {\n  _getGeoLocation = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n    return regeneratorRuntime.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            return _context.abrupt(\"return\", new Promise(function (resolve, reject) {\n              var options = {\n                maximumAge: 3600000,\n                // 1 hour\n                timeout: 5000\n              };\n\n              if (navigator.geolocation) {\n                navigator.geolocation.getCurrentPosition(function (_ref3) {\n                  var coords = _ref3.coords;\n                  return resolve(coords);\n                }, reject, options);\n              } else {\n                reject();\n              }\n            }));\n\n          case 1:\n          case \"end\":\n            return _context.stop();\n        }\n      }\n    }, _callee);\n  }));\n  return _getGeoLocation.apply(this, arguments);\n}\n\nfunction setLocation(_x) {\n  return _setLocation.apply(this, arguments);\n}\n\nfunction _setLocation() {\n  _setLocation = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(_ref) {\n    var latitude, longitude, newData;\n    return regeneratorRuntime.wrap(function _callee2$(_context2) {\n      while (1) {\n        switch (_context2.prev = _context2.next) {\n          case 0:\n            latitude = _ref.latitude, longitude = _ref.longitude;\n            newData = {\n              latitude: latitude,\n              longitude: longitude,\n              timestamp: Date.now()\n            };\n            localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(newData));\n            return _context2.abrupt(\"return\", fetch('/localization.json', {\n              method: 'PUT',\n              headers: {\n                'Content-Type': 'application/json'\n              },\n              body: JSON.stringify({\n                latitude: latitude,\n                longitude: longitude\n              })\n            }).then(function () {\n              return {\n                latitude: latitude,\n                longitude: longitude\n              };\n            }));\n\n          case 4:\n          case \"end\":\n            return _context2.stop();\n        }\n      }\n    }, _callee2);\n  }));\n  return _setLocation.apply(this, arguments);\n}\n\nfunction getLocation() {\n  return _getLocation.apply(this, arguments);\n}\n\nfunction _getLocation() {\n  _getLocation = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n    var requestLocation,\n        cachedLocation,\n        _args3 = arguments;\n    return regeneratorRuntime.wrap(function _callee3$(_context3) {\n      while (1) {\n        switch (_context3.prev = _context3.next) {\n          case 0:\n            requestLocation = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : false;\n            cachedLocation = JSON.parse(localStorage.getItem(LOCAL_STORAGE_KEY));\n\n            if (!(cachedLocation && isNotExpired(cachedLocation.timestamp))) {\n              _context3.next = 4;\n              break;\n            }\n\n            return _context3.abrupt(\"return\", cachedLocation);\n\n          case 4:\n            if (!requestLocation) {\n              _context3.next = 6;\n              break;\n            }\n\n            return _context3.abrupt(\"return\", getGeoLocation().then(function (coords) {\n              setLocation(coords); // We don't need to wait for this\n\n              return coords;\n            }));\n\n          case 6:\n            return _context3.abrupt(\"return\", null);\n\n          case 7:\n          case \"end\":\n            return _context3.stop();\n        }\n      }\n    }, _callee3);\n  }));\n  return _getLocation.apply(this, arguments);\n}\n\nvar SurfacePickUp = /*#__PURE__*/function () {\n  function SurfacePickUp(el, options) {\n    _classCallCheck(this, SurfacePickUp);\n\n    this.el = el;\n    this.options = _objectSpread2({\n      root_url: window.Theme && window.Theme.routes && window.Theme.routes.root_url || ''\n    }, options);\n    this.options.root_url = removeTrailingSlash(this.options.root_url);\n    this.callbacks = [];\n    this.onBtnPress = null;\n    this.latestVariantId = null;\n  }\n\n  _createClass(SurfacePickUp, [{\n    key: \"load\",\n    value: function load(variantId) {\n      var _this = this;\n\n      // If no variant is available, empty element and quick-return\n      if (!variantId) {\n        this.el.innerHTML = '';\n        return Promise.resolve(true);\n      } // Because Shopify doesn't expose any `pick_up_enabled` data on the shop object, we\n      // don't know if the variant might be, or is definitely not available for pick up.\n      // Until we know the shop has > 0 pick up locations, we want to avoid prompting the\n      // user for location data (it's annoying, and only makes sense to do if we use it).\n      //\n      // Instead, we have to make an initial request, check and see if any pick up locations\n      // were returned, then ask for the users location, then make another request to get the\n      // location-aware pick up locations.\n      //\n      // As far as I can tell the pick up aware locations differ only in sort order - which\n      // we could do on the front end - but we're following this approach to ensure future\n      // compatibility with any changes Shopify makes (maybe disabling options based on\n      // user location, or whatever else).\n      //\n      // Shopify has indicated they will look into adding pick_up_enabled data to the shop\n      // object, which which case this method can be greatly simplifed into 2 simple cases.\n\n\n      this.latestVariantId = variantId;\n      this.el.classList.add(loadingClass);\n      return this._getData(variantId).then(function (data) {\n        return _this._injectData(data);\n      });\n    }\n  }, {\n    key: \"onModalRequest\",\n    value: function onModalRequest(callback) {\n      if (this.callbacks.indexOf(callback) >= 0) return;\n      this.callbacks.push(callback);\n    }\n  }, {\n    key: \"offModalRequest\",\n    value: function offModalRequest(callback) {\n      this.callbacks.splice(this.callbacks.indexOf(callback));\n    }\n  }, {\n    key: \"unload\",\n    value: function unload() {\n      this.callbacks = [];\n      this.el.innerHTML = '';\n    }\n  }, {\n    key: \"_getData\",\n    value: function _getData(variantId) {\n      var _this2 = this;\n\n      return new Promise(function (resolve) {\n        var xhr = new XMLHttpRequest();\n        var requestUrl = \"\".concat(_this2.options.root_url, \"/variants/\").concat(variantId, \"/?section_id=surface-pick-up\");\n        xhr.open('GET', requestUrl, true);\n\n        xhr.onload = function () {\n          var el = xhr.response;\n          var embed = el.querySelector('[data-html=\"surface-pick-up-embed\"]');\n          var itemsContainer = el.querySelector('[data-html=\"surface-pick-up-items\"]');\n          var items = itemsContainer.content.querySelectorAll('[data-surface-pick-up-item]');\n          resolve({\n            embed: embed,\n            itemsContainer: itemsContainer,\n            items: items,\n            variantId: variantId\n          });\n        };\n\n        xhr.onerror = function () {\n          resolve({\n            embed: {\n              innerHTML: ''\n            },\n            itemsContainer: {\n              innerHTML: ''\n            },\n            items: [],\n            variantId: variantId\n          });\n        };\n\n        xhr.responseType = 'document';\n        xhr.send();\n      });\n    }\n  }, {\n    key: \"_injectData\",\n    value: function _injectData(_ref2) {\n      var _this3 = this;\n\n      var embed = _ref2.embed,\n          itemsContainer = _ref2.itemsContainer,\n          items = _ref2.items,\n          variantId = _ref2.variantId;\n\n      if (variantId !== this.latestVariantId || items.length === 0) {\n        this.el.innerHTML = '';\n        this.el.classList.remove(loadingClass);\n        return;\n      }\n\n      this.el.innerHTML = embed.innerHTML;\n      this.el.classList.remove(loadingClass);\n      var calculatedDistances = false;\n\n      var calculateDistances = function calculateDistances() {\n        if (calculatedDistances) return Promise.resolve();\n        return getLocation(true).then(function (coords) {\n          items.forEach(function (item) {\n            var distanceEl = item.querySelector('[data-distance]');\n            var distanceUnitEl = item.querySelector('[data-distance-unit]');\n            var unitSystem = distanceUnitEl.dataset.distanceUnit;\n            var itemLatitude = parseFloat(distanceEl.dataset.latitude);\n            var itemLongitude = parseFloat(distanceEl.dataset.longitude);\n\n            if (coords && isFinite(itemLatitude) && isFinite(itemLongitude)) {\n              var distance = calculateDistance(coords.latitude, coords.longitude, itemLatitude, itemLongitude, unitSystem);\n              distanceEl.innerHTML = distance.toFixed(1);\n            } else {\n              distanceEl.remove();\n              distanceUnitEl.remove();\n            }\n          });\n        })[\"catch\"](function (e) {\n          console.log(e);\n          items.forEach(function (item) {\n            var distanceEl = item.querySelector('[data-distance]');\n            var distanceUnitEl = item.querySelector('[data-distance-unit]');\n            distanceEl.remove();\n            distanceUnitEl.remove();\n          });\n        })[\"finally\"](function () {\n          calculatedDistances = true;\n        });\n      };\n\n      this.el.querySelector('[data-surface-pick-up-embed-modal-btn]').addEventListener('click', function () {\n        calculateDistances().then(function () {\n          return _this3.callbacks.forEach(function (callback) {\n            return callback(itemsContainer.innerHTML);\n          });\n        });\n      });\n    }\n  }]);\n\n  return SurfacePickUp;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SurfacePickUp);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1zdXJmYWNlLXBpY2stdXAvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vbm9kZV9tb2R1bGVzL0BwaXhlbHVuaW9uL3Nob3BpZnktc3VyZmFjZS1waWNrLXVwL2Rpc3QvaW5kZXguZXMuanM/N2FlOSJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpO1xuICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVqZWN0KGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaW5mby5kb25lKSB7XG4gICAgcmVzb2x2ZSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cbiAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH1cblxuICAgICAgX25leHQodW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxudmFyIExPQ0FMX1NUT1JBR0VfS0VZID0gJ3B4dS1zaG9waWZ5LXN1cmZhY2UtcGljay11cCc7XG52YXIgbG9hZGluZ0NsYXNzID0gJ3N1cmZhY2UtcGljay11cC0tbG9hZGluZyc7XG5cbnZhciBpc05vdEV4cGlyZWQgPSBmdW5jdGlvbiBpc05vdEV4cGlyZWQodGltZXN0YW1wKSB7XG4gIHJldHVybiB0aW1lc3RhbXAgKyAxMDAwICogNjAgKiA2MCA+PSBEYXRlLm5vdygpO1xufTtcblxudmFyIHJlbW92ZVRyYWlsaW5nU2xhc2ggPSBmdW5jdGlvbiByZW1vdmVUcmFpbGluZ1NsYXNoKHMpIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvKC4qKVxcLyQvLCAnJDEnKTtcbn07IC8vIEhhdmVyc2luZSBEaXN0YW5jZVxuLy8gVGhlIGhhdmVyc2luZSBmb3JtdWxhIGlzIGFuIGVxdWF0aW9uIGdpdmluZyBncmVhdC1jaXJjbGUgZGlzdGFuY2VzIGJldHdlZW5cbi8vIHR3byBwb2ludHMgb24gYSBzcGhlcmUgZnJvbSB0aGVpciBsb25naXR1ZGVzIGFuZCBsYXRpdHVkZXNcblxuXG5mdW5jdGlvbiBjYWxjdWxhdGVEaXN0YW5jZShsYXRpdHVkZTEsIGxvbmdpdHVkZTEsIGxhdGl0dWRlMiwgbG9uZ2l0dWRlMiwgdW5pdFN5c3RlbSkge1xuICB2YXIgZHRvciA9IE1hdGguUEkgLyAxODA7XG4gIHZhciByYWRpdXMgPSB1bml0U3lzdGVtID09PSAnbWV0cmljJyA/IDYzNzguMTQgOiAzOTU5O1xuICB2YXIgcmxhdDEgPSBsYXRpdHVkZTEgKiBkdG9yO1xuICB2YXIgcmxvbmcxID0gbG9uZ2l0dWRlMSAqIGR0b3I7XG4gIHZhciBybGF0MiA9IGxhdGl0dWRlMiAqIGR0b3I7XG4gIHZhciBybG9uZzIgPSBsb25naXR1ZGUyICogZHRvcjtcbiAgdmFyIGRsb24gPSBybG9uZzEgLSBybG9uZzI7XG4gIHZhciBkbGF0ID0gcmxhdDEgLSBybGF0MjtcbiAgdmFyIGEgPSBNYXRoLnBvdyhNYXRoLnNpbihkbGF0IC8gMiksIDIpICsgTWF0aC5jb3MocmxhdDEpICogTWF0aC5jb3MocmxhdDIpICogTWF0aC5wb3coTWF0aC5zaW4oZGxvbiAvIDIpLCAyKTtcbiAgdmFyIGMgPSAyICogTWF0aC5hdGFuMihNYXRoLnNxcnQoYSksIE1hdGguc3FydCgxIC0gYSkpO1xuICByZXR1cm4gcmFkaXVzICogYztcbn1cblxuZnVuY3Rpb24gZ2V0R2VvTG9jYXRpb24oKSB7XG4gIHJldHVybiBfZ2V0R2VvTG9jYXRpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2dldEdlb0xvY2F0aW9uKCkge1xuICBfZ2V0R2VvTG9jYXRpb24gPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIG1heGltdW1BZ2U6IDM2MDAwMDAsXG4gICAgICAgICAgICAgICAgLy8gMSBob3VyXG4gICAgICAgICAgICAgICAgdGltZW91dDogNTAwMFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IuZ2VvbG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICAgICAgICAgICAgdmFyIGNvb3JkcyA9IF9yZWYzLmNvb3JkcztcbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGNvb3Jkcyk7XG4gICAgICAgICAgICAgICAgfSwgcmVqZWN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlKTtcbiAgfSkpO1xuICByZXR1cm4gX2dldEdlb0xvY2F0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIHNldExvY2F0aW9uKF94KSB7XG4gIHJldHVybiBfc2V0TG9jYXRpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX3NldExvY2F0aW9uKCkge1xuICBfc2V0TG9jYXRpb24gPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKF9yZWYpIHtcbiAgICB2YXIgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgbmV3RGF0YTtcbiAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgbGF0aXR1ZGUgPSBfcmVmLmxhdGl0dWRlLCBsb25naXR1ZGUgPSBfcmVmLmxvbmdpdHVkZTtcbiAgICAgICAgICAgIG5ld0RhdGEgPSB7XG4gICAgICAgICAgICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICAgICAgICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExPQ0FMX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShuZXdEYXRhKSk7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCBmZXRjaCgnL2xvY2FsaXphdGlvbi5qc29uJywge1xuICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgbGF0aXR1ZGU6IGxhdGl0dWRlLFxuICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGVcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyKTtcbiAgfSkpO1xuICByZXR1cm4gX3NldExvY2F0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIGdldExvY2F0aW9uKCkge1xuICByZXR1cm4gX2dldExvY2F0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9nZXRMb2NhdGlvbigpIHtcbiAgX2dldExvY2F0aW9uID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMygpIHtcbiAgICB2YXIgcmVxdWVzdExvY2F0aW9uLFxuICAgICAgICBjYWNoZWRMb2NhdGlvbixcbiAgICAgICAgX2FyZ3MzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXF1ZXN0TG9jYXRpb24gPSBfYXJnczMubGVuZ3RoID4gMCAmJiBfYXJnczNbMF0gIT09IHVuZGVmaW5lZCA/IF9hcmdzM1swXSA6IGZhbHNlO1xuICAgICAgICAgICAgY2FjaGVkTG9jYXRpb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExPQ0FMX1NUT1JBR0VfS0VZKSk7XG5cbiAgICAgICAgICAgIGlmICghKGNhY2hlZExvY2F0aW9uICYmIGlzTm90RXhwaXJlZChjYWNoZWRMb2NhdGlvbi50aW1lc3RhbXApKSkge1xuICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdChcInJldHVyblwiLCBjYWNoZWRMb2NhdGlvbik7XG5cbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBpZiAoIXJlcXVlc3RMb2NhdGlvbikge1xuICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdChcInJldHVyblwiLCBnZXRHZW9Mb2NhdGlvbigpLnRoZW4oZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgICAgICAgICAgICBzZXRMb2NhdGlvbihjb29yZHMpOyAvLyBXZSBkb24ndCBuZWVkIHRvIHdhaXQgZm9yIHRoaXNcblxuICAgICAgICAgICAgICByZXR1cm4gY29vcmRzO1xuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoXCJyZXR1cm5cIiwgbnVsbCk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMyk7XG4gIH0pKTtcbiAgcmV0dXJuIF9nZXRMb2NhdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG52YXIgU3VyZmFjZVBpY2tVcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFN1cmZhY2VQaWNrVXAoZWwsIG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3VyZmFjZVBpY2tVcCk7XG5cbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5vcHRpb25zID0gX29iamVjdFNwcmVhZDIoe1xuICAgICAgcm9vdF91cmw6IHdpbmRvdy5UaGVtZSAmJiB3aW5kb3cuVGhlbWUucm91dGVzICYmIHdpbmRvdy5UaGVtZS5yb3V0ZXMucm9vdF91cmwgfHwgJydcbiAgICB9LCBvcHRpb25zKTtcbiAgICB0aGlzLm9wdGlvbnMucm9vdF91cmwgPSByZW1vdmVUcmFpbGluZ1NsYXNoKHRoaXMub3B0aW9ucy5yb290X3VybCk7XG4gICAgdGhpcy5jYWxsYmFja3MgPSBbXTtcbiAgICB0aGlzLm9uQnRuUHJlc3MgPSBudWxsO1xuICAgIHRoaXMubGF0ZXN0VmFyaWFudElkID0gbnVsbDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhTdXJmYWNlUGlja1VwLCBbe1xuICAgIGtleTogXCJsb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWQodmFyaWFudElkKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAvLyBJZiBubyB2YXJpYW50IGlzIGF2YWlsYWJsZSwgZW1wdHkgZWxlbWVudCBhbmQgcXVpY2stcmV0dXJuXG4gICAgICBpZiAoIXZhcmlhbnRJZCkge1xuICAgICAgICB0aGlzLmVsLmlubmVySFRNTCA9ICcnO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgICAgfSAvLyBCZWNhdXNlIFNob3BpZnkgZG9lc24ndCBleHBvc2UgYW55IGBwaWNrX3VwX2VuYWJsZWRgIGRhdGEgb24gdGhlIHNob3Agb2JqZWN0LCB3ZVxuICAgICAgLy8gZG9uJ3Qga25vdyBpZiB0aGUgdmFyaWFudCBtaWdodCBiZSwgb3IgaXMgZGVmaW5pdGVseSBub3QgYXZhaWxhYmxlIGZvciBwaWNrIHVwLlxuICAgICAgLy8gVW50aWwgd2Uga25vdyB0aGUgc2hvcCBoYXMgPiAwIHBpY2sgdXAgbG9jYXRpb25zLCB3ZSB3YW50IHRvIGF2b2lkIHByb21wdGluZyB0aGVcbiAgICAgIC8vIHVzZXIgZm9yIGxvY2F0aW9uIGRhdGEgKGl0J3MgYW5ub3lpbmcsIGFuZCBvbmx5IG1ha2VzIHNlbnNlIHRvIGRvIGlmIHdlIHVzZSBpdCkuXG4gICAgICAvL1xuICAgICAgLy8gSW5zdGVhZCwgd2UgaGF2ZSB0byBtYWtlIGFuIGluaXRpYWwgcmVxdWVzdCwgY2hlY2sgYW5kIHNlZSBpZiBhbnkgcGljayB1cCBsb2NhdGlvbnNcbiAgICAgIC8vIHdlcmUgcmV0dXJuZWQsIHRoZW4gYXNrIGZvciB0aGUgdXNlcnMgbG9jYXRpb24sIHRoZW4gbWFrZSBhbm90aGVyIHJlcXVlc3QgdG8gZ2V0IHRoZVxuICAgICAgLy8gbG9jYXRpb24tYXdhcmUgcGljayB1cCBsb2NhdGlvbnMuXG4gICAgICAvL1xuICAgICAgLy8gQXMgZmFyIGFzIEkgY2FuIHRlbGwgdGhlIHBpY2sgdXAgYXdhcmUgbG9jYXRpb25zIGRpZmZlciBvbmx5IGluIHNvcnQgb3JkZXIgLSB3aGljaFxuICAgICAgLy8gd2UgY291bGQgZG8gb24gdGhlIGZyb250IGVuZCAtIGJ1dCB3ZSdyZSBmb2xsb3dpbmcgdGhpcyBhcHByb2FjaCB0byBlbnN1cmUgZnV0dXJlXG4gICAgICAvLyBjb21wYXRpYmlsaXR5IHdpdGggYW55IGNoYW5nZXMgU2hvcGlmeSBtYWtlcyAobWF5YmUgZGlzYWJsaW5nIG9wdGlvbnMgYmFzZWQgb25cbiAgICAgIC8vIHVzZXIgbG9jYXRpb24sIG9yIHdoYXRldmVyIGVsc2UpLlxuICAgICAgLy9cbiAgICAgIC8vIFNob3BpZnkgaGFzIGluZGljYXRlZCB0aGV5IHdpbGwgbG9vayBpbnRvIGFkZGluZyBwaWNrX3VwX2VuYWJsZWQgZGF0YSB0byB0aGUgc2hvcFxuICAgICAgLy8gb2JqZWN0LCB3aGljaCB3aGljaCBjYXNlIHRoaXMgbWV0aG9kIGNhbiBiZSBncmVhdGx5IHNpbXBsaWZlZCBpbnRvIDIgc2ltcGxlIGNhc2VzLlxuXG5cbiAgICAgIHRoaXMubGF0ZXN0VmFyaWFudElkID0gdmFyaWFudElkO1xuICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKGxvYWRpbmdDbGFzcyk7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RGF0YSh2YXJpYW50SWQpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLl9pbmplY3REYXRhKGRhdGEpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uTW9kYWxSZXF1ZXN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uTW9kYWxSZXF1ZXN0KGNhbGxiYWNrKSB7XG4gICAgICBpZiAodGhpcy5jYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjaykgPj0gMCkgcmV0dXJuO1xuICAgICAgdGhpcy5jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9mZk1vZGFsUmVxdWVzdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvZmZNb2RhbFJlcXVlc3QoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuY2FsbGJhY2tzLnNwbGljZSh0aGlzLmNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVubG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bmxvYWQoKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrcyA9IFtdO1xuICAgICAgdGhpcy5lbC5pbm5lckhUTUwgPSAnJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2dldERhdGFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldERhdGEodmFyaWFudElkKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgdmFyIHJlcXVlc3RVcmwgPSBcIlwiLmNvbmNhdChfdGhpczIub3B0aW9ucy5yb290X3VybCwgXCIvdmFyaWFudHMvXCIpLmNvbmNhdCh2YXJpYW50SWQsIFwiLz9zZWN0aW9uX2lkPXN1cmZhY2UtcGljay11cFwiKTtcbiAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHJlcXVlc3RVcmwsIHRydWUpO1xuXG4gICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGVsID0geGhyLnJlc3BvbnNlO1xuICAgICAgICAgIHZhciBlbWJlZCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWh0bWw9XCJzdXJmYWNlLXBpY2stdXAtZW1iZWRcIl0nKTtcbiAgICAgICAgICB2YXIgaXRlbXNDb250YWluZXIgPSBlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1odG1sPVwic3VyZmFjZS1waWNrLXVwLWl0ZW1zXCJdJyk7XG4gICAgICAgICAgdmFyIGl0ZW1zID0gaXRlbXNDb250YWluZXIuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zdXJmYWNlLXBpY2stdXAtaXRlbV0nKTtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIGVtYmVkOiBlbWJlZCxcbiAgICAgICAgICAgIGl0ZW1zQ29udGFpbmVyOiBpdGVtc0NvbnRhaW5lcixcbiAgICAgICAgICAgIGl0ZW1zOiBpdGVtcyxcbiAgICAgICAgICAgIHZhcmlhbnRJZDogdmFyaWFudElkXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBlbWJlZDoge1xuICAgICAgICAgICAgICBpbm5lckhUTUw6ICcnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXRlbXNDb250YWluZXI6IHtcbiAgICAgICAgICAgICAgaW5uZXJIVE1MOiAnJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgIHZhcmlhbnRJZDogdmFyaWFudElkXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdkb2N1bWVudCc7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2luamVjdERhdGFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2luamVjdERhdGEoX3JlZjIpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgZW1iZWQgPSBfcmVmMi5lbWJlZCxcbiAgICAgICAgICBpdGVtc0NvbnRhaW5lciA9IF9yZWYyLml0ZW1zQ29udGFpbmVyLFxuICAgICAgICAgIGl0ZW1zID0gX3JlZjIuaXRlbXMsXG4gICAgICAgICAgdmFyaWFudElkID0gX3JlZjIudmFyaWFudElkO1xuXG4gICAgICBpZiAodmFyaWFudElkICE9PSB0aGlzLmxhdGVzdFZhcmlhbnRJZCB8fCBpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5lbC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKGxvYWRpbmdDbGFzcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbC5pbm5lckhUTUwgPSBlbWJlZC5pbm5lckhUTUw7XG4gICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUobG9hZGluZ0NsYXNzKTtcbiAgICAgIHZhciBjYWxjdWxhdGVkRGlzdGFuY2VzID0gZmFsc2U7XG5cbiAgICAgIHZhciBjYWxjdWxhdGVEaXN0YW5jZXMgPSBmdW5jdGlvbiBjYWxjdWxhdGVEaXN0YW5jZXMoKSB7XG4gICAgICAgIGlmIChjYWxjdWxhdGVkRGlzdGFuY2VzKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHJldHVybiBnZXRMb2NhdGlvbih0cnVlKS50aGVuKGZ1bmN0aW9uIChjb29yZHMpIHtcbiAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICB2YXIgZGlzdGFuY2VFbCA9IGl0ZW0ucXVlcnlTZWxlY3RvcignW2RhdGEtZGlzdGFuY2VdJyk7XG4gICAgICAgICAgICB2YXIgZGlzdGFuY2VVbml0RWwgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRpc3RhbmNlLXVuaXRdJyk7XG4gICAgICAgICAgICB2YXIgdW5pdFN5c3RlbSA9IGRpc3RhbmNlVW5pdEVsLmRhdGFzZXQuZGlzdGFuY2VVbml0O1xuICAgICAgICAgICAgdmFyIGl0ZW1MYXRpdHVkZSA9IHBhcnNlRmxvYXQoZGlzdGFuY2VFbC5kYXRhc2V0LmxhdGl0dWRlKTtcbiAgICAgICAgICAgIHZhciBpdGVtTG9uZ2l0dWRlID0gcGFyc2VGbG9hdChkaXN0YW5jZUVsLmRhdGFzZXQubG9uZ2l0dWRlKTtcblxuICAgICAgICAgICAgaWYgKGNvb3JkcyAmJiBpc0Zpbml0ZShpdGVtTGF0aXR1ZGUpICYmIGlzRmluaXRlKGl0ZW1Mb25naXR1ZGUpKSB7XG4gICAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IGNhbGN1bGF0ZURpc3RhbmNlKGNvb3Jkcy5sYXRpdHVkZSwgY29vcmRzLmxvbmdpdHVkZSwgaXRlbUxhdGl0dWRlLCBpdGVtTG9uZ2l0dWRlLCB1bml0U3lzdGVtKTtcbiAgICAgICAgICAgICAgZGlzdGFuY2VFbC5pbm5lckhUTUwgPSBkaXN0YW5jZS50b0ZpeGVkKDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGlzdGFuY2VFbC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgZGlzdGFuY2VVbml0RWwucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICB2YXIgZGlzdGFuY2VFbCA9IGl0ZW0ucXVlcnlTZWxlY3RvcignW2RhdGEtZGlzdGFuY2VdJyk7XG4gICAgICAgICAgICB2YXIgZGlzdGFuY2VVbml0RWwgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRpc3RhbmNlLXVuaXRdJyk7XG4gICAgICAgICAgICBkaXN0YW5jZUVsLnJlbW92ZSgpO1xuICAgICAgICAgICAgZGlzdGFuY2VVbml0RWwucmVtb3ZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiZmluYWxseVwiXShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY2FsY3VsYXRlZERpc3RhbmNlcyA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zdXJmYWNlLXBpY2stdXAtZW1iZWQtbW9kYWwtYnRuXScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxjdWxhdGVEaXN0YW5jZXMoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMzLmNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGl0ZW1zQ29udGFpbmVyLmlubmVySFRNTCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFN1cmZhY2VQaWNrVXA7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFN1cmZhY2VQaWNrVXA7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/shopify-surface-pick-up/dist/index.es.js\n")},
vendor: 10,911 bytes, line 1
1"./node_modules/@shopify/theme-addresses/theme-addresses.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"CountryProvinceSelector\": () => (/* binding */ CountryProvinceSelector)\n/* harmony export */ });\n/**\n * CountryProvinceSelector Constructor\n * @param {String} countryOptions the country options in html string\n */\nfunction CountryProvinceSelector(countryOptions) {\n  if (typeof countryOptions !== 'string') {\n    throw new TypeError(countryOptions + ' is not a string.');\n  }\n  this.countryOptions = countryOptions;\n}\n\n/**\n * Builds the country and province selector with the given node element\n * @param {Node} countryNodeElement The <select> element for country\n * @param {Node} provinceNodeElement The <select> element for province\n * @param {Object} options Additional settings available\n * @param {CountryProvinceSelector~onCountryChange} options.onCountryChange callback after a country `change` event\n * @param {CountryProvinceSelector~onProvinceChange} options.onProvinceChange callback after a province `change` event\n */\nCountryProvinceSelector.prototype.build = function (countryNodeElement, provinceNodeElement, options) {\n  if (typeof countryNodeElement !== 'object') {\n    throw new TypeError(countryNodeElement + ' is not a object.');\n  }\n\n  if (typeof provinceNodeElement !== 'object') {\n    throw new TypeError(provinceNodeElement + ' is not a object.');\n  }\n\n  var defaultValue = countryNodeElement.getAttribute('data-default');\n  options = options || {}\n\n  countryNodeElement.innerHTML = this.countryOptions;\n  countryNodeElement.value = defaultValue;\n\n  if (defaultValue && getOption(countryNodeElement, defaultValue)) {\n    var provinces = buildProvince(countryNodeElement, provinceNodeElement, defaultValue);\n    options.onCountryChange && options.onCountryChange(provinces, provinceNodeElement, countryNodeElement);\n  }\n\n  // Listen for value change on the country select\n  countryNodeElement.addEventListener('change', function (event) {\n    var target = event.target;\n    var selectedValue = target.value;\n    \n    var provinces = buildProvince(target, provinceNodeElement, selectedValue);\n    options.onCountryChange && options.onCountryChange(provinces, provinceNodeElement, countryNodeElement);\n  });\n\n  options.onProvinceChange && provinceNodeElement.addEventListener('change', options.onProvinceChange);\n}\n\n/**\n * This callback is called after a user interacted with a country `<select>`\n * @callback CountryProvinceSelector~onCountryChange\n * @param {array} provinces the parsed provinces\n * @param {Node} provinceNodeElement province `<select>` element\n * @param {Node} countryNodeElement country `<select>` element\n */\n\n /**\n * This callback is called after a user interacted with a province `<select>`\n * @callback CountryProvinceSelector~onProvinceChange\n * @param {Event} event the province selector `change` event object\n */\n\n/**\n * Returns the <option> with the specified value from the\n * given node element\n * A null is returned if no such <option> is found\n */\nfunction getOption(nodeElement, value) {\n  return nodeElement.querySelector('option[value=\"' + value +'\"]')\n}\n\n/**\n * Builds the options for province selector\n */\nfunction buildOptions (provinceNodeElement, provinces) {\n  var defaultValue = provinceNodeElement.getAttribute('data-default');\n\n  provinces.forEach(function (option) {\n    var optionElement = document.createElement('option');\n    optionElement.value = option[0];\n    optionElement.textContent = option[1];\n\n    provinceNodeElement.appendChild(optionElement);\n  })\n\n  if (defaultValue && getOption(provinceNodeElement, defaultValue)) {\n    provinceNodeElement.value = defaultValue;\n  }\n}\n\n/**\n * Builds the province selector\n */\nfunction buildProvince (countryNodeElement, provinceNodeElement, selectedValue) {\n  var selectedOption = getOption(countryNodeElement, selectedValue);\n  var provinces = JSON.parse(selectedOption.getAttribute('data-provinces'));\n\n  provinceNodeElement.options.length = 0;\n\n  if (provinces.length) {\n    buildOptions(provinceNodeElement, provinces)\n  }\n\n  return provinces;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHNob3BpZnkvdGhlbWUtYWRkcmVzc2VzL3RoZW1lLWFkZHJlc3Nlcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vbm9kZV9tb2R1bGVzL0BzaG9waWZ5L3RoZW1lLWFkZHJlc3Nlcy90aGVtZS1hZGRyZXNzZXMuanM/MTliNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvdW50cnlQcm92aW5jZVNlbGVjdG9yIENvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gY291bnRyeU9wdGlvbnMgdGhlIGNvdW50cnkgb3B0aW9ucyBpbiBodG1sIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ291bnRyeVByb3ZpbmNlU2VsZWN0b3IoY291bnRyeU9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBjb3VudHJ5T3B0aW9ucyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGNvdW50cnlPcHRpb25zICsgJyBpcyBub3QgYSBzdHJpbmcuJyk7XG4gIH1cbiAgdGhpcy5jb3VudHJ5T3B0aW9ucyA9IGNvdW50cnlPcHRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY291bnRyeSBhbmQgcHJvdmluY2Ugc2VsZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gbm9kZSBlbGVtZW50XG4gKiBAcGFyYW0ge05vZGV9IGNvdW50cnlOb2RlRWxlbWVudCBUaGUgPHNlbGVjdD4gZWxlbWVudCBmb3IgY291bnRyeVxuICogQHBhcmFtIHtOb2RlfSBwcm92aW5jZU5vZGVFbGVtZW50IFRoZSA8c2VsZWN0PiBlbGVtZW50IGZvciBwcm92aW5jZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgQWRkaXRpb25hbCBzZXR0aW5ncyBhdmFpbGFibGVcbiAqIEBwYXJhbSB7Q291bnRyeVByb3ZpbmNlU2VsZWN0b3J+b25Db3VudHJ5Q2hhbmdlfSBvcHRpb25zLm9uQ291bnRyeUNoYW5nZSBjYWxsYmFjayBhZnRlciBhIGNvdW50cnkgYGNoYW5nZWAgZXZlbnRcbiAqIEBwYXJhbSB7Q291bnRyeVByb3ZpbmNlU2VsZWN0b3J+b25Qcm92aW5jZUNoYW5nZX0gb3B0aW9ucy5vblByb3ZpbmNlQ2hhbmdlIGNhbGxiYWNrIGFmdGVyIGEgcHJvdmluY2UgYGNoYW5nZWAgZXZlbnRcbiAqL1xuQ291bnRyeVByb3ZpbmNlU2VsZWN0b3IucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKGNvdW50cnlOb2RlRWxlbWVudCwgcHJvdmluY2VOb2RlRWxlbWVudCwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGNvdW50cnlOb2RlRWxlbWVudCAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGNvdW50cnlOb2RlRWxlbWVudCArICcgaXMgbm90IGEgb2JqZWN0LicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwcm92aW5jZU5vZGVFbGVtZW50ICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocHJvdmluY2VOb2RlRWxlbWVudCArICcgaXMgbm90IGEgb2JqZWN0LicpO1xuICB9XG5cbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IGNvdW50cnlOb2RlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGVmYXVsdCcpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gIGNvdW50cnlOb2RlRWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLmNvdW50cnlPcHRpb25zO1xuICBjb3VudHJ5Tm9kZUVsZW1lbnQudmFsdWUgPSBkZWZhdWx0VmFsdWU7XG5cbiAgaWYgKGRlZmF1bHRWYWx1ZSAmJiBnZXRPcHRpb24oY291bnRyeU5vZGVFbGVtZW50LCBkZWZhdWx0VmFsdWUpKSB7XG4gICAgdmFyIHByb3ZpbmNlcyA9IGJ1aWxkUHJvdmluY2UoY291bnRyeU5vZGVFbGVtZW50LCBwcm92aW5jZU5vZGVFbGVtZW50LCBkZWZhdWx0VmFsdWUpO1xuICAgIG9wdGlvbnMub25Db3VudHJ5Q2hhbmdlICYmIG9wdGlvbnMub25Db3VudHJ5Q2hhbmdlKHByb3ZpbmNlcywgcHJvdmluY2VOb2RlRWxlbWVudCwgY291bnRyeU5vZGVFbGVtZW50KTtcbiAgfVxuXG4gIC8vIExpc3RlbiBmb3IgdmFsdWUgY2hhbmdlIG9uIHRoZSBjb3VudHJ5IHNlbGVjdFxuICBjb3VudHJ5Tm9kZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZSA9IHRhcmdldC52YWx1ZTtcbiAgICBcbiAgICB2YXIgcHJvdmluY2VzID0gYnVpbGRQcm92aW5jZSh0YXJnZXQsIHByb3ZpbmNlTm9kZUVsZW1lbnQsIHNlbGVjdGVkVmFsdWUpO1xuICAgIG9wdGlvbnMub25Db3VudHJ5Q2hhbmdlICYmIG9wdGlvbnMub25Db3VudHJ5Q2hhbmdlKHByb3ZpbmNlcywgcHJvdmluY2VOb2RlRWxlbWVudCwgY291bnRyeU5vZGVFbGVtZW50KTtcbiAgfSk7XG5cbiAgb3B0aW9ucy5vblByb3ZpbmNlQ2hhbmdlICYmIHByb3ZpbmNlTm9kZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb3B0aW9ucy5vblByb3ZpbmNlQ2hhbmdlKTtcbn1cblxuLyoqXG4gKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBhZnRlciBhIHVzZXIgaW50ZXJhY3RlZCB3aXRoIGEgY291bnRyeSBgPHNlbGVjdD5gXG4gKiBAY2FsbGJhY2sgQ291bnRyeVByb3ZpbmNlU2VsZWN0b3J+b25Db3VudHJ5Q2hhbmdlXG4gKiBAcGFyYW0ge2FycmF5fSBwcm92aW5jZXMgdGhlIHBhcnNlZCBwcm92aW5jZXNcbiAqIEBwYXJhbSB7Tm9kZX0gcHJvdmluY2VOb2RlRWxlbWVudCBwcm92aW5jZSBgPHNlbGVjdD5gIGVsZW1lbnRcbiAqIEBwYXJhbSB7Tm9kZX0gY291bnRyeU5vZGVFbGVtZW50IGNvdW50cnkgYDxzZWxlY3Q+YCBlbGVtZW50XG4gKi9cblxuIC8qKlxuICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgYWZ0ZXIgYSB1c2VyIGludGVyYWN0ZWQgd2l0aCBhIHByb3ZpbmNlIGA8c2VsZWN0PmBcbiAqIEBjYWxsYmFjayBDb3VudHJ5UHJvdmluY2VTZWxlY3Rvcn5vblByb3ZpbmNlQ2hhbmdlXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCB0aGUgcHJvdmluY2Ugc2VsZWN0b3IgYGNoYW5nZWAgZXZlbnQgb2JqZWN0XG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSA8b3B0aW9uPiB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgZnJvbSB0aGVcbiAqIGdpdmVuIG5vZGUgZWxlbWVudFxuICogQSBudWxsIGlzIHJldHVybmVkIGlmIG5vIHN1Y2ggPG9wdGlvbj4gaXMgZm91bmRcbiAqL1xuZnVuY3Rpb24gZ2V0T3B0aW9uKG5vZGVFbGVtZW50LCB2YWx1ZSkge1xuICByZXR1cm4gbm9kZUVsZW1lbnQucXVlcnlTZWxlY3Rvcignb3B0aW9uW3ZhbHVlPVwiJyArIHZhbHVlICsnXCJdJylcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIG9wdGlvbnMgZm9yIHByb3ZpbmNlIHNlbGVjdG9yXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkT3B0aW9ucyAocHJvdmluY2VOb2RlRWxlbWVudCwgcHJvdmluY2VzKSB7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBwcm92aW5jZU5vZGVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1kZWZhdWx0Jyk7XG5cbiAgcHJvdmluY2VzLmZvckVhY2goZnVuY3Rpb24gKG9wdGlvbikge1xuICAgIHZhciBvcHRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IG9wdGlvblswXTtcbiAgICBvcHRpb25FbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9uWzFdO1xuXG4gICAgcHJvdmluY2VOb2RlRWxlbWVudC5hcHBlbmRDaGlsZChvcHRpb25FbGVtZW50KTtcbiAgfSlcblxuICBpZiAoZGVmYXVsdFZhbHVlICYmIGdldE9wdGlvbihwcm92aW5jZU5vZGVFbGVtZW50LCBkZWZhdWx0VmFsdWUpKSB7XG4gICAgcHJvdmluY2VOb2RlRWxlbWVudC52YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcHJvdmluY2Ugc2VsZWN0b3JcbiAqL1xuZnVuY3Rpb24gYnVpbGRQcm92aW5jZSAoY291bnRyeU5vZGVFbGVtZW50LCBwcm92aW5jZU5vZGVFbGVtZW50LCBzZWxlY3RlZFZhbHVlKSB7XG4gIHZhciBzZWxlY3RlZE9wdGlvbiA9IGdldE9wdGlvbihjb3VudHJ5Tm9kZUVsZW1lbnQsIHNlbGVjdGVkVmFsdWUpO1xuICB2YXIgcHJvdmluY2VzID0gSlNPTi5wYXJzZShzZWxlY3RlZE9wdGlvbi5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvdmluY2VzJykpO1xuXG4gIHByb3ZpbmNlTm9kZUVsZW1lbnQub3B0aW9ucy5sZW5ndGggPSAwO1xuXG4gIGlmIChwcm92aW5jZXMubGVuZ3RoKSB7XG4gICAgYnVpbGRPcHRpb25zKHByb3ZpbmNlTm9kZUVsZW1lbnQsIHByb3ZpbmNlcylcbiAgfVxuXG4gIHJldHVybiBwcm92aW5jZXM7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@shopify/theme-addresses/theme-addresses.js\n")},
1"./source/scripts/app.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var _pixelunion_shopify_sections_manager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/shopify-sections-manager */ \"./node_modules/@pixelunion/shopify-sections-manager/dist/shopify-sections-manager.es.js\");\n/* harmony import */ var _pixelunion_age_gate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @pixelunion/age-gate */ \"./node_modules/@pixelunion/age-gate/dist/index.es.js\");\n/* harmony import */ var _helpers_ComplementaryProducts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/ComplementaryProducts */ \"./source/scripts/helpers/ComplementaryProducts.js\");\n/* harmony import */ var _pixelunion_shopify_surface_pick_up__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @pixelunion/shopify-surface-pick-up */ \"./node_modules/@pixelunion/shopify-surface-pick-up/dist/index.es.js\");\n/* harmony import */ var _helpers_PaymentTerms__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./helpers/PaymentTerms */ \"./source/scripts/helpers/PaymentTerms.js\");\n/* harmony import */ var _helpers_RecipientForm__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./helpers/RecipientForm */ \"./source/scripts/helpers/RecipientForm.js\");\n/* harmony import */ var _helpers_ShippingCalculator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./helpers/ShippingCalculator */ \"./source/scripts/helpers/ShippingCalculator.js\");\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_animations__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @pixelunion/animations */ \"./node_modules/@pixelunion/animations/dist/animations.es.js\");\n/* harmony import */ var just_debounce__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! just-debounce */ \"./node_modules/just-debounce/index.js\");\n/* harmony import */ var just_debounce__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(just_debounce__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @pixelunion/shopify-asyncview */ \"./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n_pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.init('[data-rimg=\"lazy\"]', {\n  round: 1\n});\nconst sections = new _pixelunion_shopify_sections_manager__WEBPACK_IMPORTED_MODULE_1__.default();\nsections.register('age-gate', section => new _pixelunion_age_gate__WEBPACK_IMPORTED_MODULE_2__.PageAgeGate(section));\nconst ageGatePage = document.getElementById('age-gate-page');\n\nif (ageGatePage) {\n  new _pixelunion_age_gate__WEBPACK_IMPORTED_MODULE_2__.SiteAgeGate(ageGatePage);\n}\n/*============================================================================\n  Global - header\n==============================================================================*/\n\n\nwindow.header = {\n  init: function () {\n    this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_8__.default();\n    this.setHeaderPosition(); //remove duplicate header on update\n\n    if ($('.mobile-header').length > 1) {\n      var nav_menu = $(\"#nav\").data(\"mmenu\");\n      nav_menu.close();\n      $('.mobile-header:last, #nav:last').remove();\n    } // Only applied when there is a full-width banner across top of page\n\n\n    var $header = $('.feature_image .header.header-background--false'); // To offset the fixed header\n\n    if ($('.header').hasClass('mm-fixed-top')) {\n      $('.menu li:not(.cart) a[href^=\"#\"], .flex-caption a[href^=\"#\"]').on('click', function (e) {\n        var anchorlink = $(this).attr('href');\n\n        if ($('.index-sections').find(anchorlink).length) {\n          e.preventDefault();\n          var headerHeight = $('.header').outerHeight();\n          $('html, body').animate({\n            scrollTop: $(anchorlink).offset().top - headerHeight\n          }, 2000);\n        }\n      });\n    }\n\n    ;\n\n    if ($header.hasClass('sticky-header--true')) {\n      $(\".index-sections .shopify-section:nth-child(2), .shopify-section:nth-child(2), .main-wrapper, .page-details-block:nth-child(2)\").waypoint(function (direction) {\n        if (direction == 'down') {\n          $header.addClass('sticky--active fadeInDown delay-0s header_bar');\n          $header.removeClass('is-absolute');\n          header.dynamicDropdown();\n        } else if (direction == 'up') {\n          $header.removeClass('sticky--active fadeInDown delay-0s header_bar');\n          $header.addClass('is-absolute');\n          header.dynamicDropdown();\n        }\n      }, {\n        offset: function () {\n          // sticky header activates when merchant scrolls down the page the height of the header plus 250px\n          return -$header.outerHeight() - 250;\n        }\n      });\n    }\n\n    $header.on('webkitAnimationEnd oanimationend msAnimationEnd animationend', function () {\n      $(this).removeClass('fadeIn');\n    });\n    $('#cart').mmenu({\n      navbar: {\n        add: false\n      },\n      offCanvas: {\n        pageSelector: \"#content_wrapper\"\n      },\n      \"extensions\": [\"theme-dark\", \"position-front\", \"position-right\"]\n    });\n    $('.cart-button, .icon-menu').on(\"click\", function (e) {\n      $('#search').hide();\n    });\n    var navSettings = {\n      \"navbar\": {\n        add: true,\n        title: $('.mobile_logo').html()\n      },\n      scrollBugFix: {\n        fix: true\n      },\n      searchfield: {\n        add: $('#header').data('search-enabled'),\n        search: false,\n        position: \"top\",\n        placeholder: window.PXUTheme.translation.search\n      },\n      \"extensions\": [\"theme-dark\"],\n      offCanvas: {\n        pageSelector: \"#content_wrapper\"\n      }\n    };\n\n    if ($('.mobile-search-bar').length > 0) {\n      var navSettings = {\n        \"navbar\": {\n          add: true,\n          title: $('.mobile_logo').html()\n        },\n        scrollBugFix: {\n          fix: true\n        },\n        \"extensions\": [\"theme-dark\"],\n        offCanvas: {\n          pageSelector: \"#content_wrapper\"\n        }\n      };\n    }\n\n    $('#nav').mmenu(navSettings, {\n      searchfield: {\n        \"form\": {\n          \"action\": \"/search\"\n        },\n        \"input\": {\n          \"name\": \"q\"\n        }\n      }\n    }); // Add a link to the navbar title\n\n    $('#mm-1').find('.mm-navbar__title').attr('href', '/');\n    $('body').on('mouseenter', '.sub-menu', function () {\n      $(this).attr('aria-expanded', true);\n      $(this).find('details').attr('open', true);\n    });\n    $('body').on('mouseleave', '.sub-menu', function () {\n      $(this).attr('aria-expanded', false);\n      $(this).find('details').attr('open', false);\n    });\n    this.dynamicDropdown();\n    this.mobileSearch = document.querySelector('[data-mobile-search]');\n    if (!this.mobileSearch) return;\n    this.mobileSearchAnimation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_9__.transition)({\n      el: this.mobileSearch,\n      state: 'closed'\n    });\n    this.mobileSearchInputs = document.querySelectorAll('.mm-searchfield__input input');\n    this.mobileSearchClose = this.mobileSearch.querySelector('[data-search-close]');
1\n    this.mobileSearchInputs.forEach(input => {\n      this.events.register(input, 'click', () => this._openMobileSearch());\n    });\n    this.events.register(this.mobileSearchClose, 'click', () => this._closeMobileSearch());\n  },\n\n  _openMobileSearch() {\n    document.body.appendChild(this.mobileSearch);\n    this.mobileSearchAnimation.animateTo('open').then(() => {\n      const input = this.mobileSearch.querySelector('[data-search-input]');\n      const inputLength = input.value.length;\n      input.setSelectionRange(inputLength, inputLength);\n      input.focus();\n    });\n  },\n\n  _closeMobileSearch() {\n    this.mobileSearchAnimation.animateTo('closed');\n  },\n\n  setHeaderPosition: function () {\n    // Determine the header position\n    if ($('.promo-banner').length) {\n      var announcementHeight = $('.promo-banner').outerHeight();\n      $('.header').css('top', announcementHeight);\n    } else {\n      $('.header').css('top', '0');\n    }\n  },\n  dynamicDropdown: function () {\n    var headerNavigationWidth = $('[data-header-navigation]').width();\n    var $headerNavItems = $('[data-header-nav-item]');\n    var dropdownPosition = $('.header').data('dropdown-position');\n    var singleLineNav = true;\n    var totalNavItemsWidth = 0;\n    $headerNavItems.each(function (index, navItem) {\n      totalNavItemsWidth += $(navItem).outerWidth();\n    });\n\n    if (totalNavItemsWidth > headerNavigationWidth) {\n      singleLineNav = false;\n    }\n\n    if (dropdownPosition == 'below_header' && singleLineNav == true) {\n      $('.header_bar').removeClass('header-dropdown-position--below_parent');\n      $('.header_bar').addClass('header-dropdown-position--below_header');\n      $('.header_bar').attr('data-dropdown-position', 'below_header');\n      $('.header_bar.header-dropdown-position--below_header .dropdown').css({\n        \"padding-top\": $('.header').height() / 2\n      });\n      $('.header_bar.header-dropdown-position--below_header .disclosure__list-wrap').css({\n        \"padding-top\": $('.header').height() / 2\n      });\n    } else {\n      $('.header').addClass('header-dropdown-position--below_parent');\n      $('.header').removeClass('header-dropdown-position--below_header');\n      $('.header').attr('data-dropdown-position', 'below_parent');\n      $('.header .dropdown').removeAttr('style');\n    }\n  },\n  setPadding: function () {\n    if ($('body').hasClass('index') && window.PXUTheme.media_queries.large.matches) {\n      var $reorderableFirstSection = $('.index-sections .shopify-section').first();\n\n      if ($reorderableFirstSection.hasClass('parallax-banner')) {\n        if ($('.header').hasClass('header-background--true') && $('.header').hasClass('header-transparency--false')) {\n          $reorderableFirstSection.css('padding-top', $('.header').height());\n        }\n      }\n    }\n  },\n  openDropdown: function () {\n    $('[data-header-nav-details]').on('click', handleDetailClick);\n    $('[data-header-nav-details]').on('touchend', handleDetailClick);\n\n    function handleDetailClick(e) {\n      e.stopPropagation();\n      const clickedParent = e.target.closest('li.sub-menu');\n      const clickedDetails = e.currentTarget;\n      const clickedLink = clickedDetails.querySelector('summary');\n      const detailsElements = [...document.querySelectorAll('.header__navigation li.sub-menu > [data-header-nav-details]')]; // Close siblings\n\n      if (detailsElements.includes(clickedDetails)) {\n        detailsElements.forEach(detailsElement => {\n          const details = detailsElement;\n\n          if (details !== clickedDetails) {\n            details.open = false;\n          }\n        });\n      } // If the link being clicked is a parent link, then take control of the navigation\n\n\n      if (clickedParent && clickedLink.getAttribute('href')) {\n        e.preventDefault();\n\n        if (clickedDetails.open) {\n          window.location = clickedLink.getAttribute('href');\n          return;\n        } // If the submenu isn't open, open it\n\n\n        clickedDetails.open = true;\n      }\n    }\n  },\n  unload: function ($target) {\n    $('a[href^=\"#\"]').off('click');\n    $('[data-header-nav-details]').off('click');\n    $('[data-header-nav-details]').off('touchend');\n  }\n};\n/*============================================================================\n  Home page - featured promotions\n==============================================================================*/\n\nwindow.featured_promotions = {\n  init: function () {\n    window.animate_content.init();\n  },\n  unload: function ($target) {}\n};\n/*============================================================================\n  Home page - video\n==============================================================================*/\n\nwindow.videoTheme = {\n  init: function () {\n    // Set up plyr for newly embedded video\n    var featuredVideos = $('[data-vi
1deo-element]').get();\n    var featuredVideoPlayers = Plyr.setup(featuredVideos, {\n      controls: controls,\n      fullscreen: {\n        enabled: true,\n        fallback: true,\n        iosNative: true\n      },\n      storage: {\n        enabled: false\n      }\n    }); // Adds plyr video id to video wrapper\n\n    $.each(featuredVideoPlayers, function (index, player) {\n      var id = player.id;\n      var $video;\n\n      if (player.isHTML5) {\n        $video = $(player.elements.wrapper).find('video');\n        $video.attr('data-plyr-video-id', id);\n      } // When a video is playing, pause any other instances\n\n\n      player.on('play', function (event) {\n        var instance = event.detail.plyr;\n        $.each(featuredVideoPlayers, function (index, player) {\n          if (instance.id != player.id) {\n            player.pause();\n          }\n        });\n      });\n    });\n    $('[data-video-element]').each(function (index, video) {\n      // Variables\n      var $video = $(video);\n      var $section = $video.parents('.shopify-section').attr('id', id);\n      var $videoElement = $section.find($video);\n      var $videoWrapper = $videoElement.parents('.video-wrapper');\n      var $playButton = $videoWrapper.find('[data-play-button]');\n      var $videoText = $videoWrapper.find('[data-video-text]');\n      var $videoTextContainer = $videoWrapper.find('[data-video-text-container]');\n      var $posterImage = $videoWrapper.data('poster-image-uploaded');\n      var aspectRatio = $videoWrapper.data('aspect-ratio');\n      var id = $videoWrapper.data('video-src');\n      var isAutoplay = $videoWrapper.data('autoplay');\n      var isLoopingEnabled = $videoWrapper.data('autoloop');\n      var isMuted = $videoWrapper.data('mute-video');\n      $.each(featuredVideoPlayers, function (index, player) {\n        var videoID;\n        var playerID;\n\n        if (player.isYouTube || player.isVimeo) {\n          var videoID = $videoWrapper.attr('id');\n          var playerID = $(player.elements.original).attr('id');\n        } else if (player.isHTML5) {\n          var videoID = $videoWrapper.find('[data-plyr-video-id]').data('plyr-video-id');\n          var playerID = player.id;\n          $videoElement = $section.find('.plyr--video');\n        }\n\n        if (playerID == videoID) {\n          // Reset play button icon\n          $videoWrapper.removeClass('play-button-icon--visible'); // Reset image\n\n          $videoWrapper.removeClass('video-is-playing'); // Autoplay\n\n          if (isAutoplay) {\n            // If on desktop or player is YouTube/Vimeo\n            if (window.PXUTheme.media_queries.large.matches || player.isYouTube || player.isVimeo) {\n              player.autoplay = true; // Hide image\n\n              $videoWrapper.addClass('video-is-playing'); // Show video\n\n              $videoElement.show(); // If display text over video unchecked\n\n              if ($videoTextContainer.hasClass('display-text-over-video--false')) {\n                $videoText.hide();\n              } else {\n                $videoText.show();\n              } // Keep play button hidden\n\n\n              $playButton.hide(); // HTML5 Mobile Video\n            } else if (window.PXUTheme.media_queries.medium.matches && player.isHTML5) {\n              // Hide image\n              $videoWrapper.addClass('video-is-playing'); // Show video\n\n              $videoElement.show(); // Display button so that video can be played\n\n              $playButton.show();\n              player.on('play', function () {\n                // Show video\n                $videoElement.show(); // Hide play button\n\n                $playButton.hide();\n              });\n            }\n          } else {\n            // If Autoplay disabled\n            // If poster image, show image wrapper otherwise hide it\n            if ($posterImage) {\n              $videoWrapper.removeClass('video-is-playing');\n            } else {\n              $videoWrapper.addClass('video-is-playing');\n              $videoElement.show();\n            }\n          } // Clicking image will play video\n\n\n          $videoWrapper.find('.parallax__wrap, .banner__wrap').on('click', function () {\n            if (!player.playing && !$videoWrapper.hasClass('video-is-playing')) {\n              player.play();\n            }\n          });
1 // Muted\n\n          if (isMuted) {\n            player.muted = true;\n          } // Aspect Ratio\n\n\n          if (aspectRatio) {\n            player.ratio = aspectRatio;\n          } // Looping\n\n\n          if (isLoopingEnabled) {\n            player.loop = true;\n          } // Show Video Controls\n          // - video controls get hidden using a css class: '.video-controls-enabled--false'\n          // If button exists, hide text and poster\n\n\n          if ($playButton) {\n            $playButton.on('click', function () {\n              // Hide image\n              $videoWrapper.addClass('video-is-playing'); // Show video\n\n              $videoElement.show(); // If display text over video unchecked\n\n              if ($videoTextContainer.hasClass('display-text-over-video--false')) {\n                $videoText.hide();\n              } else {\n                $videoText.show();\n              } // Play video\n\n\n              player.play();\n            });\n          }\n\n          player.on('ready', function () {\n            window.videoTheme.resizeVideo($videoWrapper);\n          });\n          player.on('play', function () {\n            // Hide image\n            $videoWrapper.addClass('video-is-playing'); // Reset play button icon\n\n            $videoWrapper.removeClass('play-button-icon--visible'); // Show video\n\n            $videoElement.show(); // If display text over video unchecked\n\n            if ($videoTextContainer.hasClass('display-text-over-video--false')) {\n              $videoText.hide();\n            } else {\n              $videoText.show();\n            } // Hide play button\n\n\n            if ($playButton) {\n              $playButton.hide();\n            }\n          }); // If video is paused, play button icon or button must be shown\n          // If button text is filled out, use play button\n          // If button text is not filled out, use play button icon\n\n          player.on('pause', function () {\n            if ($playButton.length > 0) {\n              $playButton.show();\n              $videoWrapper.removeClass('play-button-icon--visible');\n              $videoTextContainer.hide();\n            } else {\n              $videoWrapper.addClass('play-button-icon--visible');\n            }\n          }); // If page loads with video paused and no button showing, show icon\n\n          if (!player.playing && $playButton.is(':hidden') || $playButton.length == 0) {\n            $videoWrapper.addClass('play-button-icon--visible');\n          }\n\n          return false;\n        }\n      });\n    });\n  },\n  resizeVideo: function ($videoWrapper) {\n    // get height and width of the video\n    var videoHeight = $videoWrapper.find('.plyr--video').height();\n    var videoWidth = $videoWrapper.find('.plyr__video-wrapper').width(); // calculate correct padding-bottom percentage for responsive videos\n\n    var paddingBottom = videoHeight / videoWidth * 100; // apply that padding bottom ratio\n\n    $videoWrapper.find('.plyr__video-wrapper').css('padding-bottom', paddingBottom + '%');\n  }\n};\n/*============================================================================\n  Banner image\n==============================================================================*/\n\nwindow.banner_image = {\n  init: function () {\n    var contentAreaPadding = $('.header').data('content-area-padding');\n\n    if (window.PXUTheme.media_queries.large.matches) {\n      var $reorderableFirstSection = $('.global-wrapper .shopify-section').first();\n      $reorderableFirstSection.attr('style', '');\n\n      if ($reorderableFirstSection.hasClass('parallax-banner')) {\n        // Has banner\n        if ($('.header').hasClass('header-background--true') && $('.header').hasClass('header-transparency--false')) {\n          if ($('.global-wrapper__product').length || $('.shopify-policy__container').length || $('.global-wrapper__customer').length) {\n            $('.global-wrapper__product, .shopify-policy__container, .global-wrapper__customer').css('padding-top', $('.header').height() + contentAreaPadding);\n          } else {\n            $reorderableFirstSection.css('padding-top', $('.header').height() + contentAreaPadding);\n          }\n\n          $('.header').parent().removeClass('feature_image');\n          $('.header').addClass('header_bar');\n\n          if ($('.header').hasClass('sticky-header--false')) {\n            $('.header').addClass('is-absolute');\n          } else {\n            $('.header.is-absolute').removeClass('is-absolute');\n          }\n        } else if ($('.header').hasClass('header-background--false') && $('.header').hasClass('header-transparency--true')) {\n          $('.header').parent().addClass('feature_image');\n          $('.header').removeClass('header_bar');\n          $('.header').addClass('is-absolute');\n\n          if ($('.header').hasClass('sticky-header--true')) {\n            $('.header').addClass('is-absolute');\n          }\n        } else if ($('.header').hasClass('header-background--false') && $('.header').hasClass('header-transparency--false')) {\n          $('.header').parent().addClass('feature_image');\n          $('.header').removeClass('header_bar');\n          $('.header').addClass('is-absolute');\n\n          if ($('.header').hasClass('sticky-header--true')) {\n            $('.header').addClass('is-absolute');\n          }\n        } else if ($('.header').hasClass('header-background--true') && $('.header').hasClass('header-transparency--true')) {\n          $('.header').parent().removeClass('feature_image');\n          $('.header').addClass('header_bar');\n\n          if ($('.header').hasClass('sticky-header--false')) {\n            $('.header').addClass('is-absolute');\n          } else {\n            $('.header.is-absolute').removeClass('is-absolute');\n          }\n        }\n      } else {\n        // No banner\n        if ($('.global-wrapper__product').length || $('.shopify-policy__container').length || $('.global-wrapper__customer').length) {\n          $('.global-wrapper__product, .shopify-policy__container, .global-wrapper__customer').css('padding-top', $('.header').height() + contentAreaPadding);\n        } else {\n          $reorderableFirstSection.css('padding-top', $('.header').height() + contentAreaPadding);\n        }\n\n        if ($('.header').hasClass('sticky-header--false')) {\n          $('.header').addClass('header_bar');\n          $('.header').addClass('is-absolute');\n        } else {\n          $('.feature_image').removeClass('feature_image');\n          $('.header').addClass('header_bar');\n          $('.header.is-absolute').removeClass('is-absolute');\n        }\n      }\n    }\n  },\n  resetPadding: function () {\n    var $reorderableFirstSection = $('.global-wrapper .shopify-section').first();\n\n    if ($reorderableFirstSection.hasClass('parallax-banner')) {\n      $reorderableFirstSection.css('padding-top', '0px');\n    } else {\n      if (window.PXUTheme.media_queries.large.matches) {\n        if ($('.global-wrapper__product').length || $('.shopify-policy__container').length || $('.global-wrapper__customer').length) {\n          $('.global-wrapper__product, .shopify-policy__container, .global-wrapper__customer').css('padding-top', $('.header').height() + window.contentAreaPadding);\n        } else {\n          $reorderableFirstSection.css('padding-top', $('.header').height());\n        }\n      } else {\n        $reorderableFirstSection.css('padding-top', '0px');\n      }\n    }\n  },\n  unload: function ($target) {}\n};\n/*============================================================================\n  Announcement Bar\n==============================================================================*/\n\nvar announcement_bar = {\n  init: function () {\n    if ($('.promo-banner').length) {\n      var announcement = Cookies.get('promo-banner');\n\n      if (announcement != 'dismiss') {\n        $('body').addClass('promo-banner--true');\n        $('.promo-banner__close').on('click', function () {\n          $('.promo-banner--true').attr('style', '');\n          $('body').removeClass('promo-banner--true');\n          announcement_bar.setPadding();\n          Cookies.set('promo-banner', 'dismiss', {\n            path: '/'\n          }, {\n            expires: 30\n          });\n        });\n      }\n    } //call setPadding on initialization\n\n\n    announcement_bar.setPadding();\n  },\n  setPadding: function () {\n    // Setting padding relative to promo banner height\n    var bannerHeight = $('.promo-banner').innerHeight();\n    var bannerPadding = bannerHeight - 25 + 'px';\n    var parentSection = $('.promo-banner').parent('.shopify-section--header');\n\n    if ($('body').hasClass('promo-banner--true')) {\n      if ($('.header').hasClass('sticky-header--true') || $('.mobile-header').hasClass('mobile-sticky-header--false') && window.PXUTheme.media_queries.medium.matches) {\n        $(parentSection).css('padding-bottom', bannerPadding);\n      }\n    } else {\n      $(parentSection).css('padding-bottom', '0');\n      $('.header').css('top', '0');\n    }\n  }\n};\n/*============================================================================\n  Banner\n==============================================================================*/\n\nwindow.banner = {\n  init: function () {\n    window.animate_content.init(); //Arrow scroll\n\n    var headerHeight = $('.header').outerHeight();\n\n    if ($('.header').hasClass('sticky-header--true')) {\n      $('.scroll-arrow').smoothScroll({\n        offset: -headerHeight\n      });\n    } else {\n      $('.scroll-arrow').smoothScroll();\n    }\n\n    announcement_bar.init();\n  },\n  unload: function ($target) {}\n};\n/*============================================================================\n  Newsletter\n==============================================================================*/\n\nvar newsletter_popup = {\n  init: function () {\n    var popup = Cookies.get('popup');\n    var newsletter_popup_days = parseInt(window.PXUTheme.theme_settings.newsletter_popup_days);\n    var cookie_enabled = newsletter_popup_days != 0 ? true : false;\n\n    if (cookie_enabled && popup == 'open') {\n      return false;\n    } else {\n      newsletter_popup.open();\n    }\n\n    if (cookie_enabled) {\n      Cookies.set('popup', 'open', {\n        expires: newsletter_popup_days\n      });\n    }\n  },\n  open: function () {\n    var newsletter_popup_seconds = parseInt(window.PXUTheme.theme_settings.newsletter_popup_seconds);\n\n    if (window.PXUTheme.theme_settings.newsletter_popup_mobile || window.PXUTheme.media_queries.large.matches) {\n      setTimeout(function () {\n        $.fancybox.open($('.js-newsletter-popup'), {\n          baseClass: 'newsletter_popup',\n          hash: false,\n          infobar: false,\n          toolbar: false,\n          loop: true,\n          smallBtn: true,\n          touch: false,\n          mobile: {\
1n            preventCaptionOverlap: false,\n            toolbar: true,\n            buttons: [\"close\"]\n          }\n        });\n      }, newsletter_popup_seconds * 1000);\n    }\n  }\n};\n/*============================================================================\n  Product\n==============================================================================*/\n\nwindow.product = {\n  init: function () {\n    var $notify_form = $('.notify_form .contact-form'); // Find product galleries on page but exclude those in the quickshop (quickshop logic handled in fancybox event)\n\n    var $productGalleries = $('.product-gallery'); // For each product gallery, create an object and add it to an array of galleries\n\n    var galleriesArray = [];\n    globalPlayersArray = [];\n\n    if ($productGalleries.length > 0) {\n      $.each($productGalleries, function (index, gallery) {\n        var $productSection = $(gallery).closest('.product_section');\n        galleriesArray.push({\n          element: $(gallery),\n          productSection: $productSection,\n          thumbnailsEnabled: $productSection.data('thumbnails-enabled'),\n          thumbnailsSliderEnabled: $productSection.data('thumbnails-slider-enabled'),\n          thumbnailsPosition: $productSection.data('thumbnails-position'),\n          thumbnailsArrows: $productSection.data('gallery-arrows-enabled'),\n          slideshowAnimation: $productSection.data('slideshow-animation'),\n          slideShowSpeed: $productSection.data('slideshow-speed'),\n          activateZoom: $productSection.data('activate-zoom'),\n          productMediaSupported: $productSection.data('product-media-supported'),\n          loopingEnabled: $(gallery).find('.product-gallery__main').data('video-looping-enabled'),\n          sectionID: $productSection.parents('.shopify-section').attr('id')\n        });\n      });\n    }\n\n    if (galleriesArray.length > 0) {\n      // For each galleryObject, enable a Flickity slider\n      $.each(galleriesArray, function (index, galleryObject) {\n        window.product.enableSlider(galleryObject); // If product media is supported for the gallery, then also launch product media and Plyr\n\n        if (galleryObject.productMediaSupported) {\n          // Find videos within gallery section\n          var videos;\n          videos = $(galleryObject.element).find('[data-html5-video] video, [data-youtube-video]').get();\n          window.product.loadPlyr(galleryObject, videos);\n          window.product.launchProductMedia(galleryObject); // Go through each gallery, on video play check instance ID against other player IDs\n\n          var instance;\n          $.each(galleryObject.videoPlayers, function (index, player) {\n            player.on('play', function (event) {\n              instance = event.detail.plyr; // Ensures only one video is playing at a time\n\n              $.each(globalPlayersArray, function (index, player) {\n                if (instance.id != player.id) {\n                  player.pause();\n                }\n              });\n            });\n          });\n        } // Hover to zoom\n\n\n        if (galleryObject.activateZoom) {\n          document.addEventListener('lazyloaded', window.product.enableZoom);\n        }\n      });\n    }\n\n    const recipientFormEl = document.querySelector('[data-recipient-form]');\n\n    if (recipientFormEl) {\n      const sectionEl = recipientFormEl.closest('.product_section');\n      this.recipientForm = new _helpers_RecipientForm__WEBPACK_IMPORTED_MODULE_6__.default(sectionEl);\n    }\n\n    const complementaryProductsEl = document.querySelector('[data-complementary-products]');\n\n    if (complementaryProductsEl) {\n      const sectionEl = complementaryProductsEl.closest('.product_section');\n      const {\n        sectionId,\n        productId,\n        productRecommendationLimit\n      } = JSON.parse(document.querySelector('[data-complementary-products-data]').textContent);\n      this.complementaryProductRecommendations = new _helpers_ComplementaryProducts__WEBPACK_IMPORTED_MODULE_3__.default({\n        sectionEl,\n        sectionId,\n        productId,\n        productRecommendationsRoute: window.PXUTheme.routes.product_recommendations_url,\n        includeIndicatorDots: false,\n        limit: productRecommendationLimit,\n        arrowShape: 'M95.04 46 21.68 46 48.18 22.8 42.91 16.78 4.96 50 42.91 83.22 48.18 77.2 21.68 54 95.04 54 95.04 46z'\n      });\n    }\n\n    if ($('.product-quickshop__container').length == 0) {\n      window.product.loadProductRecommendations();\n    }\n\n    window.product.productSwatches();\n    window.animate_content.init();\n  },\n  unitPricing: function (item) {\n    let unitPriceMeasurementReferenceValue = '';\n    let unitPriceOutput = '';\n\n    if (item.unit_price_measurement) {\n      if (item.unit_price_measurement.reference_value != 1) {\n        unitPriceMeasurementReferenceValue = item.unit_price_measurement.reference_value;\n      }\n\n      unitPriceOutput += `<div class=\"item_unit-price\">${item.unit_price_measurement.quantity_value}${item.unit_price_measurement.quantity_unit} | ${Shopify.formatMoney(item.unit_price, $('body').data('money-format'))} / ${unitPriceMeasurementReferenceValue}${item.unit_price_measurement.reference_unit}</div>`;\n      return unitPriceOutput;\n    }\n  },\n  productSwatches: function () {\n    $('[data-product-form=\"uninitialized\"]').each((_, options) =>
1 {\n      options.dataset.productForm = '';\n      const $options = $(options);\n      const paymentTerms = new _helpers_PaymentTerms__WEBPACK_IMPORTED_MODULE_5__.default(options.closest('[data-product-details]'));\n      const surfacePickUpEl = $options.closest('.js-product_section').find('[data-surface-pick-up]')[0];\n      const productTitle = $options.data('product-title');\n      let currentVariantId = $options.data('variant-id');\n      let currentVariantTitle = $options.data('variant-title');\n      let surfacePickUp;\n\n      if (surfacePickUpEl) {\n        surfacePickUp = new _pixelunion_shopify_surface_pick_up__WEBPACK_IMPORTED_MODULE_4__.default(surfacePickUpEl);\n        surfacePickUp.load(currentVariantId);\n        surfacePickUp.onModalRequest(contents => {\n          const surfacePickUpModal = document.querySelector('[data-surface-pick-up-modal]');\n          let fragment; // Build out pop-up content for product with no variants, else build\n          // out popup content for product with variants\n\n          if (currentVariantTitle == 'Default Title' && productTitle) {\n            fragment = document.createDocumentFragment();\n            const header = document.createElement('div');\n            const title = document.createElement('h2');\n            header.classList.add('surface-pick-up__modal-header');\n            title.classList.add('surface-pick-up__modal-title');\n            title.innerHTML = productTitle;\n            header.appendChild(title);\n            fragment.appendChild(header);\n          } else if (currentVariantTitle !== 'Default Title' && productTitle) {\n            fragment = document.createDocumentFragment();\n            const header = document.createElement('div');\n            const title = document.createElement('h2');\n            header.classList.add('surface-pick-up__modal-header');\n            title.classList.add('surface-pick-up__modal-title');\n            title.innerHTML = productTitle;\n            header.appendChild(title);\n\n            if (window.currentVariant.title !== 'Default Title') {\n              const subtitle = document.createElement('span');\n              subtitle.classList.add('surface-pick-up__modal-subtitle');\n              subtitle.innerHTML = window.currentVariant.title;\n              header.appendChild(subtitle);\n            }\n\n            fragment.appendChild(header);\n          }\n\n          surfacePickUpModal.innerHTML = contents;\n          surfacePickUpModal.insertBefore(fragment, surfacePickUpModal.firstChild);\n          $.fancybox.open(surfacePickUpModal, {\n            hash: false,\n            infobar: false,\n            toolbar: false,\n            loop: true,\n            smallBtn: true,\n            touch: false,\n            video: {\n              autoStart: false\n            },\n            mobile: {\n              preventCaptionOverlap: false,\n              toolbar: true\n            }\n          });\n        });\n      }\n\n      const selectId = $options.data('select-id');\n\n      if (document.getElementById(selectId)) {\n        new Shopify.OptionSelectors(selectId, {\n          product: $options.data('product'),\n          onVariantSelected: (variant, selector) => {\n            window.currentVariant = variant;\n            paymentTerms.update(variant ? variant.id : null);\n\n            if (surfacePickUp) {\n              surfacePickUp.load(variant ? variant.id : null);\n            }\n\n            window.selectCallback(variant, selector);\n          },\n          enableHistoryState: $options.data('enable-state')\n        });\n      }\n    });\n\n    if (window.PXUTheme.theme_settings.product_form_style == \"swatches\") {\n      $('.product_form').addClass('is-visible');\n      $('.swatch :radio').change(function () {\n        var optionIndex = $(this).closest('.swatch').attr('data-option-index');\n        var optionValue = $(this).val();\n        $(this).closest('form').find('.single-option-selector').eq(optionIndex).val(optionValue).trigger('change');\n      }); //Swatches linked with selected options\n\n      if ($('.js-product_section').length) {\n        var $productForms = $('.js-product_section').find('.product_form'); //Loop through each product and set the initial option value state\n\n        $productForms.each(function () {\n          var JSONData = $(this).data('product');\n          var productID = $(this).data('product-id');\n          var productSection = '.product-' + productID + ' .js-product_section';\n          var swatchOptions = $(this).find('.swatch-options .swatch');\n\n          if (swatchOptions.length > 1) {\n            Shopify.linkOptionSelectors(JSONData, productSection);\n          }\n        });\n      } //Add click event when there is more than one product on the page (eg. Collection in Detail)\n\n\n      if ($('.js-product_section').length > 1) {\n        $('body').on('click', '.swatch-element', function () {\n          var swatchValue = $(this).data('value').toString();\n          $(this).siblings('input[value=\"' + swatchValue.replace(/\\\"/g, '\\\\\"') + '\"]').prop(\"checked\", true).trigger(\"change\");\n          var JSONData = $(this).parents('.product_form').data('product');\n          var productID = $(this).parents('.product_form').data('product-id');\n          var productSection = '.product-' + productID + ' .js-product_section';\n          var swatchOptions = $(this).parents('.product_form').find('.swatch-options .swatch');\n\n          if (swatchOptions.length > 1) {\n            Shopify.linkOptionSelectors(JSONData, productSection);\n          }\n        });\n      }\n    }\n  },\n  enableZoom: function () {\n    var $image = $(event.target);\n    var zoomSrc = $image.data('zoom-src');\n\n    if (zoomSrc) {\n      $image.wrap('<span class=\"zoom-container\"></span>').css('display', 'block').parent().zoom({\n        url: zoomSrc,\n        touch: false,\n        magnify: 1\n      });\n    }\n  },\n  enableSlider: function (galleryObject) {\n    var $el = galleryObject.element.find('.product-gallery__main');\n    var $thumbnailProductGallery = galleryObject.element.find('.product-gallery__thumbnails');\n    var $slides = $el.find('.product-gallery__image');\n    var $thumbnails = $thumbnailProductGallery.find('.product-gallery__thumbnail');\n    var arrowShape = 'M95.04 46 21.68 46 48.18 22.8 42.91 16.78 4.96 50 42.91 83.22 48.18 77.2 21.68 54 95.04 54 95.04 46z';\n    $el.flickity({\n      wrapAround: true,\n      adaptiveHeight: true,\n      dragThreshold: 10,\n      imagesLoaded: true,\n      pageDots: false,\n      prevNextButtons: $el.data('media-count') > 1 ? true : false,\n      autoPlay: galleryObject.slideShowSpeed * 1000,\n      fade: galleryObject.slideShowAnimation === 'fade' ? true : false,\n      watchCSS: false,\n      arrowShape: arrowShape\n    });\n    var $slides = $el.find('.product-gallery__image');\n    $slides.each((_, slide) => {\n      const $slide = $(slide); // Listen for model pause/play events\n\n      $slide.find('model-viewer').on('shopify_model_viewer_ui_toggle_play', function () {\n        $el.flickity('unbindDrag');\n      });\n      $slide.find('model-viewer').on('shopify_model_viewer_ui_toggle_pause', function () {\n        $el.flickity('bindDrag');\n      });\n    });\n    $el.on('change.flickity', function () {\n      $slides.each(function (index, slide) {\n        // Variables to be used\n        var $slide = $(slide);\n        var mediaType = $slide.data('media-type'); // Check whether slide is active slide (featured image shown) or inactive slide (slide hidden)\n\n        if ($slide.hasClass('is-selected')) {\n          // Switch statement to go through different media types (video, model)\n          switch (mediaType) {\n            case 'model':\n              /* On slide change, if active slide contains 3d model\n              * If on de
1sktop, on hover, unbind flickity, after hover bind flickity\n              * On model play event, unbind flickity to ensure model can be interacted with\n              * On model pause event, bind flickity so that slide can be swiped\n              * Pause all model slides when hidden\n              */\n              if (window.PXUTheme.media_queries.large.matches) {\n                // On mouseenter event, unbind flickity\n                $slide.on('mouseenter', function () {\n                  $el.flickity('unbindDrag');\n                }); // On mouseleave event, bind flickity\n\n                $slide.on('mouseleave', function () {\n                  $el.flickity('bindDrag');\n                });\n              }\n\n              break;\n          }\n        } else {\n          // Below logic deals with the hidden slides when a flickity change is triggered\n          // Switch statement to go through different media types (video, model)\n          switch (mediaType) {\n            case 'model':\n              // Pause models when hidden\n              if (galleryObject.models.length > 0) {\n                $.each(galleryObject.models, function (index, model) {\n                  model.pause();\n                });\n              }\n\n              break;\n\n            case 'video':\n              // Variables\n              var $htmlVideo = $slide.find('[data-html5-video]');\n              var videoID = $htmlVideo.find('video').data('plyr-video-id'); // Pause all html5 videos for slides that are hidden\n\n              if ($htmlVideo.length) {\n                $.each(galleryObject.videoPlayers, function (index, player) {\n                  if (player.id == videoID) {\n                    player.pause();\n                  }\n                });\n              }\n\n              break;\n\n            case 'external_video':\n              // Variables\n              var $iframeVideo = $slide.find('iframe');\n              var iframeID = $iframeVideo.attr('id'); // Pause all youtube videos for slides that are hidden\n\n              if ($iframeVideo.length) {\n                $.each(galleryObject.videoPlayers, function (index, player) {\n                  if (player.media.id == iframeID) {\n                    player.pause();\n                  }\n                });\n              }\n\n              break;\n          }\n        }\n      });\n    });\n    $el.on('settle.flickity', function () {\n      $el.flickity('resize');\n    });\n    $(window).on('load', function () {\n      $el.flickity('resize');\n    });\n    $slides.each(function (index, slide) {\n      // Variables to be used\n      var $slide = $(slide);\n      var mediaType = $slide.data('media-type'); // Check whether slide is active slide (featured image shown)\n\n      if ($slide.hasClass('is-selected')) {\n        if (mediaType == 'model') {\n          // If slide has 3D model, unbind flickity on hover on desktop\n          // Allows you to click anywhere to trigger model ui\n          if (window.PXUTheme.media_queries.large.matches) {\n            // On mouseenter event, unbind flickity\n            $slide.on('mouseenter', function () {\n              $el.flickity('unbindDrag');\n            }); // On mouseleave event, bind flickity\n\n            $slide.on('mouseleave', function () {\n              $el.flickity('bindDrag');\n            });\n          }\n        } // Detect keyboard 'ENTER' key on slides\n\n\n        $slide.keypress(function (event) {\n          if (event.which == 13) {\n            $slide.find('model-viewer, .product-gallery__link, .plyr').focus();\n            $el.on('settle.flickity', function (event, index) {\n              // Run video autoplay logic if featured media is a video\n              if (mediaType == 'video' || mediaType == 'external_video') {\n                checkForVideos();\n              } // Autoplay model if featured media is a model\n\n\n              if (mediaType == 'model') {\n                // If model container has class is-selected then play the model\n                autoplayModel();\n              } // Unbind settle event\n\n\n              $el.off('settle.flickity');\n            });\n          }\n        });\n      }\n    });\n    var $sliderArrows = $el.find('.flickity-prev-next-button');\n\n    if (($sliderArrows || $thumbnails) && window.PXUTheme.media_queries.large.matches) {\n      $sliderArrows.on('click', function () {\n        // Find out media type of featured media slide\n        var mediaType = $el.find('.product-gallery__image.is-selected').data('media-type');\n        $el.on('settle.flickity', function (event, index) {\n          // Run video auto
1play logic if featured media is a video\n          if (mediaType == 'video' || mediaType == 'external_video') {\n            checkForVideos();\n          } // Autoplay model if featured media is a model\n\n\n          if (mediaType == 'model') {\n            // If model container has class is-selected then play the model\n            autoplayModel();\n          } // Unbind settle event\n\n\n          $el.off('settle.flickity');\n        });\n      }); // Detect keyboard 'ENTER' key on slider arrows\n\n      $sliderArrows.on('keypress', function (event) {\n        if (event.which == 13) {\n          $el.focus();\n          $el.attr('tabindex', 0);\n          $el.find('.product-gallery__image').attr('tabindex', 0);\n        }\n      });\n      $thumbnails.on('click', function () {\n        // Change slide\n        var index = $(event.currentTarget).index();\n        $el.flickity('select', index); // Find out media type of featured media slide\n\n        var mediaType = $el.find('.product-gallery__image.is-selected').data('media-type');\n        $el.on('settle.flickity', function (event, index) {\n          // Run video autoplay logic if featured media is a video\n          if (mediaType == 'video' || mediaType == 'external_video') {\n            checkForVideos();\n          } // Autoplay model if featured media is a model\n\n\n          if (mediaType == 'model') {\n            // If model container has class is-selected then play the model\n            autoplayModel();\n          } // Unbind settle event\n\n\n          $el.off('settle.flickity');\n        });\n      }); // Added functionality for keyboard 'enter' key\n\n      $thumbnails.keypress(function (event) {\n        var index = $(event.currentTarget).index();\n\n        if (event.which == 13) {\n          // Change slide\n          $el.flickity('select', index); // Find selected slide\n\n          var $selectedSlide = $el.find('.product-gallery__image.is-selected'); // Find out media type of featured media slide\n\n          var mediaType = $selectedSlide.data('media-type'); // Bring focus to media inside selected slide once slide has finished animation\n\n          $el.on('settle.flickity', function (event, index) {\n            $selectedSlide.find('[data-youtube-video]').attr('tabindex', '0');\n            $selectedSlide.find('model-viewer, .plyr, .product-gallery__link').focus(); // Run video autoplay logic if featured media is a video\n\n            if (mediaType == 'video' || mediaType == 'external_video') {\n              checkForVideos();\n            } // Autoplay model if featured media is a model\n\n\n            if (mediaType == 'model') {\n              // If model container has class is-selected then play the model\n              autoplayModel();\n            } // Unbind settle event\n\n\n            $el.off('settle.flickity');\n          });\n        }\n      });\n    }\n\n    function autoplayModel() {\n      $.each(galleryObject.models, function (index, model) {\n        var $slide = $(model.container).parents('.product-gallery__image');\n\n        if ($slide.hasClass('is-selected')) {\n          model.play();\n        }\n      });\n    }\n\n    function checkForVideos() {\n      $slides.each(function (index, slide) {\n        // Variables\n        var $slide = $(slide);\n        var mediaType = $slide.data('media-type');\n        var videoID = $slide.find('video').data('plyr-video-id');\n        var $iframeVideo = $slide.find('iframe');\n        var iframeID = $iframeVideo.attr('id');\n\n        if ($slide.hasClass('is-selected')) {\n          if (mediaType == 'video') {\n            videoID = $slide.find('video').data('plyr-video-id');\n\n            if (videoID) {\n              autoplayVideo(videoID, $slide);\n            }\n          } else if (mediaType == 'external_video') {\n            if (iframeID) {\n              autoplayYoutubeVideo(iframeID, $slide);\n            }\n          }\n        }\n      });\n    }\n\n    function autoplayVideo(videoID, $slide) {\n      // Compare id to player object and only play that video\n      $.each(galleryObject.videoPlayers, function (index, player) {\n        if (player.id == videoID) {\n          player.play(); // On fullscreen exit, focus on the thumbnail nav\n\n          player.on('exitfullscreen', function (event) {\n            var $thumbnailProductGallery = $slide.closest('.product-gallery').find('.product-gallery__thumbnails');\n\n            if ($thumbnailProductGallery.hasClass('vertical-slider-enabled')) {\n              $thumbnailProductGallery.attr('tabindex', '0').focus();\n            } else {\n              $thumbnailProductGallery.focus();\n            }\n          });\n        }\n      });\n    }\n\n    function autoplayYoutubeVideo(iframeID, $slide) {\n      // compare id to player object and only play that video\n      $.each(galleryObject.videoPlayers, function (index, player) {\n        if (player.playing) {\n          player.pause();\n        }\n\n        if (player.media.id == iframeID) {\n          player.play(); // On fullscreen exit, focus on the thumbnail nav\n\n          player.on('exitfullscreen', function (event) {\n            var $thumbnailProductGallery = $slide.closest('.product-gallery').find('.product-gallery__thumbnails');\n\n            if ($thumbnailProductGallery.hasClass('vertical-slider-enabled')) {\n              $thumbnailProductGallery.attr('tabindex', '0').focus();\n            } else {\n              $thumbnailProductGallery.focus();\n            }\n          });\n        }\n      });\n    } // Thumbnail gallery logic begins\n\n\n    if (galleryObject.thumbnailsEnabled == true) {\n      if (galleryObject.thumbnailsSliderEnabled == true && $slides.length > 1) {\n        // If desktop determine which slider we build\n        if (window.PXUTheme.media_queries.large.matches) {\n          // If thumbnail position is left/right then vertical slider gets enabled\n          if (galleryObject.thumbnailsPosition == 'left-thumbnails' || galleryObject.thumbnailsPosition == 'right-thumbnails') {\n            $thumbnailProductGallery.css('max-height', $el.closest('.product-gallery__main').outerHeight());\n            $thumbnailProductGallery.addClass('vertical-slider-enabled');\n            $thumbnails.on('click', function (event) {\n              var index = $(event.currentTarget).index();\n              $el.flickity('select', index);\n            });\n            var navCellHeight = $thumbnails.height();\n            var navHeight = $thumbnailProductGallery.height();\n            $el.on('select.flickity', function () {\n              // set selected nav cell\
1n              var flkty = $el.data('flickity');\n              $thumbnailProductGallery.find('.is-nav-selected').removeClass('is-nav-selected');\n              var $selected = $thumbnails.eq(flkty.selectedIndex).addClass('is-nav-selected'); // scroll nav\n\n              var scrollY = $selected.position().top + $thumbnailProductGallery.scrollTop() - (navHeight + navCellHeight) / 2;\n              $thumbnailProductGallery.animate({\n                scrollTop: scrollY\n              });\n            });\n          } else {\n            $thumbnailProductGallery.flickity({\n              cellAlign: 'center',\n              contain: true,\n              groupCells: '80%',\n              imagesLoaded: true,\n              pageDots: false,\n              prevNextButtons: $thumbnails.length > 5 ? galleryObject.thumbnailsArrows : false,\n              asNavFor: $el[0],\n              arrowShape: arrowShape\n            });\n            $thumbnailProductGallery.on('settle.flickity', function () {\n              $thumbnailProductGallery.flickity('resize');\n            });\n            $(window).on('load', function () {\n              $thumbnailProductGallery.flickity('resize');\n            }); // Once thumbnail is focused, move carousel to that cell\n\n            $.each($thumbnails, function (index, thumbnail) {\n              var $thumbnail = $(thumbnail);\n\n              if ($thumbnail.hasClass('is-selected')) {\n                $thumbnail.on('focus', function () {\n                  $thumbnailProductGallery.flickity('selectCell', index);\n                });\n              }\n            });\n          }\n        } else {\n          // If not on desktop, create standard thumbnail slider\n          $thumbnailProductGallery.flickity({\n            cellAlign: 'center',\n            contain: true,\n            groupCells: '80%',\n            imagesLoaded: true,\n            pageDots: false,\n            prevNextButtons: $thumbnails.length > 5 ? galleryObject.thumbnailsArrows : false,\n            asNavFor: $el[0],\n            arrowShape: arrowShape\n          });\n        }\n      } else {\n        // If thumbnail slider is disabled, ensure thumbnails can still navigate product images\n        $thumbnailProductGallery.find('.product-gallery__thumbnail').on('click', function () {\n          var index = $(this).index();\n          $el.flickity('selectCell', index);\n        });\n      }\n    }\n  },\n  launchProductMedia: function (galleryObject) {\n    // function to check if browser is IE\n    var isIE11 = !!navigator.userAgent.match(/Trident.*rv\\:11\\./); // Ensure product media libraries are present\n\n    if (!isIE11) {\n      window.Shopify.loadFeatures([{\n        name: 'shopify-xr',\n        version: '1.0'\n      }, {\n        name: 'model-viewer-ui',\n        version: '1.0'\n      }], onAllFeaturesLoaded);\n    } // Enable looping for videos based off their section setting\n    // Find videos where they are contained within this section\n    // Set looping\n\n\n    $.each(galleryObject.videoPlayers, function (index, player) {\n      var $wrapper = $(player.elements.wrapper);\n\n      if (galleryObject.sectionID != null) {\n        var $section = $wrapper.parents('.shopify-section').attr('id', galleryObject.sectionID);\n        var loopingEnabled = $section.find(galleryObject.element).find('.product-gallery__main').data('video-looping-enabled');\n      } else {\n        var loopingEnabled = galleryObject.element.find('.product-gallery__main').data('video-looping-enabled');\n      }\n\n      player.loop = loopingEnabled;\n    }); // 3D Model Setup\n\n    var config = {\n      // Default control list\n      controls: ['zoom-in', 'zoom-out', 'fullscreen'],\n      focusOnPlay: false\n    };\n\n    function onAllFeaturesLoaded() {\n      // If product media enabled look for model-viewer tags and setup\n      galleryObject.models = [];\n      var $models = $($('model-viewer', galleryObject.element));\n      $models.each(function (index, model) {\n        model = new Shopify.ModelViewerUI(model, config);\n        galleryObject.models.push(model);\n      });\n    }\n  },\n  enableVideoOnHover: function ($thumbnail) {\n    var $html5Video = $thumbnail.find('[data-html5-video]');\n    var $youtubeVideo = $thumbnail.find('[data-youtube-video]');\n    var videoID;\n\n    if ($html5Video.length > 0) {\n      videoID = $html5Video.find('[data-plyr-video-id]').data('plyr-video-id');\n    } else if ($youtubeVideo.length > 0) {\n      videoID = $youtubeVideo.find('iframe').attr('id');\n    }
1\n\n    if (videoID) {\n      $.each(secondaryMediaPlayers, function (index, player) {\n        if (player.id == videoID || player.media.id == videoID) {\n          player.toggleControls(false);\n          player.muted = true;\n          player.play();\n        }\n      });\n    }\n  },\n  disableVideoOnHover: function ($thumbnail) {\n    var $html5Video = $thumbnail.find('[data-html5-video]');\n    var $youtubeVideo = $thumbnail.find('[data-youtube-video]');\n    var videoID;\n\n    if ($html5Video.length > 0) {\n      videoID = $html5Video.find('[data-plyr-video-id]').data('plyr-video-id');\n    } else if ($youtubeVideo.length > 0) {\n      videoID = $youtubeVideo.find('iframe').attr('id');\n    }\n\n    if (videoID) {\n      $.each(secondaryMediaPlayers, function (index, player) {\n        if (player.id == videoID || player.media.id == videoID) {\n          if (player.playing) {\n            player.pause();\n          }\n        }\n      });\n    }\n  },\n  loadPlyr: function (galleryObject, videos, showSecondaryMedia) {\n    // Initializes Plyr library for HTML5 and YouTube videos in Product Gallery\n    utilities.launchVideoPlayer(Plyr, galleryObject, videos, showSecondaryMedia);\n\n    if (galleryObject) {\n      // Adds plyr video id to video wrapper\n      $.each(galleryObject.videoPlayers, function (index, player) {\n        var source = player.provider;\n        var id = player.id;\n        var $video;\n\n        if (source == 'html5') {\n          $video = $(player.elements.wrapper).find('video');\n          $video.attr('data-plyr-video-id', id);\n        }\n      });\n    }\n  },\n  loadProductRecommendations: function () {\n    var $productRecommendations = $('.product-recommendations');\n    var productID = $productRecommendations.data('product-id');\n    var limit = $productRecommendations.data('limit');\n    var recommendationsURL = $productRecommendations.data('recommendations-url');\n    var sectionEnabled = $productRecommendations.data('enabled');\n    var sectionId = $productRecommendations.data('section-id');\n    if (!sectionEnabled) return; // Build request URL\n\n    var requestUrl = recommendationsURL + \"?section_id=\" + sectionId + \"&limit=\" + limit + \"&product_id=\" + productID;\n    $.ajax({\n      type: 'GET',\n      url: requestUrl,\n      success: function (data) {\
1n        if (!sectionEnabled) {\n          return;\n        }\n\n        var $recommendedProductsElement = $(data).find('.product-recommendations').html(); // Insert product list into the product  recommendations container\n\n        $productRecommendations.html($recommendedProductsElement); // Initialize shopify payment buttons\n\n        if (Shopify.PaymentButton) {\n          Shopify.PaymentButton.init();\n        }\n\n        window.collection.init(); // Active swatch functionality for the recommended product quick shop\n\n        window.product.productSwatches();\n\n        if (window.PXUTheme.theme_settings.collection_secondary_image) {\n          window.collection.showSecondaryImage();\n        }\n      }\n    });\n  },\n  unload: function ($target) {\n    // Destroy Flickity slider\n    var $gallerySlider = $target.find('.product-gallery__main');\n    var $thumbnailSlider = $target.find('.product-gallery__thumbnails');\n    $gallerySlider.flickity('destroy');\n    $thumbnailSlider.flickity('destroy');\n    document.removeEventListener('lazyloaded', window.product.enableZoom);\n  }\n};\n/*============================================================================\n  Product form\n==============================================================================*/\n\nwindow.productFormListeners = {\n  init: function () {\n    $(document).on(\"click\", \".minus\", function (e) {\n      var quantity = parseInt($(this).next(\"input\").val());\n      quantity -= 1;\n      $(this).next(\"input\").val(quantity);\n\n      if (quantity == 0) {\n        $(this).closest('li.cart_item').slideUp();\n        setTimeout(ajaxSubmitCart, 500);\n      } else {\n        $(this).next(\"input\").trigger('change');\n      }\n\n      e.stopPropagation();\n      e.preventDefault();\n      return false;\n    });\n    $(document).on(\"click\", \".plus\", function (e) {\n      var quantity = parseInt($(this).prev(\"input\").val());\n      quantity += 1;\n      $(this).prev(\"input\").val(quantity).trigger('change');\n      e.stopPropagation();\n      e.preventDefault();\n      return false;\n    }); // Prevent the default behavior of the cart link when the quantity input is clicked\n\n    $(document).on('click', '.cart__quantity input.quantity', function (e) {\n      return false;\n    });\n    $(document).on(\"change\", \"#cart_form input[type='number']\", function () {\n      $(\"#cart_form\").submit();\n    });\n\n    if ($('.tos_agree').length) {\n      $('body').on('click', 'input[type=\"submit\"]', function () {\n        if ($(this).parents('form').find('.tos_agree').length) {\n          if ($(this).parents('form').find('.tos_agree').is(':checked')) {\n            $(this).submit();\n          } else {\n            alert(window.PXUTheme.translation.agree_to_terms_warning);\n            return false;\n          }\n        } else {\n          $(this).submit();\n        }\n      });\n    }\n  },\n  unload: function () {}\n};\n/*============================================================================\n  Collection\n==============================================================================*/\n\nwindow.collection = {\n  init: function () {\n    if (window.PXUTheme.theme_settings.collection_swatches) {\n      if (window.PXUTheme.media_queries.large.matches) {\n        $('.thumbnail').hover(function () {\n          $('.swatch span', $(this)).each(function () {\n            if ($(this).data(\"image\").indexOf(\"no-image\") == -1) {\n              $('<img/>')[0].src = $(this).data(\"image\");\n            }\n          });\n        });\n        $('.swatch span').hover(function () {\n          if ($(this).data(\"image\").indexOf(\"no-image\") == -1) {\n            $(this).parents('.thumbnail').find('img').attr('src', $(this).data(\"image\"));\n            $(this).parents('.thumbnail').find('img').attr('srcset', $(this).data(\"image\"));\n          }\n        });\n      }\n    } // Remove the Quick shop button and Fancybox data attributes on mobile devices\n\n\n    if (window.PXUTheme.device.hasTouch.matches) {\n      $('.quick_shop').remove();\n      $('.quick_shop--list').removeAttr('data-fancybox data-src data-gallery');\n    } // Display the Quick shop on desktop\n\n\n    if (window.PXUTheme.media_queries.large.matches) {\n      $('.quick_shop, .quick_shop--list').fancybox({\n        baseClass: 'quick-shop__lightbox product-' + product.id,\
1n        hash: false,\n        infobar: false,\n        toolbar: false,\n        loop: false,\n        smallBtn: true,\n        video: {\n          autoStart: false\n        },\n        touch: false,\n        mobile: {\n          preventCaptionOverlap: false,\n          toolbar: true,\n          buttons: [\"close\"]\n        },\n        afterShow: function (e) {\n          // When the modal is opened, prevent scrolling\n          document.documentElement.classList.add('scroll-locked');\n          var productUrl = $(e.current.src).data('url');\n          _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_11__.default.load(productUrl, {\n            view: 'quickshop'\n          }).then(({\n            data,\n            html\n          }) => {\n            $(e.current.src + '.modal').html(html.content);\n            window.product.init(); // Initialize shopify payment buttons\n\n            if (Shopify.PaymentButton) {\n              Shopify.PaymentButton.init();\n            } // Grab the fancybox element that is being clicked\n\n\n            var $fancyboxImageElement = $(this.opts.$orig);\n            var $gallery = $('.' + $fancyboxImageElement.data('gallery'));\n            var selector = $('.fancybox-is-open').find('.selector-wrapper select');\n            var $productForm = $('.fancybox-is-open .js-product_section').find('.product_form'); //Link sold out options when there is more than one option available\n\n            if (window.PXUTheme.theme_settings.product_form_style == 'swatches') {\n              var JSONData = $productForm.data('product');\n              var productID = $productForm.data('product-id');\n              var productSection = '.product-' + productID + ' .js-product_section';\n              var swatchOptions = $productForm.find('.swatch-options .swatch');\n\n              if (swatchOptions.length > 1) {\n                Shopify.linkOptionSelectors(JSONData, productSection);\n              }\n            }\n\n            selector.trigger('change'); // Global variables\n\n            var $gallery = $('.' + $fancyboxImageElement.data('gallery'));\n            var galleryObject = {\n              element: $gallery,\n              thumbnailsEnabled: $gallery.parents('.product_section').data('thumbnails-enabled'),\n              thumbnailsSliderEnabled: $gallery.parents('.product_section').data('thumbnails-slider-enabled'),\n              thumbnailsPosition: $gallery.parents('.product_section').data('thumbnails-position'),\n              thumbnailsArrows: $gallery.parents('.product_section').data('gallery-arrows-enabled'),\n              slideshowAnimation: $gallery.parents('.product_section').data('slideshow-animation'),\n              slideShowSpeed: $gallery.parents('.product_section').data('slideshow-speed'),\n              activateZoom: $gallery.parents('.product_section').data('activate-zoom'),\n              productMediaSupported: $gallery.parents('.product_section').data('product-media-supported'),\n              loopingEnabled: $gallery.data('video-looping-enabled'),\n              sectionID: null\n            };\n            window.product.enableSlider(galleryObject);\n\n            if (galleryObject.productMediaSupported) {\n              // Find videos within gallery section\n              var thumbnailVideos;\n              thumbnailVideos = $(galleryObject.element).find('[data-html5-video] video, [data-youtube-video]').get();\n              window.product.loadPlyr(galleryObject, thumbnailVideos);\n              window.product.launchProductMedia(galleryObject);\n            } // Hover to zoom\n\n\n            if (galleryObject.activateZoom) {\n              document.addEventListener('lazyloaded', window.product.enableZoom);\n            } // Initialize tabs\n\n\n            const quickshopTabs = $('.product_section.is-quickshop').find('ul.tabs');\n\n            if (quickshopTabs) {\n              quickshopTabs.each(function () {\n                const tab = $(this).find('> li > a');\n                tab.click(function (e) {\n                  const contentLocation = $(this).attr('href');\n\n                  if (contentLocation.charAt(0) == \"#\") {\n                    e.preventDefault();\n                    tab.removeClass('active');\n                    $(this).addClass('active');\n                    $(this).parents('ul.tabs').next().find(contentLocation).show().css({\n                      'display': 'block'\n                    }).addClass('active').siblings().hide().removeClass('active');\n                  }\n                });\n              });\n            }\n          });\n        },\n        afterClose: function () {\n          // When the modal is closed, allow scrolling\n          document.documentElement.classList.remove('scroll-locked'); // Grab the fancybox element that is being clicked\n\n          var $fancyboxImageElement = $(this.opts.$orig);\n          var $gallery = $('.' + $fancyboxImageElement.data('gallery')); // Find videos in gallery\n          // Find IDs and match against player\n          // If videos are playing, pause them\n\n          var $videosInGallery = $gallery.find('.product-gallery__image[data-media-type=\"video\"], .product-gallery__image[data-media-type=\"external_video\"]');\n          $videosInGallery.each(function (index, video) {\n            var $iframeVideo = $(video).find('iframe');\n            var iframeID = $iframeVideo.attr('id');\n            var $html5Video = $(video).find('[data-html5-video]');\n            var videoID = $html5Video.find('video').data('plyr-video-id'); // Pause videos if IDs match\n\n            if ($html5Video.length || $iframeVideo.length) {\n              $.each(globalPlayersArray, function (index, player) {\n                if (videoI
1D) {\n                  if (player.id == videoID && player.playing) {\n                    player.pause();\n                  }\n                } else if (iframeID) {\n                  if (player.media.id == iframeID && player.playing) {\n                    player.pause();\n                  }\n                }\n              });\n            }\n          });\n          document.removeEventListener('lazyloaded', window.product.enableZoom);\n        }\n      });\n    }\n\n    if ($('[data-faceted-filters]').length) {\n      facetedFiltering.init();\n    }\n\n    $('#sort-by').val($('#sort-by').data('default-sort'));\n    $('body').on('change', '#sort-by', function () {\n      const sortValue = $('#sort-by').val();\n      let newQuery;\n\n      if (location.search.length) {\n        const currentQueryArray = location.search.replace('?', '').split('&');\n        const newQueryArray = [];\n\n        if (!location.search.includes('sort_by')) {\n          newQueryArray.push(`sort_by=${sortValue}`);\n        }\n\n        currentQueryArray.forEach(query => {\n          const splitQuery = query.split('=');\n          const queryKey = splitQuery[0];\n          let queryValue = splitQuery[1];\n\n          if (queryKey === 'sort_by') {\n            queryValue = sortValue;\n          }\n\n          newQueryArray.push(`${queryKey}=${queryValue}`);\n        });\n        newQuery = newQueryArray.join('&');\n      } else {\n        newQuery = `sort_by=${sortValue}`;\n      }\n\n      window.location = `?${newQuery}`;\n    });\n\n    if (window.PXUTheme.theme_settings.collection_secondary_image) {\n      window.collection.showSecondaryImage();\n    }\n  },\n  showSecondaryImage: function () {\n    // Will be enabled on non-touch devices and screen sizes larger than 960px\n    if (!window.PXUTheme.device.hasTouch.matches && window.PXUTheme.media_queries.larger.matches) {\n      // Load Plyr for videos as secondary media\n      var secondaryMediaVideos;\n      secondaryMediaVideos = $('.thumbnail').find('[data-html5-video] video, [data-youtube-video]').get(); // If recommended products available, check for data-plyr-loaded attribute\n\n      var plyrLoaded = $('.shopify-section--recommended-products').find('.products').data('plyr-loaded');\n      let galleryObject = null;\n      let showSecondaryMedia = true;\n\n      if (!plyrLoaded) {\n        window.product.loadPlyr(galleryObject, secondaryMediaVideos, showSecondaryMedia);\n      }\n\n      $('.has-secondary-media-swap').off().on('mouseenter', function () {\n        $(this).find('.image-element__wrap img').toggleClass('secondary-media-hidden');\n        $(this).find('[data-html5-video]').toggleClass('secondary-media-hidden');\n        $(this).find('.external-video__container').toggleClass('secondary-media-hidden');\n        window.product.enableVideoOnHover($(this));\n      });\n      $('.has-secondary-media-swap').on('mouseleave', function () {\n        $(this).find('.image-element__wrap img').toggleClass('secondary-media-hidden');\n        $(this).find('[data-html5-video]').toggleClass('secondary-media-hidden');\n        $(this).find('.external-video__container').toggleClass('secondary-media-hidden');\n        window.product.disableVideoOnHover($(this));\n      });\n    }\n  },\n  unload: function ($target) {\n    $target.find('.thumbnail').off('mouseenter mouseleave');\n    $('body').off('change', '#sort-by');\n    $target.find('.quick_shop, .quick_shop--list').off('click.fb');\n    $target.find('[data-filter-modal-open]').off('click');\n    $(window).off('resize.filtering');\n  }\n};\n/*============================================================================\n  Faceted Filtering\n==============================================================================*/\n\nvar facetedFiltering = {\n  init: function () {\n    const filterRange = document.querySelectorAll('[data-filter-range]');\n    const filterCheckboxes = document.querySelectorAll('[data-filter-input]');\n    const rangeNames = [];\n    filterCheckboxes.forEach(function (checkbox) {\n      $(checkbox).on('click', function (e) {\n        e.stopPropagation();\n        e.preventDefault();\n        const target = e.currentTarget;\n        if (target.hasAttribute('data-disabled')) return; // Toggle checked state\n\n        target.querySelector('[data-filter-checkbox]').toggleAttribute('data-filter-checked');\n        window.location = target.dataset.url;\n      });\n    });\n    /* For range input */\n\n    filterRange.forEach(function (filter) {\n      rangeNames.push(filter.name);\n    });\n    $('[data-range-filter-button]').on('click', function (e) {\n      facetedFiltering.getFilteredResults(e.currentTarget, rangeNames);\n    });\n    $('[data-filter-modal-open]').on('click', function (e) {\n      e.preventDefault();\n      $.fancybox.open($('[data-filter-modal]'), {\n        baseClass: 'faceted-filter-modal',\n        hash: false,\n        infobar: false,\n        toolbar: false,\n        loop: true,\n        smallBtn: true,\n        touch: false,\n        mobile: {\
1n          preventCaptionOverlap: false,\n          toolbar: true,\n          buttons: [\"close\"]\n        },\n        afterShow: function () {\n          $(document.documentElement).addClass('scroll-locked');\n        },\n        afterClose: function () {\n          $(document.documentElement).removeClass('scroll-locked');\n        }\n      });\n    });\n    $(window).on('resize.filtering', function (e) {\n      if (window.innerWidth >= 799) {\n        $('[data-filter-modal]').removeAttr('style');\n      }\n    });\n  },\n  getFilteredResults: function (element, rangeNames) {\n    let searchParameters;\n    const currentSearch = window.location.search.replace('?', '');\n    const formData = new FormData(element.closest('form'));\n    const newSearch = new URLSearchParams(formData).toString(); // Filter through current search string to see if price range input already exists,\n    // if it does, create new string without current price range parameters\n\n    const splitCurrentSearch = currentSearch.split('&');\n    let filteredCurrentSearch = splitCurrentSearch.filter(search => {\n      if (search.includes(rangeNames[0]) || search.includes(rangeNames[1])) {\n        return false;\n      }\n\n      return true;\n    });\n    filteredCurrentSearch = filteredCurrentSearch.join('&'); // If current search parameters exist, append new search parameters\n    // on to existing parameters\n\n    if (filteredCurrentSearch.length > 0) {\n      searchParameters = `${filteredCurrentSearch}&${newSearch}`;\n    } else {\n      searchParameters = `${newSearch}`;\n    }\n\n    let urlQueryString = '';\n\n    if (searchParameters) {\n      urlQueryString = `?${searchParameters}`;\n    } else if (searchParameters) {\n      urlQueryString = `?${searchParameters}`;\n    }\n\n    window.location.search = urlQueryString;\n  }\n};\n/*============================================================================\n  Map\n==============================================================================*/\n\nwindow.map = {\n  init: function () {\n    if ($(\".shopify-section--map .map, .shopify-section--page-contact-template .map\").hasClass('js-api-map')) {\n      var mapsToLoad = []; //Create map settings array\n\n      $('.map').each(function (i, obj) {\n        mapsToLoad.push(this);\n        mapsToLoad[i].sectionid = $(this).data('id');\n        mapsToLoad[i].address = $(this).data('address');\n        mapsToLoad[i].directions = $(this).data('directions-address');\n        mapsToLoad[i].zoom = $(this).data('zoom');\n        mapsToLoad[i].mapstyle = $(this).data('style');\n        mapsToLoad[i].showpin = $(this).data('pin');\n        mapsToLoad[i].apikey = $(this).data('api-key');\n      });\n      $.each(mapsToLoad, function (i, instance) {\n        //Enable caching to avoid duplicate google maps files\n        $.ajaxSetup({\n          cache: true\n        }); //Load maps script and find location coordinates\n\n        $.getScript('https://maps.googleapis.com/maps/api/js?key=' + mapsToLoad[i].apikey).then(function () {\n          window.map.findLocation(mapsToLoad[i]);\n          $.ajaxSetup({\n            cache: false\n          });\n        });\n      });\n    }\n  },\n  findLocation: function (mapArray) {\n    var geoLat;\n    var geoLng;\n    var geocoder = new google.maps.Geocoder(); //Find and set coordinates\n\n    geocoder.geocode({\n      'address': mapArray.address\n    }, function (results, status) {\n      if (status == google.maps.GeocoderStatus.OK) {\n        geoLat = results[0].geometry.location.lat();\n        geoLng = results[0].geometry.location.lng(); //Create map\n\n        window.map.initMap(geoLat, geoLng, mapArray);\n      }\n    });\n  },\n  initMap: function (lat, lng, mapArray) {\n    var location = {\n      lat: lat,\n      lng: lng\n    };\n    var styleJson = []; //Set style JSON\n\n    if (mapArray.mapstyle == 'aubergine') {\n      styleJson = [{\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#1d2c4d\"\n        }]\n      }, {\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#8ec3b9\"\n        }]\n      }, {\n        \"elementType\": \"labels.text.stroke\",\n        \"stylers\": [{\n          \"color\": \"#1a3646\"\n        }]\n      }, {\n        \"featureType\": \"administrative.country\",\n        \"elementType\": \"geometry.stroke\",\n        \"stylers\": [{\n          \"color\": \"#4b6878\"\n        }]\n      }, {\n        \"featureType\": \"administrative.land_parcel\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#64779e\"\n        }]\n      }, {\n        \"featureType\": \"administrative.province\",\n        \"elementType\": \"geometry.stroke\",\n        \"stylers\": [{\n          \"color\": \"#4b6878\"\n        }]\n      }, {\n        \"featureType\": \"landscape.man_made\",\n        \"elementType\": \"geometry.stroke\",\n        \"stylers\": [{\n          \"color\": \"#334e87\"\n        }]\n      }, {\n        \"featureType\": \"landscape.natural\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#023e58\"\n        }]\n      }, {\n        \"featureType\": \"poi\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#283d6a\"\n        }]\n      }, {\n        \"featureType\": \"poi\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#6f9ba5\"\n        }]\n      }, {\n        \"featureType\": \"poi\",\n        \"elementType\": \"labels.text.stroke\",\n        \"stylers\": [{\n          \"color\": \"#1d2c4d\"\n        }]\n      }, {\n        \"featureType\": \"poi.park\",\n        \"elementType\": \"geometry.fill\",\n        \"stylers\": [{\n          \"color\": \"#023e58\"\n        }]\n      }, {\n        \"featureType\": \"poi.park\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#3C7680\"\n        }]\n      }, {\n        \"featureType\": \"road\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#304a7d\"\n        }]\n      }, {\n        \"featureType\": \"road\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#98a5be\"\n        }]\n      }, {\n        \"featureType\": \"road\",\n        \"elementType\": \"labels.text.stroke\",\n        \"stylers\": [{\n          \"color\": \"#1d2c4d\"\n        }]\n      }, {\n        \"featureType\": \"road.highway\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#2c6675\"\n        }]\n      }, {\n        \"featureType\": \"road.highway\",\n        \"elementType\": \"geometry.stroke\",\n        \"stylers\": [{\n          \"color\": \"#255763\"\n        }]\n      }, {\n        \"featureType\": \"road.highway\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#b0d5ce\"\n        }]\n      }, {\n        \"featureType\": \"road.highway\",\n        \"elementType\": \"labels.text.stroke\",\n        \"stylers\": [{\n          \"color\": \"#023e58\"\n        }]\n      }, {\n        \"featureType\": \"transit\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#98a5be\"\n        }]\n      }, {\n        \"featureType\": \"transit\",\n        \"elementType\": \"labels.text.stroke\",\n        \"stylers\": [{\n          \"color\": \"#1d2c4d\"\n        }]\n      }, {\n        \"featureType\": \"transit.line\",\n        \"elementType\": \"geometry.fill\",\n        \"stylers\": [{\n          \"color\": \"#283d6a\"\n        }]\n      }, {\n        \"featureType\": \"transit.station\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#3a4762\"\n        }]\n      }, {\n        \"featureType\": \"water\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#0e1626\"\n        }]\n      }, {\n        \"featureType\": \"water\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#4e6d70\"\n        }]\n      }];\n    } else if (mapArray.mapstyle == 'retro') {\n      styleJson = [{\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#ebe3cd\"\n        }]\n      }, {\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#523735\"\n        }]\n      }, {\n        \"elementType\": \"labels.text.stroke\",\n        \"stylers\": [{\n          \"color\": \"#f5f1e6\"\n        }]\n      }, {\n        \"featureType\": \"administrative\",\n        \"elementType\": \"geometry.stroke\",\n        \"stylers\": [{\n          \"color\": \"#c9b2a6\"\n        }]\n      }, {\n        \"featureType\": \"administrative.land_parcel\",\n        \"elementType\": \"geometry.stroke\",\n        \"stylers\": [{\n          \"color\": \"#dcd2be\"\n        }]\n      }, {\n        \"featureType\": \"administrative.land_parcel\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#ae9e90\"\n        }]\n      }, {\n        \"featureType\": \"landscape.natural\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#dfd2ae\"\n        }]\n      }, {\n        \"featureType\": \"poi\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#dfd2ae\"\n        }]\n      }, {\n        \"featureType\": \"poi\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#93817c\"\n        }]\n      }, {\n        \"featureType\": \"poi.park\",\n        \"elementType\": \"geometry.fill\",\n        \"stylers\": [{\n          \"color\": \"#a5b076\"\n        }]\n      }, {\n        \"featureType\": \"poi.park\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#447530\"\n        }]\n      }, {\n        \"featureType\": \"road\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#f5f1e6\"\n        }]\n      }, {\n        \"featureType\": \"road.arterial\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#fdfcf8\"\n        }]\n      }, {\n        \"featureType\": \"road.highway\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#f8c967\"\n        }]\n      }, {\n        \"featureType\": \"road.highway\",\n        \"elementType\": \"geometry.stroke\",\n        \"stylers\": [{\n          \"color\": \"#e9bc62\"\n        }]\n      }, {\n        \"featureType\": \"road.highway.controlled_access\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#e98d58\"\n        }]\n      }, {\n        \"featureType\": \"road.highway.controlled_access\",\n        \"elementType\": \"geometry.stroke\",\n        \"stylers\": [{\n          \"color\": \"#db8555\"\n        }]\n      }, {\n        \"featureType\": \"road.local\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#806b63\"\n        }]\n      }, {\n        \"featureType\": \"transit.line\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#dfd2ae\"\n        }]\n      }, {\n        \"featureType\": \"transit.line\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#8f7d77\"\n        }]\n      }, {\n        \"featureType\": \"transit.line\",\n        \"elementType\": \"labels.text.stroke\",\n        \"stylers\": [{\n          \"color\": \"#ebe3cd\"\n        }]\n      }, {\n        \"featureType\": \"transit.station\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#dfd2ae\"\n        }]\n      }, {\n        \"featureType\": \"water\",\n        \"elementType\": \"geometry.fill\",\n        \"stylers\": [{\n          \"color\": \"#b9d3c2\"\n        }]\n      }, {\n        \"featureType\": \"water\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#92998d\"\n        }]\n      }];\n    } else if (mapArray.mapstyle == 'silver') {\n      styleJson = [{\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#f5f5f5\"\n        }]\n      }, {\n        \"elementType\": \"labels.icon\",\n        \"stylers\": [{\n          \"visibility\": \"off\"\n        }]\n      }, {\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#616161\"\n        }]\n      }, {\n        \"elementType\": \"labels.text.stroke\",\n        \"stylers\": [{\n          \"color\": \"#f5f5f5\"\n        }]\n      }, {\n        \"featureType\": \"administrative.land_parcel\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#bdbdbd\"\n        }]\n      }, {\n        \"featureType\": \"poi\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#eeeeee\"\n        }]\n      }, {\n        \"featureType\": \"poi\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#757575\"\n        }]\n      }, {\n        \"featureType\": \"poi.park\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#e5e5e5\"\n        }]\n      }, {\n        \"featureType\": \"poi.park\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#9e9e9e\"\n        }]\n      }, {\n        \"featureType\": \"road\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#ffffff\"\n        }]\n      }, {\n        \"featureType\": \"road.arterial\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#757575\"\n        }]\n      }, {\n        \"featureType\": \"road.highway\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#dadada\"\n        }]\n      }, {\n        \"featureType\": \"road.highway\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#616161\"\n        }]\n      }, {\n        \"featureType\": \"road.local\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#9e9e9e\"\n        }]\n      }, {\n        \"featureType\": \"transit.line\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#e5e5e5\"\n        }]\n      }, {\n        \"featureType\": \"transit.station\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#eeeeee\"\n        }]\n      }, {\n        \"featureType\": \"water\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#c9c9c9\"\n        }]\n      }, {\n        \"featureType\": \"water\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#9e9e9e\"\n        }]\n      }];\n    } else if (mapArray.mapstyle == 'night') {\n      styleJson = [{\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#242f3e\"\n        }]\n      }, {\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#746855\"\n        }]\n      }, {\n        \"elementType\": \"labels.text.stroke\",\n        \"stylers\": [{\n          \"color\": \"#242f3e\"\n        }]\n      }, {\n        \"featureType\": \"administrative.locality\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#d59563\"\n        }]\n      }, {\n        \"featureType\": \"poi\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#d59563\"\n        }]\n      }, {\n        \"featureType\": \"poi.park\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#263c3f\"\n        }]\n      }, {\n        \"featureType\": \"poi.park\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\"
1: \"#6b9a76\"\n        }]\n      }, {\n        \"featureType\": \"road\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#38414e\"\n        }]\n      }, {\n        \"featureType\": \"road\",\n        \"elementType\": \"geometry.stroke\",\n        \"stylers\": [{\n          \"color\": \"#212a37\"\n        }]\n      }, {\n        \"featureType\": \"road\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#9ca5b3\"\n        }]\n      }, {\n        \"featureType\": \"road.highway\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#746855\"\n        }]\n      }, {\n        \"featureType\": \"road.highway\",\n        \"elementType\": \"geometry.stroke\",\n        \"stylers\": [{\n          \"color\": \"#1f2835\"\n        }]\n      }, {\n        \"featureType\": \"road.highway\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#f3d19c\"\n        }]\n      }, {\n        \"featureType\": \"transit\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#2f3948\"\n        }]\n      }, {\n        \"featureType\": \"transit.station\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#d59563\"\n        }]\n      }, {\n        \"featureType\": \"water\",\n        \"elementType\": \"geometry\",\n        \"stylers\": [{\n          \"color\": \"#17263c\"\n        }]\n      }, {\n        \"featureType\": \"water\",\n        \"elementType\": \"labels.text.fill\",\n        \"stylers\": [{\n          \"color\": \"#515c6d\"\n        }]\n      }, {\n        \"featureType\": \"water\",\n        \"elementType\": \"labels.text.stroke\",\n        \"stylers\": [{\n          \"color\": \"#17263c\"\n        }]\n      }];\n    } else {\n      styleJson = [];\n    } //Create google maps link\n\n\n    $('.js-map-link').attr('href', 'https://www.google.com/maps/place/' + mapArray.directions + '/@' + lat + ',' + lng); //Set map options\n\n    var mapOptions = {\n      zoom: mapArray.zoom,\n      center: location,\n      styles: styleJson,\n      disableDefaultUI: false\n    }; //Create map\n\n    var map = new google.maps.Map(document.getElementById(mapArray.sectionid), mapOptions); //Show pin\n\n    if (mapArray.showpin == true) {\n      var marker = new google.maps.Marker({\n        position: location,\n        map: map\n      });\n    }\n  }\n};\n/*============================================================================\n  Blogs\n==============================================================================*/\n\nwindow.blogs = {\n  init: function () {\n    $('body').on('change', '#tag_filter', function () {\n      const filterValue = $('#tag_filter').val();\n      window.location.pathname = filterValue;\n    });\n  },\n  unload: function () {\n    $('body').off('change', '#tag_filter');\n  }\n};\n/*============================================================================\n  Article\n==============================================================================*/\n\nwindow.article = {\n  init: function () {\n    window.banner_image.init();\n    window.banner.init();\n\n    if (window.location.pathname.indexOf('/comments') != -1) {\n      $('html,body').animate({\n        scrollTop: $(\"#new-comment\").offset().top - 140\n      }, 'slow');\n    }\n  },\n  unload: function ($target) {}\n};\n/*============================================================================\n  Utilities\n==============================================================================*/\n\nvar plyrUtils = {\n  playButtonIcon: '<button type=\"button\" class=\"plyr__control plyr__control--overlaid\" aria-label=\"Play, {title}\" data-plyr=\"play\"><svg class=\"play-icon-button-control\" width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"60\" height=\"60\" fill=\"white\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M23 20V40L39 29.4248L23 20Z\" fill=\"#323232\"/></svg><span class=\"plyr__sr-only\">Play</span></button>',\n  playButton: '<button type=\"button\" class=\"plyr__controls__item plyr__control\" aria-label=\"Play, {title}\" data-plyr=\"play\"><svg class=\"icon--pressed\" role=\"presentation\"><use xlink:href=\"#plyr-pause\"></use></svg><svg class=\"icon--not-pressed\" role=\"presentation\"><use xlink:href=\"#plyr-play\"></use></svg><span class=\"label--pressed plyr__tooltip\" role=\"tooltip\">
1Pause</span><span class=\"label--not-pressed plyr__tooltip\" role=\"tooltip\">Play</span></button>',\n  muteButton: '<button type=\"button\" class=\"plyr__controls__item plyr__control\" aria-label=\"Mute\" data-plyr=\"mute\"><svg class=\"icon--pressed\" role=\"presentation\"><use xlink:href=\"#plyr-muted\"></use></svg><svg class=\"icon--not-pressed\" role=\"presentation\"><use xlink:href=\"#plyr-volume\"></use></svg><span class=\"label--pressed plyr__tooltip\" role=\"tooltip\">Unmute</span><span class=\"label--not-pressed plyr__tooltip\" role=\"tooltip\">Mute</span></button>',\n  progressInput: '<div class=\"plyr__controls__item plyr__progress__container\"><div class=\"plyr__progress\"><input data-plyr=\"seek\" type=\"range\" min=\"0\" max=\"100\" step=\"0.01\" value=\"0\" aria-label=\"Seek\"><progress class=\"plyr__progress__buffer\" min=\"0\" max=\"100\" value=\"0\">% buffered</progress><span role=\"tooltip\" class=\"plyr__tooltip\">00:00</span></div></div>',\n  volume: '<div class=\"plyr__controls__item plyr__volume\"><input data-plyr=\"volume\" type=\"range\" min=\"0\" max=\"1\" step=\"0.05\" value=\"1\" autocomplete=\"off\" aria-label=\"Volume\"></div>',\n  fullscreen: '<button type=\"button\" class=\"plyr__controls__item plyr__control\" data-plyr=\"fullscreen\"><svg class=\"icon--pressed\" role=\"presentation\"><use xlink:href=\"#plyr-exit-fullscreen\"></use></svg><svg class=\"icon--not-pressed\" role=\"presentation\"><use xlink:href=\"#plyr-enter-fullscreen\"></use></svg><span class=\"label--pressed plyr__tooltip\" role=\"tooltip\">Exit fullscreen</span><span class=\"label--not-pressed plyr__tooltip\" role=\"tooltip\">Enter fullscreen</span></button>'\n};\nvar controls = plyrUtils.playButtonIcon + '<div class=\"plyr__controls\">' + plyrUtils.playButton + plyrUtils.progressInput + plyrUtils.muteButton + plyrUtils.volume + plyrUtils.fullscreen + '</div';\nvar globalPlayersArray = [];\nvar secondaryMediaPlayers;\nvar utilities = {\n  listenForResize: function () {\n    window.addEventListener('orientationchange', function (event) {\n      setTimeout(function () {\n        window.banner.init();\n      }, 100);\n    }); // Setup a timer\n\n    var resizeTimeout; // Listen for resize events\n\n    window.addEventListener('resize', function (event) {\n      // If timer is null, reset it to 66ms and run your functions.\n      // Otherwise, wait until timer is cleared\n      if (!resizeTimeout) {\n        resizeTimeout = setTimeout(function () {\n          // Reset timeout\n          resizeTimeout = null; // Run our resize functions\n\n          announcement_bar.setPadding();\n          window.animate_content.init();\n          window.header.setHeaderPosition();\n          window.banner_image.resetPadding();\n          window.banner_image.init();\n          window.banner.init();\n          window.header.dynamicDropdown();\n          window.header.setPadding();\n        }, 66);\n      }\n    }, false);\n  },\n  launchVideoPlayer: function (Plyr, galleryObject, videos, showSecondaryMedia) {\n    if (galleryObject != null) {\n      galleryObject.videoPlayers = Plyr.setup(videos, {\n        controls: controls,\n        fullscreen: {\n          enabled: true,\n          fallback: true,\n          iosNative: true\n        },\n        storage: {\n          enabled: false\n        }\n      }); // Going through galleries array and pushing players into master array\n\n      $.each(galleryObject.videoPlayers, function (index, player) {\n        globalPlayersArray.push(player);\n      });\n    } else if (showSecondaryMedia == true) {\n      // Collection page/Recommended Products secondary media\n      secondaryMediaPlayers = Plyr.setup(videos, {\n        controls: controls,\n        fullscreen: {\n          enabled: true,\n          fallback: true,\n          iosNative: true\n        },\n        storage: {\n          enabled: false\n        }\n      }); // Add data-attribute 'plyr-loaded=\"true\"' to videos container\n\n      $('.shopify-section--recommended-products').find('.products').attr('data-plyr-loaded', 'true');\n      $.each(secondaryMediaPlayers, function (index, player) {\n        globalPlayersArray.push(player);\n      }); // Adds plyr video id to video wrapper\n\n      $.each(globalPlayersArray, function (index, player) {\n        var source = player.provider;\n        var id = player.id;\n        var $video;\n\n        if (source == 'html5') {\n          $video = $(player.elements.wrapper).find('video');\n          $video.attr('data-plyr-video-id', id);\n        }\n      });\n      return secondaryMediaPlayers;\n    }\n  },\n  enableDisclosure: function () {\n    var $disclosure = $('[data-disclosure]');\n    var $toggle = $('[data-disclosure-toggle]');\n    var $disclosureWrap = $('.disclosure__list-wrap'); //Check if current opened menu is offscreen\n\n    function checkOffScreen($openedToggle) {\n      if ($openedToggle.siblings('.disclosure__list-wrap').is(':off-right')) {\n        $openedToggle.siblings('.disclosure__list-wrap').addClass('disclosure--left');\n      }\n    }\n\n    function closeDisclosures(ignoreTarget, currentTarget) {\n      if (ignoreTarget === true) {\n        $toggle.not(currentTarget).removeClass('is-cl
1icked');\n        $toggle.not(currentTarget).attr('aria-expanded', 'false');\n      } else {\n        $toggle.removeClass('is-clicked');\n        $toggle.attr('aria-expanded', 'false');\n      }\n\n      $disclosureWrap.removeClass('disclosure--left');\n    } //Close menus on ESC\n\n\n    $('body').on('keyup', function (e) {\n      if (e.which == '27') {\n        closeDisclosures();\n      }\n    }); //Close menus on hoverout\n\n    $disclosure.on('mouseleave', function (e) {\n      closeDisclosures();\n    }); //On click/focus event for toggling options\n\n    $toggle.on('mouseenter', function (e) {\n      //Close all other menus\n      closeDisclosures(true, this);\n      var $target = $(e.currentTarget);\n      $target.attr('aria-expanded', 'true').addClass('is-clicked');\n      checkOffScreen($target);\n    });\n    $toggle.on('keyup', function (e) {\n      if (e.which === 13) {\n        var $target = $(e.currentTarget);\n        $target.attr('aria-expanded', 'true').addClass('is-clicked');\n        checkOffScreen($target);\n      }\n    });\n    $disclosure.on('focusout', function (e) {\n      const list = e.currentTarget;\n      const nextEl = e.relatedTarget; // The element that would receive focus.\n      // If the nextEl is within the list (a list item), don't close the list\n\n      if (!list.contains(nextEl)) {\n        closeDisclosures(false, this);\n      }\n    }); //Mobile toggle logic\n\n    $toggle.on('touchstart', function (e) {\n      if (window.PXUTheme.media_queries.medium.matches || !window.PXUTheme.device.hasTouch.matches) {\n        var $target = $(e.currentTarget);\n        closeDisclosures(true, this);\n\n        if (!$target.hasClass('is-clicked')) {\n          $target.attr('aria-expanded', 'true').addClass('is-clicked');\n          checkOffScreen($target);\n        } else {\n          $target.attr('aria-expanded', 'false').removeClass('is-clicked');\n          $disclosureWrap.removeClass('disclosure--left');\n        }\n      }\n    });\n  },\n  addImageDimension: function (imageUrl, size) {\n    var insertPosition = imageUrl.lastIndexOf(\".\");\n    return imageUrl.substring(0, insertPosition) + size + imageUrl.substring(insertPosition);\n  },\n  unload: function () {\n    $('[data-disclosure]').off();\n    $('[data-disclosure-toggle]').off();\n    $('.disclosure__list-wrap').off();\n  }\n};\n\nvar toggleSidebarBlocks = function ($toggle) {\n  if ($toggle.parent().next('ul').is(':visible')) {\n    $toggle.parent().next('ul').hide();\n    $toggle.html('+');\n    $toggle.attr('aria-expanded', false);\n  } else {\n    $toggle.parent().next('ul').show();\n    $toggle.html('-');\n    $toggle.attr('aria-expanded', true);\n  }\n};\n\nvar toggleSidebarMenus = function ($toggle) {\n  var $content = $toggle.next('ul');\n  $content.slideToggle();\n  $toggle.toggleClass('active');\n  $toggle.attr('aria-expanded', $toggle.attr('aria-expanded') == 'true' ? 'false' : 'true');\n};\n\nwindow.animate_content = {\n  init: function () {\n    // added to the listenForResize method\n    if (window.PXUTheme.media_queries.large.matches || $(window).width() == 0) {\n      $(\".animate_right\").waypoint(function () {\n        $(this.element).addClass(\"animated fadeInRight\");\n      }, {\n        offset: '80%'\n      });\n      $(\".animate_left\").waypoint(function () {\n        $(this.element).addClass(\"animated fadeInLeft\");\n      }, {\n        offset: '80%'\n      });\n      $(\".animate_up\").waypoint(function () {\n        $(this.element).addClass(\"animated fadeInUp\");\n      }, {\n        offset: '80%'\n      });\n      $(\".animate_in\").waypoint(function () {\n        $(this.element).addClass(\"animated fadeIn\");\n      }, {\n        offset: '80%'\n      });\n      $(\".animate_down\").waypoint(function () {\n        $(this.element).addClass(\"animated fadeInDown\");\n      }, {\n        offset: '80%'\n      });\n    }\n  }\n};\n/*============================================================================\n  Cart\n==============================================================================*/\n\nwindow.cart = {\n  init: function () {\n    $(\"#address_country\").val($(\"#address_country\").data(\"default\")).change();\n  },\n  unload: function () {}\n};\n/*============================================================================\n  Predictive search\n==============================================================================*/\n\nwindow.predictiveSearch = {\n  init: function () {\n    this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_8__.default();\n    this.closeSearch = document.querySelector('[data-search-close]');\n    this.siteOverlay = document.querySelector('[data-site-overlay]');\n    this.siteOverlayAnimation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_9__.transition)({\n      el: this.siteOverlay\n    });\n    this.searchForms = document.querySelectorAll('[data-predictive-search-enabled-true]');
1\n    this.searchForms.forEach(form => {\n      const input = form.querySelector('[data-search-input]');\n      const results = form.querySelector('[data-search-results]');\n      const resultsContainer = form.querySelector('[data-search-results-container]');\n      const animation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_9__.transition)({\n        el: resultsContainer\n      });\n      this.events.register(form, 'submit', e => this._onSubmit(e, input));\n      this.events.register(window, 'resize', () => this._onResize(resultsContainer));\n      this.events.register(window, 'keyup', e => this._onKeyUp(e, form, input, animation));\n      this.events.register(this.closeSearch, 'click', () => this._close(form, animation));\n      this.events.register(input, 'focus', () => this._onFocus(form, input, results, resultsContainer, animation));\n      this.events.register(input, 'input', just_debounce__WEBPACK_IMPORTED_MODULE_10___default()(() => this._onChange(form, input, results, resultsContainer, animation)), 250);\n      this.events.register(document.body, 'click', e => {\n        if (form.classList.contains('search-form--active')) {\n          if (!form.contains(e.target) && !form.closest('.mobile-search')) {\n            this._close(form, animation);\n          }\n        }\n      });\n    });\n  },\n\n  _onSubmit(e, input) {\n    // Prevent empty form submissions\n    if (this._getQuery(input).length === 0) e.preventDefault();\n  },\n\n  _onResize(resultsContainer) {\n    this._resizeSearchResults(resultsContainer);\n  },\n\n  _onKeyUp(e, form, input, animation) {\n    if (e.code === 'Escape') {\n      input.value = '';\n\n      this._close(form, animation);\n\n      $('#search').removeClass(\"fadeIn\").hide();\n    }\n  },\n\n  _onBlur(form, animation) {\n    this._close(form, animation);\n\n    $('#search').removeClass(\"fadeIn\").hide();\n  },\n\n  _onFocus(form, input, results, resultsContainer, animation) {\n    const term = this._getQuery(input);\n\n    if (term.length === 0) return;\n\n    this._getSearchResults(term, form, results, resultsContainer, animation);\n\n    this._open(form, resultsContainer, animation);\n  },\n\n  _onChange(form, input, results, resultsContainer, animation) {\n    const term = this._getQuery(input);\n\n    if (term.length === 0) {\n      this._close(form, animation);\n\n      return;\n    }\n\n    this._getSearchResults(term, form, results, resultsContainer, animation);\n\n    this._open(form, resultsContainer, animation);\n  },\n\n  _getQuery(input) {\n    return input.value.trim();\n  },\n\n  _open(form, resultsContainer, animation) {\n    animation.animateTo('open').then(() => {\n      document.body.classList.add('scroll-locked');\n      form.classList.add('search-form--active');\n\n      if (form.classList.contains('search-form--overlay-enabled-true')) {\n        this.siteOverlayAnimation.animateTo('open');\n      }\n\n      if (form.closest('.mobile-search') || form.closest('.mobile-search-bar') && window.PXUTheme.media_queries.medium.matches) {\n        this.closeSearch.style.display = 'flex';\n      }\n\n      this._resizeSearchResults(resultsContainer);\n    });\n  },\n\n  _close(form, animation) {\n    animation.animateTo('closed').then(() => {\n      form.classList.remove('search-form--active');\n      document.body.classList.remove('scroll-locked');\n\n      if (form.classList.contains('search-form--overlay-enabled-true')) {\n        this.siteOverlayAnimation.animateTo('closed');\n      }\n\n      if (this.closeSearch && window.PXUTheme.theme_settings.mobile_search_location == 'below-header' && window.PXUTheme.media_queries.medium.matches) {\n        this.closeSearch.style.display = 'none';\n      }\n    });\n  },\n\n  _getSearchResults(term, form, results, resultsContainer, animation) {\n    const resourceType = form.classList.contains('search-form--blog') ? '&resources[type]=article' : '';\n    resultsContainer.setAttribute('data-loading', 'true');\n    fetch(`${window.PXUTheme.routes.predictive_search_url}?q=${term}${resourceType}&section_id=predictive-search`).then(response => {\n      if (!response.ok) {\n        const error = new Error(response.status);\n        throw error;\n      }\n\n      return response.text();\n    }).then(text => {\n      const resultsMarkup = new DOMParser().parseFromString(text, 'text/html').querySelector('#shopify-section-predictive-search').innerHTML;\n\n      this._renderSearchResults(resultsMarkup, form, results, resultsContainer, animation);\n    }).catch(error => {\n      throw error;\n    });\n  },\n\n  _renderSearchResults(resultsMarkup, form, results, resultsContainer, animation) {\n    resultsContainer.setAttribute('data-loading', 'false');\n    results.innerHTML = resultsMarkup;\n\n    this._registerEvents(form, animation);\n  },\n\n  _registerEvents(form, animation) {\n    this.searchButton = form.querySelector('[data-predictive-search-button]');\n    this.events.register(this.searchButton, 'blur', () => this._onBlur(form, animation));\n  },\n\n  _resizeSearchResults(resultsContainer) {\n    const offset = 3
10;\n    const position = resultsContainer.parentNode.getBoundingClientRect();\n    const maxHeight = window.innerHeight - position.bottom - offset;\n    resultsContainer.style.setProperty('--search-results-max-height', `${maxHeight}px`);\n  }\n\n};\n/*============================================================================\n  Responsive media\n==============================================================================*/\n\nfunction enableResponsiveVideoWrapper() {\n  // Wraps YouTube and Vimeo iframes in Plyr wrapper\n  // Does not target iframes already embedded in Plyr wrapper (video sections and product galleries)\n  $('iframe[src*=\"youtube.com\"]:not(.plyr__video-wrapper iframe[src*=\"youtube.com\"])').wrap('<div class=\"plyr__video-embed\"></div>');\n  $('iframe[src*=\"vimeo.com\"]:not(.plyr__video-wrapper iframe[src*=\"vimeo.com\"])').wrap('<div class=\"plyr__video-embed\"></div>');\n}\n/*============================================================================\n  Start of cart-related functionality\n==============================================================================*/\n\n\nfunction ajaxSubmitCart() {\n  const $cart = $(\"#cart\");\n  $.ajax({\n    url: '/cart/update.js',\n    dataType: 'json',\n    cache: false,\n    type: 'post',\n    data: $cart.serialize(),\n    success: function (data) {\
1n      refreshCart(data);\n    }\n  });\n}\n\nfunction ajaxUpdateCart(lineID, quantity, parent) {\n  $.ajax({\n    url: '/cart/change.js',\n    dataType: 'json',\n    cache: false,\n    type: 'post',\n    data: {\n      quantity: quantity,\n      line: lineID\n    },\n    success: function (data) {\n      refreshCart(data);\n      var lineIDIndex = lineID - 1;\n      var $input = parent.find(\"input[data-line-id='\" + lineID + \"']\"); //check to see if there are correct amount of products in array\n\n      if (typeof data.items[lineIDIndex] === \"undefined\") {\n        var updated_quantity = 0;\n      } else {\n        var updated_quantity = data.items[lineIDIndex].quantity;\n      }\n\n      if (quantity > 0 && quantity != updated_quantity) {\n        if (updated_quantity == 1) {\n          var items_left_text = window.PXUTheme.translation.items_left_count_one;\n        } else {\n          var items_left_text = window.PXUTheme.translation.items_left_count_other;\n        }\n\n        $('.warning--quantity').remove();\n        var warning = `\n            <div\n              class=\"\n                warning\n                warning--quantity\n                animated\n                bounceIn\n              \"\n            >\n              ${updated_quantity} ${items_left_text}\n            </div>\n          `;\n        $input.parent().next().append(warning);\n        $input.val(updated_quantity);\n      }\n    }\n  });\n}\n\nfunction refreshCart(cart) {\n  const $cartBtn = $(\".cart-button span\");\n\n  if ($cartBtn && $cartBtn.length) {\n    var value = $cartBtn.text() || '0';\n    var cart_items_html = \"\";\n    var $cart = $(\"#cart ul\");\n    $cartBtn.text(value.replace(/[0-9]+/, cart.item_count));\n    $cart.find('li:not(:first)').remove();\n\n    if (cart.item_count == 0) {\n      $cart.append('<li class=\"empty_cart\">' + window.PXUTheme.translation.empty_cart + '</li>');\n    } else {\n      $.each(cart.items, function (index, item) {\n        var line_id = index + 1;\n        let discountMessage = '';\n        let unitPricingOutput = '';\n\n        if (item.unit_price_measurement) {\n          unitPricingOutput = window.product.unitPricing(item);\n        } // Discounts logic\n\n\n        if (item.discounts.length) {\n          var discountAmount = Shopify.formatMoney(item.discounts[0].amount, $('body').data('money-format'));\n          var title = item.discounts[0].title;\n          discountMessage = `\n              <span class=\"notification-discount\">\n                ${window.PXUTheme.translation.cart_discount}: ${title} (-<span class=\"money\">${discountAmount}</span>)\n              </span>\n            `;\n        }\n\n        cart_items_html += `\n            <li class=\"mm-listitem\">\n              <a class=\"cart__item\" href=\"${item.url}\">\n          `;\n\n        if (item.image) {\n          cart_items_html += `\n              <div class=\"cart__image\">\n                <img src=\"${item.image.replace(/(\\.[^.]*)$/, \"_medium$1\").replace('http:', '')}\" alt=\"${htmlEncode(item.title)}\"/>\n              </div>\n            `;\n        }\n\n        cart_items_html += `\n            <div class=\"cart__info\">\n              <div class=\"cart__description\">\n              ${item.title}\n          `;\n\n        if (item.properties) {\n          $.each(item.properties, function (title, value) {\n            if (value && value !== 'on') {\n              cart_items_html += `\n                  <div class=\"line-item\">\n                    ${title}: ${value}\n                  </div>\n                `;\n            }\n          });\n        }\n\n        if (item.selling_plan_allocation && item.selling_plan_allocation.selling_plan) {\n          cart_items_html += `\n              <br>\n              <span class=\"line-item selling-plan\">\n                ${item.selling_plan_allocation.selling_plan.name}\n              </span>\n            `;\n        }\n\n        if (item.price > item.final_price) {\n          cart_items_html += `\n              <div class=\"cart__price\">
1\n                <span class=\"money\">\n                  ${Shopify.formatMoney(item.final_line_price, $('body').data('money-format'))}\n                </span>\n\n                <span class=\"was_price money\">\n                  ${Shopify.formatMoney(item.original_line_price, $('body').data('money-format'))}\n                </span>\n              </div>\n\n              <div class=\"cart__unit-price\">\n                ${unitPricingOutput}\n              </div>\n\n              <div class=\"cart__discount\">\n                ${discountMessage}\n              </div>\n\n              </div>\n            `;\n        } else {\n          cart_items_html += `\n              <div class=\"cart__price\">\n                <span class=\"money\">\n                  ${Shopify.formatMoney(item.price, $('body').data('money-format'))}\n                </span>\n              </div>\n\n              <div class=\"cart__unit-price\">\n                ${unitPricingOutput}\n              </div>\n\n              </div>\n            `;\n        }\n\n        cart_items_html += `\n            <div class=\"cart__quantity\">\n              <span class=\"icon-minus minus\"></span>\n              <input type=\"number\" min=\"0\" class=\"quantity\" name=\"updates[]\" id=\"updates_${item.id}\" value=\"${item.quantity}\"  data-line-id=\"${line_id}\" />\n              <span class=\"icon-plus plus\"></span>\n              </div>\n            </div>\n\n            </div>\n            </a>\n          `;\n      });\n      var cartDiscounts = cart.cart_level_discount_applications;\n      var cartDiscountMessage = \"\";\n\n      for (let i = 0; i < cartDiscounts.length; i++) {\n        var amount = Shopify.formatMoney(cartDiscounts[i].total_allocated_amount, $('body').data('money-format'));\n        var title = cartDiscounts[i].title;\n        cartDiscountMessage = '<p class=\"mm-counter price mm-discount-label mm-listitem__text\">' + title + '<span>' + '(- <span class=\"money\">' + amount + '</span>)' + '</span>' + '</p>';\n      }\n\n      if (cart.cart_level_discount_applications.length > 0) {\n        cart_items_html += '<li class=\"mm-label mm-listitem\">' + cartDiscountMessage + '</li>';\n      }\n\n      cart_items_html += `\n          <li class=\"mm-label mm-listitem\">\n            <a href=\"/cart\" class=\"cart__item-subtotal\">\n              <span>\n                ${window.PXUTheme.translation.subtotal}\n              </span>\n\n              <span class=\"mm-counter price\">\n                <span class=\"money\">\n                  ${Shopify.formatMoney(cart.total_price, $('body').data('money-format'))}\n                </span>\n              </span>\n            </a>\n          </li>\n\n          <li class=\"mm-subtitle mm-listitem\">\n        `;\n\n      if (window.PXUTheme.theme_settings.display_special_instructions) {\n        var cart_note = cart.note ? cart.note : '';\n        cart_items_html += '<textarea id=\"cart-note\" name=\"note\" rows=\"2\" placeholder=\"' + window.PXUTheme.translation.cart_notes + '\" class=\"clearfix\">' + cart_note + '</textarea>';\n      }\n\n      ;\n\n      if (window.PXUTheme.theme_settings.display_tos_checkbox) {\n        cart_items_html += '<aside class=\"tos tos_checkbox\"><input type=\"checkbox\" class=\"tos_agree\" id=\"sliding_agree\" required /><label class=\"tos_label\" for=\"sliding_agree\"> ' + window.PXUTheme.theme_settings.tos_richtext + '</label></aside>';\n      }\n\n      ;\n      cart_items_html += '<span class=\"mm-action_buttons mm-listitem__text\"><a href=\"' + window.PXUTheme.theme_settings.cart_url + '\" class=\"action_button edit_cart left\">' + window.PXUTheme.translation.edit_cart + '</a>' + '<input type=\"submit\" class=\"action_button right\" value=\"' + window.PXUTheme.translation.checkout + '\"/>' + '</span>' + '</li>';\n      $cart.append(cart_items_html);\n      $cart.find('li.cart_item:last').addClass('last_cart_item');\n    }\n  }\n} // Document ready\n\n\n$(function () {\n  utilities.listenForResize();\n  utilities.enableDisclosure();\n  window.lazySizesConfig = window.lazySizesConfig || {};\n  lazySizesConfig.expand = 300;\n  lazySizesConfig.loadHidden = false;\n  $(\"body\").on(\"click\", '.continue', function () {\n    var cart = $(\"#cart\").data(\"mmenu\");\n    cart.close();\n    var nav = $(\"#nav\").data(\"mmenu\");\n    nav.close();\n  }); // Search submit trigger event\n\n  $('.search-form .submit-search, .search-form--mobile .submit-search').on('click touchstart', function (e) {\n    $(this).parents('form').submit();\n  }); // Offscreen check for dropdown menus\n\n  $('.sub-menu').on('mouseenter', function () {\n    if ($(this).find('.dropdown').is(':off-right')) {\n      $(this).find('.dropdown').addClass(\"dropdown--align\");\n    }\n  });\n  $('.sub-menu').on('mouseleave', function () {\n    if ($(this).find('.dropdown').hasClass('dropdown--align')) {\n      $(this).find('.dropdown').removeClass(\"dropdown--align\");\n    }\n  }); // Accessibility tabbing\n\n  window.header.openDropdown(); // Load Accordions\n\n  var allPanels = $('.accordion > dd');\n\n  for (var i = 0; i < allPanels.length;
1 i++) {\n    $(allPanels[i]).css('height', $(allPanels[i]).outerHeight());\n  }\n\n  allPanels.hide();\n  $('.accordion > dt > a').click(function () {\n    if (!$(this).parent().next().is(':visible')) {\n      allPanels.slideUp();\n      $(this).parent().next().slideDown();\n      $('.accordion small.right').html('&#9668;');\n      $(this).find('small.right').html('&#9660;');\n    }\n\n    return false;\n  });\n  $('.accordion dd:first-of-type').show(); //Load sections\n\n  window.banner_image.init();\n  window.header.init();\n  window.banner.init();\n  window.map.init();\n  window.videoTheme.init();\n  window.product.init();\n  window.collection.init();\n  window.cart.init();\n  window.productFormListeners.init();\n  window.featured_promotions.init();\n  window.animate_content.init();\n  window.blogs.init();\n\n  if (window.PXUTheme.theme_settings.enable_predictive_search) {\n    window.predictiveSearch.init();\n  }\n\n  var $jsSections = $('.shopify-section[class*=js]'); // Loop through sections with js classes and load them in\n\n  var $jsSectionNames = $jsSections.each(function () {\n    for (var i = 0; i < this.classList.length; i++) {\n      if (this.classList[i].substring(0, 2) === \"js\") {\n        var triggerClass = this.classList[i];\n\n        if (window.PXUTheme[triggerClass]) {\n          //console.log('Section: ' + triggerClass + ' has been loaded.')\n          window.PXUTheme[triggerClass].init($(this));\n        } else {//console.warn('Uh oh, ' + triggerClass + ' is referenced in section schema class, but can not be found. Make sure \"z__' + triggerClass + '.js\" and window.PXUTheme.' + triggerClass + '.init() function exists.');\n        }\n      }\n    }\n  });\n  objectFitImages();\n\n  if (window.PXUTheme.currency.shipping_calculator && document.querySelector('[data-cart-shipping]')) {\n    const shippingCalculator = new _helpers_ShippingCalculator__WEBPACK_IMPORTED_MODULE_7__.default({\n      el: document.querySelector('[data-cart-shipping]')\n    });\n  } // Initialize Responsive Videos\n\n\n  enableResponsiveVideoWrapper();\n  var $header = $(\".feature_image .header\");\n  $(document).on('click', '.search__submit', function (e) {\n    $(this).parent('form').submit();\n  });\n  $(document).on('click', '#search-toggle', function (e) {\n    e.stopPropagation();\n    e.preventDefault();\n    document.body.classList.remove('scroll-locked');\n    $('.search-form--header').css('padding-top', $('.header').height() + 50 + 'px');\n\n    if ($('#search').is(\":visible\") && $(window).scrollTop() == 0) {\n      if (window.PXUTheme.theme_settings.header_background == false) {\n        $header.removeClass('header-background--true');\n      }\n    } else {\n      $header.addClass('header-background--true');\n    }\n\n    if ($('#search').hasClass(\"fadeIn\")) {\n      $('#search').removeClass(\"fadeIn\").hide();\n    } else {\n      $('#search').show().addClass(\"fadeIn\");\n      const searchInput = $('#search').find('[data-search-input]');\n      const searchInputLength = searchInput.val().length;\n      searchInput[0].setSelectionRange(searchInputLength, searchInputLength);\n      searchInput.focus();\n    }\n\n    $(document).on('click', function (e) {\n      var searchForm = $(e.target).parents('.search-form--header');\n\n      if (searchForm.length === 0) {\n        $('#search').removeClass(\"fadeIn\").hide();\n        document.body.classList.remove('scroll-locked');\n      }\n    });\n  }); // Backwards compatibility with flexslider\n\n  $('.slider, .flexslider:not(.homepage_slider)').find('li').unwrap();\n  $('.slider, .flexslider:not(.homepage_slider)').flickity({\n    pageDots: false,\n    autoPlay: 6000,\n    imagesLoaded: true,\n    lazyLoad: 2\n  });\n  var arrowShape = '<svg class=\"flickity-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 13.46 24.09\"><title>flickity-arrow</title><polygon points=\"1.41 24.09 0 22.68 10.63 12.05 0 1.41 1.41 0 13.46 12.05 1.41 24.09\"/></svg>';\n  $('.slider, .flexslider').find('.flickity-prev-next-button.next .flickity-button-icon').replaceWith(arrowShape);\n  $('.slider, .flexslider').find('.flickity-prev-next-button.previous').addClass('arrow-is-inverse').find('.flickity-button-icon').replaceWith(arrowShape);\n\n  if (window.matchMedia('(prefers-reduced-motion: reduce)').matches == false) {\n    //Lightbox default options\n    //https://fancyapps.com/fancybox/3/docs/#options\n    $.fancybox.defaults.animationEffect = 'fade';\n    $.fancybox.defaults.transitionEffect = 'slide';\n    $.fancybox.defaults.hash = false;\n    $.fancybox.defaults.infobar = false;\n    $.fancybox.defaults.toolbar = false;\n    $.fancybox.defaults.arrows = false;\n    $.fancybox.defaults.loop = true;\n    $.fancybox.defaults.smallBtn = true;\n    $.fancybox.defaults.wheel = false;\n    $.fancybox.defaults.live = false;\n    $.fancybox.defaults.zoom = false;\n    $.fancybox.defaults.btnTpl['smallBtn'] = '<a title=\"Close\" data-fancybox-close class=\"fancybox-item fancybox-close\" href=\"javascript:;\"></a>';\n    $.fancybox.defaults.mobile.preventCaptionOverlap = false;\n    $.fancybox.defaults.mobile.toolbar = true;\n    $.fancybox.defaults.mobile.buttons = ['close'];\n    $.fancybox.defaults.mobile.clickSlide = 'close';\n    $.fancybox.defaults.mobile.clickContent = 'zoom';\n\n    $.fancybox.defaults.afterLoad = function (instance, slide) {\n      if (instance.current.type == 'image') {\n        slide.$content.wrapInner(\"<div class='fancybox-image-wrap'></div>\");\n      }\n\n      if (instance.group.length > 1) {\n        slide.$content.find('.fancybox-image-wrap').append('<a title=\"Previous\" class=\"fancybox-item fancybox-nav fancybox-prev ss-icon\" href=\"javascript:;\" data-fancybox-prev><span class=\"icon-circle-left\"></span></a><a title=\"Next\" class=\"fancybox-item fancybox-nav fancybox-next ss-icon\" href=\"javascript:;\" data-fancybox-next><span class=\"icon-circle-right\"></span></a>');\n      }\n    }; // Lightbox effect enabled if reduce motion is not enabled\n\n\n    $('.lightbox').fancybox(); // Gallery fancybox initialization\n\n    $('[rel=\"gallery\"]').fancybox({\n      baseClass: \"gallery-section__lightbox\",\n      clickContent: \"nextOrClose\"\n    }); // // Trigger fancybox flickity product gallery images\n\n    $('.product-gallery__main .product-gallery__image .fancybox').fancybox({\n      baseClass: 'product-section__lightbox',\n      clickContent: \"nextOrClose\",\n      beforeShow: function () {\n        // Grab the fancybox element that is being clicked\n        var $fancyboxImageElement = $(this.opts.$orig); // Add alt to fancybox image\n\n        var imageAlt = $fancyboxImageElement.data('alt');\n        $('.fancybox-image').attr('alt', imageAlt);\n      }\n    });\n  }\n\n  if (window.PXUTheme.theme_settings.newsletter_popup) {\n    newsletter_popup.init();\n  }\n\n  if (window.PXUTheme.theme_settings.collection_swatches) {\n    window.PXUTheme;\n\n    if (window.PXUTheme.media_queries.large.matches) {\n      $('.thumbnail').hover(function () {\n        $('.swatch span', $(this)).each(function () {\n          if ($(this).data(\"image\").indexOf(\"no-image\") == -1) {\n            $('<img/>')[0].src = $(this).data(\"image\");\n          }\n        });\n      });\n      $('.swatch span').hover(function () {\n        if ($(this).data(\"image\").indexOf(\"no-image\") == -1) {\n          $(this).parents('.thumbnail').find('img').attr('src', $(this).data(\"image\"));\n        }\n      });\n    }\n  }\n\n  var tabs = $('ul.tabs');\n  tabs.each(function (i) {\n    var tab = $(this).find('> li > a');\n    tab.click(function (e) {\n      var contentLocation = $(this).attr('href');\n\n      if (contentLocation.charAt(0) == \"#\") {\n        e.preventDefault();\n        tab.removeClass('active');\n        $(this).addClass('active');\n        $(this).parents('ul.tabs').next().find(contentLocation).show().css({\n          'display': 'block'\n        }).addClass('active').siblings().hide().removeClass('active');\n      }\n    });\n  }); //Sidebar toggle\n\n  $(document).on('click', '.menu-toggle', function (e) {\n    toggleSidebarMenus($(this));\n  });\n  var sidebarTouched = false;\n  $(document).on('touchend', '.toggle span', function (e) {\n    e.stopPropagation();\n    e.preventDefault();\n\n    if (window.PXUTheme.media_queries.medium.matches || $(this).parents('.sidebar').hasClass('toggle-all--true')) {\n      var $toggle = $(this);\n      toggleSidebarBlocks($toggle);\n      sidebarTouched = true;\n      return false;\n    }\n  });\n  $(document).on('click', '.toggle span', function (e) {\n    e.stopPropagation();\n    e.preventDefault();\n\n    if (window.PXUTheme.media_queries.medium.matches || $(this).parents('.sidebar').hasClass('toggle-all--true')) {\n      var $toggle = $(this);\n\n      if (!sidebarTouched) {\n        toggleSidebarBlocks($toggle);\n        return false;\n      }\n    }\n  });\n  $(document).on('keyup', '.toggle span', function (e) {\n    if (!$('body').hasClass('user-is-tabbing')) return;\n\n    if (e.key === 'Enter') {\n      e.stopPropagation();\n      e.preventDefault();\n\n      if (window.PXUTheme.media_queries.medium.matches || $(this).parents('.sidebar').hasClass('toggle-all--true')) {\n        var $toggle = $(this);\n\n        if (!sidebarTouched) {\n          toggleSidebarBlocks($toggle);\n          return false;\n        }\n      }\n    }\n  });\n\n  if ($(\"#contact_form\").length) {\n    var contactFormResponse = url('?customer_posted');\n\n    if (contactFormResponse) {\n      $('html,body').animate({\n        scrollTop: $(\"#contact_form\").offset().top\n      });\n    }\n  }\n\n  if (window.PXUTheme.theme_settings.product_form_style == 'swatches') {\n    $('.swatch :radio').change(function () {\n      var optionIndex = $(this).closest('.swatch').attr('data-option-index');\n      var optionValue = $(this).val();\n      $(this).closest('form').find('.single-option-selector').eq(optionIndex).val(optionValue).trigger('change');\n    });\n  }\n\n  $('body').on(\"change\", \"#cart input.quantity\", function () {\n    ajaxUpdateCart($(this).data('line-id'), $(this).val(), $(this).parents('#cart'));\n  });
1\n  $('body').on(\"change\", \"#cart #cart-note\", function () {\n    ajaxSubmitCart();\n  });\n\n  if (window.PXUTheme.theme_settings.cart_action == 'ajax') {\n    $(document).on('click', '.ajax-submit', function (e) {\n      e.preventDefault();\n      var $addToCartForm = $(this).closest('form');\n      var $addToCartBtn = $addToCartForm.find('.add_to_cart');\n      this.recipientForm = $addToCartForm[0].querySelector('[data-recipient-form]');\n      $('.warning').remove();\n\n      if (this.recipientForm) {\n        this.recipientForm.classList.remove('recipient-form--has-errors');\n      }\n\n      $.ajax({\n        url: '/cart/add.js',\n        dataType: 'json',\n        type: 'post',\n        cache: false,\n        data: $addToCartForm.serialize(),\n        beforeSend: function () {\n          $addToCartBtn.attr('disabled', 'disabled').addClass('disabled');\n          $addToCartBtn.find('span').removeClass(\"zoomIn\").addClass('animated zoomOut');\n        },\n        success: function (itemData) {\n          $addToCartBtn.find('span').text(window.PXUTheme.translation.product_add_to_cart_success).removeClass('zoomOut').addClass('fadeIn');\n          window.setTimeout(function () {\n            $addToCartBtn.removeAttr('disabled').removeClass('disabled');\n            $addToCartBtn.find('span').addClass(\"fadeOut\").text($addToCartBtn.data('label')).removeClass('fadeIn').removeClass(\"fadeOut\").addClass('zoomIn');\n          }, 1000);\n          $.ajax({\n            url: '/cart.js',\n            dataType: \"json\",\n            cache: false,\n            success: function (cart) {\n              refreshCart(cart);\n              window.setTimeout(function () {\n                $.fancybox.close();\n                $('.cart-button').click();\n              }, 500);\n            }\n          });\n        },\n        error: XMLHttpRequest => {\n          var response = eval('(' + XMLHttpRequest.responseText + ')');\n          $('.warning').remove();\n          let warning;\n\n          if (response.errors && response.errors.email) {\n            this.recipientForm.classList.add('recipient-form--has-errors');\n          } else {\n            warning = '<p class=\"warning animated bounceIn\">' + response.description.replace('All 1 ', 'All ') + '</p>';\n            $addToCartForm.after(warning);\n          }\n\n          $addToCartBtn.removeAttr('disabled').removeClass('disabled');\n          $addToCartBtn.find('span').text(window.PXUTheme.translation.product_add_to_cart).removeClass('zoomOut').addClass('zoomIn');\n        }\n      });\n      return false;\n    });\n  } // Variable returns true/false if reduced motion is enabled\n\n\n  var reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; // Find instances of flexslider and pause slideshow\n\n  if (reducedMotion) {\n    $('.flexslider').flexslider('pause');\n  }\n});\n\nwindow.selectCallback = function (variant, selector) {\n  var $product = $('.product-' + selector.product.id);\n  var $notify_form = $('.notify-form-' + selector.product.id);\n  var $productForm = $('.product_form', $product);\n  var variantInventory = $productForm.data('variant-inventory');\n  var $notifyFormInputs = $('.notify_form__inputs');\n  var notifyEmail = \"Email address\";\n  var notifyEmailValue = \"\";\n  var notifySend = \"Send\";\n\n  if (variant) {\n    if (variant.name != null) {\n      var notifyMessage = $notifyFormInputs.data('notify-message') + ' - ' + variant.name;\n    } else {\n      var notifyMessage = $notifyFormInputs.data('notify-message');\n    }\n  }\n\n  if ($notifyFormInputs.hasClass('customer--true')) {\n    var notifyCustomerEmail = $notifyFormInputs.data('customer-email');\n    var notifyEmailInput = '<input required type=\"email\" class=\"notify_email\" name=\"contact[email]\" id=\"contact[email]\" value=\"' + notifyCustomerEmail + '\" />';\n  } else {\n    var notifyEmailInput = '<input required type=\"email\" class=\"notify_email\" name=\"contact[email]\" id=\"contact[email]\" placeholder=\"' + notifyEmail + '\" value=\"' + notifyEmailValue + '\" />';\n  }\n\n  var notifyFormHTML = notifyEmailInput + '<input type=\"hidden\" name=\"challenge\" value=\"false\" /><input type=\"hidden\" name=\"contact[body]\" class=\"notify_form_message\" data-body=\"' + notifyMessage + '\" value=\"' + notifyMessage + '\" /><input class=\"action_button\" type=\"submit\" value=\"' + notifySend + '\" style=\"margin-bottom:0px\" />'; // Image variant feature\n\n  if (variant && variant.featured_image && $product.is(\":visible\")) {\n    var $sliders = $('.product-gallery__main', $product);\n    $sliders.each(function () {\n      var $slider = $(this);\n      var $sliderInstance = Flickity.data(this);\n\n      if ($slider.is(\":visible\") && $sliderInstance != undefined) {\n        var index = $('[data-image-id=\"' + variant.featured_image.id + '\"]').data('index');\n        $sliderInstance.select(index, false, true);\n      }\n    });\n  }\n\n  if (variant) {\n    if (variantInventory) {\n      variantInventory.forEac
1h(function (v) {\n        if (v.id === variant.id) {\n          variant.inventory_quantity = v.inventory_quantity;\n          variant.inventory_management = v.inventory_management;\n          variant.inventory_policy = v.inventory_policy;\n        }\n      });\n    }\n\n    $('.sku span', $product).text(variant.sku);\n\n    if (window.PXUTheme.theme_settings.product_form_style == 'swatches') {\n      for (let i = 0, length = variant.options.length; i < length; i++) {\n        var radioButton = $productForm.find('.swatch[data-option-index=\"' + escape(i) + '\"] :radio[value=\"' + variant.options[i].replace(/\\\"/g, '\\\\\"') + '\"]');\n\n        if (radioButton.length) {\n          radioButton.get(0).checked = true;\n        }\n      }\n    }\n  }\n\n  const $unitPrice = $('.product-details__unit-price', $product);\n  $unitPrice.removeClass('product-details__unit-price--hidden');\n\n  if (variant && variant.available == true) {\n    if (variant.price < variant.compare_at_price) {\n      $('.was_price', $product).html('<span class=\"money\">' + Shopify.formatMoney(variant.compare_at_price, $('body').data('money-format')) + '</span>');\n      $('.current_price', $product).parent().addClass('sale');\n    } else {\n      $('.was_price', $product).html('');\n      $('.current_price', $product).parent().removeClass('sale');\n    }\n\n    if (variant.inventory_management && variant.inventory_quantity > 0) {\n      if (window.PXUTheme.theme_settings.display_inventory_left) {\n        if (variant.inventory_quantity == 1) {\n          var items_left_text = window.PXUTheme.translation.items_left_count_one;\n        } else {\n          var items_left_text = window.PXUTheme.translation.items_left_count_other;\n        }\n\n        var inventoryThreshold = window.PXUTheme.theme_settings.inventory_threshold;\n\n        if (variant.inventory_quantity <= inventoryThreshold) {\n          $('.items_left', $product).html(\"<p><em>\" + variant.inventory_quantity + \" \" + items_left_text + \"</em></p>\");\n        } else {\n          $('.items_left', $product).html(\"\");\n        }\n      }\n\n      if (window.PXUTheme.theme_settings.limit_quantity) {\n        if (variant.inventory_policy == \"deny\") {\n          $('.quantity', $product).attr('max', variant.inventory_quantity);\n        }\n      }\n    } else {\n      $('.items_left', $product).text('');\n      $('.quantity', $product).removeAttr('max');\n    } // Empty sold out text\n\n\n    $('.sold_out', $product).text(''); // Show price, otherwise, show free price text\n\n    if (variant.price > 0) {\n      $('.current_price', $product).html('<span class=\"money\">' + Shopify.formatMoney(variant.price, $('body').data('money-format')) + '</span>');\n\n      if (window.product.unitPricing(variant) !== undefined) {\n        $unitPrice.html(window.product.unitPricing(variant));\n      } else {\n        $unitPrice.addClass('product-details__unit-price--hidden');\n      }\n    } else {\n      $('.current_price', $product).html(window.PXUTheme.theme_settings.free_price_text);\n      $unitPrice.addClass('product-details__unit-price--hidden');\n    }\n\n    $('.modal_price', $product).removeClass('modal_price--sold-out');\n    $('.add_to_cart', $product).removeClass('disabled').removeAttr('disabled').find('span').text($('.add_to_cart', $product).data('label'));\n    $('.current_price').show();\n    $('.was_price').show(); // Hide the back in stock notification form\n\n    $notify_form.hide(); // Show the quantity field\n\n    $('.purchase-details__quantity', $product).show(); // Remove disable from action buttons\n\n    $('.atc-btn-container', $product).removeClass('disabled');\n  } else {\n    var message = variant ? window.PXUTheme.translation.product_sold_out : window.PXUTheme.translation.product_unavailable; // Hide the quantity field\n\n    $('.purchase-details__quantity', $product).hide(); // Show the price and change the add to cart and sold out text\n\n    $('.modal_price', $product).addClass('modal_price--sold-out');\n    $('.was_price', $product).html('');\n    $('.items_left', $product).text('');\n    $('.quantity', $product).removeAttr('max');\n    $('.sold_out', $product).text(' - ' + message); // Disable the add to cart button and Shopify payment button when a variant is sold out\n\n    $('.atc-btn-container', $product).addClass('disabled');\n    $('.add_to_cart', $product).addClass('disabled').attr('disabled', 'disabled').find('span').text(message); //Hide the back in stock notification form\n\n    $notify_form.hide();\n    $notifyFormInputs.empty();\n\n    if (variant && !variant.available) {\n      $('.current_price').show();\n      $('.was_price').show(); // Show the variant price, otherwise, show the free price text\n\n      if (variant.price > 0) {\n        $('.current_price', $product).html('<span class=\"money\">' + Shopify.formatMoney(variant.price, $('body').data('money-format')) + '</span>');\n\n        if (window.product.unitPricing(variant) !== undefined) {\n          $unitPrice.html(window.product.unitPricing(variant));\n        } else {\n          $unitPrice.addClass('product-details__unit-price--hidden');\n        }\n      } else {\n        $('.current_price', $product).html(window.PXUTheme.theme_settings.free_price_text);\n        $unitPrice.addClass('product-details__unit-price--hidden');\n      } // When a variant is sold out but on sale\n\n\n      if (variant.price < variant.compare_at_price) {\n        $('.was_price', $product).html('<span class=\"money\">' + Shopify.formatMoney(variant.compare_at_price, $('body').data('money-format')) + '</span>');\n        $('.current_price', $product).parent().addClass('sale');\n      } else {\n        $('.was_price', $product).html('');\n        $('.current_price', $product).parent().removeClass('sale');\n      } // Show the back in stock notification form\n\n\n      $notify_form.fadeIn();\n      $notifyFormInputs.empty();\n      $notifyFormInputs.append(notifyFormHTML);\n    } else {\n      $('.sold_out', $product).text(message);\n      $unitPrice.addClass('product-details__unit-price--hidden'); // When a variant is specifically unavailable\n\n      $('.current_price').hide();\n      $('.was_price').hide();\n    }\n  }\n\n  $productForm.removeClass(\"init\");\n};\n\nfunction htmlEncode(value) {\n  if (value) {\n    return $('<div/>').text(value).html();\n  } else {\n    return '';\n  }\n}\n\nwindow.Shopify.updateOptionsInSelector = function (selectorIndex, parent) {\n  switch (selectorIndex) {\n    case 0:\n      var key = 'root';\n      var selector = $(parent + ' .single-option-selector:eq(0)');\n      break;\n\n    case 1:\n      var key = $(parent + ' .single-option-selector:eq(0)').val();\n      var selector = $(parent + ' .single-option-selector:eq(1)');\n      break;\n\n    case 2:\n      var key = $(parent + ' .single-option-selector:eq(0)').val();\n      key += ' / ' + $(parent + ' .single-option-selector:eq(1)').val();\n      var selector = $(parent + ' .single-option-selector:eq(2)');\n  }\n\n  var availableOptions = Shopify.optionsMap[key];\n  $(parent + ' .swatch[data-option-index=\"' + selectorIndex + '\"] .swatch-element').each(function () {\n    if ($.inArray($(this).attr('data-value'), availableOptions) !== -1) {\n      $(this).removeClass('soldout').find(':radio').removeAttr('disabled', 'disabled').removeAttr('checked');\n    } else {\n      $(this).addClass('soldout').find(':radio').removeAttr('checked').attr('disabled', 'disabled');\n    }\n  });\n  selector.trigger('change');\n};\n/* Linked Option Selectors */\n\n\nShopify.linkOptionSelectors = function (product, parent) {\n  // Building our mapping object.\n  Shopify.optionsMap = {};\n\n  for (let i = 0; i < product.variants.length;
1 i++) {\n    var variant = product.variants[i];\n\n    if (variant.available) {\n      // Gathering values for the 1st drop-down.\n      Shopify.optionsMap['root'] = Shopify.optionsMap['root'] || [];\n      Shopify.optionsMap['root'].push(variant.option1);\n      Shopify.optionsMap['root'] = Shopify.uniq(Shopify.optionsMap['root']); // Gathering values for the 2nd drop-down.\n\n      if (product.options.length > 1) {\n        var key = variant.option1;\n        Shopify.optionsMap[key] = Shopify.optionsMap[key] || [];\n        Shopify.optionsMap[key].push(variant.option2);\n        Shopify.optionsMap[key] = Shopify.uniq(Shopify.optionsMap[key]);\n      } // Gathering values for the 3rd drop-down.\n\n\n      if (product.options.length === 3) {\n        var key = variant.option1 + ' / ' + variant.option2;\n        Shopify.optionsMap[key] = Shopify.optionsMap[key] || [];\n        Shopify.optionsMap[key].push(variant.option3);\n        Shopify.optionsMap[key] = Shopify.uniq(Shopify.optionsMap[key]);\n      }\n    }\n  } // Update options right away.\n\n\n  window.Shopify.updateOptionsInSelector(0, parent);\n  if (product.options.length > 1) window.Shopify.updateOptionsInSelector(1, parent);\n  if (product.options.length === 3) window.Shopify.updateOptionsInSelector(2, parent); // When there is an update in the first dropdown.\n\n  $(parent + \" .single-option-selector:eq(0)\").change(function () {\n    window.Shopify.updateOptionsInSelector(1, parent);\n    if (product.options.length === 3) window.Shopify.updateOptionsInSelector(2, parent);\n    return true;\n  }); // When there is an update in the second dropdown.\n\n  $(parent + \" .single-option-selector:eq(1)\").change(function () {\n    if (product.options.length === 3) window.Shopify.updateOptionsInSelector(2, parent);\n    return true;\n  });\n}; // Loads in script when called\n\n\nvar loadScript = function (name, url, callback) {\n  if (window.PXUTheme[name]) {\n    callback;\n  } else {\n    $.ajax({\n      url: url,\n      dataType: 'script',\n      success: callback,\n      async: false\n    });\n  }\n};\n\n$(document).on('shopify:block:select', function (e) {\n  var blockId = e.detail.blockId;\n  var $parentSection = $('#shopify-section-' + e.detail.sectionId);\n\n  if ($parentSection.hasClass('shopify-section--slideshow')) {\n    window.PXUTheme.jsSlideshow.blockSelect(blockId, $parentSection);\n  }\n\n  if ($parentSection.find('.map--container').length) {\n    window.map.init();\n  }\n\n  if ($parentSection.find('.parallax-banner')) {\n    $(this).find('.parallax__container > .parallax').unwrap();\n    new universalParallax().init();\n  }\n});\n$(document).on('shopify:block:deselect', function (e) {\n  var $parentSection = $('#shopify-section-' + e.detail.sectionId);\n\n  if ($parentSection.hasClass('shopify-section--slideshow')) {\n    window.PXUTheme.jsSlideshow.blockDeselect($parentSection);\n  }\n});\n$(document).on('shopify:section:load', function (e) {\n  // Shopify section as jQuery object\n  var $section = $(e.target); // Vanilla js selection of Shopify section\n\n  var section = document.getElementById('shopify-section-' + e.detail.sectionId);\n  var sectionObjectUrl = $section.find('[data-theme-editor-load-script]').attr('src'); // Check classes on schema and look for js (eg. jsMap)\n\n  for (var i = 0; i < section.classList.length; i++) {\n    if (section.classList[i].substring(0, 2) === \"js\") {\n      var triggerClass = section.classList[i]; // Check to see if section script exists\n\n      if (typeof window.PXUTheme[triggerClass] == 'undefined') {\n        // make AJAX call to load script\n        loadScript(triggerClass, sectionObjectUrl, function () {\n          window.PXUTheme[triggerClass].init($(section));\n        });\n      } else {\n        if (window.PXUTheme[triggerClass]) {\n          //console.log('Section: ' + triggerClass + ' has been loaded.')\n          window.PXUTheme[triggerClass].init($(section));\n        } else {//console.warn('Uh oh, ' + triggerClass + ' is referenced in section schema class, but can not be found. Make sure \"z__' + triggerClass + '.js\" and window.PXUTheme.' + triggerClass + '.init() function exists.');\n        }\n      }\n    }\n  }\n\n  utilities.enableDisclosure(); // Call methods based on section classes\n\n  var $parentSection = $('#shopify-section-' + e.detail.sectionId);\n\n  if (window.PXUTheme.theme_settings.newsletter_popup) {\n    newsletter_popup.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--recommended-products')) {\n    window.product.loadProductRecommendations();\n  }\n\n  if (window.PXUTheme.theme_settings.enable_predictive_search) {\n    window.predictiveSearch.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--cart-template')) {\n    window.productFormListeners.init();\n    window.cart.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--image-with-text-overlay')) {\n    window.banner_image.init(
1);\n    window.banner.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--map') || $parentSection.hasClass('shopify-section--page-contact-template')) {\n    window.map.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--featured-product')) {\n    window.product.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--featured-collection')) {\n    window.collection.init();\n    window.product.init();\n    window.banner.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--featured-promotions')) {\n    window.featured_promotions.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--image-with-text')) {\n    window.animate_content.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--video')) {\n    window.videoTheme.init();\n    window.banner.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--product-template') || $parentSection.hasClass('shopify-section--quick-shop')) {\n    window.collection.init();\n    window.product.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--collection-template')) {\n    window.banner_image.init();\n    window.collection.init();\n    window.product.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--page-contact-template')) {\n    window.banner_image.init();\n    window.banner.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--article-template')) {\n    window.article.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--search-template')) {\n    window.collection.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--blog-template')) {\n    window.banner_image.init();\n    window.banner.init();\n  }\n\n  if ($parentSection.hasClass('shopify-section--header')) {\n    window.banner_image.init();\n    window.header.init();\n  }\n\n  if ($parentSection.hasClass('parallax-banner')) {\n    $(this).find('.parallax__container > .parallax').unwrap();\n    new universalParallax().init();\n  }\n});\n$(document).on('shopify:section:unload', function (e) {\n  utilities.unload();\n  var $target = $(e.target);\n  var $parentSection = $('#shopify-section-' + e.detail.sectionId);\n\n  if ($parentSection.hasClass('shopify-section--image-with-text-overlay')) {\n    window.banner.unload($target);\n  }\n\n  if ($parentSection.hasClass('shopify-section--slideshow')) {\n    window.PXUTheme.jsSlideshow.unload($target);\n  }\n\n  if ($parentSection.hasClass('shopify-section--featured-product')) {\n    window.product.unload($target);\n  }\n\n  if ($parentSection.hasClass('shopify-section--featured-collection')) {\n    window.collection.unload($target);\n  }\n\n  if ($parentSection.hasClass('shopify-section--product-template')) {\n    window.product.unload($target);\n  }\n\n  if ($parentSection.hasClass('shopify-section--collection-template')) {\n    window.collection.unload($target);\n  }\n});\n$(document).on('shopify:section:select', function (e) {\n  // Shopify section as jQuery object\n  var $section = $(e.target); // Vanilla js selection of Shopify section\n\n  var section = document.getElementById('shopify-section-' + e.detail.sectionId); // Force show state when section is selected in theme editor\n\n  for (var i = 0; i < section.classList.length; i++) {\n    if (section.classList[i].substring(0, 2) === \"js\") {\n      var triggerClass = section.classList[i];\n\n      if (window.PXUTheme[triggerClass].showThemeEditorState) {\n        window.PXUTheme;\n        window.PXUTheme[triggerClass].showThemeEditorState(e.detail.sectionId, $section);\n      }\n    }\n  }\n\n  var $parentSection = $('#shopify-section-' + e.detail.sectionId);\n  window.header.init();\n  window.banner_image.init();\n  window.banner.init();\n  $('.lightbox').fancybox();\n});\n$(document).on('shopify:section:deselect', function (e) {\n  var $parentSection = $('#shopify-section-' + e.detail.sectionId);\n  window.banner_image.init();\n});\n$(document).on('shopify:section:reorder', function (e) {\n  var $parentSection = $('#shopify-section-' + e.detail.sectionId);\n  window.header.init();\n  window.banner_image.init();\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9hcHAuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wYXJhbGxheC8uL3NvdXJjZS9zY3JpcHRzL2FwcC5qcz9hMmRjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByaW1nIGZyb20gJ0BwaXhlbHVuaW9uL3JpbWctc2hvcGlmeSc7XG5pbXBvcnQgU2hvcGlmeVNlY3Rpb25zTWFuYWdlciBmcm9tICdAcGl4ZWx1bmlvbi9zaG9waWZ5LXNlY3Rpb25zLW1hbmFnZXInO1xuaW1wb3J0IHsgU2l0ZUFnZUdhdGUsIFBhZ2VBZ2VHYXRlIH0gZnJvbSAnQHBpeGVsdW5pb24vYWdlLWdhdGUnO1xuaW1wb3J0IENvbXBsZW1lbnRhcnlQcm9kdWN0cyBmcm9tICcuL2hlbHBlcnMvQ29tcGxlbWVudGFyeVByb2R1Y3RzJztcbmltcG9ydCBTaG9waWZ5U3VyZmFjZVBpY2tVcCBmcm9tICdAcGl4ZWx1bmlvbi9zaG9waWZ5LXN1cmZhY2UtcGljay11cCc7XG5pbXBvcnQgUGF5bWVudFRlcm1zIGZyb20gJy4vaGVscGVycy9QYXltZW50VGVybXMnO1xuaW1wb3J0IFJlY2lwaWVudE
1Zvcm0gZnJvbSAnLi9oZWxwZXJzL1JlY2lwaWVudEZvcm0nO1xuaW1wb3J0IFNoaXBwaW5nQ2FsY3VsYXRvciBmcm9tICcuL2hlbHBlcnMvU2hpcHBpbmdDYWxjdWxhdG9yJztcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnQHBpeGVsdW5pb24vZXZlbnRzJztcbmltcG9ydCB7IHRyYW5zaXRpb24gfSBmcm9tICdAcGl4ZWx1bmlvbi9hbmltYXRpb25zJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdqdXN0LWRlYm91bmNlJztcbmltcG9ydCBBc3luY1ZpZXcgZnJvbSAnQHBpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcnO1xuXG5yaW1nLmluaXQoJ1tkYXRhLXJpbWc9XCJsYXp5XCJdJywgeyByb3VuZDogMSB9KTtcblxuY29uc3Qgc2VjdGlvbnMgPSBuZXcgU2hvcGlmeVNlY3Rpb25zTWFuYWdlcigpO1xuXG5zZWN0aW9ucy5yZWdpc3RlcignYWdlLWdhdGUnLCBzZWN0aW9uID0+IG5ldyBQYWdlQWdlR2F0ZShzZWN0aW9uKSk7XG5cbmNvbnN0IGFnZUdhdGVQYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FnZS1nYXRlLXBhZ2UnKTtcblxuaWYgKGFnZUdhdGVQYWdlKSB7XG4gIG5ldyBTaXRlQWdlR2F0ZShhZ2VHYXRlUGFnZSk7XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBHbG9iYWwgLSBoZWFkZXJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbndpbmRvdy5oZWFkZXIgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcigpO1xuXG4gICAgdGhpcy5zZXRIZWFkZXJQb3NpdGlvbigpO1xuXG4gICAgLy9yZW1vdmUgZHVwbGljYXRlIGhlYWRlciBvbiB1cGRhdGVcbiAgICBpZiAoJCgnLm1vYmlsZS1oZWFkZXInKS5sZW5ndGggPiAxKSB7XG4gICAgICB2Y
1XIgbmF2X21lbnUgPSAkKFwiI25hdlwiKS5kYXRhKFwibW1lbnVcIik7XG4gICAgICBuYXZfbWVudS5jbG9zZSgpO1xuICAgICAgJCgnLm1vYmlsZS1oZWFkZXI6bGFzdCwgI25hdjpsYXN0JykucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgLy8gT25seSBhcHBsaWVkIHdoZW4gdGhlcmUgaXMgYSBmdWxsLXdpZHRoIGJhbm5lciBhY3Jvc3MgdG9wIG9mIHBhZ2VcbiAgICB2YXIgJGhlYWRlciA9ICQoJy5mZWF0dXJlX2ltYWdlIC5oZWFkZXIuaGVhZGVyLWJhY2tncm91bmQtLWZhbHNlJyk7XG5cbiAgICAvLyBUbyBvZmZzZXQgdGhlIGZpeGVkIGhlYWRlclxuICAgIGlmICgkKCcuaGVhZGVyJykuaGFzQ2xhc3MoJ21tLWZpeGVkLXRvcCcpKSB7XG4gICAgICAkKCcubWVudSBsaTpub3QoLmNhcnQpIGFbaHJlZl49XCIjXCJdLCAuZmxleC1jYXB0aW9uIGFbaHJlZl49XCIjXCJdJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgIHZhciBhbmNob3JsaW5rID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7XG5cbiAgICAgICAgaWYoJCgnLmluZGV4LXNlY3Rpb25zJykuZmluZChhbmNob3JsaW5rKS5sZW5ndGgpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdmFyIGhlYWRlckhlaWdodCA9ICQoJy5oZWFkZXInKS5vdXRlckhlaWdodCgpO1xuICAgICAgICAgICQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHtcbiAgICAgICAgICAgIHNjcm9sbFRvcDogJChhbmNob3JsaW5rKS5vZmZzZXQoKS50b3AgLSBoZWFkZXJIZWlnaHRcbiAgICAgICAgICB9LCAyMDAwKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH07XG5cbiAgICBpZiAoJGhlYWRlci5oYXNDbGFzcygnc3RpY2t5LWhlYWRlci0tdHJ1ZScpKSB7XG5cbiAgICAgICQoXCIuaW5kZXgtc2VjdGlvbnMgLnNob3BpZnktc2VjdGlvbjpudGgtY2hpbGQoMiksIC5zaG9waWZ5LXNlY3Rpb246bnRoLWNoaWxkKDIpLCAubWFpbi13cmFwcGVyLCAucGFnZS1kZXRhaWxzLWJsb2NrOm50aC1jaGlsZCgyKVwiKS53YXlwb2ludChmdW5jdGlvbihkaXJlY3Rpb24pIHtcblxuICAgICAgICBpZiAoZGlyZWN0aW9uID09ICdkb3duJyl7XG4gICAgICAgICAgJGhlYWRlci5hZGRDbGFzcygnc3RpY2t5LS1hY3RpdmUgZmFkZUluRG93biBkZWxheS0wcyBoZWFkZXJfYmFyJyk7XG4gICAgICAgICAgJGhlYWRlci5yZW1vdmVDbGFzcygnaXMtYWJzb2x1dGUnKTtcbiAgICAgICAgICBoZWFkZXIuZHluYW1pY0Ryb3Bkb3duKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09ICd1cCcpe1xuICAgICAgICAgICRoZWFkZXIucmVtb3ZlQ2xhc3MoJ3N0aWNreS0tYWN0aXZlIGZhZGVJbkRvd24gZGVsYXktMHMgaGVhZGVyX2JhcicpO1xuICAgICAgICAgICRoZWFkZXIuYWRkQ2xhc3MoJ2lzLWFic29sdXRlJyk7XG4gICAgICAgICAgaGVhZGVyLmR5bmFtaWNEcm9wZG93bigpO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIG9mZnNldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gc3RpY2t5IGhlYWRlciBhY3RpdmF0ZXMgd2hlbiBtZXJjaGFudCBzY3JvbGxzIGRvd24gdGhlIHBhZ2UgdGhlIGhlaWdodCBvZiB0aGUgaGVhZGVyIHBsdXMgMjUwcHhcbiAgICAgICAgICByZXR1cm4gLSRoZWFkZXIub3V0ZXJIZWlnaHQoKSAtIDI1MFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAkaGVhZGVyLm9uKCd3ZWJraXRBbmltYXRpb25FbmQgb2FuaW1hdGlvbmVuZCBtc0FuaW1hdGlvbkVuZCBhbmltYXRpb25lbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZhZGVJbicpO1xuICAgIH0pO1xuXG4gICAgJCgnI2NhcnQnKS5tbWVudSh7XG4gICAgICBuYXZiYXI6IHtcbiAgICAgICAgYWRkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIG9mZkNhbnZhczoge1xuICAgICAgICBwYWdlU2VsZWN0b3I6IFwiI2NvbnRlbnRfd3JhcHBlclwiXG4gICAgICB9LFxuICAgICAgXCJleHRlbnNpb25zXCI6IFtcbiAgICAgICAgXCJ0aGVtZS17eyBzZXR0aW5ncy5tb2JpbGVfbWVudV9jb2xvciB9fVwiLFxuICAgICAgICBcInBvc2l0aW9uLWZyb250XCIsXG4gICAgICAgIFwicG9zaXRpb24te3sgc2V0dGluZ3Muc2lkZV9jYXJ0X3Bvc2l0aW9uIH19XCJcbiAgICAgIF1cbiAgICB9KTtcbiAgICAkKCcuY2FydC1idXR0b24sIC5pY29uLW1lbnUnKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICQoJyNzZWFyY2gnKS5oaWRlKCk7XG4gICAgfSk7XG5cbiAgICB2YXIgbmF2U2V0dGluZ3MgPSB7XG4gICAgICBcIm5hdmJhclwiOiB7XG4gICAgICAgIGFkZDogdHJ1ZSxcbiAgICAgICAgdGl0bGU6ICQoJy5tb2JpbGVfbG9nbycpLmh0bWwoKVxuICAgICAgfSxcbiAgICAgIHNjcm9sbEJ1Z0ZpeDoge1xuICAgICAgICBmaXg6IHRydWVcbiAgICAgIH0sXG4gICAgICBzZWFyY2hmaWVsZDoge1xuICAgICAgICBhZGQ6ICQoJyNoZWFkZXInKS5kYXRhKCdzZWFyY2gtZW5hYmxlZCcpLFxuICAgICAgICBzZWFyY2g6IGZhbHNlLFxuICAgICAgICBwb3NpdGlvbjogXCJ0b3BcIixcbiAgICAgICAgcGxhY2Vob2xkZXI6IHdpbmRvdy5QWFVUaGVtZS50cmFuc2xhdGlvbi5zZWFyY2hcbiAgICAgIH0sXG4gICAgICBcImV4dGVuc2lvbnNcIjogW1xuICAgICAgICBcInRoZW1lLXt7IHNldHRpbmdzLm1vYmlsZV9tZW51X2NvbG9yIH19XCJcbiAgICAgIF0sXG4gICAgICBvZmZDYW52YXM6IHsgcGFnZVNlbGVjdG9yOiBcIiNjb250ZW50X3dyYXBwZXJcIiB9XG4gICAgfVxuXG4gICAgaWYoJCgnLm1vYmlsZS1zZWFyY2gtYmFyJykubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIG5hdlNldHRpbmdzID0ge1xuICAgICAgICBcIm5hdmJhclwiOiB7XG4gICAgICAgICAgYWRkOiB0cnVlLFxuICAgICAgICAgIHRpdGxlOiAkKCcubW9iaWxlX2xvZ28nKS5odG1sKClcbiAgICAgICAgfSxcbiAgICAgICAgc2Nyb2xsQnVnRml4OiB7XG4gICAgICAgICAgZml4OiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZXh0ZW5zaW9uc1wiOiBbXG4gICAgICAgICAgXCJ0aGVtZS17eyBzZXR0aW5ncy5tb2JpbGVfbWVudV9jb2xvciB9fVwiXG4gICAgICAgIF0sXG4gICAgICAgIG9mZkNhbnZhczogeyBwYWdlU2VsZWN0b3I6IFwiI2NvbnRlbn
1Rfd3JhcHBlclwiIH1cblxuICAgICAgfVxuXG4gICAgfVxuXG4gICAgJCgnI25hdicpLm1tZW51KFxuICAgICAgbmF2U2V0dGluZ3MsXG4gICAgICB7XG4gICAgICAgIHNlYXJjaGZpZWxkOiB7XG4gICAgICAgICAgXCJmb3JtXCI6IHtcbiAgICAgICAgICAgIFwiYWN0aW9uXCI6IFwiL3NlYXJjaFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImlucHV0XCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInFcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBBZGQgYSBsaW5rIHRvIHRoZSBuYXZiYXIgdGl0bGVcbiAgICAkKCcjbW0tMScpLmZpbmQoJy5tbS1uYXZiYXJfX3RpdGxlJykuYXR0cignaHJlZicsICcvJyk7XG5cbiAgICAkKCdib2R5Jykub24oJ21vdXNlZW50ZXInLCAnLnN1Yi1tZW51JywgZnVuY3Rpb24oKSB7XG4gICAgICAkKHRoaXMpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcbiAgICAgICQodGhpcykuZmluZCgnZGV0YWlscycpLmF0dHIoJ29wZW4nLCB0cnVlKTtcbiAgICB9KTtcblxuICAgICQoJ2JvZHknKS5vbignbW91c2VsZWF2ZScsICcuc3ViLW1lbnUnLCBmdW5jdGlvbigpIHtcbiAgICAgICQodGhpcykuYXR0cignYXJpYS1leHBhbmRlZCcsIGZhbHNlKTtcbiAgICAgICQodGhpcykuZmluZCgnZGV0YWlscycpLmF0dHIoJ29wZW4nLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmR5bmFtaWNEcm9wZG93bigpO1xuXG4gICAgdGhpcy5tb2JpbGVTZWFyY2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tb2JpbGUtc2VhcmNoXScpO1xuXG4gICAgaWYgKCF0aGlzLm1vYmlsZVNlYXJjaCkgcmV0dXJuO1xuXG4gICAgdGhpcy5tb2JpbGVTZWFyY2hBbmltYXRpb24gPSB0cmFuc2l0aW9uKHsgZWw6IHRoaXMubW9iaWxlU2VhcmNoLCBzdGF0ZTogJ2Nsb3NlZCcgfSk7XG4gICAgdGhpcy5tb2JpbGVTZWFyY2hJbnB1dHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubW0tc2VhcmNoZmllbGRfX2lucHV0IGlucHV0Jyk7XG4gICAgdGhpcy5tb2JpbGVTZWFyY2hDbG9zZSA9IHRoaXMubW9iaWxlU2VhcmNoLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlYXJjaC1jbG9zZV0nKTtcblxuICAgIHRoaXMubW9iaWxlU2VhcmNoSW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIoaW5wdXQsICdjbGljaycsICgpID0+IHRoaXMuX29wZW5Nb2JpbGVTZWFyY2goKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLm1vYmlsZVNlYXJjaENsb3NlLCAnY2xpY2snLCAoKSA9PiB0aGlzLl9jbG9zZU1vYmlsZVNlYXJjaCgpKTtcbiAgfSxcbiAgX29wZW5Nb2JpbGVTZWFyY2goKSB7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLm1vYmlsZVNlYXJjaCk7XG5cbiAgICB0aGlzLm1vYmlsZVNlYXJjaEFuaW1hdGlvbi5hbmltYXRlVG8oJ29wZW4nKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMubW9iaWxlU2VhcmNoLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlYXJjaC1pbnB1dF0nKTtcbiAgICAgICAgY29uc3QgaW5wdXRMZW5ndGggPSBpbnB1dC52YWx1ZS5sZW5ndGg7XG5cbiAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoaW5wdXRMZW5ndGgsIGlucHV0TGVuZ3RoKTtcbiAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgIH0pO1xuICB9LFxuICBfY2xvc2VNb2JpbGVTZWFyY2goKSB7XG4gICAgdGhpcy5tb2JpbGVTZWFyY2hBbmltYXRpb24uYW5pbWF0ZVRvKCdjbG9zZWQnKTtcbiAgfSxcbiAgc2V0SGVhZGVyUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuICAgIC8vIERldGVybWluZSB0aGUgaGVhZGVyIHBvc2l0aW9uXG4gICAgaWYgKCQoJy5wcm9tby1iYW5uZXInKS5sZW5ndGgpIHtcbiAgICAgIHZhciBhbm5vdW5jZW1lbnRIZWlnaHQgPSAkKCcucHJvbW8tYmFubmVyJykub3V0ZXJIZWlnaHQoKTtcbiAgICAgICQoJy5oZWFkZXInKS5jc3MoJ3RvcCcsIGFubm91bmNlbWVudEhlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQoJy5oZWFkZXInKS5jc3MoJ3RvcCcsICcwJyk7XG4gICAgfVxuICB9LFxuICBkeW5hbWljRHJvcGRvd246IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoZWFkZXJOYXZpZ2F0aW9uV2lkdGggPSAkKCdbZGF0YS1oZWFkZXItbmF2aWdhdGlvbl0nKS53aWR0aCgpO1xuICAgIHZhciAkaGVhZGVyTmF2SXRlbXMgPSAkKCdbZGF0YS1oZWFkZXItbmF2LWl0ZW1dJyk7XG4gICAgdmFyIGRyb3Bkb3duUG9zaXRpb24gPSAkKCcuaGVhZGVyJykuZGF0YSgnZHJvcGRvd24tcG9zaXRpb24nKTtcbiAgICB2YXIgc2luZ2xlTGluZU5hdiA9IHRydWU7XG4gICAgdmFyIHRvdGFsTmF2SXRlbXNXaWR0aCA9IDA7XG5cbiAgICAkaGVhZGVyTmF2SXRlbXMuZWFjaChmdW5jdGlvbihpbmRleCwgbmF2SXRlbSl7XG4gICAgICB0b3RhbE5hdkl0ZW1zV2lkdGggKz0gJChuYXZJdGVtKS5vdXRlcldpZHRoKCk7XG4gICAgfSlcblxuICAgIGlmICh0b3RhbE5hdkl0ZW1zV2lkdGggPiBoZWFkZXJOYXZpZ2F0aW9uV2lkdGgpIHtcbiAgICAgIHNpbmdsZUxpbmVOYXYgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZHJvcGRvd25Qb3NpdGlvbiA9PSAnYmVsb3dfaGVhZGVyJyAmJiBzaW5nbGVMaW5lTmF2ID09IHRydWUpIHtcbiAgICAgICQoJy5oZWFkZXJfYmFyJykucmVtb3ZlQ2xhc3MoJ2hlYWRlci1kcm9wZG93bi1wb3NpdGlvbi0tYmVsb3dfcGFyZW50Jyk7XG4gICAgICAkKCcuaGVhZGVyX2JhcicpLmFkZENsYXNzKCdoZWFkZXItZHJvcGRvd24tcG9zaXRpb24tLWJlbG93X2hlYWRlcicpO1xuICAgICAgJCgnLmhlYWRlcl9iYXInKS5hdHRyKCdkYXRhLWRyb3Bkb3duLXBvc2l0aW9uJywgJ2JlbG93X2hlYWRlcicpO1xuXG4gICAgICAkKCcuaGVhZGVyX2Jhci5oZWFkZXItZHJvcGRvd24tcG9zaXRpb24tLWJlbG93X2hlYWRlciAuZHJvcGRvd24nKS5jc3Moe1xuICAgICAgICBcInBhZGRpbmctdG9wXCI6ICQoJy5oZWFkZXInKS5oZWlnaHQoKSAvIDJcbiAgICAgIH0pO1xuXG4gICAgICAkKCcuaGVhZGVyX2Jhci5oZWFkZXItZHJvcGRvd24tcG9zaXRpb24tLWJlbG93X2hlYWRlciAuZGlzY2xvc3VyZV9fbGlzdC13cmFwJykuY3NzKHtcbiAgICAgICAgXCJwYWRkaW5nLXRvcFwiOiAkKCcuaGVhZGVyJykuaGVpZ2h0KCkgLyAyXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgJCgnLmhlYWRlcicpLmFkZENsYXNzKCdoZWFkZXItZHJvcGRvd24tcG9zaXRpb24tLWJlbG93X3BhcmVudCcpO1xuICAgICAgJCgnLmhlYWRlcicpLnJlbW92ZUNsYXNzKCdoZWFkZXItZHJvcGRvd24tcG9zaXRpb24tLWJlbG93X2hlYWRlcicpO1xuICAgICAgJCgnLmhlYWRlcicpLmF0dHIoJ2RhdGEtZ
1HJvcGRvd24tcG9zaXRpb24nLCAnYmVsb3dfcGFyZW50Jyk7XG5cbiAgICAgICQoJy5oZWFkZXIgLmRyb3Bkb3duJykucmVtb3ZlQXR0cignc3R5bGUnKTtcbiAgICB9XG4gIH0sXG4gIHNldFBhZGRpbmc6IGZ1bmN0aW9uKCkge1xuICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ2luZGV4JykgJiYgd2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubGFyZ2UubWF0Y2hlcykge1xuXG4gICAgICB2YXIgJHJlb3JkZXJhYmxlRmlyc3RTZWN0aW9uID0gJCgnLmluZGV4LXNlY3Rpb25zIC5zaG9waWZ5LXNlY3Rpb24nKS5maXJzdCgpO1xuXG4gICAgICBpZiAoJHJlb3JkZXJhYmxlRmlyc3RTZWN0aW9uLmhhc0NsYXNzKCdwYXJhbGxheC1iYW5uZXInKSkge1xuXG4gICAgICAgIGlmICgkKCcuaGVhZGVyJykuaGFzQ2xhc3MoJ2hlYWRlci1iYWNrZ3JvdW5kLS10cnVlJykgJiYgJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdoZWFkZXItdHJhbnNwYXJlbmN5LS1mYWxzZScpKXtcbiAgICAgICAgICAkcmVvcmRlcmFibGVGaXJzdFNlY3Rpb24uY3NzKCdwYWRkaW5nLXRvcCcsICQoJy5oZWFkZXInKS5oZWlnaHQoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIG9wZW5Ecm9wZG93bjogZnVuY3Rpb24oKSB7XG5cbiAgICAkKCdbZGF0YS1oZWFkZXItbmF2LWRldGFpbHNdJykub24oJ2NsaWNrJywgaGFuZGxlRGV0YWlsQ2xpY2spO1xuICAgICQoJ1tkYXRhLWhlYWRlci1uYXYtZGV0YWlsc10nKS5vbigndG91Y2hlbmQnLCBoYW5kbGVEZXRhaWxDbGljayk7XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVEZXRhaWxDbGljayhlKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBjb25zdCBjbGlja2VkUGFyZW50ID0gZS50YXJnZXQuY2xvc2VzdCgnbGkuc3ViLW1lbnUnKTtcbiAgICAgIGNvbnN0IGNsaWNrZWREZXRhaWxzID0gZS5jdXJyZW50VGFyZ2V0O1xuICAgICAgY29uc3QgY2xpY2tlZExpbmsgPSBjbGlja2VkRGV0YWlscy5xdWVyeVNlbGVjdG9yKCdzdW1tYXJ5Jyk7XG5cbiAgICAgIGNvbnN0IGRldGFpbHNFbGVtZW50cyA9IFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGVhZGVyX19uYXZpZ2F0aW9uIGxpLnN1Yi1tZW51ID4gW2RhdGEtaGVhZGVyLW5hdi1kZXRhaWxzXScpXTtcblxuICAgICAgLy8gQ2xvc2Ugc2libGluZ3NcbiAgICAgIGlmIChkZXRhaWxzRWxlbWVudHMuaW5jbHVkZXMoY2xpY2tlZERldGFpbHMpKSB7XG4gICAgICAgIGRldGFpbHNFbGVtZW50cy5mb3JFYWNoKGRldGFpbHNFbGVtZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZGV0YWlsc0VsZW1lbnQ7XG4gICAgICAgICAgaWYgKGRldGFpbHMgIT09IGNsaWNrZWREZXRhaWxzKSB7XG4gICAgICAgICAgICBkZXRhaWxzLm9wZW4gPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBsaW5rIGJlaW5nIGNsaWNrZWQgaXMgYSBwYXJlbnQgbGluaywgdGhlbiB0YWtlIGNvbnRyb2wgb2YgdGhlIG5hdmlnYXRpb25cbiAgICAgIGlmIChjbGlja2VkUGFyZW50ICYmIGNsaWNrZWRMaW5rLmdldEF0dHJpYnV0ZSgnaHJlZicpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoY2xpY2tlZERldGFpbHMub3Blbikge1xuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IGNsaWNrZWRMaW5rLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBzdWJtZW51IGlzbid0IG9wZW4sIG9wZW4gaXRcbiAgICAgICAgY2xpY2tlZERldGFpbHMub3BlbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICB1bmxvYWQ6IGZ1bmN0aW9uKCR0YXJnZXQpe1xuICAgICQoJ2FbaHJlZl49XCIjXCJdJykub2ZmKCdjbGljaycpO1xuICAgICQoJ1tkYXRhLWhlYWRlci1uYXYtZGV0YWlsc10nKS5vZmYoJ2NsaWNrJyk7XG4gICAgJCgnW2RhdGEtaGVhZGVyLW5hdi1kZXRhaWxzXScpLm9mZigndG91Y2hlbmQnKTtcbiAgfVxufVxuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgSG9tZSBwYWdlIC0gZmVhdHVyZWQgcHJvbW90aW9uc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxud2luZG93LmZlYXR1cmVkX3Byb21vdGlvbnMgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKCl7XG4gICAgd2luZG93LmFuaW1hdGVfY29udGVudC5pbml0KCk7XG4gIH0sXG4gIHVubG9hZDogZnVuY3Rpb24oJHRhcmdldCl7XG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIEhvbWUgcGFnZSAtIHZpZGVvXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0q
1L1xuXG53aW5kb3cudmlkZW9UaGVtZSA9IHtcbiAgaW5pdDogZnVuY3Rpb24oKXtcblxuICAgIC8vIFNldCB1cCBwbHlyIGZvciBuZXdseSBlbWJlZGRlZCB2aWRlb1xuICAgIHZhciBmZWF0dXJlZFZpZGVvcyA9ICQoJ1tkYXRhLXZpZGVvLWVsZW1lbnRdJykuZ2V0KCk7XG5cbiAgICB2YXIgZmVhdHVyZWRWaWRlb1BsYXllcnMgPSBQbHlyLnNldHVwKGZlYXR1cmVkVmlkZW9zLCB7XG4gICAgICBjb250cm9sczogY29udHJvbHMsXG4gICAgICBmdWxsc2NyZWVuOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGZhbGxiYWNrOiB0cnVlLFxuICAgICAgICBpb3NOYXRpdmU6IHRydWVcbiAgICAgIH0sXG4gICAgICBzdG9yYWdlOiB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBBZGRzIHBseXIgdmlkZW8gaWQgdG8gdmlkZW8gd3JhcHBlclxuICAgICQuZWFjaChmZWF0dXJlZFZpZGVvUGxheWVycywgZnVuY3Rpb24oaW5kZXgsIHBsYXllcikge1xuICAgICAgdmFyIGlkID0gcGxheWVyLmlkO1xuICAgICAgdmFyICR2aWRlbztcblxuICAgICAgaWYgKHBsYXllci5pc0hUTUw1KSB7XG4gICAgICAgICR2aWRlbyA9ICQocGxheWVyLmVsZW1lbnRzLndyYXBwZXIpLmZpbmQoJ3ZpZGVvJyk7XG4gICAgICAgICR2aWRlby5hdHRyKCdkYXRhLXBseXItdmlkZW8taWQnLCBpZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdoZW4gYSB2aWRlbyBpcyBwbGF5aW5nLCBwYXVzZSBhbnkgb3RoZXIgaW5zdGFuY2VzXG4gICAgICBwbGF5ZXIub24oJ3BsYXknLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICB2Y
1XIgaW5zdGFuY2UgPSBldmVudC5kZXRhaWwucGx5cjtcbiAgICAgICAgJC5lYWNoKGZlYXR1cmVkVmlkZW9QbGF5ZXJzLCBmdW5jdGlvbihpbmRleCwgcGxheWVyKSB7XG4gICAgICAgICAgaWYgKGluc3RhbmNlLmlkICE9IHBsYXllci5pZCkge1xuICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgJCgnW2RhdGEtdmlkZW8tZWxlbWVudF0nKS5lYWNoKGZ1bmN0aW9uKGluZGV4LCB2aWRlbykge1xuXG4gICAgICAvLyBWYXJpYWJsZXNcbiAgICAgIHZhciAkdmlkZW8gPSAkKHZpZGVvKTtcbiAgICAgIHZhciAkc2VjdGlvbiA9ICR2aWRlby5wYXJlbnRzKCcuc2hvcGlmeS1zZWN0aW9uJykuYXR0cignaWQnLCBpZCk7XG4gICAgICB2YXIgJHZpZGVvRWxlbWVudCA9ICRzZWN0aW9uLmZpbmQoJHZpZGVvKTtcbiAgICAgIHZhciAkdmlkZW9XcmFwcGVyID0gJHZpZGVvRWxlbWVudC5wYXJlbnRzKCcudmlkZW8td3JhcHBlcicpO1xuICAgICAgdmFyICRwbGF5QnV0dG9uID0gJHZpZGVvV3JhcHBlci5maW5kKCdbZGF0YS1wbGF5LWJ1dHRvbl0nKTtcbiAgICAgIHZhciAkdmlkZW9UZXh0ID0gJHZpZGVvV3JhcHBlci5maW5kKCdbZGF0YS12aWRlby10ZXh0XScpO1xuICAgICAgdmFyICR2aWRlb1RleHRDb250YWluZXIgPSAkdmlkZW9XcmFwcGVyLmZpbmQoJ1tkYXRhLXZpZGVvLXRleHQtY29udGFpbmVyXScpO1xuICAgICAgdmFyICRwb3N0ZXJJbWFnZSA9ICR2aWRlb1dyYXBwZXIuZGF0YSgncG9zdGVyLWltYWdlLXVwbG9hZGVkJyk7XG4gICAgICB2Y
1XIgYXNwZWN0UmF0aW8gPSAkdmlkZW9XcmFwcGVyLmRhdGEoJ2FzcGVjdC1yYXRpbycpO1xuICAgICAgdmFyIGlkID0gJHZpZGVvV3JhcHBlci5kYXRhKCd2aWRlby1zcmMnKTtcbiAgICAgIHZhciBpc0F1dG9wbGF5ID0gJHZpZGVvV3JhcHBlci5kYXRhKCdhdXRvcGxheScpO1xuICAgICAgdmFyIGlzTG9vcGluZ0VuYWJsZWQgPSAkdmlkZW9XcmFwcGVyLmRhdGEoJ2F1dG9sb29wJyk7XG4gICAgICB2YXIgaXNNdXRlZCA9ICR2aWRlb1dyYXBwZXIuZGF0YSgnbXV0ZS12aWRlbycpO1xuXG4gICAgICAkLmVhY2goZmVhdHVyZWRWaWRlb1BsYXllcnMsIGZ1bmN0aW9uKGluZGV4LCBwbGF5ZXIpIHtcbiAgICAgICAgdmFyIHZpZGVvSUQ7XG4gICAgICAgIHZhciBwbGF5ZXJJRDtcblxuICAgICAgICBpZiAocGxheWVyLmlzWW91VHViZSB8fCBwbGF5ZXIuaXNWaW1lbykge1xuICAgICAgICAgIHZhciB2aWRlb0lEID0gJHZpZGVvV3JhcHBlci5hdHRyKCdpZCcpO1xuICAgICAgICAgIHZhciBwbGF5ZXJJRCA9ICQocGxheWVyLmVsZW1lbnRzLm9yaWdpbmFsKS5hdHRyKCdpZCcpO1xuICAgICAgICB9IGVsc2UgaWYgKHBsYXllci5pc0hUTUw1KSB7XG4gICAgICAgICAgdmFyIHZpZGVvSUQgPSAkdmlkZW9XcmFwcGVyLmZpbmQoJ1tkYXRhLXBseXItdmlkZW8taWRdJykuZGF0YSgncGx5ci12aWRlby1pZCcpO1xuICAgICAgICAgIHZhciBwbGF5ZXJJRCA9IHBsYXllci5pZDtcbiAgICAgICAgICAkdmlkZW9FbGVtZW50ID0gJHNlY3Rpb24uZmluZCgnLnBseXItLXZpZGVvJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGxheWVySUQgPT0gdmlkZW9JRCkge1xuXG4gICAgICAgICAgLy8gUmVzZXQgcGxheSBidXR0b24gaWNvblxuICAgICAgICAgICR2aWRlb1dyYXBwZXIucmVtb3ZlQ2xhc3MoJ3BsYXktYnV0dG9uLWljb24tLXZpc2libGUnKTtcblxuICAgICAgICAgIC8vIFJlc2V0IGltYWdlXG4gICAgICAgICAgJHZpZGVvV3JhcHBlci5yZW1vdmVDbGFzcygndmlkZW8taXMtcGxheWluZycpO1xuXG4gICAgICAgICAgLy8gQXV0b3BsYXlcbiAgICAgICAgICBpZiAoaXNBdXRvcGxheSkge1xuICAgICAgICAgICAgLy8gSWYgb24gZGVza3RvcCBvciBwbGF5ZXIgaXMgWW91VHViZS9WaW1lb1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZS5tZWRpYV9xdWVyaWVzLmxhcmdlLm1hdGNoZXMgfHwgcGxheWVyLmlzWW91VHViZSB8fCBwbGF5ZXIuaXNWaW1lbykge1xuXG4gICAgICAgICAgICAgIHBsYXllci5hdXRvcGxheSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgLy8gSGlkZSBpbWFnZVxuICAgICAgICAgICAgICAkdmlkZW9XcmFwcGVyLmFkZENsYXNzKCd2aWRlby1pcy1wbGF5aW5nJyk7XG5cbiAgICAgICAgICAgICAgLy8gU2hvdyB2aWRlb1xuICAgICAgICAgICAgICAkdmlkZW9FbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAvLyBJZiBkaXNwbGF5IHRleHQgb3ZlciB2aWRlbyB1bmNoZWNrZWRcbiAgICAgICAgICAgICAgaWYgKCR2aWRlb1RleHRDb250YWluZXIuaGFzQ2xhc3MoJ2Rpc3BsYXktdGV4dC1vdmVyLXZpZGVvLS1mYWxzZScpKSB7XG4gICAgICAgICAgICAgICAgJHZpZGVvVGV4dC5oaWRlKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJHZpZGVvVGV4dC5zaG93KCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBLZWVwIHBsYXkgYnV0dG9uIGhpZGRlblxuICAgICAgICAgICAgICAkcGxheUJ1dHRvbi5oaWRlKCk7XG5cbiAgICAgICAgICAgICAgLy8gSFRNTDUgTW9iaWxlIFZpZGVvXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5QWFVUaGVtZS5tZWRpYV9xdWVyaWVzLm1lZGl1bS5tYXRjaGVzICYmIHBsYXllci5pc0hUTUw1KSB7XG5cbiAgICAgICAgICAgICAgLy8gSGlkZSBpbWFnZVxuICAgICAgICAgICAgICAkdmlkZW9XcmFwcGVyLmFkZENsYXNzKCd2aWRlby1pcy1wbGF5aW5nJyk7XG5cbiAgICAgICAgICAgICAgLy8gU2hvdyB2aWRlb1xuICAgICAgICAgICAgICAkdmlkZW9FbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAvLyBEaXNwbGF5IGJ1dHRvbiBzbyB0aGF0IHZpZGVvIGNhbiBiZSBwbGF5ZWRcbiAgICAgICAgICAgICAgJHBsYXlCdXR0b24uc2hvdygpO1xuXG4gICAgICAgICAgICAgIHBsYXllci5vbigncGxheScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIFNob3cgdmlkZW9cbiAgICAgICAgICAgICAgICAkdmlkZW9FbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgIC8vIEhpZGUgcGxheSBidXR0b25cbiAgICAgICAgICAgICAgICAkcGxheUJ1dHRvbi5oaWRlKCk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHsgLy8gSWYgQXV0b3BsYXkgZGlzYWJsZWRcbiAgICAgICAgICAgIC8vIElmIHBvc3RlciBpbWFnZSwgc2hvdyBpbWFnZSB3cmFwcGVyIG90aGVyd2lzZSBoaWRlIGl0XG4gICAgICAgICAgICBpZiAoJHBvc3RlckltYWdlKSB7XG4gICAgICAgICAgICAgICR2aWRlb1dyYXBwZXIucmVtb3ZlQ2xhc3MoJ3ZpZGVvLWlzLXBsYXlpbmcnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICR2aWRlb1dyYXBwZXIuYWRkQ2xhc3MoJ3ZpZGVvLWlzLXBsYXlpbmcnKTtcbiAgICAgICAgICAgICAgJHZpZGVvRWxlbWVudC5zaG93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2xpY2tpbmcgaW1hZ2Ugd2lsbCBwbGF5IHZpZGVvXG4gICAgICAgICAgJHZpZGVvV3JhcHBlci5maW5kKCcucGFyYWxsYXhfX3dyYXAsIC5iYW5uZXJfX3dyYXAnKS5vbignY2xpY2snLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYgKCFwbGF5ZXIucGxheWluZyAmJiAhJHZpZGVvV3JhcHBlci5oYXNDbGFzcygndmlkZW8taXMtcGxheWluZycpKSB7XG4gICAgICAgICAgICAgIHBsYXllci5wbGF5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIC8vIE11dGVkXG4gICAgICAgICAgaWYgKGlzTXV0ZWQpIHtcbiAgICAgICAgICAgIHBsYXllci5tdXRlZCA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQXNwZWN0IFJhdGlvXG4gICAgICAgICAgaWYgKGFzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICBwbGF5ZXIucmF0aW8gPSBhc3BlY3RSYXRpbztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBMb29waW5nXG4gICAgICAgICAgaWYgKGlzTG9vcGluZ0VuYWJsZWQpIHtcbiAgICAgICAgICAgI
1HBsYXllci5sb29wID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTaG93IFZpZGVvIENvbnRyb2xzXG4gICAgICAgICAgLy8gLSB2aWRlbyBjb250cm9scyBnZXQgaGlkZGVuIHVzaW5nIGEgY3NzIGNsYXNzOiAnLnZpZGVvLWNvbnRyb2xzLWVuYWJsZWQtLWZhbHNlJ1xuXG4gICAgICAgICAgLy8gSWYgYnV0dG9uIGV4aXN0cywgaGlkZSB0ZXh0IGFuZCBwb3N0ZXJcbiAgICAgICAgICBpZiAoJHBsYXlCdXR0b24pIHtcbiAgICAgICAgICAgICRwbGF5QnV0dG9uLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgIC8vIEhpZGUgaW1hZ2VcbiAgICAgICAgICAgICAgJHZpZGVvV3JhcHBlci5hZGRDbGFzcygndmlkZW8taXMtcGxheWluZycpO1xuXG4gICAgICAgICAgICAgIC8vIFNob3cgdmlkZW9cbiAgICAgICAgICAgICAgJHZpZGVvRWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgLy8gSWYgZGlzcGxheSB0ZXh0IG92ZXIgdmlkZW8gdW5jaGVja2VkXG4gICAgICAgICAgICAgIGlmICgkdmlkZW9UZXh0Q29udGFpbmVyLmhhc0NsYXNzKCdkaXNwbGF5LXRleHQtb3Zlci12aWRlby0tZmFsc2UnKSkge1xuICAgICAgICAgICAgICAgICR2aWRlb1RleHQuaGlkZSgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICR2aWRlb1RleHQuc2hvdygpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUGxheSB2aWRlb1xuICAgICAgICAgICAgICBwbGF5ZXIucGxheSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwbGF5ZXIub24oJ3JlYWR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB3aW5kb3cudmlkZW9UaGVtZS5yZXNpemVWaWRlbygkdmlkZW9XcmFwcGVyKTtcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcGxheWVyLm9uKCdwbGF5JywgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIC8vIEhpZGUgaW1hZ2VcbiAgICAgICAgICAgICR2aWRlb1dyYXBwZXIuYWRkQ2xhc3MoJ3ZpZGVvLWlzLXBsYXlpbmcnKTtcblxuICAgICAgICAgICAgLy8gUmVzZXQgcGxheSBidXR0b24gaWNvblxuICAgICAgICAgICAgJHZpZGVvV3JhcHBlci5yZW1vdmVDbGFzcygncGxheS1idXR0b24taWNvbi0tdmlzaWJsZScpO1xuXG4gICAgICAgICAgICAvLyBTaG93IHZpZGVvXG4gICAgICAgICAgICAkdmlkZW9FbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgLy8gSWYgZGlzcGxheSB0ZXh0IG92ZXIgdmlkZW8gdW5jaGVja2VkXG4gICAgICAgICAgICBpZiAoJHZpZGVvVGV4dENvbnRhaW5lci5oYXNDbGFzcygnZGlzcGxheS10ZXh0LW92ZXItdmlkZW8tLWZhbHNlJykpIHtcbiAgICAgICAgICAgICAgJHZpZGVvVGV4dC5oaWRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAkdmlkZW9UZXh0LnNob3coKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGlkZSBwbGF5IGJ1dHRvblxuICAgICAgICAgICAgaWYgKCRwbGF5QnV0dG9uKSB7XG4gICAgICAgICAgICAgICRwbGF5QnV0dG9uLmhpZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gSWYgdmlkZW8gaXMgcGF1c2VkLCBwbGF5IGJ1dHRvbiBpY29uIG9yIGJ1dHRvbiBtdXN0IGJlIHNob3duXG4gICAgICAgICAgLy8gSWYgYnV0dG9uIHRleHQgaXMgZmlsbGVkIG91dCwgdXNlIHBsYXkgYnV0dG9uXG4gICAgICAgICAgLy8gSWYgYnV0dG9uIHRleHQgaXMgbm90IGZpbGxlZCBvdXQsIHVzZSBwbGF5IGJ1dHRvbiBpY29uXG4gICAgICAgICAgcGxheWVyLm9uKCdwYXVzZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKCRwbGF5QnV0dG9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgJHBsYXlCdXR0b24uc2hvdygpO1xuICAgICAgICAgICAgICAkdmlkZW9XcmFwcGVyLnJlbW92ZUNsYXNzKCdwbGF5LWJ1dHRvbi1pY29uLS12aXNpYmxlJyk7XG4gICAgICAgICAgICAgICR2aWRlb1RleHRDb250YWluZXIuaGlkZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgJHZpZGVvV3JhcHBlci5hZGRDbGFzcygncGxheS1idXR0b24taWNvbi0tdmlzaWJsZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICAvLyBJZiBwYWdlIGxvYWRzIHdpdGggdmlkZW8gcGF1c2VkIGFuZCBubyBidXR0b24gc2hvd2luZywgc2hvdyBpY29uXG4gICAgICAgICAgaWYgKCFwbGF5ZXIucGxheWluZyAmJiAkcGxheUJ1dHRvbi5pcygnOmhpZGRlbicpIHx8ICRwbGF5QnV0dG9uLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAkdmlkZW9XcmFwcGVyLmFkZENsYXNzKCdwbGF5LWJ1dHRvbi1pY29uLS12aXNpYmxlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cblxuICB9LFxuICByZXNpemVWaWRlbzogZnVuY3Rpb24oJHZpZGVvV3JhcHBlcikge1xuICAgIC8vIGdldCBoZWlnaHQgYW5kIHdpZHRoIG9mIHRoZSB2aWRlb1xuICAgIHZhciB2aWRlb0hlaWdodCA9ICR2aWRlb1dyYXBwZXIuZmluZCgnLnBseXItLXZpZGVvJykuaGVpZ2h0KCk7XG4gICAgdmFyIHZpZGVvV2lkdGggPSAkdmlkZW9XcmFwcGVyLmZpbmQoJy5wbHlyX192aWRlby13cmFwcGVyJykud2lkdGgoKTtcblxuICAgIC8vIGNhbGN1bGF0ZSBjb3JyZWN0IHBhZGRpbmctYm90dG9tIHBlcmNlbnRhZ2UgZm9yIHJlc3BvbnNpdmUgdmlkZW9zXG4gICAgdmFyIHBhZGRpbmdCb3R0b20gPSAoIHZpZGVvSGVpZ2h0IC8gdmlkZW9XaWR0aCApICogMTAwO1xuXG4gICAgLy8gYXBwbHkgdGhhdCBwYWRkaW5nIGJvdHRvbSByYXRpb1xuICAgICR2aWRlb1dyYXBwZXIuZmluZCgnLnBseXJfX3ZpZGVvLXdyYXBwZXInKS5jc3MoJ3BhZGRpbmctYm90dG9tJywgcGFkZGluZ0JvdHRvbSArICclJyk7XG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIEJhbm5lciBpbWFnZVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxud2luZG93LmJhbm5lcl9pbWFnZSA9IHtcbiAgaW5pdDogZnVuY3Rpb24oKXtcblxuICAgI
1HZhciBjb250ZW50QXJlYVBhZGRpbmcgPSAkKCcuaGVhZGVyJykuZGF0YSgnY29udGVudC1hcmVhLXBhZGRpbmcnKTtcblxuICAgIGlmICh3aW5kb3cuUFhVVGhlbWUubWVkaWFfcXVlcmllcy5sYXJnZS5tYXRjaGVzKSB7XG4gICAgICB2YXIgJHJlb3JkZXJhYmxlRmlyc3RTZWN0aW9uID0gJCgnLmdsb2JhbC13cmFwcGVyIC5zaG9waWZ5LXNlY3Rpb24nKS5maXJzdCgpO1xuXG4gICAgICAkcmVvcmRlcmFibGVGaXJzdFNlY3Rpb24uYXR0cignc3R5bGUnLCAnJyk7XG5cbiAgICAgIGlmICgkcmVvcmRlcmFibGVGaXJzdFNlY3Rpb24uaGFzQ2xhc3MoJ3BhcmFsbGF4LWJhbm5lcicpKSB7XG4gICAgICAgIC8vIEhhcyBiYW5uZXJcbiAgICAgICAgaWYgKCQoJy5oZWFkZXInKS5oYXNDbGFzcygnaGVhZGVyLWJhY2tncm91bmQtLXRydWUnKSAmJiAkKCcuaGVhZGVyJykuaGFzQ2xhc3MoJ2hlYWRlci10cmFuc3BhcmVuY3ktLWZhbHNlJykpIHtcbiAgICAgICAgICBpZiAoJCgnLmdsb2JhbC13cmFwcGVyX19wcm9kdWN0JykubGVuZ3RoIHx8ICQoJy5zaG9waWZ5LXBvbGljeV9fY29udGFpbmVyJykubGVuZ3RoIHx8ICQoJy5nbG9iYWwtd3JhcHBlcl9fY3VzdG9tZXInKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICQoJy5nbG9iYWwtd3JhcHBlcl9fcHJvZHVjdCwgLnNob3BpZnktcG9saWN5X19jb250YWluZXIsIC5nbG9iYWwtd3JhcHBlcl9fY3VzdG9tZXInKS5jc3MoJ3BhZGRpbmctdG9wJywgJCgnLmhlYWRlcicpLmhlaWdodCgpICsgY29udGVudEFyZWFQYWRkaW5nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHJlb3JkZXJhYmxlRmlyc3RTZWN0aW9uLmNzcygncGFkZGluZy10b3AnLCAkKCcuaGVhZGVyJykuaGVpZ2h0KCkgKyBjb250ZW50QXJlYVBhZGRpbmcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICQoJy5oZWFkZXInKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZmVhdHVyZV9pbWFnZScpO1xuICAgICAgICAgICQoJy5oZWFkZXInKS5hZGRDbGFzcygnaGVhZGVyX2JhcicpO1xuXG4gICAgICAgICAgaWYgKCQoJy5oZWFkZXInKS5oYXNDbGFzcygnc3RpY2t5LWhlYWRlci0tZmFsc2UnKSkge1xuICAgICAgICAgICAgJCgnLmhlYWRlcicpLmFkZENsYXNzKCdpcy1hYnNvbHV0ZScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKCcuaGVhZGVyLmlzLWFic29sdXRlJykucmVtb3ZlQ2xhc3MoJ2lzLWFic29sdXRlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCQoJy5oZWFkZXInKS5oYXNDbGFzcygnaGVhZGVyLWJhY2tncm91bmQtLWZhbHNlJykgJiYgJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdoZWFkZXItdHJhbnNwYXJlbmN5LS10cnVlJykpIHtcbiAgICAgICAgICAkKCcuaGVhZGVyJykucGFyZW50KCkuYWRkQ2xhc3MoJ2ZlYXR1cmVfaW1hZ2UnKTtcbiAgICAgICAgICAkKCcuaGVhZGVyJykucmVtb3ZlQ2xhc3MoJ2hlYWRlcl9iYXInKTtcbiAgICAgICAgICAkKCcuaGVhZGVyJykuYWRkQ2xhc3MoJ2lzLWFic29sdXRlJyk7XG5cbiAgICAgICAgICBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdzdGlja3ktaGVhZGVyLS10cnVlJykpIHtcbiAgICAgICAgICAgICQoJy5oZWFkZXInKS5hZGRDbGFzcygnaXMtYWJzb2x1dGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdoZWFkZXItYmFja2dyb3VuZC0tZmFsc2UnKSAmJiAkKCcuaGVhZGVyJykuaGFzQ2xhc3MoJ2hlYWRlci10cmFuc3BhcmVuY3ktLWZhbHNlJykpIHtcbiAgICAgICAgICAkKCcuaGVhZGVyJykucGFyZW50KCkuYWRkQ2xhc3MoJ2ZlYXR1cmVfaW1hZ2UnKTtcbiAgICAgICAgICAkKCcuaGVhZGVyJykucmVtb3ZlQ2xhc3MoJ2hlYWRlcl9iYXInKTtcbiAgICAgICAgICAkKCcuaGVhZGVyJykuYWRkQ2xhc3MoJ2lzLWFic29sdXRlJyk7XG5cbiAgICAgICAgICBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdzdGlja3ktaGVhZGVyLS10cnVlJykpIHtcbiAgICAgICAgICAgICQoJy5oZWFkZXInKS5hZGRDbGFzcygnaXMtYWJzb2x1dGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdoZWFkZXItYmFja2dyb3VuZC0tdHJ1ZScpICYmICQoJy5oZWFkZXInKS5oYXNDbGFzcygnaGVhZGVyLXRyYW5zcGFyZW5jeS0tdHJ1ZScpKSB7XG4gICAgICAgICAgJCgnLmhlYWRlcicpLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdmZWF0dXJlX2ltYWdlJyk7XG4gICAgICAgICAgJCgnLmhlYWRlcicpLmFkZENsYXNzKCdoZWFkZXJfYmFyJyk7XG5cbiAgICAgICAgICBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdzdGlja3ktaGVhZGVyLS1mYWxzZScpKSB7XG4gICAgICAgICAgICAkKCcuaGVhZGVyJykuYWRkQ2xhc3MoJ2lzLWFic29sdXRlJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQoJy5oZWFkZXIuaXMtYWJzb2x1dGUnKS5yZW1vdmVDbGFzcygnaXMtYWJzb2x1dGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIGJhbm5lclxuICAgICAgICBpZiAoJCgnLmdsb2JhbC13cmFwcGVyX19wcm9kdWN0JykubGVuZ3RoIHx8ICQoJy5zaG9waWZ5LXBvbGljeV9fY29udGFpbmVyJykubGVuZ3RoIHx8ICQoJy5nbG9iYWwtd3JhcHBlcl9fY3VzdG9tZXInKS5sZW5ndGgpIHtcbiAgICAgICAgICAkKCcuZ2xvYmFsLXdyYXBwZXJfX3Byb2R1Y3QsIC5zaG9waWZ5LXBvbGljeV9fY29udGFpbmVyLCAuZ2xvYmFsLXdyYXBwZXJfX2N1c3RvbWVyJykuY3NzKCdwYWRkaW5nLXRvcCcsICQoJy5oZWFkZXInKS5oZWlnaHQoKSArIGNvbnRlbnRBcmVhUGFkZGluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJHJlb3JkZXJhYmxlRmlyc3RTZWN0aW9uLmNzcygncGFkZGluZy10b3AnLCAkKCcuaGVhZGVyJykuaGVpZ2h0KCkgKyBjb250ZW50QXJlYVBhZGRpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCQoJy5oZWFkZXInKS5oYXNDbGFzcygnc3RpY2t5LWhlYWRlci0tZmFsc2UnKSkge1xuICAgICAgICAgICQoJy5oZWFkZXInKS5hZGRDbGFzcygnaGVhZGVyX2JhcicpO1xuICAgICAgICAgICQoJy5oZWFkZXInKS5hZGRDbGFzcygnaXMtYWJzb2x1dGUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkKCcuZmVhdHVyZV9pbWFnZScpLnJlbW92ZUNsYXNzKCdmZWF0dXJlX2ltYWdlJyk7XG4gICAgICAgICAgJCgnLmhlYWRlcicpLmFkZENsYXNzKCdoZWFkZXJfYmFyJyk7XG4gICAgICAgICAgJCgnLmhlYWRlci5pcy1hYnNvbHV0ZScpLnJlbW92ZUNsYXNzKCdpcy1hYnNvbHV0ZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuICByZXNldFBhZGRpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgJHJlb3JkZXJhYmxlRmlyc3RTZWN0aW9uID0gJCgnLmdsb2JhbC13cmFwcGVyIC5zaG9waWZ5LXNlY3Rpb24nKS5maXJzdCgpO1xuXG4gICAgaWYgKCRyZW9yZGVyYWJsZUZpcnN0U2VjdGlvbi5oYXNDbGFzcygncGFyYWxsYXgtYmFubmVyJykpIHtcbiAgICAgICRyZW9yZGVyYWJsZUZpcnN0U2VjdGlvbi5jc3MoJ3BhZGRpbmctdG9wJywgJzBweCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAod2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubGFyZ2UubWF0Y2hlcykge1xuICAgICAgICBpZiAoJCgnLmdsb2JhbC13cmFwcGVyX19wcm9kdWN0JykubGVuZ3RoIHx8ICQoJ
1y5zaG9waWZ5LXBvbGljeV9fY29udGFpbmVyJykubGVuZ3RoIHx8ICQoJy5nbG9iYWwtd3JhcHBlcl9fY3VzdG9tZXInKS5sZW5ndGgpIHtcbiAgICAgICAgICAkKCcuZ2xvYmFsLXdyYXBwZXJfX3Byb2R1Y3QsIC5zaG9waWZ5LXBvbGljeV9fY29udGFpbmVyLCAuZ2xvYmFsLXdyYXBwZXJfX2N1c3RvbWVyJykuY3NzKCdwYWRkaW5nLXRvcCcsICQoJy5oZWFkZXInKS5oZWlnaHQoKSArIHdpbmRvdy5jb250ZW50QXJlYVBhZGRpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRyZW9yZGVyYWJsZUZpcnN0U2VjdGlvbi5jc3MoJ3BhZGRpbmctdG9wJywgJCgnLmhlYWRlcicpLmhlaWdodCgpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJHJlb3JkZXJhYmxlRmlyc3RTZWN0aW9uLmNzcygncGFkZGluZy10b3AnLCAnMHB4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICB1bmxvYWQ6IGZ1bmN0aW9uKCR0YXJnZXQpe1xuXG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIEFubm91bmNlbWVudCBCYXJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbnZhciBhbm5vdW5jZW1lbnRfYmFyID0ge1xuICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICBpZiAoJCgnLnByb21vLWJhbm5lcicpLmxlbmd0aCkge1xuICAgICAgdmFyIGFubm91bmNlbWVudCA9IENvb2tpZXMuZ2V0KCdwcm9tby1iYW5uZXInKTtcbiAgICAgIGlmKGFubm91bmNlbWVudCAhPSAnZGlzbWlzcycpIHtcbiAgICAgICAgJCgnYm9keScpLmFkZENsYXNzKCdwcm9tby1iYW5uZXItLXRydWUnKTtcbiAgICAgICAgJCgnLnByb21vLWJhbm5lcl9fY2xvc2UnKS5vbignY2xpY2snLCBmdW5jdGlvbigpe1xuICAgICAgICAgICQoJy5wcm9tby1iYW5uZXItLXRydWUnKS5hdHRyKCdzdHlsZScsICcnKTtcbiAgICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ3Byb21vLWJhbm5lci0tdHJ1ZScpO1xuICAgICAgICAgIGFubm91bmNlbWVudF9iYXIuc2V0UGFkZGluZygpO1xuICAgICAgICAgIENvb2tpZXMuc2V0KCdwcm9tby1iYW5uZXInLCAnZGlzbWlzcycsIHsgcGF0aDogJy8nIH0sIHsgZXhwaXJlczogMzAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvL2NhbGwgc2V0UGFkZGluZyBvbiBpbml0aWFsaXphdGlvblxuICAgIGFubm91bmNlbWVudF9iYXIuc2V0UGFkZGluZygpO1xuICB9LFxuICBzZXRQYWRkaW5nOiBmdW5jdGlvbigpIHtcbiAgICAvLyBTZXR0aW5nIHBhZGRpbmcgcmVsYXRpdmUgdG8gcHJvbW8gYmFubmVyIGhlaWdodFxuICAgIHZhciBiYW5uZXJIZWlnaHQgPSAkKCcucHJvbW8tYmFubmVyJykuaW5uZXJIZWlnaHQoKTtcbiAgICB2YXIgYmFubmVyUGFkZGluZyA9IChiYW5uZXJIZWlnaHQgLSAyNSkgKyAncHgnO1xuICAgIHZhciBwYXJlbnRTZWN0aW9uID0gJCgnLnByb21vLWJhbm5lcicpLnBhcmVudCgnLnNob3BpZnktc2VjdGlvbi0taGVhZGVyJyk7XG4gICAgaWYgKCQoJ2JvZHknKS5oYXNDbGFzcygncHJvbW8tYmFubmVyLS10cnVlJykpIHtcbiAgICAgIGlmICgkKCcuaGVhZGVyJykuaGFzQ2xhc3MoJ3N0aWNreS1oZWFkZXItLXRydWUnKSB8fCAkKCcubW9iaWxlLWhlYWRlcicpLmhhc0NsYXNzKCdtb2JpbGUtc3RpY2t5LWhlYWRlci0tZmFsc2UnKSAmJiB3aW5kb3cuUFhVVGhlbWUubWVkaWFfcXVlcmllcy5tZWRpdW0ubWF0Y2hlcykge1xuICAgICAgICAkKHBhcmVudFNlY3Rpb24pLmNzcygncGFkZGluZy1ib3R0b20nLCBiYW5uZXJQYWRkaW5nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgJChwYXJlbnRTZWN0aW9uKS5jc3MoJ3BhZGRpbmctYm90dG9tJywgJzAnKTtcbiAgICAgICQoJy5oZWFkZXInKS5jc3MoJ3RvcCcsICcwJyk7XG4gICAgfVxuICB9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBCYW5uZXJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbndpbmRvdy5iYW5uZXIgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKCl7XG5cbiAgICB3aW5kb3cuYW5pbWF0ZV9jb250ZW50LmluaXQoKTtcblxuICAgIC8vQXJyb3cgc2Nyb2xsXG5cbiAgICB2YXIgaGVhZGVySGVpZ2h0ID0gJCgnLmhlYWRlcicpLm91dGVySGVpZ2h0KCk7XG5cbiAgICBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdzdGlja3ktaGVhZGVyLS10cnVlJykpIHtcbiAgICAgICQoJy5zY3JvbGwtYXJyb3cnKS5zbW9vdGhTY3JvbGwoe1xuICAgICAgICBvZmZzZXQ6IC1oZWFkZXJIZWlnaHRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAkKCcuc2Nyb2xsLWFycm93Jykuc21vb3RoU2Nyb2xsKCk7XG4gICAgfVxuXG4gICAgYW5ub3VuY2VtZW50X2Jhci5pbml0KCk7XG4gIH0sXG4gIHVubG9hZDogZnVuY3Rpb24oJHRhcmdldCl7XG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIE5ld3NsZXR0ZXJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbnZhciBuZXdzbGV0dGVyX3BvcHVwID0ge1xuICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcG9wdXAgPSBDb29raWVzLmdldCgncG9wdXAnKTtcbiAgICB2YXIgbmV3c2xldHRlcl9wb3B1cF9kYXlzID0gcGFyc2VJbnQod2luZG93LlBYVVRoZW1lLnRoZW1lX3NldHRpbmdzLm5ld3NsZXR0ZXJfcG9wdXBfZGF5cyk7XG4gICAgdmFyIGNvb2tpZV9lbmFibGVkID0gbmV3c2xldHRlcl9wb3B1cF9kYXlzICE9IDAgPyB0cnVlIDogZmFsc2U7XG5cbiAgICBpZiAoY29va2llX2VuYWJsZWQgJiYgcG9wdXAgPT0gJ29wZW4nKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld3NsZXR0ZXJfcG9wdXAub3BlbigpO1xuICAgIH1cbiAgICBpZiAoY29va2llX2VuYWJsZWQpIHtcbiAgICAgIENvb2tpZXMuc2V0KCdwb3B1cCcsICdvcGVuJywgeyBleHBpcmVzO
1iBuZXdzbGV0dGVyX3BvcHVwX2RheXMgfSk7XG4gICAgfVxuICB9LFxuICBvcGVuOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbmV3c2xldHRlcl9wb3B1cF9zZWNvbmRzID0gcGFyc2VJbnQod2luZG93LlBYVVRoZW1lLnRoZW1lX3NldHRpbmdzLm5ld3NsZXR0ZXJfcG9wdXBfc2Vjb25kcyk7XG5cbiAgICBpZiAod2luZG93LlBYVVRoZW1lLnRoZW1lX3NldHRpbmdzLm5ld3NsZXR0ZXJfcG9wdXBfbW9iaWxlIHx8IHdpbmRvdy5QWFVUaGVtZS5tZWRpYV9xdWVyaWVzLmxhcmdlLm1hdGNoZXMpIHtcbiAgICAgIHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgICAgICAkLmZhbmN5Ym94Lm9wZW4oJCgnLmpzLW5ld3NsZXR0ZXItcG9wdXAnKSwge1xuICAgICAgICAgIGJhc2VDbGFzczogJ25ld3NsZXR0ZXJfcG9wdXAnLFxuICAgICAgICAgIGhhc2g6IGZhbHNlLFxuICAgICAgICAgIGluZm9iYXIgOiBmYWxzZSxcbiAgICAgICAgICB0b29sYmFyOiBmYWxzZSxcbiAgICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICAgIHNtYWxsQnRuIDogdHJ1ZSxcbiAgICAgICAgICB0b3VjaDogZmFsc2UsXG4gICAgICAgICAgbW9iaWxlOiB7XG4gICAgICAgICAgICBwcmV2ZW50Q2FwdGlvbk92ZXJsYXA6IGZhbHNlLFxuICAgICAgICAgICAgdG9vbGJhcjogdHJ1ZSxcbiAgICAgICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgXCJjbG9zZVwiXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBuZXdzbGV0dGVyX3BvcHVwX3NlY29uZHMgKiAxMDAwKTtcbiAgICB9XG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFByb2R1Y3Rcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbndpbmRvdy5wcm9kdWN0ID0ge1xuICBpbml0OiBmdW5jdGlvbigpe1xuICAgIHZhciAkbm90aWZ5X2Zvcm0gPSAkKCcubm90aWZ5X2Zvcm0gLmNvbnRhY3QtZm9ybScpO1xuXG4gICAgLy8gRmluZCBwcm9kdWN0IGdhbGxlcmllcyBvbiBwYWdlIGJ1dCBleGNsdWRlIHRob3NlIGluIHRoZSBxdWlja3Nob3AgKHF1aWNrc2hvcCBsb2dpYyBoYW5kbGVkIGluIGZhbmN5Ym94IGV2ZW50KVxuICAgIHZhciAkcHJvZHVjdEdhbGxlcmllcyA9ICQoJy5wcm9kdWN0LWdhbGxlcnknKTtcblxuICAgIC8vIEZvciBlYWNoIHByb2R1Y3QgZ2FsbGVyeSwgY3JlYXRlIGFuIG9iamVjdCBhbmQgYWRkIGl0IHRvIGFuIGFycmF5IG9mIGdhbGxlcmllc1xuICAgIHZhciBnYWxsZXJpZXNBcnJheSA9IFtdO1xuICAgIGdsb2JhbFBsYXllcnNBcnJheSA9IFtdO1xuXG4gICAgaWYgKCRwcm9kdWN0R2FsbGVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICQuZWFjaCgkcHJvZHVjdEdhbGxlcmllcywgZnVuY3Rpb24oaW5kZXgsIGdhbGxlcnkpIHtcbiAgICAgICAgdmFyICRwcm9kdWN0U2VjdGlvbiA9ICQoZ2FsbGVyeSkuY2xvc2VzdCgnLnByb2R1Y3Rfc2VjdGlvbicpO1xuICAgICAgICBnYWxsZXJpZXNBcnJheS5wdXNoKHtcbiAgICAgICAgICBlbGVtZW50OiAkKGdhbGxlcnkpLFxuICAgICAgICAgIHByb2R1Y3RTZWN0aW9uOiAkcHJvZHVjdFNlY3Rpb24sXG4gICAgICAgICAgdGh1bWJuYWlsc0VuYWJsZWQ6ICRwcm9kdWN0U2VjdGlvbi5kYXRhKCd0aHVtYm5haWxzLWVuYWJsZWQnKSxcbiAgICAgICAgICB0aHVtYm5haWxzU2xpZGVyRW5hYmxlZDogJHByb2R1Y3RTZWN0aW9uLmRhdGEoJ3RodW1ibmFpbHMtc2xpZGVyLWVuYWJsZWQnKSxcbiAgICAgICAgICB0aHVtYm5haWxzUG9zaXRpb246ICRwcm9kdWN0U2VjdGlvbi5kYXRhKCd0aHVtYm5haWxzLXBvc2l0aW9uJyksXG4gICAgICAgICAgdGh1bWJuYWlsc0Fycm93czogJHByb2R1Y3RTZWN0aW9uLmRhdGEoJ2dhbGxlcnktYXJyb3dzLWVuYWJsZWQnKSxcbiAgICAgICAgICBzbGlkZXNob3dBbmltYXRpb246ICRwcm9kdWN0U2VjdGlvbi5kYXRhKCdzbGlkZXNob3ctYW5pbWF0aW9uJyksXG4gICAgICAgICAgc2xpZGVTaG93U3BlZWQ6ICRwcm9kdWN0U2VjdGlvbi5kYXRhKCdzbGlkZXNob3ctc3BlZWQnKSxcbiAgICAgICAgICBhY3RpdmF0ZVpvb206ICRwcm9kdWN0U2VjdGlvbi5kYXRhKCdhY3RpdmF0ZS16b29tJyksXG4gICAgICAgICAgcHJvZHVjdE1lZGlhU3VwcG9ydGVkOiAkcHJvZHVjdFNlY3Rpb24uZGF0YSgncHJvZHVjdC1tZWRpYS1zdXBwb3J0ZWQnKSxcbiAgICAgICAgICBsb29waW5nRW5hYmxlZDogJChnYWxsZXJ5KS5maW5kKCcucHJvZHVjdC1nYWxsZXJ5X19tYWluJykuZGF0YSgndmlkZW8tbG9vcGluZy1lbmFibGVkJyksXG4gICAgICAgICAgc2VjdGlvbklEOiAkcHJvZHVjdFNlY3Rpb24ucGFyZW50cygnLnNob3BpZnktc2VjdGlvbicpLmF0dHIoJ2lkJylcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGdhbGxlcmllc0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEZvciBlYWNoIGdhbGxlcnlPYmplY3QsIGVuYWJsZSBhIEZsaWNraXR5IHNsaWRlclxuICAgICAgJC5lYWNoKGdhbGxlcmllc0FycmF5LCBmdW5jdGlvbihpbmRleCwgZ2FsbGVyeU9iamVjdCkge1xuICAgICAgICB3aW5kb3cucHJvZHVjdC5lbmFibGVTbGlkZXIoZ2FsbGVyeU9iamVjdCk7XG5cbiAgICAgICAgLy8gSWYgcHJvZHVjdCBtZWRpYSBpcyBzdXBwb3J0ZWQgZm9yIHRoZSBnYWxsZXJ5LCB0aGVuIGFsc28gbGF1bmNoIHByb2R1Y3QgbWVkaWEgYW5kIFBseXJcbiAgICAgICAgaWYgKGdhbGxlcnlPYmplY3QucHJvZHVjdE1lZGlhU3VwcG9ydGVkKSB7XG5cbiAgICAgICAgICAvLyBGaW5kIHZpZGVvcyB3aXRoaW4gZ2FsbGVyeSBzZWN0aW9uXG4gICAgICAgICAgdmFyIHZpZGVvcztcbiAgICAgICAgICB2aWRlb3MgPSAkKGdhbGxlcnlPYmplY3QuZWxlbWVudCkuZmluZCgnW2RhdGEtaHRtbDUtdmlkZW9dIHZpZGVvLCBbZGF0YS15b3V0dWJlLXZpZGVvXScpLmdldCgpO1xuXG4gICAgICAgICAgd2luZG93LnByb2R1Y3QubG9hZFBseXIoZ2FsbGVyeU9iamVjdCwgdmlkZW9zKTtcbiAgICAgICAgICB3aW5kb3cucHJvZHVjdC5sYXVuY2hQcm9kdWN0TWVkaWEoZ2FsbGVyeU9iamVjdCk7XG5cbiAgICAgICAgICAvLyBHbyB0aHJvdWdoIGVhY2ggZ2FsbGVyeSwgb24gdmlkZW8gcGxheSBjaGVjayBpbnN0YW5jZSBJRCBhZ2FpbnN0IG90aGVyIHBsYXllciBJRHNcbiAgICAgICAgICB2Y
1XIgaW5zdGFuY2U7XG4gICAgICAgICAgJC5lYWNoKGdhbGxlcnlPYmplY3QudmlkZW9QbGF5ZXJzLCBmdW5jdGlvbihpbmRleCwgcGxheWVyKSB7XG4gICAgICAgICAgICBwbGF5ZXIub24oJ3BsYXknLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICBpbnN0YW5jZSA9IGV2ZW50LmRldGFpbC5wbHlyO1xuXG4gICAgICAgICAgICAgIC8vIEVuc3VyZXMgb25seSBvbmUgdmlkZW8gaXMgcGxheWluZyBhdCBhIHRpbWVcbiAgICAgICAgICAgICAgJC5lYWNoKGdsb2JhbFBsYXllcnNBcnJheSwgZnVuY3Rpb24oaW5kZXgsIHBsYXllcikge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5pZCAhPSBwbGF5ZXIuaWQpIHtcbiAgICAgICAgICAgICAgICAgIHBsYXllci5wYXVzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhvdmVyIHRvIHpvb21cbiAgICAgICAgaWYgKGdhbGxlcnlPYmplY3QuYWN0aXZhdGVab29tKSB7XG4gICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbGF6eWxvYWRlZCcsIHdpbmRvdy5wcm9kdWN0LmVuYWJsZVpvb20pO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlY2lwaWVudEZvcm1FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJlY2lwaWVudC1mb3JtXScpO1xuXG4gICAgaWYgKHJlY2lwaWVudEZvcm1FbCkge1xuICAgICAgY29uc3Qgc2VjdGlvbkVsID0gcmVjaXBpZW50Rm9ybUVsLmNsb3Nlc3QoJy5wcm9kdWN0X3NlY3Rpb24nKTtcbiAgICAgIHRoaXMucmVjaXBpZW50Rm9ybSA9IG5ldyBSZWNpcGllbnRGb3JtKHNlY3Rpb25FbCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxlbWVudGFyeVByb2R1Y3RzRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jb21wbGVtZW50YXJ5LXByb2R1Y3RzXScpO1xuXG4gICAgaWYgKGNvbXBsZW1lbnRhcnlQcm9kdWN0c0VsKSB7XG4gICAgICBjb25zdCBzZWN0aW9uRWwgPSBjb21wbGVtZW50YXJ5UHJvZHVjdHNFbC5jbG9zZXN0KCcucHJvZHVjdF9zZWN0aW9uJyk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHNlY3Rpb25JZCxcbiAgICAgICAgcHJvZHVjdElkLFxuICAgICAgICBwcm9kdWN0UmVjb21tZW5kYXRpb25MaW1pdCxcbiAgICAgIH0gPSBKU09OLnBhcnNlKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNvbXBsZW1lbnRhcnktcHJvZHVjdHMtZGF0YV0nKS50ZXh0Q29udGVudCk7XG5cbiAgICAgIHRoaXMuY29tcGxlbWVudGFyeVByb2R1Y3RSZWNvbW1lbmRhdGlvbnMgPSBuZXcgQ29tcGxlbWVudGFyeVByb2R1Y3RzKHtcbiAgICAgICAgc2VjdGlvbkVsLFxuICAgICAgICBzZWN0aW9uSWQsXG4gICAgICAgIHByb2R1Y3RJZCxcbiAgICAgICAgcHJvZHVjdFJlY29tbWVuZGF0aW9uc1JvdXRlOiB3aW5kb3cuUFhVVGhlbWUucm91dGVzLnByb2R1Y3RfcmVjb21tZW5kYXRpb25zX3VybCxcbiAgICAgICAgaW5jbHVkZUluZGljYXRvckRvdHM6IGZhbHNlLFxuICAgICAgICBsaW1pdDogcHJvZHVjdFJlY29tbWVuZGF0aW9uTGltaXQsXG4gICAgICAgIGFycm93U2hhcGU6ICdNOTUuMDQgNDYgMjEuNjggNDYgNDguMTggMjIuOCA0Mi45MSAxNi43OCA0Ljk2IDUwIDQyLjkxIDgzLjIyIDQ4LjE4IDc3LjIgMjEuNjggNTQgOTUuMDQgNTQgOTUuMDQgNDZ6JyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICgkKCcucHJvZHVjdC1xdWlja3Nob3BfX2NvbnRhaW5lcicpLmxlbmd0aCA9PSAwKSB7XG4gICAgICB3aW5kb3cucHJvZHVjdC5sb2FkUHJvZHVjdFJlY29tbWVuZGF0aW9ucygpO1xuICAgIH1cblxuICAgIHdpbmRvdy5wcm9kdWN0LnByb2R1Y3RTd2F0Y2hlcygpO1xuXG4gICAgd2luZG93LmFuaW1hdGVfY29udGVudC5pbml0KCk7XG4gIH0sXG4gIHVuaXRQcmljaW5nOiBmdW5jdGlvbihpdGVtKSB7XG4gICAgbGV0IHVuaXRQcmljZU1lYXN1cmVtZW50UmVmZXJlbmNlVmFsdWUgPSAnJztcbiAgICBsZXQgdW5pdFByaWNlT3V0cHV0ID0gJyc7XG5cbiAgICBpZiAoaXRlbS51bml0X3ByaWNlX21lYXN1cmVtZW50KSB7XG4gICAgICBpZiAoaXRlbS51bml0X3ByaWNlX21lYXN1cmVtZW50LnJlZmVyZW5jZV92YWx1ZSAhPSAxKSB7XG4gICAgICAgIHVuaXRQcmljZU1lYXN1cmVtZW50UmVmZXJlbmNlVmFsdWUgPSBpdGVtLnVuaXRfcHJpY2VfbWVhc3VyZW1lbnQucmVmZXJlbmNlX3ZhbHVlO1xuICAgICAgfVxuICAgICAgdW5pdFByaWNlT3V0cHV0ICs9IGA8ZGl2IGNsYXNzPVwiaXRlbV91bml0LXByaWNlXCI+JHtpdGVtLnVuaXRfcHJpY2VfbWVhc3VyZW1lbnQucXVhbnRpdHlfdmFsdWV9JHtpdGVtLnVuaXRfcHJpY2VfbWVhc3VyZW1lbnQucXVhbnRpdHlfdW5pdH0gfCAke1Nob3BpZnkuZm9ybWF0TW9uZXkoaXRlbS51bml0X3ByaWNlLCAkKCdib2R5JykuZGF0YSgnbW9uZXktZm9ybWF0JykpfSAvICR7dW5pdFByaWNlTWVhc3VyZW1lbnRSZWZlcmVuY2VWYWx1ZX0ke2l0ZW0udW5pdF9wcmljZV9tZWFzdXJlbWVudC5yZWZlcmVuY2VfdW5pdH08L2Rpdj5gXG5cbiAgICAgIHJldHVybiB1bml0UHJpY2VPdXRwdXQ7XG4gICAgfVxuICB9LFxuICBwcm9kdWN0U3dhdGNoZXM6IGZ1bmN0aW9uKCkge1xuICAgICQoJ1tkYXRhLXByb2R1Y3QtZm9ybT1cInVuaW5pdGlhbGl6ZWRcIl0nKS5lYWNoKChfLCBvcHRpb25zKSA9PiB7XG4gICAgICBvcHRpb25zLmRhdGFzZXQucHJvZHVjdEZvcm0gPSAnJztcbiAgICAgIGNvbnN0ICRvcHRpb25zID0gJChvcHRpb25zKTtcbiAgICAgIGNvbnN0IHBheW1lbnRUZXJtcyA9IG5ldyBQYXltZW50VGVybXMob3B0aW9ucy5jbG9zZXN0KCdbZGF0YS1wcm9kdWN0LWRldGFpbHNdJykpO1xuICAgICAgY29uc3Qgc3VyZmFjZVBpY2tVcEVsID0gJG9wdGlvbnMuY2xvc2VzdCgnLmpzLXByb2R1Y3Rfc2VjdGlvbicpLmZpbmQoJ1tkYXRhLXN1cmZhY2UtcGljay11cF0nKVswXTtcbiAgICAgIGNvbnN0IHByb2R1Y3RUaXRsZSA9ICRvcHRpb25zLmRhdGEoJ3Byb2R1Y3QtdGl0bGUnKTtcbiAgICAgIGxldCBjdXJyZW50VmFyaWFudElkID0gJG9wdGlvbnMuZGF0YSgndmFyaWFudC1pZCcpO1xuICAgICAgbGV0IGN1cnJlbnRWYXJpYW50VGl0bGUgPSAkb3B0aW9ucy5kYXRhKCd2YXJpYW50LXRpdGxlJyk7XG5cbiAgICAgIGxldCBzdXJmYWNlUGlja1VwO1xuXG4gICAgICBpZiAoc3VyZmFjZVBpY2tVcEVsKSB7XG4gICAgICAgI
1HN1cmZhY2VQaWNrVXAgPSBuZXcgU2hvcGlmeVN1cmZhY2VQaWNrVXAoc3VyZmFjZVBpY2tVcEVsKTtcbiAgICAgICAgc3VyZmFjZVBpY2tVcC5sb2FkKGN1cnJlbnRWYXJpYW50SWQpO1xuICAgICAgICBzdXJmYWNlUGlja1VwLm9uTW9kYWxSZXF1ZXN0KGNvbnRlbnRzID0+IHtcbiAgICAgICAgICBjb25zdCBzdXJmYWNlUGlja1VwTW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zdXJmYWNlLXBpY2stdXAtbW9kYWxdJyk7XG4gICAgICAgICAgbGV0IGZyYWdtZW50O1xuXG4gICAgICAgICAgLy8gQnVpbGQgb3V0IHBvcC11cCBjb250ZW50IGZvciBwcm9kdWN0IHdpdGggbm8gdmFyaWFudHMsIGVsc2UgYnVpbGRcbiAgICAgICAgICAvLyBvdXQgcG9wdXAgY29udGVudCBmb3IgcHJvZHVjdCB3aXRoIHZhcmlhbnRzXG4gICAgICAgICAgaWYgKGN1cnJlbnRWYXJpYW50VGl0bGUgPT0gJ0RlZmF1bHQgVGl0bGUnICYmIHByb2R1Y3RUaXRsZSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDInKTtcbiAgICAgICAgICAgIGhlYWRlci5jbGFzc0xpc3QuYWRkKCdzdXJmYWNlLXBpY2stdXBfX21vZGFsLWhlYWRlcicpO1xuICAgICAgICAgICAgdGl0bGUuY2xhc3NMaXN0LmFkZCgnc3VyZmFjZS1waWNrLXVwX19tb2RhbC10aXRsZScpO1xuICAgICAgICAgICAgdGl0bGUuaW5uZXJIVE1MID0gcHJvZHVjdFRpdGxlO1xuICAgICAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKHRpdGxlKTtcbiAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGhlYWRlcik7XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFyaWFudFRpdGxlICE9PSAnRGVmYXVsdCBUaXRsZScgJiYgcHJvZHVjdFRpdGxlKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoMicpO1xuICAgICAgICAgICAgaGVhZGVyLmNsYXNzTGlzdC5hZGQoJ3N1cmZhY2UtcGljay11cF9fbW9kYWwtaGVhZGVyJyk7XG4gICAgICAgICAgICB0aXRsZS5jbGFzc0xpc3QuYWRkKCdzdXJmYWNlLXBpY2stdXBfX21vZGFsLXRpdGxlJyk7XG4gICAgICAgICAgICB0aXRsZS5pbm5lckhUTUwgPSBwcm9kdWN0VGl0bGU7XG4gICAgICAgICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQodGl0bGUpO1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5jdXJyZW50VmFyaWFudC50aXRsZSAhPT0gJ0RlZmF1bHQgVGl0bGUnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN1YnRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgICBzdWJ0aXRsZS5jbGFzc0xpc3QuYWRkKCdzdXJmYWNlLXBpY2stdXBfX21vZGFsLXN1YnRpdGxlJyk7XG4gICAgICAgICAgICAgIHN1YnRpdGxlLmlubmVySFRNTCA9IHdpbmRvdy5jdXJyZW50VmFyaWFudC50aXRsZTtcbiAgICAgICAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKHN1YnRpdGxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGhlYWRlcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3VyZmFjZVBpY2tVcE1vZGFsLmlubmVySFRNTCA9IGNvbnRlbnRzO1xuICAgICAgICAgIHN1cmZhY2VQaWNrVXBNb2RhbC5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsIHN1cmZhY2VQaWNrVXBNb2RhbC5maXJzdENoaWxkKTtcbiAgICAgICAgICAkLmZhbmN5Ym94Lm9wZW4oXG4gICAgICAgICAgICBzdXJmYWNlUGlja1VwTW9kYWwsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGhhc2g6IGZhbHNlLFxuICAgICAgICAgICAgICBpbmZvYmFyOiBmYWxzZSxcbiAgICAgICAgICAgICAgdG9vbGJhcjogZmFsc2UsXG4gICAgICAgICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgICAgICAgIHNtYWxsQnRuOiB0cnVlLFxuICAgICAgICAgICAgICB0b3VjaDogZmFsc2UsXG4gICAgICAgICAgICAgIHZpZGVvOiB7XG4gICAgICAgICAgICAgICAgYXV0b1N0YXJ0OiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbW9iaWxlOiB7XG4gICAgICAgICAgICAgICAgcHJldmVudENhcHRpb25PdmVybGFwOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0b29sYmFyOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0SWQgPSAkb3B0aW9ucy5kYXRhKCdzZWxlY3QtaWQnKTtcblxuICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGVjdElkKSkge1xuICAgICAgICBuZXcgU2hvcGlmeS5PcHRpb25TZWxlY3RvcnMoc2VsZWN0SWQse1xuICAgICAgICAgIHByb2R1Y3Q6ICRvcHRpb25zLmRhdGEoJ3Byb2R1Y3QnKSxcbiAgICAgICAgICBvblZhcmlhbnRTZWxlY3RlZDogKHZhcmlhbnQsIHNlbGVjdG9yKSA9PiB7XG4gICAgICAgICAgICB3aW5kb3cuY3VycmVudFZhcmlhbnQgPSB2YXJpYW50O1xuXG4gICAgICAgICAgICBwYXltZW50VGVybXMudXBkYXRlKHZhcmlhbnQ/IHZhcmlhbnQuaWQgOiBudWxsKTtcblxuICAgICAgICAgICAgaWYgKHN1cmZhY2VQaWNrVXApIHtcbiAgICAgICAgICAgICAgc3VyZmFjZVBpY2tVcC5sb2FkKHZhcmlhbnQgPyB2YXJpYW50LmlkIDogbnVsbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdpbmRvdy5zZWxlY3RDYWxsYmFjayh2YXJpYW50LCBzZWxlY3Rvcik7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbmFibGVIaXN0b3J5U3RhdGU6ICRvcHRpb25zLmRhdGEoJ2VuYWJsZS1zdGF0ZScpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MucHJvZHVjdF9mb3JtX3N0eWxlID09IFwic3dhdGNoZXNcIikge1xuICAgICAgJCgnLnByb2R1Y3RfZm9ybScpLmFkZENsYXNzKCdpcy12aXNpYmxlJyk7XG4gICAgICAkKCcuc3dhdGNoIDpyYWRpbycpLmNoYW5nZShmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG9wdGlvbkluZGV4ID0gJCh0aGlzKS5jbG9zZXN0KCcuc3dhdGNoJykuYXR0cignZGF0YS1vcHRpb24taW5kZXgnKTtcbiAgICAgICAgdmFyIG9wdGlvblZhbHVlID0gJCh0aGlzKS52YWwoKTtcbiAgICAgICAgJCh0aGlzKVxuICAgICAgICAgIC5jbG9zZXN0KCdmb3JtJylcbiAgICAgICAgICAuZmluZCgnLnNpbmdsZS1vcHRpb24tc2VsZWN0b3InKVxuICAgICAgICAgIC5lcShvcHRpb25JbmRleClcbiAgICAgICAgICAudmFsKG9wdGlvblZhbHVlKVxuICAgICAgICAgIC50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgIH0pO1xuXG4gICAgICAvL1N3YXRjaGVzIGxpbmtlZCB3aXRoIHNlbGVjdGVkIG9wdGlvbnNcbiAgICAgIGlmICgkKCcuanMtcHJvZHVjdF9zZWN0aW9uJykubGVuZ3RoKXtcbiAgICAgICAgdmFyICRwcm9kdWN0Rm9ybXMgPSAkKCcuanMtcHJvZHVjdF9zZWN0aW9uJykuZmluZCgnLnByb2R1Y3RfZm9ybScpO1xuXG4gICAgICAgIC8vTG9vcCB0aHJvdWdoIGVhY2ggcHJvZHVjdCBhbmQgc2V0IHRoZSBpbml0aWFsIG9wdGlvbiB2YWx1ZSBzdGF0ZVxuXG4gICAgICAgICRwcm9kdWN0Rm9ybXMuZWFjaChmdW5jdGlvbigpe1xuICAgICAgICAgI
1HZhciBKU09ORGF0YSA9ICQodGhpcykuZGF0YSgncHJvZHVjdCcpO1xuICAgICAgICAgIHZhciBwcm9kdWN0SUQgPSAkKHRoaXMpLmRhdGEoJ3Byb2R1Y3QtaWQnKTtcbiAgICAgICAgICB2YXIgcHJvZHVjdFNlY3Rpb24gPSAnLnByb2R1Y3QtJyArIHByb2R1Y3RJRCArICcgLmpzLXByb2R1Y3Rfc2VjdGlvbic7XG4gICAgICAgICAgdmFyIHN3YXRjaE9wdGlvbnMgPSAkKHRoaXMpLmZpbmQoJy5zd2F0Y2gtb3B0aW9ucyAuc3dhdGNoJyk7XG4gICAgICAgICAgaWYgKHN3YXRjaE9wdGlvbnMubGVuZ3RoID4gMSl7XG4gICAgICAgICAgICBTaG9waWZ5LmxpbmtPcHRpb25TZWxlY3RvcnMoSlNPTkRhdGEsIHByb2R1Y3RTZWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvL0FkZCBjbGljayBldmVudCB3aGVuIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcHJvZHVjdCBvbiB0aGUgcGFnZSAoZWcuIENvbGxlY3Rpb24gaW4gRGV0YWlsKVxuICAgICAgaWYgKCQoJy5qcy1wcm9kdWN0X3NlY3Rpb24nKS5sZW5ndGggPiAxKXtcbiAgICAgICAgJCgnYm9keScpLm9uKCdjbGljaycsICcuc3dhdGNoLWVsZW1lbnQnLCBmdW5jdGlvbigpe1xuICAgICAgICAgIHZhciBzd2F0Y2hWYWx1ZSA9ICQodGhpcykuZGF0YSgndmFsdWUnKS50b1N0cmluZygpO1xuXG4gICAgICAgICAgJCh0aGlzKVxuICAgICAgICAgICAgLnNpYmxpbmdzKCdpbnB1dFt2YWx1ZT1cIicrIHN3YXRjaFZhbHVlLnJlcGxhY2UoL1xcXCIvZywnXFxcXFwiJykgKydcIl0nKVxuICAgICAgICAgICAgLnByb3AoXCJjaGVja2VkXCIsIHRydWUpXG4gICAgICAgICAgICAudHJpZ2dlcihcImNoYW5nZVwiKTtcblxuICAgICAgICAgIHZhciBKU09ORGF0YSA9ICQodGhpcykucGFyZW50cygnLnByb2R1Y3RfZm9ybScpLmRhdGEoJ3Byb2R1Y3QnKTtcbiAgICAgICAgICB2Y
1XIgcHJvZHVjdElEID0gJCh0aGlzKS5wYXJlbnRzKCcucHJvZHVjdF9mb3JtJykuZGF0YSgncHJvZHVjdC1pZCcpO1xuICAgICAgICAgIHZhciBwcm9kdWN0U2VjdGlvbiA9ICcucHJvZHVjdC0nICsgcHJvZHVjdElEICsgJyAuanMtcHJvZHVjdF9zZWN0aW9uJztcbiAgICAgICAgICB2YXIgc3dhdGNoT3B0aW9ucyA9ICQodGhpcykucGFyZW50cygnLnByb2R1Y3RfZm9ybScpLmZpbmQoJy5zd2F0Y2gtb3B0aW9ucyAuc3dhdGNoJyk7XG4gICAgICAgICAgaWYgKHN3YXRjaE9wdGlvbnMubGVuZ3RoID4gMSl7XG4gICAgICAgICAgICBTaG9waWZ5LmxpbmtPcHRpb25TZWxlY3RvcnMoSlNPTkRhdGEsIHByb2R1Y3RTZWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuICBlbmFibGVab29tOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgJGltYWdlID0gJChldmVudC50YXJnZXQpO1xuICAgIHZhciB6b29tU3JjID0gJGltYWdlLmRhdGEoJ3pvb20tc3JjJyk7XG4gICAgaWYgKHpvb21TcmMpIHtcbiAgICAgICRpbWFnZS53cmFwKCc8c3BhbiBjbGFzcz1cInpvb20tY29udGFpbmVyXCI+PC9zcGFuPicpXG4gICAgICAuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJylcbiAgICAgIC5wYXJlbnQoKVxuICAgICAgLnpvb20oe1xuICAgICAgICB1cmw6IHpvb21TcmMsXG4gICAgICAgIHRvdWNoOiBmYWxzZSxcbiAgICAgICAgbWFnbmlmeTogMSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgZW5hYmxlU2xpZGVyOiBmdW5jdGlvbihnYWxsZXJ5T2JqZWN0KSB7XG5cbiAgICB2YXIgJGVsID0gZ2FsbGVyeU9iamVjdC5lbGVtZW50LmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX21haW4nKTtcbiAgICB2YXIgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5ID0gZ2FsbGVyeU9iamVjdC5lbGVtZW50LmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX3RodW1ibmFpbHMnKTtcbiAgICB2YXIgJHNsaWRlcyA9ICRlbC5maW5kKCcucHJvZHVjdC1nYWxsZXJ5X19pbWFnZScpO1xuICAgIHZhciAkdGh1bWJuYWlscyA9ICR0aHVtYm5haWxQcm9kdWN0R2FsbGVyeS5maW5kKCcucHJvZHVjdC1nYWxsZXJ5X190aHVtYm5haWwnKTtcbiAgICB2YXIgYXJyb3dTaGFwZSA9ICdNOTUuMDQgNDYgMjEuNjggNDYgNDguMTggMjIuOCA0Mi45MSAxNi43OCA0Ljk2IDUwIDQyLjkxIDgzLjIyIDQ4LjE4IDc3LjIgMjEuNjggNTQgOTUuMDQgNTQgOTUuMDQgNDZ6JztcblxuICAgICRlbC5mbGlja2l0eSh7XG4gICAgICB3cmFwQXJvdW5kOiB0cnVlLFxuICAgICAgYWRhcHRpdmVIZWlnaHQ6IHRydWUsXG4gICAgICBkcmFnVGhyZXNob2xkOiAxMCxcbiAgICAgIGltYWdlc0xvYWRlZDogdHJ1ZSxcbiAgICAgIHBhZ2VEb3RzOiBmYWxzZSxcbiAgICAgIHByZXZOZXh0QnV0dG9uczogJGVsLmRhdGEoJ21lZGlhLWNvdW50JykgPiAxID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgYXV0b1BsYXk6IGdhbGxlcnlPYmplY3Quc2xpZGVTaG93U3BlZWQgKiAxMDAwLFxuICAgICAgZmFkZTogZ2FsbGVyeU9iamVjdC5zbGlkZVNob3dBbmltYXRpb24gPT09ICdmYWRlJyA/IHRydWUgOiBmYWxzZSxcbiAgICAgIHdhdGNoQ1NTOiBmYWxzZSxcbiAgICAgIGFycm93U2hhcGU6IGFycm93U2hhcGVcbiAgICB9KVxuXG4gICAgdmFyICRzbGlkZXMgPSAkZWwuZmluZCgnLnByb2R1Y3QtZ2FsbGVyeV9faW1hZ2UnKTtcblxuICAgICRzbGlkZXMuZWFjaCgoXywgc2xpZGUpID0+IHtcbiAgICAgIGNvbnN0ICRzbGlkZSA9ICQoc2xpZGUpO1xuXG4gICAgICAgLy8gTGlzdGVuIGZvciBtb2RlbCBwYXVzZS9wbGF5IGV2ZW50c1xuICAgICAgJHNsaWRlLmZpbmQoJ21vZGVsLXZpZXdlcicpLm9uKCdzaG9waWZ5X21vZGVsX3ZpZXdlcl91aV90b2dnbGVfcGxheScsIGZ1bmN0aW9uKCl7XG4gICAgICAgICRlbC5mbGlja2l0eSgndW5iaW5kRHJhZycpO1xuICAgICAgfSlcblxuICAgICAgJHNsaWRlLmZpbmQoJ21vZGVsLXZpZXdlcicpLm9uKCdzaG9waWZ5X21vZGVsX3ZpZXdlcl91aV90b2dnbGVfcGF1c2UnLCBmdW5jdGlvbigpe1xuICAgICAgICAkZWwuZmxpY2tpdHkoJ2JpbmREcmFnJyk7XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICAkZWwub24oJ2NoYW5nZS5mbGlja2l0eScsIGZ1bmN0aW9uKCkge1xuXG4gICAgICAkc2xpZGVzLmVhY2goZnVuY3Rpb24oaW5kZXgsIHNsaWRlKSB7XG5cbiAgICAgICAgLy8gVmFyaWFibGVzIHRvIGJlIHVzZWRcbiAgICAgICAgdmFyICRzbGlkZSA9ICQoc2xpZGUpO1xuICAgICAgICB2Y
1XIgbWVkaWFUeXBlID0gJHNsaWRlLmRhdGEoJ21lZGlhLXR5cGUnKTtcblxuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHNsaWRlIGlzIGFjdGl2ZSBzbGlkZSAoZmVhdHVyZWQgaW1hZ2Ugc2hvd24pIG9yIGluYWN0aXZlIHNsaWRlIChzbGlkZSBoaWRkZW4pXG4gICAgICAgIGlmICgkc2xpZGUuaGFzQ2xhc3MoJ2lzLXNlbGVjdGVkJykpIHtcbiAgICAgICAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IHRvIGdvIHRocm91Z2ggZGlmZmVyZW50IG1lZGlhIHR5cGVzICh2aWRlbywgbW9kZWwpXG4gICAgICAgICAgc3dpdGNoKG1lZGlhVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbW9kZWwnOlxuXG4gICAgICAgICAgICAgIC8qIE9uIHNsaWRlIGNoYW5nZSwgaWYgYWN0aXZlIHNsaWRlIGNvbnRhaW5zIDNkIG1vZGVsXG4gICAgICAgICAgICAgICogSWYgb24gZGVza3RvcCwgb24gaG92ZXIsIHVuYmluZCBmbGlja2l0eSwgYWZ0ZXIgaG92ZXIgYmluZCBmbGlja2l0eVxuICAgICAgICAgICAgICAqIE9uIG1vZGVsIHBsYXkgZXZlbnQsIHVuYmluZCBmbGlja2l0eSB0byBlbnN1cmUgbW9kZWwgY2FuIGJlIGludGVyYWN0ZWQgd2l0aFxuICAgICAgICAgICAgICAqIE9uIG1vZGVsIHBhdXNlIGV2ZW50LCBiaW5kIGZsaWNraXR5IHNvIHRoYXQgc2xpZGUgY2FuIGJlIHN3aXBlZFxuICAgICAgICAgICAgICAqIFBhdXNlIGFsbCBtb2RlbCBzbGlkZXMgd2hlbiBoaWRkZW5cbiAgICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgICBpZiAod2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubGFyZ2UubWF0Y2hlcykge1xuXG4gICAgICAgICAgICAgICAgLy8gT24gbW91c2VlbnRlciBldmVudCwgdW5iaW5kIGZsaWNraXR5XG4gICAgICAgICAgICAgICAgJHNsaWRlLm9uKCdtb3VzZWVudGVyJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAkZWwuZmxpY2tpdHkoJ3VuYmluZERyYWcnKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIE9uIG1vdXNlbGVhdmUgZXZlbnQsIGJpbmQgZmxpY2tpdHlcbiAgICAgICAgICAgICAgICAkc2xpZGUub24oJ21vdXNlbGVhdmUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICRlbC5mbGlja2l0eSgnYmluZERyYWcnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEJlbG93IGxvZ2ljIGRlYWxzIHdpdGggdGhlIGhpZGRlbiBzbGlkZXMgd2hlbiBhIGZsaWNraXR5IGNoYW5nZSBpcyB0cmlnZ2VyZWRcbiAgICAgICAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IHRvIGdvIHRocm91Z2ggZGlmZmVyZW50IG1lZGlhIHR5cGVzICh2aWRlbywgbW9kZWwpXG4gICAgICAgICAgc3dpdGNoKG1lZGlhVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbW9kZWwnOlxuXG4gICAgICAgICAgICAgIC8vIFBhdXNlIG1vZGVscyB3aGVuIGhpZGRlblxuICAgICAgICAgICAgICBpZiAoZ2FsbGVyeU9iamVjdC5tb2RlbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICQuZWFjaChnYWxsZXJ5T2JqZWN0Lm1vZGVscywgZnVuY3Rpb24oaW5kZXgsIG1vZGVsKSB7XG4gICAgICAgICAgICAgICAgICBtb2RlbC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd2aWRlbyc6XG5cbiAgICAgICAgICAgICAgLy8gVmFyaWFibGVzXG4gICAgICAgICAgICAgIHZhciAkaHRtbFZpZGVvID0gJHNsaWRlLmZpbmQoJ1tkYXRhLWh0bWw1LXZpZGVvXScpO1xuICAgICAgICAgICAgICB2Y
1XIgdmlkZW9JRCA9ICRodG1sVmlkZW8uZmluZCgndmlkZW8nKS5kYXRhKCdwbHlyLXZpZGVvLWlkJyk7XG5cbiAgICAgICAgICAgICAgLy8gUGF1c2UgYWxsIGh0bWw1IHZpZGVvcyBmb3Igc2xpZGVzIHRoYXQgYXJlIGhpZGRlblxuICAgICAgICAgICAgICBpZiAoJGh0bWxWaWRlby5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAkLmVhY2goZ2FsbGVyeU9iamVjdC52aWRlb1BsYXllcnMsIGZ1bmN0aW9uKGluZGV4LCBwbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIuaWQgPT0gdmlkZW9JRCkge1xuICAgICAgICAgICAgICAgICAgICBwbGF5ZXIucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZXh0ZXJuYWxfdmlkZW8nOlxuXG4gICAgICAgICAgICAgIC8vIFZhcmlhYmxlc1xuICAgICAgICAgICAgICB2YXIgJGlmcmFtZVZpZGVvID0gJHNsaWRlLmZpbmQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgICB2YXIgaWZyYW1lSUQgPSAkaWZyYW1lVmlkZW8uYXR0cignaWQnKTtcblxuICAgICAgICAgICAgICAvLyBQYXVzZSBhbGwgeW91dHViZSB2aWRlb3MgZm9yIHNsaWRlcyB0aGF0IGFyZSBoaWRkZW5cbiAgICAgICAgICAgICAgaWYgKCRpZnJhbWVWaWRlby5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAkLmVhY2goZ2FsbGVyeU9iamVjdC52aWRlb1BsYXllcnMsIGZ1bmN0aW9uKGluZGV4LCBwbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIubWVkaWEuaWQgPT0gaWZyYW1lSUQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgICRlbC5vbignc2V0dGxlLmZsaWNraXR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAkZWwuZmxpY2tpdHkoJ3Jlc2l6ZScpO1xuICAgIH0pO1xuXG4gICAgJCggd2luZG93ICkub24oICdsb2FkJywgZnVuY3Rpb24oKSB7XG4gICAgICAkZWwuZmxpY2tpdHkoJ3Jlc2l6ZScpO1xuICAgIH0pO1xuXG4gICAgJHNsaWRlcy5lYWNoKGZ1bmN0aW9uKGluZGV4LCBzbGlkZSkge1xuXG4gICAgICAvLyBWYXJpYWJsZXMgdG8gYmUgdXNlZFxuICAgICAgdmFyICRzbGlkZSA9ICQoc2xpZGUpO1xuICAgICAgdmFyIG1lZGlhVHlwZSA9ICRzbGlkZS5kYXRhKCdtZWRpYS10eXBlJyk7XG5cbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgc2xpZGUgaXMgYWN0aXZlIHNsaWRlIChmZWF0dXJlZCBpbWFnZSBzaG93bilcbiAgICAgIGlmICgkc2xpZGUuaGFzQ2xhc3MoJ2lzLXNlbGVjdGVkJykpIHtcblxuICAgICAgICBpZiAobWVkaWFUeXBlID09ICdtb2RlbCcpIHtcbiAgICAgICAgICAvLyBJZiBzbGlkZSBoYXMgM0QgbW9kZWwsIHVuYmluZCBmbGlja2l0eSBvbiBob3ZlciBvbiBkZXNrdG9wXG4gICAgICAgICAgLy8gQWxsb3dzIHlvdSB0byBjbGljayBhbnl3aGVyZSB0byB0cmlnZ2VyIG1vZGVsIHVpXG5cbiAgICAgICAgICBpZiAod2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubGFyZ2UubWF0Y2hlcykge1xuXG4gICAgICAgICAgICAvLyBPbiBtb3VzZWVudGVyIGV2ZW50LCB1bmJpbmQgZmxpY2tpdHlcbiAgICAgICAgICAgICRzbGlkZS5vbignbW91c2VlbnRlcicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAkZWwuZmxpY2tpdHkoJ3VuYmluZERyYWcnKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBPbiBtb3VzZWxlYXZlIGV2ZW50LCBiaW5kIGZsaWNraXR5XG4gICAgICAgICAgICAkc2xpZGUub24oJ21vdXNlbGVhdmUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgJGVsLmZsaWNraXR5KCdiaW5kRHJhZycpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGV0ZWN0IGtleWJvYXJkICdFTlRFUicga2V5IG9uIHNsaWRlc1xuICAgICAgICAkc2xpZGUua2V5cHJlc3MoZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICBpZihldmVudC53aGljaCA9PSAxMykge1xuXG4gICAgICAgICAgICAkc2xpZGUuZmluZCgnbW9kZWwtdmlld2VyLCAucHJvZHVjdC1nYWxsZXJ5X19saW5rLCAucGx5cicpLmZvY3VzKCk7XG5cbiAgICAgICAgICAgICRlbC5vbignc2V0dGxlLmZsaWNraXR5JywgZnVuY3Rpb24oIGV2ZW50LCBpbmRleCApIHtcblxuICAgICAgICAgICAgICAvLyBSdW4gdmlkZW8gYXV0b3BsYXkgbG9naWMgaWYgZmVhdHVyZWQgbWVkaWEgaXMgYSB2aWRlb1xuICAgICAgICAgICAgICBpZiAobWVkaWFUeXBlID09ICd2aWRlbycgfHwgbWVkaWFUeXBlID09ICdleHRlcm5hbF92aWRlbycpIHtcbiAgICAgICAgICAgICAgICBjaGVja0ZvclZpZGVvcygpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gQXV0b3BsYXkgbW9kZWwgaWYgZmVhdHVyZWQgbWVkaWEgaXMgYSBtb2RlbFxuICAgICAgICAgICAgICBpZiAobWVkaWFUeXBlID09ICdtb2RlbCcpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBtb2RlbCBjb250YWluZXIgaGFzIGNsYXNzIGlzLXNlbGVjdGVkIHRoZW4gcGxheSB0aGUgbW9kZWxcbiAgICAgICAgICAgICAgICBhdXRvcGxheU1vZGVsKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBVbmJpbmQgc2V0dGxlIGV2ZW50XG4gICAgICAgICAgICAgICRlbC5vZmYoJ3NldHRsZS5mbGlja2l0eScpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB2YXIgJHNsaWRlckFycm93cyA9ICRlbC5maW5kKCcuZmxpY2tpdHktcHJldi1uZXh0LWJ1dHRvbicpO1xuXG4gICAgaWYgKCgkc2xpZGVyQXJyb3dzIHx8ICR0aHVtYm5haWxzKSAmJiAod2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubGFyZ2UubWF0Y2hlcykpIHtcbiAgICAgICRzbGlkZXJBcnJvd3Mub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgLy8gRmluZCBvdXQgbWVkaWEgdHlwZSBvZiBmZWF0dXJlZCBtZWRpYSBzbGlkZVxuICAgICAgICB2Y
1XIgbWVkaWFUeXBlID0gJGVsLmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX2ltYWdlLmlzLXNlbGVjdGVkJykuZGF0YSgnbWVkaWEtdHlwZScpO1xuXG4gICAgICAgICRlbC5vbignc2V0dGxlLmZsaWNraXR5JywgZnVuY3Rpb24oZXZlbnQsIGluZGV4KSB7XG5cbiAgICAgICAgICAvLyBSdW4gdmlkZW8gYXV0b3BsYXkgbG9naWMgaWYgZmVhdHVyZWQgbWVkaWEgaXMgYSB2aWRlb1xuICAgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gJ3ZpZGVvJyB8fCBtZWRpYVR5cGUgPT0gJ2V4dGVybmFsX3ZpZGVvJykge1xuICAgICAgICAgICAgY2hlY2tGb3JWaWRlb3MoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBBdXRvcGxheSBtb2RlbCBpZiBmZWF0dXJlZCBtZWRpYSBpcyBhIG1vZGVsXG4gICAgICAgICAgaWYgKG1lZGlhVHlwZSA9PSAnbW9kZWwnKSB7XG4gICAgICAgICAgICAvLyBJZiBtb2RlbCBjb250YWluZXIgaGFzIGNsYXNzIGlzLXNlbGVjdGVkIHRoZW4gcGxheSB0aGUgbW9kZWxcbiAgICAgICAgICAgIGF1dG9wbGF5TW9kZWwoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVbmJpbmQgc2V0dGxlIGV2ZW50XG4gICAgICAgICAgJGVsLm9mZignc2V0dGxlLmZsaWNraXR5Jyk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcblxuICAgICAgLy8gRGV0ZWN0IGtleWJvYXJkICdFTlRFUicga2V5IG9uIHNsaWRlciBhcnJvd3NcbiAgICAgICRzbGlkZXJBcnJvd3Mub24oJ2tleXByZXNzJywgZnVuY3Rpb24oZXZlbnQpIHtcblxuICAgICAgICBpZihldmVudC53aGljaCA9PSAxMykge1xuICAgICAgICAgICRlbC5mb2N1cygpO1xuICAgICAgICAgICRlbC5hdHRyKCd0YWJpbmRleCcsIDApO1xuICAgICAgICAgICRlbC5maW5kKCcucHJvZHVjdC1nYWxsZXJ5X19pbWFnZScpLmF0dHIoJ3RhYmluZGV4JywgMCk7XG4gICAgICAgIH1cblxuICAgICAgfSlcblxuICAgICAgJHRodW1ibmFpbHMub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgLy8gQ2hhbmdlIHNsaWRlXG4gICAgICAgIHZhciBpbmRleCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCkuaW5kZXgoKTtcbiAgICAgICAgJGVsLmZsaWNraXR5KCdzZWxlY3QnLCBpbmRleCk7XG5cbiAgICAgICAgLy8gRmluZCBvdXQgbWVkaWEgdHlwZSBvZiBmZWF0dXJlZCBtZWRpYSBzbGlkZVxuICAgICAgICB2Y
1XIgbWVkaWFUeXBlID0gJGVsLmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX2ltYWdlLmlzLXNlbGVjdGVkJykuZGF0YSgnbWVkaWEtdHlwZScpO1xuXG4gICAgICAgICRlbC5vbignc2V0dGxlLmZsaWNraXR5JywgZnVuY3Rpb24oZXZlbnQsIGluZGV4KSB7XG5cbiAgICAgICAgICAvLyBSdW4gdmlkZW8gYXV0b3BsYXkgbG9naWMgaWYgZmVhdHVyZWQgbWVkaWEgaXMgYSB2aWRlb1xuICAgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gJ3ZpZGVvJyB8fCBtZWRpYVR5cGUgPT0gJ2V4dGVybmFsX3ZpZGVvJykge1xuICAgICAgICAgICAgY2hlY2tGb3JWaWRlb3MoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBBdXRvcGxheSBtb2RlbCBpZiBmZWF0dXJlZCBtZWRpYSBpcyBhIG1vZGVsXG4gICAgICAgICAgaWYgKG1lZGlhVHlwZSA9PSAnbW9kZWwnKSB7XG4gICAgICAgICAgICAvLyBJZiBtb2RlbCBjb250YWluZXIgaGFzIGNsYXNzIGlzLXNlbGVjdGVkIHRoZW4gcGxheSB0aGUgbW9kZWxcbiAgICAgICAgICAgIGF1dG9wbGF5TW9kZWwoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVbmJpbmQgc2V0dGxlIGV2ZW50XG4gICAgICAgICAgJGVsLm9mZignc2V0dGxlLmZsaWNraXR5Jyk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcblxuICAgICAgLy8gQWRkZWQgZnVuY3Rpb25hbGl0eSBmb3Iga2V5Ym9hcmQgJ2VudGVyJyBrZXlcbiAgICAgICR0aHVtYm5haWxzLmtleXByZXNzKGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIHZhciBpbmRleCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCkuaW5kZXgoKTtcblxuICAgICAgICBpZihldmVudC53aGljaCA9PSAxMykge1xuXG4gICAgICAgICAgLy8gQ2hhbmdlIHNsaWRlXG4gICAgICAgICAgJGVsLmZsaWNraXR5KCdzZWxlY3QnLCBpbmRleCk7XG5cbiAgICAgICAgICAvLyBGaW5kIHNlbGVjdGVkIHNsaWRlXG4gICAgICAgICAgdmFyICRzZWxlY3RlZFNsaWRlID0gJGVsLmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX2ltYWdlLmlzLXNlbGVjdGVkJyk7XG5cbiAgICAgICAgICAvLyBGaW5kIG91dCBtZWRpYSB0eXBlIG9mIGZlYXR1cmVkIG1lZGlhIHNsaWRlXG4gICAgICAgICAgdmFyIG1lZGlhVHlwZSA9ICRzZWxlY3RlZFNsaWRlLmRhdGEoJ21lZGlhLXR5cGUnKTtcblxuICAgICAgICAgIC8vIEJyaW5nIGZvY3VzIHRvIG1lZGlhIGluc2lkZSBzZWxlY3RlZCBzbGlkZSBvbmNlIHNsaWRlIGhhcyBmaW5pc2hlZCBhbmltYXRpb25cbiAgICAgICAgICAkZWwub24oICdzZXR0bGUuZmxpY2tpdHknLCBmdW5jdGlvbiggZXZlbnQsIGluZGV4ICkge1xuICAgICAgICAgICAgJHNlbGVjdGVkU2xpZGUuZmluZCgnW2RhdGEteW91dHViZS12aWRlb10nKS5hdHRyKCd0YWJpbmRleCcsICcwJyk7XG4gICAgICAgICAgICAkc2VsZWN0ZWRTbGlkZS5maW5kKCdtb2RlbC12aWV3ZXIsIC5wbHlyLCAucHJvZHVjdC1nYWxsZXJ5X19saW5rJykuZm9jdXMoKTtcblxuICAgICAgICAgICAgLy8gUnVuIHZpZGVvIGF1dG9wbGF5IGxvZ2ljIGlmIGZlYXR1cmVkIG1lZGlhIGlzIGEgdmlkZW9cbiAgICAgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gJ3ZpZGVvJyB8fCBtZWRpYVR5cGUgPT0gJ2V4dGVybmFsX3ZpZGVvJykge1xuICAgICAgICAgICAgICBjaGVja0ZvclZpZGVvcygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBdXRvcGxheSBtb2RlbCBpZiBmZWF0dXJlZCBtZWRpYSBpcyBhIG1vZGVsXG4gICAgICAgICAgICBpZiAobWVkaWFUeXBlID09ICdtb2RlbCcpIHtcbiAgICAgICAgICAgICAgLy8gSWYgbW9kZWwgY29udGFpbmVyIGhhcyBjbGFzcyBpcy1zZWxlY3RlZCB0aGVuIHBsYXkgdGhlIG1vZGVsXG4gICAgICAgICAgICAgIGF1dG9wbGF5TW9kZWwoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVW5iaW5kIHNldHRsZSBldmVudFxuICAgICAgICAgICAgJGVsLm9mZignc2V0dGxlLmZsaWNraXR5Jyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXV0b3BsYXlNb2RlbCgpIHtcbiAgICAgICQuZWFjaChnYWxsZXJ5T2JqZWN0Lm1vZGVscywgZnVuY3Rpb24oaW5kZXgsIG1vZGVsKSB7XG4gICAgICAgIHZhciAkc2xpZGUgPSAkKG1vZGVsLmNvbnRhaW5lcikucGFyZW50cygnLnByb2R1Y3QtZ2FsbGVyeV9faW1hZ2UnKTtcbiAgICAgICAgaWYgKCRzbGlkZS5oYXNDbGFzcygnaXMtc2VsZWN0ZWQnKSkge1xuICAgICAgICAgIG1vZGVsLnBsYXkoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja0ZvclZpZGVvcygpIHtcbiAgICAgICRzbGlkZXMuZWFjaChmdW5jdGlvbihpbmRleCwgc2xpZGUpIHtcbiAgICAgICAgLy8gVmFyaWFibGVzXG4gICAgICAgIHZhciAkc2xpZGUgPSAkKHNsaWRlKTtcbiAgICAgICAgdmFyIG1lZGlhVHlwZSA9ICRzbGlkZS5kYXRhKCdtZWRpYS10eXBlJyk7XG4gICAgICAgIHZhciB2aWRlb0lEID0gJHNsaWRlLmZpbmQoJ3ZpZGVvJykuZGF0YSgncGx5ci12aWRlby1pZCcpO1xuICAgICAgICB2Y
1XIgJGlmcmFtZVZpZGVvID0gJHNsaWRlLmZpbmQoJ2lmcmFtZScpO1xuICAgICAgICB2YXIgaWZyYW1lSUQgPSAkaWZyYW1lVmlkZW8uYXR0cignaWQnKTtcbiAgICAgICAgaWYgKCRzbGlkZS5oYXNDbGFzcygnaXMtc2VsZWN0ZWQnKSkge1xuICAgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gJ3ZpZGVvJykge1xuICAgICAgICAgICAgdmlkZW9JRCA9ICRzbGlkZS5maW5kKCd2aWRlbycpLmRhdGEoJ3BseXItdmlkZW8taWQnKTtcbiAgICAgICAgICAgIGlmICh2aWRlb0lEKSB7XG4gICAgICAgICAgICAgIGF1dG9wbGF5VmlkZW8odmlkZW9JRCwgJHNsaWRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSAnZXh0ZXJuYWxfdmlkZW8nKSB7XG4gICAgICAgICAgICBpZiAoaWZyYW1lSUQpIHtcbiAgICAgICAgICAgICAgYXV0b3BsYXlZb3V0dWJlVmlkZW8oaWZyYW1lSUQsICRzbGlkZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGF1dG9wbGF5VmlkZW8odmlkZW9JRCwgJHNsaWRlKSB7XG4gICAgICAvLyBDb21wYXJlIGlkIHRvIHBsYXllciBvYmplY3QgYW5kIG9ubHkgcGxheSB0aGF0IHZpZGVvXG4gICAgICAkLmVhY2goZ2FsbGVyeU9iamVjdC52aWRlb1BsYXllcnMsIGZ1bmN0aW9uKGluZGV4LCBwbGF5ZXIpe1xuXG4gICAgICAgIGlmIChwbGF5ZXIuaWQgPT0gdmlkZW9JRCkge1xuICAgICAgICAgIHBsYXllci5wbGF5KCk7XG5cbiAgICAgICAgICAvLyBPbiBmdWxsc2NyZWVuIGV4aXQsIGZvY3VzIG9uIHRoZSB0aHVtYm5haWwgbmF2XG4gICAgICAgICAgcGxheWVyLm9uKCdleGl0ZnVsbHNjcmVlbicsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgICAgIHZhciAkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkgPSAkc2xpZGUuY2xvc2VzdCgnLnByb2R1Y3QtZ2FsbGVyeScpLmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX3RodW1ibmFpbHMnKTtcbiAgICAgICAgICAgIGlmICgkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkuaGFzQ2xhc3MoJ3ZlcnRpY2FsLXNsaWRlci1lbmFibGVkJykpIHtcbiAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmF0dHIoJ3RhYmluZGV4JywgJzAnKS5mb2N1cygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhdXRvcGxheVlvdXR1YmVWaWRlbyhpZnJhbWVJRCwgJHNsaWRlKSB7XG4gICAgICAvLyBjb21wYXJlIGlkIHRvIHBsYXllciBvYmplY3QgYW5kIG9ubHkgcGxheSB0aGF0IHZpZGVvXG4gICAgICAkLmVhY2goZ2FsbGVyeU9iamVjdC52aWRlb1BsYXllcnMsIGZ1bmN0aW9uKGluZGV4LCBwbGF5ZXIpe1xuXG4gICAgICAgIGlmIChwbGF5ZXIucGxheWluZykge1xuICAgICAgICAgIHBsYXllci5wYXVzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBsYXllci5tZWRpYS5pZCA9PSBpZnJhbWVJRCkge1xuICAgICAgICAgIHBsYXllci5wbGF5KCk7XG5cbiAgICAgICAgICAvLyBPbiBmdWxsc2NyZWVuIGV4aXQsIGZvY3VzIG9uIHRoZSB0aHVtYm5haWwgbmF2XG4gICAgICAgICAgcGxheWVyLm9uKCdleGl0ZnVsbHNjcmVlbicsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgICAgIHZhciAkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkgPSAkc2xpZGUuY2xvc2VzdCgnLnByb2R1Y3QtZ2FsbGVyeScpLmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX3RodW1ibmFpbHMnKTtcbiAgICAgICAgICAgIGlmICgkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkuaGFzQ2xhc3MoJ3ZlcnRpY2FsLXNsaWRlci1lbmFibGVkJykpIHtcbiAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmF0dHIoJ3RhYmluZGV4JywgJzAnKS5mb2N1cygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBUaHVtYm5haWwgZ2FsbGVyeSBsb2dpYyBiZWdpbnNcbiAgICBpZiAoZ2FsbGVyeU9iamVjdC50aHVtYm5haWxzRW5hYmxlZCA9PSB0cnVlKSB7XG4gICAgICBpZiAoZ2FsbGVyeU9iamVjdC50aHVtYm5haWxzU2xpZGVyRW5hYmxlZCA9PSB0cnVlICYmICRzbGlkZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBJZiBkZXNrdG9wIGRldGVybWluZSB3aGljaCBzbGlkZXIgd2UgYnVpbGRcbiAgICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZS5tZWRpYV9xdWVyaWVzLmxhcmdlLm1hdGNoZXMpIHtcbiAgICAgICAgICAvLyBJZiB0aHVtYm5haWwgcG9zaXRpb24gaXMgbGVmdC9yaWdodCB0aGVuIHZlcnRpY2FsIHNsaWRlciBnZXRzIGVuYWJsZWRcbiAgICAgICAgICBpZiAoZ2FsbGVyeU9iamVjdC50aHVtYm5haWxzUG9zaXRpb24gPT0gJ2xlZnQtdGh1bWJuYWlscycgfHwgZ2FsbGVyeU9iamVjdC50aHVtYm5haWxzUG9zaXRpb24gPT0gJ3JpZ2h0LXRodW1ibmFpbHMnKSB7XG4gICAgICAgICAgICAkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkuY3NzKCdtYXgtaGVpZ2h0JywgJGVsLmNsb3Nlc3QoJy5wcm9kdWN0LWdhbGxlcnlfX21haW4nKS5vdXRlckhlaWdodCgpKTtcbiAgICAgICAgICAgICR0aHVtYm5haWxQcm9kdWN0R2FsbGVyeS5hZGRDbGFzcygndmVydGljYWwtc2xpZGVyLWVuYWJsZWQnKTtcblxuICAgICAgICAgICAgJHRodW1ibmFpbHMub24oJ2NsaWNrJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgICAgdmFyIGluZGV4ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KS5pbmRleCgpO1xuICAgICAgICAgICAgICAkZWwuZmxpY2tpdHkoJ3NlbGVjdCcsIGluZGV4KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2Y
1XIgbmF2Q2VsbEhlaWdodCA9ICR0aHVtYm5haWxzLmhlaWdodCgpO1xuICAgICAgICAgICAgdmFyIG5hdkhlaWdodCA9ICR0aHVtYm5haWxQcm9kdWN0R2FsbGVyeS5oZWlnaHQoKTtcblxuICAgICAgICAgICAgJGVsLm9uKCAnc2VsZWN0LmZsaWNraXR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIC8vIHNldCBzZWxlY3RlZCBuYXYgY2VsbFxuICAgICAgICAgICAgICB2YXIgZmxrdHkgPSAkZWwuZGF0YSgnZmxpY2tpdHknKTtcbiAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmZpbmQoJy5pcy1uYXYtc2VsZWN0ZWQnKS5yZW1vdmVDbGFzcygnaXMtbmF2LXNlbGVjdGVkJyk7XG4gICAgICAgICAgICAgIHZhciAkc2VsZWN0ZWQgPSAkdGh1bWJuYWlscy5lcSggZmxrdHkuc2VsZWN0ZWRJbmRleCApLmFkZENsYXNzKCdpcy1uYXYtc2VsZWN0ZWQnKTtcblxuICAgICAgICAgICAgICAvLyBzY3JvbGwgbmF2XG4gICAgICAgICAgICAgIHZhciBzY3JvbGxZID0gJHNlbGVjdGVkLnBvc2l0aW9uKCkudG9wICsgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LnNjcm9sbFRvcCgpIC0gKCBuYXZIZWlnaHQgKyBuYXZDZWxsSGVpZ2h0ICkgLyAyO1xuICAgICAgICAgICAgICAkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkuYW5pbWF0ZSh7XG4gICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxZXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmZsaWNraXR5KHtcbiAgICAgICAgICAgICAgICBjZWxsQWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGNvbnRhaW46IHRydWUsXG4gICAgICAgICAgICAgICAgZ3JvdXBDZWxsczogJzgwJScsXG4gICAgICAgICAgICAgICAgaW1hZ2VzTG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHBhZ2VEb3RzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBwcmV2TmV4dEJ1dHRvbnM6ICR0aHVtYm5haWxzLmxlbmd0aCA+IDUgPyBnYWxsZXJ5T2JqZWN0LnRodW1ibmFpbHNBcnJvd3MgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBhc05hdkZvcjogJGVsWzBdLFxuICAgICAgICAgICAgICAgIGFycm93U2hhcGU6IGFycm93U2hhcGVcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5Lm9uKCdzZXR0bGUuZmxpY2tpdHknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkuZmxpY2tpdHkoJ3Jlc2l6ZScpO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAkKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkuZmxpY2tpdHkoJ3Jlc2l6ZScpO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBPbmNlIHRodW1ibmFpbCBpcyBmb2N1c2VkLCBtb3ZlIGNhcm91c2VsIHRvIHRoYXQgY2VsbFxuICAgICAgICAgICAgICAkLmVhY2goJHRodW1ibmFpbHMsIGZ1bmN0aW9uKGluZGV4LCB0aHVtYm5haWwpIHtcbiAgICAgICAgICAgICAgICB2Y
1XIgJHRodW1ibmFpbCA9ICQodGh1bWJuYWlsKTtcbiAgICAgICAgICAgICAgICBpZiAoJHRodW1ibmFpbC5oYXNDbGFzcygnaXMtc2VsZWN0ZWQnKSkge1xuICAgICAgICAgICAgICAgICAgJHRodW1ibmFpbC5vbignZm9jdXMnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmZsaWNraXR5KCdzZWxlY3RDZWxsJywgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vdCBvbiBkZXNrdG9wLCBjcmVhdGUgc3RhbmRhcmQgdGh1bWJuYWlsIHNsaWRlclxuICAgICAgICAgICR0aHVtYm5haWxQcm9kdWN0R2FsbGVyeS5mbGlja2l0eSh7XG4gICAgICAgICAgICBjZWxsQWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgY29udGFpbjogdHJ1ZSxcbiAgICAgICAgICAgIGdyb3VwQ2VsbHM6ICc4MCUnLFxuICAgICAgICAgICAgaW1hZ2VzTG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgcGFnZURvdHM6IGZhbHNlLFxuICAgICAgICAgICAgcHJldk5leHRCdXR0b25zOiAkdGh1bWJuYWlscy5sZW5ndGggPiA1ID8gZ2FsbGVyeU9iamVjdC50aHVtYm5haWxzQXJyb3dzIDogZmFsc2UsXG4gICAgICAgICAgICBhc05hdkZvcjogJGVsWzBdLFxuICAgICAgICAgICAgYXJyb3dTaGFwZTogYXJyb3dTaGFwZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aHVtYm5haWwgc2xpZGVyIGlzIGRpc2FibGVkLCBlbnN1cmUgdGh1bWJuYWlscyBjYW4gc3RpbGwgbmF2aWdhdGUgcHJvZHVjdCBpbWFnZXNcbiAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX3RodW1ibmFpbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgdmFyIGluZGV4ID0gJCh0aGlzKS5pbmRleCgpO1xuICAgICAgICAgICRlbC5mbGlja2l0eSggJ3NlbGVjdENlbGwnLCBpbmRleCApO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbGF1bmNoUHJvZHVjdE1lZGlhOiBmdW5jdGlvbihnYWxsZXJ5T2JqZWN0KSB7XG5cbiAgICAvLyBmdW5jdGlvbiB0byBjaGVjayBpZiBicm93c2VyIGlzIElFXG4gICAgdmFyIGlzSUUxMSA9ICEhbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvVHJpZGVudC4qcnZcXDoxMVxcLi8pO1xuXG4gICAgLy8gRW5zdXJlIHByb2R1Y3QgbWVkaWEgbGlicmFyaWVzIGFyZSBwcmVzZW50XG4gICAgaWYgKCFpc0lFMTEpIHtcbiAgICAgIHdpbmRvdy5TaG9waWZ5LmxvYWRGZWF0dXJlcyhbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnc2hvcGlmeS14cicsXG4gICAgICAgICAgdmVyc2lvbjogJzEuMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnbW9kZWwtdmlld2VyLXVpJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMS4wJyxcbiAgICAgICAgfVxuICAgICAgXSwgb25BbGxGZWF0dXJlc0xvYWRlZCk7XG4gICAgfVxuXG4gICAgLy8gRW5hYmxlIGxvb3BpbmcgZm9yIHZpZGVvcyBiYXNlZCBvZmYgdGhlaXIgc2VjdGlvbiBzZXR0aW5nXG4gICAgLy8gRmluZCB2aWRlb3Mgd2hlcmUgdGhleSBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNlY3Rpb25cbiAgICAvLyBTZXQgbG9vcGluZ1xuXG4gICAgJC5lYWNoKGdhbGxlcnlPYmplY3QudmlkZW9QbGF5ZXJzLCBmdW5jdGlvbihpbmRleCwgcGxheWVyKSB7XG4gICAgICB2Y
1XIgJHdyYXBwZXIgPSAkKHBsYXllci5lbGVtZW50cy53cmFwcGVyKTtcblxuICAgICAgaWYgKGdhbGxlcnlPYmplY3Quc2VjdGlvbklEICE9IG51bGwpIHtcbiAgICAgICAgdmFyICRzZWN0aW9uID0gJHdyYXBwZXIucGFyZW50cygnLnNob3BpZnktc2VjdGlvbicpLmF0dHIoJ2lkJywgZ2FsbGVyeU9iamVjdC5zZWN0aW9uSUQpO1xuICAgICAgICB2YXIgbG9vcGluZ0VuYWJsZWQgPSAkc2VjdGlvbi5maW5kKGdhbGxlcnlPYmplY3QuZWxlbWVudCkuZmluZCgnLnByb2R1Y3QtZ2FsbGVyeV9fbWFpbicpLmRhdGEoJ3ZpZGVvLWxvb3BpbmctZW5hYmxlZCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGxvb3BpbmdFbmFibGVkID0gZ2FsbGVyeU9iamVjdC5lbGVtZW50LmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX21haW4nKS5kYXRhKCd2aWRlby1sb29waW5nLWVuYWJsZWQnKTtcbiAgICAgIH1cblxuICAgICAgcGxheWVyLmxvb3AgPSBsb29waW5nRW5hYmxlZDtcbiAgICB9KVxuXG4gICAgLy8gM0QgTW9kZWwgU2V0dXBcbiAgICB2YXIgY29uZmlnID0ge1xuICAgICAgLy8gRGVmYXVsdCBjb250cm9sIGxpc3RcbiAgICAgIGNvbnRyb2xzOiBbXG4gICAgICAgICd6b29tLWluJyxcbiAgICAgICAgJ3pvb20tb3V0JyxcbiAgICAgICAgJ2Z1bGxzY3JlZW4nLFxuICAgICAgXSxcbiAgICAgIGZvY3VzT25QbGF5OiBmYWxzZVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBvbkFsbEZlYXR1cmVzTG9hZGVkKCkge1xuICAgICAgLy8gSWYgcHJvZHVjdCBtZWRpYSBlbmFibGVkIGxvb2sgZm9yIG1vZGVsLXZpZXdlciB0YWdzIGFuZCBzZXR1cFxuICAgICAgZ2FsbGVyeU9iamVjdC5tb2RlbHMgPSBbXTtcbiAgICAgIHZhciAkbW9kZWxzID0gJCgkKCdtb2RlbC12aWV3ZXInLCBnYWxsZXJ5T2JqZWN0LmVsZW1lbnQpKTtcbiAgICAgICRtb2RlbHMuZWFjaChmdW5jdGlvbihpbmRleCwgbW9kZWwpIHtcbiAgICAgICAgbW9kZWwgPSBuZXcgU2hvcGlmeS5Nb2RlbFZpZXdlclVJKG1vZGVsLCBjb25maWcpO1xuICAgICAgICBnYWxsZXJ5T2JqZWN0Lm1vZGVscy5wdXNoKG1vZGVsKTtcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuICBlbmFibGVWaWRlb09uSG92ZXI6IGZ1bmN0aW9uKCR0aHVtYm5haWwpIHtcbiAgICB2YXIgJGh0bWw1VmlkZW8gPSAkdGh1bWJuYWlsLmZpbmQoJ1tkYXRhLWh0bWw1LXZpZGVvXScpO1xuICAgIHZhciAkeW91dHViZVZpZGVvID0gJHRodW1ibmFpbC5maW5kKCdbZGF0YS15b3V0dWJlLXZpZGVvXScpO1xuICAgIHZhciB2aWRlb0lEO1xuXG4gICAgaWYgKCRodG1sNVZpZGVvLmxlbmd0aCA+IDApIHtcbiAgICAgIHZpZGVvSUQgPSAkaHRtbDVWaWRlby5maW5kKCdbZGF0YS1wbHlyLXZpZGVvLWlkXScpLmRhdGEoJ3BseXItdmlkZW8taWQnKTtcbiAgICB9IGVsc2UgaWYgKCR5b3V0dWJlVmlkZW8ubGVuZ3RoID4gMCkge1xuICAgICAgdmlkZW9JRCA9ICR5b3V0dWJlVmlkZW8uZmluZCgnaWZyYW1lJykuYXR0cignaWQnKTtcbiAgICB9XG5cbiAgICBpZiAodmlkZW9JRCkge1xuICAgICAgJC5lYWNoKHNlY29uZGFyeU1lZGlhUGxheWVycywgZnVuY3Rpb24oaW5kZXgsIHBsYXllcikge1xuXG4gICAgICAgIGlmIChwbGF5ZXIuaWQgPT0gdmlkZW9JRCB8fCBwbGF5ZXIubWVkaWEuaWQgPT0gdmlkZW9JRCkge1xuICAgICAgICAgIHBsYXllci50b2dnbGVDb250cm9scyhmYWxzZSk7XG4gICAgICAgICAgcGxheWVyLm11dGVkID0gdHJ1ZTtcbiAgICAgICAgICBwbGF5ZXIucGxheSgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICB9LFxuICBkaXNhYmxlVmlkZW9PbkhvdmVyOiBmdW5jdGlvbigkdGh1bWJuYWlsKSB7XG4gICAgdmFyICRodG1sNVZpZGVvID0gJHRodW1ibmFpbC5maW5kKCdbZGF0YS1odG1sNS12aWRlb10nKTtcbiAgICB2YXIgJHlvdXR1YmVWaWRlbyA9ICR0aHVtYm5haWwuZmluZCgnW2RhdGEteW91dHViZS12aWRlb10nKTtcbiAgICB2YXIgdmlkZW9JRDtcblxuICAgIGlmICgkaHRtbDVWaWRlby5sZW5ndGggPiAwKSB7XG4gICAgICB2aWRlb0lEID0gJGh0bWw1VmlkZW8uZmluZCgnW2RhdGEtcGx5ci12aWRlby1pZF0nKS5kYXRhKCdwbHlyLXZpZGVvLWlkJyk7XG4gICAgfSBlbHNlIGlmICgkeW91dHViZVZpZGVvLmxlbmd0aCA+IDApIHtcbiAgICAgIHZpZGVvSUQgPSAkeW91dHViZVZpZGVvLmZpbmQoJ2lmcmFtZScpLmF0dHIoJ2lkJyk7XG4gICAgfVxuXG4gICAgaWYgKHZpZGVvSUQpIHtcbiAgICAgICQuZWFjaChzZWNvbmRhcnlNZWRpYVBsYXllcnMsIGZ1bmN0aW9uKGluZGV4LCBwbGF5ZXIpIHtcblxuICAgICAgICBpZiAocGxheWVyLmlkID09IHZpZGVvSUQgfHwgcGxheWVyLm1lZGlhLmlkID09IHZpZGVvSUQpIHtcbiAgICAgICAgICBpZiAocGxheWVyLnBsYXlpbmcpIHtcbiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH0sXG4gIGxvYWRQbHlyOiBmdW5jdGlvbihnYWxsZXJ5T2JqZWN0LCB2aWRlb3MsIHNob3dTZWNvbmRhcnlNZWRpYSkge1xuXG4gICAgLy8gSW5pdGlhbGl6ZXMgUGx5ciBsaWJyYXJ5IGZvciBIVE1MNSBhbmQgWW91VHViZSB2aWRlb3MgaW4gUHJvZHVjdCBHYWxsZXJ5XG4gICAgdXRpbGl0aWVzLmxhdW5jaFZpZGVvUGxheWVyKFBseXIsIGdhbGxlcnlPYmplY3QsIHZpZGVvcywgc2hvd1NlY29uZGFyeU1lZGlhKTtcblxuICAgIGlmIChnYWxsZXJ5T2JqZWN0KSB7XG4gICAgICAvLyBBZGRzIHBseXIgdmlkZW8gaWQgdG8gdmlkZW8gd3JhcHBlclxuICAgICAgJC5lYWNoKGdhbGxlcnlPYmplY3QudmlkZW9QbGF5ZXJzLCBmdW5jdGlvbihpbmRleCwgcGxheWVyKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBwbGF5ZXIucHJvdmlkZXI7XG4gICAgICAgIHZhciBpZCA9IHBsYXllci5pZDtcbiAgICAgICAgdmFyICR2aWRlbztcblxuICAgICAgICBpZiAoc291cmNlID09ICdodG1sNScpIHtcbiAgICAgICAgICAkdmlkZW8gPSAkKHBsYXllci5lbGVtZW50cy53cmFwcGVyKS5maW5kKCd2aWRlbycpO1xuICAgICAgICAgICR2aWRlby5hdHRyKCdkYXRhLXBseXItdmlkZW8taWQnLCBpZCk7XG4gICAgICAgI
1H1cbiAgICAgIH0pXG4gICAgfVxuICB9LFxuICBsb2FkUHJvZHVjdFJlY29tbWVuZGF0aW9uczogZnVuY3Rpb24oKSB7XG4gICAgdmFyICRwcm9kdWN0UmVjb21tZW5kYXRpb25zID0gJCgnLnByb2R1Y3QtcmVjb21tZW5kYXRpb25zJyk7XG4gICAgdmFyIHByb2R1Y3RJRCA9ICRwcm9kdWN0UmVjb21tZW5kYXRpb25zLmRhdGEoJ3Byb2R1Y3QtaWQnKTtcbiAgICB2YXIgbGltaXQgPSAkcHJvZHVjdFJlY29tbWVuZGF0aW9ucy5kYXRhKCdsaW1pdCcpO1xuICAgIHZhciByZWNvbW1lbmRhdGlvbnNVUkwgPSAkcHJvZHVjdFJlY29tbWVuZGF0aW9ucy5kYXRhKCdyZWNvbW1lbmRhdGlvbnMtdXJsJyk7XG4gICAgdmFyIHNlY3Rpb25FbmFibGVkID0gJHByb2R1Y3RSZWNvbW1lbmRhdGlvbnMuZGF0YSgnZW5hYmxlZCcpO1xuICAgIHZhciBzZWN0aW9uSWQgPSAkcHJvZHVjdFJlY29tbWVuZGF0aW9ucy5kYXRhKCdzZWN0aW9uLWlkJyk7XG5cbiAgICBpZiAoIXNlY3Rpb25FbmFibGVkKSByZXR1cm47XG5cbiAgICAvLyBCdWlsZCByZXF1ZXN0IFVSTFxuICAgIHZhciByZXF1ZXN0VXJsID0gcmVjb21tZW5kYXRpb25zVVJMICsgXCI/c2VjdGlvbl9pZD1cIiArIHNlY3Rpb25JZCArIFwiJmxpbWl0PVwiICsgbGltaXQgKyBcIiZwcm9kdWN0X2lkPVwiICsgcHJvZHVjdElEO1xuXG4gICAgJC5hamF4KHtcbiAgICAgIHR5cGU6ICdHRVQnLFxuICAgICAgdXJsOiByZXF1ZXN0VXJsLFxuICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICBpZiAoIXNlY3Rpb25FbmFibGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyICRyZWNvbW1lbmRlZFByb2R1Y3RzRWxlbWVudCA9ICQoZGF0YSkuZmluZCgnLnByb2R1Y3QtcmVjb21tZW5kYXRpb25zJykuaHRtbCgpO1xuXG4gICAgICAgIC8vIEluc2VydCBwcm9kdWN0IGxpc3QgaW50byB0aGUgcHJvZHVjdCAgcmVjb21tZW5kYXRpb25zIGNvbnRhaW5lclxuICAgICAgICAkcHJvZHVjdFJlY29tbWVuZGF0aW9ucy5odG
11sKCRyZWNvbW1lbmRlZFByb2R1Y3RzRWxlbWVudCk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBzaG9waWZ5IHBheW1lbnQgYnV0dG9uc1xuICAgICAgICBpZiAoU2hvcGlmeS5QYXltZW50QnV0dG9uKSB7XG4gICAgICAgICAgU2hvcGlmeS5QYXltZW50QnV0dG9uLmluaXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdpbmRvdy5jb2xsZWN0aW9uLmluaXQoKTtcblxuICAgICAgICAvLyBBY3RpdmUgc3dhdGNoIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByZWNvbW1lbmRlZCBwcm9kdWN0IHF1aWNrIHNob3BcbiAgICAgICAgd2luZG93LnByb2R1Y3QucHJvZHVjdFN3YXRjaGVzKCk7XG5cbiAgICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5jb2xsZWN0aW9uX3NlY29uZGFyeV9pbWFnZSkge1xuICAgICAgICAgIHdpbmRvdy5jb2xsZWN0aW9uLnNob3dTZWNvbmRhcnlJbWFnZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIHVubG9hZDogZnVuY3Rpb24oJHRhcmdldCl7XG4gICAgLy8gRGVzdHJveSBGbGlja2l0eSBzbGlkZXJcbiAgICB2YXIgJGdhbGxlcnlTbGlkZXIgPSAkdGFyZ2V0LmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX21haW4nKTtcbiAgICB2YXIgJHRodW1ibmFpbFNsaWRlciA9ICR0YXJnZXQuZmluZCgnLnByb2R1Y3QtZ2FsbGVyeV9fdGh1bWJuYWlscycpO1xuXG4gICAgJGdhbGxlcnlTbGlkZXIuZmxpY2tpdHkoJ2Rlc3Ryb3knKTtcbiAgICAkdGh1bWJuYWlsU2xpZGVyLmZsaWNraXR5KCdkZXN0cm95Jyk7XG5cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdsYXp5bG9hZGVkJywgd2luZG93LnByb2R1Y3QuZW5hYmxlWm9vbSk7XG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFByb2R1Y3QgZm9ybVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxud2luZG93LnByb2R1Y3RGb3JtTGlzdGVuZXJzID0ge1xuICBpbml0OiBmdW5jdGlvbigpe1xuXG4gICAgJChkb2N1bWVudCkub24oXCJjbGlja1wiLCBcIi5taW51c1wiLCBmdW5jdGlvbihlKSB7XG4gICAgICB2Y
1XIgcXVhbnRpdHkgPSBwYXJzZUludCgkKHRoaXMpLm5leHQoXCJpbnB1dFwiKS52YWwoKSk7XG4gICAgICBxdWFudGl0eSAtPSAxO1xuICAgICAgJCh0aGlzKS5uZXh0KFwiaW5wdXRcIikudmFsKHF1YW50aXR5KTtcblxuICAgICAgaWYgKHF1YW50aXR5ID09IDApIHtcbiAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCdsaS5jYXJ0X2l0ZW0nKS5zbGlkZVVwKCk7XG4gICAgICAgIHNldFRpbWVvdXQoYWpheFN1Ym1pdENhcnQsIDUwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgXHQkKHRoaXMpLm5leHQoXCJpbnB1dFwiKS50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgIH1cblxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgICQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgXCIucGx1c1wiLCBmdW5jdGlvbihlKSB7XG4gICAgICB2YXIgcXVhbnRpdHkgPSBwYXJzZUludCgkKHRoaXMpLnByZXYoXCJpbnB1dFwiKS52YWwoKSk7XG4gICAgICBxdWFudGl0eSArPSAxO1xuICAgICAgJCh0aGlzKS5wcmV2KFwiaW5wdXRcIikudmFsKHF1YW50aXR5KS50cmlnZ2VyKCdjaGFuZ2UnKTtcblxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgIC8vIFByZXZlbnQgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlIGNhcnQgbGluayB3aGVuIHRoZSBxdWFudGl0eSBpbnB1dCBpcyBjbGlja2VkXG4gICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5jYXJ0X19xdWFudGl0eSBpbnB1dC5xdWFudGl0eScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgICQoZG9jdW1lbnQpLm9uKFwiY2hhbmdlXCIsIFwiI2NhcnRfZm9ybSBpbnB1dFt0eXBlPSdudW1iZXInXVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICQoXCIjY2FydF9mb3JtXCIpLnN1Ym1pdCgpO1xuICAgIH0pO1xuXG4gICAgaWYgKCQoJy50b3NfYWdyZWUnKS5sZW5ndGgpIHtcbiAgICAgICQoJ2JvZHknKS5vbignY2xpY2snLCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZigkKHRoaXMpLnBhcmVudHMoJ2Zvcm0nKS5maW5kKCcudG9zX2FncmVlJykubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKCQodGhpcykucGFyZW50cygnZm9ybScpLmZpbmQoJy50b3NfYWdyZWUnKS5pcygnOmNoZWNrZWQnKSkge1xuICAgICAgICAgICAgJCh0aGlzKS5zdWJtaXQoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWxlcnQod2luZG93LlBYVVRoZW1lLnRyYW5zbGF0aW9uLmFncmVlX3RvX3Rlcm1zX3dhcm5pbmcpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkKHRoaXMpLnN1Ym1pdCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIHVubG9hZDogZnVuY3Rpb24oKXtcblxuICB9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBDb2xsZWN0aW9uXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0q
1L1xuXG53aW5kb3cuY29sbGVjdGlvbiA9IHtcbiAgaW5pdDogZnVuY3Rpb24oKXtcbiAgICBpZiAod2luZG93LlBYVVRoZW1lLnRoZW1lX3NldHRpbmdzLmNvbGxlY3Rpb25fc3dhdGNoZXMpIHtcbiAgICAgIGlmICh3aW5kb3cuUFhVVGhlbWUubWVkaWFfcXVlcmllcy5sYXJnZS5tYXRjaGVzKSB7XG4gICAgICAgICQoJy50aHVtYm5haWwnKS5ob3ZlcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAkKCcuc3dhdGNoIHNwYW4nLCAkKHRoaXMpKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYoJCh0aGlzKS5kYXRhKFwiaW1hZ2VcIikuaW5kZXhPZihcIm5vLWltYWdlXCIpID09IC0xKSB7XG4gICAgICAgICAgICAgICQoJzxpbWcvPicpWzBdLnNyYyA9ICQodGhpcykuZGF0YShcImltYWdlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAkKCcuc3dhdGNoIHNwYW4nKS5ob3ZlcihmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZigkKHRoaXMpLmRhdGEoXCJpbWFnZVwiKS5pbmRleE9mKFwibm8taW1hZ2VcIikgPT0gLTEpIHtcbiAgICAgICAgICAgICQodGhpcykucGFyZW50cygnLnRodW1ibmFpbCcpLmZpbmQoJ2ltZycpLmF0dHIoJ3NyYycsICQodGhpcykuZGF0YShcImltYWdlXCIpKTtcbiAgICAgICAgICAgICQodGhpcykucGFyZW50cygnLnRodW1ibmFpbCcpLmZpbmQoJ2ltZycpLmF0dHIoJ3NyY3NldCcsICQodGhpcykuZGF0YShcImltYWdlXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aGUgUXVpY2sgc2hvcCBidXR0b24gYW5kIEZhbmN5Ym94IGRhdGEgYXR0cmlidXRlcyBvbiBtb2JpbGUgZGV2aWNlc1xuICAgIGlmKCB3aW5kb3cuUFhVVGhlbWUuZGV2aWNlLmhhc1RvdWNoLm1hdGNoZXMpIHtcbiAgICAgICQoJy5xdWlja19zaG9wJykucmVtb3ZlKCk7XG4gICAgICAkKCcucXVpY2tfc2hvcC0tbGlzdCcpLnJlbW92ZUF0dHIoJ2RhdGEtZmFuY3lib3ggZGF0YS1zcmMgZGF0YS1nYWxsZXJ5Jyk7XG4gICAgfVxuXG4gICAgLy8gRGlzcGxheSB0aGUgUXVpY2sgc2hvcCBvbiBkZXNrdG9wXG4gICAgaWYgKHdpbmRvdy5QWFVUaGVtZS5tZWRpYV9xdWVyaWVzLmxhcmdlLm1hdGNoZXMpIHtcbiAgICAgICQoJy5xdWlja19zaG9wLCAucXVpY2tfc2hvcC0tbGlzdCcpLmZhbmN5Ym94KHtcbiAgICAgICAgYmFzZUNsYXNzOiAncXVpY2stc2hvcF9fbGlnaHRib3ggcHJvZHVjdC0nICsgcHJvZHVjdC5pZCxcbiAgICAgICAgaGFzaDogZmFsc2UsXG4gICAgICAgIGluZm9iYXIgOiBmYWxzZSxcbiAgICAgICAgdG9vbGJhcjogZmFsc2UsXG4gICAgICAgIGxvb3A6IGZhbHNlLFxuICAgICAgICBzbWFsbEJ0biA6IHRydWUsXG4gICAgICAgIHZpZGVvOiB7XG4gICAgICAgICAgYXV0b1N0YXJ0OiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICB0b3VjaDogZmFsc2UsXG4gICAgICAgIG1vYmlsZToge1xuICAgICAgICAgIHByZXZlbnRDYXB0aW9uT3ZlcmxhcDogZmFsc2UsXG4gICAgICAgICAgdG9vbGJhcjogdHJ1ZSxcbiAgICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgICBcImNsb3NlXCJcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIGFmdGVyU2hvdzogZnVuY3Rpb24oZSkge1xuICAgICAgICAgIC8vIFdoZW4gdGhlIG1vZGFsIGlzIG9wZW5lZCwgcHJldmVudCBzY3JvbGxpbmdcbiAgICAgICAgICBkb2
1N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2Nyb2xsLWxvY2tlZCcpO1xuXG4gICAgICAgICAgdmFyIHByb2R1Y3RVcmwgPSAkKGUuY3VycmVudC5zcmMpLmRhdGEoJ3VybCcpXG4gICAgICAgICAgQXN5bmNWaWV3LmxvYWQoXG4gICAgICAgICAgICBwcm9kdWN0VXJsLFxuICAgICAgICAgICAgeyB2aWV3OiAncXVpY2tzaG9wJyB9LFxuICAgICAgICAgICkudGhlbigoeyBkYXRhLCBodG1sIH0pID0+IHtcbiAgICAgICAgICAgICQoZS5jdXJyZW50LnNyYyArICcubW9kYWwnKS5odG1sKGh0bWwuY29udGVudCk7XG5cbiAgICAgICAgICAgIHdpbmRvdy5wcm9kdWN0LmluaXQoKTtcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgc2hvcGlmeSBwYXltZW50IGJ1dHRvbnNcbiAgICAgICAgICAgIGlmIChTaG9waWZ5LlBheW1lbnRCdXR0b24pIHtcbiAgICAgICAgICAgICAgU2hvcGlmeS5QYXltZW50QnV0dG9uLmluaXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gR3JhYiB0aGUgZmFuY3lib3ggZWxlbWVudCB0aGF0IGlzIGJlaW5nIGNsaWNrZWRcbiAgICAgICAgICAgIHZhciAkZmFuY3lib3hJbWFnZUVsZW1lbnQgPSAkKHRoaXMub3B0cy4kb3JpZyk7XG5cbiAgICAgICAgICAgIHZhciAkZ2FsbGVyeSA9ICQoJy4nICsgJGZhbmN5Ym94SW1hZ2VFbGVtZW50LmRhdGEoJ2dhbGxlcnknKSk7XG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSAkKCcuZmFuY3lib3gtaXMtb3BlbicpLmZpbmQoJy5zZWxlY3Rvci13cmFwcGVyIHNlbGVjdCcpO1xuICAgICAgICAgICAgdmFyICRwcm9kdWN0Rm9ybSA9ICQoJy5mYW5jeWJveC1pcy1vcGVuIC5qcy1wcm9kdWN0X3NlY3Rpb24nKS5maW5kKCcucHJvZHVjdF9mb3JtJyk7XG5cbiAgICAgICAgICAgIC8vTGluayBzb2xkIG91dCBvcHRpb25zIHdoZW4gdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBvcHRpb24gYXZhaWxhYmxlXG4gICAgICAgICAgICBpZiAod2luZG93LlBYVVRoZW1lLnRoZW1lX3NldHRpbmdzLnByb2R1Y3RfZm9ybV9zdHlsZSAgPT0gJ3N3YXRjaGVzJykge1xuICAgICAgICAgICAgICB2Y
1XIgSlNPTkRhdGEgPSAkcHJvZHVjdEZvcm0uZGF0YSgncHJvZHVjdCcpO1xuICAgICAgICAgICAgICB2YXIgcHJvZHVjdElEID0gJHByb2R1Y3RGb3JtLmRhdGEoJ3Byb2R1Y3QtaWQnKTtcbiAgICAgICAgICAgICAgdmFyIHByb2R1Y3RTZWN0aW9uID0gJy5wcm9kdWN0LScgKyBwcm9kdWN0SUQgKyAnIC5qcy1wcm9kdWN0X3NlY3Rpb24nO1xuICAgICAgICAgICAgICB2YXIgc3dhdGNoT3B0aW9ucyA9ICRwcm9kdWN0Rm9ybS5maW5kKCcuc3dhdGNoLW9wdGlvbnMgLnN3YXRjaCcpO1xuICAgICAgICAgICAgICBpZiAoc3dhdGNoT3B0aW9ucy5sZW5ndGggPiAxKXtcbiAgICAgICAgICAgICAgICBTaG9waWZ5LmxpbmtPcHRpb25TZWxlY3RvcnMoSlNPTkRhdGEsIHByb2R1Y3RTZWN0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxlY3Rvci50cmlnZ2VyKCdjaGFuZ2UnKTtcblxuICAgICAgICAgICAgLy8gR2xvYmFsIHZhcmlhYmxlc1xuICAgICAgICAgICAgdmFyICRnYWxsZXJ5ID0gJCgnLicgKyAkZmFuY3lib3hJbWFnZUVsZW1lbnQuZGF0YSgnZ2FsbGVyeScpKTtcblxuICAgICAgICAgICAgdmFyIGdhbGxlcnlPYmplY3QgPSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQ6ICRnYWxsZXJ5LFxuICAgICAgICAgICAgICB0aHVtYm5haWxzRW5hYmxlZDogJGdhbGxlcnkucGFyZW50cygnLnByb2R1Y3Rfc2VjdGlvbicpLmRhdGEoJ3RodW1ibmFpbHMtZW5hYmxlZCcpLFxuICAgICAgICAgICAgICB0aHVtYm5haWxzU2xpZGVyRW5hYmxlZDogJGdhbGxlcnkucGFyZW50cygnLnByb2R1Y3Rfc2VjdGlvbicpLmRhdGEoJ3RodW1ibmFpbHMtc2xpZGVyLWVuYWJsZWQnKSxcbiAgICAgICAgICAgICAgdGh1bWJuYWlsc1Bvc2l0aW9uOiAkZ2FsbGVyeS5wYXJlbnRzKCcucHJvZHVjdF9zZWN0aW9uJykuZGF0YSgndGh1bWJuYWlscy1wb3NpdGlvbicpLFxuICAgICAgICAgICAgICB0aHVtYm5haWxzQXJyb3dzOiAkZ2FsbGVyeS5wYXJlbnRzKCcucHJvZHVjdF9zZWN0aW9uJykuZGF0YSgnZ2FsbGVyeS1hcnJvd3MtZW5hYmxlZCcpLFxuICAgICAgICAgICAgICBzbGlkZXNob3dBbmltYXRpb246ICRnYWxsZXJ5LnBhcmVudHMoJy5wcm9kdWN0X3NlY3Rpb24nKS5kYXRhKCdzbGlkZXNob3ctYW5pbWF0aW9uJyksXG4gICAgICAgICAgICAgIHNsaWRlU2hvd1NwZWVkOiAkZ2FsbGVyeS5wYXJlbnRzKCcucHJvZHVjdF9zZWN0aW9uJykuZGF0YSgnc2xpZGVzaG93LXNwZWVkJyksXG4gICAgICAgICAgICAgIGFjdGl2YXRlWm9vbTogJGdhbGxlcnkucGFyZW50cygnLnByb2R1Y3Rfc2VjdGlvbicpLmRhdGEoJ2FjdGl2YXRlLXpvb20nKSxcbiAgICAgICAgICAgICAgcHJvZHVjdE1lZGlhU3VwcG9ydGVkOiAkZ2FsbGVyeS5wYXJlbnRzKCcucHJvZHVjdF9zZWN0aW9uJykuZGF0YSgncHJvZHVjdC1tZWRpYS1zdXBwb3J0ZWQnKSxcbiAgICAgICAgICAgICAgbG9vcGluZ0VuYWJsZWQ6ICRnYWxsZXJ5LmRhdGEoJ3ZpZGVvLWxvb3BpbmctZW5hYmxlZCcpLFxuICAgICAgICAgICAgICBzZWN0aW9uSUQ6IG51bGxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2luZG93LnByb2R1Y3QuZW5hYmxlU2xpZGVyKGdhbGxlcnlPYmplY3QpO1xuXG4gICAgICAgICAgICBpZiAoZ2FsbGVyeU9iamVjdC5wcm9kdWN0TWVkaWFTdXBwb3J0ZWQpIHtcblxuICAgICAgICAgICAgICAvLyBGaW5kIHZpZGVvcyB3aXRoaW4gZ2FsbGVyeSBzZWN0aW9uXG4gICAgICAgICAgICAgIHZhciB0aHVtYm5haWxWaWRlb3M7XG4gICAgICAgICAgICAgIHRodW1ibmFpbFZpZGVvcyA9ICQoZ2FsbGVyeU9iamVjdC5lbGVtZW50KS5maW5kKCdbZGF0YS1odG1sNS12aWRlb10gdmlkZW8sIFtkYXRhLXlvdXR1YmUtdmlkZW9dJykuZ2V0KCk7XG5cbiAgICAgICAgICAgICAgd2luZG93LnByb2R1Y3QubG9hZFBseXIoZ2FsbGVyeU9iamVjdCwgdGh1bWJuYWlsVmlkZW9zKTtcbiAgICAgICAgICAgICAgd2luZG93LnByb2R1Y3QubGF1bmNoUHJvZHVjdE1lZGlhKGdhbGxlcnlPYmplY3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIb3ZlciB0byB6b29tXG4gICAgICAgICAgICBpZiAoZ2FsbGVyeU9iamVjdC5hY3RpdmF0ZVpvb20pIHtcbiAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbGF6eWxvYWRlZCcsIHdpbmRvdy5wcm9kdWN0LmVuYWJsZVpvb20pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIHRhYnNcblxuICAgICAgICAgICAgY29uc3QgcXVpY2tzaG9wVGFicyA9ICQoJy5wcm9kdWN0X3NlY3Rpb24uaXMtcXVpY2tzaG9wJykuZmluZCgndWwudGFicycpO1xuICAgICAgICAgICAgaWYgKHF1aWNrc2hvcFRhYnMpIHtcbiAgICAgICAgICAgICAgcXVpY2tzaG9wVGFicy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYiA9ICQodGhpcykuZmluZCgnPiBsaSA+IGEnKTtcbiAgICAgICAgICAgICAgICB0YWIuY2xpY2soZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudExvY2F0aW9uID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7XG4gICAgICAgICAgICAgICAgICBpZiAoY29udGVudExvY2F0aW9uLmNoYXJBdCgwKT09XCIjXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0YWIucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnRzKCd1bC50YWJzJykubmV4dCgpLmZpbmQoY29udGVudExvY2F0aW9uKS5zaG93KCkuY3NzKHsnZGlzcGxheSc6ICdibG9jayd9KS5hZGRDbGFzcygnYWN0aXZlJykuc2libGluZ3MoKS5oaWRlKCkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICBhZnRlckNsb3NlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBXaGVuIHRoZSBtb2RhbCBpcyBjbG9zZWQsIGFsbG93IHNjcm9sbGluZ1xuICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzY3JvbGwtbG9ja2VkJyk7XG5cbiAgICAgICAgICAvLyBHcmFiIHRoZSBmYW5jeWJveCBlbGVtZW50IHRoYXQgaXMgYmVpbmcgY2xpY2tlZFxuICAgICAgICAgI
1HZhciAkZmFuY3lib3hJbWFnZUVsZW1lbnQgPSAkKHRoaXMub3B0cy4kb3JpZyk7XG4gICAgICAgICAgdmFyICRnYWxsZXJ5ID0gJCgnLicgKyAkZmFuY3lib3hJbWFnZUVsZW1lbnQuZGF0YSgnZ2FsbGVyeScpKVxuXG4gICAgICAgICAgLy8gRmluZCB2aWRlb3MgaW4gZ2FsbGVyeVxuICAgICAgICAgIC8vIEZpbmQgSURzIGFuZCBtYXRjaCBhZ2FpbnN0IHBsYXllclxuICAgICAgICAgIC8vIElmIHZpZGVvcyBhcmUgcGxheWluZywgcGF1c2UgdGhlbVxuICAgICAgICAgIHZhciAkdmlkZW9zSW5HYWxsZXJ5ID0gJGdhbGxlcnkuZmluZCgnLnByb2R1Y3QtZ2FsbGVyeV9faW1hZ2VbZGF0YS1tZWRpYS10eXBlPVwidmlkZW9cIl0sIC5wcm9kdWN0LWdhbGxlcnlfX2ltYWdlW2RhdGEtbWVkaWEtdHlwZT1cImV4dGVybmFsX3ZpZGVvXCJdJyk7XG4gICAgICAgICAgJHZpZGVvc0luR2FsbGVyeS5lYWNoKGZ1bmN0aW9uKGluZGV4LCB2aWRlbykge1xuICAgICAgICAgICAgdmFyICRpZnJhbWVWaWRlbyA9ICQodmlkZW8pLmZpbmQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgdmFyIGlmcmFtZUlEID0gJGlmcmFtZVZpZGVvLmF0dHIoJ2lkJyk7XG4gICAgICAgICAgICB2YXIgJGh0bWw1VmlkZW8gPSAkKHZpZGVvKS5maW5kKCdbZGF0YS1odG1sNS12aWRlb10nKTtcbiAgICAgICAgICAgIHZhciB2aWRlb0lEID0gJGh0bWw1VmlkZW8uZmluZCgndmlkZW8nKS5kYXRhKCdwbHlyLXZpZGVvLWlkJyk7XG5cbiAgICAgICAgICAgIC8vIFBhdXNlIHZpZGVvcyBpZiBJRHMgbWF0Y2hcbiAgICAgICAgICAgIGlmICgkaHRtbDVWaWRlby5sZW5ndGggfHwgJGlmcmFtZVZpZGVvLmxlbmd0aCkge1xuICAgICAgICAgICAgICAkLmVhY2goZ2xvYmFsUGxheWVyc0FycmF5LCBmdW5jdGlvbihpbmRleCwgcGxheWVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpZGVvSUQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIuaWQgPT0gdmlkZW9JRCAmJiBwbGF5ZXIucGxheWluZykge1xuICAgICAgICAgICAgICAgICAgICBwbGF5ZXIucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlmcmFtZUlEKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocGxheWVyLm1lZGlhLmlkID09IGlmcmFtZUlEICYmIHBsYXllci5wbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHBsYXllci5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xhenlsb2FkZWQnLCB3aW5kb3cucHJvZHVjdC5lbmFibGVab29tKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCQoJ1tkYXRhLWZhY2V0ZWQtZmlsdGVyc10nKS5sZW5ndGgpe1xuICAgICAgZmFjZXRlZEZpbHRlcmluZy5pbml0KCk7XG4gICAgfVxuXG4gICAgJCgnI3NvcnQtYnknKS52YWwoJCgnI3NvcnQtYnknKS5kYXRhKCdkZWZhdWx0LXNvcnQnKSk7XG5cbiAgICAkKCdib2R5JylcbiAgICAgIC5vbignY2hhbmdlJywgJyNzb3J0LWJ5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IHNvcnRWYWx1ZSA9ICQoJyNzb3J0LWJ5JykudmFsKCk7XG4gICAgICAgIGxldCBuZXdRdWVyeTtcblxuICAgICAgICBpZiAobG9jYXRpb24uc2VhcmNoLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRRdWVyeUFycmF5ID0gbG9jYXRpb24uc2VhcmNoLnJlcGxhY2UoJz8nLCAnJykuc3BsaXQoJyYnKTtcbiAgICAgICAgICBjb25zdCBuZXdRdWVyeUFycmF5ID0gW107XG5cbiAgICAgICAgICBpZiAoIWxvY2F0aW9uLnNlYXJjaC5pbmNsdWRlcygnc29ydF9ieScpKSB7XG4gICAgICAgICAgICBuZXdRdWVyeUFycmF5LnB1c2goYHNvcnRfYnk9JHtzb3J0VmFsdWV9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3VycmVudFF1ZXJ5QXJyYXkuZm9yRWFjaChxdWVyeSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzcGxpdFF1ZXJ5ID0gcXVlcnkuc3BsaXQoJz0nKTtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5S2V5ID0gc3BsaXRRdWVyeVswXTtcbiAgICAgICAgICAgIGxldCBxdWVyeVZhbHVlID0gc3BsaXRRdWVyeVsxXTtcblxuICAgICAgICAgICAgaWYgKHF1ZXJ5S2V5ID09PSAnc29ydF9ieScpIHtcbiAgICAgICAgICAgICAgcXVlcnlWYWx1ZSA9IHNvcnRWYWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV3UXVlcnlBcnJheS5wdXNoKGAke3F1ZXJ5S2V5fT0ke3F1ZXJ5VmFsdWV9YCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBuZXdRdWVyeSA9IG5ld1F1ZXJ5QXJyYXkuam9pbignJicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1F1ZXJ5ID0gYHNvcnRfYnk9JHtzb3J0VmFsdWV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IGA/JHtuZXdRdWVyeX1gO1xuICAgIH0pO1xuXG4gICAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5jb2xsZWN0aW9uX3NlY29uZGFyeV9pbWFnZSkge1xuICAgICAgd2luZG93LmNvbGxlY3Rpb24uc2hvd1NlY29uZGFyeUltYWdlKCk7XG4gICAgfVxuICB9LFxuICBzaG93U2Vjb25kYXJ5SW1hZ2U6IGZ1bmN0aW9uKCl7XG4gICAgLy8gV2lsbCBiZSBlbmFibGVkIG9uIG5vbi10b3VjaCBkZXZpY2VzIGFuZCBzY3JlZW4gc2l6ZXMgbGFyZ2VyIHRoYW4gOTYwcHhcbiAgICBpZiAoIXdpbmRvdy5QWFVUaGVtZS5kZXZpY2UuaGFzVG91Y2gubWF0Y2hlcyAmJiB3aW5kb3cuUFhVVGhlbWUubWVkaWFfcXVlcmllcy5sYXJnZXIubWF0Y2hlcykge1xuXG4gICAgICAvLyBMb2FkIFBseXIgZm9yIHZpZGVvcyBhcyBzZWNvbmRhcnkgbWVkaWFcbiAgICAgIHZhciBzZWNvbmRhcnlNZWRpYVZpZGVvcztcbiAgICAgIHNlY29uZGFyeU1lZGlhVmlkZW9zID0gJCgnLnRodW1ibmFpbCcpLmZpbmQoJ1tkYXRhLWh0bWw1LXZpZGVvXSB2aWRlbywgW2RhdGEteW91dHViZS12aWRlb10nKS5nZXQoKTtcblxuICAgICAgLy8gSWYgcmVjb21tZW5kZWQgcHJvZHVjdHMgYXZhaWxhYmxlLCBjaGVjayBmb3IgZGF0YS1wbHlyLWxvYWRlZCBhdHRyaWJ1dGVcbiAgICAgIHZhciBwbHlyTG9hZGVkID0gJCgnLnNob3BpZnktc2VjdGlvbi0tcmVjb21tZW5kZWQtcHJvZHVjdHMnKS5maW5kKCcucHJvZHVjdHMnKS5kYXRhKCdwbHlyLWxvYWRlZCcpO1xuXG4gICAgICBsZXQgZ2FsbGVyeU9iamVjdCA9IG51bGw7XG4gICAgICBsZXQgc2hvd1NlY29uZGFyeU1lZGlhID0gdHJ1ZTtcblxuICAgICAgaWYgKCFwbHlyTG9hZGVkKSB7XG4gICAgICAgI
1HdpbmRvdy5wcm9kdWN0LmxvYWRQbHlyKGdhbGxlcnlPYmplY3QsIHNlY29uZGFyeU1lZGlhVmlkZW9zLCBzaG93U2Vjb25kYXJ5TWVkaWEpO1xuICAgICAgfVxuXG4gICAgICAkKCcuaGFzLXNlY29uZGFyeS1tZWRpYS1zd2FwJykub2ZmKCkub24oJ21vdXNlZW50ZXInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgJCh0aGlzKS5maW5kKCcuaW1hZ2UtZWxlbWVudF9fd3JhcCBpbWcnKS50b2dnbGVDbGFzcygnc2Vjb25kYXJ5LW1lZGlhLWhpZGRlbicpO1xuICAgICAgICAkKHRoaXMpLmZpbmQoJ1tkYXRhLWh0bWw1LXZpZGVvXScpLnRvZ2dsZUNsYXNzKCdzZWNvbmRhcnktbWVkaWEtaGlkZGVuJyk7XG4gICAgICAgICQodGhpcykuZmluZCgnLmV4dGVybmFsLXZpZGVvX19jb250YWluZXInKS50b2dnbGVDbGFzcygnc2Vjb25kYXJ5LW1lZGlhLWhpZGRlbicpO1xuICAgICAgICB3aW5kb3cucHJvZHVjdC5lbmFibGVWaWRlb09uSG92ZXIoJCh0aGlzKSk7XG4gICAgICB9KTtcblxuICAgICAgJCgnLmhhcy1zZWNvbmRhcnktbWVkaWEtc3dhcCcpLm9uKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICQodGhpcykuZmluZCgnLmltYWdlLWVsZW1lbnRfX3dyYXAgaW1nJykudG9nZ2xlQ2xhc3MoJ3NlY29uZGFyeS1tZWRpYS1oaWRkZW4nKTtcbiAgICAgICAgJCh0aGlzKS5maW5kKCdbZGF0YS1odG1sNS12aWRlb10nKS50b2dnbGVDbGFzcygnc2Vjb25kYXJ5LW1lZGlhLWhpZGRlbicpO1xuICAgICAgICAkKHRoaXMpLmZpbmQoJy5leHRlcm5hbC12aWRlb19fY29udGFpbmVyJykudG9nZ2xlQ2xhc3MoJ3NlY29uZGFyeS1tZWRpYS1oaWRkZW4nKTtcbiAgICAgICAgd2luZG93LnByb2R1Y3QuZGlzYWJsZVZpZGVvT25Ib3ZlcigkKHRoaXMpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgdW5sb2FkOiBmdW5jdGlvbigkdGFyZ2V0KXtcbiAgICAkdGFyZ2V0LmZpbmQoJy50aHVtYm5haWwnKS5vZmYoJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScpO1xuICAgICQoJ2JvZHknKS5vZmYoJ2NoYW5nZScsICcjc29ydC1ieScpO1xuICAgICR0YXJnZXQuZmluZCgnLnF1aWNrX3Nob3AsIC5xdWlja19zaG9wLS1saXN0Jykub2ZmKCdjbGljay5mYicpO1xuICAgICR0YXJnZXQuZmluZCgnW2RhdGEtZmlsdGVyLW1vZGFsLW9wZW5dJykub2ZmKCdjbGljaycpO1xuICAgICQod2luZG93KS5vZmYoJ3Jlc2l6ZS5maWx0ZXJpbmcnKTtcbiAgfVxufVxuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgRmFjZXRlZCBGaWx0ZXJpbmdcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbnZhciBmYWNldGVkRmlsdGVyaW5nID0ge1xuICBpbml0OiBmdW5jdGlvbigpe1xuICAgIGNvbnN0IGZpbHRlclJhbmdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZmlsdGVyLXJhbmdlXScpO1xuICAgIGNvbnN0IGZpbHRlckNoZWNrYm94ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1maWx0ZXItaW5wdXRdJyk7XG5cbiAgICBjb25zdCByYW5nZU5hbWVzID0gW107XG5cbiAgICBmaWx0ZXJDaGVja2JveGVzLmZvckVhY2goZnVuY3Rpb24oY2hlY2tib3gpIHtcbiAgICAgICQoY2hlY2tib3gpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBlLmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgIGlmICh0YXJnZXQuaGFzQXR0cmlidXRlKCdkYXRhLWRpc2FibGVkJykpIHJldHVybjtcbiAgICAgICAgLy8gVG9nZ2xlIGNoZWNrZWQgc3RhdGVcbiAgICAgICAgdGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZpbHRlci1jaGVja2JveF0nKS50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtZmlsdGVyLWNoZWNrZWQnKTtcblxuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB0YXJnZXQuZGF0YXNldC51cmw7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qIEZvciByYW5nZSBpbnB1dCAqL1xuICAgIGZpbHRlclJhbmdlLmZvckVhY2goZnVuY3Rpb24oZmlsdGVyKSB7XG4gICAgICByYW5nZU5hbWVzLnB1c2goZmlsdGVyLm5hbWUpO1xuICAgIH0pO1xuXG4gICAgJCgnW2RhdGEtcmFuZ2UtZmlsdGVyLWJ1dHRvbl0nKS5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICBmYWNldGVkRmlsdGVyaW5nLmdldEZpbHRlcmVkUmVzdWx0cyhlLmN1cnJlbnRUYXJnZXQsIHJhbmdlTmFtZXMpO1xuICAgIH0pO1xuXG4gICAgJCgnW2RhdGEtZmlsdGVyLW1vZGFsLW9wZW5dJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgJC5mYW5jeWJveC5vcGVuKCQoJ1tkYXRhLWZpbHRlci1tb2RhbF0nKSwge1xuICAgICAgICBiYXNlQ2xhc3M6ICdmYWNldGVkLWZpbHRlci1tb2RhbCcsXG4gICAgICAgIGhhc2g6IGZhbHNlLFxuICAgICAgICBpbmZvYmFyIDogZmFsc2UsXG4gICAgICAgIHRvb2xiYXI6IGZhbHNlLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBzbWFsbEJ0biA6IHRydWUsXG4gICAgICAgIHRvdWNoOiBmYWxzZSxcbiAgICAgICAgbW9iaWxlOiB7XG4gICAgICAgICAgcHJldmVudENhcHRpb25PdmVybGFwOiBmYWxzZSxcbiAgICAgICAgICB0b29sYmFyOiB0cnVlLFxuICAgICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgIFwiY2xvc2VcIlxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgYWZ0ZXJTaG93OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAkKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuYWRkQ2xhc3MoJ3Njcm9sbC1sb2NrZWQnKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWZ0ZXJDbG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgJChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLnJlbW92ZUNsYXNzKCdzY3JvbGwtbG9ja2VkJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgJCh3aW5kb3cpLm9uKCdyZXNpemUuZmlsdGVyaW5nJywgZnVuY3Rpb24oZSkge1xuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoID49IDc5OSkge1xuICAgICAgICAkKCdbZGF0YS1maWx0ZXItbW9kYWxdJykucmVtb3ZlQXR0cignc3R5bGUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgZ2V0RmlsdGVyZWRSZXN1bHRzOiBmdW5jdGlvbihlbGVtZW50LCByYW5nZU5hbWVzKSB7XG4gICAgbGV0IHNlYXJjaFBhcmFtZXRlcnM7XG4gICAgY29uc3QgY3VycmVudFNlYXJjaCA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gucmVwbGFjZSgnPycsICcnKTtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50LmNsb3Nlc3QoJ2Zvcm0nKSk7XG4gICAgY29uc3QgbmV3U2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhmb3JtRGF0YSkudG9TdHJpbmc
1oKTtcblxuICAgIC8vIEZpbHRlciB0aHJvdWdoIGN1cnJlbnQgc2VhcmNoIHN0cmluZyB0byBzZWUgaWYgcHJpY2UgcmFuZ2UgaW5wdXQgYWxyZWFkeSBleGlzdHMsXG4gICAgLy8gaWYgaXQgZG9lcywgY3JlYXRlIG5ldyBzdHJpbmcgd2l0aG91dCBjdXJyZW50IHByaWNlIHJhbmdlIHBhcmFtZXRlcnNcbiAgICBjb25zdCBzcGxpdEN1cnJlbnRTZWFyY2ggPSBjdXJyZW50U2VhcmNoLnNwbGl0KCcmJyk7XG4gICAgbGV0IGZpbHRlcmVkQ3VycmVudFNlYXJjaCA9IHNwbGl0Q3VycmVudFNlYXJjaC5maWx0ZXIoc2VhcmNoID0+IHtcbiAgICAgIGlmIChzZWFyY2guaW5jbHVkZXMocmFuZ2VOYW1lc1swXSkgfHwgc2VhcmNoLmluY2x1ZGVzKHJhbmdlTmFtZXNbMV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBmaWx0ZXJlZEN1cnJlbnRTZWFyY2ggPSBmaWx0ZXJlZEN1cnJlbnRTZWFyY2guam9pbignJicpO1xuXG4gICAgLy8gSWYgY3VycmVudCBzZWFyY2ggcGFyYW1ldGVycyBleGlzdCwgYXBwZW5kIG5ldyBzZWFyY2ggcGFyYW1ldGVyc1xuICAgIC8vIG9uIHRvIGV4aXN0aW5nIHBhcmFtZXRlcnNcbiAgICBpZiAoZmlsdGVyZWRDdXJyZW50U2VhcmNoLmxlbmd0aCA+IDApIHtcbiAgICAgIHNlYXJjaFBhcmFtZXRlcnMgPSBgJHtmaWx0ZXJlZEN1cnJlbnRTZWFyY2h9JiR7bmV3U2VhcmNofWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlYXJjaFBhcmFtZXRlcnMgPSBgJHtuZXdTZWFyY2h9YDtcbiAgICB9XG5cbiAgICBsZXQgdXJsUXVlcnlTdHJpbmcgPSAnJztcblxuICAgIGlmIChzZWFyY2hQYXJhbWV0ZXJzKSB7XG4gICAgICB1cmxRdWVyeVN0cmluZyA9IGA/JHtzZWFyY2hQYXJhbWV0ZXJzfWA7XG4gICAgfSBlbHNlIGlmIChzZWFyY2hQYXJhbWV0ZXJzKSB7XG4gICAgICB1cmxRdWVyeVN0cmluZyA9IGA/JHtzZWFyY2hQYXJhbWV0ZXJzfWA7XG4gICAgfVxuXG4gICAgd2luZG93LmxvY2F0aW9uLnNlYXJjaCA9IHVybFF1ZXJ5U3RyaW5nO1xuICB9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBNYXBcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbndpbmRvdy5tYXAgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKCl7XG4gICAgaWYgKCQoXCIuc2hvcGlmeS1zZWN0aW9uLS1tYXAgLm1hcCwgLnNob3BpZnktc2VjdGlvbi0tcGFnZS1jb250YWN0LXRlbXBsYXRlIC5tYXBcIikuaGFzQ2xhc3MoJ2pzLWFwaS1tYXAnKSkge1xuICAgICAgdmFyIG1hcHNUb0xvYWQgPSBbXTtcblxuICAgICAgLy9DcmVhdGUgbWFwIHNldHRpbmdzIGFycmF5XG4gICAgICAkKCcubWFwJykuZWFjaChmdW5jdGlvbihpLCBvYmopIHtcbiAgICAgICAgbWFwc1RvTG9hZC5wdXNoKHRoaXMpO1xuICAgICAgICBtYXBzVG9Mb2FkW2ldLnNlY3Rpb25pZCA9ICQodGhpcykuZGF0YSgnaWQnKTtcbiAgICAgICAgbWFwc1RvTG9hZFtpXS5hZGRyZXNzID0gJCh0aGlzKS5kYXRhKCdhZGRyZXNzJyk7XG4gICAgICAgIG1hcHNUb0xvYWRbaV0uZGlyZWN0aW9ucyA9ICQodGhpcykuZGF0YSgnZGlyZWN0aW9ucy1hZGRyZXNzJyk7XG4gICAgICAgIG1hcHNUb0xvYWRbaV0uem9vbSA9ICQodGhpcykuZGF0YSgnem9vbScpO1xuICAgICAgICBtYXBzVG9Mb2FkW2ldLm1hcHN0eWxlID0gJCh0aGlzKS5kYXRhKCdzdHlsZScpO1xuICAgICAgICBtYXBzVG9Mb2FkW2ldLnNob3dwaW4gPSAkKHRoaXMpLmRhdGEoJ3BpbicpO1xuICAgICAgICBtYXBzVG9Mb2FkW2ldLmFwaWtleSA9ICQodGhpcykuZGF0YSgnYXBpLWtleScpO1xuICAgICAgfSk7XG5cbiAgICAgICQuZWFjaChtYXBzVG9Mb2FkLCBmdW5jdGlvbihpLCBpbnN0YW5jZSkge1xuXG4gICAgICAgIC8vRW5hYmxlIGNhY2hpbmcgdG8gYXZvaWQgZHVwbGljYXRlIGdvb2dsZSBtYXBzIGZpbGVzXG4gICAgICAgICQuYWpheFNldHVwKHsgY2FjaGU6IHRydWUgfSk7XG5cbiAgICAgICAgLy9Mb2FkIG1hcHMgc2NyaXB0IGFuZCBmaW5kIGxvY2F0aW9uIGNvb3JkaW5hdGVzXG4gICAgICAgICQuZ2V0U2NyaXB0KCdodHRwczovL21hcHMuZ29vZ2xlYXBpcy5jb20vbWFwcy9hcGkvanM/a2V5PScgKyBtYXBzVG9Mb2FkW2ldLmFwaWtleSkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICB3aW5kb3cubWFwLmZpbmRMb2NhdGlvbihtYXBzVG9Mb2FkW2ldKTtcbiAgICAgICAgICAkLmFqYXhTZXR1cCh7IGNhY2hlOiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgZmluZExvY2F0aW9uOmZ1bmN0aW9uKG1hcEFycmF5KSB7XG4gICAgdmFyIGdlb0xhdDtcbiAgICB2YXIgZ2VvTG5nO1xuICAgIHZhciBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xuXG4gICAgLy9GaW5kIGFuZCBzZXQgY29vcmRpbmF0ZXNcbiAgICBnZW9jb2Rlci5nZW9jb2RlKCB7ICdhZGRyZXNzJzogbWFwQXJyYXkuYWRkcmVzcyB9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpIHtcbiAgICAgIGlmIChzdGF0dXMgPT0gZ29vZ2xlLm1hcHMuR2VvY29kZXJTdGF0dXMuT0spIHtcblxuICAgICAgICBnZW9MYXQgPSByZXN1bHRzWzBdLmdlb21ldHJ5LmxvY2F0aW9uLmxhdCgpO1xuICAgICAgICBnZW9MbmcgPSByZXN1bHRzWzBdLmdlb21ldHJ5LmxvY2F0aW9uLmxuZygpO1xuXG4gICAgICAgIC8vQ3JlYXRlIG1hcFxuICAgICAgICB3aW5kb3cubWFwLmluaXRNYXAoZ2VvTGF0LCBnZW9MbmcsIG1hcEFycmF5KTtcblxuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIGluaXRNYXA6ZnVuY3Rpb24obGF0LGxuZywgbWFwQXJyYXkpIHtcblxuICAgIHZhciBsb2NhdGlvbiA9IHtsYXQ6IGxhdCwgbG5nOiBsbmd9O1xuICAgIHZhciBzdHlsZUpzb24gPSBbXTtcblxuICAgIC8vU2V0IHN0eWxlIEpTT05cbiAgICBpZiggbWFwQXJyYXkubWFwc3R5bGUgPT0gJ2F1YmVyZ2luZScpIHtcbiAgICAgIHN0eWxlSnNvbiA9IFt7XCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMxZDJjNGRcIn1dfSx7XCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzhlYzNiOVwifV19LHtcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMxYTM2NDZcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwiYWRtaW5pc3RyYXRpdmUuY291bnRyeVwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5LnN0cm9rZVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzRiNjg3OFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJhZG1pbmlzdHJhdGl2ZS5sYW5kX3BhcmNlbFwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM2NDc3OWVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwiYWRtaW5pc3RyYXRpdmUucHJvdmluY2VcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM0YjY4NzhcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwibGFuZHNjYXBlLm1hbl9tYWRlXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnkuc3Ryb2tlXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjMzM0ZTg3XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcImxhbmRzY2FwZS5uYXR1cmFsXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMwMjNlNThcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicG9pXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMyODNkNmFcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicG9pXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzZmOWJhNVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJwb2lcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMxZDJjNGRcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicG9pLnBhcmtcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjMDIzZTU4XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInBvaS5wYXJrXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzNDNzY4MFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMzMDRhN2RcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicm9hZFwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM5OGE1YmVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicm9hZFwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LnN0cm9rZVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzFkMmM0ZFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXlcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzJjNjY3NVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXlcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMyNTU3NjNcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicm9hZC5
1oaWdod2F5XCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2IwZDVjZVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXlcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMwMjNlNThcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwidHJhbnNpdFwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM5OGE1YmVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwidHJhbnNpdFwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LnN0cm9rZVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzFkMmM0ZFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJ0cmFuc2l0LmxpbmVcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjMjgzZDZhXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInRyYW5zaXQuc3RhdGlvblwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjM2E0NzYyXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcIndhdGVyXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMwZTE2MjZcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwid2F0ZXJcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjNGU2ZDcwXCJ9XX1dO1xuICAgIH0gZWxzZSBpZihtYXBBcnJheS5tYXBzdHlsZSA9PSAncmV0cm8nKSB7XG4gICAgICBzdHlsZUpzb24gPSBbe1wiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZWJlM2NkXCJ9XX0se1wiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM1MjM3MzVcIn1dfSx7XCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuc3Ryb2tlXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZjVmMWU2XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcImFkbWluaXN0cmF0aXZlXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnkuc3Ryb2tlXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjYzliMmE2XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcImFkbWluaXN0cmF0aXZlLmxhbmRfcGFyY2VsXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnkuc3Ryb2tlXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZGNkMmJlXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcImFkbWluaXN0cmF0aXZlLmxhbmRfcGFyY2VsXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2FlOWU5MFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJsYW5kc2NhcGUubmF0dXJhbFwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZGZkMmFlXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInBvaVwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZGZkMmFlXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInBvaVwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM5MzgxN2NcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicG9pLnBhcmtcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjYTViMDc2XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInBvaS5wYXJrXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzQ0NzUzMFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNmNWYxZTZcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicm9hZC5hcnRlcmlhbFwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZmRmY2Y4XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInJvYWQuaGlnaHdheVwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZjhjOTY3XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInJvYWQuaGlnaHdheVwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5LnN0cm9rZVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2U5YmM2MlwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXkuY29udHJvbGxlZF9hY2Nlc3NcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2U5OGQ1OFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXkuY29udHJvbGxlZF9hY2Nlc3NcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNkYjg1NTVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicm9hZC5sb2NhbFwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM4MDZiNjNcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwidHJhbnNpdC5saW5lXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNkZmQyYWVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwidHJhbnNpdC5saW5lXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzhmN2Q3N1wifV19LHtcImZlYXR1cmVUeXBlXCI6XCJ0cmFuc2l0LmxpbmVcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNlYmUzY2RcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwidHJhbnNpdC5zdGF0aW9uXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNkZmQyYWVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwid2F0ZXJcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjYjlkM2MyXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcIndhdGVyXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzkyOTk4ZFwifV19XTtcbiAgICB9IGVsc2UgaWYobWFwQXJyYXkubWFwc3R5bGUgPT0gJ3NpbHZlcicpIHtcbiAgICAgIHN0eWxlSnNvbiA9IFt7XCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNmNWY1ZjVcIn1dfSx7XCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLmljb25cIixcInN0eWxlcnNcIjpbe1widmlzaWJpbGl0eVwiOlwib2ZmXCJ9XX0se1wiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM2MTYxNjFcIn1dfSx7XCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuc3Ryb2tlXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZjVmNWY1XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcImFkbWluaXN0cmF0aXZlLmxhbmRfcGFyY2VsXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2JkYmRiZFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJwb2lcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2VlZWVlZVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJwb2lcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjNzU3NTc1XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInBvaS5wYXJrXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNlNWU1ZTVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicG9pLnBhcmtcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjOWU5ZTllXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInJvYWRcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2ZmZmZmZlwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmFydGVyaWFsXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzc1NzU3NVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXlcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2RhZGFkYVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXlcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjNjE2MTYxXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInJvYWQubG9jYWxcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjOWU5ZTllXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInRyYW5zaXQubGluZVwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZTVlNWU1XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInRyYW5zaXQuc3RhdGlvblwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZWVlZWVlXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcIndhdGVyXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNjOWM5YzlcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwid2F0ZXJcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjOWU5ZTllXCJ9XX1dO1xuICAgIH0gZWxzZSBpZihtYXBBcnJheS5tYXBzdHlsZSA9PSAnbmlnaHQnKSB7XG4gICAgICBzdHlsZUpzb24gPSAgW3tcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzI0MmYzZVwifV19LHtcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjNzQ2ODU1XCJ9XX0se1wiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LnN0cm9rZVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzI0MmYzZVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJhZG1pbmlzdHJhdGl2ZS5sb2NhbGl0eVwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNkNTk1NjNcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicG9pXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2Q1OTU2M1wifV19LHtcImZlYXR1cmVUeXBlXCI6XCJwb2kucGFya1wiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjMjYzYzNmXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInBvaS5wYXJrXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzZiOWE3NlwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMzODQxNGVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicm9hZFwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5LnN0cm9rZVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzIxMmEzN1wifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzljYTViM1wifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXlcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzc0Njg1NVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXlcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMxZjI4MzVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicm9hZC5
1oaWdod2F5XCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2YzZDE5Y1wifV19LHtcImZlYXR1cmVUeXBlXCI6XCJ0cmFuc2l0XCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMyZjM5NDhcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwidHJhbnNpdC5zdGF0aW9uXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2Q1OTU2M1wifV19LHtcImZlYXR1cmVUeXBlXCI6XCJ3YXRlclwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjMTcyNjNjXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcIndhdGVyXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzUxNWM2ZFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJ3YXRlclwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LnN0cm9rZVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzE3MjYzY1wifV19XTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGVKc29uID0gW107XG4gICAgfVxuXG4gICAgLy9DcmVhdGUgZ29vZ2xlIG1hcHMgbGlua1xuICAgICQoJy5qcy1tYXAtbGluaycpLmF0dHIoJ2hyZWYnLCAnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9tYXBzL3BsYWNlLycgKyBtYXBBcnJheS5kaXJlY3Rpb25zICsgJy9AJyArIGxhdCArICcsJyArIGxuZyApO1xuXG4gICAgLy9TZXQgbWFwIG9wdGlvbnNcbiAgICB2YXIgbWFwT3B0aW9ucyA9IHtcbiAgICAgIHpvb206IG1hcEFycmF5Lnpvb20sXG4gICAgICBjZW50ZXI6IGxvY2F0aW9uLFxuICAgICAgc3R5bGVzOiBzdHlsZUpzb24sXG4gICAgICBkaXNhYmxlRGVmYXVsdFVJOiBmYWxzZVxuICAgIH07XG5cbiAgICAvL0NyZWF0ZSBtYXBcbiAgICB2YXIgbWFwID0gbmV3IGdvb2dsZS5tYXBzLk1hcChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtYXBBcnJheS5zZWN0aW9uaWQpLCBtYXBPcHRpb25zKTtcblxuICAgIC8vU2hvdyBwaW5cbiAgICBpZihtYXBBcnJheS5zaG93cGluID09IHRydWUpIHtcbiAgICAgIHZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHtcbiAgICAgICAgcG9zaXRpb246IGxvY2F0aW9uLFxuICAgICAgICBtYXA6IG1hcFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBCbG9nc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxud2luZG93LmJsb2dzID0ge1xuICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICAkKCdib2R5JylcbiAgICAgIC5vbignY2hhbmdlJywgJyN0YWdfZmlsdGVyJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gJCgnI3RhZ19maWx0ZXInKS52YWwoKTtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lID0gZmlsdGVyVmFsdWU7XG4gICAgfSk7XG4gIH0sXG4gIHVubG9hZDogZnVuY3Rpb24oKSB7XG4gICAgJCgnYm9keScpLm9mZignY2hhbmdlJywgJyN0YWdfZmlsdGVyJyk7XG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIEFydGljbGVcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbndpbmRvdy5hcnRpY2xlID0ge1xuICBpbml0OiBmdW5jdGlvbigpe1xuICAgIHdpbmRvdy5iYW5uZXJfaW1hZ2UuaW5pdCgpO1xuICAgIHdpbmRvdy5iYW5uZXIuaW5pdCgpO1xuICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5pbmRleE9mKCcvY29tbWVudHMnKSAhPSAtMSkge1xuICAgICAgJCgnaHRtbCxib2R5JykuYW5pbWF0ZSh7c2Nyb2xsVG9wOiAkKFwiI25ldy1jb21tZW50XCIpLm9mZnNldCgpLnRvcC0xNDB9LCdzbG93Jyk7XG4gICAgfVxuICB9LFxuICB1bmxvYWQ6IGZ1bmN0aW9uKCR0YXJnZXQpe1xuICB9XG59XG5cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFV0aWxpdGllc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxudmFyIHBseXJVdGlscyA9IHtcbiAgcGxheUJ1dHRvbkljb246JzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicGx5cl9fY29udHJvbCBwbHlyX19jb250cm9sLS1vdmVybGFpZFwiIGFyaWEtbGFiZWw9XCJQbGF5LCB7dGl0bGV9XCIgZGF0YS1wbHlyPVwicGxheVwiPjxzdmcgY2xhc3M9XCJwbGF5LWljb24tYnV0dG9uLWNvbnRyb2xcIiB3aWR0aD1cIjYwXCIgaGVpZ2h0PVwiNjBcIiB2aWV3Qm94PVwiMCAwIDYwIDYwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHJlY3Qgd2lkdGg9XCI2MFwiIGhlaWdodD1cIjYwXCIgZmlsbD1cIndoaXRlXCIvPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0yMyAyMFY0MEwzOSAyOS40MjQ4TDIzIDIwWlwiIGZpbGw9XCIjMzIzMjMyXCIvPjwvc3ZnPjxzcGFuIGNsYXNzPVwicGx5cl9fc3Itb25seVwiPlBsYXk8L3NwYW4+PC9idXR0b24+JyxcbiAgcGxheUJ1dHRvbjogJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicGx5cl9fY29udHJvbHNfX2l0ZW0gcGx5cl9fY29udHJvbFwiIGFyaWEtbGFiZWw9XCJQbGF5LCB7dGl0bGV9XCIgZGF0YS1wbHlyPVwicGxheVwiPjxzdmcgY2xhc3M9XCJpY29uLS1wcmVzc2VkXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjx1c2UgeGxpbms6aHJlZj1cIiNwbHlyLXBhdXNlXCI+PC91c2U+PC9zdmc+PHN2ZyBjbGFzcz1cImljb24tLW5vdC1wcmVzc2VkXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjx1c2UgeGxpbms6aHJlZj1cIiNwbHlyLXBsYXlcIj48L3VzZT48L3N2Zz48c3BhbiBjbGFzcz1cImxhYmVsLS1wcmVzc2VkIHBseXJfX3Rvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPlBhdXNlPC9zcGFuPjxzcGFuIGNsYXNzPVwibGFiZWwtLW5vdC1wcmVzc2VkIHBseXJfX3Rvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPlBsYXk8L3NwYW4+PC9idXR0b24+JyxcbiAgbXV0ZUJ1dHRvbjogJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicGx5cl9fY29udHJvbHNfX2l0ZW0gcGx5cl9fY29udHJvbFwiIGFyaWEtbGFiZWw9XCJNdXRlXCIgZGF0YS1wbHlyPVwibXV0ZVwiPjxzdmcgY2xhc3M9XCJpY29uLS1wcmVzc2VkXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjx1c2UgeGxpbms6aHJlZj1cIiNwbHlyLW11dGVkXCI+P
1C91c2U+PC9zdmc+PHN2ZyBjbGFzcz1cImljb24tLW5vdC1wcmVzc2VkXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjx1c2UgeGxpbms6aHJlZj1cIiNwbHlyLXZvbHVtZVwiPjwvdXNlPjwvc3ZnPjxzcGFuIGNsYXNzPVwibGFiZWwtLXByZXNzZWQgcGx5cl9fdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+VW5tdXRlPC9zcGFuPjxzcGFuIGNsYXNzPVwibGFiZWwtLW5vdC1wcmVzc2VkIHBseXJfX3Rvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPk11dGU8L3NwYW4+PC9idXR0b24+JyxcbiAgcHJvZ3Jlc3NJbnB1dDogJzxkaXYgY2xhc3M9XCJwbHlyX19jb250cm9sc19faXRlbSBwbHlyX19wcm9ncmVzc19fY29udGFpbmVyXCI+PGRpdiBjbGFzcz1cInBseXJfX3Byb2dyZXNzXCI+PGlucHV0IGRhdGEtcGx5cj1cInNlZWtcIiB0eXBlPVwicmFuZ2VcIiBtaW49XCIwXCIgbWF4PVwiMTAwXCIgc3RlcD1cIjAuMDFcIiB2YWx1ZT1cIjBcIiBhcmlhLWxhYmVsPVwiU2Vla1wiPjxwcm9ncmVzcyBjbGFzcz1cInBseXJfX3Byb2dyZXNzX19idWZmZXJcIiBtaW49XCIwXCIgbWF4PVwiMTAwXCIgdmFsdWU9XCIwXCI+JSBidWZmZXJlZDwvcHJvZ3Jlc3M+PHNwYW4gcm9sZT1cInRvb2x0aXBcIiBjbGFzcz1cInBseXJfX3Rvb2x0aXBcIj4wMDowMDwvc3Bhbj48L2Rpdj48L2Rpdj4nLFxuICB2b2x1bWU6ICc8ZGl2IGNsYXNzPVwicGx5cl9fY29udHJvbHNfX2l0ZW0gcGx5cl9fdm9sdW1lXCI+PGlucHV0IGRhdGEtcGx5cj1cInZvbHVtZVwiIHR5cGU9XCJyYW5nZVwiIG1pbj1cIjBcIiBtYXg9XCIxXCIgc3RlcD1cIjAuMDVcIiB2YWx1ZT1cIjFcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBhcmlhLWxhYmVsPVwiVm9sdW1lXCI+PC9kaXY+JyxcbiAgZnVsbHNjcmVlbjogJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicGx5cl9fY29udHJvbHNfX2l0ZW0gcGx5cl9fY29udHJvbFwiIGRhdGEtcGx5cj1cImZ1bGxzY3JlZW5cIj48c3ZnIGNsYXNzPVwiaWNvbi0tcHJlc3NlZFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj48dXNlIHhsaW5rOmhyZWY9XCIjcGx5ci1leGl0LWZ1bGxzY3JlZW5cIj48L3VzZT48L3N2Zz48c3ZnIGNsYXNzPVwiaWNvbi0tbm90LXByZXNzZWRcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+PHVzZSB4bGluazpocmVmPVwiI3BseXItZW50ZXItZnVsbHNjcmVlblwiPjwvdXNlPjwvc3ZnPjxzcGFuIGNsYXNzPVwibGFiZWwtLXByZXNzZWQgcGx5cl9fdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+RXhpdCBmdWxsc2NyZWVuPC9zcGFuPjxzcGFuIGNsYXNzPVwibGFiZWwtLW5vdC1wcmVzc2VkIHBseXJfX3Rvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPkVudGVyIGZ1bGxzY3JlZW48L3NwYW4+PC9idXR0b24+J1xufVxuXG52YXIgY29udHJvbHMgPSBwbHlyVXRpbHMucGxheUJ1dHRvbkljb24gKyAnPGRpdiBjbGFzcz1cInBseXJfX2NvbnRyb2xzXCI+JyArIHBseXJVdGlscy5wbGF5QnV0dG9uICsgcGx5clV0aWxzLnByb2dyZXNzSW5wdXQgKyBwbHlyVXRpbHMubXV0ZUJ1dHRvbiArIHBseXJVdGlscy52b2x1bWUgKyBwbHlyVXRpbHMuZnVsbHNjcmVlbiArICc8L2Rpdic7XG5cbnZhciBnbG9iYWxQbGF5ZXJzQXJyYXkgPSBbXTtcbnZhciBzZWNvbmRhcnlNZWRpYVBsYXllcnM7XG5cbnZhciB1dGlsaXRpZXMgPSB7XG4gIGxpc3RlbkZvclJlc2l6ZTogZnVuY3Rpb24oKSB7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb3JpZW50YXRpb25jaGFuZ2UnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LmJhbm5lci5pbml0KCk7XG4gICAgICB9LCAxMDApO1xuICAgIH0pO1xuXG4gICAgLy8gU2V0dXAgYSB0aW1lclxuICAgIHZhciByZXNpemVUaW1lb3V0O1xuXG4gICAgLy8gTGlzdGVuIGZvciByZXNpemUgZXZlbnRzXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cbiAgICAgIC8vIElmIHRpbWVyIGlzIG51bGwsIHJlc2V0IGl0IHRvIDY2bXMgYW5kIHJ1biB5b3VyIGZ1bmN0aW9ucy5cbiAgICAgIC8vIE90aGVyd2lzZSwgd2FpdCB1bnRpbCB0aW1lciBpcyBjbGVhcmVkXG4gICAgICBpZiAoICFyZXNpemVUaW1lb3V0ICkge1xuICAgICAgICByZXNpemVUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBSZXNldCB0aW1lb3V0XG4gICAgICAgICAgcmVzaXplVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgLy8gUnVuIG91ciByZXNpemUgZnVuY3Rpb25zXG4gICAgICAgICAgYW5ub3VuY2VtZW50X2Jhci5zZXRQYWRkaW5nKCk7XG4gICAgICAgICAgd2luZG93LmFuaW1hdGVfY29udGVudC5pbml0KCk7XG4gICAgICAgICAgd2luZG93LmhlYWRlci5zZXRIZWFkZXJQb3NpdGlvbigpO1xuICAgICAgICAgIHdpbmRvdy5iYW5uZXJfaW1hZ2UucmVzZXRQYWRkaW5nKCk7XG4gICAgICAgICAgd2luZG93LmJhbm5lcl9pbWFnZS5pbml0KCk7XG4gICAgICAgICAgd2luZG93LmJhbm5lci5pbml0KCk7XG4gICAgICAgICAgd2luZG93LmhlYWRlci5keW5hbWljRHJvcGRvd24oKTtcbiAgICAgICAgICB3aW5kb3cuaGVhZGVyLnNldFBhZGRpbmcoKTtcbiAgICAgICAgfSwgNjYpO1xuICAgICAgfVxuICAgIH0sIGZhbHNlKTtcbiAgfSxcbiAgbGF1bmNoVmlkZW9QbGF5ZXI6IGZ1bmN0aW9uKFBseXIsIGdhbGxlcnlPYmplY3QsIHZpZGVvcywgc2hvd1NlY29uZGFyeU1lZGlhKSB7XG5cbiAgICBpZiAoZ2FsbGVyeU9iamVjdCAhPSBudWxsKSB7XG4gICAgICBnYWxsZXJ5T2JqZWN0LnZpZGVvUGxheWVycyA9IFBseXIuc2V0dXAodmlkZW9zLCB7XG4gICAgICAgIGNvbnRyb2xzOiBjb250cm9scyxcbiAgICAgICAgZnVsbHNjcmVlbjoge1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgZmFsbGJhY2s6IHRydWUsXG4gICAgICAgICAgaW9zTmF0aXZlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHN0b3JhZ2U6IHtcbiAgICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gR29pbmcgdGhyb3VnaCBnYWxsZXJpZXMgYXJyYXkgYW5kIHB1c2hpbmcgcGxheWVycyBpbnRvIG1hc3RlciBhcnJheVxuICAgICAgJC5lYWNoKGdhbGxlcnlPYmplY3QudmlkZW9QbGF5ZXJzLCBmdW5jdGlvbihpbmRleCwgcGxheWVyKSB7XG4gICAgICAgIGdsb2JhbFBsYXllcnNBcnJheS5wdXNoKHBsYXllcik7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHNob3dTZWNvbmRhcnlNZWRpYSA9PSB0cnVlKSB7XG4gICAgICAvLyBDb2xsZWN0aW9uIHBhZ2UvUmVjb21tZW5kZWQgUHJvZHVjdHMgc2Vjb25kYXJ5IG1lZGlhXG4gICAgICBzZWNvbmRhcnlNZWRpYVBsYXllcnMgPSBQbHlyLnNldHVwKHZpZGVvcywge1xuICAgICAgICBjb250cm9sczogY29udHJvbHMsXG4gICAgICAgIGZ1bGxzY3JlZW46IHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGZhbGxiYWNrOiB0cnVlLFxuICAgICAgICAgIGlvc05hdGl2ZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBzdG9yYWdlOiB7XG4gICAgICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gQWRkIGRhdGEtYXR0cmlidXRlICdwbHlyLWxvYWRlZD1cInRydWVcIicgdG8gdmlkZW9zIGNvbnRhaW5lclxuICAgICAgJCgnLnNob3BpZnktc2VjdGlvbi0tcmVjb21tZW5kZWQtcHJvZHVjdHMnKS5maW5kKCcucHJvZHVjdHMnKS5hdHRyKCdkYXRhLXBseXItbG9hZGVkJywgJ3RydWUnKTtcblxuICAgICAgJC5lYWNoKHNlY29uZGFyeU1lZGlhUGxheWVycywgZnVuY3Rpb24oaW5kZXgsIHBsYXllcikge1xuICAgICAgICBnbG9iYWxQbGF5ZXJzQXJyYXkucHVzaChwbGF5ZXIpO1xuICAgICAgfSlcblxuICAgICAgLy8gQWRkcyBwbHlyIHZpZGVvIGlkIHRvIHZpZGVvIHdyYXBwZXJcbiAgICAgICQuZWFjaChnbG9iYWxQbGF5ZXJzQXJyYXksIGZ1bmN0aW9uKGluZGV4LCBwbGF5ZXIpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHBsYXllci5wcm92aWRlcjtcbiAgICAgICAgdmFyIGlkID0gcGxheWVyLmlkO1xuICAgICAgICB2Y
1XIgJHZpZGVvO1xuXG4gICAgICAgIGlmIChzb3VyY2UgPT0gJ2h0bWw1Jykge1xuICAgICAgICAgICR2aWRlbyA9ICQocGxheWVyLmVsZW1lbnRzLndyYXBwZXIpLmZpbmQoJ3ZpZGVvJyk7XG4gICAgICAgICAgJHZpZGVvLmF0dHIoJ2RhdGEtcGx5ci12aWRlby1pZCcsIGlkKTtcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHNlY29uZGFyeU1lZGlhUGxheWVycztcbiAgICB9XG4gIH0sXG4gIGVuYWJsZURpc2Nsb3N1cmU6IGZ1bmN0aW9uKCkge1xuXG4gICAgdmFyICRkaXNjbG9zdXJlID0gJCgnW2RhdGEtZGlzY2xvc3VyZV0nKTtcbiAgICB2YXIgJHRvZ2dsZSA9ICQoJ1tkYXRhLWRpc2Nsb3N1cmUtdG9nZ2xlXScpO1xuICAgIHZhciAkZGlzY2xvc3VyZVdyYXAgPSAkKCcuZGlzY2xvc3VyZV9fbGlzdC13cmFwJyk7XG5cbiAgICAvL0NoZWNrIGlmIGN1cnJlbnQgb3BlbmVkIG1lbnUgaXMgb2Zmc2NyZWVuXG4gICAgZnVuY3Rpb24gY2hlY2tPZmZTY3JlZW4oJG9wZW5lZFRvZ2dsZSkge1xuICAgICAgaWYoJG9wZW5lZFRvZ2dsZS5zaWJsaW5ncygnLmRpc2Nsb3N1cmVfX2xpc3Qtd3JhcCcpLmlzKCc6b2ZmLXJpZ2h0JykpIHtcbiAgICAgICAgJG9wZW5lZFRvZ2dsZS5zaWJsaW5ncygnLmRpc2Nsb3N1cmVfX2xpc3Qtd3JhcCcpLmFkZENsYXNzKCdkaXNjbG9zdXJlLS1sZWZ0Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvc2VEaXNjbG9zdXJlcyhpZ25vcmVUYXJnZXQsIGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgIGlmKGlnbm9yZVRhcmdldCA9PT0gdHJ1ZSkge1xuICAgICAgICAkdG9nZ2xlLm5vdChjdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcygnaXMtY2xpY2tlZCcpO1xuICAgICAgICAkdG9nZ2xlLm5vdChjdXJyZW50VGFyZ2V0KS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkdG9nZ2xlLnJlbW92ZUNsYXNzKCdpcy1jbGlja2VkJyk7XG4gICAgICAgICR0b2dnbGUuYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgICAgfVxuXG4gICAgICAkZGlzY2xvc3VyZVdyYXAucmVtb3ZlQ2xhc3MoJ2Rpc2Nsb3N1cmUtLWxlZnQnKTtcbiAgICB9XG5cbiAgICAvL0Nsb3NlIG1lbnVzIG9uIEVTQ1xuICAgICQoJ2JvZHknKS5vbigna2V5dXAnLCBmdW5jdGlvbihlKSB7XG4gICAgICBpZihlLndoaWNoID09ICcyNycpIHtcbiAgICAgICAgY2xvc2VEaXNjbG9zdXJlcygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy9DbG9zZSBtZW51cyBvbiBob3Zlcm91dFxuICAgICRkaXNjbG9zdXJlLm9uKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24oZSkge1xuICAgICAgY2xvc2VEaXNjbG9zdXJlcygpO1xuICAgIH0pO1xuXG4gICAgLy9PbiBjbGljay9mb2N1cyBldmVudCBmb3IgdG9nZ2xpbmcgb3B0aW9uc1xuICAgICR0b2dnbGUub24oJ21vdXNlZW50ZXInLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgIC8vQ2xvc2UgYWxsIG90aGVyIG1lbnVzXG4gICAgICBjbG9zZURpc2Nsb3N1cmVzKHRydWUsIHRoaXMpO1xuXG4gICAgICB2Y
1XIgJHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTtcbiAgICAgICR0YXJnZXQuYXR0cignYXJpYS1leHBhbmRlZCcsICd0cnVlJykuYWRkQ2xhc3MoJ2lzLWNsaWNrZWQnKTtcbiAgICAgIGNoZWNrT2ZmU2NyZWVuKCR0YXJnZXQpO1xuICAgIH0pO1xuXG4gICAgJHRvZ2dsZS5vbigna2V5dXAnLCBmdW5jdGlvbihlKSB7XG4gICAgICBpZiAoZS53aGljaCA9PT0gMTMpIHtcbiAgICAgICAgdmFyICR0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7XG4gICAgICAgICR0YXJnZXQuYXR0cignYXJpYS1leHBhbmRlZCcsICd0cnVlJykuYWRkQ2xhc3MoJ2lzLWNsaWNrZWQnKTtcbiAgICAgICAgY2hlY2tPZmZTY3JlZW4oJHRhcmdldCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAkZGlzY2xvc3VyZS5vbignZm9jdXNvdXQnLCBmdW5jdGlvbihlKSB7XG4gICAgICBjb25zdCBsaXN0ID0gZS5jdXJyZW50VGFyZ2V0O1xuICAgICAgY29uc3QgbmV4dEVsID0gZS5yZWxhdGVkVGFyZ2V0OyAvLyBUaGUgZWxlbWVudCB0aGF0IHdvdWxkIHJlY2VpdmUgZm9jdXMuXG5cbiAgICAgIC8vIElmIHRoZSBuZXh0RWwgaXMgd2l0aGluIHRoZSBsaXN0IChhIGxpc3QgaXRlbSksIGRvbid0IGNsb3NlIHRoZSBsaXN0XG4gICAgICBpZiAoIWxpc3QuY29udGFpbnMobmV4dEVsKSkge1xuICAgICAgICBjbG9zZURpc2Nsb3N1cmVzKGZhbHNlLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vTW9iaWxlIHRvZ2dsZSBsb2dpY1xuICAgICR0b2dnbGUub24oJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbihlKSB7XG4gICAgICBpZiAod2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubWVkaXVtLm1hdGNoZXMgfHwgIXdpbmRvdy5QWFVUaGVtZS5kZXZpY2UuaGFzVG91Y2gubWF0Y2hlcykge1xuICAgICAgICB2Y
1XIgJHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTtcblxuICAgICAgICBjbG9zZURpc2Nsb3N1cmVzKHRydWUsIHRoaXMpO1xuXG4gICAgICAgIGlmKCEkdGFyZ2V0Lmhhc0NsYXNzKCdpcy1jbGlja2VkJykpIHtcbiAgICAgICAgICAkdGFyZ2V0LmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpLmFkZENsYXNzKCdpcy1jbGlja2VkJyk7XG4gICAgICAgICAgY2hlY2tPZmZTY3JlZW4oJHRhcmdldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJHRhcmdldC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJykucmVtb3ZlQ2xhc3MoJ2lzLWNsaWNrZWQnKTtcbiAgICAgICAgICAkZGlzY2xvc3VyZVdyYXAucmVtb3ZlQ2xhc3MoJ2Rpc2Nsb3N1cmUtLWxlZnQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG4gIGFkZEltYWdlRGltZW5zaW9uOiBmdW5jdGlvbihpbWFnZVVybCwgc2l6ZSkge1xuICAgIHZhciBpbnNlcnRQb3NpdGlvbiA9IGltYWdlVXJsLmxhc3RJbmRleE9mKFwiLlwiKTtcbiAgICByZXR1cm4gaW1hZ2VVcmwuc3Vic3RyaW5nKDAsIGluc2VydFBvc2l0aW9uKSArIHNpemUgKyBpbWFnZVVybC5zdWJzdHJpbmcoaW5zZXJ0UG9zaXRpb24pO1xuICB9LFxuICB1bmxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICQoJ1tkYXRhLWRpc2Nsb3N1cmVdJykub2ZmKCk7XG4gICAgJCgnW2RhdGEtZGlzY2xvc3VyZS10b2dnbGVdJykub2ZmKCk7XG4gICAgJCgnLmRpc2Nsb3N1cmVfX2xpc3Qtd3JhcCcpLm9mZigpO1xuICB9XG59XG5cbnZhciB0b2dnbGVTaWRlYmFyQmxvY2tzID0gZnVuY3Rpb24oJHRvZ2dsZSl7XG4gIGlmKCR0b2dnbGUucGFyZW50KCkubmV4dCgndWwnKS5pcygnOnZpc2libGUnKSkge1xuICAgICR0b2dnbGUucGFyZW50KCkubmV4dCgndWwnKS5oaWRlKCk7XG4gICAgJHRvZ2dsZS5odG1sKCcrJyk7XG4gICAgJHRvZ2dsZS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xuICB9IGVsc2Uge1xuICAgICR0b2dnbGUucGFyZW50KCkubmV4dCgndWwnKS5zaG93KCk7XG4gICAgJHRvZ2dsZS5odG1sKCctJyk7XG4gICAgJHRvZ2dsZS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSk7XG4gIH1cbn1cblxudmFyIHRvZ2dsZVNpZGViYXJNZW51cyA9IGZ1bmN0aW9uKCR0b2dnbGUpe1xuICB2YXIgJGNvbnRlbnQgPSAkdG9nZ2xlLm5leHQoJ3VsJyk7XG4gICRjb250ZW50LnNsaWRlVG9nZ2xlKCk7XG4gICR0b2dnbGUudG9nZ2xlQ2xhc3MoJ2FjdGl2ZScpO1xuICAkdG9nZ2xlLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAkdG9nZ2xlLmF0dHIoJ2FyaWEtZXhwYW5kZWQnKSA9PSAndHJ1ZScgPyAnZmFsc2UnIDogJ3RydWUnKTtcbn1cblxud2luZG93LmFuaW1hdGVfY29udGVudCA9IHtcbiAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgLy8gYWRkZWQgdG8gdGhlIGxpc3RlbkZvclJlc2l6ZSBtZXRob2RcbiAgICBpZiAod2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubGFyZ2UubWF0Y2hlcyB8fCAkKHdpbmRvdykud2lkdGgoKSA9PSAwKSB7XG4gICAgICAkKFwiLmFuaW1hdGVfcmlnaHRcIikud2F5cG9pbnQoZnVuY3Rpb24oKSB7XG4gICAgICAgICQodGhpcy5lbGVtZW50KS5hZGRDbGFzcyhcImFuaW1hdGVkIGZhZGVJblJpZ2h0XCIpO1xuICAgICAgfSwgeyBvZmZzZXQ6ICc4MCUnIH0pO1xuICAgICAgJChcIi5hbmltYXRlX2xlZnRcIikud2F5cG9pbnQoZnVuY3Rpb24oKSB7XG4gICAgICAgICQodGhpcy5lbGVtZW50KS5hZGRDbGFzcyhcImFuaW1hdGVkIGZhZGVJbkxlZnRcIik7XG4gICAgICB9LCB7IG9mZnNldDogJzgwJScgfSk7XG4gICAgICAkKFwiLmFuaW1hdGVfdXBcIikud2F5cG9pbnQoZnVuY3Rpb24oKSB7XG4gICAgICAgICQodGhpcy5lbGVtZW50KS5hZGRDbGFzcyhcImFuaW1hdGVkIGZhZGVJblVwXCIpO1xuICAgICAgfSwgeyBvZmZzZXQ6ICc4MCUnIH0pO1xuICAgICAgJChcIi5hbmltYXRlX2luXCIpLndheXBvaW50KGZ1bmN0aW9uKCkge1xuICAgICAgICAkKHRoaXMuZWxlbWVudCkuYWRkQ2xhc3MoXCJhbmltYXRlZCBmYWRlSW5cIik7XG4gICAgICB9LCB7IG9mZnNldDogJzgwJScgfSk7XG4gICAgICAkKFwiLmFuaW1hdGVfZG93blwiKS53YXlwb2ludChmdW5jdGlvbigpIHtcbiAgICAgICAgJCh0aGlzLmVsZW1lbnQpLmFkZENsYXNzKFwiYW5pbWF0ZWQgZmFkZUluRG93blwiKTtcbiAgICAgIH0sIHsgb2Zmc2V0OiAnODAlJyB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIENhcnRcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbndpbmRvdy5jYXJ0ID0ge1xuICBpbml0OiBmdW5jdGlvbigpe1xuICAgICQoXCIjYWRkcmVzc19jb3VudHJ5XCIpLnZhbCgkKFwiI2FkZHJlc3NfY291bnRyeVwiKS5kYXRhKFwiZGVmYXVsdFwiKSkuY2hhbmdlKCk7XG4gIH0sXG4gIHVubG9hZDogZnVuY3Rpb24oKXtcbiAgfVxufVxuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgUHJlZGljdGl2ZSBzZWFyY2hcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbndpbmRvdy5wcmVkaWN0aXZlU2VhcmNoID0ge1xuICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmV2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXIoKTtcbiAgICB0aGlzLmNsb3NlU2VhcmNoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtc2VhcmNoLWNsb3NlXScpO1xuICAgIHRoaXMuc2l0ZU92ZXJsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zaXRlLW92ZXJsYXldJyk7XG4gICAgdGhpcy5zaXRlT3ZlcmxheUFuaW1hdGlvbiA9IHRyYW5zaXRpb24oeyBlbDogdGhpcy5zaXRlT3ZlcmxheSB9KTtcbiAgICB0aGlzLnNlYXJjaEZvcm1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcHJlZGljdGl2ZS1zZWFyY2gtZW5hYmxlZC10cnVlXScpO1xuXG4gICAgdGhpcy5zZWFyY2hGb3Jtcy5mb3JFYWNoKGZvcm0gPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlYXJjaC1pbnB1dF0nKTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlYXJjaC1yZXN1bHRzXScpO1xuICAgICAgY29uc3QgcmVzdWx0c0NvbnRhaW5lciA9IGZvcm0ucXVlcnlTZWxlY3RvcignW2RhdGEtc2VhcmNoLXJlc3VsdHMtY29udGFpbmVyXScpO1xuICAgICAgY29uc3QgYW5pbWF0aW9uID0gdHJhbnNpdGlvbih7IGVsOiByZXN1bHRzQ29udGFpbmVyIH0pO1xuXG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcihmb3JtLCAnc3VibWl0JywgZSA9PiB0aGlzLl9vblN1Ym1pdChlLCBpbnB1dCkpO1xuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIod2luZG93LCAncmVzaXplJywgKCkgPT4gdGhpcy5fb25SZXNpemUocmVzdWx0c0NvbnRhaW5lcikpO1xuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIod2luZG93LCAna2V5dXAnLCBlID0+IHRoaXMuX29uS2V5VXAoZSwgZm9ybSwgaW5wdXQsIGFuaW1hdGlvbikpO1xuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5jbG9zZVNlYXJjaCwgJ2NsaWNrJywgKCkgPT4gdGhpcy5fY2xvc2UoZm9ybSwgYW5pbWF0aW9uKSk7XG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3RlcihpbnB1dCwgJ2ZvY3VzJywgKCkgPT4gdGhpcy5fb25Gb2N1cyhmb3JtLCBpbnB1dCwgcmVzdWx0cywgcmVzdWx0c0NvbnRhaW5lciwgYW5pbWF0aW9uKSk7XG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3RlcihpbnB1dCwgJ2lucHV0JywgZGVib3VuY2UoKCkgPT4gdGhpcy5fb25DaGFuZ2UoZm9ybSwgaW5wdXQsIHJlc3VsdHMsIHJlc3VsdHNDb250YWluZXIsIGFuaW1hdGlvbikpLCAyNTApO1xuXG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcihkb2N1bWVudC5ib2R5LCAnY2xpY2snLCBlID0+IHtcbiAgICAgICAgaWYgKGZvcm0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWFyY2gtZm9ybS0tYWN0aXZlJykpIHtcbiAgICAgICAgICBpZiAoIWZvcm0uY29udGFpbnMoZS50YXJnZXQpICYmICFmb3JtLmNsb3Nlc3QoJy5tb2JpbGUtc2VhcmNoJykpIHtcbiAgICAgICAgICAgI
1HRoaXMuX2Nsb3NlKGZvcm0sIGFuaW1hdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgX29uU3VibWl0KGUsIGlucHV0KSB7XG4gICAgLy8gUHJldmVudCBlbXB0eSBmb3JtIHN1Ym1pc3Npb25zXG4gICAgaWYgKHRoaXMuX2dldFF1ZXJ5KGlucHV0KS5sZW5ndGggPT09IDApIGUucHJldmVudERlZmF1bHQoKTtcbiAgfSxcbiAgX29uUmVzaXplKHJlc3VsdHNDb250YWluZXIpIHtcbiAgICB0aGlzLl9yZXNpemVTZWFyY2hSZXN1bHRzKHJlc3VsdHNDb250YWluZXIpO1xuICB9LFxuICBfb25LZXlVcChlLCBmb3JtLCBpbnB1dCwgYW5pbWF0aW9uKSB7XG4gICAgaWYgKGUuY29kZSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGlucHV0LnZhbHVlID0gJyc7XG5cbiAgICAgIHRoaXMuX2Nsb3NlKGZvcm0sIGFuaW1hdGlvbik7XG5cbiAgICAgICQoJyNzZWFyY2gnKS5yZW1vdmVDbGFzcyhcImZhZGVJblwiKS5oaWRlKCk7XG4gICAgfVxuICB9LFxuICBfb25CbHVyKGZvcm0sIGFuaW1hdGlvbikge1xuICAgIHRoaXMuX2Nsb3NlKGZvcm0sIGFuaW1hdGlvbik7XG5cbiAgICAkKCcjc2VhcmNoJykucmVtb3ZlQ2xhc3MoXCJmYWRlSW5cIikuaGlkZSgpO1xuICB9LFxuICBfb25Gb2N1cyhmb3JtLCBpbnB1dCwgcmVzdWx0cywgcmVzdWx0c0NvbnRhaW5lciwgYW5pbWF0aW9uKSB7XG4gICAgY29uc3QgdGVybSA9IHRoaXMuX2dldFF1ZXJ5KGlucHV0KTtcblxuICAgIGlmICh0ZXJtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fZ2V0U2VhcmNoUmVzdWx0cyh0ZXJtLCBmb3JtLCByZXN1bHRzLCByZXN1bHRzQ29udGFpbmVyLCBhbmltYXRpb24pO1xuICAgIHRoaXMuX29wZW4oZm9ybSwgcmVzdWx0c0NvbnRhaW5lciwgYW5pbWF0aW9uKTtcbiAgfSxcbiAgX29uQ2hhbmdlKGZvcm0sIGlucHV0LCByZXN1bHRzLCByZXN1bHRzQ29udGFpbmVyLCBhbmltYXRpb24pIHtcbiAgICBjb25zdCB0ZXJtID0gdGhpcy5fZ2V0UXVlcnkoaW5wdXQpO1xuXG4gICAgaWYgKHRlcm0ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9jbG9zZShmb3JtLCBhbmltYXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2dldFNlYXJjaFJlc3VsdHMo
1dGVybSwgZm9ybSwgcmVzdWx0cywgcmVzdWx0c0NvbnRhaW5lciwgYW5pbWF0aW9uKTtcbiAgICB0aGlzLl9vcGVuKGZvcm0sIHJlc3VsdHNDb250YWluZXIsIGFuaW1hdGlvbik7XG4gIH0sXG4gIF9nZXRRdWVyeShpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dC52YWx1ZS50cmltKCk7XG4gIH0sXG4gIF9vcGVuKGZvcm0sIHJlc3VsdHNDb250YWluZXIsIGFuaW1hdGlvbikge1xuICAgIGFuaW1hdGlvbi5hbmltYXRlVG8oJ29wZW4nKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3Njcm9sbC1sb2NrZWQnKTtcblxuICAgICAgICBmb3JtLmNsYXNzTGlzdC5hZGQoJ3NlYXJjaC1mb3JtLS1hY3RpdmUnKTtcblxuICAgICAgICBpZiAoZm9ybS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlYXJjaC1mb3JtLS1vdmVybGF5LWVuYWJsZWQtdHJ1ZScpKSB7XG4gICAgICAgICAgdGhpcy5zaXRlT3ZlcmxheUFuaW1hdGlvbi5hbmltYXRlVG8oJ29wZW4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JtLmNsb3Nlc3QoJy5tb2JpbGUtc2VhcmNoJykgfHwgZm9ybS5jbG9zZXN0KCcubW9iaWxlLXNlYXJjaC1iYXInKSAmJiB3aW5kb3cuUFhVVGhlbWUubWVkaWFfcXVlcmllcy5tZWRpdW0ubWF0Y2hlcykge1xuICAgICAgICAgIHRoaXMuY2xvc2VTZWFyY2guc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Jlc2l6ZVNlYXJjaFJlc3VsdHMocmVzdWx0c0NvbnRhaW5lcik7XG4gICAgICB9KTtcbiAgfSxcbiAgX2Nsb3NlKGZvcm0sIGFuaW1hdGlvbikge1xuICAgIGFuaW1hdGlvbi5hbmltYXRlVG8oJ2Nsb3NlZCcpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGZvcm0uY2xhc3NMaXN0LnJlbW92ZSgnc2VhcmNoLWZvcm0tLWFjdGl2ZScpO1xuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnc2Nyb2xsLWxvY2tlZCcpO1xuXG4gICAgICAgIGlmIChmb3JtLmNsYXNzTGlzdC5jb250YWlucygnc2VhcmNoLWZvcm0tLW92ZXJsYXktZW5hYmxlZC10cnVlJykpIHtcbiAgICAgICAgICB0aGlzLnNpdGVPdmVybGF5QW5pbWF0aW9uLmFuaW1hdGVUbygnY2xvc2VkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jbG9zZVNlYXJjaCAmJiB3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MubW9iaWxlX3NlYXJjaF9sb2NhdGlvbiA9PSAnYmVsb3ctaGVhZGVyJyAmJiB3aW5kb3cuUFhVVGhlbWUubWVkaWFfcXVlcmllcy5tZWRpdW0ubWF0Y2hlcykge1xuICAgICAgICAgIHRoaXMuY2xvc2VTZWFyY2guc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH0sXG4gIF9nZXRTZWFyY2hSZXN1bHRzKHRlcm0sIGZvcm0sIHJlc3VsdHMsIHJlc3VsdHNDb250YWluZXIsIGFuaW1hdGlvbikge1xuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IGZvcm0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWFyY2gtZm9ybS0tYmxvZycpID8gJyZyZXNvdXJjZXNbdHlwZV09YXJ0aWNsZScgOiAnJztcblxuICAgIHJlc3VsdHNDb250YWluZXIuc2V0QXR0cmlidXRlKCdkYXRhLWxvYWRpbmcnLCAndHJ1ZScpO1xuXG4gICAgZmV0Y2goYCR7d2luZG93LlBYVVRoZW1lLnJvdXRlcy5wcmVkaWN0aXZlX3NlYXJjaF91cmx9P3E9JHt0ZXJtfSR7cmVzb3VyY2VUeXBlfSZzZWN0aW9uX2lkPXByZWRpY3RpdmUtc2VhcmNoYClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICAgIH0pXG4gICAgICAudGhlbih0ZXh0ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0c01hcmt1cCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcodGV4dCwgJ3RleHQvaHRtbCcpLnF1ZXJ5U2VsZWN0b3IoJyNzaG9waWZ5LXNlY3Rpb24tcHJlZGljdGl2ZS1zZWFyY2gnKS5pbm5lckhUTUw7XG4gICAgICAgIHRoaXMuX3JlbmRlclNlYXJjaFJlc3VsdHMocmVzdWx0c01hcmt1cCwgZm9ybSwgcmVzdWx0cywgcmVzdWx0c0NvbnRhaW5lciwgYW5pbWF0aW9uKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pO1xuICB9LFxuICBfcmVuZGVyU2VhcmNoUmVzdWx0cyhyZXN1bHRzTWFya3VwLCBmb3JtLCByZXN1bHRzLCByZXN1bHRzQ29udGFpbmVyLCBhbmltYXRpb24pIHtcbiAgICByZXN1bHRzQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZGF0YS1sb2FkaW5nJywgJ2ZhbHNlJyk7XG4gICAgcmVzdWx0cy5pbm5lckhUTUwgPSByZXN1bHRzTWFya3VwO1xuICAgIHRoaXMuX3JlZ2lzdGVyRXZlbnRzKGZvcm0sIGFuaW1hdGlvbik7XG4gIH0sXG4gIF9yZWdpc3RlckV2ZW50cyhmb3JtLCBhbmltYXRpb24pIHtcbiAgICB0aGlzLnNlYXJjaEJ1dHRvbiA9IGZvcm0ucXVlcnlTZWxlY3RvcignW2RhdGEtcHJlZGljdGl2ZS1zZWFyY2gtYnV0dG9uXScpO1xuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMuc2VhcmNoQnV0dG9uLCAnYmx1cicsICgpID0+IHRoaXMuX29uQmx1cihmb3JtLCBhbmltYXRpb24pKTtcbiAgfSxcbiAgX3Jlc2l6ZVNlYXJjaFJlc3VsdHMocmVzdWx0c0NvbnRhaW5lcikge1xuICAgIGNvbnN0IG9mZnNldCA9IDMwO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gcmVzdWx0c0NvbnRhaW5lci5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHBvc2l0aW9uLmJvdHRvbSAtIG9mZnNldDtcblxuICAgIHJlc3VsdHNDb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoJy0tc2VhcmNoLXJlc3VsdHMtbWF4LWhlaWdodCcsIGAke21heEhlaWdodH1weGApO1xuICB9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBSZXNwb25zaXZlIG1lZGlhXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0q
1L1xuXG5mdW5jdGlvbiBlbmFibGVSZXNwb25zaXZlVmlkZW9XcmFwcGVyKCkge1xuICAvLyBXcmFwcyBZb3VUdWJlIGFuZCBWaW1lbyBpZnJhbWVzIGluIFBseXIgd3JhcHBlclxuICAvLyBEb2VzIG5vdCB0YXJnZXQgaWZyYW1lcyBhbHJlYWR5IGVtYmVkZGVkIGluIFBseXIgd3JhcHBlciAodmlkZW8gc2VjdGlvbnMgYW5kIHByb2R1Y3QgZ2FsbGVyaWVzKVxuICAkKCdpZnJhbWVbc3JjKj1cInlvdXR1YmUuY29tXCJdOm5vdCgucGx5cl9fdmlkZW8td3JhcHBlciBpZnJhbWVbc3JjKj1cInlvdXR1YmUuY29tXCJdKScpLndyYXAoJzxkaXYgY2xhc3M9XCJwbHlyX192aWRlby1lbWJlZFwiPjwvZGl2PicpO1xuICAkKCdpZnJhbWVbc3JjKj1cInZpbWVvLmNvbVwiXTpub3QoLnBseXJfX3ZpZGVvLXdyYXBwZXIgaWZyYW1lW3NyYyo9XCJ2aW1lby5jb21cIl0pJykud3JhcCgnPGRpdiBjbGFzcz1cInBseXJfX3ZpZGVvLWVtYmVkXCI+PC9kaXY+Jyk7XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBTdGFydCBvZiBjYXJ0LXJlbGF0ZWQgZnVuY3Rpb25hbGl0eVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuICBmdW5jdGlvbiBhamF4U3VibWl0Q2FydCgpIHtcbiAgICBjb25zdCAkY2FydCA9ICQoXCIjY2FydFwiKTtcbiAgICAkLmFqYXgoe1xuICAgICAgdXJsOiAnL2NhcnQvdXBkYXRlLmpzJyxcbiAgICAgIGRhdGFUeXBlOiAnanNvbicsXG4gICAgICBjYWNoZTogZmFsc2UsXG4gICAgICB0eXBlOiAncG9zdCcsXG4gICAgICBkYXRhOiAkY2FydC5zZXJpYWxpemUoKSxcbiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHJlZnJlc2hDYXJ0KGRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYWpheFVwZGF0ZUNhcnQobGluZUlELCBxdWFudGl0eSwgcGFyZW50KSB7XG4gICAgJC5hamF4KHtcbiAgICAgIHVybDogJy9jYXJ0L2NoYW5nZS5qcycsXG4gICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgY2FjaGU6IGZhbHNlLFxuICAgICAgdHlwZTogJ3Bvc3QnLFxuICAgICAgZGF0YTogeyBxdWFudGl0eTogcXVhbnRpdHksIGxpbmU6IGxpbmVJRCB9LFxuICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgcmVmcmVzaENhcnQoZGF0YSk7XG5cbiAgICAgICAgdmFyIGxpbmVJREluZGV4ID0gbGluZUlEIC0gMTtcblx0XHQgICAgdmFyICRpbnB1dCA9IHBhcmVudC5maW5kKFwiaW5wdXRbZGF0YS1saW5lLWlkPSdcIiArIGxpbmVJRCArIFwiJ11cIik7XG5cbiAgICAgICAgLy9jaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGNvcnJlY3QgYW1vdW50IG9mIHByb2R1Y3RzIGluIGFycmF5XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YS5pdGVtc1tsaW5lSURJbmRleF0gPT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgICAgIHZhciB1cGRhdGVkX3F1YW50aXR5ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2Y
1XIgdXBkYXRlZF9xdWFudGl0eSA9IGRhdGEuaXRlbXNbbGluZUlESW5kZXhdLnF1YW50aXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYocXVhbnRpdHkgPiAwICYmIHF1YW50aXR5ICE9IHVwZGF0ZWRfcXVhbnRpdHkpIHtcbiAgICAgICAgICBpZiAodXBkYXRlZF9xdWFudGl0eSA9PSAxKSB7XG4gICAgICAgICAgICB2YXIgaXRlbXNfbGVmdF90ZXh0ID0gd2luZG93LlBYVVRoZW1lLnRyYW5zbGF0aW9uLml0ZW1zX2xlZnRfY291bnRfb25lO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaXRlbXNfbGVmdF90ZXh0ID0gd2luZG93LlBYVVRoZW1lLnRyYW5zbGF0aW9uLml0ZW1zX2xlZnRfY291bnRfb3RoZXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJCgnLndhcm5pbmctLXF1YW50aXR5JykucmVtb3ZlKCk7XG5cbiAgICAgICAgICB2YXIgd2FybmluZyA9IGBcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgICAgICB3YXJuaW5nXG4gICAgICAgICAgICAgICAgd2FybmluZy0tcXVhbnRpdHlcbiAgICAgICAgICAgICAgICBhbmltYXRlZFxuICAgICAgICAgICAgICAgIGJvdW5jZUluXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICR7dXBkYXRlZF9xdWFudGl0eX0gJHtpdGVtc19sZWZ0X3RleHR9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgO1xuXG4gICAgICAgICAgJGlucHV0LnBhcmVudCgpLm5leHQoKS5hcHBlbmQod2FybmluZyk7XG4gICAgICAgICAgJGlucHV0LnZhbCh1cGRhdGVkX3F1YW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVmcmVzaENhcnQoY2FydCkge1xuICAgIGNvbnN0ICRjYXJ0QnRuID0gJChcIi5jYXJ0LWJ1dHRvbiBzcGFuXCIpO1xuICAgIGlmICgkY2FydEJ0biAmJiAkY2FydEJ0bi5sZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9ICRjYXJ0QnRuLnRleHQoKSB8fCAnMCc7XG4gICAgICB2Y
1XIgY2FydF9pdGVtc19odG1sID0gXCJcIjtcbiAgICAgIHZhciAkY2FydCA9ICQoXCIjY2FydCB1bFwiKTtcblxuICAgICAgJGNhcnRCdG4udGV4dCh2YWx1ZS5yZXBsYWNlKC9bMC05XSsvLGNhcnQuaXRlbV9jb3VudCkpO1xuICAgICAgJGNhcnQuZmluZCgnbGk6bm90KDpmaXJzdCknKS5yZW1vdmUoKTtcblxuICAgICAgaWYgKGNhcnQuaXRlbV9jb3VudCA9PSAwKSB7XG4gICAgICAgICRjYXJ0LmFwcGVuZCgnPGxpIGNsYXNzPVwiZW1wdHlfY2FydFwiPicgKyB3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uZW1wdHlfY2FydCArICc8L2xpPicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJC5lYWNoKGNhcnQuaXRlbXMsIGZ1bmN0aW9uKGluZGV4LCBpdGVtKSB7XG5cbiAgICAgICAgICB2YXIgbGluZV9pZCA9IGluZGV4ICsgMTtcblxuICAgICAgICAgIGxldCBkaXNjb3VudE1lc3NhZ2UgPSAnJztcblxuICAgICAgICAgIGxldCB1bml0UHJpY2luZ091dHB1dCA9ICcnO1xuXG4gICAgICAgICAgaWYgKGl0ZW0udW5pdF9wcmljZV9tZWFzdXJlbWVudCkge1xuICAgICAgICAgICAgdW5pdFByaWNpbmdPdXRwdXQgPSB3aW5kb3cucHJvZHVjdC51bml0UHJpY2luZyhpdGVtKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBEaXNjb3VudHMgbG9naWNcbiAgICAgICAgICBpZiAoaXRlbS5kaXNjb3VudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgZGlzY291bnRBbW91bnQgPSBTaG9waWZ5LmZvcm1hdE1vbmV5KGl0ZW0uZGlzY291bnRzWzBdLmFtb3VudCwgJCgnYm9keScpLmRhdGEoJ21vbmV5LWZvcm1hdCcpKTtcbiAgICAgICAgICAgIHZhciB0aXRsZSA9IGl0ZW0uZGlzY291bnRzWzBdLnRpdGxlO1xuICAgICAgICAgICAgZGlzY291bnRNZXNzYWdlID0gYFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vdGlmaWNhdGlvbi1kaXNjb3VudFwiPlxuICAgICAgICAgICAgICAgICR7d2luZG93LlBYVVRoZW1lLnRyYW5zbGF0aW9uLmNhcnRfZGlzY291bnR9OiAke3RpdGxlfSAoLTxzcGFuIGNsYXNzPVwibW9uZXlcIj4ke2Rpc2NvdW50QW1vdW50fTwvc3Bhbj4pXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FydF9pdGVtc19odG1sICs9IGBcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cIm1tLWxpc3RpdGVtXCI+XG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiY2FydF9faXRlbVwiIGhyZWY9XCIke2l0ZW0udXJsfVwiPlxuICAgICAgICAgIGA7XG5cbiAgICAgICAgICBpZiAoaXRlbS5pbWFnZSkge1xuICAgICAgICAgICAgY2FydF9pdGVtc19odG1sICs9IGBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnRfX2ltYWdlXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIke2l0ZW0uaW1hZ2UucmVwbGFjZSgvKFxcLlteLl0qKSQvLCBcIl9tZWRpdW0kMVwiKS5yZXBsYWNlKCdodHRwOicsICcnKX1cIiBhbHQ9XCIke2h0bWxFbmNvZGUoaXRlbS50aXRsZSl9XCIvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FydF9pdGVtc19odG1sICs9IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJ0X19pbmZvXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJ0X19kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAke2l0ZW0udGl0bGV9XG4gICAgICAgICAgYDtcblxuICAgICAgICAgIGlmKGl0ZW0ucHJvcGVydGllcykge1xuICAgICAgICAgICAgJC5lYWNoKGl0ZW0ucHJvcGVydGllcywgZnVuY3Rpb24odGl0bGUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gJ29uJykge1xuICAgICAgICAgICAgICAgIGNhcnRfaXRlbXNfaHRtbCArPSBgXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICR7dGl0bGV9OiAke3ZhbHVlfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGl0ZW0uc2VsbGluZ19wbGFuX2FsbG9jYXRpb24gJiYgaXRlbS5zZWxsaW5nX3BsYW5fYWxsb2NhdGlvbi5zZWxsaW5nX3BsYW4pIHtcbiAgICAgICAgICAgIGNhcnRfaXRlbXNfaHRtbCArPSBgXG4gICAgICAgICAgICAgIDxicj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaW5lLWl0ZW0gc2VsbGluZy1wbGFuXCI+XG4gICAgICAgICAgICAgICAgJHtpdGVtLnNlbGxpbmdfcGxhbl9hbGxvY2F0aW9uLnNlbGxpbmdfcGxhbi5uYW1lfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICBgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpdGVtLnByaWNlID4gaXRlbS5maW5hbF9wcmljZSkge1xuICAgICAgICAgICAgY2FydF9pdGVtc19odG1sICs9IGBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnRfX3ByaWNlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb25leVwiPlxuICAgICAgICAgICAgICAgICAgJHtTaG9waWZ5LmZvcm1hdE1vbmV5KGl0ZW0uZmluYWxfbGluZV9wcmljZSwgJCgnYm9keScpLmRhdGEoJ21vbmV5LWZvcm1hdCcpKX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIndhc19wcmljZSBtb25leVwiPlxuICAgICAgICAgICAgICAgICAgJHtTaG9waWZ5LmZvcm1hdE1vbmV5KGl0ZW0ub3JpZ2luYWxfbGluZV9wcmljZSwgJCgnYm9keScpLmRhdGEoJ21vbmV5LWZvcm1hdCcpKX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJ0X191bml0LXByaWNlXCI+XG4gICAgICAgICAgICAgICAgJHt1bml0UHJpY2luZ091dHB1dH1cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnRfX2Rpc2NvdW50XCI+XG4gICAgICAgICAgICAgICAgJHtkaXNjb3VudE1lc3NhZ2V9XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FydF9pdGVtc19odG1sICs9IGBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnRfX3ByaWNlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb25leVwiPlxuICAgICAgICAgICAgICAgICAgJHtTaG9waWZ5LmZvcm1hdE1vbmV5KGl0ZW0ucHJpY2UsICQ
1oJ2JvZHknKS5kYXRhKCdtb25leS1mb3JtYXQnKSl9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FydF9fdW5pdC1wcmljZVwiPlxuICAgICAgICAgICAgICAgICR7dW5pdFByaWNpbmdPdXRwdXR9XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXJ0X2l0ZW1zX2h0bWwgKz0gYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnRfX3F1YW50aXR5XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1taW51cyBtaW51c1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCIwXCIgY2xhc3M9XCJxdWFudGl0eVwiIG5hbWU9XCJ1cGRhdGVzW11cIiBpZD1cInVwZGF0ZXNfJHtpdGVtLmlkfVwiIHZhbHVlPVwiJHtpdGVtLnF1YW50aXR5fVwiICBkYXRhLWxpbmUtaWQ9XCIke2xpbmVfaWR9XCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLXBsdXMgcGx1c1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgYDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGNhcnREaXNjb3VudHMgPSBjYXJ0LmNhcnRfbGV2ZWxfZGlzY291bnRfYXBwbGljYXRpb25zO1xuICAgICAgICB2Y
1XIgY2FydERpc2NvdW50TWVzc2FnZSA9IFwiXCI7XG5cbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgY2FydERpc2NvdW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBhbW91bnQgPSBTaG9waWZ5LmZvcm1hdE1vbmV5KGNhcnREaXNjb3VudHNbaV0udG90YWxfYWxsb2NhdGVkX2Ftb3VudCwgJCgnYm9keScpLmRhdGEoJ21vbmV5LWZvcm1hdCcpKTtcbiAgICAgICAgICB2YXIgdGl0bGUgPSBjYXJ0RGlzY291bnRzW2ldLnRpdGxlO1xuICAgICAgICAgIGNhcnREaXNjb3VudE1lc3NhZ2UgPSAnPHAgY2xhc3M9XCJtbS1jb3VudGVyIHByaWNlIG1tLWRpc2NvdW50LWxhYmVsIG1tLWxpc3RpdGVtX190ZXh0XCI+JyArIHRpdGxlICsgJzxzcGFuPicgKyAnKC0gPHNwYW4gY2xhc3M9XCJtb25leVwiPicgKyBhbW91bnQgKyAnPC9zcGFuPiknICsgJzwvc3Bhbj4nICsgJzwvcD4nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhcnQuY2FydF9sZXZlbF9kaXNjb3VudF9hcHBsaWNhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNhcnRfaXRlbXNfaHRtbCArPSAnPGxpIGNsYXNzPVwibW0tbGFiZWwgbW0tbGlzdGl0ZW1cIj4nICsgY2FydERpc2NvdW50TWVzc2FnZSArICc8L2xpPidcbiAgICAgICAgfVxuXG4gICAgICAgIGNhcnRfaXRlbXNfaHRtbCArPSBgXG4gICAgICAgICAgPGxpIGNsYXNzPVwibW0tbGFiZWwgbW0tbGlzdGl0ZW1cIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIvY2FydFwiIGNsYXNzPVwiY2FydF9faXRlbS1zdWJ0b3RhbFwiPlxuICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAke3dpbmRvdy5QWFVUaGVtZS50cmFuc2xhdGlvbi5zdWJ0b3RhbH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW0tY291bnRlciBwcmljZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9uZXlcIj5cbiAgICAgICAgICAgICAgICAgICR7U2hvcGlmeS5mb3JtYXRNb25leShjYXJ0LnRvdGFsX3ByaWNlLCAkKCdib2R5JykuZGF0YSgnbW9uZXktZm9ybWF0JykpfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgIDwvbGk+XG5cbiAgICAgICAgICA8bGkgY2x
1hc3M9XCJtbS1zdWJ0aXRsZSBtbS1saXN0aXRlbVwiPlxuICAgICAgICBgO1xuXG4gICAgICAgIGlmICh3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MuZGlzcGxheV9zcGVjaWFsX2luc3RydWN0aW9ucykge1xuICAgICAgICAgIHZhciBjYXJ0X25vdGUgPSBjYXJ0Lm5vdGUgPyBjYXJ0Lm5vdGUgOiAnJztcbiAgICAgICAgICBjYXJ0X2l0ZW1zX2h0bWwgKz0gJzx0ZXh0YXJlYSBpZD1cImNhcnQtbm90ZVwiIG5hbWU9XCJub3RlXCIgcm93cz1cIjJcIiBwbGFjZWhvbGRlcj1cIicgKyB3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uY2FydF9ub3RlcyArICdcIiBjbGFzcz1cImNsZWFyZml4XCI+JyArIGNhcnRfbm90ZSArICc8L3RleHRhcmVhPic7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5kaXNwbGF5X3Rvc19jaGVja2JveCkge1xuICAgICAgICAgIGNhcnRfaXRlbXNfaHRtbCArPSAnPGFzaWRlIGNsYXNzPVwidG9zIHRvc19jaGVja2JveFwiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInRvc19hZ3JlZVwiIGlkPVwic2xpZGluZ19hZ3JlZVwiIHJlcXVpcmVkIC8+PGxhYmVsIGNsYXNzPVwidG9zX2xhYmVsXCIgZm9yPVwic2xpZGluZ19hZ3JlZVwiPiAnICtcbiAgICAgICAgICB3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MudG9zX3JpY2h0ZXh0ICArICc8L2xhYmVsPjwvYXNpZGU+JztcbiAgICAgICAgfTtcblxuICAgICAgICBjYXJ0X2l0ZW1zX2h0bWwgKz0gJzxzcGFuIGNsYXNzPVwibW0tYWN0aW9uX2J1dHRvbnMgbW0tbGlzdGl0ZW1fX3RleHRcIj57JSBpZiBzZXR0aW5ncy5kaXNwbGF5X3ZpZXdfY2FydCAlfTxhIGhyZWY9XCInICsgd2luZG93LlBYVVRoZW1lLnRoZW1lX3NldHRpbmdzLmNhcnRfdXJsICsgJ1wiIGNsYXNzPVwiYWN0aW9uX2J1dHRvbiBlZGl0X2NhcnQgbGVmdFwiPicgKyB3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uZWRpdF9jYXJ0ICsgJzwvYT57JSBlbmRpZiAlfScgKyAnPGlucHV0IHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImFjdGlvbl9idXR0b24geyUgaWYgc2V0dGluZ3MuZGlzcGxheV92aWV3X2NhcnQgJX1yaWdodHslIGVsc2UgJX1mdWxsLXdpZHRoeyUgZW5kaWYgJX1cIiB2YWx1ZT1cIicgKyB3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uY2hlY2tvdXQgKyAnXCIvPicgKyAnPC9zcGFuPicgKyAnPC9saT4nO1xuXG4gICAgICAgICRjYXJ0LmFwcGVuZChjYXJ0X2l0ZW1zX2h0bWwpO1xuICAgICAgICAkY2FydC5maW5kKCdsaS5jYXJ0X2l0ZW06bGFzdCcpLmFkZENsYXNzKCdsYXN0X2NhcnRfaXRlbScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4vLyBEb2N1bWVudCByZWFkeVxuJChmdW5jdGlvbigpIHtcbiAgdXRpbGl0aWVzLmxpc3RlbkZvclJlc2l6ZSgpO1xuICB1dGlsaXRpZXMuZW5hYmxlRGlzY2xvc3VyZSgpO1xuXG4gIHdpbmRvdy5sYXp5U2l6ZXNDb25maWcgPSB3aW5kb3cubGF6eVNpemVzQ29uZmlnIHx8IHt9O1xuXG4gIGxhenlTaXplc0NvbmZpZy5leHBhbmQgPSAzMDA7XG4gIGxhenlTaXplc0NvbmZpZy5sb2FkSGlkZGVuID0gZmFsc2U7XG5cbiAgJChcImJvZHlcIikub24oXCJjbGlja1wiLCAnLmNvbnRpbnVlJywgZnVuY3Rpb24oKSB7XG5cbiAgICB2YXIgY2FydCA9ICQoXCIjY2FydFwiKS5kYXRhKCBcIm1tZW51XCIgKTtcbiAgICBjYXJ0LmNsb3NlKCk7XG5cbiAgICB2YXIgbmF2ID0gJChcIiNuYXZcIikuZGF0YSggXCJtbWVudVwiICk7XG4gICAgbmF2LmNsb3NlKCk7XG5cbiAgfSk7XG5cbiAgLy8gU2VhcmNoIHN1Ym1pdCB0cmlnZ2VyIGV2ZW50XG4gICQoJy5zZWFyY2gtZm9ybSAuc3VibWl0LXNlYXJjaCwgLnNlYXJjaC1mb3JtLS1tb2JpbGUgLnN1Ym1pdC1zZWFyY2gnKS5vbignY2xpY2sgdG91Y2hzdGFydCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAkKHRoaXMpLnBhcmVudHMoJ2Zvcm0nKS5zdWJtaXQoKTtcbiAgfSk7XG5cbiAgLy8gT2Zmc2NyZWVuIGNoZWNrIGZvciBkcm9wZG93biBtZW51c1xuXG4gICQoJy5zdWItbWVudScpLm9uKCdtb3VzZWVudGVyJywgZnVuY3Rpb24oKXtcbiAgICBpZigkKHRoaXMpLmZpbmQoJy5kcm9wZG93bicpLmlzKCc6b2ZmLXJpZ2h0JykpIHtcbiAgICAgICQodGhpcykuZmluZCgnLmRyb3Bkb3duJykuYWRkQ2xhc3MoXCJkcm9wZG93bi0tYWxpZ25cIik7XG4gICAgfVxuICB9KTtcblxuICAkKCcuc3ViLW1lbnUnKS5vbignbW91c2VsZWF2ZScsIGZ1bmN0aW9uKCl7XG4gICAgaWYoJCh0aGlzKS5maW5kKCcuZHJvcGRvd24nKS5oYXNDbGFzcygnZHJvcGRvd24tLWFsaWduJykpIHtcbiAgICAgICQodGhpcykuZmluZCgnLmRyb3Bkb3duJykucmVtb3ZlQ2xhc3MoXCJkcm9wZG93bi0tYWxpZ25cIik7XG4gICAgfVxuICB9KTtcblxuICAvLyBBY2Nlc3NpYmlsaXR5IHRhYmJpbmdcbiAgd2luZG93LmhlYWRlci5vcGVuRHJvcGRvd24oKTtcblxuICAvLyBMb2FkIEFjY29yZGlvbnNcbiAgdmFyIGFsbFBhbmVscyA9ICQoJy5hY2NvcmRpb24gPiBkZCcpO1xuXG4gIGZvcih2YXIgaSA9IDA7IGkgPCBhbGxQYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAkKGFsbFBhbmVsc1tpXSkuY3NzKCdoZWlnaHQnLCAkKGFsbFBhbmVsc1tpXSkub3V0ZXJIZWlnaHQoKSk7XG4gIH1cblxuICAgIGFsbFBhbmVscy5oaWRlKCk7XG5cbiAgJCgnLmFjY29yZGlvbiA+IGR0ID4gYScpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgIGlmKCEkKHRoaXMpLnBhcmVudCgpLm5leHQoKS5pcygnOnZpc2libGUnKSkge1xuICAgICAgYWxsUGFuZWxzLnNsaWRlVXAoKTtcbiAgICAgICQodGhpcykucGFyZW50KCkubmV4dCgpLnNsaWRlRG93bigpO1xuICAgICAgJCgnLmFjY29yZGlvbiBzbWFsbC5yaWdodCcpLmh0bWwoJyYjOTY2ODsnKTtcbiAgICAgICQodGhpcykuZmluZCgnc21hbGwucmlnaHQnKS5odG1sKCcmIzk2NjA7Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcblxuICAkKCcuYWNjb3JkaW9uIGRkOmZpcnN0LW9mLXR5cGUnKS5zaG93KCk7XG5cbiAgLy9Mb2FkIHNlY3Rpb25zXG4gIHdpbmRvdy5iYW5uZXJfaW1hZ2UuaW5p
1dCgpO1xuICB3aW5kb3cuaGVhZGVyLmluaXQoKTtcbiAgd2luZG93LmJhbm5lci5pbml0KCk7XG4gIHdpbmRvdy5tYXAuaW5pdCgpO1xuICB3aW5kb3cudmlkZW9UaGVtZS5pbml0KCk7XG4gIHdpbmRvdy5wcm9kdWN0LmluaXQoKTtcbiAgd2luZG93LmNvbGxlY3Rpb24uaW5pdCgpO1xuICB3aW5kb3cuY2FydC5pbml0KCk7XG4gIHdpbmRvdy5wcm9kdWN0Rm9ybUxpc3RlbmVycy5pbml0KCk7XG4gIHdpbmRvdy5mZWF0dXJlZF9wcm9tb3Rpb25zLmluaXQoKTtcbiAgd2luZG93LmFuaW1hdGVfY29udGVudC5pbml0KCk7XG4gIHdpbmRvdy5ibG9ncy5pbml0KCk7XG5cbiAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5lbmFibGVfcHJlZGljdGl2ZV9zZWFyY2gpIHtcbiAgICB3aW5kb3cucHJlZGljdGl2ZVNlYXJjaC5pbml0KCk7XG4gIH1cblxuICB2YXIgJGpzU2VjdGlvbnMgPSAkKCcuc2hvcGlmeS1zZWN0aW9uW2NsYXNzKj1qc10nKTtcblxuICAvLyBMb29wIHRocm91Z2ggc2VjdGlvbnMgd2l0aCBqcyBjbGFzc2VzIGFuZCBsb2FkIHRoZW0gaW5cbiAgdmFyICRqc1NlY3Rpb25OYW1lcyA9ICRqc1NlY3Rpb25zLmVhY2goZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jbGFzc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNsYXNzTGlzdFtpXS5zdWJzdHJpbmcoMCwgMikgPT09IFwianNcIil7XG4gICAgICAgIHZhciB0cmlnZ2VyQ2xhc3MgPSB0aGlzLmNsYXNzTGlzdFtpXTtcbiAgICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZVt0cmlnZ2VyQ2xhc3NdKSB7XG4gICAgICAgICAgLy9jb25zb2xlLmxvZygnU2VjdGlvbjogJyArIHRyaWdnZXJDbGFzcyArICcgaGFzIGJlZW4gbG9hZGVkLicpXG4gICAgICAgICAgd2luZG93LlBYVVRoZW1lW3RyaWdnZXJDbGFzc10uaW5pdCgkKHRoaXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvL2NvbnNvbGUud2FybignVWggb2gsICcgKyB0cmlnZ2VyQ2xhc3MgKyAnIGlzIHJlZmVyZW5jZWQgaW4gc2VjdGlvbiBzY2hlbWEgY2xhc3MsIGJ1dCBjYW4gbm90IGJlIGZvdW5kLiBNYWtlIHN1cmUgXCJ6X18nICsgdHJpZ2dlckNsYXNzICsgJy5qc1wiIGFuZCB3aW5kb3cuUFhVVGhlbWUuJyArIHRyaWdnZXJDbGFzcyArICcuaW5pdCgpIGZ1bmN0aW9uIGV4aXN0cy4nKTtcbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBvYmplY3RGaXRJbWFnZXMoKTtcblxuICBpZiAod2luZG93LlBYVVRoZW1lLmN1cnJlbmN5LnNoaXBwaW5nX2NhbGN1bGF0b3IgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2FydC1zaGlwcGluZ10nKSkge1xuICAgIGNvbnN0IHNoaXBwaW5nQ2FsY3VsYXRvciA9IG5ldyBTaGlwcGluZ0NhbGN1bGF0b3IoeyBlbDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2FydC1zaGlwcGluZ10nKSB9KTtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgUmVzcG9uc2l2ZSBWaWRlb3NcbiAgZW5hYmxlUmVzcG9uc2l2ZVZpZGVvV3JhcHBlcigpO1xuXG4gIHZhciAkaGVhZGVyID0gJChcIi5mZWF0dXJlX2ltYWdlIC5oZWFkZXJcIik7XG5cbiAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5zZWFyY2hfX3N1Ym1pdCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAkKHRoaXMpLnBhcmVudCgnZm9ybScpLnN1Ym1pdCgpO1xuICB9KTtcblxuICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnI3NlYXJjaC10b2dnbGUnLCBmdW5jdGlvbihlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3Njcm9sbC1sb2NrZWQnKTtcblxuICAgICQoJy5zZWFyY2gtZm9ybS0taGVhZGVyJykuY3NzKCdwYWRkaW5nLXRvcCcsICQoJy5oZWFkZXInKS5oZWlnaHQoKSArIDUwICsgJ3B4Jyk7XG5cbiAgICBpZigkKCcjc2VhcmNoJykuaXMoXCI6dmlzaWJsZVwiKSAmJiAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgPT0gMCkge1xuICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5oZWFkZXJfYmFja2dyb3VuZCA9PSBmYWxzZSkge1xuICAgICAgICAkaGVhZGVyLnJlbW92ZUNsYXNzKCdoZWFkZXItYmFja2dyb3VuZC0tdHJ1ZScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAkaGVhZGVyLmFkZENsYXNzKCdoZWFkZXItYmFja2dyb3VuZC0tdHJ1ZScpO1xuICAgIH1cblxuICAgIGlmKCQoJyNzZWFyY2gnKS5oYXNDbGFzcyhcImZhZGVJblwiKSkge1xuICAgICAgJCgnI3NlYXJjaCcpLnJlbW92ZUNsYXNzKFwiZmFkZUluXCIpLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgJCgnI3NlYXJjaCcpLnNob3coKS5hZGRDbGFzcyhcImZhZGVJblwiKTtcbiAgICAgIGNvbnN0IHNlYXJjaElucHV0ID0gJCgnI3NlYXJjaCcpLmZpbmQoJ1tkYXRhLXNlYXJjaC1pbnB1dF0nKTtcbiAgICAgIGNvbnN0IHNlYXJjaElucHV0TGVuZ3RoID0gc2VhcmNoSW5wdXQudmFsKCkubGVuZ3RoO1xuICAgICAgc2VhcmNoSW5wdXRbMF0uc2V0U2VsZWN0aW9uUmFuZ2Uoc2VhcmNoSW5wdXRMZW5ndGgsIHNlYXJjaElucHV0TGVuZ3RoKTtcbiAgICAgIHNlYXJjaElucHV0LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuICAgICAgdmFyIHNlYXJjaEZvcm0gPSAkKGUudGFyZ2V0KS5wYXJlbnRzKCcuc2VhcmNoLWZvcm0tLWhlYWRlcicpO1xuXG4gICAgICBpZihzZWFyY2hGb3JtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAkKCcjc2VhcmNoJykucmVtb3ZlQ2xhc3MoXCJmYWRlSW5cIikuaGlkZSgpO1xuICAgICAgICBkb2
1N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3Njcm9sbC1sb2NrZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSlcblxuICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGZsZXhzbGlkZXJcbiAgJCgnLnNsaWRlciwgLmZsZXhzbGlkZXI6bm90KC5ob21lcGFnZV9zbGlkZXIpJykuZmluZCgnbGknKS51bndyYXAoKTtcbiAgJCgnLnNsaWRlciwgLmZsZXhzbGlkZXI6bm90KC5ob21lcGFnZV9zbGlkZXIpJykuZmxpY2tpdHkoe1xuICAgIHBhZ2VEb3RzOiBmYWxzZSxcbiAgICBhdXRvUGxheTogNjAwMCxcbiAgICBpbWFnZXNMb2FkZWQ6IHRydWUsXG4gICAgbGF6eUxvYWQ6IDIsXG4gIH0pO1xuXG4gIHZhciBhcnJvd1NoYXBlID0gJzxzdmcgY2xhc3M9XCJmbGlja2l0eS1idXR0b24taWNvblwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDEzLjQ2IDI0LjA5XCI+PHRpdGxlPmZsaWNraXR5LWFycm93PC90aXRsZT48cG9seWdvbiBwb2ludHM9XCIxLjQxIDI0LjA5IDAgMjIuNjggMTAuNjMgMTIuMDUgMCAxLjQxIDEuNDEgMCAxMy40NiAxMi4wNSAxLjQxIDI0LjA5XCIvPjwvc3ZnPidcblxuICAkKCcuc2xpZGVyLCAuZmxleHNsaWRlcicpLmZpbmQoJy5mbGlja2l0eS1wcmV2LW5leHQtYnV0dG9uLm5leHQgLmZsaWNraXR5LWJ1dHRvbi1pY29uJykucmVwbGFjZVdpdGgoYXJyb3dTaGFwZSk7XG5cbiAgJCgnLnNsaWRlciwgLmZsZXhzbGlkZXInKS5maW5kKCcuZmxpY2tpdHktcHJldi1uZXh0LWJ1dHRvbi5wcmV2aW91cycpLmFkZENsYXNzKCdhcnJvdy1pcy1pbnZlcnNlJykuZmluZCgnLmZsaWNraXR5LWJ1dHRvbi1pY29uJykucmVwbGFjZVdpdGgoYXJyb3dTaGFwZSk7XG5cblxuICBpZiAod2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJykubWF0Y2hlcyA9PSBmYWxzZSkge1xuICAgIC8vTGlnaHRib3ggZGVmYXVsdCBvcHRpb25zXG4gICAgLy9odHRwczovL2ZhbmN5YXBwcy5jb20vZmFuY3lib3gvMy9kb2NzLyNvcHRpb25zXG4gICAgJC5mYW5jeWJveC5kZWZhdWx0cy5hbmltYXRpb25FZmZlY3QgPSAnZmFkZSc7XG4gICAgJC5mYW5jeWJveC5kZWZhdWx0cy50cmFuc2l0aW9uRWZmZWN0ID0gJ3NsaWRlJztcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLmhhc2ggPSBmYWxzZTtcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLmluZm9iYXIgPSBmYWxzZTtcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLnRvb2xiYXIgPSBmYWxzZTtcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLmFycm93cyA9IGZhbHNlO1xuICAgICQuZmFuY3lib3guZGVmYXVsdHMubG9vcCA9IHRydWU7XG4gICAgJC5mYW5jeWJveC5kZWZhdWx0cy5zbWFsbEJ0biA9IHRydWU7XG4gICAgJC5mYW5jeWJveC5kZWZhdWx0cy53aGVlbCA9IGZhbHNlO1xuICAgICQuZmFuY3lib3guZGVmYXVsdHMubGl2ZSA9IGZhbHNlO1xuICAgICQuZmFuY3lib3guZGVmYXVsdHMuem9vbSA9IGZhbHNlO1xuICAgICQuZmFuY3lib3guZGVmYXVsdHMuYnRuVHBsWydzbWFsbEJ0biddID0gJzxhIHRpdGxlPVwiQ2xvc2VcIiBkYXRhLWZhbmN5Ym94LWNsb3NlIGNsYXNzPVwiZmFuY3lib3gtaXRlbSBmYW5jeWJveC1jbG9zZVwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIj48L2E+JztcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLm1vYmlsZS5wcmV2ZW50Q2FwdGlvbk92ZXJsYXAgPSBmYWxzZTtcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLm1vYmlsZS50b29sYmFyID0gdHJ1ZTtcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLm1vYmlsZS5idXR0b25zID0gWydjbG9zZSddO1xuICAgICQuZmFuY3lib3guZGVmYXVsdHMubW9iaWxlLmNsaWNrU2xpZGUgPSAnY2xvc2UnO1xuICAgICQuZmFuY3lib3guZGVmYXVsdHMubW9iaWxlLmNsaWNrQ29udGVudCA9ICd6b29tJztcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLmFmdGVyTG9hZCA9IGZ1bmN0aW9uKGluc3RhbmNlLCBzbGlkZSkge1xuICAgICAgaWYgKGluc3RhbmNlLmN1cnJlbnQudHlwZSA9PSAnaW1hZ2UnKXtcbiAgICAgICAgc2xpZGUuJGNvbnRlbnQud3JhcElubmVyKCBcIjxkaXYgY2xhc3M9J2ZhbmN5Ym94LWltYWdlLXdyYXAnPjwvZGl2PlwiIClcbiAgICAgIH1cbiAgICAgIGlmIChpbnN0YW5jZS5ncm91cC5sZW5ndGggPiAxKXtcbiAgICAgICAgc2xpZGUuJGNvbnRlbnQuZmluZCgnLmZhbmN5Ym94LWltYWdlLXdyYXAnKS5hcHBlbmQoJzxhIHRpdGxlPVwiUHJldmlvdXNcIiBjbGFzcz1cImZhbmN5Ym94LWl0ZW0gZmFuY3lib3gtbmF2IGZhbmN5Ym94LXByZXYgc3MtaWNvblwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiBkYXRhLWZhbmN5Ym94LXByZXY+PHNwYW4gY2xhc3M9XCJpY29uLWNpcmNsZS1sZWZ0XCI+PC9zcGFuPjwvYT48YSB0aXRsZT1cIk5leHRcIiBjbGFzcz1cImZhbmN5Ym94LWl0ZW0gZmFuY3lib3gtbmF2IGZhbmN5Ym94LW5leHQgc3MtaWNvblwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiBkYXRhLWZhbmN5Ym94LW5leHQ+PHNwYW4gY2xhc3M9XCJpY29uLWNpcmNsZS1yaWdodFwiPjwvc3Bhbj48L2E+JylcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMaWdodGJveCBlZmZlY3QgZW5hYmxlZCBpZiByZWR1Y2UgbW90aW9uIGlzIG5vdCBlbmFibGVkXG4gICAgJCgnLmxpZ2h0Ym94JykuZmFuY3lib3goKTtcblxuICAgIC8vIEdhbGxlcnkgZmFuY3lib3ggaW5pdGlhbGl6YXRpb25cbiAgICAkKCdbcmVsPVwiZ2FsbGVyeVwiXScpLmZhbmN5Ym94KHtcbiAgICAgIGJhc2VDbGFzczogXCJnYWxsZXJ5LXNlY3Rpb25fX2xpZ2h0Ym94XCIsXG4gICAgICBjbGlja0NvbnRlbnQ6IFwibmV4dE9yQ2xvc2VcIlxuICAgIH0pO1xuXG4gICAgLy8gLy8gVHJpZ2dlciBmYW5jeWJveCBmbGlja2l0eSBwcm9kdWN0IGdhbGxlcnkgaW1hZ2VzXG4gICAgJCgnLnByb2R1Y3QtZ2FsbGVyeV9fbWFpbiAucHJvZHVjdC1nYWxsZXJ5X19pbWFnZSAuZmFuY3lib3gnKS5mYW5jeWJveCh7XG4gICAgICBiYXNlQ2xhc3M6ICdwcm9kdWN0LXNlY3Rpb25fX2xpZ2h0Ym94JyxcbiAgICAgIGNsaWNrQ29udGVudDogXCJuZXh0T3JDbG9zZVwiLFxuICAgICAgYmVmb3JlU2hvdzogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIEdyYWIgdGhlIGZhbmN5Ym94IGVsZW1lbnQgdGhhdCBpcyBiZWluZyBjbGlja2VkXG4gICAgICAgI
1HZhciAkZmFuY3lib3hJbWFnZUVsZW1lbnQgPSAkKHRoaXMub3B0cy4kb3JpZyk7XG5cbiAgICAgICAgLy8gQWRkIGFsdCB0byBmYW5jeWJveCBpbWFnZVxuICAgICAgICB2YXIgaW1hZ2VBbHQgPSAkZmFuY3lib3hJbWFnZUVsZW1lbnQuZGF0YSgnYWx0Jyk7XG4gICAgICAgICQoJy5mYW5jeWJveC1pbWFnZScpLmF0dHIoJ2FsdCcsIGltYWdlQWx0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmICh3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MubmV3c2xldHRlcl9wb3B1cCkge1xuICAgIG5ld3NsZXR0ZXJfcG9wdXAuaW5pdCgpO1xuICB9XG5cbiAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5jb2xsZWN0aW9uX3N3YXRjaGVzKSB7d2luZG93LlBYVVRoZW1lXG4gICAgaWYgKHdpbmRvdy5QWFVUaGVtZS5tZWRpYV9xdWVyaWVzLmxhcmdlLm1hdGNoZXMpIHtcbiAgICAgICQoJy50aHVtYm5haWwnKS5ob3ZlcihmdW5jdGlvbigpIHtcbiAgICAgICAgJCgnLnN3YXRjaCBzcGFuJywgJCh0aGlzKSkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZigkKHRoaXMpLmRhdGEoXCJpbWFnZVwiKS5pbmRleE9mKFwibm8taW1hZ2VcIikgPT0gLTEpIHtcbiAgICAgICAgICAgICQoJzxpbWcvPicpWzBdLnNyYyA9ICQodGhpcykuZGF0YShcImltYWdlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgJCgnLnN3YXRjaCBzcGFuJykuaG92ZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmKCQodGhpcykuZGF0YShcImltYWdlXCIpLmluZGV4T2YoXCJuby1pbWFnZVwiKSA9PSAtMSkge1xuICAgICAgICAgICQodGhpcykucGFyZW50cygnLnRodW1ibmFpbCcpLmZpbmQoJ2ltZycpLmF0dHIoJ3NyYycsICQodGhpcykuZGF0YShcImltYWdlXCIpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHRhYnMgPSAkKCd1bC50YWJzJyk7XG4gIHRhYnMuZWFjaChmdW5jdGlvbihpKSB7XG4gICAgdmFyIHRhYiA9ICQodGhpcykuZmluZCgnPiBsaSA+IGEnKTtcbiAgICB0YWIuY2xpY2soZnVuY3Rpb24oZSkge1xuICAgICAgdmFyIGNvbnRlbnRMb2NhdGlvbiA9ICQodGhpcykuYXR0cignaHJlZicpO1xuICAgICAgaWYoY29udGVudExvY2F0aW9uLmNoYXJBdCgwKT09XCIjXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0YWIucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgJCh0aGlzKS5wYXJlbnRzKCd1bC50YWJzJykubmV4dCgpLmZpbmQoY29udGVudExvY2F0aW9uKS5zaG93KCkuY3NzKHsnZGlzcGxheSc6ICdibG9jayd9KS5hZGRDbGFzcygnYWN0aXZlJykuc2libGluZ3MoKS5oaWRlKCkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICAvL1NpZGViYXIgdG9nZ2xlXG5cbiAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5tZW51LXRvZ2dsZScsIGZ1bmN0aW9uKGUpIHtcbiAgICB0b2dnbGVTaWRlYmFyTWVudXMoJCh0aGlzKSk7XG4gIH0pO1xuXG4gIHZhciBzaWRlYmFyVG91Y2hlZCA9IGZhbHNlO1xuICAkKGRvY3VtZW50KS5vbigndG91Y2hlbmQnLCAnLnRvZ2dsZSBzcGFuJywgZnVuY3Rpb24oZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh3aW5kb3cuUFhVVGhlbWUubWVkaWFfcXVlcmllcy5tZWRpdW0ubWF0Y2hlcyB8fCAkKHRoaXMpLnBhcmVudHMoJy5zaWRlYmFyJykuaGFzQ2xhc3MoJ3RvZ2dsZS1hbGwtLXRydWUnKSkge1xuICAgICAgdmFyICR0b2dnbGUgPSAkKHRoaXMpO1xuICAgICAgdG9nZ2xlU2lkZWJhckJsb2NrcygkdG9nZ2xlKTtcbiAgICAgIHNpZGViYXJUb3VjaGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xuXG4gICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcudG9nZ2xlIHNwYW4nLCBmdW5jdGlvbihlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKHdpbmRvdy5QWFVUaGVtZS5tZWRpYV9xdWVyaWVzLm1lZGl1bS5tYXRjaGVzIHx8ICQodGhpcykucGFyZW50cygnLnNpZGViYXInKS5oYXNDbGFzcygndG9nZ2xlLWFsbC0tdHJ1ZScpKSB7XG4gICAgICB2Y
1XIgJHRvZ2dsZSA9ICQodGhpcyk7XG4gICAgICBpZiAoIXNpZGViYXJUb3VjaGVkKSB7XG4gICAgICAgIHRvZ2dsZVNpZGViYXJCbG9ja3MoJHRvZ2dsZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gJChkb2N1bWVudCkub24oJ2tleXVwJywgJy50b2dnbGUgc3BhbicsIGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoISQoJ2JvZHknKS5oYXNDbGFzcygndXNlci1pcy10YWJiaW5nJykpIHJldHVybjtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAod2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubWVkaXVtLm1hdGNoZXMgfHwgJCh0aGlzKS5wYXJlbnRzKCcuc2lkZWJhcicpLmhhc0NsYXNzKCd0b2dnbGUtYWxsLS10cnVlJykpIHtcbiAgICAgICAgdmFyICR0b2dnbGUgPSAkKHRoaXMpO1xuICAgICAgICBpZiAoIXNpZGViYXJUb3VjaGVkKSB7XG4gICAgICAgICAgdG9nZ2xlU2lkZWJhckJsb2NrcygkdG9nZ2xlKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGlmICgkKFwiI2NvbnRhY3RfZm9ybVwiKS5sZW5ndGgpIHtcbiAgICB2YXIgY29udGFjdEZvcm1SZXNwb25zZSA9IHVybCgnP2N1c3RvbWVyX3Bvc3RlZCcpO1xuICAgIGlmIChjb250YWN0Rm9ybVJlc3BvbnNlKXtcbiAgICAgICQoJ2h0bWwsYm9keScpLmFuaW1hdGUoe1xuICAgICAgICBzY3JvbGxUb3A6ICQoXCIjY29udGFjdF9mb3JtXCIpLm9mZnNldCgpLnRvcFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5wcm9kdWN0X2Zvcm1fc3R5bGUgID09ICdzd2F0Y2hlcycpIHtcbiAgICAkKCcuc3dhdGNoIDpyYWRpbycpLmNoYW5nZShmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHRpb25JbmRleCA9ICQodGhpcykuY2xvc2VzdCgnLnN3YXRjaCcpLmF0dHIoJ2RhdGEtb3B0aW9uLWluZGV4Jyk7XG4gICAgICB2Y
1XIgb3B0aW9uVmFsdWUgPSAkKHRoaXMpLnZhbCgpO1xuICAgICAgJCh0aGlzKVxuICAgICAgICAuY2xvc2VzdCgnZm9ybScpXG4gICAgICAgIC5maW5kKCcuc2luZ2xlLW9wdGlvbi1zZWxlY3RvcicpXG4gICAgICAgIC5lcShvcHRpb25JbmRleClcbiAgICAgICAgLnZhbChvcHRpb25WYWx1ZSlcbiAgICAgICAgLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgIH0pO1xuICB9XG5cbiAgJCgnYm9keScpLm9uKFwiY2hhbmdlXCIsIFwiI2NhcnQgaW5wdXQucXVhbnRpdHlcIiwgZnVuY3Rpb24oKSB7XG4gICAgYWpheFVwZGF0ZUNhcnQoJCh0aGlzKS5kYXRhKCdsaW5lLWlkJyksICQodGhpcykudmFsKCksICQodGhpcykucGFyZW50cygnI2NhcnQnKSk7XG4gIH0pO1xuXG4gICQoJ2JvZHknKS5vbihcImNoYW5nZVwiLCBcIiNjYXJ0ICNjYXJ0LW5vdGVcIiwgZnVuY3Rpb24oKSB7XG4gICAgYWpheFN1Ym1pdENhcnQoKTtcbiAgfSk7XG5cbiAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5jYXJ0X2FjdGlvbiA9PSAnYWpheCcpIHtcbiAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLmFqYXgtc3VibWl0JywgZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdmFyICRhZGRUb0NhcnRGb3JtID0gJCh0aGlzKS5jbG9zZXN0KCdmb3JtJyk7XG4gICAgICB2YXIgJGFkZFRvQ2FydEJ0biA9ICRhZGRUb0NhcnRGb3JtLmZpbmQoJy5hZGRfdG9fY2FydCcpO1xuICAgICAgdGhpcy5yZWNpcGllbnRGb3JtID0gJGFkZFRvQ2FydEZvcm1bMF0ucXVlcnlTZWxlY3RvcignW2RhdGEtcmVjaXBpZW50LWZvcm1dJyk7XG5cbiAgICAgICQoJy53YXJuaW5nJykucmVtb3ZlKCk7XG5cbiAgICAgIGlmICh0aGlzLnJlY2lwaWVudE
1Zvcm0pIHtcbiAgICAgICAgdGhpcy5yZWNpcGllbnRGb3JtLmNsYXNzTGlzdC5yZW1vdmUoJ3JlY2lwaWVudC1mb3JtLS1oYXMtZXJyb3JzJyk7XG4gICAgICB9XG5cbiAgICAgICQuYWpheCh7XG4gICAgICAgIHVybDogJy9jYXJ0L2FkZC5qcycsXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbicsXG4gICAgICAgIHR5cGU6ICdwb3N0JyxcbiAgICAgICAgY2FjaGU6IGZhbHNlLFxuICAgICAgICBkYXRhOiAkYWRkVG9DYXJ0Rm9ybS5zZXJpYWxpemUoKSxcbiAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgJGFkZFRvQ2FydEJ0bi5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICRhZGRUb0NhcnRCdG4uZmluZCgnc3BhbicpLnJlbW92ZUNsYXNzKFwiem9vbUluXCIpLmFkZENsYXNzKCdhbmltYXRlZCB6b29tT3V0Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGl0ZW1EYXRhKSB7XG4gICAgICAgICAgJGFkZFRvQ2FydEJ0bi5maW5kKCdzcGFuJykudGV4dCh3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24ucHJvZHVjdF9hZGRfdG9fY2FydF9zdWNjZXNzKS5yZW1vdmVDbGFzcygnem9vbU91dCcpLmFkZENsYXNzKCdmYWRlSW4nKTtcblxuICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAkYWRkVG9DYXJ0QnRuLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAkYWRkVG9DYXJ0QnRuLmZpbmQoJ3NwYW4nKS5hZGRDbGFzcyhcImZhZGVPdXRcIikudGV4dCgkYWRkVG9DYXJ0QnRuLmRhdGEoJ2xhYmVsJykpLnJlbW92ZUNsYXNzKCdmYWRlSW4nKS5yZW1vdmVDbGFzcyhcImZhZGVPdXRcIikuYWRkQ2xhc3MoJ3pvb21JbicpO1xuICAgICAgICAgIH0sIDEwMDApO1xuXG4gICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogJy9jYXJ0LmpzJyxcbiAgICAgICAgICAgIGRhdGFUeXBlOiBcImpzb25cIixcbiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGNhcnQpIHtcbiAgICAgICAgICAgICAgcmVmcmVzaENhcnQoY2FydCk7XG4gICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ICQuZmFuY3lib3guY2xvc2UoKTsgJCgnLmNhcnQtYnV0dG9uJykuY2xpY2soKTsgfSwgNTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChYTUxIdHRwUmVxdWVzdCkgPT4ge1xuICAgICAgICAgIHZhciByZXNwb25zZSA9IGV2YWwoJygnICsgWE1MSHR0cFJlcXVlc3QucmVzcG9uc2VUZXh0ICsgJyknKTtcblxuICAgICAgICAgICQoJy53YXJuaW5nJykucmVtb3ZlKCk7XG5cbiAgICAgICAgICBsZXQgd2FybmluZztcblxuICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvcnMgJiYgcmVzcG9uc2UuZXJyb3JzLmVtYWlsKSB7XG4gICAgICAgICAgICB0aGlzLnJlY2lwaWVudE
1Zvcm0uY2xhc3NMaXN0LmFkZCgncmVjaXBpZW50LWZvcm0tLWhhcy1lcnJvcnMnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2FybmluZyA9ICc8cCBjbGFzcz1cIndhcm5pbmcgYW5pbWF0ZWQgYm91bmNlSW5cIj4nICsgcmVzcG9uc2UuZGVzY3JpcHRpb24ucmVwbGFjZSgnQWxsIDEgJywgJ0FsbCAnKSArICc8L3A+JztcbiAgICAgICAgICAgICRhZGRUb0NhcnRGb3JtLmFmdGVyKHdhcm5pbmcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICRhZGRUb0NhcnRCdG4ucmVtb3ZlQXR0cignZGlzYWJsZWQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTtcbiAgICAgICAgICAkYWRkVG9DYXJ0QnRuLmZpbmQoJ3NwYW4nKS50ZXh0KHdpbmRvdy5QWFVUaGVtZS50cmFuc2xhdGlvbi5wcm9kdWN0X2FkZF90b19jYXJ0KS5yZW1vdmVDbGFzcygnem9vbU91dCcpLmFkZENsYXNzKCd6b29tSW4nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG5cblxuICAvLyBWYXJpYWJsZSByZXR1cm5zIHRydWUvZmFsc2UgaWYgcmVkdWNlZCBtb3Rpb24gaXMgZW5hYmxlZFxuICB2YXIgcmVkdWNlZE1vdGlvbiA9IHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScpLm1hdGNoZXM7XG5cbiAgLy8gRmluZCBpbnN0YW5jZXMgb2YgZmxleHNsaWRlciBhbmQgcGF1c2Ugc2xpZGVzaG93XG4gIGlmIChyZWR1Y2VkTW90aW9uKSB7XG4gICAgJCgnLmZsZXhzbGlkZXInKS5mbGV4c2xpZGVyKCdwYXVzZScpO1xuICB9XG5cbn0pO1xuXG5cbndpbmRvdy5zZWxlY3RDYWxsYmFjayA9IGZ1bmN0aW9uKHZhcmlhbnQsIHNlbGVjdG9yKSB7XG4gIHZhciAkcHJvZHVjdCA9ICQoJy5wcm9kdWN0LScgKyBzZWxlY3Rvci5wcm9kdWN0LmlkKTtcbiAgdmFyICRub3RpZnlfZm9ybSA9ICQoJy5ub3RpZnktZm9ybS0nICsgc2VsZWN0b3IucHJvZHVjdC5pZCk7XG4gIHZhciAkcHJvZHVjdEZvcm0gPSAkKCcucHJvZHVjdF9mb3JtJywgJHByb2R1Y3QpO1xuICB2YXIgdmFyaWFudEludmVudG9yeSA9ICRwcm9kdWN0Rm9ybS5kYXRhKCd2YXJpYW50LWludmVudG9yeScpO1xuXG4gIHZhciAkbm90aWZ5Rm9ybUlucHV0cyA9ICQoJy5ub3RpZnlfZm9ybV9faW5wdXRzJyk7XG5cbiAgdmFyIG5vdGlmeUVtYWlsID0gXCJ7eyAncHJvZHVjdHMubm90aWZ5X2Zvcm0uZW1haWwnIHwgdCB9fVwiO1xuICB2YXIgbm90aWZ5RW1haWxWYWx1ZSA9IFwie3sgY29udGFjdC5maWVsZHMuZW1haWwgfX1cIjtcbiAgdmFyIG5vdGlmeVNlbmQgPSBcInt7ICdwcm9kdWN0cy5ub3RpZnlfZm9ybS5zZW5kJyB8IHQgfX1cIjtcblxuICBpZih2YXJpYW50KSB7XG4gICAgaWYodmFyaWFudC5uYW1lICE9IG51bGwpIHtcbiAgICAgIHZhciBub3RpZnlNZXNzYWdlID0gJG5vdGlmeUZvcm1JbnB1dHMuZGF0YSgnbm90aWZ5LW1lc3NhZ2UnKSArICcgLSAnICsgdmFyaWFudC5uYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICB2Y
1XIgbm90aWZ5TWVzc2FnZSA9ICRub3RpZnlGb3JtSW5wdXRzLmRhdGEoJ25vdGlmeS1tZXNzYWdlJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCRub3RpZnlGb3JtSW5wdXRzLmhhc0NsYXNzKCdjdXN0b21lci0tdHJ1ZScpKSB7XG4gICAgdmFyIG5vdGlmeUN1c3RvbWVyRW1haWwgPSAkbm90aWZ5Rm9ybUlucHV0cy5kYXRhKCdjdXN0b21lci1lbWFpbCcpO1xuICAgIHZhciBub3RpZnlFbWFpbElucHV0ID0gJzxpbnB1dCByZXF1aXJlZCB0eXBlPVwiZW1haWxcIiBjbGFzcz1cIm5vdGlmeV9lbWFpbFwiIG5hbWU9XCJjb250YWN0W2VtYWlsXVwiIGlkPVwiY29udGFjdFtlbWFpbF1cIiB2YWx1ZT1cIicrIG5vdGlmeUN1c3RvbWVyRW1haWwgKydcIiAvPidcbiAgfSBlbHNlIHtcbiAgICB2YXIgbm90aWZ5RW1haWxJbnB1dCA9ICc8aW5wdXQgcmVxdWlyZWQgdHlwZT1cImVtYWlsXCIgY2xhc3M9XCJub3RpZnlfZW1haWxcIiBuYW1lPVwiY29udGFjdFtlbWFpbF1cIiBpZD1cImNvbnRhY3RbZW1haWxdXCIgcGxhY2Vob2xkZXI9XCInKyBub3RpZnlFbWFpbCArJ1wiIHZhbHVlPVwiJysgbm90aWZ5RW1haWxWYWx1ZSArJ1wiIC8+JztcbiAgfVxuICB2YXIgbm90aWZ5Rm9ybUhUTUwgPSBub3RpZnlFbWFpbElucHV0Kyc8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJjaGFsbGVuZ2VcIiB2YWx1ZT1cImZhbHNlXCIgLz48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJjb250YWN0W2JvZHldXCIgY2xhc3M9XCJub3RpZnlfZm9ybV9tZXNzYWdlXCIgZGF0YS1ib2R5PVwiJysgbm90aWZ5TWVzc2FnZSArJ1wiIHZhbHVlPVwiJysgbm90aWZ5TWVzc2FnZSArJ1wiIC8+PGlucHV0IGNsYXNzPVwiYWN0aW9uX2J1dHRvblwiIHR5cGU9XCJzdWJtaXRcIiB2YWx1ZT1cIicrIG5vdGlmeVNlbmQgKyAnXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjBweFwiIC8+JztcblxuICAvLyBJbWFnZSB2YXJpYW50IGZlYXR1cmVcbiAgaWYgKHZhcmlhbnQgJiYgdmFyaWFudC5mZWF0dXJlZF9pbWFnZSAmJiAkcHJvZHVjdC5pcyhcIjp2aXNpYmxlXCIpKSB7XG4gICAgdmFyICRzbGlkZXJzID0gJCgnLnByb2R1Y3QtZ2FsbGVyeV9fbWFpbicsICRwcm9kdWN0KTtcbiAgICAkc2xpZGVycy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyICRzbGlkZXIgPSAkKHRoaXMpO1xuICAgICAgdmFyICRzbGlkZXJJbnN0YW5jZSA9IEZsaWNraXR5LmRhdGEodGhpcyk7XG4gICAgICBpZiAoJHNsaWRlci5pcyhcIjp2aXNpYmxlXCIpICYmICRzbGlkZXJJbnN0YW5jZSAhPSB1bmRlZmluZWQgKSB7XG4gICAgICAgIHZhciBpbmRleCA9ICQoJ1tkYXRhLWltYWdlLWlkPVwiJyArIHZhcmlhbnQuZmVhdHVyZWRfaW1hZ2UuaWQgKyAnXCJdJykuZGF0YSgnaW5kZXgnKTtcbiAgICAgICAgJHNsaWRlckluc3RhbmNlLnNlbGVjdCggaW5kZXgsIGZhbHNlLCB0cnVlICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAodmFyaWFudCkge1xuICAgIGlmICh2YXJpYW50SW52ZW50b3J5KSB7XG4gICAgICB2Y
1XJpYW50SW52ZW50b3J5LmZvckVhY2goZnVuY3Rpb24odil7XG4gICAgICAgIGlmICh2LmlkID09PSB2YXJpYW50LmlkKSB7XG4gICAgICAgICAgdmFyaWFudC5pbnZlbnRvcnlfcXVhbnRpdHkgPSB2LmludmVudG9yeV9xdWFudGl0eTtcbiAgICAgICAgICB2YXJpYW50LmludmVudG9yeV9tYW5hZ2VtZW50ID0gdi5pbnZlbnRvcnlfbWFuYWdlbWVudDtcbiAgICAgICAgICB2YXJpYW50LmludmVudG9yeV9wb2xpY3kgPSB2LmludmVudG9yeV9wb2xpY3k7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgICQoJy5za3Ugc3BhbicsICRwcm9kdWN0KS50ZXh0KHZhcmlhbnQuc2t1KTtcblxuICAgIGlmICh3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MucHJvZHVjdF9mb3JtX3N0eWxlICA9PSAnc3dhdGNoZXMnKSB7XG4gICAgICBmb3IgKGxldCBpPTAsbGVuZ3RoPXZhcmlhbnQub3B0aW9ucy5sZW5ndGg7IGk8bGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJhZGlvQnV0dG9uID0gJHByb2R1Y3RGb3JtLmZpbmQoJy5zd2F0Y2hbZGF0YS1vcHRpb24taW5kZXg9XCInICsgZXNjYXBlKGkpICsgJ1wiXSA6cmFkaW9bdmFsdWU9XCInICsgdmFyaWFudC5vcHRpb25zW2ldLnJlcGxhY2UoL1xcXCIvZywnXFxcXFwiJykgKydcIl0nKTtcbiAgICAgICAgaWYgKHJhZGlvQnV0dG9uLmxlbmd0aCkge1xuICAgICAgICAgIHJhZGlvQnV0dG9uLmdldCgwKS5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgY29uc3QgJHVuaXRQcmljZSA9ICQoJy5wcm9kdWN0LWRldGFpbHNfX3VuaXQtcHJpY2UnLCAkcHJvZHVjdCk7XG4gICR1bml0UHJpY2UucmVtb3ZlQ2xhc3MoJ3Byb2R1Y3QtZGV0YWlsc19fdW5pdC1wcmljZS0taGlkZGVuJyk7XG5cbiAgaWYgKHZhcmlhbnQgJiYgdmFyaWFudC5hdmFpbGFibGUgPT0gdHJ1ZSkge1xuXG4gICAgaWYodmFyaWFudC5wcmljZSA8IHZhcmlhbnQuY29tcGFyZV9hdF9wcmljZSl7XG4gICAgICAkKCcud2FzX3ByaWNlJywgJHByb2R1Y3QpLmh0bWwoJzxzcGFuIGNsYXNzPVwibW9uZXlcIj4nICsgU2hvcGlmeS5mb3JtYXRNb25leSh2YXJpYW50LmNvbXBhcmVfYXRfcHJpY2UsICQoJ2JvZHknKS5kYXRhKCdtb25leS1mb3JtYXQnKSkgKyAnPC9zcGFuPicpO1xuICAgICAgJCgnLmN1cnJlbnRfcHJpY2UnLCAkcHJvZHVjdCkucGFyZW50KCkuYWRkQ2xhc3MoJ3NhbGUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgJCgnLndhc19wcmljZScsICRwcm9kdWN0KS5odG1sKCcnKVxuICAgICAgJCgnLmN1cnJlbnRfcHJpY2UnLCAkcHJvZHVjdCkucGFyZW50KCkucmVtb3ZlQ2xhc3MoJ3NhbGUnKTtcbiAgICB9XG5cbiAgICBpZiAodmFyaWFudC5pbnZlbnRvcnlfbWFuYWdlbWVudCAmJiB2YXJpYW50LmludmVudG9yeV9xdWFudGl0eSA+IDApIHtcbiAgICAgIGlmICh3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MuZGlzcGxheV9pbnZlbnRvcnlfbGVmdCkge1xuICAgICAgICBpZiAodmFyaWFudC5pbnZlbnRvcnlfcXVhbnRpdHkgPT0gMSkge1xuICAgICAgICAgIHZhciBpdGVtc19sZWZ0X3RleHQgPSB3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uaXRlbXNfbGVmdF9jb3VudF9vbmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGl0ZW1zX2xlZnRfdGV4dCA9IHdpbmRvdy5QWFVUaGVtZS50cmFuc2xhdGlvbi5pdGVtc19sZWZ0X2NvdW50X290aGVyO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbnZlbnRvcnlUaHJlc2hvbGQgPSB3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MuaW52ZW50b3J5X3RocmVzaG9sZDtcblxuICAgICAgICBpZiAodmFyaWFudC5pbnZlbnRvcnlfcXVhbnRpdHkgPD0gaW52ZW50b3J5VGhyZXNob2xkICkge1xuICAgICAgICAgICQoJy5pdGVtc19sZWZ0JywgJHByb2R1Y3QpLmh0bWwoXCI8cD48ZW0+XCIgKyB2YXJpYW50LmludmVudG9yeV9xdWFudGl0eSArIFwiIFwiICsgaXRlbXNfbGVmdF90ZXh0ICsgXCI8L2VtPjwvcD5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJCgnLml0ZW1zX2xlZnQnLCAkcHJvZHVjdCkuaHRtbChcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5saW1pdF9xdWFudGl0eSkge1xuICAgICAgICBpZih2YXJpYW50LmludmVudG9yeV9wb2x
1pY3kgPT0gXCJkZW55XCIpIHtcbiAgICAgICAgICAkKCcucXVhbnRpdHknLCAkcHJvZHVjdCkuYXR0cignbWF4JywgdmFyaWFudC5pbnZlbnRvcnlfcXVhbnRpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICQoJy5pdGVtc19sZWZ0JywgJHByb2R1Y3QpLnRleHQoJycpO1xuICAgICAgJCgnLnF1YW50aXR5JywgJHByb2R1Y3QpLnJlbW92ZUF0dHIoJ21heCcpO1xuICAgIH1cblxuICAgIC8vIEVtcHR5IHNvbGQgb3V0IHRleHRcbiAgICAkKCcuc29sZF9vdXQnLCAkcHJvZHVjdCkudGV4dCgnJyk7XG5cbiAgICAvLyBTaG93IHByaWNlLCBvdGhlcndpc2UsIHNob3cgZnJlZSBwcmljZSB0ZXh0XG4gICAgaWYgKHZhcmlhbnQucHJpY2UgPiAwKSB7XG4gICAgICAkKCcuY3VycmVudF9wcmljZScsICRwcm9kdWN0KS5odG1sKCc8c3BhbiBjbGFzcz1cIm1vbmV5XCI+JyArIFNob3BpZnkuZm9ybWF0TW9uZXkodmFyaWFudC5wcmljZSwgJCgnYm9keScpLmRhdGEoJ21vbmV5LWZvcm1hdCcpKSArICc8L3NwYW4+Jyk7XG4gICAgICBpZiAod2luZG93LnByb2R1Y3QudW5pdFByaWNpbmcodmFyaWFudCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAkdW5pdFByaWNlLmh0bWwod2luZG93LnByb2R1Y3QudW5pdFByaWNpbmcodmFyaWFudCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJHVuaXRQcmljZS5hZGRDbGFzcygncHJvZHVjdC1kZXRhaWxzX191bml0LXByaWNlLS1oaWRkZW4nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgJCgnLmN1cnJlbnRfcHJpY2UnLCAkcHJvZHVjdCkuaHRtbCh3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MuZnJlZV9wcmljZV90ZXh0KTtcbiAgICAgICR1bml0UHJpY2UuYWRkQ2xhc3MoJ3Byb2R1Y3QtZGV0YWlsc19fdW5pdC1wcmljZS0taGlkZGVuJyk7XG4gICAgfVxuXG4gICAgJCgnLm1vZGFsX3ByaWNlJywgJHByb2R1Y3QpLnJlbW92ZUNsYXNzKCdtb2RhbF9wcmljZS0tc29sZC1vdXQnKVxuXG4gICAgJCgnLmFkZF90b19jYXJ0JywgJHByb2R1Y3QpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJykuZmluZCgnc3BhbicpLnRleHQoJCgnLmFkZF90b19jYXJ0JywgJHByb2R1Y3QpLmRhdGEoJ2xhYmVsJykpO1xuXG4gICAgJCgnLmN1cnJlbnRfcHJpY2UnKS5zaG93KCk7XG4gICAgJCgnLndhc19wcmljZScpLnNob3coKTtcblxuICAgIC8vIEhpZGUgdGhlIGJhY2sgaW4gc3RvY2sgbm90aWZpY2F0aW9uIGZvcm1cbiAgICAkbm90aWZ5X2Zvcm0uaGlkZSgpO1xuXG4gICAgLy8gU2hvdyB0aGUgcXVhbnRpdHkgZmllbGRcbiAgICAkKCcucHVyY2hhc2UtZGV0YWlsc19fcXVhbnRpdHknLCAkcHJvZHVjdCkuc2hvdygpO1xuXG4gICAgLy8gUmVtb3ZlIGRpc2FibGUgZnJvbSBhY3Rpb24gYnV0dG9uc1xuICAgICQoJy5hdGMtYnRuLWNvbnRhaW5lcicsICRwcm9kdWN0KS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTtcblxuICB9IGVsc2Uge1xuICAgIHZhciBtZXNzYWdlID0gdmFyaWFudCA/IHdpbmRvdy5QWFVUaGVtZS50cmFuc2xhdGlvbi5wcm9kdWN0X3NvbGRfb3V0IDogd2luZG93LlBYVVRoZW1lLnRyYW5zbGF0aW9uLnByb2R1Y3RfdW5hdmFpbGFibGU7XG5cbiAgICAvLyBIaWRlIHRoZSBxdWFudGl0eSBmaWVsZFxuICAgICQoJy5wdXJjaGFzZS1kZXRhaWxzX19xdWFudGl0eScsICRwcm9kdWN0KS5oaWRlKCk7XG5cbiAgICAvLyBTaG93IHRoZSBwcmljZSBhbmQgY2hhbmdlIHRoZSBhZGQgdG8gY2FydCBhbmQgc29sZCBvdXQgdGV4dFxuICAgICQoJy5tb2RhbF9wcmljZScsICRwcm9kdWN0KS5hZGRDbGFzcygnbW9kYWxfcHJpY2UtLXNvbGQtb3V0JylcbiAgICAkKCcud2FzX3ByaWNlJywgJHByb2R1Y3QpLmh0bWwoJycpO1xuICAgICQoJy5pdGVtc19sZWZ0JywgJHByb2R1Y3QpLnRleHQoJycpO1xuICAgICQoJy5xdWFudGl0eScsICRwcm9kdWN0KS5yZW1vdmVBdHRyKCdtYXgnKTtcbiAgICAkKCcuc29sZF9vdXQnLCAkcHJvZHVjdCkudGV4dCgnIC0gJyArIG1lc3NhZ2UpO1xuXG4gICAgLy8gRGlzYWJsZSB0aGUgYWRkIHRvIGNhcnQgYnV0dG9uIGFuZCBTaG9waWZ5IHBheW1lbnQgYnV0dG9uIHdoZW4gYSB2YXJpYW50IGlzIHNvbGQgb3V0XG4gICAgJCgnLmF0Yy1idG4tY29udGFpbmVyJywgJHByb2R1Y3QpLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xuICAgICQoJy5hZGRfdG9fY2FydCcsICRwcm9kdWN0KS5hZGRDbGFzcygnZGlzYWJsZWQnKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpLmZpbmQoJ3NwYW4nKS50ZXh0KG1lc3NhZ2UpO1xuXG4gICAgLy9IaWRlIHRoZSBiYWNrIGluIHN0b2NrIG5vdGlmaWNhdGlvbiBmb3JtXG4gICAgJG5vdGlmeV9mb3JtLmhpZGUoKTtcbiAgICAkbm90aWZ5Rm9ybUlucHV0cy5lbXB0eSgpO1xuXG4gICAgaWYgKHZhcmlhbnQgJiYgIXZhcmlhbnQuYXZhaWxhYmxlKSB7XG4gICAgICAkKCcuY3VycmVudF9wcmljZScpLnNob3coKTtcbiAgICAgICQoJy53YXNfcHJpY2UnKS5zaG93KCk7XG4gICAgICAvLyBTaG93IHRoZSB2YXJpYW50IHByaWNlLCBvdGhlcndpc2UsIHNob3cgdGhlIGZyZWUgcHJpY2UgdGV4dFxuICAgICAgaWYgKHZhcmlhbnQucHJpY2UgPiAwKSB7XG4gICAgICAgICQoJy5jdXJyZW50X3ByaWNlJywgJHByb2R1Y3QpLmh0bWwoJzxzcGFuIGNsYXNzPVwibW9uZXlcIj4nICsgU2hvcGlmeS5mb3JtYXRNb25leSh2YXJpYW50LnByaWNlLCAkKCdib2R5JykuZGF0YSgnbW9uZXktZm9ybWF0JykpICsgJzwvc3Bhbj4nKTtcbiAgICAgICAgaWYgKHdpbmRvdy5wcm9kdWN0LnVuaXRQcmljaW5nKHZhcmlhbnQpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAkdW5pdFByaWNlLmh0bWwod2luZG93LnByb2R1Y3QudW5pdFByaWNpbmcodmFyaWFudCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICR1bml0UHJpY2UuYWRkQ2xhc3MoJ3Byb2R1Y3QtZGV0YWlsc19fdW5pdC1wcmljZS0taGlkZGVuJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoJy5jdXJyZW50X3ByaWNlJywgJHByb2R1Y3QpLmh0bWwod2luZG93LlBYVVRoZW1lLnRoZW
11lX3NldHRpbmdzLmZyZWVfcHJpY2VfdGV4dCk7XG4gICAgICAgICR1bml0UHJpY2UuYWRkQ2xhc3MoJ3Byb2R1Y3QtZGV0YWlsc19fdW5pdC1wcmljZS0taGlkZGVuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdoZW4gYSB2YXJpYW50IGlzIHNvbGQgb3V0IGJ1dCBvbiBzYWxlXG4gICAgICBpZih2YXJpYW50LnByaWNlIDwgdmFyaWFudC5jb21wYXJlX2F0X3ByaWNlKXtcbiAgICAgICAgJCgnLndhc19wcmljZScsICRwcm9kdWN0KS5odG1sKCc8c3BhbiBjbGFzcz1cIm1vbmV5XCI+JyArIFNob3BpZnkuZm9ybWF0TW9uZXkodmFyaWFudC5jb21wYXJlX2F0X3ByaWNlLCAkKCdib2R5JykuZGF0YSgnbW9uZXktZm9ybWF0JykpICsgJzwvc3Bhbj4nKTtcbiAgICAgICAgJCgnLmN1cnJlbnRfcHJpY2UnLCAkcHJvZHVjdCkucGFyZW50KCkuYWRkQ2xhc3MoJ3NhbGUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoJy53YXNfcHJpY2UnLCAkcHJvZHVjdCkuaHRtbCgnJylcbiAgICAgICAgJCgnLmN1cnJlbnRfcHJpY2UnLCAkcHJvZHVjdCkucGFyZW50KCkucmVtb3ZlQ2xhc3MoJ3NhbGUnKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdyB0aGUgYmFjayBpbiBzdG9jayBub3RpZmljYXRpb24gZm9ybVxuICAgICAgJG5vdGlmeV9mb3JtLmZhZGVJbigpO1xuICAgICAgJG5vdGlmeUZvcm1JbnB1dHMuZW1wdHkoKTtcbiAgICAgICRub3RpZnlGb3JtSW5wdXRzLmFwcGVuZChub3RpZnlGb3JtSFRNTCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQoJy5zb2xkX291dCcsICRwcm9kdWN0KS50ZXh0KG1lc3NhZ2UpO1xuICAgICAgJHVuaXRQcmljZS5hZGRDbGFzcygncHJvZHVjdC1kZXRhaWxzX191bml0LXByaWNlLS1oaWRkZW4nKVxuICAgICAgLy8gV2hlbiBhIHZhcmlhbnQgaXMgc3BlY2lmaWNhbGx5IHVuYXZhaWxhYmxlXG4gICAgICAkKCcuY3VycmVudF9wcmljZScpLmhpZGUoKTtcbiAgICAgICQoJy53YXNfcHJpY2UnKS5oaWRlKCk7XG4gICAgfVxuXG4gIH1cblxuICAkcHJvZHVjdEZvcm0ucmVtb3ZlQ2xhc3MoXCJpbml0XCIpO1xufTtcblxuZnVuY3Rpb24gaHRtbEVuY29kZSh2YWx1ZSl7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAkKCc8ZGl2Lz4nKS50ZXh0KHZhbHVlKS5odG1sKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbn1cblxud2luZG93LlNob3BpZnkudXBkYXRlT3B0aW9uc0luU2VsZWN0b3IgPSBmdW5jdGlvbihzZWxlY3RvckluZGV4LCBwYXJlbnQpIHtcblxuICBzd2l0Y2ggKHNlbGVjdG9ySW5kZXgpIHtcbiAgICBjYXNlIDA6XG4gICAgICB2Y
1XIga2V5ID0gJ3Jvb3QnO1xuICAgICAgdmFyIHNlbGVjdG9yID0gJChwYXJlbnQgKyAnIC5zaW5nbGUtb3B0aW9uLXNlbGVjdG9yOmVxKDApJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICB2YXIga2V5ID0gJChwYXJlbnQgKyAnIC5zaW5nbGUtb3B0aW9uLXNlbGVjdG9yOmVxKDApJykudmFsKCk7XG4gICAgICB2YXIgc2VsZWN0b3IgPSAkKHBhcmVudCArICcgLnNpbmdsZS1vcHRpb24tc2VsZWN0b3I6ZXEoMSknKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIHZhciBrZXkgPSAkKHBhcmVudCArICcgLnNpbmdsZS1vcHRpb24tc2VsZWN0b3I6ZXEoMCknKS52YWwoKTtcbiAgICAgIGtleSArPSAnIC8gJyArICQocGFyZW50ICsgJyAuc2luZ2xlLW9wdGlvbi1zZWxlY3RvcjplcSgxKScpLnZhbCgpO1xuICAgICAgdmFyIHNlbGVjdG9yID0gJChwYXJlbnQgKyAnIC5zaW5nbGUtb3B0aW9uLXNlbGVjdG9yOmVxKDIpJyk7XG4gIH1cblxuICB2YXIgYXZhaWxhYmxlT3B0aW9ucyA9IFNob3BpZnkub3B0aW9uc01hcFtrZXldO1xuXG4gICQocGFyZW50ICsgJyAuc3dhdGNoW2RhdGEtb3B0aW9uLWluZGV4PVwiJyArIHNlbGVjdG9ySW5kZXggKyAnXCJdIC5zd2F0Y2gtZWxlbWVudCcpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgaWYgKCQuaW5BcnJheSgkKHRoaXMpLmF0dHIoJ2RhdGEtdmFsdWUnKSwgYXZhaWxhYmxlT3B0aW9ucykgIT09IC0xKSB7XG4gICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdzb2xkb3V0JykuZmluZCgnOnJhZGlvJykucmVtb3ZlQXR0cignZGlzYWJsZWQnLCdkaXNhYmxlZCcpLnJlbW92ZUF0dHIoJ2NoZWNrZWQnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAkKHRoaXMpLmFkZENsYXNzKCdzb2xkb3V0JykuZmluZCgnOnJhZGlvJykucmVtb3ZlQXR0cignY2hlY2tlZCcpLmF0dHIoJ2Rpc2FibGVkJywnZGlzYWJsZWQnKTtcbiAgICB9XG4gIH0pO1xuICBzZWxlY3Rvci50cmlnZ2VyKCdjaGFuZ2UnKTtcblxufTtcblxuLyogTGlua2VkIE9wdGlvbiBTZWxlY3RvcnMgKi9cblNob3BpZnkubGlua09wdGlvblNlbGVjdG9ycyA9IGZ1bmN0aW9uKHByb2R1Y3QsIHBhcmVudCkge1xuICAgIC8vIEJ1aWxkaW5nIG91ciBtYXBwaW5nIG9iamVjdC5cbiAgICBTaG9waWZ5Lm9wdGlvbnNNYXAgPSB7fTtcbiAgICBmb3IgKGxldCBpPTA7IGk8cHJvZHVjdC52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhcmlhbnQgPSBwcm9kdWN0LnZhcmlhbnRzW2ldO1xuICAgICAgaWYgKHZhcmlhbnQuYXZhaWxhYmxlKSB7XG4gICAgICAgIC8vIEdhdGhlcmluZyB2YWx1ZXMgZm9yIHRoZSAxc3QgZHJvcC1kb3duLlxuICAgICAgICBTaG9waWZ5Lm9wdGlvbnNNYXBbJ3Jvb3QnXSA9IFNob3BpZnkub3B0aW9uc01hcFsncm9vdCddIHx8IFtdO1xuICAgICAgICBTaG9waWZ5Lm9wdGlvbnNNYXBbJ3Jvb3QnXS5wdXNoKHZhcmlhbnQub3B0aW9uMSk7XG4gICAgICAgIFNob3BpZnkub3B0aW9uc01hcFsncm9vdCddID0gU2hvcGlmeS51bmlxKFNob3BpZnkub3B0aW9uc01hcFsncm9vdCddKTtcbiAgICAgICAgLy8gR2F0aGVyaW5nIHZhbHVlcyBmb3IgdGhlIDJuZCBkcm9wLWRvd24uXG4gICAgICAgIGlmIChwcm9kdWN0Lm9wdGlvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHZhciBrZXkgPSB2YXJpYW50Lm9wdGlvbjE7XG4gICAgICAgICAgU2hvcGlmeS5vcHRpb25zTWFwW2tleV0gPSBTaG9waWZ5Lm9wdGlvbnNNYXBba2V5XSB8fCBbXTtcbiAgICAgICAgICBTaG9waWZ5Lm9wdGlvbnNNYXBba2V5XS5wdXNoKHZhcmlhbnQub3B0aW9uMik7XG4gICAgICAgICAgU2hvcGlmeS5vcHRpb25zTWFwW2tleV0gPSBTaG9waWZ5LnVuaXEoU2hvcGlmeS5vcHRpb25zTWFwW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdhdGhlcmluZyB2YWx1ZXMgZm9yIHRoZSAzcmQgZHJvcC1kb3duLlxuICAgICAgICBpZiAocHJvZHVjdC5vcHRpb25zLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgIHZhciBrZXkgPSB2YXJpYW50Lm9wdGlvbjEgKyAnIC8gJyArIHZhcmlhbnQub3B0aW9uMjtcbiAgICAgICAgICBTaG9waWZ5Lm9wdGlvbnNNYXBba2V5XSA9IFNob3BpZnkub3B0aW9uc01hcFtrZXldIHx8IFtdO1xuICAgICAgICAgIFNob3BpZnkub3B0aW9uc01hcFtrZXldLnB1c2godmFyaWFudC5vcHRpb24zKTtcbiAgICAgICAgICBTaG9waWZ5Lm9wdGlvbnNNYXBba2V5XSA9IFNob3BpZnkudW5pcShTaG9waWZ5Lm9wdGlvbnNNYXBba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gVXBkYXRlIG9wdGlvbnMgcmlnaHQgYXdheS5cbiAgICB3aW5kb3cuU2hvcGlmeS51cGRhdGVPcHRpb25zSW5TZWxlY3RvcigwLCBwYXJlbnQpO1xuICAgIGlmIChwcm9kdWN0Lm9wdGlvbnMubGVuZ3RoID4gMSkgd2luZG93LlNob3BpZnkudXBkYXRlT3B0aW9uc0luU2VsZWN0b3IoMSwgcGFyZW50KTtcbiAgICBpZiAocHJvZHVjdC5vcHRpb25zLmxlbmd0aCA9PT0gMykgd2luZG93LlNob3BpZnkudXBkYXRlT3B0aW9uc0luU2VsZWN0b3IoMiwgcGFyZW50KTtcbiAgICAvLyBXaGVuIHRoZXJlIGlzIGFuIHVwZGF0ZSBpbiB0aGUgZmlyc3QgZHJvcGRvd24uXG4gICAgJChwYXJlbnQgKyBcIiAuc2luZ2xlLW9wdGlvbi1zZWxlY3RvcjplcSgwKVwiKS5jaGFuZ2UoZnVuY3Rpb24oKSB7XG4gICAgICB3aW5kb3cuU2hvcGlmeS51cGRhdGVPcHRpb25zSW5TZWxlY3RvcigxLCBwYXJlbnQpO1xuICAgICAgaWYgKHByb2R1Y3Qub3B0aW9ucy5sZW5ndGggPT09IDMpIHdpbmRvdy5TaG9waWZ5LnVwZGF0ZU9wdGlvbnNJblNlbGVjdG9yKDIsIHBhcmVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICAvLyBXaGVuIHRoZXJlIGlzIGFuIHVwZGF0ZSBpbiB0aGUgc2Vjb25kIGRyb3Bkb3duLlxuICAgICQocGFyZW50ICsgXCIgLnNpbmdsZS1vcHRpb24tc2VsZWN0b3I6ZXEoMSlcIikuY2hhbmdlKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHByb2R1Y3Qub3B0aW9ucy5sZW5ndGggPT09IDMpIHdpbmRvdy5TaG9waWZ5LnVwZGF0ZU9wdGlvbnNJblNlbGVjdG9yKDIsIHBhcmVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbn07XG5cbi8vIExvYWRzIGluIHNjcmlwdCB3aGVuIGNhbGxlZFxudmFyIGxvYWRTY3JpcHQgPSBmdW5jdGlvbiAobmFtZSwgdXJsLCBjYWxsYmFjaykge1xuICBpZiAod2luZG93LlBYVVRoZW1lW25hbWVdKSB7XG4gICAgY2FsbGJhY2s7XG4gIH0gZWxzZSB7XG4gICAgJC5hamF4KHtcbiAgICAgIHVybDogdXJsLFxuICAgICAgZGF0YVR5cGU6ICdzY3JpcHQnLFxuICAgICAgc3VjY2VzczogY2FsbGJhY2ssXG4gICAgICBhc3luYzogZmFsc2VcbiAgICB9KTtcbiAgfVxufVxuXG5cbiQoZG9jdW1lbnQpXG4gIC5vbignc2hvcGlmeTpibG9jazpzZWxlY3QnLCBmdW5jdGlvbihlKXtcblxuICAgI
1HZhciBibG9ja0lkID0gZS5kZXRhaWwuYmxvY2tJZDtcbiAgICB2YXIgJHBhcmVudFNlY3Rpb24gPSAkKCcjc2hvcGlmeS1zZWN0aW9uLScgKyBlLmRldGFpbC5zZWN0aW9uSWQpO1xuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLXNsaWRlc2hvdycpKXtcbiAgICAgIHdpbmRvdy5QWFVUaGVtZS5qc1NsaWRlc2hvdy5ibG9ja1NlbGVjdChibG9ja0lkLCAkcGFyZW50U2VjdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmZpbmQoJy5tYXAtLWNvbnRhaW5lcicpLmxlbmd0aCkge1xuICAgICAgd2luZG93Lm1hcC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmZpbmQoJy5wYXJhbGxheC1iYW5uZXInKSkge1xuICAgICAgJCh0aGlzKS5maW5kKCcucGFyYWxsYXhfX2NvbnRhaW5lciA+IC5wYXJhbGxheCcpLnVud3JhcCgpO1xuICAgICAgbmV3IHVuaXZlcnNhbFBhcmFsbGF4KCkuaW5pdCgpO1xuICAgIH1cblxufSk7XG5cbiQoZG9jdW1lbnQpXG4gIC5vbignc2hvcGlmeTpibG9jazpkZXNlbGVjdCcsIGZ1bmN0aW9uKGUpe1xuXG4gICAgdmFyICRwYXJlbnRTZWN0aW9uID0gJCgnI3Nob3BpZnktc2VjdGlvbi0nICsgZS5kZXRhaWwuc2VjdGlvbklkKTtcblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1zbGlkZXNob3cnKSl7XG4gICAgICB3aW5kb3cuUFhVVGhlbWUuanNTbGlkZXNob3cuYmxvY2tEZXNlbGVjdCgkcGFyZW50U2VjdGlvbik7XG4gICAgfVxuXG59KTtcblxuJChkb2N1bWVudClcbiAgLm9uKCdzaG9waWZ5OnNlY3Rpb246bG9hZCcsIGZ1bmN0aW9uKGUpe1xuXG4gICAgLy8gU2hvcGlmeSBzZWN0aW9uIGFzIGpRdWVyeSBvYmplY3RcbiAgICB2YXIgJHNlY3Rpb24gPSAkKGUudGFyZ2V0KTtcblxuICAgIC8vIFZhbmlsbGEganMgc2VsZWN0aW9uIG9mIFNob3BpZnkgc2VjdGlvblxuICAgIHZhciBzZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nob3BpZnktc2VjdGlvbi0nICsgZS5kZXRhaWwuc2VjdGlvbklkKTtcblxuICAgIHZhciBzZWN0aW9uT2JqZWN0VXJsID0gJHNlY3Rpb24uZmluZCgnW2RhdGEtdGhlbWUtZWRpdG9yLWxvYWQtc2NyaXB0XScpLmF0dHIoJ3NyYycpO1xuXG4gICAgLy8gQ2hlY2sgY2xhc3NlcyBvbiBzY2hlbWEgYW5kIGxvb2sgZm9yIGpzIChlZy4ganNNYXApXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uLmNsYXNzTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHNlY3Rpb24uY2xhc3NMaXN0W2ldLnN1YnN0cmluZygwLCAyKSA9PT0gXCJqc1wiKXtcbiAgICAgICAgdmFyIHRyaWdnZXJDbGFzcyA9IHNlY3Rpb24uY2xhc3NMaXN0W2ldO1xuXG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBzZWN0aW9uIHNjcmlwdCBleGlzdHNcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuUFhVVGhlbWVbdHJpZ2dlckNsYXNzXSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIG1ha2UgQUpBWCBjYWxsIHRvIGxvYWQgc2NyaXB0XG4gICAgICAgICAgbG9hZFNjcmlwdCh0cmlnZ2VyQ2xhc3MsIHNlY3Rpb25PYmplY3RVcmwsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHdpbmRvdy5QWFVUaGVtZVt0cmlnZ2VyQ2xhc3NdLmluaXQoJChzZWN0aW9uKSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAod2luZG93LlBYVVRoZW1lW3RyaWdnZXJDbGFzc10pIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ1NlY3Rpb246ICcgKyB0cmlnZ2VyQ2xhc3MgKyAnIGhhcyBiZWVuIGxvYWRlZC4nKVxuICAgICAgICAgICAgd2luZG93LlBYVVRoZW1lW3RyaWdnZXJDbGFzc10uaW5pdCgkKHNlY3Rpb24pKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9jb25zb2xlLndhcm4oJ1VoIG9oLCAnICsgdHJpZ2dlckNsYXNzICsgJyBpcyByZWZlcmVuY2VkIGluIHNlY3Rpb24gc2NoZW1hIGNsYXNzLCBidXQgY2FuIG5vdCBiZSBmb3VuZC4gTWFrZSBzdXJlIFwiel9fJyArIHRyaWdnZXJDbGFzcyArICcuanNcIiBhbmQgd2luZG93LlBYVVRoZW1lLicgKyB0cmlnZ2VyQ2xhc3MgKyAnLmluaXQoKSBmdW5jdGlvbiBleGlzdHMuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXRpbGl0aWVzLmVuYWJsZURpc2Nsb3N1cmUoKTtcblxuICAgIC8vIENhbGwgbWV0aG9kcyBiYXNlZCBvbiBzZWN0aW9uIGNsYXNzZXNcbiAgICB2YXIgJHBhcmVudFNlY3Rpb24gPSAkKCcjc2hvcGlmeS1zZWN0aW9uLScgKyBlLmRldGFpbC5zZWN0aW9uSWQpO1xuXG4gICAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5uZXdzbGV0dGVyX3BvcHVwKSB7XG4gICAgICBuZXdzbGV0dGVyX3BvcHVwLmluaXQoKTtcbiAgICB9XG5cbiAgICBpZiAoJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3Nob3BpZnktc2VjdGlvbi0tcmVjb21tZW5kZWQtcHJvZHVjdHMnKSkge1xuICAgICAgd2luZG93LnByb2R1Y3QubG9hZFByb2R1Y3RSZWNvbW1lbmRhdGlvbnMoKTtcbiAgICB9XG5cbiAgICBpZiAod2luZG93LlBYVVRoZW1lLnRoZW1lX3NldHRpbmdzLmVuYWJsZV9wcmVkaWN0aXZlX3NlYXJjaCkge1xuICAgICAgd2luZG93LnByZWRpY3RpdmVTZWFyY2guaW5pdCgpO1xuICAgIH1cblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1jYXJ0LXRlbXBsYXRlJykpIHtcbiAgICAgIHdpbmRvdy5wcm9kdWN0Rm9ybUxpc3RlbmVycy5pbml0KCk7XG4gICAgICB3aW5kb3cuY2FydC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLWltYWdlLXdpdGgtdGV4dC1vdmVybGF5JykpIHtcbiAgICAgIHdpbmRvdy5iYW5uZXJfaW1hZ2UuaW5pdCgpO1xuICAgICAgd2luZG93LmJhbm5lci5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLW1hcCcpIHx8ICRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLXBhZ2UtY29udGFjdC10ZW1wbGF0ZScpKSB7XG4gICAgICB3aW5kb3cubWFwLmluaXQoKTtcbiAgICB9XG5cbiAgICBpZiAoJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3Nob3BpZnktc2VjdGlvbi0tZmVhdHVyZWQtcHJvZHVjdCcpKSB7XG4gICAgICB3aW5kb3cucHJvZHVjdC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLWZlYXR1cmVkLWNvbGxlY3Rpb24nKSkge1xuICAgICAgd2luZG93LmNvbGxlY3Rpb24uaW5pdCgpO1xuICAgICAgd2luZG93LnByb2R1Y3QuaW5pdCgpO1xuICAgICAgd2luZG93LmJhbm5lci5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLWZlYXR1cmVkLXByb21vdGlvbnMnKSkge1xuICAgICAgd2luZG93LmZlYXR1cmVkX3Byb21vdGlvbnMuaW5pdCgpO1xuICAgIH1cblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1pbWFnZS13aXRoLXRleHQnKSkge1xuICAgICAgd2luZG93LmFuaW1hdGVfY29udGVudC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLXZpZGVvJykpIHtcbiAgICAgIHdpbmRvdy52aWRlb1RoZW1lLmluaXQoKTtcbiAgICAgIHdpbmRvdy5iYW5uZXIuaW5p
1dCgpO1xuICAgIH1cblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1wcm9kdWN0LXRlbXBsYXRlJykgfHwgJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3Nob3BpZnktc2VjdGlvbi0tcXVpY2stc2hvcCcpKSB7XG4gICAgICB3aW5kb3cuY29sbGVjdGlvbi5pbml0KCk7XG4gICAgICB3aW5kb3cucHJvZHVjdC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLWNvbGxlY3Rpb24tdGVtcGxhdGUnKSkge1xuICAgICAgd2luZG93LmJhbm5lcl9pbWFnZS5pbml0KCk7XG4gICAgICB3aW5kb3cuY29sbGVjdGlvbi5pbml0KCk7XG4gICAgICB3aW5kb3cucHJvZHVjdC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLXBhZ2UtY29udGFjdC10ZW1wbGF0ZScpKSB7XG4gICAgICB3aW5kb3cuYmFubmVyX2ltYWdlLmluaXQoKTtcbiAgICAgIHdpbmRvdy5iYW5uZXIuaW5pdCgpO1xuICAgIH1cblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1hcnRpY2xlLXRlbXBsYXRlJykpIHtcbiAgICAgIHdpbmRvdy5hcnRpY2xlLmluaXQoKTtcbiAgICB9XG5cbiAgICBpZiAoJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3Nob3BpZnktc2VjdGlvbi0tc2VhcmNoLXRlbXBsYXRlJykpIHtcbiAgICAgIHdpbmRvdy5jb2xsZWN0aW9uLmluaXQoKTtcbiAgICB9XG5cbiAgICBpZiAoJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3Nob3BpZnktc2VjdGlvbi0tYmxvZy10ZW1wbGF0ZScpKSB7XG4gICAgICB3aW5kb3cuYmFubmVyX2ltYWdlLmluaXQoKTtcbiAgICAgIHdpbmRvdy5iYW5uZXIuaW5pdCgpO1xuICAgIH1cblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1oZWFkZXInKSkge1xuICAgICAgd2luZG93LmJhbm5lcl9pbWFnZS5pbml0KCk7XG4gICAgICB3aW5kb3cuaGVhZGVyLmluaXQoKTtcbiAgICB9XG5cbiAgICBpZiAoJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3BhcmFsbGF4LWJhbm5lcicpKSB7XG4gICAgICAkKHRoaXMpLmZpbmQoJy5wYXJhbGxheF9fY29udGFpbmVyID4gLnBhcmFsbGF4JykudW53cmFwKCk7XG4gICAgICBuZXcgdW5pdmVyc2FsUGFyYWxsYXgoKS5pbml0KCk7XG4gICAgfVxufSk7XG5cbiQoZG9jdW1lbnQpXG4gIC5vbignc2hvcGlmeTpzZWN0aW9uOnVubG9hZCcsIGZ1bmN0aW9uKGUpe1xuXG4gICAgdXRpbGl0aWVzLnVubG9hZCgpO1xuXG4gICAgdmFyICR0YXJnZXQgPSAkKGUudGFyZ2V0KTtcbiAgICB2YXIgJHBhcmVudFNlY3Rpb24gPSAkKCcjc2hvcGlmeS1zZWN0aW9uLScgKyBlLmRldGFpbC5zZWN0aW9uSWQpO1xuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLWltYWdlLXdpdGgtdGV4dC1vdmVybGF5JykpIHtcbiAgICAgIHdpbmRvdy5iYW5uZXIudW5sb2FkKCR0YXJnZXQpO1xuICAgIH1cblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1zbGlkZXNob3cnKSkge1xuICAgICAgd2luZG93LlBYVVRoZW1lLmpzU2xpZGVzaG93LnVubG9hZCgkdGFyZ2V0KTtcbiAgICB9XG5cbiAgICBpZiAoJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3Nob3BpZnktc2VjdGlvbi0tZmVhdHVyZWQtcHJvZHVjdCcpKSB7XG4gICAgICB3aW5kb3cucHJvZHVjdC51bmxvYWQoJHRhcmdldCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLWZlYXR1cmVkLWNvbGxlY3Rpb24nKSkge1xuICAgICAgd2luZG93LmNvbGxlY3Rpb24udW5sb2FkKCR0YXJnZXQpO1xuICAgIH1cblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1wcm9kdWN0LXRlbXBsYXRlJykpIHtcbiAgICAgIHdpbmRvdy5wcm9kdWN0LnVubG9hZCgkdGFyZ2V0KTtcbiAgICB9XG5cbiAgICBpZiAoJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3Nob3BpZnktc2VjdGlvbi0tY29sbGVjdGlvbi10ZW1wbGF0ZScpKSB7XG4gICAgICB3aW5kb3cuY29sbGVjdGlvbi51bmxvYWQoJHRhcmdldCk7XG4gICAgfVxufSk7XG5cbiQoZG9jdW1lbnQpXG4gIC5vbignc2hvcGlmeTpzZWN0aW9uOnNlbGVjdCcsIGZ1bmN0aW9uKGUpe1xuXG4gICAgLy8gU2hvcGlmeSBzZWN0aW9uIGFzIGpRdWVyeSBvYmplY3RcbiAgICB2YXIgJHNlY3Rpb24gPSAkKGUudGFyZ2V0KTtcblxuICAgIC8vIFZhbmlsbGEganMgc2VsZWN0aW9uIG9mIFNob3BpZnkgc2VjdGlvblxuICAgIHZhciBzZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nob3BpZnktc2VjdGlvbi0nICsgZS5kZXRhaWwuc2VjdGlvbklkKTtcblxuICAgIC8vIEZvcmNlIHNob3cgc3RhdGUgd2hlbiBzZWN0aW9uIGlzIHNlbGVjdGVkIGluIHRoZW1lIGVkaXRvclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbi5jbGFzc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChzZWN0aW9uLmNsYXNzTGlzdFtpXS5zdWJzdHJpbmcoMCwgMikgPT09IFwianNcIikge1xuICAgICAgICB2Y
1XIgdHJpZ2dlckNsYXNzID0gc2VjdGlvbi5jbGFzc0xpc3RbaV07XG5cbiAgICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZVt0cmlnZ2VyQ2xhc3NdLnNob3dUaGVtZUVkaXRvclN0YXRlKSB7d2luZG93LlBYVVRoZW1lXG4gICAgICAgICAgd2luZG93LlBYVVRoZW1lW3RyaWdnZXJDbGFzc10uc2hvd1RoZW1lRWRpdG9yU3RhdGUoZS5kZXRhaWwuc2VjdGlvbklkLCAkc2VjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgJHBhcmVudFNlY3Rpb24gPSAkKCcjc2hvcGlmeS1zZWN0aW9uLScgKyBlLmRldGFpbC5zZWN0aW9uSWQpO1xuXG4gICAgd2luZG93LmhlYWRlci5pbml0KCk7XG4gICAgd2luZG93LmJhbm5lcl9pbWFnZS5pbml0KCk7XG4gICAgd2luZG93LmJhbm5lci5pbml0KCk7XG5cbiAgICAkKCcubGlnaHRib3gnKS5mYW5jeWJveCgpO1xufSk7XG5cbiQoZG9jdW1lbnQpXG4gIC5vbignc2hvcGlmeTpzZWN0aW9uOmRlc2VsZWN0JywgZnVuY3Rpb24oZSl7XG5cbiAgICB2YXIgJHBhcmVudFNlY3Rpb24gPSAkKCcjc2hvcGlmeS1zZWN0aW9uLScgKyBlLmRldGFpbC5zZWN0aW9uSWQpO1xuXG4gICAgd2luZG93LmJhbm5lcl9pbWFnZS5pbml0KCk7XG59KTtcblxuJChkb2N1bWVudClcbiAgLm9uKCdzaG9waWZ5OnNlY3Rpb246cmVvcmRlcicsIGZ1bmN0aW9uKGUpe1xuXG4gICAgdmFyICRwYXJlbnRTZWN0aW9uID0gJCgnI3Nob3BpZnktc2VjdGlvbi0nICsgZS5kZXRhaWwuc2VjdGlvbklkKTtcblxuICAgIHdpbmRvdy5oZWFkZXIuaW5pdCgpO1xuICAgIHdpbmRvdy5iYW5uZXJfaW1hZ2UuaW5pdCgpO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFEQTtBQUdBO0FBUEE7QUFhQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFHQTtBQUFBO0FBQUE7QUFqQkE7QUFDQTtBQW1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBREE7QUFHQTtBQUdBO0FBQUE7QUFBQTtBQVhBO0FBZUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBREE7QUFKQTtBQURBO0FBQ0E7QUFZQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQURBO0FBSUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE3UUE7QUFnUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBREE7QUFQQTtBQUNBO0FBWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFoUEE7QUFtUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXpGQTtBQThGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE5QkE7QUFpQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbkJBO0FBdUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBUkE7QUFnQkE7QUFFQTtBQUNBO0FBdkNBO0FBMENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFWQTtBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWJBO0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkE7QUFhQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUF0QkE7QUF3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUF2Q0E7QUF5Q0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFQQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTFCQTtBQTRCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUF2M0JBO0FBMDNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF0REE7QUEyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBT0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFYQTtBQWNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQS9JQTtBQWlKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFqUUE7QUFvUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFwQkE7QUFzQkE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWp
1HQTtBQW9HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBQ0E7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUF6RkE7QUE0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQVNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFEQTtBQVBBO0FBQ0E7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBREE7QUFQQTtBQUNBO0FBWUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFwTEE7QUFDQTtBQXNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBcEJBO0FBdUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBaEpBO0FBa0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUE1Q0E7QUE4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQURBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBT0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVZBO0FBWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE1Q0E7QUErQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQVpBO0FBQ0E7QUFjQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/app.js\n")},
1"./source/scripts/helpers/ComplementaryProducts.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ ComplementaryProducts)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/shopify-asyncview */ \"./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\");\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n\n\n\nclass ComplementaryProducts {\n  constructor(options) {\n    this.sectionEl = options.sectionEl;\n    this.sectionId = options.sectionId;\n    this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n    this.productId = options.productId;\n    this.includeIndicatorDots = options.includeIndicatorDots || false;\n    this.recommendationsRoute = options.productRecommendationsRoute;\n    this.limit = options.limit;\n    const defaultArrowShape = {\n      x0: 10,\n      x1: 60,\n      y1: 50,\n      x2: 65,\n      y2: 45,\n      x3: 20\n    };\n    this.arrowShape = options.arrowShape || defaultArrowShape;\n    this.recommendationsEl = this.sectionEl.querySelector('[data-complementary-products]');\n    this.loadRecommendations();\n  }\n\n  loadRecommendations() {\n    const url = `${this.recommendationsRoute}?section_id=${this.sectionId}&limit=${this.limit}&product_id=${this.productId}&intent=complementary`;\n    _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_1__.default.load(url, {\n      view: ''\n    }).then(({\n      html\n    }) => {\n      if (typeof html === 'object' && Object.keys(html).length === 0) return;\n\n      if (html.trim().length === 0) {\n        this.recommendationsEl.classList.add('complementary-products--no-recommendations');\n        return;\n      }\n\n      this.recommendationsEl.innerHTML = html;\n\n      if (!_pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__.default.instance) {\n        _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__.default.init();\n      }\n\n      _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__.default.watch(this.recommendationsEl);\n      const slider = this.recommendationsEl.querySelector('[data-slider]');\n      const slides = this.recommendationsEl.querySelectorAll('[data-slide]');\n\n      if (slides.length > 1) {\n        this.slider = $(slider).flickity({\n          cellSelector: '[data-slide]',\n          accessibility: false,\n          adaptiveHeight: false,\n          autoPlay: false,\n          cellAlign: 'left',\n          contain: true,\n          imagesLoaded: true,\n          pageDots: this.includeIndicatorDots,\n          wrapAround: true,\n          arrowShape: this.arrowShape\n        });\n        this.events.register(slider, 'rimg:load', () => {\n          this.slider.resize();\n        });\n      }\n    });\n  }\n\n  unload() {\n    this.slider.destroy();\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL0NvbXBsZW1lbnRhcnlQcm9kdWN0cy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vc291cmNlL3NjcmlwdHMvaGVscGVycy9Db21wbGVtZW50YXJ5UHJvZHVjdHMuanM/YmEyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJ0BwaXhlbHVuaW9uL2V2ZW50cyc7XG5pbXBvcnQgQXN5bmNWaWV3IGZyb20gJ0BwaXhlbHVuaW9uL3Nob3BpZnktYXN5bmN2aWV3JztcbmltcG9ydCByaW1nIGZyb20gJ0BwaXhlbHVuaW9uL3JpbWctc2hvcGlmeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbXBsZW1lbnRhcnlQcm9kdWN0cyB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICB0aGlzLnNlY3Rpb25FbCA9IG9wdGlvbnMuc2VjdGlvbkVsO1xuICAgIHRoaXMuc2VjdGlvbklkID0gb3B0aW9ucy5zZWN0aW9uSWQ7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVyKCk7XG4gICAgdGhpcy5wcm9kdWN0SWQgPSBvcHRpb25zLnByb2R1Y3RJZDtcbiAgICB0aGlzLmluY2x1ZGVJbmRpY2F0b3JEb3RzID0gb3B0aW9ucy5pbmNsdWRlSW5kaWNhdG9yRG90cyB8fCBmYWxzZTtcbiAgICB0aGlzLnJlY29tbWVuZGF0aW9uc1JvdXRlID0gb3B0aW9ucy5wcm9kdWN0UmVjb21tZW5kYXRpb25zUm91dGU7XG4gICAgdGhpcy5saW1pdCA9IG9wdGlvbnMubGltaXQ7XG5cbiAgICBjb25zdCBkZWZhdWx0QXJyb3dTaGFwZSA9IHtcbiAgICAgIHgwOiAxMCxcbiAgICAgIHgxOiA2MCxcbiAgICAgIHkxOiA1MCxcbiAgICAgIHgyOiA2NSxcbiAgICAgIHkyOiA0NSxcbiAgICAgIHgzOiAyMCxcbiAgICB9XG5cbiAgICB0aGlzLmFycm93U2hhcGUgPSBvcHRpb25zLmFycm93U2hhcGUgfHwgZGVmYXVsdEFycm93U2hhcGU7XG5cbiAgICB0aGlzLnJlY29tbWVuZGF0aW9uc0VsID0gdGhpcy5zZWN0aW9uRWwucXVlcnlTZWxlY3RvcignW2RhdGEtY29tcGxlbWVudGFyeS1wcm9kdWN0c10nKTtcbiAgICB0aGlzLmxvYWRSZWNvbW1lbmRhdGlvbnMoKTtcbiAgfVxuXG4gIGxvYWRSZWNvbW1lbmRhdGlvbnMoKSB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5yZWNvbW1lbmRhdGlvbnNSb3V0ZX0/c2VjdGlvbl9pZD0ke3RoaXMuc2VjdGlvbklkfSZsaW1pdD0ke3RoaXMubGltaXR9JnByb2R1Y3RfaWQ9JHt0aGlzLnByb2R1Y3RJZH0maW50ZW50PWNvbXBsZW1lbnRhcnlgO1xuXG4gICAgQXN5bmNWaWV3LmxvYWQoXG4gICAgICB1cmwsXG4gICAgICB7IHZpZXc6ICcnIH0sXG4gICAgKS50aGVuKCh7IGh0bWwgfSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBodG1sID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhodG1sKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgaWYgKGh0bWwudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnJlY29tbWVuZGF0aW9uc0VsLmNsYXNzTGlzdC5hZGQoJ2NvbXBsZW1lbnRhcnktcHJvZHVjdHMtLW5vLXJlY29tbWVuZGF0aW9ucycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVjb21tZW5kYXRpb25zRWwuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgaWYgKCFyaW1nLmluc3RhbmNlKSB7XG4gICAgICAgI
1HJpbWcuaW5pdCgpO1xuICAgICAgfVxuXG4gICAgICByaW1nLndhdGNoKHRoaXMucmVjb21tZW5kYXRpb25zRWwpO1xuXG4gICAgICBjb25zdCBzbGlkZXIgPSB0aGlzLnJlY29tbWVuZGF0aW9uc0VsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNsaWRlcl0nKTtcbiAgICAgIGNvbnN0IHNsaWRlcyA9IHRoaXMucmVjb21tZW5kYXRpb25zRWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtc2xpZGVdJyk7XG5cbiAgICAgIGlmIChzbGlkZXMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aGlzLnNsaWRlciA9ICQoc2xpZGVyKS5mbGlja2l0eSh7XG4gICAgICAgICAgY2VsbFNlbGVjdG9yOiAnW2RhdGEtc2xpZGVdJyxcbiAgICAgICAgICBhY2Nlc3NpYmlsaXR5OiBmYWxzZSxcbiAgICAgICAgICBhZGFwdGl2ZUhlaWdodDogZmFsc2UsXG4gICAgICAgICAgYXV0b1BsYXk6IGZhbHNlLFxuICAgICAgICAgIGNlbGxBbGlnbjogJ2xlZnQnLFxuICAgICAgICAgIGNvbnRhaW46IHRydWUsXG4gICAgICAgICAgaW1hZ2VzTG9hZGVkOiB0cnVlLFxuICAgICAgICAgIHBhZ2VEb3RzOiB0aGlzLmluY2x1ZGVJbmRpY2F0b3JEb3RzLFxuICAgICAgICAgIHdyYXBBcm91bmQ6IHRydWUsXG4gICAgICAgICAgYXJyb3dTaGFwZTogdGhpcy5hcnJvd1NoYXBlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmV2ZW50cy5yZWdpc3RlcihzbGlkZXIsICdyaW1nOmxvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zbGlkZXIucmVzaXplKCk7XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgdGhpcy5zbGlkZXIuZGVzdHJveSgpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBU0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTFFQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/helpers/ComplementaryProducts.js\n")},
1"./source/scripts/helpers/PaymentTerms.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ PaymentTerms)\n/* harmony export */ });\nclass PaymentTerms {\n  constructor(el) {\n    this._el = el;\n    this._reference = this._el.querySelector('[data-payment-terms-reference] shopify-payment-terms');\n    this._target = this._el.querySelector('[data-payment-terms-target]');\n    if (!this._reference || !this._target) return;\n    this._input = document.createElement('input');\n    this._input.name = 'id';\n    this._input.type = 'hidden';\n\n    this._target.appendChild(this._input);\n\n    this._target.appendChild(this._reference);\n\n    this._target.style.display = null;\n  }\n\n  update(variantId) {\n    if (!this._reference || !this._target) return;\n    this._input.value = variantId;\n\n    this._input.dispatchEvent(new Event('change', {\n      bubbles: true\n    }));\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL1BheW1lbnRUZXJtcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vc291cmNlL3NjcmlwdHMvaGVscGVycy9QYXltZW50VGVybXMuanM/MzNmZiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBQYXltZW50VGVybXMge1xuICBjb25zdHJ1Y3RvcihlbCkge1xuICAgIHRoaXMuX2VsID0gZWw7XG4gICAgdGhpcy5fcmVmZXJlbmNlID0gdGhpcy5fZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcGF5bWVudC10ZXJtcy1yZWZlcmVuY2VdIHNob3BpZnktcGF5bWVudC10ZXJtcycpO1xuICAgIHRoaXMuX3RhcmdldCA9IHRoaXMuX2VsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBheW1lbnQtdGVybXMtdGFyZ2V0XScpO1xuXG4gICAgaWYgKCF0aGlzLl9yZWZlcmVuY2UgfHwgIXRoaXMuX3RhcmdldCkgcmV0dXJuO1xuXG4gICAgdGhpcy5faW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIHRoaXMuX2lucHV0Lm5hbWUgPSAnaWQnO1xuICAgIHRoaXMuX2lucHV0LnR5cGUgPSAnaGlkZGVuJztcblxuICAgIHRoaXMuX3RhcmdldC5hcHBlbmRDaGlsZCh0aGlzLl9pbnB1dCk7XG4gICAgdGhpcy5fdGFyZ2V0LmFwcGVuZENoaWxkKHRoaXMuX3JlZmVyZW5jZSk7XG5cbiAgICB0aGlzLl90YXJnZXQuc3R5bGUuZGlzcGxheSA9IG51bGw7XG4gIH1cblxuICB1cGRhdGUodmFyaWFudElkKSB7XG4gICAgaWYgKCF0aGlzLl9yZWZlcmVuY2UgfHwgIXRoaXMuX3RhcmdldCkgcmV0dXJuO1xuICAgIHRoaXMuX2lucHV0LnZhbHVlID0gdmFyaWFudElkO1xuICAgIHRoaXMuX2lucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBdkJBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/helpers/PaymentTerms.js\n")},
1"./source/scripts/helpers/RecipientForm.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ RecipientForm)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/animations */ \"./node_modules/@pixelunion/animations/dist/animations.es.js\");\n\n\nclass RecipientForm {\n  constructor(el) {\n    this.el = el;\n    this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n    this.recipientForm = this.el.querySelector('[data-recipient-form]');\n    this.recipientFormInputs = this.el.querySelectorAll('[data-recipient-form-input]');\n    this.recipientFormEmailInput = this.el.querySelector('[data-recipient-form-email-input]');\n    this.disclosure = this.el.querySelector('[data-recipient-disclosure]');\n    this.disclosureCheckbox = this.el.querySelector('[data-recipient-disclosure-checkbox]');\n    this.checkmark = this.disclosure.querySelector('.checkmark');\n    this.checkmarkCheck = this.disclosure.querySelector('.checkmark__check');\n    this.fillAnimation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__.transition)({\n      el: this.checkmark\n    });\n    this.checkAnimation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__.transition)({\n      el: this.checkmarkCheck\n    });\n    this.events.register(this.recipientForm, 'keydown', event => this._onKeydown(event));\n    this.events.register(this.disclosure, 'toggle', () => this._onToggle());\n    this.events.register(this.disclosureCheckbox, 'change', () => this._onChange());\n  }\n\n  _onChange() {\n    this.disclosure.open = this.disclosureCheckbox.checked;\n  }\n\n  _onKeydown(event) {\n    // Prevent input form submission\n    if (event.key === 'Enter' && event.target.matches('[data-recipient-form-input]')) {\n      event.preventDefault();\n    }\n  }\n\n  _onToggle() {\n    if (this.disclosure.open) {\n      this._showRecipientForm();\n    } else {\n      this._hideRecipientForm();\n    }\n  }\n\n  _showRecipientForm() {\n    if (this.checkmark && this.checkmarkCheck) {\n      this.fillAnimation.animateTo('checked');\n      this.checkAnimation.animateTo('checked');\n    }\n\n    this.disclosureCheckbox.checked = true;\n    this.recipientFormEmailInput.required = true;\n  }\n\n  _hideRecipientForm() {\n    if (this.checkmark && this.checkmarkCheck) {\n      this.fillAnimation.animateTo('unchecked');\n      this.checkAnimation.animateTo('unchecked');\n    }\n\n    this.disclosureCheckbox.checked = false;\n    this.recipientFormEmailInput.required = false;\n\n    this._resetRecipientForm();\n  }\n\n  _resetRecipientForm() {\n    this.recipientFormInputs.forEach(el => {\n      el.value = '';\n\n      if (el.classList.contains('form-field-filled')) {\n        el.classList.remove('form-field-filled');\n      }\n    });\n\n    if (this.recipientForm.classList.contains('recipient-form--has-errors')) {\n      this.recipientForm.classList.remove('recipient-form--has-errors');\n    }\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL1JlY2lwaWVudE
1Zvcm0uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wYXJhbGxheC8uL3NvdXJjZS9zY3JpcHRzL2hlbHBlcnMvUmVjaXBpZW50Rm9ybS5qcz84ZWE4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnQHBpeGVsdW5pb24vZXZlbnRzJztcbmltcG9ydCB7IHRyYW5zaXRpb24gfSBmcm9tICdAcGl4ZWx1bmlvbi9hbmltYXRpb25zJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVjaXBpZW50Rm9ybSB7XG4gIGNvbnN0cnVjdG9yKGVsKSB7XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcigpO1xuXG4gICAgdGhpcy5yZWNpcGllbnRGb3JtID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yZWNpcGllbnQtZm9ybV0nKTtcbiAgICB0aGlzLnJlY2lwaWVudEZvcm1JbnB1dHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXJlY2lwaWVudC1mb3JtLWlucHV0XScpO1xuICAgIHRoaXMucmVjaXBpZW50Rm9ybUVtYWlsSW5wdXQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJlY2lwaWVudC1mb3JtLWVtYWlsLWlucHV0XScpO1xuXG4gICAgdGhpcy5kaXNjbG9zdXJlID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yZWNpcGllbnQtZGlzY2xvc3VyZV0nKTtcbiAgICB0aGlzLmRpc2Nsb3N1cmVDaGVja2JveCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcmVjaXBpZW50LWRpc2Nsb3N1cmUtY2hlY2tib3hdJyk7XG5cbiAgICB0aGlzLmNoZWNrbWFyayA9IHRoaXMuZGlzY2xvc3VyZS5xdWVyeVNlbGVjdG9yKCcuY2hlY2ttYXJrJyk7XG4gICAgdGhpcy5jaGVja21hcmtDaGVjayA9IHRoaXMuZGlzY2xvc3VyZS5xdWVyeVNlbGVjdG9yKCcuY2hlY2ttYXJrX19jaGVjaycpO1xuICAgIHRoaXMuZmlsbEFuaW1hdGlvbiA9IHRyYW5zaXRpb24oeyBlbDogdGhpcy5jaGVja21hcmsgfSk7XG4gICAgdGhpcy5jaGVja0FuaW1hdGlvbiA9IHRyYW5zaXRpb24oeyBlbDogdGhpcy5jaGVja21hcmtDaGVjayB9KTtcblxuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMucmVjaXBpZW50Rm9ybSwgJ2tleWRvd24nLCBldmVudCA9PiB0aGlzLl9vbktleWRvd24oZXZlbnQpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLmRpc2Nsb3N1cmUsICd0b2dnbGUnLCAoKSA9PiB0aGlzLl9vblRvZ2dsZSgpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLmRpc2Nsb3N1cmVDaGVja2JveCwgJ2NoYW5nZScsICgpID0+IHRoaXMuX29uQ2hhbmdlKCkpO1xuICB9XG5cbiAgX29uQ2hhbmdlKCkge1xuICAgIHRoaXMuZGlzY2xvc3VyZS5vcGVuID0gdGhpcy5kaXNjbG9zdXJlQ2hlY2tib3guY2hlY2tlZDtcbiAgfVxuXG4gIF9vbktleWRvd24oZXZlbnQpIHtcbiAgICAvLyBQcmV2ZW50IGlucHV0IGZvcm0gc3VibWlzc2lvblxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJ1tkYXRhLXJlY2lwaWVudC1mb3JtLWlucHV0XScpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIF9vblRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5kaXNjbG9zdXJlLm9wZW4pIHtcbiAgICAgIHRoaXMuX3Nob3dSZWNpcGllbnRGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2hpZGVSZWNpcGllbnRGb3JtKCk7XG4gICAgfVxuICB9XG5cbiAgX3Nob3dSZWNpcGllbnRGb3JtKCkge1xuICAgIGlmICh0aGlzLmNoZWNrbWFyayAmJiB0aGlzLmNoZWNrbWFya0NoZWNrKSB7XG4gICAgICB0aGlzLmZpbGxBbmltYXRpb24uYW5pbWF0ZVRvKCdjaGVja2VkJyk7XG4gICAgICB0aGlzLmNoZWNrQW5pbWF0aW9uLmFuaW1hdGVUbygnY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIHRoaXMuZGlzY2xvc3VyZUNoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuICAgIHRoaXMucmVjaXBpZW50Rm9ybUVtYWlsSW5wdXQucmVxdWlyZWQgPSB0cnVlO1xuICB9XG5cbiAgX2hpZGVSZWNpcGllbnRGb3JtKCkge1xuICAgIGlmICh0aGlzLmNoZWNrbWFyayAmJiB0aGlzLmNoZWNrbWFya0NoZWNrKSB7XG4gICAgICB0aGlzLmZpbGxBbmltYXRpb24uYW5pbWF0ZVRvKCd1bmNoZWNrZWQnKTtcbiAgICAgIHRoaXMuY2hlY2tBbmltYXRpb24uYW5pbWF0ZVRvKCd1bmNoZWNrZWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLmRpc2Nsb3N1cmVDaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgdGhpcy5yZWNpcGllbnRGb3JtRW1haWxJbnB1dC5yZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5fcmVzZXRSZWNpcGllbnRGb3JtKCk7XG4gIH1cblxuICBfcmVzZXRSZWNpcGllbnRGb3JtKCkge1xuICAgIHRoaXMucmVjaXBpZW50Rm9ybUlucHV0cy5mb3JFYWNoKGVsID0+IHtcbiAgICAgIGVsLnZhbHVlID0gJyc7XG5cbiAgICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2Zvcm0tZmllbGQtZmlsbGVkJykpIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnZm9ybS1maWVsZC1maWxsZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnJlY2lwaWVudE
1Zvcm0uY2xhc3NMaXN0LmNvbnRhaW5zKCdyZWNpcGllbnQtZm9ybS0taGFzLWVycm9ycycpKSB7XG4gICAgICB0aGlzLnJlY2lwaWVudEZvcm0uY2xhc3NMaXN0LnJlbW92ZSgncmVjaXBpZW50LWZvcm0tLWhhcy1lcnJvcnMnKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE1RUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/helpers/RecipientForm.js\n")},
1"./source/scripts/helpers/ShippingCalculator.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ ShippingCalculator)\n/* harmony export */ });\n/* harmony import */ var _shopify_theme_addresses__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @shopify/theme-addresses */ \"./node_modules/@shopify/theme-addresses/theme-addresses.js\");\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n\n\nclass ShippingCalculator {\n  constructor({\n    el\n  }) {\n    this.el = el;\n    this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__.default();\n    this.rates = this.el.querySelector('[data-shipping-rates]');\n    this.message = this.el.querySelector('[data-shipping-message]');\n    this.zip = this.el.querySelector('[data-shipping-calculator-zipcode]');\n    this.submit = this.el.querySelector('[data-shipping-calculator-submit]');\n    this.response = this.el.querySelector('[data-shipping-calculator-response]');\n    this.countrySelect = this.el.querySelector('[data-shipping-calculator-country]');\n    this.provinceSelect = this.el.querySelector('[data-shipping-calculator-province]');\n    this.provinceContainer = this.el.querySelector('[data-shipping-calculator-province-container]');\n    this.buildCalculator();\n  }\n\n  buildCalculator() {\n    this.shippingCountryProvinceSelector = new _shopify_theme_addresses__WEBPACK_IMPORTED_MODULE_0__.CountryProvinceSelector(this.countrySelect.innerHTML);\n    this.shippingCountryProvinceSelector.build(this.countrySelect, this.provinceSelect, {\n      onCountryChange: provinces => {\n        if (provinces.length) {\n          this.provinceContainer.style.display = 'block';\n        } else {\n          this.provinceContainer.style.display = 'none';\n        } // \"Province\", \"State\", \"Region\", etc. and \"Postal Code\", \"ZIP Code\", etc.\n        // Even countries without provinces include a label.\n\n\n        const {\n          label,\n          zip_label: zipLabel\n        } = window.Countries[this.countrySelect.value];\n        this.provinceContainer.querySelector('label[for=\"address_province\"]').innerHTML = label;\n        this.el.querySelector('label[for=\"address_zip\"]').innerHTML = zipLabel;\n      }\n    });\n    this.events.register(this.submit, 'click', e => {\n      e.preventDefault();\n      this.getRates();\n    });\n  }\n\n  getRates() {\n    const shippingAddress = {};\n    shippingAddress.country = this.countrySelect ? this.countrySelect.value : '';\n    shippingAddress.province = this.provinceSelect ? this.provinceSelect.value : '';\n    shippingAddress.zip = this.zip ? this.zip.value : '';\n    const queryString = Object.keys(shippingAddress).map(key => `${encodeURIComponent(`shipping_address[${key}]`)}=${encodeURIComponent(shippingAddress[key])}`).join('&');\n    fetch(`${window.PXUTheme.routes.cart_url}/shipping_rates.json?${queryString}`).then(response => response.json()).then(data => this.displayRates(data));\n  }\n\n  displayRates(rates) {\n    const propertyName = Object.keys(rates);\n    this.clearRates();\n\n    if (propertyName[0] === 'shipping_rates') {\n      rates.shipping_rates.forEac
1h(rate => {\n        const rateLi = document.createElement('li');\n        rateLi.innerHTML = `${rate.name}: ${this.formatPrice(rate.price)}`;\n        this.rates.appendChild(rateLi);\n      });\n\n      if (rates.shipping_rates.length > 1) {\n        this.message.innerHTML = `${window.PXUTheme.translation.additional_rates_part_1} ${rates.shipping_rates.length} ${window.PXUTheme.translation.additional_rates_part_2} ${this.zip.value}, ${this.provinceSelect.value}, ${this.countrySelect.value}, ${window.PXUTheme.translation.additional_rates_part_3} ${this.formatPrice(rates.shipping_rates[0].price)}`;\n      } else {\n        this.message.innerHTML = `${window.PXUTheme.translation.additional_rate} ${this.zip.value}, ${this.provinceSelect.value}, ${this.countrySelect.value}, ${window.PXUTheme.translation.additional_rate_at} ${this.formatPrice(rates.shipping_rates[0].price)}`;\n      }\n\n      this.response.classList.add('shipping-rates--display-rates');\n    } else {\n      this.message.innerHTML = `Error: ${propertyName[0]} ${rates[propertyName[0]]}`;\n      this.response.classList.add('shipping-rates--display-error');\n    }\n  }\n\n  clearRates() {\n    this.response.classList.remove('shipping-rates--display-error', 'shipping-rates--display-rates');\n    this.message.innerHTML = '';\n    this.rates.innerHTML = '';\n  }\n\n  formatPrice(price) {\n    let formattedPrice;\n\n    if (window.PXUTheme.currency.display_format === 'money_with_currency_format') {\n      formattedPrice = `<span class=\"money\">${window.PXUTheme.currency.symbol}${price} ${window.PXUTheme.currency.iso_code}</span>`;\n    } else {\n      formattedPrice = `<span class=\"money\">${window.PXUTheme.currency.symbol}${price}</span>`;\n    }\n\n    return formattedPrice;\n  }\n\n  unload() {\n    this.events.unregisterAll();\n  }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL1NoaXBwaW5nQ2FsY3VsYXRvci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vc291cmNlL3NjcmlwdHMvaGVscGVycy9TaGlwcGluZ0NhbGN1bGF0b3IuanM/N2QzNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb3VudHJ5UHJvdmluY2VTZWxlY3RvciB9IGZyb20gJ0BzaG9waWZ5L3RoZW1lLWFkZHJlc3Nlcyc7XG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJ0BwaXhlbHVuaW9uL2V2ZW50cyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoaXBwaW5nQ2FsY3VsYXRvciB7XG4gIGNvbnN0cnVjdG9yKHsgZWwgfSkge1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICB0aGlzLmV2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXIoKTtcbiAgICB0aGlzLnJhdGVzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zaGlwcGluZy1yYXRlc10nKTtcbiAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNoaXBwaW5nLW1lc3NhZ2VdJyk7XG4gICAgdGhpcy56aXAgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNoaXBwaW5nLWNhbGN1bGF0b3ItemlwY29kZV0nKTtcbiAgICB0aGlzLnN1Ym1pdCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2hpcHBpbmctY2FsY3VsYXRvci1zdWJtaXRdJyk7XG4gICAgdGhpcy5yZXNwb25zZSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2hpcHBpbmctY2FsY3VsYXRvci1yZXNwb25zZV0nKTtcbiAgICB0aGlzLmNvdW50cnlTZWxlY3QgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNoaXBwaW5nLWNhbGN1bGF0b3ItY291bnRyeV0nKTtcbiAgICB0aGlzLnByb3ZpbmNlU2VsZWN0ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zaGlwcGluZy1jYWxjdWxhdG9yLXByb3ZpbmNlXScpO1xuICAgIHRoaXMucHJvdmluY2VDb250YWluZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNoaXBwaW5nLWNhbGN1bGF0b3ItcHJvdmluY2UtY29udGFpbmVyXScpO1xuXG4gICAgdGhpcy5idWlsZENhbGN1bGF0b3IoKTtcbiAgfVxuXG4gIGJ1aWxkQ2FsY3VsYXRvcigpIHtcbiAgICB0aGlzLnNoaXBwaW5nQ291bnRyeVByb3ZpbmNlU2VsZWN0b3IgPSBuZXcgQ291bnRyeVByb3ZpbmNlU2VsZWN0b3IodGhpcy5jb3VudHJ5U2VsZWN0LmlubmVySFRNTCk7XG4gICAgdGhpcy5zaGlwcGluZ0NvdW50cnlQcm92aW5jZVNlbGVjdG9yXG4gICAgICAuYnVpbGQoXG4gICAgICAgIHRoaXMuY291bnRyeVNlbGVjdCxcbiAgICAgICAgdGhpcy5wcm92aW5jZVNlbGVjdCxcbiAgICAgICAge1xuICAgICAgICAgIG9uQ291bnRyeUNoYW5nZTogcHJvdmluY2VzID0+IHtcbiAgICAgICAgICAgIGlmIChwcm92aW5jZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJvdmluY2VDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFwiUHJvdmluY2VcIiwgXCJTdGF0ZVwiLCBcIlJlZ2lvblwiLCBldGMuIGFuZCBcIlBvc3RhbCBDb2RlXCIsIFwiWklQIENvZGVcIiwgZXRjLlxuICAgICAgICAgICAgLy8gRXZlbiBjb3VudHJpZXMgd2l0aG91dCBwcm92aW5jZXMgaW5jbHVkZSBhIGxhYmVsLlxuICAgICAgICAgICAgY29uc3QgeyBsYWJlbCwgemlwX2xhYmVsOiB6aXBMYWJlbCB9ID0gd2luZG93LkNvdW50cmllc1t0aGlzLmNvdW50cnlTZWxlY3QudmFsdWVdO1xuICAgICAgICAgICAgdGhpcy5wcm92aW5jZUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdsYWJlbFtmb3I9XCJhZGRyZXNzX3Byb3ZpbmNlXCJdJykuaW5uZXJIVE1MID0gbGFiZWw7XG4gICAgICAgICAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsW2Zvcj1cImFkZHJlc3NfemlwXCJdJykuaW5uZXJIVE1MID0gemlwTGFiZWw7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLnN1Ym1pdCwgJ2NsaWNrJywgZSA9PiB7XG4gICAgICBlLnByZXZlbn
1REZWZhdWx0KCk7XG4gICAgICB0aGlzLmdldFJhdGVzKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRSYXRlcygpIHtcbiAgICBjb25zdCBzaGlwcGluZ0FkZHJlc3MgPSB7fTtcbiAgICBzaGlwcGluZ0FkZHJlc3MuY291bnRyeSA9IHRoaXMuY291bnRyeVNlbGVjdCA/IHRoaXMuY291bnRyeVNlbGVjdC52YWx1ZSA6ICcnO1xuICAgIHNoaXBwaW5nQWRkcmVzcy5wcm92aW5jZSA9IHRoaXMucHJvdmluY2VTZWxlY3QgPyB0aGlzLnByb3ZpbmNlU2VsZWN0LnZhbHVlIDogJyc7XG4gICAgc2hpcHBpbmdBZGRyZXNzLnppcCA9IHRoaXMuemlwID8gdGhpcy56aXAudmFsdWUgOiAnJztcblxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gT2JqZWN0LmtleXMoc2hpcHBpbmdBZGRyZXNzKVxuICAgICAgLm1hcChrZXkgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGBzaGlwcGluZ19hZGRyZXNzWyR7a2V5fV1gKX09JHtlbmNvZGVVUklDb21wb25lbnQoc2hpcHBpbmdBZGRyZXNzW2tleV0pfWApXG4gICAgICAuam9pbignJicpO1xuXG4gICAgZmV0Y2goYCR7d2luZG93LlBYVVRoZW1lLnJvdXRlcy5jYXJ0X3VybH0vc2hpcHBpbmdfcmF0ZXMuanNvbj8ke3F1ZXJ5U3RyaW5nfWApXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAudGhlbihkYXRhID0+IHRoaXMuZGlzcGxheVJhdGVzKGRhdGEpKTtcbiAgfVxuXG4gIGRpc3BsYXlSYXRlcyhyYXRlcykge1xuICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IE9iamVjdC5rZXlzKHJhdGVzKTtcbiAgICB0aGlzLmNsZWFyUmF0ZXMoKTtcblxuICAgIGlmIChwcm9wZXJ0eU5hbWVbMF0gPT09ICdzaGlwcGluZ19yYXRlcycpIHtcbiAgICAgIHJhdGVzLnNoaXBwaW5nX3JhdGVzLmZvckVhY2gocmF0ZSA9PiB7XG4gICAgICAgIGNvbnN0IHJhdGVMaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgICAgIHJhdGVMaS5pbm5lckhUTUwgPSBgJHtyYXRlLm5hbWV9OiAke3RoaXMuZm9ybWF0UHJpY2UocmF0ZS5wcmljZSl9YDtcbiAgICAgICAgdGhpcy5yYXRlcy5hcHBlbmRDaGlsZChyYXRlTGkpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChyYXRlcy5zaGlwcGluZ19yYXRlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZS5pbm5lckhUTUwgPSBgJHt3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uYWRkaXRpb25hbF9yYXRlc19wYXJ0XzF9ICR7cmF0ZXMuc2hpcHBpbmdfcmF0ZXMubGVuZ3RofSAke3dpbmRvdy5QWFVUaGVtZS50cmFuc2xhdGlvbi5hZGRpdGlvbmFsX3JhdGVzX3BhcnRfMn0gJHt0aGlzLnppcC52YWx1ZX0sICR7dGhpcy5wcm92aW5jZVNlbGVjdC52YWx1ZX0sICR7dGhpcy5jb3VudHJ5U2VsZWN0LnZhbHVlfSwgJHt3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uYWRkaXRpb25hbF9yYXRlc19wYXJ0XzN9ICR7dGhpcy5mb3JtYXRQcmljZShyYXRlcy5zaGlwcGluZ19yYXRlc1swXS5wcmljZSl9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWVzc2FnZS5pbm5lckhUTUwgPSBgJHt3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uYWRkaXRpb25hbF9yYXRlfSAke3RoaXMuemlwLnZhbHVlfSwgJHt0aGlzLnByb3ZpbmNlU2VsZWN0LnZhbHVlfSwgJHt0aGlzLmNvdW50cnlTZWxlY3QudmFsdWV9LCAke3dpbmRvdy5QWFVUaGVtZS50cmFuc2xhdGlvbi5hZGRpdGlvbmFsX3JhdGVfYXR9ICR7dGhpcy5mb3JtYXRQcmljZShyYXRlcy5zaGlwcGluZ19yYXRlc1swXS5wcmljZSl9YDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXNwb25zZS5jbGFzc0xpc3QuYWRkKCdzaGlwcGluZy1yYXRlcy0tZGlzcGxheS1yYXRlcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1lc3NhZ2UuaW5uZXJIVE1MID0gYEVycm9yOiAke3Byb3BlcnR5TmFtZVswXX0gJHtyYXRlc1twcm9wZXJ0eU5hbWVbMF1dfWA7XG4gICAgICB0aGlzLnJlc3BvbnNlLmNsYXNzTGlzdC5hZGQoJ3NoaXBwaW5nLXJhdGVzLS1kaXNwbGF5LWVycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJSYXRlcygpIHtcbiAgICB0aGlzLnJlc3BvbnNlLmNsYXNzTGlzdC5yZW1vdmUoJ3NoaXBwaW5nLXJhdGVzLS1kaXNwbGF5LWVycm9yJywgJ3NoaXBwaW5nLXJhdGVzLS1kaXNwbGF5LXJhdGVzJyk7XG4gICAgdGhpcy5tZXNzYWdlLmlubmVySFRNTCA9ICcnO1xuICAgIHRoaXMucmF0ZXMuaW5uZXJIVE1MID0gJyc7XG4gIH1cblxuICBmb3JtYXRQcmljZShwcmljZSkge1xuICAgIGxldCBmb3JtYXR0ZWRQcmljZTtcblxuICAgIGlmICh3aW5kb3cuUFhVVGhlbWUuY3VycmVuY3kuZGlzcGxheV9mb3JtYXQgPT09ICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCcpIHtcbiAgICAgIGZvcm1hdHRlZFByaWNlID0gYDxzcGFuIGNsYXNzPVwibW9uZXlcIj4ke3dpbmRvdy5QWFVUaGVtZS5jdXJyZW5jeS5zeW1ib2x9JHtwcmljZX0gJHt3aW5kb3cuUFhVVGhlbWUuY3VycmVuY3kuaXNvX2NvZGV9PC9zcGFuPmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm1hdHRlZFByaWNlID0gYDxzcGFuIGNsYXNzPVwibW9uZXlcIj4ke3dpbmRvdy5QWFVUaGVtZS5jdXJyZW5jeS5zeW1ib2x9JHtwcmljZX08L3NwYW4+YDtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0dGVkUHJpY2U7XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgdGhpcy5ldmVudHMudW5yZWdpc3RlckFsbCgpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFiQTtBQWlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXpHQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/helpers/ShippingCalculator.js\n")},
vendor: 2,227 bytes, line 1
1"./node_modules/just-debounce/index.js":function(module){eval("module.exports = debounce;\n\nfunction debounce(fn, delay, atStart, guarantee) {\n  var timeout;\n  var args;\n  var self;\n\n  return function debounced() {\n    self = this;\n    args = Array.prototype.slice.call(arguments);\n\n    if (timeout && (atStart || guarantee)) {\n      return;\n    } else if (!atStart) {\n      clear();\n\n      timeout = setTimeout(run, delay);\n      return timeout;\n    }\n\n    timeout = setTimeout(clear, delay);\n    fn.apply(self, args);\n\n    function run() {\n      clear();\n      fn.apply(self, args);\n    }\n\n    function clear() {\n      clearTimeout(timeout);\n      timeout = null;\n    }\n  };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvanVzdC1kZWJvdW5jZS9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vbm9kZV9tb2R1bGVzL2p1c3QtZGVib3VuY2UvaW5kZXguanM/NDcyMyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGRlYm91bmNlO1xuXG5mdW5jdGlvbiBkZWJvdW5jZShmbiwgZGVsYXksIGF0U3RhcnQsIGd1YXJhbnRlZSkge1xuICB2YXIgdGltZW91dDtcbiAgdmFyIGFyZ3M7XG4gIHZhciBzZWxmO1xuXG4gIHJldHVybiBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgc2VsZiA9IHRoaXM7XG4gICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgICBpZiAodGltZW91dCAmJiAoYXRTdGFydCB8fCBndWFyYW50ZWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmICghYXRTdGFydCkge1xuICAgICAgY2xlYXIoKTtcblxuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQocnVuLCBkZWxheSk7XG4gICAgICByZXR1cm4gdGltZW91dDtcbiAgICB9XG5cbiAgICB0aW1lb3V0ID0gc2V0VGltZW91dChjbGVhciwgZGVsYXkpO1xuICAgIGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXG4gICAgZnVuY3Rpb24gcnVuKCkge1xuICAgICAgY2xlYXIoKTtcbiAgICAgIGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgfVxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/just-debounce/index.js\n")},
vendor: 32,833 bytes, line 1
1"./node_modules/scroll-lock/dist/scroll-lock.js":(function(module){eval("(function webpackUniversalModuleDefinition(root, factory) {\n	if(true)\n		module.exports = factory();\n	else {}\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ 	// The module cache\n/******/ 	var installedModules = {};\n/******/\n/******/ 	// The require function\n/******/ 	function __nested_webpack_require_543__(moduleId) {\n/******/\n/******/ 		// Check if module is in cache\n/******/ 		if(installedModules[moduleId]) {\n/******/ 			return installedModules[moduleId].exports;\n/******/ 		}\n/******/ 		// Create a new module (and put it into the cache)\n/******/ 		var module = installedModules[moduleId] = {\n/******/ 			i: moduleId,\n/******/ 			l: false,\n/******/ 			exports: {}\n/******/ 		};\n/******/\n/******/ 		// Execute the module function\n/******/ 		modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_543__);\n/******/\n/******/ 		// Flag the module as loaded\n/******/ 		module.l = true;\n/******/\n/******/ 		// Return the exports of the module\n/******/ 		return module.exports;\n/******/ 	}\n/******/\n/******/\n/******/ 	// expose the modules object (__webpack_modules__)\n/******/ 	__nested_webpack_require_543__.m = modules;\n/******/\n/******/ 	// expose the module cache\n/******/ 	__nested_webpack_require_543__.c = installedModules;\n/******/\n/******/ 	// define getter function for harmony exports\n/******/ 	__nested_webpack_require_543__.d = function(exports, name, getter) {\n/******/ 		if(!__nested_webpack_require_543__.o(exports, name)) {\n/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ 		}\n/******/ 	};\n/******/\n/******/ 	// define __esModule on exports\n/******/ 	__nested_webpack_require_543__.r = function(exports) {\n/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ 		}\n/******/ 		Object.defineProperty(exports, '__esModule', { value: true });\n/******/ 	};\n/******/\n/******/ 	// create a fake namespace object\n/******/ 	// mode & 1: value is a module id, require it\n/******/ 	// mode & 2: merge all properties of value into the ns\n/******/ 	// mode & 4: return value when already ns object\n/******/ 	// mode & 8|1: behave like require\n/******/ 	__nested_webpack_require_543__.t = function(value, mode) {\n/******/ 		if(mode & 1) value = __nested_webpack_require_543__(value);\n/******/ 		if(mode & 8) return value;\n/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ 		var ns = Object.create(null);\n/******/ 		__nested_webpack_require_543__.r(ns);\n/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __nested_webpack_require_543__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ 		return ns;\n/******/ 	};\n/******/\n/******/ 	// getDefaultExport function for compatibility with non-harmony modules\n/******/ 	__nested_webpack_require_543__.n = function(module) {\n/******/ 		var getter = module && module.__esModule ?\n/******/ 			function getDefault() { return module['default']; } :\n/******/ 			function getModuleExports() { return module; };\n/******/ 		__nested_webpack_require_543__.d(getter, 'a', getter);\n/******/ 		return getter;\n/******/ 	};\n/******/\n/******/ 	// Object.prototype.hasOwnProperty.call\n/******/ 	__nested_webpack_require_543__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ 	// __webpack_public_path__\n/******/ 	__nested_webpack_require_543__.p = \"\";\n/******/\n/******/\n/******/ 	// Load entry module and return exports\n/******/ 	return __nested_webpack_require_543__(__nested_webpack_require_543__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __nested_webpack_require_4019__) {\n\n\"use strict\";\n__nested_webpack_require_4019__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./src/tools.js\nvar argumentAsArray = function argumentAsArray(argument) {\n  return Array.isArray(argument) ? argument : [argument];\n};\nvar isElement = function isElement(target) {\n  return target instanceof Node;\n};\nvar isElementList = function isElementList(nodeList) {\n  return nodeList instanceof NodeList;\n};\nvar eachNode = function eachNode(nodeList, callback) {\n  if (nodeList && callback) {\n    nodeList = isElementList(nodeList) ? nodeList : [nodeList];\n\n    for (var i = 0; i < nodeList.length; i++) {\n      if (callback(nodeList[i], i, nodeList.length) === true) {\n        break;\n      }\n    }\n  }\n};\nvar throwError = function throwError(message) {\n  return console.error(\"[scroll-lock] \".concat(message));\n};\nvar arrayAsSelector = function arrayAsSelector(array) {\n  if (Array.isArray(array)) {\n    var selector = array.join(', ');\n    return selector;\n  }\n};\nvar nodeListAsArray = function nodeListAsArray(nodeList) {\n  var nodes = [];\n  eachNode(nodeList, function (node) {\n    return nodes.push(node);\n  });\n  return nodes;\n};\nvar findParentBySelector = function findParentBySelector($el, selector) {\n  var self = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n  var $root = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : document;\n\n  if (self && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1) {\n    return $el;\n  }\n\n  while (($el = $el.parentElement) && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) === -1) {\n    ;\n  }\n\n  return $el;\n};\nvar elementHasSelector = function elementHasSelector($el, selector) {\n  var $root = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document;\n  var has = nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1;\n  return has;\n};\nvar elementHasOverflowHidden = function elementHasOverflowHidden($el) {\n  if ($el) {\n    var computedStyle = getComputedStyle($el);\n    var overflowIsHidden = computedStyle.overflow === 'hidden';\n    return overflowIsHidden;\n  }\n};\nvar elementScrollTopOnStart = function elementScrollTopOnStart($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollTop = $el.scrollTop;\n    return scrollTop <= 0;\n  }\n};\nvar elementScrollTopOnEnd = function elementScrollTopOnEnd($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollTop = $el.scrollTop;\n    var scrollHeight = $el.scrollHeight;\n    var scrollTopWithHeight = scrollTop + $el.offsetHeight;\n    return scrollTopWithHeight >= scrollHeight;\n  }\n};\nvar elementScrollLeftOnStart = function elementScrollLeftOnStart($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollLeft = $el.scrollLeft;\n    return scrollLeft <= 0;\n  }\n};\nvar elementScrollLeftOnEnd = function elementScrollLeftOnEnd($el) {\n  if ($el) {\n    if (elementHasOverflowHidden($el)) {\n      return true;\n    }\n\n    var scrollLeft = $el.scrollLeft;\n    var scrollWidth = $el.scrollWidth;\n    var scrollLeftWithWidth = scrollLeft + $el.offsetWidth;\n    return scrollLeftWithWidth >= scrollWidth;\n  }\n};\nvar elementIsScrollableField = function elementIsScrollableField($el) {\n  var selector = 'textarea, [contenteditable=\"true\"]';\n  return elementHasSelector($el, selector);\n};\nvar elementIsInputRange = function elementIsInputRange($el) {\n  var selector = 'input[type=\"range\"]';\n  return elementHasSelector($el, selector);\n};\n// CONCATENATED MODULE: ./src/scroll-lock.js\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"disablePageScroll\", function() { return disablePageScroll; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"enablePageScroll\", function() { return enablePageScroll; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getScrollState\", function() { return getScrollState; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"clearQueueScrollLocks\", function() { return clearQueueScrollLocks; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getTargetScrollBarWidth\", function() { return scroll_lock_getTargetScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getCurrentTargetScrollBarWidth\", function() { return scroll_lock_getCurrentTargetScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getPageScrollBarWidth\", function() { return getPageScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getCurrentPageScrollBarWidth\", function() { return getCurrentPageScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addScrollableTarget\", function() { return scroll_lock_addScrollableTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeScrollableTarget\", function() { return scroll_lock_removeScrollableTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addScrollableSelector\", function() { return scroll_lock_addScrollableSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeScrollableSelector\", function() { return scroll_lock_removeScrollableSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addLockableTarget\", function() { return scroll_lock_addLockableTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addLockableSelector\", function() { return scroll_lock_addLockableSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"setFillGapMethod\", function() { return scroll_lock_setFillGapMethod; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addFillGapTarget\", function() { return scroll_lock_addFillGapTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeFillGapTarget\", function() { return scroll_lock_removeFillGapTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addFillGapSelector\", function() { return scroll_lock_addFillGapSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeFillGapSelector\", function() { return scroll_lock_removeFillGapSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"refillGaps\", function() { return refillGaps; });\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\nvar FILL_GAP_AVAILABLE_METHODS = ['padding', 'margin', 'width', 'max-width', 'none'];\nvar TOUCH_DIRECTION_DETECT_OFFSET = 3;\nvar state = {\n  scroll: true,\n  queue: 0,\n  scrollableSelectors: ['[data-scroll-lock-scrollable]'],\n  lockableSelectors: ['body', '[data-scroll-lock-lockable]'],\n  fillGapSelectors: ['body', '[data-scroll-lock-fill-gap]', '[data-scroll-lock-lockable]'],\n  fillGapMethod: FILL_GAP_AVAILABLE_METHODS[0],\n  //\n  startTouchY: 0,\n  startTouchX: 0\n};\nvar disablePageScroll = function disablePageScroll(target) {\n  if (state.queue <= 0) {\n    state.scroll = false;\n    scroll_lock_hideLockableOverflow();\n    fillGaps();\n  }\n\n  scroll_lock_addScrollableTarget(target);\n  state.queue++;\n};\nvar enablePageScroll = function enablePageScroll(target) {\n  state.queue > 0 && state.queue--;\n\n  if (state.queue <= 0) {\n    state.scroll = true;\n    scroll_lock_showLockableOverflow();\n    unfillGaps();\n  }\n\n  scroll_lock_removeScrollableTarget(target);\n};\nvar getScrollState = function getScrollState() {\n  return state.scroll;\n};\nvar clearQueueScrollLocks = function clearQueueScrollLocks() {\n  state.queue = 0;\n};\nvar scroll_lock_getTargetScrollBarWidth = function getTargetScrollBarWidth($target) {\n  var onlyExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  if (isElement($target)) {\n    var currentOverflowYProperty = $target.style.overflowY;\n\n    if (onlyExists) {\n      if (!getScrollState()) {\n        $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-overflow-y-property');\n      }\n    } else {\n      $target.style.overflowY = 'scroll';\n    }\n\n    var width = scroll_lock_getCurrentTargetScrollBarWidth($target);\n    $target.style.overflowY = currentOverflowYProperty;\n    return width;\n  } else {\n    return 0;\n  }\n};\nvar scroll_lock_getCurrentTargetScrollBarWidth = function getCurrentTargetScrollBarWidth($target) {\n  if (isElement($target)) {\n    if ($target === document.body) {\n      var documentWidth = document.documentElement.clientWidth;\n      var windowWidth = window.innerWidth;\n      var currentWidth = windowWidth - documentWidth;\n      return currentWidth;\n    } else {\n      var borderLeftWidthCurrentProperty = $target.style.borderLeftWidth;\n      var borderRightWidthCurrentProperty = $target.style.borderRightWidth;\n      $target.style.borderLeftWidth = '0px';\n      $target.style.borderRightWidth = '0px';\n\n      var _currentWidth = $target.offsetWidth - $target.clientWidth;\n\n      $target.style.borderLeftWidth = borderLeftWidthCurrentProperty;\n      $target.style.borderRightWidth = borderRightWidthCurrentProperty;\n      return _currentWidth;\n    }\n  } else {\n    return 0;\n  }\n};\nvar getPageScrollBarWidth = function getPageScrollBarWidth() {\n  var onlyExists = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n  return scroll_lock_getTargetScrollBarWidth(document.body, onlyExists);\n};\nvar getCurrentPageScrollBarWidth = function getCurrentPageScrollBarWidth() {\n  return scroll_lock_getCurrentTargetScrollBarWidth(document.body);\n};\nvar scroll_lock_addScrollableTarget = function addScrollableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-scrollable', '');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_removeScrollableTarget = function removeScrollableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.removeAttribute('data-scroll-lock-scrollable');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_addScrollableSelector = function addScrollableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.scrollableSelectors.push(selector);\n    });\n  }\n};\nvar scroll_lock_removeScrollableSelector = function removeScrollableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.scrollableSelectors = state.scrollableSelectors.filter(function (sSelector) {\n        return sSelector !== selector;\n      });\n    });\n  }\n};\nvar scroll_lock_addLockableTarget = function addLockableTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-lockable', '');\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n\n    if (!getScrollState()) {\n      scroll_lock_hideLockableOverflow();\n    }\n  }\n};\nvar scroll_lock_addLockableSelector = function addLockableSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.lockableSelectors.push(selector);\n    });\n\n    if (!getScrollState()) {\n      scroll_lock_hideLockableOverflow();\n    }\n\n    scroll_lock_addFillGapSelector(selector);\n  }\n};\nvar scroll_lock_setFillGapMethod = function setFillGapMethod(method) {\n  if (method) {\n    if (FILL_GAP_AVAILABLE_METHODS.indexOf(method) !== -1) {\n      state.fillGapMethod = method;\n      refillGaps();\n    } else {\n      var methods = FILL_GAP_AVAILABLE_METHODS.join(', ');\n      throwError(\"\\\"\".concat(method, \"\\\" method is not available!\\nAvailable fill gap methods: \").concat(methods, \".\"));\n    }\n  }\n};\nvar scroll_lock_addFillGapTarget = function addFillGapTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.setAttribute('data-scroll-lock-fill-gap', '');\n\n          if (!state.scroll) {\n            scroll_lock_fillGapTarget($target);\n          }\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_removeFillGapTarget = function removeFillGapTarget(target) {\n  if (target) {\n    var targets = argumentAsArray(target);\n    targets.map(function ($targets) {\n      eachNode($targets, function ($target) {\n        if (isElement($target)) {\n          $target.removeAttribute('data-scroll-lock-fill-gap');\n\n          if (!state.scroll) {\n            scroll_lock_unfillGapTarget($target);\n          }\n        } else {\n          throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n        }\n      });\n    });\n  }\n};\nvar scroll_lock_addFillGapSelector = function addFillGapSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      if (state.fillGapSelectors.indexOf(selector) === -1) {\n        state.fillGapSelectors.push(selector);\n\n        if (!state.scroll) {\n          scroll_lock_fillGapSelector(selector);\n        }\n      }\n    });\n  }\n};\nvar scroll_lock_removeFillGapSelector = function removeFillGapSelector(selector) {\n  if (selector) {\n    var selectors = argumentAsArray(selector);\n    selectors.map(function (selector) {\n      state.fillGapSelectors = state.fillGapSelectors.filter(function (fSelector) {\n        return fSelector !== selector;\n      });\n\n      if (!state.scroll) {\n        scroll_lock_unfillGapSelector(selector);\n      }\n    });\n  }\n};\nvar refillGaps = function refillGaps() {\n  if (!state.scroll) {\n    fillGaps();\n  }\n};\n\nvar scroll_lock_hideLockableOverflow = function hideLockableOverflow() {\n  var selector = arrayAsSelector(state.lockableSelectors);\n  scroll_lock_hideLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_showLockableOverflow = function showLockableOverflow() {\n  var selector = arrayAsSelector(state.lockableSelectors);\n  scroll_lock_showLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_hideLockableOverflowSelector = function hideLockableOverflowSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_hideLockableOverflowTarget($target);\n  });\n};\n\nvar scroll_lock_showLockableOverflowSelector = function showLockableOverflowSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_showLockableOverflowTarget($target);\n  });\n};\n\nvar scroll_lock_hideLockableOverflowTarget = function hideLockableOverflowTarget($target) {\n  if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') !== 'true') {\n    var computedStyle = window.getComputedStyle($target);\n    $target.setAttribute('data-scroll-lock-saved-overflow-y-property', computedStyle.overflowY);\n    $target.setAttribute('data-scroll-lock-saved-inline-overflow-property', $target.style.overflow);\n    $target.setAttribute('data-scroll-lock-saved-inline-overflow-y-property', $target.style.overflowY);\n    $target.style.overflow = 'hidden';\n    $target.setAttribute('data-scroll-lock-locked', 'true');\n  }\n};\n\nvar scroll_lock_showLockableOverflowTarget = function showLockableOverflowTarget($target) {\n  if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') === 'true') {\n    $target.style.overflow = $target.getAttribute('data-scroll-lock-saved-inline-overflow-property');\n    $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n    $target.removeAttribute('data-scroll-lock-saved-overflow-property');\n    $target.removeAttribute('data-scroll-lock-saved-inline-overflow-property');\n    $target.removeAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n    $target.removeAttribute('data-scroll-lock-locked');\n  }\n};\n\nvar fillGaps = function fillGaps() {\n  state.fillGapSelectors.map(function (selector) {\n    scroll_lock_fillGapSelector(selector);\n  });\n};\n\nvar unfillGaps = function unfillGaps() {\n  state.fillGapSelectors.map(function (selector) {\n    scroll_lock_unfillGapSelector(selector);\n  });\n};\n\nvar scroll_lock_fillGapSelector = function fillGapSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  var isLockable = state.lockableSelectors.indexOf(selector) !== -1;\n  eachNode($targets, function ($target) {\n    scroll_lock_fillGapTarget($target, isLockable);\n  });\n};\n\nvar scroll_lock_fillGapTarget = function fillGapTarget($target) {\n  var isLockable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  if (isElement($target)) {\n    var scrollBarWidth;\n\n    if ($target.getAttribute('data-scroll-lock-lockable') === '' || isLockable) {\n      scrollBarWidth = scroll_lock_getTargetScrollBarWidth($target, true);\n    } else {\n      var $lockableParent = findParentBySelector($target, arrayAsSelector(state.lockableSelectors));\n      scrollBarWidth = scroll_lock_getTargetScrollBarWidth($lockableParent, true);\n    }\n\n    if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n      scroll_lock_unfillGapTarget($target);\n    }\n\n    var computedStyle = window.getComputedStyle($target);\n    $target.setAttribute('data-scroll-lock-filled-gap', 'true');\n    $target.setAttribute('data-scroll-lock-current-fill-gap-method', state.fillGapMethod);\n\n    if (state.fillGapMethod === 'margin') {\n      var currentMargin = parseFloat(computedStyle.marginRight);\n      $target.style.marginRight = \"\".concat(currentMargin + scrollBarWidth, \"px\");\n    } else if (state.fillGapMethod === 'width') {\n      $target.style.width = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n    } else if (state.fillGapMethod === 'max-width') {\n      $target.style.maxWidth = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n    } else if (state.fillGapMethod === 'padding') {\n      var currentPadding = parseFloat(computedStyle.paddingRight);\n      $target.style.paddingRight = \"\".concat(currentPadding + scrollBarWidth, \"px\");\n    }\n  }\n};\n\nvar scroll_lock_unfillGapSelector = function unfillGapSelector(selector) {\n  var $targets = document.querySelectorAll(selector);\n  eachNode($targets, function ($target) {\n    scroll_lock_unfillGapTarget($target);\n  });\n};\n\nvar scroll_lock_unfillGapTarget = function unfillGapTarget($target) {\n  if (isElement($target)) {\n    if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n      var currentFillGapMethod = $target.getAttribute('data-scroll-lock-current-fill-gap-method');\n      $target.removeAttribute('data-scroll-lock-filled-gap');\n      $target.removeAttribute('data-scroll-lock-current-fill-gap-method');\n\n      if (currentFillGapMethod === 'margin') {\n        $target.style.marginRight = \"\";\n      } else if (currentFillGapMethod === 'width') {\n        $target.style.width = \"\";\n      } else if (currentFillGapMethod === 'max-width') {\n        $target.style.maxWidth = \"\";\n      } else if (currentFillGapMethod === 'padding') {\n        $target.style.paddingRight = \"\";\n      }\n    }\n  }\n};\n\nvar onResize = function onResize(e) {\n  refillGaps();\n};\n\nvar onTouchStart = function onTouchStart(e) {\n  if (!state.scroll) {\n    state.startTouchY = e.touches[0].clientY;\n    state.startTouchX = e.touches[0].clientX;\n  }\n};\n\nvar scroll_lock_onTouchMove = function onTouchMove(e) {\n  if (!state.scroll) {\n    var startTouchY = state.startTouchY,\n        startTouchX = state.startTouchX;\n    var currentClientY = e.touches[0].clientY;\n    var currentClientX = e.touches[0].clientX;\n\n    if (e.touches.length < 2) {\n      var selector = arrayAsSelector(state.scrollableSelectors);\n      var direction = {\n        up: startTouchY < currentClientY,\n        down: startTouchY > currentClientY,\n        left: startTouchX < currentClientX,\n        right: startTouchX > currentClientX\n      };\n      var directionWithOffset = {\n        up: startTouchY + TOUCH_DIRECTION_DETECT_OFFSET < currentClientY,\n        down: startTouchY - TOUCH_DIRECTION_DETECT_OFFSET > currentClientY,\n        left: startTouchX + TOUCH_DIRECTION_DETECT_OFFSET < currentClientX,\n        right: startTouchX - TOUCH_DIRECTION_DETECT_OFFSET > currentClientX\n      };\n\n      var handle = function handle($el) {\n        var skip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n        if ($el) {\n          var parentScrollableEl = findParentBySelector($el, selector, false);\n\n          if (elementIsInputRange($el)) {\n            return false;\n          }\n\n          if (skip || elementIsScrollableField($el) && findParentBySelector($el, selector) || elementHasSelector($el, selector)) {\n            var prevent = false;\n\n            if (elementScrollLeftOnStart($el) && elementScrollLeftOnEnd($el)) {\n              if (direction.up && elementScrollTopOnStart($el) || direction.down && elementScrollTopOnEnd($el)) {\n                prevent = true;\n              }\n            } else if (elementScrollTopOnStart($el) && elementScrollTopOnEnd($el)) {\n              if (direction.left && elementScrollLeftOnStart($el) || direction.right && elementScrollLeftOnEnd($el)) {\n                prevent = true;\n              }\n            } else if (directionWithOffset.up && elementScrollTopOnStart($el) || directionWithOffset.down && elementScrollTopOnEnd($el) || directionWithOffset.left && elementScrollLeftOnStart($el) || directionWithOffset.right && elementScrollLeftOnEnd($el)) {\n              prevent = true;\n            }\n\n            if (prevent) {\n              if (parentScrollableEl) {\n                handle(parentScrollableEl, true);\n              } else {\n                if (e.cancelable) {\n                  e.preventDefault();\n                }\n              }\n            }\n          } else {\n            handle(parentScrollableEl);\n          }\n        } else {\n          if (e.cancelable) {\n            e.preventDefault();\n          }\n        }\n      };\n\n      handle(e.target);\n    }\n  }\n};\n\nvar onTouchEnd = function onTouchEnd(e) {\n  if (!state.scroll) {\n    state.startTouchY = 0;\n    state.startTouchX = 0;\n  }\n};\n\nif (typeof window !== 'undefined') {\n  window.addEventListener('resize', onResize);\n}\n\nif (typeof document !== 'undefined') {\n  document.addEventListener('touchstart', onTouchStart);\n  document.addEventListener('touchmove', scroll_lock_onTouchMove, {\n    passive: false\n  });\n  document.addEventListener('touchend', onTouchEnd);\n}\n\nvar deprecatedMethods = {\n  hide: function hide(target) {\n    throwError('\"hide\" is deprecated! Use \"disablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#disablepagescrollscrollabletarget');\n    disablePageScroll(target);\n  },\n  show: function show(target) {\n    throwError('\"show\" is deprecated! Use \"enablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#enablepagescrollscrollabletarget');\n    enablePageScroll(target);\n  },\n  toggle: function toggle(target) {\n    throwError('\"toggle\" is deprecated! Do not use it.');\n\n    if (getScrollState()) {\n      disablePageScroll();\n    } else {\n      enablePageScroll(target);\n    }\n  },\n  getState: function getState() {\n    throwError('\"getState\" is deprecated! Use \"getScrollState\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getscrollstate');\n    return getScrollState();\n  },\n  getWidth: function getWidth() {\n    throwError('\"getWidth\" is deprecated! Use \"getPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getpagescrollbarwidth');\n    return getPageScrollBarWidth();\n  },\n  getCurrentWidth: function getCurrentWidth() {\n    throwError('\"getCurrentWidth\" is deprecated! Use \"getCurrentPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getcurrentpagescrollbarwidth');\n    return getCurrentPageScrollBarWidth();\n  },\n  setScrollableTargets: function setScrollableTargets(target) {\n    throwError('\"setScrollableTargets\" is deprecated! Use \"addScrollableTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addscrollabletargetscrollabletarget');\n    scroll_lock_addScrollableTarget(target);\n  },\n  setFillGapSelectors: function setFillGapSelectors(selector) {\n    throwError('\"setFillGapSelectors\" is deprecated! Use \"addFillGapSelector\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgapselectorfillgapselector');\n    scroll_lock_addFillGapSelector(selector);\n  },\n  setFillGapTargets: function setFillGapTargets(target) {\n    throwError('\"setFillGapTargets\" is deprecated! Use \"addFillGapTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgaptargetfillgaptarget');\n    scroll_lock_addFillGapTarget(target);\n  },\n  clearQueue: function clearQueue() {\n    throwError('\"clearQueue\" is deprecated! Use \"clearQueueScrollLocks\" instead. \\n https://github.com/FL3NKEY/scroll-lock#clearqueuescrolllocks');\n    clearQueueScrollLocks();\n  }\n};\n\nvar scrollLock = _objectSpread({\n  disablePageScroll: disablePageScroll,\n  enablePageScroll: enablePageScroll,\n  getScrollState: getScrollState,\n  clearQueueScrollLocks: clearQueueScrollLocks,\n  getTargetScrollBarWidth: scroll_lock_getTargetScrollBarWidth,\n  getCurrentTargetScrollBarWidth: scroll_lock_getCurrentTargetScrollBarWidth,\n  getPageScrollBarWidth: getPageScrollBarWidth,\n  getCurrentPageScrollBarWidth: getCurrentPageScrollBarWidth,\n  addScrollableSelector: scroll_lock_addScrollableSelector,\n  removeScrollableSelector: scroll_lock_removeScrollableSelector,\n  addScrollableTarget: scroll_lock_addScrollableTarget,\n  removeScrollableTarget: scroll_lock_removeScrollableTarget,\n  addLockableSelector: scroll_lock_addLockableSelector,\n  addLockableTarget: scroll_lock_addLockableTarget,\n  addFillGapSelector: scroll_lock_addFillGapSelector,\n  removeFillGapSelector: scroll_lock_removeFillGapSelector,\n  addFillGapTarget: scroll_lock_addFillGapTarget,\n  removeFillGapTarget: scroll_lock_removeFillGapTarget,\n  setFillGapMethod: scroll_lock_setFillGapMethod,\n  refillGaps: refillGaps,\n  _state: state\n}, deprecatedMethods);\n\n/* harmony default export */ var scroll_lock = __webpack_exports__[\"default\"] = (scrollLock);\n\n/***/ })
1\n/******/ ])[\"default\"];\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2Nyb2xsLWxvY2svZGlzdC9zY3JvbGwtbG9jay5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vbm9kZV9tb2R1bGVzL3Njcm9sbC1sb2NrL2Rpc3Qvc2Nyb2xsLWxvY2suanM/MzI1MSJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJzY3JvbGxMb2NrXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInNjcm9sbExvY2tcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybi
1B2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvdG9vbHMuanNcbnZhciBhcmd1bWVudEFzQXJyYXkgPSBmdW5jdGlvbiBhcmd1bWVudEFzQXJyYXkoYXJndW1lbnQpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJndW1lbnQpID8gYXJndW1lbnQgOiBbYXJndW1lbnRdO1xufTtcbnZhciBpc0VsZW1lbnQgPSBmdW5jdGlvbiBpc0VsZW1lbnQodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBOb2RlO1xufTtcbnZhciBpc0VsZW1lbnRMaXN0ID0gZnVuY3Rpb24gaXNFbGVtZW50TGlzdChub2RlTGlzdCkge1xuICByZXR1cm4gbm9kZUxpc3QgaW5zdGFuY2VvZiBOb2RlTGlzdDtcbn07XG52YXIgZWFjaE5vZGUgPSBmdW5jdGlvbiBlYWNoTm9kZShub2RlTGlzdCwgY2FsbGJhY2spIHtcbiAgaWYgKG5vZGVMaXN0ICYmIGNhbGxiYWNrKSB7XG4gICAgbm9kZUxpc3QgPSBpc0VsZW1lbnRMaXN0KG5vZGVMaXN0KSA/IG5vZGVMaXN0IDogW25vZGVMaXN0XTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChjYWxsYmFjayhub2RlTGlzdFtpXSwgaSwgbm9kZUxpc3QubGVuZ3RoKSA9PT0gdHJ1ZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG52YXIgdGhyb3dFcnJvciA9IGZ1bmN0aW9uIHRocm93RXJyb3IobWVzc2FnZSkge1xuICByZXR1cm4gY29uc29sZS5lcnJvcihcIltzY3JvbGwtbG9ja10gXCIuY29uY2F0KG1lc3NhZ2UpKTtcbn07XG52YXIgYXJyYXlBc1NlbGVjdG9yID0gZnVuY3Rpb24gYXJyYXlBc1NlbGVjdG9yKGFycmF5KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycmF5KSkge1xuICAgIHZhciBzZWxlY3RvciA9IGFycmF5LmpvaW4oJywgJyk7XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9XG59O1xudmFyIG5vZGVMaXN0QXNBcnJheSA9IGZ1bmN0aW9uIG5vZGVMaXN0QXNBcnJheShub2RlTGlzdCkge1xuICB2YXIgbm9kZXMgPSBbXTtcbiAgZWFjaE5vZGUobm9kZUxpc3QsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGVzLnB1c2gobm9kZSk7XG4gIH0pO1xuICByZXR1cm4gbm9kZXM7XG59O1xudmFyIGZpbmRQYXJlbnRCeVNlbGVjdG9yID0gZnVuY3Rpb24gZmluZFBhcmVudEJ5U2VsZWN0b3IoJGVsLCBzZWxlY3Rvcikge1xuICB2YXIgc2VsZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgdmFyICRyb290ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBkb2N1bWVudDtcblxuICBpZiAoc2VsZiAmJiBub2RlTGlzdEFzQXJyYXkoJHJvb3QucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpLmluZGV4T2YoJGVsKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gJGVsO1xuICB9XG5cbiAgd2hpbGUgKCgkZWwgPSAkZWwucGFyZW50RWxlbWVudCkgJiYgbm9kZUxpc3RBc0FycmF5KCRyb290LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKS5pbmRleE9mKCRlbCkgPT09IC0xKSB7XG4gICAgO1xuICB9XG5cbiAgcmV0dXJuICRlbDtcbn07XG52YXIgZWxlbWVudEhhc1NlbGVjdG9yID0gZnVuY3Rpb24gZWxlbWVudEhhc1NlbGVjdG9yKCRlbCwgc2VsZWN0b3IpIHtcbiAgdmFyICRyb290ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBkb2N1bWVudDtcbiAgdmFyIGhhcyA9IG5vZGVMaXN0QXNBcnJheSgkcm9vdC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSkuaW5kZXhPZigkZWwpICE9PSAtMTtcbiAgcmV0dXJuIGhhcztcbn07XG52YXIgZWxlbWVudEhhc092ZXJmbG93SGlkZGVuID0gZnVuY3Rpb24gZWxlbWVudEhhc092ZXJmbG93SGlkZGVuKCRlbCkge1xuICBpZiAoJGVsKSB7XG4gICAgdmFyIGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKCRlbCk7XG4gICAgdmFyIG92ZXJmbG93SXNIaWRkZW4gPSBjb21wdXRlZFN0eWxlLm92ZXJmbG93ID09PSAnaGlkZGVuJztcbiAgICByZXR1cm4gb3ZlcmZsb3dJc0hpZGRlbjtcbiAgfVxufTtcbnZhciBlbGVtZW50U2Nyb2xsVG9wT25TdGFydCA9IGZ1bmN0aW9uIGVsZW1lbnRTY3JvbGxUb3BPblN0YXJ0KCRlbCkge1xuICBpZiAoJGVsKSB7XG4gICAgaWYgKGVsZW1lbnRIYXNPdmVyZmxvd0hpZGRlbigkZWwpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgc2Nyb2xsVG9wID0gJGVsLnNjcm9sbFRvcDtcbiAgICByZXR1cm4gc2Nyb2xsVG9wIDw9IDA7XG4gIH1cbn07XG52YXIgZWxlbWVudFNjcm9sbFRvcE9uRW5kID0gZnVuY3Rpb24gZWxlbWVudFNjcm9sbFRvcE9uRW5kKCRlbCkge1xuICBpZiAoJGVsKSB7XG4gICAgaWYgKGVsZW1lbnRIYXNPdmVyZmxvd0hpZGRlbigkZWwpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgc2Nyb2xsVG9wID0gJGVsLnNjcm9sbFRvcDtcbiAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gJGVsLnNjcm9sbEhlaWdodDtcbiAgICB2YXIgc2Nyb2xsVG9wV2l0aEhlaWdodCA9IHNjcm9sbFRvcCArICRlbC5vZmZzZXRIZWlnaHQ7XG4gICAgcmV0dXJuIHNjcm9sbFRvcFdpdGhIZWlnaHQgPj0gc2Nyb2xsSGVpZ2h0O1xuICB9XG59O1xudmFyIGVsZW1lbnRTY3JvbGxMZWZ0T25TdGFydCA9IGZ1bmN0aW9uIGVsZW1lbnRTY3JvbGxMZWZ0T25TdGFydCgkZWwpIHtcbiAgaWYgKCRlbCkge1xuICAgIGlmIChlbGVtZW50SGFzT3ZlcmZsb3dIaWRkZW4oJGVsKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHNjcm9sbExlZnQgPSAkZWwuc2Nyb2xsTGVmdDtcbiAgICByZXR1cm4gc2Nyb2xsTGVmdCA8PSAwO1xuICB9XG59O1xudmFyIGVsZW1lbnRTY3JvbGxMZWZ0T25FbmQgPSBmdW5jdGlvbiBlbGVtZW50U2Nyb2xsTGVmdE9uRW5kKCRlbCkge1xuICBpZiAoJGVsKSB7XG4gICAgaWYgKGVsZW1lbnRIYXNPdmVyZmxvd0hpZGRlbigkZWwpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgc2Nyb2xsTGVmdCA9ICRlbC5zY3JvbGxMZWZ0O1xuICAgIHZhciBzY3JvbGxXaWR0aCA9ICRlbC5zY3JvbGxXaWR0aDtcbiAgICB2YXIgc2Nyb2xsTGVmdFdpdGhXaWR0aCA9IHNjcm9sbExlZnQgKyAkZWwub2Zmc2V0V2lkdGg7XG4gICAgcmV0dXJuIHNjcm9sbExlZnRXaXRoV2lkdGggPj0gc2Nyb2xsV2lkdGg7XG4gIH1cbn07XG52YXIgZWxlbWVudElzU2Nyb2xsYWJsZUZpZWxkID0gZnVuY3Rpb24gZWxlbWVudElzU2Nyb2xsYWJsZUZpZWxkKCRlbCkge1xuICB2YXIgc2VsZWN0b3IgPSAndGV4dGFyZWEsIFtjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJztcbiAgcmV0dXJuIGVsZW1lbnRIYXNTZWxlY3RvcigkZWwsIHNlbGVjdG9yKTtcbn07XG52YXIgZWxlbWVudElzSW5wdXRSYW5nZSA9IGZ1bmN0aW9uIGVsZW1lbnRJc0lucHV0UmFuZ2UoJGVsKSB7XG4gIHZhciBzZWxlY3RvciA9ICdpbnB1dFt0eXBlPVwicmFuZ2VcIl0nO1xuICByZXR1cm4gZWxlbWVudEhhc1NlbGVjdG9yKCRlbCwgc2VsZWN0b3IpO1xufTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVT
1EU6IC4vc3JjL3Njcm9sbC1sb2NrLmpzXG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZGlzYWJsZVBhZ2VTY3JvbGxcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBkaXNhYmxlUGFnZVNjcm9sbDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZW5hYmxlUGFnZVNjcm9sbFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGVuYWJsZVBhZ2VTY3JvbGw7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImdldFNjcm9sbFN0YXRlXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZ2V0U2Nyb2xsU3RhdGU7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImNsZWFyUXVldWVTY3JvbGxMb2Nrc1wiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGNsZWFyUXVldWVTY3JvbGxMb2NrczsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZ2V0VGFyZ2V0U2Nyb2xsQmFyV2lkdGhcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19nZXRUYXJnZXRTY3JvbGxCYXJXaWR0aDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJnZXRQYWdlU2Nyb2xsQmFyV2lkdGhcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBnZXRQYWdlU2Nyb2xsQmFyV2lkdGg7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGhcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBnZXRDdXJyZW50UGFnZVNjcm9sbEJhcldpZHRoOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhZGRTY3JvbGxhYmxlVGFyZ2V0XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVRhcmdldDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwicmVtb3ZlU2Nyb2xsYWJsZVRhcmdldFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX3JlbW92ZVNjcm9sbGFibGVUYXJnZXQ7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFkZFNjcm9sbGFibGVTZWxlY3RvclwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX2FkZFNjcm9sbGFibGVTZWxlY3RvcjsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwicmVtb3ZlU2Nyb2xsYWJsZVNlbGVjdG9yXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfcmVtb3ZlU2Nyb2xsYWJsZVNlbGVjdG9yOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhZGRMb2NrYWJsZVRhcmdldFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX2FkZExvY2thYmxlVGFyZ2V0OyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhZGRMb2NrYWJsZVNlbGVjdG9yXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfYWRkTG9ja2FibGVTZWxlY3RvcjsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwic2V0RmlsbEdhcE1ldGhvZFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX3NldEZpbGxHYXBNZXRob2Q7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFkZEZpbGxHYXBUYXJnZXRcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19hZGRGaWxsR2FwVGFyZ2V0OyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJyZW1vdmVGaWxsR2FwVGFyZ2V0XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfcmVtb3ZlRmlsbEdhcFRhcmdldDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYWRkRmlsbEdhcFNlbGVjdG9yXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFNlbGVjdG9yOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJyZW1vdmVGaWxsR2FwU2VsZWN0b3JcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19yZW1vdmVGaWxsR2FwU2VsZWN0b3I7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInJlZmlsbEdhcHNcIiwgZnVuY3Rpb24oKSB7IHJldHVybi
1ByZWZpbGxHYXBzOyB9KTtcbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuXG52YXIgRklMTF9HQVBfQVZBSUxBQkxFX01FVEhPRFMgPSBbJ3BhZGRpbmcnLCAnbWFyZ2luJywgJ3dpZHRoJywgJ21heC13aWR0aCcsICdub25lJ107XG52YXIgVE9VQ0hfRElSRUNUSU9OX0RFVEVDVF9PRkZTRVQgPSAzO1xudmFyIHN0YXRlID0ge1xuICBzY3JvbGw6IHRydWUsXG4gIHF1ZXVlOiAwLFxuICBzY3JvbGxhYmxlU2VsZWN0b3JzOiBbJ1tkYXRhLXNjcm9sbC1sb2NrLXNjcm9sbGFibGVdJ10sXG4gIGxvY2thYmxlU2VsZWN0b3JzOiBbJ2JvZHknLCAnW2RhdGEtc2Nyb2xsLWxvY2stbG9ja2FibGVdJ10sXG4gIGZpbGxHYXBTZWxlY3RvcnM6IFsnYm9keScsICdbZGF0YS1zY3JvbGwtbG9jay1maWxsLWdhcF0nLCAnW2RhdGEtc2Nyb2xsLWxvY2stbG9ja2FibGVdJ10sXG4gIGZpbGxHYXBNZXRob2Q6IEZJTExfR0FQX0FWQUlMQUJMRV9NRVRIT0RTWzBdLFxuICAvL1xuICBzdGFydFRvdWNoWTogMCxcbiAgc3RhcnRUb3VjaFg6IDBcbn07XG52YXIgZGlzYWJsZVBhZ2VTY3JvbGwgP
1SBmdW5jdGlvbiBkaXNhYmxlUGFnZVNjcm9sbCh0YXJnZXQpIHtcbiAgaWYgKHN0YXRlLnF1ZXVlIDw9IDApIHtcbiAgICBzdGF0ZS5zY3JvbGwgPSBmYWxzZTtcbiAgICBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvdygpO1xuICAgIGZpbGxHYXBzKCk7XG4gIH1cblxuICBzY3JvbGxfbG9ja19hZGRTY3JvbGxhYmxlVGFyZ2V0KHRhcmdldCk7XG4gIHN0YXRlLnF1ZXVlKys7XG59O1xudmFyIGVuYWJsZVBhZ2VTY3JvbGwgPSBmdW5jdGlvbiBlbmFibGVQYWdlU2Nyb2xsKHRhcmdldCkge1xuICBzdGF0ZS5xdWV1ZSA+IDAgJiYgc3RhdGUucXVldWUtLTtcblxuICBpZiAoc3RhdGUucXVldWUgPD0gMCkge1xuICAgIHN0YXRlLnNjcm9sbCA9IHRydWU7XG4gICAgc2Nyb2xsX2xvY2tfc2hvd0xvY2thYmxlT3ZlcmZsb3coKTtcbiAgICB1bmZpbGxHYXBzKCk7XG4gIH1cblxuICBzY3JvbGxfbG9ja19yZW1vdmVTY3JvbGxhYmxlVGFyZ2V0KHRhcmdldCk7XG59O1xudmFyIGdldFNjcm9sbFN0YXRlID0gZnVuY3Rpb24gZ2V0U2Nyb2xsU3RhdGUoKSB7XG4gIHJldHVybiBzdGF0ZS5zY3JvbGw7XG59O1xudmFyIGNsZWFyUXVldWVTY3JvbGxMb2NrcyA9IGZ1bmN0aW9uIGNsZWFyUXVldWVTY3JvbGxMb2NrcygpIHtcbiAgc3RhdGUucXVldWUgPSAwO1xufTtcbnZhciBzY3JvbGxfbG9ja19nZXRUYXJnZXRTY3JvbGxCYXJXaWR0aCA9IGZ1bmN0aW9uIGdldFRhcmdldFNjcm9sbEJhcldpZHRoKCR0YXJnZXQpIHtcbiAgdmFyIG9ubHlFeGlzdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICB2YXIgY3VycmVudE92ZXJmbG93WVByb3BlcnR5ID0gJHRhcmdldC5zdHlsZS5vdmVyZmxvd1k7XG5cbiAgICBpZiAob25seUV4aXN0cykge1xuICAgICAgaWYgKCFnZXRTY3JvbGxTdGF0ZSgpKSB7XG4gICAgICAgICR0YXJnZXQuc3R5bGUub3ZlcmZsb3dZID0gJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtb3ZlcmZsb3cteS1wcm9wZXJ0eScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93WSA9ICdzY3JvbGwnO1xuICAgIH1cblxuICAgIHZhciB3aWR0aCA9IHNjcm9sbF9sb2NrX2dldEN1cnJlbnRUYXJnZXRTY3JvbGxCYXJXaWR0aCgkdGFyZ2V0KTtcbiAgICAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93WSA9IGN1cnJlbnRPdmVyZmxvd1lQcm9wZXJ0eTtcbiAgICByZXR1cm4gd2lkdGg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoID0gZnVuY3Rpb24gZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoKCR0YXJnZXQpIHtcbiAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgIGlmICgkdGFyZ2V0ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICB2Y
1XIgZG9jdW1lbnRXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIHZhciB3aW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgdmFyIGN1cnJlbnRXaWR0aCA9IHdpbmRvd1dpZHRoIC0gZG9jdW1lbnRXaWR0aDtcbiAgICAgIHJldHVybiBjdXJyZW50V2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBib3JkZXJMZWZ0V2lkdGhDdXJyZW50UHJvcGVydHkgPSAkdGFyZ2V0LnN0eWxlLmJvcmRlckxlZnRXaWR0aDtcbiAgICAgIHZhciBib3JkZXJSaWdodFdpZHRoQ3VycmVudFByb3BlcnR5ID0gJHRhcmdldC5zdHlsZS5ib3JkZXJSaWdodFdpZHRoO1xuICAgICAgJHRhcmdldC5zdHlsZS5ib3JkZXJMZWZ0V2lkdGggPSAnMHB4JztcbiAgICAgICR0YXJnZXQuc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCA9ICcwcHgnO1xuXG4gICAgICB2YXIgX2N1cnJlbnRXaWR0aCA9ICR0YXJnZXQub2Zmc2V0V2lkdGggLSAkdGFyZ2V0LmNsaWVudFdpZHRoO1xuXG4gICAgICAkdGFyZ2V0LnN0eWxlLmJvcmRlckxlZnRXaWR0aCA9IGJvcmRlckxlZnRXaWR0aEN1cnJlbnRQcm9wZXJ0eTtcbiAgICAgICR0YXJnZXQuc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCA9IGJvcmRlclJpZ2h0V2lkdGhDdXJyZW50UHJvcGVydHk7XG4gICAgICByZXR1cm4gX2N1cnJlbnRXaWR0aDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG52YXIgZ2V0UGFnZVNjcm9sbEJhcldpZHRoID0gZnVuY3Rpb24gZ2V0UGFnZVNjcm9sbEJhcldpZHRoKCkge1xuICB2YXIgb25seUV4aXN0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gIHJldHVybiBzY3JvbGxfbG9ja19nZXRUYXJnZXRTY3JvbGxCYXJXaWR0aChkb2N1bWVudC5ib2R5LCBvbmx5RXhpc3RzKTtcbn07XG52YXIgZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aCA9IGZ1bmN0aW9uIGdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGgoKSB7XG4gIHJldHVybiBzY3JvbGxfbG9ja19nZXRDdXJyZW50VGFyZ2V0U2Nyb2xsQmFyV2lkdGgoZG9jdW1lbnQuYm9keSk7XG59O1xudmFyIHNjcm9sbF9sb2NrX2FkZFNjcm9sbGFibGVUYXJnZXQgPSBmdW5jdGlvbiBhZGRTY3JvbGxhYmxlVGFyZ2V0KHRhcmdldCkge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgdmFyIHRhcmdldHMgPSBhcmd1bWVudEFzQXJyYXkodGFyZ2V0KTtcbiAgICB0YXJnZXRzLm1hcChmdW5jdGlvbiAoJHRhcmdldHMpIHtcbiAgICAgIGVhY2hOb2RlKCR0YXJnZXRzLCBmdW5jdGlvbiAoJHRhcmdldCkge1xuICAgICAgICBpZiAoaXNFbGVtZW50KCR0YXJnZXQpKSB7XG4gICAgICAgICAgJHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2Nyb2xsYWJsZScsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdCgkdGFyZ2V0LCBcIlxcXCIgaXMgbm90IGEgRWxlbWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19yZW1vdmVTY3JvbGxhYmxlVGFyZ2V0ID0gZnVuY3Rpb24gcmVtb3ZlU2Nyb2xsYWJsZVRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIHZhciB0YXJnZXRzID0gYXJndW1lbnRBc0FycmF5KHRhcmdldCk7XG4gICAgdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKCR0YXJnZXRzKSB7XG4gICAgICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICAgICAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgICAgICAgICR0YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLXNjcm9sbGFibGUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdCgkdGFyZ2V0LCBcIlxcXCIgaXMgbm90IGEgRWxlbWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19hZGRTY3JvbGxhYmxlU2VsZWN0b3IgPSBmdW5jdGlvbiBhZGRTY3JvbGxhYmxlU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgaWYgKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbGVjdG9ycyA9IGFyZ3VtZW50QXNBcnJheShzZWxlY3Rvcik7XG4gICAgc2VsZWN0b3JzLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgIHN0YXRlLnNjcm9sbGFibGVTZWxlY3RvcnMucHVzaChzZWxlY3Rvcik7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfcmVtb3ZlU2Nyb2xsYWJsZVNlbGVjdG9yID0gZnVuY3Rpb24gcmVtb3ZlU2Nyb2xsYWJsZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIGlmIChzZWxlY3Rvcikge1xuICAgIHZhciBzZWxlY3RvcnMgPSBhcmd1bWVudEFzQXJyYXkoc2VsZWN0b3IpO1xuICAgIHNlbGVjdG9ycy5tYXAoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICBzdGF0ZS5zY3JvbGxhYmxlU2VsZWN0b3JzID0gc3RhdGUuc2Nyb2xsYWJsZVNlbGVjdG9ycy5maWx0ZXIoZnVuY3Rpb24gKHNTZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gc1NlbGVjdG9yICE9PSBzZWxlY3RvcjtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjcm9sbF9sb2NrX2FkZExvY2thYmxlVGFyZ2V0ID0gZnVuY3Rpb24gYWRkTG9ja2FibGVUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICB2YXIgdGFyZ2V0cyA9IGFyZ3VtZW50QXNBcnJheSh0YXJnZXQpO1xuICAgIHRhcmdldHMubWFwKGZ1bmN0aW9uICgkdGFyZ2V0cykge1xuICAgICAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgICAgIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICAgICAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1sb2NrYWJsZScsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdCgkdGFyZ2V0LCBcIlxcXCIgaXMgbm90IGEgRWxlbWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmICghZ2V0U2Nyb2xsU3RhdGUoKSkge1xuICAgICAgc2Nyb2xsX2xvY2tfaGlkZUxvY2thYmxlT3ZlcmZsb3coKTtcbiAgICB9XG4gI
1H1cbn07XG52YXIgc2Nyb2xsX2xvY2tfYWRkTG9ja2FibGVTZWxlY3RvciA9IGZ1bmN0aW9uIGFkZExvY2thYmxlU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgaWYgKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbGVjdG9ycyA9IGFyZ3VtZW50QXNBcnJheShzZWxlY3Rvcik7XG4gICAgc2VsZWN0b3JzLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgIHN0YXRlLmxvY2thYmxlU2VsZWN0b3JzLnB1c2goc2VsZWN0b3IpO1xuICAgIH0pO1xuXG4gICAgaWYgKCFnZXRTY3JvbGxTdGF0ZSgpKSB7XG4gICAgICBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvdygpO1xuICAgIH1cblxuICAgIHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfc2V0RmlsbEdhcE1ldGhvZCA9IGZ1bmN0aW9uIHNldEZpbGxHYXBNZXRob2QobWV0aG9kKSB7XG4gIGlmIChtZXRob2QpIHtcbiAgICBpZiAoRklMTF9HQVBfQVZBSUxBQkxFX01FVEhPRFMuaW5kZXhPZihtZXRob2QpICE9PSAtMSkge1xuICAgICAgc3RhdGUuZmlsbEdhcE1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIHJlZmlsbEdhcHMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG1ldGhvZHMgPSBGSUxMX0dBUF9BVkFJTEFCTEVfTUVUSE9EUy5qb2luKCcsICcpO1xuICAgICAgdGhyb3dFcnJvcihcIlxcXCJcIi5jb25jYXQobWV0aG9kLCBcIlxcXCIgbWV0aG9kIGlzIG5vdCBhdmFpbGFibGUhXFxuQXZhaWxhYmxlIGZpbGwgZ2FwIG1ldGhvZHM6IFwiKS5jb25jYXQobWV0aG9kcywgXCIuXCIpKTtcbiAgICB9XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFRhcmdldCA9IGZ1bmN0aW9uIGFkZEZpbGxHYXBUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICB2YXIgdGFyZ2V0cyA9IGFyZ3VtZW50QXNBcnJheSh0YXJnZXQpO1xuICAgIHRhcmdldHMubWFwKGZ1bmN0aW9uICgkdGFyZ2V0cykge1xuICAgICAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgICAgIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICAgICAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1maWxsLWdhcCcsICcnKTtcblxuICAgICAgICAgIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgICAgICAgICBzY3JvbGxfbG9ja19maWxsR2FwVGFyZ2V0KCR0YXJnZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdCgkdGFyZ2V0LCBcIlxcXCIgaXMgbm90IGEgRWxlbWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19yZW1vdmVGaWxsR2FwVGFyZ2V0ID0gZnVuY3Rpb24gcmVtb3ZlRmlsbEdhcFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIHZhciB0YXJnZXRzID0gYXJndW1lbnRBc0FycmF5KHRhcmdldCk7XG4gICAgdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKCR0YXJnZXRzKSB7XG4gICAgICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICAgICAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgICAgICAgICR0YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWZpbGwtZ2FwJyk7XG5cbiAgICAgICAgICBpZiAoIXN0YXRlLnNjcm9sbCkge1xuICAgICAgICAgICAgc2Nyb2xsX2xvY2tfdW5maWxsR2FwVGFyZ2V0KCR0YXJnZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdCgkdGFyZ2V0LCBcIlxcXCIgaXMgbm90IGEgRWxlbWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19hZGRGaWxsR2FwU2VsZWN0b3IgPSBmdW5jdGlvbiBhZGRGaWxsR2FwU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgaWYgKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbGVjdG9ycyA9IGFyZ3VtZW50QXNBcnJheShzZWxlY3Rvcik7XG4gICAgc2VsZWN0b3JzLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgIGlmIChzdGF0ZS5maWxsR2FwU2VsZWN0b3JzLmluZGV4T2Yoc2VsZWN0b3IpID09PSAtMSkge1xuICAgICAgICBzdGF0ZS5maWxsR2FwU2VsZWN0b3JzLnB1c2goc2VsZWN0b3IpO1xuXG4gICAgICAgIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgICAgICAgc2Nyb2xsX2xvY2tfZmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xudmFyIHNjcm9sbF9sb2NrX3JlbW92ZUZpbGxHYXBTZWxlY3RvciA9IGZ1bmN0aW9uIHJlbW92ZUZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcikge1xuICBpZiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgc2VsZWN0b3JzID0gYXJndW1lbnRBc0FycmF5KHNlbGVjdG9yKTtcbiAgICBzZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgc3RhdGUuZmlsbEdhcFNlbGVjdG9ycyA9IHN0YXRlLmZpbGxHYXBTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uIChmU2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGZTZWxlY3RvciAhPT0gc2VsZWN0b3I7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFzdGF0ZS5zY3JvbGwpIHtcbiAgICAgICAgc2Nyb2xsX2xvY2tfdW5maWxsR2FwU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xudmFyIHJlZmlsbEdhcHMgPSBmdW5jdGlvbiByZWZpbGxHYXBzKCkge1xuICBpZiAoIXN0YXRlLnNjcm9sbCkge1xuICAgIGZpbGxHYXBzKCk7XG4gIH1cbn07XG5cbnZhciBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvdyA9IGZ1bmN0aW9uIGhpZGVMb2NrYWJsZU92ZXJmbG93KCkge1xuICB2YXIgc2VsZWN0b3IgPSBhcnJheUFzU2VsZWN0b3Ioc3RhdGUubG9ja2FibGVTZWxlY3RvcnMpO1xuICBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvd1NlbGVjdG9yKHNlbGVjdG9yKTtcbn07XG5cbnZhciBzY3JvbGxfbG9ja19zaG93TG9ja2FibGVPdmVyZmxvdyA9IGZ1bmN0aW9uIHNob3dMb2NrYWJsZU92ZXJmbG93KCkge1xuICB2YXIgc2VsZWN0b3IgPSBhcnJheUFzU2VsZWN0b3Ioc3RhdGUubG9ja2FibGVTZWxlY3RvcnMpO1xuICBzY3JvbGxfbG9ja19zaG93TG9ja2FibGVPdmVyZmxvd1NlbGVjdG9yKHNlbGVjdG9yKTtcbn07XG5cbnZhciBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvd1NlbGVjdG9yID0gZnVuY3Rpb24gaGlkZUxvY2thYmxlT3ZlcmZsb3dTZWxlY3RvcihzZWxlY3Rvcikge1xuICB2YXIgJHRhcmdldHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgc2Nyb2xsX2xvY2tfaGlkZUxvY2thYmxlT3ZlcmZsb3dUYXJnZXQoJHRhcmdldCk7XG4gIH0pO1xufTtcblxudmFyIHNjcm9sbF9sb2NrX3Nob3dMb2NrYWJsZU92ZXJmbG93U2VsZWN0b3IgPSBmdW5jdGlvbiBzaG93TG9ja2FibGVPdmVyZmxvd1NlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIHZhciAkdGFyZ2V0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICBzY3JvbGxfbG9ja19zaG93TG9ja2FibGVPdmVyZmxvd1RhcmdldCgkdGFyZ2V0KTtcbiAgfSk7XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfaGlkZUxvY2thYmxlT3ZlcmZsb3dUYXJnZXQgPSBmdW5jdGlvbiBoaWRlTG9ja2FibGVPdmVyZmxvd1RhcmdldCgkdGFyZ2V0KSB7XG4gIGlmIChpc0VsZW1lbnQoJHRhcmdldCkgJiYgJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stbG9ja2VkJykgIT09ICd0cnVlJykge1xuICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoJHRhcmdldCk7XG4gICAgJHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtb3ZlcmZsb3cteS1wcm9wZXJ0eScsIGNvbXB1dGVkU3R5bGUub3ZlcmZsb3dZKTtcbiAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1pbmxpbmUtb3ZlcmZsb3ctcHJv
1cGVydHknLCAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93KTtcbiAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1pbmxpbmUtb3ZlcmZsb3cteS1wcm9wZXJ0eScsICR0YXJnZXQuc3R5bGUub3ZlcmZsb3dZKTtcbiAgICAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgJHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stbG9ja2VkJywgJ3RydWUnKTtcbiAgfVxufTtcblxudmFyIHNjcm9sbF9sb2NrX3Nob3dMb2NrYWJsZU92ZXJmbG93VGFyZ2V0ID0gZnVuY3Rpb24gc2hvd0xvY2thYmxlT3ZlcmZsb3dUYXJnZXQoJHRhcmdldCkge1xuICBpZiAoaXNFbGVtZW50KCR0YXJnZXQpICYmICR0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWxvY2tlZCcpID09PSAndHJ1ZScpIHtcbiAgICAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93ID0gJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtaW5saW5lLW92ZXJmbG93LXByb3BlcnR5Jyk7XG4gICAgJHRhcmdldC5zdHlsZS5vdmVyZmxvd1kgPSAkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1pbmxpbmUtb3ZlcmZsb3cteS1wcm9wZXJ0eScpO1xuICAgICR0YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLXNhdmVkLW92ZXJmbG93LXByb3BlcnR5Jyk7XG4gICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtaW5saW5lLW92ZXJmbG93LXByb3BlcnR5Jyk7XG4gICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtaW5saW5lLW92ZXJmbG93LXktcHJvcGVydHknKTtcbiAgICAkdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1sb2NrZWQnKTtcbiAgfVxufTtcblxudmFyIGZpbGxHYXBzID0gZnVuY3Rpb24gZmlsbEdhcHMoKSB7XG4gIHN0YXRlLmZpbGxHYXBTZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHNjcm9sbF9sb2NrX2ZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH0pO1xufTtcblxudmFyIHVuZmlsbEdhcHMgPSBmdW5jdGlvbiB1bmZpbGxHYXBzKCkge1xuICBzdGF0ZS5maWxsR2FwU2VsZWN0b3JzLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICBzY3JvbGxfbG9ja191bmZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH0pO1xufTtcblxudmFyIHNjcm9sbF9sb2NrX2ZpbGxHYXBTZWxlY3RvciA9IGZ1bmN0aW9uIGZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcikge1xuICB2YXIgJHRhcmdldHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgdmFyIGlzTG9ja2FibGUgPSBzdGF0ZS5sb2NrYWJsZVNlbGVjdG9ycy5pbmRleE9mKHNlbGVjdG9yKSAhPT0gLTE7XG4gIGVhY2hOb2RlKCR0YXJnZXRzLCBmdW5jdGlvbiAoJHRhcmdldCkge1xuICAgIHNjcm9sbF9sb2NrX2ZpbGxHYXBUYXJnZXQoJHRhcmdldCwgaXNMb2NrYWJsZSk7XG4gIH0pO1xufTtcblxudmFyIHNjcm9sbF9sb2NrX2ZpbGxHYXBUYXJnZXQgPSBmdW5jdGlvbiBmaWxsR2FwVGFyZ2V0KCR0YXJnZXQpIHtcbiAgdmFyIGlzTG9ja2FibGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICB2YXIgc2Nyb2xsQmFyV2lkdGg7XG5cbiAgICBpZiAoJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stbG9ja2FibGUnKSA9PT0gJycgfHwgaXNMb2NrYWJsZSkge1xuICAgICAgc2Nyb2xsQmFyV2lkdGggPSBzY3JvbGxfbG9ja19nZXRUYXJnZXRTY3JvbGxCYXJXaWR0aCgkdGFyZ2V0LCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyICRsb2NrYWJsZVBhcmVudCA9IGZpbmRQYXJlbnRCeVNlbGVjdG9yKCR0YXJnZXQsIGFycmF5QXNTZWxlY3RvcihzdGF0ZS5sb2NrYWJsZVNlbGVjdG9ycykpO1xuICAgICAgc2Nyb2xsQmFyV2lkdGggPSBzY3JvbGxfbG9ja19nZXRUYXJnZXRTY3JvbGxCYXJXaWR0aCgkbG9ja2FibGVQYXJlbnQsIHRydWUpO1xuICAgIH1cblxuICAgIGlmICgkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1maWxsZWQtZ2FwJykgPT09ICd0cnVlJykge1xuICAgICAgc2Nyb2xsX2xvY2tfdW5maWxsR2FwVGFyZ2V0KCR0YXJnZXQpO1xuICAgIH1cblxuICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoJHRhcmdldCk7XG4gICAgJHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stZmlsbGVkLWdhcCcsICd0cnVlJyk7XG4gICAgJHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stY3VycmVudC1maWxsLWdhcC1tZXRob2QnLCBzdGF0ZS5maWxsR2FwTWV0aG9kKTtcblxuICAgIGlmIChzdGF0ZS5maWxsR2FwTWV0aG9kID09PSAnbWFyZ2luJykge1xuICAgICAgdmFyIGN1cnJlbnRNYXJnaW4gPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUubWFyZ2luUmlnaHQpO1xuICAgICAgJHRhcmdldC5zdHlsZS5tYXJnaW5SaWdodCA9IFwiXCIuY29uY2F0KGN1cnJlbnRNYXJnaW4gKyBzY3JvbGxCYXJXaWR0aCwgXCJweFwiKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmZpbGxHYXBNZXRob2QgPT09ICd3aWR0aCcpIHtcbiAgICAgICR0YXJnZXQuc3R5bGUud2lkdGggPSBcImNhbGMoMTAwJSAtIFwiLmNvbmNhdChzY3JvbGxCYXJXaWR0aCwgXCJweClcIik7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5maWxsR2FwTWV0aG9kID09PSAnbWF4LXdpZHRoJykge1xuICAgICAgJHRhcmdldC5zdHlsZS5tYXhXaWR0aCA9IFwiY2FsYygxMDAlIC0gXCIuY29uY2F0KHNjcm9sbEJhcldpZHRoLCBcInB4KVwiKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmZpbGxHYXBNZXRob2QgPT09ICdwYWRkaW5nJykge1xuICAgICAgdmFyIGN1cnJlbnRQYWRkaW5nID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLnBhZGRpbmdSaWdodCk7XG4gICAgICAkdGFyZ2V0LnN0eWxlLnBhZGRpbmdSaWdodCA9IFwiXCIuY29uY2F0KGN1cnJlbnRQYWRkaW5nICsgc2Nyb2xsQmFyV2lkdGgsIFwicHhcIik7XG4gICAgfVxuICB9XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfdW5maWxsR2FwU2VsZWN0b3IgPSBmdW5jdGlvbiB1bmZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcikge1xuICB2YXIgJHRhcmdldHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgc2Nyb2xsX2xvY2tfdW5maWxsR2FwVGFyZ2V0KCR0YXJnZXQpO1xuICB9KTtcbn07XG5cbnZhciBzY3JvbGxfbG9ja191bmZpbGxHYXBUYXJnZXQgPSBmdW5jdGlvbiB1bmZpbGxHYXBUYXJnZXQoJHRhcmdldCkge1xuICBpZiAoaXNFbGVtZW50KCR0YXJnZXQpKSB7XG4gICAgaWYgKCR0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWZpbGxlZC1nYXAnKSA9PT0gJ3RydWUnKSB7XG4gICAgICB2Y
1XIgY3VycmVudEZpbGxHYXBNZXRob2QgPSAkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1jdXJyZW50LWZpbGwtZ2FwLW1ldGhvZCcpO1xuICAgICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stZmlsbGVkLWdhcCcpO1xuICAgICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stY3VycmVudC1maWxsLWdhcC1tZXRob2QnKTtcblxuICAgICAgaWYgKGN1cnJlbnRGaWxsR2FwTWV0aG9kID09PSAnbWFyZ2luJykge1xuICAgICAgICAkdGFyZ2V0LnN0eWxlLm1hcmdpblJpZ2h0ID0gXCJcIjtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudEZpbGxHYXBNZXRob2QgPT09ICd3aWR0aCcpIHtcbiAgICAgICAgJHRhcmdldC5zdHlsZS53aWR0aCA9IFwiXCI7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRGaWxsR2FwTWV0aG9kID09PSAnbWF4LXdpZHRoJykge1xuICAgICAgICAkdGFyZ2V0LnN0eWxlLm1heFdpZHRoID0gXCJcIjtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudEZpbGxHYXBNZXRob2QgPT09ICdwYWRkaW5nJykge1xuICAgICAgICAkdGFyZ2V0LnN0eWxlLnBhZGRpbmdSaWdodCA9IFwiXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgb25SZXNpemUgPSBmdW5jdGlvbiBvblJlc2l6ZShlKSB7XG4gIHJlZmlsbEdhcHMoKTtcbn07XG5cbnZhciBvblRvdWNoU3RhcnQgPSBmdW5jdGlvbiBvblRvdWNoU3RhcnQoZSkge1xuICBpZiAoIXN0YXRlLnNjcm9sbCkge1xuICAgIHN0YXRlLnN0YXJ0VG91Y2hZID0gZS50b3VjaGVzWzBdLmNsaWVudFk7XG4gICAgc3RhdGUuc3RhcnRUb3VjaFggPSBlLnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgfVxufTtcblxudmFyIHNjcm9sbF9sb2NrX29uVG91Y2hNb3ZlID0gZnVuY3Rpb24gb25Ub3VjaE1vdmUoZSkge1xuICBpZiAoIXN0YXRlLnNjcm9sbCkge1xuICAgIHZhciBzdGFydFRvdWNoWSA9IHN0YXRlLnN0YXJ0VG91Y2hZLFxuICAgICAgICBzdGFydFRvdWNoWCA9IHN0YXRlLnN0YXJ0VG91Y2hYO1xuICAgIHZhciBjdXJyZW50Q2xpZW50WSA9IGUudG91Y2hlc1swXS5jbGllbnRZO1xuICAgIHZhciBjdXJyZW50Q2xpZW50WCA9IGUudG91Y2hlc1swXS5jbGllbnRYO1xuXG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPCAyKSB7XG4gICAgICB2Y
1XIgc2VsZWN0b3IgPSBhcnJheUFzU2VsZWN0b3Ioc3RhdGUuc2Nyb2xsYWJsZVNlbGVjdG9ycyk7XG4gICAgICB2YXIgZGlyZWN0aW9uID0ge1xuICAgICAgICB1cDogc3RhcnRUb3VjaFkgPCBjdXJyZW50Q2xpZW50WSxcbiAgICAgICAgZG93bjogc3RhcnRUb3VjaFkgPiBjdXJyZW50Q2xpZW50WSxcbiAgICAgICAgbGVmdDogc3RhcnRUb3VjaFggPCBjdXJyZW50Q2xpZW50WCxcbiAgICAgICAgcmlnaHQ6IHN0YXJ0VG91Y2hYID4gY3VycmVudENsaWVudFhcbiAgICAgIH07XG4gICAgICB2YXIgZGlyZWN0aW9uV2l0aE9mZnNldCA9IHtcbiAgICAgICAgdXA6IHN0YXJ0VG91Y2hZICsgVE9VQ0hfRElSRUNUSU9OX0RFVEVDVF9PRkZTRVQgPCBjdXJyZW50Q2xpZW50WSxcbiAgICAgICAgZG93bjogc3RhcnRUb3VjaFkgLSBUT1VDSF9ESVJFQ1RJT05fREVURUNUX09GRlNFVCA+IGN1cnJlbnRDbGllbnRZLFxuICAgICAgICBsZWZ0OiBzdGFydFRvdWNoWCArIFRPVUNIX0RJUkVDVElPTl9ERVRFQ1RfT0ZGU0VUIDwgY3VycmVudENsaWVudFgsXG4gICAgICAgIHJpZ2h0OiBzdGFydFRvdWNoWCAtIFRPVUNIX0RJUkVDVElPTl9ERVRFQ1RfT0ZGU0VUID4gY3VycmVudENsaWVudFhcbiAgICAgIH07XG5cbiAgICAgIHZhciBoYW5kbGUgPSBmdW5jdGlvbiBoYW5kbGUoJGVsKSB7XG4gICAgICAgIHZhciBza2lwID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICAgICAgICBpZiAoJGVsKSB7XG4gICAgICAgICAgdmFyIHBhcmVudFNjcm9sbGFibGVFbCA9IGZpbmRQYXJlbnRCeVNlbGVjdG9yKCRlbCwgc2VsZWN0b3IsIGZhbHNlKTtcblxuICAgICAgICAgIGlmIChlbGVtZW50SXNJbnB1dFJhbmdlKCRlbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2tpcCB8fCBlbGVtZW50SXNTY3JvbGxhYmxlRmllbGQoJGVsKSAmJiBmaW5kUGFyZW50QnlTZWxlY3RvcigkZWwsIHNlbGVjdG9yKSB8fCBlbGVtZW50SGFzU2VsZWN0b3IoJGVsLCBzZWxlY3RvcikpIHtcbiAgICAgICAgICAgIHZhciBwcmV2ZW50ID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50U2Nyb2xsTGVmdE9uU3RhcnQoJGVsKSAmJiBlbGVtZW50U2Nyb2xsTGVmdE9uRW5kKCRlbCkpIHtcbiAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbi51cCAmJiBlbGVtZW50U2Nyb2xsVG9wT25TdGFydCgkZWwpIHx8IGRpcmVjdGlvbi5kb3duICYmIGVsZW1lbnRTY3JvbGxUb3BPbkVuZCgkZWwpKSB7XG4gICAgICAgICAgICAgICAgcHJldmVudCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFNjcm9sbFRvcE9uU3RhcnQoJGVsKSAmJiBlbGVtZW50U2Nyb2xsVG9wT25FbmQoJGVsKSkge1xuICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uLmxlZnQgJiYgZWxlbWVudFNjcm9sbExlZnRPblN0YXJ0KCRlbCkgfHwgZGlyZWN0aW9uLnJpZ2h0ICYmIGVsZW1lbnRTY3JvbGxMZWZ0T25FbmQoJGVsKSkge1xuICAgICAgICAgICAgICAgIHByZXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbldpdGhPZmZzZXQudXAgJiYgZWxlbWVudFNjcm9sbFRvcE9uU3RhcnQoJGVsKSB8fCBkaXJlY3Rpb25XaXRoT2Zmc2V0LmRvd24gJiYgZWxlbWVudFNjcm9sbFRvcE9uRW5kKCRlbCkgfHwgZGlyZWN0aW9uV2l0aE9mZnNldC5sZWZ0ICYmIGVsZW1lbnRTY3JvbGxMZWZ0T25TdGFydCgkZWwpIHx8IGRpcmVjdGlvbldpdGhPZmZzZXQucmlnaHQgJiYgZWxlbWVudFNjcm9sbExlZnRPbkVuZCgkZWwpKSB7XG4gICAgICAgICAgICAgIHByZXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJldmVudCkge1xuICAgICAgICAgICAgICBpZiAocGFyZW50U2Nyb2xsYWJsZUVsKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlKHBhcmVudFNjcm9sbGFibGVFbCwgdHJ1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGUocGFyZW50U2Nyb2xsYWJsZUVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaGFuZGxlKGUudGFyZ2V0KTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBvblRvdWNoRW5kID0gZnVuY3Rpb24gb25Ub3VjaEVuZChlKSB7XG4gIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgc3RhdGUuc3RhcnRUb3VjaFkgPSAwO1xuICAgIHN0YXRlLnN0YXJ0VG91Y2hYID0gMDtcbiAgfVxufTtcblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblJlc2l6ZSk7XG59XG5cbmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQpO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBzY3JvbGxfbG9ja19vblRvdWNoTW92ZSwge1xuICAgIHBhc3NpdmU6IGZhbHNlXG4gIH0pO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hFbmQpO1xufVxuXG52YXIgZGVwcmVjYXRlZE1ldGhvZHMgPSB7XG4gIGhpZGU6IGZ1bmN0aW9uIGhpZGUodGFyZ2V0KSB7XG4gICAgdGhyb3dFcnJvcignXCJoaWRlXCIgaXMgZGVwcmVjYXRlZCEgVXNlIFwiZGlzYWJsZVBhZ2VTY3JvbGxcIiBpbnN0ZWFkLiBcXG4gaHR0cHM6Ly9naXRodWIuY29tL0ZMM05LRVkvc2Nyb2xsLWxvY2sjZGlzYWJsZXBhZ2VzY3JvbGxzY3JvbGxhYmxldGFyZ2V0Jyk7XG4gICAgZGlzYWJsZVBhZ2VTY3JvbGwodGFyZ2V0KTtcbiAgfSxcbiAgc2hvdzogZnVuY3Rpb24gc2hvdyh0YXJnZXQpIHtcbiAgICB0aHJvd0Vycm9yKCdcInNob3dcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJlbmFibGVQYWdlU2Nyb2xsXCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2VuYWJsZXBhZ2VzY3JvbGxzY3JvbGxhYmxldGFyZ2V0Jyk7XG4gICAgZW5hYmxlUGFnZVNjcm9sbCh0YXJnZXQpO1xuICB9LFxuICB0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZSh0YXJnZXQpIHtcbiAgICB0aHJvd0Vycm9yKCdcInRvZ2dsZVwiIGlzIGRlcHJlY2F0ZWQhIERvIG5vdCB1c2UgaXQuJyk7XG5cbiAgICBpZiAoZ2V0U2Nyb2xsU3RhdGUoKSkge1xuICAgICAgZGlzYWJsZVBhZ2VTY3JvbGwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5hYmxlUGFnZVNjcm9sbCh0YXJnZXQpO1xuICAgIH1cbiAgfSxcbiAgZ2V0U3RhdGU6IGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIHRocm93RXJyb3IoJ1wiZ2V0U3RhdGVcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJnZXRTY3JvbGxTdGF0ZVwiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNn
1ZXRzY3JvbGxzdGF0ZScpO1xuICAgIHJldHVybiBnZXRTY3JvbGxTdGF0ZSgpO1xuICB9LFxuICBnZXRXaWR0aDogZnVuY3Rpb24gZ2V0V2lkdGgoKSB7XG4gICAgdGhyb3dFcnJvcignXCJnZXRXaWR0aFwiIGlzIGRlcHJlY2F0ZWQhIFVzZSBcImdldFBhZ2VTY3JvbGxCYXJXaWR0aFwiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNnZXRwYWdlc2Nyb2xsYmFyd2lkdGgnKTtcbiAgICByZXR1cm4gZ2V0UGFnZVNjcm9sbEJhcldpZHRoKCk7XG4gIH0sXG4gIGdldEN1cnJlbnRXaWR0aDogZnVuY3Rpb24gZ2V0Q3VycmVudFdpZHRoKCkge1xuICAgIHRocm93RXJyb3IoJ1wiZ2V0Q3VycmVudFdpZHRoXCIgaXMgZGVwcmVjYXRlZCEgVXNlIFwiZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aFwiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNnZXRjdXJyZW50cGFnZXNjcm9sbGJhcndpZHRoJyk7XG4gICAgcmV0dXJuIGdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGgoKTtcbiAgfSxcbiAgc2V0U2Nyb2xsYWJsZVRhcmdldHM6IGZ1bmN0aW9uIHNldFNjcm9sbGFibGVUYXJnZXRzKHRhcmdldCkge1xuICAgIHRocm93RXJyb3IoJ1wic2V0U2Nyb2xsYWJsZVRhcmdldHNcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJhZGRTY3JvbGxhYmxlVGFyZ2V0XCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2FkZHNjcm9sbGFibGV0YXJnZXRzY3JvbGxhYmxldGFyZ2V0Jyk7XG4gICAgc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVRhcmdldCh0YXJnZXQpO1xuICB9LFxuICBzZXRGaWxsR2FwU2VsZWN0b3JzOiBmdW5jdGlvbiBzZXRGaWxsR2FwU2VsZWN0b3JzKHNlbGVjdG9yKSB7XG4gICAgdGhyb3dFcnJvcignXCJzZXRGaWxsR2FwU2VsZWN0b3JzXCIgaXMgZGVwcmVjYXRlZCEgVXNlIFwiYWRkRmlsbEdhcFNlbGVjdG9yXCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2FkZGZpbGxnYXBzZWxlY3RvcmZpbGxnYXBzZWxlY3RvcicpO1xuICAgIHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH0sXG4gIHNldEZpbGxHYXBUYXJnZXRzOiBmdW5jdGlvbiBzZXRGaWxsR2FwVGFyZ2V0cyh0YXJnZXQpIHtcbiAgICB0aHJvd0Vycm9yKCdcInNldEZpbGxHYXBUYXJnZXRzXCIgaXMgZGVwcmVjYXRlZCEgVXNlIFwiYWRkRmlsbEdhcFRhcmdldFwiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNhZGRmaWxsZ2FwdGFyZ2V0ZmlsbGdhcHRhcmdldCcpO1xuICAgIHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBUYXJnZXQodGFyZ2V0KTtcbiAgfSxcbiAgY2xlYXJRdWV1ZTogZnVuY3Rpb24gY2xlYXJRdWV1ZSgpIHtcbiAgICB0aHJvd0Vycm9yKCdcImNsZWFyUXVldWVcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJjbGVhclF1ZXVlU2Nyb2xsTG9ja3NcIiBpbnN0ZWFkLiBcXG4gaHR0cHM6Ly9naXRodWIuY29tL0ZMM05LRVkvc2Nyb2xsLWxvY2sjY2xlYXJxdWV1ZXNjcm9sbGxvY2tzJyk7XG4gICAgY2xlYXJRdWV1ZVNjcm9sbExvY2tzKCk7XG4gIH1cbn07XG5cbnZhciBzY3JvbGxMb2NrID0gX29iamVjdFNwcmVhZCh7XG4gIGRpc2FibGVQYWdlU2Nyb2xsOiBkaXNhYmxlUGFnZVNjcm9sbCxcbiAgZW5hYmxlUGFnZVNjcm9sbDogZW5hYmxlUGFnZVNjcm9sbCxcbiAgZ2V0U2Nyb2xsU3RhdGU6IGdldFNjcm9sbFN0YXRlLFxuICBjbGVhclF1ZXVlU2Nyb2xsTG9ja3M6IGNsZWFyUXVldWVTY3JvbGxMb2NrcyxcbiAgZ2V0VGFyZ2V0U2Nyb2xsQmFyV2lkdGg6IHNjcm9sbF9sb2NrX2dldFRhcmdldFNjcm9sbEJhcldpZHRoLFxuICBnZXRDdXJyZW50VGFyZ2V0U2Nyb2xsQmFyV2lkdGg6IHNjcm9sbF9sb2NrX2dldEN1cnJlbnRUYXJnZXRTY3JvbGxCYXJXaWR0aCxcbiAgZ2V0UGFnZVNjcm9sbEJhcldpZHRoOiBnZXRQYWdlU2Nyb2xsQmFyV2lkdGgsXG4gIGdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGg6IGdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGgsXG4gIGFkZFNjcm9sbGFibGVTZWxlY3Rvcjogc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVNlbGVjdG9yLFxuICByZW1vdmVTY3JvbGxhYmxlU2VsZWN0b3I6IHNjcm9sbF9sb2NrX3JlbW92ZVNjcm9sbGFibGVTZWxlY3RvcixcbiAgYWRkU2Nyb2xsYWJsZVRhcmdldDogc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVRhcmdldCxcbiAgcmVtb3ZlU2Nyb2xsYWJsZVRhcmdldDogc2Nyb2xsX2xvY2tfcmVtb3ZlU2Nyb2xsYWJsZVRhcmdldCxcbiAgYWRkTG9ja2FibGVTZWxlY3Rvcjogc2Nyb2xsX2xvY2tfYWRkTG9ja2FibGVTZWxlY3RvcixcbiAgYWRkTG9ja2FibGVUYXJnZXQ6IHNjcm9sbF9sb2NrX2FkZExvY2thYmxlVGFyZ2V0LFxuICBhZGRGaWxsR2FwU2VsZWN0b3I6IHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBTZWxlY3RvcixcbiAgcmVtb3ZlRmlsbEdhcFNlbGVjdG9yOiBzY3JvbGxfbG9ja19yZW1vdmVGaWxsR2FwU2VsZWN0b3IsXG4gIGFkZEZpbGxHYXBUYXJnZXQ6IHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBUYXJnZXQsXG4gIHJlbW92ZUZpbGxHYXBUYXJnZXQ6IHNjcm9sbF9sb2NrX3JlbW92ZUZpbGxHYXBUYXJnZXQsXG4gIHNldEZpbGxHYXBNZXRob2Q6IHNjcm9sbF9sb2NrX3NldEZpbGxHYXBNZXRob2QsXG4gIHJlZmlsbEdhcHM6IHJlZmlsbEdhcHMsXG4gIF9zdGF0ZTogc3RhdGVcbn0sIGRlcHJlY2F0ZWRNZXRob2RzKTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc2Nyb2xsX2xvY2sgPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChzY3JvbGxMb2NrKTtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pW1wiZGVmYXVsdFwiXTtcbn0pOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EsUUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/scroll-lock/dist/scroll-lock.js\n")})},__webpack_module_cache__={};function __webpack_require__(moduleId){if(__webpack_module_cache__[moduleId])return __webpack_module_cache__[moduleId].exports;
1var module2=__webpack_module_cache__[moduleId]={exports:{}};return __webpack_modules__[moduleId].call(module2.exports,module2,module2.exports,__webpack_require__),module2.exports}(function(){__webpack_require__.n=function(module2){var getter=module2&&module2.__esModule?function(){return module2.default}:function(){return module2};return __webpack_require__.d(getter,{a:getter}),getter}})(),(function(){__webpack_require__.d=function(exports2,definition){for(var key in definition)__webpack_require__.o(definition,key)&&!__webpack_require__.o(exports2,key)&&Object.defineProperty(exports2,key,{enumerable:!0,get:definition[key]})}})(),(function(){__webpack_require__.o=function(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}})(),(function(){__webpack_require__.r=function(exports2){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(exports2,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(exports2,"__esModule",{value:!0})}})(),__webpack_require__("./source/scripts/app.js")})();
2//# sourceMappingURL=/cdn/shop/t/60/assets/app.js.map?v=104344540167097334551788283778

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.