Ihr Bauforum: Bauberatung von WeberHaus
Ob bei der Grundstückssuche oder -beurteilung, bei der Umsetzung Ihrer architektonischen Ideen oder bei Fragen zu Energiekonzepten und Fördermöglichkeiten: Ihr persönlicher Bauberater im WeberHaus Bauforum in Ihrer Nähe berät Sie gerne in einem persönlichen Gespräch. Einfach telefonisch einen Termin vereinbaren!
CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3aC1iYXVmb3J1bS1nb29nbGUtbWFwcy1jb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imhlcm8taW1hZ2UtY29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2gtYmF1Zm9ydW0tZmlsdGVyLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBuYW1lPSJiYXVmb3J1bVNlYXJjaEZvcm0iIGlkPSJiYXVmb3J1bVNlYXJjaEZvcm0iIGFjdGlvbj0iL2FqYXgvP3NlYXJjaC1iYXVmb3J1bT0xIiBtZXRob2Q9IlBPU1QiIGRhdGEtcGFyc2xleS12YWxpZGF0ZT0iIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0icmVxdWVzdC1kYXRhIiBjbGFzcz0iZC1ub25lIiBkYXRhLXppcD0iIiBkYXRhLWNvdW50cnk9IkNIIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZpbHRlci1pdGVtcy13cmFwcGVyIGhpZGUtcmFkaXVzLXNlYXJjaCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWRkcmVzcy1zZWFyY2gtd3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImFkZHJlc3NTZWFyY2giIGNsYXNzPSJmb3JtLWxhYmVsIj5BZHJlc3NlPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWRkcmVzcy1zZWFyY2gtcGFyc2xleS13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ0eF93aGJhdWZvcnVtX21hcHNfYWRkcmVzcyIgaWQ9ImFkZHJlc3NTZWFyY2giIHBsYWNlaG9sZGVyPSJQTFogLi4uIiBjbGFzcz0iZm9ybS1jb250cm9sIiBkYXRhLXBhcnNsZXktZXJyb3JzLWNvbnRhaW5lcj0iI2FkZHJlc3Mtc2VhcmNoLWVycm9yLWNvbnRhaW5lciIgZGF0YS1wYXJzbGV5LWN1c3RvbTEwMz0iMSIgZGF0YS1wYXJzbGV5LWVycm9yLW1lc3NhZ2U9IkJpdHRlIGfDvGx0aWdlIFBMWiBlaW5nZWJlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJhZGRyZXNzLXNlYXJjaC1lcnJvci1jb250YWluZXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3VudHJ5LXNlYXJjaC13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY291bnRyeVNlYXJjaCIgY2xhc3M9ImZvcm0tbGFiZWwiPkxhbmQ8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJjb3VudHJ5U2VhcmNoIiBjbGFzcz0iZm9ybS1zZWxlY3QiIG5hbWU9InR4X3doYmF1Zm9ydW1fbWFwc19jb3VudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkQiPkRldXRzY2hsYW5kPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJMIj5MdXhlbWJ1cmc8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkNIIj5TY2h3ZWl6PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imdlb2xvY2F0aW9uLXNlYXJjaC13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb3JtLWNoZWNrLWxhYmVsIiBmb3I9Imdlb2xvY2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFaWdlbmVuIFN0YW5kb3J0IHZlcndlbmRlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9Imdlb2xvY2F0aW9uIiBuYW1lPSJnZW9sb2NhdGlvbiIgdmFsdWU9IjEiIGNsYXNzPSJmb3JtLWNoZWNrLWlucHV0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2hlY2ttYXJrIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InR4X3doYmF1Zm9ydW1fbWFwc19sYXQiIGlkPSJsYXQiIHZhbHVlPSIwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0eF93aGJhdWZvcnVtX21hcHNfbG9uIiBpZD0ibG9uIiB2YWx1ZT0iMCIgLz4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Imdlb2xvY2F0aW9uLWxvYWQiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij5TdGFuZG9ydCB3aXJkIGVybWl0dGVsdC4uLjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJnZW9sb2NhdGlvbi1lcnJvciIgcm9sZT0ic3RhdHVzIiBkYXRhLWRlbmllZD0iQml0dGUgZXJsYXViZW4gU2llIGRlbiBadWdyaWZmIGF1ZiBJaHJlbiBTdGFuZG9ydCBvZGVyIGdlYmVuIFNpZSBJaHJlIFBMWiBlaW4uIiBkYXRhLXVuYXZhaWxhYmxlPSJJaHIgU3RhbmRvcnQga29ubnRlIG5pY2h0IGVybWl0dGVsdCB3ZXJkZW4uIEJpdHRlIGdlYmVuIFNpZSBJaHJlIFBMWiBlaW4uIiBkYXRhLXRpbWVvdXQ9IkRpZSBTdGFuZG9ydGVybWl0dGx1bmcgZGF1ZXJ0IHp1IGxhbmdlLiBCaXR0ZSBnZWJlbiBTaWUgSWhyZSBQTFogZWluLiI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0eF93aGJhdWZvcnVtX21hcHNfcmFkaXVzIiBpZD0icmFkaXVzIiB2YWx1ZT0iMCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3VibWl0LWJ1dHRvbi13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIHRpdGxlPSJCYXVmb3J1bSBzdWNoZW4iIGFyaWEtbGFiZWw9IkJhdWZvcnVtIHN1Y2hlbiIgY2xhc3M9ImJ0bi1wcmltYXJ5IiBpZD0ic2VhcmNoTG9jYXRpb24iPkJhdWZvcnVtIHN1Y2hlbjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibWFwLWFuY2hvciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IndoLWNvbnRlbnQtY29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ29vZ2xlLW1hcHMtZ3JpZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYXAtY29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJtYXAiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJiYXVmb3Jlbi1hamF4LWxpc3Qtd3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iYmF1Zm9yZW5BamF4TGlzdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlYXJjaC1pbml0LWluZm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5pdC1pbmZvLWljb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQTAwMDAwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTIxIDEwYzAgNy05IDEzLTkgMTNzLTktNi05LTEzYTkgOSAwIDAgMSAxOCAweiIgLz48Y2lyY2xlIGN4PSIxMiIgY3k9IjEwIiByPSIzIiAvPjwvc3ZnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbml0LWluZm8tdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0dGUgZ2ViZW4gU2llIGbDvHIgZWluZSBBdWZsaXN0dW5nIHZvbiBCYXVmb3JlbiBpbiBJaHJlciBOw6RoZSBJaHJlIDxzdHJvbmc+UExaPC9zdHJvbmc+IHVuZCBkZW4gZ2V3w7xuc2NodGVuIDxzdHJvbmc+VW1rcmVpczwvc3Ryb25nPiBhbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJuby1yZXN1bHRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2VpbmUgRXJnZWJuaXNzZSBnZWZ1bmRlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImxvYWRpbmctYW5pbWF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0ibG9hZGluZy1hbmltYXRpb24iIGFsdD0iV2ViZXJIYXVzIExvZ28gTGFkZS1BbmltYXRpb24iIHRpdGxlPSJXZWJlckhhdXMgTG9nbyBMYWRlLUFuaW1hdGlvbiIgc3JjPSIvX2Fzc2V0cy9hMDZkYThkOTNlM2JjODM3MjJhNzI4MmRmZTY4NDQ3Ny9JbWFnZXMvZ2lmX1dlYmVySGF1cy1pY29uLWxvYWRpbmcuZ2lmIiB3aWR0aD0iODAiIGhlaWdodD0iODAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vbWFwcy5nb29nbGVhcGlzLmNvbS9tYXBzL2FwaS9qcz9rZXk9QUl6YVN5QUxQY2UxQ1lRdk5SNFdMdFhvZDVGVjFRQ0JaNjl5MkxRJmxvYWRpbmc9YXN5bmMmY2FsbGJhY2s9aW5pdE1hcCI+PC9zY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hcmtlcnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50ZWQgb24gZXZlcnkgY2hlY2tib3ggY2hhbmdlLCBzbyBhIGxhdGUgZ2VvbG9jYXRpb24gb3IgZ2VvY29kZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5zd2VyIGZyb20gYW4gZWFybGllciBhdHRlbXB0IGlzIGlnbm9yZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnZW9sb2NhdGlvblJlcXVlc3RJZCA9IDA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9SZXN1bHRzU3RyaW5nID0gJCgnI25vLXJlc3VsdHMnKS5odG1sKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb29nbGUgY2FsbHMgdGhpcyBnbG9iYWwgd2hlbiB0aGUgQVBJIGtleSBpcyBpbnZhbGlkIG9yIHRoZSBIVFRQIHJlZmVycmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBhbGxvd2VkIChSZWZlcmVyTm90QWxsb3dlZE1hcEVycm9yKS4gSW4gdGhhdCBjYXNlIGdvb2dsZS5tYXBzIHN0aWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRzLCBzbyB3ZSBmbGFnIHRoZSBmYWlsdXJlIGV4cGxpY2l0bHkgYW5kIGRlZ3JhZGUgdG8gYSBsaXN0LW9ubHkgc2VhcmNoLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZ21fYXV0aEZhaWx1cmUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX3doTWFwc0F1dGhGYWlsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkdvb2dsZSBNYXBzIGF1dGggZmFpbGVkIChpbnZhbGlkIGtleSBvciByZWZlcnJlcikuIEZhbGxpbmcgYmFjayB0byBsaXN0LW9ubHkgc2VhcmNoLiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2l0aCBsb2FkaW5nPWFzeW5jIHRoZSBjYWxsYmFjayBvbmx5IHNpZ25hbHMgdGhhdCB0aGUgbG9hZGVyIGlzIHJlYWR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGlicmFyaWVzIHdlIHVzZSAoTWFwLCBHZW9jb2RlciwgTWFya2VyKSBhcmUgaW1wb3J0ZWQgZXhwbGljaXRseS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gaW5pdE1hcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGUubWFwcy5pbXBvcnRMaWJyYXJ5KCdtYXBzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZS5tYXBzLmltcG9ydExpYnJhcnkoJ2dlb2NvZGluZycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGUubWFwcy5pbXBvcnRMaWJyYXJ5KCdtYXJrZXInKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiR29vZ2xlIE1hcHMgbGlicmFyaWVzIGNvdWxkIG5vdCBiZSBsb2FkZWQuIEZhbGxpbmcgYmFjayB0byBsaXN0LW9ubHkgc2VhcmNoLiIsIGVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXAnKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcjoge2xhdDogNDguNjE4Njg1NCwgbG5nOiA3Ljg5MDgwNjZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX3doTWFwc1JlYWR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbWFwc0F2YWlsYWJsZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuX193aE1hcHNSZWFkeSA9PT0gdHJ1ZSAmJiAhd2luZG93Ll9fd2hNYXBzQXV0aEZhaWxlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY2xlYXJNYXJrZXJzKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmtlcnNbaV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Vyc1tpXS5zZXRNYXAobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VycyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdldEh0bWxUZW1wbGF0ZShpdGVtLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFuZ0xhYmVscyA9ICQoJyNsYW5nLWxhYmVscycpLmRhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtTmFtZTEgPSBpdGVtLnRlYW1OYW1lMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtTmFtZTIgPSBpdGVtLnRlYW1OYW1lMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtTmFtZTMgPSBpdGVtLnRlYW1OYW1lMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtQ2l0eSA9IGl0ZW0udGVhbUNpdHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbVBob25lMSA9IGl0ZW0udGVhbVBob25lMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtUGhvbmVIcmVmID0gaXRlbS50ZWFtUGhvbmUxLnJlcGxhY2UoL1xzL2csJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1aaXBDb2RlID0gaXRlbS50ZWFtWmlwQ29kZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtU3RyZWV0ID0gaXRlbS50ZWFtU3RyZWV0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvcnVtVWlkID0gaXRlbS5mb3J1bVVpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3J1bVVybCA9IGl0ZW0uZm9ydW1QYWdlVXJpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb24gPSAnPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNBMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMjEgMTBjMCA3LTkgMTMtOSAxM3MtOS02LTktMTNhOSA5IDAgMCAxIDE4IDB6IiAvPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTAiIHI9IjMiIC8+PC9zdmc+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaXN0YW5jZSA9IGl0ZW0uZGlzdGFuY2UgKyAnIGttJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaXN0YW5jZVZpc2liaWxpdHlDbGFzcyA9ICdkLWJsb2NrJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uZGlzdGFuY2UgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZVZpc2liaWxpdHlDbGFzcyA9ICdkLW5vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGh0bWxzdHJpbmcgPSAnJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sc3RyaW5nICs9ICcnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iZ20tYmF1Zm9ydW0taXRlbSI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImdtLWJhdWZvcnVtLWl0ZW0tY29udGVudCI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InRlYW0tbmFtZS0xIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ydW1VcmwgIT09ICIiID8gJzxhIGhyZWY9IicgKyBmb3J1bVVybCArICciIGNsYXNzPSJnbS1iYXVmb3J1bS1saW5rIiB0aXRsZT0iJyArIHRlYW1OYW1lMSArICciPicgKyB0ZWFtTmFtZTEgKyAnPC9hPicgOiAnJyArIHRlYW1OYW1lMSArICcnKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ0ZWFtLW5hbWUtMiI+JyArIHRlYW1OYW1lMiArICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0idGVhbS1uYW1lLTMiPicgKyB0ZWFtTmFtZTMgKyAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InRlYW0tc3RyZWV0Ij4nICsgdGVhbVN0cmVldCArICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0idGVhbS1hZGRyZXNzIj4nICsgdGVhbVppcENvZGUgKyAnICcgKyB0ZWFtQ2l0eSArICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0idGVhbS1waG9uZS1jb250YWluZXIiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJwaG9uZS1sYWJlbCI+VGVsOjwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJwaG9uZS1udW1iZXJzIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGEgaHJlZj0idGVsOicgKyB0ZWFtUGhvbmVIcmVmICsgJyIgY2xhc3M9ImdtLWJhdWZvcnVtLWxpbmsiIHRpdGxlPSInICsgdGVhbVBob25lMSArICciPicgKyB0ZWFtUGhvbmUxICsgJzwvYT4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iZ20tYmF1Zm9ydW0taXRlbS1kaXN0YW5jZSI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImRpc3RhbmNlLWxhYmVsICcgKyBkaXN0YW5jZVZpc2liaWxpdHlDbGFzcyArICciPicrbGFuZ0xhYmVsc1siZGlzdGFuY2UiXSsnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImRpc3RhbmNlLXZhbHVlICcgKyBkaXN0YW5jZVZpc2liaWxpdHlDbGFzcyArICciPicgKyBkaXN0YW5jZS5yZXBsYWNlKCIuIiwgIiwiKSArICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImdtLWJhdWZvcnVtLWl0ZW0taWNvbiIgaWQ9ImJhdWZvcnVtLWl0ZW0tJyArIGZvcnVtVWlkICsgJyI+JyArIGljb24gKyAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxzdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdldEluZm9XaW5kb3dIdG1sKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtTmFtZTEgPSBpdGVtLnRlYW1OYW1lMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtTmFtZTIgPSBpdGVtLnRlYW1OYW1lMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtTmFtZTMgPSBpdGVtLnRlYW1OYW1lMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtQ2l0eSA9IGl0ZW0udGVhbUNpdHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbVBob25lMSA9IGl0ZW0udGVhbVBob25lMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtUGhvbmVIcmVmID0gaXRlbS50ZWFtUGhvbmUxLnJlcGxhY2UoL1xzL2csJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1aaXBDb2RlID0gaXRlbS50ZWFtWmlwQ29kZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtU3RyZWV0ID0gaXRlbS50ZWFtU3RyZWV0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvcnVtVXJsID0gaXRlbS5mb3J1bVBhZ2VVcmk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZm9XaW5kb3dIdG1sID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvV2luZG93SHRtbCArPSAnPGRpdiBjbGFzcz0iaW5mby13aW5kb3ctd3JhcHBlciI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9XaW5kb3dIdG1sICs9ICc8ZGl2IGNsYXNzPSJpbmZvLXRlYW0tbmFtZS0xIj4nICsgKGZvcnVtVXJsICE9PSAiIiA/ICc8YSBocmVmPSInICsgZm9ydW1VcmwgKyAnIiBjbGFzcz0iZ20tYmF1Zm9ydW0tbGluayIgdGl0bGU9IicgKyB0ZWFtTmFtZTEgKyAnIj4nICsgdGVhbU5hbWUxICsgJzwvYT4nIDogJycgKyB0ZWFtTmFtZTEgKyAnJykgKyAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9XaW5kb3dIdG1sICs9ICc8ZGl2IGNsYXNzPSJpbmZvLXRlYW0tbmFtZS0yIj4nICsgdGVhbU5hbWUyICsgJzwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvV2luZG93SHRtbCArPSAnPGRpdiBjbGFzcz0iaW5mby10ZWFtLW5hbWUtMyI+JyArIHRlYW1OYW1lMyArICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1dpbmRvd0h0bWwgKz0gJzxkaXYgY2xhc3M9ImluZm8tdGVhbS1zdHJlZXQiPicgKyB0ZWFtU3RyZWV0ICsgJzwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvV2luZG93SHRtbCArPSAnPGRpdiBjbGFzcz0iaW5mby10ZWFtLWFkZHJlc3MiPicgKyB0ZWFtWmlwQ29kZSArICcgJyArIHRlYW1DaXR5ICsgJzwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvV2luZG93SHRtbCArPSAnPGRpdiBjbGFzcz0iaW5mby10ZWFtLXBob25lLWNvbnRhaW5lciI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9XaW5kb3dIdG1sICs9ICc8ZGl2IGNsYXNzPSJpbmZvLXBob25lLWxhYmVsIj5UZWw6PC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9XaW5kb3dIdG1sICs9ICc8ZGl2IGNsYXNzPSJpbmZvLXBob25lLW51bWJlcnMiPjxhIGhyZWY9InRlbDonICsgdGVhbVBob25lSHJlZiArICciIGNsYXNzPSJnbS1iYXVmb3J1bS1saW5rIiB0aXRsZT0iJyArIHRlYW1QaG9uZTEgKyAnIj4nICsgdGVhbVBob25lMSArICc8L2E+PC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9XaW5kb3dIdG1sICs9ICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1dpbmRvd0h0bWwgKz0gJzwvZGl2Pic7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm9XaW5kb3dIdG1sOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzdGFydFNlYXJjaCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3JtID0gJCgnI2JhdWZvcnVtU2VhcmNoRm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJhdWZvcmVuQWpheExpc3QgPSAkKCcjYmF1Zm9yZW5BamF4TGlzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vUmVzdWx0c0NvbnRhaW5lciA9ICQoJyNuby1yZXN1bHRzJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF1Zm9yZW5BamF4TGlzdC5odG1sKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNsb2FkaW5nLWFuaW1hdGlvbicpLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZW9sb2NhdGlvbi1sb2FkJykuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR29vZ2xlIE1hcHMgbWF5IGJlIHVuYXZhaWxhYmxlIChlLmcuIHRoZSBBUEkga2V5IGlzIG5vdCB2YWxpZCBmb3IgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGRvbWFpbikuIFRoZSBmb3J1bSBzZWFyY2ggaXRzZWxmIGlzIHNlcnZlci1zaWRlIGFuZCBkb2VzIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCBNYXBzLCBzbyB3ZSBkZWdyYWRlIGdyYWNlZnVsbHk6IHJlbmRlciB0aGUgcmVzdWx0IGxpc3Qgd2l0aG91dCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcCwgbWFya2VycyBhbmQgZGlzdGFuY2Ugc29ydGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1c2VNYXBzID0gbWFwc0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZm93aW5kb3cgPSB1c2VNYXBzID8gbmV3IGdvb2dsZS5tYXBzLkluZm9XaW5kb3coewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsT2Zmc2V0OiBuZXcgZ29vZ2xlLm1hcHMuU2l6ZSgtNSwgLTIwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNYXJrZXJzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLnBvc3QoZm9ybS5hdHRyKCdhY3Rpb24nKSwgZm9ybS5zZXJpYWxpemUoKSwgZnVuY3Rpb24ocmVzcG9uc2UpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlWydlbXB0eSddID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNsb2FkaW5nLWFuaW1hdGlvbicpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ub1Jlc3VsdHNDb250YWluZXIuY3NzKCdkaXNwbGF5JywnZmxleCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2JhdWZvcmVuQWpheExpc3QuYXBwZW5kKG5vUmVzdWx0c0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdWZvcmVuQWpheExpc3QuaHRtbCgnPGRpdiBjbGFzcz0ibm8tcmVzdWx0cyI+JyArIG5vUmVzdWx0c1N0cmluZyArICc8L2Rpdj4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWFwQm91bmRzID0gdXNlTWFwcyA/IG5ldyBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMoKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyhyZXNwb25zZSkubGVuZ3RoICE9PSAwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vUmVzdWx0c0NvbnRhaW5lci5jc3MoJ2Rpc3BsYXknLCdub25lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gocmVzcG9uc2UsIGZ1bmN0aW9uKGksIGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjbG9hZGluZy1hbmltYXRpb24nKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF1Zm9yZW5BamF4TGlzdC5hcHBlbmQoZ2V0SHRtbFRlbXBsYXRlKGl0ZW0sIGkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZU1hcHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gbWFwOiBsaXN0IGVudHJ5IGlzIGVub3VnaC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWFya2VyID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGl0ZW0ubGF0LCBpdGVtLmxvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnL19hc3NldHMvYTA2ZGE4ZDkzZTNiYzgzNzIyYTcyODJkZmU2ODQ0NzcvSW1hZ2VzL2ljb25fbWFwLXBpbi1zb2xpZC5wbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246IGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5EUk9QLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbl9pZDogaXRlbS5mb3J1bVVpZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcnMucHVzaChtYXJrZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJvdW5kcy5leHRlbmQobWFya2VyLnBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5mb1dpbmRvd0NvbnRlbnQgPSBnZXRJbmZvV2luZG93SHRtbChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmF1Rm9ydW1JdGVtID0gJCgnI2JhdWZvcnVtLWl0ZW0tJyArIGl0ZW0uZm9ydW1VaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdUZvcnVtSXRlbS5iaW5kKCdjbGljaycsIG1hcmtlciwgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG1hcmtlcnMsIGZ1bmN0aW9uKGksIG1hcmtlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLnNldEFuaW1hdGlvbihudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuc2V0QW5pbWF0aW9uKGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5CT1VOQ0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvd2luZG93LnNldENvbnRlbnQoaW5mb1dpbmRvd0NvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvd2luZG93Lm9wZW4obWFwLCBtYXJrZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWFwRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYXAtYW5jaG9yIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcEVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOiAic21vb3RoIiwgYmxvY2s6ICJzdGFydCJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGUubWFwcy5ldmVudC5hZGRMaXN0ZW5lcihtYXJrZXIsICdjbGljaycsIChmdW5jdGlvbihtYXJrZXIsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG1hcmtlcnMsIGZ1bmN0aW9uKGksIG1hcmtlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5zZXRBbmltYXRpb24obnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5zZXRBbmltYXRpb24oZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkJPVU5DRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvd2luZG93LnNldENvbnRlbnQoaW5mb1dpbmRvd0NvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3dpbmRvdy5vcGVuKG1hcCwgbWFya2VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKG1hcmtlciwgaSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlTWFwcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5maXRCb3VuZHMobWFwQm91bmRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihPYmplY3Qua2V5cyhyZXNwb25zZSkubGVuZ3RoID09PSAxKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNldE9wdGlvbnMoeyB6b29tOiAxNiB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWFyY2hGb3JtID0gJCgnI2JhdWZvcnVtU2VhcmNoRm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcXVlc3REYXRhID0gJCgnI3JlcXVlc3QtZGF0YScpLmRhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6aXBDb2RlID0gcmVxdWVzdERhdGFbJ3ppcCddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50cnlTaG9ydENvZGUgPSByZXF1ZXN0RGF0YVsnY291bnRyeSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY291bnRyeVNob3J0Q29kZSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjY291bnRyeVNlYXJjaCcpLnZhbChjb3VudHJ5U2hvcnRDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHppcENvZGUgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2FkZHJlc3NTZWFyY2gnKS52YWwoemlwQ29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNlYXJjaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDMwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXJjaEluZm9IdG1sID0gJCgnI2JhdWZvcmVuQWpheExpc3QnKS5odG1sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vbignc3VibWl0Jywgc2VhcmNoRm9ybSxmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgemlwQ29kZVN0cmluZyA9ICQoJyNhZGRyZXNzU2VhcmNoJykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHppcGNvZGVSZWdleCA9IG5ldyBSZWdFeHAoIl4oWzAtOV17NCw1fSkkIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrID0gemlwY29kZVJlZ2V4LnRlc3QoemlwQ29kZVN0cmluZyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6aXBDb2RlU3RyaW5nLmxlbmd0aCA+IDAgJiYgY2hlY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHNBdmFpbGFibGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRkcmVzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhZGRyZXNzU2VhcmNoIikudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9jb2Rlci5nZW9jb2RlKCB7ICdhZGRyZXNzJzogYWRkcmVzc30sIGZ1bmN0aW9uKHJlc3VsdHMsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IGdvb2dsZS5tYXBzLkdlb2NvZGVyU3RhdHVzLk9LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNsYXQnKS52YWwocmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbi5sYXQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNsb24nKS52YWwocmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbi5sbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VhcmNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiR2VvY29kZSB3YXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29uOiAiICsgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZWFyY2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFwcyB1bmF2YWlsYWJsZTogc2VhcmNoIGJ5IHppcCBjb2RlIG9ubHkgKG5vIGRpc3RhbmNlIHNvcnRpbmcpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2xhdCcpLnZhbCgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNsb24nKS52YWwoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNlYXJjaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2xhdCcpLnZhbCgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2xvbicpLnZhbCgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZWFyY2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZWF2ZXMgdGhlIGdlb2xvY2F0aW9uIG1vZGUgc28gdGhlIHVzZXIgY2FuIHR5cGUgYSB6aXAgY29kZSByaWdodCBhd2F5LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2VvbG9jYXRpb25GYWlsZWQobWVzc2FnZUtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvckNvbnRhaW5lciA9ICQoJyNnZW9sb2NhdGlvbi1lcnJvcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZW9sb2NhdGlvbi1sb2FkJykuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZW9sb2NhdGlvbicpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2FkZHJlc3NTZWFyY2gnKS5hdHRyKCJyZWFkb25seSIsIGZhbHNlKS50cmlnZ2VyKCdmb2N1cycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29udGFpbmVyLnRleHQoZXJyb3JDb250YWluZXIuZGF0YShtZXNzYWdlS2V5KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZmluZEFkZHJlc3NDb21wb25lbnQocmVzdWx0LCB0eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5hZGRyZXNzX2NvbXBvbmVudHMuZmluZChmdW5jdGlvbiAoY29tcG9uZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQudHlwZXMuaW5kZXhPZih0eXBlKSAhPT0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkub24oJ2NoYW5nZScsICcjZ2VvbG9jYXRpb24nLGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdElkID0gKytnZW9sb2NhdGlvblJlcXVlc3RJZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNDdXJyZW50UmVxdWVzdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RJZCA9PT0gZ2VvbG9jYXRpb25SZXF1ZXN0SWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tZXJyb3InKS50ZXh0KCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5pcygnOmNoZWNrZWQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjYWRkcmVzc1NlYXJjaCcpLmF0dHIoInJlYWRvbmx5IiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZW9sb2NhdGlvbi1sb2FkJykuY3NzKCdkaXNwbGF5JywnZmxleCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoJ2dlb2xvY2F0aW9uJyBpbiBuYXZpZ2F0b3IpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9sb2NhdGlvbkZhaWxlZCgndW5hdmFpbGFibGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihmdW5jdGlvbihwb3NpdGlvbil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudFJlcXVlc3QoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWFwc0F2YWlsYWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV2ZXJzZSBnZW9jb2RpbmcgKGNvb3JkcyAtPiB6aXApIG5lZWRzIE1hcHM7IGNhbm5vdCBjb250aW51ZSB3aXRob3V0IGl0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJNYXBzIHVuYXZhaWxhYmxlOiBnZW9sb2NhdGlvbiBzZWFyY2ggbmVlZHMgdGhlIE1hcHMgQVBJLiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2xvY2F0aW9uRmFpbGVkKCd1bmF2YWlsYWJsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvaW50ID0gbmV3IGdvb2dsZS5tYXBzLkxhdExuZyhwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUsIHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydsb2NhdGlvbic6IHBvaW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0cywgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50UmVxdWVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHJlc3VsdCBpcyBub3QgYWx3YXlzIHRoZSBvbmUgY2FycnlpbmcgdGhlIHppcCBjb2RlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gKHN0YXR1cyA9PT0gZ29vZ2xlLm1hcHMuR2VvY29kZXJTdGF0dXMuT0sgJiYgcmVzdWx0cykgPyByZXN1bHRzLmZpbmQoZnVuY3Rpb24gKGNhbmRpZGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhZmluZEFkZHJlc3NDb21wb25lbnQoY2FuZGlkYXRlLCAncG9zdGFsX2NvZGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb3N0YWxDb2RlID0gZmluZEFkZHJlc3NDb21wb25lbnQocmVzdWx0LCAncG9zdGFsX2NvZGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3VudHJ5Q29kZSA9IGZpbmRBZGRyZXNzQ29tcG9uZW50KHJlc3VsdCwgJ2NvdW50cnknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3VudHJ5U2VsZWN0ID0gJCgnI2NvdW50cnlTZWFyY2gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChjb3VudHJ5Q29kZSA/IGNvdW50cnlDb2RlLnNob3J0X25hbWUgOiAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RFJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeVNlbGVjdC52YWwoJ0QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ0gnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5U2VsZWN0LnZhbCgnQ0gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTFUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5U2VsZWN0LnZhbCgnTCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5U2VsZWN0LnZhbCgnRCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI2FkZHJlc3NTZWFyY2giKS52YWwocG9zdGFsQ29kZS5sb25nX25hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dlb2xvY2F0aW9uLWxvYWQnKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjbGF0JykudmFsKHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjbG9uJykudmFsKHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VhcmNoKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIlJldmVyc2UgZ2VvY29kaW5nIGZvdW5kIG5vIHppcCBjb2RlLiBTdGF0dXM6ICIgKyBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbG9jYXRpb25GYWlsZWQoJ3VuYXZhaWxhYmxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50UmVxdWVzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlcnJvci5jb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlcnJvci5QRVJNSVNTSU9OX0RFTklFRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbG9jYXRpb25GYWlsZWQoJ2RlbmllZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVycm9yLlRJTUVPVVQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2xvY2F0aW9uRmFpbGVkKCd0aW1lb3V0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBPU0lUSU9OX1VOQVZBSUxBQkxFLCBlLmcuIENvcmVMb2NhdGlvbiBrQ0xFcnJvckxvY2F0aW9uVW5rbm93biBvbiBtYWNPUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9sb2NhdGlvbkZhaWxlZCgndW5hdmFpbGFibGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSB6aXAgY29kZSBpcyBhbGwgd2UgbmVlZCwgc28gYSBjb2Fyc2Ugb3IgY2FjaGVkIHBvc2l0aW9uIGlzIGZpbmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogMTAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtQWdlOiAzMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjYWRkcmVzc1NlYXJjaCcpLmF0dHIoInJlYWRvbmx5IiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tbG9hZCcpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLm1lbnVCYXVmb3J1bVNlYXJjaCcpLm9uKCdzdWJtaXQnLGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNhZGRyZXNzU2VhcmNoJykudmFsKCQodGhpcykuZmluZCgnLnppcC1zZWFyY2gtaW5wdXQnKS52YWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLm5hdi1vdmVybGF5JykucmVtb3ZlQ2xhc3MoJ29wZW4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ25vc2Nyb2xsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNjcm9sbFRvID0gJCgnI3ppcC1hbmNob3InKS5vZmZzZXQoKS50b3AgLSAkKCcuaGVhZGVyLXdyYXBwZXInKS5vdXRlckhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7dG9wOiBzY3JvbGxUbywgYmVoYXZpb3I6ICdzbW9vdGgnfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dFJhbmdlU2xpZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJhZGl1cyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2VWYWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyYW5nZVZhbHVlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbml0VmFsUGVyY2VudCA9IChpbnB1dFJhbmdlU2xpZGVyLnZhbHVlQXNOdW1iZXIgIC0gcGFyc2VJbnQoaW5wdXRSYW5nZVNsaWRlci5taW4pKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyc2VJbnQoaW5wdXRSYW5nZVNsaWRlci5tYXgpIC0gcGFyc2VJbnQoaW5wdXRSYW5nZVNsaWRlci5taW4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRSYW5nZVNsaWRlci5zdHlsZSA9ICdiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgMCUgMCUsIDEwMCUgMCUsIGNvbG9yLXN0b3AoJyArIGluaXRWYWxQZXJjZW50ICsgJywgI0EwMDAwMCksIGNvbG9yLXN0b3AoJyArIGluaXRWYWxQZXJjZW50ICsgJywgI2U1ZTVlMykpOyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZVZhbHVlLmlubmVySFRNTCA9IGlucHV0UmFuZ2VTbGlkZXIudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UmFuZ2VTbGlkZXIuaW5uZXJIVE1MID0gaW5wdXRSYW5nZVNsaWRlci52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRSYW5nZVNsaWRlci5vbmlucHV0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZVZhbHVlLmlubmVySFRNTCA9IHRoaXMudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbFBlcmNlbnQgPSAoaW5wdXRSYW5nZVNsaWRlci52YWx1ZUFzTnVtYmVyICAtIHBhcnNlSW50KGlucHV0UmFuZ2VTbGlkZXIubWluKSkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJzZUludChpbnB1dFJhbmdlU2xpZGVyLm1heCkgLSBwYXJzZUludChpbnB1dFJhbmdlU2xpZGVyLm1pbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRSYW5nZVNsaWRlci5zdHlsZSA9ICdiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgMCUgMCUsIDEwMCUgMCUsIGNvbG9yLXN0b3AoJyArIHZhbFBlcmNlbnQgKyAnLCAjQTAwMDAwKSwgY29sb3Itc3RvcCgnICsgdmFsUGVyY2VudCArICcsICNlNWU1ZTMpKTsnOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIA==
Mit Klick auf Google Maps willige ich in die Verarbeitung meiner Daten durch Google ein. Diese Einwilligung kann jederzeit mit Wirkung für die Zukunft widerrufen werden. Weitere Informationen können unserer Datenschutzerklärung entnommen werden.
Alle Bauforen auf einen Blick
Montreux
Agence Suisse Romande
Avenue des Alpes 80 B
1820 Montreux
Tel:
079 9372180
Zum Bauforum
Thun
Zelglistrasse 6
3608 Thun
Tel:
078 8809001
Zum Bauforum
Zofingen
Brühlstrasse 5
4800 Zofingen
Tel:
079 502 77 19
Zum Bauforum
Kreuzlingen
Müligässli 1
8598 Bottighofen
Tel:
044 945 27 27
Zum Bauforum
