1(function(){var __webpack_modules__={754:function(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__){"use strict";eval("\n// EXTERNAL MODULE: ./wp-content/themes/concinnity/assets/src/scripts/lib/_modernizr-custom_h.js\nvar _modernizr_custom_h = __webpack_require__(709);\n// EXTERNAL MODULE: ./wp-content/themes/concinnity/assets/src/scripts/modules/stickyheader.js\nvar stickyheader = __webpack_require__(37);\n;// CONCATENATED MODULE: ./wp-content/themes/concinnity/assets/src/scripts/modules/utils.js\n// Basic cookie utility functions\n// https://www.w3schools.com/js/js_cookies.asp\n\nfunction setCookie(cname, cvalue, exdays) {\n var d = new Date();\n d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);\n var expires = 'expires=' + d.toUTCString();\n document.cookie = cname + '=' + cvalue + ';' + expires + ';path=/';\n}\nfunction getCookie(cname) {\n var name = cname + '=';\n var ca = document.cookie.split(';');\n for (var i = 0; i < ca.length; i++) {\n var c = ca[i];\n while (' ' == c.charAt(0)) {\n c = c.substring(1);\n }\n if (0 == c.indexOf(name)) {\n return c.substring(name.length, c.length);\n }\n }\n return '';\n}\nfunction checkCookie(cname) {\n var cookie = getCookie(cname);\n if ('' != cookie) {\n return true;\n } else {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./wp-content/themes/concinnity/assets/src/scripts/footer.js\n// Modules.\n\n\n\n\n// Ready.\nwindow.addEventListener('DOMContentLoaded', function () {\n // Replace no-js with js on the root HTML element.\n document.documentElement.className = document.documentElement.className.replace(/\\bno-js\\b/g, '') + ' js ';\n function navToSection(hash, specifiedtime) {\n var time = specifiedtime != undefined ? specifiedtime : 300;\n if (jQuery('#main-header').length) {\n var headerH = jQuery('#main-header').outerHeight();\n } else {\n var headerH = 0;\n }\n var hashpos = jQuery(hash).offset().top;\n var offsets = headerH;\n var target = hashpos - offsets;\n jQuery('html, body').animate({\n scrollTop: target\n }, time);\n }\n jQuery('a[href^=\"#\"]').on('click', function (e) {\n e.preventDefault();\n if (jQuery(this).attr('href') != undefined && jQuery(this).attr('href') != '#') {\n var target = jQuery(this).attr('href');\n navToSection(target);\n }\n });\n\n // Handle clicks on latest posts\n jQuery('.wp-block-latest-posts li').on('click', function (e) {\n if (jQuery(this).find('a').attr('href')) {\n window.location.href = jQuery(this).find('a').attr('href');\n }\n });\n if (jQuery('.wp-block-query .wp-block-post-template.is-layout-grid').length) {\n // Infinite scroll for content\n var InfiniteScroll = __webpack_require__(48);\n jQuery('.wp-block-query .wp-block-post-template.is-layout-grid').each(function () {\n var infButton = document.createElement('a');\n infButton.className = 'view-more-button';\n infButton.innerHTML = 'Load more';\n var infStatus = document.createElement('div');\n infStatus.className = 'page-load-status';\n infStatus.style.display = 'none';\n infStatus.innerHTML = '<div class=\"infinite-scroll-request\"><div class=\"infinite-scroll-request-text\">Loading</div><div class=\"infinite-scroll-request-ellipsis\"><div></div><div></div><div></div><div></div></div></div>';\n jQuery(this).next('.wp-block-query-pagination').hide().before(infButton).before(infStatus);\n var infScroll = new InfiniteScroll('.wp-block-query .wp-block-post-template.is-layout-grid', {\n path: '.wp-block-query-pagination .wp-block-query-pagination-next',\n append: '.wp-block-post',\n history: false,\n button: '.view-more-button',\n // load pages on button click\n scrollThreshold: false,\n status: '.page-load-status'\n });\n });\n }\n\n // If modal needed\n var $modalTargets = jQuery('.cards--resources a.cards__card');\n if ($modalTargets.length) {\n // Close modal on outside click\n jQuery('#cc-modal').on('click', function (e) {\n if (jQuery(e.target).is('.modal__wrap') || jQuery(e.target).is('.modal')) {\n e.preventDefault();\n jQuery('body').removeClass('modal-open');\n }\n });\n // Close modal on close button click\n jQuery('#cc-modal .modal__close').on('click', function () {\n jQuery('body').removeClass('modal-open');\n });\n }\n\n // Resource download click\n jQuery('.cards--resources a.cards__card').on('click', function (e) {\n e.preventDefault();\n // Check if cookie exists from previous download\n if (!checkCookie('ccresourcedownloaded')) {\n // Get resource url\n var resourceUrl = jQuery(this).next('.resources__url').val();\n // Get resource name\n var resourceTitle = jQuery(this).parent().find('.resources__title').html();\n // Get resource type\n var resourceType = jQuery(this).parent().find('.resources__type').val();\n // Set file url in modal\n jQuery('#resource-modal-file-url').val(resourceUrl);\n // Set file name in modal\n jQuery('#resource-text-title').html(resourceTitle);\n // Set file type in modal\n jQuery('#resource-text-type').html(resourceType);\n // Open details capture modal\n jQuery('body').addClass('modal-open');\n } else {\n // If previous download has happened, then just open the file in new window\n var target = jQuery(this).find('.resources__url').val();\n window.open(target);\n }\n });\n document.addEventListener('wpcf7mailsent', function (event) {\n // Get resource url\n var target = jQuery('#resource-modal-file-url').val();\n // If resource url exists\n if (target) {\n // Set cookie for future access\n setCo
1okie('ccresourcedownloaded', 'true', 360);\n // Open new window for resource download\n window.open(target);\n }\n }, false);\n\n // When menu is open and left (blurred) area of menu is clicked, close modal\n jQuery('.wp-block-navigation__responsive-container').on('click', function (e) {\n if (jQuery(e.target).hasClass('wp-block-navigation__responsive-container')) {\n jQuery('html').removeClass('has-modal-open');\n jQuery(this).removeClass('has-modal-open').removeClass('is-menu-open');\n }\n });\n});\n\n// Load modal function\nfunction loadModal(id) {\n // Add loading icon\n jQuery('#cc-modal').addClass('is-loading');\n // Update current modal id\n jQuery('#cc-modal').attr('data-current-id', id);\n // Remove old modal content\n jQuery('#cc-modal .modal__content').html('');\n var target = jQuery('a[data-modal-id=\"' + id + '\"]').attr('href');\n if (target.substring(0, 1) == '#') {\n // Get contents of element on page\n var modal_data = jQuery(target).html();\n // Take data and place into modal content area\n jQuery('#cc-modal .modal__content').html(modal_data);\n // Remove loading icon\n jQuery('#cc-modal').removeClass('is-loading');\n }
1 else {\n jQuery.get(target, function (data) {\n // Reduce full page to targetted area\n var modal_data = jQuery(data).find('#modal-content').html();\n // Take data and place into modal content area\n jQuery('#cc-modal .modal__content').html(modal_data);\n // Remove loading icon\n jQuery('#cc-modal').removeClass('is-loading');\n });\n }\n}\n\n// When window loads.\nwindow.addEventListener('load', function () {});\n\n// When window resizes.\nwindow.addEventListener('resize', function () {});\n\n// When orientation changes.\nwindow.addEventListener('orientationchange', function () {});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzU0LmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb25jaW5uaXR5Ly4vd3AtY29udGVudC90aGVtZXMvY29uY2lubml0eS9hc3NldHMvc3JjL3NjcmlwdHMvbW9kdWxlcy91dGlscy5qcz9lMDY1Iiwid2VicGFjazovL2NvbmNpbm5pdHkvLi93cC1jb250ZW50L3RoZW1lcy9jb25jaW5uaXR5L2Fzc2V0cy9zcmMvc2NyaXB0cy9mb290ZXIuanM/NDAxOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBCYXNpYyBjb29raWUgdXRpbGl0eSBmdW5jdGlvbnNcbi8vIGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vanMvanNfY29va2llcy5hc3BcblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvb2tpZShjbmFtZSwgY3ZhbHVlLCBleGRheXMpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICBkLnNldFRpbWUoZC5nZXRUaW1lKCkgKyBleGRheXMgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgdmFyIGV4cGlyZXMgPSAnZXhwaXJlcz0nICsgZC50b1VUQ1N0cmluZygpO1xuICBkb2N1bWVudC5jb29raWUgPSBjbmFtZSArICc9JyArIGN2YWx1ZSArICc7JyArIGV4cGlyZXMgKyAnO3BhdGg9Lyc7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29va2llKGNuYW1lKSB7XG4gIHZhciBuYW1lID0gY25hbWUgKyAnPSc7XG4gIHZhciBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNhLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGMgPSBjYVtpXTtcbiAgICB3aGlsZSAoJyAnID09IGMuY2hhckF0KDApKSB7XG4gICAgICBjID0gYy5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIGlmICgwID09IGMuaW5kZXhPZihuYW1lKSkge1xuICAgICAgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWUubGVuZ3RoLCBjLmxlbmd0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0Nvb2tpZShjbmFtZSkge1xuICB2YXIgY29va2llID0gZ2V0Q29va2llKGNuYW1lKTtcbiAgaWYgKCcnICE9IGNvb2tpZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSIsIi8vIE1vZHVsZXMuXG5pbXBvcnQgJy4vbGliL19tb2Rlcm5penItY3VzdG9tX2guanMnO1xuaW1wb3J0ICcuL21vZHVsZXMvc3RpY2t5aGVhZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQ29va2llLCBzZXRDb29raWUgfSBmcm9tICcuL21vZHVsZXMvdXRpbHMuanMnO1xuXG4vLyBSZWFkeS5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xuICAvLyBSZXBsYWNlIG5vLWpzIHdpdGgganMgb24gdGhlIHJvb3QgSFRNTCBlbGVtZW50LlxuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NOYW1lID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKC9cXGJuby1qc1xcYi9nLCAnJykgKyAnIGpzICc7XG4gIGZ1bmN0aW9uIG5hdlRvU2VjdGlvbihoYXNoLCBzcGVjaWZpZWR0aW1lKSB7XG4gICAgdmFyIHRpbWUgPSBzcGVjaWZpZWR0aW1lICE9IHVuZGVmaW5lZCA/IHNwZWNpZmllZHRpbWUgOiAzMDA7XG4gICAgaWYgKGpRdWVyeSgnI21haW4taGVhZGVyJykubGVuZ3RoKSB7XG4gICAgICB2Y
1XIgaGVhZGVySCA9IGpRdWVyeSgnI21haW4taGVhZGVyJykub3V0ZXJIZWlnaHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGhlYWRlckggPSAwO1xuICAgIH1cbiAgICB2YXIgaGFzaHBvcyA9IGpRdWVyeShoYXNoKS5vZmZzZXQoKS50b3A7XG4gICAgdmFyIG9mZnNldHMgPSBoZWFkZXJIO1xuICAgIHZhciB0YXJnZXQgPSBoYXNocG9zIC0gb2Zmc2V0cztcbiAgICBqUXVlcnkoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHtcbiAgICAgIHNjcm9sbFRvcDogdGFyZ2V0XG4gICAgfSwgdGltZSk7XG4gIH1cbiAgalF1ZXJ5KCdhW2hyZWZePVwiI1wiXScpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChqUXVlcnkodGhpcykuYXR0cignaHJlZicpICE9IHVuZGVmaW5lZCAmJiBqUXVlcnkodGhpcykuYXR0cignaHJlZicpICE9ICcjJykge1xuICAgICAgdmFyIHRhcmdldCA9IGpRdWVyeSh0aGlzKS5hdHRyKCdocmVmJyk7XG4gICAgICBuYXZUb1NlY3Rpb24odGFyZ2V0KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEhhbmRsZSBjbGlja3Mgb24gbGF0ZXN0IHBvc3RzXG4gIGpRdWVyeSgnLndwLWJsb2NrLWxhdGVzdC1wb3N0cyBsaScpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKGpRdWVyeSh0aGlzKS5maW5kKCdhJykuYXR0cignaHJlZicpKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGpRdWVyeSh0aGlzKS5maW5kKCdhJykuYXR0cignaHJlZicpO1xuICAgIH1cbiAgfSk7XG4gIGlmIChqUXVlcnkoJy53cC1ibG9jay1xdWVyeSAud3AtYmxvY2stcG9zdC10ZW1wbGF0ZS5pcy1sYXlvdXQtZ3JpZCcpLmxlbmd0aCkge1xuICAgIC8vIEluZmluaXRlIHNjcm9sbCBmb3IgY29udGVudFxuICAgIHZhciBJbmZpbml0ZVNjcm9sbCA9IHJlcXVpcmUoJ2luZmluaXRlLXNjcm9sbCcpO1xuICAgIGpRdWVyeSgnLndwLWJsb2NrLXF1ZXJ5IC53cC1ibG9jay1wb3N0LXRlbXBsYXRlLmlzLWxheW91dC1ncmlkJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2Y
1XIgaW5mQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgaW5mQnV0dG9uLmNsYXNzTmFtZSA9ICd2aWV3LW1vcmUtYnV0dG9uJztcbiAgICAgIGluZkJ1dHRvbi5pbm5lckhUTUwgPSAnTG9hZCBtb3JlJztcbiAgICAgIHZhciBpbmZTdGF0dXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGluZlN0YXR1cy5jbGFzc05hbWUgPSAncGFnZS1sb2FkLXN0YXR1cyc7XG4gICAgICBpbmZTdGF0dXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGluZlN0YXR1cy5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImluZmluaXRlLXNjcm9sbC1yZXF1ZXN0XCI+PGRpdiBjbGFzcz1cImluZmluaXRlLXNjcm9sbC1yZXF1ZXN0LXRleHRcIj5Mb2FkaW5nPC9kaXY+PGRpdiBjbGFzcz1cImluZmluaXRlLXNjcm9sbC1yZXF1ZXN0LWVsbGlwc2lzXCI+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48L2Rpdj48L2Rpdj4nO1xuICAgICAgalF1ZXJ5KHRoaXMpLm5leHQoJy53cC1ibG9jay1xdWVyeS1wYWdpbmF0aW9uJykuaGlkZSgpLmJlZm9yZShpbmZCdXR0b24pLmJlZm9yZShpbmZTdGF0dXMpO1xuICAgICAgdmFyIGluZlNjcm9sbCA9IG5ldyBJbmZpbml0ZVNjcm9sbCgnLndwLWJsb2NrLXF1ZXJ5IC53cC1ibG9jay1wb3N0LXRlbXBsYXRlLmlzLWxheW91dC1ncmlkJywge1xuICAgICAgICBwYXRoOiAnLndwLWJsb2NrLXF1ZXJ5LXBhZ2luYXRpb24gLndwLWJsb2NrLXF1ZXJ5LXBhZ2luYXRpb24tbmV4dCcsXG4gICAgICAgIGFwcGVuZDogJy53cC1ibG9jay1wb3N0JyxcbiAgICAgICAgaGlzdG9yeTogZmFsc2UsXG4gICAgICAgIGJ1dHRvbjogJy52aWV3LW1vcmUtYnV0dG9uJyxcbiAgICAgICAgLy8gbG9hZCBwYWdlcyBvbiBidXR0b24gY2xpY2tcbiAgICAgICAgc2Nyb2xsVGhyZXNob2xkOiBmYWxzZSxcbiAgICAgICAgc3RhdHVzOiAnLnBhZ2UtbG9hZC1zdGF0dXMnXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIElmIG1vZGFsIG5lZWRlZFxuICB2YXIgJG1vZGFsVGFyZ2V0cyA9IGpRdWVyeSgnLmNhcmRzLS1yZXNvdXJjZXMgYS5jYXJkc19fY2FyZCcpO1xuICBpZiAoJG1vZGFsVGFyZ2V0cy5sZW5ndGgpIHtcbiAgICAvLyBDbG9zZSBtb2RhbCBvbiBvdXRzaWRlIGNsaWNrXG4gICAgalF1ZXJ5KCcjY2MtbW9kYWwnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGpRdWVyeShlLnRhcmdldCkuaXMoJy5tb2RhbF9fd3JhcCcpIHx8IGpRdWVyeShlLnRhcmdldCkuaXMoJy5tb2RhbCcpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgalF1ZXJ5KCdib2R5JykucmVtb3ZlQ2xhc3MoJ21vZGFsLW9wZW4nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBDbG9zZSBtb2RhbCBvbiBjbG9zZSBidXR0b24gY2xpY2tcbiAgICBqUXVlcnkoJyNjYy1tb2RhbCAubW9kYWxfX2Nsb3NlJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgalF1ZXJ5KCdib2R5JykucmVtb3ZlQ2xhc3MoJ21vZGFsLW9wZW4nKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFJlc291cmNlIGRvd25sb2FkIGNsaWNrXG4gIGpRdWVyeSgnLmNhcmRzLS1yZXNvdXJjZXMgYS5jYXJkc19fY2FyZCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIC8vIENoZWNrIGlmIGNvb2tpZSBleGlzdHMgZnJvbSBwcmV2aW91cyBkb3dubG9hZFxuICAgIGlmICghY2hlY2tDb29raWUoJ2NjcmVzb3VyY2Vkb3dubG9hZGVkJykpIHtcbiAgICAgIC8vIEdldCByZXNvdXJjZSB1cmxcbiAgICAgIHZhciByZXNvdXJjZVVybCA9IGpRdWVyeSh0aGlzKS5uZXh0KCcucmVzb3VyY2VzX191cmwnKS52YWwoKTtcbiAgICAgIC8vIEdldCByZXNvdXJjZSBuYW1lXG4gICAgICB2Y
1XIgcmVzb3VyY2VUaXRsZSA9IGpRdWVyeSh0aGlzKS5wYXJlbnQoKS5maW5kKCcucmVzb3VyY2VzX190aXRsZScpLmh0bWwoKTtcbiAgICAgIC8vIEdldCByZXNvdXJjZSB0eXBlXG4gICAgICB2YXIgcmVzb3VyY2VUeXBlID0galF1ZXJ5KHRoaXMpLnBhcmVudCgpLmZpbmQoJy5yZXNvdXJjZXNfX3R5cGUnKS52YWwoKTtcbiAgICAgIC8vIFNldCBmaWxlIHVybCBpbiBtb2RhbFxuICAgICAgalF1ZXJ5KCcjcmVzb3VyY2UtbW9kYWwtZmlsZS11cmwnKS52YWwocmVzb3VyY2VVcmwpO1xuICAgICAgLy8gU2V0IGZpbGUgbmFtZSBpbiBtb2RhbFxuICAgICAgalF1ZXJ5KCcjcmVzb3VyY2UtdGV4dC10aXRsZScpLmh0bWwocmVzb3VyY2VUaXRsZSk7XG4gICAgICAvLyBTZXQgZmlsZSB0eXBlIGluIG1vZGFsXG4gICAgICBqUXVlcnkoJyNyZXNvdXJjZS10ZXh0LXR5cGUnKS5odG1sKHJlc291cmNlVHlwZSk7XG4gICAgICAvLyBPcGVuIGRldGFpbHMgY2FwdHVyZSBtb2RhbFxuICAgICAgalF1ZXJ5KCdib2R5JykuYWRkQ2xhc3MoJ21vZGFsLW9wZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgcHJldmlvdXMgZG93bmxvYWQgaGFzIGhhcHBlbmVkLCB0aGVuIGp1c3Qgb3BlbiB0aGUgZmlsZSBpbiBuZXcgd2luZG93XG4gICAgICB2YXIgdGFyZ2V0ID0galF1ZXJ5KHRoaXMpLmZpbmQoJy5yZXNvdXJjZXNfX3VybCcpLnZhbCgpO1xuICAgICAgd2luZG93Lm9wZW4odGFyZ2V0KTtcbiAgICB9XG4gIH0pO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd3cGNmN21haWxzZW50JywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gR2V0IHJlc291cmNlIHVybFxuICAgIHZhciB0YXJnZXQgPSBqUXVlcnkoJyNyZXNvdXJjZS1tb2RhbC1maWxlLXVybCcpLnZhbCgpO1xuICAgIC8vIElmIHJlc291cmNlIHVybCBleGlzdHNcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAvLyBTZXQgY29va2llIGZvciBmdXR1cmUgYWNjZXNzXG4gICAgICBzZXRDb29raWUoJ2NjcmVzb3VyY2Vkb3dubG9hZGVkJywgJ3RydWUnLCAzNjApO1xuICAgICAgLy8gT3BlbiBuZXcgd2luZG93IGZvciByZXNvdXJjZSBkb3dubG9hZFxuICAgICAgd2luZG93Lm9wZW4odGFyZ2V0KTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcblxuICAvLyBXaGVuIG1lbnUgaXMgb3BlbiBhbmQgbGVmdCAoYmx1cnJlZCkgYXJlYSBvZiBtZW51IGlzIGNsaWNrZWQsIGNsb3NlIG1vZGFsXG4gIGpRdWVyeSgnLndwLWJsb2NrLW5hdmlnYXRpb25fX3Jlc3BvbnNpdmUtY29udGFpbmVyJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoalF1ZXJ5KGUudGFyZ2V0KS5oYXNDbGFzcygnd3AtYmxvY2stbmF2aWdhdGlvbl9fcmVzcG9uc2l2ZS1jb250YWluZXInKSkge1xuICAgICAgalF1ZXJ5KCdodG1sJykucmVtb3ZlQ2xhc3MoJ2hhcy1tb2RhbC1vcGVuJyk7XG4gICAgICBqUXVlcnkodGhpcykucmVtb3ZlQ2xhc3MoJ2hhcy1tb2RhbC1vcGVuJykucmVtb3ZlQ2xhc3MoJ2lzLW1lbnUtb3BlbicpO1xuICAgIH1cbiAgfSk7XG59KTtcblxuLy8gTG9hZCBtb2RhbCBmdW5jdGlvblxuZnVuY3Rpb24gbG9hZE1vZGFsKGlkKSB7XG4gIC8vIEFkZCBsb2FkaW5nIGljb25cbiAgalF1ZXJ5KCcjY2MtbW9kYWwnKS5hZGRDbGFzcygnaXMtbG9hZGluZycpO1xuICAvLyBVcGRhdGUgY3VycmVudCBtb2RhbCBpZFxuICBqUXVlcnkoJyNjYy1tb2RhbCcpLmF0dHIoJ2RhdGEtY3VycmVudC1pZCcsIGlkKTtcbiAgLy8gUmVtb3ZlIG9sZCBtb2RhbCBjb250ZW50XG4gIGpRdWVyeSgnI2NjLW1vZGFsIC5tb2RhbF9fY29udGVudCcpLmh0bWwoJycpO1xuICB2YXIgdGFyZ2V0ID0galF1ZXJ5KCdhW2RhdGEtbW9kYWwtaWQ9XCInICsgaWQgKyAnXCJdJykuYXR0cignaHJlZicpO1xuICBpZiAodGFyZ2V0LnN1YnN0cmluZygwLCAxKSA9PSAnIycpIHtcbiAgICAvLyBHZXQgY29udGVudHMgb2YgZWxlbWVudCBvbiBwYWdlXG4gICAgdmFyIG1vZGFsX2RhdGEgPSBqUXVlcnkodGFyZ2V0KS5odG1sKCk7XG4gICAgLy8gVGFrZSBkYXRhIGFuZCBwbGFjZSBpbnRvIG1vZGFsIGNvbnRlbnQgYXJlYVxuICAgIGpRdWVyeSgnI2NjLW1vZGFsIC5tb2RhbF9fY29udGVudCcpLmh0bWwobW9kYWxfZGF0YSk7XG4gICAgLy8gUmVtb3ZlIGxvYWRpbmcgaWNvblxuICAgIGpRdWVyeSgnI2NjLW1vZGFsJykucmVtb3ZlQ2xhc3MoJ2lzLWxvYWRpbmcnKTtcbiAgfSBlbHNlIHtcbiAgICBqUXVlcnkuZ2V0KHRhcmdldCwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIC8vIFJlZHVjZSBmdWxsIHBhZ2UgdG8gdGFyZ2V0dGVkIGFyZWFcbiAgICAgIHZhciBtb2RhbF9kYXRhID0galF1ZXJ5KGRhdGEpLmZpbmQoJyNtb2RhbC1jb250ZW50JykuaHRtbCgpO1xuICAgICAgLy8gVGFrZSBkYXRhIGFuZCBwbGFjZSBpbnRvIG1vZGFsIGNvbnRlbnQgYXJlYVxuICAgICAgalF1ZXJ5KCcjY2MtbW9kYWwgLm1vZGFsX19jb250ZW50JykuaHRtbChtb2RhbF9kYXRhKTtcbiAgICAgIC8vIFJlbW92ZSBsb2FkaW5nIGljb25cbiAgICAgIGpRdWVyeSgnI2NjLW1vZGFsJykucmVtb3ZlQ2xhc3MoJ2lzLWxvYWRpbmcnKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBXaGVuIHdpbmRvdyBsb2Fkcy5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKCkge30pO1xuXG4vLyBXaGVuIHdpbmRvdyByZXNpemVzLlxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHt9KTtcblxuLy8gV2hlbiBvcmllbnRhdGlvbiBjaGFuZ2VzLlxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29yaWVudGF0aW9uY2hhbmdlJywgZnVuY3Rpb24gKCkge30pOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///754\n")},709:function(){eval('function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }\n/*!\n * modernizr v3.6.0\n * Build https://modernizr.com/download?-canvas-cssanimations-csscolumns-cssgradients-csstransforms-csstransitions-cssvhunit-cssvwunit-flexbox-inlinesvg-localstorage-placeholder-shapes-svg-video-domprefixes-mq-prefixed-prefixes-setclasses-testallprops-testprop-dontmin\n *\n * Copyright (c)\n * Faruk Ates\n * Paul Irish\n * Alex Sexton\n * Ryan Seddon\n * Patrick Kettner\n * Stu Cox\n * Richard Herrera\n\n * MIT License\n */\n\n/*\n * Modernizr tests which native CSS3 and HTML5 features are available in the\n * current UA and makes the results available to you in two ways: as properties on\n * a global `Modernizr` object, and as classes on the `<html>` element. This\n * information allows you to progressively enhance your pages with a granular level\n * of control over the experience.\n */\n\n(function (window, document, undefined) {\n var tests = [];\n\n /**\n *\n * ModernizrProto is the constructor for Modernizr\n *\n * @class\n * @access public\n */\n\n var ModernizrProto = {\n // The current version, dummy\n _version: \'3.6.0\',\n // Any settings that don\'t work as separate modules\n // can go in here as configuration.\n _config: {\
1n classPrefix: \'\',\n enableClasses: true,\n enableJSClass: true,\n usePrefixes: true\n },\n // Queue of tests\n _q: [],\n // Stub these for people who are listening\n on: function on(test, cb) {\n // I don\'t really think people should do this, but we can\n // safe guard it a bit.\n // -- NOTE:: this gets WAY overridden in src/addTest for actual async tests.\n // This is in case people listen to synchronous tests. I would leave it out,\n // but the code to *disallow* sync tests in the real version of this\n // function is actually larger than this.\n var self = this;\n setTimeout(function () {\n cb(self[test]);\n }, 0);\n },\n addTest: function addTest(name, fn, options) {\n tests.push({\n name: name,\n fn: fn,\n options: options\n });\n },\n addAsyncTest: function addAsyncTest(fn) {\n tests.push({\n name: null,\n fn: fn\n });\n }\n };\n\n // Fake some of Object.create so we can force non test results to be non "own" properties.\n var Modernizr = function Modernizr() {};\n Modernizr.prototype = ModernizrProto;\n\n // Leak modernizr globally when you `require` it rather than force it here.\n // Overwrite name so constructor name is nicer :D\n Modernizr = new Modernizr();\n var classes = [];\n\n /**\n * is returns a boolean if the typeof an obj is exactly type.\n *\n * @access private\n * @function is\n * @param {*} obj - A thing we want to check the type of\n * @param {string} type - A string to compare the typeof against\n * @returns {boolean}\n */\n\n function is(obj, type) {\n return _typeof(obj) === type;\n }\n /**\n * Run through all tests and detect their support in the current UA.\n *\n * @access private\n */\n\n function testRunner() {\n var featureNames;\n var feature;\n var aliasIdx;\n var result;\n var nameIdx;\n var featureName;\n var featureNameSplit;\n for (var featureIdx in tests) {\n if (tests.hasOwnProperty(featureIdx)) {\n featureNames = [];\n feature = tests[featureIdx];\n // run the test, throw the return value into the Modernizr,\n // then based on that boolean, define an appropriate className\n // and push it into an array of classes we\'ll join later.\n //\n // If there is no name, it\'s an \'async\' test that is run,\n // but not directly added to the object. That should\n // be done with a post-run addTest call.\n if (feature.name) {\n featureNames.push(feature.name.toLowerCase());\n if (feature.options && feature.options.aliases && feature.options.aliases.length) {\n // Add all the aliases into the names list\n for (aliasIdx = 0; aliasIdx < feature.options.aliases.length; aliasIdx++) {\n featureNames.push(feature.options.aliases[aliasIdx].toLowerCase());\n }\n }\n }\n\n // Run the test, or use the raw value if it\'s not a function\n result = is(feature.fn, \'function\') ? feature.fn() : feature.fn;\n\n // Set each of the names on the Modernizr object\n for (nameIdx = 0; nameIdx < featureNames.length; nameIdx++) {\n featureName = featureNames[nameIdx];\n // Support dot properties as sub tests. We don\'t do checking to make sure\n // that the implied parent tests have been added. You must call them in\n // order (either in the test, or make the parent test a dependency).\n //\n // Cap it to TWO to make the logic simple and because who needs that kind of subtesting\n // hashtag famous last words\n featureNameSplit = featureName.split(\'.\');\n if (1 === featureNameSplit.length) {\n Modernizr[featureNameSplit[0]] = result;\n } else {\n // cast to a Boolean, if not one already\n if (Modernizr[featureNameSplit[0]] && !(Modernizr[featureNameSplit[0]] instanceof Boolean)) {\n Modernizr[featureNameSplit[0]] = new Boolean(Modernizr[featureNameSplit[0]]);\n }\n Modernizr[featureNameSplit[0]][featureNameSplit[1]] = result;\n }\n classes.push((result ? \'\' : \'no-\') + featureNameSplit.join(\'-\'));\n }\n }\n }\n }\n /**\n * docElement is a convenience wrapper to grab the root element of the document\n *\n * @access private\n * @returns {HTMLElement|SVGElement} The root element of the document\n */\n\n var docElement = document.documentElement;\n\n /**\n * A convenience helper to check if the document we are running in is an SVG document\n *\n * @access private\n * @returns {boolean}\n */\n\n var isSVG = \'svg\' === docElement.nodeName.toLowerCase();\n\n /**\n * setClasses takes an array of class names and adds them to the root element\n *\n * @access private\n * @function setClasses\n * @param {string[]} classes - Array of class names\n */\n\n // Pass in an and array of class names, e.g.:\n // [\'no-webp\', \'borderradiu
1s\', ...]\n function setClasses(classes) {\n var className = docElement.className;\n var classPrefix = Modernizr._config.classPrefix || \'\';\n if (isSVG) {\n className = className.baseVal;\n }\n\n // Change `no-js` to `js` (independently of the `enableClasses` option)\n // Handle classPrefix on this too\n if (Modernizr._config.enableJSClass) {\n var reJS = new RegExp(\'(^|\\\\s)\' + classPrefix + \'no-js(\\\\s|$)\');\n className = className.replace(reJS, \'$1\' + classPrefix + \'js$2\');\n }\n if (Modernizr._config.enableClasses) {\n // Add the new classes\n className += \' \' + classPrefix + classes.join(\' \' + classPrefix);\n if (isSVG) {\n docElement.className.baseVal = className;\n } else {\n docElement.className = className;\n }\n }\n }\n\n /**\n * If the browsers follow the spec, then they would expose vendor-specific styles as:\n * elem.style.WebkitBorderRadius\n * instead of something like the following (which is technically incorrect):\n * elem.style.webkitBorderRadius\n * WebKit ghosts their properties in lowercase but Opera & Moz do not.\n * Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+\n * erik.eae.net/archives/2008/03/10/21.48.10/\n * More here: github.com/Modernizr/Modernizr/issues/issue/21\n *\n * @access private\n * @returns {string} The string representing the vendor-specific style properties\n */\n\n var omPrefixes = \'Moz O ms Webkit\';\n\n /**\n * List of JavaScript DOM values used for tests\n *\n * @memberof Modernizr\n * @name Modernizr._domPrefixes\n * @optionName Modernizr._domPrefixes\n * @optionProp domPrefixes\n * @access public\n * @example\n *\n * Modernizr._domPrefixes is exactly the same as [_prefixes](#modernizr-_prefixes), but rather\n * than kebab-case properties, all properties are their Capitalized variant\n *\n * ```js\n * Modernizr._domPrefixes === [ "Moz", "O", "ms", "Webkit" ];\n * ```\n */\n\n var domPrefixes = ModernizrProto._config.usePrefixes ? omPrefixes.toLowerCase().split(\' \') : [];\n ModernizrProto._domPrefixes = domPrefixes;\n\n /**\n * List of property values to set for css tests. See ticket #21\n * http://git.io/vUGl4\n *\n * @memberof Modernizr\n * @name Modernizr._prefixes\n * @optionName Modernizr._prefixes\n * @optionProp prefixes\n * @access public\n * @example\n *\n * Modernizr._prefixes is the internal list of prefixes that we test against\n * inside of things like [prefixed](#modernizr-prefixed) and [prefixedCSS](#-code-modernizr-prefixedcss). It is simply\n * an array of kebab-case vendor prefixes you can use within your code.\n *\n * Some common use cases include\n *\n * Generating all possible prefixed version of a CSS property\n * ```js\n * var rule = Modernizr._prefixes.join(\'transform: rotate(20deg); \');\n *\n * rule === \'transform: rotate(20deg); webkit-transform: rotate(20deg); moz-transform: rotate(20deg); o-transform: rotate(20deg); ms-transform: rotate(20deg);\'\n * ```\n *\n * Generating all possible prefixed version of a CSS value\n * ```js\n * rule = \'display:\' + Modernizr._prefixes.join(\'flex; display:\') + \'flex\';\n *\n * rule === \'display:flex; display:-webkit-flex; display:-moz-flex; display:-o-flex; display:-ms-flex; display:flex\'\n * ```\n */\n\n // we use [\'\',\'\'] rather than an empty array in order to allow a pattern of .`join()`ing prefixes to test\n // values in feature detects to continue to work\n var prefixes = ModernizrProto._config.usePrefixes ? \' -webkit- -moz- -o- -ms- \'.split(\' \') : [\'\', \'\'];\n\n // expose these for the plugin API. Look in the source for how to join() them against your input\n ModernizrProto._prefixes = prefixes;\n\n /**\n * createElement is a convenience wrapper around document.createElement. Since we\n * use createElement all over the place, this allows for (slightly) smaller code\n * as well as abstracting away issues with creating elements in contexts other than\n * HTML documents (e.g. SVG documents).\n *\n * @access private\n * @function createElement\n * @returns {HTMLElement|SVGElement} An HTML or SVG element\n */\n\n function createElement() {\n if (\'function\' !== typeof document.createElement) {\n // This is the case in IE7, where the type of createElement is "object".\n // For this reason, we cannot call apply() as Object is not a Function.\n return document.createElement(arguments[0]);\n }
1 else if (isSVG) {\n return document.createElementNS.call(document, \'http://www.w3.org/2000/svg\', arguments[0]);\n } else {\n return document.createElement.apply(document, arguments);\n }\n }\n\n /**\n * getBody returns the body of a document, or an element that can stand in for\n * the body if a real body does not exist\n *\n * @access private\n * @function getBody\n * @returns {HTMLElement|SVGElement} Returns the real body of a document, or an\n * artificially created element that stands in for the body\n */\n\n function getBody() {\n // After page load injecting a fake body doesn\'t work so check if body exists\n var body = document.body;\n if (!body) {\n // Can\'t use the real body create a fake one.\n body = createElement(isSVG ? \'svg\' : \'body\');\n body.fake = true;\n }\n return body;\n }\n\n /**\n * injectElementWithStyles injects an element with style element and some CSS rules\n *\n * @access private\n * @function injectElementWithStyles\n * @param {string} rule - String representing a css rule\n * @param {function} callback - A function that is used to test the injected element\n * @param {number} [nodes] - An integer representing the number of additional nodes you want injected\n * @param {string[]} [testnames] - An array of strings that are used as ids for the additional nodes\n * @returns {boolean}\n */\n\n function injectElementWithStyles(rule, callback, nodes, testnames) {\n var mod = \'modernizr\';\n var style;\n var ret;\n var node;\n var docOverflow;\n var div = createElement(\'div\');\n var body = getBody();\n if (parseInt(nodes, 10)) {\n // In order not to give false positives we create a node for each test\n // This also allows the method to scale for unspecified uses\n while (nodes--) {\n node = createElement(\'div\');\n node.id = testnames ? testnames[nodes] : mod + (nodes + 1);\n div.appendChild(node);\n }\n }\n style = createElement(\'style\');\n style.type = \'text/css\';\n style.id = \'s\' + mod;\n\n // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.\n // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270\n (!body.fake ? div : body).appendChild(style);\n body.appendChild(div);\n if (style.styleSheet) {\n style.styleSheet.cssText = rule;\n } else {\n style.appendChild(document.createTextNode(rule));\n }\n div.id = mod;\n if (body.fake) {\n //avoid crashing IE8, if background image is used\n body.style.background = \'\';\n //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible\n body.style.overflow = \'hidden\';\n docOverflow = docElement.style.overflow;\n docElement.style.overflow = \'hidden\';\n docElement.appendChild(body);\n }\n ret = callback(div, rule);\n // If this is done after page load we don\'t want to remove the body so check if body exists\n if (body.fake) {\n body.parentNode.removeChild(body);\n docElement.style.overflow = docOverflow;\n // Trigger layout so kinetic scrolling isn\'t disabled in iOS6+\n // eslint-disable-next-line\n docElement.offsetHeight;\n } else {\n div.parentNode.removeChild(div);\n }\n return !!ret;\n }\n\n /**\n * Modernizr.mq tests a given media query, live against the current state of the window\n * adapted from matchMedia polyfill by Scott Jehl and Paul Irish\n * gist.github.com/786768\n *\n * @memberof Modernizr\n * @name Modernizr.mq\n * @optionName Modernizr.mq()\n * @optionProp mq\n * @access public\n * @function mq\n * @param {string} mq - String of the media query we want to test\n * @returns {boolean}\n * @example\n * Modernizr.mq allows for you to programmatically check if the current browser\n * window state matches a media query.\n *\n * ```js\n * var query = Modernizr.mq(\'(min-width: 900px)\');\n *\n * if (query) {\n * // the browser window is larger than 900px\n * }\n * ```\n *\n * Only valid media queries are supported, therefore you must always include values\n * with your media query\n *\n * ```js\n * // good\n * Modernizr.mq(\'(min-width: 900px)\');\n *\n * // bad\n * Modernizr.mq(\'min-width\');\n * ```\n *\n * If you would just like to test that media queries are supported in general, use\n *\n * ```js\n * Modernizr.mq(\'only all\'); // true if MQ are supported, false if not\n * ```\n *\n *\n * Note that if the browser does not support media queries (e.g. old IE) mq will\n * always return false.\n */\n\n var mq = function () {\n var matchMedia = window.matchMedia || window.msMatchMedia;\n if (matchMedia) {\n return function (mq) {\n var mql = matchMedia(mq);\n return mql && mql.matches || false;\n };\n }\n return function (mq) {\n var bool = false;\n injectElementWithStyles(\'@media \' + mq + \' { #modernizr { position: absolute; } }\', function (node) {\n bool = \'absolute\' == (window.getComputedStyle ? window.getComputedStyle(node, null) : node.currentStyle).position;\n });\n return bool;\n };\n }();\n ModernizrProto.mq = mq;\n var cssomPrefixes = ModernizrProto._config.usePrefixes ? omPrefixes.split(\' \') : [];\n ModernizrProto._cssomPrefixes = cssomPrefixes;\n\n /**\n * contains checks to see if a string contains another string\n *\n * @access private\n * @function contains\n * @param {string} str - The string we want to check for substrings\n * @param {string} substr - The substring we want to search the first string for\n * @returns {boolean}
1\n */\n\n function contains(str, substr) {\n return !!~(\'\' + str).indexOf(substr);\n }\n\n /**\n * Create our "modernizr" element that we do most feature tests on.\n *\n * @access private\n */\n\n var modElem = {\n elem: createElement(\'modernizr\')\n };\n\n // Clean up this element\n Modernizr._q.push(function () {\n delete modElem.elem;\n });\n var mStyle = {\n style: modElem.elem.style\n };\n\n // kill ref for gc, must happen before mod.elem is removed, so we unshift on to\n // the front of the queue.\n Modernizr._q.unshift(function () {\n delete mStyle.style;\n });\n\n /**\n * domToCSS takes a camelCase string and converts it to kebab-case\n * e.g. boxSizing -> box-sizing\n *\n * @access private\n * @function domToCSS\n * @param {string} name - String name of camelCase prop we want to convert\n * @returns {string} The kebab-case version of the supplied name\n */\n\n function domToCSS(name) {\n return name.replace(/([A-Z])/g, function (str, m1) {\n return \'-\' + m1.toLowerCase();\n }).replace(/^ms-/, \'-ms-\');\n }\n /**\n * wrapper around getComputedStyle, to fix issues with Firefox returning null when\n * called inside of a hidden iframe\n *\n * @access private\n * @function computedStyle\n * @param {HTMLElement|SVGElement} - The element we want to find the computed styles of\n * @param {string|null} [pseudoSelector]- An optional pseudo element selector (e.g. :before), of null if none\n * @returns {CSSStyleDeclaration}\n */\n\n function computedStyle(elem, pseudo, prop) {\n var result;\n if (\'getComputedStyle\' in window) {\n result = getComputedStyle.call(window, elem, pseudo);\n var console = window.console;\n if (null !== result) {\n if (prop) {\n result = result.getPropertyValue(prop);\n }\n } else {\n if (console) {\n var method = console.error ? \'error\' : \'log\';\n console[method].call(console, \'getComputedStyle returning null, its possible modernizr test results are inaccurate\');\n }\n }\n } else {\n result = !pseudo && elem.currentStyle && elem.currentStyle[prop];\n }\n return result;\n }\n\n /**\n * nativeTestProps allows for us to use native feature detection functionality if available.\n * some prefixed form, or false, in the case of an unsupported rule\n *\n * @access private\n * @function nativeTestProps\n * @param {array} props - An array of property names\n * @param {string} value - A string representing the value we want to check via @supports\n * @returns {boolean|undefined} A boolean when @supports exists, undefined otherwise\n */\n\n // Accepts a list of property names and a single value\n // Returns `undefined` if native detection not available\n function nativeTestProps(props, value) {\n var i = props.length;\n // Start with the JS API: http://www.w3.org/TR/css3-conditional/#the-css-interface\n if (\'CSS\' in window && \'supports\' in window.CSS) {\n // Try every prefixed variant of the property\n while (i--) {\n if (window.CSS.supports(domToCSS(props[i]), value)) {\n return true;\n }\n }\n return false;\n }\n // Otherwise fall back to at-rule (for Opera 12.x)\n else if (\'CSSSupportsRule\' in window) {\n // Build a condition string for every prefixed variant\n var conditionText = [];\n while (i--) {\n conditionText.push(\'(\' + domToCSS(props[i]) + \':\' + value + \')\');\n }\n conditionText = conditionText.join(\' or \');\n return injectElementWithStyles(\'@supports (\' + conditionText + \') { #modernizr { position: absolute; } }\', function (node) {\n return \'absolute\' == computedStyle(node, null, \'position\');\n });\n }\n return undefined;\n }\n /**\n * cssToDOM takes a kebab-case string and converts it to camelCase\n * e.g. box-sizing -> boxSizing\n *\n * @access private\n * @function cssToDOM\n * @param {string} name - String name of kebab-case prop we want to convert\n * @returns {string} The camelCase version of the supplied name\n */\n\n function cssToDOM(name) {\n return name.replace(/([a-z])-([a-z])/g, function (str, m1, m2) {\n return m1 + m2.toUpperCase();\n }).replace(/^-/, \'\');\n }\n // testProps is a generic CSS / DOM property test.\n\n // In testing support for a given CSS property, it\'s legit to test:\n // `elem.style[styleName] !== undefined`\n // If the property is supported it will return an empty string,\n // if unsupported it will return undefined.\n\n // We\'ll take advantage of this quick test and skip setting a style\n // on our modernizr element, but instead just testing undefined vs\n // empty string.\n\n // Property names can be provided in either camelCase or kebab-case.\n\n function testProps(props, prefixed, value, skipValueTest) {\n skipValueTest = is(skipValueTest, \'undefined\') ? false : skipValueTest;\n\n // Try native detect first\n if (!is(value, \'undefined\')) {\n var result = nativeTestProps(props, value);\n if (!is(result, \'undefined\')) {\n return result;\n }\n }\n\n // Otherwise do it properly\n var afterInit, i, propsLength, prop, before;\n\n // If we don\'t have a style element, that means we\'re running async or after\n // the core tests, so we\'ll need to create our own elements to use\n\n // inside of an SVG element, in certain browsers, the `style` element is only\n // defined for valid tags. Therefore, if `modernizr` does not have one, we\n // fall back to a less used element and hope for the best.\n // for strict XHTML browsers the hardly used samp element is used\n var elems = [\'modernizr\', \'tspan\', \'samp\'];\n while (!mStyle.style && elems.length) {\n afterInit = true;\n mStyle.modElem = createElement(elems.shift());\n mStyle.style = mStyle.modElem.style;\n }\n\n // Delete the objects if we created them.\n function cleanElems() {\n if (afterInit) {\n delete mStyle.style;\n delete mStyle.modElem;\n }\n }\n propsLength = props.length;\n for (i = 0; i < propsLength;
1 i++) {\n prop = props[i];\n before = mStyle.style[prop];\n if (contains(prop, \'-\')) {\n prop = cssToDOM(prop);\n }\n if (mStyle.style[prop] !== undefined) {\n // If value to test has been passed in, do a set-and-check test.\n // 0 (integer) is a valid property value, so check that `value` isn\'t\n // undefined, rather than just checking it\'s truthy.\n if (!skipValueTest && !is(value, \'undefined\')) {\n // Needs a try catch block because of old IE. This is slow, but will\n // be avoided in most cases because `skipValueTest` will be used.\n try {\n mStyle.style[prop] = value;\n } catch (e) {}\n\n // If the property value has changed, we assume the value used is\n // supported. If `value` is empty string, it\'ll fail here (because\n // it hasn\'t changed), which matches how browsers have implemented\n // CSS.supports()\n if (mStyle.style[prop] != before) {\n cleanElems();\n return \'pfx\' == prefixed ? prop : true;\n }\n }\n // Otherwise just return true, or the property name if this is a\n // `prefixed()` call\n else {\n cleanElems();\n return \'pfx\' == prefixed ? prop : true;\n }\n }\n }\n cleanElems();\n return false;\n }\n\n /**\n * fnBind is a super small [bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind) polyfill.\n *\n * @access private\n * @function fnBind\n * @param {function} fn - a function you want to change `this` reference to\n * @param {object} that - the `this` you want to call the function with\n * @returns {function} The wrapped version of the supplied function\n */\n\n function fnBind(fn, that) {\n return function () {\n return fn.apply(that, arguments);\n };\n }\n\n /**\n * testDOMProps is a generic DOM property test; if a browser supports\n * a certain property, it won\'t return undefined for it.\n *\n * @access private\n * @function testDOMProps\n * @param {array.<string>} props - An array of properties to test for\n * @param {object} obj - An object or Element you want to use to test the parameters again\n * @param {boolean|object} elem - An Element to bind the property lookup again. Use `false` to prevent the check\n * @returns {false|*} returns false if the prop is unsupported, otherwise the value that is supported\n */\n function testDOMProps(props, obj, elem) {\n var item;\n for (var i in props) {\n if (props[i] in obj) {\n // return the property name as a string\n if (false === elem) {\n return props[i];\n }\n item = obj[props[i]];\n\n // let\'s bind a function\n if (is(item, \'function\')) {\n // bind to obj unless overriden\n return fnBind(item, elem || obj);\n }\n\n // return the unbound function or obj or value\n return item;\n }\n }\n return false;\n }\n\n /**\n * testPropsAll tests a list of DOM properties we want to check against.\n * We specify literally ALL possible (known and/or likely) properties on\n * the element including the non-vendor prefixed one, for forward-\n * compatibility.\n *\n * @access private\n * @function testPropsAll\n * @param {string} prop - A string of the property to test for\n * @param {string|object} [prefixed] - An object to check the prefixed properties on. Use a string to skip\n * @param {HTMLElement|SVGElement} [elem] - An element used to test the property and value against\n * @param {string} [value] - A string of a css value\n * @param {boolean} [skipValueTest] - An boolean representing if you want to test if value sticks when set\n * @returns {false|string} returns the string version of the property, or false if it is unsupported\n */\n function testPropsAll(prop, prefixed, elem, value, skipValueTest) {\n var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),\n props = (prop + \' \' + cssomPrefixes.join(ucPro
1p + \' \') + ucProp).split(\' \');\n\n // did they call .prefixed(\'boxSizing\') or are we just testing a prop?\n if (is(prefixed, \'string\') || is(prefixed, \'undefined\')) {\n return testProps(props, prefixed, value, skipValueTest);\n\n // otherwise, they called .prefixed(\'requestAnimationFrame\', window[, elem])\n } else {\n props = (prop + \' \' + domPrefixes.join(ucProp + \' \') + ucProp).split(\' \');\n return testDOMProps(props, prefixed, elem);\n }\n }\n\n // Modernizr.testAllProps() investigates whether a given style property,\n // or any of its vendor-prefixed variants, is recognized\n //\n // Note that the property names must be provided in the camelCase variant.\n // Modernizr.testAllProps(\'boxSizing\')\n ModernizrProto.testAllProps = testPropsAll;\n\n /**\n * atRule returns a given CSS property at-rule (eg @keyframes), possibly in\n * some prefixed form, or false, in the case of an unsupported rule\n *\n * @memberof Modernizr\n * @name Modernizr.atRule\n * @optionName Modernizr.atRule()\n * @optionProp atRule\n * @access public\n * @function atRule\n * @param {string} prop - String name of the @-rule to test for\n * @returns {string|boolean} The string representing the (possibly prefixed)\n * valid version of the @-rule, or `false` when it is unsupported.\n * @example\n * ```js\n * var keyframes = Modernizr.atRule(\'@keyframes\');\n *\n * if (keyframes) {\n * // keyframes are supported\n * // could be `@-webkit-keyframes` or `@keyframes`\n * } else {\n * // keyframes === `false`\n * }\n * ```\n *\n */\n\n var atRule = function atRule(prop) {\n var length = prefixes.length;\n var cssrule = window.CSSRule;\n var rule;\n if (\'undefined\' === typeof cssrule) {\n return undefined;\n }\n if (!prop) {\n return false;\n }\n\n // remove literal @ from beginning of provided property\n prop = prop.replace(/^@/, \'\');\n\n // CSSRules use underscores instead of dashes\n rule = prop.replace(/-/g, \'_\').toUpperCase() + \'_RULE\';\n if (rule in cssrule) {\n return \'@\' + prop;\n }\n for (var i = 0; i < length; i++) {\n // prefixes gives us something like -o-, and we want O_\n var prefix = prefixes[i];\n var thisRule = prefix.toUpperCase() + \'_\' + rule;\n if (thisRule in cssrule) {\n return \'@-\' + prefix.toLowerCase() + \'-\' + prop;\n }\n }\n return false;\n };\n ModernizrProto.atRule = atRule;\n\n /**\n * prefixed returns the prefixed or nonprefixed property name variant of your input\n *\n * @memberof Modernizr\n * @name Modernizr.prefixed\n * @optionName Modernizr.prefixed()\n * @optionProp prefixed\n * @access public\n * @function prefixed\n * @param {string} prop - String name of the property to test for\n * @param {object} [obj] - An object to test for the prefixed properties on\n * @param {HTMLElement} [elem] - An element used to test specific properties against\n * @returns {string|false} The string representing the (possibly prefixed) valid\n * version of the property, or `false` when it is unsupported.\n * @example\n *\n * Modernizr.prefixed takes a string css value in the DOM style camelCase (as\n * opposed to the css style kebab-case) form and returns the (possibly prefixed)\n * version of that property that the browser actually supports.\n *\n * For example, in older Firefox...\n * ```js\n * prefixed(\'boxSizing\')\n * ```\n * returns \'MozBoxSizing\'\n *\n * In newer Firefox, as well as any other browser that support the unprefixed\n * version would simply return `boxSizing`. Any browser that does not support\n * the property at all, it will return `false`.\n *\n * By default, prefixed is checked against a DOM element. If you want to check\n * for a property on another object, just pass it as a second argument\n *\n * ```js\n * var rAF = prefixed(\'requestAnimationFrame\', window);\n *\n * raf(function() {\n * renderFunction();\n * })\n * ```\n *\n * Note that this will return _the actual function_ - not the name of the function.\n * If you need the actual name of the property, pass in `false` as a third argument\n *\n * ```js\n * var rAFProp = prefixed(\'requestAnimationFrame\', window, false);\n *\n * rafProp === \'WebkitRequestAnimationFrame\' // in older webkit\n * ```\n *\n * One common use case for prefixed is if you\'re trying to determine which transition\n * end event to bind to, you might do something like...\n * ```js\n * var transEndEventNames = {\n * \'WebkitTransition\' : \'webkitTransitionEnd\', * Saf 6, Android Browser\n * \'MozTransition\' : \'transitionend\', * only for FF < 15\n * \'transition\' : \'transitionend\' * IE10, Opera, Chrome, FF 15+, Saf 7+\n * };\n *\n * var transEndEventName = transEndEventNames[ Modernizr.prefixed(\'transition\') ];\n * ```\n *\n * If you want a similar lookup, but in kebab-case, you can use [prefixedCSS](#modernizr-prefixedcss).\n */\n\n var prefixed = ModernizrProto.prefixed = function (prop, obj, elem) {\n if (0 === prop.indexOf(\'@\')) {\n return atRule(prop);\n }\n if (-1 != prop.indexOf(\'-\')) {\n // Convert kebab-case to camelCase\n prop = cssToDOM(prop);\n }\n if (!obj) {\n return testPropsAll(prop, \'pfx\');\n } else {\n // Testing DOM property e.g. Modernizr.prefixed(\'requestAnimationFrame\', window) // \'mozRequestAnimationFrame\'\n return testPropsAll(prop, obj, elem);\n }\n };\n\n /**\n * testAllProps determines whether a given CSS property is supported in the browser\n *\n * @memberof Modernizr\n * @name Modernizr.testAllProps\n * @optionName Modernizr.testAllProps()\n * @optionProp testAllProps\n * @access public\n * @function testAllProps\n * @param {string} prop - String naming the property to test (either camelCase or kebab-case)\n * @param {string} [value] - String of the value to test\n * @param {boolean} [skipValueTest=false] - Whether to skip testing that the value is supported when using non-native detection\n * @example\n *\n * testAllProps determines whether a given CSS property, in some prefixed form,\n * is supported by the browser.\n *\n * ```js\n * testAllProps(\'boxSizing\') // true\n * ```\n *\n * It can optionally be given a CSS value in string form to test if a property\n * value is valid\n *\n * ```js\n * testAllProps(\'display\', \'block\') // true\n * testAllProps(\'display\', \'penguin\') // false\n * ```\n *\n * A boolean can be passed as a third parameter to skip the value check when\n * native detection (@supports) isn\'t available.\n *\n * ```js\n * testAllProps(\'shapeOutside\', \'content-box\', true);\n * ```\n */\n\n function testAllProps(prop, value, skipValueTest) {\n return testPropsAll(prop, undefined, undefined, value, skipValueTest);\n }\n ModernizrProto.testAllProps = testAllProps;\n\n /**\n * testProp() investigates whether a given style property is recognized\n * Property names can be provided in either camelCase or kebab-case.\n *\n * @memberof Modernizr\n * @name Modernizr.testProp\n * @access public\n * @optionName Modernizr.testProp()\n * @optionProp testProp\n * @function testProp\n * @param {string} prop - Name of the CSS property to check\n * @param {string} [value] - Name of the CSS value to check\n * @param {boolean} [useValue] - Whether or not to check the value if @supports isn\'t supported\n * @returns {boolean}\n * @example\n *\n * Just like [testAllProps](#modernizr-testallprops), only it does not check any vendor prefixed\n * version of the string.\n *\n * Note that the property name must be provided in camelCase (e.g. boxSizing not box-sizing)\n *\n * ```js\n * Modernizr.testProp(\'pointerEvents\') // true\n * ```\n *\n * You can also provide a value as an optional second argument to check if a\n * specific value is supported\n *\n * ```js\n * Modernizr.testProp(\'pointerEvents\', \'none\') // true\n * Modernizr.testProp(\'pointerEvents\', \'penguin\') // false\n * ```\n */\n\n var testProp = ModernizrProto.testProp = function (prop, value, useValue) {\n return testProps([prop], undefined, value, useValue);\n };\n\n /*!\n {\n "name": "Flexbox",\n "property": "flexbox",\n "caniuse": "flexbox",\n "tags": ["css"],\n "notes": [{\n "name": "The _new_ flexbox",\n "href": "http://dev.w3.org/csswg/css3-flexbox"\n }],\n "warnings": [\n "A `true` result for this detect does not imply that the `flex-wrap` property is supported; see the `flexwrap` detect."\n ]\n }\n !*/\n /* DOC\n Detects support for the Flexible Box Layout model, a.k.a. Flexbox, which allows easy manipulation of layout order and sizing within a container.\n */\n\n Modernizr.addTest(\'flexbox\', testAllProps(\'flexBasis\', \'1px\', true));\n\n /*!\n {\n "name": "CSS Animations",\n "property": "cssanimations",\n "caniuse": "css-animation",\n "polyfills": ["transformie", "csssandpaper"],\n "tags": ["css"],\n "warnings": ["Android < 4 will pass this test, but can only animate a single property at a time"],\n "notes": [{\n "name" : "Article: \'Dispelling the Android CSS animation myths\'",\n "href": "https://goo.gl/OGw5Gm"\n }]\n }\n !*/\n /* DOC\n Detects whether or not elements can be animated using CSS\n */\n\n Modernizr.addTest(\'cssanimations\', testAllProps(\'animationName\', \'a\', true));\n\n /*!\n {\n "name": "CSS Gradients",\n "caniuse": "css-gradients",\n "property": "cssgradients",\n "tags": ["css"],\n "knownBugs": ["False-positives on webOS (https://github.com/Modernizr/Modernizr/issues/202)"],\n "notes": [{\n "name": "Webkit Gradient Syntax",\n "href": "https://webkit.org/blog/175/introducing-css-gradients/"\n },{\n "name": "Linear Gradient Syntax",\n "href": "https://developer.mozilla.org/en-US/docs/Web/CSS/linear-gradient"\n },{\n "name": "W3C Gradient Spec",\n "href": "https://drafts.csswg.org/css-images-3/#gradients"\n }]\n }\n !*/\n\n Modernizr.addTest(\'cssgradients\', function () {\n var str1 = \'background-image:\';\n var str2 = \'gradient(linear,left top,right bottom,from(#9f9),to(white));\';\n var css = \'\';\n var angle;\n for (var i = 0, len = prefixes.length - 1; i < len;
1 i++) {\n angle = 0 === i ? \'to \' : \'\';\n css += str1 + prefixes[i] + \'linear-gradient(\' + angle + \'left top, #9f9, white);\';\n }\n if (Modernizr._config.usePrefixes) {\n // legacy webkit syntax (FIXME: remove when syntax not in use anymore)\n css += str1 + \'-webkit-\' + str2;\n }\n var elem = createElement(\'a\');\n var style = elem.style;\n style.cssText = css;\n\n // IE6 returns undefined so cast to string\n return -1 < (\'\' + style.backgroundImage).indexOf(\'gradient\');\n });\n\n /*!\n {\n "name": "CSS Transforms",\n "property": "csstransforms",\n "caniuse": "transforms2d",\n "tags": ["css"]\n }\n !*/\n\n Modernizr.addTest(\'csstransforms\', function () {\n // Android < 3.0 is buggy, so we sniff and blacklist\n // http://git.io/hHzL7w\n return -1 === navigator.userAgent.indexOf(\'Android 2.\') && testAllProps(\'transform\', \'scale(1)\', true);\n });\n\n /*!\n {\n "name": "CSS Transitions",\n "property": "csstransitions",\n "caniuse": "css-transitions",\n "tags": ["css"]\n }\n !*/\n\n Modernizr.addTest(\'csstransitions\', testAllProps(\'transition\', \'all\', true));\n\n /*!\n {\n "name": "CSS Columns",\n "property": "csscolumns",\n "caniuse": "multicolumn",\n "polyfills": ["css3multicolumnjs"],\n "tags": ["css"]\n }\n !*/\n\n (function () {\n Modernizr.addTest(\'csscolumns\', function () {\n var bool = false;\n var test = testAllProps(\'columnCount\');\n try {\n bool = !!test;\n if (bool) {\n bool = new Boolean(bool);\n }\n } catch (e) {}\n return bool;\n });\n var props = [\'Width\', \'Span\', \'Fill\', \'Gap\', \'Rule\', \'RuleColor\', \'RuleStyle\', \'RuleWidth\', \'BreakBefore\', \'BreakAfter\', \'BreakInside\'];\n var name, test;\n for (var i = 0; i < props.length; i++) {\n name = props[i].toLowerCase();\n test = testAllProps(\'column\' + props[i]);\n\n // break-before, break-after & break-inside are not "column"-prefixed in spec\n if (\'breakbefore\' === name || \'breakafter\' === name || \'breakinside\' == name) {\n test = test || testAllProps(props[i]);\n }\n Modernizr.addTest(\'csscolumns.\' + name, test);\n }\n })();\n\n /**\n * testStyles injects an element with style element and some CSS rules\n *\n * @memberof Modernizr\n * @name Modernizr.testStyles\n * @optionName Modernizr.testStyles()\n * @optionProp testStyles\n * @access public\n * @function testStyles\n * @param {string} rule - String representing a css rule\n * @param {function} callback - A function that is used to test the injected element\n * @param {number} [nodes] - An integer representing the number of additional nodes you want injected\n * @param {string[]} [testnames] - An array of strings that are used as ids for the additional nodes\n * @returns {boolean}\n * @example\n *\n * `Modernizr.testStyles` takes a CSS rule and injects it onto the current page\n * along with (possibly multiple) DOM elements. This lets you check for features\n * that can not be detected by simply checking the [IDL](https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Interface_development_guide/IDL_interface_rules).\n *\n * ```js\n * Modernizr.testStyles(\'#modernizr { width: 9px; color: papayawhip; }\', function(elem, rule) {\n * // elem is the first DOM node in the page (by default #modernizr)\n * // rule is the first argument you supplied - the CSS rule in string form\n *\n * addTest(\'widthworks\', elem.style.width === \'9px\')\n * });\n * ```\n *\n * If your test requires multiple nodes, you can include a third argument\n * indicating how many additional div elements to include on the page. The\n * additional nodes are injected as children of the `elem` that is returned as\n * the first argument to the callback.\n *\n * ```js\n * Modernizr.testStyles(\'#modernizr {width: 1px}; #modernizr2 {width: 2px}\', function(elem) {\n * document.getElementById(\'modernizr\').style.width === \'1px\'; // true\n * document.getElementById(\'modernizr2\').style.width === \'2px\'; // true\n * elem.firstChild === document.getElementById(\'modernizr2\'); // true\n * }, 1);\n * ```\n *\n * By default, all of the additional elements have an ID of `modernizr[n]`, where\n * `n` is
1its index (e.g. the first additional, second overall is `#modernizr2`,\n * the second additional is `#modernizr3`, etc.).\n * If you want to have more meaningful IDs for your function, you can provide\n * them as the fourth argument, as an array of strings\n *\n * ```js\n * Modernizr.testStyles(\'#foo {width: 10px}; #bar {height: 20px}\', function(elem) {\n * elem.firstChild === document.getElementById(\'foo\'); // true\n * elem.lastChild === document.getElementById(\'bar\'); // true\n * }, 2, [\'foo\', \'bar\']);\n * ```\n *\n */\n\n var testStyles = ModernizrProto.testStyles = injectElementWithStyles;\n\n /**\n * roundedEquals takes two integers and checks if the first is within 1 of the second\n *\n * @access private\n * @function roundedEquals\n * @param {number} a\n * @param {number} b\n * @returns {boolean}\n */\n\n function roundedEquals(a, b) {\n return a - 1 === b || a === b || a + 1 === b;\n }\n\n /*!\n {\n "name": "CSS vh unit",\n "property": "cssvhunit",\n "caniuse": "viewport-units",\n "tags": ["css"],\n "builderAliases": ["css_vhunit"],\n "notes": [{\n "name": "Related Modernizr Issue",\n "href": "https://github.com/Modernizr/Modernizr/issues/572"\n },{\n "name": "Similar JSFiddle",\n "href": "https://jsfiddle.net/FWeinb/etnYC/"\n }]\n }\n !*/\n\n testStyles(\'#modernizr { height: 50vh; }\', function (elem) {\n var height = parseInt(window.innerHeight / 2, 10);\n var compStyle = parseInt(computedStyle(elem, null, \'height\'), 10);\n Modernizr.addTest(\'cssvhunit\', roundedEquals(compStyle, height));\n });\n\n /*!\n {\n "name": "CSS vw unit",\n "property": "cssvwunit",\n "caniuse": "viewport-units",\n "tags": ["css"],\n "builderAliases": ["css_vwunit"],\n "notes": [{\n "name": "Related Modernizr Issue",\n "href": "https://github.com/Modernizr/Modernizr/issues/572"\n },{\n "name": "JSFiddle Example",\n "href": "https://jsfiddle.net/FWeinb/etnYC/"\n }]\n }\n !*/\n\n testStyles(\'#modernizr { width: 50vw; }\', function (elem) {\n var width = parseInt(window.innerWidth / 2, 10);\n var compStyle = parseInt(computedStyle(elem, null, \'width\'), 10);\n Modernizr.addTest(\'cssvwunit\', roundedEquals(compStyle, width));\n });\n\n /*!\n {\n "name": "placeholder attribute",\n "property": "placeholder",\n "tags": ["forms", "attribute"],\n "builderAliases": ["forms_placeholder"]\n }\n !*/\n /* DOC\n Tests for placeholder attribute in inputs and textareas\n */\n\n Modernizr.addTest(\'placeholder\', \'placeholder\' in createElement(\'input\') && \'placeholder\' in createElement(\'textarea\'));\n\n /*!\n {\n "name": "Local Storage",\n "property": "localstorage",\n "caniuse": "namevalue-storage",\n "tags": ["storage"],\n "knownBugs": [],\n "notes": [],\n "warnings": [],\n "polyfills": [\n "joshuabell-polyfill",\n "cupcake",\n "storagepolyfill",\n "amplifyjs",\n "yui-cacheoffline"\n ]\n }\n !*/\n\n // In FF4, if disabled, window.localStorage should === null.\n\n // Normally, we could not test that directly and need to do a\n // `(\'localStorage\' in window)` test first because otherwise Firefox will\n // throw bugzil.la/365772 if cookies are disabled\n\n // Similarly, in Chrome with "Block third-party cookies and site data" enabled,\n // attempting to access `window.sessionStorage` will throw an exception. crbug.com/357625\n\n // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem\n // will throw the exception:\n // QUOTA_EXCEEDED_ERROR DOM Exception 22.\n // Peculiarly, getItem and removeItem calls do not throw.\n\n // Because we are forced to try/catch this, we\'ll go aggressive.\n\n // Just FWIW: IE8 Compat mode supports these features completely:\n // www.quirksmode.org/dom/html5.html\n // But IE8 doesn\'t support either with local files\n\n Modernizr.addTest(\'localstorage\', function () {\n var mod = \'modernizr\';\n try {\n localStorage.setItem(mod, mod);\n localStorage.removeItem(mod);\n return true;\n } catch (e) {\n return false;\n }\n });\n\n /*!\n {\n "name": "Inline SVG",\n "property": "inlinesvg",\n "caniuse": "svg-html5",\n "tags": ["svg"],\n "notes": [{\n "name": "Test page",\n "href": "https://paulirish.com/demo/inline-svg"\n }, {\n "name": "Test page and results",\n "href": "https://codepen.io/eltonmesquita/full/GgXbvo/"\n }],\n "polyfills": ["inline-svg-polyfill"],\n "knownBugs": ["False negative on some
1Chromia browsers."]\n }\n !*/\n /* DOC\n Detects support for inline SVG in HTML (not within XHTML).\n */\n\n Modernizr.addTest(\'inlinesvg\', function () {\n var div = createElement(\'div\');\n div.innerHTML = \'<svg/>\';\n return \'http://www.w3.org/2000/svg\' == (\'undefined\' != typeof SVGRect && div.firstChild && div.firstChild.namespaceURI);\n });\n\n /*!\n {\n "name": "Canvas",\n "property": "canvas",\n "caniuse": "canvas",\n "tags": ["canvas", "graphics"],\n "polyfills": ["flashcanvas", "excanvas", "slcanvas", "fxcanvas"]\n }\n !*/\n /* DOC\n Detects support for the `<canvas>` element for 2D drawing.\n */\n\n // On the S60 and BB Storm, getContext exists, but always returns undefined\n // so we actually have to call getContext() to verify\n // github.com/Modernizr/Modernizr/issues/issue/97/\n Modernizr.addTest(\'canvas\', function () {\n var elem = createElement(\'canvas\');\n return !!(elem.getContext && elem.getContext(\'2d\'));\n });\n\n /*!\n {\n "name": "CSS Shapes",\n "property": "shapes",\n "tags": ["css"],\n "notes": [{\n "name": "CSS Shapes W3C specification",\n "href": "https://www.w3.org/TR/css-shapes"\n },{\n "name": "Examples from Adobe",\n "href": "http://webplatform.adobe.com/shapes/"\n }, {\n "name": "Samples showcasing uses of Shapes",\n "href": "http://codepen.io/collection/qFesk"\n }]\n }\n !*/\n\n Modernizr.addTest(\'shapes\', testAllProps(\'shapeOutside\', \'content-box\', true));\n\n /*!\n {\n "name": "SVG",\n "property": "svg",\n "caniuse": "svg",\n "tags": ["svg"],\n "authors": ["Erik Dahlstrom"],\n "polyfills": [\n "svgweb",\n "raphael",\n "amplesdk",\n "canvg",\n "svg-boilerplate",\n "sie",\n "dojogfx",\n "fabricjs"\n ]\n }\n !*/\n /* DOC\n Detects support for SVG in `<embed>` or `<object>` elements.\n */\n\n Modernizr.addTest(\'svg\', !!document.createElementNS && !!document.createElementNS(\'http://www.w3.org/2000/svg\', \'svg\').createSVGRect);\n\n /*!\n {\n "name": "HTML5 Video",\n "property": "video",\n "caniuse": "video",\n "tags": ["html5"],\n "knownBugs": [\n "Without QuickTime, `Modernizr.video.h264` will be `undefined`; https://github.com/Modernizr/Modernizr/issues/546"\n ],\n "polyfills": [\n "html5media",\n "mediaelementjs",\n "sublimevideo",\n "videojs",\n "leanbackplayer",\n "videoforeverybody"\n ]\n }\n !*/\n /* DOC\n Detects support for the video element, as well as testing what types of content it supports.\n Subproperties are provided to describe support for `ogg`, `h264` and `webm` formats, e.g.:\n ```javascript\n Modernizr.video // true\n Modernizr.video.ogg // \'probably\'\n ```\n */\n\n // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845\n // thx to NielsLeenheer and zcorpan\n\n // Note: in some older browsers, "no" was a return value instead of empty string.\n // It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2\n // It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5\n\n Modernizr.addTest(\'video\', function () {\n var elem = createElement(\'video\');\n var bool = false;\n\n // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224\n try {\n bool = !!elem.canPlayType;\n if (bool) {\n bool = new Boolean(bool);\n bool.ogg = elem.canPlayType(\'video/ogg; codecs="theora"\').replace(/^no$/, \'\');\n\n // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546\n bool.h264 = elem.canPlayType(\'video/mp4; codecs="avc1.42E01E"\').replace(/^no$/, \'\');\n bool.webm = elem.canPlayType(\'video/webm; codecs="vp8, vorbis"\').replace(/^no$/, \'\');\n bool.vp9 = elem.canPlayType(\'video/webm; codecs="vp9"\').replace(/^no$/, \'\');\n bool.hls = elem.canPlayType(\'application/x-mpegURL; codecs="avc1.42E01E"\').replace(/^no$/, \'\');\n }\n } catch (e) {}\n return bool;\n });\n\n // Run each test\n testRunner();\n\n // Remove the "no-js" class if it exists\n setClasses(classes);\n delete ModernizrProto.addTest;\n delete ModernizrProto.addAsyncTest;\n\n // Run the things that are supposed to run after the tests\n for (var i = 0; i < Modernizr._q.length;
1 i++) {\n Modernizr._q[i]();\n }\n\n // Leak Modernizr namespace\n window.Modernizr = Modernizr;\n})(window, document);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzA5LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb25jaW5uaXR5Ly4vd3AtY29udGVudC90aGVtZXMvY29uY2lubml0eS9hc3NldHMvc3JjL3NjcmlwdHMvbGliL19tb2Rlcm5penItY3VzdG9tX2guanM/NDlkNyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybi
1B0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG4vKiFcbiAqIG1vZGVybml6ciB2My42LjBcbiAqIEJ1aWxkIGh0dHBzOi8vbW9kZXJuaXpyLmNvbS9kb3dubG9hZD8tY2FudmFzLWNzc2FuaW1hdGlvbnMtY3NzY29sdW1ucy1jc3NncmFkaWVudHMtY3NzdHJhbnNmb3Jtcy1jc3N0cmFuc2l0aW9ucy1jc3N2aHVuaXQtY3Nzdnd1bml0LWZsZXhib3gtaW5saW5lc3ZnLWxvY2Fsc3RvcmFnZS1wbGFjZWhvbGRlci1zaGFwZXMtc3ZnLXZpZGVvLWRvbXByZWZpeGVzLW1xLXByZWZpeGVkLXByZWZpeGVzLXNldGNsYXNzZXMtdGVzdGFsbHByb3BzLXRlc3Rwcm9wLWRvbnRtaW5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpXG4gKiAgRmFydWsgQXRlc1xuICogIFBhdWwgSXJpc2hcbiAqICBBbGV4IFNleHRvblxuICogIFJ5YW4gU2VkZG9uXG4gKiAgUGF0cmljayBLZXR0bmVyXG4gKiAgU3R1IENveFxuICogIFJpY2hhcmQgSGVycmVyYVxuXG4gKiBNSVQgTGljZW5zZVxuICovXG5cbi8qXG4gKiBNb2Rlcm5penIgdGVzdHMgd2hpY2ggbmF0aXZlIENTUzMgYW5kIEhUTUw1IGZlYXR1cmVzIGFyZSBhdmFpbGFibGUgaW4gdGhlXG4gKiBjdXJyZW50IFVBIGFuZCBtYWtlcyB0aGUgcmVzdWx0cyBhdmFpbGFibGUgdG8geW91IGluIHR3byB3YXlzOiBhcyBwcm9wZXJ0aWVzIG9uXG4gKiBhIGdsb2JhbCBgTW9kZXJuaXpyYCBvYmplY3QsIGFuZCBhcyBjbGFzc2VzIG9uIHRoZSBgPGh0bWw+YCBlbGVtZW50LiBUaGlzXG4gKiBpbmZvcm1hdGlvbiBhbGxvd3MgeW91IHRvIHByb2dyZXNzaXZlbHkgZW5oYW5jZSB5b3VyIHBhZ2VzIHdpdGggYSBncmFudWxhciBsZXZlbFxuICogb2YgY29udHJvbCBvdmVyIHRoZSBleHBlcmllbmNlLlxuICovXG5cbihmdW5jdGlvbiAod2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gIHZhciB0ZXN0cyA9IFtdO1xuXG4gIC8qKlxuICAgKlxuICAgKiBNb2Rlcm5penJQcm90byBpcyB0aGUgY29uc3RydWN0b3IgZm9yIE1vZGVybml6clxuICAgKlxuICAgKiBAY2xhc3NcbiAgICogQGFjY2VzcyBwdWJsaWNcbiAgICovXG5cbiAgdmFyIE1vZGVybml6clByb3RvID0ge1xuICAgIC8vIFRoZSBjdXJyZW50IHZlcnNpb24sIGR1bW15XG4gICAgX3ZlcnNpb246ICczLjYuMCcsXG4gICAgLy8gQW55IHNldHRpbmdzIHRoYXQgZG9uJ3Qgd29yayBhcyBzZXBhcmF0ZSBtb2R1bGVzXG4gICAgLy8gY2FuIGdvIGluIGhlcmUgYXMgY29uZmlndXJhdGlvbi5cbiAgICBfY29uZmlnOiB7XG4gICAgICBjbGFzc1ByZWZpeDogJycsXG4gICAgICBlbmFibGVDbGFzc2VzOiB0cnVlLFxuICAgICAgZW5hYmxlSlNDbGFzczogdHJ1ZSxcbiAgICAgIHVzZVByZWZpeGVzOiB0cnVlXG4gICAgfSxcbiAgICAvLyBRdWV1ZSBvZiB0ZXN0c1xuICAgIF9xOiBbXSxcbiAgICAvLyBTdHViIHRoZXNlIGZvciBwZW9wbGUgd2hvIGFyZSBsaXN0ZW5pbmdcbiAgICBvbjogZnVuY3Rpb24gb24odGVzdCwgY2IpIHtcbiAgICAgIC8vIEkgZG9uJ3QgcmVhbGx5IHRoaW5rIHBlb3BsZSBzaG91bGQgZG8gdGhpcywgYnV0IHdlIGNhblxuICAgICAgLy8gc2FmZSBndWFyZCBpdCBhIGJpdC5cbiAgICAgIC8vIC0tIE5PVEU6OiB0aGlzIGdldHMgV0FZIG92ZXJyaWRkZW4gaW4gc3JjL2FkZFRlc3QgZm9yIGFjdHVhbCBhc3luYyB0ZXN0cy5cbiAgICAgIC8vIFRoaXMgaXMgaW4gY2FzZSBwZW9wbGUgbGlzdGVuIHRvIHN5bmNocm9ub3VzIHRlc3RzLiBJIHdvdWxkIGxlYXZlIGl0IG91dCxcbiAgICAgIC8vIGJ1dCB0aGUgY29kZSB0byAqZGlzYWxsb3cqIHN5bmMgdGVzdHMgaW4gdGhlIHJlYWwgdmVyc2lvbiBvZiB0aGlzXG4gICAgICAvLyBmdW5jdGlvbiBpcyBhY3R1YWxseSBsYXJnZXIgdGhhbiB0aGlzLlxuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNiKHNlbGZbdGVzdF0pO1xuICAgICAgfSwgMCk7XG4gICAgfSxcbiAgICBhZGRUZXN0OiBmdW5jdGlvbiBhZGRUZXN0KG5hbWUsIGZuLCBvcHRpb25zKSB7XG4gICAgICB0ZXN0cy5wdXNoKHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgZm46IGZuLFxuICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICB9KTtcbiAgICB9LFxuICAgIGFkZEFzeW5jVGVzdDogZnVuY3Rpb24gYWRkQXN5bmNUZXN0KGZuKSB7XG4gICAgICB0ZXN0cy5wdXNoKHtcbiAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgZm46IGZuXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gRmFrZSBzb21lIG9mIE9iamVjdC5jcmVhdGUgc28gd2UgY2FuIGZvcmNlIG5vbiB0ZXN0IHJlc3VsdHMgdG8gYmUgbm9uIFwib3duXCIgcHJvcGVydGllcy5cbiAgdmFyIE1vZGVybml6ciA9IGZ1bmN0aW9uIE1vZGVybml6cigpIHt9O1xuICBNb2Rlcm5penIucHJvdG90eXBlID0gTW9kZXJuaXpyUHJvdG87XG5cbiAgLy8gTGVhayBtb2Rlcm5penIgZ2xvYmFsbHkgd2hlbiB5b3UgYHJlcXVpcmVgIGl0IHJhdGhlciB0aGFuIGZvcmNlIGl0IGhlcmUuXG4gIC8vIE92ZXJ3cml0ZSBuYW1lIHNvIGNvbnN0cnVjdG9yIG5hbWUgaXMgbmljZXIgOkRcbiAgTW9kZXJuaXpyID0gbmV3IE1vZGVybml6cigpO1xuICB2YXIgY2xhc3NlcyA9IFtdO1xuXG4gIC8qKlxuICAgKiBpcyByZXR1cm5zIGEgYm9vbGVhbiBpZiB0aGUgdHlwZW9mIGFuIG9iaiBpcyBleGFjdGx5IHR5cGUuXG4gICAqXG4gICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgKiBAZnVuY3Rpb24gaXNcbiAgICogQHBhcmFtIHsqfSBvYmogLSBBIHRoaW5nIHdlIHdhbnQgdG8gY2hlY2sgdGhlIHR5cGUgb2ZcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBBIHN0cmluZyB0byBjb21wYXJlIHRoZSB0eXBlb2YgYWdhaW5zdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG5cbiAgZnVuY3Rpb24gaXMob2JqLCB0eXBlKSB7XG4gICAgcmV0dXJuIF90eXBlb2Yob2JqKSA9PT0gdHlwZTtcbiAgfVxuICAvKipcbiAgICogUnVuIHRocm91Z2ggYWxsIHRlc3RzIGFuZCBkZXRlY3QgdGhlaXIgc3VwcG9ydCBpbiB0aGUgY3VycmVudCBVQS5cbiAgICpcbiAgICogQGFjY2VzcyBwcml2YXRlXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHRlc3RSdW5uZXIoKSB7XG4gICAgdmFyIGZlYXR1cmVOYW1lcztcbiAgICB2YXIgZmVhdHVyZTtcbiAgICB2YXIgYWxpYXNJZHg7XG4gICAgdmFyIHJlc3VsdDtcbiAgICB2YXIgbmFtZUlkeDtcbiAgICB2YXIgZmVhdHVyZU5hbWU7XG4gICAgdmFyIGZlYXR1cmVOYW1lU3BsaXQ7XG4gICAgZm9yICh2YXIgZmVhdHVyZUlkeCBpbiB0ZXN0cykge1xuICAgICAgaWYgKHRlc3RzLmhhc093blByb3BlcnR5KGZlYXR1cmVJZHgpKSB7XG4gICAgICAgIGZlYXR1cmVOYW1lcyA9IFtdO1xuICAgICAgICBmZWF0dXJlID0gdGVzdHNbZmVhdHVyZUlkeF07XG4gICAgICAgIC8vIHJ1biB0aGUgdGVzdCwgdGhyb3cgdGhlIHJldHVybi
1B2YWx1ZSBpbnRvIHRoZSBNb2Rlcm5penIsXG4gICAgICAgIC8vIHRoZW4gYmFzZWQgb24gdGhhdCBib29sZWFuLCBkZWZpbmUgYW4gYXBwcm9wcmlhdGUgY2xhc3NOYW1lXG4gICAgICAgIC8vIGFuZCBwdXNoIGl0IGludG8gYW4gYXJyYXkgb2YgY2xhc3NlcyB3ZSdsbCBqb2luIGxhdGVyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBuYW1lLCBpdCdzIGFuICdhc3luYycgdGVzdCB0aGF0IGlzIHJ1bixcbiAgICAgICAgLy8gYnV0IG5vdCBkaXJlY3RseSBhZGRlZCB0byB0aGUgb2JqZWN0LiBUaGF0IHNob3VsZFxuICAgICAgICAvLyBiZSBkb25lIHdpdGggYSBwb3N0LXJ1biBhZGRUZXN0IGNhbGwuXG4gICAgICAgIGlmIChmZWF0dXJlLm5hbWUpIHtcbiAgICAgICAgICBmZWF0dXJlTmFtZXMucHVzaChmZWF0dXJlLm5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgaWYgKGZlYXR1cmUub3B0aW9ucyAmJiBmZWF0dXJlLm9wdGlvbnMuYWxpYXNlcyAmJiBmZWF0dXJlLm9wdGlvbnMuYWxpYXNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIEFkZCBhbGwgdGhlIGFsaWFzZXMgaW50byB0aGUgbmFtZXMgbGlzdFxuICAgICAgICAgICAgZm9yIChhbGlhc0lkeCA9IDA7IGFsaWFzSWR4IDwgZmVhdHVyZS5vcHRpb25zLmFsaWFzZXMubGVuZ3RoOyBhbGlhc0lkeCsrKSB7XG4gICAgICAgICAgICAgIGZlYXR1cmVOYW1lcy5wdXNoKGZlYXR1cmUub3B0aW9ucy5hbGlhc2VzW2FsaWFzSWR4XS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSdW4gdGhlIHRlc3QsIG9yIHVzZSB0aGUgcmF3IHZhbHVlIGlmIGl0J3Mgbm90IGEgZnVuY3Rpb25cbiAgICAgICAgcmVzdWx0ID0gaXMoZmVhdHVyZS5mbiwgJ2Z1bmN0aW9uJykgPyBmZWF0dXJlLmZuKCkgOiBmZWF0dXJlLmZuO1xuXG4gICAgICAgIC8vIFNldCBlYWNoIG9mIHRoZSBuYW1lcyBvbiB0aGUgTW9kZXJuaXpyIG9iamVjdFxuICAgICAgICBmb3IgKG5hbWVJZHggPSAwOyBuYW1lSWR4IDwgZmVhdHVyZU5hbWVzLmxlbmd0aDsgbmFtZUlkeCsrKSB7XG4gICAgICAgICAgZmVhdHVyZU5hbWUgPSBmZWF0dXJlTmFtZXNbbmFtZUlkeF07XG4gICAgICAgICAgLy8gU3VwcG9ydCBkb3QgcHJvcGVydGllcyBhcyBzdWIgdGVzdHMuIFdlIGRvbid0IGRvIGNoZWNraW5nIHRvIG1ha2Ugc3VyZVxuICAgICAgICAgIC8vIHRoYXQgdGhlIGltcGxpZWQgcGFyZW50IHRlc3RzIGhhdmUgYmVlbiBhZGRlZC4gWW91IG11c3QgY2FsbCB0aGVtIGluXG4gICAgICAgICAgLy8gb3JkZXIgKGVpdGhlciBpbiB0aGUgdGVzdCwgb3IgbWFrZSB0aGUgcGFyZW50IHRlc3QgYSBkZXBlbmRlbmN5KS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIENhcCBpdCB0byBUV08gdG8gbWFrZSB0aGUgbG9naWMgc2ltcGxlIGFuZCBiZWNhdXNlIHdobyBuZWVkcyB0aGF0IGtpbmQgb2Ygc3VidGVzdGluZ1xuICAgICAgICAgIC8vIGhhc2h0YWcgZmFtb3VzIGxhc3Qgd29yZHNcbiAgICAgICAgICBmZWF0dXJlTmFtZVNwbGl0ID0gZmVhdHVyZU5hbWUuc3BsaXQoJy4nKTtcbiAgICAgICAgICBpZiAoMSA9PT0gZmVhdHVyZU5hbWVTcGxpdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIE1vZGVybml6cltmZWF0dXJlTmFtZVNwbGl0WzBdXSA9IHJlc3VsdDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY2FzdCB0byBhIEJvb2xlYW4sIGlmIG5vdCBvbmUgYWxyZWFkeVxuICAgICAgICAgICAgaWYgKE1vZGVybml6cltmZWF0dXJlTmFtZVNwbGl0WzBdXSAmJiAhKE1vZGVybml6cltmZWF0dXJlTmFtZVNwbGl0WzBdXSBpbnN0YW5jZW9mIEJvb2xlYW4pKSB7XG4gICAgICAgICAgICAgIE1vZGVybml6cltmZWF0dXJlTmFtZVNwbGl0WzBdXSA9IG5ldyBCb29sZWFuKE1vZGVybml6cltmZWF0dXJlTmFtZVNwbGl0WzBdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBNb2Rlcm5penJbZmVhdHVyZU5hbWVTcGxpdFswXV1bZmVhdHVyZU5hbWVTcGxpdFsxXV0gPSByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNsYXNzZXMucHVzaCgocmVzdWx0ID8gJycgOiAnbm8tJykgKyBmZWF0dXJlTmFtZVNwbGl0LmpvaW4oJy0nKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIGRvY0VsZW1lbnQgaXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyIHRvIGdyYWIgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnRcbiAgICpcbiAgICogQGFjY2VzcyBwcml2YXRlXG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxTVkdFbGVtZW50fSBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkb2N1bWVudFxuICAgKi9cblxuICB2YXIgZG9jRWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuICAvKipcbiAgICogQSBjb252ZW5pZW5jZSBoZWxwZXIgdG8gY2hlY2sgaWYgdGhlIGRvY3VtZW50IHdlIGFyZSBydW5uaW5nIGluIGlzIGFuIFNWRyBkb2N1bWVudFxuICAgKlxuICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuXG4gIHZhciBpc1NWRyA9ICdzdmcnID09PSBkb2NFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgLyoqXG4gICAqIHNldENsYXNzZXMgdGFrZXMgYW4gYXJyYXkgb2YgY2xhc3MgbmFtZXMgYW5kIGFkZHMgdGhlbSB0byB0aGUgcm9vdCBlbGVtZW50XG4gICAqXG4gICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgKiBAZnVuY3Rpb24gc2V0Q2xhc3Nlc1xuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBjbGFzc2VzIC0gQXJyYXkgb2YgY2xhc3MgbmFtZXNcbiAgICovXG5cbiAgLy8gUGFzcyBpbiBhbiBhbmQgYXJyYXkgb2YgY2xhc3MgbmFtZXMsIGUuZy46XG4gIC8vICBbJ25vLXdlYnAnLCAnYm9yZGVycmFkaXVzJywgLi4uXVxuICBmdW5jdGlvbiBzZXRDbGFzc2VzKGNsYXNzZXMpIHtcbiAgICB2YXIgY2xhc3NOYW1lID0gZG9jRWxlbWVudC5jbGFzc05hbWU7XG4gICAgdmFyIGNsYXNzUHJlZml4ID0gTW9kZXJuaXpyLl9jb25maWcuY2xhc3NQcmVmaXggfHwgJyc7XG4gICAgaWYgKGlzU1ZHKSB7XG4gICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuYmFzZVZhbDtcbiAgICB9XG5cbiAgICAvLyBDaGFuZ2UgYG5vLWpzYCB0byBganNgIChpbmRlcGVuZGVudGx5IG9mIHRoZSBgZW5hYmxlQ2xhc3Nlc2Agb3B0aW9uKVxuICAgIC8vIEhhbmRsZSBjbGFzc1ByZWZpeCBvbiB0aGlzIHRvb1xuICAgIGlmIChNb2Rlcm5penIuX2NvbmZpZy5lbmFibGVKU0NsYXNzKSB7XG4gICAgICB2Y
1XIgcmVKUyA9IG5ldyBSZWdFeHAoJyhefFxcXFxzKScgKyBjbGFzc1ByZWZpeCArICduby1qcyhcXFxcc3wkKScpO1xuICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UocmVKUywgJyQxJyArIGNsYXNzUHJlZml4ICsgJ2pzJDInKTtcbiAgICB9XG4gICAgaWYgKE1vZGVybml6ci5fY29uZmlnLmVuYWJsZUNsYXNzZXMpIHtcbiAgICAgIC8vIEFkZCB0aGUgbmV3IGNsYXNzZXNcbiAgICAgIGNsYXNzTmFtZSArPSAnICcgKyBjbGFzc1ByZWZpeCArIGNsYXNzZXMuam9pbignICcgKyBjbGFzc1ByZWZpeCk7XG4gICAgICBpZiAoaXNTVkcpIHtcbiAgICAgICAgZG9jRWxlbWVudC5jbGFzc05hbWUuYmFzZVZhbCA9IGNsYXNzTmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY0VsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgICogSWYgdGhlIGJyb3dzZXJzIGZvbGxvdyB0aGUgc3BlYywgdGhlbiB0aGV5IHdvdWxkIGV4cG9zZSB2ZW5kb3Itc3BlY2lmaWMgc3R5bGVzIGFzOlxuICAgICogICBlbGVtLnN0eWxlLldlYmtpdEJvcmRlclJhZGl1c1xuICAgICogaW5zdGVhZCBvZiBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nICh3aGljaCBpcyB0ZWNobmljYWxseSBpbmNvcnJlY3QpOlxuICAgICogICBlbGVtLnN0eWxlLndlYmtpdEJvcmRlclJhZGl1c1xuICAgICAqIFdlYktpdCBnaG9zdHMgdGhlaXIgcHJvcGVydGllcyBpbiBsb3dlcmNhc2UgYnV0IE9wZXJhICYgTW96IGRvIG5vdC5cbiAgICAqIE1pY3Jvc29mdCB1c2VzIGEgbG93ZXJjYXNlIGBtc2AgaW5zdGVhZCBvZiB0aGUgY29ycmVjdCBgTXNgIGluIElFOCtcbiAgICAqICAgZXJpay5lYWUubmV0L2FyY2hpdmVzLzIwMDgvMDMvMTAvMjEuNDguMTAvXG4gICAgICogTW9yZSBoZXJlOiBnaXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvaXNzdWVzL2lzc3VlLzIxXG4gICAgKlxuICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdmVuZG9yLXNwZWNpZmljIHN0eWxlIHByb3BlcnRpZXNcbiAgICAqL1xuXG4gIHZhciBvbVByZWZpeGVzID0gJ01veiBPIG1zIFdlYmtpdCc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgSmF2YVNjcmlwdCBET00gdmFsdWVzIHVzZWQgZm9yIHRlc3RzXG4gICAqXG4gICAqIEBtZW1iZXJvZiBNb2Rlcm5penJcbiAgICogQG5hbWUgTW9kZXJuaXpyLl9kb21QcmVmaXhlc1xuICAgKiBAb3B0aW9uTmFtZSBNb2Rlcm5penIuX2RvbVByZWZpeGVzXG4gICAqIEBvcHRpb25Qcm9wIGRvbVByZWZpeGVzXG4gICAqIEBhY2Nlc3MgcHVibGljXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIE1vZGVybml6ci5fZG9tUHJlZml4ZXMgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBbX3ByZWZpeGVzXSgjbW9kZXJuaXpyLV9wcmVmaXhlcyksIGJ1dCByYXRoZXJcbiAgICogdGhhbiBrZWJhYi1jYXNlIHByb3BlcnRpZXMsIGFsbCBwcm9wZXJ0aWVzIGFyZSB0aGVpciBDYXBpdGFsaXplZCB2YXJpYW50XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIE1vZGVybml6ci5fZG9tUHJlZml4ZXMgPT09IFsgXCJNb3pcIiwgXCJPXCIsIFwibXNcIiwgXCJXZWJraXRcIiBdO1xuICAgKiBgYGBcbiAgICovXG5cbiAgdmFyIGRvbVByZWZpeGVzID0gTW9kZXJuaXpyUHJvdG8uX2NvbmZpZy51c2VQcmVmaXhlcyA/IG9tUHJlZml4ZXMudG9Mb3dlckNhc2UoKS5zcGxpdCgnICcpIDogW107XG4gIE1vZGVybml6clByb3RvLl9kb21QcmVmaXhlcyA9IGRvbVByZWZpeGVzO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBzZXQgZm9yIGNzcyB0ZXN0cy4gU2VlIHRpY2tldCAjMjFcbiAgICogaHR0cDovL2dpdC5pby92VUdsNFxuICAgKlxuICAgKiBAbWVtYmVyb2YgTW9kZXJuaXpyXG4gICAqIEBuYW1lIE1vZGVybml6ci5fcHJlZml4ZXNcbiAgICogQG9wdGlvbk5hbWUgTW9kZXJuaXpyLl9wcmVmaXhlc1xuICAgKiBAb3B0aW9uUHJvcCBwcmVmaXhlc1xuICAgKiBAYWNjZXNzIHB1YmxpY1xuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBNb2Rlcm5penIuX3ByZWZpeGVzIGlzIHRoZSBpbnRlcm5hbCBsaXN0IG9mIHByZWZpeGVzIHRoYXQgd2UgdGVzdCBhZ2FpbnN0XG4gICAqIGluc2lkZSBvZiB0aGluZ3MgbGlrZSBbcHJlZml4ZWRdKCNtb2Rlcm5penItcHJlZml4ZWQpIGFuZCBbcHJlZml4ZWRDU1NdKCMtY29kZS1tb2Rlcm5penItcHJlZml4ZWRjc3MpLiBJdCBpcyBzaW1wbHlcbiAgICogYW4gYXJyYXkgb2Yga2ViYWItY2FzZSB2ZW5kb3IgcHJlZml4ZXMgeW91IGNhbiB1c2Ugd2l0aGluIHlvdXIgY29kZS5cbiAgICpcbiAgICogU29tZSBjb21tb24gdXNlIGNhc2VzIGluY2x1ZGVcbiAgICpcbiAgICogR2VuZXJhdGluZyBhbGwgcG9zc2libGUgcHJlZml4ZWQgdmVyc2lvbiBvZiBhIENTUyBwcm9wZXJ0eVxuICAgKiBgYGBqc1xuICAgKiB2YXIgcnVsZSA9IE1vZGVybml6ci5fcHJlZml4ZXMuam9pbigndHJhbnNmb3JtOiByb3RhdGUoMjBkZWcpOyAnKTtcbiAgICpcbiAgICogcnVsZSA9PT0gJ3RyYW5zZm9ybTogcm90YXRlKDIwZGVnKTsgd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDIwZGVnKTsgbW96LXRyYW5zZm9ybTogcm90YXRlKDIwZGVnKTsgby10cmFuc2Zvcm06IHJvdGF0ZSgyMGRlZyk7IG1zLXRyYW5zZm9ybTogcm90YXRlKDIwZGVnKTsnXG4gICAqIGBgYFxuICAgKlxuICAgKiBHZW5lcmF0aW5nIGFsbCBwb3NzaWJsZSBwcmVmaXhlZCB2ZXJzaW9uIG9mIGEgQ1NTIHZhbHVlXG4gICAqIGBgYGpzXG4gICAqIHJ1bGUgPSAnZGlzcGxheTonICsgIE1vZGVybml6ci5fcHJlZml4ZXMuam9pbignZmxleDsgZGlzcGxheTonKSArICdmbGV4JztcbiAgICpcbiAgICogcnVsZSA9PT0gJ2Rpc3BsYXk6ZmxleDsgZGlzcGxheTotd2Via2l0LWZsZXg7IGRpc3BsYXk6LW1vei1mbGV4OyBkaXNwbGF5Oi1vLWZsZXg7IGRpc3BsYXk6LW1zLWZsZXg7IGRpc3BsYXk6ZmxleCdcbiAgICogYGBgXG4gICAqL1xuXG4gIC8vIHdlIHVzZSBbJycsJyddIHJhdGhlciB0aGFuIGFuIGVtcHR5IGFycmF5IGluIG9yZGVyIHRvIGFsbG93IGEgcGF0dGVybiBvZiAuYGpvaW4oKWBpbmcgcHJlZml4ZXMgdG8gdGVzdFxuICAvLyB2YWx1ZXMgaW4gZmVhdHVyZSBkZXRlY3RzIHRvIGNvbnRpbnVlIHRvIHdvcmtcbiAgdmFyIHByZWZpeGVzID0gTW9kZXJuaXpyUHJvdG8uX2NvbmZpZy51c2VQcmVmaXhlcyA/ICcgLXdlYmtpdC0gLW1vei0gLW8tIC1tcy0gJy5zcGxpdCgnICcpIDogWycnLCAnJ107XG5cbiAgLy8gZXhwb3NlIHRoZXNlIGZvciB0aGUgcGx1Z2luIEFQSS4gTG9vayBpbiB0aGUgc291cmNlIGZvciBob3cgdG8gam9pbigpIHRoZW0gYWdhaW5zdCB5b3VyIGlucHV0XG4gIE1vZGVybml6clByb3RvLl9wcmVmaXhlcyA9IHByZWZpeGVzO1xuXG4gIC8qKlxuICAgKiBjcmVhdGVFbGVtZW50IGlzIGEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgZG9jdW1lbnQuY3JlYXRlRWxlbWVudC4gU2luY2Ugd2VcbiAgICogdXNlIGNyZWF0ZUVsZW1lbnQgYWxsIG92ZXIgdGhlIHBsYWNlLCB0aGlzIGFsbG93cyBmb3IgKHNsaWdodGx5KSBzbWFsbGVyIGNvZGVcbiAgICogYXMgd2VsbCBhcyBhYnN0cmFjdGluZyBhd2F5IGlzc3VlcyB3aXRoIGNyZWF0aW5nIGVsZW1lbnRzIGluIGNvbnRleHRzIG90aGVyIHRoYW5cbiAgICogSFRNTCBkb2N1bWVudHMgKGUuZy4gU1ZHIGRvY3VtZW50cykuXG4gICAqXG4gICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgKiBAZnVuY3Rpb24gY3JlYXRlRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8U1ZHRWxlbWVudH0gQW4gSFRNTCBvciBTVkcgZWxlbWVudFxuICAgKi9cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KCkge1xuICAgIGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSBpbiBJRTcsIHd
1oZXJlIHRoZSB0eXBlIG9mIGNyZWF0ZUVsZW1lbnQgaXMgXCJvYmplY3RcIi5cbiAgICAgIC8vIEZvciB0aGlzIHJlYXNvbiwgd2UgY2Fubm90IGNhbGwgYXBwbHkoKSBhcyBPYmplY3QgaXMgbm90IGEgRnVuY3Rpb24uXG4gICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChhcmd1bWVudHNbMF0pO1xuICAgIH0gZWxzZSBpZiAoaXNTVkcpIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMuY2FsbChkb2N1bWVudCwgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgYXJndW1lbnRzWzBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQuYXBwbHkoZG9jdW1lbnQsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEJvZHkgcmV0dXJucyB0aGUgYm9keSBvZiBhIGRvY3VtZW50LCBvciBhbiBlbGVtZW50IHRoYXQgY2FuIHN0YW5kIGluIGZvclxuICAgKiB0aGUgYm9keSBpZiBhIHJlYWwgYm9keSBkb2VzIG5vdCBleGlzdFxuICAgKlxuICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICogQGZ1bmN0aW9uIGdldEJvZHlcbiAgICogQHJldHVybnMge0hUTUxFbGVtZW50fFNWR0VsZW1lbnR9IFJldHVybnMgdGhlIHJlYWwgYm9keSBvZiBhIGRvY3VtZW50LCBvciBhblxuICAgKiBhcnRpZmljaWFsbHkgY3JlYXRlZCBlbGVtZW50IHRoYXQgc3RhbmRzIGluIGZvciB0aGUgYm9keVxuICAgKi9cblxuICBmdW5jdGlvbiBnZXRCb2R5KCkge1xuICAgIC8vIEFmdGVyIHBhZ2UgbG9hZCBpbmplY3RpbmcgYSBmYWtlIGJvZHkgZG9lc24ndCB3b3JrIHNvIGNoZWNrIGlmIGJvZHkgZXhpc3RzXG4gICAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuICAgIGlmICghYm9keSkge1xuICAgICAgLy8gQ2FuJ3QgdXNlIHRoZSByZWFsIGJvZHkgY3JlYXRlIGEgZmFrZSBvbmUuXG4gICAgICBib2R5ID0gY3JlYXRlRWxlbWVudChpc1NWRyA/ICdzdmcnIDogJ2JvZHknKTtcbiAgICAgIGJvZHkuZmFrZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBib2R5O1xuICB9XG5cbiAgLyoqXG4gICAqIGluamVjdEVsZW1lbnRXaXRoU3R5bGVzIGluamVjdHMgYW4gZWxlbWVudCB3aXRoIHN0eWxlIGVsZW1lbnQgYW5kIHNvbWUgQ1NTIHJ1bGVzXG4gICAqXG4gICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgKiBAZnVuY3Rpb24gaW5qZWN0RWxlbWVudFdpdGhTdHlsZXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJ1bGUgLSBTdHJpbmcgcmVwcmVzZW50aW5nIGEgY3NzIHJ1bGVcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB0byB0ZXN0IHRoZSBpbmplY3RlZCBlbGVtZW50XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbm9kZXNdIC0gQW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIG5vZGVzIHlvdSB3YW50IGluamVjdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFt0ZXN0bmFtZXNdIC0gQW4gYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IGFyZSB1c2VkIGFzIGlkcyBmb3IgdGhlIGFkZGl0aW9uYWwgbm9kZXNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuXG4gIGZ1bmN0aW9uIGluamVjdEVsZW1lbnRXaXRoU3R5bGVzKHJ1bGUsIGNhbGxiYWNrLCBub2RlcywgdGVzdG5hbWVzKSB7XG4gICAgdmFyIG1vZCA9ICdtb2Rlcm5penInO1xuICAgIHZhciBzdHlsZTtcbiAgICB2YXIgcmV0O1xuICAgIHZhciBub2RlO1xuICAgIHZhciBkb2NPdmVyZmxvdztcbiAgICB2YXIgZGl2ID0gY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdmFyIGJvZHkgPSBnZXRCb2R5KCk7XG4gICAgaWYgKHBhcnNlSW50KG5vZGVzLCAxMCkpIHtcbiAgICAgIC8vIEluIG9yZGVyIG5vdCB0byBnaXZlIGZhbHNlIHBvc2l0aXZlcyB3ZSBjcmVhdGUgYSBub2RlIGZvciBlYWNoIHRlc3RcbiAgICAgIC8vIFRoaXMgYWxzbyBhbGxvd3MgdGhlIG1ldGhvZCB0byBzY2FsZSBmb3IgdW5zcGVjaWZpZWQgdXNlc1xuICAgICAgd2hpbGUgKG5vZGVzLS0pIHtcbiAgICAgICAgbm9kZSA9IGNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBub2RlLmlkID0gdGVzdG5hbWVzID8gdGVzdG5hbWVzW25vZGVzXSA6IG1vZCArIChub2RlcyArIDEpO1xuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHN0eWxlID0gY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS50eXBlID0gJ3RleHQvY3NzJztcbiAgICBzdHlsZS5pZCA9ICdzJyArIG1vZDtcblxuICAgIC8vIElFNiB3aWxsIGZhbHNlIHBvc2l0aXZlIG9uIHNvbWUgdGVzdHMgZHVlI
1HRvIHRoZSBzdHlsZSBlbGVtZW50IGluc2lkZSB0aGUgdGVzdCBkaXYgc29tZWhvdyBpbnRlcmZlcmluZyBvZmZzZXRIZWlnaHQsIHNvIGluc2VydCBpdCBpbnRvIGJvZHkgb3IgZmFrZWJvZHkuXG4gICAgLy8gT3BlcmEgd2lsbCBhY3QgYWxsIHF1aXJreSB3aGVuIGluamVjdGluZyBlbGVtZW50cyBpbiBkb2N1bWVudEVsZW1lbnQgd2hlbiBwYWdlIGlzIHNlcnZlZCBhcyB4bWwsIG5lZWRzIGZha2Vib2R5IHRvby4gIzI3MFxuICAgICghYm9keS5mYWtlID8gZGl2IDogYm9keSkuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIGJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICBpZiAoc3R5bGUuc3R5bGVTaGVldCkge1xuICAgICAgc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gcnVsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocnVsZSkpO1xuICAgIH1cbiAgICBkaXYuaWQgPSBtb2Q7XG4gICAgaWYgKGJvZHkuZmFrZSkge1xuICAgICAgLy9hdm9pZCBjcmFzaGluZyBJRTgsIGlmIGJhY2tncm91bmQgaW1hZ2UgaXMgdXNlZFxuICAgICAgYm9keS5zdHlsZS5iYWNrZ3JvdW5kID0gJyc7XG4gICAgICAvL1NhZmFyaSA1LjEzLzUuMS40IE9TWCBzdG9wcyBsb2FkaW5nIGlmIDo6LXdlYmtpdC1zY3JvbGxiYXIgaXMgdXNlZCBhbmQgc2Nyb2xsYmFycyBhcmUgdmlzaWJsZVxuICAgICAgYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgZG9jT3ZlcmZsb3cgPSBkb2NFbGVtZW50LnN0eWxlLm92ZXJmbG93O1xuICAgICAgZG9jRWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgZG9jRWxlbWVudC5hcHBlbmRDaGlsZChib2R5KTtcbiAgICB9XG4gICAgcmV0ID0gY2FsbGJhY2soZGl2LCBydWxlKTtcbiAgICAvLyBJZiB0aGlzIGlzIGRvbmUgYWZ0ZXIgcGFnZSBsb2FkIHdlIGRvbid0IHdhbnQgdG8gcmVtb3ZlIHRoZSBib2R5IHNvIGNoZWNrIGlmIGJvZHkgZXhpc3RzXG4gICAgaWYgKGJvZHkuZmFrZSkge1xuICAgICAgYm9keS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJvZHkpO1xuICAgICAgZG9jRWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9IGRvY092ZXJmbG93O1xuICAgICAgLy8gVHJpZ2dlciBsYXlvdXQgc28ga2luZXRpYyBzY3JvbGxpbmcgaXNuJ3QgZGlzYWJsZWQgaW4gaU9TNitcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgZG9jRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRpdik7XG4gICAgfVxuICAgIHJldHVybiAhIXJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2Rlcm5penIubXEgdGVzdHMgYSBnaXZlbiBtZWRpYSBxdWVyeSwgbGl2ZSBhZ2FpbnN0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB3aW5kb3dcbiAgICogYWRhcHRlZCBmcm9tIG1hdGNoTWVkaWEgcG9seWZpbGwgYnkgU2NvdHQgSmVobCBhbmQgUGF1bCBJcmlzaFxuICAgKiBnaXN0LmdpdGh1Yi5jb20vNzg2NzY4XG4gICAqXG4gICAqIEBtZW1iZXJvZiBNb2Rlcm5penJcbiAgICogQG5hbWUgTW9kZXJuaXpyLm1xXG4gICAqIEBvcHRpb25OYW1lIE1vZGVybml6ci5tcSgpXG4gICAqIEBvcHRpb25Qcm9wIG1xXG4gICAqIEBhY2Nlc3MgcHVibGljXG4gICAqIEBmdW5jdGlvbiBtcVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbXEgLSBTdHJpbmcgb2YgdGhlIG1lZGlhIHF1ZXJ5IHdlIHdhbnQgdG8gdGVzdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICogQGV4YW1wbGVcbiAgICogTW9kZXJuaXpyLm1xIGFsbG93cyBmb3IgeW91IHRvIHByb2dyYW1tYXRpY2FsbHkgY2hlY2sgaWYgdGhlIGN1cnJlbnQgYnJvd3NlclxuICAgKiB3aW5kb3cgc3RhdGUgbWF0Y2hlcyBhIG1lZGlhIHF1ZXJ5LlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAgdmFyIHF1ZXJ5ID0gTW9kZXJuaXpyLm1xKCcobWluLXdpZHRoOiA5MDBweCknKTtcbiAgICpcbiAgICogIGlmIChxdWVyeSkge1xuICAgKiAgICAvLyB0aGUgYnJvd3NlciB3aW5kb3cgaXMgbGFyZ2VyIHRoYW4gOTAwcHhcbiAgICogIH1cbiAgICogYGBgXG4gICAqXG4gICAqIE9ubHkgdmFsaWQgbWVkaWEgcXVlcmllcyBhcmUgc3VwcG9ydGVkLCB0aGVyZWZvcmUgeW91IG11c3QgYWx3YXlzIGluY2x1ZGUgdmFsdWVzXG4gICAqIHdpdGggeW91ciBtZWRpYSBxdWVyeVxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAvLyBnb29kXG4gICAqICBNb2Rlcm5penIubXEoJyhtaW4td2lkdGg6IDkwMHB4KScpO1xuICAgKlxuICAgKiAvLyBiYWRcbiAgICogIE1vZGVybml6ci5tcSgnbWluLXdpZHRoJyk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBJZiB5b3Ugd291bGQganVzdCBsaWtlIHRvIHRlc3QgdGhhdCBtZWRpYSBxdWVyaWVzIGFyZSBzdXBwb3J0ZWQgaW4gZ2VuZXJhbCwgdXNlXG4gICAqXG4gICAqIGBgYGpzXG4gICAqICBNb2Rlcm5penIubXEoJ29ubHkgYWxsJyk7IC8vIHRydWUgaWYgTVEgYXJlIHN1cHBvcnRlZCwgZmFsc2UgaWYgbm90XG4gICAqIGBgYFxuICAgKlxuICAgKlxuICAgKiBOb3RlIHRoYXQgaWYgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBtZWRpYSBxdWVyaWVzIChlLmcuIG9sZCBJRSkgbXEgd2lsbFxuICAgKiBhbHdheXMgcmV0dXJuIGZhbHNlLlxuICAgKi9cblxuICB2YXIgbXEgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1hdGNoTWVkaWEgPSB3aW5kb3cubWF0Y2hNZWRpYSB8fCB3aW5kb3cubXNNYXRjaE1lZGlhO1xuICAgIGlmIChtYXRjaE1lZGlhKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKG1xKSB7XG4gICAgICAgIHZhciBtcWwgPSBtYXRjaE1lZGlhKG1xKTtcbiAgICAgICAgcmV0dXJuIG1xbCAmJiBtcWwubWF0Y2hlcyB8fCBmYWxzZTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAobXEpIHtcbiAgICAgIHZhciBib29sID0gZmFsc2U7XG4gICAgICBpbmplY3RFbGVtZW50V2l0aFN0eWxlcygnQG1lZGlhICcgKyBtcSArICcgeyAjbW9kZXJuaXpyIHsgcG9zaXRpb246IGFic29sdXRlOyB9IH0nLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBib29sID0gJ2Fic29sdXRlJyA9PSAod2luZG93LmdldENvbXB1dGVkU3R5bGUgPyB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKSA6IG5vZGUuY3VycmVudFN0eWxlKS5wb3NpdGlvbjtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJvb2w7XG4gICAgfTtcbiAgfSgpO1xuICBNb2Rlcm5penJQcm90by5tcSA9IG1xO1xuICB2YXIgY3Nzb21QcmVmaXhlcyA9IE1vZGVybml6clByb3RvLl9jb25maWcudXNlUHJlZml4ZXMgPyBvbVByZWZpeGVzLnNwbGl0KCcgJykgOiBbXTtcbiAgTW9kZXJuaXpyUHJvdG8uX2Nzc29tUHJlZml4ZXMgPSBjc3NvbVByZWZpeGVzO1xuXG4gIC8qKlxuICAgKiBjb250YWlucyBjaGVja3MgdG8gc2VlIGlmIGEgc3RyaW5nIGNvbnRhaW5zIGFub3RoZXIgc3RyaW5nXG4gICAqXG4gICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgKiBAZnVuY3Rpb24gY29udGFpbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBzdHJpbmcgd2Ugd2FudCB0byBjaGVjayBmb3Igc3Vic3RyaW5nc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc3Vic3RyIC0gVGhlIHN1YnN0cmluZyB3ZSB3YW50IHRvIHNlYXJjaCB0aGUgZmlyc3Qgc3RyaW5nIGZvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG5cbiAgZnVuY3Rpb24gY29udGFpbnMoc3RyLCBzdWJzdHIpIHtcbiAgICByZXR1cm4gISF+KCcnICsgc3RyKS5pbmRleE9mKHN1YnN0cik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG91ciBcIm1vZGVybml6clwiIGVsZW1lbnQgdGhhdCB3ZSBkbyBtb3N0IGZlYXR1cmUgdGVzdHMgb24uXG4gICAqXG4gICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgKi9cblxuICB2Y
1XIgbW9kRWxlbSA9IHtcbiAgICBlbGVtOiBjcmVhdGVFbGVtZW50KCdtb2Rlcm5penInKVxuICB9O1xuXG4gIC8vIENsZWFuIHVwIHRoaXMgZWxlbWVudFxuICBNb2Rlcm5penIuX3EucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgZGVsZXRlIG1vZEVsZW0uZWxlbTtcbiAgfSk7XG4gIHZhciBtU3R5bGUgPSB7XG4gICAgc3R5bGU6IG1vZEVsZW0uZWxlbS5zdHlsZVxuICB9O1xuXG4gIC8vIGtpbGwgcmVmIGZvciBnYywgbXVzdCBoYXBwZW4gYmVmb3JlIG1vZC5lbGVtIGlzIHJlbW92ZWQsIHNvIHdlIHVuc2hpZnQgb24gdG9cbiAgLy8gdGhlIGZyb250IG9mIHRoZSBxdWV1ZS5cbiAgTW9kZXJuaXpyLl9xLnVuc2hpZnQoZnVuY3Rpb24gKCkge1xuICAgIGRlbGV0ZSBtU3R5bGUuc3R5bGU7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBkb21Ub0NTUyB0YWtlcyBhIGNhbWVsQ2FzZSBzdHJpbmcgYW5kIGNvbnZlcnRzIGl0IHRvIGtlYmFiLWNhc2VcbiAgICogZS5nLiBib3hTaXppbmcgLT4gYm94LXNpemluZ1xuICAgKlxuICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICogQGZ1bmN0aW9uIGRvbVRvQ1NTXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gU3RyaW5nIG5hbWUgb2YgY2FtZWxDYXNlIHByb3Agd2Ugd2FudCB0byBjb252ZXJ0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBrZWJhYi1jYXNlIHZlcnNpb24gb2YgdGhlIHN1cHBsaWVkIG5hbWVcbiAgICovXG5cbiAgZnVuY3Rpb24gZG9tVG9DU1MobmFtZSkge1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoLyhbQS1aXSkvZywgZnVuY3Rpb24gKHN0ciwgbTEpIHtcbiAgICAgIHJldHVybiAnLScgKyBtMS50b0xvd2VyQ2FzZSgpO1xuICAgIH0pLnJlcGxhY2UoL15tcy0vLCAnLW1zLScpO1xuICB9XG4gIC8qKlxuICAgKiB3cmFwcGVyIGFyb3VuZCBnZXRDb21wdXRlZFN0eWxlLCB0byBmaXggaXNzdWVzIHdpdGggRmlyZWZveCByZXR1cm5pbmcgbnVsbCB3aGVuXG4gICAqIGNhbGxlZCBpbnNpZGUgb2YgYSBoaWRkZW4gaWZyYW1lXG4gICAqXG4gICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgKiBAZnVuY3Rpb24gY29tcHV0ZWRTdHlsZVxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fFNWR0VsZW1lbnR9IC0gVGhlIGVsZW1lbnQgd2Ugd2FudCB0byBmaW5kIHRoZSBjb21wdXRlZCBzdHlsZXMgb2ZcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gW3BzZXVkb1NlbGVjdG9yXS0gQW4gb3B0aW9uYWwgcHNldWRvIGVsZW1lbnQgc2VsZWN0b3IgKGUuZy4gOmJlZm9yZSksIG9mIG51bGwgaWYgbm9uZVxuICAgKiBAcmV0dXJucyB7Q1NTU3R5bGVEZWNsYXJhdGlvbn1cbiAgICovXG5cbiAgZnVuY3Rpb24gY29tcHV0ZWRTdHlsZShlbGVtLCBwc2V1ZG8sIHByb3ApIHtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmICgnZ2V0Q29tcHV0ZWRTdHlsZScgaW4gd2luZG93KSB7XG4gICAgICByZXN1bHQgPSBnZXRDb21wdXRlZFN0eWxlLmNhbGwod2luZG93LCBlbGVtLCBwc2V1ZG8pO1xuICAgICAgdmFyIGNvbnNvbGUgPSB3aW5kb3cuY29uc29sZTtcbiAgICAgIGlmIChudWxsICE9PSByZXN1bHQpIHtcbiAgICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuZ2V0UHJvcGVydHlWYWx1ZShwcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgICB2Y
1XIgbWV0aG9kID0gY29uc29sZS5lcnJvciA/ICdlcnJvcicgOiAnbG9nJztcbiAgICAgICAgICBjb25zb2xlW21ldGhvZF0uY2FsbChjb25zb2xlLCAnZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5pbmcgbnVsbCwgaXRzIHBvc3NpYmxlIG1vZGVybml6ciB0ZXN0IHJlc3VsdHMgYXJlIGluYWNjdXJhdGUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSAhcHNldWRvICYmIGVsZW0uY3VycmVudFN0eWxlICYmIGVsZW0uY3VycmVudFN0eWxlW3Byb3BdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIG5hdGl2ZVRlc3RQcm9wcyBhbGxvd3MgZm9yIHVzIHRvIHVzZSBuYXRpdmUgZmVhdHVyZSBkZXRlY3Rpb24gZnVuY3Rpb25hbGl0eSBpZiBhdmFpbGFibGUuXG4gICAqIHNvbWUgcHJlZml4ZWQgZm9ybSwgb3IgZmFsc2UsIGluIHRoZSBjYXNlIG9mIGFuIHVuc3VwcG9ydGVkIHJ1bGVcbiAgICpcbiAgICogQGFjY2VzcyBwcml2YXRlXG4gICAqIEBmdW5jdGlvbiBuYXRpdmVUZXN0UHJvcHNcbiAgICogQHBhcmFtIHthcnJheX0gcHJvcHMgLSBBbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIHdlIHdhbnQgdG8gY2hlY2sgdmlhIEBzdXBwb3J0c1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbnx1bmRlZmluZWR9IEEgYm9vbGVhbiB3aGVuIEBzdXBwb3J0cyBleGlzdHMsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICovXG5cbiAgLy8gQWNjZXB0cyBhIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMgYW5kIGEgc2luZ2xlIHZhbHVlXG4gIC8vIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgbmF0aXZlIGRldGVjdGlvbiBub3QgYXZhaWxhYmxlXG4gIGZ1bmN0aW9uIG5hdGl2ZVRlc3RQcm9wcyhwcm9wcywgdmFsdWUpIHtcbiAgICB2YXIgaSA9IHByb3BzLmxlbmd0aDtcbiAgICAvLyBTdGFydCB3aXRoIHRoZSBKUyBBUEk6IGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29uZGl0aW9uYWwvI3RoZS1jc3MtaW50ZXJmYWNlXG4gICAgaWYgKCdDU1MnIGluIHdpbmRvdyAmJiAnc3VwcG9ydHMnIGluIHdpbmRvdy5DU1MpIHtcbiAgICAgIC8vIFRyeSBldmVyeSBwcmVmaXhlZCB2YXJpYW50IG9mIHRoZSBwcm9wZXJ0eVxuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBpZiAod2luZG93LkNTUy5zdXBwb3J0cyhkb21Ub0NTUyhwcm9wc1tpXSksIHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIE90aGVyd2lzZSBmYWxsIGJhY2sgdG8gYXQtcnVsZSAoZm9yIE9wZXJhIDEyLngpXG4gICAgZWxzZSBpZiAoJ0NTU1N1cHBvcnRzUnVsZScgaW4gd2luZG93KSB7XG4gICAgICAvLyBCdWlsZCBhIGNvbmRpdGlvbiBzdHJpbmcgZm9yIGV2ZXJ5IHByZWZpeGVkIHZhcmlhbnRcbiAgICAgIHZhciBjb25kaXRpb25UZXh0ID0gW107XG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGNvbmRpdGlvblRleHQucHVzaCgnKCcgKyBkb21Ub0NTUyhwcm9wc1tpXSkgKyAnOicgKyB2YWx1ZSArICcpJyk7XG4gICAgICB9XG4gICAgICBjb25kaXRpb25UZXh0ID0gY29uZGl0aW9uVGV4dC5qb2luKCcgb3IgJyk7XG4gICAgICByZXR1cm4gaW5qZWN0RWxlbWVudFdpdGhTdHlsZXMoJ0BzdXBwb3J0cyAoJyArIGNvbmRpdGlvblRleHQgKyAnKSB7ICNtb2Rlcm5penIgeyBwb3NpdGlvbjogYWJzb2x1dGU7IH0gfScsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiAnYWJzb2x1dGUnID09IGNvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCwgJ3Bvc2l0aW9uJyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKipcbiAgICogY3NzVG9ET00gdGFrZXMgYSBrZWJhYi1jYXNlIHN0cmluZyBhbmQgY29udmVydHMgaXQgdG8gY2FtZWxDYXNlXG4gICAqIGUuZy4gYm94LXNpemluZyAtPiBib3hTaXppbmdcbiAgICpcbiAgICogQGFjY2VzcyBwcml2YXRlXG4gICAqIEBmdW5jdGlvbiBjc3NUb0RPTVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFN0cmluZyBuYW1lIG9mIGtlYmFiLWNhc2UgcHJvcCB3ZSB3YW50IHRvIGNvbnZlcnRcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNhbWVsQ2FzZSB2ZXJzaW9uIG9mIHRoZSBzdXBwbGllZCBuYW1lXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGNzc1RvRE9NKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC8oW2Etel0pLShbYS16XSkvZywgZnVuY3Rpb24gKHN0ciwgbTEsIG0yKSB7XG4gICAgICByZXR1cm4gbTEgKyBtMi50b1VwcGVyQ2FzZSgpO1xuICAgIH0pLnJlcGxhY2UoL14tLywgJycpO1xuICB9XG4gIC8vIHRlc3RQcm9wcyBpcyBhIGdlbmVyaWMgQ1NTIC8gRE9NIHByb3BlcnR5IHRlc3QuXG5cbiAgLy8gSW4gdGVzdGluZyBzdXBwb3J0IGZvciBhIGdpdmVuIENTUyBwcm9wZXJ0eSwgaXQncyBsZWdpdCB0byB0ZXN0OlxuICAvLyAgICBgZWxlbS5zdHlsZVtzdHlsZU5hbWVdICE9PSB1bmRlZmluZWRgXG4gIC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgaXQgd2lsbCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLFxuICAvLyBpZiB1bnN1cHBvcnRlZCBpdCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG5cbiAgLy8gV2UnbGwgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcyBxdWljayB0ZXN0IGFuZCBza2lwIHNldHRpbmcgYSBzdHlsZVxuICAvLyBvbiBvdXIgbW9kZXJuaXpyIGVsZW1lbnQsIGJ1dCBpbnN0ZWFkIGp1c3QgdGVzdGluZyB1bmRlZmluZWQgdnNcbiAgLy8gZW1wdHkgc3RyaW5nLlxuXG4gIC8vIFByb3BlcnR5IG5hbWVzIGNhbiBiZSBwcm92aWRlZCBpbiBlaXRoZXIgY2FtZWxDYXNlIG9yIGtlYmFiLWNhc2UuXG5cbiAgZnVuY3Rpb24gdGVzdFByb3BzKHByb3BzLCBwcmVmaXhlZCwgdmFsdWUsIHNraXBWYWx1ZVRlc3QpIHtcbiAgICBza2lwVmFsdWVUZXN0ID0gaXMoc2tpcFZhbHVlVGVzdCwgJ3VuZGVmaW5lZCcpID8gZmFsc2UgOiBza2lwVmFsdWVUZXN0O1xuXG4gICAgLy8gVHJ5IG5hdGl2ZSBkZXRlY3QgZmlyc3RcbiAgICBpZiAoIWlzKHZhbHVlLCAndW5kZWZpbmVkJykpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuYXRpdmVUZXN0UHJvcHMocHJvcHMsIHZhbHVlKTtcbiAgICAgIGlmICghaXMocmVzdWx0LCAndW5kZWZpbmVkJykpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgZG8gaXQgcHJvcGVybHlcbiAgICB2YXIgYWZ0ZXJJbml0LCBpLCBwcm9wc0xlbmd0aCwgcHJvcCwgYmVmb3JlO1xuXG4gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHN0eWxlIGVsZW1lbnQsIHRoYXQgbWVhbnMgd2UncmUgcnVubmluZyBhc3luYyBvciBhZnRlclxuICAgIC8vIHRoZSBjb3JlIHRlc3RzLCBzbyB3ZSdsbCBuZWVkIHRvIGNyZWF0ZSBvdXIgb3duIGVsZW1lbnRzIHRvIHVzZVxuXG4gICAgLy8gaW5zaWRlIG9mIGFuIFNWRyBlbGVtZW50LCBpbiBjZXJ0YWluIGJyb3dzZXJzLCB0aGUgYHN0eWxlY
1CBlbGVtZW50IGlzIG9ubHlcbiAgICAvLyBkZWZpbmVkIGZvciB2YWxpZCB0YWdzLiBUaGVyZWZvcmUsIGlmIGBtb2Rlcm5penJgIGRvZXMgbm90IGhhdmUgb25lLCB3ZVxuICAgIC8vIGZhbGwgYmFjayB0byBhIGxlc3MgdXNlZCBlbGVtZW50IGFuZCBob3BlIGZvciB0aGUgYmVzdC5cbiAgICAvLyBmb3Igc3RyaWN0IFhIVE1MIGJyb3dzZXJzIHRoZSBoYXJkbHkgdXNlZCBzYW1wIGVsZW1lbnQgaXMgdXNlZFxuICAgIHZhciBlbGVtcyA9IFsnbW9kZXJuaXpyJywgJ3RzcGFuJywgJ3NhbXAnXTtcbiAgICB3aGlsZSAoIW1TdHlsZS5zdHlsZSAmJiBlbGVtcy5sZW5ndGgpIHtcbiAgICAgIGFmdGVySW5pdCA9IHRydWU7XG4gICAgICBtU3R5bGUubW9kRWxlbSA9IGNyZWF0ZUVsZW1lbnQoZWxlbXMuc2hpZnQoKSk7XG4gICAgICBtU3R5bGUuc3R5bGUgPSBtU3R5bGUubW9kRWxlbS5zdHlsZTtcbiAgICB9XG5cbiAgICAvLyBEZWxldGUgdGhlIG9iamVjdHMgaWYgd2UgY3JlYXRlZCB0aGVtLlxuICAgIGZ1bmN0aW9uIGNsZWFuRWxlbXMoKSB7XG4gICAgICBpZiAoYWZ0ZXJJbml0KSB7XG4gICAgICAgIGRlbGV0ZSBtU3R5bGUuc3R5bGU7XG4gICAgICAgIGRlbGV0ZSBtU3R5bGUubW9kRWxlbTtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvcHNMZW5ndGggPSBwcm9wcy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IHByb3BzTGVuZ3RoOyBpKyspIHtcbiAgICAgIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgIGJlZm9yZSA9IG1TdHlsZS5zdHlsZVtwcm9wXTtcbiAgICAgIGlmIChjb250YWlucyhwcm9wLCAnLScpKSB7XG4gICAgICAgIHByb3AgPSBjc3NUb0RPTShwcm9wKTtcbiAgICAgIH1cbiAgICAgIGlmIChtU3R5bGUuc3R5bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBJZiB2YWx1ZSB0byB0ZXN0IGhhcyBiZWVuIHBhc3NlZCBpbiwgZG8gYSBzZXQtYW5kLWNoZWNrIHRlc3QuXG4gICAgICAgIC8vIDAgKGludGVnZXIpIGlzIGEgdmFsaWQgcHJvcGVydHkgdmFsdWUsIHNvIGNoZWNrIHRoYXQgYHZhbHVlYCBpc24ndFxuICAgICAgICAvLyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGp1c3QgY2hlY2tpbmcgaXQncyB0cnV0aHkuXG4gICAgICAgIGlmICghc2tpcFZhbHVlVGVzdCAmJiAhaXModmFsdWUsICd1bmRlZmluZWQnKSkge1xuICAgICAgICAgIC8vIE5lZWRzIGEgdHJ5IGNhdGNoIGJsb2NrIGJlY2F1c2Ugb2Ygb2xkIElFLiBUaGlzIGlzIHNsb3csIGJ1dCB3aWxsXG4gICAgICAgICAgLy8gYmUgYXZvaWRlZCBpbiBtb3N0IGNhc2VzIGJlY2F1c2UgYHNraXBWYWx1ZVRlc3RgIHdpbGwgYmUgdXNlZC5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbVN0eWxlLnN0eWxlW3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBoYXMgY2hhbmdlZCwgd2UgYXNzdW1lIHRoZSB2YWx1ZSB1c2VkIGlzXG4gICAgICAgICAgLy8gc3VwcG9ydGVkLiBJZiBgdmFsdWVgIGlzIGVtcHR5IHN0cmluZywgaXQnbGwgZmFpbCBoZXJlIChiZWNhdXNlXG4gICAgICAgICAgLy8gaXQgaGFzbid0IGNoYW5nZWQpLCB3aGljaCBtYXRjaGVzIGhvdyBicm93c2VycyBoYXZlIGltcGxlbWVudGVkXG4gICAgICAgICAgLy8gQ1NTLnN1cHBvcnRzKClcbiAgICAgICAgICBpZiAobVN0eWxlLnN0eWxlW3Byb3BdICE9IGJlZm9yZSkge1xuICAgICAgICAgICAgY2xlYW5FbGVtcygpO1xuICAgICAgICAgICAgcmV0dXJuICdwZngnID09IHByZWZpeGVkID8gcHJvcCA6IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSBqdXN0IHJldHVybiB0cnVlLCBvciB0aGUgcHJvcGVydHkgbmFtZSBpZiB0aGlzIGlzIGFcbiAgICAgICAgLy8gYHByZWZpeGVkKClgIGNhbGxcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY2xlYW5FbGVtcygpO1xuICAgICAgICAgIHJldHVybiAncGZ4JyA9PSBwcmVmaXhlZCA/IHByb3AgOiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNsZWFuRWxlbXMoKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogZm5CaW5kIGlzIGEgc3VwZXIgc21hbGwgW2JpbmRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Z1bmN0aW9uL2JpbmQpIHBvbHlmaWxsLlxuICAgKlxuICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICogQGZ1bmN0aW9uIGZuQmluZFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmbiAtIGEgZnVuY3Rpb24geW91IHdhbnQgdG8gY2hhbmdlIGB0aGlzYCByZWZlcmVuY2UgdG9cbiAgICogQHBhcmFtIHtvYmplY3R9IHRoYXQgLSB0aGUgYHRoaXNgIHlvdSB3YW50IHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGhcbiAgICogQHJldHVybnMge2Z1bmN0aW9ufSBUaGUgd3JhcHBlZCB2ZXJzaW9uIG9mIHRoZSBzdXBwbGllZCBmdW5jdGlvblxuICAgKi9cblxuICBmdW5jdGlvbiBmbkJpbmQoZm4sIHRoYXQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0ZXN0RE9NUHJvcHMgaXMgYSBnZW5lcmljIERPTSBwcm9wZXJ0eSB0ZXN0OyBpZiBhIGJyb3dzZXIgc3VwcG9ydHNcbiAgICogICBhIGNlcnRhaW4gcHJvcGVydHksIGl0IHdvbid0IHJldHVybiB1bmRlZmluZWQgZm9yIGl0LlxuICAgKlxuICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICogQGZ1bmN0aW9uIHRlc3RET01Qcm9wc1xuICAgKiBAcGFyYW0ge2FycmF5LjxzdHJpbmc+fSBwcm9wcyAtIEFuIGFycmF5IG9mIHByb3BlcnRpZXMgdG8gdGVzdCBmb3JcbiAgICogQHBhcmFtIHtvYmplY3R9IG9iaiAtIEFuIG9iamVjdCBvciBFbGVtZW50IHlvdSB3YW50IHRvIHVzZSB0byB0ZXN0IHRoZSBwYXJhbWV0ZXJzIGFnYWluXG4gICAqIEBwYXJhbSB7Ym9vbGVhbnxvYmplY3R9IGVsZW0gLSBBbiBFbGVtZW50IHRvIGJpbmQgdGhlIHByb3BlcnR5IGxvb2t1cCBhZ2Fpbi4gVXNlIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgY2hlY2tcbiAgICogQHJldHVybnMge2ZhbHNlfCp9I
1HJldHVybnMgZmFsc2UgaWYgdGhlIHByb3AgaXMgdW5zdXBwb3J0ZWQsIG90aGVyd2lzZSB0aGUgdmFsdWUgdGhhdCBpcyBzdXBwb3J0ZWRcbiAgICovXG4gIGZ1bmN0aW9uIHRlc3RET01Qcm9wcyhwcm9wcywgb2JqLCBlbGVtKSB7XG4gICAgdmFyIGl0ZW07XG4gICAgZm9yICh2YXIgaSBpbiBwcm9wcykge1xuICAgICAgaWYgKHByb3BzW2ldIGluIG9iaikge1xuICAgICAgICAvLyByZXR1cm4gdGhlIHByb3BlcnR5IG5hbWUgYXMgYSBzdHJpbmdcbiAgICAgICAgaWYgKGZhbHNlID09PSBlbGVtKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BzW2ldO1xuICAgICAgICB9XG4gICAgICAgIGl0ZW0gPSBvYmpbcHJvcHNbaV1dO1xuXG4gICAgICAgIC8vIGxldCdzIGJpbmQgYSBmdW5jdGlvblxuICAgICAgICBpZiAoaXMoaXRlbSwgJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICAvLyBiaW5kIHRvIG9iaiB1bmxlc3Mgb3ZlcnJpZGVuXG4gICAgICAgICAgcmV0dXJuIGZuQmluZChpdGVtLCBlbGVtIHx8IG9iaik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXR1cm4gdGhlIHVuYm91bmQgZnVuY3Rpb24gb3Igb2JqIG9yIHZhbHVlXG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogdGVzdFByb3BzQWxsIHRlc3RzIGEgbGlzdCBvZiBET00gcHJvcGVydGllcyB3ZSB3YW50IHRvIGNoZWNrIGFnYWluc3QuXG4gICAqIFdlIHNwZWNpZnkgbGl0ZXJhbGx5IEFMTCBwb3NzaWJsZSAoa25vd24gYW5kL29yIGxpa2VseSkgcHJvcGVydGllcyBvblxuICAgKiB0aGUgZWxlbWVudCBpbmNsdWRpbmcgdGhlIG5vbi12ZW5kb3IgcHJlZml4ZWQgb25lLCBmb3IgZm9yd2FyZC1cbiAgICogY29tcGF0aWJpbGl0eS5cbiAgICpcbiAgICogQGFjY2VzcyBwcml2YXRlXG4gICAqIEBmdW5jdGlvbiB0ZXN0UHJvcHNBbGxcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgLSBBIHN0cmluZyBvZiB0aGUgcHJvcGVydHkgdG8gdGVzdCBmb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBbcHJlZml4ZWRdIC0gQW4gb2JqZWN0IHRvIGNoZWNrIHRoZSBwcmVmaXhlZCBwcm9wZXJ0aWVzIG9uLiBVc2UgYSBzdHJpbmcgdG8gc2tpcFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fFNWR0VsZW1lbnR9IFtlbGVtXSAtIEFuIGVsZW1lbnQgdXNlZCB0byB0ZXN0IHRoZSBwcm9wZXJ0eSBhbmQgdmFsdWUgYWdhaW5zdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIEEgc3RyaW5nIG9mIGEgY3NzIHZhbHVlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NraXBWYWx1ZVRlc3RdIC0gQW4gYm9vbGVhbiByZXByZXNlbnRpbmcgaWYgeW91IHdhbnQgdG8gdGVzdCBpZiB2YWx1ZSBzdGlja3Mgd2hlbiBzZXRcbiAgICogQHJldHVybnMge2ZhbHNlfHN0cmluZ30gcmV0dXJucyB0aGUgc3RyaW5nIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5LCBvciBmYWxzZSBpZiBpdCBpcyB1bnN1cHBvcnRlZFxuICAgKi9cbiAgZnVuY3Rpb24gdGVzdFByb3BzQWxsKHByb3AsIHByZWZpeGVkLCBlbGVtLCB2YWx1ZSwgc2tpcFZhbHVlVGVzdCkge1xuICAgIHZhciB1Y1Byb3AgPSBwcm9wLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcC5zbGljZSgxKSxcbiAgICAgIHByb3BzID0gKHByb3AgKyAnICcgKyBjc3NvbVByZWZpeGVzLmpvaW4odWNQcm9wICsgJyAnKSArIHVjUHJvcCkuc3BsaXQoJyAnKTtcblxuICAgIC8vIGRpZCB0aGV5IGNhbGwgLnByZWZpeGVkKCdib3hTaXppbmcnKSBvciBhcmUgd2UganVzdCB0ZXN0aW5nIGEgcHJvcD9cbiAgICBpZiAoaXMocHJlZml4ZWQsICdzdHJpbmcnKSB8fCBpcyhwcmVmaXhlZCwgJ3VuZGVmaW5lZCcpKSB7XG4gICAgICByZXR1cm4gdGVzdFByb3BzKHByb3BzLCBwcmVmaXhlZCwgdmFsdWUsIHNraXBWYWx1ZVRlc3QpO1xuXG4gICAgICAvLyBvdGhlcndpc2UsIHRoZXkgY2FsbGVkIC5wcmVmaXhlZCgncmVxdWVzdEFuaW1hdGlvbkZyYW1lJywgd2luZG93WywgZWxlbV0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3BzID0gKHByb3AgKyAnICcgKyBkb21QcmVmaXhlcy5qb2luKHVjUHJvcCArICcgJykgKyB1Y1Byb3ApLnNwbGl0KCcgJyk7XG4gICAgICByZXR1cm4gdGVzdERPTVByb3BzKHByb3BzLCBwcmVmaXhlZCwgZWxlbSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTW9kZXJuaXpyLnRlc3RBbGxQcm9wcygpIGludmVzdGlnYXRlcyB3aGV0aGVyIGEgZ2l2ZW4gc3R5bGUgcHJvcGVydHksXG4gIC8vIG9yIGFueSBvZiBpdHMgdmVuZG9yLXByZWZpeGVkIHZhcmlhbnRzLCBpcyByZWNvZ25pemVkXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB0aGUgcHJvcGVydHkgbmFtZXMgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgY2FtZWxDYXNlIHZhcmlhbnQuXG4gIC8vIE1vZGVybml6ci50ZXN0QWxsUHJvcHMoJ2JveFNpemluZycpXG4gIE1vZGVybml6clByb3RvLnRlc3RBbGxQcm9wcyA9IHRlc3RQcm9wc0FsbDtcblxuICAvKipcbiAgICogYXRSdWxlIHJldHVybnMgYSBnaXZlbiBDU1MgcHJvcGVydHkgYXQtcnVsZSAoZWcgQGtleWZyYW1lcyksIHBvc3NpYmx5IGluXG4gICAqIHNvbWUgcHJlZml4ZWQgZm9ybSwgb3IgZmFsc2UsIGluIHRoZSBjYXNlIG9mIGFuIHVuc3VwcG9ydGVkIHJ1bGVcbiAgICpcbiAgICogQG1lbWJlcm9mIE1vZGVybml6clxuICAgKiBAbmFtZSBNb2Rlcm5penIuYXRSdWxlXG4gICAqIEBvcHRpb25OYW1lIE1vZGVybml6ci5hdFJ1bGUoKVxuICAgKiBAb3B0aW9uUHJvcCBhdFJ1bGVcbiAgICogQGFjY2VzcyBwdWJsaWNcbiAgICogQGZ1bmN0aW9uIGF0UnVsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCAtIFN0cmluZyBuYW1lIG9mIHRoZSBALXJ1bGUgdG8gdGVzdCBmb3JcbiAgICogQHJldHVybnMge3N0cmluZ3xib29sZWFufSBUaGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgKHBvc3NpYmx5IHByZWZpeGVkKVxuICAgKiB2YWxpZCB2ZXJzaW9uIG9mIHRoZSBALXJ1bGUsIG9yIGBmYWxzZWAgd2hlbiBpdCBpcyB1bnN1cHBvcnRlZC5cbiAgICogQGV4YW1wbGVcbiAgICogYGBganNcbiAgICogIHZhciBrZXlmcmFtZXMgPSBNb2Rlcm5penIuYXRSdWxlKCdAa2V5ZnJhbWVzJyk7XG4gICAqXG4gICAqICBpZiAoa2V5ZnJhbWVzKSB7XG4gICAqICAgIC8vIGtleWZyYW1lcyBhcmUgc3VwcG9ydGVkXG4gICAqICAgIC8vIGNvdWxkIGJlIGBALXdlYmtpdC1rZXlmcmFtZXNgIG9yIGBAa2V5ZnJhbWVzYFxuICAgKiAgfSBlbHNlIHtcbiAgICogICAgLy8ga2V5ZnJhbWVzID09PSBgZmFsc2VgXG4gICAqICB9XG4gICAqIGBgYFxuICAgKlxuICAgKi9cblxuICB2Y
1XIgYXRSdWxlID0gZnVuY3Rpb24gYXRSdWxlKHByb3ApIHtcbiAgICB2YXIgbGVuZ3RoID0gcHJlZml4ZXMubGVuZ3RoO1xuICAgIHZhciBjc3NydWxlID0gd2luZG93LkNTU1J1bGU7XG4gICAgdmFyIHJ1bGU7XG4gICAgaWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgY3NzcnVsZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCFwcm9wKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGxpdGVyYWwgQCBmcm9tIGJlZ2lubmluZyBvZiBwcm92aWRlZCBwcm9wZXJ0eVxuICAgIHByb3AgPSBwcm9wLnJlcGxhY2UoL15ALywgJycpO1xuXG4gICAgLy8gQ1NTUnVsZXMgdXNlIHVuZGVyc2NvcmVzIGluc3RlYWQgb2YgZGFzaGVzXG4gICAgcnVsZSA9IHByb3AucmVwbGFjZSgvLS9nLCAnXycpLnRvVXBwZXJDYXNlKCkgKyAnX1JVTEUnO1xuICAgIGlmIChydWxlIGluIGNzc3J1bGUpIHtcbiAgICAgIHJldHVybiAnQCcgKyBwcm9wO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBwcmVmaXhlcyBnaXZlcyB1cyBzb21ldGhpbmcgbGlrZSAtby0sIGFuZCB3ZSB3YW50IE9fXG4gICAgICB2YXIgcHJlZml4ID0gcHJlZml4ZXNbaV07XG4gICAgICB2YXIgdGhpc1J1bGUgPSBwcmVmaXgudG9VcHBlckNhc2UoKSArICdfJyArIHJ1bGU7XG4gICAgICBpZiAodGhpc1J1bGUgaW4gY3NzcnVsZSkge1xuICAgICAgICByZXR1cm4gJ0AtJyArIHByZWZpeC50b0xvd2VyQ2FzZSgpICsgJy0nICsgcHJvcDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICBNb2Rlcm5penJQcm90by5hdFJ1bGUgPSBhdFJ1bGU7XG5cbiAgLyoqXG4gICAqIHByZWZpeGVkIHJldHVybnMgdGhlIHByZWZpeGVkIG9yIG5vbnByZWZpeGVkIHByb3BlcnR5IG5hbWUgdmFyaWFudCBvZiB5b3VyIGlucHV0XG4gICAqXG4gICAqIEBtZW1iZXJvZiBNb2Rlcm5penJcbiAgICogQG5hbWUgTW9kZXJuaXpyLnByZWZpeGVkXG4gICAqIEBvcHRpb25OYW1lIE1vZGVybml6ci5wcmVmaXhlZCgpXG4gICAqIEBvcHRpb25Qcm9wIHByZWZpeGVkXG4gICAqIEBhY2Nlc3MgcHVibGljXG4gICAqIEBmdW5jdGlvbiBwcmVmaXhlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCAtIFN0cmluZyBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB0ZXN0IGZvclxuICAgKiBAcGFyYW0ge29iamVjdH0gW29ial0gLSBBbiBvYmplY3QgdG8gdGVzdCBmb3IgdGhlIHByZWZpeGVkIHByb3BlcnRpZXMgb25cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW2VsZW1dIC0gQW4gZWxlbWVudCB1c2VkIHRvIHRlc3Qgc3BlY2lmaWMgcHJvcGVydGllcyBhZ2FpbnN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd8ZmFsc2V9IFRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSAocG9zc2libHkgcHJlZml4ZWQpIHZhbGlkXG4gICAqIHZlcnNpb24gb2YgdGhlIHByb3BlcnR5LCBvciBgZmFsc2VgIHdoZW4gaXQgaXMgdW5zdXBwb3J0ZWQuXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIE1vZGVybml6ci5wcmVmaXhlZCB0YWtlcyBhIHN0cmluZyBjc3MgdmFsdWUgaW4gdGhlIERPTSBzdHlsZSBjYW1lbENhc2UgKGFzXG4gICAqIG9wcG9zZWQgdG8gdGhlIGNzcyBzdHlsZSBrZWJhYi1jYXNlKSBmb3JtIGFuZCByZXR1cm5zIHRoZSAocG9zc2libHkgcHJlZml4ZWQpXG4gICAqIHZlcnNpb24gb2YgdGhhdCBwcm9wZXJ0eSB0aGF0IHRoZSBicm93c2VyIGFjdHVhbGx5IHN1cHBvcnRzLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgaW4gb2xkZXIgRmlyZWZveC4uLlxuICAgKiBgYGBqc1xuICAgKiBwcmVmaXhlZCgnYm94U2l6aW5nJylcbiAgICogYGBgXG4gICAqIHJldHVybnMgJ01vekJveFNpemluZydcbiAgICpcbiAgICogSW4gbmV3ZXIgRmlyZWZveCwgYXMgd2VsbCBhcyBhbnkgb3RoZXIgYnJvd3NlciB0aGF0IHN1cHBvcnQgdGhlIHVucHJlZml4ZWRcbiAgICogdmVyc2lvbiB3b3VsZCBzaW1wbHkgcmV0dXJuIGBib3hTaXppbmdgLiBBbnkgYnJvd3NlciB0aGF0IGRvZXMgbm90IHN1cHBvcnRcbiAgICogdGhlIHByb3BlcnR5IGF0IGFsbCwgaXQgd2lsbCByZXR1cm4gYGZhbHNlYC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgcHJlZml4ZWQgaXMgY2hlY2tlZCBhZ2FpbnN0IGEgRE9NIGVsZW1lbnQuIElmIHlvdSB3YW50IHRvIGNoZWNrXG4gICAqIGZvciBhIHByb3BlcnR5IG9uIGFub3RoZXIgb2JqZWN0LCBqdXN0IHBhc3MgaXQgYXMgYSBzZWNvbmQgYXJndW1lbnRcbiAgICpcbiAgICogYGBganNcbiAgICogdmFyIHJBRiA9IHByZWZpeGVkKCdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnLCB3aW5kb3cpO1xuICAgKlxuICAgKiByYWYoZnVuY3Rpb24oKSB7XG4gICAqICByZW5kZXJGdW5jdGlvbigpO1xuICAgKiB9KVxuICAgKiBgYGBcbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgd2lsbCByZXR1cm4gX3RoZSBhY3R1YWwgZnVuY3Rpb25fIC0gbm90IHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi5cbiAgICogSWYgeW91IG5lZWQgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSBwcm9wZXJ0eSwgcGFzcyBpbiBgZmFsc2VgIGFzIGEgdGhpcmQgYXJndW1lbnRcbiAgICpcbiAgICogYGBganNcbiAgICogdmFyIHJBRlByb3AgPSBwcmVmaXhlZCgncmVxdWVzdEFuaW1hdGlvbkZyYW1lJywgd2luZG93LCBmYWxzZSk7XG4gICAqXG4gICAqIHJhZlByb3AgPT09ICdXZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnIC8vIGluIG9sZGVyIHdlYmtpdFxuICAgKiBgYGBcbiAgICpcbiAgICogT25lIGNvbW1vbiB1c2UgY2FzZSBmb3IgcHJlZml4ZWQgaXMgaWYgeW91J3JlIHRyeWluZyB0byBkZXRlcm1pbmUgd2hpY2ggdHJhbnNpdGlvblxuICAgKiBlbmQgZXZlbnQgdG8gYmluZCB0bywgeW91IG1pZ2h0IGRvIHNvbWV0aGluZyBsaWtlLi4uXG4gICAqIGBgYGpzXG4gICAqIHZhciB0cmFuc0VuZEV2ZW50TmFtZXMgPSB7XG4gICAqICAgICAnV2Via2l0VHJhbnNpdGlvbicgOiAnd2Via2l0VHJhbnNpdGlvbkVuZCcsICogU2FmIDYsIEFuZHJvaWQgQnJvd3NlclxuICAgKiAgICAgJ01velRyYW5zaXRpb24nICAgIDogJ3RyYW5zaXRpb25lbmQnLCAgICAgICAqIG9ubHkgZm9yIEZGIDwgMTVcbiAgICogICAgICd0cmFuc2l0aW9uJyAgICAgICA6ICd0cmFuc2l0aW9uZW5kJyAgICAgICAgKiBJRTEwLCBPcGVyYSwgQ2hyb21lLCBGRiAxNSssIFNhZiA3K1xuICAgKiB9O1xuICAgKlxuICAgKiB2YXIgdHJhbnNFbmRFdmVudE5hbWUgPSB0cmFuc0VuZEV2ZW50TmFtZXNbIE1vZGVybml6ci5wcmVmaXhlZCgndHJhbnNpdGlvbic
1pIF07XG4gICAqIGBgYFxuICAgKlxuICAgKiBJZiB5b3Ugd2FudCBhIHNpbWlsYXIgbG9va3VwLCBidXQgaW4ga2ViYWItY2FzZSwgeW91IGNhbiB1c2UgW3ByZWZpeGVkQ1NTXSgjbW9kZXJuaXpyLXByZWZpeGVkY3NzKS5cbiAgICovXG5cbiAgdmFyIHByZWZpeGVkID0gTW9kZXJuaXpyUHJvdG8ucHJlZml4ZWQgPSBmdW5jdGlvbiAocHJvcCwgb2JqLCBlbGVtKSB7XG4gICAgaWYgKDAgPT09IHByb3AuaW5kZXhPZignQCcpKSB7XG4gICAgICByZXR1cm4gYXRSdWxlKHByb3ApO1xuICAgIH1cbiAgICBpZiAoLTEgIT0gcHJvcC5pbmRleE9mKCctJykpIHtcbiAgICAgIC8vIENvbnZlcnQga2ViYWItY2FzZSB0byBjYW1lbENhc2VcbiAgICAgIHByb3AgPSBjc3NUb0RPTShwcm9wKTtcbiAgICB9XG4gICAgaWYgKCFvYmopIHtcbiAgICAgIHJldHVybiB0ZXN0UHJvcHNBbGwocHJvcCwgJ3BmeCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUZXN0aW5nIERPTSBwcm9wZXJ0eSBlLmcuIE1vZGVybml6ci5wcmVmaXhlZCgncmVxdWVzdEFuaW1hdGlvbkZyYW1lJywgd2luZG93KSAvLyAnbW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lJ1xuICAgICAgcmV0dXJuIHRlc3RQcm9wc0FsbChwcm9wLCBvYmosIGVsZW0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogdGVzdEFsbFByb3BzIGRldGVybWluZXMgd2hldGhlciBhIGdpdmVuIENTUyBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXJcbiAgICpcbiAgICogQG1lbWJlcm9mIE1vZGVybml6clxuICAgKiBAbmFtZSBNb2Rlcm5penIudGVzdEFsbFByb3BzXG4gICAqIEBvcHRpb25OYW1lIE1vZGVybml6ci50ZXN0QWxsUHJvcHMoKVxuICAgKiBAb3B0aW9uUHJvcCB0ZXN0QWxsUHJvcHNcbiAgICogQGFjY2VzcyBwdWJsaWNcbiAgICogQGZ1bmN0aW9uIHRlc3RBbGxQcm9wc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCAtIFN0cmluZyBuYW1pbmcgdGhlIHByb3BlcnR5IHRvIHRlc3QgKGVpdGhlciBjYW1lbENhc2Ugb3Iga2ViYWItY2FzZSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBTdHJpbmcgb2YgdGhlIHZhbHVlIHRvIHRlc3RcbiAgICogQHBhcmFtIHtib29sZWFufSBbc2tpcFZhbHVlVGVzdD1mYWxzZV0gLSBXaGV0aGVyIHRvIHNraXAgdGVzdGluZyB0aGF0IHRoZSB2YWx1ZSBpcyBzdXBwb3J0ZWQgd2hlbiB1c2luZyBub24tbmF0aXZlIGRldGVjdGlvblxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiB0ZXN0QWxsUHJvcHMgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgZ2l2ZW4gQ1NTIHByb3BlcnR5LCBpbiBzb21lIHByZWZpeGVkIGZvcm0sXG4gICAqIGlzIHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlci5cbiAgICpcbiAgICogYGBganNcbiAgICogdGVzdEFsbFByb3BzKCdib3hTaXppbmcnKSAgLy8gdHJ1ZVxuICAgKiBgYGBcbiAgICpcbiAgICogSXQgY2FuIG9wdGlvbmFsbHkgYmUgZ2l2ZW4gYSBDU1MgdmFsdWUgaW4gc3RyaW5nIGZvcm0gdG8gdGVzdCBpZiBhIHByb3BlcnR5XG4gICAqIHZhbHVlIGlzIHZhbGlkXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIHRlc3RBbGxQcm9wcygnZGlzcGxheScsICdibG9jaycpIC8vIHRydWVcbiAgICogdGVzdEFsbFByb3BzKCdkaXNwbGF5J
1ywgJ3Blbmd1aW4nKSAvLyBmYWxzZVxuICAgKiBgYGBcbiAgICpcbiAgICogQSBib29sZWFuIGNhbiBiZSBwYXNzZWQgYXMgYSB0aGlyZCBwYXJhbWV0ZXIgdG8gc2tpcCB0aGUgdmFsdWUgY2hlY2sgd2hlblxuICAgKiBuYXRpdmUgZGV0ZWN0aW9uIChAc3VwcG9ydHMpIGlzbid0IGF2YWlsYWJsZS5cbiAgICpcbiAgICogYGBganNcbiAgICogdGVzdEFsbFByb3BzKCdzaGFwZU91dHNpZGUnLCAnY29udGVudC1ib3gnLCB0cnVlKTtcbiAgICogYGBgXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHRlc3RBbGxQcm9wcyhwcm9wLCB2YWx1ZSwgc2tpcFZhbHVlVGVzdCkge1xuICAgIHJldHVybiB0ZXN0UHJvcHNBbGwocHJvcCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHZhbHVlLCBza2lwVmFsdWVUZXN0KTtcbiAgfVxuICBNb2Rlcm5penJQcm90by50ZXN0QWxsUHJvcHMgPSB0ZXN0QWxsUHJvcHM7XG5cbiAgLyoqXG4gICAqIHRlc3RQcm9wKCkgaW52ZXN0aWdhdGVzIHdoZXRoZXIgYSBnaXZlbiBzdHlsZSBwcm9wZXJ0eSBpcyByZWNvZ25pemVkXG4gICAqIFByb3BlcnR5IG5hbWVzIGNhbiBiZSBwcm92aWRlZCBpbiBlaXRoZXIgY2FtZWxDYXNlIG9yIGtlYmFiLWNhc2UuXG4gICAqXG4gICAqIEBtZW1iZXJvZiBNb2Rlcm5penJcbiAgICogQG5hbWUgTW9kZXJuaXpyLnRlc3RQcm9wXG4gICAqIEBhY2Nlc3MgcHVibGljXG4gICAqIEBvcHRpb25OYW1lIE1vZGVybml6ci50ZXN0UHJvcCgpXG4gICAqIEBvcHRpb25Qcm9wIHRlc3RQcm9wXG4gICAqIEBmdW5jdGlvbiB0ZXN0UHJvcF
1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCAtIE5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eSB0byBjaGVja1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIE5hbWUgb2YgdGhlIENTUyB2YWx1ZSB0byBjaGVja1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt1c2VWYWx1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byBjaGVjayB0aGUgdmFsdWUgaWYgQHN1cHBvcnRzIGlzbid0IHN1cHBvcnRlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogSnVzdCBsaWtlIFt0ZXN0QWxsUHJvcHNdKCNtb2Rlcm5penItdGVzdGFsbHByb3BzKSwgb25seSBpdCBkb2VzIG5vdCBjaGVjayBhbnkgdmVuZG9yIHByZWZpeGVkXG4gICAqIHZlcnNpb24gb2YgdGhlIHN0cmluZy5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBwcm9wZXJ0eSBuYW1lIG11c3QgYmUgcHJvdmlkZWQgaW4gY2FtZWxDYXNlIChlLmcuIGJveFNpemluZyBub3QgYm94LXNpemluZylcbiAgICpcbiAgICogYGBganNcbiAgICogTW9kZXJuaXpyLnRlc3RQcm9wKCdwb2ludGVyRXZlbnRzJykgIC8vIHRydWVcbiAgICogYGBgXG4gICAqXG4gICAqIFlvdSBjYW4gYWxzbyBwcm92aWRlIGEgdmFsdWUgYXMgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHRvIGNoZWNrIGlmIGFcbiAgICogc3BlY2lmaWMgdmFsdWUgaXMgc3VwcG9ydGVkXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIE1vZGVybml6ci50ZXN0UHJvcCgncG9pbnRlckV2ZW50cycsICdub25lJykgLy8gdHJ1ZVxuICAgKiBNb2Rlcm5penIudGVzdFByb3AoJ3BvaW50ZXJFdmVudHMnLCAncGVuZ3VpbicpIC8vIGZhbHNlXG4gICAqIGBgYFxuICAgKi9cblxuICB2YXIgdGVzdFByb3AgPSBNb2Rlcm5penJQcm90by50ZXN0UHJvcCA9IGZ1bmN0aW9uIChwcm9wLCB2YWx1ZSwgdXNlVmFsdWUpIHtcbiAgICByZXR1cm4gdGVzdFByb3BzKFtwcm9wXSwgdW5kZWZpbmVkLCB2YWx1ZSwgdXNlVmFsdWUpO1xuICB9O1xuXG4gIC8qIVxuICB7XG4gICBcIm5hbWVcIjogXCJGbGV4Ym94XCIsXG4gICBcInByb3BlcnR5XCI6IFwiZmxleGJveFwiLFxuICAgXCJjYW5pdXNlXCI6IFwiZmxleGJveFwiLFxuICAgXCJ0YWdzXCI6IFtcImNzc1wiXSxcbiAgIFwibm90ZXNcIjogW3tcbiAgICAgXCJuYW1lXCI6IFwiVGhlIF9uZXdfIGZsZXhib3hcIixcbiAgICAgXCJocmVmXCI6IFwiaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzMy1mbGV4Ym94XCJcbiAgIH1dLFxuICAgXCJ3YXJuaW5nc1wiOiBbXG4gICAgIFwiQSBgdHJ1ZWAgcmVzdWx0IGZvciB0aGlzIGRldGVjdCBkb2VzIG5vdCBpbXBseSB0aGF0IHRoZSBgZmxleC13cmFwYCBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQ7IHNlZSB0aGUgYGZsZXh3cmFwYCBkZXRlY3QuXCJcbiAgIF1cbiAgfVxuICAhKi9cbiAgLyogRE9DXG4gIERldGVjdHMgc3VwcG9ydCBmb3IgdGhlIEZsZXhpYmxlIEJveCBMYXlvdXQgbW9kZWwsIGEuay5hLiBGbGV4Ym94LCB3aGljaCBhbGxvd3MgZWFzeSBtYW5pcHVsYXRpb24gb2YgbGF5b3V0IG9yZGVyIGFuZCBzaXppbmcgd2l0aGluIGEgY29udGFpbmVyLlxuICAqL1xuXG4gIE1vZGVybml6ci5hZGRUZXN0KCdmbGV4Ym94JywgdGVzdEFsbFByb3BzKCdmbGV4QmFzaXMnLCAnMXB4JywgdHJ1ZSkpO1xuXG4gIC8qIVxuICB7XG4gICBcIm5hbWVcIjogXCJDU1MgQW5pbWF0aW9uc1wiLFxuICAgXCJwcm9wZXJ0eVwiOiBcImNzc2FuaW1hdGlvbnNcIixcbiAgIFwiY2FuaXVzZVwiOiBcImNzcy1hbmltYXRpb25cIixcbiAgIFwicG9seWZpbGxzXCI6IFtcInRyYW5zZm9ybWllXCIsIFwiY3Nzc2FuZHBhcGVyXCJdLFxuICAgXCJ0YWdzXCI6IFtcImNzc1wiXSxcbiAgIFwid2FybmluZ3NcIjogW1wiQW5kcm9pZCA8IDQgd2lsbCBwYXNzIHRoaXMgdGVzdCwgYnV0IGNhbiBvbmx5IGFuaW1hdGUgYSBzaW5nbGUgcHJvcGVydHkgYXQgYSB0aW1lXCJdLFxuICAgXCJub3Rlc1wiOiBbe1xuICAgICBcIm5hbWVcIiA6IFwiQXJ0aWNsZTogJ0Rpc3BlbGxpbmcgdGhlIEFuZHJvaWQgQ1NTIGFuaW1hdGlvbiBteXRocydcIixcbiAgICAgXCJocmVmXCI6IFwiaHR0cHM6Ly9nb28uZ2wvT0d3NUdtXCJcbiAgIH1dXG4gIH1cbiAgISovXG4gIC8qIERPQ1xuICBEZXRlY3RzIHdoZXRoZXIgb3Igbm90IGVsZW1lbnRzIGNhbiBiZSBhbmltYXRlZCB1c2luZyBDU1NcbiAgKi9cblxuICBNb2Rlcm5penIuYWRkVGVzdCgnY3NzYW5pbWF0aW9ucycsIHRlc3RBbGxQcm9wcygnYW5pbWF0aW9uTmFtZScsICdhJywgdHJ1ZSkpO1xuXG4gIC8qIVxuICB7XG4gICBcIm5hbWVcIjogXCJDU1MgR3JhZGllbnRzXCIsXG4gICBcImNhbml1c2VcIjogXCJjc3MtZ3JhZGllbnRzXCIsXG4gICBcInByb3BlcnR5XCI6IFwiY3NzZ3JhZGllbnRzXCIsXG4gICBcInRhZ3NcIjogW1wiY3NzXCJdLFxuICAgXCJrbm93bkJ1Z3NcIjogW1wiRmFsc2UtcG9zaXRpdmVzIG9uIHdlYk9TIChodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9pc3N1ZXMvMjAyKVwiXSxcbiAgIFwibm90ZXNcIjogW3tcbiAgICAgXCJuYW1lXCI6IFwiV2Via2l0IEdyYWRpZW50IFN5bnRheFwiLFxuICAgICBcImhyZWZcIjogXCJodHRwczovL3dlYmtpdC5vcmcvYmxvZy8xNzUvaW50cm9kdWNpbmctY3NzLWdyYWRpZW50cy9cIlxuICAgfSx7XG4gICAgIFwibmFtZVwiOiBcIkxpbmVhciBHcmFkaWVudCBTeW50YXhcIixcbiAgICAgXCJocmVmXCI6IFwiaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2xpbmVhci1ncmFkaWVudFwiXG4gICB9LHtcbiAgICAgXCJuYW1lXCI6IFwiVzNDIEdyYWRpZW50IFNwZWNcIixcbiAgICAgXCJocmVmXCI6IFwiaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy1pbWFnZXMtMy8jZ3JhZGllbnRzXCJcbiAgIH1dXG4gIH1cbiAgISovXG5cbiAgTW9kZXJuaXpyLmFkZFRlc3QoJ2Nzc2dyYWRpZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RyMSA9ICdiYWNrZ3JvdW5kLWltYWdlOic7XG4gICAgdmFyIHN0cjIgPSAnZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLHJpZ2h0IGJvdHRvbSxmcm9tKCM5ZjkpLHRvKHdoaXRlKSk7JztcbiAgICB2YXIgY3NzID0gJyc7XG4gICAgdmFyIGFuZ2xlO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwcmVmaXhlcy5sZW5ndGggLSAxOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGFuZ2xlID0gMCA9PT0gaSA/ICd0byAnIDogJyc7XG4gICAgICBjc3MgKz0gc3RyMSArIHByZWZpeGVzW2ldICsgJ2xpbmVhci1ncmFkaWVudCgnICsgYW5nbG
1UgKyAnbGVmdCB0b3AsICM5ZjksIHdoaXRlKTsnO1xuICAgIH1cbiAgICBpZiAoTW9kZXJuaXpyLl9jb25maWcudXNlUHJlZml4ZXMpIHtcbiAgICAgIC8vIGxlZ2FjeSB3ZWJraXQgc3ludGF4IChGSVhNRTogcmVtb3ZlIHdoZW4gc3ludGF4IG5vdCBpbiB1c2UgYW55bW9yZSlcbiAgICAgIGNzcyArPSBzdHIxICsgJy13ZWJraXQtJyArIHN0cjI7XG4gICAgfVxuICAgIHZhciBlbGVtID0gY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIHZhciBzdHlsZSA9IGVsZW0uc3R5bGU7XG4gICAgc3R5bGUuY3NzVGV4dCA9IGNzcztcblxuICAgIC8vIElFNiByZXR1cm5zIHVuZGVmaW5lZCBzbyBjYXN0IHRvIHN0cmluZ1xuICAgIHJldHVybiAtMSA8ICgnJyArIHN0eWxlLmJhY2tncm91bmRJbWFnZSkuaW5kZXhPZignZ3JhZGllbnQnKTtcbiAgfSk7XG5cbiAgLyohXG4gIHtcbiAgIFwibmFtZVwiOiBcIkNTUyBUcmFuc2Zvcm1zXCIsXG4gICBcInByb3BlcnR5XCI6IFwiY3NzdHJhbnNmb3Jtc1wiLFxuICAgXCJjYW5pdXNlXCI6IFwidHJhbnNmb3JtczJkXCIsXG4gICBcInRhZ3NcIjogW1wiY3NzXCJdXG4gIH1cbiAgISovXG5cbiAgTW9kZXJuaXpyLmFkZFRlc3QoJ2Nzc3RyYW5zZm9ybXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gQW5kcm9pZCA8IDMuMCBpcyBidWdneSwgc28gd2Ugc25pZmYgYW5kIGJsYWNrbGlzdFxuICAgIC8vIGh0dHA6Ly9naXQuaW8vaEh6TDd3XG4gICAgcmV0dXJuIC0xID09PSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0FuZHJvaWQgMi4nKSAmJiB0ZXN0QWxsUHJvcHMoJ3RyYW5zZm9ybScsICdzY2FsZSgxKScsIHRydWUpO1xuICB9KTtcblxuICAvKiFcbiAge1xuICAgXCJuYW1lXCI6IFwiQ1NTIFRyYW5zaXRpb25zXCIsXG4gICBcInByb3BlcnR5XCI6IFwiY3NzdHJhbnNpdGlvbnNcIixcbiAgIFwiY2FuaXVzZVwiOiBcImNzcy10cmFuc2l0aW9uc1wiLFxuICAgXCJ0YWdzXCI6IFtcImNzc1wiXVxuICB9XG4gICEqL1xuXG4gIE1vZGVybml6ci5hZGRUZXN0KCdjc3N0cmFuc2l0aW9ucycsIHRlc3RBbGxQcm9wcygndHJhbnNpdGlvbicsICdhbGwnLCB0cnVlKSk7XG5cbiAgLyohXG4gIHtcbiAgIFwibmFtZVwiOiBcIkNTUyBDb2x1bW5zXCIsXG4gICBcInByb3BlcnR5XCI6IFwiY3NzY29sdW1uc1wiLFxuICAgXCJjYW5pdXNlXCI6IFwibXVsdGljb2x1bW5cIixcbiAgIFwicG9seWZpbGxzXCI6IFtcImNzczNtdWx0aWNvbHVtbmpzXCJdLFxuICAgXCJ0YWdzXCI6IFtcImNzc1wiXVxuICB9XG4gICEqL1xuXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgTW9kZXJuaXpyLmFkZFRlc3QoJ2Nzc2NvbHVtbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2Y
1XIgYm9vbCA9IGZhbHNlO1xuICAgICAgdmFyIHRlc3QgPSB0ZXN0QWxsUHJvcHMoJ2NvbHVtbkNvdW50Jyk7XG4gICAgICB0cnkge1xuICAgICAgICBib29sID0gISF0ZXN0O1xuICAgICAgICBpZiAoYm9vbCkge1xuICAgICAgICAgIGJvb2wgPSBuZXcgQm9vbGVhbihib29sKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIHJldHVybiBib29sO1xuICAgIH0pO1xuICAgIHZhciBwcm9wcyA9IFsnV2lkdGgnLCAnU3BhbicsICdGaWxsJywgJ0dhcCcsICdSdWxlJywgJ1J1bGVDb2xvcicsICdSdWxlU3R5bGUnLCAnUnVsZVdpZHRoJywgJ0JyZWFrQmVmb3JlJywgJ0JyZWFrQWZ0ZXInLCAnQnJlYWtJbnNpZGUnXTtcbiAgICB2YXIgbmFtZSwgdGVzdDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuYW1lID0gcHJvcHNbaV0udG9Mb3dlckNhc2UoKTtcbiAgICAgIHRlc3QgPSB0ZXN0QWxsUHJvcHMoJ2NvbHVtbicgKyBwcm9wc1tpXSk7XG5cbiAgICAgIC8vIGJyZWFrLWJlZm9yZSwgYnJlYWstYWZ0ZXIgJiBicmVhay1pbnNpZGUgYXJlIG5vdCBcImNvbHVtblwiLXByZWZpeGVkIGluIHNwZWNcbiAgICAgIGlmICgnYnJlYWtiZWZvcmUnID09PSBuYW1lIHx8ICdicmVha2FmdGVyJyA9PT0gbmFtZSB8fCAnYnJlYWtpbnNpZGUnID09IG5hbWUpIHtcbiAgICAgICAgdGVzdCA9IHRlc3QgfHwgdGVzdEFsbFByb3BzKHByb3BzW2ldKTtcbiAgICAgIH1cbiAgICAgIE1vZGVybml6ci5hZGRUZXN0KCdjc3Njb2x1bW5zLicgKyBuYW1lLCB0ZXN0KTtcbiAgICB9XG4gIH0pKCk7XG5cbiAgLyoqXG4gICAqIHRlc3RTdHlsZXMgaW5qZWN0cyBhbiBlbGVtZW50IHdpdGggc3R5bGUgZWxlbWVudCBhbmQgc29tZSBDU1MgcnVsZXNcbiAgICpcbiAgICogQG1lbWJlcm9mIE1vZGVybml6clxuICAgKiBAbmFtZSBNb2Rlcm5penIudGVzdFN0eWxlc1xuICAgKiBAb3B0aW9uTmFtZSBNb2Rlcm5penIudGVzdFN0eWxlcygpXG4gICAqIEBvcHRpb25Qcm9wIHRlc3RTdHlsZXNcbiAgICogQGFjY2VzcyBwdWJsaWNcbiAgICogQGZ1bmN0aW9uIHRlc3RTdHlsZXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJ1bGUgLSBTdHJpbmcgcmVwcmVzZW50aW5nIGEgY3NzIHJ1bGVcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB0byB0ZXN0IHRoZSBpbmplY3RlZCBlbGVtZW50XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbm9kZXNdIC0gQW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIG5vZGVzIHlvdSB3YW50IGluamVjdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFt0ZXN0bmFtZXNdIC0gQW4gYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IGFyZSB1c2VkIGFzIGlkcyBmb3IgdGhlIGFkZGl0aW9uYWwgbm9kZXNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBNb2Rlcm5penIudGVzdFN0eWxlc2AgdGFrZXMgYSBDU1MgcnVsZSBhbmQgaW5qZWN0cyBpdCBvbnRvIHRoZSBjdXJyZW50IHBhZ2VcbiAgICogYWxvbmcgd2l0aCAocG9zc2libHkgbXVsdGlwbGUpIERPTSBlbGVtZW50cy4gVGhpcyBsZXRzIHlvdSBjaGVjayBmb3IgZmVhdHVyZXNcbiAgICogdGhhdCBjYW4gbm90IGJlIGRldGVjdGVkIGJ5IHNpbXBseSBjaGVja2luZyB0aGUgW0lETF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Nb3ppbGxhL0RldmVsb3Blcl9ndWlkZS9JbnRlcmZhY2VfZGV2ZWxvcG1lbnRfZ3VpZGUvSURMX2ludGVyZmFjZV9ydWxlcykuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIE1vZGVybml6ci50ZXN0U3R5bGVzKCcjbW9kZXJuaXpyIHsgd2lkdGg6IDlweDsgY29sb3I6IHBhcGF5YXdoaXA7IH0nLCBmdW5jdGlvbihlbGVtLCBydWxlKSB7XG4gICAqICAg
1Ly8gZWxlbSBpcyB0aGUgZmlyc3QgRE9NIG5vZGUgaW4gdGhlIHBhZ2UgKGJ5IGRlZmF1bHQgI21vZGVybml6cilcbiAgICogICAvLyBydWxlIGlzIHRoZSBmaXJzdCBhcmd1bWVudCB5b3Ugc3VwcGxpZWQgLSB0aGUgQ1NTIHJ1bGUgaW4gc3RyaW5nIGZvcm1cbiAgICpcbiAgICogICBhZGRUZXN0KCd3aWR0aHdvcmtzJywgZWxlbS5zdHlsZS53aWR0aCA9PT0gJzlweCcpXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogSWYgeW91ciB0ZXN0IHJlcXVpcmVzIG11bHRpcGxlIG5vZGVzLCB5b3UgY2FuIGluY2x1ZGUgYSB0aGlyZCBhcmd1bWVudFxuICAgKiBpbmRpY2F0aW5nIGhvdyBtYW55IGFkZGl0aW9uYWwgZGl2IGVsZW1lbnRzIHRvIGluY2x1ZGUgb24gdGhlIHBhZ2UuIFRoZVxuICAgKiBhZGRpdGlvbmFsIG5vZGVzIGFyZSBpbmplY3RlZCBhcyBjaGlsZHJlbiBvZiB0aGUgYGVsZW1gIHRoYXQgaXMgcmV0dXJuZWQgYXNcbiAgICogdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBjYWxsYmFjay5cbiAgICpcbiAgICogYGBganNcbiAgICogTW9kZXJuaXpyLnRlc3RTdHlsZXMoJyNtb2Rlcm5penIge3dpZHRoOiAxcHh9OyAjbW9kZXJuaXpyMiB7d2lkdGg6IDJweH0nLCBmdW5jdGlvbihlbGVtKSB7XG4gICAqICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVybml6cicpLnN0eWxlLndpZHRoID09PSAnMXB4JzsgLy8gdHJ1ZVxuICAgKiAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2Rlcm5penIyJykuc3R5bGUud2lkdGggPT09ICcycHgnOyAvLyB0cnVlXG4gICAqICAgZWxlbS5maXJzdENoaWxkID09PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZXJuaXpyMicpOyAvLyB0cnVlXG4gICAqIH0sIDEpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgYWxsIG9mIHRoZSBhZGRpdGlvbmFsIGVsZW1lbnRzIGhhdmUgYW4gSUQgb2YgYG1vZGVybml6cltuXWAsIHdoZXJlXG4gICAqIGBuYCBpcyBpdHMgaW5kZXggKGUuZy4gdGhlIGZpcnN0IGFkZGl0aW9uYWwsIHNlY29uZCBvdmVyYWxsIGlzIGAjbW9kZXJuaXpyMmAsXG4gICAqIHRoZSBzZWNvbmQgYWRkaXRpb25hbCBpcyBgI21vZGVybml6cjNgLCBldGMuKS5cbiAgICogSWYgeW91IHdhbnQgdG8gaGF2ZSBtb3JlIG1lYW5pbmdmdWwgSURzIGZvciB5b3VyIGZ1bmN0aW9uLCB5b3UgY2FuIHByb3ZpZGVcbiAgICogdGhlbSBhcyB0aGUgZm91cnRoIGFyZ3VtZW50LCBhcyBhbiBhcnJheSBvZiBzdHJpbmdzXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIE1vZGVybml6ci50ZXN0U3R5bGVzKCcjZm9vIHt3aWR0aDogMTBweH07ICNiYXIge2hlaWdodDogMjBweH0nLCBmdW5jdGlvbihlbGVtKSB7XG4gICAqICAgZWxlbS5maXJzdENoaWxkID09PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9vJyk7IC8vIHRydWVcbiAgICogICBlbGVtLmxhc3RDaGlsZCA9PT0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcicpOyAvLyB0cnVlXG4gICAqIH0sIDIsIFsnZm9vJywgJ2JhciddKTtcbiAgICogYGBgXG4gICAqXG4gICAqL1xuXG4gIHZhciB0ZXN0U3R5bGVzID0gTW9kZXJuaXpyUHJvdG8udGVzdFN0eWxlcyA9IGluamVjdEVsZW1lbnRXaXRoU3R5bGVzO1xuXG4gIC8qKlxuICAgKiByb3VuZGVkRXF1YWxzIHRha2VzIHR3byBpbnRlZ2VycyBhbmQgY2hlY2tzIGlmIHRoZSBmaXJzdCBpcyB3aXRoaW4gMSBvZiB0aGUgc2Vjb25kXG4gICAqXG4gICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgKiBAZnVuY3Rpb24gcm91bmRlZEVxdWFsc1xuICAgKiBAcGFyYW0ge251bWJlcn0gYVxuICAgKiBAcGFyYW0ge251bWJlcn0gYlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG5cbiAgZnVuY3Rpb24gcm91bmRlZEVxdWFscyhhLCBiKSB7XG4gICAgcmV0dXJuIGEgLSAxID09PSBiIHx8IGEgPT09IGIgfHwgYSArIDEgPT09IGI7XG4gIH1cblxuICAvKiFcbiAge1xuICAgXCJuYW1lXCI6IFwiQ1NTIHZoIHVuaXRcIixcbiAgIFwicHJvcGVydHlcIjogXCJjc3N2aHVuaXRcIixcbiAgIFwiY2FuaXVzZVwiOiBcInZpZXdwb3J0LXVuaXRzXCIsXG4gICBcInRhZ3NcIjogW1wiY3NzXCJdLFxuICAgXCJidWlsZGVyQWxpYXNlc1wiOiBbXCJjc3Nfdmh1bml0XCJdLFxuICAgXCJub3Rlc1wiOiBbe1xuICAgICBcIm5hbWVcIjogXCJSZWxhdGVkIE1vZGVybml6ciBJc3N1ZVwiLFxuICAgICBcImhyZWZcIjogXCJodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9pc3N1ZXMvNTcyXCJcbiAgIH0se1xuICAgICBcIm5hbWVcIjogXCJTaW1pbGFyIEpTRmlkZGxlXCIsXG4gICAgIFwiaHJlZlwiOiBcImh0dHBzOi8vanNmaWRkbGUubmV0L0ZXZWluYi9ldG5ZQy9cIlxuICAgfV1cbiAgfVxuICAhKi9cblxuICB0ZXN0U3R5bGVzKCcjbW9kZXJuaXpyIHsgaGVpZ2h0OiA1MHZoOyB9JywgZnVuY3Rpb24gKGVsZW0pIHtcbiAgICB2YXIgaGVpZ2h0ID0gcGFyc2VJbnQod2luZG93LmlubmVySGVpZ2h0IC8gMiwgMTApO1xuICAgIHZhciBjb21wU3R5bGUgPSBwYXJzZUludChjb21wdXRlZFN0eWxlKGVsZW0sIG51bGwsICdoZWlnaHQnKSwgMTApO1xuICAgIE1vZGVybml6ci5hZGRUZXN0KCdjc3N2aHVuaXQnLCByb3VuZGVkRXF1YWxzKGNvbXBTdHlsZSwgaGVpZ2h0KSk7XG4gIH0pO1xuXG4gIC8qIVxuICB7XG4gICBcIm5hbWVcIjogXCJDU1MgdncgdW5pdFwiLFxuICAgXCJwcm9wZXJ0eVwiOiBcImNzc3Z3dW5pdFwiLFxuICAgXCJjYW5pdXNlXCI6IFwidmlld3BvcnQtdW5pdHNcIixcbiAgIFwidGFnc1wiOiBbXCJjc3NcIl0sXG4gICBcImJ1aWxkZXJBbGlhc2VzXCI6IFtcImNzc192d3VuaXRcIl0sXG4gICBcIm5vdGVzXCI6IFt7XG4gICAgIFwibmFtZVwiOiBcIlJlbGF0ZWQgTW9kZXJuaXpyIElzc3VlXCIsXG4gICAgIFwiaHJlZlwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2lzc3Vlcy81NzJcIlxuICAgfSx7XG4gICAgIFwibmFtZVwiOiBcIkpTRmlkZGxlIEV4YW1wbGVcIixcbiAgICAgXCJocmVmXCI6IFwiaHR0cHM6Ly9qc2ZpZGRsZS5uZXQvRldlaW5iL2V0bllDL1wiXG4gICB9XVxuICB9XG4gICEqL1xuXG4gIHRlc3RTdHlsZXMoJyNtb2Rlcm5penIgeyB3aWR0aDogNTB2dzsgfScsIGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgdmFyIHdpZHRoID0gcGFyc2VJbnQod2luZG93LmlubmVyV2lkdGggLyAyLCAxMCk7XG4gICAgdmFyIGNvbXBTdHlsZSA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCwgJ3dpZHRoJyksIDEwKTtcbiAgICBNb2Rlcm5penIuYWRkVGVzdCgnY3Nzdnd1bml0Jywgcm91bmRlZEVxdWFscy
1hjb21wU3R5bGUsIHdpZHRoKSk7XG4gIH0pO1xuXG4gIC8qIVxuICB7XG4gICBcIm5hbWVcIjogXCJwbGFjZWhvbGRlciBhdHRyaWJ1dGVcIixcbiAgIFwicHJvcGVydHlcIjogXCJwbGFjZWhvbGRlclwiLFxuICAgXCJ0YWdzXCI6IFtcImZvcm1zXCIsIFwiYXR0cmlidXRlXCJdLFxuICAgXCJidWlsZGVyQWxpYXNlc1wiOiBbXCJmb3Jtc19wbGFjZWhvbGRlclwiXVxuICB9XG4gICEqL1xuICAvKiBET0NcbiAgVGVzdHMgZm9yIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZSBpbiBpbnB1dHMgYW5kIHRleHRhcmVhc1xuICAqL1xuXG4gIE1vZGVybml6ci5hZGRUZXN0KCdwbGFjZWhvbGRlcicsICdwbGFjZWhvbGRlcicgaW4gY3JlYXRlRWxlbWVudCgnaW5wdXQnKSAmJiAncGxhY2Vob2xkZXInIGluIGNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJykpO1xuXG4gIC8qIVxuICB7XG4gICBcIm5hbWVcIjogXCJMb2NhbCBTdG9yYWdlXCIsXG4gICBcInByb3BlcnR5XCI6IFwibG9jYWxzdG9yYWdlXCIsXG4gICBcImNhbml1c2VcIjogXCJuYW1ldmFsdWUtc3RvcmFnZVwiLFxuICAgXCJ0YWdzXCI6IFtcInN0b3JhZ2VcIl0sXG4gICBcImtub3duQnVnc1wiOiBbXSxcbiAgIFwibm90ZXNcIjogW10sXG4gICBcIndhcm5pbmdzXCI6IFtdLFxuICAgXCJwb2x5ZmlsbHNcIjogW1xuICAgICBcImpvc2h1YWJlbGwtcG9seWZpbGxcIixcbiAgICAgXCJjdXBjYWtlXCIsXG4gICAgIFwic3RvcmFnZXBvbHlmaWxsXCIsXG4gICAgIFwiYW1wbGlmeWpzXCIsXG4gICAgIFwieXVpLWNhY2hlb2ZmbGluZVwiXG4gICBdXG4gIH1cbiAgISovXG5cbiAgLy8gSW4gRkY0LCBpZiBkaXNhYmxlZCwgd2luZG93LmxvY2FsU3RvcmFnZSBzaG91bGQgPT09IG51bGwuXG5cbiAgLy8gTm9ybWFsbHksIHdlIGNvdWxkIG5vdCB0ZXN0IHRoYXQgZGlyZWN0bHkgYW5kIG5lZWQgdG8gZG8gYVxuICAvLyAgIGAoJ2xvY2FsU3RvcmFnZScgaW4gd2luZG93KWAgdGVzdCBmaXJzdCBiZWNhdXNlIG90aGVyd2lzZSBGaXJlZm94IHdpbGxcbiAgLy8gICB0aHJvdyBidWd6aWwubGEvMzY1NzcyIGlmIGNvb2tpZXMgYXJlIGRpc2FibGVkXG5cbiAgLy8gU2ltaWxhcmx5LCBpbiBDaHJvbWUgd2l0aCBcIkJsb2NrIHRoaXJkLXBhcnR5IGNvb2tpZXMgYW5kIHNpdGUgZGF0YVwiIGVuYWJsZWQsXG4gIC8vIGF0dGVtcHRpbmcgdG8gYWNjZXNzIGB3aW5kb3cuc2Vzc2lvblN0b3JhZ2VgIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLiBjcmJ1Zy5jb20vMzU3NjI1XG5cbiAgLy8gQWxzbyBpbiBpT1M1IFByaXZhdGUgQnJvd3NpbmcgbW9kZSwgYXR0ZW1wdGluZyB0byB1c2UgbG9jYWxTdG9yYWdlLnNldEl0ZW1cbiAgLy8gd2lsbCB0aHJvdyB0aGUgZXhjZXB0aW9uOlxuICAvLyAgIFFVT1RBX0VYQ0VFREVEX0VSUk9SIERPTSBFeGNlcHRpb24gMjIuXG4gIC8vIFBlY3VsaWFybHksIGdldEl0ZW0gYW5kIHJlbW92ZUl0ZW0gY2FsbHMgZG8gbm90IHRocm93LlxuXG4gIC8vIEJlY2F1c2Ugd2UgYXJlIGZvcmNlZCB0byB0cnkvY2F0Y2ggdGhpcywgd2UnbGwgZ28gYWdncmVzc2l2ZS5cblxuICAvLyBKdXN0IEZXSVc6IElFOCBDb21wYXQgbW9kZSBzdXBwb3J0cyB0aGVzZSBmZWF0dXJlcyBjb21wbGV0ZWx5OlxuICAvLyAgIHd3dy5xdWlya3Ntb2RlLm9yZy9kb20vaHRtbDUuaHRtbFxuICAvLyBCdXQgSUU4IGRvZXNuJ3Qgc3VwcG9ydCBlaXRoZXIgd2l0aCBsb2NhbCBmaWxlc1xuXG4gIE1vZGVybml6ci5hZGRUZXN0KCdsb2NhbHN0b3JhZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1vZCA9ICdtb2Rlcm5penInO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShtb2QsIG1vZCk7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShtb2QpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG5cbiAgLyohXG4gIHtcbiAgIFwibmFtZVwiOiBcIklubGluZSBTVkdcIixcbiAgIFwicHJvcGVydHlcIjogXCJpbmxpbmVzdmdcIixcbiAgIFwiY2FuaXVzZVwiOiBcInN2Zy1odG1sNVwiLFxuICAgXCJ0YWdzXCI6IFtcInN2Z1wiXSxcbiAgIFwibm90ZXNcIjogW3tcbiAgICAgXCJuYW1lXCI6IFwiVGVzdCBwYWdlXCIsXG4gICAgIFwiaHJlZlwiOiBcImh0dHBzOi8vcGF1bGlyaXNoLmNvbS9kZW1vL2lubGluZS1zdmdcIlxuICAgfSwge1xuICAgICBcIm5hbWVcIjogXCJUZXN0IHBhZ2UgYW5kIHJlc3VsdHNcIixcbiAgICAgXCJocmVmXCI6IFwiaHR0cHM6Ly9jb2RlcGVuLmlvL2VsdG9ubWVzcXVpdGEvZnVsbC9HZ1hidm8vXCJcbiAgIH1dLFxuICAgXCJwb2x5ZmlsbHNcIjogW1wiaW5saW5lLXN2Zy1wb2x5ZmlsbFwiXSxcbiAgIFwia25vd25CdWdzXCI6IFtcIkZhbHNlIG5lZ2F0aXZlIG9uIHNvbWUgQ2hyb21pYSBicm93c2Vycy5cIl1cbiAgfVxuICAhKi9cbiAgLyogRE9DXG4gIERldGVjdHMgc3VwcG9ydCBmb3IgaW5saW5lIFNWRyBpbiBIVE1MIChub3Qgd2l0aGluIFhIVE1MKS5cbiAgKi9cblxuICBNb2Rlcm5penIuYWRkVGVzdCgnaW5saW5lc3ZnJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBkaXYgPSBjcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuaW5uZXJIVE1MID0gJzxzdmcvPic7XG4gICAgcmV0dXJuICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgPT0gKCd1bmRlZmluZWQnICE9IHR5cGVvZiBTVkdSZWN0ICYmIGRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLm5hbWVzcGFjZVVSSSk7XG4gIH0pO1xuXG4gIC8qIVxuICB7XG4gICBcIm5hbWVcIjogXCJDYW52YXNcIixcbiAgIFwicHJvcGVydHlcIjogXCJjYW52YXNcIixcbiAgIFwiY2FuaXVzZVwiOiBcImNhbnZhc1wiLFxuICAgXCJ0YWdzXCI6IFtcImNhbnZhc1wiLCBcImdyYXBoaWNzXCJdLFxuICAgXCJwb2x5ZmlsbHNcIjogW1wiZmxhc2hjYW52YXNcIiwgXCJleGNhbnZhc1wiLCBcInNsY2FudmFzXCIsIFwiZnhjYW52YXNcIl1cbiAgfVxuICAhKi9cbiAgLyogRE9DXG4gIERldGVjdHMgc3VwcG9ydCBmb3IgdGhlIGA8Y2FudmFzPmAgZWxlbWVudCBmb3IgMkQgZHJhd2luZy5cbiAgKi9cblxuICAvLyBPbiB0aGUgUzYwIGFuZCBCQiBTdG9ybSwgZ2V0Q29udGV4dCBleGlzdHMsIGJ1dCBhbHdheXMgcmV0dXJucyB1bmRlZmluZWRcbiAgLy8gc28gd2UgYWN0dWFsbHkgaGF2ZSB0byBjYWxsIGdldENvbnRleHQoKSB0byB2ZXJpZnlcbiAgLy8gZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2lzc3Vlcy9pc3N1ZS85Ny9cbiAgTW9kZXJuaXpyLmFkZFRlc3QoJ2NhbnZhcycsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZWxlbSA9IGNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIHJldHVybiAhIShlbGVtLmdldENvbnRleHQgJiYgZWxlbS5nZXRDb250ZXh0KCcyZCcpKTtcbiAgfSk7XG5cbiAgLyohXG4gIHtcbiAgIFwibmFtZVwiOiBcIkNTUyBTaGFwZXNcIixcbiAgIFwicHJvcGVydHlcIjogXCJzaGFwZXNcIixcbiAgIFwidGFnc1wiOiBbXCJjc3NcIl0sXG4gICBcIm5vdGVzXCI6IFt7XG4gICAgIFwibmFtZVwiOiBcIkNTUyBTaGFwZXMgVzNDIHNwZWNpZmljYXRpb25cIixcbiAgICAgXCJocmVmXCI6IFwiaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1zaGFwZXNcIlxuICAgfSx7XG4gICAgIFwibmFtZVwiOiBcIkV4YW1wbGVzIGZyb20gQWRvYmVcIixcbiAgICAgXCJocmVmXCI6IFwiaHR0cDovL3dlYn
1BsYXRmb3JtLmFkb2JlLmNvbS9zaGFwZXMvXCJcbiAgIH0sIHtcbiAgICAgXCJuYW1lXCI6IFwiU2FtcGxlcyBzaG93Y2FzaW5nIHVzZXMgb2YgU2hhcGVzXCIsXG4gICAgIFwiaHJlZlwiOiBcImh0dHA6Ly9jb2RlcGVuLmlvL2NvbGxlY3Rpb24vcUZlc2tcIlxuICAgfV1cbiAgfVxuICAhKi9cblxuICBNb2Rlcm5penIuYWRkVGVzdCgnc2hhcGVzJywgdGVzdEFsbFByb3BzKCdzaGFwZU91dHNpZGUnLCAnY29udGVudC1ib3gnLCB0cnVlKSk7XG5cbiAgLyohXG4gIHtcbiAgIFwibmFtZVwiOiBcIlNWR1wiLFxuICAgXCJwcm9wZXJ0eVwiOiBcInN2Z1wiLFxuICAgXCJjYW5pdXNlXCI6IFwic3ZnXCIsXG4gICBcInRhZ3NcIjogW1wic3ZnXCJdLFxuICAgXCJhdXRob3JzXCI6IFtcIkVyaWsgRGFobHN0cm9tXCJdLFxuICAgXCJwb2x5ZmlsbHNcIjogW1xuICAgICBcInN2Z3dlYlwiLFxuICAgICBcInJhcGhhZWxcIixcbiAgICAgXCJhbXBsZXNka1wiLFxuICAgICBcImNhbnZnXCIsXG4gICAgIFwic3ZnLWJvaWxlcnBsYXRlXCIsXG4gICAgIFwic2llXCIsXG4gICAgIFwiZG9qb2dmeFwiLFxuICAgICBcImZhYnJpY2pzXCJcbiAgIF1cbiAgfVxuICAhKi9cbiAgLyogRE9DXG4gIERldGVjdHMgc3VwcG9ydCBmb3IgU1ZHIGluIGA8ZW1iZWQ+YCBvciBgPG9iamVjdD5gIGVsZW1lbnRzLlxuICAqL1xuXG4gIE1vZGVybml6ci5hZGRUZXN0KCdzdmcnLCAhIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyAmJiAhIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJykuY3JlYXRlU1ZHUmVjdCk7XG5cbiAgLyohXG4gIHtcbiAgIFwibmFtZVwiOiBcIkhUTUw1IFZpZGVvXCIsXG4gICBcInByb3BlcnR5XCI6IFwidmlkZW9cIixcbiAgIFwiY2FuaXVzZVwiOiBcInZpZGVvXCIsXG4gICBcInRhZ3NcIjogW1wiaHRtbDVcIl0sXG4gICBcImtub3duQnVnc1wiOiBbXG4gICAgIFwiV2l0aG91dCBRdWlja1RpbWUsIGBNb2Rlcm5penIudmlkZW8uaDI2NGAgd2lsbCBiZSBgdW5kZWZpbmVkYDsgaHR0cHM6Ly9naXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvaXNzdWVzLzU0NlwiXG4gICBdLFxuICAgXCJwb2x5ZmlsbHNcIjogW1xuICAgICBcImh0bWw1bWVkaWFcIixcbiAgICAgXCJtZWRpYWVsZW1lbnRqc1wiLFxuICAgICBcInN1YmxpbWV2aWRlb1wiLFxuICAgICBcInZpZGVvanNcIixcbiAgICAgXCJsZWFuYmFja3BsYXllclwiLFxuICAgICBcInZpZGVvZm9yZXZlcnlib2R5XCJcbiAgIF1cbiAgfVxuICAhKi9cbiAgLyogRE9DXG4gIERldGVjdHMgc3VwcG9ydCBmb3IgdGhlIHZpZGVvIGVsZW1lbnQsIGFzIHdlbGwgYXMgdGVzdGluZyB3aGF0IHR5cGVzIG9mIGNvbnRlbnQgaXQgc3VwcG9ydHMuXG4gIFN1YnByb3BlcnRpZXMgYXJlIHByb3ZpZGVkIHRvIGRlc2NyaWJlIHN1cHBvcnQgZm9yIGBvZ2dgLCBgaDI2NGAgYW5kIGB3ZWJtYCBmb3JtYXRzLCBlLmcuOlxuICBgYGBqYXZhc2NyaXB0XG4gIE1vZGVybml6ci52aWRlbyAgICAgICAgIC8vIHRydWVcbiAgTW9kZXJuaXpyLnZpZGVvLm9nZyAgICAgLy8gJ3Byb2JhYmx5J1xuICBgYGBcbiAgKi9cblxuICAvLyBDb2RlYyB2YWx1ZXMgZnJvbSA6IGdpdGh1Yi5jb20vTmllbHNMZWVuaGVlci9odG1sNXRlc3QvYmxvYi85MTA2YTgvaW5kZXguaHRtbCNMODQ1XG4gIC8vICAgICAgICAgICAgICAgICAgICAgdGh4IHRvIE5pZWxzTGVlbmhlZXIgYW5kIHpjb3JwYW5cblxuICAvLyBOb3RlOiBpbiBzb21lIG9sZGVyIGJyb3dzZXJzLCBcIm5vXCIgd2FzIGEgcmV0dXJuIHZhbHVlIGluc3RlYWQgb2YgZW1wdHkgc3RyaW5nLlxuICAvLyAgIEl0IHdhcyBsaXZlIGluIEZGMy41LjAgYW5kIDMuNS4xLCBidXQgZml4ZWQgaW4gMy41LjJcbiAgLy8gICBJdCB3YXMgYWxzbyBsaXZlIGluIFNhZmFyaSA0LjAuMCAtIDQuMC40LCBidXQgZml4ZWQgaW4gNC4wLjVcblxuICBNb2Rlcm5penIuYWRkVGVzdCgndmlkZW8nLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVsZW0gPSBjcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZhciBib29sID0gZmFsc2U7XG5cbiAgICAvLyBJRTkgUnVubmluZyBvbiBXaW5kb3dzIFNlcnZlciBTS1UgY2FuIGNhdXNlIGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24sIGJ1ZyAjMjI0XG4gICAgdHJ5IHtcbiAgICAgIGJvb2wgPSAhIWVsZW0uY2FuUGxheVR5cGU7XG4gICAgICBpZiAoYm9vbCkge1xuICAgICAgICBib29sID0gbmV3IEJvb2xlYW4oYm9vbCk7XG4gICAgICAgIGJvb2wub2dnID0gZWxlbS5jYW5QbGF5VHlwZSgndmlkZW8vb2dnOyBjb2RlY3M9XCJ0aGVvcmFcIicpLnJlcGxhY2UoL15ubyQvLCAnJyk7XG5cbiAgICAgICAgLy8gV2l0aG91dCBRdWlja1RpbWUsIHRoaXMgdmFsdWUgd2lsbCBiZSBgdW5kZWZpbmVkYC4gZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2lzc3Vlcy81NDZcbiAgICAgICAgYm9vbC5oMjY0ID0gZWxlbS5jYW5QbGF5VHlwZSgndmlkZW8vbXA0OyBjb2RlY3M9XCJhdmMxLjQyRTAxRVwiJykucmVwbGFjZSgvXm5vJC8sICcnKTtcbiAgICAgICAgYm9vbC53ZWJtID0gZWxlbS5jYW5QbGF5VHlwZSgndmlkZW8vd2VibTsgY29kZWNzPVwidnA4LCB2b3JiaXNcIicpLnJlcGxhY2UoL15ubyQvLCAnJyk7XG4gICAgICAgIGJvb2wudnA5ID0gZWxlbS5jYW5QbGF5VHlwZSgndmlkZW8vd2VibTsgY29kZWNzPVwidnA5XCInKS5yZXBsYWNlKC9ebm8kLywgJycpO1xuICAgICAgICBib29sLmhscyA9IGVsZW0uY2FuUGxheVR5cGUoJ2FwcGxpY2F0aW9uL3gtbXBlZ1VSTDsgY29kZWNzPVwiYXZjMS40MkUwMUVcIicpLnJlcGxhY2UoL15ubyQvLCAnJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gYm9vbDtcbiAgfSk7XG5cbiAgLy8gUnVuIGVhY2ggdGVzdFxuICB0ZXN0UnVubmVyKCk7XG5cbiAgLy8gUmVtb3ZlIHRoZSBcIm5vLWpzXCIgY2xhc3MgaWYgaXQgZXhpc3RzXG4gIHNldENsYXNzZXMoY2xhc3Nlcyk7XG4gIGRlbGV0ZSBNb2Rlcm5penJQcm90by5hZGRUZXN0O1xuICBkZWxldGUgTW9kZXJuaXpyUHJvdG8uYWRkQXN5bmNUZXN0O1xuXG4gIC8vIFJ1biB0aGUgdGhpbmdzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIHJ1biBhZnRlciB0aGUgdGVzdHNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBNb2Rlcm5penIuX3EubGVuZ3RoOyBpKyspIHtcbiAgICBNb2Rlcm5penIuX3FbaV0oKTtcbiAgfVxuXG4gIC8vIExlYWsgTW9kZXJuaXpyIG5hbWVzcGFjZVxuICB3aW5kb3cuTW9kZXJuaXpyID0gTW9kZXJuaXpyO1xufSkod2luZG93LCBkb2N1bWVudCk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///709\n')},37:function(){eval("// Set previous scroll variable\nvar previousScroll = 0;\n// Scroll\nwindow.onscroll = function (ev) {\n // Get scroll position\n var scroll = window.scrollY;\n // Get header\n var header = document.querySelector('header.wp-block-template-part');\n // Set boundary of scroll as height of header\n var boundary = header.clientHeight;\n // When scroll is past small boundary, scrolling down and header is large\n if (scroll > previousScroll && scroll > boundary / 3 * 2 && header.className != 'wp-block-template-part is-scrolling is-scrolling-past-boundary') {\n // Add class to shrink header\n header.className = 'wp-block-template-part is-scrolling is-scrolling-past-boundary';\n // If scrolling up, inside larger boundary and header is reduced\n } else if (previousScroll > scroll && scroll < boundary * 3 && header.className == 'wp-block-template-part is-scrolling is-scrolling-past-boundary') {\n // Header returns to normal size, but has shadow\n header.className = 'wp-block-template-part is-scrolling';\n // If scroll is not at top, inside boundary and doesn't have shadow\n } else if (header.className == 'wp-block-template-part' && scroll > 0 && scroll < boundary) {\n // Header is normal size, but has shadow\n header.className = 'wp-block-template-part is-scrolling';\n // If scroll at top, return header to no shadow state\n }
1 else if (scroll == 0) {\n // Remove class to normalise header\n header.className = 'wp-block-template-part';\n }\n // Set previous scroll for next action\n previousScroll = scroll;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29uY2lubml0eS8uL3dwLWNvbnRlbnQvdGhlbWVzL2NvbmNpbm5pdHkvYXNzZXRzL3NyYy9zY3JpcHRzL21vZHVsZXMvc3RpY2t5aGVhZGVyLmpzPzg5ZTgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU2V0IHByZXZpb3VzIHNjcm9sbCB2YXJpYWJsZVxudmFyIHByZXZpb3VzU2Nyb2xsID0gMDtcbi8vIFNjcm9sbFxud2luZG93Lm9uc2Nyb2xsID0gZnVuY3Rpb24gKGV2KSB7XG4gIC8vIEdldCBzY3JvbGwgcG9zaXRpb25cbiAgdmFyIHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZO1xuICAvLyBHZXQgaGVhZGVyXG4gIHZhciBoZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkZXIud3AtYmxvY2stdGVtcGxhdGUtcGFydCcpO1xuICAvLyBTZXQgYm91bmRhcnkgb2Ygc2Nyb2xsIGFzIGhlaWdodCBvZiBoZWFkZXJcbiAgdmFyIGJvdW5kYXJ5ID0gaGVhZGVyLmNsaWVudEhlaWdodDtcbiAgLy8gV2hlbiBzY3JvbGwgaXMgcGFzdCBzbWFsbCBib3VuZGFyeSwgc2Nyb2xsaW5nIGRvd24gYW5kIGhlYWRlciBpcyBsYXJnZVxuICBpZiAoc2Nyb2xsID4gcHJldmlvdXNTY3JvbGwgJiYgc2Nyb2xsID4gYm91bmRhcnkgLyAzICogMiAmJiBoZWFkZXIuY2xhc3NOYW1lICE9ICd3cC1ibG9jay10ZW1wbGF0ZS1wYXJ0IGlzLXNjcm9sbGluZyBpcy1zY3JvbGxpbmctcGFzdC1ib3VuZGFyeScpIHtcbiAgICAvLyBBZGQgY2xhc3MgdG8gc2hyaW5rIGhlYWRlclxuICAgIGhlYWRlci5jbGFzc05hbWUgPSAnd3AtYmxvY2stdGVtcGxhdGUtcGFydCBpcy1zY3JvbGxpbmcgaXMtc2Nyb2xsaW5nLXBhc3QtYm91bmRhcnknO1xuICAgIC8vIElmIHNjcm9sbGluZyB1cCwgaW5zaWRlIGxhcmdlciBib3VuZGFyeSBhbmQgaGVhZGVyIGlzIHJlZHVjZWRcbiAgfSBlbHNlIGlmIChwcmV2aW91c1Njcm9sbCA+IHNjcm9sbCAmJiBzY3JvbGwgPCBib3VuZGFyeSAqIDMgJiYgaGVhZGVyLmNsYXNzTmFtZSA9PSAnd3AtYmxvY2stdGVtcGxhdGUtcGFydCBpcy1zY3JvbGxpbmcgaXMtc2Nyb2xsaW5nLXBhc3QtYm91bmRhcnknKSB7XG4gICAgLy8gSGVhZGVyIHJldHVybnMgdG8gbm9ybWFsIHNpemUsIGJ1dCBoYXMgc2hhZG93XG4gICAgaGVhZGVyLmNsYXNzTmFtZSA9ICd3cC1ibG9jay10ZW1wbGF0ZS1wYXJ0IGlzLXNjcm9sbGluZyc7XG4gICAgLy8gSWYgc2Nyb2xsIGlzIG5vdCBhdCB0b3AsIGluc2lkZSBib3VuZGFyeSBhbmQgZG9lc24ndCBoYXZlIHNoYWRvd1xuICB9IGVsc2UgaWYgKGhlYWRlci5jbGFzc05hbWUgPT0gJ3dwLWJsb2NrLXRlbXBsYXRlLXBhcnQnICYmIHNjcm9sbCA+IDAgJiYgc2Nyb2xsIDwgYm91bmRhcnkpIHtcbiAgICAvLyBIZWFkZXIgaXMgbm9ybWFsIHNpemUsIGJ1dCBoYXMgc2hhZG93XG4gICAgaGVhZGVyLmNsYXNzTmFtZSA9ICd3cC1ibG9jay10ZW1wbGF0ZS1wYXJ0IGlzLXNjcm9sbGluZyc7XG4gICAgLy8gSWYgc2Nyb2xsIGF0IHRvcCwgcmV0dXJuIGhlYWRlciB0byBubyBzaGFkb3cgc3RhdGVcbiAgfSBlbHNlIGlmIChzY3JvbGwgPT0gMCkge1xuICAgIC8vIFJlbW92ZSBjbGFzcyB0byBub3JtYWxpc2UgaGVhZGVyXG4gICAgaGVhZGVyLmNsYXNzTmFtZSA9ICd3cC1ibG9jay10ZW1wbGF0ZS1wYXJ0JztcbiAgfVxuICAvLyBTZXQgcHJldmlvdXMgc2Nyb2xsIGZvciBuZXh0IGFjdGlvblxuICBwcmV2aW91c1Njcm9sbCA9IHNjcm9sbDtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///37\n")},158:function(module){eval("/**\n * EvEmitter v2.1.1\n * Lil' event emitter\n * MIT License\n */\n\n( function( global, factory ) {\n // universal module definition\n if ( true && module.exports ) {\n // CommonJS - Browserify, Webpack\n module.exports = factory();\n } else {\n // Browser globals\n global.EvEmitter = factory();\n }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\nfunction EvEmitter() {}\n\nlet proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n if ( !eventName || !listener ) return this;\n\n // set events hash\n let events = this._events = this._events || {};\n // set listeners array\n let listeners = events[ eventName ] = events[ eventName ] || [];\n // only add once\n if ( !listeners.includes( listener ) ) {\n listeners.push( listener );\n }\n\n return this;\n};\n\nproto.once = function( eventName, listener ) {\n if ( !eventName || !listener ) return this;\n\n // add event\n this.on( eventName, listener );\n // set once flag\n // set onceEvents hash\n let onceEvents = this._onceEvents = this._onceEvents || {};\n // set onceListeners object\n let onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n // set flag\n onceListeners[ listener ] = true;\n\n return this;\n};\n\nproto.off = function( eventName, listener ) {\n let listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) return this;\n\n let index = listeners.indexOf( listener );\n if ( index != -1 ) {\n listeners.splice( index, 1 );\n }\n\n return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n let listeners = this._events && this._events[ eventName ];\n if ( !listeners || !listeners.length ) return this;\n\n // copy over to avoid interference if .off() in listener\n listeners = listeners.slice( 0 );\n args = args || [];\n // once stuff\n let onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n for ( let listener of listeners ) {\n let isOnce = onceListeners && onceListeners[ listener ];\n if ( isOnce ) {\n // remove listener\n // remove before trigger to prevent recursion\n this.off( eventName, listener );\n // unset once flag\n delete onceListeners[ listener ];\n }\n // trigger listener\n listener.apply( this, args );\n }\n\n return this;\n};
1\n\nproto.allOff = function() {\n delete this._events;\n delete this._onceEvents;\n return this;\n};\n\nreturn EvEmitter;\n\n} ) );\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU4LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29uY2lubml0eS8uL25vZGVfbW9kdWxlcy9ldi1lbWl0dGVyL2V2LWVtaXR0ZXIuanM/MDk0OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV2RW1pdHRlciB2Mi4xLjFcbiAqIExpbCcgZXZlbnQgZW1pdHRlclxuICogTUlUIExpY2Vuc2VcbiAqL1xuXG4oIGZ1bmN0aW9uKCBnbG9iYWwsIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlMgLSBCcm93c2VyaWZ5LCBXZWJwYWNrXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQnJvd3NlciBnbG9iYWxzXG4gICAgZ2xvYmFsLkV2RW1pdHRlciA9IGZhY3RvcnkoKTtcbiAgfVxuXG59KCB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oKSB7XG5cbmZ1bmN0aW9uIEV2RW1pdHRlcigpIHt9XG5cbmxldCBwcm90byA9IEV2RW1pdHRlci5wcm90b3R5cGU7XG5cbnByb3RvLm9uID0gZnVuY3Rpb24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKSB7XG4gIGlmICggIWV2ZW50TmFtZSB8fCAhbGlzdGVuZXIgKSByZXR1cm4gdGhpcztcblxuICAvLyBzZXQgZXZlbnRzIGhhc2hcbiAgbGV0IGV2ZW50cyA9IHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgLy8gc2V0IGxpc3RlbmVycyBhcnJheVxuICBsZXQgbGlzdGVuZXJzID0gZXZlbnRzWyBldmVudE5hbWUgXSA9IGV2ZW50c1sgZXZlbnROYW1lIF0gfHwgW107XG4gIC8vIG9ubHkgYWRkIG9uY2VcbiAgaWYgKCAhbGlzdGVuZXJzLmluY2x1ZGVzKCBsaXN0ZW5lciApICkge1xuICAgIGxpc3RlbmVycy5wdXNoKCBsaXN0ZW5lciApO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5vbmNlID0gZnVuY3Rpb24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKSB7XG4gIGlmICggIWV2ZW50TmFtZSB8fCAhbGlzdGVuZXIgKSByZXR1cm4gdGhpcztcblxuICAvLyBhZGQgZXZlbnRcbiAgdGhpcy5vbiggZXZlbnROYW1lLCBsaXN0ZW5lciApO1xuICAvLyBzZXQgb25jZSBmbGFnXG4gIC8vIHNldCBvbmNlRXZlbnRzIGhhc2hcbiAgbGV0IG9uY2VFdmVudHMgPSB0aGlzLl9vbmNlRXZlbnRzID0gdGhpcy5fb25jZUV2ZW50cyB8fCB7fTtcbiAgLy8gc2V0IG9uY2VMaXN0ZW5lcnMgb2JqZWN0XG4gIGxldCBvbmNlTGlzdGVuZXJzID0gb25jZUV2ZW50c1sgZXZlbnROYW1lIF0gPSBvbmNlRXZlbnRzWyBldmVudE5hbWUgXSB8fCB7fTtcbiAgLy8gc2V0IGZsYWdcbiAgb25jZUxpc3RlbmVyc1sgbGlzdGVuZXIgXSA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5vZmYgPSBmdW5jdGlvbiggZXZlbnROYW1lLCBsaXN0ZW5lciApIHtcbiAgbGV0IGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50cyAmJiB0aGlzLl9ldmVudHNbIGV2ZW50TmFtZSBdO1xuICBpZiAoICFsaXN0ZW5lcnMgfHwgIWxpc3RlbmVycy5sZW5ndGggKSByZXR1cm4gdGhpcztcblxuICBsZXQgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZiggbGlzdGVuZXIgKTtcbiAgaWYgKCBpbmRleCAhPSAtMSApIHtcbiAgICBsaXN0ZW5lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5lbWl0RXZlbnQgPSBmdW5jdGlvbiggZXZlbnROYW1lLCBhcmdzICkge1xuICBsZXQgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzICYmIHRoaXMuX2V2ZW50c1sgZXZlbnROYW1lIF07XG4gIGlmICggIWxpc3RlbmVycyB8fCAhbGlzdGVuZXJzLmxlbmd0aCApIHJldHVybiB0aGlzO1xuXG4gIC8vIGNvcHkgb3ZlciB0byBhdm9pZCBpbnRlcmZlcmVuY2UgaWYgLm9mZigpIGluIGxpc3RlbmVyXG4gIGxpc3RlbmVycyA9IGxpc3RlbmVycy5zbGljZSggMCApO1xuICBhcmdzID0gYXJncyB8fCBbXTtcbiAgLy8gb25jZSBzdHVmZlxuICBsZXQgb25jZUxpc3RlbmVycyA9IHRoaXMuX29uY2VFdmVudHMgJiYgdGhpcy5fb25jZUV2ZW50c1sgZXZlbnROYW1lIF07XG5cbiAgZm9yICggbGV0IGxpc3RlbmVyIG9mIGxpc3RlbmVycyApIHtcbiAgICBsZXQgaXNPbmNlID0gb25jZUxpc3RlbmVycyAmJiBvbmNlTGlzdGVuZXJzWyBsaXN0ZW5lciBdO1xuICAgIGlmICggaXNPbmNlICkge1xuICAgICAgLy8gcmVtb3ZlIGxpc3RlbmVyXG4gICAgICAvLyByZW1vdmUgYmVmb3JlIHRyaWdnZXIgdG8gcHJldmVudCByZWN1cnNpb25cbiAgICAgIHRoaXMub2ZmKCBldmVudE5hbWUsIGxpc3RlbmVyICk7XG4gICAgICAvLyB1bnNldCBvbmNlIGZsYWdcbiAgICAgIGRlbGV0ZSBvbmNlTGlzdGVuZXJzWyBsaXN0ZW5lciBdO1xuICAgIH1cbiAgICAvLyB0cmlnZ2VyIGxpc3RlbmVyXG4gICAgbGlzdGVuZXIuYXBwbHkoIHRoaXMsIGFyZ3MgKTtcbiAgfVxuXG4gIHJldHVybi
1B0aGlzO1xufTtcblxucHJvdG8uYWxsT2ZmID0gZnVuY3Rpb24oKSB7XG4gIGRlbGV0ZSB0aGlzLl9ldmVudHM7XG4gIGRlbGV0ZSB0aGlzLl9vbmNlRXZlbnRzO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnJldHVybiBFdkVtaXR0ZXI7XG5cbn0gKSApO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///158\n")},47:function(module){eval("/**\n * Fizzy UI utils v3.0.0\n * MIT license\n */\n\n( function( global, factory ) {\n // universal module definition\n if ( true && module.exports ) {\n // CommonJS\n module.exports = factory( global );\n } else {\n // browser global\n global.fizzyUIUtils = factory( global );\n }\n\n}( this, function factory( global ) {\n\nlet utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n return Object.assign( a, b );\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n // use object if already an array\n if ( Array.isArray( obj ) ) return obj;\n\n // return empty array if undefined or null. #6\n if ( obj === null || obj === undefined ) return [];\n\n let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n // convert nodeList to array\n if ( isArrayLike ) return [ ...obj ];\n\n // array of single index\n return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n let index = ary.indexOf( obj );\n if ( index != -1 ) {\n ary.splice( index, 1 );\n }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n while ( elem.parentNode && elem != document.body ) {\n elem = elem.parentNode;\n if ( elem.matches( selector ) ) return elem;\n }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n if ( typeof elem == 'string' ) {\n return document.querySelector( elem );\n }\n return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n let method = 'on' + event.type;\n if ( this[ method ] ) {\n this[ method ]( event );\n }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n // make array of elems\n elems = utils.makeArray( elems );\n\n return elems\n // check that elem is an actual element\n .filter( ( elem ) => elem instanceof HTMLElement )\n .reduce( ( ffElems, elem ) => {\n // add elem if no selector\n if ( !selector ) {\n ffElems.push( elem );\n return ffElems;\n }\n // filter & find items if we have a selector\n // filter\n if ( elem.matches( selector ) ) {\n ffElems.push( elem );\n }\n // find children\n let childElems = elem.querySelectorAll( selector );\n // concat childElems to filterFound array\n ffElems = ffElems.concat( ...childElems );\n return ffElems;\n }, [] );\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n threshold = threshold || 100;\n // original method\n let method = _class.prototype[ methodName ];\n let timeoutName = methodName + 'Timeout';\n\n _class.prototype[ methodName ] = function() {\n clearTimeout( this[ timeoutName ] );\n\n let args = arguments;\n this[ timeoutName ] = setTimeout( () => {\n method.apply( this, args );\n delete this[ timeoutName ];\n }, threshold );\n };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( onDocReady ) {\n let readyState = document.readyState;\n if ( readyState == 'complete' || readyState == 'interactive' ) {\n // do async to allow for other scripts to run. metafizzy/flickity#441\n setTimeout( onDocReady );\n } else {\n document.addEventListener( 'DOMContentLoaded', onDocReady );\n }\n};\n\n// ----- htmlInit ----- //\n\n// http://bit.ly/3oYLusc\nutils.toDashed = function( str ) {\n return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n return $1 + '-' + $2;\n } ).toLowerCase();\n};\n\nlet console = global.console;\n\n// allow user to initialize classes via [data-namespace] or .js-namespace class\n// htmlInit( Widget, 'widgetName' )\n// options are parsed from data-namespace-options\nutils.htmlInit = function( WidgetClass, namespace ) {\n utils.docReady( function() {\
1n let dashedNamespace = utils.toDashed( namespace );\n let dataAttr = 'data-' + dashedNamespace;\n let dataAttrElems = document.querySelectorAll( `[${dataAttr}]` );\n let jQuery = global.jQuery;\n\n [ ...dataAttrElems ].forEach( ( elem ) => {\n let attr = elem.getAttribute( dataAttr );\n let options;\n try {\n options = attr && JSON.parse( attr );\n } catch ( error ) {\n // log error, do not initialize\n if ( console ) {\n console.error( `Error parsing ${dataAttr} on ${elem.className}: ${error}` );\n }\n return;\n }\n // initialize\n let instance = new WidgetClass( elem, options );\n // make available via $().data('namespace')\n if ( jQuery ) {\n jQuery.data( elem, namespace, instance );\n }\n } );\n\n } );\n};\n\n// ----- ----- //\n\nreturn utils;\n\n} ) );\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb25jaW5uaXR5Ly4vbm9kZV9tb2R1bGVzL2Zpenp5LXVpLXV0aWxzL3V0aWxzLmpzPzYxNTgiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGaXp6eSBVSSB1dGlscyB2My4wLjBcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCBnbG9iYWwgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIGdsb2JhbC5maXp6eVVJVXRpbHMgPSBmYWN0b3J5KCBnbG9iYWwgKTtcbiAgfVxuXG59KCB0aGlzLCBmdW5jdGlvbiBmYWN0b3J5KCBnbG9iYWwgKSB7XG5cbmxldCB1dGlscyA9IHt9O1xuXG4vLyAtLS0tLSBleHRlbmQgLS0tLS0gLy9cblxuLy8gZXh0ZW5kcyBvYmplY3RzXG51dGlscy5leHRlbmQgPSBmdW5jdGlvbiggYSwgYiApIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oIGEsIGIgKTtcbn07XG5cbi8vIC0tLS0tIG1vZHVsbyAtLS0tLSAvL1xuXG51dGlscy5tb2R1bG8gPSBmdW5jdGlvbiggbnVtLCBkaXYgKSB7XG4gIHJldHVybiAoICggbnVtICUgZGl2ICkgKyBkaXYgKSAlIGRpdjtcbn07XG5cbi8vIC0tLS0tIG1ha2VBcnJheSAtLS0tLSAvL1xuXG4vLyB0dXJuIGVsZW1lbnQgb3Igbm9kZUxpc3QgaW50byBhbiBhcnJheVxudXRpbHMubWFrZUFycmF5ID0gZnVuY3Rpb24oIG9iaiApIHtcbiAgLy8gdXNlIG9iamVjdCBpZiBhbHJlYWR5IGFuIGFycmF5XG4gIGlmICggQXJyYXkuaXNBcnJheSggb2JqICkgKSByZXR1cm4gb2JqO1xuXG4gIC8vIHJldHVybiBlbXB0eSBhcnJheSBpZiB1bmRlZmluZWQgb3IgbnVsbC4gIzZcbiAgaWYgKCBvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQgKSByZXR1cm4gW107XG5cbiAgbGV0IGlzQXJyYXlMaWtlID0gdHlwZW9mIG9iaiA9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqLmxlbmd0aCA9PSAnbnVtYmVyJztcbiAgLy8gY29udmVydCBub2RlTGlzdCB0byBhcnJheVxuICBpZiAoIGlzQXJyYXlMaWtlICkgcmV0dXJuIFsgLi4ub2JqIF07XG5cbiAgLy8gYXJyYXkgb2Ygc2luZ2xlIGluZGV4XG4gIHJldHVybiBbIG9iaiBdO1xufTtcblxuLy8gLS0tLS0gcmVtb3ZlRnJvbSAtLS0tLSAvL1xuXG51dGlscy5yZW1vdmVGcm9tID0gZnVuY3Rpb24oIGFyeSwgb2JqICkge1xuICBsZXQgaW5kZXggPSBhcnkuaW5kZXhPZiggb2JqICk7XG4gIGlmICggaW5kZXggIT0gLTEgKSB7XG4gICAgYXJ5LnNwbGljZSggaW5kZXgsIDEgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gZ2V0UGFyZW50IC0tLS0tIC8vXG5cbnV0aWxzLmdldFBhcmVudCA9IGZ1bmN0aW9uKCBlbGVtLCBzZWxlY3RvciApIHtcbiAgd2hpbGUgKCBlbGVtLnBhcmVudE5vZGUgJiYgZWxlbSAhPSBkb2N1bWVudC5ib2R5ICkge1xuICAgIGVsZW0gPSBlbGVtLnBhcmVudE5vZGU7XG4gICAgaWYgKCBlbGVtLm1hdGNoZXMoIHNlbGVjdG9yICkgKSByZXR1cm4gZWxlbTtcbiAgfVxufTtcblxuLy8gLS0tLS0gZ2V0UXVlcnlFbGVtZW50IC0tLS0tIC8vXG5cbi8vIHVzZSBlbGVtZW50IGFzIHNlbGVjdG9yIHN0cmluZ1xudXRpbHMuZ2V0UXVlcnlFbGVtZW50ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIGlmICggdHlwZW9mIGVsZW0gPT0gJ3N0cmluZycgKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGVsZW0gKTtcbiAgfVxuICByZXR1cm4gZWxlbTtcbn07XG5cbi8vIC0tLS0tIGhhbmRsZUV2ZW50IC0tLS0tIC8vXG5cbi8vIGVuYWJsZSAub250eXBlIH
1RvIHRyaWdnZXIgZnJvbSAuYWRkRXZlbnRMaXN0ZW5lciggZWxlbSwgJ3R5cGUnIClcbnV0aWxzLmhhbmRsZUV2ZW50ID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICBsZXQgbWV0aG9kID0gJ29uJyArIGV2ZW50LnR5cGU7XG4gIGlmICggdGhpc1sgbWV0aG9kIF0gKSB7XG4gICAgdGhpc1sgbWV0aG9kIF0oIGV2ZW50ICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIGZpbHRlckZpbmRFbGVtZW50cyAtLS0tLSAvL1xuXG51dGlscy5maWx0ZXJGaW5kRWxlbWVudHMgPSBmdW5jdGlvbiggZWxlbXMsIHNlbGVjdG9yICkge1xuICAvLyBtYWtlIGFycmF5IG9mIGVsZW1zXG4gIGVsZW1zID0gdXRpbHMubWFrZUFycmF5KCBlbGVtcyApO1xuXG4gIHJldHVybiBlbGVtc1xuICAgIC8vIGNoZWNrIHRoYXQgZWxlbSBpcyBhbiBhY3R1YWwgZWxlbWVudFxuICAgIC5maWx0ZXIoICggZWxlbSApID0+IGVsZW0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCApXG4gICAgLnJlZHVjZSggKCBmZkVsZW1zLCBlbGVtICkgPT4ge1xuICAgICAgLy8gYWRkIGVsZW0gaWYgbm8gc2VsZWN0b3JcbiAgICAgIGlmICggIXNlbGVjdG9yICkge1xuICAgICAgICBmZkVsZW1zLnB1c2goIGVsZW0gKTtcbiAgICAgICAgcmV0dXJuIGZmRWxlbXM7XG4gICAgICB9XG4gICAgICAvLyBmaWx0ZXIgJiBmaW5kIGl0ZW1zIGlmIHdlIGhhdmUgYSBzZWxlY3RvclxuICAgICAgLy8gZmlsdGVyXG4gICAgICBpZiAoIGVsZW0ubWF0Y2hlcyggc2VsZWN0b3IgKSApIHtcbiAgICAgICAgZmZFbGVtcy5wdXNoKCBlbGVtICk7XG4gICAgICB9XG4gICAgICAvLyBmaW5kIGNoaWxkcmVuXG4gICAgICBsZXQgY2hpbGRFbGVtcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCggc2VsZWN0b3IgKTtcbiAgICAgIC8vIGNvbmNhdCBjaGlsZEVsZW1zIHRvIGZpbHRlckZvdW5kIGFycmF5XG4gICAgICBmZkVsZW1zID0gZmZFbGVtcy5jb25jYXQoIC4uLmNoaWxkRWxlbXMgKTtcbiAgICAgIHJldHVybiBmZkVsZW1zO1xuICAgIH0sIFtdICk7XG59O1xuXG4vLyAtLS0tLSBkZWJvdW5jZU1ldGhvZCAtLS0tLSAvL1xuXG51dGlscy5kZWJvdW5jZU1ldGhvZCA9IGZ1bmN0aW9uKCBfY2xhc3MsIG1ldGhvZE5hbWUsIHRocmVzaG9sZCApIHtcbiAgdGhyZXNob2xkID0gdGhyZXNob2xkIHx8IDEwMDtcbiAgLy8gb3JpZ2luYWwgbWV0aG9kXG4gIGxldCBtZXRob2QgPSBfY2xhc3MucHJvdG90eXBlWyBtZXRob2ROYW1lIF07XG4gIGxldCB0aW1lb3V0TmFtZSA9IG1ldGhvZE5hbWUgKyAnVGltZW91dCc7XG5cbiAgX2NsYXNzLnByb3RvdHlwZVsgbWV0aG9kTmFtZSBdID0gZnVuY3Rpb24oKSB7XG4gICAgY2xlYXJUaW1lb3V0KCB0aGlzWyB0aW1lb3V0TmFtZSBdICk7XG5cbiAgICBsZXQgYXJncyA9IGFyZ3VtZW50cztcbiAgICB0aGlzWyB0aW1lb3V0TmFtZSBdID0gc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgbWV0aG9kLmFwcGx5KCB0aGlzLCBhcmdzICk7XG4gICAgICBkZWxldGUgdGhpc1sgdGltZW91dE5hbWUgXTtcbiAgICB9LCB0aHJlc2hvbGQgKTtcbiAgfTtcbn07XG5cbi8vIC0tLS0tIGRvY1JlYWR5IC0tLS0tIC8vXG5cbnV0aWxzLmRvY1JlYWR5ID0gZnVuY3Rpb24oIG9uRG9jUmVhZHkgKSB7XG4gIGxldCByZWFkeVN0YXRlID0gZG9jdW1lbnQucmVhZHlTdGF0ZTtcbiAgaWYgKCByZWFkeVN0YXRlID09ICdjb21wbGV0ZScgfHwgcmVhZHlTdGF0ZSA9PSAnaW50ZXJhY3RpdmUnICkge1xuICAgIC8vIGRvIGFzeW5jIHRvIGFsbG93IGZvciBvdGhlciBzY3JpcHRzIHRvIHJ1bi4gbWV0YWZpenp5L2ZsaWNraXR5IzQ0MVxuICAgIHNldFRpbWVvdXQoIG9uRG9jUmVhZHkgKTtcbiAgfSBlbHNlIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnRE9NQ29udGVudExvYWRlZCcsIG9uRG9jUmVhZHkgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gaHRtbEluaXQgLS0tLS0gLy9cblxuLy8gaHR0cDovL2JpdC5seS8zb1lMdXNjXG51dGlscy50b0Rhc2hlZCA9IGZ1bmN0aW9uKCBzdHIgKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSggLyguKShbQS1aXSkvZywgZnVuY3Rpb24oIG1hdGNoLCAkMSwgJDIgKSB7XG4gICAgcmV0dXJuICQxICsgJy0nICsgJDI7XG4gIH0gKS50b0xvd2VyQ2FzZSgpO1xufTtcblxubGV0IGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZTtcblxuLy8gYWxsb3cgdXNlciB0byBpbml0aWFsaXplIGNsYXNzZXMgdmlhIFtkYXRhLW5hbWVzcGFjZV0gb3IgLmpzLW5hbWVzcGFjZSBjbGFzc1xuLy8gaHRtbEluaXQoIFdpZGdldCwgJ3dpZGdldE5hbWUnIClcbi8vIG9wdGlvbnMgYXJlIHBhcnNlZCBmcm9tIGRhdGEtbmFtZXNwYWNlLW9wdGlvbnNcbnV0aWxzLmh0bWxJbml0ID0gZnVuY3Rpb24oIFdpZGdldENsYXNzLCBuYW1lc3BhY2UgKSB7XG4gIHV0aWxzLmRvY1JlYWR5KCBmdW5jdGlvbigpIHtcbiAgICBsZXQgZGFzaGVkTmFtZXNwYWNlID0gdXRpbHMudG9EYXNoZWQoIG5hbWVzcGFjZSApO1xuICAgIGxldCBkYXRhQXR0ciA9ICdkYXRhLScgKyBkYXNoZWROYW1lc3BhY2U7XG4gICAgbGV0IGRhdGFBdHRyRWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCBgWyR7ZGF0YUF0dHJ9XWAgKTtcbiAgICBsZXQgalF1ZXJ5ID0gZ2xvYmFsLmpRdWVyeTtcblxuICAgIFsgLi4uZGF0YUF0dHJFbGVtcyBdLmZvckVhY2goICggZWxlbSApID0+IHtcbiAgICAgIGxldCBhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoIGRhdGFBdHRyICk7XG4gICAgICBsZXQgb3B0aW9ucztcbiAgICAgIHRyeSB7XG4gICAgICAgIG9wdGlvbnMgPSBhdHRyICYmIEpTT04ucGFyc2UoIGF0dHIgKTtcbiAgICAgIH0gY2F0Y2ggKCBlcnJvciApIHtcbiAgICAgICAgLy8gbG9nIGVycm9yLCBkbyBub3QgaW5pdGlhbGl6ZVxuICAgICAgICBpZiAoIGNvbnNvbGUgKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvciggYEVycm9yIHBhcnNpbmcgJHtkYXRhQXR0cn0gb24gJHtlbGVtLmNsYXNzTmFtZX06ICR7ZXJyb3J9YCApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGluaXRpYWxpemVcbiAgICAgIGxldCBpbnN0YW5jZSA9IG5ldyBXaWRnZXRDbGFzcyggZWxlbSwgb3B0aW9ucyApO1xuICAgICAgLy8gbWFrZSBhdmFpbGFibGUgdmlhICQoKS5kYXRhKCduYW1lc3BhY2UnKVxuICAgICAgaWYgKCBqUXVlcnkgKSB7XG4gICAgICAgIGpRdWVyeS5kYXRhKCBlbGVtLCBuYW1lc3BhY2UsIGluc3RhbmNlICk7XG4gICAgICB9XG4gICAgfSApO1xuXG4gIH0gKTtcbn07XG5cbi8vIC0tLS0tICAtLS0tLSAvL1xuXG5yZXR1cm4gdXRpbHM7XG5cbn0gKSApO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///47\n")},163:function(module,__unused_webpack_exports,__webpack_require__){eval("// button\n( function( window, factory ) {\n // universal module definition\n if ( true && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n __webpack_require__(717),\n __webpack_require__(47),\n );\n } else {\n // browser global\n factory(\n window,\n window.InfiniteScroll,\n window.fizzyUIUtils,\n );\n }\n\n}( window, function factory( window, InfiniteScroll, utils ) {\n\n// -------------------------- InfiniteScrollButton -------------------------- //\n\nclass InfiniteScrollButton {\n constructor( element, infScroll ) {\n this.element = element;\n this.infScroll = infScroll;\n // events\n this.clickHandler = this.onClick.bind( this );\n this.element.addEventListener( 'click', this.clickHandler );\n infScroll.on( 'request', this.disable.bind( this ) );\n infScroll.on( 'load', this.enable.bind( this ) );\n infScroll.on( 'error', this.hide.bind( this ) );\n infScroll.on( 'last', this.hide.bind( this ) );\n }\n\n onClick( event ) {\n event.preventDefault();\n this.infScroll.loadNextPage();\n }\n\n enable() {\n this.element.removeAttribute('disabled');\n }\n\n disable() {\n this.element.disabled = 'disabled';\n }\n\n hide() {\n this.element.style.display = 'none';\n }\n\n destroy() {\n this.element.removeEventListener( 'click', this.clickHandler );\n }\n\n}\n\n// -------------------------- InfiniteScroll methods -------------------------- //\n\n// InfiniteScroll.defaults.button = null;
1\n\nInfiniteScroll.create.button = function() {\n let buttonElem = utils.getQueryElement( this.options.button );\n if ( buttonElem ) {\n this.button = new InfiniteScrollButton( buttonElem, this );\n }\n};\n\nInfiniteScroll.destroy.button = function() {\n if ( this.button ) this.button.destroy();\n};\n\n// -------------------------- -------------------------- //\n\nInfiniteScroll.Button = InfiniteScrollButton;\n\nreturn InfiniteScroll;\n\n} ) );\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvbmNpbm5pdHkvLi9ub2RlX21vZHVsZXMvaW5maW5pdGUtc2Nyb2xsL2pzL2J1dHRvbi5qcz9lYzljIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGJ1dHRvblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIHJlcXVpcmUoJy4vY29yZScpLFxuICAgICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIHdpbmRvdy5JbmZpbml0ZVNjcm9sbCxcbiAgICAgICAgd2luZG93LmZpenp5VUlVdGlscyxcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBJbmZpbml0ZVNjcm9sbCwgdXRpbHMgKSB7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluZmluaXRlU2Nyb2xsQnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmNsYXNzIEluZmluaXRlU2Nyb2xsQnV0dG9uIHtcbiAgY29uc3RydWN0b3IoIGVsZW1lbnQsIGluZlNjcm9sbCApIHtcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuaW5mU2Nyb2xsID0gaW5mU2Nyb2xsO1xuICAgIC8vIGV2ZW50c1xuICAgIHRoaXMuY2xpY2tIYW5kbGVyID0gdGhpcy5vbkNsaWNrLmJpbmQoIHRoaXMgKTtcbiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgdGhpcy5jbGlja0hhbmRsZXIgKTtcbiAgICBpbmZTY3JvbGwub24oICdyZXF1ZXN0JywgdGhpcy5kaXNhYmxlLmJpbmQoIHRoaXMgKSApO1xuICAgIGluZlNjcm9sbC5vbiggJ2xvYWQnLCB0aGlzLmVuYWJsZS5iaW5kKCB0aGlzICkgKTtcbiAgICBpbmZTY3JvbGwub24oICdlcnJvcicsIHRoaXMuaGlkZS5iaW5kKCB0aGlzICkgKTtcbiAgICBpbmZTY3JvbGwub24oICdsYXN0JywgdGhpcy5oaWRlLmJpbmQoIHRoaXMgKSApO1xuICB9XG5cbiAgb25DbGljayggZXZlbnQgKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmluZlNjcm9sbC5sb2FkTmV4dFBhZ2UoKTtcbiAgfVxuXG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICB9XG5cbiAgZGlzYWJsZSgpIHtcbiAgICB0aGlzLmVsZW1lbnQuZGlzYWJsZWQgPSAnZGlzYWJsZWQnO1xuICB9XG5cbiAgaGlkZSgpIHtcbiAgICB0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdjbGljaycsIHRoaXMuY2xpY2tIYW5kbGVyICk7XG4gIH1cblxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbmZpbml0ZVNjcm9sbCBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIEluZmluaXRlU2Nyb2xsLmRlZmF1bHRzLmJ1dHRvbiA9IG51bGw7XG5cbkluZmluaXRlU2Nyb2xsLmNyZWF0ZS5idXR0b24gPSBmdW5jdGlvbigpIHtcbiAgbGV0IGJ1dHRvbkVsZW0gPSB1dGlscy5nZXRRdWVyeUVsZW1lbnQoIHRoaXMub3B0aW9ucy5idXR0b24gKTtcbiAgaWYgKCBidXR0b25FbGVtICkge1xuICAgIHRoaXMuYnV0dG9uID0gbmV3IEluZmluaXRlU2Nyb2xsQnV0dG9uKCBidXR0b25FbGVtLCB0aGlzICk7XG4gIH1cbn07XG5cbkluZmluaXRlU2Nyb2xsLmRlc3Ryb3kuYnV0dG9uID0gZnVuY3Rpb24oKSB7XG4gIGlmICggdGhpcy5idXR0b24gKSB0aGlzLmJ1dHRvbi5kZXN0cm95KCk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuSW5maW5pdGVTY3JvbGwuQnV0dG9uID0gSW5maW5pdGVTY3JvbGxCdXR0b247XG5cbnJldHVybiBJbmZpbml0ZVNjcm9sbDtcblxufSApICk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///163\n")},717:function(module,__unused_webpack_exports,__webpack_require__){eval("// core\n( function( window, factory ) {\n // universal module definition\n if ( true && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n __webpack_require__(158),\n __webpack_require__(47),\n );\n } else {\n // browser global\n window.InfiniteScroll = factory(\n window,\n window.EvEmitter,\n window.fizzyUIUtils,\n );\n }\n\n}( window, function factory( window, EvEmitter, utils ) {\n\nlet jQuery = window.jQuery;\n// internal store of all InfiniteScroll intances\nlet instances = {};\n\nfunction InfiniteScroll( element, options ) {\n let queryElem = utils.getQueryElement( element );\n\n if ( !queryElem ) {\n console.error( 'Bad element for InfiniteScroll: ' + ( queryElem || element ) );\n return;\n }\n element = queryElem;\n // do not initialize twice on same element\n if ( element.infiniteScrollGUID ) {\n let instance = instances[ element.infiniteScrollGUID ];\n instance.option( options );\n return instance;\n }\n\n this.element = element;\n // options\n this.options = { ...InfiniteScroll.defaults };\n this.option( options );\n // add jQuery\n if ( jQuery ) {\n this.$element = jQuery( this.element );\n }\n\n this.create();\n}\n\n// defaults\nInfiniteScroll.defaults = {\n // path: null,\n // hideNav: null,\n // debug: false,\n};\n\n// create & destroy methods\nInfiniteScroll.create = {};\nInfiniteScroll.destroy = {};\n\nlet proto = InfiniteScroll.prototype;\n// inherit EvEmitter\nObject.assign( proto, EvEmitter.prototype );\n\n// -------------------------- -------------------------- //\n\n// globally unique identifiers\nlet GUID = 0;
1\n\nproto.create = function() {\n // create core\n // add id for InfiniteScroll.data\n let id = this.guid = ++GUID;\n this.element.infiniteScrollGUID = id; // expando\n instances[ id ] = this; // associate via id\n // properties\n this.pageIndex = 1; // default to first page\n this.loadCount = 0;\n this.updateGetPath();\n // bail if getPath not set, or returns falsey #776\n let hasPath = this.getPath && this.getPath();\n if ( !hasPath ) {\n console.error('Disabling InfiniteScroll');\n return;\n }\n this.updateGetAbsolutePath();\n this.log( 'initialized', [ this.element.className ] );\n this.callOnInit();\n // create features\n for ( let method in InfiniteScroll.create ) {\n InfiniteScroll.create[ method ].call( this );\n }\n};\n\nproto.option = function( opts ) {\n Object.assign( this.options, opts );\n};\n\n// call onInit option, used for binding events on init\nproto.callOnInit = function() {\n let onInit = this.options.onInit;\n if ( onInit ) {\n onInit.call( this, this );\n }\n};\n\n// ----- events ----- //\n\nproto.dispatchEvent = function( type, event, args ) {\n this.log( type, args );\n let emitArgs = event ? [ event ].concat( args ) : args;\n this.emitEvent( type, emitArgs );\n // trigger jQuery event\n if ( !jQuery || !this.$element ) {\n return;\n }\n // namespace jQuery event\n type += '.infiniteScroll';\n let $event = type;\n if ( event ) {\n // create jQuery event\n /* eslint-disable-next-line new-cap */\n let jQEvent = jQuery.Event( event );\n jQEvent.type = type;\n $event = jQEvent;\n }\n this.$element.trigger( $event, args );\n};\n\nlet loggers = {\n initialized: ( className ) => `on ${className}`,\n request: ( path ) => `URL: ${path}`,\n load: ( response, path ) => `${response.title || ''}. URL: ${path}`,\n error: ( error, path ) => `${error}. URL: ${path}`,\n append: ( response, path, items ) => `${items.length} items. URL: ${path}`,\n last: ( response, path ) => `URL: ${path}`,\n history: ( title, path ) => `URL: ${path}`,\n pageIndex: function( index, origin ) {\n return `current page determined to be: ${index} from ${origin}`;\n },\n};\n\n// log events\nproto.log = function( type, args ) {\n if ( !this.options.debug ) return;\n\n let message = `[InfiniteScroll] ${type}`;\n let logger = loggers[ type ];\n if ( logger ) message += '. ' + logger.apply( this, args );\n console.log( message );\n};\n\n// -------------------------- methods used amoung features -------------------------- //\n\nproto.updateMeasurements = function() {\n this.windowHeight = window.innerHeight;\n let rect = this.element.getBoundingClientRect();\n this.top = rect.top + window.scrollY;\n};\n\nproto.updateScroller = function() {\n let elementScroll = this.options.elementScroll;\n if ( !elementScroll ) {\n // default, use window\n this.scroller = window;\n return;\n }\n // if true, set to element, otherwise use option\n this.scroller = elementScroll === true ? this.element :\n utils.getQueryElement( elementScroll );\n if ( !this.scroller ) {\n throw new Error(`Unable to find elementScroll: ${elementScroll}`);\n }\n};\n\n// -------------------------- page path -------------------------- //\n\nproto.updateGetPath = function() {\n let optPath = this.options.path;\n if ( !optPath ) {\n console.error(`InfiniteScroll path option required. Set as: ${optPath}`);\n return;\n }\n // function\n let type = typeof optPath;\n if ( type == 'function' ) {\n this.getPath = optPath;\n return;\n }\n // template string: '/pages/{{#}}.html'\n let templateMatch = type == 'string' && optPath.match('{{#}}');\n if ( templateMatch ) {\n this.updateGetPathTemplate( optPath );\n return;\n }\n // selector: '.next-page-selector'\n this.updateGetPathSelector( optPath );\n};\n\nproto.updateGetPathTemplate = function( optPath ) {\n // set getPath with template string\n this.getPath = () => {\n let nextIndex = this.pageIndex + 1;\n return optPath.replace( '{{#}}', nextIndex );\n };\n // get pageIndex from location\n // convert path option into regex to look for pattern in location\n // escape query (?) in url, allows for parsing GET parameters\n let regexString = optPath\n .replace( /(\\\\\\?|\\?)/, '\\\\?' )\n .replace( '{{#}}', '(\\\\d\\\\d?\\\\d?)' );\n let templateRe = new RegExp( regexString );\n let match = location.href.match( templateRe );\n\n if ( match ) {\n this.pageIndex = parseInt( match[1], 10 );\n this.log( 'pageIndex', [ this.pageIndex, 'template string' ] );\n }\n};\n\nlet pathRegexes = [\n // WordPress & Tumblr - example.com/page/2\n // Jekyll - example.com/page2\n /^(.*?\\/?page\\/?)(\\d\\d?\\d?)(.*?$)/,\n // Drupal - example.com/?page=1\n /^(.*?\\/?\\?page=)(\\d\\d?\\d?)(.*?$)/,\n // catch all, last occurence of a number\n /(.*?)(\\d\\d?\\d?)(?!.*\\d)(.*?$)/,\n];\n\n// try matching href to pathRegexes patterns\nlet getPathParts = InfiniteScroll.getPathParts = function( href ) {\n if ( !href ) return;\n for ( let regex of pathRegexes ) {\n let match = href.match( regex );\n if ( match ) {\n let [ , begin, index, end ] = match;\n return { begin, index, end };\n }\n }\n};\n\nproto.updateGetPathSelector = function( optPath ) {\n // parse href of link: '.next-page-link'\n let hrefElem = document.querySelector( optPath );\n if ( !hrefElem ) {\n console.error(`Bad InfiniteScroll path option. Next link not found: ${optPath}`);\n return;\n }\n\n let href = hrefElem.getAttribute('href');\n let pathParts = getPathParts( href );\n if ( !pathParts ) {\n console.error(`InfiniteScroll unable to parse next link href: ${href}`);\n return;\n }\n\n let { begin, index, end } = pathParts;\n this.isPathSelector = true; // flag for checkLastPage()\n this.getPath = () => begin + ( this.pageIndex + 1 ) + end;\n // get pageIndex from href\n this.pageIndex = parseInt( index, 10 ) - 1;\n this.log( 'pageIndex', [ this.pageIndex, 'next link' ] );\n};
1\n\nproto.updateGetAbsolutePath = function() {\n let path = this.getPath();\n // path doesn't start with http or /\n let isAbsolute = path.match( /^http/ ) || path.match( /^\\// );\n if ( isAbsolute ) {\n this.getAbsolutePath = this.getPath;\n return;\n }\n\n let { pathname } = location;\n // query parameter #829. example.com/?pg=2\n let isQuery = path.match( /^\\?/ );\n // /foo/bar/index.html => /foo/bar\n let directory = pathname.substring( 0, pathname.lastIndexOf('/') );\n let pathStart = isQuery ? pathname : directory + '/';\n\n this.getAbsolutePath = () => pathStart + this.getPath();\n};\n\n// -------------------------- nav -------------------------- //\n\n// hide navigation\nInfiniteScroll.create.hideNav = function() {\n let nav = utils.getQueryElement( this.options.hideNav );\n if ( !nav ) return;\n\n nav.style.display = 'none';\n this.nav = nav;\n};\n\nInfiniteScroll.destroy.hideNav = function() {\n if ( this.nav ) this.nav.style.display = '';\n};\n\n// -------------------------- destroy -------------------------- //\n\nproto.destroy = function() {\n this.allOff(); // remove all event listeners\n // call destroy methods\n for ( let method in InfiniteScroll.destroy ) {\n InfiniteScroll.destroy[ method ].call( this );\n }\n\n delete this.element.infiniteScrollGUID;\n delete instances[ this.guid ];\n // remove jQuery data. #807\n if ( jQuery && this.$element ) {\n jQuery.removeData( this.element, 'infiniteScroll' );\n }\n};\n\n// -------------------------- utilities -------------------------- //\n\n// https://remysharp.com/2010/07/21/throttling-function-calls\nInfiniteScroll.throttle = function( fn, threshold ) {\n threshold = threshold || 200;\n let last, timeout;\n\n return function() {\n let now = +new Date();\n let args = arguments;\n let trigger = () => {\n last = now;\n fn.apply( this, args );\n };\n if ( last && now < last + threshold ) {\n // hold on to it\n clearTimeout( timeout );\n timeout = setTimeout( trigger, threshold );\n } else {\n trigger();\n }\n };\n};\n\nInfiniteScroll.data = function( elem ) {\n elem = utils.getQueryElement( elem );\n let id = elem && elem.infiniteScrollGUID;\n return id && instances[ id ];\n};\n\n// set internal jQuery, for Webpack + jQuery v3\nInfiniteScroll.setJQuery = function( jqry ) {\n jQuery = jqry;\n};\n\n// -------------------------- setup -------------------------- //\n\nutils.htmlInit( InfiniteScroll, 'infinite-scroll' );\n\n// add noop _init method for jQuery Bridget. #768\nproto._init = function() {};\n\nlet { jQueryBridget } = window;\nif ( jQuery && jQueryBridget ) {\n jQueryBridget( 'infiniteScroll', InfiniteScroll, jQuery );\n}\n\n// -------------------------- -------------------------- //\n\nreturn InfiniteScroll;\n\n} ) );\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzE3LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb25jaW5uaXR5Ly4vbm9kZV9tb2R1bGVzL2luZmluaXRlLXNjcm9sbC9qcy9jb3JlLmpzPzI4YjUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gY29yZVxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgI
1HJlcXVpcmUoJ2V2LWVtaXR0ZXInKSxcbiAgICAgICAgcmVxdWlyZSgnZml6enktdWktdXRpbHMnKSxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LkluZmluaXRlU2Nyb2xsID0gZmFjdG9yeShcbiAgICAgICAgd2luZG93LFxuICAgICAgICB3aW5kb3cuRXZFbWl0dGVyLFxuICAgICAgICB3aW5kb3cuZml6enlVSVV0aWxzLFxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciwgdXRpbHMgKSB7XG5cbmxldCBqUXVlcnkgPSB3aW5kb3cualF1ZXJ5O1xuLy8gaW50ZXJuYWwgc3RvcmUgb2YgYWxsIEluZmluaXRlU2Nyb2xsIGludGFuY2VzXG5sZXQgaW5zdGFuY2VzID0ge307XG5cbmZ1bmN0aW9uIEluZmluaXRlU2Nyb2xsKCBlbGVtZW50LCBvcHRpb25zICkge1xuICBsZXQgcXVlcnlFbGVtID0gdXRpbHMuZ2V0UXVlcnlFbGVtZW50KCBlbGVtZW50ICk7XG5cbiAgaWYgKCAhcXVlcnlFbGVtICkge1xuICAgIGNvbnNvbGUuZXJyb3IoICdCYWQgZWxlbWVudCBmb3IgSW5maW5pdGVTY3JvbGw6ICcgKyAoIHF1ZXJ5RWxlbSB8fCBlbGVtZW50ICkgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgZWxlbWVudCA9IHF1ZXJ5RWxlbTtcbiAgLy8gZG8gbm90IGluaXRpYWxpemUgdHdpY2Ugb24gc2FtZSBlbGVtZW50XG4gIGlmICggZWxlbWVudC5pbmZpbml0ZVNjcm9sbEdVSUQgKSB7XG4gICAgbGV0IGluc3RhbmNlID0gaW5zdGFuY2VzWyBlbGVtZW50LmluZmluaXRlU2Nyb2xsR1VJRCBdO1xuICAgIGluc3RhbmNlLm9wdGlvbiggb3B0aW9ucyApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gIC8vIG9wdGlvbnNcbiAgdGhpcy5vcHRpb25zID0geyAuLi5JbmZpbml0ZVNjcm9sbC5kZWZhdWx0cyB9O1xuICB0aGlzLm9wdGlvbiggb3B0aW9ucyApO1xuICAvLyBhZGQgalF1ZXJ5XG4gIGlmICggalF1ZXJ5ICkge1xuICAgIHRoaXMuJGVsZW1lbnQgPSBqUXVlcnkoIHRoaXMuZWxlbWVudCApO1xuICB9XG5cbiAgdGhpcy5jcmVhdGUoKTtcbn1cblxuLy8gZGVmYXVsdHNcbkluZmluaXRlU2Nyb2xsLmRlZmF1bHRzID0ge1xuICAvLyBwYXRoOiBudWxsLFxuICAvLyBoaWRlTmF2OiBudWxsLFxuICAvLyBkZWJ1ZzogZmFsc2UsXG59O1xuXG4vLyBjcmVhdGUgJiBkZXN0cm95IG1ldGhvZHNcbkluZmluaXRlU2Nyb2xsLmNyZWF0ZSA9IHt9O1xuSW5maW5pdGVTY3JvbGwuZGVzdHJveSA9IHt9O1xuXG5sZXQgcHJvdG8gPSBJbmZpbml0ZVNjcm9sbC5wcm90b3R5cGU7XG4vLyBpbmhlcml0IEV2RW1pdHRlclxuT2JqZWN0LmFzc2lnbiggcHJvdG8sIEV2RW1pdHRlci5wcm90b3R5cGUgKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGdsb2JhbGx5IHVuaXF1ZSBpZGVudGlmaWVyc1xubGV0IEdVSUQgPSAwO1xuXG5wcm90by5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gY3JlYXRlIGNvcmVcbiAgLy8gYWRkIGlkIGZvciBJbmZpbml0ZVNjcm9sbC5kYXRhXG4gIGxldCBpZCA9IHRoaXMuZ3VpZCA9ICsrR1VJRDtcbiAgdGhpcy5lbGVtZW50LmluZmluaXRlU2Nyb2xsR1VJRCA9IGlkOyAvLyBleHBhbmRvXG4gIGluc3RhbmNlc1sgaWQgXSA9IHRoaXM7IC8vIGFzc29jaWF0ZSB2aWEgaWRcbiAgLy8gcHJvcGVydGllc1xuICB0aGlzLnBhZ2VJbmRleCA9IDE7IC8vIGRlZmF1bHQgdG8gZmlyc3QgcGFnZVxuICB0aGlzLmxvYWRDb3VudCA9IDA7XG4gIHRoaXMudXBkYXRlR2V0UGF0aCgpO1xuICAvLyBiYWlsIGlmIGdldFBhdGggbm90IHNldCwgb3IgcmV0dXJucyBmYWxzZXkgIzc3NlxuICBsZXQgaGFzUGF0aCA9IHRoaXMuZ2V0UGF0aCAmJiB0aGlzLmdldFBhdGgoKTtcbiAgaWYgKCAhaGFzUGF0aCApIHtcbiAgICBjb25zb2xlLmVycm9yKCdEaXNhYmxpbmcgSW5maW5pdGVTY3JvbGwnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy51cGRhdGVHZXRBYnNvbHV0ZVBhdGgoKTtcbiAgdGhpcy5sb2coICdpbml0aWFsaXplZCcsIFsgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSBdICk7XG4gIHRoaXMuY2FsbE9uSW5pdCgpO1xuICAvLyBjcmVhdGUgZmVhdHVyZXNcbiAgZm9yICggbGV0IG1ldGhvZCBpbiBJbmZpbml0ZVNjcm9sbC5jcmVhdGUgKSB7XG4gICAgSW5maW5pdGVTY3JvbGwuY3JlYXRlWyBtZXRob2QgXS5jYWxsKCB0aGlzICk7XG4gIH1cbn07XG5cbnByb3RvLm9wdGlvbiA9IGZ1bmN0aW9uKCBvcHRzICkge1xuICBPYmplY3QuYXNzaWduKCB0aGlzLm9wdGlvbnMsIG9wdHMgKTtcbn07XG5cbi8vIGNhbGwgb25Jbml0IG9wdGlvbiwgdXNlZCBmb3IgYmluZGluZyBldmVudHMgb24gaW5pdFxucHJvdG8uY2FsbE9uSW5pdCA9IGZ1bmN0aW9uKCkge1xuICBsZXQgb25Jbml0ID0gdGhpcy5vcHRpb25zLm9uSW5pdDtcbiAgaWYgKCBvbkluaXQgKSB7XG4gICAgb25Jbml0LmNhbGwoIHRoaXMsIHRoaXMgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gZXZlbnRzIC0tLS0tIC8vXG5cbnByb3RvLmRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGFyZ3MgKSB7XG4gIHRoaXMubG9nKCB0eXBlLCBhcmdzICk7XG4gIGxldCBlbWl0QXJncyA9IGV2ZW50ID8gWyBldmVudCBdLmNvbmNhdCggYXJncyApIDogYXJncztcbiAgdGhpcy5lbWl0RXZlbnQoIHR5cGUsIGVtaXRBcmdzICk7XG4gIC8vIHRyaWdnZXIgalF1ZXJ5IGV2ZW50XG4gIGlmICggIWpRdWVyeSB8fCAhdGhpcy4kZWxlbWVudCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gbmFtZXNwYWNlIGpRdWVyeSBldmVudFxuICB0eXBlICs9ICcuaW5maW5pdGVTY3JvbGwnO1xuICBsZXQgJGV2ZW50ID0gdHlwZTtcbiAgaWYgKCBldmVudCApIHtcbiAgICAvLyBjcmVhdGUgalF1ZXJ5IGV2ZW50XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXAgKi9cbiAgICBsZXQgalFFdmVudCA9IGpRdWVyeS5FdmVudCggZXZlbnQgKTtcbiAgICBqUUV2ZW50LnR5cGUgPSB0eXBlO1xuICAgICRldmVudCA9IGpRRXZlbnQ7XG4gIH1cbiAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCAkZXZlbnQsIGFyZ3MgKTtcbn07XG5cbmxldCBsb2dnZXJzID0ge1xuICBpbml0aWFsaXplZDogKCBjbGFzc05hbWUgKSA9PiBgb24gJHtjbGFzc05hbWV9YCxcbiAgcmVx
1dWVzdDogKCBwYXRoICkgPT4gYFVSTDogJHtwYXRofWAsXG4gIGxvYWQ6ICggcmVzcG9uc2UsIHBhdGggKSA9PiBgJHtyZXNwb25zZS50aXRsZSB8fCAnJ30uIFVSTDogJHtwYXRofWAsXG4gIGVycm9yOiAoIGVycm9yLCBwYXRoICkgPT4gYCR7ZXJyb3J9LiBVUkw6ICR7cGF0aH1gLFxuICBhcHBlbmQ6ICggcmVzcG9uc2UsIHBhdGgsIGl0ZW1zICkgPT4gYCR7aXRlbXMubGVuZ3RofSBpdGVtcy4gVVJMOiAke3BhdGh9YCxcbiAgbGFzdDogKCByZXNwb25zZSwgcGF0aCApID0+IGBVUkw6ICR7cGF0aH1gLFxuICBoaXN0b3J5OiAoIHRpdGxlLCBwYXRoICkgPT4gYFVSTDogJHtwYXRofWAsXG4gIHBhZ2VJbmRleDogZnVuY3Rpb24oIGluZGV4LCBvcmlnaW4gKSB7XG4gICAgcmV0dXJuIGBjdXJyZW50IHBhZ2UgZGV0ZXJtaW5lZCB0byBiZTogJHtpbmRleH0gZnJvbSAke29yaWdpbn1gO1xuICB9LFxufTtcblxuLy8gbG9nIGV2ZW50c1xucHJvdG8ubG9nID0gZnVuY3Rpb24oIHR5cGUsIGFyZ3MgKSB7XG4gIGlmICggIXRoaXMub3B0aW9ucy5kZWJ1ZyApIHJldHVybjtcblxuICBsZXQgbWVzc2FnZSA9IGBbSW5maW5pdGVTY3JvbGxdICR7dHlwZX1gO1xuICBsZXQgbG9nZ2VyID0gbG9nZ2Vyc1sgdHlwZSBdO1xuICBpZiAoIGxvZ2dlciApIG1lc3NhZ2UgKz0gJy4gJyArIGxvZ2dlci5hcHBseSggdGhpcywgYXJncyApO1xuICBjb25zb2xlLmxvZyggbWVzc2FnZSApO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWV0aG9kcyB1c2VkIGFtb3VuZyBmZWF0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5wcm90by51cGRhdGVNZWFzdXJlbWVudHMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy53aW5kb3dIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gIGxldCByZWN0ID0gdGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB0aGlzLnRvcCA9IHJlY3QudG9wICsgd2luZG93LnNjcm9sbFk7XG59O1xuXG5wcm90by51cGRhdGVTY3JvbGxlciA9IGZ1bmN0aW9uKCkge1xuICBsZXQgZWxlbWVudFNjcm9sbCA9IHRoaXMub3B0aW9ucy5lbGVtZW50U2Nyb2xsO1xuICBpZiAoICFlbGVtZW50U2Nyb2xsICkge1xuICAgIC8vIGRlZmF1bHQsIHVzZSB3aW5kb3dcbiAgICB0aGlzLnNjcm9sbGVyID0gd2luZG93O1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBpZiB0cnVlLCBzZXQgdG8gZWxlbWVudCwgb3RoZXJ3aXNlIHVzZSBvcHRpb25cbiAgdGhpcy5zY3JvbGxlciA9IGVsZW1lbnRTY3JvbGwgPT09IHRydWUgPyB0aGlzLmVsZW1lbnQgOlxuICAgIHV0aWxzLmdldFF1ZXJ5RWxlbWVudCggZWxlbWVudFNjcm9sbCApO1xuICBpZiAoICF0aGlzLnNjcm9sbGVyICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgZWxlbWVudFNjcm9sbDogJHtlbGVtZW50U2Nyb2xsfWApO1xuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwYWdlIHBhdGggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucHJvdG8udXBkYXRlR2V0UGF0aCA9IGZ1bmN0aW9uKCkge1xuICBsZXQgb3B0UGF0aCA9IHRoaXMub3B0aW9ucy5wYXRoO1xuICBpZiAoICFvcHRQYXRoICkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEluZmluaXRlU2Nyb2xsIHBhdGggb3B0aW9uIHJlcXVpcmVkLiBTZXQgYXM6ICR7b3B0UGF0aH1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gZnVuY3Rpb25cbiAgbGV0IHR5cGUgPSB0eXBlb2Ygb3B0UGF0aDtcbiAgaWYgKCB0eXBlID09ICdmdW5jdGlvbicgKSB7XG4gICAgdGhpcy5nZXRQYXRoID0gb3B0UGF0aDtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gdGVtcGxhdGUgc3RyaW5nOiAnL3BhZ2VzL3t7I319Lmh0bWwnXG4gIGxldCB0ZW1wbGF0ZU1hdGNoID0gdHlwZSA9PSAnc3RyaW5nJyAmJiBvcHRQYXRoLm1hdGNoKCd7eyN9fScpO1xuICBpZiAoIHRlbXBsYXRlTWF0Y2ggKSB7XG4gICAgdGhpcy51cGRhdGVHZXRQYXRoVGVtcGxhdGUoIG9wdFBhdGggKTtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gc2VsZWN0b3I6ICcubmV4dC1wYWdlLXNlbGVjdG9yJ1xuICB0aGlzLnVwZGF0ZUdldFBhdGhTZWxlY3Rvciggb3B0UGF0aCApO1xufTtcblxucHJvdG8udXBkYXRlR2V0UGF0aFRlbXBsYXRlID0gZnVuY3Rpb24oIG9wdFBhdGggKSB7XG4gIC8vIHNldCBnZXRQYXRoIHdpdGggdGVtcGxhdGUgc3RyaW5nXG4gIHRoaXMuZ2V0UGF0aCA9ICgpID0+IHtcbiAgICBsZXQgbmV4dEluZGV4ID0gdGhpcy5wYWdlSW5kZXggKyAxO1xuICAgIHJldHVybiBvcHRQYXRoLnJlcGxhY2UoICd7eyN9fScsIG5leHRJbmRleCApO1xuICB9O1xuICAvLyBnZXQgcGFnZUluZGV4IGZyb20gbG9jYXRpb25cbiAgLy8gY29udmVydCBwYXRoIG9wdGlvbiBpbnRvIHJlZ2V4IHRvIGxvb2sgZm9yIHBhdHRlcm4gaW4gbG9jYXRpb25cbiAgLy8gZXNjYXBlIHF1ZXJ5ICg/KSBpbiB1cmwsIGFsbG93cyBmb3IgcGFyc2luZyBHRVQgcGFyYW1ldGVyc1xuICBsZXQgcmVnZXhTdHJpbmcgPSBvcHRQYXRoXG4gICAgLnJlcGxhY2UoIC8oXFxcXFxcP3xcXD8pLywgJ1xcXFw/JyApXG4gICAgLnJlcGxhY2UoICd7eyN9fScsICcoXFxcXGRcXFxcZD9cXFxcZD8pJyApO1xuICBsZXQgdGVtcGxhdGVSZSA9IG5ldyBSZWdFeHAoIHJlZ2V4U3RyaW5nICk7XG4gIGxldCBtYXRjaCA9IGxvY2F0aW9uLmhyZWYubWF0Y2goIHRlbXBsYXRlUmUgKTtcblxuICBpZiAoIG1hdGNoICkge1xuICAgIHRoaXMucGFnZUluZGV4ID0gcGFyc2VJbnQoIG1hdGNoWzFdLCAxMCApO1xuICAgIHRoaXMubG9nKCAncGFnZUluZGV4JywgWyB0aGlzLnBhZ2VJbmRleCwgJ3RlbXBsYXRlIHN0cmluZycgXSApO1xuICB9XG59O1xuXG5sZXQgcGF0aFJlZ2V4ZXMgPSBbXG4gIC8vIFdvcmRQcmVzcyAmIFR1bWJsciAtIGV4YW1wbGUuY29tL3BhZ2UvMlxuICAvLyBKZWt5bGwgLSBleGFtcGxlLmNvbS9wYWdlMlxuICAvXiguKj9cXC8/cGFnZVxcLz8pKFxcZFxcZD9cXGQ/KSguKj8kKS8sXG4gIC8vIERydXBhbCAtIGV4YW1wbGUuY29tLz9wYWdlPTFcbiAgL14oLio/XFwvP1xcP3BhZ2U9KShcXGRcXGQ/XFxkPykoLio/JCkvLFxuICAvLyBjYXRjaCBhbGwsIGxhc3Qgb2NjdXJlbmNlIG9mIGEgbnVtYmVyXG4gIC8oLio/KS
1hcXGRcXGQ/XFxkPykoPyEuKlxcZCkoLio/JCkvLFxuXTtcblxuLy8gdHJ5IG1hdGNoaW5nIGhyZWYgdG8gcGF0aFJlZ2V4ZXMgcGF0dGVybnNcbmxldCBnZXRQYXRoUGFydHMgPSBJbmZpbml0ZVNjcm9sbC5nZXRQYXRoUGFydHMgPSBmdW5jdGlvbiggaHJlZiApIHtcbiAgaWYgKCAhaHJlZiApIHJldHVybjtcbiAgZm9yICggbGV0IHJlZ2V4IG9mIHBhdGhSZWdleGVzICkge1xuICAgIGxldCBtYXRjaCA9IGhyZWYubWF0Y2goIHJlZ2V4ICk7XG4gICAgaWYgKCBtYXRjaCApIHtcbiAgICAgIGxldCBbICwgYmVnaW4sIGluZGV4LCBlbmQgXSA9IG1hdGNoO1xuICAgICAgcmV0dXJuIHsgYmVnaW4sIGluZGV4LCBlbmQgfTtcbiAgICB9XG4gIH1cbn07XG5cbnByb3RvLnVwZGF0ZUdldFBhdGhTZWxlY3RvciA9IGZ1bmN0aW9uKCBvcHRQYXRoICkge1xuICAvLyBwYXJzZSBocmVmIG9mIGxpbms6ICcubmV4dC1wYWdlLWxpbmsnXG4gIGxldCBocmVmRWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIG9wdFBhdGggKTtcbiAgaWYgKCAhaHJlZkVsZW0gKSB7XG4gICAgY29uc29sZS5lcnJvcihgQmFkIEluZmluaXRlU2Nyb2xsIHBhdGggb3B0aW9uLiBOZXh0IGxpbmsgbm90IGZvdW5kOiAke29wdFBhdGh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGhyZWYgPSBocmVmRWxlbS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgbGV0IHBhdGhQYXJ0cyA9IGdldFBhdGhQYXJ0cyggaHJlZiApO1xuICBpZiAoICFwYXRoUGFydHMgKSB7XG4gICAgY29uc29sZS5lcnJvcihgSW5maW5pdGVTY3JvbGwgdW5hYmxlIHRvIHBhcnNlIG5leHQgbGluayBocmVmOiAke2hyZWZ9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHsgYmVnaW4sIGluZGV4LCBlbmQgfSA9IHBhdGhQYXJ0cztcbiAgdGhpcy5pc1BhdGhTZWxlY3RvciA9IHRydWU7IC8vIGZsYWcgZm9yIGNoZWNrTGFzdFBhZ2UoKVxuICB0aGlzLmdldFBhdGggPSAoKSA9PiBiZWdpbiArICggdGhpcy5wYWdlSW5kZXggKyAxICkgKyBlbmQ7XG4gIC8vIGdldCBwYWdlSW5kZXggZnJvbSBocmVmXG4gIHRoaXMucGFnZUluZGV4ID0gcGFyc2VJbnQoIGluZGV4LCAxMCApIC0gMTtcbiAgdGhpcy5sb2coICdwYWdlSW5kZXgnLCBbIHRoaXMucGFnZUluZGV4LCAnbmV4dCBsaW5rJyBdICk7XG59O1xuXG5wcm90by51cGRhdGVHZXRBYnNvbHV0ZVBhdGggPSBmdW5jdGlvbigpIHtcbiAgbGV0IHBhdGggPSB0aGlzLmdldFBhdGgoKTtcbiAgLy8gcGF0aCBkb2Vzbid0IHN0YXJ0IHdpdGggaHR0cCBvciAvXG4gIGxldCBpc0Fic29sdXRlID0gcGF0aC5tYXRjaCggL15odHRwLyApIHx8IHBhdGgubWF0Y2goIC9eXFwvLyApO1xuICBpZiAoIGlzQWJzb2x1dGUgKSB7XG4gICAgdGhpcy5nZXRBYnNvbHV0ZVBhdGggPSB0aGlzLmdldFBhdGg7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHsgcGF0aG5hbWUgfSA9IGxvY2F0aW9uO1xuICAvLyBxdWVyeSBwYXJhbWV0ZXIgIzgyOS4gZXhhbXBsZS5jb20vP3BnPTJcbiAgbGV0IGlzUXVlcnkgPSBwYXRoLm1hdGNoKCAvXlxcPy8gKTtcbiAgLy8gL2Zvby9iYXIvaW5kZXguaHRtbCA9PiAvZm9vL2JhclxuICBsZXQgZGlyZWN0b3J5ID0gcGF0aG5hbWUuc3Vic3RyaW5nKCAwLCBwYXRobmFtZS5sYXN0SW5kZXhPZignLycpICk7XG4gIGxldCBwYXRoU3RhcnQgPSBpc1F1ZXJ5ID8gcGF0aG5hbWUgOiBkaXJlY3RvcnkgKyAnLyc7XG5cbiAgdGhpcy5nZXRBYnNvbHV0ZVBhdGggPSAoKSA9PiBwYXRoU3RhcnQgKyB0aGlzLmdldFBhdGgoKTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG5hdiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyBoaWRlIG5hdmlnYXRpb25cbkluZmluaXRlU2Nyb2xsLmNyZWF0ZS5oaWRlTmF2ID0gZnVuY3Rpb24oKSB7XG4gIGxldCBuYXYgPSB1dGlscy5nZXRRdWVyeUVsZW1lbnQoIHRoaXMub3B0aW9ucy5oaWRlTmF2ICk7XG4gIGlmICggIW5hdiApIHJldHVybjtcblxuICBuYXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgdGhpcy5uYXYgPSBuYXY7XG59O1xuXG5JbmZpbml0ZVNjcm9sbC5kZXN0cm95LmhpZGVOYXYgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLm5hdiApIHRoaXMubmF2LnN0eWxlLmRpc3BsYXkgPSAnJztcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlc3Ryb3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucHJvdG8uZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmFsbE9mZigpOyAvLyByZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVyc1xuICAvLyBjYWxsIGRlc3Ryb3kgbWV0aG9kc1xuICBmb3IgKCBsZXQgbWV0aG9kIGluIEluZmluaXRlU2Nyb2xsLmRlc3Ryb3kgKSB7XG4gICAgSW5maW5pdGVTY3JvbGwuZGVzdHJveVsgbWV0aG9kIF0uY2FsbCggdGhpcyApO1xuICB9XG5cbiAgZGVsZXRlIHRoaXMuZWxlbWVudC5pbmZpbml0ZVNjcm9sbEdVSUQ7XG4gIGRlbGV0ZSBpbnN0YW5jZXNbIHRoaXMuZ3VpZCBdO1xuICAvLyByZW1vdmUgalF1ZXJ5IGRhdGEuICM4MDdcbiAgaWYgKCBqUXVlcnkgJiYgdGhpcy4kZWxlbWVudCApIHtcbiAgICBqUXVlcnkucmVtb3ZlRGF0YSggdGhpcy5lbGVtZW50LCAnaW5maW5pdGVTY3JvbGwnICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHV0aWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyBodHRwczovL3JlbXlzaGFycC5jb20vMjAxMC8wNy8yMS90aHJvdHRsaW5nLWZ1bmN0aW9uLWNhbGxzXG5JbmZpbml0ZVNjcm9sbC50aHJvdHRsZSA9IGZ1bmN0aW9uKCBmbiwgdGhyZXNob2xkICkge1xuICB0aHJlc2hvbGQgPSB0aHJlc2hvbGQgfHwgMjAwO1xuICBsZXQgbGFzdCwgdGltZW91dDtcblxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgbGV0IG5vdyA9ICtuZXcgRGF0ZSgpO1xuICAgIGxldCBhcmdzID0gYXJndW1lbnRzO1xuICAgIGxldCB0cmlnZ2VyID0gKCkgPT4ge1xuICAgICAgbGFzdCA9IG5vdztcbiAgICAgIGZuLmFwcGx5KCB0aGlzLCBhcmdzICk7XG4gICAgfTtcbiAgICBpZiAoIGxhc3QgJiYgbm93IDwgbGFzdCArIHRocmVzaG9sZCApIHtcbiAgICAgIC8vIGhvbGQgb24gdG8gaXRcbiAgICAgIGNsZWFyVGltZW91dCggdGltZW91dCApO1xuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoIHRyaWdnZXIsIHR
1ocmVzaG9sZCApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyKCk7XG4gICAgfVxuICB9O1xufTtcblxuSW5maW5pdGVTY3JvbGwuZGF0YSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICBlbGVtID0gdXRpbHMuZ2V0UXVlcnlFbGVtZW50KCBlbGVtICk7XG4gIGxldCBpZCA9IGVsZW0gJiYgZWxlbS5pbmZpbml0ZVNjcm9sbEdVSUQ7XG4gIHJldHVybiBpZCAmJiBpbnN0YW5jZXNbIGlkIF07XG59O1xuXG4vLyBzZXQgaW50ZXJuYWwgalF1ZXJ5LCBmb3IgV2VicGFjayArIGpRdWVyeSB2M1xuSW5maW5pdGVTY3JvbGwuc2V0SlF1ZXJ5ID0gZnVuY3Rpb24oIGpxcnkgKSB7XG4gIGpRdWVyeSA9IGpxcnk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG51dGlscy5odG1sSW5pdCggSW5maW5pdGVTY3JvbGwsICdpbmZpbml0ZS1zY3JvbGwnICk7XG5cbi8vIGFkZCBub29wIF9pbml0IG1ldGhvZCBmb3IgalF1ZXJ5IEJyaWRnZXQuICM3NjhcbnByb3RvLl9pbml0ID0gZnVuY3Rpb24oKSB7fTtcblxubGV0IHsgalF1ZXJ5QnJpZGdldCB9ID0gd2luZG93O1xuaWYgKCBqUXVlcnkgJiYgalF1ZXJ5QnJpZGdldCApIHtcbiAgalF1ZXJ5QnJpZGdldCggJ2luZmluaXRlU2Nyb2xsJywgSW5maW5pdGVTY3JvbGwsIGpRdWVyeSApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucmV0dXJuIEluZmluaXRlU2Nyb2xsO1xuXG59ICkgKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///717\n")},774:function(module,__unused_webpack_exports,__webpack_require__){eval("// history\n( function( window, factory ) {\n // universal module definition\n if ( true && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n __webpack_require__(717),\n __webpack_require__(47),\n );\n } else {\n // browser global\n factory(\n window,\n window.InfiniteScroll,\n window.fizzyUIUtils,\n );\n }\n\n}( window, function factory( window, InfiniteScroll, utils ) {\n\nlet proto = InfiniteScroll.prototype;\n\nObject.assign( InfiniteScroll.defaults, {\n history: 'replace',\n // historyTitle: false,\n} );\n\nlet link = document.createElement('a');\n\n// ----- create/destroy ----- //\n\nInfiniteScroll.create.history = function() {\n if ( !this.options.history ) return;\n\n // check for same origin\n link.href = this.getAbsolutePath();\n // MS Edge does not have origin on link\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12236493/\n let linkOrigin = link.origin || link.protocol + '//' + link.host;\n let isSameOrigin = linkOrigin == location.origin;\n if ( !isSameOrigin ) {\n console.error( '[InfiniteScroll] cannot set history with different origin: ' +\n `${link.origin} on ${location.origin} . History behavior disabled.` );\n return;\n }\n\n // two ways to handle changing history\n if ( this.options.append ) {\n this.createHistoryAppend();\n } else {\n this.createHistoryPageLoad();\n }\n};\n\nproto.createHistoryAppend = function() {\n this.updateMeasurements();\n this.updateScroller();\n // array of scroll positions of appended pages\n this.scrollPages = [\n // first page\n {\n top: 0,\n path: location.href,\n title: document.title,\n },\n ];\n this.scrollPage = this.scrollPages[0];\n // events\n this.scrollHistoryHandler = this.onScrollHistory.bind( this );\n this.unloadHandler = this.onUnload.bind( this );\n this.scroller.addEventListener( 'scroll', this.scrollHistoryHandler );\n this.on( 'append', this.onAppendHistory );\n this.bindHistoryAppendEvents( true );\n};\n\nproto.bindHistoryAppendEvents = function( isBind ) {\n let addRemove = isBind ? 'addEventListener' : 'removeEventListener';\n this.scroller[ addRemove ]( 'scroll', this.scrollHistoryHandler );\n window[ addRemove ]( 'unload', this.unloadHandler );\n};\n\nproto.createHistoryPageLoad = function() {\n this.on( 'load', this.onPageLoadHistory );\n};\n\nInfiniteScroll.destroy.history =\nproto.destroyHistory = function() {\n let isHistoryAppend = this.options.history && this.options.append;\n if ( isHistoryAppend ) {\n this.bindHistoryAppendEvents( false );\n }\n};\n\n// ----- append history ----- //\n\nproto.onAppendHistory = function( response, path, items ) {\n // do not proceed if no items. #779\n if ( !items || !items.length ) return;\n\n let firstItem = items[0];\n let elemScrollY = this.getElementScrollY( firstItem );\n // resolve path\n link.href = path;\n // add page data to hash\n this.scrollPages.push({\n top: elemScrollY,\n path: link.href,\n title: response.title,\n });\n};\n\nproto.getElementScrollY = function( elem ) {\n if ( this.options.elementScroll ) {\n return elem.offsetTop - this.top;\n } else {\n let rect = elem.getBoundingClientRect();\n return rect.top + window.scrollY;\n }\n};
1\n\nproto.onScrollHistory = function() {\n // cycle through positions, find biggest without going over\n let scrollPage = this.getClosestScrollPage();\n // set history if changed\n if ( scrollPage != this.scrollPage ) {\n this.scrollPage = scrollPage;\n this.setHistory( scrollPage.title, scrollPage.path );\n }\n};\n\nutils.debounceMethod( InfiniteScroll, 'onScrollHistory', 150 );\n\nproto.getClosestScrollPage = function() {\n let scrollViewY;\n if ( this.options.elementScroll ) {\n scrollViewY = this.scroller.scrollTop + this.scroller.clientHeight / 2;\n } else {\n scrollViewY = window.scrollY + this.windowHeight / 2;\n }\n\n let scrollPage;\n for ( let page of this.scrollPages ) {\n if ( page.top >= scrollViewY ) break;\n\n scrollPage = page;\n }\n return scrollPage;\n};\n\nproto.setHistory = function( title, path ) {\n let optHistory = this.options.history;\n let historyMethod = optHistory && history[ optHistory + 'State' ];\n if ( !historyMethod ) return;\n\n history[ optHistory + 'State' ]( null, title, path );\n if ( this.options.historyTitle ) document.title = title;\n this.dispatchEvent( 'history', null, [ title, path ] );\n};\n\n// scroll to top to prevent initial scroll-reset after page refresh\n// https://stackoverflow.com/a/18633915/182183\nproto.onUnload = function() {\n if ( this.scrollPage.top === 0 ) return;\n\n // calculate where scroll position would be on refresh\n let scrollY = window.scrollY - this.scrollPage.top + this.top;\n // disable scroll event before setting scroll #679\n this.destroyHistory();\n scrollTo( 0, scrollY );\n};\n\n// ----- load history ----- //\n\n// update URL\nproto.onPageLoadHistory = function( response, path ) {\n this.setHistory( response.title, path );\n};\n\n// -------------------------- -------------------------- //\n\nreturn InfiniteScroll;\n\n} ) );\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzc0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29uY2lubml0eS8uL25vZGVfbW9kdWxlcy9pbmZpbml0ZS1zY3JvbGwvanMvaGlzdG9yeS5qcz9iZGZjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGhpc3RvcnlcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgICAgd2luZG93LFxuICAgICAgICByZXF1aXJlKCcuL2NvcmUnKSxcbiAgICAgICAgcmVxdWlyZSgnZml6enktdWktdXRpbHMnKSxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgZmFjdG9yeShcbiAgICAgICAgd2luZG93LFxuICAgICAgICB3aW5kb3cuSW5maW5pdGVTY3JvbGwsXG4gICAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHMsXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZ
1hY3RvcnkoIHdpbmRvdywgSW5maW5pdGVTY3JvbGwsIHV0aWxzICkge1xuXG5sZXQgcHJvdG8gPSBJbmZpbml0ZVNjcm9sbC5wcm90b3R5cGU7XG5cbk9iamVjdC5hc3NpZ24oIEluZmluaXRlU2Nyb2xsLmRlZmF1bHRzLCB7XG4gIGhpc3Rvcnk6ICdyZXBsYWNlJyxcbiAgLy8gaGlzdG9yeVRpdGxlOiBmYWxzZSxcbn0gKTtcblxubGV0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cbi8vIC0tLS0tIGNyZWF0ZS9kZXN0cm95IC0tLS0tIC8vXG5cbkluZmluaXRlU2Nyb2xsLmNyZWF0ZS5oaXN0b3J5ID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMub3B0aW9ucy5oaXN0b3J5ICkgcmV0dXJuO1xuXG4gIC8vIGNoZWNrIGZvciBzYW1lIG9yaWdpblxuICBsaW5rLmhyZWYgPSB0aGlzLmdldEFic29sdXRlUGF0aCgpO1xuICAvLyBNUyBFZGdlIGRvZXMgbm90IGhhdmUgb3JpZ2luIG9uIGxpbmtcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTIyMzY0OTMvXG4gIGxldCBsaW5rT3JpZ2luID0gbGluay5vcmlnaW4gfHwgbGluay5wcm90b2NvbCArICcvLycgKyBsaW5rLmhvc3Q7XG4gIGxldCBpc1NhbWVPcmlnaW4gPSBsaW5rT3JpZ2luID09IGxvY2F0aW9uLm9yaWdpbjtcbiAgaWYgKCAhaXNTYW1lT3JpZ2luICkge1xuICAgIGNvbnNvbGUuZXJyb3IoICdbSW5maW5pdGVTY3JvbGxdIGNhbm5vdCBzZXQgaGlzdG9yeSB3aXRoIGRpZmZlcmVudCBvcmlnaW46ICcgK1xuICAgICAgYCR7bGluay5vcmlnaW59IG9uICR7bG9jYXRpb24ub3JpZ2lufSAuIEhpc3RvcnkgYmVoYXZpb3IgZGlzYWJsZWQuYCApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHR3byB3YXlzIHRvIGhhbmRsZSBjaGFuZ2luZyBoaXN0b3J5XG4gIGlmICggdGhpcy5vcHRpb25zLmFwcGVuZCApIHtcbiAgICB0aGlzLmNyZWF0ZUhpc3RvcnlBcHBlbmQoKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmNyZWF0ZUhpc3RvcnlQYWdlTG9hZCgpO1xuICB9XG59O1xuXG5wcm90by5jcmVhdGVIaXN0b3J5QXBwZW5kID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMudXBkYXRlTWVhc3VyZW1lbnRzKCk7XG4gIHRoaXMudXBkYXRlU2Nyb2xsZXIoKTtcbiAgLy8gYXJyYXkgb2Ygc2Nyb2xsIHBvc2l0aW9ucyBvZiBhcHBlbmRlZCBwYWdlc1xuICB0aGlzLnNjcm9sbFBhZ2VzID0gW1xuICAgIC8vIGZpcnN0IHBhZ2VcbiAgICB7XG4gICAgICB0b3A6IDAsXG4gICAgICBwYXRoOiBsb2NhdGlvbi5ocmVmLFxuICAgICAgdGl0bGU6IGRvY3VtZW50LnRpdGxlLFxuICAgIH0sXG4gIF07XG4gIHRoaXMuc2Nyb2xsUGFnZSA9IHRoaXMuc2Nyb2xsUGFnZXNbMF07XG4gIC8vIGV2ZW50c1xuICB0aGlzLnNjcm9sbEhpc3RvcnlIYW5kbGVyID0gdGhpcy5vblNjcm9sbEhpc3RvcnkuYmluZCggdGhpcyApO1xuICB0aGlzLnVubG9hZEhhbmRsZXIgPSB0aGlzLm9uVW5sb2FkLmJpbmQoIHRoaXMgKTtcbiAgdGhpcy5zY3JvbGxlci5hZGRFdmVudExpc3RlbmVyKCAnc2Nyb2xsJywgdGhpcy5zY3JvbGxIaXN0b3J5SGFuZGxlciApO1xuICB0aGlzLm9uKCAnYXBwZW5kJywgdGhpcy5vbkFwcGVuZEhpc3RvcnkgKTtcbiAgdGhpcy5iaW5kSGlzdG9yeUFwcGVuZEV2ZW50cyggdHJ1ZSApO1xufTtcblxucHJvdG8uYmluZEhpc3RvcnlBcHBlbmRFdmVudHMgPSBmdW5jdGlvbiggaXNCaW5kICkge1xuICBsZXQgYWRkUmVtb3ZlID0gaXNCaW5kID8gJ2FkZEV2ZW50TGlzdGVuZXInIDogJ3JlbW92ZUV2ZW50TGlzdGVuZXInO1xuICB0aGlzLnNjcm9sbGVyWyBhZGRSZW1vdmUgXSggJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsSGlzdG9yeUhhbmRsZXIgKTtcbiAgd2luZG93WyBhZGRSZW1vdmUgXSggJ3VubG9hZCcsIHRoaXMudW5sb2FkSGFuZGxlciApO1xufTtcblxucHJvdG8uY3JlYXRlSGlzdG9yeVBhZ2VMb2FkID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMub24oICdsb2FkJywgdGhpcy5vblBhZ2VMb2FkSGlzdG9yeSApO1xufTtcblxuSW5maW5pdGVTY3JvbGwuZGVzdHJveS5oaXN0b3J5ID1cbnByb3RvLmRlc3Ryb3lIaXN0b3J5ID0gZnVuY3Rpb24oKSB7XG4gIGxldCBpc0hpc3RvcnlBcHBlbmQgPSB0aGlzLm9wdGlvbnMuaGlzdG9yeSAmJiB0aGlzLm9wdGlvbnMuYXBwZW5kO1xuICBpZiAoIGlzSGlzdG9yeUFwcGVuZCApIHtcbiAgICB0aGlzLmJpbmRIaXN0b3J5QXBwZW5kRXZlbnRzKCBmYWxzZSApO1xuICB9XG59O1xuXG4vLyAtLS0tLSBhcHBlbmQgaGlzdG9yeSAtLS0tLSAvL1xuXG5wcm90by5vbkFwcGVuZEhpc3RvcnkgPSBmdW5jdGlvbiggcmVzcG9uc2UsIHBhdGgsIGl0ZW1zICkge1xuICAvLyBkbyBub3QgcHJvY2VlZCBpZiBubyBpdGVtcy4gIzc3OVxuICBpZiAoICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoICkgcmV0dXJuO1xuXG4gIGxldCBmaXJzdEl0ZW0gPSBpdGVtc1swXTtcbiAgbGV0IGVsZW1TY3JvbGxZID0gdGhpcy5nZXRFbGVtZW50U2Nyb2xsWSggZmlyc3RJdGVtICk7XG4gIC8vIHJlc29sdmUgcGF0aFxuICBsaW5rLmhyZWYgPSBwYXRoO1xuICAvLyBhZGQgcGFnZSBkYXRhIHRvIGhhc2hcbiAgdGhpcy5zY3JvbGxQYWdlcy5wdXNoKHtcbiAgICB0b3A6IGVsZW1TY3JvbGxZLFxuICAgIHBhdGg6IGxpbmsuaHJlZixcbiAgICB0aXRsZTogcmVzcG9uc2UudGl0bGUsXG4gIH0pO1xufTtcblxucHJvdG8uZ2V0RWxlbWVudFNjcm9sbFkgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgaWYgKCB0aGlzLm9wdGlvbnMuZWxlbWVudFNjcm9sbCApIHtcbiAgICByZXR1cm4gZWxlbS5vZmZzZXRUb3AgLSB0aGlzLnRvcDtcbiAgfSBlbHNlIHtcbiAgICBsZXQgcmVjdCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIHJlY3QudG9wICsgd2luZG93LnNjcm9sbFk7XG4gIH1cbn07XG5cbnByb3RvLm9uU2Nyb2xsSGlzdG9yeSA9IGZ1bmN0aW9uKCkge1xuICAvLyBjeWNsZSB0aHJvdWdoIHBvc2l0aW9ucywgZmluZCBiaWdnZXN0IHdpdGhvdXQgZ29pbmcgb3ZlclxuICBsZXQgc2Nyb2xsUGFnZSA9IHRoaXMuZ2V0Q2xvc2VzdFNjcm9sbFBhZ2UoKTtcbiAgLy8gc2V0IGhpc3RvcnkgaWYgY2hhbmdlZFxuICBpZiAoIHNjcm9sbFBhZ2UgIT0gdGhpcy5zY3JvbGxQYWdlICkge1xuICAgIHRoaXMuc2Nyb2xsUGFnZSA9IHNjcm9sbFBhZ2U7XG4gICAgdGhpcy5zZXRIaXN0b3J5KCBzY3JvbGxQYWdlLnRpdGxlLCBzY3JvbGxQYWdlLnBhdGggKTtcbiAgfVxufTtcblxudXRpbHMuZGVib3VuY2VNZXRob2QoIEluZmluaXRlU2Nyb2xsLCAnb25TY3JvbGxIaXN0b3J5JywgMTUwICk7XG5cbnByb3RvLmdldENsb3Nlc3RTY3JvbGxQYWdlID0gZnVuY3Rpb24oKSB7XG4gIGxldCBzY3JvbGxWaWV3WTtcbiAgaWYgKCB0aGlzLm9wdGlvbnMuZWxlbWVudFNjcm9sbCApIHtcbiAgICBzY3JvbGxWaWV3WSA9IHRoaXMuc2Nyb2xsZXIuc2Nyb2xsVG9wICsgdGhpcy5zY3JvbGxlci5jbGllbnRIZWlnaHQgLyAyO1xuICB9IGVsc2Uge1xuICAgIHNjcm9sbFZpZXdZID0gd2luZG93LnNjcm9sbFkgKyB0aGlzLndpbmRvd0hlaWdodCAvID
1I7XG4gIH1cblxuICBsZXQgc2Nyb2xsUGFnZTtcbiAgZm9yICggbGV0IHBhZ2Ugb2YgdGhpcy5zY3JvbGxQYWdlcyApIHtcbiAgICBpZiAoIHBhZ2UudG9wID49IHNjcm9sbFZpZXdZICkgYnJlYWs7XG5cbiAgICBzY3JvbGxQYWdlID0gcGFnZTtcbiAgfVxuICByZXR1cm4gc2Nyb2xsUGFnZTtcbn07XG5cbnByb3RvLnNldEhpc3RvcnkgPSBmdW5jdGlvbiggdGl0bGUsIHBhdGggKSB7XG4gIGxldCBvcHRIaXN0b3J5ID0gdGhpcy5vcHRpb25zLmhpc3Rvcnk7XG4gIGxldCBoaXN0b3J5TWV0aG9kID0gb3B0SGlzdG9yeSAmJiBoaXN0b3J5WyBvcHRIaXN0b3J5ICsgJ1N0YXRlJyBdO1xuICBpZiAoICFoaXN0b3J5TWV0aG9kICkgcmV0dXJuO1xuXG4gIGhpc3RvcnlbIG9wdEhpc3RvcnkgKyAnU3RhdGUnIF0oIG51bGwsIHRpdGxlLCBwYXRoICk7XG4gIGlmICggdGhpcy5vcHRpb25zLmhpc3RvcnlUaXRsZSApIGRvY3VtZW50LnRpdGxlID0gdGl0bGU7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ2hpc3RvcnknLCBudWxsLCBbIHRpdGxlLCBwYXRoIF0gKTtcbn07XG5cbi8vIHNjcm9sbCB0byB0b3AgdG8gcHJldmVudCBpbml0aWFsIHNjcm9sbC1yZXNldCBhZnRlciBwYWdlIHJlZnJlc2hcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xODYzMzkxNS8xODIxODNcbnByb3RvLm9uVW5sb2FkID0gZnVuY3Rpb24oKSB7XG4gIGlmICggdGhpcy5zY3JvbGxQYWdlLnRvcCA9PT0gMCApIHJldHVybjtcblxuICAvLyBjYWxjdWxhdGUgd2hlcmUgc2Nyb2xsIHBvc2l0aW9uIHdvdWxkIGJlIG9uIHJlZnJlc2hcbiAgbGV0IHNjcm9sbFkgPSB3aW5kb3cuc2Nyb2xsWSAtIHRoaXMuc2Nyb2xsUGFnZS50b3AgKyB0aGlzLnRvcDtcbiAgLy8gZGlzYWJsZSBzY3JvbGwgZXZlbnQgYmVmb3JlIHNldHRpbmcgc2Nyb2xsICM2NzlcbiAgdGhpcy5kZXN0cm95SGlzdG9yeSgpO1xuICBzY3JvbGxUbyggMCwgc2Nyb2xsWSApO1xufTtcblxuLy8gLS0tLS0gbG9hZCBoaXN0b3J5IC0tLS0tIC8vXG5cbi8vIHVwZGF0ZSBVUkxcbnByb3RvLm9uUGFnZUxvYWRIaXN0b3J5ID0gZnVuY3Rpb24oIHJlc3BvbnNlLCBwYXRoICkge1xuICB0aGlzLnNldEhpc3RvcnkoIHJlc3BvbnNlLnRpdGxlLCBwYXRoICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucmV0dXJuIEluZmluaXRlU2Nyb2xsO1xuXG59ICkgKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///774\n")},48:function(module,__unused_webpack_exports,__webpack_require__){eval("/*!\n * Infinite Scroll v4.0.1\n * Automatically add next page\n *\n * Licensed GPLv3 for open source use\n * or Infinite Scroll Commercial License for commercial use\n *\n * https://infinite-scroll.com\n * Copyright 2018-2020 Metafizzy\n */\n\n( function( window, factory ) {\n // universal module definition\n if ( true && module.exports ) {\n // CommonJS\n module.exports = factory(\n __webpack_require__(717),\n __webpack_require__(484),\n __webpack_require__(610),\n __webpack_require__(774),\n __webpack_require__(163),\n __webpack_require__(792),\n );\n }\n\n} )( window, function factory( InfiniteScroll ) {\n return InfiniteScroll;\n} );\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb25jaW5uaXR5Ly4vbm9kZV9tb2R1bGVzL2luZmluaXRlLXNjcm9sbC9qcy9pbmRleC5qcz81NWRhIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogSW5maW5pdGUgU2Nyb2xsIHY0LjAuMVxuICogQXV0b21hdGljYWxseSBhZGQgbmV4dCBwYWdlXG4gKlxuICogTGljZW5zZWQgR1BMdjMgZm9yIG9wZW4gc291cmNlIHVzZVxuICogb3IgSW5maW5pdGUgU2Nyb2xsIENvbW1lcmNpYWwgTGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2VcbiAqXG4gKiBodHRwczovL2luZmluaXRlLXNjcm9sbC5jb21cbiAqIENvcHlyaWdodCAyMDE4LTIwMjAgTWV0YWZpenp5XG4gKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgICByZXF1aXJlKCcuL2NvcmUnKSxcbiAgICAgICAgcmVxdWlyZSgnLi9wYWdlLWxvYWQnKSxcbiAgICAgICAgcmVxdWlyZSgnLi9zY3JvbGwtd2F0Y2gnKSxcbiAgICAgICAgcmVxdWlyZSgnLi9oaXN0b3J5JyksXG4gICAgICAgIHJlcXVpcmUoJy4vYnV0dG9uJyksXG4gICAgICAgIHJlcXVpcmUoJy4vc3RhdHVzJyksXG4gICAgKTtcbiAgfVxuXG59ICkoIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggSW5maW5pdGVTY3JvbGwgKSB7XG4gIHJldHVybiBJbmZpbml0ZVNjcm9sbDtcbn0gKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///48\n")},484:function(module,__unused_webpack_exports,__webpack_require__){eval("// page-load\n( function( window, factory ) {\n // universal module definition\n if ( true && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n __webpack_require__(717),\n );\n } else {\n // browser global\n factory(\n window,\n window.InfiniteScroll,\n );\n }\n\n}( window, function factory( window, InfiniteScroll ) {\n\nlet proto = InfiniteScroll.prototype;\n\nObject.assign( InfiniteScroll.defaults, {\n // append: false,\n loadOnScroll: true,\n checkLastPage: true,\n responseBody: 'text',\n domParseResponse: true,\n // prefill: false,\n // outlayer: null,\n} );
1\n\nInfiniteScroll.create.pageLoad = function() {\n this.canLoad = true;\n this.on( 'scrollThreshold', this.onScrollThresholdLoad );\n this.on( 'load', this.checkLastPage );\n if ( this.options.outlayer ) {\n this.on( 'append', this.onAppendOutlayer );\n }\n};\n\nproto.onScrollThresholdLoad = function() {\n if ( this.options.loadOnScroll ) this.loadNextPage();\n};\n\nlet domParser = new DOMParser();\n\nproto.loadNextPage = function() {\n if ( this.isLoading || !this.canLoad ) return;\n\n let { responseBody, domParseResponse, fetchOptions } = this.options;\n let path = this.getAbsolutePath();\n this.isLoading = true;\n if ( typeof fetchOptions == 'function' ) fetchOptions = fetchOptions();\n\n let fetchPromise = fetch( path, fetchOptions )\n .then( ( response ) => {\n if ( !response.ok ) {\n let error = new Error( response.statusText );\n this.onPageError( error, path, response );\n return { response };\n }\n\n return response[ responseBody ]().then( ( body ) => {\n let canDomParse = responseBody == 'text' && domParseResponse;\n if ( canDomParse ) {\n body = domParser.parseFromString( body, 'text/html' );\n }\n if ( response.status == 204 ) {\n this.lastPageReached( body, path );\n return { body, response };\n } else {\n return this.onPageLoad( body, path, response );\n }\n } );\n } )\n .catch( ( error ) => {\n this.onPageError( error, path );\n } );\n\n this.dispatchEvent( 'request', null, [ path, fetchPromise ] );\n\n return fetchPromise;\n};\n\nproto.onPageLoad = function( body, path, response ) {\n // done loading if not appending\n if ( !this.options.append ) {\n this.isLoading = false;\n }\n this.pageIndex++;\n this.loadCount++;\n this.dispatchEvent( 'load', null, [ body, path, response ] );\n return this.appendNextPage( body, path, response );\n};\n\nproto.appendNextPage = function( body, path, response ) {\n let { append, responseBody, domParseResponse } = this.options;\n // do not append json\n let isDocument = responseBody == 'text' && domParseResponse;\n if ( !isDocument || !append ) return { body, response };\n\n let items = body.querySelectorAll( append );\n let promiseValue = { body, response, items };\n // last page hit if no items. #840\n if ( !items || !items.length ) {\n this.lastPageReached( body, path );\n return promiseValue;\n }\n\n let fragment = getItemsFragment( items );\n let appendReady = () => {\n this.appendItems( items, fragment );\n this.isLoading = false;\n this.dispatchEvent( 'append', null, [ body, path, items, response ] );\n return promiseValue;\n };\n\n // TODO add hook for option to trigger appendReady\n if ( this.options.outlayer ) {\n return this.appendOutlayerItems( fragment, appendReady );\n } else {\n return appendReady();\n }\n};\n\nproto.appendItems = function( items, fragment ) {\n if ( !items || !items.length ) return;\n\n // get fragment if not provided\n fragment = fragment || getItemsFragment( items );\n refreshScripts( fragment );\n this.element.appendChild( fragment );\n};\n\nfunction getItemsFragment( items ) {\n // add items to fragment\n let fragment = document.createDocumentFragment();\n if ( items ) fragment.append( ...items );\n return fragment;\n}\n\n// replace <script>s with copies so they load\n// <script>s added by InfiniteScroll will not load\n// similar to https://stackoverflow.com/questions/610995\nfunction refreshScripts( fragment ) {\n let scripts = fragment.querySelectorAll('script');\n for ( let script of scripts ) {\n let freshScript = document.createElement('script');\n // copy attributes\n let attrs = script.attributes;\n for ( let attr of attrs ) {\n freshScript.setAttribute( attr.name, attr.value );\n }\n // copy inner script code. #718, #782\n freshScript.innerHTML = script.innerHTML;\n script.parentNode.replaceChild( freshScript, script );\n }\n}\n\n// ----- outlayer ----- //\n\nproto.appendOutlayerItems = function( fragment, appendReady ) {\n let imagesLoaded = InfiniteScroll.imagesLoaded || window.imagesLoaded;\n if ( !imagesLoaded ) {\n console.error('[InfiniteScroll] imagesLoaded required for outlayer option');\n this.isLoading = false;\n return;\n }\n // append once images loaded\n return new Promise( function( resolve ) {\n imagesLoaded( fragment, function() {\
1n let bodyResponse = appendReady();\n resolve( bodyResponse );\n } );\n } );\n};\n\nproto.onAppendOutlayer = function( response, path, items ) {\n this.options.outlayer.appended( items );\n};\n\n// ----- checkLastPage ----- //\n\n// check response for next element\nproto.checkLastPage = function( body, path ) {\n let { checkLastPage, path: pathOpt } = this.options;\n if ( !checkLastPage ) return;\n\n // if path is function, check if next path is truthy\n if ( typeof pathOpt == 'function' ) {\n let nextPath = this.getPath();\n if ( !nextPath ) {\n this.lastPageReached( body, path );\n return;\n }\n }\n // get selector from checkLastPage or path option\n let selector;\n if ( typeof checkLastPage == 'string' ) {\n selector = checkLastPage;\n } else if ( this.isPathSelector ) {\n // path option is selector string\n selector = pathOpt;\n }\n // check last page for selector\n // bail if no selector or not document response\n if ( !selector || !body.querySelector ) return;\n\n // check if response has selector\n let nextElem = body.querySelector( selector );\n if ( !nextElem ) this.lastPageReached( body, path );\n};\n\nproto.lastPageReached = function( body, path ) {\n this.canLoad = false;\n this.dispatchEvent( 'last', null, [ body, path ] );\n};\n\n// ----- error ----- //\n\nproto.onPageError = function( error, path, response ) {\n this.isLoading = false;\n this.canLoad = false;\n this.dispatchEvent( 'error', null, [ error, path, response ] );\n return error;\n};\n\n// -------------------------- prefill -------------------------- //\n\nInfiniteScroll.create.prefill = function() {\n if ( !this.options.prefill ) return;\n\n let append = this.options.append;\n if ( !append ) {\n console.error(`append option required for prefill. Set as :${append}`);\n return;\n }\n this.updateMeasurements();\n this.updateScroller();\n this.isPrefilling = true;\n this.on( 'append', this.prefill );\n this.once( 'error', this.stopPrefill );\n this.once( 'last', this.stopPrefill );\n this.prefill();\n};\n\nproto.prefill = function() {\n let distance = this.getPrefillDistance();\n this.isPrefilling = distance >= 0;\n if ( this.isPrefilling ) {\n this.log('prefill');\n this.loadNextPage();\n } else {\n this.stopPrefill();\n }\n};\n\nproto.getPrefillDistance = function() {\n // element scroll\n if ( this.options.elementScroll ) {\n return this.scroller.clientHeight - this.scroller.scrollHeight;\n }\n // window\n return this.windowHeight - this.element.clientHeight;\n};\n\nproto.stopPrefill = function() {\n this.log('stopPrefill');\n this.off( 'append', this.prefill );\n};\n\n// -------------------------- -------------------------- //\n\nreturn InfiniteScroll;\n\n} ) );\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvbmNpbm5pdHkvLi9ub2RlX21vZHVsZXMvaW5maW5pdGUtc2Nyb2xsL2pzL3BhZ2UtbG9hZC5qcz82ZWZkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHBhZ2UtbG9hZFxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgI
1HJlcXVpcmUoJy4vY29yZScpLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIHdpbmRvdy5JbmZpbml0ZVNjcm9sbCxcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBJbmZpbml0ZVNjcm9sbCApIHtcblxubGV0IHByb3RvID0gSW5maW5pdGVTY3JvbGwucHJvdG90eXBlO1xuXG5PYmplY3QuYXNzaWduKCBJbmZpbml0ZVNjcm9sbC5kZWZhdWx0cywge1xuICAvLyBhcHBlbmQ6IGZhbHNlLFxuICBsb2FkT25TY3JvbGw6IHRydWUsXG4gIGNoZWNrTGFzdFBhZ2U6IHRydWUsXG4gIHJlc3BvbnNlQm9keTogJ3RleHQnLFxuICBkb21QYXJzZVJlc3BvbnNlOiB0cnVlLFxuICAvLyBwcmVmaWxsOiBmYWxzZSxcbiAgLy8gb3V0bGF5ZXI6IG51bGwsXG59ICk7XG5cbkluZmluaXRlU2Nyb2xsLmNyZWF0ZS5wYWdlTG9hZCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmNhbkxvYWQgPSB0cnVlO1xuICB0aGlzLm9uKCAnc2Nyb2xsVGhyZXNob2xkJywgdGhpcy5vblNjcm9sbFRocmVzaG9sZExvYWQgKTtcbiAgdGhpcy5vbiggJ2xvYWQnLCB0aGlzLmNoZWNrTGFzdFBhZ2UgKTtcbiAgaWYgKCB0aGlzLm9wdGlvbnMub3V0bGF5ZXIgKSB7XG4gICAgdGhpcy5vbiggJ2FwcGVuZCcsIHRoaXMub25BcHBlbmRPdXRsYXllciApO1xuICB9XG59O1xuXG5wcm90by5vblNjcm9sbFRocmVzaG9sZExvYWQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLm9wdGlvbnMubG9hZE9uU2Nyb2xsICkgdGhpcy5sb2FkTmV4dFBhZ2UoKTtcbn07XG5cbmxldCBkb21QYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG5cbnByb3RvLmxvYWROZXh0UGFnZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIHRoaXMuaXNMb2FkaW5nIHx8ICF0aGlzLmNhbkxvYWQgKSByZXR1cm47XG5cbiAgbGV0IHsgcmVzcG9uc2VCb2R5LCBkb21QYXJzZVJlc3BvbnNlLCBmZXRjaE9wdGlvbnMgfSA9IHRoaXMub3B0aW9ucztcbiAgbGV0IHBhdGggPSB0aGlzLmdldEFic29sdXRlUGF0aCgpO1xuICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gIGlmICggdHlwZW9mIGZldGNoT3B0aW9ucyA9PSAnZnVuY3Rpb24nICkgZmV0Y2hPcHRpb25zID0gZmV0Y2hPcHRpb25zKCk7XG5cbiAgbGV0IGZldGNoUHJvbWlzZSA9IGZldGNoKCBwYXRoLCBmZXRjaE9wdGlvbnMgKVxuICAgIC50aGVuKCAoIHJlc3BvbnNlICkgPT4ge1xuICAgICAgaWYgKCAhcmVzcG9uc2Uub2sgKSB7XG4gICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvciggcmVzcG9uc2Uuc3RhdHVzVGV4dCApO1xuICAgICAgICB0aGlzLm9uUGFnZUVycm9yKCBlcnJvciwgcGF0aCwgcmVzcG9uc2UgKTtcbiAgICAgICAgcmV0dXJuIHsgcmVzcG9uc2UgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3BvbnNlWyByZXNwb25zZUJvZHkgXSgpLnRoZW4oICggYm9keSApID0+IHtcbiAgICAgICAgbGV0IGNhbkRvbVBhcnNlID0gcmVzcG9uc2VCb2R5ID09ICd0ZXh0JyAmJiBkb21QYXJzZVJlc3BvbnNlO1xuICAgICAgICBpZiAoIGNhbkRvbVBhcnNlICkge1xuICAgICAgICAgIGJvZHkgPSBkb21QYXJzZXIucGFyc2VGcm9tU3RyaW5nKCBib2R5LCAndGV4dC9odG1sJyApO1xuICAgICAgICB9XG4gICAgICAgIGlmICggcmVzcG9uc2Uuc3RhdHVzID09IDIwNCApIHtcbiAgICAgICAgICB0aGlzLmxhc3RQYWdlUmVhY2hlZCggYm9keSwgcGF0aCApO1xuICAgICAgICAgIHJldHVybiB7IGJvZHksIHJlc3BvbnNlIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMub25QYWdlTG9hZCggYm9keSwgcGF0aCwgcmVzcG9uc2UgKTtcbiAgICAgICAgfVxuICAgICAgfSApO1xuICAgIH0gKVxuICAgIC5jYXRjaCggKCBlcnJvciApID0+IHtcbiAgICAgIHRoaXMub25QYWdlRXJyb3IoIGVycm9yLCBwYXRoICk7XG4gICAgfSApO1xuXG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3JlcXVlc3QnLCBudWxsLCBbIHBhdGgsIGZldGNoUHJvbWlzZSBdICk7XG5cbiAgcmV0dXJuIGZldGNoUHJvbWlzZTtcbn07XG5cbnByb3RvLm9uUGFnZUxvYWQgPSBmdW5jdGlvbiggYm9keSwgcGF0aCwgcmVzcG9uc2UgKSB7XG4gIC8vIGRvbmUgbG9hZGluZyBpZiBub3QgYXBwZW5kaW5nXG4gIGlmICggIXRoaXMub3B0aW9ucy5hcHBlbmQgKSB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgfVxuICB0aGlzLnBhZ2VJbmRleCsrO1xuICB0aGlzLmxvYWRDb3VudCsrO1xuICB0aGlzLmRpc3BhdGNoRXZlbnQoICdsb2FkJywgbnVsbCwgWyBib2R5LCBwYXRoLCByZXNwb25zZSBdICk7XG4gIHJldHVybiB0aGlzLmFwcGVuZE5leHRQYWdlKCBib2R5LCBwYXRoLCByZXNwb25zZSApO1xufTtcblxucHJvdG8uYXBwZW5kTmV4dFBhZ2UgPSBmdW5jdGlvbiggYm9keSwgcGF0aCwgcmVzcG9uc2UgKSB7XG4gIGxldCB7IGFwcGVuZCwgcmVzcG9uc2VCb2R5LCBkb21QYXJzZVJlc3BvbnNlIH0gPSB0aGlzLm9wdGlvbnM7XG4gIC8vIGRvIG5vdCBhcHBlbmQganNvblxuICBsZXQgaXNEb2N1bWVudCA9IHJlc3BvbnNlQm9keSA9PSAndGV4dCcgJiYgZG9tUGFyc2VSZXNwb25zZTtcbiAgaWYgKCAhaXNEb2N1bWVudCB8fCAhYXBwZW5kICkgcmV0dXJuIHsgYm9keSwgcmVzcG9uc2UgfTtcblxuICBsZXQgaXRlbXMgPSBib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoIGFwcGVuZCApO1xuICBsZXQgcHJvbWlzZVZhbHVlID0geyBib2R5LCByZXNwb25zZSwgaXRlbXMgfTtcbiAgLy8gbGFzdCBwYWdlIGhpdCBpZiBubyBpdGVtcy4gIzg0MFxuICBpZiAoICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoICkge1xuICAgIHRoaXMubGFzdFBhZ2VSZWFjaGVkKCBib2R5LCBwYXRoICk7XG4gICAgcmV0dXJuIHByb21pc2VWYWx1ZTtcbiAgfVxuXG4gIGxldCBmcmFnbWVudCA9IGdldEl0ZW1zRnJhZ21lbnQoIGl0ZW1zICk7XG4gIGxldCBhcHBlbmRSZWFkeSA9ICgpID0+IHtcbiAgICB0aGlzLmFwcGVuZEl0ZW1zKCBpdGVtcywgZnJhZ21lbnQgKTtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCggJ2FwcGVuZCcsIG51bGwsIFsgYm9keSwgcGF0aCwgaXRlbXMsIHJlc3BvbnNlIF0gKTtcbiAgICByZXR1cm4gcHJvbWlzZVZhbHVlO1xuICB9O1xuXG4gIC8vIFRPRE8gYWRkIGhvb2sgZm9yIG9wdGlvbiB0byB0cmlnZ2VyIGFwcGVuZFJlYWR5XG4gIGlmICggdGhpcy5vcHRpb25zLm91dGxheWVyICkge1xuICAgIHJldHVybi
1B0aGlzLmFwcGVuZE91dGxheWVySXRlbXMoIGZyYWdtZW50LCBhcHBlbmRSZWFkeSApO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhcHBlbmRSZWFkeSgpO1xuICB9XG59O1xuXG5wcm90by5hcHBlbmRJdGVtcyA9IGZ1bmN0aW9uKCBpdGVtcywgZnJhZ21lbnQgKSB7XG4gIGlmICggIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGggKSByZXR1cm47XG5cbiAgLy8gZ2V0IGZyYWdtZW50IGlmIG5vdCBwcm92aWRlZFxuICBmcmFnbWVudCA9IGZyYWdtZW50IHx8IGdldEl0ZW1zRnJhZ21lbnQoIGl0ZW1zICk7XG4gIHJlZnJlc2hTY3JpcHRzKCBmcmFnbWVudCApO1xuICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoIGZyYWdtZW50ICk7XG59O1xuXG5mdW5jdGlvbiBnZXRJdGVtc0ZyYWdtZW50KCBpdGVtcyApIHtcbiAgLy8gYWRkIGl0ZW1zIHRvIGZyYWdtZW50XG4gIGxldCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgaWYgKCBpdGVtcyApIGZyYWdtZW50LmFwcGVuZCggLi4uaXRlbXMgKTtcbiAgcmV0dXJuIGZyYWdtZW50O1xufVxuXG4vLyByZXBsYWNlIDxzY3JpcHQ+cyB3aXRoIGNvcGllcyBzbyB0aGV5IGxvYWRcbi8vIDxzY3JpcHQ+cyBhZGRlZCBieSBJbmZpbml0ZVNjcm9sbCB3aWxsIG5vdCBsb2FkXG4vLyBzaW1pbGFyIHRvIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzYxMDk5NVxuZnVuY3Rpb24gcmVmcmVzaFNjcmlwdHMoIGZyYWdtZW50ICkge1xuICBsZXQgc2NyaXB0cyA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpO1xuICBmb3IgKCBsZXQgc2NyaXB0IG9mIHNjcmlwdHMgKSB7XG4gICAgbGV0IGZyZXNoU2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgLy8gY29weSBhdHRyaWJ1dGVzXG4gICAgbGV0IGF0dHJzID0gc2NyaXB0LmF0dHJpYnV0ZXM7XG4gICAgZm9yICggbGV0IGF0dHIgb2YgYXR0cnMgKSB7XG4gICAgICBmcmVzaFNjcmlwdC5zZXRBdHRyaWJ1dGUoIGF0dHIubmFtZSwgYXR0ci52YWx1ZSApO1xuICAgIH1cbiAgICAvLyBjb3B5IGlubmVyIHNjcmlwdCBjb2RlLiAjNzE4LCAjNzgyXG4gICAgZnJlc2hTY3JpcHQuaW5uZXJIVE1MID0gc2NyaXB0LmlubmVySFRNTDtcbiAgICBzY3JpcHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoIGZyZXNoU2NyaXB0LCBzY3JpcHQgKTtcbiAgfVxufVxuXG4vLyAtLS0tLSBvdXRsYXllciAtLS0tLSAvL1xuXG5wcm90by5hcHBlbmRPdXRsYXllckl0ZW1zID0gZnVuY3Rpb24oIGZyYWdtZW50LCBhcHBlbmRSZWFkeSApIHtcbiAgbGV0IGltYWdlc0xvYWRlZCA9IEluZmluaXRlU2Nyb2xsLmltYWdlc0xvYWRlZCB8fCB3aW5kb3cuaW1hZ2VzTG9hZGVkO1xuICBpZiAoICFpbWFnZXNMb2FkZWQgKSB7XG4gICAgY29uc29sZS5lcnJvcignW0luZmluaXRlU2Nyb2xsXSBpbWFnZXNMb2FkZWQgcmVxdWlyZWQgZm9yIG91dGxheWVyIG9wdGlvbicpO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGFwcGVuZCBvbmNlIGltYWdlcyBsb2FkZWRcbiAgcmV0dXJuIG5ldyBQcm9taXNlKCBmdW5jdGlvbiggcmVzb2x2ZSApIHtcbiAgICBpbWFnZXNMb2FkZWQoIGZyYWdtZW50LCBmdW5jdGlvbigpIHtcbiAgICAgIGxldCBib2R5UmVzcG9uc2UgPSBhcHBlbmRSZWFkeSgpO1xuICAgICAgcmVzb2x2ZSggYm9keVJlc3BvbnNlICk7XG4gICAgfSApO1xuICB9ICk7XG59O1xuXG5wcm90by5vbkFwcGVuZE91dGxheWVyID0gZnVuY3Rpb24oIHJlc3BvbnNlLCBwYXRoLCBpdGVtcyApIHtcbiAgdGhpcy5vcHRpb25zLm91dGxheWVyLmFwcGVuZGVkKCBpdGVtcyApO1xufTtcblxuLy8gLS0tLS0gY2hlY2tMYXN0UGFnZSAtLS0tLSAvL1xuXG4vLyBjaGVjayByZXNwb25zZSBmb3IgbmV4dCBlbGVtZW50XG5wcm90by5jaGVja0xhc3RQYWdlID0gZnVuY3Rpb24oIGJvZHksIHBhdGggKSB7XG4gIGxldCB7IGNoZWNrTGFzdFBhZ2UsIHBhdGg6IHBhdGhPcHQgfSA9IHRoaXMub3B0aW9ucztcbiAgaWYgKCAhY2hlY2tMYXN0UGFnZSApIHJldHVybjtcblxuICAvLyBpZiBwYXRoIGlzIGZ1bmN0aW9uLCBjaGVjayBpZiBuZXh0IHBhdGggaXMgdHJ1dGh5XG4gIGlmICggdHlwZW9mIHBhdGhPcHQgPT0gJ2Z1bmN0aW9uJyApIHtcbiAgICBsZXQgbmV4dFBhdGggPSB0aGlzLmdldFBhdGgoKTtcbiAgICBpZiAoICFuZXh0UGF0aCApIHtcbiAgICAgIHRoaXMubGFzdFBhZ2VSZWFjaGVkKCBib2R5LCBwYXRoICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIC8vIGdldCBzZWxlY3RvciBmcm9tIGNoZWNrTGFzdFBhZ2Ugb3IgcGF0aCBvcHRpb25cbiAgbGV0IHNlbGVjdG9yO1xuICBpZiAoIHR5cGVvZiBjaGVja0xhc3RQYWdlID09ICdzdHJpbmcnICkge1xuICAgIHNlbGVjdG9yID0gY2hlY2tMYXN0UGFnZTtcbiAgfSBlbHNlIGlmICggdGhpcy5pc1BhdGhTZWxlY3RvciApIHtcbiAgICAvLyBwYXRoIG9wdGlvbiBpcyBzZWxlY3RvciBzdHJpbmdcbiAgICBzZWxlY3RvciA9IHBhdGhPcHQ7XG4gIH1cbiAgLy8gY2hlY2sgbGFzdCBwYWdlIGZvciBzZWxlY3RvclxuICAvLyBiYWlsIGlmIG5vIHNlbGVjdG9yIG9yIG5vdCBkb2N1bWVudCByZXNwb25zZVxuICBpZiAoICFzZWxlY3RvciB8fCAhYm9keS5xdWVyeVNlbGVjdG9yICkgcmV0dXJuO1xuXG4gIC8vIGNoZWNrIGlmIHJlc3BvbnNlIGhhcyBzZWxlY3RvclxuICBsZXQgbmV4dEVsZW0gPSBib2R5LnF1ZXJ5U2VsZWN0b3IoIHNlbGVjdG9yICk7XG4gIGlmICggIW5leHRFbGVtICkgdGhpcy5sYXN0UGFnZVJlYWNoZWQoIGJvZHksIHBhdGggKTtcbn07XG5cbnByb3RvLmxhc3RQYWdlUmVhY2hlZCA9IGZ1bmN0aW9uKCBib2R5LCBwYXRoICkge1xuICB0aGlzLmNhbkxvYWQgPSBmYWxzZTtcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCAnbGFzdCcsIG51bGwsIFsgYm9keSwgcGF0aCBdICk7XG59O1xuXG4vLyAtLS0tLSBlcnJvciAtLS0tLSAvL1xuXG5wcm90by5vblBhZ2VFcnJvciA9IGZ1bmN0aW9uKCBlcnJvciwgcGF0aCwgcmVzcG9uc2UgKSB7XG4gIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gIHRoaXMuY2FuTG9hZCA9IGZhbHNlO1xuICB0aGlzLmRpc3BhdGNoRXZlbnQoICdlcnJvcicsIG51bGwsIFsgZXJyb3IsIHBhdGgsIHJlc3BvbnNlIF0gKTtcbiAgcmV0dXJuIGVycm9yO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJlZmlsbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5JbmZpbml0ZVNjcm9sbC5jcmVhdGUucHJlZmlsbCA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLm9wdGlvbnMucHJlZmlsbCApIHJldHVybjtcblxuICBsZXQgYXBwZW5kID0gdGhpcy5vcHRpb25zLmFwcGVuZDtcbiAgaWYgKCAhYXBwZW5kICkge1xuICAgIGNvbnNvbGUuZXJyb3IoYGFwcGVuZCBvcHRpb24gcmVx
1dWlyZWQgZm9yIHByZWZpbGwuIFNldCBhcyA6JHthcHBlbmR9YCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMudXBkYXRlTWVhc3VyZW1lbnRzKCk7XG4gIHRoaXMudXBkYXRlU2Nyb2xsZXIoKTtcbiAgdGhpcy5pc1ByZWZpbGxpbmcgPSB0cnVlO1xuICB0aGlzLm9uKCAnYXBwZW5kJywgdGhpcy5wcmVmaWxsICk7XG4gIHRoaXMub25jZSggJ2Vycm9yJywgdGhpcy5zdG9wUHJlZmlsbCApO1xuICB0aGlzLm9uY2UoICdsYXN0JywgdGhpcy5zdG9wUHJlZmlsbCApO1xuICB0aGlzLnByZWZpbGwoKTtcbn07XG5cbnByb3RvLnByZWZpbGwgPSBmdW5jdGlvbigpIHtcbiAgbGV0IGRpc3RhbmNlID0gdGhpcy5nZXRQcmVmaWxsRGlzdGFuY2UoKTtcbiAgdGhpcy5pc1ByZWZpbGxpbmcgPSBkaXN0YW5jZSA+PSAwO1xuICBpZiAoIHRoaXMuaXNQcmVmaWxsaW5nICkge1xuICAgIHRoaXMubG9nKCdwcmVmaWxsJyk7XG4gICAgdGhpcy5sb2FkTmV4dFBhZ2UoKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnN0b3BQcmVmaWxsKCk7XG4gIH1cbn07XG5cbnByb3RvLmdldFByZWZpbGxEaXN0YW5jZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBlbGVtZW50IHNjcm9sbFxuICBpZiAoIHRoaXMub3B0aW9ucy5lbGVtZW50U2Nyb2xsICkge1xuICAgIHJldHVybiB0aGlzLnNjcm9sbGVyLmNsaWVudEhlaWdodCAtIHRoaXMuc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0O1xuICB9XG4gIC8vIHdpbmRvd1xuICByZXR1cm4gdGhpcy53aW5kb3dIZWlnaHQgLSB0aGlzLmVsZW1lbnQuY2xpZW50SGVpZ2h0O1xufTtcblxucHJvdG8uc3RvcFByZWZpbGwgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5sb2coJ3N0b3BQcmVmaWxsJyk7XG4gIHRoaXMub2ZmKCAnYXBwZW5kJywgdGhpcy5wcmVmaWxsICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucmV0dXJuIEluZmluaXRlU2Nyb2xsO1xuXG59ICkgKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///484\n")},610:function(module,__unused_webpack_exports,__webpack_require__){eval("// scroll-watch\n( function( window, factory ) {\n // universal module definition\n if ( true && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n __webpack_require__(717),\n __webpack_require__(47),\n );\n } else {\n // browser global\n factory(\n window,\n window.InfiniteScroll,\n window.fizzyUIUtils,\n );\n }\n\n}( window, function factory( window, InfiniteScroll, utils ) {\n\nlet proto = InfiniteScroll.prototype;\n\n// default options\nObject.assign( InfiniteScroll.defaults, {\n scrollThreshold: 400,\n // elementScroll: null,\n} );\n\nInfiniteScroll.create.scrollWatch = function() {\n // events\n this.pageScrollHandler = this.onPageScroll.bind( this );\n this.resizeHandler = this.onResize.bind( this );\n\n let scrollThreshold = this.options.scrollThreshold;\n let isEnable = scrollThreshold || scrollThreshold === 0;\n if ( isEnable ) this.enableScrollWatch();\n};\n\nInfiniteScroll.destroy.scrollWatch = function() {\n this.disableScrollWatch();\n};\n\nproto.enableScrollWatch = function() {\n if ( this.isScrollWatching ) return;\n\n this.isScrollWatching = true;\n this.updateMeasurements();\n this.updateScroller();\n // TODO disable after error?\n this.on( 'last', this.disableScrollWatch );\n this.bindScrollWatchEvents( true );\n};\n\nproto.disableScrollWatch = function() {\n if ( !this.isScrollWatching ) return;\n\n this.bindScrollWatchEvents( false );\n delete this.isScrollWatching;\n};\n\nproto.bindScrollWatchEvents = function( isBind ) {\n let addRemove = isBind ? 'addEventListener' : 'removeEventListener';\n this.scroller[ addRemove ]( 'scroll', this.pageScrollHandler );\n window[ addRemove ]( 'resize', this.resizeHandler );\n};\n\nproto.onPageScroll = InfiniteScroll.throttle( function() {\n let distance = this.getBottomDistance();\n if ( distance <= this.options.scrollThreshold ) {\n this.dispatchEvent('scrollThreshold');\n }\n} );\n\nproto.getBottomDistance = function() {\n let bottom, scrollY;\n if ( this.options.elementScroll ) {\n bottom = this.scroller.scrollHeight;\n scrollY = this.scroller.scrollTop + this.scroller.clientHeight;\n } else {\n bottom = this.top + this.element.clientHeight;\n scrollY = window.scrollY + this.windowHeight;\n }\n return bottom - scrollY;\n};\n\nproto.onResize = function() {\n this.updateMeasurements();\n};\n\nutils.debounceMethod( InfiniteScroll, 'onResize', 150 );\n\n// -------------------------- -------------------------- //\n\nreturn InfiniteScroll;\n\n} ) );\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEwLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY29uY2lubml0eS8uL25vZGVfbW9kdWxlcy9pbmZpbml0ZS1zY3JvbGwvanMvc2Nyb2xsLXdhdGNoLmpzP2YwMGQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc2Nyb2xsLXdhdGNoXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICAgI
1HdpbmRvdyxcbiAgICAgICAgcmVxdWlyZSgnLi9jb3JlJyksXG4gICAgICAgIHJlcXVpcmUoJ2Zpenp5LXVpLXV0aWxzJyksXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIGZhY3RvcnkoXG4gICAgICAgIHdpbmRvdyxcbiAgICAgICAgd2luZG93LkluZmluaXRlU2Nyb2xsLFxuICAgICAgICB3aW5kb3cuZml6enlVSVV0aWxzLFxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEluZmluaXRlU2Nyb2xsLCB1dGlscyApIHtcblxubGV0IHByb3RvID0gSW5maW5pdGVTY3JvbGwucHJvdG90eXBlO1xuXG4vLyBkZWZhdWx0IG9wdGlvbnNcbk9iamVjdC5hc3NpZ24oIEluZmluaXRlU2Nyb2xsLmRlZmF1bHRzLCB7XG4gIHNjcm9sbFRocmVzaG9sZDogNDAwLFxuICAvLyBlbGVtZW50U2Nyb2xsOiBudWxsLFxufSApO1xuXG5JbmZpbml0ZVNjcm9sbC5jcmVhdGUuc2Nyb2xsV2F0Y2ggPSBmdW5jdGlvbigpIHtcbiAgLy8gZXZlbnRzXG4gIHRoaXMucGFnZVNjcm9sbEhhbmRsZXIgPSB0aGlzLm9uUGFnZVNjcm9sbC5iaW5kKCB0aGlzICk7XG4gIHRoaXMucmVzaXplSGFuZGxlciA9IHRoaXMub25SZXNpemUuYmluZCggdGhpcyApO1xuXG4gIGxldCBzY3JvbGxUaHJlc2hvbGQgPSB0aGlzLm9wdGlvbnMuc2Nyb2xsVGhyZXNob2xkO1xuICBsZXQgaXNFbmFibGUgPSBzY3JvbGxUaHJlc2hvbGQgfHwgc2Nyb2xsVGhyZXNob2xkID09PSAwO1xuICBpZiAoIGlzRW5hYmxlICkgdGhpcy5lbmFibGVTY3JvbGxXYXRjaCgpO1xufTtcblxuSW5maW5pdGVTY3JvbGwuZGVzdHJveS5zY3JvbGxXYXRjaCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmRpc2FibGVTY3JvbGxXYXRjaCgpO1xufTtcblxucHJvdG8uZW5hYmxlU2Nyb2xsV2F0Y2ggPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLmlzU2Nyb2xsV2F0Y2hpbmcgKSByZXR1cm47XG5cbiAgdGhpcy5pc1Njcm9sbFdhdGNoaW5nID0gdHJ1ZTtcbiAgdGhpcy51cGRhdGVNZWFzdXJlbWVudHMoKTtcbiAgdGhpcy51cGRhdGVTY3JvbGxlcigpO1xuICAvLyBUT0RPIGRpc2FibGUgYWZ0ZXIgZXJyb3I/XG4gIHRoaXMub24oICdsYXN0JywgdGhpcy5kaXNhYmxlU2Nyb2xsV2F0Y2ggKTtcbiAgdGhpcy5iaW5kU2Nyb2xsV2F0Y2hFdmVudHMoIHRydWUgKTtcbn07XG5cbnByb3RvLmRpc2FibGVTY3JvbGxXYXRjaCA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLmlzU2Nyb2xsV2F0Y2hpbmcgKSByZXR1cm47XG5cbiAgdGhpcy5iaW5kU2Nyb2xsV2F0Y2hFdmVudHMoIGZhbHNlICk7XG4gIGRlbGV0ZSB0aGlzLmlzU2Nyb2xsV2F0Y2hpbmc7XG59O1xuXG5wcm90by5iaW5kU2Nyb2xsV2F0Y2hFdmVudHMgPSBmdW5jdGlvbiggaXNCaW5kICkge1xuICBsZXQgYWRkUmVtb3ZlID0gaXNCaW5kID8gJ2FkZEV2ZW50TGlzdGVuZXInIDogJ3JlbW92ZUV2ZW50TGlzdGVuZXInO1xuICB0aGlzLnNjcm9sbGVyWyBhZGRSZW1vdmUgXSggJ3Njcm9sbCcsIHRoaXMucGFnZVNjcm9sbEhhbmRsZXIgKTtcbiAgd2luZG93WyBhZGRSZW1vdmUgXSggJ3Jlc2l6ZScsIHRoaXMucmVzaXplSGFuZGxlciApO1xufTtcblxucHJvdG8ub25QYWdlU2Nyb2xsID0gSW5maW5pdGVTY3JvbGwudGhyb3R0bGUoIGZ1bmN0aW9uKCkge1xuICBsZXQgZGlzdGFuY2UgPSB0aGlzLmdldEJvdHRvbURpc3RhbmNlKCk7XG4gIGlmICggZGlzdGFuY2UgPD0gdGhpcy5vcHRpb25zLnNjcm9sbFRocmVzaG9sZCApIHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3Njcm9sbFRocmVzaG9sZCcpO1xuICB9XG59ICk7XG5cbnByb3RvLmdldEJvdHRvbURpc3RhbmNlID0gZnVuY3Rpb24oKSB7XG4gIGxldCBib3R0b20sIHNjcm9sbFk7XG4gIGlmICggdGhpcy5vcHRpb25zLmVsZW1lbnRTY3JvbGwgKSB7XG4gICAgYm90dG9tID0gdGhpcy5zY3JvbGxlci5zY3JvbGxIZWlnaHQ7XG4gICAgc2Nyb2xsWSA9IHRoaXMuc2Nyb2xsZXIuc2Nyb2xsVG9wICsgdGhpcy5zY3JvbGxlci5jbGllbnRIZWlnaHQ7XG4gIH0gZWxzZSB7XG4gICAgYm90dG9tID0gdGhpcy50b3AgKyB0aGlzLmVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIHNjcm9sbFkgPSB3aW5kb3cuc2Nyb2xsWSArIHRoaXMud2luZG93SGVpZ2h0O1xuICB9XG4gIHJldHVybiBib3R0b20gLSBzY3JvbGxZO1xufTtcblxucHJvdG8ub25SZXNpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy51cGRhdGVNZWFzdXJlbWVudHMoKTtcbn07XG5cbnV0aWxzLmRlYm91bmNlTWV0aG9kKCBJbmZpbml0ZVNjcm9sbCwgJ29uUmVzaXplJywgMTUwICk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5yZXR1cm4gSW5maW5pdGVTY3JvbGw7XG5cbn0gKSApO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///610\n")},792:function(module,__unused_webpack_exports,__webpack_require__){eval("// status\n( function( window, factory ) {\n // universal module definition\n if ( true && module.exports ) {\n // CommonJS\n module.exports = factory(\n window,\n __webpack_require__(717),\n __webpack_require__(47),\n );\n } else {\n // browser global\n factory(\n window,\n window.InfiniteScroll,\n window.fizzyUIUtils,\n );\n }\n\n}( window, function factory( window, InfiniteScroll, utils ) {\n\nlet proto = InfiniteScroll.prototype;\n\n// InfiniteScroll.defaults.status = null;\n\nInfiniteScroll.create.status = function() {\n let statusElem = utils.getQueryElement( this.options.status );\n if ( !statusElem ) return;\n\n // elements\n this.statusElement = statusElem;\n this.statusEventElements = {\n request: statusElem.querySelector('.infinite-scroll-request'),\n error: statusElem.querySelector('.infinite-scroll-error'),\n last: statusElem.querySelector('.infinite-scroll-last'),\n };\n // events\n this.on( 'request', this.showRequestStatus );\n this.on( 'error', this.showErrorStatus );\n this.on( 'last', this.showLastStatus );\n this.bindHideStatus('on');\n};\n\nproto.bindHideStatus = function( bindMethod ) {\n let hideEvent = this.options.append ? 'append' : 'load';\n this[ bindMethod ]( hideEvent, this.hideAllStatus );\n};
1\n\nproto.showRequestStatus = function() {\n this.showStatus('request');\n};\n\nproto.showErrorStatus = function() {\n this.showStatus('error');\n};\n\nproto.showLastStatus = function() {\n this.showStatus('last');\n // prevent last then append event race condition from showing last status #706\n this.bindHideStatus('off');\n};\n\nproto.showStatus = function( eventName ) {\n show( this.statusElement );\n this.hideStatusEventElements();\n let eventElem = this.statusEventElements[ eventName ];\n show( eventElem );\n};\n\nproto.hideAllStatus = function() {\n hide( this.statusElement );\n this.hideStatusEventElements();\n};\n\nproto.hideStatusEventElements = function() {\n for ( let type in this.statusEventElements ) {\n let eventElem = this.statusEventElements[ type ];\n hide( eventElem );\n }\n};\n\n// -------------------------- -------------------------- //\n\nfunction hide( elem ) {\n setDisplay( elem, 'none' );\n}\n\nfunction show( elem ) {\n setDisplay( elem, 'block' );\n}\n\nfunction setDisplay( elem, value ) {\n if ( elem ) {\n elem.style.display = value;\n }\n}\n\n// -------------------------- -------------------------- //\n\nreturn InfiniteScroll;\n\n} ) );\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzkyLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2NvbmNpbm5pdHkvLi9ub2RlX21vZHVsZXMvaW5maW5pdGUtc2Nyb2xsL2pzL3N0YXR1cy5qcz82OGFhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHN0YXR1c1xuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIHJlcXVpcmUoJy4vY29yZScpLFxuICAgICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICBmYWN0b3J5KFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIHdpbmRvdy5JbmZpbml0ZVNjcm9sbCxcbiAgICAgICAgd2luZG93LmZpenp5VUlVdGlscyxcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBJbmZpbml0ZVNjcm9sbCwgdXRpbHMgKSB7XG5cbmxldCBwcm90byA9IEluZmluaXRlU2Nyb2xsLnByb3RvdHlwZTtcblxuLy8gSW5maW5pdGVTY3JvbGwuZGVmYXVsdHMuc3RhdHVzID0gbnVsbDtcblxuSW5maW5pdGVTY3JvbGwuY3JlYXRlLnN0YXR1cyA9IGZ1bmN0aW9uKCkge1xuICBsZXQgc3RhdHVzRWxlbSA9IHV0aWxzLmdldFF1ZXJ5RWxlbWVudCggdGhpcy5vcHRpb25zLnN0YXR1cyApO1xuICBpZiAoICFzdGF0dXNFbGVtICkgcmV0dXJuO1xuXG4gIC8vIGVsZW1lbnRzXG4gIHRoaXMuc3RhdHVzRWxlbWVudCA9IHN0YXR1c0VsZW07XG4gIHRoaXMuc3RhdHVzRXZlbnRFbGVtZW50cyA9IHtcbiAgICByZXF1ZXN0OiBzdGF0dXNFbGVtLnF1ZXJ5U2VsZWN0b3IoJy5pbmZpbml0ZS1zY3JvbGwtcmVxdWVzdCcpLFxuICAgIGVycm9yOiBzdGF0dXNFbGVtLnF1ZXJ5U2VsZWN0b3IoJy5pbmZpbml0ZS1zY3JvbGwtZXJyb3InKSxcbiAgICBsYXN0OiBzdGF0dXNFbGVtLnF1ZXJ5U2VsZWN0b3IoJy5pbmZpbml0ZS1zY3JvbGwtbGFzdCcpLFxuICB9O1xuICAvLyBldmVudHNcbiAgdGhpcy5vbiggJ3JlcXVlc3QnLCB0aGlzLnNob3dSZXF1ZXN0U3RhdHVzICk7XG4gIHRoaXMub24oICdlcnJvcicsIHRoaXMuc2hvd0Vycm9yU3RhdHVzICk7XG4gIHRoaXMub24oICdsYXN0JywgdGhpcy5zaG93TGFzdFN0YXR1cyApO1xuICB0aGlzLmJpbmRIaWRlU3RhdHVzKCdvbicpO1xufTtcblxucHJvdG8uYmluZEhpZGVTdGF0dXMgPSBmdW5jdGlvbiggYmluZE1ldGhvZCApIHtcbiAgbGV0IGhpZGVFdmVudCA9IHRoaXMub3B0aW9ucy5hcHBlbmQgPyAnYXBwZW5kJyA6ICdsb2FkJztcbiAgdGhpc1sgYmluZE1ldGhvZCBdKCBoaWRlRXZlbnQsIHRoaXMuaGlkZUFsbFN0YXR1cyApO1xufTtcblxucHJvdG8uc2hvd1JlcXVlc3RTdGF0dXMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zaG93U3RhdHVzKCdyZXF1ZXN0Jyk7XG59O1xuXG5wcm90by5zaG93RXJyb3JTdGF0dXMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zaG93U3RhdHVzKCdlcnJvcicpO1xufTtcblxucHJvdG8uc2hvd0xhc3RTdGF0dXMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zaG93U3RhdHVzKCdsYXN0Jyk7XG4gIC8vIHByZXZlbnQgbGFzdCB0aGVuIGFwcGVuZCBldmVudCByYWNlIGNvbmRpdGlvbiBmcm9tIHNob3dpbmcgbGFzdCBzdGF0dXMgIzcwNlxuICB0aGlzLmJpbmRIaWRlU3RhdHVzKCdvZmYnKTtcbn07XG5cbnByb3RvLnNob3dTdGF0dXMgPSBmdW5jdGlvbiggZXZlbnROYW1lICkge1xuICBzaG93KCB0aGlzLnN0YXR1c0VsZW1lbnQgKTtcbiAgdGhpcy5oaWRlU3RhdHVzRXZlbnRFbGVtZW50cygpO1xuICBsZXQgZXZlbnRFbGVtID0gdGhpcy5zdGF0dXNFdmVudEVsZW1lbnRzWyBldmVudE5hbWUgXTtcbiAgc2hvdyggZXZlbnRFbGVtICk7XG59O1xuXG5wcm90by5oaWRlQWxsU3RhdHVzID0gZnVuY3Rpb24oKSB7XG4gIGhpZGUoIHRoaXMuc3RhdHVzRWxlbWVudCApO1xuICB0aGlzLmhpZGVTdGF0dXNFdmVudEVsZW1lbnRzKCk7XG59O1xuXG5wcm90by5oaWRlU3RhdHVzRXZlbnRFbGVtZW50cyA9IGZ1bmN0aW9uKCkge1xuICBmb3IgKCBsZXQgdHlwZSBpbiB0aGlzLnN0YXR1c0V2ZW50RWxlbWVudHMgKSB7XG4gICAgbGV0IGV2ZW50RWxlbSA9IHRoaXMuc3RhdHVzRXZlbnRFbGVtZW50c1sgdHlwZSBdO1xuICAgIGhpZGUoIGV2ZW50RWxlbSApO1xuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuZnVuY3Rpb24gaGlkZSggZWxlbSApIHtcbiAgc2V0RGlzcGxheSggZWxlbSwgJ25vbmUnICk7XG59XG5cbmZ1bmN0aW9uIHNob3coIGVsZW0gKSB7XG4gIHNldERpc3BsYXkoIGVsZW0sICdibG9jaycgKTtcbn1cblxuZnVuY3Rpb24gc2V0RGlzcGxheSggZWxlbSwgdmFsdWUgKSB7XG4gIGlmICggZWxlbSApIHtcbiAgICBlbGVtLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucmV0dXJuIEluZmluaXRlU2Nyb2xsO1xuXG59ICkgKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///792\n")}},__webpack_module_cache__={};function __webpack_require__(n){var t=__webpack_module_cache__[n];if(void 0!==t)return t.exports;var e=__webpack_module_cache__[n]={exports:{}};return __webpack_modules__[n].call(e.exports,e,e.exports,__webpack_require__),e.exports}var __webpack_exports__=__webpack_require__(754)})();
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.