{"version":3,"file":"analytics.js","sources":["webpack://frontend/./src/analytics/form_tracking.js","webpack://frontend/./src/analytics/gtm_scripts.js","webpack://frontend/./src/analytics/index.js","webpack://frontend/./src/vanilla/utils/index.js","webpack://frontend/./src/analytics/tradewaste.js"],"sourcesContent":["const maxTime = 1200000;\r\nconst FORM_TRACKING_KEY = \"wc_form_tracking\";\r\n\r\nexport function formTracking() {\r\n // find forms on the page with data attributes for form tracking\r\n const formsWithTracking = document.querySelectorAll(\"[data-form-name]\");\r\n // itterate over the forms and get the data attributes\r\n for (let i = 0; i < formsWithTracking.length; i++) {\r\n handleFormReporting(formsWithTracking[i]);\r\n }\r\n}\r\n\r\nfunction handleFormReporting(form) {\r\n const name = form.dataset.formName;\r\n const step = (form.dataset.formStep ?? \"0\").replace(\"step\", \"\");\r\n const desc = form.dataset.formStepname || \"\";\r\n const value = form.dataset.formValue ?? 0.0;\r\n const type = form.dataset.formCategory || \"form\";\r\n const successElement = form.querySelector('.success_msg');\r\n const isComplete = successElement || step === \"complete\";\r\n \r\n let isReload = (\r\n window.performance\r\n .getEntriesByType('navigation')\r\n .some((nav) => nav.type === 'reload')\r\n );\r\n\r\n if (isComplete) {\r\n if (!getFormTracking(name)) {\r\n return;\r\n }\r\n dataLayerPush({ event: \"formComplete\", name, step: \"complete\", desc, value, error: null, type });\r\n return;\r\n }\r\n let isFresh = hasExpiredOrNotStarted(name);\r\n if ((!isReload && document.referrer !== window.location.href)) {\r\n isFresh = true;\r\n removeTracking();\r\n }\r\n\r\n let errors = form.querySelectorAll('.error_msg, .field-validation-error, .wc-assist--error');\r\n let hasErrors = Array.from(errors).filter(item => item.className.indexOf('wc-hidden--visually') < 0).length > 0; // Ignore hidden errors\r\n if (hasErrors) {\r\n return handleFormErrors({ name, step, errors, type });\r\n }\r\n let isNewStep = getStepStatus(name, `step${step}`);\r\n if (!isNewStep) return;\r\n\r\n // if no form start event has been pushed\r\n if (isFresh) {\r\n form.addEventListener(\"click\", function (e) {\r\n if (isFormElement(e.target.tagName) && isFresh) {\r\n dataLayerPush({ event: \"formStart\", name, step: 'start', desc: \"\", value: 0.0, error: null, type });\r\n dataLayerPush({ event: \"formStep\", name, step: `step${step}`, desc, value: 0.0, error: null, type });\r\n isFresh = false;\r\n }\r\n });\r\n return;\r\n }\r\n dataLayerPush({ event: \"formStep\", name, step: `step${step}`, desc, value: 0.0, error: null, type });\r\n}\r\n\r\n/**\r\n * log the dataLayer to the console\r\n * for testing only\r\n * @example logDataLayer();\r\n*/\r\n//function logDataLayer() {\r\n// console.log(JSON.stringify(window.dataLayer), null, 2);\r\n//}\r\n \r\nfunction handleFormErrors({ name, step, errors, type = \"form\" }) {\r\n let error = getError(errors);\r\n if (error) {\r\n dataLayerPush({ event: \"formError\", name, step: `step${step} - error`, desc: \"\", value: 0.0, error, type });\r\n }\r\n}\r\n/**\r\n * @example dataLayerPush({ event: \"formStart\", name, step: 'start', desc, value: 0.0, error: null, type });\r\n*/\r\n// push data to the dataLayer\r\nfunction dataLayerPush(options) {\r\n const { event, name, step, ...rest } = options;\r\n if (event === \"formStep\") {\r\n setFormTracking(name, step);\r\n }\r\n window.dataLayer.push({\r\n event: options.event,\r\n action: {\r\n name,\r\n step,\r\n time: new Date().toISOString(),\r\n ...rest\r\n }\r\n });\r\n \r\n if (event === \"formComplete\") {\r\n removeTracking()\r\n }\r\n\r\n}\r\n\r\nfunction hasExpiredOrNotStarted(formName) {\r\n let ft = getFormTracking(formName);\r\n if (ft) {\r\n return getFormTracking(formName).expiry <= Date.now();\r\n }\r\n return true\r\n}\r\n\r\nfunction hasNavigatedToNewStep(formName, formStep) {\r\n let formData = getFormTracking(formName);\r\n if (!formData) {\r\n return true\r\n }\r\n return formData.formName === formName && formData.savedStep !== formStep;\r\n}\r\n\r\nfunction removeTracking() {\r\n sessionStorage.removeItem(FORM_TRACKING_KEY);\r\n}\r\n\r\nfunction getStepStatus(formName, formStep) {\r\n let ft = getFormTracking(formName);\r\n if (ft) {\r\n return ft.savedStep !== formStep;\r\n }\r\n return true\r\n}\r\n\r\nfunction getFormTracking(formName) {\r\n let dataString = sessionStorage.getItem(FORM_TRACKING_KEY);\r\n if (dataString) {\r\n let data = JSON.parse(dataString)\r\n if (data.formName === formName) {\r\n return data\r\n } else {\r\n removeTracking();\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction setFormTracking(formName, formStep) {\r\n sessionStorage.setItem(FORM_TRACKING_KEY, JSON.stringify({\r\n formName,\r\n savedStep: formStep,\r\n expiry: Date.now() + maxTime,\r\n }));\r\n}\r\n\r\nfunction getError(errors) {\r\n if (errors) {\r\n let errorArray = Array.from(errors, (err) => err.textContent);\r\n let uniqueErrors = new Set(errorArray);\r\n return Array.from(uniqueErrors).join(\",\");\r\n }\r\n return null;\r\n}\r\n\r\nfunction isFormElement(nodeType) {\r\n switch (nodeType) {\r\n case \"SELECT\":\r\n case \"INPUT\":\r\n case \"BUTTON\":\r\n case \"TEXTAREA\":\r\n case \"OPTION\":\r\n case \"LABEL\":\r\n case \"FIELDSET\":\r\n return true;\r\n default:\r\n return false;\r\n }\r\n}\r\n","function handleErrors(form = true) {\r\n // handle errors\r\n let errors = document.querySelectorAll(\".wc-assist--error\");\r\n if (errors && errors.length > 0) {\r\n // Initialise the error list\r\n if (window.digitalData.form) {\r\n window.digitalData.form.errorList = [];\r\n window.digitalData.form.errorNoList = [];\r\n }\r\n else {\r\n window.digitalData.form = { errorList: [], errorNoList: [] };\r\n }\r\n for (let i = 0; i < errors.length; i++) {\r\n let error = errors[i];\r\n let dataset = error.dataset;\r\n // Note that Sitecore forms display the errors but display them\r\n if (error && error.innerText && error.className && error.className.indexOf('field-validation-valid') < 0 && error.className.indexOf('hidden') < 0) {\r\n window.digitalData.form.errorList.push(error.innerText);\r\n\r\n if (dataset.gtmErrorCode) {\r\n window.digitalData.form.errorNoList.push(dataset.gtmErrorCode);\r\n }\r\n }\r\n }\r\n if (window.digitalData.form.errorList.length > 0) {\r\n if (form) {\r\n dataLayer.push({ event: 'formErrorBlocking' });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction SetTriggers() {\r\n window.triggerSitecorePageEvent = function (eventId, text, data, itemId) {\r\n var formData = new FormData();\r\n formData.append(\"pageEventId\", eventId);\r\n formData.append(\"text\", text);\r\n formData.append(\"data\", data);\r\n formData.append(\"itemId\", itemId);\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", '/api/sitecore/WaterCorp.Feature.Analytics.Controllers.AjaxAnalyticsController,WaterCorp.Feature.Analytics/TrackPageEvent', true);\r\n xhr.onreadystatechange = function () {\r\n if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {\r\n var parsed = JSON.parse(this.responseText);\r\n if (parsed.success === true) {\r\n console.log(\"Tracking page event succeeded!\");\r\n } else {\r\n console.log(\"Tracking page event failed: \" + parsed.message);\r\n }\r\n }\r\n };\r\n xhr.send(formData);\r\n };\r\n \r\n window.triggerSitecoreGoal = function (goalId) {\r\n var formData = new FormData();\r\n formData.append(\"goalId\", goalId);\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", '/api/sitecore/WaterCorp.Feature.Analytics.Controllers.AjaxAnalyticsController,WaterCorp.Feature.Analytics/TrackGoal', true);\r\n xhr.onreadystatechange = function () {\r\n if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {\r\n var parsed = JSON.parse(this.responseText);\r\n if (parsed.success === true) {\r\n console.log(\"Tracking goal succeeded!\");\r\n } else {\r\n console.log(\"Tracking goal failed: \" + parsed.message);\r\n }\r\n }\r\n };\r\n xhr.send(formData);\r\n };\r\n \r\n window.triggerSitecoreOutcome = function (outcomeId, currencyCode, monetaryValue, isInteraction) {\r\n var formData = new FormData();\r\n formData.append(\"outcomeId\", outcomeId);\r\n formData.append(\"currencyCode\", currencyCode);\r\n formData.append(\"monetaryValue\", monetaryValue);\r\n formData.append(\"isInteraction\", isInteraction);\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", '/api/sitecore/WaterCorp.Feature.Analytics.Controllers.AjaxAnalyticsController,WaterCorp.Feature.Analytics/TrackOutcome', true);\r\n xhr.onreadystatechange = function () {\r\n if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {\r\n var parsed = JSON.parse(this.responseText);\r\n if (parsed.success === true) {\r\n console.log(\"Tracking outcome succeeded!\");\r\n } else {\r\n console.log(\"Tracking outcome failed: \" + parsed.message);\r\n }\r\n }\r\n };\r\n xhr.send(formData);\r\n };\r\n \r\n window.triggerSitecoreCampaign = function (campaignId) {\r\n var formData = new FormData();\r\n formData.append(\"campaignId\", campaignId);\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", '/api/sitecore/WaterCorp.Feature.Analytics.Controllers.AjaxAnalyticsController,WaterCorp.Feature.Analytics/TrackCampaign', true);\r\n xhr.onreadystatechange = function () {\r\n if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {\r\n var parsed = JSON.parse(this.responseText);\r\n if (parsed.success === true) {\r\n console.log(\"Tracking campaign succeeded!\");\r\n } else {\r\n console.log(\"Tracking campaign failed: \" + parsed.message);\r\n }\r\n }\r\n };\r\n xhr.send(formData);\r\n };\r\n \r\n}\r\n\r\nexport function oldGTM() {\r\n if (window.dataLayer && window.digitalData) {\r\n SetTriggers();\r\n /* Paperless Signup */\r\n let paperlessnRefs = [...document.querySelectorAll(`[data-gtm^=\"paperless\"]`)];\r\n if (paperlessnRefs.length > 0) {\r\n for (let i = 0; i < paperlessnRefs.length; i++) {\r\n let gtm = paperlessnRefs[i].dataset.gtm;\r\n switch (gtm) {\r\n case \"paperless owner\":\r\n case \"paperless tenant\":\r\n dataLayer.push({ event: 'formStepLoad' });\r\n break;\r\n case \"paperless success\":\r\n if (window.digitalData.user) {\r\n window.digitalData.user.paperlessState = \"Y\";\r\n }\r\n dataLayer.push({ event: 'formComplete' })\r\n break;\r\n default: break;\r\n }\r\n }\r\n }\r\n\r\n /* Manage Bill Delivery Method */\r\n let billDeliveryRefs = [...document.querySelectorAll(`[data-gtm^=\"bill-delivery\"]`)];\r\n if (billDeliveryRefs.length > 0) {\r\n for (let i = 0; i < billDeliveryRefs.length; i++) {\r\n let dataset = billDeliveryRefs[i].dataset;\r\n switch (dataset.gtm) {\r\n case \"bill-delivery complete\":\r\n dataLayer.push({ event: 'formSubmission' });\r\n break;\r\n case \"bill-delivery error\":\r\n window.digitalData.form.errorList = ['update unsuccessful'];\r\n window.digitalData.form.errorNoList = dataset.gtmErrorCode;\r\n dataLayer.push({ event: 'formErrorBlocking' });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /* Register for an account */\r\n let registrationRefs = [...document.querySelectorAll(`[data-gtm^=\"registration\"]`)];\r\n if (registrationRefs.length > 0) {\r\n handleErrors();\r\n if (window.digitalData.form && (!window.digitalData.form.errorList || window.digitalData.form.errorList.length === 0)) {\r\n for (let i = 0; i < registrationRefs.length; i++) {\r\n let dataset = registrationRefs[i].dataset;\r\n switch (dataset.gtm) {\r\n case \"registration step2\":\r\n dataLayer.push({ event: 'formStepLoad' });\r\n break;\r\n case \"registration error\":\r\n var errorText = registrationRefs[i].innerText;\r\n if (errorText) {\r\n if (window.digitalData.form) {\r\n window.digitalData.form.errorList = [errorText];\r\n window.digitalData.form.errorNoList = dataset.gtmErrorCode;\r\n }\r\n else {\r\n window.digitalData.form = { errorList: [errorText], errorNoList: [dataset.gtmErrorCode] };\r\n }\r\n dataLayer.push({ event: 'formErrorBlocking' });\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /* Add an account */\r\n let addAnotherAccountRefs = [...document.querySelectorAll(`[data-gtm^=\"add-an-account\"]`)];\r\n if (addAnotherAccountRefs.length > 0) {\r\n handleErrors();\r\n if (window.digitalData.form && (!window.digitalData.form.errorList || window.digitalData.form.errorList.length === 0)) {\r\n for (let i = 0; i < addAnotherAccountRefs.length; i++) {\r\n let gtm = addAnotherAccountRefs[i].dataset.gtm;\r\n\r\n switch (gtm) {\r\n case \"add-an-account step2\":\r\n dataLayer.push({ event: 'formStepLoad' });\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /* Watering Days Form */\r\n let wateringDaysRefs = [...document.querySelectorAll(`[data-gtm^=\"watering-days\"]`)];\r\n if (wateringDaysRefs.length > 0) {\r\n for (let i = 0; i < wateringDaysRefs.length; i++) {\r\n let element = wateringDaysRefs[i];\r\n let gtm = wateringDaysRefs[i].dataset.gtm;\r\n switch (gtm) {\r\n case \"watering-days start\":\r\n // Retrieve all inputs and add event to push to data layer when focused\r\n let inputRefs = element.querySelectorAll(\".input-primary\");\r\n if (inputRefs && inputRefs.length > 0) {\r\n for (let x = 0; x < inputRefs.length; x++) {\r\n let input = inputRefs[x];\r\n input.addEventListener(\"focus\", () => {\r\n if (!window.digitalData.tool) {\r\n window.digitalData.tool = { name: \"watering days\" };\r\n dataLayer.push({ event: 'toolStart' });\r\n }\r\n });\r\n }\r\n }\r\n break;\r\n case \"watering-days bore\":\r\n window.digitalData.tool = { name: \"watering days\", step: '2. bore' };\r\n dataLayer.push({ event: 'toolStepLoad' });\r\n break;\r\n case \"watering-days complete\":\r\n let result = element.dataset.result;\r\n window.digitalData.tool = { name: \"watering days\", result: result };\r\n dataLayer.push({ event: 'toolComplete' });\r\n break;\r\n default: break;\r\n }\r\n }\r\n }\r\n\r\n // Retrieve waterwise search form\r\n let formRefs = [...document.querySelectorAll(`#WaterwiseSpecialistsSearch`)];\r\n if (formRefs && formRefs.length > 0) {\r\n window.specialistsSearchFocus = false; // This ensures that form start is only triggered once\r\n let form = formRefs[0];\r\n // Retrieve all inputs and add event to push to data layer when focused\r\n let inputRefs = form.querySelectorAll(\".input-primary\");\r\n if (inputRefs && inputRefs.length > 0) {\r\n for (let x = 0; x < inputRefs.length; x++) {\r\n let input = inputRefs[x];\r\n input.addEventListener(\"focus\", () => {\r\n if (!window.specialistsSearchFocus) {\r\n dataLayer.push({ 'event': 'formStart' });\r\n window.specialistsSearchFocus = true;\r\n } \r\n });\r\n }\r\n }\r\n } \r\n\r\n /* Extend due date */\r\n let extendDueDateRefs = [...document.querySelectorAll(`[data-gtm^=\"extend-due-date\"]`)];\r\n if (extendDueDateRefs.length > 0) {\r\n handleErrors();\r\n if (window.digitalData.form && (!window.digitalData.form.errorList || window.digitalData.form.errorList.length === 0)) {\r\n for (let i = 0; i < extendDueDateRefs.length; i++) {\r\n let dataset = extendDueDateRefs[i].dataset;\r\n switch (dataset.gtm) {\r\n case \"extend-due-date step2\":\r\n dataLayer.push({ event: 'formStepLoad' });\r\n break;\r\n case \"extend-due-date error\":\r\n var errorText1 = extendDueDateRefs[i].innerText;\r\n if (errorText1) {\r\n if (window.digitalData.form) {\r\n window.digitalData.form.errorList = [errorText1];\r\n }\r\n else {\r\n window.digitalData.form = { errorList: [errorText1] };\r\n }\r\n window.digitalData.form.errorNoList = dataset.gtmErrorCode;\r\n dataLayer.push({ event: 'formErrorBlocking' });\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /* Account balance */\r\n let accountBalanceRefs = [...document.querySelectorAll(`[data-gtm^=\"account-balance\"]`)];\r\n if (accountBalanceRefs.length > 0) {\r\n for (let i = 0; i < accountBalanceRefs.length; i++) {\r\n let gtm = accountBalanceRefs[i].dataset.gtm;\r\n switch (gtm) {\r\n case \"account-balance complete\":\r\n dataLayer.push({ event: 'formSubmission' });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /* Manage Service Charge Frequency */\r\n let serviceChargeFrequencyRefs = [...document.querySelectorAll(`[data-gtm^=\"service-charge-frequency\"]`)];\r\n if (serviceChargeFrequencyRefs.length > 0) {\r\n for (let i = 0; i < serviceChargeFrequencyRefs.length; i++) {\r\n let dataset = serviceChargeFrequencyRefs[i].dataset;\r\n switch (dataset.gtm) {\r\n case \"service-charge-frequency complete\":\r\n dataLayer.push({ event: 'formSubmission' });\r\n break;\r\n case \"service-charge-frequency error\":\r\n window.digitalData.form.errorList = ['update unsuccessful'];\r\n window.digitalData.form.errorNoList = dataset.gtmErrorCode;\r\n dataLayer.push({ event: 'formErrorBlocking' });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /* Waterwise Specialists Search */\r\n let waterwiseSpecialistsRefs = [...document.querySelectorAll(`[data-gtm^=\"specialists\"]`)];\r\n if (waterwiseSpecialistsRefs.length > 0) {\r\n handleErrors();\r\n if (window.digitalData.form && (!window.digitalData.form.errorList || window.digitalData.form.errorList.length === 0)) {\r\n for (let i = 0; i < waterwiseSpecialistsRefs.length; i++) {\r\n let gtm = waterwiseSpecialistsRefs[i].dataset.gtm;\r\n switch (gtm) {\r\n case \"specialists complete\":\r\n dataLayer.push({ event: 'formSubmission' });\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /* Manage Billing Details Method */\r\n let manageBillingDetailsRefs = [...document.querySelectorAll(`[data-gtm^=\"manage-billing-details\"]`)];\r\n if (manageBillingDetailsRefs.length > 0) {\r\n for (let i = 0; i < manageBillingDetailsRefs.length; i++) {\r\n let dataset = manageBillingDetailsRefs[i].dataset;\r\n switch (dataset.gtm) {\r\n case \"manage-billing-details error\":\r\n window.digitalData.page.error = 'manage billing details';\r\n window.digitalData.page.errorDetails = ['get unsuccessful'];\r\n window.digitalData.page.errorNo = dataset.gtmErrorCode;\r\n dataLayer.push({ event: 'serverErrorComponent' });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /* Account Summary Method */\r\n let accountSummaryRefs = [...document.querySelectorAll(`[data-gtm^=\"account-summary\"]`)];\r\n if (accountSummaryRefs.length > 0) {\r\n for (let i = 0; i < accountSummaryRefs.length; i++) {\r\n let dataset = accountSummaryRefs[i].dataset;\r\n switch (dataset.gtm) {\r\n case \"account-summary error\":\r\n window.digitalData.page.error = 'account summary';\r\n window.digitalData.page.errorDetails = ['get unsuccessful'];\r\n window.digitalData.page.errorNo = dataset.gtmErrorCode;\r\n dataLayer.push({ event: 'serverErrorComponent' });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /* Make Payment Form */\r\n let makePaymentRefs = [...document.querySelectorAll(`[data-gtm^=\"make-payment\"]`)];\r\n if (makePaymentRefs.length > 0) {\r\n\r\n // Initialise the error list if not exist\r\n if (window.digitalData.form) {\r\n window.digitalData.form.errorList = [];\r\n window.digitalData.form.errorNoList = [];\r\n }\r\n else {\r\n window.digitalData.form = { errorList: [], errorNoList: [] };\r\n }\r\n\r\n handleErrors();\r\n\r\n for (let i = 0; i < makePaymentRefs.length; i++) {\r\n let gtm = makePaymentRefs[i].dataset.gtm;\r\n switch (gtm) {\r\n case \"make-payment step2\":\r\n case \"make-payment step3\":\r\n dataLayer.push({ event: 'formStepLoad' });\r\n break;\r\n case \"make-payment error\":\r\n window.digitalData.form.errorList = ['submission unsuccessful'];\r\n window.digitalData.form.errorNoList = makePaymentRefs[i].dataset.gtmErrorCode;\r\n dataLayer.push({ event: 'formErrorBlocking' });\r\n break;\r\n case \"make-payment success\":\r\n let result = JSON.parse(makePaymentRefs[i].dataset.result);\r\n if (result && result.length > 0) {\r\n window.digitalData.form.result = result;\r\n }\r\n dataLayer.push({ event: 'formSubmission' });\r\n break;\r\n case \"make-payment email\":\r\n dataLayer.push({ event: 'emailPaymentReceipt' });\r\n break;\r\n default: break;\r\n }\r\n }\r\n }\r\n\r\n /* Outages Subscription Notification Form */\r\n let outagesSubscriptionFormRefs = [...document.querySelectorAll(`[data-gtm^=\"outages-subscription\"]`)];\r\n if (outagesSubscriptionFormRefs.length > 0) {\r\n\r\n // Initialise the error list if not exist\r\n if (window.digitalData.form) {\r\n window.digitalData.form.errorList = [];\r\n window.digitalData.form.errorNoList = [];\r\n }\r\n else {\r\n window.digitalData.form = { errorList: [], errorNoList: [] };\r\n }\r\n\r\n handleErrors();\r\n\r\n for (let i = 0; i < outagesSubscriptionFormRefs.length; i++) {\r\n let gtm = outagesSubscriptionFormRefs[i].dataset.gtm;\r\n switch (gtm) {\r\n case \"outages-subscription error\":\r\n window.digitalData.form.errorList = ['submission unsuccessful'];\r\n window.digitalData.form.errorNoList = outagesSubscriptionFormRefs[i].dataset.gtmErrorCode;\r\n dataLayer.push({ event: 'formErrorBlocking' });\r\n break;\r\n default: break;\r\n }\r\n }\r\n }\r\n\r\n /* Outages Unsubscribe Form */\r\n let outagesUnsubscribeFormRefs = [...document.querySelectorAll(`[data-gtm^=\"outages-unsubscribe\"]`)];\r\n if (outagesUnsubscribeFormRefs.length > 0) {\r\n\r\n // Initialise the error list if not exist\r\n if (window.digitalData.form) {\r\n window.digitalData.form.errorList = [];\r\n window.digitalData.form.errorNoList = [];\r\n }\r\n else {\r\n window.digitalData.form = { errorList: [], errorNoList: [] };\r\n }\r\n\r\n handleErrors();\r\n\r\n for (let i = 0; i < outagesUnsubscribeFormRefs.length; i++) {\r\n let gtm = outagesUnsubscribeFormRefs[i].dataset.gtm;\r\n switch (gtm) {\r\n case \"outages-unsubscribe error\":\r\n window.digitalData.form.errorList = ['unsubscribe unsuccessful'];\r\n window.digitalData.form.errorNoList = outagesUnsubscribeFormRefs[i].dataset.gtmErrorCode;\r\n dataLayer.push({ event: 'formErrorBlocking' });\r\n break;\r\n default: break;\r\n }\r\n }\r\n }\r\n\r\n /* Property Rates Search */\r\n let propertyRatesSearchRefs = [...document.querySelectorAll(`[data-gtm^=\"property-rates-search\"]`)];\r\n if (propertyRatesSearchRefs.length > 0) {\r\n // Initialise the error list if not exist\r\n if (window.digitalData.form) {\r\n window.digitalData.form.errorList = [];\r\n window.digitalData.form.errorNoList = [];\r\n }\r\n else {\r\n window.digitalData.form = { errorList: [], errorNoList: [] };\r\n }\r\n\r\n handleErrors();\r\n\r\n for (let i = 0; i < propertyRatesSearchRefs.length; i++) {\r\n let gtm = propertyRatesSearchRefs[i].dataset.gtm;\r\n\r\n switch (gtm) {\r\n case \"property-rates-search results\":\r\n dataLayer.push({ event: 'formStepLoad' });\r\n break;\r\n case \"property-rates-search complete\":\r\n dataLayer.push({ event: 'formSubmission' });\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { domLoad } from \"../vanilla/utils\";\r\nimport { formTracking } from \"./form_tracking\";\r\nimport { oldGTM } from \"./gtm_scripts\";\r\nimport { tradewasteGTM } from \"./tradewaste\";\r\n\r\n\r\ndomLoad(function() {\r\n formTracking();\r\n oldGTM();\r\n tradewasteGTM();\r\n});\r\n","export { validateFormFields } from './validate_form';\r\nexport { animateSvg } from './animate_svg';\r\n\r\nexport function debounce(func, wait, immediate) {\r\n let timeout;\r\n return function () {\r\n let context = this, args = arguments;\r\n let later = function () {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n let callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) func.apply(context, args);\r\n };\r\n}\r\n\r\nexport function domLoad(yourFunction) {\r\n if (document.readyState && document.readyState !== 'loading') {\r\n yourFunction();\r\n }\r\n else {\r\n document.addEventListener('DOMContentLoaded', function () {\r\n yourFunction()\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\n// move to own\r\n// use with domLoad\r\nexport function maskInputs() {\r\n const numericInputs = document.querySelectorAll('input[inputmode=numeric], input[inputmode=tel]');\r\n for (const numericInput of numericInputs) {\r\n let inputmode = numericInput.getAttribute(\"inputmode\");\r\n numericInput.addEventListener('input', (event) => {\r\n const value = event.target.value;\r\n let max = (numericInput.dataset.max && Number(numericInput.dataset.max)) || 255;\r\n if (value) {\r\n // Update the input value with the masked value\r\n let masked = inputmode === \"numeric\" ? value.replace(/\\D/g, '') : value.replace(/[^0-9\\s]/g, '');\r\n event.target.value = masked.length >= max ? masked.slice(0, max) : masked;\r\n };\r\n });\r\n }\r\n}\r\n// use with domLoad\r\nexport function skipLinks() {\r\n let content = document.querySelector(\"#content\");\r\n let skip = document.querySelector(\"#skip-link\");\r\n if (content && skip) {\r\n skip.addEventListener(\"keydown\", (e) => {\r\n if (e.key === 'Enter' || e.keyCode === 13) {\r\n let selectable = content.querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])');\r\n if (selectable) {\r\n selectable.focus();\r\n selectable.scrollIntoView();\r\n }\r\n }\r\n })\r\n }\r\n}\r\n\r\n// Maybe don't use\r\nexport function loadBelowFold({ script, stylesheet, adjust }) {\r\n if (!adjust) { adjust = 0;}\r\n document.addEventListener('scroll', lazyLoad);\r\n function getScript(source) {\r\n var el = document.createElement('script');\r\n el.src = source;\r\n document.body.appendChild(el);\r\n }\r\n function getStylesheet(source) {\r\n var link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.type = 'text/css';\r\n link.href = source;\r\n document.head.appendChild(link);\r\n }\r\n function lazyLoad() {\r\n var vh = Math.max(\r\n document.documentElement.clientHeight,\r\n window.innerHeight || 0\r\n );\r\n var windowHeight = window.scrollY || window.pageYOffset;\r\n if (windowHeight + adjust > vh) {\r\n stylesheet && getStylesheet(stylesheet);\r\n script && getScript(script);\r\n document.removeEventListener('scroll', lazyLoad);\r\n }\r\n }\r\n lazyLoad();\r\n}\r\n\r\nexport function getNextSibling(elem, selector) {\r\n\r\n // Get the next sibling element\r\n var sibling = elem.nextElementSibling;\r\n\r\n // If there's no selector, return the first sibling\r\n if (!selector) return sibling;\r\n\r\n // If the sibling matches our selector, use it\r\n // If not, jump to the next sibling and continue the loop\r\n while (sibling) {\r\n if (sibling.matches(selector)) return sibling;\r\n sibling = sibling.nextElementSibling\r\n }\r\n\r\n};\r\n\r\nexport function getPreviousSibling(elem, selector) {\r\n\r\n // Get the next sibling element\r\n var sibling = elem.previousElementSibling;\r\n\r\n // If there's no selector, return the first sibling\r\n if (!selector) return sibling;\r\n\r\n // If the sibling matches our selector, use it\r\n // If not, jump to the next sibling and continue the loop\r\n while (sibling) {\r\n if (sibling.matches(selector)) return sibling;\r\n sibling = sibling.previousElementSibling;\r\n }\r\n\r\n};\r\n\r\nexport function postRequest(url, content) {\r\n return window.fetch(url, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(content)\r\n });\r\n}\r\n\r\nexport function getRequest(url) {\r\n return window.fetch(url, { });\r\n}","export function tradewasteGTM() {\r\n var tradewaste = document.getElementById('tradewaste');\r\n\r\n if (tradewaste) {\r\n if (window.digitalData && !window.digitalData.form) {\r\n window.digitalData.form = {\r\n name: \"Trade waste form\",\r\n step: \"start\"\r\n };\r\n window.digitalData.customDimension = {\r\n index: \"5\",\r\n value: \"Trade waste form\"\r\n };\r\n window.digitalData.customMetric = {\r\n index: \"7\",\r\n value: \"1\"\r\n };\r\n }\r\n }\r\n}"],"names":["FORM_TRACKING_KEY","dataLayerPush","options","formName","formStep","event","name","step","rest","sessionStorage","JSON","Date","window","removeTracking","getFormTracking","dataString","data","handleErrors","form","errors","document","i","error","dataset","dataLayer","domLoad","yourFunction","formTracking","formsWithTracking","handleFormReporting","desc","value","type","isComplete","successElement","isReload","nav","isFresh","Array","item","handleFormErrors","param","Set","err","getStepStatus","ft","e","isFormElement","nodeType","oldGTM","eventId","text","itemId","formData","FormData","xhr","XMLHttpRequest","parsed","goalId","outcomeId","currencyCode","monetaryValue","isInteraction","campaignId","paperlessnRefs","billDeliveryRefs","registrationRefs","errorText","addAnotherAccountRefs","wateringDaysRefs","element","inputRefs","x","input","result","formRefs","extendDueDateRefs","errorText1","accountBalanceRefs","serviceChargeFrequencyRefs","waterwiseSpecialistsRefs","manageBillingDetailsRefs","accountSummaryRefs","makePaymentRefs","outagesSubscriptionFormRefs","outagesUnsubscribeFormRefs","propertyRatesSearchRefs"],"mappings":"qMACA,IAAMA,EAAoB,mBAgF1B,SAASC,EAAcC,CAAO,MA8DLC,EAAUC,EA7D/B,GAAM,CAAEC,MAAAA,CAAK,CAAEC,KAAAA,CAAI,CAAEC,KAAAA,CAAI,CAAE,GAAGC,EAAM,CAAGN,CACzB,cAAVG,IA4DiBF,EA3DDG,EA2DWF,EA3DLG,EA4D1BE,eAAe,OAAO,CAACT,EAAmBU,KAAK,SAAS,CAAC,CACrDP,SAAAA,EACA,UAAWC,EACX,OAAQO,KAAK,GAAG,GAnJR,IAoJZ,KA9DAC,OAAO,SAAS,CAAC,IAAI,CAAC,CAClB,MAAOV,EAAQ,KAAK,CACpB,OAAQ,CACJI,KAAAA,EACAC,KAAAA,EACA,KAAM,IAAII,OAAO,WAAW,GAC5B,GAAGH,CAAI,AACX,CACJ,GAEc,iBAAVH,GACAQ,GAGR,CAkBA,SAASA,IACLJ,eAAe,UAAU,CAACT,EAC9B,CAUA,SAASc,EAAgBX,CAAQ,EAC7B,IAAIY,EAAaN,eAAe,OAAO,CAACT,GACxC,GAAIe,EAAY,CACZ,IAAIC,EAAON,KAAK,KAAK,CAACK,GACtB,GAAIC,EAAK,QAAQ,GAAKb,EAClB,OAAOa,EAEPH,GAER,CACA,OAAO,IACX,CC7IA,SAASI,I,IAAaC,EAAAA,CAAAA,CAAAA,UAAAA,MAAAA,CAAAA,IAAAA,AAAAA,KAAAA,IAAAA,SAAAA,CAAAA,EAAAA,EAAAA,SAAAA,CAAAA,EAAAA,CAEdC,EAASC,SAAS,gBAAgB,CAAC,qBACvC,GAAID,GAAUA,EAAO,MAAM,CAAG,EAAG,CAEzBP,OAAO,WAAW,CAAC,IAAI,EACvBA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAG,EAAE,CACtCA,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,CAAG,EAAE,EAGxCA,OAAO,WAAW,CAAC,IAAI,CAAG,CAAE,UAAW,EAAE,CAAE,YAAa,EAAE,AAAC,EAE/D,IAAK,IAAIS,EAAI,EAAGA,EAAIF,EAAO,MAAM,CAAEE,IAAK,CACpC,IAAIC,EAAQH,CAAM,CAACE,EAAE,CACjBE,EAAUD,EAAM,OAAO,CAEvBA,GAASA,EAAM,SAAS,EAAIA,EAAM,SAAS,EAAIA,AAAoD,EAApDA,EAAM,SAAS,CAAC,OAAO,CAAC,2BAAiCA,AAAoC,EAApCA,EAAM,SAAS,CAAC,OAAO,CAAC,YAChIV,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAACU,EAAM,SAAS,EAElDC,EAAQ,YAAY,EACpBX,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAACW,EAAQ,YAAY,EAGzE,CACIX,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAG,GACvCM,GACAM,UAAU,IAAI,CAAC,CAAE,MAAO,mBAAoB,EAGxD,CACJ,ECxBAC,ACYO,SAAiBC,CAAY,EAC5BN,SAAS,UAAU,EAAIA,AAAwB,YAAxBA,SAAS,UAAU,CAC1CM,IAGAN,SAAS,gBAAgB,CAAC,mBAAoB,WAC1CM,GACJ,EAER,EDrBQ,YACJC,AFJG,WAEH,IAAMC,EAAoBR,SAAS,gBAAgB,CAAC,oBAEpD,IAAK,IAAIC,EAAI,EAAGA,EAAIO,EAAkB,MAAM,CAAEP,IAC1CQ,AAIR,UAA6BX,CAAI,MA0FDf,EAzF5B,IAAMG,EAAOY,EAAK,OAAO,CAAC,QAAQ,CAC5BX,EAAQW,AAAAA,CAAAA,EAAK,OAAO,CAAC,QAAQ,EAAI,GAAE,EAAG,OAAO,CAAC,OAAQ,IACtDY,EAAOZ,EAAK,OAAO,CAAC,YAAY,EAAI,GACpCa,EAAQb,EAAK,OAAO,CAAC,SAAS,EAAI,EAClCc,EAAOd,EAAK,OAAO,CAAC,YAAY,EAAI,OAEpCe,EAAaC,AADIhB,EAAK,aAAa,CAAC,iBACLX,AAAS,aAATA,EAEjC4B,EACAvB,OAAO,WAAW,CACb,gBAAgB,CAAC,cACjB,IAAI,CAAC,AAACwB,GAAQA,AAAa,WAAbA,EAAI,IAAI,EAG/B,GAAIH,EAAY,CACZ,GAAI,CAACnB,EAAgBR,GACjB,OAEJL,EAAc,CAAE,MAAO,eAAgBK,KAAAA,EAAM,KAAM,WAAYwB,KAAAA,EAAMC,MAAAA,EAAO,MAAO,KAAMC,KAAAA,CAAK,GAC9F,MACJ,CACA,IAAIK,EAsEJ,CADSvB,EADmBX,EApESG,IAuE1BQ,EAAgBX,GAAU,MAAM,EAAIQ,KAAK,GAAG,GAtEjDwB,GAAYf,SAAS,QAAQ,GAAKR,OAAO,QAAQ,CAAC,IAAI,GACxDyB,EAAU,GACVxB,KAGJ,IAAIM,EAASD,EAAK,gBAAgB,CAAC,0DAEnC,GADgBoB,MAAM,IAAI,CAACnB,GAAQ,MAAM,CAACoB,AAAAA,GAAQA,AAAgD,EAAhDA,EAAK,SAAS,CAAC,OAAO,CAAC,wBAA4B,MAAM,CAAG,EAE1G,OAAOC,AA4Bf,SAA0BC,CAAqC,MAgF7CtB,E,GAhFQsB,CAAEnC,KAAAA,CAAI,CAAEC,KAAAA,CAAI,CAAEY,OAAAA,CAAM,CAAEa,KAAAA,EAAO,MAAM,CAAE,CAArCS,EAClBnB,EAgFJ,CADcH,EA/EOA,GAmFVmB,MAAM,IAAI,CADE,IAAII,IADNJ,MAAM,IAAI,CAACnB,EAAQ,AAACwB,GAAQA,EAAI,WAAW,IAE5B,IAAI,CAAC,KAElC,KApFHrB,GACArB,EAAc,CAAE,MAAO,YAAaK,KAAAA,EAAM,KAAM,CAAC,IAAI,EAAEC,EAAK,QAAQ,CAAC,CAAE,KAAM,GAAI,MAAO,EAAKe,MAAAA,EAAOU,KAAAA,CAAK,EAEjH,EAjCgC,CAAE1B,KAAAA,EAAMC,KAAAA,EAAMY,OAAAA,EAAQa,KAAAA,CAAK,GAGvD,GADgBY,AA6EpB,SAAuBzC,CAAQ,CAAEC,CAAQ,EACrC,IAAIyC,EAAK/B,EAAgBX,SACzB,CAAI0C,GACOA,EAAG,SAAS,GAAKzC,CAGhC,EAnFkCE,EAAM,CAAC,IAAI,EAAEC,EAAK,CAAC,GAIjD,GAAI8B,EAAS,CACTnB,EAAK,gBAAgB,CAAC,QAAS,SAAU4B,CAAC,EAClCC,AA6GhB,UAAuBC,CAAQ,EAC3B,OAAQA,GACJ,IAAK,SACL,IAAK,QACL,IAAK,SACL,IAAK,WACL,IAAK,SACL,IAAK,QACL,IAAK,WACD,MAAO,EACX,SACI,MAAO,EACf,CACJ,GA1H8BF,EAAE,MAAM,CAAC,OAAO,GAAKT,IACnCpC,EAAc,CAAE,MAAO,YAAaK,KAAAA,EAAM,KAAM,QAAS,KAAM,GAAI,MAAO,EAAK,MAAO,KAAM0B,KAAAA,CAAK,GACjG/B,EAAc,CAAE,MAAO,WAAYK,KAAAA,EAAM,KAAM,CAAC,IAAI,EAAEC,EAAK,CAAC,CAAEuB,KAAAA,EAAM,MAAO,EAAK,MAAO,KAAME,KAAAA,CAAK,GAClGK,EAAU,GAElB,GACA,MACJ,CACApC,EAAc,CAAE,MAAO,WAAYK,KAAAA,EAAM,KAAM,CAAC,IAAI,EAAEC,EAAK,CAAC,CAAEuB,KAAAA,EAAM,MAAO,EAAK,MAAO,KAAME,KAAAA,CAAK,GACtG,GApD4BJ,CAAiB,CAACP,EAAE,CAEhD,IEFI4B,ADyGG,WACH,GAAIrC,OAAO,SAAS,EAAIA,OAAO,WAAW,CAAE,CAjF5CA,OAAO,wBAAwB,CAAG,SAAUsC,CAAO,CAAEC,CAAI,CAAEnC,CAAI,CAAEoC,CAAM,EACnE,IAAIC,EAAW,IAAIC,SACnBD,EAAS,MAAM,CAAC,cAAeH,GAC/BG,EAAS,MAAM,CAAC,OAAQF,GACxBE,EAAS,MAAM,CAAC,OAAQrC,GACxBqC,EAAS,MAAM,CAAC,SAAUD,GAC1B,IAAIG,EAAM,IAAIC,eACdD,EAAI,IAAI,CAAC,OAAQ,2HAA4H,IAC7IA,EAAI,kBAAkB,CAAG,WACjB,IAAI,CAAC,UAAU,GAAKC,eAAe,IAAI,EAAI,AAAgB,MAAhB,IAAI,CAAC,MAAM,EAElDC,AADS/C,KAAK,KAAK,CAAC,IAAI,CAAC,YAAY,EAC9B,OAAO,AAM1B,EACA6C,EAAI,IAAI,CAACF,EACb,EAEAzC,OAAO,mBAAmB,CAAG,SAAU8C,CAAM,EACzC,IAAIL,EAAW,IAAIC,SACnBD,EAAS,MAAM,CAAC,SAAUK,GAC1B,IAAIH,EAAM,IAAIC,eACdD,EAAI,IAAI,CAAC,OAAQ,sHAAuH,IACxIA,EAAI,kBAAkB,CAAG,WACjB,IAAI,CAAC,UAAU,GAAKC,eAAe,IAAI,EAAI,AAAgB,MAAhB,IAAI,CAAC,MAAM,EAElDC,AADS/C,KAAK,KAAK,CAAC,IAAI,CAAC,YAAY,EAC9B,OAAO,AAM1B,EACA6C,EAAI,IAAI,CAACF,EACb,EAEAzC,OAAO,sBAAsB,CAAG,SAAU+C,CAAS,CAAEC,CAAY,CAAEC,CAAa,CAAEC,CAAa,EAC3F,IAAIT,EAAW,IAAIC,SACnBD,EAAS,MAAM,CAAC,YAAaM,GAC7BN,EAAS,MAAM,CAAC,eAAgBO,GAChCP,EAAS,MAAM,CAAC,gBAAiBQ,GACjCR,EAAS,MAAM,CAAC,gBAAiBS,GACjC,IAAIP,EAAM,IAAIC,eACdD,EAAI,IAAI,CAAC,OAAQ,yHAA0H,IAC3IA,EAAI,kBAAkB,CAAG,WACjB,IAAI,CAAC,UAAU,GAAKC,eAAe,IAAI,EAAI,AAAgB,MAAhB,IAAI,CAAC,MAAM,EAElDC,AADS/C,KAAK,KAAK,CAAC,IAAI,CAAC,YAAY,EAC9B,OAAO,AAM1B,EACA6C,EAAI,IAAI,CAACF,EACb,EAEAzC,OAAO,uBAAuB,CAAG,SAAUmD,CAAU,EACjD,IAAIV,EAAW,IAAIC,SACnBD,EAAS,MAAM,CAAC,aAAcU,GAC9B,IAAIR,EAAM,IAAIC,eACdD,EAAI,IAAI,CAAC,OAAQ,0HAA2H,IAC5IA,EAAI,kBAAkB,CAAG,WACjB,IAAI,CAAC,UAAU,GAAKC,eAAe,IAAI,EAAI,AAAgB,MAAhB,IAAI,CAAC,MAAM,EAElDC,AADS/C,KAAK,KAAK,CAAC,IAAI,CAAC,YAAY,EAC9B,OAAO,AAM1B,EACA6C,EAAI,IAAI,CAACF,EACb,EAQI,IAAIW,EAAiB,IAAI5C,SAAS,gBAAgB,CAAC,2BAA2B,CAC9E,GAAI4C,EAAe,MAAM,CAAG,EACxB,IAAK,IAAI3C,EAAI,EAAGA,EAAI2C,EAAe,MAAM,CAAE3C,IAEvC,OADU2C,CAAc,CAAC3C,EAAE,CAAC,OAAO,CAAC,GAAG,EAEnC,IAAK,kBACL,IAAK,mBACDG,UAAU,IAAI,CAAC,CAAE,MAAO,cAAe,GACvC,KACJ,KAAK,oBACGZ,OAAO,WAAW,CAAC,IAAI,EACvBA,CAAAA,OAAO,WAAW,CAAC,IAAI,CAAC,cAAc,CAAG,GAAE,EAE/CY,UAAU,IAAI,CAAC,CAAE,MAAO,cAAe,EAG/C,CAKR,IAAIyC,EAAmB,IAAI7C,SAAS,gBAAgB,CAAC,+BAA+B,CACpF,GAAI6C,EAAiB,MAAM,CAAG,EAC1B,IAAK,IAAI5C,EAAI,EAAGA,EAAI4C,EAAiB,MAAM,CAAE5C,IAAK,CAC9C,IAAIE,EAAU0C,CAAgB,CAAC5C,EAAE,CAAC,OAAO,CACzC,OAAQE,EAAQ,GAAG,EACf,IAAK,yBACDC,UAAU,IAAI,CAAC,CAAE,MAAO,gBAAiB,GACzC,KACJ,KAAK,sBACDZ,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAG,CAAC,sBAAsB,CAC3DA,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,CAAGW,EAAQ,YAAY,CAC1DC,UAAU,IAAI,CAAC,CAAE,MAAO,mBAAoB,EAEpD,CACJ,CAIJ,IAAI0C,EAAmB,IAAI9C,SAAS,gBAAgB,CAAC,8BAA8B,CACnF,GAAI8C,EAAiB,MAAM,CAAG,IAC1BjD,IACIL,OAAO,WAAW,CAAC,IAAI,EAAK,EAACA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,EAAIA,AAA6C,IAA7CA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,AAAK,GAC/G,IAAK,IAAIS,EAAI,EAAGA,EAAI6C,EAAiB,MAAM,CAAE7C,IAAK,CAC9C,IAAIE,EAAU2C,CAAgB,CAAC7C,EAAE,CAAC,OAAO,CACzC,OAAQE,EAAQ,GAAG,EACf,IAAK,qBACDC,UAAU,IAAI,CAAC,CAAE,MAAO,cAAe,GACvC,KACJ,KAAK,qBACD,IAAI2C,EAAYD,CAAgB,CAAC7C,EAAE,CAAC,SAAS,CACzC8C,IACIvD,OAAO,WAAW,CAAC,IAAI,EACvBA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAG,CAACuD,EAAU,CAC/CvD,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,CAAGW,EAAQ,YAAY,EAG1DX,OAAO,WAAW,CAAC,IAAI,CAAG,CAAE,UAAW,CAACuD,EAAU,CAAE,YAAa,CAAC5C,EAAQ,YAAY,CAAC,AAAC,EAE5FC,UAAU,IAAI,CAAC,CAAE,MAAO,mBAAoB,GAGxD,CACJ,CAKR,IAAI4C,EAAwB,IAAIhD,SAAS,gBAAgB,CAAC,gCAAgC,CAC1F,GAAIgD,EAAsB,MAAM,CAAG,IAC/BnD,IACIL,OAAO,WAAW,CAAC,IAAI,EAAK,EAACA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,EAAIA,AAA6C,IAA7CA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,AAAK,GAC/G,IAAK,IAAIS,EAAI,EAAGA,EAAI+C,EAAsB,MAAM,CAAE/C,IAIrC,yBAHC+C,CAAqB,CAAC/C,EAAE,CAAC,OAAO,CAAC,GAAG,EAItCG,UAAU,IAAI,CAAC,CAAE,MAAO,cAAe,GAQ3D,IAAI6C,EAAmB,IAAIjD,SAAS,gBAAgB,CAAC,+BAA+B,CACpF,GAAIiD,EAAiB,MAAM,CAAG,EAC1B,IAAK,IAAIhD,EAAI,EAAGA,EAAIgD,EAAiB,MAAM,CAAEhD,IAAK,CAC9C,IAAIiD,EAAUD,CAAgB,CAAChD,EAAE,CAEjC,OADUgD,CAAgB,CAAChD,EAAE,CAAC,OAAO,CAAC,GAAG,EAErC,IAAK,sBAED,IAAIkD,EAAYD,EAAQ,gBAAgB,CAAC,kBACzC,GAAIC,GAAaA,EAAU,MAAM,CAAG,EAChC,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAU,MAAM,CAAEC,IAElCC,AADYF,CAAS,CAACC,EAAE,CAClB,gBAAgB,CAAC,QAAS,KACvB5D,OAAO,WAAW,CAAC,IAAI,GACxBA,OAAO,WAAW,CAAC,IAAI,CAAG,CAAE,KAAM,eAAgB,EAClDY,UAAU,IAAI,CAAC,CAAE,MAAO,WAAY,GAE5C,GAGR,KACJ,KAAK,qBACDZ,OAAO,WAAW,CAAC,IAAI,CAAG,CAAE,KAAM,gBAAiB,KAAM,SAAU,EACnEY,UAAU,IAAI,CAAC,CAAE,MAAO,cAAe,GACvC,KACJ,KAAK,yBACD,IAAIkD,EAASJ,EAAQ,OAAO,CAAC,MAAM,AACnC1D,CAAAA,OAAO,WAAW,CAAC,IAAI,CAAG,CAAE,KAAM,gBAAiB,OAAQ8D,CAAO,EAClElD,UAAU,IAAI,CAAC,CAAE,MAAO,cAAe,EAG/C,CACJ,CAIJ,IAAImD,EAAW,IAAIvD,SAAS,gBAAgB,CAAC,+BAA+B,CAC5E,GAAIuD,GAAYA,EAAS,MAAM,CAAG,EAAG,CACjC/D,OAAO,sBAAsB,CAAG,GAGhC,IAAI2D,EAAYrD,AAFLyD,CAAQ,CAAC,EAAE,CAED,gBAAgB,CAAC,kBACtC,GAAIJ,GAAaA,EAAU,MAAM,CAAG,EAChC,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAU,MAAM,CAAEC,IAElCC,AADYF,CAAS,CAACC,EAAE,CAClB,gBAAgB,CAAC,QAAS,KACvB5D,OAAO,sBAAsB,GAC9BY,UAAU,IAAI,CAAC,CAAE,MAAS,WAAY,GACtCZ,OAAO,sBAAsB,CAAG,GAExC,EAGZ,CAGA,IAAIgE,EAAoB,IAAIxD,SAAS,gBAAgB,CAAC,iCAAiC,CACvF,GAAIwD,EAAkB,MAAM,CAAG,IAC3B3D,IACIL,OAAO,WAAW,CAAC,IAAI,EAAK,EAACA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,EAAIA,AAA6C,IAA7CA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,AAAK,GAC/G,IAAK,IAAIS,EAAI,EAAGA,EAAIuD,EAAkB,MAAM,CAAEvD,IAAK,CAC/C,IAAIE,EAAUqD,CAAiB,CAACvD,EAAE,CAAC,OAAO,CAC1C,OAAQE,EAAQ,GAAG,EACf,IAAK,wBACDC,UAAU,IAAI,CAAC,CAAE,MAAO,cAAe,GACvC,KACJ,KAAK,wBACD,IAAIqD,EAAaD,CAAiB,CAACvD,EAAE,CAAC,SAAS,CAC3CwD,IACIjE,OAAO,WAAW,CAAC,IAAI,CACvBA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAG,CAACiE,EAAW,CAGhDjE,OAAO,WAAW,CAAC,IAAI,CAAG,CAAE,UAAW,CAACiE,EAAW,AAAC,EAExDjE,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,CAAGW,EAAQ,YAAY,CAC1DC,UAAU,IAAI,CAAC,CAAE,MAAO,mBAAoB,GAGxD,CACJ,CAKR,IAAIsD,EAAqB,IAAI1D,SAAS,gBAAgB,CAAC,iCAAiC,CACxF,GAAI0D,EAAmB,MAAM,CAAG,EAC5B,IAAK,IAAIzD,EAAI,EAAGA,EAAIyD,EAAmB,MAAM,CAAEzD,IAGlC,6BAFCyD,CAAkB,CAACzD,EAAE,CAAC,OAAO,CAAC,GAAG,EAGnCG,UAAU,IAAI,CAAC,CAAE,MAAO,gBAAiB,GAOzD,IAAIuD,EAA6B,IAAI3D,SAAS,gBAAgB,CAAC,0CAA0C,CACzG,GAAI2D,EAA2B,MAAM,CAAG,EACpC,IAAK,IAAI1D,EAAI,EAAGA,EAAI0D,EAA2B,MAAM,CAAE1D,IAAK,CACxD,IAAIE,EAAUwD,CAA0B,CAAC1D,EAAE,CAAC,OAAO,CACnD,OAAQE,EAAQ,GAAG,EACf,IAAK,oCACDC,UAAU,IAAI,CAAC,CAAE,MAAO,gBAAiB,GACzC,KACJ,KAAK,iCACDZ,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAG,CAAC,sBAAsB,CAC3DA,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,CAAGW,EAAQ,YAAY,CAC1DC,UAAU,IAAI,CAAC,CAAE,MAAO,mBAAoB,EAEpD,CACJ,CAIJ,IAAIwD,EAA2B,IAAI5D,SAAS,gBAAgB,CAAC,6BAA6B,CAC1F,GAAI4D,EAAyB,MAAM,CAAG,IAClC/D,IACIL,OAAO,WAAW,CAAC,IAAI,EAAK,EAACA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,EAAIA,AAA6C,IAA7CA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,AAAK,GAC/G,IAAK,IAAIS,EAAI,EAAGA,EAAI2D,EAAyB,MAAM,CAAE3D,IAGxC,yBAFC2D,CAAwB,CAAC3D,EAAE,CAAC,OAAO,CAAC,GAAG,EAGzCG,UAAU,IAAI,CAAC,CAAE,MAAO,gBAAiB,GAQ7D,IAAIyD,EAA2B,IAAI7D,SAAS,gBAAgB,CAAC,wCAAwC,CACrG,GAAI6D,EAAyB,MAAM,CAAG,EAClC,IAAK,IAAI5D,EAAI,EAAGA,EAAI4D,EAAyB,MAAM,CAAE5D,IAAK,CACtD,IAAIE,EAAU0D,CAAwB,CAAC5D,EAAE,CAAC,OAAO,AAExC,kCADDE,EAAQ,GAAG,GAEXX,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAG,yBAChCA,OAAO,WAAW,CAAC,IAAI,CAAC,YAAY,CAAG,CAAC,mBAAmB,CAC3DA,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAGW,EAAQ,YAAY,CACtDC,UAAU,IAAI,CAAC,CAAE,MAAO,sBAAuB,GAG3D,CAIJ,IAAI0D,EAAqB,IAAI9D,SAAS,gBAAgB,CAAC,iCAAiC,CACxF,GAAI8D,EAAmB,MAAM,CAAG,EAC5B,IAAK,IAAI7D,EAAI,EAAGA,EAAI6D,EAAmB,MAAM,CAAE7D,IAAK,CAChD,IAAIE,EAAU2D,CAAkB,CAAC7D,EAAE,CAAC,OAAO,AAElC,2BADDE,EAAQ,GAAG,GAEXX,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAG,kBAChCA,OAAO,WAAW,CAAC,IAAI,CAAC,YAAY,CAAG,CAAC,mBAAmB,CAC3DA,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAGW,EAAQ,YAAY,CACtDC,UAAU,IAAI,CAAC,CAAE,MAAO,sBAAuB,GAG3D,CAIJ,IAAI2D,EAAkB,IAAI/D,SAAS,gBAAgB,CAAC,8BAA8B,CAClF,GAAI+D,EAAgB,MAAM,CAAG,EAAG,CAGxBvE,OAAO,WAAW,CAAC,IAAI,EACvBA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAG,EAAE,CACtCA,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,CAAG,EAAE,EAGxCA,OAAO,WAAW,CAAC,IAAI,CAAG,CAAE,UAAW,EAAE,CAAE,YAAa,EAAE,AAAC,EAG/DK,IAEA,IAAK,IAAII,EAAI,EAAGA,EAAI8D,EAAgB,MAAM,CAAE9D,IAExC,OADU8D,CAAe,CAAC9D,EAAE,CAAC,OAAO,CAAC,GAAG,EAEpC,IAAK,qBACL,IAAK,qBACDG,UAAU,IAAI,CAAC,CAAE,MAAO,cAAe,GACvC,KACJ,KAAK,qBACDZ,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAG,CAAC,0BAA0B,CAC/DA,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,CAAGuE,CAAe,CAAC9D,EAAE,CAAC,OAAO,CAAC,YAAY,CAC7EG,UAAU,IAAI,CAAC,CAAE,MAAO,mBAAoB,GAC5C,KACJ,KAAK,uBACD,IAAIkD,EAAShE,KAAK,KAAK,CAACyE,CAAe,CAAC9D,EAAE,CAAC,OAAO,CAAC,MAAM,EACrDqD,GAAUA,EAAO,MAAM,CAAG,GAC1B9D,CAAAA,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,CAAG8D,CAAK,EAE1ClD,UAAU,IAAI,CAAC,CAAE,MAAO,gBAAiB,GACzC,KACJ,KAAK,qBACDA,UAAU,IAAI,CAAC,CAAE,MAAO,qBAAsB,EAGtD,CAER,CAGA,IAAI4D,EAA8B,IAAIhE,SAAS,gBAAgB,CAAC,sCAAsC,CACtG,GAAIgE,EAA4B,MAAM,CAAG,EAAG,CAGpCxE,OAAO,WAAW,CAAC,IAAI,EACvBA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAG,EAAE,CACtCA,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,CAAG,EAAE,EAGxCA,OAAO,WAAW,CAAC,IAAI,CAAG,CAAE,UAAW,EAAE,CAAE,YAAa,EAAE,AAAC,EAG/DK,IAEA,IAAK,IAAII,EAAI,EAAGA,EAAI+D,EAA4B,MAAM,CAAE/D,IAG3C,+BAFC+D,CAA2B,CAAC/D,EAAE,CAAC,OAAO,CAAC,GAAG,GAG5CT,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAG,CAAC,0BAA0B,CAC/DA,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,CAAGwE,CAA2B,CAAC/D,EAAE,CAAC,OAAO,CAAC,YAAY,CACzFG,UAAU,IAAI,CAAC,CAAE,MAAO,mBAAoB,GAK5D,CAGA,IAAI6D,EAA6B,IAAIjE,SAAS,gBAAgB,CAAC,qCAAqC,CACpG,GAAIiE,EAA2B,MAAM,CAAG,EAAG,CAGnCzE,OAAO,WAAW,CAAC,IAAI,EACvBA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAG,EAAE,CACtCA,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,CAAG,EAAE,EAGxCA,OAAO,WAAW,CAAC,IAAI,CAAG,CAAE,UAAW,EAAE,CAAE,YAAa,EAAE,AAAC,EAG/DK,IAEA,IAAK,IAAII,EAAI,EAAGA,EAAIgE,EAA2B,MAAM,CAAEhE,IAG1C,8BAFCgE,CAA0B,CAAChE,EAAE,CAAC,OAAO,CAAC,GAAG,GAG3CT,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAG,CAAC,2BAA2B,CAChEA,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,CAAGyE,CAA0B,CAAChE,EAAE,CAAC,OAAO,CAAC,YAAY,CACxFG,UAAU,IAAI,CAAC,CAAE,MAAO,mBAAoB,GAK5D,CAGA,IAAI8D,EAA0B,IAAIlE,SAAS,gBAAgB,CAAC,uCAAuC,CACnG,GAAIkE,EAAwB,MAAM,CAAG,EAAG,CAEhC1E,OAAO,WAAW,CAAC,IAAI,EACvBA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAG,EAAE,CACtCA,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,CAAG,EAAE,EAGxCA,OAAO,WAAW,CAAC,IAAI,CAAG,CAAE,UAAW,EAAE,CAAE,YAAa,EAAE,AAAC,EAG/DK,IAEA,IAAK,IAAII,EAAI,EAAGA,EAAIiE,EAAwB,MAAM,CAAEjE,IAGhD,OAFUiE,CAAuB,CAACjE,EAAE,CAAC,OAAO,CAAC,GAAG,EAG5C,IAAK,gCACDG,UAAU,IAAI,CAAC,CAAE,MAAO,cAAe,GACvC,KACJ,KAAK,iCACDA,UAAU,IAAI,CAAC,CAAE,MAAO,gBAAiB,EAIjD,CAER,CACJ,CACJ,IG5eqBJ,SAAS,cAAc,CAAC,eAGjCR,OAAO,WAAW,EAAI,CAACA,OAAO,WAAW,CAAC,IAAI,GAC9CA,OAAO,WAAW,CAAC,IAAI,CAAG,CACtB,KAAM,mBACN,KAAM,OACV,EACAA,OAAO,WAAW,CAAC,eAAe,CAAG,CACjC,MAAO,IACP,MAAO,kBACX,EACAA,OAAO,WAAW,CAAC,YAAY,CAAG,CAC9B,MAAO,IACP,MAAO,GACX,EFNZ,E"}