{"version":3,"sources":["wwwroot/js/store/node_modules/browser-pack/_prelude.js","wwwroot/js/store/Scripts/pages/store/index.js","wwwroot/js/store/Scripts/src/api.js","wwwroot/js/store/Scripts/src/common.js","wwwroot/js/store/Scripts/src/errors.js","wwwroot/js/store/Scripts/src/localStorage.js","wwwroot/js/store/Scripts/src/notifications.js","wwwroot/js/store/Scripts/src/validation.js","wwwroot/js/store/node_modules/@babel/runtime/helpers/asyncToGenerator.js","wwwroot/js/store/node_modules/@babel/runtime/helpers/classCallCheck.js","wwwroot/js/store/node_modules/@babel/runtime/helpers/createClass.js","wwwroot/js/store/node_modules/@babel/runtime/helpers/defineProperty.js","wwwroot/js/store/node_modules/@babel/runtime/helpers/interopRequireDefault.js","wwwroot/js/store/node_modules/@babel/runtime/regenerator/index.js","wwwroot/js/store/node_modules/regenerator-runtime/runtime.js"],"names":[],"mappings":"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,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE;gBAAC,MAAM,EAAE;cAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,EAAE;gBAChE,cAAc,CAAC,KAAK,GAAG,KAAK;gBAE5B,IAAI,CAAC,MAAM,CAAC,CAAC;cACjB,CAAC,CAAC;YACN,CAAC,CAAC;UACN;QACJ,CAAC,CAAC;MACN;IACJ;EAAC;IAAA,GAAA;IAAA,KAAA,EAED,SAAO,aAAa,CAAC,SAAS,EAAE,UAAU,EAAE;MACxC,IAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC;MAC7D,IAAG,CAAC,cAAc,EACd;MAEJ,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;MACrC,cAAc,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,SAAS,GAAG,SAAS;IACrE;EAAC;IAAA,GAAA;IAAA,KAAA,EAED,SAAO,aAAa,CAAA,EAAG;MACnB,IAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC;MAC7D,IAAI,CAAC,cAAc,EACf;MAEJ,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;IACzC;EAAC;AAAA;;;ACjFL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.min.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i {\n const cartId = document.querySelector(\"#cartId\").value;\n const checkoutButton = document.querySelector(\"#checkout\");\n\n Handlebars.registerHelper('formatCurrency', function (value) {\n return formatCurrency(value);\n });\n\n //#region Add to Cart\n\n document.querySelectorAll(\"[data-add-to-cart]\").forEach(el => {\n el.addEventListener(\"click\", handleAddToCart);\n });\n\n document.querySelectorAll(\".variations\").forEach(el => {\n handleChangeVariation(el);\n el.addEventListener(\"change\", () => {handleChangeVariation(el)});\n });\n\n async function handleAddToCart(e) {\n e.preventDefault();\n\n const el = e.currentTarget;\n const container = el.closest(\".card-product\");\n const variationId = container.querySelector(\".variations\")?.value;\n const quantity = container.querySelector(\".quantity\")?.value ?? 1;\n const productId = el.dataset.productId;\n\n if(quantity <= 0)\n return;\n\n let values = {\n productId: productId,\n quantity: quantity,\n variationId: variationId\n };\n\n try {\n el.setAttribute(\"data-kt-indicator\", \"on\");\n\n const {data} = await api.put(`/api/cart/${cartId}`, values);\n\n updateCart(data);\n\n Notifications.showSuccess({ message: \"Item added to cart.\" });\n }\n catch(ex) {\n trackException(ex);\n\n if(ex.response.data.errors[0]){\n Notifications.alert.fire({ html: ex.response.data.errors[0] });\n } else {\n Notifications.showError({ message: \"There was a problem adding the item to your cart.\" })\n }\n\n } finally {\n el.removeAttribute(\"data-kt-indicator\");\n }\n };\n\n function handleChangeVariation(el) {\n const productContainer = el.closest(\".card-product\");\n const option = el.options[el.selectedIndex];\n const dialer = productContainer.querySelector(`[data-kt-dialer=\"true\"]`);\n const dialerObject = KTDialer.getInstance(dialer);\n const quantityInput = productContainer.querySelector(\".quantity\");\n\n const stock = option.getAttribute(\"data-variation-stock\");\n if(!stock || Number.isNaN(Number(stock))){\n dialerObject.setMaxValue(Number(9999));\n } else {\n if(quantityInput.value > stock)\n quantityInput.value = stock;\n\n dialerObject.setMaxValue(Number(stock));\n }\n }\n\n //#endregion\n\n document.addEventListener(\"click\", async (e) => {\n const target = e.target.closest(\"[data-delete-item]\")\n if (!target)\n return;\n\n e.preventDefault();\n\n const {isConfirmed} = await Notifications.confirm.fire({\n title: \"Remove Item?\",\n text: \"The item will be removed from your cart. This cannot be undone.\"\n });\n\n if (!isConfirmed)\n return;\n\n const itemId = target.dataset.itemId;\n\n try {\n const {data} = await api.delete(`/api/cart/${cartId}/${itemId}`);\n\n updateCart(data);\n Notifications.showSuccess({message: \"The item has been removed.\"});\n } catch (ex) {\n trackException(ex);\n Notifications.showError({message: \"There was a problem removing the item from your cart.\"})\n }\n });\n\n document.querySelector(\"#category\")?.addEventListener(\"change\", (e) => {\n document.getElementById(\"store_search\").submit();\n });\n\n checkoutButton?.addEventListener(\"click\", e => {\n Validation.disableButton(checkoutButton);\n });\n\n function updateCart(cart) {\n\n if (cart.products && cart.products.length > 0) {\n\n document.querySelector(\"#cart_items\").innerHTML = productTemplate(cart);\n document.querySelector(\"#cart_total\").innerHTML = formatCurrency(cart.total);\n\n checkoutButton.classList.remove(\"disabled\");\n checkoutButton.removeAttribute(\"disabled\");\n } else {\n document.querySelector(\"#cart_items\").innerHTML = noResultsTemplate();\n document.querySelector(\"#cart_total\").innerHTML = \"\";\n checkoutButton.classList.add(\"disabled\");\n checkoutButton.setAttribute(\"disabled\", \"disabled\");\n }\n }\n});\n\n\n//#region Templates\n\nconst noResultsTemplate = Handlebars.compile(\"
Your cart is empty.
\");\n\nconst productTemplate = Handlebars.compile(`\n {{#each products}}\n
\n
\n
{{name}}
\n
{{variationName}}
\n
{{quantity}} @ {{formatCurrency cost}}
\n
\n
\n \n
\n
\n {{/each}}\n`);\n\n//#endregion\n","import {LocalStorage} from \"./localStorage\";\nimport {requestVerificationToken} from \"./common\";\n\nexport const apiVersion = \"2023-02-21\";\n\nexport const api = axios.create({\n headers: {\n \"RequestVerificationToken\": requestVerificationToken,\n \"x-api-version\": apiVersion\n }\n});\n\nexport const authApi = axios.create({\n headers: {\n \"RequestVerificationToken\": requestVerificationToken,\n \"x-api-version\": apiVersion\n }\n});\n\nauthApi.interceptors.request.use(\n config => {\n const token = LocalStorage.getToken();\n if (token) {\n config.headers['Authorization'] = `Bearer ${token}`;\n }\n return config;\n },\n error => {\n Promise.reject(error)\n });\n\nauthApi.interceptors.response.use((response) => {\n return response\n },\n function (error) {\n const originalRequest = error.config;\n if (error.response.status === 401 && !originalRequest._retry) {\n\n originalRequest._retry = true;\n return axios.post('/api/token', new URLSearchParams({ grant_type: 'client_credentials' }), { headers: {\"x-api-version\": apiVersion}})\n .then(res => {\n if (res.status === 200 && res.data.access_token) {\n LocalStorage.setToken(res.data);\n originalRequest.headers.Authorization = `Bearer ${res.data.access_token}`;\n\n return axios(originalRequest);\n }\n });\n }\n return Promise.reject(error);\n });\n","export const requestVerificationToken = document.querySelector('input[name=\"__RequestVerificationToken\"]')?.value;\n\nexport function addCommas(value) {\n return value.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n}\n\nexport function sanitizeUrl(url) {\n return url.toLowerCase()\n .replace(/ /g, '-')\n .replace(/[^\\w-]+/g, '');\n}\n\nexport function truncateString(str, num) {\n if (str.length <= num) {\n return str;\n }\n return str.slice(0, num) + '...';\n}\n\nexport let pathAndQuery = location.pathname + location.search + location.hash;\n\nexport let returnUrlQueryString = `returnurl=${encodeURIComponent(pathAndQuery)}`;\n\nexport const archivedBadge = \"Archived\";\n\nexport const slideUp = (el, speed, callback) => {\n KTUtil.slideUp(el, speed ?? 250, callback);\n}\n\nexport const slideDown = (el, speed, callback) => {\n KTUtil.slideDown(el, speed ?? 250, callback);\n}\n\nexport const show = (el, display) => {\n if (typeof el !== 'undefined' && el) {\n el.style.display = (display ? display : 'block');\n }\n}\n\nexport const hide = (el) => {\n if (typeof el !== 'undefined' && el) {\n el.style.display = 'none';\n }\n}\n\nexport function createUUID() {\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n}\n\nexport function currentCulture() {\n return document.getElementById(\"currentCulture\")?.value ?? \"en-gb\";\n}\n\nexport function currentCurrency() {\n return document.getElementById(\"currentCurrency\")?.value ?? \"£\";\n}\n\nexport function getCurrencySymbol() {\n return (0).toLocaleString(currentCulture(), {\n style: 'currency',\n currency: currentCurrency(),\n minimumFractionDigits: 0,\n maximumFractionDigits: 0\n }).replace(/\\d/g, '').trim();\n}\n\nexport function formatCurrency(amount) {\n return new Intl.NumberFormat(currentCulture(), {\n style: \"currency\",\n currency: currentCurrency(),\n }).format(amount);\n}\n","export const trackException = (err) => {\n if (typeof appInsights !== 'undefined') {\n appInsights.trackException(err);\n } else {\n console.log(err);\n }\n}\n","// LocalStorageService.js\nexport class LocalStorage {\n\n static setToken(tokenObj) {\n localStorage.setItem(\"token\", tokenObj.access_token);\n localStorage.setItem(\"expires\", tokenObj.expires);\n }\n\n static getToken() {\n return localStorage.getItem(\"token\");\n }\n\n static clearToken() {\n localStorage.removeItem(\"token\");\n localStorage.removeItem(\"expiration\");\n }\n}\n","export class Notifications {\n\n static notificationCookieName = \".clubpal.toast\";\n static alertCookieName = \".clubpal.alert\";\n\n static init() {\n window.addEventListener('load', function () {\n\n const notificationCookie = Notifications.getCookie(Notifications.notificationCookieName);\n if (notificationCookie) {\n\n let values = Notifications.parseQuery(notificationCookie);\n if (values[\"message\"]) {\n showMessage({message: values[\"message\"], type: values[\"type\"]});\n\n Notifications.setCookie(Notifications.notificationCookieName, \"\", -1);\n }\n }\n\n const alertCookie = Notifications.getCookie(Notifications.alertCookieName);\n if (alertCookie) {\n\n let values = Notifications.parseQuery(alertCookie);\n if (values[\"message\"]) {\n Notifications.alert.fire({ title: values[\"title\"], html: values[\"message\"]});\n }\n Notifications.setCookie(Notifications.alertCookieName, \"\", -1);\n }\n });\n }\n\n static setNotificationCookie(title) {\n Notifications.setCookie(btoa(`message=${title}&type=success`), 1);\n }\n\n /**\n *\n * @param {object} options - Options\n * @param {string} options.message - The message for the notification\n * @param {string} [options.title] - An optional title for the notification\n * @param {number} [options.timeout] - The time in milliseconds to show the notification. Set to 0 to not auto-hide.\n */\n static showSuccess = (options) => {\n options.type = \"success\";\n\n showMessage(options);\n }\n\n /**\n *\n * @param {object} options - Options\n * @param {string} options.message - The message for the notification\n * @param {string} [options.title] - An optional title for the notification\n * @param {number} [options.timeout] - The time in milliseconds to show the notification. Set to 0 to not auto-hide.\n */\n static showError = (options) => {\n options.type = \"error\";\n\n showMessage(options);\n }\n\n /**\n *\n * @param {object} options - Options\n * @param {string} options.message - The message for the notification\n * @param {string} [options.title] - An optional title for the notification\n * @param {number} [options.timeout] - The time in milliseconds to show the notification. Set to 0 to not auto-hide.\n */\n static showWarning = (options) => {\n options.type = \"warning\";\n\n showMessage(options);\n }\n\n /**\n *\n * @param {object} options - Options\n * @param {string} options.message - The message for the notification\n * @param {string} [options.title] - An optional title for the notification\n * @param {number} [options.timeout] - The time in milliseconds to show the notification. Set to 0 to not auto-hide.\n */\n static showInfo = (options) => {\n options.type = \"warning\";\n\n showMessage(options);\n }\n\n static confirm = Swal?.mixin({\n showConfirmButton: true,\n showDenyButton: true,\n reverseButtons: true,\n customClass: {\n actions: \"d-flex justify-content-between w-100\",\n confirmButton: \"px-10 btn btn-primary d-flex align-items-center\",\n denyButton: \"px-10 btn btn-danger d-flex align-items-center\",\n input: ''\n },\n confirmButtonText: ' Yes',\n denyButtonText: ' No',\n });\n\n static alert = Swal.mixin({\n showConfirmButton: true,\n showDenyButton: false,\n reverseButtons: false,\n customClass: {\n actions: \"d-flex justify-content-center w-100\",\n confirmButton: \"px-10 btn btn-light-primary d-flex align-items-center\",\n input: ''\n },\n confirmButtonText: 'OK!'\n });\n\n static setCookie(cookieName, value, minutes) {\n let expires = \"\";\n if (minutes) {\n const date = new Date();\n date.setTime(date.getTime() + (minutes * 60 * 1000));\n expires = \"; expires=\" + date.toUTCString();\n }\n\n document.cookie = cookieName + \"=\" + (value || \"\") + expires + \"; path=/\";\n }\n\n static getCookie(cookieName) {\n let nameEQ = cookieName + \"=\";\n let ca = document.cookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) {\n let value = decodeURIComponent(c.substring(nameEQ.length, c.length));\n return atob(value);\n }\n }\n\n return null;\n }\n\n static parseQuery(queryString) {\n let query = {};\n let pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');\n for (let i = 0; i < pairs.length; i++) {\n let pair = pairs[i].split('=');\n query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');\n }\n return query;\n }\n}\n\nlet container;\n\nconst alertTemplate = Handlebars.compile(`\n
\n {{#if title}}\n
{{title}}
\n {{/if}}\n
\n
\n {{message}}\n
\n \n
\n
\n
\n`);\n\nconst ensureContainer = () => {\n if(container)\n return container;\n\n container = document.createElement(\"div\");\n container.id = \"snackbar\";\n\n document.body.appendChild(container);\n\n return container;\n};\n\n/**\n *\n * @param {object} options - Options\n * @param {string} options.message - The message for the notification\n * @param {(\"success\" | \"warning\" | \"error\" | \"info\")} options.type - The type of notification to display. Options are success, warning, error, info.\n * @param {string} [options.title] - An optional title for the notification\n * @param {number} [options.timeout] - The time in milliseconds to show the notification. Set to 0 to not auto-hide.\n */\n\nconst showMessage = (options) => {\n\n const timeout = options.timeout ?? 5000;\n\n const alert = document.createElement(\"div\");\n alert.innerHTML = alertTemplate(options);\n\n ensureContainer().appendChild(alert);\n alert.className = `snack ${options.type} show`;\n\n const closeButton = alert.querySelector(\"a.close\");\n closeButton.addEventListener(\"click\", (e) => {\n e.preventDefault();\n\n hideAlert();\n });\n\n if(timeout > 0) {\n setTimeout(hideAlert, timeout);\n }\n\n function hideAlert() {\n alert.remove();\n }\n};\n\n","export class Validation{\n static getDefaultValidator(form) {\n\n return FormValidation.formValidation(form, {\n plugins: {\n trigger: new FormValidation.plugins.Trigger(),\n bootstrap: new FormValidation.plugins.Bootstrap5({\n rowSelector: '.fv-row',\n eleInvalidClass: 'bg-light-danger is-invalid',\n eleValidClass: ''\n }),\n declarative: new FormValidation.plugins.Declarative({html5Input: true})\n }\n });\n }\n\n static disableButton(button) {\n button?.setAttribute(\"disabled\", \"disabled\");\n button?.setAttribute(\"data-kt-indicator\", \"on\");\n }\n\n static enableButton(button) {\n button?.removeAttribute(\"disabled\");\n button?.removeAttribute(\"data-kt-indicator\");\n }\n\n static validateForm(e, validator, submitter) {\n e.preventDefault();\n\n const form = validator.form;\n if (validator) {\n validator.validate().then(status => {\n if (status === 'Valid') {\n Validation.disableButton(submitter || e.submitter);\n form.submit();\n }\n });\n }\n }\n\n static validateFormWithReCaptcha(e, validator, submitter) {\n e.preventDefault();\n\n const form = validator.form;\n if (validator) {\n validator.validate().then(function (status) {\n if (status === 'Valid') {\n\n Validation.disableButton(submitter || e.submitter);\n\n const recaptchaInput = form.querySelector(\"#RecaptchaResponse\");\n const siteKey = recaptchaInput.dataset.siteKey;\n\n grecaptcha.ready(function () {\n const action = recaptchaInput.dataset.action;\n grecaptcha.execute(siteKey, {action: action}).then(function (token) {\n recaptchaInput.value = token;\n\n form.submit();\n });\n });\n }\n });\n }\n }\n\n static showFormError(errorText, errorTitle) {\n const errorContainer = document.querySelector(\"#error-alert\");\n if(!errorContainer)\n return;\n\n errorContainer.style.display = \"flex\";\n errorContainer.querySelector(\".alert-text\").innerHTML = errorText;\n }\n\n static hideFormError() {\n const errorContainer = document.querySelector(\"#error-alert\");\n if (!errorContainer)\n return;\n\n errorContainer.style.display = \"none\";\n }\n}\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\n\nmodule.exports = _asyncToGenerator;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nmodule.exports = _defineProperty;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\n\nmodule.exports = _interopRequireDefault;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","module.exports = require(\"regenerator-runtime\");\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = GeneratorFunctionPrototype;\n define(Gp, \"constructor\", GeneratorFunctionPrototype);\n define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction);\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, \"toString\", function() {\n return \"[object Generator]\";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJTY3JpcHRzL3BhZ2VzL3N0b3JlL2luZGV4LmpzIiwiU2NyaXB0cy9zcmMvYXBpLmpzIiwiU2NyaXB0cy9zcmMvY29tbW9uLmpzIiwiU2NyaXB0cy9zcmMvZXJyb3JzLmpzIiwiU2NyaXB0cy9zcmMvbG9jYWxTdG9yYWdlLmpzIiwiU2NyaXB0cy9zcmMvbm90aWZpY2F0aW9ucy5qcyIsIlNjcmlwdHMvc3JjL3ZhbGlkYXRpb24uanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2suanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0FDQUEsSUFBQSxJQUFBLEdBQUEsT0FBQTtBQUNBLElBQUEsY0FBQSxHQUFBLE9BQUE7QUFDQSxJQUFBLFdBQUEsR0FBQSxPQUFBO0FBQ0EsSUFBQSxPQUFBLEdBQUEsT0FBQTtBQUNBLElBQUEsT0FBQSxHQUFBLE9BQUE7QUFFQSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsWUFBTTtFQUFBLElBQUEscUJBQUE7RUFDaEQsSUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFT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QyxhQUFhLENBQUMsY0FBYyxDQUFDO01BQzdELElBQUksQ0FBQyxjQUFjLEVBQ2Y7TUFFSixjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNO0lBQ3pDO0VBQUM7QUFBQTs7O0FDakZMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsImltcG9ydCB7YXBpfSBmcm9tIFwiLi4vLi4vc3JjL2FwaVwiO1xuaW1wb3J0IHtOb3RpZmljYXRpb25zfSBmcm9tIFwiLi4vLi4vc3JjL25vdGlmaWNhdGlvbnNcIjtcbmltcG9ydCB7VmFsaWRhdGlvbn0gZnJvbSBcIi4uLy4uL3NyYy92YWxpZGF0aW9uXCI7XG5pbXBvcnQge3RyYWNrRXhjZXB0aW9ufSBmcm9tIFwiLi4vLi4vc3JjL2Vycm9yc1wiO1xuaW1wb3J0IHtmb3JtYXRDdXJyZW5jeX0gZnJvbSBcIi4uLy4uL3NyYy9jb21tb25cIjtcblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNhcnRJZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjY2FydElkXCIpLnZhbHVlO1xuICAgIGNvbnN0IGNoZWNrb3V0QnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNjaGVja291dFwiKTtcblxuICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2Zvcm1hdEN1cnJlbmN5JywgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXRDdXJyZW5jeSh2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyNyZWdpb24gQWRkIHRvIENhcnRcblxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1hZGQtdG8tY2FydF1cIikuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVBZGRUb0NhcnQpO1xuICAgIH0pO1xuXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi52YXJpYXRpb25zXCIpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICBoYW5kbGVDaGFuZ2VWYXJpYXRpb24oZWwpO1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsICgpID0+IHtoYW5kbGVDaGFuZ2VWYXJpYXRpb24oZWwpfSk7XG4gICAgfSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVBZGRUb0NhcnQoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3QgZWwgPSBlLmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsLmNsb3Nlc3QoXCIuY2FyZC1wcm9kdWN0XCIpO1xuICAgICAgICBjb25zdCB2YXJpYXRpb25JZCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiLnZhcmlhdGlvbnNcIik/LnZhbHVlO1xuICAgICAgICBjb25zdCBxdWFudGl0eSA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiLnF1YW50aXR5XCIpPy52YWx1ZSA/PyAxO1xuICAgICAgICBjb25zdCBwcm9kdWN0SWQgPSBlbC5kYXRhc2V0LnByb2R1Y3RJZDtcblxuICAgICAgICBpZihxdWFudGl0eSA8PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCB2YWx1ZXMgPSB7XG4gICAgICAgICAgICBwcm9kdWN0SWQ6IHByb2R1Y3RJZCxcbiAgICAgICAgICAgIHF1YW50aXR5OiBxdWFudGl0eSxcbiAgICAgICAgICAgIHZhcmlhdGlvbklkOiB2YXJpYXRpb25JZFxuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWt0LWluZGljYXRvclwiLCBcIm9uXCIpO1xuXG4gICAgICAgICAgICBjb25zdCB7ZGF0YX0gPSBhd2FpdCBhcGkucHV0KGAvYXBpL2NhcnQvJHtjYXJ0SWR9YCwgdmFsdWVzKTtcblxuICAgICAgICAgICAgdXBkYXRlQ2FydChkYXRhKTtcblxuICAgICAgICAgICAgTm90aWZpY2F0aW9ucy5zaG93U3VjY2Vzcyh7IG1lc3NhZ2U6IFwiSXRlbSBhZGRlZCB0byBjYXJ0LlwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGV4KSB7XG4gICAgICAgICAgICB0cmFja0V4Y2VwdGlvbihleCk7XG5cbiAgICAgICAgICAgIGlmKGV4LnJlc3BvbnNlLmRhdGEuZXJyb3JzWzBdKXtcbiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25zLmFsZXJ0LmZpcmUoeyBodG1sOiBleC5yZXNwb25zZS5kYXRhLmVycm9yc1swXSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9ucy5zaG93RXJyb3IoeyBtZXNzYWdlOiBcIlRoZXJlIHdhcyBhIHByb2JsZW0gYWRkaW5nIHRoZSBpdGVtIHRvIHlvdXIgY2FydC5cIiB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLWt0LWluZGljYXRvclwiKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVDaGFuZ2VWYXJpYXRpb24oZWwpIHtcbiAgICAgICAgY29uc3QgcHJvZHVjdENvbnRhaW5lciA9IGVsLmNsb3Nlc3QoXCIuY2FyZC1wcm9kdWN0XCIpO1xuICAgICAgICBjb25zdCBvcHRpb24gPSBlbC5vcHRpb25zW2VsLnNlbGVjdGVkSW5kZXhdO1xuICAgICAgICBjb25zdCBkaWFsZXIgPSBwcm9kdWN0Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWt0LWRpYWxlcj1cInRydWVcIl1gKTtcbiAgICAgICAgY29uc3QgZGlhbGVyT2JqZWN0ID0gS1REaWFsZXIuZ2V0SW5zdGFuY2UoZGlhbGVyKTtcbiAgICAgICAgY29uc3QgcXVhbnRpdHlJbnB1dCA9IHByb2R1Y3RDb250YWluZXIucXVlcnlTZWxlY3RvcihcIi5xdWFudGl0eVwiKTtcblxuICAgICAgICBjb25zdCBzdG9jayA9IG9wdGlvbi5nZXRBdHRyaWJ1dGUoXCJkYXRhLXZhcmlhdGlvbi1zdG9ja1wiKTtcbiAgICAgICAgaWYoIXN0b2NrIHx8IE51bWJlci5pc05hTihOdW1iZXIoc3RvY2spKSl7XG4gICAgICAgICAgICBkaWFsZXJPYmplY3Quc2V0TWF4VmFsdWUoTnVtYmVyKDk5OTkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmKHF1YW50aXR5SW5wdXQudmFsdWUgPiBzdG9jaylcbiAgICAgICAgICAgICAgICBxdWFudGl0eUlucHV0LnZhbHVlID0gc3RvY2s7XG5cbiAgICAgICAgICAgIGRpYWxlck9iamVjdC5zZXRNYXhWYWx1ZShOdW1iZXIoc3RvY2spKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGFzeW5jIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0LmNsb3Nlc3QoXCJbZGF0YS1kZWxldGUtaXRlbV1cIilcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IHtpc0NvbmZpcm1lZH0gPSBhd2FpdCBOb3RpZmljYXRpb25zLmNvbmZpcm0uZmlyZSh7XG4gICAgICAgICAgICB0aXRsZTogXCJSZW1vdmUgSXRlbT9cIixcbiAgICAgICAgICAgIHRleHQ6IFwiVGhlIGl0ZW0gd2lsbCBiZSByZW1vdmVkIGZyb20geW91ciBjYXJ0LiBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuXCJcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFpc0NvbmZpcm1lZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBpdGVtSWQgPSB0YXJnZXQuZGF0YXNldC5pdGVtSWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHtkYXRhfSA9IGF3YWl0IGFwaS5kZWxldGUoYC9hcGkvY2FydC8ke2NhcnRJZH0vJHtpdGVtSWR9YCk7XG5cbiAgICAgICAgICAgIHVwZGF0ZUNhcnQoZGF0YSk7XG4gICAgICAgICAgICBOb3RpZmljYXRpb25zLnNob3dTdWNjZXNzKHttZXNzYWdlOiBcIlRoZSBpdGVtIGhhcyBiZWVuIHJlbW92ZWQuXCJ9KTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIHRyYWNrRXhjZXB0aW9uKGV4KTtcbiAgICAgICAgICAgIE5vdGlmaWNhdGlvbnMuc2hvd0Vycm9yKHttZXNzYWdlOiBcIlRoZXJlIHdhcyBhIHByb2JsZW0gcmVtb3ZpbmcgdGhlIGl0ZW0gZnJvbSB5b3VyIGNhcnQuXCJ9KVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2NhdGVnb3J5XCIpPy5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIChlKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3RvcmVfc2VhcmNoXCIpLnN1Ym1pdCgpO1xuICAgIH0pO1xuXG4gICAgY2hlY2tvdXRCdXR0b24/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBlID0+IHtcbiAgICAgICAgVmFsaWRhdGlvbi5kaXNhYmxlQnV0dG9uKGNoZWNrb3V0QnV0dG9uKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHVwZGF0ZUNhcnQoY2FydCkge1xuXG4gICAgICAgIGlmIChjYXJ0LnByb2R1Y3RzICYmIGNhcnQucHJvZHVjdHMubGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2NhcnRfaXRlbXNcIikuaW5uZXJIVE1MID0gcHJvZHVjdFRlbXBsYXRlKGNhcnQpO1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNjYXJ0X3RvdGFsXCIpLmlubmVySFRNTCA9IGZvcm1hdEN1cnJlbmN5KGNhcnQudG90YWwpO1xuXG4gICAgICAgICAgICBjaGVja291dEJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICBjaGVja291dEJ1dHRvbi5yZW1vdmVBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjY2FydF9pdGVtc1wiKS5pbm5lckhUTUwgPSBub1Jlc3VsdHNUZW1wbGF0ZSgpO1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNjYXJ0X3RvdGFsXCIpLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgICAgICBjaGVja291dEJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICBjaGVja291dEJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cblxuLy8jcmVnaW9uIFRlbXBsYXRlc1xuXG5jb25zdCBub1Jlc3VsdHNUZW1wbGF0ZSA9IEhhbmRsZWJhcnMuY29tcGlsZShcIjxkaXY+WW91ciBjYXJ0IGlzIGVtcHR5LjwvZGl2PlwiKTtcblxuY29uc3QgcHJvZHVjdFRlbXBsYXRlID0gSGFuZGxlYmFycy5jb21waWxlKGBcbiAgICB7eyNlYWNoIHByb2R1Y3RzfX1cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItNSBib3JkZXItYm90dG9tIGJvcmRlci1ib3R0b20tbGlnaHQtZGFyayBwYi01XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cbiAgICAgICAgICAgICAgICA8aDY+e3tuYW1lfX08L2g2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+e3t2YXJpYXRpb25OYW1lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2Pnt7cXVhbnRpdHl9fSBAIHt7Zm9ybWF0Q3VycmVuY3kgY29zdH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCI+XG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cIlwiIGRhdGEtZGVsZXRlLWl0ZW0gZGF0YS1pdGVtLWlkPVwie3tpZH19XCIgY2xhc3M9XCJ0ZXh0LWRhcmstNTAgdGV4dC1ob3Zlci1wcmltYXJ5XCI+PHNwYW4gY2xhc3M9XCJiaSBiaS10cmFzaCB0ZXh0LWRhbmdlciBmcy0yXCI+PC9zcGFuPjwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICB7ey9lYWNofX1cbmApO1xuXG4vLyNlbmRyZWdpb25cbiIsImltcG9ydCB7TG9jYWxTdG9yYWdlfSBmcm9tIFwiLi9sb2NhbFN0b3JhZ2VcIjtcbmltcG9ydCB7cmVxdWVzdFZlcmlmaWNhdGlvblRva2VufSBmcm9tIFwiLi9jb21tb25cIjtcblxuZXhwb3J0IGNvbnN0IGFwaVZlcnNpb24gPSBcIjIwMjMtMDItMjFcIjtcblxuZXhwb3J0IGNvbnN0IGFwaSA9IGF4aW9zLmNyZWF0ZSh7XG4gICAgaGVhZGVyczoge1xuICAgICAgICBcIlJlcXVlc3RWZXJpZmljYXRpb25Ub2tlblwiOiByZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW4sXG4gICAgICAgIFwieC1hcGktdmVyc2lvblwiOiBhcGlWZXJzaW9uXG4gICAgfVxufSk7XG5cbmV4cG9ydCBjb25zdCBhdXRoQXBpID0gYXhpb3MuY3JlYXRlKHtcbiAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuXCI6IHJlcXVlc3RWZXJpZmljYXRpb25Ub2tlbixcbiAgICAgICAgXCJ4LWFwaS12ZXJzaW9uXCI6IGFwaVZlcnNpb25cbiAgICB9XG59KTtcblxuYXV0aEFwaS5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoXG4gICAgY29uZmlnID0+IHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBMb2NhbFN0b3JhZ2UuZ2V0VG9rZW4oKTtcbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICBjb25maWcuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke3Rva2VufWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9LFxuICAgIGVycm9yID0+IHtcbiAgICAgICAgUHJvbWlzZS5yZWplY3QoZXJyb3IpXG4gICAgfSk7XG5cbmF1dGhBcGkuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgfSxcbiAgICBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZXF1ZXN0ID0gZXJyb3IuY29uZmlnO1xuICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgJiYgIW9yaWdpbmFsUmVxdWVzdC5fcmV0cnkpIHtcblxuICAgICAgICAgICAgb3JpZ2luYWxSZXF1ZXN0Ll9yZXRyeSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gYXhpb3MucG9zdCgnL2FwaS90b2tlbicsIG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBncmFudF90eXBlOiAnY2xpZW50X2NyZWRlbnRpYWxzJyB9KSwgeyBoZWFkZXJzOiB7XCJ4LWFwaS12ZXJzaW9uXCI6IGFwaVZlcnNpb259fSlcbiAgICAgICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjAwICYmIHJlcy5kYXRhLmFjY2Vzc190b2tlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxTdG9yYWdlLnNldFRva2VuKHJlcy5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsUmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb24gPSBgQmVhcmVyICR7cmVzLmRhdGEuYWNjZXNzX3Rva2VufWA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBheGlvcyhvcmlnaW5hbFJlcXVlc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9KTtcbiIsImV4cG9ydCBjb25zdCByZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiX19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW5cIl0nKT8udmFsdWU7XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRDb21tYXModmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVVcmwodXJsKSB7XG4gICAgcmV0dXJuIHVybC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC5yZXBsYWNlKC8gL2csICctJylcbiAgICAgICAgLnJlcGxhY2UoL1teXFx3LV0rL2csICcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlU3RyaW5nKHN0ciwgbnVtKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPD0gbnVtKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHJldHVybiBzdHIuc2xpY2UoMCwgbnVtKSArICcuLi4nO1xufVxuXG5leHBvcnQgbGV0IHBhdGhBbmRRdWVyeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoICsgbG9jYXRpb24uaGFzaDtcblxuZXhwb3J0IGxldCByZXR1cm5VcmxRdWVyeVN0cmluZyA9IGByZXR1cm51cmw9JHtlbmNvZGVVUklDb21wb25lbnQocGF0aEFuZFF1ZXJ5KX1gO1xuXG5leHBvcnQgY29uc3QgYXJjaGl2ZWRCYWRnZSA9IFwiPHNwYW4gY2xhc3M9XFxcImJhZGdlIGJhZGdlLWxpZ2h0LXByaW1hcnlcXFwiPkFyY2hpdmVkPC9zcGFuPlwiO1xuXG5leHBvcnQgY29uc3Qgc2xpZGVVcCA9IChlbCwgc3BlZWQsIGNhbGxiYWNrKSA9PiB7XG4gICAgS1RVdGlsLnNsaWRlVXAoZWwsIHNwZWVkID8/IDI1MCwgY2FsbGJhY2spO1xufVxuXG5leHBvcnQgY29uc3Qgc2xpZGVEb3duID0gKGVsLCBzcGVlZCwgY2FsbGJhY2spID0+IHtcbiAgICBLVFV0aWwuc2xpZGVEb3duKGVsLCBzcGVlZCA/PyAyNTAsIGNhbGxiYWNrKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNob3cgPSAoZWwsIGRpc3BsYXkpID0+IHtcbiAgICBpZiAodHlwZW9mIGVsICE9PSAndW5kZWZpbmVkJyAmJiBlbCkge1xuICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gKGRpc3BsYXkgPyBkaXNwbGF5IDogJ2Jsb2NrJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgaGlkZSA9IChlbCkgPT4ge1xuICAgIGlmICh0eXBlb2YgZWwgIT09ICd1bmRlZmluZWQnICYmIGVsKSB7XG4gICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVVVJRCgpIHtcbiAgICByZXR1cm4gJ3h4eHh4eHh4eHh4eDR4eHh5eHh4eHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGNvbnN0IHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3VycmVudEN1bHR1cmUoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY3VycmVudEN1bHR1cmVcIik/LnZhbHVlID8/IFwiZW4tZ2JcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRDdXJyZW5jeSgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjdXJyZW50Q3VycmVuY3lcIik/LnZhbHVlID8/IFwiwqNcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbmN5U3ltYm9sKCkge1xuICAgIHJldHVybiAoMCkudG9Mb2NhbGVTdHJpbmcoY3VycmVudEN1bHR1cmUoKSwge1xuICAgICAgICBzdHlsZTogJ2N1cnJlbmN5JyxcbiAgICAgICAgY3VycmVuY3k6IGN1cnJlbnRDdXJyZW5jeSgpLFxuICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDAsXG4gICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogMFxuICAgIH0pLnJlcGxhY2UoL1xcZC9nLCAnJykudHJpbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Q3VycmVuY3koYW1vdW50KSB7XG4gICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdChjdXJyZW50Q3VsdHVyZSgpLCB7XG4gICAgICAgIHN0eWxlOiBcImN1cnJlbmN5XCIsXG4gICAgICAgIGN1cnJlbmN5OiBjdXJyZW50Q3VycmVuY3koKSxcbiAgICB9KS5mb3JtYXQoYW1vdW50KTtcbn1cbiIsImV4cG9ydCBjb25zdCB0cmFja0V4Y2VwdGlvbiA9IChlcnIpID0+IHtcbiAgICBpZiAodHlwZW9mIGFwcEluc2lnaHRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBhcHBJbnNpZ2h0cy50cmFja0V4Y2VwdGlvbihlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgfVxufVxuIiwiLy8gTG9jYWxTdG9yYWdlU2VydmljZS5qc1xuZXhwb3J0IGNsYXNzIExvY2FsU3RvcmFnZSB7XG5cbiAgICBzdGF0aWMgc2V0VG9rZW4odG9rZW5PYmopIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJ0b2tlblwiLCB0b2tlbk9iai5hY2Nlc3NfdG9rZW4pO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImV4cGlyZXNcIiwgdG9rZW5PYmouZXhwaXJlcyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFRva2VuKCkge1xuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ0b2tlblwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2xlYXJUb2tlbigpIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJ0b2tlblwiKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJleHBpcmF0aW9uXCIpO1xuICAgIH1cbn1cbiIsIu+7v2V4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25zIHtcblxuICAgIHN0YXRpYyBub3RpZmljYXRpb25Db29raWVOYW1lID0gXCIuY2x1YnBhbC50b2FzdFwiO1xuICAgIHN0YXRpYyBhbGVydENvb2tpZU5hbWUgPSBcIi5jbHVicGFsLmFsZXJ0XCI7XG5cbiAgICBzdGF0aWMgaW5pdCgpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbkNvb2tpZSA9IE5vdGlmaWNhdGlvbnMuZ2V0Q29va2llKE5vdGlmaWNhdGlvbnMubm90aWZpY2F0aW9uQ29va2llTmFtZSk7XG4gICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uQ29va2llKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gTm90aWZpY2F0aW9ucy5wYXJzZVF1ZXJ5KG5vdGlmaWNhdGlvbkNvb2tpZSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlc1tcIm1lc3NhZ2VcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2Uoe21lc3NhZ2U6IHZhbHVlc1tcIm1lc3NhZ2VcIl0sIHR5cGU6IHZhbHVlc1tcInR5cGVcIl19KTtcblxuICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25zLnNldENvb2tpZShOb3RpZmljYXRpb25zLm5vdGlmaWNhdGlvbkNvb2tpZU5hbWUsIFwiXCIsIC0xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGFsZXJ0Q29va2llID0gTm90aWZpY2F0aW9ucy5nZXRDb29raWUoTm90aWZpY2F0aW9ucy5hbGVydENvb2tpZU5hbWUpO1xuICAgICAgICAgICAgaWYgKGFsZXJ0Q29va2llKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gTm90aWZpY2F0aW9ucy5wYXJzZVF1ZXJ5KGFsZXJ0Q29va2llKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVzW1wibWVzc2FnZVwiXSkge1xuICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25zLmFsZXJ0LmZpcmUoeyB0aXRsZTogdmFsdWVzW1widGl0bGVcIl0sIGh0bWw6IHZhbHVlc1tcIm1lc3NhZ2VcIl19KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9ucy5zZXRDb29raWUoTm90aWZpY2F0aW9ucy5hbGVydENvb2tpZU5hbWUsIFwiXCIsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHNldE5vdGlmaWNhdGlvbkNvb2tpZSh0aXRsZSkge1xuICAgICAgICBOb3RpZmljYXRpb25zLnNldENvb2tpZShidG9hKGBtZXNzYWdlPSR7dGl0bGV9JnR5cGU9c3VjY2Vzc2ApLCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9uc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm1lc3NhZ2UgLSBUaGUgbWVzc2FnZSBmb3IgdGhlIG5vdGlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy50aXRsZV0gLSBBbiBvcHRpb25hbCB0aXRsZSBmb3IgdGhlIG5vdGlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy50aW1lb3V0XSAtIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBzaG93IHRoZSBub3RpZmljYXRpb24uIFNldCB0byAwIHRvIG5vdCBhdXRvLWhpZGUuXG4gICAgICovXG4gICAgc3RhdGljIHNob3dTdWNjZXNzID0gKG9wdGlvbnMpID0+IHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gXCJzdWNjZXNzXCI7XG5cbiAgICAgICAgc2hvd01lc3NhZ2Uob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5tZXNzYWdlIC0gVGhlIG1lc3NhZ2UgZm9yIHRoZSBub3RpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudGl0bGVdIC0gQW4gb3B0aW9uYWwgdGl0bGUgZm9yIHRoZSBub3RpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGltZW91dF0gLSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gc2hvdyB0aGUgbm90aWZpY2F0aW9uLiBTZXQgdG8gMCB0byBub3QgYXV0by1oaWRlLlxuICAgICAqL1xuICAgIHN0YXRpYyBzaG93RXJyb3IgPSAob3B0aW9ucykgPT4ge1xuICAgICAgICBvcHRpb25zLnR5cGUgPSBcImVycm9yXCI7XG5cbiAgICAgICAgc2hvd01lc3NhZ2Uob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5tZXNzYWdlIC0gVGhlIG1lc3NhZ2UgZm9yIHRoZSBub3RpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudGl0bGVdIC0gQW4gb3B0aW9uYWwgdGl0bGUgZm9yIHRoZSBub3RpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGltZW91dF0gLSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gc2hvdyB0aGUgbm90aWZpY2F0aW9uLiBTZXQgdG8gMCB0byBub3QgYXV0by1oaWRlLlxuICAgICAqL1xuICAgIHN0YXRpYyBzaG93V2FybmluZyA9IChvcHRpb25zKSA9PiB7XG4gICAgICAgIG9wdGlvbnMudHlwZSA9IFwid2FybmluZ1wiO1xuXG4gICAgICAgIHNob3dNZXNzYWdlKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubWVzc2FnZSAtIFRoZSBtZXNzYWdlIGZvciB0aGUgbm90aWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnRpdGxlXSAtIEFuIG9wdGlvbmFsIHRpdGxlIGZvciB0aGUgbm90aWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnRpbWVvdXRdIC0gVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHNob3cgdGhlIG5vdGlmaWNhdGlvbi4gU2V0IHRvIDAgdG8gbm90IGF1dG8taGlkZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgc2hvd0luZm8gPSAob3B0aW9ucykgPT4ge1xuICAgICAgICBvcHRpb25zLnR5cGUgPSBcIndhcm5pbmdcIjtcblxuICAgICAgICBzaG93TWVzc2FnZShvcHRpb25zKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29uZmlybSA9IFN3YWw/Lm1peGluKHtcbiAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IHRydWUsXG4gICAgICAgIHNob3dEZW55QnV0dG9uOiB0cnVlLFxuICAgICAgICByZXZlcnNlQnV0dG9uczogdHJ1ZSxcbiAgICAgICAgY3VzdG9tQ2xhc3M6IHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHctMTAwXCIsXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uOiBcInB4LTEwIGJ0biBidG4tcHJpbWFyeSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIsXG4gICAgICAgICAgICBkZW55QnV0dG9uOiBcInB4LTEwIGJ0biBidG4tZGFuZ2VyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIixcbiAgICAgICAgICAgIGlucHV0OiAnJ1xuICAgICAgICB9LFxuICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJzxpIGNsYXNzPVwiYmkgYmktY2hlY2stY2lyY2xlIGZzLTNcIj48L2k+IFllcycsXG4gICAgICAgIGRlbnlCdXR0b25UZXh0OiAnPGkgY2xhc3M9XCJiaSBiaS14LWNpcmNsZSBmcy0zXCI+PC9pPiBObycsXG4gICAgfSk7XG5cbiAgICBzdGF0aWMgYWxlcnQgPSBTd2FsLm1peGluKHtcbiAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IHRydWUsXG4gICAgICAgIHNob3dEZW55QnV0dG9uOiBmYWxzZSxcbiAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IGZhbHNlLFxuICAgICAgICBjdXN0b21DbGFzczoge1xuICAgICAgICAgICAgYWN0aW9uczogXCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciB3LTEwMFwiLFxuICAgICAgICAgICAgY29uZmlybUJ1dHRvbjogXCJweC0xMCBidG4gYnRuLWxpZ2h0LXByaW1hcnkgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiLFxuICAgICAgICAgICAgaW5wdXQ6ICcnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAnT0shJ1xuICAgIH0pO1xuXG4gICAgc3RhdGljIHNldENvb2tpZShjb29raWVOYW1lLCB2YWx1ZSwgbWludXRlcykge1xuICAgICAgICBsZXQgZXhwaXJlcyA9IFwiXCI7XG4gICAgICAgIGlmIChtaW51dGVzKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIChtaW51dGVzICogNjAgKiAxMDAwKSk7XG4gICAgICAgICAgICBleHBpcmVzID0gXCI7IGV4cGlyZXM9XCIgKyBkYXRlLnRvVVRDU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWVOYW1lICsgXCI9XCIgKyAodmFsdWUgfHwgXCJcIikgKyBleHBpcmVzICsgXCI7IHBhdGg9L1wiO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRDb29raWUoY29va2llTmFtZSkge1xuICAgICAgICBsZXQgbmFtZUVRID0gY29va2llTmFtZSArIFwiPVwiO1xuICAgICAgICBsZXQgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGMgPSBjYVtpXTtcbiAgICAgICAgICAgIHdoaWxlIChjLmNoYXJBdCgwKSA9PT0gJyAnKSBjID0gYy5zdWJzdHJpbmcoMSwgYy5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKGMuaW5kZXhPZihuYW1lRVEpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF0b2IodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlUXVlcnkocXVlcnlTdHJpbmcpIHtcbiAgICAgICAgbGV0IHF1ZXJ5ID0ge307XG4gICAgICAgIGxldCBwYWlycyA9IChxdWVyeVN0cmluZ1swXSA9PT0gJz8nID8gcXVlcnlTdHJpbmcuc3Vic3RyKDEpIDogcXVlcnlTdHJpbmcpLnNwbGl0KCcmJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwYWlyID0gcGFpcnNbaV0uc3BsaXQoJz0nKTtcbiAgICAgICAgICAgIHF1ZXJ5W2RlY29kZVVSSUNvbXBvbmVudChwYWlyWzBdKV0gPSBkZWNvZGVVUklDb21wb25lbnQocGFpclsxXSB8fCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgIH1cbn1cblxubGV0IGNvbnRhaW5lcjtcblxuY29uc3QgYWxlcnRUZW1wbGF0ZSA9IEhhbmRsZWJhcnMuY29tcGlsZShgXG4gICAgPGRpdj5cbiAgICAgICAge3sjaWYgdGl0bGV9fVxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtNSBmdy1ib2xkIG1iLTJcIj57e3RpdGxlfX08L2Rpdj5cbiAgICAgICAge3svaWZ9fVxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBmcy02XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cbiAgICAgICAgICAgICAgICB7e21lc3NhZ2V9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YSBjbGFzcz1cImNsb3NlXCIgaHJlZj1cIiNcIj48aSBjbGFzcz1cImJpLXggZnMtMnggdGV4dC1ncmF5LTUwMFwiPjwvaT48L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyLWNvbnRhaW5lclwiPjxkaXYgY2xhc3M9XCJ0aW1lci1wcm9ncmVzcy1iYXIgdy01MFwiPC9kaXY+XG4gICAgPC9kaXY+XG5gKTtcblxuY29uc3QgZW5zdXJlQ29udGFpbmVyID0gKCkgPT4ge1xuICAgIGlmKGNvbnRhaW5lcilcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcblxuICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmlkID0gXCJzbmFja2JhclwiO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuXG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubWVzc2FnZSAtIFRoZSBtZXNzYWdlIGZvciB0aGUgbm90aWZpY2F0aW9uXG4gKiBAcGFyYW0geyhcInN1Y2Nlc3NcIiB8IFwid2FybmluZ1wiIHwgXCJlcnJvclwiIHwgXCJpbmZvXCIpfSBvcHRpb25zLnR5cGUgLSBUaGUgdHlwZSBvZiBub3RpZmljYXRpb24gdG8gZGlzcGxheS4gT3B0aW9ucyBhcmUgc3VjY2Vzcywgd2FybmluZywgZXJyb3IsIGluZm8uXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudGl0bGVdIC0gQW4gb3B0aW9uYWwgdGl0bGUgZm9yIHRoZSBub3RpZmljYXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy50aW1lb3V0XSAtIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBzaG93IHRoZSBub3RpZmljYXRpb24uIFNldCB0byAwIHRvIG5vdCBhdXRvLWhpZGUuXG4gKi9cblxuY29uc3Qgc2hvd01lc3NhZ2UgPSAob3B0aW9ucykgPT4ge1xuXG4gICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnMudGltZW91dCA/PyA1MDAwO1xuXG4gICAgY29uc3QgYWxlcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGFsZXJ0LmlubmVySFRNTCA9IGFsZXJ0VGVtcGxhdGUob3B0aW9ucyk7XG5cbiAgICBlbnN1cmVDb250YWluZXIoKS5hcHBlbmRDaGlsZChhbGVydCk7XG4gICAgYWxlcnQuY2xhc3NOYW1lID0gYHNuYWNrICR7b3B0aW9ucy50eXBlfSBzaG93YDtcblxuICAgIGNvbnN0IGNsb3NlQnV0dG9uID0gYWxlcnQucXVlcnlTZWxlY3RvcihcImEuY2xvc2VcIik7XG4gICAgY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBoaWRlQWxlcnQoKTtcbiAgICB9KTtcblxuICAgIGlmKHRpbWVvdXQgPiAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoaGlkZUFsZXJ0LCB0aW1lb3V0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoaWRlQWxlcnQoKSB7XG4gICAgICAgIGFsZXJ0LnJlbW92ZSgpO1xuICAgIH1cbn07XG5cbiIsImV4cG9ydCBjbGFzcyBWYWxpZGF0aW9ue1xuICAgIHN0YXRpYyBnZXREZWZhdWx0VmFsaWRhdG9yKGZvcm0pIHtcblxuICAgICAgICByZXR1cm4gRm9ybVZhbGlkYXRpb24uZm9ybVZhbGlkYXRpb24oZm9ybSwge1xuICAgICAgICAgICAgcGx1Z2luczoge1xuICAgICAgICAgICAgICAgIHRyaWdnZXI6IG5ldyBGb3JtVmFsaWRhdGlvbi5wbHVnaW5zLlRyaWdnZXIoKSxcbiAgICAgICAgICAgICAgICBib290c3RyYXA6IG5ldyBGb3JtVmFsaWRhdGlvbi5wbHVnaW5zLkJvb3RzdHJhcDUoe1xuICAgICAgICAgICAgICAgICAgICByb3dTZWxlY3RvcjogJy5mdi1yb3cnLFxuICAgICAgICAgICAgICAgICAgICBlbGVJbnZhbGlkQ2xhc3M6ICdiZy1saWdodC1kYW5nZXIgaXMtaW52YWxpZCcsXG4gICAgICAgICAgICAgICAgICAgIGVsZVZhbGlkQ2xhc3M6ICcnXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpdmU6IG5ldyBGb3JtVmFsaWRhdGlvbi5wbHVnaW5zLkRlY2xhcmF0aXZlKHtodG1sNUlucHV0OiB0cnVlfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGRpc2FibGVCdXR0b24oYnV0dG9uKSB7XG4gICAgICAgIGJ1dHRvbj8uc2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgYnV0dG9uPy5zZXRBdHRyaWJ1dGUoXCJkYXRhLWt0LWluZGljYXRvclwiLCBcIm9uXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBlbmFibGVCdXR0b24oYnV0dG9uKSB7XG4gICAgICAgIGJ1dHRvbj8ucmVtb3ZlQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIGJ1dHRvbj8ucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1rdC1pbmRpY2F0b3JcIik7XG4gICAgfVxuXG4gICAgc3RhdGljIHZhbGlkYXRlRm9ybShlLCB2YWxpZGF0b3IsIHN1Ym1pdHRlcikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3QgZm9ybSA9IHZhbGlkYXRvci5mb3JtO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUoKS50aGVuKHN0YXR1cyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ1ZhbGlkJykge1xuICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uLmRpc2FibGVCdXR0b24oc3VibWl0dGVyIHx8IGUuc3VibWl0dGVyKTtcbiAgICAgICAgICAgICAgICAgICAgZm9ybS5zdWJtaXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB2YWxpZGF0ZUZvcm1XaXRoUmVDYXB0Y2hhKGUsIHZhbGlkYXRvciwgc3VibWl0dGVyKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBmb3JtID0gdmFsaWRhdG9yLmZvcm07XG4gICAgICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZSgpLnRoZW4oZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09ICdWYWxpZCcpIHtcblxuICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uLmRpc2FibGVCdXR0b24oc3VibWl0dGVyIHx8IGUuc3VibWl0dGVyKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNhcHRjaGFJbnB1dCA9IGZvcm0ucXVlcnlTZWxlY3RvcihcIiNSZWNhcHRjaGFSZXNwb25zZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l0ZUtleSA9IHJlY2FwdGNoYUlucHV0LmRhdGFzZXQuc2l0ZUtleTtcblxuICAgICAgICAgICAgICAgICAgICBncmVjYXB0Y2hhLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IHJlY2FwdGNoYUlucHV0LmRhdGFzZXQuYWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JlY2FwdGNoYS5leGVjdXRlKHNpdGVLZXksIHthY3Rpb246IGFjdGlvbn0pLnRoZW4oZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjYXB0Y2hhSW5wdXQudmFsdWUgPSB0b2tlbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgc2hvd0Zvcm1FcnJvcihlcnJvclRleHQsIGVycm9yVGl0bGUpIHtcbiAgICAgICAgY29uc3QgZXJyb3JDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2Vycm9yLWFsZXJ0XCIpO1xuICAgICAgICBpZighZXJyb3JDb250YWluZXIpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgZXJyb3JDb250YWluZXIuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xuICAgICAgICBlcnJvckNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiLmFsZXJ0LXRleHRcIikuaW5uZXJIVE1MID0gZXJyb3JUZXh0O1xuICAgIH1cblxuICAgIHN0YXRpYyBoaWRlRm9ybUVycm9yKCkge1xuICAgICAgICBjb25zdCBlcnJvckNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjZXJyb3ItYWxlcnRcIik7XG4gICAgICAgIGlmICghZXJyb3JDb250YWluZXIpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgZXJyb3JDb250YWluZXIuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIH1cbn1cbiIsImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWplY3QoZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpbmZvLmRvbmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3luY1RvR2VuZXJhdG9yO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlQ2xhc3M7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyIsImZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7XG4gICAgXCJkZWZhdWx0XCI6IG9ialxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQ7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxudmFyIHJ1bnRpbWUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBJRSA4IGhhcyBhIGJyb2tlbiBPYmplY3QuZGVmaW5lUHJvcGVydHkgdGhhdCBvbmx5IHdvcmtzIG9uIERPTSBvYmplY3RzLlxuICAgIGRlZmluZSh7fSwgXCJcIik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRlZmluZSA9IGZ1bmN0aW9uKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgZGVmaW5lKEdwLCBcImNvbnN0cnVjdG9yXCIsIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgZGVmaW5lKEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBcImNvbnN0cnVjdG9yXCIsIEdlbmVyYXRvckZ1bmN0aW9uKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoXG4gICAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsXG4gICAgdG9TdHJpbmdUYWdTeW1ib2wsXG4gICAgXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICk7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgZGVmaW5lKHByb3RvdHlwZSwgbWV0aG9kLCBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIGV4cG9ydHMubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgZGVmaW5lKGdlbkZ1biwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yRnVuY3Rpb25cIik7XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgLy8gSWYgYSByZWplY3RlZCBQcm9taXNlIHdhcyB5aWVsZGVkLCB0aHJvdyB0aGUgcmVqZWN0aW9uIGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gc28gaXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuXG4gICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGFzeW5jSXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG4gIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHtcbiAgICBpZiAoUHJvbWlzZUltcGwgPT09IHZvaWQgMCkgUHJvbWlzZUltcGwgPSBQcm9taXNlO1xuXG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLFxuICAgICAgUHJvbWlzZUltcGxcbiAgICApO1xuXG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIC8vIE5vdGU6IFtcInJldHVyblwiXSBtdXN0IGJlIHVzZWQgZm9yIEVTMyBwYXJzaW5nIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSkge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xuXG4gIGRlZmluZShHcCwgXCJ0b1N0cmluZ1wiLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBleHBvcnRzLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlXG4gIC8vIG9yIG5vdCwgcmV0dXJuIHRoZSBydW50aW1lIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHRoZSB2YXJpYWJsZVxuICAvLyByZWdlbmVyYXRvclJ1bnRpbWUgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBhbGxvd3MgdGhpcyBtb2R1bGUgdG8gYmVcbiAgLy8gaW5qZWN0ZWQgZWFzaWx5IGJ5IGBiaW4vcmVnZW5lcmF0b3IgLS1pbmNsdWRlLXJ1bnRpbWUgc2NyaXB0LmpzYC5cbiAgcmV0dXJuIGV4cG9ydHM7XG5cbn0oXG4gIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzXG4gIC8vIGFzIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgbmFtZXNwYWNlLiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IGVtcHR5XG4gIC8vIG9iamVjdC4gRWl0aGVyIHdheSwgdGhlIHJlc3VsdGluZyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS5cbiAgdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzIDoge31cbikpO1xuXG50cnkge1xuICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xufSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHtcbiAgLy8gVGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSBydW5uaW5nIGluIHN0cmljdCBtb2RlLCBzbyB0aGUgYWJvdmVcbiAgLy8gYXNzaWdubWVudCBzaG91bGQgYWx3YXlzIHdvcmsgdW5sZXNzIHNvbWV0aGluZyBpcyBtaXNjb25maWd1cmVkLiBKdXN0XG4gIC8vIGluIGNhc2UgcnVudGltZS5qcyBhY2NpZGVudGFsbHkgcnVucyBpbiBzdHJpY3QgbW9kZSwgaW4gbW9kZXJuIGVuZ2luZXNcbiAgLy8gd2UgY2FuIGV4cGxpY2l0bHkgYWNjZXNzIGdsb2JhbFRoaXMuIEluIG9sZGVyIGVuZ2luZXMgd2UgY2FuIGVzY2FwZVxuICAvLyBzdHJpY3QgbW9kZSB1c2luZyBhIGdsb2JhbCBGdW5jdGlvbiBjYWxsLiBUaGlzIGNvdWxkIGNvbmNlaXZhYmx5IGZhaWxcbiAgLy8gaWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBmb3JiaWRzIHVzaW5nIEZ1bmN0aW9uLCBidXQgaW4gdGhhdCBjYXNlXG4gIC8vIHRoZSBwcm9wZXIgc29sdXRpb24gaXMgdG8gZml4IHRoZSBhY2NpZGVudGFsIHN0cmljdCBtb2RlIHByb2JsZW0uIElmXG4gIC8vIHlvdSd2ZSBtaXNjb25maWd1cmVkIHlvdXIgYnVuZGxlciB0byBmb3JjZSBzdHJpY3QgbW9kZSBhbmQgYXBwbGllZCBhXG4gIC8vIENTUCB0byBmb3JiaWQgRnVuY3Rpb24sIGFuZCB5b3UncmUgbm90IHdpbGxpbmcgdG8gZml4IGVpdGhlciBvZiB0aG9zZVxuICAvLyBwcm9ibGVtcywgcGxlYXNlIGRldGFpbCB5b3VyIHVuaXF1ZSBwcmVkaWNhbWVudCBpbiBhIEdpdEh1YiBpc3N1ZS5cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSBcIm9iamVjdFwiKSB7XG4gICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xuICB9IGVsc2Uge1xuICAgIEZ1bmN0aW9uKFwiclwiLCBcInJlZ2VuZXJhdG9yUnVudGltZSA9IHJcIikocnVudGltZSk7XG4gIH1cbn1cbiJdfQ=="}