diff --git a/build/bundle.js b/build/bundle.js deleted file mode 100644 index 1ed0848..0000000 --- a/build/bundle.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";var __webpack_modules__={496:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n uV: () => (/* binding */ DATA_ROOT),\n P5: () => (/* binding */ FISCAL_YEAR),\n zu: () => (/* binding */ REVENUE),\n Qn: () => (/* binding */ TARGET),\n I9: () => (/* binding */ cola),\n aF: () => (/* binding */ fringe),\n Wr: () => (/* binding */ merit)\n});\n\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\nvar injectStylesIntoStyleTag = __webpack_require__(72);\nvar injectStylesIntoStyleTag_default = /*#__PURE__*/__webpack_require__.n(injectStylesIntoStyleTag);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleDomAPI.js\nvar styleDomAPI = __webpack_require__(825);\nvar styleDomAPI_default = /*#__PURE__*/__webpack_require__.n(styleDomAPI);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertBySelector.js\nvar insertBySelector = __webpack_require__(659);\nvar insertBySelector_default = /*#__PURE__*/__webpack_require__.n(insertBySelector);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\nvar setAttributesWithoutAttributes = __webpack_require__(56);\nvar setAttributesWithoutAttributes_default = /*#__PURE__*/__webpack_require__.n(setAttributesWithoutAttributes);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertStyleElement.js\nvar insertStyleElement = __webpack_require__(540);\nvar insertStyleElement_default = /*#__PURE__*/__webpack_require__.n(insertStyleElement);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleTagTransform.js\nvar styleTagTransform = __webpack_require__(113);\nvar styleTagTransform_default = /*#__PURE__*/__webpack_require__.n(styleTagTransform);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/css/common.css\nvar common = __webpack_require__(404);\n;// CONCATENATED MODULE: ./src/css/common.css\n\n \n \n \n \n \n \n \n \n \n\nvar options = {};\n\noptions.styleTagTransform = (styleTagTransform_default());\noptions.setAttributes = (setAttributesWithoutAttributes_default());\noptions.insert = insertBySelector_default().bind(null, \"head\");\noptions.domAPI = (styleDomAPI_default());\noptions.insertStyleElement = (insertStyleElement_default());\n\nvar update = injectStylesIntoStyleTag_default()(common/* default */.A, options);\n\n\n\n\n /* harmony default export */ const css_common = (common/* default */.A && common/* default */.A.locals ? common/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/utils/data_utils/local_storage_handlers.js\n/**\n * Saves employee table data and budget counters in local storage.\n */\nfunction saveTableData(table_id = \"employee-table\", save_as = 'employeeTableData') {\n var table = document.getElementById(table_id);\n var rows = table.rows;\n var tableData = [];\n for (var i = 0; i < rows.length; i++) {\n var cols = rows[i].cells;\n var rowData = [];\n for (var j = 0; j < cols.length; j++) {\n // for the action buttons, save the chosen action, not the button text\n if (cols[j].querySelector('button')) {\n rowData.push(rows[i].className);\n } else {\n rowData.push(cols[j].innerText);\n }\n }\n tableData.push(rowData);\n }\n\n // Save JSON string to localStorage\n localStorage.setItem(save_as, JSON.stringify(tableData));\n saveCounters();\n}\n\n/**\n * Loads employee table data and budget counters from local storage.\n * \n */\nfunction loadTableData(table_name_in_storage = \"employeeTableData\") {\n var data = localStorage.getItem(table_name_in_storage);\n if (data) {\n var tableData = JSON.parse(data);\n var table = document.getElementById(\"employee-table\");\n\n // It's good practice to empty the existing table first\n while (table.rows.length > 1) {\n table.deleteRow(1);\n }\n\n // Now, add the loaded rows to the table\n for (var i = 1; i < tableData.length; i++) {\n var newRow = table.insertRow(-1);\n var ncols = tableData[i].length;\n for (var j = 0; j < ncols - 1; j++) {\n var newCell = newRow.insertCell(j);\n newCell.innerText = tableData[i][j];\n // Add the cost column \n if (j == ncols - 2) {\n newCell.classList.add('cost');\n newCell.setAttribute('cost', unformatCurrency(tableData[i][j]));\n }\n }\n // Add the action buttons and load saved class\n var lastCell = newRow.insertCell(ncols - 1);\n lastCell.innerHTML = `\n
\n \n \n \n
\n `;\n newRow.classList.add(tableData[i][ncols - 1]);\n }\n\n //retrieve counter values\n loadCounters();\n }\n}\n\n// also save counters in sidebar\nfunction saveCounters() {\n localStorage.setItem('personnel_baseline', personnel_baseline.toString());\n localStorage.setItem('personnel_supp', personnel_supp.toString());\n // Add more here\n}\n\n// load counters in sidebar\nfunction loadCounters() {\n personnel_baseline = parseInt(localStorage.getItem('personnel_baseline'), 10);\n personnel_supp = parseInt(localStorage.getItem('personnel_supp'), 10);\n updateDisplay();\n}\n\n// save page state\nfunction updatePageState(page) {\n localStorage.setItem('page_state', page);\n}\n\n// load page state\nfunction loadPageState(page) {\n const pageState = localStorage.getItem('page_state');\n return pageState !== null ? pageState : 'welcome';\n}\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/header/header.css\nvar header = __webpack_require__(107);\n;// CONCATENATED MODULE: ./src/js/components/header/header.css\n\n \n \n \n \n \n \n \n \n \n\nvar header_options = {};\n\nheader_options.styleTagTransform = (styleTagTransform_default());\nheader_options.setAttributes = (setAttributesWithoutAttributes_default());\nheader_options.insert = insertBySelector_default().bind(null, \"head\");\nheader_options.domAPI = (styleDomAPI_default());\nheader_options.insertStyleElement = (insertStyleElement_default());\n\nvar header_update = injectStylesIntoStyleTag_default()(header/* default */.A, header_options);\n\n\n\n\n /* harmony default export */ const header_header = (header/* default */.A && header/* default */.A.locals ? header/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/header/header.js\n\nconst Subtitle = {\n update: function (subtitle) {\n // get current fund\n var fund = localStorage.getItem(\"fund\");\n if (fund) {\n var subtitle = `${subtitle}: ${fund}`;\n }\n document.getElementById(\"subtitle\").textContent = subtitle;\n }\n};\n/* harmony default export */ const components_header_header = (Subtitle);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/welcome/welcome.css\nvar welcome = __webpack_require__(235);\n;// CONCATENATED MODULE: ./src/js/components/welcome/welcome.css\n\n \n \n \n \n \n \n \n \n \n\nvar welcome_options = {};\n\nwelcome_options.styleTagTransform = (styleTagTransform_default());\nwelcome_options.setAttributes = (setAttributesWithoutAttributes_default());\nwelcome_options.insert = insertBySelector_default().bind(null, \"head\");\nwelcome_options.domAPI = (styleDomAPI_default());\nwelcome_options.insertStyleElement = (insertStyleElement_default());\n\nvar welcome_update = injectStylesIntoStyleTag_default()(welcome/* default */.A, welcome_options);\n\n\n\n\n /* harmony default export */ const welcome_welcome = (welcome/* default */.A && welcome/* default */.A.locals ? welcome/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/welcome/welcome.js\n\n\n// Hide and unhide welcome buttons\nfunction unhideWelcomeButtons() {\n document.getElementById(\"welcome-page\").style.display = \"block\";\n}\nfunction hideWelcomeButtons() {\n document.getElementById(\"welcome-page\").style.display = \"none\";\n}\nconst Welcome = {\n show: unhideWelcomeButtons,\n hide: hideWelcomeButtons\n};\n/* harmony default export */ const components_welcome_welcome = (Welcome);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/body/body.css\nvar body = __webpack_require__(9);\n;// CONCATENATED MODULE: ./src/js/components/body/body.css\n\n \n \n \n \n \n \n \n \n \n\nvar body_options = {};\n\nbody_options.styleTagTransform = (styleTagTransform_default());\nbody_options.setAttributes = (setAttributesWithoutAttributes_default());\nbody_options.insert = insertBySelector_default().bind(null, \"head\");\nbody_options.domAPI = (styleDomAPI_default());\nbody_options.insertStyleElement = (insertStyleElement_default());\n\nvar body_update = injectStylesIntoStyleTag_default()(body/* default */.A, body_options);\n\n\n\n\n /* harmony default export */ const body_body = (body/* default */.A && body/* default */.A.locals ? body/* default */.A.locals : undefined);\n\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/modal/modal.css\nvar modal = __webpack_require__(95);\n;// CONCATENATED MODULE: ./src/js/components/modal/modal.css\n\n \n \n \n \n \n \n \n \n \n\nvar modal_options = {};\n\nmodal_options.styleTagTransform = (styleTagTransform_default());\nmodal_options.setAttributes = (setAttributesWithoutAttributes_default());\nmodal_options.insert = insertBySelector_default().bind(null, \"head\");\nmodal_options.domAPI = (styleDomAPI_default());\nmodal_options.insertStyleElement = (insertStyleElement_default());\n\nvar modal_update = injectStylesIntoStyleTag_default()(modal/* default */.A, modal_options);\n\n\n\n\n /* harmony default export */ const modal_modal = (modal/* default */.A && modal/* default */.A.locals ? modal/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/modal/modal.js\n\nfunction clearModal() {\n updateModalTitle('');\n document.getElementById('modal-body').innerHTML = '';\n //removeAllModalLinks()\n}\n\n// function removeAllModalLinks(){\n// TODO\n// }\n\nfunction hideModal(modal_id) {\n $('#' + modal_id).modal('hide');\n}\nfunction showModal(modal_id) {\n $('#' + modal_id).modal('show');\n}\nfunction showModalHandler() {\n showModal('main-modal');\n}\nconst Link = {\n add: function (button_id) {\n document.getElementById(button_id).addEventListener('click', showModalHandler);\n },\n remove: function (button_id) {\n document.getElementById(button_id).removeEventListener('click', showModalHandler);\n }\n};\nfunction updateModalTitle(title) {\n document.getElementById('modal-title').textContent = title;\n}\nconst Title = {\n update: function (title) {\n updateModalTitle(title);\n }\n};\nconst Modal = {\n hide: function () {\n hideModal('main-modal');\n },\n show: function () {\n showModal('main-modal');\n },\n clear: clearModal,\n Title: Title,\n Link: Link\n};\n/* harmony default export */ const components_modal_modal = (Modal);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/nav_buttons/nav_buttons.css\nvar nav_buttons = __webpack_require__(595);\n;// CONCATENATED MODULE: ./src/js/components/nav_buttons/nav_buttons.css\n\n \n \n \n \n \n \n \n \n \n\nvar nav_buttons_options = {};\n\nnav_buttons_options.styleTagTransform = (styleTagTransform_default());\nnav_buttons_options.setAttributes = (setAttributesWithoutAttributes_default());\nnav_buttons_options.insert = insertBySelector_default().bind(null, \"head\");\nnav_buttons_options.domAPI = (styleDomAPI_default());\nnav_buttons_options.insertStyleElement = (insertStyleElement_default());\n\nvar nav_buttons_update = injectStylesIntoStyleTag_default()(nav_buttons/* default */.A, nav_buttons_options);\n\n\n\n\n /* harmony default export */ const nav_buttons_nav_buttons = (nav_buttons/* default */.A && nav_buttons/* default */.A.locals ? nav_buttons/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/nav_buttons/nav_buttons.js\n\n\nfunction initializeNavButtons() {\n // initialize last button\n const last_btn = document.getElementById('btn-last');\n last_btn.addEventListener('click', lastPage);\n // initialize next button\n const next_btn = document.getElementById('btn-next');\n next_btn.addEventListener('click', nextPage);\n disable('btn-next');\n}\nfunction hideNavButtons() {\n document.getElementById('nav-btns').style.display = 'none';\n}\nfunction showNavButtons() {\n document.getElementById('nav-btns').style.display = 'block';\n initializeNavButtons();\n}\nfunction disable(button_id) {\n document.getElementById(button_id).classList.add('disabled');\n}\nfunction enable(button_id) {\n document.getElementById(button_id).classList.remove('disabled');\n}\nconst Next = {\n disable: function () {\n disable('btn-next');\n },\n enable: function () {\n enable('btn-next');\n }\n};\nconst Last = {\n disable: function () {\n disable('btn-last');\n },\n enable: function () {\n enable('btn-last');\n }\n};\nconst NavButtons = {\n hide: hideNavButtons,\n show: showNavButtons,\n Next: Next,\n Last: Last\n};\n/* harmony default export */ const components_nav_buttons_nav_buttons = (NavButtons);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/prompt/prompt.css\nvar prompt_prompt = __webpack_require__(225);\n;// CONCATENATED MODULE: ./src/js/components/prompt/prompt.css\n\n \n \n \n \n \n \n \n \n \n\nvar prompt_options = {};\n\nprompt_options.styleTagTransform = (styleTagTransform_default());\nprompt_options.setAttributes = (setAttributesWithoutAttributes_default());\nprompt_options.insert = insertBySelector_default().bind(null, \"head\");\nprompt_options.domAPI = (styleDomAPI_default());\nprompt_options.insertStyleElement = (insertStyleElement_default());\n\nvar prompt_update = injectStylesIntoStyleTag_default()(prompt_prompt/* default */.A, prompt_options);\n\n\n\n\n /* harmony default export */ const components_prompt_prompt = (prompt_prompt/* default */.A && prompt_prompt/* default */.A.locals ? prompt_prompt/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/prompt/subcomponents/text.js\nfunction showPrompt() {\n document.getElementById(\"prompt-div\").style.display = \"block\";\n}\nfunction hidePrompt() {\n document.getElementById('prompt-div').style.display = 'none';\n}\nfunction updatePrompt(prompt) {\n document.getElementById('prompt').textContent = prompt;\n showPrompt();\n}\nconst Text = {\n show: showPrompt,\n hide: hidePrompt,\n update: function (text) {\n updatePrompt(text);\n }\n};\n/* harmony default export */ const subcomponents_text = (Text);\n;// CONCATENATED MODULE: ./src/js/components/prompt/subcomponents/buttons.js\nfunction showPromptButton(id) {\n // make buttons visible\n document.getElementById(id).style.display = 'inline';\n}\nfunction updatePromptButton(id, text) {\n document.getElementById(id).textContent = text;\n showPromptButton(id);\n}\nfunction hidePromptButton(id) {\n document.getElementById(id).style.display = 'none';\n}\nfunction unclickAll() {\n document.getElementById('option1').classList.remove('clicked');\n document.getElementById('option2').classList.remove('clicked');\n}\nfunction applyClickedStyle(button) {\n unclickAll();\n button.classList.add('clicked');\n}\nfunction addPromptButtonAction(button_id, action_fn) {\n const buttonElement = document.getElementById(button_id);\n buttonElement.addEventListener('click', action_fn);\n buttonElement.addEventListener('click', function () {\n applyClickedStyle(this);\n });\n}\nfunction removePromptButtonAction(button_id, action_fn) {\n document.getElementById(button_id).removeEventListener('click', action_fn);\n}\nconst Left = {\n show: function () {\n showPromptButton('option1');\n },\n hide: function () {\n hidePromptButton('option1');\n },\n updateText: function (text) {\n updatePromptButton('option1', text);\n },\n addAction: function (action_fn) {\n addPromptButtonAction('option1', action_fn);\n },\n removeAction: function (action_fn) {\n removePromptButtonAction('option1', action_fn);\n }\n};\nconst Right = {\n show: function () {\n showPromptButton('option2');\n },\n hide: function () {\n hidePromptButton('option2');\n },\n updateText: function (text) {\n updatePromptButton('option2', text);\n },\n addAction: function (action_fn) {\n addPromptButtonAction('option2', action_fn);\n },\n removeAction: function (action_fn) {\n removePromptButtonAction('option2', action_fn);\n }\n};\nconst Buttons = {\n Left: Left,\n Right: Right,\n show: function () {\n showPromptButton('option1');\n showPromptButton('option2');\n },\n hide: function () {\n hidePromptButton('option1');\n hidePromptButton('option2');\n },\n reset: unclickAll\n};\n/* harmony default export */ const buttons = (Buttons);\n;// CONCATENATED MODULE: ./src/js/components/prompt/prompt.js\n\n\n\nconst Prompt = {\n Text: subcomponents_text,\n Buttons: buttons,\n hide: function () {\n subcomponents_text.hide();\n buttons.hide();\n },\n show: function () {\n subcomponents_text.show();\n buttons.show();\n }\n};\n/* harmony default export */ const js_components_prompt_prompt = (Prompt);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/sidebar/sidebar.css\nvar sidebar = __webpack_require__(263);\n;// CONCATENATED MODULE: ./src/js/components/sidebar/sidebar.css\n\n \n \n \n \n \n \n \n \n \n\nvar sidebar_options = {};\n\nsidebar_options.styleTagTransform = (styleTagTransform_default());\nsidebar_options.setAttributes = (setAttributesWithoutAttributes_default());\nsidebar_options.insert = insertBySelector_default().bind(null, \"head\");\nsidebar_options.domAPI = (styleDomAPI_default());\nsidebar_options.insertStyleElement = (insertStyleElement_default());\n\nvar sidebar_update = injectStylesIntoStyleTag_default()(sidebar/* default */.A, sidebar_options);\n\n\n\n\n /* harmony default export */ const sidebar_sidebar = (sidebar/* default */.A && sidebar/* default */.A.locals ? sidebar/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/utils/common_utils.js\n// Function to format number as currency\nconst formatCurrency = (amount, return_zero = false) => {\n var amount = Math.round(parseFloat(amount));\n if (amount == NaN) {\n return \"$ -\";\n }\n if (amount < 0) {\n return '($' + amount.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',') + ')';\n } else if (amount == 0) {\n if (return_zero) {\n return '$0';\n }\n return \"$ -\";\n }\n return '$' + amount.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n};\n\n// function to convert formatted number to a float\nconst common_utils_unformatCurrency = formattedAmount => {\n // Remove any currency symbols and commas\n let numericalPart = formattedAmount.replace(/[^0-9.-]+/g, \"\");\n return parseFloat(numericalPart);\n};\nfunction displayWithCommas(value) {\n return formatCurrency(value).replace('$', '');\n}\nfunction delay(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\nasync function pauseExecution(seconds) {\n await delay(seconds * 1000); // convert to milliseconds\n}\n;// CONCATENATED MODULE: ./src/js/components/sidebar/sidebar.js\n\n\n\n\n// Assuming you have a CSS variable --main-color defined on the :root\nconst root = document.documentElement;\nconst sideBarWidth = getComputedStyle(root).getPropertyValue('--sidebar-width').trim();\nfunction hideSidebar() {\n document.getElementById('sidebar-panel').style.display = 'none';\n document.getElementById('main-panel').style.width = '100%';\n document.querySelector('header').style.width = '100%';\n}\nfunction showSidebar() {\n const sidebar = document.getElementById('sidebar-panel');\n const mainPanel = document.getElementById('main-panel');\n const header = document.querySelector('header');\n sidebar.style.display = 'block'; // Show the sidebar\n\n // Calculate the remaining width for the main panel and header\n var contentWidth = document.documentElement.clientWidth;\n mainPanel.style.width = `${contentWidth - parseInt(sideBarWidth, 10)}px`;\n header.style.width = `${contentWidth - parseInt(sideBarWidth, 10)}px`;\n\n // add target to sidebar\n addTarget(TARGET);\n\n // add event listener to resize content if window is adjusted\n window.addEventListener('resize', showSidebar);\n}\nfunction updateSidebarTitle(new_title) {\n document.getElementById('sidebar-title').textContent = new_title;\n}\nfunction updateSidebarStat(stat_id, new_figure) {\n replaceSidebarStat(stat_id, new_figure);\n // TODO: save in memory\n updateTotals();\n}\nfunction replaceSidebarStat(stat_id, new_figure) {\n const span = document.querySelector(`#${stat_id} .stat`);\n span.setAttribute('value', new_figure);\n span.textContent = formatCurrency(new_figure);\n}\nfunction incrementSidebarStat(stat_id, new_figure) {\n updateSidebarStat(stat_id, fetchStat(stat_id) + new_figure);\n}\nfunction fetchStat(stat_id) {\n const stat = document.querySelector(`#${stat_id} .stat`);\n return parseFloat(stat.getAttribute('value')) || 0;\n}\n\n// Function to update the display of the current and supp variables\nfunction updateTotals() {\n // update bottom lines\n let supp_total = -fetchStat('supp-revenue') + fetchStat('supp-personnel') + fetchStat('supp-nonpersonnel');\n let baseline_total = -fetchStat('baseline-revenue') + fetchStat('baseline-personnel') + fetchStat('baseline-nonpersonnel');\n replaceSidebarStat('supp-total', supp_total);\n replaceSidebarStat('baseline-total', baseline_total);\n\n // color code based on target\n var target = fetchStat('target');\n if (baseline_total <= target) {\n document.querySelector('#baseline-total .stat').style.color = \"green\";\n }\n if (baseline_total > target) {\n document.querySelector('#baseline-total .stat').style.color = \"red\";\n }\n}\nfunction addTarget(target) {\n replaceSidebarStat('target', target);\n}\nfunction updateTitle(title) {\n document.querySelector('#sidebar-title').textContent = title;\n}\nconst Sidebar = {\n hide: hideSidebar,\n show: showSidebar,\n updateTitle: updateSidebarTitle,\n updateStat: updateSidebarStat,\n incrementStat: incrementSidebarStat,\n addTarget: addTarget,\n updateTitle: updateTitle\n};\n/* harmony default export */ const components_sidebar_sidebar = (Sidebar);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/table/table.css\nvar table = __webpack_require__(279);\n;// CONCATENATED MODULE: ./src/js/components/table/table.css\n\n \n \n \n \n \n \n \n \n \n\nvar table_options = {};\n\ntable_options.styleTagTransform = (styleTagTransform_default());\ntable_options.setAttributes = (setAttributesWithoutAttributes_default());\ntable_options.insert = insertBySelector_default().bind(null, \"head\");\ntable_options.domAPI = (styleDomAPI_default());\ntable_options.insertStyleElement = (insertStyleElement_default());\n\nvar table_update = injectStylesIntoStyleTag_default()(table/* default */.A, table_options);\n\n\n\n\n /* harmony default export */ const table_table = (table/* default */.A && table/* default */.A.locals ? table/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/headers.js\nfunction addTableHeaders(header_array) {\n // Get the table element by its ID\n const table = document.getElementById('main-table');\n\n // Create a table header row element\n const headerRow = document.createElement('tr');\n for (const headerText of header_array) {\n // Create a header cell element\n const headerCell = document.createElement('th');\n headerCell.textContent = headerText;\n\n // Append the header cell to the header row\n headerRow.appendChild(headerCell);\n }\n\n // Append the header row to the table header\n let thead = table.querySelector('thead');\n thead.appendChild(headerRow);\n}\nconst Header = {\n add: function (header_array) {\n addTableHeaders(header_array);\n }\n};\n/* harmony default export */ const headers = (Header);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/rows.js\n\n\nfunction addNewRow(data_dictionary) {\n // Get the table element by its ID\n const table = document.getElementById('main-table');\n\n // check if header has already been added\n let header_row = table.querySelector('thead tr');\n if (!header_row) {\n headers.add(Object.keys(data_dictionary));\n }\n\n // add row of data\n const new_row = document.createElement('tr');\n const cell_data_array = Object.values(data_dictionary);\n for (const cell_data of cell_data_array) {\n // Create new cell and add it to the row\n const newCell = document.createElement('td');\n newCell.textContent = cell_data;\n new_row.appendChild(newCell);\n }\n console.log(new_row);\n\n // Append the new row to the table body\n let tbody = table.querySelector('tbody');\n tbody.appendChild(new_row);\n}\nfunction saveRowEdits(row) {\n var cells = row.querySelectorAll('td');\n cells.forEach(cell => {\n // save dropdown values\n if (cell.querySelector('select')) {\n var serviceSelector = cell.querySelector('select');\n cell.textContent = serviceSelector.value;\n } else if (cell.querySelector('input')) {\n // save new entered value in textbox\n var textbox = cell.querySelector('input');\n var enteredValue = textbox.value;\n // update display and format with currency if relevant\n if (cell.classList.contains('cost')) {\n // if cost, remove commas first\n enteredValue = enteredValue.replaceAll(',', '');\n cell.textContent = formatCurrency(enteredValue);\n } else {\n cell.textContent = enteredValue;\n }\n // set value attribute to the new user input\n cell.setAttribute('value', enteredValue);\n }\n });\n}\nconst Rows = {\n add: function (data_dictionary) {\n addNewRow(data_dictionary);\n },\n saveEdits: function (row) {\n saveRowEdits(row);\n }\n};\n/* harmony default export */ const rows = (Rows);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/buttons.js\n\nfunction hideButton(className) {\n return function () {\n var buttons = document.getElementsByClassName(className);\n for (var i = 0; i < buttons.length; i++) {\n buttons[i].style.display = 'none';\n }\n };\n}\nfunction showButton(className) {\n return function () {\n var buttons = document.getElementsByClassName(className);\n for (var i = 0; i < buttons.length; i++) {\n buttons[i].style.display = 'inline';\n }\n };\n}\nfunction updateButtonText(className, text) {\n document.querySelector(`.${className}`).textContent = text;\n}\n\n// EDIT button\n\nfunction handleRowEdit(makeRowEditable, updateCallback) {\n // attach an event listener to each edit button in every row\n var editButtons = document.getElementsByClassName('btn-edit');\n for (var i = 0; i < editButtons.length; i++) {\n editButtons[i].addEventListener('click', async function (event) {\n // Determine what was clicked on within the table\n var rowToEdit = event.target.closest('tr');\n // mark row as being edited\n rowToEdit.classList.add('active-editing');\n\n // turn relevant entries into textboxes\n makeRowEditable();\n\n // hide edit buttons\n Edit.hide();\n initializeConfirmButton(updateCallback);\n });\n }\n ;\n}\n\n// Confirm button\n\nfunction initializeConfirmButton(updateCallback) {\n // get element and add listener for click\n var rowToEdit = document.querySelector('.active-editing');\n const confirm_btn = rowToEdit.querySelector(\".btn-confirm\");\n // show the row's confirm button\n confirm_btn.style.display = 'block';\n confirm_btn.addEventListener('click', function () {\n ;\n // save row edits\n rows.saveEdits(rowToEdit);\n // update values in sidebar\n updateCallback();\n // make row no longer green\n rowToEdit.classList.remove('active-editing');\n // show edit buttons and hide confirm buttons\n Edit.show();\n Confirm.hide();\n });\n}\nconst Edit = {\n html: '',\n hide: hideButton('btn-edit'),\n show: showButton('btn-edit'),\n init: function (makeRowEditable, updateCallback) {\n handleRowEdit(makeRowEditable, updateCallback);\n }\n};\nconst Delete = {\n html: '',\n hide: hideButton('btn-delete'),\n show: showButton('btn-delete')\n};\nconst Confirm = {\n html: '',\n hide: hideButton('btn-confirm'),\n show: showButton('btn-confirm')\n};\nconst AddRow = {\n hide: hideButton('btn-add'),\n show: showButton('btn-add'),\n updateText: function (text) {\n updateButtonText('btn-add', text);\n }\n};\nconst buttons_Buttons = {\n Delete: Delete,\n Edit: Edit,\n Confirm: Confirm,\n AddRow: AddRow,\n edit_confirm_btns: Edit.html + Confirm.html,\n all_btns: Delete.html + Edit.html + Confirm.html\n};\n/* harmony default export */ const subcomponents_buttons = (buttons_Buttons);\n;// CONCATENATED MODULE: ./src/js/components/form/subcomponents/dropdown.js\nasync function createDropdownFromJSON(json_path) {\n // Fetch JSON data from a file asynchronously\n const response = await fetch(json_path);\n const dataArray = await response.json();\n\n // Creating a select element\n const selectElement = document.createElement('select');\n\n // Looping through the array and creating an option for each element\n dataArray.forEach(item => {\n const optionElement = document.createElement('option');\n optionElement.value = item.id; // Setting the option value to the item id\n optionElement.textContent = item.name; // Setting the display text to the item name\n selectElement.appendChild(optionElement); // Appending the option to the select\n });\n\n // Return the select element so it can be appended to the document\n return selectElement;\n}\nconst Dropdown = {\n createFromJSON: function (json_path) {\n return createDropdownFromJSON(json_path);\n }\n};\n/* harmony default export */ const dropdown = (Dropdown);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/cells.js\n\n\n\n// return cell value attribute or 0 if it does not exist\nfunction getCellValue(row, className) {\n var cell = row.querySelector(`.${className}`);\n var cellValue = cell ? cell.getAttribute('value') : null;\n return cellValue ? parseFloat(cellValue) : 0;\n}\n\n// return text in cell\nfunction getCellText(row, className) {\n var cell = row.querySelector(`.${className}`);\n return cell.textContent;\n}\nfunction updateTableCell(row, col_class, new_value) {\n const cell = row.querySelector(`.${col_class}`);\n cell.setAttribute('value', new_value);\n cell.textContent = formatCurrency(new_value);\n}\nfunction createEditableCell(cellClass) {\n // get cell\n const cell = document.querySelector(`.active-editing td.${cellClass}`);\n // Create an input element to edit the value\n var textbox = document.createElement('input');\n textbox.type = 'text';\n textbox.value = cell.textContent;\n // Clear the current content and append the textbox to the cell\n cell.innerHTML = '';\n cell.appendChild(textbox);\n}\nasync function createSelectCell(cellClass, json_filepath) {\n // get cell\n const cell = document.querySelector(`.active-editing td.${cellClass}`);\n // add service dropdown\n const serviceDropdown = await dropdown.createFromJSON(json_filepath);\n serviceDropdown.value = cell.textContent;\n // Clear the current content and append the textbox to the cell\n cell.innerHTML = '';\n cell.appendChild(serviceDropdown);\n}\nconst Cell = {\n getValue: function (row, className) {\n return getCellValue(row, className);\n },\n getText: function (row, className) {\n return getCellText(row, className);\n },\n updateValue: function (row, col_class, new_value) {\n updateTableCell(row, col_class, new_value);\n },\n createTextbox: function (className) {\n createEditableCell(className);\n },\n createDropdown: function (className, json_filepath) {\n createSelectCell(className, json_filepath);\n }\n};\n/* harmony default export */ const cells = (Cell);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/columns.js\n\n\n// position is index at which new column will be inserted\nfunction addCol(position, htmlContent = '', headerTitle = '') {\n // Get the table element by its ID\n let table = document.getElementById('main-table');\n\n // Validate position\n let maxPosition = table.rows[0].cells.length;\n if (position < 0 || position > maxPosition) {\n console.error(`Position ${position} is out of bounds.`);\n return;\n }\n\n // Insert the header if provided\n let thead = table.tHead;\n if (headerTitle && thead) {\n let th = document.createElement('th');\n th.innerHTML = headerTitle; // Use innerHTML to insert HTML content\n thead.rows[0].insertBefore(th, thead.rows[0].cells[position]);\n }\n\n // Insert new cells into each row of the table body\n let tbody = table.tBodies[0];\n if (tbody) {\n for (let i = 0; i < tbody.rows.length; i++) {\n let row = tbody.rows[i];\n let td = document.createElement('td');\n td.innerHTML = htmlContent; // Use innerHTML to insert HTML content\n row.insertBefore(td, row.cells[position]);\n }\n }\n}\nfunction ncols() {\n const table = document.getElementById('main-table');\n // Ensure that the row exists before counting the columns\n return table.rows[0].cells.length;\n}\nfunction addColToEnd(htmlContents = [], headerTitle = '') {\n // count columns and add new column to the end\n const position = ncols('main-table');\n addCol(position, htmlContents, headerTitle);\n}\nfunction assignClassToColumn(headerName, className) {\n // Get the table element by its ID\n let table = document.getElementById('main-table');\n\n // Find the index of the column by its header name\n const thead = table.tHead;\n if (!thead || thead.rows.length === 0) {\n console.error('The table header is not found or has no rows.');\n return;\n }\n let headerCellIndex = -1;\n const headerCells = thead.rows[0].cells; // Assuming the first row contains header cells ()\n for (let i = 0; i < headerCells.length; i++) {\n if (headerCells[i].textContent.trim() === headerName) {\n headerCellIndex = i;\n break;\n }\n }\n if (headerCellIndex === -1) {\n console.error(`No header found with name \"${headerName}\"`);\n return;\n }\n\n // Assign the class to each cell in the specified column index within the tbody\n let tbody = table.tBodies[0];\n if (tbody) {\n let bodyRows = tbody.rows;\n for (let row of bodyRows) {\n if (row.cells[headerCellIndex]) {\n row.cells[headerCellIndex].classList.add(className);\n }\n }\n }\n}\nfunction addCostClass(headerName) {\n assignClassToColumn(headerName, 'cost');\n\n // Get all the cells with the specified class name\n const cells = document.querySelectorAll(`.cost`);\n cells.forEach(cell => {\n // Get the current text content of the cell and assign it to 'value' attribute\n if (!cell.getAttribute('value')) {\n const cellValue = cell.textContent.trim();\n cell.setAttribute('value', cellValue);\n\n // Now format the text content like currency and replace it in the cell\n const formattedCurrency = formatCurrency(parseFloat(cellValue));\n cell.textContent = formattedCurrency;\n }\n });\n}\nfunction assignColumnClasses(columnDefinitions) {\n columnDefinitions.forEach(column => {\n // Assign class to column\n assignClassToColumn(column.title, column.className);\n\n // If the column is a cost column, add the specific cost class\n if (column.isCost) {\n addCostClass(column.title);\n }\n });\n}\nconst Column = {\n add: function (position, htmlContent, headerTitle) {\n return addCol(position, htmlContent, headerTitle);\n },\n addAtEnd: function (htmlContent, headerTitle) {\n return addColToEnd(htmlContent, headerTitle);\n },\n assignClasses: function (column_definitions) {\n return assignColumnClasses(column_definitions);\n }\n};\n/* harmony default export */ const columns = (Column);\n;// CONCATENATED MODULE: ./src/js/utils/data_utils/JSON_data_handlers.js\nasync function fetchJSON(jsonFilePath) {\n return fetch(jsonFilePath).then(response => {\n if (!response.ok) {\n throw new Error('Network response was not ok');\n }\n return response.json();\n });\n}\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/data.js\n\nasync function loadJSONIntoTable(jsonFilePath) {\n const data = await fetchJSON(jsonFilePath);\n try {\n if (Array.isArray(data)) {\n const table = document.getElementById('main-table');\n const thead = table.querySelector('thead');\n const tbody = table.querySelector('tbody');\n\n // clear existing data\n thead.innerHTML = '';\n tbody.innerHTML = '';\n\n // Create table header row\n const headerRow = document.createElement('tr');\n Object.keys(data[0]).forEach(key => {\n const header = document.createElement('th');\n header.textContent = key;\n headerRow.appendChild(header);\n });\n thead.appendChild(headerRow);\n\n // Create table body rows\n data.forEach(item => {\n const row = document.createElement('tr');\n Object.values(item).forEach(val => {\n const cell = document.createElement('td');\n cell.textContent = val;\n row.appendChild(cell);\n });\n tbody.appendChild(row);\n });\n } else {\n console.error('The provided JSON file does not contain an array of objects.');\n }\n } catch (error) {\n console.error('Failed to load and parse the JSON file:', error);\n }\n}\nconst Data = {\n loadFromJSON: loadJSONIntoTable\n};\n/* harmony default export */ const data = (Data);\n;// CONCATENATED MODULE: ./src/js/components/table/table.js\n\n\n\n\n\n\n\nfunction adjustTableWidth(width_pct) {\n const table = document.getElementById('main-table');\n table.style.width = width_pct;\n}\nfunction clearTable() {\n const table = document.getElementById('main-table');\n table.querySelector('thead').innerHTML = '';\n table.querySelector('tbody').innerHTML = '';\n}\nfunction showTable() {\n const table = document.getElementById('main-table');\n table.style.display = 'table';\n}\nfunction hideTable() {\n const table = document.getElementById('main-table');\n table.style.display = 'none';\n subcomponents_buttons.AddRow.hide();\n}\nconst Table = {\n Buttons: subcomponents_buttons,\n Cell: cells,\n Columns: columns,\n Header: headers,\n Rows: rows,\n Data: data,\n // functions\n adjustWidth: function (width_pct) {\n adjustTableWidth(width_pct);\n },\n clear: clearTable,\n hide: hideTable,\n show: showTable\n};\n/* harmony default export */ const components_table_table = (Table);\n;// CONCATENATED MODULE: ./src/js/components/body/body.js\n\n\n\n\n\n\n\nfunction resetPage() {\n // hide everything in the body\n components_welcome_welcome.hide();\n components_modal_modal.clear();\n components_modal_modal.hide();\n components_nav_buttons_nav_buttons.hide();\n js_components_prompt_prompt.hide();\n components_table_table.hide();\n components_sidebar_sidebar.hide();\n // disable next button\n components_nav_buttons_nav_buttons.Next.disable();\n js_components_prompt_prompt.Buttons.reset();\n}\nconst Body = {\n reset: resetPage\n};\n/* harmony default export */ const components_body_body = (Body);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/form/form.css\nvar form_form = __webpack_require__(109);\n;// CONCATENATED MODULE: ./src/js/components/form/form.css\n\n \n \n \n \n \n \n \n \n \n\nvar form_options = {};\n\nform_options.styleTagTransform = (styleTagTransform_default());\nform_options.setAttributes = (setAttributesWithoutAttributes_default());\nform_options.insert = insertBySelector_default().bind(null, \"head\");\nform_options.domAPI = (styleDomAPI_default());\nform_options.insertStyleElement = (insertStyleElement_default());\n\nvar form_update = injectStylesIntoStyleTag_default()(form_form/* default */.A, form_options);\n\n\n\n\n /* harmony default export */ const components_form_form = (form_form/* default */.A && form_form/* default */.A.locals ? form_form/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/form/subcomponents/fields.js\n// function to add questions to forms\n// type is 'input' or 'textarea'\n// inputType is for validation ('number' or 'text', etc)\nfunction appendFormElement(type, label, inputId, required, inputType, form_id = 'new-form', cost = false) {\n // change if we want forms elsewhere\n const form = document.getElementById(form_id);\n\n // create outer wrapper for element\n const wrapper = document.createElement('div');\n\n // label question\n const labelEl = document.createElement('label');\n labelEl.textContent = label;\n\n // set type (input or textarea)\n let inputEl;\n if (type === 'input') {\n inputEl = document.createElement('input');\n inputEl.type = inputType;\n } else if (type === 'textarea') {\n inputEl = document.createElement('textarea');\n } else {\n throw new Error('Unsupported element type');\n }\n\n // mark as required if applicable\n inputEl.required = required;\n\n // If an ID is provided, set it on the element\n if (inputId) {\n inputEl.id = inputId;\n }\n\n // add elements\n wrapper.appendChild(labelEl);\n wrapper.appendChild(inputEl);\n form.appendChild(wrapper);\n}\nconst NewField = {\n shortText: function (label, inputId, required = false, form_id = 'new-form', cost = false) {\n appendFormElement('input', label, inputId, required, 'text', form_id);\n },\n longText: function (label, inputId, required = false, form_id = 'new-form', cost = false) {\n appendFormElement('textarea', label, inputId, required, form_id);\n },\n numericInput: function (label, inputId, required = false, form_id = 'new-form', cost = true) {\n appendFormElement('input', label, inputId, required, 'number', form_id);\n }\n};\n/* harmony default export */ const fields = (NewField);\n;// CONCATENATED MODULE: ./src/js/components/form/subcomponents/submit.js\nfunction addSubmitButtonToForm(form_id) {\n // Find the form by its ID\n const form = document.getElementById(form_id);\n\n // Create the container `div` for the button\n const buttonContainer = document.createElement('div');\n buttonContainer.id = 'submit-btn-container';\n\n // Create the submit input\n const submitInput = document.createElement('input');\n submitInput.className = 'btn btn-submit'; // Use appropriate class for your design\n submitInput.type = 'submit';\n submitInput.value = 'Submit';\n\n // Append the submit input to the container\n buttonContainer.appendChild(submitInput);\n\n // Append the container to the form\n form.appendChild(buttonContainer);\n}\nconst SubmitButton = {\n add: function () {\n addSubmitButtonToForm('new-form');\n }\n};\n/* harmony default export */ const subcomponents_submit = (SubmitButton);\n;// CONCATENATED MODULE: ./src/js/components/form/form.js\n\n\n\n\nfunction fetchAllResponses(event) {\n // Assuming `event.target` is the form itself\n const form = event.target;\n\n // Initialize an empty array to hold the input values\n let formData = {};\n\n // Loop through each form element\n for (let i = 0; i < form.elements.length; i++) {\n const element = form.elements[i];\n\n // Exclude elements that aren't inputs, textareas, or select\n if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT') {\n // Exclude input types that are not considered for submission (such as `submit`)\n if (element.type !== 'submit' && element.type !== 'button') {\n formData[element.id] = element.value;\n }\n }\n }\n form.reset();\n return formData;\n}\nfunction addForm(element_id = 'modal-body', form_id = 'new-form') {\n const target_elem = document.getElementById(element_id);\n\n // create form\n const form = document.createElement('form');\n form.setAttribute('id', form_id);\n\n // Append the form to the modal body\n target_elem.appendChild(form);\n}\nconst Form = {\n new: function (parent_elem_id) {\n addForm(parent_elem_id, 'new-form');\n },\n fetchAllResponses: function (event) {\n return fetchAllResponses(event);\n },\n NewField: fields,\n Dropdown: dropdown,\n SubmitButton: subcomponents_submit\n};\n/* harmony default export */ const js_components_form_form = (Form);\n;// CONCATENATED MODULE: ./src/js/views/06_new_initiatives/helpers.js\n\n\n\n\n\n\n\n\nfunction initializePageView() {\n // Prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n\n // Load text\n components_header_header.update('New Initiatives');\n js_components_prompt_prompt.Text.update('Do you have any new initiatives for FY26?');\n js_components_prompt_prompt.Buttons.Left.updateText('Yes');\n js_components_prompt_prompt.Buttons.Right.updateText('No');\n // clicking 'no new initialitives' will also take us to the next page\n js_components_prompt_prompt.Buttons.Right.addAction(pauseAndContinue);\n js_components_prompt_prompt.Buttons.Left.addAction(components_nav_buttons_nav_buttons.Next.enable);\n}\nfunction setUpModal() {\n // Initialize modal\n components_modal_modal.clear();\n components_modal_modal.Link.add('option1');\n components_modal_modal.Title.update('New initiative');\n components_modal_modal.Link.add('add-btn');\n}\nfunction setUpForm() {\n // Set up form\n js_components_form_form.new('modal-body');\n js_components_form_form.NewField.shortText('Initiative Name:', 'Initiative Name', true);\n js_components_form_form.NewField.longText('Explain why this initiative is necessary and describe its potential impact.', 'Explanation', true);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL revenue associated with this initiative?', 'Revenue', true);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL personnel cost?', 'Personnel Cost', true);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL nonpersonnel cost?', 'Non-personnel Cost', true);\n js_components_form_form.SubmitButton.add();\n // Initialize form submission to table data\n handleFormSubmissions();\n}\nfunction setUpTable() {\n // Set up table\n components_table_table.clear();\n components_table_table.adjustWidth('70%');\n components_table_table.Buttons.AddRow.updateText('Add another new initiative');\n}\nfunction handleFormSubmissions(event) {\n // initialize form submission\n const modal = document.getElementById('main-modal');\n modal.addEventListener('submit', function (event) {\n event.preventDefault();\n // get answers from form, hide form, show answers in table\n const responses = js_components_form_form.fetchAllResponses(event);\n // make sure it's not an empty response\n if (Object.values(responses)[0] != '') {\n // change page view\n components_modal_modal.hide();\n js_components_prompt_prompt.hide();\n\n // add data to table\n components_table_table.Rows.add(responses);\n components_table_table.show();\n components_table_table.Buttons.AddRow.show();\n // TODO: save table data\n // TODO: edit cost to show currency correctly\n }\n });\n}\nfunction removeModalLinks() {\n components_modal_modal.Link.remove('option1');\n components_modal_modal.Link.remove('add-btn');\n}\nfunction removePromptButtonListeners() {\n js_components_prompt_prompt.Buttons.Right.removeAction(pauseAndContinue);\n js_components_prompt_prompt.Buttons.Left.removeAction(components_nav_buttons_nav_buttons.Next.enable);\n}\n;// CONCATENATED MODULE: ./src/js/views/06_new_initiatives/main.js\n\n\n\n// set up page and initialize all buttons\nfunction loadNewInitiatives() {\n updatePageState('new-inits');\n initializePageView();\n setUpModal();\n setUpForm();\n setUpTable();\n}\nfunction cleanUpInitiativesPage() {\n removeModalLinks();\n // remove event listeners on prompt buttons\n removePromptButtonListeners();\n}\n;// CONCATENATED MODULE: ./src/js/views/07_summary/main.js\n\n\n\n\n\n\nfunction loadSummaryPage() {\n //update page state\n updatePageState('summary');\n\n // prepare page view\n components_body_body.reset();\n js_components_prompt_prompt.Buttons.Left.updateText('Download Excel');\n js_components_prompt_prompt.Buttons.Right.updateText('Go back and edit');\n\n // update page text\n components_header_header.update('Summary');\n // TODO: update to make dynamic\n js_components_prompt_prompt.Text.update(`Placeholder for summary and any issues.`);\n js_components_prompt_prompt.Buttons.Right.addAction(returnToWelcome);\n}\nfunction cleanUpSummaryPage() {\n js_components_prompt_prompt.Buttons.Right.removeAction(returnToWelcome);\n}\nconst returnToWelcome = () => {\n visitPage('welcome');\n};\n;// CONCATENATED MODULE: ./src/js/views/02_baseline_landing_page/helpers.js\n\n\n\n\n\n\nconst fundCols = [{\n title: 'ID',\n className: 'fund-id'\n}, {\n title: 'Name',\n className: 'fund-name'\n}];\nfunction preparePageView() {\n localStorage.setItem(\"fund\", '');\n\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n\n // update page text\n components_header_header.update('Baseline Budget Request');\n // TODO: update to make dynamic\n js_components_prompt_prompt.Text.update(`We will now ask you a series of questions about your BASELINE budget request.\n At the end, we will ask you about any new initiatives (ie. supplemental requests).\n Select one of your funds to begin.`);\n}\nfunction allowRowSelection() {\n var tableRows = document.querySelectorAll(\"tbody tr\");\n tableRows.forEach(function (row) {\n row.addEventListener('mouseover', function () {\n this.classList.add('hover-effect');\n });\n row.addEventListener('mouseout', function () {\n this.classList.remove('hover-effect');\n });\n row.addEventListener('click', function () {\n selectFund(tableRows, this);\n });\n });\n}\nasync function initializeFundTable() {\n await components_table_table.Data.loadFromJSON(DATA_ROOT + 'funds.json');\n components_table_table.adjustWidth('100%');\n components_table_table.show();\n components_table_table.Columns.assignClasses(fundCols);\n allowRowSelection();\n}\nfunction selectFund(tableRows, selected_row) {\n // remove selected class from any other rows\n tableRows.forEach(function (tableRow) {\n tableRow.classList = '';\n });\n // add selected class to clicked row\n selected_row.classList.add('selected');\n // get fund and save selected fund\n var fund = selected_row.querySelector('.fund-name').textContent;\n localStorage.setItem(\"fund\", fund);\n\n // enable next step\n components_nav_buttons_nav_buttons.Next.enable();\n}\n;// CONCATENATED MODULE: ./src/js/views/02_baseline_landing_page/main.js\n\n\nfunction loadBaselineLandingPage() {\n //update page state\n updatePageState('baseline-landing');\n preparePageView();\n initializeFundTable();\n}\n;// CONCATENATED MODULE: ./src/js/views/01_upload/helpers.js\n\n\n\n\nfunction helpers_initializePageView() {\n // remove fund selection\n localStorage.setItem(\"fund\", '');\n\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n\n // update page text\n components_header_header.update('Excel Upload');\n\n // TODO: update to make upload actually work\n js_components_prompt_prompt.Text.update(`Placeholder for Excel Upload`);\n js_components_prompt_prompt.Buttons.Left.updateText('Upload');\n js_components_prompt_prompt.Buttons.Left.show();\n js_components_prompt_prompt.Buttons.Left.addAction(uploadExcelAction);\n}\nfunction uploadExcelAction() {\n components_nav_buttons_nav_buttons.Next.enable();\n}\n;// CONCATENATED MODULE: ./src/js/views/01_upload/main.js\n\n\nfunction loadUploadPage() {\n //update page state\n updatePageState('upload');\n helpers_initializePageView();\n}\n;// CONCATENATED MODULE: ./src/js/views/00_welcome/helpers.js\n\n\n\n\n\n\n\nfunction _00_welcome_helpers_initializePageView() {\n // page set up\n components_body_body.reset();\n components_header_header.update(\"Welcome\");\n components_welcome_welcome.show();\n}\nfunction addLinks() {\n // initialize links in buttons\n document.getElementById('step-upload').addEventListener('click', loadUploadPage);\n document.getElementById('step-initiatives').addEventListener('click', loadNewInitiatives);\n document.getElementById('step-revenue').addEventListener('click', loadBaselineLandingPage);\n document.getElementById('step-finish').addEventListener('click', loadSummaryPage);\n}\n;// CONCATENATED MODULE: ./src/js/views/00_welcome/main.js\n\n\nfunction initializeWelcomePage() {\n updatePageState('welcome');\n _00_welcome_helpers_initializePageView();\n addLinks();\n}\n;// CONCATENATED MODULE: ./src/js/views/03_revenue/main.js\n\n\n\n\n\n\n\n\nfunction loadRevenuePage() {\n //update page state\n updatePageState('revenue');\n\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n\n // update page text\n components_header_header.update('Revenue Projections');\n // TODO: update to make dynamic\n js_components_prompt_prompt.Text.update(`Your revenue projection for FY26 is ${formatCurrency(REVENUE, true)}`);\n js_components_prompt_prompt.Buttons.Left.updateText('Confirm');\n js_components_prompt_prompt.Buttons.Right.updateText(\"This doesn't look right\");\n\n // clicking 'confirm' will also take us to the next page\n js_components_prompt_prompt.Buttons.Left.addAction(pauseAndContinue);\n // TODO: allow user to edit revenue here\n js_components_prompt_prompt.Buttons.Right.addAction(handleRevenueEdit);\n}\nfunction handleRevenueEdit() {\n components_nav_buttons_nav_buttons.Next.enable();\n}\nfunction cleanupRevenuePage() {\n // remove event listeners on prompt buttons\n js_components_prompt_prompt.Buttons.Left.removeAction(pauseAndContinue);\n js_components_prompt_prompt.Buttons.Right.removeAction();\n}\n;\n;// CONCATENATED MODULE: ./src/js/views/04_personnel/helpers.js\n\n\n\n\n\n\n\n\n\nfunction helpers_preparePageView() {\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n components_sidebar_sidebar.show();\n components_table_table.adjustWidth('90%');\n // just enable next for now\n // TODO only enable when all info is entered\n components_nav_buttons_nav_buttons.Next.enable();\n\n // update page text\n components_header_header.update('Personnel');\n js_components_prompt_prompt.Text.update(`\n This table displays the number of FTEs in each job code for in your department's \n current (amended) FY25 budget. To make edits to the number of positions, click the\n \"Edit\" button on the row you would like to edit. The \"Total Cost\" column and the \n summary sidebar will also update to reflect any edits.\n `);\n}\nfunction assignClasses() {\n // record columns and their classes\n const personnelColumns = [{\n title: 'Job Name (Type)',\n className: 'job-name'\n }, {\n title: `FY${FISCAL_YEAR} FTEs`,\n className: 'baseline-ftes'\n }, {\n title: 'Service',\n className: 'service'\n }, {\n title: 'Total Cost',\n className: 'total-baseline',\n isCost: true\n }, {\n title: 'Average Projected Salary',\n className: 'avg-salary',\n isCost: true\n }];\n\n // assign cost classes\n components_table_table.Columns.assignClasses(personnelColumns);\n}\nfunction personnelRowOnEdit() {\n components_table_table.Cell.createTextbox('baseline-ftes');\n components_table_table.Cell.createDropdown('service', DATA_ROOT + 'services.json');\n}\nasync function initializePersonnelTable() {\n // load table data from json\n await components_table_table.Data.loadFromJSON(DATA_ROOT + 'personnel_data.json');\n //after table is loaded, fill it\n components_table_table.show();\n components_table_table.Columns.addAtEnd('0', 'Total Cost');\n components_table_table.Columns.addAtEnd(components_table_table.Buttons.edit_confirm_btns, ' ');\n ;\n assignClasses();\n // add up the baseline costs and update sidebar\n updateDisplayandTotals();\n // activate edit buttons\n components_table_table.Buttons.Edit.init(personnelRowOnEdit, updateDisplayandTotals);\n initializeRowAddition();\n}\nfunction initializeRowAddition() {\n components_table_table.Buttons.AddRow.updateText(\"Add new job\");\n components_table_table.Buttons.AddRow.show();\n}\nfunction calculateTotalCost(ftes, avg_salary, fringe, cola, merit) {\n return ftes * avg_salary * (1 + fringe) * (1 + cola) * (1 + merit);\n}\n\n// update sidebar and also cost totals when the FTEs are edited\nfunction updateDisplayandTotals() {\n // initialize\n components_sidebar_sidebar.updateStat('baseline-personnel', 0);\n components_sidebar_sidebar.updateStat('supp-personnel', 0);\n // calculate for each row\n let rows = document.getElementsByTagName('tr');\n for (let i = 1; i < rows.length; i++) {\n // fetch values for calculations\n let avg_salary = components_table_table.Cell.getValue(rows[i], 'avg-salary');\n let baseline_ftes = components_table_table.Cell.getText(rows[i], 'baseline-ftes');\n\n // calcuate #FTEs x average salary + COLA adjustments + merit adjustments + fringe\n let total_baseline_cost = calculateTotalCost(baseline_ftes, avg_salary, fringe, cola, merit);\n\n // update counter and total\n components_sidebar_sidebar.incrementStat('baseline-personnel', total_baseline_cost);\n components_table_table.Cell.updateValue(rows[i], 'total-baseline', total_baseline_cost);\n }\n}\nfunction helpers_setUpModal() {\n // Initialize modal\n components_modal_modal.clear();\n components_modal_modal.Link.add('add-btn');\n components_modal_modal.Title.update('New job');\n}\nfunction helpers_setUpForm() {\n // Set up form\n js_components_form_form.new('modal-body');\n js_components_form_form.NewField.shortText('Job Name:', 'job-name', true);\n js_components_form_form.NewField.shortText('Account String:', 'account-string', true);\n js_components_form_form.SubmitButton.add();\n // Initialize form submission to table data\n helpers_handleFormSubmissions();\n}\nfunction helpers_handleFormSubmissions(event) {\n // initialize form submission\n\n const modal = document.getElementById('main-modal');\n modal.addEventListener('submit', function (event) {\n event.preventDefault();\n // get answers from form, hide form, show answers in table\n const responses = js_components_form_form.fetchAllResponses(event);\n // make sure it's not an empty response\n if (Object.values(responses)[0] != '') {\n // change page view\n components_modal_modal.hide();\n\n // add data to table\n components_table_table.Rows.add(responses);\n components_table_table.show();\n components_table_table.Buttons.AddRow.show();\n // TODO: save table data\n // TODO: edit cost to show currency correctly\n }\n });\n}\n;// CONCATENATED MODULE: ./src/js/views/04_personnel/main.js\n\n\nfunction loadPersonnelPage() {\n updatePageState('personnel');\n helpers_preparePageView();\n initializePersonnelTable();\n helpers_setUpModal();\n helpers_setUpForm();\n}\n;// CONCATENATED MODULE: ./src/js/views/04.5_OT/main.js\n\n\n\n\n\n\nfunction loadOTPage() {\n //update page state\n updatePageState('overtime');\n\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n components_sidebar_sidebar.show();\n\n // just enable next for now\n // TODO: only enable when all info is entered\n components_nav_buttons_nav_buttons.Next.enable();\n\n // update page text\n components_header_header.update('Overtime Estimates');\n // TODO: update to make dynamic\n js_components_prompt_prompt.Text.update(`This is a placeholder for the OT estimates.`);\n}\n;// CONCATENATED MODULE: ./src/js/views/05_nonpersonnel/helpers.js\n\n\n\n\n\n\n\n\nconst nonPersonnelColumns = [{\n title: 'FY26 Request',\n className: 'request',\n isCost: true\n}, {\n title: 'Amount Remaining',\n className: 'remaining',\n isCost: true\n}];\nfunction _05_nonpersonnel_helpers_preparePageView() {\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n components_sidebar_sidebar.show();\n components_table_table.adjustWidth('100%');\n // update page text\n components_header_header.update('Non-Personnel');\n js_components_prompt_prompt.Text.update('Select an action item for each non-personnel line item from last year.');\n\n // just enable next for now\n // TODO: only enable when all info is entered\n components_nav_buttons_nav_buttons.Next.enable();\n}\nasync function initializeNonpersonnelTable() {\n // load table data from json\n await components_table_table.Data.loadFromJSON(DATA_ROOT + 'nonpersonnel_data.json', 'main-table');\n //after table is loaded, fill it\n components_table_table.show();\n components_table_table.Columns.addAtEnd(components_table_table.Buttons.edit_confirm_btns, \" \");\n // assign cost classes\n components_table_table.Columns.assignClasses(nonPersonnelColumns);\n // update sidebar\n helpers_updateDisplayandTotals();\n // enable editing\n components_table_table.Buttons.Edit.init(nonPersonnelRowOnEdit, helpers_updateDisplayandTotals);\n}\nfunction nonPersonnelRowOnEdit() {\n // convert request to numeric from formatted currency\n const request = document.querySelector('.active-editing > td.request');\n request.textContent = request.textContent.replace('$', '');\n // make it editable\n components_table_table.Cell.createTextbox('request');\n}\n\n// update sidebar and also cost totals when the FTEs are edited\nfunction helpers_updateDisplayandTotals() {\n // initialize\n components_sidebar_sidebar.updateStat('baseline-nonpersonnel', 0);\n // calculate for each row\n let rows = document.getElementsByTagName('tr');\n for (let i = 1; i < rows.length; i++) {\n // fetch values for calculations\n let request = components_table_table.Cell.getValue(rows[i], 'request');\n\n // update counters\n components_sidebar_sidebar.incrementStat('baseline-nonpersonnel', request);\n }\n}\n;// CONCATENATED MODULE: ./src/js/views/05_nonpersonnel/main.js\n\n\nfunction loadNonpersonnelPage() {\n updatePageState('nonpersonnel');\n _05_nonpersonnel_helpers_preparePageView();\n initializeNonpersonnelTable();\n}\n;// CONCATENATED MODULE: ./src/js/views/view_logic.js\n\n\n\n\n\n\n\n\n\n\n\nlet PAGES = {\n 'welcome': initializeWelcomePage,\n 'upload': loadUploadPage,\n 'baseline-landing': loadBaselineLandingPage,\n 'revenue': loadRevenuePage,\n 'personnel': loadPersonnelPage,\n 'overtime': loadOTPage,\n 'nonpersonnel': loadNonpersonnelPage,\n 'new-inits': loadNewInitiatives,\n 'summary': loadSummaryPage\n};\nlet CLEANUP = {\n 'new-inits': cleanUpInitiativesPage,\n 'revenue': cleanupRevenuePage,\n 'summary': cleanUpSummaryPage\n};\nfunction visitPage(new_page_key) {\n // clean up from current page\n var page_state = loadPageState();\n if (CLEANUP[page_state]) {\n CLEANUP[page_state]();\n }\n ;\n // Use the page_state to access and call the corresponding function from PAGES\n if (PAGES[new_page_key]) {\n PAGES[new_page_key](); // Invokes the function if it exists in the PAGES map\n } else {\n console.error(`No page initializer found for state: ${new_page_key}`);\n }\n PAGES[new_page_key]();\n}\nfunction nextPage() {\n var page_state = loadPageState();\n const keys = Object.keys(PAGES);\n\n // Find the index of the current key\n const currentIndex = keys.indexOf(page_state);\n\n // clean up current page\n if (CLEANUP[page_state]) {\n CLEANUP[page_state]();\n }\n ;\n\n // Check if there is a next key\n if (currentIndex >= 0 && currentIndex < keys.length - 1) {\n // Get the next key\n const nextKey = keys[currentIndex + 1];\n // go to that page\n visitPage(nextKey);\n }\n}\nfunction lastPage() {\n var page_state = loadPageState();\n const keys = Object.keys(PAGES);\n\n // Find the index of the current key\n const currentIndex = keys.indexOf(page_state);\n\n // clean up current page\n if (CLEANUP[page_state]) {\n CLEANUP[page_state]();\n }\n ;\n\n // Check if there is a next key\n if (currentIndex >= 1) {\n // Get the next key\n const lastKey = keys[currentIndex - 1];\n // go to that page\n visitPage(lastKey);\n }\n}\nasync function pauseAndContinue() {\n await pauseExecution(0.5);\n nextPage();\n}\n;// CONCATENATED MODULE: ./src/js/init.js\n// import styles\n\n\n// import functions\n\n\n\n// path for my laptop\n// export let DATA_ROOT = '../../../data/law_dept_sample/'\n// github path\nlet DATA_ROOT = '../../budget-request-demo/data/law_dept_sample/';\nlet REVENUE = 0;\nlet TARGET = 2000000;\nvar FISCAL_YEAR = '26';\n\n// variables on the salary \nvar fringe = 0.36;\nvar cola = 0.02;\nvar merit = 0.02;\ndocument.addEventListener('DOMContentLoaded', function () {\n var page_state = loadPageState();\n visitPage(page_state);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk2LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy9GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDbEVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQ2xDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDcEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDN0JBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNqRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQzFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTs7QUN4QkE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDL0RBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNqSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7QUM5Q0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUMvQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNwREE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBOztBQ3pCQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ1JBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDdEJBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQ3hJQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZGQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9jc3MvY29tbW9uLmNzcz84ZmY2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdXRpbHMvZGF0YV91dGlscy9sb2NhbF9zdG9yYWdlX2hhbmRsZXJzLmpzP2ZlODEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuY3NzPzcyZDciLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanM/YTBhNSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvd2VsY29tZS93ZWxjb21lLmNzcz9kZWUxIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuanM/NTM1YSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvYm9keS9ib2R5LmNzcz9kMWM3Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9tb2RhbC9tb2RhbC5jc3M/NDBkYiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvbW9kYWwvbW9kYWwuanM/NTUzMyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuY3NzPzcwN2YiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL25hdl9idXR0b25zL25hdl9idXR0b25zLmpzP2FiZDEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuY3NzPzMyOGIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Byb21wdC9zdWJjb21wb25lbnRzL3RleHQuanM/ZjZkZiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvcHJvbXB0L3N1YmNvbXBvbmVudHMvYnV0dG9ucy5qcz84ZDNiIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzP2E3NzEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3NpZGViYXIvc2lkZWJhci5jc3M/M2JjNyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3V0aWxzL2NvbW1vbl91dGlscy5qcz80NGYyIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9zaWRlYmFyL3NpZGViYXIuanM/ODBmMCIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY3NzPzc4NGMiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3N1YmNvbXBvbmVudHMvaGVhZGVycy5qcz8xNjIzIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS9zdWJjb21wb25lbnRzL3Jvd3MuanM/ZmI3OSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvc3ViY29tcG9uZW50cy9idXR0b25zLmpzP2M5OTIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2Zvcm0vc3ViY29tcG9uZW50cy9kcm9wZG93bi5qcz9iYTZiIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS9zdWJjb21wb25lbnRzL2NlbGxzLmpzPzczY2IiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3N1YmNvbXBvbmVudHMvY29sdW1ucy5qcz82NzRhIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdXRpbHMvZGF0YV91dGlscy9KU09OX2RhdGFfaGFuZGxlcnMuanM/NzY3YSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvc3ViY29tcG9uZW50cy9kYXRhLmpzP2Q5YjYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzPzMwNzEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2JvZHkvYm9keS5qcz9mOWJhIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL2Zvcm0uY3NzPzU0MTUiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2Zvcm0vc3ViY29tcG9uZW50cy9maWVsZHMuanM/NDU5ZiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvZm9ybS9zdWJjb21wb25lbnRzL3N1Ym1pdC5qcz9jNTk2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL2Zvcm0uanM/ZDk0MiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzA2X25ld19pbml0aWF0aXZlcy9oZWxwZXJzLmpzPzYxNTIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wNl9uZXdfaW5pdGlhdGl2ZXMvbWFpbi5qcz9kY2NkIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDdfc3VtbWFyeS9tYWluLmpzPzAwNTkiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wMl9iYXNlbGluZV9sYW5kaW5nX3BhZ2UvaGVscGVycy5qcz85NWI2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDJfYmFzZWxpbmVfbGFuZGluZ19wYWdlL21haW4uanM/ZDQ1OCIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzAxX3VwbG9hZC9oZWxwZXJzLmpzPzVmYmUiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wMV91cGxvYWQvbWFpbi5qcz8yYThmIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDBfd2VsY29tZS9oZWxwZXJzLmpzP2U3OWMiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wMF93ZWxjb21lL21haW4uanM/YmVhNiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzAzX3JldmVudWUvbWFpbi5qcz8wNjQ3Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDRfcGVyc29ubmVsL2hlbHBlcnMuanM/ODc3YyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzA0X3BlcnNvbm5lbC9tYWluLmpzPzUxMjYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wNC41X09UL21haW4uanM/NjU3OSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzA1X25vbnBlcnNvbm5lbC9oZWxwZXJzLmpzP2Y4ODAiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wNV9ub25wZXJzb25uZWwvbWFpbi5qcz9hZmNjIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3Mvdmlld19sb2dpYy5qcz80NmM2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvaW5pdC5qcz8xYjJhIl0sInNvdXJjZXNDb250ZW50IjpbIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9jb21tb24uY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vY29tbW9uLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIi8qKlxuICogU2F2ZXMgZW1wbG95ZWUgdGFibGUgZGF0YSBhbmQgYnVkZ2V0IGNvdW50ZXJzIGluIGxvY2FsIHN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIHNhdmVUYWJsZURhdGEodGFibGVfaWQgPSBcImVtcGxveWVlLXRhYmxlXCIsIHNhdmVfYXMgPSAnZW1wbG95ZWVUYWJsZURhdGEnKSB7XG4gICAgdmFyIHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFibGVfaWQpO1xuICAgIHZhciByb3dzID0gdGFibGUucm93cztcbiAgICB2YXIgdGFibGVEYXRhID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvbHMgPSByb3dzW2ldLmNlbGxzO1xuICAgICAgICB2YXIgcm93RGF0YSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIC8vIGZvciB0aGUgYWN0aW9uIGJ1dHRvbnMsIHNhdmUgdGhlIGNob3NlbiBhY3Rpb24sIG5vdCB0aGUgYnV0dG9uIHRleHRcbiAgICAgICAgICAgIGlmIChjb2xzW2pdLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpKSB7XG4gICAgICAgICAgICAgICAgcm93RGF0YS5wdXNoKHJvd3NbaV0uY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcm93RGF0YS5wdXNoKGNvbHNbal0uaW5uZXJUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0YWJsZURhdGEucHVzaChyb3dEYXRhKTtcbiAgICB9XG5cbiAgICAvLyBTYXZlIEpTT04gc3RyaW5nIHRvIGxvY2FsU3RvcmFnZVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHNhdmVfYXMsIEpTT04uc3RyaW5naWZ5KHRhYmxlRGF0YSkpO1xuICAgIHNhdmVDb3VudGVycygpO1xufVxuXG4vKipcbiAqIExvYWRzIGVtcGxveWVlIHRhYmxlIGRhdGEgYW5kIGJ1ZGdldCBjb3VudGVycyBmcm9tIGxvY2FsIHN0b3JhZ2UuXG4gKiBcbiAqL1xuZnVuY3Rpb24gbG9hZFRhYmxlRGF0YSh0YWJsZV9uYW1lX2luX3N0b3JhZ2UgPSBcImVtcGxveWVlVGFibGVEYXRhXCIpIHtcbiAgICAgICAgdmFyIGRhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0YWJsZV9uYW1lX2luX3N0b3JhZ2UpO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdmFyIHRhYmxlRGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVtcGxveWVlLXRhYmxlXCIpO1xuICAgIFxuICAgICAgICAgICAgLy8gSXQncyBnb29kIHByYWN0aWNlIHRvIGVtcHR5IHRoZSBleGlzdGluZyB0YWJsZSBmaXJzdFxuICAgICAgICAgICAgd2hpbGUgKHRhYmxlLnJvd3MubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHRhYmxlLmRlbGV0ZVJvdygxKTtcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIC8vIE5vdywgYWRkIHRoZSBsb2FkZWQgcm93cyB0byB0aGUgdGFibGVcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGFibGVEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld1JvdyA9IHRhYmxlLmluc2VydFJvdygtMSk7XG4gICAgICAgICAgICAgICAgdmFyIG5jb2xzID0gdGFibGVEYXRhW2ldLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5jb2xzLTE7IGorKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q2VsbCA9IG5ld1Jvdy5pbnNlcnRDZWxsKGopO1xuICAgICAgICAgICAgICAgICAgICBuZXdDZWxsLmlubmVyVGV4dCA9IHRhYmxlRGF0YVtpXVtqXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBjb3N0IGNvbHVtbiAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChqID09IG5jb2xzLTIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2VsbC5jbGFzc0xpc3QuYWRkKCdjb3N0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDZWxsLnNldEF0dHJpYnV0ZSgnY29zdCcsIHVuZm9ybWF0Q3VycmVuY3kodGFibGVEYXRhW2ldW2pdKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBhY3Rpb24gYnV0dG9ucyBhbmQgbG9hZCBzYXZlZCBjbGFzc1xuICAgICAgICAgICAgICAgIHZhciBsYXN0Q2VsbCA9IG5ld1Jvdy5pbnNlcnRDZWxsKG5jb2xzLTEpO1xuICAgICAgICAgICAgICAgIGxhc3RDZWxsLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ0bnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGVsZXRlXCI+REVMRVRFPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXN1cHBsZW1lbnRhbFwiPlNVUFBMRU1FTlRBTDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1jYXJyeW92ZXJcIj5LRUVQIElOIEZZMjY8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgIG5ld1Jvdy5jbGFzc0xpc3QuYWRkKHRhYmxlRGF0YVtpXVtuY29scy0xXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vcmV0cmlldmUgY291bnRlciB2YWx1ZXNcbiAgICAgICAgICAgIGxvYWRDb3VudGVycygpO1xuICAgICAgICB9XG59XG5cbi8vIGFsc28gc2F2ZSBjb3VudGVycyBpbiBzaWRlYmFyXG5mdW5jdGlvbiBzYXZlQ291bnRlcnMoKXtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGVyc29ubmVsX2Jhc2VsaW5lJywgcGVyc29ubmVsX2Jhc2VsaW5lLnRvU3RyaW5nKCkpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwZXJzb25uZWxfc3VwcCcsIHBlcnNvbm5lbF9zdXBwLnRvU3RyaW5nKCkpO1xuICAgIC8vIEFkZCBtb3JlIGhlcmVcbn0gICAgXG4gICAgXG4vLyBsb2FkIGNvdW50ZXJzIGluIHNpZGViYXJcbmZ1bmN0aW9uIGxvYWRDb3VudGVycygpe1xuICAgIHBlcnNvbm5lbF9iYXNlbGluZSA9IHBhcnNlSW50KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwZXJzb25uZWxfYmFzZWxpbmUnKSwgMTApO1xuICAgIHBlcnNvbm5lbF9zdXBwID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3BlcnNvbm5lbF9zdXBwJyksIDEwKTtcbiAgICB1cGRhdGVEaXNwbGF5KCk7XG59XG5cbi8vIHNhdmUgcGFnZSBzdGF0ZVxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVBhZ2VTdGF0ZShwYWdlKXtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGFnZV9zdGF0ZScsIHBhZ2UpO1xufVxuXG4vLyBsb2FkIHBhZ2Ugc3RhdGVcbmV4cG9ydCBmdW5jdGlvbiBsb2FkUGFnZVN0YXRlKHBhZ2Upe1xuICAgIGNvbnN0IHBhZ2VTdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwYWdlX3N0YXRlJyk7XG4gICAgcmV0dXJuIHBhZ2VTdGF0ZSAhPT0gbnVsbCA/IHBhZ2VTdGF0ZSA6ICd3ZWxjb21lJztcbn0iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vaGVhZGVyLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2hlYWRlci5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgJy4vaGVhZGVyLmNzcyc7XG5cbmV4cG9ydCBjb25zdCBTdWJ0aXRsZSA9IHtcbiAgICB1cGRhdGUgOiBmdW5jdGlvbihzdWJ0aXRsZSl7XG4gICAgICAgIC8vIGdldCBjdXJyZW50IGZ1bmRcbiAgICAgICAgdmFyIGZ1bmQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImZ1bmRcIik7XG4gICAgICAgIGlmIChmdW5kKXtcbiAgICAgICAgICAgIHZhciBzdWJ0aXRsZSA9IGAke3N1YnRpdGxlfTogJHtmdW5kfWA7XG4gICAgICAgIH1cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdWJ0aXRsZVwiKS50ZXh0Q29udGVudCA9IHN1YnRpdGxlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3VidGl0bGU7IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3dlbGNvbWUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vd2VsY29tZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgJy4vd2VsY29tZS5jc3MnO1xuXG4vLyBIaWRlIGFuZCB1bmhpZGUgd2VsY29tZSBidXR0b25zXG5mdW5jdGlvbiB1bmhpZGVXZWxjb21lQnV0dG9ucygpe1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwid2VsY29tZS1wYWdlXCIpLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG59XG5mdW5jdGlvbiBoaWRlV2VsY29tZUJ1dHRvbnMoKXtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIndlbGNvbWUtcGFnZVwiKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG59XG5cbmV4cG9ydCBjb25zdCBXZWxjb21lID0ge1xuICAgIHNob3c6IHVuaGlkZVdlbGNvbWVCdXR0b25zLFxuICAgIGhpZGUgOiBoaWRlV2VsY29tZUJ1dHRvbnNcbn1cblxuZXhwb3J0IGRlZmF1bHQgV2VsY29tZTsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vYm9keS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9ib2R5LmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tb2RhbC5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tb2RhbC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgJy4vbW9kYWwuY3NzJztcblxuZnVuY3Rpb24gY2xlYXJNb2RhbCgpe1xuICAgIHVwZGF0ZU1vZGFsVGl0bGUoJycpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbC1ib2R5JykuaW5uZXJIVE1MID0gJyc7XG4gICAgLy9yZW1vdmVBbGxNb2RhbExpbmtzKClcbn1cblxuLy8gZnVuY3Rpb24gcmVtb3ZlQWxsTW9kYWxMaW5rcygpe1xuLy8gICAgIFRPRE9cbi8vIH1cblxuZnVuY3Rpb24gaGlkZU1vZGFsKG1vZGFsX2lkKSB7XG4gICAgJCgnIycgKyBtb2RhbF9pZCkubW9kYWwoJ2hpZGUnKTtcbn1cblxuZnVuY3Rpb24gc2hvd01vZGFsKG1vZGFsX2lkKSB7XG4gICAgJCgnIycgKyBtb2RhbF9pZCkubW9kYWwoJ3Nob3cnKTtcbn1cblxuZnVuY3Rpb24gc2hvd01vZGFsSGFuZGxlcigpIHtcbiAgICBzaG93TW9kYWwoJ21haW4tbW9kYWwnKTtcbn1cblxuY29uc3QgTGluayA9IHtcbiAgICBhZGQgOiBmdW5jdGlvbihidXR0b25faWQpe1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2hvd01vZGFsSGFuZGxlcilcbiAgICB9LFxuICAgIHJlbW92ZSA6IGZ1bmN0aW9uKGJ1dHRvbl9pZCl7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ1dHRvbl9pZCkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzaG93TW9kYWxIYW5kbGVyKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlTW9kYWxUaXRsZSh0aXRsZSkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gdGl0bGU7XG59XG5cbmNvbnN0IFRpdGxlID0ge1xuICAgIHVwZGF0ZSA6IGZ1bmN0aW9uKHRpdGxlKSB7IHVwZGF0ZU1vZGFsVGl0bGUodGl0bGUpIH1cbn1cblxuZXhwb3J0IGNvbnN0IE1vZGFsID0ge1xuICAgIGhpZGUgOiBmdW5jdGlvbigpIHsgaGlkZU1vZGFsKCdtYWluLW1vZGFsJykgfSxcbiAgICBzaG93IDogZnVuY3Rpb24oKSB7IHNob3dNb2RhbCgnbWFpbi1tb2RhbCcpIH0sXG4gICAgY2xlYXIgOiBjbGVhck1vZGFsLFxuICAgIFRpdGxlIDogVGl0bGUsXG4gICAgTGluayA6IExpbmtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTW9kYWw7IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL25hdl9idXR0b25zLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL25hdl9idXR0b25zLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsImltcG9ydCAnLi9uYXZfYnV0dG9ucy5jc3MnO1xuXG5pbXBvcnQgeyBuZXh0UGFnZSwgbGFzdFBhZ2UgfSBmcm9tICcuLi8uLi92aWV3cy92aWV3X2xvZ2ljLmpzJ1xuXG5mdW5jdGlvbiBpbml0aWFsaXplTmF2QnV0dG9ucygpe1xuICAgIC8vIGluaXRpYWxpemUgbGFzdCBidXR0b25cbiAgICBjb25zdCBsYXN0X2J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG4tbGFzdCcpO1xuICAgIGxhc3RfYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbGFzdFBhZ2UpOyBcbiAgICAvLyBpbml0aWFsaXplIG5leHQgYnV0dG9uXG4gICAgY29uc3QgbmV4dF9idG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuLW5leHQnKTtcbiAgICBuZXh0X2J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG5leHRQYWdlKTsgXG4gICAgZGlzYWJsZSgnYnRuLW5leHQnKTtcbn1cblxuZnVuY3Rpb24gaGlkZU5hdkJ1dHRvbnMoKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25hdi1idG5zJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbn1cblxuZnVuY3Rpb24gc2hvd05hdkJ1dHRvbnMoKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25hdi1idG5zJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgaW5pdGlhbGl6ZU5hdkJ1dHRvbnMoKTtcbn1cblxuZnVuY3Rpb24gZGlzYWJsZShidXR0b25faWQpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG59XG5cbmZ1bmN0aW9uIGVuYWJsZShidXR0b25faWQpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpLmNsYXNzTGlzdC5yZW1vdmUoJ2Rpc2FibGVkJyk7XG59XG5cbmNvbnN0IE5leHQgPSB7XG4gICAgZGlzYWJsZSA6IGZ1bmN0aW9uKCkgeyBkaXNhYmxlKCdidG4tbmV4dCcpIH0sXG4gICAgZW5hYmxlIDogZnVuY3Rpb24oKSB7IGVuYWJsZSgnYnRuLW5leHQnKSB9XG59XG5cbmNvbnN0IExhc3QgPSB7XG4gICAgZGlzYWJsZSA6IGZ1bmN0aW9uKCkgeyBkaXNhYmxlKCdidG4tbGFzdCcpIH0sXG4gICAgZW5hYmxlIDogZnVuY3Rpb24oKSB7IGVuYWJsZSgnYnRuLWxhc3QnKSB9XG59XG5cbmV4cG9ydCBjb25zdCBOYXZCdXR0b25zID0ge1xuICAgIGhpZGUgOiBoaWRlTmF2QnV0dG9ucyxcbiAgICBzaG93IDogc2hvd05hdkJ1dHRvbnMsXG4gICAgTmV4dCA6IE5leHQsXG4gICAgTGFzdCA6IExhc3Rcbn1cblxuZXhwb3J0IGRlZmF1bHQgTmF2QnV0dG9uczsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vcHJvbXB0LmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Byb21wdC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJmdW5jdGlvbiBzaG93UHJvbXB0KCl7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwcm9tcHQtZGl2XCIpLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG59XG5cbmZ1bmN0aW9uIGhpZGVQcm9tcHQoKXtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvbXB0LWRpdicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG59XG5cblxuZnVuY3Rpb24gdXBkYXRlUHJvbXB0KHByb21wdCl7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb21wdCcpLnRleHRDb250ZW50ID0gcHJvbXB0O1xuICAgIHNob3dQcm9tcHQoKTtcbn1cblxuZXhwb3J0IGNvbnN0IFRleHQgPSB7XG4gICAgc2hvdyA6IHNob3dQcm9tcHQsXG4gICAgaGlkZSA6IGhpZGVQcm9tcHQsXG4gICAgdXBkYXRlIDogZnVuY3Rpb24odGV4dCkgeyB1cGRhdGVQcm9tcHQodGV4dCkgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUZXh0OyIsImZ1bmN0aW9uIHNob3dQcm9tcHRCdXR0b24oaWQpe1xuICAgIC8vIG1ha2UgYnV0dG9ucyB2aXNpYmxlXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJztcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvbXB0QnV0dG9uKGlkLCB0ZXh0KXtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIHNob3dQcm9tcHRCdXR0b24oaWQpO1xufVxuXG5mdW5jdGlvbiBoaWRlUHJvbXB0QnV0dG9uKGlkKXtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbn1cblxuZnVuY3Rpb24gdW5jbGlja0FsbCgpe1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHRpb24xJykuY2xhc3NMaXN0LnJlbW92ZSgnY2xpY2tlZCcpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHRpb24yJykuY2xhc3NMaXN0LnJlbW92ZSgnY2xpY2tlZCcpO1xufVxuXG5mdW5jdGlvbiBhcHBseUNsaWNrZWRTdHlsZShidXR0b24pe1xuICAgIHVuY2xpY2tBbGwoKTtcbiAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnY2xpY2tlZCcpO1xufVxuXG5mdW5jdGlvbiBhZGRQcm9tcHRCdXR0b25BY3Rpb24oYnV0dG9uX2lkLCBhY3Rpb25fZm4pe1xuICAgIGNvbnN0IGJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpO1xuICAgIGJ1dHRvbkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhY3Rpb25fZm4pO1xuICAgIGJ1dHRvbkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpe1xuICAgICAgICBhcHBseUNsaWNrZWRTdHlsZSh0aGlzKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlUHJvbXB0QnV0dG9uQWN0aW9uKGJ1dHRvbl9pZCwgYWN0aW9uX2ZuKXtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWN0aW9uX2ZuKTtcbn1cblxuZXhwb3J0IGNvbnN0IExlZnQgPSB7XG4gICAgc2hvdyA6IGZ1bmN0aW9uKCkgeyBzaG93UHJvbXB0QnV0dG9uKCdvcHRpb24xJykgfSxcbiAgICBoaWRlIDogZnVuY3Rpb24oKSB7IGhpZGVQcm9tcHRCdXR0b24oJ29wdGlvbjEnKSB9LFxuICAgIHVwZGF0ZVRleHQgOiBmdW5jdGlvbih0ZXh0KSB7IHVwZGF0ZVByb21wdEJ1dHRvbignb3B0aW9uMScsIHRleHQpIH0sXG4gICAgYWRkQWN0aW9uIDogZnVuY3Rpb24oYWN0aW9uX2ZuKSB7IGFkZFByb21wdEJ1dHRvbkFjdGlvbignb3B0aW9uMScsIGFjdGlvbl9mbikgfSxcbiAgICByZW1vdmVBY3Rpb24gOiBmdW5jdGlvbihhY3Rpb25fZm4pIHsgcmVtb3ZlUHJvbXB0QnV0dG9uQWN0aW9uKCdvcHRpb24xJywgYWN0aW9uX2ZuKSB9XG59XG5cbmV4cG9ydCBjb25zdCBSaWdodCA9IHtcbiAgICBzaG93IDogZnVuY3Rpb24oKSB7IHNob3dQcm9tcHRCdXR0b24oJ29wdGlvbjInKSB9LFxuICAgIGhpZGUgOiBmdW5jdGlvbigpIHsgaGlkZVByb21wdEJ1dHRvbignb3B0aW9uMicpIH0sXG4gICAgdXBkYXRlVGV4dCA6IGZ1bmN0aW9uKHRleHQpIHsgdXBkYXRlUHJvbXB0QnV0dG9uKCdvcHRpb24yJywgdGV4dCkgfSxcbiAgICBhZGRBY3Rpb24gOiBmdW5jdGlvbihhY3Rpb25fZm4pIHsgYWRkUHJvbXB0QnV0dG9uQWN0aW9uKCdvcHRpb24yJywgYWN0aW9uX2ZuKSB9LFxuICAgIHJlbW92ZUFjdGlvbiA6IGZ1bmN0aW9uKGFjdGlvbl9mbikgeyByZW1vdmVQcm9tcHRCdXR0b25BY3Rpb24oJ29wdGlvbjInLCBhY3Rpb25fZm4pIH1cbn1cblxuZXhwb3J0IGNvbnN0IEJ1dHRvbnMgPSB7XG4gICAgTGVmdCA6IExlZnQsXG4gICAgUmlnaHQgOiBSaWdodCxcbiAgICBzaG93IDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHNob3dQcm9tcHRCdXR0b24oJ29wdGlvbjEnKTtcbiAgICAgICAgc2hvd1Byb21wdEJ1dHRvbignb3B0aW9uMicpO1xuICAgIH0sXG4gICAgaGlkZSA6IGZ1bmN0aW9uKCkge1xuICAgICAgICBoaWRlUHJvbXB0QnV0dG9uKCdvcHRpb24xJyk7XG4gICAgICAgIGhpZGVQcm9tcHRCdXR0b24oJ29wdGlvbjInKTtcbiAgICB9LFxuICAgIHJlc2V0IDogdW5jbGlja0FsbFxufVxuXG5leHBvcnQgZGVmYXVsdCBCdXR0b25zOyIsImltcG9ydCAnLi9wcm9tcHQuY3NzJztcblxuaW1wb3J0IFRleHQgZnJvbSBcIi4vc3ViY29tcG9uZW50cy90ZXh0LmpzXCI7XG5pbXBvcnQgQnV0dG9ucyBmcm9tIFwiLi9zdWJjb21wb25lbnRzL2J1dHRvbnMuanNcIjtcblxuZXhwb3J0IGNvbnN0IFByb21wdCA9IHtcbiAgICBUZXh0IDogVGV4dCxcbiAgICBCdXR0b25zIDogQnV0dG9ucyxcbiAgICBoaWRlIDogZnVuY3Rpb24oKXtcbiAgICAgICAgVGV4dC5oaWRlKCk7XG4gICAgICAgIEJ1dHRvbnMuaGlkZSgpO1xuICAgIH0sXG4gICAgc2hvdyA6IGZ1bmN0aW9uKCl7XG4gICAgICAgIFRleHQuc2hvdygpO1xuICAgICAgICBCdXR0b25zLnNob3coKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb21wdCIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zaWRlYmFyLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NpZGViYXIuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiLy8gRnVuY3Rpb24gdG8gZm9ybWF0IG51bWJlciBhcyBjdXJyZW5jeVxuZXhwb3J0IGNvbnN0IGZvcm1hdEN1cnJlbmN5ID0gKGFtb3VudCwgcmV0dXJuX3plcm8gPSBmYWxzZSkgPT4ge1xuICAgIHZhciBhbW91bnQgPSBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoYW1vdW50KSk7XG4gICAgaWYgKGFtb3VudCA9PSBOYU4pe1xuICAgICAgICByZXR1cm4gXCIkIC1cIlxuICAgIH1cbiAgICBpZiAoYW1vdW50IDwgMCl7XG4gICAgICAgIHJldHVybiAnKCQnICsgYW1vdW50LnRvU3RyaW5nKCkucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgJywnKSArICcpJztcbiAgICB9IGVsc2UgaWYgKGFtb3VudCA9PSAwKSB7XG4gICAgICAgIGlmIChyZXR1cm5femVybyl7XG4gICAgICAgICAgICByZXR1cm4gJyQwJzsgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiJCAtXCJcbiAgICB9XG4gICAgcmV0dXJuICckJyArIGFtb3VudC50b1N0cmluZygpLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csICcsJyk7XG59IDtcblxuLy8gZnVuY3Rpb24gdG8gY29udmVydCBmb3JtYXR0ZWQgbnVtYmVyIHRvIGEgZmxvYXRcbmV4cG9ydCBjb25zdCB1bmZvcm1hdEN1cnJlbmN5ID0gKGZvcm1hdHRlZEFtb3VudCkgPT4ge1xuICAgIC8vIFJlbW92ZSBhbnkgY3VycmVuY3kgc3ltYm9scyBhbmQgY29tbWFzXG4gICAgbGV0IG51bWVyaWNhbFBhcnQgPSBmb3JtYXR0ZWRBbW91bnQucmVwbGFjZSgvW14wLTkuLV0rL2csIFwiXCIpO1xuICAgIHJldHVybiBwYXJzZUZsb2F0KG51bWVyaWNhbFBhcnQpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlXaXRoQ29tbWFzKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZvcm1hdEN1cnJlbmN5KHZhbHVlKS5yZXBsYWNlKCckJywgJycpO1xufVxuXG5mdW5jdGlvbiBkZWxheShtcykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhdXNlRXhlY3V0aW9uKHNlY29uZHMpIHtcbiAgICBhd2FpdCBkZWxheShzZWNvbmRzICogMTAwMCk7IC8vIGNvbnZlcnQgdG8gbWlsbGlzZWNvbmRzXG59IiwiaW1wb3J0ICcuL3NpZGViYXIuY3NzJztcblxuaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3kgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBUQVJHRVQgfSBmcm9tIFwiLi4vLi4vaW5pdC5qc1wiO1xuXG4vLyBBc3N1bWluZyB5b3UgaGF2ZSBhIENTUyB2YXJpYWJsZSAtLW1haW4tY29sb3IgZGVmaW5lZCBvbiB0aGUgOnJvb3RcbmNvbnN0IHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5jb25zdCBzaWRlQmFyV2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKHJvb3QpLmdldFByb3BlcnR5VmFsdWUoJy0tc2lkZWJhci13aWR0aCcpLnRyaW0oKTtcblxuZnVuY3Rpb24gaGlkZVNpZGViYXIoKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpZGViYXItcGFuZWwnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXBhbmVsJykuc3R5bGUud2lkdGggPSAnMTAwJSc7IFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWRlcicpLnN0eWxlLndpZHRoID0gJzEwMCUnXG59XG5cbmZ1bmN0aW9uIHNob3dTaWRlYmFyKCkge1xuICAgIGNvbnN0IHNpZGViYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZWJhci1wYW5lbCcpO1xuICAgIGNvbnN0IG1haW5QYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXBhbmVsJyk7XG4gICAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZGVyJyk7XG5cbiAgICBzaWRlYmFyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyAvLyBTaG93IHRoZSBzaWRlYmFyXG4gICAgXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSByZW1haW5pbmcgd2lkdGggZm9yIHRoZSBtYWluIHBhbmVsIGFuZCBoZWFkZXJcbiAgICB2YXIgY29udGVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIG1haW5QYW5lbC5zdHlsZS53aWR0aCA9IGAke2NvbnRlbnRXaWR0aCAtIHBhcnNlSW50KHNpZGVCYXJXaWR0aCwgMTApfXB4YDsgXG4gICAgaGVhZGVyLnN0eWxlLndpZHRoID0gYCR7Y29udGVudFdpZHRoIC0gcGFyc2VJbnQoc2lkZUJhcldpZHRoLCAxMCl9cHhgOyBcblxuICAgIC8vIGFkZCB0YXJnZXQgdG8gc2lkZWJhclxuICAgIGFkZFRhcmdldChUQVJHRVQpO1xuXG4gICAgLy8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvIHJlc2l6ZSBjb250ZW50IGlmIHdpbmRvdyBpcyBhZGp1c3RlZFxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzaG93U2lkZWJhcik7XG59XG5cblxuZnVuY3Rpb24gdXBkYXRlU2lkZWJhclRpdGxlKG5ld190aXRsZSl7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpZGViYXItdGl0bGUnKS50ZXh0Q29udGVudCA9IG5ld190aXRsZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU2lkZWJhclN0YXQoc3RhdF9pZCwgbmV3X2ZpZ3VyZSl7XG4gICAgcmVwbGFjZVNpZGViYXJTdGF0KHN0YXRfaWQsIG5ld19maWd1cmUpO1xuICAgIC8vIFRPRE86IHNhdmUgaW4gbWVtb3J5XG4gICAgdXBkYXRlVG90YWxzKCk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VTaWRlYmFyU3RhdChzdGF0X2lkLCBuZXdfZmlndXJlKXtcbiAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7c3RhdF9pZH0gLnN0YXRgKTtcbiAgICBzcGFuLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBuZXdfZmlndXJlKTtcbiAgICBzcGFuLnRleHRDb250ZW50ID0gZm9ybWF0Q3VycmVuY3kobmV3X2ZpZ3VyZSk7XG59XG5cbmZ1bmN0aW9uIGluY3JlbWVudFNpZGViYXJTdGF0KHN0YXRfaWQsIG5ld19maWd1cmUpe1xuICAgIHVwZGF0ZVNpZGViYXJTdGF0KHN0YXRfaWQsIGZldGNoU3RhdChzdGF0X2lkKSArIG5ld19maWd1cmUpXG59XG5cbmZ1bmN0aW9uIGZldGNoU3RhdChzdGF0X2lkKXtcbiAgICBjb25zdCBzdGF0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7c3RhdF9pZH0gLnN0YXRgKTtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChzdGF0LmdldEF0dHJpYnV0ZSgndmFsdWUnKSkgfHwgMDtcbn1cblxuLy8gRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBkaXNwbGF5IG9mIHRoZSBjdXJyZW50IGFuZCBzdXBwIHZhcmlhYmxlc1xuZnVuY3Rpb24gdXBkYXRlVG90YWxzKCkge1xuICAgIC8vIHVwZGF0ZSBib3R0b20gbGluZXNcbiAgICBsZXQgc3VwcF90b3RhbCA9ICAgIC1mZXRjaFN0YXQoJ3N1cHAtcmV2ZW51ZScpICsgXG4gICAgICAgICAgICAgICAgICAgICAgICBmZXRjaFN0YXQoJ3N1cHAtcGVyc29ubmVsJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hTdGF0KCdzdXBwLW5vbnBlcnNvbm5lbCcpO1xuICAgIGxldCBiYXNlbGluZV90b3RhbCA9IC1mZXRjaFN0YXQoJ2Jhc2VsaW5lLXJldmVudWUnKSArIFxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hTdGF0KCdiYXNlbGluZS1wZXJzb25uZWwnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBmZXRjaFN0YXQoJ2Jhc2VsaW5lLW5vbnBlcnNvbm5lbCcpO1xuICAgIHJlcGxhY2VTaWRlYmFyU3RhdCgnc3VwcC10b3RhbCcsIHN1cHBfdG90YWwpO1xuICAgIHJlcGxhY2VTaWRlYmFyU3RhdCgnYmFzZWxpbmUtdG90YWwnLCBiYXNlbGluZV90b3RhbCk7XG5cbiAgICAvLyBjb2xvciBjb2RlIGJhc2VkIG9uIHRhcmdldFxuICAgIHZhciB0YXJnZXQgPSBmZXRjaFN0YXQoJ3RhcmdldCcpO1xuICAgIGlmKGJhc2VsaW5lX3RvdGFsIDw9IHRhcmdldCl7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiYXNlbGluZS10b3RhbCAuc3RhdCcpLnN0eWxlLmNvbG9yID0gXCJncmVlblwiO1xuICAgIH1cbiAgICBpZihiYXNlbGluZV90b3RhbCA+IHRhcmdldCl7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiYXNlbGluZS10b3RhbCAuc3RhdCcpLnN0eWxlLmNvbG9yID0gXCJyZWRcIjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFkZFRhcmdldCh0YXJnZXQpe1xuICAgIHJlcGxhY2VTaWRlYmFyU3RhdCgndGFyZ2V0JywgdGFyZ2V0KTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVGl0bGUodGl0bGUpe1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzaWRlYmFyLXRpdGxlJykudGV4dENvbnRlbnQgPSB0aXRsZTtcbn1cblxuY29uc3QgU2lkZWJhciA9IHtcbiAgICBoaWRlOiBoaWRlU2lkZWJhcixcbiAgICBzaG93OiBzaG93U2lkZWJhcixcbiAgICB1cGRhdGVUaXRsZTogdXBkYXRlU2lkZWJhclRpdGxlLFxuICAgIHVwZGF0ZVN0YXQ6IHVwZGF0ZVNpZGViYXJTdGF0LFxuICAgIGluY3JlbWVudFN0YXQ6IGluY3JlbWVudFNpZGViYXJTdGF0LFxuICAgIGFkZFRhcmdldDogYWRkVGFyZ2V0LFxuICAgIHVwZGF0ZVRpdGxlOiB1cGRhdGVUaXRsZVxufTtcblxuZXhwb3J0IGRlZmF1bHQgU2lkZWJhcjsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdGFibGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdGFibGUuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiZnVuY3Rpb24gYWRkVGFibGVIZWFkZXJzKGhlYWRlcl9hcnJheSl7XG5cbiAgICAvLyBHZXQgdGhlIHRhYmxlIGVsZW1lbnQgYnkgaXRzIElEXG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xuICAgIFxuICAgIC8vIENyZWF0ZSBhIHRhYmxlIGhlYWRlciByb3cgZWxlbWVudFxuICAgIGNvbnN0IGhlYWRlclJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG4gICAgXG4gICAgZm9yIChjb25zdCBoZWFkZXJUZXh0IG9mIGhlYWRlcl9hcnJheSkge1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIGhlYWRlciBjZWxsIGVsZW1lbnRcbiAgICAgICAgY29uc3QgaGVhZGVyQ2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJyk7XG4gICAgICAgIGhlYWRlckNlbGwudGV4dENvbnRlbnQgPSBoZWFkZXJUZXh0O1xuICAgICAgICBcbiAgICAgICAgLy8gQXBwZW5kIHRoZSBoZWFkZXIgY2VsbCB0byB0aGUgaGVhZGVyIHJvd1xuICAgICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQoaGVhZGVyQ2VsbCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFwcGVuZCB0aGUgaGVhZGVyIHJvdyB0byB0aGUgdGFibGUgaGVhZGVyXG4gICAgbGV0IHRoZWFkID0gdGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQnKTtcbiAgICB0aGVhZC5hcHBlbmRDaGlsZChoZWFkZXJSb3cpO1xufVxuXG5jb25zdCBIZWFkZXIgPSB7XG4gICAgYWRkOiBmdW5jdGlvbihoZWFkZXJfYXJyYXkpe1xuICAgICAgICBhZGRUYWJsZUhlYWRlcnMoaGVhZGVyX2FycmF5KVxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEhlYWRlcjsiLCJpbXBvcnQgSGVhZGVyIGZyb20gXCIuL2hlYWRlcnMuanNcIjtcbmltcG9ydCB7IGZvcm1hdEN1cnJlbmN5IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2NvbW1vbl91dGlscy5qc1wiO1xuXG5mdW5jdGlvbiBhZGROZXdSb3coZGF0YV9kaWN0aW9uYXJ5KXtcbiAgICAvLyBHZXQgdGhlIHRhYmxlIGVsZW1lbnQgYnkgaXRzIElEXG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xuXG4gICAgLy8gY2hlY2sgaWYgaGVhZGVyIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWRcbiAgICBsZXQgaGVhZGVyX3JvdyA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkIHRyJyk7XG4gICAgaWYgKCFoZWFkZXJfcm93KSB7XG4gICAgICAgIEhlYWRlci5hZGQoT2JqZWN0LmtleXMoZGF0YV9kaWN0aW9uYXJ5KSk7XG4gICAgfVxuXG4gICAgLy8gYWRkIHJvdyBvZiBkYXRhXG4gICAgY29uc3QgbmV3X3JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG4gICAgY29uc3QgY2VsbF9kYXRhX2FycmF5ID0gT2JqZWN0LnZhbHVlcyhkYXRhX2RpY3Rpb25hcnkpO1xuXG4gICAgZm9yIChjb25zdCBjZWxsX2RhdGEgb2YgY2VsbF9kYXRhX2FycmF5KSB7XG4gICAgICAgIC8vIENyZWF0ZSBuZXcgY2VsbCBhbmQgYWRkIGl0IHRvIHRoZSByb3dcbiAgICAgICAgY29uc3QgbmV3Q2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7XG4gICAgICAgIG5ld0NlbGwudGV4dENvbnRlbnQgPSBjZWxsX2RhdGE7XG4gICAgICAgIG5ld19yb3cuYXBwZW5kQ2hpbGQobmV3Q2VsbCk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2cobmV3X3Jvdyk7XG5cbiAgICAvLyBBcHBlbmQgdGhlIG5ldyByb3cgdG8gdGhlIHRhYmxlIGJvZHlcbiAgICBsZXQgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xuICAgIHRib2R5LmFwcGVuZENoaWxkKG5ld19yb3cpO1xufVxuXG5mdW5jdGlvbiBzYXZlUm93RWRpdHMocm93KXtcbiAgICB2YXIgY2VsbHMgPSByb3cucXVlcnlTZWxlY3RvckFsbCgndGQnKVxuICAgIGNlbGxzLmZvckVhY2goIGNlbGwgPT4ge1xuICAgICAgICAvLyBzYXZlIGRyb3Bkb3duIHZhbHVlc1xuICAgICAgICBpZiAoY2VsbC5xdWVyeVNlbGVjdG9yKCdzZWxlY3QnKSl7XG4gICAgICAgICAgICB2YXIgc2VydmljZVNlbGVjdG9yID0gY2VsbC5xdWVyeVNlbGVjdG9yKCdzZWxlY3QnKTtcbiAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBzZXJ2aWNlU2VsZWN0b3IudmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY2VsbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpKSB7XG4gICAgICAgICAgICAvLyBzYXZlIG5ldyBlbnRlcmVkIHZhbHVlIGluIHRleHRib3hcbiAgICAgICAgICAgIHZhciB0ZXh0Ym94ID0gY2VsbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgICAgICAgICAgdmFyIGVudGVyZWRWYWx1ZSA9IHRleHRib3gudmFsdWU7XG4gICAgICAgICAgICAvLyB1cGRhdGUgZGlzcGxheSBhbmQgZm9ybWF0IHdpdGggY3VycmVuY3kgaWYgcmVsZXZhbnRcbiAgICAgICAgICAgIGlmICggY2VsbC5jbGFzc0xpc3QuY29udGFpbnMoJ2Nvc3QnKSApe1xuICAgICAgICAgICAgICAgIC8vIGlmIGNvc3QsIHJlbW92ZSBjb21tYXMgZmlyc3RcbiAgICAgICAgICAgICAgICBlbnRlcmVkVmFsdWUgPSBlbnRlcmVkVmFsdWUucmVwbGFjZUFsbCgnLCcsICcnKTtcbiAgICAgICAgICAgICAgICBjZWxsLnRleHRDb250ZW50ID0gZm9ybWF0Q3VycmVuY3koZW50ZXJlZFZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2VsbC50ZXh0Q29udGVudCA9IGVudGVyZWRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNldCB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIG5ldyB1c2VyIGlucHV0XG4gICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBlbnRlcmVkVmFsdWUpO1xuICAgICAgICB9XG4gICAgfSlcbn1cblxuY29uc3QgUm93cyA9IHtcbiAgICBhZGQgOiBmdW5jdGlvbihkYXRhX2RpY3Rpb25hcnkpe1xuICAgICAgICBhZGROZXdSb3coZGF0YV9kaWN0aW9uYXJ5KVxuICAgIH0sXG4gICAgc2F2ZUVkaXRzIDogZnVuY3Rpb24ocm93KXtcbiAgICAgICAgc2F2ZVJvd0VkaXRzKHJvdylcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJvd3M7IiwiaW1wb3J0IFJvd3MgZnJvbSAnLi9yb3dzLmpzJ1xuXG5mdW5jdGlvbiBoaWRlQnV0dG9uKGNsYXNzTmFtZSl7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYnV0dG9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBidXR0b25zW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNob3dCdXR0b24oY2xhc3NOYW1lKXtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBidXR0b25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1dHRvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJ1dHRvbnNbaV0uc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVCdXR0b25UZXh0KGNsYXNzTmFtZSwgdGV4dCl7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7Y2xhc3NOYW1lfWApLnRleHRDb250ZW50ID0gdGV4dDtcbn1cblxuLy8gRURJVCBidXR0b25cblxuZnVuY3Rpb24gaGFuZGxlUm93RWRpdChtYWtlUm93RWRpdGFibGUsIHVwZGF0ZUNhbGxiYWNrKXtcbiAgICAvLyBhdHRhY2ggYW4gZXZlbnQgbGlzdGVuZXIgdG8gZWFjaCBlZGl0IGJ1dHRvbiBpbiBldmVyeSByb3dcbiAgICB2YXIgZWRpdEJ1dHRvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdidG4tZWRpdCcpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRpdEJ1dHRvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZWRpdEJ1dHRvbnNbaV0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoYXQgd2FzIGNsaWNrZWQgb24gd2l0aGluIHRoZSB0YWJsZVxuICAgICAgICAgICAgdmFyIHJvd1RvRWRpdCA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCd0cicpO1xuICAgICAgICAgICAgLy8gbWFyayByb3cgYXMgYmVpbmcgZWRpdGVkXG4gICAgICAgICAgICByb3dUb0VkaXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlLWVkaXRpbmcnKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gdHVybiByZWxldmFudCBlbnRyaWVzIGludG8gdGV4dGJveGVzXG4gICAgICAgICAgICBtYWtlUm93RWRpdGFibGUoKTtcblxuICAgICAgICAgICAgLy8gaGlkZSBlZGl0IGJ1dHRvbnNcbiAgICAgICAgICAgIEVkaXQuaGlkZSgpO1xuICAgICAgICAgICAgaW5pdGlhbGl6ZUNvbmZpcm1CdXR0b24odXBkYXRlQ2FsbGJhY2spO1xuICAgIFxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyBDb25maXJtIGJ1dHRvblxuXG5mdW5jdGlvbiBpbml0aWFsaXplQ29uZmlybUJ1dHRvbih1cGRhdGVDYWxsYmFjayl7XG4gICAgLy8gZ2V0IGVsZW1lbnQgYW5kIGFkZCBsaXN0ZW5lciBmb3IgY2xpY2tcbiAgICB2YXIgcm93VG9FZGl0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFjdGl2ZS1lZGl0aW5nJyk7XG4gICAgY29uc3QgY29uZmlybV9idG4gPSByb3dUb0VkaXQucXVlcnlTZWxlY3RvcihcIi5idG4tY29uZmlybVwiKTtcbiAgICAvLyBzaG93IHRoZSByb3cncyBjb25maXJtIGJ1dHRvblxuICAgIGNvbmZpcm1fYnRuLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGNvbmZpcm1fYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXs7XG4gICAgICAgIC8vIHNhdmUgcm93IGVkaXRzXG4gICAgICAgIFJvd3Muc2F2ZUVkaXRzKHJvd1RvRWRpdCk7XG4gICAgICAgIC8vIHVwZGF0ZSB2YWx1ZXMgaW4gc2lkZWJhclxuICAgICAgICB1cGRhdGVDYWxsYmFjaygpO1xuICAgICAgICAvLyBtYWtlIHJvdyBubyBsb25nZXIgZ3JlZW5cbiAgICAgICAgcm93VG9FZGl0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZS1lZGl0aW5nJyk7XG4gICAgICAgIC8vIHNob3cgZWRpdCBidXR0b25zIGFuZCBoaWRlIGNvbmZpcm0gYnV0dG9uc1xuICAgICAgICBFZGl0LnNob3coKTtcbiAgICAgICAgQ29uZmlybS5oaWRlKCk7XG4gICAgfSk7XG59XG5cbmNvbnN0IEVkaXQgPSB7XG4gICAgaHRtbDogJzxidXR0b24gY2xhc3M9XCJidG4gYnRuLWVkaXRcIj5FZGl0PC9idXR0b24+JyxcbiAgICBoaWRlOiBoaWRlQnV0dG9uKCdidG4tZWRpdCcpLFxuICAgIHNob3c6IHNob3dCdXR0b24oJ2J0bi1lZGl0JyksXG4gICAgaW5pdCA6IGZ1bmN0aW9uKG1ha2VSb3dFZGl0YWJsZSwgdXBkYXRlQ2FsbGJhY2spe1xuICAgICAgICBoYW5kbGVSb3dFZGl0KG1ha2VSb3dFZGl0YWJsZSwgdXBkYXRlQ2FsbGJhY2spXG4gICAgfVxufTtcblxuY29uc3QgRGVsZXRlID0ge1xuICAgIGh0bWw6ICc8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kZWxldGVcIj5EZWxldGU8L2J1dHRvbj4nLFxuICAgIGhpZGU6IGhpZGVCdXR0b24oJ2J0bi1kZWxldGUnKSxcbiAgICBzaG93OiBzaG93QnV0dG9uKCdidG4tZGVsZXRlJylcbn07XG5cbmNvbnN0IENvbmZpcm0gPSB7XG4gICAgaHRtbDogJzxidXR0b24gY2xhc3M9XCJidG4gYnRuLWNvbmZpcm1cIj5Db25maXJtPC9idXR0b24+JyxcbiAgICBoaWRlOiBoaWRlQnV0dG9uKCdidG4tY29uZmlybScpLFxuICAgIHNob3c6IHNob3dCdXR0b24oJ2J0bi1jb25maXJtJylcbn07XG5cbmNvbnN0IEFkZFJvdyA9IHtcbiAgICBoaWRlOiBoaWRlQnV0dG9uKCdidG4tYWRkJyksXG4gICAgc2hvdzogc2hvd0J1dHRvbignYnRuLWFkZCcpLFxuICAgIHVwZGF0ZVRleHQ6IGZ1bmN0aW9uKHRleHQpe1xuICAgICAgICB1cGRhdGVCdXR0b25UZXh0KCdidG4tYWRkJywgdGV4dCk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IEJ1dHRvbnMgPSB7XG4gICAgRGVsZXRlOiBEZWxldGUsXG4gICAgRWRpdCA6IEVkaXQsXG4gICAgQ29uZmlybSA6IENvbmZpcm0sXG4gICAgQWRkUm93IDogQWRkUm93LFxuICAgIGVkaXRfY29uZmlybV9idG5zIDogRWRpdC5odG1sICsgQ29uZmlybS5odG1sICxcbiAgICBhbGxfYnRucyA6IERlbGV0ZS5odG1sICsgRWRpdC5odG1sICsgQ29uZmlybS5odG1sXG59XG5cbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbnM7IiwiYXN5bmMgZnVuY3Rpb24gY3JlYXRlRHJvcGRvd25Gcm9tSlNPTihqc29uX3BhdGgpIHtcbiAgICAvLyBGZXRjaCBKU09OIGRhdGEgZnJvbSBhIGZpbGUgYXN5bmNocm9ub3VzbHlcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGpzb25fcGF0aCk7XG4gICAgY29uc3QgZGF0YUFycmF5ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICBcbiAgICAvLyBDcmVhdGluZyBhIHNlbGVjdCBlbGVtZW50XG4gICAgY29uc3Qgc2VsZWN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpO1xuICBcbiAgICAvLyBMb29waW5nIHRocm91Z2ggdGhlIGFycmF5IGFuZCBjcmVhdGluZyBhbiBvcHRpb24gZm9yIGVhY2ggZWxlbWVudFxuICAgIGRhdGFBcnJheS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IGl0ZW0uaWQ7IC8vIFNldHRpbmcgdGhlIG9wdGlvbiB2YWx1ZSB0byB0aGUgaXRlbSBpZFxuICAgICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IGl0ZW0ubmFtZTsgLy8gU2V0dGluZyB0aGUgZGlzcGxheSB0ZXh0IHRvIHRoZSBpdGVtIG5hbWVcbiAgICAgIHNlbGVjdEVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uRWxlbWVudCk7IC8vIEFwcGVuZGluZyB0aGUgb3B0aW9uIHRvIHRoZSBzZWxlY3RcbiAgICB9KTtcbiAgXG4gICAgLy8gUmV0dXJuIHRoZSBzZWxlY3QgZWxlbWVudCBzbyBpdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIGRvY3VtZW50XG4gICAgcmV0dXJuIHNlbGVjdEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBEcm9wZG93biA9IHtcbiAgICBjcmVhdGVGcm9tSlNPTiA6IGZ1bmN0aW9uKGpzb25fcGF0aCl7IHJldHVybiBjcmVhdGVEcm9wZG93bkZyb21KU09OKGpzb25fcGF0aCkgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bjsiLCJpbXBvcnQgeyBmb3JtYXRDdXJyZW5jeSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tb25fdXRpbHMuanNcIjtcbmltcG9ydCBEcm9wZG93biBmcm9tIFwiLi4vLi4vZm9ybS9zdWJjb21wb25lbnRzL2Ryb3Bkb3duLmpzXCI7XG5cbi8vIHJldHVybiBjZWxsIHZhbHVlIGF0dHJpYnV0ZSBvciAwIGlmIGl0IGRvZXMgbm90IGV4aXN0XG5mdW5jdGlvbiBnZXRDZWxsVmFsdWUocm93LCBjbGFzc05hbWUpIHtcbiAgICB2YXIgY2VsbCA9IHJvdy5xdWVyeVNlbGVjdG9yKGAuJHtjbGFzc05hbWV9YCk7XG4gICAgdmFyIGNlbGxWYWx1ZSA9IGNlbGwgPyBjZWxsLmdldEF0dHJpYnV0ZSgndmFsdWUnKSA6IG51bGw7XG4gICAgcmV0dXJuIGNlbGxWYWx1ZSA/IHBhcnNlRmxvYXQoY2VsbFZhbHVlKSA6IDA7XG59XG5cbi8vIHJldHVybiB0ZXh0IGluIGNlbGxcbmZ1bmN0aW9uIGdldENlbGxUZXh0KHJvdywgY2xhc3NOYW1lKSB7XG4gICAgdmFyIGNlbGwgPSByb3cucXVlcnlTZWxlY3RvcihgLiR7Y2xhc3NOYW1lfWApO1xuICAgIHJldHVybiBjZWxsLnRleHRDb250ZW50O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVUYWJsZUNlbGwocm93LCBjb2xfY2xhc3MsIG5ld192YWx1ZSl7XG4gICAgY29uc3QgY2VsbCA9IHJvdy5xdWVyeVNlbGVjdG9yKGAuJHtjb2xfY2xhc3N9YCk7XG4gICAgY2VsbC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgbmV3X3ZhbHVlKTtcbiAgICBjZWxsLnRleHRDb250ZW50ID0gZm9ybWF0Q3VycmVuY3kobmV3X3ZhbHVlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRWRpdGFibGVDZWxsKGNlbGxDbGFzcyl7XG4gICAgLy8gZ2V0IGNlbGxcbiAgICBjb25zdCBjZWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLmFjdGl2ZS1lZGl0aW5nIHRkLiR7Y2VsbENsYXNzfWApO1xuICAgIC8vIENyZWF0ZSBhbiBpbnB1dCBlbGVtZW50IHRvIGVkaXQgdGhlIHZhbHVlXG4gICAgdmFyIHRleHRib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIHRleHRib3gudHlwZSA9ICd0ZXh0JztcbiAgICB0ZXh0Ym94LnZhbHVlID0gY2VsbC50ZXh0Q29udGVudDtcbiAgICAvLyBDbGVhciB0aGUgY3VycmVudCBjb250ZW50IGFuZCBhcHBlbmQgdGhlIHRleHRib3ggdG8gdGhlIGNlbGxcbiAgICBjZWxsLmlubmVySFRNTCA9ICcnO1xuICAgIGNlbGwuYXBwZW5kQ2hpbGQodGV4dGJveCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlbGVjdENlbGwoY2VsbENsYXNzLCBqc29uX2ZpbGVwYXRoKXtcbiAgICAvLyBnZXQgY2VsbFxuICAgIGNvbnN0IGNlbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuYWN0aXZlLWVkaXRpbmcgdGQuJHtjZWxsQ2xhc3N9YCk7XG4gICAgLy8gYWRkIHNlcnZpY2UgZHJvcGRvd25cbiAgICBjb25zdCBzZXJ2aWNlRHJvcGRvd24gPSBhd2FpdCBEcm9wZG93bi5jcmVhdGVGcm9tSlNPTihqc29uX2ZpbGVwYXRoKTtcbiAgICBzZXJ2aWNlRHJvcGRvd24udmFsdWUgPSBjZWxsLnRleHRDb250ZW50O1xuICAgIC8vIENsZWFyIHRoZSBjdXJyZW50IGNvbnRlbnQgYW5kIGFwcGVuZCB0aGUgdGV4dGJveCB0byB0aGUgY2VsbFxuICAgIGNlbGwuaW5uZXJIVE1MID0gJyc7XG4gICAgY2VsbC5hcHBlbmRDaGlsZChzZXJ2aWNlRHJvcGRvd24pO1xufVxuXG5jb25zdCBDZWxsID0ge1xuICAgIGdldFZhbHVlOiBmdW5jdGlvbihyb3csIGNsYXNzTmFtZSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2VsbFZhbHVlKHJvdywgY2xhc3NOYW1lKTsgXG4gICAgfSxcbiAgICBnZXRUZXh0OiBmdW5jdGlvbihyb3csIGNsYXNzTmFtZSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2VsbFRleHQocm93LCBjbGFzc05hbWUpOyBcbiAgICB9LFxuICAgIHVwZGF0ZVZhbHVlOiBmdW5jdGlvbihyb3csIGNvbF9jbGFzcywgbmV3X3ZhbHVlKSB7XG4gICAgICAgIHVwZGF0ZVRhYmxlQ2VsbChyb3csIGNvbF9jbGFzcywgbmV3X3ZhbHVlKTsgXG4gICAgfSxcbiAgICBjcmVhdGVUZXh0Ym94IDogZnVuY3Rpb24oY2xhc3NOYW1lKSB7XG4gICAgICAgIGNyZWF0ZUVkaXRhYmxlQ2VsbChjbGFzc05hbWUpXG4gICAgfSxcbiAgICBjcmVhdGVEcm9wZG93biA6IGZ1bmN0aW9uKGNsYXNzTmFtZSwganNvbl9maWxlcGF0aCl7XG4gICAgICAgIGNyZWF0ZVNlbGVjdENlbGwoY2xhc3NOYW1lLCBqc29uX2ZpbGVwYXRoKTtcbiAgICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ2VsbDsiLCJpbXBvcnQgeyBmb3JtYXRDdXJyZW5jeSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tb25fdXRpbHMuanNcIjtcblxuLy8gcG9zaXRpb24gaXMgaW5kZXggYXQgd2hpY2ggbmV3IGNvbHVtbiB3aWxsIGJlIGluc2VydGVkXG5mdW5jdGlvbiBhZGRDb2wocG9zaXRpb24sIGh0bWxDb250ZW50ID0gJycsIGhlYWRlclRpdGxlID0gJycpIHtcbiAgICAvLyBHZXQgdGhlIHRhYmxlIGVsZW1lbnQgYnkgaXRzIElEXG4gICAgbGV0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcblxuICAgIC8vIFZhbGlkYXRlIHBvc2l0aW9uXG4gICAgbGV0IG1heFBvc2l0aW9uID0gdGFibGUucm93c1swXS5jZWxscy5sZW5ndGg7XG4gICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+IG1heFBvc2l0aW9uKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBQb3NpdGlvbiAke3Bvc2l0aW9ufSBpcyBvdXQgb2YgYm91bmRzLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgXG4gICAgLy8gSW5zZXJ0IHRoZSBoZWFkZXIgaWYgcHJvdmlkZWRcbiAgICBsZXQgdGhlYWQgPSB0YWJsZS50SGVhZDtcbiAgICBpZiAoaGVhZGVyVGl0bGUgJiYgdGhlYWQpIHtcbiAgICAgIGxldCB0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJyk7XG4gICAgICB0aC5pbm5lckhUTUwgPSBoZWFkZXJUaXRsZTsgLy8gVXNlIGlubmVySFRNTCB0byBpbnNlcnQgSFRNTCBjb250ZW50XG4gICAgICB0aGVhZC5yb3dzWzBdLmluc2VydEJlZm9yZSh0aCwgdGhlYWQucm93c1swXS5jZWxsc1twb3NpdGlvbl0pO1xuICAgIH1cbiAgXG4gICAgLy8gSW5zZXJ0IG5ldyBjZWxscyBpbnRvIGVhY2ggcm93IG9mIHRoZSB0YWJsZSBib2R5XG4gICAgbGV0IHRib2R5ID0gdGFibGUudEJvZGllc1swXTtcbiAgICBpZiAodGJvZHkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGJvZHkucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgcm93ID0gdGJvZHkucm93c1tpXTtcbiAgICAgICAgbGV0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcbiAgICAgICAgdGQuaW5uZXJIVE1MID0gaHRtbENvbnRlbnQ7IC8vIFVzZSBpbm5lckhUTUwgdG8gaW5zZXJ0IEhUTUwgY29udGVudFxuICAgICAgICByb3cuaW5zZXJ0QmVmb3JlKHRkLCByb3cuY2VsbHNbcG9zaXRpb25dKTtcbiAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5jb2xzKCl7XG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xuICAgIC8vIEVuc3VyZSB0aGF0IHRoZSByb3cgZXhpc3RzIGJlZm9yZSBjb3VudGluZyB0aGUgY29sdW1uc1xuICAgIHJldHVybiB0YWJsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aDtcbn1cbiAgXG5mdW5jdGlvbiBhZGRDb2xUb0VuZChodG1sQ29udGVudHMgPSBbXSwgaGVhZGVyVGl0bGUgPSAnJyl7XG4gICAgLy8gY291bnQgY29sdW1ucyBhbmQgYWRkIG5ldyBjb2x1bW4gdG8gdGhlIGVuZFxuICAgIGNvbnN0IHBvc2l0aW9uID0gbmNvbHMoJ21haW4tdGFibGUnKTtcbiAgICBhZGRDb2wocG9zaXRpb24sIGh0bWxDb250ZW50cywgaGVhZGVyVGl0bGUpO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DbGFzc1RvQ29sdW1uKGhlYWRlck5hbWUsIGNsYXNzTmFtZSkge1xuICAgIC8vIEdldCB0aGUgdGFibGUgZWxlbWVudCBieSBpdHMgSURcbiAgICBsZXQgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xuXG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGNvbHVtbiBieSBpdHMgaGVhZGVyIG5hbWVcbiAgICBjb25zdCB0aGVhZCA9IHRhYmxlLnRIZWFkO1xuICAgIGlmICghdGhlYWQgfHwgdGhlYWQucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVGhlIHRhYmxlIGhlYWRlciBpcyBub3QgZm91bmQgb3IgaGFzIG5vIHJvd3MuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgbGV0IGhlYWRlckNlbGxJbmRleCA9IC0xO1xuICAgIGNvbnN0IGhlYWRlckNlbGxzID0gdGhlYWQucm93c1swXS5jZWxsczsgLy8gQXNzdW1pbmcgdGhlIGZpcnN0IHJvdyBjb250YWlucyBoZWFkZXIgY2VsbHMgKDx0aD4pXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJDZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaGVhZGVyQ2VsbHNbaV0udGV4dENvbnRlbnQudHJpbSgpID09PSBoZWFkZXJOYW1lKSB7XG4gICAgICAgICAgICBoZWFkZXJDZWxsSW5kZXggPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGVhZGVyQ2VsbEluZGV4ID09PSAtMSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBObyBoZWFkZXIgZm91bmQgd2l0aCBuYW1lIFwiJHtoZWFkZXJOYW1lfVwiYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIFxuICAgIC8vIEFzc2lnbiB0aGUgY2xhc3MgdG8gZWFjaCBjZWxsIGluIHRoZSBzcGVjaWZpZWQgY29sdW1uIGluZGV4IHdpdGhpbiB0aGUgdGJvZHlcbiAgICBsZXQgdGJvZHkgPSB0YWJsZS50Qm9kaWVzWzBdO1xuICAgIGlmICh0Ym9keSkge1xuICAgICAgbGV0IGJvZHlSb3dzID0gdGJvZHkucm93cztcbiAgICAgIGZvciAobGV0IHJvdyBvZiBib2R5Um93cykge1xuICAgICAgICBpZiAocm93LmNlbGxzW2hlYWRlckNlbGxJbmRleF0pIHtcbiAgICAgICAgICByb3cuY2VsbHNbaGVhZGVyQ2VsbEluZGV4XS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuZnVuY3Rpb24gYWRkQ29zdENsYXNzKGhlYWRlck5hbWUpe1xuICAgIGFzc2lnbkNsYXNzVG9Db2x1bW4oIGhlYWRlck5hbWUsICdjb3N0Jyk7XG5cbiAgICAvLyBHZXQgYWxsIHRoZSBjZWxscyB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MgbmFtZVxuICAgIGNvbnN0IGNlbGxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLmNvc3RgKTtcbiAgICAgIFxuICAgIGNlbGxzLmZvckVhY2goY2VsbCA9PiB7XG4gICAgICAgIC8vIEdldCB0aGUgY3VycmVudCB0ZXh0IGNvbnRlbnQgb2YgdGhlIGNlbGwgYW5kIGFzc2lnbiBpdCB0byAndmFsdWUnIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoIWNlbGwuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKXtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IGNlbGwudGV4dENvbnRlbnQudHJpbSgpO1xuICAgICAgICAgICAgY2VsbC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgY2VsbFZhbHVlKTtcblxuICAgICAgICAgICAgLy8gTm93IGZvcm1hdCB0aGUgdGV4dCBjb250ZW50IGxpa2UgY3VycmVuY3kgYW5kIHJlcGxhY2UgaXQgaW4gdGhlIGNlbGxcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZEN1cnJlbmN5ID0gZm9ybWF0Q3VycmVuY3kocGFyc2VGbG9hdChjZWxsVmFsdWUpKTtcbiAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBmb3JtYXR0ZWRDdXJyZW5jeTtcbiAgICAgICAgfVxuICAgICAgXG4gICAgfSk7XG5cbn1cblxuZnVuY3Rpb24gYXNzaWduQ29sdW1uQ2xhc3Nlcyhjb2x1bW5EZWZpbml0aW9ucykge1xuICBjb2x1bW5EZWZpbml0aW9ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAvLyBBc3NpZ24gY2xhc3MgdG8gY29sdW1uXG4gICAgICBhc3NpZ25DbGFzc1RvQ29sdW1uKGNvbHVtbi50aXRsZSwgY29sdW1uLmNsYXNzTmFtZSk7XG5cbiAgICAgIC8vIElmIHRoZSBjb2x1bW4gaXMgYSBjb3N0IGNvbHVtbiwgYWRkIHRoZSBzcGVjaWZpYyBjb3N0IGNsYXNzXG4gICAgICBpZiAoY29sdW1uLmlzQ29zdCkge1xuICAgICAgICAgIGFkZENvc3RDbGFzcyhjb2x1bW4udGl0bGUpO1xuICAgICAgfVxuICB9KTtcbn1cblxuXG5jb25zdCBDb2x1bW4gPSB7XG4gIGFkZDogZnVuY3Rpb24ocG9zaXRpb24sIGh0bWxDb250ZW50LCBoZWFkZXJUaXRsZSkge1xuICAgICAgcmV0dXJuIGFkZENvbChwb3NpdGlvbiwgaHRtbENvbnRlbnQsIGhlYWRlclRpdGxlKTtcbiAgfSxcbiAgYWRkQXRFbmQ6IGZ1bmN0aW9uKGh0bWxDb250ZW50LCBoZWFkZXJUaXRsZSkge1xuICAgICAgcmV0dXJuIGFkZENvbFRvRW5kKGh0bWxDb250ZW50LCBoZWFkZXJUaXRsZSk7XG4gIH0sXG4gIGFzc2lnbkNsYXNzZXM6IGZ1bmN0aW9uKGNvbHVtbl9kZWZpbml0aW9ucykge1xuICAgICAgcmV0dXJuIGFzc2lnbkNvbHVtbkNsYXNzZXMoY29sdW1uX2RlZmluaXRpb25zKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ29sdW1uOyIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEpTT04oanNvbkZpbGVQYXRoKSB7XG4gIHJldHVybiBmZXRjaChqc29uRmlsZVBhdGgpXG4gICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvaycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9KTtcbn1cblxuXG4gICIsImltcG9ydCB7IGZldGNoSlNPTiB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9kYXRhX3V0aWxzL0pTT05fZGF0YV9oYW5kbGVycy5qc1wiO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkSlNPTkludG9UYWJsZShqc29uRmlsZVBhdGgpIHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2hKU09OKGpzb25GaWxlUGF0aCk7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xuICAgICAgICAgICAgY29uc3QgdGhlYWQgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpO1xuICAgICAgICAgICAgY29uc3QgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xuXG4gICAgICAgICAgICAvLyBjbGVhciBleGlzdGluZyBkYXRhXG4gICAgICAgICAgICB0aGVhZC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgIHRib2R5LmlubmVySFRNTCA9ICcnO1xuICAgIFxuICAgICAgICAgICAgLy8gQ3JlYXRlIHRhYmxlIGhlYWRlciByb3dcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlclJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkYXRhWzBdKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJyk7XG4gICAgICAgICAgICAgIGhlYWRlci50ZXh0Q29udGVudCA9IGtleTtcbiAgICAgICAgICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKGhlYWRlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoZWFkLmFwcGVuZENoaWxkKGhlYWRlclJvdyk7XG4gICAgXG4gICAgICAgICAgICAvLyBDcmVhdGUgdGFibGUgYm9keSByb3dzXG4gICAgICAgICAgICBkYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG4gICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoaXRlbSkuZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xuICAgICAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSB2YWw7XG4gICAgICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGNlbGwpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTtcbiAgICAgICAgICAgIH0pO1xuICAgIFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignVGhlIHByb3ZpZGVkIEpTT04gZmlsZSBkb2VzIG5vdCBjb250YWluIGFuIGFycmF5IG9mIG9iamVjdHMuJyk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGFuZCBwYXJzZSB0aGUgSlNPTiBmaWxlOicsIGVycm9yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBEYXRhID0ge1xuICAgIGxvYWRGcm9tSlNPTiA6IGxvYWRKU09OSW50b1RhYmxlXG59XG5cbmV4cG9ydCBkZWZhdWx0IERhdGE7IiwiaW1wb3J0ICcuL3RhYmxlLmNzcyc7XG5cbmltcG9ydCBCdXR0b25zIGZyb20gJy4vc3ViY29tcG9uZW50cy9idXR0b25zLmpzJ1xuaW1wb3J0IENlbGwgZnJvbSAnLi9zdWJjb21wb25lbnRzL2NlbGxzLmpzJ1xuaW1wb3J0IENvbHVtbnMgZnJvbSAnLi9zdWJjb21wb25lbnRzL2NvbHVtbnMuanMnXG5pbXBvcnQgSGVhZGVyIGZyb20gJy4vc3ViY29tcG9uZW50cy9oZWFkZXJzLmpzJ1xuaW1wb3J0IFJvd3MgZnJvbSAnLi9zdWJjb21wb25lbnRzL3Jvd3MuanMnXG5pbXBvcnQgRGF0YSBmcm9tICcuL3N1YmNvbXBvbmVudHMvZGF0YS5qcydcblxuZnVuY3Rpb24gYWRqdXN0VGFibGVXaWR0aCh3aWR0aF9wY3Qpe1xuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcbiAgICB0YWJsZS5zdHlsZS53aWR0aCA9IHdpZHRoX3BjdDtcbn1cblxuZnVuY3Rpb24gY2xlYXJUYWJsZSgpe1xuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcbiAgICB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpLmlubmVySFRNTCA9ICcnO1xuICAgIHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5JykuaW5uZXJIVE1MID0gJyc7XG59XG5cbmZ1bmN0aW9uIHNob3dUYWJsZSgpe1xuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcbiAgICB0YWJsZS5zdHlsZS5kaXNwbGF5ID0gJ3RhYmxlJztcbn1cblxuZnVuY3Rpb24gaGlkZVRhYmxlKCl7XG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xuICAgIHRhYmxlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgQnV0dG9ucy5BZGRSb3cuaGlkZSgpO1xufVxuXG5jb25zdCBUYWJsZSA9IHtcbiAgICBCdXR0b25zIDogQnV0dG9ucyxcbiAgICBDZWxsIDogQ2VsbCxcbiAgICBDb2x1bW5zIDogQ29sdW1ucyxcbiAgICBIZWFkZXIgOiBIZWFkZXIsXG4gICAgUm93cyA6IFJvd3MsXG4gICAgRGF0YSA6IERhdGEsXG4gICAgLy8gZnVuY3Rpb25zXG4gICAgYWRqdXN0V2lkdGggOiBmdW5jdGlvbih3aWR0aF9wY3Qpe1xuICAgICAgICBhZGp1c3RUYWJsZVdpZHRoKHdpZHRoX3BjdClcbiAgICB9LFxuICAgIGNsZWFyIDogY2xlYXJUYWJsZSxcbiAgICBoaWRlIDogaGlkZVRhYmxlLFxuICAgIHNob3cgOiBzaG93VGFibGVcbn1cblxuZXhwb3J0IGRlZmF1bHQgVGFibGU7IiwiaW1wb3J0ICcuL2JvZHkuY3NzJztcblxuaW1wb3J0IFdlbGNvbWUgZnJvbSAnLi4vLi4vY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuanMnXG5pbXBvcnQgTW9kYWwgZnJvbSAnLi4vbW9kYWwvbW9kYWwuanMnO1xuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSAnLi4vbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanMnO1xuaW1wb3J0IFByb21wdCBmcm9tICcuLi9wcm9tcHQvcHJvbXB0LmpzJztcbmltcG9ydCBTaWRlYmFyIGZyb20gJy4uL3NpZGViYXIvc2lkZWJhci5qcyc7XG5pbXBvcnQgVGFibGUgZnJvbSAnLi4vdGFibGUvdGFibGUuanMnO1xuXG5mdW5jdGlvbiByZXNldFBhZ2UoKSB7XG4gICAgLy8gaGlkZSBldmVyeXRoaW5nIGluIHRoZSBib2R5XG4gICAgV2VsY29tZS5oaWRlKCk7XG4gICAgTW9kYWwuY2xlYXIoKTtcbiAgICBNb2RhbC5oaWRlKCk7XG4gICAgTmF2QnV0dG9ucy5oaWRlKCk7XG4gICAgUHJvbXB0LmhpZGUoKTtcbiAgICBUYWJsZS5oaWRlKCk7XG4gICAgU2lkZWJhci5oaWRlKCk7XG4gICAgLy8gZGlzYWJsZSBuZXh0IGJ1dHRvblxuICAgIE5hdkJ1dHRvbnMuTmV4dC5kaXNhYmxlKCk7XG4gICAgUHJvbXB0LkJ1dHRvbnMucmVzZXQoKTtcbn1cblxuZXhwb3J0IGNvbnN0IEJvZHkgPSB7XG4gICAgcmVzZXQgOiByZXNldFBhZ2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgQm9keTsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vZm9ybS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9mb3JtLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIi8vIGZ1bmN0aW9uIHRvIGFkZCBxdWVzdGlvbnMgdG8gZm9ybXNcbi8vIHR5cGUgaXMgJ2lucHV0JyBvciAndGV4dGFyZWEnXG4vLyBpbnB1dFR5cGUgaXMgZm9yIHZhbGlkYXRpb24gKCdudW1iZXInIG9yICd0ZXh0JywgZXRjKVxuZnVuY3Rpb24gYXBwZW5kRm9ybUVsZW1lbnQodHlwZSwgbGFiZWwsIGlucHV0SWQsIHJlcXVpcmVkLCBpbnB1dFR5cGUsIGZvcm1faWQgPSAnbmV3LWZvcm0nLCBjb3N0ID0gZmFsc2UpIHtcblxuICAgIC8vIGNoYW5nZSBpZiB3ZSB3YW50IGZvcm1zIGVsc2V3aGVyZVxuICAgIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtX2lkKTtcblxuICAgIC8vIGNyZWF0ZSBvdXRlciB3cmFwcGVyIGZvciBlbGVtZW50XG4gICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyAgXG5cbiAgICAvLyBsYWJlbCBxdWVzdGlvblxuICAgIGNvbnN0IGxhYmVsRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgIGxhYmVsRWwudGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgXG4gICAgLy8gc2V0IHR5cGUgKGlucHV0IG9yIHRleHRhcmVhKVxuICAgIGxldCBpbnB1dEVsO1xuICAgIGlmICh0eXBlID09PSAnaW5wdXQnKSB7XG4gICAgICBpbnB1dEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgIGlucHV0RWwudHlwZSA9IGlucHV0VHlwZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd0ZXh0YXJlYScpIHtcbiAgICAgIGlucHV0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGVsZW1lbnQgdHlwZScpO1xuICAgIH1cbiAgXG4gICAgLy8gbWFyayBhcyByZXF1aXJlZCBpZiBhcHBsaWNhYmxlXG4gICAgaW5wdXRFbC5yZXF1aXJlZCA9IHJlcXVpcmVkO1xuXG4gICAgLy8gSWYgYW4gSUQgaXMgcHJvdmlkZWQsIHNldCBpdCBvbiB0aGUgZWxlbWVudFxuICAgIGlmIChpbnB1dElkKSB7XG4gICAgICAgIGlucHV0RWwuaWQgPSBpbnB1dElkO1xuICAgIH1cbiAgXG4gICAgLy8gYWRkIGVsZW1lbnRzXG4gICAgd3JhcHBlci5hcHBlbmRDaGlsZChsYWJlbEVsKTtcbiAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGlucHV0RWwpO1xuICAgIGZvcm0uYXBwZW5kQ2hpbGQod3JhcHBlcik7XG59IFxuXG5leHBvcnQgY29uc3QgTmV3RmllbGQgPSB7XG4gICAgc2hvcnRUZXh0IDogZnVuY3Rpb24obGFiZWwsIGlucHV0SWQsIHJlcXVpcmVkID0gZmFsc2UsIGZvcm1faWQgPSAnbmV3LWZvcm0nLCBjb3N0ID0gZmFsc2UpIHtcbiAgICAgICAgYXBwZW5kRm9ybUVsZW1lbnQoJ2lucHV0JywgbGFiZWwsIGlucHV0SWQsIHJlcXVpcmVkLCAndGV4dCcsIGZvcm1faWQpO1xuICAgIH0sXG4gICAgbG9uZ1RleHQgOiBmdW5jdGlvbihsYWJlbCwgaW5wdXRJZCwgcmVxdWlyZWQgPSBmYWxzZSwgZm9ybV9pZCA9ICduZXctZm9ybScsIGNvc3QgPSBmYWxzZSkge1xuICAgICAgICBhcHBlbmRGb3JtRWxlbWVudCgndGV4dGFyZWEnLCBsYWJlbCwgaW5wdXRJZCwgcmVxdWlyZWQsIGZvcm1faWQpO1xuICAgIH0sXG4gICAgbnVtZXJpY0lucHV0OiBmdW5jdGlvbihsYWJlbCwgaW5wdXRJZCwgcmVxdWlyZWQgPSBmYWxzZSwgZm9ybV9pZCA9ICduZXctZm9ybScsIGNvc3QgPSB0cnVlKSB7XG4gICAgICAgIGFwcGVuZEZvcm1FbGVtZW50KCdpbnB1dCcsIGxhYmVsLCBpbnB1dElkLCByZXF1aXJlZCwgJ251bWJlcicsIGZvcm1faWQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTmV3RmllbGQ7IiwiZnVuY3Rpb24gYWRkU3VibWl0QnV0dG9uVG9Gb3JtKGZvcm1faWQpIHtcbiAgICAvLyBGaW5kIHRoZSBmb3JtIGJ5IGl0cyBJRFxuICAgIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtX2lkKTtcbiAgXG4gICAgLy8gQ3JlYXRlIHRoZSBjb250YWluZXIgYGRpdmAgZm9yIHRoZSBidXR0b25cbiAgICBjb25zdCBidXR0b25Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBidXR0b25Db250YWluZXIuaWQgPSAnc3VibWl0LWJ0bi1jb250YWluZXInO1xuICAgIFxuICAgIC8vIENyZWF0ZSB0aGUgc3VibWl0IGlucHV0XG4gICAgY29uc3Qgc3VibWl0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIHN1Ym1pdElucHV0LmNsYXNzTmFtZSA9ICdidG4gYnRuLXN1Ym1pdCc7IC8vIFVzZSBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgeW91ciBkZXNpZ25cbiAgICBzdWJtaXRJbnB1dC50eXBlID0gJ3N1Ym1pdCc7XG4gICAgc3VibWl0SW5wdXQudmFsdWUgPSAnU3VibWl0JztcblxuICAgIC8vIEFwcGVuZCB0aGUgc3VibWl0IGlucHV0IHRvIHRoZSBjb250YWluZXJcbiAgICBidXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQoc3VibWl0SW5wdXQpO1xuICAgIFxuICAgIC8vIEFwcGVuZCB0aGUgY29udGFpbmVyIHRvIHRoZSBmb3JtXG4gICAgZm9ybS5hcHBlbmRDaGlsZChidXR0b25Db250YWluZXIpO1xufVxuXG5leHBvcnQgY29uc3QgU3VibWl0QnV0dG9uID0ge1xuICAgIGFkZCA6IGZ1bmN0aW9uKCkgeyBhZGRTdWJtaXRCdXR0b25Ub0Zvcm0oJ25ldy1mb3JtJykgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTdWJtaXRCdXR0b247IiwiaW1wb3J0ICcuL2Zvcm0uY3NzJztcblxuaW1wb3J0IERyb3Bkb3duIGZyb20gXCIuL3N1YmNvbXBvbmVudHMvZHJvcGRvd24uanNcIjtcbmltcG9ydCBOZXdGaWVsZCBmcm9tIFwiLi9zdWJjb21wb25lbnRzL2ZpZWxkcy5qc1wiO1xuaW1wb3J0IFN1Ym1pdEJ1dHRvbiBmcm9tIFwiLi9zdWJjb21wb25lbnRzL3N1Ym1pdC5qc1wiO1xuXG5mdW5jdGlvbiBmZXRjaEFsbFJlc3BvbnNlcyhldmVudCkge1xuXG4gICAgLy8gQXNzdW1pbmcgYGV2ZW50LnRhcmdldGAgaXMgdGhlIGZvcm0gaXRzZWxmXG4gICAgY29uc3QgZm9ybSA9IGV2ZW50LnRhcmdldDtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGFuIGVtcHR5IGFycmF5IHRvIGhvbGQgdGhlIGlucHV0IHZhbHVlc1xuICAgIGxldCBmb3JtRGF0YSA9IHt9O1xuICAgIFxuICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGZvcm0gZWxlbWVudFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9ybS5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGZvcm0uZWxlbWVudHNbaV07XG4gICAgICBcbiAgICAgIC8vIEV4Y2x1ZGUgZWxlbWVudHMgdGhhdCBhcmVuJ3QgaW5wdXRzLCB0ZXh0YXJlYXMsIG9yIHNlbGVjdFxuICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fFxuICAgICAgICAgIGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fFxuICAgICAgICAgIGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgLy8gRXhjbHVkZSBpbnB1dCB0eXBlcyB0aGF0IGFyZSBub3QgY29uc2lkZXJlZCBmb3Igc3VibWlzc2lvbiAoc3VjaCBhcyBgc3VibWl0YClcbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSAhPT0gJ3N1Ym1pdCcgJiYgZWxlbWVudC50eXBlICE9PSAnYnV0dG9uJykge1xuICAgICAgICAgIGZvcm1EYXRhW2VsZW1lbnQuaWRdID0gZWxlbWVudC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBmb3JtLnJlc2V0KCk7XG4gICAgcmV0dXJuIGZvcm1EYXRhO1xufVxuXG5mdW5jdGlvbiBhZGRGb3JtKGVsZW1lbnRfaWQgPSAnbW9kYWwtYm9keScsIGZvcm1faWQgPSAnbmV3LWZvcm0nKSB7XG4gIFxuICBjb25zdCB0YXJnZXRfZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRfaWQpO1xuXG4gIC8vIGNyZWF0ZSBmb3JtXG4gIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XG4gIGZvcm0uc2V0QXR0cmlidXRlKCdpZCcsIGZvcm1faWQpO1xuXG4gIC8vIEFwcGVuZCB0aGUgZm9ybSB0byB0aGUgbW9kYWwgYm9keVxuICB0YXJnZXRfZWxlbS5hcHBlbmRDaGlsZChmb3JtKTtcblxufVxuXG5leHBvcnQgY29uc3QgRm9ybSA9IHtcbiAgbmV3IDogZnVuY3Rpb24ocGFyZW50X2VsZW1faWQpIHsgYWRkRm9ybShwYXJlbnRfZWxlbV9pZCwgJ25ldy1mb3JtJykgfSxcbiAgZmV0Y2hBbGxSZXNwb25zZXMgOiBmdW5jdGlvbihldmVudCkgeyByZXR1cm4gZmV0Y2hBbGxSZXNwb25zZXMoZXZlbnQpIH0sXG4gIE5ld0ZpZWxkIDogTmV3RmllbGQsXG4gIERyb3Bkb3duIDogRHJvcGRvd24sXG4gIFN1Ym1pdEJ1dHRvbiA6IFN1Ym1pdEJ1dHRvblxufVxuXG5leHBvcnQgZGVmYXVsdCBGb3JtOyIsIlxuaW1wb3J0IFByb21wdCBmcm9tICcuLi8uLi9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuanMnXG5pbXBvcnQgTW9kYWwgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9tb2RhbC9tb2RhbC5qcydcbmltcG9ydCBGb3JtIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvZm9ybS9mb3JtLmpzJ1xuaW1wb3J0IFRhYmxlIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdGFibGUvdGFibGUuanMnXG5pbXBvcnQgQm9keSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qcydcbmltcG9ydCBOYXZCdXR0b25zIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanMnXG5pbXBvcnQgeyBwYXVzZUFuZENvbnRpbnVlIH0gZnJvbSAnLi4vdmlld19sb2dpYy5qcydcbmltcG9ydCBTdWJ0aXRsZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplUGFnZVZpZXcoKSB7XG4gICAgLy8gUHJlcGFyZSBwYWdlIHZpZXdcbiAgICBCb2R5LnJlc2V0KCk7XG4gICAgTmF2QnV0dG9ucy5zaG93KCk7XG5cbiAgICAvLyBMb2FkIHRleHRcbiAgICBTdWJ0aXRsZS51cGRhdGUoJ05ldyBJbml0aWF0aXZlcycpO1xuICAgIFByb21wdC5UZXh0LnVwZGF0ZSgnRG8geW91IGhhdmUgYW55IG5ldyBpbml0aWF0aXZlcyBmb3IgRlkyNj8nKTtcbiAgICBQcm9tcHQuQnV0dG9ucy5MZWZ0LnVwZGF0ZVRleHQoJ1llcycpO1xuICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LnVwZGF0ZVRleHQoJ05vJyk7XG4gICAgLy8gY2xpY2tpbmcgJ25vIG5ldyBpbml0aWFsaXRpdmVzJyB3aWxsIGFsc28gdGFrZSB1cyB0byB0aGUgbmV4dCBwYWdlXG4gICAgUHJvbXB0LkJ1dHRvbnMuUmlnaHQuYWRkQWN0aW9uKHBhdXNlQW5kQ29udGludWUpO1xuICAgIFByb21wdC5CdXR0b25zLkxlZnQuYWRkQWN0aW9uKE5hdkJ1dHRvbnMuTmV4dC5lbmFibGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0VXBNb2RhbCgpIHtcbiAgICAvLyBJbml0aWFsaXplIG1vZGFsXG4gICAgTW9kYWwuY2xlYXIoKTtcbiAgICBNb2RhbC5MaW5rLmFkZCgnb3B0aW9uMScpO1xuICAgIE1vZGFsLlRpdGxlLnVwZGF0ZSgnTmV3IGluaXRpYXRpdmUnKTtcbiAgICBNb2RhbC5MaW5rLmFkZCgnYWRkLWJ0bicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0VXBGb3JtKCkge1xuICAgIC8vIFNldCB1cCBmb3JtXG4gICAgRm9ybS5uZXcoJ21vZGFsLWJvZHknKTtcbiAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dCgnSW5pdGlhdGl2ZSBOYW1lOicsICdJbml0aWF0aXZlIE5hbWUnLCB0cnVlKTsgXG4gICAgRm9ybS5OZXdGaWVsZC5sb25nVGV4dCgnRXhwbGFpbiB3aHkgdGhpcyBpbml0aWF0aXZlIGlzIG5lY2Vzc2FyeSBhbmQgZGVzY3JpYmUgaXRzIHBvdGVudGlhbCBpbXBhY3QuJywgJ0V4cGxhbmF0aW9uJywgdHJ1ZSk7XG4gICAgRm9ybS5OZXdGaWVsZC5udW1lcmljSW5wdXQoJ0VzdGltYXRlIG9mIEFERElUT05BTCByZXZlbnVlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluaXRpYXRpdmU/JywgJ1JldmVudWUnLCB0cnVlKTtcbiAgICBGb3JtLk5ld0ZpZWxkLm51bWVyaWNJbnB1dCgnRXN0aW1hdGUgb2YgQURESVRPTkFMIHBlcnNvbm5lbCBjb3N0PycsICdQZXJzb25uZWwgQ29zdCcsIHRydWUpO1xuICAgIEZvcm0uTmV3RmllbGQubnVtZXJpY0lucHV0KCdFc3RpbWF0ZSBvZiBBRERJVE9OQUwgbm9ucGVyc29ubmVsIGNvc3Q/JywgJ05vbi1wZXJzb25uZWwgQ29zdCcsIHRydWUpO1xuICAgIEZvcm0uU3VibWl0QnV0dG9uLmFkZCgpO1xuICAgIC8vIEluaXRpYWxpemUgZm9ybSBzdWJtaXNzaW9uIHRvIHRhYmxlIGRhdGFcbiAgICBoYW5kbGVGb3JtU3VibWlzc2lvbnMoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFVwVGFibGUoKSB7XG4gICAgLy8gU2V0IHVwIHRhYmxlXG4gICAgVGFibGUuY2xlYXIoKTtcbiAgICBUYWJsZS5hZGp1c3RXaWR0aCgnNzAlJyk7XG4gICAgVGFibGUuQnV0dG9ucy5BZGRSb3cudXBkYXRlVGV4dCgnQWRkIGFub3RoZXIgbmV3IGluaXRpYXRpdmUnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUZvcm1TdWJtaXNzaW9ucyhldmVudCl7XG4gICAgICAgIC8vIGluaXRpYWxpemUgZm9ybSBzdWJtaXNzaW9uXG4gICAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tbW9kYWwnKTtcbiAgICAgICAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAvLyBnZXQgYW5zd2VycyBmcm9tIGZvcm0sIGhpZGUgZm9ybSwgc2hvdyBhbnN3ZXJzIGluIHRhYmxlXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZXMgPSBGb3JtLmZldGNoQWxsUmVzcG9uc2VzKGV2ZW50KTtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBlbXB0eSByZXNwb25zZVxuICAgICAgICAgICAgaWYgKE9iamVjdC52YWx1ZXMocmVzcG9uc2VzKVswXSAhPSAnJyl7XG4gICAgICAgICAgICAgICAgLy8gY2hhbmdlIHBhZ2Ugdmlld1xuICAgICAgICAgICAgICAgIE1vZGFsLmhpZGUoKTtcbiAgICAgICAgICAgICAgICBQcm9tcHQuaGlkZSgpO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBhZGQgZGF0YSB0byB0YWJsZVxuICAgICAgICAgICAgICAgIFRhYmxlLlJvd3MuYWRkKHJlc3BvbnNlcyk7XG4gICAgICAgICAgICAgICAgVGFibGUuc2hvdygpO1xuICAgICAgICAgICAgICAgIFRhYmxlLkJ1dHRvbnMuQWRkUm93LnNob3coKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBzYXZlIHRhYmxlIGRhdGFcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBlZGl0IGNvc3QgdG8gc2hvdyBjdXJyZW5jeSBjb3JyZWN0bHlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU1vZGFsTGlua3MoKXtcbiAgICBNb2RhbC5MaW5rLnJlbW92ZSgnb3B0aW9uMScpO1xuICAgIE1vZGFsLkxpbmsucmVtb3ZlKCdhZGQtYnRuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVQcm9tcHRCdXR0b25MaXN0ZW5lcnMoKXtcbiAgICBQcm9tcHQuQnV0dG9ucy5SaWdodC5yZW1vdmVBY3Rpb24ocGF1c2VBbmRDb250aW51ZSk7XG4gICAgUHJvbXB0LkJ1dHRvbnMuTGVmdC5yZW1vdmVBY3Rpb24oTmF2QnV0dG9ucy5OZXh0LmVuYWJsZSk7XG59IiwiXG5pbXBvcnQgeyBpbml0aWFsaXplUGFnZVZpZXcsIHNldFVwTW9kYWwsIHNldFVwRm9ybSwgc2V0VXBUYWJsZSwgcmVtb3ZlTW9kYWxMaW5rcywgcmVtb3ZlUHJvbXB0QnV0dG9uTGlzdGVuZXJzIH0gZnJvbSAnLi9oZWxwZXJzLmpzJ1xuaW1wb3J0IHsgdXBkYXRlUGFnZVN0YXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0YV91dGlscy9sb2NhbF9zdG9yYWdlX2hhbmRsZXJzLmpzJ1xuXG5cbi8vIHNldCB1cCBwYWdlIGFuZCBpbml0aWFsaXplIGFsbCBidXR0b25zXG5leHBvcnQgZnVuY3Rpb24gbG9hZE5ld0luaXRpYXRpdmVzKCkge1xuICAgIHVwZGF0ZVBhZ2VTdGF0ZSgnbmV3LWluaXRzJyk7XG4gICAgaW5pdGlhbGl6ZVBhZ2VWaWV3KCk7XG4gICAgc2V0VXBNb2RhbCgpO1xuICAgIHNldFVwRm9ybSgpO1xuICAgIHNldFVwVGFibGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuVXBJbml0aWF0aXZlc1BhZ2UoKSB7XG4gICAgcmVtb3ZlTW9kYWxMaW5rcygpO1xuICAgIC8vIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgb24gcHJvbXB0IGJ1dHRvbnNcbiAgICByZW1vdmVQcm9tcHRCdXR0b25MaXN0ZW5lcnMoKTtcbn0iLCJpbXBvcnQgeyB1cGRhdGVQYWdlU3RhdGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZGF0YV91dGlscy9sb2NhbF9zdG9yYWdlX2hhbmRsZXJzLmpzXCI7XG5pbXBvcnQgUHJvbXB0IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5qcydcbmltcG9ydCB7IGluaXRpYWxpemVXZWxjb21lUGFnZSB9IGZyb20gXCIuLi8wMF93ZWxjb21lL21haW4uanNcIjtcbmltcG9ydCBCb2R5IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qc1wiO1xuaW1wb3J0IFN1YnRpdGxlIGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanNcIjtcbmltcG9ydCB7IHZpc2l0UGFnZSB9IGZyb20gXCIuLi92aWV3X2xvZ2ljLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkU3VtbWFyeVBhZ2UoKXtcbiAgICAvL3VwZGF0ZSBwYWdlIHN0YXRlXG4gICAgdXBkYXRlUGFnZVN0YXRlKCdzdW1tYXJ5Jyk7XG5cbiAgICAvLyBwcmVwYXJlIHBhZ2Ugdmlld1xuICAgIEJvZHkucmVzZXQoKTtcbiAgICBQcm9tcHQuQnV0dG9ucy5MZWZ0LnVwZGF0ZVRleHQoJ0Rvd25sb2FkIEV4Y2VsJyk7XG4gICAgUHJvbXB0LkJ1dHRvbnMuUmlnaHQudXBkYXRlVGV4dCgnR28gYmFjayBhbmQgZWRpdCcpO1xuXG4gICAgLy8gdXBkYXRlIHBhZ2UgdGV4dFxuICAgIFN1YnRpdGxlLnVwZGF0ZSgnU3VtbWFyeScpO1xuICAgIC8vIFRPRE86IHVwZGF0ZSB0byBtYWtlIGR5bmFtaWNcbiAgICBQcm9tcHQuVGV4dC51cGRhdGUoYFBsYWNlaG9sZGVyIGZvciBzdW1tYXJ5IGFuZCBhbnkgaXNzdWVzLmApO1xuICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LmFkZEFjdGlvbihyZXR1cm5Ub1dlbGNvbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcFN1bW1hcnlQYWdlKCl7XG4gICAgUHJvbXB0LkJ1dHRvbnMuUmlnaHQucmVtb3ZlQWN0aW9uKHJldHVyblRvV2VsY29tZSk7XG59XG5cbmNvbnN0IHJldHVyblRvV2VsY29tZSA9ICgpID0+IHt2aXNpdFBhZ2UoJ3dlbGNvbWUnKX0iLCJcbmltcG9ydCBTdWJ0aXRsZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanMnXG5pbXBvcnQgUHJvbXB0IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5qcydcbmltcG9ydCBOYXZCdXR0b25zIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanMnXG5pbXBvcnQgVGFibGUgZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvdGFibGUvdGFibGUuanNcIjtcbmltcG9ydCB7IERBVEFfUk9PVCB9IGZyb20gXCIuLi8uLi9pbml0LmpzXCI7XG5pbXBvcnQgQm9keSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9ib2R5L2JvZHkuanNcIjtcblxuY29uc3QgZnVuZENvbHMgPSBbXG4gICAgeyB0aXRsZTogJ0lEJywgY2xhc3NOYW1lOiAnZnVuZC1pZCcgfSxcbiAgICB7IHRpdGxlOiAnTmFtZScsIGNsYXNzTmFtZTogJ2Z1bmQtbmFtZScgfSxcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlUGFnZVZpZXcoKXtcbiAgICBcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImZ1bmRcIiwgJycpO1xuXG4gICAgLy8gcHJlcGFyZSBwYWdlIHZpZXdcbiAgICBCb2R5LnJlc2V0KCk7XG4gICAgTmF2QnV0dG9ucy5zaG93KCk7XG5cbiAgICAvLyB1cGRhdGUgcGFnZSB0ZXh0XG4gICAgU3VidGl0bGUudXBkYXRlKCdCYXNlbGluZSBCdWRnZXQgUmVxdWVzdCcpO1xuICAgIC8vIFRPRE86IHVwZGF0ZSB0byBtYWtlIGR5bmFtaWNcbiAgICBQcm9tcHQuVGV4dC51cGRhdGUoYFdlIHdpbGwgbm93IGFzayB5b3UgYSBzZXJpZXMgb2YgcXVlc3Rpb25zIGFib3V0IHlvdXIgQkFTRUxJTkUgYnVkZ2V0IHJlcXVlc3QuXG4gICAgICAgIEF0IHRoZSBlbmQsIHdlIHdpbGwgYXNrIHlvdSBhYm91dCBhbnkgbmV3IGluaXRpYXRpdmVzIChpZS4gc3VwcGxlbWVudGFsIHJlcXVlc3RzKS5cbiAgICAgICAgU2VsZWN0IG9uZSBvZiB5b3VyIGZ1bmRzIHRvIGJlZ2luLmApO1xufVxuXG5mdW5jdGlvbiBhbGxvd1Jvd1NlbGVjdGlvbigpe1xuICAgIHZhciB0YWJsZVJvd3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwidGJvZHkgdHJcIik7XG4gICAgdGFibGVSb3dzLmZvckVhY2goZnVuY3Rpb24ocm93KSB7XG4gICAgICAgIHJvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnaG92ZXItZWZmZWN0Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZSgnaG92ZXItZWZmZWN0Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGVjdEZ1bmQodGFibGVSb3dzLCB0aGlzKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplRnVuZFRhYmxlKCl7XG4gICAgYXdhaXQgVGFibGUuRGF0YS5sb2FkRnJvbUpTT04oREFUQV9ST09UICsgJ2Z1bmRzLmpzb24nKVxuICAgIFRhYmxlLmFkanVzdFdpZHRoKCcxMDAlJyk7XG4gICAgVGFibGUuc2hvdygpO1xuICAgIFRhYmxlLkNvbHVtbnMuYXNzaWduQ2xhc3NlcyhmdW5kQ29scyk7XG4gICAgYWxsb3dSb3dTZWxlY3Rpb24oKTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0RnVuZCh0YWJsZVJvd3MsIHNlbGVjdGVkX3Jvdyl7XG4gICAgLy8gcmVtb3ZlIHNlbGVjdGVkIGNsYXNzIGZyb20gYW55IG90aGVyIHJvd3NcbiAgICB0YWJsZVJvd3MuZm9yRWFjaChmdW5jdGlvbih0YWJsZVJvdykge1xuICAgICAgICB0YWJsZVJvdy5jbGFzc0xpc3QgPSAnJztcbiAgICB9KTtcbiAgICAvLyBhZGQgc2VsZWN0ZWQgY2xhc3MgdG8gY2xpY2tlZCByb3dcbiAgICBzZWxlY3RlZF9yb3cuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAvLyBnZXQgZnVuZCBhbmQgc2F2ZSBzZWxlY3RlZCBmdW5kXG4gICAgdmFyIGZ1bmQgPSBzZWxlY3RlZF9yb3cucXVlcnlTZWxlY3RvcignLmZ1bmQtbmFtZScpLnRleHRDb250ZW50O1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZnVuZFwiLCBmdW5kKTtcblxuICAgIC8vIGVuYWJsZSBuZXh0IHN0ZXBcbiAgICBOYXZCdXR0b25zLk5leHQuZW5hYmxlKCk7XG59IiwiaW1wb3J0IHsgdXBkYXRlUGFnZVN0YXRlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2RhdGFfdXRpbHMvbG9jYWxfc3RvcmFnZV9oYW5kbGVycy5qc1wiO1xuaW1wb3J0IHsgcHJlcGFyZVBhZ2VWaWV3LCBpbml0aWFsaXplRnVuZFRhYmxlIH0gZnJvbSBcIi4uLzAyX2Jhc2VsaW5lX2xhbmRpbmdfcGFnZS9oZWxwZXJzLmpzXCI7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRCYXNlbGluZUxhbmRpbmdQYWdlKCl7XG4gICAgLy91cGRhdGUgcGFnZSBzdGF0ZVxuICAgIHVwZGF0ZVBhZ2VTdGF0ZSgnYmFzZWxpbmUtbGFuZGluZycpO1xuICAgIHByZXBhcmVQYWdlVmlldygpO1xuICAgIGluaXRpYWxpemVGdW5kVGFibGUoKTtcbn1cbiIsImltcG9ydCBTdWJ0aXRsZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanMnXG5pbXBvcnQgUHJvbXB0IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5qcydcbmltcG9ydCBOYXZCdXR0b25zIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanMnXG5pbXBvcnQgQm9keSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9ib2R5L2JvZHkuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVQYWdlVmlldygpIHtcblxuICAgIC8vIHJlbW92ZSBmdW5kIHNlbGVjdGlvblxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZnVuZFwiLCAnJyk7XG5cbiAgICAvLyBwcmVwYXJlIHBhZ2Ugdmlld1xuICAgIEJvZHkucmVzZXQoKTtcbiAgICBOYXZCdXR0b25zLnNob3coKTtcblxuICAgIC8vIHVwZGF0ZSBwYWdlIHRleHRcbiAgICBTdWJ0aXRsZS51cGRhdGUoJ0V4Y2VsIFVwbG9hZCcpO1xuXG4gICAgLy8gVE9ETzogdXBkYXRlIHRvIG1ha2UgdXBsb2FkIGFjdHVhbGx5IHdvcmtcbiAgICBQcm9tcHQuVGV4dC51cGRhdGUoYFBsYWNlaG9sZGVyIGZvciBFeGNlbCBVcGxvYWRgKTtcbiAgICBQcm9tcHQuQnV0dG9ucy5MZWZ0LnVwZGF0ZVRleHQoJ1VwbG9hZCcpO1xuICAgIFByb21wdC5CdXR0b25zLkxlZnQuc2hvdygpO1xuICAgIFByb21wdC5CdXR0b25zLkxlZnQuYWRkQWN0aW9uKHVwbG9hZEV4Y2VsQWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gdXBsb2FkRXhjZWxBY3Rpb24oKSB7XG4gICAgTmF2QnV0dG9ucy5OZXh0LmVuYWJsZSgpO1xufSIsImltcG9ydCB7IHVwZGF0ZVBhZ2VTdGF0ZSB9IGZyb20gXCIuLi8uLi91dGlscy9kYXRhX3V0aWxzL2xvY2FsX3N0b3JhZ2VfaGFuZGxlcnMuanNcIjtcbmltcG9ydCB7IGluaXRpYWxpemVQYWdlVmlldyB9IGZyb20gXCIuL2hlbHBlcnMuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRVcGxvYWRQYWdlKCl7XG4gICAgLy91cGRhdGUgcGFnZSBzdGF0ZVxuICAgIHVwZGF0ZVBhZ2VTdGF0ZSgndXBsb2FkJyk7XG4gICAgaW5pdGlhbGl6ZVBhZ2VWaWV3KCk7XG4gICAgXG59IiwiaW1wb3J0IFN1YnRpdGxlIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5qcydcbmltcG9ydCBXZWxjb21lIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvd2VsY29tZS93ZWxjb21lLmpzJ1xuaW1wb3J0IEJvZHkgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9ib2R5L2JvZHkuanMnXG5cbmltcG9ydCB7IGxvYWROZXdJbml0aWF0aXZlcyB9IGZyb20gJy4uLzA2X25ld19pbml0aWF0aXZlcy9tYWluLmpzJ1xuaW1wb3J0IHsgbG9hZFN1bW1hcnlQYWdlIH0gZnJvbSAnLi4vMDdfc3VtbWFyeS9tYWluLmpzJ1xuaW1wb3J0IHsgbG9hZEJhc2VsaW5lTGFuZGluZ1BhZ2UgfSBmcm9tICcuLi8wMl9iYXNlbGluZV9sYW5kaW5nX3BhZ2UvbWFpbi5qcydcbmltcG9ydCB7IGxvYWRVcGxvYWRQYWdlIH0gZnJvbSAnLi4vMDFfdXBsb2FkL21haW4uanMnXG4gXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZVBhZ2VWaWV3KCl7XG4gICAgLy8gcGFnZSBzZXQgdXBcbiAgICBCb2R5LnJlc2V0KCk7XG4gICAgU3VidGl0bGUudXBkYXRlKFwiV2VsY29tZVwiKTtcbiAgICBXZWxjb21lLnNob3coKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZExpbmtzKCl7XG4gICAgLy8gaW5pdGlhbGl6ZSBsaW5rcyBpbiBidXR0b25zXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAtdXBsb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkVXBsb2FkUGFnZSlcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RlcC1pbml0aWF0aXZlcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZE5ld0luaXRpYXRpdmVzKVxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGVwLXJldmVudWUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRCYXNlbGluZUxhbmRpbmdQYWdlKVxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGVwLWZpbmlzaCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZFN1bW1hcnlQYWdlKVxuXG59XG4iLCJcbmltcG9ydCB7IHVwZGF0ZVBhZ2VTdGF0ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2RhdGFfdXRpbHMvbG9jYWxfc3RvcmFnZV9oYW5kbGVycy5qcydcbmltcG9ydCB7IGluaXRpYWxpemVQYWdlVmlldywgYWRkTGlua3MgfSBmcm9tICcuL2hlbHBlcnMuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplV2VsY29tZVBhZ2UoKXtcblxuICAgIHVwZGF0ZVBhZ2VTdGF0ZSgnd2VsY29tZScpO1xuICAgIGluaXRpYWxpemVQYWdlVmlldygpO1xuICAgIGFkZExpbmtzKCk7XG5cbn0iLCJpbXBvcnQgeyB1cGRhdGVQYWdlU3RhdGUgfSBmcm9tICcuLi8uLi91dGlscy9kYXRhX3V0aWxzL2xvY2FsX3N0b3JhZ2VfaGFuZGxlcnMuanMnXG5pbXBvcnQgUHJvbXB0IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5qcydcbmltcG9ydCB7IGZvcm1hdEN1cnJlbmN5IH0gZnJvbSAnLi4vLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzJ1xuaW1wb3J0IHsgUkVWRU5VRSB9IGZyb20gJy4uLy4uL2luaXQuanMnXG5pbXBvcnQgQm9keSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qcydcbmltcG9ydCBOYXZCdXR0b25zIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanMnXG5pbXBvcnQgeyBwYXVzZUFuZENvbnRpbnVlIH0gZnJvbSAnLi4vdmlld19sb2dpYy5qcydcbmltcG9ydCBTdWJ0aXRsZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUmV2ZW51ZVBhZ2UoKSB7XG5cbiAgICAvL3VwZGF0ZSBwYWdlIHN0YXRlXG4gICAgdXBkYXRlUGFnZVN0YXRlKCdyZXZlbnVlJyk7XG5cbiAgICAvLyBwcmVwYXJlIHBhZ2Ugdmlld1xuICAgIEJvZHkucmVzZXQoKTtcbiAgICBOYXZCdXR0b25zLnNob3coKTtcblxuICAgIC8vIHVwZGF0ZSBwYWdlIHRleHRcbiAgICBTdWJ0aXRsZS51cGRhdGUoJ1JldmVudWUgUHJvamVjdGlvbnMnKTtcbiAgICAvLyBUT0RPOiB1cGRhdGUgdG8gbWFrZSBkeW5hbWljXG4gICAgUHJvbXB0LlRleHQudXBkYXRlKGBZb3VyIHJldmVudWUgcHJvamVjdGlvbiBmb3IgRlkyNiBpcyAke2Zvcm1hdEN1cnJlbmN5KFJFVkVOVUUsIHRydWUpfWApO1xuICAgIFByb21wdC5CdXR0b25zLkxlZnQudXBkYXRlVGV4dCgnQ29uZmlybScpO1xuICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LnVwZGF0ZVRleHQoXCJUaGlzIGRvZXNuJ3QgbG9vayByaWdodFwiKTtcblxuICAgIC8vIGNsaWNraW5nICdjb25maXJtJyB3aWxsIGFsc28gdGFrZSB1cyB0byB0aGUgbmV4dCBwYWdlXG4gICAgUHJvbXB0LkJ1dHRvbnMuTGVmdC5hZGRBY3Rpb24ocGF1c2VBbmRDb250aW51ZSk7XG4gICAgLy8gVE9ETzogYWxsb3cgdXNlciB0byBlZGl0IHJldmVudWUgaGVyZVxuICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LmFkZEFjdGlvbihoYW5kbGVSZXZlbnVlRWRpdCk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJldmVudWVFZGl0KCkge1xuICAgIE5hdkJ1dHRvbnMuTmV4dC5lbmFibGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFudXBSZXZlbnVlUGFnZSgpIHtcbiAgICAvLyByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIG9uIHByb21wdCBidXR0b25zXG4gICAgUHJvbXB0LkJ1dHRvbnMuTGVmdC5yZW1vdmVBY3Rpb24ocGF1c2VBbmRDb250aW51ZSk7XG4gICAgUHJvbXB0LkJ1dHRvbnMuUmlnaHQucmVtb3ZlQWN0aW9uKCk7XG59OyIsIlxuaW1wb3J0IHsgREFUQV9ST09ULCBGSVNDQUxfWUVBUiwgZnJpbmdlLCBjb2xhLCBtZXJpdCB9IGZyb20gXCIuLi8uLi9pbml0LmpzXCJcbmltcG9ydCBCb2R5IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qc1wiO1xuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanNcIjtcbmltcG9ydCBTdWJ0aXRsZSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9oZWFkZXIvaGVhZGVyLmpzXCI7XG5pbXBvcnQgRm9ybSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9mb3JtL2Zvcm0uanNcIjtcbmltcG9ydCBNb2RhbCBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9tb2RhbC9tb2RhbC5qc1wiO1xuaW1wb3J0IFByb21wdCBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzXCI7XG5pbXBvcnQgVGFibGUgZnJvbSAnLi4vLi4vY29tcG9uZW50cy90YWJsZS90YWJsZS5qcydcbmltcG9ydCBTaWRlYmFyIGZyb20gXCIuLi8uLi9jb21wb25lbnRzL3NpZGViYXIvc2lkZWJhci5qc1wiO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlUGFnZVZpZXcoKXtcbiAgICAvLyBwcmVwYXJlIHBhZ2Ugdmlld1xuICAgIEJvZHkucmVzZXQoKTtcbiAgICBOYXZCdXR0b25zLnNob3coKTtcbiAgICBTaWRlYmFyLnNob3coKTtcbiAgICBUYWJsZS5hZGp1c3RXaWR0aCgnOTAlJyk7XG4gICAgLy8ganVzdCBlbmFibGUgbmV4dCBmb3Igbm93XG4gICAgLy8gVE9ETyBvbmx5IGVuYWJsZSB3aGVuIGFsbCBpbmZvIGlzIGVudGVyZWRcbiAgICBOYXZCdXR0b25zLk5leHQuZW5hYmxlKCk7XG5cbiAgICAvLyB1cGRhdGUgcGFnZSB0ZXh0XG4gICAgU3VidGl0bGUudXBkYXRlKCdQZXJzb25uZWwnKTtcbiAgICBQcm9tcHQuVGV4dC51cGRhdGUoYFxuICAgICAgICBUaGlzIHRhYmxlIGRpc3BsYXlzIHRoZSBudW1iZXIgb2YgRlRFcyBpbiBlYWNoIGpvYiBjb2RlIGZvciBpbiB5b3VyIGRlcGFydG1lbnQncyBcbiAgICAgICAgY3VycmVudCAoYW1lbmRlZCkgRlkyNSBidWRnZXQuIFRvIG1ha2UgZWRpdHMgdG8gdGhlIG51bWJlciBvZiBwb3NpdGlvbnMsIGNsaWNrIHRoZVxuICAgICAgICBcIkVkaXRcIiBidXR0b24gb24gdGhlIHJvdyB5b3Ugd291bGQgbGlrZSB0byBlZGl0LiBUaGUgXCJUb3RhbCBDb3N0XCIgY29sdW1uIGFuZCB0aGUgXG4gICAgICAgIHN1bW1hcnkgc2lkZWJhciB3aWxsIGFsc28gdXBkYXRlIHRvIHJlZmxlY3QgYW55IGVkaXRzLlxuICAgIGApO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DbGFzc2VzKCkge1xuICAgIC8vIHJlY29yZCBjb2x1bW5zIGFuZCB0aGVpciBjbGFzc2VzXG4gICAgY29uc3QgcGVyc29ubmVsQ29sdW1ucyA9IFtcbiAgICAgICAgeyB0aXRsZTogJ0pvYiBOYW1lIChUeXBlKScsIGNsYXNzTmFtZTogJ2pvYi1uYW1lJyB9LFxuICAgICAgICB7IHRpdGxlOiBgRlkke0ZJU0NBTF9ZRUFSfSBGVEVzYCwgY2xhc3NOYW1lOiAnYmFzZWxpbmUtZnRlcycgfSxcbiAgICAgICAgeyB0aXRsZTogJ1NlcnZpY2UnLCBjbGFzc05hbWU6ICdzZXJ2aWNlJyB9LFxuICAgICAgICB7IHRpdGxlOiAnVG90YWwgQ29zdCcsIGNsYXNzTmFtZTogJ3RvdGFsLWJhc2VsaW5lJywgaXNDb3N0OiB0cnVlIH0sXG4gICAgICAgIHsgdGl0bGU6ICdBdmVyYWdlIFByb2plY3RlZCBTYWxhcnknLCBjbGFzc05hbWU6ICdhdmctc2FsYXJ5JywgaXNDb3N0OiB0cnVlIH1cbiAgICBdO1xuXG4gICAgLy8gYXNzaWduIGNvc3QgY2xhc3Nlc1xuICAgIFRhYmxlLkNvbHVtbnMuYXNzaWduQ2xhc3NlcyhwZXJzb25uZWxDb2x1bW5zKVxufVxuXG5mdW5jdGlvbiBwZXJzb25uZWxSb3dPbkVkaXQoKXtcbiAgICBUYWJsZS5DZWxsLmNyZWF0ZVRleHRib3goJ2Jhc2VsaW5lLWZ0ZXMnKTtcbiAgICBUYWJsZS5DZWxsLmNyZWF0ZURyb3Bkb3duKCdzZXJ2aWNlJywgREFUQV9ST09UICsgJ3NlcnZpY2VzLmpzb24nKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVQZXJzb25uZWxUYWJsZSgpe1xuICAgIC8vIGxvYWQgdGFibGUgZGF0YSBmcm9tIGpzb25cbiAgICBhd2FpdCBUYWJsZS5EYXRhLmxvYWRGcm9tSlNPTihEQVRBX1JPT1QgKyAncGVyc29ubmVsX2RhdGEuanNvbicpO1xuICAgIC8vYWZ0ZXIgdGFibGUgaXMgbG9hZGVkLCBmaWxsIGl0XG4gICAgVGFibGUuc2hvdygpO1xuICAgIFRhYmxlLkNvbHVtbnMuYWRkQXRFbmQoICcwJywgJ1RvdGFsIENvc3QnKTtcbiAgICBUYWJsZS5Db2x1bW5zLmFkZEF0RW5kKFRhYmxlLkJ1dHRvbnMuZWRpdF9jb25maXJtX2J0bnMsICcgJyk7O1xuICAgIGFzc2lnbkNsYXNzZXMoKTtcbiAgICAvLyBhZGQgdXAgdGhlIGJhc2VsaW5lIGNvc3RzIGFuZCB1cGRhdGUgc2lkZWJhclxuICAgIHVwZGF0ZURpc3BsYXlhbmRUb3RhbHMoKTtcbiAgICAvLyBhY3RpdmF0ZSBlZGl0IGJ1dHRvbnNcbiAgICBUYWJsZS5CdXR0b25zLkVkaXQuaW5pdChwZXJzb25uZWxSb3dPbkVkaXQsIHVwZGF0ZURpc3BsYXlhbmRUb3RhbHMpO1xuICAgIGluaXRpYWxpemVSb3dBZGRpdGlvbigpO1xufVxuXG5mdW5jdGlvbiBpbml0aWFsaXplUm93QWRkaXRpb24oKXtcbiAgICBUYWJsZS5CdXR0b25zLkFkZFJvdy51cGRhdGVUZXh0KFwiQWRkIG5ldyBqb2JcIik7XG4gICAgVGFibGUuQnV0dG9ucy5BZGRSb3cuc2hvdygpO1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVUb3RhbENvc3QoZnRlcywgYXZnX3NhbGFyeSwgZnJpbmdlLCBjb2xhLCBtZXJpdCl7XG4gICAgcmV0dXJuIGZ0ZXMgKiBhdmdfc2FsYXJ5ICogKDEgKyBmcmluZ2UpICogKDEgKyBjb2xhKSAqICgxICsgbWVyaXQpO1xufVxuXG4vLyB1cGRhdGUgc2lkZWJhciBhbmQgYWxzbyBjb3N0IHRvdGFscyB3aGVuIHRoZSBGVEVzIGFyZSBlZGl0ZWRcbmZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlhbmRUb3RhbHMoKXtcbiAgICAvLyBpbml0aWFsaXplXG4gICAgU2lkZWJhci51cGRhdGVTdGF0KCdiYXNlbGluZS1wZXJzb25uZWwnLCAwKTtcbiAgICBTaWRlYmFyLnVwZGF0ZVN0YXQoJ3N1cHAtcGVyc29ubmVsJywgMCk7XG4gICAgLy8gY2FsY3VsYXRlIGZvciBlYWNoIHJvd1xuICAgIGxldCByb3dzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RyJyk7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3dzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgLy8gZmV0Y2ggdmFsdWVzIGZvciBjYWxjdWxhdGlvbnNcbiAgICAgICAgbGV0IGF2Z19zYWxhcnkgPSBUYWJsZS5DZWxsLmdldFZhbHVlKHJvd3NbaV0sICdhdmctc2FsYXJ5Jyk7XG4gICAgICAgIGxldCBiYXNlbGluZV9mdGVzID0gVGFibGUuQ2VsbC5nZXRUZXh0KHJvd3NbaV0sICdiYXNlbGluZS1mdGVzJyk7XG5cbiAgICAgICAgLy8gY2FsY3VhdGUgI0ZURXMgeCBhdmVyYWdlIHNhbGFyeSArIENPTEEgYWRqdXN0bWVudHMgKyBtZXJpdCBhZGp1c3RtZW50cyArIGZyaW5nZVxuICAgICAgICBsZXQgdG90YWxfYmFzZWxpbmVfY29zdCA9IGNhbGN1bGF0ZVRvdGFsQ29zdChiYXNlbGluZV9mdGVzLCBhdmdfc2FsYXJ5LCBmcmluZ2UsIGNvbGEsIG1lcml0KTtcblxuICAgICAgICAvLyB1cGRhdGUgY291bnRlciBhbmQgdG90YWxcbiAgICAgICAgU2lkZWJhci5pbmNyZW1lbnRTdGF0KCdiYXNlbGluZS1wZXJzb25uZWwnLCB0b3RhbF9iYXNlbGluZV9jb3N0KTtcbiAgICAgICAgVGFibGUuQ2VsbC51cGRhdGVWYWx1ZShyb3dzW2ldLCAndG90YWwtYmFzZWxpbmUnLCB0b3RhbF9iYXNlbGluZV9jb3N0KTtcbiAgICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFVwTW9kYWwoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBtb2RhbFxuICAgIE1vZGFsLmNsZWFyKCk7XG4gICAgTW9kYWwuTGluay5hZGQoJ2FkZC1idG4nKTtcbiAgICBNb2RhbC5UaXRsZS51cGRhdGUoJ05ldyBqb2InKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFVwRm9ybSgpIHtcbiAgICAvLyBTZXQgdXAgZm9ybVxuICAgIEZvcm0ubmV3KCdtb2RhbC1ib2R5Jyk7XG4gICAgRm9ybS5OZXdGaWVsZC5zaG9ydFRleHQoJ0pvYiBOYW1lOicsICdqb2ItbmFtZScsIHRydWUpOyBcbiAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dCgnQWNjb3VudCBTdHJpbmc6JywgJ2FjY291bnQtc3RyaW5nJywgdHJ1ZSk7IFxuICAgIEZvcm0uU3VibWl0QnV0dG9uLmFkZCgpO1xuICAgIC8vIEluaXRpYWxpemUgZm9ybSBzdWJtaXNzaW9uIHRvIHRhYmxlIGRhdGFcbiAgICBoYW5kbGVGb3JtU3VibWlzc2lvbnMoKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlRm9ybVN1Ym1pc3Npb25zKGV2ZW50KXtcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBmb3JtIHN1Ym1pc3Npb25cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tbW9kYWwnKTtcbiAgICAgICAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAvLyBnZXQgYW5zd2VycyBmcm9tIGZvcm0sIGhpZGUgZm9ybSwgc2hvdyBhbnN3ZXJzIGluIHRhYmxlXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZXMgPSBGb3JtLmZldGNoQWxsUmVzcG9uc2VzKGV2ZW50KTtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBlbXB0eSByZXNwb25zZVxuICAgICAgICAgICAgaWYgKE9iamVjdC52YWx1ZXMocmVzcG9uc2VzKVswXSAhPSAnJyl7XG4gICAgICAgICAgICAgICAgLy8gY2hhbmdlIHBhZ2Ugdmlld1xuICAgICAgICAgICAgICAgIE1vZGFsLmhpZGUoKTtcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gYWRkIGRhdGEgdG8gdGFibGVcbiAgICAgICAgICAgICAgICBUYWJsZS5Sb3dzLmFkZChyZXNwb25zZXMpO1xuICAgICAgICAgICAgICAgIFRhYmxlLnNob3coKTtcbiAgICAgICAgICAgICAgICBUYWJsZS5CdXR0b25zLkFkZFJvdy5zaG93KCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogc2F2ZSB0YWJsZSBkYXRhXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogZWRpdCBjb3N0IHRvIHNob3cgY3VycmVuY3kgY29ycmVjdGx5XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pXG59XG4iLCJpbXBvcnQgeyB1cGRhdGVQYWdlU3RhdGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZGF0YV91dGlscy9sb2NhbF9zdG9yYWdlX2hhbmRsZXJzLmpzXCI7XG5pbXBvcnQgeyBwcmVwYXJlUGFnZVZpZXcsIGluaXRpYWxpemVQZXJzb25uZWxUYWJsZSwgc2V0VXBNb2RhbCwgc2V0VXBGb3JtIH0gZnJvbSBcIi4vaGVscGVycy5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbG9hZFBlcnNvbm5lbFBhZ2UoKXtcblxuICAgIHVwZGF0ZVBhZ2VTdGF0ZSgncGVyc29ubmVsJyk7XG4gICAgcHJlcGFyZVBhZ2VWaWV3KCk7XG4gICAgaW5pdGlhbGl6ZVBlcnNvbm5lbFRhYmxlKCk7XG5cbiAgICBzZXRVcE1vZGFsKCk7XG4gICAgc2V0VXBGb3JtKCk7XG59XG5cbiIsImltcG9ydCBQcm9tcHQgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzJ1xuaW1wb3J0IHsgdXBkYXRlUGFnZVN0YXRlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2RhdGFfdXRpbHMvbG9jYWxfc3RvcmFnZV9oYW5kbGVycy5qc1wiO1xuaW1wb3J0IEJvZHkgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9ib2R5L2JvZHkuanMnO1xuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5qcyc7XG5pbXBvcnQgU3VidGl0bGUgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9oZWFkZXIvaGVhZGVyLmpzJztcbmltcG9ydCBTaWRlYmFyIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvc2lkZWJhci9zaWRlYmFyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRPVFBhZ2UoKXtcbiAgICAvL3VwZGF0ZSBwYWdlIHN0YXRlXG4gICAgdXBkYXRlUGFnZVN0YXRlKCdvdmVydGltZScpO1xuXG4gICAgLy8gcHJlcGFyZSBwYWdlIHZpZXdcbiAgICBCb2R5LnJlc2V0KCk7XG4gICAgTmF2QnV0dG9ucy5zaG93KCk7XG4gICAgU2lkZWJhci5zaG93KCk7XG5cbiAgICAvLyBqdXN0IGVuYWJsZSBuZXh0IGZvciBub3dcbiAgICAvLyBUT0RPOiBvbmx5IGVuYWJsZSB3aGVuIGFsbCBpbmZvIGlzIGVudGVyZWRcbiAgICBOYXZCdXR0b25zLk5leHQuZW5hYmxlKCk7XG5cbiAgICAvLyB1cGRhdGUgcGFnZSB0ZXh0XG4gICAgU3VidGl0bGUudXBkYXRlKCdPdmVydGltZSBFc3RpbWF0ZXMnKTtcbiAgICAvLyBUT0RPOiB1cGRhdGUgdG8gbWFrZSBkeW5hbWljXG4gICAgUHJvbXB0LlRleHQudXBkYXRlKGBUaGlzIGlzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBPVCBlc3RpbWF0ZXMuYCk7XG59IiwiaW1wb3J0IFByb21wdCBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzXCI7XG5pbXBvcnQgU2lkZWJhciBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9zaWRlYmFyL3NpZGViYXIuanNcIjtcbmltcG9ydCBUYWJsZSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy90YWJsZS90YWJsZS5qc1wiO1xuaW1wb3J0IHsgREFUQV9ST09UIH0gZnJvbSBcIi4uLy4uL2luaXQuanNcIjtcbmltcG9ydCBCb2R5IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qc1wiO1xuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanNcIjtcbmltcG9ydCBTdWJ0aXRsZSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9oZWFkZXIvaGVhZGVyLmpzXCI7XG5pbXBvcnQgeyBkaXNwbGF5V2l0aENvbW1hcywgdW5mb3JtYXRDdXJyZW5jeSB9IGZyb20gXCIuLi8uLi91dGlscy9jb21tb25fdXRpbHMuanNcIjtcblxuY29uc3Qgbm9uUGVyc29ubmVsQ29sdW1ucyA9IFtcbiAgICB7IHRpdGxlOiAnRlkyNiBSZXF1ZXN0JywgY2xhc3NOYW1lOiAncmVxdWVzdCcsIGlzQ29zdDogdHJ1ZSB9LFxuICAgIHsgdGl0bGU6ICdBbW91bnQgUmVtYWluaW5nJywgY2xhc3NOYW1lOiAncmVtYWluaW5nJywgaXNDb3N0OiB0cnVlIH0sXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVBhZ2VWaWV3KCl7XG4gICAgLy8gcHJlcGFyZSBwYWdlIHZpZXdcbiAgICBCb2R5LnJlc2V0KCk7XG4gICAgTmF2QnV0dG9ucy5zaG93KCk7XG4gICAgU2lkZWJhci5zaG93KCk7XG4gICAgVGFibGUuYWRqdXN0V2lkdGgoJzEwMCUnKTtcbiAgICAvLyB1cGRhdGUgcGFnZSB0ZXh0XG4gICAgU3VidGl0bGUudXBkYXRlKCdOb24tUGVyc29ubmVsJyk7XG4gICAgUHJvbXB0LlRleHQudXBkYXRlKCdTZWxlY3QgYW4gYWN0aW9uIGl0ZW0gZm9yIGVhY2ggbm9uLXBlcnNvbm5lbCBsaW5lIGl0ZW0gZnJvbSBsYXN0IHllYXIuJyk7XG5cbiAgICAvLyBqdXN0IGVuYWJsZSBuZXh0IGZvciBub3dcbiAgICAvLyBUT0RPOiBvbmx5IGVuYWJsZSB3aGVuIGFsbCBpbmZvIGlzIGVudGVyZWRcbiAgICBOYXZCdXR0b25zLk5leHQuZW5hYmxlKCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplTm9ucGVyc29ubmVsVGFibGUoKXtcbiAgICAvLyBsb2FkIHRhYmxlIGRhdGEgZnJvbSBqc29uXG4gICAgYXdhaXQgVGFibGUuRGF0YS5sb2FkRnJvbUpTT04oREFUQV9ST09UICsgJ25vbnBlcnNvbm5lbF9kYXRhLmpzb24nLCAnbWFpbi10YWJsZScpO1xuICAgIC8vYWZ0ZXIgdGFibGUgaXMgbG9hZGVkLCBmaWxsIGl0XG4gICAgVGFibGUuc2hvdygpO1xuICAgIFRhYmxlLkNvbHVtbnMuYWRkQXRFbmQoVGFibGUuQnV0dG9ucy5lZGl0X2NvbmZpcm1fYnRucywgXCIgXCIpO1xuICAgIC8vIGFzc2lnbiBjb3N0IGNsYXNzZXNcbiAgICBUYWJsZS5Db2x1bW5zLmFzc2lnbkNsYXNzZXMobm9uUGVyc29ubmVsQ29sdW1ucyk7XG4gICAgLy8gdXBkYXRlIHNpZGViYXJcbiAgICB1cGRhdGVEaXNwbGF5YW5kVG90YWxzKCk7XG4gICAgLy8gZW5hYmxlIGVkaXRpbmdcbiAgICBUYWJsZS5CdXR0b25zLkVkaXQuaW5pdChub25QZXJzb25uZWxSb3dPbkVkaXQsIHVwZGF0ZURpc3BsYXlhbmRUb3RhbHMpO1xufVxuXG5mdW5jdGlvbiBub25QZXJzb25uZWxSb3dPbkVkaXQoKXtcbiAgICAvLyBjb252ZXJ0IHJlcXVlc3QgdG8gbnVtZXJpYyBmcm9tIGZvcm1hdHRlZCBjdXJyZW5jeVxuICAgIGNvbnN0IHJlcXVlc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYWN0aXZlLWVkaXRpbmcgPiB0ZC5yZXF1ZXN0Jyk7XG4gICAgcmVxdWVzdC50ZXh0Q29udGVudCA9IHJlcXVlc3QudGV4dENvbnRlbnQucmVwbGFjZSgnJCcsICcnKTtcbiAgICAvLyBtYWtlIGl0IGVkaXRhYmxlXG4gICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdyZXF1ZXN0Jyk7XG59XG5cbi8vIHVwZGF0ZSBzaWRlYmFyIGFuZCBhbHNvIGNvc3QgdG90YWxzIHdoZW4gdGhlIEZURXMgYXJlIGVkaXRlZFxuZnVuY3Rpb24gdXBkYXRlRGlzcGxheWFuZFRvdGFscygpe1xuICAgIC8vIGluaXRpYWxpemVcbiAgICBTaWRlYmFyLnVwZGF0ZVN0YXQoJ2Jhc2VsaW5lLW5vbnBlcnNvbm5lbCcsIDApO1xuICAgIC8vIGNhbGN1bGF0ZSBmb3IgZWFjaCByb3dcbiAgICBsZXQgcm93cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0cicpO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcm93cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIC8vIGZldGNoIHZhbHVlcyBmb3IgY2FsY3VsYXRpb25zXG4gICAgICAgIGxldCByZXF1ZXN0ID0gIFRhYmxlLkNlbGwuZ2V0VmFsdWUocm93c1tpXSwgJ3JlcXVlc3QnKTtcbiAgICAgICAgXG4gICAgICAgIC8vIHVwZGF0ZSBjb3VudGVyc1xuICAgICAgICBTaWRlYmFyLmluY3JlbWVudFN0YXQoJ2Jhc2VsaW5lLW5vbnBlcnNvbm5lbCcsIHJlcXVlc3QpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHVwZGF0ZVBhZ2VTdGF0ZSB9IGZyb20gXCIuLi8uLi91dGlscy9kYXRhX3V0aWxzL2xvY2FsX3N0b3JhZ2VfaGFuZGxlcnMuanNcIjtcbmltcG9ydCB7IHByZXBhcmVQYWdlVmlldywgaW5pdGlhbGl6ZU5vbnBlcnNvbm5lbFRhYmxlIH0gZnJvbSBcIi4uLzA1X25vbnBlcnNvbm5lbC9oZWxwZXJzLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTm9ucGVyc29ubmVsUGFnZSgpe1xuXG4gICAgdXBkYXRlUGFnZVN0YXRlKCdub25wZXJzb25uZWwnKTtcbiAgICBwcmVwYXJlUGFnZVZpZXcoKTtcbiAgICBpbml0aWFsaXplTm9ucGVyc29ubmVsVGFibGUoKVxufVxuIiwiaW1wb3J0IHsgaW5pdGlhbGl6ZVdlbGNvbWVQYWdlIH0gZnJvbSAnLi8wMF93ZWxjb21lL21haW4uanMnO1xuaW1wb3J0IHsgY2xlYW5VcEluaXRpYXRpdmVzUGFnZSwgbG9hZE5ld0luaXRpYXRpdmVzIH0gZnJvbSAnLi8wNl9uZXdfaW5pdGlhdGl2ZXMvbWFpbi5qcydcbmltcG9ydCB7IGxvYWRSZXZlbnVlUGFnZSwgY2xlYW51cFJldmVudWVQYWdlIH0gZnJvbSAnLi8wM19yZXZlbnVlL21haW4uanMnXG5pbXBvcnQgeyBsb2FkUGVyc29ubmVsUGFnZSB9IGZyb20gJy4vMDRfcGVyc29ubmVsL21haW4uanMnO1xuaW1wb3J0IHsgbG9hZE9UUGFnZSB9IGZyb20gJy4vMDQuNV9PVC9tYWluLmpzJztcbmltcG9ydCB7IGxvYWROb25wZXJzb25uZWxQYWdlIH0gZnJvbSAnLi8wNV9ub25wZXJzb25uZWwvbWFpbi5qcyc7XG5pbXBvcnQgeyBsb2FkQmFzZWxpbmVMYW5kaW5nUGFnZSB9IGZyb20gJy4vMDJfYmFzZWxpbmVfbGFuZGluZ19wYWdlL21haW4uanMnO1xuaW1wb3J0IHsgY2xlYW5VcFN1bW1hcnlQYWdlLCBsb2FkU3VtbWFyeVBhZ2UgfSBmcm9tICcuLzA3X3N1bW1hcnkvbWFpbi5qcyc7XG5pbXBvcnQgeyBsb2FkVXBsb2FkUGFnZSB9IGZyb20gJy4vMDFfdXBsb2FkL21haW4uanMnO1xuaW1wb3J0IHsgcGF1c2VFeGVjdXRpb24gfSBmcm9tICcuLi91dGlscy9jb21tb25fdXRpbHMuanMnO1xuXG5pbXBvcnQgeyBsb2FkUGFnZVN0YXRlIH0gZnJvbSAnLi4vdXRpbHMvZGF0YV91dGlscy9sb2NhbF9zdG9yYWdlX2hhbmRsZXJzLmpzJztcblxuZXhwb3J0IGxldCBQQUdFUyA9IHtcbiAgICAnd2VsY29tZScgOiBpbml0aWFsaXplV2VsY29tZVBhZ2UsXG4gICAgJ3VwbG9hZCcgOiBsb2FkVXBsb2FkUGFnZSxcbiAgICAnYmFzZWxpbmUtbGFuZGluZycgOiBsb2FkQmFzZWxpbmVMYW5kaW5nUGFnZSxcbiAgICAncmV2ZW51ZScgOiBsb2FkUmV2ZW51ZVBhZ2UsXG4gICAgJ3BlcnNvbm5lbCcgOiBsb2FkUGVyc29ubmVsUGFnZSxcbiAgICAnb3ZlcnRpbWUnIDogbG9hZE9UUGFnZSxcbiAgICAnbm9ucGVyc29ubmVsJyA6IGxvYWROb25wZXJzb25uZWxQYWdlLFxuICAgICduZXctaW5pdHMnIDogbG9hZE5ld0luaXRpYXRpdmVzLFxuICAgICdzdW1tYXJ5JyA6IGxvYWRTdW1tYXJ5UGFnZSBcbn1cblxuZXhwb3J0IGxldCBDTEVBTlVQID0ge1xuICAgICduZXctaW5pdHMnIDogY2xlYW5VcEluaXRpYXRpdmVzUGFnZSxcbiAgICAncmV2ZW51ZScgOiBjbGVhbnVwUmV2ZW51ZVBhZ2UsXG4gICAgJ3N1bW1hcnknIDogY2xlYW5VcFN1bW1hcnlQYWdlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFBhZ2UobmV3X3BhZ2Vfa2V5KXtcbiAgICAvLyBjbGVhbiB1cCBmcm9tIGN1cnJlbnQgcGFnZVxuICAgIHZhciBwYWdlX3N0YXRlID0gbG9hZFBhZ2VTdGF0ZSgpO1xuICAgIGlmIChDTEVBTlVQW3BhZ2Vfc3RhdGVdKSB7IENMRUFOVVBbcGFnZV9zdGF0ZV0oKSB9O1xuICAgIC8vIFVzZSB0aGUgcGFnZV9zdGF0ZSB0byBhY2Nlc3MgYW5kIGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gZnJvbSBQQUdFU1xuICAgIGlmIChQQUdFU1tuZXdfcGFnZV9rZXldKSB7XG4gICAgICAgIFBBR0VTW25ld19wYWdlX2tleV0oKTsgLy8gSW52b2tlcyB0aGUgZnVuY3Rpb24gaWYgaXQgZXhpc3RzIGluIHRoZSBQQUdFUyBtYXBcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBObyBwYWdlIGluaXRpYWxpemVyIGZvdW5kIGZvciBzdGF0ZTogJHtuZXdfcGFnZV9rZXl9YCk7XG4gICAgfVxuICAgIFBBR0VTW25ld19wYWdlX2tleV0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5leHRQYWdlKCl7XG5cbiAgICB2YXIgcGFnZV9zdGF0ZSA9IGxvYWRQYWdlU3RhdGUoKTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoUEFHRVMpO1xuICBcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBrZXlcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSBrZXlzLmluZGV4T2YocGFnZV9zdGF0ZSk7XG5cbiAgICAvLyBjbGVhbiB1cCBjdXJyZW50IHBhZ2VcbiAgICBpZiAoQ0xFQU5VUFtwYWdlX3N0YXRlXSkgeyBDTEVBTlVQW3BhZ2Vfc3RhdGVdKCkgfTtcbiAgICBcbiAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIG5leHQga2V5XG4gICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwICYmIGN1cnJlbnRJbmRleCA8IGtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAvLyBHZXQgdGhlIG5leHQga2V5XG4gICAgICAgIGNvbnN0IG5leHRLZXkgPSBrZXlzW2N1cnJlbnRJbmRleCArIDFdO1xuICAgICAgICAvLyBnbyB0byB0aGF0IHBhZ2VcbiAgICAgICAgdmlzaXRQYWdlKG5leHRLZXkpO1xuICAgIH0gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYXN0UGFnZSgpe1xuXG4gICAgdmFyIHBhZ2Vfc3RhdGUgPSBsb2FkUGFnZVN0YXRlKCk7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKFBBR0VTKTtcbiAgXG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQga2V5XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0ga2V5cy5pbmRleE9mKHBhZ2Vfc3RhdGUpO1xuXG4gICAgLy8gY2xlYW4gdXAgY3VycmVudCBwYWdlXG4gICAgaWYgKENMRUFOVVBbcGFnZV9zdGF0ZV0pIHsgQ0xFQU5VUFtwYWdlX3N0YXRlXSgpIH07XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBuZXh0IGtleVxuICAgIGlmIChjdXJyZW50SW5kZXggPj0gMSkge1xuICAgICAgICAvLyBHZXQgdGhlIG5leHQga2V5XG4gICAgICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2N1cnJlbnRJbmRleCAtIDFdO1xuICAgICAgICAvLyBnbyB0byB0aGF0IHBhZ2VcbiAgICAgICAgdmlzaXRQYWdlKGxhc3RLZXkpO1xuICAgIH0gXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXVzZUFuZENvbnRpbnVlKCl7XG4gICAgYXdhaXQgcGF1c2VFeGVjdXRpb24oMC41KTtcbiAgICBuZXh0UGFnZSgpO1xufSIsIi8vIGltcG9ydCBzdHlsZXNcbmltcG9ydCAnLi4vY3NzL2NvbW1vbi5jc3MnO1xuXG4vLyBpbXBvcnQgZnVuY3Rpb25zXG5pbXBvcnQgeyBsb2FkUGFnZVN0YXRlIH0gZnJvbSAnLi91dGlscy9kYXRhX3V0aWxzL2xvY2FsX3N0b3JhZ2VfaGFuZGxlcnMuanMnXG5pbXBvcnQgeyB2aXNpdFBhZ2UgfSBmcm9tICcuL3ZpZXdzL3ZpZXdfbG9naWMuanMnXG5cbi8vIHBhdGggZm9yIG15IGxhcHRvcFxuLy8gZXhwb3J0IGxldCBEQVRBX1JPT1QgPSAnLi4vLi4vLi4vZGF0YS9sYXdfZGVwdF9zYW1wbGUvJ1xuLy8gZ2l0aHViIHBhdGhcbmV4cG9ydCBsZXQgREFUQV9ST09UID0gJy4uLy4uL2J1ZGdldC1yZXF1ZXN0LWRlbW8vZGF0YS9sYXdfZGVwdF9zYW1wbGUvJ1xuXG5leHBvcnQgbGV0IFJFVkVOVUUgPSAwO1xuZXhwb3J0IGxldCBUQVJHRVQgPSAyMDAwMDAwO1xuZXhwb3J0IHZhciBGSVNDQUxfWUVBUiA9ICcyNic7XG5cbi8vIHZhcmlhYmxlcyBvbiB0aGUgc2FsYXJ5IFxuZXhwb3J0IHZhciBmcmluZ2UgPSAwLjM2XG5leHBvcnQgdmFyIGNvbGEgPSAwLjAyXG5leHBvcnQgdmFyIG1lcml0ID0gMC4wMlxuXG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhZ2Vfc3RhdGUgPSBsb2FkUGFnZVN0YXRlKCk7XG4gICAgdmlzaXRQYWdlKHBhZ2Vfc3RhdGUpO1xufSk7XG5cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///496\n")},404:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:root {\n /* colors */\n --orange: #FB6523;\n --yellow: #D99733;\n --blue: #43748E;\n --lightBlue: #b7c9e2;\n --darkGray: #373A37;\n --lightGray: #F2F2F2;\n --white: #FBFDFB;\n --black: #212121;\n --green: #71BC78;\n --citygreen: #004445;\n --spiritgreen: #279989;\n --palegreen: #9FD5B3;\n --verypalegreen: #DFF5E3;\n --accentyellow: #feb70d;\n --nearblack: #18252a;\n /* fonts */\n font-family: \'Nunito\', sans-serif;\n font-size: 14px;\n /* spacing */\n --header-height : 125px;\n --sidebar-width: 250px;\n}\n\n/* Button styling */\n\n.btn {\n cursor: pointer;\n padding: 10px;\n margin-top: 5px;\n margin-right : 2px;\n margin-left: 2px;\n border-radius: 10px;\n background-color: gray;\n color: white; \n}\n\n/* Font application for all text */\nbody, button, input, textarea, select, .sidebar, table {\n font-family: var(--font-family), sans-serif;\n }\n\n#main-panel {\n /* display: flex; */\n /* flex-direction: column; */\n justify-content: center; /* This will center content vertically */\n min-height: calc(100vh - var(--header-height)) ; \n /* max-width: calc(100vw - var(--sidebar-width)); */\n padding-top: 25px;\n padding-bottom: 25px;\n margin: 0;\n}\n\ndiv.row {\n margin: 0px;\n}`, "",{"version":3,"sources":["webpack://./src/css/common.css"],"names":[],"mappings":"AAAA;IACI,WAAW;IACX,iBAAiB;IACjB,iBAAiB;IACjB,eAAe;IACf,oBAAoB;IACpB,mBAAmB;IACnB,oBAAoB;IACpB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,oBAAoB;IACpB,sBAAsB;IACtB,oBAAoB;IACpB,wBAAwB;IACxB,uBAAuB;IACvB,oBAAoB;IACpB,UAAU;IACV,iCAAiC;IACjC,eAAe;IACf,YAAY;IACZ,uBAAuB;IACvB,sBAAsB;AAC1B;;AAEA,mBAAmB;;AAEnB;IACI,eAAe;IACf,aAAa;IACb,eAAe;IACf,kBAAkB;IAClB,gBAAgB;IAChB,mBAAmB;IACnB,sBAAsB;IACtB,YAAY;AAChB;;AAEA,mCAAmC;AACnC;IACI,2CAA2C;EAC7C;;AAEF;IACI,mBAAmB;IACnB,4BAA4B;IAC5B,uBAAuB,EAAE,wCAAwC;IACjE,+CAA+C;IAC/C,oDAAoD;IACpD,iBAAiB;IACjB,oBAAoB;IACpB,SAAS;AACb;;AAEA;IACI,WAAW;AACf","sourcesContent":[":root {\\n /* colors */\\n --orange: #FB6523;\\n --yellow: #D99733;\\n --blue: #43748E;\\n --lightBlue: #b7c9e2;\\n --darkGray: #373A37;\\n --lightGray: #F2F2F2;\\n --white: #FBFDFB;\\n --black: #212121;\\n --green: #71BC78;\\n --citygreen: #004445;\\n --spiritgreen: #279989;\\n --palegreen: #9FD5B3;\\n --verypalegreen: #DFF5E3;\\n --accentyellow: #feb70d;\\n --nearblack: #18252a;\\n /* fonts */\\n font-family: \'Nunito\', sans-serif;\\n font-size: 14px;\\n /* spacing */\\n --header-height : 125px;\\n --sidebar-width: 250px;\\n}\\n\\n/* Button styling */\\n\\n.btn {\\n cursor: pointer;\\n padding: 10px;\\n margin-top: 5px;\\n margin-right : 2px;\\n margin-left: 2px;\\n border-radius: 10px;\\n background-color: gray;\\n color: white; \\n}\\n\\n/* Font application for all text */\\nbody, button, input, textarea, select, .sidebar, table {\\n font-family: var(--font-family), sans-serif;\\n }\\n\\n#main-panel {\\n /* display: flex; */\\n /* flex-direction: column; */\\n justify-content: center; /* This will center content vertically */\\n min-height: calc(100vh - var(--header-height)) ; \\n /* max-width: calc(100vw - var(--sidebar-width)); */\\n padding-top: 25px;\\n padding-bottom: 25px;\\n margin: 0;\\n}\\n\\ndiv.row {\\n margin: 0px;\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA0LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvY3NzL2NvbW1vbi5jc3M/ZjdjYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgOnJvb3Qge1xuICAgIC8qIGNvbG9ycyAqL1xuICAgIC0tb3JhbmdlOiAjRkI2NTIzO1xuICAgIC0teWVsbG93OiAjRDk5NzMzO1xuICAgIC0tYmx1ZTogIzQzNzQ4RTtcbiAgICAtLWxpZ2h0Qmx1ZTogI2I3YzllMjtcbiAgICAtLWRhcmtHcmF5OiAjMzczQTM3O1xuICAgIC0tbGlnaHRHcmF5OiAjRjJGMkYyO1xuICAgIC0td2hpdGU6ICNGQkZERkI7XG4gICAgLS1ibGFjazogIzIxMjEyMTtcbiAgICAtLWdyZWVuOiAjNzFCQzc4O1xuICAgIC0tY2l0eWdyZWVuOiAjMDA0NDQ1O1xuICAgIC0tc3Bpcml0Z3JlZW46ICMyNzk5ODk7XG4gICAgLS1wYWxlZ3JlZW46ICM5RkQ1QjM7XG4gICAgLS12ZXJ5cGFsZWdyZWVuOiAjREZGNUUzO1xuICAgIC0tYWNjZW50eWVsbG93OiAjZmViNzBkO1xuICAgIC0tbmVhcmJsYWNrOiAjMTgyNTJhO1xuICAgIC8qIGZvbnRzICovXG4gICAgZm9udC1mYW1pbHk6ICdOdW5pdG8nLCBzYW5zLXNlcmlmO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAvKiBzcGFjaW5nICovXG4gICAgLS1oZWFkZXItaGVpZ2h0IDogMTI1cHg7XG4gICAgLS1zaWRlYmFyLXdpZHRoOiAyNTBweDtcbn1cblxuLyogQnV0dG9uIHN0eWxpbmcgKi9cblxuLmJ0biB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgbWFyZ2luLXRvcDogNXB4O1xuICAgIG1hcmdpbi1yaWdodCA6IDJweDtcbiAgICBtYXJnaW4tbGVmdDogMnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcbiAgICBjb2xvcjogd2hpdGU7IFxufVxuXG4vKiBGb250IGFwcGxpY2F0aW9uIGZvciBhbGwgdGV4dCAgKi9cbmJvZHksIGJ1dHRvbiwgaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIC5zaWRlYmFyLCB0YWJsZSB7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5KSwgc2Fucy1zZXJpZjtcbiAgfVxuXG4jbWFpbi1wYW5lbCB7XG4gICAgLyogZGlzcGxheTogZmxleDsgKi9cbiAgICAvKiBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyAqL1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyAvKiBUaGlzIHdpbGwgY2VudGVyIGNvbnRlbnQgdmVydGljYWxseSAqL1xuICAgIG1pbi1oZWlnaHQ6IGNhbGMoMTAwdmggLSB2YXIoLS1oZWFkZXItaGVpZ2h0KSkgOyBcbiAgICAvKiBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSB2YXIoLS1zaWRlYmFyLXdpZHRoKSk7ICAqL1xuICAgIHBhZGRpbmctdG9wOiAyNXB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAyNXB4O1xuICAgIG1hcmdpbjogMDtcbn1cblxuZGl2LnJvdyB7XG4gICAgbWFyZ2luOiAwcHg7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY3NzL2NvbW1vbi5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxXQUFXO0lBQ1gsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLG1CQUFtQjtJQUNuQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIsd0JBQXdCO0lBQ3hCLHVCQUF1QjtJQUN2QixvQkFBb0I7SUFDcEIsVUFBVTtJQUNWLGlDQUFpQztJQUNqQyxlQUFlO0lBQ2YsWUFBWTtJQUNaLHVCQUF1QjtJQUN2QixzQkFBc0I7QUFDMUI7O0FBRUEsbUJBQW1COztBQUVuQjtJQUNJLGVBQWU7SUFDZixhQUFhO0lBQ2IsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLHNCQUFzQjtJQUN0QixZQUFZO0FBQ2hCOztBQUVBLG1DQUFtQztBQUNuQztJQUNJLDJDQUEyQztFQUM3Qzs7QUFFRjtJQUNJLG1CQUFtQjtJQUNuQiw0QkFBNEI7SUFDNUIsdUJBQXVCLEVBQUUsd0NBQXdDO0lBQ2pFLCtDQUErQztJQUMvQyxvREFBb0Q7SUFDcEQsaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQixTQUFTO0FBQ2I7O0FBRUE7SUFDSSxXQUFXO0FBQ2ZcIixcInNvdXJjZXNDb250ZW50XCI6W1wiOnJvb3Qge1xcbiAgICAvKiBjb2xvcnMgKi9cXG4gICAgLS1vcmFuZ2U6ICNGQjY1MjM7XFxuICAgIC0teWVsbG93OiAjRDk5NzMzO1xcbiAgICAtLWJsdWU6ICM0Mzc0OEU7XFxuICAgIC0tbGlnaHRCbHVlOiAjYjdjOWUyO1xcbiAgICAtLWRhcmtHcmF5OiAjMzczQTM3O1xcbiAgICAtLWxpZ2h0R3JheTogI0YyRjJGMjtcXG4gICAgLS13aGl0ZTogI0ZCRkRGQjtcXG4gICAgLS1ibGFjazogIzIxMjEyMTtcXG4gICAgLS1ncmVlbjogIzcxQkM3ODtcXG4gICAgLS1jaXR5Z3JlZW46ICMwMDQ0NDU7XFxuICAgIC0tc3Bpcml0Z3JlZW46ICMyNzk5ODk7XFxuICAgIC0tcGFsZWdyZWVuOiAjOUZENUIzO1xcbiAgICAtLXZlcnlwYWxlZ3JlZW46ICNERkY1RTM7XFxuICAgIC0tYWNjZW50eWVsbG93OiAjZmViNzBkO1xcbiAgICAtLW5lYXJibGFjazogIzE4MjUyYTtcXG4gICAgLyogZm9udHMgKi9cXG4gICAgZm9udC1mYW1pbHk6ICdOdW5pdG8nLCBzYW5zLXNlcmlmO1xcbiAgICBmb250LXNpemU6IDE0cHg7XFxuICAgIC8qIHNwYWNpbmcgKi9cXG4gICAgLS1oZWFkZXItaGVpZ2h0IDogMTI1cHg7XFxuICAgIC0tc2lkZWJhci13aWR0aDogMjUwcHg7XFxufVxcblxcbi8qIEJ1dHRvbiBzdHlsaW5nICovXFxuXFxuLmJ0biB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgcGFkZGluZzogMTBweDtcXG4gICAgbWFyZ2luLXRvcDogNXB4O1xcbiAgICBtYXJnaW4tcmlnaHQgOiAycHg7XFxuICAgIG1hcmdpbi1sZWZ0OiAycHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XFxuICAgIGNvbG9yOiB3aGl0ZTsgXFxufVxcblxcbi8qIEZvbnQgYXBwbGljYXRpb24gZm9yIGFsbCB0ZXh0ICAqL1xcbmJvZHksIGJ1dHRvbiwgaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIC5zaWRlYmFyLCB0YWJsZSB7XFxuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseSksIHNhbnMtc2VyaWY7XFxuICB9XFxuXFxuI21haW4tcGFuZWwge1xcbiAgICAvKiBkaXNwbGF5OiBmbGV4OyAqL1xcbiAgICAvKiBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyAqL1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgLyogVGhpcyB3aWxsIGNlbnRlciBjb250ZW50IHZlcnRpY2FsbHkgKi9cXG4gICAgbWluLWhlaWdodDogY2FsYygxMDB2aCAtIHZhcigtLWhlYWRlci1oZWlnaHQpKSA7IFxcbiAgICAvKiBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSB2YXIoLS1zaWRlYmFyLXdpZHRoKSk7ICAqL1xcbiAgICBwYWRkaW5nLXRvcDogMjVweDtcXG4gICAgcGFkZGluZy1ib3R0b206IDI1cHg7XFxuICAgIG1hcmdpbjogMDtcXG59XFxuXFxuZGl2LnJvdyB7XFxuICAgIG1hcmdpbjogMHB4O1xcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///404\n')},9:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `body {\n background-color: var(--lightGray);\n margin: 0;\n}`, "",{"version":3,"sources":["webpack://./src/js/components/body/body.css"],"names":[],"mappings":"AAAA;IACI,kCAAkC;IAClC,SAAS;AACb","sourcesContent":["body {\\n background-color: var(--lightGray);\\n margin: 0;\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9ib2R5L2JvZHkuY3NzPzM2ZTAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYGJvZHkge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0R3JheSk7XG4gICAgbWFyZ2luOiAwO1xufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvYm9keS9ib2R5LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGtDQUFrQztJQUNsQyxTQUFTO0FBQ2JcIixcInNvdXJjZXNDb250ZW50XCI6W1wiYm9keSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0R3JheSk7XFxuICAgIG1hcmdpbjogMDtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9\n')},109:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `textarea {height: 100px; width: 100%;}\n\ntextarea, input {\n margin-bottom: 20px;\n}\n\n.btn-submit {\n margin-top: 20px;\n width: 60%;\n margin-left: 20%;\n background-color: var(--spiritgreen);\n}`, "",{"version":3,"sources":["webpack://./src/js/components/form/form.css"],"names":[],"mappings":"AAAA,UAAU,aAAa,EAAE,WAAW,CAAC;;AAErC;IACI,mBAAmB;AACvB;;AAEA;IACI,gBAAgB;IAChB,UAAU;IACV,gBAAgB;IAChB,oCAAoC;AACxC","sourcesContent":["textarea {height: 100px; width: 100%;}\\n\\ntextarea, input {\\n margin-bottom: 20px;\\n}\\n\\n.btn-submit {\\n margin-top: 20px;\\n width: 60%;\\n margin-left: 20%;\\n background-color: var(--spiritgreen);\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL2Zvcm0uY3NzP2UzOGEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYHRleHRhcmVhIHtoZWlnaHQ6IDEwMHB4OyB3aWR0aDogMTAwJTt9XG5cbnRleHRhcmVhLCBpbnB1dCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cblxuLmJ0bi1zdWJtaXQge1xuICAgIG1hcmdpbi10b3A6IDIwcHg7XG4gICAgd2lkdGg6IDYwJTtcbiAgICBtYXJnaW4tbGVmdDogMjAlO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9qcy9jb21wb25lbnRzL2Zvcm0vZm9ybS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsVUFBVSxhQUFhLEVBQUUsV0FBVyxDQUFDOztBQUVyQztJQUNJLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixVQUFVO0lBQ1YsZ0JBQWdCO0lBQ2hCLG9DQUFvQztBQUN4Q1wiLFwic291cmNlc0NvbnRlbnRcIjpbXCJ0ZXh0YXJlYSB7aGVpZ2h0OiAxMDBweDsgd2lkdGg6IDEwMCU7fVxcblxcbnRleHRhcmVhLCBpbnB1dCB7XFxuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxufVxcblxcbi5idG4tc3VibWl0IHtcXG4gICAgbWFyZ2luLXRvcDogMjBweDtcXG4gICAgd2lkdGg6IDYwJTtcXG4gICAgbWFyZ2luLWxlZnQ6IDIwJTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///109\n')},107:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `\nh1 {\n text-align: center;\n}\n\nh2 {\n color: var(--darkGray);\n text-align: center;\n}\n\nheader {\n align-items: center;\n background-color: white;\n padding: 5px;\n border-bottom: 1px solid var(--citygreen); \n /* border: 1px solid var(--citygreen); */\n height: var(--header-height);\n /* width: calc(100vw - var(--sidebar-width)); */\n padding-left: 20px;\n}\n\n/* Logo styling */\n#logo {\n height: 50px; /* Or your desired size */\n margin-right: 20px; /* Optional: space between logo and title */\n margin-bottom: -50px;\n margin-top: 20px;\n}`, "",{"version":3,"sources":["webpack://./src/js/components/header/header.css"],"names":[],"mappings":";AACA;IACI,kBAAkB;AACtB;;AAEA;IACI,sBAAsB;IACtB,kBAAkB;AACtB;;AAEA;IACI,mBAAmB;IACnB,uBAAuB;IACvB,YAAY;IACZ,yCAAyC;IACzC,yCAAyC;IACzC,4BAA4B;IAC5B,+CAA+C;IAC/C,kBAAkB;AACtB;;AAEA,iBAAiB;AACjB;IACI,YAAY,EAAE,yBAAyB;IACvC,kBAAkB,EAAE,2CAA2C;IAC/D,oBAAoB;IACpB,gBAAgB;AACpB","sourcesContent":["\\nh1 {\\n text-align: center;\\n}\\n\\nh2 {\\n color: var(--darkGray);\\n text-align: center;\\n}\\n\\nheader {\\n align-items: center;\\n background-color: white;\\n padding: 5px;\\n border-bottom: 1px solid var(--citygreen); \\n /* border: 1px solid var(--citygreen); */\\n height: var(--header-height);\\n /* width: calc(100vw - var(--sidebar-width)); */\\n padding-left: 20px;\\n}\\n\\n/* Logo styling */\\n#logo {\\n height: 50px; /* Or your desired size */\\n margin-right: 20px; /* Optional: space between logo and title */\\n margin-bottom: -50px;\\n margin-top: 20px;\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA3LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuY3NzPzJmNGMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYFxuaDEge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuaDIge1xuICAgIGNvbG9yOiB2YXIoLS1kYXJrR3JheSk7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG5oZWFkZXIge1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgcGFkZGluZzogNXB4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pOyBcbiAgICAvKiBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pOyAgKi9cbiAgICBoZWlnaHQ6IHZhcigtLWhlYWRlci1oZWlnaHQpO1xuICAgIC8qIHdpZHRoOiBjYWxjKDEwMHZ3IC0gdmFyKC0tc2lkZWJhci13aWR0aCkpOyAqL1xuICAgIHBhZGRpbmctbGVmdDogMjBweDtcbn1cblxuLyogTG9nbyBzdHlsaW5nICovXG4jbG9nbyB7XG4gICAgaGVpZ2h0OiA1MHB4OyAvKiBPciB5b3VyIGRlc2lyZWQgc2l6ZSAqL1xuICAgIG1hcmdpbi1yaWdodDogMjBweDsgLyogT3B0aW9uYWw6IHNwYWNlIGJldHdlZW4gbG9nbyBhbmQgdGl0bGUgKi9cbiAgICBtYXJnaW4tYm90dG9tOiAtNTBweDtcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQUNBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksc0JBQXNCO0lBQ3RCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLG1CQUFtQjtJQUNuQix1QkFBdUI7SUFDdkIsWUFBWTtJQUNaLHlDQUF5QztJQUN6Qyx5Q0FBeUM7SUFDekMsNEJBQTRCO0lBQzVCLCtDQUErQztJQUMvQyxrQkFBa0I7QUFDdEI7O0FBRUEsaUJBQWlCO0FBQ2pCO0lBQ0ksWUFBWSxFQUFFLHlCQUF5QjtJQUN2QyxrQkFBa0IsRUFBRSwyQ0FBMkM7SUFDL0Qsb0JBQW9CO0lBQ3BCLGdCQUFnQjtBQUNwQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJcXG5oMSB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuXFxuaDIge1xcbiAgICBjb2xvcjogdmFyKC0tZGFya0dyYXkpO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcblxcbmhlYWRlciB7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICBwYWRkaW5nOiA1cHg7XFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pOyBcXG4gICAgLyogYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY2l0eWdyZWVuKTsgICovXFxuICAgIGhlaWdodDogdmFyKC0taGVhZGVyLWhlaWdodCk7XFxuICAgIC8qIHdpZHRoOiBjYWxjKDEwMHZ3IC0gdmFyKC0tc2lkZWJhci13aWR0aCkpOyAqL1xcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XFxufVxcblxcbi8qIExvZ28gc3R5bGluZyAqL1xcbiNsb2dvIHtcXG4gICAgaGVpZ2h0OiA1MHB4OyAvKiBPciB5b3VyIGRlc2lyZWQgc2l6ZSAqL1xcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7IC8qIE9wdGlvbmFsOiBzcGFjZSBiZXR3ZWVuIGxvZ28gYW5kIHRpdGxlICovXFxuICAgIG1hcmdpbi1ib3R0b206IC01MHB4O1xcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///107\n')},95:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, ``, "",{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvbW9kYWwvbW9kYWwuY3NzPzZhY2QiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYGAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///95\n')},595:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#nav-btns {\n margin: 20px;\n text-align: center;\n /* margin-top: 100px; */\n /* position: absolute; or \'absolute\' depending on use-case */\n /* top: 100px; Distance from the top of the viewport or the closest positioned ancestor */\n}\n\n#btn-next, #btn-last {\n background-color: var(--darkGray);\n}\n\n#btn-next:hover, #btn-last:hover {\n background-color: var(--yellow);\n color: var(--darkGray);\n}\n\n/* Add style for when you cannot click the next button */\n#btn-next.disabled, #btn-last.disabled,\n#btn-next.disabled:hover, #btn-last.disabled:hover {\n background-color: gray;\n color: white;\n pointer-events: none;\n}`, "",{"version":3,"sources":["webpack://./src/js/components/nav_buttons/nav_buttons.css"],"names":[],"mappings":"AAAA;IACI,YAAY;IACZ,kBAAkB;IAClB,uBAAuB;IACvB,4DAA4D;IAC5D,yFAAyF;AAC7F;;AAEA;IACI,iCAAiC;AACrC;;AAEA;IACI,+BAA+B;IAC/B,sBAAsB;AAC1B;;AAEA,wDAAwD;AACxD;;IAEI,sBAAsB;IACtB,YAAY;IACZ,oBAAoB;AACxB","sourcesContent":["#nav-btns {\\n margin: 20px;\\n text-align: center;\\n /* margin-top: 100px; */\\n /* position: absolute; or \'absolute\' depending on use-case */\\n /* top: 100px; Distance from the top of the viewport or the closest positioned ancestor */\\n}\\n\\n#btn-next, #btn-last {\\n background-color: var(--darkGray);\\n}\\n\\n#btn-next:hover, #btn-last:hover {\\n background-color: var(--yellow);\\n color: var(--darkGray);\\n}\\n\\n/* Add style for when you cannot click the next button */\\n#btn-next.disabled, #btn-last.disabled,\\n#btn-next.disabled:hover, #btn-last.disabled:hover {\\n background-color: gray;\\n color: white;\\n pointer-events: none;\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5jc3M/OTA1ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgI25hdi1idG5zIHtcbiAgICBtYXJnaW46IDIwcHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIC8qIG1hcmdpbi10b3A6IDEwMHB4OyAqL1xuICAgIC8qIHBvc2l0aW9uOiBhYnNvbHV0ZTsgb3IgJ2Fic29sdXRlJyBkZXBlbmRpbmcgb24gdXNlLWNhc2UgKi9cbiAgICAvKiB0b3A6IDEwMHB4OyBEaXN0YW5jZSBmcm9tIHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0IG9yIHRoZSBjbG9zZXN0IHBvc2l0aW9uZWQgYW5jZXN0b3IgKi9cbn1cblxuI2J0bi1uZXh0LCAjYnRuLWxhc3Qge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcbn1cblxuI2J0bi1uZXh0OmhvdmVyLCAjYnRuLWxhc3Q6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXllbGxvdyk7XG4gICAgY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcbn1cblxuLyogQWRkIHN0eWxlIGZvciB3aGVuIHlvdSBjYW5ub3QgY2xpY2sgdGhlIG5leHQgYnV0dG9uICovXG4jYnRuLW5leHQuZGlzYWJsZWQsICNidG4tbGFzdC5kaXNhYmxlZCxcbiNidG4tbmV4dC5kaXNhYmxlZDpob3ZlciwgI2J0bi1sYXN0LmRpc2FibGVkOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5O1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9qcy9jb21wb25lbnRzL25hdl9idXR0b25zL25hdl9idXR0b25zLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsdUJBQXVCO0lBQ3ZCLDREQUE0RDtJQUM1RCx5RkFBeUY7QUFDN0Y7O0FBRUE7SUFDSSxpQ0FBaUM7QUFDckM7O0FBRUE7SUFDSSwrQkFBK0I7SUFDL0Isc0JBQXNCO0FBQzFCOztBQUVBLHdEQUF3RDtBQUN4RDs7SUFFSSxzQkFBc0I7SUFDdEIsWUFBWTtJQUNaLG9CQUFvQjtBQUN4QlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIjbmF2LWJ0bnMge1xcbiAgICBtYXJnaW46IDIwcHg7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgLyogbWFyZ2luLXRvcDogMTAwcHg7ICovXFxuICAgIC8qIHBvc2l0aW9uOiBhYnNvbHV0ZTsgb3IgJ2Fic29sdXRlJyBkZXBlbmRpbmcgb24gdXNlLWNhc2UgKi9cXG4gICAgLyogdG9wOiAxMDBweDsgRGlzdGFuY2UgZnJvbSB0aGUgdG9wIG9mIHRoZSB2aWV3cG9ydCBvciB0aGUgY2xvc2VzdCBwb3NpdGlvbmVkIGFuY2VzdG9yICovXFxufVxcblxcbiNidG4tbmV4dCwgI2J0bi1sYXN0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGFya0dyYXkpO1xcbn1cXG5cXG4jYnRuLW5leHQ6aG92ZXIsICNidG4tbGFzdDpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXllbGxvdyk7XFxuICAgIGNvbG9yOiB2YXIoLS1kYXJrR3JheSk7XFxufVxcblxcbi8qIEFkZCBzdHlsZSBmb3Igd2hlbiB5b3UgY2Fubm90IGNsaWNrIHRoZSBuZXh0IGJ1dHRvbiAqL1xcbiNidG4tbmV4dC5kaXNhYmxlZCwgI2J0bi1sYXN0LmRpc2FibGVkLFxcbiNidG4tbmV4dC5kaXNhYmxlZDpob3ZlciwgI2J0bi1sYXN0LmRpc2FibGVkOmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcXG4gICAgY29sb3I6IHdoaXRlO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///595\n')},225:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#prompt-div {\n display: none;\n text-align: center;\n width: 80%;\n margin: auto;\n}\n\nh3#prompt {\n text-align: center;\n font-size : 1.5em;\n}\n\n#option1, #option2 { \n font-size: 1.5em;\n border-color: var(--citygreen); \n border-width: 2px;\n background-color: var(--white);\n color: var(--citygreen);\n}\n\n#option1:hover, #option2:hover { \n background-color: var(--spiritgreen);\n color: white;\n}\n\n#option2.clicked, #option1.clicked {\n font-weight: bold;\n background-color: var(--spiritgreen);\n color: white;\n border-width: 3;\n}\n`, "",{"version":3,"sources":["webpack://./src/js/components/prompt/prompt.css"],"names":[],"mappings":"AAAA;IACI,aAAa;IACb,kBAAkB;IAClB,UAAU;IACV,YAAY;AAChB;;AAEA;IACI,kBAAkB;IAClB,iBAAiB;AACrB;;AAEA;IACI,gBAAgB;IAChB,8BAA8B;IAC9B,iBAAiB;IACjB,8BAA8B;IAC9B,uBAAuB;AAC3B;;AAEA;IACI,oCAAoC;IACpC,YAAY;AAChB;;AAEA;IACI,iBAAiB;IACjB,oCAAoC;IACpC,YAAY;IACZ,eAAe;AACnB","sourcesContent":["#prompt-div {\\n display: none;\\n text-align: center;\\n width: 80%;\\n margin: auto;\\n}\\n\\nh3#prompt {\\n text-align: center;\\n font-size : 1.5em;\\n}\\n\\n#option1, #option2 { \\n font-size: 1.5em;\\n border-color: var(--citygreen); \\n border-width: 2px;\\n background-color: var(--white);\\n color: var(--citygreen);\\n}\\n\\n#option1:hover, #option2:hover { \\n background-color: var(--spiritgreen);\\n color: white;\\n}\\n\\n#option2.clicked, #option1.clicked {\\n font-weight: bold;\\n background-color: var(--spiritgreen);\\n color: white;\\n border-width: 3;\\n}\\n"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5jc3M/ZTY5OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgI3Byb21wdC1kaXYge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHdpZHRoOiA4MCU7XG4gICAgbWFyZ2luOiBhdXRvO1xufVxuXG5oMyNwcm9tcHQge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBmb250LXNpemUgOiAxLjVlbTtcbn1cblxuI29wdGlvbjEsICNvcHRpb24yIHsgXG4gICAgZm9udC1zaXplOiAxLjVlbTtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNpdHlncmVlbik7IFxuICAgIGJvcmRlci13aWR0aDogMnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXdoaXRlKTtcbiAgICBjb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcbn1cblxuI29wdGlvbjE6aG92ZXIsICNvcHRpb24yOmhvdmVyIHsgXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xuICAgIGNvbG9yOiB3aGl0ZTtcbn1cblxuI29wdGlvbjIuY2xpY2tlZCwgI29wdGlvbjEuY2xpY2tlZCB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXItd2lkdGg6IDM7XG59XG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9qcy9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksYUFBYTtJQUNiLGtCQUFrQjtJQUNsQixVQUFVO0lBQ1YsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsOEJBQThCO0lBQzlCLGlCQUFpQjtJQUNqQiw4QkFBOEI7SUFDOUIsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksb0NBQW9DO0lBQ3BDLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsb0NBQW9DO0lBQ3BDLFlBQVk7SUFDWixlQUFlO0FBQ25CXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIiNwcm9tcHQtZGl2IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICB3aWR0aDogODAlO1xcbiAgICBtYXJnaW46IGF1dG87XFxufVxcblxcbmgzI3Byb21wdCB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgZm9udC1zaXplIDogMS41ZW07XFxufVxcblxcbiNvcHRpb24xLCAjb3B0aW9uMiB7IFxcbiAgICBmb250LXNpemU6IDEuNWVtO1xcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNpdHlncmVlbik7IFxcbiAgICBib3JkZXItd2lkdGg6IDJweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0td2hpdGUpO1xcbiAgICBjb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcXG59XFxuXFxuI29wdGlvbjE6aG92ZXIsICNvcHRpb24yOmhvdmVyIHsgXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXG4gICAgY29sb3I6IHdoaXRlO1xcbn1cXG5cXG4jb3B0aW9uMi5jbGlja2VkLCAjb3B0aW9uMS5jbGlja2VkIHtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXG4gICAgY29sb3I6IHdoaXRlO1xcbiAgICBib3JkZXItd2lkdGg6IDM7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///225\n')},263:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#sidebar-panel {\n background-color: lightgrey; \n /* min-height: 100vh; Full height of viewport */\n }\n\n#supp-total .stat {\n color: var(--yellow);\n}\n\n.stat {\n font-weight: bold;\n}\n\n#sidebar-panel {\n height: 100%; /* Full height of the viewport */\n position: fixed; /* Fixed Sidebar (stay in place on scroll) */\n z-index: 1; /* Stay on top */\n top: 0; /* Stay at the top */\n right: 0; /* Sidebar appears on the left */\n background-color: #FFFFFF; /* White background color */\n overflow-x: hidden; /* Disable horizontal scroll */\n padding: 20px;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Add shadow for some depth */\n border-right: 2px solid #DDDDDD; /* Right border */\n border-radius: 15px 0px 0px 15px; /* Rounded corners on the left */\n /* margin-top: var(--header-height); */\n width: var(--sidebar-width);\n margin: 0px;\n }\n \n.sidebar a {\n padding: 10px 15px;\n text-decoration: none;\n font-size: 18px;\n color: #818181;\n display: block;\n transition: 0.3s;\n}\n\n#sidebar-title {\n color: var(--darkGray);\n font-weight: bold;\n border-bottom: 1px solid var(--citygreen);\n}`, "",{"version":3,"sources":["webpack://./src/js/components/sidebar/sidebar.css"],"names":[],"mappings":"AAAA;IACI,2BAA2B;IAC3B,+CAA+C;EACjD;;AAEF;IACI,oBAAoB;AACxB;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,YAAY,EAAE,gCAAgC;IAC9C,eAAe,EAAE,4CAA4C;IAC7D,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,oBAAoB;IAC5B,QAAQ,EAAE,gCAAgC;IAC1C,yBAAyB,EAAE,2BAA2B;IACtD,kBAAkB,EAAE,8BAA8B;IAClD,aAAa;IACb,wCAAwC,EAAE,8BAA8B;IACxE,+BAA+B,EAAE,iBAAiB;IAClD,gCAAgC,EAAE,gCAAgC;IAClE,sCAAsC;IACtC,2BAA2B;IAC3B,WAAW;EACb;;AAEF;IACI,kBAAkB;IAClB,qBAAqB;IACrB,eAAe;IACf,cAAc;IACd,cAAc;IACd,gBAAgB;AACpB;;AAEA;EACE,sBAAsB;EACtB,iBAAiB;EACjB,yCAAyC;AAC3C","sourcesContent":["#sidebar-panel {\\n background-color: lightgrey; \\n /* min-height: 100vh; Full height of viewport */\\n }\\n\\n#supp-total .stat {\\n color: var(--yellow);\\n}\\n\\n.stat {\\n font-weight: bold;\\n}\\n\\n#sidebar-panel {\\n height: 100%; /* Full height of the viewport */\\n position: fixed; /* Fixed Sidebar (stay in place on scroll) */\\n z-index: 1; /* Stay on top */\\n top: 0; /* Stay at the top */\\n right: 0; /* Sidebar appears on the left */\\n background-color: #FFFFFF; /* White background color */\\n overflow-x: hidden; /* Disable horizontal scroll */\\n padding: 20px;\\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Add shadow for some depth */\\n border-right: 2px solid #DDDDDD; /* Right border */\\n border-radius: 15px 0px 0px 15px; /* Rounded corners on the left */\\n /* margin-top: var(--header-height); */\\n width: var(--sidebar-width);\\n margin: 0px;\\n }\\n \\n.sidebar a {\\n padding: 10px 15px;\\n text-decoration: none;\\n font-size: 18px;\\n color: #818181;\\n display: block;\\n transition: 0.3s;\\n}\\n\\n#sidebar-title {\\n color: var(--darkGray);\\n font-weight: bold;\\n border-bottom: 1px solid var(--citygreen);\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvc2lkZWJhci9zaWRlYmFyLmNzcz8zYjAzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAjc2lkZWJhci1wYW5lbCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmV5OyAgXG4gICAgLyogbWluLWhlaWdodDogMTAwdmg7IEZ1bGwgaGVpZ2h0IG9mIHZpZXdwb3J0ICovXG4gIH1cblxuI3N1cHAtdG90YWwgLnN0YXQge1xuICAgIGNvbG9yOiB2YXIoLS15ZWxsb3cpO1xufVxuXG4uc3RhdCB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbiNzaWRlYmFyLXBhbmVsIHtcbiAgICBoZWlnaHQ6IDEwMCU7IC8qIEZ1bGwgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCAqL1xuICAgIHBvc2l0aW9uOiBmaXhlZDsgLyogRml4ZWQgU2lkZWJhciAoc3RheSBpbiBwbGFjZSBvbiBzY3JvbGwpICovXG4gICAgei1pbmRleDogMTsgLyogU3RheSBvbiB0b3AgKi9cbiAgICB0b3A6IDA7IC8qIFN0YXkgYXQgdGhlIHRvcCAqL1xuICAgIHJpZ2h0OiAwOyAvKiBTaWRlYmFyIGFwcGVhcnMgb24gdGhlIGxlZnQgKi9cbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOyAvKiBXaGl0ZSBiYWNrZ3JvdW5kIGNvbG9yICovXG4gICAgb3ZlcmZsb3cteDogaGlkZGVuOyAvKiBEaXNhYmxlIGhvcml6b250YWwgc2Nyb2xsICovXG4gICAgcGFkZGluZzogMjBweDtcbiAgICBib3gtc2hhZG93OiAwIDJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEpOyAvKiBBZGQgc2hhZG93IGZvciBzb21lIGRlcHRoICovXG4gICAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgI0RERERERDsgLyogUmlnaHQgYm9yZGVyICovXG4gICAgYm9yZGVyLXJhZGl1czogMTVweCAwcHggMHB4IDE1cHg7IC8qIFJvdW5kZWQgY29ybmVycyBvbiB0aGUgbGVmdCAqL1xuICAgIC8qIG1hcmdpbi10b3A6IHZhcigtLWhlYWRlci1oZWlnaHQpOyAqL1xuICAgIHdpZHRoOiB2YXIoLS1zaWRlYmFyLXdpZHRoKTtcbiAgICBtYXJnaW46IDBweDtcbiAgfVxuICBcbi5zaWRlYmFyIGEge1xuICAgIHBhZGRpbmc6IDEwcHggMTVweDtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgZm9udC1zaXplOiAxOHB4O1xuICAgIGNvbG9yOiAjODE4MTgxO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHRyYW5zaXRpb246IDAuM3M7XG59XG5cbiNzaWRlYmFyLXRpdGxlIHtcbiAgY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pO1xufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvc2lkZWJhci9zaWRlYmFyLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLDJCQUEyQjtJQUMzQiwrQ0FBK0M7RUFDakQ7O0FBRUY7SUFDSSxvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxZQUFZLEVBQUUsZ0NBQWdDO0lBQzlDLGVBQWUsRUFBRSw0Q0FBNEM7SUFDN0QsVUFBVSxFQUFFLGdCQUFnQjtJQUM1QixNQUFNLEVBQUUsb0JBQW9CO0lBQzVCLFFBQVEsRUFBRSxnQ0FBZ0M7SUFDMUMseUJBQXlCLEVBQUUsMkJBQTJCO0lBQ3RELGtCQUFrQixFQUFFLDhCQUE4QjtJQUNsRCxhQUFhO0lBQ2Isd0NBQXdDLEVBQUUsOEJBQThCO0lBQ3hFLCtCQUErQixFQUFFLGlCQUFpQjtJQUNsRCxnQ0FBZ0MsRUFBRSxnQ0FBZ0M7SUFDbEUsc0NBQXNDO0lBQ3RDLDJCQUEyQjtJQUMzQixXQUFXO0VBQ2I7O0FBRUY7SUFDSSxrQkFBa0I7SUFDbEIscUJBQXFCO0lBQ3JCLGVBQWU7SUFDZixjQUFjO0lBQ2QsY0FBYztJQUNkLGdCQUFnQjtBQUNwQjs7QUFFQTtFQUNFLHNCQUFzQjtFQUN0QixpQkFBaUI7RUFDakIseUNBQXlDO0FBQzNDXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIiNzaWRlYmFyLXBhbmVsIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmV5OyAgXFxuICAgIC8qIG1pbi1oZWlnaHQ6IDEwMHZoOyBGdWxsIGhlaWdodCBvZiB2aWV3cG9ydCAqL1xcbiAgfVxcblxcbiNzdXBwLXRvdGFsIC5zdGF0IHtcXG4gICAgY29sb3I6IHZhcigtLXllbGxvdyk7XFxufVxcblxcbi5zdGF0IHtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxufVxcblxcbiNzaWRlYmFyLXBhbmVsIHtcXG4gICAgaGVpZ2h0OiAxMDAlOyAvKiBGdWxsIGhlaWdodCBvZiB0aGUgdmlld3BvcnQgKi9cXG4gICAgcG9zaXRpb246IGZpeGVkOyAvKiBGaXhlZCBTaWRlYmFyIChzdGF5IGluIHBsYWNlIG9uIHNjcm9sbCkgKi9cXG4gICAgei1pbmRleDogMTsgLyogU3RheSBvbiB0b3AgKi9cXG4gICAgdG9wOiAwOyAvKiBTdGF5IGF0IHRoZSB0b3AgKi9cXG4gICAgcmlnaHQ6IDA7IC8qIFNpZGViYXIgYXBwZWFycyBvbiB0aGUgbGVmdCAqL1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOyAvKiBXaGl0ZSBiYWNrZ3JvdW5kIGNvbG9yICovXFxuICAgIG92ZXJmbG93LXg6IGhpZGRlbjsgLyogRGlzYWJsZSBob3Jpem9udGFsIHNjcm9sbCAqL1xcbiAgICBwYWRkaW5nOiAyMHB4O1xcbiAgICBib3gtc2hhZG93OiAwIDJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEpOyAvKiBBZGQgc2hhZG93IGZvciBzb21lIGRlcHRoICovXFxuICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICNEREREREQ7IC8qIFJpZ2h0IGJvcmRlciAqL1xcbiAgICBib3JkZXItcmFkaXVzOiAxNXB4IDBweCAwcHggMTVweDsgLyogUm91bmRlZCBjb3JuZXJzIG9uIHRoZSBsZWZ0ICovXFxuICAgIC8qIG1hcmdpbi10b3A6IHZhcigtLWhlYWRlci1oZWlnaHQpOyAqL1xcbiAgICB3aWR0aDogdmFyKC0tc2lkZWJhci13aWR0aCk7XFxuICAgIG1hcmdpbjogMHB4O1xcbiAgfVxcbiAgXFxuLnNpZGViYXIgYSB7XFxuICAgIHBhZGRpbmc6IDEwcHggMTVweDtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgICBmb250LXNpemU6IDE4cHg7XFxuICAgIGNvbG9yOiAjODE4MTgxO1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG59XFxuXFxuI3NpZGViYXItdGl0bGUge1xcbiAgY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWNpdHlncmVlbik7XFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///263\n')},279:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `thead > tr > th {\n text-align: left;\n}\n\nth {\n background-color: var(--lightGray);\n}\n\ntr {\n border-width: 2px;\n background-color: white;\n}\n\ntr td {\n border-bottom: 1px solid black;\n}\n\n/* textbox width in table */\ninput {\n width: 100%;\n}\n\ndiv.table-container {\n display: table; \n overflow-x: auto; /* Scroll horizontally if the table content is wider than the container */\n overflow-y: auto;\n padding-left: max(100px, 10vh);\n padding-right: max(100px, 10vh);\n max-width: calc(100vw - var(--sidebar-width)); \n margin: auto;\n min-height: 120px;\n\n}\n \n#main-table {\n font-size: calc(0.6vw + 0.5em);\n margin: auto;\n}\n\n/* Add new row button */\n.btn-add { \n background-color: var(--spiritgreen);\n margin-top: 20px;\n display: none;\n}\n\n.btn-delete {\n background-color: var(--orange);\n}\n\n#add-btn-div {\n display: flex;\n justify-content: center; /* Aligns horizontally */\n align-items: center; /* Aligns vertically */\n width: 100%;\n}\n\n.btn-edit {\n background-color: var(--spiritgreen);\n}\n\n.active-editing, .selected {\n background-color: var(--palegreen);\n}\n\n.selected { \n font-weight: bold;\n}\n\n.btn-confirm {\n display: none;\n}\n\n.confirm-btn:hover {\n background-color: var(--green);\n}\n\n.hover-effect:hover {\n cursor: pointer;\n background-color: var(--verypalegreen); /* You can choose any color you like */\n}`, "",{"version":3,"sources":["webpack://./src/js/components/table/table.css"],"names":[],"mappings":"AAAA;IACI,gBAAgB;AACpB;;AAEA;IACI,kCAAkC;AACtC;;AAEA;IACI,iBAAiB;IACjB,uBAAuB;AAC3B;;AAEA;IACI,8BAA8B;AAClC;;AAEA,2BAA2B;AAC3B;IACI,WAAW;AACf;;AAEA;IACI,cAAc;IACd,gBAAgB,EAAE,yEAAyE;IAC3F,gBAAgB;IAChB,8BAA8B;IAC9B,+BAA+B;IAC/B,6CAA6C;IAC7C,YAAY;IACZ,iBAAiB;;AAErB;;AAEA;IACI,8BAA8B;IAC9B,YAAY;AAChB;;AAEA,uBAAuB;AACvB;IACI,oCAAoC;IACpC,gBAAgB;IAChB,aAAa;AACjB;;AAEA;IACI,+BAA+B;AACnC;;AAEA;IACI,aAAa;IACb,uBAAuB,EAAE,wBAAwB;IACjD,mBAAmB,EAAE,sBAAsB;IAC3C,WAAW;AACf;;AAEA;IACI,oCAAoC;AACxC;;AAEA;IACI,kCAAkC;AACtC;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,8BAA8B;AAClC;;AAEA;IACI,eAAe;IACf,sCAAsC,EAAE,sCAAsC;AAClF","sourcesContent":["thead > tr > th {\\n text-align: left;\\n}\\n\\nth {\\n background-color: var(--lightGray);\\n}\\n\\ntr {\\n border-width: 2px;\\n background-color: white;\\n}\\n\\ntr td {\\n border-bottom: 1px solid black;\\n}\\n\\n/* textbox width in table */\\ninput {\\n width: 100%;\\n}\\n\\ndiv.table-container {\\n display: table; \\n overflow-x: auto; /* Scroll horizontally if the table content is wider than the container */\\n overflow-y: auto;\\n padding-left: max(100px, 10vh);\\n padding-right: max(100px, 10vh);\\n max-width: calc(100vw - var(--sidebar-width)); \\n margin: auto;\\n min-height: 120px;\\n\\n}\\n \\n#main-table {\\n font-size: calc(0.6vw + 0.5em);\\n margin: auto;\\n}\\n\\n/* Add new row button */\\n.btn-add { \\n background-color: var(--spiritgreen);\\n margin-top: 20px;\\n display: none;\\n}\\n\\n.btn-delete {\\n background-color: var(--orange);\\n}\\n\\n#add-btn-div {\\n display: flex;\\n justify-content: center; /* Aligns horizontally */\\n align-items: center; /* Aligns vertically */\\n width: 100%;\\n}\\n\\n.btn-edit {\\n background-color: var(--spiritgreen);\\n}\\n\\n.active-editing, .selected {\\n background-color: var(--palegreen);\\n}\\n\\n.selected { \\n font-weight: bold;\\n}\\n\\n.btn-confirm {\\n display: none;\\n}\\n\\n.confirm-btn:hover {\\n background-color: var(--green);\\n}\\n\\n.hover-effect:hover {\\n cursor: pointer;\\n background-color: var(--verypalegreen); /* You can choose any color you like */\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS90YWJsZS5jc3M/NTIzNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgdGhlYWQgPiB0ciA+IHRoIHtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG50aCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHRHcmF5KTtcbn1cblxudHIge1xuICAgIGJvcmRlci13aWR0aDogMnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xufVxuXG50ciB0ZCB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1xufVxuXG4vKiB0ZXh0Ym94IHdpZHRoIGluIHRhYmxlICovXG5pbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbmRpdi50YWJsZS1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IHRhYmxlOyBcbiAgICBvdmVyZmxvdy14OiBhdXRvOyAvKiBTY3JvbGwgaG9yaXpvbnRhbGx5IGlmIHRoZSB0YWJsZSBjb250ZW50IGlzIHdpZGVyIHRoYW4gdGhlIGNvbnRhaW5lciAqL1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgcGFkZGluZy1sZWZ0OiBtYXgoMTAwcHgsIDEwdmgpO1xuICAgIHBhZGRpbmctcmlnaHQ6IG1heCgxMDBweCwgMTB2aCk7XG4gICAgbWF4LXdpZHRoOiBjYWxjKDEwMHZ3IC0gdmFyKC0tc2lkZWJhci13aWR0aCkpOyBcbiAgICBtYXJnaW46IGF1dG87XG4gICAgbWluLWhlaWdodDogMTIwcHg7XG5cbn1cbiAgXG4jbWFpbi10YWJsZSB7XG4gICAgZm9udC1zaXplOiBjYWxjKDAuNnZ3ICsgMC41ZW0pO1xuICAgIG1hcmdpbjogYXV0bztcbn1cblxuLyogQWRkIG5ldyByb3cgYnV0dG9uICovXG4uYnRuLWFkZCB7IFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5idG4tZGVsZXRlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1vcmFuZ2UpO1xufVxuXG4jYWRkLWJ0bi1kaXYge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IC8qIEFsaWducyBob3Jpem9udGFsbHkgKi9cbiAgICBhbGlnbi1pdGVtczogY2VudGVyOyAvKiBBbGlnbnMgdmVydGljYWxseSAqL1xuICAgIHdpZHRoOiAxMDAlO1xufVxuXG4uYnRuLWVkaXQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcbn1cblxuLmFjdGl2ZS1lZGl0aW5nLCAuc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhbGVncmVlbik7XG59XG5cbi5zZWxlY3RlZCB7IFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uYnRuLWNvbmZpcm0ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5jb25maXJtLWJ0bjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ3JlZW4pO1xufVxuXG4uaG92ZXItZWZmZWN0OmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdmVyeXBhbGVncmVlbik7IC8qIFlvdSBjYW4gY2hvb3NlIGFueSBjb2xvciB5b3UgbGlrZSAqL1xufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksa0NBQWtDO0FBQ3RDOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLDhCQUE4QjtBQUNsQzs7QUFFQSwyQkFBMkI7QUFDM0I7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxjQUFjO0lBQ2QsZ0JBQWdCLEVBQUUseUVBQXlFO0lBQzNGLGdCQUFnQjtJQUNoQiw4QkFBOEI7SUFDOUIsK0JBQStCO0lBQy9CLDZDQUE2QztJQUM3QyxZQUFZO0lBQ1osaUJBQWlCOztBQUVyQjs7QUFFQTtJQUNJLDhCQUE4QjtJQUM5QixZQUFZO0FBQ2hCOztBQUVBLHVCQUF1QjtBQUN2QjtJQUNJLG9DQUFvQztJQUNwQyxnQkFBZ0I7SUFDaEIsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLCtCQUErQjtBQUNuQzs7QUFFQTtJQUNJLGFBQWE7SUFDYix1QkFBdUIsRUFBRSx3QkFBd0I7SUFDakQsbUJBQW1CLEVBQUUsc0JBQXNCO0lBQzNDLFdBQVc7QUFDZjs7QUFFQTtJQUNJLG9DQUFvQztBQUN4Qzs7QUFFQTtJQUNJLGtDQUFrQztBQUN0Qzs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGFBQWE7QUFDakI7O0FBRUE7SUFDSSw4QkFBOEI7QUFDbEM7O0FBRUE7SUFDSSxlQUFlO0lBQ2Ysc0NBQXNDLEVBQUUsc0NBQXNDO0FBQ2xGXCIsXCJzb3VyY2VzQ29udGVudFwiOltcInRoZWFkID4gdHIgPiB0aCB7XFxuICAgIHRleHQtYWxpZ246IGxlZnQ7XFxufVxcblxcbnRoIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHRHcmF5KTtcXG59XFxuXFxudHIge1xcbiAgICBib3JkZXItd2lkdGg6IDJweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxufVxcblxcbnRyIHRkIHtcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1xcbn1cXG5cXG4vKiB0ZXh0Ym94IHdpZHRoIGluIHRhYmxlICovXFxuaW5wdXQge1xcbiAgICB3aWR0aDogMTAwJTtcXG59XFxuXFxuZGl2LnRhYmxlLWNvbnRhaW5lciB7XFxuICAgIGRpc3BsYXk6IHRhYmxlOyBcXG4gICAgb3ZlcmZsb3cteDogYXV0bzsgLyogU2Nyb2xsIGhvcml6b250YWxseSBpZiB0aGUgdGFibGUgY29udGVudCBpcyB3aWRlciB0aGFuIHRoZSBjb250YWluZXIgKi9cXG4gICAgb3ZlcmZsb3cteTogYXV0bztcXG4gICAgcGFkZGluZy1sZWZ0OiBtYXgoMTAwcHgsIDEwdmgpO1xcbiAgICBwYWRkaW5nLXJpZ2h0OiBtYXgoMTAwcHgsIDEwdmgpO1xcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSB2YXIoLS1zaWRlYmFyLXdpZHRoKSk7IFxcbiAgICBtYXJnaW46IGF1dG87XFxuICAgIG1pbi1oZWlnaHQ6IDEyMHB4O1xcblxcbn1cXG4gIFxcbiNtYWluLXRhYmxlIHtcXG4gICAgZm9udC1zaXplOiBjYWxjKDAuNnZ3ICsgMC41ZW0pO1xcbiAgICBtYXJnaW46IGF1dG87XFxufVxcblxcbi8qIEFkZCBuZXcgcm93IGJ1dHRvbiAqL1xcbi5idG4tYWRkIHsgXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXG4gICAgbWFyZ2luLXRvcDogMjBweDtcXG4gICAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLmJ0bi1kZWxldGUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1vcmFuZ2UpO1xcbn1cXG5cXG4jYWRkLWJ0bi1kaXYge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgLyogQWxpZ25zIGhvcml6b250YWxseSAqL1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyOyAvKiBBbGlnbnMgdmVydGljYWxseSAqL1xcbiAgICB3aWR0aDogMTAwJTtcXG59XFxuXFxuLmJ0bi1lZGl0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcbn1cXG5cXG4uYWN0aXZlLWVkaXRpbmcsIC5zZWxlY3RlZCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhbGVncmVlbik7XFxufVxcblxcbi5zZWxlY3RlZCB7IFxcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuXFxuLmJ0bi1jb25maXJtIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLmNvbmZpcm0tYnRuOmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ3JlZW4pO1xcbn1cXG5cXG4uaG92ZXItZWZmZWN0OmhvdmVyIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS12ZXJ5cGFsZWdyZWVuKTsgLyogWW91IGNhbiBjaG9vc2UgYW55IGNvbG9yIHlvdSBsaWtlICovXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///279\n')},235:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Welcome page (index.html) */\n\n.step {\n width: 60%;\n height: 80px;\n font-size: 1.75em;\n margin-bottom: 0px; /* Adds spacing between buttons */\n margin-left: 20%;\n border-color: var(--citygreen);\n border-width: 2;\n color: var(--citygreen);\n background-color: white;\n}\n\n.step:hover {\n color: white;\n background-color: var(--spiritgreen);\n}\n\n#welcome-page {\n justify-content: center; \n align-items: center; \n padding-top: 20px;\n}\n.step.disabled {\n opacity: 50%;\n}`, "",{"version":3,"sources":["webpack://./src/js/components/welcome/welcome.css"],"names":[],"mappings":"AAAA,8BAA8B;;AAE9B;IACI,UAAU;IACV,YAAY;IACZ,iBAAiB;IACjB,kBAAkB,EAAE,iCAAiC;IACrD,gBAAgB;IAChB,8BAA8B;IAC9B,eAAe;IACf,uBAAuB;IACvB,uBAAuB;AAC3B;;AAEA;IACI,YAAY;IACZ,oCAAoC;AACxC;;AAEA;IACI,uBAAuB;IACvB,mBAAmB;IACnB,iBAAiB;AACrB;AACA;IACI,YAAY;AAChB","sourcesContent":["/* Welcome page (index.html) */\\n\\n.step {\\n width: 60%;\\n height: 80px;\\n font-size: 1.75em;\\n margin-bottom: 0px; /* Adds spacing between buttons */\\n margin-left: 20%;\\n border-color: var(--citygreen);\\n border-width: 2;\\n color: var(--citygreen);\\n background-color: white;\\n}\\n\\n.step:hover {\\n color: white;\\n background-color: var(--spiritgreen);\\n}\\n\\n#welcome-page {\\n justify-content: center; \\n align-items: center; \\n padding-top: 20px;\\n}\\n.step.disabled {\\n opacity: 50%;\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuY3NzP2IzNDgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC8qIFdlbGNvbWUgcGFnZSAoaW5kZXguaHRtbCkgKi9cblxuLnN0ZXAge1xuICAgIHdpZHRoOiA2MCU7XG4gICAgaGVpZ2h0OiA4MHB4O1xuICAgIGZvbnQtc2l6ZTogMS43NWVtO1xuICAgIG1hcmdpbi1ib3R0b206IDBweDsgLyogQWRkcyBzcGFjaW5nIGJldHdlZW4gYnV0dG9ucyAqL1xuICAgIG1hcmdpbi1sZWZ0OiAyMCU7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xuICAgIGJvcmRlci13aWR0aDogMjtcbiAgICBjb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbn1cblxuLnN0ZXA6aG92ZXIge1xuICAgIGNvbG9yOiB3aGl0ZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XG59XG5cbiN3ZWxjb21lLXBhZ2Uge1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyBcbiAgICBhbGlnbi1pdGVtczogY2VudGVyOyBcbiAgICBwYWRkaW5nLXRvcDogMjBweDtcbn1cbi5zdGVwLmRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiA1MCU7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvanMvY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLDhCQUE4Qjs7QUFFOUI7SUFDSSxVQUFVO0lBQ1YsWUFBWTtJQUNaLGlCQUFpQjtJQUNqQixrQkFBa0IsRUFBRSxpQ0FBaUM7SUFDckQsZ0JBQWdCO0lBQ2hCLDhCQUE4QjtJQUM5QixlQUFlO0lBQ2YsdUJBQXVCO0lBQ3ZCLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLFlBQVk7SUFDWixvQ0FBb0M7QUFDeEM7O0FBRUE7SUFDSSx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLGlCQUFpQjtBQUNyQjtBQUNBO0lBQ0ksWUFBWTtBQUNoQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKiBXZWxjb21lIHBhZ2UgKGluZGV4Lmh0bWwpICovXFxuXFxuLnN0ZXAge1xcbiAgICB3aWR0aDogNjAlO1xcbiAgICBoZWlnaHQ6IDgwcHg7XFxuICAgIGZvbnQtc2l6ZTogMS43NWVtO1xcbiAgICBtYXJnaW4tYm90dG9tOiAwcHg7IC8qIEFkZHMgc3BhY2luZyBiZXR3ZWVuIGJ1dHRvbnMgKi9cXG4gICAgbWFyZ2luLWxlZnQ6IDIwJTtcXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xcbiAgICBib3JkZXItd2lkdGg6IDI7XFxuICAgIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG59XFxuXFxuLnN0ZXA6aG92ZXIge1xcbiAgICBjb2xvcjogd2hpdGU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXG59XFxuXFxuI3dlbGNvbWUtcGFnZSB7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyBcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjsgXFxuICAgIHBhZGRpbmctdG9wOiAyMHB4O1xcbn1cXG4uc3RlcC5kaXNhYmxlZCB7XFxuICAgIG9wYWNpdHk6IDUwJTtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///235\n')},314:module=>{eval('\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = "";\n var needLayer = typeof item[5] !== "undefined";\n if (item[4]) {\n content += "@supports (".concat(item[4], ") {");\n }\n if (item[2]) {\n content += "@media ".concat(item[2], " {");\n }\n if (needLayer) {\n content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += "}";\n }\n if (item[2]) {\n content += "}";\n }\n if (item[4]) {\n content += "}";\n }\n return content;\n }).join("");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === "string") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== "undefined") {\n if (typeof item[5] === "undefined") {\n item[5] = layer;\n } else {\n item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = "@media ".concat(item[2], " {").concat(item[1], "}");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = "".concat(supports);\n } else {\n item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanM/MjRmYiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTtcblxuICAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKTtcbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNba11bMF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBtb2R1bGVzLmxlbmd0aDsgX2srKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfa10pO1xuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZWRpYSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGxpc3Q7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///314\n')},354:module=>{eval('\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === "function") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);\n var sourceMapping = "/*# ".concat(data, " */");\n return [content].concat([sourceMapping]).join("\\n");\n }\n return [content].join("\\n");\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzP2FmMTIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///354\n')},72:module=>{eval('\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = "".concat(id, " ").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcz8yZGJhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///72\n')},659:module=>{eval('\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === "undefined") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error("Couldn\'t find a style target. This probably means that the value for the \'insert\' parameter is invalid.");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU5LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanM/YjIxNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///659\n')},540:module=>{eval('\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement("style");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQwLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcz9kZTZjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///540\n')},56:(module,__unused_webpack_exports,__webpack_require__)=>{eval('\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = true ? __webpack_require__.nc : 0;\n if (nonce) {\n styleElement.setAttribute("nonce", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzP2RkY2UiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///56\n')},825:module=>{eval('\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = "";\n if (obj.supports) {\n css += "@supports (".concat(obj.supports, ") {");\n }\n if (obj.media) {\n css += "@media ".concat(obj.media, " {");\n }\n var needLayer = typeof obj.layer !== "undefined";\n if (needLayer) {\n css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {");\n }\n css += obj.css;\n if (needLayer) {\n css += "}";\n }\n if (obj.media) {\n css += "}";\n }\n if (obj.supports) {\n css += "}";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== "undefined") {\n css += "\\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === "undefined") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODI1LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzP2U0NzkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///825\n')},113:module=>{eval("\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanM/MWRkZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///113\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]={id:n,exports:{}};return __webpack_modules__[n](e,e.exports,__webpack_require__),e.exports}__webpack_require__.n=n=>{var t=n&&n.__esModule?()=>n.default:()=>n;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(n,t)=>{for(var e in t)__webpack_require__.o(t,e)&&!__webpack_require__.o(n,e)&&Object.defineProperty(n,e,{enumerable:!0,get:t[e]})},__webpack_require__.o=(n,t)=>Object.prototype.hasOwnProperty.call(n,t),__webpack_require__.nc=void 0;var __webpack_exports__=__webpack_require__(496)})(); \ No newline at end of file diff --git a/build/index.html b/build/index.html deleted file mode 100644 index 42674bb..0000000 --- a/build/index.html +++ /dev/null @@ -1 +0,0 @@ -Demo Budget Form

FY2026 Budget Form


\ No newline at end of file diff --git a/docs/bundle.js b/docs/bundle.js new file mode 100644 index 0000000..11922b3 --- /dev/null +++ b/docs/bundle.js @@ -0,0 +1 @@ +(()=>{"use strict";var __webpack_modules__={573:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n P5: () => (/* binding */ FISCAL_YEAR),\n eG: () => (/* binding */ OT_FRINGE),\n zu: () => (/* binding */ REVENUE),\n XB: () => (/* binding */ SHEETS),\n Qn: () => (/* binding */ TARGET),\n I9: () => (/* binding */ cola),\n aF: () => (/* binding */ fringe),\n Wr: () => (/* binding */ merit)\n});\n\n// UNUSED EXPORTS: DATA_ROOT\n\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\nvar injectStylesIntoStyleTag = __webpack_require__(72);\nvar injectStylesIntoStyleTag_default = /*#__PURE__*/__webpack_require__.n(injectStylesIntoStyleTag);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleDomAPI.js\nvar styleDomAPI = __webpack_require__(825);\nvar styleDomAPI_default = /*#__PURE__*/__webpack_require__.n(styleDomAPI);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertBySelector.js\nvar insertBySelector = __webpack_require__(659);\nvar insertBySelector_default = /*#__PURE__*/__webpack_require__.n(insertBySelector);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\nvar setAttributesWithoutAttributes = __webpack_require__(56);\nvar setAttributesWithoutAttributes_default = /*#__PURE__*/__webpack_require__.n(setAttributesWithoutAttributes);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertStyleElement.js\nvar insertStyleElement = __webpack_require__(540);\nvar insertStyleElement_default = /*#__PURE__*/__webpack_require__.n(insertStyleElement);\n// EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleTagTransform.js\nvar styleTagTransform = __webpack_require__(113);\nvar styleTagTransform_default = /*#__PURE__*/__webpack_require__.n(styleTagTransform);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/css/common.css\nvar common = __webpack_require__(404);\n;// CONCATENATED MODULE: ./src/css/common.css\n\n \n \n \n \n \n \n \n \n \n\nvar options = {};\n\noptions.styleTagTransform = (styleTagTransform_default());\noptions.setAttributes = (setAttributesWithoutAttributes_default());\noptions.insert = insertBySelector_default().bind(null, \"head\");\noptions.domAPI = (styleDomAPI_default());\noptions.insertStyleElement = (insertStyleElement_default());\n\nvar update = injectStylesIntoStyleTag_default()(common/* default */.A, options);\n\n\n\n\n /* harmony default export */ const css_common = (common/* default */.A && common/* default */.A.locals ? common/* default */.A.locals : undefined);\n\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/sidebar/sidebar.css\nvar sidebar = __webpack_require__(263);\n;// CONCATENATED MODULE: ./src/js/components/sidebar/sidebar.css\n\n \n \n \n \n \n \n \n \n \n\nvar sidebar_options = {};\n\nsidebar_options.styleTagTransform = (styleTagTransform_default());\nsidebar_options.setAttributes = (setAttributesWithoutAttributes_default());\nsidebar_options.insert = insertBySelector_default().bind(null, \"head\");\nsidebar_options.domAPI = (styleDomAPI_default());\nsidebar_options.insertStyleElement = (insertStyleElement_default());\n\nvar sidebar_update = injectStylesIntoStyleTag_default()(sidebar/* default */.A, sidebar_options);\n\n\n\n\n /* harmony default export */ const sidebar_sidebar = (sidebar/* default */.A && sidebar/* default */.A.locals ? sidebar/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/utils/common_utils.js\n// Function to format number as currency\nconst formatCurrency = (amount, return_zero = false) => {\n var amount = Math.round(parseFloat(amount));\n if (amount == NaN) {\n return \"$ -\";\n }\n if (amount < 0) {\n return '($' + amount.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',') + ')';\n } else if (amount == 0) {\n if (return_zero) {\n return '$0';\n }\n return \"$ -\";\n }\n return '$' + amount.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n};\n\n// function to convert formatted number to a float\nconst common_utils_unformatCurrency = formattedAmount => {\n // Remove any currency symbols and commas\n let numericalPart = formattedAmount.replace(/[^0-9.-]+/g, \"\");\n if (numericalPart == '-') {\n return 0;\n }\n return parseFloat(numericalPart);\n};\nfunction displayWithCommas(value) {\n if (value == 0) {\n return 0;\n }\n return formatCurrency(value).replace('$', '');\n}\nfunction delay(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\nasync function pauseExecution(seconds) {\n await delay(seconds * 1000); // convert to milliseconds\n}\nfunction cleanString(str) {\n return str.toLowerCase().replaceAll(' ', '-');\n}\nfunction removeNewLines(str) {\n // TODO: ensure there is a space between words on new lines\n return str.replaceAll(/[\\r\\n]+/g, \"\");\n}\n;// CONCATENATED MODULE: ./src/js/components/sidebar/sidebar.js\n\n\n\n\n\n// Assuming you have a CSS variable --main-color defined on the :root\nconst root = document.documentElement;\nconst sideBarWidth = getComputedStyle(root).getPropertyValue('--sidebar-width').trim();\nfunction hideSidebar() {\n document.getElementById('sidebar-panel').style.display = 'none';\n document.getElementById('main-panel').style.width = '100%';\n document.querySelector('header').style.width = '100%';\n}\nfunction showSidebar() {\n const sidebar = document.getElementById('sidebar-panel');\n const mainPanel = document.getElementById('main-panel');\n const header = document.querySelector('header');\n sidebar.style.display = 'block'; // Show the sidebar\n\n // Calculate the remaining width for the main panel and header\n var contentWidth = document.documentElement.clientWidth;\n mainPanel.style.width = `${contentWidth - parseInt(sideBarWidth, 10)}px`;\n header.style.width = `${contentWidth - parseInt(sideBarWidth, 10)}px`;\n\n // add target to sidebar\n addTarget(TARGET);\n\n // add event listener to resize content if window is adjusted\n window.addEventListener('resize', showSidebar);\n}\nfunction updateSidebarTitle(new_title) {\n document.getElementById('sidebar-title').textContent = new_title;\n}\nfunction replaceSidebarStat(stat_id, new_figure) {\n const span = document.querySelector(`#${stat_id} .stat`);\n span.setAttribute('value', new_figure);\n span.textContent = formatCurrency(new_figure);\n}\nfunction fetchStat(stat_id) {\n const stat = document.querySelector(`#${stat_id} .stat`);\n return parseFloat(stat.getAttribute('value')) || 0;\n}\nfunction addTarget(target) {\n replaceSidebarStat('target', target);\n}\n\n// update all stats based on saved data\nasync function updateBaseline() {\n // gather info and update sidebar accordingly\n var baseline = new Baseline();\n replaceSidebarStat('baseline-revenue', baseline.revenue());\n replaceSidebarStat('baseline-personnel', baseline.personnel());\n replaceSidebarStat('baseline-nonpersonnel', baseline.nonpersonnel());\n replaceSidebarStat('baseline-total', baseline.total());\n\n // color code based on target\n var target = fetchStat('target');\n if (baseline.total() <= target) {\n document.querySelector('#baseline-total .stat').style.color = \"green\";\n }\n if (baseline.total() > target) {\n document.querySelector('#baseline-total .stat').style.color = \"red\";\n }\n}\nfunction updateSupp() {\n var supp = new Supplemental();\n replaceSidebarStat('supp-revenue', supp.revenue());\n replaceSidebarStat('supp-personnel', supp.personnel());\n replaceSidebarStat('supp-nonpersonnel', supp.nonpersonnel());\n replaceSidebarStat('supp-total', supp.total());\n}\nfunction updateTotals() {\n updateBaseline();\n updateSupp();\n}\nfunction resetAll() {\n // delete everything in local storage\n localStorage.clear();\n // reset all stats to 0\n updateTotals();\n}\nconst Sidebar = {\n hide: hideSidebar,\n show: showSidebar,\n updateTitle: updateSidebarTitle,\n addTarget: addTarget,\n updateTotals: updateTotals,\n reset: resetAll\n};\n/* harmony default export */ const components_sidebar_sidebar = (Sidebar);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/header/header.css\nvar header = __webpack_require__(107);\n;// CONCATENATED MODULE: ./src/js/components/header/header.css\n\n \n \n \n \n \n \n \n \n \n\nvar header_options = {};\n\nheader_options.styleTagTransform = (styleTagTransform_default());\nheader_options.setAttributes = (setAttributesWithoutAttributes_default());\nheader_options.insert = insertBySelector_default().bind(null, \"head\");\nheader_options.domAPI = (styleDomAPI_default());\nheader_options.insertStyleElement = (insertStyleElement_default());\n\nvar header_update = injectStylesIntoStyleTag_default()(header/* default */.A, header_options);\n\n\n\n\n /* harmony default export */ const header_header = (header/* default */.A && header/* default */.A.locals ? header/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/header/header.js\n\n\nconst Subtitle = {\n update: function (subtitle) {\n // get current fund\n var fund = CurrentFund.name();\n if (fund) {\n var subtitle = `${subtitle}: ${fund}`;\n }\n document.getElementById(\"subtitle\").textContent = subtitle;\n }\n};\n/* harmony default export */ const components_header_header = (Subtitle);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/welcome/welcome.css\nvar welcome = __webpack_require__(235);\n;// CONCATENATED MODULE: ./src/js/components/welcome/welcome.css\n\n \n \n \n \n \n \n \n \n \n\nvar welcome_options = {};\n\nwelcome_options.styleTagTransform = (styleTagTransform_default());\nwelcome_options.setAttributes = (setAttributesWithoutAttributes_default());\nwelcome_options.insert = insertBySelector_default().bind(null, \"head\");\nwelcome_options.domAPI = (styleDomAPI_default());\nwelcome_options.insertStyleElement = (insertStyleElement_default());\n\nvar welcome_update = injectStylesIntoStyleTag_default()(welcome/* default */.A, welcome_options);\n\n\n\n\n /* harmony default export */ const welcome_welcome = (welcome/* default */.A && welcome/* default */.A.locals ? welcome/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/welcome/welcome.js\n\n\n// Hide and unhide welcome buttons\nfunction unhideWelcomeButtons() {\n document.getElementById(\"welcome-page\").style.display = \"block\";\n}\nfunction hideWelcomeButtons() {\n document.getElementById(\"welcome-page\").style.display = \"none\";\n}\nconst Welcome = {\n show: unhideWelcomeButtons,\n hide: hideWelcomeButtons\n};\n/* harmony default export */ const components_welcome_welcome = (Welcome);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/body/body.css\nvar body = __webpack_require__(9);\n;// CONCATENATED MODULE: ./src/js/components/body/body.css\n\n \n \n \n \n \n \n \n \n \n\nvar body_options = {};\n\nbody_options.styleTagTransform = (styleTagTransform_default());\nbody_options.setAttributes = (setAttributesWithoutAttributes_default());\nbody_options.insert = insertBySelector_default().bind(null, \"head\");\nbody_options.domAPI = (styleDomAPI_default());\nbody_options.insertStyleElement = (insertStyleElement_default());\n\nvar body_update = injectStylesIntoStyleTag_default()(body/* default */.A, body_options);\n\n\n\n\n /* harmony default export */ const body_body = (body/* default */.A && body/* default */.A.locals ? body/* default */.A.locals : undefined);\n\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/accordion/accordion.css\nvar accordion = __webpack_require__(995);\n;// CONCATENATED MODULE: ./src/js/components/accordion/accordion.css\n\n \n \n \n \n \n \n \n \n \n\nvar accordion_options = {};\n\naccordion_options.styleTagTransform = (styleTagTransform_default());\naccordion_options.setAttributes = (setAttributesWithoutAttributes_default());\naccordion_options.insert = insertBySelector_default().bind(null, \"head\");\naccordion_options.domAPI = (styleDomAPI_default());\naccordion_options.insertStyleElement = (insertStyleElement_default());\n\nvar accordion_update = injectStylesIntoStyleTag_default()(accordion/* default */.A, accordion_options);\n\n\n\n\n /* harmony default export */ const accordion_accordion = (accordion/* default */.A && accordion/* default */.A.locals ? accordion/* default */.A.locals : undefined);\n\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/table/table.css\nvar table = __webpack_require__(279);\n;// CONCATENATED MODULE: ./src/js/components/table/table.css\n\n \n \n \n \n \n \n \n \n \n\nvar table_options = {};\n\ntable_options.styleTagTransform = (styleTagTransform_default());\ntable_options.setAttributes = (setAttributesWithoutAttributes_default());\ntable_options.insert = insertBySelector_default().bind(null, \"head\");\ntable_options.domAPI = (styleDomAPI_default());\ntable_options.insertStyleElement = (insertStyleElement_default());\n\nvar table_update = injectStylesIntoStyleTag_default()(table/* default */.A, table_options);\n\n\n\n\n /* harmony default export */ const table_table = (table/* default */.A && table/* default */.A.locals ? table/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/headers.js\nfunction addTableHeaders(header_array) {\n // Get the table element by its ID\n const table = document.getElementById('main-table');\n\n // Create a table header row element\n const headerRow = document.createElement('tr');\n for (const headerText of header_array) {\n // Create a header cell element\n const headerCell = document.createElement('th');\n headerCell.textContent = headerText;\n\n // Append the header cell to the header row\n headerRow.appendChild(headerCell);\n }\n\n // Append the header row to the table header\n let thead = table.querySelector('thead');\n thead.appendChild(headerRow);\n}\nconst Header = {\n add: function (header_array) {\n addTableHeaders(header_array);\n }\n};\n/* harmony default export */ const headers = (Header);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/rows.js\n\n\nasync function addNewRow(data_dictionary) {\n // Get the table element by its ID\n const table = document.getElementById('main-table');\n\n // check if header has already been added\n let header_row = table.querySelector('thead tr');\n if (!header_row) {\n headers.add(Object.keys(data_dictionary));\n }\n\n // add row of data\n const new_row = document.createElement('tr');\n const cell_data_array = Object.values(data_dictionary);\n for (const cell_data of cell_data_array) {\n // Create new cell and add it to the row\n const newCell = document.createElement('td');\n newCell.textContent = cell_data;\n new_row.appendChild(newCell);\n }\n\n // Append the new row to the table body\n let tbody = table.querySelector('tbody');\n tbody.appendChild(new_row);\n}\nfunction saveRowEdits(row) {\n var cells = row.querySelectorAll('td');\n cells.forEach(cell => {\n // save dropdown values\n if (cell.querySelector('select')) {\n var serviceSelector = cell.querySelector('select');\n cell.textContent = serviceSelector.value;\n } else if (cell.querySelector('input')) {\n // save new entered value in textbox\n var textbox = cell.querySelector('input');\n var enteredValue = textbox.value;\n // update display and format with currency if relevant\n if (cell.classList.contains('cost')) {\n // if cost, remove commas first\n enteredValue = enteredValue.replaceAll(',', '');\n cell.textContent = formatCurrency(enteredValue);\n } else {\n cell.textContent = enteredValue;\n }\n // set value attribute to the new user input\n cell.setAttribute('value', enteredValue);\n }\n });\n}\nconst Rows = {\n add: function (data_dictionary) {\n addNewRow(data_dictionary);\n },\n saveEdits: function (row) {\n saveRowEdits(row);\n }\n};\n/* harmony default export */ const rows = (Rows);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/buttons.js\n\nfunction hideButton(className) {\n return function () {\n var buttons = document.getElementsByClassName(className);\n for (var i = 0; i < buttons.length; i++) {\n buttons[i].style.display = 'none';\n }\n };\n}\nfunction showButton(className) {\n return function () {\n var buttons = document.getElementsByClassName(className);\n for (var i = 0; i < buttons.length; i++) {\n buttons[i].style.display = 'inline';\n }\n };\n}\nfunction updateButtonText(className, text) {\n document.querySelector(`.${className}`).textContent = text;\n}\n\n// EDIT button\n\nfunction handleRowEdit(makeRowEditable, updateCallback) {\n // attach an event listener to each edit button in every row\n var editButtons = document.getElementsByClassName('btn-edit');\n for (var i = 0; i < editButtons.length; i++) {\n editButtons[i].addEventListener('click', async function (event) {\n // Determine what was clicked on within the table\n var rowToEdit = event.target.closest('tr');\n // mark row as being edited\n rowToEdit.classList.add('active-editing');\n\n // turn relevant entries into textboxes\n makeRowEditable();\n\n // hide edit buttons\n Edit.hide();\n initializeConfirmButton(updateCallback);\n });\n }\n ;\n}\n\n// Confirm button\n\nfunction initializeConfirmButton(updateCallback) {\n // get element and add listener for click\n var rowToEdit = document.querySelector('.active-editing');\n const confirm_btn = rowToEdit.querySelector(\".btn-confirm\");\n // show the row's confirm button\n confirm_btn.style.display = 'block';\n confirm_btn.addEventListener('click', function () {\n ;\n // save row edits\n rows.saveEdits(rowToEdit);\n // update values in sidebar\n updateCallback();\n // make row no longer green\n rowToEdit.classList.remove('active-editing');\n // show edit buttons and hide confirm buttons\n Edit.show();\n Confirm.hide();\n });\n}\nconst Edit = {\n html: '',\n hide: hideButton('btn-edit'),\n show: showButton('btn-edit'),\n init: function (makeRowEditable, updateCallback) {\n handleRowEdit(makeRowEditable, updateCallback);\n }\n};\nconst Delete = {\n html: '',\n hide: hideButton('btn-delete'),\n show: showButton('btn-delete')\n};\nconst Confirm = {\n html: '',\n hide: hideButton('btn-confirm'),\n show: showButton('btn-confirm')\n};\nconst AddRow = {\n hide: hideButton('btn-add'),\n show: showButton('btn-add'),\n updateText: function (text) {\n updateButtonText('btn-add', text);\n }\n};\nconst Buttons = {\n Delete: Delete,\n Edit: Edit,\n Confirm: Confirm,\n AddRow: AddRow,\n edit_confirm_btns: Edit.html + Confirm.html,\n all_btns: Delete.html + Edit.html + Confirm.html\n};\n/* harmony default export */ const buttons = (Buttons);\n;// CONCATENATED MODULE: ./src/js/utils/data_utils/budget_data_handlers.js\nconst FundLookupTable = {\n retrieve: function () {\n return JSON.parse(localStorage.getItem('fund-lookup-table')) || {};\n },\n save: function (fundDict) {\n localStorage.setItem('fund-lookup-table', JSON.stringify(fundDict));\n },\n update: function (fundData) {\n const table = this.retrieve();\n for (let fund of Object.keys(fundData)) {\n // fund = toString(fund);\n // add to lookup table if not in there already\n if (!table[fund]) {\n // get fund name\n const fundName = fundData[fund][0]['Fund Name'];\n // add fund to dictionary\n table[fund] = fundName;\n }\n }\n // save any updates\n this.save(table);\n },\n reset: function () {\n this.save({});\n },\n getName: function (number) {\n return this.retrieve()[number];\n },\n listFunds: function () {\n return Object.keys(this.retrieve());\n }\n};\n\n// data structure to save the possible service options for the department\nconst Services = {\n save: function (services) {\n localStorage.setItem('services-list', JSON.stringify(services));\n },\n list: function () {\n return JSON.parse(localStorage.getItem('services-list')) || {};\n }\n};\n;// CONCATENATED MODULE: ./src/js/components/form/subcomponents/dropdown.js\nasync function createDropdownFromJSON(json_path) {\n // Fetch JSON data from a file asynchronously\n const response = await fetch(json_path);\n const dataArray = await response.json();\n // create and return element\n return createDropdown(dataArray);\n}\nfunction createDropdown(dataArray) {\n // Creating a select element\n const selectElement = document.createElement('select');\n\n // Looping through the array and creating an option for each element\n dataArray.forEach(item => {\n const optionElement = document.createElement('option');\n optionElement.value = item;\n optionElement.textContent = item;\n selectElement.appendChild(optionElement); // Appending the option to the select\n });\n\n // Return the select element so it can be appended to the document\n return selectElement;\n}\nconst Dropdown = {\n createFromJSON: function (json_path) {\n return createDropdownFromJSON(json_path);\n },\n create: function (dataArray) {\n return createDropdown(dataArray);\n }\n};\n/* harmony default export */ const dropdown = (Dropdown);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/cells.js\n\n\n\n\n// return cell value attribute or 0 if it does not exist\nfunction getCellValue(row, className) {\n var cell = row.querySelector(`.${className}`);\n var cellValue = cell ? cell.getAttribute('value') : null;\n return cellValue ? parseFloat(cellValue) : 0;\n}\n\n// return text in cell\nfunction getCellText(row, className) {\n var cell = row.querySelector(`.${className}`);\n return cell.textContent;\n}\nfunction updateTableCell(row, col_class, new_value) {\n const cell = row.querySelector(`.${col_class}`);\n cell.setAttribute('value', new_value);\n cell.textContent = formatCurrency(new_value);\n}\nfunction createEditableCell(cellClass, isCost) {\n // get cell\n const cell = document.querySelector(`.active-editing td.${cellClass}`);\n // Create an input element to edit the value\n var textbox = document.createElement('input');\n textbox.type = 'text';\n if (isCost) {\n var value = cell.getAttribute('value');\n } else {\n var value = cell.textContent;\n }\n textbox.value = displayWithCommas(value);\n // Clear the current content and append the textbox to the cell\n cell.innerHTML = '';\n cell.appendChild(textbox);\n}\nfunction createServiceDropdown() {\n // get cell\n var cellClass = 'service';\n const cell = document.querySelector(`.active-editing td.${cellClass}`);\n // add service dropdown\n const serviceDropdown = dropdown.create(Services.list());\n serviceDropdown.value = cell.textContent;\n // Clear the current content and append the textbox to the cell\n cell.innerHTML = '';\n cell.appendChild(serviceDropdown);\n}\nconst Cell = {\n getValue: function (row, className) {\n return getCellValue(row, className);\n },\n getText: function (row, className) {\n return getCellText(row, className);\n },\n updateValue: function (row, col_class, new_value) {\n updateTableCell(row, col_class, new_value);\n },\n createTextbox: function (className, isCost) {\n createEditableCell(className, isCost);\n },\n createServiceDropdown: createServiceDropdown\n};\n/* harmony default export */ const cells = (Cell);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/columns.js\n\n\n// position is index at which new column will be inserted\nfunction addCol(position, htmlContent = '', headerTitle = '') {\n // Get the table element by its ID\n let table = document.getElementById('main-table');\n\n // Validate position\n let maxPosition = table.rows[0].cells.length;\n if (position < 0 || position > maxPosition) {\n console.error(`Position ${position} is out of bounds.`);\n return;\n }\n\n // Insert the header if provided\n let thead = table.tHead;\n if (headerTitle && thead) {\n let th = document.createElement('th');\n th.innerHTML = headerTitle; // Use innerHTML to insert HTML content\n thead.rows[0].insertBefore(th, thead.rows[0].cells[position]);\n }\n\n // Insert new cells into each row of the table body\n let tbody = table.tBodies[0];\n if (tbody) {\n for (let i = 0; i < tbody.rows.length; i++) {\n let row = tbody.rows[i];\n let td = document.createElement('td');\n td.innerHTML = htmlContent; // Use innerHTML to insert HTML content\n row.insertBefore(td, row.cells[position]);\n }\n }\n}\nfunction ncols() {\n const table = document.getElementById('main-table');\n // Ensure that the row exists before counting the columns\n return table.rows[0].cells.length;\n}\nfunction addColToEnd(htmlContents = [], headerTitle = '') {\n // count columns and add new column to the end\n const position = ncols('main-table');\n addCol(position, htmlContents, headerTitle);\n}\nfunction assignClassToColumn(headerName, className) {\n // Get the table element by its ID\n let table = document.getElementById('main-table');\n\n // Find the index of the column by its header name\n const thead = table.tHead;\n if (!thead || thead.rows.length === 0) {\n console.error('The table header is not found or has no rows.');\n return;\n }\n let headerCellIndex = -1;\n const headerCells = thead.rows[0].cells; // Assuming the first row contains header cells ()\n for (let i = 0; i < headerCells.length; i++) {\n if (headerCells[i].textContent.trim() === headerName) {\n headerCellIndex = i;\n break;\n }\n }\n if (headerCellIndex === -1) {\n console.error(`No header found with name \"${headerName}\"`);\n return;\n }\n\n // Assign the class to each cell in the specified column index within the tbody\n let tbody = table.tBodies[0];\n if (tbody) {\n let bodyRows = tbody.rows;\n for (let row of bodyRows) {\n if (row.cells[headerCellIndex]) {\n row.cells[headerCellIndex].classList.add(className);\n }\n }\n }\n}\nfunction addCostClass(headerName) {\n assignClassToColumn(headerName, 'cost');\n\n // Get all the cells with the specified class name\n const cells = document.querySelectorAll(`.cost`);\n cells.forEach(cell => {\n // Get the current text content of the cell and assign it to 'value' attribute\n if (!cell.getAttribute('value')) {\n const cellText = cell.textContent.trim();\n const cellValue = isNaN(cellText) || cellText === '' ? 0 : parseFloat(cellText);\n cell.setAttribute('value', cellValue);\n\n // Now format the text content like currency and replace it in the cell\n const formattedCurrency = formatCurrency(parseFloat(cellValue));\n cell.textContent = formattedCurrency;\n }\n });\n}\nfunction assignColumnClasses(columnDefinitions) {\n columnDefinitions.forEach(column => {\n // Assign class to column\n assignClassToColumn(column.title, column.className);\n\n // If the column is a cost column, add the specific cost class\n if (column.isCost) {\n addCostClass(column.title);\n }\n\n // show the column\n showColumnByTitle(column.title);\n });\n}\nfunction hideColumn(index) {\n var table = document.getElementById('main-table');\n var rows = table.rows;\n for (var i = 0; i < rows.length; i++) {\n var cells = rows[i].cells;\n if (cells.length > index) {\n cells[index].style.display = 'none';\n }\n }\n}\n\n// Function to show a specific column\nfunction showColumn(index) {\n var table = document.getElementById('main-table');\n var rows = table.rows;\n for (var i = 0; i < rows.length; i++) {\n var cells = rows[i].cells;\n if (cells.length > index) {\n cells[index].style.display = 'table-cell';\n }\n }\n}\n\n// Function to get the column index by title\nfunction getColumnIndexByTitle(table, title) {\n var headers = table.querySelectorAll('th');\n for (var i = 0; i < headers.length; i++) {\n if (headers[i].innerText === title) {\n return i;\n }\n }\n return -1; // Column not found\n}\n\n// Function to hide a column by title\nfunction hideColumnByTitle(title) {\n var table = document.getElementById('main-table');\n var index = getColumnIndexByTitle(table, title);\n if (index !== -1) {\n hideColumn(index);\n } else {\n console.log(`Column with title \"${title}\" not found.`);\n }\n}\n\n// Function to show a column by title\nfunction showColumnByTitle(title) {\n var table = document.getElementById('main-table');\n var index = getColumnIndexByTitle(table, title);\n if (index !== -1) {\n showColumn(index);\n } else {\n console.log(`Column with title \"${title}\" not found.`);\n }\n}\nconst Column = {\n add: function (position, htmlContent, headerTitle) {\n return addCol(position, htmlContent, headerTitle);\n },\n addAtEnd: function (htmlContent, headerTitle) {\n return addColToEnd(htmlContent, headerTitle);\n },\n assignClasses: function (column_definitions) {\n return assignColumnClasses(column_definitions);\n },\n hide: function (colName) {\n hideColumnByTitle(colName);\n },\n show: function (colName) {\n showColumnByTitle(colName);\n }\n};\n/* harmony default export */ const columns = (Column);\n;// CONCATENATED MODULE: ./src/js/components/table/subcomponents/data.js\n\n\nfunction fillTable(data) {\n try {\n const table = document.getElementById('main-table');\n const thead = table.querySelector('thead');\n const tbody = table.querySelector('tbody');\n\n // clear existing data\n thead.innerHTML = '';\n tbody.innerHTML = '';\n\n // Create table header row\n const headerRow = document.createElement('tr');\n Object.keys(data[0]).forEach(key => {\n const header = document.createElement('th');\n header.textContent = key;\n headerRow.appendChild(header);\n });\n thead.appendChild(headerRow);\n\n // Create table body rows\n data.forEach(item => {\n const row = document.createElement('tr');\n Object.values(item).forEach(val => {\n const cell = document.createElement('td');\n cell.textContent = val;\n row.appendChild(cell);\n });\n tbody.appendChild(row);\n });\n } catch (error) {\n console.error('No table saved in localStorage:', error);\n }\n saveTableData();\n}\nasync function loadFromStorage() {\n // look up table in storage and pass to table load function\\\n if (CurrentFund.number()) {\n var key = `${CurrentPage.load()}_${CurrentFund.number()}`;\n } else {\n var key = CurrentPage.load();\n }\n const data = await loadTableData(key);\n if (!data) {\n // if no table in storage, return 0\n return 0;\n } else {\n fillTable(data);\n return 1;\n }\n}\nfunction loadFunds() {\n // get list of funds from storage\n const fundDict = FundLookupTable.retrieve();\n // build out data in correct format\n const resultArray = [];\n for (const key in fundDict) {\n if (fundDict.hasOwnProperty(key)) {\n resultArray.push({\n Fund: fundDict[key] // Use the value directly\n });\n }\n }\n fillTable(resultArray);\n}\nfunction getColumnIndexByClass(tbody, className) {\n const firstRow = tbody.rows[0];\n if (!firstRow) return -1; // Return -1 if there's no row to examine\n for (let cellIndex = 0; cellIndex < firstRow.cells.length; cellIndex++) {\n if (firstRow.cells[cellIndex].classList.contains(className)) {\n return cellIndex;\n }\n }\n return -1; // Return -1 if class name not found\n}\nfunction sort(primaryClass, secondaryClass) {\n const table = document.getElementById('main-table');\n const tbody = table.tBodies[0];\n const rows = Array.from(tbody.rows);\n\n // Get the column indices by class name\n const primaryColIndex = getColumnIndexByClass(tbody, primaryClass);\n const secondaryColIndex = getColumnIndexByClass(tbody, secondaryClass);\n\n // exit if classes don't exist\n if (primaryColIndex === -1) {\n console.error(`Column class ${classA} not found in table`);\n return;\n } else if (secondaryColIndex === -1) {\n console.error(`Column class ${classB} not found in table`);\n return;\n }\n\n // Sort the rows based on the text content of the cells\n rows.sort((rowA, rowB) => {\n // Primary column comparison\n const primaryA = unformatCurrency(rowA.cells[primaryColIndex].textContent);\n const primaryB = unformatCurrency(rowB.cells[primaryColIndex].textContent);\n if (primaryA < primaryB) return -1;\n if (primaryA > primaryB) return 1;\n\n // Secondary column comparison (if primary is equal)\n const secondaryA = unformatCurrency(rowA.cells[secondaryColIndex].textContent);\n const secondaryB = unformatCurrency(rowB.cells[secondaryColIndex].textContent);\n if (secondaryA < secondaryB) return -1;\n if (secondaryA > secondaryB) return 1;\n\n // If both columns are equal\n return 0;\n });\n\n // Reattach sorted rows to the table body\n rows.forEach(row => tbody.appendChild(row));\n}\nconst Data = {\n load: loadFromStorage,\n loadFunds: loadFunds,\n sort: function (colA, colB) {\n sort(colA, colB);\n }\n};\n/* harmony default export */ const data = (Data);\n;// CONCATENATED MODULE: ./src/js/components/table/table.js\n\n\n\n\n\n\n\n\nfunction adjustTableWidth(width_pct) {\n const table = document.getElementById('main-table');\n table.style.width = width_pct;\n}\nfunction clearTable() {\n const table = document.getElementById('main-table');\n table.querySelector('thead').innerHTML = '';\n table.querySelector('tbody').innerHTML = '';\n}\nfunction showTable() {\n const table = document.getElementById('main-table');\n table.style.display = 'table';\n}\nfunction hideTable() {\n const table = document.getElementById('main-table');\n table.style.display = 'none';\n buttons.AddRow.hide();\n}\nconst Table = {\n Buttons: buttons,\n Cell: cells,\n Columns: columns,\n Header: headers,\n Rows: rows,\n Data: data,\n // functions\n adjustWidth: function (width_pct) {\n adjustTableWidth(width_pct);\n },\n clear: clearTable,\n hide: hideTable,\n show: showTable,\n save: saveTableData\n};\n/* harmony default export */ const components_table_table = (Table);\n;// CONCATENATED MODULE: ./src/js/components/accordion/accordion.js\n\n\n\n\n\nconst FundTable = {\n table_id: fund => {\n return `table-${fund}`;\n },\n init: function (fund) {\n // create empty table and put it in the accordion\n var table = document.createElement('table');\n table.id = this.table_id(fund);\n table.classList.add('accordion-table');\n var parent = document.querySelector(`#fund_${fund}_content .accordion-body`);\n parent.appendChild(table);\n },\n createNewCell: function (content, row) {\n const newCell = document.createElement('td');\n newCell.innerHTML = content;\n row.appendChild(newCell);\n },\n addRow: function (fund, name, number) {\n var table = document.getElementById(this.table_id(fund));\n var new_row = document.createElement('tr');\n table.appendChild(new_row);\n // Create a cell for the line item label\n this.createNewCell(name, new_row);\n // create a cell for the amount\n this.createNewCell(formatCurrency(number), new_row);\n // create Edit button \n var button = '';\n if (name != 'Total') {\n button = components_table_table.Buttons.Edit.html;\n }\n this.createNewCell(button, new_row);\n },\n fill: function (fund) {\n this.init(fund);\n const fundObject = new Fund(fund);\n this.addRow(fund, 'Personnel Expenses', fundObject.getPersonnelCost());\n this.addRow(fund, 'Non-Personnel Expenses', fundObject.getNonPersonnelCost());\n this.addRow(fund, 'Revenue', fundObject.getRevenue());\n this.addRow(fund, 'Net Expenses (Revenues)', fundObject.getTotal());\n }\n};\nconst Item = {\n html: function (fund) {\n var id = fund; // cleanString(fund);\n return `

\n \n

\n
\n
\n
`;\n },\n add: function (fund) {\n // get accordion and add a new item to it\n const parent = document.getElementById('summary-accordion');\n const item_element = document.createElement('div');\n item_element.classList.add('accordion-item');\n item_element.innerHTML = this.html(fund);\n parent.appendChild(item_element);\n FundTable.fill(fund);\n },\n FundTable: FundTable,\n updateHeader: function (fund, new_amount) {\n const header_btn = document.querySelector(`#fund_${fund}_header button`);\n header_btn.querySelector('span.name').textContent = FundLookupTable.getName(fund);\n header_btn.querySelector('span.amount').textContent = formatCurrency(new_amount);\n }\n};\nconst Accordion = {\n Item: Item,\n hide: function () {\n document.getElementById('accordion-div').style.display = 'none';\n // reset to delete content\n document.getElementById('summary-accordion').innerHTML = '';\n },\n show: function () {\n document.getElementById('accordion-div').style.display = 'block';\n },\n async createFromFunds() {\n var funds = FundLookupTable.listFunds();\n funds.forEach(fund => {\n Item.add(fund);\n const fundObject = new Fund(fund);\n Item.updateHeader(fund, fundObject.getTotal());\n });\n }\n};\n/* harmony default export */ const components_accordion_accordion = ((/* unused pure expression or super */ null && (Accordion)));\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/file_upload/file_upload.css\nvar file_upload = __webpack_require__(39);\n;// CONCATENATED MODULE: ./src/js/components/file_upload/file_upload.css\n\n \n \n \n \n \n \n \n \n \n\nvar file_upload_options = {};\n\nfile_upload_options.styleTagTransform = (styleTagTransform_default());\nfile_upload_options.setAttributes = (setAttributesWithoutAttributes_default());\nfile_upload_options.insert = insertBySelector_default().bind(null, \"head\");\nfile_upload_options.domAPI = (styleDomAPI_default());\nfile_upload_options.insertStyleElement = (insertStyleElement_default());\n\nvar file_upload_update = injectStylesIntoStyleTag_default()(file_upload/* default */.A, file_upload_options);\n\n\n\n\n /* harmony default export */ const file_upload_file_upload = (file_upload/* default */.A && file_upload/* default */.A.locals ? file_upload/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/utils/data_utils/XLSX_handlers.js\n\n\n\n\nfunction deleteTopRowsUntilFullData(data) {\n // function to try to find the top of the usable data\n let fullDataRowFound = false;\n while (!fullDataRowFound && data.length > 0) {\n const row = data[0]; // Get the top row\n let hasAllData = true;\n for (const cell of row) {\n if (cell == null || cell === '') {\n hasAllData = false;\n break;\n }\n }\n if (hasAllData && row.length > 1) {\n fullDataRowFound = true;\n } else {\n // delete the top row if it's not the header row\n data.shift();\n }\n }\n return data;\n}\nfunction processWorkbook(arrayBuffer) {\n const workbook = XLSX.read(arrayBuffer, {\n type: 'array'\n });\n workbook.SheetNames.forEach(sheetName => {\n // only convert sheets we need\n if (Object.keys(SHEETS).includes(sheetName)) {\n // read in sheets\n const sheet = workbook.Sheets[sheetName];\n const rawData = XLSX.utils.sheet_to_json(sheet, {\n header: 1,\n defval: ''\n });\n\n // Clean the data by removing top rows with incomplete data\n const dataRows = deleteTopRowsUntilFullData(rawData);\n\n // get new headers\n const headers = dataRows[0];\n\n // isolate Fund column to split data\n const fundIndex = headers.indexOf('Fund');\n if (fundIndex === -1) {\n console.error(`No 'Fund' column found in sheet ${sheetName}`);\n return;\n }\n\n // Save a dictionary of data for each fund for each sheet\n const fundData = {};\n dataRows.forEach(row => {\n const fund = row[fundIndex];\n if (fund && fund != \"Fund\") {\n if (!fundData[fund]) {\n fundData[fund] = [];\n }\n const rowData = {};\n headers.forEach((header, index) => {\n rowData[removeNewLines(header)] = row[index];\n });\n fundData[fund].push(rowData);\n }\n });\n\n // save fund number and name as we go along\n FundLookupTable.update(fundData);\n Object.keys(fundData).forEach(fund => {\n const key = `${SHEETS[sheetName]}_${fund}`;\n localStorage.setItem(key, JSON.stringify(fundData[fund]));\n });\n }\n\n // But also save the possible services\n else if (sheetName == 'Drop-Downs') {\n const sheet = workbook.Sheets[sheetName];\n // Convert the sheet to JSON to easily manipulate data\n const sheetData = XLSX.utils.sheet_to_json(sheet, {\n header: 1\n });\n\n // Locate the \"services\" column header in row 0\n const headerRow = sheetData[0];\n const servicesIndex = headerRow.indexOf('Services');\n if (servicesIndex === -1) {\n console.error('Header \"Services\" not found');\n } else {\n // Extract data from the \"services\" column (excluding the header row)\n const servicesColumn = sheetData.slice(1).map(row => row[servicesIndex]);\n const cleanedServicesColumn = servicesColumn.filter(value => value != null);\n // save the data\n Services.save(cleanedServicesColumn);\n }\n }\n });\n console.log('all excel data saved');\n}\n\n// Utility function to append a sheet to the workbook if data is present\nfunction appendSheetToWorkbook(workbook, data, sheetName) {\n if (data.length > 0) {\n const sheet = XLSX.utils.json_to_sheet(data);\n XLSX.utils.book_append_sheet(workbook, sheet, sheetName);\n }\n}\nfunction downloadXLSX() {\n const baseline = new Baseline();\n const workbook = XLSX.utils.book_new(); // Create a new workbook\n\n const dataMap = {\n Personnel: 'personnel',\n Overtime: 'overtime',\n NonPersonnel: 'nonpersonnel',\n Revenue: 'revenue'\n };\n const sheetData = {\n Personnel: [],\n Overtime: [],\n NonPersonnel: [],\n Revenue: []\n };\n baseline.funds.forEach(fund => {\n Object.keys(dataMap).forEach(sheetName => {\n if (fund[dataMap[sheetName]] && fund[dataMap[sheetName]].table) {\n sheetData[sheetName].push(...fund[dataMap[sheetName]].table);\n }\n });\n });\n Object.keys(sheetData).forEach(sheetName => {\n appendSheetToWorkbook(workbook, sheetData[sheetName], sheetName);\n });\n\n // Generate a downloadable file\n const wbout = XLSX.write(workbook, {\n bookType: 'xlsx',\n type: 'array'\n });\n const blob = new Blob([wbout], {\n type: 'application/octet-stream'\n });\n\n // Create a link and trigger the download\n const link = document.createElement(\"a\");\n link.href = URL.createObjectURL(blob);\n link.download = \"baseline_data.xlsx\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n;// CONCATENATED MODULE: ./src/js/components/file_upload/file_upload.js\n\n\nconst FileUpload = {\n init: function () {\n const inputObject = document.getElementById('file-input');\n inputObject.addEventListener('change', function (event) {\n readXL(event);\n });\n },\n show: function () {\n const inputObject = document.getElementById('file-input');\n inputObject.style.display = '';\n },\n hide: function () {\n const inputObject = document.getElementById('file-input');\n inputObject.style.display = 'none';\n }\n};\nfunction readXL(event) {\n const file = event.target.files[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = function (e) {\n const arrayBuffer = e.target.result;\n processWorkbook(arrayBuffer);\n };\n reader.onerror = function (err) {\n console.error('Error reading file:', err);\n };\n reader.readAsArrayBuffer(file); // Read the file as an ArrayBuffer\n }\n}\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/modal/modal.css\nvar modal = __webpack_require__(95);\n;// CONCATENATED MODULE: ./src/js/components/modal/modal.css\n\n \n \n \n \n \n \n \n \n \n\nvar modal_options = {};\n\nmodal_options.styleTagTransform = (styleTagTransform_default());\nmodal_options.setAttributes = (setAttributesWithoutAttributes_default());\nmodal_options.insert = insertBySelector_default().bind(null, \"head\");\nmodal_options.domAPI = (styleDomAPI_default());\nmodal_options.insertStyleElement = (insertStyleElement_default());\n\nvar modal_update = injectStylesIntoStyleTag_default()(modal/* default */.A, modal_options);\n\n\n\n\n /* harmony default export */ const modal_modal = (modal/* default */.A && modal/* default */.A.locals ? modal/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/modal/modal.js\n\nfunction clearModal() {\n updateModalTitle('');\n document.getElementById('modal-body').innerHTML = '';\n //removeAllModalLinks()\n}\nfunction hideModal(modal_id) {\n $('#' + modal_id).modal('hide');\n}\nfunction showModal(modal_id) {\n $('#' + modal_id).modal('show');\n}\nfunction showModalHandler() {\n showModal('main-modal');\n}\nconst Submit = {\n handler: null,\n init: function (onSubmit) {\n const modal = document.getElementById('main-modal');\n // add onSubmit function as handler\n this.handler = function (event) {\n event.preventDefault();\n onSubmit(event);\n };\n // Adding the handler reference as the event listener\n modal.addEventListener('submit', this.handler);\n },\n deinit: function () {\n const modal = document.getElementById('main-modal');\n if (this.handler !== null) {\n // Removing the event listener and clear the handler\n modal.removeEventListener('submit', this.handler);\n this.handler = null;\n }\n }\n};\nconst Link = {\n add: function (button_id) {\n document.getElementById(button_id).addEventListener('click', showModalHandler);\n },\n remove: function (button_id) {\n document.getElementById(button_id).removeEventListener('click', showModalHandler);\n }\n};\nfunction updateModalTitle(title) {\n document.getElementById('modal-title').textContent = title;\n}\nconst Title = {\n update: function (title) {\n updateModalTitle(title);\n }\n};\nconst Modal = {\n hide: function () {\n hideModal('main-modal');\n },\n show: function () {\n showModal('main-modal');\n },\n clear: clearModal,\n Title: Title,\n Link: Link,\n Submit: Submit\n};\n/* harmony default export */ const components_modal_modal = (Modal);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/nav_buttons/nav_buttons.css\nvar nav_buttons = __webpack_require__(595);\n;// CONCATENATED MODULE: ./src/js/components/nav_buttons/nav_buttons.css\n\n \n \n \n \n \n \n \n \n \n\nvar nav_buttons_options = {};\n\nnav_buttons_options.styleTagTransform = (styleTagTransform_default());\nnav_buttons_options.setAttributes = (setAttributesWithoutAttributes_default());\nnav_buttons_options.insert = insertBySelector_default().bind(null, \"head\");\nnav_buttons_options.domAPI = (styleDomAPI_default());\nnav_buttons_options.insertStyleElement = (insertStyleElement_default());\n\nvar nav_buttons_update = injectStylesIntoStyleTag_default()(nav_buttons/* default */.A, nav_buttons_options);\n\n\n\n\n /* harmony default export */ const nav_buttons_nav_buttons = (nav_buttons/* default */.A && nav_buttons/* default */.A.locals ? nav_buttons/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/nav_buttons/nav_buttons.js\n\n\nfunction initializeNavButtons() {\n // initialize last button\n const last_btn = document.getElementById('btn-last');\n last_btn.addEventListener('click', lastPage);\n // initialize next button\n const next_btn = document.getElementById('btn-next');\n next_btn.addEventListener('click', nextPage);\n disable('btn-next');\n}\nfunction hideNavButtons() {\n document.getElementById('nav-btns').style.display = 'none';\n}\nfunction showNavButtons() {\n document.getElementById('nav-btns').style.display = 'block';\n initializeNavButtons();\n}\nfunction disable(button_id) {\n document.getElementById(button_id).classList.add('disabled');\n}\nfunction enable(button_id) {\n document.getElementById(button_id).classList.remove('disabled');\n}\nconst Next = {\n disable: function () {\n disable('btn-next');\n },\n enable: function () {\n enable('btn-next');\n }\n};\nconst Last = {\n disable: function () {\n disable('btn-last');\n },\n enable: function () {\n enable('btn-last');\n }\n};\nconst NavButtons = {\n hide: hideNavButtons,\n show: showNavButtons,\n Next: Next,\n Last: Last\n};\n/* harmony default export */ const components_nav_buttons_nav_buttons = (NavButtons);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/prompt/prompt.css\nvar prompt_prompt = __webpack_require__(225);\n;// CONCATENATED MODULE: ./src/js/components/prompt/prompt.css\n\n \n \n \n \n \n \n \n \n \n\nvar prompt_options = {};\n\nprompt_options.styleTagTransform = (styleTagTransform_default());\nprompt_options.setAttributes = (setAttributesWithoutAttributes_default());\nprompt_options.insert = insertBySelector_default().bind(null, \"head\");\nprompt_options.domAPI = (styleDomAPI_default());\nprompt_options.insertStyleElement = (insertStyleElement_default());\n\nvar prompt_update = injectStylesIntoStyleTag_default()(prompt_prompt/* default */.A, prompt_options);\n\n\n\n\n /* harmony default export */ const components_prompt_prompt = (prompt_prompt/* default */.A && prompt_prompt/* default */.A.locals ? prompt_prompt/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/prompt/subcomponents/text.js\nfunction showPrompt() {\n document.getElementById(\"prompt-div\").style.display = \"block\";\n}\nfunction hidePrompt() {\n document.getElementById('prompt-div').style.display = 'none';\n}\nfunction updatePrompt(prompt) {\n document.getElementById('prompt').textContent = prompt;\n showPrompt();\n}\nconst Text = {\n show: showPrompt,\n hide: hidePrompt,\n update: function (text) {\n updatePrompt(text);\n }\n};\n/* harmony default export */ const subcomponents_text = (Text);\n;// CONCATENATED MODULE: ./src/js/components/prompt/subcomponents/buttons.js\nfunction showPromptButton(id) {\n // make buttons visible\n document.getElementById(id).style.display = 'inline';\n}\nfunction updatePromptButton(id, text) {\n document.getElementById(id).textContent = text;\n showPromptButton(id);\n}\nfunction hidePromptButton(id) {\n document.getElementById(id).style.display = 'none';\n}\nfunction unclickAll() {\n document.getElementById('option1').classList.remove('clicked');\n document.getElementById('option2').classList.remove('clicked');\n}\nfunction applyClickedStyle(button) {\n unclickAll();\n button.classList.add('clicked');\n}\nfunction addPromptButtonAction(button_id, action_fn) {\n const buttonElement = document.getElementById(button_id);\n buttonElement.addEventListener('click', action_fn);\n buttonElement.addEventListener('click', function () {\n applyClickedStyle(this);\n });\n}\nfunction removePromptButtonAction(button_id, action_fn) {\n document.getElementById(button_id).removeEventListener('click', action_fn);\n}\nconst Left = {\n show: function () {\n showPromptButton('option1');\n },\n hide: function () {\n hidePromptButton('option1');\n },\n updateText: function (text) {\n updatePromptButton('option1', text);\n },\n addAction: function (action_fn) {\n addPromptButtonAction('option1', action_fn);\n },\n removeAction: function (action_fn) {\n removePromptButtonAction('option1', action_fn);\n }\n};\nconst Right = {\n show: function () {\n showPromptButton('option2');\n },\n hide: function () {\n hidePromptButton('option2');\n },\n updateText: function (text) {\n updatePromptButton('option2', text);\n },\n addAction: function (action_fn) {\n addPromptButtonAction('option2', action_fn);\n },\n removeAction: function (action_fn) {\n removePromptButtonAction('option2', action_fn);\n }\n};\nconst buttons_Buttons = {\n Left: Left,\n Right: Right,\n show: function () {\n showPromptButton('option1');\n showPromptButton('option2');\n },\n hide: function () {\n hidePromptButton('option1');\n hidePromptButton('option2');\n },\n reset: unclickAll\n};\n/* harmony default export */ const subcomponents_buttons = (buttons_Buttons);\n;// CONCATENATED MODULE: ./src/js/components/prompt/prompt.js\n\n\n\nconst Prompt = {\n Text: subcomponents_text,\n Buttons: subcomponents_buttons,\n hide: function () {\n subcomponents_text.hide();\n subcomponents_buttons.hide();\n },\n show: function () {\n subcomponents_text.show();\n subcomponents_buttons.show();\n }\n};\n/* harmony default export */ const js_components_prompt_prompt = (Prompt);\n;// CONCATENATED MODULE: ./src/js/components/body/body.js\n\n\n\n\n\n\n\n\n\nfunction resetPage() {\n // hide everything in the body\n components_welcome_welcome.hide();\n components_modal_modal.clear();\n components_modal_modal.hide();\n components_nav_buttons_nav_buttons.hide();\n js_components_prompt_prompt.hide();\n components_table_table.hide();\n components_sidebar_sidebar.hide();\n Accordion.hide();\n FileUpload.hide();\n // disable next button\n components_nav_buttons_nav_buttons.Next.disable();\n js_components_prompt_prompt.Buttons.reset();\n // disable submit button\n components_modal_modal.Submit.deinit();\n}\nconst Body = {\n reset: resetPage\n};\n/* harmony default export */ const components_body_body = (Body);\n// EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/js/components/form/form.css\nvar form_form = __webpack_require__(109);\n;// CONCATENATED MODULE: ./src/js/components/form/form.css\n\n \n \n \n \n \n \n \n \n \n\nvar form_options = {};\n\nform_options.styleTagTransform = (styleTagTransform_default());\nform_options.setAttributes = (setAttributesWithoutAttributes_default());\nform_options.insert = insertBySelector_default().bind(null, \"head\");\nform_options.domAPI = (styleDomAPI_default());\nform_options.insertStyleElement = (insertStyleElement_default());\n\nvar form_update = injectStylesIntoStyleTag_default()(form_form/* default */.A, form_options);\n\n\n\n\n /* harmony default export */ const components_form_form = (form_form/* default */.A && form_form/* default */.A.locals ? form_form/* default */.A.locals : undefined);\n\n;// CONCATENATED MODULE: ./src/js/components/form/subcomponents/fields.js\n// function to add questions to forms\n// type is 'input' or 'textarea'\n// inputType is for validation ('number' or 'text', etc)\nfunction appendFormElement(type, label, inputId, required, inputType, form_id = 'new-form', cost = false) {\n // change if we want forms elsewhere\n const form = document.getElementById(form_id);\n\n // create outer wrapper for element\n const wrapper = document.createElement('div');\n\n // label question\n const labelEl = document.createElement('label');\n labelEl.textContent = label;\n\n // set type (input or textarea)\n let inputEl;\n if (type === 'input') {\n inputEl = document.createElement('input');\n inputEl.type = inputType;\n } else if (type === 'textarea') {\n inputEl = document.createElement('textarea');\n } else {\n throw new Error('Unsupported element type');\n }\n\n // mark as required if applicable\n inputEl.required = required;\n\n // If an ID is provided, set it on the element\n if (inputId) {\n inputEl.id = inputId;\n }\n\n // add elements\n wrapper.appendChild(labelEl);\n wrapper.appendChild(inputEl);\n form.appendChild(wrapper);\n}\nconst NewField = {\n shortText: function (label, inputId, required = false, form_id = 'new-form', cost = false) {\n appendFormElement('input', label, inputId, required, 'text', form_id);\n },\n longText: function (label, inputId, required = false, form_id = 'new-form', cost = false) {\n appendFormElement('textarea', label, inputId, required, form_id);\n },\n numericInput: function (label, inputId, required = false, form_id = 'new-form', cost = true) {\n appendFormElement('input', label, inputId, required, 'number', form_id);\n }\n};\n/* harmony default export */ const fields = (NewField);\n;// CONCATENATED MODULE: ./src/js/components/form/subcomponents/submit.js\nfunction addSubmitButtonToForm(form_id) {\n // Find the form by its ID\n const form = document.getElementById(form_id);\n\n // Create the container `div` for the button\n const buttonContainer = document.createElement('div');\n buttonContainer.id = 'submit-btn-container';\n\n // Create the submit input\n const submitInput = document.createElement('input');\n submitInput.className = 'btn btn-submit'; // Use appropriate class for your design\n submitInput.type = 'submit';\n submitInput.value = 'Submit';\n\n // Append the submit input to the container\n buttonContainer.appendChild(submitInput);\n\n // Append the container to the form\n form.appendChild(buttonContainer);\n}\nconst SubmitButton = {\n add: function () {\n addSubmitButtonToForm('new-form');\n }\n};\n/* harmony default export */ const subcomponents_submit = (SubmitButton);\n;// CONCATENATED MODULE: ./src/js/components/form/form.js\n\n\n\n\nfunction fetchAllResponses(event) {\n // Assuming `event.target` is the form itself\n const form = event.target;\n\n // Initialize an empty array to hold the input values\n let formData = {};\n\n // Loop through each form element\n for (let i = 0; i < form.elements.length; i++) {\n const element = form.elements[i];\n\n // Exclude elements that aren't inputs, textareas, or select\n if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT') {\n // Exclude input types that are not considered for submission (such as `submit`)\n if (element.type !== 'submit' && element.type !== 'button') {\n formData[element.id] = element.value;\n }\n }\n }\n form.reset();\n return formData;\n}\nfunction addForm(element_id = 'modal-body', form_id = 'new-form') {\n const target_elem = document.getElementById(element_id);\n\n // create form\n const form = document.createElement('form');\n form.setAttribute('id', form_id);\n\n // Append the form to the modal body\n target_elem.appendChild(form);\n}\nconst Form = {\n new: function (parent_elem_id) {\n addForm(parent_elem_id, 'new-form');\n },\n fetchAllResponses: function (event) {\n return fetchAllResponses(event);\n },\n NewField: fields,\n Dropdown: dropdown,\n SubmitButton: subcomponents_submit\n};\n/* harmony default export */ const js_components_form_form = (Form);\n;// CONCATENATED MODULE: ./src/js/views/06_new_initiatives/helpers.js\n\n\n\n\n\n\n\n\n\nfunction initializePageView() {\n // Prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n components_sidebar_sidebar.show();\n\n // remove fund selection\n localStorage.setItem(\"fund\", '');\n\n // Load text\n components_header_header.update('New Initiatives');\n js_components_prompt_prompt.Text.update('Do you have any new initiatives for FY26?');\n js_components_prompt_prompt.Buttons.Left.updateText('Yes');\n js_components_prompt_prompt.Buttons.Right.updateText('No');\n // clicking 'no new initialitives' will also take us to the next page\n js_components_prompt_prompt.Buttons.Right.addAction(nextPage);\n js_components_prompt_prompt.Buttons.Left.addAction(components_nav_buttons_nav_buttons.Next.enable);\n}\nfunction setUpModal() {\n // Initialize modal\n components_modal_modal.clear();\n components_modal_modal.Link.add('option1');\n components_modal_modal.Title.update('New initiative');\n components_modal_modal.Link.add('add-btn');\n}\nfunction setUpForm() {\n // Set up form\n js_components_form_form.new('modal-body');\n js_components_form_form.NewField.shortText('Initiative Name:', 'Initiative Name', true);\n js_components_form_form.NewField.longText(`Describe what the Initiative is and why it is needed and should be funded: \n i). What is the business case for the Initiative?\n ii). Why is the initiative needed? What is the value-add to residents? What is the Department’s plan for implementing the Initiative?\n iii). Why can’t the Initiative be funded with the Department’s baseline budget?`, 'Explanation', true);\n js_components_form_form.NewField.numericInput('What is your ballpark estimate of TOTAL ADDITONAL expenses associated with this initiative?', 'Ballpark Total', false);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL personnel cost?', 'Personnel Cost', false);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL nonpersonnel cost?', 'Non-personnel Cost', false);\n js_components_form_form.NewField.numericInput('Estimate of ADDITONAL revenue (if applicable)?', 'Revenue', false);\n js_components_form_form.SubmitButton.add();\n // Initialize form submission to table data\n components_modal_modal.Submit.init(handleNewInitSubmission);\n}\nfunction assignClasses() {\n // record columns and their classes\n const initiativesCols = [{\n title: 'Initiative Name',\n className: 'init-name'\n }, {\n title: `Explanation`,\n className: 'explanation'\n }, {\n title: 'Ballpark Total',\n className: 'total',\n isCost: true\n }, {\n title: 'Revenue',\n className: 'revenue',\n isCost: true\n }, {\n title: 'Personnel Cost',\n className: 'personnel',\n isCost: true\n }, {\n title: 'Non-personnel Cost',\n className: 'nonpersonnel',\n isCost: true\n }];\n\n // assign cost classes\n components_table_table.Columns.assignClasses(initiativesCols);\n}\nasync function initializeInitTable() {\n // load table data from storage\n if (await components_table_table.Data.load()) {\n //after table is loaded, fill it\n assignClasses();\n components_table_table.adjustWidth('70%');\n components_table_table.Buttons.AddRow.updateText('Add another new initiative');\n tableView();\n }\n}\nfunction handleNewInitSubmission(event) {\n // get answers from form, hide form, show answers in table\n const responses = js_components_form_form.fetchAllResponses(event);\n // make sure it's not an empty response\n if (Object.values(responses)[0] != '') {\n // add data to table\n components_table_table.Rows.add(responses);\n // save it\n components_table_table.save();\n tableView();\n }\n}\nfunction tableView() {\n // change page view\n components_table_table.show();\n components_modal_modal.hide();\n js_components_prompt_prompt.hide();\n assignClasses();\n components_table_table.Buttons.AddRow.show();\n components_nav_buttons_nav_buttons.Next.enable();\n}\nfunction removeModalLinks() {\n components_modal_modal.Link.remove('option1');\n components_modal_modal.Link.remove('add-btn');\n}\nfunction removePromptButtonListeners() {\n js_components_prompt_prompt.Buttons.Right.removeAction(nextPage);\n js_components_prompt_prompt.Buttons.Left.removeAction(components_nav_buttons_nav_buttons.Next.enable);\n components_modal_modal.clear();\n}\n;// CONCATENATED MODULE: ./src/js/views/06_new_initiatives/main.js\n\n\n\n// set up page and initialize all buttons\nfunction loadNewInitiatives() {\n CurrentPage.update('new-inits');\n initializePageView();\n setUpModal();\n setUpForm();\n initializeInitTable();\n}\nfunction cleanUpInitiativesPage() {\n removeModalLinks();\n // remove event listeners on prompt buttons\n removePromptButtonListeners();\n}\n;// CONCATENATED MODULE: ./src/js/views/07_summary/main.js\n\n\n\n\n\n\n\nfunction loadSummaryPage() {\n //update page state\n CurrentPage.update('summary');\n summaryView();\n}\nfunction cleanUpSummaryPage() {\n js_components_prompt_prompt.Buttons.Right.removeAction(returnToWelcome);\n js_components_prompt_prompt.Buttons.Left.removeAction(downloadXLSX);\n}\nfunction summaryView() {\n components_body_body.reset();\n Accordion.createFromFunds();\n Accordion.show();\n\n // prompt buttons\n js_components_prompt_prompt.Text.update('');\n js_components_prompt_prompt.show();\n js_components_prompt_prompt.Buttons.Left.updateText('Download Excel');\n js_components_prompt_prompt.Buttons.Right.updateText('Go back to home');\n\n // update page text\n components_header_header.update('Summary');\n // add button links\n js_components_prompt_prompt.Buttons.Right.addAction(returnToWelcome);\n js_components_prompt_prompt.Buttons.Left.addAction(downloadXLSX);\n}\nconst returnToWelcome = () => {\n visitPage('welcome');\n};\n;// CONCATENATED MODULE: ./src/js/views/02_baseline_landing_page/helpers.js\n\n\n\n\n\n\nconst fundCols = [{\n title: 'Fund',\n className: 'fund-name'\n}];\nfunction preparePageView() {\n CurrentFund.reset();\n\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n\n // update page text\n components_header_header.update('Baseline Budget Request');\n // TODO: update to make dynamic\n js_components_prompt_prompt.Text.update(`We will now ask you a series of questions about your BASELINE budget request.\n At the end, we will ask you about any new initiatives (ie. supplemental requests).\n Select one of your funds to begin.`);\n}\nfunction allowRowSelection() {\n var tableRows = document.querySelectorAll(\"tbody tr\");\n tableRows.forEach(function (row) {\n row.addEventListener('mouseover', function () {\n this.classList.add('hover-effect');\n });\n row.addEventListener('mouseout', function () {\n this.classList.remove('hover-effect');\n });\n row.addEventListener('click', function () {\n selectFund(tableRows, this);\n });\n });\n}\nasync function initializeFundTable() {\n await components_table_table.Data.loadFunds();\n components_table_table.adjustWidth('30%');\n components_table_table.show();\n components_table_table.Columns.assignClasses(fundCols);\n allowRowSelection();\n}\nfunction selectFund(tableRows, selected_row) {\n // remove selected class from any other rows\n tableRows.forEach(function (tableRow) {\n tableRow.classList = '';\n });\n // add selected class to clicked row\n selected_row.classList.add('selected');\n // get fund and save selected fund\n var fund = selected_row.querySelector('.fund-name').textContent;\n var fundNumber = parseInt(fund);\n CurrentFund.update(fundNumber);\n // enable next step\n components_nav_buttons_nav_buttons.Next.enable();\n}\n;// CONCATENATED MODULE: ./src/js/views/02_baseline_landing_page/main.js\n\n\nfunction loadBaselineLandingPage() {\n //update page state\n CurrentPage.update('baseline-landing');\n preparePageView();\n initializeFundTable();\n}\n;// CONCATENATED MODULE: ./src/js/views/01_upload/helpers.js\n\n\n\n\n\n\nfunction helpers_initializePageView() {\n // remove fund selection\n localStorage.setItem(\"fund\", '');\n\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n FileUpload.show();\n\n // update page text\n components_header_header.update('Excel Upload');\n js_components_prompt_prompt.Text.update(`Upload the baseline detail sheet given by your budget analyst.`);\n\n // show and initialize file upload; enable continue after file saved in local storage \n FileUpload.init();\n components_nav_buttons_nav_buttons.Next.enable();\n}\n;// CONCATENATED MODULE: ./src/js/views/01_upload/main.js\n\n\nfunction loadUploadPage() {\n //update page state\n CurrentPage.update('upload');\n helpers_initializePageView();\n}\n;// CONCATENATED MODULE: ./src/js/views/00_welcome/helpers.js\n\n\n\n\n\n\n\n\nfunction _00_welcome_helpers_initializePageView() {\n // page set up\n components_body_body.reset();\n components_header_header.update(\"Welcome\");\n components_welcome_welcome.show();\n components_sidebar_sidebar.reset();\n}\nfunction addLinks() {\n // initialize links in buttons\n document.getElementById('step-upload').addEventListener('click', loadUploadPage);\n document.getElementById('step-initiatives').addEventListener('click', loadNewInitiatives);\n document.getElementById('step-revenue').addEventListener('click', loadBaselineLandingPage);\n document.getElementById('step-finish').addEventListener('click', loadSummaryPage);\n}\n;// CONCATENATED MODULE: ./src/js/views/00_welcome/main.js\n\n\nfunction initializeWelcomePage() {\n CurrentPage.update('welcome');\n _00_welcome_helpers_initializePageView();\n addLinks();\n}\n;// CONCATENATED MODULE: ./src/js/views/03_revenue/helpers.js\n\n\n\n\n\n\n\n\n\nfunction helpers_preparePageView() {\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n\n // update page text\n components_header_header.update('Revenue Projections');\n // TODO: update to make dynamic\n js_components_prompt_prompt.Text.update(`Your revenue projection for FY26 is ${formatCurrency(REVENUE, true)}`);\n js_components_prompt_prompt.Buttons.Left.updateText('Confirm');\n js_components_prompt_prompt.Buttons.Right.updateText(\"This doesn't look right\");\n}\nfunction setUpNavButtons() {\n // clicking 'confirm' will also take us to the next page\n js_components_prompt_prompt.Buttons.Left.addAction(nextPage);\n // TODO: allow user to edit revenue here\n components_modal_modal.Link.add('option2');\n handleErrorComment();\n}\nfunction removeButtonEvents() {\n // remove event listeners on prompt buttons\n js_components_prompt_prompt.Buttons.Left.removeAction(nextPage);\n components_modal_modal.Link.remove('option2');\n}\nfunction handleErrorComment() {\n var fund = localStorage.getItem(\"fund\");\n components_modal_modal.clear();\n components_modal_modal.Title.update(`Comment on ${fund} Revenue`);\n js_components_form_form.new('modal-body');\n js_components_form_form.NewField.longText('Explain your concerns here. Someone from the revenue team will follow up with you.', 'revenue-comment', true);\n js_components_form_form.SubmitButton.add();\n // save comment on submission\n components_modal_modal.Submit.init(handleRevenueCommentSubmission);\n}\nfunction handleRevenueCommentSubmission(event) {\n // get data from form in modal \n const responses = js_components_form_form.fetchAllResponses(event);\n // TODO: save comment here\n\n // hide modal, update page, and enable continue\n components_modal_modal.hide();\n js_components_prompt_prompt.Buttons.hide();\n js_components_prompt_prompt.Text.update('Your comment has been received.');\n components_nav_buttons_nav_buttons.Next.enable();\n}\n;// CONCATENATED MODULE: ./src/js/views/03_revenue/main.js\n\n\nfunction loadRevenuePage() {\n //update page state\n CurrentPage.update('revenue');\n helpers_preparePageView();\n setUpNavButtons();\n}\nfunction cleanupRevenuePage() {\n removeButtonEvents();\n}\n;\n;// CONCATENATED MODULE: ./src/js/views/04_personnel/helpers.js\n\n\n\n\n\n\n\n\n\n\n\n\nfunction _04_personnel_helpers_preparePageView() {\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n components_sidebar_sidebar.show();\n components_table_table.adjustWidth('90%');\n components_nav_buttons_nav_buttons.Next.enable();\n\n // update page text\n components_header_header.update('Personnel');\n js_components_prompt_prompt.Text.update(`\n This table displays the number of FTEs in each job code for in your department's \n current (amended) FY25 budget. To make edits to the number of positions, click the\n \"Edit\" button on the row you would like to edit. The \"Total Cost\" column and the \n summary sidebar will also update to reflect any edits.\n `);\n}\nfunction helpers_assignClasses() {\n // record columns and their classes\n const personnelColumns = [{\n title: 'Job Title',\n className: 'job-name'\n }, {\n title: 'Account String',\n className: 'string'\n }, {\n title: 'Service',\n className: 'service'\n }, {\n title: `FY${FISCAL_YEAR} Requested FTE`,\n className: 'baseline-ftes'\n }, {\n title: `FY${FISCAL_YEAR} Average Projected Salary/Wage`,\n className: 'avg-salary',\n isCost: true\n }, {\n title: 'Total Cost',\n className: 'total-baseline',\n isCost: true\n }, {\n title: 'Edit',\n className: 'edit'\n }];\n\n // assign cost classes\n components_table_table.Columns.assignClasses(personnelColumns);\n}\nfunction personnelRowOnEdit() {\n components_table_table.Cell.createTextbox('baseline-ftes');\n components_table_table.Cell.createServiceDropdown(Services.list());\n}\nasync function initializePersonnelTable() {\n // load table data from local storage\n if (await components_table_table.Data.load()) {\n //after table is loaded, show it\n components_table_table.show();\n components_table_table.Columns.addAtEnd(components_table_table.Buttons.edit_confirm_btns, 'Edit');\n helpers_assignClasses();\n // add up the baseline costs and update sidebar\n updateDisplayandTotals();\n // activate edit buttons\n components_table_table.Buttons.Edit.init(personnelRowOnEdit, updateDisplayandTotals);\n initializeRowAddition();\n } else {\n js_components_prompt_prompt.Text.update('No personnel expenses for this fund.');\n }\n}\nfunction initializeRowAddition() {\n components_table_table.Buttons.AddRow.updateText(\"Add new job\");\n components_table_table.Buttons.AddRow.show();\n}\nfunction calculateTotalCost(ftes, avg_salary, fringe, cola, merit) {\n return ftes * avg_salary * (1 + fringe) * (1 + cola) * (1 + merit);\n}\n\n// update sidebar and also cost totals when the FTEs are edited\nfunction updateDisplayandTotals() {\n // calculate for each row\n let rows = document.getElementsByTagName('tr');\n for (let i = 1; i < rows.length; i++) {\n // fetch values for calculations\n let avg_salary = components_table_table.Cell.getValue(rows[i], 'avg-salary');\n let baseline_ftes = components_table_table.Cell.getText(rows[i], 'baseline-ftes');\n\n // calcuate #FTEs x average salary + COLA adjustments + merit adjustments + fringe\n let total_baseline_cost = calculateTotalCost(baseline_ftes, avg_salary, fringe, cola, merit);\n\n // update total column\n components_table_table.Cell.updateValue(rows[i], 'total-baseline', total_baseline_cost);\n }\n\n // Save the table after all updates are done\n components_table_table.save();\n}\nfunction helpers_setUpModal() {\n // Initialize modal\n components_modal_modal.clear();\n components_modal_modal.Link.add('add-btn');\n components_modal_modal.Title.update('New job');\n}\nfunction helpers_setUpForm() {\n // Set up form\n js_components_form_form.new('modal-body');\n js_components_form_form.NewField.shortText('Job Name:', 'job-name', true);\n js_components_form_form.NewField.shortText('Account String:', 'account-string', true);\n js_components_form_form.SubmitButton.add();\n // Initialize form submission to table data\n components_modal_modal.Submit.init(handleSubmitNewJob);\n}\nfunction handleSubmitNewJob(event) {\n // get answers from form, hide form, show answers in table\n const responses = js_components_form_form.fetchAllResponses(event);\n // make sure it's not an empty response\n if (Object.values(responses)[0] != '') {\n // change page view\n components_modal_modal.hide();\n\n // add data to table\n components_table_table.Rows.add(responses);\n components_table_table.show();\n components_table_table.Buttons.AddRow.show();\n // TODO: save table data\n // TODO: edit cost to show currency correctly\n }\n}\n;// CONCATENATED MODULE: ./src/js/views/04_personnel/main.js\n\n\nfunction loadPersonnelPage() {\n CurrentPage.update('personnel');\n _04_personnel_helpers_preparePageView();\n initializePersonnelTable();\n helpers_setUpModal();\n helpers_setUpForm();\n}\n;// CONCATENATED MODULE: ./src/js/views/04.5_OT/helpers.js\n\n\n\n\n\n\n\n\nfunction _04_5_OT_helpers_preparePageView() {\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n components_sidebar_sidebar.show();\n\n // enable next button\n components_nav_buttons_nav_buttons.Next.enable();\n\n // update page text\n components_header_header.update('Overtime Estimates');\n\n // activate table\n initializeOTTable();\n js_components_prompt_prompt.Text.update(`Please see your baseline overtime / holiday pay / shift premiums in the table below.\n Make any edits and continue.`);\n}\nfunction _04_5_OT_helpers_assignClasses() {\n // record columns and their classes\n const OT_cols = [{\n title: 'Account String',\n className: 'string'\n }, {\n title: `Cost Center Name`,\n className: 'cc'\n }, {\n title: 'Service',\n className: 'service'\n }, {\n title: 'Recurring or One-Time',\n className: 'recurring'\n }, {\n title: 'Hourly Employee Overtime (Wages)',\n className: 'OT-wages',\n isCost: true\n }, {\n title: 'Salaried Employee Overtime (Salary)',\n className: 'OT-salary',\n isCost: true\n }, {\n title: 'Total Cost (including benefits)',\n className: 'total',\n isCost: true\n }, {\n title: 'Edit',\n className: 'edit'\n }];\n\n // assign cost classes\n components_table_table.Columns.assignClasses(OT_cols);\n}\nfunction OTRowOnEdit() {\n components_table_table.Cell.createTextbox('OT-wages', true);\n components_table_table.Cell.createTextbox('OT-salary', true);\n components_table_table.Cell.createServiceDropdown(Services.list());\n}\nasync function initializeOTTable() {\n // load table data from local storage\n if (await components_table_table.Data.load()) {\n //after table is loaded, fill it\n components_table_table.show();\n components_table_table.Columns.addAtEnd('0', 'Hourly Employee Overtime (Wages)');\n components_table_table.Columns.addAtEnd('0', 'Salaried Employee Overtime (Salary)');\n // Table.Columns.addAtEnd( '0', 'Total Cost (including benefits)');\n components_table_table.Columns.addAtEnd(components_table_table.Buttons.edit_confirm_btns, 'Edit');\n ;\n _04_5_OT_helpers_assignClasses();\n // add up the baseline costs and update sidebar\n helpers_updateDisplayandTotals();\n // activate edit buttons\n components_table_table.Buttons.Edit.init(OTRowOnEdit, helpers_updateDisplayandTotals);\n } else {\n js_components_prompt_prompt.Text.update('No overtime expenses for this fund.');\n }\n}\nfunction helpers_calculateTotalCost(wages, salary, fringe) {\n return (wages + salary) * (1 + fringe);\n}\n\n// update sidebar and also cost totals when the FTEs are edited\nfunction helpers_updateDisplayandTotals() {\n // calculate for each row\n let rows = document.getElementsByTagName('tr');\n for (let i = 1; i < rows.length; i++) {\n // fetch values for calculations\n let OT_salary = components_table_table.Cell.getValue(rows[i], 'OT-salary');\n let OT_wages = components_table_table.Cell.getValue(rows[i], 'OT-wages');\n\n // add salary and wages and fringe benefits (FICA)\n let row_total = helpers_calculateTotalCost(OT_salary, OT_wages, OT_FRINGE);\n\n // update total\n components_table_table.Cell.updateValue(rows[i], 'total', row_total);\n\n //save data\n components_table_table.save();\n }\n}\n;// CONCATENATED MODULE: ./src/js/views/04.5_OT/main.js\n\n\nfunction loadOTPage() {\n //update page state\n CurrentPage.update('overtime');\n _04_5_OT_helpers_preparePageView();\n}\n;// CONCATENATED MODULE: ./src/js/views/05_nonpersonnel/helpers.js\n\n\n\n\n\n\n\n// \"Vendor\": \"Law Firm LLC\",\n// \"CPA #\" : \"765421\",\n// \"Account String\": \"1000-29320-320010\",\n// \"Object Name\": \"Consulting\",\n// \"End of Contract\": \"12/31/2024\",\n// \"Amount Remaining\" : 50000,\n// \"FY26 Request\": 100000\n\nconst nonPersonnelColumns = [{\n title: 'FY26 Request',\n className: 'request',\n isCost: true\n}, {\n title: 'Amount Remaining on Contract',\n className: 'remaining',\n isCost: true\n}, {\n title: 'Service',\n className: 'service'\n}, {\n title: 'Edit',\n className: 'edit'\n}, {\n title: 'Account String',\n className: 'account-string'\n}, {\n title: 'CPA #',\n className: 'cpa'\n}, {\n title: 'Contract End Date',\n className: 'contract-end'\n}, {\n title: 'Recurring or One-Time',\n className: 'recurring'\n}, {\n title: 'Object Name',\n className: 'object'\n}];\nfunction _05_nonpersonnel_helpers_preparePageView() {\n // prepare page view\n components_body_body.reset();\n components_nav_buttons_nav_buttons.show();\n components_sidebar_sidebar.show();\n components_table_table.adjustWidth('100%');\n // update page text\n components_header_header.update('Non-Personnel');\n js_components_prompt_prompt.Text.update('Select an action item for each non-personnel line item from last year.');\n\n // just enable next for now\n // TODO: only enable when all info is entered\n components_nav_buttons_nav_buttons.Next.enable();\n}\nasync function initializeNonpersonnelTable() {\n // load table data from storage\n if (await components_table_table.Data.load()) {\n //after table is loaded, fill it\n components_table_table.show();\n components_table_table.Columns.addAtEnd(components_table_table.Buttons.edit_confirm_btns, \"Edit\");\n // assign cost classes\n components_table_table.Columns.assignClasses(nonPersonnelColumns);\n // enable editing\n components_table_table.Buttons.Edit.init(nonPersonnelRowOnEdit, components_table_table.save);\n } else {\n js_components_prompt_prompt.Text.update('No personnel expenses for this fund.');\n }\n}\nfunction nonPersonnelRowOnEdit() {\n // make it editable\n components_table_table.Cell.createTextbox('request', true);\n components_table_table.Cell.createServiceDropdown();\n}\n;// CONCATENATED MODULE: ./src/js/views/05_nonpersonnel/main.js\n\n\nfunction loadNonpersonnelPage() {\n CurrentPage.update('nonpersonnel');\n _05_nonpersonnel_helpers_preparePageView();\n initializeNonpersonnelTable();\n}\n;// CONCATENATED MODULE: ./src/js/views/view_logic.js\n\n\n\n\n\n\n\n\n\n\n\nlet view_logic_PAGES = {\n 'welcome': initializeWelcomePage,\n 'upload': loadUploadPage,\n 'baseline-landing': loadBaselineLandingPage,\n 'revenue': loadRevenuePage,\n 'personnel': loadPersonnelPage,\n 'overtime': loadOTPage,\n 'nonpersonnel': loadNonpersonnelPage,\n 'new-inits': loadNewInitiatives,\n 'summary': loadSummaryPage\n};\nlet CLEANUP = {\n 'new-inits': cleanUpInitiativesPage,\n 'revenue': cleanupRevenuePage,\n 'summary': cleanUpSummaryPage\n};\nfunction visitPage(new_page_key) {\n // clean up from current page\n var page_state = CurrentPage.load();\n if (CLEANUP[page_state]) {\n CLEANUP[page_state]();\n }\n ;\n // Use the page_state to access and call the corresponding function from PAGES\n if (view_logic_PAGES[new_page_key]) {\n view_logic_PAGES[new_page_key](); // Invokes the function if it exists in the PAGES map\n } else {\n console.error(`No page initializer found for state: ${new_page_key}`);\n }\n}\nfunction nextPage() {\n var page_state = CurrentPage.load();\n const keys = Object.keys(view_logic_PAGES);\n\n // Find the index of the current key\n const currentIndex = keys.indexOf(page_state);\n\n // clean up current page\n if (CLEANUP[page_state]) {\n CLEANUP[page_state]();\n }\n ;\n\n // Check if there is a next key\n if (currentIndex >= 0 && currentIndex < keys.length - 1) {\n // Get the next key\n const nextKey = keys[currentIndex + 1];\n // go to that page\n visitPage(nextKey);\n }\n}\nfunction lastPage() {\n var page_state = CurrentPage.load();\n const keys = Object.keys(view_logic_PAGES);\n\n // Find the index of the current key\n const currentIndex = keys.indexOf(page_state);\n\n // clean up current page\n if (CLEANUP[page_state]) {\n CLEANUP[page_state]();\n }\n ;\n\n // Check if there is a next key\n if (currentIndex >= 1) {\n // Get the next key\n const lastKey = keys[currentIndex - 1];\n // go to that page\n visitPage(lastKey);\n }\n}\n;// CONCATENATED MODULE: ./src/js/utils/data_utils/JSON_data_handlers.js\nasync function JSON_data_handlers_fetchJSON(jsonFilePath) {\n return fetch(jsonFilePath).then(response => {\n if (!response.ok) {\n throw new Error('Network response was not ok');\n }\n return response.json();\n });\n}\nfunction convertToJSON(table, colsToRemove = []) {\n const rows = table.rows;\n // Extract headers from the first row\n const headerRow = rows[0].cells;\n const headers = [];\n for (let j = 0; j < headerRow.length; j++) {\n headers.push(headerRow[j].innerText);\n }\n\n // initialize data\n var tableData = [];\n for (var i = 1; i < rows.length; i++) {\n const cols = rows[i].cells;\n const rowData = {};\n headers.forEach((header, index) => {\n if (colsToRemove.includes(header)) {\n return;\n } else if (cols[index].classList.contains('cost')) {\n rowData[header] = cols[index].getAttribute('value');\n } else {\n rowData[header] = cols[index].innerText;\n }\n });\n tableData.push(rowData);\n }\n return JSON.stringify(tableData);\n}\n;// CONCATENATED MODULE: ./src/js/utils/data_utils/local_storage_handlers.js\n\n\n\n\n\n\nconst CurrentPage = {\n update: function (page) {\n localStorage.setItem('page_state', page);\n },\n load: function () {\n const pageState = localStorage.getItem('page_state');\n return pageState !== null ? pageState : 'welcome';\n },\n visit: function () {\n visitPage(this.load());\n }\n};\nconst CurrentFund = {\n update: function (fund) {\n localStorage.setItem('fund', fund);\n },\n number: function () {\n return localStorage.getItem(\"fund\");\n },\n name: function () {\n return FundLookupTable.getName(this.number());\n },\n reset: function () {\n this.update('');\n }\n};\n\n// TODO: consider moving this into a const for Current Table (or to the table component)\nfunction saveTableData() {\n var table = document.getElementById('main-table');\n if (CurrentFund.number()) {\n var save_as = `${CurrentPage.load()}_${CurrentFund.number()}`;\n } else {\n var save_as = CurrentPage.load();\n }\n localStorage.setItem(save_as, convertToJSON(table, ['Edit']));\n components_sidebar_sidebar.updateTotals();\n}\nfunction deleteTable(name) {\n localStorage.setItem(name, '');\n}\nasync function deleteAllTables() {\n var funds = await fetchJSON(DATA_ROOT + 'funds.json');\n funds = funds.map(item => {\n return item.Name;\n });\n for (const page in PAGES) {\n for (const i in funds) {\n deleteTable(`${page}_${funds[i]}`);\n }\n }\n deleteTable('new-inits');\n}\nfunction loadTableData(name) {\n const data = localStorage.getItem(name);\n if (data == '') {\n return '';\n }\n return JSON.parse(data);\n}\n\n// Class to hold information on a specific fund and table\nclass StoredTable {\n constructor(page, fund) {\n this.name = `${page}_${fund}`;\n this.page = page;\n this.table = loadTableData(this.name);\n }\n totalCol() {\n switch (this.page) {\n case 'personnel':\n return 'Total Cost';\n case 'overtime':\n return 'Total Cost (including benefits)';\n case 'nonpersonnel':\n return `FY${FISCAL_YEAR} Request`;\n case 'revenue':\n break;\n default:\n break;\n }\n }\n getSum() {\n // fill with zero until there is something saved in storage\n return colSum(this.table, this.totalCol(), this.name);\n }\n}\nfunction colSum(table, colName, name) {\n // fill with zero until there is something saved in storage\n if (!table || table == '') {\n return 0;\n }\n const headers = Object.keys(table[0]);\n if (headers.includes(colName)) {\n let sum = 0;\n for (let i = 0; i < table.length; i++) {\n sum += Math.round(parseFloat(table[i][colName]));\n }\n return sum;\n } else {\n // console.error(`Could not find expected total column in saved data for ${name}. Returning 0. See StoredTable.totalCol() switch.`);\n return 0;\n }\n}\n\n// Holds all the detailed data for one fund's budget\nclass Fund {\n constructor(fund) {\n this.fund = fund;\n this.personnel = new StoredTable('personnel', fund);\n this.overtime = new StoredTable('overtime', fund);\n this.nonpersonnel = new StoredTable('nonpersonnel', fund);\n this.revenue = new StoredTable('revenue', fund);\n }\n getPersonnelCost() {\n return this.personnel.getSum() + this.overtime.getSum();\n }\n getNonPersonnelCost() {\n return this.nonpersonnel.getSum();\n }\n getRevenue() {\n return this.revenue.getSum();\n }\n getTotal() {\n return this.getNonPersonnelCost() + this.getPersonnelCost() - this.getRevenue();\n }\n}\nclass Baseline {\n // baseline will just contain a list of funds\n constructor() {\n const allFunds = FundLookupTable.listFunds();\n this.funds = [];\n allFunds.forEach(fund => {\n this.funds.push(new Fund(fund));\n });\n }\n personnel() {\n let total = 0;\n this.funds.forEach(fund => {\n total += fund.getPersonnelCost();\n });\n return total;\n }\n nonpersonnel() {\n let total = 0;\n this.funds.forEach(fund => {\n total += fund.getNonPersonnelCost();\n });\n return total;\n }\n revenue() {\n let total = 0;\n this.funds.forEach(fund => {\n total += fund.getRevenue();\n });\n return total;\n }\n total() {\n return this.nonpersonnel() + this.personnel() - this.revenue();\n }\n}\nclass Supplemental {\n constructor() {\n this.table = loadTableData('new-inits');\n }\n getInits() {\n return this.table.map(item => {\n return item['Initiative Name'];\n });\n }\n personnel() {\n return colSum(this.table, 'Personnel Cost');\n }\n nonpersonnel() {\n return colSum(this.table, 'Non-personnel Cost');\n }\n revenue() {\n return colSum(this.table, 'Revenue');\n }\n total() {\n return this.personnel() + this.nonpersonnel() - this.revenue();\n }\n}\n;// CONCATENATED MODULE: ./src/js/init.js\n// import styles\n\n\n// import functions\n\n\n// path for my laptop\nlet init_DATA_ROOT = '../../../data/law_dept_sample/';\n// github path\n// export let DATA_ROOT = '../../budget-request-demo/data/law_dept_sample/'\n\nlet REVENUE = 0;\nlet TARGET = 14000000;\nvar FISCAL_YEAR = '26';\nvar OT_FRINGE = 0.0765;\n\n// variables on the salary \nvar fringe = 0.36;\nvar cola = 0.02;\nvar merit = 0.02;\n\n// sheets to expect on detail sheet\nconst SHEETS = {\n 'FTE, Salary-Wage, & Benefits': 'personnel',\n 'Overtime & Other Personnel': 'overtime',\n 'Non-Personnel Operating': 'nonpersonnel',\n 'Revenue': 'revenue'\n};\ndocument.addEventListener('DOMContentLoaded', function () {\n CurrentPage.visit();\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTczLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hCQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQzdCQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQy9EQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDMUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7O0FDL0JBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNwRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDck1BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTs7QUNwSUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDakRBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSkE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hCQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ2xFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNsQkE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNwREE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBOztBQ3pCQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25IQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFBQTtBQUFBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUN4QkE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7O0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUN2SUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hGQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7QUNqTkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9jc3MvY29tbW9uLmNzcz84ZmY2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9zaWRlYmFyL3NpZGViYXIuY3NzPzNiYzciLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy91dGlscy9jb21tb25fdXRpbHMuanM/NDRmMiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvc2lkZWJhci9zaWRlYmFyLmpzPzgwZjAiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuY3NzPzcyZDciLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanM/YTBhNSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvd2VsY29tZS93ZWxjb21lLmNzcz9kZWUxIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuanM/NTM1YSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvYm9keS9ib2R5LmNzcz9kMWM3Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9hY2NvcmRpb24vYWNjb3JkaW9uLmNzcz81YTZjIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS90YWJsZS5jc3M/Nzg0YyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvc3ViY29tcG9uZW50cy9oZWFkZXJzLmpzPzE2MjMiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3N1YmNvbXBvbmVudHMvcm93cy5qcz9mYjc5Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS9zdWJjb21wb25lbnRzL2J1dHRvbnMuanM/Yzk5MiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3V0aWxzL2RhdGFfdXRpbHMvYnVkZ2V0X2RhdGFfaGFuZGxlcnMuanM/MDdmNyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvZm9ybS9zdWJjb21wb25lbnRzL2Ryb3Bkb3duLmpzP2JhNmIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3N1YmNvbXBvbmVudHMvY2VsbHMuanM/NzNjYiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvdGFibGUvc3ViY29tcG9uZW50cy9jb2x1bW5zLmpzPzY3NGEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3RhYmxlL3N1YmNvbXBvbmVudHMvZGF0YS5qcz9kOWI2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS90YWJsZS5qcz8zMDcxIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9hY2NvcmRpb24vYWNjb3JkaW9uLmpzPzFmMzciLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2ZpbGVfdXBsb2FkL2ZpbGVfdXBsb2FkLmNzcz9kYjA5Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdXRpbHMvZGF0YV91dGlscy9YTFNYX2hhbmRsZXJzLmpzP2NhMjIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2ZpbGVfdXBsb2FkL2ZpbGVfdXBsb2FkLmpzPzUxODgiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL21vZGFsL21vZGFsLmNzcz80MGRiIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9tb2RhbC9tb2RhbC5qcz81NTMzIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5jc3M/NzA3ZiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanM/YWJkMSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5jc3M/MzI4YiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvcHJvbXB0L3N1YmNvbXBvbmVudHMvdGV4dC5qcz9mNmRmIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9wcm9tcHQvc3ViY29tcG9uZW50cy9idXR0b25zLmpzPzhkM2IiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuanM/YTc3MSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvYm9keS9ib2R5LmpzP2Y5YmEiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2Zvcm0vZm9ybS5jc3M/NTQxNSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvZm9ybS9zdWJjb21wb25lbnRzL2ZpZWxkcy5qcz80NTlmIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL3N1YmNvbXBvbmVudHMvc3VibWl0LmpzP2M1OTYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2Zvcm0vZm9ybS5qcz9kOTQyIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDZfbmV3X2luaXRpYXRpdmVzL2hlbHBlcnMuanM/NjE1MiIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzA2X25ld19pbml0aWF0aXZlcy9tYWluLmpzP2RjY2QiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wN19zdW1tYXJ5L21haW4uanM/MDA1OSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzAyX2Jhc2VsaW5lX2xhbmRpbmdfcGFnZS9oZWxwZXJzLmpzPzk1YjYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wMl9iYXNlbGluZV9sYW5kaW5nX3BhZ2UvbWFpbi5qcz9kNDU4Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDFfdXBsb2FkL2hlbHBlcnMuanM/NWZiZSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzAxX3VwbG9hZC9tYWluLmpzPzJhOGYiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wMF93ZWxjb21lL2hlbHBlcnMuanM/ZTc5YyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzAwX3dlbGNvbWUvbWFpbi5qcz9iZWE2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDNfcmV2ZW51ZS9oZWxwZXJzLmpzPzY1ZjIiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wM19yZXZlbnVlL21haW4uanM/MDY0NyIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzA0X3BlcnNvbm5lbC9oZWxwZXJzLmpzPzg3N2MiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wNF9wZXJzb25uZWwvbWFpbi5qcz81MTI2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3MvMDQuNV9PVC9oZWxwZXJzLmpzPzU0MzkiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wNC41X09UL21haW4uanM/NjU3OSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3ZpZXdzLzA1X25vbnBlcnNvbm5lbC9oZWxwZXJzLmpzP2Y4ODAiLCJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy92aWV3cy8wNV9ub25wZXJzb25uZWwvbWFpbi5qcz9hZmNjIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdmlld3Mvdmlld19sb2dpYy5qcz80NmM2Iiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvdXRpbHMvZGF0YV91dGlscy9KU09OX2RhdGFfaGFuZGxlcnMuanM/NzY3YSIsIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL3V0aWxzL2RhdGFfdXRpbHMvbG9jYWxfc3RvcmFnZV9oYW5kbGVycy5qcz9mZTgxIiwid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvaW5pdC5qcz8xYjJhIl0sInNvdXJjZXNDb250ZW50IjpbIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9jb21tb24uY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vY29tbW9uLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zaWRlYmFyLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NpZGViYXIuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiLy8gRnVuY3Rpb24gdG8gZm9ybWF0IG51bWJlciBhcyBjdXJyZW5jeVxyXG5leHBvcnQgY29uc3QgZm9ybWF0Q3VycmVuY3kgPSAoYW1vdW50LCByZXR1cm5femVybyA9IGZhbHNlKSA9PiB7XHJcbiAgICB2YXIgYW1vdW50ID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGFtb3VudCkpO1xyXG4gICAgaWYgKGFtb3VudCA9PSBOYU4pe1xyXG4gICAgICAgIHJldHVybiBcIiQgLVwiXHJcbiAgICB9XHJcbiAgICBpZiAoYW1vdW50IDwgMCl7XHJcbiAgICAgICAgcmV0dXJuICcoJCcgKyBhbW91bnQudG9TdHJpbmcoKS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLCcpICsgJyknO1xyXG4gICAgfSBlbHNlIGlmIChhbW91bnQgPT0gMCkge1xyXG4gICAgICAgIGlmIChyZXR1cm5femVybyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnJDAnOyAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiJCAtXCJcclxuICAgIH1cclxuICAgIHJldHVybiAnJCcgKyBhbW91bnQudG9TdHJpbmcoKS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLCcpO1xyXG59IDtcclxuXHJcbi8vIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZm9ybWF0dGVkIG51bWJlciB0byBhIGZsb2F0XHJcbmV4cG9ydCBjb25zdCB1bmZvcm1hdEN1cnJlbmN5ID0gKGZvcm1hdHRlZEFtb3VudCkgPT4ge1xyXG4gICAgLy8gUmVtb3ZlIGFueSBjdXJyZW5jeSBzeW1ib2xzIGFuZCBjb21tYXNcclxuICAgIGxldCBudW1lcmljYWxQYXJ0ID0gZm9ybWF0dGVkQW1vdW50LnJlcGxhY2UoL1teMC05Li1dKy9nLCBcIlwiKTtcclxuICAgIGlmIChudW1lcmljYWxQYXJ0ID09ICctJyl7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdChudW1lcmljYWxQYXJ0KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkaXNwbGF5V2l0aENvbW1hcyh2YWx1ZSkge1xyXG4gICAgaWYgKHZhbHVlID09IDApe1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZvcm1hdEN1cnJlbmN5KHZhbHVlKS5yZXBsYWNlKCckJywgJycpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBkZWxheShtcykge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGF1c2VFeGVjdXRpb24oc2Vjb25kcykge1xyXG4gICAgYXdhaXQgZGVsYXkoc2Vjb25kcyAqIDEwMDApOyAvLyBjb252ZXJ0IHRvIG1pbGxpc2Vjb25kc1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5TdHJpbmcoc3RyKXtcclxuICAgIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKS5yZXBsYWNlQWxsKCcgJywgJy0nKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU5ld0xpbmVzKHN0cil7XHJcbiAgICAvLyBUT0RPOiBlbnN1cmUgdGhlcmUgaXMgYSBzcGFjZSBiZXR3ZWVuIHdvcmRzIG9uIG5ldyBsaW5lc1xyXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlQWxsKC9bXFxyXFxuXSsvZywgXCJcIik7XHJcbn0iLCJpbXBvcnQgJy4vc2lkZWJhci5jc3MnO1xyXG5cclxuaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3kgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzXCI7XHJcbmltcG9ydCB7IFRBUkdFVCB9IGZyb20gXCIuLi8uLi9pbml0LmpzXCI7XHJcbmltcG9ydCB7IEJhc2VsaW5lLCBTdXBwbGVtZW50YWwgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZGF0YV91dGlscy9sb2NhbF9zdG9yYWdlX2hhbmRsZXJzLmpzXCI7XHJcblxyXG4vLyBBc3N1bWluZyB5b3UgaGF2ZSBhIENTUyB2YXJpYWJsZSAtLW1haW4tY29sb3IgZGVmaW5lZCBvbiB0aGUgOnJvb3RcclxuY29uc3Qgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuY29uc3Qgc2lkZUJhcldpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNpZGViYXItd2lkdGgnKS50cmltKCk7XHJcblxyXG5mdW5jdGlvbiBoaWRlU2lkZWJhcigpIHtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLXBhbmVsJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXBhbmVsJykuc3R5bGUud2lkdGggPSAnMTAwJSc7IFxyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZGVyJykuc3R5bGUud2lkdGggPSAnMTAwJSdcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd1NpZGViYXIoKSB7XHJcbiAgICBjb25zdCBzaWRlYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpZGViYXItcGFuZWwnKTtcclxuICAgIGNvbnN0IG1haW5QYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXBhbmVsJyk7XHJcbiAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkZXInKTtcclxuXHJcbiAgICBzaWRlYmFyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyAvLyBTaG93IHRoZSBzaWRlYmFyXHJcbiAgICBcclxuICAgIC8vIENhbGN1bGF0ZSB0aGUgcmVtYWluaW5nIHdpZHRoIGZvciB0aGUgbWFpbiBwYW5lbCBhbmQgaGVhZGVyXHJcbiAgICB2YXIgY29udGVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gICAgbWFpblBhbmVsLnN0eWxlLndpZHRoID0gYCR7Y29udGVudFdpZHRoIC0gcGFyc2VJbnQoc2lkZUJhcldpZHRoLCAxMCl9cHhgOyBcclxuICAgIGhlYWRlci5zdHlsZS53aWR0aCA9IGAke2NvbnRlbnRXaWR0aCAtIHBhcnNlSW50KHNpZGVCYXJXaWR0aCwgMTApfXB4YDsgXHJcblxyXG4gICAgLy8gYWRkIHRhcmdldCB0byBzaWRlYmFyXHJcbiAgICBhZGRUYXJnZXQoVEFSR0VUKTtcclxuXHJcbiAgICAvLyBhZGQgZXZlbnQgbGlzdGVuZXIgdG8gcmVzaXplIGNvbnRlbnQgaWYgd2luZG93IGlzIGFkanVzdGVkXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgc2hvd1NpZGViYXIpO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVTaWRlYmFyVGl0bGUobmV3X3RpdGxlKXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLXRpdGxlJykudGV4dENvbnRlbnQgPSBuZXdfdGl0bGU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlcGxhY2VTaWRlYmFyU3RhdChzdGF0X2lkLCBuZXdfZmlndXJlKXtcclxuICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtzdGF0X2lkfSAuc3RhdGApO1xyXG4gICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgbmV3X2ZpZ3VyZSk7XHJcbiAgICBzcGFuLnRleHRDb250ZW50ID0gZm9ybWF0Q3VycmVuY3kobmV3X2ZpZ3VyZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZldGNoU3RhdChzdGF0X2lkKXtcclxuICAgIGNvbnN0IHN0YXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtzdGF0X2lkfSAuc3RhdGApO1xyXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RhdC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpIHx8IDA7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBhZGRUYXJnZXQodGFyZ2V0KXtcclxuICAgIHJlcGxhY2VTaWRlYmFyU3RhdCgndGFyZ2V0JywgdGFyZ2V0KTtcclxufVxyXG5cclxuLy8gdXBkYXRlIGFsbCBzdGF0cyBiYXNlZCBvbiBzYXZlZCBkYXRhXHJcbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUJhc2VsaW5lKCl7XHJcbiAgICAvLyBnYXRoZXIgaW5mbyBhbmQgdXBkYXRlIHNpZGViYXIgYWNjb3JkaW5nbHlcclxuICAgIHZhciBiYXNlbGluZSA9IG5ldyBCYXNlbGluZSgpO1xyXG4gICAgcmVwbGFjZVNpZGViYXJTdGF0KCdiYXNlbGluZS1yZXZlbnVlJywgYmFzZWxpbmUucmV2ZW51ZSgpKTtcclxuICAgIHJlcGxhY2VTaWRlYmFyU3RhdCgnYmFzZWxpbmUtcGVyc29ubmVsJywgYmFzZWxpbmUucGVyc29ubmVsKCkpO1xyXG4gICAgcmVwbGFjZVNpZGViYXJTdGF0KCdiYXNlbGluZS1ub25wZXJzb25uZWwnLCBiYXNlbGluZS5ub25wZXJzb25uZWwoKSk7XHJcbiAgICByZXBsYWNlU2lkZWJhclN0YXQoJ2Jhc2VsaW5lLXRvdGFsJywgYmFzZWxpbmUudG90YWwoKSk7XHJcblxyXG4gICAgLy8gY29sb3IgY29kZSBiYXNlZCBvbiB0YXJnZXRcclxuICAgIHZhciB0YXJnZXQgPSBmZXRjaFN0YXQoJ3RhcmdldCcpO1xyXG4gICAgaWYoYmFzZWxpbmUudG90YWwoKSA8PSB0YXJnZXQpe1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiYXNlbGluZS10b3RhbCAuc3RhdCcpLnN0eWxlLmNvbG9yID0gXCJncmVlblwiO1xyXG4gICAgfVxyXG4gICAgaWYoYmFzZWxpbmUudG90YWwoKSA+IHRhcmdldCl7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Jhc2VsaW5lLXRvdGFsIC5zdGF0Jykuc3R5bGUuY29sb3IgPSBcInJlZFwiO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVTdXBwKCl7XHJcbiAgICB2YXIgc3VwcCA9IG5ldyBTdXBwbGVtZW50YWw7XHJcbiAgICByZXBsYWNlU2lkZWJhclN0YXQoJ3N1cHAtcmV2ZW51ZScsIHN1cHAucmV2ZW51ZSgpKTtcclxuICAgIHJlcGxhY2VTaWRlYmFyU3RhdCgnc3VwcC1wZXJzb25uZWwnLCBzdXBwLnBlcnNvbm5lbCgpKTtcclxuICAgIHJlcGxhY2VTaWRlYmFyU3RhdCgnc3VwcC1ub25wZXJzb25uZWwnLCBzdXBwLm5vbnBlcnNvbm5lbCgpKTtcclxuICAgIHJlcGxhY2VTaWRlYmFyU3RhdCgnc3VwcC10b3RhbCcsIHN1cHAudG90YWwoKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVRvdGFscygpe1xyXG4gICAgdXBkYXRlQmFzZWxpbmUoKTtcclxuICAgIHVwZGF0ZVN1cHAoKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVzZXRBbGwoKXtcclxuICAgIC8vIGRlbGV0ZSBldmVyeXRoaW5nIGluIGxvY2FsIHN0b3JhZ2VcclxuICAgIGxvY2FsU3RvcmFnZS5jbGVhcigpO1xyXG4gICAgLy8gcmVzZXQgYWxsIHN0YXRzIHRvIDBcclxuICAgIHVwZGF0ZVRvdGFscygpO1xyXG59XHJcblxyXG5jb25zdCBTaWRlYmFyID0ge1xyXG4gICAgaGlkZTogaGlkZVNpZGViYXIsXHJcbiAgICBzaG93OiBzaG93U2lkZWJhcixcclxuICAgIHVwZGF0ZVRpdGxlOiB1cGRhdGVTaWRlYmFyVGl0bGUsXHJcbiAgICBhZGRUYXJnZXQ6IGFkZFRhcmdldCxcclxuICAgIHVwZGF0ZVRvdGFsczogdXBkYXRlVG90YWxzLFxyXG4gICAgcmVzZXQ6IHJlc2V0QWxsXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTaWRlYmFyOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9oZWFkZXIuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vaGVhZGVyLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsImltcG9ydCAnLi9oZWFkZXIuY3NzJztcclxuXHJcbmltcG9ydCB7IEN1cnJlbnRGdW5kIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2RhdGFfdXRpbHMvbG9jYWxfc3RvcmFnZV9oYW5kbGVycy5qc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IFN1YnRpdGxlID0ge1xyXG4gICAgdXBkYXRlIDogZnVuY3Rpb24oc3VidGl0bGUpe1xyXG4gICAgICAgIC8vIGdldCBjdXJyZW50IGZ1bmRcclxuICAgICAgICB2YXIgZnVuZCA9IEN1cnJlbnRGdW5kLm5hbWUoKTtcclxuICAgICAgICBpZiAoZnVuZCl7XHJcbiAgICAgICAgICAgIHZhciBzdWJ0aXRsZSA9IGAke3N1YnRpdGxlfTogJHtmdW5kfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3VidGl0bGVcIikudGV4dENvbnRlbnQgPSBzdWJ0aXRsZTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3VidGl0bGU7IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3dlbGNvbWUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vd2VsY29tZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJpbXBvcnQgJy4vd2VsY29tZS5jc3MnO1xyXG5cclxuLy8gSGlkZSBhbmQgdW5oaWRlIHdlbGNvbWUgYnV0dG9uc1xyXG5mdW5jdGlvbiB1bmhpZGVXZWxjb21lQnV0dG9ucygpe1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ3ZWxjb21lLXBhZ2VcIikuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcclxufVxyXG5mdW5jdGlvbiBoaWRlV2VsY29tZUJ1dHRvbnMoKXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwid2VsY29tZS1wYWdlXCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFdlbGNvbWUgPSB7XHJcbiAgICBzaG93OiB1bmhpZGVXZWxjb21lQnV0dG9ucyxcclxuICAgIGhpZGUgOiBoaWRlV2VsY29tZUJ1dHRvbnNcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2VsY29tZTsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vYm9keS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9ib2R5LmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9hY2NvcmRpb24uY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vYWNjb3JkaW9uLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90YWJsZS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcbm9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90YWJsZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJmdW5jdGlvbiBhZGRUYWJsZUhlYWRlcnMoaGVhZGVyX2FycmF5KXtcclxuXHJcbiAgICAvLyBHZXQgdGhlIHRhYmxlIGVsZW1lbnQgYnkgaXRzIElEXHJcbiAgICBjb25zdCB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcbiAgICBcclxuICAgIC8vIENyZWF0ZSBhIHRhYmxlIGhlYWRlciByb3cgZWxlbWVudFxyXG4gICAgY29uc3QgaGVhZGVyUm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcclxuICAgIFxyXG4gICAgZm9yIChjb25zdCBoZWFkZXJUZXh0IG9mIGhlYWRlcl9hcnJheSkge1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgYSBoZWFkZXIgY2VsbCBlbGVtZW50XHJcbiAgICAgICAgY29uc3QgaGVhZGVyQ2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJyk7XHJcbiAgICAgICAgaGVhZGVyQ2VsbC50ZXh0Q29udGVudCA9IGhlYWRlclRleHQ7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwZW5kIHRoZSBoZWFkZXIgY2VsbCB0byB0aGUgaGVhZGVyIHJvd1xyXG4gICAgICAgIGhlYWRlclJvdy5hcHBlbmRDaGlsZChoZWFkZXJDZWxsKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gQXBwZW5kIHRoZSBoZWFkZXIgcm93IHRvIHRoZSB0YWJsZSBoZWFkZXJcclxuICAgIGxldCB0aGVhZCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkJyk7XHJcbiAgICB0aGVhZC5hcHBlbmRDaGlsZChoZWFkZXJSb3cpO1xyXG59XHJcblxyXG5jb25zdCBIZWFkZXIgPSB7XHJcbiAgICBhZGQ6IGZ1bmN0aW9uKGhlYWRlcl9hcnJheSl7XHJcbiAgICAgICAgYWRkVGFibGVIZWFkZXJzKGhlYWRlcl9hcnJheSlcclxuICAgIH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEhlYWRlcjsiLCJpbXBvcnQgSGVhZGVyIGZyb20gXCIuL2hlYWRlcnMuanNcIjtcclxuaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3kgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzXCI7XHJcblxyXG5hc3luYyBmdW5jdGlvbiBhZGROZXdSb3coZGF0YV9kaWN0aW9uYXJ5KXtcclxuICAgIC8vIEdldCB0aGUgdGFibGUgZWxlbWVudCBieSBpdHMgSURcclxuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuXHJcbiAgICAvLyBjaGVjayBpZiBoZWFkZXIgaGFzIGFscmVhZHkgYmVlbiBhZGRlZFxyXG4gICAgbGV0IGhlYWRlcl9yb3cgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCB0cicpO1xyXG4gICAgaWYgKCFoZWFkZXJfcm93KSB7XHJcbiAgICAgICAgSGVhZGVyLmFkZChPYmplY3Qua2V5cyhkYXRhX2RpY3Rpb25hcnkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhZGQgcm93IG9mIGRhdGFcclxuICAgIGNvbnN0IG5ld19yb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xyXG4gICAgY29uc3QgY2VsbF9kYXRhX2FycmF5ID0gT2JqZWN0LnZhbHVlcyhkYXRhX2RpY3Rpb25hcnkpO1xyXG5cclxuICAgIGZvciAoY29uc3QgY2VsbF9kYXRhIG9mIGNlbGxfZGF0YV9hcnJheSkge1xyXG4gICAgICAgIC8vIENyZWF0ZSBuZXcgY2VsbCBhbmQgYWRkIGl0IHRvIHRoZSByb3dcclxuICAgICAgICBjb25zdCBuZXdDZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcclxuICAgICAgICBuZXdDZWxsLnRleHRDb250ZW50ID0gY2VsbF9kYXRhO1xyXG4gICAgICAgIG5ld19yb3cuYXBwZW5kQ2hpbGQobmV3Q2VsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQXBwZW5kIHRoZSBuZXcgcm93IHRvIHRoZSB0YWJsZSBib2R5XHJcbiAgICBsZXQgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xyXG4gICAgdGJvZHkuYXBwZW5kQ2hpbGQobmV3X3Jvdyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNhdmVSb3dFZGl0cyhyb3cpe1xyXG4gICAgdmFyIGNlbGxzID0gcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJylcclxuICAgIGNlbGxzLmZvckVhY2goIGNlbGwgPT4ge1xyXG4gICAgICAgIC8vIHNhdmUgZHJvcGRvd24gdmFsdWVzXHJcbiAgICAgICAgaWYgKGNlbGwucXVlcnlTZWxlY3Rvcignc2VsZWN0Jykpe1xyXG4gICAgICAgICAgICB2YXIgc2VydmljZVNlbGVjdG9yID0gY2VsbC5xdWVyeVNlbGVjdG9yKCdzZWxlY3QnKTtcclxuICAgICAgICAgICAgY2VsbC50ZXh0Q29udGVudCA9IHNlcnZpY2VTZWxlY3Rvci52YWx1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNlbGwucXVlcnlTZWxlY3RvcignaW5wdXQnKSkge1xyXG4gICAgICAgICAgICAvLyBzYXZlIG5ldyBlbnRlcmVkIHZhbHVlIGluIHRleHRib3hcclxuICAgICAgICAgICAgdmFyIHRleHRib3ggPSBjZWxsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcbiAgICAgICAgICAgIHZhciBlbnRlcmVkVmFsdWUgPSB0ZXh0Ym94LnZhbHVlO1xyXG4gICAgICAgICAgICAvLyB1cGRhdGUgZGlzcGxheSBhbmQgZm9ybWF0IHdpdGggY3VycmVuY3kgaWYgcmVsZXZhbnRcclxuICAgICAgICAgICAgaWYgKCBjZWxsLmNsYXNzTGlzdC5jb250YWlucygnY29zdCcpICl7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiBjb3N0LCByZW1vdmUgY29tbWFzIGZpcnN0XHJcbiAgICAgICAgICAgICAgICBlbnRlcmVkVmFsdWUgPSBlbnRlcmVkVmFsdWUucmVwbGFjZUFsbCgnLCcsICcnKTtcclxuICAgICAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBmb3JtYXRDdXJyZW5jeShlbnRlcmVkVmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2VsbC50ZXh0Q29udGVudCA9IGVudGVyZWRWYWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBzZXQgdmFsdWUgYXR0cmlidXRlIHRvIHRoZSBuZXcgdXNlciBpbnB1dFxyXG4gICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBlbnRlcmVkVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbn1cclxuXHJcbmNvbnN0IFJvd3MgPSB7XHJcbiAgICBhZGQgOiBmdW5jdGlvbihkYXRhX2RpY3Rpb25hcnkpe1xyXG4gICAgICAgIGFkZE5ld1JvdyhkYXRhX2RpY3Rpb25hcnkpXHJcbiAgICB9LFxyXG4gICAgc2F2ZUVkaXRzIDogZnVuY3Rpb24ocm93KXtcclxuICAgICAgICBzYXZlUm93RWRpdHMocm93KVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSb3dzOyIsImltcG9ydCBSb3dzIGZyb20gJy4vcm93cy5qcydcclxuXHJcbmZ1bmN0aW9uIGhpZGVCdXR0b24oY2xhc3NOYW1lKXtcclxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcclxuICAgICAgICB2YXIgYnV0dG9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1dHRvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgYnV0dG9uc1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd0J1dHRvbihjbGFzc05hbWUpe1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHZhciBidXR0b25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnV0dG9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBidXR0b25zW2ldLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZUJ1dHRvblRleHQoY2xhc3NOYW1lLCB0ZXh0KXtcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2NsYXNzTmFtZX1gKS50ZXh0Q29udGVudCA9IHRleHQ7XHJcbn1cclxuXHJcbi8vIEVESVQgYnV0dG9uXHJcblxyXG5mdW5jdGlvbiBoYW5kbGVSb3dFZGl0KG1ha2VSb3dFZGl0YWJsZSwgdXBkYXRlQ2FsbGJhY2spe1xyXG4gICAgLy8gYXR0YWNoIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGVhY2ggZWRpdCBidXR0b24gaW4gZXZlcnkgcm93XHJcbiAgICB2YXIgZWRpdEJ1dHRvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdidG4tZWRpdCcpO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGl0QnV0dG9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGVkaXRCdXR0b25zW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoYXQgd2FzIGNsaWNrZWQgb24gd2l0aGluIHRoZSB0YWJsZVxyXG4gICAgICAgICAgICB2YXIgcm93VG9FZGl0ID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJ3RyJyk7XHJcbiAgICAgICAgICAgIC8vIG1hcmsgcm93IGFzIGJlaW5nIGVkaXRlZFxyXG4gICAgICAgICAgICByb3dUb0VkaXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlLWVkaXRpbmcnKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIHR1cm4gcmVsZXZhbnQgZW50cmllcyBpbnRvIHRleHRib3hlc1xyXG4gICAgICAgICAgICBtYWtlUm93RWRpdGFibGUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGhpZGUgZWRpdCBidXR0b25zXHJcbiAgICAgICAgICAgIEVkaXQuaGlkZSgpO1xyXG4gICAgICAgICAgICBpbml0aWFsaXplQ29uZmlybUJ1dHRvbih1cGRhdGVDYWxsYmFjayk7XHJcbiAgICBcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbn1cclxuXHJcbi8vIENvbmZpcm0gYnV0dG9uXHJcblxyXG5mdW5jdGlvbiBpbml0aWFsaXplQ29uZmlybUJ1dHRvbih1cGRhdGVDYWxsYmFjayl7XHJcbiAgICAvLyBnZXQgZWxlbWVudCBhbmQgYWRkIGxpc3RlbmVyIGZvciBjbGlja1xyXG4gICAgdmFyIHJvd1RvRWRpdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmUtZWRpdGluZycpO1xyXG4gICAgY29uc3QgY29uZmlybV9idG4gPSByb3dUb0VkaXQucXVlcnlTZWxlY3RvcihcIi5idG4tY29uZmlybVwiKTtcclxuICAgIC8vIHNob3cgdGhlIHJvdydzIGNvbmZpcm0gYnV0dG9uXHJcbiAgICBjb25maXJtX2J0bi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgIGNvbmZpcm1fYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXs7XHJcbiAgICAgICAgLy8gc2F2ZSByb3cgZWRpdHNcclxuICAgICAgICBSb3dzLnNhdmVFZGl0cyhyb3dUb0VkaXQpO1xyXG4gICAgICAgIC8vIHVwZGF0ZSB2YWx1ZXMgaW4gc2lkZWJhclxyXG4gICAgICAgIHVwZGF0ZUNhbGxiYWNrKCk7XHJcbiAgICAgICAgLy8gbWFrZSByb3cgbm8gbG9uZ2VyIGdyZWVuXHJcbiAgICAgICAgcm93VG9FZGl0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZS1lZGl0aW5nJyk7XHJcbiAgICAgICAgLy8gc2hvdyBlZGl0IGJ1dHRvbnMgYW5kIGhpZGUgY29uZmlybSBidXR0b25zXHJcbiAgICAgICAgRWRpdC5zaG93KCk7XHJcbiAgICAgICAgQ29uZmlybS5oaWRlKCk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuY29uc3QgRWRpdCA9IHtcclxuICAgIGh0bWw6ICc8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1lZGl0XCI+RWRpdDwvYnV0dG9uPicsXHJcbiAgICBoaWRlOiBoaWRlQnV0dG9uKCdidG4tZWRpdCcpLFxyXG4gICAgc2hvdzogc2hvd0J1dHRvbignYnRuLWVkaXQnKSxcclxuICAgIGluaXQgOiBmdW5jdGlvbihtYWtlUm93RWRpdGFibGUsIHVwZGF0ZUNhbGxiYWNrKXtcclxuICAgICAgICBoYW5kbGVSb3dFZGl0KG1ha2VSb3dFZGl0YWJsZSwgdXBkYXRlQ2FsbGJhY2spXHJcbiAgICB9XHJcbn07XHJcblxyXG5jb25zdCBEZWxldGUgPSB7XHJcbiAgICBodG1sOiAnPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGVsZXRlXCI+RGVsZXRlPC9idXR0b24+JyxcclxuICAgIGhpZGU6IGhpZGVCdXR0b24oJ2J0bi1kZWxldGUnKSxcclxuICAgIHNob3c6IHNob3dCdXR0b24oJ2J0bi1kZWxldGUnKVxyXG59O1xyXG5cclxuY29uc3QgQ29uZmlybSA9IHtcclxuICAgIGh0bWw6ICc8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1jb25maXJtXCI+Q29uZmlybTwvYnV0dG9uPicsXHJcbiAgICBoaWRlOiBoaWRlQnV0dG9uKCdidG4tY29uZmlybScpLFxyXG4gICAgc2hvdzogc2hvd0J1dHRvbignYnRuLWNvbmZpcm0nKVxyXG59O1xyXG5cclxuY29uc3QgQWRkUm93ID0ge1xyXG4gICAgaGlkZTogaGlkZUJ1dHRvbignYnRuLWFkZCcpLFxyXG4gICAgc2hvdzogc2hvd0J1dHRvbignYnRuLWFkZCcpLFxyXG4gICAgdXBkYXRlVGV4dDogZnVuY3Rpb24odGV4dCl7XHJcbiAgICAgICAgdXBkYXRlQnV0dG9uVGV4dCgnYnRuLWFkZCcsIHRleHQpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEJ1dHRvbnMgPSB7XHJcbiAgICBEZWxldGU6IERlbGV0ZSxcclxuICAgIEVkaXQgOiBFZGl0LFxyXG4gICAgQ29uZmlybSA6IENvbmZpcm0sXHJcbiAgICBBZGRSb3cgOiBBZGRSb3csXHJcbiAgICBlZGl0X2NvbmZpcm1fYnRucyA6IEVkaXQuaHRtbCArIENvbmZpcm0uaHRtbCAsXHJcbiAgICBhbGxfYnRucyA6IERlbGV0ZS5odG1sICsgRWRpdC5odG1sICsgQ29uZmlybS5odG1sXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbnM7IiwiZXhwb3J0IGNvbnN0IEZ1bmRMb29rdXBUYWJsZSA9IHtcclxuICAgIHJldHJpZXZlIDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Z1bmQtbG9va3VwLXRhYmxlJykpIHx8IHt9O1xyXG4gICAgfSxcclxuICAgIHNhdmUgOiBmdW5jdGlvbihmdW5kRGljdCl7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Z1bmQtbG9va3VwLXRhYmxlJywgSlNPTi5zdHJpbmdpZnkoZnVuZERpY3QpKTtcclxuICAgIH0sXHJcbiAgICB1cGRhdGUgOiBmdW5jdGlvbihmdW5kRGF0YSl7XHJcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLnJldHJpZXZlKCk7XHJcbiAgICAgICAgZm9yIChsZXQgZnVuZCBvZiBPYmplY3Qua2V5cyhmdW5kRGF0YSkpe1xyXG4gICAgICAgICAgICAvLyBmdW5kID0gdG9TdHJpbmcoZnVuZCk7XHJcbiAgICAgICAgICAgIC8vIGFkZCB0byBsb29rdXAgdGFibGUgaWYgbm90IGluIHRoZXJlIGFscmVhZHlcclxuICAgICAgICAgICAgaWYgKCF0YWJsZVtmdW5kXSl7XHJcbiAgICAgICAgICAgICAgICAvLyBnZXQgZnVuZCBuYW1lXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmdW5kTmFtZSA9IGZ1bmREYXRhW2Z1bmRdWzBdWydGdW5kIE5hbWUnXTtcclxuICAgICAgICAgICAgICAgIC8vIGFkZCBmdW5kIHRvIGRpY3Rpb25hcnlcclxuICAgICAgICAgICAgICAgIHRhYmxlW2Z1bmRdID0gZnVuZE5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2F2ZSBhbnkgdXBkYXRlc1xyXG4gICAgICAgIHRoaXMuc2F2ZSh0YWJsZSk7XHJcbiAgICB9LFxyXG4gICAgcmVzZXQgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICB0aGlzLnNhdmUoe30pO1xyXG4gICAgfSxcclxuICAgIGdldE5hbWUgOiBmdW5jdGlvbihudW1iZXIpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJldHJpZXZlKClbbnVtYmVyXTtcclxuICAgIH0sXHJcbiAgICBsaXN0RnVuZHMgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnJldHJpZXZlKCkpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBkYXRhIHN0cnVjdHVyZSB0byBzYXZlIHRoZSBwb3NzaWJsZSBzZXJ2aWNlIG9wdGlvbnMgZm9yIHRoZSBkZXBhcnRtZW50XHJcbmV4cG9ydCBjb25zdCBTZXJ2aWNlcyA9IHtcclxuICAgIHNhdmUgOiBmdW5jdGlvbihzZXJ2aWNlcyl7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3NlcnZpY2VzLWxpc3QnLCBKU09OLnN0cmluZ2lmeShzZXJ2aWNlcykpO1xyXG4gICAgfSxcclxuICAgIGxpc3QgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzZXJ2aWNlcy1saXN0JykpIHx8IHt9O1xyXG4gICAgfVxyXG59IiwiYXN5bmMgZnVuY3Rpb24gY3JlYXRlRHJvcGRvd25Gcm9tSlNPTihqc29uX3BhdGgpIHtcclxuICAgIC8vIEZldGNoIEpTT04gZGF0YSBmcm9tIGEgZmlsZSBhc3luY2hyb25vdXNseVxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChqc29uX3BhdGgpO1xyXG4gICAgY29uc3QgZGF0YUFycmF5ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgLy8gY3JlYXRlIGFuZCByZXR1cm4gZWxlbWVudFxyXG4gICAgcmV0dXJuIGNyZWF0ZURyb3Bkb3duKGRhdGFBcnJheSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZURyb3Bkb3duKGRhdGFBcnJheSkge1xyXG5cclxuICAvLyBDcmVhdGluZyBhIHNlbGVjdCBlbGVtZW50XHJcbiAgY29uc3Qgc2VsZWN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpO1xyXG5cclxuICAvLyBMb29waW5nIHRocm91Z2ggdGhlIGFycmF5IGFuZCBjcmVhdGluZyBhbiBvcHRpb24gZm9yIGVhY2ggZWxlbWVudFxyXG4gIGRhdGFBcnJheS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xyXG4gICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IGl0ZW07XHJcbiAgICBvcHRpb25FbGVtZW50LnRleHRDb250ZW50ID0gaXRlbTtcclxuICAgIHNlbGVjdEVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uRWxlbWVudCk7IC8vIEFwcGVuZGluZyB0aGUgb3B0aW9uIHRvIHRoZSBzZWxlY3RcclxuICB9KTtcclxuXHJcbiAgLy8gUmV0dXJuIHRoZSBzZWxlY3QgZWxlbWVudCBzbyBpdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIGRvY3VtZW50XHJcbiAgcmV0dXJuIHNlbGVjdEVsZW1lbnQ7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY29uc3QgRHJvcGRvd24gPSB7XHJcbiAgICBjcmVhdGVGcm9tSlNPTiA6IGZ1bmN0aW9uKGpzb25fcGF0aCl7IHJldHVybiBjcmVhdGVEcm9wZG93bkZyb21KU09OKGpzb25fcGF0aCkgfSxcclxuICAgIGNyZWF0ZSA6IGZ1bmN0aW9uKGRhdGFBcnJheSkgeyByZXR1cm4gY3JlYXRlRHJvcGRvd24oZGF0YUFycmF5KSB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duOyIsImltcG9ydCB7IGZvcm1hdEN1cnJlbmN5LCBkaXNwbGF5V2l0aENvbW1hcyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tb25fdXRpbHMuanNcIjtcclxuaW1wb3J0IHsgU2VydmljZXMgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvZGF0YV91dGlscy9idWRnZXRfZGF0YV9oYW5kbGVycy5qc1wiO1xyXG5pbXBvcnQgRHJvcGRvd24gZnJvbSBcIi4uLy4uL2Zvcm0vc3ViY29tcG9uZW50cy9kcm9wZG93bi5qc1wiO1xyXG5cclxuLy8gcmV0dXJuIGNlbGwgdmFsdWUgYXR0cmlidXRlIG9yIDAgaWYgaXQgZG9lcyBub3QgZXhpc3RcclxuZnVuY3Rpb24gZ2V0Q2VsbFZhbHVlKHJvdywgY2xhc3NOYW1lKSB7XHJcbiAgICB2YXIgY2VsbCA9IHJvdy5xdWVyeVNlbGVjdG9yKGAuJHtjbGFzc05hbWV9YCk7XHJcbiAgICB2YXIgY2VsbFZhbHVlID0gY2VsbCA/IGNlbGwuZ2V0QXR0cmlidXRlKCd2YWx1ZScpIDogbnVsbDtcclxuICAgIHJldHVybiBjZWxsVmFsdWUgPyBwYXJzZUZsb2F0KGNlbGxWYWx1ZSkgOiAwO1xyXG59XHJcblxyXG4vLyByZXR1cm4gdGV4dCBpbiBjZWxsXHJcbmZ1bmN0aW9uIGdldENlbGxUZXh0KHJvdywgY2xhc3NOYW1lKSB7XHJcbiAgICB2YXIgY2VsbCA9IHJvdy5xdWVyeVNlbGVjdG9yKGAuJHtjbGFzc05hbWV9YCk7XHJcbiAgICByZXR1cm4gY2VsbC50ZXh0Q29udGVudDtcclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlVGFibGVDZWxsKHJvdywgY29sX2NsYXNzLCBuZXdfdmFsdWUpe1xyXG4gICAgY29uc3QgY2VsbCA9IHJvdy5xdWVyeVNlbGVjdG9yKGAuJHtjb2xfY2xhc3N9YCk7XHJcbiAgICBjZWxsLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBuZXdfdmFsdWUpO1xyXG4gICAgY2VsbC50ZXh0Q29udGVudCA9IGZvcm1hdEN1cnJlbmN5KG5ld192YWx1ZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUVkaXRhYmxlQ2VsbChjZWxsQ2xhc3MsIGlzQ29zdCl7XHJcbiAgICAvLyBnZXQgY2VsbFxyXG4gICAgY29uc3QgY2VsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC5hY3RpdmUtZWRpdGluZyB0ZC4ke2NlbGxDbGFzc31gKTtcclxuICAgIC8vIENyZWF0ZSBhbiBpbnB1dCBlbGVtZW50IHRvIGVkaXQgdGhlIHZhbHVlXHJcbiAgICB2YXIgdGV4dGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICB0ZXh0Ym94LnR5cGUgPSAndGV4dCc7XHJcbiAgICBpZiAoaXNDb3N0KXtcclxuICAgICAgICB2YXIgdmFsdWUgPSBjZWxsLmdldEF0dHJpYnV0ZSgndmFsdWUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFyIHZhbHVlID0gY2VsbC50ZXh0Q29udGVudDtcclxuICAgIH1cclxuICAgIHRleHRib3gudmFsdWUgPSBkaXNwbGF5V2l0aENvbW1hcyh2YWx1ZSk7XHJcbiAgICAvLyBDbGVhciB0aGUgY3VycmVudCBjb250ZW50IGFuZCBhcHBlbmQgdGhlIHRleHRib3ggdG8gdGhlIGNlbGxcclxuICAgIGNlbGwuaW5uZXJIVE1MID0gJyc7XHJcbiAgICBjZWxsLmFwcGVuZENoaWxkKHRleHRib3gpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVTZXJ2aWNlRHJvcGRvd24oKXtcclxuICAgIC8vIGdldCBjZWxsXHJcbiAgICB2YXIgY2VsbENsYXNzID0gJ3NlcnZpY2UnO1xyXG4gICAgY29uc3QgY2VsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC5hY3RpdmUtZWRpdGluZyB0ZC4ke2NlbGxDbGFzc31gKTtcclxuICAgIC8vIGFkZCBzZXJ2aWNlIGRyb3Bkb3duXHJcbiAgICBjb25zdCBzZXJ2aWNlRHJvcGRvd24gPSBEcm9wZG93bi5jcmVhdGUoU2VydmljZXMubGlzdCgpKTtcclxuICAgIHNlcnZpY2VEcm9wZG93bi52YWx1ZSA9IGNlbGwudGV4dENvbnRlbnQ7XHJcbiAgICAvLyBDbGVhciB0aGUgY3VycmVudCBjb250ZW50IGFuZCBhcHBlbmQgdGhlIHRleHRib3ggdG8gdGhlIGNlbGxcclxuICAgIGNlbGwuaW5uZXJIVE1MID0gJyc7XHJcbiAgICBjZWxsLmFwcGVuZENoaWxkKHNlcnZpY2VEcm9wZG93bik7XHJcbn1cclxuXHJcbmNvbnN0IENlbGwgPSB7XHJcbiAgICBnZXRWYWx1ZTogZnVuY3Rpb24ocm93LCBjbGFzc05hbWUpIHtcclxuICAgICAgICByZXR1cm4gZ2V0Q2VsbFZhbHVlKHJvdywgY2xhc3NOYW1lKTsgXHJcbiAgICB9LFxyXG4gICAgZ2V0VGV4dDogZnVuY3Rpb24ocm93LCBjbGFzc05hbWUpIHtcclxuICAgICAgICByZXR1cm4gZ2V0Q2VsbFRleHQocm93LCBjbGFzc05hbWUpOyBcclxuICAgIH0sXHJcbiAgICB1cGRhdGVWYWx1ZTogZnVuY3Rpb24ocm93LCBjb2xfY2xhc3MsIG5ld192YWx1ZSkge1xyXG4gICAgICAgIHVwZGF0ZVRhYmxlQ2VsbChyb3csIGNvbF9jbGFzcywgbmV3X3ZhbHVlKTsgXHJcbiAgICB9LFxyXG4gICAgY3JlYXRlVGV4dGJveCA6IGZ1bmN0aW9uKGNsYXNzTmFtZSwgaXNDb3N0KSB7XHJcbiAgICAgICAgY3JlYXRlRWRpdGFibGVDZWxsKGNsYXNzTmFtZSwgaXNDb3N0KVxyXG4gICAgfSxcclxuICAgIGNyZWF0ZVNlcnZpY2VEcm9wZG93biA6IGNyZWF0ZVNlcnZpY2VEcm9wZG93blxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ2VsbDsiLCJpbXBvcnQgeyBmb3JtYXRDdXJyZW5jeSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jb21tb25fdXRpbHMuanNcIjtcclxuXHJcbi8vIHBvc2l0aW9uIGlzIGluZGV4IGF0IHdoaWNoIG5ldyBjb2x1bW4gd2lsbCBiZSBpbnNlcnRlZFxyXG5mdW5jdGlvbiBhZGRDb2wocG9zaXRpb24sIGh0bWxDb250ZW50ID0gJycsIGhlYWRlclRpdGxlID0gJycpIHtcclxuICAgIC8vIEdldCB0aGUgdGFibGUgZWxlbWVudCBieSBpdHMgSURcclxuICAgIGxldCB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcblxyXG4gICAgLy8gVmFsaWRhdGUgcG9zaXRpb25cclxuICAgIGxldCBtYXhQb3NpdGlvbiA9IHRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoO1xyXG4gICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+IG1heFBvc2l0aW9uKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFBvc2l0aW9uICR7cG9zaXRpb259IGlzIG91dCBvZiBib3VuZHMuYCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICBcclxuICAgIC8vIEluc2VydCB0aGUgaGVhZGVyIGlmIHByb3ZpZGVkXHJcbiAgICBsZXQgdGhlYWQgPSB0YWJsZS50SGVhZDtcclxuICAgIGlmIChoZWFkZXJUaXRsZSAmJiB0aGVhZCkge1xyXG4gICAgICBsZXQgdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0aCcpO1xyXG4gICAgICB0aC5pbm5lckhUTUwgPSBoZWFkZXJUaXRsZTsgLy8gVXNlIGlubmVySFRNTCB0byBpbnNlcnQgSFRNTCBjb250ZW50XHJcbiAgICAgIHRoZWFkLnJvd3NbMF0uaW5zZXJ0QmVmb3JlKHRoLCB0aGVhZC5yb3dzWzBdLmNlbGxzW3Bvc2l0aW9uXSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBJbnNlcnQgbmV3IGNlbGxzIGludG8gZWFjaCByb3cgb2YgdGhlIHRhYmxlIGJvZHlcclxuICAgIGxldCB0Ym9keSA9IHRhYmxlLnRCb2RpZXNbMF07XHJcbiAgICBpZiAodGJvZHkpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Ym9keS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHJvdyA9IHRib2R5LnJvd3NbaV07XHJcbiAgICAgICAgbGV0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcclxuICAgICAgICB0ZC5pbm5lckhUTUwgPSBodG1sQ29udGVudDsgLy8gVXNlIGlubmVySFRNTCB0byBpbnNlcnQgSFRNTCBjb250ZW50XHJcbiAgICAgICAgcm93Lmluc2VydEJlZm9yZSh0ZCwgcm93LmNlbGxzW3Bvc2l0aW9uXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gbmNvbHMoKXtcclxuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuICAgIC8vIEVuc3VyZSB0aGF0IHRoZSByb3cgZXhpc3RzIGJlZm9yZSBjb3VudGluZyB0aGUgY29sdW1uc1xyXG4gICAgcmV0dXJuIHRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoO1xyXG59XHJcbiAgXHJcbmZ1bmN0aW9uIGFkZENvbFRvRW5kKGh0bWxDb250ZW50cyA9IFtdLCBoZWFkZXJUaXRsZSA9ICcnKXtcclxuICAgIC8vIGNvdW50IGNvbHVtbnMgYW5kIGFkZCBuZXcgY29sdW1uIHRvIHRoZSBlbmRcclxuICAgIGNvbnN0IHBvc2l0aW9uID0gbmNvbHMoJ21haW4tdGFibGUnKTtcclxuICAgIGFkZENvbChwb3NpdGlvbiwgaHRtbENvbnRlbnRzLCBoZWFkZXJUaXRsZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFzc2lnbkNsYXNzVG9Db2x1bW4oaGVhZGVyTmFtZSwgY2xhc3NOYW1lKSB7XHJcbiAgICAvLyBHZXQgdGhlIHRhYmxlIGVsZW1lbnQgYnkgaXRzIElEXHJcbiAgICBsZXQgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG5cclxuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gYnkgaXRzIGhlYWRlciBuYW1lXHJcbiAgICBjb25zdCB0aGVhZCA9IHRhYmxlLnRIZWFkO1xyXG4gICAgaWYgKCF0aGVhZCB8fCB0aGVhZC5yb3dzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSB0YWJsZSBoZWFkZXIgaXMgbm90IGZvdW5kIG9yIGhhcyBubyByb3dzLicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgbGV0IGhlYWRlckNlbGxJbmRleCA9IC0xO1xyXG4gICAgY29uc3QgaGVhZGVyQ2VsbHMgPSB0aGVhZC5yb3dzWzBdLmNlbGxzOyAvLyBBc3N1bWluZyB0aGUgZmlyc3Qgcm93IGNvbnRhaW5zIGhlYWRlciBjZWxscyAoPHRoPilcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVyQ2VsbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAoaGVhZGVyQ2VsbHNbaV0udGV4dENvbnRlbnQudHJpbSgpID09PSBoZWFkZXJOYW1lKSB7XHJcbiAgICAgICAgICAgIGhlYWRlckNlbGxJbmRleCA9IGk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGVhZGVyQ2VsbEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYE5vIGhlYWRlciBmb3VuZCB3aXRoIG5hbWUgXCIke2hlYWRlck5hbWV9XCJgKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBBc3NpZ24gdGhlIGNsYXNzIHRvIGVhY2ggY2VsbCBpbiB0aGUgc3BlY2lmaWVkIGNvbHVtbiBpbmRleCB3aXRoaW4gdGhlIHRib2R5XHJcbiAgICBsZXQgdGJvZHkgPSB0YWJsZS50Qm9kaWVzWzBdO1xyXG4gICAgaWYgKHRib2R5KSB7XHJcbiAgICAgIGxldCBib2R5Um93cyA9IHRib2R5LnJvd3M7XHJcbiAgICAgIGZvciAobGV0IHJvdyBvZiBib2R5Um93cykge1xyXG4gICAgICAgIGlmIChyb3cuY2VsbHNbaGVhZGVyQ2VsbEluZGV4XSkge1xyXG4gICAgICAgICAgcm93LmNlbGxzW2hlYWRlckNlbGxJbmRleF0uY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbmZ1bmN0aW9uIGFkZENvc3RDbGFzcyhoZWFkZXJOYW1lKXtcclxuICAgIGFzc2lnbkNsYXNzVG9Db2x1bW4oIGhlYWRlck5hbWUsICdjb3N0Jyk7XHJcblxyXG4gICAgLy8gR2V0IGFsbCB0aGUgY2VsbHMgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWVcclxuICAgIGNvbnN0IGNlbGxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLmNvc3RgKTtcclxuICAgICAgXHJcbiAgICBjZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xyXG4gICAgICAgIC8vIEdldCB0aGUgY3VycmVudCB0ZXh0IGNvbnRlbnQgb2YgdGhlIGNlbGwgYW5kIGFzc2lnbiBpdCB0byAndmFsdWUnIGF0dHJpYnV0ZVxyXG4gICAgICAgIGlmICghY2VsbC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpe1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsVGV4dCA9IGNlbGwudGV4dENvbnRlbnQudHJpbSgpO1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsVmFsdWUgPSBpc05hTihjZWxsVGV4dCkgfHwgY2VsbFRleHQgPT09ICcnID8gMCA6IHBhcnNlRmxvYXQoY2VsbFRleHQpO1xyXG4gICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBjZWxsVmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgLy8gTm93IGZvcm1hdCB0aGUgdGV4dCBjb250ZW50IGxpa2UgY3VycmVuY3kgYW5kIHJlcGxhY2UgaXQgaW4gdGhlIGNlbGxcclxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkQ3VycmVuY3kgPSBmb3JtYXRDdXJyZW5jeShwYXJzZUZsb2F0KGNlbGxWYWx1ZSkpO1xyXG4gICAgICAgICAgICBjZWxsLnRleHRDb250ZW50ID0gZm9ybWF0dGVkQ3VycmVuY3k7XHJcbiAgICAgICAgfVxyXG4gICAgICBcclxuICAgIH0pO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gYXNzaWduQ29sdW1uQ2xhc3Nlcyhjb2x1bW5EZWZpbml0aW9ucykge1xyXG4gICAgY29sdW1uRGVmaW5pdGlvbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgIC8vIEFzc2lnbiBjbGFzcyB0byBjb2x1bW5cclxuICAgICAgICBhc3NpZ25DbGFzc1RvQ29sdW1uKGNvbHVtbi50aXRsZSwgY29sdW1uLmNsYXNzTmFtZSk7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBjb2x1bW4gaXMgYSBjb3N0IGNvbHVtbiwgYWRkIHRoZSBzcGVjaWZpYyBjb3N0IGNsYXNzXHJcbiAgICAgICAgaWYgKGNvbHVtbi5pc0Nvc3QpIHtcclxuICAgICAgICAgICAgYWRkQ29zdENsYXNzKGNvbHVtbi50aXRsZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzaG93IHRoZSBjb2x1bW5cclxuICAgICAgICBzaG93Q29sdW1uQnlUaXRsZShjb2x1bW4udGl0bGUpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhpZGVDb2x1bW4oaW5kZXgpIHtcclxuICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gIHZhciByb3dzID0gdGFibGUucm93cztcclxuXHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHZhciBjZWxscyA9IHJvd3NbaV0uY2VsbHM7XHJcbiAgICAgIGlmIChjZWxscy5sZW5ndGggPiBpbmRleCkge1xyXG4gICAgICAgICAgY2VsbHNbaW5kZXhdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vIEZ1bmN0aW9uIHRvIHNob3cgYSBzcGVjaWZpYyBjb2x1bW5cclxuZnVuY3Rpb24gc2hvd0NvbHVtbihpbmRleCkge1xyXG4gIHZhciB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcbiAgdmFyIHJvd3MgPSB0YWJsZS5yb3dzO1xyXG5cclxuICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIGNlbGxzID0gcm93c1tpXS5jZWxscztcclxuICAgICAgaWYgKGNlbGxzLmxlbmd0aCA+IGluZGV4KSB7XHJcbiAgICAgICAgICBjZWxsc1tpbmRleF0uc3R5bGUuZGlzcGxheSA9ICd0YWJsZS1jZWxsJztcclxuICAgICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gRnVuY3Rpb24gdG8gZ2V0IHRoZSBjb2x1bW4gaW5kZXggYnkgdGl0bGVcclxuZnVuY3Rpb24gZ2V0Q29sdW1uSW5kZXhCeVRpdGxlKHRhYmxlLCB0aXRsZSkge1xyXG4gIHZhciBoZWFkZXJzID0gdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGgnKTtcclxuICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGhlYWRlcnNbaV0uaW5uZXJUZXh0ID09PSB0aXRsZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIC0xOyAvLyBDb2x1bW4gbm90IGZvdW5kXHJcbn1cclxuXHJcbi8vIEZ1bmN0aW9uIHRvIGhpZGUgYSBjb2x1bW4gYnkgdGl0bGVcclxuZnVuY3Rpb24gaGlkZUNvbHVtbkJ5VGl0bGUodGl0bGUpIHtcclxuICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gIHZhciBpbmRleCA9IGdldENvbHVtbkluZGV4QnlUaXRsZSh0YWJsZSwgdGl0bGUpO1xyXG4gIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgaGlkZUNvbHVtbihpbmRleCk7XHJcbiAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coYENvbHVtbiB3aXRoIHRpdGxlIFwiJHt0aXRsZX1cIiBub3QgZm91bmQuYCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBGdW5jdGlvbiB0byBzaG93IGEgY29sdW1uIGJ5IHRpdGxlXHJcbmZ1bmN0aW9uIHNob3dDb2x1bW5CeVRpdGxlKHRpdGxlKSB7XHJcbiAgdmFyIHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuICB2YXIgaW5kZXggPSBnZXRDb2x1bW5JbmRleEJ5VGl0bGUodGFibGUsIHRpdGxlKTtcclxuICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgIHNob3dDb2x1bW4oaW5kZXgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBDb2x1bW4gd2l0aCB0aXRsZSBcIiR7dGl0bGV9XCIgbm90IGZvdW5kLmApO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbmNvbnN0IENvbHVtbiA9IHtcclxuICBhZGQ6IGZ1bmN0aW9uKHBvc2l0aW9uLCBodG1sQ29udGVudCwgaGVhZGVyVGl0bGUpIHtcclxuICAgICAgcmV0dXJuIGFkZENvbChwb3NpdGlvbiwgaHRtbENvbnRlbnQsIGhlYWRlclRpdGxlKTtcclxuICB9LFxyXG4gIGFkZEF0RW5kOiBmdW5jdGlvbihodG1sQ29udGVudCwgaGVhZGVyVGl0bGUpIHtcclxuICAgICAgcmV0dXJuIGFkZENvbFRvRW5kKGh0bWxDb250ZW50LCBoZWFkZXJUaXRsZSk7XHJcbiAgfSxcclxuICBhc3NpZ25DbGFzc2VzOiBmdW5jdGlvbihjb2x1bW5fZGVmaW5pdGlvbnMpIHtcclxuICAgICAgcmV0dXJuIGFzc2lnbkNvbHVtbkNsYXNzZXMoY29sdW1uX2RlZmluaXRpb25zKTtcclxuICB9LFxyXG4gIGhpZGUgOiBmdW5jdGlvbihjb2xOYW1lKSB7XHJcbiAgICAgIGhpZGVDb2x1bW5CeVRpdGxlKGNvbE5hbWUpO1xyXG4gIH0sXHJcbiAgc2hvdyA6IGZ1bmN0aW9uKGNvbE5hbWUpIHtcclxuICAgICAgc2hvd0NvbHVtbkJ5VGl0bGUoY29sTmFtZSk7XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29sdW1uOyIsImltcG9ydCB7IEZ1bmRMb29rdXBUYWJsZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9kYXRhX3V0aWxzL2J1ZGdldF9kYXRhX2hhbmRsZXJzLmpzXCI7XHJcbmltcG9ydCB7IEN1cnJlbnRGdW5kLCBDdXJyZW50UGFnZSwgbG9hZFRhYmxlRGF0YSwgc2F2ZVRhYmxlRGF0YSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9kYXRhX3V0aWxzL2xvY2FsX3N0b3JhZ2VfaGFuZGxlcnMuanNcIjtcclxuXHJcbmZ1bmN0aW9uIGZpbGxUYWJsZShkYXRhKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuICAgICAgICBjb25zdCB0aGVhZCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkJyk7XHJcbiAgICAgICAgY29uc3QgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xyXG5cclxuICAgICAgICAvLyBjbGVhciBleGlzdGluZyBkYXRhXHJcbiAgICAgICAgdGhlYWQuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgICAgdGJvZHkuaW5uZXJIVE1MID0gJyc7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSB0YWJsZSBoZWFkZXIgcm93XHJcbiAgICAgICAgY29uc3QgaGVhZGVyUm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcclxuICAgICAgICBPYmplY3Qua2V5cyhkYXRhWzBdKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJyk7XHJcbiAgICAgICAgICAgIGhlYWRlci50ZXh0Q29udGVudCA9IGtleTtcclxuICAgICAgICAgICAgaGVhZGVyUm93LmFwcGVuZENoaWxkKGhlYWRlcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhlYWQuYXBwZW5kQ2hpbGQoaGVhZGVyUm93KTtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIHRhYmxlIGJvZHkgcm93c1xyXG4gICAgICAgIGRhdGEuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTtcclxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhpdGVtKS5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xyXG4gICAgICAgICAgICBjZWxsLnRleHRDb250ZW50ID0gdmFsO1xyXG4gICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoY2VsbCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0Ym9keS5hcHBlbmRDaGlsZChyb3cpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBjYXRjaChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHRhYmxlIHNhdmVkIGluIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBzYXZlVGFibGVEYXRhKCk7XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGxvYWRGcm9tU3RvcmFnZSgpe1xyXG4gICAgLy8gbG9vayB1cCB0YWJsZSBpbiBzdG9yYWdlIGFuZCBwYXNzIHRvIHRhYmxlIGxvYWQgZnVuY3Rpb25cXFxyXG4gICAgaWYgKEN1cnJlbnRGdW5kLm51bWJlcigpKXtcclxuICAgICAgICB2YXIga2V5ID0gYCR7Q3VycmVudFBhZ2UubG9hZCgpfV8ke0N1cnJlbnRGdW5kLm51bWJlcigpfWA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhciBrZXkgPSBDdXJyZW50UGFnZS5sb2FkKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgbG9hZFRhYmxlRGF0YShrZXkpO1xyXG4gICAgaWYgKCFkYXRhKXtcclxuICAgICAgICAvLyBpZiBubyB0YWJsZSBpbiBzdG9yYWdlLCByZXR1cm4gMFxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBmaWxsVGFibGUoZGF0YSk7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBsb2FkRnVuZHMoKXtcclxuICAgIC8vIGdldCBsaXN0IG9mIGZ1bmRzIGZyb20gc3RvcmFnZVxyXG4gICAgY29uc3QgZnVuZERpY3QgPSBGdW5kTG9va3VwVGFibGUucmV0cmlldmUoKTtcclxuICAgIC8vIGJ1aWxkIG91dCBkYXRhIGluIGNvcnJlY3QgZm9ybWF0XHJcbiAgICBjb25zdCByZXN1bHRBcnJheSA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZnVuZERpY3QpIHtcclxuICAgICAgICBpZiAoZnVuZERpY3QuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICByZXN1bHRBcnJheS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIEZ1bmQ6IGZ1bmREaWN0W2tleV0gICAgIC8vIFVzZSB0aGUgdmFsdWUgZGlyZWN0bHlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZmlsbFRhYmxlKHJlc3VsdEFycmF5KTtcclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIGdldENvbHVtbkluZGV4QnlDbGFzcyh0Ym9keSwgY2xhc3NOYW1lKSB7XHJcbiAgY29uc3QgZmlyc3RSb3cgPSB0Ym9keS5yb3dzWzBdO1xyXG4gIGlmICghZmlyc3RSb3cpIHJldHVybiAtMTsgLy8gUmV0dXJuIC0xIGlmIHRoZXJlJ3Mgbm8gcm93IHRvIGV4YW1pbmVcclxuICBmb3IgKGxldCBjZWxsSW5kZXggPSAwOyBjZWxsSW5kZXggPCBmaXJzdFJvdy5jZWxscy5sZW5ndGg7IGNlbGxJbmRleCsrKSB7XHJcbiAgICAgIGlmIChmaXJzdFJvdy5jZWxsc1tjZWxsSW5kZXhdLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7XHJcbiAgICAgICAgICByZXR1cm4gY2VsbEluZGV4O1xyXG4gICAgICB9XHJcbiAgfVxyXG4gIHJldHVybiAtMTsgLy8gUmV0dXJuIC0xIGlmIGNsYXNzIG5hbWUgbm90IGZvdW5kXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNvcnQocHJpbWFyeUNsYXNzLCBzZWNvbmRhcnlDbGFzcykge1xyXG4gIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuICBjb25zdCB0Ym9keSA9IHRhYmxlLnRCb2RpZXNbMF07XHJcbiAgY29uc3Qgcm93cyA9IEFycmF5LmZyb20odGJvZHkucm93cyk7XHJcblxyXG4gIC8vIEdldCB0aGUgY29sdW1uIGluZGljZXMgYnkgY2xhc3MgbmFtZVxyXG4gIGNvbnN0IHByaW1hcnlDb2xJbmRleCA9IGdldENvbHVtbkluZGV4QnlDbGFzcyh0Ym9keSwgcHJpbWFyeUNsYXNzKTtcclxuICBjb25zdCBzZWNvbmRhcnlDb2xJbmRleCA9IGdldENvbHVtbkluZGV4QnlDbGFzcyh0Ym9keSwgc2Vjb25kYXJ5Q2xhc3MpO1xyXG5cclxuICAvLyBleGl0IGlmIGNsYXNzZXMgZG9uJ3QgZXhpc3RcclxuICBpZiAocHJpbWFyeUNvbEluZGV4ID09PSAtMSApIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgQ29sdW1uIGNsYXNzICR7Y2xhc3NBfSBub3QgZm91bmQgaW4gdGFibGVgKTtcclxuICAgICAgcmV0dXJuOyBcclxuICB9IGVsc2UgaWYgKHNlY29uZGFyeUNvbEluZGV4ID09PSAtMSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBDb2x1bW4gY2xhc3MgJHtjbGFzc0J9IG5vdCBmb3VuZCBpbiB0YWJsZWApO1xyXG4gICAgICByZXR1cm47IFxyXG4gIH1cclxuXHJcbiAgLy8gU29ydCB0aGUgcm93cyBiYXNlZCBvbiB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBjZWxsc1xyXG4gIHJvd3Muc29ydCgocm93QSwgcm93QikgPT4ge1xyXG4gICAgICAvLyBQcmltYXJ5IGNvbHVtbiBjb21wYXJpc29uXHJcbiAgICAgIGNvbnN0IHByaW1hcnlBID0gdW5mb3JtYXRDdXJyZW5jeShyb3dBLmNlbGxzW3ByaW1hcnlDb2xJbmRleF0udGV4dENvbnRlbnQpO1xyXG4gICAgICBjb25zdCBwcmltYXJ5QiA9IHVuZm9ybWF0Q3VycmVuY3kocm93Qi5jZWxsc1twcmltYXJ5Q29sSW5kZXhdLnRleHRDb250ZW50KTtcclxuXHJcbiAgICAgIGlmIChwcmltYXJ5QSA8IHByaW1hcnlCKSByZXR1cm4gLTE7XHJcbiAgICAgIGlmIChwcmltYXJ5QSA+IHByaW1hcnlCKSByZXR1cm4gMTtcclxuXHJcbiAgICAgIC8vIFNlY29uZGFyeSBjb2x1bW4gY29tcGFyaXNvbiAoaWYgcHJpbWFyeSBpcyBlcXVhbClcclxuICAgICAgY29uc3Qgc2Vjb25kYXJ5QSA9IHVuZm9ybWF0Q3VycmVuY3kocm93QS5jZWxsc1tzZWNvbmRhcnlDb2xJbmRleF0udGV4dENvbnRlbnQpO1xyXG4gICAgICBjb25zdCBzZWNvbmRhcnlCID0gdW5mb3JtYXRDdXJyZW5jeShyb3dCLmNlbGxzW3NlY29uZGFyeUNvbEluZGV4XS50ZXh0Q29udGVudCk7XHJcblxyXG4gICAgICBpZiAoc2Vjb25kYXJ5QSA8IHNlY29uZGFyeUIpIHJldHVybiAtMTtcclxuICAgICAgaWYgKHNlY29uZGFyeUEgPiBzZWNvbmRhcnlCKSByZXR1cm4gMTtcclxuXHJcbiAgICAgIC8vIElmIGJvdGggY29sdW1ucyBhcmUgZXF1YWxcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgfSk7XHJcblxyXG4gIC8vIFJlYXR0YWNoIHNvcnRlZCByb3dzIHRvIHRoZSB0YWJsZSBib2R5XHJcbiAgcm93cy5mb3JFYWNoKChyb3cpID0+IHRib2R5LmFwcGVuZENoaWxkKHJvdykpO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IERhdGEgPSB7XHJcbiAgICBsb2FkIDogbG9hZEZyb21TdG9yYWdlLFxyXG4gICAgbG9hZEZ1bmRzIDogbG9hZEZ1bmRzLFxyXG4gICAgc29ydCA6IGZ1bmN0aW9uKGNvbEEsIGNvbEIpIHsgc29ydChjb2xBLCBjb2xCKSB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERhdGE7IiwiaW1wb3J0ICcuL3RhYmxlLmNzcyc7XHJcblxyXG5pbXBvcnQgQnV0dG9ucyBmcm9tICcuL3N1YmNvbXBvbmVudHMvYnV0dG9ucy5qcydcclxuaW1wb3J0IENlbGwgZnJvbSAnLi9zdWJjb21wb25lbnRzL2NlbGxzLmpzJ1xyXG5pbXBvcnQgQ29sdW1ucyBmcm9tICcuL3N1YmNvbXBvbmVudHMvY29sdW1ucy5qcydcclxuaW1wb3J0IEhlYWRlciBmcm9tICcuL3N1YmNvbXBvbmVudHMvaGVhZGVycy5qcydcclxuaW1wb3J0IFJvd3MgZnJvbSAnLi9zdWJjb21wb25lbnRzL3Jvd3MuanMnXHJcbmltcG9ydCBEYXRhIGZyb20gJy4vc3ViY29tcG9uZW50cy9kYXRhLmpzJ1xyXG5pbXBvcnQgeyBzYXZlVGFibGVEYXRhIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0YV91dGlscy9sb2NhbF9zdG9yYWdlX2hhbmRsZXJzLmpzJ1xyXG5cclxuZnVuY3Rpb24gYWRqdXN0VGFibGVXaWR0aCh3aWR0aF9wY3Qpe1xyXG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi10YWJsZScpO1xyXG4gICAgdGFibGUuc3R5bGUud2lkdGggPSB3aWR0aF9wY3Q7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsZWFyVGFibGUoKXtcclxuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuICAgIHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkJykuaW5uZXJIVE1MID0gJyc7XHJcbiAgICB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpLmlubmVySFRNTCA9ICcnO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93VGFibGUoKXtcclxuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuICAgIHRhYmxlLnN0eWxlLmRpc3BsYXkgPSAndGFibGUnO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoaWRlVGFibGUoKXtcclxuICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4tdGFibGUnKTtcclxuICAgIHRhYmxlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICBCdXR0b25zLkFkZFJvdy5oaWRlKCk7XHJcbn1cclxuXHJcbmNvbnN0IFRhYmxlID0ge1xyXG4gICAgQnV0dG9ucyA6IEJ1dHRvbnMsXHJcbiAgICBDZWxsIDogQ2VsbCxcclxuICAgIENvbHVtbnMgOiBDb2x1bW5zLFxyXG4gICAgSGVhZGVyIDogSGVhZGVyLFxyXG4gICAgUm93cyA6IFJvd3MsXHJcbiAgICBEYXRhIDogRGF0YSxcclxuICAgIC8vIGZ1bmN0aW9uc1xyXG4gICAgYWRqdXN0V2lkdGggOiBmdW5jdGlvbih3aWR0aF9wY3Qpe1xyXG4gICAgICAgIGFkanVzdFRhYmxlV2lkdGgod2lkdGhfcGN0KVxyXG4gICAgfSxcclxuICAgIGNsZWFyIDogY2xlYXJUYWJsZSxcclxuICAgIGhpZGUgOiBoaWRlVGFibGUsXHJcbiAgICBzaG93IDogc2hvd1RhYmxlLFxyXG4gICAgc2F2ZSA6IHNhdmVUYWJsZURhdGFcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVGFibGU7IiwiaW1wb3J0ICcuL2FjY29yZGlvbi5jc3MnO1xyXG5cclxuaW1wb3J0IHsgRnVuZCB9IGZyb20gXCIuLi8uLi91dGlscy9kYXRhX3V0aWxzL2xvY2FsX3N0b3JhZ2VfaGFuZGxlcnMuanNcIjtcclxuaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3kgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29tbW9uX3V0aWxzLmpzXCI7XHJcbmltcG9ydCBUYWJsZSBmcm9tIFwiLi4vdGFibGUvdGFibGUuanNcIjtcclxuaW1wb3J0IHsgRnVuZExvb2t1cFRhYmxlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2RhdGFfdXRpbHMvYnVkZ2V0X2RhdGFfaGFuZGxlcnMuanNcIjtcclxuXHJcbmNvbnN0IEZ1bmRUYWJsZSA9IHtcclxuICAgIHRhYmxlX2lkIDogKGZ1bmQpID0+IHsgcmV0dXJuIGB0YWJsZS0ke2Z1bmR9YCB9LFxyXG4gICAgaW5pdCA6IGZ1bmN0aW9uKGZ1bmQpIHtcclxuICAgICAgICAvLyBjcmVhdGUgZW1wdHkgdGFibGUgYW5kIHB1dCBpdCBpbiB0aGUgYWNjb3JkaW9uXHJcbiAgICAgICAgdmFyIHRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGFibGUnKTtcclxuICAgICAgICB0YWJsZS5pZCA9IHRoaXMudGFibGVfaWQoZnVuZCk7XHJcbiAgICAgICAgdGFibGUuY2xhc3NMaXN0LmFkZCgnYWNjb3JkaW9uLXRhYmxlJyk7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNmdW5kXyR7ZnVuZH1fY29udGVudCAuYWNjb3JkaW9uLWJvZHlgKTtcclxuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGFibGUpO1xyXG4gICAgfSxcclxuICAgIGNyZWF0ZU5ld0NlbGwgOiBmdW5jdGlvbihjb250ZW50LCByb3cpIHtcclxuICAgICAgICBjb25zdCBuZXdDZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcclxuICAgICAgICBuZXdDZWxsLmlubmVySFRNTCA9IGNvbnRlbnQ7XHJcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKG5ld0NlbGwpO1xyXG4gICAgfSxcclxuICAgIGFkZFJvdyA6IGZ1bmN0aW9uKGZ1bmQsIG5hbWUsIG51bWJlcil7XHJcbiAgICAgICAgdmFyIHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy50YWJsZV9pZChmdW5kKSk7XHJcbiAgICAgICAgdmFyIG5ld19yb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xyXG4gICAgICAgIHRhYmxlLmFwcGVuZENoaWxkKG5ld19yb3cpO1xyXG4gICAgICAgIC8vIENyZWF0ZSBhIGNlbGwgZm9yIHRoZSBsaW5lIGl0ZW0gbGFiZWxcclxuICAgICAgICB0aGlzLmNyZWF0ZU5ld0NlbGwobmFtZSwgbmV3X3Jvdyk7XHJcbiAgICAgICAgLy8gY3JlYXRlIGEgY2VsbCBmb3IgdGhlIGFtb3VudFxyXG4gICAgICAgIHRoaXMuY3JlYXRlTmV3Q2VsbChmb3JtYXRDdXJyZW5jeShudW1iZXIpLCBuZXdfcm93KTtcclxuICAgICAgICAvLyBjcmVhdGUgRWRpdCBidXR0b24gXHJcbiAgICAgICAgdmFyIGJ1dHRvbiA9ICcnO1xyXG4gICAgICAgIGlmIChuYW1lICE9ICdUb3RhbCcpe1xyXG4gICAgICAgICAgICBidXR0b24gPSBUYWJsZS5CdXR0b25zLkVkaXQuaHRtbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jcmVhdGVOZXdDZWxsKGJ1dHRvbiwgbmV3X3Jvdyk7XHJcbiAgICB9LFxyXG4gICAgZmlsbCA6IGZ1bmN0aW9uKGZ1bmQpIHtcclxuICAgICAgICB0aGlzLmluaXQoZnVuZCk7XHJcbiAgICAgICAgY29uc3QgZnVuZE9iamVjdCA9IG5ldyBGdW5kKGZ1bmQpO1xyXG4gICAgICAgIHRoaXMuYWRkUm93KGZ1bmQsICdQZXJzb25uZWwgRXhwZW5zZXMnLCBmdW5kT2JqZWN0LmdldFBlcnNvbm5lbENvc3QoKSk7XHJcbiAgICAgICAgdGhpcy5hZGRSb3coZnVuZCwgJ05vbi1QZXJzb25uZWwgRXhwZW5zZXMnLCBmdW5kT2JqZWN0LmdldE5vblBlcnNvbm5lbENvc3QoKSk7XHJcbiAgICAgICAgdGhpcy5hZGRSb3coZnVuZCwgJ1JldmVudWUnLCBmdW5kT2JqZWN0LmdldFJldmVudWUoKSk7XHJcbiAgICAgICAgdGhpcy5hZGRSb3coZnVuZCwgJ05ldCBFeHBlbnNlcyAoUmV2ZW51ZXMpJywgZnVuZE9iamVjdC5nZXRUb3RhbCgpKTtcclxuICAgIH1cclxufVxyXG5cclxuY29uc3QgSXRlbSA9IHtcclxuICAgIGh0bWwgOiBmdW5jdGlvbihmdW5kKSB7XHJcbiAgICAgICAgdmFyIGlkID0gZnVuZDsgLy8gY2xlYW5TdHJpbmcoZnVuZCk7XHJcbiAgICAgICAgcmV0dXJuIGA8aDIgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCIgaWQ9XCJmdW5kXyR7aWR9X2hlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY2NvcmRpb24tYnV0dG9uIGNvbGxhcHNlZFwiIHR5cGU9XCJidXR0b25cIiBkYXRhLWJzLXRvZ2dsZT1cImNvbGxhcHNlXCIgZGF0YS1icy10YXJnZXQ9XCIjZnVuZF8ke2lkfV9jb250ZW50XCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCIgYXJpYS1jb250cm9scz1cImZ1bmRfJHtpZH1fY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hbWVcIj48L3NwYW4+OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFtb3VudFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiZnVuZF8ke2lkfV9jb250ZW50XCIgY2xhc3M9XCJhY2NvcmRpb24tY29sbGFwc2UgY29sbGFwc2VcIiBhcmlhLWxhYmVsbGVkYnk9XCJmdW5kXyR7aWR9X2hlYWRlclwiIGRhdGEtYnMtcGFyZW50PVwiI3N1bW1hcnktYWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1ib2R5XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5gXHJcbiAgICB9LFxyXG4gICAgYWRkIDogZnVuY3Rpb24oZnVuZCkge1xyXG4gICAgICAgIC8vIGdldCBhY2NvcmRpb24gYW5kIGFkZCBhIG5ldyBpdGVtIHRvIGl0XHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bW1hcnktYWNjb3JkaW9uJyk7XHJcbiAgICAgICAgY29uc3QgaXRlbV9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgaXRlbV9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FjY29yZGlvbi1pdGVtJyk7XHJcbiAgICAgICAgaXRlbV9lbGVtZW50LmlubmVySFRNTCA9IHRoaXMuaHRtbChmdW5kKTtcclxuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoaXRlbV9lbGVtZW50KTtcclxuICAgICAgICBGdW5kVGFibGUuZmlsbChmdW5kKTtcclxuICAgIH0sXHJcbiAgICBGdW5kVGFibGUgOiBGdW5kVGFibGUsXHJcbiAgICB1cGRhdGVIZWFkZXIgOiBmdW5jdGlvbihmdW5kLCBuZXdfYW1vdW50KSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyX2J0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNmdW5kXyR7ZnVuZH1faGVhZGVyIGJ1dHRvbmApO1xyXG4gICAgICAgIGhlYWRlcl9idG4ucXVlcnlTZWxlY3Rvcignc3Bhbi5uYW1lJykudGV4dENvbnRlbnQgPSBGdW5kTG9va3VwVGFibGUuZ2V0TmFtZShmdW5kKTtcclxuICAgICAgICBoZWFkZXJfYnRuLnF1ZXJ5U2VsZWN0b3IoJ3NwYW4uYW1vdW50JykudGV4dENvbnRlbnQgPSBmb3JtYXRDdXJyZW5jeShuZXdfYW1vdW50KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IEFjY29yZGlvbiA9IHtcclxuICAgIEl0ZW0gOiBJdGVtLFxyXG4gICAgaGlkZSA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjY29yZGlvbi1kaXYnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgIC8vIHJlc2V0IHRvIGRlbGV0ZSBjb250ZW50XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1bW1hcnktYWNjb3JkaW9uJykuaW5uZXJIVE1MID0gJyc7XHJcbiAgICB9LFxyXG4gICAgc2hvdyA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FjY29yZGlvbi1kaXYnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgIH0sXHJcbiAgICBhc3luYyBjcmVhdGVGcm9tRnVuZHMoKXtcclxuICAgICAgICB2YXIgZnVuZHMgPSBGdW5kTG9va3VwVGFibGUubGlzdEZ1bmRzKCk7XHJcblxyXG4gICAgICAgIGZ1bmRzLmZvckVhY2goZnVuZCA9PiB7XHJcbiAgICAgICAgICAgIEl0ZW0uYWRkKGZ1bmQpO1xyXG4gICAgICAgICAgICBjb25zdCBmdW5kT2JqZWN0ID0gbmV3IEZ1bmQoZnVuZCk7XHJcbiAgICAgICAgICAgIEl0ZW0udXBkYXRlSGVhZGVyKGZ1bmQsIGZ1bmRPYmplY3QuZ2V0VG90YWwoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFjY29yZGlvbjtcclxuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2ZpbGVfdXBsb2FkLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2ZpbGVfdXBsb2FkLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxyXG5cclxuaW1wb3J0IHsgU0hFRVRTIH0gZnJvbSAnLi4vLi4vaW5pdC5qcyc7XHJcbmltcG9ydCB7IEZ1bmRMb29rdXBUYWJsZSwgU2VydmljZXMgfSBmcm9tICcuL2J1ZGdldF9kYXRhX2hhbmRsZXJzLmpzJztcclxuaW1wb3J0IHsgcmVtb3ZlTmV3TGluZXMgfSBmcm9tICcuLi9jb21tb25fdXRpbHMuanMnO1xyXG5pbXBvcnQgeyBCYXNlbGluZSB9IGZyb20gJy4vbG9jYWxfc3RvcmFnZV9oYW5kbGVycy5qcyc7XHJcblxyXG5mdW5jdGlvbiBkZWxldGVUb3BSb3dzVW50aWxGdWxsRGF0YShkYXRhKSB7XHJcbiAgICAvLyBmdW5jdGlvbiB0byB0cnkgdG8gZmluZCB0aGUgdG9wIG9mIHRoZSB1c2FibGUgZGF0YVxyXG4gICAgbGV0IGZ1bGxEYXRhUm93Rm91bmQgPSBmYWxzZTtcclxuXHJcbiAgICB3aGlsZSAoIWZ1bGxEYXRhUm93Rm91bmQgJiYgZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0gZGF0YVswXTsgLy8gR2V0IHRoZSB0b3Agcm93XHJcbiAgICAgICAgbGV0IGhhc0FsbERhdGEgPSB0cnVlO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2Ygcm93KSB7XHJcbiAgICAgICAgICAgIGlmIChjZWxsID09IG51bGwgfHwgY2VsbCA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgIGhhc0FsbERhdGEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaGFzQWxsRGF0YSAmJiByb3cubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICBmdWxsRGF0YVJvd0ZvdW5kID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBkZWxldGUgdGhlIHRvcCByb3cgaWYgaXQncyBub3QgdGhlIGhlYWRlciByb3dcclxuICAgICAgICAgICAgZGF0YS5zaGlmdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGF0YTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NXb3JrYm9vayhhcnJheUJ1ZmZlcikge1xyXG4gICAgY29uc3Qgd29ya2Jvb2sgPSBYTFNYLnJlYWQoYXJyYXlCdWZmZXIsIHsgdHlwZTogJ2FycmF5JyB9KTtcclxuICAgIHdvcmtib29rLlNoZWV0TmFtZXMuZm9yRWFjaChzaGVldE5hbWUgPT4ge1xyXG4gICAgICAgIC8vIG9ubHkgY29udmVydCBzaGVldHMgd2UgbmVlZFxyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhTSEVFVFMpLmluY2x1ZGVzKHNoZWV0TmFtZSkpIHtcclxuICAgICAgICAgICAgIC8vIHJlYWQgaW4gc2hlZXRzXHJcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gd29ya2Jvb2suU2hlZXRzW3NoZWV0TmFtZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHJhd0RhdGEgPSBYTFNYLnV0aWxzLnNoZWV0X3RvX2pzb24oc2hlZXQsIHsgaGVhZGVyOiAxLCBkZWZ2YWw6ICcnIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2xlYW4gdGhlIGRhdGEgYnkgcmVtb3ZpbmcgdG9wIHJvd3Mgd2l0aCBpbmNvbXBsZXRlIGRhdGFcclxuICAgICAgICAgICAgY29uc3QgZGF0YVJvd3MgPSBkZWxldGVUb3BSb3dzVW50aWxGdWxsRGF0YShyYXdEYXRhKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGdldCBuZXcgaGVhZGVyc1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gZGF0YVJvd3NbMF07XHJcblxyXG4gICAgICAgICAgICAvLyBpc29sYXRlIEZ1bmQgY29sdW1uIHRvIHNwbGl0IGRhdGFcclxuICAgICAgICAgICAgY29uc3QgZnVuZEluZGV4ID0gaGVhZGVycy5pbmRleE9mKCdGdW5kJyk7XHJcbiAgICAgICAgICAgIGlmIChmdW5kSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBObyAnRnVuZCcgY29sdW1uIGZvdW5kIGluIHNoZWV0ICR7c2hlZXROYW1lfWApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTYXZlIGEgZGljdGlvbmFyeSBvZiBkYXRhIGZvciBlYWNoIGZ1bmQgZm9yIGVhY2ggc2hlZXRcclxuICAgICAgICAgICAgY29uc3QgZnVuZERhdGEgPSB7fTtcclxuXHJcbiAgICAgICAgICAgIGRhdGFSb3dzLmZvckVhY2gocm93ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZ1bmQgPSByb3dbZnVuZEluZGV4XTtcclxuICAgICAgICAgICAgICAgIGlmKGZ1bmQgJiYgZnVuZCAhPSBcIkZ1bmRcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmdW5kRGF0YVtmdW5kXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5kRGF0YVtmdW5kXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dEYXRhID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5mb3JFYWNoKChoZWFkZXIsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGFbcmVtb3ZlTmV3TGluZXMoaGVhZGVyKV0gPSByb3dbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmREYXRhW2Z1bmRdLnB1c2gocm93RGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gc2F2ZSBmdW5kIG51bWJlciBhbmQgbmFtZSBhcyB3ZSBnbyBhbG9uZ1xyXG4gICAgICAgICAgICBGdW5kTG9va3VwVGFibGUudXBkYXRlKGZ1bmREYXRhKTsgICAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZ1bmREYXRhKS5mb3JFYWNoKGZ1bmQgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gYCR7U0hFRVRTW3NoZWV0TmFtZV19XyR7ZnVuZH1gO1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShmdW5kRGF0YVtmdW5kXSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEJ1dCBhbHNvIHNhdmUgdGhlIHBvc3NpYmxlIHNlcnZpY2VzXHJcbiAgICAgICAgZWxzZSBpZiAoc2hlZXROYW1lID09ICdEcm9wLURvd25zJyl7XHJcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gd29ya2Jvb2suU2hlZXRzW3NoZWV0TmFtZV07XHJcbiAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIHNoZWV0IHRvIEpTT04gdG8gZWFzaWx5IG1hbmlwdWxhdGUgZGF0YVxyXG4gICAgICAgICAgICBjb25zdCBzaGVldERhdGEgPSBYTFNYLnV0aWxzLnNoZWV0X3RvX2pzb24oc2hlZXQsIHsgaGVhZGVyOiAxIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gTG9jYXRlIHRoZSBcInNlcnZpY2VzXCIgY29sdW1uIGhlYWRlciBpbiByb3cgMFxyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJSb3cgPSBzaGVldERhdGFbMF07XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VzSW5kZXggPSBoZWFkZXJSb3cuaW5kZXhPZignU2VydmljZXMnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzZXJ2aWNlc0luZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignSGVhZGVyIFwiU2VydmljZXNcIiBub3QgZm91bmQnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgZGF0YSBmcm9tIHRoZSBcInNlcnZpY2VzXCIgY29sdW1uIChleGNsdWRpbmcgdGhlIGhlYWRlciByb3cpXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJ2aWNlc0NvbHVtbiA9IHNoZWV0RGF0YS5zbGljZSgxKS5tYXAocm93ID0+IHJvd1tzZXJ2aWNlc0luZGV4XSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbGVhbmVkU2VydmljZXNDb2x1bW4gPSBzZXJ2aWNlc0NvbHVtbi5maWx0ZXIodmFsdWUgPT4gdmFsdWUgIT0gbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBkYXRhXHJcbiAgICAgICAgICAgICAgICBTZXJ2aWNlcy5zYXZlKGNsZWFuZWRTZXJ2aWNlc0NvbHVtbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnYWxsIGV4Y2VsIGRhdGEgc2F2ZWQnKTtcclxufVxyXG5cclxuLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBhcHBlbmQgYSBzaGVldCB0byB0aGUgd29ya2Jvb2sgaWYgZGF0YSBpcyBwcmVzZW50XHJcbmZ1bmN0aW9uIGFwcGVuZFNoZWV0VG9Xb3JrYm9vayh3b3JrYm9vaywgZGF0YSwgc2hlZXROYW1lKSB7XHJcbiAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3Qgc2hlZXQgPSBYTFNYLnV0aWxzLmpzb25fdG9fc2hlZXQoZGF0YSk7XHJcbiAgICAgICAgWExTWC51dGlscy5ib29rX2FwcGVuZF9zaGVldCh3b3JrYm9vaywgc2hlZXQsIHNoZWV0TmFtZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZFhMU1goKSB7XHJcbiAgICBjb25zdCBiYXNlbGluZSA9IG5ldyBCYXNlbGluZSgpO1xyXG4gICAgY29uc3Qgd29ya2Jvb2sgPSBYTFNYLnV0aWxzLmJvb2tfbmV3KCk7IC8vIENyZWF0ZSBhIG5ldyB3b3JrYm9va1xyXG5cclxuICAgIGNvbnN0IGRhdGFNYXAgPSB7XHJcbiAgICAgICAgUGVyc29ubmVsOiAncGVyc29ubmVsJyxcclxuICAgICAgICBPdmVydGltZTogJ292ZXJ0aW1lJyxcclxuICAgICAgICBOb25QZXJzb25uZWw6ICdub25wZXJzb25uZWwnLFxyXG4gICAgICAgIFJldmVudWU6ICdyZXZlbnVlJ1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzaGVldERhdGEgPSB7XHJcbiAgICAgICAgUGVyc29ubmVsOiBbXSxcclxuICAgICAgICBPdmVydGltZTogW10sXHJcbiAgICAgICAgTm9uUGVyc29ubmVsOiBbXSxcclxuICAgICAgICBSZXZlbnVlOiBbXVxyXG4gICAgfTtcclxuXHJcbiAgICBiYXNlbGluZS5mdW5kcy5mb3JFYWNoKGZ1bmQgPT4ge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKGRhdGFNYXApLmZvckVhY2goc2hlZXROYW1lID0+IHtcclxuICAgICAgICAgICAgaWYgKGZ1bmRbZGF0YU1hcFtzaGVldE5hbWVdXSAmJiBmdW5kW2RhdGFNYXBbc2hlZXROYW1lXV0udGFibGUpIHtcclxuICAgICAgICAgICAgICAgIHNoZWV0RGF0YVtzaGVldE5hbWVdLnB1c2goLi4uZnVuZFtkYXRhTWFwW3NoZWV0TmFtZV1dLnRhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgT2JqZWN0LmtleXMoc2hlZXREYXRhKS5mb3JFYWNoKHNoZWV0TmFtZSA9PiB7XHJcbiAgICAgICAgYXBwZW5kU2hlZXRUb1dvcmtib29rKHdvcmtib29rLCBzaGVldERhdGFbc2hlZXROYW1lXSwgc2hlZXROYW1lKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEdlbmVyYXRlIGEgZG93bmxvYWRhYmxlIGZpbGVcclxuICAgIGNvbnN0IHdib3V0ID0gWExTWC53cml0ZSh3b3JrYm9vaywgeyBib29rVHlwZTogJ3hsc3gnLCB0eXBlOiAnYXJyYXknIH0pO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFt3Ym91dF0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfSk7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgbGluayBhbmQgdHJpZ2dlciB0aGUgZG93bmxvYWRcclxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgIGxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBsaW5rLmRvd25sb2FkID0gXCJiYXNlbGluZV9kYXRhLnhsc3hcIjtcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XHJcbiAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xyXG59IiwiaW1wb3J0ICcuL2ZpbGVfdXBsb2FkLmNzcyc7XHJcblxyXG5pbXBvcnQgeyBwcm9jZXNzV29ya2Jvb2sgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZGF0YV91dGlscy9YTFNYX2hhbmRsZXJzLmpzXCI7XHJcblxyXG5leHBvcnQgY29uc3QgRmlsZVVwbG9hZCA9IHtcclxuICAgIGluaXQgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICBjb25zdCBpbnB1dE9iamVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlLWlucHV0Jyk7XHJcbiAgICAgICAgaW5wdXRPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oZXZlbnQpIHtyZWFkWEwoZXZlbnQpIH0pO1xyXG4gICAgfSxcclxuICAgIHNob3cgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIGNvbnN0IGlucHV0T2JqZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtaW5wdXQnKTtcclxuICAgICAgICBpbnB1dE9iamVjdC5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcbiAgICB9LFxyXG4gICAgaGlkZSA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgY29uc3QgaW5wdXRPYmplY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZS1pbnB1dCcpO1xyXG4gICAgICAgIGlucHV0T2JqZWN0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlYWRYTChldmVudCkge1xyXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcclxuXHJcbiAgICBpZiAoZmlsZSkge1xyXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgICAgIHByb2Nlc3NXb3JrYm9vayhhcnJheUJ1ZmZlcik7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWFkaW5nIGZpbGU6JywgZXJyKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTsgLy8gUmVhZCB0aGUgZmlsZSBhcyBhbiBBcnJheUJ1ZmZlclxyXG4gICAgfVxyXG59IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL21vZGFsLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL21vZGFsLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsImltcG9ydCAnLi9tb2RhbC5jc3MnO1xyXG5cclxuZnVuY3Rpb24gY2xlYXJNb2RhbCgpe1xyXG4gICAgdXBkYXRlTW9kYWxUaXRsZSgnJyk7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kYWwtYm9keScpLmlubmVySFRNTCA9ICcnO1xyXG4gICAgLy9yZW1vdmVBbGxNb2RhbExpbmtzKClcclxufVxyXG5cclxuZnVuY3Rpb24gaGlkZU1vZGFsKG1vZGFsX2lkKSB7XHJcbiAgICAkKCcjJyArIG1vZGFsX2lkKS5tb2RhbCgnaGlkZScpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93TW9kYWwobW9kYWxfaWQpIHtcclxuICAgICQoJyMnICsgbW9kYWxfaWQpLm1vZGFsKCdzaG93Jyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dNb2RhbEhhbmRsZXIoKSB7XHJcbiAgICBzaG93TW9kYWwoJ21haW4tbW9kYWwnKTtcclxufVxyXG5cclxuY29uc3QgU3VibWl0ID0ge1xyXG4gICAgaGFuZGxlcjogbnVsbCwgXHJcblxyXG4gICAgaW5pdDogZnVuY3Rpb24ob25TdWJtaXQpIHtcclxuICAgICAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLW1vZGFsJyk7XHJcbiAgICAgICAgLy8gYWRkIG9uU3VibWl0IGZ1bmN0aW9uIGFzIGhhbmRsZXJcclxuICAgICAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBvblN1Ym1pdChldmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBBZGRpbmcgdGhlIGhhbmRsZXIgcmVmZXJlbmNlIGFzIHRoZSBldmVudCBsaXN0ZW5lclxyXG4gICAgICAgIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIHRoaXMuaGFuZGxlcik7XHJcbiAgICB9LFxyXG5cclxuICAgIGRlaW5pdDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi1tb2RhbCcpO1xyXG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXIgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgLy8gUmVtb3ZpbmcgdGhlIGV2ZW50IGxpc3RlbmVyIGFuZCBjbGVhciB0aGUgaGFuZGxlclxyXG4gICAgICAgICAgICBtb2RhbC5yZW1vdmVFdmVudExpc3RlbmVyKCdzdWJtaXQnLCB0aGlzLmhhbmRsZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbmNvbnN0IExpbmsgPSB7XHJcbiAgICBhZGQgOiBmdW5jdGlvbihidXR0b25faWQpe1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ1dHRvbl9pZCkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzaG93TW9kYWxIYW5kbGVyKVxyXG4gICAgfSxcclxuICAgIHJlbW92ZSA6IGZ1bmN0aW9uKGJ1dHRvbl9pZCl7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYnV0dG9uX2lkKS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHNob3dNb2RhbEhhbmRsZXIpXHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZU1vZGFsVGl0bGUodGl0bGUpIHtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbC10aXRsZScpLnRleHRDb250ZW50ID0gdGl0bGU7XHJcbn1cclxuXHJcbmNvbnN0IFRpdGxlID0ge1xyXG4gICAgdXBkYXRlIDogZnVuY3Rpb24odGl0bGUpIHsgdXBkYXRlTW9kYWxUaXRsZSh0aXRsZSkgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgTW9kYWwgPSB7XHJcbiAgICBoaWRlIDogZnVuY3Rpb24oKSB7IGhpZGVNb2RhbCgnbWFpbi1tb2RhbCcpIH0sXHJcbiAgICBzaG93IDogZnVuY3Rpb24oKSB7IHNob3dNb2RhbCgnbWFpbi1tb2RhbCcpIH0sXHJcbiAgICBjbGVhciA6IGNsZWFyTW9kYWwsXHJcbiAgICBUaXRsZSA6IFRpdGxlLFxyXG4gICAgTGluayA6IExpbmssXHJcbiAgICBTdWJtaXQ6IFN1Ym1pdFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNb2RhbDsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbmF2X2J1dHRvbnMuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbmF2X2J1dHRvbnMuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiaW1wb3J0ICcuL25hdl9idXR0b25zLmNzcyc7XHJcblxyXG5pbXBvcnQgeyBuZXh0UGFnZSwgbGFzdFBhZ2UgfSBmcm9tICcuLi8uLi92aWV3cy92aWV3X2xvZ2ljLmpzJ1xyXG5cclxuZnVuY3Rpb24gaW5pdGlhbGl6ZU5hdkJ1dHRvbnMoKXtcclxuICAgIC8vIGluaXRpYWxpemUgbGFzdCBidXR0b25cclxuICAgIGNvbnN0IGxhc3RfYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bi1sYXN0Jyk7XHJcbiAgICBsYXN0X2J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxhc3RQYWdlKTsgXHJcbiAgICAvLyBpbml0aWFsaXplIG5leHQgYnV0dG9uXHJcbiAgICBjb25zdCBuZXh0X2J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG4tbmV4dCcpO1xyXG4gICAgbmV4dF9idG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBuZXh0UGFnZSk7IFxyXG4gICAgZGlzYWJsZSgnYnRuLW5leHQnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGlkZU5hdkJ1dHRvbnMoKSB7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmF2LWJ0bnMnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93TmF2QnV0dG9ucygpIHtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduYXYtYnRucycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgaW5pdGlhbGl6ZU5hdkJ1dHRvbnMoKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZGlzYWJsZShidXR0b25faWQpIHtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ1dHRvbl9pZCkuY2xhc3NMaXN0LmFkZCgnZGlzYWJsZWQnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZW5hYmxlKGJ1dHRvbl9pZCkge1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYnV0dG9uX2lkKS5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xyXG59XHJcblxyXG5jb25zdCBOZXh0ID0ge1xyXG4gICAgZGlzYWJsZSA6IGZ1bmN0aW9uKCkgeyBkaXNhYmxlKCdidG4tbmV4dCcpIH0sXHJcbiAgICBlbmFibGUgOiBmdW5jdGlvbigpIHsgZW5hYmxlKCdidG4tbmV4dCcpIH1cclxufVxyXG5cclxuY29uc3QgTGFzdCA9IHtcclxuICAgIGRpc2FibGUgOiBmdW5jdGlvbigpIHsgZGlzYWJsZSgnYnRuLWxhc3QnKSB9LFxyXG4gICAgZW5hYmxlIDogZnVuY3Rpb24oKSB7IGVuYWJsZSgnYnRuLWxhc3QnKSB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBOYXZCdXR0b25zID0ge1xyXG4gICAgaGlkZSA6IGhpZGVOYXZCdXR0b25zLFxyXG4gICAgc2hvdyA6IHNob3dOYXZCdXR0b25zLFxyXG4gICAgTmV4dCA6IE5leHQsXHJcbiAgICBMYXN0IDogTGFzdFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOYXZCdXR0b25zOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9wcm9tcHQuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vcHJvbXB0LmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsImZ1bmN0aW9uIHNob3dQcm9tcHQoKXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicHJvbXB0LWRpdlwiKS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoaWRlUHJvbXB0KCl7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvbXB0LWRpdicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiB1cGRhdGVQcm9tcHQocHJvbXB0KXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9tcHQnKS50ZXh0Q29udGVudCA9IHByb21wdDtcclxuICAgIHNob3dQcm9tcHQoKTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFRleHQgPSB7XHJcbiAgICBzaG93IDogc2hvd1Byb21wdCxcclxuICAgIGhpZGUgOiBoaWRlUHJvbXB0LFxyXG4gICAgdXBkYXRlIDogZnVuY3Rpb24odGV4dCkgeyB1cGRhdGVQcm9tcHQodGV4dCkgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUZXh0OyIsImZ1bmN0aW9uIHNob3dQcm9tcHRCdXR0b24oaWQpe1xyXG4gICAgLy8gbWFrZSBidXR0b25zIHZpc2libGVcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVByb21wdEJ1dHRvbihpZCwgdGV4dCl7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkudGV4dENvbnRlbnQgPSB0ZXh0O1xyXG4gICAgc2hvd1Byb21wdEJ1dHRvbihpZCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhpZGVQcm9tcHRCdXR0b24oaWQpe1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVuY2xpY2tBbGwoKXtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcHRpb24xJykuY2xhc3NMaXN0LnJlbW92ZSgnY2xpY2tlZCcpO1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29wdGlvbjInKS5jbGFzc0xpc3QucmVtb3ZlKCdjbGlja2VkJyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFwcGx5Q2xpY2tlZFN0eWxlKGJ1dHRvbil7XHJcbiAgICB1bmNsaWNrQWxsKCk7XHJcbiAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnY2xpY2tlZCcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRQcm9tcHRCdXR0b25BY3Rpb24oYnV0dG9uX2lkLCBhY3Rpb25fZm4pe1xyXG4gICAgY29uc3QgYnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ1dHRvbl9pZCk7XHJcbiAgICBidXR0b25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWN0aW9uX2ZuKTtcclxuICAgIGJ1dHRvbkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpe1xyXG4gICAgICAgIGFwcGx5Q2xpY2tlZFN0eWxlKHRoaXMpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbW92ZVByb21wdEJ1dHRvbkFjdGlvbihidXR0b25faWQsIGFjdGlvbl9mbil7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidXR0b25faWQpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWN0aW9uX2ZuKTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IExlZnQgPSB7XHJcbiAgICBzaG93IDogZnVuY3Rpb24oKSB7IHNob3dQcm9tcHRCdXR0b24oJ29wdGlvbjEnKSB9LFxyXG4gICAgaGlkZSA6IGZ1bmN0aW9uKCkgeyBoaWRlUHJvbXB0QnV0dG9uKCdvcHRpb24xJykgfSxcclxuICAgIHVwZGF0ZVRleHQgOiBmdW5jdGlvbih0ZXh0KSB7IHVwZGF0ZVByb21wdEJ1dHRvbignb3B0aW9uMScsIHRleHQpIH0sXHJcbiAgICBhZGRBY3Rpb24gOiBmdW5jdGlvbihhY3Rpb25fZm4pIHsgYWRkUHJvbXB0QnV0dG9uQWN0aW9uKCdvcHRpb24xJywgYWN0aW9uX2ZuKSB9LFxyXG4gICAgcmVtb3ZlQWN0aW9uIDogZnVuY3Rpb24oYWN0aW9uX2ZuKSB7IHJlbW92ZVByb21wdEJ1dHRvbkFjdGlvbignb3B0aW9uMScsIGFjdGlvbl9mbikgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgUmlnaHQgPSB7XHJcbiAgICBzaG93IDogZnVuY3Rpb24oKSB7IHNob3dQcm9tcHRCdXR0b24oJ29wdGlvbjInKSB9LFxyXG4gICAgaGlkZSA6IGZ1bmN0aW9uKCkgeyBoaWRlUHJvbXB0QnV0dG9uKCdvcHRpb24yJykgfSxcclxuICAgIHVwZGF0ZVRleHQgOiBmdW5jdGlvbih0ZXh0KSB7IHVwZGF0ZVByb21wdEJ1dHRvbignb3B0aW9uMicsIHRleHQpIH0sXHJcbiAgICBhZGRBY3Rpb24gOiBmdW5jdGlvbihhY3Rpb25fZm4pIHsgYWRkUHJvbXB0QnV0dG9uQWN0aW9uKCdvcHRpb24yJywgYWN0aW9uX2ZuKSB9LFxyXG4gICAgcmVtb3ZlQWN0aW9uIDogZnVuY3Rpb24oYWN0aW9uX2ZuKSB7IHJlbW92ZVByb21wdEJ1dHRvbkFjdGlvbignb3B0aW9uMicsIGFjdGlvbl9mbikgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgQnV0dG9ucyA9IHtcclxuICAgIExlZnQgOiBMZWZ0LFxyXG4gICAgUmlnaHQgOiBSaWdodCxcclxuICAgIHNob3cgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICBzaG93UHJvbXB0QnV0dG9uKCdvcHRpb24xJyk7XHJcbiAgICAgICAgc2hvd1Byb21wdEJ1dHRvbignb3B0aW9uMicpO1xyXG4gICAgfSxcclxuICAgIGhpZGUgOiBmdW5jdGlvbigpIHtcclxuICAgICAgICBoaWRlUHJvbXB0QnV0dG9uKCdvcHRpb24xJyk7XHJcbiAgICAgICAgaGlkZVByb21wdEJ1dHRvbignb3B0aW9uMicpO1xyXG4gICAgfSxcclxuICAgIHJlc2V0IDogdW5jbGlja0FsbFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCdXR0b25zOyIsImltcG9ydCAnLi9wcm9tcHQuY3NzJztcclxuXHJcbmltcG9ydCBUZXh0IGZyb20gXCIuL3N1YmNvbXBvbmVudHMvdGV4dC5qc1wiO1xyXG5pbXBvcnQgQnV0dG9ucyBmcm9tIFwiLi9zdWJjb21wb25lbnRzL2J1dHRvbnMuanNcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBQcm9tcHQgPSB7XHJcbiAgICBUZXh0IDogVGV4dCxcclxuICAgIEJ1dHRvbnMgOiBCdXR0b25zLFxyXG4gICAgaGlkZSA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgVGV4dC5oaWRlKCk7XHJcbiAgICAgICAgQnV0dG9ucy5oaWRlKCk7XHJcbiAgICB9LFxyXG4gICAgc2hvdyA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgVGV4dC5zaG93KCk7XHJcbiAgICAgICAgQnV0dG9ucy5zaG93KCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFByb21wdCIsImltcG9ydCAnLi9ib2R5LmNzcyc7XHJcblxyXG5pbXBvcnQgV2VsY29tZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3dlbGNvbWUvd2VsY29tZS5qcydcclxuaW1wb3J0IHsgQWNjb3JkaW9uIH0gZnJvbSAnLi4vYWNjb3JkaW9uL2FjY29yZGlvbi5qcyc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWQgfSBmcm9tICcuLi9maWxlX3VwbG9hZC9maWxlX3VwbG9hZC5qcyc7XHJcbmltcG9ydCBNb2RhbCBmcm9tICcuLi9tb2RhbC9tb2RhbC5qcyc7XHJcbmltcG9ydCBOYXZCdXR0b25zIGZyb20gJy4uL25hdl9idXR0b25zL25hdl9idXR0b25zLmpzJztcclxuaW1wb3J0IFByb21wdCBmcm9tICcuLi9wcm9tcHQvcHJvbXB0LmpzJztcclxuaW1wb3J0IFNpZGViYXIgZnJvbSAnLi4vc2lkZWJhci9zaWRlYmFyLmpzJztcclxuaW1wb3J0IFRhYmxlIGZyb20gJy4uL3RhYmxlL3RhYmxlLmpzJztcclxuXHJcbmZ1bmN0aW9uIHJlc2V0UGFnZSgpIHtcclxuICAgIC8vIGhpZGUgZXZlcnl0aGluZyBpbiB0aGUgYm9keVxyXG4gICAgV2VsY29tZS5oaWRlKCk7XHJcbiAgICBNb2RhbC5jbGVhcigpO1xyXG4gICAgTW9kYWwuaGlkZSgpO1xyXG4gICAgTmF2QnV0dG9ucy5oaWRlKCk7XHJcbiAgICBQcm9tcHQuaGlkZSgpO1xyXG4gICAgVGFibGUuaGlkZSgpO1xyXG4gICAgU2lkZWJhci5oaWRlKCk7XHJcbiAgICBBY2NvcmRpb24uaGlkZSgpO1xyXG4gICAgRmlsZVVwbG9hZC5oaWRlKCk7XHJcbiAgICAvLyBkaXNhYmxlIG5leHQgYnV0dG9uXHJcbiAgICBOYXZCdXR0b25zLk5leHQuZGlzYWJsZSgpO1xyXG4gICAgUHJvbXB0LkJ1dHRvbnMucmVzZXQoKTtcclxuICAgIC8vIGRpc2FibGUgc3VibWl0IGJ1dHRvblxyXG4gICAgTW9kYWwuU3VibWl0LmRlaW5pdCgpO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgQm9keSA9IHtcclxuICAgIHJlc2V0IDogcmVzZXRQYWdlXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJvZHk7IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2Zvcm0uY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5vcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vZm9ybS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCIvLyBmdW5jdGlvbiB0byBhZGQgcXVlc3Rpb25zIHRvIGZvcm1zXHJcbi8vIHR5cGUgaXMgJ2lucHV0JyBvciAndGV4dGFyZWEnXHJcbi8vIGlucHV0VHlwZSBpcyBmb3IgdmFsaWRhdGlvbiAoJ251bWJlcicgb3IgJ3RleHQnLCBldGMpXHJcbmZ1bmN0aW9uIGFwcGVuZEZvcm1FbGVtZW50KHR5cGUsIGxhYmVsLCBpbnB1dElkLCByZXF1aXJlZCwgaW5wdXRUeXBlLCBmb3JtX2lkID0gJ25ldy1mb3JtJywgY29zdCA9IGZhbHNlKSB7XHJcblxyXG4gICAgLy8gY2hhbmdlIGlmIHdlIHdhbnQgZm9ybXMgZWxzZXdoZXJlXHJcbiAgICBjb25zdCBmb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybV9pZCk7XHJcblxyXG4gICAgLy8gY3JlYXRlIG91dGVyIHdyYXBwZXIgZm9yIGVsZW1lbnRcclxuICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgIFxyXG5cclxuICAgIC8vIGxhYmVsIHF1ZXN0aW9uXHJcbiAgICBjb25zdCBsYWJlbEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcclxuICAgIGxhYmVsRWwudGV4dENvbnRlbnQgPSBsYWJlbDtcclxuICBcclxuICAgIC8vIHNldCB0eXBlIChpbnB1dCBvciB0ZXh0YXJlYSlcclxuICAgIGxldCBpbnB1dEVsO1xyXG4gICAgaWYgKHR5cGUgPT09ICdpbnB1dCcpIHtcclxuICAgICAgaW5wdXRFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICAgIGlucHV0RWwudHlwZSA9IGlucHV0VHlwZTtcclxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RleHRhcmVhJykge1xyXG4gICAgICBpbnB1dEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlJyk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBtYXJrIGFzIHJlcXVpcmVkIGlmIGFwcGxpY2FibGVcclxuICAgIGlucHV0RWwucmVxdWlyZWQgPSByZXF1aXJlZDtcclxuXHJcbiAgICAvLyBJZiBhbiBJRCBpcyBwcm92aWRlZCwgc2V0IGl0IG9uIHRoZSBlbGVtZW50XHJcbiAgICBpZiAoaW5wdXRJZCkge1xyXG4gICAgICAgIGlucHV0RWwuaWQgPSBpbnB1dElkO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgLy8gYWRkIGVsZW1lbnRzXHJcbiAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGxhYmVsRWwpO1xyXG4gICAgd3JhcHBlci5hcHBlbmRDaGlsZChpbnB1dEVsKTtcclxuICAgIGZvcm0uYXBwZW5kQ2hpbGQod3JhcHBlcik7XHJcbn0gXHJcblxyXG5leHBvcnQgY29uc3QgTmV3RmllbGQgPSB7XHJcbiAgICBzaG9ydFRleHQgOiBmdW5jdGlvbihsYWJlbCwgaW5wdXRJZCwgcmVxdWlyZWQgPSBmYWxzZSwgZm9ybV9pZCA9ICduZXctZm9ybScsIGNvc3QgPSBmYWxzZSkge1xyXG4gICAgICAgIGFwcGVuZEZvcm1FbGVtZW50KCdpbnB1dCcsIGxhYmVsLCBpbnB1dElkLCByZXF1aXJlZCwgJ3RleHQnLCBmb3JtX2lkKTtcclxuICAgIH0sXHJcbiAgICBsb25nVGV4dCA6IGZ1bmN0aW9uKGxhYmVsLCBpbnB1dElkLCByZXF1aXJlZCA9IGZhbHNlLCBmb3JtX2lkID0gJ25ldy1mb3JtJywgY29zdCA9IGZhbHNlKSB7XHJcbiAgICAgICAgYXBwZW5kRm9ybUVsZW1lbnQoJ3RleHRhcmVhJywgbGFiZWwsIGlucHV0SWQsIHJlcXVpcmVkLCBmb3JtX2lkKTtcclxuICAgIH0sXHJcbiAgICBudW1lcmljSW5wdXQ6IGZ1bmN0aW9uKGxhYmVsLCBpbnB1dElkLCByZXF1aXJlZCA9IGZhbHNlLCBmb3JtX2lkID0gJ25ldy1mb3JtJywgY29zdCA9IHRydWUpIHtcclxuICAgICAgICBhcHBlbmRGb3JtRWxlbWVudCgnaW5wdXQnLCBsYWJlbCwgaW5wdXRJZCwgcmVxdWlyZWQsICdudW1iZXInLCBmb3JtX2lkKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTmV3RmllbGQ7IiwiZnVuY3Rpb24gYWRkU3VibWl0QnV0dG9uVG9Gb3JtKGZvcm1faWQpIHtcclxuICAgIC8vIEZpbmQgdGhlIGZvcm0gYnkgaXRzIElEXHJcbiAgICBjb25zdCBmb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybV9pZCk7XHJcbiAgXHJcbiAgICAvLyBDcmVhdGUgdGhlIGNvbnRhaW5lciBgZGl2YCBmb3IgdGhlIGJ1dHRvblxyXG4gICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICBidXR0b25Db250YWluZXIuaWQgPSAnc3VibWl0LWJ0bi1jb250YWluZXInO1xyXG4gICAgXHJcbiAgICAvLyBDcmVhdGUgdGhlIHN1Ym1pdCBpbnB1dFxyXG4gICAgY29uc3Qgc3VibWl0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgc3VibWl0SW5wdXQuY2xhc3NOYW1lID0gJ2J0biBidG4tc3VibWl0JzsgLy8gVXNlIGFwcHJvcHJpYXRlIGNsYXNzIGZvciB5b3VyIGRlc2lnblxyXG4gICAgc3VibWl0SW5wdXQudHlwZSA9ICdzdWJtaXQnO1xyXG4gICAgc3VibWl0SW5wdXQudmFsdWUgPSAnU3VibWl0JztcclxuXHJcbiAgICAvLyBBcHBlbmQgdGhlIHN1Ym1pdCBpbnB1dCB0byB0aGUgY29udGFpbmVyXHJcbiAgICBidXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQoc3VibWl0SW5wdXQpO1xyXG4gICAgXHJcbiAgICAvLyBBcHBlbmQgdGhlIGNvbnRhaW5lciB0byB0aGUgZm9ybVxyXG4gICAgZm9ybS5hcHBlbmRDaGlsZChidXR0b25Db250YWluZXIpO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgU3VibWl0QnV0dG9uID0ge1xyXG4gICAgYWRkIDogZnVuY3Rpb24oKSB7IGFkZFN1Ym1pdEJ1dHRvblRvRm9ybSgnbmV3LWZvcm0nKSB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN1Ym1pdEJ1dHRvbjsiLCJpbXBvcnQgJy4vZm9ybS5jc3MnO1xyXG5cclxuaW1wb3J0IERyb3Bkb3duIGZyb20gXCIuL3N1YmNvbXBvbmVudHMvZHJvcGRvd24uanNcIjtcclxuaW1wb3J0IE5ld0ZpZWxkIGZyb20gXCIuL3N1YmNvbXBvbmVudHMvZmllbGRzLmpzXCI7XHJcbmltcG9ydCBTdWJtaXRCdXR0b24gZnJvbSBcIi4vc3ViY29tcG9uZW50cy9zdWJtaXQuanNcIjtcclxuXHJcbmZ1bmN0aW9uIGZldGNoQWxsUmVzcG9uc2VzKGV2ZW50KSB7XHJcblxyXG4gICAgLy8gQXNzdW1pbmcgYGV2ZW50LnRhcmdldGAgaXMgdGhlIGZvcm0gaXRzZWxmXHJcbiAgICBjb25zdCBmb3JtID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgXHJcbiAgICAvLyBJbml0aWFsaXplIGFuIGVtcHR5IGFycmF5IHRvIGhvbGQgdGhlIGlucHV0IHZhbHVlc1xyXG4gICAgbGV0IGZvcm1EYXRhID0ge307XHJcbiAgICBcclxuICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGZvcm0gZWxlbWVudFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBmb3JtLmVsZW1lbnRzW2ldO1xyXG4gICAgICBcclxuICAgICAgLy8gRXhjbHVkZSBlbGVtZW50cyB0aGF0IGFyZW4ndCBpbnB1dHMsIHRleHRhcmVhcywgb3Igc2VsZWN0XHJcbiAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHxcclxuICAgICAgICAgIGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fFxyXG4gICAgICAgICAgZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xyXG4gICAgICAgIC8vIEV4Y2x1ZGUgaW5wdXQgdHlwZXMgdGhhdCBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIHN1Ym1pc3Npb24gKHN1Y2ggYXMgYHN1Ym1pdGApXHJcbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSAhPT0gJ3N1Ym1pdCcgJiYgZWxlbWVudC50eXBlICE9PSAnYnV0dG9uJykge1xyXG4gICAgICAgICAgZm9ybURhdGFbZWxlbWVudC5pZF0gPSBlbGVtZW50LnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBmb3JtLnJlc2V0KCk7XHJcbiAgICByZXR1cm4gZm9ybURhdGE7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZEZvcm0oZWxlbWVudF9pZCA9ICdtb2RhbC1ib2R5JywgZm9ybV9pZCA9ICduZXctZm9ybScpIHtcclxuICBcclxuICBjb25zdCB0YXJnZXRfZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRfaWQpO1xyXG5cclxuICAvLyBjcmVhdGUgZm9ybVxyXG4gIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XHJcbiAgZm9ybS5zZXRBdHRyaWJ1dGUoJ2lkJywgZm9ybV9pZCk7XHJcblxyXG4gIC8vIEFwcGVuZCB0aGUgZm9ybSB0byB0aGUgbW9kYWwgYm9keVxyXG4gIHRhcmdldF9lbGVtLmFwcGVuZENoaWxkKGZvcm0pO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IEZvcm0gPSB7XHJcbiAgbmV3IDogZnVuY3Rpb24ocGFyZW50X2VsZW1faWQpIHsgYWRkRm9ybShwYXJlbnRfZWxlbV9pZCwgJ25ldy1mb3JtJykgfSxcclxuICBmZXRjaEFsbFJlc3BvbnNlcyA6IGZ1bmN0aW9uKGV2ZW50KSB7IHJldHVybiBmZXRjaEFsbFJlc3BvbnNlcyhldmVudCkgfSxcclxuICBOZXdGaWVsZCA6IE5ld0ZpZWxkLFxyXG4gIERyb3Bkb3duIDogRHJvcGRvd24sXHJcbiAgU3VibWl0QnV0dG9uIDogU3VibWl0QnV0dG9uXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZvcm07IiwiXHJcbmltcG9ydCBQcm9tcHQgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzJ1xyXG5pbXBvcnQgTW9kYWwgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9tb2RhbC9tb2RhbC5qcydcclxuaW1wb3J0IEZvcm0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9mb3JtL2Zvcm0uanMnXHJcbmltcG9ydCBUYWJsZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzJ1xyXG5pbXBvcnQgQm9keSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qcydcclxuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5qcydcclxuaW1wb3J0IFN1YnRpdGxlIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5qcydcclxuaW1wb3J0IFNpZGViYXIgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9zaWRlYmFyL3NpZGViYXIuanMnXHJcbmltcG9ydCB7IG5leHRQYWdlIH0gZnJvbSAnLi4vdmlld19sb2dpYy5qcydcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplUGFnZVZpZXcoKSB7XHJcbiAgICAvLyBQcmVwYXJlIHBhZ2Ugdmlld1xyXG4gICAgQm9keS5yZXNldCgpO1xyXG4gICAgTmF2QnV0dG9ucy5zaG93KCk7XHJcbiAgICBTaWRlYmFyLnNob3coKTtcclxuXHJcbiAgICAvLyByZW1vdmUgZnVuZCBzZWxlY3Rpb25cclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZnVuZFwiLCAnJyk7XHJcblxyXG4gICAgLy8gTG9hZCB0ZXh0XHJcbiAgICBTdWJ0aXRsZS51cGRhdGUoJ05ldyBJbml0aWF0aXZlcycpO1xyXG4gICAgUHJvbXB0LlRleHQudXBkYXRlKCdEbyB5b3UgaGF2ZSBhbnkgbmV3IGluaXRpYXRpdmVzIGZvciBGWTI2PycpO1xyXG4gICAgUHJvbXB0LkJ1dHRvbnMuTGVmdC51cGRhdGVUZXh0KCdZZXMnKTtcclxuICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LnVwZGF0ZVRleHQoJ05vJyk7XHJcbiAgICAvLyBjbGlja2luZyAnbm8gbmV3IGluaXRpYWxpdGl2ZXMnIHdpbGwgYWxzbyB0YWtlIHVzIHRvIHRoZSBuZXh0IHBhZ2VcclxuICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LmFkZEFjdGlvbihuZXh0UGFnZSk7XHJcbiAgICBQcm9tcHQuQnV0dG9ucy5MZWZ0LmFkZEFjdGlvbihOYXZCdXR0b25zLk5leHQuZW5hYmxlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFVwTW9kYWwoKSB7XHJcbiAgICAvLyBJbml0aWFsaXplIG1vZGFsXHJcbiAgICBNb2RhbC5jbGVhcigpO1xyXG4gICAgTW9kYWwuTGluay5hZGQoJ29wdGlvbjEnKTtcclxuICAgIE1vZGFsLlRpdGxlLnVwZGF0ZSgnTmV3IGluaXRpYXRpdmUnKTtcclxuICAgIE1vZGFsLkxpbmsuYWRkKCdhZGQtYnRuJyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRVcEZvcm0oKSB7XHJcbiAgICAvLyBTZXQgdXAgZm9ybVxyXG4gICAgRm9ybS5uZXcoJ21vZGFsLWJvZHknKTtcclxuICAgIEZvcm0uTmV3RmllbGQuc2hvcnRUZXh0KCdJbml0aWF0aXZlIE5hbWU6JywgJ0luaXRpYXRpdmUgTmFtZScsIHRydWUpOyBcclxuICAgIEZvcm0uTmV3RmllbGQubG9uZ1RleHQoYERlc2NyaWJlIHdoYXQgdGhlIEluaXRpYXRpdmUgaXMgYW5kIHdoeSBpdCBpcyBuZWVkZWQgYW5kIHNob3VsZCBiZSBmdW5kZWQ6IFxyXG4gICAgICAgIGkpLiBXaGF0IGlzIHRoZSBidXNpbmVzcyBjYXNlIGZvciB0aGUgSW5pdGlhdGl2ZT9cclxuICAgICAgICBpaSkuIFdoeSBpcyB0aGUgaW5pdGlhdGl2ZSBuZWVkZWQ/IFdoYXQgaXMgdGhlIHZhbHVlLWFkZCB0byByZXNpZGVudHM/IFdoYXQgaXMgdGhlIERlcGFydG1lbnTigJlzIHBsYW4gZm9yIGltcGxlbWVudGluZyB0aGUgSW5pdGlhdGl2ZT9cclxuICAgICAgICBpaWkpLiBXaHkgY2Fu4oCZdCB0aGUgSW5pdGlhdGl2ZSBiZSBmdW5kZWQgd2l0aCB0aGUgRGVwYXJ0bWVudOKAmXMgYmFzZWxpbmUgYnVkZ2V0P2AsICdFeHBsYW5hdGlvbicsIHRydWUpO1xyXG5cclxuICAgIEZvcm0uTmV3RmllbGQubnVtZXJpY0lucHV0KCdXaGF0IGlzIHlvdXIgYmFsbHBhcmsgZXN0aW1hdGUgb2YgVE9UQUwgQURESVRPTkFMIGV4cGVuc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluaXRpYXRpdmU/JywgJ0JhbGxwYXJrIFRvdGFsJywgZmFsc2UpO1xyXG5cclxuICAgIEZvcm0uTmV3RmllbGQubnVtZXJpY0lucHV0KCdFc3RpbWF0ZSBvZiBBRERJVE9OQUwgcGVyc29ubmVsIGNvc3Q/JywgJ1BlcnNvbm5lbCBDb3N0JywgZmFsc2UpO1xyXG4gICAgRm9ybS5OZXdGaWVsZC5udW1lcmljSW5wdXQoJ0VzdGltYXRlIG9mIEFERElUT05BTCBub25wZXJzb25uZWwgY29zdD8nLCAnTm9uLXBlcnNvbm5lbCBDb3N0JywgZmFsc2UpO1xyXG4gICAgRm9ybS5OZXdGaWVsZC5udW1lcmljSW5wdXQoJ0VzdGltYXRlIG9mIEFERElUT05BTCByZXZlbnVlIChpZiBhcHBsaWNhYmxlKT8nLCAnUmV2ZW51ZScsIGZhbHNlKTtcclxuXHJcbiAgICBGb3JtLlN1Ym1pdEJ1dHRvbi5hZGQoKTtcclxuICAgIC8vIEluaXRpYWxpemUgZm9ybSBzdWJtaXNzaW9uIHRvIHRhYmxlIGRhdGFcclxuICAgIE1vZGFsLlN1Ym1pdC5pbml0KGhhbmRsZU5ld0luaXRTdWJtaXNzaW9uKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYXNzaWduQ2xhc3NlcygpIHtcclxuICAgIC8vIHJlY29yZCBjb2x1bW5zIGFuZCB0aGVpciBjbGFzc2VzXHJcbiAgICBjb25zdCBpbml0aWF0aXZlc0NvbHMgPSBbXHJcbiAgICAgICAgeyB0aXRsZTogJ0luaXRpYXRpdmUgTmFtZScsIGNsYXNzTmFtZTogJ2luaXQtbmFtZScgfSxcclxuICAgICAgICB7IHRpdGxlOiBgRXhwbGFuYXRpb25gLCBjbGFzc05hbWU6ICdleHBsYW5hdGlvbicgfSxcclxuICAgICAgICB7IHRpdGxlOiAnQmFsbHBhcmsgVG90YWwnLCBjbGFzc05hbWU6ICd0b3RhbCcsIGlzQ29zdDogdHJ1ZSB9LFxyXG4gICAgICAgIHsgdGl0bGU6ICdSZXZlbnVlJywgY2xhc3NOYW1lOiAncmV2ZW51ZScsIGlzQ29zdDogdHJ1ZSB9LFxyXG4gICAgICAgIHsgdGl0bGU6ICdQZXJzb25uZWwgQ29zdCcsIGNsYXNzTmFtZTogJ3BlcnNvbm5lbCcsIGlzQ29zdDogdHJ1ZSB9LFxyXG4gICAgICAgIHsgdGl0bGU6ICdOb24tcGVyc29ubmVsIENvc3QnLCBjbGFzc05hbWU6ICdub25wZXJzb25uZWwnLCBpc0Nvc3Q6IHRydWUgfVxyXG4gICAgXTtcclxuXHJcbiAgICAvLyBhc3NpZ24gY29zdCBjbGFzc2VzXHJcbiAgICBUYWJsZS5Db2x1bW5zLmFzc2lnbkNsYXNzZXMoaW5pdGlhdGl2ZXNDb2xzKVxyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZUluaXRUYWJsZSgpe1xyXG4gICAgLy8gbG9hZCB0YWJsZSBkYXRhIGZyb20gc3RvcmFnZVxyXG4gICAgaWYoYXdhaXQgVGFibGUuRGF0YS5sb2FkKCkpIHtcclxuICAgICAgICAvL2FmdGVyIHRhYmxlIGlzIGxvYWRlZCwgZmlsbCBpdFxyXG4gICAgICAgIGFzc2lnbkNsYXNzZXMoKTtcclxuICAgICAgICBUYWJsZS5hZGp1c3RXaWR0aCgnNzAlJyk7XHJcbiAgICAgICAgVGFibGUuQnV0dG9ucy5BZGRSb3cudXBkYXRlVGV4dCgnQWRkIGFub3RoZXIgbmV3IGluaXRpYXRpdmUnKTtcclxuICAgICAgICB0YWJsZVZpZXcoKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlTmV3SW5pdFN1Ym1pc3Npb24oZXZlbnQpe1xyXG4gICAgLy8gZ2V0IGFuc3dlcnMgZnJvbSBmb3JtLCBoaWRlIGZvcm0sIHNob3cgYW5zd2VycyBpbiB0YWJsZVxyXG4gICAgY29uc3QgcmVzcG9uc2VzID0gRm9ybS5mZXRjaEFsbFJlc3BvbnNlcyhldmVudCk7XHJcbiAgICAvLyBtYWtlIHN1cmUgaXQncyBub3QgYW4gZW1wdHkgcmVzcG9uc2VcclxuICAgIGlmIChPYmplY3QudmFsdWVzKHJlc3BvbnNlcylbMF0gIT0gJycpe1xyXG4gICAgICAgIC8vIGFkZCBkYXRhIHRvIHRhYmxlXHJcbiAgICAgICAgVGFibGUuUm93cy5hZGQocmVzcG9uc2VzKTtcclxuICAgICAgICAvLyBzYXZlIGl0XHJcbiAgICAgICAgVGFibGUuc2F2ZSgpO1xyXG4gICAgICAgIHRhYmxlVmlldygpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB0YWJsZVZpZXcoKSB7XHJcbiAgICAvLyBjaGFuZ2UgcGFnZSB2aWV3XHJcbiAgICBUYWJsZS5zaG93KCk7XHJcbiAgICBNb2RhbC5oaWRlKCk7XHJcbiAgICBQcm9tcHQuaGlkZSgpO1xyXG4gICAgYXNzaWduQ2xhc3NlcygpO1xyXG4gICAgVGFibGUuQnV0dG9ucy5BZGRSb3cuc2hvdygpO1xyXG4gICAgTmF2QnV0dG9ucy5OZXh0LmVuYWJsZSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTW9kYWxMaW5rcygpe1xyXG4gICAgTW9kYWwuTGluay5yZW1vdmUoJ29wdGlvbjEnKTtcclxuICAgIE1vZGFsLkxpbmsucmVtb3ZlKCdhZGQtYnRuJyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVQcm9tcHRCdXR0b25MaXN0ZW5lcnMoKXtcclxuICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LnJlbW92ZUFjdGlvbihuZXh0UGFnZSk7XHJcbiAgICBQcm9tcHQuQnV0dG9ucy5MZWZ0LnJlbW92ZUFjdGlvbihOYXZCdXR0b25zLk5leHQuZW5hYmxlKTtcclxuICAgIE1vZGFsLmNsZWFyKCk7XHJcbn0iLCJcclxuaW1wb3J0IHsgaW5pdGlhbGl6ZVBhZ2VWaWV3LCBzZXRVcE1vZGFsLCBzZXRVcEZvcm0sIHJlbW92ZU1vZGFsTGlua3MsIHJlbW92ZVByb21wdEJ1dHRvbkxpc3RlbmVycywgaW5pdGlhbGl6ZUluaXRUYWJsZSB9IGZyb20gJy4vaGVscGVycy5qcydcclxuaW1wb3J0IHsgQ3VycmVudFBhZ2UgfSBmcm9tICcuLi8uLi91dGlscy9kYXRhX3V0aWxzL2xvY2FsX3N0b3JhZ2VfaGFuZGxlcnMuanMnXHJcblxyXG5cclxuLy8gc2V0IHVwIHBhZ2UgYW5kIGluaXRpYWxpemUgYWxsIGJ1dHRvbnNcclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWROZXdJbml0aWF0aXZlcygpIHtcclxuICAgIEN1cnJlbnRQYWdlLnVwZGF0ZSgnbmV3LWluaXRzJyk7XHJcbiAgICBpbml0aWFsaXplUGFnZVZpZXcoKTtcclxuICAgIHNldFVwTW9kYWwoKTtcclxuICAgIHNldFVwRm9ybSgpO1xyXG4gICAgaW5pdGlhbGl6ZUluaXRUYWJsZSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcEluaXRpYXRpdmVzUGFnZSgpIHtcclxuICAgIHJlbW92ZU1vZGFsTGlua3MoKTtcclxuICAgIC8vIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgb24gcHJvbXB0IGJ1dHRvbnNcclxuICAgIHJlbW92ZVByb21wdEJ1dHRvbkxpc3RlbmVycygpO1xyXG59IiwiaW1wb3J0IHsgQ3VycmVudFBhZ2UgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZGF0YV91dGlscy9sb2NhbF9zdG9yYWdlX2hhbmRsZXJzLmpzXCI7XHJcbmltcG9ydCBQcm9tcHQgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9wcm9tcHQvcHJvbXB0LmpzJ1xyXG5pbXBvcnQgQm9keSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9ib2R5L2JvZHkuanNcIjtcclxuaW1wb3J0IFN1YnRpdGxlIGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanNcIjtcclxuaW1wb3J0IHsgdmlzaXRQYWdlIH0gZnJvbSBcIi4uL3ZpZXdfbG9naWMuanNcIjtcclxuaW1wb3J0IHsgQWNjb3JkaW9uIH0gZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvYWNjb3JkaW9uL2FjY29yZGlvbi5qc1wiO1xyXG5pbXBvcnQgeyBkb3dubG9hZFhMU1ggfSBmcm9tIFwiLi4vLi4vdXRpbHMvZGF0YV91dGlscy9YTFNYX2hhbmRsZXJzLmpzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbG9hZFN1bW1hcnlQYWdlKCl7XHJcbiAgICAvL3VwZGF0ZSBwYWdlIHN0YXRlXHJcbiAgICBDdXJyZW50UGFnZS51cGRhdGUoJ3N1bW1hcnknKTtcclxuICAgIHN1bW1hcnlWaWV3KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVwU3VtbWFyeVBhZ2UoKXtcclxuICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LnJlbW92ZUFjdGlvbihyZXR1cm5Ub1dlbGNvbWUpO1xyXG4gICAgUHJvbXB0LkJ1dHRvbnMuTGVmdC5yZW1vdmVBY3Rpb24oZG93bmxvYWRYTFNYKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN1bW1hcnlWaWV3KCl7XHJcbiAgICBCb2R5LnJlc2V0KCk7XHJcbiAgICBBY2NvcmRpb24uY3JlYXRlRnJvbUZ1bmRzKCk7XHJcbiAgICBBY2NvcmRpb24uc2hvdygpO1xyXG5cclxuICAgIC8vIHByb21wdCBidXR0b25zXHJcbiAgICBQcm9tcHQuVGV4dC51cGRhdGUoJycpO1xyXG4gICAgUHJvbXB0LnNob3coKTtcclxuICAgIFByb21wdC5CdXR0b25zLkxlZnQudXBkYXRlVGV4dCgnRG93bmxvYWQgRXhjZWwnKTtcclxuICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LnVwZGF0ZVRleHQoJ0dvIGJhY2sgdG8gaG9tZScpO1xyXG5cclxuICAgIC8vIHVwZGF0ZSBwYWdlIHRleHRcclxuICAgIFN1YnRpdGxlLnVwZGF0ZSgnU3VtbWFyeScpO1xyXG4gICAgLy8gYWRkIGJ1dHRvbiBsaW5rc1xyXG4gICAgUHJvbXB0LkJ1dHRvbnMuUmlnaHQuYWRkQWN0aW9uKHJldHVyblRvV2VsY29tZSk7XHJcbiAgICBQcm9tcHQuQnV0dG9ucy5MZWZ0LmFkZEFjdGlvbihkb3dubG9hZFhMU1gpO1xyXG4gICAgXHJcbn1cclxuXHJcbmNvbnN0IHJldHVyblRvV2VsY29tZSA9ICgpID0+IHt2aXNpdFBhZ2UoJ3dlbGNvbWUnKX1cclxuXHJcbiIsIlxyXG5pbXBvcnQgU3VidGl0bGUgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9oZWFkZXIvaGVhZGVyLmpzJ1xyXG5pbXBvcnQgUHJvbXB0IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5qcydcclxuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5qcydcclxuaW1wb3J0IFRhYmxlIGZyb20gXCIuLi8uLi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzXCI7XHJcbmltcG9ydCBCb2R5IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qc1wiO1xyXG5pbXBvcnQgeyBDdXJyZW50RnVuZCB9IGZyb20gJy4uLy4uL3V0aWxzL2RhdGFfdXRpbHMvbG9jYWxfc3RvcmFnZV9oYW5kbGVycy5qcyc7XHJcblxyXG5jb25zdCBmdW5kQ29scyA9IFtcclxuICAgIHsgdGl0bGU6ICdGdW5kJywgY2xhc3NOYW1lOiAnZnVuZC1uYW1lJyB9LFxyXG5dO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVQYWdlVmlldygpe1xyXG4gICAgXHJcbiAgICBDdXJyZW50RnVuZC5yZXNldCgpO1xyXG5cclxuICAgIC8vIHByZXBhcmUgcGFnZSB2aWV3XHJcbiAgICBCb2R5LnJlc2V0KCk7XHJcbiAgICBOYXZCdXR0b25zLnNob3coKTtcclxuXHJcbiAgICAvLyB1cGRhdGUgcGFnZSB0ZXh0XHJcbiAgICBTdWJ0aXRsZS51cGRhdGUoJ0Jhc2VsaW5lIEJ1ZGdldCBSZXF1ZXN0Jyk7XHJcbiAgICAvLyBUT0RPOiB1cGRhdGUgdG8gbWFrZSBkeW5hbWljXHJcbiAgICBQcm9tcHQuVGV4dC51cGRhdGUoYFdlIHdpbGwgbm93IGFzayB5b3UgYSBzZXJpZXMgb2YgcXVlc3Rpb25zIGFib3V0IHlvdXIgQkFTRUxJTkUgYnVkZ2V0IHJlcXVlc3QuXHJcbiAgICAgICAgQXQgdGhlIGVuZCwgd2Ugd2lsbCBhc2sgeW91IGFib3V0IGFueSBuZXcgaW5pdGlhdGl2ZXMgKGllLiBzdXBwbGVtZW50YWwgcmVxdWVzdHMpLlxyXG4gICAgICAgIFNlbGVjdCBvbmUgb2YgeW91ciBmdW5kcyB0byBiZWdpbi5gKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYWxsb3dSb3dTZWxlY3Rpb24oKXtcclxuICAgIHZhciB0YWJsZVJvd3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwidGJvZHkgdHJcIik7XHJcbiAgICB0YWJsZVJvd3MuZm9yRWFjaChmdW5jdGlvbihyb3cpIHtcclxuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnaG92ZXItZWZmZWN0Jyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcm93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZSgnaG92ZXItZWZmZWN0Jyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdEZ1bmQodGFibGVSb3dzLCB0aGlzKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZUZ1bmRUYWJsZSgpe1xyXG4gICAgYXdhaXQgVGFibGUuRGF0YS5sb2FkRnVuZHMoKTtcclxuICAgIFRhYmxlLmFkanVzdFdpZHRoKCczMCUnKTtcclxuICAgIFRhYmxlLnNob3coKTtcclxuICAgIFRhYmxlLkNvbHVtbnMuYXNzaWduQ2xhc3NlcyhmdW5kQ29scyk7XHJcbiAgICBhbGxvd1Jvd1NlbGVjdGlvbigpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZWxlY3RGdW5kKHRhYmxlUm93cywgc2VsZWN0ZWRfcm93KXtcclxuICAgIC8vIHJlbW92ZSBzZWxlY3RlZCBjbGFzcyBmcm9tIGFueSBvdGhlciByb3dzXHJcbiAgICB0YWJsZVJvd3MuZm9yRWFjaChmdW5jdGlvbih0YWJsZVJvdykge1xyXG4gICAgICAgIHRhYmxlUm93LmNsYXNzTGlzdCA9ICcnO1xyXG4gICAgfSk7XHJcbiAgICAvLyBhZGQgc2VsZWN0ZWQgY2xhc3MgdG8gY2xpY2tlZCByb3dcclxuICAgIHNlbGVjdGVkX3Jvdy5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xyXG4gICAgLy8gZ2V0IGZ1bmQgYW5kIHNhdmUgc2VsZWN0ZWQgZnVuZFxyXG4gICAgdmFyIGZ1bmQgPSBzZWxlY3RlZF9yb3cucXVlcnlTZWxlY3RvcignLmZ1bmQtbmFtZScpLnRleHRDb250ZW50O1xyXG4gICAgdmFyIGZ1bmROdW1iZXIgPSBwYXJzZUludChmdW5kKTtcclxuICAgIEN1cnJlbnRGdW5kLnVwZGF0ZShmdW5kTnVtYmVyKTtcclxuICAgIC8vIGVuYWJsZSBuZXh0IHN0ZXBcclxuICAgIE5hdkJ1dHRvbnMuTmV4dC5lbmFibGUoKTtcclxufSIsImltcG9ydCB7IEN1cnJlbnRQYWdlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2RhdGFfdXRpbHMvbG9jYWxfc3RvcmFnZV9oYW5kbGVycy5qc1wiO1xyXG5pbXBvcnQgeyBwcmVwYXJlUGFnZVZpZXcsIGluaXRpYWxpemVGdW5kVGFibGUgfSBmcm9tIFwiLi4vMDJfYmFzZWxpbmVfbGFuZGluZ19wYWdlL2hlbHBlcnMuanNcIjtcclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbG9hZEJhc2VsaW5lTGFuZGluZ1BhZ2UoKXtcclxuICAgIC8vdXBkYXRlIHBhZ2Ugc3RhdGVcclxuICAgIEN1cnJlbnRQYWdlLnVwZGF0ZSgnYmFzZWxpbmUtbGFuZGluZycpO1xyXG4gICAgcHJlcGFyZVBhZ2VWaWV3KCk7XHJcbiAgICBpbml0aWFsaXplRnVuZFRhYmxlKCk7XHJcbn1cclxuIiwiaW1wb3J0IFN1YnRpdGxlIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5qcydcclxuaW1wb3J0IFByb21wdCBmcm9tICcuLi8uLi9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuanMnXHJcbmltcG9ydCBOYXZCdXR0b25zIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanMnXHJcbmltcG9ydCBCb2R5IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qc1wiO1xyXG5pbXBvcnQgeyBEQVRBX1JPT1QgfSBmcm9tICcuLi8uLi9pbml0LmpzJztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvZmlsZV91cGxvYWQvZmlsZV91cGxvYWQuanMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVQYWdlVmlldygpIHtcclxuXHJcbiAgICAvLyByZW1vdmUgZnVuZCBzZWxlY3Rpb25cclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZnVuZFwiLCAnJyk7XHJcblxyXG4gICAgLy8gcHJlcGFyZSBwYWdlIHZpZXdcclxuICAgIEJvZHkucmVzZXQoKTtcclxuICAgIE5hdkJ1dHRvbnMuc2hvdygpO1xyXG4gICAgRmlsZVVwbG9hZC5zaG93KCk7XHJcblxyXG4gICAgLy8gdXBkYXRlIHBhZ2UgdGV4dFxyXG4gICAgU3VidGl0bGUudXBkYXRlKCdFeGNlbCBVcGxvYWQnKTtcclxuICAgIFByb21wdC5UZXh0LnVwZGF0ZShgVXBsb2FkIHRoZSBiYXNlbGluZSBkZXRhaWwgc2hlZXQgZ2l2ZW4gYnkgeW91ciBidWRnZXQgYW5hbHlzdC5gKTtcclxuXHJcbiAgICAvLyBzaG93IGFuZCBpbml0aWFsaXplIGZpbGUgdXBsb2FkOyBlbmFibGUgY29udGludWUgYWZ0ZXIgZmlsZSBzYXZlZCBpbiBsb2NhbCBzdG9yYWdlIFxyXG4gICAgRmlsZVVwbG9hZC5pbml0KCk7XHJcbiAgICBOYXZCdXR0b25zLk5leHQuZW5hYmxlKCk7XHJcbn0iLCJpbXBvcnQgeyBDdXJyZW50UGFnZSB9IGZyb20gXCIuLi8uLi91dGlscy9kYXRhX3V0aWxzL2xvY2FsX3N0b3JhZ2VfaGFuZGxlcnMuanNcIjtcclxuaW1wb3J0IHsgaW5pdGlhbGl6ZVBhZ2VWaWV3IH0gZnJvbSBcIi4vaGVscGVycy5qc1wiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRVcGxvYWRQYWdlKCl7XHJcbiAgICAvL3VwZGF0ZSBwYWdlIHN0YXRlXHJcbiAgICBDdXJyZW50UGFnZS51cGRhdGUoJ3VwbG9hZCcpO1xyXG4gICAgaW5pdGlhbGl6ZVBhZ2VWaWV3KCk7XHJcbiAgICBcclxufSIsImltcG9ydCBTdWJ0aXRsZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanMnXHJcbmltcG9ydCBXZWxjb21lIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvd2VsY29tZS93ZWxjb21lLmpzJ1xyXG5pbXBvcnQgQm9keSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qcydcclxuaW1wb3J0IFNpZGViYXIgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9zaWRlYmFyL3NpZGViYXIuanMnXHJcblxyXG5pbXBvcnQgeyBsb2FkTmV3SW5pdGlhdGl2ZXMgfSBmcm9tICcuLi8wNl9uZXdfaW5pdGlhdGl2ZXMvbWFpbi5qcydcclxuaW1wb3J0IHsgbG9hZFN1bW1hcnlQYWdlIH0gZnJvbSAnLi4vMDdfc3VtbWFyeS9tYWluLmpzJ1xyXG5pbXBvcnQgeyBsb2FkQmFzZWxpbmVMYW5kaW5nUGFnZSB9IGZyb20gJy4uLzAyX2Jhc2VsaW5lX2xhbmRpbmdfcGFnZS9tYWluLmpzJ1xyXG5pbXBvcnQgeyBsb2FkVXBsb2FkUGFnZSB9IGZyb20gJy4uLzAxX3VwbG9hZC9tYWluLmpzJ1xyXG4gXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplUGFnZVZpZXcoKXtcclxuICAgIC8vIHBhZ2Ugc2V0IHVwXHJcbiAgICBCb2R5LnJlc2V0KCk7XHJcbiAgICBTdWJ0aXRsZS51cGRhdGUoXCJXZWxjb21lXCIpO1xyXG4gICAgV2VsY29tZS5zaG93KCk7XHJcbiAgICBTaWRlYmFyLnJlc2V0KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRMaW5rcygpe1xyXG4gICAgLy8gaW5pdGlhbGl6ZSBsaW5rcyBpbiBidXR0b25zXHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RlcC11cGxvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRVcGxvYWRQYWdlKVxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAtaW5pdGlhdGl2ZXMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWROZXdJbml0aWF0aXZlcylcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGVwLXJldmVudWUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRCYXNlbGluZUxhbmRpbmdQYWdlKVxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAtZmluaXNoJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkU3VtbWFyeVBhZ2UpXHJcblxyXG59XHJcbiIsIlxyXG5pbXBvcnQgeyBDdXJyZW50UGFnZSB9IGZyb20gJy4uLy4uL3V0aWxzL2RhdGFfdXRpbHMvbG9jYWxfc3RvcmFnZV9oYW5kbGVycy5qcydcclxuaW1wb3J0IHsgaW5pdGlhbGl6ZVBhZ2VWaWV3LCBhZGRMaW5rcyB9IGZyb20gJy4vaGVscGVycy5qcydcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplV2VsY29tZVBhZ2UoKXtcclxuXHJcbiAgICBDdXJyZW50UGFnZS51cGRhdGUoJ3dlbGNvbWUnKTtcclxuICAgIGluaXRpYWxpemVQYWdlVmlldygpO1xyXG4gICAgYWRkTGlua3MoKTtcclxuXHJcbn0iLCJpbXBvcnQgUHJvbXB0IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5qcydcclxuaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3kgfSBmcm9tICcuLi8uLi91dGlscy9jb21tb25fdXRpbHMuanMnXHJcbmltcG9ydCB7IFJFVkVOVUUgfSBmcm9tICcuLi8uLi9pbml0LmpzJ1xyXG5pbXBvcnQgQm9keSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qcydcclxuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5qcydcclxuaW1wb3J0IHsgbmV4dFBhZ2UgfSBmcm9tICcuLi92aWV3X2xvZ2ljLmpzJ1xyXG5pbXBvcnQgU3VidGl0bGUgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9oZWFkZXIvaGVhZGVyLmpzJ1xyXG5pbXBvcnQgTW9kYWwgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9tb2RhbC9tb2RhbC5qcydcclxuaW1wb3J0IEZvcm0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9mb3JtL2Zvcm0uanMnXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVBhZ2VWaWV3KCl7XHJcbiAgICAvLyBwcmVwYXJlIHBhZ2Ugdmlld1xyXG4gICAgQm9keS5yZXNldCgpO1xyXG4gICAgTmF2QnV0dG9ucy5zaG93KCk7XHJcblxyXG4gICAgLy8gdXBkYXRlIHBhZ2UgdGV4dFxyXG4gICAgU3VidGl0bGUudXBkYXRlKCdSZXZlbnVlIFByb2plY3Rpb25zJyk7XHJcbiAgICAvLyBUT0RPOiB1cGRhdGUgdG8gbWFrZSBkeW5hbWljXHJcbiAgICBQcm9tcHQuVGV4dC51cGRhdGUoYFlvdXIgcmV2ZW51ZSBwcm9qZWN0aW9uIGZvciBGWTI2IGlzICR7Zm9ybWF0Q3VycmVuY3koUkVWRU5VRSwgdHJ1ZSl9YCk7XHJcbiAgICBQcm9tcHQuQnV0dG9ucy5MZWZ0LnVwZGF0ZVRleHQoJ0NvbmZpcm0nKTtcclxuICAgIFByb21wdC5CdXR0b25zLlJpZ2h0LnVwZGF0ZVRleHQoXCJUaGlzIGRvZXNuJ3QgbG9vayByaWdodFwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFVwTmF2QnV0dG9ucygpe1xyXG4gICAgLy8gY2xpY2tpbmcgJ2NvbmZpcm0nIHdpbGwgYWxzbyB0YWtlIHVzIHRvIHRoZSBuZXh0IHBhZ2VcclxuICAgIFByb21wdC5CdXR0b25zLkxlZnQuYWRkQWN0aW9uKG5leHRQYWdlKTtcclxuICAgIC8vIFRPRE86IGFsbG93IHVzZXIgdG8gZWRpdCByZXZlbnVlIGhlcmVcclxuICAgIE1vZGFsLkxpbmsuYWRkKCdvcHRpb24yJyk7XHJcbiAgICBoYW5kbGVFcnJvckNvbW1lbnQoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUJ1dHRvbkV2ZW50cygpe1xyXG4gICAgLy8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVycyBvbiBwcm9tcHQgYnV0dG9uc1xyXG4gICAgUHJvbXB0LkJ1dHRvbnMuTGVmdC5yZW1vdmVBY3Rpb24obmV4dFBhZ2UpO1xyXG4gICAgTW9kYWwuTGluay5yZW1vdmUoJ29wdGlvbjInKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlRXJyb3JDb21tZW50KCl7XHJcbiAgICB2YXIgZnVuZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZnVuZFwiKTtcclxuICAgIE1vZGFsLmNsZWFyKCk7XHJcbiAgICBNb2RhbC5UaXRsZS51cGRhdGUoYENvbW1lbnQgb24gJHtmdW5kfSBSZXZlbnVlYCk7XHJcbiAgICBGb3JtLm5ldygnbW9kYWwtYm9keScpO1xyXG4gICAgRm9ybS5OZXdGaWVsZC5sb25nVGV4dCgnRXhwbGFpbiB5b3VyIGNvbmNlcm5zIGhlcmUuIFNvbWVvbmUgZnJvbSB0aGUgcmV2ZW51ZSB0ZWFtIHdpbGwgZm9sbG93IHVwIHdpdGggeW91LicsXHJcbiAgICAgICAgICdyZXZlbnVlLWNvbW1lbnQnLCB0cnVlKTsgXHJcbiAgICBGb3JtLlN1Ym1pdEJ1dHRvbi5hZGQoKTtcclxuICAgIC8vIHNhdmUgY29tbWVudCBvbiBzdWJtaXNzaW9uXHJcbiAgICBNb2RhbC5TdWJtaXQuaW5pdChoYW5kbGVSZXZlbnVlQ29tbWVudFN1Ym1pc3Npb24pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoYW5kbGVSZXZlbnVlQ29tbWVudFN1Ym1pc3Npb24oZXZlbnQpe1xyXG4gICAgLy8gZ2V0IGRhdGEgZnJvbSBmb3JtIGluIG1vZGFsICAgICAgICBcclxuICAgIGNvbnN0IHJlc3BvbnNlcyA9IEZvcm0uZmV0Y2hBbGxSZXNwb25zZXMoZXZlbnQpO1xyXG4gICAgLy8gVE9ETzogc2F2ZSBjb21tZW50IGhlcmVcclxuXHJcbiAgICAvLyBoaWRlIG1vZGFsLCB1cGRhdGUgcGFnZSwgYW5kIGVuYWJsZSBjb250aW51ZVxyXG4gICAgTW9kYWwuaGlkZSgpO1xyXG4gICAgUHJvbXB0LkJ1dHRvbnMuaGlkZSgpO1xyXG4gICAgUHJvbXB0LlRleHQudXBkYXRlKCdZb3VyIGNvbW1lbnQgaGFzIGJlZW4gcmVjZWl2ZWQuJyk7XHJcbiAgICBOYXZCdXR0b25zLk5leHQuZW5hYmxlKCk7XHJcbn0iLCJpbXBvcnQgeyBDdXJyZW50UGFnZSB9IGZyb20gJy4uLy4uL3V0aWxzL2RhdGFfdXRpbHMvbG9jYWxfc3RvcmFnZV9oYW5kbGVycy5qcydcclxuaW1wb3J0IHsgcHJlcGFyZVBhZ2VWaWV3LCByZW1vdmVCdXR0b25FdmVudHMsIHNldFVwTmF2QnV0dG9ucyB9IGZyb20gJy4vaGVscGVycy5qcydcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2FkUmV2ZW51ZVBhZ2UoKSB7XHJcblxyXG4gICAgLy91cGRhdGUgcGFnZSBzdGF0ZVxyXG4gICAgQ3VycmVudFBhZ2UudXBkYXRlKCdyZXZlbnVlJyk7XHJcbiAgICBwcmVwYXJlUGFnZVZpZXcoKTtcclxuICAgIHNldFVwTmF2QnV0dG9ucygpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2xlYW51cFJldmVudWVQYWdlKCkge1xyXG4gICAgcmVtb3ZlQnV0dG9uRXZlbnRzKCk7XHJcbn07IiwiXHJcbmltcG9ydCB7IEZJU0NBTF9ZRUFSLCBmcmluZ2UsIGNvbGEsIG1lcml0IH0gZnJvbSBcIi4uLy4uL2luaXQuanNcIlxyXG5pbXBvcnQgQm9keSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9ib2R5L2JvZHkuanNcIjtcclxuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvbmF2X2J1dHRvbnMvbmF2X2J1dHRvbnMuanNcIjtcclxuaW1wb3J0IFN1YnRpdGxlIGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanNcIjtcclxuaW1wb3J0IEZvcm0gZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvZm9ybS9mb3JtLmpzXCI7XHJcbmltcG9ydCBNb2RhbCBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9tb2RhbC9tb2RhbC5qc1wiO1xyXG5pbXBvcnQgUHJvbXB0IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuanNcIjtcclxuaW1wb3J0IFRhYmxlIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdGFibGUvdGFibGUuanMnXHJcbmltcG9ydCBTaWRlYmFyIGZyb20gXCIuLi8uLi9jb21wb25lbnRzL3NpZGViYXIvc2lkZWJhci5qc1wiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlcyB9IGZyb20gXCIuLi8uLi91dGlscy9kYXRhX3V0aWxzL2J1ZGdldF9kYXRhX2hhbmRsZXJzLmpzXCI7XHJcbmltcG9ydCB7IGNvbnZlcnRUb0pTT04gfSBmcm9tIFwiLi4vLi4vdXRpbHMvZGF0YV91dGlscy9KU09OX2RhdGFfaGFuZGxlcnMuanNcIjtcclxuXHJcbmltcG9ydCB7IEJhc2VsaW5lLCBsb2FkVGFibGVEYXRhIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2RhdGFfdXRpbHMvbG9jYWxfc3RvcmFnZV9oYW5kbGVycy5qc1wiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVQYWdlVmlldygpe1xyXG4gICAgLy8gcHJlcGFyZSBwYWdlIHZpZXdcclxuICAgIEJvZHkucmVzZXQoKTtcclxuICAgIE5hdkJ1dHRvbnMuc2hvdygpO1xyXG4gICAgU2lkZWJhci5zaG93KCk7XHJcbiAgICBUYWJsZS5hZGp1c3RXaWR0aCgnOTAlJyk7XHJcbiAgICBOYXZCdXR0b25zLk5leHQuZW5hYmxlKCk7XHJcblxyXG4gICAgLy8gdXBkYXRlIHBhZ2UgdGV4dFxyXG4gICAgU3VidGl0bGUudXBkYXRlKCdQZXJzb25uZWwnKTtcclxuICAgIFByb21wdC5UZXh0LnVwZGF0ZShgXHJcbiAgICAgICAgVGhpcyB0YWJsZSBkaXNwbGF5cyB0aGUgbnVtYmVyIG9mIEZURXMgaW4gZWFjaCBqb2IgY29kZSBmb3IgaW4geW91ciBkZXBhcnRtZW50J3MgXHJcbiAgICAgICAgY3VycmVudCAoYW1lbmRlZCkgRlkyNSBidWRnZXQuIFRvIG1ha2UgZWRpdHMgdG8gdGhlIG51bWJlciBvZiBwb3NpdGlvbnMsIGNsaWNrIHRoZVxyXG4gICAgICAgIFwiRWRpdFwiIGJ1dHRvbiBvbiB0aGUgcm93IHlvdSB3b3VsZCBsaWtlIHRvIGVkaXQuIFRoZSBcIlRvdGFsIENvc3RcIiBjb2x1bW4gYW5kIHRoZSBcclxuICAgICAgICBzdW1tYXJ5IHNpZGViYXIgd2lsbCBhbHNvIHVwZGF0ZSB0byByZWZsZWN0IGFueSBlZGl0cy5cclxuICAgIGApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhc3NpZ25DbGFzc2VzKCkge1xyXG4gICAgLy8gcmVjb3JkIGNvbHVtbnMgYW5kIHRoZWlyIGNsYXNzZXNcclxuICAgIGNvbnN0IHBlcnNvbm5lbENvbHVtbnMgPSBbXHJcbiAgICAgICAgeyB0aXRsZTogJ0pvYiBUaXRsZScsIGNsYXNzTmFtZTogJ2pvYi1uYW1lJyB9LFxyXG4gICAgICAgIHsgdGl0bGU6ICdBY2NvdW50IFN0cmluZycsIGNsYXNzTmFtZTogJ3N0cmluZycgfSxcclxuICAgICAgICB7IHRpdGxlOiAnU2VydmljZScsIGNsYXNzTmFtZTogJ3NlcnZpY2UnIH0sXHJcbiAgICAgICAgeyB0aXRsZTogYEZZJHtGSVNDQUxfWUVBUn0gUmVxdWVzdGVkIEZURWAsIGNsYXNzTmFtZTogJ2Jhc2VsaW5lLWZ0ZXMnIH0sXHJcbiAgICAgICAgeyB0aXRsZTogYEZZJHtGSVNDQUxfWUVBUn0gQXZlcmFnZSBQcm9qZWN0ZWQgU2FsYXJ5L1dhZ2VgLCBjbGFzc05hbWU6ICdhdmctc2FsYXJ5JywgaXNDb3N0OiB0cnVlIH0sXHJcbiAgICAgICAgeyB0aXRsZTogJ1RvdGFsIENvc3QnLCBjbGFzc05hbWU6ICd0b3RhbC1iYXNlbGluZScsIGlzQ29zdDogdHJ1ZSB9LFxyXG4gICAgICAgIHsgdGl0bGU6ICdFZGl0JywgY2xhc3NOYW1lOiAnZWRpdCcgfVxyXG4gICAgXTtcclxuXHJcbiAgICAvLyBhc3NpZ24gY29zdCBjbGFzc2VzXHJcbiAgICBUYWJsZS5Db2x1bW5zLmFzc2lnbkNsYXNzZXMocGVyc29ubmVsQ29sdW1ucylcclxufVxyXG5cclxuZnVuY3Rpb24gcGVyc29ubmVsUm93T25FZGl0KCl7XHJcbiAgICBUYWJsZS5DZWxsLmNyZWF0ZVRleHRib3goJ2Jhc2VsaW5lLWZ0ZXMnKTtcclxuICAgIFRhYmxlLkNlbGwuY3JlYXRlU2VydmljZURyb3Bkb3duKFNlcnZpY2VzLmxpc3QoKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplUGVyc29ubmVsVGFibGUoKXtcclxuICAgIC8vIGxvYWQgdGFibGUgZGF0YSBmcm9tIGxvY2FsIHN0b3JhZ2VcclxuICAgIGlmKGF3YWl0IFRhYmxlLkRhdGEubG9hZCgpKSB7XHJcbiAgICAgICAgLy9hZnRlciB0YWJsZSBpcyBsb2FkZWQsIHNob3cgaXRcclxuICAgICAgICBUYWJsZS5zaG93KCk7XHJcbiAgICAgICAgVGFibGUuQ29sdW1ucy5hZGRBdEVuZChUYWJsZS5CdXR0b25zLmVkaXRfY29uZmlybV9idG5zLCAnRWRpdCcpO1xyXG4gICAgICAgIGFzc2lnbkNsYXNzZXMoKTtcclxuICAgICAgICAvLyBhZGQgdXAgdGhlIGJhc2VsaW5lIGNvc3RzIGFuZCB1cGRhdGUgc2lkZWJhclxyXG4gICAgICAgIHVwZGF0ZURpc3BsYXlhbmRUb3RhbHMoKTtcclxuICAgICAgICAvLyBhY3RpdmF0ZSBlZGl0IGJ1dHRvbnNcclxuICAgICAgICBUYWJsZS5CdXR0b25zLkVkaXQuaW5pdChwZXJzb25uZWxSb3dPbkVkaXQsIHVwZGF0ZURpc3BsYXlhbmRUb3RhbHMpO1xyXG4gICAgICAgIGluaXRpYWxpemVSb3dBZGRpdGlvbigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBQcm9tcHQuVGV4dC51cGRhdGUoJ05vIHBlcnNvbm5lbCBleHBlbnNlcyBmb3IgdGhpcyBmdW5kLicpXHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRpYWxpemVSb3dBZGRpdGlvbigpe1xyXG4gICAgVGFibGUuQnV0dG9ucy5BZGRSb3cudXBkYXRlVGV4dChcIkFkZCBuZXcgam9iXCIpO1xyXG4gICAgVGFibGUuQnV0dG9ucy5BZGRSb3cuc2hvdygpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjYWxjdWxhdGVUb3RhbENvc3QoZnRlcywgYXZnX3NhbGFyeSwgZnJpbmdlLCBjb2xhLCBtZXJpdCl7XHJcbiAgICByZXR1cm4gZnRlcyAqIGF2Z19zYWxhcnkgKiAoMSArIGZyaW5nZSkgKiAoMSArIGNvbGEpICogKDEgKyBtZXJpdCk7XHJcbn1cclxuXHJcbi8vIHVwZGF0ZSBzaWRlYmFyIGFuZCBhbHNvIGNvc3QgdG90YWxzIHdoZW4gdGhlIEZURXMgYXJlIGVkaXRlZFxyXG5mdW5jdGlvbiB1cGRhdGVEaXNwbGF5YW5kVG90YWxzKCl7XHJcbiAgICAvLyBjYWxjdWxhdGUgZm9yIGVhY2ggcm93XHJcbiAgICBsZXQgcm93cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0cicpO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3dzLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAvLyBmZXRjaCB2YWx1ZXMgZm9yIGNhbGN1bGF0aW9uc1xyXG4gICAgICAgIGxldCBhdmdfc2FsYXJ5ID0gVGFibGUuQ2VsbC5nZXRWYWx1ZShyb3dzW2ldLCAnYXZnLXNhbGFyeScpO1xyXG4gICAgICAgIGxldCBiYXNlbGluZV9mdGVzID0gVGFibGUuQ2VsbC5nZXRUZXh0KHJvd3NbaV0sICdiYXNlbGluZS1mdGVzJyk7XHJcblxyXG4gICAgICAgIC8vIGNhbGN1YXRlICNGVEVzIHggYXZlcmFnZSBzYWxhcnkgKyBDT0xBIGFkanVzdG1lbnRzICsgbWVyaXQgYWRqdXN0bWVudHMgKyBmcmluZ2VcclxuICAgICAgICBsZXQgdG90YWxfYmFzZWxpbmVfY29zdCA9IGNhbGN1bGF0ZVRvdGFsQ29zdChiYXNlbGluZV9mdGVzLCBhdmdfc2FsYXJ5LCBmcmluZ2UsIGNvbGEsIG1lcml0KTtcclxuXHJcbiAgICAgICAgLy8gdXBkYXRlIHRvdGFsIGNvbHVtblxyXG4gICAgICAgIFRhYmxlLkNlbGwudXBkYXRlVmFsdWUocm93c1tpXSwgJ3RvdGFsLWJhc2VsaW5lJywgdG90YWxfYmFzZWxpbmVfY29zdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2F2ZSB0aGUgdGFibGUgYWZ0ZXIgYWxsIHVwZGF0ZXMgYXJlIGRvbmVcclxuICAgIFRhYmxlLnNhdmUoKTtcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0VXBNb2RhbCgpIHtcclxuICAgIC8vIEluaXRpYWxpemUgbW9kYWxcclxuICAgIE1vZGFsLmNsZWFyKCk7XHJcbiAgICBNb2RhbC5MaW5rLmFkZCgnYWRkLWJ0bicpO1xyXG4gICAgTW9kYWwuVGl0bGUudXBkYXRlKCdOZXcgam9iJyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRVcEZvcm0oKSB7XHJcbiAgICAvLyBTZXQgdXAgZm9ybVxyXG4gICAgRm9ybS5uZXcoJ21vZGFsLWJvZHknKTtcclxuICAgIEZvcm0uTmV3RmllbGQuc2hvcnRUZXh0KCdKb2IgTmFtZTonLCAnam9iLW5hbWUnLCB0cnVlKTsgXHJcbiAgICBGb3JtLk5ld0ZpZWxkLnNob3J0VGV4dCgnQWNjb3VudCBTdHJpbmc6JywgJ2FjY291bnQtc3RyaW5nJywgdHJ1ZSk7IFxyXG4gICAgRm9ybS5TdWJtaXRCdXR0b24uYWRkKCk7XHJcbiAgICAvLyBJbml0aWFsaXplIGZvcm0gc3VibWlzc2lvbiB0byB0YWJsZSBkYXRhXHJcbiAgICBNb2RhbC5TdWJtaXQuaW5pdChoYW5kbGVTdWJtaXROZXdKb2IpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoYW5kbGVTdWJtaXROZXdKb2IoZXZlbnQpeyAgICAgICAgXHJcbiAgICAvLyBnZXQgYW5zd2VycyBmcm9tIGZvcm0sIGhpZGUgZm9ybSwgc2hvdyBhbnN3ZXJzIGluIHRhYmxlXHJcbiAgICBjb25zdCByZXNwb25zZXMgPSBGb3JtLmZldGNoQWxsUmVzcG9uc2VzKGV2ZW50KTtcclxuICAgIC8vIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBlbXB0eSByZXNwb25zZVxyXG4gICAgaWYgKE9iamVjdC52YWx1ZXMocmVzcG9uc2VzKVswXSAhPSAnJyl7XHJcbiAgICAgICAgLy8gY2hhbmdlIHBhZ2Ugdmlld1xyXG4gICAgICAgIE1vZGFsLmhpZGUoKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIGRhdGEgdG8gdGFibGVcclxuICAgICAgICBUYWJsZS5Sb3dzLmFkZChyZXNwb25zZXMpO1xyXG4gICAgICAgIFRhYmxlLnNob3coKTtcclxuICAgICAgICBUYWJsZS5CdXR0b25zLkFkZFJvdy5zaG93KCk7XHJcbiAgICAgICAgLy8gVE9ETzogc2F2ZSB0YWJsZSBkYXRhXHJcbiAgICAgICAgLy8gVE9ETzogZWRpdCBjb3N0IHRvIHNob3cgY3VycmVuY3kgY29ycmVjdGx5XHJcbiAgICAgICAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBDdXJyZW50UGFnZSB9IGZyb20gXCIuLi8uLi91dGlscy9kYXRhX3V0aWxzL2xvY2FsX3N0b3JhZ2VfaGFuZGxlcnMuanNcIjtcclxuaW1wb3J0IHsgcHJlcGFyZVBhZ2VWaWV3LCBpbml0aWFsaXplUGVyc29ubmVsVGFibGUsIHNldFVwTW9kYWwsIHNldFVwRm9ybSB9IGZyb20gXCIuL2hlbHBlcnMuanNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2FkUGVyc29ubmVsUGFnZSgpe1xyXG5cclxuICAgIEN1cnJlbnRQYWdlLnVwZGF0ZSgncGVyc29ubmVsJyk7XHJcbiAgICBwcmVwYXJlUGFnZVZpZXcoKTtcclxuICAgIGluaXRpYWxpemVQZXJzb25uZWxUYWJsZSgpO1xyXG5cclxuICAgIHNldFVwTW9kYWwoKTtcclxuICAgIHNldFVwRm9ybSgpO1xyXG59XHJcblxyXG4iLCJcclxuaW1wb3J0IFByb21wdCBmcm9tICcuLi8uLi9jb21wb25lbnRzL3Byb21wdC9wcm9tcHQuanMnXHJcbmltcG9ydCBCb2R5IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYm9keS9ib2R5LmpzJztcclxuaW1wb3J0IE5hdkJ1dHRvbnMgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5qcyc7XHJcbmltcG9ydCBTdWJ0aXRsZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuanMnO1xyXG5pbXBvcnQgU2lkZWJhciBmcm9tICcuLi8uLi9jb21wb25lbnRzL3NpZGViYXIvc2lkZWJhci5qcyc7XHJcbmltcG9ydCBUYWJsZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzJztcclxuaW1wb3J0IHsgU2VydmljZXMgfSBmcm9tICcuLi8uLi91dGlscy9kYXRhX3V0aWxzL2J1ZGdldF9kYXRhX2hhbmRsZXJzLmpzJztcclxuaW1wb3J0IHsgT1RfRlJJTkdFIH0gZnJvbSAnLi4vLi4vaW5pdC5qcyc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVBhZ2VWaWV3KCl7XHJcbiAgICAvLyBwcmVwYXJlIHBhZ2Ugdmlld1xyXG4gICAgQm9keS5yZXNldCgpO1xyXG4gICAgTmF2QnV0dG9ucy5zaG93KCk7XHJcbiAgICBTaWRlYmFyLnNob3coKTtcclxuXHJcbiAgICAvLyBlbmFibGUgbmV4dCBidXR0b25cclxuICAgIE5hdkJ1dHRvbnMuTmV4dC5lbmFibGUoKTtcclxuXHJcbiAgICAvLyB1cGRhdGUgcGFnZSB0ZXh0XHJcbiAgICBTdWJ0aXRsZS51cGRhdGUoJ092ZXJ0aW1lIEVzdGltYXRlcycpO1xyXG5cclxuICAgIC8vIGFjdGl2YXRlIHRhYmxlXHJcbiAgICBpbml0aWFsaXplT1RUYWJsZSgpO1xyXG4gICAgUHJvbXB0LlRleHQudXBkYXRlKGBQbGVhc2Ugc2VlIHlvdXIgYmFzZWxpbmUgb3ZlcnRpbWUgLyBob2xpZGF5IHBheSAvIHNoaWZ0IHByZW1pdW1zIGluIHRoZSB0YWJsZSBiZWxvdy5cclxuICAgICAgICBNYWtlIGFueSBlZGl0cyBhbmQgY29udGludWUuYCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFzc2lnbkNsYXNzZXMoKSB7XHJcbiAgICAvLyByZWNvcmQgY29sdW1ucyBhbmQgdGhlaXIgY2xhc3Nlc1xyXG4gICAgY29uc3QgT1RfY29scyA9IFtcclxuICAgICAgICB7IHRpdGxlOiAnQWNjb3VudCBTdHJpbmcnLCBjbGFzc05hbWU6ICdzdHJpbmcnIH0sXHJcbiAgICAgICAgeyB0aXRsZTogYENvc3QgQ2VudGVyIE5hbWVgLCBjbGFzc05hbWU6ICdjYycgfSxcclxuICAgICAgICB7IHRpdGxlOiAnU2VydmljZScsIGNsYXNzTmFtZTogJ3NlcnZpY2UnIH0sXHJcbiAgICAgICAgeyB0aXRsZTogJ1JlY3VycmluZyBvciBPbmUtVGltZScsIGNsYXNzTmFtZTogJ3JlY3VycmluZyd9LFxyXG4gICAgICAgIHsgdGl0bGU6ICdIb3VybHkgRW1wbG95ZWUgT3ZlcnRpbWUgKFdhZ2VzKScsIGNsYXNzTmFtZTogJ09ULXdhZ2VzJywgaXNDb3N0OiB0cnVlIH0sXHJcbiAgICAgICAgeyB0aXRsZTogJ1NhbGFyaWVkIEVtcGxveWVlIE92ZXJ0aW1lIChTYWxhcnkpJywgY2xhc3NOYW1lOiAnT1Qtc2FsYXJ5JywgaXNDb3N0OiB0cnVlIH0sXHJcbiAgICAgICAgeyB0aXRsZTogJ1RvdGFsIENvc3QgKGluY2x1ZGluZyBiZW5lZml0cyknLCBjbGFzc05hbWUgOiAndG90YWwnLCBpc0Nvc3Q6IHRydWV9LFxyXG4gICAgICAgIHsgdGl0bGU6ICdFZGl0JywgY2xhc3NOYW1lOiAnZWRpdCd9XHJcbiAgICBdO1xyXG5cclxuICAgIC8vIGFzc2lnbiBjb3N0IGNsYXNzZXNcclxuICAgIFRhYmxlLkNvbHVtbnMuYXNzaWduQ2xhc3NlcyhPVF9jb2xzKVxyXG59XHJcblxyXG5mdW5jdGlvbiBPVFJvd09uRWRpdCgpe1xyXG4gICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdPVC13YWdlcycsIHRydWUpO1xyXG4gICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdPVC1zYWxhcnknLCB0cnVlKTtcclxuICAgIFRhYmxlLkNlbGwuY3JlYXRlU2VydmljZURyb3Bkb3duKFNlcnZpY2VzLmxpc3QoKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplT1RUYWJsZSgpe1xyXG4gICAgLy8gbG9hZCB0YWJsZSBkYXRhIGZyb20gbG9jYWwgc3RvcmFnZVxyXG4gICAgaWYoYXdhaXQgVGFibGUuRGF0YS5sb2FkKCkpIHtcclxuICAgICAgICAvL2FmdGVyIHRhYmxlIGlzIGxvYWRlZCwgZmlsbCBpdFxyXG4gICAgICAgIFRhYmxlLnNob3coKTtcclxuICAgICAgICBUYWJsZS5Db2x1bW5zLmFkZEF0RW5kKCAnMCcsICdIb3VybHkgRW1wbG95ZWUgT3ZlcnRpbWUgKFdhZ2VzKScpO1xyXG4gICAgICAgIFRhYmxlLkNvbHVtbnMuYWRkQXRFbmQoICcwJywgJ1NhbGFyaWVkIEVtcGxveWVlIE92ZXJ0aW1lIChTYWxhcnkpJyk7XHJcbiAgICAgICAgLy8gVGFibGUuQ29sdW1ucy5hZGRBdEVuZCggJzAnLCAnVG90YWwgQ29zdCAoaW5jbHVkaW5nIGJlbmVmaXRzKScpO1xyXG4gICAgICAgIFRhYmxlLkNvbHVtbnMuYWRkQXRFbmQoVGFibGUuQnV0dG9ucy5lZGl0X2NvbmZpcm1fYnRucywgJ0VkaXQnKTs7XHJcbiAgICAgICAgYXNzaWduQ2xhc3NlcygpO1xyXG4gICAgICAgIC8vIGFkZCB1cCB0aGUgYmFzZWxpbmUgY29zdHMgYW5kIHVwZGF0ZSBzaWRlYmFyXHJcbiAgICAgICAgdXBkYXRlRGlzcGxheWFuZFRvdGFscygpO1xyXG4gICAgICAgIC8vIGFjdGl2YXRlIGVkaXQgYnV0dG9uc1xyXG4gICAgICAgIFRhYmxlLkJ1dHRvbnMuRWRpdC5pbml0KE9UUm93T25FZGl0LCB1cGRhdGVEaXNwbGF5YW5kVG90YWxzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgUHJvbXB0LlRleHQudXBkYXRlKCdObyBvdmVydGltZSBleHBlbnNlcyBmb3IgdGhpcyBmdW5kLicpXHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZVRvdGFsQ29zdCh3YWdlcywgc2FsYXJ5LCBmcmluZ2Upe1xyXG4gICAgcmV0dXJuICh3YWdlcyArIHNhbGFyeSkgKiAoMSArIGZyaW5nZSkgO1xyXG59XHJcblxyXG4vLyB1cGRhdGUgc2lkZWJhciBhbmQgYWxzbyBjb3N0IHRvdGFscyB3aGVuIHRoZSBGVEVzIGFyZSBlZGl0ZWRcclxuZnVuY3Rpb24gdXBkYXRlRGlzcGxheWFuZFRvdGFscygpe1xyXG4gICAgLy8gY2FsY3VsYXRlIGZvciBlYWNoIHJvd1xyXG4gICAgbGV0IHJvd3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndHInKTtcclxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcm93cy5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgLy8gZmV0Y2ggdmFsdWVzIGZvciBjYWxjdWxhdGlvbnNcclxuICAgICAgICBsZXQgT1Rfc2FsYXJ5ID0gVGFibGUuQ2VsbC5nZXRWYWx1ZShyb3dzW2ldLCAnT1Qtc2FsYXJ5Jyk7XHJcbiAgICAgICAgbGV0IE9UX3dhZ2VzID0gVGFibGUuQ2VsbC5nZXRWYWx1ZShyb3dzW2ldLCAnT1Qtd2FnZXMnKTtcclxuXHJcbiAgICAgICAgLy8gYWRkIHNhbGFyeSBhbmQgd2FnZXMgYW5kIGZyaW5nZSBiZW5lZml0cyAoRklDQSlcclxuICAgICAgICBsZXQgcm93X3RvdGFsID0gY2FsY3VsYXRlVG90YWxDb3N0KE9UX3NhbGFyeSwgT1Rfd2FnZXMsIE9UX0ZSSU5HRSk7XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZSB0b3RhbFxyXG4gICAgICAgIFRhYmxlLkNlbGwudXBkYXRlVmFsdWUocm93c1tpXSwgJ3RvdGFsJywgcm93X3RvdGFsKTtcclxuXHJcbiAgICAgICAgLy9zYXZlIGRhdGFcclxuICAgICAgICBUYWJsZS5zYXZlKCk7XHJcbiAgICB9XHJcbn0iLCJcclxuaW1wb3J0IHsgQ3VycmVudFBhZ2UgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZGF0YV91dGlscy9sb2NhbF9zdG9yYWdlX2hhbmRsZXJzLmpzXCI7XHJcbmltcG9ydCB7IHByZXBhcmVQYWdlVmlldyB9IGZyb20gJy4vaGVscGVycy5qcyc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbG9hZE9UUGFnZSgpe1xyXG4gICAgLy91cGRhdGUgcGFnZSBzdGF0ZVxyXG4gICAgQ3VycmVudFBhZ2UudXBkYXRlKCdvdmVydGltZScpO1xyXG4gICAgcHJlcGFyZVBhZ2VWaWV3KCk7XHJcbiAgICBcclxufSIsImltcG9ydCBQcm9tcHQgZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5qc1wiO1xyXG5pbXBvcnQgU2lkZWJhciBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9zaWRlYmFyL3NpZGViYXIuanNcIjtcclxuaW1wb3J0IFRhYmxlIGZyb20gXCIuLi8uLi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmpzXCI7XHJcbmltcG9ydCBCb2R5IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2JvZHkvYm9keS5qc1wiO1xyXG5pbXBvcnQgTmF2QnV0dG9ucyBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5qc1wiO1xyXG5pbXBvcnQgU3VidGl0bGUgZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5qc1wiO1xyXG5cclxuLy8gXCJWZW5kb3JcIjogXCJMYXcgRmlybSBMTENcIixcclxuLy8gICAgICAgICBcIkNQQSAjXCIgOiBcIjc2NTQyMVwiLFxyXG4vLyAgICAgICAgIFwiQWNjb3VudCBTdHJpbmdcIjogXCIxMDAwLTI5MzIwLTMyMDAxMFwiLFxyXG4vLyAgICAgICAgIFwiT2JqZWN0IE5hbWVcIjogXCJDb25zdWx0aW5nXCIsXHJcbi8vICAgICAgICAgXCJFbmQgb2YgQ29udHJhY3RcIjogXCIxMi8zMS8yMDI0XCIsXHJcbi8vICAgICAgICAgXCJBbW91bnQgUmVtYWluaW5nXCIgOiA1MDAwMCxcclxuLy8gICAgICAgICBcIkZZMjYgUmVxdWVzdFwiOiAxMDAwMDBcclxuXHJcbmNvbnN0IG5vblBlcnNvbm5lbENvbHVtbnMgPSBbXHJcbiAgICB7IHRpdGxlOiAnRlkyNiBSZXF1ZXN0JywgY2xhc3NOYW1lOiAncmVxdWVzdCcsIGlzQ29zdDogdHJ1ZSB9LFxyXG4gICAgeyB0aXRsZTogJ0Ftb3VudCBSZW1haW5pbmcgb24gQ29udHJhY3QnLCBjbGFzc05hbWU6ICdyZW1haW5pbmcnLCBpc0Nvc3Q6IHRydWUgfSxcclxuICAgIHsgdGl0bGU6ICdTZXJ2aWNlJywgY2xhc3NOYW1lIDogJ3NlcnZpY2UnIH0sXHJcbiAgICB7IHRpdGxlOiAnRWRpdCcsIGNsYXNzTmFtZSA6ICdlZGl0JyB9LFxyXG4gICAgeyB0aXRsZSA6ICdBY2NvdW50IFN0cmluZycsIGNsYXNzTmFtZSA6ICdhY2NvdW50LXN0cmluZyd9LFxyXG4gICAgeyB0aXRsZSA6ICdDUEEgIycsIGNsYXNzTmFtZSA6ICdjcGEnfSxcclxuICAgIHsgdGl0bGUgOiAnQ29udHJhY3QgRW5kIERhdGUnLCBjbGFzc05hbWUgOiAnY29udHJhY3QtZW5kJ30sXHJcbiAgICB7IHRpdGxlOiAnUmVjdXJyaW5nIG9yIE9uZS1UaW1lJywgY2xhc3NOYW1lOiAncmVjdXJyaW5nJ30sXHJcbiAgICB7IHRpdGxlOiAnT2JqZWN0IE5hbWUnLCBjbGFzc05hbWU6ICdvYmplY3QnfVxyXG5dO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVQYWdlVmlldygpe1xyXG4gICAgLy8gcHJlcGFyZSBwYWdlIHZpZXdcclxuICAgIEJvZHkucmVzZXQoKTtcclxuICAgIE5hdkJ1dHRvbnMuc2hvdygpO1xyXG4gICAgU2lkZWJhci5zaG93KCk7XHJcbiAgICBUYWJsZS5hZGp1c3RXaWR0aCgnMTAwJScpO1xyXG4gICAgLy8gdXBkYXRlIHBhZ2UgdGV4dFxyXG4gICAgU3VidGl0bGUudXBkYXRlKCdOb24tUGVyc29ubmVsJyk7XHJcbiAgICBQcm9tcHQuVGV4dC51cGRhdGUoJ1NlbGVjdCBhbiBhY3Rpb24gaXRlbSBmb3IgZWFjaCBub24tcGVyc29ubmVsIGxpbmUgaXRlbSBmcm9tIGxhc3QgeWVhci4nKTtcclxuXHJcbiAgICAvLyBqdXN0IGVuYWJsZSBuZXh0IGZvciBub3dcclxuICAgIC8vIFRPRE86IG9ubHkgZW5hYmxlIHdoZW4gYWxsIGluZm8gaXMgZW50ZXJlZFxyXG4gICAgTmF2QnV0dG9ucy5OZXh0LmVuYWJsZSgpO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZU5vbnBlcnNvbm5lbFRhYmxlKCl7XHJcbiAgICAvLyBsb2FkIHRhYmxlIGRhdGEgZnJvbSBzdG9yYWdlXHJcbiAgICBpZihhd2FpdCBUYWJsZS5EYXRhLmxvYWQoKSkge1xyXG4gICAgICAgIC8vYWZ0ZXIgdGFibGUgaXMgbG9hZGVkLCBmaWxsIGl0XHJcbiAgICAgICAgVGFibGUuc2hvdygpO1xyXG4gICAgICAgIFRhYmxlLkNvbHVtbnMuYWRkQXRFbmQoVGFibGUuQnV0dG9ucy5lZGl0X2NvbmZpcm1fYnRucywgXCJFZGl0XCIpO1xyXG4gICAgICAgIC8vIGFzc2lnbiBjb3N0IGNsYXNzZXNcclxuICAgICAgICBUYWJsZS5Db2x1bW5zLmFzc2lnbkNsYXNzZXMobm9uUGVyc29ubmVsQ29sdW1ucyk7XHJcbiAgICAgICAgLy8gZW5hYmxlIGVkaXRpbmdcclxuICAgICAgICBUYWJsZS5CdXR0b25zLkVkaXQuaW5pdChub25QZXJzb25uZWxSb3dPbkVkaXQsIFRhYmxlLnNhdmUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBQcm9tcHQuVGV4dC51cGRhdGUoJ05vIHBlcnNvbm5lbCBleHBlbnNlcyBmb3IgdGhpcyBmdW5kLicpXHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG5vblBlcnNvbm5lbFJvd09uRWRpdCgpe1xyXG4gICAgLy8gbWFrZSBpdCBlZGl0YWJsZVxyXG4gICAgVGFibGUuQ2VsbC5jcmVhdGVUZXh0Ym94KCdyZXF1ZXN0JywgdHJ1ZSk7XHJcbiAgICBUYWJsZS5DZWxsLmNyZWF0ZVNlcnZpY2VEcm9wZG93bigpO1xyXG59XHJcblxyXG4iLCJpbXBvcnQgeyBDdXJyZW50UGFnZSB9IGZyb20gXCIuLi8uLi91dGlscy9kYXRhX3V0aWxzL2xvY2FsX3N0b3JhZ2VfaGFuZGxlcnMuanNcIjtcclxuaW1wb3J0IHsgcHJlcGFyZVBhZ2VWaWV3LCBpbml0aWFsaXplTm9ucGVyc29ubmVsVGFibGUgfSBmcm9tIFwiLi4vMDVfbm9ucGVyc29ubmVsL2hlbHBlcnMuanNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2FkTm9ucGVyc29ubmVsUGFnZSgpe1xyXG5cclxuICAgIEN1cnJlbnRQYWdlLnVwZGF0ZSgnbm9ucGVyc29ubmVsJyk7XHJcbiAgICBwcmVwYXJlUGFnZVZpZXcoKTtcclxuICAgIGluaXRpYWxpemVOb25wZXJzb25uZWxUYWJsZSgpXHJcbn1cclxuIiwiaW1wb3J0IHsgaW5pdGlhbGl6ZVdlbGNvbWVQYWdlIH0gZnJvbSAnLi8wMF93ZWxjb21lL21haW4uanMnO1xyXG5pbXBvcnQgeyBjbGVhblVwSW5pdGlhdGl2ZXNQYWdlLCBsb2FkTmV3SW5pdGlhdGl2ZXMgfSBmcm9tICcuLzA2X25ld19pbml0aWF0aXZlcy9tYWluLmpzJ1xyXG5pbXBvcnQgeyBsb2FkUmV2ZW51ZVBhZ2UsIGNsZWFudXBSZXZlbnVlUGFnZSB9IGZyb20gJy4vMDNfcmV2ZW51ZS9tYWluLmpzJ1xyXG5pbXBvcnQgeyBsb2FkUGVyc29ubmVsUGFnZSB9IGZyb20gJy4vMDRfcGVyc29ubmVsL21haW4uanMnO1xyXG5pbXBvcnQgeyBsb2FkT1RQYWdlIH0gZnJvbSAnLi8wNC41X09UL21haW4uanMnO1xyXG5pbXBvcnQgeyBsb2FkTm9ucGVyc29ubmVsUGFnZSB9IGZyb20gJy4vMDVfbm9ucGVyc29ubmVsL21haW4uanMnO1xyXG5pbXBvcnQgeyBsb2FkQmFzZWxpbmVMYW5kaW5nUGFnZSB9IGZyb20gJy4vMDJfYmFzZWxpbmVfbGFuZGluZ19wYWdlL21haW4uanMnO1xyXG5pbXBvcnQgeyBjbGVhblVwU3VtbWFyeVBhZ2UsIGxvYWRTdW1tYXJ5UGFnZSB9IGZyb20gJy4vMDdfc3VtbWFyeS9tYWluLmpzJztcclxuaW1wb3J0IHsgbG9hZFVwbG9hZFBhZ2UgfSBmcm9tICcuLzAxX3VwbG9hZC9tYWluLmpzJztcclxuaW1wb3J0IHsgcGF1c2VFeGVjdXRpb24gfSBmcm9tICcuLi91dGlscy9jb21tb25fdXRpbHMuanMnO1xyXG5cclxuaW1wb3J0IHsgQ3VycmVudFBhZ2UgfSBmcm9tICcuLi91dGlscy9kYXRhX3V0aWxzL2xvY2FsX3N0b3JhZ2VfaGFuZGxlcnMuanMnO1xyXG5cclxuZXhwb3J0IGxldCBQQUdFUyA9IHtcclxuICAgICd3ZWxjb21lJyA6IGluaXRpYWxpemVXZWxjb21lUGFnZSxcclxuICAgICd1cGxvYWQnIDogbG9hZFVwbG9hZFBhZ2UsXHJcbiAgICAnYmFzZWxpbmUtbGFuZGluZycgOiBsb2FkQmFzZWxpbmVMYW5kaW5nUGFnZSxcclxuICAgICdyZXZlbnVlJyA6IGxvYWRSZXZlbnVlUGFnZSxcclxuICAgICdwZXJzb25uZWwnIDogbG9hZFBlcnNvbm5lbFBhZ2UsXHJcbiAgICAnb3ZlcnRpbWUnIDogbG9hZE9UUGFnZSxcclxuICAgICdub25wZXJzb25uZWwnIDogbG9hZE5vbnBlcnNvbm5lbFBhZ2UsXHJcbiAgICAnbmV3LWluaXRzJyA6IGxvYWROZXdJbml0aWF0aXZlcyxcclxuICAgICdzdW1tYXJ5JyA6IGxvYWRTdW1tYXJ5UGFnZSBcclxufVxyXG5cclxuZXhwb3J0IGxldCBDTEVBTlVQID0ge1xyXG4gICAgJ25ldy1pbml0cycgOiBjbGVhblVwSW5pdGlhdGl2ZXNQYWdlLFxyXG4gICAgJ3JldmVudWUnIDogY2xlYW51cFJldmVudWVQYWdlLFxyXG4gICAgJ3N1bW1hcnknIDogY2xlYW5VcFN1bW1hcnlQYWdlXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2aXNpdFBhZ2UobmV3X3BhZ2Vfa2V5KXtcclxuICAgIC8vIGNsZWFuIHVwIGZyb20gY3VycmVudCBwYWdlXHJcbiAgICB2YXIgcGFnZV9zdGF0ZSA9IEN1cnJlbnRQYWdlLmxvYWQoKTtcclxuICAgIGlmIChDTEVBTlVQW3BhZ2Vfc3RhdGVdKSB7IENMRUFOVVBbcGFnZV9zdGF0ZV0oKSB9O1xyXG4gICAgLy8gVXNlIHRoZSBwYWdlX3N0YXRlIHRvIGFjY2VzcyBhbmQgY2FsbCB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbiBmcm9tIFBBR0VTXHJcbiAgICBpZiAoUEFHRVNbbmV3X3BhZ2Vfa2V5XSkge1xyXG4gICAgICAgIFBBR0VTW25ld19wYWdlX2tleV0oKTsgLy8gSW52b2tlcyB0aGUgZnVuY3Rpb24gaWYgaXQgZXhpc3RzIGluIHRoZSBQQUdFUyBtYXBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgTm8gcGFnZSBpbml0aWFsaXplciBmb3VuZCBmb3Igc3RhdGU6ICR7bmV3X3BhZ2Vfa2V5fWApO1xyXG4gICAgfX1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBuZXh0UGFnZSgpe1xyXG5cclxuICAgIHZhciBwYWdlX3N0YXRlID0gQ3VycmVudFBhZ2UubG9hZCgpO1xyXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKFBBR0VTKTtcclxuICBcclxuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGtleVxyXG4gICAgY29uc3QgY3VycmVudEluZGV4ID0ga2V5cy5pbmRleE9mKHBhZ2Vfc3RhdGUpO1xyXG5cclxuICAgIC8vIGNsZWFuIHVwIGN1cnJlbnQgcGFnZVxyXG4gICAgaWYgKENMRUFOVVBbcGFnZV9zdGF0ZV0pIHsgQ0xFQU5VUFtwYWdlX3N0YXRlXSgpIH07XHJcbiAgICBcclxuICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgbmV4dCBrZXlcclxuICAgIGlmIChjdXJyZW50SW5kZXggPj0gMCAmJiBjdXJyZW50SW5kZXggPCBrZXlzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAvLyBHZXQgdGhlIG5leHQga2V5XHJcbiAgICAgICAgY29uc3QgbmV4dEtleSA9IGtleXNbY3VycmVudEluZGV4ICsgMV07XHJcbiAgICAgICAgLy8gZ28gdG8gdGhhdCBwYWdlXHJcbiAgICAgICAgdmlzaXRQYWdlKG5leHRLZXkpO1xyXG4gICAgfSBcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxhc3RQYWdlKCl7XHJcblxyXG4gICAgdmFyIHBhZ2Vfc3RhdGUgPSBDdXJyZW50UGFnZS5sb2FkKCk7XHJcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoUEFHRVMpO1xyXG4gIFxyXG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQga2V5XHJcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSBrZXlzLmluZGV4T2YocGFnZV9zdGF0ZSk7XHJcblxyXG4gICAgLy8gY2xlYW4gdXAgY3VycmVudCBwYWdlXHJcbiAgICBpZiAoQ0xFQU5VUFtwYWdlX3N0YXRlXSkgeyBDTEVBTlVQW3BhZ2Vfc3RhdGVdKCkgfTtcclxuICAgIFxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBuZXh0IGtleVxyXG4gICAgaWYgKGN1cnJlbnRJbmRleCA+PSAxKSB7XHJcbiAgICAgICAgLy8gR2V0IHRoZSBuZXh0IGtleVxyXG4gICAgICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2N1cnJlbnRJbmRleCAtIDFdO1xyXG4gICAgICAgIC8vIGdvIHRvIHRoYXQgcGFnZVxyXG4gICAgICAgIHZpc2l0UGFnZShsYXN0S2V5KTtcclxuICAgIH0gXHJcbn0iLCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hKU09OKGpzb25GaWxlUGF0aCkge1xyXG4gIHJldHVybiBmZXRjaChqc29uRmlsZVBhdGgpXHJcbiAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvaycpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0pTT04odGFibGUsIGNvbHNUb1JlbW92ZSA9IFtdKXtcclxuICAgIGNvbnN0IHJvd3MgPSB0YWJsZS5yb3dzO1xyXG4gICAgLy8gRXh0cmFjdCBoZWFkZXJzIGZyb20gdGhlIGZpcnN0IHJvd1xyXG4gICAgY29uc3QgaGVhZGVyUm93ID0gcm93c1swXS5jZWxscztcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBbXTtcclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaGVhZGVyUm93Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaGVhZGVycy5wdXNoKGhlYWRlclJvd1tqXS5pbm5lclRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGluaXRpYWxpemUgZGF0YVxyXG4gICAgdmFyIHRhYmxlRGF0YSA9IFtdO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGNvbHMgPSByb3dzW2ldLmNlbGxzO1xyXG4gICAgICAgIGNvbnN0IHJvd0RhdGEgPSB7fTtcclxuICAgICAgICAgICAgaGVhZGVycy5mb3JFYWNoKChoZWFkZXIsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sc1RvUmVtb3ZlLmluY2x1ZGVzKGhlYWRlcikpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbHNbaW5kZXhdLmNsYXNzTGlzdC5jb250YWlucygnY29zdCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YVtoZWFkZXJdID0gY29sc1tpbmRleF0uZ2V0QXR0cmlidXRlKCd2YWx1ZScpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByb3dEYXRhW2hlYWRlcl0gPSBjb2xzW2luZGV4XS5pbm5lclRleHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHRhYmxlRGF0YS5wdXNoKHJvd0RhdGEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRhYmxlRGF0YSk7XHJcbn1cclxuXHJcblxyXG4gICIsImltcG9ydCB7IEZJU0NBTF9ZRUFSLCBEQVRBX1JPT1QgfSBmcm9tIFwiLi4vLi4vaW5pdC5qc1wiO1xyXG5pbXBvcnQgU2lkZWJhciBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9zaWRlYmFyL3NpZGViYXIuanNcIjtcclxuaW1wb3J0IHsgUEFHRVMsIHZpc2l0UGFnZSB9IGZyb20gXCIuLi8uLi92aWV3cy92aWV3X2xvZ2ljLmpzXCI7XHJcbmltcG9ydCB7IGZldGNoSlNPTiB9IGZyb20gXCIuL0pTT05fZGF0YV9oYW5kbGVycy5qc1wiO1xyXG5pbXBvcnQgeyBGdW5kTG9va3VwVGFibGUgfSBmcm9tIFwiLi9idWRnZXRfZGF0YV9oYW5kbGVycy5qc1wiO1xyXG5pbXBvcnQgeyBjb252ZXJ0VG9KU09OIH0gZnJvbSBcIi4vSlNPTl9kYXRhX2hhbmRsZXJzLmpzXCI7XHJcblxyXG5leHBvcnQgY29uc3QgQ3VycmVudFBhZ2UgPSB7XHJcbiAgICB1cGRhdGUgOiBmdW5jdGlvbihwYWdlKXtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGFnZV9zdGF0ZScsIHBhZ2UpO1xyXG4gICAgfSxcclxuICAgIGxvYWQgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIGNvbnN0IHBhZ2VTdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwYWdlX3N0YXRlJyk7XHJcbiAgICAgICAgcmV0dXJuIHBhZ2VTdGF0ZSAhPT0gbnVsbCA/IHBhZ2VTdGF0ZSA6ICd3ZWxjb21lJztcclxuICAgIH0sXHJcbiAgICB2aXNpdCA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgdmlzaXRQYWdlKHRoaXMubG9hZCgpKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IEN1cnJlbnRGdW5kID0ge1xyXG4gICAgdXBkYXRlIDogZnVuY3Rpb24oZnVuZCl7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Z1bmQnLCBmdW5kKTtcclxuICAgIH0sXHJcbiAgICBudW1iZXIgOiBmdW5jdGlvbigpe1xyXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImZ1bmRcIik7XHJcbiAgICB9LFxyXG4gICAgbmFtZSA6IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgcmV0dXJuIEZ1bmRMb29rdXBUYWJsZS5nZXROYW1lKCB0aGlzLm51bWJlcigpKTtcclxuICAgIH0sXHJcbiAgICByZXNldCA6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlKCcnKTtcclxuICAgIH1cclxufVxyXG5cclxuLy8gVE9ETzogY29uc2lkZXIgbW92aW5nIHRoaXMgaW50byBhIGNvbnN0IGZvciBDdXJyZW50IFRhYmxlIChvciB0byB0aGUgdGFibGUgY29tcG9uZW50KVxyXG5leHBvcnQgZnVuY3Rpb24gc2F2ZVRhYmxlRGF0YSgpIHtcclxuICAgIHZhciB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXRhYmxlJyk7XHJcbiAgICBpZiAoQ3VycmVudEZ1bmQubnVtYmVyKCkpIHtcclxuICAgICAgICB2YXIgc2F2ZV9hcyA9IGAke0N1cnJlbnRQYWdlLmxvYWQoKX1fJHtDdXJyZW50RnVuZC5udW1iZXIoKX1gO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgc2F2ZV9hcyA9IEN1cnJlbnRQYWdlLmxvYWQoKTtcclxuICAgIH1cclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHNhdmVfYXMsIGNvbnZlcnRUb0pTT04odGFibGUsIFsnRWRpdCddKSk7XHJcbiAgICBTaWRlYmFyLnVwZGF0ZVRvdGFscygpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBkZWxldGVUYWJsZShuYW1lKXtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsICcnKTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFsbFRhYmxlcygpe1xyXG4gICAgdmFyIGZ1bmRzID0gYXdhaXQgZmV0Y2hKU09OKERBVEFfUk9PVCArICdmdW5kcy5qc29uJyk7XHJcbiAgICBmdW5kcyA9IGZ1bmRzLm1hcCgoaXRlbSkgPT4geyByZXR1cm4gaXRlbS5OYW1lIH0pO1xyXG4gICAgZm9yIChjb25zdCBwYWdlIGluIFBBR0VTKXtcclxuICAgICAgICBmb3IoY29uc3QgaSBpbiBmdW5kcyl7XHJcbiAgICAgICAgICAgIGRlbGV0ZVRhYmxlKGAke3BhZ2V9XyR7ZnVuZHNbaV19YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZGVsZXRlVGFibGUoJ25ldy1pbml0cycpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbG9hZFRhYmxlRGF0YShuYW1lKXtcclxuICAgIGNvbnN0IGRhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTtcclxuICAgIGlmICggZGF0YSA9PSAnJyApIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcclxufVxyXG5cclxuLy8gQ2xhc3MgdG8gaG9sZCBpbmZvcm1hdGlvbiBvbiBhIHNwZWNpZmljIGZ1bmQgYW5kIHRhYmxlXHJcbmNsYXNzIFN0b3JlZFRhYmxlIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhZ2UsIGZ1bmQpe1xyXG4gICAgICAgIHRoaXMubmFtZSA9IGAke3BhZ2V9XyR7ZnVuZH1gO1xyXG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XHJcbiAgICAgICAgdGhpcy50YWJsZSA9IGxvYWRUYWJsZURhdGEodGhpcy5uYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICB0b3RhbENvbCgpIHtcclxuICAgICAgICBzd2l0Y2godGhpcy5wYWdlKXtcclxuICAgICAgICAgICAgY2FzZSAncGVyc29ubmVsJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnVG90YWwgQ29zdCc7XHJcbiAgICAgICAgICAgIGNhc2UgJ292ZXJ0aW1lJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnVG90YWwgQ29zdCAoaW5jbHVkaW5nIGJlbmVmaXRzKSc7XHJcbiAgICAgICAgICAgIGNhc2UgJ25vbnBlcnNvbm5lbCc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYEZZJHtGSVNDQUxfWUVBUn0gUmVxdWVzdGA7XHJcbiAgICAgICAgICAgIGNhc2UgJ3JldmVudWUnOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRTdW0oKSB7XHJcbiAgICAgICAgLy8gZmlsbCB3aXRoIHplcm8gdW50aWwgdGhlcmUgaXMgc29tZXRoaW5nIHNhdmVkIGluIHN0b3JhZ2VcclxuICAgICAgICByZXR1cm4gY29sU3VtKHRoaXMudGFibGUsIHRoaXMudG90YWxDb2woKSwgdGhpcy5uYW1lKTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbFN1bSh0YWJsZSwgY29sTmFtZSwgbmFtZSkge1xyXG4gICAgLy8gZmlsbCB3aXRoIHplcm8gdW50aWwgdGhlcmUgaXMgc29tZXRoaW5nIHNhdmVkIGluIHN0b3JhZ2VcclxuICAgIGlmKCF0YWJsZSB8fCB0YWJsZSA9PSAnJyl7IFxyXG4gICAgICAgIHJldHVybiAwOyBcclxuICAgIH1cclxuICAgIGNvbnN0IGhlYWRlcnMgPSBPYmplY3Qua2V5cyh0YWJsZVswXSk7XHJcbiAgICBpZiAoaGVhZGVycy5pbmNsdWRlcyhjb2xOYW1lKSkge1xyXG4gICAgICAgIGxldCBzdW0gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICBzdW0gKz0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHRhYmxlW2ldW2NvbE5hbWVdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdW07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIHRvdGFsIGNvbHVtbiBpbiBzYXZlZCBkYXRhIGZvciAke25hbWV9LiBSZXR1cm5pbmcgMC4gU2VlIFN0b3JlZFRhYmxlLnRvdGFsQ29sKCkgc3dpdGNoLmApO1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuLy8gSG9sZHMgYWxsIHRoZSBkZXRhaWxlZCBkYXRhIGZvciBvbmUgZnVuZCdzIGJ1ZGdldFxyXG5leHBvcnQgY2xhc3MgRnVuZCB7XHJcbiAgICBjb25zdHJ1Y3RvcihmdW5kKXtcclxuICAgICAgICB0aGlzLmZ1bmQgPSBmdW5kO1xyXG4gICAgICAgIHRoaXMucGVyc29ubmVsID0gbmV3IFN0b3JlZFRhYmxlKCdwZXJzb25uZWwnLCBmdW5kKTtcclxuICAgICAgICB0aGlzLm92ZXJ0aW1lID0gbmV3IFN0b3JlZFRhYmxlKCdvdmVydGltZScsIGZ1bmQpO1xyXG4gICAgICAgIHRoaXMubm9ucGVyc29ubmVsID0gbmV3IFN0b3JlZFRhYmxlKCdub25wZXJzb25uZWwnLCBmdW5kKTtcclxuICAgICAgICB0aGlzLnJldmVudWUgPSBuZXcgU3RvcmVkVGFibGUoJ3JldmVudWUnLCBmdW5kKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQZXJzb25uZWxDb3N0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbm5lbC5nZXRTdW0oKSArIHRoaXMub3ZlcnRpbWUuZ2V0U3VtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Tm9uUGVyc29ubmVsQ29zdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub25wZXJzb25uZWwuZ2V0U3VtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UmV2ZW51ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZXZlbnVlLmdldFN1bSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFRvdGFsKCkgeyBcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXROb25QZXJzb25uZWxDb3N0KCkgKyB0aGlzLmdldFBlcnNvbm5lbENvc3QoKSAtIHRoaXMuZ2V0UmV2ZW51ZSgpIFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQmFzZWxpbmUge1xyXG4gICAgLy8gYmFzZWxpbmUgd2lsbCBqdXN0IGNvbnRhaW4gYSBsaXN0IG9mIGZ1bmRzXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBjb25zdCBhbGxGdW5kcyA9IEZ1bmRMb29rdXBUYWJsZS5saXN0RnVuZHMoKTtcclxuICAgICAgICB0aGlzLmZ1bmRzID0gW107XHJcbiAgICAgICAgYWxsRnVuZHMuZm9yRWFjaCgoZnVuZCkgPT4geyBcclxuICAgICAgICAgICAgdGhpcy5mdW5kcy5wdXNoKG5ldyBGdW5kKGZ1bmQpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0gXHJcblxyXG4gICAgcGVyc29ubmVsKCkge1xyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgdGhpcy5mdW5kcy5mb3JFYWNoKGZ1bmQgPT4ge1xyXG4gICAgICAgICAgICB0b3RhbCArPSBmdW5kLmdldFBlcnNvbm5lbENvc3QoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdG90YWw7XHJcbiAgICB9XHJcblxyXG4gICAgbm9ucGVyc29ubmVsKCkge1xyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgdGhpcy5mdW5kcy5mb3JFYWNoKGZ1bmQgPT4ge1xyXG4gICAgICAgICAgICB0b3RhbCArPSBmdW5kLmdldE5vblBlcnNvbm5lbENvc3QoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdG90YWw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZW51ZSgpIHtcclxuICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgICAgIHRoaXMuZnVuZHMuZm9yRWFjaChmdW5kID0+IHtcclxuICAgICAgICAgICAgdG90YWwgKz0gZnVuZC5nZXRSZXZlbnVlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRvdGFsO1xyXG4gICAgfVxyXG5cclxuICAgIHRvdGFsKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vbnBlcnNvbm5lbCgpICsgdGhpcy5wZXJzb25uZWwoKSAtIHRoaXMucmV2ZW51ZSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU3VwcGxlbWVudGFsIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMudGFibGUgPSBsb2FkVGFibGVEYXRhKCduZXctaW5pdHMnKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJbml0cygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50YWJsZS5tYXAoKGl0ZW0pID0+IHsgcmV0dXJuIGl0ZW1bJ0luaXRpYXRpdmUgTmFtZSddIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHBlcnNvbm5lbCgpIHtcclxuICAgICAgICByZXR1cm4gY29sU3VtKHRoaXMudGFibGUsICdQZXJzb25uZWwgQ29zdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIG5vbnBlcnNvbm5lbCgpIHtcclxuICAgICAgICByZXR1cm4gY29sU3VtKHRoaXMudGFibGUsICdOb24tcGVyc29ubmVsIENvc3QnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXZlbnVlKCkge1xyXG4gICAgICAgIHJldHVybiBjb2xTdW0odGhpcy50YWJsZSwgJ1JldmVudWUnKTtcclxuICAgIH1cclxuXHJcbiAgICB0b3RhbCgpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbm5lbCgpICsgdGhpcy5ub25wZXJzb25uZWwoKSAtIHRoaXMucmV2ZW51ZSgpO1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCIvLyBpbXBvcnQgc3R5bGVzXHJcbmltcG9ydCAnLi4vY3NzL2NvbW1vbi5jc3MnO1xyXG5cclxuLy8gaW1wb3J0IGZ1bmN0aW9uc1xyXG5pbXBvcnQgeyBDdXJyZW50UGFnZSB9IGZyb20gJy4vdXRpbHMvZGF0YV91dGlscy9sb2NhbF9zdG9yYWdlX2hhbmRsZXJzLmpzJztcclxuXHJcbi8vIHBhdGggZm9yIG15IGxhcHRvcFxyXG5leHBvcnQgbGV0IERBVEFfUk9PVCA9ICcuLi8uLi8uLi9kYXRhL2xhd19kZXB0X3NhbXBsZS8nXHJcbi8vIGdpdGh1YiBwYXRoXHJcbi8vIGV4cG9ydCBsZXQgREFUQV9ST09UID0gJy4uLy4uL2J1ZGdldC1yZXF1ZXN0LWRlbW8vZGF0YS9sYXdfZGVwdF9zYW1wbGUvJ1xyXG5cclxuZXhwb3J0IGxldCBSRVZFTlVFID0gMDtcclxuZXhwb3J0IGxldCBUQVJHRVQgPSAxNDAwMDAwMDtcclxuZXhwb3J0IHZhciBGSVNDQUxfWUVBUiA9ICcyNic7XHJcbmV4cG9ydCB2YXIgT1RfRlJJTkdFID0gMC4wNzY1O1xyXG5cclxuLy8gdmFyaWFibGVzIG9uIHRoZSBzYWxhcnkgXHJcbmV4cG9ydCB2YXIgZnJpbmdlID0gMC4zNlxyXG5leHBvcnQgdmFyIGNvbGEgPSAwLjAyXHJcbmV4cG9ydCB2YXIgbWVyaXQgPSAwLjAyXHJcblxyXG4vLyBzaGVldHMgdG8gZXhwZWN0IG9uIGRldGFpbCBzaGVldFxyXG5leHBvcnQgY29uc3QgU0hFRVRTID0ge1xyXG4gICAgJ0ZURSwgU2FsYXJ5LVdhZ2UsICYgQmVuZWZpdHMnIDogJ3BlcnNvbm5lbCcgLFxyXG4gICAgJ092ZXJ0aW1lICYgT3RoZXIgUGVyc29ubmVsJyA6ICdvdmVydGltZScsXHJcbiAgICAnTm9uLVBlcnNvbm5lbCBPcGVyYXRpbmcnIDogJ25vbnBlcnNvbm5lbCcsXHJcbiAgICAnUmV2ZW51ZScgOiAncmV2ZW51ZSdcclxufVxyXG5cclxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgIEN1cnJlbnRQYWdlLnZpc2l0KCk7XHJcbn0pO1xyXG5cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///573\n")},404:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:root {\r\n /* colors */\r\n --orange: #FB6523;\r\n --yellow: #D99733;\r\n --blue: #43748E;\r\n --lightBlue: #b7c9e2;\r\n --darkGray: #373A37;\r\n --mediumGray: #D0D0D0;\r\n --lightGray: #F2F2F2;\r\n --white: #FBFDFB;\r\n --black: #212121;\r\n --green: #71BC78;\r\n --citygreen: #004445;\r\n --spiritgreen: #279989;\r\n --palegreen: #9FD5B3;\r\n --verypalegreen: #DFF5E3;\r\n --accentyellow: #feb70d;\r\n --nearblack: #18252a;\r\n /* fonts */\r\n font-family: \'Nunito\', sans-serif;\r\n font-size: 14px;\r\n /* spacing */\r\n --header-height : 125px;\r\n --sidebar-width: 250px;\r\n}\r\n\r\n/* Button styling */\r\n\r\n.btn {\r\n cursor: pointer;\r\n padding: 10px;\r\n margin-top: 5px;\r\n margin-right : 2px;\r\n margin-left: 2px;\r\n border-radius: 10px;\r\n background-color: gray;\r\n color: white; \r\n}\r\n\r\n/* Font application for all text */\r\nbody, button, input, textarea, select, .sidebar, table {\r\n font-family: var(--font-family), sans-serif;\r\n }\r\n\r\n#main-panel {\r\n /* display: flex; */\r\n /* flex-direction: column; */\r\n justify-content: center; /* This will center content vertically */\r\n min-height: calc(100vh - var(--header-height)) ; \r\n /* max-width: calc(100vw - var(--sidebar-width)); */\r\n padding-top: 25px;\r\n padding-bottom: 25px;\r\n margin: 0;\r\n}\r\n\r\ndiv.row {\r\n margin: 0px;\r\n}`, "",{"version":3,"sources":["webpack://./src/css/common.css"],"names":[],"mappings":"AAAA;IACI,WAAW;IACX,iBAAiB;IACjB,iBAAiB;IACjB,eAAe;IACf,oBAAoB;IACpB,mBAAmB;IACnB,qBAAqB;IACrB,oBAAoB;IACpB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,oBAAoB;IACpB,sBAAsB;IACtB,oBAAoB;IACpB,wBAAwB;IACxB,uBAAuB;IACvB,oBAAoB;IACpB,UAAU;IACV,iCAAiC;IACjC,eAAe;IACf,YAAY;IACZ,uBAAuB;IACvB,sBAAsB;AAC1B;;AAEA,mBAAmB;;AAEnB;IACI,eAAe;IACf,aAAa;IACb,eAAe;IACf,kBAAkB;IAClB,gBAAgB;IAChB,mBAAmB;IACnB,sBAAsB;IACtB,YAAY;AAChB;;AAEA,mCAAmC;AACnC;IACI,2CAA2C;EAC7C;;AAEF;IACI,mBAAmB;IACnB,4BAA4B;IAC5B,uBAAuB,EAAE,wCAAwC;IACjE,+CAA+C;IAC/C,oDAAoD;IACpD,iBAAiB;IACjB,oBAAoB;IACpB,SAAS;AACb;;AAEA;IACI,WAAW;AACf","sourcesContent":[":root {\\r\\n /* colors */\\r\\n --orange: #FB6523;\\r\\n --yellow: #D99733;\\r\\n --blue: #43748E;\\r\\n --lightBlue: #b7c9e2;\\r\\n --darkGray: #373A37;\\r\\n --mediumGray: #D0D0D0;\\r\\n --lightGray: #F2F2F2;\\r\\n --white: #FBFDFB;\\r\\n --black: #212121;\\r\\n --green: #71BC78;\\r\\n --citygreen: #004445;\\r\\n --spiritgreen: #279989;\\r\\n --palegreen: #9FD5B3;\\r\\n --verypalegreen: #DFF5E3;\\r\\n --accentyellow: #feb70d;\\r\\n --nearblack: #18252a;\\r\\n /* fonts */\\r\\n font-family: \'Nunito\', sans-serif;\\r\\n font-size: 14px;\\r\\n /* spacing */\\r\\n --header-height : 125px;\\r\\n --sidebar-width: 250px;\\r\\n}\\r\\n\\r\\n/* Button styling */\\r\\n\\r\\n.btn {\\r\\n cursor: pointer;\\r\\n padding: 10px;\\r\\n margin-top: 5px;\\r\\n margin-right : 2px;\\r\\n margin-left: 2px;\\r\\n border-radius: 10px;\\r\\n background-color: gray;\\r\\n color: white; \\r\\n}\\r\\n\\r\\n/* Font application for all text */\\r\\nbody, button, input, textarea, select, .sidebar, table {\\r\\n font-family: var(--font-family), sans-serif;\\r\\n }\\r\\n\\r\\n#main-panel {\\r\\n /* display: flex; */\\r\\n /* flex-direction: column; */\\r\\n justify-content: center; /* This will center content vertically */\\r\\n min-height: calc(100vh - var(--header-height)) ; \\r\\n /* max-width: calc(100vw - var(--sidebar-width)); */\\r\\n padding-top: 25px;\\r\\n padding-bottom: 25px;\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\ndiv.row {\\r\\n margin: 0px;\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA0LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9jc3MvY29tbW9uLmNzcz9mN2NhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGA6cm9vdCB7XHJcbiAgICAvKiBjb2xvcnMgKi9cclxuICAgIC0tb3JhbmdlOiAjRkI2NTIzO1xyXG4gICAgLS15ZWxsb3c6ICNEOTk3MzM7XHJcbiAgICAtLWJsdWU6ICM0Mzc0OEU7XHJcbiAgICAtLWxpZ2h0Qmx1ZTogI2I3YzllMjtcclxuICAgIC0tZGFya0dyYXk6ICMzNzNBMzc7XHJcbiAgICAtLW1lZGl1bUdyYXk6ICNEMEQwRDA7XHJcbiAgICAtLWxpZ2h0R3JheTogI0YyRjJGMjtcclxuICAgIC0td2hpdGU6ICNGQkZERkI7XHJcbiAgICAtLWJsYWNrOiAjMjEyMTIxO1xyXG4gICAgLS1ncmVlbjogIzcxQkM3ODtcclxuICAgIC0tY2l0eWdyZWVuOiAjMDA0NDQ1O1xyXG4gICAgLS1zcGlyaXRncmVlbjogIzI3OTk4OTtcclxuICAgIC0tcGFsZWdyZWVuOiAjOUZENUIzO1xyXG4gICAgLS12ZXJ5cGFsZWdyZWVuOiAjREZGNUUzO1xyXG4gICAgLS1hY2NlbnR5ZWxsb3c6ICNmZWI3MGQ7XHJcbiAgICAtLW5lYXJibGFjazogIzE4MjUyYTtcclxuICAgIC8qIGZvbnRzICovXHJcbiAgICBmb250LWZhbWlseTogJ051bml0bycsIHNhbnMtc2VyaWY7XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICAvKiBzcGFjaW5nICovXHJcbiAgICAtLWhlYWRlci1oZWlnaHQgOiAxMjVweDtcclxuICAgIC0tc2lkZWJhci13aWR0aDogMjUwcHg7XHJcbn1cclxuXHJcbi8qIEJ1dHRvbiBzdHlsaW5nICovXHJcblxyXG4uYnRuIHtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIHBhZGRpbmc6IDEwcHg7XHJcbiAgICBtYXJnaW4tdG9wOiA1cHg7XHJcbiAgICBtYXJnaW4tcmlnaHQgOiAycHg7XHJcbiAgICBtYXJnaW4tbGVmdDogMnB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XHJcbiAgICBjb2xvcjogd2hpdGU7IFxyXG59XHJcblxyXG4vKiBGb250IGFwcGxpY2F0aW9uIGZvciBhbGwgdGV4dCAgKi9cclxuYm9keSwgYnV0dG9uLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgLnNpZGViYXIsIHRhYmxlIHtcclxuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseSksIHNhbnMtc2VyaWY7XHJcbiAgfVxyXG5cclxuI21haW4tcGFuZWwge1xyXG4gICAgLyogZGlzcGxheTogZmxleDsgKi9cclxuICAgIC8qIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47ICovXHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgLyogVGhpcyB3aWxsIGNlbnRlciBjb250ZW50IHZlcnRpY2FsbHkgKi9cclxuICAgIG1pbi1oZWlnaHQ6IGNhbGMoMTAwdmggLSB2YXIoLS1oZWFkZXItaGVpZ2h0KSkgOyBcclxuICAgIC8qIG1heC13aWR0aDogY2FsYygxMDB2dyAtIHZhcigtLXNpZGViYXItd2lkdGgpKTsgICovXHJcbiAgICBwYWRkaW5nLXRvcDogMjVweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiAyNXB4O1xyXG4gICAgbWFyZ2luOiAwO1xyXG59XHJcblxyXG5kaXYucm93IHtcclxuICAgIG1hcmdpbjogMHB4O1xyXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY3NzL2NvbW1vbi5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxXQUFXO0lBQ1gsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLG1CQUFtQjtJQUNuQixxQkFBcUI7SUFDckIsb0JBQW9CO0lBQ3BCLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLG9CQUFvQjtJQUNwQixzQkFBc0I7SUFDdEIsb0JBQW9CO0lBQ3BCLHdCQUF3QjtJQUN4Qix1QkFBdUI7SUFDdkIsb0JBQW9CO0lBQ3BCLFVBQVU7SUFDVixpQ0FBaUM7SUFDakMsZUFBZTtJQUNmLFlBQVk7SUFDWix1QkFBdUI7SUFDdkIsc0JBQXNCO0FBQzFCOztBQUVBLG1CQUFtQjs7QUFFbkI7SUFDSSxlQUFlO0lBQ2YsYUFBYTtJQUNiLGVBQWU7SUFDZixrQkFBa0I7SUFDbEIsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixzQkFBc0I7SUFDdEIsWUFBWTtBQUNoQjs7QUFFQSxtQ0FBbUM7QUFDbkM7SUFDSSwyQ0FBMkM7RUFDN0M7O0FBRUY7SUFDSSxtQkFBbUI7SUFDbkIsNEJBQTRCO0lBQzVCLHVCQUF1QixFQUFFLHdDQUF3QztJQUNqRSwrQ0FBK0M7SUFDL0Msb0RBQW9EO0lBQ3BELGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsU0FBUztBQUNiOztBQUVBO0lBQ0ksV0FBVztBQUNmXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjpyb290IHtcXHJcXG4gICAgLyogY29sb3JzICovXFxyXFxuICAgIC0tb3JhbmdlOiAjRkI2NTIzO1xcclxcbiAgICAtLXllbGxvdzogI0Q5OTczMztcXHJcXG4gICAgLS1ibHVlOiAjNDM3NDhFO1xcclxcbiAgICAtLWxpZ2h0Qmx1ZTogI2I3YzllMjtcXHJcXG4gICAgLS1kYXJrR3JheTogIzM3M0EzNztcXHJcXG4gICAgLS1tZWRpdW1HcmF5OiAjRDBEMEQwO1xcclxcbiAgICAtLWxpZ2h0R3JheTogI0YyRjJGMjtcXHJcXG4gICAgLS13aGl0ZTogI0ZCRkRGQjtcXHJcXG4gICAgLS1ibGFjazogIzIxMjEyMTtcXHJcXG4gICAgLS1ncmVlbjogIzcxQkM3ODtcXHJcXG4gICAgLS1jaXR5Z3JlZW46ICMwMDQ0NDU7XFxyXFxuICAgIC0tc3Bpcml0Z3JlZW46ICMyNzk5ODk7XFxyXFxuICAgIC0tcGFsZWdyZWVuOiAjOUZENUIzO1xcclxcbiAgICAtLXZlcnlwYWxlZ3JlZW46ICNERkY1RTM7XFxyXFxuICAgIC0tYWNjZW50eWVsbG93OiAjZmViNzBkO1xcclxcbiAgICAtLW5lYXJibGFjazogIzE4MjUyYTtcXHJcXG4gICAgLyogZm9udHMgKi9cXHJcXG4gICAgZm9udC1mYW1pbHk6ICdOdW5pdG8nLCBzYW5zLXNlcmlmO1xcclxcbiAgICBmb250LXNpemU6IDE0cHg7XFxyXFxuICAgIC8qIHNwYWNpbmcgKi9cXHJcXG4gICAgLS1oZWFkZXItaGVpZ2h0IDogMTI1cHg7XFxyXFxuICAgIC0tc2lkZWJhci13aWR0aDogMjUwcHg7XFxyXFxufVxcclxcblxcclxcbi8qIEJ1dHRvbiBzdHlsaW5nICovXFxyXFxuXFxyXFxuLmJ0biB7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgcGFkZGluZzogMTBweDtcXHJcXG4gICAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgICBtYXJnaW4tcmlnaHQgOiAycHg7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAycHg7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XFxyXFxuICAgIGNvbG9yOiB3aGl0ZTsgXFxyXFxufVxcclxcblxcclxcbi8qIEZvbnQgYXBwbGljYXRpb24gZm9yIGFsbCB0ZXh0ICAqL1xcclxcbmJvZHksIGJ1dHRvbiwgaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIC5zaWRlYmFyLCB0YWJsZSB7XFxyXFxuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseSksIHNhbnMtc2VyaWY7XFxyXFxuICB9XFxyXFxuXFxyXFxuI21haW4tcGFuZWwge1xcclxcbiAgICAvKiBkaXNwbGF5OiBmbGV4OyAqL1xcclxcbiAgICAvKiBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyAqL1xcclxcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgLyogVGhpcyB3aWxsIGNlbnRlciBjb250ZW50IHZlcnRpY2FsbHkgKi9cXHJcXG4gICAgbWluLWhlaWdodDogY2FsYygxMDB2aCAtIHZhcigtLWhlYWRlci1oZWlnaHQpKSA7IFxcclxcbiAgICAvKiBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSB2YXIoLS1zaWRlYmFyLXdpZHRoKSk7ICAqL1xcclxcbiAgICBwYWRkaW5nLXRvcDogMjVweDtcXHJcXG4gICAgcGFkZGluZy1ib3R0b206IDI1cHg7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LnJvdyB7XFxyXFxuICAgIG1hcmdpbjogMHB4O1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///404\n')},995:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#summary-accordion {\r\n width: 60%;\r\n margin: auto\r\n}\r\n\r\n#accordion-baseline-title {\r\n margin-left: 20%;\r\n font-weight: bold;\r\n padding-bottom: 10px;\r\n padding-left: 15px;\r\n padding-top: 30px;\r\n}\r\n\r\n.accordion-button:active, .accordion-button:not(.collapsed) {\r\n background-color: var(--palegreen);\r\n color: var(--citygreen);\r\n}\r\n\r\n.accordion-table { \r\n width: 100%;\r\n font-size: 1.25em;\r\n /* border-collapse: separate; This is required for rounded corners */\r\n}\r\n\r\n.accordion-table td:last-child {\r\n text-align: right;\r\n padding-right: 15px;\r\n padding-bottom: 5px\r\n}\r\n\r\n.accordion-table tr {\r\n border-bottom: 1px solid black;\r\n border-top: none;\r\n border-right: none;\r\n border-left: none;\r\n}\r\n\r\n.accordion-table tr:last-child {\r\n border-bottom: none;\r\n background-color: var(--mediumGray);\r\n height : 50px;\r\n}\r\n\r\nspan.amount {\r\n font-weight: bold;\r\n position: absolute;\r\n right: 0;\r\n margin-right: 60px;\r\n}\r\n\r\n.accordion-header button {\r\n font-size: 0.8em;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/accordion/accordion.css"],"names":[],"mappings":"AAAA;IACI,UAAU;IACV;AACJ;;AAEA;IACI,gBAAgB;IAChB,iBAAiB;IACjB,oBAAoB;IACpB,kBAAkB;IAClB,iBAAiB;AACrB;;AAEA;IACI,kCAAkC;IAClC,uBAAuB;AAC3B;;AAEA;IACI,WAAW;IACX,iBAAiB;IACjB,oEAAoE;AACxE;;AAEA;IACI,iBAAiB;IACjB,mBAAmB;IACnB;AACJ;;AAEA;IACI,8BAA8B;IAC9B,gBAAgB;IAChB,kBAAkB;IAClB,iBAAiB;AACrB;;AAEA;IACI,mBAAmB;IACnB,mCAAmC;IACnC,aAAa;AACjB;;AAEA;IACI,iBAAiB;IACjB,kBAAkB;IAClB,QAAQ;IACR,kBAAkB;AACtB;;AAEA;IACI,gBAAgB;AACpB","sourcesContent":["#summary-accordion {\\r\\n width: 60%;\\r\\n margin: auto\\r\\n}\\r\\n\\r\\n#accordion-baseline-title {\\r\\n margin-left: 20%;\\r\\n font-weight: bold;\\r\\n padding-bottom: 10px;\\r\\n padding-left: 15px;\\r\\n padding-top: 30px;\\r\\n}\\r\\n\\r\\n.accordion-button:active, .accordion-button:not(.collapsed) {\\r\\n background-color: var(--palegreen);\\r\\n color: var(--citygreen);\\r\\n}\\r\\n\\r\\n.accordion-table { \\r\\n width: 100%;\\r\\n font-size: 1.25em;\\r\\n /* border-collapse: separate; This is required for rounded corners */\\r\\n}\\r\\n\\r\\n.accordion-table td:last-child {\\r\\n text-align: right;\\r\\n padding-right: 15px;\\r\\n padding-bottom: 5px\\r\\n}\\r\\n\\r\\n.accordion-table tr {\\r\\n border-bottom: 1px solid black;\\r\\n border-top: none;\\r\\n border-right: none;\\r\\n border-left: none;\\r\\n}\\r\\n\\r\\n.accordion-table tr:last-child {\\r\\n border-bottom: none;\\r\\n background-color: var(--mediumGray);\\r\\n height : 50px;\\r\\n}\\r\\n\\r\\nspan.amount {\\r\\n font-weight: bold;\\r\\n position: absolute;\\r\\n right: 0;\\r\\n margin-right: 60px;\\r\\n}\\r\\n\\r\\n.accordion-header button {\\r\\n font-size: 0.8em;\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTk1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvYWNjb3JkaW9uL2FjY29yZGlvbi5jc3M/ZjBmOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgI3N1bW1hcnktYWNjb3JkaW9uIHtcclxuICAgIHdpZHRoOiA2MCU7XHJcbiAgICBtYXJnaW46IGF1dG9cclxufVxyXG5cclxuI2FjY29yZGlvbi1iYXNlbGluZS10aXRsZSB7XHJcbiAgICBtYXJnaW4tbGVmdDogMjAlO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcclxuICAgIHBhZGRpbmctbGVmdDogMTVweDtcclxuICAgIHBhZGRpbmctdG9wOiAzMHB4O1xyXG59XHJcblxyXG4uYWNjb3JkaW9uLWJ1dHRvbjphY3RpdmUsIC5hY2NvcmRpb24tYnV0dG9uOm5vdCguY29sbGFwc2VkKSB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYWxlZ3JlZW4pO1xyXG4gICAgY29sb3I6IHZhcigtLWNpdHlncmVlbik7XHJcbn1cclxuXHJcbi5hY2NvcmRpb24tdGFibGUgeyBcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgZm9udC1zaXplOiAxLjI1ZW07XHJcbiAgICAvKiBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOyBUaGlzIGlzIHJlcXVpcmVkIGZvciByb3VuZGVkIGNvcm5lcnMgKi9cclxufVxyXG5cclxuLmFjY29yZGlvbi10YWJsZSB0ZDpsYXN0LWNoaWxkIHtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgcGFkZGluZy1yaWdodDogMTVweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiA1cHhcclxufVxyXG5cclxuLmFjY29yZGlvbi10YWJsZSB0ciB7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XHJcbiAgICBib3JkZXItdG9wOiBub25lO1xyXG4gICAgYm9yZGVyLXJpZ2h0OiBub25lO1xyXG4gICAgYm9yZGVyLWxlZnQ6IG5vbmU7XHJcbn1cclxuXHJcbi5hY2NvcmRpb24tdGFibGUgdHI6bGFzdC1jaGlsZCB7XHJcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWVkaXVtR3JheSk7XHJcbiAgICBoZWlnaHQgOiA1MHB4O1xyXG59XHJcblxyXG5zcGFuLmFtb3VudCB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHJpZ2h0OiAwO1xyXG4gICAgbWFyZ2luLXJpZ2h0OiA2MHB4O1xyXG59XHJcblxyXG4uYWNjb3JkaW9uLWhlYWRlciBidXR0b24ge1xyXG4gICAgZm9udC1zaXplOiAwLjhlbTtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvYWNjb3JkaW9uL2FjY29yZGlvbi5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxVQUFVO0lBQ1Y7QUFDSjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIsb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxrQ0FBa0M7SUFDbEMsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksV0FBVztJQUNYLGlCQUFpQjtJQUNqQixvRUFBb0U7QUFDeEU7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsbUJBQW1CO0lBQ25CO0FBQ0o7O0FBRUE7SUFDSSw4QkFBOEI7SUFDOUIsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxtQkFBbUI7SUFDbkIsbUNBQW1DO0lBQ25DLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLFFBQVE7SUFDUixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxnQkFBZ0I7QUFDcEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiI3N1bW1hcnktYWNjb3JkaW9uIHtcXHJcXG4gICAgd2lkdGg6IDYwJTtcXHJcXG4gICAgbWFyZ2luOiBhdXRvXFxyXFxufVxcclxcblxcclxcbiNhY2NvcmRpb24tYmFzZWxpbmUtdGl0bGUge1xcclxcbiAgICBtYXJnaW4tbGVmdDogMjAlO1xcclxcbiAgICBmb250LXdlaWdodDogYm9sZDtcXHJcXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XFxyXFxuICAgIHBhZGRpbmctbGVmdDogMTVweDtcXHJcXG4gICAgcGFkZGluZy10b3A6IDMwcHg7XFxyXFxufVxcclxcblxcclxcbi5hY2NvcmRpb24tYnV0dG9uOmFjdGl2ZSwgLmFjY29yZGlvbi1idXR0b246bm90KC5jb2xsYXBzZWQpIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFsZWdyZWVuKTtcXHJcXG4gICAgY29sb3I6IHZhcigtLWNpdHlncmVlbik7XFxyXFxufVxcclxcblxcclxcbi5hY2NvcmRpb24tdGFibGUgeyBcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIGZvbnQtc2l6ZTogMS4yNWVtO1xcclxcbiAgICAvKiBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOyBUaGlzIGlzIHJlcXVpcmVkIGZvciByb3VuZGVkIGNvcm5lcnMgKi9cXHJcXG59XFxyXFxuXFxyXFxuLmFjY29yZGlvbi10YWJsZSB0ZDpsYXN0LWNoaWxkIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XFxyXFxuICAgIHBhZGRpbmctcmlnaHQ6IDE1cHg7XFxyXFxuICAgIHBhZGRpbmctYm90dG9tOiA1cHhcXHJcXG59XFxyXFxuXFxyXFxuLmFjY29yZGlvbi10YWJsZSB0ciB7XFxyXFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjaztcXHJcXG4gICAgYm9yZGVyLXRvcDogbm9uZTtcXHJcXG4gICAgYm9yZGVyLXJpZ2h0OiBub25lO1xcclxcbiAgICBib3JkZXItbGVmdDogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLmFjY29yZGlvbi10YWJsZSB0cjpsYXN0LWNoaWxkIHtcXHJcXG4gICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWVkaXVtR3JheSk7XFxyXFxuICAgIGhlaWdodCA6IDUwcHg7XFxyXFxufVxcclxcblxcclxcbnNwYW4uYW1vdW50IHtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgcmlnaHQ6IDA7XFxyXFxuICAgIG1hcmdpbi1yaWdodDogNjBweDtcXHJcXG59XFxyXFxuXFxyXFxuLmFjY29yZGlvbi1oZWFkZXIgYnV0dG9uIHtcXHJcXG4gICAgZm9udC1zaXplOiAwLjhlbTtcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///995\n')},9:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `body {\r\n background-color: var(--lightGray);\r\n margin: 0;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/body/body.css"],"names":[],"mappings":"AAAA;IACI,kCAAkC;IAClC,SAAS;AACb","sourcesContent":["body {\\r\\n background-color: var(--lightGray);\\r\\n margin: 0;\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9ib2R5L2JvZHkuY3NzPzM2ZTAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYGJvZHkge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHRHcmF5KTtcclxuICAgIG1hcmdpbjogMDtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvYm9keS9ib2R5LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGtDQUFrQztJQUNsQyxTQUFTO0FBQ2JcIixcInNvdXJjZXNDb250ZW50XCI6W1wiYm9keSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0R3JheSk7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9\n')},39:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#file-input {\r\n margin-left: 40%;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/file_upload/file_upload.css"],"names":[],"mappings":"AAAA;IACI,gBAAgB;AACpB","sourcesContent":["#file-input {\\r\\n margin-left: 40%;\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2ZpbGVfdXBsb2FkL2ZpbGVfdXBsb2FkLmNzcz9jNTU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAjZmlsZS1pbnB1dCB7XHJcbiAgICBtYXJnaW4tbGVmdDogNDAlO1xyXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvanMvY29tcG9uZW50cy9maWxlX3VwbG9hZC9maWxlX3VwbG9hZC5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxnQkFBZ0I7QUFDcEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiI2ZpbGUtaW5wdXQge1xcclxcbiAgICBtYXJnaW4tbGVmdDogNDAlO1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///39\n')},109:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `textarea {height: 100px; width: 100%;}\r\n\r\ntextarea, input {\r\n margin-bottom: 20px;\r\n}\r\n\r\n.btn-submit {\r\n margin-top: 20px;\r\n width: 60%;\r\n margin-left: 20%;\r\n background-color: var(--spiritgreen);\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/form/form.css"],"names":[],"mappings":"AAAA,UAAU,aAAa,EAAE,WAAW,CAAC;;AAErC;IACI,mBAAmB;AACvB;;AAEA;IACI,gBAAgB;IAChB,UAAU;IACV,gBAAgB;IAChB,oCAAoC;AACxC","sourcesContent":["textarea {height: 100px; width: 100%;}\\r\\n\\r\\ntextarea, input {\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.btn-submit {\\r\\n margin-top: 20px;\\r\\n width: 60%;\\r\\n margin-left: 20%;\\r\\n background-color: var(--spiritgreen);\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL2Zvcm0uY3NzP2UzOGEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYHRleHRhcmVhIHtoZWlnaHQ6IDEwMHB4OyB3aWR0aDogMTAwJTt9XHJcblxyXG50ZXh0YXJlYSwgaW5wdXQge1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcclxufVxyXG5cclxuLmJ0bi1zdWJtaXQge1xyXG4gICAgbWFyZ2luLXRvcDogMjBweDtcclxuICAgIHdpZHRoOiA2MCU7XHJcbiAgICBtYXJnaW4tbGVmdDogMjAlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xyXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvanMvY29tcG9uZW50cy9mb3JtL2Zvcm0uY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLFVBQVUsYUFBYSxFQUFFLFdBQVcsQ0FBQzs7QUFFckM7SUFDSSxtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsVUFBVTtJQUNWLGdCQUFnQjtJQUNoQixvQ0FBb0M7QUFDeENcIixcInNvdXJjZXNDb250ZW50XCI6W1widGV4dGFyZWEge2hlaWdodDogMTAwcHg7IHdpZHRoOiAxMDAlO31cXHJcXG5cXHJcXG50ZXh0YXJlYSwgaW5wdXQge1xcclxcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLXN1Ym1pdCB7XFxyXFxuICAgIG1hcmdpbi10b3A6IDIwcHg7XFxyXFxuICAgIHdpZHRoOiA2MCU7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAyMCU7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///109\n')},107:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `\r\nh1 {\r\n text-align: center;\r\n}\r\n\r\nh2 {\r\n color: var(--darkGray);\r\n text-align: center;\r\n}\r\n\r\nheader {\r\n align-items: center;\r\n background-color: white;\r\n padding: 5px;\r\n border-bottom: 1px solid var(--citygreen); \r\n /* border: 1px solid var(--citygreen); */\r\n height: var(--header-height);\r\n /* width: calc(100vw - var(--sidebar-width)); */\r\n padding-left: 20px;\r\n}\r\n\r\n/* Logo styling */\r\n#logo {\r\n height: 50px; /* Or your desired size */\r\n margin-right: 20px; /* Optional: space between logo and title */\r\n margin-bottom: -50px;\r\n margin-top: 20px;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/header/header.css"],"names":[],"mappings":";AACA;IACI,kBAAkB;AACtB;;AAEA;IACI,sBAAsB;IACtB,kBAAkB;AACtB;;AAEA;IACI,mBAAmB;IACnB,uBAAuB;IACvB,YAAY;IACZ,yCAAyC;IACzC,yCAAyC;IACzC,4BAA4B;IAC5B,+CAA+C;IAC/C,kBAAkB;AACtB;;AAEA,iBAAiB;AACjB;IACI,YAAY,EAAE,yBAAyB;IACvC,kBAAkB,EAAE,2CAA2C;IAC/D,oBAAoB;IACpB,gBAAgB;AACpB","sourcesContent":["\\r\\nh1 {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\nh2 {\\r\\n color: var(--darkGray);\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\nheader {\\r\\n align-items: center;\\r\\n background-color: white;\\r\\n padding: 5px;\\r\\n border-bottom: 1px solid var(--citygreen); \\r\\n /* border: 1px solid var(--citygreen); */\\r\\n height: var(--header-height);\\r\\n /* width: calc(100vw - var(--sidebar-width)); */\\r\\n padding-left: 20px;\\r\\n}\\r\\n\\r\\n/* Logo styling */\\r\\n#logo {\\r\\n height: 50px; /* Or your desired size */\\r\\n margin-right: 20px; /* Optional: space between logo and title */\\r\\n margin-bottom: -50px;\\r\\n margin-top: 20px;\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA3LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL3NyYy9qcy9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuY3NzPzJmNGMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYFxyXG5oMSB7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbmgyIHtcclxuICAgIGNvbG9yOiB2YXIoLS1kYXJrR3JheSk7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbmhlYWRlciB7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgICBwYWRkaW5nOiA1cHg7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tY2l0eWdyZWVuKTsgXHJcbiAgICAvKiBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pOyAgKi9cclxuICAgIGhlaWdodDogdmFyKC0taGVhZGVyLWhlaWdodCk7XHJcbiAgICAvKiB3aWR0aDogY2FsYygxMDB2dyAtIHZhcigtLXNpZGViYXItd2lkdGgpKTsgKi9cclxuICAgIHBhZGRpbmctbGVmdDogMjBweDtcclxufVxyXG5cclxuLyogTG9nbyBzdHlsaW5nICovXHJcbiNsb2dvIHtcclxuICAgIGhlaWdodDogNTBweDsgLyogT3IgeW91ciBkZXNpcmVkIHNpemUgKi9cclxuICAgIG1hcmdpbi1yaWdodDogMjBweDsgLyogT3B0aW9uYWw6IHNwYWNlIGJldHdlZW4gbG9nbyBhbmQgdGl0bGUgKi9cclxuICAgIG1hcmdpbi1ib3R0b206IC01MHB4O1xyXG4gICAgbWFyZ2luLXRvcDogMjBweDtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQUNBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksc0JBQXNCO0lBQ3RCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLG1CQUFtQjtJQUNuQix1QkFBdUI7SUFDdkIsWUFBWTtJQUNaLHlDQUF5QztJQUN6Qyx5Q0FBeUM7SUFDekMsNEJBQTRCO0lBQzVCLCtDQUErQztJQUMvQyxrQkFBa0I7QUFDdEI7O0FBRUEsaUJBQWlCO0FBQ2pCO0lBQ0ksWUFBWSxFQUFFLHlCQUF5QjtJQUN2QyxrQkFBa0IsRUFBRSwyQ0FBMkM7SUFDL0Qsb0JBQW9CO0lBQ3BCLGdCQUFnQjtBQUNwQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJcXHJcXG5oMSB7XFxyXFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuaDIge1xcclxcbiAgICBjb2xvcjogdmFyKC0tZGFya0dyYXkpO1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbmhlYWRlciB7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgICBwYWRkaW5nOiA1cHg7XFxyXFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jaXR5Z3JlZW4pOyBcXHJcXG4gICAgLyogYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY2l0eWdyZWVuKTsgICovXFxyXFxuICAgIGhlaWdodDogdmFyKC0taGVhZGVyLWhlaWdodCk7XFxyXFxuICAgIC8qIHdpZHRoOiBjYWxjKDEwMHZ3IC0gdmFyKC0tc2lkZWJhci13aWR0aCkpOyAqL1xcclxcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XFxyXFxufVxcclxcblxcclxcbi8qIExvZ28gc3R5bGluZyAqL1xcclxcbiNsb2dvIHtcXHJcXG4gICAgaGVpZ2h0OiA1MHB4OyAvKiBPciB5b3VyIGRlc2lyZWQgc2l6ZSAqL1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7IC8qIE9wdGlvbmFsOiBzcGFjZSBiZXR3ZWVuIGxvZ28gYW5kIHRpdGxlICovXFxyXFxuICAgIG1hcmdpbi1ib3R0b206IC01MHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///107\n')},95:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, ``, "",{"version":3,"sources":[],"names":[],"mappings":"","sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvbW9kYWwvbW9kYWwuY3NzPzZhY2QiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYGAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///95\n')},595:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#nav-btns {\r\n margin: 20px;\r\n text-align: center;\r\n /* margin-top: 100px; */\r\n /* position: absolute; or \'absolute\' depending on use-case */\r\n /* top: 100px; Distance from the top of the viewport or the closest positioned ancestor */\r\n}\r\n\r\n#btn-next, #btn-last {\r\n background-color: var(--darkGray);\r\n}\r\n\r\n#btn-next:hover, #btn-last:hover {\r\n background-color: var(--yellow);\r\n color: var(--darkGray);\r\n}\r\n\r\n/* Add style for when you cannot click the next button */\r\n#btn-next.disabled, #btn-last.disabled,\r\n#btn-next.disabled:hover, #btn-last.disabled:hover {\r\n background-color: gray;\r\n color: white;\r\n pointer-events: none;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/nav_buttons/nav_buttons.css"],"names":[],"mappings":"AAAA;IACI,YAAY;IACZ,kBAAkB;IAClB,uBAAuB;IACvB,4DAA4D;IAC5D,yFAAyF;AAC7F;;AAEA;IACI,iCAAiC;AACrC;;AAEA;IACI,+BAA+B;IAC/B,sBAAsB;AAC1B;;AAEA,wDAAwD;AACxD;;IAEI,sBAAsB;IACtB,YAAY;IACZ,oBAAoB;AACxB","sourcesContent":["#nav-btns {\\r\\n margin: 20px;\\r\\n text-align: center;\\r\\n /* margin-top: 100px; */\\r\\n /* position: absolute; or \'absolute\' depending on use-case */\\r\\n /* top: 100px; Distance from the top of the viewport or the closest positioned ancestor */\\r\\n}\\r\\n\\r\\n#btn-next, #btn-last {\\r\\n background-color: var(--darkGray);\\r\\n}\\r\\n\\r\\n#btn-next:hover, #btn-last:hover {\\r\\n background-color: var(--yellow);\\r\\n color: var(--darkGray);\\r\\n}\\r\\n\\r\\n/* Add style for when you cannot click the next button */\\r\\n#btn-next.disabled, #btn-last.disabled,\\r\\n#btn-next.disabled:hover, #btn-last.disabled:hover {\\r\\n background-color: gray;\\r\\n color: white;\\r\\n pointer-events: none;\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5jc3M/OTA1ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgI25hdi1idG5zIHtcclxuICAgIG1hcmdpbjogMjBweDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIC8qIG1hcmdpbi10b3A6IDEwMHB4OyAqL1xyXG4gICAgLyogcG9zaXRpb246IGFic29sdXRlOyBvciAnYWJzb2x1dGUnIGRlcGVuZGluZyBvbiB1c2UtY2FzZSAqL1xyXG4gICAgLyogdG9wOiAxMDBweDsgRGlzdGFuY2UgZnJvbSB0aGUgdG9wIG9mIHRoZSB2aWV3cG9ydCBvciB0aGUgY2xvc2VzdCBwb3NpdGlvbmVkIGFuY2VzdG9yICovXHJcbn1cclxuXHJcbiNidG4tbmV4dCwgI2J0bi1sYXN0IHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcclxufVxyXG5cclxuI2J0bi1uZXh0OmhvdmVyLCAjYnRuLWxhc3Q6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0teWVsbG93KTtcclxuICAgIGNvbG9yOiB2YXIoLS1kYXJrR3JheSk7XHJcbn1cclxuXHJcbi8qIEFkZCBzdHlsZSBmb3Igd2hlbiB5b3UgY2Fubm90IGNsaWNrIHRoZSBuZXh0IGJ1dHRvbiAqL1xyXG4jYnRuLW5leHQuZGlzYWJsZWQsICNidG4tbGFzdC5kaXNhYmxlZCxcclxuI2J0bi1uZXh0LmRpc2FibGVkOmhvdmVyLCAjYnRuLWxhc3QuZGlzYWJsZWQ6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xyXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvanMvY29tcG9uZW50cy9uYXZfYnV0dG9ucy9uYXZfYnV0dG9ucy5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLHVCQUF1QjtJQUN2Qiw0REFBNEQ7SUFDNUQseUZBQXlGO0FBQzdGOztBQUVBO0lBQ0ksaUNBQWlDO0FBQ3JDOztBQUVBO0lBQ0ksK0JBQStCO0lBQy9CLHNCQUFzQjtBQUMxQjs7QUFFQSx3REFBd0Q7QUFDeEQ7O0lBRUksc0JBQXNCO0lBQ3RCLFlBQVk7SUFDWixvQkFBb0I7QUFDeEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiI25hdi1idG5zIHtcXHJcXG4gICAgbWFyZ2luOiAyMHB4O1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIC8qIG1hcmdpbi10b3A6IDEwMHB4OyAqL1xcclxcbiAgICAvKiBwb3NpdGlvbjogYWJzb2x1dGU7IG9yICdhYnNvbHV0ZScgZGVwZW5kaW5nIG9uIHVzZS1jYXNlICovXFxyXFxuICAgIC8qIHRvcDogMTAwcHg7IERpc3RhbmNlIGZyb20gdGhlIHRvcCBvZiB0aGUgdmlld3BvcnQgb3IgdGhlIGNsb3Nlc3QgcG9zaXRpb25lZCBhbmNlc3RvciAqL1xcclxcbn1cXHJcXG5cXHJcXG4jYnRuLW5leHQsICNidG4tbGFzdCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcXHJcXG59XFxyXFxuXFxyXFxuI2J0bi1uZXh0OmhvdmVyLCAjYnRuLWxhc3Q6aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS15ZWxsb3cpO1xcclxcbiAgICBjb2xvcjogdmFyKC0tZGFya0dyYXkpO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBBZGQgc3R5bGUgZm9yIHdoZW4geW91IGNhbm5vdCBjbGljayB0aGUgbmV4dCBidXR0b24gKi9cXHJcXG4jYnRuLW5leHQuZGlzYWJsZWQsICNidG4tbGFzdC5kaXNhYmxlZCxcXHJcXG4jYnRuLW5leHQuZGlzYWJsZWQ6aG92ZXIsICNidG4tbGFzdC5kaXNhYmxlZDpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XFxyXFxuICAgIGNvbG9yOiB3aGl0ZTtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///595\n')},225:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `div#prompt-div {\r\n display: none;\r\n width: 80%;\r\n margin: auto;\r\n text-align: center;\r\n}\r\n\r\nh3#prompt {\r\n text-align: center;\r\n font-size : 1.2em;\r\n}\r\n\r\n#option1, #option2 { \r\n font-size: 1.5em;\r\n border-color: var(--citygreen); \r\n border-width: 2px;\r\n background-color: var(--white);\r\n color: var(--citygreen);\r\n}\r\n\r\n#option1:hover, #option2:hover { \r\n background-color: var(--spiritgreen);\r\n color: white;\r\n}\r\n\r\n#option2.clicked, #option1.clicked {\r\n font-weight: bold;\r\n background-color: var(--spiritgreen);\r\n color: white;\r\n border-width: 3;\r\n}\r\n`, "",{"version":3,"sources":["webpack://./src/js/components/prompt/prompt.css"],"names":[],"mappings":"AAAA;IACI,aAAa;IACb,UAAU;IACV,YAAY;IACZ,kBAAkB;AACtB;;AAEA;IACI,kBAAkB;IAClB,iBAAiB;AACrB;;AAEA;IACI,gBAAgB;IAChB,8BAA8B;IAC9B,iBAAiB;IACjB,8BAA8B;IAC9B,uBAAuB;AAC3B;;AAEA;IACI,oCAAoC;IACpC,YAAY;AAChB;;AAEA;IACI,iBAAiB;IACjB,oCAAoC;IACpC,YAAY;IACZ,eAAe;AACnB","sourcesContent":["div#prompt-div {\\r\\n display: none;\\r\\n width: 80%;\\r\\n margin: auto;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\nh3#prompt {\\r\\n text-align: center;\\r\\n font-size : 1.2em;\\r\\n}\\r\\n\\r\\n#option1, #option2 { \\r\\n font-size: 1.5em;\\r\\n border-color: var(--citygreen); \\r\\n border-width: 2px;\\r\\n background-color: var(--white);\\r\\n color: var(--citygreen);\\r\\n}\\r\\n\\r\\n#option1:hover, #option2:hover { \\r\\n background-color: var(--spiritgreen);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n#option2.clicked, #option1.clicked {\\r\\n font-weight: bold;\\r\\n background-color: var(--spiritgreen);\\r\\n color: white;\\r\\n border-width: 3;\\r\\n}\\r\\n"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5jc3M/ZTY5OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgZGl2I3Byb21wdC1kaXYge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICAgIHdpZHRoOiA4MCU7XHJcbiAgICBtYXJnaW46IGF1dG87XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbmgzI3Byb21wdCB7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBmb250LXNpemUgOiAxLjJlbTtcclxufVxyXG5cclxuI29wdGlvbjEsICNvcHRpb24yIHsgXHJcbiAgICBmb250LXNpemU6IDEuNWVtO1xyXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pOyBcclxuICAgIGJvcmRlci13aWR0aDogMnB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0td2hpdGUpO1xyXG4gICAgY29sb3I6IHZhcigtLWNpdHlncmVlbik7XHJcbn1cclxuXHJcbiNvcHRpb24xOmhvdmVyLCAjb3B0aW9uMjpob3ZlciB7IFxyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG59XHJcblxyXG4jb3B0aW9uMi5jbGlja2VkLCAjb3B0aW9uMS5jbGlja2VkIHtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgYm9yZGVyLXdpZHRoOiAzO1xyXG59XHJcbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvcHJvbXB0L3Byb21wdC5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxhQUFhO0lBQ2IsVUFBVTtJQUNWLFlBQVk7SUFDWixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLDhCQUE4QjtJQUM5QixpQkFBaUI7SUFDakIsOEJBQThCO0lBQzlCLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLG9DQUFvQztJQUNwQyxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLG9DQUFvQztJQUNwQyxZQUFZO0lBQ1osZUFBZTtBQUNuQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJkaXYjcHJvbXB0LWRpdiB7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxuICAgIHdpZHRoOiA4MCU7XFxyXFxuICAgIG1hcmdpbjogYXV0bztcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG5oMyNwcm9tcHQge1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIGZvbnQtc2l6ZSA6IDEuMmVtO1xcclxcbn1cXHJcXG5cXHJcXG4jb3B0aW9uMSwgI29wdGlvbjIgeyBcXHJcXG4gICAgZm9udC1zaXplOiAxLjVlbTtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pOyBcXHJcXG4gICAgYm9yZGVyLXdpZHRoOiAycHg7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXdoaXRlKTtcXHJcXG4gICAgY29sb3I6IHZhcigtLWNpdHlncmVlbik7XFxyXFxufVxcclxcblxcclxcbiNvcHRpb24xOmhvdmVyLCAjb3B0aW9uMjpob3ZlciB7IFxcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxuICAgIGNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuI29wdGlvbjIuY2xpY2tlZCwgI29wdGlvbjEuY2xpY2tlZCB7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxuICAgIGNvbG9yOiB3aGl0ZTtcXHJcXG4gICAgYm9yZGVyLXdpZHRoOiAzO1xcclxcbn1cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///225\n')},263:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#sidebar-panel {\r\n background-color: lightgrey; \r\n /* min-height: 100vh; Full height of viewport */\r\n }\r\n\r\n#supp-total .stat {\r\n color: var(--yellow);\r\n}\r\n\r\n.stat {\r\n font-weight: bold;\r\n}\r\n\r\n#sidebar-panel {\r\n height: 100%; /* Full height of the viewport */\r\n position: fixed; /* Fixed Sidebar (stay in place on scroll) */\r\n z-index: 1; /* Stay on top */\r\n top: 0; /* Stay at the top */\r\n right: 0; /* Sidebar appears on the left */\r\n background-color: #FFFFFF; /* White background color */\r\n overflow-x: hidden; /* Disable horizontal scroll */\r\n padding: 20px;\r\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Add shadow for some depth */\r\n border-right: 2px solid #DDDDDD; /* Right border */\r\n border-radius: 0px 0px 0px 15px; /* Rounded corners on the left */\r\n /* margin-top: var(--header-height); */\r\n width: var(--sidebar-width);\r\n margin: 0px;\r\n }\r\n \r\n.sidebar a {\r\n padding: 10px 15px;\r\n text-decoration: none;\r\n font-size: 18px;\r\n color: #818181;\r\n display: block;\r\n transition: 0.3s;\r\n}\r\n\r\n#sidebar-title {\r\n color: var(--darkGray);\r\n font-weight: bold;\r\n border-bottom: 1px solid var(--citygreen);\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/sidebar/sidebar.css"],"names":[],"mappings":"AAAA;IACI,2BAA2B;IAC3B,+CAA+C;EACjD;;AAEF;IACI,oBAAoB;AACxB;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,YAAY,EAAE,gCAAgC;IAC9C,eAAe,EAAE,4CAA4C;IAC7D,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,oBAAoB;IAC5B,QAAQ,EAAE,gCAAgC;IAC1C,yBAAyB,EAAE,2BAA2B;IACtD,kBAAkB,EAAE,8BAA8B;IAClD,aAAa;IACb,wCAAwC,EAAE,8BAA8B;IACxE,+BAA+B,EAAE,iBAAiB;IAClD,+BAA+B,EAAE,gCAAgC;IACjE,sCAAsC;IACtC,2BAA2B;IAC3B,WAAW;EACb;;AAEF;IACI,kBAAkB;IAClB,qBAAqB;IACrB,eAAe;IACf,cAAc;IACd,cAAc;IACd,gBAAgB;AACpB;;AAEA;EACE,sBAAsB;EACtB,iBAAiB;EACjB,yCAAyC;AAC3C","sourcesContent":["#sidebar-panel {\\r\\n background-color: lightgrey; \\r\\n /* min-height: 100vh; Full height of viewport */\\r\\n }\\r\\n\\r\\n#supp-total .stat {\\r\\n color: var(--yellow);\\r\\n}\\r\\n\\r\\n.stat {\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n#sidebar-panel {\\r\\n height: 100%; /* Full height of the viewport */\\r\\n position: fixed; /* Fixed Sidebar (stay in place on scroll) */\\r\\n z-index: 1; /* Stay on top */\\r\\n top: 0; /* Stay at the top */\\r\\n right: 0; /* Sidebar appears on the left */\\r\\n background-color: #FFFFFF; /* White background color */\\r\\n overflow-x: hidden; /* Disable horizontal scroll */\\r\\n padding: 20px;\\r\\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* Add shadow for some depth */\\r\\n border-right: 2px solid #DDDDDD; /* Right border */\\r\\n border-radius: 0px 0px 0px 15px; /* Rounded corners on the left */\\r\\n /* margin-top: var(--header-height); */\\r\\n width: var(--sidebar-width);\\r\\n margin: 0px;\\r\\n }\\r\\n \\r\\n.sidebar a {\\r\\n padding: 10px 15px;\\r\\n text-decoration: none;\\r\\n font-size: 18px;\\r\\n color: #818181;\\r\\n display: block;\\r\\n transition: 0.3s;\\r\\n}\\r\\n\\r\\n#sidebar-title {\\r\\n color: var(--darkGray);\\r\\n font-weight: bold;\\r\\n border-bottom: 1px solid var(--citygreen);\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vc3JjL2pzL2NvbXBvbmVudHMvc2lkZWJhci9zaWRlYmFyLmNzcz8zYjAzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAjc2lkZWJhci1wYW5lbCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyZXk7ICBcclxuICAgIC8qIG1pbi1oZWlnaHQ6IDEwMHZoOyBGdWxsIGhlaWdodCBvZiB2aWV3cG9ydCAqL1xyXG4gIH1cclxuXHJcbiNzdXBwLXRvdGFsIC5zdGF0IHtcclxuICAgIGNvbG9yOiB2YXIoLS15ZWxsb3cpO1xyXG59XHJcblxyXG4uc3RhdCB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuI3NpZGViYXItcGFuZWwge1xyXG4gICAgaGVpZ2h0OiAxMDAlOyAvKiBGdWxsIGhlaWdodCBvZiB0aGUgdmlld3BvcnQgKi9cclxuICAgIHBvc2l0aW9uOiBmaXhlZDsgLyogRml4ZWQgU2lkZWJhciAoc3RheSBpbiBwbGFjZSBvbiBzY3JvbGwpICovXHJcbiAgICB6LWluZGV4OiAxOyAvKiBTdGF5IG9uIHRvcCAqL1xyXG4gICAgdG9wOiAwOyAvKiBTdGF5IGF0IHRoZSB0b3AgKi9cclxuICAgIHJpZ2h0OiAwOyAvKiBTaWRlYmFyIGFwcGVhcnMgb24gdGhlIGxlZnQgKi9cclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7IC8qIFdoaXRlIGJhY2tncm91bmQgY29sb3IgKi9cclxuICAgIG92ZXJmbG93LXg6IGhpZGRlbjsgLyogRGlzYWJsZSBob3Jpem9udGFsIHNjcm9sbCAqL1xyXG4gICAgcGFkZGluZzogMjBweDtcclxuICAgIGJveC1zaGFkb3c6IDAgMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMSk7IC8qIEFkZCBzaGFkb3cgZm9yIHNvbWUgZGVwdGggKi9cclxuICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICNEREREREQ7IC8qIFJpZ2h0IGJvcmRlciAqL1xyXG4gICAgYm9yZGVyLXJhZGl1czogMHB4IDBweCAwcHggMTVweDsgLyogUm91bmRlZCBjb3JuZXJzIG9uIHRoZSBsZWZ0ICovXHJcbiAgICAvKiBtYXJnaW4tdG9wOiB2YXIoLS1oZWFkZXItaGVpZ2h0KTsgKi9cclxuICAgIHdpZHRoOiB2YXIoLS1zaWRlYmFyLXdpZHRoKTtcclxuICAgIG1hcmdpbjogMHB4O1xyXG4gIH1cclxuICBcclxuLnNpZGViYXIgYSB7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDE1cHg7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgICBmb250LXNpemU6IDE4cHg7XHJcbiAgICBjb2xvcjogIzgxODE4MTtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgdHJhbnNpdGlvbjogMC4zcztcclxufVxyXG5cclxuI3NpZGViYXItdGl0bGUge1xyXG4gIGNvbG9yOiB2YXIoLS1kYXJrR3JheSk7XHJcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWNpdHlncmVlbik7XHJcbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9qcy9jb21wb25lbnRzL3NpZGViYXIvc2lkZWJhci5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSwyQkFBMkI7SUFDM0IsK0NBQStDO0VBQ2pEOztBQUVGO0lBQ0ksb0JBQW9CO0FBQ3hCOztBQUVBO0lBQ0ksaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksWUFBWSxFQUFFLGdDQUFnQztJQUM5QyxlQUFlLEVBQUUsNENBQTRDO0lBQzdELFVBQVUsRUFBRSxnQkFBZ0I7SUFDNUIsTUFBTSxFQUFFLG9CQUFvQjtJQUM1QixRQUFRLEVBQUUsZ0NBQWdDO0lBQzFDLHlCQUF5QixFQUFFLDJCQUEyQjtJQUN0RCxrQkFBa0IsRUFBRSw4QkFBOEI7SUFDbEQsYUFBYTtJQUNiLHdDQUF3QyxFQUFFLDhCQUE4QjtJQUN4RSwrQkFBK0IsRUFBRSxpQkFBaUI7SUFDbEQsK0JBQStCLEVBQUUsZ0NBQWdDO0lBQ2pFLHNDQUFzQztJQUN0QywyQkFBMkI7SUFDM0IsV0FBVztFQUNiOztBQUVGO0lBQ0ksa0JBQWtCO0lBQ2xCLHFCQUFxQjtJQUNyQixlQUFlO0lBQ2YsY0FBYztJQUNkLGNBQWM7SUFDZCxnQkFBZ0I7QUFDcEI7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsaUJBQWlCO0VBQ2pCLHlDQUF5QztBQUMzQ1wiLFwic291cmNlc0NvbnRlbnRcIjpbXCIjc2lkZWJhci1wYW5lbCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JleTsgIFxcclxcbiAgICAvKiBtaW4taGVpZ2h0OiAxMDB2aDsgRnVsbCBoZWlnaHQgb2Ygdmlld3BvcnQgKi9cXHJcXG4gIH1cXHJcXG5cXHJcXG4jc3VwcC10b3RhbCAuc3RhdCB7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS15ZWxsb3cpO1xcclxcbn1cXHJcXG5cXHJcXG4uc3RhdCB7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbn1cXHJcXG5cXHJcXG4jc2lkZWJhci1wYW5lbCB7XFxyXFxuICAgIGhlaWdodDogMTAwJTsgLyogRnVsbCBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0ICovXFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDsgLyogRml4ZWQgU2lkZWJhciAoc3RheSBpbiBwbGFjZSBvbiBzY3JvbGwpICovXFxyXFxuICAgIHotaW5kZXg6IDE7IC8qIFN0YXkgb24gdG9wICovXFxyXFxuICAgIHRvcDogMDsgLyogU3RheSBhdCB0aGUgdG9wICovXFxyXFxuICAgIHJpZ2h0OiAwOyAvKiBTaWRlYmFyIGFwcGVhcnMgb24gdGhlIGxlZnQgKi9cXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsgLyogV2hpdGUgYmFja2dyb3VuZCBjb2xvciAqL1xcclxcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47IC8qIERpc2FibGUgaG9yaXpvbnRhbCBzY3JvbGwgKi9cXHJcXG4gICAgcGFkZGluZzogMjBweDtcXHJcXG4gICAgYm94LXNoYWRvdzogMCAycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xKTsgLyogQWRkIHNoYWRvdyBmb3Igc29tZSBkZXB0aCAqL1xcclxcbiAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCAjREREREREOyAvKiBSaWdodCBib3JkZXIgKi9cXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMHB4IDBweCAwcHggMTVweDsgLyogUm91bmRlZCBjb3JuZXJzIG9uIHRoZSBsZWZ0ICovXFxyXFxuICAgIC8qIG1hcmdpbi10b3A6IHZhcigtLWhlYWRlci1oZWlnaHQpOyAqL1xcclxcbiAgICB3aWR0aDogdmFyKC0tc2lkZWJhci13aWR0aCk7XFxyXFxuICAgIG1hcmdpbjogMHB4O1xcclxcbiAgfVxcclxcbiAgXFxyXFxuLnNpZGViYXIgYSB7XFxyXFxuICAgIHBhZGRpbmc6IDEwcHggMTVweDtcXHJcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcclxcbiAgICBmb250LXNpemU6IDE4cHg7XFxyXFxuICAgIGNvbG9yOiAjODE4MTgxO1xcclxcbiAgICBkaXNwbGF5OiBibG9jaztcXHJcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXHJcXG59XFxyXFxuXFxyXFxuI3NpZGViYXItdGl0bGUge1xcclxcbiAgY29sb3I6IHZhcigtLWRhcmtHcmF5KTtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWNpdHlncmVlbik7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///263\n')},279:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `#main-table {\r\n font-size: calc(0.6vw + 0.5em);\r\n margin: auto;\r\n /* width: 100%; */\r\n}\r\n\r\n#main-table thead > tr > th {\r\n text-align: left;\r\n background-color: var(--darkGray);\r\n color: white;\r\n}\r\n\r\nth {\r\n background-color: var(--lightGray);\r\n}\r\n\r\ntr {\r\n border-width: 2px;\r\n background-color: white;\r\n}\r\n\r\ntr td {\r\n border-bottom: 1px solid black;\r\n}\r\n\r\n/* Default to hidden columns */\r\n\r\n#main-table tbody > tr > td {\r\n display : none;\r\n}\r\n#main-table thead > tr > th {\r\n display : none;\r\n}\r\n\r\n/* textbox width in table */\r\ninput {\r\n width: 100%;\r\n}\r\n\r\nselect {\r\n max-width: 100px;\r\n}\r\n\r\ndiv.table-container {\r\n overflow-x: auto; \r\n overflow-y: auto;\r\n margin-left: max(65px, 7vh);\r\n margin-right: max(65px, 7vh);\r\n /* max-width: calc(100vw - var(--sidebar-width)); */\r\n /* margin: auto; */\r\n max-height: max(350px, 6vh);\r\n /* min-height: 350px; */\r\n\r\n}\r\n \r\n/* Buttons */\r\n\r\n/* Add new row button */\r\n.btn-add { \r\n background-color: var(--spiritgreen);\r\n margin-top: 20px;\r\n display: none;\r\n}\r\n\r\n.btn-delete {\r\n background-color: var(--orange);\r\n}\r\n\r\n#add-btn-div {\r\n display: flex;\r\n justify-content: center; /* Aligns horizontally */\r\n align-items: center; /* Aligns vertically */\r\n width: 100%;\r\n}\r\n\r\n.btn-edit {\r\n background-color: var(--spiritgreen);\r\n}\r\n\r\n.active-editing, .selected {\r\n background-color: var(--palegreen);\r\n}\r\n\r\n.selected { \r\n font-weight: bold;\r\n}\r\n\r\n.btn-confirm {\r\n display: none;\r\n}\r\n\r\n.confirm-btn:hover {\r\n background-color: var(--green);\r\n}\r\n\r\n.hover-effect:hover {\r\n cursor: pointer;\r\n background-color: var(--verypalegreen); \r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/table/table.css"],"names":[],"mappings":"AAAA;IACI,8BAA8B;IAC9B,YAAY;IACZ,iBAAiB;AACrB;;AAEA;IACI,gBAAgB;IAChB,iCAAiC;IACjC,YAAY;AAChB;;AAEA;IACI,kCAAkC;AACtC;;AAEA;IACI,iBAAiB;IACjB,uBAAuB;AAC3B;;AAEA;IACI,8BAA8B;AAClC;;AAEA,8BAA8B;;AAE9B;IACI,cAAc;AAClB;AACA;IACI,cAAc;AAClB;;AAEA,2BAA2B;AAC3B;IACI,WAAW;AACf;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,gBAAgB;IAChB,gBAAgB;IAChB,2BAA2B;IAC3B,4BAA4B;IAC5B,oDAAoD;IACpD,kBAAkB;IAClB,2BAA2B;IAC3B,uBAAuB;;AAE3B;;AAEA,YAAY;;AAEZ,uBAAuB;AACvB;IACI,oCAAoC;IACpC,gBAAgB;IAChB,aAAa;AACjB;;AAEA;IACI,+BAA+B;AACnC;;AAEA;IACI,aAAa;IACb,uBAAuB,EAAE,wBAAwB;IACjD,mBAAmB,EAAE,sBAAsB;IAC3C,WAAW;AACf;;AAEA;IACI,oCAAoC;AACxC;;AAEA;IACI,kCAAkC;AACtC;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,8BAA8B;AAClC;;AAEA;IACI,eAAe;IACf,sCAAsC;AAC1C","sourcesContent":["#main-table {\\r\\n font-size: calc(0.6vw + 0.5em);\\r\\n margin: auto;\\r\\n /* width: 100%; */\\r\\n}\\r\\n\\r\\n#main-table thead > tr > th {\\r\\n text-align: left;\\r\\n background-color: var(--darkGray);\\r\\n color: white;\\r\\n}\\r\\n\\r\\nth {\\r\\n background-color: var(--lightGray);\\r\\n}\\r\\n\\r\\ntr {\\r\\n border-width: 2px;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\ntr td {\\r\\n border-bottom: 1px solid black;\\r\\n}\\r\\n\\r\\n/* Default to hidden columns */\\r\\n\\r\\n#main-table tbody > tr > td {\\r\\n display : none;\\r\\n}\\r\\n#main-table thead > tr > th {\\r\\n display : none;\\r\\n}\\r\\n\\r\\n/* textbox width in table */\\r\\ninput {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\nselect {\\r\\n max-width: 100px;\\r\\n}\\r\\n\\r\\ndiv.table-container {\\r\\n overflow-x: auto; \\r\\n overflow-y: auto;\\r\\n margin-left: max(65px, 7vh);\\r\\n margin-right: max(65px, 7vh);\\r\\n /* max-width: calc(100vw - var(--sidebar-width)); */\\r\\n /* margin: auto; */\\r\\n max-height: max(350px, 6vh);\\r\\n /* min-height: 350px; */\\r\\n\\r\\n}\\r\\n \\r\\n/* Buttons */\\r\\n\\r\\n/* Add new row button */\\r\\n.btn-add { \\r\\n background-color: var(--spiritgreen);\\r\\n margin-top: 20px;\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.btn-delete {\\r\\n background-color: var(--orange);\\r\\n}\\r\\n\\r\\n#add-btn-div {\\r\\n display: flex;\\r\\n justify-content: center; /* Aligns horizontally */\\r\\n align-items: center; /* Aligns vertically */\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.btn-edit {\\r\\n background-color: var(--spiritgreen);\\r\\n}\\r\\n\\r\\n.active-editing, .selected {\\r\\n background-color: var(--palegreen);\\r\\n}\\r\\n\\r\\n.selected { \\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.btn-confirm {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.confirm-btn:hover {\\r\\n background-color: var(--green);\\r\\n}\\r\\n\\r\\n.hover-effect:hover {\\r\\n cursor: pointer;\\r\\n background-color: var(--verypalegreen); \\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS90YWJsZS5jc3M/NTIzNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgI21haW4tdGFibGUge1xyXG4gICAgZm9udC1zaXplOiBjYWxjKDAuNnZ3ICsgMC41ZW0pO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgLyogd2lkdGg6IDEwMCU7ICovXHJcbn1cclxuXHJcbiNtYWluLXRhYmxlIHRoZWFkID4gdHIgPiB0aCB7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGFya0dyYXkpO1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG59XHJcblxyXG50aCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1saWdodEdyYXkpO1xyXG59XHJcblxyXG50ciB7XHJcbiAgICBib3JkZXItd2lkdGg6IDJweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG59XHJcblxyXG50ciB0ZCB7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XHJcbn1cclxuXHJcbi8qIERlZmF1bHQgdG8gaGlkZGVuIGNvbHVtbnMgKi9cclxuXHJcbiNtYWluLXRhYmxlIHRib2R5ID4gdHIgPiB0ZCB7XHJcbiAgICBkaXNwbGF5IDogbm9uZTtcclxufVxyXG4jbWFpbi10YWJsZSB0aGVhZCA+IHRyID4gdGgge1xyXG4gICAgZGlzcGxheSA6IG5vbmU7XHJcbn1cclxuXHJcbi8qIHRleHRib3ggd2lkdGggaW4gdGFibGUgKi9cclxuaW5wdXQge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbnNlbGVjdCB7XHJcbiAgICBtYXgtd2lkdGg6IDEwMHB4O1xyXG59XHJcblxyXG5kaXYudGFibGUtY29udGFpbmVyIHtcclxuICAgIG92ZXJmbG93LXg6IGF1dG87IFxyXG4gICAgb3ZlcmZsb3cteTogYXV0bztcclxuICAgIG1hcmdpbi1sZWZ0OiBtYXgoNjVweCwgN3ZoKTtcclxuICAgIG1hcmdpbi1yaWdodDogbWF4KDY1cHgsIDd2aCk7XHJcbiAgICAvKiBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSB2YXIoLS1zaWRlYmFyLXdpZHRoKSk7ICAqL1xyXG4gICAgLyogbWFyZ2luOiBhdXRvOyAqL1xyXG4gICAgbWF4LWhlaWdodDogbWF4KDM1MHB4LCA2dmgpO1xyXG4gICAgLyogbWluLWhlaWdodDogMzUwcHg7ICovXHJcblxyXG59XHJcbiAgXHJcbi8qIEJ1dHRvbnMgKi9cclxuXHJcbi8qIEFkZCBuZXcgcm93IGJ1dHRvbiAqL1xyXG4uYnRuLWFkZCB7IFxyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xyXG4gICAgbWFyZ2luLXRvcDogMjBweDtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbi5idG4tZGVsZXRlIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW9yYW5nZSk7XHJcbn1cclxuXHJcbiNhZGQtYnRuLWRpdiB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IC8qIEFsaWducyBob3Jpem9udGFsbHkgKi9cclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IC8qIEFsaWducyB2ZXJ0aWNhbGx5ICovXHJcbiAgICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLmJ0bi1lZGl0IHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxufVxyXG5cclxuLmFjdGl2ZS1lZGl0aW5nLCAuc2VsZWN0ZWQge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFsZWdyZWVuKTtcclxufVxyXG5cclxuLnNlbGVjdGVkIHsgXHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLmJ0bi1jb25maXJtIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbi5jb25maXJtLWJ0bjpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ncmVlbik7XHJcbn1cclxuXHJcbi5ob3Zlci1lZmZlY3Q6aG92ZXIge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdmVyeXBhbGVncmVlbik7IFxyXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvanMvY29tcG9uZW50cy90YWJsZS90YWJsZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSw4QkFBOEI7SUFDOUIsWUFBWTtJQUNaLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixpQ0FBaUM7SUFDakMsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGtDQUFrQztBQUN0Qzs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQix1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSw4QkFBOEI7QUFDbEM7O0FBRUEsOEJBQThCOztBQUU5QjtJQUNJLGNBQWM7QUFDbEI7QUFDQTtJQUNJLGNBQWM7QUFDbEI7O0FBRUEsMkJBQTJCO0FBQzNCO0lBQ0ksV0FBVztBQUNmOztBQUVBO0lBQ0ksZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQiwyQkFBMkI7SUFDM0IsNEJBQTRCO0lBQzVCLG9EQUFvRDtJQUNwRCxrQkFBa0I7SUFDbEIsMkJBQTJCO0lBQzNCLHVCQUF1Qjs7QUFFM0I7O0FBRUEsWUFBWTs7QUFFWix1QkFBdUI7QUFDdkI7SUFDSSxvQ0FBb0M7SUFDcEMsZ0JBQWdCO0lBQ2hCLGFBQWE7QUFDakI7O0FBRUE7SUFDSSwrQkFBK0I7QUFDbkM7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsdUJBQXVCLEVBQUUsd0JBQXdCO0lBQ2pELG1CQUFtQixFQUFFLHNCQUFzQjtJQUMzQyxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxvQ0FBb0M7QUFDeEM7O0FBRUE7SUFDSSxrQ0FBa0M7QUFDdEM7O0FBRUE7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksOEJBQThCO0FBQ2xDOztBQUVBO0lBQ0ksZUFBZTtJQUNmLHNDQUFzQztBQUMxQ1wiLFwic291cmNlc0NvbnRlbnRcIjpbXCIjbWFpbi10YWJsZSB7XFxyXFxuICAgIGZvbnQtc2l6ZTogY2FsYygwLjZ2dyArIDAuNWVtKTtcXHJcXG4gICAgbWFyZ2luOiBhdXRvO1xcclxcbiAgICAvKiB3aWR0aDogMTAwJTsgKi9cXHJcXG59XFxyXFxuXFxyXFxuI21haW4tdGFibGUgdGhlYWQgPiB0ciA+IHRoIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGFya0dyYXkpO1xcclxcbiAgICBjb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbnRoIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHRHcmF5KTtcXHJcXG59XFxyXFxuXFxyXFxudHIge1xcclxcbiAgICBib3JkZXItd2lkdGg6IDJweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbnRyIHRkIHtcXHJcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBEZWZhdWx0IHRvIGhpZGRlbiBjb2x1bW5zICovXFxyXFxuXFxyXFxuI21haW4tdGFibGUgdGJvZHkgPiB0ciA+IHRkIHtcXHJcXG4gICAgZGlzcGxheSA6IG5vbmU7XFxyXFxufVxcclxcbiNtYWluLXRhYmxlIHRoZWFkID4gdHIgPiB0aCB7XFxyXFxuICAgIGRpc3BsYXkgOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4vKiB0ZXh0Ym94IHdpZHRoIGluIHRhYmxlICovXFxyXFxuaW5wdXQge1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuc2VsZWN0IHtcXHJcXG4gICAgbWF4LXdpZHRoOiAxMDBweDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LnRhYmxlLWNvbnRhaW5lciB7XFxyXFxuICAgIG92ZXJmbG93LXg6IGF1dG87IFxcclxcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xcclxcbiAgICBtYXJnaW4tbGVmdDogbWF4KDY1cHgsIDd2aCk7XFxyXFxuICAgIG1hcmdpbi1yaWdodDogbWF4KDY1cHgsIDd2aCk7XFxyXFxuICAgIC8qIG1heC13aWR0aDogY2FsYygxMDB2dyAtIHZhcigtLXNpZGViYXItd2lkdGgpKTsgICovXFxyXFxuICAgIC8qIG1hcmdpbjogYXV0bzsgKi9cXHJcXG4gICAgbWF4LWhlaWdodDogbWF4KDM1MHB4LCA2dmgpO1xcclxcbiAgICAvKiBtaW4taGVpZ2h0OiAzNTBweDsgKi9cXHJcXG5cXHJcXG59XFxyXFxuICBcXHJcXG4vKiBCdXR0b25zICovXFxyXFxuXFxyXFxuLyogQWRkIG5ldyByb3cgYnV0dG9uICovXFxyXFxuLmJ0bi1hZGQgeyBcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3Bpcml0Z3JlZW4pO1xcclxcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xcclxcbiAgICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLWRlbGV0ZSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW9yYW5nZSk7XFxyXFxufVxcclxcblxcclxcbiNhZGQtYnRuLWRpdiB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyAvKiBBbGlnbnMgaG9yaXpvbnRhbGx5ICovXFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IC8qIEFsaWducyB2ZXJ0aWNhbGx5ICovXFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLWVkaXQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxufVxcclxcblxcclxcbi5hY3RpdmUtZWRpdGluZywgLnNlbGVjdGVkIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFsZWdyZWVuKTtcXHJcXG59XFxyXFxuXFxyXFxuLnNlbGVjdGVkIHsgXFxyXFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLWNvbmZpcm0ge1xcclxcbiAgICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uY29uZmlybS1idG46aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ncmVlbik7XFxyXFxufVxcclxcblxcclxcbi5ob3Zlci1lZmZlY3Q6aG92ZXIge1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXZlcnlwYWxlZ3JlZW4pOyBcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///279\n')},235:(module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(354);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Welcome page (index.html) */\r\n\r\n.step {\r\n width: 60%;\r\n height: 80px;\r\n font-size: 1.75em;\r\n margin-bottom: 0px; /* Adds spacing between buttons */\r\n margin-left: 20%;\r\n border-color: var(--citygreen);\r\n border-width: 2;\r\n color: var(--citygreen);\r\n background-color: white;\r\n}\r\n\r\n.step:hover {\r\n color: white;\r\n background-color: var(--spiritgreen);\r\n}\r\n\r\n#welcome-page {\r\n justify-content: center; \r\n align-items: center; \r\n padding-top: 20px;\r\n}\r\n.step.disabled {\r\n opacity: 50%;\r\n}`, "",{"version":3,"sources":["webpack://./src/js/components/welcome/welcome.css"],"names":[],"mappings":"AAAA,8BAA8B;;AAE9B;IACI,UAAU;IACV,YAAY;IACZ,iBAAiB;IACjB,kBAAkB,EAAE,iCAAiC;IACrD,gBAAgB;IAChB,8BAA8B;IAC9B,eAAe;IACf,uBAAuB;IACvB,uBAAuB;AAC3B;;AAEA;IACI,YAAY;IACZ,oCAAoC;AACxC;;AAEA;IACI,uBAAuB;IACvB,mBAAmB;IACnB,iBAAiB;AACrB;AACA;IACI,YAAY;AAChB","sourcesContent":["/* Welcome page (index.html) */\\r\\n\\r\\n.step {\\r\\n width: 60%;\\r\\n height: 80px;\\r\\n font-size: 1.75em;\\r\\n margin-bottom: 0px; /* Adds spacing between buttons */\\r\\n margin-left: 20%;\\r\\n border-color: var(--citygreen);\\r\\n border-width: 2;\\r\\n color: var(--citygreen);\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.step:hover {\\r\\n color: white;\\r\\n background-color: var(--spiritgreen);\\r\\n}\\r\\n\\r\\n#welcome-page {\\r\\n justify-content: center; \\r\\n align-items: center; \\r\\n padding-top: 20px;\\r\\n}\\r\\n.step.disabled {\\r\\n opacity: 50%;\\r\\n}"],"sourceRoot":""}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2J1ZGdldC1yZXF1ZXN0LWZvcm0vLi9zcmMvanMvY29tcG9uZW50cy93ZWxjb21lL3dlbGNvbWUuY3NzP2IzNDgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC8qIFdlbGNvbWUgcGFnZSAoaW5kZXguaHRtbCkgKi9cclxuXHJcbi5zdGVwIHtcclxuICAgIHdpZHRoOiA2MCU7XHJcbiAgICBoZWlnaHQ6IDgwcHg7XHJcbiAgICBmb250LXNpemU6IDEuNzVlbTtcclxuICAgIG1hcmdpbi1ib3R0b206IDBweDsgLyogQWRkcyBzcGFjaW5nIGJldHdlZW4gYnV0dG9ucyAqL1xyXG4gICAgbWFyZ2luLWxlZnQ6IDIwJTtcclxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcclxuICAgIGJvcmRlci13aWR0aDogMjtcclxuICAgIGNvbG9yOiB2YXIoLS1jaXR5Z3JlZW4pO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5zdGVwOmhvdmVyIHtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwaXJpdGdyZWVuKTtcclxufVxyXG5cclxuI3dlbGNvbWUtcGFnZSB7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgXHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyOyBcclxuICAgIHBhZGRpbmctdG9wOiAyMHB4O1xyXG59XHJcbi5zdGVwLmRpc2FibGVkIHtcclxuICAgIG9wYWNpdHk6IDUwJTtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2pzL2NvbXBvbmVudHMvd2VsY29tZS93ZWxjb21lLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSw4QkFBOEI7O0FBRTlCO0lBQ0ksVUFBVTtJQUNWLFlBQVk7SUFDWixpQkFBaUI7SUFDakIsa0JBQWtCLEVBQUUsaUNBQWlDO0lBQ3JELGdCQUFnQjtJQUNoQiw4QkFBOEI7SUFDOUIsZUFBZTtJQUNmLHVCQUF1QjtJQUN2Qix1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSxZQUFZO0lBQ1osb0NBQW9DO0FBQ3hDOztBQUVBO0lBQ0ksdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixpQkFBaUI7QUFDckI7QUFDQTtJQUNJLFlBQVk7QUFDaEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLyogV2VsY29tZSBwYWdlIChpbmRleC5odG1sKSAqL1xcclxcblxcclxcbi5zdGVwIHtcXHJcXG4gICAgd2lkdGg6IDYwJTtcXHJcXG4gICAgaGVpZ2h0OiA4MHB4O1xcclxcbiAgICBmb250LXNpemU6IDEuNzVlbTtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMHB4OyAvKiBBZGRzIHNwYWNpbmcgYmV0d2VlbiBidXR0b25zICovXFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAyMCU7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcXHJcXG4gICAgYm9yZGVyLXdpZHRoOiAyO1xcclxcbiAgICBjb2xvcjogdmFyKC0tY2l0eWdyZWVuKTtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbi5zdGVwOmhvdmVyIHtcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGlyaXRncmVlbik7XFxyXFxufVxcclxcblxcclxcbiN3ZWxjb21lLXBhZ2Uge1xcclxcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgXFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IFxcclxcbiAgICBwYWRkaW5nLXRvcDogMjBweDtcXHJcXG59XFxyXFxuLnN0ZXAuZGlzYWJsZWQge1xcclxcbiAgICBvcGFjaXR5OiA1MCU7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///235\n')},314:module=>{eval('\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = "";\n var needLayer = typeof item[5] !== "undefined";\n if (item[4]) {\n content += "@supports (".concat(item[4], ") {");\n }\n if (item[2]) {\n content += "@media ".concat(item[2], " {");\n }\n if (needLayer) {\n content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += "}";\n }\n if (item[2]) {\n content += "}";\n }\n if (item[4]) {\n content += "}";\n }\n return content;\n }).join("");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === "string") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== "undefined") {\n if (typeof item[5] === "undefined") {\n item[5] = layer;\n } else {\n item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = "@media ".concat(item[2], " {").concat(item[1], "}");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = "".concat(supports);\n } else {\n item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanM/MjRmYiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTtcblxuICAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKTtcbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNba11bMF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBtb2R1bGVzLmxlbmd0aDsgX2srKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfa10pO1xuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZWRpYSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGxpc3Q7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///314\n')},354:module=>{eval('\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === "function") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);\n var sourceMapping = "/*# ".concat(data, " */");\n return [content].concat([sourceMapping]).join("\\n");\n }\n return [content].join("\\n");\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU0LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzP2FmMTIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///354\n')},72:module=>{eval('\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = "".concat(id, " ").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcz8yZGJhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///72\n')},659:module=>{eval('\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === "undefined") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error("Couldn\'t find a style target. This probably means that the value for the \'insert\' parameter is invalid.");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU5LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanM/YjIxNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///659\n')},540:module=>{eval('\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement("style");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQwLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcz9kZTZjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///540\n')},56:(module,__unused_webpack_exports,__webpack_require__)=>{eval('\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = true ? __webpack_require__.nc : 0;\n if (nonce) {\n styleElement.setAttribute("nonce", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzP2RkY2UiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///56\n')},825:module=>{eval('\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = "";\n if (obj.supports) {\n css += "@supports (".concat(obj.supports, ") {");\n }\n if (obj.media) {\n css += "@media ".concat(obj.media, " {");\n }\n var needLayer = typeof obj.layer !== "undefined";\n if (needLayer) {\n css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {");\n }\n css += obj.css;\n if (needLayer) {\n css += "}";\n }\n if (obj.media) {\n css += "}";\n }\n if (obj.supports) {\n css += "}";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== "undefined") {\n css += "\\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === "undefined") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODI1LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYnVkZ2V0LXJlcXVlc3QtZm9ybS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzP2U0NzkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///825\n')},113:module=>{eval("\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9idWRnZXQtcmVxdWVzdC1mb3JtLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanM/MWRkZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///113\n")}},__webpack_module_cache__={};function __webpack_require__(n){var c=__webpack_module_cache__[n];if(void 0!==c)return c.exports;var t=__webpack_module_cache__[n]={id:n,exports:{}};return __webpack_modules__[n](t,t.exports,__webpack_require__),t.exports}__webpack_require__.n=n=>{var c=n&&n.__esModule?()=>n.default:()=>n;return __webpack_require__.d(c,{a:c}),c},__webpack_require__.d=(n,c)=>{for(var t in c)__webpack_require__.o(c,t)&&!__webpack_require__.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:c[t]})},__webpack_require__.o=(n,c)=>Object.prototype.hasOwnProperty.call(n,c),__webpack_require__.nc=void 0;var __webpack_exports__=__webpack_require__(573)})(); \ No newline at end of file diff --git a/build/d027d45141f87dc014af.png b/docs/d027d45141f87dc014af.png similarity index 100% rename from build/d027d45141f87dc014af.png rename to docs/d027d45141f87dc014af.png diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..e85437a --- /dev/null +++ b/docs/index.html @@ -0,0 +1 @@ +Demo Budget Form

FY2026 Budget Form

Baseline


\ No newline at end of file