32 lines
56 KiB
JavaScript
32 lines
56 KiB
JavaScript
/*
|
|
* ATTENTION: An "eval-source-map" devtool has been used.
|
|
* This devtool is neither made for production nor for readable output files.
|
|
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
|
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
* or disable the default devtool with "devtool: false".
|
|
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
*/
|
|
/******/ (() => { // webpackBootstrap
|
|
/******/ var __webpack_modules__ = ({
|
|
|
|
/***/ "./resources/js/service/vminfo.js":
|
|
/*!****************************************!*\
|
|
!*** ./resources/js/service/vminfo.js ***!
|
|
\****************************************/
|
|
/***/ (() => {
|
|
|
|
eval("$(document).ready(function () {\n // Initialize dropdown functionality\n function initializeDropdown() {\n // Toggle dropdown on click\n $(document).on(\"click\", \".dropdown-selected\", function (e) {\n e.stopPropagation();\n var $dropdown = $(this).closest(\".custom-dropdown\");\n var $options = $dropdown.find(\".dropdown-options\");\n var $selected = $(this);\n\n // Close other dropdowns\n $(\".custom-dropdown\").not($dropdown).find(\".dropdown-options\").removeClass(\"show\");\n $(\".custom-dropdown\").not($dropdown).find(\".dropdown-selected\").removeClass(\"active\");\n\n // Toggle current dropdown\n $options.toggleClass(\"show\");\n $selected.toggleClass(\"active\");\n });\n\n // Handle option selection\n $(document).on(\"click\", \".dropdown-option\", function (e) {\n e.stopPropagation();\n var $option = $(this);\n var $dropdown = $option.closest(\".custom-dropdown\");\n var $selected = $dropdown.find(\".dropdown-selected\");\n var $options = $dropdown.find(\".dropdown-options\");\n var $selectedText = $selected.find(\".selected-text\");\n\n // Get data from selected option\n var value = $option.data(\"value\");\n var months = $option.data(\"months\");\n var price = $option.data(\"price\");\n // Get text from the first span element to avoid getting badge text\n var text = $option.find('span').first().text();\n\n // Update selected text\n $selectedText.text(text);\n\n // Update hidden inputs\n $dropdown.closest(\"form\").find(\".hiddenMonths\").val(months);\n $dropdown.closest(\"form\").find(\".hiddenTotalPrice\").val(price);\n\n // Update selected state\n $options.find(\".dropdown-option\").removeClass(\"selected\");\n $option.addClass(\"selected\");\n\n // Close dropdown\n $options.removeClass(\"show\");\n $selected.removeClass(\"active\");\n\n // Trigger custom event for other components\n $dropdown.trigger(\"dropdown:changed\", {\n value: value,\n months: months,\n price: price,\n text: text\n });\n\n // Update price display using jQuery\n var $productContainer = $dropdown.closest('[data-product-id]');\n var basePrice = parseFloat($productContainer.data('base-price'));\n var selectedMonths = parseInt(months);\n\n // Calculate prices\n var originalPrice = basePrice * selectedMonths;\n var savings = selectedMonths >= 12 ? Math.round(originalPrice * 0.1) : 0;\n var finalPrice = originalPrice - savings;\n\n // Update display\n $productContainer.find('.total-price-display').text('₫' + finalPrice.toLocaleString());\n $productContainer.find('.months-display').text(selectedMonths + ' tháng');\n $productContainer.find('.price-per-month').text('₫' + basePrice.toLocaleString() + '/tháng');\n $productContainer.find('.original-price').text('₫' + originalPrice.toLocaleString());\n $productContainer.find('.savings-amount').text('₫' + savings.toLocaleString());\n\n // Show/hide savings info\n if (savings > 0) {\n $productContainer.find('.savings-info').show();\n } else {\n $productContainer.find('.savings-info').hide();\n }\n });\n\n // Close dropdown when clicking outside\n $(document).on(\"click\", function (e) {\n if (!$(e.target).closest(\".custom-dropdown\").length) {\n $(\".dropdown-options\").removeClass(\"show\");\n $(\".dropdown-selected\").removeClass(\"active\");\n }\n });\n\n // Close dropdown on escape key\n $(document).on(\"keydown\", function (e) {\n if (e.key === \"Escape\") {\n $(\".dropdown-options\").removeClass(\"show\");\n $(\".dropdown-selected\").removeClass(\"active\");\n }\n });\n }\n\n // Initialize on page load\n initializeDropdown();\n\n // Optimize form submission to prevent blocking\n $(document).on('submit', 'form[action*=\"them-gio-hang\"]', function (e) {\n var $form = $(this);\n var $submitBtn = $form.find('button[type=\"submit\"]');\n\n // Disable submit button to prevent double submission\n $submitBtn.prop('disabled', true).text('Đang xử lý...');\n\n // Add loading state\n $form.addClass('submitting');\n\n // Re-enable button after 5 seconds as fallback\n setTimeout(function () {\n $submitBtn.prop('disabled', false).text('Đăng ký ngay');\n $form.removeClass('submitting');\n }, 5000);\n });\n\n // Cache utility functions - Single JSON approach\n var VM_INFO_CACHE_KEY = \"vm_info_cache\";\n function saveVMInfoToCache(templateId, data) {\n var ttl = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 30 * 60 * 1000;\n try {\n var now = new Date().getTime();\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache) {\n vmInfoCache = {\n lastUpdated: now,\n data: {}\n };\n }\n vmInfoCache.data[templateId] = {\n value: data,\n expiry: now + ttl\n };\n vmInfoCache.lastUpdated = now;\n localStorage.setItem(VM_INFO_CACHE_KEY, JSON.stringify(vmInfoCache));\n } catch (e) {\n console.warn(\"VM Info cache save failed:\", e);\n }\n }\n function getVMInfoFromCache(templateId) {\n try {\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache || !vmInfoCache.data[templateId]) {\n return null;\n }\n var item = vmInfoCache.data[templateId];\n var now = new Date().getTime();\n\n // Check if expired\n if (now > item.expiry) {\n removeVMInfoFromCache(templateId);\n return null;\n }\n return item.value;\n } catch (e) {\n console.warn(\"VM Info cache get failed:\", e);\n return null;\n }\n }\n function getVMInfoCache() {\n try {\n var cacheStr = localStorage.getItem(VM_INFO_CACHE_KEY);\n return cacheStr ? JSON.parse(cacheStr) : null;\n } catch (e) {\n console.warn(\"VM Info cache parse failed:\", e);\n return null;\n }\n }\n function removeVMInfoFromCache(templateId) {\n try {\n var vmInfoCache = getVMInfoCache();\n if (vmInfoCache && vmInfoCache.data[templateId]) {\n delete vmInfoCache.data[templateId];\n vmInfoCache.lastUpdated = new Date().getTime();\n localStorage.setItem(VM_INFO_CACHE_KEY, JSON.stringify(vmInfoCache));\n }\n } catch (e) {\n console.warn(\"VM Info cache remove failed:\", e);\n }\n }\n function clearExpiredVMInfoCache() {\n try {\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache) {\n return;\n }\n var now = new Date().getTime();\n var hasExpired = false;\n Object.keys(vmInfoCache.data).forEach(function (templateId) {\n var item = vmInfoCache.data[templateId];\n if (now > item.expiry) {\n delete vmInfoCache.data[templateId];\n hasExpired = true;\n }\n });\n if (hasExpired) {\n vmInfoCache.lastUpdated = now;\n localStorage.setItem(VM_INFO_CACHE_KEY, JSON.stringify(vmInfoCache));\n }\n } catch (e) {\n console.warn(\"VM Info cache cleanup failed:\", e);\n }\n }\n\n // Re-initialize if content is dynamically loaded\n $(document).on(\"DOMContentLoaded\", initializeDropdown);\n\n // Load VM information for each product with caching (OS, CPU, RAM, Disk) - NON-BLOCKING\n function loadGuestOSInfo() {\n // Get unique template IDs to avoid duplicate API calls\n var templateIds = [];\n $(\".guest-os\").each(function () {\n var templateId = $(this).data(\"template-id\");\n if (templateId && !templateIds.includes(templateId)) {\n templateIds.push(templateId);\n }\n });\n\n // Load VM info in background without blocking form submission\n templateIds.forEach(function (templateId) {\n // Check cache first\n var cachedData = getVMInfoFromCache(templateId);\n if (cachedData) {\n // Use cached data\n updateVMInfoUI(templateId, cachedData);\n return;\n }\n\n // Add loading indicators\n addLoadingIndicators(templateId);\n\n // Call API to get complete VM info - with shorter timeout\n $.ajax({\n url: \"/api/v1/get-vm-info/\".concat(templateId, \"/guest_os,cpu_count,memory_size,disk_capacity\"),\n method: \"GET\",\n timeout: 5000,\n // Reduced timeout to 5 seconds\n headers: {\n \"X-CSRF-TOKEN\": $('meta[name=\"csrf-token\"]').attr(\"content\"),\n Accept: \"application/json\"\n },\n success: function success(response) {\n if (response.error === false && response.data) {\n var vmData = response.data;\n var processedData = processVMData(vmData);\n\n // Cache the result for 30 minutes\n saveVMInfoToCache(templateId, processedData);\n\n // Update UI\n updateVMInfoUI(templateId, processedData);\n } else {\n setFallbackValues(templateId);\n }\n },\n error: function error(xhr, status, _error) {\n console.warn(\"Failed to load VM info for template:\", templateId, _error);\n setFallbackValues(templateId);\n }\n });\n });\n }\n\n // Load VM info after a short delay to not block page load\n setTimeout(loadGuestOSInfo, 1000);\n\n // Process VM data from API response\n function processVMData(vmData) {\n var guestOS = vmData.guest_os || \"UNKNOWN\";\n var cpuCount = vmData.cpu_count || 0;\n var memoryMB = vmData.memory_size || 0;\n var diskBytes = vmData.disk_capacity || 0;\n return {\n guestOS: guestOS,\n formattedOS: formatOSName(guestOS),\n cpu: cpuCount,\n formattedCPU: \"\".concat(cpuCount, \" vCore\").concat(cpuCount > 1 ? \"s\" : \"\"),\n ram: Math.round(memoryMB / 1024 * 100) / 100,\n // Convert MB to GB, 2 decimal places\n formattedRAM: \"\".concat(Math.round(memoryMB / 1024 * 100) / 100, \" GB\"),\n disk: Math.round(diskBytes / (1024 * 1024 * 1024) * 100) / 100,\n // Convert bytes to GB\n formattedDisk: \"\".concat(Math.round(diskBytes / (1024 * 1024 * 1024) * 100) / 100, \" GB\")\n };\n }\n\n // Add loading indicators to all VM info elements\n function addLoadingIndicators(templateId) {\n var loadingIcon = '<i class=\"fas fa-spinner fa-spin text-orange-500 mr-1\"></i>Đang tải...';\n $(\".guest-os[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n $(\".vm-cpu[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n $(\".vm-ram[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n $(\".vm-disk[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n }\n\n // Update all VM info UI elements\n function updateVMInfoUI(templateId, data) {\n // Update OS\n $(\".guest-os[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedOS);\n updateOSIcon(templateId, data.guestOS);\n\n // Update hardware specs\n $(\".vm-cpu[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedCPU);\n $(\".vm-ram[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedRAM);\n $(\".vm-disk[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedDisk);\n }\n\n // Set fallback values when API fails\n function setFallbackValues(templateId) {\n $(\".guest-os[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"Linux\");\n $(\".vm-cpu[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"N/A\");\n $(\".vm-ram[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"N/A\");\n $(\".vm-disk[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"N/A\");\n }\n\n // Update OS icon based on detected OS\n function updateOSIcon(templateId, osName) {\n var $iconElement = $(\".os-icon[data-template-id=\\\"\".concat(templateId, \"\\\"]\"));\n if (osName && osName.toLowerCase().includes(\"windows\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-windows\");\n } else if (osName && osName.toLowerCase().includes(\"ubuntu\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-ubuntu\");\n } else if (osName && osName.toLowerCase().includes(\"centos\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-centos\");\n } else if (osName && osName.toLowerCase().includes(\"debian\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-debian\");\n } else {\n // Keep linux icon as default\n $iconElement.removeClass().addClass(\"fab fa-linux text-orange-600\");\n }\n }\n\n // Format OS name for better display\n function formatOSName(osName) {\n var osMap = {\n UBUNTU_64: \"Ubuntu 64-bit\",\n CENTOS_64: \"CentOS 64-bit\",\n CENTOS_7_64: \"CentOS 7 64-bit\",\n CENTOS_8_64: \"CentOS 8 64-bit\",\n ROCKY_LINUX_64: \"Rocky Linux 64-bit\",\n WINDOWS_10_64: \"Windows 10 64-bit\",\n WINDOWS_9_SERVER_64: \"Windows Server 2019\",\n WINDOWS_SERVER_2019: \"Windows Server 2019\",\n WINDOWS_SERVER_2022: \"Windows Server 2022\",\n WINDOWS_2019: \"Windows Server 2019\",\n WINDOWS_2022: \"Windows Server 2022\",\n DEBIAN_10_64: \"Debian 10 64-bit\",\n DEBIAN_11_64: \"Debian 11 64-bit\",\n OTHER_LINUX_64: \"Linux 64-bit\",\n OTHER_64: \"Other 64-bit\"\n };\n return osMap[osName] || osName || \"Linux\";\n }\n\n // Clean up expired cache entries\n clearExpiredVMInfoCache();\n\n // Load Guest OS info when page loads\n loadGuestOSInfo();\n\n // Expose cache management to global scope for debugging\n window.vmInfoCache = {\n clear: function clear() {\n localStorage.removeItem(VM_INFO_CACHE_KEY);\n },\n refresh: function refresh() {\n this.clear();\n loadGuestOSInfo();\n },\n info: function info() {\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache) {\n return;\n }\n var templateIds = Object.keys(vmInfoCache.data);\n templateIds.forEach(function (templateId) {\n var data = getVMInfoFromCache(templateId);\n });\n },\n get: function get(templateId) {\n return getVMInfoFromCache(templateId);\n },\n remove: function remove(templateId) {\n removeVMInfoFromCache(templateId);\n },\n raw: function raw() {\n return getVMInfoCache();\n }\n };\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyIkIiwiZG9jdW1lbnQiLCJyZWFkeSIsImluaXRpYWxpemVEcm9wZG93biIsIm9uIiwiZSIsInN0b3BQcm9wYWdhdGlvbiIsIiRkcm9wZG93biIsImNsb3Nlc3QiLCIkb3B0aW9ucyIsImZpbmQiLCIkc2VsZWN0ZWQiLCJub3QiLCJyZW1vdmVDbGFzcyIsInRvZ2dsZUNsYXNzIiwiJG9wdGlvbiIsIiRzZWxlY3RlZFRleHQiLCJ2YWx1ZSIsImRhdGEiLCJtb250aHMiLCJwcmljZSIsInRleHQiLCJmaXJzdCIsInZhbCIsImFkZENsYXNzIiwidHJpZ2dlciIsIiRwcm9kdWN0Q29udGFpbmVyIiwiYmFzZVByaWNlIiwicGFyc2VGbG9hdCIsInNlbGVjdGVkTW9udGhzIiwicGFyc2VJbnQiLCJvcmlnaW5hbFByaWNlIiwic2F2aW5ncyIsIk1hdGgiLCJyb3VuZCIsImZpbmFsUHJpY2UiLCJ0b0xvY2FsZVN0cmluZyIsInNob3ciLCJoaWRlIiwidGFyZ2V0IiwibGVuZ3RoIiwia2V5IiwiJGZvcm0iLCIkc3VibWl0QnRuIiwicHJvcCIsInNldFRpbWVvdXQiLCJWTV9JTkZPX0NBQ0hFX0tFWSIsInNhdmVWTUluZm9Ub0NhY2hlIiwidGVtcGxhdGVJZCIsInR0bCIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsIm5vdyIsIkRhdGUiLCJnZXRUaW1lIiwidm1JbmZvQ2FjaGUiLCJnZXRWTUluZm9DYWNoZSIsImxhc3RVcGRhdGVkIiwiZXhwaXJ5IiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsIkpTT04iLCJzdHJpbmdpZnkiLCJjb25zb2xlIiwid2FybiIsImdldFZNSW5mb0Zyb21DYWNoZSIsIml0ZW0iLCJyZW1vdmVWTUluZm9Gcm9tQ2FjaGUiLCJjYWNoZVN0ciIsImdldEl0ZW0iLCJwYXJzZSIsImNsZWFyRXhwaXJlZFZNSW5mb0NhY2hlIiwiaGFzRXhwaXJlZCIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwibG9hZEd1ZXN0T1NJbmZvIiwidGVtcGxhdGVJZHMiLCJlYWNoIiwiaW5jbHVkZXMiLCJwdXNoIiwiY2FjaGVkRGF0YSIsInVwZGF0ZVZNSW5mb1VJIiwiYWRkTG9hZGluZ0luZGljYXRvcnMiLCJhamF4IiwidXJsIiwiY29uY2F0IiwibWV0aG9kIiwidGltZW91dCIsImhlYWRlcnMiLCJhdHRyIiwiQWNjZXB0Iiwic3VjY2VzcyIsInJlc3BvbnNlIiwiZXJyb3IiLCJ2bURhdGEiLCJwcm9jZXNzZWREYXRhIiwicHJvY2Vzc1ZNRGF0YSIsInNldEZhbGxiYWNrVmFsdWVzIiwieGhyIiwic3RhdHVzIiwiZ3Vlc3RPUyIsImd1ZXN0X29zIiwiY3B1Q291bnQiLCJjcHVfY291bnQiLCJtZW1vcnlNQiIsIm1lbW9yeV9zaXplIiwiZGlza0J5dGVzIiwiZGlza19jYXBhY2l0eSIsImZvcm1hdHRlZE9TIiwiZm9ybWF0T1NOYW1lIiwiY3B1IiwiZm9ybWF0dGVkQ1BVIiwicmFtIiwiZm9ybWF0dGVkUkFNIiwiZGlzayIsImZvcm1hdHRlZERpc2siLCJsb2FkaW5nSWNvbiIsImh0bWwiLCJ1cGRhdGVPU0ljb24iLCJvc05hbWUiLCIkaWNvbkVsZW1lbnQiLCJ0b0xvd2VyQ2FzZSIsIm9zTWFwIiwiVUJVTlRVXzY0IiwiQ0VOVE9TXzY0IiwiQ0VOVE9TXzdfNjQiLCJDRU5UT1NfOF82NCIsIlJPQ0tZX0xJTlVYXzY0IiwiV0lORE9XU18xMF82NCIsIldJTkRPV1NfOV9TRVJWRVJfNjQiLCJXSU5ET1dTX1NFUlZFUl8yMDE5IiwiV0lORE9XU19TRVJWRVJfMjAyMiIsIldJTkRPV1NfMjAxOSIsIldJTkRPV1NfMjAyMiIsIkRFQklBTl8xMF82NCIsIkRFQklBTl8xMV82NCIsIk9USEVSX0xJTlVYXzY0IiwiT1RIRVJfNjQiLCJ3aW5kb3ciLCJjbGVhciIsInJlbW92ZUl0ZW0iLCJyZWZyZXNoIiwiaW5mbyIsImdldCIsInJlbW92ZSIsInJhdyJdLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2VydmljZS92bWluZm8uanM/YzdlMyJdLCJzb3VyY2VzQ29udGVudCI6WyIkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBkcm9wZG93biBmdW5jdGlvbmFsaXR5XG4gICAgZnVuY3Rpb24gaW5pdGlhbGl6ZURyb3Bkb3duKCkge1xuICAgICAgICAvLyBUb2dnbGUgZHJvcGRvd24gb24gY2xpY2tcbiAgICAgICAgJChkb2N1bWVudCkub24oXCJjbGlja1wiLCBcIi5kcm9wZG93bi1zZWxlY3RlZFwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGNvbnN0ICRkcm9wZG93biA9ICQodGhpcykuY2xvc2VzdChcIi5jdXN0b20tZHJvcGRvd25cIik7XG4gICAgICAgICAgICBjb25zdCAkb3B0aW9ucyA9ICRkcm9wZG93bi5maW5kKFwiLmRyb3Bkb3duLW9wdGlvbnNcIik7XG4gICAgICAgICAgICBjb25zdCAkc2VsZWN0ZWQgPSAkKHRoaXMpO1xuXG4gICAgICAgICAgICAvLyBDbG9zZSBvdGhlciBkcm9wZG93bnNcbiAgICAgICAgICAgICQoXCIuY3VzdG9tLWRyb3Bkb3duXCIpXG4gICAgICAgICAgICAgICAgLm5vdCgkZHJvcGRvd24pXG4gICAgICAgICAgICAgICAgLmZpbmQoXCIuZHJvcGRvd24tb3B0aW9uc1wiKVxuICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyhcInNob3dcIik7XG4gICAgICAgICAgICAkKFwiLmN1c3RvbS1kcm9wZG93blwiKVxuICAgICAgICAgICAgICAgIC5ub3QoJGRyb3Bkb3duKVxuICAgICAgICAgICAgICAgIC5maW5kKFwiLmRyb3Bkb3duLXNlbGVjdGVkXCIpXG4gICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xuXG4gICAgICAgICAgICAvLyBUb2dnbGUgY3VycmVudCBkcm9wZG93blxuICAgICAgICAgICAgJG9wdGlvbnMudG9nZ2xlQ2xhc3MoXCJzaG93XCIpO1xuICAgICAgICAgICAgJHNlbGVjdGVkLnRvZ2dsZUNsYXNzKFwiYWN0aXZlXCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBIYW5kbGUgb3B0aW9uIHNlbGVjdGlvblxuICAgICAgICAkKGRvY3VtZW50KS5vbihcImNsaWNrXCIsIFwiLmRyb3Bkb3duLW9wdGlvblwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGNvbnN0ICRvcHRpb24gPSAkKHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgJGRyb3Bkb3duID0gJG9wdGlvbi5jbG9zZXN0KFwiLmN1c3RvbS1kcm9wZG93blwiKTtcbiAgICAgICAgICAgIGNvbnN0ICRzZWxlY3RlZCA9ICRkcm9wZG93bi5maW5kKFwiLmRyb3Bkb3duLXNlbGVjdGVkXCIpO1xuICAgICAgICAgICAgY29uc3QgJG9wdGlvbnMgPSAkZHJvcGRvd24uZmluZChcIi5kcm9wZG93bi1vcHRpb25zXCIpO1xuICAgICAgICAgICAgY29uc3QgJHNlbGVjdGVkVGV4dCA9ICRzZWxlY3RlZC5maW5kKFwiLnNlbGVjdGVkLXRleHRcIik7XG5cbiAgICAgICAgICAgIC8vIEdldCBkYXRhIGZyb20gc2VsZWN0ZWQgb3B0aW9uXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICRvcHRpb24uZGF0YShcInZhbHVlXCIpO1xuICAgICAgICAgICAgY29uc3QgbW9udGhzID0gJG9wdGlvbi5kYXRhKFwibW9udGhzXCIpO1xuICAgICAgICAgICAgY29uc3QgcHJpY2UgPSAkb3B0aW9uLmRhdGEoXCJwcmljZVwiKTtcbiAgICAgICAgICAgIC8vIEdldCB0ZXh0IGZyb20gdGhlIGZpcnN0IHNwYW4gZWxlbWVudCB0byBhdm9pZCBnZXR0aW5nIGJhZGdlIHRleHRcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAkb3B0aW9uLmZpbmQoJ3NwYW4nKS5maXJzdCgpLnRleHQoKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHNlbGVjdGVkIHRleHRcbiAgICAgICAgICAgICRzZWxlY3RlZFRleHQudGV4dCh0ZXh0KTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIGhpZGRlbiBpbnB1dHNcbiAgICAgICAgICAgICRkcm9wZG93bi5jbG9zZXN0KFwiZm9ybVwiKS5maW5kKFwiLmhpZGRlbk1vbnRoc1wiKS52YWwobW9udGhzKTtcbiAgICAgICAgICAgICRkcm9wZG93bi5jbG9zZXN0KFwiZm9ybVwiKS5maW5kKFwiLmhpZGRlblRvdGFsUHJpY2VcIikudmFsKHByaWNlKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHNlbGVjdGVkIHN0YXRlXG4gICAgICAgICAgICAkb3B0aW9ucy5maW5kKFwiLmRyb3Bkb3duLW9wdGlvblwiKS5yZW1vdmVDbGFzcyhcInNlbGVjdGVkXCIpO1xuICAgICAgICAgICAgJG9wdGlvbi5hZGRDbGFzcyhcInNlbGVjdGVkXCIpO1xuXG4gICAgICAgICAgICAvLyBDbG9zZSBkcm9wZG93blxuICAgICAgICAgICAgJG9wdGlvbnMucmVtb3ZlQ2xhc3MoXCJzaG93XCIpO1xuICAgICAgICAgICAgJHNlbGVjdGVkLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xuXG4gICAgICAgICAgICAvLyBUcmlnZ2VyIGN1c3RvbSBldmVudCBmb3Igb3RoZXIgY29tcG9uZW50c1xuICAgICAgICAgICAgJGRyb3Bkb3duLnRyaWdnZXIoXCJkcm9wZG93bjpjaGFuZ2VkXCIsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgICAgICAgICAgcHJpY2U6IHByaWNlLFxuICAgICAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHByaWNlIGRpc3BsYXkgdXNpbmcgalF1ZXJ5XG4gICAgICAgICAgICBjb25zdCAkcHJvZHVjdENvbnRhaW5lciA9ICRkcm9wZG93bi5jbG9zZXN0KCdbZGF0YS1wcm9kdWN0LWlkXScpO1xuICAgICAgICAgICAgY29uc3QgYmFzZVByaWNlID0gcGFyc2VGbG9hdCgkcHJvZHVjdENvbnRhaW5lci5kYXRhKCdiYXNlLXByaWNlJykpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRNb250aHMgPSBwYXJzZUludChtb250aHMpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgcHJpY2VzXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFByaWNlID0gYmFzZVByaWNlICogc2VsZWN0ZWRNb250aHM7XG4gICAgICAgICAgICBjb25zdCBzYXZpbmdzID0gc2VsZWN0ZWRNb250aHMgPj0gMTIgPyBNYXRoLnJvdW5kKG9yaWdpbmFsUHJpY2UgKiAwLjEpIDogMDtcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsUHJpY2UgPSBvcmlnaW5hbFByaWNlIC0gc2F2aW5ncztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVXBkYXRlIGRpc3BsYXlcbiAgICAgICAgICAgICRwcm9kdWN0Q29udGFpbmVyLmZpbmQoJy50b3RhbC1wcmljZS1kaXNwbGF5JykudGV4dCgn4oKrJyArIGZpbmFsUHJpY2UudG9Mb2NhbGVTdHJpbmcoKSk7XG4gICAgICAgICAgICAkcHJvZHVjdENvbnRhaW5lci5maW5kKCcubW9udGhzLWRpc3BsYXknKS50ZXh0KHNlbGVjdGVkTW9udGhzICsgJyB0aMOhbmcnKTtcbiAgICAgICAgICAgICRwcm9kdWN0Q29udGFpbmVyLmZpbmQoJy5wcmljZS1wZXItbW9udGgnKS50ZXh0KCfigqsnICsgYmFzZVByaWNlLnRvTG9jYWxlU3RyaW5nKCkgKyAnL3Row6FuZycpO1xuICAgICAgICAgICAgJHByb2R1Y3RDb250YWluZXIuZmluZCgnLm9yaWdpbmFsLXByaWNlJykudGV4dCgn4oKrJyArIG9yaWdpbmFsUHJpY2UudG9Mb2NhbGVTdHJpbmcoKSk7XG4gICAgICAgICAgICAkcHJvZHVjdENvbnRhaW5lci5maW5kKCcuc2F2aW5ncy1hbW91bnQnKS50ZXh0KCfigqsnICsgc2F2aW5ncy50b0xvY2FsZVN0cmluZygpKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2hvdy9oaWRlIHNhdmluZ3MgaW5mb1xuICAgICAgICAgICAgaWYgKHNhdmluZ3MgPiAwKSB7XG4gICAgICAgICAgICAgICAgJHByb2R1Y3RDb250YWluZXIuZmluZCgnLnNhdmluZ3MtaW5mbycpLnNob3coKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJHByb2R1Y3RDb250YWluZXIuZmluZCgnLnNhdmluZ3MtaW5mbycpLmhpZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ2xvc2UgZHJvcGRvd24gd2hlbiBjbGlja2luZyBvdXRzaWRlXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmICghJChlLnRhcmdldCkuY2xvc2VzdChcIi5jdXN0b20tZHJvcGRvd25cIikubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgJChcIi5kcm9wZG93bi1vcHRpb25zXCIpLnJlbW92ZUNsYXNzKFwic2hvd1wiKTtcbiAgICAgICAgICAgICAgICAkKFwiLmRyb3Bkb3duLXNlbGVjdGVkXCIpLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDbG9zZSBkcm9wZG93biBvbiBlc2NhcGUga2V5XG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwia2V5ZG93blwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgICAgICAgICAgJChcIi5kcm9wZG93bi1vcHRpb25zXCIpLnJlbW92ZUNsYXNzKFwic2hvd1wiKTtcbiAgICAgICAgICAgICAgICAkKFwiLmRyb3Bkb3duLXNlbGVjdGVkXCIpLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIG9uIHBhZ2UgbG9hZFxuICAgIGluaXRpYWxpemVEcm9wZG93bigpO1xuXG4gICAgLy8gT3B0aW1pemUgZm9ybSBzdWJtaXNzaW9uIHRvIHByZXZlbnQgYmxvY2tpbmdcbiAgICAkKGRvY3VtZW50KS5vbignc3VibWl0JywgJ2Zvcm1bYWN0aW9uKj1cInRoZW0tZ2lvLWhhbmdcIl0nLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIGNvbnN0ICRmb3JtID0gJCh0aGlzKTtcbiAgICAgICAgY29uc3QgJHN1Ym1pdEJ0biA9ICRmb3JtLmZpbmQoJ2J1dHRvblt0eXBlPVwic3VibWl0XCJdJyk7XG4gICAgICAgIFxuICAgICAgICAvLyBEaXNhYmxlIHN1Ym1pdCBidXR0b24gdG8gcHJldmVudCBkb3VibGUgc3VibWlzc2lvblxuICAgICAgICAkc3VibWl0QnRuLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkudGV4dCgnxJBhbmcgeOG7rSBsw70uLi4nKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEFkZCBsb2FkaW5nIHN0YXRlXG4gICAgICAgICRmb3JtLmFkZENsYXNzKCdzdWJtaXR0aW5nJyk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1lbmFibGUgYnV0dG9uIGFmdGVyIDUgc2Vjb25kcyBhcyBmYWxsYmFja1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICRzdWJtaXRCdG4ucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkudGV4dCgnxJDEg25nIGvDvSBuZ2F5Jyk7XG4gICAgICAgICAgICAkZm9ybS5yZW1vdmVDbGFzcygnc3VibWl0dGluZycpO1xuICAgICAgICB9LCA1MDAwKTtcbiAgICB9KTtcblxuICAgIC8vIENhY2hlIHV0aWxpdHkgZnVuY3Rpb25zIC0gU2luZ2xlIEpTT04gYXBwcm9hY2hcbiAgICBjb25zdCBWTV9JTkZPX0NBQ0hFX0tFWSA9IFwidm1faW5mb19jYWNoZVwiO1xuXG4gICAgZnVuY3Rpb24gc2F2ZVZNSW5mb1RvQ2FjaGUodGVtcGxhdGVJZCwgZGF0YSwgdHRsID0gMzAgKiA2MCAqIDEwMDApIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgbGV0IHZtSW5mb0NhY2hlID0gZ2V0Vk1JbmZvQ2FjaGUoKTtcblxuICAgICAgICAgICAgaWYgKCF2bUluZm9DYWNoZSkge1xuICAgICAgICAgICAgICAgIHZtSW5mb0NhY2hlID0ge1xuICAgICAgICAgICAgICAgICAgICBsYXN0VXBkYXRlZDogbm93LFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2bUluZm9DYWNoZS5kYXRhW3RlbXBsYXRlSWRdID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgICAgICAgIGV4cGlyeTogbm93ICsgdHRsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZtSW5mb0NhY2hlLmxhc3RVcGRhdGVkID0gbm93O1xuXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICAgICBWTV9JTkZPX0NBQ0hFX0tFWSxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh2bUluZm9DYWNoZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlZNIEluZm8gY2FjaGUgc2F2ZSBmYWlsZWQ6XCIsIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Vk1JbmZvRnJvbUNhY2hlKHRlbXBsYXRlSWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZtSW5mb0NhY2hlID0gZ2V0Vk1JbmZvQ2FjaGUoKTtcbiAgICAgICAgICAgIGlmICghdm1JbmZvQ2FjaGUgfHwgIXZtSW5mb0NhY2hlLmRhdGFbdGVtcGxhdGVJZF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHZtSW5mb0NhY2hlLmRhdGFbdGVtcGxhdGVJZF07XG4gICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZXhwaXJlZFxuICAgICAgICAgICAgaWYgKG5vdyA+IGl0ZW0uZXhwaXJ5KSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlVk1JbmZvRnJvbUNhY2hlKHRlbXBsYXRlSWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVk0gSW5mbyBjYWNoZSBnZXQgZmFpbGVkOlwiLCBlKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Vk1JbmZvQ2FjaGUoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZVN0ciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFZNX0lORk9fQ0FDSEVfS0VZKTtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVN0ciA/IEpTT04ucGFyc2UoY2FjaGVTdHIpIDogbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVk0gSW5mbyBjYWNoZSBwYXJzZSBmYWlsZWQ6XCIsIGUpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW1vdmVWTUluZm9Gcm9tQ2FjaGUodGVtcGxhdGVJZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgdm1JbmZvQ2FjaGUgPSBnZXRWTUluZm9DYWNoZSgpO1xuICAgICAgICAgICAgaWYgKHZtSW5mb0NhY2hlICYmIHZtSW5mb0NhY2hlLmRhdGFbdGVtcGxhdGVJZF0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdm1JbmZvQ2FjaGUuZGF0YVt0ZW1wbGF0ZUlkXTtcbiAgICAgICAgICAgICAgICB2bUluZm9DYWNoZS5sYXN0VXBkYXRlZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgICAgICAgICBWTV9JTkZPX0NBQ0hFX0tFWSxcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodm1JbmZvQ2FjaGUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVk0gSW5mbyBjYWNoZSByZW1vdmUgZmFpbGVkOlwiLCBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFyRXhwaXJlZFZNSW5mb0NhY2hlKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgdm1JbmZvQ2FjaGUgPSBnZXRWTUluZm9DYWNoZSgpO1xuICAgICAgICAgICAgaWYgKCF2bUluZm9DYWNoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICBsZXQgaGFzRXhwaXJlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2bUluZm9DYWNoZS5kYXRhKS5mb3JFYWNoKCh0ZW1wbGF0ZUlkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHZtSW5mb0NhY2hlLmRhdGFbdGVtcGxhdGVJZF07XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+IGl0ZW0uZXhwaXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2bUluZm9DYWNoZS5kYXRhW3RlbXBsYXRlSWRdO1xuICAgICAgICAgICAgICAgICAgICBoYXNFeHBpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGhhc0V4cGlyZWQpIHtcbiAgICAgICAgICAgICAgICB2bUluZm9DYWNoZS5sYXN0VXBkYXRlZCA9IG5vdztcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICAgICAgICAgVk1fSU5GT19DQUNIRV9LRVksXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHZtSW5mb0NhY2hlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlZNIEluZm8gY2FjaGUgY2xlYW51cCBmYWlsZWQ6XCIsIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmUtaW5pdGlhbGl6ZSBpZiBjb250ZW50IGlzIGR5bmFtaWNhbGx5IGxvYWRlZFxuICAgICQoZG9jdW1lbnQpLm9uKFwiRE9NQ29udGVudExvYWRlZFwiLCBpbml0aWFsaXplRHJvcGRvd24pO1xuXG4gICAgLy8gTG9hZCBWTSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBwcm9kdWN0IHdpdGggY2FjaGluZyAoT1MsIENQVSwgUkFNLCBEaXNrKSAtIE5PTi1CTE9DS0lOR1xuICAgIGZ1bmN0aW9uIGxvYWRHdWVzdE9TSW5mbygpIHtcbiAgICAgICAgLy8gR2V0IHVuaXF1ZSB0ZW1wbGF0ZSBJRHMgdG8gYXZvaWQgZHVwbGljYXRlIEFQSSBjYWxsc1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZUlkcyA9IFtdO1xuICAgICAgICAkKFwiLmd1ZXN0LW9zXCIpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVJZCA9ICQodGhpcykuZGF0YShcInRlbXBsYXRlLWlkXCIpO1xuICAgICAgICAgICAgaWYgKHRlbXBsYXRlSWQgJiYgIXRlbXBsYXRlSWRzLmluY2x1ZGVzKHRlbXBsYXRlSWQpKSB7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVJZHMucHVzaCh0ZW1wbGF0ZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTG9hZCBWTSBpbmZvIGluIGJhY2tncm91bmQgd2l0aG91dCBibG9ja2luZyBmb3JtIHN1Ym1pc3Npb25cbiAgICAgICAgdGVtcGxhdGVJZHMuZm9yRWFjaCgodGVtcGxhdGVJZCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3RcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZERhdGEgPSBnZXRWTUluZm9Gcm9tQ2FjaGUodGVtcGxhdGVJZCk7XG5cbiAgICAgICAgICAgIGlmIChjYWNoZWREYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIGNhY2hlZCBkYXRhXG4gICAgICAgICAgICAgICAgdXBkYXRlVk1JbmZvVUkodGVtcGxhdGVJZCwgY2FjaGVkRGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgbG9hZGluZyBpbmRpY2F0b3JzXG4gICAgICAgICAgICBhZGRMb2FkaW5nSW5kaWNhdG9ycyh0ZW1wbGF0ZUlkKTtcblxuICAgICAgICAgICAgLy8gQ2FsbCBBUEkgdG8gZ2V0IGNvbXBsZXRlIFZNIGluZm8gLSB3aXRoIHNob3J0ZXIgdGltZW91dFxuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICB1cmw6IGAvYXBpL3YxL2dldC12bS1pbmZvLyR7dGVtcGxhdGVJZH0vZ3Vlc3Rfb3MsY3B1X2NvdW50LG1lbW9yeV9zaXplLGRpc2tfY2FwYWNpdHlgLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiA1MDAwLCAvLyBSZWR1Y2VkIHRpbWVvdXQgdG8gNSBzZWNvbmRzXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICBcIlgtQ1NSRi1UT0tFTlwiOiAkKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuYXR0cihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yID09PSBmYWxzZSAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2bURhdGEgPSByZXNwb25zZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHByb2Nlc3NWTURhdGEodm1EYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdCBmb3IgMzAgbWludXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZVZNSW5mb1RvQ2FjaGUodGVtcGxhdGVJZCwgcHJvY2Vzc2VkRGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBVSVxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVk1JbmZvVUkodGVtcGxhdGVJZCwgcHJvY2Vzc2VkRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRGYWxsYmFja1ZhbHVlcyh0ZW1wbGF0ZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICh4aHIsIHN0YXR1cywgZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJGYWlsZWQgdG8gbG9hZCBWTSBpbmZvIGZvciB0ZW1wbGF0ZTpcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBzZXRGYWxsYmFja1ZhbHVlcyh0ZW1wbGF0ZUlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTG9hZCBWTSBpbmZvIGFmdGVyIGEgc2hvcnQgZGVsYXkgdG8gbm90IGJsb2NrIHBhZ2UgbG9hZFxuICAgIHNldFRpbWVvdXQobG9hZEd1ZXN0T1NJbmZvLCAxMDAwKTtcblxuICAgIC8vIFByb2Nlc3MgVk0gZGF0YSBmcm9tIEFQSSByZXNwb25zZVxuICAgIGZ1bmN0aW9uIHByb2Nlc3NWTURhdGEodm1EYXRhKSB7XG4gICAgICAgIGNvbnN0IGd1ZXN0T1MgPSB2bURhdGEuZ3Vlc3Rfb3MgfHwgXCJVTktOT1dOXCI7XG4gICAgICAgIGNvbnN0IGNwdUNvdW50ID0gdm1EYXRhLmNwdV9jb3VudCB8fCAwO1xuICAgICAgICBjb25zdCBtZW1vcnlNQiA9IHZtRGF0YS5tZW1vcnlfc2l6ZSB8fCAwO1xuICAgICAgICBjb25zdCBkaXNrQnl0ZXMgPSB2bURhdGEuZGlza19jYXBhY2l0eSB8fCAwO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBndWVzdE9TOiBndWVzdE9TLFxuICAgICAgICAgICAgZm9ybWF0dGVkT1M6IGZvcm1hdE9TTmFtZShndWVzdE9TKSxcbiAgICAgICAgICAgIGNwdTogY3B1Q291bnQsXG4gICAgICAgICAgICBmb3JtYXR0ZWRDUFU6IGAke2NwdUNvdW50fSB2Q29yZSR7Y3B1Q291bnQgPiAxID8gXCJzXCIgOiBcIlwifWAsXG4gICAgICAgICAgICByYW06IE1hdGgucm91bmQoKG1lbW9yeU1CIC8gMTAyNCkgKiAxMDApIC8gMTAwLCAvLyBDb252ZXJ0IE1CIHRvIEdCLCAyIGRlY2ltYWwgcGxhY2VzXG4gICAgICAgICAgICBmb3JtYXR0ZWRSQU06IGAke01hdGgucm91bmQoKG1lbW9yeU1CIC8gMTAyNCkgKiAxMDApIC8gMTAwfSBHQmAsXG4gICAgICAgICAgICBkaXNrOiBNYXRoLnJvdW5kKChkaXNrQnl0ZXMgLyAoMTAyNCAqIDEwMjQgKiAxMDI0KSkgKiAxMDApIC8gMTAwLCAvLyBDb252ZXJ0IGJ5dGVzIHRvIEdCXG4gICAgICAgICAgICBmb3JtYXR0ZWREaXNrOiBgJHtcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKChkaXNrQnl0ZXMgLyAoMTAyNCAqIDEwMjQgKiAxMDI0KSkgKiAxMDApIC8gMTAwXG4gICAgICAgICAgICB9IEdCYCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgbG9hZGluZyBpbmRpY2F0b3JzIHRvIGFsbCBWTSBpbmZvIGVsZW1lbnRzXG4gICAgZnVuY3Rpb24gYWRkTG9hZGluZ0luZGljYXRvcnModGVtcGxhdGVJZCkge1xuICAgICAgICBjb25zdCBsb2FkaW5nSWNvbiA9XG4gICAgICAgICAgICAnPGkgY2xhc3M9XCJmYXMgZmEtc3Bpbm5lciBmYS1zcGluIHRleHQtb3JhbmdlLTUwMCBtci0xXCI+PC9pPsSQYW5nIHThuqNpLi4uJztcbiAgICAgICAgJChgLmd1ZXN0LW9zW2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChsb2FkaW5nSWNvbik7XG4gICAgICAgICQoYC52bS1jcHVbZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKS5odG1sKGxvYWRpbmdJY29uKTtcbiAgICAgICAgJChgLnZtLXJhbVtkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwobG9hZGluZ0ljb24pO1xuICAgICAgICAkKGAudm0tZGlza1tkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwobG9hZGluZ0ljb24pO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBhbGwgVk0gaW5mbyBVSSBlbGVtZW50c1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVZNSW5mb1VJKHRlbXBsYXRlSWQsIGRhdGEpIHtcbiAgICAgICAgLy8gVXBkYXRlIE9TXG4gICAgICAgICQoYC5ndWVzdC1vc1tkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwoZGF0YS5mb3JtYXR0ZWRPUyk7XG4gICAgICAgIHVwZGF0ZU9TSWNvbih0ZW1wbGF0ZUlkLCBkYXRhLmd1ZXN0T1MpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBoYXJkd2FyZSBzcGVjc1xuICAgICAgICAkKGAudm0tY3B1W2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChkYXRhLmZvcm1hdHRlZENQVSk7XG4gICAgICAgICQoYC52bS1yYW1bZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKS5odG1sKGRhdGEuZm9ybWF0dGVkUkFNKTtcbiAgICAgICAgJChgLnZtLWRpc2tbZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKS5odG1sKFxuICAgICAgICAgICAgZGF0YS5mb3JtYXR0ZWREaXNrXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGZhbGxiYWNrIHZhbHVlcyB3aGVuIEFQSSBmYWlsc1xuICAgIGZ1bmN0aW9uIHNldEZhbGxiYWNrVmFsdWVzKHRlbXBsYXRlSWQpIHtcbiAgICAgICAgJChgLmd1ZXN0LW9zW2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChcIkxpbnV4XCIpO1xuICAgICAgICAkKGAudm0tY3B1W2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChcIk4vQVwiKTtcbiAgICAgICAgJChgLnZtLXJhbVtkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwoXCJOL0FcIik7XG4gICAgICAgICQoYC52bS1kaXNrW2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChcIk4vQVwiKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgT1MgaWNvbiBiYXNlZCBvbiBkZXRlY3RlZCBPU1xuICAgIGZ1bmN0aW9uIHVwZGF0ZU9TSWNvbih0ZW1wbGF0ZUlkLCBvc05hbWUpIHtcbiAgICAgICAgY29uc3QgJGljb25FbGVtZW50ID0gJChgLm9zLWljb25bZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKTtcblxuICAgICAgICBpZiAob3NOYW1lICYmIG9zTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwid2luZG93c1wiKSkge1xuICAgICAgICAgICAgJGljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwiZmFiIGZhLWxpbnV4XCIpLmFkZENsYXNzKFwiZmFiIGZhLXdpbmRvd3NcIik7XG4gICAgICAgIH0gZWxzZSBpZiAob3NOYW1lICYmIG9zTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwidWJ1bnR1XCIpKSB7XG4gICAgICAgICAgICAkaWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJmYWIgZmEtbGludXhcIikuYWRkQ2xhc3MoXCJmYWIgZmEtdWJ1bnR1XCIpO1xuICAgICAgICB9IGVsc2UgaWYgKG9zTmFtZSAmJiBvc05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcImNlbnRvc1wiKSkge1xuICAgICAgICAgICAgJGljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwiZmFiIGZhLWxpbnV4XCIpLmFkZENsYXNzKFwiZmFiIGZhLWNlbnRvc1wiKTtcbiAgICAgICAgfSBlbHNlIGlmIChvc05hbWUgJiYgb3NOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJkZWJpYW5cIikpIHtcbiAgICAgICAgICAgICRpY29uRWxlbWVudC5yZW1vdmVDbGFzcyhcImZhYiBmYS1saW51eFwiKS5hZGRDbGFzcyhcImZhYiBmYS1kZWJpYW5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBLZWVwIGxpbnV4IGljb24gYXMgZGVmYXVsdFxuICAgICAgICAgICAgJGljb25FbGVtZW50LnJlbW92ZUNsYXNzKCkuYWRkQ2xhc3MoXCJmYWIgZmEtbGludXggdGV4dC1vcmFuZ2UtNjAwXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0IE9TIG5hbWUgZm9yIGJldHRlciBkaXNwbGF5XG4gICAgZnVuY3Rpb24gZm9ybWF0T1NOYW1lKG9zTmFtZSkge1xuICAgICAgICBjb25zdCBvc01hcCA9IHtcbiAgICAgICAgICAgIFVCVU5UVV82NDogXCJVYnVudHUgNjQtYml0XCIsXG4gICAgICAgICAgICBDRU5UT1NfNjQ6IFwiQ2VudE9TIDY0LWJpdFwiLFxuICAgICAgICAgICAgQ0VOVE9TXzdfNjQ6IFwiQ2VudE9TIDcgNjQtYml0XCIsXG4gICAgICAgICAgICBDRU5UT1NfOF82NDogXCJDZW50T1MgOCA2NC1iaXRcIixcbiAgICAgICAgICAgIFJPQ0tZX0xJTlVYXzY0OiBcIlJvY2t5IExpbnV4IDY0LWJpdFwiLFxuICAgICAgICAgICAgV0lORE9XU18xMF82NDogXCJXaW5kb3dzIDEwIDY0LWJpdFwiLFxuICAgICAgICAgICAgV0lORE9XU185X1NFUlZFUl82NDogXCJXaW5kb3dzIFNlcnZlciAyMDE5XCIsXG4gICAgICAgICAgICBXSU5ET1dTX1NFUlZFUl8yMDE5OiBcIldpbmRvd3MgU2VydmVyIDIwMTlcIixcbiAgICAgICAgICAgIFdJTkRPV1NfU0VSVkVSXzIwMjI6IFwiV2luZG93cyBTZXJ2ZXIgMjAyMlwiLFxuICAgICAgICAgICAgV0lORE9XU18yMDE5OiBcIldpbmRvd3MgU2VydmVyIDIwMTlcIixcbiAgICAgICAgICAgIFdJTkRPV1NfMjAyMjogXCJXaW5kb3dzIFNlcnZlciAyMDIyXCIsXG4gICAgICAgICAgICBERUJJQU5fMTBfNjQ6IFwiRGViaWFuIDEwIDY0LWJpdFwiLFxuICAgICAgICAgICAgREVCSUFOXzExXzY0OiBcIkRlYmlhbiAxMSA2NC1iaXRcIixcbiAgICAgICAgICAgIE9USEVSX0xJTlVYXzY0OiBcIkxpbnV4IDY0LWJpdFwiLFxuICAgICAgICAgICAgT1RIRVJfNjQ6IFwiT3RoZXIgNjQtYml0XCIsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG9zTWFwW29zTmFtZV0gfHwgb3NOYW1lIHx8IFwiTGludXhcIjtcbiAgICB9XG5cbiAgICAvLyBDbGVhbiB1cCBleHBpcmVkIGNhY2hlIGVudHJpZXNcbiAgICBjbGVhckV4cGlyZWRWTUluZm9DYWNoZSgpO1xuXG4gICAgLy8gTG9hZCBHdWVzdCBPUyBpbmZvIHdoZW4gcGFnZSBsb2Fkc1xuICAgIGxvYWRHdWVzdE9TSW5mbygpO1xuXG4gICAgLy8gRXhwb3NlIGNhY2hlIG1hbmFnZW1lbnQgdG8gZ2xvYmFsIHNjb3BlIGZvciBkZWJ1Z2dpbmdcbiAgICB3aW5kb3cudm1JbmZvQ2FjaGUgPSB7XG4gICAgICAgIGNsZWFyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShWTV9JTkZPX0NBQ0hFX0tFWSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgICAgIGxvYWRHdWVzdE9TSW5mbygpO1xuICAgICAgICB9LFxuICAgICAgICBpbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCB2bUluZm9DYWNoZSA9IGdldFZNSW5mb0NhY2hlKCk7XG4gICAgICAgICAgICBpZiAoIXZtSW5mb0NhY2hlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUlkcyA9IE9iamVjdC5rZXlzKHZtSW5mb0NhY2hlLmRhdGEpO1xuXG4gICAgICAgICAgICB0ZW1wbGF0ZUlkcy5mb3JFYWNoKCh0ZW1wbGF0ZUlkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGdldFZNSW5mb0Zyb21DYWNoZSh0ZW1wbGF0ZUlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICh0ZW1wbGF0ZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Vk1JbmZvRnJvbUNhY2hlKHRlbXBsYXRlSWQpO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uICh0ZW1wbGF0ZUlkKSB7XG4gICAgICAgICAgICByZW1vdmVWTUluZm9Gcm9tQ2FjaGUodGVtcGxhdGVJZCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJhdzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldFZNSW5mb0NhY2hlKCk7XG4gICAgICAgIH0sXG4gICAgfTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQUEsQ0FBQyxDQUFDQyxRQUFRLENBQUMsQ0FBQ0MsS0FBSyxDQUFDLFlBQVk7RUFDMUI7RUFDQSxTQUFTQyxrQkFBa0JBLENBQUEsRUFBRztJQUMxQjtJQUNBSCxDQUFDLENBQUNDLFFBQVEsQ0FBQyxDQUFDRyxFQUFFLENBQUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFVBQVVDLENBQUMsRUFBRTtNQUN2REEsQ0FBQyxDQUFDQyxlQUFlLENBQUMsQ0FBQztNQUNuQixJQUFNQyxTQUFTLEdBQUdQLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQ1EsT0FBTyxDQUFDLGtCQUFrQixDQUFDO01BQ3JELElBQU1DLFFBQVEsR0FBR0YsU0FBUyxDQUFDRyxJQUFJLENB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LENBQUNELFdBQVcsRUFBRTtRQUNkO01BQ0o7TUFFQSxJQUFNc0IsV0FBVyxHQUFHSixNQUFNLENBQUNDLElBQUksQ0FBQ25CLFdBQVcsQ0FBQ3JDLElBQUksQ0FBQztNQUVqRDJELFdBQVcsQ0FBQ0YsT0FBTyxDQUFDLFVBQUMzQixVQUFVLEVBQUs7UUFDaEMsSUFBTTlCLElBQUksR0FBRytDLGtCQUFrQixDQUFDakIsVUFBVSxDQUFDO01BQy9DLENBQUMsQ0FBQztJQUNOLENBQUM7SUFDRGdHLEdBQUcsRUFBRSxTQUFMQSxHQUFHQSxDQUFZaEcsVUFBVSxFQUFFO01BQ3ZCLE9BQU9pQixrQkFBa0IsQ0FBQ2pCLFVBQVUsQ0FBQztJQUN6QyxDQUFDO0lBQ0RpRyxNQUFNLEVBQUUsU0FBUkEsTUFBTUEsQ0FBWWpHLFVBQVUsRUFBRTtNQUMxQm1CLHFCQUFxQixDQUFDbkIsVUFBVSxDQUFDO0lBQ3JDLENBQUM7SUFDRGtHLEdBQUcsRUFBRSxTQUFMQSxHQUFHQSxDQUFBLEVBQWM7TUFDYixPQUFPMUYsY0FBYyxDQUFDLENBQUM7SUFDM0I7RUFDSixDQUFDO0FBQ0wsQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W10sImZpbGUiOiIuL3Jlc291cmNlcy9qcy9zZXJ2aWNlL3ZtaW5mby5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/service/vminfo.js\n");
|
|
|
|
/***/ })
|
|
|
|
/******/ });
|
|
/************************************************************************/
|
|
/******/
|
|
/******/ // startup
|
|
/******/ // Load entry module and return exports
|
|
/******/ // This entry module can't be inlined because the eval-source-map devtool is used.
|
|
/******/ var __webpack_exports__ = {};
|
|
/******/ __webpack_modules__["./resources/js/service/vminfo.js"]();
|
|
/******/
|
|
/******/ })()
|
|
; |