From a40dd762295a058781c056bb2e58af01240a6968 Mon Sep 17 00:00:00 2001 From: Michael Kapelko Date: Wed, 30 Oct 2019 17:42:58 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D1=82=D1=8C=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=80=D1=83=D1=8E=20=D0=BF=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- дети_1.0.0.html | 45 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/дети_1.0.0.html b/дети_1.0.0.html index 5dead24..5487d72 100644 --- a/дети_1.0.0.html +++ b/дети_1.0.0.html @@ -18,40 +18,19 @@ var murom = муром; [ -"муром.база_1.1.0", -"LyoKICoKICog0KHQutCw0YfQuNCy0LDQtdC80YvQuSDRhNCw0LnQuyAvIERvd25sb2FkZWQgZmlsZQogKgogKi8KCtC80YPRgNC+0Lwu0YTQsNC50LsgPSB7fTsK0LzRg9GA0L7QvC7RhNCw0LnQuy7QvdCw0YfQsNC70L4gPQpgCjwhRE9DVFlQRSBodG1sPgo8aHRtbD4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSI+CiAgICA8Ym9keT4KICAgICAgICA8c2NyaXB0Pgp2YXIg0LzRg9GA0L7QvCA9IHt9Owp2YXIgbXVyb20gPSDQvNGD0YDQvtC8OwrQvNGD0YDQvtC8LtC80L7QtNGD0LvQuCA9IFsKYDsK0LzRg9GA0L7QvC7RhNCw0LnQuy7QutC+0L3QtdGGID0KYApdOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KG11cm9tLCAibW9kdWxlcyIsIHsKICAgIGdldDogZnVuY3Rpb24oKQogICAgewogICAgICAgIHJldHVybiDQvNGD0YDQvtC8LtC80L7QtNGD0LvQuDsKICAgIH0sCiAgICBzZXQ6IGZ1bmN0aW9uKNC30L3QsNGH0LXQvdC40Y8pCiAgICB7CiAgICAgICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LggPSDQt9C90LDRh9C10L3QuNGPOwogICAgfQp9KTsKCnZhciDQt9Cw0LPRgNGD0LfQvtGH0L3Ri9C50JzQvtC00YPQu9GMID0g0LzRg9GA0L7QvC7QvNC+0LTRg9C70LhbMF07CnZhciDQutC+0LQgPSBhdG9iKNC30LDQs9GA0YPQt9C+0YfQvdGL0LnQnNC+0LTRg9C70YxbMV0pOwpldmFsKNC60L7QtCk7CiAgICAgICAgPC9zY3JpcHQ+CiAgICA8L2JvZHk+CjwvaHRtbD4KYDsKCi8qCiAqIAogKiBVVUlECiAqCiAqLwoKLy8gQ3JlYXRlIEdVSUQgLyBVVUlEIGluIEphdmFTY3JpcHQ/Ci8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMTE3NTIzCtC80YPRgNC+0LwudXVpZCA9IGZ1bmN0aW9uKCkKewogICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoCiAgICAgICAgL1t4eV0vZywKICAgICAgICBmdW5jdGlvbihjKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpOwogICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7CiAgICAgICAgfQogICAgKTsKfTsKCi8qCiAqIAogKiDQo9Cy0LXQtNC+0LzQuNGC0LXQu9GMIC8gUmVwb3J0ZXIKICoKICovCgovLyBSZXBvcnRlclN1YnNjcmlwdGlvbiBjbGFzcy4KZnVuY3Rpb24gUmVwb3J0ZXJTdWJzY3JpcHRpb24oaWQsIGNhbGxiYWNrLCByZXBvcnRlcikKewogICAgdGhpcy5pZCA9IGlkOwogICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyOwp9CgovLyBSZXBvcnRlciBjbGFzcy4KZnVuY3Rpb24gUmVwb3J0ZXIobmFtZSkKewogICAgdGhpcy5uYW1lID0KICAgICAgICAodHlwZW9mIG5hbWUgIT09ICJ1bmRlZmluZWQiKSA/IAogICAgICAgIG5hbWUgOgogICAgICAgICIiOwogICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107Cn0KUmVwb3J0ZXIucHJvdG90eXBlLnJlcG9ydCA9IGZ1bmN0aW9uKCkKewogICAgZm9yICh2YXIgaWQgaW4gdGhpcy5zdWJzY3JpcHRpb25zKQogICAgewogICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmlwdGlvbnNbaWRdOwogICAgICAgIHN1YnNjcmlwdGlvbi5jYWxsYmFjaygpOwogICAgfQp9ClJlcG9ydGVyLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbihjYWxsYmFjaykKewogICAgdmFyIGlkID0gbXVyb20udXVpZCgpOwogICAgdmFyIHN1YnNjcmlwdGlvbiA9IG5ldyBSZXBvcnRlclN1YnNjcmlwdGlvbihpZCwgY2FsbGJhY2ssIHRoaXMpOwogICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTsKICAgIHJldHVybiBzdWJzY3JpcHRpb247Cn0KUmVwb3J0ZXIucHJvdG90eXBlLnN1YnNjcmliZU1hbnkgPSBmdW5jdGlvbihmdW5jcykKewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jcy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmNzW2ldOwogICAgICAgIHRoaXMuc3Vic2NyaWJlKGZ1bmMpOwogICAgfQp9Cgp2YXIg0KPQstC10LTQvtC80LjRgtC10LvRjCA9IFJlcG9ydGVyOwpSZXBvcnRlci5wcm90b3R5cGUu0YPQstC10LTQvtC80LjRgtGMID0gZnVuY3Rpb24oKQp7CiAgICB0aGlzLnJlcG9ydCgpOwp9OwpSZXBvcnRlci5wcm90b3R5cGUu0L/QvtC00L/QuNGB0LDRgtGMID0gZnVuY3Rpb24o0YTRg9C90LrRhtC40Y8pCnsKICAgIHRoaXMuc3Vic2NyaWJlKNGE0YPQvdC60YbQuNGPKTsKfTsKUmVwb3J0ZXIucHJvdG90eXBlLtC/0L7QtNC/0LjRgdCw0YLRjNCc0L3QvtCz0L4gPSBmdW5jdGlvbihmdW5jcykKewogICAgdGhpcy5zdWJzY3JpYmVNYW55KGZ1bmNzKTsKfTsKCi8qCiAqIAogKiDQn9GD0YHQuiAvIFN0YXJ0CiAqCiAqLwoK0LzRg9GA0L7QvC7Qv9GD0YHQuiA9IG5ldyDQo9Cy0LXQtNC+0LzQuNGC0LXQu9GMKCk7Ci8vIENhbiBhbHNvIGJlIGFjY2Vzc2VkIGFzICdtdXJvbS5ydW4nLgpPYmplY3QuZGVmaW5lUHJvcGVydHkobXVyb20sICJydW4iLCB7CiAgICBnZXQ6IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4g0LzRg9GA0L7QvC7Qv9GD0YHQujsKICAgIH0KfSk7Cm11cm9tLnN0YXJ0ID0gZnVuY3Rpb24oKQp7CiAgICDQvNGD0YDQvtC8LtC/0YPRgdC6LtGD0LLQtdC00L7QvNC40YLRjCgpOwp9OwoKLyoKICoKICog0JvQtdCy0LDRjyDQuCDQv9GA0LDQstCw0Y8g0L7QsdC70LDRgdGC0LggLyBMZWZ0IGFuZCByaWdodCByZWdpb25zCiAqCiAqLwoK0LzRg9GA0L7QvC7RgdC+0LfQtNCw0YLRjNCb0LXQstGD0Y7Qn9GA0LDQstGD0Y7QntCx0LvQsNGB0YLQuCA9IGZ1bmN0aW9uKCkKewogICAgLy8g0JvQtdCy0LDRjyDQvtCx0LvQsNGB0YLRjC4KICAgIHZhciDQu9C+ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICDQu9C+LmlkPSLQu9C10LLQsNGPLdC+0LHQu9Cw0YHRgtGMIjsKICAgINC70L4uc3R5bGUuY3NzVGV4dCA9CiAgICAgICAgInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogMDsgdG9wOiAwOyBib3R0b206IDA7IHdpZHRoOiA1MCU7IjsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQo0LvQvik7CiAgICAKICAgIC8vINCf0YDQsNCy0LDRjyDQvtCx0LvQsNGB0YLRjC4KICAgIHZhciDQv9C+ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICDQv9C+LmlkPSLQv9GA0LDQstCw0Y8t0L7QsdC70LDRgdGC0YwiOwogICAg0L/Qvi5zdHlsZS5jc3NUZXh0ID0KICAgICAgICAicG9zaXRpb246IGZpeGVkOyByaWdodDogMDsgdG9wOiAwOyBib3R0b206IDA7IHdpZHRoOiA1MCU7IjsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQo0L/Qvik7CiAgICAKICAgIHJldHVybiBb0LvQviwg0L/Qvl07Cn07CgovKgogKgogKiDQpNC+0YDQvNCw0YLQuNGA0L7QstCw0L3QuNC1INGB0YLRgNC+0LogLyBTdHJpbmcgZm9ybWF0dGluZwogKgogKi8KCi8vIEphdmFTY3JpcHQgZXF1aXZhbGVudCB0byBwcmludGYvU3RyaW5nLkZvcm1hdAovLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDY3MzQzNgpmdW5jdGlvbiDRhNC+0YDQvNCw0YLQodGC0YDQvtC60LgoKQp7CiAgICAvLyBIb3cgdG8gc2hpZnQg4oCcYXJndW1lbnRz4oCdCiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80Nzc1ODk1L2hvdy10by1zaGlmdC1hcmd1bWVudHMKICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgIHZhciBzdHIgPSBhcmdzLnNoaWZ0KCk7CiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL3soXGQrKX0vZywgZnVuY3Rpb24obWF0Y2gsIG51bWJlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmdzW251bWJlcl0gIT0gJ3VuZGVmaW5lZCcKICAgICAgICAgICAgICAgICAgICA/IGFyZ3NbbnVtYmVyXQogICAgICAgICAgICAgICAgICAgIDogbWF0Y2gKICAgICAgICAgICAgICAgIDsKICAgIH0pOwp9CgovLyBKYXZhU2NyaXB0IGVxdWl2YWxlbnQgdG8gcHJpbnRmL1N0cmluZy5Gb3JtYXQKLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ2NzM0MzYKZnVuY3Rpb24gZm9ybWF0U3RyaW5nKCkKewogICAgLy8gSG93IHRvIHNoaWZ0IOKAnGFyZ3VtZW50c+KAnT8KICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ3NzU4OTUvaG93LXRvLXNoaWZ0LWFyZ3VtZW50cwogICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgdmFyIHN0ciA9IGFyZ3Muc2hpZnQoKTsKICAgIHJldHVybiBzdHIucmVwbGFjZSgveyhcZCspfS9nLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFyZ3NbbnVtYmVyXSAhPSAndW5kZWZpbmVkJwogICAgICAgICAgICAgICAgICAgID8gYXJnc1tudW1iZXJdCiAgICAgICAgICAgICAgICAgICAgOiBtYXRjaAogICAgICAgICAgICAgICAgOwogICAgfSk7Cn0KICAgIA==", +"муром.база_1.2.0", +"LyoKICoKICog0KHQutCw0YfQuNCy0LDQtdC80YvQuSDRhNCw0LnQuyAvIERvd25sb2FkZWQgZmlsZQogKgogKi8KCtC80YPRgNC+0Lwu0YTQsNC50LsgPSB7fTsK0LzRg9GA0L7QvC7RhNCw0LnQuy7QvdCw0YfQsNC70L4gPQpgCjwhRE9DVFlQRSBodG1sPgo8aHRtbD4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSI+CiAgICA8Ym9keT4KICAgICAgICA8c2NyaXB0Pgp2YXIg0LzRg9GA0L7QvCA9IHt9Owp2YXIgbXVyb20gPSDQvNGD0YDQvtC8OwrQvNGD0YDQvtC8LtC80L7QtNGD0LvQuCA9IFsKYDsK0LzRg9GA0L7QvC7RhNCw0LnQuy7QutC+0L3QtdGGID0KYApdOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KG11cm9tLCAibW9kdWxlcyIsIHsKICAgIGdldDogZnVuY3Rpb24oKQogICAgewogICAgICAgIHJldHVybiDQvNGD0YDQvtC8LtC80L7QtNGD0LvQuDsKICAgIH0sCiAgICBzZXQ6IGZ1bmN0aW9uKNC30L3QsNGH0LXQvdC40Y8pCiAgICB7CiAgICAgICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LggPSDQt9C90LDRh9C10L3QuNGPOwogICAgfQp9KTsKCnZhciDQt9Cw0LPRgNGD0LfQvtGH0L3Ri9C50JzQvtC00YPQu9GMID0g0LzRg9GA0L7QvC7QvNC+0LTRg9C70LhbMF07CnZhciDQutC+0LQgPSBhdG9iKNC30LDQs9GA0YPQt9C+0YfQvdGL0LnQnNC+0LTRg9C70YxbMV0pOwpldmFsKNC60L7QtCk7CiAgICAgICAgPC9zY3JpcHQ+CiAgICA8L2JvZHk+CjwvaHRtbD4KYDsKCi8qCiAqIAogKiBVVUlECiAqCiAqLwoKLy8gQ3JlYXRlIEdVSUQgLyBVVUlEIGluIEphdmFTY3JpcHQ/Ci8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMTE3NTIzCtC80YPRgNC+0LwudXVpZCA9IGZ1bmN0aW9uKCkKewogICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoCiAgICAgICAgL1t4eV0vZywKICAgICAgICBmdW5jdGlvbihjKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpOwogICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7CiAgICAgICAgfQogICAgKTsKfTsKCi8qCiAqIAogKiDQo9Cy0LXQtNC+0LzQuNGC0LXQu9GMIC8gUmVwb3J0ZXIKICoKICovCgovLyBSZXBvcnRlclN1YnNjcmlwdGlvbiBjbGFzcy4KZnVuY3Rpb24gUmVwb3J0ZXJTdWJzY3JpcHRpb24oaWQsIGNhbGxiYWNrLCByZXBvcnRlcikKewogICAgdGhpcy5pZCA9IGlkOwogICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyOwp9CgovLyBSZXBvcnRlciBjbGFzcy4KZnVuY3Rpb24gUmVwb3J0ZXIobmFtZSkKewogICAgdGhpcy5uYW1lID0KICAgICAgICAodHlwZW9mIG5hbWUgIT09ICJ1bmRlZmluZWQiKSA/IAogICAgICAgIG5hbWUgOgogICAgICAgICIiOwogICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107Cn0KUmVwb3J0ZXIucHJvdG90eXBlLnJlcG9ydCA9IGZ1bmN0aW9uKCkKewogICAgZm9yICh2YXIgaWQgaW4gdGhpcy5zdWJzY3JpcHRpb25zKQogICAgewogICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmlwdGlvbnNbaWRdOwogICAgICAgIHN1YnNjcmlwdGlvbi5jYWxsYmFjaygpOwogICAgfQp9ClJlcG9ydGVyLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbihjYWxsYmFjaykKewogICAgdmFyIGlkID0gbXVyb20udXVpZCgpOwogICAgdmFyIHN1YnNjcmlwdGlvbiA9IG5ldyBSZXBvcnRlclN1YnNjcmlwdGlvbihpZCwgY2FsbGJhY2ssIHRoaXMpOwogICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTsKICAgIHJldHVybiBzdWJzY3JpcHRpb247Cn0KUmVwb3J0ZXIucHJvdG90eXBlLnN1YnNjcmliZU1hbnkgPSBmdW5jdGlvbihmdW5jcykKewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jcy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgICB2YXIgZnVuYyA9IGZ1bmNzW2ldOwogICAgICAgIHRoaXMuc3Vic2NyaWJlKGZ1bmMpOwogICAgfQp9Cgp2YXIg0KPQstC10LTQvtC80LjRgtC10LvRjCA9IFJlcG9ydGVyOwpSZXBvcnRlci5wcm90b3R5cGUu0YPQstC10LTQvtC80LjRgtGMID0gZnVuY3Rpb24oKQp7CiAgICB0aGlzLnJlcG9ydCgpOwp9OwpSZXBvcnRlci5wcm90b3R5cGUu0L/QvtC00L/QuNGB0LDRgtGMID0gZnVuY3Rpb24o0YTRg9C90LrRhtC40Y8pCnsKICAgIHRoaXMuc3Vic2NyaWJlKNGE0YPQvdC60YbQuNGPKTsKfTsKUmVwb3J0ZXIucHJvdG90eXBlLtC/0L7QtNC/0LjRgdCw0YLRjNCc0L3QvtCz0L4gPSBmdW5jdGlvbihmdW5jcykKewogICAgdGhpcy5zdWJzY3JpYmVNYW55KGZ1bmNzKTsKfTsKCi8qCiAqIAogKiDQn9GD0YHQuiAvIFN0YXJ0CiAqCiAqLwoK0LzRg9GA0L7QvC7Qv9GD0YHQuiA9IG5ldyDQo9Cy0LXQtNC+0LzQuNGC0LXQu9GMKCk7Ci8vIENhbiBhbHNvIGJlIGFjY2Vzc2VkIGFzICdtdXJvbS5ydW4nLgpPYmplY3QuZGVmaW5lUHJvcGVydHkobXVyb20sICJydW4iLCB7CiAgICBnZXQ6IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4g0LzRg9GA0L7QvC7Qv9GD0YHQujsKICAgIH0KfSk7Cm11cm9tLnN0YXJ0ID0gZnVuY3Rpb24oKQp7CiAgICDQvNGD0YDQvtC8LtC/0YPRgdC6LtGD0LLQtdC00L7QvNC40YLRjCgpOwp9OwoKLyoKICoKICog0KTQvtGA0LzQsNGC0LjRgNC+0LLQsNC90LjQtSDRgdGC0YDQvtC6IC8gU3RyaW5nIGZvcm1hdHRpbmcKICoKICovCgovLyBKYXZhU2NyaXB0IGVxdWl2YWxlbnQgdG8gcHJpbnRmL1N0cmluZy5Gb3JtYXQKLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ2NzM0MzYKZnVuY3Rpb24g0YTQvtGA0LzQsNGC0KHRgtGA0L7QutC4KCkKewogICAgLy8gSG93IHRvIHNoaWZ0IOKAnGFyZ3VtZW50c+KAnQogICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDc3NTg5NS9ob3ctdG8tc2hpZnQtYXJndW1lbnRzCiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICB2YXIgc3RyID0gYXJncy5zaGlmdCgpOwogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC97KFxkKyl9L2csIGZ1bmN0aW9uKG1hdGNoLCBudW1iZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYXJnc1tudW1iZXJdICE9ICd1bmRlZmluZWQnCiAgICAgICAgICAgICAgICAgICAgPyBhcmdzW251bWJlcl0KICAgICAgICAgICAgICAgICAgICA6IG1hdGNoCiAgICAgICAgICAgICAgICA7CiAgICB9KTsKfQoKLy8gSmF2YVNjcmlwdCBlcXVpdmFsZW50IHRvIHByaW50Zi9TdHJpbmcuRm9ybWF0Ci8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NjczNDM2CmZ1bmN0aW9uIGZvcm1hdFN0cmluZygpCnsKICAgIC8vIEhvdyB0byBzaGlmdCDigJxhcmd1bWVudHPigJ0/CiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80Nzc1ODk1L2hvdy10by1zaGlmdC1hcmd1bWVudHMKICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgIHZhciBzdHIgPSBhcmdzLnNoaWZ0KCk7CiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL3soXGQrKX0vZywgZnVuY3Rpb24obWF0Y2gsIG51bWJlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmdzW251bWJlcl0gIT0gJ3VuZGVmaW5lZCcKICAgICAgICAgICAgICAgICAgICA/IGFyZ3NbbnVtYmVyXQogICAgICAgICAgICAgICAgICAgIDogbWF0Y2gKICAgICAgICAgICAgICAgIDsKICAgIH0pOwp9CiAgICA=", {"status":true} ], [ -"муром.редактор_1.0.0", -"0LzRg9GA0L7QvC7Qt9Cw0LPRgNGD0LfQuNGC0YxBQ0UgPSBmdW5jdGlvbigpCnsKICAgIC8vINCg0LXQtNCw0LrRgtC+0YAg0LrQvtC00LAgQUNFLgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FqYXhvcmcvYWNlLWJ1aWxkcy9ibG9iL21hc3Rlci9zcmMtbWluLW5vY29uZmxpY3QvYWNlLmpzCihmdW5jdGlvbigpe2Z1bmN0aW9uIG8obil7dmFyIGk9ZTtuJiYoZVtuXXx8KGVbbl09e30pLGk9ZVtuXSk7aWYoIWkuZGVmaW5lfHwhaS5kZWZpbmUucGFja2FnZWQpdC5vcmlnaW5hbD1pLmRlZmluZSxpLmRlZmluZT10LGkuZGVmaW5lLnBhY2thZ2VkPSEwO2lmKCFpLnJlcXVpcmV8fCFpLnJlcXVpcmUucGFja2FnZWQpci5vcmlnaW5hbD1pLnJlcXVpcmUsaS5yZXF1aXJlPXIsaS5yZXF1aXJlLnBhY2thZ2VkPSEwfXZhciBBQ0VfTkFNRVNQQUNFID0gImFjZSIsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpOyFlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmKGU9d2luZG93KTtpZighQUNFX05BTUVTUEFDRSYmdHlwZW9mIHJlcXVpcmVqcyE9InVuZGVmaW5lZCIpcmV0dXJuO3ZhciB0PWZ1bmN0aW9uKGUsbixyKXtpZih0eXBlb2YgZSE9InN0cmluZyIpe3Qub3JpZ2luYWw/dC5vcmlnaW5hbC5hcHBseSh0aGlzLGFyZ3VtZW50cyk6KGNvbnNvbGUuZXJyb3IoImRyb3BwaW5nIG1vZHVsZSBiZWNhdXNlIGRlZmluZSB3YXNuJ3QgYSBzdHJpbmcuIiksY29uc29sZS50cmFjZSgpKTtyZXR1cm59YXJndW1lbnRzLmxlbmd0aD09MiYmKHI9biksdC5tb2R1bGVzW2VdfHwodC5wYXlsb2Fkc1tlXT1yLHQubW9kdWxlc1tlXT1udWxsKX07dC5tb2R1bGVzPXt9LHQucGF5bG9hZHM9e307dmFyIG49ZnVuY3Rpb24oZSx0LG4pe2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7dmFyIGk9cyhlLHQpO2lmKGkhPXVuZGVmaW5lZClyZXR1cm4gbiYmbigpLGl9ZWxzZSBpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk9PT0iW29iamVjdCBBcnJheV0iKXt2YXIgbz1bXTtmb3IodmFyIHU9MCxhPXQubGVuZ3RoO3U8YTsrK3Upe3ZhciBmPXMoZSx0W3VdKTtpZihmPT11bmRlZmluZWQmJnIub3JpZ2luYWwpcmV0dXJuO28ucHVzaChmKX1yZXR1cm4gbiYmbi5hcHBseShudWxsLG8pfHwhMH19LHI9ZnVuY3Rpb24oZSx0KXt2YXIgaT1uKCIiLGUsdCk7cmV0dXJuIGk9PXVuZGVmaW5lZCYmci5vcmlnaW5hbD9yLm9yaWdpbmFsLmFwcGx5KHRoaXMsYXJndW1lbnRzKTppfSxpPWZ1bmN0aW9uKGUsdCl7aWYodC5pbmRleE9mKCIhIikhPT0tMSl7dmFyIG49dC5zcGxpdCgiISIpO3JldHVybiBpKGUsblswXSkrIiEiK2koZSxuWzFdKX1pZih0LmNoYXJBdCgwKT09Ii4iKXt2YXIgcj1lLnNwbGl0KCIvIikuc2xpY2UoMCwtMSkuam9pbigiLyIpO3Q9cisiLyIrdDt3aGlsZSh0LmluZGV4T2YoIi4iKSE9PS0xJiZzIT10KXt2YXIgcz10O3Q9dC5yZXBsYWNlKC9cL1wuXC8vLCIvIikucmVwbGFjZSgvW15cL10rXC9cLlwuXC8vLCIiKX19cmV0dXJuIHR9LHM9ZnVuY3Rpb24oZSxyKXtyPWkoZSxyKTt2YXIgcz10Lm1vZHVsZXNbcl07aWYoIXMpe3M9dC5wYXlsb2Fkc1tyXTtpZih0eXBlb2Ygcz09ImZ1bmN0aW9uIil7dmFyIG89e30sdT17aWQ6cix1cmk6IiIsZXhwb3J0czpvLHBhY2thZ2VkOiEwfSxhPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4ocixlLHQpfSxmPXMoYSxvLHUpO289Znx8dS5leHBvcnRzLHQubW9kdWxlc1tyXT1vLGRlbGV0ZSB0LnBheWxvYWRzW3JdfXM9dC5tb2R1bGVzW3JdPW98fHN9cmV0dXJuIHN9O28oQUNFX05BTUVTUEFDRSl9KSgpLGFjZS5kZWZpbmUoImFjZS9saWIvcmVnZXhwIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUpe3JldHVybihlLmdsb2JhbD8iZyI6IiIpKyhlLmlnbm9yZUNhc2U/ImkiOiIiKSsoZS5tdWx0aWxpbmU/Im0iOiIiKSsoZS5leHRlbmRlZD8ieCI6IiIpKyhlLnN0aWNreT8ieSI6IiIpfWZ1bmN0aW9uIHUoZSx0LG4pe2lmKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKXJldHVybiBlLmluZGV4T2YodCxuKTtmb3IodmFyIHI9bnx8MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdPT09dClyZXR1cm4gcjtyZXR1cm4tMX12YXIgcj17ZXhlYzpSZWdFeHAucHJvdG90eXBlLmV4ZWMsdGVzdDpSZWdFeHAucHJvdG90eXBlLnRlc3QsbWF0Y2g6U3RyaW5nLnByb3RvdHlwZS5tYXRjaCxyZXBsYWNlOlN0cmluZy5wcm90b3R5cGUucmVwbGFjZSxzcGxpdDpTdHJpbmcucHJvdG90eXBlLnNwbGl0fSxpPXIuZXhlYy5jYWxsKC8oKT8/LywiIilbMV09PT11bmRlZmluZWQscz1mdW5jdGlvbigpe3ZhciBlPS9eL2c7cmV0dXJuIHIudGVzdC5jYWxsKGUsIiIpLCFlLmxhc3RJbmRleH0oKTtpZihzJiZpKXJldHVybjtSZWdFeHAucHJvdG90eXBlLmV4ZWM9ZnVuY3Rpb24oZSl7dmFyIHQ9ci5leGVjLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxuLGE7aWYodHlwZW9mIGU9PSJzdHJpbmciJiZ0KXshaSYmdC5sZW5ndGg+MSYmdSh0LCIiKT4tMSYmKGE9UmVnRXhwKHRoaXMuc291cmNlLHIucmVwbGFjZS5jYWxsKG8odGhpcyksImciLCIiKSksci5yZXBsYWNlLmNhbGwoZS5zbGljZSh0LmluZGV4KSxhLGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoLTI7ZSsrKWFyZ3VtZW50c1tlXT09PXVuZGVmaW5lZCYmKHRbZV09dW5kZWZpbmVkKX0pKTtpZih0aGlzLl94cmVnZXhwJiZ0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lcylmb3IodmFyIGY9MTtmPHQubGVuZ3RoO2YrKyluPXRoaXMuX3hyZWdleHAuY2FwdHVyZU5hbWVzW2YtMV0sbiYmKHRbbl09dFtmXSk7IXMmJnRoaXMuZ2xvYmFsJiYhdFswXS5sZW5ndGgmJnRoaXMubGFzdEluZGV4PnQuaW5kZXgmJnRoaXMubGFzdEluZGV4LS19cmV0dXJuIHR9LHN8fChSZWdFeHAucHJvdG90eXBlLnRlc3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9ci5leGVjLmNhbGwodGhpcyxlKTtyZXR1cm4gdCYmdGhpcy5nbG9iYWwmJiF0WzBdLmxlbmd0aCYmdGhpcy5sYXN0SW5kZXg+dC5pbmRleCYmdGhpcy5sYXN0SW5kZXgtLSwhIXR9KX0pLGFjZS5kZWZpbmUoImFjZS9saWIvZXM1LXNoaW0iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcigpe31mdW5jdGlvbiB3KGUpe3RyeXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInNlbnRpbmVsIix7fSksInNlbnRpbmVsImluIGV9Y2F0Y2godCl7fX1mdW5jdGlvbiBIKGUpe3JldHVybiBlPStlLGUhPT1lP2U9MDplIT09MCYmZSE9PTEvMCYmZSE9PS0xLzAmJihlPShlPjB8fC0xKSpNYXRoLmZsb29yKE1hdGguYWJzKGUpKSksZX1mdW5jdGlvbiBCKGUpe3ZhciB0PXR5cGVvZiBlO3JldHVybiBlPT09bnVsbHx8dD09PSJ1bmRlZmluZWQifHx0PT09ImJvb2xlYW4ifHx0PT09Im51bWJlciJ8fHQ9PT0ic3RyaW5nIn1mdW5jdGlvbiBqKGUpe3ZhciB0LG4scjtpZihCKGUpKXJldHVybiBlO249ZS52YWx1ZU9mO2lmKHR5cGVvZiBuPT0iZnVuY3Rpb24iKXt0PW4uY2FsbChlKTtpZihCKHQpKXJldHVybiB0fXI9ZS50b1N0cmluZztpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIil7dD1yLmNhbGwoZSk7aWYoQih0KSlyZXR1cm4gdH10aHJvdyBuZXcgVHlwZUVycm9yfUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kfHwoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24odCl7dmFyIG49dGhpcztpZih0eXBlb2YgbiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICIrbik7dmFyIGk9dS5jYWxsKGFyZ3VtZW50cywxKSxzPWZ1bmN0aW9uKCl7aWYodGhpcyBpbnN0YW5jZW9mIHMpe3ZhciBlPW4uYXBwbHkodGhpcyxpLmNvbmNhdCh1LmNhbGwoYXJndW1lbnRzKSkpO3JldHVybiBPYmplY3QoZSk9PT1lP2U6dGhpc31yZXR1cm4gbi5hcHBseSh0LGkuY29uY2F0KHUuY2FsbChhcmd1bWVudHMpKSl9O3JldHVybiBuLnByb3RvdHlwZSYmKHIucHJvdG90eXBlPW4ucHJvdG90eXBlLHMucHJvdG90eXBlPW5ldyByLHIucHJvdG90eXBlPW51bGwpLHN9KTt2YXIgaT1GdW5jdGlvbi5wcm90b3R5cGUuY2FsbCxzPUFycmF5LnByb3RvdHlwZSxvPU9iamVjdC5wcm90b3R5cGUsdT1zLnNsaWNlLGE9aS5iaW5kKG8udG9TdHJpbmcpLGY9aS5iaW5kKG8uaGFzT3duUHJvcGVydHkpLGwsYyxoLHAsZDtpZihkPWYobywiX19kZWZpbmVHZXR0ZXJfXyIpKWw9aS5iaW5kKG8uX19kZWZpbmVHZXR0ZXJfXyksYz1pLmJpbmQoby5fX2RlZmluZVNldHRlcl9fKSxoPWkuYmluZChvLl9fbG9va3VwR2V0dGVyX18pLHA9aS5iaW5kKG8uX19sb29rdXBTZXR0ZXJfXyk7aWYoWzEsMl0uc3BsaWNlKDApLmxlbmd0aCE9MilpZighZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3ZhciB0PW5ldyBBcnJheShlKzIpO3JldHVybiB0WzBdPXRbMV09MCx0fXZhciB0PVtdLG47dC5zcGxpY2UuYXBwbHkodCxlKDIwKSksdC5zcGxpY2UuYXBwbHkodCxlKDI2KSksbj10Lmxlbmd0aCx0LnNwbGljZSg1LDAsIlhYWCIpLG4rMT09dC5sZW5ndGg7aWYobisxPT10Lmxlbmd0aClyZXR1cm4hMH0oKSlBcnJheS5wcm90b3R5cGUuc3BsaWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5sZW5ndGg7ZT4wP2U+biYmKGU9bik6ZT09dm9pZCAwP2U9MDplPDAmJihlPU1hdGgubWF4KG4rZSwwKSksZSt0PG58fCh0PW4tZSk7dmFyIHI9dGhpcy5zbGljZShlLGUrdCksaT11LmNhbGwoYXJndW1lbnRzLDIpLHM9aS5sZW5ndGg7aWYoZT09PW4pcyYmdGhpcy5wdXNoLmFwcGx5KHRoaXMsaSk7ZWxzZXt2YXIgbz1NYXRoLm1pbih0LG4tZSksYT1lK28sZj1hK3MtbyxsPW4tYSxjPW4tbztpZihmPGEpZm9yKHZhciBoPTA7aDxsOysraCl0aGlzW2YraF09dGhpc1thK2hdO2Vsc2UgaWYoZj5hKWZvcihoPWw7aC0tOyl0aGlzW2YraF09dGhpc1thK2hdO2lmKHMmJmU9PT1jKXRoaXMubGVuZ3RoPWMsdGhpcy5wdXNoLmFwcGx5KHRoaXMsaSk7ZWxzZXt0aGlzLmxlbmd0aD1jK3M7Zm9yKGg9MDtoPHM7KytoKXRoaXNbZStoXT1pW2hdfX1yZXR1cm4gcn07ZWxzZXt2YXIgdj1BcnJheS5wcm90b3R5cGUuc3BsaWNlO0FycmF5LnByb3RvdHlwZS5zcGxpY2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD92LmFwcGx5KHRoaXMsW2U9PT12b2lkIDA/MDplLHQ9PT12b2lkIDA/dGhpcy5sZW5ndGgtZTp0XS5jb25jYXQodS5jYWxsKGFyZ3VtZW50cywyKSkpOltdfX1BcnJheS5pc0FycmF5fHwoQXJyYXkuaXNBcnJheT1mdW5jdGlvbih0KXtyZXR1cm4gYSh0KT09IltvYmplY3QgQXJyYXldIn0pO3ZhciBtPU9iamVjdCgiYSIpLGc9bVswXSE9ImEifHwhKDAgaW4gbSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2h8fChBcnJheS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXt2YXIgbj1GKHRoaXMpLHI9ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6bixpPWFyZ3VtZW50c1sxXSxzPS0xLG89ci5sZW5ndGg+Pj4wO2lmKGEodCkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcjt3aGlsZSgrK3M8bylzIGluIHImJnQuY2FsbChpLHJbc10scyxuKX0pLEFycmF5LnByb3RvdHlwZS5tYXB8fChBcnJheS5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe3ZhciBuPUYodGhpcykscj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpuLGk9ci5sZW5ndGg+Pj4wLHM9QXJyYXkoaSksbz1hcmd1bWVudHNbMV07aWYoYSh0KSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBmdW5jdGlvbiIpO2Zvcih2YXIgdT0wO3U8aTt1KyspdSBpbiByJiYoc1t1XT10LmNhbGwobyxyW3VdLHUsbikpO3JldHVybiBzfSksQXJyYXkucHJvdG90eXBlLmZpbHRlcnx8KEFycmF5LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7dmFyIG49Rih0aGlzKSxyPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOm4saT1yLmxlbmd0aD4+PjAscz1bXSxvLHU9YXJndW1lbnRzWzFdO2lmKGEodCkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24iKTtmb3IodmFyIGY9MDtmPGk7ZisrKWYgaW4gciYmKG89cltmXSx0LmNhbGwodSxvLGYsbikmJnMucHVzaChvKSk7cmV0dXJuIHN9KSxBcnJheS5wcm90b3R5cGUuZXZlcnl8fChBcnJheS5wcm90b3R5cGUuZXZlcnk9ZnVuY3Rpb24odCl7dmFyIG49Rih0aGlzKSxyPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOm4saT1yLmxlbmd0aD4+PjAscz1hcmd1bWVudHNbMV07aWYoYSh0KSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBmdW5jdGlvbiIpO2Zvcih2YXIgbz0wO288aTtvKyspaWYobyBpbiByJiYhdC5jYWxsKHMscltvXSxvLG4pKXJldHVybiExO3JldHVybiEwfSksQXJyYXkucHJvdG90eXBlLnNvbWV8fChBcnJheS5wcm90b3R5cGUuc29tZT1mdW5jdGlvbih0KXt2YXIgbj1GKHRoaXMpLHI9ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6bixpPXIubGVuZ3RoPj4+MCxzPWFyZ3VtZW50c1sxXTtpZihhKHQpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7Zm9yKHZhciBvPTA7bzxpO28rKylpZihvIGluIHImJnQuY2FsbChzLHJbb10sbyxuKSlyZXR1cm4hMDtyZXR1cm4hMX0pLEFycmF5LnByb3RvdHlwZS5yZWR1Y2V8fChBcnJheS5wcm90b3R5cGUucmVkdWNlPWZ1bmN0aW9uKHQpe3ZhciBuPUYodGhpcykscj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpuLGk9ci5sZW5ndGg+Pj4wO2lmKGEodCkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24iKTtpZighaSYmYXJndW1lbnRzLmxlbmd0aD09MSl0aHJvdyBuZXcgVHlwZUVycm9yKCJyZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlIik7dmFyIHM9MCxvO2lmKGFyZ3VtZW50cy5sZW5ndGg+PTIpbz1hcmd1bWVudHNbMV07ZWxzZSBkb3tpZihzIGluIHIpe289cltzKytdO2JyZWFrfWlmKCsrcz49aSl0aHJvdyBuZXcgVHlwZUVycm9yKCJyZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlIil9d2hpbGUoITApO2Zvcig7czxpO3MrKylzIGluIHImJihvPXQuY2FsbCh2b2lkIDAsbyxyW3NdLHMsbikpO3JldHVybiBvfSksQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0fHwoQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0PWZ1bmN0aW9uKHQpe3ZhciBuPUYodGhpcykscj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpuLGk9ci5sZW5ndGg+Pj4wO2lmKGEodCkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24iKTtpZighaSYmYXJndW1lbnRzLmxlbmd0aD09MSl0aHJvdyBuZXcgVHlwZUVycm9yKCJyZWR1Y2VSaWdodCBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKTt2YXIgcyxvPWktMTtpZihhcmd1bWVudHMubGVuZ3RoPj0yKXM9YXJndW1lbnRzWzFdO2Vsc2UgZG97aWYobyBpbiByKXtzPXJbby0tXTticmVha31pZigtLW88MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJyZWR1Y2VSaWdodCBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKX13aGlsZSghMCk7ZG8gbyBpbiB0aGlzJiYocz10LmNhbGwodm9pZCAwLHMscltvXSxvLG4pKTt3aGlsZShvLS0pO3JldHVybiBzfSk7aWYoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mfHxbMCwxXS5pbmRleE9mKDEsMikhPS0xKUFycmF5LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQpe3ZhciBuPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOkYodGhpcykscj1uLmxlbmd0aD4+PjA7aWYoIXIpcmV0dXJuLTE7dmFyIGk9MDthcmd1bWVudHMubGVuZ3RoPjEmJihpPUgoYXJndW1lbnRzWzFdKSksaT1pPj0wP2k6TWF0aC5tYXgoMCxyK2kpO2Zvcig7aTxyO2krKylpZihpIGluIG4mJm5baV09PT10KXJldHVybiBpO3JldHVybi0xfTtpZighQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mfHxbMCwxXS5sYXN0SW5kZXhPZigwLC0zKSE9LTEpQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQpe3ZhciBuPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOkYodGhpcykscj1uLmxlbmd0aD4+PjA7aWYoIXIpcmV0dXJuLTE7dmFyIGk9ci0xO2FyZ3VtZW50cy5sZW5ndGg+MSYmKGk9TWF0aC5taW4oaSxIKGFyZ3VtZW50c1sxXSkpKSxpPWk+PTA/aTpyLU1hdGguYWJzKGkpO2Zvcig7aT49MDtpLS0paWYoaSBpbiBuJiZ0PT09bltpXSlyZXR1cm4gaTtyZXR1cm4tMX07T2JqZWN0LmdldFByb3RvdHlwZU9mfHwoT2JqZWN0LmdldFByb3RvdHlwZU9mPWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8KHQuY29uc3RydWN0b3I/dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6byl9KTtpZighT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcil7dmFyIHk9Ik9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgY2FsbGVkIG9uIGEgbm9uLW9iamVjdDogIjtPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yPWZ1bmN0aW9uKHQsbil7aWYodHlwZW9mIHQhPSJvYmplY3QiJiZ0eXBlb2YgdCE9ImZ1bmN0aW9uInx8dD09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcih5K3QpO2lmKCFmKHQsbikpcmV0dXJuO3ZhciByLGkscztyPXtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH07aWYoZCl7dmFyIHU9dC5fX3Byb3RvX187dC5fX3Byb3RvX189bzt2YXIgaT1oKHQsbikscz1wKHQsbik7dC5fX3Byb3RvX189dTtpZihpfHxzKXJldHVybiBpJiYoci5nZXQ9aSkscyYmKHIuc2V0PXMpLHJ9cmV0dXJuIHIudmFsdWU9dFtuXSxyfX1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8KE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qua2V5cyh0KX0pO2lmKCFPYmplY3QuY3JlYXRlKXt2YXIgYjtPYmplY3QucHJvdG90eXBlLl9fcHJvdG9fXz09PW51bGw/Yj1mdW5jdGlvbigpe3JldHVybntfX3Byb3RvX186bnVsbH19OmI9ZnVuY3Rpb24oKXt2YXIgZT17fTtmb3IodmFyIHQgaW4gZSllW3RdPW51bGw7cmV0dXJuIGUuY29uc3RydWN0b3I9ZS5oYXNPd25Qcm9wZXJ0eT1lLnByb3BlcnR5SXNFbnVtZXJhYmxlPWUuaXNQcm90b3R5cGVPZj1lLnRvTG9jYWxlU3RyaW5nPWUudG9TdHJpbmc9ZS52YWx1ZU9mPWUuX19wcm90b19fPW51bGwsZX0sT2JqZWN0LmNyZWF0ZT1mdW5jdGlvbih0LG4pe3ZhciByO2lmKHQ9PT1udWxsKXI9YigpO2Vsc2V7aWYodHlwZW9mIHQhPSJvYmplY3QiKXRocm93IG5ldyBUeXBlRXJyb3IoInR5cGVvZiBwcm90b3R5cGVbIit0eXBlb2YgdCsiXSAhPSAnb2JqZWN0JyIpO3ZhciBpPWZ1bmN0aW9uKCl7fTtpLnByb3RvdHlwZT10LHI9bmV3IGksci5fX3Byb3RvX189dH1yZXR1cm4gbiE9PXZvaWQgMCYmT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocixuKSxyfX1pZihPYmplY3QuZGVmaW5lUHJvcGVydHkpe3ZhciBFPXcoe30pLFM9dHlwZW9mIGRvY3VtZW50PT0idW5kZWZpbmVkInx8dyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7aWYoIUV8fCFTKXZhciB4PU9iamVjdC5kZWZpbmVQcm9wZXJ0eX1pZighT2JqZWN0LmRlZmluZVByb3BlcnR5fHx4KXt2YXIgVD0iUHJvcGVydHkgZGVzY3JpcHRpb24gbXVzdCBiZSBhbiBvYmplY3Q6ICIsTj0iT2JqZWN0LmRlZmluZVByb3BlcnR5IGNhbGxlZCBvbiBub24tb2JqZWN0OiAiLEM9ImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCBvbiB0aGlzIGphdmFzY3JpcHQgZW5naW5lIjtPYmplY3QuZGVmaW5lUHJvcGVydHk9ZnVuY3Rpb24odCxuLHIpe2lmKHR5cGVvZiB0IT0ib2JqZWN0IiYmdHlwZW9mIHQhPSJmdW5jdGlvbiJ8fHQ9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoTit0KTtpZih0eXBlb2YgciE9Im9iamVjdCImJnR5cGVvZiByIT0iZnVuY3Rpb24ifHxyPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKFQrcik7aWYoeCl0cnl7cmV0dXJuIHguY2FsbChPYmplY3QsdCxuLHIpfWNhdGNoKGkpe31pZihmKHIsInZhbHVlIikpaWYoZCYmKGgodCxuKXx8cCh0LG4pKSl7dmFyIHM9dC5fX3Byb3RvX187dC5fX3Byb3RvX189byxkZWxldGUgdFtuXSx0W25dPXIudmFsdWUsdC5fX3Byb3RvX189c31lbHNlIHRbbl09ci52YWx1ZTtlbHNle2lmKCFkKXRocm93IG5ldyBUeXBlRXJyb3IoQyk7ZihyLCJnZXQiKSYmbCh0LG4sci5nZXQpLGYociwic2V0IikmJmModCxuLHIuc2V0KX1yZXR1cm4gdH19T2JqZWN0LmRlZmluZVByb3BlcnRpZXN8fChPYmplY3QuZGVmaW5lUHJvcGVydGllcz1mdW5jdGlvbih0LG4pe2Zvcih2YXIgciBpbiBuKWYobixyKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQscixuW3JdKTtyZXR1cm4gdH0pLE9iamVjdC5zZWFsfHwoT2JqZWN0LnNlYWw9ZnVuY3Rpb24odCl7cmV0dXJuIHR9KSxPYmplY3QuZnJlZXplfHwoT2JqZWN0LmZyZWV6ZT1mdW5jdGlvbih0KXtyZXR1cm4gdH0pO3RyeXtPYmplY3QuZnJlZXplKGZ1bmN0aW9uKCl7fSl9Y2F0Y2goayl7T2JqZWN0LmZyZWV6ZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHR5cGVvZiBuPT0iZnVuY3Rpb24iP246dChuKX19KE9iamVjdC5mcmVlemUpfU9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uc3x8KE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gdH0pLE9iamVjdC5pc1NlYWxlZHx8KE9iamVjdC5pc1NlYWxlZD1mdW5jdGlvbih0KXtyZXR1cm4hMX0pLE9iamVjdC5pc0Zyb3plbnx8KE9iamVjdC5pc0Zyb3plbj1mdW5jdGlvbih0KXtyZXR1cm4hMX0pLE9iamVjdC5pc0V4dGVuc2libGV8fChPYmplY3QuaXNFeHRlbnNpYmxlPWZ1bmN0aW9uKHQpe2lmKE9iamVjdCh0KT09PXQpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgbj0iIjt3aGlsZShmKHQsbikpbis9Ij8iO3Rbbl09ITA7dmFyIHI9Zih0LG4pO3JldHVybiBkZWxldGUgdFtuXSxyfSk7aWYoIU9iamVjdC5rZXlzKXt2YXIgTD0hMCxBPVsidG9TdHJpbmciLCJ0b0xvY2FsZVN0cmluZyIsInZhbHVlT2YiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsImNvbnN0cnVjdG9yIl0sTz1BLmxlbmd0aDtmb3IodmFyIE0gaW57dG9TdHJpbmc6bnVsbH0pTD0hMTtPYmplY3Qua2V5cz1mdW5jdGlvbiBJKGUpe2lmKHR5cGVvZiBlIT0ib2JqZWN0IiYmdHlwZW9mIGUhPSJmdW5jdGlvbiJ8fGU9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTt2YXIgST1bXTtmb3IodmFyIHQgaW4gZSlmKGUsdCkmJkkucHVzaCh0KTtpZihMKWZvcih2YXIgbj0wLHI9TztuPHI7bisrKXt2YXIgaT1BW25dO2YoZSxpKSYmSS5wdXNoKGkpfXJldHVybiBJfX1EYXRlLm5vd3x8KERhdGUubm93PWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9KTt2YXIgXz0iCVxuXHgwYlxmXHIgXHUwMGEwXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHUyMDI4XHUyMDI5XHVmZWZmIjtpZighU3RyaW5nLnByb3RvdHlwZS50cmltfHxfLnRyaW0oKSl7Xz0iWyIrXysiXSI7dmFyIEQ9bmV3IFJlZ0V4cCgiXiIrXytfKyIqIiksUD1uZXcgUmVnRXhwKF8rXysiKiQiKTtTdHJpbmcucHJvdG90eXBlLnRyaW09ZnVuY3Rpb24oKXtyZXR1cm4gU3RyaW5nKHRoaXMpLnJlcGxhY2UoRCwiIikucmVwbGFjZShQLCIiKX19dmFyIEY9ZnVuY3Rpb24oZSl7aWYoZT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW4ndCBjb252ZXJ0ICIrZSsiIHRvIG9iamVjdCIpO3JldHVybiBPYmplY3QoZSl9fSksYWNlLmRlZmluZSgiYWNlL2xpYi9maXhvbGRicm93c2VycyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvcmVnZXhwIiwiYWNlL2xpYi9lczUtc2hpbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZSgiLi9yZWdleHAiKSxlKCIuL2VzNS1zaGltIiksdHlwZW9mIEVsZW1lbnQhPSJ1bmRlZmluZWQiJiYhRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoRWxlbWVudC5wcm90b3R5cGUsInJlbW92ZSIse2VudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyl9fSl9KSxhY2UuZGVmaW5lKCJhY2UvbGliL3VzZXJhZ2VudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dC5PUz17TElOVVg6IkxJTlVYIixNQUM6Ik1BQyIsV0lORE9XUzoiV0lORE9XUyJ9LHQuZ2V0T1M9ZnVuY3Rpb24oKXtyZXR1cm4gdC5pc01hYz90Lk9TLk1BQzp0LmlzTGludXg/dC5PUy5MSU5VWDp0Lk9TLldJTkRPV1N9O3ZhciByPXR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiP25hdmlnYXRvcjp7fSxpPSgvbWFjfHdpbnxsaW51eC9pLmV4ZWMoci5wbGF0Zm9ybSl8fFsib3RoZXIiXSlbMF0udG9Mb3dlckNhc2UoKSxzPXIudXNlckFnZW50fHwiIixvPXIuYXBwTmFtZXx8IiI7dC5pc1dpbj1pPT0id2luIix0LmlzTWFjPWk9PSJtYWMiLHQuaXNMaW51eD1pPT0ibGludXgiLHQuaXNJRT1vPT0iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyInx8by5pbmRleE9mKCJNU0FwcEhvc3QiKT49MD9wYXJzZUZsb2F0KChzLm1hdGNoKC8oPzpNU0lFIHxUcmlkZW50XC9bMC05XStbXC4wLTldKzsuKnJ2OikoWzAtOV0rW1wuMC05XSspLyl8fFtdKVsxXSk6cGFyc2VGbG9hdCgocy5tYXRjaCgvKD86VHJpZGVudFwvWzAtOV0rW1wuMC05XSs7LipydjopKFswLTldK1tcLjAtOV0rKS8pfHxbXSlbMV0pLHQuaXNPbGRJRT10LmlzSUUmJnQuaXNJRTw5LHQuaXNHZWNrbz10LmlzTW96aWxsYT1zLm1hdGNoKC8gR2Vja29cL1xkKy8pLHQuaXNPcGVyYT10eXBlb2Ygb3BlcmE9PSJvYmplY3QiJiZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93Lm9wZXJhKT09IltvYmplY3QgT3BlcmFdIix0LmlzV2ViS2l0PXBhcnNlRmxvYXQocy5zcGxpdCgiV2ViS2l0LyIpWzFdKXx8dW5kZWZpbmVkLHQuaXNDaHJvbWU9cGFyc2VGbG9hdChzLnNwbGl0KCIgQ2hyb21lLyIpWzFdKXx8dW5kZWZpbmVkLHQuaXNFZGdlPXBhcnNlRmxvYXQocy5zcGxpdCgiIEVkZ2UvIilbMV0pfHx1bmRlZmluZWQsdC5pc0FJUj1zLmluZGV4T2YoIkFkb2JlQUlSIik+PTAsdC5pc0FuZHJvaWQ9cy5pbmRleE9mKCJBbmRyb2lkIik+PTAsdC5pc0Nocm9tZU9TPXMuaW5kZXhPZigiIENyT1MgIik+PTAsdC5pc0lPUz0vaVBhZHxpUGhvbmV8aVBvZC8udGVzdChzKSYmIXdpbmRvdy5NU1N0cmVhbSx0LmlzSU9TJiYodC5pc01hYz0hMCksdC5pc01vYmlsZT10LmlzSU9TfHx0LmlzQW5kcm9pZH0pLGFjZS5kZWZpbmUoImFjZS9saWIvZG9tIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vdXNlcmFnZW50IiksaT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI7dC5idWlsZERvbT1mdW5jdGlvbiBvKGUsdCxuKXtpZih0eXBlb2YgZT09InN0cmluZyImJmUpe3ZhciByPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGUpO3JldHVybiB0JiZ0LmFwcGVuZENoaWxkKHIpLHJ9aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGU7aWYodHlwZW9mIGVbMF0hPSJzdHJpbmcifHwhZVswXSl7dmFyIGk9W107Zm9yKHZhciBzPTA7czxlLmxlbmd0aDtzKyspe3ZhciB1PW8oZVtzXSx0LG4pO3UmJmkucHVzaCh1KX1yZXR1cm4gaX12YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGVbMF0pLGY9ZVsxXSxsPTE7ZiYmdHlwZW9mIGY9PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheShmKSYmKGw9Mik7Zm9yKHZhciBzPWw7czxlLmxlbmd0aDtzKyspbyhlW3NdLGEsbik7cmV0dXJuIGw9PTImJk9iamVjdC5rZXlzKGYpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZltlXTtlPT09ImNsYXNzIj9hLmNsYXNzTmFtZT1BcnJheS5pc0FycmF5KHQpP3Quam9pbigiICIpOnQ6dHlwZW9mIHQ9PSJmdW5jdGlvbiJ8fGU9PSJ2YWx1ZSI/YVtlXT10OmU9PT0icmVmIj9uJiYoblt0XT1hKTp0IT1udWxsJiZhLnNldEF0dHJpYnV0ZShlLHQpfSksdCYmdC5hcHBlbmRDaGlsZChhKSxhfSx0LmdldERvY3VtZW50SGVhZD1mdW5jdGlvbihlKXtyZXR1cm4gZXx8KGU9ZG9jdW1lbnQpLGUuaGVhZHx8ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHxlLmRvY3VtZW50RWxlbWVudH0sdC5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUz9kb2N1bWVudC5jcmVhdGVFbGVtZW50TlModHx8aSxlKTpkb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpfSx0LnJlbW92ZUNoaWxkcmVuPWZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPSIifSx0LmNyZWF0ZVRleHROb2RlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dD90Lm93bmVyRG9jdW1lbnQ6ZG9jdW1lbnQ7cmV0dXJuIG4uY3JlYXRlVGV4dE5vZGUoZSl9LHQuY3JlYXRlRnJhZ21lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT9lLm93bmVyRG9jdW1lbnQ6ZG9jdW1lbnQ7cmV0dXJuIHQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpfSx0Lmhhc0Nzc0NsYXNzPWZ1bmN0aW9uKGUsdCl7dmFyIG49KGUuY2xhc3NOYW1lKyIiKS5zcGxpdCgvXHMrL2cpO3JldHVybiBuLmluZGV4T2YodCkhPT0tMX0sdC5hZGRDc3NDbGFzcz1mdW5jdGlvbihlLG4pe3QuaGFzQ3NzQ2xhc3MoZSxuKXx8KGUuY2xhc3NOYW1lKz0iICIrbil9LHQucmVtb3ZlQ3NzQ2xhc3M9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNsYXNzTmFtZS5zcGxpdCgvXHMrL2cpO2Zvcig7Oyl7dmFyIHI9bi5pbmRleE9mKHQpO2lmKHI9PS0xKWJyZWFrO24uc3BsaWNlKHIsMSl9ZS5jbGFzc05hbWU9bi5qb2luKCIgIil9LHQudG9nZ2xlQ3NzQ2xhc3M9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNsYXNzTmFtZS5zcGxpdCgvXHMrL2cpLHI9ITA7Zm9yKDs7KXt2YXIgaT1uLmluZGV4T2YodCk7aWYoaT09LTEpYnJlYWs7cj0hMSxuLnNwbGljZShpLDEpfXJldHVybiByJiZuLnB1c2godCksZS5jbGFzc05hbWU9bi5qb2luKCIgIikscn0sdC5zZXRDc3NDbGFzcz1mdW5jdGlvbihlLG4scil7cj90LmFkZENzc0NsYXNzKGUsbik6dC5yZW1vdmVDc3NDbGFzcyhlLG4pfSx0Lmhhc0Nzc1N0cmluZz1mdW5jdGlvbihlLHQpe3ZhciBuPTAscjt0PXR8fGRvY3VtZW50O2lmKHI9dC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpKXdoaWxlKG48ci5sZW5ndGgpaWYocltuKytdLmlkPT09ZSlyZXR1cm4hMH0sdC5pbXBvcnRDc3NTdHJpbmc9ZnVuY3Rpb24obixyLGkpe3ZhciBzPWk7aWYoIWl8fCFpLmdldFJvb3ROb2RlKXM9ZG9jdW1lbnQ7ZWxzZXtzPWkuZ2V0Um9vdE5vZGUoKTtpZighc3x8cz09aSlzPWRvY3VtZW50fXZhciBvPXMub3duZXJEb2N1bWVudHx8cztpZihyJiZ0Lmhhc0Nzc1N0cmluZyhyLHMpKXJldHVybiBudWxsO3ImJihuKz0iXG4vKiMgc291cmNlVVJMPWFjZS9jc3MvIityKyIgKi8iKTt2YXIgdT10LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7dS5hcHBlbmRDaGlsZChvLmNyZWF0ZVRleHROb2RlKG4pKSxyJiYodS5pZD1yKSxzPT1vJiYocz10LmdldERvY3VtZW50SGVhZChvKSkscy5pbnNlcnRCZWZvcmUodSxzLmZpcnN0Q2hpbGQpfSx0LmltcG9ydENzc1N0eWxzaGVldD1mdW5jdGlvbihlLG4pe3QuYnVpbGREb20oWyJsaW5rIix7cmVsOiJzdHlsZXNoZWV0IixocmVmOmV9XSx0LmdldERvY3VtZW50SGVhZChuKSl9LHQuc2Nyb2xsYmFyV2lkdGg9ZnVuY3Rpb24oZSl7dmFyIG49dC5jcmVhdGVFbGVtZW50KCJhY2VfaW5uZXIiKTtuLnN0eWxlLndpZHRoPSIxMDAlIixuLnN0eWxlLm1pbldpZHRoPSIwcHgiLG4uc3R5bGUuaGVpZ2h0PSIyMDBweCIsbi5zdHlsZS5kaXNwbGF5PSJibG9jayI7dmFyIHI9dC5jcmVhdGVFbGVtZW50KCJhY2Vfb3V0ZXIiKSxpPXIuc3R5bGU7aS5wb3NpdGlvbj0iYWJzb2x1dGUiLGkubGVmdD0iLTEwMDAwcHgiLGkub3ZlcmZsb3c9ImhpZGRlbiIsaS53aWR0aD0iMjAwcHgiLGkubWluV2lkdGg9IjBweCIsaS5oZWlnaHQ9IjE1MHB4IixpLmRpc3BsYXk9ImJsb2NrIixyLmFwcGVuZENoaWxkKG4pO3ZhciBzPWUuZG9jdW1lbnRFbGVtZW50O3MuYXBwZW5kQ2hpbGQocik7dmFyIG89bi5vZmZzZXRXaWR0aDtpLm92ZXJmbG93PSJzY3JvbGwiO3ZhciB1PW4ub2Zmc2V0V2lkdGg7cmV0dXJuIG89PXUmJih1PXIuY2xpZW50V2lkdGgpLHMucmVtb3ZlQ2hpbGQociksby11fSx0eXBlb2YgZG9jdW1lbnQ9PSJ1bmRlZmluZWQiJiYodC5pbXBvcnRDc3NTdHJpbmc9ZnVuY3Rpb24oKXt9KSx0LmNvbXB1dGVkU3R5bGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZSwiIil8fHt9fSx0LnNldFN0eWxlPWZ1bmN0aW9uKGUsdCxuKXtlW3RdIT09biYmKGVbdF09bil9LHQuSEFTX0NTU19BTklNQVRJT049ITEsdC5IQVNfQ1NTX1RSQU5TRk9STVM9ITEsdC5ISV9EUEk9ci5pc1dpbj90eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmRldmljZVBpeGVsUmF0aW8+PTEuNTohMDtpZih0eXBlb2YgZG9jdW1lbnQhPSJ1bmRlZmluZWQiKXt2YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LkhJX0RQSSYmcy5zdHlsZS50cmFuc2Zvcm0hPT11bmRlZmluZWQmJih0LkhBU19DU1NfVFJBTlNGT1JNUz0hMCksIXIuaXNFZGdlJiZ0eXBlb2Ygcy5zdHlsZS5hbmltYXRpb25OYW1lIT0idW5kZWZpbmVkIiYmKHQuSEFTX0NTU19BTklNQVRJT049ITApLHM9bnVsbH10LkhBU19DU1NfVFJBTlNGT1JNUz90LnRyYW5zbGF0ZT1mdW5jdGlvbihlLHQsbil7ZS5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZSgiK01hdGgucm91bmQodCkrInB4LCAiK01hdGgucm91bmQobikrInB4KSJ9OnQudHJhbnNsYXRlPWZ1bmN0aW9uKGUsdCxuKXtlLnN0eWxlLnRvcD1NYXRoLnJvdW5kKG4pKyJweCIsZS5zdHlsZS5sZWZ0PU1hdGgucm91bmQodCkrInB4In19KSxhY2UuZGVmaW5lKCJhY2UvbGliL29vcCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dC5pbmhlcml0cz1mdW5jdGlvbihlLHQpe2Uuc3VwZXJfPXQsZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSl9LHQubWl4aW49ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9LHQuaW1wbGVtZW50PWZ1bmN0aW9uKGUsbil7dC5taXhpbihlLG4pfX0pLGFjZS5kZWZpbmUoImFjZS9saWIva2V5cyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL29vcCIpLGk9ZnVuY3Rpb24oKXt2YXIgZT17TU9ESUZJRVJfS0VZUzp7MTY6IlNoaWZ0IiwxNzoiQ3RybCIsMTg6IkFsdCIsMjI0OiJNZXRhIiw5MToiTWV0YUxlZnQiLDkyOiJNZXRhUmlnaHQiLDkzOiJDb250ZXh0TWVudSJ9LEtFWV9NT0RTOntjdHJsOjEsYWx0OjIsb3B0aW9uOjIsc2hpZnQ6NCwic3VwZXIiOjgsbWV0YTo4LGNvbW1hbmQ6OCxjbWQ6OH0sRlVOQ1RJT05fS0VZUzp7ODoiQmFja3NwYWNlIiw5OiJUYWIiLDEzOiJSZXR1cm4iLDE5OiJQYXVzZSIsMjc6IkVzYyIsMzI6IlNwYWNlIiwzMzoiUGFnZVVwIiwzNDoiUGFnZURvd24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiTGVmdCIsMzg6IlVwIiwzOToiUmlnaHQiLDQwOiJEb3duIiw0NDoiUHJpbnQiLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDk2OiJOdW1wYWQwIiw5NzoiTnVtcGFkMSIsOTg6Ik51bXBhZDIiLDk5OiJOdW1wYWQzIiwxMDA6Ik51bXBhZDQiLDEwMToiTnVtcGFkNSIsMTAyOiJOdW1wYWQ2IiwxMDM6Ik51bXBhZDciLDEwNDoiTnVtcGFkOCIsMTA1OiJOdW1wYWQ5IiwiLTEzIjoiTnVtcGFkRW50ZXIiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtbG9jayIsMTQ1OiJTY3JvbGxsb2NrIn0sUFJJTlRBQkxFX0tFWVM6ezMyOiIgIiw0ODoiMCIsNDk6IjEiLDUwOiIyIiw1MToiMyIsNTI6IjQiLDUzOiI1Iiw1NDoiNiIsNTU6IjciLDU2OiI4Iiw1NzoiOSIsNTk6IjsiLDYxOiI9Iiw2NToiYSIsNjY6ImIiLDY3OiJjIiw2ODoiZCIsNjk6ImUiLDcwOiJmIiw3MToiZyIsNzI6ImgiLDczOiJpIiw3NDoiaiIsNzU6ImsiLDc2OiJsIiw3NzoibSIsNzg6Im4iLDc5OiJvIiw4MDoicCIsODE6InEiLDgyOiJyIiw4MzoicyIsODQ6InQiLDg1OiJ1Iiw4NjoidiIsODc6InciLDg4OiJ4Iiw4OToieSIsOTA6InoiLDEwNzoiKyIsMTA5OiItIiwxMTA6Ii4iLDE4NjoiOyIsMTg3OiI9IiwxODg6IiwiLDE4OToiLSIsMTkwOiIuIiwxOTE6Ii8iLDE5MjoiYCIsMjE5OiJbIiwyMjA6IlxcIiwyMjE6Il0iLDIyMjoiJyIsMTExOiIvIiwxMDY6IioifX0sdCxuO2ZvcihuIGluIGUuRlVOQ1RJT05fS0VZUyl0PWUuRlVOQ1RJT05fS0VZU1tuXS50b0xvd2VyQ2FzZSgpLGVbdF09cGFyc2VJbnQobiwxMCk7Zm9yKG4gaW4gZS5QUklOVEFCTEVfS0VZUyl0PWUuUFJJTlRBQkxFX0tFWVNbbl0udG9Mb3dlckNhc2UoKSxlW3RdPXBhcnNlSW50KG4sMTApO3JldHVybiByLm1peGluKGUsZS5NT0RJRklFUl9LRVlTKSxyLm1peGluKGUsZS5QUklOVEFCTEVfS0VZUyksci5taXhpbihlLGUuRlVOQ1RJT05fS0VZUyksZS5lbnRlcj1lWyJyZXR1cm4iXSxlLmVzY2FwZT1lLmVzYyxlLmRlbD1lWyJkZWxldGUiXSxlWzE3M109Ii0iLGZ1bmN0aW9uKCl7dmFyIHQ9WyJjbWQiLCJjdHJsIiwiYWx0Iiwic2hpZnQiXTtmb3IodmFyIG49TWF0aC5wb3coMix0Lmxlbmd0aCk7bi0tOyllLktFWV9NT0RTW25dPXQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBuJmUuS0VZX01PRFNbdF19KS5qb2luKCItIikrIi0ifSgpLGUuS0VZX01PRFNbMF09IiIsZS5LRVlfTU9EU1stMV09ImlucHV0LSIsZX0oKTtyLm1peGluKHQsaSksdC5rZXlDb2RlVG9TdHJpbmc9ZnVuY3Rpb24oZSl7dmFyIHQ9aVtlXTtyZXR1cm4gdHlwZW9mIHQhPSJzdHJpbmciJiYodD1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpKSx0LnRvTG93ZXJDYXNlKCl9fSksYWNlLmRlZmluZSgiYWNlL2xpYi9ldmVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIva2V5cyIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGUsdCxuKXt2YXIgYT11KHQpO2lmKCFpLmlzTWFjJiZzKXt0LmdldE1vZGlmaWVyU3RhdGUmJih0LmdldE1vZGlmaWVyU3RhdGUoIk9TIil8fHQuZ2V0TW9kaWZpZXJTdGF0ZSgiV2luIikpJiYoYXw9OCk7aWYocy5hbHRHcil7aWYoKDMmYSk9PTMpcmV0dXJuO3MuYWx0R3I9MH1pZihuPT09MTh8fG49PT0xNyl7dmFyIGY9ImxvY2F0aW9uImluIHQ/dC5sb2NhdGlvbjp0LmtleUxvY2F0aW9uO2lmKG49PT0xNyYmZj09PTEpc1tuXT09MSYmKG89dC50aW1lU3RhbXApO2Vsc2UgaWYobj09PTE4JiZhPT09MyYmZj09PTIpe3ZhciBsPXQudGltZVN0YW1wLW87bDw1MCYmKHMuYWx0R3I9ITApfX19biBpbiByLk1PRElGSUVSX0tFWVMmJihuPS0xKTtpZighYSYmbj09PTEzKXt2YXIgZj0ibG9jYXRpb24iaW4gdD90LmxvY2F0aW9uOnQua2V5TG9jYXRpb247aWYoZj09PTMpe2UodCxhLC1uKTtpZih0LmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJufX1pZihpLmlzQ2hyb21lT1MmJmEmOCl7ZSh0LGEsbik7aWYodC5kZWZhdWx0UHJldmVudGVkKXJldHVybjthJj0tOX1yZXR1cm4hIWF8fG4gaW4gci5GVU5DVElPTl9LRVlTfHxuIGluIHIuUFJJTlRBQkxFX0tFWVM/ZSh0LGEsbik6ITF9ZnVuY3Rpb24gZigpe3M9T2JqZWN0LmNyZWF0ZShudWxsKX12YXIgcj1lKCIuL2tleXMiKSxpPWUoIi4vdXNlcmFnZW50Iikscz1udWxsLG89MDt0LmFkZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCxuKXtpZihlLmFkZEV2ZW50TGlzdGVuZXIpcmV0dXJuIGUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpO2lmKGUuYXR0YWNoRXZlbnQpe3ZhciByPWZ1bmN0aW9uKCl7bi5jYWxsKGUsd2luZG93LmV2ZW50KX07bi5fd3JhcHBlcj1yLGUuYXR0YWNoRXZlbnQoIm9uIit0LHIpfX0sdC5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihlLHQsbil7aWYoZS5yZW1vdmVFdmVudExpc3RlbmVyKXJldHVybiBlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLCExKTtlLmRldGFjaEV2ZW50JiZlLmRldGFjaEV2ZW50KCJvbiIrdCxuLl93cmFwcGVyfHxuKX0sdC5zdG9wRXZlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuc3RvcFByb3BhZ2F0aW9uKGUpLHQucHJldmVudERlZmF1bHQoZSksITF9LHQuc3RvcFByb3BhZ2F0aW9uPWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uP2Uuc3RvcFByb3BhZ2F0aW9uKCk6ZS5jYW5jZWxCdWJibGU9ITB9LHQucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdD9lLnByZXZlbnREZWZhdWx0KCk6ZS5yZXR1cm5WYWx1ZT0hMX0sdC5nZXRCdXR0b249ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09ImRibGNsaWNrIj8wOmUudHlwZT09ImNvbnRleHRtZW51Inx8aS5pc01hYyYmZS5jdHJsS2V5JiYhZS5hbHRLZXkmJiFlLnNoaWZ0S2V5PzI6ZS5wcmV2ZW50RGVmYXVsdD9lLmJ1dHRvbjp7MTowLDI6Miw0OjF9W2UuYnV0dG9uXX0sdC5jYXB0dXJlPWZ1bmN0aW9uKGUsbixyKXtmdW5jdGlvbiBpKGUpe24mJm4oZSksciYmcihlKSx0LnJlbW92ZUxpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLG4sITApLHQucmVtb3ZlTGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLGksITApLHQucmVtb3ZlTGlzdGVuZXIoZG9jdW1lbnQsImRyYWdzdGFydCIsaSwhMCl9cmV0dXJuIHQuYWRkTGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsbiwhMCksdC5hZGRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsaSwhMCksdC5hZGRMaXN0ZW5lcihkb2N1bWVudCwiZHJhZ3N0YXJ0IixpLCEwKSxpfSx0LmFkZE1vdXNlV2hlZWxMaXN0ZW5lcj1mdW5jdGlvbihlLG4peyJvbm1vdXNld2hlZWwiaW4gZT90LmFkZExpc3RlbmVyKGUsIm1vdXNld2hlZWwiLGZ1bmN0aW9uKGUpe3ZhciB0PTg7ZS53aGVlbERlbHRhWCE9PXVuZGVmaW5lZD8oZS53aGVlbFg9LWUud2hlZWxEZWx0YVgvdCxlLndoZWVsWT0tZS53aGVlbERlbHRhWS90KTooZS53aGVlbFg9MCxlLndoZWVsWT0tZS53aGVlbERlbHRhL3QpLG4oZSl9KToib253aGVlbCJpbiBlP3QuYWRkTGlzdGVuZXIoZSwid2hlZWwiLGZ1bmN0aW9uKGUpe3ZhciB0PS4zNTtzd2l0Y2goZS5kZWx0YU1vZGUpe2Nhc2UgZS5ET01fREVMVEFfUElYRUw6ZS53aGVlbFg9ZS5kZWx0YVgqdHx8MCxlLndoZWVsWT1lLmRlbHRhWSp0fHwwO2JyZWFrO2Nhc2UgZS5ET01fREVMVEFfTElORTpjYXNlIGUuRE9NX0RFTFRBX1BBR0U6ZS53aGVlbFg9KGUuZGVsdGFYfHwwKSo1LGUud2hlZWxZPShlLmRlbHRhWXx8MCkqNX1uKGUpfSk6dC5hZGRMaXN0ZW5lcihlLCJET01Nb3VzZVNjcm9sbCIsZnVuY3Rpb24oZSl7ZS5heGlzJiZlLmF4aXM9PWUuSE9SSVpPTlRBTF9BWElTPyhlLndoZWVsWD0oZS5kZXRhaWx8fDApKjUsZS53aGVlbFk9MCk6KGUud2hlZWxYPTAsZS53aGVlbFk9KGUuZGV0YWlsfHwwKSo1KSxuKGUpfSl9LHQuYWRkTXVsdGlNb3VzZURvd25MaXN0ZW5lcj1mdW5jdGlvbihlLG4scixzKXtmdW5jdGlvbiBjKGUpe3QuZ2V0QnV0dG9uKGUpIT09MD9vPTA6ZS5kZXRhaWw+MT8obysrLG8+NCYmKG89MSkpOm89MTtpZihpLmlzSUUpe3ZhciBjPU1hdGguYWJzKGUuY2xpZW50WC11KT41fHxNYXRoLmFicyhlLmNsaWVudFktYSk+NTtpZighZnx8YylvPTE7ZiYmY2xlYXJUaW1lb3V0KGYpLGY9c2V0VGltZW91dChmdW5jdGlvbigpe2Y9bnVsbH0sbltvLTFdfHw2MDApLG89PTEmJih1PWUuY2xpZW50WCxhPWUuY2xpZW50WSl9ZS5fY2xpY2tzPW8scltzXSgibW91c2Vkb3duIixlKTtpZihvPjQpbz0wO2Vsc2UgaWYobz4xKXJldHVybiByW3NdKGxbb10sZSl9ZnVuY3Rpb24gaChlKXtvPTIsZiYmY2xlYXJUaW1lb3V0KGYpLGY9c2V0VGltZW91dChmdW5jdGlvbigpe2Y9bnVsbH0sbltvLTFdfHw2MDApLHJbc10oIm1vdXNlZG93biIsZSkscltzXShsW29dLGUpfXZhciBvPTAsdSxhLGYsbD17MjoiZGJsY2xpY2siLDM6InRyaXBsZWNsaWNrIiw0OiJxdWFkY2xpY2sifTtBcnJheS5pc0FycmF5KGUpfHwoZT1bZV0pLGUuZm9yRWFjaChmdW5jdGlvbihlKXt0LmFkZExpc3RlbmVyKGUsIm1vdXNlZG93biIsYyksaS5pc09sZElFJiZ0LmFkZExpc3RlbmVyKGUsImRibGNsaWNrIixoKX0pfTt2YXIgdT0haS5pc01hY3x8IWkuaXNPcGVyYXx8IktleWJvYXJkRXZlbnQiaW4gd2luZG93P2Z1bmN0aW9uKGUpe3JldHVybiAwfChlLmN0cmxLZXk/MTowKXwoZS5hbHRLZXk/MjowKXwoZS5zaGlmdEtleT80OjApfChlLm1ldGFLZXk/ODowKX06ZnVuY3Rpb24oZSl7cmV0dXJuIDB8KGUubWV0YUtleT8xOjApfChlLmFsdEtleT8yOjApfChlLnNoaWZ0S2V5PzQ6MCl8KGUuY3RybEtleT84OjApfTt0LmdldE1vZGlmaWVyU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiByLktFWV9NT0RTW3UoZSldfSx0LmFkZENvbW1hbmRLZXlMaXN0ZW5lcj1mdW5jdGlvbihlLG4pe3ZhciByPXQuYWRkTGlzdGVuZXI7aWYoaS5pc09sZEdlY2tvfHxpLmlzT3BlcmEmJiEoIktleWJvYXJkRXZlbnQiaW4gd2luZG93KSl7dmFyIG89bnVsbDtyKGUsImtleWRvd24iLGZ1bmN0aW9uKGUpe289ZS5rZXlDb2RlfSkscihlLCJrZXlwcmVzcyIsZnVuY3Rpb24oZSl7cmV0dXJuIGEobixlLG8pfSl9ZWxzZXt2YXIgdT1udWxsO3IoZSwia2V5ZG93biIsZnVuY3Rpb24oZSl7c1tlLmtleUNvZGVdPShzW2Uua2V5Q29kZV18fDApKzE7dmFyIHQ9YShuLGUsZS5rZXlDb2RlKTtyZXR1cm4gdT1lLmRlZmF1bHRQcmV2ZW50ZWQsdH0pLHIoZSwia2V5cHJlc3MiLGZ1bmN0aW9uKGUpe3UmJihlLmN0cmxLZXl8fGUuYWx0S2V5fHxlLnNoaWZ0S2V5fHxlLm1ldGFLZXkpJiYodC5zdG9wRXZlbnQoZSksdT1udWxsKX0pLHIoZSwia2V5dXAiLGZ1bmN0aW9uKGUpe3NbZS5rZXlDb2RlXT1udWxsfSksc3x8KGYoKSxyKHdpbmRvdywiZm9jdXMiLGYpKX19O2lmKHR5cGVvZiB3aW5kb3c9PSJvYmplY3QiJiZ3aW5kb3cucG9zdE1lc3NhZ2UmJiFpLmlzT2xkSUUpe3ZhciBsPTE7dC5uZXh0VGljaz1mdW5jdGlvbihlLG4pe249bnx8d2luZG93O3ZhciByPSJ6ZXJvLXRpbWVvdXQtbWVzc2FnZS0iK2wrKyxpPWZ1bmN0aW9uKHMpe3MuZGF0YT09ciYmKHQuc3RvcFByb3BhZ2F0aW9uKHMpLHQucmVtb3ZlTGlzdGVuZXIobiwibWVzc2FnZSIsaSksZSgpKX07dC5hZGRMaXN0ZW5lcihuLCJtZXNzYWdlIixpKSxuLnBvc3RNZXNzYWdlKHIsIioiKX19dC4kaWRsZUJsb2NrZWQ9ITEsdC5vbklkbGU9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbiByKCl7dC4kaWRsZUJsb2NrZWQ/c2V0VGltZW91dChyLDEwMCk6ZSgpfSxuKX0sdC4kaWRsZUJsb2NrSWQ9bnVsbCx0LmJsb2NrSWRsZT1mdW5jdGlvbihlKXt0LiRpZGxlQmxvY2tJZCYmY2xlYXJUaW1lb3V0KHQuJGlkbGVCbG9ja0lkKSx0LiRpZGxlQmxvY2tlZD0hMCx0LiRpZGxlQmxvY2tJZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC4kaWRsZUJsb2NrZWQ9ITF9LGV8fDEwMCl9LHQubmV4dEZyYW1lPXR5cGVvZiB3aW5kb3c9PSJvYmplY3QiJiYod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZSksdC5uZXh0RnJhbWU/dC5uZXh0RnJhbWU9dC5uZXh0RnJhbWUuYmluZCh3aW5kb3cpOnQubmV4dEZyYW1lPWZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoZSwxNyl9fSksYWNlLmRlZmluZSgiYWNlL3JhbmdlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1mdW5jdGlvbihlLHQpe3JldHVybiBlLnJvdy10LnJvd3x8ZS5jb2x1bW4tdC5jb2x1bW59LGk9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5zdGFydD17cm93OmUsY29sdW1uOnR9LHRoaXMuZW5kPXtyb3c6bixjb2x1bW46cn19OyhmdW5jdGlvbigpe3RoaXMuaXNFcXVhbD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zdGFydC5yb3c9PT1lLnN0YXJ0LnJvdyYmdGhpcy5lbmQucm93PT09ZS5lbmQucm93JiZ0aGlzLnN0YXJ0LmNvbHVtbj09PWUuc3RhcnQuY29sdW1uJiZ0aGlzLmVuZC5jb2x1bW49PT1lLmVuZC5jb2x1bW59LHRoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iUmFuZ2U6IFsiK3RoaXMuc3RhcnQucm93KyIvIit0aGlzLnN0YXJ0LmNvbHVtbisiXSAtPiBbIit0aGlzLmVuZC5yb3crIi8iK3RoaXMuZW5kLmNvbHVtbisiXSJ9LHRoaXMuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5jb21wYXJlKGUsdCk9PTB9LHRoaXMuY29tcGFyZVJhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5lbmQscj1lLnN0YXJ0O3JldHVybiB0PXRoaXMuY29tcGFyZShuLnJvdyxuLmNvbHVtbiksdD09MT8odD10aGlzLmNvbXBhcmUoci5yb3csci5jb2x1bW4pLHQ9PTE/Mjp0PT0wPzE6MCk6dD09LTE/LTI6KHQ9dGhpcy5jb21wYXJlKHIucm93LHIuY29sdW1uKSx0PT0tMT8tMTp0PT0xPzQyOjApfSx0aGlzLmNvbXBhcmVQb2ludD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jb21wYXJlKGUucm93LGUuY29sdW1uKX0sdGhpcy5jb250YWluc1JhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbXBhcmVQb2ludChlLnN0YXJ0KT09MCYmdGhpcy5jb21wYXJlUG9pbnQoZS5lbmQpPT0wfSx0aGlzLmludGVyc2VjdHM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jb21wYXJlUmFuZ2UoZSk7cmV0dXJuIHQ9PS0xfHx0PT0wfHx0PT0xfSx0aGlzLmlzRW5kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5kLnJvdz09ZSYmdGhpcy5lbmQuY29sdW1uPT10fSx0aGlzLmlzU3RhcnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zdGFydC5yb3c9PWUmJnRoaXMuc3RhcnQuY29sdW1uPT10fSx0aGlzLnNldFN0YXJ0PWZ1bmN0aW9uKGUsdCl7dHlwZW9mIGU9PSJvYmplY3QiPyh0aGlzLnN0YXJ0LmNvbHVtbj1lLmNvbHVtbix0aGlzLnN0YXJ0LnJvdz1lLnJvdyk6KHRoaXMuc3RhcnQucm93PWUsdGhpcy5zdGFydC5jb2x1bW49dCl9LHRoaXMuc2V0RW5kPWZ1bmN0aW9uKGUsdCl7dHlwZW9mIGU9PSJvYmplY3QiPyh0aGlzLmVuZC5jb2x1bW49ZS5jb2x1bW4sdGhpcy5lbmQucm93PWUucm93KToodGhpcy5lbmQucm93PWUsdGhpcy5lbmQuY29sdW1uPXQpfSx0aGlzLmluc2lkZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmNvbXBhcmUoZSx0KT09MD90aGlzLmlzRW5kKGUsdCl8fHRoaXMuaXNTdGFydChlLHQpPyExOiEwOiExfSx0aGlzLmluc2lkZVN0YXJ0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuY29tcGFyZShlLHQpPT0wP3RoaXMuaXNFbmQoZSx0KT8hMTohMDohMX0sdGhpcy5pbnNpZGVFbmQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5jb21wYXJlKGUsdCk9PTA/dGhpcy5pc1N0YXJ0KGUsdCk/ITE6ITA6ITF9LHRoaXMuY29tcGFyZT1mdW5jdGlvbihlLHQpe3JldHVybiF0aGlzLmlzTXVsdGlMaW5lKCkmJmU9PT10aGlzLnN0YXJ0LnJvdz90PHRoaXMuc3RhcnQuY29sdW1uPy0xOnQ+dGhpcy5lbmQuY29sdW1uPzE6MDplPHRoaXMuc3RhcnQucm93Py0xOmU+dGhpcy5lbmQucm93PzE6dGhpcy5zdGFydC5yb3c9PT1lP3Q+PXRoaXMuc3RhcnQuY29sdW1uPzA6LTE6dGhpcy5lbmQucm93PT09ZT90PD10aGlzLmVuZC5jb2x1bW4/MDoxOjB9LHRoaXMuY29tcGFyZVN0YXJ0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuc3RhcnQucm93PT1lJiZ0aGlzLnN0YXJ0LmNvbHVtbj09dD8tMTp0aGlzLmNvbXBhcmUoZSx0KX0sdGhpcy5jb21wYXJlRW5kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5kLnJvdz09ZSYmdGhpcy5lbmQuY29sdW1uPT10PzE6dGhpcy5jb21wYXJlKGUsdCl9LHRoaXMuY29tcGFyZUluc2lkZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuZC5yb3c9PWUmJnRoaXMuZW5kLmNvbHVtbj09dD8xOnRoaXMuc3RhcnQucm93PT1lJiZ0aGlzLnN0YXJ0LmNvbHVtbj09dD8tMTp0aGlzLmNvbXBhcmUoZSx0KX0sdGhpcy5jbGlwUm93cz1mdW5jdGlvbihlLHQpe2lmKHRoaXMuZW5kLnJvdz50KXZhciBuPXtyb3c6dCsxLGNvbHVtbjowfTtlbHNlIGlmKHRoaXMuZW5kLnJvdzxlKXZhciBuPXtyb3c6ZSxjb2x1bW46MH07aWYodGhpcy5zdGFydC5yb3c+dCl2YXIgcj17cm93OnQrMSxjb2x1bW46MH07ZWxzZSBpZih0aGlzLnN0YXJ0LnJvdzxlKXZhciByPXtyb3c6ZSxjb2x1bW46MH07cmV0dXJuIGkuZnJvbVBvaW50cyhyfHx0aGlzLnN0YXJ0LG58fHRoaXMuZW5kKX0sdGhpcy5leHRlbmQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNvbXBhcmUoZSx0KTtpZihuPT0wKXJldHVybiB0aGlzO2lmKG49PS0xKXZhciByPXtyb3c6ZSxjb2x1bW46dH07ZWxzZSB2YXIgcz17cm93OmUsY29sdW1uOnR9O3JldHVybiBpLmZyb21Qb2ludHMocnx8dGhpcy5zdGFydCxzfHx0aGlzLmVuZCl9LHRoaXMuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0LnJvdz09PXRoaXMuZW5kLnJvdyYmdGhpcy5zdGFydC5jb2x1bW49PT10aGlzLmVuZC5jb2x1bW59LHRoaXMuaXNNdWx0aUxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydC5yb3chPT10aGlzLmVuZC5yb3d9LHRoaXMuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gaS5mcm9tUG9pbnRzKHRoaXMuc3RhcnQsdGhpcy5lbmQpfSx0aGlzLmNvbGxhcHNlUm93cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVuZC5jb2x1bW49PTA/bmV3IGkodGhpcy5zdGFydC5yb3csMCxNYXRoLm1heCh0aGlzLnN0YXJ0LnJvdyx0aGlzLmVuZC5yb3ctMSksMCk6bmV3IGkodGhpcy5zdGFydC5yb3csMCx0aGlzLmVuZC5yb3csMCl9LHRoaXMudG9TY3JlZW5SYW5nZT1mdW5jdGlvbihlKXt2YXIgdD1lLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLnN0YXJ0KSxuPWUuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuZW5kKTtyZXR1cm4gbmV3IGkodC5yb3csdC5jb2x1bW4sbi5yb3csbi5jb2x1bW4pfSx0aGlzLm1vdmVCeT1mdW5jdGlvbihlLHQpe3RoaXMuc3RhcnQucm93Kz1lLHRoaXMuc3RhcnQuY29sdW1uKz10LHRoaXMuZW5kLnJvdys9ZSx0aGlzLmVuZC5jb2x1bW4rPXR9fSkuY2FsbChpLnByb3RvdHlwZSksaS5mcm9tUG9pbnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBpKGUucm93LGUuY29sdW1uLHQucm93LHQuY29sdW1uKX0saS5jb21wYXJlUG9pbnRzPXIsaS5jb21wYXJlUG9pbnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucm93LXQucm93fHxlLmNvbHVtbi10LmNvbHVtbn0sdC5SYW5nZT1pfSksYWNlLmRlZmluZSgiYWNlL2xpYi9sYW5nIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0Lmxhc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGVbZS5sZW5ndGgtMV19LHQuc3RyaW5nUmV2ZXJzZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5zcGxpdCgiIikucmV2ZXJzZSgpLmpvaW4oIiIpfSx0LnN0cmluZ1JlcGVhdD1mdW5jdGlvbihlLHQpe3ZhciBuPSIiO3doaWxlKHQ+MCl7dCYxJiYobis9ZSk7aWYodD4+PTEpZSs9ZX1yZXR1cm4gbn07dmFyIHI9L15cc1xzKi8saT0vXHNccyokLzt0LnN0cmluZ1RyaW1MZWZ0PWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UociwiIil9LHQuc3RyaW5nVHJpbVJpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoaSwiIil9LHQuY29weU9iamVjdD1mdW5jdGlvbihlKXt2YXIgdD17fTtmb3IodmFyIG4gaW4gZSl0W25dPWVbbl07cmV0dXJuIHR9LHQuY29weUFycmF5PWZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyllW25dJiZ0eXBlb2YgZVtuXT09Im9iamVjdCI/dFtuXT10aGlzLmNvcHlPYmplY3QoZVtuXSk6dFtuXT1lW25dO3JldHVybiB0fSx0LmRlZXBDb3B5PWZ1bmN0aW9uIHMoZSl7aWYodHlwZW9mIGUhPSJvYmplY3QifHwhZSlyZXR1cm4gZTt2YXIgdDtpZihBcnJheS5pc0FycmF5KGUpKXt0PVtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXRbbl09cyhlW25dKTtyZXR1cm4gdH1pZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkhPT0iW29iamVjdCBPYmplY3RdIilyZXR1cm4gZTt0PXt9O2Zvcih2YXIgbiBpbiBlKXRbbl09cyhlW25dKTtyZXR1cm4gdH0sdC5hcnJheVRvTWFwPWZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXRbZVtuXV09MTtyZXR1cm4gdH0sdC5jcmVhdGVNYXA9ZnVuY3Rpb24oZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IodmFyIG4gaW4gZSl0W25dPWVbbl07cmV0dXJuIHR9LHQuYXJyYXlSZW1vdmU9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPD1lLmxlbmd0aDtuKyspdD09PWVbbl0mJmUuc3BsaWNlKG4sMSl9LHQuZXNjYXBlUmVnRXhwPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyhbLiorP14ke30oKXxbXF1cL1xcXSkvZywiXFwkMSIpfSx0LmVzY2FwZUhUTUw9ZnVuY3Rpb24oZSl7cmV0dXJuKCIiK2UpLnJlcGxhY2UoLyYvZywiJiMzODsiKS5yZXBsYWNlKC8iL2csIiYjMzQ7IikucmVwbGFjZSgvJy9nLCImIzM5OyIpLnJlcGxhY2UoLzwvZywiJiM2MDsiKX0sdC5nZXRNYXRjaE9mZnNldHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXTtyZXR1cm4gZS5yZXBsYWNlKHQsZnVuY3Rpb24oZSl7bi5wdXNoKHtvZmZzZXQ6YXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMl0sbGVuZ3RoOmUubGVuZ3RofSl9KSxufSx0LmRlZmVycmVkQ2FsbD1mdW5jdGlvbihlKXt2YXIgdD1udWxsLG49ZnVuY3Rpb24oKXt0PW51bGwsZSgpfSxyPWZ1bmN0aW9uKGUpe3JldHVybiByLmNhbmNlbCgpLHQ9c2V0VGltZW91dChuLGV8fDApLHJ9O3JldHVybiByLnNjaGVkdWxlPXIsci5jYWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuY2VsKCksZSgpLHJ9LHIuY2FuY2VsPWZ1bmN0aW9uKCl7cmV0dXJuIGNsZWFyVGltZW91dCh0KSx0PW51bGwscn0sci5pc1BlbmRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0scn0sdC5kZWxheWVkQ2FsbD1mdW5jdGlvbihlLHQpe3ZhciBuPW51bGwscj1mdW5jdGlvbigpe249bnVsbCxlKCl9LGk9ZnVuY3Rpb24oZSl7bj09bnVsbCYmKG49c2V0VGltZW91dChyLGV8fHQpKX07cmV0dXJuIGkuZGVsYXk9ZnVuY3Rpb24oZSl7biYmY2xlYXJUaW1lb3V0KG4pLG49c2V0VGltZW91dChyLGV8fHQpfSxpLnNjaGVkdWxlPWksaS5jYWxsPWZ1bmN0aW9uKCl7dGhpcy5jYW5jZWwoKSxlKCl9LGkuY2FuY2VsPWZ1bmN0aW9uKCl7biYmY2xlYXJUaW1lb3V0KG4pLG49bnVsbH0saS5pc1BlbmRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gbn0saX19KSxhY2UuZGVmaW5lKCJhY2UvY2xpcGJvYXJkIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcjtuLmV4cG9ydHM9e2xpbmVNb2RlOiExLHBhc3RlQ2FuY2VsbGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHImJnI+RGF0ZS5ub3coKS01MD8hMDpyPSExfSxjYW5jZWw6ZnVuY3Rpb24oKXtyPURhdGUubm93KCl9fX0pLGFjZS5kZWZpbmUoImFjZS9rZXlib2FyZC90ZXh0aW5wdXQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi91c2VyYWdlbnQiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvbGFuZyIsImFjZS9jbGlwYm9hcmQiLCJhY2UvbGliL2tleXMiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9ldmVudCIpLGk9ZSgiLi4vbGliL3VzZXJhZ2VudCIpLHM9ZSgiLi4vbGliL2RvbSIpLG89ZSgiLi4vbGliL2xhbmciKSx1PWUoIi4uL2NsaXBib2FyZCIpLGE9aS5pc0Nocm9tZTwxOCxmPWkuaXNJRSxsPWkuaXNDaHJvbWU+NjMsYz00MDAsaD1lKCIuLi9saWIva2V5cyIpLHA9aC5LRVlfTU9EUyxkPWkuaXNJT1Msdj1kPy9ccy86L1xuLyxtPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24geigpe1M9ITAsbi5ibHVyKCksbi5mb2N1cygpLFM9ITF9ZnVuY3Rpb24gWChlKXtlLmtleUNvZGU9PTI3JiZuLnZhbHVlLmxlbmd0aDxuLnNlbGVjdGlvblN0YXJ0JiYoeXx8KHg9bi52YWx1ZSksVD1OPS0xLEwoKSksVygpfWZ1bmN0aW9uICQoKXtjbGVhclRpbWVvdXQoViksVj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dyYmKG4uc3R5bGUuY3NzVGV4dD13LHc9IiIpLHQucmVuZGVyZXIuJGlzTW91c2VQcmVzc2VkPSExLHQucmVuZGVyZXIuJGtlZXBUZXh0QXJlYUF0Q3Vyc29yJiZ0LnJlbmRlcmVyLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcigpfSwwKX1mdW5jdGlvbiBLKGUsdCxuKXt2YXIgcj1udWxsLGk9ITE7bi5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihlKXtyJiZjbGVhclRpbWVvdXQociksaT0hMH0sITApLG4uYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLGZ1bmN0aW9uKGUpe3I9c2V0VGltZW91dChmdW5jdGlvbigpe2k9ITF9LDEwMCl9LCEwKTt2YXIgcz1mdW5jdGlvbihlKXtpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09bilyZXR1cm47aWYoaXx8eXx8dC4kbW91c2VIYW5kbGVyLmlzTW91c2VQcmVzc2VkKXJldHVybjtpZihtKXJldHVybjt2YXIgcj1uLnNlbGVjdGlvblN0YXJ0LHM9bi5zZWxlY3Rpb25FbmQsbz1udWxsLHU9MDtpZihyPT0wKW89aC51cDtlbHNlIGlmKHI9PTEpbz1oLmhvbWU7ZWxzZSBpZihzPk4mJnhbc109PSJcbiIpbz1oLmVuZDtlbHNlIGlmKHI8VCYmeFtyLTFdPT0iICIpbz1oLmxlZnQsdT1wLm9wdGlvbjtlbHNlIGlmKHI8VHx8cj09VCYmTiE9VCYmcj09cylvPWgubGVmdDtlbHNlIGlmKHM+TiYmeC5zbGljZSgwLHMpLnNwbGl0KCJcbiIpLmxlbmd0aD4yKW89aC5kb3duO2Vsc2UgaWYocz5OJiZ4W3MtMV09PSIgIilvPWgucmlnaHQsdT1wLm9wdGlvbjtlbHNlIGlmKHM+Tnx8cz09TiYmTiE9VCYmcj09cylvPWgucmlnaHQ7ciE9PXMmJih1fD1wLnNoaWZ0KTtpZihvKXt2YXIgYT10Lm9uQ29tbWFuZEtleSh7fSx1LG8pO2lmKCFhJiZ0LmNvbW1hbmRzKXtvPWgua2V5Q29kZVRvU3RyaW5nKG8pO3ZhciBmPXQuY29tbWFuZHMuZmluZEtleUNvbW1hbmQodSxvKTtmJiZ0LmV4ZWNDb21tYW5kKGYpfVQ9cixOPXMsTCgiIil9fTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLHMpLHQub24oImRlc3Ryb3kiLGZ1bmN0aW9uKCl7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIixzKX0pfXZhciBuPXMuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTtuLmNsYXNzTmFtZT0iYWNlX3RleHQtaW5wdXQiLG4uc2V0QXR0cmlidXRlKCJ3cmFwIiwib2ZmIiksbi5zZXRBdHRyaWJ1dGUoImF1dG9jb3JyZWN0Iiwib2ZmIiksbi5zZXRBdHRyaWJ1dGUoImF1dG9jYXBpdGFsaXplIiwib2ZmIiksbi5zZXRBdHRyaWJ1dGUoInNwZWxsY2hlY2siLCExKSxuLnN0eWxlLm9wYWNpdHk9IjAiLGUuaW5zZXJ0QmVmb3JlKG4sZS5maXJzdENoaWxkKTt2YXIgbT0hMSxnPSExLHk9ITEsYj0hMSx3PSIiO2kuaXNNb2JpbGV8fChuLnN0eWxlLmZvbnRTaXplPSIxcHgiKTt2YXIgRT0hMSxTPSExLHg9IiIsVD0wLE49MDt0cnl7dmFyIEM9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PW59Y2F0Y2goayl7fXIuYWRkTGlzdGVuZXIobiwiYmx1ciIsZnVuY3Rpb24oZSl7aWYoUylyZXR1cm47dC5vbkJsdXIoZSksQz0hMX0pLHIuYWRkTGlzdGVuZXIobiwiZm9jdXMiLGZ1bmN0aW9uKGUpe2lmKFMpcmV0dXJuO0M9ITA7aWYoaS5pc0VkZ2UpdHJ5e2lmKCFkb2N1bWVudC5oYXNGb2N1cygpKXJldHVybn1jYXRjaChlKXt9dC5vbkZvY3VzKGUpLGkuaXNFZGdlP3NldFRpbWVvdXQoTCk6TCgpfSksdGhpcy4kZm9jdXNTY3JvbGw9ITEsdGhpcy5mb2N1cz1mdW5jdGlvbigpe2lmKHd8fGx8fHRoaXMuJGZvY3VzU2Nyb2xsPT0iYnJvd3NlciIpcmV0dXJuIG4uZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KTt2YXIgZT1uLnN0eWxlLnRvcDtuLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsbi5zdHlsZS50b3A9IjBweCI7dHJ5e3ZhciB0PW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIT0wfWNhdGNoKHIpe3JldHVybn12YXIgaT1bXTtpZih0KXt2YXIgcz1uLnBhcmVudEVsZW1lbnQ7d2hpbGUocyYmcy5ub2RlVHlwZT09MSlpLnB1c2gocykscy5zZXRBdHRyaWJ1dGUoImFjZV9ub2NvbnRleHQiLCEwKSwhcy5wYXJlbnRFbGVtZW50JiZzLmdldFJvb3ROb2RlP3M9cy5nZXRSb290Tm9kZSgpLmhvc3Q6cz1zLnBhcmVudEVsZW1lbnR9bi5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLHQmJmkuZm9yRWFjaChmdW5jdGlvbihlKXtlLnJlbW92ZUF0dHJpYnV0ZSgiYWNlX25vY29udGV4dCIpfSksc2V0VGltZW91dChmdW5jdGlvbigpe24uc3R5bGUucG9zaXRpb249IiIsbi5zdHlsZS50b3A9PSIwcHgiJiYobi5zdHlsZS50b3A9ZSl9LDApfSx0aGlzLmJsdXI9ZnVuY3Rpb24oKXtuLmJsdXIoKX0sdGhpcy5pc0ZvY3VzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gQ30sdC5vbigiYmVmb3JlRW5kT3BlcmF0aW9uIixmdW5jdGlvbigpe2lmKHQuY3VyT3AmJnQuY3VyT3AuY29tbWFuZC5uYW1lPT0iaW5zZXJ0c3RyaW5nIilyZXR1cm47eSYmKHg9bi52YWx1ZT0iIixVKCkpLEwoKX0pO3ZhciBMPWQ/ZnVuY3Rpb24oZSl7aWYoIUN8fG0mJiFlfHxiKXJldHVybjtlfHwoZT0iIik7dmFyIHI9IlxuIGFiIitlKyJjZGUgZmdcbiI7ciE9bi52YWx1ZSYmKG4udmFsdWU9eD1yKTt2YXIgaT00LHM9NCsoZS5sZW5ndGh8fCh0LnNlbGVjdGlvbi5pc0VtcHR5KCk/MDoxKSk7KFQhPWl8fE4hPXMpJiZuLnNldFNlbGVjdGlvblJhbmdlKGkscyksVD1pLE49c306ZnVuY3Rpb24oKXtpZih5fHxiKXJldHVybjtpZighQyYmIV8pcmV0dXJuO3k9ITA7dmFyIGU9dC5zZWxlY3Rpb24scj1lLmdldFJhbmdlKCksaT1lLmN1cnNvci5yb3cscz1yLnN0YXJ0LmNvbHVtbixvPXIuZW5kLmNvbHVtbix1PXQuc2Vzc2lvbi5nZXRMaW5lKGkpO2lmKHIuc3RhcnQucm93IT1pKXt2YXIgYT10LnNlc3Npb24uZ2V0TGluZShpLTEpO3M9ci5zdGFydC5yb3c8aS0xPzA6cyxvKz1hLmxlbmd0aCsxLHU9YSsiXG4iK3V9ZWxzZSBpZihyLmVuZC5yb3chPWkpe3ZhciBmPXQuc2Vzc2lvbi5nZXRMaW5lKGkrMSk7bz1yLmVuZC5yb3c+aSsxP2YubGVuZ3RoOm8sbys9dS5sZW5ndGgrMSx1PXUrIlxuIitmfXUubGVuZ3RoPmMmJihzPGMmJm88Yz91PXUuc2xpY2UoMCxjKToodT0iXG4iLHM9MCxvPTEpKTt2YXIgbD11KyJcblxuIjtsIT14JiYobi52YWx1ZT14PWwsVD1OPWwubGVuZ3RoKSxfJiYoVD1uLnNlbGVjdGlvblN0YXJ0LE49bi5zZWxlY3Rpb25FbmQpO2lmKE4hPW98fFQhPXN8fG4uc2VsZWN0aW9uRW5kIT1OKXRyeXtuLnNldFNlbGVjdGlvblJhbmdlKHMsbyksVD1zLE49b31jYXRjaChoKXt9eT0hMX07QyYmdC5vbkZvY3VzKCk7dmFyIEE9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2VsZWN0aW9uU3RhcnQ9PT0wJiZlLnNlbGVjdGlvbkVuZD49eC5sZW5ndGgmJmUudmFsdWU9PT14JiZ4JiZlLnNlbGVjdGlvbkVuZCE9PU59LE89ZnVuY3Rpb24oZSl7aWYoeSlyZXR1cm47bT9tPSExOkEobikmJih0LnNlbGVjdEFsbCgpLEwoKSl9LE09bnVsbDt0aGlzLnNldElucHV0SGFuZGxlcj1mdW5jdGlvbihlKXtNPWV9LHRoaXMuZ2V0SW5wdXRIYW5kbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIE19O3ZhciBfPSExLEQ9ZnVuY3Rpb24oZSxyKXtfJiYoXz0hMSk7aWYoZylyZXR1cm4gTCgpLGUmJnQub25QYXN0ZShlKSxnPSExLCIiO3ZhciBpPW4uc2VsZWN0aW9uU3RhcnQscz1uLnNlbGVjdGlvbkVuZCxvPVQsdT14Lmxlbmd0aC1OLGE9ZSxmPWUubGVuZ3RoLWksbD1lLmxlbmd0aC1zLGM9MDt3aGlsZShvPjAmJnhbY109PWVbY10pYysrLG8tLTthPWEuc2xpY2UoYyksYz0xO3doaWxlKHU+MCYmeC5sZW5ndGgtYz5ULTEmJnhbeC5sZW5ndGgtY109PWVbZS5sZW5ndGgtY10pYysrLHUtLTtmLT1jLTEsbC09Yy0xO3ZhciBoPWEubGVuZ3RoLWMrMTtyZXR1cm4gaDwwJiYobz0taCxoPTApLGE9YS5zbGljZSgwLGgpLCFyJiZmPT1hLmxlbmd0aCYmIW8mJiF1JiYhbD8iIjooYj0hMCxhJiYhbyYmIXUmJiFmJiYhbHx8RT90Lm9uVGV4dElucHV0KGEpOnQub25UZXh0SW5wdXQoYSx7ZXh0ZW5kTGVmdDpvLGV4dGVuZFJpZ2h0OnUscmVzdG9yZVN0YXJ0OmYscmVzdG9yZUVuZDpsfSksYj0hMSx4PWUsVD1pLE49cyxhKX0sUD1mdW5jdGlvbihlKXtpZih5KXJldHVybiBSKCk7aWYoZSYmZS5pbnB1dFR5cGUpe2lmKGUuaW5wdXRUeXBlPT0iaGlzdG9yeVVuZG8iKXJldHVybiB0LmV4ZWNDb21tYW5kKCJ1bmRvIik7aWYoZS5pbnB1dFR5cGU9PSJoaXN0b3J5UmVkbyIpcmV0dXJuIHQuZXhlY0NvbW1hbmQoInJlZG8iKX12YXIgcj1uLnZhbHVlLGk9RChyLCEwKTsoci5sZW5ndGg+YysxMDB8fHYudGVzdChpKSkmJkwoKX0sSD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5jbGlwYm9hcmREYXRhfHx3aW5kb3cuY2xpcGJvYXJkRGF0YTtpZighcnx8YSlyZXR1cm47dmFyIGk9Znx8bj8iVGV4dCI6InRleHQvcGxhaW4iO3RyeXtyZXR1cm4gdD9yLnNldERhdGEoaSx0KSE9PSExOnIuZ2V0RGF0YShpKX1jYXRjaChlKXtpZighbilyZXR1cm4gSChlLHQsITApfX0sQj1mdW5jdGlvbihlLGkpe3ZhciBzPXQuZ2V0Q29weVRleHQoKTtpZighcylyZXR1cm4gci5wcmV2ZW50RGVmYXVsdChlKTtIKGUscyk/KGQmJihMKHMpLG09cyxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bT0hMX0sMTApKSxpP3Qub25DdXQoKTp0Lm9uQ29weSgpLHIucHJldmVudERlZmF1bHQoZSkpOihtPSEwLG4udmFsdWU9cyxuLnNlbGVjdCgpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXttPSExLEwoKSxpP3Qub25DdXQoKTp0Lm9uQ29weSgpfSkpfSxqPWZ1bmN0aW9uKGUpe0IoZSwhMCl9LEY9ZnVuY3Rpb24oZSl7QihlLCExKX0sST1mdW5jdGlvbihlKXt2YXIgcz1IKGUpO2lmKHUucGFzdGVDYW5jZWxsZWQoKSlyZXR1cm47dHlwZW9mIHM9PSJzdHJpbmciPyhzJiZ0Lm9uUGFzdGUocyxlKSxpLmlzSUUmJnNldFRpbWVvdXQoTCksci5wcmV2ZW50RGVmYXVsdChlKSk6KG4udmFsdWU9IiIsZz0hMCl9O3IuYWRkQ29tbWFuZEtleUxpc3RlbmVyKG4sdC5vbkNvbW1hbmRLZXkuYmluZCh0KSksci5hZGRMaXN0ZW5lcihuLCJzZWxlY3QiLE8pLHIuYWRkTGlzdGVuZXIobiwiaW5wdXQiLFApLHIuYWRkTGlzdGVuZXIobiwiY3V0IixqKSxyLmFkZExpc3RlbmVyKG4sImNvcHkiLEYpLHIuYWRkTGlzdGVuZXIobiwicGFzdGUiLEkpLCghKCJvbmN1dCJpbiBuKXx8ISgib25jb3B5ImluIG4pfHwhKCJvbnBhc3RlImluIG4pKSYmci5hZGRMaXN0ZW5lcihlLCJrZXlkb3duIixmdW5jdGlvbihlKXtpZihpLmlzTWFjJiYhZS5tZXRhS2V5fHwhZS5jdHJsS2V5KXJldHVybjtzd2l0Y2goZS5rZXlDb2RlKXtjYXNlIDY3OkYoZSk7YnJlYWs7Y2FzZSA4NjpJKGUpO2JyZWFrO2Nhc2UgODg6aihlKX19KTt2YXIgcT1mdW5jdGlvbihlKXtpZih5fHwhdC5vbkNvbXBvc2l0aW9uU3RhcnR8fHQuJHJlYWRPbmx5KXJldHVybjt5PXt9O2lmKEUpcmV0dXJuO3NldFRpbWVvdXQoUiwwKSx0Lm9uKCJtb3VzZWRvd24iLHopO3ZhciByPXQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtyLmVuZC5yb3c9ci5zdGFydC5yb3csci5lbmQuY29sdW1uPXIuc3RhcnQuY29sdW1uLHkubWFya2VyUmFuZ2U9cix5LnNlbGVjdGlvblN0YXJ0PVQsdC5vbkNvbXBvc2l0aW9uU3RhcnQoeSkseS51c2VUZXh0YXJlYUZvcklNRT8obi52YWx1ZT0iIix4PSIiLFQ9MCxOPTApOihuLm1zR2V0SW5wdXRDb250ZXh0JiYoeS5jb250ZXh0PW4ubXNHZXRJbnB1dENvbnRleHQoKSksbi5nZXRJbnB1dENvbnRleHQmJih5LmNvbnRleHQ9bi5nZXRJbnB1dENvbnRleHQoKSkpfSxSPWZ1bmN0aW9uKCl7aWYoIXl8fCF0Lm9uQ29tcG9zaXRpb25VcGRhdGV8fHQuJHJlYWRPbmx5KXJldHVybjtpZihFKXJldHVybiB6KCk7aWYoeS51c2VUZXh0YXJlYUZvcklNRSl0Lm9uQ29tcG9zaXRpb25VcGRhdGUobi52YWx1ZSk7ZWxzZXt2YXIgZT1uLnZhbHVlO0QoZSkseS5tYXJrZXJSYW5nZSYmKHkuY29udGV4dCYmKHkubWFya2VyUmFuZ2Uuc3RhcnQuY29sdW1uPXkuc2VsZWN0aW9uU3RhcnQ9eS5jb250ZXh0LmNvbXBvc2l0aW9uU3RhcnRPZmZzZXQpLHkubWFya2VyUmFuZ2UuZW5kLmNvbHVtbj15Lm1hcmtlclJhbmdlLnN0YXJ0LmNvbHVtbitOLXkuc2VsZWN0aW9uU3RhcnQpfX0sVT1mdW5jdGlvbihlKXtpZighdC5vbkNvbXBvc2l0aW9uRW5kfHx0LiRyZWFkT25seSlyZXR1cm47eT0hMSx0Lm9uQ29tcG9zaXRpb25FbmQoKSx0Lm9mZigibW91c2Vkb3duIix6KSxlJiZQKCl9LFc9by5kZWxheWVkQ2FsbChSLDUwKS5zY2hlZHVsZS5iaW5kKG51bGwsbnVsbCk7ci5hZGRMaXN0ZW5lcihuLCJjb21wb3NpdGlvbnN0YXJ0IixxKSxyLmFkZExpc3RlbmVyKG4sImNvbXBvc2l0aW9udXBkYXRlIixSKSxyLmFkZExpc3RlbmVyKG4sImtleXVwIixYKSxyLmFkZExpc3RlbmVyKG4sImtleWRvd24iLFcpLHIuYWRkTGlzdGVuZXIobiwiY29tcG9zaXRpb25lbmQiLFUpLHRoaXMuZ2V0RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiBufSx0aGlzLnNldENvbW1hbmRNb2RlPWZ1bmN0aW9uKGUpe0U9ZSxuLnJlYWRPbmx5PSExfSx0aGlzLnNldFJlYWRPbmx5PWZ1bmN0aW9uKGUpe0V8fChuLnJlYWRPbmx5PWUpfSx0aGlzLnNldENvcHlXaXRoRW1wdHlTZWxlY3Rpb249ZnVuY3Rpb24oZSl7fSx0aGlzLm9uQ29udGV4dE1lbnU9ZnVuY3Rpb24oZSl7Xz0hMCxMKCksdC5fZW1pdCgibmF0aXZlY29udGV4dG1lbnUiLHt0YXJnZXQ6dCxkb21FdmVudDplfSksdGhpcy5tb3ZlVG9Nb3VzZShlLCEwKX0sdGhpcy5tb3ZlVG9Nb3VzZT1mdW5jdGlvbihlLG8pe3d8fCh3PW4uc3R5bGUuY3NzVGV4dCksbi5zdHlsZS5jc3NUZXh0PShvPyJ6LWluZGV4OjEwMDAwMDsiOiIiKSsoaS5pc0lFPyJvcGFjaXR5OjAuMTsiOiIiKSsidGV4dC1pbmRlbnQ6IC0iKyhUK04pKnQucmVuZGVyZXIuY2hhcmFjdGVyV2lkdGgqLjUrInB4OyI7dmFyIHU9dC5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYT1zLmNvbXB1dGVkU3R5bGUodC5jb250YWluZXIpLGY9dS50b3ArKHBhcnNlSW50KGEuYm9yZGVyVG9wV2lkdGgpfHwwKSxsPXUubGVmdCsocGFyc2VJbnQodS5ib3JkZXJMZWZ0V2lkdGgpfHwwKSxjPXUuYm90dG9tLWYtbi5jbGllbnRIZWlnaHQtMixoPWZ1bmN0aW9uKGUpe3MudHJhbnNsYXRlKG4sZS5jbGllbnRYLWwtMixNYXRoLm1pbihlLmNsaWVudFktZi0yLGMpKX07aChlKTtpZihlLnR5cGUhPSJtb3VzZWRvd24iKXJldHVybjt0LnJlbmRlcmVyLiRpc01vdXNlUHJlc3NlZD0hMCxjbGVhclRpbWVvdXQoViksaS5pc1dpbiYmci5jYXB0dXJlKHQuY29udGFpbmVyLGgsJCl9LHRoaXMub25Db250ZXh0TWVudUNsb3NlPSQ7dmFyIFYsSj1mdW5jdGlvbihlKXt0LnRleHRJbnB1dC5vbkNvbnRleHRNZW51KGUpLCQoKX07ci5hZGRMaXN0ZW5lcihuLCJtb3VzZXVwIixKKSxyLmFkZExpc3RlbmVyKG4sIm1vdXNlZG93biIsZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpLCQoKX0pLHIuYWRkTGlzdGVuZXIodC5yZW5kZXJlci5zY3JvbGxlciwiY29udGV4dG1lbnUiLEopLHIuYWRkTGlzdGVuZXIobiwiY29udGV4dG1lbnUiLEopLGQmJksoZSx0LG4pfTt0LlRleHRJbnB1dD1tfSksYWNlLmRlZmluZSgiYWNlL21vdXNlL2RlZmF1bHRfaGFuZGxlcnMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXtlLiRjbGlja1NlbGVjdGlvbj1udWxsO3ZhciB0PWUuZWRpdG9yO3Quc2V0RGVmYXVsdEhhbmRsZXIoIm1vdXNlZG93biIsdGhpcy5vbk1vdXNlRG93bi5iaW5kKGUpKSx0LnNldERlZmF1bHRIYW5kbGVyKCJkYmxjbGljayIsdGhpcy5vbkRvdWJsZUNsaWNrLmJpbmQoZSkpLHQuc2V0RGVmYXVsdEhhbmRsZXIoInRyaXBsZWNsaWNrIix0aGlzLm9uVHJpcGxlQ2xpY2suYmluZChlKSksdC5zZXREZWZhdWx0SGFuZGxlcigicXVhZGNsaWNrIix0aGlzLm9uUXVhZENsaWNrLmJpbmQoZSkpLHQuc2V0RGVmYXVsdEhhbmRsZXIoIm1vdXNld2hlZWwiLHRoaXMub25Nb3VzZVdoZWVsLmJpbmQoZSkpO3ZhciBuPVsic2VsZWN0Iiwic3RhcnRTZWxlY3QiLCJzZWxlY3RFbmQiLCJzZWxlY3RBbGxFbmQiLCJzZWxlY3RCeVdvcmRzRW5kIiwic2VsZWN0QnlMaW5lc0VuZCIsImRyYWdXYWl0IiwiZHJhZ1dhaXRFbmQiLCJmb2N1c1dhaXQiXTtuLmZvckVhY2goZnVuY3Rpb24odCl7ZVt0XT10aGlzW3RdfSx0aGlzKSxlLnNlbGVjdEJ5TGluZXM9dGhpcy5leHRlbmRTZWxlY3Rpb25CeS5iaW5kKGUsImdldExpbmVSYW5nZSIpLGUuc2VsZWN0QnlXb3Jkcz10aGlzLmV4dGVuZFNlbGVjdGlvbkJ5LmJpbmQoZSwiZ2V0V29yZFJhbmdlIil9ZnVuY3Rpb24gdShlLHQsbixyKXtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KG4tZSwyKStNYXRoLnBvdyhyLXQsMikpfWZ1bmN0aW9uIGEoZSx0KXtpZihlLnN0YXJ0LnJvdz09ZS5lbmQucm93KXZhciBuPTIqdC5jb2x1bW4tZS5zdGFydC5jb2x1bW4tZS5lbmQuY29sdW1uO2Vsc2UgaWYoZS5zdGFydC5yb3c9PWUuZW5kLnJvdy0xJiYhZS5zdGFydC5jb2x1bW4mJiFlLmVuZC5jb2x1bW4pdmFyIG49dC5jb2x1bW4tNDtlbHNlIHZhciBuPTIqdC5yb3ctZS5zdGFydC5yb3ctZS5lbmQucm93O3JldHVybiBuPDA/e2N1cnNvcjplLnN0YXJ0LGFuY2hvcjplLmVuZH06e2N1cnNvcjplLmVuZCxhbmNob3I6ZS5zdGFydH19dmFyIHI9ZSgiLi4vbGliL3VzZXJhZ2VudCIpLGk9MCxzPTU1MDsoZnVuY3Rpb24oKXt0aGlzLm9uTW91c2VEb3duPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5TZWxlY3Rpb24oKSxuPWUuZ2V0RG9jdW1lbnRQb3NpdGlvbigpO3RoaXMubW91c2Vkb3duRXZlbnQ9ZTt2YXIgaT10aGlzLmVkaXRvcixzPWUuZ2V0QnV0dG9uKCk7aWYocyE9PTApe3ZhciBvPWkuZ2V0U2VsZWN0aW9uUmFuZ2UoKSx1PW8uaXNFbXB0eSgpOyh1fHxzPT0xKSYmaS5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24obikscz09MiYmKGkudGV4dElucHV0Lm9uQ29udGV4dE1lbnUoZS5kb21FdmVudCksci5pc01vemlsbGF8fGUucHJldmVudERlZmF1bHQoKSk7cmV0dXJufXRoaXMubW91c2Vkb3duRXZlbnQudGltZT1EYXRlLm5vdygpO2lmKHQmJiFpLmlzRm9jdXNlZCgpKXtpLmZvY3VzKCk7aWYodGhpcy4kZm9jdXNUaW1lb3V0JiYhdGhpcy4kY2xpY2tTZWxlY3Rpb24mJiFpLmluTXVsdGlTZWxlY3RNb2RlKXt0aGlzLnNldFN0YXRlKCJmb2N1c1dhaXQiKSx0aGlzLmNhcHR1cmVNb3VzZShlKTtyZXR1cm59fXJldHVybiB0aGlzLmNhcHR1cmVNb3VzZShlKSx0aGlzLnN0YXJ0U2VsZWN0KG4sZS5kb21FdmVudC5fY2xpY2tzPjEpLGUucHJldmVudERlZmF1bHQoKX0sdGhpcy5zdGFydFNlbGVjdD1mdW5jdGlvbihlLHQpe2U9ZXx8dGhpcy5lZGl0b3IucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXModGhpcy54LHRoaXMueSk7dmFyIG49dGhpcy5lZGl0b3I7aWYoIXRoaXMubW91c2Vkb3duRXZlbnQpcmV0dXJuO3RoaXMubW91c2Vkb3duRXZlbnQuZ2V0U2hpZnRLZXkoKT9uLnNlbGVjdGlvbi5zZWxlY3RUb1Bvc2l0aW9uKGUpOnR8fG4uc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKGUpLHR8fHRoaXMuc2VsZWN0KCksbi5yZW5kZXJlci5zY3JvbGxlci5zZXRDYXB0dXJlJiZuLnJlbmRlcmVyLnNjcm9sbGVyLnNldENhcHR1cmUoKSxuLnNldFN0eWxlKCJhY2Vfc2VsZWN0aW5nIiksdGhpcy5zZXRTdGF0ZSgic2VsZWN0Iil9LHRoaXMuc2VsZWN0PWZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLmVkaXRvcixuPXQucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXModGhpcy54LHRoaXMueSk7aWYodGhpcy4kY2xpY2tTZWxlY3Rpb24pe3ZhciByPXRoaXMuJGNsaWNrU2VsZWN0aW9uLmNvbXBhcmVQb2ludChuKTtpZihyPT0tMSllPXRoaXMuJGNsaWNrU2VsZWN0aW9uLmVuZDtlbHNlIGlmKHI9PTEpZT10aGlzLiRjbGlja1NlbGVjdGlvbi5zdGFydDtlbHNle3ZhciBpPWEodGhpcy4kY2xpY2tTZWxlY3Rpb24sbik7bj1pLmN1cnNvcixlPWkuYW5jaG9yfXQuc2VsZWN0aW9uLnNldFNlbGVjdGlvbkFuY2hvcihlLnJvdyxlLmNvbHVtbil9dC5zZWxlY3Rpb24uc2VsZWN0VG9Qb3NpdGlvbihuKSx0LnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KCl9LHRoaXMuZXh0ZW5kU2VsZWN0aW9uQnk9ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLmVkaXRvcixyPW4ucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXModGhpcy54LHRoaXMueSksaT1uLnNlbGVjdGlvbltlXShyLnJvdyxyLmNvbHVtbik7aWYodGhpcy4kY2xpY2tTZWxlY3Rpb24pe3ZhciBzPXRoaXMuJGNsaWNrU2VsZWN0aW9uLmNvbXBhcmVQb2ludChpLnN0YXJ0KSxvPXRoaXMuJGNsaWNrU2VsZWN0aW9uLmNvbXBhcmVQb2ludChpLmVuZCk7aWYocz09LTEmJm88PTApe3Q9dGhpcy4kY2xpY2tTZWxlY3Rpb24uZW5kO2lmKGkuZW5kLnJvdyE9ci5yb3d8fGkuZW5kLmNvbHVtbiE9ci5jb2x1bW4pcj1pLnN0YXJ0fWVsc2UgaWYobz09MSYmcz49MCl7dD10aGlzLiRjbGlja1NlbGVjdGlvbi5zdGFydDtpZihpLnN0YXJ0LnJvdyE9ci5yb3d8fGkuc3RhcnQuY29sdW1uIT1yLmNvbHVtbilyPWkuZW5kfWVsc2UgaWYocz09LTEmJm89PTEpcj1pLmVuZCx0PWkuc3RhcnQ7ZWxzZXt2YXIgdT1hKHRoaXMuJGNsaWNrU2VsZWN0aW9uLHIpO3I9dS5jdXJzb3IsdD11LmFuY2hvcn1uLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25BbmNob3IodC5yb3csdC5jb2x1bW4pfW4uc2VsZWN0aW9uLnNlbGVjdFRvUG9zaXRpb24ociksbi5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpfSx0aGlzLnNlbGVjdEVuZD10aGlzLnNlbGVjdEFsbEVuZD10aGlzLnNlbGVjdEJ5V29yZHNFbmQ9dGhpcy5zZWxlY3RCeUxpbmVzRW5kPWZ1bmN0aW9uKCl7dGhpcy4kY2xpY2tTZWxlY3Rpb249bnVsbCx0aGlzLmVkaXRvci51bnNldFN0eWxlKCJhY2Vfc2VsZWN0aW5nIiksdGhpcy5lZGl0b3IucmVuZGVyZXIuc2Nyb2xsZXIucmVsZWFzZUNhcHR1cmUmJnRoaXMuZWRpdG9yLnJlbmRlcmVyLnNjcm9sbGVyLnJlbGVhc2VDYXB0dXJlKCl9LHRoaXMuZm9jdXNXYWl0PWZ1bmN0aW9uKCl7dmFyIGU9dSh0aGlzLm1vdXNlZG93bkV2ZW50LngsdGhpcy5tb3VzZWRvd25FdmVudC55LHRoaXMueCx0aGlzLnkpLHQ9RGF0ZS5ub3coKTsoZT5pfHx0LXRoaXMubW91c2Vkb3duRXZlbnQudGltZT50aGlzLiRmb2N1c1RpbWVvdXQpJiZ0aGlzLnN0YXJ0U2VsZWN0KHRoaXMubW91c2Vkb3duRXZlbnQuZ2V0RG9jdW1lbnRQb3NpdGlvbigpKX0sdGhpcy5vbkRvdWJsZUNsaWNrPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLG49dGhpcy5lZGl0b3Iscj1uLnNlc3Npb24saT1yLmdldEJyYWNrZXRSYW5nZSh0KTtpPyhpLmlzRW1wdHkoKSYmKGkuc3RhcnQuY29sdW1uLS0saS5lbmQuY29sdW1uKyspLHRoaXMuc2V0U3RhdGUoInNlbGVjdCIpKTooaT1uLnNlbGVjdGlvbi5nZXRXb3JkUmFuZ2UodC5yb3csdC5jb2x1bW4pLHRoaXMuc2V0U3RhdGUoInNlbGVjdEJ5V29yZHMiKSksdGhpcy4kY2xpY2tTZWxlY3Rpb249aSx0aGlzLnNlbGVjdCgpfSx0aGlzLm9uVHJpcGxlQ2xpY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXREb2N1bWVudFBvc2l0aW9uKCksbj10aGlzLmVkaXRvcjt0aGlzLnNldFN0YXRlKCJzZWxlY3RCeUxpbmVzIik7dmFyIHI9bi5nZXRTZWxlY3Rpb25SYW5nZSgpO3IuaXNNdWx0aUxpbmUoKSYmci5jb250YWlucyh0LnJvdyx0LmNvbHVtbik/KHRoaXMuJGNsaWNrU2VsZWN0aW9uPW4uc2VsZWN0aW9uLmdldExpbmVSYW5nZShyLnN0YXJ0LnJvdyksdGhpcy4kY2xpY2tTZWxlY3Rpb24uZW5kPW4uc2VsZWN0aW9uLmdldExpbmVSYW5nZShyLmVuZC5yb3cpLmVuZCk6dGhpcy4kY2xpY2tTZWxlY3Rpb249bi5zZWxlY3Rpb24uZ2V0TGluZVJhbmdlKHQucm93KSx0aGlzLnNlbGVjdCgpfSx0aGlzLm9uUXVhZENsaWNrPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZWRpdG9yO3Quc2VsZWN0QWxsKCksdGhpcy4kY2xpY2tTZWxlY3Rpb249dC5nZXRTZWxlY3Rpb25SYW5nZSgpLHRoaXMuc2V0U3RhdGUoInNlbGVjdEFsbCIpfSx0aGlzLm9uTW91c2VXaGVlbD1mdW5jdGlvbihlKXtpZihlLmdldEFjY2VsS2V5KCkpcmV0dXJuO2UuZ2V0U2hpZnRLZXkoKSYmZS53aGVlbFkmJiFlLndoZWVsWCYmKGUud2hlZWxYPWUud2hlZWxZLGUud2hlZWxZPTApO3ZhciB0PXRoaXMuZWRpdG9yO3RoaXMuJGxhc3RTY3JvbGx8fCh0aGlzLiRsYXN0U2Nyb2xsPXt0OjAsdng6MCx2eTowLGFsbG93ZWQ6MH0pO3ZhciBuPXRoaXMuJGxhc3RTY3JvbGwscj1lLmRvbUV2ZW50LnRpbWVTdGFtcCxpPXItbi50LG89aT9lLndoZWVsWC9pOm4udngsdT1pP2Uud2hlZWxZL2k6bi52eTtpPHMmJihvPShvK24udngpLzIsdT0odStuLnZ5KS8yKTt2YXIgYT1NYXRoLmFicyhvL3UpLGY9ITE7YT49MSYmdC5yZW5kZXJlci5pc1Njcm9sbGFibGVCeShlLndoZWVsWCplLnNwZWVkLDApJiYoZj0hMCksYTw9MSYmdC5yZW5kZXJlci5pc1Njcm9sbGFibGVCeSgwLGUud2hlZWxZKmUuc3BlZWQpJiYoZj0hMCk7aWYoZiluLmFsbG93ZWQ9cjtlbHNlIGlmKHItbi5hbGxvd2VkPHMpe3ZhciBsPU1hdGguYWJzKG8pPD0xLjUqTWF0aC5hYnMobi52eCkmJk1hdGguYWJzKHUpPD0xLjUqTWF0aC5hYnMobi52eSk7bD8oZj0hMCxuLmFsbG93ZWQ9cik6bi5hbGxvd2VkPTB9bi50PXIsbi52eD1vLG4udnk9dTtpZihmKXJldHVybiB0LnJlbmRlcmVyLnNjcm9sbEJ5KGUud2hlZWxYKmUuc3BlZWQsZS53aGVlbFkqZS5zcGVlZCksZS5zdG9wKCl9fSkuY2FsbChvLnByb3RvdHlwZSksdC5EZWZhdWx0SGFuZGxlcnM9b30pLGFjZS5kZWZpbmUoImFjZS90b29sdGlwIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcyhlKXt0aGlzLmlzT3Blbj0hMSx0aGlzLiRlbGVtZW50PW51bGwsdGhpcy4kcGFyZW50Tm9kZT1lfXZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvZG9tIik7KGZ1bmN0aW9uKCl7dGhpcy4kaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRlbGVtZW50PWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kZWxlbWVudC5jbGFzc05hbWU9ImFjZV90b29sdGlwIix0aGlzLiRlbGVtZW50LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuJHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy4kZWxlbWVudCksdGhpcy4kZWxlbWVudH0sdGhpcy5nZXRFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGVsZW1lbnR8fHRoaXMuJGluaXQoKX0sdGhpcy5zZXRUZXh0PWZ1bmN0aW9uKGUpe3RoaXMuZ2V0RWxlbWVudCgpLnRleHRDb250ZW50PWV9LHRoaXMuc2V0SHRtbD1mdW5jdGlvbihlKXt0aGlzLmdldEVsZW1lbnQoKS5pbm5lckhUTUw9ZX0sdGhpcy5zZXRQb3NpdGlvbj1mdW5jdGlvbihlLHQpe3RoaXMuZ2V0RWxlbWVudCgpLnN0eWxlLmxlZnQ9ZSsicHgiLHRoaXMuZ2V0RWxlbWVudCgpLnN0eWxlLnRvcD10KyJweCJ9LHRoaXMuc2V0Q2xhc3NOYW1lPWZ1bmN0aW9uKGUpe2kuYWRkQ3NzQ2xhc3ModGhpcy5nZXRFbGVtZW50KCksZSl9LHRoaXMuc2hvdz1mdW5jdGlvbihlLHQsbil7ZSE9bnVsbCYmdGhpcy5zZXRUZXh0KGUpLHQhPW51bGwmJm4hPW51bGwmJnRoaXMuc2V0UG9zaXRpb24odCxuKSx0aGlzLmlzT3Blbnx8KHRoaXMuZ2V0RWxlbWVudCgpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLmlzT3Blbj0hMCl9LHRoaXMuaGlkZT1mdW5jdGlvbigpe3RoaXMuaXNPcGVuJiYodGhpcy5nZXRFbGVtZW50KCkuc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5pc09wZW49ITEpfSx0aGlzLmdldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEVsZW1lbnQoKS5vZmZzZXRIZWlnaHR9LHRoaXMuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRFbGVtZW50KCkub2Zmc2V0V2lkdGh9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuaXNPcGVuPSExLHRoaXMuJGVsZW1lbnQmJnRoaXMuJGVsZW1lbnQucGFyZW50Tm9kZSYmdGhpcy4kZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuJGVsZW1lbnQpfX0pLmNhbGwocy5wcm90b3R5cGUpLHQuVG9vbHRpcD1zfSksYWNlLmRlZmluZSgiYWNlL21vdXNlL2RlZmF1bHRfZ3V0dGVyX2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudCIsImFjZS90b29sdGlwIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB1KGUpe2Z1bmN0aW9uIGwoKXt2YXIgcj11LmdldERvY3VtZW50UG9zaXRpb24oKS5yb3cscz1uLiRhbm5vdGF0aW9uc1tyXTtpZighcylyZXR1cm4gYygpO3ZhciBvPXQuc2Vzc2lvbi5nZXRMZW5ndGgoKTtpZihyPT1vKXt2YXIgYT10LnJlbmRlcmVyLnBpeGVsVG9TY3JlZW5Db29yZGluYXRlcygwLHUueSkucm93LGw9dS4kcG9zO2lmKGE+dC5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Sb3cobC5yb3csbC5jb2x1bW4pKXJldHVybiBjKCl9aWYoZj09cylyZXR1cm47Zj1zLnRleHQuam9pbigiPGJyLz4iKSxpLnNldEh0bWwoZiksaS5zaG93KCksdC5fc2lnbmFsKCJzaG93R3V0dGVyVG9vbHRpcCIsaSksdC5vbigibW91c2V3aGVlbCIsYyk7aWYoZS4kdG9vbHRpcEZvbGxvd3NNb3VzZSloKHUpO2Vsc2V7dmFyIHA9dS5kb21FdmVudC50YXJnZXQsZD1wLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHY9aS5nZXRFbGVtZW50KCkuc3R5bGU7di5sZWZ0PWQucmlnaHQrInB4Iix2LnRvcD1kLmJvdHRvbSsicHgifX1mdW5jdGlvbiBjKCl7byYmKG89Y2xlYXJUaW1lb3V0KG8pKSxmJiYoaS5oaWRlKCksZj1udWxsLHQuX3NpZ25hbCgiaGlkZUd1dHRlclRvb2x0aXAiLGkpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V3aGVlbCIsYykpfWZ1bmN0aW9uIGgoZSl7aS5zZXRQb3NpdGlvbihlLngsZS55KX12YXIgdD1lLmVkaXRvcixuPXQucmVuZGVyZXIuJGd1dHRlckxheWVyLGk9bmV3IGEodC5jb250YWluZXIpO2UuZWRpdG9yLnNldERlZmF1bHRIYW5kbGVyKCJndXR0ZXJtb3VzZWRvd24iLGZ1bmN0aW9uKHIpe2lmKCF0LmlzRm9jdXNlZCgpfHxyLmdldEJ1dHRvbigpIT0wKXJldHVybjt2YXIgaT1uLmdldFJlZ2lvbihyKTtpZihpPT0iZm9sZFdpZGdldHMiKXJldHVybjt2YXIgcz1yLmdldERvY3VtZW50UG9zaXRpb24oKS5yb3csbz10LnNlc3Npb24uc2VsZWN0aW9uO2lmKHIuZ2V0U2hpZnRLZXkoKSlvLnNlbGVjdFRvKHMsMCk7ZWxzZXtpZihyLmRvbUV2ZW50LmRldGFpbD09MilyZXR1cm4gdC5zZWxlY3RBbGwoKSxyLnByZXZlbnREZWZhdWx0KCk7ZS4kY2xpY2tTZWxlY3Rpb249dC5zZWxlY3Rpb24uZ2V0TGluZVJhbmdlKHMpfXJldHVybiBlLnNldFN0YXRlKCJzZWxlY3RCeUxpbmVzIiksZS5jYXB0dXJlTW91c2Uociksci5wcmV2ZW50RGVmYXVsdCgpfSk7dmFyIG8sdSxmO2UuZWRpdG9yLnNldERlZmF1bHRIYW5kbGVyKCJndXR0ZXJtb3VzZW1vdmUiLGZ1bmN0aW9uKHQpe3ZhciBuPXQuZG9tRXZlbnQudGFyZ2V0fHx0LmRvbUV2ZW50LnNyY0VsZW1lbnQ7aWYoci5oYXNDc3NDbGFzcyhuLCJhY2VfZm9sZC13aWRnZXQiKSlyZXR1cm4gYygpO2YmJmUuJHRvb2x0aXBGb2xsb3dzTW91c2UmJmgodCksdT10O2lmKG8pcmV0dXJuO289c2V0VGltZW91dChmdW5jdGlvbigpe289bnVsbCx1JiYhZS5pc01vdXNlUHJlc3NlZD9sKCk6YygpfSw1MCl9KSxzLmFkZExpc3RlbmVyKHQucmVuZGVyZXIuJGd1dHRlciwibW91c2VvdXQiLGZ1bmN0aW9uKGUpe3U9bnVsbDtpZighZnx8bylyZXR1cm47bz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bz1udWxsLGMoKX0sNTApfSksdC5vbigiY2hhbmdlU2Vzc2lvbiIsYyl9ZnVuY3Rpb24gYShlKXtvLmNhbGwodGhpcyxlKX12YXIgcj1lKCIuLi9saWIvZG9tIiksaT1lKCIuLi9saWIvb29wIikscz1lKCIuLi9saWIvZXZlbnQiKSxvPWUoIi4uL3Rvb2x0aXAiKS5Ub29sdGlwO2kuaW5oZXJpdHMoYSxvKSxmdW5jdGlvbigpe3RoaXMuc2V0UG9zaXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj13aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLHI9d2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LGk9dGhpcy5nZXRXaWR0aCgpLHM9dGhpcy5nZXRIZWlnaHQoKTtlKz0xNSx0Kz0xNSxlK2k+biYmKGUtPWUraS1uKSx0K3M+ciYmKHQtPTIwK3MpLG8ucHJvdG90eXBlLnNldFBvc2l0aW9uLmNhbGwodGhpcyxlLHQpfX0uY2FsbChhLnByb3RvdHlwZSksdC5HdXR0ZXJIYW5kbGVyPXV9KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvbW91c2VfZXZlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9ldmVudCIpLGk9ZSgiLi4vbGliL3VzZXJhZ2VudCIpLHM9dC5Nb3VzZUV2ZW50PWZ1bmN0aW9uKGUsdCl7dGhpcy5kb21FdmVudD1lLHRoaXMuZWRpdG9yPXQsdGhpcy54PXRoaXMuY2xpZW50WD1lLmNsaWVudFgsdGhpcy55PXRoaXMuY2xpZW50WT1lLmNsaWVudFksdGhpcy4kcG9zPW51bGwsdGhpcy4kaW5TZWxlY3Rpb249bnVsbCx0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZD0hMSx0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITF9OyhmdW5jdGlvbigpe3RoaXMuc3RvcFByb3BhZ2F0aW9uPWZ1bmN0aW9uKCl7ci5zdG9wUHJvcGFnYXRpb24odGhpcy5kb21FdmVudCksdGhpcy5wcm9wYWdhdGlvblN0b3BwZWQ9ITB9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXtyLnByZXZlbnREZWZhdWx0KHRoaXMuZG9tRXZlbnQpLHRoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH0sdGhpcy5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnByZXZlbnREZWZhdWx0KCl9LHRoaXMuZ2V0RG9jdW1lbnRQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRwb3M/dGhpcy4kcG9zOih0aGlzLiRwb3M9dGhpcy5lZGl0b3IucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXModGhpcy5jbGllbnRYLHRoaXMuY2xpZW50WSksdGhpcy4kcG9zKX0sdGhpcy5pblNlbGVjdGlvbj1mdW5jdGlvbigpe2lmKHRoaXMuJGluU2VsZWN0aW9uIT09bnVsbClyZXR1cm4gdGhpcy4kaW5TZWxlY3Rpb247dmFyIGU9dGhpcy5lZGl0b3IsdD1lLmdldFNlbGVjdGlvblJhbmdlKCk7aWYodC5pc0VtcHR5KCkpdGhpcy4kaW5TZWxlY3Rpb249ITE7ZWxzZXt2YXIgbj10aGlzLmdldERvY3VtZW50UG9zaXRpb24oKTt0aGlzLiRpblNlbGVjdGlvbj10LmNvbnRhaW5zKG4ucm93LG4uY29sdW1uKX1yZXR1cm4gdGhpcy4kaW5TZWxlY3Rpb259LHRoaXMuZ2V0QnV0dG9uPWZ1bmN0aW9uKCl7cmV0dXJuIHIuZ2V0QnV0dG9uKHRoaXMuZG9tRXZlbnQpfSx0aGlzLmdldFNoaWZ0S2V5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tRXZlbnQuc2hpZnRLZXl9LHRoaXMuZ2V0QWNjZWxLZXk9aS5pc01hYz9mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbUV2ZW50Lm1ldGFLZXl9OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tRXZlbnQuY3RybEtleX19KS5jYWxsKHMucHJvdG90eXBlKX0pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS9kcmFnZHJvcF9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGYoZSl7ZnVuY3Rpb24gVChlLG4pe3ZhciByPURhdGUubm93KCksaT0hbnx8ZS5yb3chPW4ucm93LHM9IW58fGUuY29sdW1uIT1uLmNvbHVtbjtpZighU3x8aXx8cyl0Lm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGUpLFM9cix4PXt4OnAseTpkfTtlbHNle3ZhciBvPWwoeC54LHgueSxwLGQpO28+YT9TPW51bGw6ci1TPj11JiYodC5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpLFM9bnVsbCl9fWZ1bmN0aW9uIE4oZSxuKXt2YXIgcj1EYXRlLm5vdygpLGk9dC5yZW5kZXJlci5sYXllckNvbmZpZy5saW5lSGVpZ2h0LHM9dC5yZW5kZXJlci5sYXllckNvbmZpZy5jaGFyYWN0ZXJXaWR0aCx1PXQucmVuZGVyZXIuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYT17eDp7bGVmdDpwLXUubGVmdCxyaWdodDp1LnJpZ2h0LXB9LHk6e3RvcDpkLXUudG9wLGJvdHRvbTp1LmJvdHRvbS1kfX0sZj1NYXRoLm1pbihhLngubGVmdCxhLngucmlnaHQpLGw9TWF0aC5taW4oYS55LnRvcCxhLnkuYm90dG9tKSxjPXtyb3c6ZS5yb3csY29sdW1uOmUuY29sdW1ufTtmL3M8PTImJihjLmNvbHVtbis9YS54LmxlZnQ8YS54LnJpZ2h0Py0zOjIpLGwvaTw9MSYmKGMucm93Kz1hLnkudG9wPGEueS5ib3R0b20/LTE6MSk7dmFyIGg9ZS5yb3chPWMucm93LHY9ZS5jb2x1bW4hPWMuY29sdW1uLG09IW58fGUucm93IT1uLnJvdztofHx2JiYhbT9FP3ItRT49byYmdC5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyhjKTpFPXI6RT1udWxsfWZ1bmN0aW9uIEMoKXt2YXIgZT1nO2c9dC5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyhwLGQpLFQoZyxlKSxOKGcsZSl9ZnVuY3Rpb24gaygpe209dC5zZWxlY3Rpb24udG9PcmllbnRlZFJhbmdlKCksaD10LnNlc3Npb24uYWRkTWFya2VyKG0sImFjZV9zZWxlY3Rpb24iLHQuZ2V0U2VsZWN0aW9uU3R5bGUoKSksdC5jbGVhclNlbGVjdGlvbigpLHQuaXNGb2N1c2VkKCkmJnQucmVuZGVyZXIuJGN1cnNvckxheWVyLnNldEJsaW5raW5nKCExKSxjbGVhckludGVydmFsKHYpLEMoKSx2PXNldEludGVydmFsKEMsMjApLHk9MCxpLmFkZExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLE8pfWZ1bmN0aW9uIEwoKXtjbGVhckludGVydmFsKHYpLHQuc2Vzc2lvbi5yZW1vdmVNYXJrZXIoaCksaD1udWxsLHQuc2VsZWN0aW9uLmZyb21PcmllbnRlZFJhbmdlKG0pLHQuaXNGb2N1c2VkKCkmJiF3JiZ0LiRyZXNldEN1cnNvclN0eWxlKCksbT1udWxsLGc9bnVsbCx5PTAsRT1udWxsLFM9bnVsbCxpLnJlbW92ZUxpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLE8pfWZ1bmN0aW9uIE8oKXtBPT1udWxsJiYoQT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7QSE9bnVsbCYmaCYmTCgpfSwyMCkpfWZ1bmN0aW9uIE0oZSl7dmFyIHQ9ZS50eXBlcztyZXR1cm4hdHx8QXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbCh0LGZ1bmN0aW9uKGUpe3JldHVybiBlPT0idGV4dC9wbGFpbiJ8fGU9PSJUZXh0In0pfWZ1bmN0aW9uIF8oZSl7dmFyIHQ9WyJjb3B5IiwiY29weW1vdmUiLCJhbGwiLCJ1bmluaXRpYWxpemVkIl0sbj1bIm1vdmUiLCJjb3B5bW92ZSIsImxpbmttb3ZlIiwiYWxsIiwidW5pbml0aWFsaXplZCJdLHI9cy5pc01hYz9lLmFsdEtleTplLmN0cmxLZXksaT0idW5pbml0aWFsaXplZCI7dHJ5e2k9ZS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZC50b0xvd2VyQ2FzZSgpfWNhdGNoKGUpe312YXIgbz0ibm9uZSI7cmV0dXJuIHImJnQuaW5kZXhPZihpKT49MD9vPSJjb3B5IjpuLmluZGV4T2YoaSk+PTA/bz0ibW92ZSI6dC5pbmRleE9mKGkpPj0wJiYobz0iY29weSIpLG99dmFyIHQ9ZS5lZGl0b3Isbj1yLmNyZWF0ZUVsZW1lbnQoImltZyIpO24uc3JjPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFBQUFDSDVCQUVLQUFFQUxBQUFBQUFCQUFFQUFBSUNUQUVBT3c9PSIscy5pc09wZXJhJiYobi5zdHlsZS5jc3NUZXh0PSJ3aWR0aDoxcHg7aGVpZ2h0OjFweDtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7ei1pbmRleDoyMTQ3NDgzNjQ3O29wYWNpdHk6MDsiKTt2YXIgZj1bImRyYWdXYWl0IiwiZHJhZ1dhaXRFbmQiLCJzdGFydERyYWciLCJkcmFnUmVhZHlFbmQiLCJvbk1vdXNlRHJhZyJdO2YuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPXRoaXNbdF19LHRoaXMpLHQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm9uTW91c2VEb3duLmJpbmQoZSkpO3ZhciBjPXQuY29udGFpbmVyLGgscCxkLHYsbSxnLHk9MCxiLHcsRSxTLHg7dGhpcy5vbkRyYWdTdGFydD1mdW5jdGlvbihlKXtpZih0aGlzLmNhbmNlbERyYWd8fCFjLmRyYWdnYWJsZSl7dmFyIHI9dGhpcztyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe3Iuc3RhcnRTZWxlY3QoKSxyLmNhcHR1cmVNb3VzZShlKX0sMCksZS5wcmV2ZW50RGVmYXVsdCgpfW09dC5nZXRTZWxlY3Rpb25SYW5nZSgpO3ZhciBpPWUuZGF0YVRyYW5zZmVyO2kuZWZmZWN0QWxsb3dlZD10LmdldFJlYWRPbmx5KCk/ImNvcHkiOiJjb3B5TW92ZSIscy5pc09wZXJhJiYodC5jb250YWluZXIuYXBwZW5kQ2hpbGQobiksbi5zY3JvbGxUb3A9MCksaS5zZXREcmFnSW1hZ2UmJmkuc2V0RHJhZ0ltYWdlKG4sMCwwKSxzLmlzT3BlcmEmJnQuY29udGFpbmVyLnJlbW92ZUNoaWxkKG4pLGkuY2xlYXJEYXRhKCksaS5zZXREYXRhKCJUZXh0Iix0LnNlc3Npb24uZ2V0VGV4dFJhbmdlKCkpLHc9ITAsdGhpcy5zZXRTdGF0ZSgiZHJhZyIpfSx0aGlzLm9uRHJhZ0VuZD1mdW5jdGlvbihlKXtjLmRyYWdnYWJsZT0hMSx3PSExLHRoaXMuc2V0U3RhdGUobnVsbCk7aWYoIXQuZ2V0UmVhZE9ubHkoKSl7dmFyIG49ZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdDshYiYmbj09Im1vdmUiJiZ0LnNlc3Npb24ucmVtb3ZlKHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdC4kcmVzZXRDdXJzb3JTdHlsZSgpfXRoaXMuZWRpdG9yLnVuc2V0U3R5bGUoImFjZV9kcmFnZ2luZyIpLHRoaXMuZWRpdG9yLnJlbmRlcmVyLnNldEN1cnNvclN0eWxlKCIiKX0sdGhpcy5vbkRyYWdFbnRlcj1mdW5jdGlvbihlKXtpZih0LmdldFJlYWRPbmx5KCl8fCFNKGUuZGF0YVRyYW5zZmVyKSlyZXR1cm47cmV0dXJuIHA9ZS5jbGllbnRYLGQ9ZS5jbGllbnRZLGh8fGsoKSx5KyssZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdD1iPV8oZSksaS5wcmV2ZW50RGVmYXVsdChlKX0sdGhpcy5vbkRyYWdPdmVyPWZ1bmN0aW9uKGUpe2lmKHQuZ2V0UmVhZE9ubHkoKXx8IU0oZS5kYXRhVHJhbnNmZXIpKXJldHVybjtyZXR1cm4gcD1lLmNsaWVudFgsZD1lLmNsaWVudFksaHx8KGsoKSx5KyspLEEhPT1udWxsJiYoQT1udWxsKSxlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0PWI9XyhlKSxpLnByZXZlbnREZWZhdWx0KGUpfSx0aGlzLm9uRHJhZ0xlYXZlPWZ1bmN0aW9uKGUpe3ktLTtpZih5PD0wJiZoKXJldHVybiBMKCksYj1udWxsLGkucHJldmVudERlZmF1bHQoZSl9LHRoaXMub25Ecm9wPWZ1bmN0aW9uKGUpe2lmKCFnKXJldHVybjt2YXIgbj1lLmRhdGFUcmFuc2ZlcjtpZih3KXN3aXRjaChiKXtjYXNlIm1vdmUiOm0uY29udGFpbnMoZy5yb3csZy5jb2x1bW4pP209e3N0YXJ0OmcsZW5kOmd9Om09dC5tb3ZlVGV4dChtLGcpO2JyZWFrO2Nhc2UiY29weSI6bT10Lm1vdmVUZXh0KG0sZywhMCl9ZWxzZXt2YXIgcj1uLmdldERhdGEoIlRleHQiKTttPXtzdGFydDpnLGVuZDp0LnNlc3Npb24uaW5zZXJ0KGcscil9LHQuZm9jdXMoKSxiPW51bGx9cmV0dXJuIEwoKSxpLnByZXZlbnREZWZhdWx0KGUpfSxpLmFkZExpc3RlbmVyKGMsImRyYWdzdGFydCIsdGhpcy5vbkRyYWdTdGFydC5iaW5kKGUpKSxpLmFkZExpc3RlbmVyKGMsImRyYWdlbmQiLHRoaXMub25EcmFnRW5kLmJpbmQoZSkpLGkuYWRkTGlzdGVuZXIoYywiZHJhZ2VudGVyIix0aGlzLm9uRHJhZ0VudGVyLmJpbmQoZSkpLGkuYWRkTGlzdGVuZXIoYywiZHJhZ292ZXIiLHRoaXMub25EcmFnT3Zlci5iaW5kKGUpKSxpLmFkZExpc3RlbmVyKGMsImRyYWdsZWF2ZSIsdGhpcy5vbkRyYWdMZWF2ZS5iaW5kKGUpKSxpLmFkZExpc3RlbmVyKGMsImRyb3AiLHRoaXMub25Ecm9wLmJpbmQoZSkpO3ZhciBBPW51bGx9ZnVuY3Rpb24gbChlLHQsbixyKXtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KG4tZSwyKStNYXRoLnBvdyhyLXQsMikpfXZhciByPWUoIi4uL2xpYi9kb20iKSxpPWUoIi4uL2xpYi9ldmVudCIpLHM9ZSgiLi4vbGliL3VzZXJhZ2VudCIpLG89MjAwLHU9MjAwLGE9NTsoZnVuY3Rpb24oKXt0aGlzLmRyYWdXYWl0PWZ1bmN0aW9uKCl7dmFyIGU9RGF0ZS5ub3coKS10aGlzLm1vdXNlZG93bkV2ZW50LnRpbWU7ZT50aGlzLmVkaXRvci5nZXREcmFnRGVsYXkoKSYmdGhpcy5zdGFydERyYWcoKX0sdGhpcy5kcmFnV2FpdEVuZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZWRpdG9yLmNvbnRhaW5lcjtlLmRyYWdnYWJsZT0hMSx0aGlzLnN0YXJ0U2VsZWN0KHRoaXMubW91c2Vkb3duRXZlbnQuZ2V0RG9jdW1lbnRQb3NpdGlvbigpKSx0aGlzLnNlbGVjdEVuZCgpfSx0aGlzLmRyYWdSZWFkeUVuZD1mdW5jdGlvbihlKXt0aGlzLmVkaXRvci4kcmVzZXRDdXJzb3JTdHlsZSgpLHRoaXMuZWRpdG9yLnVuc2V0U3R5bGUoImFjZV9kcmFnZ2luZyIpLHRoaXMuZWRpdG9yLnJlbmRlcmVyLnNldEN1cnNvclN0eWxlKCIiKSx0aGlzLmRyYWdXYWl0RW5kKCl9LHRoaXMuc3RhcnREcmFnPWZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxEcmFnPSExO3ZhciBlPXRoaXMuZWRpdG9yLHQ9ZS5jb250YWluZXI7dC5kcmFnZ2FibGU9ITAsZS5yZW5kZXJlci4kY3Vyc29yTGF5ZXIuc2V0QmxpbmtpbmcoITEpLGUuc2V0U3R5bGUoImFjZV9kcmFnZ2luZyIpO3ZhciBuPXMuaXNXaW4/ImRlZmF1bHQiOiJtb3ZlIjtlLnJlbmRlcmVyLnNldEN1cnNvclN0eWxlKG4pLHRoaXMuc2V0U3RhdGUoImRyYWdSZWFkeSIpfSx0aGlzLm9uTW91c2VEcmFnPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZWRpdG9yLmNvbnRhaW5lcjtpZihzLmlzSUUmJnRoaXMuc3RhdGU9PSJkcmFnUmVhZHkiKXt2YXIgbj1sKHRoaXMubW91c2Vkb3duRXZlbnQueCx0aGlzLm1vdXNlZG93bkV2ZW50LnksdGhpcy54LHRoaXMueSk7bj4zJiZ0LmRyYWdEcm9wKCl9aWYodGhpcy5zdGF0ZT09PSJkcmFnV2FpdCIpe3ZhciBuPWwodGhpcy5tb3VzZWRvd25FdmVudC54LHRoaXMubW91c2Vkb3duRXZlbnQueSx0aGlzLngsdGhpcy55KTtuPjAmJih0LmRyYWdnYWJsZT0hMSx0aGlzLnN0YXJ0U2VsZWN0KHRoaXMubW91c2Vkb3duRXZlbnQuZ2V0RG9jdW1lbnRQb3NpdGlvbigpKSl9fSx0aGlzLm9uTW91c2VEb3duPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLiRkcmFnRW5hYmxlZClyZXR1cm47dGhpcy5tb3VzZWRvd25FdmVudD1lO3ZhciB0PXRoaXMuZWRpdG9yLG49ZS5pblNlbGVjdGlvbigpLHI9ZS5nZXRCdXR0b24oKSxpPWUuZG9tRXZlbnQuZGV0YWlsfHwxO2lmKGk9PT0xJiZyPT09MCYmbil7aWYoZS5lZGl0b3IuaW5NdWx0aVNlbGVjdE1vZGUmJihlLmdldEFjY2VsS2V5KCl8fGUuZ2V0U2hpZnRLZXkoKSkpcmV0dXJuO3RoaXMubW91c2Vkb3duRXZlbnQudGltZT1EYXRlLm5vdygpO3ZhciBvPWUuZG9tRXZlbnQudGFyZ2V0fHxlLmRvbUV2ZW50LnNyY0VsZW1lbnQ7InVuc2VsZWN0YWJsZSJpbiBvJiYoby51bnNlbGVjdGFibGU9Im9uIik7aWYodC5nZXREcmFnRGVsYXkoKSl7aWYocy5pc1dlYktpdCl7dGhpcy5jYW5jZWxEcmFnPSEwO3ZhciB1PXQuY29udGFpbmVyO3UuZHJhZ2dhYmxlPSEwfXRoaXMuc2V0U3RhdGUoImRyYWdXYWl0Iil9ZWxzZSB0aGlzLnN0YXJ0RHJhZygpO3RoaXMuY2FwdHVyZU1vdXNlKGUsdGhpcy5vbk1vdXNlRHJhZy5iaW5kKHRoaXMpKSxlLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9fX0pLmNhbGwoZi5wcm90b3R5cGUpLHQuRHJhZ2Ryb3BIYW5kbGVyPWZ9KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvdG91Y2hfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9tb3VzZS9tb3VzZV9ldmVudCIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL21vdXNlX2V2ZW50IikuTW91c2VFdmVudCxpPWUoIi4uL2xpYi9kb20iKTt0LmFkZFRvdWNoTGlzdGVuZXJzPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24geSgpe3ZhciBlPXdpbmRvdy5uYXZpZ2F0b3ImJndpbmRvdy5uYXZpZ2F0b3IuY2xpcGJvYXJkLHI9ITEscz1mdW5jdGlvbigpe3ZhciBuPXQuZ2V0Q29weVRleHQoKSxzPXQuc2Vzc2lvbi5nZXRVbmRvTWFuYWdlcigpLmhhc1VuZG8oKTtnLnJlcGxhY2VDaGlsZChpLmJ1aWxkRG9tKHI/WyJzcGFuIiwhbiYmWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoic2VsZWN0YWxsIn0sIlNlbGVjdCBBbGwiXSxuJiZbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJjb3B5In0sIkNvcHkiXSxuJiZbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJjdXQifSwiQ3V0Il0sZSYmWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoicGFzdGUifSwiUGFzdGUiXSxzJiZbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJ1bmRvIn0sIlVuZG8iXSxbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJmaW5kIn0sIkZpbmQiXSxbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJvcGVuQ29tbWFuZFBhbGxldGUifSwiUGFsbGV0ZSJdXTpbInNwYW4iXSksZy5maXJzdENoaWxkKX0sbz1mdW5jdGlvbihuKXt2YXIgaT1uLnRhcmdldC5nZXRBdHRyaWJ1dGUoImFjdGlvbiIpO2lmKGk9PSJtb3JlInx8IXIpcmV0dXJuIHI9IXIscygpO2lmKGk9PSJwYXN0ZSIpZS5yZWFkVGV4dCgpLnRoZW4oZnVuY3Rpb24oZSl7dC5leGVjQ29tbWFuZChpLGUpfSk7ZWxzZSBpZihpKXtpZihpPT0iY3V0Inx8aT09ImNvcHkiKWU/ZS53cml0ZVRleHQodC5nZXRDb3B5VGV4dCgpKTpkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpO3QuZXhlY0NvbW1hbmQoaSl9Zy5maXJzdENoaWxkLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHI9ITEsaSE9Im9wZW5Db21tYW5kUGFsbGV0ZSImJnQuZm9jdXMoKX07Zz1pLmJ1aWxkRG9tKFsiZGl2Iix7ImNsYXNzIjoiYWNlX21vYmlsZS1tZW51IixvbnRvdWNoc3RhcnQ6ZnVuY3Rpb24oZSl7bj0ibWVudSIsZS5zdG9wUHJvcGFnYXRpb24oKSxlLnByZXZlbnREZWZhdWx0KCksdC50ZXh0SW5wdXQuZm9jdXMoKX0sb250b3VjaGVuZDpmdW5jdGlvbihlKXtlLnN0b3BQcm9wYWdhdGlvbigpLGUucHJldmVudERlZmF1bHQoKSxvKGUpfSxvbmNsaWNrOm99LFsic3BhbiJdLFsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246Im1vcmUifSwiLi4uIl1dLHQuY29udGFpbmVyKX1mdW5jdGlvbiBiKCl7Z3x8eSgpO3ZhciBlPXQuc2VsZWN0aW9uLmN1cnNvcixuPXQucmVuZGVyZXIudGV4dFRvU2NyZWVuQ29vcmRpbmF0ZXMoZS5yb3csZS5jb2x1bW4pLHI9dC5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Zy5zdHlsZS50b3A9bi5wYWdlWS1yLnRvcC0zKyJweCIsZy5zdHlsZS5yaWdodD0iMTBweCIsZy5zdHlsZS5kaXNwbGF5PSIiLGcuZmlyc3RDaGlsZC5zdHlsZS5kaXNwbGF5PSJub25lIix0Lm9uKCJpbnB1dCIsdyl9ZnVuY3Rpb24gdyhlKXtnJiYoZy5zdHlsZS5kaXNwbGF5PSJub25lIiksdC5vZmYoImlucHV0Iix3KX1mdW5jdGlvbiBFKCl7Zj1udWxsLGNsZWFyVGltZW91dChmKTt2YXIgZT10LnNlbGVjdGlvbi5nZXRSYW5nZSgpLHI9ZS5jb250YWlucyhoLnJvdyxoLmNvbHVtbik7aWYoZS5pc0VtcHR5KCl8fCFyKXQuc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKGgpLHQuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKTtuPSJ3YWl0IixiKCl9ZnVuY3Rpb24gUygpe2Y9bnVsbCxjbGVhclRpbWVvdXQoZiksdC5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24oaCk7dmFyIGU9cD49Mj90LnNlbGVjdGlvbi5nZXRMaW5lUmFuZ2UoaC5yb3cpOnQuc2Vzc2lvbi5nZXRCcmFja2V0UmFuZ2UoaCk7ZSYmIWUuaXNFbXB0eSgpP3Quc2VsZWN0aW9uLnNldFJhbmdlKGUpOnQuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKSxuPSJ3YWl0In1mdW5jdGlvbiB4KCl7Yys9NjAsbD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2MtLTw9MCYmKGNsZWFySW50ZXJ2YWwobCksbD1udWxsKSxNYXRoLmFicyhkKTwuMDEmJihkPTApLE1hdGguYWJzKHYpPC4wMSYmKHY9MCksYzwyMCYmKGQ9LjkqZCksYzwyMCYmKHY9Ljkqdik7dmFyIGU9dC5zZXNzaW9uLmdldFNjcm9sbFRvcCgpO3QucmVuZGVyZXIuc2Nyb2xsQnkoMTAqZCwxMCp2KSxlPT10LnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkmJihjPTApfSwxMCl9dmFyIG49InNjcm9sbCIscyxvLHUsYSxmLGwsYz0wLGgscD0wLGQ9MCx2PTAsbSxnO2UuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLGZ1bmN0aW9uKGUpe2lmKCFtKXJldHVybjt2YXIgbj10LnRleHRJbnB1dC5nZXRFbGVtZW50KCk7bi5mb2N1cygpfSksZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbihlKXt2YXIgaT1lLnRvdWNoZXM7aWYoZnx8aS5sZW5ndGg+MSl7Y2xlYXJUaW1lb3V0KGYpLGY9bnVsbCx1PS0xLG49Inpvb20iO3JldHVybn1tPXQuJG1vdXNlSGFuZGxlci5pc01vdXNlUHJlc3NlZD0hMDt2YXIgbD10LnJlbmRlcmVyLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQsZz10LnJlbmRlcmVyLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQseT1lLnRpbWVTdGFtcDthPXk7dmFyIGI9aVswXSx3PWIuY2xpZW50WCx4PWIuY2xpZW50WTtNYXRoLmFicyhzLXcpK01hdGguYWJzKG8teCk+bCYmKHU9LTEpLHM9ZS5jbGllbnRYPXcsbz1lLmNsaWVudFk9eCxkPXY9MDt2YXIgVD1uZXcgcihlLHQpO2g9VC5nZXREb2N1bWVudFBvc2l0aW9uKCk7aWYoeS11PDUwMCYmaS5sZW5ndGg9PTEmJiFjKXArKyxlLnByZXZlbnREZWZhdWx0KCksZS5idXR0b249MCxTKCk7ZWxzZXtwPTA7dmFyIE49dC5zZWxlY3Rpb24uY3Vyc29yLEM9dC5zZWxlY3Rpb24uaXNFbXB0eSgpP046dC5zZWxlY3Rpb24uYW5jaG9yLGs9dC5yZW5kZXJlci4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbihOLCEwKSxMPXQucmVuZGVyZXIuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oQywhMCksQT10LnJlbmRlcmVyLnNjcm9sbGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLE89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS89Zyx0PXQvbC0uNzUsZSplK3QqdH07aWYoZS5jbGllbnRYPEEubGVmdCl7bj0iem9vbSI7cmV0dXJufXZhciBNPU8oZS5jbGllbnRYLUEubGVmdC1rLmxlZnQsZS5jbGllbnRZLUEudG9wLWsudG9wKSxfPU8oZS5jbGllbnRYLUEubGVmdC1MLmxlZnQsZS5jbGllbnRZLUEudG9wLUwudG9wKTtNPDMuNSYmXzwzLjUmJihuPU0+Xz8iY3Vyc29yIjoiYW5jaG9yIiksXzwzLjU/bj0iYW5jaG9yIjpNPDMuNT9uPSJjdXJzb3IiOm49InNjcm9sbCIsZj1zZXRUaW1lb3V0KEUsNDUwKX11PXl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixmdW5jdGlvbihlKXttPXQuJG1vdXNlSGFuZGxlci5pc01vdXNlUHJlc3NlZD0hMSxsJiZjbGVhckludGVydmFsKGwpLG49PSJ6b29tIj8obj0iIixjPTApOmY/KHQuc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKGgpLGM9MCxiKCkpOm49PSJzY3JvbGwiPyh4KCksZS5wcmV2ZW50RGVmYXVsdCgpLHcoKSk6YigpLGNsZWFyVGltZW91dChmKSxmPW51bGx9KSxlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsZnVuY3Rpb24oZSl7ZiYmKGNsZWFyVGltZW91dChmKSxmPW51bGwpO3ZhciBpPWUudG91Y2hlcztpZihpLmxlbmd0aD4xfHxuPT0iem9vbSIpcmV0dXJuO3ZhciB1PWlbMF0sbD1zLXUuY2xpZW50WCxjPW8tdS5jbGllbnRZO2lmKG49PSJ3YWl0Iil7aWYoIShsKmwrYypjPjQpKXJldHVybiBlLnByZXZlbnREZWZhdWx0KCk7bj0iY3Vyc29yIn1zPXUuY2xpZW50WCxvPXUuY2xpZW50WSxlLmNsaWVudFg9dS5jbGllbnRYLGUuY2xpZW50WT11LmNsaWVudFk7dmFyIGg9ZS50aW1lU3RhbXAscD1oLWE7YT1oO2lmKG49PSJzY3JvbGwiKXt2YXIgbT1uZXcgcihlLHQpO20uc3BlZWQ9MSxtLndoZWVsWD1sLG0ud2hlZWxZPWMsMTAqTWF0aC5hYnMobCk8TWF0aC5hYnMoYykmJihsPTApLDEwKk1hdGguYWJzKGMpPE1hdGguYWJzKGwpJiYoYz0wKSxwIT0wJiYoZD1sL3Asdj1jL3ApLHQuX2VtaXQoIm1vdXNld2hlZWwiLG0pLG0ucHJvcGFnYXRpb25TdG9wcGVkfHwoZD12PTApfWVsc2V7dmFyIGc9bmV3IHIoZSx0KSx5PWcuZ2V0RG9jdW1lbnRQb3NpdGlvbigpO249PSJjdXJzb3IiP3Quc2VsZWN0aW9uLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHkpOm49PSJhbmNob3IiJiZ0LnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25BbmNob3IoeS5yb3cseS5jb2x1bW4pLHQucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoeSksZS5wcmV2ZW50RGVmYXVsdCgpfX0pfX0pLGFjZS5kZWZpbmUoImFjZS9saWIvbmV0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vZG9tIik7dC5nZXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKCJHRVQiLGUsITApLG4ub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7bi5yZWFkeVN0YXRlPT09NCYmdChuLnJlc3BvbnNlVGV4dCl9LG4uc2VuZChudWxsKX0sdC5sb2FkU2NyaXB0PWZ1bmN0aW9uKGUsdCl7dmFyIG49ci5nZXREb2N1bWVudEhlYWQoKSxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2kuc3JjPWUsbi5hcHBlbmRDaGlsZChpKSxpLm9ubG9hZD1pLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihlLG4pe2lmKG58fCFpLnJlYWR5U3RhdGV8fGkucmVhZHlTdGF0ZT09ImxvYWRlZCJ8fGkucmVhZHlTdGF0ZT09ImNvbXBsZXRlIilpPWkub25sb2FkPWkub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsbnx8dCgpfX0sdC5xdWFsaWZ5VVJMPWZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyZXR1cm4gdC5ocmVmPWUsdC5ocmVmfX0pLGFjZS5kZWZpbmUoImFjZS9saWIvZXZlbnRfZW1pdHRlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e30saT1mdW5jdGlvbigpe3RoaXMucHJvcGFnYXRpb25TdG9wcGVkPSEwfSxzPWZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwfTtyLl9lbWl0PXIuX2Rpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oZSx0KXt0aGlzLl9ldmVudFJlZ2lzdHJ5fHwodGhpcy5fZXZlbnRSZWdpc3RyeT17fSksdGhpcy5fZGVmYXVsdEhhbmRsZXJzfHwodGhpcy5fZGVmYXVsdEhhbmRsZXJzPXt9KTt2YXIgbj10aGlzLl9ldmVudFJlZ2lzdHJ5W2VdfHxbXSxyPXRoaXMuX2RlZmF1bHRIYW5kbGVyc1tlXTtpZighbi5sZW5ndGgmJiFyKXJldHVybjtpZih0eXBlb2YgdCE9Im9iamVjdCJ8fCF0KXQ9e307dC50eXBlfHwodC50eXBlPWUpLHQuc3RvcFByb3BhZ2F0aW9ufHwodC5zdG9wUHJvcGFnYXRpb249aSksdC5wcmV2ZW50RGVmYXVsdHx8KHQucHJldmVudERlZmF1bHQ9cyksbj1uLnNsaWNlKCk7Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspe25bb10odCx0aGlzKTtpZih0LnByb3BhZ2F0aW9uU3RvcHBlZClicmVha31pZihyJiYhdC5kZWZhdWx0UHJldmVudGVkKXJldHVybiByKHQsdGhpcyl9LHIuX3NpZ25hbD1mdW5jdGlvbihlLHQpe3ZhciBuPSh0aGlzLl9ldmVudFJlZ2lzdHJ5fHx7fSlbZV07aWYoIW4pcmV0dXJuO249bi5zbGljZSgpO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKW5bcl0odCx0aGlzKX0sci5vbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbiByKCl7bi5yZW1vdmVFdmVudExpc3RlbmVyKGUsciksdC5hcHBseShudWxsLGFyZ3VtZW50cyl9KTtpZighdClyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7dD1lfSl9LHIuc2V0RGVmYXVsdEhhbmRsZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9kZWZhdWx0SGFuZGxlcnM7bnx8KG49dGhpcy5fZGVmYXVsdEhhbmRsZXJzPXtfZGlzYWJsZWRfOnt9fSk7aWYobltlXSl7dmFyIHI9bltlXSxpPW4uX2Rpc2FibGVkX1tlXTtpfHwobi5fZGlzYWJsZWRfW2VdPWk9W10pLGkucHVzaChyKTt2YXIgcz1pLmluZGV4T2YodCk7cyE9LTEmJmkuc3BsaWNlKHMsMSl9bltlXT10fSxyLnJlbW92ZURlZmF1bHRIYW5kbGVyPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fZGVmYXVsdEhhbmRsZXJzO2lmKCFuKXJldHVybjt2YXIgcj1uLl9kaXNhYmxlZF9bZV07aWYobltlXT09dClyJiZ0aGlzLnNldERlZmF1bHRIYW5kbGVyKGUsci5wb3AoKSk7ZWxzZSBpZihyKXt2YXIgaT1yLmluZGV4T2YodCk7aSE9LTEmJnIuc3BsaWNlKGksMSl9fSxyLm9uPXIuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihlLHQsbil7dGhpcy5fZXZlbnRSZWdpc3RyeT10aGlzLl9ldmVudFJlZ2lzdHJ5fHx7fTt2YXIgcj10aGlzLl9ldmVudFJlZ2lzdHJ5W2VdO3JldHVybiByfHwocj10aGlzLl9ldmVudFJlZ2lzdHJ5W2VdPVtdKSxyLmluZGV4T2YodCk9PS0xJiZyW24/InVuc2hpZnQiOiJwdXNoIl0odCksdH0sci5vZmY9ci5yZW1vdmVMaXN0ZW5lcj1yLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLl9ldmVudFJlZ2lzdHJ5PXRoaXMuX2V2ZW50UmVnaXN0cnl8fHt9O3ZhciBuPXRoaXMuX2V2ZW50UmVnaXN0cnlbZV07aWYoIW4pcmV0dXJuO3ZhciByPW4uaW5kZXhPZih0KTtyIT09LTEmJm4uc3BsaWNlKHIsMSl9LHIucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3RoaXMuX2V2ZW50UmVnaXN0cnkmJih0aGlzLl9ldmVudFJlZ2lzdHJ5W2VdPVtdKX0sdC5FdmVudEVtaXR0ZXI9cn0pLGFjZS5kZWZpbmUoImFjZS9saWIvYXBwX2NvbmZpZyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oZSx0LG4peyJubyB1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUpe3R5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIiYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSxhcmd1bWVudHMpfWZ1bmN0aW9uIHUoZSx0KXt2YXIgbj1uZXcgRXJyb3IoZSk7bi5kYXRhPXQsdHlwZW9mIGNvbnNvbGU9PSJvYmplY3QiJiZjb25zb2xlLmVycm9yJiZjb25zb2xlLmVycm9yKG4pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBufSl9dmFyIHI9ZSgiLi9vb3AiKSxpPWUoIi4vZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixzPXtzZXRPcHRpb25zOmZ1bmN0aW9uKGUpe09iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7dGhpcy5zZXRPcHRpb24odCxlW3RdKX0sdGhpcyl9LGdldE9wdGlvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9e307aWYoIWUpe3ZhciBuPXRoaXMuJG9wdGlvbnM7ZT1PYmplY3Qua2V5cyhuKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIW5bZV0uaGlkZGVufSl9ZWxzZSBBcnJheS5pc0FycmF5KGUpfHwodD1lLGU9T2JqZWN0LmtleXModCkpO3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT10aGlzLmdldE9wdGlvbihlKX0sdGhpcyksdH0sc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7aWYodGhpc1siJCIrZV09PT10KXJldHVybjt2YXIgbj10aGlzLiRvcHRpb25zW2VdO2lmKCFuKXJldHVybiBvKCdtaXNzcGVsbGVkIG9wdGlvbiAiJytlKyciJyk7aWYobi5mb3J3YXJkVG8pcmV0dXJuIHRoaXNbbi5mb3J3YXJkVG9dJiZ0aGlzW24uZm9yd2FyZFRvXS5zZXRPcHRpb24oZSx0KTtuLmhhbmRsZXNTZXR8fCh0aGlzWyIkIitlXT10KSxuJiZuLnNldCYmbi5zZXQuY2FsbCh0aGlzLHQpfSxnZXRPcHRpb246ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kb3B0aW9uc1tlXTtyZXR1cm4gdD90LmZvcndhcmRUbz90aGlzW3QuZm9yd2FyZFRvXSYmdGhpc1t0LmZvcndhcmRUb10uZ2V0T3B0aW9uKGUpOnQmJnQuZ2V0P3QuZ2V0LmNhbGwodGhpcyk6dGhpc1siJCIrZV06bygnbWlzc3BlbGxlZCBvcHRpb24gIicrZSsnIicpfX0sYT1mdW5jdGlvbigpe3RoaXMuJGRlZmF1bHRPcHRpb25zPXt9fTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLGkpLHRoaXMuZGVmaW5lT3B0aW9ucz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUuJG9wdGlvbnN8fCh0aGlzLiRkZWZhdWx0T3B0aW9uc1t0XT1lLiRvcHRpb25zPXt9KSxPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPW5bdF07dHlwZW9mIHI9PSJzdHJpbmciJiYocj17Zm9yd2FyZFRvOnJ9KSxyLm5hbWV8fChyLm5hbWU9dCksZS4kb3B0aW9uc1tyLm5hbWVdPXIsImluaXRpYWxWYWx1ZSJpbiByJiYoZVsiJCIrci5uYW1lXT1yLmluaXRpYWxWYWx1ZSl9KSxyLmltcGxlbWVudChlLHMpLHRoaXN9LHRoaXMucmVzZXRPcHRpb25zPWZ1bmN0aW9uKGUpe09iamVjdC5rZXlzKGUuJG9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49ZS4kb3B0aW9uc1t0XTsidmFsdWUiaW4gbiYmZS5zZXRPcHRpb24odCxuLnZhbHVlKX0pfSx0aGlzLnNldERlZmF1bHRWYWx1ZT1mdW5jdGlvbihlLHQsbil7aWYoIWUpe2ZvcihlIGluIHRoaXMuJGRlZmF1bHRPcHRpb25zKWlmKHRoaXMuJGRlZmF1bHRPcHRpb25zW2VdW3RdKWJyZWFrO2lmKCF0aGlzLiRkZWZhdWx0T3B0aW9uc1tlXVt0XSlyZXR1cm4hMX12YXIgcj10aGlzLiRkZWZhdWx0T3B0aW9uc1tlXXx8KHRoaXMuJGRlZmF1bHRPcHRpb25zW2VdPXt9KTtyW3RdJiYoci5mb3J3YXJkVG8/dGhpcy5zZXREZWZhdWx0VmFsdWUoci5mb3J3YXJkVG8sdCxuKTpyW3RdLnZhbHVlPW4pfSx0aGlzLnNldERlZmF1bHRWYWx1ZXM9ZnVuY3Rpb24oZSx0KXtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3RoaXMuc2V0RGVmYXVsdFZhbHVlKGUsbix0W25dKX0sdGhpcyl9LHRoaXMud2Fybj1vLHRoaXMucmVwb3J0RXJyb3I9dX0pLmNhbGwoYS5wcm90b3R5cGUpLHQuQXBwQ29uZmlnPWF9KSxhY2UuZGVmaW5lKCJhY2UvY29uZmlnIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL25ldCIsImFjZS9saWIvYXBwX2NvbmZpZyJdLGZ1bmN0aW9uKGUsdCxuKXsibm8gdXNlIHN0cmljdCI7ZnVuY3Rpb24gbChyKXtpZighdXx8IXUuZG9jdW1lbnQpcmV0dXJuO2EucGFja2FnZWQ9cnx8ZS5wYWNrYWdlZHx8bi5wYWNrYWdlZHx8dS5kZWZpbmUmJmRlZmluZS5wYWNrYWdlZDt2YXIgaT17fSxzPSIiLG89ZG9jdW1lbnQuY3VycmVudFNjcmlwdHx8ZG9jdW1lbnQuX2N1cnJlbnRTY3JpcHQsZj1vJiZvLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50LGw9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Zm9yKHZhciBoPTA7aDxsLmxlbmd0aDtoKyspe3ZhciBwPWxbaF0sZD1wLnNyY3x8cC5nZXRBdHRyaWJ1dGUoInNyYyIpO2lmKCFkKWNvbnRpbnVlO3ZhciB2PXAuYXR0cmlidXRlcztmb3IodmFyIG09MCxnPXYubGVuZ3RoO208ZzttKyspe3ZhciB5PXZbbV07eS5uYW1lLmluZGV4T2YoImRhdGEtYWNlLSIpPT09MCYmKGlbYyh5Lm5hbWUucmVwbGFjZSgvXmRhdGEtYWNlLS8sIiIpKV09eS52YWx1ZSl9dmFyIGI9ZC5tYXRjaCgvXiguKilcL2FjZShcLVx3Kyk/XC5qcyhcP3wkKS8pO2ImJihzPWJbMV0pfXMmJihpLmJhc2U9aS5iYXNlfHxzLGkucGFja2FnZWQ9ITApLGkuYmFzZVBhdGg9aS5iYXNlLGkud29ya2VyUGF0aD1pLndvcmtlclBhdGh8fGkuYmFzZSxpLm1vZGVQYXRoPWkubW9kZVBhdGh8fGkuYmFzZSxpLnRoZW1lUGF0aD1pLnRoZW1lUGF0aHx8aS5iYXNlLGRlbGV0ZSBpLmJhc2U7Zm9yKHZhciB3IGluIGkpdHlwZW9mIGlbd10hPSJ1bmRlZmluZWQiJiZ0LnNldCh3LGlbd10pfWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGUucmVwbGFjZSgvLSguKS9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX0pfXZhciByPWUoIi4vbGliL2xhbmciKSxpPWUoIi4vbGliL29vcCIpLHM9ZSgiLi9saWIvbmV0Iiksbz1lKCIuL2xpYi9hcHBfY29uZmlnIikuQXBwQ29uZmlnO24uZXhwb3J0cz10PW5ldyBvO3ZhciB1PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN8fHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3d9KCksYT17cGFja2FnZWQ6ITEsd29ya2VyUGF0aDpudWxsLG1vZGVQYXRoOm51bGwsdGhlbWVQYXRoOm51bGwsYmFzZVBhdGg6IiIsc3VmZml4OiIuanMiLCRtb2R1bGVVcmxzOnt9LGxvYWRXb3JrZXJGcm9tQmxvYjohMCxzaGFyZWRQb3B1cHM6ITF9O3QuZ2V0PWZ1bmN0aW9uKGUpe2lmKCFhLmhhc093blByb3BlcnR5KGUpKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBjb25maWcga2V5OiAiK2UpO3JldHVybiBhW2VdfSx0LnNldD1mdW5jdGlvbihlLHQpe2lmKGEuaGFzT3duUHJvcGVydHkoZSkpYVtlXT10O2Vsc2UgaWYodGhpcy5zZXREZWZhdWx0VmFsdWUoIiIsZSx0KT09MCl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY29uZmlnIGtleTogIitlKX0sdC5hbGw9ZnVuY3Rpb24oKXtyZXR1cm4gci5jb3B5T2JqZWN0KGEpfSx0LiRtb2Rlcz17fSx0Lm1vZHVsZVVybD1mdW5jdGlvbihlLHQpe2lmKGEuJG1vZHVsZVVybHNbZV0pcmV0dXJuIGEuJG1vZHVsZVVybHNbZV07dmFyIG49ZS5zcGxpdCgiLyIpO3Q9dHx8bltuLmxlbmd0aC0yXXx8IiI7dmFyIHI9dD09InNuaXBwZXRzIj8iLyI6Ii0iLGk9bltuLmxlbmd0aC0xXTtpZih0PT0id29ya2VyIiYmcj09Ii0iKXt2YXIgcz1uZXcgUmVnRXhwKCJeIit0KyJbXFwtX118W1xcLV9dIit0KyIkIiwiZyIpO2k9aS5yZXBsYWNlKHMsIiIpfSghaXx8aT09dCkmJm4ubGVuZ3RoPjEmJihpPW5bbi5sZW5ndGgtMl0pO3ZhciBvPWFbdCsiUGF0aCJdO3JldHVybiBvPT1udWxsP289YS5iYXNlUGF0aDpyPT0iLyImJih0PXI9IiIpLG8mJm8uc2xpY2UoLTEpIT0iLyImJihvKz0iLyIpLG8rdCtyK2krdGhpcy5nZXQoInN1ZmZpeCIpfSx0LnNldE1vZHVsZVVybD1mdW5jdGlvbihlLHQpe3JldHVybiBhLiRtb2R1bGVVcmxzW2VdPXR9LHQuJGxvYWRpbmc9e30sdC5sb2FkTW9kdWxlPWZ1bmN0aW9uKG4scil7dmFyIGksbztBcnJheS5pc0FycmF5KG4pJiYobz1uWzBdLG49blsxXSk7dHJ5e2k9ZShuKX1jYXRjaCh1KXt9aWYoaSYmIXQuJGxvYWRpbmdbbl0pcmV0dXJuIHImJnIoaSk7dC4kbG9hZGluZ1tuXXx8KHQuJGxvYWRpbmdbbl09W10pLHQuJGxvYWRpbmdbbl0ucHVzaChyKTtpZih0LiRsb2FkaW5nW25dLmxlbmd0aD4xKXJldHVybjt2YXIgYT1mdW5jdGlvbigpe2UoW25dLGZ1bmN0aW9uKGUpe3QuX2VtaXQoImxvYWQubW9kdWxlIix7bmFtZTpuLG1vZHVsZTplfSk7dmFyIHI9dC4kbG9hZGluZ1tuXTt0LiRsb2FkaW5nW25dPW51bGwsci5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QmJnQoZSl9KX0pfTtpZighdC5nZXQoInBhY2thZ2VkIikpcmV0dXJuIGEoKTtzLmxvYWRTY3JpcHQodC5tb2R1bGVVcmwobixvKSxhKSxmKCl9O3ZhciBmPWZ1bmN0aW9uKCl7IWEuYmFzZVBhdGgmJiFhLndvcmtlclBhdGgmJiFhLm1vZGVQYXRoJiYhYS50aGVtZVBhdGgmJiFPYmplY3Qua2V5cyhhLiRtb2R1bGVVcmxzKS5sZW5ndGgmJihjb25zb2xlLmVycm9yKCJVbmFibGUgdG8gaW5mZXIgcGF0aCB0byBhY2UgZnJvbSBzY3JpcHQgc3JjLCIsInVzZSBhY2UuY29uZmlnLnNldCgnYmFzZVBhdGgnLCAncGF0aCcpIHRvIGVuYWJsZSBkeW5hbWljIGxvYWRpbmcgb2YgbW9kZXMgYW5kIHRoZW1lcyIsIm9yIHdpdGggd2VicGFjayB1c2UgYWNlL3dlYnBhY2stcmVzb2x2ZXIiKSxmPWZ1bmN0aW9uKCl7fSl9O3QuaW5pdD1sLHQudmVyc2lvbj0iMS40LjYifSksYWNlLmRlZmluZSgiYWNlL21vdXNlL21vdXNlX2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi91c2VyYWdlbnQiLCJhY2UvbW91c2UvZGVmYXVsdF9oYW5kbGVycyIsImFjZS9tb3VzZS9kZWZhdWx0X2d1dHRlcl9oYW5kbGVyIiwiYWNlL21vdXNlL21vdXNlX2V2ZW50IiwiYWNlL21vdXNlL2RyYWdkcm9wX2hhbmRsZXIiLCJhY2UvbW91c2UvdG91Y2hfaGFuZGxlciIsImFjZS9jb25maWciXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9ldmVudCIpLGk9ZSgiLi4vbGliL3VzZXJhZ2VudCIpLHM9ZSgiLi9kZWZhdWx0X2hhbmRsZXJzIikuRGVmYXVsdEhhbmRsZXJzLG89ZSgiLi9kZWZhdWx0X2d1dHRlcl9oYW5kbGVyIikuR3V0dGVySGFuZGxlcix1PWUoIi4vbW91c2VfZXZlbnQiKS5Nb3VzZUV2ZW50LGE9ZSgiLi9kcmFnZHJvcF9oYW5kbGVyIikuRHJhZ2Ryb3BIYW5kbGVyLGY9ZSgiLi90b3VjaF9oYW5kbGVyIikuYWRkVG91Y2hMaXN0ZW5lcnMsbD1lKCIuLi9jb25maWciKSxjPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5lZGl0b3I9ZSxuZXcgcyh0aGlzKSxuZXcgbyh0aGlzKSxuZXcgYSh0aGlzKTt2YXIgbj1mdW5jdGlvbih0KXt2YXIgbj0hZG9jdW1lbnQuaGFzRm9jdXN8fCFkb2N1bWVudC5oYXNGb2N1cygpfHwhZS5pc0ZvY3VzZWQoKSYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09KGUudGV4dElucHV0JiZlLnRleHRJbnB1dC5nZXRFbGVtZW50KCkpO24mJndpbmRvdy5mb2N1cygpLGUuZm9jdXMoKX0sdT1lLnJlbmRlcmVyLmdldE1vdXNlRXZlbnRUYXJnZXQoKTtyLmFkZExpc3RlbmVyKHUsImNsaWNrIix0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsImNsaWNrIikpLHIuYWRkTGlzdGVuZXIodSwibW91c2Vtb3ZlIix0aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcywibW91c2Vtb3ZlIikpLHIuYWRkTXVsdGlNb3VzZURvd25MaXN0ZW5lcihbdSxlLnJlbmRlcmVyLnNjcm9sbEJhclYmJmUucmVuZGVyZXIuc2Nyb2xsQmFyVi5pbm5lcixlLnJlbmRlcmVyLnNjcm9sbEJhckgmJmUucmVuZGVyZXIuc2Nyb2xsQmFySC5pbm5lcixlLnRleHRJbnB1dCYmZS50ZXh0SW5wdXQuZ2V0RWxlbWVudCgpXS5maWx0ZXIoQm9vbGVhbiksWzQwMCwzMDAsMjUwXSx0aGlzLCJvbk1vdXNlRXZlbnQiKSxyLmFkZE1vdXNlV2hlZWxMaXN0ZW5lcihlLmNvbnRhaW5lcix0aGlzLm9uTW91c2VXaGVlbC5iaW5kKHRoaXMsIm1vdXNld2hlZWwiKSksZihlLmNvbnRhaW5lcixlKTt2YXIgbD1lLnJlbmRlcmVyLiRndXR0ZXI7ci5hZGRMaXN0ZW5lcihsLCJtb3VzZWRvd24iLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywiZ3V0dGVybW91c2Vkb3duIikpLHIuYWRkTGlzdGVuZXIobCwiY2xpY2siLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywiZ3V0dGVyY2xpY2siKSksci5hZGRMaXN0ZW5lcihsLCJkYmxjbGljayIsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJndXR0ZXJkYmxjbGljayIpKSxyLmFkZExpc3RlbmVyKGwsIm1vdXNlbW92ZSIsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJndXR0ZXJtb3VzZW1vdmUiKSksci5hZGRMaXN0ZW5lcih1LCJtb3VzZWRvd24iLG4pLHIuYWRkTGlzdGVuZXIobCwibW91c2Vkb3duIixuKSxpLmlzSUUmJmUucmVuZGVyZXIuc2Nyb2xsQmFyViYmKHIuYWRkTGlzdGVuZXIoZS5yZW5kZXJlci5zY3JvbGxCYXJWLmVsZW1lbnQsIm1vdXNlZG93biIsbiksci5hZGRMaXN0ZW5lcihlLnJlbmRlcmVyLnNjcm9sbEJhckguZWxlbWVudCwibW91c2Vkb3duIixuKSksZS5vbigibW91c2Vtb3ZlIixmdW5jdGlvbihuKXtpZih0LnN0YXRlfHx0LiRkcmFnRGVsYXl8fCF0LiRkcmFnRW5hYmxlZClyZXR1cm47dmFyIHI9ZS5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyhuLngsbi55KSxpPWUuc2Vzc2lvbi5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSxzPWUucmVuZGVyZXI7IWkuaXNFbXB0eSgpJiZpLmluc2lkZVN0YXJ0KHIucm93LHIuY29sdW1uKT9zLnNldEN1cnNvclN0eWxlKCJkZWZhdWx0Iik6cy5zZXRDdXJzb3JTdHlsZSgiIil9KX07KGZ1bmN0aW9uKCl7dGhpcy5vbk1vdXNlRXZlbnQ9ZnVuY3Rpb24oZSx0KXt0aGlzLmVkaXRvci5fZW1pdChlLG5ldyB1KHQsdGhpcy5lZGl0b3IpKX0sdGhpcy5vbk1vdXNlTW92ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZWRpdG9yLl9ldmVudFJlZ2lzdHJ5JiZ0aGlzLmVkaXRvci5fZXZlbnRSZWdpc3RyeS5tb3VzZW1vdmU7aWYoIW58fCFuLmxlbmd0aClyZXR1cm47dGhpcy5lZGl0b3IuX2VtaXQoZSxuZXcgdSh0LHRoaXMuZWRpdG9yKSl9LHRoaXMub25Nb3VzZVdoZWVsPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IHUodCx0aGlzLmVkaXRvcik7bi5zcGVlZD10aGlzLiRzY3JvbGxTcGVlZCoyLG4ud2hlZWxYPXQud2hlZWxYLG4ud2hlZWxZPXQud2hlZWxZLHRoaXMuZWRpdG9yLl9lbWl0KGUsbil9LHRoaXMuc2V0U3RhdGU9ZnVuY3Rpb24oZSl7dGhpcy5zdGF0ZT1lfSx0aGlzLmNhcHR1cmVNb3VzZT1mdW5jdGlvbihlLHQpe3RoaXMueD1lLngsdGhpcy55PWUueSx0aGlzLmlzTW91c2VQcmVzc2VkPSEwO3ZhciBuPXRoaXMuZWRpdG9yLHM9dGhpcy5lZGl0b3IucmVuZGVyZXI7cy4kaXNNb3VzZVByZXNzZWQ9ITA7dmFyIG89dGhpcyxhPWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybjtpZihpLmlzV2ViS2l0JiYhZS53aGljaCYmby5yZWxlYXNlTW91c2UpcmV0dXJuIG8ucmVsZWFzZU1vdXNlKCk7by54PWUuY2xpZW50WCxvLnk9ZS5jbGllbnRZLHQmJnQoZSksby5tb3VzZUV2ZW50PW5ldyB1KGUsby5lZGl0b3IpLG8uJG1vdXNlTW92ZWQ9ITB9LGY9ZnVuY3Rpb24oZSl7bi5vZmYoImJlZm9yZUVuZE9wZXJhdGlvbiIsYyksY2xlYXJJbnRlcnZhbChoKSxsKCksb1tvLnN0YXRlKyJFbmQiXSYmb1tvLnN0YXRlKyJFbmQiXShlKSxvLnN0YXRlPSIiLG8uaXNNb3VzZVByZXNzZWQ9cy4kaXNNb3VzZVByZXNzZWQ9ITEscy4ka2VlcFRleHRBcmVhQXRDdXJzb3ImJnMuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yKCksby4kb25DYXB0dXJlTW91c2VNb3ZlPW8ucmVsZWFzZU1vdXNlPW51bGwsZSYmby5vbk1vdXNlRXZlbnQoIm1vdXNldXAiLGUpLG4uZW5kT3BlcmF0aW9uKCl9LGw9ZnVuY3Rpb24oKXtvW28uc3RhdGVdJiZvW28uc3RhdGVdKCksby4kbW91c2VNb3ZlZD0hMX07aWYoaS5pc09sZElFJiZlLmRvbUV2ZW50LnR5cGU9PSJkYmxjbGljayIpcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKGUpfSk7dmFyIGM9ZnVuY3Rpb24oZSl7aWYoIW8ucmVsZWFzZU1vdXNlKXJldHVybjtuLmN1ck9wLmNvbW1hbmQubmFtZSYmbi5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkJiYob1tvLnN0YXRlKyJFbmQiXSYmb1tvLnN0YXRlKyJFbmQiXSgpLG8uc3RhdGU9IiIsby5yZWxlYXNlTW91c2UoKSl9O24ub24oImJlZm9yZUVuZE9wZXJhdGlvbiIsYyksbi5zdGFydE9wZXJhdGlvbih7Y29tbWFuZDp7bmFtZToibW91c2UifX0pLG8uJG9uQ2FwdHVyZU1vdXNlTW92ZT1hLG8ucmVsZWFzZU1vdXNlPXIuY2FwdHVyZSh0aGlzLmVkaXRvci5jb250YWluZXIsYSxmKTt2YXIgaD1zZXRJbnRlcnZhbChsLDIwKX0sdGhpcy5yZWxlYXNlTW91c2U9bnVsbCx0aGlzLmNhbmNlbENvbnRleHRNZW51PWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24odCl7aWYodCYmdC5kb21FdmVudCYmdC5kb21FdmVudC50eXBlIT0iY29udGV4dG1lbnUiKXJldHVybjt0aGlzLmVkaXRvci5vZmYoIm5hdGl2ZWNvbnRleHRtZW51IixlKSx0JiZ0LmRvbUV2ZW50JiZyLnN0b3BFdmVudCh0LmRvbUV2ZW50KX0uYmluZCh0aGlzKTtzZXRUaW1lb3V0KGUsMTApLHRoaXMuZWRpdG9yLm9uKCJuYXRpdmVjb250ZXh0bWVudSIsZSl9fSkuY2FsbChjLnByb3RvdHlwZSksbC5kZWZpbmVPcHRpb25zKGMucHJvdG90eXBlLCJtb3VzZUhhbmRsZXIiLHtzY3JvbGxTcGVlZDp7aW5pdGlhbFZhbHVlOjJ9LGRyYWdEZWxheTp7aW5pdGlhbFZhbHVlOmkuaXNNYWM/MTUwOjB9LGRyYWdFbmFibGVkOntpbml0aWFsVmFsdWU6ITB9LGZvY3VzVGltZW91dDp7aW5pdGlhbFZhbHVlOjB9LHRvb2x0aXBGb2xsb3dzTW91c2U6e2luaXRpYWxWYWx1ZTohMH19KSx0Lk1vdXNlSGFuZGxlcj1jfSksYWNlLmRlZmluZSgiYWNlL21vdXNlL2ZvbGRfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe2Uub24oImNsaWNrIixmdW5jdGlvbih0KXt2YXIgbj10LmdldERvY3VtZW50UG9zaXRpb24oKSxpPWUuc2Vzc2lvbixzPWkuZ2V0Rm9sZEF0KG4ucm93LG4uY29sdW1uLDEpO3MmJih0LmdldEFjY2VsS2V5KCk/aS5yZW1vdmVGb2xkKHMpOmkuZXhwYW5kRm9sZChzKSx0LnN0b3AoKSk7dmFyIG89dC5kb21FdmVudCYmdC5kb21FdmVudC50YXJnZXQ7byYmci5oYXNDc3NDbGFzcyhvLCJhY2VfaW5saW5lX2J1dHRvbiIpJiZyLmhhc0Nzc0NsYXNzKG8sImFjZV90b2dnbGVfd3JhcCIpJiYoaS5zZXRPcHRpb24oIndyYXAiLCFpLmdldFVzZVdyYXBNb2RlKCkpLGUucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKSl9KSxlLm9uKCJndXR0ZXJjbGljayIsZnVuY3Rpb24odCl7dmFyIG49ZS5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuZ2V0UmVnaW9uKHQpO2lmKG49PSJmb2xkV2lkZ2V0cyIpe3ZhciByPXQuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLnJvdyxpPWUuc2Vzc2lvbjtpLmZvbGRXaWRnZXRzJiZpLmZvbGRXaWRnZXRzW3JdJiZlLnNlc3Npb24ub25Gb2xkV2lkZ2V0Q2xpY2socix0KSxlLmlzRm9jdXNlZCgpfHxlLmZvY3VzKCksdC5zdG9wKCl9fSksZS5vbigiZ3V0dGVyZGJsY2xpY2siLGZ1bmN0aW9uKHQpe3ZhciBuPWUucmVuZGVyZXIuJGd1dHRlckxheWVyLmdldFJlZ2lvbih0KTtpZihuPT0iZm9sZFdpZGdldHMiKXt2YXIgcj10LmdldERvY3VtZW50UG9zaXRpb24oKS5yb3csaT1lLnNlc3Npb24scz1pLmdldFBhcmVudEZvbGRSYW5nZURhdGEociwhMCksbz1zLnJhbmdlfHxzLmZpcnN0UmFuZ2U7aWYobyl7cj1vLnN0YXJ0LnJvdzt2YXIgdT1pLmdldEZvbGRBdChyLGkuZ2V0TGluZShyKS5sZW5ndGgsMSk7dT9pLnJlbW92ZUZvbGQodSk6KGkuYWRkRm9sZCgiLi4uIixvKSxlLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KHtyb3c6by5zdGFydC5yb3csY29sdW1uOjB9KSl9dC5zdG9wKCl9fSl9dmFyIHI9ZSgiLi4vbGliL2RvbSIpO3QuRm9sZEhhbmRsZXI9aX0pLGFjZS5kZWZpbmUoImFjZS9rZXlib2FyZC9rZXliaW5kaW5nIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9rZXlzIiwiYWNlL2xpYi9ldmVudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL2tleXMiKSxpPWUoIi4uL2xpYi9ldmVudCIpLHM9ZnVuY3Rpb24oZSl7dGhpcy4kZWRpdG9yPWUsdGhpcy4kZGF0YT17ZWRpdG9yOmV9LHRoaXMuJGhhbmRsZXJzPVtdLHRoaXMuc2V0RGVmYXVsdEhhbmRsZXIoZS5jb21tYW5kcyl9OyhmdW5jdGlvbigpe3RoaXMuc2V0RGVmYXVsdEhhbmRsZXI9ZnVuY3Rpb24oZSl7dGhpcy5yZW1vdmVLZXlib2FyZEhhbmRsZXIodGhpcy4kZGVmYXVsdEhhbmRsZXIpLHRoaXMuJGRlZmF1bHRIYW5kbGVyPWUsdGhpcy5hZGRLZXlib2FyZEhhbmRsZXIoZSwwKX0sdGhpcy5zZXRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kaGFuZGxlcnM7aWYodFt0Lmxlbmd0aC0xXT09ZSlyZXR1cm47d2hpbGUodFt0Lmxlbmd0aC0xXSYmdFt0Lmxlbmd0aC0xXSE9dGhpcy4kZGVmYXVsdEhhbmRsZXIpdGhpcy5yZW1vdmVLZXlib2FyZEhhbmRsZXIodFt0Lmxlbmd0aC0xXSk7dGhpcy5hZGRLZXlib2FyZEhhbmRsZXIoZSwxKX0sdGhpcy5hZGRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oZSx0KXtpZighZSlyZXR1cm47dHlwZW9mIGU9PSJmdW5jdGlvbiImJiFlLmhhbmRsZUtleWJvYXJkJiYoZS5oYW5kbGVLZXlib2FyZD1lKTt2YXIgbj10aGlzLiRoYW5kbGVycy5pbmRleE9mKGUpO24hPS0xJiZ0aGlzLiRoYW5kbGVycy5zcGxpY2UobiwxKSx0PT11bmRlZmluZWQ/dGhpcy4kaGFuZGxlcnMucHVzaChlKTp0aGlzLiRoYW5kbGVycy5zcGxpY2UodCwwLGUpLG49PS0xJiZlLmF0dGFjaCYmZS5hdHRhY2godGhpcy4kZWRpdG9yKX0sdGhpcy5yZW1vdmVLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kaGFuZGxlcnMuaW5kZXhPZihlKTtyZXR1cm4gdD09LTE/ITE6KHRoaXMuJGhhbmRsZXJzLnNwbGljZSh0LDEpLGUuZGV0YWNoJiZlLmRldGFjaCh0aGlzLiRlZGl0b3IpLCEwKX0sdGhpcy5nZXRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaGFuZGxlcnNbdGhpcy4kaGFuZGxlcnMubGVuZ3RoLTFdfSx0aGlzLmdldFN0YXR1c1RleHQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRkYXRhLHQ9ZS5lZGl0b3I7cmV0dXJuIHRoaXMuJGhhbmRsZXJzLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRTdGF0dXNUZXh0JiZuLmdldFN0YXR1c1RleHQodCxlKXx8IiJ9KS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpfSx0aGlzLiRjYWxsS2V5Ym9hcmRIYW5kbGVycz1mdW5jdGlvbihlLHQsbixyKXt2YXIgcyxvPSExLHU9dGhpcy4kZWRpdG9yLmNvbW1hbmRzO2Zvcih2YXIgYT10aGlzLiRoYW5kbGVycy5sZW5ndGg7YS0tOyl7cz10aGlzLiRoYW5kbGVyc1thXS5oYW5kbGVLZXlib2FyZCh0aGlzLiRkYXRhLGUsdCxuLHIpO2lmKCFzfHwhcy5jb21tYW5kKWNvbnRpbnVlO3MuY29tbWFuZD09Im51bGwiP289ITA6bz11LmV4ZWMocy5jb21tYW5kLHRoaXMuJGVkaXRvcixzLmFyZ3MsciksbyYmciYmZSE9LTEmJnMucGFzc0V2ZW50IT0xJiZzLmNvbW1hbmQucGFzc0V2ZW50IT0xJiZpLnN0b3BFdmVudChyKTtpZihvKWJyZWFrfXJldHVybiFvJiZlPT0tMSYmKHM9e2NvbW1hbmQ6Imluc2VydHN0cmluZyJ9LG89dS5leGVjKCJpbnNlcnRzdHJpbmciLHRoaXMuJGVkaXRvcix0KSksbyYmdGhpcy4kZWRpdG9yLl9zaWduYWwmJnRoaXMuJGVkaXRvci5fc2lnbmFsKCJrZXlib2FyZEFjdGl2aXR5IixzKSxvfSx0aGlzLm9uQ29tbWFuZEtleT1mdW5jdGlvbihlLHQsbil7dmFyIGk9ci5rZXlDb2RlVG9TdHJpbmcobik7cmV0dXJuIHRoaXMuJGNhbGxLZXlib2FyZEhhbmRsZXJzKHQsaSxuLGUpfSx0aGlzLm9uVGV4dElucHV0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiRjYWxsS2V5Ym9hcmRIYW5kbGVycygtMSxlKX19KS5jYWxsKHMucHJvdG90eXBlKSx0LktleUJpbmRpbmc9c30pLGFjZS5kZWZpbmUoImFjZS9saWIvYmlkaXV0aWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIEYoZSx0LG4scil7dmFyIGk9cz9kOnAsYz1udWxsLGg9bnVsbCx2PW51bGwsbT0wLGc9bnVsbCx5PW51bGwsYj0tMSx3PW51bGwsRT1udWxsLFQ9W107aWYoIXIpZm9yKHc9MCxyPVtdO3c8bjt3Kyspclt3XT1SKGVbd10pO289cyx1PSExLGE9ITEsZj0hMSxsPSExO2ZvcihFPTA7RTxuO0UrKyl7Yz1tLFRbRV09aD1xKGUscixULEUpLG09aVtjXVtoXSxnPW0mMjQwLG0mPTE1LHRbRV09dj1pW21dWzVdO2lmKGc+MClpZihnPT0xNil7Zm9yKHc9Yjt3PEU7dysrKXRbd109MTtiPS0xfWVsc2UgYj0tMTt5PWlbbV1bNl07aWYoeSliPT0tMSYmKGI9RSk7ZWxzZSBpZihiPi0xKXtmb3Iodz1iO3c8RTt3KyspdFt3XT12O2I9LTF9cltFXT09UyYmKHRbRV09MCksb3w9dn1pZihsKWZvcih3PTA7dzxuO3crKylpZihyW3ddPT14KXt0W3ddPXM7Zm9yKHZhciBDPXctMTtDPj0wO0MtLSl7aWYocltDXSE9TilicmVhazt0W0NdPXN9fX1mdW5jdGlvbiBJKGUsdCxuKXtpZihvPGUpcmV0dXJuO2lmKGU9PTEmJnM9PW0mJiFmKXtuLnJldmVyc2UoKTtyZXR1cm59dmFyIHI9bi5sZW5ndGgsaT0wLHUsYSxsLGM7d2hpbGUoaTxyKXtpZih0W2ldPj1lKXt1PWkrMTt3aGlsZSh1PHImJnRbdV0+PWUpdSsrO2ZvcihhPWksbD11LTE7YTxsO2ErKyxsLS0pYz1uW2FdLG5bYV09bltsXSxuW2xdPWM7aT11fWkrK319ZnVuY3Rpb24gcShlLHQsbixyKXt2YXIgaT10W3JdLG8sYyxoLHA7c3dpdGNoKGkpe2Nhc2UgZzpjYXNlIHk6dT0hMTtjYXNlIEU6Y2FzZSB3OnJldHVybiBpO2Nhc2UgYjpyZXR1cm4gdT93OmI7Y2FzZSBUOnJldHVybiB1PSEwLGE9ITAseTtjYXNlIE46cmV0dXJuIEU7Y2FzZSBDOmlmKHI8MXx8cisxPj10Lmxlbmd0aHx8KG89bltyLTFdKSE9YiYmbyE9d3x8KGM9dFtyKzFdKSE9YiYmYyE9dylyZXR1cm4gRTtyZXR1cm4gdSYmKGM9dyksYz09bz9jOkU7Y2FzZSBrOm89cj4wP25bci0xXTpTO2lmKG89PWImJnIrMTx0Lmxlbmd0aCYmdFtyKzFdPT1iKXJldHVybiBiO3JldHVybiBFO2Nhc2UgTDppZihyPjAmJm5bci0xXT09YilyZXR1cm4gYjtpZih1KXJldHVybiBFO3A9cisxLGg9dC5sZW5ndGg7d2hpbGUocDxoJiZ0W3BdPT1MKXArKztpZihwPGgmJnRbcF09PWIpcmV0dXJuIGI7cmV0dXJuIEU7Y2FzZSBBOmg9dC5sZW5ndGgscD1yKzE7d2hpbGUocDxoJiZ0W3BdPT1BKXArKztpZihwPGgpe3ZhciBkPWVbcl0sdj1kPj0xNDI1JiZkPD0yMzAzfHxkPT02NDI4NjtvPXRbcF07aWYodiYmKG89PXl8fG89PVQpKXJldHVybiB5fWlmKHI8MXx8KG89dFtyLTFdKT09UylyZXR1cm4gRTtyZXR1cm4gbltyLTFdO2Nhc2UgUzpyZXR1cm4gdT0hMSxmPSEwLHM7Y2FzZSB4OnJldHVybiBsPSEwLEU7Y2FzZSBPOmNhc2UgTTpjYXNlIEQ6Y2FzZSBQOmNhc2UgXzp1PSExO2Nhc2UgSDpyZXR1cm4gRX19ZnVuY3Rpb24gUihlKXt2YXIgdD1lLmNoYXJDb2RlQXQoMCksbj10Pj44O3JldHVybiBuPT0wP3Q+MTkxP2c6Qlt0XTpuPT01Py9bXHUwNTkxLVx1MDVmNF0vLnRlc3QoZSk/eTpnOm49PTY/L1tcdTA2MTAtXHUwNjFhXHUwNjRiLVx1MDY1Zlx1MDZkNi1cdTA2ZTRcdTA2ZTctXHUwNmVkXS8udGVzdChlKT9BOi9bXHUwNjYwLVx1MDY2OVx1MDY2Yi1cdTA2NmNdLy50ZXN0KGUpP3c6dD09MTY0Mj9MOi9bXHUwNmYwLVx1MDZmOV0vLnRlc3QoZSk/YjpUOm49PTMyJiZ0PD04Mjg3P2pbdCYyNTVdOm49PTI1ND90Pj02NTEzNj9UOkU6RX1mdW5jdGlvbiBVKGUpe3JldHVybiBlPj0iXHUwNjRiIiYmZTw9Ilx1MDY1NSJ9dmFyIHI9WyJcdTA2MjEiLCJcdTA2NDEiXSxpPVsiXHUwNjNhIiwiXHUwNjRhIl0scz0wLG89MCx1PSExLGE9ITEsZj0hMSxsPSExLGM9ITEsaD0hMSxwPVtbMCwzLDAsMSwwLDAsMF0sWzAsMywwLDEsMiwyLDBdLFswLDMsMCwxNywyLDAsMV0sWzAsMyw1LDUsNCwxLDBdLFswLDMsMjEsMjEsNCwwLDFdLFswLDMsNSw1LDQsMiwwXV0sZD1bWzIsMCwxLDEsMCwxLDBdLFsyLDAsMSwxLDAsMiwwXSxbMiwwLDIsMSwzLDIsMF0sWzIsMCwyLDMzLDMsMSwxXV0sdj0wLG09MSxnPTAseT0xLGI9Mix3PTMsRT00LFM9NSx4PTYsVD03LE49OCxDPTksaz0xMCxMPTExLEE9MTIsTz0xMyxNPTE0LF89MTUsRD0xNixQPTE3LEg9MTgsQj1bSCxILEgsSCxILEgsSCxILEgseCxTLHgsTixTLEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxTLFMsUyx4LE4sRSxFLEwsTCxMLEUsRSxFLEUsRSxrLEMsayxDLEMsYixiLGIsYixiLGIsYixiLGIsYixDLEUsRSxFLEUsRSxFLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxFLEUsRSxFLEUsRSxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsRSxFLEUsRSxILEgsSCxILEgsSCxTLEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxDLEUsTCxMLEwsTCxFLEUsRSxFLGcsRSxFLEgsRSxFLEwsTCxiLGIsRSxnLEUsRSxFLGIsZyxFLEUsRSxFLEVdLGo9W04sTixOLE4sTixOLE4sTixOLE4sTixILEgsSCxnLHksRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsTixTLE8sTSxfLEQsUCxDLEwsTCxMLEwsTCxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxDLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxOXTt0Lkw9Zyx0LlI9eSx0LkVOPWIsdC5PTl9SPTMsdC5BTj00LHQuUl9IPTUsdC5CPTYsdC5STEU9Nyx0LkRPVD0iXHUwMGI3Iix0LmRvQmlkaVJlb3JkZXI9ZnVuY3Rpb24oZSxuLHIpe2lmKGUubGVuZ3RoPDIpcmV0dXJue307dmFyIGk9ZS5zcGxpdCgiIiksbz1uZXcgQXJyYXkoaS5sZW5ndGgpLHU9bmV3IEFycmF5KGkubGVuZ3RoKSxhPVtdO3M9cj9tOnYsRihpLGEsaS5sZW5ndGgsbik7Zm9yKHZhciBmPTA7ZjxvLmxlbmd0aDtvW2ZdPWYsZisrKTtJKDIsYSxvKSxJKDEsYSxvKTtmb3IodmFyIGY9MDtmPG8ubGVuZ3RoLTE7ZisrKW5bZl09PT13P2FbZl09dC5BTjphW2ZdPT09eSYmKG5bZl0+VCYmbltmXTxPfHxuW2ZdPT09RXx8bltmXT09PUgpP2FbZl09dC5PTl9SOmY+MCYmaVtmLTFdPT09Ilx1MDY0NCImJi9cdTA2MjJ8XHUwNjIzfFx1MDYyNXxcdTA2MjcvLnRlc3QoaVtmXSkmJihhW2YtMV09YVtmXT10LlJfSCxmKyspO2lbaS5sZW5ndGgtMV09PT10LkRPVCYmKGFbaS5sZW5ndGgtMV09dC5CKSxpWzBdPT09Ilx1MjAyYiImJihhWzBdPXQuUkxFKTtmb3IodmFyIGY9MDtmPG8ubGVuZ3RoO2YrKyl1W2ZdPWFbb1tmXV07cmV0dXJue2xvZ2ljYWxGcm9tVmlzdWFsOm8sYmlkaUxldmVsczp1fX0sdC5oYXNCaWRpQ2hhcmFjdGVycz1mdW5jdGlvbihlLHQpe3ZhciBuPSExO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXRbcl09UihlLmNoYXJBdChyKSksIW4mJih0W3JdPT15fHx0W3JdPT1UfHx0W3JdPT13KSYmKG49ITApO3JldHVybiBufSx0LmdldFZpc3VhbEZyb21Mb2dpY2FsSWR4PWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjx0LmxvZ2ljYWxGcm9tVmlzdWFsLmxlbmd0aDtuKyspaWYodC5sb2dpY2FsRnJvbVZpc3VhbFtuXT09ZSlyZXR1cm4gbjtyZXR1cm4gMH19KSxhY2UuZGVmaW5lKCJhY2UvYmlkaWhhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2JpZGl1dGlsIiwiYWNlL2xpYi9sYW5nIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9iaWRpdXRpbCIpLGk9ZSgiLi9saWIvbGFuZyIpLHM9L1tcdTA1OTAtXHUwNWY0XHUwNjAwLVx1MDZmZlx1MDcwMC1cdTA4YWNcdTIwMkJdLyxvPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbj1lLHRoaXMuYmlkaU1hcD17fSx0aGlzLmN1cnJlbnRSb3c9bnVsbCx0aGlzLmJpZGlVdGlsPXIsdGhpcy5jaGFyV2lkdGhzPVtdLHRoaXMuRU9MPSJcdTAwYWMiLHRoaXMuc2hvd0ludmlzaWJsZXM9ITAsdGhpcy5pc1J0bERpcj0hMSx0aGlzLiRpc1J0bD0hMSx0aGlzLmxpbmU9IiIsdGhpcy53cmFwSW5kZW50PTAsdGhpcy5FT0Y9Ilx1MDBiNiIsdGhpcy5STEU9Ilx1MjAyYiIsdGhpcy5jb250ZW50V2lkdGg9MCx0aGlzLmZvbnRNZXRyaWNzPW51bGwsdGhpcy5ydGxMaW5lT2Zmc2V0PTAsdGhpcy53cmFwT2Zmc2V0PTAsdGhpcy5pc01vdmVMZWZ0T3BlcmF0aW9uPSExLHRoaXMuc2VlbkJpZGk9cy50ZXN0KGUuZ2V0VmFsdWUoKSl9OyhmdW5jdGlvbigpe3RoaXMuaXNCaWRpUm93PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5zZWVuQmlkaT8oZSE9PXRoaXMuY3VycmVudFJvdyYmKHRoaXMuY3VycmVudFJvdz1lLHRoaXMudXBkYXRlUm93TGluZSh0LG4pLHRoaXMudXBkYXRlQmlkaU1hcCgpKSx0aGlzLmJpZGlNYXAuYmlkaUxldmVscyk6ITF9LHRoaXMub25DaGFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy5zZWVuQmlkaT90aGlzLmN1cnJlbnRSb3c9bnVsbDplLmFjdGlvbj09Imluc2VydCImJnMudGVzdChlLmxpbmVzLmpvaW4oIlxuIikpJiYodGhpcy5zZWVuQmlkaT0hMCx0aGlzLmN1cnJlbnRSb3c9bnVsbCl9LHRoaXMuZ2V0RG9jdW1lbnRSb3c9ZnVuY3Rpb24oKXt2YXIgZT0wLHQ9dGhpcy5zZXNzaW9uLiRzY3JlZW5Sb3dDYWNoZTtpZih0Lmxlbmd0aCl7dmFyIG49dGhpcy5zZXNzaW9uLiRnZXRSb3dDYWNoZUluZGV4KHQsdGhpcy5jdXJyZW50Um93KTtuPj0wJiYoZT10aGlzLnNlc3Npb24uJGRvY1Jvd0NhY2hlW25dKX1yZXR1cm4gZX0sdGhpcy5nZXRTcGxpdEluZGV4PWZ1bmN0aW9uKCl7dmFyIGU9MCx0PXRoaXMuc2Vzc2lvbi4kc2NyZWVuUm93Q2FjaGU7aWYodC5sZW5ndGgpe3ZhciBuLHI9dGhpcy5zZXNzaW9uLiRnZXRSb3dDYWNoZUluZGV4KHQsdGhpcy5jdXJyZW50Um93KTt3aGlsZSh0aGlzLmN1cnJlbnRSb3ctZT4wKXtuPXRoaXMuc2Vzc2lvbi4kZ2V0Um93Q2FjaGVJbmRleCh0LHRoaXMuY3VycmVudFJvdy1lLTEpO2lmKG4hPT1yKWJyZWFrO3I9bixlKyt9fWVsc2UgZT10aGlzLmN1cnJlbnRSb3c7cmV0dXJuIGV9LHRoaXMudXBkYXRlUm93TGluZT1mdW5jdGlvbihlLHQpe2U9PT11bmRlZmluZWQmJihlPXRoaXMuZ2V0RG9jdW1lbnRSb3coKSk7dmFyIG49ZT09PXRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKS0xLHM9bj90aGlzLkVPRjp0aGlzLkVPTDt0aGlzLndyYXBJbmRlbnQ9MCx0aGlzLmxpbmU9dGhpcy5zZXNzaW9uLmdldExpbmUoZSksdGhpcy5pc1J0bERpcj10aGlzLiRpc1J0bHx8dGhpcy5saW5lLmNoYXJBdCgwKT09PXRoaXMuUkxFO2lmKHRoaXMuc2Vzc2lvbi4kdXNlV3JhcE1vZGUpe3ZhciBvPXRoaXMuc2Vzc2lvbi4kd3JhcERhdGFbZV07byYmKHQ9PT11bmRlZmluZWQmJih0PXRoaXMuZ2V0U3BsaXRJbmRleCgpKSx0PjAmJm8ubGVuZ3RoPyh0aGlzLndyYXBJbmRlbnQ9by5pbmRlbnQsdGhpcy53cmFwT2Zmc2V0PXRoaXMud3JhcEluZGVudCp0aGlzLmNoYXJXaWR0aHNbci5MXSx0aGlzLmxpbmU9dDxvLmxlbmd0aD90aGlzLmxpbmUuc3Vic3RyaW5nKG9bdC0xXSxvW3RdKTp0aGlzLmxpbmUuc3Vic3RyaW5nKG9bby5sZW5ndGgtMV0pKTp0aGlzLmxpbmU9dGhpcy5saW5lLnN1YnN0cmluZygwLG9bdF0pKSx0PT1vLmxlbmd0aCYmKHRoaXMubGluZSs9dGhpcy5zaG93SW52aXNpYmxlcz9zOnIuRE9UKX1lbHNlIHRoaXMubGluZSs9dGhpcy5zaG93SW52aXNpYmxlcz9zOnIuRE9UO3ZhciB1PXRoaXMuc2Vzc2lvbixhPTAsZjt0aGlzLmxpbmU9dGhpcy5saW5lLnJlcGxhY2UoL1x0fFtcdTExMDAtXHUyMDI5LCBcdTIwMkYtXHVGRkU2XS9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT0iCSJ8fHUuaXNGdWxsV2lkdGgoZS5jaGFyQ29kZUF0KDApKT8oZj1lPT09IgkiP3UuZ2V0U2NyZWVuVGFiU2l6ZSh0K2EpOjIsYSs9Zi0xLGkuc3RyaW5nUmVwZWF0KHIuRE9ULGYpKTplfSksdGhpcy5pc1J0bERpciYmKHRoaXMuZm9udE1ldHJpY3MuJG1haW4udGV4dENvbnRlbnQ9dGhpcy5saW5lLmNoYXJBdCh0aGlzLmxpbmUubGVuZ3RoLTEpPT1yLkRPVD90aGlzLmxpbmUuc3Vic3RyKDAsdGhpcy5saW5lLmxlbmd0aC0xKTp0aGlzLmxpbmUsdGhpcy5ydGxMaW5lT2Zmc2V0PXRoaXMuY29udGVudFdpZHRoLXRoaXMuZm9udE1ldHJpY3MuJG1haW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpfSx0aGlzLnVwZGF0ZUJpZGlNYXA9ZnVuY3Rpb24oKXt2YXIgZT1bXTtyLmhhc0JpZGlDaGFyYWN0ZXJzKHRoaXMubGluZSxlKXx8dGhpcy5pc1J0bERpcj90aGlzLmJpZGlNYXA9ci5kb0JpZGlSZW9yZGVyKHRoaXMubGluZSxlLHRoaXMuaXNSdGxEaXIpOnRoaXMuYmlkaU1hcD17fX0sdGhpcy5tYXJrQXNEaXJ0eT1mdW5jdGlvbigpe3RoaXMuY3VycmVudFJvdz1udWxsfSx0aGlzLnVwZGF0ZUNoYXJhY3RlcldpZHRocz1mdW5jdGlvbihlKXtpZih0aGlzLmNoYXJhY3RlcldpZHRoPT09ZS4kY2hhcmFjdGVyU2l6ZS53aWR0aClyZXR1cm47dGhpcy5mb250TWV0cmljcz1lO3ZhciB0PXRoaXMuY2hhcmFjdGVyV2lkdGg9ZS4kY2hhcmFjdGVyU2l6ZS53aWR0aCxuPWUuJG1lYXN1cmVDaGFyV2lkdGgoIlx1MDVkNCIpO3RoaXMuY2hhcldpZHRoc1tyLkxdPXRoaXMuY2hhcldpZHRoc1tyLkVOXT10aGlzLmNoYXJXaWR0aHNbci5PTl9SXT10LHRoaXMuY2hhcldpZHRoc1tyLlJdPXRoaXMuY2hhcldpZHRoc1tyLkFOXT1uLHRoaXMuY2hhcldpZHRoc1tyLlJfSF09biouNDUsdGhpcy5jaGFyV2lkdGhzW3IuQl09dGhpcy5jaGFyV2lkdGhzW3IuUkxFXT0wLHRoaXMuY3VycmVudFJvdz1udWxsfSx0aGlzLnNldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKGUpe3RoaXMuc2hvd0ludmlzaWJsZXM9ZSx0aGlzLmN1cnJlbnRSb3c9bnVsbH0sdGhpcy5zZXRFb2xDaGFyPWZ1bmN0aW9uKGUpe3RoaXMuRU9MPWV9LHRoaXMuc2V0Q29udGVudFdpZHRoPWZ1bmN0aW9uKGUpe3RoaXMuY29udGVudFdpZHRoPWV9LHRoaXMuaXNSdGxMaW5lPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiRpc1J0bD8hMDplIT11bmRlZmluZWQ/dGhpcy5zZXNzaW9uLmdldExpbmUoZSkuY2hhckF0KDApPT10aGlzLlJMRTp0aGlzLmlzUnRsRGlyfSx0aGlzLnNldFJ0bERpcmVjdGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZ2V0Q3Vyc29yUG9zaXRpb24oKTtmb3IodmFyIHI9ZS5zZWxlY3Rpb24uZ2V0U2VsZWN0aW9uQW5jaG9yKCkucm93O3I8PW4ucm93O3IrKykhdCYmZS5zZXNzaW9uLmdldExpbmUocikuY2hhckF0KDApPT09ZS5zZXNzaW9uLiRiaWRpSGFuZGxlci5STEU/ZS5zZXNzaW9uLmRvYy5yZW1vdmVJbkxpbmUociwwLDEpOnQmJmUuc2Vzc2lvbi5nZXRMaW5lKHIpLmNoYXJBdCgwKSE9PWUuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuUkxFJiZlLnNlc3Npb24uZG9jLmluc2VydCh7Y29sdW1uOjAscm93OnJ9LGUuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuUkxFKX0sdGhpcy5nZXRQb3NMZWZ0PWZ1bmN0aW9uKGUpe2UtPXRoaXMud3JhcEluZGVudDt2YXIgdD10aGlzLmxpbmUuY2hhckF0KDApPT09dGhpcy5STEU/MTowLG49ZT50P3RoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKT9lOmUtMTp0LGk9ci5nZXRWaXN1YWxGcm9tTG9naWNhbElkeChuLHRoaXMuYmlkaU1hcCkscz10aGlzLmJpZGlNYXAuYmlkaUxldmVscyxvPTA7IXRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKSYmZTw9dCYmc1tpXSUyIT09MCYmaSsrO2Zvcih2YXIgdT0wO3U8aTt1Kyspbys9dGhpcy5jaGFyV2lkdGhzW3NbdV1dO3JldHVybiF0aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCkmJmU+dCYmc1tpXSUyPT09MCYmKG8rPXRoaXMuY2hhcldpZHRoc1tzW2ldXSksdGhpcy53cmFwSW5kZW50JiYobys9dGhpcy5pc1J0bERpcj8tMSp0aGlzLndyYXBPZmZzZXQ6dGhpcy53cmFwT2Zmc2V0KSx0aGlzLmlzUnRsRGlyJiYobys9dGhpcy5ydGxMaW5lT2Zmc2V0KSxvfSx0aGlzLmdldFNlbGVjdGlvbnM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJpZGlNYXAscj1uLmJpZGlMZXZlbHMsaSxzPVtdLG89MCx1PU1hdGgubWluKGUsdCktdGhpcy53cmFwSW5kZW50LGE9TWF0aC5tYXgoZSx0KS10aGlzLndyYXBJbmRlbnQsZj0hMSxsPSExLGM9MDt0aGlzLndyYXBJbmRlbnQmJihvKz10aGlzLmlzUnRsRGlyPy0xKnRoaXMud3JhcE9mZnNldDp0aGlzLndyYXBPZmZzZXQpO2Zvcih2YXIgaCxwPTA7cDxyLmxlbmd0aDtwKyspaD1uLmxvZ2ljYWxGcm9tVmlzdWFsW3BdLGk9cltwXSxmPWg+PXUmJmg8YSxmJiYhbD9jPW86IWYmJmwmJnMucHVzaCh7bGVmdDpjLHdpZHRoOm8tY30pLG8rPXRoaXMuY2hhcldpZHRoc1tpXSxsPWY7ZiYmcD09PXIubGVuZ3RoJiZzLnB1c2goe2xlZnQ6Yyx3aWR0aDpvLWN9KTtpZih0aGlzLmlzUnRsRGlyKWZvcih2YXIgZD0wO2Q8cy5sZW5ndGg7ZCsrKXNbZF0ubGVmdCs9dGhpcy5ydGxMaW5lT2Zmc2V0O3JldHVybiBzfSx0aGlzLm9mZnNldFRvQ29sPWZ1bmN0aW9uKGUpe3RoaXMuaXNSdGxEaXImJihlLT10aGlzLnJ0bExpbmVPZmZzZXQpO3ZhciB0PTAsZT1NYXRoLm1heChlLDApLG49MCxyPTAsaT10aGlzLmJpZGlNYXAuYmlkaUxldmVscyxzPXRoaXMuY2hhcldpZHRoc1tpW3JdXTt0aGlzLndyYXBJbmRlbnQmJihlLT10aGlzLmlzUnRsRGlyPy0xKnRoaXMud3JhcE9mZnNldDp0aGlzLndyYXBPZmZzZXQpO3doaWxlKGU+bitzLzIpe24rPXM7aWYocj09PWkubGVuZ3RoLTEpe3M9MDticmVha31zPXRoaXMuY2hhcldpZHRoc1tpWysrcl1dfXJldHVybiByPjAmJmlbci0xXSUyIT09MCYmaVtyXSUyPT09MD8oZTxuJiZyLS0sdD10aGlzLmJpZGlNYXAubG9naWNhbEZyb21WaXN1YWxbcl0pOnI+MCYmaVtyLTFdJTI9PT0wJiZpW3JdJTIhPT0wP3Q9MSsoZT5uP3RoaXMuYmlkaU1hcC5sb2dpY2FsRnJvbVZpc3VhbFtyXTp0aGlzLmJpZGlNYXAubG9naWNhbEZyb21WaXN1YWxbci0xXSk6dGhpcy5pc1J0bERpciYmcj09PWkubGVuZ3RoLTEmJnM9PT0wJiZpW3ItMV0lMj09PTB8fCF0aGlzLmlzUnRsRGlyJiZyPT09MCYmaVtyXSUyIT09MD90PTErdGhpcy5iaWRpTWFwLmxvZ2ljYWxGcm9tVmlzdWFsW3JdOihyPjAmJmlbci0xXSUyIT09MCYmcyE9PTAmJnItLSx0PXRoaXMuYmlkaU1hcC5sb2dpY2FsRnJvbVZpc3VhbFtyXSksdD09PTAmJnRoaXMuaXNSdGxEaXImJnQrKyx0K3RoaXMud3JhcEluZGVudH19KS5jYWxsKG8ucHJvdG90eXBlKSx0LkJpZGlIYW5kbGVyPW99KSxhY2UuZGVmaW5lKCJhY2Uvc2VsZWN0aW9uIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvbGFuZyIpLHM9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixvPWUoIi4vcmFuZ2UiKS5SYW5nZSx1PWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbj1lLHRoaXMuZG9jPWUuZ2V0RG9jdW1lbnQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5jdXJzb3I9dGhpcy5sZWFkPXRoaXMuZG9jLmNyZWF0ZUFuY2hvcigwLDApLHRoaXMuYW5jaG9yPXRoaXMuZG9jLmNyZWF0ZUFuY2hvcigwLDApLHRoaXMuJHNpbGVudD0hMTt2YXIgdD10aGlzO3RoaXMuY3Vyc29yLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKGUpe3QuJGN1cnNvckNoYW5nZWQ9ITAsdC4kc2lsZW50fHx0Ll9lbWl0KCJjaGFuZ2VDdXJzb3IiKSwhdC4kaXNFbXB0eSYmIXQuJHNpbGVudCYmdC5fZW1pdCgiY2hhbmdlU2VsZWN0aW9uIiksIXQuJGtlZXBEZXNpcmVkQ29sdW1uT25DaGFuZ2UmJmUub2xkLmNvbHVtbiE9ZS52YWx1ZS5jb2x1bW4mJih0LiRkZXNpcmVkQ29sdW1uPW51bGwpfSksdGhpcy5hbmNob3Iub24oImNoYW5nZSIsZnVuY3Rpb24oKXt0LiRhbmNob3JDaGFuZ2VkPSEwLCF0LiRpc0VtcHR5JiYhdC4kc2lsZW50JiZ0Ll9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKX0pfTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLHMpLHRoaXMuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRpc0VtcHR5fHx0aGlzLmFuY2hvci5yb3c9PXRoaXMubGVhZC5yb3cmJnRoaXMuYW5jaG9yLmNvbHVtbj09dGhpcy5sZWFkLmNvbHVtbn0sdGhpcy5pc011bHRpTGluZT1mdW5jdGlvbigpe3JldHVybiF0aGlzLiRpc0VtcHR5JiZ0aGlzLmFuY2hvci5yb3chPXRoaXMuY3Vyc29yLnJvd30sdGhpcy5nZXRDdXJzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZWFkLmdldFBvc2l0aW9uKCl9LHRoaXMuc2V0U2VsZWN0aW9uQW5jaG9yPWZ1bmN0aW9uKGUsdCl7dGhpcy4kaXNFbXB0eT0hMSx0aGlzLmFuY2hvci5zZXRQb3NpdGlvbihlLHQpfSx0aGlzLmdldEFuY2hvcj10aGlzLmdldFNlbGVjdGlvbkFuY2hvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRpc0VtcHR5P3RoaXMuZ2V0U2VsZWN0aW9uTGVhZCgpOnRoaXMuYW5jaG9yLmdldFBvc2l0aW9uKCl9LHRoaXMuZ2V0U2VsZWN0aW9uTGVhZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlYWQuZ2V0UG9zaXRpb24oKX0sdGhpcy5pc0JhY2t3YXJkcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYW5jaG9yLHQ9dGhpcy5sZWFkO3JldHVybiBlLnJvdz50LnJvd3x8ZS5yb3c9PXQucm93JiZlLmNvbHVtbj50LmNvbHVtbn0sdGhpcy5nZXRSYW5nZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYW5jaG9yLHQ9dGhpcy5sZWFkO3JldHVybiB0aGlzLiRpc0VtcHR5P28uZnJvbVBvaW50cyh0LHQpOnRoaXMuaXNCYWNrd2FyZHMoKT9vLmZyb21Qb2ludHModCxlKTpvLmZyb21Qb2ludHMoZSx0KX0sdGhpcy5jbGVhclNlbGVjdGlvbj1mdW5jdGlvbigpe3RoaXMuJGlzRW1wdHl8fCh0aGlzLiRpc0VtcHR5PSEwLHRoaXMuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpKX0sdGhpcy5zZWxlY3RBbGw9ZnVuY3Rpb24oKXt0aGlzLiRzZXRTZWxlY3Rpb24oMCwwLE51bWJlci5NQVhfVkFMVUUsTnVtYmVyLk1BWF9WQUxVRSl9LHRoaXMuc2V0UmFuZ2U9dGhpcy5zZXRTZWxlY3Rpb25SYW5nZT1mdW5jdGlvbihlLHQpe3ZhciBuPXQ/ZS5lbmQ6ZS5zdGFydCxyPXQ/ZS5zdGFydDplLmVuZDt0aGlzLiRzZXRTZWxlY3Rpb24obi5yb3csbi5jb2x1bW4sci5yb3csci5jb2x1bW4pfSx0aGlzLiRzZXRTZWxlY3Rpb249ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy4kaXNFbXB0eSxzPXRoaXMuaW5NdWx0aVNlbGVjdE1vZGU7dGhpcy4kc2lsZW50PSEwLHRoaXMuJGN1cnNvckNoYW5nZWQ9dGhpcy4kYW5jaG9yQ2hhbmdlZD0hMSx0aGlzLmFuY2hvci5zZXRQb3NpdGlvbihlLHQpLHRoaXMuY3Vyc29yLnNldFBvc2l0aW9uKG4sciksdGhpcy4kaXNFbXB0eT0hby5jb21wYXJlUG9pbnRzKHRoaXMuYW5jaG9yLHRoaXMuY3Vyc29yKSx0aGlzLiRzaWxlbnQ9ITEsdGhpcy4kY3Vyc29yQ2hhbmdlZCYmdGhpcy5fZW1pdCgiY2hhbmdlQ3Vyc29yIiksKHRoaXMuJGN1cnNvckNoYW5nZWR8fHRoaXMuJGFuY2hvckNoYW5nZWR8fGkhPXRoaXMuJGlzRW1wdHl8fHMpJiZ0aGlzLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKX0sdGhpcy4kbW92ZVNlbGVjdGlvbj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlYWQ7dGhpcy4kaXNFbXB0eSYmdGhpcy5zZXRTZWxlY3Rpb25BbmNob3IodC5yb3csdC5jb2x1bW4pLGUuY2FsbCh0aGlzKX0sdGhpcy5zZWxlY3RUbz1mdW5jdGlvbihlLHQpe3RoaXMuJG1vdmVTZWxlY3Rpb24oZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JUbyhlLHQpfSl9LHRoaXMuc2VsZWN0VG9Qb3NpdGlvbj1mdW5jdGlvbihlKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKGZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihlKX0pfSx0aGlzLm1vdmVUbz1mdW5jdGlvbihlLHQpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKSx0aGlzLm1vdmVDdXJzb3JUbyhlLHQpfSx0aGlzLm1vdmVUb1Bvc2l0aW9uPWZ1bmN0aW9uKGUpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKSx0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGUpfSx0aGlzLnNlbGVjdFVwPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JVcCl9LHRoaXMuc2VsZWN0RG93bj1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yRG93bil9LHRoaXMuc2VsZWN0UmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvclJpZ2h0KX0sdGhpcy5zZWxlY3RMZWZ0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JMZWZ0KX0sdGhpcy5zZWxlY3RMaW5lU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckxpbmVTdGFydCl9LHRoaXMuc2VsZWN0TGluZUVuZD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yTGluZUVuZCl9LHRoaXMuc2VsZWN0RmlsZUVuZD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yRmlsZUVuZCl9LHRoaXMuc2VsZWN0RmlsZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JGaWxlU3RhcnQpfSx0aGlzLnNlbGVjdFdvcmRSaWdodD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yV29yZFJpZ2h0KX0sdGhpcy5zZWxlY3RXb3JkTGVmdD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yV29yZExlZnQpfSx0aGlzLmdldFdvcmRSYW5nZT1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiB0PT0idW5kZWZpbmVkIil7dmFyIG49ZXx8dGhpcy5sZWFkO2U9bi5yb3csdD1uLmNvbHVtbn1yZXR1cm4gdGhpcy5zZXNzaW9uLmdldFdvcmRSYW5nZShlLHQpfSx0aGlzLnNlbGVjdFdvcmQ9ZnVuY3Rpb24oKXt0aGlzLnNldFNlbGVjdGlvblJhbmdlKHRoaXMuZ2V0V29yZFJhbmdlKCkpfSx0aGlzLnNlbGVjdEFXb3JkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRDdXJzb3IoKSx0PXRoaXMuc2Vzc2lvbi5nZXRBV29yZFJhbmdlKGUucm93LGUuY29sdW1uKTt0aGlzLnNldFNlbGVjdGlvblJhbmdlKHQpfSx0aGlzLmdldExpbmVSYW5nZT1mdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiBlPT0ibnVtYmVyIj9lOnRoaXMubGVhZC5yb3cscixpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkTGluZShuKTtyZXR1cm4gaT8obj1pLnN0YXJ0LnJvdyxyPWkuZW5kLnJvdyk6cj1uLHQ9PT0hMD9uZXcgbyhuLDAscix0aGlzLnNlc3Npb24uZ2V0TGluZShyKS5sZW5ndGgpOm5ldyBvKG4sMCxyKzEsMCl9LHRoaXMuc2VsZWN0TGluZT1mdW5jdGlvbigpe3RoaXMuc2V0U2VsZWN0aW9uUmFuZ2UodGhpcy5nZXRMaW5lUmFuZ2UoKSl9LHRoaXMubW92ZUN1cnNvclVwPWZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yQnkoLTEsMCl9LHRoaXMubW92ZUN1cnNvckRvd249ZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JCeSgxLDApfSx0aGlzLndvdWxkTW92ZUludG9Tb2Z0VGFiPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmNvbHVtbixpPWUuY29sdW1uK3Q7cmV0dXJuIG48MCYmKHI9ZS5jb2x1bW4tdCxpPWUuY29sdW1uKSx0aGlzLnNlc3Npb24uaXNUYWJTdG9wKGUpJiZ0aGlzLmRvYy5nZXRMaW5lKGUucm93KS5zbGljZShyLGkpLnNwbGl0KCIgIikubGVuZ3RoLTE9PXR9LHRoaXMubW92ZUN1cnNvckxlZnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQuZ2V0UG9zaXRpb24oKSx0O2lmKHQ9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLnJvdyxlLmNvbHVtbiwtMSkpdGhpcy5tb3ZlQ3Vyc29yVG8odC5zdGFydC5yb3csdC5zdGFydC5jb2x1bW4pO2Vsc2UgaWYoZS5jb2x1bW49PT0wKWUucm93PjAmJnRoaXMubW92ZUN1cnNvclRvKGUucm93LTEsdGhpcy5kb2MuZ2V0TGluZShlLnJvdy0xKS5sZW5ndGgpO2Vsc2V7dmFyIG49dGhpcy5zZXNzaW9uLmdldFRhYlNpemUoKTt0aGlzLndvdWxkTW92ZUludG9Tb2Z0VGFiKGUsbiwtMSkmJiF0aGlzLnNlc3Npb24uZ2V0TmF2aWdhdGVXaXRoaW5Tb2Z0VGFicygpP3RoaXMubW92ZUN1cnNvckJ5KDAsLW4pOnRoaXMubW92ZUN1cnNvckJ5KDAsLTEpfX0sdGhpcy5tb3ZlQ3Vyc29yUmlnaHQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQuZ2V0UG9zaXRpb24oKSx0O2lmKHQ9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLnJvdyxlLmNvbHVtbiwxKSl0aGlzLm1vdmVDdXJzb3JUbyh0LmVuZC5yb3csdC5lbmQuY29sdW1uKTtlbHNlIGlmKHRoaXMubGVhZC5jb2x1bW49PXRoaXMuZG9jLmdldExpbmUodGhpcy5sZWFkLnJvdykubGVuZ3RoKXRoaXMubGVhZC5yb3c8dGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSYmdGhpcy5tb3ZlQ3Vyc29yVG8odGhpcy5sZWFkLnJvdysxLDApO2Vsc2V7dmFyIG49dGhpcy5zZXNzaW9uLmdldFRhYlNpemUoKSxlPXRoaXMubGVhZDt0aGlzLndvdWxkTW92ZUludG9Tb2Z0VGFiKGUsbiwxKSYmIXRoaXMuc2Vzc2lvbi5nZXROYXZpZ2F0ZVdpdGhpblNvZnRUYWJzKCk/dGhpcy5tb3ZlQ3Vyc29yQnkoMCxuKTp0aGlzLm1vdmVDdXJzb3JCeSgwLDEpfX0sdGhpcy5tb3ZlQ3Vyc29yTGluZVN0YXJ0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLnJvdyx0PXRoaXMubGVhZC5jb2x1bW4sbj10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblJvdyhlLHQpLHI9dGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihuLDApLGk9dGhpcy5zZXNzaW9uLmdldERpc3BsYXlMaW5lKGUsbnVsbCxyLnJvdyxyLmNvbHVtbikscz1pLm1hdGNoKC9eXHMqLyk7c1swXS5sZW5ndGghPXQmJiF0aGlzLnNlc3Npb24uJHVzZUVtYWNzU3R5bGVMaW5lU3RhcnQmJihyLmNvbHVtbis9c1swXS5sZW5ndGgpLHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24ocil9LHRoaXMubW92ZUN1cnNvckxpbmVFbmQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQsdD10aGlzLnNlc3Npb24uZ2V0RG9jdW1lbnRMYXN0Um93Q29sdW1uUG9zaXRpb24oZS5yb3csZS5jb2x1bW4pO2lmKHRoaXMubGVhZC5jb2x1bW49PXQuY29sdW1uKXt2YXIgbj10aGlzLnNlc3Npb24uZ2V0TGluZSh0LnJvdyk7aWYodC5jb2x1bW49PW4ubGVuZ3RoKXt2YXIgcj1uLnNlYXJjaCgvXHMrJC8pO3I+MCYmKHQuY29sdW1uPXIpfX10aGlzLm1vdmVDdXJzb3JUbyh0LnJvdyx0LmNvbHVtbil9LHRoaXMubW92ZUN1cnNvckZpbGVFbmQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmRvYy5nZXRMZW5ndGgoKS0xLHQ9dGhpcy5kb2MuZ2V0TGluZShlKS5sZW5ndGg7dGhpcy5tb3ZlQ3Vyc29yVG8oZSx0KX0sdGhpcy5tb3ZlQ3Vyc29yRmlsZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yVG8oMCwwKX0sdGhpcy5tb3ZlQ3Vyc29yTG9uZ1dvcmRSaWdodD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZC5yb3csdD10aGlzLmxlYWQuY29sdW1uLG49dGhpcy5kb2MuZ2V0TGluZShlKSxyPW4uc3Vic3RyaW5nKHQpO3RoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleD0wLHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleD0wO3ZhciBpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZSx0LDEpO2lmKGkpe3RoaXMubW92ZUN1cnNvclRvKGkuZW5kLnJvdyxpLmVuZC5jb2x1bW4pO3JldHVybn10aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5leGVjKHIpJiYodCs9dGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4LHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleD0wLHI9bi5zdWJzdHJpbmcodCkpO2lmKHQ+PW4ubGVuZ3RoKXt0aGlzLm1vdmVDdXJzb3JUbyhlLG4ubGVuZ3RoKSx0aGlzLm1vdmVDdXJzb3JSaWdodCgpLGU8dGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSYmdGhpcy5tb3ZlQ3Vyc29yV29yZFJpZ2h0KCk7cmV0dXJufXRoaXMuc2Vzc2lvbi50b2tlblJlLmV4ZWMocikmJih0Kz10aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXgsdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4PTApLHRoaXMubW92ZUN1cnNvclRvKGUsdCl9LHRoaXMubW92ZUN1cnNvckxvbmdXb3JkTGVmdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZC5yb3csdD10aGlzLmxlYWQuY29sdW1uLG47aWYobj10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUsdCwtMSkpe3RoaXMubW92ZUN1cnNvclRvKG4uc3RhcnQucm93LG4uc3RhcnQuY29sdW1uKTtyZXR1cm59dmFyIHI9dGhpcy5zZXNzaW9uLmdldEZvbGRTdHJpbmdBdChlLHQsLTEpO3I9PW51bGwmJihyPXRoaXMuZG9jLmdldExpbmUoZSkuc3Vic3RyaW5nKDAsdCkpO3ZhciBzPWkuc3RyaW5nUmV2ZXJzZShyKTt0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXg9MCx0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg9MCx0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5leGVjKHMpJiYodC09dGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4LHM9cy5zbGljZSh0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXgpLHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleD0wKTtpZih0PD0wKXt0aGlzLm1vdmVDdXJzb3JUbyhlLDApLHRoaXMubW92ZUN1cnNvckxlZnQoKSxlPjAmJnRoaXMubW92ZUN1cnNvcldvcmRMZWZ0KCk7cmV0dXJufXRoaXMuc2Vzc2lvbi50b2tlblJlLmV4ZWMocykmJih0LT10aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXgsdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4PTApLHRoaXMubW92ZUN1cnNvclRvKGUsdCl9LHRoaXMuJHNob3J0V29yZEVuZEluZGV4PWZ1bmN0aW9uKGUpe3ZhciB0PTAsbixyPS9ccy8saT10aGlzLnNlc3Npb24udG9rZW5SZTtpLmxhc3RJbmRleD0wO2lmKHRoaXMuc2Vzc2lvbi50b2tlblJlLmV4ZWMoZSkpdD10aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg7ZWxzZXt3aGlsZSgobj1lW3RdKSYmci50ZXN0KG4pKXQrKztpZih0PDEpe2kubGFzdEluZGV4PTA7d2hpbGUoKG49ZVt0XSkmJiFpLnRlc3Qobikpe2kubGFzdEluZGV4PTAsdCsrO2lmKHIudGVzdChuKSl7aWYodD4yKXt0LS07YnJlYWt9d2hpbGUoKG49ZVt0XSkmJnIudGVzdChuKSl0Kys7aWYodD4yKWJyZWFrfX19fXJldHVybiBpLmxhc3RJbmRleD0wLHR9LHRoaXMubW92ZUN1cnNvclNob3J0V29yZFJpZ2h0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLnJvdyx0PXRoaXMubGVhZC5jb2x1bW4sbj10aGlzLmRvYy5nZXRMaW5lKGUpLHI9bi5zdWJzdHJpbmcodCksaT10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUsdCwxKTtpZihpKXJldHVybiB0aGlzLm1vdmVDdXJzb3JUbyhpLmVuZC5yb3csaS5lbmQuY29sdW1uKTtpZih0PT1uLmxlbmd0aCl7dmFyIHM9dGhpcy5kb2MuZ2V0TGVuZ3RoKCk7ZG8gZSsrLHI9dGhpcy5kb2MuZ2V0TGluZShlKTt3aGlsZShlPHMmJi9eXHMqJC8udGVzdChyKSk7L15ccysvLnRlc3Qocil8fChyPSIiKSx0PTB9dmFyIG89dGhpcy4kc2hvcnRXb3JkRW5kSW5kZXgocik7dGhpcy5tb3ZlQ3Vyc29yVG8oZSx0K28pfSx0aGlzLm1vdmVDdXJzb3JTaG9ydFdvcmRMZWZ0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLnJvdyx0PXRoaXMubGVhZC5jb2x1bW4sbjtpZihuPXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZSx0LC0xKSlyZXR1cm4gdGhpcy5tb3ZlQ3Vyc29yVG8obi5zdGFydC5yb3csbi5zdGFydC5jb2x1bW4pO3ZhciByPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKGUpLnN1YnN0cmluZygwLHQpO2lmKHQ9PT0wKXtkbyBlLS0scj10aGlzLmRvYy5nZXRMaW5lKGUpO3doaWxlKGU+MCYmL15ccyokLy50ZXN0KHIpKTt0PXIubGVuZ3RoLC9ccyskLy50ZXN0KHIpfHwocj0iIil9dmFyIHM9aS5zdHJpbmdSZXZlcnNlKHIpLG89dGhpcy4kc2hvcnRXb3JkRW5kSW5kZXgocyk7cmV0dXJuIHRoaXMubW92ZUN1cnNvclRvKGUsdC1vKX0sdGhpcy5tb3ZlQ3Vyc29yV29yZFJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLiRzZWxlY3RMb25nV29yZHM/dGhpcy5tb3ZlQ3Vyc29yTG9uZ1dvcmRSaWdodCgpOnRoaXMubW92ZUN1cnNvclNob3J0V29yZFJpZ2h0KCl9LHRoaXMubW92ZUN1cnNvcldvcmRMZWZ0PWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLiRzZWxlY3RMb25nV29yZHM/dGhpcy5tb3ZlQ3Vyc29yTG9uZ1dvcmRMZWZ0KCk6dGhpcy5tb3ZlQ3Vyc29yU2hvcnRXb3JkTGVmdCgpfSx0aGlzLm1vdmVDdXJzb3JCeT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5sZWFkLnJvdyx0aGlzLmxlYWQuY29sdW1uKSxyO3Q9PT0wJiYoZSE9PTAmJih0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmlzQmlkaVJvdyhuLnJvdyx0aGlzLmxlYWQucm93KT8ocj10aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmdldFBvc0xlZnQobi5jb2x1bW4pLG4uY29sdW1uPU1hdGgucm91bmQoci90aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmNoYXJXaWR0aHNbMF0pKTpyPW4uY29sdW1uKnRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuY2hhcldpZHRoc1swXSksdGhpcy4kZGVzaXJlZENvbHVtbj9uLmNvbHVtbj10aGlzLiRkZXNpcmVkQ29sdW1uOnRoaXMuJGRlc2lyZWRDb2x1bW49bi5jb2x1bW4pO3ZhciBpPXRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24obi5yb3crZSxuLmNvbHVtbixyKTtlIT09MCYmdD09PTAmJmkucm93PT09dGhpcy5sZWFkLnJvdyYmaS5jb2x1bW49PT10aGlzLmxlYWQuY29sdW1uJiZ0aGlzLnNlc3Npb24ubGluZVdpZGdldHMmJnRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0c1tpLnJvd10mJihpLnJvdz4wfHxlPjApJiZpLnJvdysrLHRoaXMubW92ZUN1cnNvclRvKGkucm93LGkuY29sdW1uK3QsdD09PTApfSx0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uPWZ1bmN0aW9uKGUpe3RoaXMubW92ZUN1cnNvclRvKGUucm93LGUuY29sdW1uKX0sdGhpcy5tb3ZlQ3Vyc29yVG89ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZSx0LDEpO3ImJihlPXIuc3RhcnQucm93LHQ9ci5zdGFydC5jb2x1bW4pLHRoaXMuJGtlZXBEZXNpcmVkQ29sdW1uT25DaGFuZ2U9ITA7dmFyIGk9dGhpcy5zZXNzaW9uLmdldExpbmUoZSk7L1tcdURDMDAtXHVERkZGXS8udGVzdChpLmNoYXJBdCh0KSkmJmkuY2hhckF0KHQtMSkmJih0aGlzLmxlYWQucm93PT1lJiZ0aGlzLmxlYWQuY29sdW1uPT10KzE/dC09MTp0Kz0xKSx0aGlzLmxlYWQuc2V0UG9zaXRpb24oZSx0KSx0aGlzLiRrZWVwRGVzaXJlZENvbHVtbk9uQ2hhbmdlPSExLG58fCh0aGlzLiRkZXNpcmVkQ29sdW1uPW51bGwpfSx0aGlzLm1vdmVDdXJzb3JUb1NjcmVlbj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihlLHQpO3RoaXMubW92ZUN1cnNvclRvKHIucm93LHIuY29sdW1uLG4pfSx0aGlzLmRldGFjaD1mdW5jdGlvbigpe3RoaXMubGVhZC5kZXRhY2goKSx0aGlzLmFuY2hvci5kZXRhY2goKSx0aGlzLnNlc3Npb249dGhpcy5kb2M9bnVsbH0sdGhpcy5mcm9tT3JpZW50ZWRSYW5nZT1mdW5jdGlvbihlKXt0aGlzLnNldFNlbGVjdGlvblJhbmdlKGUsZS5jdXJzb3I9PWUuc3RhcnQpLHRoaXMuJGRlc2lyZWRDb2x1bW49ZS5kZXNpcmVkQ29sdW1ufHx0aGlzLiRkZXNpcmVkQ29sdW1ufSx0aGlzLnRvT3JpZW50ZWRSYW5nZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldFJhbmdlKCk7cmV0dXJuIGU/KGUuc3RhcnQuY29sdW1uPXQuc3RhcnQuY29sdW1uLGUuc3RhcnQucm93PXQuc3RhcnQucm93LGUuZW5kLmNvbHVtbj10LmVuZC5jb2x1bW4sZS5lbmQucm93PXQuZW5kLnJvdyk6ZT10LGUuY3Vyc29yPXRoaXMuaXNCYWNrd2FyZHMoKT9lLnN0YXJ0OmUuZW5kLGUuZGVzaXJlZENvbHVtbj10aGlzLiRkZXNpcmVkQ29sdW1uLGV9LHRoaXMuZ2V0UmFuZ2VPZk1vdmVtZW50cz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldEN1cnNvcigpO3RyeXtlKHRoaXMpO3ZhciBuPXRoaXMuZ2V0Q3Vyc29yKCk7cmV0dXJuIG8uZnJvbVBvaW50cyh0LG4pfWNhdGNoKHIpe3JldHVybiBvLmZyb21Qb2ludHModCx0KX1maW5hbGx5e3RoaXMubW92ZUN1cnNvclRvUG9zaXRpb24odCl9fSx0aGlzLnRvSlNPTj1mdW5jdGlvbigpe2lmKHRoaXMucmFuZ2VDb3VudCl2YXIgZT10aGlzLnJhbmdlcy5tYXAoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jbG9uZSgpO3JldHVybiB0LmlzQmFja3dhcmRzPWUuY3Vyc29yPT1lLnN0YXJ0LHR9KTtlbHNle3ZhciBlPXRoaXMuZ2V0UmFuZ2UoKTtlLmlzQmFja3dhcmRzPXRoaXMuaXNCYWNrd2FyZHMoKX1yZXR1cm4gZX0sdGhpcy5mcm9tSlNPTj1mdW5jdGlvbihlKXtpZihlLnN0YXJ0PT11bmRlZmluZWQpe2lmKHRoaXMucmFuZ2VMaXN0JiZlLmxlbmd0aD4xKXt0aGlzLnRvU2luZ2xlUmFuZ2UoZVswXSk7Zm9yKHZhciB0PWUubGVuZ3RoO3QtLTspe3ZhciBuPW8uZnJvbVBvaW50cyhlW3RdLnN0YXJ0LGVbdF0uZW5kKTtlW3RdLmlzQmFja3dhcmRzJiYobi5jdXJzb3I9bi5zdGFydCksdGhpcy5hZGRSYW5nZShuLCEwKX1yZXR1cm59ZT1lWzBdfXRoaXMucmFuZ2VMaXN0JiZ0aGlzLnRvU2luZ2xlUmFuZ2UoZSksdGhpcy5zZXRTZWxlY3Rpb25SYW5nZShlLGUuaXNCYWNrd2FyZHMpfSx0aGlzLmlzRXF1YWw9ZnVuY3Rpb24oZSl7aWYoKGUubGVuZ3RofHx0aGlzLnJhbmdlQ291bnQpJiZlLmxlbmd0aCE9dGhpcy5yYW5nZUNvdW50KXJldHVybiExO2lmKCFlLmxlbmd0aHx8IXRoaXMucmFuZ2VzKXJldHVybiB0aGlzLmdldFJhbmdlKCkuaXNFcXVhbChlKTtmb3IodmFyIHQ9dGhpcy5yYW5nZXMubGVuZ3RoO3QtLTspaWYoIXRoaXMucmFuZ2VzW3RdLmlzRXF1YWwoZVt0XSkpcmV0dXJuITE7cmV0dXJuITB9fSkuY2FsbCh1LnByb3RvdHlwZSksdC5TZWxlY3Rpb249dX0pLGFjZS5kZWZpbmUoImFjZS90b2tlbml6ZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvY29uZmlnIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2NvbmZpZyIpLGk9MmUzLHM9ZnVuY3Rpb24oZSl7dGhpcy5zdGF0ZXM9ZSx0aGlzLnJlZ0V4cHM9e30sdGhpcy5tYXRjaE1hcHBpbmdzPXt9O2Zvcih2YXIgdCBpbiB0aGlzLnN0YXRlcyl7dmFyIG49dGhpcy5zdGF0ZXNbdF0scj1bXSxpPTAscz10aGlzLm1hdGNoTWFwcGluZ3NbdF09e2RlZmF1bHRUb2tlbjoidGV4dCJ9LG89ImciLHU9W107Zm9yKHZhciBhPTA7YTxuLmxlbmd0aDthKyspe3ZhciBmPW5bYV07Zi5kZWZhdWx0VG9rZW4mJihzLmRlZmF1bHRUb2tlbj1mLmRlZmF1bHRUb2tlbiksZi5jYXNlSW5zZW5zaXRpdmUmJihvPSJnaSIpO2lmKGYucmVnZXg9PW51bGwpY29udGludWU7Zi5yZWdleCBpbnN0YW5jZW9mIFJlZ0V4cCYmKGYucmVnZXg9Zi5yZWdleC50b1N0cmluZygpLnNsaWNlKDEsLTEpKTt2YXIgbD1mLnJlZ2V4LGM9KG5ldyBSZWdFeHAoIig/OigiK2wrIil8KC4pKSIpKS5leGVjKCJhIikubGVuZ3RoLTI7QXJyYXkuaXNBcnJheShmLnRva2VuKT9mLnRva2VuLmxlbmd0aD09MXx8Yz09MT9mLnRva2VuPWYudG9rZW5bMF06Yy0xIT1mLnRva2VuLmxlbmd0aD8odGhpcy5yZXBvcnRFcnJvcigibnVtYmVyIG9mIGNsYXNzZXMgYW5kIHJlZ2V4cCBncm91cHMgZG9lc24ndCBtYXRjaCIse3J1bGU6Zixncm91cENvdW50OmMtMX0pLGYudG9rZW49Zi50b2tlblswXSk6KGYudG9rZW5BcnJheT1mLnRva2VuLGYudG9rZW49bnVsbCxmLm9uTWF0Y2g9dGhpcy4kYXJyYXlUb2tlbnMpOnR5cGVvZiBmLnRva2VuPT0iZnVuY3Rpb24iJiYhZi5vbk1hdGNoJiYoYz4xP2Yub25NYXRjaD10aGlzLiRhcHBseVRva2VuOmYub25NYXRjaD1mLnRva2VuKSxjPjEmJigvXFxcZC8udGVzdChmLnJlZ2V4KT9sPWYucmVnZXgucmVwbGFjZSgvXFwoWzAtOV0rKS9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIlxcIisocGFyc2VJbnQodCwxMCkraSsxKX0pOihjPTEsbD10aGlzLnJlbW92ZUNhcHR1cmluZ0dyb3VwcyhmLnJlZ2V4KSksIWYuc3BsaXRSZWdleCYmdHlwZW9mIGYudG9rZW4hPSJzdHJpbmciJiZ1LnB1c2goZikpLHNbaV09YSxpKz1jLHIucHVzaChsKSxmLm9uTWF0Y2h8fChmLm9uTWF0Y2g9bnVsbCl9ci5sZW5ndGh8fChzWzBdPTAsci5wdXNoKCIkIikpLHUuZm9yRWFjaChmdW5jdGlvbihlKXtlLnNwbGl0UmVnZXg9dGhpcy5jcmVhdGVTcGxpdHRlclJlZ2V4cChlLnJlZ2V4LG8pfSx0aGlzKSx0aGlzLnJlZ0V4cHNbdF09bmV3IFJlZ0V4cCgiKCIrci5qb2luKCIpfCgiKSsiKXwoJCkiLG8pfX07KGZ1bmN0aW9uKCl7dGhpcy4kc2V0TWF4VG9rZW5Db3VudD1mdW5jdGlvbihlKXtpPWV8MH0sdGhpcy4kYXBwbHlUb2tlbj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNwbGl0UmVnZXguZXhlYyhlKS5zbGljZSgxKSxuPXRoaXMudG9rZW4uYXBwbHkodGhpcyx0KTtpZih0eXBlb2Ygbj09InN0cmluZyIpcmV0dXJuW3t0eXBlOm4sdmFsdWU6ZX1dO3ZhciByPVtdO2Zvcih2YXIgaT0wLHM9bi5sZW5ndGg7aTxzO2krKyl0W2ldJiYocltyLmxlbmd0aF09e3R5cGU6bltpXSx2YWx1ZTp0W2ldfSk7cmV0dXJuIHJ9LHRoaXMuJGFycmF5VG9rZW5zPWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybltdO3ZhciB0PXRoaXMuc3BsaXRSZWdleC5leGVjKGUpO2lmKCF0KXJldHVybiJ0ZXh0Ijt2YXIgbj1bXSxyPXRoaXMudG9rZW5BcnJheTtmb3IodmFyIGk9MCxzPXIubGVuZ3RoO2k8cztpKyspdFtpKzFdJiYobltuLmxlbmd0aF09e3R5cGU6cltpXSx2YWx1ZTp0W2krMV19KTtyZXR1cm4gbn0sdGhpcy5yZW1vdmVDYXB0dXJpbmdHcm91cHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKC9cXC58XFsoPzpcXC58W15cXFxdXSkqfFwoXD9bOj0hXXwoXCgpL2csZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8iKD86IjplfSk7cmV0dXJuIHR9LHRoaXMuY3JlYXRlU3BsaXR0ZXJSZWdleHA9ZnVuY3Rpb24oZSx0KXtpZihlLmluZGV4T2YoIig/PSIpIT0tMSl7dmFyIG49MCxyPSExLGk9e307ZS5yZXBsYWNlKC8oXFwuKXwoXCgoPzpcP1s9IV0pPyl8KFwpKXwoW1xbXF1dKS9nLGZ1bmN0aW9uKGUsdCxzLG8sdSxhKXtyZXR1cm4gcj9yPXUhPSJdIjp1P3I9ITA6bz8obj09aS5zdGFjayYmKGkuZW5kPWErMSxpLnN0YWNrPS0xKSxuLS0pOnMmJihuKysscy5sZW5ndGghPTEmJihpLnN0YWNrPW4saS5zdGFydD1hKSksZX0pLGkuZW5kIT1udWxsJiYvXlwpKiQvLnRlc3QoZS5zdWJzdHIoaS5lbmQpKSYmKGU9ZS5zdWJzdHJpbmcoMCxpLnN0YXJ0KStlLnN1YnN0cihpLmVuZCkpfXJldHVybiBlLmNoYXJBdCgwKSE9Il4iJiYoZT0iXiIrZSksZS5jaGFyQXQoZS5sZW5ndGgtMSkhPSIkIiYmKGUrPSIkIiksbmV3IFJlZ0V4cChlLCh0fHwiIikucmVwbGFjZSgiZyIsIiIpKX0sdGhpcy5nZXRMaW5lVG9rZW5zPWZ1bmN0aW9uKGUsdCl7aWYodCYmdHlwZW9mIHQhPSJzdHJpbmciKXt2YXIgbj10LnNsaWNlKDApO3Q9blswXSx0PT09IiN0bXAiJiYobi5zaGlmdCgpLHQ9bi5zaGlmdCgpKX1lbHNlIHZhciBuPVtdO3ZhciByPXR8fCJzdGFydCIscz10aGlzLnN0YXRlc1tyXTtzfHwocj0ic3RhcnQiLHM9dGhpcy5zdGF0ZXNbcl0pO3ZhciBvPXRoaXMubWF0Y2hNYXBwaW5nc1tyXSx1PXRoaXMucmVnRXhwc1tyXTt1Lmxhc3RJbmRleD0wO3ZhciBhLGY9W10sbD0wLGM9MCxoPXt0eXBlOm51bGwsdmFsdWU6IiJ9O3doaWxlKGE9dS5leGVjKGUpKXt2YXIgcD1vLmRlZmF1bHRUb2tlbixkPW51bGwsdj1hWzBdLG09dS5sYXN0SW5kZXg7aWYobS12Lmxlbmd0aD5sKXt2YXIgZz1lLnN1YnN0cmluZyhsLG0tdi5sZW5ndGgpO2gudHlwZT09cD9oLnZhbHVlKz1nOihoLnR5cGUmJmYucHVzaChoKSxoPXt0eXBlOnAsdmFsdWU6Z30pfWZvcih2YXIgeT0wO3k8YS5sZW5ndGgtMjt5Kyspe2lmKGFbeSsxXT09PXVuZGVmaW5lZCljb250aW51ZTtkPXNbb1t5XV0sZC5vbk1hdGNoP3A9ZC5vbk1hdGNoKHYscixuLGUpOnA9ZC50b2tlbixkLm5leHQmJih0eXBlb2YgZC5uZXh0PT0ic3RyaW5nIj9yPWQubmV4dDpyPWQubmV4dChyLG4pLHM9dGhpcy5zdGF0ZXNbcl0sc3x8KHRoaXMucmVwb3J0RXJyb3IoInN0YXRlIGRvZXNuJ3QgZXhpc3QiLHIpLHI9InN0YXJ0IixzPXRoaXMuc3RhdGVzW3JdKSxvPXRoaXMubWF0Y2hNYXBwaW5nc1tyXSxsPW0sdT10aGlzLnJlZ0V4cHNbcl0sdS5sYXN0SW5kZXg9bSksZC5jb25zdW1lTGluZUVuZCYmKGw9bSk7YnJlYWt9aWYodilpZih0eXBlb2YgcD09InN0cmluZyIpISFkJiZkLm1lcmdlPT09ITF8fGgudHlwZSE9PXA/KGgudHlwZSYmZi5wdXNoKGgpLGg9e3R5cGU6cCx2YWx1ZTp2fSk6aC52YWx1ZSs9djtlbHNlIGlmKHApe2gudHlwZSYmZi5wdXNoKGgpLGg9e3R5cGU6bnVsbCx2YWx1ZToiIn07Zm9yKHZhciB5PTA7eTxwLmxlbmd0aDt5KyspZi5wdXNoKHBbeV0pfWlmKGw9PWUubGVuZ3RoKWJyZWFrO2w9bTtpZihjKys+aSl7Yz4yKmUubGVuZ3RoJiZ0aGlzLnJlcG9ydEVycm9yKCJpbmZpbml0ZSBsb29wIHdpdGggaW4gYWNlIHRva2VuaXplciIse3N0YXJ0U3RhdGU6dCxsaW5lOmV9KTt3aGlsZShsPGUubGVuZ3RoKWgudHlwZSYmZi5wdXNoKGgpLGg9e3ZhbHVlOmUuc3Vic3RyaW5nKGwsbCs9NTAwKSx0eXBlOiJvdmVyZmxvdyJ9O3I9InN0YXJ0IixuPVtdO2JyZWFrfX1yZXR1cm4gaC50eXBlJiZmLnB1c2goaCksbi5sZW5ndGg+MSYmblswXSE9PXImJm4udW5zaGlmdCgiI3RtcCIscikse3Rva2VuczpmLHN0YXRlOm4ubGVuZ3RoP246cn19LHRoaXMucmVwb3J0RXJyb3I9ci5yZXBvcnRFcnJvcn0pLmNhbGwocy5wcm90b3R5cGUpLHQuVG9rZW5pemVyPXN9KSxhY2UuZGVmaW5lKCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL2xhbmciKSxpPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImVtcHR5X2xpbmUiLHJlZ2V4OiJeJCJ9LHtkZWZhdWx0VG9rZW46InRleHQifV19fTsoZnVuY3Rpb24oKXt0aGlzLmFkZFJ1bGVzPWZ1bmN0aW9uKGUsdCl7aWYoIXQpe2Zvcih2YXIgbiBpbiBlKXRoaXMuJHJ1bGVzW25dPWVbbl07cmV0dXJufWZvcih2YXIgbiBpbiBlKXt2YXIgcj1lW25dO2Zvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgcz1yW2ldO2lmKHMubmV4dHx8cy5vbk1hdGNoKXR5cGVvZiBzLm5leHQ9PSJzdHJpbmciJiZzLm5leHQuaW5kZXhPZih0KSE9PTAmJihzLm5leHQ9dCtzLm5leHQpLHMubmV4dFN0YXRlJiZzLm5leHRTdGF0ZS5pbmRleE9mKHQpIT09MCYmKHMubmV4dFN0YXRlPXQrcy5uZXh0U3RhdGUpfXRoaXMuJHJ1bGVzW3Qrbl09cn19LHRoaXMuZ2V0UnVsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcnVsZXN9LHRoaXMuZW1iZWRSdWxlcz1mdW5jdGlvbihlLHQsbixpLHMpe3ZhciBvPXR5cGVvZiBlPT0iZnVuY3Rpb24iPyhuZXcgZSkuZ2V0UnVsZXMoKTplO2lmKGkpZm9yKHZhciB1PTA7dTxpLmxlbmd0aDt1KyspaVt1XT10K2lbdV07ZWxzZXtpPVtdO2Zvcih2YXIgYSBpbiBvKWkucHVzaCh0K2EpfXRoaXMuYWRkUnVsZXMobyx0KTtpZihuKXt2YXIgZj1BcnJheS5wcm90b3R5cGVbcz8icHVzaCI6InVuc2hpZnQiXTtmb3IodmFyIHU9MDt1PGkubGVuZ3RoO3UrKylmLmFwcGx5KHRoaXMuJHJ1bGVzW2lbdV1dLHIuZGVlcENvcHkobikpfXRoaXMuJGVtYmVkc3x8KHRoaXMuJGVtYmVkcz1bXSksdGhpcy4kZW1iZWRzLnB1c2godCl9LHRoaXMuZ2V0RW1iZWRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGVtYmVkc307dmFyIGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZSE9InN0YXJ0Inx8dC5sZW5ndGgpJiZ0LnVuc2hpZnQodGhpcy5uZXh0U3RhdGUsZSksdGhpcy5uZXh0U3RhdGV9LHQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5zaGlmdCgpLHQuc2hpZnQoKXx8InN0YXJ0In07dGhpcy5ub3JtYWxpemVSdWxlcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGkocyl7dmFyIG89cltzXTtvLnByb2Nlc3NlZD0hMDtmb3IodmFyIHU9MDt1PG8ubGVuZ3RoO3UrKyl7dmFyIGE9b1t1XSxmPW51bGw7QXJyYXkuaXNBcnJheShhKSYmKGY9YSxhPXt9KSwhYS5yZWdleCYmYS5zdGFydCYmKGEucmVnZXg9YS5zdGFydCxhLm5leHR8fChhLm5leHQ9W10pLGEubmV4dC5wdXNoKHtkZWZhdWx0VG9rZW46YS50b2tlbn0se3Rva2VuOmEudG9rZW4rIi5lbmQiLHJlZ2V4OmEuZW5kfHxhLnN0YXJ0LG5leHQ6InBvcCJ9KSxhLnRva2VuPWEudG9rZW4rIi5zdGFydCIsYS5wdXNoPSEwKTt2YXIgbD1hLm5leHR8fGEucHVzaDtpZihsJiZBcnJheS5pc0FycmF5KGwpKXt2YXIgYz1hLnN0YXRlTmFtZTtjfHwoYz1hLnRva2VuLHR5cGVvZiBjIT0ic3RyaW5nIiYmKGM9Y1swXXx8IiIpLHJbY10mJihjKz1uKyspKSxyW2NdPWwsYS5uZXh0PWMsaShjKX1lbHNlIGw9PSJwb3AiJiYoYS5uZXh0PXQpO2EucHVzaCYmKGEubmV4dFN0YXRlPWEubmV4dHx8YS5wdXNoLGEubmV4dD1lLGRlbGV0ZSBhLnB1c2gpO2lmKGEucnVsZXMpZm9yKHZhciBoIGluIGEucnVsZXMpcltoXT9yW2hdLnB1c2gmJnJbaF0ucHVzaC5hcHBseShyW2hdLGEucnVsZXNbaF0pOnJbaF09YS5ydWxlc1toXTt2YXIgcD10eXBlb2YgYT09InN0cmluZyI/YTphLmluY2x1ZGU7cCYmKEFycmF5LmlzQXJyYXkocCk/Zj1wLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gcltlXX0pOmY9cltwXSk7aWYoZil7dmFyIGQ9W3UsMV0uY29uY2F0KGYpO2Eubm9Fc2NhcGUmJihkPWQuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLm5leHR9KSksby5zcGxpY2UuYXBwbHkobyxkKSx1LS19YS5rZXl3b3JkTWFwJiYoYS50b2tlbj10aGlzLmNyZWF0ZUtleXdvcmRNYXBwZXIoYS5rZXl3b3JkTWFwLGEuZGVmYXVsdFRva2VufHwidGV4dCIsYS5jYXNlSW5zZW5zaXRpdmUpLGRlbGV0ZSBhLmRlZmF1bHRUb2tlbil9fXZhciBuPTAscj10aGlzLiRydWxlcztPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGksdGhpcyl9LHRoaXMuY3JlYXRlS2V5d29yZE1hcHBlcj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBzPWVbdF07biYmKHM9cy50b0xvd2VyQ2FzZSgpKTt2YXIgbz1zLnNwbGl0KHJ8fCJ8Iik7Zm9yKHZhciB1PW8ubGVuZ3RoO3UtLTspaVtvW3VdXT10fSksT2JqZWN0LmdldFByb3RvdHlwZU9mKGkpJiYoaS5fX3Byb3RvX189bnVsbCksdGhpcy4ka2V5d29yZExpc3Q9T2JqZWN0LmtleXMoaSksZT1udWxsLG4/ZnVuY3Rpb24oZSl7cmV0dXJuIGlbZS50b0xvd2VyQ2FzZSgpXXx8dH06ZnVuY3Rpb24oZSl7cmV0dXJuIGlbZV18fHR9fSx0aGlzLmdldEtleXdvcmRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGtleXdvcmRzfX0pLmNhbGwoaS5wcm90b3R5cGUpLHQuVGV4dEhpZ2hsaWdodFJ1bGVzPWl9KSxhY2UuZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWZ1bmN0aW9uKCl7dGhpcy4kYmVoYXZpb3Vycz17fX07KGZ1bmN0aW9uKCl7dGhpcy5hZGQ9ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaCh1bmRlZmluZWQpe2Nhc2UgdGhpcy4kYmVoYXZpb3Vyczp0aGlzLiRiZWhhdmlvdXJzPXt9O2Nhc2UgdGhpcy4kYmVoYXZpb3Vyc1tlXTp0aGlzLiRiZWhhdmlvdXJzW2VdPXt9fXRoaXMuJGJlaGF2aW91cnNbZV1bdF09bn0sdGhpcy5hZGRCZWhhdmlvdXJzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBlKWZvcih2YXIgbiBpbiBlW3RdKXRoaXMuYWRkKHQsbixlW3RdW25dKX0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oZSl7dGhpcy4kYmVoYXZpb3VycyYmdGhpcy4kYmVoYXZpb3Vyc1tlXSYmZGVsZXRlIHRoaXMuJGJlaGF2aW91cnNbZV19LHRoaXMuaW5oZXJpdD1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXZhciBuPShuZXcgZSkuZ2V0QmVoYXZpb3Vycyh0KTtlbHNlIHZhciBuPWUuZ2V0QmVoYXZpb3Vycyh0KTt0aGlzLmFkZEJlaGF2aW91cnMobil9LHRoaXMuZ2V0QmVoYXZpb3Vycz1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4gdGhpcy4kYmVoYXZpb3Vyczt2YXIgdD17fTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0aGlzLiRiZWhhdmlvdXJzW2Vbbl1dJiYodFtlW25dXT10aGlzLiRiZWhhdmlvdXJzW2Vbbl1dKTtyZXR1cm4gdH19KS5jYWxsKHIucHJvdG90eXBlKSx0LkJlaGF2aW91cj1yfSksYWNlLmRlZmluZSgiYWNlL3Rva2VuX2l0ZXJhdG9yIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL3JhbmdlIikuUmFuZ2UsaT1mdW5jdGlvbihlLHQsbil7dGhpcy4kc2Vzc2lvbj1lLHRoaXMuJHJvdz10LHRoaXMuJHJvd1Rva2Vucz1lLmdldFRva2Vucyh0KTt2YXIgcj1lLmdldFRva2VuQXQodCxuKTt0aGlzLiR0b2tlbkluZGV4PXI/ci5pbmRleDotMX07KGZ1bmN0aW9uKCl7dGhpcy5zdGVwQmFja3dhcmQ9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbkluZGV4LT0xO3doaWxlKHRoaXMuJHRva2VuSW5kZXg8MCl7dGhpcy4kcm93LT0xO2lmKHRoaXMuJHJvdzwwKXJldHVybiB0aGlzLiRyb3c9MCxudWxsO3RoaXMuJHJvd1Rva2Vucz10aGlzLiRzZXNzaW9uLmdldFRva2Vucyh0aGlzLiRyb3cpLHRoaXMuJHRva2VuSW5kZXg9dGhpcy4kcm93VG9rZW5zLmxlbmd0aC0xfXJldHVybiB0aGlzLiRyb3dUb2tlbnNbdGhpcy4kdG9rZW5JbmRleF19LHRoaXMuc3RlcEZvcndhcmQ9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbkluZGV4Kz0xO3ZhciBlO3doaWxlKHRoaXMuJHRva2VuSW5kZXg+PXRoaXMuJHJvd1Rva2Vucy5sZW5ndGgpe3RoaXMuJHJvdys9MSxlfHwoZT10aGlzLiRzZXNzaW9uLmdldExlbmd0aCgpKTtpZih0aGlzLiRyb3c+PWUpcmV0dXJuIHRoaXMuJHJvdz1lLTEsbnVsbDt0aGlzLiRyb3dUb2tlbnM9dGhpcy4kc2Vzc2lvbi5nZXRUb2tlbnModGhpcy4kcm93KSx0aGlzLiR0b2tlbkluZGV4PTB9cmV0dXJuIHRoaXMuJHJvd1Rva2Vuc1t0aGlzLiR0b2tlbkluZGV4XX0sdGhpcy5nZXRDdXJyZW50VG9rZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdfSx0aGlzLmdldEN1cnJlbnRUb2tlblJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyb3d9LHRoaXMuZ2V0Q3VycmVudFRva2VuQ29sdW1uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kcm93VG9rZW5zLHQ9dGhpcy4kdG9rZW5JbmRleCxuPWVbdF0uc3RhcnQ7aWYobiE9PXVuZGVmaW5lZClyZXR1cm4gbjtuPTA7d2hpbGUodD4wKXQtPTEsbis9ZVt0XS52YWx1ZS5sZW5ndGg7cmV0dXJuIG59LHRoaXMuZ2V0Q3VycmVudFRva2VuUG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm57cm93OnRoaXMuJHJvdyxjb2x1bW46dGhpcy5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKX19LHRoaXMuZ2V0Q3VycmVudFRva2VuUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRyb3dUb2tlbnNbdGhpcy4kdG9rZW5JbmRleF0sdD10aGlzLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpO3JldHVybiBuZXcgcih0aGlzLiRyb3csdCx0aGlzLiRyb3csdCtlLnZhbHVlLmxlbmd0aCl9fSkuY2FsbChpLnByb3RvdHlwZSksdC5Ub2tlbkl0ZXJhdG9yPWl9KSxhY2UuZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9iZWhhdmlvdXIiLCJhY2UvdG9rZW5faXRlcmF0b3IiLCJhY2UvbGliL2xhbmciXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uLy4uL2xpYi9vb3AiKSxpPWUoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cixzPWUoIi4uLy4uL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcixvPWUoIi4uLy4uL2xpYi9sYW5nIiksdT1bInRleHQiLCJwYXJlbi5ycGFyZW4iLCJycGFyZW4iLCJwYXJlbiIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIl0sYT1bInRleHQiLCJwYXJlbi5ycGFyZW4iLCJycGFyZW4iLCJwYXJlbiIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwiY29tbWVudCJdLGYsbD17fSxjPXsnIic6JyInLCInIjoiJyJ9LGg9ZnVuY3Rpb24oZSl7dmFyIHQ9LTE7ZS5tdWx0aVNlbGVjdCYmKHQ9ZS5zZWxlY3Rpb24uaW5kZXgsbC5yYW5nZUNvdW50IT1lLm11bHRpU2VsZWN0LnJhbmdlQ291bnQmJihsPXtyYW5nZUNvdW50OmUubXVsdGlTZWxlY3QucmFuZ2VDb3VudH0pKTtpZihsW3RdKXJldHVybiBmPWxbdF07Zj1sW3RdPXthdXRvSW5zZXJ0ZWRCcmFja2V0czowLGF1dG9JbnNlcnRlZFJvdzotMSxhdXRvSW5zZXJ0ZWRMaW5lRW5kOiIiLG1heWJlSW5zZXJ0ZWRCcmFja2V0czowLG1heWJlSW5zZXJ0ZWRSb3c6LTEsbWF5YmVJbnNlcnRlZExpbmVTdGFydDoiIixtYXliZUluc2VydGVkTGluZUVuZDoiIn19LHA9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ZS5lbmQucm93LWUuc3RhcnQucm93O3JldHVybnt0ZXh0Om4rdCtyLHNlbGVjdGlvbjpbMCxlLnN0YXJ0LmNvbHVtbisxLGksZS5lbmQuY29sdW1uKyhpPzA6MSldfX0sZD1mdW5jdGlvbihlKXt0aGlzLmFkZCgiYnJhY2VzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbih0LG4scixpLHMpe3ZhciB1PXIuZ2V0Q3Vyc29yUG9zaXRpb24oKSxhPWkuZG9jLmdldExpbmUodS5yb3cpO2lmKHM9PSJ7Iil7aChyKTt2YXIgbD1yLmdldFNlbGVjdGlvblJhbmdlKCksYz1pLmRvYy5nZXRUZXh0UmFuZ2UobCk7aWYoYyE9PSIiJiZjIT09InsiJiZyLmdldFdyYXBCZWhhdmlvdXJzRW5hYmxlZCgpKXJldHVybiBwKGwsYywieyIsIn0iKTtpZihkLmlzU2FuZUluc2VydGlvbihyLGkpKXJldHVybi9bXF1cfVwpXS8udGVzdChhW3UuY29sdW1uXSl8fHIuaW5NdWx0aVNlbGVjdE1vZGV8fGUmJmUuYnJhY2VzPyhkLnJlY29yZEF1dG9JbnNlcnQocixpLCJ9Iikse3RleHQ6Int9IixzZWxlY3Rpb246WzEsMV19KTooZC5yZWNvcmRNYXliZUluc2VydChyLGksInsiKSx7dGV4dDoieyIsc2VsZWN0aW9uOlsxLDFdfSl9ZWxzZSBpZihzPT0ifSIpe2gocik7dmFyIHY9YS5zdWJzdHJpbmcodS5jb2x1bW4sdS5jb2x1bW4rMSk7aWYodj09In0iKXt2YXIgbT1pLiRmaW5kT3BlbmluZ0JyYWNrZXQoIn0iLHtjb2x1bW46dS5jb2x1bW4rMSxyb3c6dS5yb3d9KTtpZihtIT09bnVsbCYmZC5pc0F1dG9JbnNlcnRlZENsb3NpbmcodSxhLHMpKXJldHVybiBkLnBvcEF1dG9JbnNlcnRlZENsb3NpbmcoKSx7dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX1lbHNle2lmKHM9PSJcbiJ8fHM9PSJcclxuIil7aChyKTt2YXIgZz0iIjtkLmlzTWF5YmVJbnNlcnRlZENsb3NpbmcodSxhKSYmKGc9by5zdHJpbmdSZXBlYXQoIn0iLGYubWF5YmVJbnNlcnRlZEJyYWNrZXRzKSxkLmNsZWFyTWF5YmVJbnNlcnRlZENsb3NpbmcoKSk7dmFyIHY9YS5zdWJzdHJpbmcodS5jb2x1bW4sdS5jb2x1bW4rMSk7aWYodj09PSJ9Iil7dmFyIHk9aS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6dS5yb3csY29sdW1uOnUuY29sdW1uKzF9LCJ9Iik7aWYoIXkpcmV0dXJuIG51bGw7dmFyIGI9dGhpcy4kZ2V0SW5kZW50KGkuZ2V0TGluZSh5LnJvdykpfWVsc2V7aWYoIWcpe2QuY2xlYXJNYXliZUluc2VydGVkQ2xvc2luZygpO3JldHVybn12YXIgYj10aGlzLiRnZXRJbmRlbnQoYSl9dmFyIHc9YitpLmdldFRhYlN0cmluZygpO3JldHVybnt0ZXh0OiJcbiIrdysiXG4iK2IrZyxzZWxlY3Rpb246WzEsdy5sZW5ndGgsMSx3Lmxlbmd0aF19fWQuY2xlYXJNYXliZUluc2VydGVkQ2xvc2luZygpfX0pLHRoaXMuYWRkKCJicmFjZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz1yLmRvYy5nZXRUZXh0UmFuZ2UoaSk7aWYoIWkuaXNNdWx0aUxpbmUoKSYmcz09InsiKXtoKG4pO3ZhciBvPXIuZG9jLmdldExpbmUoaS5zdGFydC5yb3cpLHU9by5zdWJzdHJpbmcoaS5lbmQuY29sdW1uLGkuZW5kLmNvbHVtbisxKTtpZih1PT0ifSIpcmV0dXJuIGkuZW5kLmNvbHVtbisrLGk7Zi5tYXliZUluc2VydGVkQnJhY2tldHMtLX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihlLHQsbixyLGkpe2lmKGk9PSIoIil7aChuKTt2YXIgcz1uLmdldFNlbGVjdGlvblJhbmdlKCksbz1yLmRvYy5nZXRUZXh0UmFuZ2Uocyk7aWYobyE9PSIiJiZuLmdldFdyYXBCZWhhdmlvdXJzRW5hYmxlZCgpKXJldHVybiBwKHMsbywiKCIsIikiKTtpZihkLmlzU2FuZUluc2VydGlvbihuLHIpKXJldHVybiBkLnJlY29yZEF1dG9JbnNlcnQobixyLCIpIikse3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWVsc2UgaWYoaT09IikiKXtoKG4pO3ZhciB1PW4uZ2V0Q3Vyc29yUG9zaXRpb24oKSxhPXIuZG9jLmdldExpbmUodS5yb3cpLGY9YS5zdWJzdHJpbmcodS5jb2x1bW4sdS5jb2x1bW4rMSk7aWYoZj09IikiKXt2YXIgbD1yLiRmaW5kT3BlbmluZ0JyYWNrZXQoIikiLHtjb2x1bW46dS5jb2x1bW4rMSxyb3c6dS5yb3d9KTtpZihsIT09bnVsbCYmZC5pc0F1dG9JbnNlcnRlZENsb3NpbmcodSxhLGkpKXJldHVybiBkLnBvcEF1dG9JbnNlcnRlZENsb3NpbmcoKSx7dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgicGFyZW5zIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9ci5kb2MuZ2V0VGV4dFJhbmdlKGkpO2lmKCFpLmlzTXVsdGlMaW5lKCkmJnM9PSIoIil7aChuKTt2YXIgbz1yLmRvYy5nZXRMaW5lKGkuc3RhcnQucm93KSx1PW8uc3Vic3RyaW5nKGkuc3RhcnQuY29sdW1uKzEsaS5zdGFydC5jb2x1bW4rMik7aWYodT09IikiKXJldHVybiBpLmVuZC5jb2x1bW4rKyxpfX0pLHRoaXMuYWRkKCJicmFja2V0cyIsImluc2VydGlvbiIsZnVuY3Rpb24oZSx0LG4scixpKXtpZihpPT0iWyIpe2gobik7dmFyIHM9bi5nZXRTZWxlY3Rpb25SYW5nZSgpLG89ci5kb2MuZ2V0VGV4dFJhbmdlKHMpO2lmKG8hPT0iIiYmbi5nZXRXcmFwQmVoYXZpb3Vyc0VuYWJsZWQoKSlyZXR1cm4gcChzLG8sIlsiLCJdIik7aWYoZC5pc1NhbmVJbnNlcnRpb24obixyKSlyZXR1cm4gZC5yZWNvcmRBdXRvSW5zZXJ0KG4sciwiXSIpLHt0ZXh0OiJbXSIsc2VsZWN0aW9uOlsxLDFdfX1lbHNlIGlmKGk9PSJdIil7aChuKTt2YXIgdT1uLmdldEN1cnNvclBvc2l0aW9uKCksYT1yLmRvYy5nZXRMaW5lKHUucm93KSxmPWEuc3Vic3RyaW5nKHUuY29sdW1uLHUuY29sdW1uKzEpO2lmKGY9PSJdIil7dmFyIGw9ci4kZmluZE9wZW5pbmdCcmFja2V0KCJdIix7Y29sdW1uOnUuY29sdW1uKzEscm93OnUucm93fSk7aWYobCE9PW51bGwmJmQuaXNBdXRvSW5zZXJ0ZWRDbG9zaW5nKHUsYSxpKSlyZXR1cm4gZC5wb3BBdXRvSW5zZXJ0ZWRDbG9zaW5nKCkse3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoImJyYWNrZXRzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9ci5kb2MuZ2V0VGV4dFJhbmdlKGkpO2lmKCFpLmlzTXVsdGlMaW5lKCkmJnM9PSJbIil7aChuKTt2YXIgbz1yLmRvYy5nZXRMaW5lKGkuc3RhcnQucm93KSx1PW8uc3Vic3RyaW5nKGkuc3RhcnQuY29sdW1uKzEsaS5zdGFydC5jb2x1bW4rMik7aWYodT09Il0iKXJldHVybiBpLmVuZC5jb2x1bW4rKyxpfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz1yLiRtb2RlLiRxdW90ZXN8fGM7aWYoaS5sZW5ndGg9PTEmJnNbaV0pe2lmKHRoaXMubGluZUNvbW1lbnRTdGFydCYmdGhpcy5saW5lQ29tbWVudFN0YXJ0LmluZGV4T2YoaSkhPS0xKXJldHVybjtoKG4pO3ZhciBvPWksdT1uLmdldFNlbGVjdGlvblJhbmdlKCksYT1yLmRvYy5nZXRUZXh0UmFuZ2UodSk7aWYoYSE9PSIiJiYoYS5sZW5ndGghPTF8fCFzW2FdKSYmbi5nZXRXcmFwQmVoYXZpb3Vyc0VuYWJsZWQoKSlyZXR1cm4gcCh1LGEsbyxvKTtpZighYSl7dmFyIGY9bi5nZXRDdXJzb3JQb3NpdGlvbigpLGw9ci5kb2MuZ2V0TGluZShmLnJvdyksZD1sLnN1YnN0cmluZyhmLmNvbHVtbi0xLGYuY29sdW1uKSx2PWwuc3Vic3RyaW5nKGYuY29sdW1uLGYuY29sdW1uKzEpLG09ci5nZXRUb2tlbkF0KGYucm93LGYuY29sdW1uKSxnPXIuZ2V0VG9rZW5BdChmLnJvdyxmLmNvbHVtbisxKTtpZihkPT0iXFwiJiZtJiYvZXNjYXBlLy50ZXN0KG0udHlwZSkpcmV0dXJuIG51bGw7dmFyIHk9bSYmL3N0cmluZ3xlc2NhcGUvLnRlc3QobS50eXBlKSxiPSFnfHwvc3RyaW5nfGVzY2FwZS8udGVzdChnLnR5cGUpLHc7aWYodj09byl3PXkhPT1iLHcmJi9zdHJpbmdcLmVuZC8udGVzdChnLnR5cGUpJiYodz0hMSk7ZWxzZXtpZih5JiYhYilyZXR1cm4gbnVsbDtpZih5JiZiKXJldHVybiBudWxsO3ZhciBFPXIuJG1vZGUudG9rZW5SZTtFLmxhc3RJbmRleD0wO3ZhciBTPUUudGVzdChkKTtFLmxhc3RJbmRleD0wO3ZhciB4PUUudGVzdChkKTtpZihTfHx4KXJldHVybiBudWxsO2lmKHYmJiEvW1xzOywufSlcXVxcXS8udGVzdCh2KSlyZXR1cm4gbnVsbDt2YXIgVD1sW2YuY29sdW1uLTJdO2lmKCEoZCE9b3x8VCE9byYmIUUudGVzdChUKSkpcmV0dXJuIG51bGw7dz0hMH1yZXR1cm57dGV4dDp3P28rbzoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz1yLiRtb2RlLiRxdW90ZXN8fGMsbz1yLmRvYy5nZXRUZXh0UmFuZ2UoaSk7aWYoIWkuaXNNdWx0aUxpbmUoKSYmcy5oYXNPd25Qcm9wZXJ0eShvKSl7aChuKTt2YXIgdT1yLmRvYy5nZXRMaW5lKGkuc3RhcnQucm93KSxhPXUuc3Vic3RyaW5nKGkuc3RhcnQuY29sdW1uKzEsaS5zdGFydC5jb2x1bW4rMik7aWYoYT09bylyZXR1cm4gaS5lbmQuY29sdW1uKyssaX19KX07ZC5pc1NhbmVJbnNlcnRpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldEN1cnNvclBvc2l0aW9uKCkscj1uZXcgcyh0LG4ucm93LG4uY29sdW1uKTtpZighdGhpcy4kbWF0Y2hUb2tlblR5cGUoci5nZXRDdXJyZW50VG9rZW4oKXx8InRleHQiLHUpKXtpZigvWyl9XF1dLy50ZXN0KGUuc2Vzc2lvbi5nZXRMaW5lKG4ucm93KVtuLmNvbHVtbl0pKXJldHVybiEwO3ZhciBpPW5ldyBzKHQsbi5yb3csbi5jb2x1bW4rMSk7aWYoIXRoaXMuJG1hdGNoVG9rZW5UeXBlKGkuZ2V0Q3VycmVudFRva2VuKCl8fCJ0ZXh0Iix1KSlyZXR1cm4hMX1yZXR1cm4gci5zdGVwRm9yd2FyZCgpLHIuZ2V0Q3VycmVudFRva2VuUm93KCkhPT1uLnJvd3x8dGhpcy4kbWF0Y2hUb2tlblR5cGUoci5nZXRDdXJyZW50VG9rZW4oKXx8InRleHQiLGEpfSxkLiRtYXRjaFRva2VuVHlwZT1mdW5jdGlvbihlLHQpe3JldHVybiB0LmluZGV4T2YoZS50eXBlfHxlKT4tMX0sZC5yZWNvcmRBdXRvSW5zZXJ0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmdldEN1cnNvclBvc2l0aW9uKCksaT10LmRvYy5nZXRMaW5lKHIucm93KTt0aGlzLmlzQXV0b0luc2VydGVkQ2xvc2luZyhyLGksZi5hdXRvSW5zZXJ0ZWRMaW5lRW5kWzBdKXx8KGYuYXV0b0luc2VydGVkQnJhY2tldHM9MCksZi5hdXRvSW5zZXJ0ZWRSb3c9ci5yb3csZi5hdXRvSW5zZXJ0ZWRMaW5lRW5kPW4raS5zdWJzdHIoci5jb2x1bW4pLGYuYXV0b0luc2VydGVkQnJhY2tldHMrK30sZC5yZWNvcmRNYXliZUluc2VydD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXRDdXJzb3JQb3NpdGlvbigpLGk9dC5kb2MuZ2V0TGluZShyLnJvdyk7dGhpcy5pc01heWJlSW5zZXJ0ZWRDbG9zaW5nKHIsaSl8fChmLm1heWJlSW5zZXJ0ZWRCcmFja2V0cz0wKSxmLm1heWJlSW5zZXJ0ZWRSb3c9ci5yb3csZi5tYXliZUluc2VydGVkTGluZVN0YXJ0PWkuc3Vic3RyKDAsci5jb2x1bW4pK24sZi5tYXliZUluc2VydGVkTGluZUVuZD1pLnN1YnN0cihyLmNvbHVtbiksZi5tYXliZUluc2VydGVkQnJhY2tldHMrK30sZC5pc0F1dG9JbnNlcnRlZENsb3Npbmc9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmLmF1dG9JbnNlcnRlZEJyYWNrZXRzPjAmJmUucm93PT09Zi5hdXRvSW5zZXJ0ZWRSb3cmJm49PT1mLmF1dG9JbnNlcnRlZExpbmVFbmRbMF0mJnQuc3Vic3RyKGUuY29sdW1uKT09PWYuYXV0b0luc2VydGVkTGluZUVuZH0sZC5pc01heWJlSW5zZXJ0ZWRDbG9zaW5nPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGYubWF5YmVJbnNlcnRlZEJyYWNrZXRzPjAmJmUucm93PT09Zi5tYXliZUluc2VydGVkUm93JiZ0LnN1YnN0cihlLmNvbHVtbik9PT1mLm1heWJlSW5zZXJ0ZWRMaW5lRW5kJiZ0LnN1YnN0cigwLGUuY29sdW1uKT09Zi5tYXliZUluc2VydGVkTGluZVN0YXJ0fSxkLnBvcEF1dG9JbnNlcnRlZENsb3Npbmc9ZnVuY3Rpb24oKXtmLmF1dG9JbnNlcnRlZExpbmVFbmQ9Zi5hdXRvSW5zZXJ0ZWRMaW5lRW5kLnN1YnN0cigxKSxmLmF1dG9JbnNlcnRlZEJyYWNrZXRzLS19LGQuY2xlYXJNYXliZUluc2VydGVkQ2xvc2luZz1mdW5jdGlvbigpe2YmJihmLm1heWJlSW5zZXJ0ZWRCcmFja2V0cz0wLGYubWF5YmVJbnNlcnRlZFJvdz0tMSl9LHIuaW5oZXJpdHMoZCxpKSx0LkNzdHlsZUJlaGF2aW91cj1kfSksYWNlLmRlZmluZSgiYWNlL3VuaWNvZGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPVs0OCw5LDgsMjUsNSwwLDIsMjUsNDgsMCwxMSwwLDUsMCw2LDIyLDIsMzAsMiw0NTcsNSwxMSwxNSw0LDgsMCwyLDAsMTgsMTE2LDIsMSwzLDMsOSwwLDIsMiwyLDAsMiwxOSwyLDgyLDIsMTM4LDIsNCwzLDE1NSwxMiwzNywzLDAsOCwzOCwxMCw0NCwyLDAsMiwxLDIsMSwyLDAsOSwyNiw2LDIsMzAsMTAsNyw2MSwyLDksNSwxMDEsMiw3LDMsOSwyLDE4LDMsMCwxNyw1OCwzLDEwMCwxNSw1Myw1LDAsNiw0NSwyMTEsNTcsMywxOCwyLDUsMywxMSwzLDksMiwxLDcsNiwyLDIsMiw3LDMsMSwzLDIxLDIsNiwyLDAsNCwzLDMsOCwzLDEsMywzLDksMCw1LDEsMiw0LDMsMTEsMTYsMiwyLDUsNSwxLDMsMjEsMiw2LDIsMSwyLDEsMiwxLDMsMCwyLDQsNSwxLDMsMiw0LDAsOCwzLDIsMCw4LDE1LDEyLDIsMiw4LDIsMiwyLDIxLDIsNiwyLDEsMiw0LDMsOSwyLDIsMiwyLDMsMCwxNiwzLDMsOSwxOCwyLDIsNywzLDEsMywyMSwyLDYsMiwxLDIsNCwzLDgsMywxLDMsMiw5LDEsNSwxLDIsNCwzLDksMiwwLDE3LDEsMiw1LDQsMiwyLDMsNCwxLDIsMCwyLDEsNCwxLDQsMiw0LDExLDUsNCw0LDIsMiwzLDMsMCw3LDAsMTUsOSwxOCwyLDIsNywyLDIsMiwyMiwyLDksMiw0LDQsNywyLDIsMiwzLDgsMSwyLDEsNywzLDMsOSwxOSwxLDIsNywyLDIsMiwyMiwyLDksMiw0LDMsOCwyLDIsMiwzLDgsMSw4LDAsMiwzLDMsOSwxOSwxLDIsNywyLDIsMiwyMiwyLDE1LDQsNywyLDIsMiwzLDEwLDAsOSwzLDMsOSwxMSw1LDMsMSwyLDE3LDQsMjMsMiw4LDIsMCwzLDYsNCwwLDUsNSwyLDAsMiw3LDE5LDEsMTQsNTcsNiwxNCwyLDksNDAsMSwyLDAsMywxLDIsMCwzLDAsNywzLDIsNiwyLDIsMiwwLDIsMCwzLDEsMiwxMiwyLDIsMyw0LDIsMCwyLDUsMyw5LDMsMSwzNSwwLDI0LDEsNyw5LDEyLDAsMiwwLDIsMCw1LDksMiwzNSw1LDE5LDIsNSw1LDcsMiwzNSwxMCwwLDU4LDczLDcsNzcsMywzNywxMSw0MiwyLDAsNCwzMjgsMiwzLDMsNiwyLDAsMiwzLDMsNDAsMiwzLDMsMzIsMiwzLDMsNiwyLDAsMiwzLDMsMTQsMiw1NiwyLDMsMyw2Niw1LDAsMzMsMTUsMTcsODQsMTMsNjE5LDMsMTYsMiwyNSw2LDc0LDIyLDEyLDIsNiwxMiwyMCwxMiwxOSwxMywxMiwyLDIsMiwxLDEzLDUxLDMsMjksNCwwLDUsMSwzLDksMzQsMiwzLDksNyw4Nyw5LDQyLDYsNjksMTEsMjgsNCwxMSw1LDExLDExLDM5LDMsNCwxMiw0Myw1LDI1LDcsMTAsMzgsMjcsNSw2MiwyLDI4LDMsMTAsNyw5LDE0LDAsODksNzUsNSw5LDE4LDgsMTMsNDIsNCwxMSw3MSw1NSw5LDksNCw0OCw4MywyLDIsMzAsMTQsMjMwLDIzLDI4MCwzLDUsMywzNywzLDUsMyw3LDIsMCwyLDAsMiwwLDIsMzAsMyw1MiwyLDYsMiwwLDQsMiwyLDYsNCwzLDMsNSw1LDEyLDYsMiwyLDYsNjcsMSwyMCwwLDI5LDAsMTQsMCwxNyw0LDYwLDEyLDUsMCw0LDExLDE4LDAsNSwwLDMsOSwyLDAsNCw0LDcsMCwyLDAsMiwwLDIsMywyLDEwLDMsMyw2LDQsNSwwLDUzLDEsMjY4NCw0NiwyLDQ2LDIsMTMyLDcsNiwxNSwzNywxMSw1MywxMCwwLDE3LDIyLDEwLDYsMiw2LDIsNiwyLDYsMiw2LDIsNiwyLDYsMiw2LDIsMzEsNDgsMCw0NzAsMSwzNiw1LDIsNCw2LDEsNSw4NSwzLDEsMywyLDIsODksMiwzLDYsNDAsNCw5MywxOCwyMyw1NywxNSw1MTMsNjU4MSw3NSwyMDkzOSw1MywxMTY0LDY4LDQ1LDMsMjY4LDQsMjcsMjEsMzEsMywxMywxMywxLDIsMjQsOSw2OSwxMSwxLDM4LDgsMywxMDIsMywxLDExMSw0NCwyNSw1MSwxMyw2OCwxMiw5LDcsMjMsNCwwLDUsNDUsMywzNSwxMywyOCw0LDY0LDE1LDEwLDM5LDU0LDEwLDEzLDMsOSw3LDIyLDQsMSw1LDY2LDI1LDIsMjI3LDQyLDIsMSwzLDksNywxMTE3MSwxMywyMiw1LDQ4LDg0NTMsMzAxLDMsNjEsMywxMDUsMzksNiwxMyw0LDYsMTEsMiwxMiwyLDQsMiwwLDIsMSwyLDEsMiwxMDcsMzQsMzYyLDE5LDYzLDMsNTMsNDEsMTEsNSwxNSwxNyw2LDEzLDEsMjUsMiwzMyw0LDIsMTM0LDIwLDksOCwyNSw1LDAsMiwyNSwxMiw4OCw0LDUsMyw1LDMsNSwzLDJdLGk9MCxzPVtdO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bys9MilzLnB1c2goaSs9cltvXSkscltvKzFdJiZzLnB1c2goNDUsaSs9cltvKzFdKTt0LndvcmRDaGFycz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwscyl9KSxhY2UuZGVmaW5lKCJhY2UvbW9kZS90ZXh0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2NvbmZpZyIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvdW5pY29kZSIsImFjZS9saWIvbGFuZyIsImFjZS90b2tlbl9pdGVyYXRvciIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vY29uZmlnIiksaT1lKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIscz1lKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLG89ZSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLHU9ZSgiLi4vdW5pY29kZSIpLGE9ZSgiLi4vbGliL2xhbmciKSxmPWUoIi4uL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcixsPWUoIi4uL3JhbmdlIikuUmFuZ2UsYz1mdW5jdGlvbigpe3RoaXMuSGlnaGxpZ2h0UnVsZXM9c307KGZ1bmN0aW9uKCl7dGhpcy4kZGVmYXVsdEJlaGF2aW91cj1uZXcgbyx0aGlzLnRva2VuUmU9bmV3IFJlZ0V4cCgiXlsiK3Uud29yZENoYXJzKyJcXCRfXSsiLCJnIiksdGhpcy5ub25Ub2tlblJlPW5ldyBSZWdFeHAoIl4oPzpbXiIrdS53b3JkQ2hhcnMrIlxcJF9dfFxcc10pKyIsImciKSx0aGlzLmdldFRva2VuaXplcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR0b2tlbml6ZXJ8fCh0aGlzLiRoaWdobGlnaHRSdWxlcz10aGlzLiRoaWdobGlnaHRSdWxlc3x8bmV3IHRoaXMuSGlnaGxpZ2h0UnVsZXModGhpcy4kaGlnaGxpZ2h0UnVsZUNvbmZpZyksdGhpcy4kdG9rZW5pemVyPW5ldyBpKHRoaXMuJGhpZ2hsaWdodFJ1bGVzLmdldFJ1bGVzKCkpKSx0aGlzLiR0b2tlbml6ZXJ9LHRoaXMubGluZUNvbW1lbnRTdGFydD0iIix0aGlzLmJsb2NrQ29tbWVudD0iIix0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbihlLHQsbixyKXtmdW5jdGlvbiB3KGUpe2Zvcih2YXIgdD1uO3Q8PXI7dCsrKWUoaS5nZXRMaW5lKHQpLHQpfXZhciBpPXQuZG9jLHM9ITAsbz0hMCx1PUluZmluaXR5LGY9dC5nZXRUYWJTaXplKCksbD0hMTtpZighdGhpcy5saW5lQ29tbWVudFN0YXJ0KXtpZighdGhpcy5ibG9ja0NvbW1lbnQpcmV0dXJuITE7dmFyIGM9dGhpcy5ibG9ja0NvbW1lbnQuc3RhcnQsaD10aGlzLmJsb2NrQ29tbWVudC5lbmQscD1uZXcgUmVnRXhwKCJeKFxccyopKD86IithLmVzY2FwZVJlZ0V4cChjKSsiKSIpLGQ9bmV3IFJlZ0V4cCgiKD86IithLmVzY2FwZVJlZ0V4cChoKSsiKVxccyokIiksdj1mdW5jdGlvbihlLHQpe2lmKGcoZSx0KSlyZXR1cm47aWYoIXN8fC9cUy8udGVzdChlKSlpLmluc2VydEluTGluZSh7cm93OnQsY29sdW1uOmUubGVuZ3RofSxoKSxpLmluc2VydEluTGluZSh7cm93OnQsY29sdW1uOnV9LGMpfSxtPWZ1bmN0aW9uKGUsdCl7dmFyIG47KG49ZS5tYXRjaChkKSkmJmkucmVtb3ZlSW5MaW5lKHQsZS5sZW5ndGgtblswXS5sZW5ndGgsZS5sZW5ndGgpLChuPWUubWF0Y2gocCkpJiZpLnJlbW92ZUluTGluZSh0LG5bMV0ubGVuZ3RoLG5bMF0ubGVuZ3RoKX0sZz1mdW5jdGlvbihlLG4pe2lmKHAudGVzdChlKSlyZXR1cm4hMDt2YXIgcj10LmdldFRva2VucyhuKTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKylpZihyW2ldLnR5cGU9PT0iY29tbWVudCIpcmV0dXJuITB9fWVsc2V7aWYoQXJyYXkuaXNBcnJheSh0aGlzLmxpbmVDb21tZW50U3RhcnQpKXZhciBwPXRoaXMubGluZUNvbW1lbnRTdGFydC5tYXAoYS5lc2NhcGVSZWdFeHApLmpvaW4oInwiKSxjPXRoaXMubGluZUNvbW1lbnRTdGFydFswXTtlbHNlIHZhciBwPWEuZXNjYXBlUmVnRXhwKHRoaXMubGluZUNvbW1lbnRTdGFydCksYz10aGlzLmxpbmVDb21tZW50U3RhcnQ7cD1uZXcgUmVnRXhwKCJeKFxccyopKD86IitwKyIpID8iKSxsPXQuZ2V0VXNlU29mdFRhYnMoKTt2YXIgbT1mdW5jdGlvbihlLHQpe3ZhciBuPWUubWF0Y2gocCk7aWYoIW4pcmV0dXJuO3ZhciByPW5bMV0ubGVuZ3RoLHM9blswXS5sZW5ndGg7IWIoZSxyLHMpJiZuWzBdW3MtMV09PSIgIiYmcy0tLGkucmVtb3ZlSW5MaW5lKHQscixzKX0seT1jKyIgIix2PWZ1bmN0aW9uKGUsdCl7aWYoIXN8fC9cUy8udGVzdChlKSliKGUsdSx1KT9pLmluc2VydEluTGluZSh7cm93OnQsY29sdW1uOnV9LHkpOmkuaW5zZXJ0SW5MaW5lKHtyb3c6dCxjb2x1bW46dX0sYyl9LGc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcC50ZXN0KGUpfSxiPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0wO3doaWxlKHQtLSYmZS5jaGFyQXQodCk9PSIgIilyKys7aWYociVmIT0wKXJldHVybiExO3ZhciByPTA7d2hpbGUoZS5jaGFyQXQobisrKT09IiAiKXIrKztyZXR1cm4gZj4yP3IlZiE9Zi0xOnIlZj09MH19dmFyIEU9SW5maW5pdHk7dyhmdW5jdGlvbihlLHQpe3ZhciBuPWUuc2VhcmNoKC9cUy8pO24hPT0tMT8objx1JiYodT1uKSxvJiYhZyhlLHQpJiYobz0hMSkpOkU+ZS5sZW5ndGgmJihFPWUubGVuZ3RoKX0pLHU9PUluZmluaXR5JiYodT1FLHM9ITEsbz0hMSksbCYmdSVmIT0wJiYodT1NYXRoLmZsb29yKHUvZikqZiksdyhvP206dil9LHRoaXMudG9nZ2xlQmxvY2tDb21tZW50PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuYmxvY2tDb21tZW50O2lmKCFpKXJldHVybjshaS5zdGFydCYmaVswXSYmKGk9aVswXSk7dmFyIHM9bmV3IGYodCxyLnJvdyxyLmNvbHVtbiksbz1zLmdldEN1cnJlbnRUb2tlbigpLHU9dC5zZWxlY3Rpb24sYT10LnNlbGVjdGlvbi50b09yaWVudGVkUmFuZ2UoKSxjLGg7aWYobyYmL2NvbW1lbnQvLnRlc3Qoby50eXBlKSl7dmFyIHAsZDt3aGlsZShvJiYvY29tbWVudC8udGVzdChvLnR5cGUpKXt2YXIgdj1vLnZhbHVlLmluZGV4T2YoaS5zdGFydCk7aWYodiE9LTEpe3ZhciBtPXMuZ2V0Q3VycmVudFRva2VuUm93KCksZz1zLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK3Y7cD1uZXcgbChtLGcsbSxnK2kuc3RhcnQubGVuZ3RoKTticmVha31vPXMuc3RlcEJhY2t3YXJkKCl9dmFyIHM9bmV3IGYodCxyLnJvdyxyLmNvbHVtbiksbz1zLmdldEN1cnJlbnRUb2tlbigpO3doaWxlKG8mJi9jb21tZW50Ly50ZXN0KG8udHlwZSkpe3ZhciB2PW8udmFsdWUuaW5kZXhPZihpLmVuZCk7aWYodiE9LTEpe3ZhciBtPXMuZ2V0Q3VycmVudFRva2VuUm93KCksZz1zLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK3Y7ZD1uZXcgbChtLGcsbSxnK2kuZW5kLmxlbmd0aCk7YnJlYWt9bz1zLnN0ZXBGb3J3YXJkKCl9ZCYmdC5yZW1vdmUoZCkscCYmKHQucmVtb3ZlKHApLGM9cC5zdGFydC5yb3csaD0taS5zdGFydC5sZW5ndGgpfWVsc2UgaD1pLnN0YXJ0Lmxlbmd0aCxjPW4uc3RhcnQucm93LHQuaW5zZXJ0KG4uZW5kLGkuZW5kKSx0Lmluc2VydChuLnN0YXJ0LGkuc3RhcnQpO2Euc3RhcnQucm93PT1jJiYoYS5zdGFydC5jb2x1bW4rPWgpLGEuZW5kLnJvdz09YyYmKGEuZW5kLmNvbHVtbis9aCksdC5zZWxlY3Rpb24uZnJvbU9yaWVudGVkUmFuZ2UoYSl9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLiRnZXRJbmRlbnQodCl9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4hMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihlLHQsbil7fSx0aGlzLiRnZXRJbmRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF0Y2goL15ccyovKVswXX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGx9LHRoaXMuY3JlYXRlTW9kZURlbGVnYXRlcz1mdW5jdGlvbihlKXt0aGlzLiRlbWJlZHM9W10sdGhpcy4kbW9kZXM9e307Zm9yKHZhciB0IGluIGUpaWYoZVt0XSl7dmFyIG49ZVt0XSxpPW4ucHJvdG90eXBlLiRpZCxzPXIuJG1vZGVzW2ldO3N8fChyLiRtb2Rlc1tpXT1zPW5ldyBuKSxyLiRtb2Rlc1t0XXx8KHIuJG1vZGVzW3RdPXMpLHRoaXMuJGVtYmVkcy5wdXNoKHQpLHRoaXMuJG1vZGVzW3RdPXN9dmFyIG89WyJ0b2dnbGVCbG9ja0NvbW1lbnQiLCJ0b2dnbGVDb21tZW50TGluZXMiLCJnZXROZXh0TGluZUluZGVudCIsImNoZWNrT3V0ZGVudCIsImF1dG9PdXRkZW50IiwidHJhbnNmb3JtQWN0aW9uIiwiZ2V0Q29tcGxldGlvbnMiXTtmb3IodmFyIHQ9MDt0PG8ubGVuZ3RoO3QrKykoZnVuY3Rpb24oZSl7dmFyIG49b1t0XSxyPWVbbl07ZVtvW3RdXT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkZWxlZ2F0b3Iobixhcmd1bWVudHMscil9fSkodGhpcyl9LHRoaXMuJGRlbGVnYXRvcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dFswXXx8InN0YXJ0IjtpZih0eXBlb2YgciE9InN0cmluZyIpe2lmKEFycmF5LmlzQXJyYXkoclsyXSkpe3ZhciBpPXJbMl1bclsyXS5sZW5ndGgtMV0scz10aGlzLiRtb2Rlc1tpXTtpZihzKXJldHVybiBzW2VdLmFwcGx5KHMsW3JbMV1dLmNvbmNhdChbXS5zbGljZS5jYWxsKHQsMSkpKX1yPXJbMF18fCJzdGFydCJ9Zm9yKHZhciBvPTA7bzx0aGlzLiRlbWJlZHMubGVuZ3RoO28rKyl7aWYoIXRoaXMuJG1vZGVzW3RoaXMuJGVtYmVkc1tvXV0pY29udGludWU7dmFyIHU9ci5zcGxpdCh0aGlzLiRlbWJlZHNbb10pO2lmKCF1WzBdJiZ1WzFdKXt0WzBdPXVbMV07dmFyIHM9dGhpcy4kbW9kZXNbdGhpcy4kZW1iZWRzW29dXTtyZXR1cm4gc1tlXS5hcHBseShzLHQpfX12YXIgYT1uLmFwcGx5KHRoaXMsdCk7cmV0dXJuIG4/YTp1bmRlZmluZWR9LHRoaXMudHJhbnNmb3JtQWN0aW9uPWZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYodGhpcy4kYmVoYXZpb3VyKXt2YXIgcz10aGlzLiRiZWhhdmlvdXIuZ2V0QmVoYXZpb3VycygpO2Zvcih2YXIgbyBpbiBzKWlmKHNbb11bdF0pe3ZhciB1PXNbb11bdF0uYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKHUpcmV0dXJuIHV9fX0sdGhpcy5nZXRLZXl3b3Jkcz1mdW5jdGlvbihlKXtpZighdGhpcy5jb21wbGV0aW9uS2V5d29yZHMpe3ZhciB0PXRoaXMuJHRva2VuaXplci5ydWxlcyxuPVtdO2Zvcih2YXIgciBpbiB0KXt2YXIgaT10W3JdO2Zvcih2YXIgcz0wLG89aS5sZW5ndGg7czxvO3MrKylpZih0eXBlb2YgaVtzXS50b2tlbj09InN0cmluZyIpL2tleXdvcmR8c3VwcG9ydHxzdG9yYWdlLy50ZXN0KGlbc10udG9rZW4pJiZuLnB1c2goaVtzXS5yZWdleCk7ZWxzZSBpZih0eXBlb2YgaVtzXS50b2tlbj09Im9iamVjdCIpZm9yKHZhciB1PTAsYT1pW3NdLnRva2VuLmxlbmd0aDt1PGE7dSsrKWlmKC9rZXl3b3JkfHN1cHBvcnR8c3RvcmFnZS8udGVzdChpW3NdLnRva2VuW3VdKSl7dmFyIHI9aVtzXS5yZWdleC5tYXRjaCgvXCguKz9cKS9nKVt1XTtuLnB1c2goci5zdWJzdHIoMSxyLmxlbmd0aC0yKSl9fXRoaXMuY29tcGxldGlvbktleXdvcmRzPW59cmV0dXJuIGU/bi5jb25jYXQodGhpcy4ka2V5d29yZExpc3R8fFtdKTp0aGlzLiRrZXl3b3JkTGlzdH0sdGhpcy4kY3JlYXRlS2V5d29yZExpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaGlnaGxpZ2h0UnVsZXN8fHRoaXMuZ2V0VG9rZW5pemVyKCksdGhpcy4ka2V5d29yZExpc3Q9dGhpcy4kaGlnaGxpZ2h0UnVsZXMuJGtleXdvcmRMaXN0fHxbXX0sdGhpcy5nZXRDb21wbGV0aW9ucz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLiRrZXl3b3JkTGlzdHx8dGhpcy4kY3JlYXRlS2V5d29yZExpc3QoKTtyZXR1cm4gaS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6ZSx2YWx1ZTplLHNjb3JlOjAsbWV0YToia2V5d29yZCJ9fSl9LHRoaXMuJGlkPSJhY2UvbW9kZS90ZXh0In0pLmNhbGwoYy5wcm90b3R5cGUpLHQuTW9kZT1jfSksYWNlLmRlZmluZSgiYWNlL2FwcGx5X2RlbHRhIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7dGhyb3cgY29uc29sZS5sb2coIkludmFsaWQgRGVsdGE6IixlKSwiSW52YWxpZCBEZWx0YTogIit0fWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gdC5yb3c+PTAmJnQucm93PGUubGVuZ3RoJiZ0LmNvbHVtbj49MCYmdC5jb2x1bW48PWVbdC5yb3ddLmxlbmd0aH1mdW5jdGlvbiBzKGUsdCl7dC5hY3Rpb24hPSJpbnNlcnQiJiZ0LmFjdGlvbiE9InJlbW92ZSImJnIodCwiZGVsdGEuYWN0aW9uIG11c3QgYmUgJ2luc2VydCcgb3IgJ3JlbW92ZSciKSx0LmxpbmVzIGluc3RhbmNlb2YgQXJyYXl8fHIodCwiZGVsdGEubGluZXMgbXVzdCBiZSBhbiBBcnJheSIpLCghdC5zdGFydHx8IXQuZW5kKSYmcih0LCJkZWx0YS5zdGFydC9lbmQgbXVzdCBiZSBhbiBwcmVzZW50Iik7dmFyIG49dC5zdGFydDtpKGUsdC5zdGFydCl8fHIodCwiZGVsdGEuc3RhcnQgbXVzdCBiZSBjb250YWluZWQgaW4gZG9jdW1lbnQiKTt2YXIgcz10LmVuZDt0LmFjdGlvbj09InJlbW92ZSImJiFpKGUscykmJnIodCwiZGVsdGEuZW5kIG11c3QgY29udGFpbmVkIGluIGRvY3VtZW50IGZvciAncmVtb3ZlJyBhY3Rpb25zIik7dmFyIG89cy5yb3ctbi5yb3csdT1zLmNvbHVtbi0obz09MD9uLmNvbHVtbjowKTsobyE9dC5saW5lcy5sZW5ndGgtMXx8dC5saW5lc1tvXS5sZW5ndGghPXUpJiZyKHQsImRlbHRhLnJhbmdlIG11c3QgbWF0Y2ggZGVsdGEgbGluZXMiKX10LmFwcGx5RGVsdGE9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQuc3RhcnQucm93LGk9dC5zdGFydC5jb2x1bW4scz1lW3JdfHwiIjtzd2l0Y2godC5hY3Rpb24pe2Nhc2UiaW5zZXJ0Ijp2YXIgbz10LmxpbmVzO2lmKG8ubGVuZ3RoPT09MSllW3JdPXMuc3Vic3RyaW5nKDAsaSkrdC5saW5lc1swXStzLnN1YnN0cmluZyhpKTtlbHNle3ZhciB1PVtyLDFdLmNvbmNhdCh0LmxpbmVzKTtlLnNwbGljZS5hcHBseShlLHUpLGVbcl09cy5zdWJzdHJpbmcoMCxpKStlW3JdLGVbcit0LmxpbmVzLmxlbmd0aC0xXSs9cy5zdWJzdHJpbmcoaSl9YnJlYWs7Y2FzZSJyZW1vdmUiOnZhciBhPXQuZW5kLmNvbHVtbixmPXQuZW5kLnJvdztyPT09Zj9lW3JdPXMuc3Vic3RyaW5nKDAsaSkrcy5zdWJzdHJpbmcoYSk6ZS5zcGxpY2UocixmLXIrMSxzLnN1YnN0cmluZygwLGkpK2VbZl0uc3Vic3RyaW5nKGEpKX19fSksYWNlLmRlZmluZSgiYWNlL2FuY2hvciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIscz10LkFuY2hvcj1mdW5jdGlvbihlLHQsbil7dGhpcy4kb25DaGFuZ2U9dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpLHRoaXMuYXR0YWNoKGUpLHR5cGVvZiBuPT0idW5kZWZpbmVkIj90aGlzLnNldFBvc2l0aW9uKHQucm93LHQuY29sdW1uKTp0aGlzLnNldFBvc2l0aW9uKHQsbil9OyhmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LG4pe3ZhciByPW4/ZS5jb2x1bW48PXQuY29sdW1uOmUuY29sdW1uPHQuY29sdW1uO3JldHVybiBlLnJvdzx0LnJvd3x8ZS5yb3c9PXQucm93JiZyfWZ1bmN0aW9uIHQodCxuLHIpe3ZhciBpPXQuYWN0aW9uPT0iaW5zZXJ0IixzPShpPzE6LTEpKih0LmVuZC5yb3ctdC5zdGFydC5yb3cpLG89KGk/MTotMSkqKHQuZW5kLmNvbHVtbi10LnN0YXJ0LmNvbHVtbiksdT10LnN0YXJ0LGE9aT91OnQuZW5kO3JldHVybiBlKG4sdSxyKT97cm93Om4ucm93LGNvbHVtbjpuLmNvbHVtbn06ZShhLG4sIXIpP3tyb3c6bi5yb3crcyxjb2x1bW46bi5jb2x1bW4rKG4ucm93PT1hLnJvdz9vOjApfTp7cm93OnUucm93LGNvbHVtbjp1LmNvbHVtbn19ci5pbXBsZW1lbnQodGhpcyxpKSx0aGlzLmdldFBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQodGhpcy5yb3csdGhpcy5jb2x1bW4pfSx0aGlzLmdldERvY3VtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jdW1lbnR9LHRoaXMuJGluc2VydFJpZ2h0PSExLHRoaXMub25DaGFuZ2U9ZnVuY3Rpb24oZSl7aWYoZS5zdGFydC5yb3c9PWUuZW5kLnJvdyYmZS5zdGFydC5yb3chPXRoaXMucm93KXJldHVybjtpZihlLnN0YXJ0LnJvdz50aGlzLnJvdylyZXR1cm47dmFyIG49dChlLHtyb3c6dGhpcy5yb3csY29sdW1uOnRoaXMuY29sdW1ufSx0aGlzLiRpbnNlcnRSaWdodCk7dGhpcy5zZXRQb3NpdGlvbihuLnJvdyxuLmNvbHVtbiwhMCl9LHRoaXMuc2V0UG9zaXRpb249ZnVuY3Rpb24oZSx0LG4pe3ZhciByO24/cj17cm93OmUsY29sdW1uOnR9OnI9dGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChlLHQpO2lmKHRoaXMucm93PT1yLnJvdyYmdGhpcy5jb2x1bW49PXIuY29sdW1uKXJldHVybjt2YXIgaT17cm93OnRoaXMucm93LGNvbHVtbjp0aGlzLmNvbHVtbn07dGhpcy5yb3c9ci5yb3csdGhpcy5jb2x1bW49ci5jb2x1bW4sdGhpcy5fc2lnbmFsKCJjaGFuZ2UiLHtvbGQ6aSx2YWx1ZTpyfSl9LHRoaXMuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHRoaXMuJG9uQ2hhbmdlKX0sdGhpcy5hdHRhY2g9ZnVuY3Rpb24oZSl7dGhpcy5kb2N1bWVudD1lfHx0aGlzLmRvY3VtZW50LHRoaXMuZG9jdW1lbnQub24oImNoYW5nZSIsdGhpcy4kb25DaGFuZ2UpfSx0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49e307cmV0dXJuIGU+PXRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCk/KG4ucm93PU1hdGgubWF4KDAsdGhpcy5kb2N1bWVudC5nZXRMZW5ndGgoKS0xKSxuLmNvbHVtbj10aGlzLmRvY3VtZW50LmdldExpbmUobi5yb3cpLmxlbmd0aCk6ZTwwPyhuLnJvdz0wLG4uY29sdW1uPTApOihuLnJvdz1lLG4uY29sdW1uPU1hdGgubWluKHRoaXMuZG9jdW1lbnQuZ2V0TGluZShuLnJvdykubGVuZ3RoLE1hdGgubWF4KDAsdCkpKSx0PDAmJihuLmNvbHVtbj0wKSxufX0pLmNhbGwocy5wcm90b3R5cGUpfSksYWNlLmRlZmluZSgiYWNlL2RvY3VtZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvYXBwbHlfZGVsdGEiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvcmFuZ2UiLCJhY2UvYW5jaG9yIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vYXBwbHlfZGVsdGEiKS5hcHBseURlbHRhLHM9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixvPWUoIi4vcmFuZ2UiKS5SYW5nZSx1PWUoIi4vYW5jaG9yIikuQW5jaG9yLGE9ZnVuY3Rpb24oZSl7dGhpcy4kbGluZXM9WyIiXSxlLmxlbmd0aD09PTA/dGhpcy4kbGluZXM9WyIiXTpBcnJheS5pc0FycmF5KGUpP3RoaXMuaW5zZXJ0TWVyZ2VkTGluZXMoe3JvdzowLGNvbHVtbjowfSxlKTp0aGlzLmluc2VydCh7cm93OjAsY29sdW1uOjB9LGUpfTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLHMpLHRoaXMuc2V0VmFsdWU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRMZW5ndGgoKS0xO3RoaXMucmVtb3ZlKG5ldyBvKDAsMCx0LHRoaXMuZ2V0TGluZSh0KS5sZW5ndGgpKSx0aGlzLmluc2VydCh7cm93OjAsY29sdW1uOjB9LGUpfSx0aGlzLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QWxsTGluZXMoKS5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKX0sdGhpcy5jcmVhdGVBbmNob3I9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IHUodGhpcyxlLHQpfSwiYWFhIi5zcGxpdCgvYS8pLmxlbmd0aD09PTA/dGhpcy4kc3BsaXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvXHJcbnxcci9nLCJcbiIpLnNwbGl0KCJcbiIpfTp0aGlzLiRzcGxpdD1mdW5jdGlvbihlKXtyZXR1cm4gZS5zcGxpdCgvXHJcbnxccnxcbi8pfSx0aGlzLiRkZXRlY3ROZXdMaW5lPWZ1bmN0aW9uKGUpe3ZhciB0PWUubWF0Y2goL14uKj8oXHJcbnxccnxcbikvbSk7dGhpcy4kYXV0b05ld0xpbmU9dD90WzFdOiJcbiIsdGhpcy5fc2lnbmFsKCJjaGFuZ2VOZXdMaW5lTW9kZSIpfSx0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXI9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy4kbmV3TGluZU1vZGUpe2Nhc2Uid2luZG93cyI6cmV0dXJuIlxyXG4iO2Nhc2UidW5peCI6cmV0dXJuIlxuIjtkZWZhdWx0OnJldHVybiB0aGlzLiRhdXRvTmV3TGluZXx8IlxuIn19LHRoaXMuJGF1dG9OZXdMaW5lPSIiLHRoaXMuJG5ld0xpbmVNb2RlPSJhdXRvIix0aGlzLnNldE5ld0xpbmVNb2RlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJG5ld0xpbmVNb2RlPT09ZSlyZXR1cm47dGhpcy4kbmV3TGluZU1vZGU9ZSx0aGlzLl9zaWduYWwoImNoYW5nZU5ld0xpbmVNb2RlIil9LHRoaXMuZ2V0TmV3TGluZU1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbmV3TGluZU1vZGV9LHRoaXMuaXNOZXdMaW5lPWZ1bmN0aW9uKGUpe3JldHVybiBlPT0iXHJcbiJ8fGU9PSJcciJ8fGU9PSJcbiJ9LHRoaXMuZ2V0TGluZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kbGluZXNbZV18fCIifSx0aGlzLmdldExpbmVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuJGxpbmVzLnNsaWNlKGUsdCsxKX0sdGhpcy5nZXRBbGxMaW5lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldExpbmVzKDAsdGhpcy5nZXRMZW5ndGgoKSl9LHRoaXMuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGxpbmVzLmxlbmd0aH0sdGhpcy5nZXRUZXh0UmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0TGluZXNGb3JSYW5nZShlKS5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKX0sdGhpcy5nZXRMaW5lc0ZvclJhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKGUuc3RhcnQucm93PT09ZS5lbmQucm93KXQ9W3RoaXMuZ2V0TGluZShlLnN0YXJ0LnJvdykuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uLGUuZW5kLmNvbHVtbildO2Vsc2V7dD10aGlzLmdldExpbmVzKGUuc3RhcnQucm93LGUuZW5kLnJvdyksdFswXT0odFswXXx8IiIpLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbik7dmFyIG49dC5sZW5ndGgtMTtlLmVuZC5yb3ctZS5zdGFydC5yb3c9PW4mJih0W25dPXRbbl0uc3Vic3RyaW5nKDAsZS5lbmQuY29sdW1uKSl9cmV0dXJuIHR9LHRoaXMuaW5zZXJ0TGluZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gY29uc29sZS53YXJuKCJVc2Ugb2YgZG9jdW1lbnQuaW5zZXJ0TGluZXMgaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSBpbnNlcnRGdWxsTGluZXMgbWV0aG9kIGluc3RlYWQuIiksdGhpcy5pbnNlcnRGdWxsTGluZXMoZSx0KX0sdGhpcy5yZW1vdmVMaW5lcz1mdW5jdGlvbihlLHQpe3JldHVybiBjb25zb2xlLndhcm4oIlVzZSBvZiBkb2N1bWVudC5yZW1vdmVMaW5lcyBpcyBkZXByZWNhdGVkLiBVc2UgdGhlIHJlbW92ZUZ1bGxMaW5lcyBtZXRob2QgaW5zdGVhZC4iKSx0aGlzLnJlbW92ZUZ1bGxMaW5lcyhlLHQpfSx0aGlzLmluc2VydE5ld0xpbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVXNlIG9mIGRvY3VtZW50Lmluc2VydE5ld0xpbmUgaXMgZGVwcmVjYXRlZC4gVXNlIGluc2VydE1lcmdlZExpbmVzKHBvc2l0aW9uLCBbJycsICcnXSkgaW5zdGVhZC4iKSx0aGlzLmluc2VydE1lcmdlZExpbmVzKGUsWyIiLCIiXSl9LHRoaXMuaW5zZXJ0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZ2V0TGVuZ3RoKCk8PTEmJnRoaXMuJGRldGVjdE5ld0xpbmUodCksdGhpcy5pbnNlcnRNZXJnZWRMaW5lcyhlLHRoaXMuJHNwbGl0KHQpKX0sdGhpcy5pbnNlcnRJbkxpbmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNsaXBwZWRQb3MoZS5yb3csZS5jb2x1bW4pLHI9dGhpcy5wb3MoZS5yb3csZS5jb2x1bW4rdC5sZW5ndGgpO3JldHVybiB0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0Om4sZW5kOnIsYWN0aW9uOiJpbnNlcnQiLGxpbmVzOlt0XX0sITApLHRoaXMuY2xvbmVQb3Mocil9LHRoaXMuY2xpcHBlZFBvcz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0TGVuZ3RoKCk7ZT09PXVuZGVmaW5lZD9lPW46ZTwwP2U9MDplPj1uJiYoZT1uLTEsdD11bmRlZmluZWQpO3ZhciByPXRoaXMuZ2V0TGluZShlKTtyZXR1cm4gdD09dW5kZWZpbmVkJiYodD1yLmxlbmd0aCksdD1NYXRoLm1pbihNYXRoLm1heCh0LDApLHIubGVuZ3RoKSx7cm93OmUsY29sdW1uOnR9fSx0aGlzLmNsb25lUG9zPWZ1bmN0aW9uKGUpe3JldHVybntyb3c6ZS5yb3csY29sdW1uOmUuY29sdW1ufX0sdGhpcy5wb3M9ZnVuY3Rpb24oZSx0KXtyZXR1cm57cm93OmUsY29sdW1uOnR9fSx0aGlzLiRjbGlwUG9zaXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRMZW5ndGgoKTtyZXR1cm4gZS5yb3c+PXQ/KGUucm93PU1hdGgubWF4KDAsdC0xKSxlLmNvbHVtbj10aGlzLmdldExpbmUodC0xKS5sZW5ndGgpOihlLnJvdz1NYXRoLm1heCgwLGUucm93KSxlLmNvbHVtbj1NYXRoLm1pbihNYXRoLm1heChlLmNvbHVtbiwwKSx0aGlzLmdldExpbmUoZS5yb3cpLmxlbmd0aCkpLGV9LHRoaXMuaW5zZXJ0RnVsbExpbmVzPWZ1bmN0aW9uKGUsdCl7ZT1NYXRoLm1pbihNYXRoLm1heChlLDApLHRoaXMuZ2V0TGVuZ3RoKCkpO3ZhciBuPTA7ZTx0aGlzLmdldExlbmd0aCgpPyh0PXQuY29uY2F0KFsiIl0pLG49MCk6KHQ9WyIiXS5jb25jYXQodCksZS0tLG49dGhpcy4kbGluZXNbZV0ubGVuZ3RoKSx0aGlzLmluc2VydE1lcmdlZExpbmVzKHtyb3c6ZSxjb2x1bW46bn0sdCl9LHRoaXMuaW5zZXJ0TWVyZ2VkTGluZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNsaXBwZWRQb3MoZS5yb3csZS5jb2x1bW4pLHI9e3JvdzpuLnJvdyt0Lmxlbmd0aC0xLGNvbHVtbjoodC5sZW5ndGg9PTE/bi5jb2x1bW46MCkrdFt0Lmxlbmd0aC0xXS5sZW5ndGh9O3JldHVybiB0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0Om4sZW5kOnIsYWN0aW9uOiJpbnNlcnQiLGxpbmVzOnR9KSx0aGlzLmNsb25lUG9zKHIpfSx0aGlzLnJlbW92ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNsaXBwZWRQb3MoZS5zdGFydC5yb3csZS5zdGFydC5jb2x1bW4pLG49dGhpcy5jbGlwcGVkUG9zKGUuZW5kLnJvdyxlLmVuZC5jb2x1bW4pO3JldHVybiB0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0OnQsZW5kOm4sYWN0aW9uOiJyZW1vdmUiLGxpbmVzOnRoaXMuZ2V0TGluZXNGb3JSYW5nZSh7c3RhcnQ6dCxlbmQ6bn0pfSksdGhpcy5jbG9uZVBvcyh0KX0sdGhpcy5yZW1vdmVJbkxpbmU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuY2xpcHBlZFBvcyhlLHQpLGk9dGhpcy5jbGlwcGVkUG9zKGUsbik7cmV0dXJuIHRoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6cixlbmQ6aSxhY3Rpb246InJlbW92ZSIsbGluZXM6dGhpcy5nZXRMaW5lc0ZvclJhbmdlKHtzdGFydDpyLGVuZDppfSl9LCEwKSx0aGlzLmNsb25lUG9zKHIpfSx0aGlzLnJlbW92ZUZ1bGxMaW5lcz1mdW5jdGlvbihlLHQpe2U9TWF0aC5taW4oTWF0aC5tYXgoMCxlKSx0aGlzLmdldExlbmd0aCgpLTEpLHQ9TWF0aC5taW4oTWF0aC5tYXgoMCx0KSx0aGlzLmdldExlbmd0aCgpLTEpO3ZhciBuPXQ9PXRoaXMuZ2V0TGVuZ3RoKCktMSYmZT4wLHI9dDx0aGlzLmdldExlbmd0aCgpLTEsaT1uP2UtMTplLHM9bj90aGlzLmdldExpbmUoaSkubGVuZ3RoOjAsdT1yP3QrMTp0LGE9cj8wOnRoaXMuZ2V0TGluZSh1KS5sZW5ndGgsZj1uZXcgbyhpLHMsdSxhKSxsPXRoaXMuJGxpbmVzLnNsaWNlKGUsdCsxKTtyZXR1cm4gdGhpcy5hcHBseURlbHRhKHtzdGFydDpmLnN0YXJ0LGVuZDpmLmVuZCxhY3Rpb246InJlbW92ZSIsbGluZXM6dGhpcy5nZXRMaW5lc0ZvclJhbmdlKGYpfSksbH0sdGhpcy5yZW1vdmVOZXdMaW5lPWZ1bmN0aW9uKGUpe2U8dGhpcy5nZXRMZW5ndGgoKS0xJiZlPj0wJiZ0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0OnRoaXMucG9zKGUsdGhpcy5nZXRMaW5lKGUpLmxlbmd0aCksZW5kOnRoaXMucG9zKGUrMSwwKSxhY3Rpb246InJlbW92ZSIsbGluZXM6WyIiLCIiXX0pfSx0aGlzLnJlcGxhY2U9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2Ygb3x8KGU9by5mcm9tUG9pbnRzKGUuc3RhcnQsZS5lbmQpKTtpZih0Lmxlbmd0aD09PTAmJmUuaXNFbXB0eSgpKXJldHVybiBlLnN0YXJ0O2lmKHQ9PXRoaXMuZ2V0VGV4dFJhbmdlKGUpKXJldHVybiBlLmVuZDt0aGlzLnJlbW92ZShlKTt2YXIgbjtyZXR1cm4gdD9uPXRoaXMuaW5zZXJ0KGUuc3RhcnQsdCk6bj1lLnN0YXJ0LG59LHRoaXMuYXBwbHlEZWx0YXM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspdGhpcy5hcHBseURlbHRhKGVbdF0pfSx0aGlzLnJldmVydERlbHRhcz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5sZW5ndGgtMTt0Pj0wO3QtLSl0aGlzLnJldmVydERlbHRhKGVbdF0pfSx0aGlzLmFwcGx5RGVsdGE9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmFjdGlvbj09Imluc2VydCI7aWYobj9lLmxpbmVzLmxlbmd0aDw9MSYmIWUubGluZXNbMF06IW8uY29tcGFyZVBvaW50cyhlLnN0YXJ0LGUuZW5kKSlyZXR1cm47biYmZS5saW5lcy5sZW5ndGg+MmU0P3RoaXMuJHNwbGl0QW5kYXBwbHlMYXJnZURlbHRhKGUsMmU0KTooaSh0aGlzLiRsaW5lcyxlLHQpLHRoaXMuX3NpZ25hbCgiY2hhbmdlIixlKSl9LHRoaXMuJHNwbGl0QW5kYXBwbHlMYXJnZURlbHRhPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5saW5lcyxyPW4ubGVuZ3RoLXQrMSxpPWUuc3RhcnQucm93LHM9ZS5zdGFydC5jb2x1bW47Zm9yKHZhciBvPTAsdT0wO288cjtvPXUpe3UrPXQtMTt2YXIgYT1uLnNsaWNlKG8sdSk7YS5wdXNoKCIiKSx0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0OnRoaXMucG9zKGkrbyxzKSxlbmQ6dGhpcy5wb3MoaSt1LHM9MCksYWN0aW9uOmUuYWN0aW9uLGxpbmVzOmF9LCEwKX1lLmxpbmVzPW4uc2xpY2UobyksZS5zdGFydC5yb3c9aStvLGUuc3RhcnQuY29sdW1uPXMsdGhpcy5hcHBseURlbHRhKGUsITApfSx0aGlzLnJldmVydERlbHRhPWZ1bmN0aW9uKGUpe3RoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6dGhpcy5jbG9uZVBvcyhlLnN0YXJ0KSxlbmQ6dGhpcy5jbG9uZVBvcyhlLmVuZCksYWN0aW9uOmUuYWN0aW9uPT0iaW5zZXJ0Ij8icmVtb3ZlIjoiaW5zZXJ0IixsaW5lczplLmxpbmVzLnNsaWNlKCl9KX0sdGhpcy5pbmRleFRvUG9zaXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRsaW5lc3x8dGhpcy5nZXRBbGxMaW5lcygpLHI9dGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkubGVuZ3RoO2Zvcih2YXIgaT10fHwwLHM9bi5sZW5ndGg7aTxzO2krKyl7ZS09bltpXS5sZW5ndGgrcjtpZihlPDApcmV0dXJue3JvdzppLGNvbHVtbjplK25baV0ubGVuZ3RoK3J9fXJldHVybntyb3c6cy0xLGNvbHVtbjplK25bcy0xXS5sZW5ndGgrcn19LHRoaXMucG9zaXRpb25Ub0luZGV4PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kbGluZXN8fHRoaXMuZ2V0QWxsTGluZXMoKSxyPXRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpLmxlbmd0aCxpPTAscz1NYXRoLm1pbihlLnJvdyxuLmxlbmd0aCk7Zm9yKHZhciBvPXR8fDA7bzxzOysrbylpKz1uW29dLmxlbmd0aCtyO3JldHVybiBpK2UuY29sdW1ufX0pLmNhbGwoYS5wcm90b3R5cGUpLHQuRG9jdW1lbnQ9YX0pLGFjZS5kZWZpbmUoImFjZS9iYWNrZ3JvdW5kX3Rva2VuaXplciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIscz1mdW5jdGlvbihlLHQpe3RoaXMucnVubmluZz0hMSx0aGlzLmxpbmVzPVtdLHRoaXMuc3RhdGVzPVtdLHRoaXMuY3VycmVudExpbmU9MCx0aGlzLnRva2VuaXplcj1lO3ZhciBuPXRoaXM7dGhpcy4kd29ya2VyPWZ1bmN0aW9uKCl7aWYoIW4ucnVubmluZylyZXR1cm47dmFyIGU9bmV3IERhdGUsdD1uLmN1cnJlbnRMaW5lLHI9LTEsaT1uLmRvYyxzPXQ7d2hpbGUobi5saW5lc1t0XSl0Kys7dmFyIG89aS5nZXRMZW5ndGgoKSx1PTA7bi5ydW5uaW5nPSExO3doaWxlKHQ8byl7bi4kdG9rZW5pemVSb3codCkscj10O2RvIHQrKzt3aGlsZShuLmxpbmVzW3RdKTt1Kys7aWYodSU1PT09MCYmbmV3IERhdGUtZT4yMCl7bi5ydW5uaW5nPXNldFRpbWVvdXQobi4kd29ya2VyLDIwKTticmVha319bi5jdXJyZW50TGluZT10LHI9PS0xJiYocj10KSxzPD1yJiZuLmZpcmVVcGRhdGVFdmVudChzLHIpfX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxpKSx0aGlzLnNldFRva2VuaXplcj1mdW5jdGlvbihlKXt0aGlzLnRva2VuaXplcj1lLHRoaXMubGluZXM9W10sdGhpcy5zdGF0ZXM9W10sdGhpcy5zdGFydCgwKX0sdGhpcy5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt0aGlzLmRvYz1lLHRoaXMubGluZXM9W10sdGhpcy5zdGF0ZXM9W10sdGhpcy5zdG9wKCl9LHRoaXMuZmlyZVVwZGF0ZUV2ZW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49e2ZpcnN0OmUsbGFzdDp0fTt0aGlzLl9zaWduYWwoInVwZGF0ZSIse2RhdGE6bn0pfSx0aGlzLnN0YXJ0PWZ1bmN0aW9uKGUpe3RoaXMuY3VycmVudExpbmU9TWF0aC5taW4oZXx8MCx0aGlzLmN1cnJlbnRMaW5lLHRoaXMuZG9jLmdldExlbmd0aCgpKSx0aGlzLmxpbmVzLnNwbGljZSh0aGlzLmN1cnJlbnRMaW5lLHRoaXMubGluZXMubGVuZ3RoKSx0aGlzLnN0YXRlcy5zcGxpY2UodGhpcy5jdXJyZW50TGluZSx0aGlzLnN0YXRlcy5sZW5ndGgpLHRoaXMuc3RvcCgpLHRoaXMucnVubmluZz1zZXRUaW1lb3V0KHRoaXMuJHdvcmtlciw3MDApfSx0aGlzLnNjaGVkdWxlU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnJ1bm5pbmd8fCh0aGlzLnJ1bm5pbmc9c2V0VGltZW91dCh0aGlzLiR3b3JrZXIsNzAwKSl9LHRoaXMuJHVwZGF0ZU9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhcnQucm93LG49ZS5lbmQucm93LXQ7aWYobj09PTApdGhpcy5saW5lc1t0XT1udWxsO2Vsc2UgaWYoZS5hY3Rpb249PSJyZW1vdmUiKXRoaXMubGluZXMuc3BsaWNlKHQsbisxLG51bGwpLHRoaXMuc3RhdGVzLnNwbGljZSh0LG4rMSxudWxsKTtlbHNle3ZhciByPUFycmF5KG4rMSk7ci51bnNoaWZ0KHQsMSksdGhpcy5saW5lcy5zcGxpY2UuYXBwbHkodGhpcy5saW5lcyxyKSx0aGlzLnN0YXRlcy5zcGxpY2UuYXBwbHkodGhpcy5zdGF0ZXMscil9dGhpcy5jdXJyZW50TGluZT1NYXRoLm1pbih0LHRoaXMuY3VycmVudExpbmUsdGhpcy5kb2MuZ2V0TGVuZ3RoKCkpLHRoaXMuc3RvcCgpfSx0aGlzLnN0b3A9ZnVuY3Rpb24oKXt0aGlzLnJ1bm5pbmcmJmNsZWFyVGltZW91dCh0aGlzLnJ1bm5pbmcpLHRoaXMucnVubmluZz0hMX0sdGhpcy5nZXRUb2tlbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubGluZXNbZV18fHRoaXMuJHRva2VuaXplUm93KGUpfSx0aGlzLmdldFN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmN1cnJlbnRMaW5lPT1lJiZ0aGlzLiR0b2tlbml6ZVJvdyhlKSx0aGlzLnN0YXRlc1tlXXx8InN0YXJ0In0sdGhpcy4kdG9rZW5pemVSb3c9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5kb2MuZ2V0TGluZShlKSxuPXRoaXMuc3RhdGVzW2UtMV0scj10aGlzLnRva2VuaXplci5nZXRMaW5lVG9rZW5zKHQsbixlKTtyZXR1cm4gdGhpcy5zdGF0ZXNbZV0rIiIhPXIuc3RhdGUrIiI/KHRoaXMuc3RhdGVzW2VdPXIuc3RhdGUsdGhpcy5saW5lc1tlKzFdPW51bGwsdGhpcy5jdXJyZW50TGluZT5lKzEmJih0aGlzLmN1cnJlbnRMaW5lPWUrMSkpOnRoaXMuY3VycmVudExpbmU9PWUmJih0aGlzLmN1cnJlbnRMaW5lPWUrMSksdGhpcy5saW5lc1tlXT1yLnRva2Vuc319KS5jYWxsKHMucHJvdG90eXBlKSx0LkJhY2tncm91bmRUb2tlbml6ZXI9c30pLGFjZS5kZWZpbmUoImFjZS9zZWFyY2hfaGlnaGxpZ2h0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL2xhbmciKSxpPWUoIi4vbGliL29vcCIpLHM9ZSgiLi9yYW5nZSIpLlJhbmdlLG89ZnVuY3Rpb24oZSx0LG4pe3RoaXMuc2V0UmVnZXhwKGUpLHRoaXMuY2xheno9dCx0aGlzLnR5cGU9bnx8InRleHQifTsoZnVuY3Rpb24oKXt0aGlzLk1BWF9SQU5HRVM9NTAwLHRoaXMuc2V0UmVnZXhwPWZ1bmN0aW9uKGUpe2lmKHRoaXMucmVnRXhwKyIiPT1lKyIiKXJldHVybjt0aGlzLnJlZ0V4cD1lLHRoaXMuY2FjaGU9W119LHRoaXMudXBkYXRlPWZ1bmN0aW9uKGUsdCxuLGkpe2lmKCF0aGlzLnJlZ0V4cClyZXR1cm47dmFyIG89aS5maXJzdFJvdyx1PWkubGFzdFJvdztmb3IodmFyIGE9bzthPD11O2ErKyl7dmFyIGY9dGhpcy5jYWNoZVthXTtmPT1udWxsJiYoZj1yLmdldE1hdGNoT2Zmc2V0cyhuLmdldExpbmUoYSksdGhpcy5yZWdFeHApLGYubGVuZ3RoPnRoaXMuTUFYX1JBTkdFUyYmKGY9Zi5zbGljZSgwLHRoaXMuTUFYX1JBTkdFUykpLGY9Zi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBzKGEsZS5vZmZzZXQsYSxlLm9mZnNldCtlLmxlbmd0aCl9KSx0aGlzLmNhY2hlW2FdPWYubGVuZ3RoP2Y6IiIpO2Zvcih2YXIgbD1mLmxlbmd0aDtsLS07KXQuZHJhd1NpbmdsZUxpbmVNYXJrZXIoZSxmW2xdLnRvU2NyZWVuUmFuZ2UobiksdGhpcy5jbGF6eixpKX19fSkuY2FsbChvLnByb3RvdHlwZSksdC5TZWFyY2hIaWdobGlnaHQ9b30pLGFjZS5kZWZpbmUoImFjZS9lZGl0X3Nlc3Npb24vZm9sZF9saW5lIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUsdCl7dGhpcy5mb2xkRGF0YT1lLEFycmF5LmlzQXJyYXkodCk/dGhpcy5mb2xkcz10OnQ9dGhpcy5mb2xkcz1bdF07dmFyIG49dFt0Lmxlbmd0aC0xXTt0aGlzLnJhbmdlPW5ldyByKHRbMF0uc3RhcnQucm93LHRbMF0uc3RhcnQuY29sdW1uLG4uZW5kLnJvdyxuLmVuZC5jb2x1bW4pLHRoaXMuc3RhcnQ9dGhpcy5yYW5nZS5zdGFydCx0aGlzLmVuZD10aGlzLnJhbmdlLmVuZCx0aGlzLmZvbGRzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zZXRGb2xkTGluZSh0aGlzKX0sdGhpcyl9dmFyIHI9ZSgiLi4vcmFuZ2UiKS5SYW5nZTsoZnVuY3Rpb24oKXt0aGlzLnNoaWZ0Um93PWZ1bmN0aW9uKGUpe3RoaXMuc3RhcnQucm93Kz1lLHRoaXMuZW5kLnJvdys9ZSx0aGlzLmZvbGRzLmZvckVhY2goZnVuY3Rpb24odCl7dC5zdGFydC5yb3crPWUsdC5lbmQucm93Kz1lfSl9LHRoaXMuYWRkRm9sZD1mdW5jdGlvbihlKXtpZihlLnNhbWVSb3cpe2lmKGUuc3RhcnQucm93PHRoaXMuc3RhcnRSb3d8fGUuZW5kUm93PnRoaXMuZW5kUm93KXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgYWRkIGEgZm9sZCB0byB0aGlzIEZvbGRMaW5lIGFzIGl0IGhhcyBubyBjb25uZWN0aW9uIik7dGhpcy5mb2xkcy5wdXNoKGUpLHRoaXMuZm9sZHMuc29ydChmdW5jdGlvbihlLHQpe3JldHVybi1lLnJhbmdlLmNvbXBhcmVFbmQodC5zdGFydC5yb3csdC5zdGFydC5jb2x1bW4pfSksdGhpcy5yYW5nZS5jb21wYXJlRW5kKGUuc3RhcnQucm93LGUuc3RhcnQuY29sdW1uKT4wPyh0aGlzLmVuZC5yb3c9ZS5lbmQucm93LHRoaXMuZW5kLmNvbHVtbj1lLmVuZC5jb2x1bW4pOnRoaXMucmFuZ2UuY29tcGFyZVN0YXJ0KGUuZW5kLnJvdyxlLmVuZC5jb2x1bW4pPDAmJih0aGlzLnN0YXJ0LnJvdz1lLnN0YXJ0LnJvdyx0aGlzLnN0YXJ0LmNvbHVtbj1lLnN0YXJ0LmNvbHVtbil9ZWxzZSBpZihlLnN0YXJ0LnJvdz09dGhpcy5lbmQucm93KXRoaXMuZm9sZHMucHVzaChlKSx0aGlzLmVuZC5yb3c9ZS5lbmQucm93LHRoaXMuZW5kLmNvbHVtbj1lLmVuZC5jb2x1bW47ZWxzZXtpZihlLmVuZC5yb3chPXRoaXMuc3RhcnQucm93KXRocm93IG5ldyBFcnJvcigiVHJ5aW5nIHRvIGFkZCBmb2xkIHRvIEZvbGRSb3cgdGhhdCBkb2Vzbid0IGhhdmUgYSBtYXRjaGluZyByb3ciKTt0aGlzLmZvbGRzLnVuc2hpZnQoZSksdGhpcy5zdGFydC5yb3c9ZS5zdGFydC5yb3csdGhpcy5zdGFydC5jb2x1bW49ZS5zdGFydC5jb2x1bW59ZS5mb2xkTGluZT10aGlzfSx0aGlzLmNvbnRhaW5zUm93PWZ1bmN0aW9uKGUpe3JldHVybiBlPj10aGlzLnN0YXJ0LnJvdyYmZTw9dGhpcy5lbmQucm93fSx0aGlzLndhbGs9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPTAsaT10aGlzLmZvbGRzLHMsbyx1LGE9ITA7dD09bnVsbCYmKHQ9dGhpcy5lbmQucm93LG49dGhpcy5lbmQuY29sdW1uKTtmb3IodmFyIGY9MDtmPGkubGVuZ3RoO2YrKyl7cz1pW2ZdLG89cy5yYW5nZS5jb21wYXJlU3RhcnQodCxuKTtpZihvPT0tMSl7ZShudWxsLHQsbixyLGEpO3JldHVybn11PWUobnVsbCxzLnN0YXJ0LnJvdyxzLnN0YXJ0LmNvbHVtbixyLGEpLHU9IXUmJmUocy5wbGFjZWhvbGRlcixzLnN0YXJ0LnJvdyxzLnN0YXJ0LmNvbHVtbixyKTtpZih1fHxvPT09MClyZXR1cm47YT0hcy5zYW1lUm93LHI9cy5lbmQuY29sdW1ufWUobnVsbCx0LG4scixhKX0sdGhpcy5nZXROZXh0Rm9sZFRvPWZ1bmN0aW9uKGUsdCl7dmFyIG4scjtmb3IodmFyIGk9MDtpPHRoaXMuZm9sZHMubGVuZ3RoO2krKyl7bj10aGlzLmZvbGRzW2ldLHI9bi5yYW5nZS5jb21wYXJlRW5kKGUsdCk7aWYocj09LTEpcmV0dXJue2ZvbGQ6bixraW5kOiJhZnRlciJ9O2lmKHI9PT0wKXJldHVybntmb2xkOm4sa2luZDoiaW5zaWRlIn19cmV0dXJuIG51bGx9LHRoaXMuYWRkUmVtb3ZlQ2hhcnM9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuZ2V0TmV4dEZvbGRUbyhlLHQpLGkscztpZihyKXtpPXIuZm9sZDtpZihyLmtpbmQ9PSJpbnNpZGUiJiZpLnN0YXJ0LmNvbHVtbiE9dCYmaS5zdGFydC5yb3chPWUpd2luZG93LmNvbnNvbGUmJndpbmRvdy5jb25zb2xlLmxvZyhlLHQsaSk7ZWxzZSBpZihpLnN0YXJ0LnJvdz09ZSl7cz10aGlzLmZvbGRzO3ZhciBvPXMuaW5kZXhPZihpKTtvPT09MCYmKHRoaXMuc3RhcnQuY29sdW1uKz1uKTtmb3IobztvPHMubGVuZ3RoO28rKyl7aT1zW29dLGkuc3RhcnQuY29sdW1uKz1uO2lmKCFpLnNhbWVSb3cpcmV0dXJuO2kuZW5kLmNvbHVtbis9bn10aGlzLmVuZC5jb2x1bW4rPW59fX0sdGhpcy5zcGxpdD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0TmV4dEZvbGRUbyhlLHQpO2lmKCFufHxuLmtpbmQ9PSJpbnNpZGUiKXJldHVybiBudWxsO3ZhciByPW4uZm9sZCxzPXRoaXMuZm9sZHMsbz10aGlzLmZvbGREYXRhLHU9cy5pbmRleE9mKHIpLGE9c1t1LTFdO3RoaXMuZW5kLnJvdz1hLmVuZC5yb3csdGhpcy5lbmQuY29sdW1uPWEuZW5kLmNvbHVtbixzPXMuc3BsaWNlKHUscy5sZW5ndGgtdSk7dmFyIGY9bmV3IGkobyxzKTtyZXR1cm4gby5zcGxpY2Uoby5pbmRleE9mKHRoaXMpKzEsMCxmKSxmfSx0aGlzLm1lcmdlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZm9sZHM7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdGhpcy5hZGRGb2xkKHRbbl0pO3ZhciByPXRoaXMuZm9sZERhdGE7ci5zcGxpY2Uoci5pbmRleE9mKGUpLDEpfSx0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9W3RoaXMucmFuZ2UudG9TdHJpbmcoKSsiOiBbIl07cmV0dXJuIHRoaXMuZm9sZHMuZm9yRWFjaChmdW5jdGlvbih0KXtlLnB1c2goIiAgIit0LnRvU3RyaW5nKCkpfSksZS5wdXNoKCJdIiksZS5qb2luKCJcbiIpfSx0aGlzLmlkeFRvUG9zaXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9MDtmb3IodmFyIG49MDtuPHRoaXMuZm9sZHMubGVuZ3RoO24rKyl7dmFyIHI9dGhpcy5mb2xkc1tuXTtlLT1yLnN0YXJ0LmNvbHVtbi10O2lmKGU8MClyZXR1cm57cm93OnIuc3RhcnQucm93LGNvbHVtbjpyLnN0YXJ0LmNvbHVtbitlfTtlLT1yLnBsYWNlaG9sZGVyLmxlbmd0aDtpZihlPDApcmV0dXJuIHIuc3RhcnQ7dD1yLmVuZC5jb2x1bW59cmV0dXJue3Jvdzp0aGlzLmVuZC5yb3csY29sdW1uOnRoaXMuZW5kLmNvbHVtbitlfX19KS5jYWxsKGkucHJvdG90eXBlKSx0LkZvbGRMaW5lPWl9KSxhY2UuZGVmaW5lKCJhY2UvcmFuZ2VfbGlzdCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9yYW5nZSIpLlJhbmdlLGk9ci5jb21wYXJlUG9pbnRzLHM9ZnVuY3Rpb24oKXt0aGlzLnJhbmdlcz1bXSx0aGlzLiRiaWFzPTF9OyhmdW5jdGlvbigpe3RoaXMuY29tcGFyZVBvaW50cz1pLHRoaXMucG9pbnRJbmRleD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5yYW5nZXM7Zm9yKHZhciBzPW58fDA7czxyLmxlbmd0aDtzKyspe3ZhciBvPXJbc10sdT1pKGUsby5lbmQpO2lmKHU+MCljb250aW51ZTt2YXIgYT1pKGUsby5zdGFydCk7cmV0dXJuIHU9PT0wP3QmJmEhPT0wPy1zLTI6czphPjB8fGE9PT0wJiYhdD9zOi1zLTF9cmV0dXJuLXMtMX0sdGhpcy5hZGQ9ZnVuY3Rpb24oZSl7dmFyIHQ9IWUuaXNFbXB0eSgpLG49dGhpcy5wb2ludEluZGV4KGUuc3RhcnQsdCk7bjwwJiYobj0tbi0xKTt2YXIgcj10aGlzLnBvaW50SW5kZXgoZS5lbmQsdCxuKTtyZXR1cm4gcjwwP3I9LXItMTpyKyssdGhpcy5yYW5nZXMuc3BsaWNlKG4sci1uLGUpfSx0aGlzLmFkZExpc3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciBuPWUubGVuZ3RoO24tLTspdC5wdXNoLmFwcGx5KHQsdGhpcy5hZGQoZVtuXSkpO3JldHVybiB0fSx0aGlzLnN1YnN0cmFjdFBvaW50PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucG9pbnRJbmRleChlKTtpZih0Pj0wKXJldHVybiB0aGlzLnJhbmdlcy5zcGxpY2UodCwxKX0sdGhpcy5tZXJnZT1mdW5jdGlvbigpe3ZhciBlPVtdLHQ9dGhpcy5yYW5nZXM7dD10LnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gaShlLnN0YXJ0LHQuc3RhcnQpfSk7dmFyIG49dFswXSxyO2Zvcih2YXIgcz0xO3M8dC5sZW5ndGg7cysrKXtyPW4sbj10W3NdO3ZhciBvPWkoci5lbmQsbi5zdGFydCk7aWYobzwwKWNvbnRpbnVlO2lmKG89PTAmJiFyLmlzRW1wdHkoKSYmIW4uaXNFbXB0eSgpKWNvbnRpbnVlO2koci5lbmQsbi5lbmQpPDAmJihyLmVuZC5yb3c9bi5lbmQucm93LHIuZW5kLmNvbHVtbj1uLmVuZC5jb2x1bW4pLHQuc3BsaWNlKHMsMSksZS5wdXNoKG4pLG49cixzLS19cmV0dXJuIHRoaXMucmFuZ2VzPXQsZX0sdGhpcy5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnBvaW50SW5kZXgoe3JvdzplLGNvbHVtbjp0fSk+PTB9LHRoaXMuY29udGFpbnNQb2ludD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wb2ludEluZGV4KGUpPj0wfSx0aGlzLnJhbmdlQXRQb2ludD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnBvaW50SW5kZXgoZSk7aWYodD49MClyZXR1cm4gdGhpcy5yYW5nZXNbdF19LHRoaXMuY2xpcFJvd3M9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnJhbmdlcztpZihuWzBdLnN0YXJ0LnJvdz50fHxuW24ubGVuZ3RoLTFdLnN0YXJ0LnJvdzxlKXJldHVybltdO3ZhciByPXRoaXMucG9pbnRJbmRleCh7cm93OmUsY29sdW1uOjB9KTtyPDAmJihyPS1yLTEpO3ZhciBpPXRoaXMucG9pbnRJbmRleCh7cm93OnQsY29sdW1uOjB9LHIpO2k8MCYmKGk9LWktMSk7dmFyIHM9W107Zm9yKHZhciBvPXI7bzxpO28rKylzLnB1c2gobltvXSk7cmV0dXJuIHN9LHRoaXMucmVtb3ZlQWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZ2VzLnNwbGljZSgwLHRoaXMucmFuZ2VzLmxlbmd0aCl9LHRoaXMuYXR0YWNoPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbiYmdGhpcy5kZXRhY2goKSx0aGlzLnNlc3Npb249ZSx0aGlzLm9uQ2hhbmdlPXRoaXMuJG9uQ2hhbmdlLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2UiLHRoaXMub25DaGFuZ2UpfSx0aGlzLmRldGFjaD1mdW5jdGlvbigpe2lmKCF0aGlzLnNlc3Npb24pcmV0dXJuO3RoaXMuc2Vzc2lvbi5yZW1vdmVMaXN0ZW5lcigiY2hhbmdlIix0aGlzLm9uQ2hhbmdlKSx0aGlzLnNlc3Npb249bnVsbH0sdGhpcy4kb25DaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdGFydCxuPWUuZW5kLHI9dC5yb3csaT1uLnJvdyxzPXRoaXMucmFuZ2VzO2Zvcih2YXIgbz0wLHU9cy5sZW5ndGg7bzx1O28rKyl7dmFyIGE9c1tvXTtpZihhLmVuZC5yb3c+PXIpYnJlYWt9aWYoZS5hY3Rpb249PSJpbnNlcnQiKXt2YXIgZj1pLXIsbD0tdC5jb2x1bW4rbi5jb2x1bW47Zm9yKDtvPHU7bysrKXt2YXIgYT1zW29dO2lmKGEuc3RhcnQucm93PnIpYnJlYWs7YS5zdGFydC5yb3c9PXImJmEuc3RhcnQuY29sdW1uPj10LmNvbHVtbiYmKGEuc3RhcnQuY29sdW1uPT10LmNvbHVtbiYmdGhpcy4kYmlhczw9MHx8KGEuc3RhcnQuY29sdW1uKz1sLGEuc3RhcnQucm93Kz1mKSk7aWYoYS5lbmQucm93PT1yJiZhLmVuZC5jb2x1bW4+PXQuY29sdW1uKXtpZihhLmVuZC5jb2x1bW49PXQuY29sdW1uJiZ0aGlzLiRiaWFzPDApY29udGludWU7YS5lbmQuY29sdW1uPT10LmNvbHVtbiYmbD4wJiZvPHUtMSYmYS5lbmQuY29sdW1uPmEuc3RhcnQuY29sdW1uJiZhLmVuZC5jb2x1bW49PXNbbysxXS5zdGFydC5jb2x1bW4mJihhLmVuZC5jb2x1bW4tPWwpLGEuZW5kLmNvbHVtbis9bCxhLmVuZC5yb3crPWZ9fX1lbHNle3ZhciBmPXItaSxsPXQuY29sdW1uLW4uY29sdW1uO2Zvcig7bzx1O28rKyl7dmFyIGE9c1tvXTtpZihhLnN0YXJ0LnJvdz5pKWJyZWFrO2lmKGEuZW5kLnJvdzxpJiYocjxhLmVuZC5yb3d8fHI9PWEuZW5kLnJvdyYmdC5jb2x1bW48YS5lbmQuY29sdW1uKSlhLmVuZC5yb3c9cixhLmVuZC5jb2x1bW49dC5jb2x1bW47ZWxzZSBpZihhLmVuZC5yb3c9PWkpaWYoYS5lbmQuY29sdW1uPD1uLmNvbHVtbil7aWYoZnx8YS5lbmQuY29sdW1uPnQuY29sdW1uKWEuZW5kLmNvbHVtbj10LmNvbHVtbixhLmVuZC5yb3c9dC5yb3d9ZWxzZSBhLmVuZC5jb2x1bW4rPWwsYS5lbmQucm93Kz1mO2Vsc2UgYS5lbmQucm93PmkmJihhLmVuZC5yb3crPWYpO2lmKGEuc3RhcnQucm93PGkmJihyPGEuc3RhcnQucm93fHxyPT1hLnN0YXJ0LnJvdyYmdC5jb2x1bW48YS5zdGFydC5jb2x1bW4pKWEuc3RhcnQucm93PXIsYS5zdGFydC5jb2x1bW49dC5jb2x1bW47ZWxzZSBpZihhLnN0YXJ0LnJvdz09aSlpZihhLnN0YXJ0LmNvbHVtbjw9bi5jb2x1bW4pe2lmKGZ8fGEuc3RhcnQuY29sdW1uPnQuY29sdW1uKWEuc3RhcnQuY29sdW1uPXQuY29sdW1uLGEuc3RhcnQucm93PXQucm93fWVsc2UgYS5zdGFydC5jb2x1bW4rPWwsYS5zdGFydC5yb3crPWY7ZWxzZSBhLnN0YXJ0LnJvdz5pJiYoYS5zdGFydC5yb3crPWYpfX1pZihmIT0wJiZvPHUpZm9yKDtvPHU7bysrKXt2YXIgYT1zW29dO2Euc3RhcnQucm93Kz1mLGEuZW5kLnJvdys9Zn19fSkuY2FsbChzLnByb3RvdHlwZSksdC5SYW5nZUxpc3Q9c30pLGFjZS5kZWZpbmUoImFjZS9lZGl0X3Nlc3Npb24vZm9sZCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZV9saXN0IiwiYWNlL2xpYi9vb3AiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSx0KXtlLnJvdy09dC5yb3csZS5yb3c9PTAmJihlLmNvbHVtbi09dC5jb2x1bW4pfWZ1bmN0aW9uIHUoZSx0KXtvKGUuc3RhcnQsdCksbyhlLmVuZCx0KX1mdW5jdGlvbiBhKGUsdCl7ZS5yb3c9PTAmJihlLmNvbHVtbis9dC5jb2x1bW4pLGUucm93Kz10LnJvd31mdW5jdGlvbiBmKGUsdCl7YShlLnN0YXJ0LHQpLGEoZS5lbmQsdCl9dmFyIHI9ZSgiLi4vcmFuZ2VfbGlzdCIpLlJhbmdlTGlzdCxpPWUoIi4uL2xpYi9vb3AiKSxzPXQuRm9sZD1mdW5jdGlvbihlLHQpe3RoaXMuZm9sZExpbmU9bnVsbCx0aGlzLnBsYWNlaG9sZGVyPXQsdGhpcy5yYW5nZT1lLHRoaXMuc3RhcnQ9ZS5zdGFydCx0aGlzLmVuZD1lLmVuZCx0aGlzLnNhbWVSb3c9ZS5zdGFydC5yb3c9PWUuZW5kLnJvdyx0aGlzLnN1YkZvbGRzPXRoaXMucmFuZ2VzPVtdfTtpLmluaGVyaXRzKHMsciksZnVuY3Rpb24oKXt0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuJyInK3RoaXMucGxhY2Vob2xkZXIrJyIgJyt0aGlzLnJhbmdlLnRvU3RyaW5nKCl9LHRoaXMuc2V0Rm9sZExpbmU9ZnVuY3Rpb24oZSl7dGhpcy5mb2xkTGluZT1lLHRoaXMuc3ViRm9sZHMuZm9yRWFjaChmdW5jdGlvbih0KXt0LnNldEZvbGRMaW5lKGUpfSl9LHRoaXMuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJhbmdlLmNsb25lKCksdD1uZXcgcyhlLHRoaXMucGxhY2Vob2xkZXIpO3JldHVybiB0aGlzLnN1YkZvbGRzLmZvckVhY2goZnVuY3Rpb24oZSl7dC5zdWJGb2xkcy5wdXNoKGUuY2xvbmUoKSl9KSx0LmNvbGxhcHNlQ2hpbGRyZW49dGhpcy5jb2xsYXBzZUNoaWxkcmVuLHR9LHRoaXMuYWRkU3ViRm9sZD1mdW5jdGlvbihlKXtpZih0aGlzLnJhbmdlLmlzRXF1YWwoZSkpcmV0dXJuO3UoZSx0aGlzLnN0YXJ0KTt2YXIgdD1lLnN0YXJ0LnJvdyxuPWUuc3RhcnQuY29sdW1uO2Zvcih2YXIgcj0wLGk9LTE7cjx0aGlzLnN1YkZvbGRzLmxlbmd0aDtyKyspe2k9dGhpcy5zdWJGb2xkc1tyXS5yYW5nZS5jb21wYXJlKHQsbik7aWYoaSE9MSlicmVha312YXIgcz10aGlzLnN1YkZvbGRzW3JdLG89MDtpZihpPT0wKXtpZihzLnJhbmdlLmNvbnRhaW5zUmFuZ2UoZSkpcmV0dXJuIHMuYWRkU3ViRm9sZChlKTtvPTF9dmFyIHQ9ZS5yYW5nZS5lbmQucm93LG49ZS5yYW5nZS5lbmQuY29sdW1uO2Zvcih2YXIgYT1yLGk9LTE7YTx0aGlzLnN1YkZvbGRzLmxlbmd0aDthKyspe2k9dGhpcy5zdWJGb2xkc1thXS5yYW5nZS5jb21wYXJlKHQsbik7aWYoaSE9MSlicmVha31pPT0wJiZhKys7dmFyIGY9dGhpcy5zdWJGb2xkcy5zcGxpY2UocixhLXIsZSksbD1pPT0wP2YubGVuZ3RoLTE6Zi5sZW5ndGg7Zm9yKHZhciBjPW87YzxsO2MrKyllLmFkZFN1YkZvbGQoZltjXSk7cmV0dXJuIGUuc2V0Rm9sZExpbmUodGhpcy5mb2xkTGluZSksZX0sdGhpcy5yZXN0b3JlUmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGYoZSx0aGlzLnN0YXJ0KX19LmNhbGwocy5wcm90b3R5cGUpfSksYWNlLmRlZmluZSgiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkaW5nIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIiwiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkX2xpbmUiLCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGQiLCJhY2UvdG9rZW5faXRlcmF0b3IiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHUoKXt0aGlzLmdldEZvbGRBdD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5nZXRGb2xkTGluZShlKTtpZighcilyZXR1cm4gbnVsbDt2YXIgaT1yLmZvbGRzO2Zvcih2YXIgcz0wO3M8aS5sZW5ndGg7cysrKXt2YXIgbz1pW3NdLnJhbmdlO2lmKG8uY29udGFpbnMoZSx0KSl7aWYobj09MSYmby5pc0VuZChlLHQpJiYhby5pc0VtcHR5KCkpY29udGludWU7aWYobj09LTEmJm8uaXNTdGFydChlLHQpJiYhby5pc0VtcHR5KCkpY29udGludWU7cmV0dXJuIGlbc119fX0sdGhpcy5nZXRGb2xkc0luUmFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdGFydCxuPWUuZW5kLHI9dGhpcy4kZm9sZERhdGEsaT1bXTt0LmNvbHVtbis9MSxuLmNvbHVtbi09MTtmb3IodmFyIHM9MDtzPHIubGVuZ3RoO3MrKyl7dmFyIG89cltzXS5yYW5nZS5jb21wYXJlUmFuZ2UoZSk7aWYobz09Miljb250aW51ZTtpZihvPT0tMilicmVhazt2YXIgdT1yW3NdLmZvbGRzO2Zvcih2YXIgYT0wO2E8dS5sZW5ndGg7YSsrKXt2YXIgZj11W2FdO289Zi5yYW5nZS5jb21wYXJlUmFuZ2UoZSk7aWYobz09LTIpYnJlYWs7aWYobz09Miljb250aW51ZTtpZihvPT00MilicmVhaztpLnB1c2goZil9fXJldHVybiB0LmNvbHVtbi09MSxuLmNvbHVtbis9MSxpfSx0aGlzLmdldEZvbGRzSW5SYW5nZUxpc3Q9ZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSl7dmFyIHQ9W107ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Q9dC5jb25jYXQodGhpcy5nZXRGb2xkc0luUmFuZ2UoZSkpfSx0aGlzKX1lbHNlIHZhciB0PXRoaXMuZ2V0Rm9sZHNJblJhbmdlKGUpO3JldHVybiB0fSx0aGlzLmdldEFsbEZvbGRzPWZ1bmN0aW9uKCl7dmFyIGU9W10sdD10aGlzLiRmb2xkRGF0YTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylmb3IodmFyIHI9MDtyPHRbbl0uZm9sZHMubGVuZ3RoO3IrKyllLnB1c2godFtuXS5mb2xkc1tyXSk7cmV0dXJuIGV9LHRoaXMuZ2V0Rm9sZFN0cmluZ0F0PWZ1bmN0aW9uKGUsdCxuLHIpe3I9cnx8dGhpcy5nZXRGb2xkTGluZShlKTtpZighcilyZXR1cm4gbnVsbDt2YXIgaT17ZW5kOntjb2x1bW46MH19LHMsbztmb3IodmFyIHU9MDt1PHIuZm9sZHMubGVuZ3RoO3UrKyl7bz1yLmZvbGRzW3VdO3ZhciBhPW8ucmFuZ2UuY29tcGFyZUVuZChlLHQpO2lmKGE9PS0xKXtzPXRoaXMuZ2V0TGluZShvLnN0YXJ0LnJvdykuc3Vic3RyaW5nKGkuZW5kLmNvbHVtbixvLnN0YXJ0LmNvbHVtbik7YnJlYWt9aWYoYT09PTApcmV0dXJuIG51bGw7aT1vfXJldHVybiBzfHwocz10aGlzLmdldExpbmUoby5zdGFydC5yb3cpLnN1YnN0cmluZyhpLmVuZC5jb2x1bW4pKSxuPT0tMT9zLnN1YnN0cmluZygwLHQtaS5lbmQuY29sdW1uKTpuPT0xP3Muc3Vic3RyaW5nKHQtaS5lbmQuY29sdW1uKTpzfSx0aGlzLmdldEZvbGRMaW5lPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kZm9sZERhdGEscj0wO3QmJihyPW4uaW5kZXhPZih0KSkscj09LTEmJihyPTApO2ZvcihyO3I8bi5sZW5ndGg7cisrKXt2YXIgaT1uW3JdO2lmKGkuc3RhcnQucm93PD1lJiZpLmVuZC5yb3c+PWUpcmV0dXJuIGk7aWYoaS5lbmQucm93PmUpcmV0dXJuIG51bGx9cmV0dXJuIG51bGx9LHRoaXMuZ2V0TmV4dEZvbGRMaW5lPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kZm9sZERhdGEscj0wO3QmJihyPW4uaW5kZXhPZih0KSkscj09LTEmJihyPTApO2ZvcihyO3I8bi5sZW5ndGg7cisrKXt2YXIgaT1uW3JdO2lmKGkuZW5kLnJvdz49ZSlyZXR1cm4gaX1yZXR1cm4gbnVsbH0sdGhpcy5nZXRGb2xkZWRSb3dDb3VudD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJGZvbGREYXRhLHI9dC1lKzE7Zm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciBzPW5baV0sbz1zLmVuZC5yb3csdT1zLnN0YXJ0LnJvdztpZihvPj10KXt1PHQmJih1Pj1lP3ItPXQtdTpyPTApO2JyZWFrfW8+PWUmJih1Pj1lP3ItPW8tdTpyLT1vLWUrMSl9cmV0dXJuIHJ9LHRoaXMuJGFkZEZvbGRMaW5lPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiRmb2xkRGF0YS5wdXNoKGUpLHRoaXMuJGZvbGREYXRhLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zdGFydC5yb3ctdC5zdGFydC5yb3d9KSxlfSx0aGlzLmFkZEZvbGQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRmb2xkRGF0YSxyPSExLG87ZSBpbnN0YW5jZW9mIHM/bz1lOihvPW5ldyBzKHQsZSksby5jb2xsYXBzZUNoaWxkcmVuPXQuY29sbGFwc2VDaGlsZHJlbiksdGhpcy4kY2xpcFJhbmdlVG9Eb2N1bWVudChvLnJhbmdlKTt2YXIgdT1vLnN0YXJ0LnJvdyxhPW8uc3RhcnQuY29sdW1uLGY9by5lbmQucm93LGw9by5lbmQuY29sdW1uLGM9dGhpcy5nZXRGb2xkQXQodSxhLDEpLGg9dGhpcy5nZXRGb2xkQXQoZixsLC0xKTtpZihjJiZoPT1jKXJldHVybiBjLmFkZFN1YkZvbGQobyk7YyYmIWMucmFuZ2UuaXNTdGFydCh1LGEpJiZ0aGlzLnJlbW92ZUZvbGQoYyksaCYmIWgucmFuZ2UuaXNFbmQoZixsKSYmdGhpcy5yZW1vdmVGb2xkKGgpO3ZhciBwPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKG8ucmFuZ2UpO3AubGVuZ3RoPjAmJih0aGlzLnJlbW92ZUZvbGRzKHApLHAuZm9yRWFjaChmdW5jdGlvbihlKXtvLmFkZFN1YkZvbGQoZSl9KSk7Zm9yKHZhciBkPTA7ZDxuLmxlbmd0aDtkKyspe3ZhciB2PW5bZF07aWYoZj09di5zdGFydC5yb3cpe3YuYWRkRm9sZChvKSxyPSEwO2JyZWFrfWlmKHU9PXYuZW5kLnJvdyl7di5hZGRGb2xkKG8pLHI9ITA7aWYoIW8uc2FtZVJvdyl7dmFyIG09bltkKzFdO2lmKG0mJm0uc3RhcnQucm93PT1mKXt2Lm1lcmdlKG0pO2JyZWFrfX1icmVha31pZihmPD12LnN0YXJ0LnJvdylicmVha31yZXR1cm4gcnx8KHY9dGhpcy4kYWRkRm9sZExpbmUobmV3IGkodGhpcy4kZm9sZERhdGEsbykpKSx0aGlzLiR1c2VXcmFwTW9kZT90aGlzLiR1cGRhdGVXcmFwRGF0YSh2LnN0YXJ0LnJvdyx2LnN0YXJ0LnJvdyk6dGhpcy4kdXBkYXRlUm93TGVuZ3RoQ2FjaGUodi5zdGFydC5yb3csdi5zdGFydC5yb3cpLHRoaXMuJG1vZGlmaWVkPSEwLHRoaXMuX3NpZ25hbCgiY2hhbmdlRm9sZCIse2RhdGE6byxhY3Rpb246ImFkZCJ9KSxvfSx0aGlzLmFkZEZvbGRzPWZ1bmN0aW9uKGUpe2UuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzLmFkZEZvbGQoZSl9LHRoaXMpfSx0aGlzLnJlbW92ZUZvbGQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5mb2xkTGluZSxuPXQuc3RhcnQucm93LHI9dC5lbmQucm93LGk9dGhpcy4kZm9sZERhdGEscz10LmZvbGRzO2lmKHMubGVuZ3RoPT0xKWkuc3BsaWNlKGkuaW5kZXhPZih0KSwxKTtlbHNlIGlmKHQucmFuZ2UuaXNFbmQoZS5lbmQucm93LGUuZW5kLmNvbHVtbikpcy5wb3AoKSx0LmVuZC5yb3c9c1tzLmxlbmd0aC0xXS5lbmQucm93LHQuZW5kLmNvbHVtbj1zW3MubGVuZ3RoLTFdLmVuZC5jb2x1bW47ZWxzZSBpZih0LnJhbmdlLmlzU3RhcnQoZS5zdGFydC5yb3csZS5zdGFydC5jb2x1bW4pKXMuc2hpZnQoKSx0LnN0YXJ0LnJvdz1zWzBdLnN0YXJ0LnJvdyx0LnN0YXJ0LmNvbHVtbj1zWzBdLnN0YXJ0LmNvbHVtbjtlbHNlIGlmKGUuc2FtZVJvdylzLnNwbGljZShzLmluZGV4T2YoZSksMSk7ZWxzZXt2YXIgbz10LnNwbGl0KGUuc3RhcnQucm93LGUuc3RhcnQuY29sdW1uKTtzPW8uZm9sZHMscy5zaGlmdCgpLG8uc3RhcnQucm93PXNbMF0uc3RhcnQucm93LG8uc3RhcnQuY29sdW1uPXNbMF0uc3RhcnQuY29sdW1ufXRoaXMuJHVwZGF0aW5nfHwodGhpcy4kdXNlV3JhcE1vZGU/dGhpcy4kdXBkYXRlV3JhcERhdGEobixyKTp0aGlzLiR1cGRhdGVSb3dMZW5ndGhDYWNoZShuLHIpKSx0aGlzLiRtb2RpZmllZD0hMCx0aGlzLl9zaWduYWwoImNoYW5nZUZvbGQiLHtkYXRhOmUsYWN0aW9uOiJyZW1vdmUifSl9LHRoaXMucmVtb3ZlRm9sZHM9ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspdC5wdXNoKGVbbl0pO3QuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzLnJlbW92ZUZvbGQoZSl9LHRoaXMpLHRoaXMuJG1vZGlmaWVkPSEwfSx0aGlzLmV4cGFuZEZvbGQ9ZnVuY3Rpb24oZSl7dGhpcy5yZW1vdmVGb2xkKGUpLGUuc3ViRm9sZHMuZm9yRWFjaChmdW5jdGlvbih0KXtlLnJlc3RvcmVSYW5nZSh0KSx0aGlzLmFkZEZvbGQodCl9LHRoaXMpLGUuY29sbGFwc2VDaGlsZHJlbj4wJiZ0aGlzLmZvbGRBbGwoZS5zdGFydC5yb3crMSxlLmVuZC5yb3csZS5jb2xsYXBzZUNoaWxkcmVuLTEpLGUuc3ViRm9sZHM9W119LHRoaXMuZXhwYW5kRm9sZHM9ZnVuY3Rpb24oZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RoaXMuZXhwYW5kRm9sZChlKX0sdGhpcyl9LHRoaXMudW5mb2xkPWZ1bmN0aW9uKGUsdCl7dmFyIG4saTtlPT1udWxsPyhuPW5ldyByKDAsMCx0aGlzLmdldExlbmd0aCgpLDApLHQ9ITApOnR5cGVvZiBlPT0ibnVtYmVyIj9uPW5ldyByKGUsMCxlLHRoaXMuZ2V0TGluZShlKS5sZW5ndGgpOiJyb3ciaW4gZT9uPXIuZnJvbVBvaW50cyhlLGUpOm49ZSxpPXRoaXMuZ2V0Rm9sZHNJblJhbmdlTGlzdChuKTtpZih0KXRoaXMucmVtb3ZlRm9sZHMoaSk7ZWxzZXt2YXIgcz1pO3doaWxlKHMubGVuZ3RoKXRoaXMuZXhwYW5kRm9sZHMocykscz10aGlzLmdldEZvbGRzSW5SYW5nZUxpc3Qobil9aWYoaS5sZW5ndGgpcmV0dXJuIGl9LHRoaXMuaXNSb3dGb2xkZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4hIXRoaXMuZ2V0Rm9sZExpbmUoZSx0KX0sdGhpcy5nZXRSb3dGb2xkRW5kPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRGb2xkTGluZShlLHQpO3JldHVybiBuP24uZW5kLnJvdzplfSx0aGlzLmdldFJvd0ZvbGRTdGFydD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0Rm9sZExpbmUoZSx0KTtyZXR1cm4gbj9uLnN0YXJ0LnJvdzplfSx0aGlzLmdldEZvbGREaXNwbGF5TGluZT1mdW5jdGlvbihlLHQsbixyLGkpe3I9PW51bGwmJihyPWUuc3RhcnQucm93KSxpPT1udWxsJiYoaT0wKSx0PT1udWxsJiYodD1lLmVuZC5yb3cpLG49PW51bGwmJihuPXRoaXMuZ2V0TGluZSh0KS5sZW5ndGgpO3ZhciBzPXRoaXMuZG9jLG89IiI7cmV0dXJuIGUud2FsayhmdW5jdGlvbihlLHQsbix1KXtpZih0PHIpcmV0dXJuO2lmKHQ9PXIpe2lmKG48aSlyZXR1cm47dT1NYXRoLm1heChpLHUpfWUhPW51bGw/bys9ZTpvKz1zLmdldExpbmUodCkuc3Vic3RyaW5nKHUsbil9LHQsbiksb30sdGhpcy5nZXREaXNwbGF5TGluZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLmdldEZvbGRMaW5lKGUpO2lmKCFpKXt2YXIgcztyZXR1cm4gcz10aGlzLmRvYy5nZXRMaW5lKGUpLHMuc3Vic3RyaW5nKHJ8fDAsdHx8cy5sZW5ndGgpfXJldHVybiB0aGlzLmdldEZvbGREaXNwbGF5TGluZShpLGUsdCxuLHIpfSx0aGlzLiRjbG9uZUZvbGREYXRhPWZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIGU9dGhpcy4kZm9sZERhdGEubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZm9sZHMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsb25lKCl9KTtyZXR1cm4gbmV3IGkoZSxuKX0pLGV9LHRoaXMudG9nZ2xlRm9sZD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlbGVjdGlvbixuPXQuZ2V0UmFuZ2UoKSxyLGk7aWYobi5pc0VtcHR5KCkpe3ZhciBzPW4uc3RhcnQ7cj10aGlzLmdldEZvbGRBdChzLnJvdyxzLmNvbHVtbik7aWYocil7dGhpcy5leHBhbmRGb2xkKHIpO3JldHVybn0oaT10aGlzLmZpbmRNYXRjaGluZ0JyYWNrZXQocykpP24uY29tcGFyZVBvaW50KGkpPT0xP24uZW5kPWk6KG4uc3RhcnQ9aSxuLnN0YXJ0LmNvbHVtbisrLG4uZW5kLmNvbHVtbi0tKTooaT10aGlzLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpzLnJvdyxjb2x1bW46cy5jb2x1bW4rMX0pKT8obi5jb21wYXJlUG9pbnQoaSk9PTE/bi5lbmQ9aTpuLnN0YXJ0PWksbi5zdGFydC5jb2x1bW4rKyk6bj10aGlzLmdldENvbW1lbnRGb2xkUmFuZ2Uocy5yb3cscy5jb2x1bW4pfHxufWVsc2V7dmFyIG89dGhpcy5nZXRGb2xkc0luUmFuZ2Uobik7aWYoZSYmby5sZW5ndGgpe3RoaXMuZXhwYW5kRm9sZHMobyk7cmV0dXJufW8ubGVuZ3RoPT0xJiYocj1vWzBdKX1yfHwocj10aGlzLmdldEZvbGRBdChuLnN0YXJ0LnJvdyxuLnN0YXJ0LmNvbHVtbikpO2lmKHImJnIucmFuZ2UudG9TdHJpbmcoKT09bi50b1N0cmluZygpKXt0aGlzLmV4cGFuZEZvbGQocik7cmV0dXJufXZhciB1PSIuLi4iO2lmKCFuLmlzTXVsdGlMaW5lKCkpe3U9dGhpcy5nZXRUZXh0UmFuZ2Uobik7aWYodS5sZW5ndGg8NClyZXR1cm47dT11LnRyaW0oKS5zdWJzdHJpbmcoMCwyKSsiLi4ifXRoaXMuYWRkRm9sZCh1LG4pfSx0aGlzLmdldENvbW1lbnRGb2xkUmFuZ2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPW5ldyBvKHRoaXMsZSx0KSxzPWkuZ2V0Q3VycmVudFRva2VuKCksdT1zLnR5cGU7aWYocyYmL15jb21tZW50fHN0cmluZy8udGVzdCh1KSl7dT11Lm1hdGNoKC9jb21tZW50fHN0cmluZy8pWzBdLHU9PSJjb21tZW50IiYmKHUrPSJ8ZG9jLXN0YXJ0Iik7dmFyIGE9bmV3IFJlZ0V4cCh1KSxmPW5ldyByO2lmKG4hPTEpe2RvIHM9aS5zdGVwQmFja3dhcmQoKTt3aGlsZShzJiZhLnRlc3Qocy50eXBlKSk7aS5zdGVwRm9yd2FyZCgpfWYuc3RhcnQucm93PWkuZ2V0Q3VycmVudFRva2VuUm93KCksZi5zdGFydC5jb2x1bW49aS5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSsyLGk9bmV3IG8odGhpcyxlLHQpO2lmKG4hPS0xKXt2YXIgbD0tMTtkb3tzPWkuc3RlcEZvcndhcmQoKTtpZihsPT0tMSl7dmFyIGM9dGhpcy5nZXRTdGF0ZShpLiRyb3cpO2EudGVzdChjKXx8KGw9aS4kcm93KX1lbHNlIGlmKGkuJHJvdz5sKWJyZWFrfXdoaWxlKHMmJmEudGVzdChzLnR5cGUpKTtzPWkuc3RlcEJhY2t3YXJkKCl9ZWxzZSBzPWkuZ2V0Q3VycmVudFRva2VuKCk7cmV0dXJuIGYuZW5kLnJvdz1pLmdldEN1cnJlbnRUb2tlblJvdygpLGYuZW5kLmNvbHVtbj1pLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK3MudmFsdWUubGVuZ3RoLTIsZn19LHRoaXMuZm9sZEFsbD1mdW5jdGlvbihlLHQsbil7bj09dW5kZWZpbmVkJiYobj0xZTUpO3ZhciByPXRoaXMuZm9sZFdpZGdldHM7aWYoIXIpcmV0dXJuO3Q9dHx8dGhpcy5nZXRMZW5ndGgoKSxlPWV8fDA7Zm9yKHZhciBpPWU7aTx0O2krKyl7cltpXT09bnVsbCYmKHJbaV09dGhpcy5nZXRGb2xkV2lkZ2V0KGkpKTtpZihyW2ldIT0ic3RhcnQiKWNvbnRpbnVlO3ZhciBzPXRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlKGkpO2lmKHMmJnMuaXNNdWx0aUxpbmUoKSYmcy5lbmQucm93PD10JiZzLnN0YXJ0LnJvdz49ZSl7aT1zLmVuZC5yb3c7dHJ5e3ZhciBvPXRoaXMuYWRkRm9sZCgiLi4uIixzKTtvJiYoby5jb2xsYXBzZUNoaWxkcmVuPW4pfWNhdGNoKHUpe319fX0sdGhpcy4kZm9sZFN0eWxlcz17bWFudWFsOjEsbWFya2JlZ2luOjEsbWFya2JlZ2luZW5kOjF9LHRoaXMuJGZvbGRTdHlsZT0ibWFya2JlZ2luIix0aGlzLnNldEZvbGRTdHlsZT1mdW5jdGlvbihlKXtpZighdGhpcy4kZm9sZFN0eWxlc1tlXSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9sZCBzdHlsZTogIitlKyJbIitPYmplY3Qua2V5cyh0aGlzLiRmb2xkU3R5bGVzKS5qb2luKCIsICIpKyJdIik7aWYodGhpcy4kZm9sZFN0eWxlPT1lKXJldHVybjt0aGlzLiRmb2xkU3R5bGU9ZSxlPT0ibWFudWFsIiYmdGhpcy51bmZvbGQoKTt2YXIgdD10aGlzLiRmb2xkTW9kZTt0aGlzLiRzZXRGb2xkaW5nKG51bGwpLHRoaXMuJHNldEZvbGRpbmcodCl9LHRoaXMuJHNldEZvbGRpbmc9ZnVuY3Rpb24oZSl7aWYodGhpcy4kZm9sZE1vZGU9PWUpcmV0dXJuO3RoaXMuJGZvbGRNb2RlPWUsdGhpcy5vZmYoImNoYW5nZSIsdGhpcy4kdXBkYXRlRm9sZFdpZGdldHMpLHRoaXMub2ZmKCJ0b2tlbml6ZXJVcGRhdGUiLHRoaXMuJHRva2VuaXplclVwZGF0ZUZvbGRXaWRnZXRzKSx0aGlzLl9zaWduYWwoImNoYW5nZUFubm90YXRpb24iKTtpZighZXx8dGhpcy4kZm9sZFN0eWxlPT0ibWFudWFsIil7dGhpcy5mb2xkV2lkZ2V0cz1udWxsO3JldHVybn10aGlzLmZvbGRXaWRnZXRzPVtdLHRoaXMuZ2V0Rm9sZFdpZGdldD1lLmdldEZvbGRXaWRnZXQuYmluZChlLHRoaXMsdGhpcy4kZm9sZFN0eWxlKSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1lLmdldEZvbGRXaWRnZXRSYW5nZS5iaW5kKGUsdGhpcyx0aGlzLiRmb2xkU3R5bGUpLHRoaXMuJHVwZGF0ZUZvbGRXaWRnZXRzPXRoaXMudXBkYXRlRm9sZFdpZGdldHMuYmluZCh0aGlzKSx0aGlzLiR0b2tlbml6ZXJVcGRhdGVGb2xkV2lkZ2V0cz10aGlzLnRva2VuaXplclVwZGF0ZUZvbGRXaWRnZXRzLmJpbmQodGhpcyksdGhpcy5vbigiY2hhbmdlIix0aGlzLiR1cGRhdGVGb2xkV2lkZ2V0cyksdGhpcy5vbigidG9rZW5pemVyVXBkYXRlIix0aGlzLiR0b2tlbml6ZXJVcGRhdGVGb2xkV2lkZ2V0cyl9LHRoaXMuZ2V0UGFyZW50Rm9sZFJhbmdlRGF0YT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZm9sZFdpZGdldHM7aWYoIW58fHQmJm5bZV0pcmV0dXJue307dmFyIHI9ZS0xLGk7d2hpbGUocj49MCl7dmFyIHM9bltyXTtzPT1udWxsJiYocz1uW3JdPXRoaXMuZ2V0Rm9sZFdpZGdldChyKSk7aWYocz09InN0YXJ0Iil7dmFyIG89dGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2Uocik7aXx8KGk9byk7aWYobyYmby5lbmQucm93Pj1lKWJyZWFrfXItLX1yZXR1cm57cmFuZ2U6ciE9PS0xJiZvLGZpcnN0UmFuZ2U6aX19LHRoaXMub25Gb2xkV2lkZ2V0Q2xpY2s9ZnVuY3Rpb24oZSx0KXt0PXQuZG9tRXZlbnQ7dmFyIG49e2NoaWxkcmVuOnQuc2hpZnRLZXksYWxsOnQuY3RybEtleXx8dC5tZXRhS2V5LHNpYmxpbmdzOnQuYWx0S2V5fSxyPXRoaXMuJHRvZ2dsZUZvbGRXaWRnZXQoZSxuKTtpZighcil7dmFyIGk9dC50YXJnZXR8fHQuc3JjRWxlbWVudDtpJiYvYWNlX2ZvbGQtd2lkZ2V0Ly50ZXN0KGkuY2xhc3NOYW1lKSYmKGkuY2xhc3NOYW1lKz0iIGFjZV9pbnZhbGlkIil9fSx0aGlzLiR0b2dnbGVGb2xkV2lkZ2V0PWZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuZ2V0Rm9sZFdpZGdldClyZXR1cm47dmFyIG49dGhpcy5nZXRGb2xkV2lkZ2V0KGUpLHI9dGhpcy5nZXRMaW5lKGUpLGk9bj09PSJlbmQiPy0xOjEscz10aGlzLmdldEZvbGRBdChlLGk9PT0tMT8wOnIubGVuZ3RoLGkpO2lmKHMpcmV0dXJuIHQuY2hpbGRyZW58fHQuYWxsP3RoaXMucmVtb3ZlRm9sZChzKTp0aGlzLmV4cGFuZEZvbGQocyksczt2YXIgbz10aGlzLmdldEZvbGRXaWRnZXRSYW5nZShlLCEwKTtpZihvJiYhby5pc011bHRpTGluZSgpKXtzPXRoaXMuZ2V0Rm9sZEF0KG8uc3RhcnQucm93LG8uc3RhcnQuY29sdW1uLDEpO2lmKHMmJm8uaXNFcXVhbChzLnJhbmdlKSlyZXR1cm4gdGhpcy5yZW1vdmVGb2xkKHMpLHN9aWYodC5zaWJsaW5ncyl7dmFyIHU9dGhpcy5nZXRQYXJlbnRGb2xkUmFuZ2VEYXRhKGUpO2lmKHUucmFuZ2UpdmFyIGE9dS5yYW5nZS5zdGFydC5yb3crMSxmPXUucmFuZ2UuZW5kLnJvdzt0aGlzLmZvbGRBbGwoYSxmLHQuYWxsPzFlNDowKX1lbHNlIHQuY2hpbGRyZW4/KGY9bz9vLmVuZC5yb3c6dGhpcy5nZXRMZW5ndGgoKSx0aGlzLmZvbGRBbGwoZSsxLGYsdC5hbGw/MWU0OjApKTpvJiYodC5hbGwmJihvLmNvbGxhcHNlQ2hpbGRyZW49MWU0KSx0aGlzLmFkZEZvbGQoIi4uLiIsbykpO3JldHVybiBvfSx0aGlzLnRvZ2dsZUZvbGRXaWRnZXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCkucm93O3Q9dGhpcy5nZXRSb3dGb2xkU3RhcnQodCk7dmFyIG49dGhpcy4kdG9nZ2xlRm9sZFdpZGdldCh0LHt9KTtpZihuKXJldHVybjt2YXIgcj10aGlzLmdldFBhcmVudEZvbGRSYW5nZURhdGEodCwhMCk7bj1yLnJhbmdlfHxyLmZpcnN0UmFuZ2U7aWYobil7dD1uLnN0YXJ0LnJvdzt2YXIgaT10aGlzLmdldEZvbGRBdCh0LHRoaXMuZ2V0TGluZSh0KS5sZW5ndGgsMSk7aT90aGlzLnJlbW92ZUZvbGQoaSk6dGhpcy5hZGRGb2xkKCIuLi4iLG4pfX0sdGhpcy51cGRhdGVGb2xkV2lkZ2V0cz1mdW5jdGlvbihlKXt2YXIgdD1lLnN0YXJ0LnJvdyxuPWUuZW5kLnJvdy10O2lmKG49PT0wKXRoaXMuZm9sZFdpZGdldHNbdF09bnVsbDtlbHNlIGlmKGUuYWN0aW9uPT0icmVtb3ZlIil0aGlzLmZvbGRXaWRnZXRzLnNwbGljZSh0LG4rMSxudWxsKTtlbHNle3ZhciByPUFycmF5KG4rMSk7ci51bnNoaWZ0KHQsMSksdGhpcy5mb2xkV2lkZ2V0cy5zcGxpY2UuYXBwbHkodGhpcy5mb2xkV2lkZ2V0cyxyKX19LHRoaXMudG9rZW5pemVyVXBkYXRlRm9sZFdpZGdldHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhO3QuZmlyc3QhPXQubGFzdCYmdGhpcy5mb2xkV2lkZ2V0cy5sZW5ndGg+dC5maXJzdCYmdGhpcy5mb2xkV2lkZ2V0cy5zcGxpY2UodC5maXJzdCx0aGlzLmZvbGRXaWRnZXRzLmxlbmd0aCl9fXZhciByPWUoIi4uL3JhbmdlIikuUmFuZ2UsaT1lKCIuL2ZvbGRfbGluZSIpLkZvbGRMaW5lLHM9ZSgiLi9mb2xkIikuRm9sZCxvPWUoIi4uL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcjt0LkZvbGRpbmc9dX0pLGFjZS5kZWZpbmUoImFjZS9lZGl0X3Nlc3Npb24vYnJhY2tldF9tYXRjaCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS90b2tlbl9pdGVyYXRvciIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcygpe3RoaXMuZmluZE1hdGNoaW5nQnJhY2tldD1mdW5jdGlvbihlLHQpe2lmKGUuY29sdW1uPT0wKXJldHVybiBudWxsO3ZhciBuPXR8fHRoaXMuZ2V0TGluZShlLnJvdykuY2hhckF0KGUuY29sdW1uLTEpO2lmKG49PSIiKXJldHVybiBudWxsO3ZhciByPW4ubWF0Y2goLyhbXChcW1x7XSl8KFtcKVxdXH1dKS8pO3JldHVybiByP3JbMV0/dGhpcy4kZmluZENsb3NpbmdCcmFja2V0KHJbMV0sZSk6dGhpcy4kZmluZE9wZW5pbmdCcmFja2V0KHJbMl0sZSk6bnVsbH0sdGhpcy5nZXRCcmFja2V0UmFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRMaW5lKGUucm93KSxuPSEwLHIscz10LmNoYXJBdChlLmNvbHVtbi0xKSxvPXMmJnMubWF0Y2goLyhbXChcW1x7XSl8KFtcKVxdXH1dKS8pO298fChzPXQuY2hhckF0KGUuY29sdW1uKSxlPXtyb3c6ZS5yb3csY29sdW1uOmUuY29sdW1uKzF9LG89cyYmcy5tYXRjaCgvKFtcKFxbXHtdKXwoW1wpXF1cfV0pLyksbj0hMSk7aWYoIW8pcmV0dXJuIG51bGw7aWYob1sxXSl7dmFyIHU9dGhpcy4kZmluZENsb3NpbmdCcmFja2V0KG9bMV0sZSk7aWYoIXUpcmV0dXJuIG51bGw7cj1pLmZyb21Qb2ludHMoZSx1KSxufHwoci5lbmQuY29sdW1uKyssci5zdGFydC5jb2x1bW4tLSksci5jdXJzb3I9ci5lbmR9ZWxzZXt2YXIgdT10aGlzLiRmaW5kT3BlbmluZ0JyYWNrZXQob1syXSxlKTtpZighdSlyZXR1cm4gbnVsbDtyPWkuZnJvbVBvaW50cyh1LGUpLG58fChyLnN0YXJ0LmNvbHVtbisrLHIuZW5kLmNvbHVtbi0tKSxyLmN1cnNvcj1yLnN0YXJ0fXJldHVybiByfSx0aGlzLiRicmFja2V0cz17IikiOiIoIiwiKCI6IikiLCJdIjoiWyIsIlsiOiJdIiwieyI6In0iLCJ9IjoieyIsIjwiOiI+IiwiPiI6IjwifSx0aGlzLiRmaW5kT3BlbmluZ0JyYWNrZXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXMuJGJyYWNrZXRzW2VdLHM9MSxvPW5ldyByKHRoaXMsdC5yb3csdC5jb2x1bW4pLHU9by5nZXRDdXJyZW50VG9rZW4oKTt1fHwodT1vLnN0ZXBGb3J3YXJkKCkpO2lmKCF1KXJldHVybjtufHwobj1uZXcgUmVnRXhwKCIoXFwuPyIrdS50eXBlLnJlcGxhY2UoIi4iLCJcXC4iKS5yZXBsYWNlKCJycGFyZW4iLCIucGFyZW4iKS5yZXBsYWNlKC9cYig/OmVuZClcYi8sIig/OnN0YXJ0fGJlZ2lufGVuZCkiKSsiKSsiKSk7dmFyIGE9dC5jb2x1bW4tby5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKS0yLGY9dS52YWx1ZTtmb3IoOzspe3doaWxlKGE+PTApe3ZhciBsPWYuY2hhckF0KGEpO2lmKGw9PWkpe3MtPTE7aWYocz09MClyZXR1cm57cm93Om8uZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmErby5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKX19ZWxzZSBsPT1lJiYocys9MSk7YS09MX1kbyB1PW8uc3RlcEJhY2t3YXJkKCk7d2hpbGUodSYmIW4udGVzdCh1LnR5cGUpKTtpZih1PT1udWxsKWJyZWFrO2Y9dS52YWx1ZSxhPWYubGVuZ3RoLTF9cmV0dXJuIG51bGx9LHRoaXMuJGZpbmRDbG9zaW5nQnJhY2tldD1mdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcy4kYnJhY2tldHNbZV0scz0xLG89bmV3IHIodGhpcyx0LnJvdyx0LmNvbHVtbiksdT1vLmdldEN1cnJlbnRUb2tlbigpO3V8fCh1PW8uc3RlcEZvcndhcmQoKSk7aWYoIXUpcmV0dXJuO258fChuPW5ldyBSZWdFeHAoIihcXC4/Iit1LnR5cGUucmVwbGFjZSgiLiIsIlxcLiIpLnJlcGxhY2UoImxwYXJlbiIsIi5wYXJlbiIpLnJlcGxhY2UoL1xiKD86c3RhcnR8YmVnaW4pXGIvLCIoPzpzdGFydHxiZWdpbnxlbmQpIikrIikrIikpO3ZhciBhPXQuY29sdW1uLW8uZ2V0Q3VycmVudFRva2VuQ29sdW1uKCk7Zm9yKDs7KXt2YXIgZj11LnZhbHVlLGw9Zi5sZW5ndGg7d2hpbGUoYTxsKXt2YXIgYz1mLmNoYXJBdChhKTtpZihjPT1pKXtzLT0xO2lmKHM9PTApcmV0dXJue3JvdzpvLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphK28uZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9fWVsc2UgYz09ZSYmKHMrPTEpO2ErPTF9ZG8gdT1vLnN0ZXBGb3J3YXJkKCk7d2hpbGUodSYmIW4udGVzdCh1LnR5cGUpKTtpZih1PT1udWxsKWJyZWFrO2E9MH1yZXR1cm4gbnVsbH19dmFyIHI9ZSgiLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yLGk9ZSgiLi4vcmFuZ2UiKS5SYW5nZTt0LkJyYWNrZXRNYXRjaD1zfSksYWNlLmRlZmluZSgiYWNlL2VkaXRfc2Vzc2lvbiIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2JpZGloYW5kbGVyIiwiYWNlL2NvbmZpZyIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9zZWxlY3Rpb24iLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3JhbmdlIiwiYWNlL2RvY3VtZW50IiwiYWNlL2JhY2tncm91bmRfdG9rZW5pemVyIiwiYWNlL3NlYXJjaF9oaWdobGlnaHQiLCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGRpbmciLCJhY2UvZWRpdF9zZXNzaW9uL2JyYWNrZXRfbWF0Y2giXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvbGFuZyIpLHM9ZSgiLi9iaWRpaGFuZGxlciIpLkJpZGlIYW5kbGVyLG89ZSgiLi9jb25maWciKSx1PWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsYT1lKCIuL3NlbGVjdGlvbiIpLlNlbGVjdGlvbixmPWUoIi4vbW9kZS90ZXh0IikuTW9kZSxsPWUoIi4vcmFuZ2UiKS5SYW5nZSxjPWUoIi4vZG9jdW1lbnQiKS5Eb2N1bWVudCxoPWUoIi4vYmFja2dyb3VuZF90b2tlbml6ZXIiKS5CYWNrZ3JvdW5kVG9rZW5pemVyLHA9ZSgiLi9zZWFyY2hfaGlnaGxpZ2h0IikuU2VhcmNoSGlnaGxpZ2h0LGQ9ZnVuY3Rpb24oZSx0KXt0aGlzLiRicmVha3BvaW50cz1bXSx0aGlzLiRkZWNvcmF0aW9ucz1bXSx0aGlzLiRmcm9udE1hcmtlcnM9e30sdGhpcy4kYmFja01hcmtlcnM9e30sdGhpcy4kbWFya2VySWQ9MSx0aGlzLiR1bmRvU2VsZWN0PSEwLHRoaXMuJGZvbGREYXRhPVtdLHRoaXMuaWQ9InNlc3Npb24iKyArK2QuJHVpZCx0aGlzLiRmb2xkRGF0YS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmpvaW4oIlxuIil9LHRoaXMub24oImNoYW5nZUZvbGQiLHRoaXMub25DaGFuZ2VGb2xkLmJpbmQodGhpcykpLHRoaXMuJG9uQ2hhbmdlPXRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fCFlLmdldExpbmUpZT1uZXcgYyhlKTt0aGlzLnNldERvY3VtZW50KGUpLHRoaXMuc2VsZWN0aW9uPW5ldyBhKHRoaXMpLHRoaXMuJGJpZGlIYW5kbGVyPW5ldyBzKHRoaXMpLG8ucmVzZXRPcHRpb25zKHRoaXMpLHRoaXMuc2V0TW9kZSh0KSxvLl9zaWduYWwoInNlc3Npb24iLHRoaXMpfTtkLiR1aWQ9MCxmdW5jdGlvbigpe2Z1bmN0aW9uIG0oZSl7cmV0dXJuIGU8NDM1Mj8hMTplPj00MzUyJiZlPD00NDQ3fHxlPj00NTE1JiZlPD00NTE5fHxlPj00NjAyJiZlPD00NjA3fHxlPj05MDAxJiZlPD05MDAyfHxlPj0xMTkwNCYmZTw9MTE5Mjl8fGU+PTExOTMxJiZlPD0xMjAxOXx8ZT49MTIwMzImJmU8PTEyMjQ1fHxlPj0xMjI3MiYmZTw9MTIyODN8fGU+PTEyMjg4JiZlPD0xMjM1MHx8ZT49MTIzNTMmJmU8PTEyNDM4fHxlPj0xMjQ0MSYmZTw9MTI1NDN8fGU+PTEyNTQ5JiZlPD0xMjU4OXx8ZT49MTI1OTMmJmU8PTEyNjg2fHxlPj0xMjY4OCYmZTw9MTI3MzB8fGU+PTEyNzM2JiZlPD0xMjc3MXx8ZT49MTI3ODQmJmU8PTEyODMwfHxlPj0xMjgzMiYmZTw9MTI4NzF8fGU+PTEyODgwJiZlPD0xMzA1NHx8ZT49MTMwNTYmJmU8PTE5OTAzfHxlPj0xOTk2OCYmZTw9NDIxMjR8fGU+PTQyMTI4JiZlPD00MjE4Mnx8ZT49NDMzNjAmJmU8PTQzMzg4fHxlPj00NDAzMiYmZTw9NTUyMDN8fGU+PTU1MjE2JiZlPD01NTIzOHx8ZT49NTUyNDMmJmU8PTU1MjkxfHxlPj02Mzc0NCYmZTw9NjQyNTV8fGU+PTY1MDQwJiZlPD02NTA0OXx8ZT49NjUwNzImJmU8PTY1MTA2fHxlPj02NTEwOCYmZTw9NjUxMjZ8fGU+PTY1MTI4JiZlPD02NTEzMXx8ZT49NjUyODEmJmU8PTY1Mzc2fHxlPj02NTUwNCYmZTw9NjU1MTB9ci5pbXBsZW1lbnQodGhpcyx1KSx0aGlzLnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3RoaXMuZG9jJiZ0aGlzLmRvYy5yZW1vdmVMaXN0ZW5lcigiY2hhbmdlIix0aGlzLiRvbkNoYW5nZSksdGhpcy5kb2M9ZSxlLm9uKCJjaGFuZ2UiLHRoaXMuJG9uQ2hhbmdlKSx0aGlzLmJnVG9rZW5pemVyJiZ0aGlzLmJnVG9rZW5pemVyLnNldERvY3VtZW50KHRoaXMuZ2V0RG9jdW1lbnQoKSksdGhpcy5yZXNldENhY2hlcygpfSx0aGlzLmdldERvY3VtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jfSx0aGlzLiRyZXNldFJvd0NhY2hlPWZ1bmN0aW9uKGUpe2lmKCFlKXt0aGlzLiRkb2NSb3dDYWNoZT1bXSx0aGlzLiRzY3JlZW5Sb3dDYWNoZT1bXTtyZXR1cm59dmFyIHQ9dGhpcy4kZG9jUm93Q2FjaGUubGVuZ3RoLG49dGhpcy4kZ2V0Um93Q2FjaGVJbmRleCh0aGlzLiRkb2NSb3dDYWNoZSxlKSsxO3Q+biYmKHRoaXMuJGRvY1Jvd0NhY2hlLnNwbGljZShuLHQpLHRoaXMuJHNjcmVlblJvd0NhY2hlLnNwbGljZShuLHQpKX0sdGhpcy4kZ2V0Um93Q2FjaGVJbmRleD1mdW5jdGlvbihlLHQpe3ZhciBuPTAscj1lLmxlbmd0aC0xO3doaWxlKG48PXIpe3ZhciBpPW4rcj4+MSxzPWVbaV07aWYodD5zKW49aSsxO2Vsc2V7aWYoISh0PHMpKXJldHVybiBpO3I9aS0xfX1yZXR1cm4gbi0xfSx0aGlzLnJlc2V0Q2FjaGVzPWZ1bmN0aW9uKCl7dGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kd3JhcERhdGE9W10sdGhpcy4kcm93TGVuZ3RoQ2FjaGU9W10sdGhpcy4kcmVzZXRSb3dDYWNoZSgwKSx0aGlzLmJnVG9rZW5pemVyJiZ0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KDApfSx0aGlzLm9uQ2hhbmdlRm9sZD1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7dGhpcy4kcmVzZXRSb3dDYWNoZSh0LnN0YXJ0LnJvdyl9LHRoaXMub25DaGFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kYmlkaUhhbmRsZXIub25DaGFuZ2UoZSksdGhpcy4kcmVzZXRSb3dDYWNoZShlLnN0YXJ0LnJvdyk7dmFyIHQ9dGhpcy4kdXBkYXRlSW50ZXJuYWxEYXRhT25DaGFuZ2UoZSk7IXRoaXMuJGZyb21VbmRvJiZ0aGlzLiR1bmRvTWFuYWdlciYmKHQmJnQubGVuZ3RoJiYodGhpcy4kdW5kb01hbmFnZXIuYWRkKHthY3Rpb246InJlbW92ZUZvbGRzIixmb2xkczp0fSx0aGlzLm1lcmdlVW5kb0RlbHRhcyksdGhpcy5tZXJnZVVuZG9EZWx0YXM9ITApLHRoaXMuJHVuZG9NYW5hZ2VyLmFkZChlLHRoaXMubWVyZ2VVbmRvRGVsdGFzKSx0aGlzLm1lcmdlVW5kb0RlbHRhcz0hMCx0aGlzLiRpbmZvcm1VbmRvTWFuYWdlci5zY2hlZHVsZSgpKSx0aGlzLmJnVG9rZW5pemVyJiZ0aGlzLmJnVG9rZW5pemVyLiR1cGRhdGVPbkNoYW5nZShlKSx0aGlzLl9zaWduYWwoImNoYW5nZSIsZSl9LHRoaXMuc2V0VmFsdWU9ZnVuY3Rpb24oZSl7dGhpcy5kb2Muc2V0VmFsdWUoZSksdGhpcy5zZWxlY3Rpb24ubW92ZVRvKDAsMCksdGhpcy4kcmVzZXRSb3dDYWNoZSgwKSx0aGlzLnNldFVuZG9NYW5hZ2VyKHRoaXMuJHVuZG9NYW5hZ2VyKSx0aGlzLmdldFVuZG9NYW5hZ2VyKCkucmVzZXQoKX0sdGhpcy5nZXRWYWx1ZT10aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jLmdldFZhbHVlKCl9LHRoaXMuZ2V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9ufSx0aGlzLmdldFN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJnVG9rZW5pemVyLmdldFN0YXRlKGUpfSx0aGlzLmdldFRva2Vucz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5iZ1Rva2VuaXplci5nZXRUb2tlbnMoZSl9LHRoaXMuZ2V0VG9rZW5BdD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYmdUb2tlbml6ZXIuZ2V0VG9rZW5zKGUpLHIsaT0wO2lmKHQ9PW51bGwpe3ZhciBzPW4ubGVuZ3RoLTE7aT10aGlzLmdldExpbmUoZSkubGVuZ3RofWVsc2UgZm9yKHZhciBzPTA7czxuLmxlbmd0aDtzKyspe2krPW5bc10udmFsdWUubGVuZ3RoO2lmKGk+PXQpYnJlYWt9cmV0dXJuIHI9bltzXSxyPyhyLmluZGV4PXMsci5zdGFydD1pLXIudmFsdWUubGVuZ3RoLHIpOm51bGx9LHRoaXMuc2V0VW5kb01hbmFnZXI9ZnVuY3Rpb24oZSl7dGhpcy4kdW5kb01hbmFnZXI9ZSx0aGlzLiRpbmZvcm1VbmRvTWFuYWdlciYmdGhpcy4kaW5mb3JtVW5kb01hbmFnZXIuY2FuY2VsKCk7aWYoZSl7dmFyIHQ9dGhpcztlLmFkZFNlc3Npb24odGhpcyksdGhpcy4kc3luY0luZm9ybVVuZG9NYW5hZ2VyPWZ1bmN0aW9uKCl7dC4kaW5mb3JtVW5kb01hbmFnZXIuY2FuY2VsKCksdC5tZXJnZVVuZG9EZWx0YXM9ITF9LHRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyPWkuZGVsYXllZENhbGwodGhpcy4kc3luY0luZm9ybVVuZG9NYW5hZ2VyKX1lbHNlIHRoaXMuJHN5bmNJbmZvcm1VbmRvTWFuYWdlcj1mdW5jdGlvbigpe319LHRoaXMubWFya1VuZG9Hcm91cD1mdW5jdGlvbigpe3RoaXMuJHN5bmNJbmZvcm1VbmRvTWFuYWdlciYmdGhpcy4kc3luY0luZm9ybVVuZG9NYW5hZ2VyKCl9LHRoaXMuJGRlZmF1bHRVbmRvTWFuYWdlcj17dW5kbzpmdW5jdGlvbigpe30scmVkbzpmdW5jdGlvbigpe30saGFzVW5kbzpmdW5jdGlvbigpe30saGFzUmVkbzpmdW5jdGlvbigpe30scmVzZXQ6ZnVuY3Rpb24oKXt9LGFkZDpmdW5jdGlvbigpe30sYWRkU2VsZWN0aW9uOmZ1bmN0aW9uKCl7fSxzdGFydE5ld0dyb3VwOmZ1bmN0aW9uKCl7fSxhZGRTZXNzaW9uOmZ1bmN0aW9uKCl7fX0sdGhpcy5nZXRVbmRvTWFuYWdlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1bmRvTWFuYWdlcnx8dGhpcy4kZGVmYXVsdFVuZG9NYW5hZ2VyfSx0aGlzLmdldFRhYlN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFVzZVNvZnRUYWJzKCk/aS5zdHJpbmdSZXBlYXQoIiAiLHRoaXMuZ2V0VGFiU2l6ZSgpKToiCSJ9LHRoaXMuc2V0VXNlU29mdFRhYnM9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInVzZVNvZnRUYWJzIixlKX0sdGhpcy5nZXRVc2VTb2Z0VGFicz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1c2VTb2Z0VGFicyYmIXRoaXMuJG1vZGUuJGluZGVudFdpdGhUYWJzfSx0aGlzLnNldFRhYlNpemU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInRhYlNpemUiLGUpfSx0aGlzLmdldFRhYlNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdGFiU2l6ZX0sdGhpcy5pc1RhYlN0b3A9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJHVzZVNvZnRUYWJzJiZlLmNvbHVtbiV0aGlzLiR0YWJTaXplPT09MH0sdGhpcy5zZXROYXZpZ2F0ZVdpdGhpblNvZnRUYWJzPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJuYXZpZ2F0ZVdpdGhpblNvZnRUYWJzIixlKX0sdGhpcy5nZXROYXZpZ2F0ZVdpdGhpblNvZnRUYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG5hdmlnYXRlV2l0aGluU29mdFRhYnN9LHRoaXMuJG92ZXJ3cml0ZT0hMSx0aGlzLnNldE92ZXJ3cml0ZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigib3ZlcndyaXRlIixlKX0sdGhpcy5nZXRPdmVyd3JpdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kb3ZlcndyaXRlfSx0aGlzLnRvZ2dsZU92ZXJ3cml0ZT1mdW5jdGlvbigpe3RoaXMuc2V0T3ZlcndyaXRlKCF0aGlzLiRvdmVyd3JpdGUpfSx0aGlzLmFkZEd1dHRlckRlY29yYXRpb249ZnVuY3Rpb24oZSx0KXt0aGlzLiRkZWNvcmF0aW9uc1tlXXx8KHRoaXMuJGRlY29yYXRpb25zW2VdPSIiKSx0aGlzLiRkZWNvcmF0aW9uc1tlXSs9IiAiK3QsdGhpcy5fc2lnbmFsKCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbj1mdW5jdGlvbihlLHQpe3RoaXMuJGRlY29yYXRpb25zW2VdPSh0aGlzLiRkZWNvcmF0aW9uc1tlXXx8IiIpLnJlcGxhY2UoIiAiK3QsIiIpLHRoaXMuX3NpZ25hbCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLmdldEJyZWFrcG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGJyZWFrcG9pbnRzfSx0aGlzLnNldEJyZWFrcG9pbnRzPWZ1bmN0aW9uKGUpe3RoaXMuJGJyZWFrcG9pbnRzPVtdO2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXRoaXMuJGJyZWFrcG9pbnRzW2VbdF1dPSJhY2VfYnJlYWtwb2ludCI7dGhpcy5fc2lnbmFsKCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMuY2xlYXJCcmVha3BvaW50cz1mdW5jdGlvbigpe3RoaXMuJGJyZWFrcG9pbnRzPVtdLHRoaXMuX3NpZ25hbCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLnNldEJyZWFrcG9pbnQ9ZnVuY3Rpb24oZSx0KXt0PT09dW5kZWZpbmVkJiYodD0iYWNlX2JyZWFrcG9pbnQiKSx0P3RoaXMuJGJyZWFrcG9pbnRzW2VdPXQ6ZGVsZXRlIHRoaXMuJGJyZWFrcG9pbnRzW2VdLHRoaXMuX3NpZ25hbCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLmNsZWFyQnJlYWtwb2ludD1mdW5jdGlvbihlKXtkZWxldGUgdGhpcy4kYnJlYWtwb2ludHNbZV0sdGhpcy5fc2lnbmFsKCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMuYWRkTWFya2VyPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuJG1hcmtlcklkKysscz17cmFuZ2U6ZSx0eXBlOm58fCJsaW5lIixyZW5kZXJlcjp0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uOm51bGwsY2xheno6dCxpbkZyb250OiEhcixpZDppfTtyZXR1cm4gcj8odGhpcy4kZnJvbnRNYXJrZXJzW2ldPXMsdGhpcy5fc2lnbmFsKCJjaGFuZ2VGcm9udE1hcmtlciIpKToodGhpcy4kYmFja01hcmtlcnNbaV09cyx0aGlzLl9zaWduYWwoImNoYW5nZUJhY2tNYXJrZXIiKSksaX0sdGhpcy5hZGREeW5hbWljTWFya2VyPWZ1bmN0aW9uKGUsdCl7aWYoIWUudXBkYXRlKXJldHVybjt2YXIgbj10aGlzLiRtYXJrZXJJZCsrO3JldHVybiBlLmlkPW4sZS5pbkZyb250PSEhdCx0Pyh0aGlzLiRmcm9udE1hcmtlcnNbbl09ZSx0aGlzLl9zaWduYWwoImNoYW5nZUZyb250TWFya2VyIikpOih0aGlzLiRiYWNrTWFya2Vyc1tuXT1lLHRoaXMuX3NpZ25hbCgiY2hhbmdlQmFja01hcmtlciIpKSxlfSx0aGlzLnJlbW92ZU1hcmtlcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRmcm9udE1hcmtlcnNbZV18fHRoaXMuJGJhY2tNYXJrZXJzW2VdO2lmKCF0KXJldHVybjt2YXIgbj10LmluRnJvbnQ/dGhpcy4kZnJvbnRNYXJrZXJzOnRoaXMuJGJhY2tNYXJrZXJzO2RlbGV0ZSBuW2VdLHRoaXMuX3NpZ25hbCh0LmluRnJvbnQ/ImNoYW5nZUZyb250TWFya2VyIjoiY2hhbmdlQmFja01hcmtlciIpfSx0aGlzLmdldE1hcmtlcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/dGhpcy4kZnJvbnRNYXJrZXJzOnRoaXMuJGJhY2tNYXJrZXJzfSx0aGlzLmhpZ2hsaWdodD1mdW5jdGlvbihlKXtpZighdGhpcy4kc2VhcmNoSGlnaGxpZ2h0KXt2YXIgdD1uZXcgcChudWxsLCJhY2Vfc2VsZWN0ZWQtd29yZCIsInRleHQiKTt0aGlzLiRzZWFyY2hIaWdobGlnaHQ9dGhpcy5hZGREeW5hbWljTWFya2VyKHQpfXRoaXMuJHNlYXJjaEhpZ2hsaWdodC5zZXRSZWdleHAoZSl9LHRoaXMuaGlnaGxpZ2h0TGluZXM9ZnVuY3Rpb24oZSx0LG4scil7dHlwZW9mIHQhPSJudW1iZXIiJiYobj10LHQ9ZSksbnx8KG49ImFjZV9zdGVwIik7dmFyIGk9bmV3IGwoZSwwLHQsSW5maW5pdHkpO3JldHVybiBpLmlkPXRoaXMuYWRkTWFya2VyKGksbiwiZnVsbExpbmUiLHIpLGl9LHRoaXMuc2V0QW5ub3RhdGlvbnM9ZnVuY3Rpb24oZSl7dGhpcy4kYW5ub3RhdGlvbnM9ZSx0aGlzLl9zaWduYWwoImNoYW5nZUFubm90YXRpb24iLHt9KX0sdGhpcy5nZXRBbm5vdGF0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRhbm5vdGF0aW9uc3x8W119LHRoaXMuY2xlYXJBbm5vdGF0aW9ucz1mdW5jdGlvbigpe3RoaXMuc2V0QW5ub3RhdGlvbnMoW10pfSx0aGlzLiRkZXRlY3ROZXdMaW5lPWZ1bmN0aW9uKGUpe3ZhciB0PWUubWF0Y2goL14uKj8oXHI/XG4pL20pO3Q/dGhpcy4kYXV0b05ld0xpbmU9dFsxXTp0aGlzLiRhdXRvTmV3TGluZT0iXG4ifSx0aGlzLmdldFdvcmRSYW5nZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0TGluZShlKSxyPSExO3Q+MCYmKHI9ISFuLmNoYXJBdCh0LTEpLm1hdGNoKHRoaXMudG9rZW5SZSkpLHJ8fChyPSEhbi5jaGFyQXQodCkubWF0Y2godGhpcy50b2tlblJlKSk7aWYocil2YXIgaT10aGlzLnRva2VuUmU7ZWxzZSBpZigvXlxzKyQvLnRlc3Qobi5zbGljZSh0LTEsdCsxKSkpdmFyIGk9L1xzLztlbHNlIHZhciBpPXRoaXMubm9uVG9rZW5SZTt2YXIgcz10O2lmKHM+MCl7ZG8gcy0tO3doaWxlKHM+PTAmJm4uY2hhckF0KHMpLm1hdGNoKGkpKTtzKyt9dmFyIG89dDt3aGlsZShvPG4ubGVuZ3RoJiZuLmNoYXJBdChvKS5tYXRjaChpKSlvKys7cmV0dXJuIG5ldyBsKGUscyxlLG8pfSx0aGlzLmdldEFXb3JkUmFuZ2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldFdvcmRSYW5nZShlLHQpLHI9dGhpcy5nZXRMaW5lKG4uZW5kLnJvdyk7d2hpbGUoci5jaGFyQXQobi5lbmQuY29sdW1uKS5tYXRjaCgvWyBcdF0vKSluLmVuZC5jb2x1bW4rPTE7cmV0dXJuIG59LHRoaXMuc2V0TmV3TGluZU1vZGU9ZnVuY3Rpb24oZSl7dGhpcy5kb2Muc2V0TmV3TGluZU1vZGUoZSl9LHRoaXMuZ2V0TmV3TGluZU1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2MuZ2V0TmV3TGluZU1vZGUoKX0sdGhpcy5zZXRVc2VXb3JrZXI9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInVzZVdvcmtlciIsZSl9LHRoaXMuZ2V0VXNlV29ya2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHVzZVdvcmtlcn0sdGhpcy5vblJlbG9hZFRva2VuaXplcj1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7dGhpcy5iZ1Rva2VuaXplci5zdGFydCh0LmZpcnN0KSx0aGlzLl9zaWduYWwoInRva2VuaXplclVwZGF0ZSIsZSl9LHRoaXMuJG1vZGVzPW8uJG1vZGVzLHRoaXMuJG1vZGU9bnVsbCx0aGlzLiRtb2RlSWQ9bnVsbCx0aGlzLnNldE1vZGU9ZnVuY3Rpb24oZSx0KXtpZihlJiZ0eXBlb2YgZT09Im9iamVjdCIpe2lmKGUuZ2V0VG9rZW5pemVyKXJldHVybiB0aGlzLiRvbkNoYW5nZU1vZGUoZSk7dmFyIG49ZSxyPW4ucGF0aH1lbHNlIHI9ZXx8ImFjZS9tb2RlL3RleHQiO3RoaXMuJG1vZGVzWyJhY2UvbW9kZS90ZXh0Il18fCh0aGlzLiRtb2Rlc1siYWNlL21vZGUvdGV4dCJdPW5ldyBmKTtpZih0aGlzLiRtb2Rlc1tyXSYmIW4pe3RoaXMuJG9uQ2hhbmdlTW9kZSh0aGlzLiRtb2Rlc1tyXSksdCYmdCgpO3JldHVybn10aGlzLiRtb2RlSWQ9cixvLmxvYWRNb2R1bGUoWyJtb2RlIixyXSxmdW5jdGlvbihlKXtpZih0aGlzLiRtb2RlSWQhPT1yKXJldHVybiB0JiZ0KCk7dGhpcy4kbW9kZXNbcl0mJiFuP3RoaXMuJG9uQ2hhbmdlTW9kZSh0aGlzLiRtb2Rlc1tyXSk6ZSYmZS5Nb2RlJiYoZT1uZXcgZS5Nb2RlKG4pLG58fCh0aGlzLiRtb2Rlc1tyXT1lLGUuJGlkPXIpLHRoaXMuJG9uQ2hhbmdlTW9kZShlKSksdCYmdCgpfS5iaW5kKHRoaXMpKSx0aGlzLiRtb2RlfHx0aGlzLiRvbkNoYW5nZU1vZGUodGhpcy4kbW9kZXNbImFjZS9tb2RlL3RleHQiXSwhMCl9LHRoaXMuJG9uQ2hhbmdlTW9kZT1mdW5jdGlvbihlLHQpe3R8fCh0aGlzLiRtb2RlSWQ9ZS4kaWQpO2lmKHRoaXMuJG1vZGU9PT1lKXJldHVybjt0aGlzLiRtb2RlPWUsdGhpcy4kc3RvcFdvcmtlcigpLHRoaXMuJHVzZVdvcmtlciYmdGhpcy4kc3RhcnRXb3JrZXIoKTt2YXIgbj1lLmdldFRva2VuaXplcigpO2lmKG4uYWRkRXZlbnRMaXN0ZW5lciE9PXVuZGVmaW5lZCl7dmFyIHI9dGhpcy5vblJlbG9hZFRva2VuaXplci5iaW5kKHRoaXMpO24uYWRkRXZlbnRMaXN0ZW5lcigidXBkYXRlIixyKX1pZighdGhpcy5iZ1Rva2VuaXplcil7dGhpcy5iZ1Rva2VuaXplcj1uZXcgaChuKTt2YXIgaT10aGlzO3RoaXMuYmdUb2tlbml6ZXIuYWRkRXZlbnRMaXN0ZW5lcigidXBkYXRlIixmdW5jdGlvbihlKXtpLl9zaWduYWwoInRva2VuaXplclVwZGF0ZSIsZSl9KX1lbHNlIHRoaXMuYmdUb2tlbml6ZXIuc2V0VG9rZW5pemVyKG4pO3RoaXMuYmdUb2tlbml6ZXIuc2V0RG9jdW1lbnQodGhpcy5nZXREb2N1bWVudCgpKSx0aGlzLnRva2VuUmU9ZS50b2tlblJlLHRoaXMubm9uVG9rZW5SZT1lLm5vblRva2VuUmUsdHx8KGUuYXR0YWNoVG9TZXNzaW9uJiZlLmF0dGFjaFRvU2Vzc2lvbih0aGlzKSx0aGlzLiRvcHRpb25zLndyYXBNZXRob2Quc2V0LmNhbGwodGhpcyx0aGlzLiR3cmFwTWV0aG9kKSx0aGlzLiRzZXRGb2xkaW5nKGUuZm9sZGluZ1J1bGVzKSx0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KDApLHRoaXMuX2VtaXQoImNoYW5nZU1vZGUiKSl9LHRoaXMuJHN0b3BXb3JrZXI9ZnVuY3Rpb24oKXt0aGlzLiR3b3JrZXImJih0aGlzLiR3b3JrZXIudGVybWluYXRlKCksdGhpcy4kd29ya2VyPW51bGwpfSx0aGlzLiRzdGFydFdvcmtlcj1mdW5jdGlvbigpe3RyeXt0aGlzLiR3b3JrZXI9dGhpcy4kbW9kZS5jcmVhdGVXb3JrZXIodGhpcyl9Y2F0Y2goZSl7by53YXJuKCJDb3VsZCBub3QgbG9hZCB3b3JrZXIiLGUpLHRoaXMuJHdvcmtlcj1udWxsfX0sdGhpcy5nZXRNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG1vZGV9LHRoaXMuJHNjcm9sbFRvcD0wLHRoaXMuc2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJHNjcm9sbFRvcD09PWV8fGlzTmFOKGUpKXJldHVybjt0aGlzLiRzY3JvbGxUb3A9ZSx0aGlzLl9zaWduYWwoImNoYW5nZVNjcm9sbFRvcCIsZSl9LHRoaXMuZ2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNjcm9sbFRvcH0sdGhpcy4kc2Nyb2xsTGVmdD0wLHRoaXMuc2V0U2Nyb2xsTGVmdD1mdW5jdGlvbihlKXtpZih0aGlzLiRzY3JvbGxMZWZ0PT09ZXx8aXNOYU4oZSkpcmV0dXJuO3RoaXMuJHNjcm9sbExlZnQ9ZSx0aGlzLl9zaWduYWwoImNoYW5nZVNjcm9sbExlZnQiLGUpfSx0aGlzLmdldFNjcm9sbExlZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2Nyb2xsTGVmdH0sdGhpcy5nZXRTY3JlZW5XaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRjb21wdXRlV2lkdGgoKSx0aGlzLmxpbmVXaWRnZXRzP01hdGgubWF4KHRoaXMuZ2V0TGluZVdpZGdldE1heFdpZHRoKCksdGhpcy5zY3JlZW5XaWR0aCk6dGhpcy5zY3JlZW5XaWR0aH0sdGhpcy5nZXRMaW5lV2lkZ2V0TWF4V2lkdGg9ZnVuY3Rpb24oKXtpZih0aGlzLmxpbmVXaWRnZXRzV2lkdGghPW51bGwpcmV0dXJuIHRoaXMubGluZVdpZGdldHNXaWR0aDt2YXIgZT0wO3JldHVybiB0aGlzLmxpbmVXaWRnZXRzLmZvckVhY2goZnVuY3Rpb24odCl7dCYmdC5zY3JlZW5XaWR0aD5lJiYoZT10LnNjcmVlbldpZHRoKX0pLHRoaXMubGluZVdpZGdldFdpZHRoPWV9LHRoaXMuJGNvbXB1dGVXaWR0aD1mdW5jdGlvbihlKXtpZih0aGlzLiRtb2RpZmllZHx8ZSl7dGhpcy4kbW9kaWZpZWQ9ITE7aWYodGhpcy4kdXNlV3JhcE1vZGUpcmV0dXJuIHRoaXMuc2NyZWVuV2lkdGg9dGhpcy4kd3JhcExpbWl0O3ZhciB0PXRoaXMuZG9jLmdldEFsbExpbmVzKCksbj10aGlzLiRyb3dMZW5ndGhDYWNoZSxyPTAsaT0wLHM9dGhpcy4kZm9sZERhdGFbaV0sbz1zP3Muc3RhcnQucm93OkluZmluaXR5LHU9dC5sZW5ndGg7Zm9yKHZhciBhPTA7YTx1O2ErKyl7aWYoYT5vKXthPXMuZW5kLnJvdysxO2lmKGE+PXUpYnJlYWs7cz10aGlzLiRmb2xkRGF0YVtpKytdLG89cz9zLnN0YXJ0LnJvdzpJbmZpbml0eX1uW2FdPT1udWxsJiYoblthXT10aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aCh0W2FdKVswXSksblthXT5yJiYocj1uW2FdKX10aGlzLnNjcmVlbldpZHRoPXJ9fSx0aGlzLmdldExpbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZG9jLmdldExpbmUoZSl9LHRoaXMuZ2V0TGluZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5kb2MuZ2V0TGluZXMoZSx0KX0sdGhpcy5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2MuZ2V0TGVuZ3RoKCl9LHRoaXMuZ2V0VGV4dFJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRvYy5nZXRUZXh0UmFuZ2UoZXx8dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSl9LHRoaXMuaW5zZXJ0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZG9jLmluc2VydChlLHQpfSx0aGlzLnJlbW92ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5kb2MucmVtb3ZlKGUpfSx0aGlzLnJlbW92ZUZ1bGxMaW5lcz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmRvYy5yZW1vdmVGdWxsTGluZXMoZSx0KX0sdGhpcy51bmRvQ2hhbmdlcz1mdW5jdGlvbihlLHQpe2lmKCFlLmxlbmd0aClyZXR1cm47dGhpcy4kZnJvbVVuZG89ITA7Zm9yKHZhciBuPWUubGVuZ3RoLTE7biE9LTE7bi0tKXt2YXIgcj1lW25dO3IuYWN0aW9uPT0iaW5zZXJ0Inx8ci5hY3Rpb249PSJyZW1vdmUiP3RoaXMuZG9jLnJldmVydERlbHRhKHIpOnIuZm9sZHMmJnRoaXMuYWRkRm9sZHMoci5mb2xkcyl9IXQmJnRoaXMuJHVuZG9TZWxlY3QmJihlLnNlbGVjdGlvbkJlZm9yZT90aGlzLnNlbGVjdGlvbi5mcm9tSlNPTihlLnNlbGVjdGlvbkJlZm9yZSk6dGhpcy5zZWxlY3Rpb24uc2V0UmFuZ2UodGhpcy4kZ2V0VW5kb1NlbGVjdGlvbihlLCEwKSkpLHRoaXMuJGZyb21VbmRvPSExfSx0aGlzLnJlZG9DaGFuZ2VzPWZ1bmN0aW9uKGUsdCl7aWYoIWUubGVuZ3RoKXJldHVybjt0aGlzLiRmcm9tVW5kbz0hMDtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTsoci5hY3Rpb249PSJpbnNlcnQifHxyLmFjdGlvbj09InJlbW92ZSIpJiZ0aGlzLmRvYy5hcHBseURlbHRhKHIpfSF0JiZ0aGlzLiR1bmRvU2VsZWN0JiYoZS5zZWxlY3Rpb25BZnRlcj90aGlzLnNlbGVjdGlvbi5mcm9tSlNPTihlLnNlbGVjdGlvbkFmdGVyKTp0aGlzLnNlbGVjdGlvbi5zZXRSYW5nZSh0aGlzLiRnZXRVbmRvU2VsZWN0aW9uKGUsITEpKSksdGhpcy4kZnJvbVVuZG89ITF9LHRoaXMuc2V0VW5kb1NlbGVjdD1mdW5jdGlvbihlKXt0aGlzLiR1bmRvU2VsZWN0PWV9LHRoaXMuJGdldFVuZG9TZWxlY3Rpb249ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiB0P2UuYWN0aW9uIT09Imluc2VydCI6ZS5hY3Rpb249PT0iaW5zZXJ0In12YXIgcixpLHM7Zm9yKHZhciBvPTA7bzxlLmxlbmd0aDtvKyspe3ZhciB1PWVbb107aWYoIXUuc3RhcnQpY29udGludWU7aWYoIXIpe24odSk/KHI9bC5mcm9tUG9pbnRzKHUuc3RhcnQsdS5lbmQpLHM9ITApOihyPWwuZnJvbVBvaW50cyh1LnN0YXJ0LHUuc3RhcnQpLHM9ITEpO2NvbnRpbnVlfW4odSk/KGk9dS5zdGFydCxyLmNvbXBhcmUoaS5yb3csaS5jb2x1bW4pPT0tMSYmci5zZXRTdGFydChpKSxpPXUuZW5kLHIuY29tcGFyZShpLnJvdyxpLmNvbHVtbik9PTEmJnIuc2V0RW5kKGkpLHM9ITApOihpPXUuc3RhcnQsci5jb21wYXJlKGkucm93LGkuY29sdW1uKT09LTEmJihyPWwuZnJvbVBvaW50cyh1LnN0YXJ0LHUuc3RhcnQpKSxzPSExKX1yZXR1cm4gcn0sdGhpcy5yZXBsYWNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZG9jLnJlcGxhY2UoZSx0KX0sdGhpcy5tb3ZlVGV4dD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5nZXRUZXh0UmFuZ2UoZSksaT10aGlzLmdldEZvbGRzSW5SYW5nZShlKSxzPWwuZnJvbVBvaW50cyh0LHQpO2lmKCFuKXt0aGlzLnJlbW92ZShlKTt2YXIgbz1lLnN0YXJ0LnJvdy1lLmVuZC5yb3csdT1vPy1lLmVuZC5jb2x1bW46ZS5zdGFydC5jb2x1bW4tZS5lbmQuY29sdW1uO3UmJihzLnN0YXJ0LnJvdz09ZS5lbmQucm93JiZzLnN0YXJ0LmNvbHVtbj5lLmVuZC5jb2x1bW4mJihzLnN0YXJ0LmNvbHVtbis9dSkscy5lbmQucm93PT1lLmVuZC5yb3cmJnMuZW5kLmNvbHVtbj5lLmVuZC5jb2x1bW4mJihzLmVuZC5jb2x1bW4rPXUpKSxvJiZzLnN0YXJ0LnJvdz49ZS5lbmQucm93JiYocy5zdGFydC5yb3crPW8scy5lbmQucm93Kz1vKX1zLmVuZD10aGlzLmluc2VydChzLnN0YXJ0LHIpO2lmKGkubGVuZ3RoKXt2YXIgYT1lLnN0YXJ0LGY9cy5zdGFydCxvPWYucm93LWEucm93LHU9Zi5jb2x1bW4tYS5jb2x1bW47dGhpcy5hZGRGb2xkcyhpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZT1lLmNsb25lKCksZS5zdGFydC5yb3c9PWEucm93JiYoZS5zdGFydC5jb2x1bW4rPXUpLGUuZW5kLnJvdz09YS5yb3cmJihlLmVuZC5jb2x1bW4rPXUpLGUuc3RhcnQucm93Kz1vLGUuZW5kLnJvdys9byxlfSkpfXJldHVybiBzfSx0aGlzLmluZGVudFJvd3M9ZnVuY3Rpb24oZSx0LG4pe249bi5yZXBsYWNlKC9cdC9nLHRoaXMuZ2V0VGFiU3RyaW5nKCkpO2Zvcih2YXIgcj1lO3I8PXQ7cisrKXRoaXMuZG9jLmluc2VydEluTGluZSh7cm93OnIsY29sdW1uOjB9LG4pfSx0aGlzLm91dGRlbnRSb3dzPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY29sbGFwc2VSb3dzKCksbj1uZXcgbCgwLDAsMCwwKSxyPXRoaXMuZ2V0VGFiU2l6ZSgpO2Zvcih2YXIgaT10LnN0YXJ0LnJvdztpPD10LmVuZC5yb3c7KytpKXt2YXIgcz10aGlzLmdldExpbmUoaSk7bi5zdGFydC5yb3c9aSxuLmVuZC5yb3c9aTtmb3IodmFyIG89MDtvPHI7KytvKWlmKHMuY2hhckF0KG8pIT0iICIpYnJlYWs7bzxyJiZzLmNoYXJBdChvKT09IgkiPyhuLnN0YXJ0LmNvbHVtbj1vLG4uZW5kLmNvbHVtbj1vKzEpOihuLnN0YXJ0LmNvbHVtbj0wLG4uZW5kLmNvbHVtbj1vKSx0aGlzLnJlbW92ZShuKX19LHRoaXMuJG1vdmVMaW5lcz1mdW5jdGlvbihlLHQsbil7ZT10aGlzLmdldFJvd0ZvbGRTdGFydChlKSx0PXRoaXMuZ2V0Um93Rm9sZEVuZCh0KTtpZihuPDApe3ZhciByPXRoaXMuZ2V0Um93Rm9sZFN0YXJ0KGUrbik7aWYocjwwKXJldHVybiAwO3ZhciBpPXItZX1lbHNlIGlmKG4+MCl7dmFyIHI9dGhpcy5nZXRSb3dGb2xkRW5kKHQrbik7aWYocj50aGlzLmRvYy5nZXRMZW5ndGgoKS0xKXJldHVybiAwO3ZhciBpPXItdH1lbHNle2U9dGhpcy4kY2xpcFJvd1RvRG9jdW1lbnQoZSksdD10aGlzLiRjbGlwUm93VG9Eb2N1bWVudCh0KTt2YXIgaT10LWUrMX12YXIgcz1uZXcgbChlLDAsdCxOdW1iZXIuTUFYX1ZBTFVFKSxvPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKHMpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZT1lLmNsb25lKCksZS5zdGFydC5yb3crPWksZS5lbmQucm93Kz1pLGV9KSx1PW49PTA/dGhpcy5kb2MuZ2V0TGluZXMoZSx0KTp0aGlzLmRvYy5yZW1vdmVGdWxsTGluZXMoZSx0KTtyZXR1cm4gdGhpcy5kb2MuaW5zZXJ0RnVsbExpbmVzKGUraSx1KSxvLmxlbmd0aCYmdGhpcy5hZGRGb2xkcyhvKSxpfSx0aGlzLm1vdmVMaW5lc1VwPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuJG1vdmVMaW5lcyhlLHQsLTEpfSx0aGlzLm1vdmVMaW5lc0Rvd249ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy4kbW92ZUxpbmVzKGUsdCwxKX0sdGhpcy5kdXBsaWNhdGVMaW5lcz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLiRtb3ZlTGluZXMoZSx0LDApfSx0aGlzLiRjbGlwUm93VG9Eb2N1bWVudD1mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbihlLHRoaXMuZG9jLmdldExlbmd0aCgpLTEpKX0sdGhpcy4kY2xpcENvbHVtblRvUm93PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ8MD8wOk1hdGgubWluKHRoaXMuZG9jLmdldExpbmUoZSkubGVuZ3RoLHQpfSx0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50PWZ1bmN0aW9uKGUsdCl7dD1NYXRoLm1heCgwLHQpO2lmKGU8MCllPTAsdD0wO2Vsc2V7dmFyIG49dGhpcy5kb2MuZ2V0TGVuZ3RoKCk7ZT49bj8oZT1uLTEsdD10aGlzLmRvYy5nZXRMaW5lKG4tMSkubGVuZ3RoKTp0PU1hdGgubWluKHRoaXMuZG9jLmdldExpbmUoZSkubGVuZ3RoLHQpfXJldHVybntyb3c6ZSxjb2x1bW46dH19LHRoaXMuJGNsaXBSYW5nZVRvRG9jdW1lbnQ9ZnVuY3Rpb24oZSl7ZS5zdGFydC5yb3c8MD8oZS5zdGFydC5yb3c9MCxlLnN0YXJ0LmNvbHVtbj0wKTplLnN0YXJ0LmNvbHVtbj10aGlzLiRjbGlwQ29sdW1uVG9Sb3coZS5zdGFydC5yb3csZS5zdGFydC5jb2x1bW4pO3ZhciB0PXRoaXMuZG9jLmdldExlbmd0aCgpLTE7cmV0dXJuIGUuZW5kLnJvdz50PyhlLmVuZC5yb3c9dCxlLmVuZC5jb2x1bW49dGhpcy5kb2MuZ2V0TGluZSh0KS5sZW5ndGgpOmUuZW5kLmNvbHVtbj10aGlzLiRjbGlwQ29sdW1uVG9Sb3coZS5lbmQucm93LGUuZW5kLmNvbHVtbiksZX0sdGhpcy4kd3JhcExpbWl0PTgwLHRoaXMuJHVzZVdyYXBNb2RlPSExLHRoaXMuJHdyYXBMaW1pdFJhbmdlPXttaW46bnVsbCxtYXg6bnVsbH0sdGhpcy5zZXRVc2VXcmFwTW9kZT1mdW5jdGlvbihlKXtpZihlIT10aGlzLiR1c2VXcmFwTW9kZSl7dGhpcy4kdXNlV3JhcE1vZGU9ZSx0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiRyZXNldFJvd0NhY2hlKDApO2lmKGUpe3ZhciB0PXRoaXMuZ2V0TGVuZ3RoKCk7dGhpcy4kd3JhcERhdGE9QXJyYXkodCksdGhpcy4kdXBkYXRlV3JhcERhdGEoMCx0LTEpfXRoaXMuX3NpZ25hbCgiY2hhbmdlV3JhcE1vZGUiKX19LHRoaXMuZ2V0VXNlV3JhcE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdXNlV3JhcE1vZGV9LHRoaXMuc2V0V3JhcExpbWl0UmFuZ2U9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLiR3cmFwTGltaXRSYW5nZS5taW4hPT1lfHx0aGlzLiR3cmFwTGltaXRSYW5nZS5tYXghPT10KXRoaXMuJHdyYXBMaW1pdFJhbmdlPXttaW46ZSxtYXg6dH0sdGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kYmlkaUhhbmRsZXIubWFya0FzRGlydHkoKSx0aGlzLiR1c2VXcmFwTW9kZSYmdGhpcy5fc2lnbmFsKCJjaGFuZ2VXcmFwTW9kZSIpfSx0aGlzLmFkanVzdFdyYXBMaW1pdD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJHdyYXBMaW1pdFJhbmdlO24ubWF4PDAmJihuPXttaW46dCxtYXg6dH0pO3ZhciByPXRoaXMuJGNvbnN0cmFpbldyYXBMaW1pdChlLG4ubWluLG4ubWF4KTtyZXR1cm4gciE9dGhpcy4kd3JhcExpbWl0JiZyPjE/KHRoaXMuJHdyYXBMaW1pdD1yLHRoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJHVzZVdyYXBNb2RlJiYodGhpcy4kdXBkYXRlV3JhcERhdGEoMCx0aGlzLmdldExlbmd0aCgpLTEpLHRoaXMuJHJlc2V0Um93Q2FjaGUoMCksdGhpcy5fc2lnbmFsKCJjaGFuZ2VXcmFwTGltaXQiKSksITApOiExfSx0aGlzLiRjb25zdHJhaW5XcmFwTGltaXQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0JiYoZT1NYXRoLm1heCh0LGUpKSxuJiYoZT1NYXRoLm1pbihuLGUpKSxlfSx0aGlzLmdldFdyYXBMaW1pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR3cmFwTGltaXR9LHRoaXMuc2V0V3JhcExpbWl0PWZ1bmN0aW9uKGUpe3RoaXMuc2V0V3JhcExpbWl0UmFuZ2UoZSxlKX0sdGhpcy5nZXRXcmFwTGltaXRSYW5nZT1mdW5jdGlvbigpe3JldHVybnttaW46dGhpcy4kd3JhcExpbWl0UmFuZ2UubWluLG1heDp0aGlzLiR3cmFwTGltaXRSYW5nZS5tYXh9fSx0aGlzLiR1cGRhdGVJbnRlcm5hbERhdGFPbkNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiR1c2VXcmFwTW9kZSxuPWUuYWN0aW9uLHI9ZS5zdGFydCxpPWUuZW5kLHM9ci5yb3csbz1pLnJvdyx1PW8tcyxhPW51bGw7dGhpcy4kdXBkYXRpbmc9ITA7aWYodSE9MClpZihuPT09InJlbW92ZSIpe3RoaXNbdD8iJHdyYXBEYXRhIjoiJHJvd0xlbmd0aENhY2hlIl0uc3BsaWNlKHMsdSk7dmFyIGY9dGhpcy4kZm9sZERhdGE7YT10aGlzLmdldEZvbGRzSW5SYW5nZShlKSx0aGlzLnJlbW92ZUZvbGRzKGEpO3ZhciBsPXRoaXMuZ2V0Rm9sZExpbmUoaS5yb3cpLGM9MDtpZihsKXtsLmFkZFJlbW92ZUNoYXJzKGkucm93LGkuY29sdW1uLHIuY29sdW1uLWkuY29sdW1uKSxsLnNoaWZ0Um93KC11KTt2YXIgaD10aGlzLmdldEZvbGRMaW5lKHMpO2gmJmghPT1sJiYoaC5tZXJnZShsKSxsPWgpLGM9Zi5pbmRleE9mKGwpKzF9Zm9yKGM7YzxmLmxlbmd0aDtjKyspe3ZhciBsPWZbY107bC5zdGFydC5yb3c+PWkucm93JiZsLnNoaWZ0Um93KC11KX1vPXN9ZWxzZXt2YXIgcD1BcnJheSh1KTtwLnVuc2hpZnQocywwKTt2YXIgZD10P3RoaXMuJHdyYXBEYXRhOnRoaXMuJHJvd0xlbmd0aENhY2hlO2Quc3BsaWNlLmFwcGx5KGQscCk7dmFyIGY9dGhpcy4kZm9sZERhdGEsbD10aGlzLmdldEZvbGRMaW5lKHMpLGM9MDtpZihsKXt2YXIgdj1sLnJhbmdlLmNvbXBhcmVJbnNpZGUoci5yb3csci5jb2x1bW4pO3Y9PTA/KGw9bC5zcGxpdChyLnJvdyxyLmNvbHVtbiksbCYmKGwuc2hpZnRSb3codSksbC5hZGRSZW1vdmVDaGFycyhvLDAsaS5jb2x1bW4tci5jb2x1bW4pKSk6dj09LTEmJihsLmFkZFJlbW92ZUNoYXJzKHMsMCxpLmNvbHVtbi1yLmNvbHVtbiksbC5zaGlmdFJvdyh1KSksYz1mLmluZGV4T2YobCkrMX1mb3IoYztjPGYubGVuZ3RoO2MrKyl7dmFyIGw9ZltjXTtsLnN0YXJ0LnJvdz49cyYmbC5zaGlmdFJvdyh1KX19ZWxzZXt1PU1hdGguYWJzKGUuc3RhcnQuY29sdW1uLWUuZW5kLmNvbHVtbiksbj09PSJyZW1vdmUiJiYoYT10aGlzLmdldEZvbGRzSW5SYW5nZShlKSx0aGlzLnJlbW92ZUZvbGRzKGEpLHU9LXUpO3ZhciBsPXRoaXMuZ2V0Rm9sZExpbmUocyk7bCYmbC5hZGRSZW1vdmVDaGFycyhzLHIuY29sdW1uLHUpfXJldHVybiB0JiZ0aGlzLiR3cmFwRGF0YS5sZW5ndGghPXRoaXMuZG9jLmdldExlbmd0aCgpJiZjb25zb2xlLmVycm9yKCJkb2MuZ2V0TGVuZ3RoKCkgYW5kICR3cmFwRGF0YS5sZW5ndGggaGF2ZSB0byBiZSB0aGUgc2FtZSEiKSx0aGlzLiR1cGRhdGluZz0hMSx0P3RoaXMuJHVwZGF0ZVdyYXBEYXRhKHMsbyk6dGhpcy4kdXBkYXRlUm93TGVuZ3RoQ2FjaGUocyxvKSxhfSx0aGlzLiR1cGRhdGVSb3dMZW5ndGhDYWNoZT1mdW5jdGlvbihlLHQsbil7dGhpcy4kcm93TGVuZ3RoQ2FjaGVbZV09bnVsbCx0aGlzLiRyb3dMZW5ndGhDYWNoZVt0XT1udWxsfSx0aGlzLiR1cGRhdGVXcmFwRGF0YT1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXMuZG9jLmdldEFsbExpbmVzKCksaT10aGlzLmdldFRhYlNpemUoKSxvPXRoaXMuJHdyYXBEYXRhLHU9dGhpcy4kd3JhcExpbWl0LGEsZixsPWU7dD1NYXRoLm1pbih0LHIubGVuZ3RoLTEpO3doaWxlKGw8PXQpZj10aGlzLmdldEZvbGRMaW5lKGwsZiksZj8oYT1bXSxmLndhbGsoZnVuY3Rpb24oZSx0LGksbyl7dmFyIHU7aWYoZSE9bnVsbCl7dT10aGlzLiRnZXREaXNwbGF5VG9rZW5zKGUsYS5sZW5ndGgpLHVbMF09bjtmb3IodmFyIGY9MTtmPHUubGVuZ3RoO2YrKyl1W2ZdPXN9ZWxzZSB1PXRoaXMuJGdldERpc3BsYXlUb2tlbnMoclt0XS5zdWJzdHJpbmcobyxpKSxhLmxlbmd0aCk7YT1hLmNvbmNhdCh1KX0uYmluZCh0aGlzKSxmLmVuZC5yb3cscltmLmVuZC5yb3ddLmxlbmd0aCsxKSxvW2Yuc3RhcnQucm93XT10aGlzLiRjb21wdXRlV3JhcFNwbGl0cyhhLHUsaSksbD1mLmVuZC5yb3crMSk6KGE9dGhpcy4kZ2V0RGlzcGxheVRva2VucyhyW2xdKSxvW2xdPXRoaXMuJGNvbXB1dGVXcmFwU3BsaXRzKGEsdSxpKSxsKyspfTt2YXIgZT0xLHQ9MixuPTMscz00LGE9OSxjPTEwLGQ9MTEsdj0xMjt0aGlzLiRjb21wdXRlV3JhcFNwbGl0cz1mdW5jdGlvbihlLHIsaSl7ZnVuY3Rpb24gZygpe3ZhciB0PTA7aWYobT09PTApcmV0dXJuIHQ7aWYocClmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtpZihyPT1jKXQrPTE7ZWxzZXtpZihyIT1kKXtpZihyPT12KWNvbnRpbnVlO2JyZWFrfXQrPWl9fXJldHVybiBoJiZwIT09ITEmJih0Kz1pKSxNYXRoLm1pbih0LG0pfWZ1bmN0aW9uIHkodCl7dmFyIG49dC1mO2Zvcih2YXIgcj1mO3I8dDtyKyspe3ZhciBpPWVbcl07aWYoaT09PTEyfHxpPT09MiluLT0xfW8ubGVuZ3RofHwoYj1nKCksby5pbmRlbnQ9YiksbCs9bixvLnB1c2gobCksZj10fWlmKGUubGVuZ3RoPT0wKXJldHVybltdO3ZhciBvPVtdLHU9ZS5sZW5ndGgsZj0wLGw9MCxoPXRoaXMuJHdyYXBBc0NvZGUscD10aGlzLiRpbmRlbnRlZFNvZnRXcmFwLG09cjw9TWF0aC5tYXgoMippLDgpfHxwPT09ITE/MDpNYXRoLmZsb29yKHIvMiksYj0wO3doaWxlKHUtZj5yLWIpe3ZhciB3PWYrci1iO2lmKGVbdy0xXT49YyYmZVt3XT49Yyl7eSh3KTtjb250aW51ZX1pZihlW3ddPT1ufHxlW3ddPT1zKXtmb3Iodzt3IT1mLTE7dy0tKWlmKGVbd109PW4pYnJlYWs7aWYodz5mKXt5KHcpO2NvbnRpbnVlfXc9ZityO2Zvcih3O3c8ZS5sZW5ndGg7dysrKWlmKGVbd10hPXMpYnJlYWs7aWYodz09ZS5sZW5ndGgpYnJlYWs7eSh3KTtjb250aW51ZX12YXIgRT1NYXRoLm1heCh3LShyLShyPj4yKSksZi0xKTt3aGlsZSh3PkUmJmVbd108bil3LS07aWYoaCl7d2hpbGUodz5FJiZlW3ddPG4pdy0tO3doaWxlKHc+RSYmZVt3XT09YSl3LS19ZWxzZSB3aGlsZSh3PkUmJmVbd108Yyl3LS07aWYodz5FKXt5KCsrdyk7Y29udGludWV9dz1mK3IsZVt3XT09dCYmdy0tLHkody1iKX1yZXR1cm4gb30sdGhpcy4kZ2V0RGlzcGxheVRva2Vucz1mdW5jdGlvbihuLHIpe3ZhciBpPVtdLHM7cj1yfHwwO2Zvcih2YXIgbz0wO288bi5sZW5ndGg7bysrKXt2YXIgdT1uLmNoYXJDb2RlQXQobyk7aWYodT09OSl7cz10aGlzLmdldFNjcmVlblRhYlNpemUoaS5sZW5ndGgrciksaS5wdXNoKGQpO2Zvcih2YXIgZj0xO2Y8cztmKyspaS5wdXNoKHYpfWVsc2UgdT09MzI/aS5wdXNoKGMpOnU+MzkmJnU8NDh8fHU+NTcmJnU8NjQ/aS5wdXNoKGEpOnU+PTQzNTImJm0odSk/aS5wdXNoKGUsdCk6aS5wdXNoKGUpfXJldHVybiBpfSx0aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aD1mdW5jdGlvbihlLHQsbil7aWYodD09MClyZXR1cm5bMCwwXTt0PT1udWxsJiYodD1JbmZpbml0eSksbj1ufHwwO3ZhciByLGk7Zm9yKGk9MDtpPGUubGVuZ3RoO2krKyl7cj1lLmNoYXJDb2RlQXQoaSkscj09OT9uKz10aGlzLmdldFNjcmVlblRhYlNpemUobik6cj49NDM1MiYmbShyKT9uKz0yOm4rPTE7aWYobj50KWJyZWFrfXJldHVybltuLGldfSx0aGlzLmxpbmVXaWRnZXRzPW51bGwsdGhpcy5nZXRSb3dMZW5ndGg9ZnVuY3Rpb24oZSl7aWYodGhpcy5saW5lV2lkZ2V0cyl2YXIgdD10aGlzLmxpbmVXaWRnZXRzW2VdJiZ0aGlzLmxpbmVXaWRnZXRzW2VdLnJvd0NvdW50fHwwO2Vsc2UgdD0wO3JldHVybiF0aGlzLiR1c2VXcmFwTW9kZXx8IXRoaXMuJHdyYXBEYXRhW2VdPzErdDp0aGlzLiR3cmFwRGF0YVtlXS5sZW5ndGgrMSt0fSx0aGlzLmdldFJvd0xpbmVDb3VudD1mdW5jdGlvbihlKXtyZXR1cm4hdGhpcy4kdXNlV3JhcE1vZGV8fCF0aGlzLiR3cmFwRGF0YVtlXT8xOnRoaXMuJHdyYXBEYXRhW2VdLmxlbmd0aCsxfSx0aGlzLmdldFJvd1dyYXBJbmRlbnQ9ZnVuY3Rpb24oZSl7aWYodGhpcy4kdXNlV3JhcE1vZGUpe3ZhciB0PXRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGUsTnVtYmVyLk1BWF9WQUxVRSksbj10aGlzLiR3cmFwRGF0YVt0LnJvd107cmV0dXJuIG4ubGVuZ3RoJiZuWzBdPHQuY29sdW1uP24uaW5kZW50OjB9cmV0dXJuIDB9LHRoaXMuZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihlLE51bWJlci5NQVhfVkFMVUUpO3JldHVybiB0aGlzLmRvY3VtZW50VG9TY3JlZW5Db2x1bW4odC5yb3csdC5jb2x1bW4pfSx0aGlzLmdldERvY3VtZW50TGFzdFJvd0NvbHVtbj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZG9jdW1lbnRUb1NjcmVlblJvdyhlLHQpO3JldHVybiB0aGlzLmdldFNjcmVlbkxhc3RSb3dDb2x1bW4obil9LHRoaXMuZ2V0RG9jdW1lbnRMYXN0Um93Q29sdW1uUG9zaXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmRvY3VtZW50VG9TY3JlZW5Sb3coZSx0KTtyZXR1cm4gdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24obixOdW1iZXIuTUFYX1ZBTFVFLzEwKX0sdGhpcy5nZXRSb3dTcGxpdERhdGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJHVzZVdyYXBNb2RlP3RoaXMuJHdyYXBEYXRhW2VdOnVuZGVmaW5lZH0sdGhpcy5nZXRTY3JlZW5UYWJTaXplPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiR0YWJTaXplLShlJXRoaXMuJHRhYlNpemV8MCl9LHRoaXMuc2NyZWVuVG9Eb2N1bWVudFJvdz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihlLHQpLnJvd30sdGhpcy5zY3JlZW5Ub0RvY3VtZW50Q29sdW1uPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGUsdCkuY29sdW1ufSx0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbj1mdW5jdGlvbihlLHQsbil7aWYoZTwwKXJldHVybntyb3c6MCxjb2x1bW46MH07dmFyIHIsaT0wLHM9MCxvLHU9MCxhPTAsZj10aGlzLiRzY3JlZW5Sb3dDYWNoZSxsPXRoaXMuJGdldFJvd0NhY2hlSW5kZXgoZixlKSxjPWYubGVuZ3RoO2lmKGMmJmw+PTApdmFyIHU9ZltsXSxpPXRoaXMuJGRvY1Jvd0NhY2hlW2xdLGg9ZT5mW2MtMV07ZWxzZSB2YXIgaD0hYzt2YXIgcD10aGlzLmdldExlbmd0aCgpLTEsZD10aGlzLmdldE5leHRGb2xkTGluZShpKSx2PWQ/ZC5zdGFydC5yb3c6SW5maW5pdHk7d2hpbGUodTw9ZSl7YT10aGlzLmdldFJvd0xlbmd0aChpKTtpZih1K2E+ZXx8aT49cClicmVhazt1Kz1hLGkrKyxpPnYmJihpPWQuZW5kLnJvdysxLGQ9dGhpcy5nZXROZXh0Rm9sZExpbmUoaSxkKSx2PWQ/ZC5zdGFydC5yb3c6SW5maW5pdHkpLGgmJih0aGlzLiRkb2NSb3dDYWNoZS5wdXNoKGkpLHRoaXMuJHNjcmVlblJvd0NhY2hlLnB1c2godSkpfWlmKGQmJmQuc3RhcnQucm93PD1pKXI9dGhpcy5nZXRGb2xkRGlzcGxheUxpbmUoZCksaT1kLnN0YXJ0LnJvdztlbHNle2lmKHUrYTw9ZXx8aT5wKXJldHVybntyb3c6cCxjb2x1bW46dGhpcy5nZXRMaW5lKHApLmxlbmd0aH07cj10aGlzLmdldExpbmUoaSksZD1udWxsfXZhciBtPTAsZz1NYXRoLmZsb29yKGUtdSk7aWYodGhpcy4kdXNlV3JhcE1vZGUpe3ZhciB5PXRoaXMuJHdyYXBEYXRhW2ldO3kmJihvPXlbZ10sZz4wJiZ5Lmxlbmd0aCYmKG09eS5pbmRlbnQscz15W2ctMV18fHlbeS5sZW5ndGgtMV0scj1yLnN1YnN0cmluZyhzKSkpfXJldHVybiBuIT09dW5kZWZpbmVkJiZ0aGlzLiRiaWRpSGFuZGxlci5pc0JpZGlSb3codStnLGksZykmJih0PXRoaXMuJGJpZGlIYW5kbGVyLm9mZnNldFRvQ29sKG4pKSxzKz10aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aChyLHQtbSlbMV0sdGhpcy4kdXNlV3JhcE1vZGUmJnM+PW8mJihzPW8tMSksZD9kLmlkeFRvUG9zaXRpb24ocyk6e3JvdzppLGNvbHVtbjpzfX0sdGhpcy5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb249ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdD09InVuZGVmaW5lZCIpdmFyIG49dGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChlLnJvdyxlLmNvbHVtbik7ZWxzZSBuPXRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQoZSx0KTtlPW4ucm93LHQ9bi5jb2x1bW47dmFyIHI9MCxpPW51bGwscz1udWxsO3M9dGhpcy5nZXRGb2xkQXQoZSx0LDEpLHMmJihlPXMuc3RhcnQucm93LHQ9cy5zdGFydC5jb2x1bW4pO3ZhciBvLHU9MCxhPXRoaXMuJGRvY1Jvd0NhY2hlLGY9dGhpcy4kZ2V0Um93Q2FjaGVJbmRleChhLGUpLGw9YS5sZW5ndGg7aWYobCYmZj49MCl2YXIgdT1hW2ZdLHI9dGhpcy4kc2NyZWVuUm93Q2FjaGVbZl0sYz1lPmFbbC0xXTtlbHNlIHZhciBjPSFsO3ZhciBoPXRoaXMuZ2V0TmV4dEZvbGRMaW5lKHUpLHA9aD9oLnN0YXJ0LnJvdzpJbmZpbml0eTt3aGlsZSh1PGUpe2lmKHU+PXApe289aC5lbmQucm93KzE7aWYobz5lKWJyZWFrO2g9dGhpcy5nZXROZXh0Rm9sZExpbmUobyxoKSxwPWg/aC5zdGFydC5yb3c6SW5maW5pdHl9ZWxzZSBvPXUrMTtyKz10aGlzLmdldFJvd0xlbmd0aCh1KSx1PW8sYyYmKHRoaXMuJGRvY1Jvd0NhY2hlLnB1c2godSksdGhpcy4kc2NyZWVuUm93Q2FjaGUucHVzaChyKSl9dmFyIGQ9IiI7aCYmdT49cD8oZD10aGlzLmdldEZvbGREaXNwbGF5TGluZShoLGUsdCksaT1oLnN0YXJ0LnJvdyk6KGQ9dGhpcy5nZXRMaW5lKGUpLnN1YnN0cmluZygwLHQpLGk9ZSk7dmFyIHY9MDtpZih0aGlzLiR1c2VXcmFwTW9kZSl7dmFyIG09dGhpcy4kd3JhcERhdGFbaV07aWYobSl7dmFyIGc9MDt3aGlsZShkLmxlbmd0aD49bVtnXSlyKyssZysrO2Q9ZC5zdWJzdHJpbmcobVtnLTFdfHwwLGQubGVuZ3RoKSx2PWc+MD9tLmluZGVudDowfX1yZXR1cm57cm93OnIsY29sdW1uOnYrdGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGgoZClbMF19fSx0aGlzLmRvY3VtZW50VG9TY3JlZW5Db2x1bW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oZSx0KS5jb2x1bW59LHRoaXMuZG9jdW1lbnRUb1NjcmVlblJvdz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihlLHQpLnJvd30sdGhpcy5nZXRTY3JlZW5MZW5ndGg9ZnVuY3Rpb24oKXt2YXIgZT0wLHQ9bnVsbDtpZighdGhpcy4kdXNlV3JhcE1vZGUpe2U9dGhpcy5nZXRMZW5ndGgoKTt2YXIgbj10aGlzLiRmb2xkRGF0YTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl0PW5bcl0sZS09dC5lbmQucm93LXQuc3RhcnQucm93fWVsc2V7dmFyIGk9dGhpcy4kd3JhcERhdGEubGVuZ3RoLHM9MCxyPTAsdD10aGlzLiRmb2xkRGF0YVtyKytdLG89dD90LnN0YXJ0LnJvdzpJbmZpbml0eTt3aGlsZShzPGkpe3ZhciB1PXRoaXMuJHdyYXBEYXRhW3NdO2UrPXU/dS5sZW5ndGgrMToxLHMrKyxzPm8mJihzPXQuZW5kLnJvdysxLHQ9dGhpcy4kZm9sZERhdGFbcisrXSxvPXQ/dC5zdGFydC5yb3c6SW5maW5pdHkpfX1yZXR1cm4gdGhpcy5saW5lV2lkZ2V0cyYmKGUrPXRoaXMuJGdldFdpZGdldFNjcmVlbkxlbmd0aCgpKSxlfSx0aGlzLiRzZXRGb250TWV0cmljcz1mdW5jdGlvbihlKXtpZighdGhpcy4kZW5hYmxlVmFyQ2hhcilyZXR1cm47dGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGg9ZnVuY3Rpb24odCxuLHIpe2lmKG49PT0wKXJldHVyblswLDBdO258fChuPUluZmluaXR5KSxyPXJ8fDA7dmFyIGkscztmb3Iocz0wO3M8dC5sZW5ndGg7cysrKXtpPXQuY2hhckF0KHMpLGk9PT0iCSI/cis9dGhpcy5nZXRTY3JlZW5UYWJTaXplKHIpOnIrPWUuZ2V0Q2hhcmFjdGVyV2lkdGgoaSk7aWYocj5uKWJyZWFrfXJldHVybltyLHNdfX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5iZ1Rva2VuaXplciYmKHRoaXMuYmdUb2tlbml6ZXIuc2V0RG9jdW1lbnQobnVsbCksdGhpcy5iZ1Rva2VuaXplcj1udWxsKSx0aGlzLiRzdG9wV29ya2VyKCl9LHRoaXMuaXNGdWxsV2lkdGg9bX0uY2FsbChkLnByb3RvdHlwZSksZSgiLi9lZGl0X3Nlc3Npb24vZm9sZGluZyIpLkZvbGRpbmcuY2FsbChkLnByb3RvdHlwZSksZSgiLi9lZGl0X3Nlc3Npb24vYnJhY2tldF9tYXRjaCIpLkJyYWNrZXRNYXRjaC5jYWxsKGQucHJvdG90eXBlKSxvLmRlZmluZU9wdGlvbnMoZC5wcm90b3R5cGUsInNlc3Npb24iLHt3cmFwOntzZXQ6ZnVuY3Rpb24oZSl7IWV8fGU9PSJvZmYiP2U9ITE6ZT09ImZyZWUiP2U9ITA6ZT09InByaW50TWFyZ2luIj9lPS0xOnR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9cGFyc2VJbnQoZSwxMCl8fCExKTtpZih0aGlzLiR3cmFwPT1lKXJldHVybjt0aGlzLiR3cmFwPWU7aWYoIWUpdGhpcy5zZXRVc2VXcmFwTW9kZSghMSk7ZWxzZXt2YXIgdD10eXBlb2YgZT09Im51bWJlciI/ZTpudWxsO3RoaXMuc2V0V3JhcExpbWl0UmFuZ2UodCx0KSx0aGlzLnNldFVzZVdyYXBNb2RlKCEwKX19LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFVzZVdyYXBNb2RlKCk/dGhpcy4kd3JhcD09LTE/InByaW50TWFyZ2luIjp0aGlzLmdldFdyYXBMaW1pdFJhbmdlKCkubWluP3RoaXMuJHdyYXA6ImZyZWUiOiJvZmYifSxoYW5kbGVzU2V0OiEwfSx3cmFwTWV0aG9kOntzZXQ6ZnVuY3Rpb24oZSl7ZT1lPT0iYXV0byI/dGhpcy4kbW9kZS50eXBlIT0idGV4dCI6ZSE9InRleHQiLGUhPXRoaXMuJHdyYXBBc0NvZGUmJih0aGlzLiR3cmFwQXNDb2RlPWUsdGhpcy4kdXNlV3JhcE1vZGUmJih0aGlzLiR1c2VXcmFwTW9kZT0hMSx0aGlzLnNldFVzZVdyYXBNb2RlKCEwKSkpfSxpbml0aWFsVmFsdWU6ImF1dG8ifSxpbmRlbnRlZFNvZnRXcmFwOntzZXQ6ZnVuY3Rpb24oKXt0aGlzLiR1c2VXcmFwTW9kZSYmKHRoaXMuJHVzZVdyYXBNb2RlPSExLHRoaXMuc2V0VXNlV3JhcE1vZGUoITApKX0saW5pdGlhbFZhbHVlOiEwfSxmaXJzdExpbmVOdW1iZXI6e3NldDpmdW5jdGlvbigpe3RoaXMuX3NpZ25hbCgiY2hhbmdlQnJlYWtwb2ludCIpfSxpbml0aWFsVmFsdWU6MX0sdXNlV29ya2VyOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kdXNlV29ya2VyPWUsdGhpcy4kc3RvcFdvcmtlcigpLGUmJnRoaXMuJHN0YXJ0V29ya2VyKCl9LGluaXRpYWxWYWx1ZTohMH0sdXNlU29mdFRhYnM6e2luaXRpYWxWYWx1ZTohMH0sdGFiU2l6ZTp7c2V0OmZ1bmN0aW9uKGUpe2U9cGFyc2VJbnQoZSksZT4wJiZ0aGlzLiR0YWJTaXplIT09ZSYmKHRoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJHJvd0xlbmd0aENhY2hlPVtdLHRoaXMuJHRhYlNpemU9ZSx0aGlzLl9zaWduYWwoImNoYW5nZVRhYlNpemUiKSl9LGluaXRpYWxWYWx1ZTo0LGhhbmRsZXNTZXQ6ITB9LG5hdmlnYXRlV2l0aGluU29mdFRhYnM6e2luaXRpYWxWYWx1ZTohMX0sZm9sZFN0eWxlOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXRGb2xkU3R5bGUoZSl9LGhhbmRsZXNTZXQ6ITB9LG92ZXJ3cml0ZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3NpZ25hbCgiY2hhbmdlT3ZlcndyaXRlIil9LGluaXRpYWxWYWx1ZTohMX0sbmV3TGluZU1vZGU6e3NldDpmdW5jdGlvbihlKXt0aGlzLmRvYy5zZXROZXdMaW5lTW9kZShlKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jLmdldE5ld0xpbmVNb2RlKCl9LGhhbmRsZXNTZXQ6ITB9LG1vZGU6e3NldDpmdW5jdGlvbihlKXt0aGlzLnNldE1vZGUoZSl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRtb2RlSWR9LGhhbmRsZXNTZXQ6ITB9fSksdC5FZGl0U2Vzc2lvbj1kfSksYWNlLmRlZmluZSgiYWNlL3NlYXJjaCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB1KGUsdCl7ZnVuY3Rpb24gbihlKXtyZXR1cm4vXHcvLnRlc3QoZSl8fHQucmVnRXhwPyJcXGIiOiIifXJldHVybiBuKGVbMF0pK2UrbihlW2UubGVuZ3RoLTFdKX12YXIgcj1lKCIuL2xpYi9sYW5nIiksaT1lKCIuL2xpYi9vb3AiKSxzPWUoIi4vcmFuZ2UiKS5SYW5nZSxvPWZ1bmN0aW9uKCl7dGhpcy4kb3B0aW9ucz17fX07KGZ1bmN0aW9uKCl7dGhpcy5zZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGkubWl4aW4odGhpcy4kb3B0aW9ucyxlKSx0aGlzfSx0aGlzLmdldE9wdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gci5jb3B5T2JqZWN0KHRoaXMuJG9wdGlvbnMpfSx0aGlzLnNldE9wdGlvbnM9ZnVuY3Rpb24oZSl7dGhpcy4kb3B0aW9ucz1lfSx0aGlzLmZpbmQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kb3B0aW9ucyxuPXRoaXMuJG1hdGNoSXRlcmF0b3IoZSx0KTtpZighbilyZXR1cm4hMTt2YXIgcj1udWxsO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24oZSxuLGksbyl7cmV0dXJuIHI9bmV3IHMoZSxuLGksbyksbj09byYmdC5zdGFydCYmdC5zdGFydC5zdGFydCYmdC5za2lwQ3VycmVudCE9MCYmci5pc0VxdWFsKHQuc3RhcnQpPyhyPW51bGwsITEpOiEwfSkscn0sdGhpcy5maW5kQWxsPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJG9wdGlvbnM7aWYoIXQubmVlZGxlKXJldHVybltdO3RoaXMuJGFzc2VtYmxlUmVnRXhwKHQpO3ZhciBuPXQucmFuZ2UsaT1uP2UuZ2V0TGluZXMobi5zdGFydC5yb3csbi5lbmQucm93KTplLmRvYy5nZXRBbGxMaW5lcygpLG89W10sdT10LnJlO2lmKHQuJGlzTXVsdGlMaW5lKXt2YXIgYT11Lmxlbmd0aCxmPWkubGVuZ3RoLWEsbDtlOmZvcih2YXIgYz11Lm9mZnNldHx8MDtjPD1mO2MrKyl7Zm9yKHZhciBoPTA7aDxhO2grKylpZihpW2MraF0uc2VhcmNoKHVbaF0pPT0tMSljb250aW51ZSBlO3ZhciBwPWlbY10sZD1pW2MrYS0xXSx2PXAubGVuZ3RoLXAubWF0Y2godVswXSlbMF0ubGVuZ3RoLG09ZC5tYXRjaCh1W2EtMV0pWzBdLmxlbmd0aDtpZihsJiZsLmVuZC5yb3c9PT1jJiZsLmVuZC5jb2x1bW4+diljb250aW51ZTtvLnB1c2gobD1uZXcgcyhjLHYsYythLTEsbSkpLGE+MiYmKGM9YythLTIpfX1lbHNlIGZvcih2YXIgZz0wO2c8aS5sZW5ndGg7ZysrKXt2YXIgeT1yLmdldE1hdGNoT2Zmc2V0cyhpW2ddLHUpO2Zvcih2YXIgaD0wO2g8eS5sZW5ndGg7aCsrKXt2YXIgYj15W2hdO28ucHVzaChuZXcgcyhnLGIub2Zmc2V0LGcsYi5vZmZzZXQrYi5sZW5ndGgpKX19aWYobil7dmFyIHc9bi5zdGFydC5jb2x1bW4sRT1uLnN0YXJ0LmNvbHVtbixnPTAsaD1vLmxlbmd0aC0xO3doaWxlKGc8aCYmb1tnXS5zdGFydC5jb2x1bW48dyYmb1tnXS5zdGFydC5yb3c9PW4uc3RhcnQucm93KWcrKzt3aGlsZShnPGgmJm9baF0uZW5kLmNvbHVtbj5FJiZvW2hdLmVuZC5yb3c9PW4uZW5kLnJvdyloLS07bz1vLnNsaWNlKGcsaCsxKTtmb3IoZz0wLGg9by5sZW5ndGg7ZzxoO2crKylvW2ddLnN0YXJ0LnJvdys9bi5zdGFydC5yb3csb1tnXS5lbmQucm93Kz1uLnN0YXJ0LnJvd31yZXR1cm4gb30sdGhpcy5yZXBsYWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kb3B0aW9ucyxyPXRoaXMuJGFzc2VtYmxlUmVnRXhwKG4pO2lmKG4uJGlzTXVsdGlMaW5lKXJldHVybiB0O2lmKCFyKXJldHVybjt2YXIgaT1yLmV4ZWMoZSk7aWYoIWl8fGlbMF0ubGVuZ3RoIT1lLmxlbmd0aClyZXR1cm4gbnVsbDt0PWUucmVwbGFjZShyLHQpO2lmKG4ucHJlc2VydmVDYXNlKXt0PXQuc3BsaXQoIiIpO2Zvcih2YXIgcz1NYXRoLm1pbihlLmxlbmd0aCxlLmxlbmd0aCk7cy0tOyl7dmFyIG89ZVtzXTtvJiZvLnRvTG93ZXJDYXNlKCkhPW8/dFtzXT10W3NdLnRvVXBwZXJDYXNlKCk6dFtzXT10W3NdLnRvTG93ZXJDYXNlKCl9dD10LmpvaW4oIiIpfXJldHVybiB0fSx0aGlzLiRhc3NlbWJsZVJlZ0V4cD1mdW5jdGlvbihlLHQpe2lmKGUubmVlZGxlIGluc3RhbmNlb2YgUmVnRXhwKXJldHVybiBlLnJlPWUubmVlZGxlO3ZhciBuPWUubmVlZGxlO2lmKCFlLm5lZWRsZSlyZXR1cm4gZS5yZT0hMTtlLnJlZ0V4cHx8KG49ci5lc2NhcGVSZWdFeHAobikpLGUud2hvbGVXb3JkJiYobj11KG4sZSkpO3ZhciBpPWUuY2FzZVNlbnNpdGl2ZT8iZ20iOiJnbWkiO2UuJGlzTXVsdGlMaW5lPSF0JiYvW1xuXHJdLy50ZXN0KG4pO2lmKGUuJGlzTXVsdGlMaW5lKXJldHVybiBlLnJlPXRoaXMuJGFzc2VtYmxlTXVsdGlsaW5lUmVnRXhwKG4saSk7dHJ5e3ZhciBzPW5ldyBSZWdFeHAobixpKX1jYXRjaChvKXtzPSExfXJldHVybiBlLnJlPXN9LHRoaXMuJGFzc2VtYmxlTXVsdGlsaW5lUmVnRXhwPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5yZXBsYWNlKC9cclxufFxyfFxuL2csIiRcbl4iKS5zcGxpdCgiXG4iKSxyPVtdO2Zvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXRyeXtyLnB1c2gobmV3IFJlZ0V4cChuW2ldLHQpKX1jYXRjaChzKXtyZXR1cm4hMX1yZXR1cm4gcn0sdGhpcy4kbWF0Y2hJdGVyYXRvcj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJGFzc2VtYmxlUmVnRXhwKHQpO2lmKCFuKXJldHVybiExO3ZhciByPXQuYmFja3dhcmRzPT0xLGk9dC5za2lwQ3VycmVudCE9MCxzPXQucmFuZ2Usbz10LnN0YXJ0O298fChvPXM/c1tyPyJlbmQiOiJzdGFydCJdOmUuc2VsZWN0aW9uLmdldFJhbmdlKCkpLG8uc3RhcnQmJihvPW9baSE9cj8iZW5kIjoic3RhcnQiXSk7dmFyIHU9cz9zLnN0YXJ0LnJvdzowLGE9cz9zLmVuZC5yb3c6ZS5nZXRMZW5ndGgoKS0xO2lmKHIpdmFyIGY9ZnVuY3Rpb24oZSl7dmFyIG49by5yb3c7aWYoYyhuLG8uY29sdW1uLGUpKXJldHVybjtmb3Iobi0tO24+PXU7bi0tKWlmKGMobixOdW1iZXIuTUFYX1ZBTFVFLGUpKXJldHVybjtpZih0LndyYXA9PTApcmV0dXJuO2ZvcihuPWEsdT1vLnJvdztuPj11O24tLSlpZihjKG4sTnVtYmVyLk1BWF9WQUxVRSxlKSlyZXR1cm59O2Vsc2UgdmFyIGY9ZnVuY3Rpb24oZSl7dmFyIG49by5yb3c7aWYoYyhuLG8uY29sdW1uLGUpKXJldHVybjtmb3Iobis9MTtuPD1hO24rKylpZihjKG4sMCxlKSlyZXR1cm47aWYodC53cmFwPT0wKXJldHVybjtmb3Iobj11LGE9by5yb3c7bjw9YTtuKyspaWYoYyhuLDAsZSkpcmV0dXJufTtpZih0LiRpc011bHRpTGluZSl2YXIgbD1uLmxlbmd0aCxjPWZ1bmN0aW9uKHQsaSxzKXt2YXIgbz1yP3QtbCsxOnQ7aWYobzwwKXJldHVybjt2YXIgdT1lLmdldExpbmUobyksYT11LnNlYXJjaChuWzBdKTtpZighciYmYTxpfHxhPT09LTEpcmV0dXJuO2Zvcih2YXIgZj0xO2Y8bDtmKyspe3U9ZS5nZXRMaW5lKG8rZik7aWYodS5zZWFyY2gobltmXSk9PS0xKXJldHVybn12YXIgYz11Lm1hdGNoKG5bbC0xXSlbMF0ubGVuZ3RoO2lmKHImJmM+aSlyZXR1cm47aWYocyhvLGEsbytsLTEsYykpcmV0dXJuITB9O2Vsc2UgaWYocil2YXIgYz1mdW5jdGlvbih0LHIsaSl7dmFyIHM9ZS5nZXRMaW5lKHQpLG89W10sdSxhPTA7bi5sYXN0SW5kZXg9MDt3aGlsZSh1PW4uZXhlYyhzKSl7dmFyIGY9dVswXS5sZW5ndGg7YT11LmluZGV4O2lmKCFmKXtpZihhPj1zLmxlbmd0aClicmVhaztuLmxhc3RJbmRleD1hKz0xfWlmKHUuaW5kZXgrZj5yKWJyZWFrO28ucHVzaCh1LmluZGV4LGYpfWZvcih2YXIgbD1vLmxlbmd0aC0xO2w+PTA7bC09Mil7dmFyIGM9b1tsLTFdLGY9b1tsXTtpZihpKHQsYyx0LGMrZikpcmV0dXJuITB9fTtlbHNlIHZhciBjPWZ1bmN0aW9uKHQscixpKXt2YXIgcz1lLmdldExpbmUodCksbyx1O24ubGFzdEluZGV4PXI7d2hpbGUodT1uLmV4ZWMocykpe3ZhciBhPXVbMF0ubGVuZ3RoO289dS5pbmRleDtpZihpKHQsbyx0LG8rYSkpcmV0dXJuITA7aWYoIWEpe24ubGFzdEluZGV4PW8rPTE7aWYobz49cy5sZW5ndGgpcmV0dXJuITF9fX07cmV0dXJue2ZvckVhY2g6Zn19fSkuY2FsbChvLnByb3RvdHlwZSksdC5TZWFyY2g9b30pLGFjZS5kZWZpbmUoImFjZS9rZXlib2FyZC9oYXNoX2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2tleXMiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQpe3RoaXMucGxhdGZvcm09dHx8KGkuaXNNYWM/Im1hYyI6IndpbiIpLHRoaXMuY29tbWFuZHM9e30sdGhpcy5jb21tYW5kS2V5QmluZGluZz17fSx0aGlzLmFkZENvbW1hbmRzKGUpLHRoaXMuJHNpbmdsZUNvbW1hbmQ9ITB9ZnVuY3Rpb24gdShlLHQpe28uY2FsbCh0aGlzLGUsdCksdGhpcy4kc2luZ2xlQ29tbWFuZD0hMX12YXIgcj1lKCIuLi9saWIva2V5cyIpLGk9ZSgiLi4vbGliL3VzZXJhZ2VudCIpLHM9ci5LRVlfTU9EUzt1LnByb3RvdHlwZT1vLnByb3RvdHlwZSxmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIHR5cGVvZiBlPT0ib2JqZWN0IiYmZS5iaW5kS2V5JiZlLmJpbmRLZXkucG9zaXRpb258fChlLmlzRGVmYXVsdD8tMTAwOjApfXRoaXMuYWRkQ29tbWFuZD1mdW5jdGlvbihlKXt0aGlzLmNvbW1hbmRzW2UubmFtZV0mJnRoaXMucmVtb3ZlQ29tbWFuZChlKSx0aGlzLmNvbW1hbmRzW2UubmFtZV09ZSxlLmJpbmRLZXkmJnRoaXMuX2J1aWxkS2V5SGFzaChlKX0sdGhpcy5yZW1vdmVDb21tYW5kPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZSYmKHR5cGVvZiBlPT0ic3RyaW5nIj9lOmUubmFtZSk7ZT10aGlzLmNvbW1hbmRzW25dLHR8fGRlbGV0ZSB0aGlzLmNvbW1hbmRzW25dO3ZhciByPXRoaXMuY29tbWFuZEtleUJpbmRpbmc7Zm9yKHZhciBpIGluIHIpe3ZhciBzPXJbaV07aWYocz09ZSlkZWxldGUgcltpXTtlbHNlIGlmKEFycmF5LmlzQXJyYXkocykpe3ZhciBvPXMuaW5kZXhPZihlKTtvIT0tMSYmKHMuc3BsaWNlKG8sMSkscy5sZW5ndGg9PTEmJihyW2ldPXNbMF0pKX19fSx0aGlzLmJpbmRLZXk9ZnVuY3Rpb24oZSx0LG4pe3R5cGVvZiBlPT0ib2JqZWN0IiYmZSYmKG49PXVuZGVmaW5lZCYmKG49ZS5wb3NpdGlvbiksZT1lW3RoaXMucGxhdGZvcm1dKTtpZighZSlyZXR1cm47aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpcmV0dXJuIHRoaXMuYWRkQ29tbWFuZCh7ZXhlYzp0LGJpbmRLZXk6ZSxuYW1lOnQubmFtZXx8ZX0pO2Uuc3BsaXQoInwiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciByPSIiO2lmKGUuaW5kZXhPZigiICIpIT0tMSl7dmFyIGk9ZS5zcGxpdCgvXHMrLyk7ZT1pLnBvcCgpLGkuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD10aGlzLnBhcnNlS2V5cyhlKSxuPXNbdC5oYXNoSWRdK3Qua2V5O3IrPShyPyIgIjoiIikrbix0aGlzLl9hZGRDb21tYW5kVG9CaW5kaW5nKHIsImNoYWluS2V5cyIpfSx0aGlzKSxyKz0iICJ9dmFyIG89dGhpcy5wYXJzZUtleXMoZSksdT1zW28uaGFzaElkXStvLmtleTt0aGlzLl9hZGRDb21tYW5kVG9CaW5kaW5nKHIrdSx0LG4pfSx0aGlzKX0sdGhpcy5fYWRkQ29tbWFuZFRvQmluZGluZz1mdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcy5jb21tYW5kS2V5QmluZGluZyxzO2lmKCFuKWRlbGV0ZSBpW3RdO2Vsc2UgaWYoIWlbdF18fHRoaXMuJHNpbmdsZUNvbW1hbmQpaVt0XT1uO2Vsc2V7QXJyYXkuaXNBcnJheShpW3RdKT8ocz1pW3RdLmluZGV4T2YobikpIT0tMSYmaVt0XS5zcGxpY2UocywxKTppW3RdPVtpW3RdXSx0eXBlb2YgciE9Im51bWJlciImJihyPWUobikpO3ZhciBvPWlbdF07Zm9yKHM9MDtzPG8ubGVuZ3RoO3MrKyl7dmFyIHU9b1tzXSxhPWUodSk7aWYoYT5yKWJyZWFrfW8uc3BsaWNlKHMsMCxuKX19LHRoaXMuYWRkQ29tbWFuZHM9ZnVuY3Rpb24oZSl7ZSYmT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj1lW3RdO2lmKCFuKXJldHVybjtpZih0eXBlb2Ygbj09InN0cmluZyIpcmV0dXJuIHRoaXMuYmluZEtleShuLHQpO3R5cGVvZiBuPT0iZnVuY3Rpb24iJiYobj17ZXhlYzpufSk7aWYodHlwZW9mIG4hPSJvYmplY3QiKXJldHVybjtuLm5hbWV8fChuLm5hbWU9dCksdGhpcy5hZGRDb21tYW5kKG4pfSx0aGlzKX0sdGhpcy5yZW1vdmVDb21tYW5kcz1mdW5jdGlvbihlKXtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3RoaXMucmVtb3ZlQ29tbWFuZChlW3RdKX0sdGhpcyl9LHRoaXMuYmluZEtleXM9ZnVuY3Rpb24oZSl7T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbih0KXt0aGlzLmJpbmRLZXkodCxlW3RdKX0sdGhpcyl9LHRoaXMuX2J1aWxkS2V5SGFzaD1mdW5jdGlvbihlKXt0aGlzLmJpbmRLZXkoZS5iaW5kS2V5LGUpfSx0aGlzLnBhcnNlS2V5cz1mdW5jdGlvbihlKXt2YXIgdD1lLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1tcLVwrXShbXC1cK10pPy8pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZX0pLG49dC5wb3AoKSxpPXJbbl07aWYoci5GVU5DVElPTl9LRVlTW2ldKW49ci5GVU5DVElPTl9LRVlTW2ldLnRvTG93ZXJDYXNlKCk7ZWxzZXtpZighdC5sZW5ndGgpcmV0dXJue2tleTpuLGhhc2hJZDotMX07aWYodC5sZW5ndGg9PTEmJnRbMF09PSJzaGlmdCIpcmV0dXJue2tleTpuLnRvVXBwZXJDYXNlKCksaGFzaElkOi0xfX12YXIgcz0wO2Zvcih2YXIgbz10Lmxlbmd0aDtvLS07KXt2YXIgdT1yLktFWV9NT0RTW3Rbb11dO2lmKHU9PW51bGwpcmV0dXJuIHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIiYmY29uc29sZS5lcnJvcigiaW52YWxpZCBtb2RpZmllciAiK3Rbb10rIiBpbiAiK2UpLCExO3N8PXV9cmV0dXJue2tleTpuLGhhc2hJZDpzfX0sdGhpcy5maW5kS2V5Q29tbWFuZD1mdW5jdGlvbih0LG4pe3ZhciByPXNbdF0rbjtyZXR1cm4gdGhpcy5jb21tYW5kS2V5QmluZGluZ1tyXX0sdGhpcy5oYW5kbGVLZXlib2FyZD1mdW5jdGlvbihlLHQsbixyKXtpZihyPDApcmV0dXJuO3ZhciBpPXNbdF0rbixvPXRoaXMuY29tbWFuZEtleUJpbmRpbmdbaV07ZS4ka2V5Q2hhaW4mJihlLiRrZXlDaGFpbis9IiAiK2ksbz10aGlzLmNvbW1hbmRLZXlCaW5kaW5nW2UuJGtleUNoYWluXXx8byk7aWYobylpZihvPT0iY2hhaW5LZXlzInx8b1tvLmxlbmd0aC0xXT09ImNoYWluS2V5cyIpcmV0dXJuIGUuJGtleUNoYWluPWUuJGtleUNoYWlufHxpLHtjb21tYW5kOiJudWxsIn07aWYoZS4ka2V5Q2hhaW4paWYoISF0JiZ0IT00fHxuLmxlbmd0aCE9MSl7aWYodD09LTF8fHI+MCllLiRrZXlDaGFpbj0iIn1lbHNlIGUuJGtleUNoYWluPWUuJGtleUNoYWluLnNsaWNlKDAsLWkubGVuZ3RoLTEpO3JldHVybntjb21tYW5kOm99fSx0aGlzLmdldFN0YXR1c1RleHQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC4ka2V5Q2hhaW58fCIifX0uY2FsbChvLnByb3RvdHlwZSksdC5IYXNoSGFuZGxlcj1vLHQuTXVsdGlIYXNoSGFuZGxlcj11fSksYWNlLmRlZmluZSgiYWNlL2NvbW1hbmRzL2NvbW1hbmRfbWFuYWdlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2tleWJvYXJkL2hhc2hfaGFuZGxlciIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL29vcCIpLGk9ZSgiLi4va2V5Ym9hcmQvaGFzaF9oYW5kbGVyIikuTXVsdGlIYXNoSGFuZGxlcixzPWUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLG89ZnVuY3Rpb24oZSx0KXtpLmNhbGwodGhpcyx0LGUpLHRoaXMuYnlOYW1lPXRoaXMuY29tbWFuZHMsdGhpcy5zZXREZWZhdWx0SGFuZGxlcigiZXhlYyIsZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29tbWFuZC5leGVjKGUuZWRpdG9yLGUuYXJnc3x8e30pfSl9O3IuaW5oZXJpdHMobyxpKSxmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMscyksdGhpcy5leGVjPWZ1bmN0aW9uKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIHI9ZS5sZW5ndGg7ci0tOylpZih0aGlzLmV4ZWMoZVtyXSx0LG4pKXJldHVybiEwO3JldHVybiExfXR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9dGhpcy5jb21tYW5kc1tlXSk7aWYoIWUpcmV0dXJuITE7aWYodCYmdC4kcmVhZE9ubHkmJiFlLnJlYWRPbmx5KXJldHVybiExO2lmKHRoaXMuJGNoZWNrQ29tbWFuZFN0YXRlIT0wJiZlLmlzQXZhaWxhYmxlJiYhZS5pc0F2YWlsYWJsZSh0KSlyZXR1cm4hMTt2YXIgaT17ZWRpdG9yOnQsY29tbWFuZDplLGFyZ3M6bn07cmV0dXJuIGkucmV0dXJuVmFsdWU9dGhpcy5fZW1pdCgiZXhlYyIsaSksdGhpcy5fc2lnbmFsKCJhZnRlckV4ZWMiLGkpLGkucmV0dXJuVmFsdWU9PT0hMT8hMTohMH0sdGhpcy50b2dnbGVSZWNvcmRpbmc9ZnVuY3Rpb24oZSl7aWYodGhpcy4kaW5SZXBsYXkpcmV0dXJuO3JldHVybiBlJiZlLl9lbWl0KCJjaGFuZ2VTdGF0dXMiKSx0aGlzLnJlY29yZGluZz8odGhpcy5tYWNyby5wb3AoKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImV4ZWMiLHRoaXMuJGFkZENvbW1hbmRUb01hY3JvKSx0aGlzLm1hY3JvLmxlbmd0aHx8KHRoaXMubWFjcm89dGhpcy5vbGRNYWNybyksdGhpcy5yZWNvcmRpbmc9ITEpOih0aGlzLiRhZGRDb21tYW5kVG9NYWNyb3x8KHRoaXMuJGFkZENvbW1hbmRUb01hY3JvPWZ1bmN0aW9uKGUpe3RoaXMubWFjcm8ucHVzaChbZS5jb21tYW5kLGUuYXJnc10pfS5iaW5kKHRoaXMpKSx0aGlzLm9sZE1hY3JvPXRoaXMubWFjcm8sdGhpcy5tYWNybz1bXSx0aGlzLm9uKCJleGVjIix0aGlzLiRhZGRDb21tYW5kVG9NYWNybyksdGhpcy5yZWNvcmRpbmc9ITApfSx0aGlzLnJlcGxheT1mdW5jdGlvbihlKXtpZih0aGlzLiRpblJlcGxheXx8IXRoaXMubWFjcm8pcmV0dXJuO2lmKHRoaXMucmVjb3JkaW5nKXJldHVybiB0aGlzLnRvZ2dsZVJlY29yZGluZyhlKTt0cnl7dGhpcy4kaW5SZXBsYXk9ITAsdGhpcy5tYWNyby5mb3JFYWNoKGZ1bmN0aW9uKHQpe3R5cGVvZiB0PT0ic3RyaW5nIj90aGlzLmV4ZWModCxlKTp0aGlzLmV4ZWModFswXSxlLHRbMV0pfSx0aGlzKX1maW5hbGx5e3RoaXMuJGluUmVwbGF5PSExfX0sdGhpcy50cmltTWFjcm89ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZVswXSE9InN0cmluZyImJihlWzBdPWVbMF0ubmFtZSksZVsxXXx8KGU9ZVswXSksZX0pfX0uY2FsbChvLnByb3RvdHlwZSksdC5Db21tYW5kTWFuYWdlcj1vfSksYWNlLmRlZmluZSgiYWNlL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciLCJhY2UvY29uZmlnIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCl7cmV0dXJue3dpbjplLG1hYzp0fX12YXIgcj1lKCIuLi9saWIvbGFuZyIpLGk9ZSgiLi4vY29uZmlnIikscz1lKCIuLi9yYW5nZSIpLlJhbmdlO3QuY29tbWFuZHM9W3tuYW1lOiJzaG93U2V0dGluZ3NNZW51IixiaW5kS2V5Om8oIkN0cmwtLCIsIkNvbW1hbmQtLCIpLGV4ZWM6ZnVuY3Rpb24oZSl7aS5sb2FkTW9kdWxlKCJhY2UvZXh0L3NldHRpbmdzX21lbnUiLGZ1bmN0aW9uKHQpe3QuaW5pdChlKSxlLnNob3dTZXR0aW5nc01lbnUoKX0pfSxyZWFkT25seTohMH0se25hbWU6ImdvVG9OZXh0RXJyb3IiLGJpbmRLZXk6bygiQWx0LUUiLCJGNCIpLGV4ZWM6ZnVuY3Rpb24oZSl7aS5sb2FkTW9kdWxlKCIuL2V4dC9lcnJvcl9tYXJrZXIiLGZ1bmN0aW9uKHQpe3Quc2hvd0Vycm9yTWFya2VyKGUsMSl9KX0sc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ29Ub1ByZXZpb3VzRXJyb3IiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LUUiLCJTaGlmdC1GNCIpLGV4ZWM6ZnVuY3Rpb24oZSl7aS5sb2FkTW9kdWxlKCIuL2V4dC9lcnJvcl9tYXJrZXIiLGZ1bmN0aW9uKHQpe3Quc2hvd0Vycm9yTWFya2VyKGUsLTEpfSl9LHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdGFsbCIsZGVzY3JpcHRpb246IlNlbGVjdCBhbGwiLGJpbmRLZXk6bygiQ3RybC1BIiwiQ29tbWFuZC1BIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdEFsbCgpfSxyZWFkT25seTohMH0se25hbWU6ImNlbnRlcnNlbGVjdGlvbiIsZGVzY3JpcHRpb246IkNlbnRlciBzZWxlY3Rpb24iLGJpbmRLZXk6byhudWxsLCJDdHJsLUwiKSxleGVjOmZ1bmN0aW9uKGUpe2UuY2VudGVyU2VsZWN0aW9uKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b2xpbmUiLGRlc2NyaXB0aW9uOiJHbyB0byBsaW5lLi4uIixiaW5kS2V5Om8oIkN0cmwtTCIsIkNvbW1hbmQtTCIpLGV4ZWM6ZnVuY3Rpb24oZSx0KXt0eXBlb2YgdD09Im51bWJlciImJiFpc05hTih0KSYmZS5nb3RvTGluZSh0KSxlLnByb21wdCh7JHR5cGU6ImdvdG9MaW5lIn0pfSxyZWFkT25seTohMH0se25hbWU6ImZvbGQiLGJpbmRLZXk6bygiQWx0LUx8Q3RybC1GMSIsIkNvbW1hbmQtQWx0LUx8Q29tbWFuZC1GMSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZXNzaW9uLnRvZ2dsZUZvbGQoITEpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJ1bmZvbGQiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LUx8Q3RybC1TaGlmdC1GMSIsIkNvbW1hbmQtQWx0LVNoaWZ0LUx8Q29tbWFuZC1TaGlmdC1GMSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZXNzaW9uLnRvZ2dsZUZvbGQoITApfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJ0b2dnbGVGb2xkV2lkZ2V0IixiaW5kS2V5Om8oIkYyIiwiRjIiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Vzc2lvbi50b2dnbGVGb2xkV2lkZ2V0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6InRvZ2dsZVBhcmVudEZvbGRXaWRnZXQiLGJpbmRLZXk6bygiQWx0LUYyIiwiQWx0LUYyIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlc3Npb24udG9nZ2xlRm9sZFdpZGdldCghMCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6ImZvbGRhbGwiLGRlc2NyaXB0aW9uOiJGb2xkIGFsbCIsYmluZEtleTpvKG51bGwsIkN0cmwtQ29tbWFuZC1PcHRpb24tMCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZXNzaW9uLmZvbGRBbGwoKX0sc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJmb2xkT3RoZXIiLGRlc2NyaXB0aW9uOiJGb2xkIG90aGVyIixiaW5kS2V5Om8oIkFsdC0wIiwiQ29tbWFuZC1PcHRpb24tMCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZXNzaW9uLmZvbGRBbGwoKSxlLnNlc3Npb24udW5mb2xkKGUuc2VsZWN0aW9uLmdldEFsbFJhbmdlcygpKX0sc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJ1bmZvbGRhbGwiLGRlc2NyaXB0aW9uOiJVbmZvbGQgYWxsIixiaW5kS2V5Om8oIkFsdC1TaGlmdC0wIiwiQ29tbWFuZC1PcHRpb24tU2hpZnQtMCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZXNzaW9uLnVuZm9sZCgpfSxzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6ImZpbmRuZXh0IixkZXNjcmlwdGlvbjoiRmluZCBuZXh0IixiaW5kS2V5Om8oIkN0cmwtSyIsIkNvbW1hbmQtRyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5maW5kTmV4dCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJmaW5kcHJldmlvdXMiLGRlc2NyaXB0aW9uOiJGaW5kIHByZXZpb3VzIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtSyIsIkNvbW1hbmQtU2hpZnQtRyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5maW5kUHJldmlvdXMoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0T3JGaW5kTmV4dCIsZGVzY3JpcHRpb246IlNlbGVjdCBvciBmaW5kIG5leHQiLGJpbmRLZXk6bygiQWx0LUsiLCJDdHJsLUciKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0aW9uLmlzRW1wdHkoKT9lLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk6ZS5maW5kTmV4dCgpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdE9yRmluZFByZXZpb3VzIixkZXNjcmlwdGlvbjoiU2VsZWN0IG9yIGZpbmQgcHJldmlvdXMiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LUsiLCJDdHJsLVNoaWZ0LUciKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0aW9uLmlzRW1wdHkoKT9lLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk6ZS5maW5kUHJldmlvdXMoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJmaW5kIixkZXNjcmlwdGlvbjoiRmluZCIsYmluZEtleTpvKCJDdHJsLUYiLCJDb21tYW5kLUYiKSxleGVjOmZ1bmN0aW9uKGUpe2kubG9hZE1vZHVsZSgiYWNlL2V4dC9zZWFyY2hib3giLGZ1bmN0aW9uKHQpe3QuU2VhcmNoKGUpfSl9LHJlYWRPbmx5OiEwfSx7bmFtZToib3ZlcndyaXRlIixkZXNjcmlwdGlvbjoiT3ZlcndyaXRlIixiaW5kS2V5OiJJbnNlcnQiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS50b2dnbGVPdmVyd3JpdGUoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R0b3N0YXJ0IixkZXNjcmlwdGlvbjoiU2VsZWN0IHRvIHN0YXJ0IixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtSG9tZSIsIkNvbW1hbmQtU2hpZnQtSG9tZXxDb21tYW5kLVNoaWZ0LVVwIiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdEZpbGVTdGFydCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIscmVhZE9ubHk6ITAsc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLGFjZUNvbW1hbmRHcm91cDoiZmlsZUp1bXAifSx7bmFtZToiZ290b3N0YXJ0IixkZXNjcmlwdGlvbjoiR28gdG8gc3RhcnQiLGJpbmRLZXk6bygiQ3RybC1Ib21lIiwiQ29tbWFuZC1Ib21lfENvbW1hbmQtVXAiKSxleGVjOmZ1bmN0aW9uKGUpe2UubmF2aWdhdGVGaWxlU3RhcnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHJlYWRPbmx5OiEwLHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixhY2VDb21tYW5kR3JvdXA6ImZpbGVKdW1wIn0se25hbWU6InNlbGVjdHVwIixkZXNjcmlwdGlvbjoiU2VsZWN0IHVwIixiaW5kS2V5Om8oIlNoaWZ0LVVwIiwiU2hpZnQtVXB8Q3RybC1TaGlmdC1QIiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdFVwKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvbGluZXVwIixkZXNjcmlwdGlvbjoiR28gbGluZSB1cCIsYmluZEtleTpvKCJVcCIsIlVwfEN0cmwtUCIpLGV4ZWM6ZnVuY3Rpb24oZSx0KXtlLm5hdmlnYXRlVXAodC50aW1lcyl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHRvZW5kIixkZXNjcmlwdGlvbjoiU2VsZWN0IHRvIGVuZCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUVuZCIsIkNvbW1hbmQtU2hpZnQtRW5kfENvbW1hbmQtU2hpZnQtRG93biIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RGaWxlRW5kKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixyZWFkT25seTohMCxzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIsYWNlQ29tbWFuZEdyb3VwOiJmaWxlSnVtcCJ9LHtuYW1lOiJnb3RvZW5kIixkZXNjcmlwdGlvbjoiR28gdG8gZW5kIixiaW5kS2V5Om8oIkN0cmwtRW5kIiwiQ29tbWFuZC1FbmR8Q29tbWFuZC1Eb3duIiksZXhlYzpmdW5jdGlvbihlKXtlLm5hdmlnYXRlRmlsZUVuZCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIscmVhZE9ubHk6ITAsc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLGFjZUNvbW1hbmRHcm91cDoiZmlsZUp1bXAifSx7bmFtZToic2VsZWN0ZG93biIsZGVzY3JpcHRpb246IlNlbGVjdCBkb3duIixiaW5kS2V5Om8oIlNoaWZ0LURvd24iLCJTaGlmdC1Eb3dufEN0cmwtU2hpZnQtTiIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3REb3duKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvbGluZWRvd24iLGRlc2NyaXB0aW9uOiJHbyBsaW5lIGRvd24iLGJpbmRLZXk6bygiRG93biIsIkRvd258Q3RybC1OIiksZXhlYzpmdW5jdGlvbihlLHQpe2UubmF2aWdhdGVEb3duKHQudGltZXMpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R3b3JkbGVmdCIsZGVzY3JpcHRpb246IlNlbGVjdCB3b3JkIGxlZnQiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1MZWZ0IiwiT3B0aW9uLVNoaWZ0LUxlZnQiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0V29yZExlZnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3dvcmRsZWZ0IixkZXNjcmlwdGlvbjoiR28gdG8gd29yZCBsZWZ0IixiaW5kS2V5Om8oIkN0cmwtTGVmdCIsIk9wdGlvbi1MZWZ0IiksZXhlYzpmdW5jdGlvbihlKXtlLm5hdmlnYXRlV29yZExlZnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0dG9saW5lc3RhcnQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgdG8gbGluZSBzdGFydCIsYmluZEtleTpvKCJBbHQtU2hpZnQtTGVmdCIsIkNvbW1hbmQtU2hpZnQtTGVmdHxDdHJsLVNoaWZ0LUEiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGluZVN0YXJ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvdG9saW5lc3RhcnQiLGRlc2NyaXB0aW9uOiJHbyB0byBsaW5lIHN0YXJ0IixiaW5kS2V5Om8oIkFsdC1MZWZ0fEhvbWUiLCJDb21tYW5kLUxlZnR8SG9tZXxDdHJsLUEiKSxleGVjOmZ1bmN0aW9uKGUpe2UubmF2aWdhdGVMaW5lU3RhcnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0bGVmdCIsZGVzY3JpcHRpb246IlNlbGVjdCBsZWZ0IixiaW5kS2V5Om8oIlNoaWZ0LUxlZnQiLCJTaGlmdC1MZWZ0fEN0cmwtU2hpZnQtQiIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMZWZ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvdG9sZWZ0IixkZXNjcmlwdGlvbjoiR28gdG8gbGVmdCIsYmluZEtleTpvKCJMZWZ0IiwiTGVmdHxDdHJsLUIiKSxleGVjOmZ1bmN0aW9uKGUsdCl7ZS5uYXZpZ2F0ZUxlZnQodC50aW1lcyl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHdvcmRyaWdodCIsZGVzY3JpcHRpb246IlNlbGVjdCB3b3JkIHJpZ2h0IixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtUmlnaHQiLCJPcHRpb24tU2hpZnQtUmlnaHQiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0V29yZFJpZ2h0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvdG93b3JkcmlnaHQiLGRlc2NyaXB0aW9uOiJHbyB0byB3b3JkIHJpZ2h0IixiaW5kS2V5Om8oIkN0cmwtUmlnaHQiLCJPcHRpb24tUmlnaHQiKSxleGVjOmZ1bmN0aW9uKGUpe2UubmF2aWdhdGVXb3JkUmlnaHQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0dG9saW5lZW5kIixkZXNjcmlwdGlvbjoiU2VsZWN0IHRvIGxpbmUgZW5kIixiaW5kS2V5Om8oIkFsdC1TaGlmdC1SaWdodCIsIkNvbW1hbmQtU2hpZnQtUmlnaHR8U2hpZnQtRW5kfEN0cmwtU2hpZnQtRSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lRW5kKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvdG9saW5lZW5kIixkZXNjcmlwdGlvbjoiR28gdG8gbGluZSBlbmQiLGJpbmRLZXk6bygiQWx0LVJpZ2h0fEVuZCIsIkNvbW1hbmQtUmlnaHR8RW5kfEN0cmwtRSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5uYXZpZ2F0ZUxpbmVFbmQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0cmlnaHQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgcmlnaHQiLGJpbmRLZXk6bygiU2hpZnQtUmlnaHQiLCJTaGlmdC1SaWdodCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RSaWdodCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvcmlnaHQiLGRlc2NyaXB0aW9uOiJHbyB0byByaWdodCIsYmluZEtleTpvKCJSaWdodCIsIlJpZ2h0fEN0cmwtRiIpLGV4ZWM6ZnVuY3Rpb24oZSx0KXtlLm5hdmlnYXRlUmlnaHQodC50aW1lcyl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHBhZ2Vkb3duIixkZXNjcmlwdGlvbjoiU2VsZWN0IHBhZ2UgZG93biIsYmluZEtleToiU2hpZnQtUGFnZURvd24iLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RQYWdlRG93bigpfSxyZWFkT25seTohMH0se25hbWU6InBhZ2Vkb3duIixkZXNjcmlwdGlvbjoiUGFnZSBkb3duIixiaW5kS2V5Om8obnVsbCwiT3B0aW9uLVBhZ2VEb3duIiksZXhlYzpmdW5jdGlvbihlKXtlLnNjcm9sbFBhZ2VEb3duKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3BhZ2Vkb3duIixkZXNjcmlwdGlvbjoiR28gdG8gcGFnZSBkb3duIixiaW5kS2V5Om8oIlBhZ2VEb3duIiwiUGFnZURvd258Q3RybC1WIiksZXhlYzpmdW5jdGlvbihlKXtlLmdvdG9QYWdlRG93bigpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdHBhZ2V1cCIsZGVzY3JpcHRpb246IlNlbGVjdCBwYWdlIHVwIixiaW5kS2V5OiJTaGlmdC1QYWdlVXAiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RQYWdlVXAoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJwYWdldXAiLGRlc2NyaXB0aW9uOiJQYWdlIHVwIixiaW5kS2V5Om8obnVsbCwiT3B0aW9uLVBhZ2VVcCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zY3JvbGxQYWdlVXAoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvcGFnZXVwIixkZXNjcmlwdGlvbjoiR28gdG8gcGFnZSB1cCIsYmluZEtleToiUGFnZVVwIixleGVjOmZ1bmN0aW9uKGUpe2UuZ290b1BhZ2VVcCgpfSxyZWFkT25seTohMH0se25hbWU6InNjcm9sbHVwIixkZXNjcmlwdGlvbjoiU2Nyb2xsIHVwIixiaW5kS2V5Om8oIkN0cmwtVXAiLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW5kZXJlci5zY3JvbGxCeSgwLC0yKmUucmVuZGVyZXIubGF5ZXJDb25maWcubGluZUhlaWdodCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2Nyb2xsZG93biIsZGVzY3JpcHRpb246IlNjcm9sbCBkb3duIixiaW5kS2V5Om8oIkN0cmwtRG93biIsbnVsbCksZXhlYzpmdW5jdGlvbihlKXtlLnJlbmRlcmVyLnNjcm9sbEJ5KDAsMiplLnJlbmRlcmVyLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdGxpbmVzdGFydCIsZGVzY3JpcHRpb246IlNlbGVjdCBsaW5lIHN0YXJ0IixiaW5kS2V5OiJTaGlmdC1Ib21lIixleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGluZVN0YXJ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdGxpbmVlbmQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgbGluZSBlbmQiLGJpbmRLZXk6IlNoaWZ0LUVuZCIsZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVFbmQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToidG9nZ2xlcmVjb3JkaW5nIixkZXNjcmlwdGlvbjoiVG9nZ2xlIHJlY29yZGluZyIsYmluZEtleTpvKCJDdHJsLUFsdC1FIiwiQ29tbWFuZC1PcHRpb24tRSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5jb21tYW5kcy50b2dnbGVSZWNvcmRpbmcoZSl9LHJlYWRPbmx5OiEwfSx7bmFtZToicmVwbGF5bWFjcm8iLGRlc2NyaXB0aW9uOiJSZXBsYXkgbWFjcm8iLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1FIiwiQ29tbWFuZC1TaGlmdC1FIiksZXhlYzpmdW5jdGlvbihlKXtlLmNvbW1hbmRzLnJlcGxheShlKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJqdW1wdG9tYXRjaGluZyIsZGVzY3JpcHRpb246Ikp1bXAgdG8gbWF0Y2hpbmciLGJpbmRLZXk6bygiQ3RybC1cXHxDdHJsLVAiLCJDb21tYW5kLVxcIiksZXhlYzpmdW5jdGlvbihlKXtlLmp1bXBUb01hdGNoaW5nKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R0b21hdGNoaW5nIixkZXNjcmlwdGlvbjoiU2VsZWN0IHRvIG1hdGNoaW5nIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtXFx8Q3RybC1TaGlmdC1QIiwiQ29tbWFuZC1TaGlmdC1cXCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5qdW1wVG9NYXRjaGluZyghMCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIscmVhZE9ubHk6ITB9LHtuYW1lOiJleHBhbmRUb01hdGNoaW5nIixkZXNjcmlwdGlvbjoiRXhwYW5kIHRvIG1hdGNoaW5nIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtTSIsIkN0cmwtU2hpZnQtTSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5qdW1wVG9NYXRjaGluZyghMCwhMCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIscmVhZE9ubHk6ITB9LHtuYW1lOiJwYXNzS2V5c1RvQnJvd3NlciIsZGVzY3JpcHRpb246IlBhc3Mga2V5cyB0byBicm93c2VyIixiaW5kS2V5Om8obnVsbCxudWxsKSxleGVjOmZ1bmN0aW9uKCl7fSxwYXNzRXZlbnQ6ITAscmVhZE9ubHk6ITB9LHtuYW1lOiJjb3B5IixkZXNjcmlwdGlvbjoiQ29weSIsZXhlYzpmdW5jdGlvbihlKXt9LHJlYWRPbmx5OiEwfSx7bmFtZToiY3V0IixkZXNjcmlwdGlvbjoiQ3V0IixleGVjOmZ1bmN0aW9uKGUpe3ZhciB0PWUuJGNvcHlXaXRoRW1wdHlTZWxlY3Rpb24mJmUuc2VsZWN0aW9uLmlzRW1wdHkoKSxuPXQ/ZS5zZWxlY3Rpb24uZ2V0TGluZVJhbmdlKCk6ZS5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTtlLl9lbWl0KCJjdXQiLG4pLG4uaXNFbXB0eSgpfHxlLnNlc3Npb24ucmVtb3ZlKG4pLGUuY2xlYXJTZWxlY3Rpb24oKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIsbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2gifSx7bmFtZToicGFzdGUiLGRlc2NyaXB0aW9uOiJQYXN0ZSIsZXhlYzpmdW5jdGlvbihlLHQpe2UuJGhhbmRsZVBhc3RlKHQpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InJlbW92ZWxpbmUiLGRlc2NyaXB0aW9uOiJSZW1vdmUgbGluZSIsYmluZEtleTpvKCJDdHJsLUQiLCJDb21tYW5kLUQiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVtb3ZlTGluZXMoKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIsbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2hMaW5lIn0se25hbWU6ImR1cGxpY2F0ZVNlbGVjdGlvbiIsZGVzY3JpcHRpb246IkR1cGxpY2F0ZSBzZWxlY3Rpb24iLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1EIiwiQ29tbWFuZC1TaGlmdC1EIiksZXhlYzpmdW5jdGlvbihlKXtlLmR1cGxpY2F0ZVNlbGVjdGlvbigpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCJ9LHtuYW1lOiJzb3J0bGluZXMiLGRlc2NyaXB0aW9uOiJTb3J0IGxpbmVzIixiaW5kS2V5Om8oIkN0cmwtQWx0LVMiLCJDb21tYW5kLUFsdC1TIiksZXhlYzpmdW5jdGlvbihlKXtlLnNvcnRMaW5lcygpfSxzY3JvbGxJbnRvVmlldzoic2VsZWN0aW9uIixtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaExpbmUifSx7bmFtZToidG9nZ2xlY29tbWVudCIsZGVzY3JpcHRpb246IlRvZ2dsZSBjb21tZW50IixiaW5kS2V5Om8oIkN0cmwtLyIsIkNvbW1hbmQtLyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS50b2dnbGVDb21tZW50TGluZXMoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2hMaW5lIixzY3JvbGxJbnRvVmlldzoic2VsZWN0aW9uUGFydCJ9LHtuYW1lOiJ0b2dnbGVCbG9ja0NvbW1lbnQiLGRlc2NyaXB0aW9uOiJUb2dnbGUgYmxvY2sgY29tbWVudCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LS8iLCJDb21tYW5kLVNoaWZ0LS8iKSxleGVjOmZ1bmN0aW9uKGUpe2UudG9nZ2xlQmxvY2tDb21tZW50KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoic2VsZWN0aW9uUGFydCJ9LHtuYW1lOiJtb2RpZnlOdW1iZXJVcCIsZGVzY3JpcHRpb246Ik1vZGlmeSBudW1iZXIgdXAiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1VcCIsIkFsdC1TaGlmdC1VcCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5tb2RpZnlOdW1iZXIoMSl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIn0se25hbWU6Im1vZGlmeU51bWJlckRvd24iLGRlc2NyaXB0aW9uOiJNb2RpZnkgbnVtYmVyIGRvd24iLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1Eb3duIiwiQWx0LVNoaWZ0LURvd24iKSxleGVjOmZ1bmN0aW9uKGUpe2UubW9kaWZ5TnVtYmVyKC0xKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIsbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2gifSx7bmFtZToicmVwbGFjZSIsZGVzY3JpcHRpb246IlJlcGxhY2UiLGJpbmRLZXk6bygiQ3RybC1IIiwiQ29tbWFuZC1PcHRpb24tRiIpLGV4ZWM6ZnVuY3Rpb24oZSl7aS5sb2FkTW9kdWxlKCJhY2UvZXh0L3NlYXJjaGJveCIsZnVuY3Rpb24odCl7dC5TZWFyY2goZSwhMCl9KX19LHtuYW1lOiJ1bmRvIixkZXNjcmlwdGlvbjoiVW5kbyIsYmluZEtleTpvKCJDdHJsLVoiLCJDb21tYW5kLVoiKSxleGVjOmZ1bmN0aW9uKGUpe2UudW5kbygpfX0se25hbWU6InJlZG8iLGRlc2NyaXB0aW9uOiJSZWRvIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtWnxDdHJsLVkiLCJDb21tYW5kLVNoaWZ0LVp8Q29tbWFuZC1ZIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlZG8oKX19LHtuYW1lOiJjb3B5bGluZXN1cCIsZGVzY3JpcHRpb246IkNvcHkgbGluZXMgdXAiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LVVwIiwiQ29tbWFuZC1PcHRpb24tVXAiKSxleGVjOmZ1bmN0aW9uKGUpe2UuY29weUxpbmVzVXAoKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJtb3ZlbGluZXN1cCIsZGVzY3JpcHRpb246Ik1vdmUgbGluZXMgdXAiLGJpbmRLZXk6bygiQWx0LVVwIiwiT3B0aW9uLVVwIiksZXhlYzpmdW5jdGlvbihlKXtlLm1vdmVMaW5lc1VwKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToiY29weWxpbmVzZG93biIsZGVzY3JpcHRpb246IkNvcHkgbGluZXMgZG93biIsYmluZEtleTpvKCJBbHQtU2hpZnQtRG93biIsIkNvbW1hbmQtT3B0aW9uLURvd24iKSxleGVjOmZ1bmN0aW9uKGUpe2UuY29weUxpbmVzRG93bigpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6Im1vdmVsaW5lc2Rvd24iLGRlc2NyaXB0aW9uOiJNb3ZlIGxpbmVzIGRvd24iLGJpbmRLZXk6bygiQWx0LURvd24iLCJPcHRpb24tRG93biIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5tb3ZlTGluZXNEb3duKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToiZGVsIixkZXNjcmlwdGlvbjoiRGVsZXRlIixiaW5kS2V5Om8oIkRlbGV0ZSIsIkRlbGV0ZXxDdHJsLUR8U2hpZnQtRGVsZXRlIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlbW92ZSgicmlnaHQiKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToiYmFja3NwYWNlIixkZXNjcmlwdGlvbjoiQmFja3NwYWNlIixiaW5kS2V5Om8oIlNoaWZ0LUJhY2tzcGFjZXxCYWNrc3BhY2UiLCJDdHJsLUJhY2tzcGFjZXxTaGlmdC1CYWNrc3BhY2V8QmFja3NwYWNlfEN0cmwtSCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW1vdmUoImxlZnQiKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToiY3V0X29yX2RlbGV0ZSIsZGVzY3JpcHRpb246IkN1dCBvciBkZWxldGUiLGJpbmRLZXk6bygiU2hpZnQtRGVsZXRlIixudWxsKSxleGVjOmZ1bmN0aW9uKGUpe2lmKCFlLnNlbGVjdGlvbi5pc0VtcHR5KCkpcmV0dXJuITE7ZS5yZW1vdmUoImxlZnQiKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToicmVtb3ZldG9saW5lc3RhcnQiLGRlc2NyaXB0aW9uOiJSZW1vdmUgdG8gbGluZSBzdGFydCIsYmluZEtleTpvKCJBbHQtQmFja3NwYWNlIiwiQ29tbWFuZC1CYWNrc3BhY2UiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVtb3ZlVG9MaW5lU3RhcnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToicmVtb3ZldG9saW5lZW5kIixkZXNjcmlwdGlvbjoiUmVtb3ZlIHRvIGxpbmUgZW5kIixiaW5kS2V5Om8oIkFsdC1EZWxldGUiLCJDdHJsLUt8Q29tbWFuZC1EZWxldGUiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVtb3ZlVG9MaW5lRW5kKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InJlbW92ZXRvbGluZXN0YXJ0aGFyZCIsZGVzY3JpcHRpb246IlJlbW92ZSB0byBsaW5lIHN0YXJ0IGhhcmQiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1CYWNrc3BhY2UiLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTt0LnN0YXJ0LmNvbHVtbj0wLGUuc2Vzc2lvbi5yZW1vdmUodCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InJlbW92ZXRvbGluZWVuZGhhcmQiLGRlc2NyaXB0aW9uOiJSZW1vdmUgdG8gbGluZSBlbmQgaGFyZCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LURlbGV0ZSIsbnVsbCksZXhlYzpmdW5jdGlvbihlKXt2YXIgdD1lLnNlbGVjdGlvbi5nZXRSYW5nZSgpO3QuZW5kLmNvbHVtbj1OdW1iZXIuTUFYX1ZBTFVFLGUuc2Vzc2lvbi5yZW1vdmUodCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InJlbW92ZXdvcmRsZWZ0IixkZXNjcmlwdGlvbjoiUmVtb3ZlIHdvcmQgbGVmdCIsYmluZEtleTpvKCJDdHJsLUJhY2tzcGFjZSIsIkFsdC1CYWNrc3BhY2V8Q3RybC1BbHQtQmFja3NwYWNlIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlbW92ZVdvcmRMZWZ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InJlbW92ZXdvcmRyaWdodCIsZGVzY3JpcHRpb246IlJlbW92ZSB3b3JkIHJpZ2h0IixiaW5kS2V5Om8oIkN0cmwtRGVsZXRlIiwiQWx0LURlbGV0ZSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW1vdmVXb3JkUmlnaHQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToib3V0ZGVudCIsZGVzY3JpcHRpb246Ik91dGRlbnQiLGJpbmRLZXk6bygiU2hpZnQtVGFiIiwiU2hpZnQtVGFiIiksZXhlYzpmdW5jdGlvbihlKXtlLmJsb2NrT3V0ZGVudCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6InNlbGVjdGlvblBhcnQifSx7bmFtZToiaW5kZW50IixkZXNjcmlwdGlvbjoiSW5kZW50IixiaW5kS2V5Om8oIlRhYiIsIlRhYiIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5pbmRlbnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJzZWxlY3Rpb25QYXJ0In0se25hbWU6ImJsb2Nrb3V0ZGVudCIsZGVzY3JpcHRpb246IkJsb2NrIG91dGRlbnQiLGJpbmRLZXk6bygiQ3RybC1bIiwiQ3RybC1bIiksZXhlYzpmdW5jdGlvbihlKXtlLmJsb2NrT3V0ZGVudCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaExpbmUiLHNjcm9sbEludG9WaWV3OiJzZWxlY3Rpb25QYXJ0In0se25hbWU6ImJsb2NraW5kZW50IixkZXNjcmlwdGlvbjoiQmxvY2sgaW5kZW50IixiaW5kS2V5Om8oIkN0cmwtXSIsIkN0cmwtXSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5ibG9ja0luZGVudCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaExpbmUiLHNjcm9sbEludG9WaWV3OiJzZWxlY3Rpb25QYXJ0In0se25hbWU6Imluc2VydHN0cmluZyIsZGVzY3JpcHRpb246Ikluc2VydCBzdHJpbmciLGV4ZWM6ZnVuY3Rpb24oZSx0KXtlLmluc2VydCh0KX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToiaW5zZXJ0dGV4dCIsZGVzY3JpcHRpb246Ikluc2VydCB0ZXh0IixleGVjOmZ1bmN0aW9uKGUsdCl7ZS5pbnNlcnQoci5zdHJpbmdSZXBlYXQodC50ZXh0fHwiIix0LnRpbWVzfHwxKSl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InNwbGl0bGluZSIsZGVzY3JpcHRpb246IlNwbGl0IGxpbmUiLGJpbmRLZXk6byhudWxsLCJDdHJsLU8iKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc3BsaXRMaW5lKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InRyYW5zcG9zZWxldHRlcnMiLGRlc2NyaXB0aW9uOiJUcmFuc3Bvc2UgbGV0dGVycyIsYmluZEtleTpvKCJBbHQtU2hpZnQtWCIsIkN0cmwtVCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS50cmFuc3Bvc2VMZXR0ZXJzKCl9LG11bHRpU2VsZWN0QWN0aW9uOmZ1bmN0aW9uKGUpe2UudHJhbnNwb3NlU2VsZWN0aW9ucygxKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJ0b3VwcGVyY2FzZSIsZGVzY3JpcHRpb246IlRvIHVwcGVyY2FzZSIsYmluZEtleTpvKCJDdHJsLVUiLCJDdHJsLVUiKSxleGVjOmZ1bmN0aW9uKGUpe2UudG9VcHBlckNhc2UoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToidG9sb3dlcmNhc2UiLGRlc2NyaXB0aW9uOiJUbyBsb3dlcmNhc2UiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1VIiwiQ3RybC1TaGlmdC1VIiksZXhlYzpmdW5jdGlvbihlKXtlLnRvTG93ZXJDYXNlKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6ImV4cGFuZHRvbGluZSIsZGVzY3JpcHRpb246IkV4cGFuZCB0byBsaW5lIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtTCIsIkNvbW1hbmQtU2hpZnQtTCIpLGV4ZWM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTt0LnN0YXJ0LmNvbHVtbj10LmVuZC5jb2x1bW49MCx0LmVuZC5yb3crKyxlLnNlbGVjdGlvbi5zZXRSYW5nZSh0LCExKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiam9pbmxpbmVzIixkZXNjcmlwdGlvbjoiSm9pbiBsaW5lcyIsYmluZEtleTpvKG51bGwsbnVsbCksZXhlYzpmdW5jdGlvbihlKXt2YXIgdD1lLnNlbGVjdGlvbi5pc0JhY2t3YXJkcygpLG49dD9lLnNlbGVjdGlvbi5nZXRTZWxlY3Rpb25MZWFkKCk6ZS5zZWxlY3Rpb24uZ2V0U2VsZWN0aW9uQW5jaG9yKCksaT10P2Uuc2VsZWN0aW9uLmdldFNlbGVjdGlvbkFuY2hvcigpOmUuc2VsZWN0aW9uLmdldFNlbGVjdGlvbkxlYWQoKSxvPWUuc2Vzc2lvbi5kb2MuZ2V0TGluZShuLnJvdykubGVuZ3RoLHU9ZS5zZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UoZS5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSksYT11LnJlcGxhY2UoL1xuXHMqLywiICIpLmxlbmd0aCxmPWUuc2Vzc2lvbi5kb2MuZ2V0TGluZShuLnJvdyk7Zm9yKHZhciBsPW4ucm93KzE7bDw9aS5yb3crMTtsKyspe3ZhciBjPXIuc3RyaW5nVHJpbUxlZnQoci5zdHJpbmdUcmltUmlnaHQoZS5zZXNzaW9uLmRvYy5nZXRMaW5lKGwpKSk7Yy5sZW5ndGghPT0wJiYoYz0iICIrYyksZis9Y31pLnJvdysxPGUuc2Vzc2lvbi5kb2MuZ2V0TGVuZ3RoKCktMSYmKGYrPWUuc2Vzc2lvbi5kb2MuZ2V0TmV3TGluZUNoYXJhY3RlcigpKSxlLmNsZWFyU2VsZWN0aW9uKCksZS5zZXNzaW9uLmRvYy5yZXBsYWNlKG5ldyBzKG4ucm93LDAsaS5yb3crMiwwKSxmKSxhPjA/KGUuc2VsZWN0aW9uLm1vdmVDdXJzb3JUbyhuLnJvdyxuLmNvbHVtbiksZS5zZWxlY3Rpb24uc2VsZWN0VG8obi5yb3csbi5jb2x1bW4rYSkpOihvPWUuc2Vzc2lvbi5kb2MuZ2V0TGluZShuLnJvdykubGVuZ3RoPm8/bysxOm8sZS5zZWxlY3Rpb24ubW92ZUN1cnNvclRvKG4ucm93LG8pKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHJlYWRPbmx5OiEwfSx7bmFtZToiaW52ZXJ0U2VsZWN0aW9uIixkZXNjcmlwdGlvbjoiSW52ZXJ0IHNlbGVjdGlvbiIsYmluZEtleTpvKG51bGwsbnVsbCksZXhlYzpmdW5jdGlvbihlKXt2YXIgdD1lLnNlc3Npb24uZG9jLmdldExlbmd0aCgpLTEsbj1lLnNlc3Npb24uZG9jLmdldExpbmUodCkubGVuZ3RoLHI9ZS5zZWxlY3Rpb24ucmFuZ2VMaXN0LnJhbmdlcyxpPVtdO3IubGVuZ3RoPDEmJihyPVtlLnNlbGVjdGlvbi5nZXRSYW5nZSgpXSk7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspbz09ci5sZW5ndGgtMSYmKHJbb10uZW5kLnJvdyE9PXR8fHJbb10uZW5kLmNvbHVtbiE9PW4pJiZpLnB1c2gobmV3IHMocltvXS5lbmQucm93LHJbb10uZW5kLmNvbHVtbix0LG4pKSxvPT09MD8ocltvXS5zdGFydC5yb3chPT0wfHxyW29dLnN0YXJ0LmNvbHVtbiE9PTApJiZpLnB1c2gobmV3IHMoMCwwLHJbb10uc3RhcnQucm93LHJbb10uc3RhcnQuY29sdW1uKSk6aS5wdXNoKG5ldyBzKHJbby0xXS5lbmQucm93LHJbby0xXS5lbmQuY29sdW1uLHJbb10uc3RhcnQucm93LHJbb10uc3RhcnQuY29sdW1uKSk7ZS5leGl0TXVsdGlTZWxlY3RNb2RlKCksZS5jbGVhclNlbGVjdGlvbigpO2Zvcih2YXIgbz0wO288aS5sZW5ndGg7bysrKWUuc2VsZWN0aW9uLmFkZFJhbmdlKGlbb10sITEpfSxyZWFkT25seTohMCxzY3JvbGxJbnRvVmlldzoibm9uZSJ9LHtuYW1lOiJvcGVuQ29tbWFuZFBhbGxldGUiLGRlc2NyaXB0aW9uOiJPcGVuIGNvbW1hbmQgcGFsbGV0ZSIsYmluZEtleTpvKCJGMSIsIkYxIiksZXhlYzpmdW5jdGlvbihlKXtlLnByb21wdCh7JHR5cGU6ImNvbW1hbmRzIn0pfSxyZWFkT25seTohMH0se25hbWU6Im1vZGVTZWxlY3QiLGRlc2NyaXB0aW9uOiJDaGFuZ2UgbGFuZ3VhZ2UgbW9kZS4uLiIsYmluZEtleTpvKG51bGwsbnVsbCksZXhlYzpmdW5jdGlvbihlKXtlLnByb21wdCh7JHR5cGU6Im1vZGVzIn0pfSxyZWFkT25seTohMH1dfSksYWNlLmRlZmluZSgiYWNlL2VkaXRvciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZml4b2xkYnJvd3NlcnMiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi91c2VyYWdlbnQiLCJhY2Uva2V5Ym9hcmQvdGV4dGlucHV0IiwiYWNlL21vdXNlL21vdXNlX2hhbmRsZXIiLCJhY2UvbW91c2UvZm9sZF9oYW5kbGVyIiwiYWNlL2tleWJvYXJkL2tleWJpbmRpbmciLCJhY2UvZWRpdF9zZXNzaW9uIiwiYWNlL3NlYXJjaCIsImFjZS9yYW5nZSIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9jb21tYW5kcy9jb21tYW5kX21hbmFnZXIiLCJhY2UvY29tbWFuZHMvZGVmYXVsdF9jb21tYW5kcyIsImFjZS9jb25maWciLCJhY2UvdG9rZW5faXRlcmF0b3IiLCJhY2UvY2xpcGJvYXJkIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlKCIuL2xpYi9maXhvbGRicm93c2VycyIpO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvZG9tIikscz1lKCIuL2xpYi9sYW5nIiksbz1lKCIuL2xpYi91c2VyYWdlbnQiKSx1PWUoIi4va2V5Ym9hcmQvdGV4dGlucHV0IikuVGV4dElucHV0LGE9ZSgiLi9tb3VzZS9tb3VzZV9oYW5kbGVyIikuTW91c2VIYW5kbGVyLGY9ZSgiLi9tb3VzZS9mb2xkX2hhbmRsZXIiKS5Gb2xkSGFuZGxlcixsPWUoIi4va2V5Ym9hcmQva2V5YmluZGluZyIpLktleUJpbmRpbmcsYz1lKCIuL2VkaXRfc2Vzc2lvbiIpLkVkaXRTZXNzaW9uLGg9ZSgiLi9zZWFyY2giKS5TZWFyY2gscD1lKCIuL3JhbmdlIikuUmFuZ2UsZD1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHY9ZSgiLi9jb21tYW5kcy9jb21tYW5kX21hbmFnZXIiKS5Db21tYW5kTWFuYWdlcixtPWUoIi4vY29tbWFuZHMvZGVmYXVsdF9jb21tYW5kcyIpLmNvbW1hbmRzLGc9ZSgiLi9jb25maWciKSx5PWUoIi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yLGI9ZSgiLi9jbGlwYm9hcmQiKSx3PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmdldENvbnRhaW5lckVsZW1lbnQoKTt0aGlzLmNvbnRhaW5lcj1yLHRoaXMucmVuZGVyZXI9ZSx0aGlzLmlkPSJlZGl0b3IiKyArK3cuJHVpZCx0aGlzLmNvbW1hbmRzPW5ldyB2KG8uaXNNYWM/Im1hYyI6IndpbiIsbSksdHlwZW9mIGRvY3VtZW50PT0ib2JqZWN0IiYmKHRoaXMudGV4dElucHV0PW5ldyB1KGUuZ2V0VGV4dEFyZWFDb250YWluZXIoKSx0aGlzKSx0aGlzLnJlbmRlcmVyLnRleHRhcmVhPXRoaXMudGV4dElucHV0LmdldEVsZW1lbnQoKSx0aGlzLiRtb3VzZUhhbmRsZXI9bmV3IGEodGhpcyksbmV3IGYodGhpcykpLHRoaXMua2V5QmluZGluZz1uZXcgbCh0aGlzKSx0aGlzLiRzZWFyY2g9KG5ldyBoKS5zZXQoe3dyYXA6ITB9KSx0aGlzLiRoaXN0b3J5VHJhY2tlcj10aGlzLiRoaXN0b3J5VHJhY2tlci5iaW5kKHRoaXMpLHRoaXMuY29tbWFuZHMub24oImV4ZWMiLHRoaXMuJGhpc3RvcnlUcmFja2VyKSx0aGlzLiRpbml0T3BlcmF0aW9uTGlzdGVuZXJzKCksdGhpcy5fJGVtaXRJbnB1dEV2ZW50PXMuZGVsYXllZENhbGwoZnVuY3Rpb24oKXt0aGlzLl9zaWduYWwoImlucHV0Iix7fSksdGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24uYmdUb2tlbml6ZXImJnRoaXMuc2Vzc2lvbi5iZ1Rva2VuaXplci5zY2hlZHVsZVN0YXJ0KCl9LmJpbmQodGhpcykpLHRoaXMub24oImNoYW5nZSIsZnVuY3Rpb24oZSx0KXt0Ll8kZW1pdElucHV0RXZlbnQuc2NoZWR1bGUoMzEpfSksdGhpcy5zZXRTZXNzaW9uKHR8fG4mJm4uc2Vzc2lvbnx8bmV3IGMoIiIpKSxnLnJlc2V0T3B0aW9ucyh0aGlzKSxuJiZ0aGlzLnNldE9wdGlvbnMobiksZy5fc2lnbmFsKCJlZGl0b3IiLHRoaXMpfTt3LiR1aWQ9MCxmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMsZCksdGhpcy4kaW5pdE9wZXJhdGlvbkxpc3RlbmVycz1mdW5jdGlvbigpe3RoaXMuY29tbWFuZHMub24oImV4ZWMiLHRoaXMuc3RhcnRPcGVyYXRpb24uYmluZCh0aGlzKSwhMCksdGhpcy5jb21tYW5kcy5vbigiYWZ0ZXJFeGVjIix0aGlzLmVuZE9wZXJhdGlvbi5iaW5kKHRoaXMpLCEwKSx0aGlzLiRvcFJlc2V0VGltZXI9cy5kZWxheWVkQ2FsbCh0aGlzLmVuZE9wZXJhdGlvbi5iaW5kKHRoaXMsITApKSx0aGlzLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7dGhpcy5jdXJPcHx8KHRoaXMuc3RhcnRPcGVyYXRpb24oKSx0aGlzLmN1ck9wLnNlbGVjdGlvbkJlZm9yZT10aGlzLiRsYXN0U2VsKSx0aGlzLmN1ck9wLmRvY0NoYW5nZWQ9ITB9LmJpbmQodGhpcyksITApLHRoaXMub24oImNoYW5nZVNlbGVjdGlvbiIsZnVuY3Rpb24oKXt0aGlzLmN1ck9wfHwodGhpcy5zdGFydE9wZXJhdGlvbigpLHRoaXMuY3VyT3Auc2VsZWN0aW9uQmVmb3JlPXRoaXMuJGxhc3RTZWwpLHRoaXMuY3VyT3Auc2VsZWN0aW9uQ2hhbmdlZD0hMH0uYmluZCh0aGlzKSwhMCl9LHRoaXMuY3VyT3A9bnVsbCx0aGlzLnByZXZPcD17fSx0aGlzLnN0YXJ0T3BlcmF0aW9uPWZ1bmN0aW9uKGUpe2lmKHRoaXMuY3VyT3Ape2lmKCFlfHx0aGlzLmN1ck9wLmNvbW1hbmQpcmV0dXJuO3RoaXMucHJldk9wPXRoaXMuY3VyT3B9ZXx8KHRoaXMucHJldmlvdXNDb21tYW5kPW51bGwsZT17fSksdGhpcy4kb3BSZXNldFRpbWVyLnNjaGVkdWxlKCksdGhpcy5jdXJPcD10aGlzLnNlc3Npb24uY3VyT3A9e2NvbW1hbmQ6ZS5jb21tYW5kfHx7fSxhcmdzOmUuYXJncyxzY3JvbGxUb3A6dGhpcy5yZW5kZXJlci5zY3JvbGxUb3B9LHRoaXMuY3VyT3Auc2VsZWN0aW9uQmVmb3JlPXRoaXMuc2VsZWN0aW9uLnRvSlNPTigpfSx0aGlzLmVuZE9wZXJhdGlvbj1mdW5jdGlvbihlKXtpZih0aGlzLmN1ck9wKXtpZihlJiZlLnJldHVyblZhbHVlPT09ITEpcmV0dXJuIHRoaXMuY3VyT3A9bnVsbDtpZihlPT0xJiZ0aGlzLmN1ck9wLmNvbW1hbmQmJnRoaXMuY3VyT3AuY29tbWFuZC5uYW1lPT0ibW91c2UiKXJldHVybjt0aGlzLl9zaWduYWwoImJlZm9yZUVuZE9wZXJhdGlvbiIpO2lmKCF0aGlzLmN1ck9wKXJldHVybjt2YXIgdD10aGlzLmN1ck9wLmNvbW1hbmQsbj10JiZ0LnNjcm9sbEludG9WaWV3O2lmKG4pe3N3aXRjaChuKXtjYXNlImNlbnRlci1hbmltYXRlIjpuPSJhbmltYXRlIjtjYXNlImNlbnRlciI6dGhpcy5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyhudWxsLC41KTticmVhaztjYXNlImFuaW1hdGUiOmNhc2UiY3Vyc29yIjp0aGlzLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KCk7YnJlYWs7Y2FzZSJzZWxlY3Rpb25QYXJ0Ijp2YXIgcj10aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpLGk9dGhpcy5yZW5kZXJlci5sYXllckNvbmZpZzsoci5zdGFydC5yb3c+PWkubGFzdFJvd3x8ci5lbmQucm93PD1pLmZpcnN0Um93KSYmdGhpcy5yZW5kZXJlci5zY3JvbGxTZWxlY3Rpb25JbnRvVmlldyh0aGlzLnNlbGVjdGlvbi5hbmNob3IsdGhpcy5zZWxlY3Rpb24ubGVhZCk7YnJlYWs7ZGVmYXVsdDp9bj09ImFuaW1hdGUiJiZ0aGlzLnJlbmRlcmVyLmFuaW1hdGVTY3JvbGxpbmcodGhpcy5jdXJPcC5zY3JvbGxUb3ApfXZhciBzPXRoaXMuc2VsZWN0aW9uLnRvSlNPTigpO3RoaXMuY3VyT3Auc2VsZWN0aW9uQWZ0ZXI9cyx0aGlzLiRsYXN0U2VsPXRoaXMuc2VsZWN0aW9uLnRvSlNPTigpLHRoaXMuc2Vzc2lvbi5nZXRVbmRvTWFuYWdlcigpLmFkZFNlbGVjdGlvbihzKSx0aGlzLnByZXZPcD10aGlzLmN1ck9wLHRoaXMuY3VyT3A9bnVsbH19LHRoaXMuJG1lcmdlYWJsZUNvbW1hbmRzPVsiYmFja3NwYWNlIiwiZGVsIiwiaW5zZXJ0c3RyaW5nIl0sdGhpcy4kaGlzdG9yeVRyYWNrZXI9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuJG1lcmdlVW5kb0RlbHRhcylyZXR1cm47dmFyIHQ9dGhpcy5wcmV2T3Asbj10aGlzLiRtZXJnZWFibGVDb21tYW5kcyxyPXQuY29tbWFuZCYmZS5jb21tYW5kLm5hbWU9PXQuY29tbWFuZC5uYW1lO2lmKGUuY29tbWFuZC5uYW1lPT0iaW5zZXJ0c3RyaW5nIil7dmFyIGk9ZS5hcmdzO3RoaXMubWVyZ2VOZXh0Q29tbWFuZD09PXVuZGVmaW5lZCYmKHRoaXMubWVyZ2VOZXh0Q29tbWFuZD0hMCkscj1yJiZ0aGlzLm1lcmdlTmV4dENvbW1hbmQmJighL1xzLy50ZXN0KGkpfHwvXHMvLnRlc3QodC5hcmdzKSksdGhpcy5tZXJnZU5leHRDb21tYW5kPSEwfWVsc2Ugcj1yJiZuLmluZGV4T2YoZS5jb21tYW5kLm5hbWUpIT09LTE7dGhpcy4kbWVyZ2VVbmRvRGVsdGFzIT0iYWx3YXlzIiYmRGF0ZS5ub3coKS10aGlzLnNlcXVlbmNlU3RhcnRUaW1lPjJlMyYmKHI9ITEpLHI/dGhpcy5zZXNzaW9uLm1lcmdlVW5kb0RlbHRhcz0hMDpuLmluZGV4T2YoZS5jb21tYW5kLm5hbWUpIT09LTEmJih0aGlzLnNlcXVlbmNlU3RhcnRUaW1lPURhdGUubm93KCkpfSx0aGlzLnNldEtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbihlLHQpe2lmKGUmJnR5cGVvZiBlPT0ic3RyaW5nIiYmZSE9ImFjZSIpe3RoaXMuJGtleWJpbmRpbmdJZD1lO3ZhciBuPXRoaXM7Zy5sb2FkTW9kdWxlKFsia2V5YmluZGluZyIsZV0sZnVuY3Rpb24ocil7bi4ka2V5YmluZGluZ0lkPT1lJiZuLmtleUJpbmRpbmcuc2V0S2V5Ym9hcmRIYW5kbGVyKHImJnIuaGFuZGxlciksdCYmdCgpfSl9ZWxzZSB0aGlzLiRrZXliaW5kaW5nSWQ9bnVsbCx0aGlzLmtleUJpbmRpbmcuc2V0S2V5Ym9hcmRIYW5kbGVyKGUpLHQmJnQoKX0sdGhpcy5nZXRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rZXlCaW5kaW5nLmdldEtleWJvYXJkSGFuZGxlcigpfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oZSl7aWYodGhpcy5zZXNzaW9uPT1lKXJldHVybjt0aGlzLmN1ck9wJiZ0aGlzLmVuZE9wZXJhdGlvbigpLHRoaXMuY3VyT3A9e307dmFyIHQ9dGhpcy5zZXNzaW9uO2lmKHQpe3RoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZSIsdGhpcy4kb25Eb2N1bWVudENoYW5nZSksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlTW9kZSIsdGhpcy4kb25DaGFuZ2VNb2RlKSx0aGlzLnNlc3Npb24ub2ZmKCJ0b2tlbml6ZXJVcGRhdGUiLHRoaXMuJG9uVG9rZW5pemVyVXBkYXRlKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VUYWJTaXplIix0aGlzLiRvbkNoYW5nZVRhYlNpemUpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZVdyYXBMaW1pdCIsdGhpcy4kb25DaGFuZ2VXcmFwTGltaXQpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZVdyYXBNb2RlIix0aGlzLiRvbkNoYW5nZVdyYXBNb2RlKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VGb2xkIix0aGlzLiRvbkNoYW5nZUZvbGQpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZUZyb250TWFya2VyIix0aGlzLiRvbkNoYW5nZUZyb250TWFya2VyKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VCYWNrTWFya2VyIix0aGlzLiRvbkNoYW5nZUJhY2tNYXJrZXIpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZUJyZWFrcG9pbnQiLHRoaXMuJG9uQ2hhbmdlQnJlYWtwb2ludCksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlQW5ub3RhdGlvbiIsdGhpcy4kb25DaGFuZ2VBbm5vdGF0aW9uKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VPdmVyd3JpdGUiLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VTY3JvbGxUb3AiLHRoaXMuJG9uU2Nyb2xsVG9wQ2hhbmdlKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VTY3JvbGxMZWZ0Iix0aGlzLiRvblNjcm9sbExlZnRDaGFuZ2UpO3ZhciBuPXRoaXMuc2Vzc2lvbi5nZXRTZWxlY3Rpb24oKTtuLm9mZigiY2hhbmdlQ3Vyc29yIix0aGlzLiRvbkN1cnNvckNoYW5nZSksbi5vZmYoImNoYW5nZVNlbGVjdGlvbiIsdGhpcy4kb25TZWxlY3Rpb25DaGFuZ2UpfXRoaXMuc2Vzc2lvbj1lLGU/KHRoaXMuJG9uRG9jdW1lbnRDaGFuZ2U9dGhpcy5vbkRvY3VtZW50Q2hhbmdlLmJpbmQodGhpcyksZS5vbigiY2hhbmdlIix0aGlzLiRvbkRvY3VtZW50Q2hhbmdlKSx0aGlzLnJlbmRlcmVyLnNldFNlc3Npb24oZSksdGhpcy4kb25DaGFuZ2VNb2RlPXRoaXMub25DaGFuZ2VNb2RlLmJpbmQodGhpcyksZS5vbigiY2hhbmdlTW9kZSIsdGhpcy4kb25DaGFuZ2VNb2RlKSx0aGlzLiRvblRva2VuaXplclVwZGF0ZT10aGlzLm9uVG9rZW5pemVyVXBkYXRlLmJpbmQodGhpcyksZS5vbigidG9rZW5pemVyVXBkYXRlIix0aGlzLiRvblRva2VuaXplclVwZGF0ZSksdGhpcy4kb25DaGFuZ2VUYWJTaXplPXRoaXMucmVuZGVyZXIub25DaGFuZ2VUYWJTaXplLmJpbmQodGhpcy5yZW5kZXJlciksZS5vbigiY2hhbmdlVGFiU2l6ZSIsdGhpcy4kb25DaGFuZ2VUYWJTaXplKSx0aGlzLiRvbkNoYW5nZVdyYXBMaW1pdD10aGlzLm9uQ2hhbmdlV3JhcExpbWl0LmJpbmQodGhpcyksZS5vbigiY2hhbmdlV3JhcExpbWl0Iix0aGlzLiRvbkNoYW5nZVdyYXBMaW1pdCksdGhpcy4kb25DaGFuZ2VXcmFwTW9kZT10aGlzLm9uQ2hhbmdlV3JhcE1vZGUuYmluZCh0aGlzKSxlLm9uKCJjaGFuZ2VXcmFwTW9kZSIsdGhpcy4kb25DaGFuZ2VXcmFwTW9kZSksdGhpcy4kb25DaGFuZ2VGb2xkPXRoaXMub25DaGFuZ2VGb2xkLmJpbmQodGhpcyksZS5vbigiY2hhbmdlRm9sZCIsdGhpcy4kb25DaGFuZ2VGb2xkKSx0aGlzLiRvbkNoYW5nZUZyb250TWFya2VyPXRoaXMub25DaGFuZ2VGcm9udE1hcmtlci5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlRnJvbnRNYXJrZXIiLHRoaXMuJG9uQ2hhbmdlRnJvbnRNYXJrZXIpLHRoaXMuJG9uQ2hhbmdlQmFja01hcmtlcj10aGlzLm9uQ2hhbmdlQmFja01hcmtlci5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlQmFja01hcmtlciIsdGhpcy4kb25DaGFuZ2VCYWNrTWFya2VyKSx0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQ9dGhpcy5vbkNoYW5nZUJyZWFrcG9pbnQuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZUJyZWFrcG9pbnQiLHRoaXMuJG9uQ2hhbmdlQnJlYWtwb2ludCksdGhpcy4kb25DaGFuZ2VBbm5vdGF0aW9uPXRoaXMub25DaGFuZ2VBbm5vdGF0aW9uLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VBbm5vdGF0aW9uIix0aGlzLiRvbkNoYW5nZUFubm90YXRpb24pLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlPXRoaXMub25DdXJzb3JDaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZU92ZXJ3cml0ZSIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpLHRoaXMuJG9uU2Nyb2xsVG9wQ2hhbmdlPXRoaXMub25TY3JvbGxUb3BDaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZVNjcm9sbFRvcCIsdGhpcy4kb25TY3JvbGxUb3BDaGFuZ2UpLHRoaXMuJG9uU2Nyb2xsTGVmdENoYW5nZT10aGlzLm9uU2Nyb2xsTGVmdENoYW5nZS5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlU2Nyb2xsTGVmdCIsdGhpcy4kb25TY3JvbGxMZWZ0Q2hhbmdlKSx0aGlzLnNlbGVjdGlvbj1lLmdldFNlbGVjdGlvbigpLHRoaXMuc2VsZWN0aW9uLm9uKCJjaGFuZ2VDdXJzb3IiLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKSx0aGlzLiRvblNlbGVjdGlvbkNoYW5nZT10aGlzLm9uU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcyksdGhpcy5zZWxlY3Rpb24ub24oImNoYW5nZVNlbGVjdGlvbiIsdGhpcy4kb25TZWxlY3Rpb25DaGFuZ2UpLHRoaXMub25DaGFuZ2VNb2RlKCksdGhpcy5vbkN1cnNvckNoYW5nZSgpLHRoaXMub25TY3JvbGxUb3BDaGFuZ2UoKSx0aGlzLm9uU2Nyb2xsTGVmdENoYW5nZSgpLHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKSx0aGlzLm9uQ2hhbmdlRnJvbnRNYXJrZXIoKSx0aGlzLm9uQ2hhbmdlQmFja01hcmtlcigpLHRoaXMub25DaGFuZ2VCcmVha3BvaW50KCksdGhpcy5vbkNoYW5nZUFubm90YXRpb24oKSx0aGlzLnNlc3Npb24uZ2V0VXNlV3JhcE1vZGUoKSYmdGhpcy5yZW5kZXJlci5hZGp1c3RXcmFwTGltaXQoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKSk6KHRoaXMuc2VsZWN0aW9uPW51bGwsdGhpcy5yZW5kZXJlci5zZXRTZXNzaW9uKGUpKSx0aGlzLl9zaWduYWwoImNoYW5nZVNlc3Npb24iLHtzZXNzaW9uOmUsb2xkU2Vzc2lvbjp0fSksdGhpcy5jdXJPcD1udWxsLHQmJnQuX3NpZ25hbCgiY2hhbmdlRWRpdG9yIix7b2xkRWRpdG9yOnRoaXN9KSxlJiZlLl9zaWduYWwoImNoYW5nZUVkaXRvciIse2VkaXRvcjp0aGlzfSksZSYmZS5iZ1Rva2VuaXplciYmZS5iZ1Rva2VuaXplci5zY2hlZHVsZVN0YXJ0KCl9LHRoaXMuZ2V0U2Vzc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb259LHRoaXMuc2V0VmFsdWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zZXNzaW9uLmRvYy5zZXRWYWx1ZShlKSx0P3Q9PTE/dGhpcy5uYXZpZ2F0ZUZpbGVFbmQoKTp0PT0tMSYmdGhpcy5uYXZpZ2F0ZUZpbGVTdGFydCgpOnRoaXMuc2VsZWN0QWxsKCksZX0sdGhpcy5nZXRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0VmFsdWUoKX0sdGhpcy5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb259LHRoaXMucmVzaXplPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIub25SZXNpemUoZSl9LHRoaXMuc2V0VGhlbWU9ZnVuY3Rpb24oZSx0KXt0aGlzLnJlbmRlcmVyLnNldFRoZW1lKGUsdCl9LHRoaXMuZ2V0VGhlbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRUaGVtZSgpfSx0aGlzLnNldFN0eWxlPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2V0U3R5bGUoZSl9LHRoaXMudW5zZXRTdHlsZT1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnVuc2V0U3R5bGUoZSl9LHRoaXMuZ2V0Rm9udFNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImZvbnRTaXplIil8fGkuY29tcHV0ZWRTdHlsZSh0aGlzLmNvbnRhaW5lcikuZm9udFNpemV9LHRoaXMuc2V0Rm9udFNpemU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImZvbnRTaXplIixlKX0sdGhpcy4kaGlnaGxpZ2h0QnJhY2tldHM9ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24uJGJyYWNrZXRIaWdobGlnaHQmJih0aGlzLnNlc3Npb24ucmVtb3ZlTWFya2VyKHRoaXMuc2Vzc2lvbi4kYnJhY2tldEhpZ2hsaWdodCksdGhpcy5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0PW51bGwpO2lmKHRoaXMuJGhpZ2hsaWdodFBlbmRpbmcpcmV0dXJuO3ZhciBlPXRoaXM7dGhpcy4kaGlnaGxpZ2h0UGVuZGluZz0hMCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS4kaGlnaGxpZ2h0UGVuZGluZz0hMTt2YXIgdD1lLnNlc3Npb247aWYoIXR8fCF0LmJnVG9rZW5pemVyKXJldHVybjt2YXIgbj10LmZpbmRNYXRjaGluZ0JyYWNrZXQoZS5nZXRDdXJzb3JQb3NpdGlvbigpKTtpZihuKXZhciByPW5ldyBwKG4ucm93LG4uY29sdW1uLG4ucm93LG4uY29sdW1uKzEpO2Vsc2UgaWYodC4kbW9kZS5nZXRNYXRjaGluZyl2YXIgcj10LiRtb2RlLmdldE1hdGNoaW5nKGUuc2Vzc2lvbik7ciYmKHQuJGJyYWNrZXRIaWdobGlnaHQ9dC5hZGRNYXJrZXIociwiYWNlX2JyYWNrZXQiLCJ0ZXh0IikpfSw1MCl9LHRoaXMuJGhpZ2hsaWdodFRhZ3M9ZnVuY3Rpb24oKXtpZih0aGlzLiRoaWdobGlnaHRUYWdQZW5kaW5nKXJldHVybjt2YXIgZT10aGlzO3RoaXMuJGhpZ2hsaWdodFRhZ1BlbmRpbmc9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe2UuJGhpZ2hsaWdodFRhZ1BlbmRpbmc9ITE7dmFyIHQ9ZS5zZXNzaW9uO2lmKCF0fHwhdC5iZ1Rva2VuaXplcilyZXR1cm47dmFyIG49ZS5nZXRDdXJzb3JQb3NpdGlvbigpLHI9bmV3IHkoZS5zZXNzaW9uLG4ucm93LG4uY29sdW1uKSxpPXIuZ2V0Q3VycmVudFRva2VuKCk7aWYoIWl8fCEvXGIoPzp0YWctb3Blbnx0YWctbmFtZSkvLnRlc3QoaS50eXBlKSl7dC5yZW1vdmVNYXJrZXIodC4kdGFnSGlnaGxpZ2h0KSx0LiR0YWdIaWdobGlnaHQ9bnVsbDtyZXR1cm59aWYoaS50eXBlLmluZGV4T2YoInRhZy1vcGVuIikhPS0xKXtpPXIuc3RlcEZvcndhcmQoKTtpZighaSlyZXR1cm59dmFyIHM9aS52YWx1ZSxvPTAsdT1yLnN0ZXBCYWNrd2FyZCgpO2lmKHUudmFsdWU9PSI8Iil7ZG8gdT1pLGk9ci5zdGVwRm9yd2FyZCgpLGkmJmkudmFsdWU9PT1zJiZpLnR5cGUuaW5kZXhPZigidGFnLW5hbWUiKSE9PS0xJiYodS52YWx1ZT09PSI8Ij9vKys6dS52YWx1ZT09PSI8LyImJm8tLSk7d2hpbGUoaSYmbz49MCl9ZWxzZXtkbyBpPXUsdT1yLnN0ZXBCYWNrd2FyZCgpLGkmJmkudmFsdWU9PT1zJiZpLnR5cGUuaW5kZXhPZigidGFnLW5hbWUiKSE9PS0xJiYodS52YWx1ZT09PSI8Ij9vKys6dS52YWx1ZT09PSI8LyImJm8tLSk7d2hpbGUodSYmbzw9MCk7ci5zdGVwRm9yd2FyZCgpfWlmKCFpKXt0LnJlbW92ZU1hcmtlcih0LiR0YWdIaWdobGlnaHQpLHQuJHRhZ0hpZ2hsaWdodD1udWxsO3JldHVybn12YXIgYT1yLmdldEN1cnJlbnRUb2tlblJvdygpLGY9ci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSxsPW5ldyBwKGEsZixhLGYraS52YWx1ZS5sZW5ndGgpLGM9dC4kYmFja01hcmtlcnNbdC4kdGFnSGlnaGxpZ2h0XTt0LiR0YWdIaWdobGlnaHQmJmMhPXVuZGVmaW5lZCYmbC5jb21wYXJlUmFuZ2UoYy5yYW5nZSkhPT0wJiYodC5yZW1vdmVNYXJrZXIodC4kdGFnSGlnaGxpZ2h0KSx0LiR0YWdIaWdobGlnaHQ9bnVsbCksdC4kdGFnSGlnaGxpZ2h0fHwodC4kdGFnSGlnaGxpZ2h0PXQuYWRkTWFya2VyKGwsImFjZV9icmFja2V0IiwidGV4dCIpKX0sNTApfSx0aGlzLmZvY3VzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pc0ZvY3VzZWQoKXx8ZS50ZXh0SW5wdXQuZm9jdXMoKX0pLHRoaXMudGV4dElucHV0LmZvY3VzKCl9LHRoaXMuaXNGb2N1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dElucHV0LmlzRm9jdXNlZCgpfSx0aGlzLmJsdXI9ZnVuY3Rpb24oKXt0aGlzLnRleHRJbnB1dC5ibHVyKCl9LHRoaXMub25Gb2N1cz1mdW5jdGlvbihlKXtpZih0aGlzLiRpc0ZvY3VzZWQpcmV0dXJuO3RoaXMuJGlzRm9jdXNlZD0hMCx0aGlzLnJlbmRlcmVyLnNob3dDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnZpc3VhbGl6ZUZvY3VzKCksdGhpcy5fZW1pdCgiZm9jdXMiLGUpfSx0aGlzLm9uQmx1cj1mdW5jdGlvbihlKXtpZighdGhpcy4kaXNGb2N1c2VkKXJldHVybjt0aGlzLiRpc0ZvY3VzZWQ9ITEsdGhpcy5yZW5kZXJlci5oaWRlQ3Vyc29yKCksdGhpcy5yZW5kZXJlci52aXN1YWxpemVCbHVyKCksdGhpcy5fZW1pdCgiYmx1ciIsZSl9LHRoaXMuJGN1cnNvckNoYW5nZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCl9LHRoaXMub25Eb2N1bWVudENoYW5nZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb24uJHVzZVdyYXBNb2RlLG49ZS5zdGFydC5yb3c9PWUuZW5kLnJvdz9lLmVuZC5yb3c6SW5maW5pdHk7dGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyhlLnN0YXJ0LnJvdyxuLHQpLHRoaXMuX3NpZ25hbCgiY2hhbmdlIixlKSx0aGlzLiRjdXJzb3JDaGFuZ2UoKSx0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCl9LHRoaXMub25Ub2tlbml6ZXJVcGRhdGU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhO3RoaXMucmVuZGVyZXIudXBkYXRlTGluZXModC5maXJzdCx0Lmxhc3QpfSx0aGlzLm9uU2Nyb2xsVG9wQ2hhbmdlPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5zY3JvbGxUb1kodGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpKX0sdGhpcy5vblNjcm9sbExlZnRDaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnNjcm9sbFRvWCh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsTGVmdCgpKX0sdGhpcy5vbkN1cnNvckNoYW5nZT1mdW5jdGlvbigpe3RoaXMuJGN1cnNvckNoYW5nZSgpLHRoaXMuJGhpZ2hsaWdodEJyYWNrZXRzKCksdGhpcy4kaGlnaGxpZ2h0VGFncygpLHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKSx0aGlzLl9zaWduYWwoImNoYW5nZVNlbGVjdGlvbiIpfSx0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTZXNzaW9uKCksdDtpZih0aGlzLiRoaWdobGlnaHRBY3RpdmVMaW5lKXtpZih0aGlzLiRzZWxlY3Rpb25TdHlsZSE9ImxpbmUifHwhdGhpcy5zZWxlY3Rpb24uaXNNdWx0aUxpbmUoKSl0PXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKTt0aGlzLnJlbmRlcmVyLnRoZW1lJiZ0aGlzLnJlbmRlcmVyLnRoZW1lLiRzZWxlY3Rpb25Db2xvckNvbmZsaWN0JiYhdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiYodD0hMSksdGhpcy5yZW5kZXJlci4kbWF4TGluZXMmJnRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKT09PTEmJiEodGhpcy5yZW5kZXJlci4kbWluTGluZXM+MSkmJih0PSExKX1pZihlLiRoaWdobGlnaHRMaW5lTWFya2VyJiYhdCllLnJlbW92ZU1hcmtlcihlLiRoaWdobGlnaHRMaW5lTWFya2VyLmlkKSxlLiRoaWdobGlnaHRMaW5lTWFya2VyPW51bGw7ZWxzZSBpZighZS4kaGlnaGxpZ2h0TGluZU1hcmtlciYmdCl7dmFyIG49bmV3IHAodC5yb3csdC5jb2x1bW4sdC5yb3csSW5maW5pdHkpO24uaWQ9ZS5hZGRNYXJrZXIobiwiYWNlX2FjdGl2ZS1saW5lIiwic2NyZWVuTGluZSIpLGUuJGhpZ2hsaWdodExpbmVNYXJrZXI9bn1lbHNlIHQmJihlLiRoaWdobGlnaHRMaW5lTWFya2VyLnN0YXJ0LnJvdz10LnJvdyxlLiRoaWdobGlnaHRMaW5lTWFya2VyLmVuZC5yb3c9dC5yb3csZS4kaGlnaGxpZ2h0TGluZU1hcmtlci5zdGFydC5jb2x1bW49dC5jb2x1bW4sZS5fc2lnbmFsKCJjaGFuZ2VCYWNrTWFya2VyIikpfSx0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbjt0LiRzZWxlY3Rpb25NYXJrZXImJnQucmVtb3ZlTWFya2VyKHQuJHNlbGVjdGlvbk1hcmtlciksdC4kc2VsZWN0aW9uTWFya2VyPW51bGw7aWYoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSl7dmFyIG49dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSxyPXRoaXMuZ2V0U2VsZWN0aW9uU3R5bGUoKTt0LiRzZWxlY3Rpb25NYXJrZXI9dC5hZGRNYXJrZXIobiwiYWNlX3NlbGVjdGlvbiIscil9ZWxzZSB0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCk7dmFyIGk9dGhpcy4kaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkJiZ0aGlzLiRnZXRTZWxlY3Rpb25IaWdoTGlnaHRSZWdleHAoKTt0aGlzLnNlc3Npb24uaGlnaGxpZ2h0KGkpLHRoaXMuX3NpZ25hbCgiY2hhbmdlU2VsZWN0aW9uIil9LHRoaXMuJGdldFNlbGVjdGlvbkhpZ2hMaWdodFJlZ2V4cD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbix0PXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtpZih0LmlzRW1wdHkoKXx8dC5pc011bHRpTGluZSgpKXJldHVybjt2YXIgbj10LnN0YXJ0LmNvbHVtbixyPXQuZW5kLmNvbHVtbixpPWUuZ2V0TGluZSh0LnN0YXJ0LnJvdykscz1pLnN1YnN0cmluZyhuLHIpO2lmKHMubGVuZ3RoPjVlM3x8IS9bXHdcZF0vLnRlc3QocykpcmV0dXJuO3ZhciBvPXRoaXMuJHNlYXJjaC4kYXNzZW1ibGVSZWdFeHAoe3dob2xlV29yZDohMCxjYXNlU2Vuc2l0aXZlOiEwLG5lZWRsZTpzfSksdT1pLnN1YnN0cmluZyhuLTEscisxKTtpZighby50ZXN0KHUpKXJldHVybjtyZXR1cm4gb30sdGhpcy5vbkNoYW5nZUZyb250TWFya2VyPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVGcm9udE1hcmtlcnMoKX0sdGhpcy5vbkNoYW5nZUJhY2tNYXJrZXI9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZUJhY2tNYXJrZXJzKCl9LHRoaXMub25DaGFuZ2VCcmVha3BvaW50PWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVCcmVha3BvaW50cygpfSx0aGlzLm9uQ2hhbmdlQW5ub3RhdGlvbj1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuc2V0QW5ub3RhdGlvbnModGhpcy5zZXNzaW9uLmdldEFubm90YXRpb25zKCkpfSx0aGlzLm9uQ2hhbmdlTW9kZT1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZVRleHQoKSx0aGlzLl9lbWl0KCJjaGFuZ2VNb2RlIixlKX0sdGhpcy5vbkNoYW5nZVdyYXBMaW1pdD1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlRnVsbCgpfSx0aGlzLm9uQ2hhbmdlV3JhcE1vZGU9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLm9uUmVzaXplKCEwKX0sdGhpcy5vbkNoYW5nZUZvbGQ9ZnVuY3Rpb24oKXt0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCksdGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCl9LHRoaXMuZ2V0U2VsZWN0ZWRUZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKX0sdGhpcy5nZXRDb3B5VGV4dD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0U2VsZWN0ZWRUZXh0KCksdD10aGlzLnNlc3Npb24uZG9jLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSxuPSExO2lmKCFlJiZ0aGlzLiRjb3B5V2l0aEVtcHR5U2VsZWN0aW9uKXtuPSEwO3ZhciByPXRoaXMuc2VsZWN0aW9uLmdldEFsbFJhbmdlcygpO2Zvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgcz1yW2ldO2lmKGkmJnJbaS0xXS5zdGFydC5yb3c9PXMuc3RhcnQucm93KWNvbnRpbnVlO2UrPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKHMuc3RhcnQucm93KSt0fX12YXIgbz17dGV4dDplfTtyZXR1cm4gdGhpcy5fc2lnbmFsKCJjb3B5IixvKSxiLmxpbmVNb2RlPW4/by50ZXh0OiIiLG8udGV4dH0sdGhpcy5vbkNvcHk9ZnVuY3Rpb24oKXt0aGlzLmNvbW1hbmRzLmV4ZWMoImNvcHkiLHRoaXMpfSx0aGlzLm9uQ3V0PWZ1bmN0aW9uKCl7dGhpcy5jb21tYW5kcy5leGVjKCJjdXQiLHRoaXMpfSx0aGlzLm9uUGFzdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj17dGV4dDplLGV2ZW50OnR9O3RoaXMuY29tbWFuZHMuZXhlYygicGFzdGUiLHRoaXMsbil9LHRoaXMuJGhhbmRsZVBhc3RlPWZ1bmN0aW9uKGUpe3R5cGVvZiBlPT0ic3RyaW5nIiYmKGU9e3RleHQ6ZX0pLHRoaXMuX3NpZ25hbCgicGFzdGUiLGUpO3ZhciB0PWUudGV4dCxuPXQ9PWIubGluZU1vZGUscj10aGlzLnNlc3Npb247aWYoIXRoaXMuaW5NdWx0aVNlbGVjdE1vZGV8fHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZSluP3IuaW5zZXJ0KHtyb3c6dGhpcy5zZWxlY3Rpb24ubGVhZC5yb3csY29sdW1uOjB9LHQpOnRoaXMuaW5zZXJ0KHQpO2Vsc2UgaWYobil0aGlzLnNlbGVjdGlvbi5yYW5nZUxpc3QucmFuZ2VzLmZvckVhY2goZnVuY3Rpb24oZSl7ci5pbnNlcnQoe3JvdzplLnN0YXJ0LnJvdyxjb2x1bW46MH0sdCl9KTtlbHNle3ZhciBpPXQuc3BsaXQoL1xyXG58XHJ8XG4vKSxzPXRoaXMuc2VsZWN0aW9uLnJhbmdlTGlzdC5yYW5nZXMsbz1pLmxlbmd0aD09MiYmKCFpWzBdfHwhaVsxXSk7aWYoaS5sZW5ndGghPXMubGVuZ3RofHxvKXJldHVybiB0aGlzLmNvbW1hbmRzLmV4ZWMoImluc2VydHN0cmluZyIsdGhpcyx0KTtmb3IodmFyIHU9cy5sZW5ndGg7dS0tOyl7dmFyIGE9c1t1XTthLmlzRW1wdHkoKXx8ci5yZW1vdmUoYSksci5pbnNlcnQoYS5zdGFydCxpW3VdKX19fSx0aGlzLmV4ZWNDb21tYW5kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuY29tbWFuZHMuZXhlYyhlLHRoaXMsdCl9LHRoaXMuaW5zZXJ0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zZXNzaW9uLHI9bi5nZXRNb2RlKCksaT10aGlzLmdldEN1cnNvclBvc2l0aW9uKCk7aWYodGhpcy5nZXRCZWhhdmlvdXJzRW5hYmxlZCgpJiYhdCl7dmFyIHM9ci50cmFuc2Zvcm1BY3Rpb24obi5nZXRTdGF0ZShpLnJvdyksImluc2VydGlvbiIsdGhpcyxuLGUpO3MmJihlIT09cy50ZXh0JiYodGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlfHwodGhpcy5zZXNzaW9uLm1lcmdlVW5kb0RlbHRhcz0hMSx0aGlzLm1lcmdlTmV4dENvbW1hbmQ9ITEpKSxlPXMudGV4dCl9ZT09IgkiJiYoZT10aGlzLnNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpO2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpe3ZhciBvPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtpPXRoaXMuc2Vzc2lvbi5yZW1vdmUobyksdGhpcy5jbGVhclNlbGVjdGlvbigpfWVsc2UgaWYodGhpcy5zZXNzaW9uLmdldE92ZXJ3cml0ZSgpJiZlLmluZGV4T2YoIlxuIik9PS0xKXt2YXIgbz1uZXcgcC5mcm9tUG9pbnRzKGksaSk7by5lbmQuY29sdW1uKz1lLmxlbmd0aCx0aGlzLnNlc3Npb24ucmVtb3ZlKG8pfWlmKGU9PSJcbiJ8fGU9PSJcclxuIil7dmFyIHU9bi5nZXRMaW5lKGkucm93KTtpZihpLmNvbHVtbj51LnNlYXJjaCgvXFN8JC8pKXt2YXIgYT11LnN1YnN0cihpLmNvbHVtbikuc2VhcmNoKC9cU3wkLyk7bi5kb2MucmVtb3ZlSW5MaW5lKGkucm93LGkuY29sdW1uLGkuY29sdW1uK2EpfX10aGlzLmNsZWFyU2VsZWN0aW9uKCk7dmFyIGY9aS5jb2x1bW4sbD1uLmdldFN0YXRlKGkucm93KSx1PW4uZ2V0TGluZShpLnJvdyksYz1yLmNoZWNrT3V0ZGVudChsLHUsZSk7bi5pbnNlcnQoaSxlKSxzJiZzLnNlbGVjdGlvbiYmKHMuc2VsZWN0aW9uLmxlbmd0aD09Mj90aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShuZXcgcChpLnJvdyxmK3Muc2VsZWN0aW9uWzBdLGkucm93LGYrcy5zZWxlY3Rpb25bMV0pKTp0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShuZXcgcChpLnJvdytzLnNlbGVjdGlvblswXSxzLnNlbGVjdGlvblsxXSxpLnJvdytzLnNlbGVjdGlvblsyXSxzLnNlbGVjdGlvblszXSkpKTtpZihuLmdldERvY3VtZW50KCkuaXNOZXdMaW5lKGUpKXt2YXIgaD1yLmdldE5leHRMaW5lSW5kZW50KGwsdS5zbGljZSgwLGkuY29sdW1uKSxuLmdldFRhYlN0cmluZygpKTtuLmluc2VydCh7cm93Omkucm93KzEsY29sdW1uOjB9LGgpfWMmJnIuYXV0b091dGRlbnQobCxuLGkucm93KX0sdGhpcy5vblRleHRJbnB1dD1mdW5jdGlvbihlLHQpe2lmKCF0KXJldHVybiB0aGlzLmtleUJpbmRpbmcub25UZXh0SW5wdXQoZSk7dGhpcy5zdGFydE9wZXJhdGlvbih7Y29tbWFuZDp7bmFtZToiaW5zZXJ0c3RyaW5nIn19KTt2YXIgbj10aGlzLmFwcGx5Q29tcG9zaXRpb24uYmluZCh0aGlzLGUsdCk7dGhpcy5zZWxlY3Rpb24ucmFuZ2VDb3VudD90aGlzLmZvckVhY2hTZWxlY3Rpb24obik6bigpLHRoaXMuZW5kT3BlcmF0aW9uKCl9LHRoaXMuYXBwbHlDb21wb3NpdGlvbj1mdW5jdGlvbihlLHQpe2lmKHQuZXh0ZW5kTGVmdHx8dC5leHRlbmRSaWdodCl7dmFyIG49dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTtuLnN0YXJ0LmNvbHVtbi09dC5leHRlbmRMZWZ0LG4uZW5kLmNvbHVtbis9dC5leHRlbmRSaWdodCx0aGlzLnNlbGVjdGlvbi5zZXRSYW5nZShuKSwhZSYmIW4uaXNFbXB0eSgpJiZ0aGlzLnJlbW92ZSgpfShlfHwhdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKSYmdGhpcy5pbnNlcnQoZSwhMCk7aWYodC5yZXN0b3JlU3RhcnR8fHQucmVzdG9yZUVuZCl7dmFyIG49dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTtuLnN0YXJ0LmNvbHVtbi09dC5yZXN0b3JlU3RhcnQsbi5lbmQuY29sdW1uLT10LnJlc3RvcmVFbmQsdGhpcy5zZWxlY3Rpb24uc2V0UmFuZ2Uobil9fSx0aGlzLm9uQ29tbWFuZEtleT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMua2V5QmluZGluZy5vbkNvbW1hbmRLZXkoZSx0LG4pfSx0aGlzLnNldE92ZXJ3cml0ZT1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb24uc2V0T3ZlcndyaXRlKGUpfSx0aGlzLmdldE92ZXJ3cml0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCl9LHRoaXMudG9nZ2xlT3ZlcndyaXRlPWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLnRvZ2dsZU92ZXJ3cml0ZSgpfSx0aGlzLnNldFNjcm9sbFNwZWVkPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJzY3JvbGxTcGVlZCIsZSl9LHRoaXMuZ2V0U2Nyb2xsU3BlZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInNjcm9sbFNwZWVkIil9LHRoaXMuc2V0RHJhZ0RlbGF5PWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJkcmFnRGVsYXkiLGUpfSx0aGlzLmdldERyYWdEZWxheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiZHJhZ0RlbGF5Iil9LHRoaXMuc2V0U2VsZWN0aW9uU3R5bGU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInNlbGVjdGlvblN0eWxlIixlKX0sdGhpcy5nZXRTZWxlY3Rpb25TdHlsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigic2VsZWN0aW9uU3R5bGUiKX0sdGhpcy5zZXRIaWdobGlnaHRBY3RpdmVMaW5lPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJoaWdobGlnaHRBY3RpdmVMaW5lIixlKX0sdGhpcy5nZXRIaWdobGlnaHRBY3RpdmVMaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJoaWdobGlnaHRBY3RpdmVMaW5lIil9LHRoaXMuc2V0SGlnaGxpZ2h0R3V0dGVyTGluZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiaGlnaGxpZ2h0R3V0dGVyTGluZSIsZSl9LHRoaXMuZ2V0SGlnaGxpZ2h0R3V0dGVyTGluZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiaGlnaGxpZ2h0R3V0dGVyTGluZSIpfSx0aGlzLnNldEhpZ2hsaWdodFNlbGVjdGVkV29yZD1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkIixlKX0sdGhpcy5nZXRIaWdobGlnaHRTZWxlY3RlZFdvcmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkfSx0aGlzLnNldEFuaW1hdGVkU2Nyb2xsPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2V0QW5pbWF0ZWRTY3JvbGwoZSl9LHRoaXMuZ2V0QW5pbWF0ZWRTY3JvbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRBbmltYXRlZFNjcm9sbCgpfSx0aGlzLnNldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2V0U2hvd0ludmlzaWJsZXMoZSl9LHRoaXMuZ2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRTaG93SW52aXNpYmxlcygpfSx0aGlzLnNldERpc3BsYXlJbmRlbnRHdWlkZXM9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zZXREaXNwbGF5SW5kZW50R3VpZGVzKGUpfSx0aGlzLmdldERpc3BsYXlJbmRlbnRHdWlkZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXREaXNwbGF5SW5kZW50R3VpZGVzKCl9LHRoaXMuc2V0U2hvd1ByaW50TWFyZ2luPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2V0U2hvd1ByaW50TWFyZ2luKGUpfSx0aGlzLmdldFNob3dQcmludE1hcmdpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldFNob3dQcmludE1hcmdpbigpfSx0aGlzLnNldFByaW50TWFyZ2luQ29sdW1uPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2V0UHJpbnRNYXJnaW5Db2x1bW4oZSl9LHRoaXMuZ2V0UHJpbnRNYXJnaW5Db2x1bW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRQcmludE1hcmdpbkNvbHVtbigpfSx0aGlzLnNldFJlYWRPbmx5PWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJyZWFkT25seSIsZSl9LHRoaXMuZ2V0UmVhZE9ubHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInJlYWRPbmx5Iil9LHRoaXMuc2V0QmVoYXZpb3Vyc0VuYWJsZWQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImJlaGF2aW91cnNFbmFibGVkIixlKX0sdGhpcy5nZXRCZWhhdmlvdXJzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiYmVoYXZpb3Vyc0VuYWJsZWQiKX0sdGhpcy5zZXRXcmFwQmVoYXZpb3Vyc0VuYWJsZWQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oIndyYXBCZWhhdmlvdXJzRW5hYmxlZCIsZSl9LHRoaXMuZ2V0V3JhcEJlaGF2aW91cnNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJ3cmFwQmVoYXZpb3Vyc0VuYWJsZWQiKX0sdGhpcy5zZXRTaG93Rm9sZFdpZGdldHM9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInNob3dGb2xkV2lkZ2V0cyIsZSl9LHRoaXMuZ2V0U2hvd0ZvbGRXaWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJzaG93Rm9sZFdpZGdldHMiKX0sdGhpcy5zZXRGYWRlRm9sZFdpZGdldHM9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImZhZGVGb2xkV2lkZ2V0cyIsZSl9LHRoaXMuZ2V0RmFkZUZvbGRXaWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJmYWRlRm9sZFdpZGdldHMiKX0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oZSl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiYoZT09ImxlZnQiP3RoaXMuc2VsZWN0aW9uLnNlbGVjdExlZnQoKTp0aGlzLnNlbGVjdGlvbi5zZWxlY3RSaWdodCgpKTt2YXIgdD10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7aWYodGhpcy5nZXRCZWhhdmlvdXJzRW5hYmxlZCgpKXt2YXIgbj10aGlzLnNlc3Npb24scj1uLmdldFN0YXRlKHQuc3RhcnQucm93KSxpPW4uZ2V0TW9kZSgpLnRyYW5zZm9ybUFjdGlvbihyLCJkZWxldGlvbiIsdGhpcyxuLHQpO2lmKHQuZW5kLmNvbHVtbj09PTApe3ZhciBzPW4uZ2V0VGV4dFJhbmdlKHQpO2lmKHNbcy5sZW5ndGgtMV09PSJcbiIpe3ZhciBvPW4uZ2V0TGluZSh0LmVuZC5yb3cpOy9eXHMrJC8udGVzdChvKSYmKHQuZW5kLmNvbHVtbj1vLmxlbmd0aCl9fWkmJih0PWkpfXRoaXMuc2Vzc2lvbi5yZW1vdmUodCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnJlbW92ZVdvcmRSaWdodD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZFJpZ2h0KCksdGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5yZW1vdmVXb3JkTGVmdD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZExlZnQoKSx0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnJlbW92ZVRvTGluZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RMaW5lU3RhcnQoKSx0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdExlZnQoKSx0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnJlbW92ZVRvTGluZUVuZD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0TGluZUVuZCgpO3ZhciBlPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtlLnN0YXJ0LmNvbHVtbj09ZS5lbmQuY29sdW1uJiZlLnN0YXJ0LnJvdz09ZS5lbmQucm93JiYoZS5lbmQuY29sdW1uPTAsZS5lbmQucm93KyspLHRoaXMuc2Vzc2lvbi5yZW1vdmUoZSksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnNwbGl0TGluZT1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKXx8KHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCkpO3ZhciBlPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKTt0aGlzLmluc2VydCgiXG4iKSx0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGUpfSx0aGlzLnRyYW5zcG9zZUxldHRlcnM9ZnVuY3Rpb24oKXtpZighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKXJldHVybjt2YXIgZT10aGlzLmdldEN1cnNvclBvc2l0aW9uKCksdD1lLmNvbHVtbjtpZih0PT09MClyZXR1cm47dmFyIG49dGhpcy5zZXNzaW9uLmdldExpbmUoZS5yb3cpLHIsaTt0PG4ubGVuZ3RoPyhyPW4uY2hhckF0KHQpK24uY2hhckF0KHQtMSksaT1uZXcgcChlLnJvdyx0LTEsZS5yb3csdCsxKSk6KHI9bi5jaGFyQXQodC0xKStuLmNoYXJBdCh0LTIpLGk9bmV3IHAoZS5yb3csdC0yLGUucm93LHQpKSx0aGlzLnNlc3Npb24ucmVwbGFjZShpLHIpLHRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24oaS5lbmQpfSx0aGlzLnRvTG93ZXJDYXNlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZCgpO3ZhciB0PXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxuPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UodCk7dGhpcy5zZXNzaW9uLnJlcGxhY2UodCxuLnRvTG93ZXJDYXNlKCkpLHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGUpfSx0aGlzLnRvVXBwZXJDYXNlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZCgpO3ZhciB0PXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxuPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UodCk7dGhpcy5zZXNzaW9uLnJlcGxhY2UodCxuLnRvVXBwZXJDYXNlKCkpLHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGUpfSx0aGlzLmluZGVudD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbix0PXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtpZih0LnN0YXJ0LnJvdzx0LmVuZC5yb3cpe3ZhciBuPXRoaXMuJGdldFNlbGVjdGVkUm93cygpO2UuaW5kZW50Um93cyhuLmZpcnN0LG4ubGFzdCwiCSIpO3JldHVybn1pZih0LnN0YXJ0LmNvbHVtbjx0LmVuZC5jb2x1bW4pe3ZhciByPWUuZ2V0VGV4dFJhbmdlKHQpO2lmKCEvXlxzKyQvLnRlc3Qocikpe3ZhciBuPXRoaXMuJGdldFNlbGVjdGVkUm93cygpO2UuaW5kZW50Um93cyhuLmZpcnN0LG4ubGFzdCwiCSIpO3JldHVybn19dmFyIGk9ZS5nZXRMaW5lKHQuc3RhcnQucm93KSxvPXQuc3RhcnQsdT1lLmdldFRhYlNpemUoKSxhPWUuZG9jdW1lbnRUb1NjcmVlbkNvbHVtbihvLnJvdyxvLmNvbHVtbik7aWYodGhpcy5zZXNzaW9uLmdldFVzZVNvZnRUYWJzKCkpdmFyIGY9dS1hJXUsbD1zLnN0cmluZ1JlcGVhdCgiICIsZik7ZWxzZXt2YXIgZj1hJXU7d2hpbGUoaVt0LnN0YXJ0LmNvbHVtbi0xXT09IiAiJiZmKXQuc3RhcnQuY29sdW1uLS0sZi0tO3RoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKHQpLGw9IgkifXJldHVybiB0aGlzLmluc2VydChsKX0sdGhpcy5ibG9ja0luZGVudD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJGdldFNlbGVjdGVkUm93cygpO3RoaXMuc2Vzc2lvbi5pbmRlbnRSb3dzKGUuZmlyc3QsZS5sYXN0LCIJIil9LHRoaXMuYmxvY2tPdXRkZW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLmdldFNlbGVjdGlvbigpO3RoaXMuc2Vzc2lvbi5vdXRkZW50Um93cyhlLmdldFJhbmdlKCkpfSx0aGlzLnNvcnRMaW5lcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJGdldFNlbGVjdGVkUm93cygpLHQ9dGhpcy5zZXNzaW9uLG49W107Zm9yKHZhciByPWUuZmlyc3Q7cjw9ZS5sYXN0O3IrKyluLnB1c2godC5nZXRMaW5lKHIpKTtuLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS50b0xvd2VyQ2FzZSgpPHQudG9Mb3dlckNhc2UoKT8tMTplLnRvTG93ZXJDYXNlKCk+dC50b0xvd2VyQ2FzZSgpPzE6MH0pO3ZhciBpPW5ldyBwKDAsMCwwLDApO2Zvcih2YXIgcj1lLmZpcnN0O3I8PWUubGFzdDtyKyspe3ZhciBzPXQuZ2V0TGluZShyKTtpLnN0YXJ0LnJvdz1yLGkuZW5kLnJvdz1yLGkuZW5kLmNvbHVtbj1zLmxlbmd0aCx0LnJlcGxhY2UoaSxuW3ItZS5maXJzdF0pfX0sdGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24uZ2V0U3RhdGUodGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLnJvdyksdD10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTt0aGlzLnNlc3Npb24uZ2V0TW9kZSgpLnRvZ2dsZUNvbW1lbnRMaW5lcyhlLHRoaXMuc2Vzc2lvbix0LmZpcnN0LHQubGFzdCl9LHRoaXMudG9nZ2xlQmxvY2tDb21tZW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLHQ9dGhpcy5zZXNzaW9uLmdldFN0YXRlKGUucm93KSxuPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTt0aGlzLnNlc3Npb24uZ2V0TW9kZSgpLnRvZ2dsZUJsb2NrQ29tbWVudCh0LHRoaXMuc2Vzc2lvbixuLGUpfSx0aGlzLmdldE51bWJlckF0PWZ1bmN0aW9uKGUsdCl7dmFyIG49L1tcLV0/WzAtOV0rKD86XC5bMC05XSspPy9nO24ubGFzdEluZGV4PTA7dmFyIHI9dGhpcy5zZXNzaW9uLmdldExpbmUoZSk7d2hpbGUobi5sYXN0SW5kZXg8dCl7dmFyIGk9bi5leGVjKHIpO2lmKGkuaW5kZXg8PXQmJmkuaW5kZXgraVswXS5sZW5ndGg+PXQpe3ZhciBzPXt2YWx1ZTppWzBdLHN0YXJ0OmkuaW5kZXgsZW5kOmkuaW5kZXgraVswXS5sZW5ndGh9O3JldHVybiBzfX1yZXR1cm4gbnVsbH0sdGhpcy5tb2RpZnlOdW1iZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCkucm93LG49dGhpcy5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCkuY29sdW1uLHI9bmV3IHAodCxuLTEsdCxuKSxpPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2Uocik7aWYoIWlzTmFOKHBhcnNlRmxvYXQoaSkpJiZpc0Zpbml0ZShpKSl7dmFyIHM9dGhpcy5nZXROdW1iZXJBdCh0LG4pO2lmKHMpe3ZhciBvPXMudmFsdWUuaW5kZXhPZigiLiIpPj0wP3Muc3RhcnQrcy52YWx1ZS5pbmRleE9mKCIuIikrMTpzLmVuZCx1PXMuc3RhcnQrcy52YWx1ZS5sZW5ndGgtbyxhPXBhcnNlRmxvYXQocy52YWx1ZSk7YSo9TWF0aC5wb3coMTAsdSksbyE9PXMuZW5kJiZuPG8/ZSo9TWF0aC5wb3coMTAscy5lbmQtbi0xKTplKj1NYXRoLnBvdygxMCxzLmVuZC1uKSxhKz1lLGEvPU1hdGgucG93KDEwLHUpO3ZhciBmPWEudG9GaXhlZCh1KSxsPW5ldyBwKHQscy5zdGFydCx0LHMuZW5kKTt0aGlzLnNlc3Npb24ucmVwbGFjZShsLGYpLHRoaXMubW92ZUN1cnNvclRvKHQsTWF0aC5tYXgocy5zdGFydCsxLG4rZi5sZW5ndGgtcy52YWx1ZS5sZW5ndGgpKX19ZWxzZSB0aGlzLnRvZ2dsZVdvcmQoKX0sdGhpcy4kdG9nZ2xlV29yZFBhaXJzPVtbImZpcnN0IiwibGFzdCJdLFsidHJ1ZSIsImZhbHNlIl0sWyJ5ZXMiLCJubyJdLFsid2lkdGgiLCJoZWlnaHQiXSxbInRvcCIsImJvdHRvbSJdLFsicmlnaHQiLCJsZWZ0Il0sWyJvbiIsIm9mZiJdLFsieCIsInkiXSxbImdldCIsInNldCJdLFsibWF4IiwibWluIl0sWyJob3Jpem9udGFsIiwidmVydGljYWwiXSxbInNob3ciLCJoaWRlIl0sWyJhZGQiLCJyZW1vdmUiXSxbInVwIiwiZG93biJdLFsiYmVmb3JlIiwiYWZ0ZXIiXSxbImV2ZW4iLCJvZGQiXSxbImluc2lkZSIsIm91dHNpZGUiXSxbIm5leHQiLCJwcmV2aW91cyJdLFsiaW5jcmVhc2UiLCJkZWNyZWFzZSJdLFsiYXR0YWNoIiwiZGV0YWNoIl0sWyImJiIsInx8Il0sWyI9PSIsIiE9Il1dLHRoaXMudG9nZ2xlV29yZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2VsZWN0aW9uLmdldEN1cnNvcigpLnJvdyx0PXRoaXMuc2VsZWN0aW9uLmdldEN1cnNvcigpLmNvbHVtbjt0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk7dmFyIG49dGhpcy5nZXRTZWxlY3RlZFRleHQoKSxyPXRoaXMuc2VsZWN0aW9uLmdldFdvcmRSYW5nZSgpLnN0YXJ0LmNvbHVtbixpPW4ucmVwbGFjZSgvKFthLXpdK3xbQS1aXSspKD89W0EtWl9dfCQpL2csIiQxICIpLnNwbGl0KC9ccy8pLG89dC1yLTE7bzwwJiYobz0wKTt2YXIgdT0wLGE9MCxmPXRoaXM7bi5tYXRjaCgvW0EtWmEtejAtOV9dKy8pJiZpLmZvckVhY2goZnVuY3Rpb24odCxpKXthPXUrdC5sZW5ndGgsbz49dSYmbzw9YSYmKG49dCxmLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpLGYubW92ZUN1cnNvclRvKGUsdStyKSxmLnNlbGVjdGlvbi5zZWxlY3RUbyhlLGErcikpLHU9YX0pO3ZhciBsPXRoaXMuJHRvZ2dsZVdvcmRQYWlycyxjO2Zvcih2YXIgaD0wO2g8bC5sZW5ndGg7aCsrKXt2YXIgcD1sW2hdO2Zvcih2YXIgZD0wO2Q8PTE7ZCsrKXt2YXIgdj0rIWQsbT1uLm1hdGNoKG5ldyBSZWdFeHAoIl5cXHM/Xz8oIitzLmVzY2FwZVJlZ0V4cChwW2RdKSsiKVxccz8kIiwiaSIpKTtpZihtKXt2YXIgZz1uLm1hdGNoKG5ldyBSZWdFeHAoIihbX118XnxcXHMpKCIrcy5lc2NhcGVSZWdFeHAobVsxXSkrIikoJHxcXHMpIiwiZyIpKTtnJiYoYz1uLnJlcGxhY2UobmV3IFJlZ0V4cChzLmVzY2FwZVJlZ0V4cChwW2RdKSwiaSIpLGZ1bmN0aW9uKGUpe3ZhciB0PXBbdl07cmV0dXJuIGUudG9VcHBlckNhc2UoKT09ZT90PXQudG9VcHBlckNhc2UoKTplLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpPT1lLmNoYXJBdCgwKSYmKHQ9dC5zdWJzdHIoMCwwKStwW3ZdLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpKSx0fSksdGhpcy5pbnNlcnQoYyksYz0iIil9fX19LHRoaXMucmVtb3ZlTGluZXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTt0aGlzLnNlc3Npb24ucmVtb3ZlRnVsbExpbmVzKGUuZmlyc3QsZS5sYXN0KSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMuZHVwbGljYXRlU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZWxlY3Rpb24sdD10aGlzLnNlc3Npb24sbj1lLmdldFJhbmdlKCkscj1lLmlzQmFja3dhcmRzKCk7aWYobi5pc0VtcHR5KCkpe3ZhciBpPW4uc3RhcnQucm93O3QuZHVwbGljYXRlTGluZXMoaSxpKX1lbHNle3ZhciBzPXI/bi5zdGFydDpuLmVuZCxvPXQuaW5zZXJ0KHMsdC5nZXRUZXh0UmFuZ2UobiksITEpO24uc3RhcnQ9cyxuLmVuZD1vLGUuc2V0U2VsZWN0aW9uUmFuZ2UobixyKX19LHRoaXMubW92ZUxpbmVzRG93bj1mdW5jdGlvbigpe3RoaXMuJG1vdmVMaW5lcygxLCExKX0sdGhpcy5tb3ZlTGluZXNVcD1mdW5jdGlvbigpe3RoaXMuJG1vdmVMaW5lcygtMSwhMSl9LHRoaXMubW92ZVRleHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLnNlc3Npb24ubW92ZVRleHQoZSx0LG4pfSx0aGlzLmNvcHlMaW5lc1VwPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUxpbmVzKC0xLCEwKX0sdGhpcy5jb3B5TGluZXNEb3duPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUxpbmVzKDEsITApfSx0aGlzLiRtb3ZlTGluZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9dGhpcy5zZWxlY3Rpb247aWYoIWkuaW5NdWx0aVNlbGVjdE1vZGV8fHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZSl7dmFyIHM9aS50b09yaWVudGVkUmFuZ2UoKTtuPXRoaXMuJGdldFNlbGVjdGVkUm93cyhzKSxyPXRoaXMuc2Vzc2lvbi4kbW92ZUxpbmVzKG4uZmlyc3Qsbi5sYXN0LHQ/MDplKSx0JiZlPT0tMSYmKHI9MCkscy5tb3ZlQnkociwwKSxpLmZyb21PcmllbnRlZFJhbmdlKHMpfWVsc2V7dmFyIG89aS5yYW5nZUxpc3QucmFuZ2VzO2kucmFuZ2VMaXN0LmRldGFjaCh0aGlzLnNlc3Npb24pLHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMDt2YXIgdT0wLGE9MCxmPW8ubGVuZ3RoO2Zvcih2YXIgbD0wO2w8ZjtsKyspe3ZhciBjPWw7b1tsXS5tb3ZlQnkodSwwKSxuPXRoaXMuJGdldFNlbGVjdGVkUm93cyhvW2xdKTt2YXIgaD1uLmZpcnN0LHA9bi5sYXN0O3doaWxlKCsrbDxmKXthJiZvW2xdLm1vdmVCeShhLDApO3ZhciBkPXRoaXMuJGdldFNlbGVjdGVkUm93cyhvW2xdKTtpZih0JiZkLmZpcnN0IT1wKWJyZWFrO2lmKCF0JiZkLmZpcnN0PnArMSlicmVhaztwPWQubGFzdH1sLS0sdT10aGlzLnNlc3Npb24uJG1vdmVMaW5lcyhoLHAsdD8wOmUpLHQmJmU9PS0xJiYoYz1sKzEpO3doaWxlKGM8PWwpb1tjXS5tb3ZlQnkodSwwKSxjKys7dHx8KHU9MCksYSs9dX1pLmZyb21PcmllbnRlZFJhbmdlKGkucmFuZ2VzWzBdKSxpLnJhbmdlTGlzdC5hdHRhY2godGhpcy5zZXNzaW9uKSx0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITF9fSx0aGlzLiRnZXRTZWxlY3RlZFJvd3M9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9KGV8fHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSkuY29sbGFwc2VSb3dzKCkse2ZpcnN0OnRoaXMuc2Vzc2lvbi5nZXRSb3dGb2xkU3RhcnQoZS5zdGFydC5yb3cpLGxhc3Q6dGhpcy5zZXNzaW9uLmdldFJvd0ZvbGRFbmQoZS5lbmQucm93KX19LHRoaXMub25Db21wb3NpdGlvblN0YXJ0PWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2hvd0NvbXBvc2l0aW9uKGUpfSx0aGlzLm9uQ29tcG9zaXRpb25VcGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zZXRDb21wb3NpdGlvblRleHQoZSl9LHRoaXMub25Db21wb3NpdGlvbkVuZD1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuaGlkZUNvbXBvc2l0aW9uKCl9LHRoaXMuZ2V0Rmlyc3RWaXNpYmxlUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0Rmlyc3RWaXNpYmxlUm93KCl9LHRoaXMuZ2V0TGFzdFZpc2libGVSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRMYXN0VmlzaWJsZVJvdygpfSx0aGlzLmlzUm93VmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4gZT49dGhpcy5nZXRGaXJzdFZpc2libGVSb3coKSYmZTw9dGhpcy5nZXRMYXN0VmlzaWJsZVJvdygpfSx0aGlzLmlzUm93RnVsbHlWaXNpYmxlPWZ1bmN0aW9uKGUpe3JldHVybiBlPj10aGlzLnJlbmRlcmVyLmdldEZpcnN0RnVsbHlWaXNpYmxlUm93KCkmJmU8PXRoaXMucmVuZGVyZXIuZ2V0TGFzdEZ1bGx5VmlzaWJsZVJvdygpfSx0aGlzLiRnZXRWaXNpYmxlUm93Q291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxCb3R0b21Sb3coKS10aGlzLnJlbmRlcmVyLmdldFNjcm9sbFRvcFJvdygpKzF9LHRoaXMuJG1vdmVCeVBhZ2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnJlbmRlcmVyLHI9dGhpcy5yZW5kZXJlci5sYXllckNvbmZpZyxpPWUqTWF0aC5mbG9vcihyLmhlaWdodC9yLmxpbmVIZWlnaHQpO3Q9PT0hMD90aGlzLnNlbGVjdGlvbi4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvckJ5KGksMCl9KTp0PT09ITEmJih0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yQnkoaSwwKSx0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpKTt2YXIgcz1uLnNjcm9sbFRvcDtuLnNjcm9sbEJ5KDAsaSpyLmxpbmVIZWlnaHQpLHQhPW51bGwmJm4uc2Nyb2xsQ3Vyc29ySW50b1ZpZXcobnVsbCwuNSksbi5hbmltYXRlU2Nyb2xsaW5nKHMpfSx0aGlzLnNlbGVjdFBhZ2VEb3duPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUJ5UGFnZSgxLCEwKX0sdGhpcy5zZWxlY3RQYWdlVXA9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlQnlQYWdlKC0xLCEwKX0sdGhpcy5nb3RvUGFnZURvd249ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlQnlQYWdlKDEsITEpfSx0aGlzLmdvdG9QYWdlVXA9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlQnlQYWdlKC0xLCExKX0sdGhpcy5zY3JvbGxQYWdlRG93bj1mdW5jdGlvbigpe3RoaXMuJG1vdmVCeVBhZ2UoMSl9LHRoaXMuc2Nyb2xsUGFnZVVwPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUJ5UGFnZSgtMSl9LHRoaXMuc2Nyb2xsVG9Sb3c9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zY3JvbGxUb1JvdyhlKX0sdGhpcy5zY3JvbGxUb0xpbmU9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5yZW5kZXJlci5zY3JvbGxUb0xpbmUoZSx0LG4scil9LHRoaXMuY2VudGVyU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLHQ9e3JvdzpNYXRoLmZsb29yKGUuc3RhcnQucm93KyhlLmVuZC5yb3ctZS5zdGFydC5yb3cpLzIpLGNvbHVtbjpNYXRoLmZsb29yKGUuc3RhcnQuY29sdW1uKyhlLmVuZC5jb2x1bW4tZS5zdGFydC5jb2x1bW4pLzIpfTt0aGlzLnJlbmRlcmVyLmFsaWduQ3Vyc29yKHQsLjUpfSx0aGlzLmdldEN1cnNvclBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uLmdldEN1cnNvcigpfSx0aGlzLmdldEN1cnNvclBvc2l0aW9uU2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpKX0sdGhpcy5nZXRTZWxlY3Rpb25SYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpfSx0aGlzLnNlbGVjdEFsbD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLnNlbGVjdEFsbCgpfSx0aGlzLmNsZWFyU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5tb3ZlQ3Vyc29yVG89ZnVuY3Rpb24oZSx0KXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG8oZSx0KX0sdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbj1mdW5jdGlvbihlKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihlKX0sdGhpcy5qdW1wVG9NYXRjaGluZz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxyPW5ldyB5KHRoaXMuc2Vzc2lvbixuLnJvdyxuLmNvbHVtbiksaT1yLmdldEN1cnJlbnRUb2tlbigpLHM9aXx8ci5zdGVwRm9yd2FyZCgpO2lmKCFzKXJldHVybjt2YXIgbyx1PSExLGE9e30sZj1uLmNvbHVtbi1zLnN0YXJ0LGwsYz17IikiOiIoIiwiKCI6IigiLCJdIjoiWyIsIlsiOiJbIiwieyI6InsiLCJ9IjoieyJ9O2Rve2lmKHMudmFsdWUubWF0Y2goL1t7fSgpXFtcXV0vZykpZm9yKDtmPHMudmFsdWUubGVuZ3RoJiYhdTtmKyspe2lmKCFjW3MudmFsdWVbZl1dKWNvbnRpbnVlO2w9Y1tzLnZhbHVlW2ZdXSsiLiIrcy50eXBlLnJlcGxhY2UoInJwYXJlbiIsImxwYXJlbiIpLGlzTmFOKGFbbF0pJiYoYVtsXT0wKTtzd2l0Y2gocy52YWx1ZVtmXSl7Y2FzZSIoIjpjYXNlIlsiOmNhc2UieyI6YVtsXSsrO2JyZWFrO2Nhc2UiKSI6Y2FzZSJdIjpjYXNlIn0iOmFbbF0tLSxhW2xdPT09LTEmJihvPSJicmFja2V0Iix1PSEwKX19ZWxzZSBzLnR5cGUuaW5kZXhPZigidGFnLW5hbWUiKSE9PS0xJiYoaXNOYU4oYVtzLnZhbHVlXSkmJihhW3MudmFsdWVdPTApLGkudmFsdWU9PT0iPCI/YVtzLnZhbHVlXSsrOmkudmFsdWU9PT0iPC8iJiZhW3MudmFsdWVdLS0sYVtzLnZhbHVlXT09PS0xJiYobz0idGFnIix1PSEwKSk7dXx8KGk9cyxzPXIuc3RlcEZvcndhcmQoKSxmPTApfXdoaWxlKHMmJiF1KTtpZighbylyZXR1cm47dmFyIGgsZDtpZihvPT09ImJyYWNrZXQiKXtoPXRoaXMuc2Vzc2lvbi5nZXRCcmFja2V0UmFuZ2Uobik7aWYoIWgpe2g9bmV3IHAoci5nZXRDdXJyZW50VG9rZW5Sb3coKSxyLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2YtMSxyLmdldEN1cnJlbnRUb2tlblJvdygpLHIuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrZi0xKSxkPWguc3RhcnQ7aWYodHx8ZC5yb3c9PT1uLnJvdyYmTWF0aC5hYnMoZC5jb2x1bW4tbi5jb2x1bW4pPDIpaD10aGlzLnNlc3Npb24uZ2V0QnJhY2tldFJhbmdlKGQpfX1lbHNlIGlmKG89PT0idGFnIil7aWYoIXN8fHMudHlwZS5pbmRleE9mKCJ0YWctbmFtZSIpPT09LTEpcmV0dXJuO3ZhciB2PXMudmFsdWU7aD1uZXcgcChyLmdldEN1cnJlbnRUb2tlblJvdygpLHIuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCktMixyLmdldEN1cnJlbnRUb2tlblJvdygpLHIuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCktMik7aWYoaC5jb21wYXJlKG4ucm93LG4uY29sdW1uKT09PTApe3U9ITE7ZG8gcz1pLGk9ci5zdGVwQmFja3dhcmQoKSxpJiYoaS50eXBlLmluZGV4T2YoInRhZy1jbG9zZSIpIT09LTEmJmguc2V0RW5kKHIuZ2V0Q3VycmVudFRva2VuUm93KCksci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSsxKSxzLnZhbHVlPT09diYmcy50eXBlLmluZGV4T2YoInRhZy1uYW1lIikhPT0tMSYmKGkudmFsdWU9PT0iPCI/YVt2XSsrOmkudmFsdWU9PT0iPC8iJiZhW3ZdLS0sYVt2XT09PTAmJih1PSEwKSkpO3doaWxlKGkmJiF1KX1zJiZzLnR5cGUuaW5kZXhPZigidGFnLW5hbWUiKSYmKGQ9aC5zdGFydCxkLnJvdz09bi5yb3cmJk1hdGguYWJzKGQuY29sdW1uLW4uY29sdW1uKTwyJiYoZD1oLmVuZCkpfWQ9aCYmaC5jdXJzb3J8fGQsZCYmKGU/aCYmdD90aGlzLnNlbGVjdGlvbi5zZXRSYW5nZShoKTpoJiZoLmlzRXF1YWwodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKT90aGlzLmNsZWFyU2VsZWN0aW9uKCk6dGhpcy5zZWxlY3Rpb24uc2VsZWN0VG8oZC5yb3csZC5jb2x1bW4pOnRoaXMuc2VsZWN0aW9uLm1vdmVUbyhkLnJvdyxkLmNvbHVtbikpfSx0aGlzLmdvdG9MaW5lPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpLHRoaXMuc2Vzc2lvbi51bmZvbGQoe3JvdzplLTEsY29sdW1uOnR8fDB9KSx0aGlzLmV4aXRNdWx0aVNlbGVjdE1vZGUmJnRoaXMuZXhpdE11bHRpU2VsZWN0TW9kZSgpLHRoaXMubW92ZUN1cnNvclRvKGUtMSx0fHwwKSx0aGlzLmlzUm93RnVsbHlWaXNpYmxlKGUtMSl8fHRoaXMuc2Nyb2xsVG9MaW5lKGUtMSwhMCxuKX0sdGhpcy5uYXZpZ2F0ZVRvPWZ1bmN0aW9uKGUsdCl7dGhpcy5zZWxlY3Rpb24ubW92ZVRvKGUsdCl9LHRoaXMubmF2aWdhdGVVcD1mdW5jdGlvbihlKXtpZih0aGlzLnNlbGVjdGlvbi5pc011bHRpTGluZSgpJiYhdGhpcy5zZWxlY3Rpb24uaXNCYWNrd2FyZHMoKSl7dmFyIHQ9dGhpcy5zZWxlY3Rpb24uYW5jaG9yLmdldFBvc2l0aW9uKCk7cmV0dXJuIHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24odCl9dGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKSx0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yQnkoLWV8fC0xLDApfSx0aGlzLm5hdmlnYXRlRG93bj1mdW5jdGlvbihlKXtpZih0aGlzLnNlbGVjdGlvbi5pc011bHRpTGluZSgpJiZ0aGlzLnNlbGVjdGlvbi5pc0JhY2t3YXJkcygpKXt2YXIgdD10aGlzLnNlbGVjdGlvbi5hbmNob3IuZ2V0UG9zaXRpb24oKTtyZXR1cm4gdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbih0KX10aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpLHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JCeShlfHwxLDApfSx0aGlzLm5hdmlnYXRlTGVmdD1mdW5jdGlvbihlKXtpZighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKXt2YXIgdD10aGlzLmdldFNlbGVjdGlvblJhbmdlKCkuc3RhcnQ7dGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbih0KX1lbHNle2U9ZXx8MTt3aGlsZShlLS0pdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckxlZnQoKX10aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVSaWdodD1mdW5jdGlvbihlKXtpZighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKXt2YXIgdD10aGlzLmdldFNlbGVjdGlvblJhbmdlKCkuZW5kO3RoaXMubW92ZUN1cnNvclRvUG9zaXRpb24odCl9ZWxzZXtlPWV8fDE7d2hpbGUoZS0tKXRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JSaWdodCgpfXRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZUxpbmVTdGFydD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JMaW5lU3RhcnQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVMaW5lRW5kPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckxpbmVFbmQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVGaWxlRW5kPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckZpbGVFbmQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVGaWxlU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yRmlsZVN0YXJ0KCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlV29yZFJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvcldvcmRSaWdodCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZVdvcmRMZWZ0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvcldvcmRMZWZ0KCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnJlcGxhY2U9ZnVuY3Rpb24oZSx0KXt0JiZ0aGlzLiRzZWFyY2guc2V0KHQpO3ZhciBuPXRoaXMuJHNlYXJjaC5maW5kKHRoaXMuc2Vzc2lvbikscj0wO3JldHVybiBuPyh0aGlzLiR0cnlSZXBsYWNlKG4sZSkmJihyPTEpLHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKG4pLHRoaXMucmVuZGVyZXIuc2Nyb2xsU2VsZWN0aW9uSW50b1ZpZXcobi5zdGFydCxuLmVuZCkscik6cn0sdGhpcy5yZXBsYWNlQWxsPWZ1bmN0aW9uKGUsdCl7dCYmdGhpcy4kc2VhcmNoLnNldCh0KTt2YXIgbj10aGlzLiRzZWFyY2guZmluZEFsbCh0aGlzLnNlc3Npb24pLHI9MDtpZighbi5sZW5ndGgpcmV0dXJuIHI7dmFyIGk9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO3RoaXMuc2VsZWN0aW9uLm1vdmVUbygwLDApO2Zvcih2YXIgcz1uLmxlbmd0aC0xO3M+PTA7LS1zKXRoaXMuJHRyeVJlcGxhY2UobltzXSxlKSYmcisrO3JldHVybiB0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShpKSxyfSx0aGlzLiR0cnlSZXBsYWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZShlKTtyZXR1cm4gdD10aGlzLiRzZWFyY2gucmVwbGFjZShuLHQpLHQhPT1udWxsPyhlLmVuZD10aGlzLnNlc3Npb24ucmVwbGFjZShlLHQpLGUpOm51bGx9LHRoaXMuZ2V0TGFzdFNlYXJjaE9wdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2VhcmNoLmdldE9wdGlvbnMoKX0sdGhpcy5maW5kPWZ1bmN0aW9uKGUsdCxuKXt0fHwodD17fSksdHlwZW9mIGU9PSJzdHJpbmcifHxlIGluc3RhbmNlb2YgUmVnRXhwP3QubmVlZGxlPWU6dHlwZW9mIGU9PSJvYmplY3QiJiZyLm1peGluKHQsZSk7dmFyIGk9dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTt0Lm5lZWRsZT09bnVsbCYmKGU9dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZShpKXx8dGhpcy4kc2VhcmNoLiRvcHRpb25zLm5lZWRsZSxlfHwoaT10aGlzLnNlc3Npb24uZ2V0V29yZFJhbmdlKGkuc3RhcnQucm93LGkuc3RhcnQuY29sdW1uKSxlPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UoaSkpLHRoaXMuJHNlYXJjaC5zZXQoe25lZWRsZTplfSkpLHRoaXMuJHNlYXJjaC5zZXQodCksdC5zdGFydHx8dGhpcy4kc2VhcmNoLnNldCh7c3RhcnQ6aX0pO3ZhciBzPXRoaXMuJHNlYXJjaC5maW5kKHRoaXMuc2Vzc2lvbik7aWYodC5wcmV2ZW50U2Nyb2xsKXJldHVybiBzO2lmKHMpcmV0dXJuIHRoaXMucmV2ZWFsUmFuZ2UocyxuKSxzO3QuYmFja3dhcmRzP2kuc3RhcnQ9aS5lbmQ6aS5lbmQ9aS5zdGFydCx0aGlzLnNlbGVjdGlvbi5zZXRSYW5nZShpKX0sdGhpcy5maW5kTmV4dD1mdW5jdGlvbihlLHQpe3RoaXMuZmluZCh7c2tpcEN1cnJlbnQ6ITAsYmFja3dhcmRzOiExfSxlLHQpfSx0aGlzLmZpbmRQcmV2aW91cz1mdW5jdGlvbihlLHQpe3RoaXMuZmluZChlLHtza2lwQ3VycmVudDohMCxiYWNrd2FyZHM6ITB9LHQpfSx0aGlzLnJldmVhbFJhbmdlPWZ1bmN0aW9uKGUsdCl7dGhpcy5zZXNzaW9uLnVuZm9sZChlKSx0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShlKTt2YXIgbj10aGlzLnJlbmRlcmVyLnNjcm9sbFRvcDt0aGlzLnJlbmRlcmVyLnNjcm9sbFNlbGVjdGlvbkludG9WaWV3KGUuc3RhcnQsZS5lbmQsLjUpLHQhPT0hMSYmdGhpcy5yZW5kZXJlci5hbmltYXRlU2Nyb2xsaW5nKG4pfSx0aGlzLnVuZG89ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24uZ2V0VW5kb01hbmFnZXIoKS51bmRvKHRoaXMuc2Vzc2lvbiksdGhpcy5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyhudWxsLC41KX0sdGhpcy5yZWRvPWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLmdldFVuZG9NYW5hZ2VyKCkucmVkbyh0aGlzLnNlc3Npb24pLHRoaXMucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcobnVsbCwuNSl9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuZGVzdHJveSgpLHRoaXMuX3NpZ25hbCgiZGVzdHJveSIsdGhpcyksdGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24uZGVzdHJveSgpfSx0aGlzLnNldEF1dG9TY3JvbGxFZGl0b3JJbnRvVmlldz1mdW5jdGlvbihlKXtpZighZSlyZXR1cm47dmFyIHQsbj10aGlzLHI9ITE7dGhpcy4kc2Nyb2xsQW5jaG9yfHwodGhpcy4kc2Nyb2xsQW5jaG9yPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTt2YXIgaT10aGlzLiRzY3JvbGxBbmNob3I7aS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZSIsdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKGksdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCk7dmFyIHM9dGhpcy5vbigiY2hhbmdlU2VsZWN0aW9uIixmdW5jdGlvbigpe3I9ITB9KSxvPXRoaXMucmVuZGVyZXIub24oImJlZm9yZVJlbmRlciIsZnVuY3Rpb24oKXtyJiYodD1uLnJlbmRlcmVyLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSl9KSx1PXRoaXMucmVuZGVyZXIub24oImFmdGVyUmVuZGVyIixmdW5jdGlvbigpe2lmKHImJnQmJihuLmlzRm9jdXNlZCgpfHxuLnNlYXJjaEJveCYmbi5zZWFyY2hCb3guaXNGb2N1c2VkKCkpKXt2YXIgZT1uLnJlbmRlcmVyLHM9ZS4kY3Vyc29yTGF5ZXIuJHBpeGVsUG9zLG89ZS5sYXllckNvbmZpZyx1PXMudG9wLW8ub2Zmc2V0O3MudG9wPj0wJiZ1K3QudG9wPDA/cj0hMDpzLnRvcDxvLmhlaWdodCYmcy50b3ArdC50b3Arby5saW5lSGVpZ2h0PndpbmRvdy5pbm5lckhlaWdodD9yPSExOnI9bnVsbCxyIT1udWxsJiYoaS5zdHlsZS50b3A9dSsicHgiLGkuc3R5bGUubGVmdD1zLmxlZnQrInB4IixpLnN0eWxlLmhlaWdodD1vLmxpbmVIZWlnaHQrInB4IixpLnNjcm9sbEludG9WaWV3KHIpKSxyPXQ9bnVsbH19KTt0aGlzLnNldEF1dG9TY3JvbGxFZGl0b3JJbnRvVmlldz1mdW5jdGlvbihlKXtpZihlKXJldHVybjtkZWxldGUgdGhpcy5zZXRBdXRvU2Nyb2xsRWRpdG9ySW50b1ZpZXcsdGhpcy5vZmYoImNoYW5nZVNlbGVjdGlvbiIscyksdGhpcy5yZW5kZXJlci5vZmYoImFmdGVyUmVuZGVyIix1KSx0aGlzLnJlbmRlcmVyLm9mZigiYmVmb3JlUmVuZGVyIixvKX19LHRoaXMuJHJlc2V0Q3Vyc29yU3R5bGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRjdXJzb3JTdHlsZXx8ImFjZSIsdD10aGlzLnJlbmRlcmVyLiRjdXJzb3JMYXllcjtpZighdClyZXR1cm47dC5zZXRTbW9vdGhCbGlua2luZygvc21vb3RoLy50ZXN0KGUpKSx0LmlzQmxpbmtpbmc9IXRoaXMuJHJlYWRPbmx5JiZlIT0id2lkZSIsaS5zZXRDc3NDbGFzcyh0LmVsZW1lbnQsImFjZV9zbGltLWN1cnNvcnMiLC9zbGltLy50ZXN0KGUpKX0sdGhpcy5wcm9tcHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXM7Zy5sb2FkTW9kdWxlKCIuL2V4dC9wcm9tcHQiLGZ1bmN0aW9uKGkpe2kucHJvbXB0KHIsZSx0LG4pfSl9fS5jYWxsKHcucHJvdG90eXBlKSxnLmRlZmluZU9wdGlvbnMody5wcm90b3R5cGUsImVkaXRvciIse3NlbGVjdGlvblN0eWxlOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpLHRoaXMuX3NpZ25hbCgiY2hhbmdlU2VsZWN0aW9uU3R5bGUiLHtkYXRhOmV9KX0saW5pdGlhbFZhbHVlOiJsaW5lIn0saGlnaGxpZ2h0QWN0aXZlTGluZTp7c2V0OmZ1bmN0aW9uKCl7dGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpfSxpbml0aWFsVmFsdWU6ITB9LGhpZ2hsaWdodFNlbGVjdGVkV29yZDp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlKCl9LGluaXRpYWxWYWx1ZTohMH0scmVhZE9ubHk6e3NldDpmdW5jdGlvbihlKXt0aGlzLnRleHRJbnB1dC5zZXRSZWFkT25seShlKSx0aGlzLiRyZXNldEN1cnNvclN0eWxlKCl9LGluaXRpYWxWYWx1ZTohMX0sY29weVdpdGhFbXB0eVNlbGVjdGlvbjp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMudGV4dElucHV0LnNldENvcHlXaXRoRW1wdHlTZWxlY3Rpb24oZSl9LGluaXRpYWxWYWx1ZTohMX0sY3Vyc29yU3R5bGU6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRyZXNldEN1cnNvclN0eWxlKCl9LHZhbHVlczpbImFjZSIsInNsaW0iLCJzbW9vdGgiLCJ3aWRlIl0saW5pdGlhbFZhbHVlOiJhY2UifSxtZXJnZVVuZG9EZWx0YXM6e3ZhbHVlczpbITEsITAsImFsd2F5cyJdLGluaXRpYWxWYWx1ZTohMH0sYmVoYXZpb3Vyc0VuYWJsZWQ6e2luaXRpYWxWYWx1ZTohMH0sd3JhcEJlaGF2aW91cnNFbmFibGVkOntpbml0aWFsVmFsdWU6ITB9LGF1dG9TY3JvbGxFZGl0b3JJbnRvVmlldzp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuc2V0QXV0b1Njcm9sbEVkaXRvckludG9WaWV3KGUpfX0sa2V5Ym9hcmRIYW5kbGVyOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXRLZXlib2FyZEhhbmRsZXIoZSl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRrZXliaW5kaW5nSWR9LGhhbmRsZXNTZXQ6ITB9LHZhbHVlOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uLnNldFZhbHVlKGUpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpfSxoYW5kbGVzU2V0OiEwLGhpZGRlbjohMH0sc2Vzc2lvbjp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuc2V0U2Vzc2lvbihlKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbn0saGFuZGxlc1NldDohMCxoaWRkZW46ITB9LHNob3dMaW5lTnVtYmVyczp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuJGd1dHRlckxheWVyLnNldFNob3dMaW5lTnVtYmVycyhlKSx0aGlzLnJlbmRlcmVyLiRsb29wLnNjaGVkdWxlKHRoaXMucmVuZGVyZXIuQ0hBTkdFX0dVVFRFUiksZSYmdGhpcy4kcmVsYXRpdmVMaW5lTnVtYmVycz9FLmF0dGFjaCh0aGlzKTpFLmRldGFjaCh0aGlzKX0saW5pdGlhbFZhbHVlOiEwfSxyZWxhdGl2ZUxpbmVOdW1iZXJzOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kc2hvd0xpbmVOdW1iZXJzJiZlP0UuYXR0YWNoKHRoaXMpOkUuZGV0YWNoKHRoaXMpfX0saFNjcm9sbEJhckFsd2F5c1Zpc2libGU6InJlbmRlcmVyIix2U2Nyb2xsQmFyQWx3YXlzVmlzaWJsZToicmVuZGVyZXIiLGhpZ2hsaWdodEd1dHRlckxpbmU6InJlbmRlcmVyIixhbmltYXRlZFNjcm9sbDoicmVuZGVyZXIiLHNob3dJbnZpc2libGVzOiJyZW5kZXJlciIsc2hvd1ByaW50TWFyZ2luOiJyZW5kZXJlciIscHJpbnRNYXJnaW5Db2x1bW46InJlbmRlcmVyIixwcmludE1hcmdpbjoicmVuZGVyZXIiLGZhZGVGb2xkV2lkZ2V0czoicmVuZGVyZXIiLHNob3dGb2xkV2lkZ2V0czoicmVuZGVyZXIiLGRpc3BsYXlJbmRlbnRHdWlkZXM6InJlbmRlcmVyIixzaG93R3V0dGVyOiJyZW5kZXJlciIsZm9udFNpemU6InJlbmRlcmVyIixmb250RmFtaWx5OiJyZW5kZXJlciIsbWF4TGluZXM6InJlbmRlcmVyIixtaW5MaW5lczoicmVuZGVyZXIiLHNjcm9sbFBhc3RFbmQ6InJlbmRlcmVyIixmaXhlZFdpZHRoR3V0dGVyOiJyZW5kZXJlciIsdGhlbWU6InJlbmRlcmVyIixoYXNDc3NUcmFuc2Zvcm1zOiJyZW5kZXJlciIsbWF4UGl4ZWxIZWlnaHQ6InJlbmRlcmVyIix1c2VUZXh0YXJlYUZvcklNRToicmVuZGVyZXIiLHNjcm9sbFNwZWVkOiIkbW91c2VIYW5kbGVyIixkcmFnRGVsYXk6IiRtb3VzZUhhbmRsZXIiLGRyYWdFbmFibGVkOiIkbW91c2VIYW5kbGVyIixmb2N1c1RpbWVvdXQ6IiRtb3VzZUhhbmRsZXIiLHRvb2x0aXBGb2xsb3dzTW91c2U6IiRtb3VzZUhhbmRsZXIiLGZpcnN0TGluZU51bWJlcjoic2Vzc2lvbiIsb3ZlcndyaXRlOiJzZXNzaW9uIixuZXdMaW5lTW9kZToic2Vzc2lvbiIsdXNlV29ya2VyOiJzZXNzaW9uIix1c2VTb2Z0VGFiczoic2Vzc2lvbiIsbmF2aWdhdGVXaXRoaW5Tb2Z0VGFiczoic2Vzc2lvbiIsdGFiU2l6ZToic2Vzc2lvbiIsd3JhcDoic2Vzc2lvbiIsaW5kZW50ZWRTb2Z0V3JhcDoic2Vzc2lvbiIsZm9sZFN0eWxlOiJzZXNzaW9uIixtb2RlOiJzZXNzaW9uIn0pO3ZhciBFPXtnZXRUZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuKE1hdGguYWJzKGUuc2VsZWN0aW9uLmxlYWQucm93LXQpfHx0KzErKHQ8OT8iXHUwMGI3IjoiIikpKyIifSxnZXRXaWR0aDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIE1hdGgubWF4KHQudG9TdHJpbmcoKS5sZW5ndGgsKG4ubGFzdFJvdysxKS50b1N0cmluZygpLmxlbmd0aCwyKSpuLmNoYXJhY3RlcldpZHRofSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXt0LnJlbmRlcmVyLiRsb29wLnNjaGVkdWxlKHQucmVuZGVyZXIuQ0hBTkdFX0dVVFRFUil9LGF0dGFjaDpmdW5jdGlvbihlKXtlLnJlbmRlcmVyLiRndXR0ZXJMYXllci4kcmVuZGVyZXI9dGhpcyxlLm9uKCJjaGFuZ2VTZWxlY3Rpb24iLHRoaXMudXBkYXRlKSx0aGlzLnVwZGF0ZShudWxsLGUpfSxkZXRhY2g6ZnVuY3Rpb24oZSl7ZS5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuJHJlbmRlcmVyPT10aGlzJiYoZS5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuJHJlbmRlcmVyPW51bGwpLGUub2ZmKCJjaGFuZ2VTZWxlY3Rpb24iLHRoaXMudXBkYXRlKSx0aGlzLnVwZGF0ZShudWxsLGUpfX07dC5FZGl0b3I9d30pLGFjZS5kZWZpbmUoImFjZS91bmRvbWFuYWdlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlLHQpe2Zvcih2YXIgbj10O24tLTspe3ZhciByPWVbbl07aWYociYmIXJbMF0uaWdub3JlKXt3aGlsZShuPHQtMSl7dmFyIGk9ZChlW25dLGVbbisxXSk7ZVtuXT1pWzBdLGVbbisxXT1pWzFdLG4rK31yZXR1cm4hMH19fWZ1bmN0aW9uIGEoZSl7dmFyIHQ9ZS5hY3Rpb249PSJpbnNlcnQiLG49ZS5zdGFydCxyPWUuZW5kLGk9KHIucm93LW4ucm93KSoodD8xOi0xKSxzPShyLmNvbHVtbi1uLmNvbHVtbikqKHQ/MTotMSk7dCYmKHI9bik7Zm9yKHZhciBvIGluIHRoaXMubWFya3Mpe3ZhciBhPXRoaXMubWFya3Nbb10sZj11KGEsbik7aWYoZjwwKWNvbnRpbnVlO2lmKGY9PT0wJiZ0KXtpZihhLmJpYXMhPTEpe2EuYmlhcz09LTE7Y29udGludWV9Zj0xfXZhciBsPXQ/Zjp1KGEscik7aWYobD4wKXthLnJvdys9aSxhLmNvbHVtbis9YS5yb3c9PXIucm93P3M6MDtjb250aW51ZX0hdCYmbDw9MCYmKGEucm93PW4ucm93LGEuY29sdW1uPW4uY29sdW1uLGw9PT0wJiYoYS5iaWFzPTEpKX19ZnVuY3Rpb24gZihlKXtyZXR1cm57cm93OmUucm93LGNvbHVtbjplLmNvbHVtbn19ZnVuY3Rpb24gbChlKXtyZXR1cm57c3RhcnQ6ZihlLnN0YXJ0KSxlbmQ6ZihlLmVuZCksYWN0aW9uOmUuYWN0aW9uLGxpbmVzOmUubGluZXMuc2xpY2UoKX19ZnVuY3Rpb24gYyhlKXtlPWV8fHRoaXM7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZS5tYXAoYykuam9pbigiXG4iKTt2YXIgdD0iIjtlLmFjdGlvbj8odD1lLmFjdGlvbj09Imluc2VydCI/IisiOiItIix0Kz0iWyIrZS5saW5lcysiXSIpOmUudmFsdWUmJihBcnJheS5pc0FycmF5KGUudmFsdWUpP3Q9ZS52YWx1ZS5tYXAoaCkuam9pbigiXG4iKTp0PWgoZS52YWx1ZSkpLGUuc3RhcnQmJih0Kz1oKGUpKTtpZihlLmlkfHxlLnJldil0Kz0iCSgiKyhlLmlkfHxlLnJldikrIikiO3JldHVybiB0fWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGUuc3RhcnQucm93KyI6IitlLnN0YXJ0LmNvbHVtbisiPT4iK2UuZW5kLnJvdysiOiIrZS5lbmQuY29sdW1ufWZ1bmN0aW9uIHAoZSx0KXt2YXIgbj1lLmFjdGlvbj09Imluc2VydCIscj10LmFjdGlvbj09Imluc2VydCI7aWYobiYmcilpZihvKHQuc3RhcnQsZS5lbmQpPj0wKW0odCxlLC0xKTtlbHNle2lmKCEobyh0LnN0YXJ0LGUuc3RhcnQpPD0wKSlyZXR1cm4gbnVsbDttKGUsdCwxKX1lbHNlIGlmKG4mJiFyKWlmKG8odC5zdGFydCxlLmVuZCk+PTApbSh0LGUsLTEpO2Vsc2V7aWYoIShvKHQuZW5kLGUuc3RhcnQpPD0wKSlyZXR1cm4gbnVsbDttKGUsdCwtMSl9ZWxzZSBpZighbiYmcilpZihvKHQuc3RhcnQsZS5zdGFydCk+PTApbSh0LGUsMSk7ZWxzZXtpZighKG8odC5zdGFydCxlLnN0YXJ0KTw9MCkpcmV0dXJuIG51bGw7bShlLHQsMSl9ZWxzZSBpZighbiYmIXIpaWYobyh0LnN0YXJ0LGUuc3RhcnQpPj0wKW0odCxlLDEpO2Vsc2V7aWYoIShvKHQuZW5kLGUuc3RhcnQpPD0wKSlyZXR1cm4gbnVsbDttKGUsdCwtMSl9cmV0dXJuW3QsZV19ZnVuY3Rpb24gZChlLHQpe2Zvcih2YXIgbj1lLmxlbmd0aDtuLS07KWZvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKWlmKCFwKGVbbl0sdFtyXSkpe3doaWxlKG48ZS5sZW5ndGgpe3doaWxlKHItLSlwKHRbcl0sZVtuXSk7cj10Lmxlbmd0aCxuKyt9cmV0dXJuW2UsdF19cmV0dXJuIGUuc2VsZWN0aW9uQmVmb3JlPXQuc2VsZWN0aW9uQmVmb3JlPWUuc2VsZWN0aW9uQWZ0ZXI9dC5zZWxlY3Rpb25BZnRlcj1udWxsLFt0LGVdfWZ1bmN0aW9uIHYoZSx0KXt2YXIgbj1lLmFjdGlvbj09Imluc2VydCIscj10LmFjdGlvbj09Imluc2VydCI7aWYobiYmcilvKGUuc3RhcnQsdC5zdGFydCk8MD9tKHQsZSwxKTptKGUsdCwxKTtlbHNlIGlmKG4mJiFyKW8oZS5zdGFydCx0LmVuZCk+PTA/bShlLHQsLTEpOm8oZS5zdGFydCx0LnN0YXJ0KTw9MD9tKHQsZSwxKToobShlLHMuZnJvbVBvaW50cyh0LnN0YXJ0LGUuc3RhcnQpLC0xKSxtKHQsZSwxKSk7ZWxzZSBpZighbiYmcilvKHQuc3RhcnQsZS5lbmQpPj0wP20odCxlLC0xKTpvKHQuc3RhcnQsZS5zdGFydCk8PTA/bShlLHQsMSk6KG0odCxzLmZyb21Qb2ludHMoZS5zdGFydCx0LnN0YXJ0KSwtMSksbShlLHQsMSkpO2Vsc2UgaWYoIW4mJiFyKWlmKG8odC5zdGFydCxlLmVuZCk+PTApbSh0LGUsLTEpO2Vsc2V7aWYoIShvKHQuZW5kLGUuc3RhcnQpPD0wKSl7dmFyIGksdTtyZXR1cm4gbyhlLnN0YXJ0LHQuc3RhcnQpPDAmJihpPWUsZT15KGUsdC5zdGFydCkpLG8oZS5lbmQsdC5lbmQpPjAmJih1PXkoZSx0LmVuZCkpLGcodC5lbmQsZS5zdGFydCxlLmVuZCwtMSksdSYmIWkmJihlLmxpbmVzPXUubGluZXMsZS5zdGFydD11LnN0YXJ0LGUuZW5kPXUuZW5kLHU9ZSksW3QsaSx1XS5maWx0ZXIoQm9vbGVhbil9bShlLHQsLTEpfXJldHVyblt0LGVdfWZ1bmN0aW9uIG0oZSx0LG4pe2coZS5zdGFydCx0LnN0YXJ0LHQuZW5kLG4pLGcoZS5lbmQsdC5zdGFydCx0LmVuZCxuKX1mdW5jdGlvbiBnKGUsdCxuLHIpe2Uucm93PT0ocj09MT90Om4pLnJvdyYmKGUuY29sdW1uKz1yKihuLmNvbHVtbi10LmNvbHVtbikpLGUucm93Kz1yKihuLnJvdy10LnJvdyl9ZnVuY3Rpb24geShlLHQpe3ZhciBuPWUubGluZXMscj1lLmVuZDtlLmVuZD1mKHQpO3ZhciBpPWUuZW5kLnJvdy1lLnN0YXJ0LnJvdyxzPW4uc3BsaWNlKGksbi5sZW5ndGgpLG89aT90LmNvbHVtbjp0LmNvbHVtbi1lLnN0YXJ0LmNvbHVtbjtuLnB1c2goc1swXS5zdWJzdHJpbmcoMCxvKSksc1swXT1zWzBdLnN1YnN0cihvKTt2YXIgdT17c3RhcnQ6Zih0KSxlbmQ6cixsaW5lczpzLGFjdGlvbjplLmFjdGlvbn07cmV0dXJuIHV9ZnVuY3Rpb24gYihlLHQpe3Q9bCh0KTtmb3IodmFyIG49ZS5sZW5ndGg7bi0tOyl7dmFyIHI9ZVtuXTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIHM9cltpXSxvPXYocyx0KTt0PW9bMF0sby5sZW5ndGghPTImJihvWzJdPyhyLnNwbGljZShpKzEsMSxvWzFdLG9bMl0pLGkrKyk6b1sxXXx8KHIuc3BsaWNlKGksMSksaS0tKSl9ci5sZW5ndGh8fGUuc3BsaWNlKG4sMSl9cmV0dXJuIGV9ZnVuY3Rpb24gdyhlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO2Zvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKWIoZSxyW2ldKX19dmFyIHI9ZnVuY3Rpb24oKXt0aGlzLiRtYXhSZXY9MCx0aGlzLiRmcm9tVW5kbz0hMSx0aGlzLnJlc2V0KCl9OyhmdW5jdGlvbigpe3RoaXMuYWRkU2Vzc2lvbj1mdW5jdGlvbihlKXt0aGlzLiRzZXNzaW9uPWV9LHRoaXMuYWRkPWZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLiRmcm9tVW5kbylyZXR1cm47aWYoZT09dGhpcy4kbGFzdERlbHRhKXJldHVybjtpZih0PT09ITF8fCF0aGlzLmxhc3REZWx0YXMpdGhpcy5sYXN0RGVsdGFzPVtdLHRoaXMuJHVuZG9TdGFjay5wdXNoKHRoaXMubGFzdERlbHRhcyksZS5pZD10aGlzLiRyZXY9Kyt0aGlzLiRtYXhSZXY7aWYoZS5hY3Rpb249PSJyZW1vdmUifHxlLmFjdGlvbj09Imluc2VydCIpdGhpcy4kbGFzdERlbHRhPWU7dGhpcy5sYXN0RGVsdGFzLnB1c2goZSl9LHRoaXMuYWRkU2VsZWN0aW9uPWZ1bmN0aW9uKGUsdCl7dGhpcy5zZWxlY3Rpb25zLnB1c2goe3ZhbHVlOmUscmV2OnR8fHRoaXMuJHJldn0pfSx0aGlzLnN0YXJ0TmV3R3JvdXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXN0RGVsdGFzPW51bGwsdGhpcy4kcmV2fSx0aGlzLm1hcmtJZ25vcmVkPWZ1bmN0aW9uKGUsdCl7dD09bnVsbCYmKHQ9dGhpcy4kcmV2KzEpO3ZhciBuPXRoaXMuJHVuZG9TdGFjaztmb3IodmFyIHI9bi5sZW5ndGg7ci0tOyl7dmFyIGk9bltyXVswXTtpZihpLmlkPD1lKWJyZWFrO2kuaWQ8dCYmKGkuaWdub3JlPSEwKX10aGlzLmxhc3REZWx0YXM9bnVsbH0sdGhpcy5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNlbGVjdGlvbnM7Zm9yKHZhciByPW4ubGVuZ3RoO3ItLTspe3ZhciBpPW5bcl07aWYoaS5yZXY8ZSlyZXR1cm4gdCYmKGk9bltyKzFdKSxpfX0sdGhpcy5nZXRSZXZpc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyZXZ9LHRoaXMuZ2V0RGVsdGFzPWZ1bmN0aW9uKGUsdCl7dD09bnVsbCYmKHQ9dGhpcy4kcmV2KzEpO3ZhciBuPXRoaXMuJHVuZG9TdGFjayxyPW51bGwsaT0wO2Zvcih2YXIgcz1uLmxlbmd0aDtzLS07KXt2YXIgbz1uW3NdWzBdO28uaWQ8dCYmIXImJihyPXMrMSk7aWYoby5pZDw9ZSl7aT1zKzE7YnJlYWt9fXJldHVybiBuLnNsaWNlKGkscil9LHRoaXMuZ2V0Q2hhbmdlZFJhbmdlcz1mdW5jdGlvbihlLHQpe3Q9PW51bGwmJih0PXRoaXMuJHJldisxKX0sdGhpcy5nZXRDaGFuZ2VkTGluZXM9ZnVuY3Rpb24oZSx0KXt0PT1udWxsJiYodD10aGlzLiRyZXYrMSl9LHRoaXMudW5kbz1mdW5jdGlvbihlLHQpe3RoaXMubGFzdERlbHRhcz1udWxsO3ZhciBuPXRoaXMuJHVuZG9TdGFjaztpZighaShuLG4ubGVuZ3RoKSlyZXR1cm47ZXx8KGU9dGhpcy4kc2Vzc2lvbiksdGhpcy4kcmVkb1N0YWNrQmFzZVJldiE9PXRoaXMuJHJldiYmdGhpcy4kcmVkb1N0YWNrLmxlbmd0aCYmKHRoaXMuJHJlZG9TdGFjaz1bXSksdGhpcy4kZnJvbVVuZG89ITA7dmFyIHI9bi5wb3AoKSxzPW51bGw7cmV0dXJuIHImJnIubGVuZ3RoJiYocz1lLnVuZG9DaGFuZ2VzKHIsdCksdGhpcy4kcmVkb1N0YWNrLnB1c2gociksdGhpcy4kc3luY1JldigpKSx0aGlzLiRmcm9tVW5kbz0hMSxzfSx0aGlzLnJlZG89ZnVuY3Rpb24oZSx0KXt0aGlzLmxhc3REZWx0YXM9bnVsbCxlfHwoZT10aGlzLiRzZXNzaW9uKSx0aGlzLiRmcm9tVW5kbz0hMDtpZih0aGlzLiRyZWRvU3RhY2tCYXNlUmV2IT10aGlzLiRyZXYpe3ZhciBuPXRoaXMuZ2V0RGVsdGFzKHRoaXMuJHJlZG9TdGFja0Jhc2VSZXYsdGhpcy4kcmV2KzEpO3codGhpcy4kcmVkb1N0YWNrLG4pLHRoaXMuJHJlZG9TdGFja0Jhc2VSZXY9dGhpcy4kcmV2LHRoaXMuJHJlZG9TdGFjay5mb3JFYWNoKGZ1bmN0aW9uKGUpe2VbMF0uaWQ9Kyt0aGlzLiRtYXhSZXZ9LHRoaXMpfXZhciByPXRoaXMuJHJlZG9TdGFjay5wb3AoKSxpPW51bGw7cmV0dXJuIHImJihpPWUucmVkb0NoYW5nZXMocix0KSx0aGlzLiR1bmRvU3RhY2sucHVzaChyKSx0aGlzLiRzeW5jUmV2KCkpLHRoaXMuJGZyb21VbmRvPSExLGl9LHRoaXMuJHN5bmNSZXY9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiR1bmRvU3RhY2ssdD1lW2UubGVuZ3RoLTFdLG49dCYmdFswXS5pZHx8MDt0aGlzLiRyZWRvU3RhY2tCYXNlUmV2PW4sdGhpcy4kcmV2PW59LHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmxhc3REZWx0YXM9bnVsbCx0aGlzLiRsYXN0RGVsdGE9bnVsbCx0aGlzLiR1bmRvU3RhY2s9W10sdGhpcy4kcmVkb1N0YWNrPVtdLHRoaXMuJHJldj0wLHRoaXMubWFyaz0wLHRoaXMuJHJlZG9TdGFja0Jhc2VSZXY9dGhpcy4kcmV2LHRoaXMuc2VsZWN0aW9ucz1bXX0sdGhpcy5jYW5VbmRvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHVuZG9TdGFjay5sZW5ndGg+MH0sdGhpcy5jYW5SZWRvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJlZG9TdGFjay5sZW5ndGg+MH0sdGhpcy5ib29rbWFyaz1mdW5jdGlvbihlKXtlPT11bmRlZmluZWQmJihlPXRoaXMuJHJldiksdGhpcy5tYXJrPWV9LHRoaXMuaXNBdEJvb2ttYXJrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJldj09PXRoaXMubWFya30sdGhpcy50b0pTT049ZnVuY3Rpb24oKXt9LHRoaXMuZnJvbUpTT049ZnVuY3Rpb24oKXt9LHRoaXMuaGFzVW5kbz10aGlzLmNhblVuZG8sdGhpcy5oYXNSZWRvPXRoaXMuY2FuUmVkbyx0aGlzLmlzQ2xlYW49dGhpcy5pc0F0Qm9va21hcmssdGhpcy5tYXJrQ2xlYW49dGhpcy5ib29rbWFyayx0aGlzLiRwcmV0dHlQcmludD1mdW5jdGlvbihlKXtyZXR1cm4gZT9jKGUpOmModGhpcy4kdW5kb1N0YWNrKSsiXG4tLS1cbiIrYyh0aGlzLiRyZWRvU3RhY2spfX0pLmNhbGwoci5wcm90b3R5cGUpO3ZhciBzPWUoIi4vcmFuZ2UiKS5SYW5nZSxvPXMuY29tcGFyZVBvaW50cyx1PXMuY29tcGFyZVBvaW50czt0LlVuZG9NYW5hZ2VyPXJ9KSxhY2UuZGVmaW5lKCJhY2UvbGF5ZXIvbGluZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL2RvbSIpLGk9ZnVuY3Rpb24oZSx0KXt0aGlzLmVsZW1lbnQ9ZSx0aGlzLmNhbnZhc0hlaWdodD10fHw1ZTUsdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodD10aGlzLmNhbnZhc0hlaWdodCoyKyJweCIsdGhpcy5jZWxscz1bXSx0aGlzLmNlbGxDYWNoZT1bXSx0aGlzLiRvZmZzZXRDb2VmZmljaWVudD0wfTsoZnVuY3Rpb24oKXt0aGlzLm1vdmVDb250YWluZXI9ZnVuY3Rpb24oZSl7ci50cmFuc2xhdGUodGhpcy5lbGVtZW50LDAsLShlLmZpcnN0Um93U2NyZWVuKmUubGluZUhlaWdodCV0aGlzLmNhbnZhc0hlaWdodCktZS5vZmZzZXQqdGhpcy4kb2Zmc2V0Q29lZmZpY2llbnQpfSx0aGlzLnBhZ2VDaGFuZ2VkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE1hdGguZmxvb3IoZS5maXJzdFJvd1NjcmVlbiplLmxpbmVIZWlnaHQvdGhpcy5jYW52YXNIZWlnaHQpIT09TWF0aC5mbG9vcih0LmZpcnN0Um93U2NyZWVuKnQubGluZUhlaWdodC90aGlzLmNhbnZhc0hlaWdodCl9LHRoaXMuY29tcHV0ZUxpbmVUb3A9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQuZmlyc3RSb3dTY3JlZW4qdC5saW5lSGVpZ2h0LGk9TWF0aC5mbG9vcihyL3RoaXMuY2FudmFzSGVpZ2h0KSxzPW4uZG9jdW1lbnRUb1NjcmVlblJvdyhlLDApKnQubGluZUhlaWdodDtyZXR1cm4gcy1pKnRoaXMuY2FudmFzSGVpZ2h0fSx0aGlzLmNvbXB1dGVMaW5lSGVpZ2h0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdC5saW5lSGVpZ2h0Km4uZ2V0Um93TGVuZ3RoKGUpfSx0aGlzLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGxzLmxlbmd0aH0sdGhpcy5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2VsbHNbZV19LHRoaXMuc2hpZnQ9ZnVuY3Rpb24oKXt0aGlzLiRjYWNoZUNlbGwodGhpcy5jZWxscy5zaGlmdCgpKX0sdGhpcy5wb3A9ZnVuY3Rpb24oKXt0aGlzLiRjYWNoZUNlbGwodGhpcy5jZWxscy5wb3AoKSl9LHRoaXMucHVzaD1mdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXt0aGlzLmNlbGxzLnB1c2guYXBwbHkodGhpcy5jZWxscyxlKTt2YXIgdD1yLmNyZWF0ZUZyYWdtZW50KHRoaXMuZWxlbWVudCk7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspdC5hcHBlbmRDaGlsZChlW25dLmVsZW1lbnQpO3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0KX1lbHNlIHRoaXMuY2VsbHMucHVzaChlKSx0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoZS5lbGVtZW50KX0sdGhpcy51bnNoaWZ0PWZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpe3RoaXMuY2VsbHMudW5zaGlmdC5hcHBseSh0aGlzLmNlbGxzLGUpO3ZhciB0PXIuY3JlYXRlRnJhZ21lbnQodGhpcy5lbGVtZW50KTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0LmFwcGVuZENoaWxkKGVbbl0uZWxlbWVudCk7dGhpcy5lbGVtZW50LmZpcnN0Q2hpbGQ/dGhpcy5lbGVtZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuZWxlbWVudC5maXJzdENoaWxkKTp0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodCl9ZWxzZSB0aGlzLmNlbGxzLnVuc2hpZnQoZSksdGhpcy5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJiZWdpbiIsZS5lbGVtZW50KX0sdGhpcy5sYXN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbHMubGVuZ3RoP3RoaXMuY2VsbHNbdGhpcy5jZWxscy5sZW5ndGgtMV06bnVsbH0sdGhpcy4kY2FjaGVDZWxsPWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybjtlLmVsZW1lbnQucmVtb3ZlKCksdGhpcy5jZWxsQ2FjaGUucHVzaChlKX0sdGhpcy5jcmVhdGVDZWxsPWZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBzPXRoaXMuY2VsbENhY2hlLnBvcCgpO2lmKCFzKXt2YXIgbz1yLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2kmJmkobyksdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKG8pLHM9e2VsZW1lbnQ6byx0ZXh0OiIiLHJvdzplfX1yZXR1cm4gcy5yb3c9ZSxzfX0pLmNhbGwoaS5wcm90b3R5cGUpLHQuTGluZXM9aX0pLGFjZS5kZWZpbmUoImFjZS9sYXllci9ndXR0ZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL2xheWVyL2xpbmVzIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBmKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKTtlLmFwcGVuZENoaWxkKHQpO3ZhciBuPXIuY3JlYXRlRWxlbWVudCgic3BhbiIpO3JldHVybiBlLmFwcGVuZENoaWxkKG4pLGV9dmFyIHI9ZSgiLi4vbGliL2RvbSIpLGk9ZSgiLi4vbGliL29vcCIpLHM9ZSgiLi4vbGliL2xhbmciKSxvPWUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHU9ZSgiLi9saW5lcyIpLkxpbmVzLGE9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50PXIuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX2xheWVyIGFjZV9ndXR0ZXItbGF5ZXIiLGUuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KSx0aGlzLnNldFNob3dGb2xkV2lkZ2V0cyh0aGlzLiRzaG93Rm9sZFdpZGdldHMpLHRoaXMuZ3V0dGVyV2lkdGg9MCx0aGlzLiRhbm5vdGF0aW9ucz1bXSx0aGlzLiR1cGRhdGVBbm5vdGF0aW9ucz10aGlzLiR1cGRhdGVBbm5vdGF0aW9ucy5iaW5kKHRoaXMpLHRoaXMuJGxpbmVzPW5ldyB1KHRoaXMuZWxlbWVudCksdGhpcy4kbGluZXMuJG9mZnNldENvZWZmaWNpZW50PTF9OyhmdW5jdGlvbigpe2kuaW1wbGVtZW50KHRoaXMsbyksdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy4kdXBkYXRlQW5ub3RhdGlvbnMpLHRoaXMuc2Vzc2lvbj1lLGUmJmUub24oImNoYW5nZSIsdGhpcy4kdXBkYXRlQW5ub3RhdGlvbnMpfSx0aGlzLmFkZEd1dHRlckRlY29yYXRpb249ZnVuY3Rpb24oZSx0KXt3aW5kb3cuY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oImRlcHJlY2F0ZWQgdXNlIHNlc3Npb24uYWRkR3V0dGVyRGVjb3JhdGlvbiIpLHRoaXMuc2Vzc2lvbi5hZGRHdXR0ZXJEZWNvcmF0aW9uKGUsdCl9LHRoaXMucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbj1mdW5jdGlvbihlLHQpe3dpbmRvdy5jb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybigiZGVwcmVjYXRlZCB1c2Ugc2Vzc2lvbi5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uIiksdGhpcy5zZXNzaW9uLnJlbW92ZUd1dHRlckRlY29yYXRpb24oZSx0KX0sdGhpcy5zZXRBbm5vdGF0aW9ucz1mdW5jdGlvbihlKXt0aGlzLiRhbm5vdGF0aW9ucz1bXTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZVt0XSxyPW4ucm93LGk9dGhpcy4kYW5ub3RhdGlvbnNbcl07aXx8KGk9dGhpcy4kYW5ub3RhdGlvbnNbcl09e3RleHQ6W119KTt2YXIgbz1uLnRleHQ7bz1vP3MuZXNjYXBlSFRNTChvKTpuLmh0bWx8fCIiLGkudGV4dC5pbmRleE9mKG8pPT09LTEmJmkudGV4dC5wdXNoKG8pO3ZhciB1PW4udHlwZTt1PT0iZXJyb3IiP2kuY2xhc3NOYW1lPSIgYWNlX2Vycm9yIjp1PT0id2FybmluZyImJmkuY2xhc3NOYW1lIT0iIGFjZV9lcnJvciI/aS5jbGFzc05hbWU9IiBhY2Vfd2FybmluZyI6dT09ImluZm8iJiYhaS5jbGFzc05hbWUmJihpLmNsYXNzTmFtZT0iIGFjZV9pbmZvIil9fSx0aGlzLiR1cGRhdGVBbm5vdGF0aW9ucz1mdW5jdGlvbihlKXtpZighdGhpcy4kYW5ub3RhdGlvbnMubGVuZ3RoKXJldHVybjt2YXIgdD1lLnN0YXJ0LnJvdyxuPWUuZW5kLnJvdy10O2lmKG4hPT0wKWlmKGUuYWN0aW9uPT0icmVtb3ZlIil0aGlzLiRhbm5vdGF0aW9ucy5zcGxpY2UodCxuKzEsbnVsbCk7ZWxzZXt2YXIgcj1uZXcgQXJyYXkobisxKTtyLnVuc2hpZnQodCwxKSx0aGlzLiRhbm5vdGF0aW9ucy5zcGxpY2UuYXBwbHkodGhpcy4kYW5ub3RhdGlvbnMscil9fSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLmNvbmZpZz1lO3ZhciB0PXRoaXMuc2Vzc2lvbixuPWUuZmlyc3RSb3cscj1NYXRoLm1pbihlLmxhc3RSb3crZS5ndXR0ZXJPZmZzZXQsdC5nZXRMZW5ndGgoKS0xKTt0aGlzLm9sZExhc3RSb3c9cix0aGlzLmNvbmZpZz1lLHRoaXMuJGxpbmVzLm1vdmVDb250YWluZXIoZSksdGhpcy4kdXBkYXRlQ3Vyc29yUm93KCk7dmFyIGk9dC5nZXROZXh0Rm9sZExpbmUobikscz1pP2kuc3RhcnQucm93OkluZmluaXR5LG89bnVsbCx1PS0xLGE9bjtmb3IoOzspe2E+cyYmKGE9aS5lbmQucm93KzEsaT10LmdldE5leHRGb2xkTGluZShhLGkpLHM9aT9pLnN0YXJ0LnJvdzpJbmZpbml0eSk7aWYoYT5yKXt3aGlsZSh0aGlzLiRsaW5lcy5nZXRMZW5ndGgoKT51KzEpdGhpcy4kbGluZXMucG9wKCk7YnJlYWt9bz10aGlzLiRsaW5lcy5nZXQoKyt1KSxvP28ucm93PWE6KG89dGhpcy4kbGluZXMuY3JlYXRlQ2VsbChhLGUsdGhpcy5zZXNzaW9uLGYpLHRoaXMuJGxpbmVzLnB1c2gobykpLHRoaXMuJHJlbmRlckNlbGwobyxlLGksYSksYSsrfXRoaXMuX3NpZ25hbCgiYWZ0ZXJSZW5kZXIiKSx0aGlzLiR1cGRhdGVHdXR0ZXJXaWR0aChlKX0sdGhpcy4kdXBkYXRlR3V0dGVyV2lkdGg9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uLG49dC5ndXR0ZXJSZW5kZXJlcnx8dGhpcy4kcmVuZGVyZXIscj10LiRmaXJzdExpbmVOdW1iZXIsaT10aGlzLiRsaW5lcy5sYXN0KCk/dGhpcy4kbGluZXMubGFzdCgpLnRleHQ6IiI7aWYodGhpcy4kZml4ZWRXaWR0aHx8dC4kdXNlV3JhcE1vZGUpaT10LmdldExlbmd0aCgpK3ItMTt2YXIgcz1uP24uZ2V0V2lkdGgodCxpLGUpOmkudG9TdHJpbmcoKS5sZW5ndGgqZS5jaGFyYWN0ZXJXaWR0aCxvPXRoaXMuJHBhZGRpbmd8fHRoaXMuJGNvbXB1dGVQYWRkaW5nKCk7cys9by5sZWZ0K28ucmlnaHQscyE9PXRoaXMuZ3V0dGVyV2lkdGgmJiFpc05hTihzKSYmKHRoaXMuZ3V0dGVyV2lkdGg9cyx0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5zdHlsZS53aWR0aD10aGlzLmVsZW1lbnQuc3R5bGUud2lkdGg9TWF0aC5jZWlsKHRoaXMuZ3V0dGVyV2lkdGgpKyJweCIsdGhpcy5fc2lnbmFsKCJjaGFuZ2VHdXR0ZXJXaWR0aCIscykpfSx0aGlzLiR1cGRhdGVDdXJzb3JSb3c9ZnVuY3Rpb24oKXtpZighdGhpcy4kaGlnaGxpZ2h0R3V0dGVyTGluZSlyZXR1cm47dmFyIGU9dGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5nZXRDdXJzb3IoKTtpZih0aGlzLiRjdXJzb3JSb3c9PT1lLnJvdylyZXR1cm47dGhpcy4kY3Vyc29yUm93PWUucm93fSx0aGlzLnVwZGF0ZUxpbmVIaWdobGlnaHQ9ZnVuY3Rpb24oKXtpZighdGhpcy4kaGlnaGxpZ2h0R3V0dGVyTGluZSlyZXR1cm47dmFyIGU9dGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5jdXJzb3Iucm93O3RoaXMuJGN1cnNvclJvdz1lO2lmKHRoaXMuJGN1cnNvckNlbGwmJnRoaXMuJGN1cnNvckNlbGwucm93PT1lKXJldHVybjt0aGlzLiRjdXJzb3JDZWxsJiYodGhpcy4kY3Vyc29yQ2VsbC5lbGVtZW50LmNsYXNzTmFtZT10aGlzLiRjdXJzb3JDZWxsLmVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoImFjZV9ndXR0ZXItYWN0aXZlLWxpbmUgIiwiIikpO3ZhciB0PXRoaXMuJGxpbmVzLmNlbGxzO3RoaXMuJGN1cnNvckNlbGw9bnVsbDtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtpZihyLnJvdz49dGhpcy4kY3Vyc29yUm93KXtpZihyLnJvdz50aGlzLiRjdXJzb3JSb3cpe3ZhciBpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkTGluZSh0aGlzLiRjdXJzb3JSb3cpO2lmKCEobj4wJiZpJiZpLnN0YXJ0LnJvdz09dFtuLTFdLnJvdykpYnJlYWs7cj10W24tMV19ci5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX2d1dHRlci1hY3RpdmUtbGluZSAiK3IuZWxlbWVudC5jbGFzc05hbWUsdGhpcy4kY3Vyc29yQ2VsbD1yO2JyZWFrfX19LHRoaXMuc2Nyb2xsTGluZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jb25maWc7dGhpcy5jb25maWc9ZSx0aGlzLiR1cGRhdGVDdXJzb3JSb3coKTtpZih0aGlzLiRsaW5lcy5wYWdlQ2hhbmdlZCh0LGUpKXJldHVybiB0aGlzLnVwZGF0ZShlKTt0aGlzLiRsaW5lcy5tb3ZlQ29udGFpbmVyKGUpO3ZhciBuPU1hdGgubWluKGUubGFzdFJvdytlLmd1dHRlck9mZnNldCx0aGlzLnNlc3Npb24uZ2V0TGVuZ3RoKCktMSkscj10aGlzLm9sZExhc3RSb3c7dGhpcy5vbGRMYXN0Um93PW47aWYoIXR8fHI8ZS5maXJzdFJvdylyZXR1cm4gdGhpcy51cGRhdGUoZSk7aWYobjx0LmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShlKTtpZih0LmZpcnN0Um93PGUuZmlyc3RSb3cpZm9yKHZhciBpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkZWRSb3dDb3VudCh0LmZpcnN0Um93LGUuZmlyc3RSb3ctMSk7aT4wO2ktLSl0aGlzLiRsaW5lcy5zaGlmdCgpO2lmKHI+bilmb3IodmFyIGk9dGhpcy5zZXNzaW9uLmdldEZvbGRlZFJvd0NvdW50KG4rMSxyKTtpPjA7aS0tKXRoaXMuJGxpbmVzLnBvcCgpO2UuZmlyc3RSb3c8dC5maXJzdFJvdyYmdGhpcy4kbGluZXMudW5zaGlmdCh0aGlzLiRyZW5kZXJMaW5lcyhlLGUuZmlyc3RSb3csdC5maXJzdFJvdy0xKSksbj5yJiZ0aGlzLiRsaW5lcy5wdXNoKHRoaXMuJHJlbmRlckxpbmVzKGUscisxLG4pKSx0aGlzLnVwZGF0ZUxpbmVIaWdobGlnaHQoKSx0aGlzLl9zaWduYWwoImFmdGVyUmVuZGVyIiksdGhpcy4kdXBkYXRlR3V0dGVyV2lkdGgoZSl9LHRoaXMuJHJlbmRlckxpbmVzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxpPXQscz10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKGkpLG89cz9zLnN0YXJ0LnJvdzpJbmZpbml0eTtmb3IoOzspe2k+byYmKGk9cy5lbmQucm93KzEscz10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKGkscyksbz1zP3Muc3RhcnQucm93OkluZmluaXR5KTtpZihpPm4pYnJlYWs7dmFyIHU9dGhpcy4kbGluZXMuY3JlYXRlQ2VsbChpLGUsdGhpcy5zZXNzaW9uLGYpO3RoaXMuJHJlbmRlckNlbGwodSxlLHMsaSksci5wdXNoKHUpLGkrK31yZXR1cm4gcn0sdGhpcy4kcmVuZGVyQ2VsbD1mdW5jdGlvbihlLHQsbixpKXt2YXIgcz1lLmVsZW1lbnQsbz10aGlzLnNlc3Npb24sdT1zLmNoaWxkTm9kZXNbMF0sYT1zLmNoaWxkTm9kZXNbMV0sZj1vLiRmaXJzdExpbmVOdW1iZXIsbD1vLiRicmVha3BvaW50cyxjPW8uJGRlY29yYXRpb25zLGg9by5ndXR0ZXJSZW5kZXJlcnx8dGhpcy4kcmVuZGVyZXIscD10aGlzLiRzaG93Rm9sZFdpZGdldHMmJm8uZm9sZFdpZGdldHMsZD1uP24uc3RhcnQucm93Ok51bWJlci5NQVhfVkFMVUUsdj0iYWNlX2d1dHRlci1jZWxsICI7dGhpcy4kaGlnaGxpZ2h0R3V0dGVyTGluZSYmKGk9PXRoaXMuJGN1cnNvclJvd3x8biYmaTx0aGlzLiRjdXJzb3JSb3cmJmk+PWQmJnRoaXMuJGN1cnNvclJvdzw9bi5lbmQucm93KSYmKHYrPSJhY2VfZ3V0dGVyLWFjdGl2ZS1saW5lICIsdGhpcy4kY3Vyc29yQ2VsbCE9ZSYmKHRoaXMuJGN1cnNvckNlbGwmJih0aGlzLiRjdXJzb3JDZWxsLmVsZW1lbnQuY2xhc3NOYW1lPXRoaXMuJGN1cnNvckNlbGwuZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZSgiYWNlX2d1dHRlci1hY3RpdmUtbGluZSAiLCIiKSksdGhpcy4kY3Vyc29yQ2VsbD1lKSksbFtpXSYmKHYrPWxbaV0pLGNbaV0mJih2Kz1jW2ldKSx0aGlzLiRhbm5vdGF0aW9uc1tpXSYmKHYrPXRoaXMuJGFubm90YXRpb25zW2ldLmNsYXNzTmFtZSkscy5jbGFzc05hbWUhPXYmJihzLmNsYXNzTmFtZT12KTtpZihwKXt2YXIgbT1wW2ldO209PW51bGwmJihtPXBbaV09by5nZXRGb2xkV2lkZ2V0KGkpKX1pZihtKXt2YXIgdj0iYWNlX2ZvbGQtd2lkZ2V0IGFjZV8iK207bT09InN0YXJ0IiYmaT09ZCYmaTxuLmVuZC5yb3c/dis9IiBhY2VfY2xvc2VkIjp2Kz0iIGFjZV9vcGVuIixhLmNsYXNzTmFtZSE9diYmKGEuY2xhc3NOYW1lPXYpO3ZhciBnPXQubGluZUhlaWdodCsicHgiO3Iuc2V0U3R5bGUoYS5zdHlsZSwiaGVpZ2h0IixnKSxyLnNldFN0eWxlKGEuc3R5bGUsImRpc3BsYXkiLCJpbmxpbmUtYmxvY2siKX1lbHNlIGEmJnIuc2V0U3R5bGUoYS5zdHlsZSwiZGlzcGxheSIsIm5vbmUiKTt2YXIgeT0oaD9oLmdldFRleHQobyxpKTppK2YpLnRvU3RyaW5nKCk7cmV0dXJuIHkhPT11LmRhdGEmJih1LmRhdGE9eSksci5zZXRTdHlsZShlLmVsZW1lbnQuc3R5bGUsImhlaWdodCIsdGhpcy4kbGluZXMuY29tcHV0ZUxpbmVIZWlnaHQoaSx0LG8pKyJweCIpLHIuc2V0U3R5bGUoZS5lbGVtZW50LnN0eWxlLCJ0b3AiLHRoaXMuJGxpbmVzLmNvbXB1dGVMaW5lVG9wKGksdCxvKSsicHgiKSxlLnRleHQ9eSxlfSx0aGlzLiRmaXhlZFdpZHRoPSExLHRoaXMuJGhpZ2hsaWdodEd1dHRlckxpbmU9ITAsdGhpcy4kcmVuZGVyZXI9IiIsdGhpcy5zZXRIaWdobGlnaHRHdXR0ZXJMaW5lPWZ1bmN0aW9uKGUpe3RoaXMuJGhpZ2hsaWdodEd1dHRlckxpbmU9ZX0sdGhpcy4kc2hvd0xpbmVOdW1iZXJzPSEwLHRoaXMuJHJlbmRlcmVyPSIiLHRoaXMuc2V0U2hvd0xpbmVOdW1iZXJzPWZ1bmN0aW9uKGUpe3RoaXMuJHJlbmRlcmVyPSFlJiZ7Z2V0V2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZ2V0VGV4dDpmdW5jdGlvbigpe3JldHVybiIifX19LHRoaXMuZ2V0U2hvd0xpbmVOdW1iZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNob3dMaW5lTnVtYmVyc30sdGhpcy4kc2hvd0ZvbGRXaWRnZXRzPSEwLHRoaXMuc2V0U2hvd0ZvbGRXaWRnZXRzPWZ1bmN0aW9uKGUpe2U/ci5hZGRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9mb2xkaW5nLWVuYWJsZWQiKTpyLnJlbW92ZUNzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX2ZvbGRpbmctZW5hYmxlZCIpLHRoaXMuJHNob3dGb2xkV2lkZ2V0cz1lLHRoaXMuJHBhZGRpbmc9bnVsbH0sdGhpcy5nZXRTaG93Rm9sZFdpZGdldHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2hvd0ZvbGRXaWRnZXRzfSx0aGlzLiRjb21wdXRlUGFkZGluZz1mdW5jdGlvbigpe2lmKCF0aGlzLmVsZW1lbnQuZmlyc3RDaGlsZClyZXR1cm57bGVmdDowLHJpZ2h0OjB9O3ZhciBlPXIuY29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQuZmlyc3RDaGlsZCk7cmV0dXJuIHRoaXMuJHBhZGRpbmc9e30sdGhpcy4kcGFkZGluZy5sZWZ0PShwYXJzZUludChlLmJvcmRlckxlZnRXaWR0aCl8fDApKyhwYXJzZUludChlLnBhZGRpbmdMZWZ0KXx8MCkrMSx0aGlzLiRwYWRkaW5nLnJpZ2h0PShwYXJzZUludChlLmJvcmRlclJpZ2h0V2lkdGgpfHwwKSsocGFyc2VJbnQoZS5wYWRkaW5nUmlnaHQpfHwwKSx0aGlzLiRwYWRkaW5nfSx0aGlzLmdldFJlZ2lvbj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRwYWRkaW5nfHx0aGlzLiRjb21wdXRlUGFkZGluZygpLG49dGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKGUueDx0LmxlZnQrbi5sZWZ0KXJldHVybiJtYXJrZXJzIjtpZih0aGlzLiRzaG93Rm9sZFdpZGdldHMmJmUueD5uLnJpZ2h0LXQucmlnaHQpcmV0dXJuImZvbGRXaWRnZXRzIn19KS5jYWxsKGEucHJvdG90eXBlKSx0Lkd1dHRlcj1hfSksYWNlLmRlZmluZSgiYWNlL2xheWVyL21hcmtlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9yYW5nZSIpLlJhbmdlLGk9ZSgiLi4vbGliL2RvbSIpLHM9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50PWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX2xheWVyIGFjZV9tYXJrZXItbGF5ZXIiLGUuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KX07KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbixyKXtyZXR1cm4oZT8xOjApfCh0PzI6MCl8KG4/NDowKXwocj84OjApfXRoaXMuJHBhZGRpbmc9MCx0aGlzLnNldFBhZGRpbmc9ZnVuY3Rpb24oZSl7dGhpcy4kcGFkZGluZz1lfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uPWV9LHRoaXMuc2V0TWFya2Vycz1mdW5jdGlvbihlKXt0aGlzLm1hcmtlcnM9ZX0sdGhpcy5lbHQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmkhPS0xJiZ0aGlzLmVsZW1lbnQuY2hpbGROb2Rlc1t0aGlzLmldO24/dGhpcy5pKys6KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKG4pLHRoaXMuaT0tMSksbi5zdHlsZS5jc3NUZXh0PXQsbi5jbGFzc05hbWU9ZX0sdGhpcy51cGRhdGU9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuO3RoaXMuY29uZmlnPWUsdGhpcy5pPTA7dmFyIHQ7Zm9yKHZhciBuIGluIHRoaXMubWFya2Vycyl7dmFyIHI9dGhpcy5tYXJrZXJzW25dO2lmKCFyLnJhbmdlKXtyLnVwZGF0ZSh0LHRoaXMsdGhpcy5zZXNzaW9uLGUpO2NvbnRpbnVlfXZhciBpPXIucmFuZ2UuY2xpcFJvd3MoZS5maXJzdFJvdyxlLmxhc3RSb3cpO2lmKGkuaXNFbXB0eSgpKWNvbnRpbnVlO2k9aS50b1NjcmVlblJhbmdlKHRoaXMuc2Vzc2lvbik7aWYoci5yZW5kZXJlcil7dmFyIHM9dGhpcy4kZ2V0VG9wKGkuc3RhcnQucm93LGUpLG89dGhpcy4kcGFkZGluZytpLnN0YXJ0LmNvbHVtbiplLmNoYXJhY3RlcldpZHRoO3IucmVuZGVyZXIodCxpLG8scyxlKX1lbHNlIHIudHlwZT09ImZ1bGxMaW5lIj90aGlzLmRyYXdGdWxsTGluZU1hcmtlcih0LGksci5jbGF6eixlKTpyLnR5cGU9PSJzY3JlZW5MaW5lIj90aGlzLmRyYXdTY3JlZW5MaW5lTWFya2VyKHQsaSxyLmNsYXp6LGUpOmkuaXNNdWx0aUxpbmUoKT9yLnR5cGU9PSJ0ZXh0Ij90aGlzLmRyYXdUZXh0TWFya2VyKHQsaSxyLmNsYXp6LGUpOnRoaXMuZHJhd011bHRpTGluZU1hcmtlcih0LGksci5jbGF6eixlKTp0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyKHQsaSxyLmNsYXp6KyIgYWNlX3N0YXJ0IisiIGFjZV9icjE1IixlKX1pZih0aGlzLmkhPS0xKXdoaWxlKHRoaXMuaTx0aGlzLmVsZW1lbnQuY2hpbGRFbGVtZW50Q291bnQpdGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudC5sYXN0Q2hpbGQpfSx0aGlzLiRnZXRUb3A9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZS10LmZpcnN0Um93U2NyZWVuKSp0LmxpbmVIZWlnaHR9LHRoaXMuZHJhd1RleHRNYXJrZXI9ZnVuY3Rpb24odCxuLGkscyxvKXt2YXIgdT10aGlzLnNlc3Npb24sYT1uLnN0YXJ0LnJvdyxmPW4uZW5kLnJvdyxsPWEsYz0wLGg9MCxwPXUuZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbihsKSxkPW5ldyByKGwsbi5zdGFydC5jb2x1bW4sbCxoKTtmb3IoO2w8PWY7bCsrKWQuc3RhcnQucm93PWQuZW5kLnJvdz1sLGQuc3RhcnQuY29sdW1uPWw9PWE/bi5zdGFydC5jb2x1bW46dS5nZXRSb3dXcmFwSW5kZW50KGwpLGQuZW5kLmNvbHVtbj1wLGM9aCxoPXAscD1sKzE8Zj91LmdldFNjcmVlbkxhc3RSb3dDb2x1bW4obCsxKTpsPT1mPzA6bi5lbmQuY29sdW1uLHRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXIodCxkLGkrKGw9PWE/IiBhY2Vfc3RhcnQiOiIiKSsiIGFjZV9iciIrZShsPT1hfHxsPT1hKzEmJm4uc3RhcnQuY29sdW1uLGM8aCxoPnAsbD09ZikscyxsPT1mPzA6MSxvKX0sdGhpcy5kcmF3TXVsdGlMaW5lTWFya2VyPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9dGhpcy4kcGFkZGluZyxvPXIubGluZUhlaWdodCx1PXRoaXMuJGdldFRvcCh0LnN0YXJ0LnJvdyxyKSxhPXMrdC5zdGFydC5jb2x1bW4qci5jaGFyYWN0ZXJXaWR0aDtpPWl8fCIiO2lmKHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuaXNCaWRpUm93KHQuc3RhcnQucm93KSl7dmFyIGY9dC5jbG9uZSgpO2YuZW5kLnJvdz1mLnN0YXJ0LnJvdyxmLmVuZC5jb2x1bW49dGhpcy5zZXNzaW9uLmdldExpbmUoZi5zdGFydC5yb3cpLmxlbmd0aCx0aGlzLmRyYXdCaWRpU2luZ2xlTGluZU1hcmtlcihlLGYsbisiIGFjZV9icjEgYWNlX3N0YXJ0IixyLG51bGwsaSl9ZWxzZSB0aGlzLmVsdChuKyIgYWNlX2JyMSBhY2Vfc3RhcnQiLCJoZWlnaHQ6IitvKyJweDsiKyJyaWdodDowOyIrInRvcDoiK3UrInB4O2xlZnQ6IithKyJweDsiKyhpfHwiIikpO2lmKHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuaXNCaWRpUm93KHQuZW5kLnJvdykpe3ZhciBmPXQuY2xvbmUoKTtmLnN0YXJ0LnJvdz1mLmVuZC5yb3csZi5zdGFydC5jb2x1bW49MCx0aGlzLmRyYXdCaWRpU2luZ2xlTGluZU1hcmtlcihlLGYsbisiIGFjZV9icjEyIixyLG51bGwsaSl9ZWxzZXt1PXRoaXMuJGdldFRvcCh0LmVuZC5yb3cscik7dmFyIGw9dC5lbmQuY29sdW1uKnIuY2hhcmFjdGVyV2lkdGg7dGhpcy5lbHQobisiIGFjZV9icjEyIiwiaGVpZ2h0OiIrbysicHg7Iisid2lkdGg6IitsKyJweDsiKyJ0b3A6Iit1KyJweDsiKyJsZWZ0OiIrcysicHg7IisoaXx8IiIpKX1vPSh0LmVuZC5yb3ctdC5zdGFydC5yb3ctMSkqci5saW5lSGVpZ2h0O2lmKG88PTApcmV0dXJuO3U9dGhpcy4kZ2V0VG9wKHQuc3RhcnQucm93KzEscik7dmFyIGM9KHQuc3RhcnQuY29sdW1uPzE6MCl8KHQuZW5kLmNvbHVtbj8wOjgpO3RoaXMuZWx0KG4rKGM/IiBhY2VfYnIiK2M6IiIpLCJoZWlnaHQ6IitvKyJweDsiKyJyaWdodDowOyIrInRvcDoiK3UrInB4OyIrImxlZnQ6IitzKyJweDsiKyhpfHwiIikpfSx0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyPWZ1bmN0aW9uKGUsdCxuLHIsaSxzKXtpZih0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmlzQmlkaVJvdyh0LnN0YXJ0LnJvdykpcmV0dXJuIHRoaXMuZHJhd0JpZGlTaW5nbGVMaW5lTWFya2VyKGUsdCxuLHIsaSxzKTt2YXIgbz1yLmxpbmVIZWlnaHQsdT0odC5lbmQuY29sdW1uKyhpfHwwKS10LnN0YXJ0LmNvbHVtbikqci5jaGFyYWN0ZXJXaWR0aCxhPXRoaXMuJGdldFRvcCh0LnN0YXJ0LnJvdyxyKSxmPXRoaXMuJHBhZGRpbmcrdC5zdGFydC5jb2x1bW4qci5jaGFyYWN0ZXJXaWR0aDt0aGlzLmVsdChuLCJoZWlnaHQ6IitvKyJweDsiKyJ3aWR0aDoiK3UrInB4OyIrInRvcDoiK2ErInB4OyIrImxlZnQ6IitmKyJweDsiKyhzfHwiIikpfSx0aGlzLmRyYXdCaWRpU2luZ2xlTGluZU1hcmtlcj1mdW5jdGlvbihlLHQsbixyLGkscyl7dmFyIG89ci5saW5lSGVpZ2h0LHU9dGhpcy4kZ2V0VG9wKHQuc3RhcnQucm93LHIpLGE9dGhpcy4kcGFkZGluZyxmPXRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuZ2V0U2VsZWN0aW9ucyh0LnN0YXJ0LmNvbHVtbix0LmVuZC5jb2x1bW4pO2YuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzLmVsdChuLCJoZWlnaHQ6IitvKyJweDsiKyJ3aWR0aDoiK2Uud2lkdGgrKGl8fDApKyJweDsiKyJ0b3A6Iit1KyJweDsiKyJsZWZ0OiIrKGErZS5sZWZ0KSsicHg7Iisoc3x8IiIpKX0sdGhpcyl9LHRoaXMuZHJhd0Z1bGxMaW5lTWFya2VyPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9dGhpcy4kZ2V0VG9wKHQuc3RhcnQucm93LHIpLG89ci5saW5lSGVpZ2h0O3Quc3RhcnQucm93IT10LmVuZC5yb3cmJihvKz10aGlzLiRnZXRUb3AodC5lbmQucm93LHIpLXMpLHRoaXMuZWx0KG4sImhlaWdodDoiK28rInB4OyIrInRvcDoiK3MrInB4OyIrImxlZnQ6MDtyaWdodDowOyIrKGl8fCIiKSl9LHRoaXMuZHJhd1NjcmVlbkxpbmVNYXJrZXI9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz10aGlzLiRnZXRUb3AodC5zdGFydC5yb3csciksbz1yLmxpbmVIZWlnaHQ7dGhpcy5lbHQobiwiaGVpZ2h0OiIrbysicHg7IisidG9wOiIrcysicHg7IisibGVmdDowO3JpZ2h0OjA7IisoaXx8IiIpKX19KS5jYWxsKHMucHJvdG90eXBlKSx0Lk1hcmtlcj1zfSksYWNlLmRlZmluZSgiYWNlL2xheWVyL3RleHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xheWVyL2xpbmVzIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvb29wIiksaT1lKCIuLi9saWIvZG9tIikscz1lKCIuLi9saWIvbGFuZyIpLG89ZSgiLi9saW5lcyIpLkxpbmVzLHU9ZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsYT1mdW5jdGlvbihlKXt0aGlzLmRvbT1pLHRoaXMuZWxlbWVudD10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfbGF5ZXIgYWNlX3RleHQtbGF5ZXIiLGUuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KSx0aGlzLiR1cGRhdGVFb2xDaGFyPXRoaXMuJHVwZGF0ZUVvbENoYXIuYmluZCh0aGlzKSx0aGlzLiRsaW5lcz1uZXcgbyh0aGlzLmVsZW1lbnQpfTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLHUpLHRoaXMuRU9GX0NIQVI9Ilx1MDBiNiIsdGhpcy5FT0xfQ0hBUl9MRj0iXHUwMGFjIix0aGlzLkVPTF9DSEFSX0NSTEY9Ilx1MDBhNCIsdGhpcy5FT0xfQ0hBUj10aGlzLkVPTF9DSEFSX0xGLHRoaXMuVEFCX0NIQVI9Ilx1MjAxNCIsdGhpcy5TUEFDRV9DSEFSPSJcdTAwYjciLHRoaXMuJHBhZGRpbmc9MCx0aGlzLk1BWF9MSU5FX0xFTkdUSD0xZTQsdGhpcy4kdXBkYXRlRW9sQ2hhcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbi5kb2MsdD1lLmdldE5ld0xpbmVDaGFyYWN0ZXIoKT09IlxuIiYmZS5nZXROZXdMaW5lTW9kZSgpIT0id2luZG93cyIsbj10P3RoaXMuRU9MX0NIQVJfTEY6dGhpcy5FT0xfQ0hBUl9DUkxGO2lmKHRoaXMuRU9MX0NIQVIhPW4pcmV0dXJuIHRoaXMuRU9MX0NIQVI9biwhMH0sdGhpcy5zZXRQYWRkaW5nPWZ1bmN0aW9uKGUpe3RoaXMuJHBhZGRpbmc9ZSx0aGlzLmVsZW1lbnQuc3R5bGUubWFyZ2luPSIwICIrZSsicHgifSx0aGlzLmdldExpbmVIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZm9udE1ldHJpY3MuJGNoYXJhY3RlclNpemUuaGVpZ2h0fHwwfSx0aGlzLmdldENoYXJhY3RlcldpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZvbnRNZXRyaWNzLiRjaGFyYWN0ZXJTaXplLndpZHRofHwwfSx0aGlzLiRzZXRGb250TWV0cmljcz1mdW5jdGlvbihlKXt0aGlzLiRmb250TWV0cmljcz1lLHRoaXMuJGZvbnRNZXRyaWNzLm9uKCJjaGFuZ2VDaGFyYWN0ZXJTaXplIixmdW5jdGlvbihlKXt0aGlzLl9zaWduYWwoImNoYW5nZUNoYXJhY3RlclNpemUiLGUpfS5iaW5kKHRoaXMpKSx0aGlzLiRwb2xsU2l6ZUNoYW5nZXMoKX0sdGhpcy5jaGVja0ZvclNpemVDaGFuZ2VzPWZ1bmN0aW9uKCl7dGhpcy4kZm9udE1ldHJpY3MuY2hlY2tGb3JTaXplQ2hhbmdlcygpfSx0aGlzLiRwb2xsU2l6ZUNoYW5nZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXI9dGhpcy4kZm9udE1ldHJpY3MuJHBvbGxTaXplQ2hhbmdlcygpfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uPWUsZSYmdGhpcy4kY29tcHV0ZVRhYlN0cmluZygpfSx0aGlzLnNob3dJbnZpc2libGVzPSExLHRoaXMuc2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc2hvd0ludmlzaWJsZXM9PWU/ITE6KHRoaXMuc2hvd0ludmlzaWJsZXM9ZSx0aGlzLiRjb21wdXRlVGFiU3RyaW5nKCksITApfSx0aGlzLmRpc3BsYXlJbmRlbnRHdWlkZXM9ITAsdGhpcy5zZXREaXNwbGF5SW5kZW50R3VpZGVzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRpc3BsYXlJbmRlbnRHdWlkZXM9PWU/ITE6KHRoaXMuZGlzcGxheUluZGVudEd1aWRlcz1lLHRoaXMuJGNvbXB1dGVUYWJTdHJpbmcoKSwhMCl9LHRoaXMuJHRhYlN0cmluZ3M9W10sdGhpcy5vbkNoYW5nZVRhYlNpemU9dGhpcy4kY29tcHV0ZVRhYlN0cmluZz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbi5nZXRUYWJTaXplKCk7dGhpcy50YWJTaXplPWU7dmFyIHQ9dGhpcy4kdGFiU3RyaW5ncz1bMF07Zm9yKHZhciBuPTE7bjxlKzE7bisrKWlmKHRoaXMuc2hvd0ludmlzaWJsZXMpe3ZhciByPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtyLmNsYXNzTmFtZT0iYWNlX2ludmlzaWJsZSBhY2VfaW52aXNpYmxlX3RhYiIsci50ZXh0Q29udGVudD1zLnN0cmluZ1JlcGVhdCh0aGlzLlRBQl9DSEFSLG4pLHQucHVzaChyKX1lbHNlIHQucHVzaCh0aGlzLmRvbS5jcmVhdGVUZXh0Tm9kZShzLnN0cmluZ1JlcGVhdCgiICIsbiksdGhpcy5lbGVtZW50KSk7aWYodGhpcy5kaXNwbGF5SW5kZW50R3VpZGVzKXt0aGlzLiRpbmRlbnRHdWlkZVJlPS9cc1xTfCBcdHxcdCB8XHMkLzt2YXIgaT0iYWNlX2luZGVudC1ndWlkZSIsbz0iIix1PSIiO2lmKHRoaXMuc2hvd0ludmlzaWJsZXMpe2krPSIgYWNlX2ludmlzaWJsZSIsbz0iIGFjZV9pbnZpc2libGVfc3BhY2UiLHU9IiBhY2VfaW52aXNpYmxlX3RhYiI7dmFyIGE9cy5zdHJpbmdSZXBlYXQodGhpcy5TUEFDRV9DSEFSLHRoaXMudGFiU2l6ZSksZj1zLnN0cmluZ1JlcGVhdCh0aGlzLlRBQl9DSEFSLHRoaXMudGFiU2l6ZSl9ZWxzZSB2YXIgYT1zLnN0cmluZ1JlcGVhdCgiICIsdGhpcy50YWJTaXplKSxmPWE7dmFyIHI9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO3IuY2xhc3NOYW1lPWkrbyxyLnRleHRDb250ZW50PWEsdGhpcy4kdGFiU3RyaW5nc1siICJdPXI7dmFyIHI9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO3IuY2xhc3NOYW1lPWkrdSxyLnRleHRDb250ZW50PWYsdGhpcy4kdGFiU3RyaW5nc1siCSJdPXJ9fSx0aGlzLnVwZGF0ZUxpbmVzPWZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLmNvbmZpZy5sYXN0Um93IT1lLmxhc3RSb3d8fHRoaXMuY29uZmlnLmZpcnN0Um93IT1lLmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShlKTt0aGlzLmNvbmZpZz1lO3ZhciByPU1hdGgubWF4KHQsZS5maXJzdFJvdyksaT1NYXRoLm1pbihuLGUubGFzdFJvdykscz10aGlzLmVsZW1lbnQuY2hpbGROb2RlcyxvPTA7Zm9yKHZhciB1PWUuZmlyc3RSb3c7dTxyO3UrKyl7dmFyIGE9dGhpcy5zZXNzaW9uLmdldEZvbGRMaW5lKHUpO2lmKGEpe2lmKGEuY29udGFpbnNSb3cocikpe3I9YS5zdGFydC5yb3c7YnJlYWt9dT1hLmVuZC5yb3d9bysrfXZhciBmPSExLHU9cixhPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUodSksbD1hP2Euc3RhcnQucm93OkluZmluaXR5O2Zvcig7Oyl7dT5sJiYodT1hLmVuZC5yb3crMSxhPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUodSxhKSxsPWE/YS5zdGFydC5yb3c6SW5maW5pdHkpO2lmKHU+aSlicmVhazt2YXIgYz1zW28rK107aWYoYyl7dGhpcy5kb20ucmVtb3ZlQ2hpbGRyZW4oYyksdGhpcy4kcmVuZGVyTGluZShjLHUsdT09bD9hOiExKSxmJiYoYy5zdHlsZS50b3A9dGhpcy4kbGluZXMuY29tcHV0ZUxpbmVUb3AodSxlLHRoaXMuc2Vzc2lvbikrInB4Iik7dmFyIGg9ZS5saW5lSGVpZ2h0KnRoaXMuc2Vzc2lvbi5nZXRSb3dMZW5ndGgodSkrInB4IjtjLnN0eWxlLmhlaWdodCE9aCYmKGY9ITAsYy5zdHlsZS5oZWlnaHQ9aCl9dSsrfWlmKGYpd2hpbGUobzx0aGlzLiRsaW5lcy5jZWxscy5sZW5ndGgpe3ZhciBwPXRoaXMuJGxpbmVzLmNlbGxzW28rK107cC5lbGVtZW50LnN0eWxlLnRvcD10aGlzLiRsaW5lcy5jb21wdXRlTGluZVRvcChwLnJvdyxlLHRoaXMuc2Vzc2lvbikrInB4In19LHRoaXMuc2Nyb2xsTGluZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jb25maWc7dGhpcy5jb25maWc9ZTtpZih0aGlzLiRsaW5lcy5wYWdlQ2hhbmdlZCh0LGUpKXJldHVybiB0aGlzLnVwZGF0ZShlKTt0aGlzLiRsaW5lcy5tb3ZlQ29udGFpbmVyKGUpO3ZhciBuPWUubGFzdFJvdyxyPXQ/dC5sYXN0Um93Oi0xO2lmKCF0fHxyPGUuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGUpO2lmKG48dC5maXJzdFJvdylyZXR1cm4gdGhpcy51cGRhdGUoZSk7aWYoIXR8fHQubGFzdFJvdzxlLmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShlKTtpZihlLmxhc3RSb3c8dC5maXJzdFJvdylyZXR1cm4gdGhpcy51cGRhdGUoZSk7aWYodC5maXJzdFJvdzxlLmZpcnN0Um93KWZvcih2YXIgaT10aGlzLnNlc3Npb24uZ2V0Rm9sZGVkUm93Q291bnQodC5maXJzdFJvdyxlLmZpcnN0Um93LTEpO2k+MDtpLS0pdGhpcy4kbGluZXMuc2hpZnQoKTtpZih0Lmxhc3RSb3c+ZS5sYXN0Um93KWZvcih2YXIgaT10aGlzLnNlc3Npb24uZ2V0Rm9sZGVkUm93Q291bnQoZS5sYXN0Um93KzEsdC5sYXN0Um93KTtpPjA7aS0tKXRoaXMuJGxpbmVzLnBvcCgpO2UuZmlyc3RSb3c8dC5maXJzdFJvdyYmdGhpcy4kbGluZXMudW5zaGlmdCh0aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50KGUsZS5maXJzdFJvdyx0LmZpcnN0Um93LTEpKSxlLmxhc3RSb3c+dC5sYXN0Um93JiZ0aGlzLiRsaW5lcy5wdXNoKHRoaXMuJHJlbmRlckxpbmVzRnJhZ21lbnQoZSx0Lmxhc3RSb3crMSxlLmxhc3RSb3cpKX0sdGhpcy4kcmVuZGVyTGluZXNGcmFnbWVudD1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10scz10LG89dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShzKSx1PW8/by5zdGFydC5yb3c6SW5maW5pdHk7Zm9yKDs7KXtzPnUmJihzPW8uZW5kLnJvdysxLG89dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShzLG8pLHU9bz9vLnN0YXJ0LnJvdzpJbmZpbml0eSk7aWYocz5uKWJyZWFrO3ZhciBhPXRoaXMuJGxpbmVzLmNyZWF0ZUNlbGwocyxlLHRoaXMuc2Vzc2lvbiksZj1hLmVsZW1lbnQ7dGhpcy5kb20ucmVtb3ZlQ2hpbGRyZW4oZiksaS5zZXRTdHlsZShmLnN0eWxlLCJoZWlnaHQiLHRoaXMuJGxpbmVzLmNvbXB1dGVMaW5lSGVpZ2h0KHMsZSx0aGlzLnNlc3Npb24pKyJweCIpLGkuc2V0U3R5bGUoZi5zdHlsZSwidG9wIix0aGlzLiRsaW5lcy5jb21wdXRlTGluZVRvcChzLGUsdGhpcy5zZXNzaW9uKSsicHgiKSx0aGlzLiRyZW5kZXJMaW5lKGYscyxzPT11P286ITEpLHRoaXMuJHVzZUxpbmVHcm91cHMoKT9mLmNsYXNzTmFtZT0iYWNlX2xpbmVfZ3JvdXAiOmYuY2xhc3NOYW1lPSJhY2VfbGluZSIsci5wdXNoKGEpLHMrK31yZXR1cm4gcn0sdGhpcy51cGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy4kbGluZXMubW92ZUNvbnRhaW5lcihlKSx0aGlzLmNvbmZpZz1lO3ZhciB0PWUuZmlyc3RSb3csbj1lLmxhc3RSb3cscj10aGlzLiRsaW5lczt3aGlsZShyLmdldExlbmd0aCgpKXIucG9wKCk7ci5wdXNoKHRoaXMuJHJlbmRlckxpbmVzRnJhZ21lbnQoZSx0LG4pKX0sdGhpcy4kdGV4dFRva2VuPXt0ZXh0OiEwLHJwYXJlbjohMCxscGFyZW46ITB9LHRoaXMuJHJlbmRlclRva2VuPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMsbz0vKFx0KXwoICspfChbXHgwMC1ceDFmXHg4MC1ceGEwXHhhZFx1MTY4MFx1MTgwRVx1MjAwMC1cdTIwMGZcdTIwMjhcdTIwMjlcdTIwMkZcdTIwNUZcdUZFRkZcdUZGRjktXHVGRkZDXSspfChcdTMwMDApfChbXHUxMTAwLVx1MTE1Rlx1MTFBMy1cdTExQTdcdTExRkEtXHUxMUZGXHUyMzI5LVx1MjMyQVx1MkU4MC1cdTJFOTlcdTJFOUItXHUyRUYzXHUyRjAwLVx1MkZENVx1MkZGMC1cdTJGRkJcdTMwMDEtXHUzMDNFXHUzMDQxLVx1MzA5Nlx1MzA5OS1cdTMwRkZcdTMxMDUtXHUzMTJEXHUzMTMxLVx1MzE4RVx1MzE5MC1cdTMxQkFcdTMxQzAtXHUzMUUzXHUzMUYwLVx1MzIxRVx1MzIyMC1cdTMyNDdcdTMyNTAtXHUzMkZFXHUzMzAwLVx1NERCRlx1NEUwMC1cdUE0OENcdUE0OTAtXHVBNEM2XHVBOTYwLVx1QTk3Q1x1QUMwMC1cdUQ3QTNcdUQ3QjAtXHVEN0M2XHVEN0NCLVx1RDdGQlx1RjkwMC1cdUZBRkZcdUZFMTAtXHVGRTE5XHVGRTMwLVx1RkU1Mlx1RkU1NC1cdUZFNjZcdUZFNjgtXHVGRTZCXHVGRjAxLVx1RkY2MFx1RkZFMC1cdUZGRTZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXSkvZyx1PXRoaXMuZG9tLmNyZWF0ZUZyYWdtZW50KHRoaXMuZWxlbWVudCksYSxmPTA7d2hpbGUoYT1vLmV4ZWMocikpe3ZhciBsPWFbMV0sYz1hWzJdLGg9YVszXSxwPWFbNF0sZD1hWzVdO2lmKCFpLnNob3dJbnZpc2libGVzJiZjKWNvbnRpbnVlO3ZhciB2PWYhPWEuaW5kZXg/ci5zbGljZShmLGEuaW5kZXgpOiIiO2Y9YS5pbmRleCthWzBdLmxlbmd0aCx2JiZ1LmFwcGVuZENoaWxkKHRoaXMuZG9tLmNyZWF0ZVRleHROb2RlKHYsdGhpcy5lbGVtZW50KSk7aWYobCl7dmFyIG09aS5zZXNzaW9uLmdldFNjcmVlblRhYlNpemUodCthLmluZGV4KTt1LmFwcGVuZENoaWxkKGkuJHRhYlN0cmluZ3NbbV0uY2xvbmVOb2RlKCEwKSksdCs9bS0xfWVsc2UgaWYoYylpZihpLnNob3dJbnZpc2libGVzKXt2YXIgZz10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7Zy5jbGFzc05hbWU9ImFjZV9pbnZpc2libGUgYWNlX2ludmlzaWJsZV9zcGFjZSIsZy50ZXh0Q29udGVudD1zLnN0cmluZ1JlcGVhdChpLlNQQUNFX0NIQVIsYy5sZW5ndGgpLHUuYXBwZW5kQ2hpbGQoZyl9ZWxzZSB1LmFwcGVuZENoaWxkKHRoaXMuY29tLmNyZWF0ZVRleHROb2RlKGMsdGhpcy5lbGVtZW50KSk7ZWxzZSBpZihoKXt2YXIgZz10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7Zy5jbGFzc05hbWU9ImFjZV9pbnZpc2libGUgYWNlX2ludmlzaWJsZV9zcGFjZSBhY2VfaW52YWxpZCIsZy50ZXh0Q29udGVudD1zLnN0cmluZ1JlcGVhdChpLlNQQUNFX0NIQVIsaC5sZW5ndGgpLHUuYXBwZW5kQ2hpbGQoZyl9ZWxzZSBpZihwKXt0Kz0xO3ZhciBnPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtnLnN0eWxlLndpZHRoPWkuY29uZmlnLmNoYXJhY3RlcldpZHRoKjIrInB4IixnLmNsYXNzTmFtZT1pLnNob3dJbnZpc2libGVzPyJhY2VfY2prIGFjZV9pbnZpc2libGUgYWNlX2ludmlzaWJsZV9zcGFjZSI6ImFjZV9jamsiLGcudGV4dENvbnRlbnQ9aS5zaG93SW52aXNpYmxlcz9pLlNQQUNFX0NIQVI6cCx1LmFwcGVuZENoaWxkKGcpfWVsc2UgaWYoZCl7dCs9MTt2YXIgZz10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7Zy5zdHlsZS53aWR0aD1pLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCoyKyJweCIsZy5jbGFzc05hbWU9ImFjZV9jamsiLGcudGV4dENvbnRlbnQ9ZCx1LmFwcGVuZENoaWxkKGcpfX11LmFwcGVuZENoaWxkKHRoaXMuZG9tLmNyZWF0ZVRleHROb2RlKGY/ci5zbGljZShmKTpyLHRoaXMuZWxlbWVudCkpO2lmKCF0aGlzLiR0ZXh0VG9rZW5bbi50eXBlXSl7dmFyIHk9ImFjZV8iK24udHlwZS5yZXBsYWNlKC9cLi9nLCIgYWNlXyIpLGc9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO24udHlwZT09ImZvbGQiJiYoZy5zdHlsZS53aWR0aD1uLnZhbHVlLmxlbmd0aCp0aGlzLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCsicHgiKSxnLmNsYXNzTmFtZT15LGcuYXBwZW5kQ2hpbGQodSksZS5hcHBlbmRDaGlsZChnKX1lbHNlIGUuYXBwZW5kQ2hpbGQodSk7cmV0dXJuIHQrci5sZW5ndGh9LHRoaXMucmVuZGVySW5kZW50R3VpZGU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQuc2VhcmNoKHRoaXMuJGluZGVudEd1aWRlUmUpO2lmKHI8PTB8fHI+PW4pcmV0dXJuIHQ7aWYodFswXT09IiAiKXtyLT1yJXRoaXMudGFiU2l6ZTt2YXIgaT1yL3RoaXMudGFiU2l6ZTtmb3IodmFyIHM9MDtzPGk7cysrKWUuYXBwZW5kQ2hpbGQodGhpcy4kdGFiU3RyaW5nc1siICJdLmNsb25lTm9kZSghMCkpO3JldHVybiB0LnN1YnN0cihyKX1pZih0WzBdPT0iCSIpe2Zvcih2YXIgcz0wO3M8cjtzKyspZS5hcHBlbmRDaGlsZCh0aGlzLiR0YWJTdHJpbmdzWyIJIl0uY2xvbmVOb2RlKCEwKSk7cmV0dXJuIHQuc3Vic3RyKHIpfXJldHVybiB0fSx0aGlzLiRjcmVhdGVMaW5lRWxlbWVudD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gdC5jbGFzc05hbWU9ImFjZV9saW5lIix0LnN0eWxlLmhlaWdodD10aGlzLmNvbmZpZy5saW5lSGVpZ2h0KyJweCIsdH0sdGhpcy4kcmVuZGVyV3JhcHBlZExpbmU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPTAsaT0wLG89blswXSx1PTAsYT10aGlzLiRjcmVhdGVMaW5lRWxlbWVudCgpO2UuYXBwZW5kQ2hpbGQoYSk7Zm9yKHZhciBmPTA7Zjx0Lmxlbmd0aDtmKyspe3ZhciBsPXRbZl0sYz1sLnZhbHVlO2lmKGY9PTAmJnRoaXMuZGlzcGxheUluZGVudEd1aWRlcyl7cj1jLmxlbmd0aCxjPXRoaXMucmVuZGVySW5kZW50R3VpZGUoYSxjLG8pO2lmKCFjKWNvbnRpbnVlO3ItPWMubGVuZ3RofWlmKHIrYy5sZW5ndGg8byl1PXRoaXMuJHJlbmRlclRva2VuKGEsdSxsLGMpLHIrPWMubGVuZ3RoO2Vsc2V7d2hpbGUocitjLmxlbmd0aD49byl1PXRoaXMuJHJlbmRlclRva2VuKGEsdSxsLGMuc3Vic3RyaW5nKDAsby1yKSksYz1jLnN1YnN0cmluZyhvLXIpLHI9byxhPXRoaXMuJGNyZWF0ZUxpbmVFbGVtZW50KCksZS5hcHBlbmRDaGlsZChhKSxhLmFwcGVuZENoaWxkKHRoaXMuZG9tLmNyZWF0ZVRleHROb2RlKHMuc3RyaW5nUmVwZWF0KCJcdTAwYTAiLG4uaW5kZW50KSx0aGlzLmVsZW1lbnQpKSxpKyssdT0wLG89bltpXXx8TnVtYmVyLk1BWF9WQUxVRTtjLmxlbmd0aCE9MCYmKHIrPWMubGVuZ3RoLHU9dGhpcy4kcmVuZGVyVG9rZW4oYSx1LGwsYykpfX1uW24ubGVuZ3RoLTFdPnRoaXMuTUFYX0xJTkVfTEVOR1RIJiZ0aGlzLiRyZW5kZXJPdmVyZmxvd01lc3NhZ2UoYSx1LG51bGwsIiIsITApfSx0aGlzLiRyZW5kZXJTaW1wbGVMaW5lPWZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPXRbMF0saT1yLnZhbHVlO3RoaXMuZGlzcGxheUluZGVudEd1aWRlcyYmKGk9dGhpcy5yZW5kZXJJbmRlbnRHdWlkZShlLGkpKSxpJiYobj10aGlzLiRyZW5kZXJUb2tlbihlLG4scixpKSk7Zm9yKHZhciBzPTE7czx0Lmxlbmd0aDtzKyspe3I9dFtzXSxpPXIudmFsdWU7aWYobitpLmxlbmd0aD50aGlzLk1BWF9MSU5FX0xFTkdUSClyZXR1cm4gdGhpcy4kcmVuZGVyT3ZlcmZsb3dNZXNzYWdlKGUsbixyLGkpO249dGhpcy4kcmVuZGVyVG9rZW4oZSxuLHIsaSl9fSx0aGlzLiRyZW5kZXJPdmVyZmxvd01lc3NhZ2U9ZnVuY3Rpb24oZSx0LG4scixpKXtuJiZ0aGlzLiRyZW5kZXJUb2tlbihlLHQsbixyLnNsaWNlKDAsdGhpcy5NQVhfTElORV9MRU5HVEgtdCkpO3ZhciBzPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtzLmNsYXNzTmFtZT0iYWNlX2lubGluZV9idXR0b24gYWNlX2tleXdvcmQgYWNlX3RvZ2dsZV93cmFwIixzLnRleHRDb250ZW50PWk/IjxoaWRlPiI6IjxjbGljayB0byBzZWUgbW9yZS4uLj4iLGUuYXBwZW5kQ2hpbGQocyl9LHRoaXMuJHJlbmRlckxpbmU9ZnVuY3Rpb24oZSx0LG4peyFuJiZuIT0wJiYobj10aGlzLnNlc3Npb24uZ2V0Rm9sZExpbmUodCkpO2lmKG4pdmFyIHI9dGhpcy4kZ2V0Rm9sZExpbmVUb2tlbnModCxuKTtlbHNlIHZhciByPXRoaXMuc2Vzc2lvbi5nZXRUb2tlbnModCk7dmFyIGk9ZTtpZihyLmxlbmd0aCl7dmFyIHM9dGhpcy5zZXNzaW9uLmdldFJvd1NwbGl0RGF0YSh0KTtpZihzJiZzLmxlbmd0aCl7dGhpcy4kcmVuZGVyV3JhcHBlZExpbmUoZSxyLHMpO3ZhciBpPWUubGFzdENoaWxkfWVsc2V7dmFyIGk9ZTt0aGlzLiR1c2VMaW5lR3JvdXBzKCkmJihpPXRoaXMuJGNyZWF0ZUxpbmVFbGVtZW50KCksZS5hcHBlbmRDaGlsZChpKSksdGhpcy4kcmVuZGVyU2ltcGxlTGluZShpLHIpfX1lbHNlIHRoaXMuJHVzZUxpbmVHcm91cHMoKSYmKGk9dGhpcy4kY3JlYXRlTGluZUVsZW1lbnQoKSxlLmFwcGVuZENoaWxkKGkpKTtpZih0aGlzLnNob3dJbnZpc2libGVzJiZpKXtuJiYodD1uLmVuZC5yb3cpO3ZhciBvPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtvLmNsYXNzTmFtZT0iYWNlX2ludmlzaWJsZSBhY2VfaW52aXNpYmxlX2VvbCIsby50ZXh0Q29udGVudD10PT10aGlzLnNlc3Npb24uZ2V0TGVuZ3RoKCktMT90aGlzLkVPRl9DSEFSOnRoaXMuRU9MX0NIQVIsaS5hcHBlbmRDaGlsZChvKX19LHRoaXMuJGdldEZvbGRMaW5lVG9rZW5zPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gaShlLHQsbil7dmFyIGk9MCxzPTA7d2hpbGUocytlW2ldLnZhbHVlLmxlbmd0aDx0KXtzKz1lW2ldLnZhbHVlLmxlbmd0aCxpKys7aWYoaT09ZS5sZW5ndGgpcmV0dXJufWlmKHMhPXQpe3ZhciBvPWVbaV0udmFsdWUuc3Vic3RyaW5nKHQtcyk7by5sZW5ndGg+bi10JiYobz1vLnN1YnN0cmluZygwLG4tdCkpLHIucHVzaCh7dHlwZTplW2ldLnR5cGUsdmFsdWU6b30pLHM9dCtvLmxlbmd0aCxpKz0xfXdoaWxlKHM8biYmaTxlLmxlbmd0aCl7dmFyIG89ZVtpXS52YWx1ZTtvLmxlbmd0aCtzPm4/ci5wdXNoKHt0eXBlOmVbaV0udHlwZSx2YWx1ZTpvLnN1YnN0cmluZygwLG4tcyl9KTpyLnB1c2goZVtpXSkscys9by5sZW5ndGgsaSs9MX19dmFyIG49dGhpcy5zZXNzaW9uLHI9W10scz1uLmdldFRva2VucyhlKTtyZXR1cm4gdC53YWxrKGZ1bmN0aW9uKGUsdCxvLHUsYSl7ZSE9bnVsbD9yLnB1c2goe3R5cGU6ImZvbGQiLHZhbHVlOmV9KTooYSYmKHM9bi5nZXRUb2tlbnModCkpLHMubGVuZ3RoJiZpKHMsdSxvKSl9LHQuZW5kLnJvdyx0aGlzLnNlc3Npb24uZ2V0TGluZSh0LmVuZC5yb3cpLmxlbmd0aCkscn0sdGhpcy4kdXNlTGluZUdyb3Vwcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0VXNlV3JhcE1vZGUoKX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7fX0pLmNhbGwoYS5wcm90b3R5cGUpLHQuVGV4dD1hfSksYWNlLmRlZmluZSgiYWNlL2xheWVyL2N1cnNvciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvZG9tIiksaT1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQ9ci5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfbGF5ZXIgYWNlX2N1cnNvci1sYXllciIsZS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpLHRoaXMuaXNWaXNpYmxlPSExLHRoaXMuaXNCbGlua2luZz0hMCx0aGlzLmJsaW5rSW50ZXJ2YWw9MWUzLHRoaXMuc21vb3RoQmxpbmtpbmc9ITEsdGhpcy5jdXJzb3JzPVtdLHRoaXMuY3Vyc29yPXRoaXMuYWRkQ3Vyc29yKCksci5hZGRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9oaWRkZW4tY3Vyc29ycyIpLHRoaXMuJHVwZGF0ZUN1cnNvcnM9dGhpcy4kdXBkYXRlT3BhY2l0eS5iaW5kKHRoaXMpfTsoZnVuY3Rpb24oKXt0aGlzLiR1cGRhdGVPcGFjaXR5PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY3Vyc29ycztmb3IodmFyIG49dC5sZW5ndGg7bi0tOylyLnNldFN0eWxlKHRbbl0uc3R5bGUsIm9wYWNpdHkiLGU/IiI6IjAiKX0sdGhpcy4kc3RhcnRDc3NBbmltYXRpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmN1cnNvcnM7Zm9yKHZhciB0PWUubGVuZ3RoO3QtLTspZVt0XS5zdHlsZS5hbmltYXRpb25EdXJhdGlvbj10aGlzLmJsaW5rSW50ZXJ2YWwrIm1zIjtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5hZGRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9hbmltYXRlLWJsaW5raW5nIil9LmJpbmQodGhpcykpfSx0aGlzLiRzdG9wQ3NzQW5pbWF0aW9uPWZ1bmN0aW9uKCl7ci5yZW1vdmVDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9hbmltYXRlLWJsaW5raW5nIil9LHRoaXMuJHBhZGRpbmc9MCx0aGlzLnNldFBhZGRpbmc9ZnVuY3Rpb24oZSl7dGhpcy4kcGFkZGluZz1lfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uPWV9LHRoaXMuc2V0Qmxpbmtpbmc9ZnVuY3Rpb24oZSl7ZSE9dGhpcy5pc0JsaW5raW5nJiYodGhpcy5pc0JsaW5raW5nPWUsdGhpcy5yZXN0YXJ0VGltZXIoKSl9LHRoaXMuc2V0QmxpbmtJbnRlcnZhbD1mdW5jdGlvbihlKXtlIT10aGlzLmJsaW5rSW50ZXJ2YWwmJih0aGlzLmJsaW5rSW50ZXJ2YWw9ZSx0aGlzLnJlc3RhcnRUaW1lcigpKX0sdGhpcy5zZXRTbW9vdGhCbGlua2luZz1mdW5jdGlvbihlKXtlIT10aGlzLnNtb290aEJsaW5raW5nJiYodGhpcy5zbW9vdGhCbGlua2luZz1lLHIuc2V0Q3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2Vfc21vb3RoLWJsaW5raW5nIixlKSx0aGlzLiR1cGRhdGVDdXJzb3JzKCEwKSx0aGlzLnJlc3RhcnRUaW1lcigpKX0sdGhpcy5hZGRDdXJzb3I9ZnVuY3Rpb24oKXt2YXIgZT1yLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBlLmNsYXNzTmFtZT0iYWNlX2N1cnNvciIsdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGUpLHRoaXMuY3Vyc29ycy5wdXNoKGUpLGV9LHRoaXMucmVtb3ZlQ3Vyc29yPWZ1bmN0aW9uKCl7aWYodGhpcy5jdXJzb3JzLmxlbmd0aD4xKXt2YXIgZT10aGlzLmN1cnNvcnMucG9wKCk7cmV0dXJuIGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxlfX0sdGhpcy5oaWRlQ3Vyc29yPWZ1bmN0aW9uKCl7dGhpcy5pc1Zpc2libGU9ITEsci5hZGRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9oaWRkZW4tY3Vyc29ycyIpLHRoaXMucmVzdGFydFRpbWVyKCl9LHRoaXMuc2hvd0N1cnNvcj1mdW5jdGlvbigpe3RoaXMuaXNWaXNpYmxlPSEwLHIucmVtb3ZlQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfaGlkZGVuLWN1cnNvcnMiKSx0aGlzLnJlc3RhcnRUaW1lcigpfSx0aGlzLnJlc3RhcnRUaW1lcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJHVwZGF0ZUN1cnNvcnM7Y2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpLGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCksdGhpcy4kc3RvcENzc0FuaW1hdGlvbigpLHRoaXMuc21vb3RoQmxpbmtpbmcmJnIucmVtb3ZlQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2Vfc21vb3RoLWJsaW5raW5nIiksZSghMCk7aWYoIXRoaXMuaXNCbGlua2luZ3x8IXRoaXMuYmxpbmtJbnRlcnZhbHx8IXRoaXMuaXNWaXNpYmxlKXt0aGlzLiRzdG9wQ3NzQW5pbWF0aW9uKCk7cmV0dXJufXRoaXMuc21vb3RoQmxpbmtpbmcmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmFkZENzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX3Ntb290aC1ibGlua2luZyIpfS5iaW5kKHRoaXMpKTtpZihyLkhBU19DU1NfQU5JTUFUSU9OKXRoaXMuJHN0YXJ0Q3NzQW5pbWF0aW9uKCk7ZWxzZXt2YXIgdD1mdW5jdGlvbigpe3RoaXMudGltZW91dElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCExKX0sLjYqdGhpcy5ibGlua0ludGVydmFsKX0uYmluZCh0aGlzKTt0aGlzLmludGVydmFsSWQ9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtlKCEwKSx0KCl9LHRoaXMuYmxpbmtJbnRlcnZhbCksdCgpfX0sdGhpcy5nZXRQaXhlbFBvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuY29uZmlnfHwhdGhpcy5zZXNzaW9uKXJldHVybntsZWZ0OjAsdG9wOjB9O2V8fChlPXRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCkpO3ZhciBuPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oZSkscj10aGlzLiRwYWRkaW5nKyh0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmlzQmlkaVJvdyhuLnJvdyxlLnJvdyk/dGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5nZXRQb3NMZWZ0KG4uY29sdW1uKTpuLmNvbHVtbip0aGlzLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCksaT0obi5yb3ctKHQ/dGhpcy5jb25maWcuZmlyc3RSb3dTY3JlZW46MCkpKnRoaXMuY29uZmlnLmxpbmVIZWlnaHQ7cmV0dXJue2xlZnQ6cix0b3A6aX19LHRoaXMuaXNDdXJzb3JJblZpZXc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS50b3A+PTAmJmUudG9wPHQubWF4SGVpZ2h0fSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLmNvbmZpZz1lO3ZhciB0PXRoaXMuc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2VycyxuPTAsaT0wO2lmKHQ9PT11bmRlZmluZWR8fHQubGVuZ3RoPT09MCl0PVt7Y3Vyc29yOm51bGx9XTtmb3IodmFyIG49MCxzPXQubGVuZ3RoO248cztuKyspe3ZhciBvPXRoaXMuZ2V0UGl4ZWxQb3NpdGlvbih0W25dLmN1cnNvciwhMCk7aWYoKG8udG9wPmUuaGVpZ2h0K2Uub2Zmc2V0fHxvLnRvcDwwKSYmbj4xKWNvbnRpbnVlO3ZhciB1PXRoaXMuY3Vyc29yc1tpKytdfHx0aGlzLmFkZEN1cnNvcigpLGE9dS5zdHlsZTt0aGlzLmRyYXdDdXJzb3I/dGhpcy5kcmF3Q3Vyc29yKHUsbyxlLHRbbl0sdGhpcy5zZXNzaW9uKTp0aGlzLmlzQ3Vyc29ySW5WaWV3KG8sZSk/KHIuc2V0U3R5bGUoYSwiZGlzcGxheSIsImJsb2NrIiksci50cmFuc2xhdGUodSxvLmxlZnQsby50b3ApLHIuc2V0U3R5bGUoYSwid2lkdGgiLE1hdGgucm91bmQoZS5jaGFyYWN0ZXJXaWR0aCkrInB4Iiksci5zZXRTdHlsZShhLCJoZWlnaHQiLGUubGluZUhlaWdodCsicHgiKSk6ci5zZXRTdHlsZShhLCJkaXNwbGF5Iiwibm9uZSIpfXdoaWxlKHRoaXMuY3Vyc29ycy5sZW5ndGg+aSl0aGlzLnJlbW92ZUN1cnNvcigpO3ZhciBmPXRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKTt0aGlzLiRzZXRPdmVyd3JpdGUoZiksdGhpcy4kcGl4ZWxQb3M9byx0aGlzLnJlc3RhcnRUaW1lcigpfSx0aGlzLmRyYXdDdXJzb3I9bnVsbCx0aGlzLiRzZXRPdmVyd3JpdGU9ZnVuY3Rpb24oZSl7ZSE9dGhpcy5vdmVyd3JpdGUmJih0aGlzLm92ZXJ3cml0ZT1lLGU/ci5hZGRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9vdmVyd3JpdGUtY3Vyc29ycyIpOnIucmVtb3ZlQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2Vfb3ZlcndyaXRlLWN1cnNvcnMiKSl9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElkKSxjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpfX0pLmNhbGwoaS5wcm90b3R5cGUpLHQuQ3Vyc29yPWl9KSxhY2UuZGVmaW5lKCJhY2Uvc2Nyb2xsYmFyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvZG9tIikscz1lKCIuL2xpYi9ldmVudCIpLG89ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcix1PTMyNzY4LGE9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50PWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX3Njcm9sbGJhciBhY2Vfc2Nyb2xsYmFyIit0aGlzLmNsYXNzU3VmZml4LHRoaXMuaW5uZXI9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmlubmVyLmNsYXNzTmFtZT0iYWNlX3Njcm9sbGJhci1pbm5lciIsdGhpcy5pbm5lci50ZXh0Q29udGVudD0iXHUwMGEwIix0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5pbm5lciksZS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpLHRoaXMuc2V0VmlzaWJsZSghMSksdGhpcy5za2lwRXZlbnQ9ITEscy5hZGRMaXN0ZW5lcih0aGlzLmVsZW1lbnQsInNjcm9sbCIsdGhpcy5vblNjcm9sbC5iaW5kKHRoaXMpKSxzLmFkZExpc3RlbmVyKHRoaXMuZWxlbWVudCwibW91c2Vkb3duIixzLnByZXZlbnREZWZhdWx0KX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxvKSx0aGlzLnNldFZpc2libGU9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXk9ZT8iIjoibm9uZSIsdGhpcy5pc1Zpc2libGU9ZSx0aGlzLmNvZWZmPTF9fSkuY2FsbChhLnByb3RvdHlwZSk7dmFyIGY9ZnVuY3Rpb24oZSx0KXthLmNhbGwodGhpcyxlKSx0aGlzLnNjcm9sbFRvcD0wLHRoaXMuc2Nyb2xsSGVpZ2h0PTAsdC4kc2Nyb2xsYmFyV2lkdGg9dGhpcy53aWR0aD1pLnNjcm9sbGJhcldpZHRoKGUub3duZXJEb2N1bWVudCksdGhpcy5pbm5lci5zdHlsZS53aWR0aD10aGlzLmVsZW1lbnQuc3R5bGUud2lkdGg9KHRoaXMud2lkdGh8fDE1KSs1KyJweCIsdGhpcy4kbWluV2lkdGg9MH07ci5pbmhlcml0cyhmLGEpLGZ1bmN0aW9uKCl7dGhpcy5jbGFzc1N1ZmZpeD0iLXYiLHRoaXMub25TY3JvbGw9ZnVuY3Rpb24oKXtpZighdGhpcy5za2lwRXZlbnQpe3RoaXMuc2Nyb2xsVG9wPXRoaXMuZWxlbWVudC5zY3JvbGxUb3A7aWYodGhpcy5jb2VmZiE9MSl7dmFyIGU9dGhpcy5lbGVtZW50LmNsaWVudEhlaWdodC90aGlzLnNjcm9sbEhlaWdodDt0aGlzLnNjcm9sbFRvcD10aGlzLnNjcm9sbFRvcCooMS1lKS8odGhpcy5jb2VmZi1lKX10aGlzLl9lbWl0KCJzY3JvbGwiLHtkYXRhOnRoaXMuc2Nyb2xsVG9wfSl9dGhpcy5za2lwRXZlbnQ9ITF9LHRoaXMuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXgodGhpcy5pc1Zpc2libGU/dGhpcy53aWR0aDowLHRoaXMuJG1pbldpZHRofHwwKX0sdGhpcy5zZXRIZWlnaHQ9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodD1lKyJweCJ9LHRoaXMuc2V0SW5uZXJIZWlnaHQ9dGhpcy5zZXRTY3JvbGxIZWlnaHQ9ZnVuY3Rpb24oZSl7dGhpcy5zY3JvbGxIZWlnaHQ9ZSxlPnU/KHRoaXMuY29lZmY9dS9lLGU9dSk6dGhpcy5jb2VmZiE9MSYmKHRoaXMuY29lZmY9MSksdGhpcy5pbm5lci5zdHlsZS5oZWlnaHQ9ZSsicHgifSx0aGlzLnNldFNjcm9sbFRvcD1mdW5jdGlvbihlKXt0aGlzLnNjcm9sbFRvcCE9ZSYmKHRoaXMuc2tpcEV2ZW50PSEwLHRoaXMuc2Nyb2xsVG9wPWUsdGhpcy5lbGVtZW50LnNjcm9sbFRvcD1lKnRoaXMuY29lZmYpfX0uY2FsbChmLnByb3RvdHlwZSk7dmFyIGw9ZnVuY3Rpb24oZSx0KXthLmNhbGwodGhpcyxlKSx0aGlzLnNjcm9sbExlZnQ9MCx0aGlzLmhlaWdodD10LiRzY3JvbGxiYXJXaWR0aCx0aGlzLmlubmVyLnN0eWxlLmhlaWdodD10aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0PSh0aGlzLmhlaWdodHx8MTUpKzUrInB4In07ci5pbmhlcml0cyhsLGEpLGZ1bmN0aW9uKCl7dGhpcy5jbGFzc1N1ZmZpeD0iLWgiLHRoaXMub25TY3JvbGw9ZnVuY3Rpb24oKXt0aGlzLnNraXBFdmVudHx8KHRoaXMuc2Nyb2xsTGVmdD10aGlzLmVsZW1lbnQuc2Nyb2xsTGVmdCx0aGlzLl9lbWl0KCJzY3JvbGwiLHtkYXRhOnRoaXMuc2Nyb2xsTGVmdH0pKSx0aGlzLnNraXBFdmVudD0hMX0sdGhpcy5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1Zpc2libGU/dGhpcy5oZWlnaHQ6MH0sdGhpcy5zZXRXaWR0aD1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQuc3R5bGUud2lkdGg9ZSsicHgifSx0aGlzLnNldElubmVyV2lkdGg9ZnVuY3Rpb24oZSl7dGhpcy5pbm5lci5zdHlsZS53aWR0aD1lKyJweCJ9LHRoaXMuc2V0U2Nyb2xsV2lkdGg9ZnVuY3Rpb24oZSl7dGhpcy5pbm5lci5zdHlsZS53aWR0aD1lKyJweCJ9LHRoaXMuc2V0U2Nyb2xsTGVmdD1mdW5jdGlvbihlKXt0aGlzLnNjcm9sbExlZnQhPWUmJih0aGlzLnNraXBFdmVudD0hMCx0aGlzLnNjcm9sbExlZnQ9dGhpcy5lbGVtZW50LnNjcm9sbExlZnQ9ZSl9fS5jYWxsKGwucHJvdG90eXBlKSx0LlNjcm9sbEJhcj1mLHQuU2Nyb2xsQmFyVj1mLHQuU2Nyb2xsQmFySD1sLHQuVlNjcm9sbEJhcj1mLHQuSFNjcm9sbEJhcj1sfSksYWNlLmRlZmluZSgiYWNlL3JlbmRlcmxvb3AiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9ldmVudCIpLGk9ZnVuY3Rpb24oZSx0KXt0aGlzLm9uUmVuZGVyPWUsdGhpcy5wZW5kaW5nPSExLHRoaXMuY2hhbmdlcz0wLHRoaXMuJHJlY3Vyc2lvbkxpbWl0PTIsdGhpcy53aW5kb3c9dHx8d2luZG93O3ZhciBuPXRoaXM7dGhpcy5fZmx1c2g9ZnVuY3Rpb24oZSl7bi5wZW5kaW5nPSExO3ZhciB0PW4uY2hhbmdlczt0JiYoci5ibG9ja0lkbGUoMTAwKSxuLmNoYW5nZXM9MCxuLm9uUmVuZGVyKHQpKTtpZihuLmNoYW5nZXMpe2lmKG4uJHJlY3Vyc2lvbkxpbWl0LS08MClyZXR1cm47bi5zY2hlZHVsZSgpfWVsc2Ugbi4kcmVjdXJzaW9uTGltaXQ9Mn19OyhmdW5jdGlvbigpe3RoaXMuc2NoZWR1bGU9ZnVuY3Rpb24oZSl7dGhpcy5jaGFuZ2VzPXRoaXMuY2hhbmdlc3xlLHRoaXMuY2hhbmdlcyYmIXRoaXMucGVuZGluZyYmKHIubmV4dEZyYW1lKHRoaXMuX2ZsdXNoKSx0aGlzLnBlbmRpbmc9ITApfSx0aGlzLmNsZWFyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY2hhbmdlcztyZXR1cm4gdGhpcy5jaGFuZ2VzPTAsdH19KS5jYWxsKGkucHJvdG90eXBlKSx0LlJlbmRlckxvb3A9aX0pLGFjZS5kZWZpbmUoImFjZS9sYXllci9mb250X21ldHJpY3MiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvdXNlcmFnZW50IiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4uL2xpYi9kb20iKSxzPWUoIi4uL2xpYi9sYW5nIiksbz1lKCIuLi9saWIvZXZlbnQiKSx1PWUoIi4uL2xpYi91c2VyYWdlbnQiKSxhPWUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLGY9MjU2LGw9dHlwZW9mIFJlc2l6ZU9ic2VydmVyPT0iZnVuY3Rpb24iLGM9MjAwLGg9dC5Gb250TWV0cmljcz1mdW5jdGlvbihlKXt0aGlzLmVsPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kc2V0TWVhc3VyZU5vZGVTdHlsZXModGhpcy5lbC5zdHlsZSwhMCksdGhpcy4kbWFpbj1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuJHNldE1lYXN1cmVOb2RlU3R5bGVzKHRoaXMuJG1haW4uc3R5bGUpLHRoaXMuJG1lYXN1cmVOb2RlPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kc2V0TWVhc3VyZU5vZGVTdHlsZXModGhpcy4kbWVhc3VyZU5vZGUuc3R5bGUpLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy4kbWFpbiksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLiRtZWFzdXJlTm9kZSksZS5hcHBlbmRDaGlsZCh0aGlzLmVsKSx0aGlzLiRtZWFzdXJlTm9kZS5pbm5lckhUTUw9cy5zdHJpbmdSZXBlYXQoIlgiLGYpLHRoaXMuJGNoYXJhY3RlclNpemU9e3dpZHRoOjAsaGVpZ2h0OjB9LGw/dGhpcy4kYWRkT2JzZXJ2ZXIoKTp0aGlzLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxhKSx0aGlzLiRjaGFyYWN0ZXJTaXplPXt3aWR0aDowLGhlaWdodDowfSx0aGlzLiRzZXRNZWFzdXJlTm9kZVN0eWxlcz1mdW5jdGlvbihlLHQpe2Uud2lkdGg9ZS5oZWlnaHQ9ImF1dG8iLGUubGVmdD1lLnRvcD0iMHB4IixlLnZpc2liaWxpdHk9ImhpZGRlbiIsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUud2hpdGVTcGFjZT0icHJlIix1LmlzSUU8OD9lWyJmb250LWZhbWlseSJdPSJpbmhlcml0IjplLmZvbnQ9ImluaGVyaXQiLGUub3ZlcmZsb3c9dD8iaGlkZGVuIjoidmlzaWJsZSJ9LHRoaXMuY2hlY2tGb3JTaXplQ2hhbmdlcz1mdW5jdGlvbihlKXtlPT09dW5kZWZpbmVkJiYoZT10aGlzLiRtZWFzdXJlU2l6ZXMoKSk7aWYoZSYmKHRoaXMuJGNoYXJhY3RlclNpemUud2lkdGghPT1lLndpZHRofHx0aGlzLiRjaGFyYWN0ZXJTaXplLmhlaWdodCE9PWUuaGVpZ2h0KSl7dGhpcy4kbWVhc3VyZU5vZGUuc3R5bGUuZm9udFdlaWdodD0iYm9sZCI7dmFyIHQ9dGhpcy4kbWVhc3VyZVNpemVzKCk7dGhpcy4kbWVhc3VyZU5vZGUuc3R5bGUuZm9udFdlaWdodD0iIix0aGlzLiRjaGFyYWN0ZXJTaXplPWUsdGhpcy5jaGFyU2l6ZXM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmFsbG93Qm9sZEZvbnRzPXQmJnQud2lkdGg9PT1lLndpZHRoJiZ0LmhlaWdodD09PWUuaGVpZ2h0LHRoaXMuX2VtaXQoImNoYW5nZUNoYXJhY3RlclNpemUiLHtkYXRhOmV9KX19LHRoaXMuJGFkZE9ic2VydmVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiRvYnNlcnZlcj1uZXcgd2luZG93LlJlc2l6ZU9ic2VydmVyKGZ1bmN0aW9uKHQpe3ZhciBuPXRbMF0uY29udGVudFJlY3Q7ZS5jaGVja0ZvclNpemVDaGFuZ2VzKHtoZWlnaHQ6bi5oZWlnaHQsd2lkdGg6bi53aWR0aC9mfSl9KSx0aGlzLiRvYnNlcnZlci5vYnNlcnZlKHRoaXMuJG1lYXN1cmVOb2RlKX0sdGhpcy4kcG9sbFNpemVDaGFuZ2VzPWZ1bmN0aW9uKCl7aWYodGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXJ8fHRoaXMuJG9ic2VydmVyKXJldHVybiB0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lcjt2YXIgZT10aGlzO3JldHVybiB0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lcj1vLm9uSWRsZShmdW5jdGlvbiB0KCl7ZS5jaGVja0ZvclNpemVDaGFuZ2VzKCksby5vbklkbGUodCw1MDApfSw1MDApfSx0aGlzLnNldFBvbGxpbmc9ZnVuY3Rpb24oZSl7ZT90aGlzLiRwb2xsU2l6ZUNoYW5nZXMoKTp0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lciYmKGNsZWFySW50ZXJ2YWwodGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXIpLHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyPTApfSx0aGlzLiRtZWFzdXJlU2l6ZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9e2hlaWdodDooZXx8dGhpcy4kbWVhc3VyZU5vZGUpLmNsaWVudEhlaWdodCx3aWR0aDooZXx8dGhpcy4kbWVhc3VyZU5vZGUpLmNsaWVudFdpZHRoL2Z9O3JldHVybiB0LndpZHRoPT09MHx8dC5oZWlnaHQ9PT0wP251bGw6dH0sdGhpcy4kbWVhc3VyZUNoYXJXaWR0aD1mdW5jdGlvbihlKXt0aGlzLiRtYWluLmlubmVySFRNTD1zLnN0cmluZ1JlcGVhdChlLGYpO3ZhciB0PXRoaXMuJG1haW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHQud2lkdGgvZn0sdGhpcy5nZXRDaGFyYWN0ZXJXaWR0aD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNoYXJTaXplc1tlXTtyZXR1cm4gdD09PXVuZGVmaW5lZCYmKHQ9dGhpcy5jaGFyU2l6ZXNbZV09dGhpcy4kbWVhc3VyZUNoYXJXaWR0aChlKS90aGlzLiRjaGFyYWN0ZXJTaXplLndpZHRoKSx0fSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyKSx0aGlzLiRvYnNlcnZlciYmdGhpcy4kb2JzZXJ2ZXIuZGlzY29ubmVjdCgpLHRoaXMuZWwmJnRoaXMuZWwucGFyZW50Tm9kZSYmdGhpcy5lbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZWwpfSx0aGlzLiRnZXRab29tPWZ1bmN0aW9uIGUodCl7cmV0dXJuIHQ/KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLnpvb218fDEpKmUodC5wYXJlbnRFbGVtZW50KToxfSx0aGlzLiRpbml0VHJhbnNmb3JtTWVhc3VyZU5vZGVzPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm5bImRpdiIse3N0eWxlOiJwb3NpdGlvbjogYWJzb2x1dGU7dG9wOiIrZSsicHg7bGVmdDoiK3QrInB4OyJ9XX07dGhpcy5lbHM9aS5idWlsZERvbShbZSgwLDApLGUoYywwKSxlKDAsYyksZShjLGMpXSx0aGlzLmVsKX0sdGhpcy50cmFuc2Zvcm1Db29yZGluYXRlcz1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHIoZSx0LG4pe3ZhciByPWVbMV0qdFswXS1lWzBdKnRbMV07cmV0dXJuWygtdFsxXSpuWzBdK3RbMF0qblsxXSkvciwoK2VbMV0qblswXS1lWzBdKm5bMV0pL3JdfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm5bZVswXS10WzBdLGVbMV0tdFsxXV19ZnVuY3Rpb24gcyhlLHQpe3JldHVybltlWzBdK3RbMF0sZVsxXSt0WzFdXX1mdW5jdGlvbiBvKGUsdCl7cmV0dXJuW2UqdFswXSxlKnRbMV1dfWZ1bmN0aW9uIHUoZSl7dmFyIHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bdC5sZWZ0LHQudG9wXX1pZihlKXt2YXIgbj10aGlzLiRnZXRab29tKHRoaXMuZWwpO2U9bygxL24sZSl9dGhpcy5lbHN8fHRoaXMuJGluaXRUcmFuc2Zvcm1NZWFzdXJlTm9kZXMoKTt2YXIgYT11KHRoaXMuZWxzWzBdKSxmPXUodGhpcy5lbHNbMV0pLGw9dSh0aGlzLmVsc1syXSksaD11KHRoaXMuZWxzWzNdKSxwPXIoaShoLGYpLGkoaCxsKSxpKHMoZixsKSxzKGgsYSkpKSxkPW8oMStwWzBdLGkoZixhKSksdj1vKDErcFsxXSxpKGwsYSkpO2lmKHQpe3ZhciBtPXQsZz1wWzBdKm1bMF0vYytwWzFdKm1bMV0vYysxLHk9cyhvKG1bMF0sZCksbyhtWzFdLHYpKTtyZXR1cm4gcyhvKDEvZy9jLHkpLGEpfXZhciBiPWkoZSxhKSx3PXIoaShkLG8ocFswXSxiKSksaSh2LG8ocFsxXSxiKSksYik7cmV0dXJuIG8oYyx3KX19KS5jYWxsKGgucHJvdG90eXBlKX0pLGFjZS5kZWZpbmUoImFjZS92aXJ0dWFsX3JlbmRlcmVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9jb25maWciLCJhY2UvbGF5ZXIvZ3V0dGVyIiwiYWNlL2xheWVyL21hcmtlciIsImFjZS9sYXllci90ZXh0IiwiYWNlL2xheWVyL2N1cnNvciIsImFjZS9zY3JvbGxiYXIiLCJhY2Uvc2Nyb2xsYmFyIiwiYWNlL3JlbmRlcmxvb3AiLCJhY2UvbGF5ZXIvZm9udF9tZXRyaWNzIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvZG9tIikscz1lKCIuL2NvbmZpZyIpLG89ZSgiLi9sYXllci9ndXR0ZXIiKS5HdXR0ZXIsdT1lKCIuL2xheWVyL21hcmtlciIpLk1hcmtlcixhPWUoIi4vbGF5ZXIvdGV4dCIpLlRleHQsZj1lKCIuL2xheWVyL2N1cnNvciIpLkN1cnNvcixsPWUoIi4vc2Nyb2xsYmFyIikuSFNjcm9sbEJhcixjPWUoIi4vc2Nyb2xsYmFyIikuVlNjcm9sbEJhcixoPWUoIi4vcmVuZGVybG9vcCIpLlJlbmRlckxvb3AscD1lKCIuL2xheWVyL2ZvbnRfbWV0cmljcyIpLkZvbnRNZXRyaWNzLGQ9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcix2PScuYWNlX2JyMSB7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDt9LmFjZV9icjIge2JvcmRlci10b3AtcmlnaHQtcmFkaXVzICAgOiAzcHg7fS5hY2VfYnIzIHtib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogICAgM3B4O30uYWNlX2JyNCB7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDt9LmFjZV9icjUge2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7fS5hY2VfYnI2IHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyAgIDogM3B4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4O30uYWNlX2JyNyB7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICAgIDNweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDt9LmFjZV9icjgge2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMgOiAzcHg7fS5hY2VfYnI5IHtib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAgM3B4O30uYWNlX2JyMTB7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXMgICA6IDNweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogIDNweDt9LmFjZV9icjExe2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7IGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAgICAzcHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICAzcHg7fS5hY2VfYnIxMntib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAgM3B4O30uYWNlX2JyMTN7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogIDNweDt9LmFjZV9icjE0e2JvcmRlci10b3AtcmlnaHQtcmFkaXVzICAgOiAzcHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICAzcHg7fS5hY2VfYnIxNXtib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogICAgM3B4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAzcHg7fS5hY2VfZWRpdG9yIHtwb3NpdGlvbjogcmVsYXRpdmU7b3ZlcmZsb3c6IGhpZGRlbjtmb250OiAxMnB4L25vcm1hbCBcJ01vbmFjb1wnLCBcJ01lbmxvXCcsIFwnVWJ1bnR1IE1vbm9cJywgXCdDb25zb2xhc1wnLCBcJ3NvdXJjZS1jb2RlLXByb1wnLCBtb25vc3BhY2U7ZGlyZWN0aW9uOiBsdHI7dGV4dC1hbGlnbjogbGVmdDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7fS5hY2Vfc2Nyb2xsZXIge3Bvc2l0aW9uOiBhYnNvbHV0ZTtvdmVyZmxvdzogaGlkZGVuO3RvcDogMDtib3R0b206IDA7YmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDstbXMtdXNlci1zZWxlY3Q6IG5vbmU7LW1vei11c2VyLXNlbGVjdDogbm9uZTstd2Via2l0LXVzZXItc2VsZWN0OiBub25lO3VzZXItc2VsZWN0OiBub25lO2N1cnNvcjogdGV4dDt9LmFjZV9jb250ZW50IHtwb3NpdGlvbjogYWJzb2x1dGU7Ym94LXNpemluZzogYm9yZGVyLWJveDttaW4td2lkdGg6IDEwMCU7Y29udGFpbjogc3R5bGUgc2l6ZSBsYXlvdXQ7fS5hY2VfZHJhZ2dpbmcgLmFjZV9zY3JvbGxlcjpiZWZvcmV7cG9zaXRpb246IGFic29sdXRlO3RvcDogMDtsZWZ0OiAwO3JpZ2h0OiAwO2JvdHRvbTogMDtjb250ZW50OiBcJ1wnO2JhY2tncm91bmQ6IHJnYmEoMjUwLCAyNTAsIDI1MCwgMC4wMSk7ei1pbmRleDogMTAwMDt9LmFjZV9kcmFnZ2luZy5hY2VfZGFyayAuYWNlX3Njcm9sbGVyOmJlZm9yZXtiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDEpO30uYWNlX3NlbGVjdGluZywgLmFjZV9zZWxlY3RpbmcgKiB7Y3Vyc29yOiB0ZXh0ICFpbXBvcnRhbnQ7fS5hY2VfZ3V0dGVyIHtwb3NpdGlvbjogYWJzb2x1dGU7b3ZlcmZsb3cgOiBoaWRkZW47d2lkdGg6IGF1dG87dG9wOiAwO2JvdHRvbTogMDtsZWZ0OiAwO2N1cnNvcjogZGVmYXVsdDt6LWluZGV4OiA0Oy1tcy11c2VyLXNlbGVjdDogbm9uZTstbW96LXVzZXItc2VsZWN0OiBub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7dXNlci1zZWxlY3Q6IG5vbmU7Y29udGFpbjogc3R5bGUgc2l6ZSBsYXlvdXQ7fS5hY2VfZ3V0dGVyLWFjdGl2ZS1saW5lIHtwb3NpdGlvbjogYWJzb2x1dGU7bGVmdDogMDtyaWdodDogMDt9LmFjZV9zY3JvbGxlci5hY2Vfc2Nyb2xsLWxlZnQge2JveC1zaGFkb3c6IDE3cHggMCAxNnB4IC0xNnB4IHJnYmEoMCwgMCwgMCwgMC40KSBpbnNldDt9LmFjZV9ndXR0ZXItY2VsbCB7cG9zaXRpb246IGFic29sdXRlO3RvcDogMDtsZWZ0OiAwO3JpZ2h0OiAwO3BhZGRpbmctbGVmdDogMTlweDtwYWRkaW5nLXJpZ2h0OiA2cHg7YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDt9LmFjZV9ndXR0ZXItY2VsbC5hY2VfZXJyb3Ige2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQk9GQk1WRVgvLy8vLy8vLy9RUnN3RkFiL1VpNHdGQVl3RkFZd0ZBYVdHQWZEUnltek9TSC9QeHN3RkFiL1NpVXdGQVl3RkFiVVBSdmpRaURsbG9nNUhoSGRSeWJzVGkzL1R5djlUaXIrU3lqL1VDMy8vLy9YdXJlYk1CSXdGQWIvUlNIYlB4L2dVemZkd0wza3pNaXZLQkF3RkFiYnZibmhQeDY2Tmhvd0ZBWXdGQWFaSmc4d0ZBYXhLQkRadXJmL1JCNm1NeGIvU0NNd0ZBWXdGQWJ4UUIzK1JCNHdGQWIvUWh5NE9oKzRRaWZiTlJjd0ZBWXdGQVl3RkFiL1FSemROaGd3RkFZd0ZBYmF2N3YvVXk3b2FFNjhNQks1THhMZXdyL3IyTlhld0xzd0ZBYXhKdzR3RkFia1BSeTJQeVl3RkFheEtoTG0xdE13RkFhelBpUXdGQWFVR0FiL1FCcmZPeDNidnJ2L1ZDL21hRTR3RkFiUlBCcTZNUk84UXluZXc4RHAydGpmd2Iwd0ZBYng2ZWp1NStieTZ1bnM0dUg5L2YzNit2ci9Ha0hqQUFBQVluUlNUbE1BR3QrNjRybld1L2JvOGVBQTRJbkgzK0R3b043ajRlTGk0eFA5OU5mZzQrYisvdTlCL2VEczFNRDFtTzcrNFBIZzJNWGEzNDdnN3ZEaXpNTE40ZUcrUHY3aTVldnMvdjc5eXU3UzMvRFY3LzQ5OFl2MjRlSCs0dWZRM096dS92Nyt5MTNzUnF3QUFBRExTVVJCVkhqYVpjL1hEc0ZnR0lCaHREcnNobGl0bWsySXJiSEZxTDJwdlhmLys3OERQb2tqNytGejlxcFUvOVVYSklsaG1QYVRhUTZRUGF6MG1tKzVnd2tnb3ZjVjZHWnpkNUp0Q1F3Z3N4b0hPdkpPMTVrbGVSTEFuTWdIRklFU1VFUG1hd0I5bmdtZWxUdGlwd3dmQVNpbHhPTHlpVjVVVlV5VkFmYkcwY0NQSGlnK0dCa3pBRU5IUzBBc3RWRjZiYWNaSU96Z0xteHNIYnQyT2VjTmdKQzgzSkVSbWVQVVlxOEFSR2tKeDZYdEZzZGRkQlFnWkUyblBSNkNJQ1poYXdqQTRGYi9jaHYrMzk5a2ZSK01NTURHT1FBQUFBQkpSVTVFcmtKZ2dnPT0iKTtiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246IDJweCBjZW50ZXI7fS5hY2VfZ3V0dGVyLWNlbGwuYWNlX3dhcm5pbmcge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQW1WQk1WRVgvLy84QUFBRC8vLzhBQUFBQUFBQlBTemIvNXNBQUFBQi9ibEgvNzN6L3Vsa0FBQUFBQUFEODVwa0FBQUFBQUFBQ0FnUC92R3ovcmtEZXJHYkdyVjcvcGtRSUNBZi8vLy9lMElzQUFBRC9vRUQvcVR2aHJuVUFBQUQveUhEL25qY0FBQUR1djJyL256Ly9vVGovcDA2NG9HZi96SEFBQUFBOU5pci90RklBQUFEL3RsVGl1V2YvdGtJQUFBQ3luWEVBQUFBQUFBQXRJUlc3ekJwQkFBQUFNM1JTVGxNQUFCUjFtN1JYTzhMbjMxWjM2elQrbmVYZTVPem9vUkRmbitUWjRwM2gyaFRmNHQzazN1Y3lyTjFLNStYYWtzNTJTZnM5Q1hnckFBQUFqa2xFUVZSNDJvM1BiUStDSUJRRllFd2JvUGhTWWdvWXVuSXFxTG42L3o4dVlkSDhWbWRudTl2ejRXd1hnTi94VFBSRDIrc2dPY1pqc2dlL3doWFpnVWFZWXZUOFFudUphVXJqckhVUXJlR2N6dUVhZlFDTy9TSlR1ZlRicm9Xc1Bnc2xsVmhxM3dKRWsyalVTelgzQ1VFREpDODQ3MDdkalJjNU1UQVF4b0xndXBXUndXNlVCNWZTKytOVjhBYk9aZ25zQzdCcEVBQUFBQUJKUlU1RXJrSmdnZz09Iik7YmFja2dyb3VuZC1wb3NpdGlvbjogMnB4IGNlbnRlcjt9LmFjZV9ndXR0ZXItY2VsbC5hY2VfaW5mbyB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQUFBQUFBNm1LQzlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQUFKMFVrNVRBQUIyazgwNEFBQUFQa2xFUVZRWTAyTmdJQjY4UXVPM3RpTHpuakF3cEtUZ055RGJNZWd3aXNDSFpVRVRVWlYwWnFPcXVCcFhqMnJ0bnBTSlQxQUVublJtTDJPZ0dnQUFJS2tSUWFwMmh0Z0FBQUFBU1VWT1JLNUNZSUk9Iik7YmFja2dyb3VuZC1wb3NpdGlvbjogMnB4IGNlbnRlcjt9LmFjZV9kYXJrIC5hY2VfZ3V0dGVyLWNlbGwuYWNlX2luZm8ge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQkFNQUFBRHQzZUpTQUFBQUpGQk1WRVVBQUFDaG9hR0FnSUFxS2lxK3ZyNnRyYTFaV1ZtVWxKU2JtNXM4UER4dWJtNTZlbnJkZ3pnM0FBQUFBWFJTVGxNQVFPYllaZ0FBQUNsSlJFRlVlTnBqWU1BUGRzTVlIZWd5SlpGUUJsc1VsTUZWQ1dVWUtrQVpNeFpBR2R4bERNUUJBRytUQlA0QjZSeUpBQUFBQUVsRlRrU3VRbUNDIik7fS5hY2Vfc2Nyb2xsYmFyIHtjb250YWluOiBzdHJpY3Q7cG9zaXRpb246IGFic29sdXRlO3JpZ2h0OiAwO2JvdHRvbTogMDt6LWluZGV4OiA2O30uYWNlX3Njcm9sbGJhci1pbm5lciB7cG9zaXRpb246IGFic29sdXRlO2N1cnNvcjogdGV4dDtsZWZ0OiAwO3RvcDogMDt9LmFjZV9zY3JvbGxiYXItdntvdmVyZmxvdy14OiBoaWRkZW47b3ZlcmZsb3cteTogc2Nyb2xsO3RvcDogMDt9LmFjZV9zY3JvbGxiYXItaCB7b3ZlcmZsb3cteDogc2Nyb2xsO292ZXJmbG93LXk6IGhpZGRlbjtsZWZ0OiAwO30uYWNlX3ByaW50LW1hcmdpbiB7cG9zaXRpb246IGFic29sdXRlO2hlaWdodDogMTAwJTt9LmFjZV90ZXh0LWlucHV0IHtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogMDt3aWR0aDogMC41ZW07aGVpZ2h0OiAxZW07b3BhY2l0eTogMDtiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDstbW96LWFwcGVhcmFuY2U6IG5vbmU7YXBwZWFyYW5jZTogbm9uZTtib3JkZXI6IG5vbmU7cmVzaXplOiBub25lO291dGxpbmU6IG5vbmU7b3ZlcmZsb3c6IGhpZGRlbjtmb250OiBpbmhlcml0O3BhZGRpbmc6IDAgMXB4O21hcmdpbjogMCAtMXB4O2NvbnRhaW46IHN0cmljdDstbXMtdXNlci1zZWxlY3Q6IHRleHQ7LW1vei11c2VyLXNlbGVjdDogdGV4dDstd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0O3VzZXItc2VsZWN0OiB0ZXh0O3doaXRlLXNwYWNlOiBwcmUhaW1wb3J0YW50O30uYWNlX3RleHQtaW5wdXQuYWNlX2NvbXBvc2l0aW9uIHtiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtjb2xvcjogaW5oZXJpdDt6LWluZGV4OiAxMDAwO29wYWNpdHk6IDE7fS5hY2VfY29tcG9zaXRpb25fcGxhY2Vob2xkZXIgeyBjb2xvcjogdHJhbnNwYXJlbnQgfS5hY2VfY29tcG9zaXRpb25fbWFya2VyIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO3Bvc2l0aW9uOiBhYnNvbHV0ZTtib3JkZXItcmFkaXVzOiAwO21hcmdpbi10b3A6IDFweDt9W2FjZV9ub2NvbnRleHQ9dHJ1ZV0ge3RyYW5zZm9ybTogbm9uZSFpbXBvcnRhbnQ7ZmlsdGVyOiBub25lIWltcG9ydGFudDtwZXJzcGVjdGl2ZTogbm9uZSFpbXBvcnRhbnQ7Y2xpcC1wYXRoOiBub25lIWltcG9ydGFudDttYXNrIDogbm9uZSFpbXBvcnRhbnQ7Y29udGFpbjogbm9uZSFpbXBvcnRhbnQ7cGVyc3BlY3RpdmU6IG5vbmUhaW1wb3J0YW50O21peC1ibGVuZC1tb2RlOiBpbml0aWFsIWltcG9ydGFudDt6LWluZGV4OiBhdXRvO30uYWNlX2xheWVyIHt6LWluZGV4OiAxO3Bvc2l0aW9uOiBhYnNvbHV0ZTtvdmVyZmxvdzogaGlkZGVuO3dvcmQtd3JhcDogbm9ybWFsO3doaXRlLXNwYWNlOiBwcmU7aGVpZ2h0OiAxMDAlO3dpZHRoOiAxMDAlO2JveC1zaXppbmc6IGJvcmRlci1ib3g7cG9pbnRlci1ldmVudHM6IG5vbmU7fS5hY2VfZ3V0dGVyLWxheWVyIHtwb3NpdGlvbjogcmVsYXRpdmU7d2lkdGg6IGF1dG87dGV4dC1hbGlnbjogcmlnaHQ7cG9pbnRlci1ldmVudHM6IGF1dG87aGVpZ2h0OiAxMDAwMDAwcHg7Y29udGFpbjogc3R5bGUgc2l6ZSBsYXlvdXQ7fS5hY2VfdGV4dC1sYXllciB7Zm9udDogaW5oZXJpdCAhaW1wb3J0YW50O3Bvc2l0aW9uOiBhYnNvbHV0ZTtoZWlnaHQ6IDEwMDAwMDBweDt3aWR0aDogMTAwMDAwMHB4O2NvbnRhaW46IHN0eWxlIHNpemUgbGF5b3V0O30uYWNlX3RleHQtbGF5ZXIgPiAuYWNlX2xpbmUsIC5hY2VfdGV4dC1sYXllciA+IC5hY2VfbGluZV9ncm91cCB7Y29udGFpbjogc3R5bGUgc2l6ZSBsYXlvdXQ7cG9zaXRpb246IGFic29sdXRlO3RvcDogMDtsZWZ0OiAwO3JpZ2h0OiAwO30uYWNlX2hpZHBpIC5hY2VfdGV4dC1sYXllciwuYWNlX2hpZHBpIC5hY2VfZ3V0dGVyLWxheWVyLC5hY2VfaGlkcGkgLmFjZV9jb250ZW50LC5hY2VfaGlkcGkgLmFjZV9ndXR0ZXIge2NvbnRhaW46IHN0cmljdDt3aWxsLWNoYW5nZTogdHJhbnNmb3JtO30uYWNlX2hpZHBpIC5hY2VfdGV4dC1sYXllciA+IC5hY2VfbGluZSwgLmFjZV9oaWRwaSAuYWNlX3RleHQtbGF5ZXIgPiAuYWNlX2xpbmVfZ3JvdXAge2NvbnRhaW46IHN0cmljdDt9LmFjZV9jamsge2Rpc3BsYXk6IGlubGluZS1ibG9jazt0ZXh0LWFsaWduOiBjZW50ZXI7fS5hY2VfY3Vyc29yLWxheWVyIHt6LWluZGV4OiA0O30uYWNlX2N1cnNvciB7ei1pbmRleDogNDtwb3NpdGlvbjogYWJzb2x1dGU7Ym94LXNpemluZzogYm9yZGVyLWJveDtib3JkZXItbGVmdDogMnB4IHNvbGlkO3RyYW5zZm9ybTogdHJhbnNsYXRleigwKTt9LmFjZV9tdWx0aXNlbGVjdCAuYWNlX2N1cnNvciB7Ym9yZGVyLWxlZnQtd2lkdGg6IDFweDt9LmFjZV9zbGltLWN1cnNvcnMgLmFjZV9jdXJzb3Ige2JvcmRlci1sZWZ0LXdpZHRoOiAxcHg7fS5hY2Vfb3ZlcndyaXRlLWN1cnNvcnMgLmFjZV9jdXJzb3Ige2JvcmRlci1sZWZ0LXdpZHRoOiAwO2JvcmRlci1ib3R0b206IDFweCBzb2xpZDt9LmFjZV9oaWRkZW4tY3Vyc29ycyAuYWNlX2N1cnNvciB7b3BhY2l0eTogMC4yO30uYWNlX3Ntb290aC1ibGlua2luZyAuYWNlX2N1cnNvciB7dHJhbnNpdGlvbjogb3BhY2l0eSAwLjE4czt9LmFjZV9hbmltYXRlLWJsaW5raW5nIC5hY2VfY3Vyc29yIHthbmltYXRpb24tZHVyYXRpb246IDEwMDBtczthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBzdGVwLWVuZDthbmltYXRpb24tbmFtZTogYmxpbmstYWNlLWFuaW1hdGU7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7fS5hY2VfYW5pbWF0ZS1ibGlua2luZy5hY2Vfc21vb3RoLWJsaW5raW5nIC5hY2VfY3Vyc29yIHthbmltYXRpb24tZHVyYXRpb246IDEwMDBtczthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluLW91dDthbmltYXRpb24tbmFtZTogYmxpbmstYWNlLWFuaW1hdGUtc21vb3RoO31Aa2V5ZnJhbWVzIGJsaW5rLWFjZS1hbmltYXRlIHtmcm9tLCB0byB7IG9wYWNpdHk6IDE7IH02MCUgeyBvcGFjaXR5OiAwOyB9fUBrZXlmcmFtZXMgYmxpbmstYWNlLWFuaW1hdGUtc21vb3RoIHtmcm9tLCB0byB7IG9wYWNpdHk6IDE7IH00NSUgeyBvcGFjaXR5OiAxOyB9NjAlIHsgb3BhY2l0eTogMDsgfTg1JSB7IG9wYWNpdHk6IDA7IH19LmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwLCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogMzt9LmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiA1O30uYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiA2O30uYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZS1saW5lIHtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogMjt9LmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZC13b3JkIHtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogNDtib3gtc2l6aW5nOiBib3JkZXItYm94O30uYWNlX2xpbmUgLmFjZV9mb2xkIHtib3gtc2l6aW5nOiBib3JkZXItYm94O2Rpc3BsYXk6IGlubGluZS1ibG9jaztoZWlnaHQ6IDExcHg7bWFyZ2luLXRvcDogLTJweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJFQUFBQUpDQVlBQUFEVTZNY01BQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQUpwSlJFRlVlTnBpL1AvL1B3T2xnQVhHWUdSa2xBVlNva0Q4R21qd1kxd2FzS2xqUXBZQUN0cENGZUFEY0hWUWZReU1RQXd6d0FaSTN3Skt2Q0xrZktCYU1TQ2xCbFI3Qk9RaWtDRkdRRUVySUgwVnFrYWJpR0NBcXdVYWRBelpKUnhRci8wZ3dpWElhbDh6UVFQbk5WVGdKMVRkYXdMMFQ1Z0JJUDFNVUpOaEJ2MkhLb1FISGpxTnJBNFdPNHpZMGdseU5LTFQyS0lmSU1BQVFzZGdHaVh2Z25ZQUFBQUFTVVZPUks1Q1lJST0iKSx1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBM0NBWUFBQUROTmlBNUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBQ0pKUkVGVWVOcGkrUC8vZnhnVEF3UERCeER4RDA3OFJTWCtZZUV5REZNQ0lNQUFJM0lObVhpd2YyWUFBQUFBU1VWT1JLNUNZSUk9Iik7YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdCwgcmVwZWF0LXg7YmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlciwgdG9wIGxlZnQ7Y29sb3I6IHRyYW5zcGFyZW50O2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrO2JvcmRlci1yYWRpdXM6IDJweDtjdXJzb3I6IHBvaW50ZXI7cG9pbnRlci1ldmVudHM6IGF1dG87fS5hY2VfZGFyayAuYWNlX2ZvbGQge30uYWNlX2ZvbGQ6aG92ZXJ7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkVBQUFBSkNBWUFBQURVNk1jTUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBSnBKUkVGVWVOcGkvUC8vUHdPbGdBWEdZR1JrbEFWU29rRDhHbWp3WTF3YXNLbGpRcFlBQ3RwQ0ZlQURjSFZRZlF5TVFBd3p3QVpJM3dKS3ZDTGtmS0JhTVNDbEJsUjdCT1Fpa0NGR1FFRXJJSDBWcWthYmlHQ0Fxd1VhZEF6WkpSeFFyLzBnd2lYSWFsOHpRUVBuTlZUZ0oxVGRhd0wwVDVnQklQMU1VSk5oQnYySEtvUUhIanFOckE0V080elkwZ2x5TktMVDJLSWZJTUFBUXNkZ0dpWHZnbllBQUFBQVNVVk9SSzVDWUlJPSIpLHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUEzQ0FZQUFBRE5OaUE1QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFDQkpSRUZVZU5waStQLy9mejRUQXdQRFp4RHhENVg0aTVmTE1Fd0pnQUFEQUVQVkRiak53ODdaQUFBQUFFbEZUa1N1UW1DQyIpO30uYWNlX3Rvb2x0aXAge2JhY2tncm91bmQtY29sb3I6ICNGRkY7YmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgdHJhbnNwYXJlbnQsIHJnYmEoMCwgMCwgMCwgMC4xKSk7Ym9yZGVyOiAxcHggc29saWQgZ3JheTtib3JkZXItcmFkaXVzOiAxcHg7Ym94LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTtjb2xvcjogYmxhY2s7bWF4LXdpZHRoOiAxMDAlO3BhZGRpbmc6IDNweCA0cHg7cG9zaXRpb246IGZpeGVkO3otaW5kZXg6IDk5OTk5OTtib3gtc2l6aW5nOiBib3JkZXItYm94O2N1cnNvcjogZGVmYXVsdDt3aGl0ZS1zcGFjZTogcHJlO3dvcmQtd3JhcDogYnJlYWstd29yZDtsaW5lLWhlaWdodDogbm9ybWFsO2ZvbnQtc3R5bGU6IG5vcm1hbDtmb250LXdlaWdodDogbm9ybWFsO2xldHRlci1zcGFjaW5nOiBub3JtYWw7cG9pbnRlci1ldmVudHM6IG5vbmU7fS5hY2VfZm9sZGluZy1lbmFibGVkID4gLmFjZV9ndXR0ZXItY2VsbCB7cGFkZGluZy1yaWdodDogMTNweDt9LmFjZV9mb2xkLXdpZGdldCB7Ym94LXNpemluZzogYm9yZGVyLWJveDttYXJnaW46IDAgLTEycHggMCAxcHg7ZGlzcGxheTogbm9uZTt3aWR0aDogMTFweDt2ZXJ0aWNhbC1hbGlnbjogdG9wO2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBVUFBQUFGQ0FZQUFBQ05ieWJsQUFBQU5FbEVRVlI0Mm1XS3NRMEFNQXpDOGl4TGxyelFqem1CaUVqcDBBNld3QkNTUGdLQVhvTGtxU290N25OM3lNd1I3cFozMk56cEtrVm9EQlV4S0FBQUFBQkpSVTVFcmtKZ2dnPT0iKTtiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtib3JkZXItcmFkaXVzOiAzcHg7Ym9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7Y3Vyc29yOiBwb2ludGVyO30uYWNlX2ZvbGRpbmctZW5hYmxlZCAuYWNlX2ZvbGQtd2lkZ2V0IHtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7ICAgfS5hY2VfZm9sZC13aWRnZXQuYWNlX2VuZCB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFVQUFBQUZDQVlBQUFDTmJ5YmxBQUFBTkVsRVFWUjQybTNId1FrQU1BaEQwWXpzUmNoRktJN3NBaWtlV2tyeHdTY0VCMG5oNWU3S1RQV2ltWmtpNHRZZlZiWCtNTmw0cHlaWGVqVU8xUUFBQUFCSlJVNUVya0pnZ2c9PSIpO30uYWNlX2ZvbGQtd2lkZ2V0LmFjZV9jbG9zZWQge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBTUFBQUFHQ0FZQUFBQUc1U1FNQUFBQU9VbEVRVlI0MmpYS3dRa0FNQWdEd0t3cUtENEV3UTI2c1NPa1ZXamdJSUhBelBpQ2dhcWlxbkpIWm5LSUNCRVJITjE5NE81Yjl2Ykx1QVZSTCtsMFlXblpBQUFBQUVsRlRrU3VRbUNDWEE9PSIpO30uYWNlX2ZvbGQtd2lkZ2V0OmhvdmVyIHtib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMyk7YmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO2JveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7fS5hY2VfZm9sZC13aWRnZXQ6YWN0aXZlIHtib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNCk7YmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTtib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO30uYWNlX2RhcmsgLmFjZV9mb2xkLXdpZGdldCB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFVQUFBQUZDQVlBQUFDTmJ5YmxBQUFBSGtsRVFWUUlXMlA0Ly84L0F6b0dFUTdvR0NhTExBaFdpU3dCMTQ2QkFRQ1NUUFlvY3FUMEFBQUFBRWxGVGtTdVFtQ0MiKTt9LmFjZV9kYXJrIC5hY2VfZm9sZC13aWRnZXQuYWNlX2VuZCB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFVQUFBQUZDQVlBQUFDTmJ5YmxBQUFBSDBsRVFWUUlXMlA0Ly84L0F4UTd3TmpJQWpETWdDNEF4akNWS0JpcklBQUYwa3oycmxoeHBBQUFBQUJKUlU1RXJrSmdnZz09Iik7fS5hY2VfZGFyayAuYWNlX2ZvbGQtd2lkZ2V0LmFjZV9jbG9zZWQge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBTUFBQUFGQ0FZQUFBQ0FjVmFpQUFBQUhFbEVRVlFJVzJQNC8vKy9BeEF6Z0RBRGxPT0F6bkhBS2dQV0F3QVJqaThVSURUZlFRQUFBQUJKUlU1RXJrSmdnZz09Iik7fS5hY2VfZGFyayAuYWNlX2ZvbGQtd2lkZ2V0OmhvdmVyIHtib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO2JhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTt9LmFjZV9kYXJrIC5hY2VfZm9sZC13aWRnZXQ6YWN0aXZlIHtib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO30uYWNlX2lubGluZV9idXR0b24ge2JvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JheTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bWFyZ2luOiAtMXB4IDhweDtwYWRkaW5nOiAwIDVweDtwb2ludGVyLWV2ZW50czogYXV0bztjdXJzb3I6IHBvaW50ZXI7fS5hY2VfaW5saW5lX2J1dHRvbjpob3ZlciB7Ym9yZGVyLWNvbG9yOiBncmF5O2JhY2tncm91bmQ6IHJnYmEoMjAwLDIwMCwyMDAsMC4yKTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7cG9pbnRlci1ldmVudHM6IGF1dG87fS5hY2VfZm9sZC13aWRnZXQuYWNlX2ludmFsaWQge2JhY2tncm91bmQtY29sb3I6ICNGRkI0QjQ7Ym9yZGVyLWNvbG9yOiAjREU1NTU1O30uYWNlX2ZhZGUtZm9sZC13aWRnZXRzIC5hY2VfZm9sZC13aWRnZXQge3RyYW5zaXRpb246IG9wYWNpdHkgMC40cyBlYXNlIDAuMDVzO29wYWNpdHk6IDA7fS5hY2VfZmFkZS1mb2xkLXdpZGdldHM6aG92ZXIgLmFjZV9mb2xkLXdpZGdldCB7dHJhbnNpdGlvbjogb3BhY2l0eSAwLjA1cyBlYXNlIDAuMDVzO29wYWNpdHk6MTt9LmFjZV91bmRlcmxpbmUge3RleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO30uYWNlX2JvbGQge2ZvbnQtd2VpZ2h0OiBib2xkO30uYWNlX25vYm9sZCAuYWNlX2JvbGQge2ZvbnQtd2VpZ2h0OiBub3JtYWw7fS5hY2VfaXRhbGljIHtmb250LXN0eWxlOiBpdGFsaWM7fS5hY2VfZXJyb3ItbWFya2VyIHtiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMCwgMCwwLjIpO3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiA5O30uYWNlX2hpZ2hsaWdodC1tYXJrZXIge2JhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDAsMC4yKTtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogODt9LmFjZV9tb2JpbGUtbWVudSB7cG9zaXRpb246IGFic29sdXRlO2xpbmUtaGVpZ2h0OiAxLjU7Ym9yZGVyLXJhZGl1czogNHB4Oy1tcy11c2VyLXNlbGVjdDogbm9uZTstbW96LXVzZXItc2VsZWN0OiBub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7dXNlci1zZWxlY3Q6IG5vbmU7YmFja2dyb3VuZDogd2hpdGU7Ym94LXNoYWRvdzogMXB4IDNweCAycHggZ3JleTtib3JkZXI6IDFweCBzb2xpZCAjZGNkY2RjO2NvbG9yOiBibGFjazt9LmFjZV9kYXJrID4gLmFjZV9tb2JpbGUtbWVudSB7YmFja2dyb3VuZDogIzMzMztjb2xvcjogI2NjYztib3gtc2hhZG93OiAxcHggM3B4IDJweCBncmV5O2JvcmRlcjogMXB4IHNvbGlkICM0NDQ7fS5hY2VfbW9iaWxlLWJ1dHRvbiB7cGFkZGluZzogMnB4O2N1cnNvcjogcG9pbnRlcjtvdmVyZmxvdzogaGlkZGVuO30uYWNlX21vYmlsZS1idXR0b246aG92ZXIge2JhY2tncm91bmQtY29sb3I6ICNlZWU7b3BhY2l0eToxO30uYWNlX21vYmlsZS1idXR0b246YWN0aXZlIHtiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO30nLG09ZSgiLi9saWIvdXNlcmFnZW50IiksZz1tLmlzSUU7aS5pbXBvcnRDc3NTdHJpbmcodiwiYWNlX2VkaXRvci5jc3MiKTt2YXIgeT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dGhpcy5jb250YWluZXI9ZXx8aS5jcmVhdGVFbGVtZW50KCJkaXYiKSxpLmFkZENzc0NsYXNzKHRoaXMuY29udGFpbmVyLCJhY2VfZWRpdG9yIiksaS5ISV9EUEkmJmkuYWRkQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsImFjZV9oaWRwaSIpLHRoaXMuc2V0VGhlbWUodCksdGhpcy4kZ3V0dGVyPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kZ3V0dGVyLmNsYXNzTmFtZT0iYWNlX2d1dHRlciIsdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy4kZ3V0dGVyKSx0aGlzLiRndXR0ZXIuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsITApLHRoaXMuc2Nyb2xsZXI9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnNjcm9sbGVyLmNsYXNzTmFtZT0iYWNlX3Njcm9sbGVyIix0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnNjcm9sbGVyKSx0aGlzLmNvbnRlbnQ9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbnRlbnQuY2xhc3NOYW1lPSJhY2VfY29udGVudCIsdGhpcy5zY3JvbGxlci5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnQpLHRoaXMuJGd1dHRlckxheWVyPW5ldyBvKHRoaXMuJGd1dHRlciksdGhpcy4kZ3V0dGVyTGF5ZXIub24oImNoYW5nZUd1dHRlcldpZHRoIix0aGlzLm9uR3V0dGVyUmVzaXplLmJpbmQodGhpcykpLHRoaXMuJG1hcmtlckJhY2s9bmV3IHUodGhpcy5jb250ZW50KTt2YXIgcj10aGlzLiR0ZXh0TGF5ZXI9bmV3IGEodGhpcy5jb250ZW50KTt0aGlzLmNhbnZhcz1yLmVsZW1lbnQsdGhpcy4kbWFya2VyRnJvbnQ9bmV3IHUodGhpcy5jb250ZW50KSx0aGlzLiRjdXJzb3JMYXllcj1uZXcgZih0aGlzLmNvbnRlbnQpLHRoaXMuJGhvcml6U2Nyb2xsPSExLHRoaXMuJHZTY3JvbGw9ITEsdGhpcy5zY3JvbGxCYXI9dGhpcy5zY3JvbGxCYXJWPW5ldyBjKHRoaXMuY29udGFpbmVyLHRoaXMpLHRoaXMuc2Nyb2xsQmFySD1uZXcgbCh0aGlzLmNvbnRhaW5lcix0aGlzKSx0aGlzLnNjcm9sbEJhclYuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmdW5jdGlvbihlKXtuLiRzY3JvbGxBbmltYXRpb258fG4uc2Vzc2lvbi5zZXRTY3JvbGxUb3AoZS5kYXRhLW4uc2Nyb2xsTWFyZ2luLnRvcCl9KSx0aGlzLnNjcm9sbEJhckguYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmdW5jdGlvbihlKXtuLiRzY3JvbGxBbmltYXRpb258fG4uc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KGUuZGF0YS1uLnNjcm9sbE1hcmdpbi5sZWZ0KX0pLHRoaXMuc2Nyb2xsVG9wPTAsdGhpcy5zY3JvbGxMZWZ0PTAsdGhpcy5jdXJzb3JQb3M9e3JvdzowLGNvbHVtbjowfSx0aGlzLiRmb250TWV0cmljcz1uZXcgcCh0aGlzLmNvbnRhaW5lciksdGhpcy4kdGV4dExheWVyLiRzZXRGb250TWV0cmljcyh0aGlzLiRmb250TWV0cmljcyksdGhpcy4kdGV4dExheWVyLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZUNoYXJhY3RlclNpemUiLGZ1bmN0aW9uKGUpe24udXBkYXRlQ2hhcmFjdGVyU2l6ZSgpLG4ub25SZXNpemUoITAsbi5ndXR0ZXJXaWR0aCxuLiRzaXplLndpZHRoLG4uJHNpemUuaGVpZ2h0KSxuLl9zaWduYWwoImNoYW5nZUNoYXJhY3RlclNpemUiLGUpfSksdGhpcy4kc2l6ZT17d2lkdGg6MCxoZWlnaHQ6MCxzY3JvbGxlckhlaWdodDowLHNjcm9sbGVyV2lkdGg6MCwkZGlydHk6ITB9LHRoaXMubGF5ZXJDb25maWc9e3dpZHRoOjEscGFkZGluZzowLGZpcnN0Um93OjAsZmlyc3RSb3dTY3JlZW46MCxsYXN0Um93OjAsbGluZUhlaWdodDowLGNoYXJhY3RlcldpZHRoOjAsbWluSGVpZ2h0OjEsbWF4SGVpZ2h0OjEsb2Zmc2V0OjAsaGVpZ2h0OjEsZ3V0dGVyT2Zmc2V0OjF9LHRoaXMuc2Nyb2xsTWFyZ2luPXtsZWZ0OjAscmlnaHQ6MCx0b3A6MCxib3R0b206MCx2OjAsaDowfSx0aGlzLm1hcmdpbj17bGVmdDowLHJpZ2h0OjAsdG9wOjAsYm90dG9tOjAsdjowLGg6MH0sdGhpcy4ka2VlcFRleHRBcmVhQXRDdXJzb3I9IW0uaXNJT1MsdGhpcy4kbG9vcD1uZXcgaCh0aGlzLiRyZW5kZXJDaGFuZ2VzLmJpbmQodGhpcyksdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKSx0aGlzLnVwZGF0ZUNoYXJhY3RlclNpemUoKSx0aGlzLnNldFBhZGRpbmcoNCkscy5yZXNldE9wdGlvbnModGhpcykscy5fc2lnbmFsKCJyZW5kZXJlciIsdGhpcyl9OyhmdW5jdGlvbigpe3RoaXMuQ0hBTkdFX0NVUlNPUj0xLHRoaXMuQ0hBTkdFX01BUktFUj0yLHRoaXMuQ0hBTkdFX0dVVFRFUj00LHRoaXMuQ0hBTkdFX1NDUk9MTD04LHRoaXMuQ0hBTkdFX0xJTkVTPTE2LHRoaXMuQ0hBTkdFX1RFWFQ9MzIsdGhpcy5DSEFOR0VfU0laRT02NCx0aGlzLkNIQU5HRV9NQVJLRVJfQkFDSz0xMjgsdGhpcy5DSEFOR0VfTUFSS0VSX0ZST05UPTI1Nix0aGlzLkNIQU5HRV9GVUxMPTUxMix0aGlzLkNIQU5HRV9IX1NDUk9MTD0xMDI0LHIuaW1wbGVtZW50KHRoaXMsZCksdGhpcy51cGRhdGVDaGFyYWN0ZXJTaXplPWZ1bmN0aW9uKCl7dGhpcy4kdGV4dExheWVyLmFsbG93Qm9sZEZvbnRzIT10aGlzLiRhbGxvd0JvbGRGb250cyYmKHRoaXMuJGFsbG93Qm9sZEZvbnRzPXRoaXMuJHRleHRMYXllci5hbGxvd0JvbGRGb250cyx0aGlzLnNldFN0eWxlKCJhY2Vfbm9ib2xkIiwhdGhpcy4kYWxsb3dCb2xkRm9udHMpKSx0aGlzLmxheWVyQ29uZmlnLmNoYXJhY3RlcldpZHRoPXRoaXMuY2hhcmFjdGVyV2lkdGg9dGhpcy4kdGV4dExheWVyLmdldENoYXJhY3RlcldpZHRoKCksdGhpcy5sYXllckNvbmZpZy5saW5lSGVpZ2h0PXRoaXMubGluZUhlaWdodD10aGlzLiR0ZXh0TGF5ZXIuZ2V0TGluZUhlaWdodCgpLHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCksaS5zZXRTdHlsZSh0aGlzLnNjcm9sbGVyLnN0eWxlLCJsaW5lLWhlaWdodCIsdGhpcy5saW5lSGVpZ2h0KyJweCIpfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24uZG9jLm9mZigiY2hhbmdlTmV3TGluZU1vZGUiLHRoaXMub25DaGFuZ2VOZXdMaW5lTW9kZSksdGhpcy5zZXNzaW9uPWUsZSYmdGhpcy5zY3JvbGxNYXJnaW4udG9wJiZlLmdldFNjcm9sbFRvcCgpPD0wJiZlLnNldFNjcm9sbFRvcCgtdGhpcy5zY3JvbGxNYXJnaW4udG9wKSx0aGlzLiRjdXJzb3JMYXllci5zZXRTZXNzaW9uKGUpLHRoaXMuJG1hcmtlckJhY2suc2V0U2Vzc2lvbihlKSx0aGlzLiRtYXJrZXJGcm9udC5zZXRTZXNzaW9uKGUpLHRoaXMuJGd1dHRlckxheWVyLnNldFNlc3Npb24oZSksdGhpcy4kdGV4dExheWVyLnNldFNlc3Npb24oZSk7aWYoIWUpcmV0dXJuO3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCksdGhpcy5zZXNzaW9uLiRzZXRGb250TWV0cmljcyh0aGlzLiRmb250TWV0cmljcyksdGhpcy5zY3JvbGxCYXJILnNjcm9sbExlZnQ9dGhpcy5zY3JvbGxCYXJWLnNjcm9sbFRvcD1udWxsLHRoaXMub25DaGFuZ2VOZXdMaW5lTW9kZT10aGlzLm9uQ2hhbmdlTmV3TGluZU1vZGUuYmluZCh0aGlzKSx0aGlzLm9uQ2hhbmdlTmV3TGluZU1vZGUoKSx0aGlzLnNlc3Npb24uZG9jLm9uKCJjaGFuZ2VOZXdMaW5lTW9kZSIsdGhpcy5vbkNoYW5nZU5ld0xpbmVNb2RlKX0sdGhpcy51cGRhdGVMaW5lcz1mdW5jdGlvbihlLHQsbil7dD09PXVuZGVmaW5lZCYmKHQ9SW5maW5pdHkpLHRoaXMuJGNoYW5nZWRMaW5lcz8odGhpcy4kY2hhbmdlZExpbmVzLmZpcnN0Um93PmUmJih0aGlzLiRjaGFuZ2VkTGluZXMuZmlyc3RSb3c9ZSksdGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3c8dCYmKHRoaXMuJGNoYW5nZWRMaW5lcy5sYXN0Um93PXQpKTp0aGlzLiRjaGFuZ2VkTGluZXM9e2ZpcnN0Um93OmUsbGFzdFJvdzp0fTtpZih0aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdzx0aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93KXtpZighbilyZXR1cm47dGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3c9dGhpcy5sYXllckNvbmZpZy5sYXN0Um93fWlmKHRoaXMuJGNoYW5nZWRMaW5lcy5maXJzdFJvdz50aGlzLmxheWVyQ29uZmlnLmxhc3RSb3cpcmV0dXJuO3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfTElORVMpfSx0aGlzLm9uQ2hhbmdlTmV3TGluZU1vZGU9ZnVuY3Rpb24oKXt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFQpLHRoaXMuJHRleHRMYXllci4kdXBkYXRlRW9sQ2hhcigpLHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuc2V0RW9sQ2hhcih0aGlzLiR0ZXh0TGF5ZXIuRU9MX0NIQVIpfSx0aGlzLm9uQ2hhbmdlVGFiU2l6ZT1mdW5jdGlvbigpe3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfVEVYVHx0aGlzLkNIQU5HRV9NQVJLRVIpLHRoaXMuJHRleHRMYXllci5vbkNoYW5nZVRhYlNpemUoKX0sdGhpcy51cGRhdGVUZXh0PWZ1bmN0aW9uKCl7dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9URVhUKX0sdGhpcy51cGRhdGVGdWxsPWZ1bmN0aW9uKGUpe2U/dGhpcy4kcmVuZGVyQ2hhbmdlcyh0aGlzLkNIQU5HRV9GVUxMLCEwKTp0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpfSx0aGlzLnVwZGF0ZUZvbnRTaXplPWZ1bmN0aW9uKCl7dGhpcy4kdGV4dExheWVyLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKX0sdGhpcy4kY2hhbmdlcz0wLHRoaXMuJHVwZGF0ZVNpemVBc3luYz1mdW5jdGlvbigpe3RoaXMuJGxvb3AucGVuZGluZz90aGlzLiRzaXplLiRkaXJ0eT0hMDp0aGlzLm9uUmVzaXplKCl9LHRoaXMub25SZXNpemU9ZnVuY3Rpb24oZSx0LG4scil7aWYodGhpcy5yZXNpemluZz4yKXJldHVybjt0aGlzLnJlc2l6aW5nPjA/dGhpcy5yZXNpemluZysrOnRoaXMucmVzaXppbmc9ZT8xOjA7dmFyIGk9dGhpcy5jb250YWluZXI7cnx8KHI9aS5jbGllbnRIZWlnaHR8fGkuc2Nyb2xsSGVpZ2h0KSxufHwobj1pLmNsaWVudFdpZHRofHxpLnNjcm9sbFdpZHRoKTt2YXIgcz10aGlzLiR1cGRhdGVDYWNoZWRTaXplKGUsdCxuLHIpO2lmKCF0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0fHwhbiYmIXIpcmV0dXJuIHRoaXMucmVzaXppbmc9MDtlJiYodGhpcy4kZ3V0dGVyTGF5ZXIuJHBhZGRpbmc9bnVsbCksZT90aGlzLiRyZW5kZXJDaGFuZ2VzKHN8dGhpcy4kY2hhbmdlcywhMCk6dGhpcy4kbG9vcC5zY2hlZHVsZShzfHRoaXMuJGNoYW5nZXMpLHRoaXMucmVzaXppbmcmJih0aGlzLnJlc2l6aW5nPTApLHRoaXMuc2Nyb2xsQmFyVi5zY3JvbGxMZWZ0PXRoaXMuc2Nyb2xsQmFyVi5zY3JvbGxUb3A9bnVsbH0sdGhpcy4kdXBkYXRlQ2FjaGVkU2l6ZT1mdW5jdGlvbihlLHQsbixyKXtyLT10aGlzLiRleHRyYUhlaWdodHx8MDt2YXIgcz0wLG89dGhpcy4kc2l6ZSx1PXt3aWR0aDpvLndpZHRoLGhlaWdodDpvLmhlaWdodCxzY3JvbGxlckhlaWdodDpvLnNjcm9sbGVySGVpZ2h0LHNjcm9sbGVyV2lkdGg6by5zY3JvbGxlcldpZHRofTtyJiYoZXx8by5oZWlnaHQhPXIpJiYoby5oZWlnaHQ9cixzfD10aGlzLkNIQU5HRV9TSVpFLG8uc2Nyb2xsZXJIZWlnaHQ9by5oZWlnaHQsdGhpcy4kaG9yaXpTY3JvbGwmJihvLnNjcm9sbGVySGVpZ2h0LT10aGlzLnNjcm9sbEJhckguZ2V0SGVpZ2h0KCkpLHRoaXMuc2Nyb2xsQmFyVi5lbGVtZW50LnN0eWxlLmJvdHRvbT10aGlzLnNjcm9sbEJhckguZ2V0SGVpZ2h0KCkrInB4IixzfD10aGlzLkNIQU5HRV9TQ1JPTEwpO2lmKG4mJihlfHxvLndpZHRoIT1uKSl7c3w9dGhpcy5DSEFOR0VfU0laRSxvLndpZHRoPW4sdD09bnVsbCYmKHQ9dGhpcy4kc2hvd0d1dHRlcj90aGlzLiRndXR0ZXIub2Zmc2V0V2lkdGg6MCksdGhpcy5ndXR0ZXJXaWR0aD10LGkuc2V0U3R5bGUodGhpcy5zY3JvbGxCYXJILmVsZW1lbnQuc3R5bGUsImxlZnQiLHQrInB4IiksaS5zZXRTdHlsZSh0aGlzLnNjcm9sbGVyLnN0eWxlLCJsZWZ0Iix0K3RoaXMubWFyZ2luLmxlZnQrInB4Iiksby5zY3JvbGxlcldpZHRoPU1hdGgubWF4KDAsbi10LXRoaXMuc2Nyb2xsQmFyVi5nZXRXaWR0aCgpLXRoaXMubWFyZ2luLmgpLGkuc2V0U3R5bGUodGhpcy4kZ3V0dGVyLnN0eWxlLCJsZWZ0Iix0aGlzLm1hcmdpbi5sZWZ0KyJweCIpO3ZhciBhPXRoaXMuc2Nyb2xsQmFyVi5nZXRXaWR0aCgpKyJweCI7aS5zZXRTdHlsZSh0aGlzLnNjcm9sbEJhckguZWxlbWVudC5zdHlsZSwicmlnaHQiLGEpLGkuc2V0U3R5bGUodGhpcy5zY3JvbGxlci5zdHlsZSwicmlnaHQiLGEpLGkuc2V0U3R5bGUodGhpcy5zY3JvbGxlci5zdHlsZSwiYm90dG9tIix0aGlzLnNjcm9sbEJhckguZ2V0SGVpZ2h0KCkpO2lmKHRoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCkmJnRoaXMuYWRqdXN0V3JhcExpbWl0KCl8fGUpc3w9dGhpcy5DSEFOR0VfRlVMTH1yZXR1cm4gby4kZGlydHk9IW58fCFyLHMmJnRoaXMuX3NpZ25hbCgicmVzaXplIix1KSxzfSx0aGlzLm9uR3V0dGVyUmVzaXplPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJHNob3dHdXR0ZXI/ZTowO3QhPXRoaXMuZ3V0dGVyV2lkdGgmJih0aGlzLiRjaGFuZ2VzfD10aGlzLiR1cGRhdGVDYWNoZWRTaXplKCEwLHQsdGhpcy4kc2l6ZS53aWR0aCx0aGlzLiRzaXplLmhlaWdodCkpLHRoaXMuc2Vzc2lvbi5nZXRVc2VXcmFwTW9kZSgpJiZ0aGlzLmFkanVzdFdyYXBMaW1pdCgpP3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCk6dGhpcy4kc2l6ZS4kZGlydHk/dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKTp0aGlzLiRjb21wdXRlTGF5ZXJDb25maWcoKX0sdGhpcy5hZGp1c3RXcmFwTGltaXQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgtdGhpcy4kcGFkZGluZyoyLHQ9TWF0aC5mbG9vcihlL3RoaXMuY2hhcmFjdGVyV2lkdGgpO3JldHVybiB0aGlzLnNlc3Npb24uYWRqdXN0V3JhcExpbWl0KHQsdGhpcy4kc2hvd1ByaW50TWFyZ2luJiZ0aGlzLiRwcmludE1hcmdpbkNvbHVtbil9LHRoaXMuc2V0QW5pbWF0ZWRTY3JvbGw9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImFuaW1hdGVkU2Nyb2xsIixlKX0sdGhpcy5nZXRBbmltYXRlZFNjcm9sbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRhbmltYXRlZFNjcm9sbH0sdGhpcy5zZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigic2hvd0ludmlzaWJsZXMiLGUpLHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuc2V0U2hvd0ludmlzaWJsZXMoZSl9LHRoaXMuZ2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInNob3dJbnZpc2libGVzIil9LHRoaXMuZ2V0RGlzcGxheUluZGVudEd1aWRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiZGlzcGxheUluZGVudEd1aWRlcyIpfSx0aGlzLnNldERpc3BsYXlJbmRlbnRHdWlkZXM9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImRpc3BsYXlJbmRlbnRHdWlkZXMiLGUpfSx0aGlzLnNldFNob3dQcmludE1hcmdpbj1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigic2hvd1ByaW50TWFyZ2luIixlKX0sdGhpcy5nZXRTaG93UHJpbnRNYXJnaW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInNob3dQcmludE1hcmdpbiIpfSx0aGlzLnNldFByaW50TWFyZ2luQ29sdW1uPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJwcmludE1hcmdpbkNvbHVtbiIsZSl9LHRoaXMuZ2V0UHJpbnRNYXJnaW5Db2x1bW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInByaW50TWFyZ2luQ29sdW1uIil9LHRoaXMuZ2V0U2hvd0d1dHRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigic2hvd0d1dHRlciIpfSx0aGlzLnNldFNob3dHdXR0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc2V0T3B0aW9uKCJzaG93R3V0dGVyIixlKX0sdGhpcy5nZXRGYWRlRm9sZFdpZGdldHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImZhZGVGb2xkV2lkZ2V0cyIpfSx0aGlzLnNldEZhZGVGb2xkV2lkZ2V0cz1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiZmFkZUZvbGRXaWRnZXRzIixlKX0sdGhpcy5zZXRIaWdobGlnaHRHdXR0ZXJMaW5lPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJoaWdobGlnaHRHdXR0ZXJMaW5lIixlKX0sdGhpcy5nZXRIaWdobGlnaHRHdXR0ZXJMaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJoaWdobGlnaHRHdXR0ZXJMaW5lIil9LHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luPWZ1bmN0aW9uKCl7aWYoIXRoaXMuJHNob3dQcmludE1hcmdpbiYmIXRoaXMuJHByaW50TWFyZ2luRWwpcmV0dXJuO2lmKCF0aGlzLiRwcmludE1hcmdpbkVsKXt2YXIgZT1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuY2xhc3NOYW1lPSJhY2VfbGF5ZXIgYWNlX3ByaW50LW1hcmdpbi1sYXllciIsdGhpcy4kcHJpbnRNYXJnaW5FbD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuJHByaW50TWFyZ2luRWwuY2xhc3NOYW1lPSJhY2VfcHJpbnQtbWFyZ2luIixlLmFwcGVuZENoaWxkKHRoaXMuJHByaW50TWFyZ2luRWwpLHRoaXMuY29udGVudC5pbnNlcnRCZWZvcmUoZSx0aGlzLmNvbnRlbnQuZmlyc3RDaGlsZCl9dmFyIHQ9dGhpcy4kcHJpbnRNYXJnaW5FbC5zdHlsZTt0LmxlZnQ9TWF0aC5yb3VuZCh0aGlzLmNoYXJhY3RlcldpZHRoKnRoaXMuJHByaW50TWFyZ2luQ29sdW1uK3RoaXMuJHBhZGRpbmcpKyJweCIsdC52aXNpYmlsaXR5PXRoaXMuJHNob3dQcmludE1hcmdpbj8idmlzaWJsZSI6ImhpZGRlbiIsdGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24uJHdyYXA9PS0xJiZ0aGlzLmFkanVzdFdyYXBMaW1pdCgpfSx0aGlzLmdldENvbnRhaW5lckVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWluZXJ9LHRoaXMuZ2V0TW91c2VFdmVudFRhcmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbGVyfSx0aGlzLmdldFRleHRBcmVhQ29udGFpbmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVyfSx0aGlzLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcj1mdW5jdGlvbigpe2lmKHRoaXMuJGlzTW91c2VQcmVzc2VkKXJldHVybjt2YXIgZT10aGlzLnRleHRhcmVhLnN0eWxlLHQ9dGhpcy4kY29tcG9zaXRpb247aWYoIXRoaXMuJGtlZXBUZXh0QXJlYUF0Q3Vyc29yJiYhdCl7aS50cmFuc2xhdGUodGhpcy50ZXh0YXJlYSwtMTAwLDApO3JldHVybn12YXIgbj10aGlzLiRjdXJzb3JMYXllci4kcGl4ZWxQb3M7aWYoIW4pcmV0dXJuO3QmJnQubWFya2VyUmFuZ2UmJihuPXRoaXMuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24odC5tYXJrZXJSYW5nZS5zdGFydCwhMCkpO3ZhciByPXRoaXMubGF5ZXJDb25maWcscz1uLnRvcCxvPW4ubGVmdDtzLT1yLm9mZnNldDt2YXIgdT10JiZ0LnVzZVRleHRhcmVhRm9ySU1FP3RoaXMubGluZUhlaWdodDpnPzA6MTtpZihzPDB8fHM+ci5oZWlnaHQtdSl7aS50cmFuc2xhdGUodGhpcy50ZXh0YXJlYSwwLDApO3JldHVybn12YXIgYT0xLGY9dGhpcy4kc2l6ZS5oZWlnaHQtdTtpZighdClzKz10aGlzLmxpbmVIZWlnaHQ7ZWxzZSBpZih0LnVzZVRleHRhcmVhRm9ySU1FKXt2YXIgbD10aGlzLnRleHRhcmVhLnZhbHVlO2E9dGhpcy5jaGFyYWN0ZXJXaWR0aCp0aGlzLnNlc3Npb24uJGdldFN0cmluZ1NjcmVlbldpZHRoKGwpWzBdLHUrPTJ9ZWxzZSBzKz10aGlzLmxpbmVIZWlnaHQrMjtvLT10aGlzLnNjcm9sbExlZnQsbz50aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgtYSYmKG89dGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoLWEpLG8rPXRoaXMuZ3V0dGVyV2lkdGgrdGhpcy5tYXJnaW4ubGVmdCxpLnNldFN0eWxlKGUsImhlaWdodCIsdSsicHgiKSxpLnNldFN0eWxlKGUsIndpZHRoIixhKyJweCIpLGkudHJhbnNsYXRlKHRoaXMudGV4dGFyZWEsTWF0aC5taW4obyx0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgtYSksTWF0aC5taW4ocyxmKSl9LHRoaXMuZ2V0Rmlyc3RWaXNpYmxlUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3d9LHRoaXMuZ2V0Rmlyc3RGdWxseVZpc2libGVSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXllckNvbmZpZy5maXJzdFJvdysodGhpcy5sYXllckNvbmZpZy5vZmZzZXQ9PT0wPzA6MSl9LHRoaXMuZ2V0TGFzdEZ1bGx5VmlzaWJsZVJvdz1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGF5ZXJDb25maWcsdD1lLmxhc3RSb3csbj10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblJvdyh0LDApKmUubGluZUhlaWdodDtyZXR1cm4gbi10aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCk+ZS5oZWlnaHQtZS5saW5lSGVpZ2h0P3QtMTp0fSx0aGlzLmdldExhc3RWaXNpYmxlUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5ZXJDb25maWcubGFzdFJvd30sdGhpcy4kcGFkZGluZz1udWxsLHRoaXMuc2V0UGFkZGluZz1mdW5jdGlvbihlKXt0aGlzLiRwYWRkaW5nPWUsdGhpcy4kdGV4dExheWVyLnNldFBhZGRpbmcoZSksdGhpcy4kY3Vyc29yTGF5ZXIuc2V0UGFkZGluZyhlKSx0aGlzLiRtYXJrZXJGcm9udC5zZXRQYWRkaW5nKGUpLHRoaXMuJG1hcmtlckJhY2suc2V0UGFkZGluZyhlKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpLHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCl9LHRoaXMuc2V0U2Nyb2xsTWFyZ2luPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuc2Nyb2xsTWFyZ2luO2kudG9wPWV8MCxpLmJvdHRvbT10fDAsaS5yaWdodD1yfDAsaS5sZWZ0PW58MCxpLnY9aS50b3AraS5ib3R0b20saS5oPWkubGVmdCtpLnJpZ2h0LGkudG9wJiZ0aGlzLnNjcm9sbFRvcDw9MCYmdGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKC1pLnRvcCksdGhpcy51cGRhdGVGdWxsKCl9LHRoaXMuc2V0TWFyZ2luPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMubWFyZ2luO2kudG9wPWV8MCxpLmJvdHRvbT10fDAsaS5yaWdodD1yfDAsaS5sZWZ0PW58MCxpLnY9aS50b3AraS5ib3R0b20saS5oPWkubGVmdCtpLnJpZ2h0LHRoaXMuJHVwZGF0ZUNhY2hlZFNpemUoITAsdGhpcy5ndXR0ZXJXaWR0aCx0aGlzLiRzaXplLndpZHRoLHRoaXMuJHNpemUuaGVpZ2h0KSx0aGlzLnVwZGF0ZUZ1bGwoKX0sdGhpcy5nZXRIU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRoU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZX0sdGhpcy5zZXRIU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiaFNjcm9sbEJhckFsd2F5c1Zpc2libGUiLGUpfSx0aGlzLmdldFZTY3JvbGxCYXJBbHdheXNWaXNpYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHZTY3JvbGxCYXJBbHdheXNWaXNpYmxlfSx0aGlzLnNldFZTY3JvbGxCYXJBbHdheXNWaXNpYmxlPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJ2U2Nyb2xsQmFyQWx3YXlzVmlzaWJsZSIsZSl9LHRoaXMuJHVwZGF0ZVNjcm9sbEJhclY9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxheWVyQ29uZmlnLm1heEhlaWdodCx0PXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQ7IXRoaXMuJG1heExpbmVzJiZ0aGlzLiRzY3JvbGxQYXN0RW5kJiYoZS09KHQtdGhpcy5saW5lSGVpZ2h0KSp0aGlzLiRzY3JvbGxQYXN0RW5kLHRoaXMuc2Nyb2xsVG9wPmUtdCYmKGU9dGhpcy5zY3JvbGxUb3ArdCx0aGlzLnNjcm9sbEJhclYuc2Nyb2xsVG9wPW51bGwpKSx0aGlzLnNjcm9sbEJhclYuc2V0U2Nyb2xsSGVpZ2h0KGUrdGhpcy5zY3JvbGxNYXJnaW4udiksdGhpcy5zY3JvbGxCYXJWLnNldFNjcm9sbFRvcCh0aGlzLnNjcm9sbFRvcCt0aGlzLnNjcm9sbE1hcmdpbi50b3ApfSx0aGlzLiR1cGRhdGVTY3JvbGxCYXJIPWZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxCYXJILnNldFNjcm9sbFdpZHRoKHRoaXMubGF5ZXJDb25maWcud2lkdGgrMip0aGlzLiRwYWRkaW5nK3RoaXMuc2Nyb2xsTWFyZ2luLmgpLHRoaXMuc2Nyb2xsQmFySC5zZXRTY3JvbGxMZWZ0KHRoaXMuc2Nyb2xsTGVmdCt0aGlzLnNjcm9sbE1hcmdpbi5sZWZ0KX0sdGhpcy4kZnJvemVuPSExLHRoaXMuZnJlZXplPWZ1bmN0aW9uKCl7dGhpcy4kZnJvemVuPSEwfSx0aGlzLnVuZnJlZXplPWZ1bmN0aW9uKCl7dGhpcy4kZnJvemVuPSExfSx0aGlzLiRyZW5kZXJDaGFuZ2VzPWZ1bmN0aW9uKGUsdCl7dGhpcy4kY2hhbmdlcyYmKGV8PXRoaXMuJGNoYW5nZXMsdGhpcy4kY2hhbmdlcz0wKTtpZighdGhpcy5zZXNzaW9ufHwhdGhpcy5jb250YWluZXIub2Zmc2V0V2lkdGh8fHRoaXMuJGZyb3plbnx8IWUmJiF0KXt0aGlzLiRjaGFuZ2VzfD1lO3JldHVybn1pZih0aGlzLiRzaXplLiRkaXJ0eSlyZXR1cm4gdGhpcy4kY2hhbmdlc3w9ZSx0aGlzLm9uUmVzaXplKCEwKTt0aGlzLmxpbmVIZWlnaHR8fHRoaXMuJHRleHRMYXllci5jaGVja0ZvclNpemVDaGFuZ2VzKCksdGhpcy5fc2lnbmFsKCJiZWZvcmVSZW5kZXIiKSx0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXImJnRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIudXBkYXRlQ2hhcmFjdGVyV2lkdGhzKHRoaXMuJGZvbnRNZXRyaWNzKTt2YXIgbj10aGlzLmxheWVyQ29uZmlnO2lmKGUmdGhpcy5DSEFOR0VfRlVMTHx8ZSZ0aGlzLkNIQU5HRV9TSVpFfHxlJnRoaXMuQ0hBTkdFX1RFWFR8fGUmdGhpcy5DSEFOR0VfTElORVN8fGUmdGhpcy5DSEFOR0VfU0NST0xMfHxlJnRoaXMuQ0hBTkdFX0hfU0NST0xMKXtlfD10aGlzLiRjb21wdXRlTGF5ZXJDb25maWcoKXx0aGlzLiRsb29wLmNsZWFyKCk7aWYobi5maXJzdFJvdyE9dGhpcy5sYXllckNvbmZpZy5maXJzdFJvdyYmbi5maXJzdFJvd1NjcmVlbj09dGhpcy5sYXllckNvbmZpZy5maXJzdFJvd1NjcmVlbil7dmFyIHI9dGhpcy5zY3JvbGxUb3ArKG4uZmlyc3RSb3ctdGhpcy5sYXllckNvbmZpZy5maXJzdFJvdykqdGhpcy5saW5lSGVpZ2h0O3I+MCYmKHRoaXMuc2Nyb2xsVG9wPXIsZXw9dGhpcy5DSEFOR0VfU0NST0xMLGV8PXRoaXMuJGNvbXB1dGVMYXllckNvbmZpZygpfHRoaXMuJGxvb3AuY2xlYXIoKSl9bj10aGlzLmxheWVyQ29uZmlnLHRoaXMuJHVwZGF0ZVNjcm9sbEJhclYoKSxlJnRoaXMuQ0hBTkdFX0hfU0NST0xMJiZ0aGlzLiR1cGRhdGVTY3JvbGxCYXJIKCksaS50cmFuc2xhdGUodGhpcy5jb250ZW50LC10aGlzLnNjcm9sbExlZnQsLW4ub2Zmc2V0KTt2YXIgcz1uLndpZHRoKzIqdGhpcy4kcGFkZGluZysicHgiLG89bi5taW5IZWlnaHQrInB4IjtpLnNldFN0eWxlKHRoaXMuY29udGVudC5zdHlsZSwid2lkdGgiLHMpLGkuc2V0U3R5bGUodGhpcy5jb250ZW50LnN0eWxlLCJoZWlnaHQiLG8pfWUmdGhpcy5DSEFOR0VfSF9TQ1JPTEwmJihpLnRyYW5zbGF0ZSh0aGlzLmNvbnRlbnQsLXRoaXMuc2Nyb2xsTGVmdCwtbi5vZmZzZXQpLHRoaXMuc2Nyb2xsZXIuY2xhc3NOYW1lPXRoaXMuc2Nyb2xsTGVmdDw9MD8iYWNlX3Njcm9sbGVyIjoiYWNlX3Njcm9sbGVyIGFjZV9zY3JvbGwtbGVmdCIpO2lmKGUmdGhpcy5DSEFOR0VfRlVMTCl7dGhpcy4kY2hhbmdlZExpbmVzPW51bGwsdGhpcy4kdGV4dExheWVyLnVwZGF0ZShuKSx0aGlzLiRzaG93R3V0dGVyJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGUobiksdGhpcy4kbWFya2VyQmFjay51cGRhdGUobiksdGhpcy4kbWFya2VyRnJvbnQudXBkYXRlKG4pLHRoaXMuJGN1cnNvckxheWVyLnVwZGF0ZShuKSx0aGlzLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcigpLHRoaXMuX3NpZ25hbCgiYWZ0ZXJSZW5kZXIiKTtyZXR1cm59aWYoZSZ0aGlzLkNIQU5HRV9TQ1JPTEwpe3RoaXMuJGNoYW5nZWRMaW5lcz1udWxsLGUmdGhpcy5DSEFOR0VfVEVYVHx8ZSZ0aGlzLkNIQU5HRV9MSU5FUz90aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKG4pOnRoaXMuJHRleHRMYXllci5zY3JvbGxMaW5lcyhuKSx0aGlzLiRzaG93R3V0dGVyJiYoZSZ0aGlzLkNIQU5HRV9HVVRURVJ8fGUmdGhpcy5DSEFOR0VfTElORVM/dGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKG4pOnRoaXMuJGd1dHRlckxheWVyLnNjcm9sbExpbmVzKG4pKSx0aGlzLiRtYXJrZXJCYWNrLnVwZGF0ZShuKSx0aGlzLiRtYXJrZXJGcm9udC51cGRhdGUobiksdGhpcy4kY3Vyc29yTGF5ZXIudXBkYXRlKG4pLHRoaXMuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yKCksdGhpcy5fc2lnbmFsKCJhZnRlclJlbmRlciIpO3JldHVybn1lJnRoaXMuQ0hBTkdFX1RFWFQ/KHRoaXMuJGNoYW5nZWRMaW5lcz1udWxsLHRoaXMuJHRleHRMYXllci51cGRhdGUobiksdGhpcy4kc2hvd0d1dHRlciYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKG4pKTplJnRoaXMuQ0hBTkdFX0xJTkVTPyh0aGlzLiR1cGRhdGVMaW5lcygpfHxlJnRoaXMuQ0hBTkdFX0dVVFRFUiYmdGhpcy4kc2hvd0d1dHRlcikmJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZShuKTplJnRoaXMuQ0hBTkdFX1RFWFR8fGUmdGhpcy5DSEFOR0VfR1VUVEVSP3RoaXMuJHNob3dHdXR0ZXImJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZShuKTplJnRoaXMuQ0hBTkdFX0NVUlNPUiYmdGhpcy4kaGlnaGxpZ2h0R3V0dGVyTGluZSYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlTGluZUhpZ2hsaWdodChuKSxlJnRoaXMuQ0hBTkdFX0NVUlNPUiYmKHRoaXMuJGN1cnNvckxheWVyLnVwZGF0ZShuKSx0aGlzLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcigpKSxlJih0aGlzLkNIQU5HRV9NQVJLRVJ8dGhpcy5DSEFOR0VfTUFSS0VSX0ZST05UKSYmdGhpcy4kbWFya2VyRnJvbnQudXBkYXRlKG4pLGUmKHRoaXMuQ0hBTkdFX01BUktFUnx0aGlzLkNIQU5HRV9NQVJLRVJfQkFDSykmJnRoaXMuJG1hcmtlckJhY2sudXBkYXRlKG4pLHRoaXMuX3NpZ25hbCgiYWZ0ZXJSZW5kZXIiKX0sdGhpcy4kYXV0b3NpemU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24uZ2V0U2NyZWVuTGVuZ3RoKCkqdGhpcy5saW5lSGVpZ2h0LHQ9dGhpcy4kbWF4TGluZXMqdGhpcy5saW5lSGVpZ2h0LG49TWF0aC5taW4odCxNYXRoLm1heCgodGhpcy4kbWluTGluZXN8fDEpKnRoaXMubGluZUhlaWdodCxlKSkrdGhpcy5zY3JvbGxNYXJnaW4udisodGhpcy4kZXh0cmFIZWlnaHR8fDApO3RoaXMuJGhvcml6U2Nyb2xsJiYobis9dGhpcy5zY3JvbGxCYXJILmdldEhlaWdodCgpKSx0aGlzLiRtYXhQaXhlbEhlaWdodCYmbj50aGlzLiRtYXhQaXhlbEhlaWdodCYmKG49dGhpcy4kbWF4UGl4ZWxIZWlnaHQpO3ZhciByPW48PTIqdGhpcy5saW5lSGVpZ2h0LGk9IXImJmU+dDtpZihuIT10aGlzLmRlc2lyZWRIZWlnaHR8fHRoaXMuJHNpemUuaGVpZ2h0IT10aGlzLmRlc2lyZWRIZWlnaHR8fGkhPXRoaXMuJHZTY3JvbGwpe2khPXRoaXMuJHZTY3JvbGwmJih0aGlzLiR2U2Nyb2xsPWksdGhpcy5zY3JvbGxCYXJWLnNldFZpc2libGUoaSkpO3ZhciBzPXRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoO3RoaXMuY29udGFpbmVyLnN0eWxlLmhlaWdodD1uKyJweCIsdGhpcy4kdXBkYXRlQ2FjaGVkU2l6ZSghMCx0aGlzLiRndXR0ZXJXaWR0aCxzLG4pLHRoaXMuZGVzaXJlZEhlaWdodD1uLHRoaXMuX3NpZ25hbCgiYXV0b3NpemUiKX19LHRoaXMuJGNvbXB1dGVMYXllckNvbmZpZz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbix0PXRoaXMuJHNpemUsbj10LmhlaWdodDw9Mip0aGlzLmxpbmVIZWlnaHQscj10aGlzLnNlc3Npb24uZ2V0U2NyZWVuTGVuZ3RoKCksaT1yKnRoaXMubGluZUhlaWdodCxzPXRoaXMuJGdldExvbmdlc3RMaW5lKCksbz0hbiYmKHRoaXMuJGhTY3JvbGxCYXJBbHdheXNWaXNpYmxlfHx0LnNjcm9sbGVyV2lkdGgtcy0yKnRoaXMuJHBhZGRpbmc8MCksdT10aGlzLiRob3JpelNjcm9sbCE9PW87dSYmKHRoaXMuJGhvcml6U2Nyb2xsPW8sdGhpcy5zY3JvbGxCYXJILnNldFZpc2libGUobykpO3ZhciBhPXRoaXMuJHZTY3JvbGw7dGhpcy4kbWF4TGluZXMmJnRoaXMubGluZUhlaWdodD4xJiZ0aGlzLiRhdXRvc2l6ZSgpO3ZhciBmPXQuc2Nyb2xsZXJIZWlnaHQrdGhpcy5saW5lSGVpZ2h0LGw9IXRoaXMuJG1heExpbmVzJiZ0aGlzLiRzY3JvbGxQYXN0RW5kPyh0LnNjcm9sbGVySGVpZ2h0LXRoaXMubGluZUhlaWdodCkqdGhpcy4kc2Nyb2xsUGFzdEVuZDowO2krPWw7dmFyIGM9dGhpcy5zY3JvbGxNYXJnaW47dGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChNYXRoLm1heCgtYy50b3AsTWF0aC5taW4odGhpcy5zY3JvbGxUb3AsaS10LnNjcm9sbGVySGVpZ2h0K2MuYm90dG9tKSkpLHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KE1hdGgubWF4KC1jLmxlZnQsTWF0aC5taW4odGhpcy5zY3JvbGxMZWZ0LHMrMip0aGlzLiRwYWRkaW5nLXQuc2Nyb2xsZXJXaWR0aCtjLnJpZ2h0KSkpO3ZhciBoPSFuJiYodGhpcy4kdlNjcm9sbEJhckFsd2F5c1Zpc2libGV8fHQuc2Nyb2xsZXJIZWlnaHQtaStsPDB8fHRoaXMuc2Nyb2xsVG9wPmMudG9wKSxwPWEhPT1oO3AmJih0aGlzLiR2U2Nyb2xsPWgsdGhpcy5zY3JvbGxCYXJWLnNldFZpc2libGUoaCkpO3ZhciBkPXRoaXMuc2Nyb2xsVG9wJXRoaXMubGluZUhlaWdodCx2PU1hdGguY2VpbChmL3RoaXMubGluZUhlaWdodCktMSxtPU1hdGgubWF4KDAsTWF0aC5yb3VuZCgodGhpcy5zY3JvbGxUb3AtZCkvdGhpcy5saW5lSGVpZ2h0KSksZz1tK3YseSxiLHc9dGhpcy5saW5lSGVpZ2h0O209ZS5zY3JlZW5Ub0RvY3VtZW50Um93KG0sMCk7dmFyIEU9ZS5nZXRGb2xkTGluZShtKTtFJiYobT1FLnN0YXJ0LnJvdykseT1lLmRvY3VtZW50VG9TY3JlZW5Sb3cobSwwKSxiPWUuZ2V0Um93TGVuZ3RoKG0pKncsZz1NYXRoLm1pbihlLnNjcmVlblRvRG9jdW1lbnRSb3coZywwKSxlLmdldExlbmd0aCgpLTEpLGY9dC5zY3JvbGxlckhlaWdodCtlLmdldFJvd0xlbmd0aChnKSp3K2IsZD10aGlzLnNjcm9sbFRvcC15Knc7dmFyIFM9MDtpZih0aGlzLmxheWVyQ29uZmlnLndpZHRoIT1zfHx1KVM9dGhpcy5DSEFOR0VfSF9TQ1JPTEw7aWYodXx8cClTfD10aGlzLiR1cGRhdGVDYWNoZWRTaXplKCEwLHRoaXMuZ3V0dGVyV2lkdGgsdC53aWR0aCx0LmhlaWdodCksdGhpcy5fc2lnbmFsKCJzY3JvbGxiYXJWaXNpYmlsaXR5Q2hhbmdlZCIpLHAmJihzPXRoaXMuJGdldExvbmdlc3RMaW5lKCkpO3JldHVybiB0aGlzLmxheWVyQ29uZmlnPXt3aWR0aDpzLHBhZGRpbmc6dGhpcy4kcGFkZGluZyxmaXJzdFJvdzptLGZpcnN0Um93U2NyZWVuOnksbGFzdFJvdzpnLGxpbmVIZWlnaHQ6dyxjaGFyYWN0ZXJXaWR0aDp0aGlzLmNoYXJhY3RlcldpZHRoLG1pbkhlaWdodDpmLG1heEhlaWdodDppLG9mZnNldDpkLGd1dHRlck9mZnNldDp3P01hdGgubWF4KDAsTWF0aC5jZWlsKChkK3QuaGVpZ2h0LXQuc2Nyb2xsZXJIZWlnaHQpL3cpKTowLGhlaWdodDp0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0fSx0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyJiZ0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLnNldENvbnRlbnRXaWR0aChzLXRoaXMuJHBhZGRpbmcpLFN9LHRoaXMuJHVwZGF0ZUxpbmVzPWZ1bmN0aW9uKCl7aWYoIXRoaXMuJGNoYW5nZWRMaW5lcylyZXR1cm47dmFyIGU9dGhpcy4kY2hhbmdlZExpbmVzLmZpcnN0Um93LHQ9dGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3c7dGhpcy4kY2hhbmdlZExpbmVzPW51bGw7dmFyIG49dGhpcy5sYXllckNvbmZpZztpZihlPm4ubGFzdFJvdysxKXJldHVybjtpZih0PG4uZmlyc3RSb3cpcmV0dXJuO2lmKHQ9PT1JbmZpbml0eSl7dGhpcy4kc2hvd0d1dHRlciYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKG4pLHRoaXMuJHRleHRMYXllci51cGRhdGUobik7cmV0dXJufXJldHVybiB0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlTGluZXMobixlLHQpLCEwfSx0aGlzLiRnZXRMb25nZXN0TGluZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5XaWR0aCgpO3JldHVybiB0aGlzLnNob3dJbnZpc2libGVzJiYhdGhpcy5zZXNzaW9uLiR1c2VXcmFwTW9kZSYmKGUrPTEpLHRoaXMuJHRleHRMYXllciYmZT50aGlzLiR0ZXh0TGF5ZXIuTUFYX0xJTkVfTEVOR1RIJiYoZT10aGlzLiR0ZXh0TGF5ZXIuTUFYX0xJTkVfTEVOR1RIKzMwKSxNYXRoLm1heCh0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgtMip0aGlzLiRwYWRkaW5nLE1hdGgucm91bmQoZSp0aGlzLmNoYXJhY3RlcldpZHRoKSl9LHRoaXMudXBkYXRlRnJvbnRNYXJrZXJzPWZ1bmN0aW9uKCl7dGhpcy4kbWFya2VyRnJvbnQuc2V0TWFya2Vycyh0aGlzLnNlc3Npb24uZ2V0TWFya2VycyghMCkpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfTUFSS0VSX0ZST05UKX0sdGhpcy51cGRhdGVCYWNrTWFya2Vycz1mdW5jdGlvbigpe3RoaXMuJG1hcmtlckJhY2suc2V0TWFya2Vycyh0aGlzLnNlc3Npb24uZ2V0TWFya2VycygpKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX01BUktFUl9CQUNLKX0sdGhpcy5hZGRHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGUsdCl7dGhpcy4kZ3V0dGVyTGF5ZXIuYWRkR3V0dGVyRGVjb3JhdGlvbihlLHQpfSx0aGlzLnJlbW92ZUd1dHRlckRlY29yYXRpb249ZnVuY3Rpb24oZSx0KXt0aGlzLiRndXR0ZXJMYXllci5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uKGUsdCl9LHRoaXMudXBkYXRlQnJlYWtwb2ludHM9ZnVuY3Rpb24oZSl7dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpfSx0aGlzLnNldEFubm90YXRpb25zPWZ1bmN0aW9uKGUpe3RoaXMuJGd1dHRlckxheWVyLnNldEFubm90YXRpb25zKGUpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKX0sdGhpcy51cGRhdGVDdXJzb3I9ZnVuY3Rpb24oKXt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0NVUlNPUil9LHRoaXMuaGlkZUN1cnNvcj1mdW5jdGlvbigpe3RoaXMuJGN1cnNvckxheWVyLmhpZGVDdXJzb3IoKX0sdGhpcy5zaG93Q3Vyc29yPWZ1bmN0aW9uKCl7dGhpcy4kY3Vyc29yTGF5ZXIuc2hvd0N1cnNvcigpfSx0aGlzLnNjcm9sbFNlbGVjdGlvbkludG9WaWV3PWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnNjcm9sbEN1cnNvckludG9WaWV3KGUsbiksdGhpcy5zY3JvbGxDdXJzb3JJbnRvVmlldyh0LG4pfSx0aGlzLnNjcm9sbEN1cnNvckludG9WaWV3PWZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0PT09MClyZXR1cm47dmFyIHI9dGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbihlKSxpPXIubGVmdCxzPXIudG9wLG89biYmbi50b3B8fDAsdT1uJiZuLmJvdHRvbXx8MCxhPXRoaXMuJHNjcm9sbEFuaW1hdGlvbj90aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCk6dGhpcy5zY3JvbGxUb3A7YStvPnM/KHQmJmErbz5zK3RoaXMubGluZUhlaWdodCYmKHMtPXQqdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCkscz09PTAmJihzPS10aGlzLnNjcm9sbE1hcmdpbi50b3ApLHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AocykpOmErdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodC11PHMrdGhpcy5saW5lSGVpZ2h0JiYodCYmYSt0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0LXU8cy10aGlzLmxpbmVIZWlnaHQmJihzKz10KnRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpLHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3Aocyt0aGlzLmxpbmVIZWlnaHQrdS10aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0KSk7dmFyIGY9dGhpcy5zY3JvbGxMZWZ0O2Y+aT8oaTx0aGlzLiRwYWRkaW5nKzIqdGhpcy5sYXllckNvbmZpZy5jaGFyYWN0ZXJXaWR0aCYmKGk9LXRoaXMuc2Nyb2xsTWFyZ2luLmxlZnQpLHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KGkpKTpmK3RoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aDxpK3RoaXMuY2hhcmFjdGVyV2lkdGg/dGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQoTWF0aC5yb3VuZChpK3RoaXMuY2hhcmFjdGVyV2lkdGgtdGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoKSk6Zjw9dGhpcy4kcGFkZGluZyYmaS1mPHRoaXMuY2hhcmFjdGVyV2lkdGgmJnRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KDApfSx0aGlzLmdldFNjcm9sbFRvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCl9LHRoaXMuZ2V0U2Nyb2xsTGVmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsTGVmdCgpfSx0aGlzLmdldFNjcm9sbFRvcFJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbFRvcC90aGlzLmxpbmVIZWlnaHR9LHRoaXMuZ2V0U2Nyb2xsQm90dG9tUm93PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5mbG9vcigodGhpcy5zY3JvbGxUb3ArdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCkvdGhpcy5saW5lSGVpZ2h0KS0xKX0sdGhpcy5zY3JvbGxUb1Jvdz1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKGUqdGhpcy5saW5lSGVpZ2h0KX0sdGhpcy5hbGlnbkN1cnNvcj1mdW5jdGlvbihlLHQpe3R5cGVvZiBlPT0ibnVtYmVyIiYmKGU9e3JvdzplLGNvbHVtbjowfSk7dmFyIG49dGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbihlKSxyPXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQtdGhpcy5saW5lSGVpZ2h0LGk9bi50b3AtcioodHx8MCk7cmV0dXJuIHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AoaSksaX0sdGhpcy5TVEVQUz04LHRoaXMuJGNhbGNTdGVwcz1mdW5jdGlvbihlLHQpe3ZhciBuPTAscj10aGlzLlNURVBTLGk9W10scz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4qKE1hdGgucG93KGUtMSwzKSsxKSt0fTtmb3Iobj0wO248cjsrK24paS5wdXNoKHMobi90aGlzLlNURVBTLGUsdC1lKSk7cmV0dXJuIGl9LHRoaXMuc2Nyb2xsVG9MaW5lPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oe3JvdzplLGNvbHVtbjowfSkscz1pLnRvcDt0JiYocy09dGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodC8yKTt2YXIgbz10aGlzLnNjcm9sbFRvcDt0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHMpLG4hPT0hMSYmdGhpcy5hbmltYXRlU2Nyb2xsaW5nKG8scil9LHRoaXMuYW5pbWF0ZVNjcm9sbGluZz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2Nyb2xsVG9wO2lmKCF0aGlzLiRhbmltYXRlZFNjcm9sbClyZXR1cm47dmFyIHI9dGhpcztpZihlPT1uKXJldHVybjtpZih0aGlzLiRzY3JvbGxBbmltYXRpb24pe3ZhciBpPXRoaXMuJHNjcm9sbEFuaW1hdGlvbi5zdGVwcztpZihpLmxlbmd0aCl7ZT1pWzBdO2lmKGU9PW4pcmV0dXJufX12YXIgcz1yLiRjYWxjU3RlcHMoZSxuKTt0aGlzLiRzY3JvbGxBbmltYXRpb249e2Zyb206ZSx0bzpuLHN0ZXBzOnN9LGNsZWFySW50ZXJ2YWwodGhpcy4kdGltZXIpLHIuc2Vzc2lvbi5zZXRTY3JvbGxUb3Aocy5zaGlmdCgpKSxyLnNlc3Npb24uJHNjcm9sbFRvcD1uLHRoaXMuJHRpbWVyPXNldEludGVydmFsKGZ1bmN0aW9uKCl7cy5sZW5ndGg/KHIuc2Vzc2lvbi5zZXRTY3JvbGxUb3Aocy5zaGlmdCgpKSxyLnNlc3Npb24uJHNjcm9sbFRvcD1uKTpuIT1udWxsPyhyLnNlc3Npb24uJHNjcm9sbFRvcD0tMSxyLnNlc3Npb24uc2V0U2Nyb2xsVG9wKG4pLG49bnVsbCk6KHIuJHRpbWVyPWNsZWFySW50ZXJ2YWwoci4kdGltZXIpLHIuJHNjcm9sbEFuaW1hdGlvbj1udWxsLHQmJnQoKSl9LDEwKX0sdGhpcy5zY3JvbGxUb1k9ZnVuY3Rpb24oZSl7dGhpcy5zY3JvbGxUb3AhPT1lJiYodGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpLHRoaXMuc2Nyb2xsVG9wPWUpfSx0aGlzLnNjcm9sbFRvWD1mdW5jdGlvbihlKXt0aGlzLnNjcm9sbExlZnQhPT1lJiYodGhpcy5zY3JvbGxMZWZ0PWUpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfSF9TQ1JPTEwpfSx0aGlzLnNjcm9sbFRvPWZ1bmN0aW9uKGUsdCl7dGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcCh0KSx0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdCh0KX0sdGhpcy5zY3JvbGxCeT1mdW5jdGlvbihlLHQpe3QmJnRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AodGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpK3QpLGUmJnRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCkrZSl9LHRoaXMuaXNTY3JvbGxhYmxlQnk9ZnVuY3Rpb24oZSx0KXtpZih0PDAmJnRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKT49MS10aGlzLnNjcm9sbE1hcmdpbi50b3ApcmV0dXJuITA7aWYodD4wJiZ0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkrdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodC10aGlzLmxheWVyQ29uZmlnLm1heEhlaWdodDwtMSt0aGlzLnNjcm9sbE1hcmdpbi5ib3R0b20pcmV0dXJuITA7aWYoZTwwJiZ0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsTGVmdCgpPj0xLXRoaXMuc2Nyb2xsTWFyZ2luLmxlZnQpcmV0dXJuITA7aWYoZT4wJiZ0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsTGVmdCgpK3RoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC10aGlzLmxheWVyQ29uZmlnLndpZHRoPC0xK3RoaXMuc2Nyb2xsTWFyZ2luLnJpZ2h0KXJldHVybiEwfSx0aGlzLnBpeGVsVG9TY3JlZW5Db29yZGluYXRlcz1mdW5jdGlvbihlLHQpe3ZhciBuO2lmKHRoaXMuJGhhc0Nzc1RyYW5zZm9ybXMpe249e3RvcDowLGxlZnQ6MH07dmFyIHI9dGhpcy4kZm9udE1ldHJpY3MudHJhbnNmb3JtQ29vcmRpbmF0ZXMoW2UsdF0pO2U9clsxXS10aGlzLmd1dHRlcldpZHRoLXRoaXMubWFyZ2luLmxlZnQsdD1yWzBdfWVsc2Ugbj10aGlzLnNjcm9sbGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBpPWUrdGhpcy5zY3JvbGxMZWZ0LW4ubGVmdC10aGlzLiRwYWRkaW5nLHM9aS90aGlzLmNoYXJhY3RlcldpZHRoLG89TWF0aC5mbG9vcigodCt0aGlzLnNjcm9sbFRvcC1uLnRvcCkvdGhpcy5saW5lSGVpZ2h0KSx1PXRoaXMuJGJsb2NrQ3Vyc29yP01hdGguZmxvb3Iocyk6TWF0aC5yb3VuZChzKTtyZXR1cm57cm93Om8sY29sdW1uOnUsc2lkZTpzLXU+MD8xOi0xLG9mZnNldFg6aX19LHRoaXMuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZih0aGlzLiRoYXNDc3NUcmFuc2Zvcm1zKXtuPXt0b3A6MCxsZWZ0OjB9O3ZhciByPXRoaXMuJGZvbnRNZXRyaWNzLnRyYW5zZm9ybUNvb3JkaW5hdGVzKFtlLHRdKTtlPXJbMV0tdGhpcy5ndXR0ZXJXaWR0aC10aGlzLm1hcmdpbi5sZWZ0LHQ9clswXX1lbHNlIG49dGhpcy5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgaT1lK3RoaXMuc2Nyb2xsTGVmdC1uLmxlZnQtdGhpcy4kcGFkZGluZyxzPWkvdGhpcy5jaGFyYWN0ZXJXaWR0aCxvPXRoaXMuJGJsb2NrQ3Vyc29yP01hdGguZmxvb3Iocyk6TWF0aC5yb3VuZChzKSx1PU1hdGguZmxvb3IoKHQrdGhpcy5zY3JvbGxUb3Atbi50b3ApL3RoaXMubGluZUhlaWdodCk7cmV0dXJuIHRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24odSxNYXRoLm1heChvLDApLGkpfSx0aGlzLnRleHRUb1NjcmVlbkNvb3JkaW5hdGVzPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxyPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oZSx0KSxpPXRoaXMuJHBhZGRpbmcrKHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuaXNCaWRpUm93KHIucm93LGUpP3RoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuZ2V0UG9zTGVmdChyLmNvbHVtbik6TWF0aC5yb3VuZChyLmNvbHVtbip0aGlzLmNoYXJhY3RlcldpZHRoKSkscz1yLnJvdyp0aGlzLmxpbmVIZWlnaHQ7cmV0dXJue3BhZ2VYOm4ubGVmdCtpLXRoaXMuc2Nyb2xsTGVmdCxwYWdlWTpuLnRvcCtzLXRoaXMuc2Nyb2xsVG9wfX0sdGhpcy52aXN1YWxpemVGb2N1cz1mdW5jdGlvbigpe2kuYWRkQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsImFjZV9mb2N1cyIpfSx0aGlzLnZpc3VhbGl6ZUJsdXI9ZnVuY3Rpb24oKXtpLnJlbW92ZUNzc0NsYXNzKHRoaXMuY29udGFpbmVyLCJhY2VfZm9jdXMiKX0sdGhpcy5zaG93Q29tcG9zaXRpb249ZnVuY3Rpb24oZSl7dGhpcy4kY29tcG9zaXRpb249ZSxlLmNzc1RleHR8fChlLmNzc1RleHQ9dGhpcy50ZXh0YXJlYS5zdHlsZS5jc3NUZXh0KSxlLnVzZVRleHRhcmVhRm9ySU1FPXRoaXMuJHVzZVRleHRhcmVhRm9ySU1FLHRoaXMuJHVzZVRleHRhcmVhRm9ySU1FPyhpLmFkZENzc0NsYXNzKHRoaXMudGV4dGFyZWEsImFjZV9jb21wb3NpdGlvbiIpLHRoaXMudGV4dGFyZWEuc3R5bGUuY3NzVGV4dD0iIix0aGlzLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcigpLHRoaXMuJGN1cnNvckxheWVyLmVsZW1lbnQuc3R5bGUuZGlzcGxheT0ibm9uZSIpOmUubWFya2VySWQ9dGhpcy5zZXNzaW9uLmFkZE1hcmtlcihlLm1hcmtlclJhbmdlLCJhY2VfY29tcG9zaXRpb25fbWFya2VyIiwidGV4dCIpfSx0aGlzLnNldENvbXBvc2l0aW9uVGV4dD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb24uc2VsZWN0aW9uLmN1cnNvcjt0aGlzLmFkZFRva2VuKGUsImNvbXBvc2l0aW9uX3BsYWNlaG9sZGVyIix0LnJvdyx0LmNvbHVtbiksdGhpcy4kbW92ZVRleHRBcmVhVG9DdXJzb3IoKX0sdGhpcy5oaWRlQ29tcG9zaXRpb249ZnVuY3Rpb24oKXtpZighdGhpcy4kY29tcG9zaXRpb24pcmV0dXJuO3RoaXMuJGNvbXBvc2l0aW9uLm1hcmtlcklkJiZ0aGlzLnNlc3Npb24ucmVtb3ZlTWFya2VyKHRoaXMuJGNvbXBvc2l0aW9uLm1hcmtlcklkKSxpLnJlbW92ZUNzc0NsYXNzKHRoaXMudGV4dGFyZWEsImFjZV9jb21wb3NpdGlvbiIpLHRoaXMudGV4dGFyZWEuc3R5bGUuY3NzVGV4dD10aGlzLiRjb21wb3NpdGlvbi5jc3NUZXh0LHRoaXMuJGNvbXBvc2l0aW9uPW51bGwsdGhpcy4kY3Vyc29yTGF5ZXIuZWxlbWVudC5zdHlsZS5kaXNwbGF5PSIifSx0aGlzLmFkZFRva2VuPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuc2Vzc2lvbjtpLmJnVG9rZW5pemVyLmxpbmVzW25dPW51bGw7dmFyIHM9e3R5cGU6dCx2YWx1ZTplfSxvPWkuZ2V0VG9rZW5zKG4pO2lmKHI9PW51bGwpby5wdXNoKHMpO2Vsc2V7dmFyIHU9MDtmb3IodmFyIGE9MDthPG8ubGVuZ3RoO2ErKyl7dmFyIGY9b1thXTt1Kz1mLnZhbHVlLmxlbmd0aDtpZihyPD11KXt2YXIgbD1mLnZhbHVlLmxlbmd0aC0odS1yKSxjPWYudmFsdWUuc2xpY2UoMCxsKSxoPWYudmFsdWUuc2xpY2UobCk7by5zcGxpY2UoYSwxLHt0eXBlOmYudHlwZSx2YWx1ZTpjfSxzLHt0eXBlOmYudHlwZSx2YWx1ZTpofSk7YnJlYWt9fX10aGlzLnVwZGF0ZUxpbmVzKG4sbil9LHRoaXMuc2V0VGhlbWU9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBvKHIpe2lmKG4uJHRoZW1lSWQhPWUpcmV0dXJuIHQmJnQoKTtpZighcnx8IXIuY3NzQ2xhc3MpdGhyb3cgbmV3IEVycm9yKCJjb3VsZG4ndCBsb2FkIG1vZHVsZSAiK2UrIiBvciBpdCBkaWRuJ3QgY2FsbCBkZWZpbmUiKTtyLiRpZCYmKG4uJHRoZW1lSWQ9ci4kaWQpLGkuaW1wb3J0Q3NzU3RyaW5nKHIuY3NzVGV4dCxyLmNzc0NsYXNzLG4uY29udGFpbmVyKSxuLnRoZW1lJiZpLnJlbW92ZUNzc0NsYXNzKG4uY29udGFpbmVyLG4udGhlbWUuY3NzQ2xhc3MpO3ZhciBzPSJwYWRkaW5nImluIHI/ci5wYWRkaW5nOiJwYWRkaW5nImluKG4udGhlbWV8fHt9KT80Om4uJHBhZGRpbmc7bi4kcGFkZGluZyYmcyE9bi4kcGFkZGluZyYmbi5zZXRQYWRkaW5nKHMpLG4uJHRoZW1lPXIuY3NzQ2xhc3Msbi50aGVtZT1yLGkuYWRkQ3NzQ2xhc3Mobi5jb250YWluZXIsci5jc3NDbGFzcyksaS5zZXRDc3NDbGFzcyhuLmNvbnRhaW5lciwiYWNlX2RhcmsiLHIuaXNEYXJrKSxuLiRzaXplJiYobi4kc2l6ZS53aWR0aD0wLG4uJHVwZGF0ZVNpemVBc3luYygpKSxuLl9kaXNwYXRjaEV2ZW50KCJ0aGVtZUxvYWRlZCIse3RoZW1lOnJ9KSx0JiZ0KCl9dmFyIG49dGhpczt0aGlzLiR0aGVtZUlkPWUsbi5fZGlzcGF0Y2hFdmVudCgidGhlbWVDaGFuZ2UiLHt0aGVtZTplfSk7aWYoIWV8fHR5cGVvZiBlPT0ic3RyaW5nIil7dmFyIHI9ZXx8dGhpcy4kb3B0aW9ucy50aGVtZS5pbml0aWFsVmFsdWU7cy5sb2FkTW9kdWxlKFsidGhlbWUiLHJdLG8pfWVsc2UgbyhlKX0sdGhpcy5nZXRUaGVtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR0aGVtZUlkfSx0aGlzLnNldFN0eWxlPWZ1bmN0aW9uKGUsdCl7aS5zZXRDc3NDbGFzcyh0aGlzLmNvbnRhaW5lcixlLHQhPT0hMSl9LHRoaXMudW5zZXRTdHlsZT1mdW5jdGlvbihlKXtpLnJlbW92ZUNzc0NsYXNzKHRoaXMuY29udGFpbmVyLGUpfSx0aGlzLnNldEN1cnNvclN0eWxlPWZ1bmN0aW9uKGUpe2kuc2V0U3R5bGUodGhpcy5zY3JvbGxlci5zdHlsZSwiY3Vyc29yIixlKX0sdGhpcy5zZXRNb3VzZUN1cnNvcj1mdW5jdGlvbihlKXtpLnNldFN0eWxlKHRoaXMuc2Nyb2xsZXIuc3R5bGUsImN1cnNvciIsZSl9LHRoaXMuYXR0YWNoVG9TaGFkb3dSb290PWZ1bmN0aW9uKCl7aS5pbXBvcnRDc3NTdHJpbmcodiwiYWNlX2VkaXRvci5jc3MiLHRoaXMuY29udGFpbmVyKX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5mcmVlemUoKSx0aGlzLiRmb250TWV0cmljcy5kZXN0cm95KCksdGhpcy4kY3Vyc29yTGF5ZXIuZGVzdHJveSgpfX0pLmNhbGwoeS5wcm90b3R5cGUpLHMuZGVmaW5lT3B0aW9ucyh5LnByb3RvdHlwZSwicmVuZGVyZXIiLHthbmltYXRlZFNjcm9sbDp7aW5pdGlhbFZhbHVlOiExfSxzaG93SW52aXNpYmxlczp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJHRleHRMYXllci5zZXRTaG93SW52aXNpYmxlcyhlKSYmdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9URVhUKX0saW5pdGlhbFZhbHVlOiExfSxzaG93UHJpbnRNYXJnaW46e3NldDpmdW5jdGlvbigpe3RoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCl9LGluaXRpYWxWYWx1ZTohMH0scHJpbnRNYXJnaW5Db2x1bW46e3NldDpmdW5jdGlvbigpe3RoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCl9LGluaXRpYWxWYWx1ZTo4MH0scHJpbnRNYXJnaW46e3NldDpmdW5jdGlvbihlKXt0eXBlb2YgZT09Im51bWJlciImJih0aGlzLiRwcmludE1hcmdpbkNvbHVtbj1lKSx0aGlzLiRzaG93UHJpbnRNYXJnaW49ISFlLHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRzaG93UHJpbnRNYXJnaW4mJnRoaXMuJHByaW50TWFyZ2luQ29sdW1ufX0sc2hvd0d1dHRlcjp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJGd1dHRlci5zdHlsZS5kaXNwbGF5PWU/ImJsb2NrIjoibm9uZSIsdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKSx0aGlzLm9uR3V0dGVyUmVzaXplKCl9LGluaXRpYWxWYWx1ZTohMH0sZmFkZUZvbGRXaWRnZXRzOntzZXQ6ZnVuY3Rpb24oZSl7aS5zZXRDc3NDbGFzcyh0aGlzLiRndXR0ZXIsImFjZV9mYWRlLWZvbGQtd2lkZ2V0cyIsZSl9LGluaXRpYWxWYWx1ZTohMX0sc2hvd0ZvbGRXaWRnZXRzOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kZ3V0dGVyTGF5ZXIuc2V0U2hvd0ZvbGRXaWRnZXRzKGUpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKX0saW5pdGlhbFZhbHVlOiEwfSxkaXNwbGF5SW5kZW50R3VpZGVzOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kdGV4dExheWVyLnNldERpc3BsYXlJbmRlbnRHdWlkZXMoZSkmJnRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfVEVYVCl9LGluaXRpYWxWYWx1ZTohMH0saGlnaGxpZ2h0R3V0dGVyTGluZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJGd1dHRlckxheWVyLnNldEhpZ2hsaWdodEd1dHRlckxpbmUoZSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpfSxpbml0aWFsVmFsdWU6ITB9LGhTY3JvbGxCYXJBbHdheXNWaXNpYmxlOntzZXQ6ZnVuY3Rpb24oZSl7KCF0aGlzLiRoU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZXx8IXRoaXMuJGhvcml6U2Nyb2xsKSYmdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpfSxpbml0aWFsVmFsdWU6ITF9LHZTY3JvbGxCYXJBbHdheXNWaXNpYmxlOntzZXQ6ZnVuY3Rpb24oZSl7KCF0aGlzLiR2U2Nyb2xsQmFyQWx3YXlzVmlzaWJsZXx8IXRoaXMuJHZTY3JvbGwpJiZ0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1NDUk9MTCl9LGluaXRpYWxWYWx1ZTohMX0sZm9udFNpemU6e3NldDpmdW5jdGlvbihlKXt0eXBlb2YgZT09Im51bWJlciImJihlKz0icHgiKSx0aGlzLmNvbnRhaW5lci5zdHlsZS5mb250U2l6ZT1lLHRoaXMudXBkYXRlRm9udFNpemUoKX0saW5pdGlhbFZhbHVlOjEyfSxmb250RmFtaWx5OntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5jb250YWluZXIuc3R5bGUuZm9udEZhbWlseT1lLHRoaXMudXBkYXRlRm9udFNpemUoKX19LG1heExpbmVzOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy51cGRhdGVGdWxsKCl9fSxtaW5MaW5lczp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJG1pbkxpbmVzPDU2Mjk0OTk1MzQyMTMxMXx8KHRoaXMuJG1pbkxpbmVzPTApLHRoaXMudXBkYXRlRnVsbCgpfX0sbWF4UGl4ZWxIZWlnaHQ6e3NldDpmdW5jdGlvbihlKXt0aGlzLnVwZGF0ZUZ1bGwoKX0saW5pdGlhbFZhbHVlOjB9LHNjcm9sbFBhc3RFbmQ6e3NldDpmdW5jdGlvbihlKXtlPStlfHwwO2lmKHRoaXMuJHNjcm9sbFBhc3RFbmQ9PWUpcmV0dXJuO3RoaXMuJHNjcm9sbFBhc3RFbmQ9ZSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1NDUk9MTCl9LGluaXRpYWxWYWx1ZTowLGhhbmRsZXNTZXQ6ITB9LGZpeGVkV2lkdGhHdXR0ZXI6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRndXR0ZXJMYXllci4kZml4ZWRXaWR0aD0hIWUsdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpfX0sdGhlbWU6e3NldDpmdW5jdGlvbihlKXt0aGlzLnNldFRoZW1lKGUpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdGhlbWVJZHx8dGhpcy50aGVtZX0saW5pdGlhbFZhbHVlOiIuL3RoZW1lL3RleHRtYXRlIixoYW5kbGVzU2V0OiEwfSxoYXNDc3NUcmFuc2Zvcm1zOnt9LHVzZVRleHRhcmVhRm9ySU1FOntpbml0aWFsVmFsdWU6IW0uaXNNb2JpbGUmJiFtLmlzSUV9fSksdC5WaXJ0dWFsUmVuZGVyZXI9eX0pLGFjZS5kZWZpbmUoImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9uZXQiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvY29uZmlnIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB1KGUpe3ZhciB0PSJpbXBvcnRTY3JpcHRzKCciK2kucXVhbGlmeVVSTChlKSsiJyk7Ijt0cnl7cmV0dXJuIG5ldyBCbG9iKFt0XSx7dHlwZToiYXBwbGljYXRpb24vamF2YXNjcmlwdCJ9KX1jYXRjaChuKXt2YXIgcj13aW5kb3cuQmxvYkJ1aWxkZXJ8fHdpbmRvdy5XZWJLaXRCbG9iQnVpbGRlcnx8d2luZG93Lk1vekJsb2JCdWlsZGVyLHM9bmV3IHI7cmV0dXJuIHMuYXBwZW5kKHQpLHMuZ2V0QmxvYigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfX1mdW5jdGlvbiBhKGUpe2lmKHR5cGVvZiBXb3JrZXI9PSJ1bmRlZmluZWQiKXJldHVybntwb3N0TWVzc2FnZTpmdW5jdGlvbigpe30sdGVybWluYXRlOmZ1bmN0aW9uKCl7fX07aWYoby5nZXQoImxvYWRXb3JrZXJGcm9tQmxvYiIpKXt2YXIgdD11KGUpLG49d2luZG93LlVSTHx8d2luZG93LndlYmtpdFVSTCxyPW4uY3JlYXRlT2JqZWN0VVJMKHQpO3JldHVybiBuZXcgV29ya2VyKHIpfXJldHVybiBuZXcgV29ya2VyKGUpfXZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4uL2xpYi9uZXQiKSxzPWUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLG89ZSgiLi4vY29uZmlnIiksZj1mdW5jdGlvbihlKXtlLnBvc3RNZXNzYWdlfHwoZT10aGlzLiRjcmVhdGVXb3JrZXJGcm9tT2xkQ29uZmlnLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdGhpcy4kd29ya2VyPWUsdGhpcy4kc2VuZERlbHRhUXVldWU9dGhpcy4kc2VuZERlbHRhUXVldWUuYmluZCh0aGlzKSx0aGlzLmNoYW5nZUxpc3RlbmVyPXRoaXMuY2hhbmdlTGlzdGVuZXIuYmluZCh0aGlzKSx0aGlzLm9uTWVzc2FnZT10aGlzLm9uTWVzc2FnZS5iaW5kKHRoaXMpLHRoaXMuY2FsbGJhY2tJZD0xLHRoaXMuY2FsbGJhY2tzPXt9LHRoaXMuJHdvcmtlci5vbm1lc3NhZ2U9dGhpcy5vbk1lc3NhZ2V9OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMscyksdGhpcy4kY3JlYXRlV29ya2VyRnJvbU9sZENvbmZpZz1mdW5jdGlvbih0LG4scixpLHMpe2UubmFtZVRvVXJsJiYhZS50b1VybCYmKGUudG9Vcmw9ZS5uYW1lVG9VcmwpO2lmKG8uZ2V0KCJwYWNrYWdlZCIpfHwhZS50b1VybClpPWl8fG8ubW9kdWxlVXJsKG4sIndvcmtlciIpO2Vsc2V7dmFyIHU9dGhpcy4kbm9ybWFsaXplUGF0aDtpPWl8fHUoZS50b1VybCgiYWNlL3dvcmtlci93b3JrZXIuanMiLG51bGwsIl8iKSk7dmFyIGY9e307dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2ZbdF09dShlLnRvVXJsKHQsbnVsbCwiXyIpLnJlcGxhY2UoLyhcLmpzKT8oXD8uKik/JC8sIiIpKX0pfXJldHVybiB0aGlzLiR3b3JrZXI9YShpKSxzJiZ0aGlzLnNlbmQoImltcG9ydFNjcmlwdHMiLHMpLHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7aW5pdDohMCx0bG5zOmYsbW9kdWxlOm4sY2xhc3NuYW1lOnJ9KSx0aGlzLiR3b3JrZXJ9LHRoaXMub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTtzd2l0Y2godC50eXBlKXtjYXNlImV2ZW50Ijp0aGlzLl9zaWduYWwodC5uYW1lLHtkYXRhOnQuZGF0YX0pO2JyZWFrO2Nhc2UiY2FsbCI6dmFyIG49dGhpcy5jYWxsYmFja3NbdC5pZF07biYmKG4odC5kYXRhKSxkZWxldGUgdGhpcy5jYWxsYmFja3NbdC5pZF0pO2JyZWFrO2Nhc2UiZXJyb3IiOnRoaXMucmVwb3J0RXJyb3IodC5kYXRhKTticmVhaztjYXNlImxvZyI6d2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nJiZjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLHQuZGF0YSl9fSx0aGlzLnJlcG9ydEVycm9yPWZ1bmN0aW9uKGUpe3dpbmRvdy5jb25zb2xlJiZjb25zb2xlLmVycm9yJiZjb25zb2xlLmVycm9yKGUpfSx0aGlzLiRub3JtYWxpemVQYXRoPWZ1bmN0aW9uKGUpe3JldHVybiBpLnF1YWxpZnlVUkwoZSl9LHRoaXMudGVybWluYXRlPWZ1bmN0aW9uKCl7dGhpcy5fc2lnbmFsKCJ0ZXJtaW5hdGUiLHt9KSx0aGlzLmRlbHRhUXVldWU9bnVsbCx0aGlzLiR3b3JrZXIudGVybWluYXRlKCksdGhpcy4kd29ya2VyPW51bGwsdGhpcy4kZG9jJiZ0aGlzLiRkb2Mub2ZmKCJjaGFuZ2UiLHRoaXMuY2hhbmdlTGlzdGVuZXIpLHRoaXMuJGRvYz1udWxsfSx0aGlzLnNlbmQ9ZnVuY3Rpb24oZSx0KXt0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6ZSxhcmdzOnR9KX0sdGhpcy5jYWxsPWZ1bmN0aW9uKGUsdCxuKXtpZihuKXt2YXIgcj10aGlzLmNhbGxiYWNrSWQrKzt0aGlzLmNhbGxiYWNrc1tyXT1uLHQucHVzaChyKX10aGlzLnNlbmQoZSx0KX0sdGhpcy5lbWl0PWZ1bmN0aW9uKGUsdCl7dHJ5e3QuZGF0YSYmdC5kYXRhLmVyciYmKHQuZGF0YS5lcnI9e21lc3NhZ2U6dC5kYXRhLmVyci5tZXNzYWdlLHN0YWNrOnQuZGF0YS5lcnIuc3RhY2ssY29kZTp0LmRhdGEuZXJyLmNvZGV9KSx0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OmUsZGF0YTp7ZGF0YTp0LmRhdGF9fSl9Y2F0Y2gobil7Y29uc29sZS5lcnJvcihuLnN0YWNrKX19LHRoaXMuYXR0YWNoVG9Eb2N1bWVudD1mdW5jdGlvbihlKXt0aGlzLiRkb2MmJnRoaXMudGVybWluYXRlKCksdGhpcy4kZG9jPWUsdGhpcy5jYWxsKCJzZXRWYWx1ZSIsW2UuZ2V0VmFsdWUoKV0pLGUub24oImNoYW5nZSIsdGhpcy5jaGFuZ2VMaXN0ZW5lcil9LHRoaXMuY2hhbmdlTGlzdGVuZXI9ZnVuY3Rpb24oZSl7dGhpcy5kZWx0YVF1ZXVlfHwodGhpcy5kZWx0YVF1ZXVlPVtdLHNldFRpbWVvdXQodGhpcy4kc2VuZERlbHRhUXVldWUsMCkpLGUuYWN0aW9uPT0iaW5zZXJ0Ij90aGlzLmRlbHRhUXVldWUucHVzaChlLnN0YXJ0LGUubGluZXMpOnRoaXMuZGVsdGFRdWV1ZS5wdXNoKGUuc3RhcnQsZS5lbmQpfSx0aGlzLiRzZW5kRGVsdGFRdWV1ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZGVsdGFRdWV1ZTtpZighZSlyZXR1cm47dGhpcy5kZWx0YVF1ZXVlPW51bGwsZS5sZW5ndGg+NTAmJmUubGVuZ3RoPnRoaXMuJGRvYy5nZXRMZW5ndGgoKT4+MT90aGlzLmNhbGwoInNldFZhbHVlIixbdGhpcy4kZG9jLmdldFZhbHVlKCldKTp0aGlzLmVtaXQoImNoYW5nZSIse2RhdGE6ZX0pfX0pLmNhbGwoZi5wcm90b3R5cGUpO3ZhciBsPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1udWxsLGk9ITEsdT1PYmplY3QuY3JlYXRlKHMpLGE9W10sbD1uZXcgZih7bWVzc2FnZUJ1ZmZlcjphLHRlcm1pbmF0ZTpmdW5jdGlvbigpe30scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oZSl7YS5wdXNoKGUpO2lmKCFyKXJldHVybjtpP3NldFRpbWVvdXQoYyk6YygpfX0pO2wuc2V0RW1pdFN5bmM9ZnVuY3Rpb24oZSl7aT1lfTt2YXIgYz1mdW5jdGlvbigpe3ZhciBlPWEuc2hpZnQoKTtlLmNvbW1hbmQ/cltlLmNvbW1hbmRdLmFwcGx5KHIsZS5hcmdzKTplLmV2ZW50JiZ1Ll9zaWduYWwoZS5ldmVudCxlLmRhdGEpfTtyZXR1cm4gdS5wb3N0TWVzc2FnZT1mdW5jdGlvbihlKXtsLm9uTWVzc2FnZSh7ZGF0YTplfSl9LHUuY2FsbGJhY2s9ZnVuY3Rpb24oZSx0KXt0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOiJjYWxsIixpZDp0LGRhdGE6ZX0pfSx1LmVtaXQ9ZnVuY3Rpb24oZSx0KXt0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOiJldmVudCIsbmFtZTplLGRhdGE6dH0pfSxvLmxvYWRNb2R1bGUoWyJ3b3JrZXIiLHRdLGZ1bmN0aW9uKGUpe3I9bmV3IGVbbl0odSk7d2hpbGUoYS5sZW5ndGgpYygpfSksbH07dC5VSVdvcmtlckNsaWVudD1sLHQuV29ya2VyQ2xpZW50PWYsdC5jcmVhdGVXb3JrZXI9YX0pLGFjZS5kZWZpbmUoImFjZS9wbGFjZWhvbGRlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9saWIvb29wIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL3JhbmdlIikuUmFuZ2UsaT1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHM9ZSgiLi9saWIvb29wIiksbz1mdW5jdGlvbihlLHQsbixyLGkscyl7dmFyIG89dGhpczt0aGlzLmxlbmd0aD10LHRoaXMuc2Vzc2lvbj1lLHRoaXMuZG9jPWUuZ2V0RG9jdW1lbnQoKSx0aGlzLm1haW5DbGFzcz1pLHRoaXMub3RoZXJzQ2xhc3M9cyx0aGlzLiRvblVwZGF0ZT10aGlzLm9uVXBkYXRlLmJpbmQodGhpcyksdGhpcy5kb2Mub24oImNoYW5nZSIsdGhpcy4kb25VcGRhdGUpLHRoaXMuJG90aGVycz1yLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlPWZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe28ub25DdXJzb3JDaGFuZ2UoKX0pfSx0aGlzLiRwb3M9bjt2YXIgdT1lLmdldFVuZG9NYW5hZ2VyKCkuJHVuZG9TdGFja3x8ZS5nZXRVbmRvTWFuYWdlcigpLiR1bmRvc3RhY2t8fHtsZW5ndGg6LTF9O3RoaXMuJHVuZG9TdGFja0RlcHRoPXUubGVuZ3RoLHRoaXMuc2V0dXAoKSxlLnNlbGVjdGlvbi5vbigiY2hhbmdlQ3Vyc29yIix0aGlzLiRvbkN1cnNvckNoYW5nZSl9OyhmdW5jdGlvbigpe3MuaW1wbGVtZW50KHRoaXMsaSksdGhpcy5zZXR1cD1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLmRvYyxuPXRoaXMuc2Vzc2lvbjt0aGlzLnNlbGVjdGlvbkJlZm9yZT1uLnNlbGVjdGlvbi50b0pTT04oKSxuLnNlbGVjdGlvbi5pbk11bHRpU2VsZWN0TW9kZSYmbi5zZWxlY3Rpb24udG9TaW5nbGVSYW5nZSgpLHRoaXMucG9zPXQuY3JlYXRlQW5jaG9yKHRoaXMuJHBvcy5yb3csdGhpcy4kcG9zLmNvbHVtbik7dmFyIGk9dGhpcy5wb3M7aS4kaW5zZXJ0UmlnaHQ9ITAsaS5kZXRhY2goKSxpLm1hcmtlcklkPW4uYWRkTWFya2VyKG5ldyByKGkucm93LGkuY29sdW1uLGkucm93LGkuY29sdW1uK3RoaXMubGVuZ3RoKSx0aGlzLm1haW5DbGFzcyxudWxsLCExKSx0aGlzLm90aGVycz1bXSx0aGlzLiRvdGhlcnMuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgcj10LmNyZWF0ZUFuY2hvcihuLnJvdyxuLmNvbHVtbik7ci4kaW5zZXJ0UmlnaHQ9ITAsci5kZXRhY2goKSxlLm90aGVycy5wdXNoKHIpfSksbi5zZXRVbmRvU2VsZWN0KCExKX0sdGhpcy5zaG93T3RoZXJNYXJrZXJzPWZ1bmN0aW9uKCl7aWYodGhpcy5vdGhlcnNBY3RpdmUpcmV0dXJuO3ZhciBlPXRoaXMuc2Vzc2lvbix0PXRoaXM7dGhpcy5vdGhlcnNBY3RpdmU9ITAsdGhpcy5vdGhlcnMuZm9yRWFjaChmdW5jdGlvbihuKXtuLm1hcmtlcklkPWUuYWRkTWFya2VyKG5ldyByKG4ucm93LG4uY29sdW1uLG4ucm93LG4uY29sdW1uK3QubGVuZ3RoKSx0Lm90aGVyc0NsYXNzLG51bGwsITEpfSl9LHRoaXMuaGlkZU90aGVyTWFya2Vycz1mdW5jdGlvbigpe2lmKCF0aGlzLm90aGVyc0FjdGl2ZSlyZXR1cm47dGhpcy5vdGhlcnNBY3RpdmU9ITE7Zm9yKHZhciBlPTA7ZTx0aGlzLm90aGVycy5sZW5ndGg7ZSsrKXRoaXMuc2Vzc2lvbi5yZW1vdmVNYXJrZXIodGhpcy5vdGhlcnNbZV0ubWFya2VySWQpfSx0aGlzLm9uVXBkYXRlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJHVwZGF0aW5nKXJldHVybiB0aGlzLnVwZGF0ZUFuY2hvcnMoZSk7dmFyIHQ9ZTtpZih0LnN0YXJ0LnJvdyE9PXQuZW5kLnJvdylyZXR1cm47aWYodC5zdGFydC5yb3chPT10aGlzLnBvcy5yb3cpcmV0dXJuO3RoaXMuJHVwZGF0aW5nPSEwO3ZhciBuPWUuYWN0aW9uPT09Imluc2VydCI/dC5lbmQuY29sdW1uLXQuc3RhcnQuY29sdW1uOnQuc3RhcnQuY29sdW1uLXQuZW5kLmNvbHVtbixpPXQuc3RhcnQuY29sdW1uPj10aGlzLnBvcy5jb2x1bW4mJnQuc3RhcnQuY29sdW1uPD10aGlzLnBvcy5jb2x1bW4rdGhpcy5sZW5ndGgrMSxzPXQuc3RhcnQuY29sdW1uLXRoaXMucG9zLmNvbHVtbjt0aGlzLnVwZGF0ZUFuY2hvcnMoZSksaSYmKHRoaXMubGVuZ3RoKz1uKTtpZihpJiYhdGhpcy5zZXNzaW9uLiRmcm9tVW5kbylpZihlLmFjdGlvbj09PSJpbnNlcnQiKWZvcih2YXIgbz10aGlzLm90aGVycy5sZW5ndGgtMTtvPj0wO28tLSl7dmFyIHU9dGhpcy5vdGhlcnNbb10sYT17cm93OnUucm93LGNvbHVtbjp1LmNvbHVtbitzfTt0aGlzLmRvYy5pbnNlcnRNZXJnZWRMaW5lcyhhLGUubGluZXMpfWVsc2UgaWYoZS5hY3Rpb249PT0icmVtb3ZlIilmb3IodmFyIG89dGhpcy5vdGhlcnMubGVuZ3RoLTE7bz49MDtvLS0pe3ZhciB1PXRoaXMub3RoZXJzW29dLGE9e3Jvdzp1LnJvdyxjb2x1bW46dS5jb2x1bW4rc307dGhpcy5kb2MucmVtb3ZlKG5ldyByKGEucm93LGEuY29sdW1uLGEucm93LGEuY29sdW1uLW4pKX10aGlzLiR1cGRhdGluZz0hMSx0aGlzLnVwZGF0ZU1hcmtlcnMoKX0sdGhpcy51cGRhdGVBbmNob3JzPWZ1bmN0aW9uKGUpe3RoaXMucG9zLm9uQ2hhbmdlKGUpO2Zvcih2YXIgdD10aGlzLm90aGVycy5sZW5ndGg7dC0tOyl0aGlzLm90aGVyc1t0XS5vbkNoYW5nZShlKTt0aGlzLnVwZGF0ZU1hcmtlcnMoKX0sdGhpcy51cGRhdGVNYXJrZXJzPWZ1bmN0aW9uKCl7aWYodGhpcy4kdXBkYXRpbmcpcmV0dXJuO3ZhciBlPXRoaXMsdD10aGlzLnNlc3Npb24sbj1mdW5jdGlvbihuLGkpe3QucmVtb3ZlTWFya2VyKG4ubWFya2VySWQpLG4ubWFya2VySWQ9dC5hZGRNYXJrZXIobmV3IHIobi5yb3csbi5jb2x1bW4sbi5yb3csbi5jb2x1bW4rZS5sZW5ndGgpLGksbnVsbCwhMSl9O24odGhpcy5wb3MsdGhpcy5tYWluQ2xhc3MpO2Zvcih2YXIgaT10aGlzLm90aGVycy5sZW5ndGg7aS0tOyluKHRoaXMub3RoZXJzW2ldLHRoaXMub3RoZXJzQ2xhc3MpfSx0aGlzLm9uQ3Vyc29yQ2hhbmdlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJHVwZGF0aW5nfHwhdGhpcy5zZXNzaW9uKXJldHVybjt2YXIgdD10aGlzLnNlc3Npb24uc2VsZWN0aW9uLmdldEN1cnNvcigpO3Qucm93PT09dGhpcy5wb3Mucm93JiZ0LmNvbHVtbj49dGhpcy5wb3MuY29sdW1uJiZ0LmNvbHVtbjw9dGhpcy5wb3MuY29sdW1uK3RoaXMubGVuZ3RoPyh0aGlzLnNob3dPdGhlck1hcmtlcnMoKSx0aGlzLl9lbWl0KCJjdXJzb3JFbnRlciIsZSkpOih0aGlzLmhpZGVPdGhlck1hcmtlcnMoKSx0aGlzLl9lbWl0KCJjdXJzb3JMZWF2ZSIsZSkpfSx0aGlzLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi5yZW1vdmVNYXJrZXIodGhpcy5wb3MmJnRoaXMucG9zLm1hcmtlcklkKSx0aGlzLmhpZGVPdGhlck1hcmtlcnMoKSx0aGlzLmRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHRoaXMuJG9uVXBkYXRlKSx0aGlzLnNlc3Npb24uc2VsZWN0aW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZUN1cnNvciIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpLHRoaXMuc2Vzc2lvbi5zZXRVbmRvU2VsZWN0KCEwKSx0aGlzLnNlc3Npb249bnVsbH0sdGhpcy5jYW5jZWw9ZnVuY3Rpb24oKXtpZih0aGlzLiR1bmRvU3RhY2tEZXB0aD09PS0xKXJldHVybjt2YXIgZT10aGlzLnNlc3Npb24uZ2V0VW5kb01hbmFnZXIoKSx0PShlLiR1bmRvU3RhY2t8fGUuJHVuZG9zdGFjaykubGVuZ3RoLXRoaXMuJHVuZG9TdGFja0RlcHRoO2Zvcih2YXIgbj0wO248dDtuKyspZS51bmRvKHRoaXMuc2Vzc2lvbiwhMCk7dGhpcy5zZWxlY3Rpb25CZWZvcmUmJnRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24uZnJvbUpTT04odGhpcy5zZWxlY3Rpb25CZWZvcmUpfX0pLmNhbGwoby5wcm90b3R5cGUpLHQuUGxhY2VIb2xkZXI9b30pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS9tdWx0aV9zZWxlY3RfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiBzKGUsdCl7cmV0dXJuIGUucm93PT10LnJvdyYmZS5jb2x1bW49PXQuY29sdW1ufWZ1bmN0aW9uIG8oZSl7dmFyIHQ9ZS5kb21FdmVudCxuPXQuYWx0S2V5LG89dC5zaGlmdEtleSx1PXQuY3RybEtleSxhPWUuZ2V0QWNjZWxLZXkoKSxmPWUuZ2V0QnV0dG9uKCk7dSYmaS5pc01hYyYmKGY9dC5idXR0b24pO2lmKGUuZWRpdG9yLmluTXVsdGlTZWxlY3RNb2RlJiZmPT0yKXtlLmVkaXRvci50ZXh0SW5wdXQub25Db250ZXh0TWVudShlLmRvbUV2ZW50KTtyZXR1cm59aWYoIXUmJiFuJiYhYSl7Zj09PTAmJmUuZWRpdG9yLmluTXVsdGlTZWxlY3RNb2RlJiZlLmVkaXRvci5leGl0TXVsdGlTZWxlY3RNb2RlKCk7cmV0dXJufWlmKGYhPT0wKXJldHVybjt2YXIgbD1lLmVkaXRvcixjPWwuc2VsZWN0aW9uLGg9bC5pbk11bHRpU2VsZWN0TW9kZSxwPWUuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLGQ9Yy5nZXRDdXJzb3IoKSx2PWUuaW5TZWxlY3Rpb24oKXx8Yy5pc0VtcHR5KCkmJnMocCxkKSxtPWUueCxnPWUueSx5PWZ1bmN0aW9uKGUpe209ZS5jbGllbnRYLGc9ZS5jbGllbnRZfSxiPWwuc2Vzc2lvbix3PWwucmVuZGVyZXIucGl4ZWxUb1NjcmVlbkNvb3JkaW5hdGVzKG0sZyksRT13LFM7aWYobC4kbW91c2VIYW5kbGVyLiRlbmFibGVKdW1wVG9EZWYpdSYmbnx8YSYmbj9TPW8/ImJsb2NrIjoiYWRkIjpuJiZsLiRibG9ja1NlbGVjdEVuYWJsZWQmJihTPSJibG9jayIpO2Vsc2UgaWYoYSYmIW4pe1M9ImFkZCI7aWYoIWgmJm8pcmV0dXJufWVsc2UgbiYmbC4kYmxvY2tTZWxlY3RFbmFibGVkJiYoUz0iYmxvY2siKTtTJiZpLmlzTWFjJiZ0LmN0cmxLZXkmJmwuJG1vdXNlSGFuZGxlci5jYW5jZWxDb250ZXh0TWVudSgpO2lmKFM9PSJhZGQiKXtpZighaCYmdilyZXR1cm47aWYoIWgpe3ZhciB4PWMudG9PcmllbnRlZFJhbmdlKCk7bC5hZGRTZWxlY3Rpb25NYXJrZXIoeCl9dmFyIFQ9Yy5yYW5nZUxpc3QucmFuZ2VBdFBvaW50KHApO2wuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMCxvJiYoVD1udWxsLHg9Yy5yYW5nZXNbMF18fHgsbC5yZW1vdmVTZWxlY3Rpb25NYXJrZXIoeCkpLGwub25jZSgibW91c2V1cCIsZnVuY3Rpb24oKXt2YXIgZT1jLnRvT3JpZW50ZWRSYW5nZSgpO1QmJmUuaXNFbXB0eSgpJiZzKFQuY3Vyc29yLGUuY3Vyc29yKT9jLnN1YnN0cmFjdFBvaW50KGUuY3Vyc29yKToobz9jLnN1YnN0cmFjdFBvaW50KHguY3Vyc29yKTp4JiYobC5yZW1vdmVTZWxlY3Rpb25NYXJrZXIoeCksYy5hZGRSYW5nZSh4KSksYy5hZGRSYW5nZShlKSksbC5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSExfSl9ZWxzZSBpZihTPT0iYmxvY2siKXtlLnN0b3AoKSxsLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITA7dmFyIE4sQz1bXSxrPWZ1bmN0aW9uKCl7dmFyIGU9bC5yZW5kZXJlci5waXhlbFRvU2NyZWVuQ29vcmRpbmF0ZXMobSxnKSx0PWIuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGUucm93LGUuY29sdW1uLGUub2Zmc2V0WCk7aWYocyhFLGUpJiZzKHQsYy5sZWFkKSlyZXR1cm47RT1lLGwuc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKHQpLGwucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKSxsLnJlbW92ZVNlbGVjdGlvbk1hcmtlcnMoQyksQz1jLnJlY3Rhbmd1bGFyUmFuZ2VCbG9jayhFLHcpLGwuJG1vdXNlSGFuZGxlci4kY2xpY2tTZWxlY3Rpb24mJkMubGVuZ3RoPT0xJiZDWzBdLmlzRW1wdHkoKSYmKENbMF09bC4kbW91c2VIYW5kbGVyLiRjbGlja1NlbGVjdGlvbi5jbG9uZSgpKSxDLmZvckVhY2gobC5hZGRTZWxlY3Rpb25NYXJrZXIsbCksbC51cGRhdGVTZWxlY3Rpb25NYXJrZXJzKCl9O2gmJiFhP2MudG9TaW5nbGVSYW5nZSgpOiFoJiZhJiYoTj1jLnRvT3JpZW50ZWRSYW5nZSgpLGwuYWRkU2VsZWN0aW9uTWFya2VyKE4pKSxvP3c9Yi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oYy5sZWFkKTpjLm1vdmVUb1Bvc2l0aW9uKHApLEU9e3JvdzotMSxjb2x1bW46LTF9O3ZhciBMPWZ1bmN0aW9uKGUpe2soKSxjbGVhckludGVydmFsKE8pLGwucmVtb3ZlU2VsZWN0aW9uTWFya2VycyhDKSxDLmxlbmd0aHx8KEM9W2MudG9PcmllbnRlZFJhbmdlKCldKSxOJiYobC5yZW1vdmVTZWxlY3Rpb25NYXJrZXIoTiksYy50b1NpbmdsZVJhbmdlKE4pKTtmb3IodmFyIHQ9MDt0PEMubGVuZ3RoO3QrKyljLmFkZFJhbmdlKENbdF0pO2wuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMSxsLiRtb3VzZUhhbmRsZXIuJGNsaWNrU2VsZWN0aW9uPW51bGx9LEE9aztyLmNhcHR1cmUobC5jb250YWluZXIseSxMKTt2YXIgTz1zZXRJbnRlcnZhbChmdW5jdGlvbigpe0EoKX0sMjApO3JldHVybiBlLnByZXZlbnREZWZhdWx0KCl9fXZhciByPWUoIi4uL2xpYi9ldmVudCIpLGk9ZSgiLi4vbGliL3VzZXJhZ2VudCIpO3Qub25Nb3VzZURvd249b30pLGFjZS5kZWZpbmUoImFjZS9jb21tYW5kcy9tdWx0aV9zZWxlY3RfY29tbWFuZHMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2Uva2V5Ym9hcmQvaGFzaF9oYW5kbGVyIl0sZnVuY3Rpb24oZSx0LG4pe3QuZGVmYXVsdENvbW1hbmRzPVt7bmFtZToiYWRkQ3Vyc29yQWJvdmUiLGRlc2NyaXB0aW9uOiJBZGQgY3Vyc29yIGFib3ZlIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZUxpbmVzKC0xKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1VcCIsbWFjOiJDdHJsLUFsdC1VcCJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiYWRkQ3Vyc29yQmVsb3ciLGRlc2NyaXB0aW9uOiJBZGQgY3Vyc29yIGJlbG93IixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZUxpbmVzKDEpfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LURvd24iLG1hYzoiQ3RybC1BbHQtRG93biJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiYWRkQ3Vyc29yQWJvdmVTa2lwQ3VycmVudCIsZGVzY3JpcHRpb246IkFkZCBjdXJzb3IgYWJvdmUgKHNraXAgY3VycmVudCkiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlTGluZXMoLTEsITApfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LVNoaWZ0LVVwIixtYWM6IkN0cmwtQWx0LVNoaWZ0LVVwIn0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJhZGRDdXJzb3JCZWxvd1NraXBDdXJyZW50IixkZXNjcmlwdGlvbjoiQWRkIGN1cnNvciBiZWxvdyAoc2tpcCBjdXJyZW50KSIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmVMaW5lcygxLCEwKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1TaGlmdC1Eb3duIixtYWM6IkN0cmwtQWx0LVNoaWZ0LURvd24ifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdE1vcmVCZWZvcmUiLGRlc2NyaXB0aW9uOiJTZWxlY3QgbW9yZSBiZWZvcmUiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlKC0xKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1MZWZ0IixtYWM6IkN0cmwtQWx0LUxlZnQifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdE1vcmVBZnRlciIsZGVzY3JpcHRpb246IlNlbGVjdCBtb3JlIGFmdGVyIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZSgxKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1SaWdodCIsbWFjOiJDdHJsLUFsdC1SaWdodCJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0TmV4dEJlZm9yZSIsZGVzY3JpcHRpb246IlNlbGVjdCBuZXh0IGJlZm9yZSIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmUoLTEsITApfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LVNoaWZ0LUxlZnQiLG1hYzoiQ3RybC1BbHQtU2hpZnQtTGVmdCJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0TmV4dEFmdGVyIixkZXNjcmlwdGlvbjoiU2VsZWN0IG5leHQgYWZ0ZXIiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlKDEsITApfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LVNoaWZ0LVJpZ2h0IixtYWM6IkN0cmwtQWx0LVNoaWZ0LVJpZ2h0In0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzcGxpdEludG9MaW5lcyIsZGVzY3JpcHRpb246IlNwbGl0IGludG8gbGluZXMiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5tdWx0aVNlbGVjdC5zcGxpdEludG9MaW5lcygpfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LUwiLG1hYzoiQ3RybC1BbHQtTCJ9LHJlYWRPbmx5OiEwfSx7bmFtZToiYWxpZ25DdXJzb3JzIixkZXNjcmlwdGlvbjoiQWxpZ24gY3Vyc29ycyIsZXhlYzpmdW5jdGlvbihlKXtlLmFsaWduQ3Vyc29ycygpfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LUEiLG1hYzoiQ3RybC1BbHQtQSJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToiZmluZEFsbCIsZGVzY3JpcHRpb246IkZpbmQgYWxsIixleGVjOmZ1bmN0aW9uKGUpe2UuZmluZEFsbCgpfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LUsiLG1hYzoiQ3RybC1BbHQtRyJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfV0sdC5tdWx0aVNlbGVjdENvbW1hbmRzPVt7bmFtZToic2luZ2xlU2VsZWN0aW9uIixkZXNjcmlwdGlvbjoiU2luZ2xlIHNlbGVjdGlvbiIsYmluZEtleToiZXNjIixleGVjOmZ1bmN0aW9uKGUpe2UuZXhpdE11bHRpU2VsZWN0TW9kZSgpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMCxpc0F2YWlsYWJsZTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5pbk11bHRpU2VsZWN0TW9kZX19XTt2YXIgcj1lKCIuLi9rZXlib2FyZC9oYXNoX2hhbmRsZXIiKS5IYXNoSGFuZGxlcjt0LmtleWJvYXJkSGFuZGxlcj1uZXcgcih0Lm11bHRpU2VsZWN0Q29tbWFuZHMpfSksYWNlLmRlZmluZSgiYWNlL211bHRpX3NlbGVjdCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZV9saXN0IiwiYWNlL3JhbmdlIiwiYWNlL3NlbGVjdGlvbiIsImFjZS9tb3VzZS9tdWx0aV9zZWxlY3RfaGFuZGxlciIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL2xhbmciLCJhY2UvY29tbWFuZHMvbXVsdGlfc2VsZWN0X2NvbW1hbmRzIiwiYWNlL3NlYXJjaCIsImFjZS9lZGl0X3Nlc3Npb24iLCJhY2UvZWRpdG9yIiwiYWNlL2NvbmZpZyJdLGZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiBoKGUsdCxuKXtyZXR1cm4gYy4kb3B0aW9ucy53cmFwPSEwLGMuJG9wdGlvbnMubmVlZGxlPXQsYy4kb3B0aW9ucy5iYWNrd2FyZHM9bj09LTEsYy5maW5kKGUpfWZ1bmN0aW9uIHYoZSx0KXtyZXR1cm4gZS5yb3c9PXQucm93JiZlLmNvbHVtbj09dC5jb2x1bW59ZnVuY3Rpb24gbShlKXtpZihlLiRtdWx0aXNlbGVjdE9uU2Vzc2lvbkNoYW5nZSlyZXR1cm47ZS4kb25BZGRSYW5nZT1lLiRvbkFkZFJhbmdlLmJpbmQoZSksZS4kb25SZW1vdmVSYW5nZT1lLiRvblJlbW92ZVJhbmdlLmJpbmQoZSksZS4kb25NdWx0aVNlbGVjdD1lLiRvbk11bHRpU2VsZWN0LmJpbmQoZSksZS4kb25TaW5nbGVTZWxlY3Q9ZS4kb25TaW5nbGVTZWxlY3QuYmluZChlKSxlLiRtdWx0aXNlbGVjdE9uU2Vzc2lvbkNoYW5nZT10Lm9uU2Vzc2lvbkNoYW5nZS5iaW5kKGUpLGUuJGNoZWNrTXVsdGlzZWxlY3RDaGFuZ2U9ZS4kY2hlY2tNdWx0aXNlbGVjdENoYW5nZS5iaW5kKGUpLGUuJG11bHRpc2VsZWN0T25TZXNzaW9uQ2hhbmdlKGUpLGUub24oImNoYW5nZVNlc3Npb24iLGUuJG11bHRpc2VsZWN0T25TZXNzaW9uQ2hhbmdlKSxlLm9uKCJtb3VzZWRvd24iLG8pLGUuY29tbWFuZHMuYWRkQ29tbWFuZHMoZi5kZWZhdWx0Q29tbWFuZHMpLGcoZSl9ZnVuY3Rpb24gZyhlKXtmdW5jdGlvbiByKHQpe24mJihlLnJlbmRlcmVyLnNldE1vdXNlQ3Vyc29yKCIiKSxuPSExKX1pZighZS50ZXh0SW5wdXQpcmV0dXJuO3ZhciB0PWUudGV4dElucHV0LmdldEVsZW1lbnQoKSxuPSExO3UuYWRkTGlzdGVuZXIodCwia2V5ZG93biIsZnVuY3Rpb24odCl7dmFyIGk9dC5rZXlDb2RlPT0xOCYmISh0LmN0cmxLZXl8fHQuc2hpZnRLZXl8fHQubWV0YUtleSk7ZS4kYmxvY2tTZWxlY3RFbmFibGVkJiZpP258fChlLnJlbmRlcmVyLnNldE1vdXNlQ3Vyc29yKCJjcm9zc2hhaXIiKSxuPSEwKTpuJiZyKCl9KSx1LmFkZExpc3RlbmVyKHQsImtleXVwIixyKSx1LmFkZExpc3RlbmVyKHQsImJsdXIiLHIpfXZhciByPWUoIi4vcmFuZ2VfbGlzdCIpLlJhbmdlTGlzdCxpPWUoIi4vcmFuZ2UiKS5SYW5nZSxzPWUoIi4vc2VsZWN0aW9uIikuU2VsZWN0aW9uLG89ZSgiLi9tb3VzZS9tdWx0aV9zZWxlY3RfaGFuZGxlciIpLm9uTW91c2VEb3duLHU9ZSgiLi9saWIvZXZlbnQiKSxhPWUoIi4vbGliL2xhbmciKSxmPWUoIi4vY29tbWFuZHMvbXVsdGlfc2VsZWN0X2NvbW1hbmRzIik7dC5jb21tYW5kcz1mLmRlZmF1bHRDb21tYW5kcy5jb25jYXQoZi5tdWx0aVNlbGVjdENvbW1hbmRzKTt2YXIgbD1lKCIuL3NlYXJjaCIpLlNlYXJjaCxjPW5ldyBsLHA9ZSgiLi9lZGl0X3Nlc3Npb24iKS5FZGl0U2Vzc2lvbjsoZnVuY3Rpb24oKXt0aGlzLmdldFNlbGVjdGlvbk1hcmtlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2VsZWN0aW9uTWFya2Vyc319KS5jYWxsKHAucHJvdG90eXBlKSxmdW5jdGlvbigpe3RoaXMucmFuZ2VzPW51bGwsdGhpcy5yYW5nZUxpc3Q9bnVsbCx0aGlzLmFkZFJhbmdlPWZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuO2lmKCF0aGlzLmluTXVsdGlTZWxlY3RNb2RlJiZ0aGlzLnJhbmdlQ291bnQ9PT0wKXt2YXIgbj10aGlzLnRvT3JpZW50ZWRSYW5nZSgpO3RoaXMucmFuZ2VMaXN0LmFkZChuKSx0aGlzLnJhbmdlTGlzdC5hZGQoZSk7aWYodGhpcy5yYW5nZUxpc3QucmFuZ2VzLmxlbmd0aCE9MilyZXR1cm4gdGhpcy5yYW5nZUxpc3QucmVtb3ZlQWxsKCksdHx8dGhpcy5mcm9tT3JpZW50ZWRSYW5nZShlKTt0aGlzLnJhbmdlTGlzdC5yZW1vdmVBbGwoKSx0aGlzLnJhbmdlTGlzdC5hZGQobiksdGhpcy4kb25BZGRSYW5nZShuKX1lLmN1cnNvcnx8KGUuY3Vyc29yPWUuZW5kKTt2YXIgcj10aGlzLnJhbmdlTGlzdC5hZGQoZSk7cmV0dXJuIHRoaXMuJG9uQWRkUmFuZ2UoZSksci5sZW5ndGgmJnRoaXMuJG9uUmVtb3ZlUmFuZ2UociksdGhpcy5yYW5nZUNvdW50PjEmJiF0aGlzLmluTXVsdGlTZWxlY3RNb2RlJiYodGhpcy5fc2lnbmFsKCJtdWx0aVNlbGVjdCIpLHRoaXMuaW5NdWx0aVNlbGVjdE1vZGU9ITAsdGhpcy5zZXNzaW9uLiR1bmRvU2VsZWN0PSExLHRoaXMucmFuZ2VMaXN0LmF0dGFjaCh0aGlzLnNlc3Npb24pKSx0fHx0aGlzLmZyb21PcmllbnRlZFJhbmdlKGUpfSx0aGlzLnRvU2luZ2xlUmFuZ2U9ZnVuY3Rpb24oZSl7ZT1lfHx0aGlzLnJhbmdlc1swXTt2YXIgdD10aGlzLnJhbmdlTGlzdC5yZW1vdmVBbGwoKTt0Lmxlbmd0aCYmdGhpcy4kb25SZW1vdmVSYW5nZSh0KSxlJiZ0aGlzLmZyb21PcmllbnRlZFJhbmdlKGUpfSx0aGlzLnN1YnN0cmFjdFBvaW50PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucmFuZ2VMaXN0LnN1YnN0cmFjdFBvaW50KGUpO2lmKHQpcmV0dXJuIHRoaXMuJG9uUmVtb3ZlUmFuZ2UodCksdFswXX0sdGhpcy5tZXJnZU92ZXJsYXBwaW5nUmFuZ2VzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yYW5nZUxpc3QubWVyZ2UoKTtlLmxlbmd0aCYmdGhpcy4kb25SZW1vdmVSYW5nZShlKX0sdGhpcy4kb25BZGRSYW5nZT1mdW5jdGlvbihlKXt0aGlzLnJhbmdlQ291bnQ9dGhpcy5yYW5nZUxpc3QucmFuZ2VzLmxlbmd0aCx0aGlzLnJhbmdlcy51bnNoaWZ0KGUpLHRoaXMuX3NpZ25hbCgiYWRkUmFuZ2UiLHtyYW5nZTplfSl9LHRoaXMuJG9uUmVtb3ZlUmFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy5yYW5nZUNvdW50PXRoaXMucmFuZ2VMaXN0LnJhbmdlcy5sZW5ndGg7aWYodGhpcy5yYW5nZUNvdW50PT0xJiZ0aGlzLmluTXVsdGlTZWxlY3RNb2RlKXt2YXIgdD10aGlzLnJhbmdlTGlzdC5yYW5nZXMucG9wKCk7ZS5wdXNoKHQpLHRoaXMucmFuZ2VDb3VudD0wfWZvcih2YXIgbj1lLmxlbmd0aDtuLS07KXt2YXIgcj10aGlzLnJhbmdlcy5pbmRleE9mKGVbbl0pO3RoaXMucmFuZ2VzLnNwbGljZShyLDEpfXRoaXMuX3NpZ25hbCgicmVtb3ZlUmFuZ2UiLHtyYW5nZXM6ZX0pLHRoaXMucmFuZ2VDb3VudD09PTAmJnRoaXMuaW5NdWx0aVNlbGVjdE1vZGUmJih0aGlzLmluTXVsdGlTZWxlY3RNb2RlPSExLHRoaXMuX3NpZ25hbCgic2luZ2xlU2VsZWN0IiksdGhpcy5zZXNzaW9uLiR1bmRvU2VsZWN0PSEwLHRoaXMucmFuZ2VMaXN0LmRldGFjaCh0aGlzLnNlc3Npb24pKSx0PXR8fHRoaXMucmFuZ2VzWzBdLHQmJiF0LmlzRXF1YWwodGhpcy5nZXRSYW5nZSgpKSYmdGhpcy5mcm9tT3JpZW50ZWRSYW5nZSh0KX0sdGhpcy4kaW5pdFJhbmdlTGlzdD1mdW5jdGlvbigpe2lmKHRoaXMucmFuZ2VMaXN0KXJldHVybjt0aGlzLnJhbmdlTGlzdD1uZXcgcix0aGlzLnJhbmdlcz1bXSx0aGlzLnJhbmdlQ291bnQ9MH0sdGhpcy5nZXRBbGxSYW5nZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5nZUNvdW50P3RoaXMucmFuZ2VMaXN0LnJhbmdlcy5jb25jYXQoKTpbdGhpcy5nZXRSYW5nZSgpXX0sdGhpcy5zcGxpdEludG9MaW5lcz1mdW5jdGlvbigpe2lmKHRoaXMucmFuZ2VDb3VudD4xKXt2YXIgZT10aGlzLnJhbmdlTGlzdC5yYW5nZXMsdD1lW2UubGVuZ3RoLTFdLG49aS5mcm9tUG9pbnRzKGVbMF0uc3RhcnQsdC5lbmQpO3RoaXMudG9TaW5nbGVSYW5nZSgpLHRoaXMuc2V0U2VsZWN0aW9uUmFuZ2Uobix0LmN1cnNvcj09dC5zdGFydCl9ZWxzZXt2YXIgbj10aGlzLmdldFJhbmdlKCkscj10aGlzLmlzQmFja3dhcmRzKCkscz1uLnN0YXJ0LnJvdyxvPW4uZW5kLnJvdztpZihzPT1vKXtpZihyKXZhciB1PW4uZW5kLGE9bi5zdGFydDtlbHNlIHZhciB1PW4uc3RhcnQsYT1uLmVuZDt0aGlzLmFkZFJhbmdlKGkuZnJvbVBvaW50cyhhLGEpKSx0aGlzLmFkZFJhbmdlKGkuZnJvbVBvaW50cyh1LHUpKTtyZXR1cm59dmFyIGY9W10sbD10aGlzLmdldExpbmVSYW5nZShzLCEwKTtsLnN0YXJ0LmNvbHVtbj1uLnN0YXJ0LmNvbHVtbixmLnB1c2gobCk7Zm9yKHZhciBjPXMrMTtjPG87YysrKWYucHVzaCh0aGlzLmdldExpbmVSYW5nZShjLCEwKSk7bD10aGlzLmdldExpbmVSYW5nZShvLCEwKSxsLmVuZC5jb2x1bW49bi5lbmQuY29sdW1uLGYucHVzaChsKSxmLmZvckVhY2godGhpcy5hZGRSYW5nZSx0aGlzKX19LHRoaXMudG9nZ2xlQmxvY2tTZWxlY3Rpb249ZnVuY3Rpb24oKXtpZih0aGlzLnJhbmdlQ291bnQ+MSl7dmFyIGU9dGhpcy5yYW5nZUxpc3QucmFuZ2VzLHQ9ZVtlLmxlbmd0aC0xXSxuPWkuZnJvbVBvaW50cyhlWzBdLnN0YXJ0LHQuZW5kKTt0aGlzLnRvU2luZ2xlUmFuZ2UoKSx0aGlzLnNldFNlbGVjdGlvblJhbmdlKG4sdC5jdXJzb3I9PXQuc3RhcnQpfWVsc2V7dmFyIHI9dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmN1cnNvcikscz10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuYW5jaG9yKSxvPXRoaXMucmVjdGFuZ3VsYXJSYW5nZUJsb2NrKHIscyk7by5mb3JFYWNoKHRoaXMuYWRkUmFuZ2UsdGhpcyl9fSx0aGlzLnJlY3Rhbmd1bGFyUmFuZ2VCbG9jaz1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10scz1lLmNvbHVtbjx0LmNvbHVtbjtpZihzKXZhciBvPWUuY29sdW1uLHU9dC5jb2x1bW4sYT1lLm9mZnNldFgsZj10Lm9mZnNldFg7ZWxzZSB2YXIgbz10LmNvbHVtbix1PWUuY29sdW1uLGE9dC5vZmZzZXRYLGY9ZS5vZmZzZXRYO3ZhciBsPWUucm93PHQucm93O2lmKGwpdmFyIGM9ZS5yb3csaD10LnJvdztlbHNlIHZhciBjPXQucm93LGg9ZS5yb3c7bzwwJiYobz0wKSxjPDAmJihjPTApLGM9PWgmJihuPSEwKTt2YXIgcDtmb3IodmFyIGQ9YztkPD1oO2QrKyl7dmFyIG09aS5mcm9tUG9pbnRzKHRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZCxvLGEpLHRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZCx1LGYpKTtpZihtLmlzRW1wdHkoKSl7aWYocCYmdihtLmVuZCxwKSlicmVhaztwPW0uZW5kfW0uY3Vyc29yPXM/bS5zdGFydDptLmVuZCxyLnB1c2gobSl9bCYmci5yZXZlcnNlKCk7aWYoIW4pe3ZhciBnPXIubGVuZ3RoLTE7d2hpbGUocltnXS5pc0VtcHR5KCkmJmc+MClnLS07aWYoZz4wKXt2YXIgeT0wO3doaWxlKHJbeV0uaXNFbXB0eSgpKXkrK31mb3IodmFyIGI9ZztiPj15O2ItLSlyW2JdLmlzRW1wdHkoKSYmci5zcGxpY2UoYiwxKX1yZXR1cm4gcn19LmNhbGwocy5wcm90b3R5cGUpO3ZhciBkPWUoIi4vZWRpdG9yIikuRWRpdG9yOyhmdW5jdGlvbigpe3RoaXMudXBkYXRlU2VsZWN0aW9uTWFya2Vycz1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCksdGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpfSx0aGlzLmFkZFNlbGVjdGlvbk1hcmtlcj1mdW5jdGlvbihlKXtlLmN1cnNvcnx8KGUuY3Vyc29yPWUuZW5kKTt2YXIgdD10aGlzLmdldFNlbGVjdGlvblN0eWxlKCk7cmV0dXJuIGUubWFya2VyPXRoaXMuc2Vzc2lvbi5hZGRNYXJrZXIoZSwiYWNlX3NlbGVjdGlvbiIsdCksdGhpcy5zZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXJzLnB1c2goZSksdGhpcy5zZXNzaW9uLnNlbGVjdGlvbk1hcmtlckNvdW50PXRoaXMuc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2Vycy5sZW5ndGgsZX0sdGhpcy5yZW1vdmVTZWxlY3Rpb25NYXJrZXI9ZnVuY3Rpb24oZSl7aWYoIWUubWFya2VyKXJldHVybjt0aGlzLnNlc3Npb24ucmVtb3ZlTWFya2VyKGUubWFya2VyKTt2YXIgdD10aGlzLnNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcnMuaW5kZXhPZihlKTt0IT0tMSYmdGhpcy5zZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXJzLnNwbGljZSh0LDEpLHRoaXMuc2Vzc2lvbi5zZWxlY3Rpb25NYXJrZXJDb3VudD10aGlzLnNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcnMubGVuZ3RofSx0aGlzLnJlbW92ZVNlbGVjdGlvbk1hcmtlcnM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXJzO2Zvcih2YXIgbj1lLmxlbmd0aDtuLS07KXt2YXIgcj1lW25dO2lmKCFyLm1hcmtlciljb250aW51ZTt0aGlzLnNlc3Npb24ucmVtb3ZlTWFya2VyKHIubWFya2VyKTt2YXIgaT10LmluZGV4T2Yocik7aSE9LTEmJnQuc3BsaWNlKGksMSl9dGhpcy5zZXNzaW9uLnNlbGVjdGlvbk1hcmtlckNvdW50PXQubGVuZ3RofSx0aGlzLiRvbkFkZFJhbmdlPWZ1bmN0aW9uKGUpe3RoaXMuYWRkU2VsZWN0aW9uTWFya2VyKGUucmFuZ2UpLHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCksdGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpfSx0aGlzLiRvblJlbW92ZVJhbmdlPWZ1bmN0aW9uKGUpe3RoaXMucmVtb3ZlU2VsZWN0aW9uTWFya2VycyhlLnJhbmdlcyksdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUJhY2tNYXJrZXJzKCl9LHRoaXMuJG9uTXVsdGlTZWxlY3Q9ZnVuY3Rpb24oZSl7aWYodGhpcy5pbk11bHRpU2VsZWN0TW9kZSlyZXR1cm47dGhpcy5pbk11bHRpU2VsZWN0TW9kZT0hMCx0aGlzLnNldFN0eWxlKCJhY2VfbXVsdGlzZWxlY3QiKSx0aGlzLmtleUJpbmRpbmcuYWRkS2V5Ym9hcmRIYW5kbGVyKGYua2V5Ym9hcmRIYW5kbGVyKSx0aGlzLmNvbW1hbmRzLnNldERlZmF1bHRIYW5kbGVyKCJleGVjIix0aGlzLiRvbk11bHRpU2VsZWN0RXhlYyksdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUJhY2tNYXJrZXJzKCl9LHRoaXMuJG9uU2luZ2xlU2VsZWN0PWZ1bmN0aW9uKGUpe2lmKHRoaXMuc2Vzc2lvbi5tdWx0aVNlbGVjdC5pblZpcnR1YWxNb2RlKXJldHVybjt0aGlzLmluTXVsdGlTZWxlY3RNb2RlPSExLHRoaXMudW5zZXRTdHlsZSgiYWNlX211bHRpc2VsZWN0IiksdGhpcy5rZXlCaW5kaW5nLnJlbW92ZUtleWJvYXJkSGFuZGxlcihmLmtleWJvYXJkSGFuZGxlciksdGhpcy5jb21tYW5kcy5yZW1vdmVEZWZhdWx0SGFuZGxlcigiZXhlYyIsdGhpcy4kb25NdWx0aVNlbGVjdEV4ZWMpLHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCksdGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpLHRoaXMuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpfSx0aGlzLiRvbk11bHRpU2VsZWN0RXhlYz1mdW5jdGlvbihlKXt2YXIgdD1lLmNvbW1hbmQsbj1lLmVkaXRvcjtpZighbi5tdWx0aVNlbGVjdClyZXR1cm47aWYoIXQubXVsdGlTZWxlY3RBY3Rpb24pe3ZhciByPXQuZXhlYyhuLGUuYXJnc3x8e30pO24ubXVsdGlTZWxlY3QuYWRkUmFuZ2Uobi5tdWx0aVNlbGVjdC50b09yaWVudGVkUmFuZ2UoKSksbi5tdWx0aVNlbGVjdC5tZXJnZU92ZXJsYXBwaW5nUmFuZ2VzKCl9ZWxzZSB0Lm11bHRpU2VsZWN0QWN0aW9uPT0iZm9yRWFjaCI/cj1uLmZvckVhY2hTZWxlY3Rpb24odCxlLmFyZ3MpOnQubXVsdGlTZWxlY3RBY3Rpb249PSJmb3JFYWNoTGluZSI/cj1uLmZvckVhY2hTZWxlY3Rpb24odCxlLmFyZ3MsITApOnQubXVsdGlTZWxlY3RBY3Rpb249PSJzaW5nbGUiPyhuLmV4aXRNdWx0aVNlbGVjdE1vZGUoKSxyPXQuZXhlYyhuLGUuYXJnc3x8e30pKTpyPXQubXVsdGlTZWxlY3RBY3Rpb24obixlLmFyZ3N8fHt9KTtyZXR1cm4gcn0sdGhpcy5mb3JFYWNoU2VsZWN0aW9uPWZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGUpcmV0dXJuO3ZhciByPW4mJm4ua2VlcE9yZGVyLGk9bj09MXx8biYmbi4kYnlMaW5lcyxvPXRoaXMuc2Vzc2lvbix1PXRoaXMuc2VsZWN0aW9uLGE9dS5yYW5nZUxpc3QsZj0ocj91OmEpLnJhbmdlcyxsO2lmKCFmLmxlbmd0aClyZXR1cm4gZS5leGVjP2UuZXhlYyh0aGlzLHR8fHt9KTplKHRoaXMsdHx8e30pO3ZhciBjPXUuX2V2ZW50UmVnaXN0cnk7dS5fZXZlbnRSZWdpc3RyeT17fTt2YXIgaD1uZXcgcyhvKTt0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITA7Zm9yKHZhciBwPWYubGVuZ3RoO3AtLTspe2lmKGkpd2hpbGUocD4wJiZmW3BdLnN0YXJ0LnJvdz09ZltwLTFdLmVuZC5yb3cpcC0tO2guZnJvbU9yaWVudGVkUmFuZ2UoZltwXSksaC5pbmRleD1wLHRoaXMuc2VsZWN0aW9uPW8uc2VsZWN0aW9uPWg7dmFyIGQ9ZS5leGVjP2UuZXhlYyh0aGlzLHR8fHt9KTplKHRoaXMsdHx8e30pOyFsJiZkIT09dW5kZWZpbmVkJiYobD1kKSxoLnRvT3JpZW50ZWRSYW5nZShmW3BdKX1oLmRldGFjaCgpLHRoaXMuc2VsZWN0aW9uPW8uc2VsZWN0aW9uPXUsdGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSExLHUuX2V2ZW50UmVnaXN0cnk9Yyx1Lm1lcmdlT3ZlcmxhcHBpbmdSYW5nZXMoKSx1LnJhbmdlc1swXSYmdS5mcm9tT3JpZW50ZWRSYW5nZSh1LnJhbmdlc1swXSk7dmFyIHY9dGhpcy5yZW5kZXJlci4kc2Nyb2xsQW5pbWF0aW9uO3JldHVybiB0aGlzLm9uQ3Vyc29yQ2hhbmdlKCksdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpLHYmJnYuZnJvbT09di50byYmdGhpcy5yZW5kZXJlci5hbmltYXRlU2Nyb2xsaW5nKHYuZnJvbSksbH0sdGhpcy5leGl0TXVsdGlTZWxlY3RNb2RlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaW5NdWx0aVNlbGVjdE1vZGV8fHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZSlyZXR1cm47dGhpcy5tdWx0aVNlbGVjdC50b1NpbmdsZVJhbmdlKCl9LHRoaXMuZ2V0U2VsZWN0ZWRUZXh0PWZ1bmN0aW9uKCl7dmFyIGU9IiI7aWYodGhpcy5pbk11bHRpU2VsZWN0TW9kZSYmIXRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZSl7dmFyIHQ9dGhpcy5tdWx0aVNlbGVjdC5yYW5nZUxpc3QucmFuZ2VzLG49W107Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspbi5wdXNoKHRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UodFtyXSkpO3ZhciBpPXRoaXMuc2Vzc2lvbi5nZXREb2N1bWVudCgpLmdldE5ld0xpbmVDaGFyYWN0ZXIoKTtlPW4uam9pbihpKSxlLmxlbmd0aD09KG4ubGVuZ3RoLTEpKmkubGVuZ3RoJiYoZT0iIil9ZWxzZSB0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCl8fChlPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSk7cmV0dXJuIGV9LHRoaXMuJGNoZWNrTXVsdGlzZWxlY3RDaGFuZ2U9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmluTXVsdGlTZWxlY3RNb2RlJiYhdGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlKXt2YXIgbj10aGlzLm11bHRpU2VsZWN0LnJhbmdlc1swXTtpZih0aGlzLm11bHRpU2VsZWN0LmlzRW1wdHkoKSYmdD09dGhpcy5tdWx0aVNlbGVjdC5hbmNob3IpcmV0dXJuO3ZhciByPXQ9PXRoaXMubXVsdGlTZWxlY3QuYW5jaG9yP24uY3Vyc29yPT1uLnN0YXJ0P24uZW5kOm4uc3RhcnQ6bi5jdXJzb3I7ci5yb3chPXQucm93fHx0aGlzLnNlc3Npb24uJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQoci5yb3csci5jb2x1bW4pLmNvbHVtbiE9dC5jb2x1bW4/dGhpcy5tdWx0aVNlbGVjdC50b1NpbmdsZVJhbmdlKHRoaXMubXVsdGlTZWxlY3QudG9PcmllbnRlZFJhbmdlKCkpOnRoaXMubXVsdGlTZWxlY3QubWVyZ2VPdmVybGFwcGluZ1JhbmdlcygpfX0sdGhpcy5maW5kQWxsPWZ1bmN0aW9uKGUsdCxuKXt0PXR8fHt9LHQubmVlZGxlPWV8fHQubmVlZGxlO2lmKHQubmVlZGxlPT11bmRlZmluZWQpe3ZhciByPXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKT90aGlzLnNlbGVjdGlvbi5nZXRXb3JkUmFuZ2UoKTp0aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpO3QubmVlZGxlPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2Uocil9dGhpcy4kc2VhcmNoLnNldCh0KTt2YXIgaT10aGlzLiRzZWFyY2guZmluZEFsbCh0aGlzLnNlc3Npb24pO2lmKCFpLmxlbmd0aClyZXR1cm4gMDt2YXIgcz10aGlzLm11bHRpU2VsZWN0O258fHMudG9TaW5nbGVSYW5nZShpWzBdKTtmb3IodmFyIG89aS5sZW5ndGg7by0tOylzLmFkZFJhbmdlKGlbb10sITApO3JldHVybiByJiZzLnJhbmdlTGlzdC5yYW5nZUF0UG9pbnQoci5zdGFydCkmJnMuYWRkUmFuZ2UociwhMCksaS5sZW5ndGh9LHRoaXMuc2VsZWN0TW9yZUxpbmVzPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zZWxlY3Rpb24udG9PcmllbnRlZFJhbmdlKCkscj1uLmN1cnNvcj09bi5lbmQscz10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKG4uY3Vyc29yKTt0aGlzLnNlbGVjdGlvbi4kZGVzaXJlZENvbHVtbiYmKHMuY29sdW1uPXRoaXMuc2VsZWN0aW9uLiRkZXNpcmVkQ29sdW1uKTt2YXIgbz10aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKHMucm93K2Uscy5jb2x1bW4pO2lmKCFuLmlzRW1wdHkoKSl2YXIgdT10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHI/bi5lbmQ6bi5zdGFydCksYT10aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKHUucm93K2UsdS5jb2x1bW4pO2Vsc2UgdmFyIGE9bztpZihyKXt2YXIgZj1pLmZyb21Qb2ludHMobyxhKTtmLmN1cnNvcj1mLnN0YXJ0fWVsc2V7dmFyIGY9aS5mcm9tUG9pbnRzKGEsbyk7Zi5jdXJzb3I9Zi5lbmR9Zi5kZXNpcmVkQ29sdW1uPXMuY29sdW1uO2lmKCF0aGlzLnNlbGVjdGlvbi5pbk11bHRpU2VsZWN0TW9kZSl0aGlzLnNlbGVjdGlvbi5hZGRSYW5nZShuKTtlbHNlIGlmKHQpdmFyIGw9bi5jdXJzb3I7dGhpcy5zZWxlY3Rpb24uYWRkUmFuZ2UoZiksbCYmdGhpcy5zZWxlY3Rpb24uc3Vic3RyYWN0UG9pbnQobCl9LHRoaXMudHJhbnNwb3NlU2VsZWN0aW9ucz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb24sbj10Lm11bHRpU2VsZWN0LHI9bi5yYW5nZXM7Zm9yKHZhciBpPXIubGVuZ3RoO2ktLTspe3ZhciBzPXJbaV07aWYocy5pc0VtcHR5KCkpe3ZhciBvPXQuZ2V0V29yZFJhbmdlKHMuc3RhcnQucm93LHMuc3RhcnQuY29sdW1uKTtzLnN0YXJ0LnJvdz1vLnN0YXJ0LnJvdyxzLnN0YXJ0LmNvbHVtbj1vLnN0YXJ0LmNvbHVtbixzLmVuZC5yb3c9by5lbmQucm93LHMuZW5kLmNvbHVtbj1vLmVuZC5jb2x1bW59fW4ubWVyZ2VPdmVybGFwcGluZ1JhbmdlcygpO3ZhciB1PVtdO2Zvcih2YXIgaT1yLmxlbmd0aDtpLS07KXt2YXIgcz1yW2ldO3UudW5zaGlmdCh0LmdldFRleHRSYW5nZShzKSl9ZTwwP3UudW5zaGlmdCh1LnBvcCgpKTp1LnB1c2godS5zaGlmdCgpKTtmb3IodmFyIGk9ci5sZW5ndGg7aS0tOyl7dmFyIHM9cltpXSxvPXMuY2xvbmUoKTt0LnJlcGxhY2Uocyx1W2ldKSxzLnN0YXJ0LnJvdz1vLnN0YXJ0LnJvdyxzLnN0YXJ0LmNvbHVtbj1vLnN0YXJ0LmNvbHVtbn1uLmZyb21PcmllbnRlZFJhbmdlKG4ucmFuZ2VzWzBdKX0sdGhpcy5zZWxlY3RNb3JlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLnNlc3Npb24saT1yLm11bHRpU2VsZWN0LHM9aS50b09yaWVudGVkUmFuZ2UoKTtpZihzLmlzRW1wdHkoKSl7cz1yLmdldFdvcmRSYW5nZShzLnN0YXJ0LnJvdyxzLnN0YXJ0LmNvbHVtbikscy5jdXJzb3I9ZT09LTE/cy5zdGFydDpzLmVuZCx0aGlzLm11bHRpU2VsZWN0LmFkZFJhbmdlKHMpO2lmKG4pcmV0dXJufXZhciBvPXIuZ2V0VGV4dFJhbmdlKHMpLHU9aChyLG8sZSk7dSYmKHUuY3Vyc29yPWU9PS0xP3Uuc3RhcnQ6dS5lbmQsdGhpcy5zZXNzaW9uLnVuZm9sZCh1KSx0aGlzLm11bHRpU2VsZWN0LmFkZFJhbmdlKHUpLHRoaXMucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcobnVsbCwuNSkpLHQmJnRoaXMubXVsdGlTZWxlY3Quc3Vic3RyYWN0UG9pbnQocy5jdXJzb3IpfSx0aGlzLmFsaWduQ3Vyc29ycz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbix0PWUubXVsdGlTZWxlY3Qsbj10LnJhbmdlcyxyPS0xLHM9bi5maWx0ZXIoZnVuY3Rpb24oZSl7aWYoZS5jdXJzb3Iucm93PT1yKXJldHVybiEwO3I9ZS5jdXJzb3Iucm93fSk7aWYoIW4ubGVuZ3RofHxzLmxlbmd0aD09bi5sZW5ndGgtMSl7dmFyIG89dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSx1PW8uc3RhcnQucm93LGY9by5lbmQucm93LGw9dT09ZjtpZihsKXt2YXIgYz10aGlzLnNlc3Npb24uZ2V0TGVuZ3RoKCksaDtkbyBoPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKGYpO3doaWxlKC9bPTpdLy50ZXN0KGgpJiYrK2Y8Yyk7ZG8gaD10aGlzLnNlc3Npb24uZ2V0TGluZSh1KTt3aGlsZSgvWz06XS8udGVzdChoKSYmLS11PjApO3U8MCYmKHU9MCksZj49YyYmKGY9Yy0xKX12YXIgcD10aGlzLnNlc3Npb24ucmVtb3ZlRnVsbExpbmVzKHUsZik7cD10aGlzLiRyZUFsaWduVGV4dChwLGwpLHRoaXMuc2Vzc2lvbi5pbnNlcnQoe3Jvdzp1LGNvbHVtbjowfSxwLmpvaW4oIlxuIikrIlxuIiksbHx8KG8uc3RhcnQuY29sdW1uPTAsby5lbmQuY29sdW1uPXBbcC5sZW5ndGgtMV0ubGVuZ3RoKSx0aGlzLnNlbGVjdGlvbi5zZXRSYW5nZShvKX1lbHNle3MuZm9yRWFjaChmdW5jdGlvbihlKXt0LnN1YnN0cmFjdFBvaW50KGUuY3Vyc29yKX0pO3ZhciBkPTAsdj1JbmZpbml0eSxtPW4ubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPXQuY3Vyc29yLHI9ZS5nZXRMaW5lKG4ucm93KSxpPXIuc3Vic3RyKG4uY29sdW1uKS5zZWFyY2goL1xTL2cpO3JldHVybiBpPT0tMSYmKGk9MCksbi5jb2x1bW4+ZCYmKGQ9bi5jb2x1bW4pLGk8diYmKHY9aSksaX0pO24uZm9yRWFjaChmdW5jdGlvbih0LG4pe3ZhciByPXQuY3Vyc29yLHM9ZC1yLmNvbHVtbixvPW1bbl0tdjtzPm8/ZS5pbnNlcnQocixhLnN0cmluZ1JlcGVhdCgiICIscy1vKSk6ZS5yZW1vdmUobmV3IGkoci5yb3csci5jb2x1bW4sci5yb3csci5jb2x1bW4tcytvKSksdC5zdGFydC5jb2x1bW49dC5lbmQuY29sdW1uPWQsdC5zdGFydC5yb3c9dC5lbmQucm93PXIucm93LHQuY3Vyc29yPXQuZW5kfSksdC5mcm9tT3JpZW50ZWRSYW5nZShuWzBdKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpLHRoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKX19LHRoaXMuJHJlQWxpZ25UZXh0PWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gdShlKXtyZXR1cm4gYS5zdHJpbmdSZXBlYXQoIiAiLGUpfWZ1bmN0aW9uIGYoZSl7cmV0dXJuIGVbMl0/dShpKStlWzJdK3Uocy1lWzJdLmxlbmd0aCtvKStlWzRdLnJlcGxhY2UoL14oWz06XSlccysvLCIkMSAiKTplWzBdfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGVbMl0/dShpK3MtZVsyXS5sZW5ndGgpK2VbMl0rdShvKStlWzRdLnJlcGxhY2UoL14oWz06XSlccysvLCIkMSAiKTplWzBdfWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGVbMl0/dShpKStlWzJdK3UobykrZVs0XS5yZXBsYWNlKC9eKFs9Ol0pXHMrLywiJDEgIik6ZVswXX12YXIgbj0hMCxyPSEwLGkscyxvO3JldHVybiBlLm1hcChmdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKC8oXHMqKSguKj8pKFxzKikoWz06XS4qKS8pO3JldHVybiB0P2k9PW51bGw/KGk9dFsxXS5sZW5ndGgscz10WzJdLmxlbmd0aCxvPXRbM10ubGVuZ3RoLHQpOihpK3MrbyE9dFsxXS5sZW5ndGgrdFsyXS5sZW5ndGgrdFszXS5sZW5ndGgmJihyPSExKSxpIT10WzFdLmxlbmd0aCYmKG49ITEpLGk+dFsxXS5sZW5ndGgmJihpPXRbMV0ubGVuZ3RoKSxzPHRbMl0ubGVuZ3RoJiYocz10WzJdLmxlbmd0aCksbz50WzNdLmxlbmd0aCYmKG89dFszXS5sZW5ndGgpLHQpOltlXX0pLm1hcCh0P2Y6bj9yP2w6ZjpjKX19KS5jYWxsKGQucHJvdG90eXBlKSx0Lm9uU2Vzc2lvbkNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdD1lLnNlc3Npb247dCYmIXQubXVsdGlTZWxlY3QmJih0LiRzZWxlY3Rpb25NYXJrZXJzPVtdLHQuc2VsZWN0aW9uLiRpbml0UmFuZ2VMaXN0KCksdC5tdWx0aVNlbGVjdD10LnNlbGVjdGlvbiksdGhpcy5tdWx0aVNlbGVjdD10JiZ0Lm11bHRpU2VsZWN0O3ZhciBuPWUub2xkU2Vzc2lvbjtuJiYobi5tdWx0aVNlbGVjdC5vZmYoImFkZFJhbmdlIix0aGlzLiRvbkFkZFJhbmdlKSxuLm11bHRpU2VsZWN0Lm9mZigicmVtb3ZlUmFuZ2UiLHRoaXMuJG9uUmVtb3ZlUmFuZ2UpLG4ubXVsdGlTZWxlY3Qub2ZmKCJtdWx0aVNlbGVjdCIsdGhpcy4kb25NdWx0aVNlbGVjdCksbi5tdWx0aVNlbGVjdC5vZmYoInNpbmdsZVNlbGVjdCIsdGhpcy4kb25TaW5nbGVTZWxlY3QpLG4ubXVsdGlTZWxlY3QubGVhZC5vZmYoImNoYW5nZSIsdGhpcy4kY2hlY2tNdWx0aXNlbGVjdENoYW5nZSksbi5tdWx0aVNlbGVjdC5hbmNob3Iub2ZmKCJjaGFuZ2UiLHRoaXMuJGNoZWNrTXVsdGlzZWxlY3RDaGFuZ2UpKSx0JiYodC5tdWx0aVNlbGVjdC5vbigiYWRkUmFuZ2UiLHRoaXMuJG9uQWRkUmFuZ2UpLHQubXVsdGlTZWxlY3Qub24oInJlbW92ZVJhbmdlIix0aGlzLiRvblJlbW92ZVJhbmdlKSx0Lm11bHRpU2VsZWN0Lm9uKCJtdWx0aVNlbGVjdCIsdGhpcy4kb25NdWx0aVNlbGVjdCksdC5tdWx0aVNlbGVjdC5vbigic2luZ2xlU2VsZWN0Iix0aGlzLiRvblNpbmdsZVNlbGVjdCksdC5tdWx0aVNlbGVjdC5sZWFkLm9uKCJjaGFuZ2UiLHRoaXMuJGNoZWNrTXVsdGlzZWxlY3RDaGFuZ2UpLHQubXVsdGlTZWxlY3QuYW5jaG9yLm9uKCJjaGFuZ2UiLHRoaXMuJGNoZWNrTXVsdGlzZWxlY3RDaGFuZ2UpKSx0JiZ0aGlzLmluTXVsdGlTZWxlY3RNb2RlIT10LnNlbGVjdGlvbi5pbk11bHRpU2VsZWN0TW9kZSYmKHQuc2VsZWN0aW9uLmluTXVsdGlTZWxlY3RNb2RlP3RoaXMuJG9uTXVsdGlTZWxlY3QoKTp0aGlzLiRvblNpbmdsZVNlbGVjdCgpKX0sdC5NdWx0aVNlbGVjdD1tLGUoIi4vY29uZmlnIikuZGVmaW5lT3B0aW9ucyhkLnByb3RvdHlwZSwiZWRpdG9yIix7ZW5hYmxlTXVsdGlzZWxlY3Q6e3NldDpmdW5jdGlvbihlKXttKHRoaXMpLGU/KHRoaXMub24oImNoYW5nZVNlc3Npb24iLHRoaXMuJG11bHRpc2VsZWN0T25TZXNzaW9uQ2hhbmdlKSx0aGlzLm9uKCJtb3VzZWRvd24iLG8pKToodGhpcy5vZmYoImNoYW5nZVNlc3Npb24iLHRoaXMuJG11bHRpc2VsZWN0T25TZXNzaW9uQ2hhbmdlKSx0aGlzLm9mZigibW91c2Vkb3duIixvKSl9LHZhbHVlOiEwfSxlbmFibGVCbG9ja1NlbGVjdDp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJGJsb2NrU2VsZWN0RW5hYmxlZD1lfSx2YWx1ZTohMH19KX0pLGFjZS5kZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGk9dC5Gb2xkTW9kZT1mdW5jdGlvbigpe307KGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9bnVsbCx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPW51bGwsdGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmdldExpbmUobik7cmV0dXJuIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3Qocik/InN0YXJ0Ijp0PT0ibWFya2JlZ2luZW5kIiYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlciYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KHIpPyJlbmQiOiIifSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGx9LHRoaXMuaW5kZW50YXRpb25CbG9jaz1mdW5jdGlvbihlLHQsbil7dmFyIGk9L1xTLyxzPWUuZ2V0TGluZSh0KSxvPXMuc2VhcmNoKGkpO2lmKG89PS0xKXJldHVybjt2YXIgdT1ufHxzLmxlbmd0aCxhPWUuZ2V0TGVuZ3RoKCksZj10LGw9dDt3aGlsZSgrK3Q8YSl7dmFyIGM9ZS5nZXRMaW5lKHQpLnNlYXJjaChpKTtpZihjPT0tMSljb250aW51ZTtpZihjPD1vKXt2YXIgaD1lLmdldFRva2VuQXQodCwwKTtpZighaHx8aC50eXBlIT09InN0cmluZyIpYnJlYWt9bD10fWlmKGw+Zil7dmFyIHA9ZS5nZXRMaW5lKGwpLmxlbmd0aDtyZXR1cm4gbmV3IHIoZix1LGwscCl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oZSx0LG4saSxzKXt2YXIgbz17cm93Om4sY29sdW1uOmkrMX0sdT1lLiRmaW5kQ2xvc2luZ0JyYWNrZXQodCxvLHMpO2lmKCF1KXJldHVybjt2YXIgYT1lLmZvbGRXaWRnZXRzW3Uucm93XTtyZXR1cm4gYT09bnVsbCYmKGE9ZS5nZXRGb2xkV2lkZ2V0KHUucm93KSksYT09InN0YXJ0IiYmdS5yb3c+by5yb3cmJih1LnJvdy0tLHUuY29sdW1uPWUuZ2V0TGluZSh1LnJvdykubGVuZ3RoKSxyLmZyb21Qb2ludHMobyx1KX0sdGhpcy5jbG9zaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGUsdCxuLGkscyl7dmFyIG89e3JvdzpuLGNvbHVtbjppfSx1PWUuJGZpbmRPcGVuaW5nQnJhY2tldCh0LG8pO2lmKCF1KXJldHVybjtyZXR1cm4gdS5jb2x1bW4rKyxvLmNvbHVtbi0tLHIuZnJvbVBvaW50cyh1LG8pfX0pLmNhbGwoaS5wcm90b3R5cGUpfSksYWNlLmRlZmluZSgiYWNlL3RoZW1lL3RleHRtYXRlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QuaXNEYXJrPSExLHQuY3NzQ2xhc3M9ImFjZS10bSIsdC5jc3NUZXh0PScuYWNlLXRtIC5hY2VfZ3V0dGVyIHtiYWNrZ3JvdW5kOiAjZjBmMGYwO2NvbG9yOiAjMzMzO30uYWNlLXRtIC5hY2VfcHJpbnQtbWFyZ2luIHt3aWR0aDogMXB4O2JhY2tncm91bmQ6ICNlOGU4ZTg7fS5hY2UtdG0gLmFjZV9mb2xkIHtiYWNrZ3JvdW5kLWNvbG9yOiAjNkI3MkU2O30uYWNlLXRtIHtiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGO2NvbG9yOiBibGFjazt9LmFjZS10bSAuYWNlX2N1cnNvciB7Y29sb3I6IGJsYWNrO30uYWNlLXRtIC5hY2VfaW52aXNpYmxlIHtjb2xvcjogcmdiKDE5MSwgMTkxLCAxOTEpO30uYWNlLXRtIC5hY2Vfc3RvcmFnZSwuYWNlLXRtIC5hY2Vfa2V5d29yZCB7Y29sb3I6IGJsdWU7fS5hY2UtdG0gLmFjZV9jb25zdGFudCB7Y29sb3I6IHJnYigxOTcsIDYsIDExKTt9LmFjZS10bSAuYWNlX2NvbnN0YW50LmFjZV9idWlsZGluIHtjb2xvcjogcmdiKDg4LCA3MiwgMjQ2KTt9LmFjZS10bSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7Y29sb3I6IHJnYig4OCwgOTIsIDI0Nik7fS5hY2UtdG0gLmFjZV9jb25zdGFudC5hY2VfbGlicmFyeSB7Y29sb3I6IHJnYig2LCAxNTAsIDE0KTt9LmFjZS10bSAuYWNlX2ludmFsaWQge2JhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAwLCAwLCAwLjEpO2NvbG9yOiByZWQ7fS5hY2UtdG0gLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7Y29sb3I6IHJnYig2MCwgNzYsIDExNCk7fS5hY2UtdG0gLmFjZV9zdXBwb3J0LmFjZV9jb25zdGFudCB7Y29sb3I6IHJnYig2LCAxNTAsIDE0KTt9LmFjZS10bSAuYWNlX3N1cHBvcnQuYWNlX3R5cGUsLmFjZS10bSAuYWNlX3N1cHBvcnQuYWNlX2NsYXNzIHtjb2xvcjogcmdiKDEwOSwgMTIxLCAyMjIpO30uYWNlLXRtIC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige2NvbG9yOiByZ2IoMTA0LCAxMTgsIDEzNSk7fS5hY2UtdG0gLmFjZV9zdHJpbmcge2NvbG9yOiByZ2IoMywgMTA2LCA3KTt9LmFjZS10bSAuYWNlX2NvbW1lbnQge2NvbG9yOiByZ2IoNzYsIDEzNiwgMTA3KTt9LmFjZS10bSAuYWNlX2NvbW1lbnQuYWNlX2RvYyB7Y29sb3I6IHJnYigwLCAxMDIsIDI1NSk7fS5hY2UtdG0gLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7Y29sb3I6IHJnYigxMjgsIDE1OSwgMTkxKTt9LmFjZS10bSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtjb2xvcjogcmdiKDAsIDAsIDIwNSk7fS5hY2UtdG0gLmFjZV92YXJpYWJsZSB7Y29sb3I6IHJnYig0OSwgMTMyLCAxNDkpO30uYWNlLXRtIC5hY2VfeG1sLXBlIHtjb2xvcjogcmdiKDEwNCwgMTA0LCA5MSk7fS5hY2UtdG0gLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtjb2xvcjogIzAwMDBBMjt9LmFjZS10bSAuYWNlX2hlYWRpbmcge2NvbG9yOiByZ2IoMTIsIDcsIDI1NSk7fS5hY2UtdG0gLmFjZV9saXN0IHtjb2xvcjpyZ2IoMTg1LCA2LCAxNDQpO30uYWNlLXRtIC5hY2VfbWV0YS5hY2VfdGFnIHtjb2xvcjpyZ2IoMCwgMjIsIDE0Mik7fS5hY2UtdG0gLmFjZV9zdHJpbmcuYWNlX3JlZ2V4IHtjb2xvcjogcmdiKDI1NSwgMCwgMCl9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7YmFja2dyb3VuZDogcmdiKDE4MSwgMjEzLCAyNTUpO30uYWNlLXRtLmFjZV9tdWx0aXNlbGVjdCAuYWNlX3NlbGVjdGlvbi5hY2Vfc3RhcnQge2JveC1zaGFkb3c6IDAgMCAzcHggMHB4IHdoaXRlO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7YmFja2dyb3VuZDogcmdiKDI1MiwgMjU1LCAwKTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHtiYWNrZ3JvdW5kOiByZ2IoMTY0LCAyMjksIDEwMSk7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHttYXJnaW46IC0xcHggMCAwIC0xcHg7Ym9yZGVyOiAxcHggc29saWQgcmdiKDE5MiwgMTkyLCAxOTIpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlLWxpbmUge2JhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNyk7fS5hY2UtdG0gLmFjZV9ndXR0ZXItYWN0aXZlLWxpbmUge2JhY2tncm91bmQtY29sb3IgOiAjZGNkY2RjO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWQtd29yZCB7YmFja2dyb3VuZDogcmdiKDI1MCwgMjUwLCAyNTUpO2JvcmRlcjogMXB4IHNvbGlkIHJnYigyMDAsIDIwMCwgMjUwKTt9LmFjZS10bSAuYWNlX2luZGVudC1ndWlkZSB7YmFja2dyb3VuZDogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFFQUFBQUNDQVlBQUFDWmdiWW5BQUFBRTBsRVFWUUltV1A0Ly8vL2Y0YkxseS8vQndBbVZnZDEvdzExL2dBQUFBQkpSVTVFcmtKZ2dnPT0iKSByaWdodCByZXBlYXQteTt9Jyx0LiRpZD0iYWNlL3RoZW1lL3RleHRtYXRlIjt2YXIgcj1lKCIuLi9saWIvZG9tIik7ci5pbXBvcnRDc3NTdHJpbmcodC5jc3NUZXh0LHQuY3NzQ2xhc3MpfSksYWNlLmRlZmluZSgiYWNlL2xpbmVfd2lkZ2V0cyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7dGhpcy5zZXNzaW9uPWUsdGhpcy5zZXNzaW9uLndpZGdldE1hbmFnZXI9dGhpcyx0aGlzLnNlc3Npb24uZ2V0Um93TGVuZ3RoPXRoaXMuZ2V0Um93TGVuZ3RoLHRoaXMuc2Vzc2lvbi4kZ2V0V2lkZ2V0U2NyZWVuTGVuZ3RoPXRoaXMuJGdldFdpZGdldFNjcmVlbkxlbmd0aCx0aGlzLnVwZGF0ZU9uQ2hhbmdlPXRoaXMudXBkYXRlT25DaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnJlbmRlcldpZGdldHM9dGhpcy5yZW5kZXJXaWRnZXRzLmJpbmQodGhpcyksdGhpcy5tZWFzdXJlV2lkZ2V0cz10aGlzLm1lYXN1cmVXaWRnZXRzLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLl9jaGFuZ2VkV2lkZ2V0cz1bXSx0aGlzLiRvbkNoYW5nZUVkaXRvcj10aGlzLiRvbkNoYW5nZUVkaXRvci5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlIix0aGlzLnVwZGF0ZU9uQ2hhbmdlKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZUZvbGQiLHRoaXMudXBkYXRlT25Gb2xkKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZUVkaXRvciIsdGhpcy4kb25DaGFuZ2VFZGl0b3IpfXZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvZG9tIikscz1lKCIuL3JhbmdlIikuUmFuZ2U7KGZ1bmN0aW9uKCl7dGhpcy5nZXRSb3dMZW5ndGg9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHRoaXMubGluZVdpZGdldHM/dD10aGlzLmxpbmVXaWRnZXRzW2VdJiZ0aGlzLmxpbmVXaWRnZXRzW2VdLnJvd0NvdW50fHwwOnQ9MCwhdGhpcy4kdXNlV3JhcE1vZGV8fCF0aGlzLiR3cmFwRGF0YVtlXT8xK3Q6dGhpcy4kd3JhcERhdGFbZV0ubGVuZ3RoKzErdH0sdGhpcy4kZ2V0V2lkZ2V0U2NyZWVuTGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIGU9MDtyZXR1cm4gdGhpcy5saW5lV2lkZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QmJnQucm93Q291bnQmJiF0LmhpZGRlbiYmKGUrPXQucm93Q291bnQpfSksZX0sdGhpcy4kb25DaGFuZ2VFZGl0b3I9ZnVuY3Rpb24oZSl7dGhpcy5hdHRhY2goZS5lZGl0b3IpfSx0aGlzLmF0dGFjaD1mdW5jdGlvbihlKXtlJiZlLndpZGdldE1hbmFnZXImJmUud2lkZ2V0TWFuYWdlciE9dGhpcyYmZS53aWRnZXRNYW5hZ2VyLmRldGFjaCgpO2lmKHRoaXMuZWRpdG9yPT1lKXJldHVybjt0aGlzLmRldGFjaCgpLHRoaXMuZWRpdG9yPWUsZSYmKGUud2lkZ2V0TWFuYWdlcj10aGlzLGUucmVuZGVyZXIub24oImJlZm9yZVJlbmRlciIsdGhpcy5tZWFzdXJlV2lkZ2V0cyksZS5yZW5kZXJlci5vbigiYWZ0ZXJSZW5kZXIiLHRoaXMucmVuZGVyV2lkZ2V0cykpfSx0aGlzLmRldGFjaD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmVkaXRvcjtpZighdClyZXR1cm47dGhpcy5lZGl0b3I9bnVsbCx0LndpZGdldE1hbmFnZXI9bnVsbCx0LnJlbmRlcmVyLm9mZigiYmVmb3JlUmVuZGVyIix0aGlzLm1lYXN1cmVXaWRnZXRzKSx0LnJlbmRlcmVyLm9mZigiYWZ0ZXJSZW5kZXIiLHRoaXMucmVuZGVyV2lkZ2V0cyk7dmFyIG49dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzO24mJm4uZm9yRWFjaChmdW5jdGlvbihlKXtlJiZlLmVsJiZlLmVsLnBhcmVudE5vZGUmJihlLl9pbkRvY3VtZW50PSExLGUuZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlLmVsKSl9KX0sdGhpcy51cGRhdGVPbkZvbGQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmxpbmVXaWRnZXRzO2lmKCFufHwhZS5hY3Rpb24pcmV0dXJuO3ZhciByPWUuZGF0YSxpPXIuc3RhcnQucm93LHM9ci5lbmQucm93LG89ZS5hY3Rpb249PSJhZGQiO2Zvcih2YXIgdT1pKzE7dTxzO3UrKyluW3VdJiYoblt1XS5oaWRkZW49byk7bltzXSYmKG8/bltpXT9uW3NdLmhpZGRlbj1vOm5baV09bltzXToobltpXT09bltzXSYmKG5baV09dW5kZWZpbmVkKSxuW3NdLmhpZGRlbj1vKSl9LHRoaXMudXBkYXRlT25DaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzO2lmKCF0KXJldHVybjt2YXIgbj1lLnN0YXJ0LnJvdyxyPWUuZW5kLnJvdy1uO2lmKHIhPT0wKWlmKGUuYWN0aW9uPT0icmVtb3ZlIil7dmFyIGk9dC5zcGxpY2UobisxLHIpO2kuZm9yRWFjaChmdW5jdGlvbihlKXtlJiZ0aGlzLnJlbW92ZUxpbmVXaWRnZXQoZSl9LHRoaXMpLHRoaXMuJHVwZGF0ZVJvd3MoKX1lbHNle3ZhciBzPW5ldyBBcnJheShyKTtzLnVuc2hpZnQobiwwKSx0LnNwbGljZS5hcHBseSh0LHMpLHRoaXMuJHVwZGF0ZVJvd3MoKX19LHRoaXMuJHVwZGF0ZVJvd3M9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24ubGluZVdpZGdldHM7aWYoIWUpcmV0dXJuO3ZhciB0PSEwO2UuZm9yRWFjaChmdW5jdGlvbihlLG4pe2lmKGUpe3Q9ITEsZS5yb3c9bjt3aGlsZShlLiRvbGRXaWRnZXQpZS4kb2xkV2lkZ2V0LnJvdz1uLGU9ZS4kb2xkV2lkZ2V0fX0pLHQmJih0aGlzLnNlc3Npb24ubGluZVdpZGdldHM9bnVsbCl9LHRoaXMuYWRkTGluZVdpZGdldD1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb24ubGluZVdpZGdldHN8fCh0aGlzLnNlc3Npb24ubGluZVdpZGdldHM9bmV3IEFycmF5KHRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKSkpO3ZhciB0PXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0c1tlLnJvd107dCYmKGUuJG9sZFdpZGdldD10LHQuZWwmJnQuZWwucGFyZW50Tm9kZSYmKHQuZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0LmVsKSx0Ll9pbkRvY3VtZW50PSExKSksdGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzW2Uucm93XT1lLGUuc2Vzc2lvbj10aGlzLnNlc3Npb247dmFyIG49dGhpcy5lZGl0b3IucmVuZGVyZXI7ZS5odG1sJiYhZS5lbCYmKGUuZWw9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSxlLmVsLmlubmVySFRNTD1lLmh0bWwpLGUuZWwmJihpLmFkZENzc0NsYXNzKGUuZWwsImFjZV9saW5lV2lkZ2V0Q29udGFpbmVyIiksZS5lbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuZWwuc3R5bGUuekluZGV4PTUsbi5jb250YWluZXIuYXBwZW5kQ2hpbGQoZS5lbCksZS5faW5Eb2N1bWVudD0hMCksZS5jb3Zlckd1dHRlcnx8KGUuZWwuc3R5bGUuekluZGV4PTMpLGUucGl4ZWxIZWlnaHQ9PW51bGwmJihlLnBpeGVsSGVpZ2h0PWUuZWwub2Zmc2V0SGVpZ2h0KSxlLnJvd0NvdW50PT1udWxsJiYoZS5yb3dDb3VudD1lLnBpeGVsSGVpZ2h0L24ubGF5ZXJDb25maWcubGluZUhlaWdodCk7dmFyIHI9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLnJvdywwKTtlLiRmb2xkPXI7aWYocil7dmFyIHM9dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzO2Uucm93PT1yLmVuZC5yb3cmJiFzW3Iuc3RhcnQucm93XT9zW3Iuc3RhcnQucm93XT1lOmUuaGlkZGVuPSEwfXJldHVybiB0aGlzLnNlc3Npb24uX2VtaXQoImNoYW5nZUZvbGQiLHtkYXRhOntzdGFydDp7cm93OmUucm93fX19KSx0aGlzLiR1cGRhdGVSb3dzKCksdGhpcy5yZW5kZXJXaWRnZXRzKG51bGwsbiksdGhpcy5vbldpZGdldENoYW5nZWQoZSksZX0sdGhpcy5yZW1vdmVMaW5lV2lkZ2V0PWZ1bmN0aW9uKGUpe2UuX2luRG9jdW1lbnQ9ITEsZS5zZXNzaW9uPW51bGwsZS5lbCYmZS5lbC5wYXJlbnROb2RlJiZlLmVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZS5lbCk7aWYoZS5lZGl0b3ImJmUuZWRpdG9yLmRlc3Ryb3kpdHJ5e2UuZWRpdG9yLmRlc3Ryb3koKX1jYXRjaCh0KXt9aWYodGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzKXt2YXIgbj10aGlzLnNlc3Npb24ubGluZVdpZGdldHNbZS5yb3ddO2lmKG49PWUpdGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzW2Uucm93XT1lLiRvbGRXaWRnZXQsZS4kb2xkV2lkZ2V0JiZ0aGlzLm9uV2lkZ2V0Q2hhbmdlZChlLiRvbGRXaWRnZXQpO2Vsc2Ugd2hpbGUobil7aWYobi4kb2xkV2lkZ2V0PT1lKXtuLiRvbGRXaWRnZXQ9ZS4kb2xkV2lkZ2V0O2JyZWFrfW49bi4kb2xkV2lkZ2V0fX10aGlzLnNlc3Npb24uX2VtaXQoImNoYW5nZUZvbGQiLHtkYXRhOntzdGFydDp7cm93OmUucm93fX19KSx0aGlzLiR1cGRhdGVSb3dzKCl9LHRoaXMuZ2V0V2lkZ2V0c0F0Um93PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cyxuPXQmJnRbZV0scj1bXTt3aGlsZShuKXIucHVzaChuKSxuPW4uJG9sZFdpZGdldDtyZXR1cm4gcn0sdGhpcy5vbldpZGdldENoYW5nZWQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uLl9jaGFuZ2VkV2lkZ2V0cy5wdXNoKGUpLHRoaXMuZWRpdG9yJiZ0aGlzLmVkaXRvci5yZW5kZXJlci51cGRhdGVGdWxsKCl9LHRoaXMubWVhc3VyZVdpZGdldHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNlc3Npb24uX2NoYW5nZWRXaWRnZXRzLHI9dC5sYXllckNvbmZpZztpZighbnx8IW4ubGVuZ3RoKXJldHVybjt2YXIgaT1JbmZpbml0eTtmb3IodmFyIHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIG89bltzXTtpZighb3x8IW8uZWwpY29udGludWU7aWYoby5zZXNzaW9uIT10aGlzLnNlc3Npb24pY29udGludWU7aWYoIW8uX2luRG9jdW1lbnQpe2lmKHRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0c1tvLnJvd10hPW8pY29udGludWU7by5faW5Eb2N1bWVudD0hMCx0LmNvbnRhaW5lci5hcHBlbmRDaGlsZChvLmVsKX1vLmg9by5lbC5vZmZzZXRIZWlnaHQsby5maXhlZFdpZHRofHwoby53PW8uZWwub2Zmc2V0V2lkdGgsby5zY3JlZW5XaWR0aD1NYXRoLmNlaWwoby53L3IuY2hhcmFjdGVyV2lkdGgpKTt2YXIgdT1vLmgvci5saW5lSGVpZ2h0O28uY292ZXJMaW5lJiYodS09dGhpcy5zZXNzaW9uLmdldFJvd0xpbmVDb3VudChvLnJvdyksdTwwJiYodT0wKSksby5yb3dDb3VudCE9dSYmKG8ucm93Q291bnQ9dSxvLnJvdzxpJiYoaT1vLnJvdykpfWkhPUluZmluaXR5JiYodGhpcy5zZXNzaW9uLl9lbWl0KCJjaGFuZ2VGb2xkIix7ZGF0YTp7c3RhcnQ6e3JvdzppfX19KSx0aGlzLnNlc3Npb24ubGluZVdpZGdldFdpZHRoPW51bGwpLHRoaXMuc2Vzc2lvbi5fY2hhbmdlZFdpZGdldHM9W119LHRoaXMucmVuZGVyV2lkZ2V0cz1mdW5jdGlvbihlLHQpe3ZhciBuPXQubGF5ZXJDb25maWcscj10aGlzLnNlc3Npb24ubGluZVdpZGdldHM7aWYoIXIpcmV0dXJuO3ZhciBpPU1hdGgubWluKHRoaXMuZmlyc3RSb3csbi5maXJzdFJvdykscz1NYXRoLm1heCh0aGlzLmxhc3RSb3csbi5sYXN0Um93LHIubGVuZ3RoKTt3aGlsZShpPjAmJiFyW2ldKWktLTt0aGlzLmZpcnN0Um93PW4uZmlyc3RSb3csdGhpcy5sYXN0Um93PW4ubGFzdFJvdyx0LiRjdXJzb3JMYXllci5jb25maWc9bjtmb3IodmFyIG89aTtvPD1zO28rKyl7dmFyIHU9cltvXTtpZighdXx8IXUuZWwpY29udGludWU7aWYodS5oaWRkZW4pe3UuZWwuc3R5bGUudG9wPS0xMDAtKHUucGl4ZWxIZWlnaHR8fDApKyJweCI7Y29udGludWV9dS5faW5Eb2N1bWVudHx8KHUuX2luRG9jdW1lbnQ9ITAsdC5jb250YWluZXIuYXBwZW5kQ2hpbGQodS5lbCkpO3ZhciBhPXQuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oe3JvdzpvLGNvbHVtbjowfSwhMCkudG9wO3UuY292ZXJMaW5lfHwoYSs9bi5saW5lSGVpZ2h0KnRoaXMuc2Vzc2lvbi5nZXRSb3dMaW5lQ291bnQodS5yb3cpKSx1LmVsLnN0eWxlLnRvcD1hLW4ub2Zmc2V0KyJweCI7dmFyIGY9dS5jb3Zlckd1dHRlcj8wOnQuZ3V0dGVyV2lkdGg7dS5maXhlZFdpZHRofHwoZi09dC5zY3JvbGxMZWZ0KSx1LmVsLnN0eWxlLmxlZnQ9ZisicHgiLHUuZnVsbFdpZHRoJiZ1LnNjcmVlbldpZHRoJiYodS5lbC5zdHlsZS5taW5XaWR0aD1uLndpZHRoKzIqbi5wYWRkaW5nKyJweCIpLHUuZml4ZWRXaWR0aD91LmVsLnN0eWxlLnJpZ2h0PXQuc2Nyb2xsQmFyLmdldFdpZHRoKCkrInB4Ijp1LmVsLnN0eWxlLnJpZ2h0PSIifX19KS5jYWxsKG8ucHJvdG90eXBlKSx0LkxpbmVXaWRnZXRzPW99KSxhY2UuZGVmaW5lKCJhY2UvZXh0L2Vycm9yX21hcmtlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saW5lX3dpZGdldHMiLCJhY2UvbGliL2RvbSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQsbil7dmFyIHI9MCxpPWUubGVuZ3RoLTE7d2hpbGUocjw9aSl7dmFyIHM9citpPj4xLG89bih0LGVbc10pO2lmKG8+MClyPXMrMTtlbHNle2lmKCEobzwwKSlyZXR1cm4gcztpPXMtMX19cmV0dXJuLShyKzEpfWZ1bmN0aW9uIHUoZSx0LG4pe3ZhciByPWUuZ2V0QW5ub3RhdGlvbnMoKS5zb3J0KHMuY29tcGFyZVBvaW50cyk7aWYoIXIubGVuZ3RoKXJldHVybjt2YXIgaT1vKHIse3Jvdzp0LGNvbHVtbjotMX0scy5jb21wYXJlUG9pbnRzKTtpPDAmJihpPS1pLTEpLGk+PXIubGVuZ3RoP2k9bj4wPzA6ci5sZW5ndGgtMTppPT09MCYmbjwwJiYoaT1yLmxlbmd0aC0xKTt2YXIgdT1yW2ldO2lmKCF1fHwhbilyZXR1cm47aWYodS5yb3c9PT10KXtkbyB1PXJbaSs9bl07d2hpbGUodSYmdS5yb3c9PT10KTtpZighdSlyZXR1cm4gci5zbGljZSgpfXZhciBhPVtdO3Q9dS5yb3c7ZG8gYVtuPDA/InVuc2hpZnQiOiJwdXNoIl0odSksdT1yW2krPW5dO3doaWxlKHUmJnUucm93PT10KTtyZXR1cm4gYS5sZW5ndGgmJmF9dmFyIHI9ZSgiLi4vbGluZV93aWRnZXRzIikuTGluZVdpZGdldHMsaT1lKCIuLi9saWIvZG9tIikscz1lKCIuLi9yYW5nZSIpLlJhbmdlO3Quc2hvd0Vycm9yTWFya2VyPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zZXNzaW9uO24ud2lkZ2V0TWFuYWdlcnx8KG4ud2lkZ2V0TWFuYWdlcj1uZXcgcihuKSxuLndpZGdldE1hbmFnZXIuYXR0YWNoKGUpKTt2YXIgcz1lLmdldEN1cnNvclBvc2l0aW9uKCksbz1zLnJvdyxhPW4ud2lkZ2V0TWFuYWdlci5nZXRXaWRnZXRzQXRSb3cobykuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PSJlcnJvck1hcmtlciJ9KVswXTthP2EuZGVzdHJveSgpOm8tPXQ7dmFyIGY9dShuLG8sdCksbDtpZihmKXt2YXIgYz1mWzBdO3MuY29sdW1uPShjLnBvcyYmdHlwZW9mIGMuY29sdW1uIT0ibnVtYmVyIj9jLnBvcy5zYzpjLmNvbHVtbil8fDAscy5yb3c9Yy5yb3csbD1lLnJlbmRlcmVyLiRndXR0ZXJMYXllci4kYW5ub3RhdGlvbnNbcy5yb3ddfWVsc2V7aWYoYSlyZXR1cm47bD17dGV4dDpbIkxvb2tzIGdvb2QhIl0sY2xhc3NOYW1lOiJhY2Vfb2sifX1lLnNlc3Npb24udW5mb2xkKHMucm93KSxlLnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbihzKTt2YXIgaD17cm93OnMucm93LGZpeGVkV2lkdGg6ITAsY292ZXJHdXR0ZXI6ITAsZWw6aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0eXBlOiJlcnJvck1hcmtlciJ9LHA9aC5lbC5hcHBlbmRDaGlsZChpLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxkPWguZWwuYXBwZW5kQ2hpbGQoaS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7ZC5jbGFzc05hbWU9ImVycm9yX3dpZGdldF9hcnJvdyAiK2wuY2xhc3NOYW1lO3ZhciB2PWUucmVuZGVyZXIuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24ocykubGVmdDtkLnN0eWxlLmxlZnQ9ditlLnJlbmRlcmVyLmd1dHRlcldpZHRoLTUrInB4IixoLmVsLmNsYXNzTmFtZT0iZXJyb3Jfd2lkZ2V0X3dyYXBwZXIiLHAuY2xhc3NOYW1lPSJlcnJvcl93aWRnZXQgIitsLmNsYXNzTmFtZSxwLmlubmVySFRNTD1sLnRleHQuam9pbigiPGJyPiIpLHAuYXBwZW5kQ2hpbGQoaS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7dmFyIG09ZnVuY3Rpb24oZSx0LG4pe2lmKHQ9PT0wJiYobj09PSJlc2MifHxuPT09InJldHVybiIpKXJldHVybiBoLmRlc3Ryb3koKSx7Y29tbWFuZDoibnVsbCJ9fTtoLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZihlLiRtb3VzZUhhbmRsZXIuaXNNb3VzZVByZXNzZWQpcmV0dXJuO2Uua2V5QmluZGluZy5yZW1vdmVLZXlib2FyZEhhbmRsZXIobSksbi53aWRnZXRNYW5hZ2VyLnJlbW92ZUxpbmVXaWRnZXQoaCksZS5vZmYoImNoYW5nZVNlbGVjdGlvbiIsaC5kZXN0cm95KSxlLm9mZigiY2hhbmdlU2Vzc2lvbiIsaC5kZXN0cm95KSxlLm9mZigibW91c2V1cCIsaC5kZXN0cm95KSxlLm9mZigiY2hhbmdlIixoLmRlc3Ryb3kpfSxlLmtleUJpbmRpbmcuYWRkS2V5Ym9hcmRIYW5kbGVyKG0pLGUub24oImNoYW5nZVNlbGVjdGlvbiIsaC5kZXN0cm95KSxlLm9uKCJjaGFuZ2VTZXNzaW9uIixoLmRlc3Ryb3kpLGUub24oIm1vdXNldXAiLGguZGVzdHJveSksZS5vbigiY2hhbmdlIixoLmRlc3Ryb3kpLGUuc2Vzc2lvbi53aWRnZXRNYW5hZ2VyLmFkZExpbmVXaWRnZXQoaCksaC5lbC5vbm1vdXNlZG93bj1lLmZvY3VzLmJpbmQoZSksZS5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyhudWxsLC41LHtib3R0b206aC5lbC5vZmZzZXRIZWlnaHR9KX0saS5pbXBvcnRDc3NTdHJpbmcoIiAgICAuZXJyb3Jfd2lkZ2V0X3dyYXBwZXIgeyAgICAgICAgYmFja2dyb3VuZDogaW5oZXJpdDsgICAgICAgIGNvbG9yOiBpbmhlcml0OyAgICAgICAgYm9yZGVyOm5vbmUgICAgfSAgICAuZXJyb3Jfd2lkZ2V0IHsgICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDJweDsgICAgICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDJweDsgICAgICAgIG1hcmdpbjogNXB4IDA7ICAgICAgICBwYWRkaW5nOiAxMHB4IDQwcHg7ICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7ICAgIH0gICAgLmVycm9yX3dpZGdldC5hY2VfZXJyb3IsIC5lcnJvcl93aWRnZXRfYXJyb3cuYWNlX2Vycm9yeyAgICAgICAgYm9yZGVyLWNvbG9yOiAjZmY1YTVhICAgIH0gICAgLmVycm9yX3dpZGdldC5hY2Vfd2FybmluZywgLmVycm9yX3dpZGdldF9hcnJvdy5hY2Vfd2FybmluZ3sgICAgICAgIGJvcmRlci1jb2xvcjogI0YxRDgxNyAgICB9ICAgIC5lcnJvcl93aWRnZXQuYWNlX2luZm8sIC5lcnJvcl93aWRnZXRfYXJyb3cuYWNlX2luZm97ICAgICAgICBib3JkZXItY29sb3I6ICM1YTVhNWEgICAgfSAgICAuZXJyb3Jfd2lkZ2V0LmFjZV9vaywgLmVycm9yX3dpZGdldF9hcnJvdy5hY2Vfb2t7ICAgICAgICBib3JkZXItY29sb3I6ICM1YWFhNWEgICAgfSAgICAuZXJyb3Jfd2lkZ2V0X2Fycm93IHsgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgICAgICAgIGJvcmRlcjogc29saWQgNXB4OyAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQhaW1wb3J0YW50OyAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudCFpbXBvcnRhbnQ7ICAgICAgICBib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQhaW1wb3J0YW50OyAgICAgICAgdG9wOiAtNXB4OyAgICB9IiwiIil9KSxhY2UuZGVmaW5lKCJhY2UvYWNlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9maXhvbGRicm93c2VycyIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9ldmVudCIsImFjZS9yYW5nZSIsImFjZS9lZGl0b3IiLCJhY2UvZWRpdF9zZXNzaW9uIiwiYWNlL3VuZG9tYW5hZ2VyIiwiYWNlL3ZpcnR1YWxfcmVuZGVyZXIiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2Uva2V5Ym9hcmQvaGFzaF9oYW5kbGVyIiwiYWNlL3BsYWNlaG9sZGVyIiwiYWNlL211bHRpX3NlbGVjdCIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIiwiYWNlL3RoZW1lL3RleHRtYXRlIiwiYWNlL2V4dC9lcnJvcl9tYXJrZXIiLCJhY2UvY29uZmlnIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlKCIuL2xpYi9maXhvbGRicm93c2VycyIpO3ZhciByPWUoIi4vbGliL2RvbSIpLGk9ZSgiLi9saWIvZXZlbnQiKSxzPWUoIi4vcmFuZ2UiKS5SYW5nZSxvPWUoIi4vZWRpdG9yIikuRWRpdG9yLHU9ZSgiLi9lZGl0X3Nlc3Npb24iKS5FZGl0U2Vzc2lvbixhPWUoIi4vdW5kb21hbmFnZXIiKS5VbmRvTWFuYWdlcixmPWUoIi4vdmlydHVhbF9yZW5kZXJlciIpLlZpcnR1YWxSZW5kZXJlcjtlKCIuL3dvcmtlci93b3JrZXJfY2xpZW50IiksZSgiLi9rZXlib2FyZC9oYXNoX2hhbmRsZXIiKSxlKCIuL3BsYWNlaG9sZGVyIiksZSgiLi9tdWx0aV9zZWxlY3QiKSxlKCIuL21vZGUvZm9sZGluZy9mb2xkX21vZGUiKSxlKCIuL3RoZW1lL3RleHRtYXRlIiksZSgiLi9leHQvZXJyb3JfbWFya2VyIiksdC5jb25maWc9ZSgiLi9jb25maWciKSx0LnJlcXVpcmU9ZSx0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiYodC5kZWZpbmU9ZGVmaW5lKSx0LmVkaXQ9ZnVuY3Rpb24oZSxuKXtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBzPWU7ZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChzKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoImFjZS5lZGl0IGNhbid0IGZpbmQgZGl2ICMiK3MpfWlmKGUmJmUuZW52JiZlLmVudi5lZGl0b3IgaW5zdGFuY2VvZiBvKXJldHVybiBlLmVudi5lZGl0b3I7dmFyIHU9IiI7aWYoZSYmL2lucHV0fHRleHRhcmVhL2kudGVzdChlLnRhZ05hbWUpKXt2YXIgYT1lO3U9YS52YWx1ZSxlPXIuY3JlYXRlRWxlbWVudCgicHJlIiksYS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGEpfWVsc2UgZSYmKHU9ZS50ZXh0Q29udGVudCxlLmlubmVySFRNTD0iIik7dmFyIGw9dC5jcmVhdGVFZGl0U2Vzc2lvbih1KSxjPW5ldyBvKG5ldyBmKGUpLGwsbiksaD17ZG9jdW1lbnQ6bCxlZGl0b3I6YyxvblJlc2l6ZTpjLnJlc2l6ZS5iaW5kKGMsbnVsbCl9O3JldHVybiBhJiYoaC50ZXh0YXJlYT1hKSxpLmFkZExpc3RlbmVyKHdpbmRvdywicmVzaXplIixoLm9uUmVzaXplKSxjLm9uKCJkZXN0cm95IixmdW5jdGlvbigpe2kucmVtb3ZlTGlzdGVuZXIod2luZG93LCJyZXNpemUiLGgub25SZXNpemUpLGguZWRpdG9yLmNvbnRhaW5lci5lbnY9bnVsbH0pLGMuY29udGFpbmVyLmVudj1jLmVudj1oLGN9LHQuY3JlYXRlRWRpdFNlc3Npb249ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgdShlLHQpO3JldHVybiBuLnNldFVuZG9NYW5hZ2VyKG5ldyBhKSxufSx0LlJhbmdlPXMsdC5FZGl0b3I9byx0LkVkaXRTZXNzaW9uPXUsdC5VbmRvTWFuYWdlcj1hLHQuVmlydHVhbFJlbmRlcmVyPWYsdC52ZXJzaW9uPXQuY29uZmlnLnZlcnNpb259KTsgICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBhY2UucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuY29uZmlnLmluaXQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuZGVmaW5lID0gYWNlLmRlZmluZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0gYTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2VbImRlZmF1bHQiXSA9IHdpbmRvdy5hY2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIgJiYgdHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgbW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gd2luZG93LmFjZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKfTsKCtC80YPRgNC+0Lwu0LfQsNCz0YDRg9C30LjRgtGM0KDQtdC20LjQvEFDRUpTID0gZnVuY3Rpb24oKQp7CiAgICAvLyDQoNC10LbQuNC8IEphdmFTY3JpcHQg0LTQu9GPIEFDRS4KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hamF4b3JnL2FjZS1idWlsZHMvYmxvYi9tYXN0ZXIvc3JjLW1pbi1ub2NvbmZsaWN0L21vZGUtamF2YXNjcmlwdC5qcwphY2UuZGVmaW5lKCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvb29wIiksaT1lKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLHM9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudC5kb2MudGFnIixyZWdleDoiQFtcXHdcXGRfXSsifSxzLmdldFRhZ1J1bGUoKSx7ZGVmYXVsdFRva2VuOiJjb21tZW50LmRvYyIsY2FzZUluc2Vuc2l0aXZlOiEwfV19fTtyLmluaGVyaXRzKHMsaSkscy5nZXRUYWdSdWxlPWZ1bmN0aW9uKGUpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MudGFnLnN0b3JhZ2UudHlwZSIscmVnZXg6IlxcYig/OlRPRE98RklYTUV8WFhYfEhBQ0spXFxiIn19LHMuZ2V0U3RhcnRSdWxlPWZ1bmN0aW9uKGUpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLHJlZ2V4OiJcXC9cXCooPz1cXCopIixuZXh0OmV9fSxzLmdldEVuZFJ1bGU9ZnVuY3Rpb24oZSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIscmVnZXg6IlxcKlxcLyIsbmV4dDplfX0sdC5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9c30pLGFjZS5kZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYSgpe3ZhciBlPW8ucmVwbGFjZSgiXFxkIiwiXFxkXFwtIiksdD17b25NYXRjaDpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5jaGFyQXQoMSk9PSIvIj8yOjE7aWYocj09MSl0IT10aGlzLm5leHRTdGF0ZT9uLnVuc2hpZnQodGhpcy5uZXh0LHRoaXMubmV4dFN0YXRlLDApOm4udW5zaGlmdCh0aGlzLm5leHQpLG5bMl0rKztlbHNlIGlmKHI9PTImJnQ9PXRoaXMubmV4dFN0YXRlKXtuWzFdLS07aWYoIW5bMV18fG5bMV08MCluLnNoaWZ0KCksbi5zaGlmdCgpfXJldHVyblt7dHlwZToibWV0YS50YWcucHVuY3R1YXRpb24uIisocj09MT8iIjoiZW5kLSIpKyJ0YWctb3Blbi54bWwiLHZhbHVlOmUuc2xpY2UoMCxyKX0se3R5cGU6Im1ldGEudGFnLnRhZy1uYW1lLnhtbCIsdmFsdWU6ZS5zdWJzdHIocil9XX0scmVnZXg6IjwvPyIrZSsiIixuZXh0OiJqc3hBdHRyaWJ1dGVzIixuZXh0U3RhdGU6ImpzeCJ9O3RoaXMuJHJ1bGVzLnN0YXJ0LnVuc2hpZnQodCk7dmFyIG49e3JlZ2V4OiJ7Iix0b2tlbjoicGFyZW4ucXVhc2kuc3RhcnQiLHB1c2g6InN0YXJ0In07dGhpcy4kcnVsZXMuanN4PVtuLHQse2luY2x1ZGU6InJlZmVyZW5jZSJ9LHtkZWZhdWx0VG9rZW46InN0cmluZyJ9XSx0aGlzLiRydWxlcy5qc3hBdHRyaWJ1dGVzPVt7dG9rZW46Im1ldGEudGFnLnB1bmN0dWF0aW9uLnRhZy1jbG9zZS54bWwiLHJlZ2V4OiIvPz4iLG9uTWF0Y2g6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PT1uWzBdJiZuLnNoaWZ0KCksZS5sZW5ndGg9PTImJihuWzBdPT10aGlzLm5leHRTdGF0ZSYmblsxXS0tLCghblsxXXx8blsxXTwwKSYmbi5zcGxpY2UoMCwyKSksdGhpcy5uZXh0PW5bMF18fCJzdGFydCIsW3t0eXBlOnRoaXMudG9rZW4sdmFsdWU6ZX1dfSxuZXh0U3RhdGU6ImpzeCJ9LG4sZigianN4QXR0cmlidXRlcyIpLHt0b2tlbjoiZW50aXR5Lm90aGVyLmF0dHJpYnV0ZS1uYW1lLnhtbCIscmVnZXg6ZX0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yLmF0dHJpYnV0ZS1lcXVhbHMueG1sIixyZWdleDoiPSJ9LHt0b2tlbjoidGV4dC50YWctd2hpdGVzcGFjZS54bWwiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCIscmVnZXg6IiciLHN0YXRlTmFtZToianN4X2F0dHJfcSIscHVzaDpbe3Rva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCIscmVnZXg6IiciLG5leHQ6InBvcCJ9LHtpbmNsdWRlOiJyZWZlcmVuY2UifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCJ9XX0se3Rva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCIscmVnZXg6JyInLHN0YXRlTmFtZToianN4X2F0dHJfcXEiLHB1c2g6W3t0b2tlbjoic3RyaW5nLmF0dHJpYnV0ZS12YWx1ZS54bWwiLHJlZ2V4OiciJyxuZXh0OiJwb3AifSx7aW5jbHVkZToicmVmZXJlbmNlIn0se2RlZmF1bHRUb2tlbjoic3RyaW5nLmF0dHJpYnV0ZS12YWx1ZS54bWwifV19LHRdLHRoaXMuJHJ1bGVzLnJlZmVyZW5jZT1be3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUucmVmZXJlbmNlLnhtbCIscmVnZXg6Iig/OiYjWzAtOV0rOyl8KD86JiN4WzAtOWEtZkEtRl0rOyl8KD86JlthLXpBLVowLTlfOlxcLi1dKzspIn1dfWZ1bmN0aW9uIGYoZSl7cmV0dXJuW3t0b2tlbjoiY29tbWVudCIscmVnZXg6L1wvXCovLG5leHQ6W2kuZ2V0VGFnUnVsZSgpLHt0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcKlxcLyIsbmV4dDplfHwicG9wIn0se2RlZmF1bHRUb2tlbjoiY29tbWVudCIsY2FzZUluc2Vuc2l0aXZlOiEwfV19LHt0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLyIsbmV4dDpbaS5nZXRUYWdSdWxlKCkse3Rva2VuOiJjb21tZW50IixyZWdleDoiJHxeIixuZXh0OmV8fCJwb3AifSx7ZGVmYXVsdFRva2VuOiJjb21tZW50IixjYXNlSW5zZW5zaXRpdmU6ITB9XX1dfXZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLHM9ZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxvPSJbYS16QS1aXFwkX1x1MDBhMS1cdWZmZmZdW2EtekEtWlxcZFxcJF9cdTAwYTEtXHVmZmZmXSoiLHU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jcmVhdGVLZXl3b3JkTWFwcGVyKHsidmFyaWFibGUubGFuZ3VhZ2UiOiJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fE5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHxBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8VWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXxFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258U3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfGRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfGlzTmFOfHBhcnNlRmxvYXR8cGFyc2VJbnR8SlNPTnxNYXRofHRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiLGtleXdvcmQ6ImNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0fGFzeW5jfGF3YWl0fGJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnxpZnxpbnxvZnxpbnN0YW5jZW9mfG5ld3xyZXR1cm58c3dpdGNofHRocm93fHRyeXx0eXBlb2Z8bGV0fHZhcnx3aGlsZXx3aXRofGRlYnVnZ2VyfF9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fX3xjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXxwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIsInN0b3JhZ2UudHlwZSI6ImNvbnN0fGxldHx2YXJ8ZnVuY3Rpb24iLCJjb25zdGFudC5sYW5ndWFnZSI6Im51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIsInN1cHBvcnQuZnVuY3Rpb24iOiJhbGVydCIsImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iOiJ0cnVlfGZhbHNlIn0sImlkZW50aWZpZXIiKSxuPSJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkfHZvaWQiLHI9IlxcXFwoPzp4WzAtOWEtZkEtRl17Mn18dVswLTlhLWZBLUZdezR9fHV7WzAtOWEtZkEtRl17MSw2fX18WzAtMl1bMC03XXswLDJ9fDNbMC03XVswLTddP3xbNC03XVswLTddP3wuKSI7dGhpcy4kcnVsZXM9e25vX3JlZ2V4OltpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksZigibm9fcmVnZXgiKSx7dG9rZW46InN0cmluZyIscmVnZXg6IicoPz0uKSIsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonIig/PS4pJyxuZXh0OiJxcXN0cmluZyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6LzAoPzpbeFhdWzAtOWEtZkEtRl0rfFtvT11bMC03XSt8W2JCXVswMV0rKVxiL30se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDovKD86XGRcZCooPzpcLlxkKik/fFwuXGQrKSg/OltlRV1bKy1dP1xkK1xiKT8vfSx7dG9rZW46WyJzdG9yYWdlLnR5cGUiLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsInN1cHBvcnQuZnVuY3Rpb24iLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsImtleXdvcmQub3BlcmF0b3IiXSxyZWdleDoiKCIrbysiKShcXC4pKHByb3RvdHlwZSkoXFwuKSgiK28rIikoXFxzKikoPSkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjpbInN0b3JhZ2UudHlwZSIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0Iiwia2V5d29yZC5vcGVyYXRvciIsInRleHQiLCJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6IigiK28rIikoXFwuKSgiK28rIikoXFxzKikoPSkoXFxzKikoZnVuY3Rpb24pKFxccyopKFxcKCkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjpbImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsImtleXdvcmQub3BlcmF0b3IiLCJ0ZXh0Iiwic3RvcmFnZS50eXBlIiwidGV4dCIsInBhcmVuLmxwYXJlbiJdLHJlZ2V4OiIoIitvKyIpKFxccyopKD0pKFxccyopKGZ1bmN0aW9uKShcXHMqKShcXCgpIixuZXh0OiJmdW5jdGlvbl9hcmd1bWVudHMifSx7dG9rZW46WyJzdG9yYWdlLnR5cGUiLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsImtleXdvcmQub3BlcmF0b3IiLCJ0ZXh0Iiwic3RvcmFnZS50eXBlIiwidGV4dCIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsInBhcmVuLmxwYXJlbiJdLHJlZ2V4OiIoIitvKyIpKFxcLikoIitvKyIpKFxccyopKD0pKFxccyopKGZ1bmN0aW9uKShcXHMrKShcXHcrKShcXHMqKShcXCgpIixuZXh0OiJmdW5jdGlvbl9hcmd1bWVudHMifSx7dG9rZW46WyJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6IihmdW5jdGlvbikoXFxzKykoIitvKyIpKFxccyopKFxcKCkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjpbImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwidGV4dCIsInN0b3JhZ2UudHlwZSIsInRleHQiLCJwYXJlbi5scGFyZW4iXSxyZWdleDoiKCIrbysiKShcXHMqKSg6KShcXHMqKShmdW5jdGlvbikoXFxzKikoXFwoKSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOlsidGV4dCIsInRleHQiLCJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6Iig6KShcXHMqKShmdW5jdGlvbikoXFxzKikoXFwoKSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiZnJvbSg/PVxccyooJ3xcIikpIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiKD86IituKyIpXFxiIixuZXh0OiJzdGFydCJ9LHt0b2tlbjpbInN1cHBvcnQuY29uc3RhbnQiXSxyZWdleDovdGhhdFxiL30se3Rva2VuOlsic3RvcmFnZS50eXBlIiwicHVuY3R1YXRpb24ub3BlcmF0b3IiLCJzdXBwb3J0LmZ1bmN0aW9uLmZpcmVidWciXSxyZWdleDovKGNvbnNvbGUpKFwuKSh3YXJufGluZm98bG9nfGVycm9yfHRpbWV8dHJhY2V8dGltZUVuZHxhc3NlcnQpXGIvfSx7dG9rZW46dCxyZWdleDpvfSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDovWy5dKD8hWy5dKS8sbmV4dDoicHJvcGVydHkifSx7dG9rZW46InN0b3JhZ2UudHlwZSIscmVnZXg6Lz0+LyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6Ly0tfFwrXCt8XC57M318PT09fD09fD18IT18IT09fDwrPT98Pis9P3whfCYmfFx8XHx8XD86fFshJCUmKitcLX5cL15dPT8vLG5leHQ6InN0YXJ0In0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6L1s/Oiw7Ll0vLG5leHQ6InN0YXJ0In0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4Oi9bXFsoe10vLG5leHQ6InN0YXJ0In0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4Oi9bXF0pfV0vfSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4Oi9eIyEuKiQvfV0scHJvcGVydHk6W3t0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46WyJzdG9yYWdlLnR5cGUiLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsImtleXdvcmQub3BlcmF0b3IiLCJ0ZXh0Iiwic3RvcmFnZS50eXBlIiwidGV4dCIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsInBhcmVuLmxwYXJlbiJdLHJlZ2V4OiIoIitvKyIpKFxcLikoIitvKyIpKFxccyopKD0pKFxccyopKGZ1bmN0aW9uKSg/OihcXHMrKShcXHcrKSk/KFxccyopKFxcKCkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjoicHVuY3R1YXRpb24ub3BlcmF0b3IiLHJlZ2V4Oi9bLl0oPyFbLl0pL30se3Rva2VuOiJzdXBwb3J0LmZ1bmN0aW9uIixyZWdleDovKHMoPzpoKD86aWZ0fG93KD86TW9kKD86ZWxlc3NEaWFsb2d8YWxEaWFsb2cpfEhlbHApKXxjcm9sbCg/Olh8QnkoPzpQYWdlc3xMaW5lcyk/fFl8VG8pP3x0KD86b3B8cmlrZSl8aSg/Om58emVUb0NvbnRlbnR8ZGViYXJ8Z25UZXh0KXxvcnR8dSg/OnB8Yig/OnN0cig/OmluZyk/KT8pfHBsaSg/OmNlfHQpfGUoPzpuZHx0KD86UmUoPzpzaXphYmxlfHF1ZXN0SGVhZGVyKXxNKD86aSg/Om51dGVzfGxsaXNlY29uZHMpfG9udGgpfFNlY29uZHN8SG8oPzp0S2V5c3x1cnMpfFllYXJ8Q3Vyc29yfFRpbWUoPzpvdXQpP3xJbnRlcnZhbHxaT3B0aW9uc3xEYXRlfFVUQyg/Ok0oPzppKD86bnV0ZXN8bGxpc2Vjb25kcyl8b250aCl8U2Vjb25kc3xIb3Vyc3xEYXRlfEZ1bGxZZWFyKXxGdWxsWWVhcnxBY3RpdmUpfGFyY2gpfHFydHxsaWNlfGF2ZVByZWZlcmVuY2VzfG1hbGwpfGgoPzpvbWV8YW5kbGVFdmVudCl8bmF2aWdhdGV8Yyg/Omhhcig/OkNvZGVBdHxBdCl8byg/OnN8big/OmNhdHx0ZXh0dWFsfGZpcm0pfG1waWxlKXxlaWx8bGVhcig/OlRpbWVvdXR8SW50ZXJ2YWwpP3xhKD86cHR1cmVFdmVudHN8bGwpfHJlYXRlKD86U3R5bGVTaGVldHxQb3B1cHxFdmVudE9iamVjdCkpfHQoPzpvKD86R01UU3RyaW5nfFMoPzp0cmluZ3xvdXJjZSl8VSg/OlRDU3RyaW5nfHBwZXJDYXNlKXxMbyg/OmNhbGVTdHJpbmd8d2VyQ2FzZSkpfGVzdHxhKD86bnxpbnQoPzpFbmFibGVkKT8pKXxpKD86cyg/Ok5hTnxGaW5pdGUpfG5kZXhPZnx0YWxpY3MpfGQoPzppc2FibGVFeHRlcm5hbENhcHR1cmV8dW1wfGV0YWNoRXZlbnQpfHUoPzpuKD86c2hpZnR8dGFpbnR8ZXNjYXBlfHdhdGNoKXxwZGF0ZUNvbW1hbmRzKXxqKD86b2lufGF2YUVuYWJsZWQpfHAoPzpvKD86cHx3KXx1c2h8bHVnaW5zLnJlZnJlc2h8YSg/OmRkaW5nc3xyc2UoPzpJbnR8RmxvYXQpPyl8cig/OmludHxvbXB0fGVmZXJlbmNlKSl8ZSg/OnNjYXBlfG5hYmxlRXh0ZXJuYWxDYXB0dXJlfHZhbHxsZW1lbnRGcm9tUG9pbnR8eCg/OnB8ZWMoPzpTY3JpcHR8Q29tbWFuZCk/KSl8dmFsdWVPZnxVVEN8cXVlcnlDb21tYW5kKD86U3RhdGV8SW5kZXRlcm18RW5hYmxlZHxWYWx1ZSl8Zig/OmkoPzpuZHxsZSg/Ok1vZGlmaWVkRGF0ZXxTaXplfENyZWF0ZWREYXRlfFVwZGF0ZWREYXRlKXx4ZWQpfG8oPzpudCg/OnNpemV8Y29sb3IpfHJ3YXJkKXxsb29yfHJvbUNoYXJDb2RlKXx3YXRjaHxsKD86aW5rfG8oPzphZHxnKXxhc3RJbmRleE9mKXxhKD86c2lufG5jaG9yfGNvc3x0KD86dGFjaEV2ZW50fG9ifGFuKD86Mik/KXxwcGx5fGxlcnR8Yig/OnN8b3J0KSl8cig/Om91KD86bmR8dGVFdmVudHMpfGUoPzpzaXplKD86Qnl8VG8pfGNhbGN8dHVyblZhbHVlfHBsYWNlfHZlcnNlfGwoPzpvYWR8ZWFzZSg/OkNhcHR1cmV8RXZlbnRzKSkpfGFuZG9tKXxnKD86b3xldCg/OlJlc3BvbnNlSGVhZGVyfE0oPzppKD86bnV0ZXN8bGxpc2Vjb25kcyl8b250aCl8U2UoPzpjb25kc3xsZWN0aW9uKXxIb3Vyc3xZZWFyfFRpbWUoPzp6b25lT2Zmc2V0KT98RGEoPzp5fHRlKXxVVEMoPzpNKD86aSg/Om51dGVzfGxsaXNlY29uZHMpfG9udGgpfFNlY29uZHN8SG91cnN8RGEoPzp5fHRlKXxGdWxsWWVhcil8RnVsbFllYXJ8QSg/OnR0ZW50aW9ufGxsUmVzcG9uc2VIZWFkZXJzKSkpfG0oPzppbnxvdmUoPzpCKD86eXxlbG93KXxUbyg/OkFic29sdXRlKT98QWJvdmUpfGVyZ2VBdHRyaWJ1dGVzfGEoPzp0Y2h8cmdpbnN8eCkpfGIoPzp0b2F8aWd8byg/OmxkfHJkZXJXaWR0aHMpfGxpbmt8YWNrKSlcYig/PVwoKS99LHt0b2tlbjoic3VwcG9ydC5mdW5jdGlvbi5kb20iLHJlZ2V4Oi8ocyg/OnViKD86c3RyaW5nRGF0YXxtaXQpfHBsaXRUZXh0fGUoPzp0KD86TmFtZWRJdGVtfEF0dHJpYnV0ZSg/Ok5vZGUpPyl8bGVjdCkpfGhhcyg/OkNoaWxkTm9kZXN8RmVhdHVyZSl8bmFtZWRJdGVtfGMoPzpsKD86aWNrfG8oPzpzZXxuZU5vZGUpKXxyZWF0ZSg/OkMoPzpvbW1lbnR8REFUQVNlY3Rpb258YXB0aW9uKXxUKD86SGVhZHxleHROb2RlfEZvb3QpfERvY3VtZW50RnJhZ21lbnR8UHJvY2Vzc2luZ0luc3RydWN0aW9ufEUoPzpudGl0eVJlZmVyZW5jZXxsZW1lbnQpfEF0dHJpYnV0ZSkpfHRhYkluZGV4fGkoPzpuc2VydCg/OlJvd3xCZWZvcmV8Q2VsbHxEYXRhKXx0ZW0pfG9wZW58ZGVsZXRlKD86Um93fEMoPzplbGx8YXB0aW9uKXxUKD86SGVhZHxGb290KXxEYXRhKXxmb2N1c3x3cml0ZSg/OmxuKT98YSg/OmRkfHBwZW5kKD86Q2hpbGR8RGF0YSkpfHJlKD86c2V0fHBsYWNlKD86Q2hpbGR8RGF0YSl8bW92ZSg/Ok5hbWVkSXRlbXxDaGlsZHxBdHRyaWJ1dGUoPzpOb2RlKT8pPyl8Z2V0KD86TmFtZWRJdGVtfEVsZW1lbnQoPzpzQnkoPzpOYW1lfFRhZ05hbWV8Q2xhc3NOYW1lKXxCeUlkKXxBdHRyaWJ1dGUoPzpOb2RlKT8pfGJsdXIpXGIoPz1cKCkvfSx7dG9rZW46InN1cHBvcnQuY29uc3RhbnQiLHJlZ2V4Oi8ocyg/OnlzdGVtTGFuZ3VhZ2V8Y3IoPzppcHRzfG9sbGJhcnN8ZWVuKD86WHxZfFRvcHxMZWZ0KSl8dCg/OnlsZSg/OlNoZWV0cyk/fGF0dXMoPzpUZXh0fGJhcik/KXxpYmxpbmcoPzpCZWxvd3xBYm92ZSl8b3VyY2V8dWZmaXhlc3xlKD86Y3VyaXR5KD86UG9saWN5KT98bCg/OmVjdGlvbnxmKSkpfGgoPzppc3Rvcnl8b3N0KD86bmFtZSk/fGFzKD86aHxGb2N1cykpfHl8WCg/Ok1MRG9jdW1lbnR8U0xEb2N1bWVudCl8big/OmV4dHxhbWUoPzpzcGFjZSg/OnN8VVJJKXxQcm9wKSl8TSg/OklOX1ZBTFVFfEFYX1ZBTFVFKXxjKD86aGFyYWN0ZXJTZXR8byg/Om4oPzpzdHJ1Y3Rvcnx0cm9sbGVycyl8b2tpZUVuYWJsZWR8bG9yRGVwdGh8bXAoPzpvbmVudHN8bGV0ZSkpfHVycmVudHxwdUNsYXNzfGwoPzppKD86cCg/OmJvYXJkRGF0YSk/fGVudEluZm9ybWF0aW9uKXxvc2VkfGFzc2VzKXxhbGxlKD86ZXxyKXxyeXB0byl8dCg/Om8oPzpvbGJhcnxwKXxleHQoPzpUcmFuc2Zvcm18SW5kZW50fERlY29yYXRpb258QWxpZ24pfGFncyl8U1FSVCg/OjFfMnwyKXxpKD86big/Om5lcig/OkhlaWdodHxXaWR0aCl8cHV0KXxkc3xnbm9yZUNhc2UpfHpJbmRleHxvKD86c2NwdXxuKD86cmVhZHlzdGF0ZWNoYW5nZXxMaW5lKXx1dGVyKD86SGVpZ2h0fFdpZHRoKXxwKD86c1Byb2ZpbGV8ZW5lcil8ZmZzY3JlZW5CdWZmZXJpbmcpfE5FR0FUSVZFX0lORklOSVRZfGQoPzppKD86c3BsYXl8YWxvZyg/OkhlaWdodHxUb3B8V2lkdGh8TGVmdHxBcmd1bWVudHMpfHJlY3Rvcmllcyl8ZSg/OnNjcmlwdGlvbnxmYXVsdCg/OlN0YXR1c3xDaCg/OmVja2VkfGFyc2V0KXxWaWV3KSkpfHUoPzpzZXIoPzpQcm9maWxlfExhbmd1YWdlfEFnZW50KXxuKD86aXF1ZUlEfGRlZmluZWQpfHBkYXRlSW50ZXJ2YWwpfF9jb250ZW50fHAoPzppeGVsRGVwdGh8b3J0fGVyc29uYWxiYXJ8a2NzMTF8bCg/OnVnaW5zfGF0Zm9ybSl8YSg/OnRobmFtZXxkZGluZyg/OlJpZ2h0fEJvdHRvbXxUb3B8TGVmdCl8cmVudCg/OldpbmRvd3xMYXllcik/fGdlKD86WCg/Ok9mZnNldCk/fFkoPzpPZmZzZXQpPykpfHIoPzpvKD86dG8oPzpjb2x8dHlwZSl8ZHVjdCg/OlN1Yik/fG1wdGVyKXxlKD86dmlvdXN8Zml4KSkpfGUoPzpuKD86Y29kaW5nfGFibGVkUGx1Z2luKXx4KD86dGVybmFsfHBhbmRvKXxtYmVkcyl8dig/OmlzaWJpbGl0eXxlbmRvcig/OlN1Yik/fExpbmtjb2xvcil8VVJMVW5lbmNvZGVkfFAoPzpJfE9TSVRJVkVfSU5GSU5JVFkpfGYoPzppbGVuYW1lfG8oPzpudCg/OlNpemV8RmFtaWx5fFdlaWdodCl8cm1OYW1lKXxyYW1lKD86c3xFbGVtZW50KXxnQ29sb3IpfEV8d2hpdGVTcGFjZXxsKD86aSg/OnN0U3R5bGVUeXBlfG4oPzplSGVpZ2h0fGtDb2xvcikpfG8oPzpjYSg/OnRpb24oPzpiYXIpP3xsTmFtZSl8d3NyYyl8ZSg/Om5ndGh8ZnQoPzpDb250ZXh0KT8pfGEoPzpzdCg/Ok0oPzpvZGlmaWVkfGF0Y2gpfEluZGV4fFBhcmVuKXx5ZXIoPzpzfFgpfG5ndWFnZSkpfGEoPzpwcCg/Ok1pbm9yVmVyc2lvbnxOYW1lfENvKD86ZGVOYW1lfHJlKXxWZXJzaW9uKXx2YWlsKD86SGVpZ2h0fFRvcHxXaWR0aHxMZWZ0KXxsbHxyKD86aXR5fGd1bWVudHMpfExpbmtjb2xvcnxib3ZlKXxyKD86aWdodCg/OkNvbnRleHQpP3xlKD86c3BvbnNlKD86WE1MfFRleHQpfGFkeVN0YXRlKSl8Z2xvYmFsfHh8bSg/OmltZVR5cGVzfHVsdGlsaW5lfGVudWJhcnxhcmdpbig/OlJpZ2h0fEJvdHRvbXxUb3B8TGVmdCkpfEwoPzpOKD86MTB8Mil8T0coPzoxMEV8MkUpKXxiKD86byg/OnR0b218cmRlcig/OldpZHRofFJpZ2h0V2lkdGh8Qm90dG9tV2lkdGh8U3R5bGV8Q29sb3J8VG9wV2lkdGh8TGVmdFdpZHRoKSl8dWZmZXJEZXB0aHxlbG93fGFja2dyb3VuZCg/OkNvbG9yfEltYWdlKSkpXGIvfSx7dG9rZW46ImlkZW50aWZpZXIiLHJlZ2V4Om99LHtyZWdleDoiIix0b2tlbjoiZW1wdHkiLG5leHQ6Im5vX3JlZ2V4In1dLHN0YXJ0OltpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksZigic3RhcnQiKSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJcXC8iLG5leHQ6InJlZ2V4In0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzK3xeJCIsbmV4dDoic3RhcnQifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJub19yZWdleCJ9XSxyZWdleDpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiL1tzeG5naW15XSoiLG5leHQ6Im5vX3JlZ2V4In0se3Rva2VuOiJpbnZhbGlkIixyZWdleDovXHtcZCtcYiw/XGQqXH1bKypdfFsrKiReP11bKypdfFskXl1bP118XD97Myx9L30se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4Oi9cKFw/Wzo9IV18XCl8XHtcZCtcYiw/XGQqXH18WysqXVw/fFsoKSReKyo/Ll0vfSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmRlbGltaXRlciIscmVnZXg6L1x8L30se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4Oi9cW1xePy8sbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIn0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiQiLG5leHQ6Im5vX3JlZ2V4In0se2RlZmF1bHRUb2tlbjoic3RyaW5nLnJlZ2V4cCJ9XSxyZWdleF9jaGFyYWN0ZXJfY2xhc3M6W3t0b2tlbjoicmVnZXhwLmNoYXJjbGFzcy5rZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6Il0iLG5leHQ6InJlZ2V4In0se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4OiItIn0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiQiLG5leHQ6Im5vX3JlZ2V4In0se2RlZmF1bHRUb2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MifV0sZnVuY3Rpb25fYXJndW1lbnRzOlt7dG9rZW46InZhcmlhYmxlLnBhcmFtZXRlciIscmVnZXg6b30se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IlssIF0rIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IiQifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJub19yZWdleCJ9XSxxcXN0cmluZzpbe3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4OnJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFxcXCQiLGNvbnN1bWVMaW5lRW5kOiEwfSx7dG9rZW46InN0cmluZyIscmVnZXg6JyJ8JCcsbmV4dDoibm9fcmVnZXgifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcifV0scXN0cmluZzpbe3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4OnJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFxcXCQiLGNvbnN1bWVMaW5lRW5kOiEwfSx7dG9rZW46InN0cmluZyIscmVnZXg6Iid8JCIsbmV4dDoibm9fcmVnZXgifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcifV19O2lmKCFlfHwhZS5ub0VTNil0aGlzLiRydWxlcy5ub19yZWdleC51bnNoaWZ0KHtyZWdleDoiW3t9XSIsb25NYXRjaDpmdW5jdGlvbihlLHQsbil7dGhpcy5uZXh0PWU9PSJ7Ij90aGlzLm5leHRTdGF0ZToiIjtpZihlPT0ieyImJm4ubGVuZ3RoKW4udW5zaGlmdCgic3RhcnQiLHQpO2Vsc2UgaWYoZT09In0iJiZuLmxlbmd0aCl7bi5zaGlmdCgpLHRoaXMubmV4dD1uLnNoaWZ0KCk7aWYodGhpcy5uZXh0LmluZGV4T2YoInN0cmluZyIpIT0tMXx8dGhpcy5uZXh0LmluZGV4T2YoImpzeCIpIT0tMSlyZXR1cm4icGFyZW4ucXVhc2kuZW5kIn1yZXR1cm4gZT09InsiPyJwYXJlbi5scGFyZW4iOiJwYXJlbi5ycGFyZW4ifSxuZXh0U3RhdGU6InN0YXJ0In0se3Rva2VuOiJzdHJpbmcucXVhc2kuc3RhcnQiLHJlZ2V4Oi9gLyxwdXNoOlt7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6cn0se3Rva2VuOiJwYXJlbi5xdWFzaS5zdGFydCIscmVnZXg6L1wkey8scHVzaDoic3RhcnQifSx7dG9rZW46InN0cmluZy5xdWFzaS5lbmQiLHJlZ2V4Oi9gLyxuZXh0OiJwb3AifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcucXVhc2kifV19KSwoIWV8fGUuanN4IT0wKSYmYS5jYWxsKHRoaXMpO3RoaXMuZW1iZWRSdWxlcyhpLCJkb2MtIixbaS5nZXRFbmRSdWxlKCJub19yZWdleCIpXSksdGhpcy5ub3JtYWxpemVSdWxlcygpfTtyLmluaGVyaXRzKHUscyksdC5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM9dX0pLGFjZS5kZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL3JhbmdlIikuUmFuZ2UsaT1mdW5jdGlvbigpe307KGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4vXlxzKyQvLnRlc3QoZSk/L15ccypcfS8udGVzdCh0KTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZ2V0TGluZSh0KSxpPW4ubWF0Y2goL14oXHMqXH0pLyk7aWYoIWkpcmV0dXJuIDA7dmFyIHM9aVsxXS5sZW5ndGgsbz1lLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzp0LGNvbHVtbjpzfSk7aWYoIW98fG8ucm93PT10KXJldHVybiAwO3ZhciB1PXRoaXMuJGdldEluZGVudChlLmdldExpbmUoby5yb3cpKTtlLnJlcGxhY2UobmV3IHIodCwwLHQscy0xKSx1KX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlLm1hdGNoKC9eXHMqLylbMF19fSkuY2FsbChpLnByb3RvdHlwZSksdC5NYXRjaGluZ0JyYWNlT3V0ZGVudD1pfSksYWNlLmRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi8uLi9saWIvb29wIiksaT1lKCIuLi8uLi9yYW5nZSIpLlJhbmdlLHM9ZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxvPXQuRm9sZE1vZGU9ZnVuY3Rpb24oZSl7ZSYmKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW5ldyBSZWdFeHAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIuc291cmNlLnJlcGxhY2UoL1x8W158XSo/JC8sInwiK2Uuc3RhcnQpKSx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPW5ldyBSZWdFeHAodGhpcy5mb2xkaW5nU3RvcE1hcmtlci5zb3VyY2UucmVwbGFjZSgvXHxbXnxdKj8kLywifCIrZS5lbmQpKSl9O3IuaW5oZXJpdHMobyxzKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPS8oW1x7XFtcKF0pW15cfVxdXCldKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce1woXSooW1x9XF1cKV0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLnNpbmdsZUxpbmVCbG9ja0NvbW1lbnRSZT0vXlxzKihcL1wqKS4qXCpcL1xzKiQvLHRoaXMudHJpcGxlU3RhckJsb2NrQ29tbWVudFJlPS9eXHMqKFwvXCpcKlwqKS4qXCpcL1xzKiQvLHRoaXMuc3RhcnRSZWdpb25SZT0vXlxzKihcL1wqfFwvXC8pIz9yZWdpb25cYi8sdGhpcy5fZ2V0Rm9sZFdpZGdldEJhc2U9dGhpcy5nZXRGb2xkV2lkZ2V0LHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXRMaW5lKG4pO2lmKHRoaXMuc2luZ2xlTGluZUJsb2NrQ29tbWVudFJlLnRlc3QocikmJiF0aGlzLnN0YXJ0UmVnaW9uUmUudGVzdChyKSYmIXRoaXMudHJpcGxlU3RhckJsb2NrQ29tbWVudFJlLnRlc3QocikpcmV0dXJuIiI7dmFyIGk9dGhpcy5fZ2V0Rm9sZFdpZGdldEJhc2UoZSx0LG4pO3JldHVybiFpJiZ0aGlzLnN0YXJ0UmVnaW9uUmUudGVzdChyKT8ic3RhcnQiOml9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUuZ2V0TGluZShuKTtpZih0aGlzLnN0YXJ0UmVnaW9uUmUudGVzdChpKSlyZXR1cm4gdGhpcy5nZXRDb21tZW50UmVnaW9uQmxvY2soZSxpLG4pO3ZhciBzPWkubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKHMpe3ZhciBvPXMuaW5kZXg7aWYoc1sxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGUsc1sxXSxuLG8pO3ZhciB1PWUuZ2V0Q29tbWVudEZvbGRSYW5nZShuLG8rc1swXS5sZW5ndGgsMSk7cmV0dXJuIHUmJiF1LmlzTXVsdGlMaW5lKCkmJihyP3U9dGhpcy5nZXRTZWN0aW9uUmFuZ2UoZSxuKTp0IT0iYWxsIiYmKHU9bnVsbCkpLHV9aWYodD09PSJtYXJrYmVnaW4iKXJldHVybjt2YXIgcz1pLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpO2lmKHMpe3ZhciBvPXMuaW5kZXgrc1swXS5sZW5ndGg7cmV0dXJuIHNbMV0/dGhpcy5jbG9zaW5nQnJhY2tldEJsb2NrKGUsc1sxXSxuLG8pOmUuZ2V0Q29tbWVudEZvbGRSYW5nZShuLG8sLTEpfX0sdGhpcy5nZXRTZWN0aW9uUmFuZ2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldExpbmUodCkscj1uLnNlYXJjaCgvXFMvKSxzPXQsbz1uLmxlbmd0aDt0Kz0xO3ZhciB1PXQsYT1lLmdldExlbmd0aCgpO3doaWxlKCsrdDxhKXtuPWUuZ2V0TGluZSh0KTt2YXIgZj1uLnNlYXJjaCgvXFMvKTtpZihmPT09LTEpY29udGludWU7aWYocj5mKWJyZWFrO3ZhciBsPXRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlKGUsImFsbCIsdCk7aWYobCl7aWYobC5zdGFydC5yb3c8PXMpYnJlYWs7aWYobC5pc011bHRpTGluZSgpKXQ9bC5lbmQucm93O2Vsc2UgaWYocj09ZilicmVha311PXR9cmV0dXJuIG5ldyBpKHMsbyx1LGUuZ2V0TGluZSh1KS5sZW5ndGgpfSx0aGlzLmdldENvbW1lbnRSZWdpb25CbG9jaz1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5zZWFyY2goL1xzKiQvKSxzPWUuZ2V0TGVuZ3RoKCksbz1uLHU9L15ccyooPzpcL1wqfFwvXC98LS0pIz8oZW5kKT9yZWdpb25cYi8sYT0xO3doaWxlKCsrbjxzKXt0PWUuZ2V0TGluZShuKTt2YXIgZj11LmV4ZWModCk7aWYoIWYpY29udGludWU7ZlsxXT9hLS06YSsrO2lmKCFhKWJyZWFrfXZhciBsPW47aWYobD5vKXJldHVybiBuZXcgaShvLHIsbCx0Lmxlbmd0aCl9fS5jYWxsKG8ucHJvdG90eXBlKX0pLGFjZS5kZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIiwiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4vdGV4dCIpLk1vZGUscz1lKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLG89ZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsdT1lKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxhPWUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixmPWUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxsPWZ1bmN0aW9uKCl7dGhpcy5IaWdobGlnaHRSdWxlcz1zLHRoaXMuJG91dGRlbnQ9bmV3IG8sdGhpcy4kYmVoYXZpb3VyPW5ldyBhLHRoaXMuZm9sZGluZ1J1bGVzPW5ldyBmfTtyLmluaGVyaXRzKGwsaSksZnVuY3Rpb24oKXt0aGlzLmxpbmVDb21tZW50U3RhcnQ9Ii8vIix0aGlzLmJsb2NrQ29tbWVudD17c3RhcnQ6Ii8qIixlbmQ6IiovIn0sdGhpcy4kcXVvdGVzPXsnIic6JyInLCInIjoiJyIsImAiOiJgIn0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy4kZ2V0SW5kZW50KHQpLGk9dGhpcy5nZXRUb2tlbml6ZXIoKS5nZXRMaW5lVG9rZW5zKHQsZSkscz1pLnRva2VucyxvPWkuc3RhdGU7aWYocy5sZW5ndGgmJnNbcy5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiByO2lmKGU9PSJzdGFydCJ8fGU9PSJub19yZWdleCIpe3ZhciB1PXQubWF0Y2goL14uKig/OlxiY2FzZVxiLio6fFtce1woXFtdKVxzKiQvKTt1JiYocis9bil9ZWxzZSBpZihlPT0iZG9jLXN0YXJ0Iil7aWYobz09InN0YXJ0Inx8bz09Im5vX3JlZ2V4IilyZXR1cm4iIjt2YXIgdT10Lm1hdGNoKC9eXHMqKFwvPylcKi8pO3UmJih1WzFdJiYocis9IiAiKSxyKz0iKiAiKX1yZXR1cm4gcn0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudCh0LG4pfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGUsdCxuKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KHQsbil9LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyB1KFsiYWNlIl0sImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwiSmF2YVNjcmlwdFdvcmtlciIpO3JldHVybiB0LmF0dGFjaFRvRG9jdW1lbnQoZS5nZXREb2N1bWVudCgpKSx0Lm9uKCJhbm5vdGF0ZSIsZnVuY3Rpb24odCl7ZS5zZXRBbm5vdGF0aW9ucyh0LmRhdGEpfSksdC5vbigidGVybWluYXRlIixmdW5jdGlvbigpe2UuY2xlYXJBbm5vdGF0aW9ucygpfSksdH0sdGhpcy4kaWQ9ImFjZS9tb2RlL2phdmFzY3JpcHQifS5jYWxsKGwucHJvdG90eXBlKSx0Lk1vZGU9bH0pOyAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgYWNlLnJlcXVpcmUoWyJhY2UvbW9kZS9qYXZhc2NyaXB0Il0sIGZ1bmN0aW9uKG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIgJiYgdHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgbW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKCk7ICAgIAp9OwoK0LzRg9GA0L7QvC7RgdC+0LfQtNCw0YLRjNCg0LXQtNCw0LrRgtC+0YDQktCb0LXQstC+0LnQntCx0LvQsNGB0YLQuCA9IGZ1bmN0aW9uKCkKewogICAg0LzRg9GA0L7QvC7Qt9Cw0LPRgNGD0LfQuNGC0YxBQ0UoKTsKICAgINC80YPRgNC+0Lwu0LfQsNCz0YDRg9C30LjRgtGM0KDQtdC20LjQvEFDRUpTKCk7CiAgICAKICAgIHZhciDRgNC10LTQsNC60YLQvtGAID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICDRgNC10LTQsNC60YLQvtGALmlkID0gItGA0LXQtNCw0LrRgtC+0YAiOwogICAg0YDQtdC00LDQutGC0L7RgC5zdHlsZS5jc3NUZXh0ID0gImhlaWdodDogMTAwJTsiOwogICAgdmFyINC+0LHQu9Cw0YHRgtGMID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoItC70LXQstCw0Y8t0L7QsdC70LDRgdGC0YwiKTsKICAgINC+0LHQu9Cw0YHRgtGMLmFwcGVuZENoaWxkKNGA0LXQtNCw0LrRgtC+0YApOwogICAg0LzRg9GA0L7QvC7RgNC10LTQsNC60YLQvtGAID0gd2luZG93LmFjZS5lZGl0KCLRgNC10LTQsNC60YLQvtGAIik7CiAgICDQvNGD0YDQvtC8LtGA0LXQtNCw0LrRgtC+0YAuc2Vzc2lvbi5zZXRNb2RlKCJhY2UvbW9kZS9qYXZhc2NyaXB0Iik7Cn07", -{"status":true} -], - - -[ -"муром.пу_1.0.0", -"LyoKICoKICog0JLQvdC10YjQvdC40Lkg0LLQuNC0CiAqCiAqLwoKZnVuY3Rpb24g0LfQsNC00LDRgtGM0JLQvdC10YjQvdC40LnQktC40LQoKQp7CiAgICB2YXIg0LLQuNC0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQo0LLQuNC0KTsKICAgINCy0LjQtC5pbm5lckhUTUwgPQpgCi7QvNGD0YDQvtC8LdC60L3QvtC/0LrQsAp7CiAgICBwYWRkaW5nOiAwLjVlbSAyZW0gMC41ZW0gMmVtOwogICAgbWFyZ2luLXJpZ2h0OiAwLjVlbTsKICAgIGZsb2F0OiByaWdodDsKICAgIGNvbG9yOiAjMjIyOwogICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOwogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjJzOyAvKiBTYWZhcmkgKi8KICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMnM7Cn0KLtC80YPRgNC+0Lwt0LrQvdC+0L/QutCwOmhvdmVyCnsKICAgIGJvcmRlcjogMXB4IHNvbGlkICMyMjI7Cn0KLtC80YPRgNC+0Lwt0L7RgtGB0YLRg9C/LdC/0L4t0YHRgtC+0YDQvtC90LDQvAp7CiAgICBtYXJnaW4tbGVmdDogMC41ZW07CiAgICBtYXJnaW4tcmlnaHQ6IDAuNWVtOwp9CmA7Cn0KCi8qCiAqCiAqINCh0L/QuNGB0L7QuiDQvNC+0LTRg9C70LXQuQogKgogKi8KCmZ1bmN0aW9uINCh0L/QuNGB0L7QutCc0L7QtNGD0LvQtdC5KCkKewogICAgdmFyINGPID0gdGhpczsKCiAgICB0aGlzLtGB0L7Qt9C00LDRgtGM0JjQvdGC0LXRgNGE0LXQudGBKCk7CiAgICB0aGlzLtC30LDQtNCw0YLRjNCS0LjQtCgpOwogICAgdGhpcy7QstGL0LHRgNCw0LvQuCA9IG5ldyDQo9Cy0LXQtNC+0LzQuNGC0LXQu9GMKCk7CiAgICB0aGlzLtCy0YvQsdGA0LDQu9C4LtC/0L7QtNC/0LjRgdCw0YLRjChmdW5jdGlvbigpewogICAgICAgINGPLtC+0YLQvtCx0YDQsNC30LjRgtGM0JLRi9Cx0L7RgCgpOwogICAgfSk7Cn0K0KHQv9C40YHQvtC60JzQvtC00YPQu9C10LkucHJvdG90eXBlLtGB0L7Qt9C00LDRgtGM0JjQvdGC0LXRgNGE0LXQudGBID0gZnVuY3Rpb24oKQp7CiAgICAvLyDQn9C+0LzQtdGJ0LDQtdC8INGC0LDQsdC70LjRhtGDINCyIGRpdiDQtNC70Y8g0YDQtdCw0LvQuNC30LDRhtC40Lgg0L/RgNC+0LzQvtGC0LrQuC4KICAgIHRoaXMu0LjRhCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgdGhpcy7RgtCw0LHQu9C40YbQsCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRhYmxlIik7CiAgICB0aGlzLtC40YQuYXBwZW5kQ2hpbGQodGhpcy7RgtCw0LHQu9C40YbQsCk7Cn07CtCh0L/QuNGB0L7QutCc0L7QtNGD0LvQtdC5LnByb3RvdHlwZS7Qt9Cw0LTQsNGC0YzQktC40LQgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMu0LjRhC5zdHlsZS5jc3NUZXh0ID0KYApvdmVyZmxvdzogYXV0bzsKaGVpZ2h0OiAxOC41ZW07CmJvcmRlcjogMXB4IHNvbGlkICNkZGQ7Ci8qCnBhZGRpbmc6IDAuNWVtOwptYXJnaW46IDAuNWVtOwoqLwpgOwogICAgdGhpcy7RgtCw0LHQu9C40YbQsC5zdHlsZS5jc3NUZXh0ID0KYApjb2xvcjogIzY2NjY2NjsKZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CmN1cnNvcjogZGVmYXVsdDsKYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKYDsKfTsK0KHQv9C40YHQvtC60JzQvtC00YPQu9C10LkucHJvdG90eXBlLtC+0YfQuNGB0YLQuNGC0YwgPSBmdW5jdGlvbigpCnsKICAgIHdoaWxlICh0aGlzLtGC0LDQsdC70LjRhtCwLnJvd3MubGVuZ3RoKQogICAgewogICAgICAgIHRoaXMu0YLQsNCx0LvQuNGG0LAuZGVsZXRlUm93KDApOwogICAgfTsKfTsK0KHQv9C40YHQvtC60JzQvtC00YPQu9C10LkucHJvdG90eXBlLtC00L7QsdCw0LLQuNGC0YzQrdC70LXQvNC10L3RgiA9IGZ1bmN0aW9uKNGB0YLQsNGC0YPRgSwg0LjQvNGPKQp7CiAgICB2YXIg0YHRgtCw0YLRg9GBSFRNTCA9ICIiOwogICAgaWYgKNGB0YLQsNGC0YPRgSkKICAgIHsKICAgICAgICDRgdGC0LDRgtGD0YFIVE1MID0gImNoZWNrZWQiOwogICAgfQoKICAgIHZhciDRgNGP0LQgPSB0aGlzLtGC0LDQsdC70LjRhtCwLmluc2VydFJvdygpOwogICAgdmFyINGP0YfQtdC50LrQsCA9IDA7CgogICAgdmFyINC90L7QvNC10YAgPSDRgNGP0LQuaW5zZXJ0Q2VsbCjRj9GH0LXQudC60LArKyk7CiAgICDQvdC+0LzQtdGALmlubmVySFRNTCA9IHRoaXMu0YLQsNCx0LvQuNGG0LAucm93cy5sZW5ndGggLSAxOwogICAg0L3QvtC80LXRgC5zdHlsZS5jc3NUZXh0ID0gInBhZGRpbmc6IDAuNWVtOyI7CgogICAgdmFyINCy0LrQuyA9INGA0Y/QtC5pbnNlcnRDZWxsKNGP0YfQtdC50LrQsCsrKTsKICAgINCy0LrQuy5pbm5lckhUTUwgPSBgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBkaXNhYmxlZCBgICsg0YHRgtCw0YLRg9GBSFRNTCArIGA+PC9pbnB1dD5gOwogICAgCiAgICB2YXIg0L3QsNC30LLQsNC90LjQtSA9INGA0Y/QtC5pbnNlcnRDZWxsKNGP0YfQtdC50LrQsCsrKTsKICAgINC90LDQt9Cy0LDQvdC40LUuaW5uZXJIVE1MID0g0LjQvNGPOwogICAg0L3QsNC30LLQsNC90LjQtS5zdHlsZS5jc3NUZXh0ID0gInBhZGRpbmc6IDAuNWVtOyB3aWR0aDogMTAwJTsiOwp9OwrQodC/0LjRgdC+0LrQnNC+0LTRg9C70LXQuS5wcm90b3R5cGUu0L7RgtC+0LHRgNCw0LfQuNGC0YzQodC/0LjRgdC+0LogPSBmdW5jdGlvbijRgdC/0LjRgdC+0LopCnsKICAgIHRoaXMu0L7Rh9C40YHRgtC40YLRjCgpOwogICAgZm9yICh2YXIg0L3QvtC80LXRgCBpbiDRgdC/0LjRgdC+0LopCiAgICB7CiAgICAgICAgdmFyINGN0LvQtdC80LXQvdGCID0g0YHQv9C40YHQvtC6W9C90L7QvNC10YBdOwogICAgICAgIHZhciDRgdGC0LDRgtGD0YEgPSDRjdC70LXQvNC10L3RglswXTsKICAgICAgICB2YXIg0LjQvNGPID0g0Y3Qu9C10LzQtdC90YJbMV07CiAgICAgICAgdGhpcy7QtNC+0LHQsNCy0LjRgtGM0K3Qu9C10LzQtdC90YIo0YHRgtCw0YLRg9GBLCDQuNC80Y8pOwogICAgfQp9OwrQodC/0LjRgdC+0LrQnNC+0LTRg9C70LXQuS5wcm90b3R5cGUu0YPQu9Cw0LLQu9C40LLQsNGC0YzQktGL0LHQvtGA0K3Qu9C10LzQtdC90YLQsCA9IGZ1bmN0aW9uKNC90L7QvNC10YApCnsKICAgIHZhciDRjyA9IHRoaXM7CiAgICAKICAgIHZhciDRgNGP0LQgPSB0aGlzLtGC0LDQsdC70LjRhtCwLnJvd3Nb0L3QvtC80LXRgF0KICAgINGA0Y/QtC5vbmNsaWNrID0gZnVuY3Rpb24oKQogICAgewogICAgICAgINGPLtCy0YvQsdC+0YDQoNCw0L3QtdC1ID0g0Y8u0LLRi9Cx0L7RgDsKICAgICAgICDRjy7QstGL0LHQvtGAID0g0L3QvtC80LXRgDsKICAgICAgICDRjy7QstGL0LHRgNCw0LvQuC7Rg9Cy0LXQtNC+0LzQuNGC0YwoKTsKICAgIH07Cn07CtCh0L/QuNGB0L7QutCc0L7QtNGD0LvQtdC5LnByb3RvdHlwZS7Rg9C70LDQstC70LjQstCw0YLRjNCS0YvQsdC+0YAgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMu0LLRi9Cx0L7RgNCg0LDQvdC10LUgPSBudWxsOwogICAgdGhpcy7QstGL0LHQvtGAID0gbnVsbDsKICAgIGZvciAodmFyINC90L7QvNC10YAgPSAwOyDQvdC+0LzQtdGAIDwgdGhpcy7RgtCw0LHQu9C40YbQsC5yb3dzLmxlbmd0aDsgKyvQvdC+0LzQtdGAKQogICAgewogICAgICAgIHRoaXMu0YPQu9Cw0LLQu9C40LLQsNGC0YzQktGL0LHQvtGA0K3Qu9C10LzQtdC90YLQsCjQvdC+0LzQtdGAKTsKICAgIH0KfTsK0KHQv9C40YHQvtC60JzQvtC00YPQu9C10LkucHJvdG90eXBlLtC+0YLQvtCx0YDQsNC30LjRgtGM0JLRi9Cx0L7RgCA9IGZ1bmN0aW9uKCkKewogICAgaWYgKHRoaXMu0LLRi9Cx0L7RgNCg0LDQvdC10LUgIT0gbnVsbCkKICAgIHsKICAgICAgICB2YXIg0YDRj9C0ID0gdGhpcy7RgtCw0LHQu9C40YbQsC5yb3dzW3RoaXMu0LLRi9Cx0L7RgNCg0LDQvdC10LVdOwogICAgICAgINGA0Y/QtC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwogICAgfQogICAgdmFyINGA0Y/QtCA9IHRoaXMu0YLQsNCx0LvQuNGG0LAucm93c1t0aGlzLtCy0YvQsdC+0YBdOwogICAg0YDRj9C0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICIjZWVlIjsKfTsK0KHQv9C40YHQvtC60JzQvtC00YPQu9C10LkucHJvdG90eXBlLtC30LDQtNCw0YLRjNCh0L/QuNGB0L7QuiA9IGZ1bmN0aW9uKNGB0L/QuNGB0L7QuikKewogICAgdGhpcy7QvtGC0L7QsdGA0LDQt9C40YLRjNCh0L/QuNGB0L7QuijRgdC/0LjRgdC+0LopOwogICAgdGhpcy7Rg9C70LDQstC70LjQstCw0YLRjNCS0YvQsdC+0YAoKTsKfTsK0KHQv9C40YHQvtC60JzQvtC00YPQu9C10LkucHJvdG90eXBlLtCy0YvQsdGA0LDRgtGMID0gZnVuY3Rpb24o0L3QvtC80LXRgCkKewogICAgdmFyINGA0Y/QtCA9IHRoaXMu0YLQsNCx0LvQuNGG0LAucm93c1vQvdC+0LzQtdGAXTsKICAgINGA0Y/QtC5zY3JvbGxJbnRvVmlldygpOwogICAg0YDRj9C0Lm9uY2xpY2soKTsKfTsK0KHQv9C40YHQvtC60JzQvtC00YPQu9C10LkucHJvdG90eXBlLtC+0LHQvdC+0LLQuNGC0YzQrdC70LXQvNC10L3RgiA9IGZ1bmN0aW9uKNC90L7QvNC10YAsINGB0YLQsNGC0YPRgSwg0LjQvNGPKQp7CiAgICB2YXIg0YDRj9C0ID0gdGhpcy7RgtCw0LHQu9C40YbQsC5yb3dzW9C90L7QvNC10YBdOwogICAg0YDRj9C0LmNlbGxzWzFdLmNoaWxkTm9kZXNbMF0uY2hlY2tlZCA9INGB0YLQsNGC0YPRgTsKICAgINGA0Y/QtC5jZWxsc1syXS5pbm5lckhUTUwgPSDQuNC80Y87Cn07CtCh0L/QuNGB0L7QutCc0L7QtNGD0LvQtdC5LnByb3RvdHlwZS7Rg9C00LDQu9C40YLRjNCt0LvQtdC80LXQvdGCID0gZnVuY3Rpb24o0L3QvtC80LXRgCkKewogICAgdmFyINGA0Y/QtCA9IHRoaXMu0YLQsNCx0LvQuNGG0LAucm93c1vQvdC+0LzQtdGAXTsKICAgINGA0Y/QtC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKNGA0Y/QtCk7Cn0KCi8qCiAqCiAqINCi0LXRgdGCINGB0L/QuNGB0LrQsCDQvNC+0LTRg9C70LXQuQogKgogKi8KCmZ1bmN0aW9uINCi0LXRgdGC0KHQv9C40YHQutCw0JzQvtC00YPQu9C10LkoKQp7CiAgICB0aGlzLtGB0L7Qt9C00LDRgtGM0JjQvdGC0LXRgNGE0LXQudGBKCk7Cn0K0KLQtdGB0YLQodC/0LjRgdC60LDQnNC+0LTRg9C70LXQuS5wcm90b3R5cGUu0YHQvtC30LTQsNGC0YzQmNC90YLQtdGA0YTQtdC50YEgPSBmdW5jdGlvbigpCnsKICAgIHZhciDRjyA9IHRoaXM7CiAgICAKICAgIHRoaXMu0LjRhCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgdGhpcy7RgdC/0LjRgdC+0LogPSBuZXcg0KHQv9C40YHQvtC60JzQvtC00YPQu9C10LkoKTsKICAgIHRoaXMu0LjRhC5hcHBlbmRDaGlsZCh0aGlzLtGB0L/QuNGB0L7Qui7QuNGEKTsKICAgIAogICAgdmFyINC80L7QtNGD0LvQuCA9IFsKICAgICAgICBbdHJ1ZSwgICLQvNGD0YDQvtC8LtC30LDQs9GA0YPQt9C60LBfMS4wLjAiXSwKICAgICAgICBbdHJ1ZSwgICLQvNGD0YDQvtC8LnV1aWRfMS4wLjAiXSwKICAgICAgICBbdHJ1ZSwgICLQo9Cy0LXQtNC+0LzQuNGC0LXQu9GMXzEuMC4wIl0sCiAgICAgICAgW2ZhbHNlLCAidWlraXRfMy4yLjAuY3NzIl0sCiAgICAgICAgW2ZhbHNlLCAidWlraXRfMy4yLjAuanMiXSwKICAgICAgICBbZmFsc2UsICLQn9Cw0L3QtdC70YzQo9C/0YDQsNCy0LvQtdC90LjRjy5VSUtpdCJdLAogICAgICAgIFtmYWxzZSwgItCf0LDQvdC10LvRjNCj0L/RgNCw0LLQu9C10L3QuNGPXzEuMC4wIl0sCiAgICBdOwogICAgCiAgICB0aGlzLtGB0L/QuNGB0L7Qui7Qt9Cw0LTQsNGC0YzQodC/0LjRgdC+0Loo0LzQvtC00YPQu9C4KTsKICAgIHRoaXMu0YHQv9C40YHQvtC6LtCy0YvQsdGA0LDRgtGMKDApOwogICAgCiAgICB0aGlzLtGB0L7Qt9C00LDRgtGM0JrQvdC+0L/QutGDKCLQktGL0LHRgNCw0YLRjCDQv9C+0YHQu9C10LTQvdC40LkiLCBmdW5jdGlvbigpewogICAgICAgIGNvbnNvbGUubG9nKCLQstGL0LHRgNCw0YLRjCIpOwogICAgICAgINGPLtGB0L/QuNGB0L7Qui7QstGL0LHRgNCw0YLRjCjQvNC+0LTRg9C70LgubGVuZ3RoIC0gMSk7CiAgICB9KTsKICAgIHRoaXMu0YHQvtC30LTQsNGC0YzQmtC90L7Qv9C60YMoItCe0LHQvdC+0LLQuNGC0Ywg0L/QvtGB0LvQtdC00L3QuNC5IiwgZnVuY3Rpb24oKXsKICAgICAgICDRjy7RgdC/0LjRgdC+0Lou0L7QsdC90L7QstC40YLRjNCt0LvQtdC80LXQvdGCKNC80L7QtNGD0LvQuC5sZW5ndGggLSAxLCB0cnVlLCAi0J3QvtCy0L7QtSDQuNC80Y8iKTsKICAgIH0pOwogICAgdGhpcy7RgdC+0LfQtNCw0YLRjNCa0L3QvtC/0LrRgygi0KPQtNCw0LvQuNGC0Ywg0L/QvtGB0LvQtdC00L3QuNC5IiwgZnVuY3Rpb24oKXsKICAgICAgICDRjy7RgdC/0LjRgdC+0Lou0YPQtNCw0LvQuNGC0YzQrdC70LXQvNC10L3RgijQvNC+0LTRg9C70LgubGVuZ3RoIC0gMSk7CiAgICB9KTsKICAgIHRoaXMu0YHQvtC30LTQsNGC0YzQmtC90L7Qv9C60YMoItCU0L7QsdCw0LLQuNGC0YwiLCBmdW5jdGlvbigpewogICAgICAgINGPLtGB0L/QuNGB0L7Qui7QtNC+0LHQsNCy0LjRgtGM0K3Qu9C10LzQtdC90YIodHJ1ZSwgItCd0L7QstGL0LktNTk5Iik7CiAgICAgICAgdmFyINC90L7QvNC10YAgPSDRjy7RgdC/0LjRgdC+0Lou0YLQsNCx0LvQuNGG0LAucm93cy5sZW5ndGggLSAxOwogICAgICAgINGPLtGB0L/QuNGB0L7Qui7Rg9C70LDQstC70LjQstCw0YLRjNCS0YvQsdC+0YDQrdC70LXQvNC10L3RgtCwKNC90L7QvNC10YApOwogICAgICAgINGPLtGB0L/QuNGB0L7Qui7QstGL0LHRgNCw0YLRjCjQvdC+0LzQtdGAKTsKICAgIH0pOwp9OwrQotC10YHRgtCh0L/QuNGB0LrQsNCc0L7QtNGD0LvQtdC5LnByb3RvdHlwZS7RgdC+0LfQtNCw0YLRjNCa0L3QvtC/0LrRgyA9IGZ1bmN0aW9uKNC40LzRjywg0YDQtdCw0LrRhtC40Y8pCnsKICAgIHZhciDQutC90L7Qv9C60LAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgINC60L3QvtC/0LrQsC5pbm5lckhUTUwgPSDQuNC80Y87CiAgICB0aGlzLtC40YQuYXBwZW5kQ2hpbGQo0LrQvdC+0L/QutCwKTsKICAgINC60L3QvtC/0LrQsC5vbmNsaWNrID0g0YDQtdCw0LrRhtC40Y87Cn07CgovKgogKgogKiDQodCy0L7QudGB0YLQstCwINC80L7QtNGD0LvRjwogKgogKi8KCmZ1bmN0aW9uINCh0LLQvtC50YHRgtCy0LDQnNC+0LTRg9C70Y8oKQp7CiAgICB0aGlzLtGB0L7Qt9C00LDRgtGM0JjQvdGC0LXRgNGE0LXQudGBKCk7CiAgICB0aGlzLtC40LfQvNC10L3QuNC70LjQndC+0LzQtdGAID0gbmV3INCj0LLQtdC00L7QvNC40YLQtdC70YwoKTsKICAgIHRoaXMu0L3QsNGB0YLRgNC+0LjRgtGM0J3QvtC80LXRgCgpOwogICAgdGhpcy7QuNC30LzQtdC90LjQu9C40JjQvNGPID0gbmV3INCj0LLQtdC00L7QvNC40YLQtdC70YwoKTsKICAgIHRoaXMu0L3QsNGB0YLRgNC+0LjRgtGM0JjQvNGPKCk7CiAgICB0aGlzLtC40LfQvNC10L3QuNC70LjQodGC0LDRgtGD0YEgPSBuZXcg0KPQstC10LTQvtC80LjRgtC10LvRjCgpOwogICAgdGhpcy7QvdCw0YHRgtGA0L7QuNGC0YzQodGC0LDRgtGD0YEoKTsKICAgIHRoaXMu0YPQtNCw0LvQuNGC0YwgPSBuZXcg0KPQstC10LTQvtC80LjRgtC10LvRjCgpOwogICAgdGhpcy7QvdCw0YHRgtGA0L7QuNGC0YzQo9C00LDQu9C10L3QuNC1KCk7Cn0K0KHQstC+0LnRgdGC0LLQsNCc0L7QtNGD0LvRjy5wcm90b3R5cGUu0YHQvtC30LTQsNGC0YzQmNC90YLQtdGA0YTQtdC50YEgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMu0LjRhCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgdGhpcy7QuNGELnN0eWxlLmNzc1RleHQgPQpgCmJvcmRlcjogMXB4IHNvbGlkICNkZGQ7Ci8qCnBhZGRpbmc6IDAuNWVtOwptYXJnaW46IDAuNWVtOwoqLwpjb2xvcjogIzY2NjY2NjsKZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CmA7CiAgICB0aGlzLtGC0LDQsdC70LjRhtCwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGFibGUiKTsKICAgIHRoaXMu0LjRhC5hcHBlbmRDaGlsZCh0aGlzLtGC0LDQsdC70LjRhtCwKTsKfTsKT2JqZWN0LmRlZmluZVByb3BlcnR5KNCh0LLQvtC50YHRgtCy0LDQnNC+0LTRg9C70Y8ucHJvdG90eXBlLCAi0L3QvtC80LXRgCIsIHsKICAgIGdldDogZnVuY3Rpb24oKQogICAgewogICAgICAgIHJldHVybiBOdW1iZXIodGhpcy7Qv9C+0LvQtdCd0L7QvNC10YAudmFsdWUpOwogICAgfSwKICAgIHNldDogZnVuY3Rpb24o0LfQvdCw0YfQtdC90LjQtSkKICAgIHsKICAgICAgICB0aGlzLtC/0L7Qu9C10J3QvtC80LXRgC52YWx1ZSA9INC30L3QsNGH0LXQvdC40LU7CiAgICB9Cn0pOwrQodCy0L7QudGB0YLQstCw0JzQvtC00YPQu9GPLnByb3RvdHlwZS7QvdCw0YHRgtGA0L7QuNGC0YzQndC+0LzQtdGAID0gZnVuY3Rpb24oKQp7CiAgICB2YXIg0Y8gPSB0aGlzOwogICAgCiAgICB2YXIg0YDRj9C0ID0gdGhpcy7RgtCw0LHQu9C40YbQsC5pbnNlcnRSb3coKTsKICAgIHZhciDRj9GH0LXQudC60LAgPSAwOwoKICAgIHZhciDQutC70Y7RhyA9INGA0Y/QtC5pbnNlcnRDZWxsKNGP0YfQtdC50LrQsCsrKTsKICAgINC60LvRjtGHLmlubmVySFRNTCA9ICLQndC+0LzQtdGAOiI7CiAgICDQutC70Y7Rhy5zdHlsZS5jc3NUZXh0ID0gInBhZGRpbmc6IDAuNWVtOyI7CgogICAgdmFyINC30L3QsNGH0LXQvdC40LUgPSDRgNGP0LQuaW5zZXJ0Q2VsbCjRj9GH0LXQudC60LArKyk7CiAgICB0aGlzLtC/0L7Qu9C10J3QvtC80LXRgCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CiAgICB0aGlzLtC/0L7Qu9C10J3QvtC80LXRgC50eXBlID0gIm51bWJlciI7CiAgICB0aGlzLtC/0L7Qu9C10J3QvtC80LXRgC5taW4gPSAwOwogICAg0LfQvdCw0YfQtdC90LjQtS5zdHlsZS5jc3NUZXh0ID0gIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAwLjVlbTsiOwogICAgdGhpcy7Qv9C+0LvQtdCd0L7QvNC10YAuc3R5bGUuY3NzVGV4dCA9ICJ3aWR0aDogMTAwJTsiOwogICAg0LfQvdCw0YfQtdC90LjQtS5hcHBlbmRDaGlsZCh0aGlzLtC/0L7Qu9C10J3QvtC80LXRgCk7CiAgICAKICAgIHRoaXMu0L/QvtC70LXQndC+0LzQtdGALm9uaW5wdXQgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAg0Y8u0LjQt9C80LXQvdC40LvQuNCd0L7QvNC10YAu0YPQstC10LTQvtC80LjRgtGMKCk7CiAgICB9Owp9OwpPYmplY3QuZGVmaW5lUHJvcGVydHko0KHQstC+0LnRgdGC0LLQsNCc0L7QtNGD0LvRjy5wcm90b3R5cGUsICLQuNC80Y8iLCB7CiAgICBnZXQ6IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gdGhpcy7Qv9C+0LvQtdCY0LzRjy52YWx1ZTsKICAgIH0sCiAgICBzZXQ6IGZ1bmN0aW9uKNC30L3QsNGH0LXQvdC40LUpCiAgICB7CiAgICAgICAgdGhpcy7Qv9C+0LvQtdCY0LzRjy52YWx1ZSA9INC30L3QsNGH0LXQvdC40LU7CiAgICB9Cn0pOwrQodCy0L7QudGB0YLQstCw0JzQvtC00YPQu9GPLnByb3RvdHlwZS7QvdCw0YHRgtGA0L7QuNGC0YzQmNC80Y8gPSBmdW5jdGlvbigpCnsKICAgIHZhciDRjyA9IHRoaXM7CgogICAgdmFyINGA0Y/QtCA9IHRoaXMu0YLQsNCx0LvQuNGG0LAuaW5zZXJ0Um93KCk7CiAgICB2YXIg0Y/Rh9C10LnQutCwID0gMDsKCiAgICB2YXIg0LrQu9GO0YcgPSDRgNGP0LQuaW5zZXJ0Q2VsbCjRj9GH0LXQudC60LArKyk7CiAgICDQutC70Y7Rhy5pbm5lckhUTUwgPSAi0JjQvNGPOiI7CiAgICDQutC70Y7Rhy5zdHlsZS5jc3NUZXh0ID0gInBhZGRpbmc6IDAuNWVtOyI7CgogICAgdmFyINC30L3QsNGH0LXQvdC40LUgPSDRgNGP0LQuaW5zZXJ0Q2VsbCjRj9GH0LXQudC60LArKyk7CiAgICB0aGlzLtC/0L7Qu9C10JjQvNGPID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKICAgINC30L3QsNGH0LXQvdC40LUuc3R5bGUuY3NzVGV4dCA9ICJ3aWR0aDogMTAwJTsgcGFkZGluZzogMC41ZW07IjsKICAgIHRoaXMu0L/QvtC70LXQmNC80Y8uc3R5bGUuY3NzVGV4dCA9ICJ3aWR0aDogMTAwJTsiOwogICAg0LfQvdCw0YfQtdC90LjQtS5hcHBlbmRDaGlsZCh0aGlzLtC/0L7Qu9C10JjQvNGPKTsKCiAgICB0aGlzLtC/0L7Qu9C10JjQvNGPLm9uaW5wdXQgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAg0Y8u0LjQt9C80LXQvdC40LvQuNCY0LzRjy7Rg9Cy0LXQtNC+0LzQuNGC0YwoKTsKICAgIH07Cn07Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eSjQodCy0L7QudGB0YLQstCw0JzQvtC00YPQu9GPLnByb3RvdHlwZSwgItGB0YLQsNGC0YPRgSIsIHsKICAgIGdldDogZnVuY3Rpb24oKQogICAgewogICAgICAgIHJldHVybiB0aGlzLtC/0LXRgNC10LrQu9GO0YfQsNGC0LXQu9GMLmNoZWNrZWQ7CiAgICB9LAogICAgc2V0OiBmdW5jdGlvbijQt9C90LDRh9C10L3QuNC1KQogICAgewogICAgICAgIHRoaXMu0L/QtdGA0LXQutC70Y7Rh9Cw0YLQtdC70YwuY2hlY2tlZCA9INC30L3QsNGH0LXQvdC40LU7CiAgICB9Cn0pOwrQodCy0L7QudGB0YLQstCw0JzQvtC00YPQu9GPLnByb3RvdHlwZS7QvdCw0YHRgtGA0L7QuNGC0YzQodGC0LDRgtGD0YEgPSBmdW5jdGlvbigpCnsKICAgIHZhciDRjyA9IHRoaXM7CiAgICAKICAgIHZhciDRgNGP0LQgPSB0aGlzLtGC0LDQsdC70LjRhtCwLmluc2VydFJvdygpOwogICAgdmFyINGP0YfQtdC50LrQsCA9IDA7CiAgICAKICAgIHZhciDQutC70Y7RhyA9INGA0Y/QtC5pbnNlcnRDZWxsKNGP0YfQtdC50LrQsCsrKTsKICAgINC60LvRjtGHLmlubmVySFRNTCA9ICLQmNGB0L/QvtC70L3Rj9GC0Yw6IjsKICAgINC60LvRjtGHLnN0eWxlLmNzc1RleHQgPSAicGFkZGluZzogMC41ZW07IjsKCiAgICB2YXIg0LfQvdCw0YfQtdC90LjQtSA9INGA0Y/QtC5pbnNlcnRDZWxsKNGP0YfQtdC50LrQsCsrKTsKICAgIHRoaXMu0L/QtdGA0LXQutC70Y7Rh9Cw0YLQtdC70YwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwogICAgdGhpcy7Qv9C10YDQtdC60LvRjtGH0LDRgtC10LvRjC50eXBlID0gImNoZWNrYm94IjsKICAgIHRoaXMu0L/QtdGA0LXQutC70Y7Rh9Cw0YLQtdC70Ywuc3R5bGUuY3NzVGV4dCA9ICJwYWRkaW5nOiAwLjVlbTsiOwogICAg0LfQvdCw0YfQtdC90LjQtS5hcHBlbmRDaGlsZCh0aGlzLtC/0LXRgNC10LrQu9GO0YfQsNGC0LXQu9GMKTsKCiAgICB0aGlzLtC/0LXRgNC10LrQu9GO0YfQsNGC0LXQu9GMLm9uY2hhbmdlID0gZnVuY3Rpb24oKQogICAgewogICAgICAgINGPLtC40LfQvNC10L3QuNC70LjQodGC0LDRgtGD0YEu0YPQstC10LTQvtC80LjRgtGMKCk7CiAgICB9OwogICAg0LrQu9GO0Ycub25jbGljayA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICDRjy7Qv9C10YDQtdC60LvRjtGH0LDRgtC10LvRjC5jaGVja2VkID0gIdGPLtC/0LXRgNC10LrQu9GO0YfQsNGC0LXQu9GMLmNoZWNrZWQ7CiAgICAgICAg0Y8u0LjQt9C80LXQvdC40LvQuNCh0YLQsNGC0YPRgS7Rg9Cy0LXQtNC+0LzQuNGC0YwoKTsKICAgIH07Cn07CtCh0LLQvtC50YHRgtCy0LDQnNC+0LTRg9C70Y8ucHJvdG90eXBlLtC90LDRgdGC0YDQvtC40YLRjNCj0LTQsNC70LXQvdC40LUgPSBmdW5jdGlvbigpCnsKICAgIHZhciDRjyA9IHRoaXM7CiAgICAKICAgIHZhciDRgNGP0LQgPSB0aGlzLtGC0LDQsdC70LjRhtCwLmluc2VydFJvdygpOwogICAgdmFyINGP0YfQtdC50LrQsCA9IDA7CgogICAg0YDRj9C0Lmluc2VydENlbGwo0Y/Rh9C10LnQutCwKyspOwogICAgdmFyINC30L3QsNGH0LXQvdC40LUgPSDRgNGP0LQuaW5zZXJ0Q2VsbCjRj9GH0LXQudC60LArKyk7CgogICAgdGhpcy7QutC90L7Qv9C60LDQo9C00LDQu9C40YLRjCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgdGhpcy7QutC90L7Qv9C60LDQo9C00LDQu9C40YLRjC5pbm5lckhUTUwgPSAi0KPQtNCw0LvQuNGC0YwiOwogICAgdGhpcy7QutC90L7Qv9C60LDQo9C00LDQu9C40YLRjC5jbGFzc0xpc3QuYWRkKCLQvNGD0YDQvtC8LdC60L3QvtC/0LrQsCIpOwogICAg0LfQvdCw0YfQtdC90LjQtS5hcHBlbmRDaGlsZCh0aGlzLtC60L3QvtC/0LrQsNCj0LTQsNC70LjRgtGMKTsKICAgIAogICAgdGhpcy7QutC90L7Qv9C60LDQo9C00LDQu9C40YLRjC5vbmNsaWNrID0gZnVuY3Rpb24oKQogICAgewogICAgICAgINGPLtGD0LTQsNC70LjRgtGMLtGD0LLQtdC00L7QvNC40YLRjCgpOyAgCiAgICB9Owp9OwoKLyoKICoKICog0KLQtdGB0YIg0YHQstC+0LnRgdGC0LLQsCDQvNC+0LTRg9C70Y8KICoKICovCiAKZnVuY3Rpb24g0KLQtdGB0YLQodCy0L7QudGB0YLQstCw0JzQvtC00YPQu9GPKCkKewogICAgdGhpcy7RgdC+0LfQtNCw0YLRjNCY0L3RgtC10YDRhNC10LnRgSgpOwp9CtCi0LXRgdGC0KHQstC+0LnRgdGC0LLQsNCc0L7QtNGD0LvRjy5wcm90b3R5cGUu0YHQvtC30LTQsNGC0YzQmNC90YLQtdGA0YTQtdC50YEgPSBmdW5jdGlvbigpCnsKICAgIHZhciDRjyA9IHRoaXM7CiAgICAKICAgIHRoaXMu0LjRhCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgdGhpcy7RgdCy0L7QudGB0YLQstCwID0gbmV3INCh0LLQvtC50YHRgtCy0LDQnNC+0LTRg9C70Y8oKTsKICAgIHRoaXMu0LjRhC5hcHBlbmRDaGlsZCh0aGlzLtGB0LLQvtC50YHRgtCy0LAu0LjRhCk7CgogICAgdGhpcy7RgdCy0L7QudGB0YLQstCwLtC40LfQvNC10L3QuNC70LjQndC+0LzQtdGALtC/0L7QtNC/0LjRgdCw0YLRjChmdW5jdGlvbigpewogICAgICAgIGNvbnNvbGUubG9nKCLQvdC+0LzQtdGAOiAnIiArINGPLtGB0LLQvtC50YHRgtCy0LAu0L3QvtC80LXRgCArICInIik7CiAgICB9KTsKICAgIHRoaXMu0YHQstC+0LnRgdGC0LLQsC7QuNC30LzQtdC90LjQu9C40JjQvNGPLtC/0L7QtNC/0LjRgdCw0YLRjChmdW5jdGlvbigpewogICAgICAgIGNvbnNvbGUubG9nKCLQuNC80Y86ICciICsg0Y8u0YHQstC+0LnRgdGC0LLQsC7QuNC80Y8gKyAiJyIpOwogICAgfSk7CiAgICB0aGlzLtGB0LLQvtC50YHRgtCy0LAu0LjQt9C80LXQvdC40LvQuNCh0YLQsNGC0YPRgS7Qv9C+0LTQv9C40YHQsNGC0YwoZnVuY3Rpb24oKXsKICAgICAgICBjb25zb2xlLmxvZygi0YHRgtCw0YLRg9GBOiAnIiArINGPLtGB0LLQvtC50YHRgtCy0LAu0YHRgtCw0YLRg9GBICsgIiciKTsKICAgIH0pOwogICAgdGhpcy7RgdCy0L7QudGB0YLQstCwLtGD0LTQsNC70LjRgtGMLtC/0L7QtNC/0LjRgdCw0YLRjChmdW5jdGlvbigpewogICAgICAgIGNvbnNvbGUubG9nKCLRg9C00LDQu9C40YLRjCDQvNC+0LTRg9C70YwgJyIgKyDRjy7RgdCy0L7QudGB0YLQstCwLtC40LzRjyArICInIik7CiAgICB9KTsKfTsKCi8qCiAqCiAqINCc0L7QtNGD0LvQuAogKgogKi8KCmZ1bmN0aW9uINCc0L7QtNGD0LvQuCgpCnsKICAgIAp9CtCc0L7QtNGD0LvQuC5wcm90b3R5cGUu0YHQstC+0LnRgdGC0LLQsCA9IGZ1bmN0aW9uKNC90L7QvNC10YApCnsKICAgIHJldHVybiBtdXJvbS5tb2R1bGVQcm9wZXJ0aWVzKNC90L7QvNC10YApOwp9OwrQnNC+0LTRg9C70LgucHJvdG90eXBlLtC30LDQtNCw0YLRjNCh0LLQvtC50YHRgtCy0LAgPSBmdW5jdGlvbijQvdC+0LzQtdGALCDRgdCy0L7QudGB0YLQstCwKQp7CiAgICB2YXIg0LwgPSDQvNGD0YDQvtC8LtC80L7QtNGD0LvQuFvQvdC+0LzQtdGAXTsKICAgINC8WzJdID0g0YHQstC+0LnRgdGC0LLQsDsKfTsK0JzQvtC00YPQu9C4LnByb3RvdHlwZS7RgdGC0LDRgtGD0YEgPSBmdW5jdGlvbijQvdC+0LzQtdGAKQp7CiAgICByZXR1cm4gbXVyb20ubW9kdWxlU3RhdHVzKNC90L7QvNC10YApOwp9OwrQnNC+0LTRg9C70LgucHJvdG90eXBlLtC30LDQtNCw0YLRjNCh0YLQsNGC0YPRgSA9IGZ1bmN0aW9uKNC90L7QvNC10YAsINGB0YLQsNGC0YPRgSkKewogICAgdmFyINGB0LIgPSB0aGlzLtGB0LLQvtC50YHRgtCy0LAo0L3QvtC80LXRgCk7CiAgICDRgdCyWyJzdGF0dXMiXSA9INGB0YLQsNGC0YPRgTsKICAgIHRoaXMu0LfQsNC00LDRgtGM0KHQstC+0LnRgdGC0LLQsCjQvdC+0LzQtdGALCDRgdCyKTsKfTsK0JzQvtC00YPQu9C4LnByb3RvdHlwZS7Qt9Cw0LTQsNGC0YzQmNC80Y8gPSBmdW5jdGlvbijQvdC+0LzQtdGALCDQuNC80Y8pCnsKICAgIHZhciDQvCA9INC80YPRgNC+0Lwu0LzQvtC00YPQu9C4W9C90L7QvNC10YBdOwogICAg0LxbMF0gPSDQuNC80Y87Cn07CtCc0L7QtNGD0LvQuC5wcm90b3R5cGUu0LfQsNC00LDRgtGM0J3QvtC80LXRgCA9IGZ1bmN0aW9uKNGB0YLQsNGA0YvQuSwg0L3QvtCy0YvQuSkKewogICAgLy9jb25zb2xlLmxvZygi0LfQsNC00LDRgtGMINC90L7QvNC10YAuICciICsg0YHRgtCw0YDRi9C5ICsgIicgLT4gJyIgKyDQvdC+0LLRi9C5ICsgIiciKTsKICAgIHZhciDQvNC+0LTRg9C70YwgPSDQvNGD0YDQvtC8LtC80L7QtNGD0LvQuFvRgdGC0LDRgNGL0LldOwogICAgLy8g0KPQtNCw0LvRj9C10Lwg0YHRgtCw0YDRg9GOINC30LDQv9C40YHRjC4KICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C4LnNwbGljZSjRgdGC0LDRgNGL0LksIDEpOwogICAgLy8g0JTQvtCx0LDQstC70Y/QtdC8INC80L7QtNGD0LvRjCDQsiDQvdC+0LLRg9GOINC/0L7Qt9C40YbQuNGOLgogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70Lguc3BsaWNlKNC90L7QstGL0LksIDAsINC80L7QtNGD0LvRjCk7Cn07CgovKgogKgogKiDQn9Cw0L3QtdC70Ywg0YPQv9GA0LDQstC70LXQvdC40Y8KICoKICovCgpmdW5jdGlvbiDQn9Cw0L3QtdC70YzQo9C/0YDQsNCy0LvQtdC90LjRjygpCnsKICAgIHRoaXMu0LzQvtC00YPQu9C4ID0gbmV3INCc0L7QtNGD0LvQuCgpOwogICAgdGhpcy7RgdC+0LfQtNCw0YLRjNCe0YHQvdC+0LLRgygpOwogICAgdGhpcy7RgdC+0LfQtNCw0YLRjNCh0L7RhdGA0LDQvdC10L3QuNC10KHQutCw0YfQuNCy0LDQvdC40LXQlNC+0LHQsNCy0LvQtdC90LjQtSgpOwogICAgdGhpcy7RgdC+0LfQtNCw0YLRjNCh0L/QuNGB0L7QutCc0L7QtNGD0LvQtdC5KCk7CiAgICB0aGlzLtGB0L7Qt9C00LDRgtGM0KHQstC+0LnRgdGC0LLQsNCc0L7QtNGD0LvRjygpOwp9CtCf0LDQvdC10LvRjNCj0L/RgNCw0LLQu9C10L3QuNGPLnByb3RvdHlwZS7RgdC+0LfQtNCw0YLRjNCe0LHRkdGA0YLQutGD0K/Rh9C10LnQutGDID0gZnVuY3Rpb24oKQp7CiAgICB2YXIg0L7QsdGR0YDRgtC60LAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpOwogICAg0L7QsdGR0YDRgtC60LAuc3R5bGUuY3NzVGV4dCA9ICJ3aWR0aDogMTAwJTsiOwogICAgdmFyINGA0Y/QtCA9INC+0LHRkdGA0YLQutCwLmluc2VydFJvdygpOwogICAgdmFyINGP0YfQtdC50LrQsCA9INGA0Y/QtC5pbnNlcnRDZWxsKCk7CiAgICByZXR1cm4gW9C+0LHRkdGA0YLQutCwLCDRj9GH0LXQudC60LBdOwp9OwrQn9Cw0L3QtdC70YzQo9C/0YDQsNCy0LvQtdC90LjRjy5wcm90b3R5cGUu0YHQvtC30LTQsNGC0YzQntGB0L3QvtCy0YMgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMu0LjRhCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRhYmxlIik7CiAgICB0aGlzLtC40YQuc3R5bGUuY3NzVGV4dCA9ICJ3aWR0aDogMTAwJTsiOwogICAgdmFyINGA0Y/QtCA9IHRoaXMu0LjRhC5pbnNlcnRSb3coKTsKICAgIHRoaXMu0LvQtdCy0L4gPSDRgNGP0LQuaW5zZXJ0Q2VsbCgpOwogICAgdGhpcy7Qu9C10LLQvi5zdHlsZS5jc3NUZXh0ID0gIndpZHRoOiAxMDAlOyI7CiAgICB2YXIg0L/RgNCw0LLQviA9INGA0Y/QtC5pbnNlcnRDZWxsKCk7CiAgICDQv9GA0LDQstC+LnN0eWxlLmNzc1RleHQgPSAiaGVpZ2h0OiAxMDAlOyI7CiAgICB0aGlzLtC60L3QvtC/0LrQuCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRhYmxlIik7CiAgICB0aGlzLtC60L3QvtC/0LrQuC5zdHlsZS5jc3NUZXh0ID0gImhlaWdodDogMTAwJTsiOwogICAg0L/RgNCw0LLQvi5hcHBlbmRDaGlsZCh0aGlzLtC60L3QvtC/0LrQuCk7CiAgICDRgNGP0LQgPSB0aGlzLtC40YQuaW5zZXJ0Um93KCk7CiAgICB0aGlzLtC90LjQtyA9INGA0Y/QtC5pbnNlcnRDZWxsKCk7CiAgICB0aGlzLtC90LjQty5jb2xTcGFuID0gMjsKfTsK0J/QsNC90LXQu9GM0KPQv9GA0LDQstC70LXQvdC40Y8ucHJvdG90eXBlLtGB0L7Qt9C00LDRgtGM0KHQv9C40YHQvtC60JzQvtC00YPQu9C10LkgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMu0YHQv9C40YHQvtC6ID0gbmV3INCh0L/QuNGB0L7QutCc0L7QtNGD0LvQtdC5KCk7CiAgICB0aGlzLtGB0L/QuNGB0L7Qui7Qt9Cw0LTQsNGC0YzQodC/0LjRgdC+0LoodGhpcy7RgdC/0LjRgdC+0LrQnNC+0LTRg9C70LXQuSgpKTsKICAgIHZhciDQvtGPID0gdGhpcy7RgdC+0LfQtNCw0YLRjNCe0LHRkdGA0YLQutGD0K/Rh9C10LnQutGDKCk7CiAgICB0aGlzLtC70LXQstC+LmFwcGVuZENoaWxkKNC+0Y9bMF0pOwogICAg0L7Rj1sxXS5hcHBlbmRDaGlsZCh0aGlzLtGB0L/QuNGB0L7Qui7QuNGEKTsKfTsK0J/QsNC90LXQu9GM0KPQv9GA0LDQstC70LXQvdC40Y8ucHJvdG90eXBlLtGB0L7Qt9C00LDRgtGM0KHQstC+0LnRgdGC0LLQsNCc0L7QtNGD0LvRjyA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy7RgdCy0L7QudGB0YLQstCwID0gbmV3INCh0LLQvtC50YHRgtCy0LDQnNC+0LTRg9C70Y8oKTsKICAgINC+0Y8gPSB0aGlzLtGB0L7Qt9C00LDRgtGM0J7QsdGR0YDRgtC60YPQr9GH0LXQudC60YMoKTsKICAgIHRoaXMu0L3QuNC3LmFwcGVuZENoaWxkKNC+0Y9bMF0pOwogICAg0L7Rj1sxXS5hcHBlbmRDaGlsZCh0aGlzLtGB0LLQvtC50YHRgtCy0LAu0LjRhCk7Cn07CtCf0LDQvdC10LvRjNCj0L/RgNCw0LLQu9C10L3QuNGPLnByb3RvdHlwZS7RgdC/0LjRgdC+0LrQnNC+0LTRg9C70LXQuSA9IGZ1bmN0aW9uKCkKewogICAgdmFyINGB0L/QuNGB0L7QuiA9IFtdOwogICAgZm9yICh2YXIg0L3QvtC80LXRgCBpbiDQvNGD0YDQvtC8LtC80L7QtNGD0LvQuCkKICAgIHsKICAgICAgICB2YXIg0LwgPSDQvNGD0YDQvtC8LtC80L7QtNGD0LvQuFvQvdC+0LzQtdGAXTsKICAgICAgICB2YXIg0YHRgtCw0YLRg9GBID0gdGhpcy7QvNC+0LTRg9C70Lgu0YHRgtCw0YLRg9GBKNC90L7QvNC10YApOwogICAgICAgIHZhciDQuNC80Y8gPSDQvFswXTsKICAgICAgICB2YXIg0Y3Qu9C10LzQtdC90YIgPSBb0YHRgtCw0YLRg9GBLCDQuNC80Y9dOwogICAgICAgINGB0L/QuNGB0L7Qui5wdXNoKNGN0LvQtdC80LXQvdGCKTsKICAgIH0KICAgIAogICAgcmV0dXJuINGB0L/QuNGB0L7QujsKfTsK0J/QsNC90LXQu9GM0KPQv9GA0LDQstC70LXQvdC40Y8ucHJvdG90eXBlLtGB0L7Qt9C00LDRgtGM0JrQvdC+0L/QutGDID0gZnVuY3Rpb24o0LjQvNGPLCDRg9Cy0LXQtNC+0LzQuNGC0LXQu9GMKQp7CiAgICB2YXIg0LrQvdC+0L/QutCwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICDQutC90L7Qv9C60LAuaW5uZXJIVE1MID0g0LjQvNGPOwogICAg0LrQvdC+0L/QutCwLnN0eWxlLmNzc1RleHQgPSAid2lkdGg6IDEwMCU7IjsKICAgINC60L3QvtC/0LrQsC5jbGFzc0xpc3QuYWRkKCLQvNGD0YDQvtC8LdC60L3QvtC/0LrQsCIpOwogICAg0LrQvdC+0L/QutCwLm9uY2xpY2sgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAg0YPQstC10LTQvtC80LjRgtC10LvRjC7Rg9Cy0LXQtNC+0LzQuNGC0YwoKTsgIAogICAgfTsKICAgIAogICAgcmV0dXJuINC60L3QvtC/0LrQsDsKfTsK0J/QsNC90LXQu9GM0KPQv9GA0LDQstC70LXQvdC40Y8ucHJvdG90eXBlLtGB0L7Qt9C00LDRgtGM0KHQvtGF0YDQsNC90LXQvdC40LXQodC60LDRh9C40LLQsNC90LjQtdCU0L7QsdCw0LLQu9C10L3QuNC1ID0gZnVuY3Rpb24oKQp7CiAgICB2YXIg0Y8gPSB0aGlzOwogICAgCiAgICB2YXIg0YDRj9C0ID0gdGhpcy7QutC90L7Qv9C60LguaW5zZXJ0Um93KCk7CiAgICB2YXIg0Y/Rh9C10LnQutCwID0g0YDRj9C0Lmluc2VydENlbGwoKTsKICAgIHRoaXMu0YHQvtGF0YDQsNC90LjRgtGMID0gbmV3INCj0LLQtdC00L7QvNC40YLQtdC70YwoKTsKICAgIHRoaXMu0LrQvdC+0L/QutCw0KHQvtGF0YDQsNC90LjRgtGMID0gdGhpcy7RgdC+0LfQtNCw0YLRjNCa0L3QvtC/0LrRgygi0KHQvtGF0YDQsNC90LjRgtGMIiwgdGhpcy7RgdC+0YXRgNCw0L3QuNGC0YwpOwogICAg0Y/Rh9C10LnQutCwLmFwcGVuZENoaWxkKHRoaXMu0LrQvdC+0L/QutCw0KHQvtGF0YDQsNC90LjRgtGMKTsKICAgIAogICAg0YDRj9C0ID0gdGhpcy7QutC90L7Qv9C60LguaW5zZXJ0Um93KCk7CiAgICDRj9GH0LXQudC60LAgPSDRgNGP0LQuaW5zZXJ0Q2VsbCgpOwogICAgdGhpcy7RgdC60LDRh9Cw0YLRjCA9IG5ldyDQo9Cy0LXQtNC+0LzQuNGC0LXQu9GMKCk7CiAgICB0aGlzLtC60L3QvtC/0LrQsNCh0LrQsNGH0LDRgtGMID0gdGhpcy7RgdC+0LfQtNCw0YLRjNCa0L3QvtC/0LrRgygi0KHQutCw0YfQsNGC0YwiLCB0aGlzLtGB0LrQsNGH0LDRgtGMKTsKICAgINGP0YfQtdC50LrQsC5hcHBlbmRDaGlsZCh0aGlzLtC60L3QvtC/0LrQsNCh0LrQsNGH0LDRgtGMKTsKICAgIAogICAgLy8g0J/RgNC+0LHQtdC7LgogICAg0YDRj9C0ID0gdGhpcy7QutC90L7Qv9C60LguaW5zZXJ0Um93KCk7CiAgICDRj9GH0LXQudC60LAgPSDRgNGP0LQuaW5zZXJ0Q2VsbCgpOwogICAg0Y/Rh9C10LnQutCwLnN0eWxlLmNzc1RleHQgPSAiaGVpZ2h0OiAxMDAlOyI7CgogICAg0YDRj9C0ID0gdGhpcy7QutC90L7Qv9C60LguaW5zZXJ0Um93KCk7CiAgICDRj9GH0LXQudC60LAgPSDRgNGP0LQuaW5zZXJ0Q2VsbCgpOwogICAgdGhpcy7QtNC+0LHQsNCy0LjRgtGMID0gbmV3INCj0LLQtdC00L7QvNC40YLQtdC70YwoKTsKICAgIHRoaXMu0LrQvdC+0L/QutCw0JTQvtCx0LDQstC40YLRjCA9IHRoaXMu0YHQvtC30LTQsNGC0YzQmtC90L7Qv9C60YMoItCU0L7QsdCw0LLQuNGC0YwiLCB0aGlzLtC00L7QsdCw0LLQuNGC0YwpOwogICAg0Y/Rh9C10LnQutCwLmFwcGVuZENoaWxkKHRoaXMu0LrQvdC+0L/QutCw0JTQvtCx0LDQstC40YLRjCk7Cn07CtCf0LDQvdC10LvRjNCj0L/RgNCw0LLQu9C10L3QuNGPLnByb3RvdHlwZS7QuNC80Y/QpNCw0LnQu9CwID0gZnVuY3Rpb24oKQp7CiAgICB2YXIg0L/Rg9GC0YwgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7CiAgICB2YXIg0LjQvNGPID0g0L/Rg9GC0Ywuc3BsaXQoIi8iKS5wb3AoKTsKICAgIHJldHVybiBkZWNvZGVVUkko0LjQvNGPKTsKfTsKCmZ1bmN0aW9uINC30LDQv9GD0YHRgtC40YLRjNCf0KMoKQp7CiAgICB2YXIg0L/RgyA9IG5ldyDQn9Cw0L3QtdC70YzQo9C/0YDQsNCy0LvQtdC90LjRjygpOwogICAg0LzRg9GA0L7QvC7Qv9GDID0g0L/RgzsKICAgIHZhciDQvtCx0LvQsNGB0YLQuCA9INC80YPRgNC+0Lwu0YHQvtC30LTQsNGC0YzQm9C10LLRg9GO0J/RgNCw0LLRg9GO0J7QsdC70LDRgdGC0LgoKTsKICAgIHZhciDQv9C+ID0g0L7QsdC70LDRgdGC0LhbMV07CiAgICDQv9C+LmFwcGVuZENoaWxkKNC/0YMu0LjRhCk7CiAgICDQvNGD0YDQvtC8LtGB0L7Qt9C00LDRgtGM0KDQtdC00LDQutGC0L7RgNCS0JvQtdCy0L7QudCe0LHQu9Cw0YHRgtC4KCk7CiAgICB2YXIg0YHQv9C40YHQvtC6ID0g0L/Rgy7RgdC/0LjRgdC+0Lo7CiAgICB2YXIg0YHQstC+0LnRgdGC0LLQsCA9INC/0YMu0YHQstC+0LnRgdGC0LLQsDsKICAgIHZhciDQvNC+0LTRg9C70LggPSDQv9GDLtC80L7QtNGD0LvQuDsKICAgIAogICAgZnVuY3Rpb24g0L7RgtC+0LHRgNCw0LfQuNGC0YzQmtC+0LTQktGL0LHRgNCw0L3QvdC+0LPQvtCc0L7QtNGD0LvRjygpCiAgICB7CiAgICAgICAgdmFyINC80L7QtNGD0LvRjCA9INC80YPRgNC+0Lwu0LzQvtC00YPQu9C4W9GB0L/QuNGB0L7Qui7QstGL0LHQvtGAXTsKICAgICAgICB2YXIg0LrQvtC0ID0g0LzRg9GA0L7QvC5hdG9iKNC80L7QtNGD0LvRjFsxXSk7CiAgICAgICAg0LzRg9GA0L7QvC7RgNC10LTQsNC60YLQvtGALnNlc3Npb24uc2V0VmFsdWUo0LrQvtC0KTsKICAgIH0KICAgIGZ1bmN0aW9uINC+0YLQvtCx0YDQsNC30LjRgtGM0KHQstC+0LnRgdGC0LLQsNCS0YvQsdGA0LDQvdC90L7Qs9C+0JzQvtC00YPQu9GPKCkKICAgIHsKICAgICAgICB2YXIg0LzQvtC00YPQu9GMID0g0LzRg9GA0L7QvC7QvNC+0LTRg9C70Lhb0YHQv9C40YHQvtC6LtCy0YvQsdC+0YBdOwogICAgICAgIAogICAgICAgINGB0LLQvtC50YHRgtCy0LAu0L3QvtC80LXRgCA9INGB0L/QuNGB0L7Qui7QstGL0LHQvtGAOwogICAgICAgINGB0LLQvtC50YHRgtCy0LAu0LjQvNGPID0g0LzQvtC00YPQu9GMWzBdOwogICAgICAgINGB0LLQvtC50YHRgtCy0LAu0YHRgtCw0YLRg9GBID0g0L/Rgy7QvNC+0LTRg9C70Lgu0YHRgtCw0YLRg9GBKNGB0L/QuNGB0L7Qui7QstGL0LHQvtGAKTsKICAgIH0KICAgINGB0L/QuNGB0L7Qui7QstGL0LHRgNCw0LvQuC7Qv9C+0LTQv9C40YHQsNGC0YzQnNC90L7Qs9C+KFsKICAgICAgICDQvtGC0L7QsdGA0LDQt9C40YLRjNCa0L7QtNCS0YvQsdGA0LDQvdC90L7Qs9C+0JzQvtC00YPQu9GPLAogICAgICAgINC+0YLQvtCx0YDQsNC30LjRgtGM0KHQstC+0LnRgdGC0LLQsNCS0YvQsdGA0LDQvdC90L7Qs9C+0JzQvtC00YPQu9GPLAogICAgXSk7CiAgICAKICAgIGZ1bmN0aW9uINC+0LHQvdC+0LLQuNGC0YzQodGC0LDRgtGD0YHQnNC+0LTRg9C70Y8oKQogICAgewogICAgICAgIHZhciDQvdC+0LzQtdGAID0g0YHQv9C40YHQvtC6LtCy0YvQsdC+0YA7CiAgICAgICAgdmFyINC40LzRjyA9INGB0LLQvtC50YHRgtCy0LAu0LjQvNGPOwogICAgICAgIHZhciDRgdGC0LDRgtGD0YEgPSDRgdCy0L7QudGB0YLQstCwLtGB0YLQsNGC0YPRgTsKICAgICAgICDQvNC+0LTRg9C70Lgu0LfQsNC00LDRgtGM0KHRgtCw0YLRg9GBKNC90L7QvNC10YAsINGB0YLQsNGC0YPRgSk7CiAgICAgICAg0YHQv9C40YHQvtC6LtC+0LHQvdC+0LLQuNGC0YzQrdC70LXQvNC10L3RgijQvdC+0LzQtdGALCDRgdGC0LDRgtGD0YEsINC40LzRjyk7CiAgICB9CiAgICDRgdCy0L7QudGB0YLQstCwLtC40LfQvNC10L3QuNC70LjQodGC0LDRgtGD0YEu0L/QvtC00L/QuNGB0LDRgtGMKNC+0LHQvdC+0LLQuNGC0YzQodGC0LDRgtGD0YHQnNC+0LTRg9C70Y8pOwogICAgCiAgICBmdW5jdGlvbiDQvtCx0L3QvtCy0LjRgtGM0JjQvNGP0JzQvtC00YPQu9GPKCkKICAgIHsKICAgICAgICB2YXIg0L3QvtC80LXRgCA9INGB0L/QuNGB0L7Qui7QstGL0LHQvtGAOwogICAgICAgIHZhciDQuNC80Y8gPSDRgdCy0L7QudGB0YLQstCwLtC40LzRjzsKICAgICAgICB2YXIg0YHRgtCw0YLRg9GBID0g0YHQstC+0LnRgdGC0LLQsC7RgdGC0LDRgtGD0YE7CiAgICAgICAg0LzQvtC00YPQu9C4LtC30LDQtNCw0YLRjNCY0LzRjyjQvdC+0LzQtdGALCDQuNC80Y8pOwogICAgICAgINGB0L/QuNGB0L7Qui7QvtCx0L3QvtCy0LjRgtGM0K3Qu9C10LzQtdC90YIo0L3QvtC80LXRgCwg0YHRgtCw0YLRg9GBLCDQuNC80Y8pOwogICAgfQogICAg0YHQstC+0LnRgdGC0LLQsC7QuNC30LzQtdC90LjQu9C40JjQvNGPLtC/0L7QtNC/0LjRgdCw0YLRjCjQvtCx0L3QvtCy0LjRgtGM0JjQvNGP0JzQvtC00YPQu9GPKTsKICAgIAogICAgZnVuY3Rpb24g0L7QsdC90L7QstC40YLRjNCd0L7QvNC10YDQnNC+0LTRg9C70Y8oKQogICAgewogICAgICAgIHZhciDRgdGC0LDRgNGL0LkgPSDRgdC/0LjRgdC+0Lou0LLRi9Cx0L7RgDsKICAgICAgICB2YXIg0L3QvtCy0YvQuSA9INGB0LLQvtC50YHRgtCy0LAu0L3QvtC80LXRgDsKICAgICAgICBpZiAo0YHRgtCw0YDRi9C5ID09INC90L7QstGL0LkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICjQvdC+0LLRi9C5ID4g0LzRg9GA0L7QvC7QvNC+0LTRg9C70LgubGVuZ3RoIC0gMSkKICAgICAgICB7CiAgICAgICAgICAgINC90L7QstGL0LkgPSDQvNGD0YDQvtC8LtC80L7QtNGD0LvQuC5sZW5ndGggLSAxOwogICAgICAgIH0KICAgICAgICDQvNC+0LTRg9C70Lgu0LfQsNC00LDRgtGM0J3QvtC80LXRgCjRgdGC0LDRgNGL0LksINC90L7QstGL0LkpOwogICAgICAgINGB0L/QuNGB0L7Qui7Qt9Cw0LTQsNGC0YzQodC/0LjRgdC+0Loo0L/Rgy7RgdC/0LjRgdC+0LrQnNC+0LTRg9C70LXQuSgpKTsKICAgICAgICDRgdC/0LjRgdC+0Lou0LLRi9Cx0YDQsNGC0Ywo0L3QvtCy0YvQuSk7CiAgICB9CiAgICDRgdCy0L7QudGB0YLQstCwLtC40LfQvNC10L3QuNC70LjQndC+0LzQtdGALtC/0L7QtNC/0LjRgdCw0YLRjCjQvtCx0L3QvtCy0LjRgtGM0J3QvtC80LXRgNCc0L7QtNGD0LvRjyk7CiAgICAKICAgIGZ1bmN0aW9uINC00L7QsdCw0LLQuNGC0YzQnNC+0LTRg9C70YwoKQogICAgewogICAgICAgIHZhciDRh9C40YHQu9C+ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTWF0aC5mbG9vcigxMDAwKSk7CiAgICAgICAgdmFyINC40LzRjyA9ICLQvdC+0LLRi9C5LSIgKyDRh9C40YHQu9C+OyAKICAgICAgICB2YXIg0LrQvtC0ID0gYGNvbnNvbGUubG9nKCLQndCQ0JTQniDQlNC+0LHQsNCy0LjRgtGMINC60L7QtCDQsiDQvNC+0LTRg9C70YwgJ2AgKyDQuNC80Y8gKyBgJyIpO2A7CiAgICAgICAgdmFyINC80L7QtNGD0LvRjCA9IFvQuNC80Y8sINC80YPRgNC+0LwuYnRvYSjQutC+0LQpXTsKICAgICAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQuC5wdXNoKNC80L7QtNGD0LvRjCk7CiAgICAgICAgdmFyINC80L7QtNGD0LvQuCA9INC/0YMu0YHQv9C40YHQvtC60JzQvtC00YPQu9C10LkoKTsKICAgICAgICDRgdC/0LjRgdC+0Lou0LfQsNC00LDRgtGM0KHQv9C40YHQvtC6KNC80L7QtNGD0LvQuCk7CiAgICAgICAg0YHQv9C40YHQvtC6LtCy0YvQsdGA0LDRgtGMKNC80L7QtNGD0LvQuC5sZW5ndGggLSAxKTsKICAgIH0KICAgINC/0YMu0LTQvtCx0LDQstC40YLRjC7Qv9C+0LTQv9C40YHQsNGC0Ywo0LTQvtCx0LDQstC40YLRjNCc0L7QtNGD0LvRjCk7CiAgICAKICAgIGZ1bmN0aW9uINGD0LTQsNC70LjRgtGM0JzQvtC00YPQu9GMKCkKICAgIHsKICAgICAgICB2YXIg0L3QvtC80LXRgCA9INGB0L/QuNGB0L7Qui7QstGL0LHQvtGAOwogICAgICAgIAogICAgICAgIHZhciDRgdGC0LDRgtGD0YEgPSDQv9GDLtC80L7QtNGD0LvQuC7RgdGC0LDRgtGD0YEo0L3QvtC80LXRgCk7CiAgICAgICAgaWYgKNGB0YLQsNGC0YPRgSkKICAgICAgICB7CiAgICAgICAgICAgIGFsZXJ0KCLQntCo0JjQkdCa0JAg0KPQtNCw0LvQuNGC0Ywg0LzQvtC20L3QviDQu9C40YjRjCDQvdC10LjRgdC/0L7Qu9C90Y/QtdC80YvQuSDQvNC+0LTRg9C70YwiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyDQo9C00LDQu9C40YLRjCDQstGL0LHRgNCw0L3QvdGL0Lkg0LzQvtC00YPQu9GMLgogICAgICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C4LnNwbGljZSjQvdC+0LzQtdGALCAxKTsKICAgICAgICAtLdC90L7QvNC10YA7CiAgICAgICAgaWYgKNC90L7QvNC10YAgPCAwKQogICAgICAgIHsKICAgICAgICAgICAg0L3QvtC80LXRgCA9IDA7CiAgICAgICAgfQogICAgICAgIHZhciDQvNC+0LTRg9C70LggPSDQv9GDLtGB0L/QuNGB0L7QutCc0L7QtNGD0LvQtdC5KCk7CiAgICAgICAg0YHQv9C40YHQvtC6LtC30LDQtNCw0YLRjNCh0L/QuNGB0L7QuijQvNC+0LTRg9C70LgpOwogICAgICAgINGB0L/QuNGB0L7Qui7QstGL0LHRgNCw0YLRjCjQvdC+0LzQtdGAKTsKICAgIH0KICAgINGB0LLQvtC50YHRgtCy0LAu0YPQtNCw0LvQuNGC0Ywu0L/QvtC00L/QuNGB0LDRgtGMKNGD0LTQsNC70LjRgtGM0JzQvtC00YPQu9GMKTsKICAgIAogICAgZnVuY3Rpb24g0YHQvtGF0YDQsNC90LjRgtGM0JLRi9Cx0YDQsNC90L3Ri9C50JzQvtC00YPQu9GMKCkKICAgIHsKICAgICAgICB2YXIg0LzQvtC00YPQu9GMID0g0LzRg9GA0L7QvC7QvNC+0LTRg9C70Lhb0YHQv9C40YHQvtC6LtCy0YvQsdC+0YBdOwogICAgICAgIHZhciDQutC+0LQgPSDQvNGD0YDQvtC8LtGA0LXQtNCw0LrRgtC+0YAuc2Vzc2lvbi5nZXRWYWx1ZSgpOwogICAgICAgINC80L7QtNGD0LvRjFsxXSA9INC80YPRgNC+0LwuYnRvYSjQutC+0LQpOwogICAgfQogICAgZnVuY3Rpb24g0YHQvtGF0YDQsNC90LjRgtGMKCkKICAgIHsKICAgICAgICDQv9GDLtC60L3QvtC/0LrQsNCh0L7RhdGA0LDQvdC40YLRjC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgbG9jYWxmb3JhZ2Uuc2V0SXRlbSgibW9kdWxlcyIsINC80YPRgNC+0Lwu0LzQvtC00YPQu9C4LCBmdW5jdGlvbijQvtGI0LjQsdC60LAsINC30L3QsNGH0LXQvdC40LUpewogICAgICAgICAgICDQv9GDLtC60L3QvtC/0LrQsNCh0L7RhdGA0LDQvdC40YLRjC5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAo0L7RiNC40LHQutCwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCLQndC1INGD0LTQsNC70L7RgdGMINGB0L7RhdGA0LDQvdC40YLRjCDQvNC+0LTRg9C70Lg6ICciICsg0L7RiNC40LHQutCwICsgIiciKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAg0L/Rgy7RgdC+0YXRgNCw0L3QuNGC0Ywu0L/QvtC00L/QuNGB0LDRgtGM0JzQvdC+0LPQvihbCiAgICAgICAg0YHQvtGF0YDQsNC90LjRgtGM0JLRi9Cx0YDQsNC90L3Ri9C50JzQvtC00YPQu9GMLAogICAgICAgINGB0L7RhdGA0LDQvdC40YLRjCwKICAgIF0pOwoKICAgIC8vIEhvdyB0byBjcmVhdGUgYSBmaWxlIGluIG1lbW9yeSBmb3IgdXNlciB0byBkb3dubG9hZCwgYnV0IG5vdCB0aHJvdWdoIHNlcnZlcj8KICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xODE5NzM0MQogICAgZnVuY3Rpb24g0YHQutCw0YfQsNGC0YwoKQogICAgewogICAgICAgIHZhciDRgdC+0LTQtdGA0LbQuNC80L7QtSA9INC80YPRgNC+0Lwu0YTQsNC50Lsu0L3QsNGH0LDQu9C+OwogICAgICAgIGZvciAodmFyINC90L7QvNC10YAgaW4g0LzRg9GA0L7QvC7QvNC+0LTRg9C70LgpCiAgICAgICAgewogICAgICAgICAgICB2YXIg0LzQvtC00YPQu9GMID0g0LzRg9GA0L7QvC7QvNC+0LTRg9C70Lhb0L3QvtC80LXRgF07CiAgICAgICAgICAgIHZhciDQuNC80Y8gPSDQvNC+0LTRg9C70YxbMF07CiAgICAgICAgICAgIHZhciDQutC+0LQ2NCA9INC80L7QtNGD0LvRjFsxXTsKICAgICAgICAgICAgdmFyINGB0LLQvtC50YHRgtCy0LAgPSDQvNC+0LTRg9C70Lgu0YHQstC+0LnRgdGC0LLQsCjQvdC+0LzQtdGAKTsKICAgICAgICAgICAg0YHQvtC00LXRgNC20LjQvNC+0LUgKz0KYAoKWwoiYCArINC40LzRjyArIGAiLAoiYCArINC60L7QtDY0ICsgYCIsCmAKKwpKU09OLnN0cmluZ2lmeSjRgdCy0L7QudGB0YLQstCwKQorCmAKXSwKYAo7CiAgICAgICAgfQogICAgICAgINGB0L7QtNC10YDQttC40LzQvtC1ICs9INC80YPRgNC+0Lwu0YTQsNC50Lsu0LrQvtC90LXRhjsKICAgICAgICDRgdC+0LTQtdGA0LbQuNC80L7QtSA9INC80YPRgNC+0LwuYnRvYSjRgdC+0LTQtdGA0LbQuNC80L7QtSk7CiAgICAKICAgICAgICB2YXIg0YHRgdGL0LvRjCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKICAgICAgICDRgdGB0YvQu9GMLnNldEF0dHJpYnV0ZSgiaHJlZiIsICJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwiICsg0YHQvtC00LXRgNC20LjQvNC+0LUpOwogICAgICAgIHZhciDQuNC80Y8gPSDQv9GDLtC40LzRj9Ck0LDQudC70LAoKTsKICAgICAgICDRgdGB0YvQu9GMLnNldEF0dHJpYnV0ZSgiZG93bmxvYWQiLCDQuNC80Y8pOwogICAgICAgINGB0YHRi9C70Ywuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKNGB0YHRi9C70YwpOwogICAgICAgINGB0YHRi9C70YwuY2xpY2soKTsKICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKNGB0YHRi9C70YwpOwogICAgfQogICAg0L/Rgy7RgdC60LDRh9Cw0YLRjC7Qv9C+0LTQv9C40YHQsNGC0Ywo0YHQutCw0YfQsNGC0YwpOwoKICAgIC8vINCf0YDQuCDQt9Cw0L/Rg9GB0LrQtS4KICAgINGB0L/QuNGB0L7Qui7QstGL0LHRgNCw0YLRjCgwKTsKfQoKLyoKICoKICog0J/Rg9GB0LoKICoKICovCgppZiAod2luZG93LmxvY2F0aW9uLnNlYXJjaCA9PSAiPzAiKQp7CiAgICBjb25zb2xlLmRlYnVnKCLQl9Cw0L/Rg9GB0Log0L/QsNC90LXQu9C4INGD0L/RgNCw0LLQu9C10L3QuNGPIik7CiAgICDQt9Cw0LTQsNGC0YzQktC90LXRiNC90LjQudCS0LjQtCgpOwogICAg0LfQsNC/0YPRgdGC0LjRgtGM0J/QoygpOwogICAgY29uc29sZS5kZWJ1Zygi0J/QsNC90LXQu9GMINGD0L/RgNCw0LLQu9C10L3QuNGPINC30LDQv9GD0YnQtdC90LAiKQp9", -{"status":true} -], - - -[ -"функции_1.1.0", +"муром.функции_1.1.0", "LyoKICoKICog0KHQvtC30LTQsNGC0Ywg0Y3QutGA0LDQvQogKiBDcmVhdGUgYSBzY3JlZW4KICoKICovCmZ1bmN0aW9uINGB0L7Qt9C00LDRgtGM0K3QutGA0LDQvSjQuNC80Y8pCnsKICAgIHZhciDRjdC60YDQsNC9ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICDRjdC60YDQsNC9LmlkID0g0LjQvNGPOwogICAg0Y3QutGA0LDQvS5zdHlsZS5jc3NUZXh0ID0KYApwb3NpdGlvbjogZml4ZWQ7CmxlZnQ6IDA7CnRvcDogMDsKcmlnaHQ6IDA7CmJvdHRvbTogMDsKcG9pbnRlci1ldmVudHM6IGFsbDsKYDsKICAgIHJldHVybiDRjdC60YDQsNC9Owp9CnZhciBjcmVhdGVTY3JlZW4gPSDRgdC+0LfQtNCw0YLRjNCt0LrRgNCw0L07CgovKgogKgogKiDQodC+0LfQtNCw0YLRjCDQuCDQtNC+0LHQsNCy0LjRgtGMINGN0LrRgNCw0L0g0LogYGJvZHlgCiAqIENyZWF0ZSBhbmQgYWRkIGEgc2NyZWVuIHRvIGBib2R5YAogKgogKi8KZnVuY3Rpb24g0LTQvtCx0LDQstC40YLRjNCt0LrRgNCw0L0o0LjQvNGPLCBodG1sLCBjc3MpCnsKICAgIHZhciDRjdC60YDQsNC9ID0g0YHQvtC30LTQsNGC0YzQrdC60YDQsNC9KNC40LzRjyk7CiAgICDRjdC60YDQsNC9LmlubmVySFRNTCA9IGh0bWw7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKNGN0LrRgNCw0L0pOwogICAgdmFyINCy0LjQtCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICDQstC40LQuaW5uZXJIVE1MID0gY3NzOwogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCjQstC40LQpOwogICAgCiAgICByZXR1cm4g0Y3QutGA0LDQvTsKfQp2YXIgYWRkU2NyZWVuID0g0LTQvtCx0LDQstC40YLRjNCt0LrRgNCw0L07CgovKgogKgogKiDQodCy0Y/Qt9Cw0YLRjCDRg9Cy0LXQtNC+0LzQu9C10L3QuNC1INC4INGA0LXQsNCz0LjRgNGD0Y7RidGD0Y4g0YTRg9C90LrRhtC40Y4g0LIg0YfQuNGC0LDQtdC80L7QvCDQstC40LTQtQogKiBCaW5kIG5vdGlmaWNhdGlvbiBhbmQgcmVhY3RpbmcgZnVuY3Rpb24gaW4gYSByZWFkYWJsZSB3YXkKICoKICovCmZ1bmN0aW9uINC60L7Qs9C00LAo0YPQstC10LTQvtC80LvQtdC90LjQtSwg0YTRg9C90LrRhtC40Y8pCnsKICAgINGD0LLQtdC00L7QvNC70LXQvdC40LUu0L/QvtC00L/QuNGB0LDRgtGMKNGE0YPQvdC60YbQuNGPKTsKfQp2YXIgd2hlbiA9INC60L7Qs9C00LA7CgovKgogKgogKiDQo9Cy0LXQtNC+0LzQuNGC0Ywg0L7QsSDQvtCx0YvRh9C90L7QvCDQv9GD0YHQutC1CiAqIE5vdGlmeSBhYm91dCBhIHNpbXBsZSBydW4KICoKICovCtC80YPRgNC+0Lwu0L7QsdGL0YfQvdGL0LnQn9GD0YHQuiA9IG5ldyDQo9Cy0LXQtNC+0LzQuNGC0LXQu9GMKCk7Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eShtdXJvbSwgImlzUnVuU2ltcGx5IiwgewogICAgZ2V0OiBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgcmV0dXJuINC80YPRgNC+0Lwu0L7QsdGL0YfQvdGL0LnQn9GD0YHQujsKICAgIH0KfSk7CtC80YPRgNC+0Lwu0L/Rg9GB0Lou0L/QvtC00L/QuNGB0LDRgtGMKGZ1bmN0aW9uKCl7CiAgICBpZiAod2luZG93LmxvY2F0aW9uLnNlYXJjaCAhPSAiPzAiKQogICAgewogICAgICAgINC80YPRgNC+0Lwu0L7QsdGL0YfQvdGL0LnQn9GD0YHQui7Rg9Cy0LXQtNC+0LzQuNGC0YwoKTsKICAgIH0KfSk7CgovKgogKgogKiBMb2FkIGV4dGVybmFsIHNjcmlwdCBpbnRvIHNjcmlwdCB0YWcKICog0JfQsNCz0YDRg9C30LjRgtGMINGB0YLQvtGA0L7QvdC90LjQuSDRgdC60YDQuNC/0YIg0LIg0YLRjdCzIHNjcmlwdAogKgogKi8KZnVuY3Rpb24g0LfQsNCz0YDRg9C30LjRgtGM0KHQutGA0LjQv9GCKNC60L7QtCkKewogICAgdmFyINGB0LrRgNC40L/RgiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwogICAg0YHQutGA0LjQv9GCLmlubmVySFRNTCA9INC60L7QtDsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQo0YHQutGA0LjQv9GCKTsKfQp2YXIgbG9hZFNjcmlwdCA9INC30LDQs9GA0YPQt9C40YLRjNCh0LrRgNC40L/RgjsKCi8qCiAqCiAqINCY0LzRjyDQuNGB0L/QvtC70L3Rj9C10LzQvtCz0L4g0L/RgNGP0LzQviDRgdC10LnRh9Cw0YEg0YTQsNC50LvQsCBIVE1MCiAqIE5hbWUgb2YgdGhlIGN1cnJlbnQgSFRNTCBmaWxlCiAqCiAqLwpmdW5jdGlvbiDQuNC80Y/QpNCw0LnQu9CwKCkKewogICAgdmFyINC/0YPRgtGMID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lOwogICAgdmFyINC40LzRjyA9INC/0YPRgtGMLnNwbGl0KCIvIikucG9wKCk7CiAgICByZXR1cm4gZGVjb2RlVVJJKNC40LzRjyk7Cn0KdmFyIGZpbGVOYW1lID0g0LjQvNGP0KTQsNC50LvQsDsKCi8qCiAqCiAqINCg0LDQt9C+0LHRgNCw0YLRjCDQsNGA0LPRg9C80LXQvdGC0Ysg0L/RgNC4INC+0LHRi9GH0L3QvtC8INC/0YPRgdC60LUKICoKICovCtC80YPRgNC+0Lwu0LDRgNCz0YPQvNC10L3RgtGLID0ge307Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eShtdXJvbSwgImFyZ3VtZW50cyIsIHsKICAgIGdldDogZnVuY3Rpb24oKQogICAgewogICAgICAgIHJldHVybiDQvNGD0YDQvtC8LtCw0YDQs9GD0LzQtdC90YLRizsKICAgIH0KfSk7CtC80YPRgNC+0Lwu0LjQt9C80LXQvdC40LvQuNCQ0YDQs9GD0LzQtdC90YLRiyA9IG5ldyDQo9Cy0LXQtNC+0LzQuNGC0LXQu9GMKCk7Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eShtdXJvbSwgImNoYW5nZWRBcmd1bWVudHMiLCB7CiAgICBnZXQ6IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4g0LzRg9GA0L7QvC7QuNC30LzQtdC90LjQu9C40JDRgNCz0YPQvNC10L3RgtGLOwogICAgfQp9KTsKZnVuY3Rpb24g0YDQsNC30L7QsdGA0LDRgtGM0JDRgNCz0YPQvNC10L3RgtGLKCkKewogICAgdmFyINC30LDQv9GA0L7RgSA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpOwogICAgdmFyINCw0YDQs9C4ID0g0LfQsNC/0YDQvtGBLnNwbGl0KCImIik7CiAgICBmb3IgKHZhciDQvdC+0LzQtdGAIGluINCw0YDQs9C4KQogICAgewogICAgICAgIHZhciDQsNGA0LMgPSDQsNGA0LPQuFvQvdC+0LzQtdGAXTsKICAgICAgICB2YXIg0L/QvtC30LjRhtC40Y/Ql9C90LDQutCwID0g0LDRgNCzLmluZGV4T2YoIj0iKTsKICAgICAgICAvLyDQm9C40YjRjCDQutC70Y7Rhy4KICAgICAgICBpZiAo0L/QvtC30LjRhtC40Y/Ql9C90LDQutCwID09IC0xKQogICAgICAgIHsKICAgICAgICAgICAgdmFyINC60LvRjtGHID0gZGVjb2RlVVJJQ29tcG9uZW50KNCw0YDQsyk7CiAgICAgICAgICAgINC80YPRgNC+0Lwu0LDRgNCz0YPQvNC10L3RgtGLW9C60LvRjtGHXSA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8vINCa0LvRjtGHINGB0L4g0LfQvdCw0YfQtdC90LjQtdC8LgogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHZhciDRgdGL0YDQvtC50JrQu9GO0YcgPSDQsNGA0LMuc2xpY2UoMCwg0L/QvtC30LjRhtC40Y/Ql9C90LDQutCwKTsKICAgICAgICAgICAgdmFyINGB0YvRgNC+0LXQl9C90LDRh9C10L3QuNC1ID0g0LDRgNCzLnNsaWNlKNC/0L7Qt9C40YbQuNGP0JfQvdCw0LrQsCArIDEpOwogICAgICAgICAgICB2YXIg0LrQu9GO0YcgPSBkZWNvZGVVUklDb21wb25lbnQo0YHRi9GA0L7QudCa0LvRjtGHKTsKICAgICAgICAgICAgdmFyINC30L3QsNGH0LXQvdC40LUgPSBkZWNvZGVVUklDb21wb25lbnQo0YHRi9GA0L7QtdCX0L3QsNGH0LXQvdC40LUpOwogICAgICAgICAgICDQvNGD0YDQvtC8LtCw0YDQs9GD0LzQtdC90YLRi1vQutC70Y7Rh10gPSDQt9C90LDRh9C10L3QuNC1OwogICAgICAgIH0KICAgIH0KICAgINC80YPRgNC+0Lwu0LjQt9C80LXQvdC40LvQuNCQ0YDQs9GD0LzQtdC90YLRiy7Rg9Cy0LXQtNC+0LzQuNGC0YwoKTsKfQrQvNGD0YDQvtC8LtC+0LHRi9GH0L3Ri9C50J/Rg9GB0Lou0L/QvtC00L/QuNGB0LDRgtGMKNGA0LDQt9C+0LHRgNCw0YLRjNCQ0YDQs9GD0LzQtdC90YLRiyk7Cg==", {"status":true} ], -[ -"муром.редактор.шрифт-22", -"ZnVuY3Rpb24g0LfQsNC00LDRgtGM0KDQsNC30LzQtdGA0KjRgNC40YTRgtCw0KDQtdC00LDQutGC0L7RgNGDKCkKewogICAgaWYgKNC80YPRgNC+0Lwu0YDQtdC00LDQutGC0L7RgCkKICAgIHsKICAgICAgICDQvNGD0YDQvtC8LtGA0LXQtNCw0LrRgtC+0YAuc2V0Rm9udFNpemUoIjIycHgiKTsKICAgIH0KfQoK0LrQvtCz0LTQsCjQvNGD0YDQvtC8LtC/0YPRgdC6LCDQt9Cw0LTQsNGC0YzQoNCw0LfQvNC10YDQqNGA0LjRhNGC0LDQoNC10LTQsNC60YLQvtGA0YMpOw==", -{"status":true} -], - - [ "MOD_1.0.0", "Ly8g0JDQn9CYINC00LvRjyDRg9C/0YDQsNCy0LvQtdC90LjRjyDQvNC+0LTRg9C70Y/QvNC4Ci8vIEFQSSB0byBtYW5hZ2UgbW9kdWxlcwoKZnVuY3Rpb24gTW9kdWxlcyhtb2R1bGVzKQp7CiAgICB0aGlzLm1vZHVsZXMgPSBbXTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAi0LzQvtC00YPQu9C4IiwgewogICAgICAgIGdldDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9kdWxlczsKICAgICAgICB9CiAgICB9KTsKICAgIHRoaXMucGFyc2VTZXJpYWxpemVkTW9kdWxlcyhtb2R1bGVzKTsKfQoKLyoKICoKICog0KDQsNC30L7QsdGA0LDRgtGMINC80L7QtNGD0LvQuCDQuNC3INGB0LXRgNC40LDQu9C40LfQvtCy0LDQvdC90L7Qs9C+INGE0L7RgNC80LDRgtCwCiAqIFBhcnNlIG1vZHVsZXMgb2Ygc2VyaWFsaXplZCBmb3JtYXQKICoKICovCk1vZHVsZXMucHJvdG90eXBlLnBhcnNlU2VyaWFsaXplZE1vZHVsZXMgPSBmdW5jdGlvbihpdGVtcykKewogICAgZm9yICh2YXIgaSBpbiBpdGVtcykKICAgIHsKICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldOwogICAgICAgIHZhciBuYW1lID0gaXRlbVswXTsKICAgICAgICB2YXIgY29kZTY0ID0gaXRlbVsxXTsKICAgICAgICB2YXIgcHJvcGVydGllcyA9ICh0eXBlb2YgaXRlbVsyXSAhPSAidW5kZWZpbmVkIikgPyBpdGVtWzJdIDoge307CiAgICAgICAgCiAgICAgICAgLy8gU3RhdHVzLgogICAgICAgIHZhciBzdGF0dXMgPSB0cnVlOwogICAgICAgIGlmICgic3RhdHVzIiBpbiBwcm9wZXJ0aWVzKQogICAgICAgIHsKICAgICAgICAgICAgc3RhdHVzID0gcHJvcGVydGllc1sic3RhdHVzIl07CiAgICAgICAgfQogICAgICAgIHZhciBtb2R1bGUgPSB7CiAgICAgICAgICAgICJuYW1lIjogbmFtZSwKICAgICAgICAgICAgImNvZGU2NCI6IGNvZGU2NCwKICAgICAgICAgICAgInN0YXR1cyI6IHN0YXR1cywKICAgICAgICB9OwogICAgICAgIHRoaXMubW9kdWxlcy5wdXNoKG1vZHVsZSk7CiAgICB9Cn07CgovKgogKgogKiDQodC10YDQuNCw0LvQuNC30L7QstCw0L3Ri9C1INC80L7QtNGD0LvQuAogKiBTZXJpYWxpemVkIG1vZHVsZXMKICoKICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShNb2R1bGVzLnByb3RvdHlwZSwgInNlcmlhbGl6ZWRNb2R1bGVzIiwgewogICAgZ2V0OiBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgdmFyIGl0ZW1zID0gW107CiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLm1vZHVsZXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaXRlbSA9IFtdOwogICAgICAgICAgICB2YXIgbSA9IHRoaXMubW9kdWxlc1tpXTsKICAgICAgICAgICAgaXRlbS5wdXNoKG0ubmFtZSk7CiAgICAgICAgICAgIGl0ZW0ucHVzaChtLmNvZGU2NCk7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0aWVzID0ge307CiAgICAgICAgICAgIHByb3BlcnRpZXNbInN0YXR1cyJdID0gbS5zdGF0dXM7CiAgICAgICAgICAgIGl0ZW0ucHVzaChwcm9wZXJ0aWVzKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaXRlbXM7CiAgICB9Cn0pOwpPYmplY3QuZGVmaW5lUHJvcGVydHkoTW9kdWxlcy5wcm90b3R5cGUsICLRgdC10YDQuNCw0LvQuNC30L7QstCw0L3QvdGL0LXQnNC+0LTRg9C70LgiLCB7CiAgICBnZXQ6IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVkTW9kdWxlczsKICAgIH0KfSk7CgovKgogKgogKiDQndCw0LnRgtC4INC80L7QtNGD0LvRjCDQv9C+INC40LzQtdC90LgKICogRmluZCBtb2R1bGUgYnkgbmFtZQogKgogKi8KTW9kdWxlcy5wcm90b3R5cGUubW9kdWxlID0gZnVuY3Rpb24obmFtZSkKewogICAgZm9yICh2YXIgaSBpbiB0aGlzLm1vZHVsZXMpCiAgICB7CiAgICAgICAgdmFyIG0gPSB0aGlzLm1vZHVsZXNbaV07CiAgICAgICAgaWYgKG0ubmFtZSA9PSBuYW1lKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4gbnVsbDsKfTsKTW9kdWxlcy5wcm90b3R5cGUu0LzQvtC00YPQu9GMID0gZnVuY3Rpb24o0LjQvNGPKQp7CiAgICByZXR1cm4gdGhpcy5tb2R1bGUo0LjQvNGPKTsKfQoKLyoKICoKICog0J3QsNC50YLQuCDQvdC+0LzQtdGAINC80L7QtNGD0LvRjyDQv9C+INC40LzQtdC90LgKICogRmluZCBtb2R1bGUncyBvcmRlciBieSBuYW1lCiAqCiAqLwpNb2R1bGVzLnByb3RvdHlwZS5tb2R1bGVPcmRlciA9IGZ1bmN0aW9uKG5hbWUpCnsKICAgIGZvciAodmFyIGkgaW4gdGhpcy5tb2R1bGVzKQogICAgewogICAgICAgIHZhciBtID0gdGhpcy5tb2R1bGVzW2ldOwogICAgICAgIGlmIChtLm5hbWUgPT0gbmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuIG51bGw7Cn07Ck1vZHVsZXMucHJvdG90eXBlLtC90L7QvNC10YDQnNC+0LTRg9C70Y8gPSBmdW5jdGlvbijQuNC80Y8pCnsKICAgIHJldHVybiB0aGlzLm1vZHVsZU9yZGVyKNC40LzRjyk7Cn0KCi8qCiAqCiAqINCf0LXRgNC10LzQtdGB0YLQuNGC0Ywg0LzQvtC00YPQu9GMCiAqIE1vdmUgYSBtb2R1bGUKICoKICovCk1vZHVsZXMucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbihmcm9tLCB0bykKewogICAgdmFyIG1vZHVsZSA9IHRoaXMubW9kdWxlc1tmcm9tXTsKICAgIHZhciBuYW1lRnJvbSA9IG1vZHVsZS5uYW1lOwogICAgdmFyIG5hbWVUbyA9ICh0byAhPSBudWxsKSA/IHRoaXMubW9kdWxlc1t0b10ubmFtZSA6IG51bGw7CiAgICAvLyBSZW1vdmUgdGhlIG9sZCBlbnRyeS4KICAgIHZhciBvbGRQb3NpdGlvbiA9IGZyb207CiAgICB0aGlzLm1vZHVsZXMuc3BsaWNlKG9sZFBvc2l0aW9uLCAxKTsKICAgIC8vIEluc2VydCBpbnRvIHRoZSBuZXcgcGxhY2UuCiAgICB2YXIgbmV3UG9zaXRpb24gPSB0aGlzLm1vZHVsZXMubGVuZ3RoOwogICAgaWYgKG5hbWVUbyAhPSBudWxsKQogICAgewogICAgICAgIG5ld1Bvc2l0aW9uID0gdGhpcy5tb2R1bGVPcmRlcihuYW1lVG8pOwogICAgfQogICAgdGhpcy5tb2R1bGVzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgbW9kdWxlKTsKfTsKTW9kdWxlcy5wcm90b3R5cGUu0L/QtdGA0LXQvNC10YHRgtC40YLRjCA9IGZ1bmN0aW9uKNC40LcsINCyKQp7CiAgICB0aGlzLm1vdmUo0LjQtywg0LIpOwp9OwoKLyoKICoKICog0JTQvtCx0LDQstC40YLRjCDQvdC+0LLRi9C5INC80L7QtNGD0LvRjAogKiBBZGQgYSBuZXcgbW9kdWxlCiAqCiAqLwpNb2R1bGVzLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihuYW1lLCBjb2RlNjQpCnsKICAgIHZhciBtb2R1bGUgPSB7CiAgICAgICAgIm5hbWUiOiBuYW1lLAogICAgICAgICJjb2RlNjQiOiBjb2RlNjQsCiAgICAgICAgInN0YXR1cyI6IGZhbHNlLAogICAgfTsKICAgIHRoaXMubW9kdWxlcy5wdXNoKG1vZHVsZSk7Cn07Ck1vZHVsZXMucHJvdG90eXBlLtC00L7QsdCw0LLQuNGC0YwgPSBmdW5jdGlvbijQuNC80Y8sINC60L7QtDY0KQp7CiAgICByZXR1cm4gdGhpcy5hZGQo0LjQvNGPLCDQutC+0LQ2NCk7Cn0KCi8qCiAqCiAqINCj0LTQsNC70LjRgtGMINC80L7QtNGD0LvRjAogKiBEZWxldGUgYSBtb2R1bGUKICoKICovCk1vZHVsZXMucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uKGlkKQp7CiAgICB0aGlzLm1vZHVsZXMuc3BsaWNlKGlkLCAxKTsKfTsKTW9kdWxlcy5wcm90b3R5cGUu0YPQtNCw0LvQuNGC0YwgPSBmdW5jdGlvbijQvdC+0LzQtdGAKQp7CiAgICB0aGlzLmRlbGV0ZSjQvdC+0LzQtdGAKTsKfQoKLyoKICoKICog0KHQvtC30LTQsNGR0Lwg0Y3QutC30LXQvNC/0LvRj9GAINCc0J7QlAogKiBDcmVhdGUgTU9EIGluc3RhbmNlCiAqCiAqLwp2YXIgTU9EID0gbmV3IE1vZHVsZXMobXVyb20ubW9kdWxlcyk7CnZhciDQnNCe0JQgPSBNT0Q7", @@ -59,6 +38,20 @@ var murom = муром; ], +[ +"муром.редактор_1.1.0", +"0LzRg9GA0L7QvC7Qt9Cw0LPRgNGD0LfQuNGC0YxBQ0UgPSBmdW5jdGlvbigpCnsKICAgIC8vINCg0LXQtNCw0LrRgtC+0YAg0LrQvtC00LAgQUNFLgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FqYXhvcmcvYWNlLWJ1aWxkcy9ibG9iL21hc3Rlci9zcmMtbWluLW5vY29uZmxpY3QvYWNlLmpzCihmdW5jdGlvbigpe2Z1bmN0aW9uIG8obil7dmFyIGk9ZTtuJiYoZVtuXXx8KGVbbl09e30pLGk9ZVtuXSk7aWYoIWkuZGVmaW5lfHwhaS5kZWZpbmUucGFja2FnZWQpdC5vcmlnaW5hbD1pLmRlZmluZSxpLmRlZmluZT10LGkuZGVmaW5lLnBhY2thZ2VkPSEwO2lmKCFpLnJlcXVpcmV8fCFpLnJlcXVpcmUucGFja2FnZWQpci5vcmlnaW5hbD1pLnJlcXVpcmUsaS5yZXF1aXJlPXIsaS5yZXF1aXJlLnBhY2thZ2VkPSEwfXZhciBBQ0VfTkFNRVNQQUNFID0gImFjZSIsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpOyFlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmKGU9d2luZG93KTtpZighQUNFX05BTUVTUEFDRSYmdHlwZW9mIHJlcXVpcmVqcyE9InVuZGVmaW5lZCIpcmV0dXJuO3ZhciB0PWZ1bmN0aW9uKGUsbixyKXtpZih0eXBlb2YgZSE9InN0cmluZyIpe3Qub3JpZ2luYWw/dC5vcmlnaW5hbC5hcHBseSh0aGlzLGFyZ3VtZW50cyk6KGNvbnNvbGUuZXJyb3IoImRyb3BwaW5nIG1vZHVsZSBiZWNhdXNlIGRlZmluZSB3YXNuJ3QgYSBzdHJpbmcuIiksY29uc29sZS50cmFjZSgpKTtyZXR1cm59YXJndW1lbnRzLmxlbmd0aD09MiYmKHI9biksdC5tb2R1bGVzW2VdfHwodC5wYXlsb2Fkc1tlXT1yLHQubW9kdWxlc1tlXT1udWxsKX07dC5tb2R1bGVzPXt9LHQucGF5bG9hZHM9e307dmFyIG49ZnVuY3Rpb24oZSx0LG4pe2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7dmFyIGk9cyhlLHQpO2lmKGkhPXVuZGVmaW5lZClyZXR1cm4gbiYmbigpLGl9ZWxzZSBpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk9PT0iW29iamVjdCBBcnJheV0iKXt2YXIgbz1bXTtmb3IodmFyIHU9MCxhPXQubGVuZ3RoO3U8YTsrK3Upe3ZhciBmPXMoZSx0W3VdKTtpZihmPT11bmRlZmluZWQmJnIub3JpZ2luYWwpcmV0dXJuO28ucHVzaChmKX1yZXR1cm4gbiYmbi5hcHBseShudWxsLG8pfHwhMH19LHI9ZnVuY3Rpb24oZSx0KXt2YXIgaT1uKCIiLGUsdCk7cmV0dXJuIGk9PXVuZGVmaW5lZCYmci5vcmlnaW5hbD9yLm9yaWdpbmFsLmFwcGx5KHRoaXMsYXJndW1lbnRzKTppfSxpPWZ1bmN0aW9uKGUsdCl7aWYodC5pbmRleE9mKCIhIikhPT0tMSl7dmFyIG49dC5zcGxpdCgiISIpO3JldHVybiBpKGUsblswXSkrIiEiK2koZSxuWzFdKX1pZih0LmNoYXJBdCgwKT09Ii4iKXt2YXIgcj1lLnNwbGl0KCIvIikuc2xpY2UoMCwtMSkuam9pbigiLyIpO3Q9cisiLyIrdDt3aGlsZSh0LmluZGV4T2YoIi4iKSE9PS0xJiZzIT10KXt2YXIgcz10O3Q9dC5yZXBsYWNlKC9cL1wuXC8vLCIvIikucmVwbGFjZSgvW15cL10rXC9cLlwuXC8vLCIiKX19cmV0dXJuIHR9LHM9ZnVuY3Rpb24oZSxyKXtyPWkoZSxyKTt2YXIgcz10Lm1vZHVsZXNbcl07aWYoIXMpe3M9dC5wYXlsb2Fkc1tyXTtpZih0eXBlb2Ygcz09ImZ1bmN0aW9uIil7dmFyIG89e30sdT17aWQ6cix1cmk6IiIsZXhwb3J0czpvLHBhY2thZ2VkOiEwfSxhPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4ocixlLHQpfSxmPXMoYSxvLHUpO289Znx8dS5leHBvcnRzLHQubW9kdWxlc1tyXT1vLGRlbGV0ZSB0LnBheWxvYWRzW3JdfXM9dC5tb2R1bGVzW3JdPW98fHN9cmV0dXJuIHN9O28oQUNFX05BTUVTUEFDRSl9KSgpLGFjZS5kZWZpbmUoImFjZS9saWIvcmVnZXhwIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUpe3JldHVybihlLmdsb2JhbD8iZyI6IiIpKyhlLmlnbm9yZUNhc2U/ImkiOiIiKSsoZS5tdWx0aWxpbmU/Im0iOiIiKSsoZS5leHRlbmRlZD8ieCI6IiIpKyhlLnN0aWNreT8ieSI6IiIpfWZ1bmN0aW9uIHUoZSx0LG4pe2lmKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKXJldHVybiBlLmluZGV4T2YodCxuKTtmb3IodmFyIHI9bnx8MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdPT09dClyZXR1cm4gcjtyZXR1cm4tMX12YXIgcj17ZXhlYzpSZWdFeHAucHJvdG90eXBlLmV4ZWMsdGVzdDpSZWdFeHAucHJvdG90eXBlLnRlc3QsbWF0Y2g6U3RyaW5nLnByb3RvdHlwZS5tYXRjaCxyZXBsYWNlOlN0cmluZy5wcm90b3R5cGUucmVwbGFjZSxzcGxpdDpTdHJpbmcucHJvdG90eXBlLnNwbGl0fSxpPXIuZXhlYy5jYWxsKC8oKT8/LywiIilbMV09PT11bmRlZmluZWQscz1mdW5jdGlvbigpe3ZhciBlPS9eL2c7cmV0dXJuIHIudGVzdC5jYWxsKGUsIiIpLCFlLmxhc3RJbmRleH0oKTtpZihzJiZpKXJldHVybjtSZWdFeHAucHJvdG90eXBlLmV4ZWM9ZnVuY3Rpb24oZSl7dmFyIHQ9ci5leGVjLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxuLGE7aWYodHlwZW9mIGU9PSJzdHJpbmciJiZ0KXshaSYmdC5sZW5ndGg+MSYmdSh0LCIiKT4tMSYmKGE9UmVnRXhwKHRoaXMuc291cmNlLHIucmVwbGFjZS5jYWxsKG8odGhpcyksImciLCIiKSksci5yZXBsYWNlLmNhbGwoZS5zbGljZSh0LmluZGV4KSxhLGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoLTI7ZSsrKWFyZ3VtZW50c1tlXT09PXVuZGVmaW5lZCYmKHRbZV09dW5kZWZpbmVkKX0pKTtpZih0aGlzLl94cmVnZXhwJiZ0aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lcylmb3IodmFyIGY9MTtmPHQubGVuZ3RoO2YrKyluPXRoaXMuX3hyZWdleHAuY2FwdHVyZU5hbWVzW2YtMV0sbiYmKHRbbl09dFtmXSk7IXMmJnRoaXMuZ2xvYmFsJiYhdFswXS5sZW5ndGgmJnRoaXMubGFzdEluZGV4PnQuaW5kZXgmJnRoaXMubGFzdEluZGV4LS19cmV0dXJuIHR9LHN8fChSZWdFeHAucHJvdG90eXBlLnRlc3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9ci5leGVjLmNhbGwodGhpcyxlKTtyZXR1cm4gdCYmdGhpcy5nbG9iYWwmJiF0WzBdLmxlbmd0aCYmdGhpcy5sYXN0SW5kZXg+dC5pbmRleCYmdGhpcy5sYXN0SW5kZXgtLSwhIXR9KX0pLGFjZS5kZWZpbmUoImFjZS9saWIvZXM1LXNoaW0iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcigpe31mdW5jdGlvbiB3KGUpe3RyeXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInNlbnRpbmVsIix7fSksInNlbnRpbmVsImluIGV9Y2F0Y2godCl7fX1mdW5jdGlvbiBIKGUpe3JldHVybiBlPStlLGUhPT1lP2U9MDplIT09MCYmZSE9PTEvMCYmZSE9PS0xLzAmJihlPShlPjB8fC0xKSpNYXRoLmZsb29yKE1hdGguYWJzKGUpKSksZX1mdW5jdGlvbiBCKGUpe3ZhciB0PXR5cGVvZiBlO3JldHVybiBlPT09bnVsbHx8dD09PSJ1bmRlZmluZWQifHx0PT09ImJvb2xlYW4ifHx0PT09Im51bWJlciJ8fHQ9PT0ic3RyaW5nIn1mdW5jdGlvbiBqKGUpe3ZhciB0LG4scjtpZihCKGUpKXJldHVybiBlO249ZS52YWx1ZU9mO2lmKHR5cGVvZiBuPT0iZnVuY3Rpb24iKXt0PW4uY2FsbChlKTtpZihCKHQpKXJldHVybiB0fXI9ZS50b1N0cmluZztpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIil7dD1yLmNhbGwoZSk7aWYoQih0KSlyZXR1cm4gdH10aHJvdyBuZXcgVHlwZUVycm9yfUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kfHwoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24odCl7dmFyIG49dGhpcztpZih0eXBlb2YgbiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICIrbik7dmFyIGk9dS5jYWxsKGFyZ3VtZW50cywxKSxzPWZ1bmN0aW9uKCl7aWYodGhpcyBpbnN0YW5jZW9mIHMpe3ZhciBlPW4uYXBwbHkodGhpcyxpLmNvbmNhdCh1LmNhbGwoYXJndW1lbnRzKSkpO3JldHVybiBPYmplY3QoZSk9PT1lP2U6dGhpc31yZXR1cm4gbi5hcHBseSh0LGkuY29uY2F0KHUuY2FsbChhcmd1bWVudHMpKSl9O3JldHVybiBuLnByb3RvdHlwZSYmKHIucHJvdG90eXBlPW4ucHJvdG90eXBlLHMucHJvdG90eXBlPW5ldyByLHIucHJvdG90eXBlPW51bGwpLHN9KTt2YXIgaT1GdW5jdGlvbi5wcm90b3R5cGUuY2FsbCxzPUFycmF5LnByb3RvdHlwZSxvPU9iamVjdC5wcm90b3R5cGUsdT1zLnNsaWNlLGE9aS5iaW5kKG8udG9TdHJpbmcpLGY9aS5iaW5kKG8uaGFzT3duUHJvcGVydHkpLGwsYyxoLHAsZDtpZihkPWYobywiX19kZWZpbmVHZXR0ZXJfXyIpKWw9aS5iaW5kKG8uX19kZWZpbmVHZXR0ZXJfXyksYz1pLmJpbmQoby5fX2RlZmluZVNldHRlcl9fKSxoPWkuYmluZChvLl9fbG9va3VwR2V0dGVyX18pLHA9aS5iaW5kKG8uX19sb29rdXBTZXR0ZXJfXyk7aWYoWzEsMl0uc3BsaWNlKDApLmxlbmd0aCE9MilpZighZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3ZhciB0PW5ldyBBcnJheShlKzIpO3JldHVybiB0WzBdPXRbMV09MCx0fXZhciB0PVtdLG47dC5zcGxpY2UuYXBwbHkodCxlKDIwKSksdC5zcGxpY2UuYXBwbHkodCxlKDI2KSksbj10Lmxlbmd0aCx0LnNwbGljZSg1LDAsIlhYWCIpLG4rMT09dC5sZW5ndGg7aWYobisxPT10Lmxlbmd0aClyZXR1cm4hMH0oKSlBcnJheS5wcm90b3R5cGUuc3BsaWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5sZW5ndGg7ZT4wP2U+biYmKGU9bik6ZT09dm9pZCAwP2U9MDplPDAmJihlPU1hdGgubWF4KG4rZSwwKSksZSt0PG58fCh0PW4tZSk7dmFyIHI9dGhpcy5zbGljZShlLGUrdCksaT11LmNhbGwoYXJndW1lbnRzLDIpLHM9aS5sZW5ndGg7aWYoZT09PW4pcyYmdGhpcy5wdXNoLmFwcGx5KHRoaXMsaSk7ZWxzZXt2YXIgbz1NYXRoLm1pbih0LG4tZSksYT1lK28sZj1hK3MtbyxsPW4tYSxjPW4tbztpZihmPGEpZm9yKHZhciBoPTA7aDxsOysraCl0aGlzW2YraF09dGhpc1thK2hdO2Vsc2UgaWYoZj5hKWZvcihoPWw7aC0tOyl0aGlzW2YraF09dGhpc1thK2hdO2lmKHMmJmU9PT1jKXRoaXMubGVuZ3RoPWMsdGhpcy5wdXNoLmFwcGx5KHRoaXMsaSk7ZWxzZXt0aGlzLmxlbmd0aD1jK3M7Zm9yKGg9MDtoPHM7KytoKXRoaXNbZStoXT1pW2hdfX1yZXR1cm4gcn07ZWxzZXt2YXIgdj1BcnJheS5wcm90b3R5cGUuc3BsaWNlO0FycmF5LnByb3RvdHlwZS5zcGxpY2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD92LmFwcGx5KHRoaXMsW2U9PT12b2lkIDA/MDplLHQ9PT12b2lkIDA/dGhpcy5sZW5ndGgtZTp0XS5jb25jYXQodS5jYWxsKGFyZ3VtZW50cywyKSkpOltdfX1BcnJheS5pc0FycmF5fHwoQXJyYXkuaXNBcnJheT1mdW5jdGlvbih0KXtyZXR1cm4gYSh0KT09IltvYmplY3QgQXJyYXldIn0pO3ZhciBtPU9iamVjdCgiYSIpLGc9bVswXSE9ImEifHwhKDAgaW4gbSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2h8fChBcnJheS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXt2YXIgbj1GKHRoaXMpLHI9ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6bixpPWFyZ3VtZW50c1sxXSxzPS0xLG89ci5sZW5ndGg+Pj4wO2lmKGEodCkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcjt3aGlsZSgrK3M8bylzIGluIHImJnQuY2FsbChpLHJbc10scyxuKX0pLEFycmF5LnByb3RvdHlwZS5tYXB8fChBcnJheS5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe3ZhciBuPUYodGhpcykscj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpuLGk9ci5sZW5ndGg+Pj4wLHM9QXJyYXkoaSksbz1hcmd1bWVudHNbMV07aWYoYSh0KSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBmdW5jdGlvbiIpO2Zvcih2YXIgdT0wO3U8aTt1KyspdSBpbiByJiYoc1t1XT10LmNhbGwobyxyW3VdLHUsbikpO3JldHVybiBzfSksQXJyYXkucHJvdG90eXBlLmZpbHRlcnx8KEFycmF5LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7dmFyIG49Rih0aGlzKSxyPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOm4saT1yLmxlbmd0aD4+PjAscz1bXSxvLHU9YXJndW1lbnRzWzFdO2lmKGEodCkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24iKTtmb3IodmFyIGY9MDtmPGk7ZisrKWYgaW4gciYmKG89cltmXSx0LmNhbGwodSxvLGYsbikmJnMucHVzaChvKSk7cmV0dXJuIHN9KSxBcnJheS5wcm90b3R5cGUuZXZlcnl8fChBcnJheS5wcm90b3R5cGUuZXZlcnk9ZnVuY3Rpb24odCl7dmFyIG49Rih0aGlzKSxyPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOm4saT1yLmxlbmd0aD4+PjAscz1hcmd1bWVudHNbMV07aWYoYSh0KSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBmdW5jdGlvbiIpO2Zvcih2YXIgbz0wO288aTtvKyspaWYobyBpbiByJiYhdC5jYWxsKHMscltvXSxvLG4pKXJldHVybiExO3JldHVybiEwfSksQXJyYXkucHJvdG90eXBlLnNvbWV8fChBcnJheS5wcm90b3R5cGUuc29tZT1mdW5jdGlvbih0KXt2YXIgbj1GKHRoaXMpLHI9ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6bixpPXIubGVuZ3RoPj4+MCxzPWFyZ3VtZW50c1sxXTtpZihhKHQpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7Zm9yKHZhciBvPTA7bzxpO28rKylpZihvIGluIHImJnQuY2FsbChzLHJbb10sbyxuKSlyZXR1cm4hMDtyZXR1cm4hMX0pLEFycmF5LnByb3RvdHlwZS5yZWR1Y2V8fChBcnJheS5wcm90b3R5cGUucmVkdWNlPWZ1bmN0aW9uKHQpe3ZhciBuPUYodGhpcykscj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpuLGk9ci5sZW5ndGg+Pj4wO2lmKGEodCkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24iKTtpZighaSYmYXJndW1lbnRzLmxlbmd0aD09MSl0aHJvdyBuZXcgVHlwZUVycm9yKCJyZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlIik7dmFyIHM9MCxvO2lmKGFyZ3VtZW50cy5sZW5ndGg+PTIpbz1hcmd1bWVudHNbMV07ZWxzZSBkb3tpZihzIGluIHIpe289cltzKytdO2JyZWFrfWlmKCsrcz49aSl0aHJvdyBuZXcgVHlwZUVycm9yKCJyZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlIil9d2hpbGUoITApO2Zvcig7czxpO3MrKylzIGluIHImJihvPXQuY2FsbCh2b2lkIDAsbyxyW3NdLHMsbikpO3JldHVybiBvfSksQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0fHwoQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0PWZ1bmN0aW9uKHQpe3ZhciBuPUYodGhpcykscj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpuLGk9ci5sZW5ndGg+Pj4wO2lmKGEodCkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24iKTtpZighaSYmYXJndW1lbnRzLmxlbmd0aD09MSl0aHJvdyBuZXcgVHlwZUVycm9yKCJyZWR1Y2VSaWdodCBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKTt2YXIgcyxvPWktMTtpZihhcmd1bWVudHMubGVuZ3RoPj0yKXM9YXJndW1lbnRzWzFdO2Vsc2UgZG97aWYobyBpbiByKXtzPXJbby0tXTticmVha31pZigtLW88MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJyZWR1Y2VSaWdodCBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKX13aGlsZSghMCk7ZG8gbyBpbiB0aGlzJiYocz10LmNhbGwodm9pZCAwLHMscltvXSxvLG4pKTt3aGlsZShvLS0pO3JldHVybiBzfSk7aWYoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mfHxbMCwxXS5pbmRleE9mKDEsMikhPS0xKUFycmF5LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQpe3ZhciBuPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOkYodGhpcykscj1uLmxlbmd0aD4+PjA7aWYoIXIpcmV0dXJuLTE7dmFyIGk9MDthcmd1bWVudHMubGVuZ3RoPjEmJihpPUgoYXJndW1lbnRzWzFdKSksaT1pPj0wP2k6TWF0aC5tYXgoMCxyK2kpO2Zvcig7aTxyO2krKylpZihpIGluIG4mJm5baV09PT10KXJldHVybiBpO3JldHVybi0xfTtpZighQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mfHxbMCwxXS5sYXN0SW5kZXhPZigwLC0zKSE9LTEpQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQpe3ZhciBuPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOkYodGhpcykscj1uLmxlbmd0aD4+PjA7aWYoIXIpcmV0dXJuLTE7dmFyIGk9ci0xO2FyZ3VtZW50cy5sZW5ndGg+MSYmKGk9TWF0aC5taW4oaSxIKGFyZ3VtZW50c1sxXSkpKSxpPWk+PTA/aTpyLU1hdGguYWJzKGkpO2Zvcig7aT49MDtpLS0paWYoaSBpbiBuJiZ0PT09bltpXSlyZXR1cm4gaTtyZXR1cm4tMX07T2JqZWN0LmdldFByb3RvdHlwZU9mfHwoT2JqZWN0LmdldFByb3RvdHlwZU9mPWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8KHQuY29uc3RydWN0b3I/dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6byl9KTtpZighT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcil7dmFyIHk9Ik9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgY2FsbGVkIG9uIGEgbm9uLW9iamVjdDogIjtPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yPWZ1bmN0aW9uKHQsbil7aWYodHlwZW9mIHQhPSJvYmplY3QiJiZ0eXBlb2YgdCE9ImZ1bmN0aW9uInx8dD09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcih5K3QpO2lmKCFmKHQsbikpcmV0dXJuO3ZhciByLGkscztyPXtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH07aWYoZCl7dmFyIHU9dC5fX3Byb3RvX187dC5fX3Byb3RvX189bzt2YXIgaT1oKHQsbikscz1wKHQsbik7dC5fX3Byb3RvX189dTtpZihpfHxzKXJldHVybiBpJiYoci5nZXQ9aSkscyYmKHIuc2V0PXMpLHJ9cmV0dXJuIHIudmFsdWU9dFtuXSxyfX1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8KE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qua2V5cyh0KX0pO2lmKCFPYmplY3QuY3JlYXRlKXt2YXIgYjtPYmplY3QucHJvdG90eXBlLl9fcHJvdG9fXz09PW51bGw/Yj1mdW5jdGlvbigpe3JldHVybntfX3Byb3RvX186bnVsbH19OmI9ZnVuY3Rpb24oKXt2YXIgZT17fTtmb3IodmFyIHQgaW4gZSllW3RdPW51bGw7cmV0dXJuIGUuY29uc3RydWN0b3I9ZS5oYXNPd25Qcm9wZXJ0eT1lLnByb3BlcnR5SXNFbnVtZXJhYmxlPWUuaXNQcm90b3R5cGVPZj1lLnRvTG9jYWxlU3RyaW5nPWUudG9TdHJpbmc9ZS52YWx1ZU9mPWUuX19wcm90b19fPW51bGwsZX0sT2JqZWN0LmNyZWF0ZT1mdW5jdGlvbih0LG4pe3ZhciByO2lmKHQ9PT1udWxsKXI9YigpO2Vsc2V7aWYodHlwZW9mIHQhPSJvYmplY3QiKXRocm93IG5ldyBUeXBlRXJyb3IoInR5cGVvZiBwcm90b3R5cGVbIit0eXBlb2YgdCsiXSAhPSAnb2JqZWN0JyIpO3ZhciBpPWZ1bmN0aW9uKCl7fTtpLnByb3RvdHlwZT10LHI9bmV3IGksci5fX3Byb3RvX189dH1yZXR1cm4gbiE9PXZvaWQgMCYmT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocixuKSxyfX1pZihPYmplY3QuZGVmaW5lUHJvcGVydHkpe3ZhciBFPXcoe30pLFM9dHlwZW9mIGRvY3VtZW50PT0idW5kZWZpbmVkInx8dyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7aWYoIUV8fCFTKXZhciB4PU9iamVjdC5kZWZpbmVQcm9wZXJ0eX1pZighT2JqZWN0LmRlZmluZVByb3BlcnR5fHx4KXt2YXIgVD0iUHJvcGVydHkgZGVzY3JpcHRpb24gbXVzdCBiZSBhbiBvYmplY3Q6ICIsTj0iT2JqZWN0LmRlZmluZVByb3BlcnR5IGNhbGxlZCBvbiBub24tb2JqZWN0OiAiLEM9ImdldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCBvbiB0aGlzIGphdmFzY3JpcHQgZW5naW5lIjtPYmplY3QuZGVmaW5lUHJvcGVydHk9ZnVuY3Rpb24odCxuLHIpe2lmKHR5cGVvZiB0IT0ib2JqZWN0IiYmdHlwZW9mIHQhPSJmdW5jdGlvbiJ8fHQ9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoTit0KTtpZih0eXBlb2YgciE9Im9iamVjdCImJnR5cGVvZiByIT0iZnVuY3Rpb24ifHxyPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKFQrcik7aWYoeCl0cnl7cmV0dXJuIHguY2FsbChPYmplY3QsdCxuLHIpfWNhdGNoKGkpe31pZihmKHIsInZhbHVlIikpaWYoZCYmKGgodCxuKXx8cCh0LG4pKSl7dmFyIHM9dC5fX3Byb3RvX187dC5fX3Byb3RvX189byxkZWxldGUgdFtuXSx0W25dPXIudmFsdWUsdC5fX3Byb3RvX189c31lbHNlIHRbbl09ci52YWx1ZTtlbHNle2lmKCFkKXRocm93IG5ldyBUeXBlRXJyb3IoQyk7ZihyLCJnZXQiKSYmbCh0LG4sci5nZXQpLGYociwic2V0IikmJmModCxuLHIuc2V0KX1yZXR1cm4gdH19T2JqZWN0LmRlZmluZVByb3BlcnRpZXN8fChPYmplY3QuZGVmaW5lUHJvcGVydGllcz1mdW5jdGlvbih0LG4pe2Zvcih2YXIgciBpbiBuKWYobixyKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQscixuW3JdKTtyZXR1cm4gdH0pLE9iamVjdC5zZWFsfHwoT2JqZWN0LnNlYWw9ZnVuY3Rpb24odCl7cmV0dXJuIHR9KSxPYmplY3QuZnJlZXplfHwoT2JqZWN0LmZyZWV6ZT1mdW5jdGlvbih0KXtyZXR1cm4gdH0pO3RyeXtPYmplY3QuZnJlZXplKGZ1bmN0aW9uKCl7fSl9Y2F0Y2goayl7T2JqZWN0LmZyZWV6ZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHR5cGVvZiBuPT0iZnVuY3Rpb24iP246dChuKX19KE9iamVjdC5mcmVlemUpfU9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uc3x8KE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gdH0pLE9iamVjdC5pc1NlYWxlZHx8KE9iamVjdC5pc1NlYWxlZD1mdW5jdGlvbih0KXtyZXR1cm4hMX0pLE9iamVjdC5pc0Zyb3plbnx8KE9iamVjdC5pc0Zyb3plbj1mdW5jdGlvbih0KXtyZXR1cm4hMX0pLE9iamVjdC5pc0V4dGVuc2libGV8fChPYmplY3QuaXNFeHRlbnNpYmxlPWZ1bmN0aW9uKHQpe2lmKE9iamVjdCh0KT09PXQpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgbj0iIjt3aGlsZShmKHQsbikpbis9Ij8iO3Rbbl09ITA7dmFyIHI9Zih0LG4pO3JldHVybiBkZWxldGUgdFtuXSxyfSk7aWYoIU9iamVjdC5rZXlzKXt2YXIgTD0hMCxBPVsidG9TdHJpbmciLCJ0b0xvY2FsZVN0cmluZyIsInZhbHVlT2YiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsImNvbnN0cnVjdG9yIl0sTz1BLmxlbmd0aDtmb3IodmFyIE0gaW57dG9TdHJpbmc6bnVsbH0pTD0hMTtPYmplY3Qua2V5cz1mdW5jdGlvbiBJKGUpe2lmKHR5cGVvZiBlIT0ib2JqZWN0IiYmdHlwZW9mIGUhPSJmdW5jdGlvbiJ8fGU9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTt2YXIgST1bXTtmb3IodmFyIHQgaW4gZSlmKGUsdCkmJkkucHVzaCh0KTtpZihMKWZvcih2YXIgbj0wLHI9TztuPHI7bisrKXt2YXIgaT1BW25dO2YoZSxpKSYmSS5wdXNoKGkpfXJldHVybiBJfX1EYXRlLm5vd3x8KERhdGUubm93PWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9KTt2YXIgXz0iCVxuXHgwYlxmXHIgXHUwMGEwXHUxNjgwXHUxODBlXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBhXHUyMDJmXHUyMDVmXHUzMDAwXHUyMDI4XHUyMDI5XHVmZWZmIjtpZighU3RyaW5nLnByb3RvdHlwZS50cmltfHxfLnRyaW0oKSl7Xz0iWyIrXysiXSI7dmFyIEQ9bmV3IFJlZ0V4cCgiXiIrXytfKyIqIiksUD1uZXcgUmVnRXhwKF8rXysiKiQiKTtTdHJpbmcucHJvdG90eXBlLnRyaW09ZnVuY3Rpb24oKXtyZXR1cm4gU3RyaW5nKHRoaXMpLnJlcGxhY2UoRCwiIikucmVwbGFjZShQLCIiKX19dmFyIEY9ZnVuY3Rpb24oZSl7aWYoZT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW4ndCBjb252ZXJ0ICIrZSsiIHRvIG9iamVjdCIpO3JldHVybiBPYmplY3QoZSl9fSksYWNlLmRlZmluZSgiYWNlL2xpYi9maXhvbGRicm93c2VycyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvcmVnZXhwIiwiYWNlL2xpYi9lczUtc2hpbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZSgiLi9yZWdleHAiKSxlKCIuL2VzNS1zaGltIiksdHlwZW9mIEVsZW1lbnQhPSJ1bmRlZmluZWQiJiYhRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoRWxlbWVudC5wcm90b3R5cGUsInJlbW92ZSIse2VudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyl9fSl9KSxhY2UuZGVmaW5lKCJhY2UvbGliL3VzZXJhZ2VudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dC5PUz17TElOVVg6IkxJTlVYIixNQUM6Ik1BQyIsV0lORE9XUzoiV0lORE9XUyJ9LHQuZ2V0T1M9ZnVuY3Rpb24oKXtyZXR1cm4gdC5pc01hYz90Lk9TLk1BQzp0LmlzTGludXg/dC5PUy5MSU5VWDp0Lk9TLldJTkRPV1N9O3ZhciByPXR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiP25hdmlnYXRvcjp7fSxpPSgvbWFjfHdpbnxsaW51eC9pLmV4ZWMoci5wbGF0Zm9ybSl8fFsib3RoZXIiXSlbMF0udG9Mb3dlckNhc2UoKSxzPXIudXNlckFnZW50fHwiIixvPXIuYXBwTmFtZXx8IiI7dC5pc1dpbj1pPT0id2luIix0LmlzTWFjPWk9PSJtYWMiLHQuaXNMaW51eD1pPT0ibGludXgiLHQuaXNJRT1vPT0iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyInx8by5pbmRleE9mKCJNU0FwcEhvc3QiKT49MD9wYXJzZUZsb2F0KChzLm1hdGNoKC8oPzpNU0lFIHxUcmlkZW50XC9bMC05XStbXC4wLTldKzsuKnJ2OikoWzAtOV0rW1wuMC05XSspLyl8fFtdKVsxXSk6cGFyc2VGbG9hdCgocy5tYXRjaCgvKD86VHJpZGVudFwvWzAtOV0rW1wuMC05XSs7LipydjopKFswLTldK1tcLjAtOV0rKS8pfHxbXSlbMV0pLHQuaXNPbGRJRT10LmlzSUUmJnQuaXNJRTw5LHQuaXNHZWNrbz10LmlzTW96aWxsYT1zLm1hdGNoKC8gR2Vja29cL1xkKy8pLHQuaXNPcGVyYT10eXBlb2Ygb3BlcmE9PSJvYmplY3QiJiZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93Lm9wZXJhKT09IltvYmplY3QgT3BlcmFdIix0LmlzV2ViS2l0PXBhcnNlRmxvYXQocy5zcGxpdCgiV2ViS2l0LyIpWzFdKXx8dW5kZWZpbmVkLHQuaXNDaHJvbWU9cGFyc2VGbG9hdChzLnNwbGl0KCIgQ2hyb21lLyIpWzFdKXx8dW5kZWZpbmVkLHQuaXNFZGdlPXBhcnNlRmxvYXQocy5zcGxpdCgiIEVkZ2UvIilbMV0pfHx1bmRlZmluZWQsdC5pc0FJUj1zLmluZGV4T2YoIkFkb2JlQUlSIik+PTAsdC5pc0FuZHJvaWQ9cy5pbmRleE9mKCJBbmRyb2lkIik+PTAsdC5pc0Nocm9tZU9TPXMuaW5kZXhPZigiIENyT1MgIik+PTAsdC5pc0lPUz0vaVBhZHxpUGhvbmV8aVBvZC8udGVzdChzKSYmIXdpbmRvdy5NU1N0cmVhbSx0LmlzSU9TJiYodC5pc01hYz0hMCksdC5pc01vYmlsZT10LmlzSU9TfHx0LmlzQW5kcm9pZH0pLGFjZS5kZWZpbmUoImFjZS9saWIvZG9tIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vdXNlcmFnZW50IiksaT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI7dC5idWlsZERvbT1mdW5jdGlvbiBvKGUsdCxuKXtpZih0eXBlb2YgZT09InN0cmluZyImJmUpe3ZhciByPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGUpO3JldHVybiB0JiZ0LmFwcGVuZENoaWxkKHIpLHJ9aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGU7aWYodHlwZW9mIGVbMF0hPSJzdHJpbmcifHwhZVswXSl7dmFyIGk9W107Zm9yKHZhciBzPTA7czxlLmxlbmd0aDtzKyspe3ZhciB1PW8oZVtzXSx0LG4pO3UmJmkucHVzaCh1KX1yZXR1cm4gaX12YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGVbMF0pLGY9ZVsxXSxsPTE7ZiYmdHlwZW9mIGY9PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheShmKSYmKGw9Mik7Zm9yKHZhciBzPWw7czxlLmxlbmd0aDtzKyspbyhlW3NdLGEsbik7cmV0dXJuIGw9PTImJk9iamVjdC5rZXlzKGYpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZltlXTtlPT09ImNsYXNzIj9hLmNsYXNzTmFtZT1BcnJheS5pc0FycmF5KHQpP3Quam9pbigiICIpOnQ6dHlwZW9mIHQ9PSJmdW5jdGlvbiJ8fGU9PSJ2YWx1ZSI/YVtlXT10OmU9PT0icmVmIj9uJiYoblt0XT1hKTp0IT1udWxsJiZhLnNldEF0dHJpYnV0ZShlLHQpfSksdCYmdC5hcHBlbmRDaGlsZChhKSxhfSx0LmdldERvY3VtZW50SGVhZD1mdW5jdGlvbihlKXtyZXR1cm4gZXx8KGU9ZG9jdW1lbnQpLGUuaGVhZHx8ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHxlLmRvY3VtZW50RWxlbWVudH0sdC5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUz9kb2N1bWVudC5jcmVhdGVFbGVtZW50TlModHx8aSxlKTpkb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpfSx0LnJlbW92ZUNoaWxkcmVuPWZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPSIifSx0LmNyZWF0ZVRleHROb2RlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dD90Lm93bmVyRG9jdW1lbnQ6ZG9jdW1lbnQ7cmV0dXJuIG4uY3JlYXRlVGV4dE5vZGUoZSl9LHQuY3JlYXRlRnJhZ21lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT9lLm93bmVyRG9jdW1lbnQ6ZG9jdW1lbnQ7cmV0dXJuIHQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpfSx0Lmhhc0Nzc0NsYXNzPWZ1bmN0aW9uKGUsdCl7dmFyIG49KGUuY2xhc3NOYW1lKyIiKS5zcGxpdCgvXHMrL2cpO3JldHVybiBuLmluZGV4T2YodCkhPT0tMX0sdC5hZGRDc3NDbGFzcz1mdW5jdGlvbihlLG4pe3QuaGFzQ3NzQ2xhc3MoZSxuKXx8KGUuY2xhc3NOYW1lKz0iICIrbil9LHQucmVtb3ZlQ3NzQ2xhc3M9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNsYXNzTmFtZS5zcGxpdCgvXHMrL2cpO2Zvcig7Oyl7dmFyIHI9bi5pbmRleE9mKHQpO2lmKHI9PS0xKWJyZWFrO24uc3BsaWNlKHIsMSl9ZS5jbGFzc05hbWU9bi5qb2luKCIgIil9LHQudG9nZ2xlQ3NzQ2xhc3M9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNsYXNzTmFtZS5zcGxpdCgvXHMrL2cpLHI9ITA7Zm9yKDs7KXt2YXIgaT1uLmluZGV4T2YodCk7aWYoaT09LTEpYnJlYWs7cj0hMSxuLnNwbGljZShpLDEpfXJldHVybiByJiZuLnB1c2godCksZS5jbGFzc05hbWU9bi5qb2luKCIgIikscn0sdC5zZXRDc3NDbGFzcz1mdW5jdGlvbihlLG4scil7cj90LmFkZENzc0NsYXNzKGUsbik6dC5yZW1vdmVDc3NDbGFzcyhlLG4pfSx0Lmhhc0Nzc1N0cmluZz1mdW5jdGlvbihlLHQpe3ZhciBuPTAscjt0PXR8fGRvY3VtZW50O2lmKHI9dC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpKXdoaWxlKG48ci5sZW5ndGgpaWYocltuKytdLmlkPT09ZSlyZXR1cm4hMH0sdC5pbXBvcnRDc3NTdHJpbmc9ZnVuY3Rpb24obixyLGkpe3ZhciBzPWk7aWYoIWl8fCFpLmdldFJvb3ROb2RlKXM9ZG9jdW1lbnQ7ZWxzZXtzPWkuZ2V0Um9vdE5vZGUoKTtpZighc3x8cz09aSlzPWRvY3VtZW50fXZhciBvPXMub3duZXJEb2N1bWVudHx8cztpZihyJiZ0Lmhhc0Nzc1N0cmluZyhyLHMpKXJldHVybiBudWxsO3ImJihuKz0iXG4vKiMgc291cmNlVVJMPWFjZS9jc3MvIityKyIgKi8iKTt2YXIgdT10LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7dS5hcHBlbmRDaGlsZChvLmNyZWF0ZVRleHROb2RlKG4pKSxyJiYodS5pZD1yKSxzPT1vJiYocz10LmdldERvY3VtZW50SGVhZChvKSkscy5pbnNlcnRCZWZvcmUodSxzLmZpcnN0Q2hpbGQpfSx0LmltcG9ydENzc1N0eWxzaGVldD1mdW5jdGlvbihlLG4pe3QuYnVpbGREb20oWyJsaW5rIix7cmVsOiJzdHlsZXNoZWV0IixocmVmOmV9XSx0LmdldERvY3VtZW50SGVhZChuKSl9LHQuc2Nyb2xsYmFyV2lkdGg9ZnVuY3Rpb24oZSl7dmFyIG49dC5jcmVhdGVFbGVtZW50KCJhY2VfaW5uZXIiKTtuLnN0eWxlLndpZHRoPSIxMDAlIixuLnN0eWxlLm1pbldpZHRoPSIwcHgiLG4uc3R5bGUuaGVpZ2h0PSIyMDBweCIsbi5zdHlsZS5kaXNwbGF5PSJibG9jayI7dmFyIHI9dC5jcmVhdGVFbGVtZW50KCJhY2Vfb3V0ZXIiKSxpPXIuc3R5bGU7aS5wb3NpdGlvbj0iYWJzb2x1dGUiLGkubGVmdD0iLTEwMDAwcHgiLGkub3ZlcmZsb3c9ImhpZGRlbiIsaS53aWR0aD0iMjAwcHgiLGkubWluV2lkdGg9IjBweCIsaS5oZWlnaHQ9IjE1MHB4IixpLmRpc3BsYXk9ImJsb2NrIixyLmFwcGVuZENoaWxkKG4pO3ZhciBzPWUuZG9jdW1lbnRFbGVtZW50O3MuYXBwZW5kQ2hpbGQocik7dmFyIG89bi5vZmZzZXRXaWR0aDtpLm92ZXJmbG93PSJzY3JvbGwiO3ZhciB1PW4ub2Zmc2V0V2lkdGg7cmV0dXJuIG89PXUmJih1PXIuY2xpZW50V2lkdGgpLHMucmVtb3ZlQ2hpbGQociksby11fSx0eXBlb2YgZG9jdW1lbnQ9PSJ1bmRlZmluZWQiJiYodC5pbXBvcnRDc3NTdHJpbmc9ZnVuY3Rpb24oKXt9KSx0LmNvbXB1dGVkU3R5bGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZSwiIil8fHt9fSx0LnNldFN0eWxlPWZ1bmN0aW9uKGUsdCxuKXtlW3RdIT09biYmKGVbdF09bil9LHQuSEFTX0NTU19BTklNQVRJT049ITEsdC5IQVNfQ1NTX1RSQU5TRk9STVM9ITEsdC5ISV9EUEk9ci5pc1dpbj90eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmRldmljZVBpeGVsUmF0aW8+PTEuNTohMDtpZih0eXBlb2YgZG9jdW1lbnQhPSJ1bmRlZmluZWQiKXt2YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LkhJX0RQSSYmcy5zdHlsZS50cmFuc2Zvcm0hPT11bmRlZmluZWQmJih0LkhBU19DU1NfVFJBTlNGT1JNUz0hMCksIXIuaXNFZGdlJiZ0eXBlb2Ygcy5zdHlsZS5hbmltYXRpb25OYW1lIT0idW5kZWZpbmVkIiYmKHQuSEFTX0NTU19BTklNQVRJT049ITApLHM9bnVsbH10LkhBU19DU1NfVFJBTlNGT1JNUz90LnRyYW5zbGF0ZT1mdW5jdGlvbihlLHQsbil7ZS5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZSgiK01hdGgucm91bmQodCkrInB4LCAiK01hdGgucm91bmQobikrInB4KSJ9OnQudHJhbnNsYXRlPWZ1bmN0aW9uKGUsdCxuKXtlLnN0eWxlLnRvcD1NYXRoLnJvdW5kKG4pKyJweCIsZS5zdHlsZS5sZWZ0PU1hdGgucm91bmQodCkrInB4In19KSxhY2UuZGVmaW5lKCJhY2UvbGliL29vcCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dC5pbmhlcml0cz1mdW5jdGlvbihlLHQpe2Uuc3VwZXJfPXQsZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSl9LHQubWl4aW49ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9LHQuaW1wbGVtZW50PWZ1bmN0aW9uKGUsbil7dC5taXhpbihlLG4pfX0pLGFjZS5kZWZpbmUoImFjZS9saWIva2V5cyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL29vcCIpLGk9ZnVuY3Rpb24oKXt2YXIgZT17TU9ESUZJRVJfS0VZUzp7MTY6IlNoaWZ0IiwxNzoiQ3RybCIsMTg6IkFsdCIsMjI0OiJNZXRhIiw5MToiTWV0YUxlZnQiLDkyOiJNZXRhUmlnaHQiLDkzOiJDb250ZXh0TWVudSJ9LEtFWV9NT0RTOntjdHJsOjEsYWx0OjIsb3B0aW9uOjIsc2hpZnQ6NCwic3VwZXIiOjgsbWV0YTo4LGNvbW1hbmQ6OCxjbWQ6OH0sRlVOQ1RJT05fS0VZUzp7ODoiQmFja3NwYWNlIiw5OiJUYWIiLDEzOiJSZXR1cm4iLDE5OiJQYXVzZSIsMjc6IkVzYyIsMzI6IlNwYWNlIiwzMzoiUGFnZVVwIiwzNDoiUGFnZURvd24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiTGVmdCIsMzg6IlVwIiwzOToiUmlnaHQiLDQwOiJEb3duIiw0NDoiUHJpbnQiLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDk2OiJOdW1wYWQwIiw5NzoiTnVtcGFkMSIsOTg6Ik51bXBhZDIiLDk5OiJOdW1wYWQzIiwxMDA6Ik51bXBhZDQiLDEwMToiTnVtcGFkNSIsMTAyOiJOdW1wYWQ2IiwxMDM6Ik51bXBhZDciLDEwNDoiTnVtcGFkOCIsMTA1OiJOdW1wYWQ5IiwiLTEzIjoiTnVtcGFkRW50ZXIiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtbG9jayIsMTQ1OiJTY3JvbGxsb2NrIn0sUFJJTlRBQkxFX0tFWVM6ezMyOiIgIiw0ODoiMCIsNDk6IjEiLDUwOiIyIiw1MToiMyIsNTI6IjQiLDUzOiI1Iiw1NDoiNiIsNTU6IjciLDU2OiI4Iiw1NzoiOSIsNTk6IjsiLDYxOiI9Iiw2NToiYSIsNjY6ImIiLDY3OiJjIiw2ODoiZCIsNjk6ImUiLDcwOiJmIiw3MToiZyIsNzI6ImgiLDczOiJpIiw3NDoiaiIsNzU6ImsiLDc2OiJsIiw3NzoibSIsNzg6Im4iLDc5OiJvIiw4MDoicCIsODE6InEiLDgyOiJyIiw4MzoicyIsODQ6InQiLDg1OiJ1Iiw4NjoidiIsODc6InciLDg4OiJ4Iiw4OToieSIsOTA6InoiLDEwNzoiKyIsMTA5OiItIiwxMTA6Ii4iLDE4NjoiOyIsMTg3OiI9IiwxODg6IiwiLDE4OToiLSIsMTkwOiIuIiwxOTE6Ii8iLDE5MjoiYCIsMjE5OiJbIiwyMjA6IlxcIiwyMjE6Il0iLDIyMjoiJyIsMTExOiIvIiwxMDY6IioifX0sdCxuO2ZvcihuIGluIGUuRlVOQ1RJT05fS0VZUyl0PWUuRlVOQ1RJT05fS0VZU1tuXS50b0xvd2VyQ2FzZSgpLGVbdF09cGFyc2VJbnQobiwxMCk7Zm9yKG4gaW4gZS5QUklOVEFCTEVfS0VZUyl0PWUuUFJJTlRBQkxFX0tFWVNbbl0udG9Mb3dlckNhc2UoKSxlW3RdPXBhcnNlSW50KG4sMTApO3JldHVybiByLm1peGluKGUsZS5NT0RJRklFUl9LRVlTKSxyLm1peGluKGUsZS5QUklOVEFCTEVfS0VZUyksci5taXhpbihlLGUuRlVOQ1RJT05fS0VZUyksZS5lbnRlcj1lWyJyZXR1cm4iXSxlLmVzY2FwZT1lLmVzYyxlLmRlbD1lWyJkZWxldGUiXSxlWzE3M109Ii0iLGZ1bmN0aW9uKCl7dmFyIHQ9WyJjbWQiLCJjdHJsIiwiYWx0Iiwic2hpZnQiXTtmb3IodmFyIG49TWF0aC5wb3coMix0Lmxlbmd0aCk7bi0tOyllLktFWV9NT0RTW25dPXQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBuJmUuS0VZX01PRFNbdF19KS5qb2luKCItIikrIi0ifSgpLGUuS0VZX01PRFNbMF09IiIsZS5LRVlfTU9EU1stMV09ImlucHV0LSIsZX0oKTtyLm1peGluKHQsaSksdC5rZXlDb2RlVG9TdHJpbmc9ZnVuY3Rpb24oZSl7dmFyIHQ9aVtlXTtyZXR1cm4gdHlwZW9mIHQhPSJzdHJpbmciJiYodD1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpKSx0LnRvTG93ZXJDYXNlKCl9fSksYWNlLmRlZmluZSgiYWNlL2xpYi9ldmVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIva2V5cyIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGUsdCxuKXt2YXIgYT11KHQpO2lmKCFpLmlzTWFjJiZzKXt0LmdldE1vZGlmaWVyU3RhdGUmJih0LmdldE1vZGlmaWVyU3RhdGUoIk9TIil8fHQuZ2V0TW9kaWZpZXJTdGF0ZSgiV2luIikpJiYoYXw9OCk7aWYocy5hbHRHcil7aWYoKDMmYSk9PTMpcmV0dXJuO3MuYWx0R3I9MH1pZihuPT09MTh8fG49PT0xNyl7dmFyIGY9ImxvY2F0aW9uImluIHQ/dC5sb2NhdGlvbjp0LmtleUxvY2F0aW9uO2lmKG49PT0xNyYmZj09PTEpc1tuXT09MSYmKG89dC50aW1lU3RhbXApO2Vsc2UgaWYobj09PTE4JiZhPT09MyYmZj09PTIpe3ZhciBsPXQudGltZVN0YW1wLW87bDw1MCYmKHMuYWx0R3I9ITApfX19biBpbiByLk1PRElGSUVSX0tFWVMmJihuPS0xKTtpZighYSYmbj09PTEzKXt2YXIgZj0ibG9jYXRpb24iaW4gdD90LmxvY2F0aW9uOnQua2V5TG9jYXRpb247aWYoZj09PTMpe2UodCxhLC1uKTtpZih0LmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJufX1pZihpLmlzQ2hyb21lT1MmJmEmOCl7ZSh0LGEsbik7aWYodC5kZWZhdWx0UHJldmVudGVkKXJldHVybjthJj0tOX1yZXR1cm4hIWF8fG4gaW4gci5GVU5DVElPTl9LRVlTfHxuIGluIHIuUFJJTlRBQkxFX0tFWVM/ZSh0LGEsbik6ITF9ZnVuY3Rpb24gZigpe3M9T2JqZWN0LmNyZWF0ZShudWxsKX12YXIgcj1lKCIuL2tleXMiKSxpPWUoIi4vdXNlcmFnZW50Iikscz1udWxsLG89MDt0LmFkZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCxuKXtpZihlLmFkZEV2ZW50TGlzdGVuZXIpcmV0dXJuIGUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpO2lmKGUuYXR0YWNoRXZlbnQpe3ZhciByPWZ1bmN0aW9uKCl7bi5jYWxsKGUsd2luZG93LmV2ZW50KX07bi5fd3JhcHBlcj1yLGUuYXR0YWNoRXZlbnQoIm9uIit0LHIpfX0sdC5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihlLHQsbil7aWYoZS5yZW1vdmVFdmVudExpc3RlbmVyKXJldHVybiBlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLCExKTtlLmRldGFjaEV2ZW50JiZlLmRldGFjaEV2ZW50KCJvbiIrdCxuLl93cmFwcGVyfHxuKX0sdC5zdG9wRXZlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuc3RvcFByb3BhZ2F0aW9uKGUpLHQucHJldmVudERlZmF1bHQoZSksITF9LHQuc3RvcFByb3BhZ2F0aW9uPWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uP2Uuc3RvcFByb3BhZ2F0aW9uKCk6ZS5jYW5jZWxCdWJibGU9ITB9LHQucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdD9lLnByZXZlbnREZWZhdWx0KCk6ZS5yZXR1cm5WYWx1ZT0hMX0sdC5nZXRCdXR0b249ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09ImRibGNsaWNrIj8wOmUudHlwZT09ImNvbnRleHRtZW51Inx8aS5pc01hYyYmZS5jdHJsS2V5JiYhZS5hbHRLZXkmJiFlLnNoaWZ0S2V5PzI6ZS5wcmV2ZW50RGVmYXVsdD9lLmJ1dHRvbjp7MTowLDI6Miw0OjF9W2UuYnV0dG9uXX0sdC5jYXB0dXJlPWZ1bmN0aW9uKGUsbixyKXtmdW5jdGlvbiBpKGUpe24mJm4oZSksciYmcihlKSx0LnJlbW92ZUxpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLG4sITApLHQucmVtb3ZlTGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLGksITApLHQucmVtb3ZlTGlzdGVuZXIoZG9jdW1lbnQsImRyYWdzdGFydCIsaSwhMCl9cmV0dXJuIHQuYWRkTGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsbiwhMCksdC5hZGRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsaSwhMCksdC5hZGRMaXN0ZW5lcihkb2N1bWVudCwiZHJhZ3N0YXJ0IixpLCEwKSxpfSx0LmFkZE1vdXNlV2hlZWxMaXN0ZW5lcj1mdW5jdGlvbihlLG4peyJvbm1vdXNld2hlZWwiaW4gZT90LmFkZExpc3RlbmVyKGUsIm1vdXNld2hlZWwiLGZ1bmN0aW9uKGUpe3ZhciB0PTg7ZS53aGVlbERlbHRhWCE9PXVuZGVmaW5lZD8oZS53aGVlbFg9LWUud2hlZWxEZWx0YVgvdCxlLndoZWVsWT0tZS53aGVlbERlbHRhWS90KTooZS53aGVlbFg9MCxlLndoZWVsWT0tZS53aGVlbERlbHRhL3QpLG4oZSl9KToib253aGVlbCJpbiBlP3QuYWRkTGlzdGVuZXIoZSwid2hlZWwiLGZ1bmN0aW9uKGUpe3ZhciB0PS4zNTtzd2l0Y2goZS5kZWx0YU1vZGUpe2Nhc2UgZS5ET01fREVMVEFfUElYRUw6ZS53aGVlbFg9ZS5kZWx0YVgqdHx8MCxlLndoZWVsWT1lLmRlbHRhWSp0fHwwO2JyZWFrO2Nhc2UgZS5ET01fREVMVEFfTElORTpjYXNlIGUuRE9NX0RFTFRBX1BBR0U6ZS53aGVlbFg9KGUuZGVsdGFYfHwwKSo1LGUud2hlZWxZPShlLmRlbHRhWXx8MCkqNX1uKGUpfSk6dC5hZGRMaXN0ZW5lcihlLCJET01Nb3VzZVNjcm9sbCIsZnVuY3Rpb24oZSl7ZS5heGlzJiZlLmF4aXM9PWUuSE9SSVpPTlRBTF9BWElTPyhlLndoZWVsWD0oZS5kZXRhaWx8fDApKjUsZS53aGVlbFk9MCk6KGUud2hlZWxYPTAsZS53aGVlbFk9KGUuZGV0YWlsfHwwKSo1KSxuKGUpfSl9LHQuYWRkTXVsdGlNb3VzZURvd25MaXN0ZW5lcj1mdW5jdGlvbihlLG4scixzKXtmdW5jdGlvbiBjKGUpe3QuZ2V0QnV0dG9uKGUpIT09MD9vPTA6ZS5kZXRhaWw+MT8obysrLG8+NCYmKG89MSkpOm89MTtpZihpLmlzSUUpe3ZhciBjPU1hdGguYWJzKGUuY2xpZW50WC11KT41fHxNYXRoLmFicyhlLmNsaWVudFktYSk+NTtpZighZnx8YylvPTE7ZiYmY2xlYXJUaW1lb3V0KGYpLGY9c2V0VGltZW91dChmdW5jdGlvbigpe2Y9bnVsbH0sbltvLTFdfHw2MDApLG89PTEmJih1PWUuY2xpZW50WCxhPWUuY2xpZW50WSl9ZS5fY2xpY2tzPW8scltzXSgibW91c2Vkb3duIixlKTtpZihvPjQpbz0wO2Vsc2UgaWYobz4xKXJldHVybiByW3NdKGxbb10sZSl9ZnVuY3Rpb24gaChlKXtvPTIsZiYmY2xlYXJUaW1lb3V0KGYpLGY9c2V0VGltZW91dChmdW5jdGlvbigpe2Y9bnVsbH0sbltvLTFdfHw2MDApLHJbc10oIm1vdXNlZG93biIsZSkscltzXShsW29dLGUpfXZhciBvPTAsdSxhLGYsbD17MjoiZGJsY2xpY2siLDM6InRyaXBsZWNsaWNrIiw0OiJxdWFkY2xpY2sifTtBcnJheS5pc0FycmF5KGUpfHwoZT1bZV0pLGUuZm9yRWFjaChmdW5jdGlvbihlKXt0LmFkZExpc3RlbmVyKGUsIm1vdXNlZG93biIsYyksaS5pc09sZElFJiZ0LmFkZExpc3RlbmVyKGUsImRibGNsaWNrIixoKX0pfTt2YXIgdT0haS5pc01hY3x8IWkuaXNPcGVyYXx8IktleWJvYXJkRXZlbnQiaW4gd2luZG93P2Z1bmN0aW9uKGUpe3JldHVybiAwfChlLmN0cmxLZXk/MTowKXwoZS5hbHRLZXk/MjowKXwoZS5zaGlmdEtleT80OjApfChlLm1ldGFLZXk/ODowKX06ZnVuY3Rpb24oZSl7cmV0dXJuIDB8KGUubWV0YUtleT8xOjApfChlLmFsdEtleT8yOjApfChlLnNoaWZ0S2V5PzQ6MCl8KGUuY3RybEtleT84OjApfTt0LmdldE1vZGlmaWVyU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiByLktFWV9NT0RTW3UoZSldfSx0LmFkZENvbW1hbmRLZXlMaXN0ZW5lcj1mdW5jdGlvbihlLG4pe3ZhciByPXQuYWRkTGlzdGVuZXI7aWYoaS5pc09sZEdlY2tvfHxpLmlzT3BlcmEmJiEoIktleWJvYXJkRXZlbnQiaW4gd2luZG93KSl7dmFyIG89bnVsbDtyKGUsImtleWRvd24iLGZ1bmN0aW9uKGUpe289ZS5rZXlDb2RlfSkscihlLCJrZXlwcmVzcyIsZnVuY3Rpb24oZSl7cmV0dXJuIGEobixlLG8pfSl9ZWxzZXt2YXIgdT1udWxsO3IoZSwia2V5ZG93biIsZnVuY3Rpb24oZSl7c1tlLmtleUNvZGVdPShzW2Uua2V5Q29kZV18fDApKzE7dmFyIHQ9YShuLGUsZS5rZXlDb2RlKTtyZXR1cm4gdT1lLmRlZmF1bHRQcmV2ZW50ZWQsdH0pLHIoZSwia2V5cHJlc3MiLGZ1bmN0aW9uKGUpe3UmJihlLmN0cmxLZXl8fGUuYWx0S2V5fHxlLnNoaWZ0S2V5fHxlLm1ldGFLZXkpJiYodC5zdG9wRXZlbnQoZSksdT1udWxsKX0pLHIoZSwia2V5dXAiLGZ1bmN0aW9uKGUpe3NbZS5rZXlDb2RlXT1udWxsfSksc3x8KGYoKSxyKHdpbmRvdywiZm9jdXMiLGYpKX19O2lmKHR5cGVvZiB3aW5kb3c9PSJvYmplY3QiJiZ3aW5kb3cucG9zdE1lc3NhZ2UmJiFpLmlzT2xkSUUpe3ZhciBsPTE7dC5uZXh0VGljaz1mdW5jdGlvbihlLG4pe249bnx8d2luZG93O3ZhciByPSJ6ZXJvLXRpbWVvdXQtbWVzc2FnZS0iK2wrKyxpPWZ1bmN0aW9uKHMpe3MuZGF0YT09ciYmKHQuc3RvcFByb3BhZ2F0aW9uKHMpLHQucmVtb3ZlTGlzdGVuZXIobiwibWVzc2FnZSIsaSksZSgpKX07dC5hZGRMaXN0ZW5lcihuLCJtZXNzYWdlIixpKSxuLnBvc3RNZXNzYWdlKHIsIioiKX19dC4kaWRsZUJsb2NrZWQ9ITEsdC5vbklkbGU9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbiByKCl7dC4kaWRsZUJsb2NrZWQ/c2V0VGltZW91dChyLDEwMCk6ZSgpfSxuKX0sdC4kaWRsZUJsb2NrSWQ9bnVsbCx0LmJsb2NrSWRsZT1mdW5jdGlvbihlKXt0LiRpZGxlQmxvY2tJZCYmY2xlYXJUaW1lb3V0KHQuJGlkbGVCbG9ja0lkKSx0LiRpZGxlQmxvY2tlZD0hMCx0LiRpZGxlQmxvY2tJZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC4kaWRsZUJsb2NrZWQ9ITF9LGV8fDEwMCl9LHQubmV4dEZyYW1lPXR5cGVvZiB3aW5kb3c9PSJvYmplY3QiJiYod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZSksdC5uZXh0RnJhbWU/dC5uZXh0RnJhbWU9dC5uZXh0RnJhbWUuYmluZCh3aW5kb3cpOnQubmV4dEZyYW1lPWZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoZSwxNyl9fSksYWNlLmRlZmluZSgiYWNlL3JhbmdlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1mdW5jdGlvbihlLHQpe3JldHVybiBlLnJvdy10LnJvd3x8ZS5jb2x1bW4tdC5jb2x1bW59LGk9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5zdGFydD17cm93OmUsY29sdW1uOnR9LHRoaXMuZW5kPXtyb3c6bixjb2x1bW46cn19OyhmdW5jdGlvbigpe3RoaXMuaXNFcXVhbD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zdGFydC5yb3c9PT1lLnN0YXJ0LnJvdyYmdGhpcy5lbmQucm93PT09ZS5lbmQucm93JiZ0aGlzLnN0YXJ0LmNvbHVtbj09PWUuc3RhcnQuY29sdW1uJiZ0aGlzLmVuZC5jb2x1bW49PT1lLmVuZC5jb2x1bW59LHRoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iUmFuZ2U6IFsiK3RoaXMuc3RhcnQucm93KyIvIit0aGlzLnN0YXJ0LmNvbHVtbisiXSAtPiBbIit0aGlzLmVuZC5yb3crIi8iK3RoaXMuZW5kLmNvbHVtbisiXSJ9LHRoaXMuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5jb21wYXJlKGUsdCk9PTB9LHRoaXMuY29tcGFyZVJhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5lbmQscj1lLnN0YXJ0O3JldHVybiB0PXRoaXMuY29tcGFyZShuLnJvdyxuLmNvbHVtbiksdD09MT8odD10aGlzLmNvbXBhcmUoci5yb3csci5jb2x1bW4pLHQ9PTE/Mjp0PT0wPzE6MCk6dD09LTE/LTI6KHQ9dGhpcy5jb21wYXJlKHIucm93LHIuY29sdW1uKSx0PT0tMT8tMTp0PT0xPzQyOjApfSx0aGlzLmNvbXBhcmVQb2ludD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jb21wYXJlKGUucm93LGUuY29sdW1uKX0sdGhpcy5jb250YWluc1JhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbXBhcmVQb2ludChlLnN0YXJ0KT09MCYmdGhpcy5jb21wYXJlUG9pbnQoZS5lbmQpPT0wfSx0aGlzLmludGVyc2VjdHM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jb21wYXJlUmFuZ2UoZSk7cmV0dXJuIHQ9PS0xfHx0PT0wfHx0PT0xfSx0aGlzLmlzRW5kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5kLnJvdz09ZSYmdGhpcy5lbmQuY29sdW1uPT10fSx0aGlzLmlzU3RhcnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zdGFydC5yb3c9PWUmJnRoaXMuc3RhcnQuY29sdW1uPT10fSx0aGlzLnNldFN0YXJ0PWZ1bmN0aW9uKGUsdCl7dHlwZW9mIGU9PSJvYmplY3QiPyh0aGlzLnN0YXJ0LmNvbHVtbj1lLmNvbHVtbix0aGlzLnN0YXJ0LnJvdz1lLnJvdyk6KHRoaXMuc3RhcnQucm93PWUsdGhpcy5zdGFydC5jb2x1bW49dCl9LHRoaXMuc2V0RW5kPWZ1bmN0aW9uKGUsdCl7dHlwZW9mIGU9PSJvYmplY3QiPyh0aGlzLmVuZC5jb2x1bW49ZS5jb2x1bW4sdGhpcy5lbmQucm93PWUucm93KToodGhpcy5lbmQucm93PWUsdGhpcy5lbmQuY29sdW1uPXQpfSx0aGlzLmluc2lkZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmNvbXBhcmUoZSx0KT09MD90aGlzLmlzRW5kKGUsdCl8fHRoaXMuaXNTdGFydChlLHQpPyExOiEwOiExfSx0aGlzLmluc2lkZVN0YXJ0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuY29tcGFyZShlLHQpPT0wP3RoaXMuaXNFbmQoZSx0KT8hMTohMDohMX0sdGhpcy5pbnNpZGVFbmQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5jb21wYXJlKGUsdCk9PTA/dGhpcy5pc1N0YXJ0KGUsdCk/ITE6ITA6ITF9LHRoaXMuY29tcGFyZT1mdW5jdGlvbihlLHQpe3JldHVybiF0aGlzLmlzTXVsdGlMaW5lKCkmJmU9PT10aGlzLnN0YXJ0LnJvdz90PHRoaXMuc3RhcnQuY29sdW1uPy0xOnQ+dGhpcy5lbmQuY29sdW1uPzE6MDplPHRoaXMuc3RhcnQucm93Py0xOmU+dGhpcy5lbmQucm93PzE6dGhpcy5zdGFydC5yb3c9PT1lP3Q+PXRoaXMuc3RhcnQuY29sdW1uPzA6LTE6dGhpcy5lbmQucm93PT09ZT90PD10aGlzLmVuZC5jb2x1bW4/MDoxOjB9LHRoaXMuY29tcGFyZVN0YXJ0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuc3RhcnQucm93PT1lJiZ0aGlzLnN0YXJ0LmNvbHVtbj09dD8tMTp0aGlzLmNvbXBhcmUoZSx0KX0sdGhpcy5jb21wYXJlRW5kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5kLnJvdz09ZSYmdGhpcy5lbmQuY29sdW1uPT10PzE6dGhpcy5jb21wYXJlKGUsdCl9LHRoaXMuY29tcGFyZUluc2lkZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuZC5yb3c9PWUmJnRoaXMuZW5kLmNvbHVtbj09dD8xOnRoaXMuc3RhcnQucm93PT1lJiZ0aGlzLnN0YXJ0LmNvbHVtbj09dD8tMTp0aGlzLmNvbXBhcmUoZSx0KX0sdGhpcy5jbGlwUm93cz1mdW5jdGlvbihlLHQpe2lmKHRoaXMuZW5kLnJvdz50KXZhciBuPXtyb3c6dCsxLGNvbHVtbjowfTtlbHNlIGlmKHRoaXMuZW5kLnJvdzxlKXZhciBuPXtyb3c6ZSxjb2x1bW46MH07aWYodGhpcy5zdGFydC5yb3c+dCl2YXIgcj17cm93OnQrMSxjb2x1bW46MH07ZWxzZSBpZih0aGlzLnN0YXJ0LnJvdzxlKXZhciByPXtyb3c6ZSxjb2x1bW46MH07cmV0dXJuIGkuZnJvbVBvaW50cyhyfHx0aGlzLnN0YXJ0LG58fHRoaXMuZW5kKX0sdGhpcy5leHRlbmQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNvbXBhcmUoZSx0KTtpZihuPT0wKXJldHVybiB0aGlzO2lmKG49PS0xKXZhciByPXtyb3c6ZSxjb2x1bW46dH07ZWxzZSB2YXIgcz17cm93OmUsY29sdW1uOnR9O3JldHVybiBpLmZyb21Qb2ludHMocnx8dGhpcy5zdGFydCxzfHx0aGlzLmVuZCl9LHRoaXMuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0LnJvdz09PXRoaXMuZW5kLnJvdyYmdGhpcy5zdGFydC5jb2x1bW49PT10aGlzLmVuZC5jb2x1bW59LHRoaXMuaXNNdWx0aUxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydC5yb3chPT10aGlzLmVuZC5yb3d9LHRoaXMuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gaS5mcm9tUG9pbnRzKHRoaXMuc3RhcnQsdGhpcy5lbmQpfSx0aGlzLmNvbGxhcHNlUm93cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVuZC5jb2x1bW49PTA/bmV3IGkodGhpcy5zdGFydC5yb3csMCxNYXRoLm1heCh0aGlzLnN0YXJ0LnJvdyx0aGlzLmVuZC5yb3ctMSksMCk6bmV3IGkodGhpcy5zdGFydC5yb3csMCx0aGlzLmVuZC5yb3csMCl9LHRoaXMudG9TY3JlZW5SYW5nZT1mdW5jdGlvbihlKXt2YXIgdD1lLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLnN0YXJ0KSxuPWUuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuZW5kKTtyZXR1cm4gbmV3IGkodC5yb3csdC5jb2x1bW4sbi5yb3csbi5jb2x1bW4pfSx0aGlzLm1vdmVCeT1mdW5jdGlvbihlLHQpe3RoaXMuc3RhcnQucm93Kz1lLHRoaXMuc3RhcnQuY29sdW1uKz10LHRoaXMuZW5kLnJvdys9ZSx0aGlzLmVuZC5jb2x1bW4rPXR9fSkuY2FsbChpLnByb3RvdHlwZSksaS5mcm9tUG9pbnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBpKGUucm93LGUuY29sdW1uLHQucm93LHQuY29sdW1uKX0saS5jb21wYXJlUG9pbnRzPXIsaS5jb21wYXJlUG9pbnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucm93LXQucm93fHxlLmNvbHVtbi10LmNvbHVtbn0sdC5SYW5nZT1pfSksYWNlLmRlZmluZSgiYWNlL2xpYi9sYW5nIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0Lmxhc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGVbZS5sZW5ndGgtMV19LHQuc3RyaW5nUmV2ZXJzZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5zcGxpdCgiIikucmV2ZXJzZSgpLmpvaW4oIiIpfSx0LnN0cmluZ1JlcGVhdD1mdW5jdGlvbihlLHQpe3ZhciBuPSIiO3doaWxlKHQ+MCl7dCYxJiYobis9ZSk7aWYodD4+PTEpZSs9ZX1yZXR1cm4gbn07dmFyIHI9L15cc1xzKi8saT0vXHNccyokLzt0LnN0cmluZ1RyaW1MZWZ0PWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UociwiIil9LHQuc3RyaW5nVHJpbVJpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoaSwiIil9LHQuY29weU9iamVjdD1mdW5jdGlvbihlKXt2YXIgdD17fTtmb3IodmFyIG4gaW4gZSl0W25dPWVbbl07cmV0dXJuIHR9LHQuY29weUFycmF5PWZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyllW25dJiZ0eXBlb2YgZVtuXT09Im9iamVjdCI/dFtuXT10aGlzLmNvcHlPYmplY3QoZVtuXSk6dFtuXT1lW25dO3JldHVybiB0fSx0LmRlZXBDb3B5PWZ1bmN0aW9uIHMoZSl7aWYodHlwZW9mIGUhPSJvYmplY3QifHwhZSlyZXR1cm4gZTt2YXIgdDtpZihBcnJheS5pc0FycmF5KGUpKXt0PVtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXRbbl09cyhlW25dKTtyZXR1cm4gdH1pZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkhPT0iW29iamVjdCBPYmplY3RdIilyZXR1cm4gZTt0PXt9O2Zvcih2YXIgbiBpbiBlKXRbbl09cyhlW25dKTtyZXR1cm4gdH0sdC5hcnJheVRvTWFwPWZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXRbZVtuXV09MTtyZXR1cm4gdH0sdC5jcmVhdGVNYXA9ZnVuY3Rpb24oZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IodmFyIG4gaW4gZSl0W25dPWVbbl07cmV0dXJuIHR9LHQuYXJyYXlSZW1vdmU9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPD1lLmxlbmd0aDtuKyspdD09PWVbbl0mJmUuc3BsaWNlKG4sMSl9LHQuZXNjYXBlUmVnRXhwPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyhbLiorP14ke30oKXxbXF1cL1xcXSkvZywiXFwkMSIpfSx0LmVzY2FwZUhUTUw9ZnVuY3Rpb24oZSl7cmV0dXJuKCIiK2UpLnJlcGxhY2UoLyYvZywiJiMzODsiKS5yZXBsYWNlKC8iL2csIiYjMzQ7IikucmVwbGFjZSgvJy9nLCImIzM5OyIpLnJlcGxhY2UoLzwvZywiJiM2MDsiKX0sdC5nZXRNYXRjaE9mZnNldHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXTtyZXR1cm4gZS5yZXBsYWNlKHQsZnVuY3Rpb24oZSl7bi5wdXNoKHtvZmZzZXQ6YXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMl0sbGVuZ3RoOmUubGVuZ3RofSl9KSxufSx0LmRlZmVycmVkQ2FsbD1mdW5jdGlvbihlKXt2YXIgdD1udWxsLG49ZnVuY3Rpb24oKXt0PW51bGwsZSgpfSxyPWZ1bmN0aW9uKGUpe3JldHVybiByLmNhbmNlbCgpLHQ9c2V0VGltZW91dChuLGV8fDApLHJ9O3JldHVybiByLnNjaGVkdWxlPXIsci5jYWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FuY2VsKCksZSgpLHJ9LHIuY2FuY2VsPWZ1bmN0aW9uKCl7cmV0dXJuIGNsZWFyVGltZW91dCh0KSx0PW51bGwscn0sci5pc1BlbmRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0scn0sdC5kZWxheWVkQ2FsbD1mdW5jdGlvbihlLHQpe3ZhciBuPW51bGwscj1mdW5jdGlvbigpe249bnVsbCxlKCl9LGk9ZnVuY3Rpb24oZSl7bj09bnVsbCYmKG49c2V0VGltZW91dChyLGV8fHQpKX07cmV0dXJuIGkuZGVsYXk9ZnVuY3Rpb24oZSl7biYmY2xlYXJUaW1lb3V0KG4pLG49c2V0VGltZW91dChyLGV8fHQpfSxpLnNjaGVkdWxlPWksaS5jYWxsPWZ1bmN0aW9uKCl7dGhpcy5jYW5jZWwoKSxlKCl9LGkuY2FuY2VsPWZ1bmN0aW9uKCl7biYmY2xlYXJUaW1lb3V0KG4pLG49bnVsbH0saS5pc1BlbmRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gbn0saX19KSxhY2UuZGVmaW5lKCJhY2UvY2xpcGJvYXJkIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcjtuLmV4cG9ydHM9e2xpbmVNb2RlOiExLHBhc3RlQ2FuY2VsbGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHImJnI+RGF0ZS5ub3coKS01MD8hMDpyPSExfSxjYW5jZWw6ZnVuY3Rpb24oKXtyPURhdGUubm93KCl9fX0pLGFjZS5kZWZpbmUoImFjZS9rZXlib2FyZC90ZXh0aW5wdXQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi91c2VyYWdlbnQiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvbGFuZyIsImFjZS9jbGlwYm9hcmQiLCJhY2UvbGliL2tleXMiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9ldmVudCIpLGk9ZSgiLi4vbGliL3VzZXJhZ2VudCIpLHM9ZSgiLi4vbGliL2RvbSIpLG89ZSgiLi4vbGliL2xhbmciKSx1PWUoIi4uL2NsaXBib2FyZCIpLGE9aS5pc0Nocm9tZTwxOCxmPWkuaXNJRSxsPWkuaXNDaHJvbWU+NjMsYz00MDAsaD1lKCIuLi9saWIva2V5cyIpLHA9aC5LRVlfTU9EUyxkPWkuaXNJT1Msdj1kPy9ccy86L1xuLyxtPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24geigpe1M9ITAsbi5ibHVyKCksbi5mb2N1cygpLFM9ITF9ZnVuY3Rpb24gWChlKXtlLmtleUNvZGU9PTI3JiZuLnZhbHVlLmxlbmd0aDxuLnNlbGVjdGlvblN0YXJ0JiYoeXx8KHg9bi52YWx1ZSksVD1OPS0xLEwoKSksVygpfWZ1bmN0aW9uICQoKXtjbGVhclRpbWVvdXQoViksVj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dyYmKG4uc3R5bGUuY3NzVGV4dD13LHc9IiIpLHQucmVuZGVyZXIuJGlzTW91c2VQcmVzc2VkPSExLHQucmVuZGVyZXIuJGtlZXBUZXh0QXJlYUF0Q3Vyc29yJiZ0LnJlbmRlcmVyLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcigpfSwwKX1mdW5jdGlvbiBLKGUsdCxuKXt2YXIgcj1udWxsLGk9ITE7bi5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihlKXtyJiZjbGVhclRpbWVvdXQociksaT0hMH0sITApLG4uYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLGZ1bmN0aW9uKGUpe3I9c2V0VGltZW91dChmdW5jdGlvbigpe2k9ITF9LDEwMCl9LCEwKTt2YXIgcz1mdW5jdGlvbihlKXtpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09bilyZXR1cm47aWYoaXx8eXx8dC4kbW91c2VIYW5kbGVyLmlzTW91c2VQcmVzc2VkKXJldHVybjtpZihtKXJldHVybjt2YXIgcj1uLnNlbGVjdGlvblN0YXJ0LHM9bi5zZWxlY3Rpb25FbmQsbz1udWxsLHU9MDtpZihyPT0wKW89aC51cDtlbHNlIGlmKHI9PTEpbz1oLmhvbWU7ZWxzZSBpZihzPk4mJnhbc109PSJcbiIpbz1oLmVuZDtlbHNlIGlmKHI8VCYmeFtyLTFdPT0iICIpbz1oLmxlZnQsdT1wLm9wdGlvbjtlbHNlIGlmKHI8VHx8cj09VCYmTiE9VCYmcj09cylvPWgubGVmdDtlbHNlIGlmKHM+TiYmeC5zbGljZSgwLHMpLnNwbGl0KCJcbiIpLmxlbmd0aD4yKW89aC5kb3duO2Vsc2UgaWYocz5OJiZ4W3MtMV09PSIgIilvPWgucmlnaHQsdT1wLm9wdGlvbjtlbHNlIGlmKHM+Tnx8cz09TiYmTiE9VCYmcj09cylvPWgucmlnaHQ7ciE9PXMmJih1fD1wLnNoaWZ0KTtpZihvKXt2YXIgYT10Lm9uQ29tbWFuZEtleSh7fSx1LG8pO2lmKCFhJiZ0LmNvbW1hbmRzKXtvPWgua2V5Q29kZVRvU3RyaW5nKG8pO3ZhciBmPXQuY29tbWFuZHMuZmluZEtleUNvbW1hbmQodSxvKTtmJiZ0LmV4ZWNDb21tYW5kKGYpfVQ9cixOPXMsTCgiIil9fTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLHMpLHQub24oImRlc3Ryb3kiLGZ1bmN0aW9uKCl7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIixzKX0pfXZhciBuPXMuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTtuLmNsYXNzTmFtZT0iYWNlX3RleHQtaW5wdXQiLG4uc2V0QXR0cmlidXRlKCJ3cmFwIiwib2ZmIiksbi5zZXRBdHRyaWJ1dGUoImF1dG9jb3JyZWN0Iiwib2ZmIiksbi5zZXRBdHRyaWJ1dGUoImF1dG9jYXBpdGFsaXplIiwib2ZmIiksbi5zZXRBdHRyaWJ1dGUoInNwZWxsY2hlY2siLCExKSxuLnN0eWxlLm9wYWNpdHk9IjAiLGUuaW5zZXJ0QmVmb3JlKG4sZS5maXJzdENoaWxkKTt2YXIgbT0hMSxnPSExLHk9ITEsYj0hMSx3PSIiO2kuaXNNb2JpbGV8fChuLnN0eWxlLmZvbnRTaXplPSIxcHgiKTt2YXIgRT0hMSxTPSExLHg9IiIsVD0wLE49MDt0cnl7dmFyIEM9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PW59Y2F0Y2goayl7fXIuYWRkTGlzdGVuZXIobiwiYmx1ciIsZnVuY3Rpb24oZSl7aWYoUylyZXR1cm47dC5vbkJsdXIoZSksQz0hMX0pLHIuYWRkTGlzdGVuZXIobiwiZm9jdXMiLGZ1bmN0aW9uKGUpe2lmKFMpcmV0dXJuO0M9ITA7aWYoaS5pc0VkZ2UpdHJ5e2lmKCFkb2N1bWVudC5oYXNGb2N1cygpKXJldHVybn1jYXRjaChlKXt9dC5vbkZvY3VzKGUpLGkuaXNFZGdlP3NldFRpbWVvdXQoTCk6TCgpfSksdGhpcy4kZm9jdXNTY3JvbGw9ITEsdGhpcy5mb2N1cz1mdW5jdGlvbigpe2lmKHd8fGx8fHRoaXMuJGZvY3VzU2Nyb2xsPT0iYnJvd3NlciIpcmV0dXJuIG4uZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KTt2YXIgZT1uLnN0eWxlLnRvcDtuLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsbi5zdHlsZS50b3A9IjBweCI7dHJ5e3ZhciB0PW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIT0wfWNhdGNoKHIpe3JldHVybn12YXIgaT1bXTtpZih0KXt2YXIgcz1uLnBhcmVudEVsZW1lbnQ7d2hpbGUocyYmcy5ub2RlVHlwZT09MSlpLnB1c2gocykscy5zZXRBdHRyaWJ1dGUoImFjZV9ub2NvbnRleHQiLCEwKSwhcy5wYXJlbnRFbGVtZW50JiZzLmdldFJvb3ROb2RlP3M9cy5nZXRSb290Tm9kZSgpLmhvc3Q6cz1zLnBhcmVudEVsZW1lbnR9bi5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLHQmJmkuZm9yRWFjaChmdW5jdGlvbihlKXtlLnJlbW92ZUF0dHJpYnV0ZSgiYWNlX25vY29udGV4dCIpfSksc2V0VGltZW91dChmdW5jdGlvbigpe24uc3R5bGUucG9zaXRpb249IiIsbi5zdHlsZS50b3A9PSIwcHgiJiYobi5zdHlsZS50b3A9ZSl9LDApfSx0aGlzLmJsdXI9ZnVuY3Rpb24oKXtuLmJsdXIoKX0sdGhpcy5pc0ZvY3VzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gQ30sdC5vbigiYmVmb3JlRW5kT3BlcmF0aW9uIixmdW5jdGlvbigpe2lmKHQuY3VyT3AmJnQuY3VyT3AuY29tbWFuZC5uYW1lPT0iaW5zZXJ0c3RyaW5nIilyZXR1cm47eSYmKHg9bi52YWx1ZT0iIixVKCkpLEwoKX0pO3ZhciBMPWQ/ZnVuY3Rpb24oZSl7aWYoIUN8fG0mJiFlfHxiKXJldHVybjtlfHwoZT0iIik7dmFyIHI9IlxuIGFiIitlKyJjZGUgZmdcbiI7ciE9bi52YWx1ZSYmKG4udmFsdWU9eD1yKTt2YXIgaT00LHM9NCsoZS5sZW5ndGh8fCh0LnNlbGVjdGlvbi5pc0VtcHR5KCk/MDoxKSk7KFQhPWl8fE4hPXMpJiZuLnNldFNlbGVjdGlvblJhbmdlKGkscyksVD1pLE49c306ZnVuY3Rpb24oKXtpZih5fHxiKXJldHVybjtpZighQyYmIV8pcmV0dXJuO3k9ITA7dmFyIGU9dC5zZWxlY3Rpb24scj1lLmdldFJhbmdlKCksaT1lLmN1cnNvci5yb3cscz1yLnN0YXJ0LmNvbHVtbixvPXIuZW5kLmNvbHVtbix1PXQuc2Vzc2lvbi5nZXRMaW5lKGkpO2lmKHIuc3RhcnQucm93IT1pKXt2YXIgYT10LnNlc3Npb24uZ2V0TGluZShpLTEpO3M9ci5zdGFydC5yb3c8aS0xPzA6cyxvKz1hLmxlbmd0aCsxLHU9YSsiXG4iK3V9ZWxzZSBpZihyLmVuZC5yb3chPWkpe3ZhciBmPXQuc2Vzc2lvbi5nZXRMaW5lKGkrMSk7bz1yLmVuZC5yb3c+aSsxP2YubGVuZ3RoOm8sbys9dS5sZW5ndGgrMSx1PXUrIlxuIitmfXUubGVuZ3RoPmMmJihzPGMmJm88Yz91PXUuc2xpY2UoMCxjKToodT0iXG4iLHM9MCxvPTEpKTt2YXIgbD11KyJcblxuIjtsIT14JiYobi52YWx1ZT14PWwsVD1OPWwubGVuZ3RoKSxfJiYoVD1uLnNlbGVjdGlvblN0YXJ0LE49bi5zZWxlY3Rpb25FbmQpO2lmKE4hPW98fFQhPXN8fG4uc2VsZWN0aW9uRW5kIT1OKXRyeXtuLnNldFNlbGVjdGlvblJhbmdlKHMsbyksVD1zLE49b31jYXRjaChoKXt9eT0hMX07QyYmdC5vbkZvY3VzKCk7dmFyIEE9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2VsZWN0aW9uU3RhcnQ9PT0wJiZlLnNlbGVjdGlvbkVuZD49eC5sZW5ndGgmJmUudmFsdWU9PT14JiZ4JiZlLnNlbGVjdGlvbkVuZCE9PU59LE89ZnVuY3Rpb24oZSl7aWYoeSlyZXR1cm47bT9tPSExOkEobikmJih0LnNlbGVjdEFsbCgpLEwoKSl9LE09bnVsbDt0aGlzLnNldElucHV0SGFuZGxlcj1mdW5jdGlvbihlKXtNPWV9LHRoaXMuZ2V0SW5wdXRIYW5kbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIE19O3ZhciBfPSExLEQ9ZnVuY3Rpb24oZSxyKXtfJiYoXz0hMSk7aWYoZylyZXR1cm4gTCgpLGUmJnQub25QYXN0ZShlKSxnPSExLCIiO3ZhciBpPW4uc2VsZWN0aW9uU3RhcnQscz1uLnNlbGVjdGlvbkVuZCxvPVQsdT14Lmxlbmd0aC1OLGE9ZSxmPWUubGVuZ3RoLWksbD1lLmxlbmd0aC1zLGM9MDt3aGlsZShvPjAmJnhbY109PWVbY10pYysrLG8tLTthPWEuc2xpY2UoYyksYz0xO3doaWxlKHU+MCYmeC5sZW5ndGgtYz5ULTEmJnhbeC5sZW5ndGgtY109PWVbZS5sZW5ndGgtY10pYysrLHUtLTtmLT1jLTEsbC09Yy0xO3ZhciBoPWEubGVuZ3RoLWMrMTtyZXR1cm4gaDwwJiYobz0taCxoPTApLGE9YS5zbGljZSgwLGgpLCFyJiZmPT1hLmxlbmd0aCYmIW8mJiF1JiYhbD8iIjooYj0hMCxhJiYhbyYmIXUmJiFmJiYhbHx8RT90Lm9uVGV4dElucHV0KGEpOnQub25UZXh0SW5wdXQoYSx7ZXh0ZW5kTGVmdDpvLGV4dGVuZFJpZ2h0OnUscmVzdG9yZVN0YXJ0OmYscmVzdG9yZUVuZDpsfSksYj0hMSx4PWUsVD1pLE49cyxhKX0sUD1mdW5jdGlvbihlKXtpZih5KXJldHVybiBSKCk7aWYoZSYmZS5pbnB1dFR5cGUpe2lmKGUuaW5wdXRUeXBlPT0iaGlzdG9yeVVuZG8iKXJldHVybiB0LmV4ZWNDb21tYW5kKCJ1bmRvIik7aWYoZS5pbnB1dFR5cGU9PSJoaXN0b3J5UmVkbyIpcmV0dXJuIHQuZXhlY0NvbW1hbmQoInJlZG8iKX12YXIgcj1uLnZhbHVlLGk9RChyLCEwKTsoci5sZW5ndGg+YysxMDB8fHYudGVzdChpKSkmJkwoKX0sSD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5jbGlwYm9hcmREYXRhfHx3aW5kb3cuY2xpcGJvYXJkRGF0YTtpZighcnx8YSlyZXR1cm47dmFyIGk9Znx8bj8iVGV4dCI6InRleHQvcGxhaW4iO3RyeXtyZXR1cm4gdD9yLnNldERhdGEoaSx0KSE9PSExOnIuZ2V0RGF0YShpKX1jYXRjaChlKXtpZighbilyZXR1cm4gSChlLHQsITApfX0sQj1mdW5jdGlvbihlLGkpe3ZhciBzPXQuZ2V0Q29weVRleHQoKTtpZighcylyZXR1cm4gci5wcmV2ZW50RGVmYXVsdChlKTtIKGUscyk/KGQmJihMKHMpLG09cyxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bT0hMX0sMTApKSxpP3Qub25DdXQoKTp0Lm9uQ29weSgpLHIucHJldmVudERlZmF1bHQoZSkpOihtPSEwLG4udmFsdWU9cyxuLnNlbGVjdCgpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXttPSExLEwoKSxpP3Qub25DdXQoKTp0Lm9uQ29weSgpfSkpfSxqPWZ1bmN0aW9uKGUpe0IoZSwhMCl9LEY9ZnVuY3Rpb24oZSl7QihlLCExKX0sST1mdW5jdGlvbihlKXt2YXIgcz1IKGUpO2lmKHUucGFzdGVDYW5jZWxsZWQoKSlyZXR1cm47dHlwZW9mIHM9PSJzdHJpbmciPyhzJiZ0Lm9uUGFzdGUocyxlKSxpLmlzSUUmJnNldFRpbWVvdXQoTCksci5wcmV2ZW50RGVmYXVsdChlKSk6KG4udmFsdWU9IiIsZz0hMCl9O3IuYWRkQ29tbWFuZEtleUxpc3RlbmVyKG4sdC5vbkNvbW1hbmRLZXkuYmluZCh0KSksci5hZGRMaXN0ZW5lcihuLCJzZWxlY3QiLE8pLHIuYWRkTGlzdGVuZXIobiwiaW5wdXQiLFApLHIuYWRkTGlzdGVuZXIobiwiY3V0IixqKSxyLmFkZExpc3RlbmVyKG4sImNvcHkiLEYpLHIuYWRkTGlzdGVuZXIobiwicGFzdGUiLEkpLCghKCJvbmN1dCJpbiBuKXx8ISgib25jb3B5ImluIG4pfHwhKCJvbnBhc3RlImluIG4pKSYmci5hZGRMaXN0ZW5lcihlLCJrZXlkb3duIixmdW5jdGlvbihlKXtpZihpLmlzTWFjJiYhZS5tZXRhS2V5fHwhZS5jdHJsS2V5KXJldHVybjtzd2l0Y2goZS5rZXlDb2RlKXtjYXNlIDY3OkYoZSk7YnJlYWs7Y2FzZSA4NjpJKGUpO2JyZWFrO2Nhc2UgODg6aihlKX19KTt2YXIgcT1mdW5jdGlvbihlKXtpZih5fHwhdC5vbkNvbXBvc2l0aW9uU3RhcnR8fHQuJHJlYWRPbmx5KXJldHVybjt5PXt9O2lmKEUpcmV0dXJuO3NldFRpbWVvdXQoUiwwKSx0Lm9uKCJtb3VzZWRvd24iLHopO3ZhciByPXQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtyLmVuZC5yb3c9ci5zdGFydC5yb3csci5lbmQuY29sdW1uPXIuc3RhcnQuY29sdW1uLHkubWFya2VyUmFuZ2U9cix5LnNlbGVjdGlvblN0YXJ0PVQsdC5vbkNvbXBvc2l0aW9uU3RhcnQoeSkseS51c2VUZXh0YXJlYUZvcklNRT8obi52YWx1ZT0iIix4PSIiLFQ9MCxOPTApOihuLm1zR2V0SW5wdXRDb250ZXh0JiYoeS5jb250ZXh0PW4ubXNHZXRJbnB1dENvbnRleHQoKSksbi5nZXRJbnB1dENvbnRleHQmJih5LmNvbnRleHQ9bi5nZXRJbnB1dENvbnRleHQoKSkpfSxSPWZ1bmN0aW9uKCl7aWYoIXl8fCF0Lm9uQ29tcG9zaXRpb25VcGRhdGV8fHQuJHJlYWRPbmx5KXJldHVybjtpZihFKXJldHVybiB6KCk7aWYoeS51c2VUZXh0YXJlYUZvcklNRSl0Lm9uQ29tcG9zaXRpb25VcGRhdGUobi52YWx1ZSk7ZWxzZXt2YXIgZT1uLnZhbHVlO0QoZSkseS5tYXJrZXJSYW5nZSYmKHkuY29udGV4dCYmKHkubWFya2VyUmFuZ2Uuc3RhcnQuY29sdW1uPXkuc2VsZWN0aW9uU3RhcnQ9eS5jb250ZXh0LmNvbXBvc2l0aW9uU3RhcnRPZmZzZXQpLHkubWFya2VyUmFuZ2UuZW5kLmNvbHVtbj15Lm1hcmtlclJhbmdlLnN0YXJ0LmNvbHVtbitOLXkuc2VsZWN0aW9uU3RhcnQpfX0sVT1mdW5jdGlvbihlKXtpZighdC5vbkNvbXBvc2l0aW9uRW5kfHx0LiRyZWFkT25seSlyZXR1cm47eT0hMSx0Lm9uQ29tcG9zaXRpb25FbmQoKSx0Lm9mZigibW91c2Vkb3duIix6KSxlJiZQKCl9LFc9by5kZWxheWVkQ2FsbChSLDUwKS5zY2hlZHVsZS5iaW5kKG51bGwsbnVsbCk7ci5hZGRMaXN0ZW5lcihuLCJjb21wb3NpdGlvbnN0YXJ0IixxKSxyLmFkZExpc3RlbmVyKG4sImNvbXBvc2l0aW9udXBkYXRlIixSKSxyLmFkZExpc3RlbmVyKG4sImtleXVwIixYKSxyLmFkZExpc3RlbmVyKG4sImtleWRvd24iLFcpLHIuYWRkTGlzdGVuZXIobiwiY29tcG9zaXRpb25lbmQiLFUpLHRoaXMuZ2V0RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiBufSx0aGlzLnNldENvbW1hbmRNb2RlPWZ1bmN0aW9uKGUpe0U9ZSxuLnJlYWRPbmx5PSExfSx0aGlzLnNldFJlYWRPbmx5PWZ1bmN0aW9uKGUpe0V8fChuLnJlYWRPbmx5PWUpfSx0aGlzLnNldENvcHlXaXRoRW1wdHlTZWxlY3Rpb249ZnVuY3Rpb24oZSl7fSx0aGlzLm9uQ29udGV4dE1lbnU9ZnVuY3Rpb24oZSl7Xz0hMCxMKCksdC5fZW1pdCgibmF0aXZlY29udGV4dG1lbnUiLHt0YXJnZXQ6dCxkb21FdmVudDplfSksdGhpcy5tb3ZlVG9Nb3VzZShlLCEwKX0sdGhpcy5tb3ZlVG9Nb3VzZT1mdW5jdGlvbihlLG8pe3d8fCh3PW4uc3R5bGUuY3NzVGV4dCksbi5zdHlsZS5jc3NUZXh0PShvPyJ6LWluZGV4OjEwMDAwMDsiOiIiKSsoaS5pc0lFPyJvcGFjaXR5OjAuMTsiOiIiKSsidGV4dC1pbmRlbnQ6IC0iKyhUK04pKnQucmVuZGVyZXIuY2hhcmFjdGVyV2lkdGgqLjUrInB4OyI7dmFyIHU9dC5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYT1zLmNvbXB1dGVkU3R5bGUodC5jb250YWluZXIpLGY9dS50b3ArKHBhcnNlSW50KGEuYm9yZGVyVG9wV2lkdGgpfHwwKSxsPXUubGVmdCsocGFyc2VJbnQodS5ib3JkZXJMZWZ0V2lkdGgpfHwwKSxjPXUuYm90dG9tLWYtbi5jbGllbnRIZWlnaHQtMixoPWZ1bmN0aW9uKGUpe3MudHJhbnNsYXRlKG4sZS5jbGllbnRYLWwtMixNYXRoLm1pbihlLmNsaWVudFktZi0yLGMpKX07aChlKTtpZihlLnR5cGUhPSJtb3VzZWRvd24iKXJldHVybjt0LnJlbmRlcmVyLiRpc01vdXNlUHJlc3NlZD0hMCxjbGVhclRpbWVvdXQoViksaS5pc1dpbiYmci5jYXB0dXJlKHQuY29udGFpbmVyLGgsJCl9LHRoaXMub25Db250ZXh0TWVudUNsb3NlPSQ7dmFyIFYsSj1mdW5jdGlvbihlKXt0LnRleHRJbnB1dC5vbkNvbnRleHRNZW51KGUpLCQoKX07ci5hZGRMaXN0ZW5lcihuLCJtb3VzZXVwIixKKSxyLmFkZExpc3RlbmVyKG4sIm1vdXNlZG93biIsZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpLCQoKX0pLHIuYWRkTGlzdGVuZXIodC5yZW5kZXJlci5zY3JvbGxlciwiY29udGV4dG1lbnUiLEopLHIuYWRkTGlzdGVuZXIobiwiY29udGV4dG1lbnUiLEopLGQmJksoZSx0LG4pfTt0LlRleHRJbnB1dD1tfSksYWNlLmRlZmluZSgiYWNlL21vdXNlL2RlZmF1bHRfaGFuZGxlcnMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXtlLiRjbGlja1NlbGVjdGlvbj1udWxsO3ZhciB0PWUuZWRpdG9yO3Quc2V0RGVmYXVsdEhhbmRsZXIoIm1vdXNlZG93biIsdGhpcy5vbk1vdXNlRG93bi5iaW5kKGUpKSx0LnNldERlZmF1bHRIYW5kbGVyKCJkYmxjbGljayIsdGhpcy5vbkRvdWJsZUNsaWNrLmJpbmQoZSkpLHQuc2V0RGVmYXVsdEhhbmRsZXIoInRyaXBsZWNsaWNrIix0aGlzLm9uVHJpcGxlQ2xpY2suYmluZChlKSksdC5zZXREZWZhdWx0SGFuZGxlcigicXVhZGNsaWNrIix0aGlzLm9uUXVhZENsaWNrLmJpbmQoZSkpLHQuc2V0RGVmYXVsdEhhbmRsZXIoIm1vdXNld2hlZWwiLHRoaXMub25Nb3VzZVdoZWVsLmJpbmQoZSkpO3ZhciBuPVsic2VsZWN0Iiwic3RhcnRTZWxlY3QiLCJzZWxlY3RFbmQiLCJzZWxlY3RBbGxFbmQiLCJzZWxlY3RCeVdvcmRzRW5kIiwic2VsZWN0QnlMaW5lc0VuZCIsImRyYWdXYWl0IiwiZHJhZ1dhaXRFbmQiLCJmb2N1c1dhaXQiXTtuLmZvckVhY2goZnVuY3Rpb24odCl7ZVt0XT10aGlzW3RdfSx0aGlzKSxlLnNlbGVjdEJ5TGluZXM9dGhpcy5leHRlbmRTZWxlY3Rpb25CeS5iaW5kKGUsImdldExpbmVSYW5nZSIpLGUuc2VsZWN0QnlXb3Jkcz10aGlzLmV4dGVuZFNlbGVjdGlvbkJ5LmJpbmQoZSwiZ2V0V29yZFJhbmdlIil9ZnVuY3Rpb24gdShlLHQsbixyKXtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KG4tZSwyKStNYXRoLnBvdyhyLXQsMikpfWZ1bmN0aW9uIGEoZSx0KXtpZihlLnN0YXJ0LnJvdz09ZS5lbmQucm93KXZhciBuPTIqdC5jb2x1bW4tZS5zdGFydC5jb2x1bW4tZS5lbmQuY29sdW1uO2Vsc2UgaWYoZS5zdGFydC5yb3c9PWUuZW5kLnJvdy0xJiYhZS5zdGFydC5jb2x1bW4mJiFlLmVuZC5jb2x1bW4pdmFyIG49dC5jb2x1bW4tNDtlbHNlIHZhciBuPTIqdC5yb3ctZS5zdGFydC5yb3ctZS5lbmQucm93O3JldHVybiBuPDA/e2N1cnNvcjplLnN0YXJ0LGFuY2hvcjplLmVuZH06e2N1cnNvcjplLmVuZCxhbmNob3I6ZS5zdGFydH19dmFyIHI9ZSgiLi4vbGliL3VzZXJhZ2VudCIpLGk9MCxzPTU1MDsoZnVuY3Rpb24oKXt0aGlzLm9uTW91c2VEb3duPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5TZWxlY3Rpb24oKSxuPWUuZ2V0RG9jdW1lbnRQb3NpdGlvbigpO3RoaXMubW91c2Vkb3duRXZlbnQ9ZTt2YXIgaT10aGlzLmVkaXRvcixzPWUuZ2V0QnV0dG9uKCk7aWYocyE9PTApe3ZhciBvPWkuZ2V0U2VsZWN0aW9uUmFuZ2UoKSx1PW8uaXNFbXB0eSgpOyh1fHxzPT0xKSYmaS5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24obikscz09MiYmKGkudGV4dElucHV0Lm9uQ29udGV4dE1lbnUoZS5kb21FdmVudCksci5pc01vemlsbGF8fGUucHJldmVudERlZmF1bHQoKSk7cmV0dXJufXRoaXMubW91c2Vkb3duRXZlbnQudGltZT1EYXRlLm5vdygpO2lmKHQmJiFpLmlzRm9jdXNlZCgpKXtpLmZvY3VzKCk7aWYodGhpcy4kZm9jdXNUaW1lb3V0JiYhdGhpcy4kY2xpY2tTZWxlY3Rpb24mJiFpLmluTXVsdGlTZWxlY3RNb2RlKXt0aGlzLnNldFN0YXRlKCJmb2N1c1dhaXQiKSx0aGlzLmNhcHR1cmVNb3VzZShlKTtyZXR1cm59fXJldHVybiB0aGlzLmNhcHR1cmVNb3VzZShlKSx0aGlzLnN0YXJ0U2VsZWN0KG4sZS5kb21FdmVudC5fY2xpY2tzPjEpLGUucHJldmVudERlZmF1bHQoKX0sdGhpcy5zdGFydFNlbGVjdD1mdW5jdGlvbihlLHQpe2U9ZXx8dGhpcy5lZGl0b3IucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXModGhpcy54LHRoaXMueSk7dmFyIG49dGhpcy5lZGl0b3I7aWYoIXRoaXMubW91c2Vkb3duRXZlbnQpcmV0dXJuO3RoaXMubW91c2Vkb3duRXZlbnQuZ2V0U2hpZnRLZXkoKT9uLnNlbGVjdGlvbi5zZWxlY3RUb1Bvc2l0aW9uKGUpOnR8fG4uc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKGUpLHR8fHRoaXMuc2VsZWN0KCksbi5yZW5kZXJlci5zY3JvbGxlci5zZXRDYXB0dXJlJiZuLnJlbmRlcmVyLnNjcm9sbGVyLnNldENhcHR1cmUoKSxuLnNldFN0eWxlKCJhY2Vfc2VsZWN0aW5nIiksdGhpcy5zZXRTdGF0ZSgic2VsZWN0Iil9LHRoaXMuc2VsZWN0PWZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLmVkaXRvcixuPXQucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXModGhpcy54LHRoaXMueSk7aWYodGhpcy4kY2xpY2tTZWxlY3Rpb24pe3ZhciByPXRoaXMuJGNsaWNrU2VsZWN0aW9uLmNvbXBhcmVQb2ludChuKTtpZihyPT0tMSllPXRoaXMuJGNsaWNrU2VsZWN0aW9uLmVuZDtlbHNlIGlmKHI9PTEpZT10aGlzLiRjbGlja1NlbGVjdGlvbi5zdGFydDtlbHNle3ZhciBpPWEodGhpcy4kY2xpY2tTZWxlY3Rpb24sbik7bj1pLmN1cnNvcixlPWkuYW5jaG9yfXQuc2VsZWN0aW9uLnNldFNlbGVjdGlvbkFuY2hvcihlLnJvdyxlLmNvbHVtbil9dC5zZWxlY3Rpb24uc2VsZWN0VG9Qb3NpdGlvbihuKSx0LnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KCl9LHRoaXMuZXh0ZW5kU2VsZWN0aW9uQnk9ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLmVkaXRvcixyPW4ucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXModGhpcy54LHRoaXMueSksaT1uLnNlbGVjdGlvbltlXShyLnJvdyxyLmNvbHVtbik7aWYodGhpcy4kY2xpY2tTZWxlY3Rpb24pe3ZhciBzPXRoaXMuJGNsaWNrU2VsZWN0aW9uLmNvbXBhcmVQb2ludChpLnN0YXJ0KSxvPXRoaXMuJGNsaWNrU2VsZWN0aW9uLmNvbXBhcmVQb2ludChpLmVuZCk7aWYocz09LTEmJm88PTApe3Q9dGhpcy4kY2xpY2tTZWxlY3Rpb24uZW5kO2lmKGkuZW5kLnJvdyE9ci5yb3d8fGkuZW5kLmNvbHVtbiE9ci5jb2x1bW4pcj1pLnN0YXJ0fWVsc2UgaWYobz09MSYmcz49MCl7dD10aGlzLiRjbGlja1NlbGVjdGlvbi5zdGFydDtpZihpLnN0YXJ0LnJvdyE9ci5yb3d8fGkuc3RhcnQuY29sdW1uIT1yLmNvbHVtbilyPWkuZW5kfWVsc2UgaWYocz09LTEmJm89PTEpcj1pLmVuZCx0PWkuc3RhcnQ7ZWxzZXt2YXIgdT1hKHRoaXMuJGNsaWNrU2VsZWN0aW9uLHIpO3I9dS5jdXJzb3IsdD11LmFuY2hvcn1uLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25BbmNob3IodC5yb3csdC5jb2x1bW4pfW4uc2VsZWN0aW9uLnNlbGVjdFRvUG9zaXRpb24ociksbi5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpfSx0aGlzLnNlbGVjdEVuZD10aGlzLnNlbGVjdEFsbEVuZD10aGlzLnNlbGVjdEJ5V29yZHNFbmQ9dGhpcy5zZWxlY3RCeUxpbmVzRW5kPWZ1bmN0aW9uKCl7dGhpcy4kY2xpY2tTZWxlY3Rpb249bnVsbCx0aGlzLmVkaXRvci51bnNldFN0eWxlKCJhY2Vfc2VsZWN0aW5nIiksdGhpcy5lZGl0b3IucmVuZGVyZXIuc2Nyb2xsZXIucmVsZWFzZUNhcHR1cmUmJnRoaXMuZWRpdG9yLnJlbmRlcmVyLnNjcm9sbGVyLnJlbGVhc2VDYXB0dXJlKCl9LHRoaXMuZm9jdXNXYWl0PWZ1bmN0aW9uKCl7dmFyIGU9dSh0aGlzLm1vdXNlZG93bkV2ZW50LngsdGhpcy5tb3VzZWRvd25FdmVudC55LHRoaXMueCx0aGlzLnkpLHQ9RGF0ZS5ub3coKTsoZT5pfHx0LXRoaXMubW91c2Vkb3duRXZlbnQudGltZT50aGlzLiRmb2N1c1RpbWVvdXQpJiZ0aGlzLnN0YXJ0U2VsZWN0KHRoaXMubW91c2Vkb3duRXZlbnQuZ2V0RG9jdW1lbnRQb3NpdGlvbigpKX0sdGhpcy5vbkRvdWJsZUNsaWNrPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLG49dGhpcy5lZGl0b3Iscj1uLnNlc3Npb24saT1yLmdldEJyYWNrZXRSYW5nZSh0KTtpPyhpLmlzRW1wdHkoKSYmKGkuc3RhcnQuY29sdW1uLS0saS5lbmQuY29sdW1uKyspLHRoaXMuc2V0U3RhdGUoInNlbGVjdCIpKTooaT1uLnNlbGVjdGlvbi5nZXRXb3JkUmFuZ2UodC5yb3csdC5jb2x1bW4pLHRoaXMuc2V0U3RhdGUoInNlbGVjdEJ5V29yZHMiKSksdGhpcy4kY2xpY2tTZWxlY3Rpb249aSx0aGlzLnNlbGVjdCgpfSx0aGlzLm9uVHJpcGxlQ2xpY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXREb2N1bWVudFBvc2l0aW9uKCksbj10aGlzLmVkaXRvcjt0aGlzLnNldFN0YXRlKCJzZWxlY3RCeUxpbmVzIik7dmFyIHI9bi5nZXRTZWxlY3Rpb25SYW5nZSgpO3IuaXNNdWx0aUxpbmUoKSYmci5jb250YWlucyh0LnJvdyx0LmNvbHVtbik/KHRoaXMuJGNsaWNrU2VsZWN0aW9uPW4uc2VsZWN0aW9uLmdldExpbmVSYW5nZShyLnN0YXJ0LnJvdyksdGhpcy4kY2xpY2tTZWxlY3Rpb24uZW5kPW4uc2VsZWN0aW9uLmdldExpbmVSYW5nZShyLmVuZC5yb3cpLmVuZCk6dGhpcy4kY2xpY2tTZWxlY3Rpb249bi5zZWxlY3Rpb24uZ2V0TGluZVJhbmdlKHQucm93KSx0aGlzLnNlbGVjdCgpfSx0aGlzLm9uUXVhZENsaWNrPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZWRpdG9yO3Quc2VsZWN0QWxsKCksdGhpcy4kY2xpY2tTZWxlY3Rpb249dC5nZXRTZWxlY3Rpb25SYW5nZSgpLHRoaXMuc2V0U3RhdGUoInNlbGVjdEFsbCIpfSx0aGlzLm9uTW91c2VXaGVlbD1mdW5jdGlvbihlKXtpZihlLmdldEFjY2VsS2V5KCkpcmV0dXJuO2UuZ2V0U2hpZnRLZXkoKSYmZS53aGVlbFkmJiFlLndoZWVsWCYmKGUud2hlZWxYPWUud2hlZWxZLGUud2hlZWxZPTApO3ZhciB0PXRoaXMuZWRpdG9yO3RoaXMuJGxhc3RTY3JvbGx8fCh0aGlzLiRsYXN0U2Nyb2xsPXt0OjAsdng6MCx2eTowLGFsbG93ZWQ6MH0pO3ZhciBuPXRoaXMuJGxhc3RTY3JvbGwscj1lLmRvbUV2ZW50LnRpbWVTdGFtcCxpPXItbi50LG89aT9lLndoZWVsWC9pOm4udngsdT1pP2Uud2hlZWxZL2k6bi52eTtpPHMmJihvPShvK24udngpLzIsdT0odStuLnZ5KS8yKTt2YXIgYT1NYXRoLmFicyhvL3UpLGY9ITE7YT49MSYmdC5yZW5kZXJlci5pc1Njcm9sbGFibGVCeShlLndoZWVsWCplLnNwZWVkLDApJiYoZj0hMCksYTw9MSYmdC5yZW5kZXJlci5pc1Njcm9sbGFibGVCeSgwLGUud2hlZWxZKmUuc3BlZWQpJiYoZj0hMCk7aWYoZiluLmFsbG93ZWQ9cjtlbHNlIGlmKHItbi5hbGxvd2VkPHMpe3ZhciBsPU1hdGguYWJzKG8pPD0xLjUqTWF0aC5hYnMobi52eCkmJk1hdGguYWJzKHUpPD0xLjUqTWF0aC5hYnMobi52eSk7bD8oZj0hMCxuLmFsbG93ZWQ9cik6bi5hbGxvd2VkPTB9bi50PXIsbi52eD1vLG4udnk9dTtpZihmKXJldHVybiB0LnJlbmRlcmVyLnNjcm9sbEJ5KGUud2hlZWxYKmUuc3BlZWQsZS53aGVlbFkqZS5zcGVlZCksZS5zdG9wKCl9fSkuY2FsbChvLnByb3RvdHlwZSksdC5EZWZhdWx0SGFuZGxlcnM9b30pLGFjZS5kZWZpbmUoImFjZS90b29sdGlwIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcyhlKXt0aGlzLmlzT3Blbj0hMSx0aGlzLiRlbGVtZW50PW51bGwsdGhpcy4kcGFyZW50Tm9kZT1lfXZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvZG9tIik7KGZ1bmN0aW9uKCl7dGhpcy4kaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRlbGVtZW50PWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kZWxlbWVudC5jbGFzc05hbWU9ImFjZV90b29sdGlwIix0aGlzLiRlbGVtZW50LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuJHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy4kZWxlbWVudCksdGhpcy4kZWxlbWVudH0sdGhpcy5nZXRFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGVsZW1lbnR8fHRoaXMuJGluaXQoKX0sdGhpcy5zZXRUZXh0PWZ1bmN0aW9uKGUpe3RoaXMuZ2V0RWxlbWVudCgpLnRleHRDb250ZW50PWV9LHRoaXMuc2V0SHRtbD1mdW5jdGlvbihlKXt0aGlzLmdldEVsZW1lbnQoKS5pbm5lckhUTUw9ZX0sdGhpcy5zZXRQb3NpdGlvbj1mdW5jdGlvbihlLHQpe3RoaXMuZ2V0RWxlbWVudCgpLnN0eWxlLmxlZnQ9ZSsicHgiLHRoaXMuZ2V0RWxlbWVudCgpLnN0eWxlLnRvcD10KyJweCJ9LHRoaXMuc2V0Q2xhc3NOYW1lPWZ1bmN0aW9uKGUpe2kuYWRkQ3NzQ2xhc3ModGhpcy5nZXRFbGVtZW50KCksZSl9LHRoaXMuc2hvdz1mdW5jdGlvbihlLHQsbil7ZSE9bnVsbCYmdGhpcy5zZXRUZXh0KGUpLHQhPW51bGwmJm4hPW51bGwmJnRoaXMuc2V0UG9zaXRpb24odCxuKSx0aGlzLmlzT3Blbnx8KHRoaXMuZ2V0RWxlbWVudCgpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLmlzT3Blbj0hMCl9LHRoaXMuaGlkZT1mdW5jdGlvbigpe3RoaXMuaXNPcGVuJiYodGhpcy5nZXRFbGVtZW50KCkuc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5pc09wZW49ITEpfSx0aGlzLmdldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEVsZW1lbnQoKS5vZmZzZXRIZWlnaHR9LHRoaXMuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRFbGVtZW50KCkub2Zmc2V0V2lkdGh9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuaXNPcGVuPSExLHRoaXMuJGVsZW1lbnQmJnRoaXMuJGVsZW1lbnQucGFyZW50Tm9kZSYmdGhpcy4kZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuJGVsZW1lbnQpfX0pLmNhbGwocy5wcm90b3R5cGUpLHQuVG9vbHRpcD1zfSksYWNlLmRlZmluZSgiYWNlL21vdXNlL2RlZmF1bHRfZ3V0dGVyX2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudCIsImFjZS90b29sdGlwIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB1KGUpe2Z1bmN0aW9uIGwoKXt2YXIgcj11LmdldERvY3VtZW50UG9zaXRpb24oKS5yb3cscz1uLiRhbm5vdGF0aW9uc1tyXTtpZighcylyZXR1cm4gYygpO3ZhciBvPXQuc2Vzc2lvbi5nZXRMZW5ndGgoKTtpZihyPT1vKXt2YXIgYT10LnJlbmRlcmVyLnBpeGVsVG9TY3JlZW5Db29yZGluYXRlcygwLHUueSkucm93LGw9dS4kcG9zO2lmKGE+dC5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Sb3cobC5yb3csbC5jb2x1bW4pKXJldHVybiBjKCl9aWYoZj09cylyZXR1cm47Zj1zLnRleHQuam9pbigiPGJyLz4iKSxpLnNldEh0bWwoZiksaS5zaG93KCksdC5fc2lnbmFsKCJzaG93R3V0dGVyVG9vbHRpcCIsaSksdC5vbigibW91c2V3aGVlbCIsYyk7aWYoZS4kdG9vbHRpcEZvbGxvd3NNb3VzZSloKHUpO2Vsc2V7dmFyIHA9dS5kb21FdmVudC50YXJnZXQsZD1wLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHY9aS5nZXRFbGVtZW50KCkuc3R5bGU7di5sZWZ0PWQucmlnaHQrInB4Iix2LnRvcD1kLmJvdHRvbSsicHgifX1mdW5jdGlvbiBjKCl7byYmKG89Y2xlYXJUaW1lb3V0KG8pKSxmJiYoaS5oaWRlKCksZj1udWxsLHQuX3NpZ25hbCgiaGlkZUd1dHRlclRvb2x0aXAiLGkpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V3aGVlbCIsYykpfWZ1bmN0aW9uIGgoZSl7aS5zZXRQb3NpdGlvbihlLngsZS55KX12YXIgdD1lLmVkaXRvcixuPXQucmVuZGVyZXIuJGd1dHRlckxheWVyLGk9bmV3IGEodC5jb250YWluZXIpO2UuZWRpdG9yLnNldERlZmF1bHRIYW5kbGVyKCJndXR0ZXJtb3VzZWRvd24iLGZ1bmN0aW9uKHIpe2lmKCF0LmlzRm9jdXNlZCgpfHxyLmdldEJ1dHRvbigpIT0wKXJldHVybjt2YXIgaT1uLmdldFJlZ2lvbihyKTtpZihpPT0iZm9sZFdpZGdldHMiKXJldHVybjt2YXIgcz1yLmdldERvY3VtZW50UG9zaXRpb24oKS5yb3csbz10LnNlc3Npb24uc2VsZWN0aW9uO2lmKHIuZ2V0U2hpZnRLZXkoKSlvLnNlbGVjdFRvKHMsMCk7ZWxzZXtpZihyLmRvbUV2ZW50LmRldGFpbD09MilyZXR1cm4gdC5zZWxlY3RBbGwoKSxyLnByZXZlbnREZWZhdWx0KCk7ZS4kY2xpY2tTZWxlY3Rpb249dC5zZWxlY3Rpb24uZ2V0TGluZVJhbmdlKHMpfXJldHVybiBlLnNldFN0YXRlKCJzZWxlY3RCeUxpbmVzIiksZS5jYXB0dXJlTW91c2Uociksci5wcmV2ZW50RGVmYXVsdCgpfSk7dmFyIG8sdSxmO2UuZWRpdG9yLnNldERlZmF1bHRIYW5kbGVyKCJndXR0ZXJtb3VzZW1vdmUiLGZ1bmN0aW9uKHQpe3ZhciBuPXQuZG9tRXZlbnQudGFyZ2V0fHx0LmRvbUV2ZW50LnNyY0VsZW1lbnQ7aWYoci5oYXNDc3NDbGFzcyhuLCJhY2VfZm9sZC13aWRnZXQiKSlyZXR1cm4gYygpO2YmJmUuJHRvb2x0aXBGb2xsb3dzTW91c2UmJmgodCksdT10O2lmKG8pcmV0dXJuO289c2V0VGltZW91dChmdW5jdGlvbigpe289bnVsbCx1JiYhZS5pc01vdXNlUHJlc3NlZD9sKCk6YygpfSw1MCl9KSxzLmFkZExpc3RlbmVyKHQucmVuZGVyZXIuJGd1dHRlciwibW91c2VvdXQiLGZ1bmN0aW9uKGUpe3U9bnVsbDtpZighZnx8bylyZXR1cm47bz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bz1udWxsLGMoKX0sNTApfSksdC5vbigiY2hhbmdlU2Vzc2lvbiIsYyl9ZnVuY3Rpb24gYShlKXtvLmNhbGwodGhpcyxlKX12YXIgcj1lKCIuLi9saWIvZG9tIiksaT1lKCIuLi9saWIvb29wIikscz1lKCIuLi9saWIvZXZlbnQiKSxvPWUoIi4uL3Rvb2x0aXAiKS5Ub29sdGlwO2kuaW5oZXJpdHMoYSxvKSxmdW5jdGlvbigpe3RoaXMuc2V0UG9zaXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj13aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLHI9d2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LGk9dGhpcy5nZXRXaWR0aCgpLHM9dGhpcy5nZXRIZWlnaHQoKTtlKz0xNSx0Kz0xNSxlK2k+biYmKGUtPWUraS1uKSx0K3M+ciYmKHQtPTIwK3MpLG8ucHJvdG90eXBlLnNldFBvc2l0aW9uLmNhbGwodGhpcyxlLHQpfX0uY2FsbChhLnByb3RvdHlwZSksdC5HdXR0ZXJIYW5kbGVyPXV9KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvbW91c2VfZXZlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9ldmVudCIpLGk9ZSgiLi4vbGliL3VzZXJhZ2VudCIpLHM9dC5Nb3VzZUV2ZW50PWZ1bmN0aW9uKGUsdCl7dGhpcy5kb21FdmVudD1lLHRoaXMuZWRpdG9yPXQsdGhpcy54PXRoaXMuY2xpZW50WD1lLmNsaWVudFgsdGhpcy55PXRoaXMuY2xpZW50WT1lLmNsaWVudFksdGhpcy4kcG9zPW51bGwsdGhpcy4kaW5TZWxlY3Rpb249bnVsbCx0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZD0hMSx0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITF9OyhmdW5jdGlvbigpe3RoaXMuc3RvcFByb3BhZ2F0aW9uPWZ1bmN0aW9uKCl7ci5zdG9wUHJvcGFnYXRpb24odGhpcy5kb21FdmVudCksdGhpcy5wcm9wYWdhdGlvblN0b3BwZWQ9ITB9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXtyLnByZXZlbnREZWZhdWx0KHRoaXMuZG9tRXZlbnQpLHRoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH0sdGhpcy5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnByZXZlbnREZWZhdWx0KCl9LHRoaXMuZ2V0RG9jdW1lbnRQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRwb3M/dGhpcy4kcG9zOih0aGlzLiRwb3M9dGhpcy5lZGl0b3IucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXModGhpcy5jbGllbnRYLHRoaXMuY2xpZW50WSksdGhpcy4kcG9zKX0sdGhpcy5pblNlbGVjdGlvbj1mdW5jdGlvbigpe2lmKHRoaXMuJGluU2VsZWN0aW9uIT09bnVsbClyZXR1cm4gdGhpcy4kaW5TZWxlY3Rpb247dmFyIGU9dGhpcy5lZGl0b3IsdD1lLmdldFNlbGVjdGlvblJhbmdlKCk7aWYodC5pc0VtcHR5KCkpdGhpcy4kaW5TZWxlY3Rpb249ITE7ZWxzZXt2YXIgbj10aGlzLmdldERvY3VtZW50UG9zaXRpb24oKTt0aGlzLiRpblNlbGVjdGlvbj10LmNvbnRhaW5zKG4ucm93LG4uY29sdW1uKX1yZXR1cm4gdGhpcy4kaW5TZWxlY3Rpb259LHRoaXMuZ2V0QnV0dG9uPWZ1bmN0aW9uKCl7cmV0dXJuIHIuZ2V0QnV0dG9uKHRoaXMuZG9tRXZlbnQpfSx0aGlzLmdldFNoaWZ0S2V5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tRXZlbnQuc2hpZnRLZXl9LHRoaXMuZ2V0QWNjZWxLZXk9aS5pc01hYz9mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbUV2ZW50Lm1ldGFLZXl9OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tRXZlbnQuY3RybEtleX19KS5jYWxsKHMucHJvdG90eXBlKX0pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS9kcmFnZHJvcF9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGYoZSl7ZnVuY3Rpb24gVChlLG4pe3ZhciByPURhdGUubm93KCksaT0hbnx8ZS5yb3chPW4ucm93LHM9IW58fGUuY29sdW1uIT1uLmNvbHVtbjtpZighU3x8aXx8cyl0Lm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGUpLFM9cix4PXt4OnAseTpkfTtlbHNle3ZhciBvPWwoeC54LHgueSxwLGQpO28+YT9TPW51bGw6ci1TPj11JiYodC5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpLFM9bnVsbCl9fWZ1bmN0aW9uIE4oZSxuKXt2YXIgcj1EYXRlLm5vdygpLGk9dC5yZW5kZXJlci5sYXllckNvbmZpZy5saW5lSGVpZ2h0LHM9dC5yZW5kZXJlci5sYXllckNvbmZpZy5jaGFyYWN0ZXJXaWR0aCx1PXQucmVuZGVyZXIuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYT17eDp7bGVmdDpwLXUubGVmdCxyaWdodDp1LnJpZ2h0LXB9LHk6e3RvcDpkLXUudG9wLGJvdHRvbTp1LmJvdHRvbS1kfX0sZj1NYXRoLm1pbihhLngubGVmdCxhLngucmlnaHQpLGw9TWF0aC5taW4oYS55LnRvcCxhLnkuYm90dG9tKSxjPXtyb3c6ZS5yb3csY29sdW1uOmUuY29sdW1ufTtmL3M8PTImJihjLmNvbHVtbis9YS54LmxlZnQ8YS54LnJpZ2h0Py0zOjIpLGwvaTw9MSYmKGMucm93Kz1hLnkudG9wPGEueS5ib3R0b20/LTE6MSk7dmFyIGg9ZS5yb3chPWMucm93LHY9ZS5jb2x1bW4hPWMuY29sdW1uLG09IW58fGUucm93IT1uLnJvdztofHx2JiYhbT9FP3ItRT49byYmdC5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyhjKTpFPXI6RT1udWxsfWZ1bmN0aW9uIEMoKXt2YXIgZT1nO2c9dC5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyhwLGQpLFQoZyxlKSxOKGcsZSl9ZnVuY3Rpb24gaygpe209dC5zZWxlY3Rpb24udG9PcmllbnRlZFJhbmdlKCksaD10LnNlc3Npb24uYWRkTWFya2VyKG0sImFjZV9zZWxlY3Rpb24iLHQuZ2V0U2VsZWN0aW9uU3R5bGUoKSksdC5jbGVhclNlbGVjdGlvbigpLHQuaXNGb2N1c2VkKCkmJnQucmVuZGVyZXIuJGN1cnNvckxheWVyLnNldEJsaW5raW5nKCExKSxjbGVhckludGVydmFsKHYpLEMoKSx2PXNldEludGVydmFsKEMsMjApLHk9MCxpLmFkZExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLE8pfWZ1bmN0aW9uIEwoKXtjbGVhckludGVydmFsKHYpLHQuc2Vzc2lvbi5yZW1vdmVNYXJrZXIoaCksaD1udWxsLHQuc2VsZWN0aW9uLmZyb21PcmllbnRlZFJhbmdlKG0pLHQuaXNGb2N1c2VkKCkmJiF3JiZ0LiRyZXNldEN1cnNvclN0eWxlKCksbT1udWxsLGc9bnVsbCx5PTAsRT1udWxsLFM9bnVsbCxpLnJlbW92ZUxpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLE8pfWZ1bmN0aW9uIE8oKXtBPT1udWxsJiYoQT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7QSE9bnVsbCYmaCYmTCgpfSwyMCkpfWZ1bmN0aW9uIE0oZSl7dmFyIHQ9ZS50eXBlcztyZXR1cm4hdHx8QXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbCh0LGZ1bmN0aW9uKGUpe3JldHVybiBlPT0idGV4dC9wbGFpbiJ8fGU9PSJUZXh0In0pfWZ1bmN0aW9uIF8oZSl7dmFyIHQ9WyJjb3B5IiwiY29weW1vdmUiLCJhbGwiLCJ1bmluaXRpYWxpemVkIl0sbj1bIm1vdmUiLCJjb3B5bW92ZSIsImxpbmttb3ZlIiwiYWxsIiwidW5pbml0aWFsaXplZCJdLHI9cy5pc01hYz9lLmFsdEtleTplLmN0cmxLZXksaT0idW5pbml0aWFsaXplZCI7dHJ5e2k9ZS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZC50b0xvd2VyQ2FzZSgpfWNhdGNoKGUpe312YXIgbz0ibm9uZSI7cmV0dXJuIHImJnQuaW5kZXhPZihpKT49MD9vPSJjb3B5IjpuLmluZGV4T2YoaSk+PTA/bz0ibW92ZSI6dC5pbmRleE9mKGkpPj0wJiYobz0iY29weSIpLG99dmFyIHQ9ZS5lZGl0b3Isbj1yLmNyZWF0ZUVsZW1lbnQoImltZyIpO24uc3JjPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFBQUFDSDVCQUVLQUFFQUxBQUFBQUFCQUFFQUFBSUNUQUVBT3c9PSIscy5pc09wZXJhJiYobi5zdHlsZS5jc3NUZXh0PSJ3aWR0aDoxcHg7aGVpZ2h0OjFweDtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7ei1pbmRleDoyMTQ3NDgzNjQ3O29wYWNpdHk6MDsiKTt2YXIgZj1bImRyYWdXYWl0IiwiZHJhZ1dhaXRFbmQiLCJzdGFydERyYWciLCJkcmFnUmVhZHlFbmQiLCJvbk1vdXNlRHJhZyJdO2YuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPXRoaXNbdF19LHRoaXMpLHQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLm9uTW91c2VEb3duLmJpbmQoZSkpO3ZhciBjPXQuY29udGFpbmVyLGgscCxkLHYsbSxnLHk9MCxiLHcsRSxTLHg7dGhpcy5vbkRyYWdTdGFydD1mdW5jdGlvbihlKXtpZih0aGlzLmNhbmNlbERyYWd8fCFjLmRyYWdnYWJsZSl7dmFyIHI9dGhpcztyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe3Iuc3RhcnRTZWxlY3QoKSxyLmNhcHR1cmVNb3VzZShlKX0sMCksZS5wcmV2ZW50RGVmYXVsdCgpfW09dC5nZXRTZWxlY3Rpb25SYW5nZSgpO3ZhciBpPWUuZGF0YVRyYW5zZmVyO2kuZWZmZWN0QWxsb3dlZD10LmdldFJlYWRPbmx5KCk/ImNvcHkiOiJjb3B5TW92ZSIscy5pc09wZXJhJiYodC5jb250YWluZXIuYXBwZW5kQ2hpbGQobiksbi5zY3JvbGxUb3A9MCksaS5zZXREcmFnSW1hZ2UmJmkuc2V0RHJhZ0ltYWdlKG4sMCwwKSxzLmlzT3BlcmEmJnQuY29udGFpbmVyLnJlbW92ZUNoaWxkKG4pLGkuY2xlYXJEYXRhKCksaS5zZXREYXRhKCJUZXh0Iix0LnNlc3Npb24uZ2V0VGV4dFJhbmdlKCkpLHc9ITAsdGhpcy5zZXRTdGF0ZSgiZHJhZyIpfSx0aGlzLm9uRHJhZ0VuZD1mdW5jdGlvbihlKXtjLmRyYWdnYWJsZT0hMSx3PSExLHRoaXMuc2V0U3RhdGUobnVsbCk7aWYoIXQuZ2V0UmVhZE9ubHkoKSl7dmFyIG49ZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdDshYiYmbj09Im1vdmUiJiZ0LnNlc3Npb24ucmVtb3ZlKHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdC4kcmVzZXRDdXJzb3JTdHlsZSgpfXRoaXMuZWRpdG9yLnVuc2V0U3R5bGUoImFjZV9kcmFnZ2luZyIpLHRoaXMuZWRpdG9yLnJlbmRlcmVyLnNldEN1cnNvclN0eWxlKCIiKX0sdGhpcy5vbkRyYWdFbnRlcj1mdW5jdGlvbihlKXtpZih0LmdldFJlYWRPbmx5KCl8fCFNKGUuZGF0YVRyYW5zZmVyKSlyZXR1cm47cmV0dXJuIHA9ZS5jbGllbnRYLGQ9ZS5jbGllbnRZLGh8fGsoKSx5KyssZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdD1iPV8oZSksaS5wcmV2ZW50RGVmYXVsdChlKX0sdGhpcy5vbkRyYWdPdmVyPWZ1bmN0aW9uKGUpe2lmKHQuZ2V0UmVhZE9ubHkoKXx8IU0oZS5kYXRhVHJhbnNmZXIpKXJldHVybjtyZXR1cm4gcD1lLmNsaWVudFgsZD1lLmNsaWVudFksaHx8KGsoKSx5KyspLEEhPT1udWxsJiYoQT1udWxsKSxlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0PWI9XyhlKSxpLnByZXZlbnREZWZhdWx0KGUpfSx0aGlzLm9uRHJhZ0xlYXZlPWZ1bmN0aW9uKGUpe3ktLTtpZih5PD0wJiZoKXJldHVybiBMKCksYj1udWxsLGkucHJldmVudERlZmF1bHQoZSl9LHRoaXMub25Ecm9wPWZ1bmN0aW9uKGUpe2lmKCFnKXJldHVybjt2YXIgbj1lLmRhdGFUcmFuc2ZlcjtpZih3KXN3aXRjaChiKXtjYXNlIm1vdmUiOm0uY29udGFpbnMoZy5yb3csZy5jb2x1bW4pP209e3N0YXJ0OmcsZW5kOmd9Om09dC5tb3ZlVGV4dChtLGcpO2JyZWFrO2Nhc2UiY29weSI6bT10Lm1vdmVUZXh0KG0sZywhMCl9ZWxzZXt2YXIgcj1uLmdldERhdGEoIlRleHQiKTttPXtzdGFydDpnLGVuZDp0LnNlc3Npb24uaW5zZXJ0KGcscil9LHQuZm9jdXMoKSxiPW51bGx9cmV0dXJuIEwoKSxpLnByZXZlbnREZWZhdWx0KGUpfSxpLmFkZExpc3RlbmVyKGMsImRyYWdzdGFydCIsdGhpcy5vbkRyYWdTdGFydC5iaW5kKGUpKSxpLmFkZExpc3RlbmVyKGMsImRyYWdlbmQiLHRoaXMub25EcmFnRW5kLmJpbmQoZSkpLGkuYWRkTGlzdGVuZXIoYywiZHJhZ2VudGVyIix0aGlzLm9uRHJhZ0VudGVyLmJpbmQoZSkpLGkuYWRkTGlzdGVuZXIoYywiZHJhZ292ZXIiLHRoaXMub25EcmFnT3Zlci5iaW5kKGUpKSxpLmFkZExpc3RlbmVyKGMsImRyYWdsZWF2ZSIsdGhpcy5vbkRyYWdMZWF2ZS5iaW5kKGUpKSxpLmFkZExpc3RlbmVyKGMsImRyb3AiLHRoaXMub25Ecm9wLmJpbmQoZSkpO3ZhciBBPW51bGx9ZnVuY3Rpb24gbChlLHQsbixyKXtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KG4tZSwyKStNYXRoLnBvdyhyLXQsMikpfXZhciByPWUoIi4uL2xpYi9kb20iKSxpPWUoIi4uL2xpYi9ldmVudCIpLHM9ZSgiLi4vbGliL3VzZXJhZ2VudCIpLG89MjAwLHU9MjAwLGE9NTsoZnVuY3Rpb24oKXt0aGlzLmRyYWdXYWl0PWZ1bmN0aW9uKCl7dmFyIGU9RGF0ZS5ub3coKS10aGlzLm1vdXNlZG93bkV2ZW50LnRpbWU7ZT50aGlzLmVkaXRvci5nZXREcmFnRGVsYXkoKSYmdGhpcy5zdGFydERyYWcoKX0sdGhpcy5kcmFnV2FpdEVuZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZWRpdG9yLmNvbnRhaW5lcjtlLmRyYWdnYWJsZT0hMSx0aGlzLnN0YXJ0U2VsZWN0KHRoaXMubW91c2Vkb3duRXZlbnQuZ2V0RG9jdW1lbnRQb3NpdGlvbigpKSx0aGlzLnNlbGVjdEVuZCgpfSx0aGlzLmRyYWdSZWFkeUVuZD1mdW5jdGlvbihlKXt0aGlzLmVkaXRvci4kcmVzZXRDdXJzb3JTdHlsZSgpLHRoaXMuZWRpdG9yLnVuc2V0U3R5bGUoImFjZV9kcmFnZ2luZyIpLHRoaXMuZWRpdG9yLnJlbmRlcmVyLnNldEN1cnNvclN0eWxlKCIiKSx0aGlzLmRyYWdXYWl0RW5kKCl9LHRoaXMuc3RhcnREcmFnPWZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxEcmFnPSExO3ZhciBlPXRoaXMuZWRpdG9yLHQ9ZS5jb250YWluZXI7dC5kcmFnZ2FibGU9ITAsZS5yZW5kZXJlci4kY3Vyc29yTGF5ZXIuc2V0QmxpbmtpbmcoITEpLGUuc2V0U3R5bGUoImFjZV9kcmFnZ2luZyIpO3ZhciBuPXMuaXNXaW4/ImRlZmF1bHQiOiJtb3ZlIjtlLnJlbmRlcmVyLnNldEN1cnNvclN0eWxlKG4pLHRoaXMuc2V0U3RhdGUoImRyYWdSZWFkeSIpfSx0aGlzLm9uTW91c2VEcmFnPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZWRpdG9yLmNvbnRhaW5lcjtpZihzLmlzSUUmJnRoaXMuc3RhdGU9PSJkcmFnUmVhZHkiKXt2YXIgbj1sKHRoaXMubW91c2Vkb3duRXZlbnQueCx0aGlzLm1vdXNlZG93bkV2ZW50LnksdGhpcy54LHRoaXMueSk7bj4zJiZ0LmRyYWdEcm9wKCl9aWYodGhpcy5zdGF0ZT09PSJkcmFnV2FpdCIpe3ZhciBuPWwodGhpcy5tb3VzZWRvd25FdmVudC54LHRoaXMubW91c2Vkb3duRXZlbnQueSx0aGlzLngsdGhpcy55KTtuPjAmJih0LmRyYWdnYWJsZT0hMSx0aGlzLnN0YXJ0U2VsZWN0KHRoaXMubW91c2Vkb3duRXZlbnQuZ2V0RG9jdW1lbnRQb3NpdGlvbigpKSl9fSx0aGlzLm9uTW91c2VEb3duPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLiRkcmFnRW5hYmxlZClyZXR1cm47dGhpcy5tb3VzZWRvd25FdmVudD1lO3ZhciB0PXRoaXMuZWRpdG9yLG49ZS5pblNlbGVjdGlvbigpLHI9ZS5nZXRCdXR0b24oKSxpPWUuZG9tRXZlbnQuZGV0YWlsfHwxO2lmKGk9PT0xJiZyPT09MCYmbil7aWYoZS5lZGl0b3IuaW5NdWx0aVNlbGVjdE1vZGUmJihlLmdldEFjY2VsS2V5KCl8fGUuZ2V0U2hpZnRLZXkoKSkpcmV0dXJuO3RoaXMubW91c2Vkb3duRXZlbnQudGltZT1EYXRlLm5vdygpO3ZhciBvPWUuZG9tRXZlbnQudGFyZ2V0fHxlLmRvbUV2ZW50LnNyY0VsZW1lbnQ7InVuc2VsZWN0YWJsZSJpbiBvJiYoby51bnNlbGVjdGFibGU9Im9uIik7aWYodC5nZXREcmFnRGVsYXkoKSl7aWYocy5pc1dlYktpdCl7dGhpcy5jYW5jZWxEcmFnPSEwO3ZhciB1PXQuY29udGFpbmVyO3UuZHJhZ2dhYmxlPSEwfXRoaXMuc2V0U3RhdGUoImRyYWdXYWl0Iil9ZWxzZSB0aGlzLnN0YXJ0RHJhZygpO3RoaXMuY2FwdHVyZU1vdXNlKGUsdGhpcy5vbk1vdXNlRHJhZy5iaW5kKHRoaXMpKSxlLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9fX0pLmNhbGwoZi5wcm90b3R5cGUpLHQuRHJhZ2Ryb3BIYW5kbGVyPWZ9KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvdG91Y2hfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9tb3VzZS9tb3VzZV9ldmVudCIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL21vdXNlX2V2ZW50IikuTW91c2VFdmVudCxpPWUoIi4uL2xpYi9kb20iKTt0LmFkZFRvdWNoTGlzdGVuZXJzPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24geSgpe3ZhciBlPXdpbmRvdy5uYXZpZ2F0b3ImJndpbmRvdy5uYXZpZ2F0b3IuY2xpcGJvYXJkLHI9ITEscz1mdW5jdGlvbigpe3ZhciBuPXQuZ2V0Q29weVRleHQoKSxzPXQuc2Vzc2lvbi5nZXRVbmRvTWFuYWdlcigpLmhhc1VuZG8oKTtnLnJlcGxhY2VDaGlsZChpLmJ1aWxkRG9tKHI/WyJzcGFuIiwhbiYmWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoic2VsZWN0YWxsIn0sIlNlbGVjdCBBbGwiXSxuJiZbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJjb3B5In0sIkNvcHkiXSxuJiZbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJjdXQifSwiQ3V0Il0sZSYmWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoicGFzdGUifSwiUGFzdGUiXSxzJiZbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJ1bmRvIn0sIlVuZG8iXSxbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJmaW5kIn0sIkZpbmQiXSxbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJvcGVuQ29tbWFuZFBhbGxldGUifSwiUGFsbGV0ZSJdXTpbInNwYW4iXSksZy5maXJzdENoaWxkKX0sbz1mdW5jdGlvbihuKXt2YXIgaT1uLnRhcmdldC5nZXRBdHRyaWJ1dGUoImFjdGlvbiIpO2lmKGk9PSJtb3JlInx8IXIpcmV0dXJuIHI9IXIscygpO2lmKGk9PSJwYXN0ZSIpZS5yZWFkVGV4dCgpLnRoZW4oZnVuY3Rpb24oZSl7dC5leGVjQ29tbWFuZChpLGUpfSk7ZWxzZSBpZihpKXtpZihpPT0iY3V0Inx8aT09ImNvcHkiKWU/ZS53cml0ZVRleHQodC5nZXRDb3B5VGV4dCgpKTpkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpO3QuZXhlY0NvbW1hbmQoaSl9Zy5maXJzdENoaWxkLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHI9ITEsaSE9Im9wZW5Db21tYW5kUGFsbGV0ZSImJnQuZm9jdXMoKX07Zz1pLmJ1aWxkRG9tKFsiZGl2Iix7ImNsYXNzIjoiYWNlX21vYmlsZS1tZW51IixvbnRvdWNoc3RhcnQ6ZnVuY3Rpb24oZSl7bj0ibWVudSIsZS5zdG9wUHJvcGFnYXRpb24oKSxlLnByZXZlbnREZWZhdWx0KCksdC50ZXh0SW5wdXQuZm9jdXMoKX0sb250b3VjaGVuZDpmdW5jdGlvbihlKXtlLnN0b3BQcm9wYWdhdGlvbigpLGUucHJldmVudERlZmF1bHQoKSxvKGUpfSxvbmNsaWNrOm99LFsic3BhbiJdLFsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246Im1vcmUifSwiLi4uIl1dLHQuY29udGFpbmVyKX1mdW5jdGlvbiBiKCl7Z3x8eSgpO3ZhciBlPXQuc2VsZWN0aW9uLmN1cnNvcixuPXQucmVuZGVyZXIudGV4dFRvU2NyZWVuQ29vcmRpbmF0ZXMoZS5yb3csZS5jb2x1bW4pLHI9dC5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Zy5zdHlsZS50b3A9bi5wYWdlWS1yLnRvcC0zKyJweCIsZy5zdHlsZS5yaWdodD0iMTBweCIsZy5zdHlsZS5kaXNwbGF5PSIiLGcuZmlyc3RDaGlsZC5zdHlsZS5kaXNwbGF5PSJub25lIix0Lm9uKCJpbnB1dCIsdyl9ZnVuY3Rpb24gdyhlKXtnJiYoZy5zdHlsZS5kaXNwbGF5PSJub25lIiksdC5vZmYoImlucHV0Iix3KX1mdW5jdGlvbiBFKCl7Zj1udWxsLGNsZWFyVGltZW91dChmKTt2YXIgZT10LnNlbGVjdGlvbi5nZXRSYW5nZSgpLHI9ZS5jb250YWlucyhoLnJvdyxoLmNvbHVtbik7aWYoZS5pc0VtcHR5KCl8fCFyKXQuc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKGgpLHQuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKTtuPSJ3YWl0IixiKCl9ZnVuY3Rpb24gUygpe2Y9bnVsbCxjbGVhclRpbWVvdXQoZiksdC5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24oaCk7dmFyIGU9cD49Mj90LnNlbGVjdGlvbi5nZXRMaW5lUmFuZ2UoaC5yb3cpOnQuc2Vzc2lvbi5nZXRCcmFja2V0UmFuZ2UoaCk7ZSYmIWUuaXNFbXB0eSgpP3Quc2VsZWN0aW9uLnNldFJhbmdlKGUpOnQuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKSxuPSJ3YWl0In1mdW5jdGlvbiB4KCl7Yys9NjAsbD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2MtLTw9MCYmKGNsZWFySW50ZXJ2YWwobCksbD1udWxsKSxNYXRoLmFicyhkKTwuMDEmJihkPTApLE1hdGguYWJzKHYpPC4wMSYmKHY9MCksYzwyMCYmKGQ9LjkqZCksYzwyMCYmKHY9Ljkqdik7dmFyIGU9dC5zZXNzaW9uLmdldFNjcm9sbFRvcCgpO3QucmVuZGVyZXIuc2Nyb2xsQnkoMTAqZCwxMCp2KSxlPT10LnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkmJihjPTApfSwxMCl9dmFyIG49InNjcm9sbCIscyxvLHUsYSxmLGwsYz0wLGgscD0wLGQ9MCx2PTAsbSxnO2UuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLGZ1bmN0aW9uKGUpe2lmKCFtKXJldHVybjt2YXIgbj10LnRleHRJbnB1dC5nZXRFbGVtZW50KCk7bi5mb2N1cygpfSksZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbihlKXt2YXIgaT1lLnRvdWNoZXM7aWYoZnx8aS5sZW5ndGg+MSl7Y2xlYXJUaW1lb3V0KGYpLGY9bnVsbCx1PS0xLG49Inpvb20iO3JldHVybn1tPXQuJG1vdXNlSGFuZGxlci5pc01vdXNlUHJlc3NlZD0hMDt2YXIgbD10LnJlbmRlcmVyLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQsZz10LnJlbmRlcmVyLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQseT1lLnRpbWVTdGFtcDthPXk7dmFyIGI9aVswXSx3PWIuY2xpZW50WCx4PWIuY2xpZW50WTtNYXRoLmFicyhzLXcpK01hdGguYWJzKG8teCk+bCYmKHU9LTEpLHM9ZS5jbGllbnRYPXcsbz1lLmNsaWVudFk9eCxkPXY9MDt2YXIgVD1uZXcgcihlLHQpO2g9VC5nZXREb2N1bWVudFBvc2l0aW9uKCk7aWYoeS11PDUwMCYmaS5sZW5ndGg9PTEmJiFjKXArKyxlLnByZXZlbnREZWZhdWx0KCksZS5idXR0b249MCxTKCk7ZWxzZXtwPTA7dmFyIE49dC5zZWxlY3Rpb24uY3Vyc29yLEM9dC5zZWxlY3Rpb24uaXNFbXB0eSgpP046dC5zZWxlY3Rpb24uYW5jaG9yLGs9dC5yZW5kZXJlci4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbihOLCEwKSxMPXQucmVuZGVyZXIuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oQywhMCksQT10LnJlbmRlcmVyLnNjcm9sbGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLE89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS89Zyx0PXQvbC0uNzUsZSplK3QqdH07aWYoZS5jbGllbnRYPEEubGVmdCl7bj0iem9vbSI7cmV0dXJufXZhciBNPU8oZS5jbGllbnRYLUEubGVmdC1rLmxlZnQsZS5jbGllbnRZLUEudG9wLWsudG9wKSxfPU8oZS5jbGllbnRYLUEubGVmdC1MLmxlZnQsZS5jbGllbnRZLUEudG9wLUwudG9wKTtNPDMuNSYmXzwzLjUmJihuPU0+Xz8iY3Vyc29yIjoiYW5jaG9yIiksXzwzLjU/bj0iYW5jaG9yIjpNPDMuNT9uPSJjdXJzb3IiOm49InNjcm9sbCIsZj1zZXRUaW1lb3V0KEUsNDUwKX11PXl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixmdW5jdGlvbihlKXttPXQuJG1vdXNlSGFuZGxlci5pc01vdXNlUHJlc3NlZD0hMSxsJiZjbGVhckludGVydmFsKGwpLG49PSJ6b29tIj8obj0iIixjPTApOmY/KHQuc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKGgpLGM9MCxiKCkpOm49PSJzY3JvbGwiPyh4KCksZS5wcmV2ZW50RGVmYXVsdCgpLHcoKSk6YigpLGNsZWFyVGltZW91dChmKSxmPW51bGx9KSxlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsZnVuY3Rpb24oZSl7ZiYmKGNsZWFyVGltZW91dChmKSxmPW51bGwpO3ZhciBpPWUudG91Y2hlcztpZihpLmxlbmd0aD4xfHxuPT0iem9vbSIpcmV0dXJuO3ZhciB1PWlbMF0sbD1zLXUuY2xpZW50WCxjPW8tdS5jbGllbnRZO2lmKG49PSJ3YWl0Iil7aWYoIShsKmwrYypjPjQpKXJldHVybiBlLnByZXZlbnREZWZhdWx0KCk7bj0iY3Vyc29yIn1zPXUuY2xpZW50WCxvPXUuY2xpZW50WSxlLmNsaWVudFg9dS5jbGllbnRYLGUuY2xpZW50WT11LmNsaWVudFk7dmFyIGg9ZS50aW1lU3RhbXAscD1oLWE7YT1oO2lmKG49PSJzY3JvbGwiKXt2YXIgbT1uZXcgcihlLHQpO20uc3BlZWQ9MSxtLndoZWVsWD1sLG0ud2hlZWxZPWMsMTAqTWF0aC5hYnMobCk8TWF0aC5hYnMoYykmJihsPTApLDEwKk1hdGguYWJzKGMpPE1hdGguYWJzKGwpJiYoYz0wKSxwIT0wJiYoZD1sL3Asdj1jL3ApLHQuX2VtaXQoIm1vdXNld2hlZWwiLG0pLG0ucHJvcGFnYXRpb25TdG9wcGVkfHwoZD12PTApfWVsc2V7dmFyIGc9bmV3IHIoZSx0KSx5PWcuZ2V0RG9jdW1lbnRQb3NpdGlvbigpO249PSJjdXJzb3IiP3Quc2VsZWN0aW9uLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHkpOm49PSJhbmNob3IiJiZ0LnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25BbmNob3IoeS5yb3cseS5jb2x1bW4pLHQucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoeSksZS5wcmV2ZW50RGVmYXVsdCgpfX0pfX0pLGFjZS5kZWZpbmUoImFjZS9saWIvbmV0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vZG9tIik7dC5nZXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKCJHRVQiLGUsITApLG4ub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7bi5yZWFkeVN0YXRlPT09NCYmdChuLnJlc3BvbnNlVGV4dCl9LG4uc2VuZChudWxsKX0sdC5sb2FkU2NyaXB0PWZ1bmN0aW9uKGUsdCl7dmFyIG49ci5nZXREb2N1bWVudEhlYWQoKSxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2kuc3JjPWUsbi5hcHBlbmRDaGlsZChpKSxpLm9ubG9hZD1pLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihlLG4pe2lmKG58fCFpLnJlYWR5U3RhdGV8fGkucmVhZHlTdGF0ZT09ImxvYWRlZCJ8fGkucmVhZHlTdGF0ZT09ImNvbXBsZXRlIilpPWkub25sb2FkPWkub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsbnx8dCgpfX0sdC5xdWFsaWZ5VVJMPWZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyZXR1cm4gdC5ocmVmPWUsdC5ocmVmfX0pLGFjZS5kZWZpbmUoImFjZS9saWIvZXZlbnRfZW1pdHRlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e30saT1mdW5jdGlvbigpe3RoaXMucHJvcGFnYXRpb25TdG9wcGVkPSEwfSxzPWZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwfTtyLl9lbWl0PXIuX2Rpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oZSx0KXt0aGlzLl9ldmVudFJlZ2lzdHJ5fHwodGhpcy5fZXZlbnRSZWdpc3RyeT17fSksdGhpcy5fZGVmYXVsdEhhbmRsZXJzfHwodGhpcy5fZGVmYXVsdEhhbmRsZXJzPXt9KTt2YXIgbj10aGlzLl9ldmVudFJlZ2lzdHJ5W2VdfHxbXSxyPXRoaXMuX2RlZmF1bHRIYW5kbGVyc1tlXTtpZighbi5sZW5ndGgmJiFyKXJldHVybjtpZih0eXBlb2YgdCE9Im9iamVjdCJ8fCF0KXQ9e307dC50eXBlfHwodC50eXBlPWUpLHQuc3RvcFByb3BhZ2F0aW9ufHwodC5zdG9wUHJvcGFnYXRpb249aSksdC5wcmV2ZW50RGVmYXVsdHx8KHQucHJldmVudERlZmF1bHQ9cyksbj1uLnNsaWNlKCk7Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspe25bb10odCx0aGlzKTtpZih0LnByb3BhZ2F0aW9uU3RvcHBlZClicmVha31pZihyJiYhdC5kZWZhdWx0UHJldmVudGVkKXJldHVybiByKHQsdGhpcyl9LHIuX3NpZ25hbD1mdW5jdGlvbihlLHQpe3ZhciBuPSh0aGlzLl9ldmVudFJlZ2lzdHJ5fHx7fSlbZV07aWYoIW4pcmV0dXJuO249bi5zbGljZSgpO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKW5bcl0odCx0aGlzKX0sci5vbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbiByKCl7bi5yZW1vdmVFdmVudExpc3RlbmVyKGUsciksdC5hcHBseShudWxsLGFyZ3VtZW50cyl9KTtpZighdClyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7dD1lfSl9LHIuc2V0RGVmYXVsdEhhbmRsZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9kZWZhdWx0SGFuZGxlcnM7bnx8KG49dGhpcy5fZGVmYXVsdEhhbmRsZXJzPXtfZGlzYWJsZWRfOnt9fSk7aWYobltlXSl7dmFyIHI9bltlXSxpPW4uX2Rpc2FibGVkX1tlXTtpfHwobi5fZGlzYWJsZWRfW2VdPWk9W10pLGkucHVzaChyKTt2YXIgcz1pLmluZGV4T2YodCk7cyE9LTEmJmkuc3BsaWNlKHMsMSl9bltlXT10fSxyLnJlbW92ZURlZmF1bHRIYW5kbGVyPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fZGVmYXVsdEhhbmRsZXJzO2lmKCFuKXJldHVybjt2YXIgcj1uLl9kaXNhYmxlZF9bZV07aWYobltlXT09dClyJiZ0aGlzLnNldERlZmF1bHRIYW5kbGVyKGUsci5wb3AoKSk7ZWxzZSBpZihyKXt2YXIgaT1yLmluZGV4T2YodCk7aSE9LTEmJnIuc3BsaWNlKGksMSl9fSxyLm9uPXIuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihlLHQsbil7dGhpcy5fZXZlbnRSZWdpc3RyeT10aGlzLl9ldmVudFJlZ2lzdHJ5fHx7fTt2YXIgcj10aGlzLl9ldmVudFJlZ2lzdHJ5W2VdO3JldHVybiByfHwocj10aGlzLl9ldmVudFJlZ2lzdHJ5W2VdPVtdKSxyLmluZGV4T2YodCk9PS0xJiZyW24/InVuc2hpZnQiOiJwdXNoIl0odCksdH0sci5vZmY9ci5yZW1vdmVMaXN0ZW5lcj1yLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLl9ldmVudFJlZ2lzdHJ5PXRoaXMuX2V2ZW50UmVnaXN0cnl8fHt9O3ZhciBuPXRoaXMuX2V2ZW50UmVnaXN0cnlbZV07aWYoIW4pcmV0dXJuO3ZhciByPW4uaW5kZXhPZih0KTtyIT09LTEmJm4uc3BsaWNlKHIsMSl9LHIucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3RoaXMuX2V2ZW50UmVnaXN0cnkmJih0aGlzLl9ldmVudFJlZ2lzdHJ5W2VdPVtdKX0sdC5FdmVudEVtaXR0ZXI9cn0pLGFjZS5kZWZpbmUoImFjZS9saWIvYXBwX2NvbmZpZyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oZSx0LG4peyJubyB1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUpe3R5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIiYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSxhcmd1bWVudHMpfWZ1bmN0aW9uIHUoZSx0KXt2YXIgbj1uZXcgRXJyb3IoZSk7bi5kYXRhPXQsdHlwZW9mIGNvbnNvbGU9PSJvYmplY3QiJiZjb25zb2xlLmVycm9yJiZjb25zb2xlLmVycm9yKG4pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBufSl9dmFyIHI9ZSgiLi9vb3AiKSxpPWUoIi4vZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixzPXtzZXRPcHRpb25zOmZ1bmN0aW9uKGUpe09iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7dGhpcy5zZXRPcHRpb24odCxlW3RdKX0sdGhpcyl9LGdldE9wdGlvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9e307aWYoIWUpe3ZhciBuPXRoaXMuJG9wdGlvbnM7ZT1PYmplY3Qua2V5cyhuKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIW5bZV0uaGlkZGVufSl9ZWxzZSBBcnJheS5pc0FycmF5KGUpfHwodD1lLGU9T2JqZWN0LmtleXModCkpO3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT10aGlzLmdldE9wdGlvbihlKX0sdGhpcyksdH0sc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7aWYodGhpc1siJCIrZV09PT10KXJldHVybjt2YXIgbj10aGlzLiRvcHRpb25zW2VdO2lmKCFuKXJldHVybiBvKCdtaXNzcGVsbGVkIG9wdGlvbiAiJytlKyciJyk7aWYobi5mb3J3YXJkVG8pcmV0dXJuIHRoaXNbbi5mb3J3YXJkVG9dJiZ0aGlzW24uZm9yd2FyZFRvXS5zZXRPcHRpb24oZSx0KTtuLmhhbmRsZXNTZXR8fCh0aGlzWyIkIitlXT10KSxuJiZuLnNldCYmbi5zZXQuY2FsbCh0aGlzLHQpfSxnZXRPcHRpb246ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kb3B0aW9uc1tlXTtyZXR1cm4gdD90LmZvcndhcmRUbz90aGlzW3QuZm9yd2FyZFRvXSYmdGhpc1t0LmZvcndhcmRUb10uZ2V0T3B0aW9uKGUpOnQmJnQuZ2V0P3QuZ2V0LmNhbGwodGhpcyk6dGhpc1siJCIrZV06bygnbWlzc3BlbGxlZCBvcHRpb24gIicrZSsnIicpfX0sYT1mdW5jdGlvbigpe3RoaXMuJGRlZmF1bHRPcHRpb25zPXt9fTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLGkpLHRoaXMuZGVmaW5lT3B0aW9ucz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUuJG9wdGlvbnN8fCh0aGlzLiRkZWZhdWx0T3B0aW9uc1t0XT1lLiRvcHRpb25zPXt9KSxPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPW5bdF07dHlwZW9mIHI9PSJzdHJpbmciJiYocj17Zm9yd2FyZFRvOnJ9KSxyLm5hbWV8fChyLm5hbWU9dCksZS4kb3B0aW9uc1tyLm5hbWVdPXIsImluaXRpYWxWYWx1ZSJpbiByJiYoZVsiJCIrci5uYW1lXT1yLmluaXRpYWxWYWx1ZSl9KSxyLmltcGxlbWVudChlLHMpLHRoaXN9LHRoaXMucmVzZXRPcHRpb25zPWZ1bmN0aW9uKGUpe09iamVjdC5rZXlzKGUuJG9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49ZS4kb3B0aW9uc1t0XTsidmFsdWUiaW4gbiYmZS5zZXRPcHRpb24odCxuLnZhbHVlKX0pfSx0aGlzLnNldERlZmF1bHRWYWx1ZT1mdW5jdGlvbihlLHQsbil7aWYoIWUpe2ZvcihlIGluIHRoaXMuJGRlZmF1bHRPcHRpb25zKWlmKHRoaXMuJGRlZmF1bHRPcHRpb25zW2VdW3RdKWJyZWFrO2lmKCF0aGlzLiRkZWZhdWx0T3B0aW9uc1tlXVt0XSlyZXR1cm4hMX12YXIgcj10aGlzLiRkZWZhdWx0T3B0aW9uc1tlXXx8KHRoaXMuJGRlZmF1bHRPcHRpb25zW2VdPXt9KTtyW3RdJiYoci5mb3J3YXJkVG8/dGhpcy5zZXREZWZhdWx0VmFsdWUoci5mb3J3YXJkVG8sdCxuKTpyW3RdLnZhbHVlPW4pfSx0aGlzLnNldERlZmF1bHRWYWx1ZXM9ZnVuY3Rpb24oZSx0KXtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3RoaXMuc2V0RGVmYXVsdFZhbHVlKGUsbix0W25dKX0sdGhpcyl9LHRoaXMud2Fybj1vLHRoaXMucmVwb3J0RXJyb3I9dX0pLmNhbGwoYS5wcm90b3R5cGUpLHQuQXBwQ29uZmlnPWF9KSxhY2UuZGVmaW5lKCJhY2UvY29uZmlnIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL25ldCIsImFjZS9saWIvYXBwX2NvbmZpZyJdLGZ1bmN0aW9uKGUsdCxuKXsibm8gdXNlIHN0cmljdCI7ZnVuY3Rpb24gbChyKXtpZighdXx8IXUuZG9jdW1lbnQpcmV0dXJuO2EucGFja2FnZWQ9cnx8ZS5wYWNrYWdlZHx8bi5wYWNrYWdlZHx8dS5kZWZpbmUmJmRlZmluZS5wYWNrYWdlZDt2YXIgaT17fSxzPSIiLG89ZG9jdW1lbnQuY3VycmVudFNjcmlwdHx8ZG9jdW1lbnQuX2N1cnJlbnRTY3JpcHQsZj1vJiZvLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50LGw9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7Zm9yKHZhciBoPTA7aDxsLmxlbmd0aDtoKyspe3ZhciBwPWxbaF0sZD1wLnNyY3x8cC5nZXRBdHRyaWJ1dGUoInNyYyIpO2lmKCFkKWNvbnRpbnVlO3ZhciB2PXAuYXR0cmlidXRlcztmb3IodmFyIG09MCxnPXYubGVuZ3RoO208ZzttKyspe3ZhciB5PXZbbV07eS5uYW1lLmluZGV4T2YoImRhdGEtYWNlLSIpPT09MCYmKGlbYyh5Lm5hbWUucmVwbGFjZSgvXmRhdGEtYWNlLS8sIiIpKV09eS52YWx1ZSl9dmFyIGI9ZC5tYXRjaCgvXiguKilcL2FjZShcLVx3Kyk/XC5qcyhcP3wkKS8pO2ImJihzPWJbMV0pfXMmJihpLmJhc2U9aS5iYXNlfHxzLGkucGFja2FnZWQ9ITApLGkuYmFzZVBhdGg9aS5iYXNlLGkud29ya2VyUGF0aD1pLndvcmtlclBhdGh8fGkuYmFzZSxpLm1vZGVQYXRoPWkubW9kZVBhdGh8fGkuYmFzZSxpLnRoZW1lUGF0aD1pLnRoZW1lUGF0aHx8aS5iYXNlLGRlbGV0ZSBpLmJhc2U7Zm9yKHZhciB3IGluIGkpdHlwZW9mIGlbd10hPSJ1bmRlZmluZWQiJiZ0LnNldCh3LGlbd10pfWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGUucmVwbGFjZSgvLSguKS9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX0pfXZhciByPWUoIi4vbGliL2xhbmciKSxpPWUoIi4vbGliL29vcCIpLHM9ZSgiLi9saWIvbmV0Iiksbz1lKCIuL2xpYi9hcHBfY29uZmlnIikuQXBwQ29uZmlnO24uZXhwb3J0cz10PW5ldyBvO3ZhciB1PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN8fHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3d9KCksYT17cGFja2FnZWQ6ITEsd29ya2VyUGF0aDpudWxsLG1vZGVQYXRoOm51bGwsdGhlbWVQYXRoOm51bGwsYmFzZVBhdGg6IiIsc3VmZml4OiIuanMiLCRtb2R1bGVVcmxzOnt9LGxvYWRXb3JrZXJGcm9tQmxvYjohMCxzaGFyZWRQb3B1cHM6ITF9O3QuZ2V0PWZ1bmN0aW9uKGUpe2lmKCFhLmhhc093blByb3BlcnR5KGUpKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBjb25maWcga2V5OiAiK2UpO3JldHVybiBhW2VdfSx0LnNldD1mdW5jdGlvbihlLHQpe2lmKGEuaGFzT3duUHJvcGVydHkoZSkpYVtlXT10O2Vsc2UgaWYodGhpcy5zZXREZWZhdWx0VmFsdWUoIiIsZSx0KT09MCl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY29uZmlnIGtleTogIitlKX0sdC5hbGw9ZnVuY3Rpb24oKXtyZXR1cm4gci5jb3B5T2JqZWN0KGEpfSx0LiRtb2Rlcz17fSx0Lm1vZHVsZVVybD1mdW5jdGlvbihlLHQpe2lmKGEuJG1vZHVsZVVybHNbZV0pcmV0dXJuIGEuJG1vZHVsZVVybHNbZV07dmFyIG49ZS5zcGxpdCgiLyIpO3Q9dHx8bltuLmxlbmd0aC0yXXx8IiI7dmFyIHI9dD09InNuaXBwZXRzIj8iLyI6Ii0iLGk9bltuLmxlbmd0aC0xXTtpZih0PT0id29ya2VyIiYmcj09Ii0iKXt2YXIgcz1uZXcgUmVnRXhwKCJeIit0KyJbXFwtX118W1xcLV9dIit0KyIkIiwiZyIpO2k9aS5yZXBsYWNlKHMsIiIpfSghaXx8aT09dCkmJm4ubGVuZ3RoPjEmJihpPW5bbi5sZW5ndGgtMl0pO3ZhciBvPWFbdCsiUGF0aCJdO3JldHVybiBvPT1udWxsP289YS5iYXNlUGF0aDpyPT0iLyImJih0PXI9IiIpLG8mJm8uc2xpY2UoLTEpIT0iLyImJihvKz0iLyIpLG8rdCtyK2krdGhpcy5nZXQoInN1ZmZpeCIpfSx0LnNldE1vZHVsZVVybD1mdW5jdGlvbihlLHQpe3JldHVybiBhLiRtb2R1bGVVcmxzW2VdPXR9LHQuJGxvYWRpbmc9e30sdC5sb2FkTW9kdWxlPWZ1bmN0aW9uKG4scil7dmFyIGksbztBcnJheS5pc0FycmF5KG4pJiYobz1uWzBdLG49blsxXSk7dHJ5e2k9ZShuKX1jYXRjaCh1KXt9aWYoaSYmIXQuJGxvYWRpbmdbbl0pcmV0dXJuIHImJnIoaSk7dC4kbG9hZGluZ1tuXXx8KHQuJGxvYWRpbmdbbl09W10pLHQuJGxvYWRpbmdbbl0ucHVzaChyKTtpZih0LiRsb2FkaW5nW25dLmxlbmd0aD4xKXJldHVybjt2YXIgYT1mdW5jdGlvbigpe2UoW25dLGZ1bmN0aW9uKGUpe3QuX2VtaXQoImxvYWQubW9kdWxlIix7bmFtZTpuLG1vZHVsZTplfSk7dmFyIHI9dC4kbG9hZGluZ1tuXTt0LiRsb2FkaW5nW25dPW51bGwsci5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QmJnQoZSl9KX0pfTtpZighdC5nZXQoInBhY2thZ2VkIikpcmV0dXJuIGEoKTtzLmxvYWRTY3JpcHQodC5tb2R1bGVVcmwobixvKSxhKSxmKCl9O3ZhciBmPWZ1bmN0aW9uKCl7IWEuYmFzZVBhdGgmJiFhLndvcmtlclBhdGgmJiFhLm1vZGVQYXRoJiYhYS50aGVtZVBhdGgmJiFPYmplY3Qua2V5cyhhLiRtb2R1bGVVcmxzKS5sZW5ndGgmJihjb25zb2xlLmVycm9yKCJVbmFibGUgdG8gaW5mZXIgcGF0aCB0byBhY2UgZnJvbSBzY3JpcHQgc3JjLCIsInVzZSBhY2UuY29uZmlnLnNldCgnYmFzZVBhdGgnLCAncGF0aCcpIHRvIGVuYWJsZSBkeW5hbWljIGxvYWRpbmcgb2YgbW9kZXMgYW5kIHRoZW1lcyIsIm9yIHdpdGggd2VicGFjayB1c2UgYWNlL3dlYnBhY2stcmVzb2x2ZXIiKSxmPWZ1bmN0aW9uKCl7fSl9O3QuaW5pdD1sLHQudmVyc2lvbj0iMS40LjYifSksYWNlLmRlZmluZSgiYWNlL21vdXNlL21vdXNlX2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi91c2VyYWdlbnQiLCJhY2UvbW91c2UvZGVmYXVsdF9oYW5kbGVycyIsImFjZS9tb3VzZS9kZWZhdWx0X2d1dHRlcl9oYW5kbGVyIiwiYWNlL21vdXNlL21vdXNlX2V2ZW50IiwiYWNlL21vdXNlL2RyYWdkcm9wX2hhbmRsZXIiLCJhY2UvbW91c2UvdG91Y2hfaGFuZGxlciIsImFjZS9jb25maWciXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9ldmVudCIpLGk9ZSgiLi4vbGliL3VzZXJhZ2VudCIpLHM9ZSgiLi9kZWZhdWx0X2hhbmRsZXJzIikuRGVmYXVsdEhhbmRsZXJzLG89ZSgiLi9kZWZhdWx0X2d1dHRlcl9oYW5kbGVyIikuR3V0dGVySGFuZGxlcix1PWUoIi4vbW91c2VfZXZlbnQiKS5Nb3VzZUV2ZW50LGE9ZSgiLi9kcmFnZHJvcF9oYW5kbGVyIikuRHJhZ2Ryb3BIYW5kbGVyLGY9ZSgiLi90b3VjaF9oYW5kbGVyIikuYWRkVG91Y2hMaXN0ZW5lcnMsbD1lKCIuLi9jb25maWciKSxjPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5lZGl0b3I9ZSxuZXcgcyh0aGlzKSxuZXcgbyh0aGlzKSxuZXcgYSh0aGlzKTt2YXIgbj1mdW5jdGlvbih0KXt2YXIgbj0hZG9jdW1lbnQuaGFzRm9jdXN8fCFkb2N1bWVudC5oYXNGb2N1cygpfHwhZS5pc0ZvY3VzZWQoKSYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09KGUudGV4dElucHV0JiZlLnRleHRJbnB1dC5nZXRFbGVtZW50KCkpO24mJndpbmRvdy5mb2N1cygpLGUuZm9jdXMoKX0sdT1lLnJlbmRlcmVyLmdldE1vdXNlRXZlbnRUYXJnZXQoKTtyLmFkZExpc3RlbmVyKHUsImNsaWNrIix0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsImNsaWNrIikpLHIuYWRkTGlzdGVuZXIodSwibW91c2Vtb3ZlIix0aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcywibW91c2Vtb3ZlIikpLHIuYWRkTXVsdGlNb3VzZURvd25MaXN0ZW5lcihbdSxlLnJlbmRlcmVyLnNjcm9sbEJhclYmJmUucmVuZGVyZXIuc2Nyb2xsQmFyVi5pbm5lcixlLnJlbmRlcmVyLnNjcm9sbEJhckgmJmUucmVuZGVyZXIuc2Nyb2xsQmFySC5pbm5lcixlLnRleHRJbnB1dCYmZS50ZXh0SW5wdXQuZ2V0RWxlbWVudCgpXS5maWx0ZXIoQm9vbGVhbiksWzQwMCwzMDAsMjUwXSx0aGlzLCJvbk1vdXNlRXZlbnQiKSxyLmFkZE1vdXNlV2hlZWxMaXN0ZW5lcihlLmNvbnRhaW5lcix0aGlzLm9uTW91c2VXaGVlbC5iaW5kKHRoaXMsIm1vdXNld2hlZWwiKSksZihlLmNvbnRhaW5lcixlKTt2YXIgbD1lLnJlbmRlcmVyLiRndXR0ZXI7ci5hZGRMaXN0ZW5lcihsLCJtb3VzZWRvd24iLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywiZ3V0dGVybW91c2Vkb3duIikpLHIuYWRkTGlzdGVuZXIobCwiY2xpY2siLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywiZ3V0dGVyY2xpY2siKSksci5hZGRMaXN0ZW5lcihsLCJkYmxjbGljayIsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJndXR0ZXJkYmxjbGljayIpKSxyLmFkZExpc3RlbmVyKGwsIm1vdXNlbW92ZSIsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJndXR0ZXJtb3VzZW1vdmUiKSksci5hZGRMaXN0ZW5lcih1LCJtb3VzZWRvd24iLG4pLHIuYWRkTGlzdGVuZXIobCwibW91c2Vkb3duIixuKSxpLmlzSUUmJmUucmVuZGVyZXIuc2Nyb2xsQmFyViYmKHIuYWRkTGlzdGVuZXIoZS5yZW5kZXJlci5zY3JvbGxCYXJWLmVsZW1lbnQsIm1vdXNlZG93biIsbiksci5hZGRMaXN0ZW5lcihlLnJlbmRlcmVyLnNjcm9sbEJhckguZWxlbWVudCwibW91c2Vkb3duIixuKSksZS5vbigibW91c2Vtb3ZlIixmdW5jdGlvbihuKXtpZih0LnN0YXRlfHx0LiRkcmFnRGVsYXl8fCF0LiRkcmFnRW5hYmxlZClyZXR1cm47dmFyIHI9ZS5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyhuLngsbi55KSxpPWUuc2Vzc2lvbi5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSxzPWUucmVuZGVyZXI7IWkuaXNFbXB0eSgpJiZpLmluc2lkZVN0YXJ0KHIucm93LHIuY29sdW1uKT9zLnNldEN1cnNvclN0eWxlKCJkZWZhdWx0Iik6cy5zZXRDdXJzb3JTdHlsZSgiIil9KX07KGZ1bmN0aW9uKCl7dGhpcy5vbk1vdXNlRXZlbnQ9ZnVuY3Rpb24oZSx0KXt0aGlzLmVkaXRvci5fZW1pdChlLG5ldyB1KHQsdGhpcy5lZGl0b3IpKX0sdGhpcy5vbk1vdXNlTW92ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZWRpdG9yLl9ldmVudFJlZ2lzdHJ5JiZ0aGlzLmVkaXRvci5fZXZlbnRSZWdpc3RyeS5tb3VzZW1vdmU7aWYoIW58fCFuLmxlbmd0aClyZXR1cm47dGhpcy5lZGl0b3IuX2VtaXQoZSxuZXcgdSh0LHRoaXMuZWRpdG9yKSl9LHRoaXMub25Nb3VzZVdoZWVsPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IHUodCx0aGlzLmVkaXRvcik7bi5zcGVlZD10aGlzLiRzY3JvbGxTcGVlZCoyLG4ud2hlZWxYPXQud2hlZWxYLG4ud2hlZWxZPXQud2hlZWxZLHRoaXMuZWRpdG9yLl9lbWl0KGUsbil9LHRoaXMuc2V0U3RhdGU9ZnVuY3Rpb24oZSl7dGhpcy5zdGF0ZT1lfSx0aGlzLmNhcHR1cmVNb3VzZT1mdW5jdGlvbihlLHQpe3RoaXMueD1lLngsdGhpcy55PWUueSx0aGlzLmlzTW91c2VQcmVzc2VkPSEwO3ZhciBuPXRoaXMuZWRpdG9yLHM9dGhpcy5lZGl0b3IucmVuZGVyZXI7cy4kaXNNb3VzZVByZXNzZWQ9ITA7dmFyIG89dGhpcyxhPWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybjtpZihpLmlzV2ViS2l0JiYhZS53aGljaCYmby5yZWxlYXNlTW91c2UpcmV0dXJuIG8ucmVsZWFzZU1vdXNlKCk7by54PWUuY2xpZW50WCxvLnk9ZS5jbGllbnRZLHQmJnQoZSksby5tb3VzZUV2ZW50PW5ldyB1KGUsby5lZGl0b3IpLG8uJG1vdXNlTW92ZWQ9ITB9LGY9ZnVuY3Rpb24oZSl7bi5vZmYoImJlZm9yZUVuZE9wZXJhdGlvbiIsYyksY2xlYXJJbnRlcnZhbChoKSxsKCksb1tvLnN0YXRlKyJFbmQiXSYmb1tvLnN0YXRlKyJFbmQiXShlKSxvLnN0YXRlPSIiLG8uaXNNb3VzZVByZXNzZWQ9cy4kaXNNb3VzZVByZXNzZWQ9ITEscy4ka2VlcFRleHRBcmVhQXRDdXJzb3ImJnMuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yKCksby4kb25DYXB0dXJlTW91c2VNb3ZlPW8ucmVsZWFzZU1vdXNlPW51bGwsZSYmby5vbk1vdXNlRXZlbnQoIm1vdXNldXAiLGUpLG4uZW5kT3BlcmF0aW9uKCl9LGw9ZnVuY3Rpb24oKXtvW28uc3RhdGVdJiZvW28uc3RhdGVdKCksby4kbW91c2VNb3ZlZD0hMX07aWYoaS5pc09sZElFJiZlLmRvbUV2ZW50LnR5cGU9PSJkYmxjbGljayIpcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKGUpfSk7dmFyIGM9ZnVuY3Rpb24oZSl7aWYoIW8ucmVsZWFzZU1vdXNlKXJldHVybjtuLmN1ck9wLmNvbW1hbmQubmFtZSYmbi5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkJiYob1tvLnN0YXRlKyJFbmQiXSYmb1tvLnN0YXRlKyJFbmQiXSgpLG8uc3RhdGU9IiIsby5yZWxlYXNlTW91c2UoKSl9O24ub24oImJlZm9yZUVuZE9wZXJhdGlvbiIsYyksbi5zdGFydE9wZXJhdGlvbih7Y29tbWFuZDp7bmFtZToibW91c2UifX0pLG8uJG9uQ2FwdHVyZU1vdXNlTW92ZT1hLG8ucmVsZWFzZU1vdXNlPXIuY2FwdHVyZSh0aGlzLmVkaXRvci5jb250YWluZXIsYSxmKTt2YXIgaD1zZXRJbnRlcnZhbChsLDIwKX0sdGhpcy5yZWxlYXNlTW91c2U9bnVsbCx0aGlzLmNhbmNlbENvbnRleHRNZW51PWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24odCl7aWYodCYmdC5kb21FdmVudCYmdC5kb21FdmVudC50eXBlIT0iY29udGV4dG1lbnUiKXJldHVybjt0aGlzLmVkaXRvci5vZmYoIm5hdGl2ZWNvbnRleHRtZW51IixlKSx0JiZ0LmRvbUV2ZW50JiZyLnN0b3BFdmVudCh0LmRvbUV2ZW50KX0uYmluZCh0aGlzKTtzZXRUaW1lb3V0KGUsMTApLHRoaXMuZWRpdG9yLm9uKCJuYXRpdmVjb250ZXh0bWVudSIsZSl9fSkuY2FsbChjLnByb3RvdHlwZSksbC5kZWZpbmVPcHRpb25zKGMucHJvdG90eXBlLCJtb3VzZUhhbmRsZXIiLHtzY3JvbGxTcGVlZDp7aW5pdGlhbFZhbHVlOjJ9LGRyYWdEZWxheTp7aW5pdGlhbFZhbHVlOmkuaXNNYWM/MTUwOjB9LGRyYWdFbmFibGVkOntpbml0aWFsVmFsdWU6ITB9LGZvY3VzVGltZW91dDp7aW5pdGlhbFZhbHVlOjB9LHRvb2x0aXBGb2xsb3dzTW91c2U6e2luaXRpYWxWYWx1ZTohMH19KSx0Lk1vdXNlSGFuZGxlcj1jfSksYWNlLmRlZmluZSgiYWNlL21vdXNlL2ZvbGRfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe2Uub24oImNsaWNrIixmdW5jdGlvbih0KXt2YXIgbj10LmdldERvY3VtZW50UG9zaXRpb24oKSxpPWUuc2Vzc2lvbixzPWkuZ2V0Rm9sZEF0KG4ucm93LG4uY29sdW1uLDEpO3MmJih0LmdldEFjY2VsS2V5KCk/aS5yZW1vdmVGb2xkKHMpOmkuZXhwYW5kRm9sZChzKSx0LnN0b3AoKSk7dmFyIG89dC5kb21FdmVudCYmdC5kb21FdmVudC50YXJnZXQ7byYmci5oYXNDc3NDbGFzcyhvLCJhY2VfaW5saW5lX2J1dHRvbiIpJiZyLmhhc0Nzc0NsYXNzKG8sImFjZV90b2dnbGVfd3JhcCIpJiYoaS5zZXRPcHRpb24oIndyYXAiLCFpLmdldFVzZVdyYXBNb2RlKCkpLGUucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKSl9KSxlLm9uKCJndXR0ZXJjbGljayIsZnVuY3Rpb24odCl7dmFyIG49ZS5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuZ2V0UmVnaW9uKHQpO2lmKG49PSJmb2xkV2lkZ2V0cyIpe3ZhciByPXQuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLnJvdyxpPWUuc2Vzc2lvbjtpLmZvbGRXaWRnZXRzJiZpLmZvbGRXaWRnZXRzW3JdJiZlLnNlc3Npb24ub25Gb2xkV2lkZ2V0Q2xpY2socix0KSxlLmlzRm9jdXNlZCgpfHxlLmZvY3VzKCksdC5zdG9wKCl9fSksZS5vbigiZ3V0dGVyZGJsY2xpY2siLGZ1bmN0aW9uKHQpe3ZhciBuPWUucmVuZGVyZXIuJGd1dHRlckxheWVyLmdldFJlZ2lvbih0KTtpZihuPT0iZm9sZFdpZGdldHMiKXt2YXIgcj10LmdldERvY3VtZW50UG9zaXRpb24oKS5yb3csaT1lLnNlc3Npb24scz1pLmdldFBhcmVudEZvbGRSYW5nZURhdGEociwhMCksbz1zLnJhbmdlfHxzLmZpcnN0UmFuZ2U7aWYobyl7cj1vLnN0YXJ0LnJvdzt2YXIgdT1pLmdldEZvbGRBdChyLGkuZ2V0TGluZShyKS5sZW5ndGgsMSk7dT9pLnJlbW92ZUZvbGQodSk6KGkuYWRkRm9sZCgiLi4uIixvKSxlLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KHtyb3c6by5zdGFydC5yb3csY29sdW1uOjB9KSl9dC5zdG9wKCl9fSl9dmFyIHI9ZSgiLi4vbGliL2RvbSIpO3QuRm9sZEhhbmRsZXI9aX0pLGFjZS5kZWZpbmUoImFjZS9rZXlib2FyZC9rZXliaW5kaW5nIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9rZXlzIiwiYWNlL2xpYi9ldmVudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL2tleXMiKSxpPWUoIi4uL2xpYi9ldmVudCIpLHM9ZnVuY3Rpb24oZSl7dGhpcy4kZWRpdG9yPWUsdGhpcy4kZGF0YT17ZWRpdG9yOmV9LHRoaXMuJGhhbmRsZXJzPVtdLHRoaXMuc2V0RGVmYXVsdEhhbmRsZXIoZS5jb21tYW5kcyl9OyhmdW5jdGlvbigpe3RoaXMuc2V0RGVmYXVsdEhhbmRsZXI9ZnVuY3Rpb24oZSl7dGhpcy5yZW1vdmVLZXlib2FyZEhhbmRsZXIodGhpcy4kZGVmYXVsdEhhbmRsZXIpLHRoaXMuJGRlZmF1bHRIYW5kbGVyPWUsdGhpcy5hZGRLZXlib2FyZEhhbmRsZXIoZSwwKX0sdGhpcy5zZXRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kaGFuZGxlcnM7aWYodFt0Lmxlbmd0aC0xXT09ZSlyZXR1cm47d2hpbGUodFt0Lmxlbmd0aC0xXSYmdFt0Lmxlbmd0aC0xXSE9dGhpcy4kZGVmYXVsdEhhbmRsZXIpdGhpcy5yZW1vdmVLZXlib2FyZEhhbmRsZXIodFt0Lmxlbmd0aC0xXSk7dGhpcy5hZGRLZXlib2FyZEhhbmRsZXIoZSwxKX0sdGhpcy5hZGRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oZSx0KXtpZighZSlyZXR1cm47dHlwZW9mIGU9PSJmdW5jdGlvbiImJiFlLmhhbmRsZUtleWJvYXJkJiYoZS5oYW5kbGVLZXlib2FyZD1lKTt2YXIgbj10aGlzLiRoYW5kbGVycy5pbmRleE9mKGUpO24hPS0xJiZ0aGlzLiRoYW5kbGVycy5zcGxpY2UobiwxKSx0PT11bmRlZmluZWQ/dGhpcy4kaGFuZGxlcnMucHVzaChlKTp0aGlzLiRoYW5kbGVycy5zcGxpY2UodCwwLGUpLG49PS0xJiZlLmF0dGFjaCYmZS5hdHRhY2godGhpcy4kZWRpdG9yKX0sdGhpcy5yZW1vdmVLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kaGFuZGxlcnMuaW5kZXhPZihlKTtyZXR1cm4gdD09LTE/ITE6KHRoaXMuJGhhbmRsZXJzLnNwbGljZSh0LDEpLGUuZGV0YWNoJiZlLmRldGFjaCh0aGlzLiRlZGl0b3IpLCEwKX0sdGhpcy5nZXRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaGFuZGxlcnNbdGhpcy4kaGFuZGxlcnMubGVuZ3RoLTFdfSx0aGlzLmdldFN0YXR1c1RleHQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRkYXRhLHQ9ZS5lZGl0b3I7cmV0dXJuIHRoaXMuJGhhbmRsZXJzLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRTdGF0dXNUZXh0JiZuLmdldFN0YXR1c1RleHQodCxlKXx8IiJ9KS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpfSx0aGlzLiRjYWxsS2V5Ym9hcmRIYW5kbGVycz1mdW5jdGlvbihlLHQsbixyKXt2YXIgcyxvPSExLHU9dGhpcy4kZWRpdG9yLmNvbW1hbmRzO2Zvcih2YXIgYT10aGlzLiRoYW5kbGVycy5sZW5ndGg7YS0tOyl7cz10aGlzLiRoYW5kbGVyc1thXS5oYW5kbGVLZXlib2FyZCh0aGlzLiRkYXRhLGUsdCxuLHIpO2lmKCFzfHwhcy5jb21tYW5kKWNvbnRpbnVlO3MuY29tbWFuZD09Im51bGwiP289ITA6bz11LmV4ZWMocy5jb21tYW5kLHRoaXMuJGVkaXRvcixzLmFyZ3MsciksbyYmciYmZSE9LTEmJnMucGFzc0V2ZW50IT0xJiZzLmNvbW1hbmQucGFzc0V2ZW50IT0xJiZpLnN0b3BFdmVudChyKTtpZihvKWJyZWFrfXJldHVybiFvJiZlPT0tMSYmKHM9e2NvbW1hbmQ6Imluc2VydHN0cmluZyJ9LG89dS5leGVjKCJpbnNlcnRzdHJpbmciLHRoaXMuJGVkaXRvcix0KSksbyYmdGhpcy4kZWRpdG9yLl9zaWduYWwmJnRoaXMuJGVkaXRvci5fc2lnbmFsKCJrZXlib2FyZEFjdGl2aXR5IixzKSxvfSx0aGlzLm9uQ29tbWFuZEtleT1mdW5jdGlvbihlLHQsbil7dmFyIGk9ci5rZXlDb2RlVG9TdHJpbmcobik7cmV0dXJuIHRoaXMuJGNhbGxLZXlib2FyZEhhbmRsZXJzKHQsaSxuLGUpfSx0aGlzLm9uVGV4dElucHV0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiRjYWxsS2V5Ym9hcmRIYW5kbGVycygtMSxlKX19KS5jYWxsKHMucHJvdG90eXBlKSx0LktleUJpbmRpbmc9c30pLGFjZS5kZWZpbmUoImFjZS9saWIvYmlkaXV0aWwiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIEYoZSx0LG4scil7dmFyIGk9cz9kOnAsYz1udWxsLGg9bnVsbCx2PW51bGwsbT0wLGc9bnVsbCx5PW51bGwsYj0tMSx3PW51bGwsRT1udWxsLFQ9W107aWYoIXIpZm9yKHc9MCxyPVtdO3c8bjt3Kyspclt3XT1SKGVbd10pO289cyx1PSExLGE9ITEsZj0hMSxsPSExO2ZvcihFPTA7RTxuO0UrKyl7Yz1tLFRbRV09aD1xKGUscixULEUpLG09aVtjXVtoXSxnPW0mMjQwLG0mPTE1LHRbRV09dj1pW21dWzVdO2lmKGc+MClpZihnPT0xNil7Zm9yKHc9Yjt3PEU7dysrKXRbd109MTtiPS0xfWVsc2UgYj0tMTt5PWlbbV1bNl07aWYoeSliPT0tMSYmKGI9RSk7ZWxzZSBpZihiPi0xKXtmb3Iodz1iO3c8RTt3KyspdFt3XT12O2I9LTF9cltFXT09UyYmKHRbRV09MCksb3w9dn1pZihsKWZvcih3PTA7dzxuO3crKylpZihyW3ddPT14KXt0W3ddPXM7Zm9yKHZhciBDPXctMTtDPj0wO0MtLSl7aWYocltDXSE9TilicmVhazt0W0NdPXN9fX1mdW5jdGlvbiBJKGUsdCxuKXtpZihvPGUpcmV0dXJuO2lmKGU9PTEmJnM9PW0mJiFmKXtuLnJldmVyc2UoKTtyZXR1cm59dmFyIHI9bi5sZW5ndGgsaT0wLHUsYSxsLGM7d2hpbGUoaTxyKXtpZih0W2ldPj1lKXt1PWkrMTt3aGlsZSh1PHImJnRbdV0+PWUpdSsrO2ZvcihhPWksbD11LTE7YTxsO2ErKyxsLS0pYz1uW2FdLG5bYV09bltsXSxuW2xdPWM7aT11fWkrK319ZnVuY3Rpb24gcShlLHQsbixyKXt2YXIgaT10W3JdLG8sYyxoLHA7c3dpdGNoKGkpe2Nhc2UgZzpjYXNlIHk6dT0hMTtjYXNlIEU6Y2FzZSB3OnJldHVybiBpO2Nhc2UgYjpyZXR1cm4gdT93OmI7Y2FzZSBUOnJldHVybiB1PSEwLGE9ITAseTtjYXNlIE46cmV0dXJuIEU7Y2FzZSBDOmlmKHI8MXx8cisxPj10Lmxlbmd0aHx8KG89bltyLTFdKSE9YiYmbyE9d3x8KGM9dFtyKzFdKSE9YiYmYyE9dylyZXR1cm4gRTtyZXR1cm4gdSYmKGM9dyksYz09bz9jOkU7Y2FzZSBrOm89cj4wP25bci0xXTpTO2lmKG89PWImJnIrMTx0Lmxlbmd0aCYmdFtyKzFdPT1iKXJldHVybiBiO3JldHVybiBFO2Nhc2UgTDppZihyPjAmJm5bci0xXT09YilyZXR1cm4gYjtpZih1KXJldHVybiBFO3A9cisxLGg9dC5sZW5ndGg7d2hpbGUocDxoJiZ0W3BdPT1MKXArKztpZihwPGgmJnRbcF09PWIpcmV0dXJuIGI7cmV0dXJuIEU7Y2FzZSBBOmg9dC5sZW5ndGgscD1yKzE7d2hpbGUocDxoJiZ0W3BdPT1BKXArKztpZihwPGgpe3ZhciBkPWVbcl0sdj1kPj0xNDI1JiZkPD0yMzAzfHxkPT02NDI4NjtvPXRbcF07aWYodiYmKG89PXl8fG89PVQpKXJldHVybiB5fWlmKHI8MXx8KG89dFtyLTFdKT09UylyZXR1cm4gRTtyZXR1cm4gbltyLTFdO2Nhc2UgUzpyZXR1cm4gdT0hMSxmPSEwLHM7Y2FzZSB4OnJldHVybiBsPSEwLEU7Y2FzZSBPOmNhc2UgTTpjYXNlIEQ6Y2FzZSBQOmNhc2UgXzp1PSExO2Nhc2UgSDpyZXR1cm4gRX19ZnVuY3Rpb24gUihlKXt2YXIgdD1lLmNoYXJDb2RlQXQoMCksbj10Pj44O3JldHVybiBuPT0wP3Q+MTkxP2c6Qlt0XTpuPT01Py9bXHUwNTkxLVx1MDVmNF0vLnRlc3QoZSk/eTpnOm49PTY/L1tcdTA2MTAtXHUwNjFhXHUwNjRiLVx1MDY1Zlx1MDZkNi1cdTA2ZTRcdTA2ZTctXHUwNmVkXS8udGVzdChlKT9BOi9bXHUwNjYwLVx1MDY2OVx1MDY2Yi1cdTA2NmNdLy50ZXN0KGUpP3c6dD09MTY0Mj9MOi9bXHUwNmYwLVx1MDZmOV0vLnRlc3QoZSk/YjpUOm49PTMyJiZ0PD04Mjg3P2pbdCYyNTVdOm49PTI1ND90Pj02NTEzNj9UOkU6RX1mdW5jdGlvbiBVKGUpe3JldHVybiBlPj0iXHUwNjRiIiYmZTw9Ilx1MDY1NSJ9dmFyIHI9WyJcdTA2MjEiLCJcdTA2NDEiXSxpPVsiXHUwNjNhIiwiXHUwNjRhIl0scz0wLG89MCx1PSExLGE9ITEsZj0hMSxsPSExLGM9ITEsaD0hMSxwPVtbMCwzLDAsMSwwLDAsMF0sWzAsMywwLDEsMiwyLDBdLFswLDMsMCwxNywyLDAsMV0sWzAsMyw1LDUsNCwxLDBdLFswLDMsMjEsMjEsNCwwLDFdLFswLDMsNSw1LDQsMiwwXV0sZD1bWzIsMCwxLDEsMCwxLDBdLFsyLDAsMSwxLDAsMiwwXSxbMiwwLDIsMSwzLDIsMF0sWzIsMCwyLDMzLDMsMSwxXV0sdj0wLG09MSxnPTAseT0xLGI9Mix3PTMsRT00LFM9NSx4PTYsVD03LE49OCxDPTksaz0xMCxMPTExLEE9MTIsTz0xMyxNPTE0LF89MTUsRD0xNixQPTE3LEg9MTgsQj1bSCxILEgsSCxILEgsSCxILEgseCxTLHgsTixTLEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxTLFMsUyx4LE4sRSxFLEwsTCxMLEUsRSxFLEUsRSxrLEMsayxDLEMsYixiLGIsYixiLGIsYixiLGIsYixDLEUsRSxFLEUsRSxFLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxFLEUsRSxFLEUsRSxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsRSxFLEUsRSxILEgsSCxILEgsSCxTLEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxDLEUsTCxMLEwsTCxFLEUsRSxFLGcsRSxFLEgsRSxFLEwsTCxiLGIsRSxnLEUsRSxFLGIsZyxFLEUsRSxFLEVdLGo9W04sTixOLE4sTixOLE4sTixOLE4sTixILEgsSCxnLHksRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsTixTLE8sTSxfLEQsUCxDLEwsTCxMLEwsTCxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxDLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxOXTt0Lkw9Zyx0LlI9eSx0LkVOPWIsdC5PTl9SPTMsdC5BTj00LHQuUl9IPTUsdC5CPTYsdC5STEU9Nyx0LkRPVD0iXHUwMGI3Iix0LmRvQmlkaVJlb3JkZXI9ZnVuY3Rpb24oZSxuLHIpe2lmKGUubGVuZ3RoPDIpcmV0dXJue307dmFyIGk9ZS5zcGxpdCgiIiksbz1uZXcgQXJyYXkoaS5sZW5ndGgpLHU9bmV3IEFycmF5KGkubGVuZ3RoKSxhPVtdO3M9cj9tOnYsRihpLGEsaS5sZW5ndGgsbik7Zm9yKHZhciBmPTA7ZjxvLmxlbmd0aDtvW2ZdPWYsZisrKTtJKDIsYSxvKSxJKDEsYSxvKTtmb3IodmFyIGY9MDtmPG8ubGVuZ3RoLTE7ZisrKW5bZl09PT13P2FbZl09dC5BTjphW2ZdPT09eSYmKG5bZl0+VCYmbltmXTxPfHxuW2ZdPT09RXx8bltmXT09PUgpP2FbZl09dC5PTl9SOmY+MCYmaVtmLTFdPT09Ilx1MDY0NCImJi9cdTA2MjJ8XHUwNjIzfFx1MDYyNXxcdTA2MjcvLnRlc3QoaVtmXSkmJihhW2YtMV09YVtmXT10LlJfSCxmKyspO2lbaS5sZW5ndGgtMV09PT10LkRPVCYmKGFbaS5sZW5ndGgtMV09dC5CKSxpWzBdPT09Ilx1MjAyYiImJihhWzBdPXQuUkxFKTtmb3IodmFyIGY9MDtmPG8ubGVuZ3RoO2YrKyl1W2ZdPWFbb1tmXV07cmV0dXJue2xvZ2ljYWxGcm9tVmlzdWFsOm8sYmlkaUxldmVsczp1fX0sdC5oYXNCaWRpQ2hhcmFjdGVycz1mdW5jdGlvbihlLHQpe3ZhciBuPSExO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXRbcl09UihlLmNoYXJBdChyKSksIW4mJih0W3JdPT15fHx0W3JdPT1UfHx0W3JdPT13KSYmKG49ITApO3JldHVybiBufSx0LmdldFZpc3VhbEZyb21Mb2dpY2FsSWR4PWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjx0LmxvZ2ljYWxGcm9tVmlzdWFsLmxlbmd0aDtuKyspaWYodC5sb2dpY2FsRnJvbVZpc3VhbFtuXT09ZSlyZXR1cm4gbjtyZXR1cm4gMH19KSxhY2UuZGVmaW5lKCJhY2UvYmlkaWhhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2JpZGl1dGlsIiwiYWNlL2xpYi9sYW5nIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9iaWRpdXRpbCIpLGk9ZSgiLi9saWIvbGFuZyIpLHM9L1tcdTA1OTAtXHUwNWY0XHUwNjAwLVx1MDZmZlx1MDcwMC1cdTA4YWNcdTIwMkJdLyxvPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbj1lLHRoaXMuYmlkaU1hcD17fSx0aGlzLmN1cnJlbnRSb3c9bnVsbCx0aGlzLmJpZGlVdGlsPXIsdGhpcy5jaGFyV2lkdGhzPVtdLHRoaXMuRU9MPSJcdTAwYWMiLHRoaXMuc2hvd0ludmlzaWJsZXM9ITAsdGhpcy5pc1J0bERpcj0hMSx0aGlzLiRpc1J0bD0hMSx0aGlzLmxpbmU9IiIsdGhpcy53cmFwSW5kZW50PTAsdGhpcy5FT0Y9Ilx1MDBiNiIsdGhpcy5STEU9Ilx1MjAyYiIsdGhpcy5jb250ZW50V2lkdGg9MCx0aGlzLmZvbnRNZXRyaWNzPW51bGwsdGhpcy5ydGxMaW5lT2Zmc2V0PTAsdGhpcy53cmFwT2Zmc2V0PTAsdGhpcy5pc01vdmVMZWZ0T3BlcmF0aW9uPSExLHRoaXMuc2VlbkJpZGk9cy50ZXN0KGUuZ2V0VmFsdWUoKSl9OyhmdW5jdGlvbigpe3RoaXMuaXNCaWRpUm93PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5zZWVuQmlkaT8oZSE9PXRoaXMuY3VycmVudFJvdyYmKHRoaXMuY3VycmVudFJvdz1lLHRoaXMudXBkYXRlUm93TGluZSh0LG4pLHRoaXMudXBkYXRlQmlkaU1hcCgpKSx0aGlzLmJpZGlNYXAuYmlkaUxldmVscyk6ITF9LHRoaXMub25DaGFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy5zZWVuQmlkaT90aGlzLmN1cnJlbnRSb3c9bnVsbDplLmFjdGlvbj09Imluc2VydCImJnMudGVzdChlLmxpbmVzLmpvaW4oIlxuIikpJiYodGhpcy5zZWVuQmlkaT0hMCx0aGlzLmN1cnJlbnRSb3c9bnVsbCl9LHRoaXMuZ2V0RG9jdW1lbnRSb3c9ZnVuY3Rpb24oKXt2YXIgZT0wLHQ9dGhpcy5zZXNzaW9uLiRzY3JlZW5Sb3dDYWNoZTtpZih0Lmxlbmd0aCl7dmFyIG49dGhpcy5zZXNzaW9uLiRnZXRSb3dDYWNoZUluZGV4KHQsdGhpcy5jdXJyZW50Um93KTtuPj0wJiYoZT10aGlzLnNlc3Npb24uJGRvY1Jvd0NhY2hlW25dKX1yZXR1cm4gZX0sdGhpcy5nZXRTcGxpdEluZGV4PWZ1bmN0aW9uKCl7dmFyIGU9MCx0PXRoaXMuc2Vzc2lvbi4kc2NyZWVuUm93Q2FjaGU7aWYodC5sZW5ndGgpe3ZhciBuLHI9dGhpcy5zZXNzaW9uLiRnZXRSb3dDYWNoZUluZGV4KHQsdGhpcy5jdXJyZW50Um93KTt3aGlsZSh0aGlzLmN1cnJlbnRSb3ctZT4wKXtuPXRoaXMuc2Vzc2lvbi4kZ2V0Um93Q2FjaGVJbmRleCh0LHRoaXMuY3VycmVudFJvdy1lLTEpO2lmKG4hPT1yKWJyZWFrO3I9bixlKyt9fWVsc2UgZT10aGlzLmN1cnJlbnRSb3c7cmV0dXJuIGV9LHRoaXMudXBkYXRlUm93TGluZT1mdW5jdGlvbihlLHQpe2U9PT11bmRlZmluZWQmJihlPXRoaXMuZ2V0RG9jdW1lbnRSb3coKSk7dmFyIG49ZT09PXRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKS0xLHM9bj90aGlzLkVPRjp0aGlzLkVPTDt0aGlzLndyYXBJbmRlbnQ9MCx0aGlzLmxpbmU9dGhpcy5zZXNzaW9uLmdldExpbmUoZSksdGhpcy5pc1J0bERpcj10aGlzLiRpc1J0bHx8dGhpcy5saW5lLmNoYXJBdCgwKT09PXRoaXMuUkxFO2lmKHRoaXMuc2Vzc2lvbi4kdXNlV3JhcE1vZGUpe3ZhciBvPXRoaXMuc2Vzc2lvbi4kd3JhcERhdGFbZV07byYmKHQ9PT11bmRlZmluZWQmJih0PXRoaXMuZ2V0U3BsaXRJbmRleCgpKSx0PjAmJm8ubGVuZ3RoPyh0aGlzLndyYXBJbmRlbnQ9by5pbmRlbnQsdGhpcy53cmFwT2Zmc2V0PXRoaXMud3JhcEluZGVudCp0aGlzLmNoYXJXaWR0aHNbci5MXSx0aGlzLmxpbmU9dDxvLmxlbmd0aD90aGlzLmxpbmUuc3Vic3RyaW5nKG9bdC0xXSxvW3RdKTp0aGlzLmxpbmUuc3Vic3RyaW5nKG9bby5sZW5ndGgtMV0pKTp0aGlzLmxpbmU9dGhpcy5saW5lLnN1YnN0cmluZygwLG9bdF0pKSx0PT1vLmxlbmd0aCYmKHRoaXMubGluZSs9dGhpcy5zaG93SW52aXNpYmxlcz9zOnIuRE9UKX1lbHNlIHRoaXMubGluZSs9dGhpcy5zaG93SW52aXNpYmxlcz9zOnIuRE9UO3ZhciB1PXRoaXMuc2Vzc2lvbixhPTAsZjt0aGlzLmxpbmU9dGhpcy5saW5lLnJlcGxhY2UoL1x0fFtcdTExMDAtXHUyMDI5LCBcdTIwMkYtXHVGRkU2XS9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT0iCSJ8fHUuaXNGdWxsV2lkdGgoZS5jaGFyQ29kZUF0KDApKT8oZj1lPT09IgkiP3UuZ2V0U2NyZWVuVGFiU2l6ZSh0K2EpOjIsYSs9Zi0xLGkuc3RyaW5nUmVwZWF0KHIuRE9ULGYpKTplfSksdGhpcy5pc1J0bERpciYmKHRoaXMuZm9udE1ldHJpY3MuJG1haW4udGV4dENvbnRlbnQ9dGhpcy5saW5lLmNoYXJBdCh0aGlzLmxpbmUubGVuZ3RoLTEpPT1yLkRPVD90aGlzLmxpbmUuc3Vic3RyKDAsdGhpcy5saW5lLmxlbmd0aC0xKTp0aGlzLmxpbmUsdGhpcy5ydGxMaW5lT2Zmc2V0PXRoaXMuY29udGVudFdpZHRoLXRoaXMuZm9udE1ldHJpY3MuJG1haW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpfSx0aGlzLnVwZGF0ZUJpZGlNYXA9ZnVuY3Rpb24oKXt2YXIgZT1bXTtyLmhhc0JpZGlDaGFyYWN0ZXJzKHRoaXMubGluZSxlKXx8dGhpcy5pc1J0bERpcj90aGlzLmJpZGlNYXA9ci5kb0JpZGlSZW9yZGVyKHRoaXMubGluZSxlLHRoaXMuaXNSdGxEaXIpOnRoaXMuYmlkaU1hcD17fX0sdGhpcy5tYXJrQXNEaXJ0eT1mdW5jdGlvbigpe3RoaXMuY3VycmVudFJvdz1udWxsfSx0aGlzLnVwZGF0ZUNoYXJhY3RlcldpZHRocz1mdW5jdGlvbihlKXtpZih0aGlzLmNoYXJhY3RlcldpZHRoPT09ZS4kY2hhcmFjdGVyU2l6ZS53aWR0aClyZXR1cm47dGhpcy5mb250TWV0cmljcz1lO3ZhciB0PXRoaXMuY2hhcmFjdGVyV2lkdGg9ZS4kY2hhcmFjdGVyU2l6ZS53aWR0aCxuPWUuJG1lYXN1cmVDaGFyV2lkdGgoIlx1MDVkNCIpO3RoaXMuY2hhcldpZHRoc1tyLkxdPXRoaXMuY2hhcldpZHRoc1tyLkVOXT10aGlzLmNoYXJXaWR0aHNbci5PTl9SXT10LHRoaXMuY2hhcldpZHRoc1tyLlJdPXRoaXMuY2hhcldpZHRoc1tyLkFOXT1uLHRoaXMuY2hhcldpZHRoc1tyLlJfSF09biouNDUsdGhpcy5jaGFyV2lkdGhzW3IuQl09dGhpcy5jaGFyV2lkdGhzW3IuUkxFXT0wLHRoaXMuY3VycmVudFJvdz1udWxsfSx0aGlzLnNldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKGUpe3RoaXMuc2hvd0ludmlzaWJsZXM9ZSx0aGlzLmN1cnJlbnRSb3c9bnVsbH0sdGhpcy5zZXRFb2xDaGFyPWZ1bmN0aW9uKGUpe3RoaXMuRU9MPWV9LHRoaXMuc2V0Q29udGVudFdpZHRoPWZ1bmN0aW9uKGUpe3RoaXMuY29udGVudFdpZHRoPWV9LHRoaXMuaXNSdGxMaW5lPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiRpc1J0bD8hMDplIT11bmRlZmluZWQ/dGhpcy5zZXNzaW9uLmdldExpbmUoZSkuY2hhckF0KDApPT10aGlzLlJMRTp0aGlzLmlzUnRsRGlyfSx0aGlzLnNldFJ0bERpcmVjdGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZ2V0Q3Vyc29yUG9zaXRpb24oKTtmb3IodmFyIHI9ZS5zZWxlY3Rpb24uZ2V0U2VsZWN0aW9uQW5jaG9yKCkucm93O3I8PW4ucm93O3IrKykhdCYmZS5zZXNzaW9uLmdldExpbmUocikuY2hhckF0KDApPT09ZS5zZXNzaW9uLiRiaWRpSGFuZGxlci5STEU/ZS5zZXNzaW9uLmRvYy5yZW1vdmVJbkxpbmUociwwLDEpOnQmJmUuc2Vzc2lvbi5nZXRMaW5lKHIpLmNoYXJBdCgwKSE9PWUuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuUkxFJiZlLnNlc3Npb24uZG9jLmluc2VydCh7Y29sdW1uOjAscm93OnJ9LGUuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuUkxFKX0sdGhpcy5nZXRQb3NMZWZ0PWZ1bmN0aW9uKGUpe2UtPXRoaXMud3JhcEluZGVudDt2YXIgdD10aGlzLmxpbmUuY2hhckF0KDApPT09dGhpcy5STEU/MTowLG49ZT50P3RoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKT9lOmUtMTp0LGk9ci5nZXRWaXN1YWxGcm9tTG9naWNhbElkeChuLHRoaXMuYmlkaU1hcCkscz10aGlzLmJpZGlNYXAuYmlkaUxldmVscyxvPTA7IXRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKSYmZTw9dCYmc1tpXSUyIT09MCYmaSsrO2Zvcih2YXIgdT0wO3U8aTt1Kyspbys9dGhpcy5jaGFyV2lkdGhzW3NbdV1dO3JldHVybiF0aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCkmJmU+dCYmc1tpXSUyPT09MCYmKG8rPXRoaXMuY2hhcldpZHRoc1tzW2ldXSksdGhpcy53cmFwSW5kZW50JiYobys9dGhpcy5pc1J0bERpcj8tMSp0aGlzLndyYXBPZmZzZXQ6dGhpcy53cmFwT2Zmc2V0KSx0aGlzLmlzUnRsRGlyJiYobys9dGhpcy5ydGxMaW5lT2Zmc2V0KSxvfSx0aGlzLmdldFNlbGVjdGlvbnM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJpZGlNYXAscj1uLmJpZGlMZXZlbHMsaSxzPVtdLG89MCx1PU1hdGgubWluKGUsdCktdGhpcy53cmFwSW5kZW50LGE9TWF0aC5tYXgoZSx0KS10aGlzLndyYXBJbmRlbnQsZj0hMSxsPSExLGM9MDt0aGlzLndyYXBJbmRlbnQmJihvKz10aGlzLmlzUnRsRGlyPy0xKnRoaXMud3JhcE9mZnNldDp0aGlzLndyYXBPZmZzZXQpO2Zvcih2YXIgaCxwPTA7cDxyLmxlbmd0aDtwKyspaD1uLmxvZ2ljYWxGcm9tVmlzdWFsW3BdLGk9cltwXSxmPWg+PXUmJmg8YSxmJiYhbD9jPW86IWYmJmwmJnMucHVzaCh7bGVmdDpjLHdpZHRoOm8tY30pLG8rPXRoaXMuY2hhcldpZHRoc1tpXSxsPWY7ZiYmcD09PXIubGVuZ3RoJiZzLnB1c2goe2xlZnQ6Yyx3aWR0aDpvLWN9KTtpZih0aGlzLmlzUnRsRGlyKWZvcih2YXIgZD0wO2Q8cy5sZW5ndGg7ZCsrKXNbZF0ubGVmdCs9dGhpcy5ydGxMaW5lT2Zmc2V0O3JldHVybiBzfSx0aGlzLm9mZnNldFRvQ29sPWZ1bmN0aW9uKGUpe3RoaXMuaXNSdGxEaXImJihlLT10aGlzLnJ0bExpbmVPZmZzZXQpO3ZhciB0PTAsZT1NYXRoLm1heChlLDApLG49MCxyPTAsaT10aGlzLmJpZGlNYXAuYmlkaUxldmVscyxzPXRoaXMuY2hhcldpZHRoc1tpW3JdXTt0aGlzLndyYXBJbmRlbnQmJihlLT10aGlzLmlzUnRsRGlyPy0xKnRoaXMud3JhcE9mZnNldDp0aGlzLndyYXBPZmZzZXQpO3doaWxlKGU+bitzLzIpe24rPXM7aWYocj09PWkubGVuZ3RoLTEpe3M9MDticmVha31zPXRoaXMuY2hhcldpZHRoc1tpWysrcl1dfXJldHVybiByPjAmJmlbci0xXSUyIT09MCYmaVtyXSUyPT09MD8oZTxuJiZyLS0sdD10aGlzLmJpZGlNYXAubG9naWNhbEZyb21WaXN1YWxbcl0pOnI+MCYmaVtyLTFdJTI9PT0wJiZpW3JdJTIhPT0wP3Q9MSsoZT5uP3RoaXMuYmlkaU1hcC5sb2dpY2FsRnJvbVZpc3VhbFtyXTp0aGlzLmJpZGlNYXAubG9naWNhbEZyb21WaXN1YWxbci0xXSk6dGhpcy5pc1J0bERpciYmcj09PWkubGVuZ3RoLTEmJnM9PT0wJiZpW3ItMV0lMj09PTB8fCF0aGlzLmlzUnRsRGlyJiZyPT09MCYmaVtyXSUyIT09MD90PTErdGhpcy5iaWRpTWFwLmxvZ2ljYWxGcm9tVmlzdWFsW3JdOihyPjAmJmlbci0xXSUyIT09MCYmcyE9PTAmJnItLSx0PXRoaXMuYmlkaU1hcC5sb2dpY2FsRnJvbVZpc3VhbFtyXSksdD09PTAmJnRoaXMuaXNSdGxEaXImJnQrKyx0K3RoaXMud3JhcEluZGVudH19KS5jYWxsKG8ucHJvdG90eXBlKSx0LkJpZGlIYW5kbGVyPW99KSxhY2UuZGVmaW5lKCJhY2Uvc2VsZWN0aW9uIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvbGFuZyIpLHM9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixvPWUoIi4vcmFuZ2UiKS5SYW5nZSx1PWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbj1lLHRoaXMuZG9jPWUuZ2V0RG9jdW1lbnQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5jdXJzb3I9dGhpcy5sZWFkPXRoaXMuZG9jLmNyZWF0ZUFuY2hvcigwLDApLHRoaXMuYW5jaG9yPXRoaXMuZG9jLmNyZWF0ZUFuY2hvcigwLDApLHRoaXMuJHNpbGVudD0hMTt2YXIgdD10aGlzO3RoaXMuY3Vyc29yLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKGUpe3QuJGN1cnNvckNoYW5nZWQ9ITAsdC4kc2lsZW50fHx0Ll9lbWl0KCJjaGFuZ2VDdXJzb3IiKSwhdC4kaXNFbXB0eSYmIXQuJHNpbGVudCYmdC5fZW1pdCgiY2hhbmdlU2VsZWN0aW9uIiksIXQuJGtlZXBEZXNpcmVkQ29sdW1uT25DaGFuZ2UmJmUub2xkLmNvbHVtbiE9ZS52YWx1ZS5jb2x1bW4mJih0LiRkZXNpcmVkQ29sdW1uPW51bGwpfSksdGhpcy5hbmNob3Iub24oImNoYW5nZSIsZnVuY3Rpb24oKXt0LiRhbmNob3JDaGFuZ2VkPSEwLCF0LiRpc0VtcHR5JiYhdC4kc2lsZW50JiZ0Ll9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKX0pfTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLHMpLHRoaXMuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRpc0VtcHR5fHx0aGlzLmFuY2hvci5yb3c9PXRoaXMubGVhZC5yb3cmJnRoaXMuYW5jaG9yLmNvbHVtbj09dGhpcy5sZWFkLmNvbHVtbn0sdGhpcy5pc011bHRpTGluZT1mdW5jdGlvbigpe3JldHVybiF0aGlzLiRpc0VtcHR5JiZ0aGlzLmFuY2hvci5yb3chPXRoaXMuY3Vyc29yLnJvd30sdGhpcy5nZXRDdXJzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZWFkLmdldFBvc2l0aW9uKCl9LHRoaXMuc2V0U2VsZWN0aW9uQW5jaG9yPWZ1bmN0aW9uKGUsdCl7dGhpcy4kaXNFbXB0eT0hMSx0aGlzLmFuY2hvci5zZXRQb3NpdGlvbihlLHQpfSx0aGlzLmdldEFuY2hvcj10aGlzLmdldFNlbGVjdGlvbkFuY2hvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRpc0VtcHR5P3RoaXMuZ2V0U2VsZWN0aW9uTGVhZCgpOnRoaXMuYW5jaG9yLmdldFBvc2l0aW9uKCl9LHRoaXMuZ2V0U2VsZWN0aW9uTGVhZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlYWQuZ2V0UG9zaXRpb24oKX0sdGhpcy5pc0JhY2t3YXJkcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYW5jaG9yLHQ9dGhpcy5sZWFkO3JldHVybiBlLnJvdz50LnJvd3x8ZS5yb3c9PXQucm93JiZlLmNvbHVtbj50LmNvbHVtbn0sdGhpcy5nZXRSYW5nZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYW5jaG9yLHQ9dGhpcy5sZWFkO3JldHVybiB0aGlzLiRpc0VtcHR5P28uZnJvbVBvaW50cyh0LHQpOnRoaXMuaXNCYWNrd2FyZHMoKT9vLmZyb21Qb2ludHModCxlKTpvLmZyb21Qb2ludHMoZSx0KX0sdGhpcy5jbGVhclNlbGVjdGlvbj1mdW5jdGlvbigpe3RoaXMuJGlzRW1wdHl8fCh0aGlzLiRpc0VtcHR5PSEwLHRoaXMuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpKX0sdGhpcy5zZWxlY3RBbGw9ZnVuY3Rpb24oKXt0aGlzLiRzZXRTZWxlY3Rpb24oMCwwLE51bWJlci5NQVhfVkFMVUUsTnVtYmVyLk1BWF9WQUxVRSl9LHRoaXMuc2V0UmFuZ2U9dGhpcy5zZXRTZWxlY3Rpb25SYW5nZT1mdW5jdGlvbihlLHQpe3ZhciBuPXQ/ZS5lbmQ6ZS5zdGFydCxyPXQ/ZS5zdGFydDplLmVuZDt0aGlzLiRzZXRTZWxlY3Rpb24obi5yb3csbi5jb2x1bW4sci5yb3csci5jb2x1bW4pfSx0aGlzLiRzZXRTZWxlY3Rpb249ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy4kaXNFbXB0eSxzPXRoaXMuaW5NdWx0aVNlbGVjdE1vZGU7dGhpcy4kc2lsZW50PSEwLHRoaXMuJGN1cnNvckNoYW5nZWQ9dGhpcy4kYW5jaG9yQ2hhbmdlZD0hMSx0aGlzLmFuY2hvci5zZXRQb3NpdGlvbihlLHQpLHRoaXMuY3Vyc29yLnNldFBvc2l0aW9uKG4sciksdGhpcy4kaXNFbXB0eT0hby5jb21wYXJlUG9pbnRzKHRoaXMuYW5jaG9yLHRoaXMuY3Vyc29yKSx0aGlzLiRzaWxlbnQ9ITEsdGhpcy4kY3Vyc29yQ2hhbmdlZCYmdGhpcy5fZW1pdCgiY2hhbmdlQ3Vyc29yIiksKHRoaXMuJGN1cnNvckNoYW5nZWR8fHRoaXMuJGFuY2hvckNoYW5nZWR8fGkhPXRoaXMuJGlzRW1wdHl8fHMpJiZ0aGlzLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKX0sdGhpcy4kbW92ZVNlbGVjdGlvbj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlYWQ7dGhpcy4kaXNFbXB0eSYmdGhpcy5zZXRTZWxlY3Rpb25BbmNob3IodC5yb3csdC5jb2x1bW4pLGUuY2FsbCh0aGlzKX0sdGhpcy5zZWxlY3RUbz1mdW5jdGlvbihlLHQpe3RoaXMuJG1vdmVTZWxlY3Rpb24oZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JUbyhlLHQpfSl9LHRoaXMuc2VsZWN0VG9Qb3NpdGlvbj1mdW5jdGlvbihlKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKGZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihlKX0pfSx0aGlzLm1vdmVUbz1mdW5jdGlvbihlLHQpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKSx0aGlzLm1vdmVDdXJzb3JUbyhlLHQpfSx0aGlzLm1vdmVUb1Bvc2l0aW9uPWZ1bmN0aW9uKGUpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKSx0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGUpfSx0aGlzLnNlbGVjdFVwPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JVcCl9LHRoaXMuc2VsZWN0RG93bj1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yRG93bil9LHRoaXMuc2VsZWN0UmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvclJpZ2h0KX0sdGhpcy5zZWxlY3RMZWZ0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JMZWZ0KX0sdGhpcy5zZWxlY3RMaW5lU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckxpbmVTdGFydCl9LHRoaXMuc2VsZWN0TGluZUVuZD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yTGluZUVuZCl9LHRoaXMuc2VsZWN0RmlsZUVuZD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yRmlsZUVuZCl9LHRoaXMuc2VsZWN0RmlsZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JGaWxlU3RhcnQpfSx0aGlzLnNlbGVjdFdvcmRSaWdodD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yV29yZFJpZ2h0KX0sdGhpcy5zZWxlY3RXb3JkTGVmdD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yV29yZExlZnQpfSx0aGlzLmdldFdvcmRSYW5nZT1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiB0PT0idW5kZWZpbmVkIil7dmFyIG49ZXx8dGhpcy5sZWFkO2U9bi5yb3csdD1uLmNvbHVtbn1yZXR1cm4gdGhpcy5zZXNzaW9uLmdldFdvcmRSYW5nZShlLHQpfSx0aGlzLnNlbGVjdFdvcmQ9ZnVuY3Rpb24oKXt0aGlzLnNldFNlbGVjdGlvblJhbmdlKHRoaXMuZ2V0V29yZFJhbmdlKCkpfSx0aGlzLnNlbGVjdEFXb3JkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRDdXJzb3IoKSx0PXRoaXMuc2Vzc2lvbi5nZXRBV29yZFJhbmdlKGUucm93LGUuY29sdW1uKTt0aGlzLnNldFNlbGVjdGlvblJhbmdlKHQpfSx0aGlzLmdldExpbmVSYW5nZT1mdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiBlPT0ibnVtYmVyIj9lOnRoaXMubGVhZC5yb3cscixpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkTGluZShuKTtyZXR1cm4gaT8obj1pLnN0YXJ0LnJvdyxyPWkuZW5kLnJvdyk6cj1uLHQ9PT0hMD9uZXcgbyhuLDAscix0aGlzLnNlc3Npb24uZ2V0TGluZShyKS5sZW5ndGgpOm5ldyBvKG4sMCxyKzEsMCl9LHRoaXMuc2VsZWN0TGluZT1mdW5jdGlvbigpe3RoaXMuc2V0U2VsZWN0aW9uUmFuZ2UodGhpcy5nZXRMaW5lUmFuZ2UoKSl9LHRoaXMubW92ZUN1cnNvclVwPWZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yQnkoLTEsMCl9LHRoaXMubW92ZUN1cnNvckRvd249ZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JCeSgxLDApfSx0aGlzLndvdWxkTW92ZUludG9Tb2Z0VGFiPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmNvbHVtbixpPWUuY29sdW1uK3Q7cmV0dXJuIG48MCYmKHI9ZS5jb2x1bW4tdCxpPWUuY29sdW1uKSx0aGlzLnNlc3Npb24uaXNUYWJTdG9wKGUpJiZ0aGlzLmRvYy5nZXRMaW5lKGUucm93KS5zbGljZShyLGkpLnNwbGl0KCIgIikubGVuZ3RoLTE9PXR9LHRoaXMubW92ZUN1cnNvckxlZnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQuZ2V0UG9zaXRpb24oKSx0O2lmKHQ9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLnJvdyxlLmNvbHVtbiwtMSkpdGhpcy5tb3ZlQ3Vyc29yVG8odC5zdGFydC5yb3csdC5zdGFydC5jb2x1bW4pO2Vsc2UgaWYoZS5jb2x1bW49PT0wKWUucm93PjAmJnRoaXMubW92ZUN1cnNvclRvKGUucm93LTEsdGhpcy5kb2MuZ2V0TGluZShlLnJvdy0xKS5sZW5ndGgpO2Vsc2V7dmFyIG49dGhpcy5zZXNzaW9uLmdldFRhYlNpemUoKTt0aGlzLndvdWxkTW92ZUludG9Tb2Z0VGFiKGUsbiwtMSkmJiF0aGlzLnNlc3Npb24uZ2V0TmF2aWdhdGVXaXRoaW5Tb2Z0VGFicygpP3RoaXMubW92ZUN1cnNvckJ5KDAsLW4pOnRoaXMubW92ZUN1cnNvckJ5KDAsLTEpfX0sdGhpcy5tb3ZlQ3Vyc29yUmlnaHQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQuZ2V0UG9zaXRpb24oKSx0O2lmKHQ9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLnJvdyxlLmNvbHVtbiwxKSl0aGlzLm1vdmVDdXJzb3JUbyh0LmVuZC5yb3csdC5lbmQuY29sdW1uKTtlbHNlIGlmKHRoaXMubGVhZC5jb2x1bW49PXRoaXMuZG9jLmdldExpbmUodGhpcy5sZWFkLnJvdykubGVuZ3RoKXRoaXMubGVhZC5yb3c8dGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSYmdGhpcy5tb3ZlQ3Vyc29yVG8odGhpcy5sZWFkLnJvdysxLDApO2Vsc2V7dmFyIG49dGhpcy5zZXNzaW9uLmdldFRhYlNpemUoKSxlPXRoaXMubGVhZDt0aGlzLndvdWxkTW92ZUludG9Tb2Z0VGFiKGUsbiwxKSYmIXRoaXMuc2Vzc2lvbi5nZXROYXZpZ2F0ZVdpdGhpblNvZnRUYWJzKCk/dGhpcy5tb3ZlQ3Vyc29yQnkoMCxuKTp0aGlzLm1vdmVDdXJzb3JCeSgwLDEpfX0sdGhpcy5tb3ZlQ3Vyc29yTGluZVN0YXJ0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLnJvdyx0PXRoaXMubGVhZC5jb2x1bW4sbj10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblJvdyhlLHQpLHI9dGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihuLDApLGk9dGhpcy5zZXNzaW9uLmdldERpc3BsYXlMaW5lKGUsbnVsbCxyLnJvdyxyLmNvbHVtbikscz1pLm1hdGNoKC9eXHMqLyk7c1swXS5sZW5ndGghPXQmJiF0aGlzLnNlc3Npb24uJHVzZUVtYWNzU3R5bGVMaW5lU3RhcnQmJihyLmNvbHVtbis9c1swXS5sZW5ndGgpLHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24ocil9LHRoaXMubW92ZUN1cnNvckxpbmVFbmQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQsdD10aGlzLnNlc3Npb24uZ2V0RG9jdW1lbnRMYXN0Um93Q29sdW1uUG9zaXRpb24oZS5yb3csZS5jb2x1bW4pO2lmKHRoaXMubGVhZC5jb2x1bW49PXQuY29sdW1uKXt2YXIgbj10aGlzLnNlc3Npb24uZ2V0TGluZSh0LnJvdyk7aWYodC5jb2x1bW49PW4ubGVuZ3RoKXt2YXIgcj1uLnNlYXJjaCgvXHMrJC8pO3I+MCYmKHQuY29sdW1uPXIpfX10aGlzLm1vdmVDdXJzb3JUbyh0LnJvdyx0LmNvbHVtbil9LHRoaXMubW92ZUN1cnNvckZpbGVFbmQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmRvYy5nZXRMZW5ndGgoKS0xLHQ9dGhpcy5kb2MuZ2V0TGluZShlKS5sZW5ndGg7dGhpcy5tb3ZlQ3Vyc29yVG8oZSx0KX0sdGhpcy5tb3ZlQ3Vyc29yRmlsZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yVG8oMCwwKX0sdGhpcy5tb3ZlQ3Vyc29yTG9uZ1dvcmRSaWdodD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZC5yb3csdD10aGlzLmxlYWQuY29sdW1uLG49dGhpcy5kb2MuZ2V0TGluZShlKSxyPW4uc3Vic3RyaW5nKHQpO3RoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleD0wLHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleD0wO3ZhciBpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZSx0LDEpO2lmKGkpe3RoaXMubW92ZUN1cnNvclRvKGkuZW5kLnJvdyxpLmVuZC5jb2x1bW4pO3JldHVybn10aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5leGVjKHIpJiYodCs9dGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4LHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleD0wLHI9bi5zdWJzdHJpbmcodCkpO2lmKHQ+PW4ubGVuZ3RoKXt0aGlzLm1vdmVDdXJzb3JUbyhlLG4ubGVuZ3RoKSx0aGlzLm1vdmVDdXJzb3JSaWdodCgpLGU8dGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSYmdGhpcy5tb3ZlQ3Vyc29yV29yZFJpZ2h0KCk7cmV0dXJufXRoaXMuc2Vzc2lvbi50b2tlblJlLmV4ZWMocikmJih0Kz10aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXgsdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4PTApLHRoaXMubW92ZUN1cnNvclRvKGUsdCl9LHRoaXMubW92ZUN1cnNvckxvbmdXb3JkTGVmdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZC5yb3csdD10aGlzLmxlYWQuY29sdW1uLG47aWYobj10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUsdCwtMSkpe3RoaXMubW92ZUN1cnNvclRvKG4uc3RhcnQucm93LG4uc3RhcnQuY29sdW1uKTtyZXR1cm59dmFyIHI9dGhpcy5zZXNzaW9uLmdldEZvbGRTdHJpbmdBdChlLHQsLTEpO3I9PW51bGwmJihyPXRoaXMuZG9jLmdldExpbmUoZSkuc3Vic3RyaW5nKDAsdCkpO3ZhciBzPWkuc3RyaW5nUmV2ZXJzZShyKTt0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXg9MCx0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg9MCx0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5leGVjKHMpJiYodC09dGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4LHM9cy5zbGljZSh0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXgpLHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleD0wKTtpZih0PD0wKXt0aGlzLm1vdmVDdXJzb3JUbyhlLDApLHRoaXMubW92ZUN1cnNvckxlZnQoKSxlPjAmJnRoaXMubW92ZUN1cnNvcldvcmRMZWZ0KCk7cmV0dXJufXRoaXMuc2Vzc2lvbi50b2tlblJlLmV4ZWMocykmJih0LT10aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXgsdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4PTApLHRoaXMubW92ZUN1cnNvclRvKGUsdCl9LHRoaXMuJHNob3J0V29yZEVuZEluZGV4PWZ1bmN0aW9uKGUpe3ZhciB0PTAsbixyPS9ccy8saT10aGlzLnNlc3Npb24udG9rZW5SZTtpLmxhc3RJbmRleD0wO2lmKHRoaXMuc2Vzc2lvbi50b2tlblJlLmV4ZWMoZSkpdD10aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg7ZWxzZXt3aGlsZSgobj1lW3RdKSYmci50ZXN0KG4pKXQrKztpZih0PDEpe2kubGFzdEluZGV4PTA7d2hpbGUoKG49ZVt0XSkmJiFpLnRlc3Qobikpe2kubGFzdEluZGV4PTAsdCsrO2lmKHIudGVzdChuKSl7aWYodD4yKXt0LS07YnJlYWt9d2hpbGUoKG49ZVt0XSkmJnIudGVzdChuKSl0Kys7aWYodD4yKWJyZWFrfX19fXJldHVybiBpLmxhc3RJbmRleD0wLHR9LHRoaXMubW92ZUN1cnNvclNob3J0V29yZFJpZ2h0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLnJvdyx0PXRoaXMubGVhZC5jb2x1bW4sbj10aGlzLmRvYy5nZXRMaW5lKGUpLHI9bi5zdWJzdHJpbmcodCksaT10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUsdCwxKTtpZihpKXJldHVybiB0aGlzLm1vdmVDdXJzb3JUbyhpLmVuZC5yb3csaS5lbmQuY29sdW1uKTtpZih0PT1uLmxlbmd0aCl7dmFyIHM9dGhpcy5kb2MuZ2V0TGVuZ3RoKCk7ZG8gZSsrLHI9dGhpcy5kb2MuZ2V0TGluZShlKTt3aGlsZShlPHMmJi9eXHMqJC8udGVzdChyKSk7L15ccysvLnRlc3Qocil8fChyPSIiKSx0PTB9dmFyIG89dGhpcy4kc2hvcnRXb3JkRW5kSW5kZXgocik7dGhpcy5tb3ZlQ3Vyc29yVG8oZSx0K28pfSx0aGlzLm1vdmVDdXJzb3JTaG9ydFdvcmRMZWZ0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLnJvdyx0PXRoaXMubGVhZC5jb2x1bW4sbjtpZihuPXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZSx0LC0xKSlyZXR1cm4gdGhpcy5tb3ZlQ3Vyc29yVG8obi5zdGFydC5yb3csbi5zdGFydC5jb2x1bW4pO3ZhciByPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKGUpLnN1YnN0cmluZygwLHQpO2lmKHQ9PT0wKXtkbyBlLS0scj10aGlzLmRvYy5nZXRMaW5lKGUpO3doaWxlKGU+MCYmL15ccyokLy50ZXN0KHIpKTt0PXIubGVuZ3RoLC9ccyskLy50ZXN0KHIpfHwocj0iIil9dmFyIHM9aS5zdHJpbmdSZXZlcnNlKHIpLG89dGhpcy4kc2hvcnRXb3JkRW5kSW5kZXgocyk7cmV0dXJuIHRoaXMubW92ZUN1cnNvclRvKGUsdC1vKX0sdGhpcy5tb3ZlQ3Vyc29yV29yZFJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLiRzZWxlY3RMb25nV29yZHM/dGhpcy5tb3ZlQ3Vyc29yTG9uZ1dvcmRSaWdodCgpOnRoaXMubW92ZUN1cnNvclNob3J0V29yZFJpZ2h0KCl9LHRoaXMubW92ZUN1cnNvcldvcmRMZWZ0PWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLiRzZWxlY3RMb25nV29yZHM/dGhpcy5tb3ZlQ3Vyc29yTG9uZ1dvcmRMZWZ0KCk6dGhpcy5tb3ZlQ3Vyc29yU2hvcnRXb3JkTGVmdCgpfSx0aGlzLm1vdmVDdXJzb3JCeT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5sZWFkLnJvdyx0aGlzLmxlYWQuY29sdW1uKSxyO3Q9PT0wJiYoZSE9PTAmJih0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmlzQmlkaVJvdyhuLnJvdyx0aGlzLmxlYWQucm93KT8ocj10aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmdldFBvc0xlZnQobi5jb2x1bW4pLG4uY29sdW1uPU1hdGgucm91bmQoci90aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmNoYXJXaWR0aHNbMF0pKTpyPW4uY29sdW1uKnRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuY2hhcldpZHRoc1swXSksdGhpcy4kZGVzaXJlZENvbHVtbj9uLmNvbHVtbj10aGlzLiRkZXNpcmVkQ29sdW1uOnRoaXMuJGRlc2lyZWRDb2x1bW49bi5jb2x1bW4pO3ZhciBpPXRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24obi5yb3crZSxuLmNvbHVtbixyKTtlIT09MCYmdD09PTAmJmkucm93PT09dGhpcy5sZWFkLnJvdyYmaS5jb2x1bW49PT10aGlzLmxlYWQuY29sdW1uJiZ0aGlzLnNlc3Npb24ubGluZVdpZGdldHMmJnRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0c1tpLnJvd10mJihpLnJvdz4wfHxlPjApJiZpLnJvdysrLHRoaXMubW92ZUN1cnNvclRvKGkucm93LGkuY29sdW1uK3QsdD09PTApfSx0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uPWZ1bmN0aW9uKGUpe3RoaXMubW92ZUN1cnNvclRvKGUucm93LGUuY29sdW1uKX0sdGhpcy5tb3ZlQ3Vyc29yVG89ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZSx0LDEpO3ImJihlPXIuc3RhcnQucm93LHQ9ci5zdGFydC5jb2x1bW4pLHRoaXMuJGtlZXBEZXNpcmVkQ29sdW1uT25DaGFuZ2U9ITA7dmFyIGk9dGhpcy5zZXNzaW9uLmdldExpbmUoZSk7L1tcdURDMDAtXHVERkZGXS8udGVzdChpLmNoYXJBdCh0KSkmJmkuY2hhckF0KHQtMSkmJih0aGlzLmxlYWQucm93PT1lJiZ0aGlzLmxlYWQuY29sdW1uPT10KzE/dC09MTp0Kz0xKSx0aGlzLmxlYWQuc2V0UG9zaXRpb24oZSx0KSx0aGlzLiRrZWVwRGVzaXJlZENvbHVtbk9uQ2hhbmdlPSExLG58fCh0aGlzLiRkZXNpcmVkQ29sdW1uPW51bGwpfSx0aGlzLm1vdmVDdXJzb3JUb1NjcmVlbj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihlLHQpO3RoaXMubW92ZUN1cnNvclRvKHIucm93LHIuY29sdW1uLG4pfSx0aGlzLmRldGFjaD1mdW5jdGlvbigpe3RoaXMubGVhZC5kZXRhY2goKSx0aGlzLmFuY2hvci5kZXRhY2goKSx0aGlzLnNlc3Npb249dGhpcy5kb2M9bnVsbH0sdGhpcy5mcm9tT3JpZW50ZWRSYW5nZT1mdW5jdGlvbihlKXt0aGlzLnNldFNlbGVjdGlvblJhbmdlKGUsZS5jdXJzb3I9PWUuc3RhcnQpLHRoaXMuJGRlc2lyZWRDb2x1bW49ZS5kZXNpcmVkQ29sdW1ufHx0aGlzLiRkZXNpcmVkQ29sdW1ufSx0aGlzLnRvT3JpZW50ZWRSYW5nZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldFJhbmdlKCk7cmV0dXJuIGU/KGUuc3RhcnQuY29sdW1uPXQuc3RhcnQuY29sdW1uLGUuc3RhcnQucm93PXQuc3RhcnQucm93LGUuZW5kLmNvbHVtbj10LmVuZC5jb2x1bW4sZS5lbmQucm93PXQuZW5kLnJvdyk6ZT10LGUuY3Vyc29yPXRoaXMuaXNCYWNrd2FyZHMoKT9lLnN0YXJ0OmUuZW5kLGUuZGVzaXJlZENvbHVtbj10aGlzLiRkZXNpcmVkQ29sdW1uLGV9LHRoaXMuZ2V0UmFuZ2VPZk1vdmVtZW50cz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldEN1cnNvcigpO3RyeXtlKHRoaXMpO3ZhciBuPXRoaXMuZ2V0Q3Vyc29yKCk7cmV0dXJuIG8uZnJvbVBvaW50cyh0LG4pfWNhdGNoKHIpe3JldHVybiBvLmZyb21Qb2ludHModCx0KX1maW5hbGx5e3RoaXMubW92ZUN1cnNvclRvUG9zaXRpb24odCl9fSx0aGlzLnRvSlNPTj1mdW5jdGlvbigpe2lmKHRoaXMucmFuZ2VDb3VudCl2YXIgZT10aGlzLnJhbmdlcy5tYXAoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jbG9uZSgpO3JldHVybiB0LmlzQmFja3dhcmRzPWUuY3Vyc29yPT1lLnN0YXJ0LHR9KTtlbHNle3ZhciBlPXRoaXMuZ2V0UmFuZ2UoKTtlLmlzQmFja3dhcmRzPXRoaXMuaXNCYWNrd2FyZHMoKX1yZXR1cm4gZX0sdGhpcy5mcm9tSlNPTj1mdW5jdGlvbihlKXtpZihlLnN0YXJ0PT11bmRlZmluZWQpe2lmKHRoaXMucmFuZ2VMaXN0JiZlLmxlbmd0aD4xKXt0aGlzLnRvU2luZ2xlUmFuZ2UoZVswXSk7Zm9yKHZhciB0PWUubGVuZ3RoO3QtLTspe3ZhciBuPW8uZnJvbVBvaW50cyhlW3RdLnN0YXJ0LGVbdF0uZW5kKTtlW3RdLmlzQmFja3dhcmRzJiYobi5jdXJzb3I9bi5zdGFydCksdGhpcy5hZGRSYW5nZShuLCEwKX1yZXR1cm59ZT1lWzBdfXRoaXMucmFuZ2VMaXN0JiZ0aGlzLnRvU2luZ2xlUmFuZ2UoZSksdGhpcy5zZXRTZWxlY3Rpb25SYW5nZShlLGUuaXNCYWNrd2FyZHMpfSx0aGlzLmlzRXF1YWw9ZnVuY3Rpb24oZSl7aWYoKGUubGVuZ3RofHx0aGlzLnJhbmdlQ291bnQpJiZlLmxlbmd0aCE9dGhpcy5yYW5nZUNvdW50KXJldHVybiExO2lmKCFlLmxlbmd0aHx8IXRoaXMucmFuZ2VzKXJldHVybiB0aGlzLmdldFJhbmdlKCkuaXNFcXVhbChlKTtmb3IodmFyIHQ9dGhpcy5yYW5nZXMubGVuZ3RoO3QtLTspaWYoIXRoaXMucmFuZ2VzW3RdLmlzRXF1YWwoZVt0XSkpcmV0dXJuITE7cmV0dXJuITB9fSkuY2FsbCh1LnByb3RvdHlwZSksdC5TZWxlY3Rpb249dX0pLGFjZS5kZWZpbmUoImFjZS90b2tlbml6ZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvY29uZmlnIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2NvbmZpZyIpLGk9MmUzLHM9ZnVuY3Rpb24oZSl7dGhpcy5zdGF0ZXM9ZSx0aGlzLnJlZ0V4cHM9e30sdGhpcy5tYXRjaE1hcHBpbmdzPXt9O2Zvcih2YXIgdCBpbiB0aGlzLnN0YXRlcyl7dmFyIG49dGhpcy5zdGF0ZXNbdF0scj1bXSxpPTAscz10aGlzLm1hdGNoTWFwcGluZ3NbdF09e2RlZmF1bHRUb2tlbjoidGV4dCJ9LG89ImciLHU9W107Zm9yKHZhciBhPTA7YTxuLmxlbmd0aDthKyspe3ZhciBmPW5bYV07Zi5kZWZhdWx0VG9rZW4mJihzLmRlZmF1bHRUb2tlbj1mLmRlZmF1bHRUb2tlbiksZi5jYXNlSW5zZW5zaXRpdmUmJihvPSJnaSIpO2lmKGYucmVnZXg9PW51bGwpY29udGludWU7Zi5yZWdleCBpbnN0YW5jZW9mIFJlZ0V4cCYmKGYucmVnZXg9Zi5yZWdleC50b1N0cmluZygpLnNsaWNlKDEsLTEpKTt2YXIgbD1mLnJlZ2V4LGM9KG5ldyBSZWdFeHAoIig/OigiK2wrIil8KC4pKSIpKS5leGVjKCJhIikubGVuZ3RoLTI7QXJyYXkuaXNBcnJheShmLnRva2VuKT9mLnRva2VuLmxlbmd0aD09MXx8Yz09MT9mLnRva2VuPWYudG9rZW5bMF06Yy0xIT1mLnRva2VuLmxlbmd0aD8odGhpcy5yZXBvcnRFcnJvcigibnVtYmVyIG9mIGNsYXNzZXMgYW5kIHJlZ2V4cCBncm91cHMgZG9lc24ndCBtYXRjaCIse3J1bGU6Zixncm91cENvdW50OmMtMX0pLGYudG9rZW49Zi50b2tlblswXSk6KGYudG9rZW5BcnJheT1mLnRva2VuLGYudG9rZW49bnVsbCxmLm9uTWF0Y2g9dGhpcy4kYXJyYXlUb2tlbnMpOnR5cGVvZiBmLnRva2VuPT0iZnVuY3Rpb24iJiYhZi5vbk1hdGNoJiYoYz4xP2Yub25NYXRjaD10aGlzLiRhcHBseVRva2VuOmYub25NYXRjaD1mLnRva2VuKSxjPjEmJigvXFxcZC8udGVzdChmLnJlZ2V4KT9sPWYucmVnZXgucmVwbGFjZSgvXFwoWzAtOV0rKS9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIlxcIisocGFyc2VJbnQodCwxMCkraSsxKX0pOihjPTEsbD10aGlzLnJlbW92ZUNhcHR1cmluZ0dyb3VwcyhmLnJlZ2V4KSksIWYuc3BsaXRSZWdleCYmdHlwZW9mIGYudG9rZW4hPSJzdHJpbmciJiZ1LnB1c2goZikpLHNbaV09YSxpKz1jLHIucHVzaChsKSxmLm9uTWF0Y2h8fChmLm9uTWF0Y2g9bnVsbCl9ci5sZW5ndGh8fChzWzBdPTAsci5wdXNoKCIkIikpLHUuZm9yRWFjaChmdW5jdGlvbihlKXtlLnNwbGl0UmVnZXg9dGhpcy5jcmVhdGVTcGxpdHRlclJlZ2V4cChlLnJlZ2V4LG8pfSx0aGlzKSx0aGlzLnJlZ0V4cHNbdF09bmV3IFJlZ0V4cCgiKCIrci5qb2luKCIpfCgiKSsiKXwoJCkiLG8pfX07KGZ1bmN0aW9uKCl7dGhpcy4kc2V0TWF4VG9rZW5Db3VudD1mdW5jdGlvbihlKXtpPWV8MH0sdGhpcy4kYXBwbHlUb2tlbj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNwbGl0UmVnZXguZXhlYyhlKS5zbGljZSgxKSxuPXRoaXMudG9rZW4uYXBwbHkodGhpcyx0KTtpZih0eXBlb2Ygbj09InN0cmluZyIpcmV0dXJuW3t0eXBlOm4sdmFsdWU6ZX1dO3ZhciByPVtdO2Zvcih2YXIgaT0wLHM9bi5sZW5ndGg7aTxzO2krKyl0W2ldJiYocltyLmxlbmd0aF09e3R5cGU6bltpXSx2YWx1ZTp0W2ldfSk7cmV0dXJuIHJ9LHRoaXMuJGFycmF5VG9rZW5zPWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybltdO3ZhciB0PXRoaXMuc3BsaXRSZWdleC5leGVjKGUpO2lmKCF0KXJldHVybiJ0ZXh0Ijt2YXIgbj1bXSxyPXRoaXMudG9rZW5BcnJheTtmb3IodmFyIGk9MCxzPXIubGVuZ3RoO2k8cztpKyspdFtpKzFdJiYobltuLmxlbmd0aF09e3R5cGU6cltpXSx2YWx1ZTp0W2krMV19KTtyZXR1cm4gbn0sdGhpcy5yZW1vdmVDYXB0dXJpbmdHcm91cHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKC9cXC58XFsoPzpcXC58W15cXFxdXSkqfFwoXD9bOj0hXXwoXCgpL2csZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8iKD86IjplfSk7cmV0dXJuIHR9LHRoaXMuY3JlYXRlU3BsaXR0ZXJSZWdleHA9ZnVuY3Rpb24oZSx0KXtpZihlLmluZGV4T2YoIig/PSIpIT0tMSl7dmFyIG49MCxyPSExLGk9e307ZS5yZXBsYWNlKC8oXFwuKXwoXCgoPzpcP1s9IV0pPyl8KFwpKXwoW1xbXF1dKS9nLGZ1bmN0aW9uKGUsdCxzLG8sdSxhKXtyZXR1cm4gcj9yPXUhPSJdIjp1P3I9ITA6bz8obj09aS5zdGFjayYmKGkuZW5kPWErMSxpLnN0YWNrPS0xKSxuLS0pOnMmJihuKysscy5sZW5ndGghPTEmJihpLnN0YWNrPW4saS5zdGFydD1hKSksZX0pLGkuZW5kIT1udWxsJiYvXlwpKiQvLnRlc3QoZS5zdWJzdHIoaS5lbmQpKSYmKGU9ZS5zdWJzdHJpbmcoMCxpLnN0YXJ0KStlLnN1YnN0cihpLmVuZCkpfXJldHVybiBlLmNoYXJBdCgwKSE9Il4iJiYoZT0iXiIrZSksZS5jaGFyQXQoZS5sZW5ndGgtMSkhPSIkIiYmKGUrPSIkIiksbmV3IFJlZ0V4cChlLCh0fHwiIikucmVwbGFjZSgiZyIsIiIpKX0sdGhpcy5nZXRMaW5lVG9rZW5zPWZ1bmN0aW9uKGUsdCl7aWYodCYmdHlwZW9mIHQhPSJzdHJpbmciKXt2YXIgbj10LnNsaWNlKDApO3Q9blswXSx0PT09IiN0bXAiJiYobi5zaGlmdCgpLHQ9bi5zaGlmdCgpKX1lbHNlIHZhciBuPVtdO3ZhciByPXR8fCJzdGFydCIscz10aGlzLnN0YXRlc1tyXTtzfHwocj0ic3RhcnQiLHM9dGhpcy5zdGF0ZXNbcl0pO3ZhciBvPXRoaXMubWF0Y2hNYXBwaW5nc1tyXSx1PXRoaXMucmVnRXhwc1tyXTt1Lmxhc3RJbmRleD0wO3ZhciBhLGY9W10sbD0wLGM9MCxoPXt0eXBlOm51bGwsdmFsdWU6IiJ9O3doaWxlKGE9dS5leGVjKGUpKXt2YXIgcD1vLmRlZmF1bHRUb2tlbixkPW51bGwsdj1hWzBdLG09dS5sYXN0SW5kZXg7aWYobS12Lmxlbmd0aD5sKXt2YXIgZz1lLnN1YnN0cmluZyhsLG0tdi5sZW5ndGgpO2gudHlwZT09cD9oLnZhbHVlKz1nOihoLnR5cGUmJmYucHVzaChoKSxoPXt0eXBlOnAsdmFsdWU6Z30pfWZvcih2YXIgeT0wO3k8YS5sZW5ndGgtMjt5Kyspe2lmKGFbeSsxXT09PXVuZGVmaW5lZCljb250aW51ZTtkPXNbb1t5XV0sZC5vbk1hdGNoP3A9ZC5vbk1hdGNoKHYscixuLGUpOnA9ZC50b2tlbixkLm5leHQmJih0eXBlb2YgZC5uZXh0PT0ic3RyaW5nIj9yPWQubmV4dDpyPWQubmV4dChyLG4pLHM9dGhpcy5zdGF0ZXNbcl0sc3x8KHRoaXMucmVwb3J0RXJyb3IoInN0YXRlIGRvZXNuJ3QgZXhpc3QiLHIpLHI9InN0YXJ0IixzPXRoaXMuc3RhdGVzW3JdKSxvPXRoaXMubWF0Y2hNYXBwaW5nc1tyXSxsPW0sdT10aGlzLnJlZ0V4cHNbcl0sdS5sYXN0SW5kZXg9bSksZC5jb25zdW1lTGluZUVuZCYmKGw9bSk7YnJlYWt9aWYodilpZih0eXBlb2YgcD09InN0cmluZyIpISFkJiZkLm1lcmdlPT09ITF8fGgudHlwZSE9PXA/KGgudHlwZSYmZi5wdXNoKGgpLGg9e3R5cGU6cCx2YWx1ZTp2fSk6aC52YWx1ZSs9djtlbHNlIGlmKHApe2gudHlwZSYmZi5wdXNoKGgpLGg9e3R5cGU6bnVsbCx2YWx1ZToiIn07Zm9yKHZhciB5PTA7eTxwLmxlbmd0aDt5KyspZi5wdXNoKHBbeV0pfWlmKGw9PWUubGVuZ3RoKWJyZWFrO2w9bTtpZihjKys+aSl7Yz4yKmUubGVuZ3RoJiZ0aGlzLnJlcG9ydEVycm9yKCJpbmZpbml0ZSBsb29wIHdpdGggaW4gYWNlIHRva2VuaXplciIse3N0YXJ0U3RhdGU6dCxsaW5lOmV9KTt3aGlsZShsPGUubGVuZ3RoKWgudHlwZSYmZi5wdXNoKGgpLGg9e3ZhbHVlOmUuc3Vic3RyaW5nKGwsbCs9NTAwKSx0eXBlOiJvdmVyZmxvdyJ9O3I9InN0YXJ0IixuPVtdO2JyZWFrfX1yZXR1cm4gaC50eXBlJiZmLnB1c2goaCksbi5sZW5ndGg+MSYmblswXSE9PXImJm4udW5zaGlmdCgiI3RtcCIscikse3Rva2VuczpmLHN0YXRlOm4ubGVuZ3RoP246cn19LHRoaXMucmVwb3J0RXJyb3I9ci5yZXBvcnRFcnJvcn0pLmNhbGwocy5wcm90b3R5cGUpLHQuVG9rZW5pemVyPXN9KSxhY2UuZGVmaW5lKCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL2xhbmciKSxpPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImVtcHR5X2xpbmUiLHJlZ2V4OiJeJCJ9LHtkZWZhdWx0VG9rZW46InRleHQifV19fTsoZnVuY3Rpb24oKXt0aGlzLmFkZFJ1bGVzPWZ1bmN0aW9uKGUsdCl7aWYoIXQpe2Zvcih2YXIgbiBpbiBlKXRoaXMuJHJ1bGVzW25dPWVbbl07cmV0dXJufWZvcih2YXIgbiBpbiBlKXt2YXIgcj1lW25dO2Zvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgcz1yW2ldO2lmKHMubmV4dHx8cy5vbk1hdGNoKXR5cGVvZiBzLm5leHQ9PSJzdHJpbmciJiZzLm5leHQuaW5kZXhPZih0KSE9PTAmJihzLm5leHQ9dCtzLm5leHQpLHMubmV4dFN0YXRlJiZzLm5leHRTdGF0ZS5pbmRleE9mKHQpIT09MCYmKHMubmV4dFN0YXRlPXQrcy5uZXh0U3RhdGUpfXRoaXMuJHJ1bGVzW3Qrbl09cn19LHRoaXMuZ2V0UnVsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcnVsZXN9LHRoaXMuZW1iZWRSdWxlcz1mdW5jdGlvbihlLHQsbixpLHMpe3ZhciBvPXR5cGVvZiBlPT0iZnVuY3Rpb24iPyhuZXcgZSkuZ2V0UnVsZXMoKTplO2lmKGkpZm9yKHZhciB1PTA7dTxpLmxlbmd0aDt1KyspaVt1XT10K2lbdV07ZWxzZXtpPVtdO2Zvcih2YXIgYSBpbiBvKWkucHVzaCh0K2EpfXRoaXMuYWRkUnVsZXMobyx0KTtpZihuKXt2YXIgZj1BcnJheS5wcm90b3R5cGVbcz8icHVzaCI6InVuc2hpZnQiXTtmb3IodmFyIHU9MDt1PGkubGVuZ3RoO3UrKylmLmFwcGx5KHRoaXMuJHJ1bGVzW2lbdV1dLHIuZGVlcENvcHkobikpfXRoaXMuJGVtYmVkc3x8KHRoaXMuJGVtYmVkcz1bXSksdGhpcy4kZW1iZWRzLnB1c2godCl9LHRoaXMuZ2V0RW1iZWRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGVtYmVkc307dmFyIGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZSE9InN0YXJ0Inx8dC5sZW5ndGgpJiZ0LnVuc2hpZnQodGhpcy5uZXh0U3RhdGUsZSksdGhpcy5uZXh0U3RhdGV9LHQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5zaGlmdCgpLHQuc2hpZnQoKXx8InN0YXJ0In07dGhpcy5ub3JtYWxpemVSdWxlcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGkocyl7dmFyIG89cltzXTtvLnByb2Nlc3NlZD0hMDtmb3IodmFyIHU9MDt1PG8ubGVuZ3RoO3UrKyl7dmFyIGE9b1t1XSxmPW51bGw7QXJyYXkuaXNBcnJheShhKSYmKGY9YSxhPXt9KSwhYS5yZWdleCYmYS5zdGFydCYmKGEucmVnZXg9YS5zdGFydCxhLm5leHR8fChhLm5leHQ9W10pLGEubmV4dC5wdXNoKHtkZWZhdWx0VG9rZW46YS50b2tlbn0se3Rva2VuOmEudG9rZW4rIi5lbmQiLHJlZ2V4OmEuZW5kfHxhLnN0YXJ0LG5leHQ6InBvcCJ9KSxhLnRva2VuPWEudG9rZW4rIi5zdGFydCIsYS5wdXNoPSEwKTt2YXIgbD1hLm5leHR8fGEucHVzaDtpZihsJiZBcnJheS5pc0FycmF5KGwpKXt2YXIgYz1hLnN0YXRlTmFtZTtjfHwoYz1hLnRva2VuLHR5cGVvZiBjIT0ic3RyaW5nIiYmKGM9Y1swXXx8IiIpLHJbY10mJihjKz1uKyspKSxyW2NdPWwsYS5uZXh0PWMsaShjKX1lbHNlIGw9PSJwb3AiJiYoYS5uZXh0PXQpO2EucHVzaCYmKGEubmV4dFN0YXRlPWEubmV4dHx8YS5wdXNoLGEubmV4dD1lLGRlbGV0ZSBhLnB1c2gpO2lmKGEucnVsZXMpZm9yKHZhciBoIGluIGEucnVsZXMpcltoXT9yW2hdLnB1c2gmJnJbaF0ucHVzaC5hcHBseShyW2hdLGEucnVsZXNbaF0pOnJbaF09YS5ydWxlc1toXTt2YXIgcD10eXBlb2YgYT09InN0cmluZyI/YTphLmluY2x1ZGU7cCYmKEFycmF5LmlzQXJyYXkocCk/Zj1wLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gcltlXX0pOmY9cltwXSk7aWYoZil7dmFyIGQ9W3UsMV0uY29uY2F0KGYpO2Eubm9Fc2NhcGUmJihkPWQuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLm5leHR9KSksby5zcGxpY2UuYXBwbHkobyxkKSx1LS19YS5rZXl3b3JkTWFwJiYoYS50b2tlbj10aGlzLmNyZWF0ZUtleXdvcmRNYXBwZXIoYS5rZXl3b3JkTWFwLGEuZGVmYXVsdFRva2VufHwidGV4dCIsYS5jYXNlSW5zZW5zaXRpdmUpLGRlbGV0ZSBhLmRlZmF1bHRUb2tlbil9fXZhciBuPTAscj10aGlzLiRydWxlcztPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGksdGhpcyl9LHRoaXMuY3JlYXRlS2V5d29yZE1hcHBlcj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBzPWVbdF07biYmKHM9cy50b0xvd2VyQ2FzZSgpKTt2YXIgbz1zLnNwbGl0KHJ8fCJ8Iik7Zm9yKHZhciB1PW8ubGVuZ3RoO3UtLTspaVtvW3VdXT10fSksT2JqZWN0LmdldFByb3RvdHlwZU9mKGkpJiYoaS5fX3Byb3RvX189bnVsbCksdGhpcy4ka2V5d29yZExpc3Q9T2JqZWN0LmtleXMoaSksZT1udWxsLG4/ZnVuY3Rpb24oZSl7cmV0dXJuIGlbZS50b0xvd2VyQ2FzZSgpXXx8dH06ZnVuY3Rpb24oZSl7cmV0dXJuIGlbZV18fHR9fSx0aGlzLmdldEtleXdvcmRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGtleXdvcmRzfX0pLmNhbGwoaS5wcm90b3R5cGUpLHQuVGV4dEhpZ2hsaWdodFJ1bGVzPWl9KSxhY2UuZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWZ1bmN0aW9uKCl7dGhpcy4kYmVoYXZpb3Vycz17fX07KGZ1bmN0aW9uKCl7dGhpcy5hZGQ9ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaCh1bmRlZmluZWQpe2Nhc2UgdGhpcy4kYmVoYXZpb3Vyczp0aGlzLiRiZWhhdmlvdXJzPXt9O2Nhc2UgdGhpcy4kYmVoYXZpb3Vyc1tlXTp0aGlzLiRiZWhhdmlvdXJzW2VdPXt9fXRoaXMuJGJlaGF2aW91cnNbZV1bdF09bn0sdGhpcy5hZGRCZWhhdmlvdXJzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBlKWZvcih2YXIgbiBpbiBlW3RdKXRoaXMuYWRkKHQsbixlW3RdW25dKX0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oZSl7dGhpcy4kYmVoYXZpb3VycyYmdGhpcy4kYmVoYXZpb3Vyc1tlXSYmZGVsZXRlIHRoaXMuJGJlaGF2aW91cnNbZV19LHRoaXMuaW5oZXJpdD1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXZhciBuPShuZXcgZSkuZ2V0QmVoYXZpb3Vycyh0KTtlbHNlIHZhciBuPWUuZ2V0QmVoYXZpb3Vycyh0KTt0aGlzLmFkZEJlaGF2aW91cnMobil9LHRoaXMuZ2V0QmVoYXZpb3Vycz1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4gdGhpcy4kYmVoYXZpb3Vyczt2YXIgdD17fTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0aGlzLiRiZWhhdmlvdXJzW2Vbbl1dJiYodFtlW25dXT10aGlzLiRiZWhhdmlvdXJzW2Vbbl1dKTtyZXR1cm4gdH19KS5jYWxsKHIucHJvdG90eXBlKSx0LkJlaGF2aW91cj1yfSksYWNlLmRlZmluZSgiYWNlL3Rva2VuX2l0ZXJhdG9yIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL3JhbmdlIikuUmFuZ2UsaT1mdW5jdGlvbihlLHQsbil7dGhpcy4kc2Vzc2lvbj1lLHRoaXMuJHJvdz10LHRoaXMuJHJvd1Rva2Vucz1lLmdldFRva2Vucyh0KTt2YXIgcj1lLmdldFRva2VuQXQodCxuKTt0aGlzLiR0b2tlbkluZGV4PXI/ci5pbmRleDotMX07KGZ1bmN0aW9uKCl7dGhpcy5zdGVwQmFja3dhcmQ9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbkluZGV4LT0xO3doaWxlKHRoaXMuJHRva2VuSW5kZXg8MCl7dGhpcy4kcm93LT0xO2lmKHRoaXMuJHJvdzwwKXJldHVybiB0aGlzLiRyb3c9MCxudWxsO3RoaXMuJHJvd1Rva2Vucz10aGlzLiRzZXNzaW9uLmdldFRva2Vucyh0aGlzLiRyb3cpLHRoaXMuJHRva2VuSW5kZXg9dGhpcy4kcm93VG9rZW5zLmxlbmd0aC0xfXJldHVybiB0aGlzLiRyb3dUb2tlbnNbdGhpcy4kdG9rZW5JbmRleF19LHRoaXMuc3RlcEZvcndhcmQ9ZnVuY3Rpb24oKXt0aGlzLiR0b2tlbkluZGV4Kz0xO3ZhciBlO3doaWxlKHRoaXMuJHRva2VuSW5kZXg+PXRoaXMuJHJvd1Rva2Vucy5sZW5ndGgpe3RoaXMuJHJvdys9MSxlfHwoZT10aGlzLiRzZXNzaW9uLmdldExlbmd0aCgpKTtpZih0aGlzLiRyb3c+PWUpcmV0dXJuIHRoaXMuJHJvdz1lLTEsbnVsbDt0aGlzLiRyb3dUb2tlbnM9dGhpcy4kc2Vzc2lvbi5nZXRUb2tlbnModGhpcy4kcm93KSx0aGlzLiR0b2tlbkluZGV4PTB9cmV0dXJuIHRoaXMuJHJvd1Rva2Vuc1t0aGlzLiR0b2tlbkluZGV4XX0sdGhpcy5nZXRDdXJyZW50VG9rZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdfSx0aGlzLmdldEN1cnJlbnRUb2tlblJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyb3d9LHRoaXMuZ2V0Q3VycmVudFRva2VuQ29sdW1uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kcm93VG9rZW5zLHQ9dGhpcy4kdG9rZW5JbmRleCxuPWVbdF0uc3RhcnQ7aWYobiE9PXVuZGVmaW5lZClyZXR1cm4gbjtuPTA7d2hpbGUodD4wKXQtPTEsbis9ZVt0XS52YWx1ZS5sZW5ndGg7cmV0dXJuIG59LHRoaXMuZ2V0Q3VycmVudFRva2VuUG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm57cm93OnRoaXMuJHJvdyxjb2x1bW46dGhpcy5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKX19LHRoaXMuZ2V0Q3VycmVudFRva2VuUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRyb3dUb2tlbnNbdGhpcy4kdG9rZW5JbmRleF0sdD10aGlzLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpO3JldHVybiBuZXcgcih0aGlzLiRyb3csdCx0aGlzLiRyb3csdCtlLnZhbHVlLmxlbmd0aCl9fSkuY2FsbChpLnByb3RvdHlwZSksdC5Ub2tlbkl0ZXJhdG9yPWl9KSxhY2UuZGVmaW5lKCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9iZWhhdmlvdXIiLCJhY2UvdG9rZW5faXRlcmF0b3IiLCJhY2UvbGliL2xhbmciXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uLy4uL2xpYi9vb3AiKSxpPWUoIi4uL2JlaGF2aW91ciIpLkJlaGF2aW91cixzPWUoIi4uLy4uL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcixvPWUoIi4uLy4uL2xpYi9sYW5nIiksdT1bInRleHQiLCJwYXJlbi5ycGFyZW4iLCJycGFyZW4iLCJwYXJlbiIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIl0sYT1bInRleHQiLCJwYXJlbi5ycGFyZW4iLCJycGFyZW4iLCJwYXJlbiIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwiY29tbWVudCJdLGYsbD17fSxjPXsnIic6JyInLCInIjoiJyJ9LGg9ZnVuY3Rpb24oZSl7dmFyIHQ9LTE7ZS5tdWx0aVNlbGVjdCYmKHQ9ZS5zZWxlY3Rpb24uaW5kZXgsbC5yYW5nZUNvdW50IT1lLm11bHRpU2VsZWN0LnJhbmdlQ291bnQmJihsPXtyYW5nZUNvdW50OmUubXVsdGlTZWxlY3QucmFuZ2VDb3VudH0pKTtpZihsW3RdKXJldHVybiBmPWxbdF07Zj1sW3RdPXthdXRvSW5zZXJ0ZWRCcmFja2V0czowLGF1dG9JbnNlcnRlZFJvdzotMSxhdXRvSW5zZXJ0ZWRMaW5lRW5kOiIiLG1heWJlSW5zZXJ0ZWRCcmFja2V0czowLG1heWJlSW5zZXJ0ZWRSb3c6LTEsbWF5YmVJbnNlcnRlZExpbmVTdGFydDoiIixtYXliZUluc2VydGVkTGluZUVuZDoiIn19LHA9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ZS5lbmQucm93LWUuc3RhcnQucm93O3JldHVybnt0ZXh0Om4rdCtyLHNlbGVjdGlvbjpbMCxlLnN0YXJ0LmNvbHVtbisxLGksZS5lbmQuY29sdW1uKyhpPzA6MSldfX0sZD1mdW5jdGlvbihlKXt0aGlzLmFkZCgiYnJhY2VzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbih0LG4scixpLHMpe3ZhciB1PXIuZ2V0Q3Vyc29yUG9zaXRpb24oKSxhPWkuZG9jLmdldExpbmUodS5yb3cpO2lmKHM9PSJ7Iil7aChyKTt2YXIgbD1yLmdldFNlbGVjdGlvblJhbmdlKCksYz1pLmRvYy5nZXRUZXh0UmFuZ2UobCk7aWYoYyE9PSIiJiZjIT09InsiJiZyLmdldFdyYXBCZWhhdmlvdXJzRW5hYmxlZCgpKXJldHVybiBwKGwsYywieyIsIn0iKTtpZihkLmlzU2FuZUluc2VydGlvbihyLGkpKXJldHVybi9bXF1cfVwpXS8udGVzdChhW3UuY29sdW1uXSl8fHIuaW5NdWx0aVNlbGVjdE1vZGV8fGUmJmUuYnJhY2VzPyhkLnJlY29yZEF1dG9JbnNlcnQocixpLCJ9Iikse3RleHQ6Int9IixzZWxlY3Rpb246WzEsMV19KTooZC5yZWNvcmRNYXliZUluc2VydChyLGksInsiKSx7dGV4dDoieyIsc2VsZWN0aW9uOlsxLDFdfSl9ZWxzZSBpZihzPT0ifSIpe2gocik7dmFyIHY9YS5zdWJzdHJpbmcodS5jb2x1bW4sdS5jb2x1bW4rMSk7aWYodj09In0iKXt2YXIgbT1pLiRmaW5kT3BlbmluZ0JyYWNrZXQoIn0iLHtjb2x1bW46dS5jb2x1bW4rMSxyb3c6dS5yb3d9KTtpZihtIT09bnVsbCYmZC5pc0F1dG9JbnNlcnRlZENsb3NpbmcodSxhLHMpKXJldHVybiBkLnBvcEF1dG9JbnNlcnRlZENsb3NpbmcoKSx7dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX1lbHNle2lmKHM9PSJcbiJ8fHM9PSJcclxuIil7aChyKTt2YXIgZz0iIjtkLmlzTWF5YmVJbnNlcnRlZENsb3NpbmcodSxhKSYmKGc9by5zdHJpbmdSZXBlYXQoIn0iLGYubWF5YmVJbnNlcnRlZEJyYWNrZXRzKSxkLmNsZWFyTWF5YmVJbnNlcnRlZENsb3NpbmcoKSk7dmFyIHY9YS5zdWJzdHJpbmcodS5jb2x1bW4sdS5jb2x1bW4rMSk7aWYodj09PSJ9Iil7dmFyIHk9aS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6dS5yb3csY29sdW1uOnUuY29sdW1uKzF9LCJ9Iik7aWYoIXkpcmV0dXJuIG51bGw7dmFyIGI9dGhpcy4kZ2V0SW5kZW50KGkuZ2V0TGluZSh5LnJvdykpfWVsc2V7aWYoIWcpe2QuY2xlYXJNYXliZUluc2VydGVkQ2xvc2luZygpO3JldHVybn12YXIgYj10aGlzLiRnZXRJbmRlbnQoYSl9dmFyIHc9YitpLmdldFRhYlN0cmluZygpO3JldHVybnt0ZXh0OiJcbiIrdysiXG4iK2IrZyxzZWxlY3Rpb246WzEsdy5sZW5ndGgsMSx3Lmxlbmd0aF19fWQuY2xlYXJNYXliZUluc2VydGVkQ2xvc2luZygpfX0pLHRoaXMuYWRkKCJicmFjZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz1yLmRvYy5nZXRUZXh0UmFuZ2UoaSk7aWYoIWkuaXNNdWx0aUxpbmUoKSYmcz09InsiKXtoKG4pO3ZhciBvPXIuZG9jLmdldExpbmUoaS5zdGFydC5yb3cpLHU9by5zdWJzdHJpbmcoaS5lbmQuY29sdW1uLGkuZW5kLmNvbHVtbisxKTtpZih1PT0ifSIpcmV0dXJuIGkuZW5kLmNvbHVtbisrLGk7Zi5tYXliZUluc2VydGVkQnJhY2tldHMtLX19KSx0aGlzLmFkZCgicGFyZW5zIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihlLHQsbixyLGkpe2lmKGk9PSIoIil7aChuKTt2YXIgcz1uLmdldFNlbGVjdGlvblJhbmdlKCksbz1yLmRvYy5nZXRUZXh0UmFuZ2Uocyk7aWYobyE9PSIiJiZuLmdldFdyYXBCZWhhdmlvdXJzRW5hYmxlZCgpKXJldHVybiBwKHMsbywiKCIsIikiKTtpZihkLmlzU2FuZUluc2VydGlvbihuLHIpKXJldHVybiBkLnJlY29yZEF1dG9JbnNlcnQobixyLCIpIikse3RleHQ6IigpIixzZWxlY3Rpb246WzEsMV19fWVsc2UgaWYoaT09IikiKXtoKG4pO3ZhciB1PW4uZ2V0Q3Vyc29yUG9zaXRpb24oKSxhPXIuZG9jLmdldExpbmUodS5yb3cpLGY9YS5zdWJzdHJpbmcodS5jb2x1bW4sdS5jb2x1bW4rMSk7aWYoZj09IikiKXt2YXIgbD1yLiRmaW5kT3BlbmluZ0JyYWNrZXQoIikiLHtjb2x1bW46dS5jb2x1bW4rMSxyb3c6dS5yb3d9KTtpZihsIT09bnVsbCYmZC5pc0F1dG9JbnNlcnRlZENsb3NpbmcodSxhLGkpKXJldHVybiBkLnBvcEF1dG9JbnNlcnRlZENsb3NpbmcoKSx7dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgicGFyZW5zIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9ci5kb2MuZ2V0VGV4dFJhbmdlKGkpO2lmKCFpLmlzTXVsdGlMaW5lKCkmJnM9PSIoIil7aChuKTt2YXIgbz1yLmRvYy5nZXRMaW5lKGkuc3RhcnQucm93KSx1PW8uc3Vic3RyaW5nKGkuc3RhcnQuY29sdW1uKzEsaS5zdGFydC5jb2x1bW4rMik7aWYodT09IikiKXJldHVybiBpLmVuZC5jb2x1bW4rKyxpfX0pLHRoaXMuYWRkKCJicmFja2V0cyIsImluc2VydGlvbiIsZnVuY3Rpb24oZSx0LG4scixpKXtpZihpPT0iWyIpe2gobik7dmFyIHM9bi5nZXRTZWxlY3Rpb25SYW5nZSgpLG89ci5kb2MuZ2V0VGV4dFJhbmdlKHMpO2lmKG8hPT0iIiYmbi5nZXRXcmFwQmVoYXZpb3Vyc0VuYWJsZWQoKSlyZXR1cm4gcChzLG8sIlsiLCJdIik7aWYoZC5pc1NhbmVJbnNlcnRpb24obixyKSlyZXR1cm4gZC5yZWNvcmRBdXRvSW5zZXJ0KG4sciwiXSIpLHt0ZXh0OiJbXSIsc2VsZWN0aW9uOlsxLDFdfX1lbHNlIGlmKGk9PSJdIil7aChuKTt2YXIgdT1uLmdldEN1cnNvclBvc2l0aW9uKCksYT1yLmRvYy5nZXRMaW5lKHUucm93KSxmPWEuc3Vic3RyaW5nKHUuY29sdW1uLHUuY29sdW1uKzEpO2lmKGY9PSJdIil7dmFyIGw9ci4kZmluZE9wZW5pbmdCcmFja2V0KCJdIix7Y29sdW1uOnUuY29sdW1uKzEscm93OnUucm93fSk7aWYobCE9PW51bGwmJmQuaXNBdXRvSW5zZXJ0ZWRDbG9zaW5nKHUsYSxpKSlyZXR1cm4gZC5wb3BBdXRvSW5zZXJ0ZWRDbG9zaW5nKCkse3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoImJyYWNrZXRzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9ci5kb2MuZ2V0VGV4dFJhbmdlKGkpO2lmKCFpLmlzTXVsdGlMaW5lKCkmJnM9PSJbIil7aChuKTt2YXIgbz1yLmRvYy5nZXRMaW5lKGkuc3RhcnQucm93KSx1PW8uc3Vic3RyaW5nKGkuc3RhcnQuY29sdW1uKzEsaS5zdGFydC5jb2x1bW4rMik7aWYodT09Il0iKXJldHVybiBpLmVuZC5jb2x1bW4rKyxpfX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImluc2VydGlvbiIsZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz1yLiRtb2RlLiRxdW90ZXN8fGM7aWYoaS5sZW5ndGg9PTEmJnNbaV0pe2lmKHRoaXMubGluZUNvbW1lbnRTdGFydCYmdGhpcy5saW5lQ29tbWVudFN0YXJ0LmluZGV4T2YoaSkhPS0xKXJldHVybjtoKG4pO3ZhciBvPWksdT1uLmdldFNlbGVjdGlvblJhbmdlKCksYT1yLmRvYy5nZXRUZXh0UmFuZ2UodSk7aWYoYSE9PSIiJiYoYS5sZW5ndGghPTF8fCFzW2FdKSYmbi5nZXRXcmFwQmVoYXZpb3Vyc0VuYWJsZWQoKSlyZXR1cm4gcCh1LGEsbyxvKTtpZighYSl7dmFyIGY9bi5nZXRDdXJzb3JQb3NpdGlvbigpLGw9ci5kb2MuZ2V0TGluZShmLnJvdyksZD1sLnN1YnN0cmluZyhmLmNvbHVtbi0xLGYuY29sdW1uKSx2PWwuc3Vic3RyaW5nKGYuY29sdW1uLGYuY29sdW1uKzEpLG09ci5nZXRUb2tlbkF0KGYucm93LGYuY29sdW1uKSxnPXIuZ2V0VG9rZW5BdChmLnJvdyxmLmNvbHVtbisxKTtpZihkPT0iXFwiJiZtJiYvZXNjYXBlLy50ZXN0KG0udHlwZSkpcmV0dXJuIG51bGw7dmFyIHk9bSYmL3N0cmluZ3xlc2NhcGUvLnRlc3QobS50eXBlKSxiPSFnfHwvc3RyaW5nfGVzY2FwZS8udGVzdChnLnR5cGUpLHc7aWYodj09byl3PXkhPT1iLHcmJi9zdHJpbmdcLmVuZC8udGVzdChnLnR5cGUpJiYodz0hMSk7ZWxzZXtpZih5JiYhYilyZXR1cm4gbnVsbDtpZih5JiZiKXJldHVybiBudWxsO3ZhciBFPXIuJG1vZGUudG9rZW5SZTtFLmxhc3RJbmRleD0wO3ZhciBTPUUudGVzdChkKTtFLmxhc3RJbmRleD0wO3ZhciB4PUUudGVzdChkKTtpZihTfHx4KXJldHVybiBudWxsO2lmKHYmJiEvW1xzOywufSlcXVxcXS8udGVzdCh2KSlyZXR1cm4gbnVsbDt2YXIgVD1sW2YuY29sdW1uLTJdO2lmKCEoZCE9b3x8VCE9byYmIUUudGVzdChUKSkpcmV0dXJuIG51bGw7dz0hMH1yZXR1cm57dGV4dDp3P28rbzoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJkZWxldGlvbiIsZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz1yLiRtb2RlLiRxdW90ZXN8fGMsbz1yLmRvYy5nZXRUZXh0UmFuZ2UoaSk7aWYoIWkuaXNNdWx0aUxpbmUoKSYmcy5oYXNPd25Qcm9wZXJ0eShvKSl7aChuKTt2YXIgdT1yLmRvYy5nZXRMaW5lKGkuc3RhcnQucm93KSxhPXUuc3Vic3RyaW5nKGkuc3RhcnQuY29sdW1uKzEsaS5zdGFydC5jb2x1bW4rMik7aWYoYT09bylyZXR1cm4gaS5lbmQuY29sdW1uKyssaX19KX07ZC5pc1NhbmVJbnNlcnRpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldEN1cnNvclBvc2l0aW9uKCkscj1uZXcgcyh0LG4ucm93LG4uY29sdW1uKTtpZighdGhpcy4kbWF0Y2hUb2tlblR5cGUoci5nZXRDdXJyZW50VG9rZW4oKXx8InRleHQiLHUpKXtpZigvWyl9XF1dLy50ZXN0KGUuc2Vzc2lvbi5nZXRMaW5lKG4ucm93KVtuLmNvbHVtbl0pKXJldHVybiEwO3ZhciBpPW5ldyBzKHQsbi5yb3csbi5jb2x1bW4rMSk7aWYoIXRoaXMuJG1hdGNoVG9rZW5UeXBlKGkuZ2V0Q3VycmVudFRva2VuKCl8fCJ0ZXh0Iix1KSlyZXR1cm4hMX1yZXR1cm4gci5zdGVwRm9yd2FyZCgpLHIuZ2V0Q3VycmVudFRva2VuUm93KCkhPT1uLnJvd3x8dGhpcy4kbWF0Y2hUb2tlblR5cGUoci5nZXRDdXJyZW50VG9rZW4oKXx8InRleHQiLGEpfSxkLiRtYXRjaFRva2VuVHlwZT1mdW5jdGlvbihlLHQpe3JldHVybiB0LmluZGV4T2YoZS50eXBlfHxlKT4tMX0sZC5yZWNvcmRBdXRvSW5zZXJ0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmdldEN1cnNvclBvc2l0aW9uKCksaT10LmRvYy5nZXRMaW5lKHIucm93KTt0aGlzLmlzQXV0b0luc2VydGVkQ2xvc2luZyhyLGksZi5hdXRvSW5zZXJ0ZWRMaW5lRW5kWzBdKXx8KGYuYXV0b0luc2VydGVkQnJhY2tldHM9MCksZi5hdXRvSW5zZXJ0ZWRSb3c9ci5yb3csZi5hdXRvSW5zZXJ0ZWRMaW5lRW5kPW4raS5zdWJzdHIoci5jb2x1bW4pLGYuYXV0b0luc2VydGVkQnJhY2tldHMrK30sZC5yZWNvcmRNYXliZUluc2VydD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXRDdXJzb3JQb3NpdGlvbigpLGk9dC5kb2MuZ2V0TGluZShyLnJvdyk7dGhpcy5pc01heWJlSW5zZXJ0ZWRDbG9zaW5nKHIsaSl8fChmLm1heWJlSW5zZXJ0ZWRCcmFja2V0cz0wKSxmLm1heWJlSW5zZXJ0ZWRSb3c9ci5yb3csZi5tYXliZUluc2VydGVkTGluZVN0YXJ0PWkuc3Vic3RyKDAsci5jb2x1bW4pK24sZi5tYXliZUluc2VydGVkTGluZUVuZD1pLnN1YnN0cihyLmNvbHVtbiksZi5tYXliZUluc2VydGVkQnJhY2tldHMrK30sZC5pc0F1dG9JbnNlcnRlZENsb3Npbmc9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmLmF1dG9JbnNlcnRlZEJyYWNrZXRzPjAmJmUucm93PT09Zi5hdXRvSW5zZXJ0ZWRSb3cmJm49PT1mLmF1dG9JbnNlcnRlZExpbmVFbmRbMF0mJnQuc3Vic3RyKGUuY29sdW1uKT09PWYuYXV0b0luc2VydGVkTGluZUVuZH0sZC5pc01heWJlSW5zZXJ0ZWRDbG9zaW5nPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGYubWF5YmVJbnNlcnRlZEJyYWNrZXRzPjAmJmUucm93PT09Zi5tYXliZUluc2VydGVkUm93JiZ0LnN1YnN0cihlLmNvbHVtbik9PT1mLm1heWJlSW5zZXJ0ZWRMaW5lRW5kJiZ0LnN1YnN0cigwLGUuY29sdW1uKT09Zi5tYXliZUluc2VydGVkTGluZVN0YXJ0fSxkLnBvcEF1dG9JbnNlcnRlZENsb3Npbmc9ZnVuY3Rpb24oKXtmLmF1dG9JbnNlcnRlZExpbmVFbmQ9Zi5hdXRvSW5zZXJ0ZWRMaW5lRW5kLnN1YnN0cigxKSxmLmF1dG9JbnNlcnRlZEJyYWNrZXRzLS19LGQuY2xlYXJNYXliZUluc2VydGVkQ2xvc2luZz1mdW5jdGlvbigpe2YmJihmLm1heWJlSW5zZXJ0ZWRCcmFja2V0cz0wLGYubWF5YmVJbnNlcnRlZFJvdz0tMSl9LHIuaW5oZXJpdHMoZCxpKSx0LkNzdHlsZUJlaGF2aW91cj1kfSksYWNlLmRlZmluZSgiYWNlL3VuaWNvZGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPVs0OCw5LDgsMjUsNSwwLDIsMjUsNDgsMCwxMSwwLDUsMCw2LDIyLDIsMzAsMiw0NTcsNSwxMSwxNSw0LDgsMCwyLDAsMTgsMTE2LDIsMSwzLDMsOSwwLDIsMiwyLDAsMiwxOSwyLDgyLDIsMTM4LDIsNCwzLDE1NSwxMiwzNywzLDAsOCwzOCwxMCw0NCwyLDAsMiwxLDIsMSwyLDAsOSwyNiw2LDIsMzAsMTAsNyw2MSwyLDksNSwxMDEsMiw3LDMsOSwyLDE4LDMsMCwxNyw1OCwzLDEwMCwxNSw1Myw1LDAsNiw0NSwyMTEsNTcsMywxOCwyLDUsMywxMSwzLDksMiwxLDcsNiwyLDIsMiw3LDMsMSwzLDIxLDIsNiwyLDAsNCwzLDMsOCwzLDEsMywzLDksMCw1LDEsMiw0LDMsMTEsMTYsMiwyLDUsNSwxLDMsMjEsMiw2LDIsMSwyLDEsMiwxLDMsMCwyLDQsNSwxLDMsMiw0LDAsOCwzLDIsMCw4LDE1LDEyLDIsMiw4LDIsMiwyLDIxLDIsNiwyLDEsMiw0LDMsOSwyLDIsMiwyLDMsMCwxNiwzLDMsOSwxOCwyLDIsNywzLDEsMywyMSwyLDYsMiwxLDIsNCwzLDgsMywxLDMsMiw5LDEsNSwxLDIsNCwzLDksMiwwLDE3LDEsMiw1LDQsMiwyLDMsNCwxLDIsMCwyLDEsNCwxLDQsMiw0LDExLDUsNCw0LDIsMiwzLDMsMCw3LDAsMTUsOSwxOCwyLDIsNywyLDIsMiwyMiwyLDksMiw0LDQsNywyLDIsMiwzLDgsMSwyLDEsNywzLDMsOSwxOSwxLDIsNywyLDIsMiwyMiwyLDksMiw0LDMsOCwyLDIsMiwzLDgsMSw4LDAsMiwzLDMsOSwxOSwxLDIsNywyLDIsMiwyMiwyLDE1LDQsNywyLDIsMiwzLDEwLDAsOSwzLDMsOSwxMSw1LDMsMSwyLDE3LDQsMjMsMiw4LDIsMCwzLDYsNCwwLDUsNSwyLDAsMiw3LDE5LDEsMTQsNTcsNiwxNCwyLDksNDAsMSwyLDAsMywxLDIsMCwzLDAsNywzLDIsNiwyLDIsMiwwLDIsMCwzLDEsMiwxMiwyLDIsMyw0LDIsMCwyLDUsMyw5LDMsMSwzNSwwLDI0LDEsNyw5LDEyLDAsMiwwLDIsMCw1LDksMiwzNSw1LDE5LDIsNSw1LDcsMiwzNSwxMCwwLDU4LDczLDcsNzcsMywzNywxMSw0MiwyLDAsNCwzMjgsMiwzLDMsNiwyLDAsMiwzLDMsNDAsMiwzLDMsMzIsMiwzLDMsNiwyLDAsMiwzLDMsMTQsMiw1NiwyLDMsMyw2Niw1LDAsMzMsMTUsMTcsODQsMTMsNjE5LDMsMTYsMiwyNSw2LDc0LDIyLDEyLDIsNiwxMiwyMCwxMiwxOSwxMywxMiwyLDIsMiwxLDEzLDUxLDMsMjksNCwwLDUsMSwzLDksMzQsMiwzLDksNyw4Nyw5LDQyLDYsNjksMTEsMjgsNCwxMSw1LDExLDExLDM5LDMsNCwxMiw0Myw1LDI1LDcsMTAsMzgsMjcsNSw2MiwyLDI4LDMsMTAsNyw5LDE0LDAsODksNzUsNSw5LDE4LDgsMTMsNDIsNCwxMSw3MSw1NSw5LDksNCw0OCw4MywyLDIsMzAsMTQsMjMwLDIzLDI4MCwzLDUsMywzNywzLDUsMyw3LDIsMCwyLDAsMiwwLDIsMzAsMyw1MiwyLDYsMiwwLDQsMiwyLDYsNCwzLDMsNSw1LDEyLDYsMiwyLDYsNjcsMSwyMCwwLDI5LDAsMTQsMCwxNyw0LDYwLDEyLDUsMCw0LDExLDE4LDAsNSwwLDMsOSwyLDAsNCw0LDcsMCwyLDAsMiwwLDIsMywyLDEwLDMsMyw2LDQsNSwwLDUzLDEsMjY4NCw0NiwyLDQ2LDIsMTMyLDcsNiwxNSwzNywxMSw1MywxMCwwLDE3LDIyLDEwLDYsMiw2LDIsNiwyLDYsMiw2LDIsNiwyLDYsMiw2LDIsMzEsNDgsMCw0NzAsMSwzNiw1LDIsNCw2LDEsNSw4NSwzLDEsMywyLDIsODksMiwzLDYsNDAsNCw5MywxOCwyMyw1NywxNSw1MTMsNjU4MSw3NSwyMDkzOSw1MywxMTY0LDY4LDQ1LDMsMjY4LDQsMjcsMjEsMzEsMywxMywxMywxLDIsMjQsOSw2OSwxMSwxLDM4LDgsMywxMDIsMywxLDExMSw0NCwyNSw1MSwxMyw2OCwxMiw5LDcsMjMsNCwwLDUsNDUsMywzNSwxMywyOCw0LDY0LDE1LDEwLDM5LDU0LDEwLDEzLDMsOSw3LDIyLDQsMSw1LDY2LDI1LDIsMjI3LDQyLDIsMSwzLDksNywxMTE3MSwxMywyMiw1LDQ4LDg0NTMsMzAxLDMsNjEsMywxMDUsMzksNiwxMyw0LDYsMTEsMiwxMiwyLDQsMiwwLDIsMSwyLDEsMiwxMDcsMzQsMzYyLDE5LDYzLDMsNTMsNDEsMTEsNSwxNSwxNyw2LDEzLDEsMjUsMiwzMyw0LDIsMTM0LDIwLDksOCwyNSw1LDAsMiwyNSwxMiw4OCw0LDUsMyw1LDMsNSwzLDJdLGk9MCxzPVtdO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bys9MilzLnB1c2goaSs9cltvXSkscltvKzFdJiZzLnB1c2goNDUsaSs9cltvKzFdKTt0LndvcmRDaGFycz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwscyl9KSxhY2UuZGVmaW5lKCJhY2UvbW9kZS90ZXh0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2NvbmZpZyIsImFjZS90b2tlbml6ZXIiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvdW5pY29kZSIsImFjZS9saWIvbGFuZyIsImFjZS90b2tlbl9pdGVyYXRvciIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vY29uZmlnIiksaT1lKCIuLi90b2tlbml6ZXIiKS5Ub2tlbml6ZXIscz1lKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLG89ZSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLHU9ZSgiLi4vdW5pY29kZSIpLGE9ZSgiLi4vbGliL2xhbmciKSxmPWUoIi4uL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcixsPWUoIi4uL3JhbmdlIikuUmFuZ2UsYz1mdW5jdGlvbigpe3RoaXMuSGlnaGxpZ2h0UnVsZXM9c307KGZ1bmN0aW9uKCl7dGhpcy4kZGVmYXVsdEJlaGF2aW91cj1uZXcgbyx0aGlzLnRva2VuUmU9bmV3IFJlZ0V4cCgiXlsiK3Uud29yZENoYXJzKyJcXCRfXSsiLCJnIiksdGhpcy5ub25Ub2tlblJlPW5ldyBSZWdFeHAoIl4oPzpbXiIrdS53b3JkQ2hhcnMrIlxcJF9dfFxcc10pKyIsImciKSx0aGlzLmdldFRva2VuaXplcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR0b2tlbml6ZXJ8fCh0aGlzLiRoaWdobGlnaHRSdWxlcz10aGlzLiRoaWdobGlnaHRSdWxlc3x8bmV3IHRoaXMuSGlnaGxpZ2h0UnVsZXModGhpcy4kaGlnaGxpZ2h0UnVsZUNvbmZpZyksdGhpcy4kdG9rZW5pemVyPW5ldyBpKHRoaXMuJGhpZ2hsaWdodFJ1bGVzLmdldFJ1bGVzKCkpKSx0aGlzLiR0b2tlbml6ZXJ9LHRoaXMubGluZUNvbW1lbnRTdGFydD0iIix0aGlzLmJsb2NrQ29tbWVudD0iIix0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbihlLHQsbixyKXtmdW5jdGlvbiB3KGUpe2Zvcih2YXIgdD1uO3Q8PXI7dCsrKWUoaS5nZXRMaW5lKHQpLHQpfXZhciBpPXQuZG9jLHM9ITAsbz0hMCx1PUluZmluaXR5LGY9dC5nZXRUYWJTaXplKCksbD0hMTtpZighdGhpcy5saW5lQ29tbWVudFN0YXJ0KXtpZighdGhpcy5ibG9ja0NvbW1lbnQpcmV0dXJuITE7dmFyIGM9dGhpcy5ibG9ja0NvbW1lbnQuc3RhcnQsaD10aGlzLmJsb2NrQ29tbWVudC5lbmQscD1uZXcgUmVnRXhwKCJeKFxccyopKD86IithLmVzY2FwZVJlZ0V4cChjKSsiKSIpLGQ9bmV3IFJlZ0V4cCgiKD86IithLmVzY2FwZVJlZ0V4cChoKSsiKVxccyokIiksdj1mdW5jdGlvbihlLHQpe2lmKGcoZSx0KSlyZXR1cm47aWYoIXN8fC9cUy8udGVzdChlKSlpLmluc2VydEluTGluZSh7cm93OnQsY29sdW1uOmUubGVuZ3RofSxoKSxpLmluc2VydEluTGluZSh7cm93OnQsY29sdW1uOnV9LGMpfSxtPWZ1bmN0aW9uKGUsdCl7dmFyIG47KG49ZS5tYXRjaChkKSkmJmkucmVtb3ZlSW5MaW5lKHQsZS5sZW5ndGgtblswXS5sZW5ndGgsZS5sZW5ndGgpLChuPWUubWF0Y2gocCkpJiZpLnJlbW92ZUluTGluZSh0LG5bMV0ubGVuZ3RoLG5bMF0ubGVuZ3RoKX0sZz1mdW5jdGlvbihlLG4pe2lmKHAudGVzdChlKSlyZXR1cm4hMDt2YXIgcj10LmdldFRva2VucyhuKTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKylpZihyW2ldLnR5cGU9PT0iY29tbWVudCIpcmV0dXJuITB9fWVsc2V7aWYoQXJyYXkuaXNBcnJheSh0aGlzLmxpbmVDb21tZW50U3RhcnQpKXZhciBwPXRoaXMubGluZUNvbW1lbnRTdGFydC5tYXAoYS5lc2NhcGVSZWdFeHApLmpvaW4oInwiKSxjPXRoaXMubGluZUNvbW1lbnRTdGFydFswXTtlbHNlIHZhciBwPWEuZXNjYXBlUmVnRXhwKHRoaXMubGluZUNvbW1lbnRTdGFydCksYz10aGlzLmxpbmVDb21tZW50U3RhcnQ7cD1uZXcgUmVnRXhwKCJeKFxccyopKD86IitwKyIpID8iKSxsPXQuZ2V0VXNlU29mdFRhYnMoKTt2YXIgbT1mdW5jdGlvbihlLHQpe3ZhciBuPWUubWF0Y2gocCk7aWYoIW4pcmV0dXJuO3ZhciByPW5bMV0ubGVuZ3RoLHM9blswXS5sZW5ndGg7IWIoZSxyLHMpJiZuWzBdW3MtMV09PSIgIiYmcy0tLGkucmVtb3ZlSW5MaW5lKHQscixzKX0seT1jKyIgIix2PWZ1bmN0aW9uKGUsdCl7aWYoIXN8fC9cUy8udGVzdChlKSliKGUsdSx1KT9pLmluc2VydEluTGluZSh7cm93OnQsY29sdW1uOnV9LHkpOmkuaW5zZXJ0SW5MaW5lKHtyb3c6dCxjb2x1bW46dX0sYyl9LGc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcC50ZXN0KGUpfSxiPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0wO3doaWxlKHQtLSYmZS5jaGFyQXQodCk9PSIgIilyKys7aWYociVmIT0wKXJldHVybiExO3ZhciByPTA7d2hpbGUoZS5jaGFyQXQobisrKT09IiAiKXIrKztyZXR1cm4gZj4yP3IlZiE9Zi0xOnIlZj09MH19dmFyIEU9SW5maW5pdHk7dyhmdW5jdGlvbihlLHQpe3ZhciBuPWUuc2VhcmNoKC9cUy8pO24hPT0tMT8objx1JiYodT1uKSxvJiYhZyhlLHQpJiYobz0hMSkpOkU+ZS5sZW5ndGgmJihFPWUubGVuZ3RoKX0pLHU9PUluZmluaXR5JiYodT1FLHM9ITEsbz0hMSksbCYmdSVmIT0wJiYodT1NYXRoLmZsb29yKHUvZikqZiksdyhvP206dil9LHRoaXMudG9nZ2xlQmxvY2tDb21tZW50PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuYmxvY2tDb21tZW50O2lmKCFpKXJldHVybjshaS5zdGFydCYmaVswXSYmKGk9aVswXSk7dmFyIHM9bmV3IGYodCxyLnJvdyxyLmNvbHVtbiksbz1zLmdldEN1cnJlbnRUb2tlbigpLHU9dC5zZWxlY3Rpb24sYT10LnNlbGVjdGlvbi50b09yaWVudGVkUmFuZ2UoKSxjLGg7aWYobyYmL2NvbW1lbnQvLnRlc3Qoby50eXBlKSl7dmFyIHAsZDt3aGlsZShvJiYvY29tbWVudC8udGVzdChvLnR5cGUpKXt2YXIgdj1vLnZhbHVlLmluZGV4T2YoaS5zdGFydCk7aWYodiE9LTEpe3ZhciBtPXMuZ2V0Q3VycmVudFRva2VuUm93KCksZz1zLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK3Y7cD1uZXcgbChtLGcsbSxnK2kuc3RhcnQubGVuZ3RoKTticmVha31vPXMuc3RlcEJhY2t3YXJkKCl9dmFyIHM9bmV3IGYodCxyLnJvdyxyLmNvbHVtbiksbz1zLmdldEN1cnJlbnRUb2tlbigpO3doaWxlKG8mJi9jb21tZW50Ly50ZXN0KG8udHlwZSkpe3ZhciB2PW8udmFsdWUuaW5kZXhPZihpLmVuZCk7aWYodiE9LTEpe3ZhciBtPXMuZ2V0Q3VycmVudFRva2VuUm93KCksZz1zLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK3Y7ZD1uZXcgbChtLGcsbSxnK2kuZW5kLmxlbmd0aCk7YnJlYWt9bz1zLnN0ZXBGb3J3YXJkKCl9ZCYmdC5yZW1vdmUoZCkscCYmKHQucmVtb3ZlKHApLGM9cC5zdGFydC5yb3csaD0taS5zdGFydC5sZW5ndGgpfWVsc2UgaD1pLnN0YXJ0Lmxlbmd0aCxjPW4uc3RhcnQucm93LHQuaW5zZXJ0KG4uZW5kLGkuZW5kKSx0Lmluc2VydChuLnN0YXJ0LGkuc3RhcnQpO2Euc3RhcnQucm93PT1jJiYoYS5zdGFydC5jb2x1bW4rPWgpLGEuZW5kLnJvdz09YyYmKGEuZW5kLmNvbHVtbis9aCksdC5zZWxlY3Rpb24uZnJvbU9yaWVudGVkUmFuZ2UoYSl9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLiRnZXRJbmRlbnQodCl9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4hMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihlLHQsbil7fSx0aGlzLiRnZXRJbmRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF0Y2goL15ccyovKVswXX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGx9LHRoaXMuY3JlYXRlTW9kZURlbGVnYXRlcz1mdW5jdGlvbihlKXt0aGlzLiRlbWJlZHM9W10sdGhpcy4kbW9kZXM9e307Zm9yKHZhciB0IGluIGUpaWYoZVt0XSl7dmFyIG49ZVt0XSxpPW4ucHJvdG90eXBlLiRpZCxzPXIuJG1vZGVzW2ldO3N8fChyLiRtb2Rlc1tpXT1zPW5ldyBuKSxyLiRtb2Rlc1t0XXx8KHIuJG1vZGVzW3RdPXMpLHRoaXMuJGVtYmVkcy5wdXNoKHQpLHRoaXMuJG1vZGVzW3RdPXN9dmFyIG89WyJ0b2dnbGVCbG9ja0NvbW1lbnQiLCJ0b2dnbGVDb21tZW50TGluZXMiLCJnZXROZXh0TGluZUluZGVudCIsImNoZWNrT3V0ZGVudCIsImF1dG9PdXRkZW50IiwidHJhbnNmb3JtQWN0aW9uIiwiZ2V0Q29tcGxldGlvbnMiXTtmb3IodmFyIHQ9MDt0PG8ubGVuZ3RoO3QrKykoZnVuY3Rpb24oZSl7dmFyIG49b1t0XSxyPWVbbl07ZVtvW3RdXT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkZWxlZ2F0b3Iobixhcmd1bWVudHMscil9fSkodGhpcyl9LHRoaXMuJGRlbGVnYXRvcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dFswXXx8InN0YXJ0IjtpZih0eXBlb2YgciE9InN0cmluZyIpe2lmKEFycmF5LmlzQXJyYXkoclsyXSkpe3ZhciBpPXJbMl1bclsyXS5sZW5ndGgtMV0scz10aGlzLiRtb2Rlc1tpXTtpZihzKXJldHVybiBzW2VdLmFwcGx5KHMsW3JbMV1dLmNvbmNhdChbXS5zbGljZS5jYWxsKHQsMSkpKX1yPXJbMF18fCJzdGFydCJ9Zm9yKHZhciBvPTA7bzx0aGlzLiRlbWJlZHMubGVuZ3RoO28rKyl7aWYoIXRoaXMuJG1vZGVzW3RoaXMuJGVtYmVkc1tvXV0pY29udGludWU7dmFyIHU9ci5zcGxpdCh0aGlzLiRlbWJlZHNbb10pO2lmKCF1WzBdJiZ1WzFdKXt0WzBdPXVbMV07dmFyIHM9dGhpcy4kbW9kZXNbdGhpcy4kZW1iZWRzW29dXTtyZXR1cm4gc1tlXS5hcHBseShzLHQpfX12YXIgYT1uLmFwcGx5KHRoaXMsdCk7cmV0dXJuIG4/YTp1bmRlZmluZWR9LHRoaXMudHJhbnNmb3JtQWN0aW9uPWZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYodGhpcy4kYmVoYXZpb3VyKXt2YXIgcz10aGlzLiRiZWhhdmlvdXIuZ2V0QmVoYXZpb3VycygpO2Zvcih2YXIgbyBpbiBzKWlmKHNbb11bdF0pe3ZhciB1PXNbb11bdF0uYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKHUpcmV0dXJuIHV9fX0sdGhpcy5nZXRLZXl3b3Jkcz1mdW5jdGlvbihlKXtpZighdGhpcy5jb21wbGV0aW9uS2V5d29yZHMpe3ZhciB0PXRoaXMuJHRva2VuaXplci5ydWxlcyxuPVtdO2Zvcih2YXIgciBpbiB0KXt2YXIgaT10W3JdO2Zvcih2YXIgcz0wLG89aS5sZW5ndGg7czxvO3MrKylpZih0eXBlb2YgaVtzXS50b2tlbj09InN0cmluZyIpL2tleXdvcmR8c3VwcG9ydHxzdG9yYWdlLy50ZXN0KGlbc10udG9rZW4pJiZuLnB1c2goaVtzXS5yZWdleCk7ZWxzZSBpZih0eXBlb2YgaVtzXS50b2tlbj09Im9iamVjdCIpZm9yKHZhciB1PTAsYT1pW3NdLnRva2VuLmxlbmd0aDt1PGE7dSsrKWlmKC9rZXl3b3JkfHN1cHBvcnR8c3RvcmFnZS8udGVzdChpW3NdLnRva2VuW3VdKSl7dmFyIHI9aVtzXS5yZWdleC5tYXRjaCgvXCguKz9cKS9nKVt1XTtuLnB1c2goci5zdWJzdHIoMSxyLmxlbmd0aC0yKSl9fXRoaXMuY29tcGxldGlvbktleXdvcmRzPW59cmV0dXJuIGU/bi5jb25jYXQodGhpcy4ka2V5d29yZExpc3R8fFtdKTp0aGlzLiRrZXl3b3JkTGlzdH0sdGhpcy4kY3JlYXRlS2V5d29yZExpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaGlnaGxpZ2h0UnVsZXN8fHRoaXMuZ2V0VG9rZW5pemVyKCksdGhpcy4ka2V5d29yZExpc3Q9dGhpcy4kaGlnaGxpZ2h0UnVsZXMuJGtleXdvcmRMaXN0fHxbXX0sdGhpcy5nZXRDb21wbGV0aW9ucz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLiRrZXl3b3JkTGlzdHx8dGhpcy4kY3JlYXRlS2V5d29yZExpc3QoKTtyZXR1cm4gaS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6ZSx2YWx1ZTplLHNjb3JlOjAsbWV0YToia2V5d29yZCJ9fSl9LHRoaXMuJGlkPSJhY2UvbW9kZS90ZXh0In0pLmNhbGwoYy5wcm90b3R5cGUpLHQuTW9kZT1jfSksYWNlLmRlZmluZSgiYWNlL2FwcGx5X2RlbHRhIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7dGhyb3cgY29uc29sZS5sb2coIkludmFsaWQgRGVsdGE6IixlKSwiSW52YWxpZCBEZWx0YTogIit0fWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gdC5yb3c+PTAmJnQucm93PGUubGVuZ3RoJiZ0LmNvbHVtbj49MCYmdC5jb2x1bW48PWVbdC5yb3ddLmxlbmd0aH1mdW5jdGlvbiBzKGUsdCl7dC5hY3Rpb24hPSJpbnNlcnQiJiZ0LmFjdGlvbiE9InJlbW92ZSImJnIodCwiZGVsdGEuYWN0aW9uIG11c3QgYmUgJ2luc2VydCcgb3IgJ3JlbW92ZSciKSx0LmxpbmVzIGluc3RhbmNlb2YgQXJyYXl8fHIodCwiZGVsdGEubGluZXMgbXVzdCBiZSBhbiBBcnJheSIpLCghdC5zdGFydHx8IXQuZW5kKSYmcih0LCJkZWx0YS5zdGFydC9lbmQgbXVzdCBiZSBhbiBwcmVzZW50Iik7dmFyIG49dC5zdGFydDtpKGUsdC5zdGFydCl8fHIodCwiZGVsdGEuc3RhcnQgbXVzdCBiZSBjb250YWluZWQgaW4gZG9jdW1lbnQiKTt2YXIgcz10LmVuZDt0LmFjdGlvbj09InJlbW92ZSImJiFpKGUscykmJnIodCwiZGVsdGEuZW5kIG11c3QgY29udGFpbmVkIGluIGRvY3VtZW50IGZvciAncmVtb3ZlJyBhY3Rpb25zIik7dmFyIG89cy5yb3ctbi5yb3csdT1zLmNvbHVtbi0obz09MD9uLmNvbHVtbjowKTsobyE9dC5saW5lcy5sZW5ndGgtMXx8dC5saW5lc1tvXS5sZW5ndGghPXUpJiZyKHQsImRlbHRhLnJhbmdlIG11c3QgbWF0Y2ggZGVsdGEgbGluZXMiKX10LmFwcGx5RGVsdGE9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQuc3RhcnQucm93LGk9dC5zdGFydC5jb2x1bW4scz1lW3JdfHwiIjtzd2l0Y2godC5hY3Rpb24pe2Nhc2UiaW5zZXJ0Ijp2YXIgbz10LmxpbmVzO2lmKG8ubGVuZ3RoPT09MSllW3JdPXMuc3Vic3RyaW5nKDAsaSkrdC5saW5lc1swXStzLnN1YnN0cmluZyhpKTtlbHNle3ZhciB1PVtyLDFdLmNvbmNhdCh0LmxpbmVzKTtlLnNwbGljZS5hcHBseShlLHUpLGVbcl09cy5zdWJzdHJpbmcoMCxpKStlW3JdLGVbcit0LmxpbmVzLmxlbmd0aC0xXSs9cy5zdWJzdHJpbmcoaSl9YnJlYWs7Y2FzZSJyZW1vdmUiOnZhciBhPXQuZW5kLmNvbHVtbixmPXQuZW5kLnJvdztyPT09Zj9lW3JdPXMuc3Vic3RyaW5nKDAsaSkrcy5zdWJzdHJpbmcoYSk6ZS5zcGxpY2UocixmLXIrMSxzLnN1YnN0cmluZygwLGkpK2VbZl0uc3Vic3RyaW5nKGEpKX19fSksYWNlLmRlZmluZSgiYWNlL2FuY2hvciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIscz10LkFuY2hvcj1mdW5jdGlvbihlLHQsbil7dGhpcy4kb25DaGFuZ2U9dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpLHRoaXMuYXR0YWNoKGUpLHR5cGVvZiBuPT0idW5kZWZpbmVkIj90aGlzLnNldFBvc2l0aW9uKHQucm93LHQuY29sdW1uKTp0aGlzLnNldFBvc2l0aW9uKHQsbil9OyhmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LG4pe3ZhciByPW4/ZS5jb2x1bW48PXQuY29sdW1uOmUuY29sdW1uPHQuY29sdW1uO3JldHVybiBlLnJvdzx0LnJvd3x8ZS5yb3c9PXQucm93JiZyfWZ1bmN0aW9uIHQodCxuLHIpe3ZhciBpPXQuYWN0aW9uPT0iaW5zZXJ0IixzPShpPzE6LTEpKih0LmVuZC5yb3ctdC5zdGFydC5yb3cpLG89KGk/MTotMSkqKHQuZW5kLmNvbHVtbi10LnN0YXJ0LmNvbHVtbiksdT10LnN0YXJ0LGE9aT91OnQuZW5kO3JldHVybiBlKG4sdSxyKT97cm93Om4ucm93LGNvbHVtbjpuLmNvbHVtbn06ZShhLG4sIXIpP3tyb3c6bi5yb3crcyxjb2x1bW46bi5jb2x1bW4rKG4ucm93PT1hLnJvdz9vOjApfTp7cm93OnUucm93LGNvbHVtbjp1LmNvbHVtbn19ci5pbXBsZW1lbnQodGhpcyxpKSx0aGlzLmdldFBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQodGhpcy5yb3csdGhpcy5jb2x1bW4pfSx0aGlzLmdldERvY3VtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jdW1lbnR9LHRoaXMuJGluc2VydFJpZ2h0PSExLHRoaXMub25DaGFuZ2U9ZnVuY3Rpb24oZSl7aWYoZS5zdGFydC5yb3c9PWUuZW5kLnJvdyYmZS5zdGFydC5yb3chPXRoaXMucm93KXJldHVybjtpZihlLnN0YXJ0LnJvdz50aGlzLnJvdylyZXR1cm47dmFyIG49dChlLHtyb3c6dGhpcy5yb3csY29sdW1uOnRoaXMuY29sdW1ufSx0aGlzLiRpbnNlcnRSaWdodCk7dGhpcy5zZXRQb3NpdGlvbihuLnJvdyxuLmNvbHVtbiwhMCl9LHRoaXMuc2V0UG9zaXRpb249ZnVuY3Rpb24oZSx0LG4pe3ZhciByO24/cj17cm93OmUsY29sdW1uOnR9OnI9dGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChlLHQpO2lmKHRoaXMucm93PT1yLnJvdyYmdGhpcy5jb2x1bW49PXIuY29sdW1uKXJldHVybjt2YXIgaT17cm93OnRoaXMucm93LGNvbHVtbjp0aGlzLmNvbHVtbn07dGhpcy5yb3c9ci5yb3csdGhpcy5jb2x1bW49ci5jb2x1bW4sdGhpcy5fc2lnbmFsKCJjaGFuZ2UiLHtvbGQ6aSx2YWx1ZTpyfSl9LHRoaXMuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHRoaXMuJG9uQ2hhbmdlKX0sdGhpcy5hdHRhY2g9ZnVuY3Rpb24oZSl7dGhpcy5kb2N1bWVudD1lfHx0aGlzLmRvY3VtZW50LHRoaXMuZG9jdW1lbnQub24oImNoYW5nZSIsdGhpcy4kb25DaGFuZ2UpfSx0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49e307cmV0dXJuIGU+PXRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCk/KG4ucm93PU1hdGgubWF4KDAsdGhpcy5kb2N1bWVudC5nZXRMZW5ndGgoKS0xKSxuLmNvbHVtbj10aGlzLmRvY3VtZW50LmdldExpbmUobi5yb3cpLmxlbmd0aCk6ZTwwPyhuLnJvdz0wLG4uY29sdW1uPTApOihuLnJvdz1lLG4uY29sdW1uPU1hdGgubWluKHRoaXMuZG9jdW1lbnQuZ2V0TGluZShuLnJvdykubGVuZ3RoLE1hdGgubWF4KDAsdCkpKSx0PDAmJihuLmNvbHVtbj0wKSxufX0pLmNhbGwocy5wcm90b3R5cGUpfSksYWNlLmRlZmluZSgiYWNlL2RvY3VtZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvYXBwbHlfZGVsdGEiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvcmFuZ2UiLCJhY2UvYW5jaG9yIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vYXBwbHlfZGVsdGEiKS5hcHBseURlbHRhLHM9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixvPWUoIi4vcmFuZ2UiKS5SYW5nZSx1PWUoIi4vYW5jaG9yIikuQW5jaG9yLGE9ZnVuY3Rpb24oZSl7dGhpcy4kbGluZXM9WyIiXSxlLmxlbmd0aD09PTA/dGhpcy4kbGluZXM9WyIiXTpBcnJheS5pc0FycmF5KGUpP3RoaXMuaW5zZXJ0TWVyZ2VkTGluZXMoe3JvdzowLGNvbHVtbjowfSxlKTp0aGlzLmluc2VydCh7cm93OjAsY29sdW1uOjB9LGUpfTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLHMpLHRoaXMuc2V0VmFsdWU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRMZW5ndGgoKS0xO3RoaXMucmVtb3ZlKG5ldyBvKDAsMCx0LHRoaXMuZ2V0TGluZSh0KS5sZW5ndGgpKSx0aGlzLmluc2VydCh7cm93OjAsY29sdW1uOjB9LGUpfSx0aGlzLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QWxsTGluZXMoKS5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKX0sdGhpcy5jcmVhdGVBbmNob3I9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IHUodGhpcyxlLHQpfSwiYWFhIi5zcGxpdCgvYS8pLmxlbmd0aD09PTA/dGhpcy4kc3BsaXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvXHJcbnxcci9nLCJcbiIpLnNwbGl0KCJcbiIpfTp0aGlzLiRzcGxpdD1mdW5jdGlvbihlKXtyZXR1cm4gZS5zcGxpdCgvXHJcbnxccnxcbi8pfSx0aGlzLiRkZXRlY3ROZXdMaW5lPWZ1bmN0aW9uKGUpe3ZhciB0PWUubWF0Y2goL14uKj8oXHJcbnxccnxcbikvbSk7dGhpcy4kYXV0b05ld0xpbmU9dD90WzFdOiJcbiIsdGhpcy5fc2lnbmFsKCJjaGFuZ2VOZXdMaW5lTW9kZSIpfSx0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXI9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy4kbmV3TGluZU1vZGUpe2Nhc2Uid2luZG93cyI6cmV0dXJuIlxyXG4iO2Nhc2UidW5peCI6cmV0dXJuIlxuIjtkZWZhdWx0OnJldHVybiB0aGlzLiRhdXRvTmV3TGluZXx8IlxuIn19LHRoaXMuJGF1dG9OZXdMaW5lPSIiLHRoaXMuJG5ld0xpbmVNb2RlPSJhdXRvIix0aGlzLnNldE5ld0xpbmVNb2RlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJG5ld0xpbmVNb2RlPT09ZSlyZXR1cm47dGhpcy4kbmV3TGluZU1vZGU9ZSx0aGlzLl9zaWduYWwoImNoYW5nZU5ld0xpbmVNb2RlIil9LHRoaXMuZ2V0TmV3TGluZU1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbmV3TGluZU1vZGV9LHRoaXMuaXNOZXdMaW5lPWZ1bmN0aW9uKGUpe3JldHVybiBlPT0iXHJcbiJ8fGU9PSJcciJ8fGU9PSJcbiJ9LHRoaXMuZ2V0TGluZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kbGluZXNbZV18fCIifSx0aGlzLmdldExpbmVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuJGxpbmVzLnNsaWNlKGUsdCsxKX0sdGhpcy5nZXRBbGxMaW5lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldExpbmVzKDAsdGhpcy5nZXRMZW5ndGgoKSl9LHRoaXMuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGxpbmVzLmxlbmd0aH0sdGhpcy5nZXRUZXh0UmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0TGluZXNGb3JSYW5nZShlKS5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKX0sdGhpcy5nZXRMaW5lc0ZvclJhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKGUuc3RhcnQucm93PT09ZS5lbmQucm93KXQ9W3RoaXMuZ2V0TGluZShlLnN0YXJ0LnJvdykuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uLGUuZW5kLmNvbHVtbildO2Vsc2V7dD10aGlzLmdldExpbmVzKGUuc3RhcnQucm93LGUuZW5kLnJvdyksdFswXT0odFswXXx8IiIpLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbik7dmFyIG49dC5sZW5ndGgtMTtlLmVuZC5yb3ctZS5zdGFydC5yb3c9PW4mJih0W25dPXRbbl0uc3Vic3RyaW5nKDAsZS5lbmQuY29sdW1uKSl9cmV0dXJuIHR9LHRoaXMuaW5zZXJ0TGluZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gY29uc29sZS53YXJuKCJVc2Ugb2YgZG9jdW1lbnQuaW5zZXJ0TGluZXMgaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSBpbnNlcnRGdWxsTGluZXMgbWV0aG9kIGluc3RlYWQuIiksdGhpcy5pbnNlcnRGdWxsTGluZXMoZSx0KX0sdGhpcy5yZW1vdmVMaW5lcz1mdW5jdGlvbihlLHQpe3JldHVybiBjb25zb2xlLndhcm4oIlVzZSBvZiBkb2N1bWVudC5yZW1vdmVMaW5lcyBpcyBkZXByZWNhdGVkLiBVc2UgdGhlIHJlbW92ZUZ1bGxMaW5lcyBtZXRob2QgaW5zdGVhZC4iKSx0aGlzLnJlbW92ZUZ1bGxMaW5lcyhlLHQpfSx0aGlzLmluc2VydE5ld0xpbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVXNlIG9mIGRvY3VtZW50Lmluc2VydE5ld0xpbmUgaXMgZGVwcmVjYXRlZC4gVXNlIGluc2VydE1lcmdlZExpbmVzKHBvc2l0aW9uLCBbJycsICcnXSkgaW5zdGVhZC4iKSx0aGlzLmluc2VydE1lcmdlZExpbmVzKGUsWyIiLCIiXSl9LHRoaXMuaW5zZXJ0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZ2V0TGVuZ3RoKCk8PTEmJnRoaXMuJGRldGVjdE5ld0xpbmUodCksdGhpcy5pbnNlcnRNZXJnZWRMaW5lcyhlLHRoaXMuJHNwbGl0KHQpKX0sdGhpcy5pbnNlcnRJbkxpbmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNsaXBwZWRQb3MoZS5yb3csZS5jb2x1bW4pLHI9dGhpcy5wb3MoZS5yb3csZS5jb2x1bW4rdC5sZW5ndGgpO3JldHVybiB0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0Om4sZW5kOnIsYWN0aW9uOiJpbnNlcnQiLGxpbmVzOlt0XX0sITApLHRoaXMuY2xvbmVQb3Mocil9LHRoaXMuY2xpcHBlZFBvcz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0TGVuZ3RoKCk7ZT09PXVuZGVmaW5lZD9lPW46ZTwwP2U9MDplPj1uJiYoZT1uLTEsdD11bmRlZmluZWQpO3ZhciByPXRoaXMuZ2V0TGluZShlKTtyZXR1cm4gdD09dW5kZWZpbmVkJiYodD1yLmxlbmd0aCksdD1NYXRoLm1pbihNYXRoLm1heCh0LDApLHIubGVuZ3RoKSx7cm93OmUsY29sdW1uOnR9fSx0aGlzLmNsb25lUG9zPWZ1bmN0aW9uKGUpe3JldHVybntyb3c6ZS5yb3csY29sdW1uOmUuY29sdW1ufX0sdGhpcy5wb3M9ZnVuY3Rpb24oZSx0KXtyZXR1cm57cm93OmUsY29sdW1uOnR9fSx0aGlzLiRjbGlwUG9zaXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRMZW5ndGgoKTtyZXR1cm4gZS5yb3c+PXQ/KGUucm93PU1hdGgubWF4KDAsdC0xKSxlLmNvbHVtbj10aGlzLmdldExpbmUodC0xKS5sZW5ndGgpOihlLnJvdz1NYXRoLm1heCgwLGUucm93KSxlLmNvbHVtbj1NYXRoLm1pbihNYXRoLm1heChlLmNvbHVtbiwwKSx0aGlzLmdldExpbmUoZS5yb3cpLmxlbmd0aCkpLGV9LHRoaXMuaW5zZXJ0RnVsbExpbmVzPWZ1bmN0aW9uKGUsdCl7ZT1NYXRoLm1pbihNYXRoLm1heChlLDApLHRoaXMuZ2V0TGVuZ3RoKCkpO3ZhciBuPTA7ZTx0aGlzLmdldExlbmd0aCgpPyh0PXQuY29uY2F0KFsiIl0pLG49MCk6KHQ9WyIiXS5jb25jYXQodCksZS0tLG49dGhpcy4kbGluZXNbZV0ubGVuZ3RoKSx0aGlzLmluc2VydE1lcmdlZExpbmVzKHtyb3c6ZSxjb2x1bW46bn0sdCl9LHRoaXMuaW5zZXJ0TWVyZ2VkTGluZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNsaXBwZWRQb3MoZS5yb3csZS5jb2x1bW4pLHI9e3JvdzpuLnJvdyt0Lmxlbmd0aC0xLGNvbHVtbjoodC5sZW5ndGg9PTE/bi5jb2x1bW46MCkrdFt0Lmxlbmd0aC0xXS5sZW5ndGh9O3JldHVybiB0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0Om4sZW5kOnIsYWN0aW9uOiJpbnNlcnQiLGxpbmVzOnR9KSx0aGlzLmNsb25lUG9zKHIpfSx0aGlzLnJlbW92ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNsaXBwZWRQb3MoZS5zdGFydC5yb3csZS5zdGFydC5jb2x1bW4pLG49dGhpcy5jbGlwcGVkUG9zKGUuZW5kLnJvdyxlLmVuZC5jb2x1bW4pO3JldHVybiB0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0OnQsZW5kOm4sYWN0aW9uOiJyZW1vdmUiLGxpbmVzOnRoaXMuZ2V0TGluZXNGb3JSYW5nZSh7c3RhcnQ6dCxlbmQ6bn0pfSksdGhpcy5jbG9uZVBvcyh0KX0sdGhpcy5yZW1vdmVJbkxpbmU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuY2xpcHBlZFBvcyhlLHQpLGk9dGhpcy5jbGlwcGVkUG9zKGUsbik7cmV0dXJuIHRoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6cixlbmQ6aSxhY3Rpb246InJlbW92ZSIsbGluZXM6dGhpcy5nZXRMaW5lc0ZvclJhbmdlKHtzdGFydDpyLGVuZDppfSl9LCEwKSx0aGlzLmNsb25lUG9zKHIpfSx0aGlzLnJlbW92ZUZ1bGxMaW5lcz1mdW5jdGlvbihlLHQpe2U9TWF0aC5taW4oTWF0aC5tYXgoMCxlKSx0aGlzLmdldExlbmd0aCgpLTEpLHQ9TWF0aC5taW4oTWF0aC5tYXgoMCx0KSx0aGlzLmdldExlbmd0aCgpLTEpO3ZhciBuPXQ9PXRoaXMuZ2V0TGVuZ3RoKCktMSYmZT4wLHI9dDx0aGlzLmdldExlbmd0aCgpLTEsaT1uP2UtMTplLHM9bj90aGlzLmdldExpbmUoaSkubGVuZ3RoOjAsdT1yP3QrMTp0LGE9cj8wOnRoaXMuZ2V0TGluZSh1KS5sZW5ndGgsZj1uZXcgbyhpLHMsdSxhKSxsPXRoaXMuJGxpbmVzLnNsaWNlKGUsdCsxKTtyZXR1cm4gdGhpcy5hcHBseURlbHRhKHtzdGFydDpmLnN0YXJ0LGVuZDpmLmVuZCxhY3Rpb246InJlbW92ZSIsbGluZXM6dGhpcy5nZXRMaW5lc0ZvclJhbmdlKGYpfSksbH0sdGhpcy5yZW1vdmVOZXdMaW5lPWZ1bmN0aW9uKGUpe2U8dGhpcy5nZXRMZW5ndGgoKS0xJiZlPj0wJiZ0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0OnRoaXMucG9zKGUsdGhpcy5nZXRMaW5lKGUpLmxlbmd0aCksZW5kOnRoaXMucG9zKGUrMSwwKSxhY3Rpb246InJlbW92ZSIsbGluZXM6WyIiLCIiXX0pfSx0aGlzLnJlcGxhY2U9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2Ygb3x8KGU9by5mcm9tUG9pbnRzKGUuc3RhcnQsZS5lbmQpKTtpZih0Lmxlbmd0aD09PTAmJmUuaXNFbXB0eSgpKXJldHVybiBlLnN0YXJ0O2lmKHQ9PXRoaXMuZ2V0VGV4dFJhbmdlKGUpKXJldHVybiBlLmVuZDt0aGlzLnJlbW92ZShlKTt2YXIgbjtyZXR1cm4gdD9uPXRoaXMuaW5zZXJ0KGUuc3RhcnQsdCk6bj1lLnN0YXJ0LG59LHRoaXMuYXBwbHlEZWx0YXM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspdGhpcy5hcHBseURlbHRhKGVbdF0pfSx0aGlzLnJldmVydERlbHRhcz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5sZW5ndGgtMTt0Pj0wO3QtLSl0aGlzLnJldmVydERlbHRhKGVbdF0pfSx0aGlzLmFwcGx5RGVsdGE9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmFjdGlvbj09Imluc2VydCI7aWYobj9lLmxpbmVzLmxlbmd0aDw9MSYmIWUubGluZXNbMF06IW8uY29tcGFyZVBvaW50cyhlLnN0YXJ0LGUuZW5kKSlyZXR1cm47biYmZS5saW5lcy5sZW5ndGg+MmU0P3RoaXMuJHNwbGl0QW5kYXBwbHlMYXJnZURlbHRhKGUsMmU0KTooaSh0aGlzLiRsaW5lcyxlLHQpLHRoaXMuX3NpZ25hbCgiY2hhbmdlIixlKSl9LHRoaXMuJHNwbGl0QW5kYXBwbHlMYXJnZURlbHRhPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5saW5lcyxyPW4ubGVuZ3RoLXQrMSxpPWUuc3RhcnQucm93LHM9ZS5zdGFydC5jb2x1bW47Zm9yKHZhciBvPTAsdT0wO288cjtvPXUpe3UrPXQtMTt2YXIgYT1uLnNsaWNlKG8sdSk7YS5wdXNoKCIiKSx0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0OnRoaXMucG9zKGkrbyxzKSxlbmQ6dGhpcy5wb3MoaSt1LHM9MCksYWN0aW9uOmUuYWN0aW9uLGxpbmVzOmF9LCEwKX1lLmxpbmVzPW4uc2xpY2UobyksZS5zdGFydC5yb3c9aStvLGUuc3RhcnQuY29sdW1uPXMsdGhpcy5hcHBseURlbHRhKGUsITApfSx0aGlzLnJldmVydERlbHRhPWZ1bmN0aW9uKGUpe3RoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6dGhpcy5jbG9uZVBvcyhlLnN0YXJ0KSxlbmQ6dGhpcy5jbG9uZVBvcyhlLmVuZCksYWN0aW9uOmUuYWN0aW9uPT0iaW5zZXJ0Ij8icmVtb3ZlIjoiaW5zZXJ0IixsaW5lczplLmxpbmVzLnNsaWNlKCl9KX0sdGhpcy5pbmRleFRvUG9zaXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRsaW5lc3x8dGhpcy5nZXRBbGxMaW5lcygpLHI9dGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkubGVuZ3RoO2Zvcih2YXIgaT10fHwwLHM9bi5sZW5ndGg7aTxzO2krKyl7ZS09bltpXS5sZW5ndGgrcjtpZihlPDApcmV0dXJue3JvdzppLGNvbHVtbjplK25baV0ubGVuZ3RoK3J9fXJldHVybntyb3c6cy0xLGNvbHVtbjplK25bcy0xXS5sZW5ndGgrcn19LHRoaXMucG9zaXRpb25Ub0luZGV4PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kbGluZXN8fHRoaXMuZ2V0QWxsTGluZXMoKSxyPXRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpLmxlbmd0aCxpPTAscz1NYXRoLm1pbihlLnJvdyxuLmxlbmd0aCk7Zm9yKHZhciBvPXR8fDA7bzxzOysrbylpKz1uW29dLmxlbmd0aCtyO3JldHVybiBpK2UuY29sdW1ufX0pLmNhbGwoYS5wcm90b3R5cGUpLHQuRG9jdW1lbnQ9YX0pLGFjZS5kZWZpbmUoImFjZS9iYWNrZ3JvdW5kX3Rva2VuaXplciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIscz1mdW5jdGlvbihlLHQpe3RoaXMucnVubmluZz0hMSx0aGlzLmxpbmVzPVtdLHRoaXMuc3RhdGVzPVtdLHRoaXMuY3VycmVudExpbmU9MCx0aGlzLnRva2VuaXplcj1lO3ZhciBuPXRoaXM7dGhpcy4kd29ya2VyPWZ1bmN0aW9uKCl7aWYoIW4ucnVubmluZylyZXR1cm47dmFyIGU9bmV3IERhdGUsdD1uLmN1cnJlbnRMaW5lLHI9LTEsaT1uLmRvYyxzPXQ7d2hpbGUobi5saW5lc1t0XSl0Kys7dmFyIG89aS5nZXRMZW5ndGgoKSx1PTA7bi5ydW5uaW5nPSExO3doaWxlKHQ8byl7bi4kdG9rZW5pemVSb3codCkscj10O2RvIHQrKzt3aGlsZShuLmxpbmVzW3RdKTt1Kys7aWYodSU1PT09MCYmbmV3IERhdGUtZT4yMCl7bi5ydW5uaW5nPXNldFRpbWVvdXQobi4kd29ya2VyLDIwKTticmVha319bi5jdXJyZW50TGluZT10LHI9PS0xJiYocj10KSxzPD1yJiZuLmZpcmVVcGRhdGVFdmVudChzLHIpfX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxpKSx0aGlzLnNldFRva2VuaXplcj1mdW5jdGlvbihlKXt0aGlzLnRva2VuaXplcj1lLHRoaXMubGluZXM9W10sdGhpcy5zdGF0ZXM9W10sdGhpcy5zdGFydCgwKX0sdGhpcy5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt0aGlzLmRvYz1lLHRoaXMubGluZXM9W10sdGhpcy5zdGF0ZXM9W10sdGhpcy5zdG9wKCl9LHRoaXMuZmlyZVVwZGF0ZUV2ZW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49e2ZpcnN0OmUsbGFzdDp0fTt0aGlzLl9zaWduYWwoInVwZGF0ZSIse2RhdGE6bn0pfSx0aGlzLnN0YXJ0PWZ1bmN0aW9uKGUpe3RoaXMuY3VycmVudExpbmU9TWF0aC5taW4oZXx8MCx0aGlzLmN1cnJlbnRMaW5lLHRoaXMuZG9jLmdldExlbmd0aCgpKSx0aGlzLmxpbmVzLnNwbGljZSh0aGlzLmN1cnJlbnRMaW5lLHRoaXMubGluZXMubGVuZ3RoKSx0aGlzLnN0YXRlcy5zcGxpY2UodGhpcy5jdXJyZW50TGluZSx0aGlzLnN0YXRlcy5sZW5ndGgpLHRoaXMuc3RvcCgpLHRoaXMucnVubmluZz1zZXRUaW1lb3V0KHRoaXMuJHdvcmtlciw3MDApfSx0aGlzLnNjaGVkdWxlU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnJ1bm5pbmd8fCh0aGlzLnJ1bm5pbmc9c2V0VGltZW91dCh0aGlzLiR3b3JrZXIsNzAwKSl9LHRoaXMuJHVwZGF0ZU9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhcnQucm93LG49ZS5lbmQucm93LXQ7aWYobj09PTApdGhpcy5saW5lc1t0XT1udWxsO2Vsc2UgaWYoZS5hY3Rpb249PSJyZW1vdmUiKXRoaXMubGluZXMuc3BsaWNlKHQsbisxLG51bGwpLHRoaXMuc3RhdGVzLnNwbGljZSh0LG4rMSxudWxsKTtlbHNle3ZhciByPUFycmF5KG4rMSk7ci51bnNoaWZ0KHQsMSksdGhpcy5saW5lcy5zcGxpY2UuYXBwbHkodGhpcy5saW5lcyxyKSx0aGlzLnN0YXRlcy5zcGxpY2UuYXBwbHkodGhpcy5zdGF0ZXMscil9dGhpcy5jdXJyZW50TGluZT1NYXRoLm1pbih0LHRoaXMuY3VycmVudExpbmUsdGhpcy5kb2MuZ2V0TGVuZ3RoKCkpLHRoaXMuc3RvcCgpfSx0aGlzLnN0b3A9ZnVuY3Rpb24oKXt0aGlzLnJ1bm5pbmcmJmNsZWFyVGltZW91dCh0aGlzLnJ1bm5pbmcpLHRoaXMucnVubmluZz0hMX0sdGhpcy5nZXRUb2tlbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubGluZXNbZV18fHRoaXMuJHRva2VuaXplUm93KGUpfSx0aGlzLmdldFN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmN1cnJlbnRMaW5lPT1lJiZ0aGlzLiR0b2tlbml6ZVJvdyhlKSx0aGlzLnN0YXRlc1tlXXx8InN0YXJ0In0sdGhpcy4kdG9rZW5pemVSb3c9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5kb2MuZ2V0TGluZShlKSxuPXRoaXMuc3RhdGVzW2UtMV0scj10aGlzLnRva2VuaXplci5nZXRMaW5lVG9rZW5zKHQsbixlKTtyZXR1cm4gdGhpcy5zdGF0ZXNbZV0rIiIhPXIuc3RhdGUrIiI/KHRoaXMuc3RhdGVzW2VdPXIuc3RhdGUsdGhpcy5saW5lc1tlKzFdPW51bGwsdGhpcy5jdXJyZW50TGluZT5lKzEmJih0aGlzLmN1cnJlbnRMaW5lPWUrMSkpOnRoaXMuY3VycmVudExpbmU9PWUmJih0aGlzLmN1cnJlbnRMaW5lPWUrMSksdGhpcy5saW5lc1tlXT1yLnRva2Vuc319KS5jYWxsKHMucHJvdG90eXBlKSx0LkJhY2tncm91bmRUb2tlbml6ZXI9c30pLGFjZS5kZWZpbmUoImFjZS9zZWFyY2hfaGlnaGxpZ2h0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL2xhbmciKSxpPWUoIi4vbGliL29vcCIpLHM9ZSgiLi9yYW5nZSIpLlJhbmdlLG89ZnVuY3Rpb24oZSx0LG4pe3RoaXMuc2V0UmVnZXhwKGUpLHRoaXMuY2xheno9dCx0aGlzLnR5cGU9bnx8InRleHQifTsoZnVuY3Rpb24oKXt0aGlzLk1BWF9SQU5HRVM9NTAwLHRoaXMuc2V0UmVnZXhwPWZ1bmN0aW9uKGUpe2lmKHRoaXMucmVnRXhwKyIiPT1lKyIiKXJldHVybjt0aGlzLnJlZ0V4cD1lLHRoaXMuY2FjaGU9W119LHRoaXMudXBkYXRlPWZ1bmN0aW9uKGUsdCxuLGkpe2lmKCF0aGlzLnJlZ0V4cClyZXR1cm47dmFyIG89aS5maXJzdFJvdyx1PWkubGFzdFJvdztmb3IodmFyIGE9bzthPD11O2ErKyl7dmFyIGY9dGhpcy5jYWNoZVthXTtmPT1udWxsJiYoZj1yLmdldE1hdGNoT2Zmc2V0cyhuLmdldExpbmUoYSksdGhpcy5yZWdFeHApLGYubGVuZ3RoPnRoaXMuTUFYX1JBTkdFUyYmKGY9Zi5zbGljZSgwLHRoaXMuTUFYX1JBTkdFUykpLGY9Zi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBzKGEsZS5vZmZzZXQsYSxlLm9mZnNldCtlLmxlbmd0aCl9KSx0aGlzLmNhY2hlW2FdPWYubGVuZ3RoP2Y6IiIpO2Zvcih2YXIgbD1mLmxlbmd0aDtsLS07KXQuZHJhd1NpbmdsZUxpbmVNYXJrZXIoZSxmW2xdLnRvU2NyZWVuUmFuZ2UobiksdGhpcy5jbGF6eixpKX19fSkuY2FsbChvLnByb3RvdHlwZSksdC5TZWFyY2hIaWdobGlnaHQ9b30pLGFjZS5kZWZpbmUoImFjZS9lZGl0X3Nlc3Npb24vZm9sZF9saW5lIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUsdCl7dGhpcy5mb2xkRGF0YT1lLEFycmF5LmlzQXJyYXkodCk/dGhpcy5mb2xkcz10OnQ9dGhpcy5mb2xkcz1bdF07dmFyIG49dFt0Lmxlbmd0aC0xXTt0aGlzLnJhbmdlPW5ldyByKHRbMF0uc3RhcnQucm93LHRbMF0uc3RhcnQuY29sdW1uLG4uZW5kLnJvdyxuLmVuZC5jb2x1bW4pLHRoaXMuc3RhcnQ9dGhpcy5yYW5nZS5zdGFydCx0aGlzLmVuZD10aGlzLnJhbmdlLmVuZCx0aGlzLmZvbGRzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zZXRGb2xkTGluZSh0aGlzKX0sdGhpcyl9dmFyIHI9ZSgiLi4vcmFuZ2UiKS5SYW5nZTsoZnVuY3Rpb24oKXt0aGlzLnNoaWZ0Um93PWZ1bmN0aW9uKGUpe3RoaXMuc3RhcnQucm93Kz1lLHRoaXMuZW5kLnJvdys9ZSx0aGlzLmZvbGRzLmZvckVhY2goZnVuY3Rpb24odCl7dC5zdGFydC5yb3crPWUsdC5lbmQucm93Kz1lfSl9LHRoaXMuYWRkRm9sZD1mdW5jdGlvbihlKXtpZihlLnNhbWVSb3cpe2lmKGUuc3RhcnQucm93PHRoaXMuc3RhcnRSb3d8fGUuZW5kUm93PnRoaXMuZW5kUm93KXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgYWRkIGEgZm9sZCB0byB0aGlzIEZvbGRMaW5lIGFzIGl0IGhhcyBubyBjb25uZWN0aW9uIik7dGhpcy5mb2xkcy5wdXNoKGUpLHRoaXMuZm9sZHMuc29ydChmdW5jdGlvbihlLHQpe3JldHVybi1lLnJhbmdlLmNvbXBhcmVFbmQodC5zdGFydC5yb3csdC5zdGFydC5jb2x1bW4pfSksdGhpcy5yYW5nZS5jb21wYXJlRW5kKGUuc3RhcnQucm93LGUuc3RhcnQuY29sdW1uKT4wPyh0aGlzLmVuZC5yb3c9ZS5lbmQucm93LHRoaXMuZW5kLmNvbHVtbj1lLmVuZC5jb2x1bW4pOnRoaXMucmFuZ2UuY29tcGFyZVN0YXJ0KGUuZW5kLnJvdyxlLmVuZC5jb2x1bW4pPDAmJih0aGlzLnN0YXJ0LnJvdz1lLnN0YXJ0LnJvdyx0aGlzLnN0YXJ0LmNvbHVtbj1lLnN0YXJ0LmNvbHVtbil9ZWxzZSBpZihlLnN0YXJ0LnJvdz09dGhpcy5lbmQucm93KXRoaXMuZm9sZHMucHVzaChlKSx0aGlzLmVuZC5yb3c9ZS5lbmQucm93LHRoaXMuZW5kLmNvbHVtbj1lLmVuZC5jb2x1bW47ZWxzZXtpZihlLmVuZC5yb3chPXRoaXMuc3RhcnQucm93KXRocm93IG5ldyBFcnJvcigiVHJ5aW5nIHRvIGFkZCBmb2xkIHRvIEZvbGRSb3cgdGhhdCBkb2Vzbid0IGhhdmUgYSBtYXRjaGluZyByb3ciKTt0aGlzLmZvbGRzLnVuc2hpZnQoZSksdGhpcy5zdGFydC5yb3c9ZS5zdGFydC5yb3csdGhpcy5zdGFydC5jb2x1bW49ZS5zdGFydC5jb2x1bW59ZS5mb2xkTGluZT10aGlzfSx0aGlzLmNvbnRhaW5zUm93PWZ1bmN0aW9uKGUpe3JldHVybiBlPj10aGlzLnN0YXJ0LnJvdyYmZTw9dGhpcy5lbmQucm93fSx0aGlzLndhbGs9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPTAsaT10aGlzLmZvbGRzLHMsbyx1LGE9ITA7dD09bnVsbCYmKHQ9dGhpcy5lbmQucm93LG49dGhpcy5lbmQuY29sdW1uKTtmb3IodmFyIGY9MDtmPGkubGVuZ3RoO2YrKyl7cz1pW2ZdLG89cy5yYW5nZS5jb21wYXJlU3RhcnQodCxuKTtpZihvPT0tMSl7ZShudWxsLHQsbixyLGEpO3JldHVybn11PWUobnVsbCxzLnN0YXJ0LnJvdyxzLnN0YXJ0LmNvbHVtbixyLGEpLHU9IXUmJmUocy5wbGFjZWhvbGRlcixzLnN0YXJ0LnJvdyxzLnN0YXJ0LmNvbHVtbixyKTtpZih1fHxvPT09MClyZXR1cm47YT0hcy5zYW1lUm93LHI9cy5lbmQuY29sdW1ufWUobnVsbCx0LG4scixhKX0sdGhpcy5nZXROZXh0Rm9sZFRvPWZ1bmN0aW9uKGUsdCl7dmFyIG4scjtmb3IodmFyIGk9MDtpPHRoaXMuZm9sZHMubGVuZ3RoO2krKyl7bj10aGlzLmZvbGRzW2ldLHI9bi5yYW5nZS5jb21wYXJlRW5kKGUsdCk7aWYocj09LTEpcmV0dXJue2ZvbGQ6bixraW5kOiJhZnRlciJ9O2lmKHI9PT0wKXJldHVybntmb2xkOm4sa2luZDoiaW5zaWRlIn19cmV0dXJuIG51bGx9LHRoaXMuYWRkUmVtb3ZlQ2hhcnM9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuZ2V0TmV4dEZvbGRUbyhlLHQpLGkscztpZihyKXtpPXIuZm9sZDtpZihyLmtpbmQ9PSJpbnNpZGUiJiZpLnN0YXJ0LmNvbHVtbiE9dCYmaS5zdGFydC5yb3chPWUpd2luZG93LmNvbnNvbGUmJndpbmRvdy5jb25zb2xlLmxvZyhlLHQsaSk7ZWxzZSBpZihpLnN0YXJ0LnJvdz09ZSl7cz10aGlzLmZvbGRzO3ZhciBvPXMuaW5kZXhPZihpKTtvPT09MCYmKHRoaXMuc3RhcnQuY29sdW1uKz1uKTtmb3IobztvPHMubGVuZ3RoO28rKyl7aT1zW29dLGkuc3RhcnQuY29sdW1uKz1uO2lmKCFpLnNhbWVSb3cpcmV0dXJuO2kuZW5kLmNvbHVtbis9bn10aGlzLmVuZC5jb2x1bW4rPW59fX0sdGhpcy5zcGxpdD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0TmV4dEZvbGRUbyhlLHQpO2lmKCFufHxuLmtpbmQ9PSJpbnNpZGUiKXJldHVybiBudWxsO3ZhciByPW4uZm9sZCxzPXRoaXMuZm9sZHMsbz10aGlzLmZvbGREYXRhLHU9cy5pbmRleE9mKHIpLGE9c1t1LTFdO3RoaXMuZW5kLnJvdz1hLmVuZC5yb3csdGhpcy5lbmQuY29sdW1uPWEuZW5kLmNvbHVtbixzPXMuc3BsaWNlKHUscy5sZW5ndGgtdSk7dmFyIGY9bmV3IGkobyxzKTtyZXR1cm4gby5zcGxpY2Uoby5pbmRleE9mKHRoaXMpKzEsMCxmKSxmfSx0aGlzLm1lcmdlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZm9sZHM7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdGhpcy5hZGRGb2xkKHRbbl0pO3ZhciByPXRoaXMuZm9sZERhdGE7ci5zcGxpY2Uoci5pbmRleE9mKGUpLDEpfSx0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9W3RoaXMucmFuZ2UudG9TdHJpbmcoKSsiOiBbIl07cmV0dXJuIHRoaXMuZm9sZHMuZm9yRWFjaChmdW5jdGlvbih0KXtlLnB1c2goIiAgIit0LnRvU3RyaW5nKCkpfSksZS5wdXNoKCJdIiksZS5qb2luKCJcbiIpfSx0aGlzLmlkeFRvUG9zaXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9MDtmb3IodmFyIG49MDtuPHRoaXMuZm9sZHMubGVuZ3RoO24rKyl7dmFyIHI9dGhpcy5mb2xkc1tuXTtlLT1yLnN0YXJ0LmNvbHVtbi10O2lmKGU8MClyZXR1cm57cm93OnIuc3RhcnQucm93LGNvbHVtbjpyLnN0YXJ0LmNvbHVtbitlfTtlLT1yLnBsYWNlaG9sZGVyLmxlbmd0aDtpZihlPDApcmV0dXJuIHIuc3RhcnQ7dD1yLmVuZC5jb2x1bW59cmV0dXJue3Jvdzp0aGlzLmVuZC5yb3csY29sdW1uOnRoaXMuZW5kLmNvbHVtbitlfX19KS5jYWxsKGkucHJvdG90eXBlKSx0LkZvbGRMaW5lPWl9KSxhY2UuZGVmaW5lKCJhY2UvcmFuZ2VfbGlzdCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9yYW5nZSIpLlJhbmdlLGk9ci5jb21wYXJlUG9pbnRzLHM9ZnVuY3Rpb24oKXt0aGlzLnJhbmdlcz1bXSx0aGlzLiRiaWFzPTF9OyhmdW5jdGlvbigpe3RoaXMuY29tcGFyZVBvaW50cz1pLHRoaXMucG9pbnRJbmRleD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5yYW5nZXM7Zm9yKHZhciBzPW58fDA7czxyLmxlbmd0aDtzKyspe3ZhciBvPXJbc10sdT1pKGUsby5lbmQpO2lmKHU+MCljb250aW51ZTt2YXIgYT1pKGUsby5zdGFydCk7cmV0dXJuIHU9PT0wP3QmJmEhPT0wPy1zLTI6czphPjB8fGE9PT0wJiYhdD9zOi1zLTF9cmV0dXJuLXMtMX0sdGhpcy5hZGQ9ZnVuY3Rpb24oZSl7dmFyIHQ9IWUuaXNFbXB0eSgpLG49dGhpcy5wb2ludEluZGV4KGUuc3RhcnQsdCk7bjwwJiYobj0tbi0xKTt2YXIgcj10aGlzLnBvaW50SW5kZXgoZS5lbmQsdCxuKTtyZXR1cm4gcjwwP3I9LXItMTpyKyssdGhpcy5yYW5nZXMuc3BsaWNlKG4sci1uLGUpfSx0aGlzLmFkZExpc3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciBuPWUubGVuZ3RoO24tLTspdC5wdXNoLmFwcGx5KHQsdGhpcy5hZGQoZVtuXSkpO3JldHVybiB0fSx0aGlzLnN1YnN0cmFjdFBvaW50PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucG9pbnRJbmRleChlKTtpZih0Pj0wKXJldHVybiB0aGlzLnJhbmdlcy5zcGxpY2UodCwxKX0sdGhpcy5tZXJnZT1mdW5jdGlvbigpe3ZhciBlPVtdLHQ9dGhpcy5yYW5nZXM7dD10LnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gaShlLnN0YXJ0LHQuc3RhcnQpfSk7dmFyIG49dFswXSxyO2Zvcih2YXIgcz0xO3M8dC5sZW5ndGg7cysrKXtyPW4sbj10W3NdO3ZhciBvPWkoci5lbmQsbi5zdGFydCk7aWYobzwwKWNvbnRpbnVlO2lmKG89PTAmJiFyLmlzRW1wdHkoKSYmIW4uaXNFbXB0eSgpKWNvbnRpbnVlO2koci5lbmQsbi5lbmQpPDAmJihyLmVuZC5yb3c9bi5lbmQucm93LHIuZW5kLmNvbHVtbj1uLmVuZC5jb2x1bW4pLHQuc3BsaWNlKHMsMSksZS5wdXNoKG4pLG49cixzLS19cmV0dXJuIHRoaXMucmFuZ2VzPXQsZX0sdGhpcy5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnBvaW50SW5kZXgoe3JvdzplLGNvbHVtbjp0fSk+PTB9LHRoaXMuY29udGFpbnNQb2ludD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wb2ludEluZGV4KGUpPj0wfSx0aGlzLnJhbmdlQXRQb2ludD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnBvaW50SW5kZXgoZSk7aWYodD49MClyZXR1cm4gdGhpcy5yYW5nZXNbdF19LHRoaXMuY2xpcFJvd3M9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnJhbmdlcztpZihuWzBdLnN0YXJ0LnJvdz50fHxuW24ubGVuZ3RoLTFdLnN0YXJ0LnJvdzxlKXJldHVybltdO3ZhciByPXRoaXMucG9pbnRJbmRleCh7cm93OmUsY29sdW1uOjB9KTtyPDAmJihyPS1yLTEpO3ZhciBpPXRoaXMucG9pbnRJbmRleCh7cm93OnQsY29sdW1uOjB9LHIpO2k8MCYmKGk9LWktMSk7dmFyIHM9W107Zm9yKHZhciBvPXI7bzxpO28rKylzLnB1c2gobltvXSk7cmV0dXJuIHN9LHRoaXMucmVtb3ZlQWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZ2VzLnNwbGljZSgwLHRoaXMucmFuZ2VzLmxlbmd0aCl9LHRoaXMuYXR0YWNoPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbiYmdGhpcy5kZXRhY2goKSx0aGlzLnNlc3Npb249ZSx0aGlzLm9uQ2hhbmdlPXRoaXMuJG9uQ2hhbmdlLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2UiLHRoaXMub25DaGFuZ2UpfSx0aGlzLmRldGFjaD1mdW5jdGlvbigpe2lmKCF0aGlzLnNlc3Npb24pcmV0dXJuO3RoaXMuc2Vzc2lvbi5yZW1vdmVMaXN0ZW5lcigiY2hhbmdlIix0aGlzLm9uQ2hhbmdlKSx0aGlzLnNlc3Npb249bnVsbH0sdGhpcy4kb25DaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdGFydCxuPWUuZW5kLHI9dC5yb3csaT1uLnJvdyxzPXRoaXMucmFuZ2VzO2Zvcih2YXIgbz0wLHU9cy5sZW5ndGg7bzx1O28rKyl7dmFyIGE9c1tvXTtpZihhLmVuZC5yb3c+PXIpYnJlYWt9aWYoZS5hY3Rpb249PSJpbnNlcnQiKXt2YXIgZj1pLXIsbD0tdC5jb2x1bW4rbi5jb2x1bW47Zm9yKDtvPHU7bysrKXt2YXIgYT1zW29dO2lmKGEuc3RhcnQucm93PnIpYnJlYWs7YS5zdGFydC5yb3c9PXImJmEuc3RhcnQuY29sdW1uPj10LmNvbHVtbiYmKGEuc3RhcnQuY29sdW1uPT10LmNvbHVtbiYmdGhpcy4kYmlhczw9MHx8KGEuc3RhcnQuY29sdW1uKz1sLGEuc3RhcnQucm93Kz1mKSk7aWYoYS5lbmQucm93PT1yJiZhLmVuZC5jb2x1bW4+PXQuY29sdW1uKXtpZihhLmVuZC5jb2x1bW49PXQuY29sdW1uJiZ0aGlzLiRiaWFzPDApY29udGludWU7YS5lbmQuY29sdW1uPT10LmNvbHVtbiYmbD4wJiZvPHUtMSYmYS5lbmQuY29sdW1uPmEuc3RhcnQuY29sdW1uJiZhLmVuZC5jb2x1bW49PXNbbysxXS5zdGFydC5jb2x1bW4mJihhLmVuZC5jb2x1bW4tPWwpLGEuZW5kLmNvbHVtbis9bCxhLmVuZC5yb3crPWZ9fX1lbHNle3ZhciBmPXItaSxsPXQuY29sdW1uLW4uY29sdW1uO2Zvcig7bzx1O28rKyl7dmFyIGE9c1tvXTtpZihhLnN0YXJ0LnJvdz5pKWJyZWFrO2lmKGEuZW5kLnJvdzxpJiYocjxhLmVuZC5yb3d8fHI9PWEuZW5kLnJvdyYmdC5jb2x1bW48YS5lbmQuY29sdW1uKSlhLmVuZC5yb3c9cixhLmVuZC5jb2x1bW49dC5jb2x1bW47ZWxzZSBpZihhLmVuZC5yb3c9PWkpaWYoYS5lbmQuY29sdW1uPD1uLmNvbHVtbil7aWYoZnx8YS5lbmQuY29sdW1uPnQuY29sdW1uKWEuZW5kLmNvbHVtbj10LmNvbHVtbixhLmVuZC5yb3c9dC5yb3d9ZWxzZSBhLmVuZC5jb2x1bW4rPWwsYS5lbmQucm93Kz1mO2Vsc2UgYS5lbmQucm93PmkmJihhLmVuZC5yb3crPWYpO2lmKGEuc3RhcnQucm93PGkmJihyPGEuc3RhcnQucm93fHxyPT1hLnN0YXJ0LnJvdyYmdC5jb2x1bW48YS5zdGFydC5jb2x1bW4pKWEuc3RhcnQucm93PXIsYS5zdGFydC5jb2x1bW49dC5jb2x1bW47ZWxzZSBpZihhLnN0YXJ0LnJvdz09aSlpZihhLnN0YXJ0LmNvbHVtbjw9bi5jb2x1bW4pe2lmKGZ8fGEuc3RhcnQuY29sdW1uPnQuY29sdW1uKWEuc3RhcnQuY29sdW1uPXQuY29sdW1uLGEuc3RhcnQucm93PXQucm93fWVsc2UgYS5zdGFydC5jb2x1bW4rPWwsYS5zdGFydC5yb3crPWY7ZWxzZSBhLnN0YXJ0LnJvdz5pJiYoYS5zdGFydC5yb3crPWYpfX1pZihmIT0wJiZvPHUpZm9yKDtvPHU7bysrKXt2YXIgYT1zW29dO2Euc3RhcnQucm93Kz1mLGEuZW5kLnJvdys9Zn19fSkuY2FsbChzLnByb3RvdHlwZSksdC5SYW5nZUxpc3Q9c30pLGFjZS5kZWZpbmUoImFjZS9lZGl0X3Nlc3Npb24vZm9sZCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZV9saXN0IiwiYWNlL2xpYi9vb3AiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSx0KXtlLnJvdy09dC5yb3csZS5yb3c9PTAmJihlLmNvbHVtbi09dC5jb2x1bW4pfWZ1bmN0aW9uIHUoZSx0KXtvKGUuc3RhcnQsdCksbyhlLmVuZCx0KX1mdW5jdGlvbiBhKGUsdCl7ZS5yb3c9PTAmJihlLmNvbHVtbis9dC5jb2x1bW4pLGUucm93Kz10LnJvd31mdW5jdGlvbiBmKGUsdCl7YShlLnN0YXJ0LHQpLGEoZS5lbmQsdCl9dmFyIHI9ZSgiLi4vcmFuZ2VfbGlzdCIpLlJhbmdlTGlzdCxpPWUoIi4uL2xpYi9vb3AiKSxzPXQuRm9sZD1mdW5jdGlvbihlLHQpe3RoaXMuZm9sZExpbmU9bnVsbCx0aGlzLnBsYWNlaG9sZGVyPXQsdGhpcy5yYW5nZT1lLHRoaXMuc3RhcnQ9ZS5zdGFydCx0aGlzLmVuZD1lLmVuZCx0aGlzLnNhbWVSb3c9ZS5zdGFydC5yb3c9PWUuZW5kLnJvdyx0aGlzLnN1YkZvbGRzPXRoaXMucmFuZ2VzPVtdfTtpLmluaGVyaXRzKHMsciksZnVuY3Rpb24oKXt0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuJyInK3RoaXMucGxhY2Vob2xkZXIrJyIgJyt0aGlzLnJhbmdlLnRvU3RyaW5nKCl9LHRoaXMuc2V0Rm9sZExpbmU9ZnVuY3Rpb24oZSl7dGhpcy5mb2xkTGluZT1lLHRoaXMuc3ViRm9sZHMuZm9yRWFjaChmdW5jdGlvbih0KXt0LnNldEZvbGRMaW5lKGUpfSl9LHRoaXMuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJhbmdlLmNsb25lKCksdD1uZXcgcyhlLHRoaXMucGxhY2Vob2xkZXIpO3JldHVybiB0aGlzLnN1YkZvbGRzLmZvckVhY2goZnVuY3Rpb24oZSl7dC5zdWJGb2xkcy5wdXNoKGUuY2xvbmUoKSl9KSx0LmNvbGxhcHNlQ2hpbGRyZW49dGhpcy5jb2xsYXBzZUNoaWxkcmVuLHR9LHRoaXMuYWRkU3ViRm9sZD1mdW5jdGlvbihlKXtpZih0aGlzLnJhbmdlLmlzRXF1YWwoZSkpcmV0dXJuO3UoZSx0aGlzLnN0YXJ0KTt2YXIgdD1lLnN0YXJ0LnJvdyxuPWUuc3RhcnQuY29sdW1uO2Zvcih2YXIgcj0wLGk9LTE7cjx0aGlzLnN1YkZvbGRzLmxlbmd0aDtyKyspe2k9dGhpcy5zdWJGb2xkc1tyXS5yYW5nZS5jb21wYXJlKHQsbik7aWYoaSE9MSlicmVha312YXIgcz10aGlzLnN1YkZvbGRzW3JdLG89MDtpZihpPT0wKXtpZihzLnJhbmdlLmNvbnRhaW5zUmFuZ2UoZSkpcmV0dXJuIHMuYWRkU3ViRm9sZChlKTtvPTF9dmFyIHQ9ZS5yYW5nZS5lbmQucm93LG49ZS5yYW5nZS5lbmQuY29sdW1uO2Zvcih2YXIgYT1yLGk9LTE7YTx0aGlzLnN1YkZvbGRzLmxlbmd0aDthKyspe2k9dGhpcy5zdWJGb2xkc1thXS5yYW5nZS5jb21wYXJlKHQsbik7aWYoaSE9MSlicmVha31pPT0wJiZhKys7dmFyIGY9dGhpcy5zdWJGb2xkcy5zcGxpY2UocixhLXIsZSksbD1pPT0wP2YubGVuZ3RoLTE6Zi5sZW5ndGg7Zm9yKHZhciBjPW87YzxsO2MrKyllLmFkZFN1YkZvbGQoZltjXSk7cmV0dXJuIGUuc2V0Rm9sZExpbmUodGhpcy5mb2xkTGluZSksZX0sdGhpcy5yZXN0b3JlUmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGYoZSx0aGlzLnN0YXJ0KX19LmNhbGwocy5wcm90b3R5cGUpfSksYWNlLmRlZmluZSgiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkaW5nIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIiwiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkX2xpbmUiLCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGQiLCJhY2UvdG9rZW5faXRlcmF0b3IiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHUoKXt0aGlzLmdldEZvbGRBdD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5nZXRGb2xkTGluZShlKTtpZighcilyZXR1cm4gbnVsbDt2YXIgaT1yLmZvbGRzO2Zvcih2YXIgcz0wO3M8aS5sZW5ndGg7cysrKXt2YXIgbz1pW3NdLnJhbmdlO2lmKG8uY29udGFpbnMoZSx0KSl7aWYobj09MSYmby5pc0VuZChlLHQpJiYhby5pc0VtcHR5KCkpY29udGludWU7aWYobj09LTEmJm8uaXNTdGFydChlLHQpJiYhby5pc0VtcHR5KCkpY29udGludWU7cmV0dXJuIGlbc119fX0sdGhpcy5nZXRGb2xkc0luUmFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdGFydCxuPWUuZW5kLHI9dGhpcy4kZm9sZERhdGEsaT1bXTt0LmNvbHVtbis9MSxuLmNvbHVtbi09MTtmb3IodmFyIHM9MDtzPHIubGVuZ3RoO3MrKyl7dmFyIG89cltzXS5yYW5nZS5jb21wYXJlUmFuZ2UoZSk7aWYobz09Miljb250aW51ZTtpZihvPT0tMilicmVhazt2YXIgdT1yW3NdLmZvbGRzO2Zvcih2YXIgYT0wO2E8dS5sZW5ndGg7YSsrKXt2YXIgZj11W2FdO289Zi5yYW5nZS5jb21wYXJlUmFuZ2UoZSk7aWYobz09LTIpYnJlYWs7aWYobz09Miljb250aW51ZTtpZihvPT00MilicmVhaztpLnB1c2goZil9fXJldHVybiB0LmNvbHVtbi09MSxuLmNvbHVtbis9MSxpfSx0aGlzLmdldEZvbGRzSW5SYW5nZUxpc3Q9ZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSl7dmFyIHQ9W107ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Q9dC5jb25jYXQodGhpcy5nZXRGb2xkc0luUmFuZ2UoZSkpfSx0aGlzKX1lbHNlIHZhciB0PXRoaXMuZ2V0Rm9sZHNJblJhbmdlKGUpO3JldHVybiB0fSx0aGlzLmdldEFsbEZvbGRzPWZ1bmN0aW9uKCl7dmFyIGU9W10sdD10aGlzLiRmb2xkRGF0YTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylmb3IodmFyIHI9MDtyPHRbbl0uZm9sZHMubGVuZ3RoO3IrKyllLnB1c2godFtuXS5mb2xkc1tyXSk7cmV0dXJuIGV9LHRoaXMuZ2V0Rm9sZFN0cmluZ0F0PWZ1bmN0aW9uKGUsdCxuLHIpe3I9cnx8dGhpcy5nZXRGb2xkTGluZShlKTtpZighcilyZXR1cm4gbnVsbDt2YXIgaT17ZW5kOntjb2x1bW46MH19LHMsbztmb3IodmFyIHU9MDt1PHIuZm9sZHMubGVuZ3RoO3UrKyl7bz1yLmZvbGRzW3VdO3ZhciBhPW8ucmFuZ2UuY29tcGFyZUVuZChlLHQpO2lmKGE9PS0xKXtzPXRoaXMuZ2V0TGluZShvLnN0YXJ0LnJvdykuc3Vic3RyaW5nKGkuZW5kLmNvbHVtbixvLnN0YXJ0LmNvbHVtbik7YnJlYWt9aWYoYT09PTApcmV0dXJuIG51bGw7aT1vfXJldHVybiBzfHwocz10aGlzLmdldExpbmUoby5zdGFydC5yb3cpLnN1YnN0cmluZyhpLmVuZC5jb2x1bW4pKSxuPT0tMT9zLnN1YnN0cmluZygwLHQtaS5lbmQuY29sdW1uKTpuPT0xP3Muc3Vic3RyaW5nKHQtaS5lbmQuY29sdW1uKTpzfSx0aGlzLmdldEZvbGRMaW5lPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kZm9sZERhdGEscj0wO3QmJihyPW4uaW5kZXhPZih0KSkscj09LTEmJihyPTApO2ZvcihyO3I8bi5sZW5ndGg7cisrKXt2YXIgaT1uW3JdO2lmKGkuc3RhcnQucm93PD1lJiZpLmVuZC5yb3c+PWUpcmV0dXJuIGk7aWYoaS5lbmQucm93PmUpcmV0dXJuIG51bGx9cmV0dXJuIG51bGx9LHRoaXMuZ2V0TmV4dEZvbGRMaW5lPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kZm9sZERhdGEscj0wO3QmJihyPW4uaW5kZXhPZih0KSkscj09LTEmJihyPTApO2ZvcihyO3I8bi5sZW5ndGg7cisrKXt2YXIgaT1uW3JdO2lmKGkuZW5kLnJvdz49ZSlyZXR1cm4gaX1yZXR1cm4gbnVsbH0sdGhpcy5nZXRGb2xkZWRSb3dDb3VudD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJGZvbGREYXRhLHI9dC1lKzE7Zm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciBzPW5baV0sbz1zLmVuZC5yb3csdT1zLnN0YXJ0LnJvdztpZihvPj10KXt1PHQmJih1Pj1lP3ItPXQtdTpyPTApO2JyZWFrfW8+PWUmJih1Pj1lP3ItPW8tdTpyLT1vLWUrMSl9cmV0dXJuIHJ9LHRoaXMuJGFkZEZvbGRMaW5lPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiRmb2xkRGF0YS5wdXNoKGUpLHRoaXMuJGZvbGREYXRhLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zdGFydC5yb3ctdC5zdGFydC5yb3d9KSxlfSx0aGlzLmFkZEZvbGQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRmb2xkRGF0YSxyPSExLG87ZSBpbnN0YW5jZW9mIHM/bz1lOihvPW5ldyBzKHQsZSksby5jb2xsYXBzZUNoaWxkcmVuPXQuY29sbGFwc2VDaGlsZHJlbiksdGhpcy4kY2xpcFJhbmdlVG9Eb2N1bWVudChvLnJhbmdlKTt2YXIgdT1vLnN0YXJ0LnJvdyxhPW8uc3RhcnQuY29sdW1uLGY9by5lbmQucm93LGw9by5lbmQuY29sdW1uLGM9dGhpcy5nZXRGb2xkQXQodSxhLDEpLGg9dGhpcy5nZXRGb2xkQXQoZixsLC0xKTtpZihjJiZoPT1jKXJldHVybiBjLmFkZFN1YkZvbGQobyk7YyYmIWMucmFuZ2UuaXNTdGFydCh1LGEpJiZ0aGlzLnJlbW92ZUZvbGQoYyksaCYmIWgucmFuZ2UuaXNFbmQoZixsKSYmdGhpcy5yZW1vdmVGb2xkKGgpO3ZhciBwPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKG8ucmFuZ2UpO3AubGVuZ3RoPjAmJih0aGlzLnJlbW92ZUZvbGRzKHApLHAuZm9yRWFjaChmdW5jdGlvbihlKXtvLmFkZFN1YkZvbGQoZSl9KSk7Zm9yKHZhciBkPTA7ZDxuLmxlbmd0aDtkKyspe3ZhciB2PW5bZF07aWYoZj09di5zdGFydC5yb3cpe3YuYWRkRm9sZChvKSxyPSEwO2JyZWFrfWlmKHU9PXYuZW5kLnJvdyl7di5hZGRGb2xkKG8pLHI9ITA7aWYoIW8uc2FtZVJvdyl7dmFyIG09bltkKzFdO2lmKG0mJm0uc3RhcnQucm93PT1mKXt2Lm1lcmdlKG0pO2JyZWFrfX1icmVha31pZihmPD12LnN0YXJ0LnJvdylicmVha31yZXR1cm4gcnx8KHY9dGhpcy4kYWRkRm9sZExpbmUobmV3IGkodGhpcy4kZm9sZERhdGEsbykpKSx0aGlzLiR1c2VXcmFwTW9kZT90aGlzLiR1cGRhdGVXcmFwRGF0YSh2LnN0YXJ0LnJvdyx2LnN0YXJ0LnJvdyk6dGhpcy4kdXBkYXRlUm93TGVuZ3RoQ2FjaGUodi5zdGFydC5yb3csdi5zdGFydC5yb3cpLHRoaXMuJG1vZGlmaWVkPSEwLHRoaXMuX3NpZ25hbCgiY2hhbmdlRm9sZCIse2RhdGE6byxhY3Rpb246ImFkZCJ9KSxvfSx0aGlzLmFkZEZvbGRzPWZ1bmN0aW9uKGUpe2UuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzLmFkZEZvbGQoZSl9LHRoaXMpfSx0aGlzLnJlbW92ZUZvbGQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5mb2xkTGluZSxuPXQuc3RhcnQucm93LHI9dC5lbmQucm93LGk9dGhpcy4kZm9sZERhdGEscz10LmZvbGRzO2lmKHMubGVuZ3RoPT0xKWkuc3BsaWNlKGkuaW5kZXhPZih0KSwxKTtlbHNlIGlmKHQucmFuZ2UuaXNFbmQoZS5lbmQucm93LGUuZW5kLmNvbHVtbikpcy5wb3AoKSx0LmVuZC5yb3c9c1tzLmxlbmd0aC0xXS5lbmQucm93LHQuZW5kLmNvbHVtbj1zW3MubGVuZ3RoLTFdLmVuZC5jb2x1bW47ZWxzZSBpZih0LnJhbmdlLmlzU3RhcnQoZS5zdGFydC5yb3csZS5zdGFydC5jb2x1bW4pKXMuc2hpZnQoKSx0LnN0YXJ0LnJvdz1zWzBdLnN0YXJ0LnJvdyx0LnN0YXJ0LmNvbHVtbj1zWzBdLnN0YXJ0LmNvbHVtbjtlbHNlIGlmKGUuc2FtZVJvdylzLnNwbGljZShzLmluZGV4T2YoZSksMSk7ZWxzZXt2YXIgbz10LnNwbGl0KGUuc3RhcnQucm93LGUuc3RhcnQuY29sdW1uKTtzPW8uZm9sZHMscy5zaGlmdCgpLG8uc3RhcnQucm93PXNbMF0uc3RhcnQucm93LG8uc3RhcnQuY29sdW1uPXNbMF0uc3RhcnQuY29sdW1ufXRoaXMuJHVwZGF0aW5nfHwodGhpcy4kdXNlV3JhcE1vZGU/dGhpcy4kdXBkYXRlV3JhcERhdGEobixyKTp0aGlzLiR1cGRhdGVSb3dMZW5ndGhDYWNoZShuLHIpKSx0aGlzLiRtb2RpZmllZD0hMCx0aGlzLl9zaWduYWwoImNoYW5nZUZvbGQiLHtkYXRhOmUsYWN0aW9uOiJyZW1vdmUifSl9LHRoaXMucmVtb3ZlRm9sZHM9ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspdC5wdXNoKGVbbl0pO3QuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzLnJlbW92ZUZvbGQoZSl9LHRoaXMpLHRoaXMuJG1vZGlmaWVkPSEwfSx0aGlzLmV4cGFuZEZvbGQ9ZnVuY3Rpb24oZSl7dGhpcy5yZW1vdmVGb2xkKGUpLGUuc3ViRm9sZHMuZm9yRWFjaChmdW5jdGlvbih0KXtlLnJlc3RvcmVSYW5nZSh0KSx0aGlzLmFkZEZvbGQodCl9LHRoaXMpLGUuY29sbGFwc2VDaGlsZHJlbj4wJiZ0aGlzLmZvbGRBbGwoZS5zdGFydC5yb3crMSxlLmVuZC5yb3csZS5jb2xsYXBzZUNoaWxkcmVuLTEpLGUuc3ViRm9sZHM9W119LHRoaXMuZXhwYW5kRm9sZHM9ZnVuY3Rpb24oZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RoaXMuZXhwYW5kRm9sZChlKX0sdGhpcyl9LHRoaXMudW5mb2xkPWZ1bmN0aW9uKGUsdCl7dmFyIG4saTtlPT1udWxsPyhuPW5ldyByKDAsMCx0aGlzLmdldExlbmd0aCgpLDApLHQ9ITApOnR5cGVvZiBlPT0ibnVtYmVyIj9uPW5ldyByKGUsMCxlLHRoaXMuZ2V0TGluZShlKS5sZW5ndGgpOiJyb3ciaW4gZT9uPXIuZnJvbVBvaW50cyhlLGUpOm49ZSxpPXRoaXMuZ2V0Rm9sZHNJblJhbmdlTGlzdChuKTtpZih0KXRoaXMucmVtb3ZlRm9sZHMoaSk7ZWxzZXt2YXIgcz1pO3doaWxlKHMubGVuZ3RoKXRoaXMuZXhwYW5kRm9sZHMocykscz10aGlzLmdldEZvbGRzSW5SYW5nZUxpc3Qobil9aWYoaS5sZW5ndGgpcmV0dXJuIGl9LHRoaXMuaXNSb3dGb2xkZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4hIXRoaXMuZ2V0Rm9sZExpbmUoZSx0KX0sdGhpcy5nZXRSb3dGb2xkRW5kPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRGb2xkTGluZShlLHQpO3JldHVybiBuP24uZW5kLnJvdzplfSx0aGlzLmdldFJvd0ZvbGRTdGFydD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0Rm9sZExpbmUoZSx0KTtyZXR1cm4gbj9uLnN0YXJ0LnJvdzplfSx0aGlzLmdldEZvbGREaXNwbGF5TGluZT1mdW5jdGlvbihlLHQsbixyLGkpe3I9PW51bGwmJihyPWUuc3RhcnQucm93KSxpPT1udWxsJiYoaT0wKSx0PT1udWxsJiYodD1lLmVuZC5yb3cpLG49PW51bGwmJihuPXRoaXMuZ2V0TGluZSh0KS5sZW5ndGgpO3ZhciBzPXRoaXMuZG9jLG89IiI7cmV0dXJuIGUud2FsayhmdW5jdGlvbihlLHQsbix1KXtpZih0PHIpcmV0dXJuO2lmKHQ9PXIpe2lmKG48aSlyZXR1cm47dT1NYXRoLm1heChpLHUpfWUhPW51bGw/bys9ZTpvKz1zLmdldExpbmUodCkuc3Vic3RyaW5nKHUsbil9LHQsbiksb30sdGhpcy5nZXREaXNwbGF5TGluZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLmdldEZvbGRMaW5lKGUpO2lmKCFpKXt2YXIgcztyZXR1cm4gcz10aGlzLmRvYy5nZXRMaW5lKGUpLHMuc3Vic3RyaW5nKHJ8fDAsdHx8cy5sZW5ndGgpfXJldHVybiB0aGlzLmdldEZvbGREaXNwbGF5TGluZShpLGUsdCxuLHIpfSx0aGlzLiRjbG9uZUZvbGREYXRhPWZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIGU9dGhpcy4kZm9sZERhdGEubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZm9sZHMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsb25lKCl9KTtyZXR1cm4gbmV3IGkoZSxuKX0pLGV9LHRoaXMudG9nZ2xlRm9sZD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlbGVjdGlvbixuPXQuZ2V0UmFuZ2UoKSxyLGk7aWYobi5pc0VtcHR5KCkpe3ZhciBzPW4uc3RhcnQ7cj10aGlzLmdldEZvbGRBdChzLnJvdyxzLmNvbHVtbik7aWYocil7dGhpcy5leHBhbmRGb2xkKHIpO3JldHVybn0oaT10aGlzLmZpbmRNYXRjaGluZ0JyYWNrZXQocykpP24uY29tcGFyZVBvaW50KGkpPT0xP24uZW5kPWk6KG4uc3RhcnQ9aSxuLnN0YXJ0LmNvbHVtbisrLG4uZW5kLmNvbHVtbi0tKTooaT10aGlzLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3JvdzpzLnJvdyxjb2x1bW46cy5jb2x1bW4rMX0pKT8obi5jb21wYXJlUG9pbnQoaSk9PTE/bi5lbmQ9aTpuLnN0YXJ0PWksbi5zdGFydC5jb2x1bW4rKyk6bj10aGlzLmdldENvbW1lbnRGb2xkUmFuZ2Uocy5yb3cscy5jb2x1bW4pfHxufWVsc2V7dmFyIG89dGhpcy5nZXRGb2xkc0luUmFuZ2Uobik7aWYoZSYmby5sZW5ndGgpe3RoaXMuZXhwYW5kRm9sZHMobyk7cmV0dXJufW8ubGVuZ3RoPT0xJiYocj1vWzBdKX1yfHwocj10aGlzLmdldEZvbGRBdChuLnN0YXJ0LnJvdyxuLnN0YXJ0LmNvbHVtbikpO2lmKHImJnIucmFuZ2UudG9TdHJpbmcoKT09bi50b1N0cmluZygpKXt0aGlzLmV4cGFuZEZvbGQocik7cmV0dXJufXZhciB1PSIuLi4iO2lmKCFuLmlzTXVsdGlMaW5lKCkpe3U9dGhpcy5nZXRUZXh0UmFuZ2Uobik7aWYodS5sZW5ndGg8NClyZXR1cm47dT11LnRyaW0oKS5zdWJzdHJpbmcoMCwyKSsiLi4ifXRoaXMuYWRkRm9sZCh1LG4pfSx0aGlzLmdldENvbW1lbnRGb2xkUmFuZ2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPW5ldyBvKHRoaXMsZSx0KSxzPWkuZ2V0Q3VycmVudFRva2VuKCksdT1zLnR5cGU7aWYocyYmL15jb21tZW50fHN0cmluZy8udGVzdCh1KSl7dT11Lm1hdGNoKC9jb21tZW50fHN0cmluZy8pWzBdLHU9PSJjb21tZW50IiYmKHUrPSJ8ZG9jLXN0YXJ0Iik7dmFyIGE9bmV3IFJlZ0V4cCh1KSxmPW5ldyByO2lmKG4hPTEpe2RvIHM9aS5zdGVwQmFja3dhcmQoKTt3aGlsZShzJiZhLnRlc3Qocy50eXBlKSk7aS5zdGVwRm9yd2FyZCgpfWYuc3RhcnQucm93PWkuZ2V0Q3VycmVudFRva2VuUm93KCksZi5zdGFydC5jb2x1bW49aS5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSsyLGk9bmV3IG8odGhpcyxlLHQpO2lmKG4hPS0xKXt2YXIgbD0tMTtkb3tzPWkuc3RlcEZvcndhcmQoKTtpZihsPT0tMSl7dmFyIGM9dGhpcy5nZXRTdGF0ZShpLiRyb3cpO2EudGVzdChjKXx8KGw9aS4kcm93KX1lbHNlIGlmKGkuJHJvdz5sKWJyZWFrfXdoaWxlKHMmJmEudGVzdChzLnR5cGUpKTtzPWkuc3RlcEJhY2t3YXJkKCl9ZWxzZSBzPWkuZ2V0Q3VycmVudFRva2VuKCk7cmV0dXJuIGYuZW5kLnJvdz1pLmdldEN1cnJlbnRUb2tlblJvdygpLGYuZW5kLmNvbHVtbj1pLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK3MudmFsdWUubGVuZ3RoLTIsZn19LHRoaXMuZm9sZEFsbD1mdW5jdGlvbihlLHQsbil7bj09dW5kZWZpbmVkJiYobj0xZTUpO3ZhciByPXRoaXMuZm9sZFdpZGdldHM7aWYoIXIpcmV0dXJuO3Q9dHx8dGhpcy5nZXRMZW5ndGgoKSxlPWV8fDA7Zm9yKHZhciBpPWU7aTx0O2krKyl7cltpXT09bnVsbCYmKHJbaV09dGhpcy5nZXRGb2xkV2lkZ2V0KGkpKTtpZihyW2ldIT0ic3RhcnQiKWNvbnRpbnVlO3ZhciBzPXRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlKGkpO2lmKHMmJnMuaXNNdWx0aUxpbmUoKSYmcy5lbmQucm93PD10JiZzLnN0YXJ0LnJvdz49ZSl7aT1zLmVuZC5yb3c7dHJ5e3ZhciBvPXRoaXMuYWRkRm9sZCgiLi4uIixzKTtvJiYoby5jb2xsYXBzZUNoaWxkcmVuPW4pfWNhdGNoKHUpe319fX0sdGhpcy4kZm9sZFN0eWxlcz17bWFudWFsOjEsbWFya2JlZ2luOjEsbWFya2JlZ2luZW5kOjF9LHRoaXMuJGZvbGRTdHlsZT0ibWFya2JlZ2luIix0aGlzLnNldEZvbGRTdHlsZT1mdW5jdGlvbihlKXtpZighdGhpcy4kZm9sZFN0eWxlc1tlXSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9sZCBzdHlsZTogIitlKyJbIitPYmplY3Qua2V5cyh0aGlzLiRmb2xkU3R5bGVzKS5qb2luKCIsICIpKyJdIik7aWYodGhpcy4kZm9sZFN0eWxlPT1lKXJldHVybjt0aGlzLiRmb2xkU3R5bGU9ZSxlPT0ibWFudWFsIiYmdGhpcy51bmZvbGQoKTt2YXIgdD10aGlzLiRmb2xkTW9kZTt0aGlzLiRzZXRGb2xkaW5nKG51bGwpLHRoaXMuJHNldEZvbGRpbmcodCl9LHRoaXMuJHNldEZvbGRpbmc9ZnVuY3Rpb24oZSl7aWYodGhpcy4kZm9sZE1vZGU9PWUpcmV0dXJuO3RoaXMuJGZvbGRNb2RlPWUsdGhpcy5vZmYoImNoYW5nZSIsdGhpcy4kdXBkYXRlRm9sZFdpZGdldHMpLHRoaXMub2ZmKCJ0b2tlbml6ZXJVcGRhdGUiLHRoaXMuJHRva2VuaXplclVwZGF0ZUZvbGRXaWRnZXRzKSx0aGlzLl9zaWduYWwoImNoYW5nZUFubm90YXRpb24iKTtpZighZXx8dGhpcy4kZm9sZFN0eWxlPT0ibWFudWFsIil7dGhpcy5mb2xkV2lkZ2V0cz1udWxsO3JldHVybn10aGlzLmZvbGRXaWRnZXRzPVtdLHRoaXMuZ2V0Rm9sZFdpZGdldD1lLmdldEZvbGRXaWRnZXQuYmluZChlLHRoaXMsdGhpcy4kZm9sZFN0eWxlKSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1lLmdldEZvbGRXaWRnZXRSYW5nZS5iaW5kKGUsdGhpcyx0aGlzLiRmb2xkU3R5bGUpLHRoaXMuJHVwZGF0ZUZvbGRXaWRnZXRzPXRoaXMudXBkYXRlRm9sZFdpZGdldHMuYmluZCh0aGlzKSx0aGlzLiR0b2tlbml6ZXJVcGRhdGVGb2xkV2lkZ2V0cz10aGlzLnRva2VuaXplclVwZGF0ZUZvbGRXaWRnZXRzLmJpbmQodGhpcyksdGhpcy5vbigiY2hhbmdlIix0aGlzLiR1cGRhdGVGb2xkV2lkZ2V0cyksdGhpcy5vbigidG9rZW5pemVyVXBkYXRlIix0aGlzLiR0b2tlbml6ZXJVcGRhdGVGb2xkV2lkZ2V0cyl9LHRoaXMuZ2V0UGFyZW50Rm9sZFJhbmdlRGF0YT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZm9sZFdpZGdldHM7aWYoIW58fHQmJm5bZV0pcmV0dXJue307dmFyIHI9ZS0xLGk7d2hpbGUocj49MCl7dmFyIHM9bltyXTtzPT1udWxsJiYocz1uW3JdPXRoaXMuZ2V0Rm9sZFdpZGdldChyKSk7aWYocz09InN0YXJ0Iil7dmFyIG89dGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2Uocik7aXx8KGk9byk7aWYobyYmby5lbmQucm93Pj1lKWJyZWFrfXItLX1yZXR1cm57cmFuZ2U6ciE9PS0xJiZvLGZpcnN0UmFuZ2U6aX19LHRoaXMub25Gb2xkV2lkZ2V0Q2xpY2s9ZnVuY3Rpb24oZSx0KXt0PXQuZG9tRXZlbnQ7dmFyIG49e2NoaWxkcmVuOnQuc2hpZnRLZXksYWxsOnQuY3RybEtleXx8dC5tZXRhS2V5LHNpYmxpbmdzOnQuYWx0S2V5fSxyPXRoaXMuJHRvZ2dsZUZvbGRXaWRnZXQoZSxuKTtpZighcil7dmFyIGk9dC50YXJnZXR8fHQuc3JjRWxlbWVudDtpJiYvYWNlX2ZvbGQtd2lkZ2V0Ly50ZXN0KGkuY2xhc3NOYW1lKSYmKGkuY2xhc3NOYW1lKz0iIGFjZV9pbnZhbGlkIil9fSx0aGlzLiR0b2dnbGVGb2xkV2lkZ2V0PWZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuZ2V0Rm9sZFdpZGdldClyZXR1cm47dmFyIG49dGhpcy5nZXRGb2xkV2lkZ2V0KGUpLHI9dGhpcy5nZXRMaW5lKGUpLGk9bj09PSJlbmQiPy0xOjEscz10aGlzLmdldEZvbGRBdChlLGk9PT0tMT8wOnIubGVuZ3RoLGkpO2lmKHMpcmV0dXJuIHQuY2hpbGRyZW58fHQuYWxsP3RoaXMucmVtb3ZlRm9sZChzKTp0aGlzLmV4cGFuZEZvbGQocyksczt2YXIgbz10aGlzLmdldEZvbGRXaWRnZXRSYW5nZShlLCEwKTtpZihvJiYhby5pc011bHRpTGluZSgpKXtzPXRoaXMuZ2V0Rm9sZEF0KG8uc3RhcnQucm93LG8uc3RhcnQuY29sdW1uLDEpO2lmKHMmJm8uaXNFcXVhbChzLnJhbmdlKSlyZXR1cm4gdGhpcy5yZW1vdmVGb2xkKHMpLHN9aWYodC5zaWJsaW5ncyl7dmFyIHU9dGhpcy5nZXRQYXJlbnRGb2xkUmFuZ2VEYXRhKGUpO2lmKHUucmFuZ2UpdmFyIGE9dS5yYW5nZS5zdGFydC5yb3crMSxmPXUucmFuZ2UuZW5kLnJvdzt0aGlzLmZvbGRBbGwoYSxmLHQuYWxsPzFlNDowKX1lbHNlIHQuY2hpbGRyZW4/KGY9bz9vLmVuZC5yb3c6dGhpcy5nZXRMZW5ndGgoKSx0aGlzLmZvbGRBbGwoZSsxLGYsdC5hbGw/MWU0OjApKTpvJiYodC5hbGwmJihvLmNvbGxhcHNlQ2hpbGRyZW49MWU0KSx0aGlzLmFkZEZvbGQoIi4uLiIsbykpO3JldHVybiBvfSx0aGlzLnRvZ2dsZUZvbGRXaWRnZXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCkucm93O3Q9dGhpcy5nZXRSb3dGb2xkU3RhcnQodCk7dmFyIG49dGhpcy4kdG9nZ2xlRm9sZFdpZGdldCh0LHt9KTtpZihuKXJldHVybjt2YXIgcj10aGlzLmdldFBhcmVudEZvbGRSYW5nZURhdGEodCwhMCk7bj1yLnJhbmdlfHxyLmZpcnN0UmFuZ2U7aWYobil7dD1uLnN0YXJ0LnJvdzt2YXIgaT10aGlzLmdldEZvbGRBdCh0LHRoaXMuZ2V0TGluZSh0KS5sZW5ndGgsMSk7aT90aGlzLnJlbW92ZUZvbGQoaSk6dGhpcy5hZGRGb2xkKCIuLi4iLG4pfX0sdGhpcy51cGRhdGVGb2xkV2lkZ2V0cz1mdW5jdGlvbihlKXt2YXIgdD1lLnN0YXJ0LnJvdyxuPWUuZW5kLnJvdy10O2lmKG49PT0wKXRoaXMuZm9sZFdpZGdldHNbdF09bnVsbDtlbHNlIGlmKGUuYWN0aW9uPT0icmVtb3ZlIil0aGlzLmZvbGRXaWRnZXRzLnNwbGljZSh0LG4rMSxudWxsKTtlbHNle3ZhciByPUFycmF5KG4rMSk7ci51bnNoaWZ0KHQsMSksdGhpcy5mb2xkV2lkZ2V0cy5zcGxpY2UuYXBwbHkodGhpcy5mb2xkV2lkZ2V0cyxyKX19LHRoaXMudG9rZW5pemVyVXBkYXRlRm9sZFdpZGdldHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhO3QuZmlyc3QhPXQubGFzdCYmdGhpcy5mb2xkV2lkZ2V0cy5sZW5ndGg+dC5maXJzdCYmdGhpcy5mb2xkV2lkZ2V0cy5zcGxpY2UodC5maXJzdCx0aGlzLmZvbGRXaWRnZXRzLmxlbmd0aCl9fXZhciByPWUoIi4uL3JhbmdlIikuUmFuZ2UsaT1lKCIuL2ZvbGRfbGluZSIpLkZvbGRMaW5lLHM9ZSgiLi9mb2xkIikuRm9sZCxvPWUoIi4uL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcjt0LkZvbGRpbmc9dX0pLGFjZS5kZWZpbmUoImFjZS9lZGl0X3Nlc3Npb24vYnJhY2tldF9tYXRjaCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS90b2tlbl9pdGVyYXRvciIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcygpe3RoaXMuZmluZE1hdGNoaW5nQnJhY2tldD1mdW5jdGlvbihlLHQpe2lmKGUuY29sdW1uPT0wKXJldHVybiBudWxsO3ZhciBuPXR8fHRoaXMuZ2V0TGluZShlLnJvdykuY2hhckF0KGUuY29sdW1uLTEpO2lmKG49PSIiKXJldHVybiBudWxsO3ZhciByPW4ubWF0Y2goLyhbXChcW1x7XSl8KFtcKVxdXH1dKS8pO3JldHVybiByP3JbMV0/dGhpcy4kZmluZENsb3NpbmdCcmFja2V0KHJbMV0sZSk6dGhpcy4kZmluZE9wZW5pbmdCcmFja2V0KHJbMl0sZSk6bnVsbH0sdGhpcy5nZXRCcmFja2V0UmFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRMaW5lKGUucm93KSxuPSEwLHIscz10LmNoYXJBdChlLmNvbHVtbi0xKSxvPXMmJnMubWF0Y2goLyhbXChcW1x7XSl8KFtcKVxdXH1dKS8pO298fChzPXQuY2hhckF0KGUuY29sdW1uKSxlPXtyb3c6ZS5yb3csY29sdW1uOmUuY29sdW1uKzF9LG89cyYmcy5tYXRjaCgvKFtcKFxbXHtdKXwoW1wpXF1cfV0pLyksbj0hMSk7aWYoIW8pcmV0dXJuIG51bGw7aWYob1sxXSl7dmFyIHU9dGhpcy4kZmluZENsb3NpbmdCcmFja2V0KG9bMV0sZSk7aWYoIXUpcmV0dXJuIG51bGw7cj1pLmZyb21Qb2ludHMoZSx1KSxufHwoci5lbmQuY29sdW1uKyssci5zdGFydC5jb2x1bW4tLSksci5jdXJzb3I9ci5lbmR9ZWxzZXt2YXIgdT10aGlzLiRmaW5kT3BlbmluZ0JyYWNrZXQob1syXSxlKTtpZighdSlyZXR1cm4gbnVsbDtyPWkuZnJvbVBvaW50cyh1LGUpLG58fChyLnN0YXJ0LmNvbHVtbisrLHIuZW5kLmNvbHVtbi0tKSxyLmN1cnNvcj1yLnN0YXJ0fXJldHVybiByfSx0aGlzLiRicmFja2V0cz17IikiOiIoIiwiKCI6IikiLCJdIjoiWyIsIlsiOiJdIiwieyI6In0iLCJ9IjoieyIsIjwiOiI+IiwiPiI6IjwifSx0aGlzLiRmaW5kT3BlbmluZ0JyYWNrZXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXMuJGJyYWNrZXRzW2VdLHM9MSxvPW5ldyByKHRoaXMsdC5yb3csdC5jb2x1bW4pLHU9by5nZXRDdXJyZW50VG9rZW4oKTt1fHwodT1vLnN0ZXBGb3J3YXJkKCkpO2lmKCF1KXJldHVybjtufHwobj1uZXcgUmVnRXhwKCIoXFwuPyIrdS50eXBlLnJlcGxhY2UoIi4iLCJcXC4iKS5yZXBsYWNlKCJycGFyZW4iLCIucGFyZW4iKS5yZXBsYWNlKC9cYig/OmVuZClcYi8sIig/OnN0YXJ0fGJlZ2lufGVuZCkiKSsiKSsiKSk7dmFyIGE9dC5jb2x1bW4tby5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKS0yLGY9dS52YWx1ZTtmb3IoOzspe3doaWxlKGE+PTApe3ZhciBsPWYuY2hhckF0KGEpO2lmKGw9PWkpe3MtPTE7aWYocz09MClyZXR1cm57cm93Om8uZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmErby5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKX19ZWxzZSBsPT1lJiYocys9MSk7YS09MX1kbyB1PW8uc3RlcEJhY2t3YXJkKCk7d2hpbGUodSYmIW4udGVzdCh1LnR5cGUpKTtpZih1PT1udWxsKWJyZWFrO2Y9dS52YWx1ZSxhPWYubGVuZ3RoLTF9cmV0dXJuIG51bGx9LHRoaXMuJGZpbmRDbG9zaW5nQnJhY2tldD1mdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcy4kYnJhY2tldHNbZV0scz0xLG89bmV3IHIodGhpcyx0LnJvdyx0LmNvbHVtbiksdT1vLmdldEN1cnJlbnRUb2tlbigpO3V8fCh1PW8uc3RlcEZvcndhcmQoKSk7aWYoIXUpcmV0dXJuO258fChuPW5ldyBSZWdFeHAoIihcXC4/Iit1LnR5cGUucmVwbGFjZSgiLiIsIlxcLiIpLnJlcGxhY2UoImxwYXJlbiIsIi5wYXJlbiIpLnJlcGxhY2UoL1xiKD86c3RhcnR8YmVnaW4pXGIvLCIoPzpzdGFydHxiZWdpbnxlbmQpIikrIikrIikpO3ZhciBhPXQuY29sdW1uLW8uZ2V0Q3VycmVudFRva2VuQ29sdW1uKCk7Zm9yKDs7KXt2YXIgZj11LnZhbHVlLGw9Zi5sZW5ndGg7d2hpbGUoYTxsKXt2YXIgYz1mLmNoYXJBdChhKTtpZihjPT1pKXtzLT0xO2lmKHM9PTApcmV0dXJue3JvdzpvLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphK28uZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9fWVsc2UgYz09ZSYmKHMrPTEpO2ErPTF9ZG8gdT1vLnN0ZXBGb3J3YXJkKCk7d2hpbGUodSYmIW4udGVzdCh1LnR5cGUpKTtpZih1PT1udWxsKWJyZWFrO2E9MH1yZXR1cm4gbnVsbH19dmFyIHI9ZSgiLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yLGk9ZSgiLi4vcmFuZ2UiKS5SYW5nZTt0LkJyYWNrZXRNYXRjaD1zfSksYWNlLmRlZmluZSgiYWNlL2VkaXRfc2Vzc2lvbiIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2JpZGloYW5kbGVyIiwiYWNlL2NvbmZpZyIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9zZWxlY3Rpb24iLCJhY2UvbW9kZS90ZXh0IiwiYWNlL3JhbmdlIiwiYWNlL2RvY3VtZW50IiwiYWNlL2JhY2tncm91bmRfdG9rZW5pemVyIiwiYWNlL3NlYXJjaF9oaWdobGlnaHQiLCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGRpbmciLCJhY2UvZWRpdF9zZXNzaW9uL2JyYWNrZXRfbWF0Y2giXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvbGFuZyIpLHM9ZSgiLi9iaWRpaGFuZGxlciIpLkJpZGlIYW5kbGVyLG89ZSgiLi9jb25maWciKSx1PWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsYT1lKCIuL3NlbGVjdGlvbiIpLlNlbGVjdGlvbixmPWUoIi4vbW9kZS90ZXh0IikuTW9kZSxsPWUoIi4vcmFuZ2UiKS5SYW5nZSxjPWUoIi4vZG9jdW1lbnQiKS5Eb2N1bWVudCxoPWUoIi4vYmFja2dyb3VuZF90b2tlbml6ZXIiKS5CYWNrZ3JvdW5kVG9rZW5pemVyLHA9ZSgiLi9zZWFyY2hfaGlnaGxpZ2h0IikuU2VhcmNoSGlnaGxpZ2h0LGQ9ZnVuY3Rpb24oZSx0KXt0aGlzLiRicmVha3BvaW50cz1bXSx0aGlzLiRkZWNvcmF0aW9ucz1bXSx0aGlzLiRmcm9udE1hcmtlcnM9e30sdGhpcy4kYmFja01hcmtlcnM9e30sdGhpcy4kbWFya2VySWQ9MSx0aGlzLiR1bmRvU2VsZWN0PSEwLHRoaXMuJGZvbGREYXRhPVtdLHRoaXMuaWQ9InNlc3Npb24iKyArK2QuJHVpZCx0aGlzLiRmb2xkRGF0YS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmpvaW4oIlxuIil9LHRoaXMub24oImNoYW5nZUZvbGQiLHRoaXMub25DaGFuZ2VGb2xkLmJpbmQodGhpcykpLHRoaXMuJG9uQ2hhbmdlPXRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fCFlLmdldExpbmUpZT1uZXcgYyhlKTt0aGlzLnNldERvY3VtZW50KGUpLHRoaXMuc2VsZWN0aW9uPW5ldyBhKHRoaXMpLHRoaXMuJGJpZGlIYW5kbGVyPW5ldyBzKHRoaXMpLG8ucmVzZXRPcHRpb25zKHRoaXMpLHRoaXMuc2V0TW9kZSh0KSxvLl9zaWduYWwoInNlc3Npb24iLHRoaXMpfTtkLiR1aWQ9MCxmdW5jdGlvbigpe2Z1bmN0aW9uIG0oZSl7cmV0dXJuIGU8NDM1Mj8hMTplPj00MzUyJiZlPD00NDQ3fHxlPj00NTE1JiZlPD00NTE5fHxlPj00NjAyJiZlPD00NjA3fHxlPj05MDAxJiZlPD05MDAyfHxlPj0xMTkwNCYmZTw9MTE5Mjl8fGU+PTExOTMxJiZlPD0xMjAxOXx8ZT49MTIwMzImJmU8PTEyMjQ1fHxlPj0xMjI3MiYmZTw9MTIyODN8fGU+PTEyMjg4JiZlPD0xMjM1MHx8ZT49MTIzNTMmJmU8PTEyNDM4fHxlPj0xMjQ0MSYmZTw9MTI1NDN8fGU+PTEyNTQ5JiZlPD0xMjU4OXx8ZT49MTI1OTMmJmU8PTEyNjg2fHxlPj0xMjY4OCYmZTw9MTI3MzB8fGU+PTEyNzM2JiZlPD0xMjc3MXx8ZT49MTI3ODQmJmU8PTEyODMwfHxlPj0xMjgzMiYmZTw9MTI4NzF8fGU+PTEyODgwJiZlPD0xMzA1NHx8ZT49MTMwNTYmJmU8PTE5OTAzfHxlPj0xOTk2OCYmZTw9NDIxMjR8fGU+PTQyMTI4JiZlPD00MjE4Mnx8ZT49NDMzNjAmJmU8PTQzMzg4fHxlPj00NDAzMiYmZTw9NTUyMDN8fGU+PTU1MjE2JiZlPD01NTIzOHx8ZT49NTUyNDMmJmU8PTU1MjkxfHxlPj02Mzc0NCYmZTw9NjQyNTV8fGU+PTY1MDQwJiZlPD02NTA0OXx8ZT49NjUwNzImJmU8PTY1MTA2fHxlPj02NTEwOCYmZTw9NjUxMjZ8fGU+PTY1MTI4JiZlPD02NTEzMXx8ZT49NjUyODEmJmU8PTY1Mzc2fHxlPj02NTUwNCYmZTw9NjU1MTB9ci5pbXBsZW1lbnQodGhpcyx1KSx0aGlzLnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3RoaXMuZG9jJiZ0aGlzLmRvYy5yZW1vdmVMaXN0ZW5lcigiY2hhbmdlIix0aGlzLiRvbkNoYW5nZSksdGhpcy5kb2M9ZSxlLm9uKCJjaGFuZ2UiLHRoaXMuJG9uQ2hhbmdlKSx0aGlzLmJnVG9rZW5pemVyJiZ0aGlzLmJnVG9rZW5pemVyLnNldERvY3VtZW50KHRoaXMuZ2V0RG9jdW1lbnQoKSksdGhpcy5yZXNldENhY2hlcygpfSx0aGlzLmdldERvY3VtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jfSx0aGlzLiRyZXNldFJvd0NhY2hlPWZ1bmN0aW9uKGUpe2lmKCFlKXt0aGlzLiRkb2NSb3dDYWNoZT1bXSx0aGlzLiRzY3JlZW5Sb3dDYWNoZT1bXTtyZXR1cm59dmFyIHQ9dGhpcy4kZG9jUm93Q2FjaGUubGVuZ3RoLG49dGhpcy4kZ2V0Um93Q2FjaGVJbmRleCh0aGlzLiRkb2NSb3dDYWNoZSxlKSsxO3Q+biYmKHRoaXMuJGRvY1Jvd0NhY2hlLnNwbGljZShuLHQpLHRoaXMuJHNjcmVlblJvd0NhY2hlLnNwbGljZShuLHQpKX0sdGhpcy4kZ2V0Um93Q2FjaGVJbmRleD1mdW5jdGlvbihlLHQpe3ZhciBuPTAscj1lLmxlbmd0aC0xO3doaWxlKG48PXIpe3ZhciBpPW4rcj4+MSxzPWVbaV07aWYodD5zKW49aSsxO2Vsc2V7aWYoISh0PHMpKXJldHVybiBpO3I9aS0xfX1yZXR1cm4gbi0xfSx0aGlzLnJlc2V0Q2FjaGVzPWZ1bmN0aW9uKCl7dGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kd3JhcERhdGE9W10sdGhpcy4kcm93TGVuZ3RoQ2FjaGU9W10sdGhpcy4kcmVzZXRSb3dDYWNoZSgwKSx0aGlzLmJnVG9rZW5pemVyJiZ0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KDApfSx0aGlzLm9uQ2hhbmdlRm9sZD1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7dGhpcy4kcmVzZXRSb3dDYWNoZSh0LnN0YXJ0LnJvdyl9LHRoaXMub25DaGFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kYmlkaUhhbmRsZXIub25DaGFuZ2UoZSksdGhpcy4kcmVzZXRSb3dDYWNoZShlLnN0YXJ0LnJvdyk7dmFyIHQ9dGhpcy4kdXBkYXRlSW50ZXJuYWxEYXRhT25DaGFuZ2UoZSk7IXRoaXMuJGZyb21VbmRvJiZ0aGlzLiR1bmRvTWFuYWdlciYmKHQmJnQubGVuZ3RoJiYodGhpcy4kdW5kb01hbmFnZXIuYWRkKHthY3Rpb246InJlbW92ZUZvbGRzIixmb2xkczp0fSx0aGlzLm1lcmdlVW5kb0RlbHRhcyksdGhpcy5tZXJnZVVuZG9EZWx0YXM9ITApLHRoaXMuJHVuZG9NYW5hZ2VyLmFkZChlLHRoaXMubWVyZ2VVbmRvRGVsdGFzKSx0aGlzLm1lcmdlVW5kb0RlbHRhcz0hMCx0aGlzLiRpbmZvcm1VbmRvTWFuYWdlci5zY2hlZHVsZSgpKSx0aGlzLmJnVG9rZW5pemVyJiZ0aGlzLmJnVG9rZW5pemVyLiR1cGRhdGVPbkNoYW5nZShlKSx0aGlzLl9zaWduYWwoImNoYW5nZSIsZSl9LHRoaXMuc2V0VmFsdWU9ZnVuY3Rpb24oZSl7dGhpcy5kb2Muc2V0VmFsdWUoZSksdGhpcy5zZWxlY3Rpb24ubW92ZVRvKDAsMCksdGhpcy4kcmVzZXRSb3dDYWNoZSgwKSx0aGlzLnNldFVuZG9NYW5hZ2VyKHRoaXMuJHVuZG9NYW5hZ2VyKSx0aGlzLmdldFVuZG9NYW5hZ2VyKCkucmVzZXQoKX0sdGhpcy5nZXRWYWx1ZT10aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jLmdldFZhbHVlKCl9LHRoaXMuZ2V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9ufSx0aGlzLmdldFN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJnVG9rZW5pemVyLmdldFN0YXRlKGUpfSx0aGlzLmdldFRva2Vucz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5iZ1Rva2VuaXplci5nZXRUb2tlbnMoZSl9LHRoaXMuZ2V0VG9rZW5BdD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYmdUb2tlbml6ZXIuZ2V0VG9rZW5zKGUpLHIsaT0wO2lmKHQ9PW51bGwpe3ZhciBzPW4ubGVuZ3RoLTE7aT10aGlzLmdldExpbmUoZSkubGVuZ3RofWVsc2UgZm9yKHZhciBzPTA7czxuLmxlbmd0aDtzKyspe2krPW5bc10udmFsdWUubGVuZ3RoO2lmKGk+PXQpYnJlYWt9cmV0dXJuIHI9bltzXSxyPyhyLmluZGV4PXMsci5zdGFydD1pLXIudmFsdWUubGVuZ3RoLHIpOm51bGx9LHRoaXMuc2V0VW5kb01hbmFnZXI9ZnVuY3Rpb24oZSl7dGhpcy4kdW5kb01hbmFnZXI9ZSx0aGlzLiRpbmZvcm1VbmRvTWFuYWdlciYmdGhpcy4kaW5mb3JtVW5kb01hbmFnZXIuY2FuY2VsKCk7aWYoZSl7dmFyIHQ9dGhpcztlLmFkZFNlc3Npb24odGhpcyksdGhpcy4kc3luY0luZm9ybVVuZG9NYW5hZ2VyPWZ1bmN0aW9uKCl7dC4kaW5mb3JtVW5kb01hbmFnZXIuY2FuY2VsKCksdC5tZXJnZVVuZG9EZWx0YXM9ITF9LHRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyPWkuZGVsYXllZENhbGwodGhpcy4kc3luY0luZm9ybVVuZG9NYW5hZ2VyKX1lbHNlIHRoaXMuJHN5bmNJbmZvcm1VbmRvTWFuYWdlcj1mdW5jdGlvbigpe319LHRoaXMubWFya1VuZG9Hcm91cD1mdW5jdGlvbigpe3RoaXMuJHN5bmNJbmZvcm1VbmRvTWFuYWdlciYmdGhpcy4kc3luY0luZm9ybVVuZG9NYW5hZ2VyKCl9LHRoaXMuJGRlZmF1bHRVbmRvTWFuYWdlcj17dW5kbzpmdW5jdGlvbigpe30scmVkbzpmdW5jdGlvbigpe30saGFzVW5kbzpmdW5jdGlvbigpe30saGFzUmVkbzpmdW5jdGlvbigpe30scmVzZXQ6ZnVuY3Rpb24oKXt9LGFkZDpmdW5jdGlvbigpe30sYWRkU2VsZWN0aW9uOmZ1bmN0aW9uKCl7fSxzdGFydE5ld0dyb3VwOmZ1bmN0aW9uKCl7fSxhZGRTZXNzaW9uOmZ1bmN0aW9uKCl7fX0sdGhpcy5nZXRVbmRvTWFuYWdlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1bmRvTWFuYWdlcnx8dGhpcy4kZGVmYXVsdFVuZG9NYW5hZ2VyfSx0aGlzLmdldFRhYlN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFVzZVNvZnRUYWJzKCk/aS5zdHJpbmdSZXBlYXQoIiAiLHRoaXMuZ2V0VGFiU2l6ZSgpKToiCSJ9LHRoaXMuc2V0VXNlU29mdFRhYnM9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInVzZVNvZnRUYWJzIixlKX0sdGhpcy5nZXRVc2VTb2Z0VGFicz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1c2VTb2Z0VGFicyYmIXRoaXMuJG1vZGUuJGluZGVudFdpdGhUYWJzfSx0aGlzLnNldFRhYlNpemU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInRhYlNpemUiLGUpfSx0aGlzLmdldFRhYlNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdGFiU2l6ZX0sdGhpcy5pc1RhYlN0b3A9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJHVzZVNvZnRUYWJzJiZlLmNvbHVtbiV0aGlzLiR0YWJTaXplPT09MH0sdGhpcy5zZXROYXZpZ2F0ZVdpdGhpblNvZnRUYWJzPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJuYXZpZ2F0ZVdpdGhpblNvZnRUYWJzIixlKX0sdGhpcy5nZXROYXZpZ2F0ZVdpdGhpblNvZnRUYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG5hdmlnYXRlV2l0aGluU29mdFRhYnN9LHRoaXMuJG92ZXJ3cml0ZT0hMSx0aGlzLnNldE92ZXJ3cml0ZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigib3ZlcndyaXRlIixlKX0sdGhpcy5nZXRPdmVyd3JpdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kb3ZlcndyaXRlfSx0aGlzLnRvZ2dsZU92ZXJ3cml0ZT1mdW5jdGlvbigpe3RoaXMuc2V0T3ZlcndyaXRlKCF0aGlzLiRvdmVyd3JpdGUpfSx0aGlzLmFkZEd1dHRlckRlY29yYXRpb249ZnVuY3Rpb24oZSx0KXt0aGlzLiRkZWNvcmF0aW9uc1tlXXx8KHRoaXMuJGRlY29yYXRpb25zW2VdPSIiKSx0aGlzLiRkZWNvcmF0aW9uc1tlXSs9IiAiK3QsdGhpcy5fc2lnbmFsKCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbj1mdW5jdGlvbihlLHQpe3RoaXMuJGRlY29yYXRpb25zW2VdPSh0aGlzLiRkZWNvcmF0aW9uc1tlXXx8IiIpLnJlcGxhY2UoIiAiK3QsIiIpLHRoaXMuX3NpZ25hbCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLmdldEJyZWFrcG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGJyZWFrcG9pbnRzfSx0aGlzLnNldEJyZWFrcG9pbnRzPWZ1bmN0aW9uKGUpe3RoaXMuJGJyZWFrcG9pbnRzPVtdO2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXRoaXMuJGJyZWFrcG9pbnRzW2VbdF1dPSJhY2VfYnJlYWtwb2ludCI7dGhpcy5fc2lnbmFsKCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMuY2xlYXJCcmVha3BvaW50cz1mdW5jdGlvbigpe3RoaXMuJGJyZWFrcG9pbnRzPVtdLHRoaXMuX3NpZ25hbCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLnNldEJyZWFrcG9pbnQ9ZnVuY3Rpb24oZSx0KXt0PT09dW5kZWZpbmVkJiYodD0iYWNlX2JyZWFrcG9pbnQiKSx0P3RoaXMuJGJyZWFrcG9pbnRzW2VdPXQ6ZGVsZXRlIHRoaXMuJGJyZWFrcG9pbnRzW2VdLHRoaXMuX3NpZ25hbCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLmNsZWFyQnJlYWtwb2ludD1mdW5jdGlvbihlKXtkZWxldGUgdGhpcy4kYnJlYWtwb2ludHNbZV0sdGhpcy5fc2lnbmFsKCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMuYWRkTWFya2VyPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuJG1hcmtlcklkKysscz17cmFuZ2U6ZSx0eXBlOm58fCJsaW5lIixyZW5kZXJlcjp0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uOm51bGwsY2xheno6dCxpbkZyb250OiEhcixpZDppfTtyZXR1cm4gcj8odGhpcy4kZnJvbnRNYXJrZXJzW2ldPXMsdGhpcy5fc2lnbmFsKCJjaGFuZ2VGcm9udE1hcmtlciIpKToodGhpcy4kYmFja01hcmtlcnNbaV09cyx0aGlzLl9zaWduYWwoImNoYW5nZUJhY2tNYXJrZXIiKSksaX0sdGhpcy5hZGREeW5hbWljTWFya2VyPWZ1bmN0aW9uKGUsdCl7aWYoIWUudXBkYXRlKXJldHVybjt2YXIgbj10aGlzLiRtYXJrZXJJZCsrO3JldHVybiBlLmlkPW4sZS5pbkZyb250PSEhdCx0Pyh0aGlzLiRmcm9udE1hcmtlcnNbbl09ZSx0aGlzLl9zaWduYWwoImNoYW5nZUZyb250TWFya2VyIikpOih0aGlzLiRiYWNrTWFya2Vyc1tuXT1lLHRoaXMuX3NpZ25hbCgiY2hhbmdlQmFja01hcmtlciIpKSxlfSx0aGlzLnJlbW92ZU1hcmtlcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRmcm9udE1hcmtlcnNbZV18fHRoaXMuJGJhY2tNYXJrZXJzW2VdO2lmKCF0KXJldHVybjt2YXIgbj10LmluRnJvbnQ/dGhpcy4kZnJvbnRNYXJrZXJzOnRoaXMuJGJhY2tNYXJrZXJzO2RlbGV0ZSBuW2VdLHRoaXMuX3NpZ25hbCh0LmluRnJvbnQ/ImNoYW5nZUZyb250TWFya2VyIjoiY2hhbmdlQmFja01hcmtlciIpfSx0aGlzLmdldE1hcmtlcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/dGhpcy4kZnJvbnRNYXJrZXJzOnRoaXMuJGJhY2tNYXJrZXJzfSx0aGlzLmhpZ2hsaWdodD1mdW5jdGlvbihlKXtpZighdGhpcy4kc2VhcmNoSGlnaGxpZ2h0KXt2YXIgdD1uZXcgcChudWxsLCJhY2Vfc2VsZWN0ZWQtd29yZCIsInRleHQiKTt0aGlzLiRzZWFyY2hIaWdobGlnaHQ9dGhpcy5hZGREeW5hbWljTWFya2VyKHQpfXRoaXMuJHNlYXJjaEhpZ2hsaWdodC5zZXRSZWdleHAoZSl9LHRoaXMuaGlnaGxpZ2h0TGluZXM9ZnVuY3Rpb24oZSx0LG4scil7dHlwZW9mIHQhPSJudW1iZXIiJiYobj10LHQ9ZSksbnx8KG49ImFjZV9zdGVwIik7dmFyIGk9bmV3IGwoZSwwLHQsSW5maW5pdHkpO3JldHVybiBpLmlkPXRoaXMuYWRkTWFya2VyKGksbiwiZnVsbExpbmUiLHIpLGl9LHRoaXMuc2V0QW5ub3RhdGlvbnM9ZnVuY3Rpb24oZSl7dGhpcy4kYW5ub3RhdGlvbnM9ZSx0aGlzLl9zaWduYWwoImNoYW5nZUFubm90YXRpb24iLHt9KX0sdGhpcy5nZXRBbm5vdGF0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRhbm5vdGF0aW9uc3x8W119LHRoaXMuY2xlYXJBbm5vdGF0aW9ucz1mdW5jdGlvbigpe3RoaXMuc2V0QW5ub3RhdGlvbnMoW10pfSx0aGlzLiRkZXRlY3ROZXdMaW5lPWZ1bmN0aW9uKGUpe3ZhciB0PWUubWF0Y2goL14uKj8oXHI/XG4pL20pO3Q/dGhpcy4kYXV0b05ld0xpbmU9dFsxXTp0aGlzLiRhdXRvTmV3TGluZT0iXG4ifSx0aGlzLmdldFdvcmRSYW5nZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0TGluZShlKSxyPSExO3Q+MCYmKHI9ISFuLmNoYXJBdCh0LTEpLm1hdGNoKHRoaXMudG9rZW5SZSkpLHJ8fChyPSEhbi5jaGFyQXQodCkubWF0Y2godGhpcy50b2tlblJlKSk7aWYocil2YXIgaT10aGlzLnRva2VuUmU7ZWxzZSBpZigvXlxzKyQvLnRlc3Qobi5zbGljZSh0LTEsdCsxKSkpdmFyIGk9L1xzLztlbHNlIHZhciBpPXRoaXMubm9uVG9rZW5SZTt2YXIgcz10O2lmKHM+MCl7ZG8gcy0tO3doaWxlKHM+PTAmJm4uY2hhckF0KHMpLm1hdGNoKGkpKTtzKyt9dmFyIG89dDt3aGlsZShvPG4ubGVuZ3RoJiZuLmNoYXJBdChvKS5tYXRjaChpKSlvKys7cmV0dXJuIG5ldyBsKGUscyxlLG8pfSx0aGlzLmdldEFXb3JkUmFuZ2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldFdvcmRSYW5nZShlLHQpLHI9dGhpcy5nZXRMaW5lKG4uZW5kLnJvdyk7d2hpbGUoci5jaGFyQXQobi5lbmQuY29sdW1uKS5tYXRjaCgvWyBcdF0vKSluLmVuZC5jb2x1bW4rPTE7cmV0dXJuIG59LHRoaXMuc2V0TmV3TGluZU1vZGU9ZnVuY3Rpb24oZSl7dGhpcy5kb2Muc2V0TmV3TGluZU1vZGUoZSl9LHRoaXMuZ2V0TmV3TGluZU1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2MuZ2V0TmV3TGluZU1vZGUoKX0sdGhpcy5zZXRVc2VXb3JrZXI9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInVzZVdvcmtlciIsZSl9LHRoaXMuZ2V0VXNlV29ya2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHVzZVdvcmtlcn0sdGhpcy5vblJlbG9hZFRva2VuaXplcj1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7dGhpcy5iZ1Rva2VuaXplci5zdGFydCh0LmZpcnN0KSx0aGlzLl9zaWduYWwoInRva2VuaXplclVwZGF0ZSIsZSl9LHRoaXMuJG1vZGVzPW8uJG1vZGVzLHRoaXMuJG1vZGU9bnVsbCx0aGlzLiRtb2RlSWQ9bnVsbCx0aGlzLnNldE1vZGU9ZnVuY3Rpb24oZSx0KXtpZihlJiZ0eXBlb2YgZT09Im9iamVjdCIpe2lmKGUuZ2V0VG9rZW5pemVyKXJldHVybiB0aGlzLiRvbkNoYW5nZU1vZGUoZSk7dmFyIG49ZSxyPW4ucGF0aH1lbHNlIHI9ZXx8ImFjZS9tb2RlL3RleHQiO3RoaXMuJG1vZGVzWyJhY2UvbW9kZS90ZXh0Il18fCh0aGlzLiRtb2Rlc1siYWNlL21vZGUvdGV4dCJdPW5ldyBmKTtpZih0aGlzLiRtb2Rlc1tyXSYmIW4pe3RoaXMuJG9uQ2hhbmdlTW9kZSh0aGlzLiRtb2Rlc1tyXSksdCYmdCgpO3JldHVybn10aGlzLiRtb2RlSWQ9cixvLmxvYWRNb2R1bGUoWyJtb2RlIixyXSxmdW5jdGlvbihlKXtpZih0aGlzLiRtb2RlSWQhPT1yKXJldHVybiB0JiZ0KCk7dGhpcy4kbW9kZXNbcl0mJiFuP3RoaXMuJG9uQ2hhbmdlTW9kZSh0aGlzLiRtb2Rlc1tyXSk6ZSYmZS5Nb2RlJiYoZT1uZXcgZS5Nb2RlKG4pLG58fCh0aGlzLiRtb2Rlc1tyXT1lLGUuJGlkPXIpLHRoaXMuJG9uQ2hhbmdlTW9kZShlKSksdCYmdCgpfS5iaW5kKHRoaXMpKSx0aGlzLiRtb2RlfHx0aGlzLiRvbkNoYW5nZU1vZGUodGhpcy4kbW9kZXNbImFjZS9tb2RlL3RleHQiXSwhMCl9LHRoaXMuJG9uQ2hhbmdlTW9kZT1mdW5jdGlvbihlLHQpe3R8fCh0aGlzLiRtb2RlSWQ9ZS4kaWQpO2lmKHRoaXMuJG1vZGU9PT1lKXJldHVybjt0aGlzLiRtb2RlPWUsdGhpcy4kc3RvcFdvcmtlcigpLHRoaXMuJHVzZVdvcmtlciYmdGhpcy4kc3RhcnRXb3JrZXIoKTt2YXIgbj1lLmdldFRva2VuaXplcigpO2lmKG4uYWRkRXZlbnRMaXN0ZW5lciE9PXVuZGVmaW5lZCl7dmFyIHI9dGhpcy5vblJlbG9hZFRva2VuaXplci5iaW5kKHRoaXMpO24uYWRkRXZlbnRMaXN0ZW5lcigidXBkYXRlIixyKX1pZighdGhpcy5iZ1Rva2VuaXplcil7dGhpcy5iZ1Rva2VuaXplcj1uZXcgaChuKTt2YXIgaT10aGlzO3RoaXMuYmdUb2tlbml6ZXIuYWRkRXZlbnRMaXN0ZW5lcigidXBkYXRlIixmdW5jdGlvbihlKXtpLl9zaWduYWwoInRva2VuaXplclVwZGF0ZSIsZSl9KX1lbHNlIHRoaXMuYmdUb2tlbml6ZXIuc2V0VG9rZW5pemVyKG4pO3RoaXMuYmdUb2tlbml6ZXIuc2V0RG9jdW1lbnQodGhpcy5nZXREb2N1bWVudCgpKSx0aGlzLnRva2VuUmU9ZS50b2tlblJlLHRoaXMubm9uVG9rZW5SZT1lLm5vblRva2VuUmUsdHx8KGUuYXR0YWNoVG9TZXNzaW9uJiZlLmF0dGFjaFRvU2Vzc2lvbih0aGlzKSx0aGlzLiRvcHRpb25zLndyYXBNZXRob2Quc2V0LmNhbGwodGhpcyx0aGlzLiR3cmFwTWV0aG9kKSx0aGlzLiRzZXRGb2xkaW5nKGUuZm9sZGluZ1J1bGVzKSx0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KDApLHRoaXMuX2VtaXQoImNoYW5nZU1vZGUiKSl9LHRoaXMuJHN0b3BXb3JrZXI9ZnVuY3Rpb24oKXt0aGlzLiR3b3JrZXImJih0aGlzLiR3b3JrZXIudGVybWluYXRlKCksdGhpcy4kd29ya2VyPW51bGwpfSx0aGlzLiRzdGFydFdvcmtlcj1mdW5jdGlvbigpe3RyeXt0aGlzLiR3b3JrZXI9dGhpcy4kbW9kZS5jcmVhdGVXb3JrZXIodGhpcyl9Y2F0Y2goZSl7by53YXJuKCJDb3VsZCBub3QgbG9hZCB3b3JrZXIiLGUpLHRoaXMuJHdvcmtlcj1udWxsfX0sdGhpcy5nZXRNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG1vZGV9LHRoaXMuJHNjcm9sbFRvcD0wLHRoaXMuc2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJHNjcm9sbFRvcD09PWV8fGlzTmFOKGUpKXJldHVybjt0aGlzLiRzY3JvbGxUb3A9ZSx0aGlzLl9zaWduYWwoImNoYW5nZVNjcm9sbFRvcCIsZSl9LHRoaXMuZ2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNjcm9sbFRvcH0sdGhpcy4kc2Nyb2xsTGVmdD0wLHRoaXMuc2V0U2Nyb2xsTGVmdD1mdW5jdGlvbihlKXtpZih0aGlzLiRzY3JvbGxMZWZ0PT09ZXx8aXNOYU4oZSkpcmV0dXJuO3RoaXMuJHNjcm9sbExlZnQ9ZSx0aGlzLl9zaWduYWwoImNoYW5nZVNjcm9sbExlZnQiLGUpfSx0aGlzLmdldFNjcm9sbExlZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2Nyb2xsTGVmdH0sdGhpcy5nZXRTY3JlZW5XaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRjb21wdXRlV2lkdGgoKSx0aGlzLmxpbmVXaWRnZXRzP01hdGgubWF4KHRoaXMuZ2V0TGluZVdpZGdldE1heFdpZHRoKCksdGhpcy5zY3JlZW5XaWR0aCk6dGhpcy5zY3JlZW5XaWR0aH0sdGhpcy5nZXRMaW5lV2lkZ2V0TWF4V2lkdGg9ZnVuY3Rpb24oKXtpZih0aGlzLmxpbmVXaWRnZXRzV2lkdGghPW51bGwpcmV0dXJuIHRoaXMubGluZVdpZGdldHNXaWR0aDt2YXIgZT0wO3JldHVybiB0aGlzLmxpbmVXaWRnZXRzLmZvckVhY2goZnVuY3Rpb24odCl7dCYmdC5zY3JlZW5XaWR0aD5lJiYoZT10LnNjcmVlbldpZHRoKX0pLHRoaXMubGluZVdpZGdldFdpZHRoPWV9LHRoaXMuJGNvbXB1dGVXaWR0aD1mdW5jdGlvbihlKXtpZih0aGlzLiRtb2RpZmllZHx8ZSl7dGhpcy4kbW9kaWZpZWQ9ITE7aWYodGhpcy4kdXNlV3JhcE1vZGUpcmV0dXJuIHRoaXMuc2NyZWVuV2lkdGg9dGhpcy4kd3JhcExpbWl0O3ZhciB0PXRoaXMuZG9jLmdldEFsbExpbmVzKCksbj10aGlzLiRyb3dMZW5ndGhDYWNoZSxyPTAsaT0wLHM9dGhpcy4kZm9sZERhdGFbaV0sbz1zP3Muc3RhcnQucm93OkluZmluaXR5LHU9dC5sZW5ndGg7Zm9yKHZhciBhPTA7YTx1O2ErKyl7aWYoYT5vKXthPXMuZW5kLnJvdysxO2lmKGE+PXUpYnJlYWs7cz10aGlzLiRmb2xkRGF0YVtpKytdLG89cz9zLnN0YXJ0LnJvdzpJbmZpbml0eX1uW2FdPT1udWxsJiYoblthXT10aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aCh0W2FdKVswXSksblthXT5yJiYocj1uW2FdKX10aGlzLnNjcmVlbldpZHRoPXJ9fSx0aGlzLmdldExpbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZG9jLmdldExpbmUoZSl9LHRoaXMuZ2V0TGluZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5kb2MuZ2V0TGluZXMoZSx0KX0sdGhpcy5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2MuZ2V0TGVuZ3RoKCl9LHRoaXMuZ2V0VGV4dFJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRvYy5nZXRUZXh0UmFuZ2UoZXx8dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSl9LHRoaXMuaW5zZXJ0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZG9jLmluc2VydChlLHQpfSx0aGlzLnJlbW92ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5kb2MucmVtb3ZlKGUpfSx0aGlzLnJlbW92ZUZ1bGxMaW5lcz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmRvYy5yZW1vdmVGdWxsTGluZXMoZSx0KX0sdGhpcy51bmRvQ2hhbmdlcz1mdW5jdGlvbihlLHQpe2lmKCFlLmxlbmd0aClyZXR1cm47dGhpcy4kZnJvbVVuZG89ITA7Zm9yKHZhciBuPWUubGVuZ3RoLTE7biE9LTE7bi0tKXt2YXIgcj1lW25dO3IuYWN0aW9uPT0iaW5zZXJ0Inx8ci5hY3Rpb249PSJyZW1vdmUiP3RoaXMuZG9jLnJldmVydERlbHRhKHIpOnIuZm9sZHMmJnRoaXMuYWRkRm9sZHMoci5mb2xkcyl9IXQmJnRoaXMuJHVuZG9TZWxlY3QmJihlLnNlbGVjdGlvbkJlZm9yZT90aGlzLnNlbGVjdGlvbi5mcm9tSlNPTihlLnNlbGVjdGlvbkJlZm9yZSk6dGhpcy5zZWxlY3Rpb24uc2V0UmFuZ2UodGhpcy4kZ2V0VW5kb1NlbGVjdGlvbihlLCEwKSkpLHRoaXMuJGZyb21VbmRvPSExfSx0aGlzLnJlZG9DaGFuZ2VzPWZ1bmN0aW9uKGUsdCl7aWYoIWUubGVuZ3RoKXJldHVybjt0aGlzLiRmcm9tVW5kbz0hMDtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTsoci5hY3Rpb249PSJpbnNlcnQifHxyLmFjdGlvbj09InJlbW92ZSIpJiZ0aGlzLmRvYy5hcHBseURlbHRhKHIpfSF0JiZ0aGlzLiR1bmRvU2VsZWN0JiYoZS5zZWxlY3Rpb25BZnRlcj90aGlzLnNlbGVjdGlvbi5mcm9tSlNPTihlLnNlbGVjdGlvbkFmdGVyKTp0aGlzLnNlbGVjdGlvbi5zZXRSYW5nZSh0aGlzLiRnZXRVbmRvU2VsZWN0aW9uKGUsITEpKSksdGhpcy4kZnJvbVVuZG89ITF9LHRoaXMuc2V0VW5kb1NlbGVjdD1mdW5jdGlvbihlKXt0aGlzLiR1bmRvU2VsZWN0PWV9LHRoaXMuJGdldFVuZG9TZWxlY3Rpb249ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiB0P2UuYWN0aW9uIT09Imluc2VydCI6ZS5hY3Rpb249PT0iaW5zZXJ0In12YXIgcixpLHM7Zm9yKHZhciBvPTA7bzxlLmxlbmd0aDtvKyspe3ZhciB1PWVbb107aWYoIXUuc3RhcnQpY29udGludWU7aWYoIXIpe24odSk/KHI9bC5mcm9tUG9pbnRzKHUuc3RhcnQsdS5lbmQpLHM9ITApOihyPWwuZnJvbVBvaW50cyh1LnN0YXJ0LHUuc3RhcnQpLHM9ITEpO2NvbnRpbnVlfW4odSk/KGk9dS5zdGFydCxyLmNvbXBhcmUoaS5yb3csaS5jb2x1bW4pPT0tMSYmci5zZXRTdGFydChpKSxpPXUuZW5kLHIuY29tcGFyZShpLnJvdyxpLmNvbHVtbik9PTEmJnIuc2V0RW5kKGkpLHM9ITApOihpPXUuc3RhcnQsci5jb21wYXJlKGkucm93LGkuY29sdW1uKT09LTEmJihyPWwuZnJvbVBvaW50cyh1LnN0YXJ0LHUuc3RhcnQpKSxzPSExKX1yZXR1cm4gcn0sdGhpcy5yZXBsYWNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZG9jLnJlcGxhY2UoZSx0KX0sdGhpcy5tb3ZlVGV4dD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5nZXRUZXh0UmFuZ2UoZSksaT10aGlzLmdldEZvbGRzSW5SYW5nZShlKSxzPWwuZnJvbVBvaW50cyh0LHQpO2lmKCFuKXt0aGlzLnJlbW92ZShlKTt2YXIgbz1lLnN0YXJ0LnJvdy1lLmVuZC5yb3csdT1vPy1lLmVuZC5jb2x1bW46ZS5zdGFydC5jb2x1bW4tZS5lbmQuY29sdW1uO3UmJihzLnN0YXJ0LnJvdz09ZS5lbmQucm93JiZzLnN0YXJ0LmNvbHVtbj5lLmVuZC5jb2x1bW4mJihzLnN0YXJ0LmNvbHVtbis9dSkscy5lbmQucm93PT1lLmVuZC5yb3cmJnMuZW5kLmNvbHVtbj5lLmVuZC5jb2x1bW4mJihzLmVuZC5jb2x1bW4rPXUpKSxvJiZzLnN0YXJ0LnJvdz49ZS5lbmQucm93JiYocy5zdGFydC5yb3crPW8scy5lbmQucm93Kz1vKX1zLmVuZD10aGlzLmluc2VydChzLnN0YXJ0LHIpO2lmKGkubGVuZ3RoKXt2YXIgYT1lLnN0YXJ0LGY9cy5zdGFydCxvPWYucm93LWEucm93LHU9Zi5jb2x1bW4tYS5jb2x1bW47dGhpcy5hZGRGb2xkcyhpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZT1lLmNsb25lKCksZS5zdGFydC5yb3c9PWEucm93JiYoZS5zdGFydC5jb2x1bW4rPXUpLGUuZW5kLnJvdz09YS5yb3cmJihlLmVuZC5jb2x1bW4rPXUpLGUuc3RhcnQucm93Kz1vLGUuZW5kLnJvdys9byxlfSkpfXJldHVybiBzfSx0aGlzLmluZGVudFJvd3M9ZnVuY3Rpb24oZSx0LG4pe249bi5yZXBsYWNlKC9cdC9nLHRoaXMuZ2V0VGFiU3RyaW5nKCkpO2Zvcih2YXIgcj1lO3I8PXQ7cisrKXRoaXMuZG9jLmluc2VydEluTGluZSh7cm93OnIsY29sdW1uOjB9LG4pfSx0aGlzLm91dGRlbnRSb3dzPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY29sbGFwc2VSb3dzKCksbj1uZXcgbCgwLDAsMCwwKSxyPXRoaXMuZ2V0VGFiU2l6ZSgpO2Zvcih2YXIgaT10LnN0YXJ0LnJvdztpPD10LmVuZC5yb3c7KytpKXt2YXIgcz10aGlzLmdldExpbmUoaSk7bi5zdGFydC5yb3c9aSxuLmVuZC5yb3c9aTtmb3IodmFyIG89MDtvPHI7KytvKWlmKHMuY2hhckF0KG8pIT0iICIpYnJlYWs7bzxyJiZzLmNoYXJBdChvKT09IgkiPyhuLnN0YXJ0LmNvbHVtbj1vLG4uZW5kLmNvbHVtbj1vKzEpOihuLnN0YXJ0LmNvbHVtbj0wLG4uZW5kLmNvbHVtbj1vKSx0aGlzLnJlbW92ZShuKX19LHRoaXMuJG1vdmVMaW5lcz1mdW5jdGlvbihlLHQsbil7ZT10aGlzLmdldFJvd0ZvbGRTdGFydChlKSx0PXRoaXMuZ2V0Um93Rm9sZEVuZCh0KTtpZihuPDApe3ZhciByPXRoaXMuZ2V0Um93Rm9sZFN0YXJ0KGUrbik7aWYocjwwKXJldHVybiAwO3ZhciBpPXItZX1lbHNlIGlmKG4+MCl7dmFyIHI9dGhpcy5nZXRSb3dGb2xkRW5kKHQrbik7aWYocj50aGlzLmRvYy5nZXRMZW5ndGgoKS0xKXJldHVybiAwO3ZhciBpPXItdH1lbHNle2U9dGhpcy4kY2xpcFJvd1RvRG9jdW1lbnQoZSksdD10aGlzLiRjbGlwUm93VG9Eb2N1bWVudCh0KTt2YXIgaT10LWUrMX12YXIgcz1uZXcgbChlLDAsdCxOdW1iZXIuTUFYX1ZBTFVFKSxvPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKHMpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZT1lLmNsb25lKCksZS5zdGFydC5yb3crPWksZS5lbmQucm93Kz1pLGV9KSx1PW49PTA/dGhpcy5kb2MuZ2V0TGluZXMoZSx0KTp0aGlzLmRvYy5yZW1vdmVGdWxsTGluZXMoZSx0KTtyZXR1cm4gdGhpcy5kb2MuaW5zZXJ0RnVsbExpbmVzKGUraSx1KSxvLmxlbmd0aCYmdGhpcy5hZGRGb2xkcyhvKSxpfSx0aGlzLm1vdmVMaW5lc1VwPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuJG1vdmVMaW5lcyhlLHQsLTEpfSx0aGlzLm1vdmVMaW5lc0Rvd249ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy4kbW92ZUxpbmVzKGUsdCwxKX0sdGhpcy5kdXBsaWNhdGVMaW5lcz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLiRtb3ZlTGluZXMoZSx0LDApfSx0aGlzLiRjbGlwUm93VG9Eb2N1bWVudD1mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbihlLHRoaXMuZG9jLmdldExlbmd0aCgpLTEpKX0sdGhpcy4kY2xpcENvbHVtblRvUm93PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ8MD8wOk1hdGgubWluKHRoaXMuZG9jLmdldExpbmUoZSkubGVuZ3RoLHQpfSx0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50PWZ1bmN0aW9uKGUsdCl7dD1NYXRoLm1heCgwLHQpO2lmKGU8MCllPTAsdD0wO2Vsc2V7dmFyIG49dGhpcy5kb2MuZ2V0TGVuZ3RoKCk7ZT49bj8oZT1uLTEsdD10aGlzLmRvYy5nZXRMaW5lKG4tMSkubGVuZ3RoKTp0PU1hdGgubWluKHRoaXMuZG9jLmdldExpbmUoZSkubGVuZ3RoLHQpfXJldHVybntyb3c6ZSxjb2x1bW46dH19LHRoaXMuJGNsaXBSYW5nZVRvRG9jdW1lbnQ9ZnVuY3Rpb24oZSl7ZS5zdGFydC5yb3c8MD8oZS5zdGFydC5yb3c9MCxlLnN0YXJ0LmNvbHVtbj0wKTplLnN0YXJ0LmNvbHVtbj10aGlzLiRjbGlwQ29sdW1uVG9Sb3coZS5zdGFydC5yb3csZS5zdGFydC5jb2x1bW4pO3ZhciB0PXRoaXMuZG9jLmdldExlbmd0aCgpLTE7cmV0dXJuIGUuZW5kLnJvdz50PyhlLmVuZC5yb3c9dCxlLmVuZC5jb2x1bW49dGhpcy5kb2MuZ2V0TGluZSh0KS5sZW5ndGgpOmUuZW5kLmNvbHVtbj10aGlzLiRjbGlwQ29sdW1uVG9Sb3coZS5lbmQucm93LGUuZW5kLmNvbHVtbiksZX0sdGhpcy4kd3JhcExpbWl0PTgwLHRoaXMuJHVzZVdyYXBNb2RlPSExLHRoaXMuJHdyYXBMaW1pdFJhbmdlPXttaW46bnVsbCxtYXg6bnVsbH0sdGhpcy5zZXRVc2VXcmFwTW9kZT1mdW5jdGlvbihlKXtpZihlIT10aGlzLiR1c2VXcmFwTW9kZSl7dGhpcy4kdXNlV3JhcE1vZGU9ZSx0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiRyZXNldFJvd0NhY2hlKDApO2lmKGUpe3ZhciB0PXRoaXMuZ2V0TGVuZ3RoKCk7dGhpcy4kd3JhcERhdGE9QXJyYXkodCksdGhpcy4kdXBkYXRlV3JhcERhdGEoMCx0LTEpfXRoaXMuX3NpZ25hbCgiY2hhbmdlV3JhcE1vZGUiKX19LHRoaXMuZ2V0VXNlV3JhcE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdXNlV3JhcE1vZGV9LHRoaXMuc2V0V3JhcExpbWl0UmFuZ2U9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLiR3cmFwTGltaXRSYW5nZS5taW4hPT1lfHx0aGlzLiR3cmFwTGltaXRSYW5nZS5tYXghPT10KXRoaXMuJHdyYXBMaW1pdFJhbmdlPXttaW46ZSxtYXg6dH0sdGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kYmlkaUhhbmRsZXIubWFya0FzRGlydHkoKSx0aGlzLiR1c2VXcmFwTW9kZSYmdGhpcy5fc2lnbmFsKCJjaGFuZ2VXcmFwTW9kZSIpfSx0aGlzLmFkanVzdFdyYXBMaW1pdD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJHdyYXBMaW1pdFJhbmdlO24ubWF4PDAmJihuPXttaW46dCxtYXg6dH0pO3ZhciByPXRoaXMuJGNvbnN0cmFpbldyYXBMaW1pdChlLG4ubWluLG4ubWF4KTtyZXR1cm4gciE9dGhpcy4kd3JhcExpbWl0JiZyPjE/KHRoaXMuJHdyYXBMaW1pdD1yLHRoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJHVzZVdyYXBNb2RlJiYodGhpcy4kdXBkYXRlV3JhcERhdGEoMCx0aGlzLmdldExlbmd0aCgpLTEpLHRoaXMuJHJlc2V0Um93Q2FjaGUoMCksdGhpcy5fc2lnbmFsKCJjaGFuZ2VXcmFwTGltaXQiKSksITApOiExfSx0aGlzLiRjb25zdHJhaW5XcmFwTGltaXQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0JiYoZT1NYXRoLm1heCh0LGUpKSxuJiYoZT1NYXRoLm1pbihuLGUpKSxlfSx0aGlzLmdldFdyYXBMaW1pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR3cmFwTGltaXR9LHRoaXMuc2V0V3JhcExpbWl0PWZ1bmN0aW9uKGUpe3RoaXMuc2V0V3JhcExpbWl0UmFuZ2UoZSxlKX0sdGhpcy5nZXRXcmFwTGltaXRSYW5nZT1mdW5jdGlvbigpe3JldHVybnttaW46dGhpcy4kd3JhcExpbWl0UmFuZ2UubWluLG1heDp0aGlzLiR3cmFwTGltaXRSYW5nZS5tYXh9fSx0aGlzLiR1cGRhdGVJbnRlcm5hbERhdGFPbkNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiR1c2VXcmFwTW9kZSxuPWUuYWN0aW9uLHI9ZS5zdGFydCxpPWUuZW5kLHM9ci5yb3csbz1pLnJvdyx1PW8tcyxhPW51bGw7dGhpcy4kdXBkYXRpbmc9ITA7aWYodSE9MClpZihuPT09InJlbW92ZSIpe3RoaXNbdD8iJHdyYXBEYXRhIjoiJHJvd0xlbmd0aENhY2hlIl0uc3BsaWNlKHMsdSk7dmFyIGY9dGhpcy4kZm9sZERhdGE7YT10aGlzLmdldEZvbGRzSW5SYW5nZShlKSx0aGlzLnJlbW92ZUZvbGRzKGEpO3ZhciBsPXRoaXMuZ2V0Rm9sZExpbmUoaS5yb3cpLGM9MDtpZihsKXtsLmFkZFJlbW92ZUNoYXJzKGkucm93LGkuY29sdW1uLHIuY29sdW1uLWkuY29sdW1uKSxsLnNoaWZ0Um93KC11KTt2YXIgaD10aGlzLmdldEZvbGRMaW5lKHMpO2gmJmghPT1sJiYoaC5tZXJnZShsKSxsPWgpLGM9Zi5pbmRleE9mKGwpKzF9Zm9yKGM7YzxmLmxlbmd0aDtjKyspe3ZhciBsPWZbY107bC5zdGFydC5yb3c+PWkucm93JiZsLnNoaWZ0Um93KC11KX1vPXN9ZWxzZXt2YXIgcD1BcnJheSh1KTtwLnVuc2hpZnQocywwKTt2YXIgZD10P3RoaXMuJHdyYXBEYXRhOnRoaXMuJHJvd0xlbmd0aENhY2hlO2Quc3BsaWNlLmFwcGx5KGQscCk7dmFyIGY9dGhpcy4kZm9sZERhdGEsbD10aGlzLmdldEZvbGRMaW5lKHMpLGM9MDtpZihsKXt2YXIgdj1sLnJhbmdlLmNvbXBhcmVJbnNpZGUoci5yb3csci5jb2x1bW4pO3Y9PTA/KGw9bC5zcGxpdChyLnJvdyxyLmNvbHVtbiksbCYmKGwuc2hpZnRSb3codSksbC5hZGRSZW1vdmVDaGFycyhvLDAsaS5jb2x1bW4tci5jb2x1bW4pKSk6dj09LTEmJihsLmFkZFJlbW92ZUNoYXJzKHMsMCxpLmNvbHVtbi1yLmNvbHVtbiksbC5zaGlmdFJvdyh1KSksYz1mLmluZGV4T2YobCkrMX1mb3IoYztjPGYubGVuZ3RoO2MrKyl7dmFyIGw9ZltjXTtsLnN0YXJ0LnJvdz49cyYmbC5zaGlmdFJvdyh1KX19ZWxzZXt1PU1hdGguYWJzKGUuc3RhcnQuY29sdW1uLWUuZW5kLmNvbHVtbiksbj09PSJyZW1vdmUiJiYoYT10aGlzLmdldEZvbGRzSW5SYW5nZShlKSx0aGlzLnJlbW92ZUZvbGRzKGEpLHU9LXUpO3ZhciBsPXRoaXMuZ2V0Rm9sZExpbmUocyk7bCYmbC5hZGRSZW1vdmVDaGFycyhzLHIuY29sdW1uLHUpfXJldHVybiB0JiZ0aGlzLiR3cmFwRGF0YS5sZW5ndGghPXRoaXMuZG9jLmdldExlbmd0aCgpJiZjb25zb2xlLmVycm9yKCJkb2MuZ2V0TGVuZ3RoKCkgYW5kICR3cmFwRGF0YS5sZW5ndGggaGF2ZSB0byBiZSB0aGUgc2FtZSEiKSx0aGlzLiR1cGRhdGluZz0hMSx0P3RoaXMuJHVwZGF0ZVdyYXBEYXRhKHMsbyk6dGhpcy4kdXBkYXRlUm93TGVuZ3RoQ2FjaGUocyxvKSxhfSx0aGlzLiR1cGRhdGVSb3dMZW5ndGhDYWNoZT1mdW5jdGlvbihlLHQsbil7dGhpcy4kcm93TGVuZ3RoQ2FjaGVbZV09bnVsbCx0aGlzLiRyb3dMZW5ndGhDYWNoZVt0XT1udWxsfSx0aGlzLiR1cGRhdGVXcmFwRGF0YT1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXMuZG9jLmdldEFsbExpbmVzKCksaT10aGlzLmdldFRhYlNpemUoKSxvPXRoaXMuJHdyYXBEYXRhLHU9dGhpcy4kd3JhcExpbWl0LGEsZixsPWU7dD1NYXRoLm1pbih0LHIubGVuZ3RoLTEpO3doaWxlKGw8PXQpZj10aGlzLmdldEZvbGRMaW5lKGwsZiksZj8oYT1bXSxmLndhbGsoZnVuY3Rpb24oZSx0LGksbyl7dmFyIHU7aWYoZSE9bnVsbCl7dT10aGlzLiRnZXREaXNwbGF5VG9rZW5zKGUsYS5sZW5ndGgpLHVbMF09bjtmb3IodmFyIGY9MTtmPHUubGVuZ3RoO2YrKyl1W2ZdPXN9ZWxzZSB1PXRoaXMuJGdldERpc3BsYXlUb2tlbnMoclt0XS5zdWJzdHJpbmcobyxpKSxhLmxlbmd0aCk7YT1hLmNvbmNhdCh1KX0uYmluZCh0aGlzKSxmLmVuZC5yb3cscltmLmVuZC5yb3ddLmxlbmd0aCsxKSxvW2Yuc3RhcnQucm93XT10aGlzLiRjb21wdXRlV3JhcFNwbGl0cyhhLHUsaSksbD1mLmVuZC5yb3crMSk6KGE9dGhpcy4kZ2V0RGlzcGxheVRva2VucyhyW2xdKSxvW2xdPXRoaXMuJGNvbXB1dGVXcmFwU3BsaXRzKGEsdSxpKSxsKyspfTt2YXIgZT0xLHQ9MixuPTMscz00LGE9OSxjPTEwLGQ9MTEsdj0xMjt0aGlzLiRjb21wdXRlV3JhcFNwbGl0cz1mdW5jdGlvbihlLHIsaSl7ZnVuY3Rpb24gZygpe3ZhciB0PTA7aWYobT09PTApcmV0dXJuIHQ7aWYocClmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtpZihyPT1jKXQrPTE7ZWxzZXtpZihyIT1kKXtpZihyPT12KWNvbnRpbnVlO2JyZWFrfXQrPWl9fXJldHVybiBoJiZwIT09ITEmJih0Kz1pKSxNYXRoLm1pbih0LG0pfWZ1bmN0aW9uIHkodCl7dmFyIG49dC1mO2Zvcih2YXIgcj1mO3I8dDtyKyspe3ZhciBpPWVbcl07aWYoaT09PTEyfHxpPT09MiluLT0xfW8ubGVuZ3RofHwoYj1nKCksby5pbmRlbnQ9YiksbCs9bixvLnB1c2gobCksZj10fWlmKGUubGVuZ3RoPT0wKXJldHVybltdO3ZhciBvPVtdLHU9ZS5sZW5ndGgsZj0wLGw9MCxoPXRoaXMuJHdyYXBBc0NvZGUscD10aGlzLiRpbmRlbnRlZFNvZnRXcmFwLG09cjw9TWF0aC5tYXgoMippLDgpfHxwPT09ITE/MDpNYXRoLmZsb29yKHIvMiksYj0wO3doaWxlKHUtZj5yLWIpe3ZhciB3PWYrci1iO2lmKGVbdy0xXT49YyYmZVt3XT49Yyl7eSh3KTtjb250aW51ZX1pZihlW3ddPT1ufHxlW3ddPT1zKXtmb3Iodzt3IT1mLTE7dy0tKWlmKGVbd109PW4pYnJlYWs7aWYodz5mKXt5KHcpO2NvbnRpbnVlfXc9ZityO2Zvcih3O3c8ZS5sZW5ndGg7dysrKWlmKGVbd10hPXMpYnJlYWs7aWYodz09ZS5sZW5ndGgpYnJlYWs7eSh3KTtjb250aW51ZX12YXIgRT1NYXRoLm1heCh3LShyLShyPj4yKSksZi0xKTt3aGlsZSh3PkUmJmVbd108bil3LS07aWYoaCl7d2hpbGUodz5FJiZlW3ddPG4pdy0tO3doaWxlKHc+RSYmZVt3XT09YSl3LS19ZWxzZSB3aGlsZSh3PkUmJmVbd108Yyl3LS07aWYodz5FKXt5KCsrdyk7Y29udGludWV9dz1mK3IsZVt3XT09dCYmdy0tLHkody1iKX1yZXR1cm4gb30sdGhpcy4kZ2V0RGlzcGxheVRva2Vucz1mdW5jdGlvbihuLHIpe3ZhciBpPVtdLHM7cj1yfHwwO2Zvcih2YXIgbz0wO288bi5sZW5ndGg7bysrKXt2YXIgdT1uLmNoYXJDb2RlQXQobyk7aWYodT09OSl7cz10aGlzLmdldFNjcmVlblRhYlNpemUoaS5sZW5ndGgrciksaS5wdXNoKGQpO2Zvcih2YXIgZj0xO2Y8cztmKyspaS5wdXNoKHYpfWVsc2UgdT09MzI/aS5wdXNoKGMpOnU+MzkmJnU8NDh8fHU+NTcmJnU8NjQ/aS5wdXNoKGEpOnU+PTQzNTImJm0odSk/aS5wdXNoKGUsdCk6aS5wdXNoKGUpfXJldHVybiBpfSx0aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aD1mdW5jdGlvbihlLHQsbil7aWYodD09MClyZXR1cm5bMCwwXTt0PT1udWxsJiYodD1JbmZpbml0eSksbj1ufHwwO3ZhciByLGk7Zm9yKGk9MDtpPGUubGVuZ3RoO2krKyl7cj1lLmNoYXJDb2RlQXQoaSkscj09OT9uKz10aGlzLmdldFNjcmVlblRhYlNpemUobik6cj49NDM1MiYmbShyKT9uKz0yOm4rPTE7aWYobj50KWJyZWFrfXJldHVybltuLGldfSx0aGlzLmxpbmVXaWRnZXRzPW51bGwsdGhpcy5nZXRSb3dMZW5ndGg9ZnVuY3Rpb24oZSl7aWYodGhpcy5saW5lV2lkZ2V0cyl2YXIgdD10aGlzLmxpbmVXaWRnZXRzW2VdJiZ0aGlzLmxpbmVXaWRnZXRzW2VdLnJvd0NvdW50fHwwO2Vsc2UgdD0wO3JldHVybiF0aGlzLiR1c2VXcmFwTW9kZXx8IXRoaXMuJHdyYXBEYXRhW2VdPzErdDp0aGlzLiR3cmFwRGF0YVtlXS5sZW5ndGgrMSt0fSx0aGlzLmdldFJvd0xpbmVDb3VudD1mdW5jdGlvbihlKXtyZXR1cm4hdGhpcy4kdXNlV3JhcE1vZGV8fCF0aGlzLiR3cmFwRGF0YVtlXT8xOnRoaXMuJHdyYXBEYXRhW2VdLmxlbmd0aCsxfSx0aGlzLmdldFJvd1dyYXBJbmRlbnQ9ZnVuY3Rpb24oZSl7aWYodGhpcy4kdXNlV3JhcE1vZGUpe3ZhciB0PXRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGUsTnVtYmVyLk1BWF9WQUxVRSksbj10aGlzLiR3cmFwRGF0YVt0LnJvd107cmV0dXJuIG4ubGVuZ3RoJiZuWzBdPHQuY29sdW1uP24uaW5kZW50OjB9cmV0dXJuIDB9LHRoaXMuZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihlLE51bWJlci5NQVhfVkFMVUUpO3JldHVybiB0aGlzLmRvY3VtZW50VG9TY3JlZW5Db2x1bW4odC5yb3csdC5jb2x1bW4pfSx0aGlzLmdldERvY3VtZW50TGFzdFJvd0NvbHVtbj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZG9jdW1lbnRUb1NjcmVlblJvdyhlLHQpO3JldHVybiB0aGlzLmdldFNjcmVlbkxhc3RSb3dDb2x1bW4obil9LHRoaXMuZ2V0RG9jdW1lbnRMYXN0Um93Q29sdW1uUG9zaXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmRvY3VtZW50VG9TY3JlZW5Sb3coZSx0KTtyZXR1cm4gdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24obixOdW1iZXIuTUFYX1ZBTFVFLzEwKX0sdGhpcy5nZXRSb3dTcGxpdERhdGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJHVzZVdyYXBNb2RlP3RoaXMuJHdyYXBEYXRhW2VdOnVuZGVmaW5lZH0sdGhpcy5nZXRTY3JlZW5UYWJTaXplPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiR0YWJTaXplLShlJXRoaXMuJHRhYlNpemV8MCl9LHRoaXMuc2NyZWVuVG9Eb2N1bWVudFJvdz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihlLHQpLnJvd30sdGhpcy5zY3JlZW5Ub0RvY3VtZW50Q29sdW1uPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGUsdCkuY29sdW1ufSx0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbj1mdW5jdGlvbihlLHQsbil7aWYoZTwwKXJldHVybntyb3c6MCxjb2x1bW46MH07dmFyIHIsaT0wLHM9MCxvLHU9MCxhPTAsZj10aGlzLiRzY3JlZW5Sb3dDYWNoZSxsPXRoaXMuJGdldFJvd0NhY2hlSW5kZXgoZixlKSxjPWYubGVuZ3RoO2lmKGMmJmw+PTApdmFyIHU9ZltsXSxpPXRoaXMuJGRvY1Jvd0NhY2hlW2xdLGg9ZT5mW2MtMV07ZWxzZSB2YXIgaD0hYzt2YXIgcD10aGlzLmdldExlbmd0aCgpLTEsZD10aGlzLmdldE5leHRGb2xkTGluZShpKSx2PWQ/ZC5zdGFydC5yb3c6SW5maW5pdHk7d2hpbGUodTw9ZSl7YT10aGlzLmdldFJvd0xlbmd0aChpKTtpZih1K2E+ZXx8aT49cClicmVhazt1Kz1hLGkrKyxpPnYmJihpPWQuZW5kLnJvdysxLGQ9dGhpcy5nZXROZXh0Rm9sZExpbmUoaSxkKSx2PWQ/ZC5zdGFydC5yb3c6SW5maW5pdHkpLGgmJih0aGlzLiRkb2NSb3dDYWNoZS5wdXNoKGkpLHRoaXMuJHNjcmVlblJvd0NhY2hlLnB1c2godSkpfWlmKGQmJmQuc3RhcnQucm93PD1pKXI9dGhpcy5nZXRGb2xkRGlzcGxheUxpbmUoZCksaT1kLnN0YXJ0LnJvdztlbHNle2lmKHUrYTw9ZXx8aT5wKXJldHVybntyb3c6cCxjb2x1bW46dGhpcy5nZXRMaW5lKHApLmxlbmd0aH07cj10aGlzLmdldExpbmUoaSksZD1udWxsfXZhciBtPTAsZz1NYXRoLmZsb29yKGUtdSk7aWYodGhpcy4kdXNlV3JhcE1vZGUpe3ZhciB5PXRoaXMuJHdyYXBEYXRhW2ldO3kmJihvPXlbZ10sZz4wJiZ5Lmxlbmd0aCYmKG09eS5pbmRlbnQscz15W2ctMV18fHlbeS5sZW5ndGgtMV0scj1yLnN1YnN0cmluZyhzKSkpfXJldHVybiBuIT09dW5kZWZpbmVkJiZ0aGlzLiRiaWRpSGFuZGxlci5pc0JpZGlSb3codStnLGksZykmJih0PXRoaXMuJGJpZGlIYW5kbGVyLm9mZnNldFRvQ29sKG4pKSxzKz10aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aChyLHQtbSlbMV0sdGhpcy4kdXNlV3JhcE1vZGUmJnM+PW8mJihzPW8tMSksZD9kLmlkeFRvUG9zaXRpb24ocyk6e3JvdzppLGNvbHVtbjpzfX0sdGhpcy5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb249ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdD09InVuZGVmaW5lZCIpdmFyIG49dGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChlLnJvdyxlLmNvbHVtbik7ZWxzZSBuPXRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQoZSx0KTtlPW4ucm93LHQ9bi5jb2x1bW47dmFyIHI9MCxpPW51bGwscz1udWxsO3M9dGhpcy5nZXRGb2xkQXQoZSx0LDEpLHMmJihlPXMuc3RhcnQucm93LHQ9cy5zdGFydC5jb2x1bW4pO3ZhciBvLHU9MCxhPXRoaXMuJGRvY1Jvd0NhY2hlLGY9dGhpcy4kZ2V0Um93Q2FjaGVJbmRleChhLGUpLGw9YS5sZW5ndGg7aWYobCYmZj49MCl2YXIgdT1hW2ZdLHI9dGhpcy4kc2NyZWVuUm93Q2FjaGVbZl0sYz1lPmFbbC0xXTtlbHNlIHZhciBjPSFsO3ZhciBoPXRoaXMuZ2V0TmV4dEZvbGRMaW5lKHUpLHA9aD9oLnN0YXJ0LnJvdzpJbmZpbml0eTt3aGlsZSh1PGUpe2lmKHU+PXApe289aC5lbmQucm93KzE7aWYobz5lKWJyZWFrO2g9dGhpcy5nZXROZXh0Rm9sZExpbmUobyxoKSxwPWg/aC5zdGFydC5yb3c6SW5maW5pdHl9ZWxzZSBvPXUrMTtyKz10aGlzLmdldFJvd0xlbmd0aCh1KSx1PW8sYyYmKHRoaXMuJGRvY1Jvd0NhY2hlLnB1c2godSksdGhpcy4kc2NyZWVuUm93Q2FjaGUucHVzaChyKSl9dmFyIGQ9IiI7aCYmdT49cD8oZD10aGlzLmdldEZvbGREaXNwbGF5TGluZShoLGUsdCksaT1oLnN0YXJ0LnJvdyk6KGQ9dGhpcy5nZXRMaW5lKGUpLnN1YnN0cmluZygwLHQpLGk9ZSk7dmFyIHY9MDtpZih0aGlzLiR1c2VXcmFwTW9kZSl7dmFyIG09dGhpcy4kd3JhcERhdGFbaV07aWYobSl7dmFyIGc9MDt3aGlsZShkLmxlbmd0aD49bVtnXSlyKyssZysrO2Q9ZC5zdWJzdHJpbmcobVtnLTFdfHwwLGQubGVuZ3RoKSx2PWc+MD9tLmluZGVudDowfX1yZXR1cm57cm93OnIsY29sdW1uOnYrdGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGgoZClbMF19fSx0aGlzLmRvY3VtZW50VG9TY3JlZW5Db2x1bW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oZSx0KS5jb2x1bW59LHRoaXMuZG9jdW1lbnRUb1NjcmVlblJvdz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihlLHQpLnJvd30sdGhpcy5nZXRTY3JlZW5MZW5ndGg9ZnVuY3Rpb24oKXt2YXIgZT0wLHQ9bnVsbDtpZighdGhpcy4kdXNlV3JhcE1vZGUpe2U9dGhpcy5nZXRMZW5ndGgoKTt2YXIgbj10aGlzLiRmb2xkRGF0YTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl0PW5bcl0sZS09dC5lbmQucm93LXQuc3RhcnQucm93fWVsc2V7dmFyIGk9dGhpcy4kd3JhcERhdGEubGVuZ3RoLHM9MCxyPTAsdD10aGlzLiRmb2xkRGF0YVtyKytdLG89dD90LnN0YXJ0LnJvdzpJbmZpbml0eTt3aGlsZShzPGkpe3ZhciB1PXRoaXMuJHdyYXBEYXRhW3NdO2UrPXU/dS5sZW5ndGgrMToxLHMrKyxzPm8mJihzPXQuZW5kLnJvdysxLHQ9dGhpcy4kZm9sZERhdGFbcisrXSxvPXQ/dC5zdGFydC5yb3c6SW5maW5pdHkpfX1yZXR1cm4gdGhpcy5saW5lV2lkZ2V0cyYmKGUrPXRoaXMuJGdldFdpZGdldFNjcmVlbkxlbmd0aCgpKSxlfSx0aGlzLiRzZXRGb250TWV0cmljcz1mdW5jdGlvbihlKXtpZighdGhpcy4kZW5hYmxlVmFyQ2hhcilyZXR1cm47dGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGg9ZnVuY3Rpb24odCxuLHIpe2lmKG49PT0wKXJldHVyblswLDBdO258fChuPUluZmluaXR5KSxyPXJ8fDA7dmFyIGkscztmb3Iocz0wO3M8dC5sZW5ndGg7cysrKXtpPXQuY2hhckF0KHMpLGk9PT0iCSI/cis9dGhpcy5nZXRTY3JlZW5UYWJTaXplKHIpOnIrPWUuZ2V0Q2hhcmFjdGVyV2lkdGgoaSk7aWYocj5uKWJyZWFrfXJldHVybltyLHNdfX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5iZ1Rva2VuaXplciYmKHRoaXMuYmdUb2tlbml6ZXIuc2V0RG9jdW1lbnQobnVsbCksdGhpcy5iZ1Rva2VuaXplcj1udWxsKSx0aGlzLiRzdG9wV29ya2VyKCl9LHRoaXMuaXNGdWxsV2lkdGg9bX0uY2FsbChkLnByb3RvdHlwZSksZSgiLi9lZGl0X3Nlc3Npb24vZm9sZGluZyIpLkZvbGRpbmcuY2FsbChkLnByb3RvdHlwZSksZSgiLi9lZGl0X3Nlc3Npb24vYnJhY2tldF9tYXRjaCIpLkJyYWNrZXRNYXRjaC5jYWxsKGQucHJvdG90eXBlKSxvLmRlZmluZU9wdGlvbnMoZC5wcm90b3R5cGUsInNlc3Npb24iLHt3cmFwOntzZXQ6ZnVuY3Rpb24oZSl7IWV8fGU9PSJvZmYiP2U9ITE6ZT09ImZyZWUiP2U9ITA6ZT09InByaW50TWFyZ2luIj9lPS0xOnR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9cGFyc2VJbnQoZSwxMCl8fCExKTtpZih0aGlzLiR3cmFwPT1lKXJldHVybjt0aGlzLiR3cmFwPWU7aWYoIWUpdGhpcy5zZXRVc2VXcmFwTW9kZSghMSk7ZWxzZXt2YXIgdD10eXBlb2YgZT09Im51bWJlciI/ZTpudWxsO3RoaXMuc2V0V3JhcExpbWl0UmFuZ2UodCx0KSx0aGlzLnNldFVzZVdyYXBNb2RlKCEwKX19LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFVzZVdyYXBNb2RlKCk/dGhpcy4kd3JhcD09LTE/InByaW50TWFyZ2luIjp0aGlzLmdldFdyYXBMaW1pdFJhbmdlKCkubWluP3RoaXMuJHdyYXA6ImZyZWUiOiJvZmYifSxoYW5kbGVzU2V0OiEwfSx3cmFwTWV0aG9kOntzZXQ6ZnVuY3Rpb24oZSl7ZT1lPT0iYXV0byI/dGhpcy4kbW9kZS50eXBlIT0idGV4dCI6ZSE9InRleHQiLGUhPXRoaXMuJHdyYXBBc0NvZGUmJih0aGlzLiR3cmFwQXNDb2RlPWUsdGhpcy4kdXNlV3JhcE1vZGUmJih0aGlzLiR1c2VXcmFwTW9kZT0hMSx0aGlzLnNldFVzZVdyYXBNb2RlKCEwKSkpfSxpbml0aWFsVmFsdWU6ImF1dG8ifSxpbmRlbnRlZFNvZnRXcmFwOntzZXQ6ZnVuY3Rpb24oKXt0aGlzLiR1c2VXcmFwTW9kZSYmKHRoaXMuJHVzZVdyYXBNb2RlPSExLHRoaXMuc2V0VXNlV3JhcE1vZGUoITApKX0saW5pdGlhbFZhbHVlOiEwfSxmaXJzdExpbmVOdW1iZXI6e3NldDpmdW5jdGlvbigpe3RoaXMuX3NpZ25hbCgiY2hhbmdlQnJlYWtwb2ludCIpfSxpbml0aWFsVmFsdWU6MX0sdXNlV29ya2VyOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kdXNlV29ya2VyPWUsdGhpcy4kc3RvcFdvcmtlcigpLGUmJnRoaXMuJHN0YXJ0V29ya2VyKCl9LGluaXRpYWxWYWx1ZTohMH0sdXNlU29mdFRhYnM6e2luaXRpYWxWYWx1ZTohMH0sdGFiU2l6ZTp7c2V0OmZ1bmN0aW9uKGUpe2U9cGFyc2VJbnQoZSksZT4wJiZ0aGlzLiR0YWJTaXplIT09ZSYmKHRoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJHJvd0xlbmd0aENhY2hlPVtdLHRoaXMuJHRhYlNpemU9ZSx0aGlzLl9zaWduYWwoImNoYW5nZVRhYlNpemUiKSl9LGluaXRpYWxWYWx1ZTo0LGhhbmRsZXNTZXQ6ITB9LG5hdmlnYXRlV2l0aGluU29mdFRhYnM6e2luaXRpYWxWYWx1ZTohMX0sZm9sZFN0eWxlOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXRGb2xkU3R5bGUoZSl9LGhhbmRsZXNTZXQ6ITB9LG92ZXJ3cml0ZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3NpZ25hbCgiY2hhbmdlT3ZlcndyaXRlIil9LGluaXRpYWxWYWx1ZTohMX0sbmV3TGluZU1vZGU6e3NldDpmdW5jdGlvbihlKXt0aGlzLmRvYy5zZXROZXdMaW5lTW9kZShlKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jLmdldE5ld0xpbmVNb2RlKCl9LGhhbmRsZXNTZXQ6ITB9LG1vZGU6e3NldDpmdW5jdGlvbihlKXt0aGlzLnNldE1vZGUoZSl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRtb2RlSWR9LGhhbmRsZXNTZXQ6ITB9fSksdC5FZGl0U2Vzc2lvbj1kfSksYWNlLmRlZmluZSgiYWNlL3NlYXJjaCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB1KGUsdCl7ZnVuY3Rpb24gbihlKXtyZXR1cm4vXHcvLnRlc3QoZSl8fHQucmVnRXhwPyJcXGIiOiIifXJldHVybiBuKGVbMF0pK2UrbihlW2UubGVuZ3RoLTFdKX12YXIgcj1lKCIuL2xpYi9sYW5nIiksaT1lKCIuL2xpYi9vb3AiKSxzPWUoIi4vcmFuZ2UiKS5SYW5nZSxvPWZ1bmN0aW9uKCl7dGhpcy4kb3B0aW9ucz17fX07KGZ1bmN0aW9uKCl7dGhpcy5zZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGkubWl4aW4odGhpcy4kb3B0aW9ucyxlKSx0aGlzfSx0aGlzLmdldE9wdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gci5jb3B5T2JqZWN0KHRoaXMuJG9wdGlvbnMpfSx0aGlzLnNldE9wdGlvbnM9ZnVuY3Rpb24oZSl7dGhpcy4kb3B0aW9ucz1lfSx0aGlzLmZpbmQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kb3B0aW9ucyxuPXRoaXMuJG1hdGNoSXRlcmF0b3IoZSx0KTtpZighbilyZXR1cm4hMTt2YXIgcj1udWxsO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24oZSxuLGksbyl7cmV0dXJuIHI9bmV3IHMoZSxuLGksbyksbj09byYmdC5zdGFydCYmdC5zdGFydC5zdGFydCYmdC5za2lwQ3VycmVudCE9MCYmci5pc0VxdWFsKHQuc3RhcnQpPyhyPW51bGwsITEpOiEwfSkscn0sdGhpcy5maW5kQWxsPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJG9wdGlvbnM7aWYoIXQubmVlZGxlKXJldHVybltdO3RoaXMuJGFzc2VtYmxlUmVnRXhwKHQpO3ZhciBuPXQucmFuZ2UsaT1uP2UuZ2V0TGluZXMobi5zdGFydC5yb3csbi5lbmQucm93KTplLmRvYy5nZXRBbGxMaW5lcygpLG89W10sdT10LnJlO2lmKHQuJGlzTXVsdGlMaW5lKXt2YXIgYT11Lmxlbmd0aCxmPWkubGVuZ3RoLWEsbDtlOmZvcih2YXIgYz11Lm9mZnNldHx8MDtjPD1mO2MrKyl7Zm9yKHZhciBoPTA7aDxhO2grKylpZihpW2MraF0uc2VhcmNoKHVbaF0pPT0tMSljb250aW51ZSBlO3ZhciBwPWlbY10sZD1pW2MrYS0xXSx2PXAubGVuZ3RoLXAubWF0Y2godVswXSlbMF0ubGVuZ3RoLG09ZC5tYXRjaCh1W2EtMV0pWzBdLmxlbmd0aDtpZihsJiZsLmVuZC5yb3c9PT1jJiZsLmVuZC5jb2x1bW4+diljb250aW51ZTtvLnB1c2gobD1uZXcgcyhjLHYsYythLTEsbSkpLGE+MiYmKGM9YythLTIpfX1lbHNlIGZvcih2YXIgZz0wO2c8aS5sZW5ndGg7ZysrKXt2YXIgeT1yLmdldE1hdGNoT2Zmc2V0cyhpW2ddLHUpO2Zvcih2YXIgaD0wO2g8eS5sZW5ndGg7aCsrKXt2YXIgYj15W2hdO28ucHVzaChuZXcgcyhnLGIub2Zmc2V0LGcsYi5vZmZzZXQrYi5sZW5ndGgpKX19aWYobil7dmFyIHc9bi5zdGFydC5jb2x1bW4sRT1uLnN0YXJ0LmNvbHVtbixnPTAsaD1vLmxlbmd0aC0xO3doaWxlKGc8aCYmb1tnXS5zdGFydC5jb2x1bW48dyYmb1tnXS5zdGFydC5yb3c9PW4uc3RhcnQucm93KWcrKzt3aGlsZShnPGgmJm9baF0uZW5kLmNvbHVtbj5FJiZvW2hdLmVuZC5yb3c9PW4uZW5kLnJvdyloLS07bz1vLnNsaWNlKGcsaCsxKTtmb3IoZz0wLGg9by5sZW5ndGg7ZzxoO2crKylvW2ddLnN0YXJ0LnJvdys9bi5zdGFydC5yb3csb1tnXS5lbmQucm93Kz1uLnN0YXJ0LnJvd31yZXR1cm4gb30sdGhpcy5yZXBsYWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kb3B0aW9ucyxyPXRoaXMuJGFzc2VtYmxlUmVnRXhwKG4pO2lmKG4uJGlzTXVsdGlMaW5lKXJldHVybiB0O2lmKCFyKXJldHVybjt2YXIgaT1yLmV4ZWMoZSk7aWYoIWl8fGlbMF0ubGVuZ3RoIT1lLmxlbmd0aClyZXR1cm4gbnVsbDt0PWUucmVwbGFjZShyLHQpO2lmKG4ucHJlc2VydmVDYXNlKXt0PXQuc3BsaXQoIiIpO2Zvcih2YXIgcz1NYXRoLm1pbihlLmxlbmd0aCxlLmxlbmd0aCk7cy0tOyl7dmFyIG89ZVtzXTtvJiZvLnRvTG93ZXJDYXNlKCkhPW8/dFtzXT10W3NdLnRvVXBwZXJDYXNlKCk6dFtzXT10W3NdLnRvTG93ZXJDYXNlKCl9dD10LmpvaW4oIiIpfXJldHVybiB0fSx0aGlzLiRhc3NlbWJsZVJlZ0V4cD1mdW5jdGlvbihlLHQpe2lmKGUubmVlZGxlIGluc3RhbmNlb2YgUmVnRXhwKXJldHVybiBlLnJlPWUubmVlZGxlO3ZhciBuPWUubmVlZGxlO2lmKCFlLm5lZWRsZSlyZXR1cm4gZS5yZT0hMTtlLnJlZ0V4cHx8KG49ci5lc2NhcGVSZWdFeHAobikpLGUud2hvbGVXb3JkJiYobj11KG4sZSkpO3ZhciBpPWUuY2FzZVNlbnNpdGl2ZT8iZ20iOiJnbWkiO2UuJGlzTXVsdGlMaW5lPSF0JiYvW1xuXHJdLy50ZXN0KG4pO2lmKGUuJGlzTXVsdGlMaW5lKXJldHVybiBlLnJlPXRoaXMuJGFzc2VtYmxlTXVsdGlsaW5lUmVnRXhwKG4saSk7dHJ5e3ZhciBzPW5ldyBSZWdFeHAobixpKX1jYXRjaChvKXtzPSExfXJldHVybiBlLnJlPXN9LHRoaXMuJGFzc2VtYmxlTXVsdGlsaW5lUmVnRXhwPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5yZXBsYWNlKC9cclxufFxyfFxuL2csIiRcbl4iKS5zcGxpdCgiXG4iKSxyPVtdO2Zvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXRyeXtyLnB1c2gobmV3IFJlZ0V4cChuW2ldLHQpKX1jYXRjaChzKXtyZXR1cm4hMX1yZXR1cm4gcn0sdGhpcy4kbWF0Y2hJdGVyYXRvcj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJGFzc2VtYmxlUmVnRXhwKHQpO2lmKCFuKXJldHVybiExO3ZhciByPXQuYmFja3dhcmRzPT0xLGk9dC5za2lwQ3VycmVudCE9MCxzPXQucmFuZ2Usbz10LnN0YXJ0O298fChvPXM/c1tyPyJlbmQiOiJzdGFydCJdOmUuc2VsZWN0aW9uLmdldFJhbmdlKCkpLG8uc3RhcnQmJihvPW9baSE9cj8iZW5kIjoic3RhcnQiXSk7dmFyIHU9cz9zLnN0YXJ0LnJvdzowLGE9cz9zLmVuZC5yb3c6ZS5nZXRMZW5ndGgoKS0xO2lmKHIpdmFyIGY9ZnVuY3Rpb24oZSl7dmFyIG49by5yb3c7aWYoYyhuLG8uY29sdW1uLGUpKXJldHVybjtmb3Iobi0tO24+PXU7bi0tKWlmKGMobixOdW1iZXIuTUFYX1ZBTFVFLGUpKXJldHVybjtpZih0LndyYXA9PTApcmV0dXJuO2ZvcihuPWEsdT1vLnJvdztuPj11O24tLSlpZihjKG4sTnVtYmVyLk1BWF9WQUxVRSxlKSlyZXR1cm59O2Vsc2UgdmFyIGY9ZnVuY3Rpb24oZSl7dmFyIG49by5yb3c7aWYoYyhuLG8uY29sdW1uLGUpKXJldHVybjtmb3Iobis9MTtuPD1hO24rKylpZihjKG4sMCxlKSlyZXR1cm47aWYodC53cmFwPT0wKXJldHVybjtmb3Iobj11LGE9by5yb3c7bjw9YTtuKyspaWYoYyhuLDAsZSkpcmV0dXJufTtpZih0LiRpc011bHRpTGluZSl2YXIgbD1uLmxlbmd0aCxjPWZ1bmN0aW9uKHQsaSxzKXt2YXIgbz1yP3QtbCsxOnQ7aWYobzwwKXJldHVybjt2YXIgdT1lLmdldExpbmUobyksYT11LnNlYXJjaChuWzBdKTtpZighciYmYTxpfHxhPT09LTEpcmV0dXJuO2Zvcih2YXIgZj0xO2Y8bDtmKyspe3U9ZS5nZXRMaW5lKG8rZik7aWYodS5zZWFyY2gobltmXSk9PS0xKXJldHVybn12YXIgYz11Lm1hdGNoKG5bbC0xXSlbMF0ubGVuZ3RoO2lmKHImJmM+aSlyZXR1cm47aWYocyhvLGEsbytsLTEsYykpcmV0dXJuITB9O2Vsc2UgaWYocil2YXIgYz1mdW5jdGlvbih0LHIsaSl7dmFyIHM9ZS5nZXRMaW5lKHQpLG89W10sdSxhPTA7bi5sYXN0SW5kZXg9MDt3aGlsZSh1PW4uZXhlYyhzKSl7dmFyIGY9dVswXS5sZW5ndGg7YT11LmluZGV4O2lmKCFmKXtpZihhPj1zLmxlbmd0aClicmVhaztuLmxhc3RJbmRleD1hKz0xfWlmKHUuaW5kZXgrZj5yKWJyZWFrO28ucHVzaCh1LmluZGV4LGYpfWZvcih2YXIgbD1vLmxlbmd0aC0xO2w+PTA7bC09Mil7dmFyIGM9b1tsLTFdLGY9b1tsXTtpZihpKHQsYyx0LGMrZikpcmV0dXJuITB9fTtlbHNlIHZhciBjPWZ1bmN0aW9uKHQscixpKXt2YXIgcz1lLmdldExpbmUodCksbyx1O24ubGFzdEluZGV4PXI7d2hpbGUodT1uLmV4ZWMocykpe3ZhciBhPXVbMF0ubGVuZ3RoO289dS5pbmRleDtpZihpKHQsbyx0LG8rYSkpcmV0dXJuITA7aWYoIWEpe24ubGFzdEluZGV4PW8rPTE7aWYobz49cy5sZW5ndGgpcmV0dXJuITF9fX07cmV0dXJue2ZvckVhY2g6Zn19fSkuY2FsbChvLnByb3RvdHlwZSksdC5TZWFyY2g9b30pLGFjZS5kZWZpbmUoImFjZS9rZXlib2FyZC9oYXNoX2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2tleXMiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQpe3RoaXMucGxhdGZvcm09dHx8KGkuaXNNYWM/Im1hYyI6IndpbiIpLHRoaXMuY29tbWFuZHM9e30sdGhpcy5jb21tYW5kS2V5QmluZGluZz17fSx0aGlzLmFkZENvbW1hbmRzKGUpLHRoaXMuJHNpbmdsZUNvbW1hbmQ9ITB9ZnVuY3Rpb24gdShlLHQpe28uY2FsbCh0aGlzLGUsdCksdGhpcy4kc2luZ2xlQ29tbWFuZD0hMX12YXIgcj1lKCIuLi9saWIva2V5cyIpLGk9ZSgiLi4vbGliL3VzZXJhZ2VudCIpLHM9ci5LRVlfTU9EUzt1LnByb3RvdHlwZT1vLnByb3RvdHlwZSxmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIHR5cGVvZiBlPT0ib2JqZWN0IiYmZS5iaW5kS2V5JiZlLmJpbmRLZXkucG9zaXRpb258fChlLmlzRGVmYXVsdD8tMTAwOjApfXRoaXMuYWRkQ29tbWFuZD1mdW5jdGlvbihlKXt0aGlzLmNvbW1hbmRzW2UubmFtZV0mJnRoaXMucmVtb3ZlQ29tbWFuZChlKSx0aGlzLmNvbW1hbmRzW2UubmFtZV09ZSxlLmJpbmRLZXkmJnRoaXMuX2J1aWxkS2V5SGFzaChlKX0sdGhpcy5yZW1vdmVDb21tYW5kPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZSYmKHR5cGVvZiBlPT0ic3RyaW5nIj9lOmUubmFtZSk7ZT10aGlzLmNvbW1hbmRzW25dLHR8fGRlbGV0ZSB0aGlzLmNvbW1hbmRzW25dO3ZhciByPXRoaXMuY29tbWFuZEtleUJpbmRpbmc7Zm9yKHZhciBpIGluIHIpe3ZhciBzPXJbaV07aWYocz09ZSlkZWxldGUgcltpXTtlbHNlIGlmKEFycmF5LmlzQXJyYXkocykpe3ZhciBvPXMuaW5kZXhPZihlKTtvIT0tMSYmKHMuc3BsaWNlKG8sMSkscy5sZW5ndGg9PTEmJihyW2ldPXNbMF0pKX19fSx0aGlzLmJpbmRLZXk9ZnVuY3Rpb24oZSx0LG4pe3R5cGVvZiBlPT0ib2JqZWN0IiYmZSYmKG49PXVuZGVmaW5lZCYmKG49ZS5wb3NpdGlvbiksZT1lW3RoaXMucGxhdGZvcm1dKTtpZighZSlyZXR1cm47aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpcmV0dXJuIHRoaXMuYWRkQ29tbWFuZCh7ZXhlYzp0LGJpbmRLZXk6ZSxuYW1lOnQubmFtZXx8ZX0pO2Uuc3BsaXQoInwiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciByPSIiO2lmKGUuaW5kZXhPZigiICIpIT0tMSl7dmFyIGk9ZS5zcGxpdCgvXHMrLyk7ZT1pLnBvcCgpLGkuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD10aGlzLnBhcnNlS2V5cyhlKSxuPXNbdC5oYXNoSWRdK3Qua2V5O3IrPShyPyIgIjoiIikrbix0aGlzLl9hZGRDb21tYW5kVG9CaW5kaW5nKHIsImNoYWluS2V5cyIpfSx0aGlzKSxyKz0iICJ9dmFyIG89dGhpcy5wYXJzZUtleXMoZSksdT1zW28uaGFzaElkXStvLmtleTt0aGlzLl9hZGRDb21tYW5kVG9CaW5kaW5nKHIrdSx0LG4pfSx0aGlzKX0sdGhpcy5fYWRkQ29tbWFuZFRvQmluZGluZz1mdW5jdGlvbih0LG4scil7dmFyIGk9dGhpcy5jb21tYW5kS2V5QmluZGluZyxzO2lmKCFuKWRlbGV0ZSBpW3RdO2Vsc2UgaWYoIWlbdF18fHRoaXMuJHNpbmdsZUNvbW1hbmQpaVt0XT1uO2Vsc2V7QXJyYXkuaXNBcnJheShpW3RdKT8ocz1pW3RdLmluZGV4T2YobikpIT0tMSYmaVt0XS5zcGxpY2UocywxKTppW3RdPVtpW3RdXSx0eXBlb2YgciE9Im51bWJlciImJihyPWUobikpO3ZhciBvPWlbdF07Zm9yKHM9MDtzPG8ubGVuZ3RoO3MrKyl7dmFyIHU9b1tzXSxhPWUodSk7aWYoYT5yKWJyZWFrfW8uc3BsaWNlKHMsMCxuKX19LHRoaXMuYWRkQ29tbWFuZHM9ZnVuY3Rpb24oZSl7ZSYmT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj1lW3RdO2lmKCFuKXJldHVybjtpZih0eXBlb2Ygbj09InN0cmluZyIpcmV0dXJuIHRoaXMuYmluZEtleShuLHQpO3R5cGVvZiBuPT0iZnVuY3Rpb24iJiYobj17ZXhlYzpufSk7aWYodHlwZW9mIG4hPSJvYmplY3QiKXJldHVybjtuLm5hbWV8fChuLm5hbWU9dCksdGhpcy5hZGRDb21tYW5kKG4pfSx0aGlzKX0sdGhpcy5yZW1vdmVDb21tYW5kcz1mdW5jdGlvbihlKXtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3RoaXMucmVtb3ZlQ29tbWFuZChlW3RdKX0sdGhpcyl9LHRoaXMuYmluZEtleXM9ZnVuY3Rpb24oZSl7T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbih0KXt0aGlzLmJpbmRLZXkodCxlW3RdKX0sdGhpcyl9LHRoaXMuX2J1aWxkS2V5SGFzaD1mdW5jdGlvbihlKXt0aGlzLmJpbmRLZXkoZS5iaW5kS2V5LGUpfSx0aGlzLnBhcnNlS2V5cz1mdW5jdGlvbihlKXt2YXIgdD1lLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1tcLVwrXShbXC1cK10pPy8pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZX0pLG49dC5wb3AoKSxpPXJbbl07aWYoci5GVU5DVElPTl9LRVlTW2ldKW49ci5GVU5DVElPTl9LRVlTW2ldLnRvTG93ZXJDYXNlKCk7ZWxzZXtpZighdC5sZW5ndGgpcmV0dXJue2tleTpuLGhhc2hJZDotMX07aWYodC5sZW5ndGg9PTEmJnRbMF09PSJzaGlmdCIpcmV0dXJue2tleTpuLnRvVXBwZXJDYXNlKCksaGFzaElkOi0xfX12YXIgcz0wO2Zvcih2YXIgbz10Lmxlbmd0aDtvLS07KXt2YXIgdT1yLktFWV9NT0RTW3Rbb11dO2lmKHU9PW51bGwpcmV0dXJuIHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIiYmY29uc29sZS5lcnJvcigiaW52YWxpZCBtb2RpZmllciAiK3Rbb10rIiBpbiAiK2UpLCExO3N8PXV9cmV0dXJue2tleTpuLGhhc2hJZDpzfX0sdGhpcy5maW5kS2V5Q29tbWFuZD1mdW5jdGlvbih0LG4pe3ZhciByPXNbdF0rbjtyZXR1cm4gdGhpcy5jb21tYW5kS2V5QmluZGluZ1tyXX0sdGhpcy5oYW5kbGVLZXlib2FyZD1mdW5jdGlvbihlLHQsbixyKXtpZihyPDApcmV0dXJuO3ZhciBpPXNbdF0rbixvPXRoaXMuY29tbWFuZEtleUJpbmRpbmdbaV07ZS4ka2V5Q2hhaW4mJihlLiRrZXlDaGFpbis9IiAiK2ksbz10aGlzLmNvbW1hbmRLZXlCaW5kaW5nW2UuJGtleUNoYWluXXx8byk7aWYobylpZihvPT0iY2hhaW5LZXlzInx8b1tvLmxlbmd0aC0xXT09ImNoYWluS2V5cyIpcmV0dXJuIGUuJGtleUNoYWluPWUuJGtleUNoYWlufHxpLHtjb21tYW5kOiJudWxsIn07aWYoZS4ka2V5Q2hhaW4paWYoISF0JiZ0IT00fHxuLmxlbmd0aCE9MSl7aWYodD09LTF8fHI+MCllLiRrZXlDaGFpbj0iIn1lbHNlIGUuJGtleUNoYWluPWUuJGtleUNoYWluLnNsaWNlKDAsLWkubGVuZ3RoLTEpO3JldHVybntjb21tYW5kOm99fSx0aGlzLmdldFN0YXR1c1RleHQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC4ka2V5Q2hhaW58fCIifX0uY2FsbChvLnByb3RvdHlwZSksdC5IYXNoSGFuZGxlcj1vLHQuTXVsdGlIYXNoSGFuZGxlcj11fSksYWNlLmRlZmluZSgiYWNlL2NvbW1hbmRzL2NvbW1hbmRfbWFuYWdlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2tleWJvYXJkL2hhc2hfaGFuZGxlciIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL29vcCIpLGk9ZSgiLi4va2V5Ym9hcmQvaGFzaF9oYW5kbGVyIikuTXVsdGlIYXNoSGFuZGxlcixzPWUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLG89ZnVuY3Rpb24oZSx0KXtpLmNhbGwodGhpcyx0LGUpLHRoaXMuYnlOYW1lPXRoaXMuY29tbWFuZHMsdGhpcy5zZXREZWZhdWx0SGFuZGxlcigiZXhlYyIsZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29tbWFuZC5leGVjKGUuZWRpdG9yLGUuYXJnc3x8e30pfSl9O3IuaW5oZXJpdHMobyxpKSxmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMscyksdGhpcy5leGVjPWZ1bmN0aW9uKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIHI9ZS5sZW5ndGg7ci0tOylpZih0aGlzLmV4ZWMoZVtyXSx0LG4pKXJldHVybiEwO3JldHVybiExfXR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9dGhpcy5jb21tYW5kc1tlXSk7aWYoIWUpcmV0dXJuITE7aWYodCYmdC4kcmVhZE9ubHkmJiFlLnJlYWRPbmx5KXJldHVybiExO2lmKHRoaXMuJGNoZWNrQ29tbWFuZFN0YXRlIT0wJiZlLmlzQXZhaWxhYmxlJiYhZS5pc0F2YWlsYWJsZSh0KSlyZXR1cm4hMTt2YXIgaT17ZWRpdG9yOnQsY29tbWFuZDplLGFyZ3M6bn07cmV0dXJuIGkucmV0dXJuVmFsdWU9dGhpcy5fZW1pdCgiZXhlYyIsaSksdGhpcy5fc2lnbmFsKCJhZnRlckV4ZWMiLGkpLGkucmV0dXJuVmFsdWU9PT0hMT8hMTohMH0sdGhpcy50b2dnbGVSZWNvcmRpbmc9ZnVuY3Rpb24oZSl7aWYodGhpcy4kaW5SZXBsYXkpcmV0dXJuO3JldHVybiBlJiZlLl9lbWl0KCJjaGFuZ2VTdGF0dXMiKSx0aGlzLnJlY29yZGluZz8odGhpcy5tYWNyby5wb3AoKSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImV4ZWMiLHRoaXMuJGFkZENvbW1hbmRUb01hY3JvKSx0aGlzLm1hY3JvLmxlbmd0aHx8KHRoaXMubWFjcm89dGhpcy5vbGRNYWNybyksdGhpcy5yZWNvcmRpbmc9ITEpOih0aGlzLiRhZGRDb21tYW5kVG9NYWNyb3x8KHRoaXMuJGFkZENvbW1hbmRUb01hY3JvPWZ1bmN0aW9uKGUpe3RoaXMubWFjcm8ucHVzaChbZS5jb21tYW5kLGUuYXJnc10pfS5iaW5kKHRoaXMpKSx0aGlzLm9sZE1hY3JvPXRoaXMubWFjcm8sdGhpcy5tYWNybz1bXSx0aGlzLm9uKCJleGVjIix0aGlzLiRhZGRDb21tYW5kVG9NYWNybyksdGhpcy5yZWNvcmRpbmc9ITApfSx0aGlzLnJlcGxheT1mdW5jdGlvbihlKXtpZih0aGlzLiRpblJlcGxheXx8IXRoaXMubWFjcm8pcmV0dXJuO2lmKHRoaXMucmVjb3JkaW5nKXJldHVybiB0aGlzLnRvZ2dsZVJlY29yZGluZyhlKTt0cnl7dGhpcy4kaW5SZXBsYXk9ITAsdGhpcy5tYWNyby5mb3JFYWNoKGZ1bmN0aW9uKHQpe3R5cGVvZiB0PT0ic3RyaW5nIj90aGlzLmV4ZWModCxlKTp0aGlzLmV4ZWModFswXSxlLHRbMV0pfSx0aGlzKX1maW5hbGx5e3RoaXMuJGluUmVwbGF5PSExfX0sdGhpcy50cmltTWFjcm89ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZVswXSE9InN0cmluZyImJihlWzBdPWVbMF0ubmFtZSksZVsxXXx8KGU9ZVswXSksZX0pfX0uY2FsbChvLnByb3RvdHlwZSksdC5Db21tYW5kTWFuYWdlcj1vfSksYWNlLmRlZmluZSgiYWNlL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciLCJhY2UvY29uZmlnIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCl7cmV0dXJue3dpbjplLG1hYzp0fX12YXIgcj1lKCIuLi9saWIvbGFuZyIpLGk9ZSgiLi4vY29uZmlnIikscz1lKCIuLi9yYW5nZSIpLlJhbmdlO3QuY29tbWFuZHM9W3tuYW1lOiJzaG93U2V0dGluZ3NNZW51IixiaW5kS2V5Om8oIkN0cmwtLCIsIkNvbW1hbmQtLCIpLGV4ZWM6ZnVuY3Rpb24oZSl7aS5sb2FkTW9kdWxlKCJhY2UvZXh0L3NldHRpbmdzX21lbnUiLGZ1bmN0aW9uKHQpe3QuaW5pdChlKSxlLnNob3dTZXR0aW5nc01lbnUoKX0pfSxyZWFkT25seTohMH0se25hbWU6ImdvVG9OZXh0RXJyb3IiLGJpbmRLZXk6bygiQWx0LUUiLCJGNCIpLGV4ZWM6ZnVuY3Rpb24oZSl7aS5sb2FkTW9kdWxlKCIuL2V4dC9lcnJvcl9tYXJrZXIiLGZ1bmN0aW9uKHQpe3Quc2hvd0Vycm9yTWFya2VyKGUsMSl9KX0sc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ29Ub1ByZXZpb3VzRXJyb3IiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LUUiLCJTaGlmdC1GNCIpLGV4ZWM6ZnVuY3Rpb24oZSl7aS5sb2FkTW9kdWxlKCIuL2V4dC9lcnJvcl9tYXJrZXIiLGZ1bmN0aW9uKHQpe3Quc2hvd0Vycm9yTWFya2VyKGUsLTEpfSl9LHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdGFsbCIsZGVzY3JpcHRpb246IlNlbGVjdCBhbGwiLGJpbmRLZXk6bygiQ3RybC1BIiwiQ29tbWFuZC1BIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdEFsbCgpfSxyZWFkT25seTohMH0se25hbWU6ImNlbnRlcnNlbGVjdGlvbiIsZGVzY3JpcHRpb246IkNlbnRlciBzZWxlY3Rpb24iLGJpbmRLZXk6byhudWxsLCJDdHJsLUwiKSxleGVjOmZ1bmN0aW9uKGUpe2UuY2VudGVyU2VsZWN0aW9uKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b2xpbmUiLGRlc2NyaXB0aW9uOiJHbyB0byBsaW5lLi4uIixiaW5kS2V5Om8oIkN0cmwtTCIsIkNvbW1hbmQtTCIpLGV4ZWM6ZnVuY3Rpb24oZSx0KXt0eXBlb2YgdD09Im51bWJlciImJiFpc05hTih0KSYmZS5nb3RvTGluZSh0KSxlLnByb21wdCh7JHR5cGU6ImdvdG9MaW5lIn0pfSxyZWFkT25seTohMH0se25hbWU6ImZvbGQiLGJpbmRLZXk6bygiQWx0LUx8Q3RybC1GMSIsIkNvbW1hbmQtQWx0LUx8Q29tbWFuZC1GMSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZXNzaW9uLnRvZ2dsZUZvbGQoITEpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJ1bmZvbGQiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LUx8Q3RybC1TaGlmdC1GMSIsIkNvbW1hbmQtQWx0LVNoaWZ0LUx8Q29tbWFuZC1TaGlmdC1GMSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZXNzaW9uLnRvZ2dsZUZvbGQoITApfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJ0b2dnbGVGb2xkV2lkZ2V0IixiaW5kS2V5Om8oIkYyIiwiRjIiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Vzc2lvbi50b2dnbGVGb2xkV2lkZ2V0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6InRvZ2dsZVBhcmVudEZvbGRXaWRnZXQiLGJpbmRLZXk6bygiQWx0LUYyIiwiQWx0LUYyIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlc3Npb24udG9nZ2xlRm9sZFdpZGdldCghMCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6ImZvbGRhbGwiLGRlc2NyaXB0aW9uOiJGb2xkIGFsbCIsYmluZEtleTpvKG51bGwsIkN0cmwtQ29tbWFuZC1PcHRpb24tMCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZXNzaW9uLmZvbGRBbGwoKX0sc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJmb2xkT3RoZXIiLGRlc2NyaXB0aW9uOiJGb2xkIG90aGVyIixiaW5kS2V5Om8oIkFsdC0wIiwiQ29tbWFuZC1PcHRpb24tMCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZXNzaW9uLmZvbGRBbGwoKSxlLnNlc3Npb24udW5mb2xkKGUuc2VsZWN0aW9uLmdldEFsbFJhbmdlcygpKX0sc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJ1bmZvbGRhbGwiLGRlc2NyaXB0aW9uOiJVbmZvbGQgYWxsIixiaW5kS2V5Om8oIkFsdC1TaGlmdC0wIiwiQ29tbWFuZC1PcHRpb24tU2hpZnQtMCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZXNzaW9uLnVuZm9sZCgpfSxzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6ImZpbmRuZXh0IixkZXNjcmlwdGlvbjoiRmluZCBuZXh0IixiaW5kS2V5Om8oIkN0cmwtSyIsIkNvbW1hbmQtRyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5maW5kTmV4dCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJmaW5kcHJldmlvdXMiLGRlc2NyaXB0aW9uOiJGaW5kIHByZXZpb3VzIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtSyIsIkNvbW1hbmQtU2hpZnQtRyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5maW5kUHJldmlvdXMoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0T3JGaW5kTmV4dCIsZGVzY3JpcHRpb246IlNlbGVjdCBvciBmaW5kIG5leHQiLGJpbmRLZXk6bygiQWx0LUsiLCJDdHJsLUciKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0aW9uLmlzRW1wdHkoKT9lLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk6ZS5maW5kTmV4dCgpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdE9yRmluZFByZXZpb3VzIixkZXNjcmlwdGlvbjoiU2VsZWN0IG9yIGZpbmQgcHJldmlvdXMiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LUsiLCJDdHJsLVNoaWZ0LUciKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0aW9uLmlzRW1wdHkoKT9lLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk6ZS5maW5kUHJldmlvdXMoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJmaW5kIixkZXNjcmlwdGlvbjoiRmluZCIsYmluZEtleTpvKCJDdHJsLUYiLCJDb21tYW5kLUYiKSxleGVjOmZ1bmN0aW9uKGUpe2kubG9hZE1vZHVsZSgiYWNlL2V4dC9zZWFyY2hib3giLGZ1bmN0aW9uKHQpe3QuU2VhcmNoKGUpfSl9LHJlYWRPbmx5OiEwfSx7bmFtZToib3ZlcndyaXRlIixkZXNjcmlwdGlvbjoiT3ZlcndyaXRlIixiaW5kS2V5OiJJbnNlcnQiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS50b2dnbGVPdmVyd3JpdGUoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R0b3N0YXJ0IixkZXNjcmlwdGlvbjoiU2VsZWN0IHRvIHN0YXJ0IixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtSG9tZSIsIkNvbW1hbmQtU2hpZnQtSG9tZXxDb21tYW5kLVNoaWZ0LVVwIiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdEZpbGVTdGFydCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIscmVhZE9ubHk6ITAsc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLGFjZUNvbW1hbmRHcm91cDoiZmlsZUp1bXAifSx7bmFtZToiZ290b3N0YXJ0IixkZXNjcmlwdGlvbjoiR28gdG8gc3RhcnQiLGJpbmRLZXk6bygiQ3RybC1Ib21lIiwiQ29tbWFuZC1Ib21lfENvbW1hbmQtVXAiKSxleGVjOmZ1bmN0aW9uKGUpe2UubmF2aWdhdGVGaWxlU3RhcnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHJlYWRPbmx5OiEwLHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixhY2VDb21tYW5kR3JvdXA6ImZpbGVKdW1wIn0se25hbWU6InNlbGVjdHVwIixkZXNjcmlwdGlvbjoiU2VsZWN0IHVwIixiaW5kS2V5Om8oIlNoaWZ0LVVwIiwiU2hpZnQtVXB8Q3RybC1TaGlmdC1QIiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdFVwKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvbGluZXVwIixkZXNjcmlwdGlvbjoiR28gbGluZSB1cCIsYmluZEtleTpvKCJVcCIsIlVwfEN0cmwtUCIpLGV4ZWM6ZnVuY3Rpb24oZSx0KXtlLm5hdmlnYXRlVXAodC50aW1lcyl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHRvZW5kIixkZXNjcmlwdGlvbjoiU2VsZWN0IHRvIGVuZCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUVuZCIsIkNvbW1hbmQtU2hpZnQtRW5kfENvbW1hbmQtU2hpZnQtRG93biIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RGaWxlRW5kKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixyZWFkT25seTohMCxzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIsYWNlQ29tbWFuZEdyb3VwOiJmaWxlSnVtcCJ9LHtuYW1lOiJnb3RvZW5kIixkZXNjcmlwdGlvbjoiR28gdG8gZW5kIixiaW5kS2V5Om8oIkN0cmwtRW5kIiwiQ29tbWFuZC1FbmR8Q29tbWFuZC1Eb3duIiksZXhlYzpmdW5jdGlvbihlKXtlLm5hdmlnYXRlRmlsZUVuZCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIscmVhZE9ubHk6ITAsc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLGFjZUNvbW1hbmRHcm91cDoiZmlsZUp1bXAifSx7bmFtZToic2VsZWN0ZG93biIsZGVzY3JpcHRpb246IlNlbGVjdCBkb3duIixiaW5kS2V5Om8oIlNoaWZ0LURvd24iLCJTaGlmdC1Eb3dufEN0cmwtU2hpZnQtTiIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3REb3duKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvbGluZWRvd24iLGRlc2NyaXB0aW9uOiJHbyBsaW5lIGRvd24iLGJpbmRLZXk6bygiRG93biIsIkRvd258Q3RybC1OIiksZXhlYzpmdW5jdGlvbihlLHQpe2UubmF2aWdhdGVEb3duKHQudGltZXMpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R3b3JkbGVmdCIsZGVzY3JpcHRpb246IlNlbGVjdCB3b3JkIGxlZnQiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1MZWZ0IiwiT3B0aW9uLVNoaWZ0LUxlZnQiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0V29yZExlZnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3dvcmRsZWZ0IixkZXNjcmlwdGlvbjoiR28gdG8gd29yZCBsZWZ0IixiaW5kS2V5Om8oIkN0cmwtTGVmdCIsIk9wdGlvbi1MZWZ0IiksZXhlYzpmdW5jdGlvbihlKXtlLm5hdmlnYXRlV29yZExlZnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0dG9saW5lc3RhcnQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgdG8gbGluZSBzdGFydCIsYmluZEtleTpvKCJBbHQtU2hpZnQtTGVmdCIsIkNvbW1hbmQtU2hpZnQtTGVmdHxDdHJsLVNoaWZ0LUEiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGluZVN0YXJ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvdG9saW5lc3RhcnQiLGRlc2NyaXB0aW9uOiJHbyB0byBsaW5lIHN0YXJ0IixiaW5kS2V5Om8oIkFsdC1MZWZ0fEhvbWUiLCJDb21tYW5kLUxlZnR8SG9tZXxDdHJsLUEiKSxleGVjOmZ1bmN0aW9uKGUpe2UubmF2aWdhdGVMaW5lU3RhcnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0bGVmdCIsZGVzY3JpcHRpb246IlNlbGVjdCBsZWZ0IixiaW5kS2V5Om8oIlNoaWZ0LUxlZnQiLCJTaGlmdC1MZWZ0fEN0cmwtU2hpZnQtQiIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMZWZ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvdG9sZWZ0IixkZXNjcmlwdGlvbjoiR28gdG8gbGVmdCIsYmluZEtleTpvKCJMZWZ0IiwiTGVmdHxDdHJsLUIiKSxleGVjOmZ1bmN0aW9uKGUsdCl7ZS5uYXZpZ2F0ZUxlZnQodC50aW1lcyl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHdvcmRyaWdodCIsZGVzY3JpcHRpb246IlNlbGVjdCB3b3JkIHJpZ2h0IixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtUmlnaHQiLCJPcHRpb24tU2hpZnQtUmlnaHQiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0V29yZFJpZ2h0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvdG93b3JkcmlnaHQiLGRlc2NyaXB0aW9uOiJHbyB0byB3b3JkIHJpZ2h0IixiaW5kS2V5Om8oIkN0cmwtUmlnaHQiLCJPcHRpb24tUmlnaHQiKSxleGVjOmZ1bmN0aW9uKGUpe2UubmF2aWdhdGVXb3JkUmlnaHQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0dG9saW5lZW5kIixkZXNjcmlwdGlvbjoiU2VsZWN0IHRvIGxpbmUgZW5kIixiaW5kS2V5Om8oIkFsdC1TaGlmdC1SaWdodCIsIkNvbW1hbmQtU2hpZnQtUmlnaHR8U2hpZnQtRW5kfEN0cmwtU2hpZnQtRSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lRW5kKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvdG9saW5lZW5kIixkZXNjcmlwdGlvbjoiR28gdG8gbGluZSBlbmQiLGJpbmRLZXk6bygiQWx0LVJpZ2h0fEVuZCIsIkNvbW1hbmQtUmlnaHR8RW5kfEN0cmwtRSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5uYXZpZ2F0ZUxpbmVFbmQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0cmlnaHQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgcmlnaHQiLGJpbmRLZXk6bygiU2hpZnQtUmlnaHQiLCJTaGlmdC1SaWdodCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RSaWdodCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvcmlnaHQiLGRlc2NyaXB0aW9uOiJHbyB0byByaWdodCIsYmluZEtleTpvKCJSaWdodCIsIlJpZ2h0fEN0cmwtRiIpLGV4ZWM6ZnVuY3Rpb24oZSx0KXtlLm5hdmlnYXRlUmlnaHQodC50aW1lcyl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHBhZ2Vkb3duIixkZXNjcmlwdGlvbjoiU2VsZWN0IHBhZ2UgZG93biIsYmluZEtleToiU2hpZnQtUGFnZURvd24iLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RQYWdlRG93bigpfSxyZWFkT25seTohMH0se25hbWU6InBhZ2Vkb3duIixkZXNjcmlwdGlvbjoiUGFnZSBkb3duIixiaW5kS2V5Om8obnVsbCwiT3B0aW9uLVBhZ2VEb3duIiksZXhlYzpmdW5jdGlvbihlKXtlLnNjcm9sbFBhZ2VEb3duKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3BhZ2Vkb3duIixkZXNjcmlwdGlvbjoiR28gdG8gcGFnZSBkb3duIixiaW5kS2V5Om8oIlBhZ2VEb3duIiwiUGFnZURvd258Q3RybC1WIiksZXhlYzpmdW5jdGlvbihlKXtlLmdvdG9QYWdlRG93bigpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdHBhZ2V1cCIsZGVzY3JpcHRpb246IlNlbGVjdCBwYWdlIHVwIixiaW5kS2V5OiJTaGlmdC1QYWdlVXAiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RQYWdlVXAoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJwYWdldXAiLGRlc2NyaXB0aW9uOiJQYWdlIHVwIixiaW5kS2V5Om8obnVsbCwiT3B0aW9uLVBhZ2VVcCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zY3JvbGxQYWdlVXAoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvcGFnZXVwIixkZXNjcmlwdGlvbjoiR28gdG8gcGFnZSB1cCIsYmluZEtleToiUGFnZVVwIixleGVjOmZ1bmN0aW9uKGUpe2UuZ290b1BhZ2VVcCgpfSxyZWFkT25seTohMH0se25hbWU6InNjcm9sbHVwIixkZXNjcmlwdGlvbjoiU2Nyb2xsIHVwIixiaW5kS2V5Om8oIkN0cmwtVXAiLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW5kZXJlci5zY3JvbGxCeSgwLC0yKmUucmVuZGVyZXIubGF5ZXJDb25maWcubGluZUhlaWdodCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2Nyb2xsZG93biIsZGVzY3JpcHRpb246IlNjcm9sbCBkb3duIixiaW5kS2V5Om8oIkN0cmwtRG93biIsbnVsbCksZXhlYzpmdW5jdGlvbihlKXtlLnJlbmRlcmVyLnNjcm9sbEJ5KDAsMiplLnJlbmRlcmVyLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdGxpbmVzdGFydCIsZGVzY3JpcHRpb246IlNlbGVjdCBsaW5lIHN0YXJ0IixiaW5kS2V5OiJTaGlmdC1Ib21lIixleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGluZVN0YXJ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdGxpbmVlbmQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgbGluZSBlbmQiLGJpbmRLZXk6IlNoaWZ0LUVuZCIsZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVFbmQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToidG9nZ2xlcmVjb3JkaW5nIixkZXNjcmlwdGlvbjoiVG9nZ2xlIHJlY29yZGluZyIsYmluZEtleTpvKCJDdHJsLUFsdC1FIiwiQ29tbWFuZC1PcHRpb24tRSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5jb21tYW5kcy50b2dnbGVSZWNvcmRpbmcoZSl9LHJlYWRPbmx5OiEwfSx7bmFtZToicmVwbGF5bWFjcm8iLGRlc2NyaXB0aW9uOiJSZXBsYXkgbWFjcm8iLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1FIiwiQ29tbWFuZC1TaGlmdC1FIiksZXhlYzpmdW5jdGlvbihlKXtlLmNvbW1hbmRzLnJlcGxheShlKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJqdW1wdG9tYXRjaGluZyIsZGVzY3JpcHRpb246Ikp1bXAgdG8gbWF0Y2hpbmciLGJpbmRLZXk6bygiQ3RybC1cXHxDdHJsLVAiLCJDb21tYW5kLVxcIiksZXhlYzpmdW5jdGlvbihlKXtlLmp1bXBUb01hdGNoaW5nKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R0b21hdGNoaW5nIixkZXNjcmlwdGlvbjoiU2VsZWN0IHRvIG1hdGNoaW5nIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtXFx8Q3RybC1TaGlmdC1QIiwiQ29tbWFuZC1TaGlmdC1cXCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5qdW1wVG9NYXRjaGluZyghMCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIscmVhZE9ubHk6ITB9LHtuYW1lOiJleHBhbmRUb01hdGNoaW5nIixkZXNjcmlwdGlvbjoiRXhwYW5kIHRvIG1hdGNoaW5nIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtTSIsIkN0cmwtU2hpZnQtTSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5qdW1wVG9NYXRjaGluZyghMCwhMCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIscmVhZE9ubHk6ITB9LHtuYW1lOiJwYXNzS2V5c1RvQnJvd3NlciIsZGVzY3JpcHRpb246IlBhc3Mga2V5cyB0byBicm93c2VyIixiaW5kS2V5Om8obnVsbCxudWxsKSxleGVjOmZ1bmN0aW9uKCl7fSxwYXNzRXZlbnQ6ITAscmVhZE9ubHk6ITB9LHtuYW1lOiJjb3B5IixkZXNjcmlwdGlvbjoiQ29weSIsZXhlYzpmdW5jdGlvbihlKXt9LHJlYWRPbmx5OiEwfSx7bmFtZToiY3V0IixkZXNjcmlwdGlvbjoiQ3V0IixleGVjOmZ1bmN0aW9uKGUpe3ZhciB0PWUuJGNvcHlXaXRoRW1wdHlTZWxlY3Rpb24mJmUuc2VsZWN0aW9uLmlzRW1wdHkoKSxuPXQ/ZS5zZWxlY3Rpb24uZ2V0TGluZVJhbmdlKCk6ZS5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTtlLl9lbWl0KCJjdXQiLG4pLG4uaXNFbXB0eSgpfHxlLnNlc3Npb24ucmVtb3ZlKG4pLGUuY2xlYXJTZWxlY3Rpb24oKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIsbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2gifSx7bmFtZToicGFzdGUiLGRlc2NyaXB0aW9uOiJQYXN0ZSIsZXhlYzpmdW5jdGlvbihlLHQpe2UuJGhhbmRsZVBhc3RlKHQpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InJlbW92ZWxpbmUiLGRlc2NyaXB0aW9uOiJSZW1vdmUgbGluZSIsYmluZEtleTpvKCJDdHJsLUQiLCJDb21tYW5kLUQiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVtb3ZlTGluZXMoKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIsbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2hMaW5lIn0se25hbWU6ImR1cGxpY2F0ZVNlbGVjdGlvbiIsZGVzY3JpcHRpb246IkR1cGxpY2F0ZSBzZWxlY3Rpb24iLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1EIiwiQ29tbWFuZC1TaGlmdC1EIiksZXhlYzpmdW5jdGlvbihlKXtlLmR1cGxpY2F0ZVNlbGVjdGlvbigpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCJ9LHtuYW1lOiJzb3J0bGluZXMiLGRlc2NyaXB0aW9uOiJTb3J0IGxpbmVzIixiaW5kS2V5Om8oIkN0cmwtQWx0LVMiLCJDb21tYW5kLUFsdC1TIiksZXhlYzpmdW5jdGlvbihlKXtlLnNvcnRMaW5lcygpfSxzY3JvbGxJbnRvVmlldzoic2VsZWN0aW9uIixtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaExpbmUifSx7bmFtZToidG9nZ2xlY29tbWVudCIsZGVzY3JpcHRpb246IlRvZ2dsZSBjb21tZW50IixiaW5kS2V5Om8oIkN0cmwtLyIsIkNvbW1hbmQtLyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS50b2dnbGVDb21tZW50TGluZXMoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2hMaW5lIixzY3JvbGxJbnRvVmlldzoic2VsZWN0aW9uUGFydCJ9LHtuYW1lOiJ0b2dnbGVCbG9ja0NvbW1lbnQiLGRlc2NyaXB0aW9uOiJUb2dnbGUgYmxvY2sgY29tbWVudCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LS8iLCJDb21tYW5kLVNoaWZ0LS8iKSxleGVjOmZ1bmN0aW9uKGUpe2UudG9nZ2xlQmxvY2tDb21tZW50KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoic2VsZWN0aW9uUGFydCJ9LHtuYW1lOiJtb2RpZnlOdW1iZXJVcCIsZGVzY3JpcHRpb246Ik1vZGlmeSBudW1iZXIgdXAiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1VcCIsIkFsdC1TaGlmdC1VcCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5tb2RpZnlOdW1iZXIoMSl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIn0se25hbWU6Im1vZGlmeU51bWJlckRvd24iLGRlc2NyaXB0aW9uOiJNb2RpZnkgbnVtYmVyIGRvd24iLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1Eb3duIiwiQWx0LVNoaWZ0LURvd24iKSxleGVjOmZ1bmN0aW9uKGUpe2UubW9kaWZ5TnVtYmVyKC0xKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIsbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2gifSx7bmFtZToicmVwbGFjZSIsZGVzY3JpcHRpb246IlJlcGxhY2UiLGJpbmRLZXk6bygiQ3RybC1IIiwiQ29tbWFuZC1PcHRpb24tRiIpLGV4ZWM6ZnVuY3Rpb24oZSl7aS5sb2FkTW9kdWxlKCJhY2UvZXh0L3NlYXJjaGJveCIsZnVuY3Rpb24odCl7dC5TZWFyY2goZSwhMCl9KX19LHtuYW1lOiJ1bmRvIixkZXNjcmlwdGlvbjoiVW5kbyIsYmluZEtleTpvKCJDdHJsLVoiLCJDb21tYW5kLVoiKSxleGVjOmZ1bmN0aW9uKGUpe2UudW5kbygpfX0se25hbWU6InJlZG8iLGRlc2NyaXB0aW9uOiJSZWRvIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtWnxDdHJsLVkiLCJDb21tYW5kLVNoaWZ0LVp8Q29tbWFuZC1ZIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlZG8oKX19LHtuYW1lOiJjb3B5bGluZXN1cCIsZGVzY3JpcHRpb246IkNvcHkgbGluZXMgdXAiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LVVwIiwiQ29tbWFuZC1PcHRpb24tVXAiKSxleGVjOmZ1bmN0aW9uKGUpe2UuY29weUxpbmVzVXAoKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJtb3ZlbGluZXN1cCIsZGVzY3JpcHRpb246Ik1vdmUgbGluZXMgdXAiLGJpbmRLZXk6bygiQWx0LVVwIiwiT3B0aW9uLVVwIiksZXhlYzpmdW5jdGlvbihlKXtlLm1vdmVMaW5lc1VwKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToiY29weWxpbmVzZG93biIsZGVzY3JpcHRpb246IkNvcHkgbGluZXMgZG93biIsYmluZEtleTpvKCJBbHQtU2hpZnQtRG93biIsIkNvbW1hbmQtT3B0aW9uLURvd24iKSxleGVjOmZ1bmN0aW9uKGUpe2UuY29weUxpbmVzRG93bigpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6Im1vdmVsaW5lc2Rvd24iLGRlc2NyaXB0aW9uOiJNb3ZlIGxpbmVzIGRvd24iLGJpbmRLZXk6bygiQWx0LURvd24iLCJPcHRpb24tRG93biIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5tb3ZlTGluZXNEb3duKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToiZGVsIixkZXNjcmlwdGlvbjoiRGVsZXRlIixiaW5kS2V5Om8oIkRlbGV0ZSIsIkRlbGV0ZXxDdHJsLUR8U2hpZnQtRGVsZXRlIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlbW92ZSgicmlnaHQiKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToiYmFja3NwYWNlIixkZXNjcmlwdGlvbjoiQmFja3NwYWNlIixiaW5kS2V5Om8oIlNoaWZ0LUJhY2tzcGFjZXxCYWNrc3BhY2UiLCJDdHJsLUJhY2tzcGFjZXxTaGlmdC1CYWNrc3BhY2V8QmFja3NwYWNlfEN0cmwtSCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW1vdmUoImxlZnQiKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToiY3V0X29yX2RlbGV0ZSIsZGVzY3JpcHRpb246IkN1dCBvciBkZWxldGUiLGJpbmRLZXk6bygiU2hpZnQtRGVsZXRlIixudWxsKSxleGVjOmZ1bmN0aW9uKGUpe2lmKCFlLnNlbGVjdGlvbi5pc0VtcHR5KCkpcmV0dXJuITE7ZS5yZW1vdmUoImxlZnQiKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToicmVtb3ZldG9saW5lc3RhcnQiLGRlc2NyaXB0aW9uOiJSZW1vdmUgdG8gbGluZSBzdGFydCIsYmluZEtleTpvKCJBbHQtQmFja3NwYWNlIiwiQ29tbWFuZC1CYWNrc3BhY2UiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVtb3ZlVG9MaW5lU3RhcnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToicmVtb3ZldG9saW5lZW5kIixkZXNjcmlwdGlvbjoiUmVtb3ZlIHRvIGxpbmUgZW5kIixiaW5kS2V5Om8oIkFsdC1EZWxldGUiLCJDdHJsLUt8Q29tbWFuZC1EZWxldGUiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVtb3ZlVG9MaW5lRW5kKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InJlbW92ZXRvbGluZXN0YXJ0aGFyZCIsZGVzY3JpcHRpb246IlJlbW92ZSB0byBsaW5lIHN0YXJ0IGhhcmQiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1CYWNrc3BhY2UiLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTt0LnN0YXJ0LmNvbHVtbj0wLGUuc2Vzc2lvbi5yZW1vdmUodCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InJlbW92ZXRvbGluZWVuZGhhcmQiLGRlc2NyaXB0aW9uOiJSZW1vdmUgdG8gbGluZSBlbmQgaGFyZCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LURlbGV0ZSIsbnVsbCksZXhlYzpmdW5jdGlvbihlKXt2YXIgdD1lLnNlbGVjdGlvbi5nZXRSYW5nZSgpO3QuZW5kLmNvbHVtbj1OdW1iZXIuTUFYX1ZBTFVFLGUuc2Vzc2lvbi5yZW1vdmUodCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InJlbW92ZXdvcmRsZWZ0IixkZXNjcmlwdGlvbjoiUmVtb3ZlIHdvcmQgbGVmdCIsYmluZEtleTpvKCJDdHJsLUJhY2tzcGFjZSIsIkFsdC1CYWNrc3BhY2V8Q3RybC1BbHQtQmFja3NwYWNlIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlbW92ZVdvcmRMZWZ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InJlbW92ZXdvcmRyaWdodCIsZGVzY3JpcHRpb246IlJlbW92ZSB3b3JkIHJpZ2h0IixiaW5kS2V5Om8oIkN0cmwtRGVsZXRlIiwiQWx0LURlbGV0ZSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW1vdmVXb3JkUmlnaHQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToib3V0ZGVudCIsZGVzY3JpcHRpb246Ik91dGRlbnQiLGJpbmRLZXk6bygiU2hpZnQtVGFiIiwiU2hpZnQtVGFiIiksZXhlYzpmdW5jdGlvbihlKXtlLmJsb2NrT3V0ZGVudCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6InNlbGVjdGlvblBhcnQifSx7bmFtZToiaW5kZW50IixkZXNjcmlwdGlvbjoiSW5kZW50IixiaW5kS2V5Om8oIlRhYiIsIlRhYiIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5pbmRlbnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJzZWxlY3Rpb25QYXJ0In0se25hbWU6ImJsb2Nrb3V0ZGVudCIsZGVzY3JpcHRpb246IkJsb2NrIG91dGRlbnQiLGJpbmRLZXk6bygiQ3RybC1bIiwiQ3RybC1bIiksZXhlYzpmdW5jdGlvbihlKXtlLmJsb2NrT3V0ZGVudCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaExpbmUiLHNjcm9sbEludG9WaWV3OiJzZWxlY3Rpb25QYXJ0In0se25hbWU6ImJsb2NraW5kZW50IixkZXNjcmlwdGlvbjoiQmxvY2sgaW5kZW50IixiaW5kS2V5Om8oIkN0cmwtXSIsIkN0cmwtXSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5ibG9ja0luZGVudCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaExpbmUiLHNjcm9sbEludG9WaWV3OiJzZWxlY3Rpb25QYXJ0In0se25hbWU6Imluc2VydHN0cmluZyIsZGVzY3JpcHRpb246Ikluc2VydCBzdHJpbmciLGV4ZWM6ZnVuY3Rpb24oZSx0KXtlLmluc2VydCh0KX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToiaW5zZXJ0dGV4dCIsZGVzY3JpcHRpb246Ikluc2VydCB0ZXh0IixleGVjOmZ1bmN0aW9uKGUsdCl7ZS5pbnNlcnQoci5zdHJpbmdSZXBlYXQodC50ZXh0fHwiIix0LnRpbWVzfHwxKSl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InNwbGl0bGluZSIsZGVzY3JpcHRpb246IlNwbGl0IGxpbmUiLGJpbmRLZXk6byhudWxsLCJDdHJsLU8iKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc3BsaXRMaW5lKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InRyYW5zcG9zZWxldHRlcnMiLGRlc2NyaXB0aW9uOiJUcmFuc3Bvc2UgbGV0dGVycyIsYmluZEtleTpvKCJBbHQtU2hpZnQtWCIsIkN0cmwtVCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS50cmFuc3Bvc2VMZXR0ZXJzKCl9LG11bHRpU2VsZWN0QWN0aW9uOmZ1bmN0aW9uKGUpe2UudHJhbnNwb3NlU2VsZWN0aW9ucygxKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJ0b3VwcGVyY2FzZSIsZGVzY3JpcHRpb246IlRvIHVwcGVyY2FzZSIsYmluZEtleTpvKCJDdHJsLVUiLCJDdHJsLVUiKSxleGVjOmZ1bmN0aW9uKGUpe2UudG9VcHBlckNhc2UoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToidG9sb3dlcmNhc2UiLGRlc2NyaXB0aW9uOiJUbyBsb3dlcmNhc2UiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1VIiwiQ3RybC1TaGlmdC1VIiksZXhlYzpmdW5jdGlvbihlKXtlLnRvTG93ZXJDYXNlKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6ImV4cGFuZHRvbGluZSIsZGVzY3JpcHRpb246IkV4cGFuZCB0byBsaW5lIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtTCIsIkNvbW1hbmQtU2hpZnQtTCIpLGV4ZWM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTt0LnN0YXJ0LmNvbHVtbj10LmVuZC5jb2x1bW49MCx0LmVuZC5yb3crKyxlLnNlbGVjdGlvbi5zZXRSYW5nZSh0LCExKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiam9pbmxpbmVzIixkZXNjcmlwdGlvbjoiSm9pbiBsaW5lcyIsYmluZEtleTpvKG51bGwsbnVsbCksZXhlYzpmdW5jdGlvbihlKXt2YXIgdD1lLnNlbGVjdGlvbi5pc0JhY2t3YXJkcygpLG49dD9lLnNlbGVjdGlvbi5nZXRTZWxlY3Rpb25MZWFkKCk6ZS5zZWxlY3Rpb24uZ2V0U2VsZWN0aW9uQW5jaG9yKCksaT10P2Uuc2VsZWN0aW9uLmdldFNlbGVjdGlvbkFuY2hvcigpOmUuc2VsZWN0aW9uLmdldFNlbGVjdGlvbkxlYWQoKSxvPWUuc2Vzc2lvbi5kb2MuZ2V0TGluZShuLnJvdykubGVuZ3RoLHU9ZS5zZXNzaW9uLmRvYy5nZXRUZXh0UmFuZ2UoZS5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSksYT11LnJlcGxhY2UoL1xuXHMqLywiICIpLmxlbmd0aCxmPWUuc2Vzc2lvbi5kb2MuZ2V0TGluZShuLnJvdyk7Zm9yKHZhciBsPW4ucm93KzE7bDw9aS5yb3crMTtsKyspe3ZhciBjPXIuc3RyaW5nVHJpbUxlZnQoci5zdHJpbmdUcmltUmlnaHQoZS5zZXNzaW9uLmRvYy5nZXRMaW5lKGwpKSk7Yy5sZW5ndGghPT0wJiYoYz0iICIrYyksZis9Y31pLnJvdysxPGUuc2Vzc2lvbi5kb2MuZ2V0TGVuZ3RoKCktMSYmKGYrPWUuc2Vzc2lvbi5kb2MuZ2V0TmV3TGluZUNoYXJhY3RlcigpKSxlLmNsZWFyU2VsZWN0aW9uKCksZS5zZXNzaW9uLmRvYy5yZXBsYWNlKG5ldyBzKG4ucm93LDAsaS5yb3crMiwwKSxmKSxhPjA/KGUuc2VsZWN0aW9uLm1vdmVDdXJzb3JUbyhuLnJvdyxuLmNvbHVtbiksZS5zZWxlY3Rpb24uc2VsZWN0VG8obi5yb3csbi5jb2x1bW4rYSkpOihvPWUuc2Vzc2lvbi5kb2MuZ2V0TGluZShuLnJvdykubGVuZ3RoPm8/bysxOm8sZS5zZWxlY3Rpb24ubW92ZUN1cnNvclRvKG4ucm93LG8pKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHJlYWRPbmx5OiEwfSx7bmFtZToiaW52ZXJ0U2VsZWN0aW9uIixkZXNjcmlwdGlvbjoiSW52ZXJ0IHNlbGVjdGlvbiIsYmluZEtleTpvKG51bGwsbnVsbCksZXhlYzpmdW5jdGlvbihlKXt2YXIgdD1lLnNlc3Npb24uZG9jLmdldExlbmd0aCgpLTEsbj1lLnNlc3Npb24uZG9jLmdldExpbmUodCkubGVuZ3RoLHI9ZS5zZWxlY3Rpb24ucmFuZ2VMaXN0LnJhbmdlcyxpPVtdO3IubGVuZ3RoPDEmJihyPVtlLnNlbGVjdGlvbi5nZXRSYW5nZSgpXSk7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspbz09ci5sZW5ndGgtMSYmKHJbb10uZW5kLnJvdyE9PXR8fHJbb10uZW5kLmNvbHVtbiE9PW4pJiZpLnB1c2gobmV3IHMocltvXS5lbmQucm93LHJbb10uZW5kLmNvbHVtbix0LG4pKSxvPT09MD8ocltvXS5zdGFydC5yb3chPT0wfHxyW29dLnN0YXJ0LmNvbHVtbiE9PTApJiZpLnB1c2gobmV3IHMoMCwwLHJbb10uc3RhcnQucm93LHJbb10uc3RhcnQuY29sdW1uKSk6aS5wdXNoKG5ldyBzKHJbby0xXS5lbmQucm93LHJbby0xXS5lbmQuY29sdW1uLHJbb10uc3RhcnQucm93LHJbb10uc3RhcnQuY29sdW1uKSk7ZS5leGl0TXVsdGlTZWxlY3RNb2RlKCksZS5jbGVhclNlbGVjdGlvbigpO2Zvcih2YXIgbz0wO288aS5sZW5ndGg7bysrKWUuc2VsZWN0aW9uLmFkZFJhbmdlKGlbb10sITEpfSxyZWFkT25seTohMCxzY3JvbGxJbnRvVmlldzoibm9uZSJ9LHtuYW1lOiJvcGVuQ29tbWFuZFBhbGxldGUiLGRlc2NyaXB0aW9uOiJPcGVuIGNvbW1hbmQgcGFsbGV0ZSIsYmluZEtleTpvKCJGMSIsIkYxIiksZXhlYzpmdW5jdGlvbihlKXtlLnByb21wdCh7JHR5cGU6ImNvbW1hbmRzIn0pfSxyZWFkT25seTohMH0se25hbWU6Im1vZGVTZWxlY3QiLGRlc2NyaXB0aW9uOiJDaGFuZ2UgbGFuZ3VhZ2UgbW9kZS4uLiIsYmluZEtleTpvKG51bGwsbnVsbCksZXhlYzpmdW5jdGlvbihlKXtlLnByb21wdCh7JHR5cGU6Im1vZGVzIn0pfSxyZWFkT25seTohMH1dfSksYWNlLmRlZmluZSgiYWNlL2VkaXRvciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZml4b2xkYnJvd3NlcnMiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi91c2VyYWdlbnQiLCJhY2Uva2V5Ym9hcmQvdGV4dGlucHV0IiwiYWNlL21vdXNlL21vdXNlX2hhbmRsZXIiLCJhY2UvbW91c2UvZm9sZF9oYW5kbGVyIiwiYWNlL2tleWJvYXJkL2tleWJpbmRpbmciLCJhY2UvZWRpdF9zZXNzaW9uIiwiYWNlL3NlYXJjaCIsImFjZS9yYW5nZSIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9jb21tYW5kcy9jb21tYW5kX21hbmFnZXIiLCJhY2UvY29tbWFuZHMvZGVmYXVsdF9jb21tYW5kcyIsImFjZS9jb25maWciLCJhY2UvdG9rZW5faXRlcmF0b3IiLCJhY2UvY2xpcGJvYXJkIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlKCIuL2xpYi9maXhvbGRicm93c2VycyIpO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvZG9tIikscz1lKCIuL2xpYi9sYW5nIiksbz1lKCIuL2xpYi91c2VyYWdlbnQiKSx1PWUoIi4va2V5Ym9hcmQvdGV4dGlucHV0IikuVGV4dElucHV0LGE9ZSgiLi9tb3VzZS9tb3VzZV9oYW5kbGVyIikuTW91c2VIYW5kbGVyLGY9ZSgiLi9tb3VzZS9mb2xkX2hhbmRsZXIiKS5Gb2xkSGFuZGxlcixsPWUoIi4va2V5Ym9hcmQva2V5YmluZGluZyIpLktleUJpbmRpbmcsYz1lKCIuL2VkaXRfc2Vzc2lvbiIpLkVkaXRTZXNzaW9uLGg9ZSgiLi9zZWFyY2giKS5TZWFyY2gscD1lKCIuL3JhbmdlIikuUmFuZ2UsZD1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHY9ZSgiLi9jb21tYW5kcy9jb21tYW5kX21hbmFnZXIiKS5Db21tYW5kTWFuYWdlcixtPWUoIi4vY29tbWFuZHMvZGVmYXVsdF9jb21tYW5kcyIpLmNvbW1hbmRzLGc9ZSgiLi9jb25maWciKSx5PWUoIi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yLGI9ZSgiLi9jbGlwYm9hcmQiKSx3PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmdldENvbnRhaW5lckVsZW1lbnQoKTt0aGlzLmNvbnRhaW5lcj1yLHRoaXMucmVuZGVyZXI9ZSx0aGlzLmlkPSJlZGl0b3IiKyArK3cuJHVpZCx0aGlzLmNvbW1hbmRzPW5ldyB2KG8uaXNNYWM/Im1hYyI6IndpbiIsbSksdHlwZW9mIGRvY3VtZW50PT0ib2JqZWN0IiYmKHRoaXMudGV4dElucHV0PW5ldyB1KGUuZ2V0VGV4dEFyZWFDb250YWluZXIoKSx0aGlzKSx0aGlzLnJlbmRlcmVyLnRleHRhcmVhPXRoaXMudGV4dElucHV0LmdldEVsZW1lbnQoKSx0aGlzLiRtb3VzZUhhbmRsZXI9bmV3IGEodGhpcyksbmV3IGYodGhpcykpLHRoaXMua2V5QmluZGluZz1uZXcgbCh0aGlzKSx0aGlzLiRzZWFyY2g9KG5ldyBoKS5zZXQoe3dyYXA6ITB9KSx0aGlzLiRoaXN0b3J5VHJhY2tlcj10aGlzLiRoaXN0b3J5VHJhY2tlci5iaW5kKHRoaXMpLHRoaXMuY29tbWFuZHMub24oImV4ZWMiLHRoaXMuJGhpc3RvcnlUcmFja2VyKSx0aGlzLiRpbml0T3BlcmF0aW9uTGlzdGVuZXJzKCksdGhpcy5fJGVtaXRJbnB1dEV2ZW50PXMuZGVsYXllZENhbGwoZnVuY3Rpb24oKXt0aGlzLl9zaWduYWwoImlucHV0Iix7fSksdGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24uYmdUb2tlbml6ZXImJnRoaXMuc2Vzc2lvbi5iZ1Rva2VuaXplci5zY2hlZHVsZVN0YXJ0KCl9LmJpbmQodGhpcykpLHRoaXMub24oImNoYW5nZSIsZnVuY3Rpb24oZSx0KXt0Ll8kZW1pdElucHV0RXZlbnQuc2NoZWR1bGUoMzEpfSksdGhpcy5zZXRTZXNzaW9uKHR8fG4mJm4uc2Vzc2lvbnx8bmV3IGMoIiIpKSxnLnJlc2V0T3B0aW9ucyh0aGlzKSxuJiZ0aGlzLnNldE9wdGlvbnMobiksZy5fc2lnbmFsKCJlZGl0b3IiLHRoaXMpfTt3LiR1aWQ9MCxmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMsZCksdGhpcy4kaW5pdE9wZXJhdGlvbkxpc3RlbmVycz1mdW5jdGlvbigpe3RoaXMuY29tbWFuZHMub24oImV4ZWMiLHRoaXMuc3RhcnRPcGVyYXRpb24uYmluZCh0aGlzKSwhMCksdGhpcy5jb21tYW5kcy5vbigiYWZ0ZXJFeGVjIix0aGlzLmVuZE9wZXJhdGlvbi5iaW5kKHRoaXMpLCEwKSx0aGlzLiRvcFJlc2V0VGltZXI9cy5kZWxheWVkQ2FsbCh0aGlzLmVuZE9wZXJhdGlvbi5iaW5kKHRoaXMsITApKSx0aGlzLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7dGhpcy5jdXJPcHx8KHRoaXMuc3RhcnRPcGVyYXRpb24oKSx0aGlzLmN1ck9wLnNlbGVjdGlvbkJlZm9yZT10aGlzLiRsYXN0U2VsKSx0aGlzLmN1ck9wLmRvY0NoYW5nZWQ9ITB9LmJpbmQodGhpcyksITApLHRoaXMub24oImNoYW5nZVNlbGVjdGlvbiIsZnVuY3Rpb24oKXt0aGlzLmN1ck9wfHwodGhpcy5zdGFydE9wZXJhdGlvbigpLHRoaXMuY3VyT3Auc2VsZWN0aW9uQmVmb3JlPXRoaXMuJGxhc3RTZWwpLHRoaXMuY3VyT3Auc2VsZWN0aW9uQ2hhbmdlZD0hMH0uYmluZCh0aGlzKSwhMCl9LHRoaXMuY3VyT3A9bnVsbCx0aGlzLnByZXZPcD17fSx0aGlzLnN0YXJ0T3BlcmF0aW9uPWZ1bmN0aW9uKGUpe2lmKHRoaXMuY3VyT3Ape2lmKCFlfHx0aGlzLmN1ck9wLmNvbW1hbmQpcmV0dXJuO3RoaXMucHJldk9wPXRoaXMuY3VyT3B9ZXx8KHRoaXMucHJldmlvdXNDb21tYW5kPW51bGwsZT17fSksdGhpcy4kb3BSZXNldFRpbWVyLnNjaGVkdWxlKCksdGhpcy5jdXJPcD10aGlzLnNlc3Npb24uY3VyT3A9e2NvbW1hbmQ6ZS5jb21tYW5kfHx7fSxhcmdzOmUuYXJncyxzY3JvbGxUb3A6dGhpcy5yZW5kZXJlci5zY3JvbGxUb3B9LHRoaXMuY3VyT3Auc2VsZWN0aW9uQmVmb3JlPXRoaXMuc2VsZWN0aW9uLnRvSlNPTigpfSx0aGlzLmVuZE9wZXJhdGlvbj1mdW5jdGlvbihlKXtpZih0aGlzLmN1ck9wKXtpZihlJiZlLnJldHVyblZhbHVlPT09ITEpcmV0dXJuIHRoaXMuY3VyT3A9bnVsbDtpZihlPT0xJiZ0aGlzLmN1ck9wLmNvbW1hbmQmJnRoaXMuY3VyT3AuY29tbWFuZC5uYW1lPT0ibW91c2UiKXJldHVybjt0aGlzLl9zaWduYWwoImJlZm9yZUVuZE9wZXJhdGlvbiIpO2lmKCF0aGlzLmN1ck9wKXJldHVybjt2YXIgdD10aGlzLmN1ck9wLmNvbW1hbmQsbj10JiZ0LnNjcm9sbEludG9WaWV3O2lmKG4pe3N3aXRjaChuKXtjYXNlImNlbnRlci1hbmltYXRlIjpuPSJhbmltYXRlIjtjYXNlImNlbnRlciI6dGhpcy5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyhudWxsLC41KTticmVhaztjYXNlImFuaW1hdGUiOmNhc2UiY3Vyc29yIjp0aGlzLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KCk7YnJlYWs7Y2FzZSJzZWxlY3Rpb25QYXJ0Ijp2YXIgcj10aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpLGk9dGhpcy5yZW5kZXJlci5sYXllckNvbmZpZzsoci5zdGFydC5yb3c+PWkubGFzdFJvd3x8ci5lbmQucm93PD1pLmZpcnN0Um93KSYmdGhpcy5yZW5kZXJlci5zY3JvbGxTZWxlY3Rpb25JbnRvVmlldyh0aGlzLnNlbGVjdGlvbi5hbmNob3IsdGhpcy5zZWxlY3Rpb24ubGVhZCk7YnJlYWs7ZGVmYXVsdDp9bj09ImFuaW1hdGUiJiZ0aGlzLnJlbmRlcmVyLmFuaW1hdGVTY3JvbGxpbmcodGhpcy5jdXJPcC5zY3JvbGxUb3ApfXZhciBzPXRoaXMuc2VsZWN0aW9uLnRvSlNPTigpO3RoaXMuY3VyT3Auc2VsZWN0aW9uQWZ0ZXI9cyx0aGlzLiRsYXN0U2VsPXRoaXMuc2VsZWN0aW9uLnRvSlNPTigpLHRoaXMuc2Vzc2lvbi5nZXRVbmRvTWFuYWdlcigpLmFkZFNlbGVjdGlvbihzKSx0aGlzLnByZXZPcD10aGlzLmN1ck9wLHRoaXMuY3VyT3A9bnVsbH19LHRoaXMuJG1lcmdlYWJsZUNvbW1hbmRzPVsiYmFja3NwYWNlIiwiZGVsIiwiaW5zZXJ0c3RyaW5nIl0sdGhpcy4kaGlzdG9yeVRyYWNrZXI9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuJG1lcmdlVW5kb0RlbHRhcylyZXR1cm47dmFyIHQ9dGhpcy5wcmV2T3Asbj10aGlzLiRtZXJnZWFibGVDb21tYW5kcyxyPXQuY29tbWFuZCYmZS5jb21tYW5kLm5hbWU9PXQuY29tbWFuZC5uYW1lO2lmKGUuY29tbWFuZC5uYW1lPT0iaW5zZXJ0c3RyaW5nIil7dmFyIGk9ZS5hcmdzO3RoaXMubWVyZ2VOZXh0Q29tbWFuZD09PXVuZGVmaW5lZCYmKHRoaXMubWVyZ2VOZXh0Q29tbWFuZD0hMCkscj1yJiZ0aGlzLm1lcmdlTmV4dENvbW1hbmQmJighL1xzLy50ZXN0KGkpfHwvXHMvLnRlc3QodC5hcmdzKSksdGhpcy5tZXJnZU5leHRDb21tYW5kPSEwfWVsc2Ugcj1yJiZuLmluZGV4T2YoZS5jb21tYW5kLm5hbWUpIT09LTE7dGhpcy4kbWVyZ2VVbmRvRGVsdGFzIT0iYWx3YXlzIiYmRGF0ZS5ub3coKS10aGlzLnNlcXVlbmNlU3RhcnRUaW1lPjJlMyYmKHI9ITEpLHI/dGhpcy5zZXNzaW9uLm1lcmdlVW5kb0RlbHRhcz0hMDpuLmluZGV4T2YoZS5jb21tYW5kLm5hbWUpIT09LTEmJih0aGlzLnNlcXVlbmNlU3RhcnRUaW1lPURhdGUubm93KCkpfSx0aGlzLnNldEtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbihlLHQpe2lmKGUmJnR5cGVvZiBlPT0ic3RyaW5nIiYmZSE9ImFjZSIpe3RoaXMuJGtleWJpbmRpbmdJZD1lO3ZhciBuPXRoaXM7Zy5sb2FkTW9kdWxlKFsia2V5YmluZGluZyIsZV0sZnVuY3Rpb24ocil7bi4ka2V5YmluZGluZ0lkPT1lJiZuLmtleUJpbmRpbmcuc2V0S2V5Ym9hcmRIYW5kbGVyKHImJnIuaGFuZGxlciksdCYmdCgpfSl9ZWxzZSB0aGlzLiRrZXliaW5kaW5nSWQ9bnVsbCx0aGlzLmtleUJpbmRpbmcuc2V0S2V5Ym9hcmRIYW5kbGVyKGUpLHQmJnQoKX0sdGhpcy5nZXRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rZXlCaW5kaW5nLmdldEtleWJvYXJkSGFuZGxlcigpfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oZSl7aWYodGhpcy5zZXNzaW9uPT1lKXJldHVybjt0aGlzLmN1ck9wJiZ0aGlzLmVuZE9wZXJhdGlvbigpLHRoaXMuY3VyT3A9e307dmFyIHQ9dGhpcy5zZXNzaW9uO2lmKHQpe3RoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZSIsdGhpcy4kb25Eb2N1bWVudENoYW5nZSksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlTW9kZSIsdGhpcy4kb25DaGFuZ2VNb2RlKSx0aGlzLnNlc3Npb24ub2ZmKCJ0b2tlbml6ZXJVcGRhdGUiLHRoaXMuJG9uVG9rZW5pemVyVXBkYXRlKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VUYWJTaXplIix0aGlzLiRvbkNoYW5nZVRhYlNpemUpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZVdyYXBMaW1pdCIsdGhpcy4kb25DaGFuZ2VXcmFwTGltaXQpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZVdyYXBNb2RlIix0aGlzLiRvbkNoYW5nZVdyYXBNb2RlKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VGb2xkIix0aGlzLiRvbkNoYW5nZUZvbGQpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZUZyb250TWFya2VyIix0aGlzLiRvbkNoYW5nZUZyb250TWFya2VyKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VCYWNrTWFya2VyIix0aGlzLiRvbkNoYW5nZUJhY2tNYXJrZXIpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZUJyZWFrcG9pbnQiLHRoaXMuJG9uQ2hhbmdlQnJlYWtwb2ludCksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlQW5ub3RhdGlvbiIsdGhpcy4kb25DaGFuZ2VBbm5vdGF0aW9uKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VPdmVyd3JpdGUiLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VTY3JvbGxUb3AiLHRoaXMuJG9uU2Nyb2xsVG9wQ2hhbmdlKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VTY3JvbGxMZWZ0Iix0aGlzLiRvblNjcm9sbExlZnRDaGFuZ2UpO3ZhciBuPXRoaXMuc2Vzc2lvbi5nZXRTZWxlY3Rpb24oKTtuLm9mZigiY2hhbmdlQ3Vyc29yIix0aGlzLiRvbkN1cnNvckNoYW5nZSksbi5vZmYoImNoYW5nZVNlbGVjdGlvbiIsdGhpcy4kb25TZWxlY3Rpb25DaGFuZ2UpfXRoaXMuc2Vzc2lvbj1lLGU/KHRoaXMuJG9uRG9jdW1lbnRDaGFuZ2U9dGhpcy5vbkRvY3VtZW50Q2hhbmdlLmJpbmQodGhpcyksZS5vbigiY2hhbmdlIix0aGlzLiRvbkRvY3VtZW50Q2hhbmdlKSx0aGlzLnJlbmRlcmVyLnNldFNlc3Npb24oZSksdGhpcy4kb25DaGFuZ2VNb2RlPXRoaXMub25DaGFuZ2VNb2RlLmJpbmQodGhpcyksZS5vbigiY2hhbmdlTW9kZSIsdGhpcy4kb25DaGFuZ2VNb2RlKSx0aGlzLiRvblRva2VuaXplclVwZGF0ZT10aGlzLm9uVG9rZW5pemVyVXBkYXRlLmJpbmQodGhpcyksZS5vbigidG9rZW5pemVyVXBkYXRlIix0aGlzLiRvblRva2VuaXplclVwZGF0ZSksdGhpcy4kb25DaGFuZ2VUYWJTaXplPXRoaXMucmVuZGVyZXIub25DaGFuZ2VUYWJTaXplLmJpbmQodGhpcy5yZW5kZXJlciksZS5vbigiY2hhbmdlVGFiU2l6ZSIsdGhpcy4kb25DaGFuZ2VUYWJTaXplKSx0aGlzLiRvbkNoYW5nZVdyYXBMaW1pdD10aGlzLm9uQ2hhbmdlV3JhcExpbWl0LmJpbmQodGhpcyksZS5vbigiY2hhbmdlV3JhcExpbWl0Iix0aGlzLiRvbkNoYW5nZVdyYXBMaW1pdCksdGhpcy4kb25DaGFuZ2VXcmFwTW9kZT10aGlzLm9uQ2hhbmdlV3JhcE1vZGUuYmluZCh0aGlzKSxlLm9uKCJjaGFuZ2VXcmFwTW9kZSIsdGhpcy4kb25DaGFuZ2VXcmFwTW9kZSksdGhpcy4kb25DaGFuZ2VGb2xkPXRoaXMub25DaGFuZ2VGb2xkLmJpbmQodGhpcyksZS5vbigiY2hhbmdlRm9sZCIsdGhpcy4kb25DaGFuZ2VGb2xkKSx0aGlzLiRvbkNoYW5nZUZyb250TWFya2VyPXRoaXMub25DaGFuZ2VGcm9udE1hcmtlci5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlRnJvbnRNYXJrZXIiLHRoaXMuJG9uQ2hhbmdlRnJvbnRNYXJrZXIpLHRoaXMuJG9uQ2hhbmdlQmFja01hcmtlcj10aGlzLm9uQ2hhbmdlQmFja01hcmtlci5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlQmFja01hcmtlciIsdGhpcy4kb25DaGFuZ2VCYWNrTWFya2VyKSx0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQ9dGhpcy5vbkNoYW5nZUJyZWFrcG9pbnQuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZUJyZWFrcG9pbnQiLHRoaXMuJG9uQ2hhbmdlQnJlYWtwb2ludCksdGhpcy4kb25DaGFuZ2VBbm5vdGF0aW9uPXRoaXMub25DaGFuZ2VBbm5vdGF0aW9uLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VBbm5vdGF0aW9uIix0aGlzLiRvbkNoYW5nZUFubm90YXRpb24pLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlPXRoaXMub25DdXJzb3JDaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZU92ZXJ3cml0ZSIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpLHRoaXMuJG9uU2Nyb2xsVG9wQ2hhbmdlPXRoaXMub25TY3JvbGxUb3BDaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZVNjcm9sbFRvcCIsdGhpcy4kb25TY3JvbGxUb3BDaGFuZ2UpLHRoaXMuJG9uU2Nyb2xsTGVmdENoYW5nZT10aGlzLm9uU2Nyb2xsTGVmdENoYW5nZS5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlU2Nyb2xsTGVmdCIsdGhpcy4kb25TY3JvbGxMZWZ0Q2hhbmdlKSx0aGlzLnNlbGVjdGlvbj1lLmdldFNlbGVjdGlvbigpLHRoaXMuc2VsZWN0aW9uLm9uKCJjaGFuZ2VDdXJzb3IiLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKSx0aGlzLiRvblNlbGVjdGlvbkNoYW5nZT10aGlzLm9uU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcyksdGhpcy5zZWxlY3Rpb24ub24oImNoYW5nZVNlbGVjdGlvbiIsdGhpcy4kb25TZWxlY3Rpb25DaGFuZ2UpLHRoaXMub25DaGFuZ2VNb2RlKCksdGhpcy5vbkN1cnNvckNoYW5nZSgpLHRoaXMub25TY3JvbGxUb3BDaGFuZ2UoKSx0aGlzLm9uU2Nyb2xsTGVmdENoYW5nZSgpLHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKSx0aGlzLm9uQ2hhbmdlRnJvbnRNYXJrZXIoKSx0aGlzLm9uQ2hhbmdlQmFja01hcmtlcigpLHRoaXMub25DaGFuZ2VCcmVha3BvaW50KCksdGhpcy5vbkNoYW5nZUFubm90YXRpb24oKSx0aGlzLnNlc3Npb24uZ2V0VXNlV3JhcE1vZGUoKSYmdGhpcy5yZW5kZXJlci5hZGp1c3RXcmFwTGltaXQoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKSk6KHRoaXMuc2VsZWN0aW9uPW51bGwsdGhpcy5yZW5kZXJlci5zZXRTZXNzaW9uKGUpKSx0aGlzLl9zaWduYWwoImNoYW5nZVNlc3Npb24iLHtzZXNzaW9uOmUsb2xkU2Vzc2lvbjp0fSksdGhpcy5jdXJPcD1udWxsLHQmJnQuX3NpZ25hbCgiY2hhbmdlRWRpdG9yIix7b2xkRWRpdG9yOnRoaXN9KSxlJiZlLl9zaWduYWwoImNoYW5nZUVkaXRvciIse2VkaXRvcjp0aGlzfSksZSYmZS5iZ1Rva2VuaXplciYmZS5iZ1Rva2VuaXplci5zY2hlZHVsZVN0YXJ0KCl9LHRoaXMuZ2V0U2Vzc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb259LHRoaXMuc2V0VmFsdWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zZXNzaW9uLmRvYy5zZXRWYWx1ZShlKSx0P3Q9PTE/dGhpcy5uYXZpZ2F0ZUZpbGVFbmQoKTp0PT0tMSYmdGhpcy5uYXZpZ2F0ZUZpbGVTdGFydCgpOnRoaXMuc2VsZWN0QWxsKCksZX0sdGhpcy5nZXRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0VmFsdWUoKX0sdGhpcy5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb259LHRoaXMucmVzaXplPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIub25SZXNpemUoZSl9LHRoaXMuc2V0VGhlbWU9ZnVuY3Rpb24oZSx0KXt0aGlzLnJlbmRlcmVyLnNldFRoZW1lKGUsdCl9LHRoaXMuZ2V0VGhlbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRUaGVtZSgpfSx0aGlzLnNldFN0eWxlPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2V0U3R5bGUoZSl9LHRoaXMudW5zZXRTdHlsZT1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnVuc2V0U3R5bGUoZSl9LHRoaXMuZ2V0Rm9udFNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImZvbnRTaXplIil8fGkuY29tcHV0ZWRTdHlsZSh0aGlzLmNvbnRhaW5lcikuZm9udFNpemV9LHRoaXMuc2V0Rm9udFNpemU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImZvbnRTaXplIixlKX0sdGhpcy4kaGlnaGxpZ2h0QnJhY2tldHM9ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24uJGJyYWNrZXRIaWdobGlnaHQmJih0aGlzLnNlc3Npb24ucmVtb3ZlTWFya2VyKHRoaXMuc2Vzc2lvbi4kYnJhY2tldEhpZ2hsaWdodCksdGhpcy5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0PW51bGwpO2lmKHRoaXMuJGhpZ2hsaWdodFBlbmRpbmcpcmV0dXJuO3ZhciBlPXRoaXM7dGhpcy4kaGlnaGxpZ2h0UGVuZGluZz0hMCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS4kaGlnaGxpZ2h0UGVuZGluZz0hMTt2YXIgdD1lLnNlc3Npb247aWYoIXR8fCF0LmJnVG9rZW5pemVyKXJldHVybjt2YXIgbj10LmZpbmRNYXRjaGluZ0JyYWNrZXQoZS5nZXRDdXJzb3JQb3NpdGlvbigpKTtpZihuKXZhciByPW5ldyBwKG4ucm93LG4uY29sdW1uLG4ucm93LG4uY29sdW1uKzEpO2Vsc2UgaWYodC4kbW9kZS5nZXRNYXRjaGluZyl2YXIgcj10LiRtb2RlLmdldE1hdGNoaW5nKGUuc2Vzc2lvbik7ciYmKHQuJGJyYWNrZXRIaWdobGlnaHQ9dC5hZGRNYXJrZXIociwiYWNlX2JyYWNrZXQiLCJ0ZXh0IikpfSw1MCl9LHRoaXMuJGhpZ2hsaWdodFRhZ3M9ZnVuY3Rpb24oKXtpZih0aGlzLiRoaWdobGlnaHRUYWdQZW5kaW5nKXJldHVybjt2YXIgZT10aGlzO3RoaXMuJGhpZ2hsaWdodFRhZ1BlbmRpbmc9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe2UuJGhpZ2hsaWdodFRhZ1BlbmRpbmc9ITE7dmFyIHQ9ZS5zZXNzaW9uO2lmKCF0fHwhdC5iZ1Rva2VuaXplcilyZXR1cm47dmFyIG49ZS5nZXRDdXJzb3JQb3NpdGlvbigpLHI9bmV3IHkoZS5zZXNzaW9uLG4ucm93LG4uY29sdW1uKSxpPXIuZ2V0Q3VycmVudFRva2VuKCk7aWYoIWl8fCEvXGIoPzp0YWctb3Blbnx0YWctbmFtZSkvLnRlc3QoaS50eXBlKSl7dC5yZW1vdmVNYXJrZXIodC4kdGFnSGlnaGxpZ2h0KSx0LiR0YWdIaWdobGlnaHQ9bnVsbDtyZXR1cm59aWYoaS50eXBlLmluZGV4T2YoInRhZy1vcGVuIikhPS0xKXtpPXIuc3RlcEZvcndhcmQoKTtpZighaSlyZXR1cm59dmFyIHM9aS52YWx1ZSxvPTAsdT1yLnN0ZXBCYWNrd2FyZCgpO2lmKHUudmFsdWU9PSI8Iil7ZG8gdT1pLGk9ci5zdGVwRm9yd2FyZCgpLGkmJmkudmFsdWU9PT1zJiZpLnR5cGUuaW5kZXhPZigidGFnLW5hbWUiKSE9PS0xJiYodS52YWx1ZT09PSI8Ij9vKys6dS52YWx1ZT09PSI8LyImJm8tLSk7d2hpbGUoaSYmbz49MCl9ZWxzZXtkbyBpPXUsdT1yLnN0ZXBCYWNrd2FyZCgpLGkmJmkudmFsdWU9PT1zJiZpLnR5cGUuaW5kZXhPZigidGFnLW5hbWUiKSE9PS0xJiYodS52YWx1ZT09PSI8Ij9vKys6dS52YWx1ZT09PSI8LyImJm8tLSk7d2hpbGUodSYmbzw9MCk7ci5zdGVwRm9yd2FyZCgpfWlmKCFpKXt0LnJlbW92ZU1hcmtlcih0LiR0YWdIaWdobGlnaHQpLHQuJHRhZ0hpZ2hsaWdodD1udWxsO3JldHVybn12YXIgYT1yLmdldEN1cnJlbnRUb2tlblJvdygpLGY9ci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSxsPW5ldyBwKGEsZixhLGYraS52YWx1ZS5sZW5ndGgpLGM9dC4kYmFja01hcmtlcnNbdC4kdGFnSGlnaGxpZ2h0XTt0LiR0YWdIaWdobGlnaHQmJmMhPXVuZGVmaW5lZCYmbC5jb21wYXJlUmFuZ2UoYy5yYW5nZSkhPT0wJiYodC5yZW1vdmVNYXJrZXIodC4kdGFnSGlnaGxpZ2h0KSx0LiR0YWdIaWdobGlnaHQ9bnVsbCksdC4kdGFnSGlnaGxpZ2h0fHwodC4kdGFnSGlnaGxpZ2h0PXQuYWRkTWFya2VyKGwsImFjZV9icmFja2V0IiwidGV4dCIpKX0sNTApfSx0aGlzLmZvY3VzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pc0ZvY3VzZWQoKXx8ZS50ZXh0SW5wdXQuZm9jdXMoKX0pLHRoaXMudGV4dElucHV0LmZvY3VzKCl9LHRoaXMuaXNGb2N1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dElucHV0LmlzRm9jdXNlZCgpfSx0aGlzLmJsdXI9ZnVuY3Rpb24oKXt0aGlzLnRleHRJbnB1dC5ibHVyKCl9LHRoaXMub25Gb2N1cz1mdW5jdGlvbihlKXtpZih0aGlzLiRpc0ZvY3VzZWQpcmV0dXJuO3RoaXMuJGlzRm9jdXNlZD0hMCx0aGlzLnJlbmRlcmVyLnNob3dDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnZpc3VhbGl6ZUZvY3VzKCksdGhpcy5fZW1pdCgiZm9jdXMiLGUpfSx0aGlzLm9uQmx1cj1mdW5jdGlvbihlKXtpZighdGhpcy4kaXNGb2N1c2VkKXJldHVybjt0aGlzLiRpc0ZvY3VzZWQ9ITEsdGhpcy5yZW5kZXJlci5oaWRlQ3Vyc29yKCksdGhpcy5yZW5kZXJlci52aXN1YWxpemVCbHVyKCksdGhpcy5fZW1pdCgiYmx1ciIsZSl9LHRoaXMuJGN1cnNvckNoYW5nZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCl9LHRoaXMub25Eb2N1bWVudENoYW5nZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb24uJHVzZVdyYXBNb2RlLG49ZS5zdGFydC5yb3c9PWUuZW5kLnJvdz9lLmVuZC5yb3c6SW5maW5pdHk7dGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyhlLnN0YXJ0LnJvdyxuLHQpLHRoaXMuX3NpZ25hbCgiY2hhbmdlIixlKSx0aGlzLiRjdXJzb3JDaGFuZ2UoKSx0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCl9LHRoaXMub25Ub2tlbml6ZXJVcGRhdGU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhO3RoaXMucmVuZGVyZXIudXBkYXRlTGluZXModC5maXJzdCx0Lmxhc3QpfSx0aGlzLm9uU2Nyb2xsVG9wQ2hhbmdlPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5zY3JvbGxUb1kodGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpKX0sdGhpcy5vblNjcm9sbExlZnRDaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnNjcm9sbFRvWCh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsTGVmdCgpKX0sdGhpcy5vbkN1cnNvckNoYW5nZT1mdW5jdGlvbigpe3RoaXMuJGN1cnNvckNoYW5nZSgpLHRoaXMuJGhpZ2hsaWdodEJyYWNrZXRzKCksdGhpcy4kaGlnaGxpZ2h0VGFncygpLHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKSx0aGlzLl9zaWduYWwoImNoYW5nZVNlbGVjdGlvbiIpfSx0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTZXNzaW9uKCksdDtpZih0aGlzLiRoaWdobGlnaHRBY3RpdmVMaW5lKXtpZih0aGlzLiRzZWxlY3Rpb25TdHlsZSE9ImxpbmUifHwhdGhpcy5zZWxlY3Rpb24uaXNNdWx0aUxpbmUoKSl0PXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKTt0aGlzLnJlbmRlcmVyLnRoZW1lJiZ0aGlzLnJlbmRlcmVyLnRoZW1lLiRzZWxlY3Rpb25Db2xvckNvbmZsaWN0JiYhdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiYodD0hMSksdGhpcy5yZW5kZXJlci4kbWF4TGluZXMmJnRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKT09PTEmJiEodGhpcy5yZW5kZXJlci4kbWluTGluZXM+MSkmJih0PSExKX1pZihlLiRoaWdobGlnaHRMaW5lTWFya2VyJiYhdCllLnJlbW92ZU1hcmtlcihlLiRoaWdobGlnaHRMaW5lTWFya2VyLmlkKSxlLiRoaWdobGlnaHRMaW5lTWFya2VyPW51bGw7ZWxzZSBpZighZS4kaGlnaGxpZ2h0TGluZU1hcmtlciYmdCl7dmFyIG49bmV3IHAodC5yb3csdC5jb2x1bW4sdC5yb3csSW5maW5pdHkpO24uaWQ9ZS5hZGRNYXJrZXIobiwiYWNlX2FjdGl2ZS1saW5lIiwic2NyZWVuTGluZSIpLGUuJGhpZ2hsaWdodExpbmVNYXJrZXI9bn1lbHNlIHQmJihlLiRoaWdobGlnaHRMaW5lTWFya2VyLnN0YXJ0LnJvdz10LnJvdyxlLiRoaWdobGlnaHRMaW5lTWFya2VyLmVuZC5yb3c9dC5yb3csZS4kaGlnaGxpZ2h0TGluZU1hcmtlci5zdGFydC5jb2x1bW49dC5jb2x1bW4sZS5fc2lnbmFsKCJjaGFuZ2VCYWNrTWFya2VyIikpfSx0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbjt0LiRzZWxlY3Rpb25NYXJrZXImJnQucmVtb3ZlTWFya2VyKHQuJHNlbGVjdGlvbk1hcmtlciksdC4kc2VsZWN0aW9uTWFya2VyPW51bGw7aWYoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSl7dmFyIG49dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSxyPXRoaXMuZ2V0U2VsZWN0aW9uU3R5bGUoKTt0LiRzZWxlY3Rpb25NYXJrZXI9dC5hZGRNYXJrZXIobiwiYWNlX3NlbGVjdGlvbiIscil9ZWxzZSB0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCk7dmFyIGk9dGhpcy4kaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkJiZ0aGlzLiRnZXRTZWxlY3Rpb25IaWdoTGlnaHRSZWdleHAoKTt0aGlzLnNlc3Npb24uaGlnaGxpZ2h0KGkpLHRoaXMuX3NpZ25hbCgiY2hhbmdlU2VsZWN0aW9uIil9LHRoaXMuJGdldFNlbGVjdGlvbkhpZ2hMaWdodFJlZ2V4cD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbix0PXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtpZih0LmlzRW1wdHkoKXx8dC5pc011bHRpTGluZSgpKXJldHVybjt2YXIgbj10LnN0YXJ0LmNvbHVtbixyPXQuZW5kLmNvbHVtbixpPWUuZ2V0TGluZSh0LnN0YXJ0LnJvdykscz1pLnN1YnN0cmluZyhuLHIpO2lmKHMubGVuZ3RoPjVlM3x8IS9bXHdcZF0vLnRlc3QocykpcmV0dXJuO3ZhciBvPXRoaXMuJHNlYXJjaC4kYXNzZW1ibGVSZWdFeHAoe3dob2xlV29yZDohMCxjYXNlU2Vuc2l0aXZlOiEwLG5lZWRsZTpzfSksdT1pLnN1YnN0cmluZyhuLTEscisxKTtpZighby50ZXN0KHUpKXJldHVybjtyZXR1cm4gb30sdGhpcy5vbkNoYW5nZUZyb250TWFya2VyPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVGcm9udE1hcmtlcnMoKX0sdGhpcy5vbkNoYW5nZUJhY2tNYXJrZXI9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZUJhY2tNYXJrZXJzKCl9LHRoaXMub25DaGFuZ2VCcmVha3BvaW50PWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVCcmVha3BvaW50cygpfSx0aGlzLm9uQ2hhbmdlQW5ub3RhdGlvbj1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuc2V0QW5ub3RhdGlvbnModGhpcy5zZXNzaW9uLmdldEFubm90YXRpb25zKCkpfSx0aGlzLm9uQ2hhbmdlTW9kZT1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZVRleHQoKSx0aGlzLl9lbWl0KCJjaGFuZ2VNb2RlIixlKX0sdGhpcy5vbkNoYW5nZVdyYXBMaW1pdD1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlRnVsbCgpfSx0aGlzLm9uQ2hhbmdlV3JhcE1vZGU9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLm9uUmVzaXplKCEwKX0sdGhpcy5vbkNoYW5nZUZvbGQ9ZnVuY3Rpb24oKXt0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCksdGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCl9LHRoaXMuZ2V0U2VsZWN0ZWRUZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKX0sdGhpcy5nZXRDb3B5VGV4dD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0U2VsZWN0ZWRUZXh0KCksdD10aGlzLnNlc3Npb24uZG9jLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSxuPSExO2lmKCFlJiZ0aGlzLiRjb3B5V2l0aEVtcHR5U2VsZWN0aW9uKXtuPSEwO3ZhciByPXRoaXMuc2VsZWN0aW9uLmdldEFsbFJhbmdlcygpO2Zvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgcz1yW2ldO2lmKGkmJnJbaS0xXS5zdGFydC5yb3c9PXMuc3RhcnQucm93KWNvbnRpbnVlO2UrPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKHMuc3RhcnQucm93KSt0fX12YXIgbz17dGV4dDplfTtyZXR1cm4gdGhpcy5fc2lnbmFsKCJjb3B5IixvKSxiLmxpbmVNb2RlPW4/by50ZXh0OiIiLG8udGV4dH0sdGhpcy5vbkNvcHk9ZnVuY3Rpb24oKXt0aGlzLmNvbW1hbmRzLmV4ZWMoImNvcHkiLHRoaXMpfSx0aGlzLm9uQ3V0PWZ1bmN0aW9uKCl7dGhpcy5jb21tYW5kcy5leGVjKCJjdXQiLHRoaXMpfSx0aGlzLm9uUGFzdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj17dGV4dDplLGV2ZW50OnR9O3RoaXMuY29tbWFuZHMuZXhlYygicGFzdGUiLHRoaXMsbil9LHRoaXMuJGhhbmRsZVBhc3RlPWZ1bmN0aW9uKGUpe3R5cGVvZiBlPT0ic3RyaW5nIiYmKGU9e3RleHQ6ZX0pLHRoaXMuX3NpZ25hbCgicGFzdGUiLGUpO3ZhciB0PWUudGV4dCxuPXQ9PWIubGluZU1vZGUscj10aGlzLnNlc3Npb247aWYoIXRoaXMuaW5NdWx0aVNlbGVjdE1vZGV8fHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZSluP3IuaW5zZXJ0KHtyb3c6dGhpcy5zZWxlY3Rpb24ubGVhZC5yb3csY29sdW1uOjB9LHQpOnRoaXMuaW5zZXJ0KHQpO2Vsc2UgaWYobil0aGlzLnNlbGVjdGlvbi5yYW5nZUxpc3QucmFuZ2VzLmZvckVhY2goZnVuY3Rpb24oZSl7ci5pbnNlcnQoe3JvdzplLnN0YXJ0LnJvdyxjb2x1bW46MH0sdCl9KTtlbHNle3ZhciBpPXQuc3BsaXQoL1xyXG58XHJ8XG4vKSxzPXRoaXMuc2VsZWN0aW9uLnJhbmdlTGlzdC5yYW5nZXMsbz1pLmxlbmd0aD09MiYmKCFpWzBdfHwhaVsxXSk7aWYoaS5sZW5ndGghPXMubGVuZ3RofHxvKXJldHVybiB0aGlzLmNvbW1hbmRzLmV4ZWMoImluc2VydHN0cmluZyIsdGhpcyx0KTtmb3IodmFyIHU9cy5sZW5ndGg7dS0tOyl7dmFyIGE9c1t1XTthLmlzRW1wdHkoKXx8ci5yZW1vdmUoYSksci5pbnNlcnQoYS5zdGFydCxpW3VdKX19fSx0aGlzLmV4ZWNDb21tYW5kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuY29tbWFuZHMuZXhlYyhlLHRoaXMsdCl9LHRoaXMuaW5zZXJ0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zZXNzaW9uLHI9bi5nZXRNb2RlKCksaT10aGlzLmdldEN1cnNvclBvc2l0aW9uKCk7aWYodGhpcy5nZXRCZWhhdmlvdXJzRW5hYmxlZCgpJiYhdCl7dmFyIHM9ci50cmFuc2Zvcm1BY3Rpb24obi5nZXRTdGF0ZShpLnJvdyksImluc2VydGlvbiIsdGhpcyxuLGUpO3MmJihlIT09cy50ZXh0JiYodGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlfHwodGhpcy5zZXNzaW9uLm1lcmdlVW5kb0RlbHRhcz0hMSx0aGlzLm1lcmdlTmV4dENvbW1hbmQ9ITEpKSxlPXMudGV4dCl9ZT09IgkiJiYoZT10aGlzLnNlc3Npb24uZ2V0VGFiU3RyaW5nKCkpO2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpe3ZhciBvPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtpPXRoaXMuc2Vzc2lvbi5yZW1vdmUobyksdGhpcy5jbGVhclNlbGVjdGlvbigpfWVsc2UgaWYodGhpcy5zZXNzaW9uLmdldE92ZXJ3cml0ZSgpJiZlLmluZGV4T2YoIlxuIik9PS0xKXt2YXIgbz1uZXcgcC5mcm9tUG9pbnRzKGksaSk7by5lbmQuY29sdW1uKz1lLmxlbmd0aCx0aGlzLnNlc3Npb24ucmVtb3ZlKG8pfWlmKGU9PSJcbiJ8fGU9PSJcclxuIil7dmFyIHU9bi5nZXRMaW5lKGkucm93KTtpZihpLmNvbHVtbj51LnNlYXJjaCgvXFN8JC8pKXt2YXIgYT11LnN1YnN0cihpLmNvbHVtbikuc2VhcmNoKC9cU3wkLyk7bi5kb2MucmVtb3ZlSW5MaW5lKGkucm93LGkuY29sdW1uLGkuY29sdW1uK2EpfX10aGlzLmNsZWFyU2VsZWN0aW9uKCk7dmFyIGY9aS5jb2x1bW4sbD1uLmdldFN0YXRlKGkucm93KSx1PW4uZ2V0TGluZShpLnJvdyksYz1yLmNoZWNrT3V0ZGVudChsLHUsZSk7bi5pbnNlcnQoaSxlKSxzJiZzLnNlbGVjdGlvbiYmKHMuc2VsZWN0aW9uLmxlbmd0aD09Mj90aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShuZXcgcChpLnJvdyxmK3Muc2VsZWN0aW9uWzBdLGkucm93LGYrcy5zZWxlY3Rpb25bMV0pKTp0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShuZXcgcChpLnJvdytzLnNlbGVjdGlvblswXSxzLnNlbGVjdGlvblsxXSxpLnJvdytzLnNlbGVjdGlvblsyXSxzLnNlbGVjdGlvblszXSkpKTtpZihuLmdldERvY3VtZW50KCkuaXNOZXdMaW5lKGUpKXt2YXIgaD1yLmdldE5leHRMaW5lSW5kZW50KGwsdS5zbGljZSgwLGkuY29sdW1uKSxuLmdldFRhYlN0cmluZygpKTtuLmluc2VydCh7cm93Omkucm93KzEsY29sdW1uOjB9LGgpfWMmJnIuYXV0b091dGRlbnQobCxuLGkucm93KX0sdGhpcy5vblRleHRJbnB1dD1mdW5jdGlvbihlLHQpe2lmKCF0KXJldHVybiB0aGlzLmtleUJpbmRpbmcub25UZXh0SW5wdXQoZSk7dGhpcy5zdGFydE9wZXJhdGlvbih7Y29tbWFuZDp7bmFtZToiaW5zZXJ0c3RyaW5nIn19KTt2YXIgbj10aGlzLmFwcGx5Q29tcG9zaXRpb24uYmluZCh0aGlzLGUsdCk7dGhpcy5zZWxlY3Rpb24ucmFuZ2VDb3VudD90aGlzLmZvckVhY2hTZWxlY3Rpb24obik6bigpLHRoaXMuZW5kT3BlcmF0aW9uKCl9LHRoaXMuYXBwbHlDb21wb3NpdGlvbj1mdW5jdGlvbihlLHQpe2lmKHQuZXh0ZW5kTGVmdHx8dC5leHRlbmRSaWdodCl7dmFyIG49dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTtuLnN0YXJ0LmNvbHVtbi09dC5leHRlbmRMZWZ0LG4uZW5kLmNvbHVtbis9dC5leHRlbmRSaWdodCx0aGlzLnNlbGVjdGlvbi5zZXRSYW5nZShuKSwhZSYmIW4uaXNFbXB0eSgpJiZ0aGlzLnJlbW92ZSgpfShlfHwhdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKSYmdGhpcy5pbnNlcnQoZSwhMCk7aWYodC5yZXN0b3JlU3RhcnR8fHQucmVzdG9yZUVuZCl7dmFyIG49dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTtuLnN0YXJ0LmNvbHVtbi09dC5yZXN0b3JlU3RhcnQsbi5lbmQuY29sdW1uLT10LnJlc3RvcmVFbmQsdGhpcy5zZWxlY3Rpb24uc2V0UmFuZ2Uobil9fSx0aGlzLm9uQ29tbWFuZEtleT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMua2V5QmluZGluZy5vbkNvbW1hbmRLZXkoZSx0LG4pfSx0aGlzLnNldE92ZXJ3cml0ZT1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb24uc2V0T3ZlcndyaXRlKGUpfSx0aGlzLmdldE92ZXJ3cml0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCl9LHRoaXMudG9nZ2xlT3ZlcndyaXRlPWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLnRvZ2dsZU92ZXJ3cml0ZSgpfSx0aGlzLnNldFNjcm9sbFNwZWVkPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJzY3JvbGxTcGVlZCIsZSl9LHRoaXMuZ2V0U2Nyb2xsU3BlZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInNjcm9sbFNwZWVkIil9LHRoaXMuc2V0RHJhZ0RlbGF5PWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJkcmFnRGVsYXkiLGUpfSx0aGlzLmdldERyYWdEZWxheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiZHJhZ0RlbGF5Iil9LHRoaXMuc2V0U2VsZWN0aW9uU3R5bGU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInNlbGVjdGlvblN0eWxlIixlKX0sdGhpcy5nZXRTZWxlY3Rpb25TdHlsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigic2VsZWN0aW9uU3R5bGUiKX0sdGhpcy5zZXRIaWdobGlnaHRBY3RpdmVMaW5lPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJoaWdobGlnaHRBY3RpdmVMaW5lIixlKX0sdGhpcy5nZXRIaWdobGlnaHRBY3RpdmVMaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJoaWdobGlnaHRBY3RpdmVMaW5lIil9LHRoaXMuc2V0SGlnaGxpZ2h0R3V0dGVyTGluZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiaGlnaGxpZ2h0R3V0dGVyTGluZSIsZSl9LHRoaXMuZ2V0SGlnaGxpZ2h0R3V0dGVyTGluZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiaGlnaGxpZ2h0R3V0dGVyTGluZSIpfSx0aGlzLnNldEhpZ2hsaWdodFNlbGVjdGVkV29yZD1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkIixlKX0sdGhpcy5nZXRIaWdobGlnaHRTZWxlY3RlZFdvcmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaGlnaGxpZ2h0U2VsZWN0ZWRXb3JkfSx0aGlzLnNldEFuaW1hdGVkU2Nyb2xsPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2V0QW5pbWF0ZWRTY3JvbGwoZSl9LHRoaXMuZ2V0QW5pbWF0ZWRTY3JvbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRBbmltYXRlZFNjcm9sbCgpfSx0aGlzLnNldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2V0U2hvd0ludmlzaWJsZXMoZSl9LHRoaXMuZ2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRTaG93SW52aXNpYmxlcygpfSx0aGlzLnNldERpc3BsYXlJbmRlbnRHdWlkZXM9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zZXREaXNwbGF5SW5kZW50R3VpZGVzKGUpfSx0aGlzLmdldERpc3BsYXlJbmRlbnRHdWlkZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXREaXNwbGF5SW5kZW50R3VpZGVzKCl9LHRoaXMuc2V0U2hvd1ByaW50TWFyZ2luPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2V0U2hvd1ByaW50TWFyZ2luKGUpfSx0aGlzLmdldFNob3dQcmludE1hcmdpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldFNob3dQcmludE1hcmdpbigpfSx0aGlzLnNldFByaW50TWFyZ2luQ29sdW1uPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2V0UHJpbnRNYXJnaW5Db2x1bW4oZSl9LHRoaXMuZ2V0UHJpbnRNYXJnaW5Db2x1bW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRQcmludE1hcmdpbkNvbHVtbigpfSx0aGlzLnNldFJlYWRPbmx5PWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJyZWFkT25seSIsZSl9LHRoaXMuZ2V0UmVhZE9ubHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInJlYWRPbmx5Iil9LHRoaXMuc2V0QmVoYXZpb3Vyc0VuYWJsZWQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImJlaGF2aW91cnNFbmFibGVkIixlKX0sdGhpcy5nZXRCZWhhdmlvdXJzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiYmVoYXZpb3Vyc0VuYWJsZWQiKX0sdGhpcy5zZXRXcmFwQmVoYXZpb3Vyc0VuYWJsZWQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oIndyYXBCZWhhdmlvdXJzRW5hYmxlZCIsZSl9LHRoaXMuZ2V0V3JhcEJlaGF2aW91cnNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJ3cmFwQmVoYXZpb3Vyc0VuYWJsZWQiKX0sdGhpcy5zZXRTaG93Rm9sZFdpZGdldHM9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInNob3dGb2xkV2lkZ2V0cyIsZSl9LHRoaXMuZ2V0U2hvd0ZvbGRXaWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJzaG93Rm9sZFdpZGdldHMiKX0sdGhpcy5zZXRGYWRlRm9sZFdpZGdldHM9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImZhZGVGb2xkV2lkZ2V0cyIsZSl9LHRoaXMuZ2V0RmFkZUZvbGRXaWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJmYWRlRm9sZFdpZGdldHMiKX0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oZSl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiYoZT09ImxlZnQiP3RoaXMuc2VsZWN0aW9uLnNlbGVjdExlZnQoKTp0aGlzLnNlbGVjdGlvbi5zZWxlY3RSaWdodCgpKTt2YXIgdD10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7aWYodGhpcy5nZXRCZWhhdmlvdXJzRW5hYmxlZCgpKXt2YXIgbj10aGlzLnNlc3Npb24scj1uLmdldFN0YXRlKHQuc3RhcnQucm93KSxpPW4uZ2V0TW9kZSgpLnRyYW5zZm9ybUFjdGlvbihyLCJkZWxldGlvbiIsdGhpcyxuLHQpO2lmKHQuZW5kLmNvbHVtbj09PTApe3ZhciBzPW4uZ2V0VGV4dFJhbmdlKHQpO2lmKHNbcy5sZW5ndGgtMV09PSJcbiIpe3ZhciBvPW4uZ2V0TGluZSh0LmVuZC5yb3cpOy9eXHMrJC8udGVzdChvKSYmKHQuZW5kLmNvbHVtbj1vLmxlbmd0aCl9fWkmJih0PWkpfXRoaXMuc2Vzc2lvbi5yZW1vdmUodCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnJlbW92ZVdvcmRSaWdodD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZFJpZ2h0KCksdGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5yZW1vdmVXb3JkTGVmdD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZExlZnQoKSx0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnJlbW92ZVRvTGluZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RMaW5lU3RhcnQoKSx0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdExlZnQoKSx0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnJlbW92ZVRvTGluZUVuZD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0TGluZUVuZCgpO3ZhciBlPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtlLnN0YXJ0LmNvbHVtbj09ZS5lbmQuY29sdW1uJiZlLnN0YXJ0LnJvdz09ZS5lbmQucm93JiYoZS5lbmQuY29sdW1uPTAsZS5lbmQucm93KyspLHRoaXMuc2Vzc2lvbi5yZW1vdmUoZSksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnNwbGl0TGluZT1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKXx8KHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCkpO3ZhciBlPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKTt0aGlzLmluc2VydCgiXG4iKSx0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGUpfSx0aGlzLnRyYW5zcG9zZUxldHRlcnM9ZnVuY3Rpb24oKXtpZighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKXJldHVybjt2YXIgZT10aGlzLmdldEN1cnNvclBvc2l0aW9uKCksdD1lLmNvbHVtbjtpZih0PT09MClyZXR1cm47dmFyIG49dGhpcy5zZXNzaW9uLmdldExpbmUoZS5yb3cpLHIsaTt0PG4ubGVuZ3RoPyhyPW4uY2hhckF0KHQpK24uY2hhckF0KHQtMSksaT1uZXcgcChlLnJvdyx0LTEsZS5yb3csdCsxKSk6KHI9bi5jaGFyQXQodC0xKStuLmNoYXJBdCh0LTIpLGk9bmV3IHAoZS5yb3csdC0yLGUucm93LHQpKSx0aGlzLnNlc3Npb24ucmVwbGFjZShpLHIpLHRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24oaS5lbmQpfSx0aGlzLnRvTG93ZXJDYXNlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZCgpO3ZhciB0PXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxuPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UodCk7dGhpcy5zZXNzaW9uLnJlcGxhY2UodCxuLnRvTG93ZXJDYXNlKCkpLHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGUpfSx0aGlzLnRvVXBwZXJDYXNlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZCgpO3ZhciB0PXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxuPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UodCk7dGhpcy5zZXNzaW9uLnJlcGxhY2UodCxuLnRvVXBwZXJDYXNlKCkpLHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGUpfSx0aGlzLmluZGVudD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbix0PXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtpZih0LnN0YXJ0LnJvdzx0LmVuZC5yb3cpe3ZhciBuPXRoaXMuJGdldFNlbGVjdGVkUm93cygpO2UuaW5kZW50Um93cyhuLmZpcnN0LG4ubGFzdCwiCSIpO3JldHVybn1pZih0LnN0YXJ0LmNvbHVtbjx0LmVuZC5jb2x1bW4pe3ZhciByPWUuZ2V0VGV4dFJhbmdlKHQpO2lmKCEvXlxzKyQvLnRlc3Qocikpe3ZhciBuPXRoaXMuJGdldFNlbGVjdGVkUm93cygpO2UuaW5kZW50Um93cyhuLmZpcnN0LG4ubGFzdCwiCSIpO3JldHVybn19dmFyIGk9ZS5nZXRMaW5lKHQuc3RhcnQucm93KSxvPXQuc3RhcnQsdT1lLmdldFRhYlNpemUoKSxhPWUuZG9jdW1lbnRUb1NjcmVlbkNvbHVtbihvLnJvdyxvLmNvbHVtbik7aWYodGhpcy5zZXNzaW9uLmdldFVzZVNvZnRUYWJzKCkpdmFyIGY9dS1hJXUsbD1zLnN0cmluZ1JlcGVhdCgiICIsZik7ZWxzZXt2YXIgZj1hJXU7d2hpbGUoaVt0LnN0YXJ0LmNvbHVtbi0xXT09IiAiJiZmKXQuc3RhcnQuY29sdW1uLS0sZi0tO3RoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKHQpLGw9IgkifXJldHVybiB0aGlzLmluc2VydChsKX0sdGhpcy5ibG9ja0luZGVudD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJGdldFNlbGVjdGVkUm93cygpO3RoaXMuc2Vzc2lvbi5pbmRlbnRSb3dzKGUuZmlyc3QsZS5sYXN0LCIJIil9LHRoaXMuYmxvY2tPdXRkZW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLmdldFNlbGVjdGlvbigpO3RoaXMuc2Vzc2lvbi5vdXRkZW50Um93cyhlLmdldFJhbmdlKCkpfSx0aGlzLnNvcnRMaW5lcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJGdldFNlbGVjdGVkUm93cygpLHQ9dGhpcy5zZXNzaW9uLG49W107Zm9yKHZhciByPWUuZmlyc3Q7cjw9ZS5sYXN0O3IrKyluLnB1c2godC5nZXRMaW5lKHIpKTtuLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS50b0xvd2VyQ2FzZSgpPHQudG9Mb3dlckNhc2UoKT8tMTplLnRvTG93ZXJDYXNlKCk+dC50b0xvd2VyQ2FzZSgpPzE6MH0pO3ZhciBpPW5ldyBwKDAsMCwwLDApO2Zvcih2YXIgcj1lLmZpcnN0O3I8PWUubGFzdDtyKyspe3ZhciBzPXQuZ2V0TGluZShyKTtpLnN0YXJ0LnJvdz1yLGkuZW5kLnJvdz1yLGkuZW5kLmNvbHVtbj1zLmxlbmd0aCx0LnJlcGxhY2UoaSxuW3ItZS5maXJzdF0pfX0sdGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24uZ2V0U3RhdGUodGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLnJvdyksdD10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTt0aGlzLnNlc3Npb24uZ2V0TW9kZSgpLnRvZ2dsZUNvbW1lbnRMaW5lcyhlLHRoaXMuc2Vzc2lvbix0LmZpcnN0LHQubGFzdCl9LHRoaXMudG9nZ2xlQmxvY2tDb21tZW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLHQ9dGhpcy5zZXNzaW9uLmdldFN0YXRlKGUucm93KSxuPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTt0aGlzLnNlc3Npb24uZ2V0TW9kZSgpLnRvZ2dsZUJsb2NrQ29tbWVudCh0LHRoaXMuc2Vzc2lvbixuLGUpfSx0aGlzLmdldE51bWJlckF0PWZ1bmN0aW9uKGUsdCl7dmFyIG49L1tcLV0/WzAtOV0rKD86XC5bMC05XSspPy9nO24ubGFzdEluZGV4PTA7dmFyIHI9dGhpcy5zZXNzaW9uLmdldExpbmUoZSk7d2hpbGUobi5sYXN0SW5kZXg8dCl7dmFyIGk9bi5leGVjKHIpO2lmKGkuaW5kZXg8PXQmJmkuaW5kZXgraVswXS5sZW5ndGg+PXQpe3ZhciBzPXt2YWx1ZTppWzBdLHN0YXJ0OmkuaW5kZXgsZW5kOmkuaW5kZXgraVswXS5sZW5ndGh9O3JldHVybiBzfX1yZXR1cm4gbnVsbH0sdGhpcy5tb2RpZnlOdW1iZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCkucm93LG49dGhpcy5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCkuY29sdW1uLHI9bmV3IHAodCxuLTEsdCxuKSxpPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2Uocik7aWYoIWlzTmFOKHBhcnNlRmxvYXQoaSkpJiZpc0Zpbml0ZShpKSl7dmFyIHM9dGhpcy5nZXROdW1iZXJBdCh0LG4pO2lmKHMpe3ZhciBvPXMudmFsdWUuaW5kZXhPZigiLiIpPj0wP3Muc3RhcnQrcy52YWx1ZS5pbmRleE9mKCIuIikrMTpzLmVuZCx1PXMuc3RhcnQrcy52YWx1ZS5sZW5ndGgtbyxhPXBhcnNlRmxvYXQocy52YWx1ZSk7YSo9TWF0aC5wb3coMTAsdSksbyE9PXMuZW5kJiZuPG8/ZSo9TWF0aC5wb3coMTAscy5lbmQtbi0xKTplKj1NYXRoLnBvdygxMCxzLmVuZC1uKSxhKz1lLGEvPU1hdGgucG93KDEwLHUpO3ZhciBmPWEudG9GaXhlZCh1KSxsPW5ldyBwKHQscy5zdGFydCx0LHMuZW5kKTt0aGlzLnNlc3Npb24ucmVwbGFjZShsLGYpLHRoaXMubW92ZUN1cnNvclRvKHQsTWF0aC5tYXgocy5zdGFydCsxLG4rZi5sZW5ndGgtcy52YWx1ZS5sZW5ndGgpKX19ZWxzZSB0aGlzLnRvZ2dsZVdvcmQoKX0sdGhpcy4kdG9nZ2xlV29yZFBhaXJzPVtbImZpcnN0IiwibGFzdCJdLFsidHJ1ZSIsImZhbHNlIl0sWyJ5ZXMiLCJubyJdLFsid2lkdGgiLCJoZWlnaHQiXSxbInRvcCIsImJvdHRvbSJdLFsicmlnaHQiLCJsZWZ0Il0sWyJvbiIsIm9mZiJdLFsieCIsInkiXSxbImdldCIsInNldCJdLFsibWF4IiwibWluIl0sWyJob3Jpem9udGFsIiwidmVydGljYWwiXSxbInNob3ciLCJoaWRlIl0sWyJhZGQiLCJyZW1vdmUiXSxbInVwIiwiZG93biJdLFsiYmVmb3JlIiwiYWZ0ZXIiXSxbImV2ZW4iLCJvZGQiXSxbImluc2lkZSIsIm91dHNpZGUiXSxbIm5leHQiLCJwcmV2aW91cyJdLFsiaW5jcmVhc2UiLCJkZWNyZWFzZSJdLFsiYXR0YWNoIiwiZGV0YWNoIl0sWyImJiIsInx8Il0sWyI9PSIsIiE9Il1dLHRoaXMudG9nZ2xlV29yZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2VsZWN0aW9uLmdldEN1cnNvcigpLnJvdyx0PXRoaXMuc2VsZWN0aW9uLmdldEN1cnNvcigpLmNvbHVtbjt0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk7dmFyIG49dGhpcy5nZXRTZWxlY3RlZFRleHQoKSxyPXRoaXMuc2VsZWN0aW9uLmdldFdvcmRSYW5nZSgpLnN0YXJ0LmNvbHVtbixpPW4ucmVwbGFjZSgvKFthLXpdK3xbQS1aXSspKD89W0EtWl9dfCQpL2csIiQxICIpLnNwbGl0KC9ccy8pLG89dC1yLTE7bzwwJiYobz0wKTt2YXIgdT0wLGE9MCxmPXRoaXM7bi5tYXRjaCgvW0EtWmEtejAtOV9dKy8pJiZpLmZvckVhY2goZnVuY3Rpb24odCxpKXthPXUrdC5sZW5ndGgsbz49dSYmbzw9YSYmKG49dCxmLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpLGYubW92ZUN1cnNvclRvKGUsdStyKSxmLnNlbGVjdGlvbi5zZWxlY3RUbyhlLGErcikpLHU9YX0pO3ZhciBsPXRoaXMuJHRvZ2dsZVdvcmRQYWlycyxjO2Zvcih2YXIgaD0wO2g8bC5sZW5ndGg7aCsrKXt2YXIgcD1sW2hdO2Zvcih2YXIgZD0wO2Q8PTE7ZCsrKXt2YXIgdj0rIWQsbT1uLm1hdGNoKG5ldyBSZWdFeHAoIl5cXHM/Xz8oIitzLmVzY2FwZVJlZ0V4cChwW2RdKSsiKVxccz8kIiwiaSIpKTtpZihtKXt2YXIgZz1uLm1hdGNoKG5ldyBSZWdFeHAoIihbX118XnxcXHMpKCIrcy5lc2NhcGVSZWdFeHAobVsxXSkrIikoJHxcXHMpIiwiZyIpKTtnJiYoYz1uLnJlcGxhY2UobmV3IFJlZ0V4cChzLmVzY2FwZVJlZ0V4cChwW2RdKSwiaSIpLGZ1bmN0aW9uKGUpe3ZhciB0PXBbdl07cmV0dXJuIGUudG9VcHBlckNhc2UoKT09ZT90PXQudG9VcHBlckNhc2UoKTplLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpPT1lLmNoYXJBdCgwKSYmKHQ9dC5zdWJzdHIoMCwwKStwW3ZdLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpKSx0fSksdGhpcy5pbnNlcnQoYyksYz0iIil9fX19LHRoaXMucmVtb3ZlTGluZXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTt0aGlzLnNlc3Npb24ucmVtb3ZlRnVsbExpbmVzKGUuZmlyc3QsZS5sYXN0KSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMuZHVwbGljYXRlU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZWxlY3Rpb24sdD10aGlzLnNlc3Npb24sbj1lLmdldFJhbmdlKCkscj1lLmlzQmFja3dhcmRzKCk7aWYobi5pc0VtcHR5KCkpe3ZhciBpPW4uc3RhcnQucm93O3QuZHVwbGljYXRlTGluZXMoaSxpKX1lbHNle3ZhciBzPXI/bi5zdGFydDpuLmVuZCxvPXQuaW5zZXJ0KHMsdC5nZXRUZXh0UmFuZ2UobiksITEpO24uc3RhcnQ9cyxuLmVuZD1vLGUuc2V0U2VsZWN0aW9uUmFuZ2UobixyKX19LHRoaXMubW92ZUxpbmVzRG93bj1mdW5jdGlvbigpe3RoaXMuJG1vdmVMaW5lcygxLCExKX0sdGhpcy5tb3ZlTGluZXNVcD1mdW5jdGlvbigpe3RoaXMuJG1vdmVMaW5lcygtMSwhMSl9LHRoaXMubW92ZVRleHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLnNlc3Npb24ubW92ZVRleHQoZSx0LG4pfSx0aGlzLmNvcHlMaW5lc1VwPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUxpbmVzKC0xLCEwKX0sdGhpcy5jb3B5TGluZXNEb3duPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUxpbmVzKDEsITApfSx0aGlzLiRtb3ZlTGluZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9dGhpcy5zZWxlY3Rpb247aWYoIWkuaW5NdWx0aVNlbGVjdE1vZGV8fHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZSl7dmFyIHM9aS50b09yaWVudGVkUmFuZ2UoKTtuPXRoaXMuJGdldFNlbGVjdGVkUm93cyhzKSxyPXRoaXMuc2Vzc2lvbi4kbW92ZUxpbmVzKG4uZmlyc3Qsbi5sYXN0LHQ/MDplKSx0JiZlPT0tMSYmKHI9MCkscy5tb3ZlQnkociwwKSxpLmZyb21PcmllbnRlZFJhbmdlKHMpfWVsc2V7dmFyIG89aS5yYW5nZUxpc3QucmFuZ2VzO2kucmFuZ2VMaXN0LmRldGFjaCh0aGlzLnNlc3Npb24pLHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMDt2YXIgdT0wLGE9MCxmPW8ubGVuZ3RoO2Zvcih2YXIgbD0wO2w8ZjtsKyspe3ZhciBjPWw7b1tsXS5tb3ZlQnkodSwwKSxuPXRoaXMuJGdldFNlbGVjdGVkUm93cyhvW2xdKTt2YXIgaD1uLmZpcnN0LHA9bi5sYXN0O3doaWxlKCsrbDxmKXthJiZvW2xdLm1vdmVCeShhLDApO3ZhciBkPXRoaXMuJGdldFNlbGVjdGVkUm93cyhvW2xdKTtpZih0JiZkLmZpcnN0IT1wKWJyZWFrO2lmKCF0JiZkLmZpcnN0PnArMSlicmVhaztwPWQubGFzdH1sLS0sdT10aGlzLnNlc3Npb24uJG1vdmVMaW5lcyhoLHAsdD8wOmUpLHQmJmU9PS0xJiYoYz1sKzEpO3doaWxlKGM8PWwpb1tjXS5tb3ZlQnkodSwwKSxjKys7dHx8KHU9MCksYSs9dX1pLmZyb21PcmllbnRlZFJhbmdlKGkucmFuZ2VzWzBdKSxpLnJhbmdlTGlzdC5hdHRhY2godGhpcy5zZXNzaW9uKSx0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITF9fSx0aGlzLiRnZXRTZWxlY3RlZFJvd3M9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9KGV8fHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSkuY29sbGFwc2VSb3dzKCkse2ZpcnN0OnRoaXMuc2Vzc2lvbi5nZXRSb3dGb2xkU3RhcnQoZS5zdGFydC5yb3cpLGxhc3Q6dGhpcy5zZXNzaW9uLmdldFJvd0ZvbGRFbmQoZS5lbmQucm93KX19LHRoaXMub25Db21wb3NpdGlvblN0YXJ0PWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2hvd0NvbXBvc2l0aW9uKGUpfSx0aGlzLm9uQ29tcG9zaXRpb25VcGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zZXRDb21wb3NpdGlvblRleHQoZSl9LHRoaXMub25Db21wb3NpdGlvbkVuZD1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuaGlkZUNvbXBvc2l0aW9uKCl9LHRoaXMuZ2V0Rmlyc3RWaXNpYmxlUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0Rmlyc3RWaXNpYmxlUm93KCl9LHRoaXMuZ2V0TGFzdFZpc2libGVSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRMYXN0VmlzaWJsZVJvdygpfSx0aGlzLmlzUm93VmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4gZT49dGhpcy5nZXRGaXJzdFZpc2libGVSb3coKSYmZTw9dGhpcy5nZXRMYXN0VmlzaWJsZVJvdygpfSx0aGlzLmlzUm93RnVsbHlWaXNpYmxlPWZ1bmN0aW9uKGUpe3JldHVybiBlPj10aGlzLnJlbmRlcmVyLmdldEZpcnN0RnVsbHlWaXNpYmxlUm93KCkmJmU8PXRoaXMucmVuZGVyZXIuZ2V0TGFzdEZ1bGx5VmlzaWJsZVJvdygpfSx0aGlzLiRnZXRWaXNpYmxlUm93Q291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxCb3R0b21Sb3coKS10aGlzLnJlbmRlcmVyLmdldFNjcm9sbFRvcFJvdygpKzF9LHRoaXMuJG1vdmVCeVBhZ2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnJlbmRlcmVyLHI9dGhpcy5yZW5kZXJlci5sYXllckNvbmZpZyxpPWUqTWF0aC5mbG9vcihyLmhlaWdodC9yLmxpbmVIZWlnaHQpO3Q9PT0hMD90aGlzLnNlbGVjdGlvbi4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvckJ5KGksMCl9KTp0PT09ITEmJih0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yQnkoaSwwKSx0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpKTt2YXIgcz1uLnNjcm9sbFRvcDtuLnNjcm9sbEJ5KDAsaSpyLmxpbmVIZWlnaHQpLHQhPW51bGwmJm4uc2Nyb2xsQ3Vyc29ySW50b1ZpZXcobnVsbCwuNSksbi5hbmltYXRlU2Nyb2xsaW5nKHMpfSx0aGlzLnNlbGVjdFBhZ2VEb3duPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUJ5UGFnZSgxLCEwKX0sdGhpcy5zZWxlY3RQYWdlVXA9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlQnlQYWdlKC0xLCEwKX0sdGhpcy5nb3RvUGFnZURvd249ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlQnlQYWdlKDEsITEpfSx0aGlzLmdvdG9QYWdlVXA9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlQnlQYWdlKC0xLCExKX0sdGhpcy5zY3JvbGxQYWdlRG93bj1mdW5jdGlvbigpe3RoaXMuJG1vdmVCeVBhZ2UoMSl9LHRoaXMuc2Nyb2xsUGFnZVVwPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUJ5UGFnZSgtMSl9LHRoaXMuc2Nyb2xsVG9Sb3c9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zY3JvbGxUb1JvdyhlKX0sdGhpcy5zY3JvbGxUb0xpbmU9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5yZW5kZXJlci5zY3JvbGxUb0xpbmUoZSx0LG4scil9LHRoaXMuY2VudGVyU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLHQ9e3JvdzpNYXRoLmZsb29yKGUuc3RhcnQucm93KyhlLmVuZC5yb3ctZS5zdGFydC5yb3cpLzIpLGNvbHVtbjpNYXRoLmZsb29yKGUuc3RhcnQuY29sdW1uKyhlLmVuZC5jb2x1bW4tZS5zdGFydC5jb2x1bW4pLzIpfTt0aGlzLnJlbmRlcmVyLmFsaWduQ3Vyc29yKHQsLjUpfSx0aGlzLmdldEN1cnNvclBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uLmdldEN1cnNvcigpfSx0aGlzLmdldEN1cnNvclBvc2l0aW9uU2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpKX0sdGhpcy5nZXRTZWxlY3Rpb25SYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpfSx0aGlzLnNlbGVjdEFsbD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLnNlbGVjdEFsbCgpfSx0aGlzLmNsZWFyU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5tb3ZlQ3Vyc29yVG89ZnVuY3Rpb24oZSx0KXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG8oZSx0KX0sdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbj1mdW5jdGlvbihlKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihlKX0sdGhpcy5qdW1wVG9NYXRjaGluZz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSxyPW5ldyB5KHRoaXMuc2Vzc2lvbixuLnJvdyxuLmNvbHVtbiksaT1yLmdldEN1cnJlbnRUb2tlbigpLHM9aXx8ci5zdGVwRm9yd2FyZCgpO2lmKCFzKXJldHVybjt2YXIgbyx1PSExLGE9e30sZj1uLmNvbHVtbi1zLnN0YXJ0LGwsYz17IikiOiIoIiwiKCI6IigiLCJdIjoiWyIsIlsiOiJbIiwieyI6InsiLCJ9IjoieyJ9O2Rve2lmKHMudmFsdWUubWF0Y2goL1t7fSgpXFtcXV0vZykpZm9yKDtmPHMudmFsdWUubGVuZ3RoJiYhdTtmKyspe2lmKCFjW3MudmFsdWVbZl1dKWNvbnRpbnVlO2w9Y1tzLnZhbHVlW2ZdXSsiLiIrcy50eXBlLnJlcGxhY2UoInJwYXJlbiIsImxwYXJlbiIpLGlzTmFOKGFbbF0pJiYoYVtsXT0wKTtzd2l0Y2gocy52YWx1ZVtmXSl7Y2FzZSIoIjpjYXNlIlsiOmNhc2UieyI6YVtsXSsrO2JyZWFrO2Nhc2UiKSI6Y2FzZSJdIjpjYXNlIn0iOmFbbF0tLSxhW2xdPT09LTEmJihvPSJicmFja2V0Iix1PSEwKX19ZWxzZSBzLnR5cGUuaW5kZXhPZigidGFnLW5hbWUiKSE9PS0xJiYoaXNOYU4oYVtzLnZhbHVlXSkmJihhW3MudmFsdWVdPTApLGkudmFsdWU9PT0iPCI/YVtzLnZhbHVlXSsrOmkudmFsdWU9PT0iPC8iJiZhW3MudmFsdWVdLS0sYVtzLnZhbHVlXT09PS0xJiYobz0idGFnIix1PSEwKSk7dXx8KGk9cyxzPXIuc3RlcEZvcndhcmQoKSxmPTApfXdoaWxlKHMmJiF1KTtpZighbylyZXR1cm47dmFyIGgsZDtpZihvPT09ImJyYWNrZXQiKXtoPXRoaXMuc2Vzc2lvbi5nZXRCcmFja2V0UmFuZ2Uobik7aWYoIWgpe2g9bmV3IHAoci5nZXRDdXJyZW50VG9rZW5Sb3coKSxyLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2YtMSxyLmdldEN1cnJlbnRUb2tlblJvdygpLHIuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrZi0xKSxkPWguc3RhcnQ7aWYodHx8ZC5yb3c9PT1uLnJvdyYmTWF0aC5hYnMoZC5jb2x1bW4tbi5jb2x1bW4pPDIpaD10aGlzLnNlc3Npb24uZ2V0QnJhY2tldFJhbmdlKGQpfX1lbHNlIGlmKG89PT0idGFnIil7aWYoIXN8fHMudHlwZS5pbmRleE9mKCJ0YWctbmFtZSIpPT09LTEpcmV0dXJuO3ZhciB2PXMudmFsdWU7aD1uZXcgcChyLmdldEN1cnJlbnRUb2tlblJvdygpLHIuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCktMixyLmdldEN1cnJlbnRUb2tlblJvdygpLHIuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCktMik7aWYoaC5jb21wYXJlKG4ucm93LG4uY29sdW1uKT09PTApe3U9ITE7ZG8gcz1pLGk9ci5zdGVwQmFja3dhcmQoKSxpJiYoaS50eXBlLmluZGV4T2YoInRhZy1jbG9zZSIpIT09LTEmJmguc2V0RW5kKHIuZ2V0Q3VycmVudFRva2VuUm93KCksci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSsxKSxzLnZhbHVlPT09diYmcy50eXBlLmluZGV4T2YoInRhZy1uYW1lIikhPT0tMSYmKGkudmFsdWU9PT0iPCI/YVt2XSsrOmkudmFsdWU9PT0iPC8iJiZhW3ZdLS0sYVt2XT09PTAmJih1PSEwKSkpO3doaWxlKGkmJiF1KX1zJiZzLnR5cGUuaW5kZXhPZigidGFnLW5hbWUiKSYmKGQ9aC5zdGFydCxkLnJvdz09bi5yb3cmJk1hdGguYWJzKGQuY29sdW1uLW4uY29sdW1uKTwyJiYoZD1oLmVuZCkpfWQ9aCYmaC5jdXJzb3J8fGQsZCYmKGU/aCYmdD90aGlzLnNlbGVjdGlvbi5zZXRSYW5nZShoKTpoJiZoLmlzRXF1YWwodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKT90aGlzLmNsZWFyU2VsZWN0aW9uKCk6dGhpcy5zZWxlY3Rpb24uc2VsZWN0VG8oZC5yb3csZC5jb2x1bW4pOnRoaXMuc2VsZWN0aW9uLm1vdmVUbyhkLnJvdyxkLmNvbHVtbikpfSx0aGlzLmdvdG9MaW5lPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpLHRoaXMuc2Vzc2lvbi51bmZvbGQoe3JvdzplLTEsY29sdW1uOnR8fDB9KSx0aGlzLmV4aXRNdWx0aVNlbGVjdE1vZGUmJnRoaXMuZXhpdE11bHRpU2VsZWN0TW9kZSgpLHRoaXMubW92ZUN1cnNvclRvKGUtMSx0fHwwKSx0aGlzLmlzUm93RnVsbHlWaXNpYmxlKGUtMSl8fHRoaXMuc2Nyb2xsVG9MaW5lKGUtMSwhMCxuKX0sdGhpcy5uYXZpZ2F0ZVRvPWZ1bmN0aW9uKGUsdCl7dGhpcy5zZWxlY3Rpb24ubW92ZVRvKGUsdCl9LHRoaXMubmF2aWdhdGVVcD1mdW5jdGlvbihlKXtpZih0aGlzLnNlbGVjdGlvbi5pc011bHRpTGluZSgpJiYhdGhpcy5zZWxlY3Rpb24uaXNCYWNrd2FyZHMoKSl7dmFyIHQ9dGhpcy5zZWxlY3Rpb24uYW5jaG9yLmdldFBvc2l0aW9uKCk7cmV0dXJuIHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24odCl9dGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKSx0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yQnkoLWV8fC0xLDApfSx0aGlzLm5hdmlnYXRlRG93bj1mdW5jdGlvbihlKXtpZih0aGlzLnNlbGVjdGlvbi5pc011bHRpTGluZSgpJiZ0aGlzLnNlbGVjdGlvbi5pc0JhY2t3YXJkcygpKXt2YXIgdD10aGlzLnNlbGVjdGlvbi5hbmNob3IuZ2V0UG9zaXRpb24oKTtyZXR1cm4gdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbih0KX10aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpLHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JCeShlfHwxLDApfSx0aGlzLm5hdmlnYXRlTGVmdD1mdW5jdGlvbihlKXtpZighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKXt2YXIgdD10aGlzLmdldFNlbGVjdGlvblJhbmdlKCkuc3RhcnQ7dGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbih0KX1lbHNle2U9ZXx8MTt3aGlsZShlLS0pdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckxlZnQoKX10aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVSaWdodD1mdW5jdGlvbihlKXtpZighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKXt2YXIgdD10aGlzLmdldFNlbGVjdGlvblJhbmdlKCkuZW5kO3RoaXMubW92ZUN1cnNvclRvUG9zaXRpb24odCl9ZWxzZXtlPWV8fDE7d2hpbGUoZS0tKXRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JSaWdodCgpfXRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZUxpbmVTdGFydD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JMaW5lU3RhcnQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVMaW5lRW5kPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckxpbmVFbmQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVGaWxlRW5kPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckZpbGVFbmQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVGaWxlU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yRmlsZVN0YXJ0KCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlV29yZFJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvcldvcmRSaWdodCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZVdvcmRMZWZ0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvcldvcmRMZWZ0KCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnJlcGxhY2U9ZnVuY3Rpb24oZSx0KXt0JiZ0aGlzLiRzZWFyY2guc2V0KHQpO3ZhciBuPXRoaXMuJHNlYXJjaC5maW5kKHRoaXMuc2Vzc2lvbikscj0wO3JldHVybiBuPyh0aGlzLiR0cnlSZXBsYWNlKG4sZSkmJihyPTEpLHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKG4pLHRoaXMucmVuZGVyZXIuc2Nyb2xsU2VsZWN0aW9uSW50b1ZpZXcobi5zdGFydCxuLmVuZCkscik6cn0sdGhpcy5yZXBsYWNlQWxsPWZ1bmN0aW9uKGUsdCl7dCYmdGhpcy4kc2VhcmNoLnNldCh0KTt2YXIgbj10aGlzLiRzZWFyY2guZmluZEFsbCh0aGlzLnNlc3Npb24pLHI9MDtpZighbi5sZW5ndGgpcmV0dXJuIHI7dmFyIGk9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO3RoaXMuc2VsZWN0aW9uLm1vdmVUbygwLDApO2Zvcih2YXIgcz1uLmxlbmd0aC0xO3M+PTA7LS1zKXRoaXMuJHRyeVJlcGxhY2UobltzXSxlKSYmcisrO3JldHVybiB0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShpKSxyfSx0aGlzLiR0cnlSZXBsYWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZShlKTtyZXR1cm4gdD10aGlzLiRzZWFyY2gucmVwbGFjZShuLHQpLHQhPT1udWxsPyhlLmVuZD10aGlzLnNlc3Npb24ucmVwbGFjZShlLHQpLGUpOm51bGx9LHRoaXMuZ2V0TGFzdFNlYXJjaE9wdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2VhcmNoLmdldE9wdGlvbnMoKX0sdGhpcy5maW5kPWZ1bmN0aW9uKGUsdCxuKXt0fHwodD17fSksdHlwZW9mIGU9PSJzdHJpbmcifHxlIGluc3RhbmNlb2YgUmVnRXhwP3QubmVlZGxlPWU6dHlwZW9mIGU9PSJvYmplY3QiJiZyLm1peGluKHQsZSk7dmFyIGk9dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTt0Lm5lZWRsZT09bnVsbCYmKGU9dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZShpKXx8dGhpcy4kc2VhcmNoLiRvcHRpb25zLm5lZWRsZSxlfHwoaT10aGlzLnNlc3Npb24uZ2V0V29yZFJhbmdlKGkuc3RhcnQucm93LGkuc3RhcnQuY29sdW1uKSxlPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UoaSkpLHRoaXMuJHNlYXJjaC5zZXQoe25lZWRsZTplfSkpLHRoaXMuJHNlYXJjaC5zZXQodCksdC5zdGFydHx8dGhpcy4kc2VhcmNoLnNldCh7c3RhcnQ6aX0pO3ZhciBzPXRoaXMuJHNlYXJjaC5maW5kKHRoaXMuc2Vzc2lvbik7aWYodC5wcmV2ZW50U2Nyb2xsKXJldHVybiBzO2lmKHMpcmV0dXJuIHRoaXMucmV2ZWFsUmFuZ2UocyxuKSxzO3QuYmFja3dhcmRzP2kuc3RhcnQ9aS5lbmQ6aS5lbmQ9aS5zdGFydCx0aGlzLnNlbGVjdGlvbi5zZXRSYW5nZShpKX0sdGhpcy5maW5kTmV4dD1mdW5jdGlvbihlLHQpe3RoaXMuZmluZCh7c2tpcEN1cnJlbnQ6ITAsYmFja3dhcmRzOiExfSxlLHQpfSx0aGlzLmZpbmRQcmV2aW91cz1mdW5jdGlvbihlLHQpe3RoaXMuZmluZChlLHtza2lwQ3VycmVudDohMCxiYWNrd2FyZHM6ITB9LHQpfSx0aGlzLnJldmVhbFJhbmdlPWZ1bmN0aW9uKGUsdCl7dGhpcy5zZXNzaW9uLnVuZm9sZChlKSx0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShlKTt2YXIgbj10aGlzLnJlbmRlcmVyLnNjcm9sbFRvcDt0aGlzLnJlbmRlcmVyLnNjcm9sbFNlbGVjdGlvbkludG9WaWV3KGUuc3RhcnQsZS5lbmQsLjUpLHQhPT0hMSYmdGhpcy5yZW5kZXJlci5hbmltYXRlU2Nyb2xsaW5nKG4pfSx0aGlzLnVuZG89ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24uZ2V0VW5kb01hbmFnZXIoKS51bmRvKHRoaXMuc2Vzc2lvbiksdGhpcy5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyhudWxsLC41KX0sdGhpcy5yZWRvPWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLmdldFVuZG9NYW5hZ2VyKCkucmVkbyh0aGlzLnNlc3Npb24pLHRoaXMucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcobnVsbCwuNSl9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuZGVzdHJveSgpLHRoaXMuX3NpZ25hbCgiZGVzdHJveSIsdGhpcyksdGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24uZGVzdHJveSgpfSx0aGlzLnNldEF1dG9TY3JvbGxFZGl0b3JJbnRvVmlldz1mdW5jdGlvbihlKXtpZighZSlyZXR1cm47dmFyIHQsbj10aGlzLHI9ITE7dGhpcy4kc2Nyb2xsQW5jaG9yfHwodGhpcy4kc2Nyb2xsQW5jaG9yPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTt2YXIgaT10aGlzLiRzY3JvbGxBbmNob3I7aS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZSIsdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKGksdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCk7dmFyIHM9dGhpcy5vbigiY2hhbmdlU2VsZWN0aW9uIixmdW5jdGlvbigpe3I9ITB9KSxvPXRoaXMucmVuZGVyZXIub24oImJlZm9yZVJlbmRlciIsZnVuY3Rpb24oKXtyJiYodD1uLnJlbmRlcmVyLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSl9KSx1PXRoaXMucmVuZGVyZXIub24oImFmdGVyUmVuZGVyIixmdW5jdGlvbigpe2lmKHImJnQmJihuLmlzRm9jdXNlZCgpfHxuLnNlYXJjaEJveCYmbi5zZWFyY2hCb3guaXNGb2N1c2VkKCkpKXt2YXIgZT1uLnJlbmRlcmVyLHM9ZS4kY3Vyc29yTGF5ZXIuJHBpeGVsUG9zLG89ZS5sYXllckNvbmZpZyx1PXMudG9wLW8ub2Zmc2V0O3MudG9wPj0wJiZ1K3QudG9wPDA/cj0hMDpzLnRvcDxvLmhlaWdodCYmcy50b3ArdC50b3Arby5saW5lSGVpZ2h0PndpbmRvdy5pbm5lckhlaWdodD9yPSExOnI9bnVsbCxyIT1udWxsJiYoaS5zdHlsZS50b3A9dSsicHgiLGkuc3R5bGUubGVmdD1zLmxlZnQrInB4IixpLnN0eWxlLmhlaWdodD1vLmxpbmVIZWlnaHQrInB4IixpLnNjcm9sbEludG9WaWV3KHIpKSxyPXQ9bnVsbH19KTt0aGlzLnNldEF1dG9TY3JvbGxFZGl0b3JJbnRvVmlldz1mdW5jdGlvbihlKXtpZihlKXJldHVybjtkZWxldGUgdGhpcy5zZXRBdXRvU2Nyb2xsRWRpdG9ySW50b1ZpZXcsdGhpcy5vZmYoImNoYW5nZVNlbGVjdGlvbiIscyksdGhpcy5yZW5kZXJlci5vZmYoImFmdGVyUmVuZGVyIix1KSx0aGlzLnJlbmRlcmVyLm9mZigiYmVmb3JlUmVuZGVyIixvKX19LHRoaXMuJHJlc2V0Q3Vyc29yU3R5bGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRjdXJzb3JTdHlsZXx8ImFjZSIsdD10aGlzLnJlbmRlcmVyLiRjdXJzb3JMYXllcjtpZighdClyZXR1cm47dC5zZXRTbW9vdGhCbGlua2luZygvc21vb3RoLy50ZXN0KGUpKSx0LmlzQmxpbmtpbmc9IXRoaXMuJHJlYWRPbmx5JiZlIT0id2lkZSIsaS5zZXRDc3NDbGFzcyh0LmVsZW1lbnQsImFjZV9zbGltLWN1cnNvcnMiLC9zbGltLy50ZXN0KGUpKX0sdGhpcy5wcm9tcHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXM7Zy5sb2FkTW9kdWxlKCIuL2V4dC9wcm9tcHQiLGZ1bmN0aW9uKGkpe2kucHJvbXB0KHIsZSx0LG4pfSl9fS5jYWxsKHcucHJvdG90eXBlKSxnLmRlZmluZU9wdGlvbnMody5wcm90b3R5cGUsImVkaXRvciIse3NlbGVjdGlvblN0eWxlOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpLHRoaXMuX3NpZ25hbCgiY2hhbmdlU2VsZWN0aW9uU3R5bGUiLHtkYXRhOmV9KX0saW5pdGlhbFZhbHVlOiJsaW5lIn0saGlnaGxpZ2h0QWN0aXZlTGluZTp7c2V0OmZ1bmN0aW9uKCl7dGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpfSxpbml0aWFsVmFsdWU6ITB9LGhpZ2hsaWdodFNlbGVjdGVkV29yZDp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlKCl9LGluaXRpYWxWYWx1ZTohMH0scmVhZE9ubHk6e3NldDpmdW5jdGlvbihlKXt0aGlzLnRleHRJbnB1dC5zZXRSZWFkT25seShlKSx0aGlzLiRyZXNldEN1cnNvclN0eWxlKCl9LGluaXRpYWxWYWx1ZTohMX0sY29weVdpdGhFbXB0eVNlbGVjdGlvbjp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMudGV4dElucHV0LnNldENvcHlXaXRoRW1wdHlTZWxlY3Rpb24oZSl9LGluaXRpYWxWYWx1ZTohMX0sY3Vyc29yU3R5bGU6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRyZXNldEN1cnNvclN0eWxlKCl9LHZhbHVlczpbImFjZSIsInNsaW0iLCJzbW9vdGgiLCJ3aWRlIl0saW5pdGlhbFZhbHVlOiJhY2UifSxtZXJnZVVuZG9EZWx0YXM6e3ZhbHVlczpbITEsITAsImFsd2F5cyJdLGluaXRpYWxWYWx1ZTohMH0sYmVoYXZpb3Vyc0VuYWJsZWQ6e2luaXRpYWxWYWx1ZTohMH0sd3JhcEJlaGF2aW91cnNFbmFibGVkOntpbml0aWFsVmFsdWU6ITB9LGF1dG9TY3JvbGxFZGl0b3JJbnRvVmlldzp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuc2V0QXV0b1Njcm9sbEVkaXRvckludG9WaWV3KGUpfX0sa2V5Ym9hcmRIYW5kbGVyOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXRLZXlib2FyZEhhbmRsZXIoZSl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRrZXliaW5kaW5nSWR9LGhhbmRsZXNTZXQ6ITB9LHZhbHVlOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uLnNldFZhbHVlKGUpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpfSxoYW5kbGVzU2V0OiEwLGhpZGRlbjohMH0sc2Vzc2lvbjp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuc2V0U2Vzc2lvbihlKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbn0saGFuZGxlc1NldDohMCxoaWRkZW46ITB9LHNob3dMaW5lTnVtYmVyczp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuJGd1dHRlckxheWVyLnNldFNob3dMaW5lTnVtYmVycyhlKSx0aGlzLnJlbmRlcmVyLiRsb29wLnNjaGVkdWxlKHRoaXMucmVuZGVyZXIuQ0hBTkdFX0dVVFRFUiksZSYmdGhpcy4kcmVsYXRpdmVMaW5lTnVtYmVycz9FLmF0dGFjaCh0aGlzKTpFLmRldGFjaCh0aGlzKX0saW5pdGlhbFZhbHVlOiEwfSxyZWxhdGl2ZUxpbmVOdW1iZXJzOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kc2hvd0xpbmVOdW1iZXJzJiZlP0UuYXR0YWNoKHRoaXMpOkUuZGV0YWNoKHRoaXMpfX0saFNjcm9sbEJhckFsd2F5c1Zpc2libGU6InJlbmRlcmVyIix2U2Nyb2xsQmFyQWx3YXlzVmlzaWJsZToicmVuZGVyZXIiLGhpZ2hsaWdodEd1dHRlckxpbmU6InJlbmRlcmVyIixhbmltYXRlZFNjcm9sbDoicmVuZGVyZXIiLHNob3dJbnZpc2libGVzOiJyZW5kZXJlciIsc2hvd1ByaW50TWFyZ2luOiJyZW5kZXJlciIscHJpbnRNYXJnaW5Db2x1bW46InJlbmRlcmVyIixwcmludE1hcmdpbjoicmVuZGVyZXIiLGZhZGVGb2xkV2lkZ2V0czoicmVuZGVyZXIiLHNob3dGb2xkV2lkZ2V0czoicmVuZGVyZXIiLGRpc3BsYXlJbmRlbnRHdWlkZXM6InJlbmRlcmVyIixzaG93R3V0dGVyOiJyZW5kZXJlciIsZm9udFNpemU6InJlbmRlcmVyIixmb250RmFtaWx5OiJyZW5kZXJlciIsbWF4TGluZXM6InJlbmRlcmVyIixtaW5MaW5lczoicmVuZGVyZXIiLHNjcm9sbFBhc3RFbmQ6InJlbmRlcmVyIixmaXhlZFdpZHRoR3V0dGVyOiJyZW5kZXJlciIsdGhlbWU6InJlbmRlcmVyIixoYXNDc3NUcmFuc2Zvcm1zOiJyZW5kZXJlciIsbWF4UGl4ZWxIZWlnaHQ6InJlbmRlcmVyIix1c2VUZXh0YXJlYUZvcklNRToicmVuZGVyZXIiLHNjcm9sbFNwZWVkOiIkbW91c2VIYW5kbGVyIixkcmFnRGVsYXk6IiRtb3VzZUhhbmRsZXIiLGRyYWdFbmFibGVkOiIkbW91c2VIYW5kbGVyIixmb2N1c1RpbWVvdXQ6IiRtb3VzZUhhbmRsZXIiLHRvb2x0aXBGb2xsb3dzTW91c2U6IiRtb3VzZUhhbmRsZXIiLGZpcnN0TGluZU51bWJlcjoic2Vzc2lvbiIsb3ZlcndyaXRlOiJzZXNzaW9uIixuZXdMaW5lTW9kZToic2Vzc2lvbiIsdXNlV29ya2VyOiJzZXNzaW9uIix1c2VTb2Z0VGFiczoic2Vzc2lvbiIsbmF2aWdhdGVXaXRoaW5Tb2Z0VGFiczoic2Vzc2lvbiIsdGFiU2l6ZToic2Vzc2lvbiIsd3JhcDoic2Vzc2lvbiIsaW5kZW50ZWRTb2Z0V3JhcDoic2Vzc2lvbiIsZm9sZFN0eWxlOiJzZXNzaW9uIixtb2RlOiJzZXNzaW9uIn0pO3ZhciBFPXtnZXRUZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuKE1hdGguYWJzKGUuc2VsZWN0aW9uLmxlYWQucm93LXQpfHx0KzErKHQ8OT8iXHUwMGI3IjoiIikpKyIifSxnZXRXaWR0aDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIE1hdGgubWF4KHQudG9TdHJpbmcoKS5sZW5ndGgsKG4ubGFzdFJvdysxKS50b1N0cmluZygpLmxlbmd0aCwyKSpuLmNoYXJhY3RlcldpZHRofSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXt0LnJlbmRlcmVyLiRsb29wLnNjaGVkdWxlKHQucmVuZGVyZXIuQ0hBTkdFX0dVVFRFUil9LGF0dGFjaDpmdW5jdGlvbihlKXtlLnJlbmRlcmVyLiRndXR0ZXJMYXllci4kcmVuZGVyZXI9dGhpcyxlLm9uKCJjaGFuZ2VTZWxlY3Rpb24iLHRoaXMudXBkYXRlKSx0aGlzLnVwZGF0ZShudWxsLGUpfSxkZXRhY2g6ZnVuY3Rpb24oZSl7ZS5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuJHJlbmRlcmVyPT10aGlzJiYoZS5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuJHJlbmRlcmVyPW51bGwpLGUub2ZmKCJjaGFuZ2VTZWxlY3Rpb24iLHRoaXMudXBkYXRlKSx0aGlzLnVwZGF0ZShudWxsLGUpfX07dC5FZGl0b3I9d30pLGFjZS5kZWZpbmUoImFjZS91bmRvbWFuYWdlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlLHQpe2Zvcih2YXIgbj10O24tLTspe3ZhciByPWVbbl07aWYociYmIXJbMF0uaWdub3JlKXt3aGlsZShuPHQtMSl7dmFyIGk9ZChlW25dLGVbbisxXSk7ZVtuXT1pWzBdLGVbbisxXT1pWzFdLG4rK31yZXR1cm4hMH19fWZ1bmN0aW9uIGEoZSl7dmFyIHQ9ZS5hY3Rpb249PSJpbnNlcnQiLG49ZS5zdGFydCxyPWUuZW5kLGk9KHIucm93LW4ucm93KSoodD8xOi0xKSxzPShyLmNvbHVtbi1uLmNvbHVtbikqKHQ/MTotMSk7dCYmKHI9bik7Zm9yKHZhciBvIGluIHRoaXMubWFya3Mpe3ZhciBhPXRoaXMubWFya3Nbb10sZj11KGEsbik7aWYoZjwwKWNvbnRpbnVlO2lmKGY9PT0wJiZ0KXtpZihhLmJpYXMhPTEpe2EuYmlhcz09LTE7Y29udGludWV9Zj0xfXZhciBsPXQ/Zjp1KGEscik7aWYobD4wKXthLnJvdys9aSxhLmNvbHVtbis9YS5yb3c9PXIucm93P3M6MDtjb250aW51ZX0hdCYmbDw9MCYmKGEucm93PW4ucm93LGEuY29sdW1uPW4uY29sdW1uLGw9PT0wJiYoYS5iaWFzPTEpKX19ZnVuY3Rpb24gZihlKXtyZXR1cm57cm93OmUucm93LGNvbHVtbjplLmNvbHVtbn19ZnVuY3Rpb24gbChlKXtyZXR1cm57c3RhcnQ6ZihlLnN0YXJ0KSxlbmQ6ZihlLmVuZCksYWN0aW9uOmUuYWN0aW9uLGxpbmVzOmUubGluZXMuc2xpY2UoKX19ZnVuY3Rpb24gYyhlKXtlPWV8fHRoaXM7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZS5tYXAoYykuam9pbigiXG4iKTt2YXIgdD0iIjtlLmFjdGlvbj8odD1lLmFjdGlvbj09Imluc2VydCI/IisiOiItIix0Kz0iWyIrZS5saW5lcysiXSIpOmUudmFsdWUmJihBcnJheS5pc0FycmF5KGUudmFsdWUpP3Q9ZS52YWx1ZS5tYXAoaCkuam9pbigiXG4iKTp0PWgoZS52YWx1ZSkpLGUuc3RhcnQmJih0Kz1oKGUpKTtpZihlLmlkfHxlLnJldil0Kz0iCSgiKyhlLmlkfHxlLnJldikrIikiO3JldHVybiB0fWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGUuc3RhcnQucm93KyI6IitlLnN0YXJ0LmNvbHVtbisiPT4iK2UuZW5kLnJvdysiOiIrZS5lbmQuY29sdW1ufWZ1bmN0aW9uIHAoZSx0KXt2YXIgbj1lLmFjdGlvbj09Imluc2VydCIscj10LmFjdGlvbj09Imluc2VydCI7aWYobiYmcilpZihvKHQuc3RhcnQsZS5lbmQpPj0wKW0odCxlLC0xKTtlbHNle2lmKCEobyh0LnN0YXJ0LGUuc3RhcnQpPD0wKSlyZXR1cm4gbnVsbDttKGUsdCwxKX1lbHNlIGlmKG4mJiFyKWlmKG8odC5zdGFydCxlLmVuZCk+PTApbSh0LGUsLTEpO2Vsc2V7aWYoIShvKHQuZW5kLGUuc3RhcnQpPD0wKSlyZXR1cm4gbnVsbDttKGUsdCwtMSl9ZWxzZSBpZighbiYmcilpZihvKHQuc3RhcnQsZS5zdGFydCk+PTApbSh0LGUsMSk7ZWxzZXtpZighKG8odC5zdGFydCxlLnN0YXJ0KTw9MCkpcmV0dXJuIG51bGw7bShlLHQsMSl9ZWxzZSBpZighbiYmIXIpaWYobyh0LnN0YXJ0LGUuc3RhcnQpPj0wKW0odCxlLDEpO2Vsc2V7aWYoIShvKHQuZW5kLGUuc3RhcnQpPD0wKSlyZXR1cm4gbnVsbDttKGUsdCwtMSl9cmV0dXJuW3QsZV19ZnVuY3Rpb24gZChlLHQpe2Zvcih2YXIgbj1lLmxlbmd0aDtuLS07KWZvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKWlmKCFwKGVbbl0sdFtyXSkpe3doaWxlKG48ZS5sZW5ndGgpe3doaWxlKHItLSlwKHRbcl0sZVtuXSk7cj10Lmxlbmd0aCxuKyt9cmV0dXJuW2UsdF19cmV0dXJuIGUuc2VsZWN0aW9uQmVmb3JlPXQuc2VsZWN0aW9uQmVmb3JlPWUuc2VsZWN0aW9uQWZ0ZXI9dC5zZWxlY3Rpb25BZnRlcj1udWxsLFt0LGVdfWZ1bmN0aW9uIHYoZSx0KXt2YXIgbj1lLmFjdGlvbj09Imluc2VydCIscj10LmFjdGlvbj09Imluc2VydCI7aWYobiYmcilvKGUuc3RhcnQsdC5zdGFydCk8MD9tKHQsZSwxKTptKGUsdCwxKTtlbHNlIGlmKG4mJiFyKW8oZS5zdGFydCx0LmVuZCk+PTA/bShlLHQsLTEpOm8oZS5zdGFydCx0LnN0YXJ0KTw9MD9tKHQsZSwxKToobShlLHMuZnJvbVBvaW50cyh0LnN0YXJ0LGUuc3RhcnQpLC0xKSxtKHQsZSwxKSk7ZWxzZSBpZighbiYmcilvKHQuc3RhcnQsZS5lbmQpPj0wP20odCxlLC0xKTpvKHQuc3RhcnQsZS5zdGFydCk8PTA/bShlLHQsMSk6KG0odCxzLmZyb21Qb2ludHMoZS5zdGFydCx0LnN0YXJ0KSwtMSksbShlLHQsMSkpO2Vsc2UgaWYoIW4mJiFyKWlmKG8odC5zdGFydCxlLmVuZCk+PTApbSh0LGUsLTEpO2Vsc2V7aWYoIShvKHQuZW5kLGUuc3RhcnQpPD0wKSl7dmFyIGksdTtyZXR1cm4gbyhlLnN0YXJ0LHQuc3RhcnQpPDAmJihpPWUsZT15KGUsdC5zdGFydCkpLG8oZS5lbmQsdC5lbmQpPjAmJih1PXkoZSx0LmVuZCkpLGcodC5lbmQsZS5zdGFydCxlLmVuZCwtMSksdSYmIWkmJihlLmxpbmVzPXUubGluZXMsZS5zdGFydD11LnN0YXJ0LGUuZW5kPXUuZW5kLHU9ZSksW3QsaSx1XS5maWx0ZXIoQm9vbGVhbil9bShlLHQsLTEpfXJldHVyblt0LGVdfWZ1bmN0aW9uIG0oZSx0LG4pe2coZS5zdGFydCx0LnN0YXJ0LHQuZW5kLG4pLGcoZS5lbmQsdC5zdGFydCx0LmVuZCxuKX1mdW5jdGlvbiBnKGUsdCxuLHIpe2Uucm93PT0ocj09MT90Om4pLnJvdyYmKGUuY29sdW1uKz1yKihuLmNvbHVtbi10LmNvbHVtbikpLGUucm93Kz1yKihuLnJvdy10LnJvdyl9ZnVuY3Rpb24geShlLHQpe3ZhciBuPWUubGluZXMscj1lLmVuZDtlLmVuZD1mKHQpO3ZhciBpPWUuZW5kLnJvdy1lLnN0YXJ0LnJvdyxzPW4uc3BsaWNlKGksbi5sZW5ndGgpLG89aT90LmNvbHVtbjp0LmNvbHVtbi1lLnN0YXJ0LmNvbHVtbjtuLnB1c2goc1swXS5zdWJzdHJpbmcoMCxvKSksc1swXT1zWzBdLnN1YnN0cihvKTt2YXIgdT17c3RhcnQ6Zih0KSxlbmQ6cixsaW5lczpzLGFjdGlvbjplLmFjdGlvbn07cmV0dXJuIHV9ZnVuY3Rpb24gYihlLHQpe3Q9bCh0KTtmb3IodmFyIG49ZS5sZW5ndGg7bi0tOyl7dmFyIHI9ZVtuXTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIHM9cltpXSxvPXYocyx0KTt0PW9bMF0sby5sZW5ndGghPTImJihvWzJdPyhyLnNwbGljZShpKzEsMSxvWzFdLG9bMl0pLGkrKyk6b1sxXXx8KHIuc3BsaWNlKGksMSksaS0tKSl9ci5sZW5ndGh8fGUuc3BsaWNlKG4sMSl9cmV0dXJuIGV9ZnVuY3Rpb24gdyhlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO2Zvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKWIoZSxyW2ldKX19dmFyIHI9ZnVuY3Rpb24oKXt0aGlzLiRtYXhSZXY9MCx0aGlzLiRmcm9tVW5kbz0hMSx0aGlzLnJlc2V0KCl9OyhmdW5jdGlvbigpe3RoaXMuYWRkU2Vzc2lvbj1mdW5jdGlvbihlKXt0aGlzLiRzZXNzaW9uPWV9LHRoaXMuYWRkPWZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLiRmcm9tVW5kbylyZXR1cm47aWYoZT09dGhpcy4kbGFzdERlbHRhKXJldHVybjtpZih0PT09ITF8fCF0aGlzLmxhc3REZWx0YXMpdGhpcy5sYXN0RGVsdGFzPVtdLHRoaXMuJHVuZG9TdGFjay5wdXNoKHRoaXMubGFzdERlbHRhcyksZS5pZD10aGlzLiRyZXY9Kyt0aGlzLiRtYXhSZXY7aWYoZS5hY3Rpb249PSJyZW1vdmUifHxlLmFjdGlvbj09Imluc2VydCIpdGhpcy4kbGFzdERlbHRhPWU7dGhpcy5sYXN0RGVsdGFzLnB1c2goZSl9LHRoaXMuYWRkU2VsZWN0aW9uPWZ1bmN0aW9uKGUsdCl7dGhpcy5zZWxlY3Rpb25zLnB1c2goe3ZhbHVlOmUscmV2OnR8fHRoaXMuJHJldn0pfSx0aGlzLnN0YXJ0TmV3R3JvdXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXN0RGVsdGFzPW51bGwsdGhpcy4kcmV2fSx0aGlzLm1hcmtJZ25vcmVkPWZ1bmN0aW9uKGUsdCl7dD09bnVsbCYmKHQ9dGhpcy4kcmV2KzEpO3ZhciBuPXRoaXMuJHVuZG9TdGFjaztmb3IodmFyIHI9bi5sZW5ndGg7ci0tOyl7dmFyIGk9bltyXVswXTtpZihpLmlkPD1lKWJyZWFrO2kuaWQ8dCYmKGkuaWdub3JlPSEwKX10aGlzLmxhc3REZWx0YXM9bnVsbH0sdGhpcy5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNlbGVjdGlvbnM7Zm9yKHZhciByPW4ubGVuZ3RoO3ItLTspe3ZhciBpPW5bcl07aWYoaS5yZXY8ZSlyZXR1cm4gdCYmKGk9bltyKzFdKSxpfX0sdGhpcy5nZXRSZXZpc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyZXZ9LHRoaXMuZ2V0RGVsdGFzPWZ1bmN0aW9uKGUsdCl7dD09bnVsbCYmKHQ9dGhpcy4kcmV2KzEpO3ZhciBuPXRoaXMuJHVuZG9TdGFjayxyPW51bGwsaT0wO2Zvcih2YXIgcz1uLmxlbmd0aDtzLS07KXt2YXIgbz1uW3NdWzBdO28uaWQ8dCYmIXImJihyPXMrMSk7aWYoby5pZDw9ZSl7aT1zKzE7YnJlYWt9fXJldHVybiBuLnNsaWNlKGkscil9LHRoaXMuZ2V0Q2hhbmdlZFJhbmdlcz1mdW5jdGlvbihlLHQpe3Q9PW51bGwmJih0PXRoaXMuJHJldisxKX0sdGhpcy5nZXRDaGFuZ2VkTGluZXM9ZnVuY3Rpb24oZSx0KXt0PT1udWxsJiYodD10aGlzLiRyZXYrMSl9LHRoaXMudW5kbz1mdW5jdGlvbihlLHQpe3RoaXMubGFzdERlbHRhcz1udWxsO3ZhciBuPXRoaXMuJHVuZG9TdGFjaztpZighaShuLG4ubGVuZ3RoKSlyZXR1cm47ZXx8KGU9dGhpcy4kc2Vzc2lvbiksdGhpcy4kcmVkb1N0YWNrQmFzZVJldiE9PXRoaXMuJHJldiYmdGhpcy4kcmVkb1N0YWNrLmxlbmd0aCYmKHRoaXMuJHJlZG9TdGFjaz1bXSksdGhpcy4kZnJvbVVuZG89ITA7dmFyIHI9bi5wb3AoKSxzPW51bGw7cmV0dXJuIHImJnIubGVuZ3RoJiYocz1lLnVuZG9DaGFuZ2VzKHIsdCksdGhpcy4kcmVkb1N0YWNrLnB1c2gociksdGhpcy4kc3luY1JldigpKSx0aGlzLiRmcm9tVW5kbz0hMSxzfSx0aGlzLnJlZG89ZnVuY3Rpb24oZSx0KXt0aGlzLmxhc3REZWx0YXM9bnVsbCxlfHwoZT10aGlzLiRzZXNzaW9uKSx0aGlzLiRmcm9tVW5kbz0hMDtpZih0aGlzLiRyZWRvU3RhY2tCYXNlUmV2IT10aGlzLiRyZXYpe3ZhciBuPXRoaXMuZ2V0RGVsdGFzKHRoaXMuJHJlZG9TdGFja0Jhc2VSZXYsdGhpcy4kcmV2KzEpO3codGhpcy4kcmVkb1N0YWNrLG4pLHRoaXMuJHJlZG9TdGFja0Jhc2VSZXY9dGhpcy4kcmV2LHRoaXMuJHJlZG9TdGFjay5mb3JFYWNoKGZ1bmN0aW9uKGUpe2VbMF0uaWQ9Kyt0aGlzLiRtYXhSZXZ9LHRoaXMpfXZhciByPXRoaXMuJHJlZG9TdGFjay5wb3AoKSxpPW51bGw7cmV0dXJuIHImJihpPWUucmVkb0NoYW5nZXMocix0KSx0aGlzLiR1bmRvU3RhY2sucHVzaChyKSx0aGlzLiRzeW5jUmV2KCkpLHRoaXMuJGZyb21VbmRvPSExLGl9LHRoaXMuJHN5bmNSZXY9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiR1bmRvU3RhY2ssdD1lW2UubGVuZ3RoLTFdLG49dCYmdFswXS5pZHx8MDt0aGlzLiRyZWRvU3RhY2tCYXNlUmV2PW4sdGhpcy4kcmV2PW59LHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmxhc3REZWx0YXM9bnVsbCx0aGlzLiRsYXN0RGVsdGE9bnVsbCx0aGlzLiR1bmRvU3RhY2s9W10sdGhpcy4kcmVkb1N0YWNrPVtdLHRoaXMuJHJldj0wLHRoaXMubWFyaz0wLHRoaXMuJHJlZG9TdGFja0Jhc2VSZXY9dGhpcy4kcmV2LHRoaXMuc2VsZWN0aW9ucz1bXX0sdGhpcy5jYW5VbmRvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHVuZG9TdGFjay5sZW5ndGg+MH0sdGhpcy5jYW5SZWRvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJlZG9TdGFjay5sZW5ndGg+MH0sdGhpcy5ib29rbWFyaz1mdW5jdGlvbihlKXtlPT11bmRlZmluZWQmJihlPXRoaXMuJHJldiksdGhpcy5tYXJrPWV9LHRoaXMuaXNBdEJvb2ttYXJrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJldj09PXRoaXMubWFya30sdGhpcy50b0pTT049ZnVuY3Rpb24oKXt9LHRoaXMuZnJvbUpTT049ZnVuY3Rpb24oKXt9LHRoaXMuaGFzVW5kbz10aGlzLmNhblVuZG8sdGhpcy5oYXNSZWRvPXRoaXMuY2FuUmVkbyx0aGlzLmlzQ2xlYW49dGhpcy5pc0F0Qm9va21hcmssdGhpcy5tYXJrQ2xlYW49dGhpcy5ib29rbWFyayx0aGlzLiRwcmV0dHlQcmludD1mdW5jdGlvbihlKXtyZXR1cm4gZT9jKGUpOmModGhpcy4kdW5kb1N0YWNrKSsiXG4tLS1cbiIrYyh0aGlzLiRyZWRvU3RhY2spfX0pLmNhbGwoci5wcm90b3R5cGUpO3ZhciBzPWUoIi4vcmFuZ2UiKS5SYW5nZSxvPXMuY29tcGFyZVBvaW50cyx1PXMuY29tcGFyZVBvaW50czt0LlVuZG9NYW5hZ2VyPXJ9KSxhY2UuZGVmaW5lKCJhY2UvbGF5ZXIvbGluZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL2RvbSIpLGk9ZnVuY3Rpb24oZSx0KXt0aGlzLmVsZW1lbnQ9ZSx0aGlzLmNhbnZhc0hlaWdodD10fHw1ZTUsdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodD10aGlzLmNhbnZhc0hlaWdodCoyKyJweCIsdGhpcy5jZWxscz1bXSx0aGlzLmNlbGxDYWNoZT1bXSx0aGlzLiRvZmZzZXRDb2VmZmljaWVudD0wfTsoZnVuY3Rpb24oKXt0aGlzLm1vdmVDb250YWluZXI9ZnVuY3Rpb24oZSl7ci50cmFuc2xhdGUodGhpcy5lbGVtZW50LDAsLShlLmZpcnN0Um93U2NyZWVuKmUubGluZUhlaWdodCV0aGlzLmNhbnZhc0hlaWdodCktZS5vZmZzZXQqdGhpcy4kb2Zmc2V0Q29lZmZpY2llbnQpfSx0aGlzLnBhZ2VDaGFuZ2VkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE1hdGguZmxvb3IoZS5maXJzdFJvd1NjcmVlbiplLmxpbmVIZWlnaHQvdGhpcy5jYW52YXNIZWlnaHQpIT09TWF0aC5mbG9vcih0LmZpcnN0Um93U2NyZWVuKnQubGluZUhlaWdodC90aGlzLmNhbnZhc0hlaWdodCl9LHRoaXMuY29tcHV0ZUxpbmVUb3A9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQuZmlyc3RSb3dTY3JlZW4qdC5saW5lSGVpZ2h0LGk9TWF0aC5mbG9vcihyL3RoaXMuY2FudmFzSGVpZ2h0KSxzPW4uZG9jdW1lbnRUb1NjcmVlblJvdyhlLDApKnQubGluZUhlaWdodDtyZXR1cm4gcy1pKnRoaXMuY2FudmFzSGVpZ2h0fSx0aGlzLmNvbXB1dGVMaW5lSGVpZ2h0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdC5saW5lSGVpZ2h0Km4uZ2V0Um93TGVuZ3RoKGUpfSx0aGlzLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGxzLmxlbmd0aH0sdGhpcy5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2VsbHNbZV19LHRoaXMuc2hpZnQ9ZnVuY3Rpb24oKXt0aGlzLiRjYWNoZUNlbGwodGhpcy5jZWxscy5zaGlmdCgpKX0sdGhpcy5wb3A9ZnVuY3Rpb24oKXt0aGlzLiRjYWNoZUNlbGwodGhpcy5jZWxscy5wb3AoKSl9LHRoaXMucHVzaD1mdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXt0aGlzLmNlbGxzLnB1c2guYXBwbHkodGhpcy5jZWxscyxlKTt2YXIgdD1yLmNyZWF0ZUZyYWdtZW50KHRoaXMuZWxlbWVudCk7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspdC5hcHBlbmRDaGlsZChlW25dLmVsZW1lbnQpO3RoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0KX1lbHNlIHRoaXMuY2VsbHMucHVzaChlKSx0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoZS5lbGVtZW50KX0sdGhpcy51bnNoaWZ0PWZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpe3RoaXMuY2VsbHMudW5zaGlmdC5hcHBseSh0aGlzLmNlbGxzLGUpO3ZhciB0PXIuY3JlYXRlRnJhZ21lbnQodGhpcy5lbGVtZW50KTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0LmFwcGVuZENoaWxkKGVbbl0uZWxlbWVudCk7dGhpcy5lbGVtZW50LmZpcnN0Q2hpbGQ/dGhpcy5lbGVtZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuZWxlbWVudC5maXJzdENoaWxkKTp0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodCl9ZWxzZSB0aGlzLmNlbGxzLnVuc2hpZnQoZSksdGhpcy5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJiZWdpbiIsZS5lbGVtZW50KX0sdGhpcy5sYXN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbHMubGVuZ3RoP3RoaXMuY2VsbHNbdGhpcy5jZWxscy5sZW5ndGgtMV06bnVsbH0sdGhpcy4kY2FjaGVDZWxsPWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybjtlLmVsZW1lbnQucmVtb3ZlKCksdGhpcy5jZWxsQ2FjaGUucHVzaChlKX0sdGhpcy5jcmVhdGVDZWxsPWZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBzPXRoaXMuY2VsbENhY2hlLnBvcCgpO2lmKCFzKXt2YXIgbz1yLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2kmJmkobyksdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKG8pLHM9e2VsZW1lbnQ6byx0ZXh0OiIiLHJvdzplfX1yZXR1cm4gcy5yb3c9ZSxzfX0pLmNhbGwoaS5wcm90b3R5cGUpLHQuTGluZXM9aX0pLGFjZS5kZWZpbmUoImFjZS9sYXllci9ndXR0ZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL2xheWVyL2xpbmVzIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBmKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKTtlLmFwcGVuZENoaWxkKHQpO3ZhciBuPXIuY3JlYXRlRWxlbWVudCgic3BhbiIpO3JldHVybiBlLmFwcGVuZENoaWxkKG4pLGV9dmFyIHI9ZSgiLi4vbGliL2RvbSIpLGk9ZSgiLi4vbGliL29vcCIpLHM9ZSgiLi4vbGliL2xhbmciKSxvPWUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHU9ZSgiLi9saW5lcyIpLkxpbmVzLGE9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50PXIuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX2xheWVyIGFjZV9ndXR0ZXItbGF5ZXIiLGUuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KSx0aGlzLnNldFNob3dGb2xkV2lkZ2V0cyh0aGlzLiRzaG93Rm9sZFdpZGdldHMpLHRoaXMuZ3V0dGVyV2lkdGg9MCx0aGlzLiRhbm5vdGF0aW9ucz1bXSx0aGlzLiR1cGRhdGVBbm5vdGF0aW9ucz10aGlzLiR1cGRhdGVBbm5vdGF0aW9ucy5iaW5kKHRoaXMpLHRoaXMuJGxpbmVzPW5ldyB1KHRoaXMuZWxlbWVudCksdGhpcy4kbGluZXMuJG9mZnNldENvZWZmaWNpZW50PTF9OyhmdW5jdGlvbigpe2kuaW1wbGVtZW50KHRoaXMsbyksdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy4kdXBkYXRlQW5ub3RhdGlvbnMpLHRoaXMuc2Vzc2lvbj1lLGUmJmUub24oImNoYW5nZSIsdGhpcy4kdXBkYXRlQW5ub3RhdGlvbnMpfSx0aGlzLmFkZEd1dHRlckRlY29yYXRpb249ZnVuY3Rpb24oZSx0KXt3aW5kb3cuY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oImRlcHJlY2F0ZWQgdXNlIHNlc3Npb24uYWRkR3V0dGVyRGVjb3JhdGlvbiIpLHRoaXMuc2Vzc2lvbi5hZGRHdXR0ZXJEZWNvcmF0aW9uKGUsdCl9LHRoaXMucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbj1mdW5jdGlvbihlLHQpe3dpbmRvdy5jb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybigiZGVwcmVjYXRlZCB1c2Ugc2Vzc2lvbi5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uIiksdGhpcy5zZXNzaW9uLnJlbW92ZUd1dHRlckRlY29yYXRpb24oZSx0KX0sdGhpcy5zZXRBbm5vdGF0aW9ucz1mdW5jdGlvbihlKXt0aGlzLiRhbm5vdGF0aW9ucz1bXTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZVt0XSxyPW4ucm93LGk9dGhpcy4kYW5ub3RhdGlvbnNbcl07aXx8KGk9dGhpcy4kYW5ub3RhdGlvbnNbcl09e3RleHQ6W119KTt2YXIgbz1uLnRleHQ7bz1vP3MuZXNjYXBlSFRNTChvKTpuLmh0bWx8fCIiLGkudGV4dC5pbmRleE9mKG8pPT09LTEmJmkudGV4dC5wdXNoKG8pO3ZhciB1PW4udHlwZTt1PT0iZXJyb3IiP2kuY2xhc3NOYW1lPSIgYWNlX2Vycm9yIjp1PT0id2FybmluZyImJmkuY2xhc3NOYW1lIT0iIGFjZV9lcnJvciI/aS5jbGFzc05hbWU9IiBhY2Vfd2FybmluZyI6dT09ImluZm8iJiYhaS5jbGFzc05hbWUmJihpLmNsYXNzTmFtZT0iIGFjZV9pbmZvIil9fSx0aGlzLiR1cGRhdGVBbm5vdGF0aW9ucz1mdW5jdGlvbihlKXtpZighdGhpcy4kYW5ub3RhdGlvbnMubGVuZ3RoKXJldHVybjt2YXIgdD1lLnN0YXJ0LnJvdyxuPWUuZW5kLnJvdy10O2lmKG4hPT0wKWlmKGUuYWN0aW9uPT0icmVtb3ZlIil0aGlzLiRhbm5vdGF0aW9ucy5zcGxpY2UodCxuKzEsbnVsbCk7ZWxzZXt2YXIgcj1uZXcgQXJyYXkobisxKTtyLnVuc2hpZnQodCwxKSx0aGlzLiRhbm5vdGF0aW9ucy5zcGxpY2UuYXBwbHkodGhpcy4kYW5ub3RhdGlvbnMscil9fSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLmNvbmZpZz1lO3ZhciB0PXRoaXMuc2Vzc2lvbixuPWUuZmlyc3RSb3cscj1NYXRoLm1pbihlLmxhc3RSb3crZS5ndXR0ZXJPZmZzZXQsdC5nZXRMZW5ndGgoKS0xKTt0aGlzLm9sZExhc3RSb3c9cix0aGlzLmNvbmZpZz1lLHRoaXMuJGxpbmVzLm1vdmVDb250YWluZXIoZSksdGhpcy4kdXBkYXRlQ3Vyc29yUm93KCk7dmFyIGk9dC5nZXROZXh0Rm9sZExpbmUobikscz1pP2kuc3RhcnQucm93OkluZmluaXR5LG89bnVsbCx1PS0xLGE9bjtmb3IoOzspe2E+cyYmKGE9aS5lbmQucm93KzEsaT10LmdldE5leHRGb2xkTGluZShhLGkpLHM9aT9pLnN0YXJ0LnJvdzpJbmZpbml0eSk7aWYoYT5yKXt3aGlsZSh0aGlzLiRsaW5lcy5nZXRMZW5ndGgoKT51KzEpdGhpcy4kbGluZXMucG9wKCk7YnJlYWt9bz10aGlzLiRsaW5lcy5nZXQoKyt1KSxvP28ucm93PWE6KG89dGhpcy4kbGluZXMuY3JlYXRlQ2VsbChhLGUsdGhpcy5zZXNzaW9uLGYpLHRoaXMuJGxpbmVzLnB1c2gobykpLHRoaXMuJHJlbmRlckNlbGwobyxlLGksYSksYSsrfXRoaXMuX3NpZ25hbCgiYWZ0ZXJSZW5kZXIiKSx0aGlzLiR1cGRhdGVHdXR0ZXJXaWR0aChlKX0sdGhpcy4kdXBkYXRlR3V0dGVyV2lkdGg9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uLG49dC5ndXR0ZXJSZW5kZXJlcnx8dGhpcy4kcmVuZGVyZXIscj10LiRmaXJzdExpbmVOdW1iZXIsaT10aGlzLiRsaW5lcy5sYXN0KCk/dGhpcy4kbGluZXMubGFzdCgpLnRleHQ6IiI7aWYodGhpcy4kZml4ZWRXaWR0aHx8dC4kdXNlV3JhcE1vZGUpaT10LmdldExlbmd0aCgpK3ItMTt2YXIgcz1uP24uZ2V0V2lkdGgodCxpLGUpOmkudG9TdHJpbmcoKS5sZW5ndGgqZS5jaGFyYWN0ZXJXaWR0aCxvPXRoaXMuJHBhZGRpbmd8fHRoaXMuJGNvbXB1dGVQYWRkaW5nKCk7cys9by5sZWZ0K28ucmlnaHQscyE9PXRoaXMuZ3V0dGVyV2lkdGgmJiFpc05hTihzKSYmKHRoaXMuZ3V0dGVyV2lkdGg9cyx0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5zdHlsZS53aWR0aD10aGlzLmVsZW1lbnQuc3R5bGUud2lkdGg9TWF0aC5jZWlsKHRoaXMuZ3V0dGVyV2lkdGgpKyJweCIsdGhpcy5fc2lnbmFsKCJjaGFuZ2VHdXR0ZXJXaWR0aCIscykpfSx0aGlzLiR1cGRhdGVDdXJzb3JSb3c9ZnVuY3Rpb24oKXtpZighdGhpcy4kaGlnaGxpZ2h0R3V0dGVyTGluZSlyZXR1cm47dmFyIGU9dGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5nZXRDdXJzb3IoKTtpZih0aGlzLiRjdXJzb3JSb3c9PT1lLnJvdylyZXR1cm47dGhpcy4kY3Vyc29yUm93PWUucm93fSx0aGlzLnVwZGF0ZUxpbmVIaWdobGlnaHQ9ZnVuY3Rpb24oKXtpZighdGhpcy4kaGlnaGxpZ2h0R3V0dGVyTGluZSlyZXR1cm47dmFyIGU9dGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5jdXJzb3Iucm93O3RoaXMuJGN1cnNvclJvdz1lO2lmKHRoaXMuJGN1cnNvckNlbGwmJnRoaXMuJGN1cnNvckNlbGwucm93PT1lKXJldHVybjt0aGlzLiRjdXJzb3JDZWxsJiYodGhpcy4kY3Vyc29yQ2VsbC5lbGVtZW50LmNsYXNzTmFtZT10aGlzLiRjdXJzb3JDZWxsLmVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoImFjZV9ndXR0ZXItYWN0aXZlLWxpbmUgIiwiIikpO3ZhciB0PXRoaXMuJGxpbmVzLmNlbGxzO3RoaXMuJGN1cnNvckNlbGw9bnVsbDtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtpZihyLnJvdz49dGhpcy4kY3Vyc29yUm93KXtpZihyLnJvdz50aGlzLiRjdXJzb3JSb3cpe3ZhciBpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkTGluZSh0aGlzLiRjdXJzb3JSb3cpO2lmKCEobj4wJiZpJiZpLnN0YXJ0LnJvdz09dFtuLTFdLnJvdykpYnJlYWs7cj10W24tMV19ci5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX2d1dHRlci1hY3RpdmUtbGluZSAiK3IuZWxlbWVudC5jbGFzc05hbWUsdGhpcy4kY3Vyc29yQ2VsbD1yO2JyZWFrfX19LHRoaXMuc2Nyb2xsTGluZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jb25maWc7dGhpcy5jb25maWc9ZSx0aGlzLiR1cGRhdGVDdXJzb3JSb3coKTtpZih0aGlzLiRsaW5lcy5wYWdlQ2hhbmdlZCh0LGUpKXJldHVybiB0aGlzLnVwZGF0ZShlKTt0aGlzLiRsaW5lcy5tb3ZlQ29udGFpbmVyKGUpO3ZhciBuPU1hdGgubWluKGUubGFzdFJvdytlLmd1dHRlck9mZnNldCx0aGlzLnNlc3Npb24uZ2V0TGVuZ3RoKCktMSkscj10aGlzLm9sZExhc3RSb3c7dGhpcy5vbGRMYXN0Um93PW47aWYoIXR8fHI8ZS5maXJzdFJvdylyZXR1cm4gdGhpcy51cGRhdGUoZSk7aWYobjx0LmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShlKTtpZih0LmZpcnN0Um93PGUuZmlyc3RSb3cpZm9yKHZhciBpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkZWRSb3dDb3VudCh0LmZpcnN0Um93LGUuZmlyc3RSb3ctMSk7aT4wO2ktLSl0aGlzLiRsaW5lcy5zaGlmdCgpO2lmKHI+bilmb3IodmFyIGk9dGhpcy5zZXNzaW9uLmdldEZvbGRlZFJvd0NvdW50KG4rMSxyKTtpPjA7aS0tKXRoaXMuJGxpbmVzLnBvcCgpO2UuZmlyc3RSb3c8dC5maXJzdFJvdyYmdGhpcy4kbGluZXMudW5zaGlmdCh0aGlzLiRyZW5kZXJMaW5lcyhlLGUuZmlyc3RSb3csdC5maXJzdFJvdy0xKSksbj5yJiZ0aGlzLiRsaW5lcy5wdXNoKHRoaXMuJHJlbmRlckxpbmVzKGUscisxLG4pKSx0aGlzLnVwZGF0ZUxpbmVIaWdobGlnaHQoKSx0aGlzLl9zaWduYWwoImFmdGVyUmVuZGVyIiksdGhpcy4kdXBkYXRlR3V0dGVyV2lkdGgoZSl9LHRoaXMuJHJlbmRlckxpbmVzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxpPXQscz10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKGkpLG89cz9zLnN0YXJ0LnJvdzpJbmZpbml0eTtmb3IoOzspe2k+byYmKGk9cy5lbmQucm93KzEscz10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKGkscyksbz1zP3Muc3RhcnQucm93OkluZmluaXR5KTtpZihpPm4pYnJlYWs7dmFyIHU9dGhpcy4kbGluZXMuY3JlYXRlQ2VsbChpLGUsdGhpcy5zZXNzaW9uLGYpO3RoaXMuJHJlbmRlckNlbGwodSxlLHMsaSksci5wdXNoKHUpLGkrK31yZXR1cm4gcn0sdGhpcy4kcmVuZGVyQ2VsbD1mdW5jdGlvbihlLHQsbixpKXt2YXIgcz1lLmVsZW1lbnQsbz10aGlzLnNlc3Npb24sdT1zLmNoaWxkTm9kZXNbMF0sYT1zLmNoaWxkTm9kZXNbMV0sZj1vLiRmaXJzdExpbmVOdW1iZXIsbD1vLiRicmVha3BvaW50cyxjPW8uJGRlY29yYXRpb25zLGg9by5ndXR0ZXJSZW5kZXJlcnx8dGhpcy4kcmVuZGVyZXIscD10aGlzLiRzaG93Rm9sZFdpZGdldHMmJm8uZm9sZFdpZGdldHMsZD1uP24uc3RhcnQucm93Ok51bWJlci5NQVhfVkFMVUUsdj0iYWNlX2d1dHRlci1jZWxsICI7dGhpcy4kaGlnaGxpZ2h0R3V0dGVyTGluZSYmKGk9PXRoaXMuJGN1cnNvclJvd3x8biYmaTx0aGlzLiRjdXJzb3JSb3cmJmk+PWQmJnRoaXMuJGN1cnNvclJvdzw9bi5lbmQucm93KSYmKHYrPSJhY2VfZ3V0dGVyLWFjdGl2ZS1saW5lICIsdGhpcy4kY3Vyc29yQ2VsbCE9ZSYmKHRoaXMuJGN1cnNvckNlbGwmJih0aGlzLiRjdXJzb3JDZWxsLmVsZW1lbnQuY2xhc3NOYW1lPXRoaXMuJGN1cnNvckNlbGwuZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZSgiYWNlX2d1dHRlci1hY3RpdmUtbGluZSAiLCIiKSksdGhpcy4kY3Vyc29yQ2VsbD1lKSksbFtpXSYmKHYrPWxbaV0pLGNbaV0mJih2Kz1jW2ldKSx0aGlzLiRhbm5vdGF0aW9uc1tpXSYmKHYrPXRoaXMuJGFubm90YXRpb25zW2ldLmNsYXNzTmFtZSkscy5jbGFzc05hbWUhPXYmJihzLmNsYXNzTmFtZT12KTtpZihwKXt2YXIgbT1wW2ldO209PW51bGwmJihtPXBbaV09by5nZXRGb2xkV2lkZ2V0KGkpKX1pZihtKXt2YXIgdj0iYWNlX2ZvbGQtd2lkZ2V0IGFjZV8iK207bT09InN0YXJ0IiYmaT09ZCYmaTxuLmVuZC5yb3c/dis9IiBhY2VfY2xvc2VkIjp2Kz0iIGFjZV9vcGVuIixhLmNsYXNzTmFtZSE9diYmKGEuY2xhc3NOYW1lPXYpO3ZhciBnPXQubGluZUhlaWdodCsicHgiO3Iuc2V0U3R5bGUoYS5zdHlsZSwiaGVpZ2h0IixnKSxyLnNldFN0eWxlKGEuc3R5bGUsImRpc3BsYXkiLCJpbmxpbmUtYmxvY2siKX1lbHNlIGEmJnIuc2V0U3R5bGUoYS5zdHlsZSwiZGlzcGxheSIsIm5vbmUiKTt2YXIgeT0oaD9oLmdldFRleHQobyxpKTppK2YpLnRvU3RyaW5nKCk7cmV0dXJuIHkhPT11LmRhdGEmJih1LmRhdGE9eSksci5zZXRTdHlsZShlLmVsZW1lbnQuc3R5bGUsImhlaWdodCIsdGhpcy4kbGluZXMuY29tcHV0ZUxpbmVIZWlnaHQoaSx0LG8pKyJweCIpLHIuc2V0U3R5bGUoZS5lbGVtZW50LnN0eWxlLCJ0b3AiLHRoaXMuJGxpbmVzLmNvbXB1dGVMaW5lVG9wKGksdCxvKSsicHgiKSxlLnRleHQ9eSxlfSx0aGlzLiRmaXhlZFdpZHRoPSExLHRoaXMuJGhpZ2hsaWdodEd1dHRlckxpbmU9ITAsdGhpcy4kcmVuZGVyZXI9IiIsdGhpcy5zZXRIaWdobGlnaHRHdXR0ZXJMaW5lPWZ1bmN0aW9uKGUpe3RoaXMuJGhpZ2hsaWdodEd1dHRlckxpbmU9ZX0sdGhpcy4kc2hvd0xpbmVOdW1iZXJzPSEwLHRoaXMuJHJlbmRlcmVyPSIiLHRoaXMuc2V0U2hvd0xpbmVOdW1iZXJzPWZ1bmN0aW9uKGUpe3RoaXMuJHJlbmRlcmVyPSFlJiZ7Z2V0V2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZ2V0VGV4dDpmdW5jdGlvbigpe3JldHVybiIifX19LHRoaXMuZ2V0U2hvd0xpbmVOdW1iZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNob3dMaW5lTnVtYmVyc30sdGhpcy4kc2hvd0ZvbGRXaWRnZXRzPSEwLHRoaXMuc2V0U2hvd0ZvbGRXaWRnZXRzPWZ1bmN0aW9uKGUpe2U/ci5hZGRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9mb2xkaW5nLWVuYWJsZWQiKTpyLnJlbW92ZUNzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX2ZvbGRpbmctZW5hYmxlZCIpLHRoaXMuJHNob3dGb2xkV2lkZ2V0cz1lLHRoaXMuJHBhZGRpbmc9bnVsbH0sdGhpcy5nZXRTaG93Rm9sZFdpZGdldHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2hvd0ZvbGRXaWRnZXRzfSx0aGlzLiRjb21wdXRlUGFkZGluZz1mdW5jdGlvbigpe2lmKCF0aGlzLmVsZW1lbnQuZmlyc3RDaGlsZClyZXR1cm57bGVmdDowLHJpZ2h0OjB9O3ZhciBlPXIuY29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQuZmlyc3RDaGlsZCk7cmV0dXJuIHRoaXMuJHBhZGRpbmc9e30sdGhpcy4kcGFkZGluZy5sZWZ0PShwYXJzZUludChlLmJvcmRlckxlZnRXaWR0aCl8fDApKyhwYXJzZUludChlLnBhZGRpbmdMZWZ0KXx8MCkrMSx0aGlzLiRwYWRkaW5nLnJpZ2h0PShwYXJzZUludChlLmJvcmRlclJpZ2h0V2lkdGgpfHwwKSsocGFyc2VJbnQoZS5wYWRkaW5nUmlnaHQpfHwwKSx0aGlzLiRwYWRkaW5nfSx0aGlzLmdldFJlZ2lvbj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRwYWRkaW5nfHx0aGlzLiRjb21wdXRlUGFkZGluZygpLG49dGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKGUueDx0LmxlZnQrbi5sZWZ0KXJldHVybiJtYXJrZXJzIjtpZih0aGlzLiRzaG93Rm9sZFdpZGdldHMmJmUueD5uLnJpZ2h0LXQucmlnaHQpcmV0dXJuImZvbGRXaWRnZXRzIn19KS5jYWxsKGEucHJvdG90eXBlKSx0Lkd1dHRlcj1hfSksYWNlLmRlZmluZSgiYWNlL2xheWVyL21hcmtlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9yYW5nZSIpLlJhbmdlLGk9ZSgiLi4vbGliL2RvbSIpLHM9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50PWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX2xheWVyIGFjZV9tYXJrZXItbGF5ZXIiLGUuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KX07KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbixyKXtyZXR1cm4oZT8xOjApfCh0PzI6MCl8KG4/NDowKXwocj84OjApfXRoaXMuJHBhZGRpbmc9MCx0aGlzLnNldFBhZGRpbmc9ZnVuY3Rpb24oZSl7dGhpcy4kcGFkZGluZz1lfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uPWV9LHRoaXMuc2V0TWFya2Vycz1mdW5jdGlvbihlKXt0aGlzLm1hcmtlcnM9ZX0sdGhpcy5lbHQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmkhPS0xJiZ0aGlzLmVsZW1lbnQuY2hpbGROb2Rlc1t0aGlzLmldO24/dGhpcy5pKys6KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKG4pLHRoaXMuaT0tMSksbi5zdHlsZS5jc3NUZXh0PXQsbi5jbGFzc05hbWU9ZX0sdGhpcy51cGRhdGU9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuO3RoaXMuY29uZmlnPWUsdGhpcy5pPTA7dmFyIHQ7Zm9yKHZhciBuIGluIHRoaXMubWFya2Vycyl7dmFyIHI9dGhpcy5tYXJrZXJzW25dO2lmKCFyLnJhbmdlKXtyLnVwZGF0ZSh0LHRoaXMsdGhpcy5zZXNzaW9uLGUpO2NvbnRpbnVlfXZhciBpPXIucmFuZ2UuY2xpcFJvd3MoZS5maXJzdFJvdyxlLmxhc3RSb3cpO2lmKGkuaXNFbXB0eSgpKWNvbnRpbnVlO2k9aS50b1NjcmVlblJhbmdlKHRoaXMuc2Vzc2lvbik7aWYoci5yZW5kZXJlcil7dmFyIHM9dGhpcy4kZ2V0VG9wKGkuc3RhcnQucm93LGUpLG89dGhpcy4kcGFkZGluZytpLnN0YXJ0LmNvbHVtbiplLmNoYXJhY3RlcldpZHRoO3IucmVuZGVyZXIodCxpLG8scyxlKX1lbHNlIHIudHlwZT09ImZ1bGxMaW5lIj90aGlzLmRyYXdGdWxsTGluZU1hcmtlcih0LGksci5jbGF6eixlKTpyLnR5cGU9PSJzY3JlZW5MaW5lIj90aGlzLmRyYXdTY3JlZW5MaW5lTWFya2VyKHQsaSxyLmNsYXp6LGUpOmkuaXNNdWx0aUxpbmUoKT9yLnR5cGU9PSJ0ZXh0Ij90aGlzLmRyYXdUZXh0TWFya2VyKHQsaSxyLmNsYXp6LGUpOnRoaXMuZHJhd011bHRpTGluZU1hcmtlcih0LGksci5jbGF6eixlKTp0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyKHQsaSxyLmNsYXp6KyIgYWNlX3N0YXJ0IisiIGFjZV9icjE1IixlKX1pZih0aGlzLmkhPS0xKXdoaWxlKHRoaXMuaTx0aGlzLmVsZW1lbnQuY2hpbGRFbGVtZW50Q291bnQpdGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudC5sYXN0Q2hpbGQpfSx0aGlzLiRnZXRUb3A9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZS10LmZpcnN0Um93U2NyZWVuKSp0LmxpbmVIZWlnaHR9LHRoaXMuZHJhd1RleHRNYXJrZXI9ZnVuY3Rpb24odCxuLGkscyxvKXt2YXIgdT10aGlzLnNlc3Npb24sYT1uLnN0YXJ0LnJvdyxmPW4uZW5kLnJvdyxsPWEsYz0wLGg9MCxwPXUuZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbihsKSxkPW5ldyByKGwsbi5zdGFydC5jb2x1bW4sbCxoKTtmb3IoO2w8PWY7bCsrKWQuc3RhcnQucm93PWQuZW5kLnJvdz1sLGQuc3RhcnQuY29sdW1uPWw9PWE/bi5zdGFydC5jb2x1bW46dS5nZXRSb3dXcmFwSW5kZW50KGwpLGQuZW5kLmNvbHVtbj1wLGM9aCxoPXAscD1sKzE8Zj91LmdldFNjcmVlbkxhc3RSb3dDb2x1bW4obCsxKTpsPT1mPzA6bi5lbmQuY29sdW1uLHRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXIodCxkLGkrKGw9PWE/IiBhY2Vfc3RhcnQiOiIiKSsiIGFjZV9iciIrZShsPT1hfHxsPT1hKzEmJm4uc3RhcnQuY29sdW1uLGM8aCxoPnAsbD09ZikscyxsPT1mPzA6MSxvKX0sdGhpcy5kcmF3TXVsdGlMaW5lTWFya2VyPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9dGhpcy4kcGFkZGluZyxvPXIubGluZUhlaWdodCx1PXRoaXMuJGdldFRvcCh0LnN0YXJ0LnJvdyxyKSxhPXMrdC5zdGFydC5jb2x1bW4qci5jaGFyYWN0ZXJXaWR0aDtpPWl8fCIiO2lmKHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuaXNCaWRpUm93KHQuc3RhcnQucm93KSl7dmFyIGY9dC5jbG9uZSgpO2YuZW5kLnJvdz1mLnN0YXJ0LnJvdyxmLmVuZC5jb2x1bW49dGhpcy5zZXNzaW9uLmdldExpbmUoZi5zdGFydC5yb3cpLmxlbmd0aCx0aGlzLmRyYXdCaWRpU2luZ2xlTGluZU1hcmtlcihlLGYsbisiIGFjZV9icjEgYWNlX3N0YXJ0IixyLG51bGwsaSl9ZWxzZSB0aGlzLmVsdChuKyIgYWNlX2JyMSBhY2Vfc3RhcnQiLCJoZWlnaHQ6IitvKyJweDsiKyJyaWdodDowOyIrInRvcDoiK3UrInB4O2xlZnQ6IithKyJweDsiKyhpfHwiIikpO2lmKHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuaXNCaWRpUm93KHQuZW5kLnJvdykpe3ZhciBmPXQuY2xvbmUoKTtmLnN0YXJ0LnJvdz1mLmVuZC5yb3csZi5zdGFydC5jb2x1bW49MCx0aGlzLmRyYXdCaWRpU2luZ2xlTGluZU1hcmtlcihlLGYsbisiIGFjZV9icjEyIixyLG51bGwsaSl9ZWxzZXt1PXRoaXMuJGdldFRvcCh0LmVuZC5yb3cscik7dmFyIGw9dC5lbmQuY29sdW1uKnIuY2hhcmFjdGVyV2lkdGg7dGhpcy5lbHQobisiIGFjZV9icjEyIiwiaGVpZ2h0OiIrbysicHg7Iisid2lkdGg6IitsKyJweDsiKyJ0b3A6Iit1KyJweDsiKyJsZWZ0OiIrcysicHg7IisoaXx8IiIpKX1vPSh0LmVuZC5yb3ctdC5zdGFydC5yb3ctMSkqci5saW5lSGVpZ2h0O2lmKG88PTApcmV0dXJuO3U9dGhpcy4kZ2V0VG9wKHQuc3RhcnQucm93KzEscik7dmFyIGM9KHQuc3RhcnQuY29sdW1uPzE6MCl8KHQuZW5kLmNvbHVtbj8wOjgpO3RoaXMuZWx0KG4rKGM/IiBhY2VfYnIiK2M6IiIpLCJoZWlnaHQ6IitvKyJweDsiKyJyaWdodDowOyIrInRvcDoiK3UrInB4OyIrImxlZnQ6IitzKyJweDsiKyhpfHwiIikpfSx0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyPWZ1bmN0aW9uKGUsdCxuLHIsaSxzKXtpZih0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmlzQmlkaVJvdyh0LnN0YXJ0LnJvdykpcmV0dXJuIHRoaXMuZHJhd0JpZGlTaW5nbGVMaW5lTWFya2VyKGUsdCxuLHIsaSxzKTt2YXIgbz1yLmxpbmVIZWlnaHQsdT0odC5lbmQuY29sdW1uKyhpfHwwKS10LnN0YXJ0LmNvbHVtbikqci5jaGFyYWN0ZXJXaWR0aCxhPXRoaXMuJGdldFRvcCh0LnN0YXJ0LnJvdyxyKSxmPXRoaXMuJHBhZGRpbmcrdC5zdGFydC5jb2x1bW4qci5jaGFyYWN0ZXJXaWR0aDt0aGlzLmVsdChuLCJoZWlnaHQ6IitvKyJweDsiKyJ3aWR0aDoiK3UrInB4OyIrInRvcDoiK2ErInB4OyIrImxlZnQ6IitmKyJweDsiKyhzfHwiIikpfSx0aGlzLmRyYXdCaWRpU2luZ2xlTGluZU1hcmtlcj1mdW5jdGlvbihlLHQsbixyLGkscyl7dmFyIG89ci5saW5lSGVpZ2h0LHU9dGhpcy4kZ2V0VG9wKHQuc3RhcnQucm93LHIpLGE9dGhpcy4kcGFkZGluZyxmPXRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuZ2V0U2VsZWN0aW9ucyh0LnN0YXJ0LmNvbHVtbix0LmVuZC5jb2x1bW4pO2YuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzLmVsdChuLCJoZWlnaHQ6IitvKyJweDsiKyJ3aWR0aDoiK2Uud2lkdGgrKGl8fDApKyJweDsiKyJ0b3A6Iit1KyJweDsiKyJsZWZ0OiIrKGErZS5sZWZ0KSsicHg7Iisoc3x8IiIpKX0sdGhpcyl9LHRoaXMuZHJhd0Z1bGxMaW5lTWFya2VyPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9dGhpcy4kZ2V0VG9wKHQuc3RhcnQucm93LHIpLG89ci5saW5lSGVpZ2h0O3Quc3RhcnQucm93IT10LmVuZC5yb3cmJihvKz10aGlzLiRnZXRUb3AodC5lbmQucm93LHIpLXMpLHRoaXMuZWx0KG4sImhlaWdodDoiK28rInB4OyIrInRvcDoiK3MrInB4OyIrImxlZnQ6MDtyaWdodDowOyIrKGl8fCIiKSl9LHRoaXMuZHJhd1NjcmVlbkxpbmVNYXJrZXI9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz10aGlzLiRnZXRUb3AodC5zdGFydC5yb3csciksbz1yLmxpbmVIZWlnaHQ7dGhpcy5lbHQobiwiaGVpZ2h0OiIrbysicHg7IisidG9wOiIrcysicHg7IisibGVmdDowO3JpZ2h0OjA7IisoaXx8IiIpKX19KS5jYWxsKHMucHJvdG90eXBlKSx0Lk1hcmtlcj1zfSksYWNlLmRlZmluZSgiYWNlL2xheWVyL3RleHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xheWVyL2xpbmVzIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvb29wIiksaT1lKCIuLi9saWIvZG9tIikscz1lKCIuLi9saWIvbGFuZyIpLG89ZSgiLi9saW5lcyIpLkxpbmVzLHU9ZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsYT1mdW5jdGlvbihlKXt0aGlzLmRvbT1pLHRoaXMuZWxlbWVudD10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfbGF5ZXIgYWNlX3RleHQtbGF5ZXIiLGUuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KSx0aGlzLiR1cGRhdGVFb2xDaGFyPXRoaXMuJHVwZGF0ZUVvbENoYXIuYmluZCh0aGlzKSx0aGlzLiRsaW5lcz1uZXcgbyh0aGlzLmVsZW1lbnQpfTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLHUpLHRoaXMuRU9GX0NIQVI9Ilx1MDBiNiIsdGhpcy5FT0xfQ0hBUl9MRj0iXHUwMGFjIix0aGlzLkVPTF9DSEFSX0NSTEY9Ilx1MDBhNCIsdGhpcy5FT0xfQ0hBUj10aGlzLkVPTF9DSEFSX0xGLHRoaXMuVEFCX0NIQVI9Ilx1MjAxNCIsdGhpcy5TUEFDRV9DSEFSPSJcdTAwYjciLHRoaXMuJHBhZGRpbmc9MCx0aGlzLk1BWF9MSU5FX0xFTkdUSD0xZTQsdGhpcy4kdXBkYXRlRW9sQ2hhcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbi5kb2MsdD1lLmdldE5ld0xpbmVDaGFyYWN0ZXIoKT09IlxuIiYmZS5nZXROZXdMaW5lTW9kZSgpIT0id2luZG93cyIsbj10P3RoaXMuRU9MX0NIQVJfTEY6dGhpcy5FT0xfQ0hBUl9DUkxGO2lmKHRoaXMuRU9MX0NIQVIhPW4pcmV0dXJuIHRoaXMuRU9MX0NIQVI9biwhMH0sdGhpcy5zZXRQYWRkaW5nPWZ1bmN0aW9uKGUpe3RoaXMuJHBhZGRpbmc9ZSx0aGlzLmVsZW1lbnQuc3R5bGUubWFyZ2luPSIwICIrZSsicHgifSx0aGlzLmdldExpbmVIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZm9udE1ldHJpY3MuJGNoYXJhY3RlclNpemUuaGVpZ2h0fHwwfSx0aGlzLmdldENoYXJhY3RlcldpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZvbnRNZXRyaWNzLiRjaGFyYWN0ZXJTaXplLndpZHRofHwwfSx0aGlzLiRzZXRGb250TWV0cmljcz1mdW5jdGlvbihlKXt0aGlzLiRmb250TWV0cmljcz1lLHRoaXMuJGZvbnRNZXRyaWNzLm9uKCJjaGFuZ2VDaGFyYWN0ZXJTaXplIixmdW5jdGlvbihlKXt0aGlzLl9zaWduYWwoImNoYW5nZUNoYXJhY3RlclNpemUiLGUpfS5iaW5kKHRoaXMpKSx0aGlzLiRwb2xsU2l6ZUNoYW5nZXMoKX0sdGhpcy5jaGVja0ZvclNpemVDaGFuZ2VzPWZ1bmN0aW9uKCl7dGhpcy4kZm9udE1ldHJpY3MuY2hlY2tGb3JTaXplQ2hhbmdlcygpfSx0aGlzLiRwb2xsU2l6ZUNoYW5nZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXI9dGhpcy4kZm9udE1ldHJpY3MuJHBvbGxTaXplQ2hhbmdlcygpfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uPWUsZSYmdGhpcy4kY29tcHV0ZVRhYlN0cmluZygpfSx0aGlzLnNob3dJbnZpc2libGVzPSExLHRoaXMuc2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc2hvd0ludmlzaWJsZXM9PWU/ITE6KHRoaXMuc2hvd0ludmlzaWJsZXM9ZSx0aGlzLiRjb21wdXRlVGFiU3RyaW5nKCksITApfSx0aGlzLmRpc3BsYXlJbmRlbnRHdWlkZXM9ITAsdGhpcy5zZXREaXNwbGF5SW5kZW50R3VpZGVzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRpc3BsYXlJbmRlbnRHdWlkZXM9PWU/ITE6KHRoaXMuZGlzcGxheUluZGVudEd1aWRlcz1lLHRoaXMuJGNvbXB1dGVUYWJTdHJpbmcoKSwhMCl9LHRoaXMuJHRhYlN0cmluZ3M9W10sdGhpcy5vbkNoYW5nZVRhYlNpemU9dGhpcy4kY29tcHV0ZVRhYlN0cmluZz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbi5nZXRUYWJTaXplKCk7dGhpcy50YWJTaXplPWU7dmFyIHQ9dGhpcy4kdGFiU3RyaW5ncz1bMF07Zm9yKHZhciBuPTE7bjxlKzE7bisrKWlmKHRoaXMuc2hvd0ludmlzaWJsZXMpe3ZhciByPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtyLmNsYXNzTmFtZT0iYWNlX2ludmlzaWJsZSBhY2VfaW52aXNpYmxlX3RhYiIsci50ZXh0Q29udGVudD1zLnN0cmluZ1JlcGVhdCh0aGlzLlRBQl9DSEFSLG4pLHQucHVzaChyKX1lbHNlIHQucHVzaCh0aGlzLmRvbS5jcmVhdGVUZXh0Tm9kZShzLnN0cmluZ1JlcGVhdCgiICIsbiksdGhpcy5lbGVtZW50KSk7aWYodGhpcy5kaXNwbGF5SW5kZW50R3VpZGVzKXt0aGlzLiRpbmRlbnRHdWlkZVJlPS9cc1xTfCBcdHxcdCB8XHMkLzt2YXIgaT0iYWNlX2luZGVudC1ndWlkZSIsbz0iIix1PSIiO2lmKHRoaXMuc2hvd0ludmlzaWJsZXMpe2krPSIgYWNlX2ludmlzaWJsZSIsbz0iIGFjZV9pbnZpc2libGVfc3BhY2UiLHU9IiBhY2VfaW52aXNpYmxlX3RhYiI7dmFyIGE9cy5zdHJpbmdSZXBlYXQodGhpcy5TUEFDRV9DSEFSLHRoaXMudGFiU2l6ZSksZj1zLnN0cmluZ1JlcGVhdCh0aGlzLlRBQl9DSEFSLHRoaXMudGFiU2l6ZSl9ZWxzZSB2YXIgYT1zLnN0cmluZ1JlcGVhdCgiICIsdGhpcy50YWJTaXplKSxmPWE7dmFyIHI9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO3IuY2xhc3NOYW1lPWkrbyxyLnRleHRDb250ZW50PWEsdGhpcy4kdGFiU3RyaW5nc1siICJdPXI7dmFyIHI9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO3IuY2xhc3NOYW1lPWkrdSxyLnRleHRDb250ZW50PWYsdGhpcy4kdGFiU3RyaW5nc1siCSJdPXJ9fSx0aGlzLnVwZGF0ZUxpbmVzPWZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLmNvbmZpZy5sYXN0Um93IT1lLmxhc3RSb3d8fHRoaXMuY29uZmlnLmZpcnN0Um93IT1lLmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShlKTt0aGlzLmNvbmZpZz1lO3ZhciByPU1hdGgubWF4KHQsZS5maXJzdFJvdyksaT1NYXRoLm1pbihuLGUubGFzdFJvdykscz10aGlzLmVsZW1lbnQuY2hpbGROb2RlcyxvPTA7Zm9yKHZhciB1PWUuZmlyc3RSb3c7dTxyO3UrKyl7dmFyIGE9dGhpcy5zZXNzaW9uLmdldEZvbGRMaW5lKHUpO2lmKGEpe2lmKGEuY29udGFpbnNSb3cocikpe3I9YS5zdGFydC5yb3c7YnJlYWt9dT1hLmVuZC5yb3d9bysrfXZhciBmPSExLHU9cixhPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUodSksbD1hP2Euc3RhcnQucm93OkluZmluaXR5O2Zvcig7Oyl7dT5sJiYodT1hLmVuZC5yb3crMSxhPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUodSxhKSxsPWE/YS5zdGFydC5yb3c6SW5maW5pdHkpO2lmKHU+aSlicmVhazt2YXIgYz1zW28rK107aWYoYyl7dGhpcy5kb20ucmVtb3ZlQ2hpbGRyZW4oYyksdGhpcy4kcmVuZGVyTGluZShjLHUsdT09bD9hOiExKSxmJiYoYy5zdHlsZS50b3A9dGhpcy4kbGluZXMuY29tcHV0ZUxpbmVUb3AodSxlLHRoaXMuc2Vzc2lvbikrInB4Iik7dmFyIGg9ZS5saW5lSGVpZ2h0KnRoaXMuc2Vzc2lvbi5nZXRSb3dMZW5ndGgodSkrInB4IjtjLnN0eWxlLmhlaWdodCE9aCYmKGY9ITAsYy5zdHlsZS5oZWlnaHQ9aCl9dSsrfWlmKGYpd2hpbGUobzx0aGlzLiRsaW5lcy5jZWxscy5sZW5ndGgpe3ZhciBwPXRoaXMuJGxpbmVzLmNlbGxzW28rK107cC5lbGVtZW50LnN0eWxlLnRvcD10aGlzLiRsaW5lcy5jb21wdXRlTGluZVRvcChwLnJvdyxlLHRoaXMuc2Vzc2lvbikrInB4In19LHRoaXMuc2Nyb2xsTGluZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jb25maWc7dGhpcy5jb25maWc9ZTtpZih0aGlzLiRsaW5lcy5wYWdlQ2hhbmdlZCh0LGUpKXJldHVybiB0aGlzLnVwZGF0ZShlKTt0aGlzLiRsaW5lcy5tb3ZlQ29udGFpbmVyKGUpO3ZhciBuPWUubGFzdFJvdyxyPXQ/dC5sYXN0Um93Oi0xO2lmKCF0fHxyPGUuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGUpO2lmKG48dC5maXJzdFJvdylyZXR1cm4gdGhpcy51cGRhdGUoZSk7aWYoIXR8fHQubGFzdFJvdzxlLmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShlKTtpZihlLmxhc3RSb3c8dC5maXJzdFJvdylyZXR1cm4gdGhpcy51cGRhdGUoZSk7aWYodC5maXJzdFJvdzxlLmZpcnN0Um93KWZvcih2YXIgaT10aGlzLnNlc3Npb24uZ2V0Rm9sZGVkUm93Q291bnQodC5maXJzdFJvdyxlLmZpcnN0Um93LTEpO2k+MDtpLS0pdGhpcy4kbGluZXMuc2hpZnQoKTtpZih0Lmxhc3RSb3c+ZS5sYXN0Um93KWZvcih2YXIgaT10aGlzLnNlc3Npb24uZ2V0Rm9sZGVkUm93Q291bnQoZS5sYXN0Um93KzEsdC5sYXN0Um93KTtpPjA7aS0tKXRoaXMuJGxpbmVzLnBvcCgpO2UuZmlyc3RSb3c8dC5maXJzdFJvdyYmdGhpcy4kbGluZXMudW5zaGlmdCh0aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50KGUsZS5maXJzdFJvdyx0LmZpcnN0Um93LTEpKSxlLmxhc3RSb3c+dC5sYXN0Um93JiZ0aGlzLiRsaW5lcy5wdXNoKHRoaXMuJHJlbmRlckxpbmVzRnJhZ21lbnQoZSx0Lmxhc3RSb3crMSxlLmxhc3RSb3cpKX0sdGhpcy4kcmVuZGVyTGluZXNGcmFnbWVudD1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10scz10LG89dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShzKSx1PW8/by5zdGFydC5yb3c6SW5maW5pdHk7Zm9yKDs7KXtzPnUmJihzPW8uZW5kLnJvdysxLG89dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShzLG8pLHU9bz9vLnN0YXJ0LnJvdzpJbmZpbml0eSk7aWYocz5uKWJyZWFrO3ZhciBhPXRoaXMuJGxpbmVzLmNyZWF0ZUNlbGwocyxlLHRoaXMuc2Vzc2lvbiksZj1hLmVsZW1lbnQ7dGhpcy5kb20ucmVtb3ZlQ2hpbGRyZW4oZiksaS5zZXRTdHlsZShmLnN0eWxlLCJoZWlnaHQiLHRoaXMuJGxpbmVzLmNvbXB1dGVMaW5lSGVpZ2h0KHMsZSx0aGlzLnNlc3Npb24pKyJweCIpLGkuc2V0U3R5bGUoZi5zdHlsZSwidG9wIix0aGlzLiRsaW5lcy5jb21wdXRlTGluZVRvcChzLGUsdGhpcy5zZXNzaW9uKSsicHgiKSx0aGlzLiRyZW5kZXJMaW5lKGYscyxzPT11P286ITEpLHRoaXMuJHVzZUxpbmVHcm91cHMoKT9mLmNsYXNzTmFtZT0iYWNlX2xpbmVfZ3JvdXAiOmYuY2xhc3NOYW1lPSJhY2VfbGluZSIsci5wdXNoKGEpLHMrK31yZXR1cm4gcn0sdGhpcy51cGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy4kbGluZXMubW92ZUNvbnRhaW5lcihlKSx0aGlzLmNvbmZpZz1lO3ZhciB0PWUuZmlyc3RSb3csbj1lLmxhc3RSb3cscj10aGlzLiRsaW5lczt3aGlsZShyLmdldExlbmd0aCgpKXIucG9wKCk7ci5wdXNoKHRoaXMuJHJlbmRlckxpbmVzRnJhZ21lbnQoZSx0LG4pKX0sdGhpcy4kdGV4dFRva2VuPXt0ZXh0OiEwLHJwYXJlbjohMCxscGFyZW46ITB9LHRoaXMuJHJlbmRlclRva2VuPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMsbz0vKFx0KXwoICspfChbXHgwMC1ceDFmXHg4MC1ceGEwXHhhZFx1MTY4MFx1MTgwRVx1MjAwMC1cdTIwMGZcdTIwMjhcdTIwMjlcdTIwMkZcdTIwNUZcdUZFRkZcdUZGRjktXHVGRkZDXSspfChcdTMwMDApfChbXHUxMTAwLVx1MTE1Rlx1MTFBMy1cdTExQTdcdTExRkEtXHUxMUZGXHUyMzI5LVx1MjMyQVx1MkU4MC1cdTJFOTlcdTJFOUItXHUyRUYzXHUyRjAwLVx1MkZENVx1MkZGMC1cdTJGRkJcdTMwMDEtXHUzMDNFXHUzMDQxLVx1MzA5Nlx1MzA5OS1cdTMwRkZcdTMxMDUtXHUzMTJEXHUzMTMxLVx1MzE4RVx1MzE5MC1cdTMxQkFcdTMxQzAtXHUzMUUzXHUzMUYwLVx1MzIxRVx1MzIyMC1cdTMyNDdcdTMyNTAtXHUzMkZFXHUzMzAwLVx1NERCRlx1NEUwMC1cdUE0OENcdUE0OTAtXHVBNEM2XHVBOTYwLVx1QTk3Q1x1QUMwMC1cdUQ3QTNcdUQ3QjAtXHVEN0M2XHVEN0NCLVx1RDdGQlx1RjkwMC1cdUZBRkZcdUZFMTAtXHVGRTE5XHVGRTMwLVx1RkU1Mlx1RkU1NC1cdUZFNjZcdUZFNjgtXHVGRTZCXHVGRjAxLVx1RkY2MFx1RkZFMC1cdUZGRTZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXSkvZyx1PXRoaXMuZG9tLmNyZWF0ZUZyYWdtZW50KHRoaXMuZWxlbWVudCksYSxmPTA7d2hpbGUoYT1vLmV4ZWMocikpe3ZhciBsPWFbMV0sYz1hWzJdLGg9YVszXSxwPWFbNF0sZD1hWzVdO2lmKCFpLnNob3dJbnZpc2libGVzJiZjKWNvbnRpbnVlO3ZhciB2PWYhPWEuaW5kZXg/ci5zbGljZShmLGEuaW5kZXgpOiIiO2Y9YS5pbmRleCthWzBdLmxlbmd0aCx2JiZ1LmFwcGVuZENoaWxkKHRoaXMuZG9tLmNyZWF0ZVRleHROb2RlKHYsdGhpcy5lbGVtZW50KSk7aWYobCl7dmFyIG09aS5zZXNzaW9uLmdldFNjcmVlblRhYlNpemUodCthLmluZGV4KTt1LmFwcGVuZENoaWxkKGkuJHRhYlN0cmluZ3NbbV0uY2xvbmVOb2RlKCEwKSksdCs9bS0xfWVsc2UgaWYoYylpZihpLnNob3dJbnZpc2libGVzKXt2YXIgZz10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7Zy5jbGFzc05hbWU9ImFjZV9pbnZpc2libGUgYWNlX2ludmlzaWJsZV9zcGFjZSIsZy50ZXh0Q29udGVudD1zLnN0cmluZ1JlcGVhdChpLlNQQUNFX0NIQVIsYy5sZW5ndGgpLHUuYXBwZW5kQ2hpbGQoZyl9ZWxzZSB1LmFwcGVuZENoaWxkKHRoaXMuY29tLmNyZWF0ZVRleHROb2RlKGMsdGhpcy5lbGVtZW50KSk7ZWxzZSBpZihoKXt2YXIgZz10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7Zy5jbGFzc05hbWU9ImFjZV9pbnZpc2libGUgYWNlX2ludmlzaWJsZV9zcGFjZSBhY2VfaW52YWxpZCIsZy50ZXh0Q29udGVudD1zLnN0cmluZ1JlcGVhdChpLlNQQUNFX0NIQVIsaC5sZW5ndGgpLHUuYXBwZW5kQ2hpbGQoZyl9ZWxzZSBpZihwKXt0Kz0xO3ZhciBnPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtnLnN0eWxlLndpZHRoPWkuY29uZmlnLmNoYXJhY3RlcldpZHRoKjIrInB4IixnLmNsYXNzTmFtZT1pLnNob3dJbnZpc2libGVzPyJhY2VfY2prIGFjZV9pbnZpc2libGUgYWNlX2ludmlzaWJsZV9zcGFjZSI6ImFjZV9jamsiLGcudGV4dENvbnRlbnQ9aS5zaG93SW52aXNpYmxlcz9pLlNQQUNFX0NIQVI6cCx1LmFwcGVuZENoaWxkKGcpfWVsc2UgaWYoZCl7dCs9MTt2YXIgZz10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7Zy5zdHlsZS53aWR0aD1pLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCoyKyJweCIsZy5jbGFzc05hbWU9ImFjZV9jamsiLGcudGV4dENvbnRlbnQ9ZCx1LmFwcGVuZENoaWxkKGcpfX11LmFwcGVuZENoaWxkKHRoaXMuZG9tLmNyZWF0ZVRleHROb2RlKGY/ci5zbGljZShmKTpyLHRoaXMuZWxlbWVudCkpO2lmKCF0aGlzLiR0ZXh0VG9rZW5bbi50eXBlXSl7dmFyIHk9ImFjZV8iK24udHlwZS5yZXBsYWNlKC9cLi9nLCIgYWNlXyIpLGc9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO24udHlwZT09ImZvbGQiJiYoZy5zdHlsZS53aWR0aD1uLnZhbHVlLmxlbmd0aCp0aGlzLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCsicHgiKSxnLmNsYXNzTmFtZT15LGcuYXBwZW5kQ2hpbGQodSksZS5hcHBlbmRDaGlsZChnKX1lbHNlIGUuYXBwZW5kQ2hpbGQodSk7cmV0dXJuIHQrci5sZW5ndGh9LHRoaXMucmVuZGVySW5kZW50R3VpZGU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQuc2VhcmNoKHRoaXMuJGluZGVudEd1aWRlUmUpO2lmKHI8PTB8fHI+PW4pcmV0dXJuIHQ7aWYodFswXT09IiAiKXtyLT1yJXRoaXMudGFiU2l6ZTt2YXIgaT1yL3RoaXMudGFiU2l6ZTtmb3IodmFyIHM9MDtzPGk7cysrKWUuYXBwZW5kQ2hpbGQodGhpcy4kdGFiU3RyaW5nc1siICJdLmNsb25lTm9kZSghMCkpO3JldHVybiB0LnN1YnN0cihyKX1pZih0WzBdPT0iCSIpe2Zvcih2YXIgcz0wO3M8cjtzKyspZS5hcHBlbmRDaGlsZCh0aGlzLiR0YWJTdHJpbmdzWyIJIl0uY2xvbmVOb2RlKCEwKSk7cmV0dXJuIHQuc3Vic3RyKHIpfXJldHVybiB0fSx0aGlzLiRjcmVhdGVMaW5lRWxlbWVudD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gdC5jbGFzc05hbWU9ImFjZV9saW5lIix0LnN0eWxlLmhlaWdodD10aGlzLmNvbmZpZy5saW5lSGVpZ2h0KyJweCIsdH0sdGhpcy4kcmVuZGVyV3JhcHBlZExpbmU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPTAsaT0wLG89blswXSx1PTAsYT10aGlzLiRjcmVhdGVMaW5lRWxlbWVudCgpO2UuYXBwZW5kQ2hpbGQoYSk7Zm9yKHZhciBmPTA7Zjx0Lmxlbmd0aDtmKyspe3ZhciBsPXRbZl0sYz1sLnZhbHVlO2lmKGY9PTAmJnRoaXMuZGlzcGxheUluZGVudEd1aWRlcyl7cj1jLmxlbmd0aCxjPXRoaXMucmVuZGVySW5kZW50R3VpZGUoYSxjLG8pO2lmKCFjKWNvbnRpbnVlO3ItPWMubGVuZ3RofWlmKHIrYy5sZW5ndGg8byl1PXRoaXMuJHJlbmRlclRva2VuKGEsdSxsLGMpLHIrPWMubGVuZ3RoO2Vsc2V7d2hpbGUocitjLmxlbmd0aD49byl1PXRoaXMuJHJlbmRlclRva2VuKGEsdSxsLGMuc3Vic3RyaW5nKDAsby1yKSksYz1jLnN1YnN0cmluZyhvLXIpLHI9byxhPXRoaXMuJGNyZWF0ZUxpbmVFbGVtZW50KCksZS5hcHBlbmRDaGlsZChhKSxhLmFwcGVuZENoaWxkKHRoaXMuZG9tLmNyZWF0ZVRleHROb2RlKHMuc3RyaW5nUmVwZWF0KCJcdTAwYTAiLG4uaW5kZW50KSx0aGlzLmVsZW1lbnQpKSxpKyssdT0wLG89bltpXXx8TnVtYmVyLk1BWF9WQUxVRTtjLmxlbmd0aCE9MCYmKHIrPWMubGVuZ3RoLHU9dGhpcy4kcmVuZGVyVG9rZW4oYSx1LGwsYykpfX1uW24ubGVuZ3RoLTFdPnRoaXMuTUFYX0xJTkVfTEVOR1RIJiZ0aGlzLiRyZW5kZXJPdmVyZmxvd01lc3NhZ2UoYSx1LG51bGwsIiIsITApfSx0aGlzLiRyZW5kZXJTaW1wbGVMaW5lPWZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPXRbMF0saT1yLnZhbHVlO3RoaXMuZGlzcGxheUluZGVudEd1aWRlcyYmKGk9dGhpcy5yZW5kZXJJbmRlbnRHdWlkZShlLGkpKSxpJiYobj10aGlzLiRyZW5kZXJUb2tlbihlLG4scixpKSk7Zm9yKHZhciBzPTE7czx0Lmxlbmd0aDtzKyspe3I9dFtzXSxpPXIudmFsdWU7aWYobitpLmxlbmd0aD50aGlzLk1BWF9MSU5FX0xFTkdUSClyZXR1cm4gdGhpcy4kcmVuZGVyT3ZlcmZsb3dNZXNzYWdlKGUsbixyLGkpO249dGhpcy4kcmVuZGVyVG9rZW4oZSxuLHIsaSl9fSx0aGlzLiRyZW5kZXJPdmVyZmxvd01lc3NhZ2U9ZnVuY3Rpb24oZSx0LG4scixpKXtuJiZ0aGlzLiRyZW5kZXJUb2tlbihlLHQsbixyLnNsaWNlKDAsdGhpcy5NQVhfTElORV9MRU5HVEgtdCkpO3ZhciBzPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtzLmNsYXNzTmFtZT0iYWNlX2lubGluZV9idXR0b24gYWNlX2tleXdvcmQgYWNlX3RvZ2dsZV93cmFwIixzLnRleHRDb250ZW50PWk/IjxoaWRlPiI6IjxjbGljayB0byBzZWUgbW9yZS4uLj4iLGUuYXBwZW5kQ2hpbGQocyl9LHRoaXMuJHJlbmRlckxpbmU9ZnVuY3Rpb24oZSx0LG4peyFuJiZuIT0wJiYobj10aGlzLnNlc3Npb24uZ2V0Rm9sZExpbmUodCkpO2lmKG4pdmFyIHI9dGhpcy4kZ2V0Rm9sZExpbmVUb2tlbnModCxuKTtlbHNlIHZhciByPXRoaXMuc2Vzc2lvbi5nZXRUb2tlbnModCk7dmFyIGk9ZTtpZihyLmxlbmd0aCl7dmFyIHM9dGhpcy5zZXNzaW9uLmdldFJvd1NwbGl0RGF0YSh0KTtpZihzJiZzLmxlbmd0aCl7dGhpcy4kcmVuZGVyV3JhcHBlZExpbmUoZSxyLHMpO3ZhciBpPWUubGFzdENoaWxkfWVsc2V7dmFyIGk9ZTt0aGlzLiR1c2VMaW5lR3JvdXBzKCkmJihpPXRoaXMuJGNyZWF0ZUxpbmVFbGVtZW50KCksZS5hcHBlbmRDaGlsZChpKSksdGhpcy4kcmVuZGVyU2ltcGxlTGluZShpLHIpfX1lbHNlIHRoaXMuJHVzZUxpbmVHcm91cHMoKSYmKGk9dGhpcy4kY3JlYXRlTGluZUVsZW1lbnQoKSxlLmFwcGVuZENoaWxkKGkpKTtpZih0aGlzLnNob3dJbnZpc2libGVzJiZpKXtuJiYodD1uLmVuZC5yb3cpO3ZhciBvPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtvLmNsYXNzTmFtZT0iYWNlX2ludmlzaWJsZSBhY2VfaW52aXNpYmxlX2VvbCIsby50ZXh0Q29udGVudD10PT10aGlzLnNlc3Npb24uZ2V0TGVuZ3RoKCktMT90aGlzLkVPRl9DSEFSOnRoaXMuRU9MX0NIQVIsaS5hcHBlbmRDaGlsZChvKX19LHRoaXMuJGdldEZvbGRMaW5lVG9rZW5zPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gaShlLHQsbil7dmFyIGk9MCxzPTA7d2hpbGUocytlW2ldLnZhbHVlLmxlbmd0aDx0KXtzKz1lW2ldLnZhbHVlLmxlbmd0aCxpKys7aWYoaT09ZS5sZW5ndGgpcmV0dXJufWlmKHMhPXQpe3ZhciBvPWVbaV0udmFsdWUuc3Vic3RyaW5nKHQtcyk7by5sZW5ndGg+bi10JiYobz1vLnN1YnN0cmluZygwLG4tdCkpLHIucHVzaCh7dHlwZTplW2ldLnR5cGUsdmFsdWU6b30pLHM9dCtvLmxlbmd0aCxpKz0xfXdoaWxlKHM8biYmaTxlLmxlbmd0aCl7dmFyIG89ZVtpXS52YWx1ZTtvLmxlbmd0aCtzPm4/ci5wdXNoKHt0eXBlOmVbaV0udHlwZSx2YWx1ZTpvLnN1YnN0cmluZygwLG4tcyl9KTpyLnB1c2goZVtpXSkscys9by5sZW5ndGgsaSs9MX19dmFyIG49dGhpcy5zZXNzaW9uLHI9W10scz1uLmdldFRva2VucyhlKTtyZXR1cm4gdC53YWxrKGZ1bmN0aW9uKGUsdCxvLHUsYSl7ZSE9bnVsbD9yLnB1c2goe3R5cGU6ImZvbGQiLHZhbHVlOmV9KTooYSYmKHM9bi5nZXRUb2tlbnModCkpLHMubGVuZ3RoJiZpKHMsdSxvKSl9LHQuZW5kLnJvdyx0aGlzLnNlc3Npb24uZ2V0TGluZSh0LmVuZC5yb3cpLmxlbmd0aCkscn0sdGhpcy4kdXNlTGluZUdyb3Vwcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0VXNlV3JhcE1vZGUoKX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7fX0pLmNhbGwoYS5wcm90b3R5cGUpLHQuVGV4dD1hfSksYWNlLmRlZmluZSgiYWNlL2xheWVyL2N1cnNvciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvZG9tIiksaT1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQ9ci5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfbGF5ZXIgYWNlX2N1cnNvci1sYXllciIsZS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpLHRoaXMuaXNWaXNpYmxlPSExLHRoaXMuaXNCbGlua2luZz0hMCx0aGlzLmJsaW5rSW50ZXJ2YWw9MWUzLHRoaXMuc21vb3RoQmxpbmtpbmc9ITEsdGhpcy5jdXJzb3JzPVtdLHRoaXMuY3Vyc29yPXRoaXMuYWRkQ3Vyc29yKCksci5hZGRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9oaWRkZW4tY3Vyc29ycyIpLHRoaXMuJHVwZGF0ZUN1cnNvcnM9dGhpcy4kdXBkYXRlT3BhY2l0eS5iaW5kKHRoaXMpfTsoZnVuY3Rpb24oKXt0aGlzLiR1cGRhdGVPcGFjaXR5PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY3Vyc29ycztmb3IodmFyIG49dC5sZW5ndGg7bi0tOylyLnNldFN0eWxlKHRbbl0uc3R5bGUsIm9wYWNpdHkiLGU/IiI6IjAiKX0sdGhpcy4kc3RhcnRDc3NBbmltYXRpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmN1cnNvcnM7Zm9yKHZhciB0PWUubGVuZ3RoO3QtLTspZVt0XS5zdHlsZS5hbmltYXRpb25EdXJhdGlvbj10aGlzLmJsaW5rSW50ZXJ2YWwrIm1zIjtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5hZGRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9hbmltYXRlLWJsaW5raW5nIil9LmJpbmQodGhpcykpfSx0aGlzLiRzdG9wQ3NzQW5pbWF0aW9uPWZ1bmN0aW9uKCl7ci5yZW1vdmVDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9hbmltYXRlLWJsaW5raW5nIil9LHRoaXMuJHBhZGRpbmc9MCx0aGlzLnNldFBhZGRpbmc9ZnVuY3Rpb24oZSl7dGhpcy4kcGFkZGluZz1lfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uPWV9LHRoaXMuc2V0Qmxpbmtpbmc9ZnVuY3Rpb24oZSl7ZSE9dGhpcy5pc0JsaW5raW5nJiYodGhpcy5pc0JsaW5raW5nPWUsdGhpcy5yZXN0YXJ0VGltZXIoKSl9LHRoaXMuc2V0QmxpbmtJbnRlcnZhbD1mdW5jdGlvbihlKXtlIT10aGlzLmJsaW5rSW50ZXJ2YWwmJih0aGlzLmJsaW5rSW50ZXJ2YWw9ZSx0aGlzLnJlc3RhcnRUaW1lcigpKX0sdGhpcy5zZXRTbW9vdGhCbGlua2luZz1mdW5jdGlvbihlKXtlIT10aGlzLnNtb290aEJsaW5raW5nJiYodGhpcy5zbW9vdGhCbGlua2luZz1lLHIuc2V0Q3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2Vfc21vb3RoLWJsaW5raW5nIixlKSx0aGlzLiR1cGRhdGVDdXJzb3JzKCEwKSx0aGlzLnJlc3RhcnRUaW1lcigpKX0sdGhpcy5hZGRDdXJzb3I9ZnVuY3Rpb24oKXt2YXIgZT1yLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBlLmNsYXNzTmFtZT0iYWNlX2N1cnNvciIsdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGUpLHRoaXMuY3Vyc29ycy5wdXNoKGUpLGV9LHRoaXMucmVtb3ZlQ3Vyc29yPWZ1bmN0aW9uKCl7aWYodGhpcy5jdXJzb3JzLmxlbmd0aD4xKXt2YXIgZT10aGlzLmN1cnNvcnMucG9wKCk7cmV0dXJuIGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxlfX0sdGhpcy5oaWRlQ3Vyc29yPWZ1bmN0aW9uKCl7dGhpcy5pc1Zpc2libGU9ITEsci5hZGRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9oaWRkZW4tY3Vyc29ycyIpLHRoaXMucmVzdGFydFRpbWVyKCl9LHRoaXMuc2hvd0N1cnNvcj1mdW5jdGlvbigpe3RoaXMuaXNWaXNpYmxlPSEwLHIucmVtb3ZlQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfaGlkZGVuLWN1cnNvcnMiKSx0aGlzLnJlc3RhcnRUaW1lcigpfSx0aGlzLnJlc3RhcnRUaW1lcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJHVwZGF0ZUN1cnNvcnM7Y2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpLGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCksdGhpcy4kc3RvcENzc0FuaW1hdGlvbigpLHRoaXMuc21vb3RoQmxpbmtpbmcmJnIucmVtb3ZlQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2Vfc21vb3RoLWJsaW5raW5nIiksZSghMCk7aWYoIXRoaXMuaXNCbGlua2luZ3x8IXRoaXMuYmxpbmtJbnRlcnZhbHx8IXRoaXMuaXNWaXNpYmxlKXt0aGlzLiRzdG9wQ3NzQW5pbWF0aW9uKCk7cmV0dXJufXRoaXMuc21vb3RoQmxpbmtpbmcmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmFkZENzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX3Ntb290aC1ibGlua2luZyIpfS5iaW5kKHRoaXMpKTtpZihyLkhBU19DU1NfQU5JTUFUSU9OKXRoaXMuJHN0YXJ0Q3NzQW5pbWF0aW9uKCk7ZWxzZXt2YXIgdD1mdW5jdGlvbigpe3RoaXMudGltZW91dElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCExKX0sLjYqdGhpcy5ibGlua0ludGVydmFsKX0uYmluZCh0aGlzKTt0aGlzLmludGVydmFsSWQ9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtlKCEwKSx0KCl9LHRoaXMuYmxpbmtJbnRlcnZhbCksdCgpfX0sdGhpcy5nZXRQaXhlbFBvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuY29uZmlnfHwhdGhpcy5zZXNzaW9uKXJldHVybntsZWZ0OjAsdG9wOjB9O2V8fChlPXRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCkpO3ZhciBuPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oZSkscj10aGlzLiRwYWRkaW5nKyh0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmlzQmlkaVJvdyhuLnJvdyxlLnJvdyk/dGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5nZXRQb3NMZWZ0KG4uY29sdW1uKTpuLmNvbHVtbip0aGlzLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCksaT0obi5yb3ctKHQ/dGhpcy5jb25maWcuZmlyc3RSb3dTY3JlZW46MCkpKnRoaXMuY29uZmlnLmxpbmVIZWlnaHQ7cmV0dXJue2xlZnQ6cix0b3A6aX19LHRoaXMuaXNDdXJzb3JJblZpZXc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS50b3A+PTAmJmUudG9wPHQubWF4SGVpZ2h0fSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLmNvbmZpZz1lO3ZhciB0PXRoaXMuc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2VycyxuPTAsaT0wO2lmKHQ9PT11bmRlZmluZWR8fHQubGVuZ3RoPT09MCl0PVt7Y3Vyc29yOm51bGx9XTtmb3IodmFyIG49MCxzPXQubGVuZ3RoO248cztuKyspe3ZhciBvPXRoaXMuZ2V0UGl4ZWxQb3NpdGlvbih0W25dLmN1cnNvciwhMCk7aWYoKG8udG9wPmUuaGVpZ2h0K2Uub2Zmc2V0fHxvLnRvcDwwKSYmbj4xKWNvbnRpbnVlO3ZhciB1PXRoaXMuY3Vyc29yc1tpKytdfHx0aGlzLmFkZEN1cnNvcigpLGE9dS5zdHlsZTt0aGlzLmRyYXdDdXJzb3I/dGhpcy5kcmF3Q3Vyc29yKHUsbyxlLHRbbl0sdGhpcy5zZXNzaW9uKTp0aGlzLmlzQ3Vyc29ySW5WaWV3KG8sZSk/KHIuc2V0U3R5bGUoYSwiZGlzcGxheSIsImJsb2NrIiksci50cmFuc2xhdGUodSxvLmxlZnQsby50b3ApLHIuc2V0U3R5bGUoYSwid2lkdGgiLE1hdGgucm91bmQoZS5jaGFyYWN0ZXJXaWR0aCkrInB4Iiksci5zZXRTdHlsZShhLCJoZWlnaHQiLGUubGluZUhlaWdodCsicHgiKSk6ci5zZXRTdHlsZShhLCJkaXNwbGF5Iiwibm9uZSIpfXdoaWxlKHRoaXMuY3Vyc29ycy5sZW5ndGg+aSl0aGlzLnJlbW92ZUN1cnNvcigpO3ZhciBmPXRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKTt0aGlzLiRzZXRPdmVyd3JpdGUoZiksdGhpcy4kcGl4ZWxQb3M9byx0aGlzLnJlc3RhcnRUaW1lcigpfSx0aGlzLmRyYXdDdXJzb3I9bnVsbCx0aGlzLiRzZXRPdmVyd3JpdGU9ZnVuY3Rpb24oZSl7ZSE9dGhpcy5vdmVyd3JpdGUmJih0aGlzLm92ZXJ3cml0ZT1lLGU/ci5hZGRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9vdmVyd3JpdGUtY3Vyc29ycyIpOnIucmVtb3ZlQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2Vfb3ZlcndyaXRlLWN1cnNvcnMiKSl9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElkKSxjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpfX0pLmNhbGwoaS5wcm90b3R5cGUpLHQuQ3Vyc29yPWl9KSxhY2UuZGVmaW5lKCJhY2Uvc2Nyb2xsYmFyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvZG9tIikscz1lKCIuL2xpYi9ldmVudCIpLG89ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcix1PTMyNzY4LGE9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50PWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX3Njcm9sbGJhciBhY2Vfc2Nyb2xsYmFyIit0aGlzLmNsYXNzU3VmZml4LHRoaXMuaW5uZXI9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmlubmVyLmNsYXNzTmFtZT0iYWNlX3Njcm9sbGJhci1pbm5lciIsdGhpcy5pbm5lci50ZXh0Q29udGVudD0iXHUwMGEwIix0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5pbm5lciksZS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpLHRoaXMuc2V0VmlzaWJsZSghMSksdGhpcy5za2lwRXZlbnQ9ITEscy5hZGRMaXN0ZW5lcih0aGlzLmVsZW1lbnQsInNjcm9sbCIsdGhpcy5vblNjcm9sbC5iaW5kKHRoaXMpKSxzLmFkZExpc3RlbmVyKHRoaXMuZWxlbWVudCwibW91c2Vkb3duIixzLnByZXZlbnREZWZhdWx0KX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxvKSx0aGlzLnNldFZpc2libGU9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXk9ZT8iIjoibm9uZSIsdGhpcy5pc1Zpc2libGU9ZSx0aGlzLmNvZWZmPTF9fSkuY2FsbChhLnByb3RvdHlwZSk7dmFyIGY9ZnVuY3Rpb24oZSx0KXthLmNhbGwodGhpcyxlKSx0aGlzLnNjcm9sbFRvcD0wLHRoaXMuc2Nyb2xsSGVpZ2h0PTAsdC4kc2Nyb2xsYmFyV2lkdGg9dGhpcy53aWR0aD1pLnNjcm9sbGJhcldpZHRoKGUub3duZXJEb2N1bWVudCksdGhpcy5pbm5lci5zdHlsZS53aWR0aD10aGlzLmVsZW1lbnQuc3R5bGUud2lkdGg9KHRoaXMud2lkdGh8fDE1KSs1KyJweCIsdGhpcy4kbWluV2lkdGg9MH07ci5pbmhlcml0cyhmLGEpLGZ1bmN0aW9uKCl7dGhpcy5jbGFzc1N1ZmZpeD0iLXYiLHRoaXMub25TY3JvbGw9ZnVuY3Rpb24oKXtpZighdGhpcy5za2lwRXZlbnQpe3RoaXMuc2Nyb2xsVG9wPXRoaXMuZWxlbWVudC5zY3JvbGxUb3A7aWYodGhpcy5jb2VmZiE9MSl7dmFyIGU9dGhpcy5lbGVtZW50LmNsaWVudEhlaWdodC90aGlzLnNjcm9sbEhlaWdodDt0aGlzLnNjcm9sbFRvcD10aGlzLnNjcm9sbFRvcCooMS1lKS8odGhpcy5jb2VmZi1lKX10aGlzLl9lbWl0KCJzY3JvbGwiLHtkYXRhOnRoaXMuc2Nyb2xsVG9wfSl9dGhpcy5za2lwRXZlbnQ9ITF9LHRoaXMuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXgodGhpcy5pc1Zpc2libGU/dGhpcy53aWR0aDowLHRoaXMuJG1pbldpZHRofHwwKX0sdGhpcy5zZXRIZWlnaHQ9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodD1lKyJweCJ9LHRoaXMuc2V0SW5uZXJIZWlnaHQ9dGhpcy5zZXRTY3JvbGxIZWlnaHQ9ZnVuY3Rpb24oZSl7dGhpcy5zY3JvbGxIZWlnaHQ9ZSxlPnU/KHRoaXMuY29lZmY9dS9lLGU9dSk6dGhpcy5jb2VmZiE9MSYmKHRoaXMuY29lZmY9MSksdGhpcy5pbm5lci5zdHlsZS5oZWlnaHQ9ZSsicHgifSx0aGlzLnNldFNjcm9sbFRvcD1mdW5jdGlvbihlKXt0aGlzLnNjcm9sbFRvcCE9ZSYmKHRoaXMuc2tpcEV2ZW50PSEwLHRoaXMuc2Nyb2xsVG9wPWUsdGhpcy5lbGVtZW50LnNjcm9sbFRvcD1lKnRoaXMuY29lZmYpfX0uY2FsbChmLnByb3RvdHlwZSk7dmFyIGw9ZnVuY3Rpb24oZSx0KXthLmNhbGwodGhpcyxlKSx0aGlzLnNjcm9sbExlZnQ9MCx0aGlzLmhlaWdodD10LiRzY3JvbGxiYXJXaWR0aCx0aGlzLmlubmVyLnN0eWxlLmhlaWdodD10aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0PSh0aGlzLmhlaWdodHx8MTUpKzUrInB4In07ci5pbmhlcml0cyhsLGEpLGZ1bmN0aW9uKCl7dGhpcy5jbGFzc1N1ZmZpeD0iLWgiLHRoaXMub25TY3JvbGw9ZnVuY3Rpb24oKXt0aGlzLnNraXBFdmVudHx8KHRoaXMuc2Nyb2xsTGVmdD10aGlzLmVsZW1lbnQuc2Nyb2xsTGVmdCx0aGlzLl9lbWl0KCJzY3JvbGwiLHtkYXRhOnRoaXMuc2Nyb2xsTGVmdH0pKSx0aGlzLnNraXBFdmVudD0hMX0sdGhpcy5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1Zpc2libGU/dGhpcy5oZWlnaHQ6MH0sdGhpcy5zZXRXaWR0aD1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQuc3R5bGUud2lkdGg9ZSsicHgifSx0aGlzLnNldElubmVyV2lkdGg9ZnVuY3Rpb24oZSl7dGhpcy5pbm5lci5zdHlsZS53aWR0aD1lKyJweCJ9LHRoaXMuc2V0U2Nyb2xsV2lkdGg9ZnVuY3Rpb24oZSl7dGhpcy5pbm5lci5zdHlsZS53aWR0aD1lKyJweCJ9LHRoaXMuc2V0U2Nyb2xsTGVmdD1mdW5jdGlvbihlKXt0aGlzLnNjcm9sbExlZnQhPWUmJih0aGlzLnNraXBFdmVudD0hMCx0aGlzLnNjcm9sbExlZnQ9dGhpcy5lbGVtZW50LnNjcm9sbExlZnQ9ZSl9fS5jYWxsKGwucHJvdG90eXBlKSx0LlNjcm9sbEJhcj1mLHQuU2Nyb2xsQmFyVj1mLHQuU2Nyb2xsQmFySD1sLHQuVlNjcm9sbEJhcj1mLHQuSFNjcm9sbEJhcj1sfSksYWNlLmRlZmluZSgiYWNlL3JlbmRlcmxvb3AiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9ldmVudCIpLGk9ZnVuY3Rpb24oZSx0KXt0aGlzLm9uUmVuZGVyPWUsdGhpcy5wZW5kaW5nPSExLHRoaXMuY2hhbmdlcz0wLHRoaXMuJHJlY3Vyc2lvbkxpbWl0PTIsdGhpcy53aW5kb3c9dHx8d2luZG93O3ZhciBuPXRoaXM7dGhpcy5fZmx1c2g9ZnVuY3Rpb24oZSl7bi5wZW5kaW5nPSExO3ZhciB0PW4uY2hhbmdlczt0JiYoci5ibG9ja0lkbGUoMTAwKSxuLmNoYW5nZXM9MCxuLm9uUmVuZGVyKHQpKTtpZihuLmNoYW5nZXMpe2lmKG4uJHJlY3Vyc2lvbkxpbWl0LS08MClyZXR1cm47bi5zY2hlZHVsZSgpfWVsc2Ugbi4kcmVjdXJzaW9uTGltaXQ9Mn19OyhmdW5jdGlvbigpe3RoaXMuc2NoZWR1bGU9ZnVuY3Rpb24oZSl7dGhpcy5jaGFuZ2VzPXRoaXMuY2hhbmdlc3xlLHRoaXMuY2hhbmdlcyYmIXRoaXMucGVuZGluZyYmKHIubmV4dEZyYW1lKHRoaXMuX2ZsdXNoKSx0aGlzLnBlbmRpbmc9ITApfSx0aGlzLmNsZWFyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY2hhbmdlcztyZXR1cm4gdGhpcy5jaGFuZ2VzPTAsdH19KS5jYWxsKGkucHJvdG90eXBlKSx0LlJlbmRlckxvb3A9aX0pLGFjZS5kZWZpbmUoImFjZS9sYXllci9mb250X21ldHJpY3MiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvdXNlcmFnZW50IiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4uL2xpYi9kb20iKSxzPWUoIi4uL2xpYi9sYW5nIiksbz1lKCIuLi9saWIvZXZlbnQiKSx1PWUoIi4uL2xpYi91c2VyYWdlbnQiKSxhPWUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLGY9MjU2LGw9dHlwZW9mIFJlc2l6ZU9ic2VydmVyPT0iZnVuY3Rpb24iLGM9MjAwLGg9dC5Gb250TWV0cmljcz1mdW5jdGlvbihlKXt0aGlzLmVsPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kc2V0TWVhc3VyZU5vZGVTdHlsZXModGhpcy5lbC5zdHlsZSwhMCksdGhpcy4kbWFpbj1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuJHNldE1lYXN1cmVOb2RlU3R5bGVzKHRoaXMuJG1haW4uc3R5bGUpLHRoaXMuJG1lYXN1cmVOb2RlPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kc2V0TWVhc3VyZU5vZGVTdHlsZXModGhpcy4kbWVhc3VyZU5vZGUuc3R5bGUpLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy4kbWFpbiksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLiRtZWFzdXJlTm9kZSksZS5hcHBlbmRDaGlsZCh0aGlzLmVsKSx0aGlzLiRtZWFzdXJlTm9kZS5pbm5lckhUTUw9cy5zdHJpbmdSZXBlYXQoIlgiLGYpLHRoaXMuJGNoYXJhY3RlclNpemU9e3dpZHRoOjAsaGVpZ2h0OjB9LGw/dGhpcy4kYWRkT2JzZXJ2ZXIoKTp0aGlzLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxhKSx0aGlzLiRjaGFyYWN0ZXJTaXplPXt3aWR0aDowLGhlaWdodDowfSx0aGlzLiRzZXRNZWFzdXJlTm9kZVN0eWxlcz1mdW5jdGlvbihlLHQpe2Uud2lkdGg9ZS5oZWlnaHQ9ImF1dG8iLGUubGVmdD1lLnRvcD0iMHB4IixlLnZpc2liaWxpdHk9ImhpZGRlbiIsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUud2hpdGVTcGFjZT0icHJlIix1LmlzSUU8OD9lWyJmb250LWZhbWlseSJdPSJpbmhlcml0IjplLmZvbnQ9ImluaGVyaXQiLGUub3ZlcmZsb3c9dD8iaGlkZGVuIjoidmlzaWJsZSJ9LHRoaXMuY2hlY2tGb3JTaXplQ2hhbmdlcz1mdW5jdGlvbihlKXtlPT09dW5kZWZpbmVkJiYoZT10aGlzLiRtZWFzdXJlU2l6ZXMoKSk7aWYoZSYmKHRoaXMuJGNoYXJhY3RlclNpemUud2lkdGghPT1lLndpZHRofHx0aGlzLiRjaGFyYWN0ZXJTaXplLmhlaWdodCE9PWUuaGVpZ2h0KSl7dGhpcy4kbWVhc3VyZU5vZGUuc3R5bGUuZm9udFdlaWdodD0iYm9sZCI7dmFyIHQ9dGhpcy4kbWVhc3VyZVNpemVzKCk7dGhpcy4kbWVhc3VyZU5vZGUuc3R5bGUuZm9udFdlaWdodD0iIix0aGlzLiRjaGFyYWN0ZXJTaXplPWUsdGhpcy5jaGFyU2l6ZXM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmFsbG93Qm9sZEZvbnRzPXQmJnQud2lkdGg9PT1lLndpZHRoJiZ0LmhlaWdodD09PWUuaGVpZ2h0LHRoaXMuX2VtaXQoImNoYW5nZUNoYXJhY3RlclNpemUiLHtkYXRhOmV9KX19LHRoaXMuJGFkZE9ic2VydmVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiRvYnNlcnZlcj1uZXcgd2luZG93LlJlc2l6ZU9ic2VydmVyKGZ1bmN0aW9uKHQpe3ZhciBuPXRbMF0uY29udGVudFJlY3Q7ZS5jaGVja0ZvclNpemVDaGFuZ2VzKHtoZWlnaHQ6bi5oZWlnaHQsd2lkdGg6bi53aWR0aC9mfSl9KSx0aGlzLiRvYnNlcnZlci5vYnNlcnZlKHRoaXMuJG1lYXN1cmVOb2RlKX0sdGhpcy4kcG9sbFNpemVDaGFuZ2VzPWZ1bmN0aW9uKCl7aWYodGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXJ8fHRoaXMuJG9ic2VydmVyKXJldHVybiB0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lcjt2YXIgZT10aGlzO3JldHVybiB0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lcj1vLm9uSWRsZShmdW5jdGlvbiB0KCl7ZS5jaGVja0ZvclNpemVDaGFuZ2VzKCksby5vbklkbGUodCw1MDApfSw1MDApfSx0aGlzLnNldFBvbGxpbmc9ZnVuY3Rpb24oZSl7ZT90aGlzLiRwb2xsU2l6ZUNoYW5nZXMoKTp0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lciYmKGNsZWFySW50ZXJ2YWwodGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXIpLHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyPTApfSx0aGlzLiRtZWFzdXJlU2l6ZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9e2hlaWdodDooZXx8dGhpcy4kbWVhc3VyZU5vZGUpLmNsaWVudEhlaWdodCx3aWR0aDooZXx8dGhpcy4kbWVhc3VyZU5vZGUpLmNsaWVudFdpZHRoL2Z9O3JldHVybiB0LndpZHRoPT09MHx8dC5oZWlnaHQ9PT0wP251bGw6dH0sdGhpcy4kbWVhc3VyZUNoYXJXaWR0aD1mdW5jdGlvbihlKXt0aGlzLiRtYWluLmlubmVySFRNTD1zLnN0cmluZ1JlcGVhdChlLGYpO3ZhciB0PXRoaXMuJG1haW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHQud2lkdGgvZn0sdGhpcy5nZXRDaGFyYWN0ZXJXaWR0aD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNoYXJTaXplc1tlXTtyZXR1cm4gdD09PXVuZGVmaW5lZCYmKHQ9dGhpcy5jaGFyU2l6ZXNbZV09dGhpcy4kbWVhc3VyZUNoYXJXaWR0aChlKS90aGlzLiRjaGFyYWN0ZXJTaXplLndpZHRoKSx0fSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyKSx0aGlzLiRvYnNlcnZlciYmdGhpcy4kb2JzZXJ2ZXIuZGlzY29ubmVjdCgpLHRoaXMuZWwmJnRoaXMuZWwucGFyZW50Tm9kZSYmdGhpcy5lbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZWwpfSx0aGlzLiRnZXRab29tPWZ1bmN0aW9uIGUodCl7cmV0dXJuIHQ/KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLnpvb218fDEpKmUodC5wYXJlbnRFbGVtZW50KToxfSx0aGlzLiRpbml0VHJhbnNmb3JtTWVhc3VyZU5vZGVzPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm5bImRpdiIse3N0eWxlOiJwb3NpdGlvbjogYWJzb2x1dGU7dG9wOiIrZSsicHg7bGVmdDoiK3QrInB4OyJ9XX07dGhpcy5lbHM9aS5idWlsZERvbShbZSgwLDApLGUoYywwKSxlKDAsYyksZShjLGMpXSx0aGlzLmVsKX0sdGhpcy50cmFuc2Zvcm1Db29yZGluYXRlcz1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHIoZSx0LG4pe3ZhciByPWVbMV0qdFswXS1lWzBdKnRbMV07cmV0dXJuWygtdFsxXSpuWzBdK3RbMF0qblsxXSkvciwoK2VbMV0qblswXS1lWzBdKm5bMV0pL3JdfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm5bZVswXS10WzBdLGVbMV0tdFsxXV19ZnVuY3Rpb24gcyhlLHQpe3JldHVybltlWzBdK3RbMF0sZVsxXSt0WzFdXX1mdW5jdGlvbiBvKGUsdCl7cmV0dXJuW2UqdFswXSxlKnRbMV1dfWZ1bmN0aW9uIHUoZSl7dmFyIHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bdC5sZWZ0LHQudG9wXX1pZihlKXt2YXIgbj10aGlzLiRnZXRab29tKHRoaXMuZWwpO2U9bygxL24sZSl9dGhpcy5lbHN8fHRoaXMuJGluaXRUcmFuc2Zvcm1NZWFzdXJlTm9kZXMoKTt2YXIgYT11KHRoaXMuZWxzWzBdKSxmPXUodGhpcy5lbHNbMV0pLGw9dSh0aGlzLmVsc1syXSksaD11KHRoaXMuZWxzWzNdKSxwPXIoaShoLGYpLGkoaCxsKSxpKHMoZixsKSxzKGgsYSkpKSxkPW8oMStwWzBdLGkoZixhKSksdj1vKDErcFsxXSxpKGwsYSkpO2lmKHQpe3ZhciBtPXQsZz1wWzBdKm1bMF0vYytwWzFdKm1bMV0vYysxLHk9cyhvKG1bMF0sZCksbyhtWzFdLHYpKTtyZXR1cm4gcyhvKDEvZy9jLHkpLGEpfXZhciBiPWkoZSxhKSx3PXIoaShkLG8ocFswXSxiKSksaSh2LG8ocFsxXSxiKSksYik7cmV0dXJuIG8oYyx3KX19KS5jYWxsKGgucHJvdG90eXBlKX0pLGFjZS5kZWZpbmUoImFjZS92aXJ0dWFsX3JlbmRlcmVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9jb25maWciLCJhY2UvbGF5ZXIvZ3V0dGVyIiwiYWNlL2xheWVyL21hcmtlciIsImFjZS9sYXllci90ZXh0IiwiYWNlL2xheWVyL2N1cnNvciIsImFjZS9zY3JvbGxiYXIiLCJhY2Uvc2Nyb2xsYmFyIiwiYWNlL3JlbmRlcmxvb3AiLCJhY2UvbGF5ZXIvZm9udF9tZXRyaWNzIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvZG9tIikscz1lKCIuL2NvbmZpZyIpLG89ZSgiLi9sYXllci9ndXR0ZXIiKS5HdXR0ZXIsdT1lKCIuL2xheWVyL21hcmtlciIpLk1hcmtlcixhPWUoIi4vbGF5ZXIvdGV4dCIpLlRleHQsZj1lKCIuL2xheWVyL2N1cnNvciIpLkN1cnNvcixsPWUoIi4vc2Nyb2xsYmFyIikuSFNjcm9sbEJhcixjPWUoIi4vc2Nyb2xsYmFyIikuVlNjcm9sbEJhcixoPWUoIi4vcmVuZGVybG9vcCIpLlJlbmRlckxvb3AscD1lKCIuL2xheWVyL2ZvbnRfbWV0cmljcyIpLkZvbnRNZXRyaWNzLGQ9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcix2PScuYWNlX2JyMSB7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDt9LmFjZV9icjIge2JvcmRlci10b3AtcmlnaHQtcmFkaXVzICAgOiAzcHg7fS5hY2VfYnIzIHtib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogICAgM3B4O30uYWNlX2JyNCB7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDt9LmFjZV9icjUge2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7fS5hY2VfYnI2IHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyAgIDogM3B4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4O30uYWNlX2JyNyB7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICAgIDNweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDt9LmFjZV9icjgge2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMgOiAzcHg7fS5hY2VfYnI5IHtib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAgM3B4O30uYWNlX2JyMTB7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXMgICA6IDNweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogIDNweDt9LmFjZV9icjExe2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7IGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAgICAzcHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICAzcHg7fS5hY2VfYnIxMntib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAgM3B4O30uYWNlX2JyMTN7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogIDNweDt9LmFjZV9icjE0e2JvcmRlci10b3AtcmlnaHQtcmFkaXVzICAgOiAzcHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICAzcHg7fS5hY2VfYnIxNXtib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogICAgM3B4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAzcHg7fS5hY2VfZWRpdG9yIHtwb3NpdGlvbjogcmVsYXRpdmU7b3ZlcmZsb3c6IGhpZGRlbjtmb250OiAxMnB4L25vcm1hbCBcJ01vbmFjb1wnLCBcJ01lbmxvXCcsIFwnVWJ1bnR1IE1vbm9cJywgXCdDb25zb2xhc1wnLCBcJ3NvdXJjZS1jb2RlLXByb1wnLCBtb25vc3BhY2U7ZGlyZWN0aW9uOiBsdHI7dGV4dC1hbGlnbjogbGVmdDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7fS5hY2Vfc2Nyb2xsZXIge3Bvc2l0aW9uOiBhYnNvbHV0ZTtvdmVyZmxvdzogaGlkZGVuO3RvcDogMDtib3R0b206IDA7YmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDstbXMtdXNlci1zZWxlY3Q6IG5vbmU7LW1vei11c2VyLXNlbGVjdDogbm9uZTstd2Via2l0LXVzZXItc2VsZWN0OiBub25lO3VzZXItc2VsZWN0OiBub25lO2N1cnNvcjogdGV4dDt9LmFjZV9jb250ZW50IHtwb3NpdGlvbjogYWJzb2x1dGU7Ym94LXNpemluZzogYm9yZGVyLWJveDttaW4td2lkdGg6IDEwMCU7Y29udGFpbjogc3R5bGUgc2l6ZSBsYXlvdXQ7fS5hY2VfZHJhZ2dpbmcgLmFjZV9zY3JvbGxlcjpiZWZvcmV7cG9zaXRpb246IGFic29sdXRlO3RvcDogMDtsZWZ0OiAwO3JpZ2h0OiAwO2JvdHRvbTogMDtjb250ZW50OiBcJ1wnO2JhY2tncm91bmQ6IHJnYmEoMjUwLCAyNTAsIDI1MCwgMC4wMSk7ei1pbmRleDogMTAwMDt9LmFjZV9kcmFnZ2luZy5hY2VfZGFyayAuYWNlX3Njcm9sbGVyOmJlZm9yZXtiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDEpO30uYWNlX3NlbGVjdGluZywgLmFjZV9zZWxlY3RpbmcgKiB7Y3Vyc29yOiB0ZXh0ICFpbXBvcnRhbnQ7fS5hY2VfZ3V0dGVyIHtwb3NpdGlvbjogYWJzb2x1dGU7b3ZlcmZsb3cgOiBoaWRkZW47d2lkdGg6IGF1dG87dG9wOiAwO2JvdHRvbTogMDtsZWZ0OiAwO2N1cnNvcjogZGVmYXVsdDt6LWluZGV4OiA0Oy1tcy11c2VyLXNlbGVjdDogbm9uZTstbW96LXVzZXItc2VsZWN0OiBub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7dXNlci1zZWxlY3Q6IG5vbmU7Y29udGFpbjogc3R5bGUgc2l6ZSBsYXlvdXQ7fS5hY2VfZ3V0dGVyLWFjdGl2ZS1saW5lIHtwb3NpdGlvbjogYWJzb2x1dGU7bGVmdDogMDtyaWdodDogMDt9LmFjZV9zY3JvbGxlci5hY2Vfc2Nyb2xsLWxlZnQge2JveC1zaGFkb3c6IDE3cHggMCAxNnB4IC0xNnB4IHJnYmEoMCwgMCwgMCwgMC40KSBpbnNldDt9LmFjZV9ndXR0ZXItY2VsbCB7cG9zaXRpb246IGFic29sdXRlO3RvcDogMDtsZWZ0OiAwO3JpZ2h0OiAwO3BhZGRpbmctbGVmdDogMTlweDtwYWRkaW5nLXJpZ2h0OiA2cHg7YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDt9LmFjZV9ndXR0ZXItY2VsbC5hY2VfZXJyb3Ige2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQk9GQk1WRVgvLy8vLy8vLy9RUnN3RkFiL1VpNHdGQVl3RkFZd0ZBYVdHQWZEUnltek9TSC9QeHN3RkFiL1NpVXdGQVl3RkFiVVBSdmpRaURsbG9nNUhoSGRSeWJzVGkzL1R5djlUaXIrU3lqL1VDMy8vLy9YdXJlYk1CSXdGQWIvUlNIYlB4L2dVemZkd0wza3pNaXZLQkF3RkFiYnZibmhQeDY2Tmhvd0ZBWXdGQWFaSmc4d0ZBYXhLQkRadXJmL1JCNm1NeGIvU0NNd0ZBWXdGQWJ4UUIzK1JCNHdGQWIvUWh5NE9oKzRRaWZiTlJjd0ZBWXdGQVl3RkFiL1FSemROaGd3RkFZd0ZBYmF2N3YvVXk3b2FFNjhNQks1THhMZXdyL3IyTlhld0xzd0ZBYXhKdzR3RkFia1BSeTJQeVl3RkFheEtoTG0xdE13RkFhelBpUXdGQWFVR0FiL1FCcmZPeDNidnJ2L1ZDL21hRTR3RkFiUlBCcTZNUk84UXluZXc4RHAydGpmd2Iwd0ZBYng2ZWp1NStieTZ1bnM0dUg5L2YzNit2ci9Ha0hqQUFBQVluUlNUbE1BR3QrNjRybld1L2JvOGVBQTRJbkgzK0R3b043ajRlTGk0eFA5OU5mZzQrYisvdTlCL2VEczFNRDFtTzcrNFBIZzJNWGEzNDdnN3ZEaXpNTE40ZUcrUHY3aTVldnMvdjc5eXU3UzMvRFY3LzQ5OFl2MjRlSCs0dWZRM096dS92Nyt5MTNzUnF3QUFBRExTVVJCVkhqYVpjL1hEc0ZnR0lCaHREcnNobGl0bWsySXJiSEZxTDJwdlhmLys3OERQb2tqNytGejlxcFUvOVVYSklsaG1QYVRhUTZRUGF6MG1tKzVnd2tnb3ZjVjZHWnpkNUp0Q1F3Z3N4b0hPdkpPMTVrbGVSTEFuTWdIRklFU1VFUG1hd0I5bmdtZWxUdGlwd3dmQVNpbHhPTHlpVjVVVlV5VkFmYkcwY0NQSGlnK0dCa3pBRU5IUzBBc3RWRjZiYWNaSU96Z0xteHNIYnQyT2VjTmdKQzgzSkVSbWVQVVlxOEFSR2tKeDZYdEZzZGRkQlFnWkUyblBSNkNJQ1poYXdqQTRGYi9jaHYrMzk5a2ZSK01NTURHT1FBQUFBQkpSVTVFcmtKZ2dnPT0iKTtiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246IDJweCBjZW50ZXI7fS5hY2VfZ3V0dGVyLWNlbGwuYWNlX3dhcm5pbmcge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQW1WQk1WRVgvLy84QUFBRC8vLzhBQUFBQUFBQlBTemIvNXNBQUFBQi9ibEgvNzN6L3Vsa0FBQUFBQUFEODVwa0FBQUFBQUFBQ0FnUC92R3ovcmtEZXJHYkdyVjcvcGtRSUNBZi8vLy9lMElzQUFBRC9vRUQvcVR2aHJuVUFBQUQveUhEL25qY0FBQUR1djJyL256Ly9vVGovcDA2NG9HZi96SEFBQUFBOU5pci90RklBQUFEL3RsVGl1V2YvdGtJQUFBQ3luWEVBQUFBQUFBQXRJUlc3ekJwQkFBQUFNM1JTVGxNQUFCUjFtN1JYTzhMbjMxWjM2elQrbmVYZTVPem9vUkRmbitUWjRwM2gyaFRmNHQzazN1Y3lyTjFLNStYYWtzNTJTZnM5Q1hnckFBQUFqa2xFUVZSNDJvM1BiUStDSUJRRllFd2JvUGhTWWdvWXVuSXFxTG42L3o4dVlkSDhWbWRudTl2ejRXd1hnTi94VFBSRDIrc2dPY1pqc2dlL3doWFpnVWFZWXZUOFFudUphVXJqckhVUXJlR2N6dUVhZlFDTy9TSlR1ZlRicm9Xc1Bnc2xsVmhxM3dKRWsyalVTelgzQ1VFREpDODQ3MDdkalJjNU1UQVF4b0xndXBXUndXNlVCNWZTKytOVjhBYk9aZ25zQzdCcEVBQUFBQUJKUlU1RXJrSmdnZz09Iik7YmFja2dyb3VuZC1wb3NpdGlvbjogMnB4IGNlbnRlcjt9LmFjZV9ndXR0ZXItY2VsbC5hY2VfaW5mbyB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQUFBQUFBNm1LQzlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQUFKMFVrNVRBQUIyazgwNEFBQUFQa2xFUVZRWTAyTmdJQjY4UXVPM3RpTHpuakF3cEtUZ055RGJNZWd3aXNDSFpVRVRVWlYwWnFPcXVCcFhqMnJ0bnBTSlQxQUVublJtTDJPZ0dnQUFJS2tSUWFwMmh0Z0FBQUFBU1VWT1JLNUNZSUk9Iik7YmFja2dyb3VuZC1wb3NpdGlvbjogMnB4IGNlbnRlcjt9LmFjZV9kYXJrIC5hY2VfZ3V0dGVyLWNlbGwuYWNlX2luZm8ge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQkFNQUFBRHQzZUpTQUFBQUpGQk1WRVVBQUFDaG9hR0FnSUFxS2lxK3ZyNnRyYTFaV1ZtVWxKU2JtNXM4UER4dWJtNTZlbnJkZ3pnM0FBQUFBWFJTVGxNQVFPYllaZ0FBQUNsSlJFRlVlTnBqWU1BUGRzTVlIZWd5SlpGUUJsc1VsTUZWQ1dVWUtrQVpNeFpBR2R4bERNUUJBRytUQlA0QjZSeUpBQUFBQUVsRlRrU3VRbUNDIik7fS5hY2Vfc2Nyb2xsYmFyIHtjb250YWluOiBzdHJpY3Q7cG9zaXRpb246IGFic29sdXRlO3JpZ2h0OiAwO2JvdHRvbTogMDt6LWluZGV4OiA2O30uYWNlX3Njcm9sbGJhci1pbm5lciB7cG9zaXRpb246IGFic29sdXRlO2N1cnNvcjogdGV4dDtsZWZ0OiAwO3RvcDogMDt9LmFjZV9zY3JvbGxiYXItdntvdmVyZmxvdy14OiBoaWRkZW47b3ZlcmZsb3cteTogc2Nyb2xsO3RvcDogMDt9LmFjZV9zY3JvbGxiYXItaCB7b3ZlcmZsb3cteDogc2Nyb2xsO292ZXJmbG93LXk6IGhpZGRlbjtsZWZ0OiAwO30uYWNlX3ByaW50LW1hcmdpbiB7cG9zaXRpb246IGFic29sdXRlO2hlaWdodDogMTAwJTt9LmFjZV90ZXh0LWlucHV0IHtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogMDt3aWR0aDogMC41ZW07aGVpZ2h0OiAxZW07b3BhY2l0eTogMDtiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDstbW96LWFwcGVhcmFuY2U6IG5vbmU7YXBwZWFyYW5jZTogbm9uZTtib3JkZXI6IG5vbmU7cmVzaXplOiBub25lO291dGxpbmU6IG5vbmU7b3ZlcmZsb3c6IGhpZGRlbjtmb250OiBpbmhlcml0O3BhZGRpbmc6IDAgMXB4O21hcmdpbjogMCAtMXB4O2NvbnRhaW46IHN0cmljdDstbXMtdXNlci1zZWxlY3Q6IHRleHQ7LW1vei11c2VyLXNlbGVjdDogdGV4dDstd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0O3VzZXItc2VsZWN0OiB0ZXh0O3doaXRlLXNwYWNlOiBwcmUhaW1wb3J0YW50O30uYWNlX3RleHQtaW5wdXQuYWNlX2NvbXBvc2l0aW9uIHtiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtjb2xvcjogaW5oZXJpdDt6LWluZGV4OiAxMDAwO29wYWNpdHk6IDE7fS5hY2VfY29tcG9zaXRpb25fcGxhY2Vob2xkZXIgeyBjb2xvcjogdHJhbnNwYXJlbnQgfS5hY2VfY29tcG9zaXRpb25fbWFya2VyIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO3Bvc2l0aW9uOiBhYnNvbHV0ZTtib3JkZXItcmFkaXVzOiAwO21hcmdpbi10b3A6IDFweDt9W2FjZV9ub2NvbnRleHQ9dHJ1ZV0ge3RyYW5zZm9ybTogbm9uZSFpbXBvcnRhbnQ7ZmlsdGVyOiBub25lIWltcG9ydGFudDtwZXJzcGVjdGl2ZTogbm9uZSFpbXBvcnRhbnQ7Y2xpcC1wYXRoOiBub25lIWltcG9ydGFudDttYXNrIDogbm9uZSFpbXBvcnRhbnQ7Y29udGFpbjogbm9uZSFpbXBvcnRhbnQ7cGVyc3BlY3RpdmU6IG5vbmUhaW1wb3J0YW50O21peC1ibGVuZC1tb2RlOiBpbml0aWFsIWltcG9ydGFudDt6LWluZGV4OiBhdXRvO30uYWNlX2xheWVyIHt6LWluZGV4OiAxO3Bvc2l0aW9uOiBhYnNvbHV0ZTtvdmVyZmxvdzogaGlkZGVuO3dvcmQtd3JhcDogbm9ybWFsO3doaXRlLXNwYWNlOiBwcmU7aGVpZ2h0OiAxMDAlO3dpZHRoOiAxMDAlO2JveC1zaXppbmc6IGJvcmRlci1ib3g7cG9pbnRlci1ldmVudHM6IG5vbmU7fS5hY2VfZ3V0dGVyLWxheWVyIHtwb3NpdGlvbjogcmVsYXRpdmU7d2lkdGg6IGF1dG87dGV4dC1hbGlnbjogcmlnaHQ7cG9pbnRlci1ldmVudHM6IGF1dG87aGVpZ2h0OiAxMDAwMDAwcHg7Y29udGFpbjogc3R5bGUgc2l6ZSBsYXlvdXQ7fS5hY2VfdGV4dC1sYXllciB7Zm9udDogaW5oZXJpdCAhaW1wb3J0YW50O3Bvc2l0aW9uOiBhYnNvbHV0ZTtoZWlnaHQ6IDEwMDAwMDBweDt3aWR0aDogMTAwMDAwMHB4O2NvbnRhaW46IHN0eWxlIHNpemUgbGF5b3V0O30uYWNlX3RleHQtbGF5ZXIgPiAuYWNlX2xpbmUsIC5hY2VfdGV4dC1sYXllciA+IC5hY2VfbGluZV9ncm91cCB7Y29udGFpbjogc3R5bGUgc2l6ZSBsYXlvdXQ7cG9zaXRpb246IGFic29sdXRlO3RvcDogMDtsZWZ0OiAwO3JpZ2h0OiAwO30uYWNlX2hpZHBpIC5hY2VfdGV4dC1sYXllciwuYWNlX2hpZHBpIC5hY2VfZ3V0dGVyLWxheWVyLC5hY2VfaGlkcGkgLmFjZV9jb250ZW50LC5hY2VfaGlkcGkgLmFjZV9ndXR0ZXIge2NvbnRhaW46IHN0cmljdDt3aWxsLWNoYW5nZTogdHJhbnNmb3JtO30uYWNlX2hpZHBpIC5hY2VfdGV4dC1sYXllciA+IC5hY2VfbGluZSwgLmFjZV9oaWRwaSAuYWNlX3RleHQtbGF5ZXIgPiAuYWNlX2xpbmVfZ3JvdXAge2NvbnRhaW46IHN0cmljdDt9LmFjZV9jamsge2Rpc3BsYXk6IGlubGluZS1ibG9jazt0ZXh0LWFsaWduOiBjZW50ZXI7fS5hY2VfY3Vyc29yLWxheWVyIHt6LWluZGV4OiA0O30uYWNlX2N1cnNvciB7ei1pbmRleDogNDtwb3NpdGlvbjogYWJzb2x1dGU7Ym94LXNpemluZzogYm9yZGVyLWJveDtib3JkZXItbGVmdDogMnB4IHNvbGlkO3RyYW5zZm9ybTogdHJhbnNsYXRleigwKTt9LmFjZV9tdWx0aXNlbGVjdCAuYWNlX2N1cnNvciB7Ym9yZGVyLWxlZnQtd2lkdGg6IDFweDt9LmFjZV9zbGltLWN1cnNvcnMgLmFjZV9jdXJzb3Ige2JvcmRlci1sZWZ0LXdpZHRoOiAxcHg7fS5hY2Vfb3ZlcndyaXRlLWN1cnNvcnMgLmFjZV9jdXJzb3Ige2JvcmRlci1sZWZ0LXdpZHRoOiAwO2JvcmRlci1ib3R0b206IDFweCBzb2xpZDt9LmFjZV9oaWRkZW4tY3Vyc29ycyAuYWNlX2N1cnNvciB7b3BhY2l0eTogMC4yO30uYWNlX3Ntb290aC1ibGlua2luZyAuYWNlX2N1cnNvciB7dHJhbnNpdGlvbjogb3BhY2l0eSAwLjE4czt9LmFjZV9hbmltYXRlLWJsaW5raW5nIC5hY2VfY3Vyc29yIHthbmltYXRpb24tZHVyYXRpb246IDEwMDBtczthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBzdGVwLWVuZDthbmltYXRpb24tbmFtZTogYmxpbmstYWNlLWFuaW1hdGU7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7fS5hY2VfYW5pbWF0ZS1ibGlua2luZy5hY2Vfc21vb3RoLWJsaW5raW5nIC5hY2VfY3Vyc29yIHthbmltYXRpb24tZHVyYXRpb246IDEwMDBtczthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluLW91dDthbmltYXRpb24tbmFtZTogYmxpbmstYWNlLWFuaW1hdGUtc21vb3RoO31Aa2V5ZnJhbWVzIGJsaW5rLWFjZS1hbmltYXRlIHtmcm9tLCB0byB7IG9wYWNpdHk6IDE7IH02MCUgeyBvcGFjaXR5OiAwOyB9fUBrZXlmcmFtZXMgYmxpbmstYWNlLWFuaW1hdGUtc21vb3RoIHtmcm9tLCB0byB7IG9wYWNpdHk6IDE7IH00NSUgeyBvcGFjaXR5OiAxOyB9NjAlIHsgb3BhY2l0eTogMDsgfTg1JSB7IG9wYWNpdHk6IDA7IH19LmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwLCAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogMzt9LmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiA1O30uYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiA2O30uYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZS1saW5lIHtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogMjt9LmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZC13b3JkIHtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogNDtib3gtc2l6aW5nOiBib3JkZXItYm94O30uYWNlX2xpbmUgLmFjZV9mb2xkIHtib3gtc2l6aW5nOiBib3JkZXItYm94O2Rpc3BsYXk6IGlubGluZS1ibG9jaztoZWlnaHQ6IDExcHg7bWFyZ2luLXRvcDogLTJweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJFQUFBQUpDQVlBQUFEVTZNY01BQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQUpwSlJFRlVlTnBpL1AvL1B3T2xnQVhHWUdSa2xBVlNva0Q4R21qd1kxd2FzS2xqUXBZQUN0cENGZUFEY0hWUWZReU1RQXd6d0FaSTN3Skt2Q0xrZktCYU1TQ2xCbFI3Qk9RaWtDRkdRRUVySUgwVnFrYWJpR0NBcXdVYWRBelpKUnhRci8wZ3dpWElhbDh6UVFQbk5WVGdKMVRkYXdMMFQ1Z0JJUDFNVUpOaEJ2MkhLb1FISGpxTnJBNFdPNHpZMGdseU5LTFQyS0lmSU1BQVFzZGdHaVh2Z25ZQUFBQUFTVVZPUks1Q1lJST0iKSx1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBM0NBWUFBQUROTmlBNUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBQ0pKUkVGVWVOcGkrUC8vZnhnVEF3UERCeER4RDA3OFJTWCtZZUV5REZNQ0lNQUFJM0lObVhpd2YyWUFBQUFBU1VWT1JLNUNZSUk9Iik7YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdCwgcmVwZWF0LXg7YmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlciwgdG9wIGxlZnQ7Y29sb3I6IHRyYW5zcGFyZW50O2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrO2JvcmRlci1yYWRpdXM6IDJweDtjdXJzb3I6IHBvaW50ZXI7cG9pbnRlci1ldmVudHM6IGF1dG87fS5hY2VfZGFyayAuYWNlX2ZvbGQge30uYWNlX2ZvbGQ6aG92ZXJ7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkVBQUFBSkNBWUFBQURVNk1jTUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBSnBKUkVGVWVOcGkvUC8vUHdPbGdBWEdZR1JrbEFWU29rRDhHbWp3WTF3YXNLbGpRcFlBQ3RwQ0ZlQURjSFZRZlF5TVFBd3p3QVpJM3dKS3ZDTGtmS0JhTVNDbEJsUjdCT1Fpa0NGR1FFRXJJSDBWcWthYmlHQ0Fxd1VhZEF6WkpSeFFyLzBnd2lYSWFsOHpRUVBuTlZUZ0oxVGRhd0wwVDVnQklQMU1VSk5oQnYySEtvUUhIanFOckE0V080elkwZ2x5TktMVDJLSWZJTUFBUXNkZ0dpWHZnbllBQUFBQVNVVk9SSzVDWUlJPSIpLHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUEzQ0FZQUFBRE5OaUE1QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFDQkpSRUZVZU5waStQLy9mejRUQXdQRFp4RHhENVg0aTVmTE1Fd0pnQUFEQUVQVkRiak53ODdaQUFBQUFFbEZUa1N1UW1DQyIpO30uYWNlX3Rvb2x0aXAge2JhY2tncm91bmQtY29sb3I6ICNGRkY7YmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgdHJhbnNwYXJlbnQsIHJnYmEoMCwgMCwgMCwgMC4xKSk7Ym9yZGVyOiAxcHggc29saWQgZ3JheTtib3JkZXItcmFkaXVzOiAxcHg7Ym94LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTtjb2xvcjogYmxhY2s7bWF4LXdpZHRoOiAxMDAlO3BhZGRpbmc6IDNweCA0cHg7cG9zaXRpb246IGZpeGVkO3otaW5kZXg6IDk5OTk5OTtib3gtc2l6aW5nOiBib3JkZXItYm94O2N1cnNvcjogZGVmYXVsdDt3aGl0ZS1zcGFjZTogcHJlO3dvcmQtd3JhcDogYnJlYWstd29yZDtsaW5lLWhlaWdodDogbm9ybWFsO2ZvbnQtc3R5bGU6IG5vcm1hbDtmb250LXdlaWdodDogbm9ybWFsO2xldHRlci1zcGFjaW5nOiBub3JtYWw7cG9pbnRlci1ldmVudHM6IG5vbmU7fS5hY2VfZm9sZGluZy1lbmFibGVkID4gLmFjZV9ndXR0ZXItY2VsbCB7cGFkZGluZy1yaWdodDogMTNweDt9LmFjZV9mb2xkLXdpZGdldCB7Ym94LXNpemluZzogYm9yZGVyLWJveDttYXJnaW46IDAgLTEycHggMCAxcHg7ZGlzcGxheTogbm9uZTt3aWR0aDogMTFweDt2ZXJ0aWNhbC1hbGlnbjogdG9wO2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBVUFBQUFGQ0FZQUFBQ05ieWJsQUFBQU5FbEVRVlI0Mm1XS3NRMEFNQXpDOGl4TGxyelFqem1CaUVqcDBBNld3QkNTUGdLQVhvTGtxU290N25OM3lNd1I3cFozMk56cEtrVm9EQlV4S0FBQUFBQkpSVTVFcmtKZ2dnPT0iKTtiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtib3JkZXItcmFkaXVzOiAzcHg7Ym9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7Y3Vyc29yOiBwb2ludGVyO30uYWNlX2ZvbGRpbmctZW5hYmxlZCAuYWNlX2ZvbGQtd2lkZ2V0IHtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7ICAgfS5hY2VfZm9sZC13aWRnZXQuYWNlX2VuZCB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFVQUFBQUZDQVlBQUFDTmJ5YmxBQUFBTkVsRVFWUjQybTNId1FrQU1BaEQwWXpzUmNoRktJN3NBaWtlV2tyeHdTY0VCMG5oNWU3S1RQV2ltWmtpNHRZZlZiWCtNTmw0cHlaWGVqVU8xUUFBQUFCSlJVNUVya0pnZ2c9PSIpO30uYWNlX2ZvbGQtd2lkZ2V0LmFjZV9jbG9zZWQge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBTUFBQUFHQ0FZQUFBQUc1U1FNQUFBQU9VbEVRVlI0MmpYS3dRa0FNQWdEd0t3cUtENEV3UTI2c1NPa1ZXamdJSUhBelBpQ2dhcWlxbkpIWm5LSUNCRVJITjE5NE81Yjl2Ykx1QVZSTCtsMFlXblpBQUFBQUVsRlRrU3VRbUNDWEE9PSIpO30uYWNlX2ZvbGQtd2lkZ2V0OmhvdmVyIHtib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMyk7YmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO2JveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7fS5hY2VfZm9sZC13aWRnZXQ6YWN0aXZlIHtib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNCk7YmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTtib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpO30uYWNlX2RhcmsgLmFjZV9mb2xkLXdpZGdldCB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFVQUFBQUZDQVlBQUFDTmJ5YmxBQUFBSGtsRVFWUUlXMlA0Ly84L0F6b0dFUTdvR0NhTExBaFdpU3dCMTQ2QkFRQ1NUUFlvY3FUMEFBQUFBRWxGVGtTdVFtQ0MiKTt9LmFjZV9kYXJrIC5hY2VfZm9sZC13aWRnZXQuYWNlX2VuZCB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFVQUFBQUZDQVlBQUFDTmJ5YmxBQUFBSDBsRVFWUUlXMlA0Ly84L0F4UTd3TmpJQWpETWdDNEF4akNWS0JpcklBQUYwa3oycmxoeHBBQUFBQUJKUlU1RXJrSmdnZz09Iik7fS5hY2VfZGFyayAuYWNlX2ZvbGQtd2lkZ2V0LmFjZV9jbG9zZWQge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBTUFBQUFGQ0FZQUFBQ0FjVmFpQUFBQUhFbEVRVlFJVzJQNC8vKy9BeEF6Z0RBRGxPT0F6bkhBS2dQV0F3QVJqaThVSURUZlFRQUFBQUJKUlU1RXJrSmdnZz09Iik7fS5hY2VfZGFyayAuYWNlX2ZvbGQtd2lkZ2V0OmhvdmVyIHtib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO2JhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTt9LmFjZV9kYXJrIC5hY2VfZm9sZC13aWRnZXQ6YWN0aXZlIHtib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO30uYWNlX2lubGluZV9idXR0b24ge2JvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JheTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bWFyZ2luOiAtMXB4IDhweDtwYWRkaW5nOiAwIDVweDtwb2ludGVyLWV2ZW50czogYXV0bztjdXJzb3I6IHBvaW50ZXI7fS5hY2VfaW5saW5lX2J1dHRvbjpob3ZlciB7Ym9yZGVyLWNvbG9yOiBncmF5O2JhY2tncm91bmQ6IHJnYmEoMjAwLDIwMCwyMDAsMC4yKTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7cG9pbnRlci1ldmVudHM6IGF1dG87fS5hY2VfZm9sZC13aWRnZXQuYWNlX2ludmFsaWQge2JhY2tncm91bmQtY29sb3I6ICNGRkI0QjQ7Ym9yZGVyLWNvbG9yOiAjREU1NTU1O30uYWNlX2ZhZGUtZm9sZC13aWRnZXRzIC5hY2VfZm9sZC13aWRnZXQge3RyYW5zaXRpb246IG9wYWNpdHkgMC40cyBlYXNlIDAuMDVzO29wYWNpdHk6IDA7fS5hY2VfZmFkZS1mb2xkLXdpZGdldHM6aG92ZXIgLmFjZV9mb2xkLXdpZGdldCB7dHJhbnNpdGlvbjogb3BhY2l0eSAwLjA1cyBlYXNlIDAuMDVzO29wYWNpdHk6MTt9LmFjZV91bmRlcmxpbmUge3RleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO30uYWNlX2JvbGQge2ZvbnQtd2VpZ2h0OiBib2xkO30uYWNlX25vYm9sZCAuYWNlX2JvbGQge2ZvbnQtd2VpZ2h0OiBub3JtYWw7fS5hY2VfaXRhbGljIHtmb250LXN0eWxlOiBpdGFsaWM7fS5hY2VfZXJyb3ItbWFya2VyIHtiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMCwgMCwwLjIpO3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiA5O30uYWNlX2hpZ2hsaWdodC1tYXJrZXIge2JhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDAsMC4yKTtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogODt9LmFjZV9tb2JpbGUtbWVudSB7cG9zaXRpb246IGFic29sdXRlO2xpbmUtaGVpZ2h0OiAxLjU7Ym9yZGVyLXJhZGl1czogNHB4Oy1tcy11c2VyLXNlbGVjdDogbm9uZTstbW96LXVzZXItc2VsZWN0OiBub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7dXNlci1zZWxlY3Q6IG5vbmU7YmFja2dyb3VuZDogd2hpdGU7Ym94LXNoYWRvdzogMXB4IDNweCAycHggZ3JleTtib3JkZXI6IDFweCBzb2xpZCAjZGNkY2RjO2NvbG9yOiBibGFjazt9LmFjZV9kYXJrID4gLmFjZV9tb2JpbGUtbWVudSB7YmFja2dyb3VuZDogIzMzMztjb2xvcjogI2NjYztib3gtc2hhZG93OiAxcHggM3B4IDJweCBncmV5O2JvcmRlcjogMXB4IHNvbGlkICM0NDQ7fS5hY2VfbW9iaWxlLWJ1dHRvbiB7cGFkZGluZzogMnB4O2N1cnNvcjogcG9pbnRlcjtvdmVyZmxvdzogaGlkZGVuO30uYWNlX21vYmlsZS1idXR0b246aG92ZXIge2JhY2tncm91bmQtY29sb3I6ICNlZWU7b3BhY2l0eToxO30uYWNlX21vYmlsZS1idXR0b246YWN0aXZlIHtiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO30nLG09ZSgiLi9saWIvdXNlcmFnZW50IiksZz1tLmlzSUU7aS5pbXBvcnRDc3NTdHJpbmcodiwiYWNlX2VkaXRvci5jc3MiKTt2YXIgeT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dGhpcy5jb250YWluZXI9ZXx8aS5jcmVhdGVFbGVtZW50KCJkaXYiKSxpLmFkZENzc0NsYXNzKHRoaXMuY29udGFpbmVyLCJhY2VfZWRpdG9yIiksaS5ISV9EUEkmJmkuYWRkQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsImFjZV9oaWRwaSIpLHRoaXMuc2V0VGhlbWUodCksdGhpcy4kZ3V0dGVyPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kZ3V0dGVyLmNsYXNzTmFtZT0iYWNlX2d1dHRlciIsdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy4kZ3V0dGVyKSx0aGlzLiRndXR0ZXIuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsITApLHRoaXMuc2Nyb2xsZXI9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnNjcm9sbGVyLmNsYXNzTmFtZT0iYWNlX3Njcm9sbGVyIix0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnNjcm9sbGVyKSx0aGlzLmNvbnRlbnQ9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbnRlbnQuY2xhc3NOYW1lPSJhY2VfY29udGVudCIsdGhpcy5zY3JvbGxlci5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnQpLHRoaXMuJGd1dHRlckxheWVyPW5ldyBvKHRoaXMuJGd1dHRlciksdGhpcy4kZ3V0dGVyTGF5ZXIub24oImNoYW5nZUd1dHRlcldpZHRoIix0aGlzLm9uR3V0dGVyUmVzaXplLmJpbmQodGhpcykpLHRoaXMuJG1hcmtlckJhY2s9bmV3IHUodGhpcy5jb250ZW50KTt2YXIgcj10aGlzLiR0ZXh0TGF5ZXI9bmV3IGEodGhpcy5jb250ZW50KTt0aGlzLmNhbnZhcz1yLmVsZW1lbnQsdGhpcy4kbWFya2VyRnJvbnQ9bmV3IHUodGhpcy5jb250ZW50KSx0aGlzLiRjdXJzb3JMYXllcj1uZXcgZih0aGlzLmNvbnRlbnQpLHRoaXMuJGhvcml6U2Nyb2xsPSExLHRoaXMuJHZTY3JvbGw9ITEsdGhpcy5zY3JvbGxCYXI9dGhpcy5zY3JvbGxCYXJWPW5ldyBjKHRoaXMuY29udGFpbmVyLHRoaXMpLHRoaXMuc2Nyb2xsQmFySD1uZXcgbCh0aGlzLmNvbnRhaW5lcix0aGlzKSx0aGlzLnNjcm9sbEJhclYuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmdW5jdGlvbihlKXtuLiRzY3JvbGxBbmltYXRpb258fG4uc2Vzc2lvbi5zZXRTY3JvbGxUb3AoZS5kYXRhLW4uc2Nyb2xsTWFyZ2luLnRvcCl9KSx0aGlzLnNjcm9sbEJhckguYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmdW5jdGlvbihlKXtuLiRzY3JvbGxBbmltYXRpb258fG4uc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KGUuZGF0YS1uLnNjcm9sbE1hcmdpbi5sZWZ0KX0pLHRoaXMuc2Nyb2xsVG9wPTAsdGhpcy5zY3JvbGxMZWZ0PTAsdGhpcy5jdXJzb3JQb3M9e3JvdzowLGNvbHVtbjowfSx0aGlzLiRmb250TWV0cmljcz1uZXcgcCh0aGlzLmNvbnRhaW5lciksdGhpcy4kdGV4dExheWVyLiRzZXRGb250TWV0cmljcyh0aGlzLiRmb250TWV0cmljcyksdGhpcy4kdGV4dExheWVyLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZUNoYXJhY3RlclNpemUiLGZ1bmN0aW9uKGUpe24udXBkYXRlQ2hhcmFjdGVyU2l6ZSgpLG4ub25SZXNpemUoITAsbi5ndXR0ZXJXaWR0aCxuLiRzaXplLndpZHRoLG4uJHNpemUuaGVpZ2h0KSxuLl9zaWduYWwoImNoYW5nZUNoYXJhY3RlclNpemUiLGUpfSksdGhpcy4kc2l6ZT17d2lkdGg6MCxoZWlnaHQ6MCxzY3JvbGxlckhlaWdodDowLHNjcm9sbGVyV2lkdGg6MCwkZGlydHk6ITB9LHRoaXMubGF5ZXJDb25maWc9e3dpZHRoOjEscGFkZGluZzowLGZpcnN0Um93OjAsZmlyc3RSb3dTY3JlZW46MCxsYXN0Um93OjAsbGluZUhlaWdodDowLGNoYXJhY3RlcldpZHRoOjAsbWluSGVpZ2h0OjEsbWF4SGVpZ2h0OjEsb2Zmc2V0OjAsaGVpZ2h0OjEsZ3V0dGVyT2Zmc2V0OjF9LHRoaXMuc2Nyb2xsTWFyZ2luPXtsZWZ0OjAscmlnaHQ6MCx0b3A6MCxib3R0b206MCx2OjAsaDowfSx0aGlzLm1hcmdpbj17bGVmdDowLHJpZ2h0OjAsdG9wOjAsYm90dG9tOjAsdjowLGg6MH0sdGhpcy4ka2VlcFRleHRBcmVhQXRDdXJzb3I9IW0uaXNJT1MsdGhpcy4kbG9vcD1uZXcgaCh0aGlzLiRyZW5kZXJDaGFuZ2VzLmJpbmQodGhpcyksdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKSx0aGlzLnVwZGF0ZUNoYXJhY3RlclNpemUoKSx0aGlzLnNldFBhZGRpbmcoNCkscy5yZXNldE9wdGlvbnModGhpcykscy5fc2lnbmFsKCJyZW5kZXJlciIsdGhpcyl9OyhmdW5jdGlvbigpe3RoaXMuQ0hBTkdFX0NVUlNPUj0xLHRoaXMuQ0hBTkdFX01BUktFUj0yLHRoaXMuQ0hBTkdFX0dVVFRFUj00LHRoaXMuQ0hBTkdFX1NDUk9MTD04LHRoaXMuQ0hBTkdFX0xJTkVTPTE2LHRoaXMuQ0hBTkdFX1RFWFQ9MzIsdGhpcy5DSEFOR0VfU0laRT02NCx0aGlzLkNIQU5HRV9NQVJLRVJfQkFDSz0xMjgsdGhpcy5DSEFOR0VfTUFSS0VSX0ZST05UPTI1Nix0aGlzLkNIQU5HRV9GVUxMPTUxMix0aGlzLkNIQU5HRV9IX1NDUk9MTD0xMDI0LHIuaW1wbGVtZW50KHRoaXMsZCksdGhpcy51cGRhdGVDaGFyYWN0ZXJTaXplPWZ1bmN0aW9uKCl7dGhpcy4kdGV4dExheWVyLmFsbG93Qm9sZEZvbnRzIT10aGlzLiRhbGxvd0JvbGRGb250cyYmKHRoaXMuJGFsbG93Qm9sZEZvbnRzPXRoaXMuJHRleHRMYXllci5hbGxvd0JvbGRGb250cyx0aGlzLnNldFN0eWxlKCJhY2Vfbm9ib2xkIiwhdGhpcy4kYWxsb3dCb2xkRm9udHMpKSx0aGlzLmxheWVyQ29uZmlnLmNoYXJhY3RlcldpZHRoPXRoaXMuY2hhcmFjdGVyV2lkdGg9dGhpcy4kdGV4dExheWVyLmdldENoYXJhY3RlcldpZHRoKCksdGhpcy5sYXllckNvbmZpZy5saW5lSGVpZ2h0PXRoaXMubGluZUhlaWdodD10aGlzLiR0ZXh0TGF5ZXIuZ2V0TGluZUhlaWdodCgpLHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCksaS5zZXRTdHlsZSh0aGlzLnNjcm9sbGVyLnN0eWxlLCJsaW5lLWhlaWdodCIsdGhpcy5saW5lSGVpZ2h0KyJweCIpfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24uZG9jLm9mZigiY2hhbmdlTmV3TGluZU1vZGUiLHRoaXMub25DaGFuZ2VOZXdMaW5lTW9kZSksdGhpcy5zZXNzaW9uPWUsZSYmdGhpcy5zY3JvbGxNYXJnaW4udG9wJiZlLmdldFNjcm9sbFRvcCgpPD0wJiZlLnNldFNjcm9sbFRvcCgtdGhpcy5zY3JvbGxNYXJnaW4udG9wKSx0aGlzLiRjdXJzb3JMYXllci5zZXRTZXNzaW9uKGUpLHRoaXMuJG1hcmtlckJhY2suc2V0U2Vzc2lvbihlKSx0aGlzLiRtYXJrZXJGcm9udC5zZXRTZXNzaW9uKGUpLHRoaXMuJGd1dHRlckxheWVyLnNldFNlc3Npb24oZSksdGhpcy4kdGV4dExheWVyLnNldFNlc3Npb24oZSk7aWYoIWUpcmV0dXJuO3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCksdGhpcy5zZXNzaW9uLiRzZXRGb250TWV0cmljcyh0aGlzLiRmb250TWV0cmljcyksdGhpcy5zY3JvbGxCYXJILnNjcm9sbExlZnQ9dGhpcy5zY3JvbGxCYXJWLnNjcm9sbFRvcD1udWxsLHRoaXMub25DaGFuZ2VOZXdMaW5lTW9kZT10aGlzLm9uQ2hhbmdlTmV3TGluZU1vZGUuYmluZCh0aGlzKSx0aGlzLm9uQ2hhbmdlTmV3TGluZU1vZGUoKSx0aGlzLnNlc3Npb24uZG9jLm9uKCJjaGFuZ2VOZXdMaW5lTW9kZSIsdGhpcy5vbkNoYW5nZU5ld0xpbmVNb2RlKX0sdGhpcy51cGRhdGVMaW5lcz1mdW5jdGlvbihlLHQsbil7dD09PXVuZGVmaW5lZCYmKHQ9SW5maW5pdHkpLHRoaXMuJGNoYW5nZWRMaW5lcz8odGhpcy4kY2hhbmdlZExpbmVzLmZpcnN0Um93PmUmJih0aGlzLiRjaGFuZ2VkTGluZXMuZmlyc3RSb3c9ZSksdGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3c8dCYmKHRoaXMuJGNoYW5nZWRMaW5lcy5sYXN0Um93PXQpKTp0aGlzLiRjaGFuZ2VkTGluZXM9e2ZpcnN0Um93OmUsbGFzdFJvdzp0fTtpZih0aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdzx0aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93KXtpZighbilyZXR1cm47dGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3c9dGhpcy5sYXllckNvbmZpZy5sYXN0Um93fWlmKHRoaXMuJGNoYW5nZWRMaW5lcy5maXJzdFJvdz50aGlzLmxheWVyQ29uZmlnLmxhc3RSb3cpcmV0dXJuO3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfTElORVMpfSx0aGlzLm9uQ2hhbmdlTmV3TGluZU1vZGU9ZnVuY3Rpb24oKXt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFQpLHRoaXMuJHRleHRMYXllci4kdXBkYXRlRW9sQ2hhcigpLHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuc2V0RW9sQ2hhcih0aGlzLiR0ZXh0TGF5ZXIuRU9MX0NIQVIpfSx0aGlzLm9uQ2hhbmdlVGFiU2l6ZT1mdW5jdGlvbigpe3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfVEVYVHx0aGlzLkNIQU5HRV9NQVJLRVIpLHRoaXMuJHRleHRMYXllci5vbkNoYW5nZVRhYlNpemUoKX0sdGhpcy51cGRhdGVUZXh0PWZ1bmN0aW9uKCl7dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9URVhUKX0sdGhpcy51cGRhdGVGdWxsPWZ1bmN0aW9uKGUpe2U/dGhpcy4kcmVuZGVyQ2hhbmdlcyh0aGlzLkNIQU5HRV9GVUxMLCEwKTp0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpfSx0aGlzLnVwZGF0ZUZvbnRTaXplPWZ1bmN0aW9uKCl7dGhpcy4kdGV4dExheWVyLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKX0sdGhpcy4kY2hhbmdlcz0wLHRoaXMuJHVwZGF0ZVNpemVBc3luYz1mdW5jdGlvbigpe3RoaXMuJGxvb3AucGVuZGluZz90aGlzLiRzaXplLiRkaXJ0eT0hMDp0aGlzLm9uUmVzaXplKCl9LHRoaXMub25SZXNpemU9ZnVuY3Rpb24oZSx0LG4scil7aWYodGhpcy5yZXNpemluZz4yKXJldHVybjt0aGlzLnJlc2l6aW5nPjA/dGhpcy5yZXNpemluZysrOnRoaXMucmVzaXppbmc9ZT8xOjA7dmFyIGk9dGhpcy5jb250YWluZXI7cnx8KHI9aS5jbGllbnRIZWlnaHR8fGkuc2Nyb2xsSGVpZ2h0KSxufHwobj1pLmNsaWVudFdpZHRofHxpLnNjcm9sbFdpZHRoKTt2YXIgcz10aGlzLiR1cGRhdGVDYWNoZWRTaXplKGUsdCxuLHIpO2lmKCF0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0fHwhbiYmIXIpcmV0dXJuIHRoaXMucmVzaXppbmc9MDtlJiYodGhpcy4kZ3V0dGVyTGF5ZXIuJHBhZGRpbmc9bnVsbCksZT90aGlzLiRyZW5kZXJDaGFuZ2VzKHN8dGhpcy4kY2hhbmdlcywhMCk6dGhpcy4kbG9vcC5zY2hlZHVsZShzfHRoaXMuJGNoYW5nZXMpLHRoaXMucmVzaXppbmcmJih0aGlzLnJlc2l6aW5nPTApLHRoaXMuc2Nyb2xsQmFyVi5zY3JvbGxMZWZ0PXRoaXMuc2Nyb2xsQmFyVi5zY3JvbGxUb3A9bnVsbH0sdGhpcy4kdXBkYXRlQ2FjaGVkU2l6ZT1mdW5jdGlvbihlLHQsbixyKXtyLT10aGlzLiRleHRyYUhlaWdodHx8MDt2YXIgcz0wLG89dGhpcy4kc2l6ZSx1PXt3aWR0aDpvLndpZHRoLGhlaWdodDpvLmhlaWdodCxzY3JvbGxlckhlaWdodDpvLnNjcm9sbGVySGVpZ2h0LHNjcm9sbGVyV2lkdGg6by5zY3JvbGxlcldpZHRofTtyJiYoZXx8by5oZWlnaHQhPXIpJiYoby5oZWlnaHQ9cixzfD10aGlzLkNIQU5HRV9TSVpFLG8uc2Nyb2xsZXJIZWlnaHQ9by5oZWlnaHQsdGhpcy4kaG9yaXpTY3JvbGwmJihvLnNjcm9sbGVySGVpZ2h0LT10aGlzLnNjcm9sbEJhckguZ2V0SGVpZ2h0KCkpLHRoaXMuc2Nyb2xsQmFyVi5lbGVtZW50LnN0eWxlLmJvdHRvbT10aGlzLnNjcm9sbEJhckguZ2V0SGVpZ2h0KCkrInB4IixzfD10aGlzLkNIQU5HRV9TQ1JPTEwpO2lmKG4mJihlfHxvLndpZHRoIT1uKSl7c3w9dGhpcy5DSEFOR0VfU0laRSxvLndpZHRoPW4sdD09bnVsbCYmKHQ9dGhpcy4kc2hvd0d1dHRlcj90aGlzLiRndXR0ZXIub2Zmc2V0V2lkdGg6MCksdGhpcy5ndXR0ZXJXaWR0aD10LGkuc2V0U3R5bGUodGhpcy5zY3JvbGxCYXJILmVsZW1lbnQuc3R5bGUsImxlZnQiLHQrInB4IiksaS5zZXRTdHlsZSh0aGlzLnNjcm9sbGVyLnN0eWxlLCJsZWZ0Iix0K3RoaXMubWFyZ2luLmxlZnQrInB4Iiksby5zY3JvbGxlcldpZHRoPU1hdGgubWF4KDAsbi10LXRoaXMuc2Nyb2xsQmFyVi5nZXRXaWR0aCgpLXRoaXMubWFyZ2luLmgpLGkuc2V0U3R5bGUodGhpcy4kZ3V0dGVyLnN0eWxlLCJsZWZ0Iix0aGlzLm1hcmdpbi5sZWZ0KyJweCIpO3ZhciBhPXRoaXMuc2Nyb2xsQmFyVi5nZXRXaWR0aCgpKyJweCI7aS5zZXRTdHlsZSh0aGlzLnNjcm9sbEJhckguZWxlbWVudC5zdHlsZSwicmlnaHQiLGEpLGkuc2V0U3R5bGUodGhpcy5zY3JvbGxlci5zdHlsZSwicmlnaHQiLGEpLGkuc2V0U3R5bGUodGhpcy5zY3JvbGxlci5zdHlsZSwiYm90dG9tIix0aGlzLnNjcm9sbEJhckguZ2V0SGVpZ2h0KCkpO2lmKHRoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCkmJnRoaXMuYWRqdXN0V3JhcExpbWl0KCl8fGUpc3w9dGhpcy5DSEFOR0VfRlVMTH1yZXR1cm4gby4kZGlydHk9IW58fCFyLHMmJnRoaXMuX3NpZ25hbCgicmVzaXplIix1KSxzfSx0aGlzLm9uR3V0dGVyUmVzaXplPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJHNob3dHdXR0ZXI/ZTowO3QhPXRoaXMuZ3V0dGVyV2lkdGgmJih0aGlzLiRjaGFuZ2VzfD10aGlzLiR1cGRhdGVDYWNoZWRTaXplKCEwLHQsdGhpcy4kc2l6ZS53aWR0aCx0aGlzLiRzaXplLmhlaWdodCkpLHRoaXMuc2Vzc2lvbi5nZXRVc2VXcmFwTW9kZSgpJiZ0aGlzLmFkanVzdFdyYXBMaW1pdCgpP3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCk6dGhpcy4kc2l6ZS4kZGlydHk/dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKTp0aGlzLiRjb21wdXRlTGF5ZXJDb25maWcoKX0sdGhpcy5hZGp1c3RXcmFwTGltaXQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgtdGhpcy4kcGFkZGluZyoyLHQ9TWF0aC5mbG9vcihlL3RoaXMuY2hhcmFjdGVyV2lkdGgpO3JldHVybiB0aGlzLnNlc3Npb24uYWRqdXN0V3JhcExpbWl0KHQsdGhpcy4kc2hvd1ByaW50TWFyZ2luJiZ0aGlzLiRwcmludE1hcmdpbkNvbHVtbil9LHRoaXMuc2V0QW5pbWF0ZWRTY3JvbGw9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImFuaW1hdGVkU2Nyb2xsIixlKX0sdGhpcy5nZXRBbmltYXRlZFNjcm9sbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRhbmltYXRlZFNjcm9sbH0sdGhpcy5zZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigic2hvd0ludmlzaWJsZXMiLGUpLHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuc2V0U2hvd0ludmlzaWJsZXMoZSl9LHRoaXMuZ2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInNob3dJbnZpc2libGVzIil9LHRoaXMuZ2V0RGlzcGxheUluZGVudEd1aWRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiZGlzcGxheUluZGVudEd1aWRlcyIpfSx0aGlzLnNldERpc3BsYXlJbmRlbnRHdWlkZXM9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImRpc3BsYXlJbmRlbnRHdWlkZXMiLGUpfSx0aGlzLnNldFNob3dQcmludE1hcmdpbj1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigic2hvd1ByaW50TWFyZ2luIixlKX0sdGhpcy5nZXRTaG93UHJpbnRNYXJnaW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInNob3dQcmludE1hcmdpbiIpfSx0aGlzLnNldFByaW50TWFyZ2luQ29sdW1uPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJwcmludE1hcmdpbkNvbHVtbiIsZSl9LHRoaXMuZ2V0UHJpbnRNYXJnaW5Db2x1bW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInByaW50TWFyZ2luQ29sdW1uIil9LHRoaXMuZ2V0U2hvd0d1dHRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigic2hvd0d1dHRlciIpfSx0aGlzLnNldFNob3dHdXR0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc2V0T3B0aW9uKCJzaG93R3V0dGVyIixlKX0sdGhpcy5nZXRGYWRlRm9sZFdpZGdldHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImZhZGVGb2xkV2lkZ2V0cyIpfSx0aGlzLnNldEZhZGVGb2xkV2lkZ2V0cz1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiZmFkZUZvbGRXaWRnZXRzIixlKX0sdGhpcy5zZXRIaWdobGlnaHRHdXR0ZXJMaW5lPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJoaWdobGlnaHRHdXR0ZXJMaW5lIixlKX0sdGhpcy5nZXRIaWdobGlnaHRHdXR0ZXJMaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJoaWdobGlnaHRHdXR0ZXJMaW5lIil9LHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luPWZ1bmN0aW9uKCl7aWYoIXRoaXMuJHNob3dQcmludE1hcmdpbiYmIXRoaXMuJHByaW50TWFyZ2luRWwpcmV0dXJuO2lmKCF0aGlzLiRwcmludE1hcmdpbkVsKXt2YXIgZT1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuY2xhc3NOYW1lPSJhY2VfbGF5ZXIgYWNlX3ByaW50LW1hcmdpbi1sYXllciIsdGhpcy4kcHJpbnRNYXJnaW5FbD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuJHByaW50TWFyZ2luRWwuY2xhc3NOYW1lPSJhY2VfcHJpbnQtbWFyZ2luIixlLmFwcGVuZENoaWxkKHRoaXMuJHByaW50TWFyZ2luRWwpLHRoaXMuY29udGVudC5pbnNlcnRCZWZvcmUoZSx0aGlzLmNvbnRlbnQuZmlyc3RDaGlsZCl9dmFyIHQ9dGhpcy4kcHJpbnRNYXJnaW5FbC5zdHlsZTt0LmxlZnQ9TWF0aC5yb3VuZCh0aGlzLmNoYXJhY3RlcldpZHRoKnRoaXMuJHByaW50TWFyZ2luQ29sdW1uK3RoaXMuJHBhZGRpbmcpKyJweCIsdC52aXNpYmlsaXR5PXRoaXMuJHNob3dQcmludE1hcmdpbj8idmlzaWJsZSI6ImhpZGRlbiIsdGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24uJHdyYXA9PS0xJiZ0aGlzLmFkanVzdFdyYXBMaW1pdCgpfSx0aGlzLmdldENvbnRhaW5lckVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWluZXJ9LHRoaXMuZ2V0TW91c2VFdmVudFRhcmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbGVyfSx0aGlzLmdldFRleHRBcmVhQ29udGFpbmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVyfSx0aGlzLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcj1mdW5jdGlvbigpe2lmKHRoaXMuJGlzTW91c2VQcmVzc2VkKXJldHVybjt2YXIgZT10aGlzLnRleHRhcmVhLnN0eWxlLHQ9dGhpcy4kY29tcG9zaXRpb247aWYoIXRoaXMuJGtlZXBUZXh0QXJlYUF0Q3Vyc29yJiYhdCl7aS50cmFuc2xhdGUodGhpcy50ZXh0YXJlYSwtMTAwLDApO3JldHVybn12YXIgbj10aGlzLiRjdXJzb3JMYXllci4kcGl4ZWxQb3M7aWYoIW4pcmV0dXJuO3QmJnQubWFya2VyUmFuZ2UmJihuPXRoaXMuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24odC5tYXJrZXJSYW5nZS5zdGFydCwhMCkpO3ZhciByPXRoaXMubGF5ZXJDb25maWcscz1uLnRvcCxvPW4ubGVmdDtzLT1yLm9mZnNldDt2YXIgdT10JiZ0LnVzZVRleHRhcmVhRm9ySU1FP3RoaXMubGluZUhlaWdodDpnPzA6MTtpZihzPDB8fHM+ci5oZWlnaHQtdSl7aS50cmFuc2xhdGUodGhpcy50ZXh0YXJlYSwwLDApO3JldHVybn12YXIgYT0xLGY9dGhpcy4kc2l6ZS5oZWlnaHQtdTtpZighdClzKz10aGlzLmxpbmVIZWlnaHQ7ZWxzZSBpZih0LnVzZVRleHRhcmVhRm9ySU1FKXt2YXIgbD10aGlzLnRleHRhcmVhLnZhbHVlO2E9dGhpcy5jaGFyYWN0ZXJXaWR0aCp0aGlzLnNlc3Npb24uJGdldFN0cmluZ1NjcmVlbldpZHRoKGwpWzBdLHUrPTJ9ZWxzZSBzKz10aGlzLmxpbmVIZWlnaHQrMjtvLT10aGlzLnNjcm9sbExlZnQsbz50aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgtYSYmKG89dGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoLWEpLG8rPXRoaXMuZ3V0dGVyV2lkdGgrdGhpcy5tYXJnaW4ubGVmdCxpLnNldFN0eWxlKGUsImhlaWdodCIsdSsicHgiKSxpLnNldFN0eWxlKGUsIndpZHRoIixhKyJweCIpLGkudHJhbnNsYXRlKHRoaXMudGV4dGFyZWEsTWF0aC5taW4obyx0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgtYSksTWF0aC5taW4ocyxmKSl9LHRoaXMuZ2V0Rmlyc3RWaXNpYmxlUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3d9LHRoaXMuZ2V0Rmlyc3RGdWxseVZpc2libGVSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXllckNvbmZpZy5maXJzdFJvdysodGhpcy5sYXllckNvbmZpZy5vZmZzZXQ9PT0wPzA6MSl9LHRoaXMuZ2V0TGFzdEZ1bGx5VmlzaWJsZVJvdz1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGF5ZXJDb25maWcsdD1lLmxhc3RSb3csbj10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblJvdyh0LDApKmUubGluZUhlaWdodDtyZXR1cm4gbi10aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCk+ZS5oZWlnaHQtZS5saW5lSGVpZ2h0P3QtMTp0fSx0aGlzLmdldExhc3RWaXNpYmxlUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5ZXJDb25maWcubGFzdFJvd30sdGhpcy4kcGFkZGluZz1udWxsLHRoaXMuc2V0UGFkZGluZz1mdW5jdGlvbihlKXt0aGlzLiRwYWRkaW5nPWUsdGhpcy4kdGV4dExheWVyLnNldFBhZGRpbmcoZSksdGhpcy4kY3Vyc29yTGF5ZXIuc2V0UGFkZGluZyhlKSx0aGlzLiRtYXJrZXJGcm9udC5zZXRQYWRkaW5nKGUpLHRoaXMuJG1hcmtlckJhY2suc2V0UGFkZGluZyhlKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpLHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCl9LHRoaXMuc2V0U2Nyb2xsTWFyZ2luPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuc2Nyb2xsTWFyZ2luO2kudG9wPWV8MCxpLmJvdHRvbT10fDAsaS5yaWdodD1yfDAsaS5sZWZ0PW58MCxpLnY9aS50b3AraS5ib3R0b20saS5oPWkubGVmdCtpLnJpZ2h0LGkudG9wJiZ0aGlzLnNjcm9sbFRvcDw9MCYmdGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKC1pLnRvcCksdGhpcy51cGRhdGVGdWxsKCl9LHRoaXMuc2V0TWFyZ2luPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMubWFyZ2luO2kudG9wPWV8MCxpLmJvdHRvbT10fDAsaS5yaWdodD1yfDAsaS5sZWZ0PW58MCxpLnY9aS50b3AraS5ib3R0b20saS5oPWkubGVmdCtpLnJpZ2h0LHRoaXMuJHVwZGF0ZUNhY2hlZFNpemUoITAsdGhpcy5ndXR0ZXJXaWR0aCx0aGlzLiRzaXplLndpZHRoLHRoaXMuJHNpemUuaGVpZ2h0KSx0aGlzLnVwZGF0ZUZ1bGwoKX0sdGhpcy5nZXRIU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRoU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZX0sdGhpcy5zZXRIU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiaFNjcm9sbEJhckFsd2F5c1Zpc2libGUiLGUpfSx0aGlzLmdldFZTY3JvbGxCYXJBbHdheXNWaXNpYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHZTY3JvbGxCYXJBbHdheXNWaXNpYmxlfSx0aGlzLnNldFZTY3JvbGxCYXJBbHdheXNWaXNpYmxlPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJ2U2Nyb2xsQmFyQWx3YXlzVmlzaWJsZSIsZSl9LHRoaXMuJHVwZGF0ZVNjcm9sbEJhclY9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxheWVyQ29uZmlnLm1heEhlaWdodCx0PXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQ7IXRoaXMuJG1heExpbmVzJiZ0aGlzLiRzY3JvbGxQYXN0RW5kJiYoZS09KHQtdGhpcy5saW5lSGVpZ2h0KSp0aGlzLiRzY3JvbGxQYXN0RW5kLHRoaXMuc2Nyb2xsVG9wPmUtdCYmKGU9dGhpcy5zY3JvbGxUb3ArdCx0aGlzLnNjcm9sbEJhclYuc2Nyb2xsVG9wPW51bGwpKSx0aGlzLnNjcm9sbEJhclYuc2V0U2Nyb2xsSGVpZ2h0KGUrdGhpcy5zY3JvbGxNYXJnaW4udiksdGhpcy5zY3JvbGxCYXJWLnNldFNjcm9sbFRvcCh0aGlzLnNjcm9sbFRvcCt0aGlzLnNjcm9sbE1hcmdpbi50b3ApfSx0aGlzLiR1cGRhdGVTY3JvbGxCYXJIPWZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxCYXJILnNldFNjcm9sbFdpZHRoKHRoaXMubGF5ZXJDb25maWcud2lkdGgrMip0aGlzLiRwYWRkaW5nK3RoaXMuc2Nyb2xsTWFyZ2luLmgpLHRoaXMuc2Nyb2xsQmFySC5zZXRTY3JvbGxMZWZ0KHRoaXMuc2Nyb2xsTGVmdCt0aGlzLnNjcm9sbE1hcmdpbi5sZWZ0KX0sdGhpcy4kZnJvemVuPSExLHRoaXMuZnJlZXplPWZ1bmN0aW9uKCl7dGhpcy4kZnJvemVuPSEwfSx0aGlzLnVuZnJlZXplPWZ1bmN0aW9uKCl7dGhpcy4kZnJvemVuPSExfSx0aGlzLiRyZW5kZXJDaGFuZ2VzPWZ1bmN0aW9uKGUsdCl7dGhpcy4kY2hhbmdlcyYmKGV8PXRoaXMuJGNoYW5nZXMsdGhpcy4kY2hhbmdlcz0wKTtpZighdGhpcy5zZXNzaW9ufHwhdGhpcy5jb250YWluZXIub2Zmc2V0V2lkdGh8fHRoaXMuJGZyb3plbnx8IWUmJiF0KXt0aGlzLiRjaGFuZ2VzfD1lO3JldHVybn1pZih0aGlzLiRzaXplLiRkaXJ0eSlyZXR1cm4gdGhpcy4kY2hhbmdlc3w9ZSx0aGlzLm9uUmVzaXplKCEwKTt0aGlzLmxpbmVIZWlnaHR8fHRoaXMuJHRleHRMYXllci5jaGVja0ZvclNpemVDaGFuZ2VzKCksdGhpcy5fc2lnbmFsKCJiZWZvcmVSZW5kZXIiKSx0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXImJnRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIudXBkYXRlQ2hhcmFjdGVyV2lkdGhzKHRoaXMuJGZvbnRNZXRyaWNzKTt2YXIgbj10aGlzLmxheWVyQ29uZmlnO2lmKGUmdGhpcy5DSEFOR0VfRlVMTHx8ZSZ0aGlzLkNIQU5HRV9TSVpFfHxlJnRoaXMuQ0hBTkdFX1RFWFR8fGUmdGhpcy5DSEFOR0VfTElORVN8fGUmdGhpcy5DSEFOR0VfU0NST0xMfHxlJnRoaXMuQ0hBTkdFX0hfU0NST0xMKXtlfD10aGlzLiRjb21wdXRlTGF5ZXJDb25maWcoKXx0aGlzLiRsb29wLmNsZWFyKCk7aWYobi5maXJzdFJvdyE9dGhpcy5sYXllckNvbmZpZy5maXJzdFJvdyYmbi5maXJzdFJvd1NjcmVlbj09dGhpcy5sYXllckNvbmZpZy5maXJzdFJvd1NjcmVlbil7dmFyIHI9dGhpcy5zY3JvbGxUb3ArKG4uZmlyc3RSb3ctdGhpcy5sYXllckNvbmZpZy5maXJzdFJvdykqdGhpcy5saW5lSGVpZ2h0O3I+MCYmKHRoaXMuc2Nyb2xsVG9wPXIsZXw9dGhpcy5DSEFOR0VfU0NST0xMLGV8PXRoaXMuJGNvbXB1dGVMYXllckNvbmZpZygpfHRoaXMuJGxvb3AuY2xlYXIoKSl9bj10aGlzLmxheWVyQ29uZmlnLHRoaXMuJHVwZGF0ZVNjcm9sbEJhclYoKSxlJnRoaXMuQ0hBTkdFX0hfU0NST0xMJiZ0aGlzLiR1cGRhdGVTY3JvbGxCYXJIKCksaS50cmFuc2xhdGUodGhpcy5jb250ZW50LC10aGlzLnNjcm9sbExlZnQsLW4ub2Zmc2V0KTt2YXIgcz1uLndpZHRoKzIqdGhpcy4kcGFkZGluZysicHgiLG89bi5taW5IZWlnaHQrInB4IjtpLnNldFN0eWxlKHRoaXMuY29udGVudC5zdHlsZSwid2lkdGgiLHMpLGkuc2V0U3R5bGUodGhpcy5jb250ZW50LnN0eWxlLCJoZWlnaHQiLG8pfWUmdGhpcy5DSEFOR0VfSF9TQ1JPTEwmJihpLnRyYW5zbGF0ZSh0aGlzLmNvbnRlbnQsLXRoaXMuc2Nyb2xsTGVmdCwtbi5vZmZzZXQpLHRoaXMuc2Nyb2xsZXIuY2xhc3NOYW1lPXRoaXMuc2Nyb2xsTGVmdDw9MD8iYWNlX3Njcm9sbGVyIjoiYWNlX3Njcm9sbGVyIGFjZV9zY3JvbGwtbGVmdCIpO2lmKGUmdGhpcy5DSEFOR0VfRlVMTCl7dGhpcy4kY2hhbmdlZExpbmVzPW51bGwsdGhpcy4kdGV4dExheWVyLnVwZGF0ZShuKSx0aGlzLiRzaG93R3V0dGVyJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGUobiksdGhpcy4kbWFya2VyQmFjay51cGRhdGUobiksdGhpcy4kbWFya2VyRnJvbnQudXBkYXRlKG4pLHRoaXMuJGN1cnNvckxheWVyLnVwZGF0ZShuKSx0aGlzLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcigpLHRoaXMuX3NpZ25hbCgiYWZ0ZXJSZW5kZXIiKTtyZXR1cm59aWYoZSZ0aGlzLkNIQU5HRV9TQ1JPTEwpe3RoaXMuJGNoYW5nZWRMaW5lcz1udWxsLGUmdGhpcy5DSEFOR0VfVEVYVHx8ZSZ0aGlzLkNIQU5HRV9MSU5FUz90aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKG4pOnRoaXMuJHRleHRMYXllci5zY3JvbGxMaW5lcyhuKSx0aGlzLiRzaG93R3V0dGVyJiYoZSZ0aGlzLkNIQU5HRV9HVVRURVJ8fGUmdGhpcy5DSEFOR0VfTElORVM/dGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKG4pOnRoaXMuJGd1dHRlckxheWVyLnNjcm9sbExpbmVzKG4pKSx0aGlzLiRtYXJrZXJCYWNrLnVwZGF0ZShuKSx0aGlzLiRtYXJrZXJGcm9udC51cGRhdGUobiksdGhpcy4kY3Vyc29yTGF5ZXIudXBkYXRlKG4pLHRoaXMuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yKCksdGhpcy5fc2lnbmFsKCJhZnRlclJlbmRlciIpO3JldHVybn1lJnRoaXMuQ0hBTkdFX1RFWFQ/KHRoaXMuJGNoYW5nZWRMaW5lcz1udWxsLHRoaXMuJHRleHRMYXllci51cGRhdGUobiksdGhpcy4kc2hvd0d1dHRlciYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKG4pKTplJnRoaXMuQ0hBTkdFX0xJTkVTPyh0aGlzLiR1cGRhdGVMaW5lcygpfHxlJnRoaXMuQ0hBTkdFX0dVVFRFUiYmdGhpcy4kc2hvd0d1dHRlcikmJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZShuKTplJnRoaXMuQ0hBTkdFX1RFWFR8fGUmdGhpcy5DSEFOR0VfR1VUVEVSP3RoaXMuJHNob3dHdXR0ZXImJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZShuKTplJnRoaXMuQ0hBTkdFX0NVUlNPUiYmdGhpcy4kaGlnaGxpZ2h0R3V0dGVyTGluZSYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlTGluZUhpZ2hsaWdodChuKSxlJnRoaXMuQ0hBTkdFX0NVUlNPUiYmKHRoaXMuJGN1cnNvckxheWVyLnVwZGF0ZShuKSx0aGlzLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcigpKSxlJih0aGlzLkNIQU5HRV9NQVJLRVJ8dGhpcy5DSEFOR0VfTUFSS0VSX0ZST05UKSYmdGhpcy4kbWFya2VyRnJvbnQudXBkYXRlKG4pLGUmKHRoaXMuQ0hBTkdFX01BUktFUnx0aGlzLkNIQU5HRV9NQVJLRVJfQkFDSykmJnRoaXMuJG1hcmtlckJhY2sudXBkYXRlKG4pLHRoaXMuX3NpZ25hbCgiYWZ0ZXJSZW5kZXIiKX0sdGhpcy4kYXV0b3NpemU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24uZ2V0U2NyZWVuTGVuZ3RoKCkqdGhpcy5saW5lSGVpZ2h0LHQ9dGhpcy4kbWF4TGluZXMqdGhpcy5saW5lSGVpZ2h0LG49TWF0aC5taW4odCxNYXRoLm1heCgodGhpcy4kbWluTGluZXN8fDEpKnRoaXMubGluZUhlaWdodCxlKSkrdGhpcy5zY3JvbGxNYXJnaW4udisodGhpcy4kZXh0cmFIZWlnaHR8fDApO3RoaXMuJGhvcml6U2Nyb2xsJiYobis9dGhpcy5zY3JvbGxCYXJILmdldEhlaWdodCgpKSx0aGlzLiRtYXhQaXhlbEhlaWdodCYmbj50aGlzLiRtYXhQaXhlbEhlaWdodCYmKG49dGhpcy4kbWF4UGl4ZWxIZWlnaHQpO3ZhciByPW48PTIqdGhpcy5saW5lSGVpZ2h0LGk9IXImJmU+dDtpZihuIT10aGlzLmRlc2lyZWRIZWlnaHR8fHRoaXMuJHNpemUuaGVpZ2h0IT10aGlzLmRlc2lyZWRIZWlnaHR8fGkhPXRoaXMuJHZTY3JvbGwpe2khPXRoaXMuJHZTY3JvbGwmJih0aGlzLiR2U2Nyb2xsPWksdGhpcy5zY3JvbGxCYXJWLnNldFZpc2libGUoaSkpO3ZhciBzPXRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoO3RoaXMuY29udGFpbmVyLnN0eWxlLmhlaWdodD1uKyJweCIsdGhpcy4kdXBkYXRlQ2FjaGVkU2l6ZSghMCx0aGlzLiRndXR0ZXJXaWR0aCxzLG4pLHRoaXMuZGVzaXJlZEhlaWdodD1uLHRoaXMuX3NpZ25hbCgiYXV0b3NpemUiKX19LHRoaXMuJGNvbXB1dGVMYXllckNvbmZpZz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbix0PXRoaXMuJHNpemUsbj10LmhlaWdodDw9Mip0aGlzLmxpbmVIZWlnaHQscj10aGlzLnNlc3Npb24uZ2V0U2NyZWVuTGVuZ3RoKCksaT1yKnRoaXMubGluZUhlaWdodCxzPXRoaXMuJGdldExvbmdlc3RMaW5lKCksbz0hbiYmKHRoaXMuJGhTY3JvbGxCYXJBbHdheXNWaXNpYmxlfHx0LnNjcm9sbGVyV2lkdGgtcy0yKnRoaXMuJHBhZGRpbmc8MCksdT10aGlzLiRob3JpelNjcm9sbCE9PW87dSYmKHRoaXMuJGhvcml6U2Nyb2xsPW8sdGhpcy5zY3JvbGxCYXJILnNldFZpc2libGUobykpO3ZhciBhPXRoaXMuJHZTY3JvbGw7dGhpcy4kbWF4TGluZXMmJnRoaXMubGluZUhlaWdodD4xJiZ0aGlzLiRhdXRvc2l6ZSgpO3ZhciBmPXQuc2Nyb2xsZXJIZWlnaHQrdGhpcy5saW5lSGVpZ2h0LGw9IXRoaXMuJG1heExpbmVzJiZ0aGlzLiRzY3JvbGxQYXN0RW5kPyh0LnNjcm9sbGVySGVpZ2h0LXRoaXMubGluZUhlaWdodCkqdGhpcy4kc2Nyb2xsUGFzdEVuZDowO2krPWw7dmFyIGM9dGhpcy5zY3JvbGxNYXJnaW47dGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChNYXRoLm1heCgtYy50b3AsTWF0aC5taW4odGhpcy5zY3JvbGxUb3AsaS10LnNjcm9sbGVySGVpZ2h0K2MuYm90dG9tKSkpLHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KE1hdGgubWF4KC1jLmxlZnQsTWF0aC5taW4odGhpcy5zY3JvbGxMZWZ0LHMrMip0aGlzLiRwYWRkaW5nLXQuc2Nyb2xsZXJXaWR0aCtjLnJpZ2h0KSkpO3ZhciBoPSFuJiYodGhpcy4kdlNjcm9sbEJhckFsd2F5c1Zpc2libGV8fHQuc2Nyb2xsZXJIZWlnaHQtaStsPDB8fHRoaXMuc2Nyb2xsVG9wPmMudG9wKSxwPWEhPT1oO3AmJih0aGlzLiR2U2Nyb2xsPWgsdGhpcy5zY3JvbGxCYXJWLnNldFZpc2libGUoaCkpO3ZhciBkPXRoaXMuc2Nyb2xsVG9wJXRoaXMubGluZUhlaWdodCx2PU1hdGguY2VpbChmL3RoaXMubGluZUhlaWdodCktMSxtPU1hdGgubWF4KDAsTWF0aC5yb3VuZCgodGhpcy5zY3JvbGxUb3AtZCkvdGhpcy5saW5lSGVpZ2h0KSksZz1tK3YseSxiLHc9dGhpcy5saW5lSGVpZ2h0O209ZS5zY3JlZW5Ub0RvY3VtZW50Um93KG0sMCk7dmFyIEU9ZS5nZXRGb2xkTGluZShtKTtFJiYobT1FLnN0YXJ0LnJvdykseT1lLmRvY3VtZW50VG9TY3JlZW5Sb3cobSwwKSxiPWUuZ2V0Um93TGVuZ3RoKG0pKncsZz1NYXRoLm1pbihlLnNjcmVlblRvRG9jdW1lbnRSb3coZywwKSxlLmdldExlbmd0aCgpLTEpLGY9dC5zY3JvbGxlckhlaWdodCtlLmdldFJvd0xlbmd0aChnKSp3K2IsZD10aGlzLnNjcm9sbFRvcC15Knc7dmFyIFM9MDtpZih0aGlzLmxheWVyQ29uZmlnLndpZHRoIT1zfHx1KVM9dGhpcy5DSEFOR0VfSF9TQ1JPTEw7aWYodXx8cClTfD10aGlzLiR1cGRhdGVDYWNoZWRTaXplKCEwLHRoaXMuZ3V0dGVyV2lkdGgsdC53aWR0aCx0LmhlaWdodCksdGhpcy5fc2lnbmFsKCJzY3JvbGxiYXJWaXNpYmlsaXR5Q2hhbmdlZCIpLHAmJihzPXRoaXMuJGdldExvbmdlc3RMaW5lKCkpO3JldHVybiB0aGlzLmxheWVyQ29uZmlnPXt3aWR0aDpzLHBhZGRpbmc6dGhpcy4kcGFkZGluZyxmaXJzdFJvdzptLGZpcnN0Um93U2NyZWVuOnksbGFzdFJvdzpnLGxpbmVIZWlnaHQ6dyxjaGFyYWN0ZXJXaWR0aDp0aGlzLmNoYXJhY3RlcldpZHRoLG1pbkhlaWdodDpmLG1heEhlaWdodDppLG9mZnNldDpkLGd1dHRlck9mZnNldDp3P01hdGgubWF4KDAsTWF0aC5jZWlsKChkK3QuaGVpZ2h0LXQuc2Nyb2xsZXJIZWlnaHQpL3cpKTowLGhlaWdodDp0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0fSx0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyJiZ0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLnNldENvbnRlbnRXaWR0aChzLXRoaXMuJHBhZGRpbmcpLFN9LHRoaXMuJHVwZGF0ZUxpbmVzPWZ1bmN0aW9uKCl7aWYoIXRoaXMuJGNoYW5nZWRMaW5lcylyZXR1cm47dmFyIGU9dGhpcy4kY2hhbmdlZExpbmVzLmZpcnN0Um93LHQ9dGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3c7dGhpcy4kY2hhbmdlZExpbmVzPW51bGw7dmFyIG49dGhpcy5sYXllckNvbmZpZztpZihlPm4ubGFzdFJvdysxKXJldHVybjtpZih0PG4uZmlyc3RSb3cpcmV0dXJuO2lmKHQ9PT1JbmZpbml0eSl7dGhpcy4kc2hvd0d1dHRlciYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKG4pLHRoaXMuJHRleHRMYXllci51cGRhdGUobik7cmV0dXJufXJldHVybiB0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlTGluZXMobixlLHQpLCEwfSx0aGlzLiRnZXRMb25nZXN0TGluZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5XaWR0aCgpO3JldHVybiB0aGlzLnNob3dJbnZpc2libGVzJiYhdGhpcy5zZXNzaW9uLiR1c2VXcmFwTW9kZSYmKGUrPTEpLHRoaXMuJHRleHRMYXllciYmZT50aGlzLiR0ZXh0TGF5ZXIuTUFYX0xJTkVfTEVOR1RIJiYoZT10aGlzLiR0ZXh0TGF5ZXIuTUFYX0xJTkVfTEVOR1RIKzMwKSxNYXRoLm1heCh0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgtMip0aGlzLiRwYWRkaW5nLE1hdGgucm91bmQoZSp0aGlzLmNoYXJhY3RlcldpZHRoKSl9LHRoaXMudXBkYXRlRnJvbnRNYXJrZXJzPWZ1bmN0aW9uKCl7dGhpcy4kbWFya2VyRnJvbnQuc2V0TWFya2Vycyh0aGlzLnNlc3Npb24uZ2V0TWFya2VycyghMCkpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfTUFSS0VSX0ZST05UKX0sdGhpcy51cGRhdGVCYWNrTWFya2Vycz1mdW5jdGlvbigpe3RoaXMuJG1hcmtlckJhY2suc2V0TWFya2Vycyh0aGlzLnNlc3Npb24uZ2V0TWFya2VycygpKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX01BUktFUl9CQUNLKX0sdGhpcy5hZGRHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGUsdCl7dGhpcy4kZ3V0dGVyTGF5ZXIuYWRkR3V0dGVyRGVjb3JhdGlvbihlLHQpfSx0aGlzLnJlbW92ZUd1dHRlckRlY29yYXRpb249ZnVuY3Rpb24oZSx0KXt0aGlzLiRndXR0ZXJMYXllci5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uKGUsdCl9LHRoaXMudXBkYXRlQnJlYWtwb2ludHM9ZnVuY3Rpb24oZSl7dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpfSx0aGlzLnNldEFubm90YXRpb25zPWZ1bmN0aW9uKGUpe3RoaXMuJGd1dHRlckxheWVyLnNldEFubm90YXRpb25zKGUpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKX0sdGhpcy51cGRhdGVDdXJzb3I9ZnVuY3Rpb24oKXt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0NVUlNPUil9LHRoaXMuaGlkZUN1cnNvcj1mdW5jdGlvbigpe3RoaXMuJGN1cnNvckxheWVyLmhpZGVDdXJzb3IoKX0sdGhpcy5zaG93Q3Vyc29yPWZ1bmN0aW9uKCl7dGhpcy4kY3Vyc29yTGF5ZXIuc2hvd0N1cnNvcigpfSx0aGlzLnNjcm9sbFNlbGVjdGlvbkludG9WaWV3PWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnNjcm9sbEN1cnNvckludG9WaWV3KGUsbiksdGhpcy5zY3JvbGxDdXJzb3JJbnRvVmlldyh0LG4pfSx0aGlzLnNjcm9sbEN1cnNvckludG9WaWV3PWZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0PT09MClyZXR1cm47dmFyIHI9dGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbihlKSxpPXIubGVmdCxzPXIudG9wLG89biYmbi50b3B8fDAsdT1uJiZuLmJvdHRvbXx8MCxhPXRoaXMuJHNjcm9sbEFuaW1hdGlvbj90aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCk6dGhpcy5zY3JvbGxUb3A7YStvPnM/KHQmJmErbz5zK3RoaXMubGluZUhlaWdodCYmKHMtPXQqdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCkscz09PTAmJihzPS10aGlzLnNjcm9sbE1hcmdpbi50b3ApLHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AocykpOmErdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodC11PHMrdGhpcy5saW5lSGVpZ2h0JiYodCYmYSt0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0LXU8cy10aGlzLmxpbmVIZWlnaHQmJihzKz10KnRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpLHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3Aocyt0aGlzLmxpbmVIZWlnaHQrdS10aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0KSk7dmFyIGY9dGhpcy5zY3JvbGxMZWZ0O2Y+aT8oaTx0aGlzLiRwYWRkaW5nKzIqdGhpcy5sYXllckNvbmZpZy5jaGFyYWN0ZXJXaWR0aCYmKGk9LXRoaXMuc2Nyb2xsTWFyZ2luLmxlZnQpLHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KGkpKTpmK3RoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aDxpK3RoaXMuY2hhcmFjdGVyV2lkdGg/dGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQoTWF0aC5yb3VuZChpK3RoaXMuY2hhcmFjdGVyV2lkdGgtdGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoKSk6Zjw9dGhpcy4kcGFkZGluZyYmaS1mPHRoaXMuY2hhcmFjdGVyV2lkdGgmJnRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KDApfSx0aGlzLmdldFNjcm9sbFRvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCl9LHRoaXMuZ2V0U2Nyb2xsTGVmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsTGVmdCgpfSx0aGlzLmdldFNjcm9sbFRvcFJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbFRvcC90aGlzLmxpbmVIZWlnaHR9LHRoaXMuZ2V0U2Nyb2xsQm90dG9tUm93PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5mbG9vcigodGhpcy5zY3JvbGxUb3ArdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCkvdGhpcy5saW5lSGVpZ2h0KS0xKX0sdGhpcy5zY3JvbGxUb1Jvdz1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKGUqdGhpcy5saW5lSGVpZ2h0KX0sdGhpcy5hbGlnbkN1cnNvcj1mdW5jdGlvbihlLHQpe3R5cGVvZiBlPT0ibnVtYmVyIiYmKGU9e3JvdzplLGNvbHVtbjowfSk7dmFyIG49dGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbihlKSxyPXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQtdGhpcy5saW5lSGVpZ2h0LGk9bi50b3AtcioodHx8MCk7cmV0dXJuIHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AoaSksaX0sdGhpcy5TVEVQUz04LHRoaXMuJGNhbGNTdGVwcz1mdW5jdGlvbihlLHQpe3ZhciBuPTAscj10aGlzLlNURVBTLGk9W10scz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4qKE1hdGgucG93KGUtMSwzKSsxKSt0fTtmb3Iobj0wO248cjsrK24paS5wdXNoKHMobi90aGlzLlNURVBTLGUsdC1lKSk7cmV0dXJuIGl9LHRoaXMuc2Nyb2xsVG9MaW5lPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oe3JvdzplLGNvbHVtbjowfSkscz1pLnRvcDt0JiYocy09dGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodC8yKTt2YXIgbz10aGlzLnNjcm9sbFRvcDt0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHMpLG4hPT0hMSYmdGhpcy5hbmltYXRlU2Nyb2xsaW5nKG8scil9LHRoaXMuYW5pbWF0ZVNjcm9sbGluZz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2Nyb2xsVG9wO2lmKCF0aGlzLiRhbmltYXRlZFNjcm9sbClyZXR1cm47dmFyIHI9dGhpcztpZihlPT1uKXJldHVybjtpZih0aGlzLiRzY3JvbGxBbmltYXRpb24pe3ZhciBpPXRoaXMuJHNjcm9sbEFuaW1hdGlvbi5zdGVwcztpZihpLmxlbmd0aCl7ZT1pWzBdO2lmKGU9PW4pcmV0dXJufX12YXIgcz1yLiRjYWxjU3RlcHMoZSxuKTt0aGlzLiRzY3JvbGxBbmltYXRpb249e2Zyb206ZSx0bzpuLHN0ZXBzOnN9LGNsZWFySW50ZXJ2YWwodGhpcy4kdGltZXIpLHIuc2Vzc2lvbi5zZXRTY3JvbGxUb3Aocy5zaGlmdCgpKSxyLnNlc3Npb24uJHNjcm9sbFRvcD1uLHRoaXMuJHRpbWVyPXNldEludGVydmFsKGZ1bmN0aW9uKCl7cy5sZW5ndGg/KHIuc2Vzc2lvbi5zZXRTY3JvbGxUb3Aocy5zaGlmdCgpKSxyLnNlc3Npb24uJHNjcm9sbFRvcD1uKTpuIT1udWxsPyhyLnNlc3Npb24uJHNjcm9sbFRvcD0tMSxyLnNlc3Npb24uc2V0U2Nyb2xsVG9wKG4pLG49bnVsbCk6KHIuJHRpbWVyPWNsZWFySW50ZXJ2YWwoci4kdGltZXIpLHIuJHNjcm9sbEFuaW1hdGlvbj1udWxsLHQmJnQoKSl9LDEwKX0sdGhpcy5zY3JvbGxUb1k9ZnVuY3Rpb24oZSl7dGhpcy5zY3JvbGxUb3AhPT1lJiYodGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpLHRoaXMuc2Nyb2xsVG9wPWUpfSx0aGlzLnNjcm9sbFRvWD1mdW5jdGlvbihlKXt0aGlzLnNjcm9sbExlZnQhPT1lJiYodGhpcy5zY3JvbGxMZWZ0PWUpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfSF9TQ1JPTEwpfSx0aGlzLnNjcm9sbFRvPWZ1bmN0aW9uKGUsdCl7dGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcCh0KSx0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdCh0KX0sdGhpcy5zY3JvbGxCeT1mdW5jdGlvbihlLHQpe3QmJnRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AodGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpK3QpLGUmJnRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCkrZSl9LHRoaXMuaXNTY3JvbGxhYmxlQnk9ZnVuY3Rpb24oZSx0KXtpZih0PDAmJnRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKT49MS10aGlzLnNjcm9sbE1hcmdpbi50b3ApcmV0dXJuITA7aWYodD4wJiZ0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkrdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodC10aGlzLmxheWVyQ29uZmlnLm1heEhlaWdodDwtMSt0aGlzLnNjcm9sbE1hcmdpbi5ib3R0b20pcmV0dXJuITA7aWYoZTwwJiZ0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsTGVmdCgpPj0xLXRoaXMuc2Nyb2xsTWFyZ2luLmxlZnQpcmV0dXJuITA7aWYoZT4wJiZ0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsTGVmdCgpK3RoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC10aGlzLmxheWVyQ29uZmlnLndpZHRoPC0xK3RoaXMuc2Nyb2xsTWFyZ2luLnJpZ2h0KXJldHVybiEwfSx0aGlzLnBpeGVsVG9TY3JlZW5Db29yZGluYXRlcz1mdW5jdGlvbihlLHQpe3ZhciBuO2lmKHRoaXMuJGhhc0Nzc1RyYW5zZm9ybXMpe249e3RvcDowLGxlZnQ6MH07dmFyIHI9dGhpcy4kZm9udE1ldHJpY3MudHJhbnNmb3JtQ29vcmRpbmF0ZXMoW2UsdF0pO2U9clsxXS10aGlzLmd1dHRlcldpZHRoLXRoaXMubWFyZ2luLmxlZnQsdD1yWzBdfWVsc2Ugbj10aGlzLnNjcm9sbGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBpPWUrdGhpcy5zY3JvbGxMZWZ0LW4ubGVmdC10aGlzLiRwYWRkaW5nLHM9aS90aGlzLmNoYXJhY3RlcldpZHRoLG89TWF0aC5mbG9vcigodCt0aGlzLnNjcm9sbFRvcC1uLnRvcCkvdGhpcy5saW5lSGVpZ2h0KSx1PXRoaXMuJGJsb2NrQ3Vyc29yP01hdGguZmxvb3Iocyk6TWF0aC5yb3VuZChzKTtyZXR1cm57cm93Om8sY29sdW1uOnUsc2lkZTpzLXU+MD8xOi0xLG9mZnNldFg6aX19LHRoaXMuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZih0aGlzLiRoYXNDc3NUcmFuc2Zvcm1zKXtuPXt0b3A6MCxsZWZ0OjB9O3ZhciByPXRoaXMuJGZvbnRNZXRyaWNzLnRyYW5zZm9ybUNvb3JkaW5hdGVzKFtlLHRdKTtlPXJbMV0tdGhpcy5ndXR0ZXJXaWR0aC10aGlzLm1hcmdpbi5sZWZ0LHQ9clswXX1lbHNlIG49dGhpcy5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgaT1lK3RoaXMuc2Nyb2xsTGVmdC1uLmxlZnQtdGhpcy4kcGFkZGluZyxzPWkvdGhpcy5jaGFyYWN0ZXJXaWR0aCxvPXRoaXMuJGJsb2NrQ3Vyc29yP01hdGguZmxvb3Iocyk6TWF0aC5yb3VuZChzKSx1PU1hdGguZmxvb3IoKHQrdGhpcy5zY3JvbGxUb3Atbi50b3ApL3RoaXMubGluZUhlaWdodCk7cmV0dXJuIHRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24odSxNYXRoLm1heChvLDApLGkpfSx0aGlzLnRleHRUb1NjcmVlbkNvb3JkaW5hdGVzPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxyPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oZSx0KSxpPXRoaXMuJHBhZGRpbmcrKHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuaXNCaWRpUm93KHIucm93LGUpP3RoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuZ2V0UG9zTGVmdChyLmNvbHVtbik6TWF0aC5yb3VuZChyLmNvbHVtbip0aGlzLmNoYXJhY3RlcldpZHRoKSkscz1yLnJvdyp0aGlzLmxpbmVIZWlnaHQ7cmV0dXJue3BhZ2VYOm4ubGVmdCtpLXRoaXMuc2Nyb2xsTGVmdCxwYWdlWTpuLnRvcCtzLXRoaXMuc2Nyb2xsVG9wfX0sdGhpcy52aXN1YWxpemVGb2N1cz1mdW5jdGlvbigpe2kuYWRkQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsImFjZV9mb2N1cyIpfSx0aGlzLnZpc3VhbGl6ZUJsdXI9ZnVuY3Rpb24oKXtpLnJlbW92ZUNzc0NsYXNzKHRoaXMuY29udGFpbmVyLCJhY2VfZm9jdXMiKX0sdGhpcy5zaG93Q29tcG9zaXRpb249ZnVuY3Rpb24oZSl7dGhpcy4kY29tcG9zaXRpb249ZSxlLmNzc1RleHR8fChlLmNzc1RleHQ9dGhpcy50ZXh0YXJlYS5zdHlsZS5jc3NUZXh0KSxlLnVzZVRleHRhcmVhRm9ySU1FPXRoaXMuJHVzZVRleHRhcmVhRm9ySU1FLHRoaXMuJHVzZVRleHRhcmVhRm9ySU1FPyhpLmFkZENzc0NsYXNzKHRoaXMudGV4dGFyZWEsImFjZV9jb21wb3NpdGlvbiIpLHRoaXMudGV4dGFyZWEuc3R5bGUuY3NzVGV4dD0iIix0aGlzLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcigpLHRoaXMuJGN1cnNvckxheWVyLmVsZW1lbnQuc3R5bGUuZGlzcGxheT0ibm9uZSIpOmUubWFya2VySWQ9dGhpcy5zZXNzaW9uLmFkZE1hcmtlcihlLm1hcmtlclJhbmdlLCJhY2VfY29tcG9zaXRpb25fbWFya2VyIiwidGV4dCIpfSx0aGlzLnNldENvbXBvc2l0aW9uVGV4dD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb24uc2VsZWN0aW9uLmN1cnNvcjt0aGlzLmFkZFRva2VuKGUsImNvbXBvc2l0aW9uX3BsYWNlaG9sZGVyIix0LnJvdyx0LmNvbHVtbiksdGhpcy4kbW92ZVRleHRBcmVhVG9DdXJzb3IoKX0sdGhpcy5oaWRlQ29tcG9zaXRpb249ZnVuY3Rpb24oKXtpZighdGhpcy4kY29tcG9zaXRpb24pcmV0dXJuO3RoaXMuJGNvbXBvc2l0aW9uLm1hcmtlcklkJiZ0aGlzLnNlc3Npb24ucmVtb3ZlTWFya2VyKHRoaXMuJGNvbXBvc2l0aW9uLm1hcmtlcklkKSxpLnJlbW92ZUNzc0NsYXNzKHRoaXMudGV4dGFyZWEsImFjZV9jb21wb3NpdGlvbiIpLHRoaXMudGV4dGFyZWEuc3R5bGUuY3NzVGV4dD10aGlzLiRjb21wb3NpdGlvbi5jc3NUZXh0LHRoaXMuJGNvbXBvc2l0aW9uPW51bGwsdGhpcy4kY3Vyc29yTGF5ZXIuZWxlbWVudC5zdHlsZS5kaXNwbGF5PSIifSx0aGlzLmFkZFRva2VuPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuc2Vzc2lvbjtpLmJnVG9rZW5pemVyLmxpbmVzW25dPW51bGw7dmFyIHM9e3R5cGU6dCx2YWx1ZTplfSxvPWkuZ2V0VG9rZW5zKG4pO2lmKHI9PW51bGwpby5wdXNoKHMpO2Vsc2V7dmFyIHU9MDtmb3IodmFyIGE9MDthPG8ubGVuZ3RoO2ErKyl7dmFyIGY9b1thXTt1Kz1mLnZhbHVlLmxlbmd0aDtpZihyPD11KXt2YXIgbD1mLnZhbHVlLmxlbmd0aC0odS1yKSxjPWYudmFsdWUuc2xpY2UoMCxsKSxoPWYudmFsdWUuc2xpY2UobCk7by5zcGxpY2UoYSwxLHt0eXBlOmYudHlwZSx2YWx1ZTpjfSxzLHt0eXBlOmYudHlwZSx2YWx1ZTpofSk7YnJlYWt9fX10aGlzLnVwZGF0ZUxpbmVzKG4sbil9LHRoaXMuc2V0VGhlbWU9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBvKHIpe2lmKG4uJHRoZW1lSWQhPWUpcmV0dXJuIHQmJnQoKTtpZighcnx8IXIuY3NzQ2xhc3MpdGhyb3cgbmV3IEVycm9yKCJjb3VsZG4ndCBsb2FkIG1vZHVsZSAiK2UrIiBvciBpdCBkaWRuJ3QgY2FsbCBkZWZpbmUiKTtyLiRpZCYmKG4uJHRoZW1lSWQ9ci4kaWQpLGkuaW1wb3J0Q3NzU3RyaW5nKHIuY3NzVGV4dCxyLmNzc0NsYXNzLG4uY29udGFpbmVyKSxuLnRoZW1lJiZpLnJlbW92ZUNzc0NsYXNzKG4uY29udGFpbmVyLG4udGhlbWUuY3NzQ2xhc3MpO3ZhciBzPSJwYWRkaW5nImluIHI/ci5wYWRkaW5nOiJwYWRkaW5nImluKG4udGhlbWV8fHt9KT80Om4uJHBhZGRpbmc7bi4kcGFkZGluZyYmcyE9bi4kcGFkZGluZyYmbi5zZXRQYWRkaW5nKHMpLG4uJHRoZW1lPXIuY3NzQ2xhc3Msbi50aGVtZT1yLGkuYWRkQ3NzQ2xhc3Mobi5jb250YWluZXIsci5jc3NDbGFzcyksaS5zZXRDc3NDbGFzcyhuLmNvbnRhaW5lciwiYWNlX2RhcmsiLHIuaXNEYXJrKSxuLiRzaXplJiYobi4kc2l6ZS53aWR0aD0wLG4uJHVwZGF0ZVNpemVBc3luYygpKSxuLl9kaXNwYXRjaEV2ZW50KCJ0aGVtZUxvYWRlZCIse3RoZW1lOnJ9KSx0JiZ0KCl9dmFyIG49dGhpczt0aGlzLiR0aGVtZUlkPWUsbi5fZGlzcGF0Y2hFdmVudCgidGhlbWVDaGFuZ2UiLHt0aGVtZTplfSk7aWYoIWV8fHR5cGVvZiBlPT0ic3RyaW5nIil7dmFyIHI9ZXx8dGhpcy4kb3B0aW9ucy50aGVtZS5pbml0aWFsVmFsdWU7cy5sb2FkTW9kdWxlKFsidGhlbWUiLHJdLG8pfWVsc2UgbyhlKX0sdGhpcy5nZXRUaGVtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR0aGVtZUlkfSx0aGlzLnNldFN0eWxlPWZ1bmN0aW9uKGUsdCl7aS5zZXRDc3NDbGFzcyh0aGlzLmNvbnRhaW5lcixlLHQhPT0hMSl9LHRoaXMudW5zZXRTdHlsZT1mdW5jdGlvbihlKXtpLnJlbW92ZUNzc0NsYXNzKHRoaXMuY29udGFpbmVyLGUpfSx0aGlzLnNldEN1cnNvclN0eWxlPWZ1bmN0aW9uKGUpe2kuc2V0U3R5bGUodGhpcy5zY3JvbGxlci5zdHlsZSwiY3Vyc29yIixlKX0sdGhpcy5zZXRNb3VzZUN1cnNvcj1mdW5jdGlvbihlKXtpLnNldFN0eWxlKHRoaXMuc2Nyb2xsZXIuc3R5bGUsImN1cnNvciIsZSl9LHRoaXMuYXR0YWNoVG9TaGFkb3dSb290PWZ1bmN0aW9uKCl7aS5pbXBvcnRDc3NTdHJpbmcodiwiYWNlX2VkaXRvci5jc3MiLHRoaXMuY29udGFpbmVyKX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5mcmVlemUoKSx0aGlzLiRmb250TWV0cmljcy5kZXN0cm95KCksdGhpcy4kY3Vyc29yTGF5ZXIuZGVzdHJveSgpfX0pLmNhbGwoeS5wcm90b3R5cGUpLHMuZGVmaW5lT3B0aW9ucyh5LnByb3RvdHlwZSwicmVuZGVyZXIiLHthbmltYXRlZFNjcm9sbDp7aW5pdGlhbFZhbHVlOiExfSxzaG93SW52aXNpYmxlczp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJHRleHRMYXllci5zZXRTaG93SW52aXNpYmxlcyhlKSYmdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9URVhUKX0saW5pdGlhbFZhbHVlOiExfSxzaG93UHJpbnRNYXJnaW46e3NldDpmdW5jdGlvbigpe3RoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCl9LGluaXRpYWxWYWx1ZTohMH0scHJpbnRNYXJnaW5Db2x1bW46e3NldDpmdW5jdGlvbigpe3RoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCl9LGluaXRpYWxWYWx1ZTo4MH0scHJpbnRNYXJnaW46e3NldDpmdW5jdGlvbihlKXt0eXBlb2YgZT09Im51bWJlciImJih0aGlzLiRwcmludE1hcmdpbkNvbHVtbj1lKSx0aGlzLiRzaG93UHJpbnRNYXJnaW49ISFlLHRoaXMuJHVwZGF0ZVByaW50TWFyZ2luKCl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRzaG93UHJpbnRNYXJnaW4mJnRoaXMuJHByaW50TWFyZ2luQ29sdW1ufX0sc2hvd0d1dHRlcjp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJGd1dHRlci5zdHlsZS5kaXNwbGF5PWU/ImJsb2NrIjoibm9uZSIsdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKSx0aGlzLm9uR3V0dGVyUmVzaXplKCl9LGluaXRpYWxWYWx1ZTohMH0sZmFkZUZvbGRXaWRnZXRzOntzZXQ6ZnVuY3Rpb24oZSl7aS5zZXRDc3NDbGFzcyh0aGlzLiRndXR0ZXIsImFjZV9mYWRlLWZvbGQtd2lkZ2V0cyIsZSl9LGluaXRpYWxWYWx1ZTohMX0sc2hvd0ZvbGRXaWRnZXRzOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kZ3V0dGVyTGF5ZXIuc2V0U2hvd0ZvbGRXaWRnZXRzKGUpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKX0saW5pdGlhbFZhbHVlOiEwfSxkaXNwbGF5SW5kZW50R3VpZGVzOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kdGV4dExheWVyLnNldERpc3BsYXlJbmRlbnRHdWlkZXMoZSkmJnRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfVEVYVCl9LGluaXRpYWxWYWx1ZTohMH0saGlnaGxpZ2h0R3V0dGVyTGluZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJGd1dHRlckxheWVyLnNldEhpZ2hsaWdodEd1dHRlckxpbmUoZSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpfSxpbml0aWFsVmFsdWU6ITB9LGhTY3JvbGxCYXJBbHdheXNWaXNpYmxlOntzZXQ6ZnVuY3Rpb24oZSl7KCF0aGlzLiRoU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZXx8IXRoaXMuJGhvcml6U2Nyb2xsKSYmdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpfSxpbml0aWFsVmFsdWU6ITF9LHZTY3JvbGxCYXJBbHdheXNWaXNpYmxlOntzZXQ6ZnVuY3Rpb24oZSl7KCF0aGlzLiR2U2Nyb2xsQmFyQWx3YXlzVmlzaWJsZXx8IXRoaXMuJHZTY3JvbGwpJiZ0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1NDUk9MTCl9LGluaXRpYWxWYWx1ZTohMX0sZm9udFNpemU6e3NldDpmdW5jdGlvbihlKXt0eXBlb2YgZT09Im51bWJlciImJihlKz0icHgiKSx0aGlzLmNvbnRhaW5lci5zdHlsZS5mb250U2l6ZT1lLHRoaXMudXBkYXRlRm9udFNpemUoKX0saW5pdGlhbFZhbHVlOjEyfSxmb250RmFtaWx5OntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5jb250YWluZXIuc3R5bGUuZm9udEZhbWlseT1lLHRoaXMudXBkYXRlRm9udFNpemUoKX19LG1heExpbmVzOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy51cGRhdGVGdWxsKCl9fSxtaW5MaW5lczp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJG1pbkxpbmVzPDU2Mjk0OTk1MzQyMTMxMXx8KHRoaXMuJG1pbkxpbmVzPTApLHRoaXMudXBkYXRlRnVsbCgpfX0sbWF4UGl4ZWxIZWlnaHQ6e3NldDpmdW5jdGlvbihlKXt0aGlzLnVwZGF0ZUZ1bGwoKX0saW5pdGlhbFZhbHVlOjB9LHNjcm9sbFBhc3RFbmQ6e3NldDpmdW5jdGlvbihlKXtlPStlfHwwO2lmKHRoaXMuJHNjcm9sbFBhc3RFbmQ9PWUpcmV0dXJuO3RoaXMuJHNjcm9sbFBhc3RFbmQ9ZSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1NDUk9MTCl9LGluaXRpYWxWYWx1ZTowLGhhbmRsZXNTZXQ6ITB9LGZpeGVkV2lkdGhHdXR0ZXI6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRndXR0ZXJMYXllci4kZml4ZWRXaWR0aD0hIWUsdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpfX0sdGhlbWU6e3NldDpmdW5jdGlvbihlKXt0aGlzLnNldFRoZW1lKGUpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdGhlbWVJZHx8dGhpcy50aGVtZX0saW5pdGlhbFZhbHVlOiIuL3RoZW1lL3RleHRtYXRlIixoYW5kbGVzU2V0OiEwfSxoYXNDc3NUcmFuc2Zvcm1zOnt9LHVzZVRleHRhcmVhRm9ySU1FOntpbml0aWFsVmFsdWU6IW0uaXNNb2JpbGUmJiFtLmlzSUV9fSksdC5WaXJ0dWFsUmVuZGVyZXI9eX0pLGFjZS5kZWZpbmUoImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9uZXQiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvY29uZmlnIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB1KGUpe3ZhciB0PSJpbXBvcnRTY3JpcHRzKCciK2kucXVhbGlmeVVSTChlKSsiJyk7Ijt0cnl7cmV0dXJuIG5ldyBCbG9iKFt0XSx7dHlwZToiYXBwbGljYXRpb24vamF2YXNjcmlwdCJ9KX1jYXRjaChuKXt2YXIgcj13aW5kb3cuQmxvYkJ1aWxkZXJ8fHdpbmRvdy5XZWJLaXRCbG9iQnVpbGRlcnx8d2luZG93Lk1vekJsb2JCdWlsZGVyLHM9bmV3IHI7cmV0dXJuIHMuYXBwZW5kKHQpLHMuZ2V0QmxvYigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfX1mdW5jdGlvbiBhKGUpe2lmKHR5cGVvZiBXb3JrZXI9PSJ1bmRlZmluZWQiKXJldHVybntwb3N0TWVzc2FnZTpmdW5jdGlvbigpe30sdGVybWluYXRlOmZ1bmN0aW9uKCl7fX07aWYoby5nZXQoImxvYWRXb3JrZXJGcm9tQmxvYiIpKXt2YXIgdD11KGUpLG49d2luZG93LlVSTHx8d2luZG93LndlYmtpdFVSTCxyPW4uY3JlYXRlT2JqZWN0VVJMKHQpO3JldHVybiBuZXcgV29ya2VyKHIpfXJldHVybiBuZXcgV29ya2VyKGUpfXZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4uL2xpYi9uZXQiKSxzPWUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLG89ZSgiLi4vY29uZmlnIiksZj1mdW5jdGlvbihlKXtlLnBvc3RNZXNzYWdlfHwoZT10aGlzLiRjcmVhdGVXb3JrZXJGcm9tT2xkQ29uZmlnLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdGhpcy4kd29ya2VyPWUsdGhpcy4kc2VuZERlbHRhUXVldWU9dGhpcy4kc2VuZERlbHRhUXVldWUuYmluZCh0aGlzKSx0aGlzLmNoYW5nZUxpc3RlbmVyPXRoaXMuY2hhbmdlTGlzdGVuZXIuYmluZCh0aGlzKSx0aGlzLm9uTWVzc2FnZT10aGlzLm9uTWVzc2FnZS5iaW5kKHRoaXMpLHRoaXMuY2FsbGJhY2tJZD0xLHRoaXMuY2FsbGJhY2tzPXt9LHRoaXMuJHdvcmtlci5vbm1lc3NhZ2U9dGhpcy5vbk1lc3NhZ2V9OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMscyksdGhpcy4kY3JlYXRlV29ya2VyRnJvbU9sZENvbmZpZz1mdW5jdGlvbih0LG4scixpLHMpe2UubmFtZVRvVXJsJiYhZS50b1VybCYmKGUudG9Vcmw9ZS5uYW1lVG9VcmwpO2lmKG8uZ2V0KCJwYWNrYWdlZCIpfHwhZS50b1VybClpPWl8fG8ubW9kdWxlVXJsKG4sIndvcmtlciIpO2Vsc2V7dmFyIHU9dGhpcy4kbm9ybWFsaXplUGF0aDtpPWl8fHUoZS50b1VybCgiYWNlL3dvcmtlci93b3JrZXIuanMiLG51bGwsIl8iKSk7dmFyIGY9e307dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2ZbdF09dShlLnRvVXJsKHQsbnVsbCwiXyIpLnJlcGxhY2UoLyhcLmpzKT8oXD8uKik/JC8sIiIpKX0pfXJldHVybiB0aGlzLiR3b3JrZXI9YShpKSxzJiZ0aGlzLnNlbmQoImltcG9ydFNjcmlwdHMiLHMpLHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7aW5pdDohMCx0bG5zOmYsbW9kdWxlOm4sY2xhc3NuYW1lOnJ9KSx0aGlzLiR3b3JrZXJ9LHRoaXMub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTtzd2l0Y2godC50eXBlKXtjYXNlImV2ZW50Ijp0aGlzLl9zaWduYWwodC5uYW1lLHtkYXRhOnQuZGF0YX0pO2JyZWFrO2Nhc2UiY2FsbCI6dmFyIG49dGhpcy5jYWxsYmFja3NbdC5pZF07biYmKG4odC5kYXRhKSxkZWxldGUgdGhpcy5jYWxsYmFja3NbdC5pZF0pO2JyZWFrO2Nhc2UiZXJyb3IiOnRoaXMucmVwb3J0RXJyb3IodC5kYXRhKTticmVhaztjYXNlImxvZyI6d2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nJiZjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLHQuZGF0YSl9fSx0aGlzLnJlcG9ydEVycm9yPWZ1bmN0aW9uKGUpe3dpbmRvdy5jb25zb2xlJiZjb25zb2xlLmVycm9yJiZjb25zb2xlLmVycm9yKGUpfSx0aGlzLiRub3JtYWxpemVQYXRoPWZ1bmN0aW9uKGUpe3JldHVybiBpLnF1YWxpZnlVUkwoZSl9LHRoaXMudGVybWluYXRlPWZ1bmN0aW9uKCl7dGhpcy5fc2lnbmFsKCJ0ZXJtaW5hdGUiLHt9KSx0aGlzLmRlbHRhUXVldWU9bnVsbCx0aGlzLiR3b3JrZXIudGVybWluYXRlKCksdGhpcy4kd29ya2VyPW51bGwsdGhpcy4kZG9jJiZ0aGlzLiRkb2Mub2ZmKCJjaGFuZ2UiLHRoaXMuY2hhbmdlTGlzdGVuZXIpLHRoaXMuJGRvYz1udWxsfSx0aGlzLnNlbmQ9ZnVuY3Rpb24oZSx0KXt0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2NvbW1hbmQ6ZSxhcmdzOnR9KX0sdGhpcy5jYWxsPWZ1bmN0aW9uKGUsdCxuKXtpZihuKXt2YXIgcj10aGlzLmNhbGxiYWNrSWQrKzt0aGlzLmNhbGxiYWNrc1tyXT1uLHQucHVzaChyKX10aGlzLnNlbmQoZSx0KX0sdGhpcy5lbWl0PWZ1bmN0aW9uKGUsdCl7dHJ5e3QuZGF0YSYmdC5kYXRhLmVyciYmKHQuZGF0YS5lcnI9e21lc3NhZ2U6dC5kYXRhLmVyci5tZXNzYWdlLHN0YWNrOnQuZGF0YS5lcnIuc3RhY2ssY29kZTp0LmRhdGEuZXJyLmNvZGV9KSx0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2V2ZW50OmUsZGF0YTp7ZGF0YTp0LmRhdGF9fSl9Y2F0Y2gobil7Y29uc29sZS5lcnJvcihuLnN0YWNrKX19LHRoaXMuYXR0YWNoVG9Eb2N1bWVudD1mdW5jdGlvbihlKXt0aGlzLiRkb2MmJnRoaXMudGVybWluYXRlKCksdGhpcy4kZG9jPWUsdGhpcy5jYWxsKCJzZXRWYWx1ZSIsW2UuZ2V0VmFsdWUoKV0pLGUub24oImNoYW5nZSIsdGhpcy5jaGFuZ2VMaXN0ZW5lcil9LHRoaXMuY2hhbmdlTGlzdGVuZXI9ZnVuY3Rpb24oZSl7dGhpcy5kZWx0YVF1ZXVlfHwodGhpcy5kZWx0YVF1ZXVlPVtdLHNldFRpbWVvdXQodGhpcy4kc2VuZERlbHRhUXVldWUsMCkpLGUuYWN0aW9uPT0iaW5zZXJ0Ij90aGlzLmRlbHRhUXVldWUucHVzaChlLnN0YXJ0LGUubGluZXMpOnRoaXMuZGVsdGFRdWV1ZS5wdXNoKGUuc3RhcnQsZS5lbmQpfSx0aGlzLiRzZW5kRGVsdGFRdWV1ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZGVsdGFRdWV1ZTtpZighZSlyZXR1cm47dGhpcy5kZWx0YVF1ZXVlPW51bGwsZS5sZW5ndGg+NTAmJmUubGVuZ3RoPnRoaXMuJGRvYy5nZXRMZW5ndGgoKT4+MT90aGlzLmNhbGwoInNldFZhbHVlIixbdGhpcy4kZG9jLmdldFZhbHVlKCldKTp0aGlzLmVtaXQoImNoYW5nZSIse2RhdGE6ZX0pfX0pLmNhbGwoZi5wcm90b3R5cGUpO3ZhciBsPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1udWxsLGk9ITEsdT1PYmplY3QuY3JlYXRlKHMpLGE9W10sbD1uZXcgZih7bWVzc2FnZUJ1ZmZlcjphLHRlcm1pbmF0ZTpmdW5jdGlvbigpe30scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oZSl7YS5wdXNoKGUpO2lmKCFyKXJldHVybjtpP3NldFRpbWVvdXQoYyk6YygpfX0pO2wuc2V0RW1pdFN5bmM9ZnVuY3Rpb24oZSl7aT1lfTt2YXIgYz1mdW5jdGlvbigpe3ZhciBlPWEuc2hpZnQoKTtlLmNvbW1hbmQ/cltlLmNvbW1hbmRdLmFwcGx5KHIsZS5hcmdzKTplLmV2ZW50JiZ1Ll9zaWduYWwoZS5ldmVudCxlLmRhdGEpfTtyZXR1cm4gdS5wb3N0TWVzc2FnZT1mdW5jdGlvbihlKXtsLm9uTWVzc2FnZSh7ZGF0YTplfSl9LHUuY2FsbGJhY2s9ZnVuY3Rpb24oZSx0KXt0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOiJjYWxsIixpZDp0LGRhdGE6ZX0pfSx1LmVtaXQ9ZnVuY3Rpb24oZSx0KXt0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOiJldmVudCIsbmFtZTplLGRhdGE6dH0pfSxvLmxvYWRNb2R1bGUoWyJ3b3JrZXIiLHRdLGZ1bmN0aW9uKGUpe3I9bmV3IGVbbl0odSk7d2hpbGUoYS5sZW5ndGgpYygpfSksbH07dC5VSVdvcmtlckNsaWVudD1sLHQuV29ya2VyQ2xpZW50PWYsdC5jcmVhdGVXb3JrZXI9YX0pLGFjZS5kZWZpbmUoImFjZS9wbGFjZWhvbGRlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9saWIvb29wIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL3JhbmdlIikuUmFuZ2UsaT1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHM9ZSgiLi9saWIvb29wIiksbz1mdW5jdGlvbihlLHQsbixyLGkscyl7dmFyIG89dGhpczt0aGlzLmxlbmd0aD10LHRoaXMuc2Vzc2lvbj1lLHRoaXMuZG9jPWUuZ2V0RG9jdW1lbnQoKSx0aGlzLm1haW5DbGFzcz1pLHRoaXMub3RoZXJzQ2xhc3M9cyx0aGlzLiRvblVwZGF0ZT10aGlzLm9uVXBkYXRlLmJpbmQodGhpcyksdGhpcy5kb2Mub24oImNoYW5nZSIsdGhpcy4kb25VcGRhdGUpLHRoaXMuJG90aGVycz1yLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlPWZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe28ub25DdXJzb3JDaGFuZ2UoKX0pfSx0aGlzLiRwb3M9bjt2YXIgdT1lLmdldFVuZG9NYW5hZ2VyKCkuJHVuZG9TdGFja3x8ZS5nZXRVbmRvTWFuYWdlcigpLiR1bmRvc3RhY2t8fHtsZW5ndGg6LTF9O3RoaXMuJHVuZG9TdGFja0RlcHRoPXUubGVuZ3RoLHRoaXMuc2V0dXAoKSxlLnNlbGVjdGlvbi5vbigiY2hhbmdlQ3Vyc29yIix0aGlzLiRvbkN1cnNvckNoYW5nZSl9OyhmdW5jdGlvbigpe3MuaW1wbGVtZW50KHRoaXMsaSksdGhpcy5zZXR1cD1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLmRvYyxuPXRoaXMuc2Vzc2lvbjt0aGlzLnNlbGVjdGlvbkJlZm9yZT1uLnNlbGVjdGlvbi50b0pTT04oKSxuLnNlbGVjdGlvbi5pbk11bHRpU2VsZWN0TW9kZSYmbi5zZWxlY3Rpb24udG9TaW5nbGVSYW5nZSgpLHRoaXMucG9zPXQuY3JlYXRlQW5jaG9yKHRoaXMuJHBvcy5yb3csdGhpcy4kcG9zLmNvbHVtbik7dmFyIGk9dGhpcy5wb3M7aS4kaW5zZXJ0UmlnaHQ9ITAsaS5kZXRhY2goKSxpLm1hcmtlcklkPW4uYWRkTWFya2VyKG5ldyByKGkucm93LGkuY29sdW1uLGkucm93LGkuY29sdW1uK3RoaXMubGVuZ3RoKSx0aGlzLm1haW5DbGFzcyxudWxsLCExKSx0aGlzLm90aGVycz1bXSx0aGlzLiRvdGhlcnMuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgcj10LmNyZWF0ZUFuY2hvcihuLnJvdyxuLmNvbHVtbik7ci4kaW5zZXJ0UmlnaHQ9ITAsci5kZXRhY2goKSxlLm90aGVycy5wdXNoKHIpfSksbi5zZXRVbmRvU2VsZWN0KCExKX0sdGhpcy5zaG93T3RoZXJNYXJrZXJzPWZ1bmN0aW9uKCl7aWYodGhpcy5vdGhlcnNBY3RpdmUpcmV0dXJuO3ZhciBlPXRoaXMuc2Vzc2lvbix0PXRoaXM7dGhpcy5vdGhlcnNBY3RpdmU9ITAsdGhpcy5vdGhlcnMuZm9yRWFjaChmdW5jdGlvbihuKXtuLm1hcmtlcklkPWUuYWRkTWFya2VyKG5ldyByKG4ucm93LG4uY29sdW1uLG4ucm93LG4uY29sdW1uK3QubGVuZ3RoKSx0Lm90aGVyc0NsYXNzLG51bGwsITEpfSl9LHRoaXMuaGlkZU90aGVyTWFya2Vycz1mdW5jdGlvbigpe2lmKCF0aGlzLm90aGVyc0FjdGl2ZSlyZXR1cm47dGhpcy5vdGhlcnNBY3RpdmU9ITE7Zm9yKHZhciBlPTA7ZTx0aGlzLm90aGVycy5sZW5ndGg7ZSsrKXRoaXMuc2Vzc2lvbi5yZW1vdmVNYXJrZXIodGhpcy5vdGhlcnNbZV0ubWFya2VySWQpfSx0aGlzLm9uVXBkYXRlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJHVwZGF0aW5nKXJldHVybiB0aGlzLnVwZGF0ZUFuY2hvcnMoZSk7dmFyIHQ9ZTtpZih0LnN0YXJ0LnJvdyE9PXQuZW5kLnJvdylyZXR1cm47aWYodC5zdGFydC5yb3chPT10aGlzLnBvcy5yb3cpcmV0dXJuO3RoaXMuJHVwZGF0aW5nPSEwO3ZhciBuPWUuYWN0aW9uPT09Imluc2VydCI/dC5lbmQuY29sdW1uLXQuc3RhcnQuY29sdW1uOnQuc3RhcnQuY29sdW1uLXQuZW5kLmNvbHVtbixpPXQuc3RhcnQuY29sdW1uPj10aGlzLnBvcy5jb2x1bW4mJnQuc3RhcnQuY29sdW1uPD10aGlzLnBvcy5jb2x1bW4rdGhpcy5sZW5ndGgrMSxzPXQuc3RhcnQuY29sdW1uLXRoaXMucG9zLmNvbHVtbjt0aGlzLnVwZGF0ZUFuY2hvcnMoZSksaSYmKHRoaXMubGVuZ3RoKz1uKTtpZihpJiYhdGhpcy5zZXNzaW9uLiRmcm9tVW5kbylpZihlLmFjdGlvbj09PSJpbnNlcnQiKWZvcih2YXIgbz10aGlzLm90aGVycy5sZW5ndGgtMTtvPj0wO28tLSl7dmFyIHU9dGhpcy5vdGhlcnNbb10sYT17cm93OnUucm93LGNvbHVtbjp1LmNvbHVtbitzfTt0aGlzLmRvYy5pbnNlcnRNZXJnZWRMaW5lcyhhLGUubGluZXMpfWVsc2UgaWYoZS5hY3Rpb249PT0icmVtb3ZlIilmb3IodmFyIG89dGhpcy5vdGhlcnMubGVuZ3RoLTE7bz49MDtvLS0pe3ZhciB1PXRoaXMub3RoZXJzW29dLGE9e3Jvdzp1LnJvdyxjb2x1bW46dS5jb2x1bW4rc307dGhpcy5kb2MucmVtb3ZlKG5ldyByKGEucm93LGEuY29sdW1uLGEucm93LGEuY29sdW1uLW4pKX10aGlzLiR1cGRhdGluZz0hMSx0aGlzLnVwZGF0ZU1hcmtlcnMoKX0sdGhpcy51cGRhdGVBbmNob3JzPWZ1bmN0aW9uKGUpe3RoaXMucG9zLm9uQ2hhbmdlKGUpO2Zvcih2YXIgdD10aGlzLm90aGVycy5sZW5ndGg7dC0tOyl0aGlzLm90aGVyc1t0XS5vbkNoYW5nZShlKTt0aGlzLnVwZGF0ZU1hcmtlcnMoKX0sdGhpcy51cGRhdGVNYXJrZXJzPWZ1bmN0aW9uKCl7aWYodGhpcy4kdXBkYXRpbmcpcmV0dXJuO3ZhciBlPXRoaXMsdD10aGlzLnNlc3Npb24sbj1mdW5jdGlvbihuLGkpe3QucmVtb3ZlTWFya2VyKG4ubWFya2VySWQpLG4ubWFya2VySWQ9dC5hZGRNYXJrZXIobmV3IHIobi5yb3csbi5jb2x1bW4sbi5yb3csbi5jb2x1bW4rZS5sZW5ndGgpLGksbnVsbCwhMSl9O24odGhpcy5wb3MsdGhpcy5tYWluQ2xhc3MpO2Zvcih2YXIgaT10aGlzLm90aGVycy5sZW5ndGg7aS0tOyluKHRoaXMub3RoZXJzW2ldLHRoaXMub3RoZXJzQ2xhc3MpfSx0aGlzLm9uQ3Vyc29yQ2hhbmdlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJHVwZGF0aW5nfHwhdGhpcy5zZXNzaW9uKXJldHVybjt2YXIgdD10aGlzLnNlc3Npb24uc2VsZWN0aW9uLmdldEN1cnNvcigpO3Qucm93PT09dGhpcy5wb3Mucm93JiZ0LmNvbHVtbj49dGhpcy5wb3MuY29sdW1uJiZ0LmNvbHVtbjw9dGhpcy5wb3MuY29sdW1uK3RoaXMubGVuZ3RoPyh0aGlzLnNob3dPdGhlck1hcmtlcnMoKSx0aGlzLl9lbWl0KCJjdXJzb3JFbnRlciIsZSkpOih0aGlzLmhpZGVPdGhlck1hcmtlcnMoKSx0aGlzLl9lbWl0KCJjdXJzb3JMZWF2ZSIsZSkpfSx0aGlzLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi5yZW1vdmVNYXJrZXIodGhpcy5wb3MmJnRoaXMucG9zLm1hcmtlcklkKSx0aGlzLmhpZGVPdGhlck1hcmtlcnMoKSx0aGlzLmRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHRoaXMuJG9uVXBkYXRlKSx0aGlzLnNlc3Npb24uc2VsZWN0aW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZUN1cnNvciIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpLHRoaXMuc2Vzc2lvbi5zZXRVbmRvU2VsZWN0KCEwKSx0aGlzLnNlc3Npb249bnVsbH0sdGhpcy5jYW5jZWw9ZnVuY3Rpb24oKXtpZih0aGlzLiR1bmRvU3RhY2tEZXB0aD09PS0xKXJldHVybjt2YXIgZT10aGlzLnNlc3Npb24uZ2V0VW5kb01hbmFnZXIoKSx0PShlLiR1bmRvU3RhY2t8fGUuJHVuZG9zdGFjaykubGVuZ3RoLXRoaXMuJHVuZG9TdGFja0RlcHRoO2Zvcih2YXIgbj0wO248dDtuKyspZS51bmRvKHRoaXMuc2Vzc2lvbiwhMCk7dGhpcy5zZWxlY3Rpb25CZWZvcmUmJnRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24uZnJvbUpTT04odGhpcy5zZWxlY3Rpb25CZWZvcmUpfX0pLmNhbGwoby5wcm90b3R5cGUpLHQuUGxhY2VIb2xkZXI9b30pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS9tdWx0aV9zZWxlY3RfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiBzKGUsdCl7cmV0dXJuIGUucm93PT10LnJvdyYmZS5jb2x1bW49PXQuY29sdW1ufWZ1bmN0aW9uIG8oZSl7dmFyIHQ9ZS5kb21FdmVudCxuPXQuYWx0S2V5LG89dC5zaGlmdEtleSx1PXQuY3RybEtleSxhPWUuZ2V0QWNjZWxLZXkoKSxmPWUuZ2V0QnV0dG9uKCk7dSYmaS5pc01hYyYmKGY9dC5idXR0b24pO2lmKGUuZWRpdG9yLmluTXVsdGlTZWxlY3RNb2RlJiZmPT0yKXtlLmVkaXRvci50ZXh0SW5wdXQub25Db250ZXh0TWVudShlLmRvbUV2ZW50KTtyZXR1cm59aWYoIXUmJiFuJiYhYSl7Zj09PTAmJmUuZWRpdG9yLmluTXVsdGlTZWxlY3RNb2RlJiZlLmVkaXRvci5leGl0TXVsdGlTZWxlY3RNb2RlKCk7cmV0dXJufWlmKGYhPT0wKXJldHVybjt2YXIgbD1lLmVkaXRvcixjPWwuc2VsZWN0aW9uLGg9bC5pbk11bHRpU2VsZWN0TW9kZSxwPWUuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLGQ9Yy5nZXRDdXJzb3IoKSx2PWUuaW5TZWxlY3Rpb24oKXx8Yy5pc0VtcHR5KCkmJnMocCxkKSxtPWUueCxnPWUueSx5PWZ1bmN0aW9uKGUpe209ZS5jbGllbnRYLGc9ZS5jbGllbnRZfSxiPWwuc2Vzc2lvbix3PWwucmVuZGVyZXIucGl4ZWxUb1NjcmVlbkNvb3JkaW5hdGVzKG0sZyksRT13LFM7aWYobC4kbW91c2VIYW5kbGVyLiRlbmFibGVKdW1wVG9EZWYpdSYmbnx8YSYmbj9TPW8/ImJsb2NrIjoiYWRkIjpuJiZsLiRibG9ja1NlbGVjdEVuYWJsZWQmJihTPSJibG9jayIpO2Vsc2UgaWYoYSYmIW4pe1M9ImFkZCI7aWYoIWgmJm8pcmV0dXJufWVsc2UgbiYmbC4kYmxvY2tTZWxlY3RFbmFibGVkJiYoUz0iYmxvY2siKTtTJiZpLmlzTWFjJiZ0LmN0cmxLZXkmJmwuJG1vdXNlSGFuZGxlci5jYW5jZWxDb250ZXh0TWVudSgpO2lmKFM9PSJhZGQiKXtpZighaCYmdilyZXR1cm47aWYoIWgpe3ZhciB4PWMudG9PcmllbnRlZFJhbmdlKCk7bC5hZGRTZWxlY3Rpb25NYXJrZXIoeCl9dmFyIFQ9Yy5yYW5nZUxpc3QucmFuZ2VBdFBvaW50KHApO2wuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMCxvJiYoVD1udWxsLHg9Yy5yYW5nZXNbMF18fHgsbC5yZW1vdmVTZWxlY3Rpb25NYXJrZXIoeCkpLGwub25jZSgibW91c2V1cCIsZnVuY3Rpb24oKXt2YXIgZT1jLnRvT3JpZW50ZWRSYW5nZSgpO1QmJmUuaXNFbXB0eSgpJiZzKFQuY3Vyc29yLGUuY3Vyc29yKT9jLnN1YnN0cmFjdFBvaW50KGUuY3Vyc29yKToobz9jLnN1YnN0cmFjdFBvaW50KHguY3Vyc29yKTp4JiYobC5yZW1vdmVTZWxlY3Rpb25NYXJrZXIoeCksYy5hZGRSYW5nZSh4KSksYy5hZGRSYW5nZShlKSksbC5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSExfSl9ZWxzZSBpZihTPT0iYmxvY2siKXtlLnN0b3AoKSxsLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITA7dmFyIE4sQz1bXSxrPWZ1bmN0aW9uKCl7dmFyIGU9bC5yZW5kZXJlci5waXhlbFRvU2NyZWVuQ29vcmRpbmF0ZXMobSxnKSx0PWIuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGUucm93LGUuY29sdW1uLGUub2Zmc2V0WCk7aWYocyhFLGUpJiZzKHQsYy5sZWFkKSlyZXR1cm47RT1lLGwuc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKHQpLGwucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKSxsLnJlbW92ZVNlbGVjdGlvbk1hcmtlcnMoQyksQz1jLnJlY3Rhbmd1bGFyUmFuZ2VCbG9jayhFLHcpLGwuJG1vdXNlSGFuZGxlci4kY2xpY2tTZWxlY3Rpb24mJkMubGVuZ3RoPT0xJiZDWzBdLmlzRW1wdHkoKSYmKENbMF09bC4kbW91c2VIYW5kbGVyLiRjbGlja1NlbGVjdGlvbi5jbG9uZSgpKSxDLmZvckVhY2gobC5hZGRTZWxlY3Rpb25NYXJrZXIsbCksbC51cGRhdGVTZWxlY3Rpb25NYXJrZXJzKCl9O2gmJiFhP2MudG9TaW5nbGVSYW5nZSgpOiFoJiZhJiYoTj1jLnRvT3JpZW50ZWRSYW5nZSgpLGwuYWRkU2VsZWN0aW9uTWFya2VyKE4pKSxvP3c9Yi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oYy5sZWFkKTpjLm1vdmVUb1Bvc2l0aW9uKHApLEU9e3JvdzotMSxjb2x1bW46LTF9O3ZhciBMPWZ1bmN0aW9uKGUpe2soKSxjbGVhckludGVydmFsKE8pLGwucmVtb3ZlU2VsZWN0aW9uTWFya2VycyhDKSxDLmxlbmd0aHx8KEM9W2MudG9PcmllbnRlZFJhbmdlKCldKSxOJiYobC5yZW1vdmVTZWxlY3Rpb25NYXJrZXIoTiksYy50b1NpbmdsZVJhbmdlKE4pKTtmb3IodmFyIHQ9MDt0PEMubGVuZ3RoO3QrKyljLmFkZFJhbmdlKENbdF0pO2wuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMSxsLiRtb3VzZUhhbmRsZXIuJGNsaWNrU2VsZWN0aW9uPW51bGx9LEE9aztyLmNhcHR1cmUobC5jb250YWluZXIseSxMKTt2YXIgTz1zZXRJbnRlcnZhbChmdW5jdGlvbigpe0EoKX0sMjApO3JldHVybiBlLnByZXZlbnREZWZhdWx0KCl9fXZhciByPWUoIi4uL2xpYi9ldmVudCIpLGk9ZSgiLi4vbGliL3VzZXJhZ2VudCIpO3Qub25Nb3VzZURvd249b30pLGFjZS5kZWZpbmUoImFjZS9jb21tYW5kcy9tdWx0aV9zZWxlY3RfY29tbWFuZHMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2Uva2V5Ym9hcmQvaGFzaF9oYW5kbGVyIl0sZnVuY3Rpb24oZSx0LG4pe3QuZGVmYXVsdENvbW1hbmRzPVt7bmFtZToiYWRkQ3Vyc29yQWJvdmUiLGRlc2NyaXB0aW9uOiJBZGQgY3Vyc29yIGFib3ZlIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZUxpbmVzKC0xKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1VcCIsbWFjOiJDdHJsLUFsdC1VcCJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiYWRkQ3Vyc29yQmVsb3ciLGRlc2NyaXB0aW9uOiJBZGQgY3Vyc29yIGJlbG93IixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZUxpbmVzKDEpfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LURvd24iLG1hYzoiQ3RybC1BbHQtRG93biJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiYWRkQ3Vyc29yQWJvdmVTa2lwQ3VycmVudCIsZGVzY3JpcHRpb246IkFkZCBjdXJzb3IgYWJvdmUgKHNraXAgY3VycmVudCkiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlTGluZXMoLTEsITApfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LVNoaWZ0LVVwIixtYWM6IkN0cmwtQWx0LVNoaWZ0LVVwIn0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJhZGRDdXJzb3JCZWxvd1NraXBDdXJyZW50IixkZXNjcmlwdGlvbjoiQWRkIGN1cnNvciBiZWxvdyAoc2tpcCBjdXJyZW50KSIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmVMaW5lcygxLCEwKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1TaGlmdC1Eb3duIixtYWM6IkN0cmwtQWx0LVNoaWZ0LURvd24ifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdE1vcmVCZWZvcmUiLGRlc2NyaXB0aW9uOiJTZWxlY3QgbW9yZSBiZWZvcmUiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlKC0xKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1MZWZ0IixtYWM6IkN0cmwtQWx0LUxlZnQifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdE1vcmVBZnRlciIsZGVzY3JpcHRpb246IlNlbGVjdCBtb3JlIGFmdGVyIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZSgxKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1SaWdodCIsbWFjOiJDdHJsLUFsdC1SaWdodCJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0TmV4dEJlZm9yZSIsZGVzY3JpcHRpb246IlNlbGVjdCBuZXh0IGJlZm9yZSIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmUoLTEsITApfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LVNoaWZ0LUxlZnQiLG1hYzoiQ3RybC1BbHQtU2hpZnQtTGVmdCJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0TmV4dEFmdGVyIixkZXNjcmlwdGlvbjoiU2VsZWN0IG5leHQgYWZ0ZXIiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlKDEsITApfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LVNoaWZ0LVJpZ2h0IixtYWM6IkN0cmwtQWx0LVNoaWZ0LVJpZ2h0In0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzcGxpdEludG9MaW5lcyIsZGVzY3JpcHRpb246IlNwbGl0IGludG8gbGluZXMiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5tdWx0aVNlbGVjdC5zcGxpdEludG9MaW5lcygpfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LUwiLG1hYzoiQ3RybC1BbHQtTCJ9LHJlYWRPbmx5OiEwfSx7bmFtZToiYWxpZ25DdXJzb3JzIixkZXNjcmlwdGlvbjoiQWxpZ24gY3Vyc29ycyIsZXhlYzpmdW5jdGlvbihlKXtlLmFsaWduQ3Vyc29ycygpfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LUEiLG1hYzoiQ3RybC1BbHQtQSJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToiZmluZEFsbCIsZGVzY3JpcHRpb246IkZpbmQgYWxsIixleGVjOmZ1bmN0aW9uKGUpe2UuZmluZEFsbCgpfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LUsiLG1hYzoiQ3RybC1BbHQtRyJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfV0sdC5tdWx0aVNlbGVjdENvbW1hbmRzPVt7bmFtZToic2luZ2xlU2VsZWN0aW9uIixkZXNjcmlwdGlvbjoiU2luZ2xlIHNlbGVjdGlvbiIsYmluZEtleToiZXNjIixleGVjOmZ1bmN0aW9uKGUpe2UuZXhpdE11bHRpU2VsZWN0TW9kZSgpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMCxpc0F2YWlsYWJsZTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5pbk11bHRpU2VsZWN0TW9kZX19XTt2YXIgcj1lKCIuLi9rZXlib2FyZC9oYXNoX2hhbmRsZXIiKS5IYXNoSGFuZGxlcjt0LmtleWJvYXJkSGFuZGxlcj1uZXcgcih0Lm11bHRpU2VsZWN0Q29tbWFuZHMpfSksYWNlLmRlZmluZSgiYWNlL211bHRpX3NlbGVjdCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZV9saXN0IiwiYWNlL3JhbmdlIiwiYWNlL3NlbGVjdGlvbiIsImFjZS9tb3VzZS9tdWx0aV9zZWxlY3RfaGFuZGxlciIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL2xhbmciLCJhY2UvY29tbWFuZHMvbXVsdGlfc2VsZWN0X2NvbW1hbmRzIiwiYWNlL3NlYXJjaCIsImFjZS9lZGl0X3Nlc3Npb24iLCJhY2UvZWRpdG9yIiwiYWNlL2NvbmZpZyJdLGZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiBoKGUsdCxuKXtyZXR1cm4gYy4kb3B0aW9ucy53cmFwPSEwLGMuJG9wdGlvbnMubmVlZGxlPXQsYy4kb3B0aW9ucy5iYWNrd2FyZHM9bj09LTEsYy5maW5kKGUpfWZ1bmN0aW9uIHYoZSx0KXtyZXR1cm4gZS5yb3c9PXQucm93JiZlLmNvbHVtbj09dC5jb2x1bW59ZnVuY3Rpb24gbShlKXtpZihlLiRtdWx0aXNlbGVjdE9uU2Vzc2lvbkNoYW5nZSlyZXR1cm47ZS4kb25BZGRSYW5nZT1lLiRvbkFkZFJhbmdlLmJpbmQoZSksZS4kb25SZW1vdmVSYW5nZT1lLiRvblJlbW92ZVJhbmdlLmJpbmQoZSksZS4kb25NdWx0aVNlbGVjdD1lLiRvbk11bHRpU2VsZWN0LmJpbmQoZSksZS4kb25TaW5nbGVTZWxlY3Q9ZS4kb25TaW5nbGVTZWxlY3QuYmluZChlKSxlLiRtdWx0aXNlbGVjdE9uU2Vzc2lvbkNoYW5nZT10Lm9uU2Vzc2lvbkNoYW5nZS5iaW5kKGUpLGUuJGNoZWNrTXVsdGlzZWxlY3RDaGFuZ2U9ZS4kY2hlY2tNdWx0aXNlbGVjdENoYW5nZS5iaW5kKGUpLGUuJG11bHRpc2VsZWN0T25TZXNzaW9uQ2hhbmdlKGUpLGUub24oImNoYW5nZVNlc3Npb24iLGUuJG11bHRpc2VsZWN0T25TZXNzaW9uQ2hhbmdlKSxlLm9uKCJtb3VzZWRvd24iLG8pLGUuY29tbWFuZHMuYWRkQ29tbWFuZHMoZi5kZWZhdWx0Q29tbWFuZHMpLGcoZSl9ZnVuY3Rpb24gZyhlKXtmdW5jdGlvbiByKHQpe24mJihlLnJlbmRlcmVyLnNldE1vdXNlQ3Vyc29yKCIiKSxuPSExKX1pZighZS50ZXh0SW5wdXQpcmV0dXJuO3ZhciB0PWUudGV4dElucHV0LmdldEVsZW1lbnQoKSxuPSExO3UuYWRkTGlzdGVuZXIodCwia2V5ZG93biIsZnVuY3Rpb24odCl7dmFyIGk9dC5rZXlDb2RlPT0xOCYmISh0LmN0cmxLZXl8fHQuc2hpZnRLZXl8fHQubWV0YUtleSk7ZS4kYmxvY2tTZWxlY3RFbmFibGVkJiZpP258fChlLnJlbmRlcmVyLnNldE1vdXNlQ3Vyc29yKCJjcm9zc2hhaXIiKSxuPSEwKTpuJiZyKCl9KSx1LmFkZExpc3RlbmVyKHQsImtleXVwIixyKSx1LmFkZExpc3RlbmVyKHQsImJsdXIiLHIpfXZhciByPWUoIi4vcmFuZ2VfbGlzdCIpLlJhbmdlTGlzdCxpPWUoIi4vcmFuZ2UiKS5SYW5nZSxzPWUoIi4vc2VsZWN0aW9uIikuU2VsZWN0aW9uLG89ZSgiLi9tb3VzZS9tdWx0aV9zZWxlY3RfaGFuZGxlciIpLm9uTW91c2VEb3duLHU9ZSgiLi9saWIvZXZlbnQiKSxhPWUoIi4vbGliL2xhbmciKSxmPWUoIi4vY29tbWFuZHMvbXVsdGlfc2VsZWN0X2NvbW1hbmRzIik7dC5jb21tYW5kcz1mLmRlZmF1bHRDb21tYW5kcy5jb25jYXQoZi5tdWx0aVNlbGVjdENvbW1hbmRzKTt2YXIgbD1lKCIuL3NlYXJjaCIpLlNlYXJjaCxjPW5ldyBsLHA9ZSgiLi9lZGl0X3Nlc3Npb24iKS5FZGl0U2Vzc2lvbjsoZnVuY3Rpb24oKXt0aGlzLmdldFNlbGVjdGlvbk1hcmtlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2VsZWN0aW9uTWFya2Vyc319KS5jYWxsKHAucHJvdG90eXBlKSxmdW5jdGlvbigpe3RoaXMucmFuZ2VzPW51bGwsdGhpcy5yYW5nZUxpc3Q9bnVsbCx0aGlzLmFkZFJhbmdlPWZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuO2lmKCF0aGlzLmluTXVsdGlTZWxlY3RNb2RlJiZ0aGlzLnJhbmdlQ291bnQ9PT0wKXt2YXIgbj10aGlzLnRvT3JpZW50ZWRSYW5nZSgpO3RoaXMucmFuZ2VMaXN0LmFkZChuKSx0aGlzLnJhbmdlTGlzdC5hZGQoZSk7aWYodGhpcy5yYW5nZUxpc3QucmFuZ2VzLmxlbmd0aCE9MilyZXR1cm4gdGhpcy5yYW5nZUxpc3QucmVtb3ZlQWxsKCksdHx8dGhpcy5mcm9tT3JpZW50ZWRSYW5nZShlKTt0aGlzLnJhbmdlTGlzdC5yZW1vdmVBbGwoKSx0aGlzLnJhbmdlTGlzdC5hZGQobiksdGhpcy4kb25BZGRSYW5nZShuKX1lLmN1cnNvcnx8KGUuY3Vyc29yPWUuZW5kKTt2YXIgcj10aGlzLnJhbmdlTGlzdC5hZGQoZSk7cmV0dXJuIHRoaXMuJG9uQWRkUmFuZ2UoZSksci5sZW5ndGgmJnRoaXMuJG9uUmVtb3ZlUmFuZ2UociksdGhpcy5yYW5nZUNvdW50PjEmJiF0aGlzLmluTXVsdGlTZWxlY3RNb2RlJiYodGhpcy5fc2lnbmFsKCJtdWx0aVNlbGVjdCIpLHRoaXMuaW5NdWx0aVNlbGVjdE1vZGU9ITAsdGhpcy5zZXNzaW9uLiR1bmRvU2VsZWN0PSExLHRoaXMucmFuZ2VMaXN0LmF0dGFjaCh0aGlzLnNlc3Npb24pKSx0fHx0aGlzLmZyb21PcmllbnRlZFJhbmdlKGUpfSx0aGlzLnRvU2luZ2xlUmFuZ2U9ZnVuY3Rpb24oZSl7ZT1lfHx0aGlzLnJhbmdlc1swXTt2YXIgdD10aGlzLnJhbmdlTGlzdC5yZW1vdmVBbGwoKTt0Lmxlbmd0aCYmdGhpcy4kb25SZW1vdmVSYW5nZSh0KSxlJiZ0aGlzLmZyb21PcmllbnRlZFJhbmdlKGUpfSx0aGlzLnN1YnN0cmFjdFBvaW50PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucmFuZ2VMaXN0LnN1YnN0cmFjdFBvaW50KGUpO2lmKHQpcmV0dXJuIHRoaXMuJG9uUmVtb3ZlUmFuZ2UodCksdFswXX0sdGhpcy5tZXJnZU92ZXJsYXBwaW5nUmFuZ2VzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yYW5nZUxpc3QubWVyZ2UoKTtlLmxlbmd0aCYmdGhpcy4kb25SZW1vdmVSYW5nZShlKX0sdGhpcy4kb25BZGRSYW5nZT1mdW5jdGlvbihlKXt0aGlzLnJhbmdlQ291bnQ9dGhpcy5yYW5nZUxpc3QucmFuZ2VzLmxlbmd0aCx0aGlzLnJhbmdlcy51bnNoaWZ0KGUpLHRoaXMuX3NpZ25hbCgiYWRkUmFuZ2UiLHtyYW5nZTplfSl9LHRoaXMuJG9uUmVtb3ZlUmFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy5yYW5nZUNvdW50PXRoaXMucmFuZ2VMaXN0LnJhbmdlcy5sZW5ndGg7aWYodGhpcy5yYW5nZUNvdW50PT0xJiZ0aGlzLmluTXVsdGlTZWxlY3RNb2RlKXt2YXIgdD10aGlzLnJhbmdlTGlzdC5yYW5nZXMucG9wKCk7ZS5wdXNoKHQpLHRoaXMucmFuZ2VDb3VudD0wfWZvcih2YXIgbj1lLmxlbmd0aDtuLS07KXt2YXIgcj10aGlzLnJhbmdlcy5pbmRleE9mKGVbbl0pO3RoaXMucmFuZ2VzLnNwbGljZShyLDEpfXRoaXMuX3NpZ25hbCgicmVtb3ZlUmFuZ2UiLHtyYW5nZXM6ZX0pLHRoaXMucmFuZ2VDb3VudD09PTAmJnRoaXMuaW5NdWx0aVNlbGVjdE1vZGUmJih0aGlzLmluTXVsdGlTZWxlY3RNb2RlPSExLHRoaXMuX3NpZ25hbCgic2luZ2xlU2VsZWN0IiksdGhpcy5zZXNzaW9uLiR1bmRvU2VsZWN0PSEwLHRoaXMucmFuZ2VMaXN0LmRldGFjaCh0aGlzLnNlc3Npb24pKSx0PXR8fHRoaXMucmFuZ2VzWzBdLHQmJiF0LmlzRXF1YWwodGhpcy5nZXRSYW5nZSgpKSYmdGhpcy5mcm9tT3JpZW50ZWRSYW5nZSh0KX0sdGhpcy4kaW5pdFJhbmdlTGlzdD1mdW5jdGlvbigpe2lmKHRoaXMucmFuZ2VMaXN0KXJldHVybjt0aGlzLnJhbmdlTGlzdD1uZXcgcix0aGlzLnJhbmdlcz1bXSx0aGlzLnJhbmdlQ291bnQ9MH0sdGhpcy5nZXRBbGxSYW5nZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5nZUNvdW50P3RoaXMucmFuZ2VMaXN0LnJhbmdlcy5jb25jYXQoKTpbdGhpcy5nZXRSYW5nZSgpXX0sdGhpcy5zcGxpdEludG9MaW5lcz1mdW5jdGlvbigpe2lmKHRoaXMucmFuZ2VDb3VudD4xKXt2YXIgZT10aGlzLnJhbmdlTGlzdC5yYW5nZXMsdD1lW2UubGVuZ3RoLTFdLG49aS5mcm9tUG9pbnRzKGVbMF0uc3RhcnQsdC5lbmQpO3RoaXMudG9TaW5nbGVSYW5nZSgpLHRoaXMuc2V0U2VsZWN0aW9uUmFuZ2Uobix0LmN1cnNvcj09dC5zdGFydCl9ZWxzZXt2YXIgbj10aGlzLmdldFJhbmdlKCkscj10aGlzLmlzQmFja3dhcmRzKCkscz1uLnN0YXJ0LnJvdyxvPW4uZW5kLnJvdztpZihzPT1vKXtpZihyKXZhciB1PW4uZW5kLGE9bi5zdGFydDtlbHNlIHZhciB1PW4uc3RhcnQsYT1uLmVuZDt0aGlzLmFkZFJhbmdlKGkuZnJvbVBvaW50cyhhLGEpKSx0aGlzLmFkZFJhbmdlKGkuZnJvbVBvaW50cyh1LHUpKTtyZXR1cm59dmFyIGY9W10sbD10aGlzLmdldExpbmVSYW5nZShzLCEwKTtsLnN0YXJ0LmNvbHVtbj1uLnN0YXJ0LmNvbHVtbixmLnB1c2gobCk7Zm9yKHZhciBjPXMrMTtjPG87YysrKWYucHVzaCh0aGlzLmdldExpbmVSYW5nZShjLCEwKSk7bD10aGlzLmdldExpbmVSYW5nZShvLCEwKSxsLmVuZC5jb2x1bW49bi5lbmQuY29sdW1uLGYucHVzaChsKSxmLmZvckVhY2godGhpcy5hZGRSYW5nZSx0aGlzKX19LHRoaXMudG9nZ2xlQmxvY2tTZWxlY3Rpb249ZnVuY3Rpb24oKXtpZih0aGlzLnJhbmdlQ291bnQ+MSl7dmFyIGU9dGhpcy5yYW5nZUxpc3QucmFuZ2VzLHQ9ZVtlLmxlbmd0aC0xXSxuPWkuZnJvbVBvaW50cyhlWzBdLnN0YXJ0LHQuZW5kKTt0aGlzLnRvU2luZ2xlUmFuZ2UoKSx0aGlzLnNldFNlbGVjdGlvblJhbmdlKG4sdC5jdXJzb3I9PXQuc3RhcnQpfWVsc2V7dmFyIHI9dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmN1cnNvcikscz10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuYW5jaG9yKSxvPXRoaXMucmVjdGFuZ3VsYXJSYW5nZUJsb2NrKHIscyk7by5mb3JFYWNoKHRoaXMuYWRkUmFuZ2UsdGhpcyl9fSx0aGlzLnJlY3Rhbmd1bGFyUmFuZ2VCbG9jaz1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10scz1lLmNvbHVtbjx0LmNvbHVtbjtpZihzKXZhciBvPWUuY29sdW1uLHU9dC5jb2x1bW4sYT1lLm9mZnNldFgsZj10Lm9mZnNldFg7ZWxzZSB2YXIgbz10LmNvbHVtbix1PWUuY29sdW1uLGE9dC5vZmZzZXRYLGY9ZS5vZmZzZXRYO3ZhciBsPWUucm93PHQucm93O2lmKGwpdmFyIGM9ZS5yb3csaD10LnJvdztlbHNlIHZhciBjPXQucm93LGg9ZS5yb3c7bzwwJiYobz0wKSxjPDAmJihjPTApLGM9PWgmJihuPSEwKTt2YXIgcDtmb3IodmFyIGQ9YztkPD1oO2QrKyl7dmFyIG09aS5mcm9tUG9pbnRzKHRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZCxvLGEpLHRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZCx1LGYpKTtpZihtLmlzRW1wdHkoKSl7aWYocCYmdihtLmVuZCxwKSlicmVhaztwPW0uZW5kfW0uY3Vyc29yPXM/bS5zdGFydDptLmVuZCxyLnB1c2gobSl9bCYmci5yZXZlcnNlKCk7aWYoIW4pe3ZhciBnPXIubGVuZ3RoLTE7d2hpbGUocltnXS5pc0VtcHR5KCkmJmc+MClnLS07aWYoZz4wKXt2YXIgeT0wO3doaWxlKHJbeV0uaXNFbXB0eSgpKXkrK31mb3IodmFyIGI9ZztiPj15O2ItLSlyW2JdLmlzRW1wdHkoKSYmci5zcGxpY2UoYiwxKX1yZXR1cm4gcn19LmNhbGwocy5wcm90b3R5cGUpO3ZhciBkPWUoIi4vZWRpdG9yIikuRWRpdG9yOyhmdW5jdGlvbigpe3RoaXMudXBkYXRlU2VsZWN0aW9uTWFya2Vycz1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCksdGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpfSx0aGlzLmFkZFNlbGVjdGlvbk1hcmtlcj1mdW5jdGlvbihlKXtlLmN1cnNvcnx8KGUuY3Vyc29yPWUuZW5kKTt2YXIgdD10aGlzLmdldFNlbGVjdGlvblN0eWxlKCk7cmV0dXJuIGUubWFya2VyPXRoaXMuc2Vzc2lvbi5hZGRNYXJrZXIoZSwiYWNlX3NlbGVjdGlvbiIsdCksdGhpcy5zZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXJzLnB1c2goZSksdGhpcy5zZXNzaW9uLnNlbGVjdGlvbk1hcmtlckNvdW50PXRoaXMuc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2Vycy5sZW5ndGgsZX0sdGhpcy5yZW1vdmVTZWxlY3Rpb25NYXJrZXI9ZnVuY3Rpb24oZSl7aWYoIWUubWFya2VyKXJldHVybjt0aGlzLnNlc3Npb24ucmVtb3ZlTWFya2VyKGUubWFya2VyKTt2YXIgdD10aGlzLnNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcnMuaW5kZXhPZihlKTt0IT0tMSYmdGhpcy5zZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXJzLnNwbGljZSh0LDEpLHRoaXMuc2Vzc2lvbi5zZWxlY3Rpb25NYXJrZXJDb3VudD10aGlzLnNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcnMubGVuZ3RofSx0aGlzLnJlbW92ZVNlbGVjdGlvbk1hcmtlcnM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXJzO2Zvcih2YXIgbj1lLmxlbmd0aDtuLS07KXt2YXIgcj1lW25dO2lmKCFyLm1hcmtlciljb250aW51ZTt0aGlzLnNlc3Npb24ucmVtb3ZlTWFya2VyKHIubWFya2VyKTt2YXIgaT10LmluZGV4T2Yocik7aSE9LTEmJnQuc3BsaWNlKGksMSl9dGhpcy5zZXNzaW9uLnNlbGVjdGlvbk1hcmtlckNvdW50PXQubGVuZ3RofSx0aGlzLiRvbkFkZFJhbmdlPWZ1bmN0aW9uKGUpe3RoaXMuYWRkU2VsZWN0aW9uTWFya2VyKGUucmFuZ2UpLHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCksdGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpfSx0aGlzLiRvblJlbW92ZVJhbmdlPWZ1bmN0aW9uKGUpe3RoaXMucmVtb3ZlU2VsZWN0aW9uTWFya2VycyhlLnJhbmdlcyksdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUJhY2tNYXJrZXJzKCl9LHRoaXMuJG9uTXVsdGlTZWxlY3Q9ZnVuY3Rpb24oZSl7aWYodGhpcy5pbk11bHRpU2VsZWN0TW9kZSlyZXR1cm47dGhpcy5pbk11bHRpU2VsZWN0TW9kZT0hMCx0aGlzLnNldFN0eWxlKCJhY2VfbXVsdGlzZWxlY3QiKSx0aGlzLmtleUJpbmRpbmcuYWRkS2V5Ym9hcmRIYW5kbGVyKGYua2V5Ym9hcmRIYW5kbGVyKSx0aGlzLmNvbW1hbmRzLnNldERlZmF1bHRIYW5kbGVyKCJleGVjIix0aGlzLiRvbk11bHRpU2VsZWN0RXhlYyksdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUJhY2tNYXJrZXJzKCl9LHRoaXMuJG9uU2luZ2xlU2VsZWN0PWZ1bmN0aW9uKGUpe2lmKHRoaXMuc2Vzc2lvbi5tdWx0aVNlbGVjdC5pblZpcnR1YWxNb2RlKXJldHVybjt0aGlzLmluTXVsdGlTZWxlY3RNb2RlPSExLHRoaXMudW5zZXRTdHlsZSgiYWNlX211bHRpc2VsZWN0IiksdGhpcy5rZXlCaW5kaW5nLnJlbW92ZUtleWJvYXJkSGFuZGxlcihmLmtleWJvYXJkSGFuZGxlciksdGhpcy5jb21tYW5kcy5yZW1vdmVEZWZhdWx0SGFuZGxlcigiZXhlYyIsdGhpcy4kb25NdWx0aVNlbGVjdEV4ZWMpLHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCksdGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpLHRoaXMuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpfSx0aGlzLiRvbk11bHRpU2VsZWN0RXhlYz1mdW5jdGlvbihlKXt2YXIgdD1lLmNvbW1hbmQsbj1lLmVkaXRvcjtpZighbi5tdWx0aVNlbGVjdClyZXR1cm47aWYoIXQubXVsdGlTZWxlY3RBY3Rpb24pe3ZhciByPXQuZXhlYyhuLGUuYXJnc3x8e30pO24ubXVsdGlTZWxlY3QuYWRkUmFuZ2Uobi5tdWx0aVNlbGVjdC50b09yaWVudGVkUmFuZ2UoKSksbi5tdWx0aVNlbGVjdC5tZXJnZU92ZXJsYXBwaW5nUmFuZ2VzKCl9ZWxzZSB0Lm11bHRpU2VsZWN0QWN0aW9uPT0iZm9yRWFjaCI/cj1uLmZvckVhY2hTZWxlY3Rpb24odCxlLmFyZ3MpOnQubXVsdGlTZWxlY3RBY3Rpb249PSJmb3JFYWNoTGluZSI/cj1uLmZvckVhY2hTZWxlY3Rpb24odCxlLmFyZ3MsITApOnQubXVsdGlTZWxlY3RBY3Rpb249PSJzaW5nbGUiPyhuLmV4aXRNdWx0aVNlbGVjdE1vZGUoKSxyPXQuZXhlYyhuLGUuYXJnc3x8e30pKTpyPXQubXVsdGlTZWxlY3RBY3Rpb24obixlLmFyZ3N8fHt9KTtyZXR1cm4gcn0sdGhpcy5mb3JFYWNoU2VsZWN0aW9uPWZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGUpcmV0dXJuO3ZhciByPW4mJm4ua2VlcE9yZGVyLGk9bj09MXx8biYmbi4kYnlMaW5lcyxvPXRoaXMuc2Vzc2lvbix1PXRoaXMuc2VsZWN0aW9uLGE9dS5yYW5nZUxpc3QsZj0ocj91OmEpLnJhbmdlcyxsO2lmKCFmLmxlbmd0aClyZXR1cm4gZS5leGVjP2UuZXhlYyh0aGlzLHR8fHt9KTplKHRoaXMsdHx8e30pO3ZhciBjPXUuX2V2ZW50UmVnaXN0cnk7dS5fZXZlbnRSZWdpc3RyeT17fTt2YXIgaD1uZXcgcyhvKTt0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITA7Zm9yKHZhciBwPWYubGVuZ3RoO3AtLTspe2lmKGkpd2hpbGUocD4wJiZmW3BdLnN0YXJ0LnJvdz09ZltwLTFdLmVuZC5yb3cpcC0tO2guZnJvbU9yaWVudGVkUmFuZ2UoZltwXSksaC5pbmRleD1wLHRoaXMuc2VsZWN0aW9uPW8uc2VsZWN0aW9uPWg7dmFyIGQ9ZS5leGVjP2UuZXhlYyh0aGlzLHR8fHt9KTplKHRoaXMsdHx8e30pOyFsJiZkIT09dW5kZWZpbmVkJiYobD1kKSxoLnRvT3JpZW50ZWRSYW5nZShmW3BdKX1oLmRldGFjaCgpLHRoaXMuc2VsZWN0aW9uPW8uc2VsZWN0aW9uPXUsdGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSExLHUuX2V2ZW50UmVnaXN0cnk9Yyx1Lm1lcmdlT3ZlcmxhcHBpbmdSYW5nZXMoKSx1LnJhbmdlc1swXSYmdS5mcm9tT3JpZW50ZWRSYW5nZSh1LnJhbmdlc1swXSk7dmFyIHY9dGhpcy5yZW5kZXJlci4kc2Nyb2xsQW5pbWF0aW9uO3JldHVybiB0aGlzLm9uQ3Vyc29yQ2hhbmdlKCksdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpLHYmJnYuZnJvbT09di50byYmdGhpcy5yZW5kZXJlci5hbmltYXRlU2Nyb2xsaW5nKHYuZnJvbSksbH0sdGhpcy5leGl0TXVsdGlTZWxlY3RNb2RlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaW5NdWx0aVNlbGVjdE1vZGV8fHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZSlyZXR1cm47dGhpcy5tdWx0aVNlbGVjdC50b1NpbmdsZVJhbmdlKCl9LHRoaXMuZ2V0U2VsZWN0ZWRUZXh0PWZ1bmN0aW9uKCl7dmFyIGU9IiI7aWYodGhpcy5pbk11bHRpU2VsZWN0TW9kZSYmIXRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZSl7dmFyIHQ9dGhpcy5tdWx0aVNlbGVjdC5yYW5nZUxpc3QucmFuZ2VzLG49W107Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspbi5wdXNoKHRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UodFtyXSkpO3ZhciBpPXRoaXMuc2Vzc2lvbi5nZXREb2N1bWVudCgpLmdldE5ld0xpbmVDaGFyYWN0ZXIoKTtlPW4uam9pbihpKSxlLmxlbmd0aD09KG4ubGVuZ3RoLTEpKmkubGVuZ3RoJiYoZT0iIil9ZWxzZSB0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCl8fChlPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSk7cmV0dXJuIGV9LHRoaXMuJGNoZWNrTXVsdGlzZWxlY3RDaGFuZ2U9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmluTXVsdGlTZWxlY3RNb2RlJiYhdGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlKXt2YXIgbj10aGlzLm11bHRpU2VsZWN0LnJhbmdlc1swXTtpZih0aGlzLm11bHRpU2VsZWN0LmlzRW1wdHkoKSYmdD09dGhpcy5tdWx0aVNlbGVjdC5hbmNob3IpcmV0dXJuO3ZhciByPXQ9PXRoaXMubXVsdGlTZWxlY3QuYW5jaG9yP24uY3Vyc29yPT1uLnN0YXJ0P24uZW5kOm4uc3RhcnQ6bi5jdXJzb3I7ci5yb3chPXQucm93fHx0aGlzLnNlc3Npb24uJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQoci5yb3csci5jb2x1bW4pLmNvbHVtbiE9dC5jb2x1bW4/dGhpcy5tdWx0aVNlbGVjdC50b1NpbmdsZVJhbmdlKHRoaXMubXVsdGlTZWxlY3QudG9PcmllbnRlZFJhbmdlKCkpOnRoaXMubXVsdGlTZWxlY3QubWVyZ2VPdmVybGFwcGluZ1JhbmdlcygpfX0sdGhpcy5maW5kQWxsPWZ1bmN0aW9uKGUsdCxuKXt0PXR8fHt9LHQubmVlZGxlPWV8fHQubmVlZGxlO2lmKHQubmVlZGxlPT11bmRlZmluZWQpe3ZhciByPXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKT90aGlzLnNlbGVjdGlvbi5nZXRXb3JkUmFuZ2UoKTp0aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpO3QubmVlZGxlPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2Uocil9dGhpcy4kc2VhcmNoLnNldCh0KTt2YXIgaT10aGlzLiRzZWFyY2guZmluZEFsbCh0aGlzLnNlc3Npb24pO2lmKCFpLmxlbmd0aClyZXR1cm4gMDt2YXIgcz10aGlzLm11bHRpU2VsZWN0O258fHMudG9TaW5nbGVSYW5nZShpWzBdKTtmb3IodmFyIG89aS5sZW5ndGg7by0tOylzLmFkZFJhbmdlKGlbb10sITApO3JldHVybiByJiZzLnJhbmdlTGlzdC5yYW5nZUF0UG9pbnQoci5zdGFydCkmJnMuYWRkUmFuZ2UociwhMCksaS5sZW5ndGh9LHRoaXMuc2VsZWN0TW9yZUxpbmVzPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zZWxlY3Rpb24udG9PcmllbnRlZFJhbmdlKCkscj1uLmN1cnNvcj09bi5lbmQscz10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKG4uY3Vyc29yKTt0aGlzLnNlbGVjdGlvbi4kZGVzaXJlZENvbHVtbiYmKHMuY29sdW1uPXRoaXMuc2VsZWN0aW9uLiRkZXNpcmVkQ29sdW1uKTt2YXIgbz10aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKHMucm93K2Uscy5jb2x1bW4pO2lmKCFuLmlzRW1wdHkoKSl2YXIgdT10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHI/bi5lbmQ6bi5zdGFydCksYT10aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKHUucm93K2UsdS5jb2x1bW4pO2Vsc2UgdmFyIGE9bztpZihyKXt2YXIgZj1pLmZyb21Qb2ludHMobyxhKTtmLmN1cnNvcj1mLnN0YXJ0fWVsc2V7dmFyIGY9aS5mcm9tUG9pbnRzKGEsbyk7Zi5jdXJzb3I9Zi5lbmR9Zi5kZXNpcmVkQ29sdW1uPXMuY29sdW1uO2lmKCF0aGlzLnNlbGVjdGlvbi5pbk11bHRpU2VsZWN0TW9kZSl0aGlzLnNlbGVjdGlvbi5hZGRSYW5nZShuKTtlbHNlIGlmKHQpdmFyIGw9bi5jdXJzb3I7dGhpcy5zZWxlY3Rpb24uYWRkUmFuZ2UoZiksbCYmdGhpcy5zZWxlY3Rpb24uc3Vic3RyYWN0UG9pbnQobCl9LHRoaXMudHJhbnNwb3NlU2VsZWN0aW9ucz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb24sbj10Lm11bHRpU2VsZWN0LHI9bi5yYW5nZXM7Zm9yKHZhciBpPXIubGVuZ3RoO2ktLTspe3ZhciBzPXJbaV07aWYocy5pc0VtcHR5KCkpe3ZhciBvPXQuZ2V0V29yZFJhbmdlKHMuc3RhcnQucm93LHMuc3RhcnQuY29sdW1uKTtzLnN0YXJ0LnJvdz1vLnN0YXJ0LnJvdyxzLnN0YXJ0LmNvbHVtbj1vLnN0YXJ0LmNvbHVtbixzLmVuZC5yb3c9by5lbmQucm93LHMuZW5kLmNvbHVtbj1vLmVuZC5jb2x1bW59fW4ubWVyZ2VPdmVybGFwcGluZ1JhbmdlcygpO3ZhciB1PVtdO2Zvcih2YXIgaT1yLmxlbmd0aDtpLS07KXt2YXIgcz1yW2ldO3UudW5zaGlmdCh0LmdldFRleHRSYW5nZShzKSl9ZTwwP3UudW5zaGlmdCh1LnBvcCgpKTp1LnB1c2godS5zaGlmdCgpKTtmb3IodmFyIGk9ci5sZW5ndGg7aS0tOyl7dmFyIHM9cltpXSxvPXMuY2xvbmUoKTt0LnJlcGxhY2Uocyx1W2ldKSxzLnN0YXJ0LnJvdz1vLnN0YXJ0LnJvdyxzLnN0YXJ0LmNvbHVtbj1vLnN0YXJ0LmNvbHVtbn1uLmZyb21PcmllbnRlZFJhbmdlKG4ucmFuZ2VzWzBdKX0sdGhpcy5zZWxlY3RNb3JlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLnNlc3Npb24saT1yLm11bHRpU2VsZWN0LHM9aS50b09yaWVudGVkUmFuZ2UoKTtpZihzLmlzRW1wdHkoKSl7cz1yLmdldFdvcmRSYW5nZShzLnN0YXJ0LnJvdyxzLnN0YXJ0LmNvbHVtbikscy5jdXJzb3I9ZT09LTE/cy5zdGFydDpzLmVuZCx0aGlzLm11bHRpU2VsZWN0LmFkZFJhbmdlKHMpO2lmKG4pcmV0dXJufXZhciBvPXIuZ2V0VGV4dFJhbmdlKHMpLHU9aChyLG8sZSk7dSYmKHUuY3Vyc29yPWU9PS0xP3Uuc3RhcnQ6dS5lbmQsdGhpcy5zZXNzaW9uLnVuZm9sZCh1KSx0aGlzLm11bHRpU2VsZWN0LmFkZFJhbmdlKHUpLHRoaXMucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcobnVsbCwuNSkpLHQmJnRoaXMubXVsdGlTZWxlY3Quc3Vic3RyYWN0UG9pbnQocy5jdXJzb3IpfSx0aGlzLmFsaWduQ3Vyc29ycz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbix0PWUubXVsdGlTZWxlY3Qsbj10LnJhbmdlcyxyPS0xLHM9bi5maWx0ZXIoZnVuY3Rpb24oZSl7aWYoZS5jdXJzb3Iucm93PT1yKXJldHVybiEwO3I9ZS5jdXJzb3Iucm93fSk7aWYoIW4ubGVuZ3RofHxzLmxlbmd0aD09bi5sZW5ndGgtMSl7dmFyIG89dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSx1PW8uc3RhcnQucm93LGY9by5lbmQucm93LGw9dT09ZjtpZihsKXt2YXIgYz10aGlzLnNlc3Npb24uZ2V0TGVuZ3RoKCksaDtkbyBoPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKGYpO3doaWxlKC9bPTpdLy50ZXN0KGgpJiYrK2Y8Yyk7ZG8gaD10aGlzLnNlc3Npb24uZ2V0TGluZSh1KTt3aGlsZSgvWz06XS8udGVzdChoKSYmLS11PjApO3U8MCYmKHU9MCksZj49YyYmKGY9Yy0xKX12YXIgcD10aGlzLnNlc3Npb24ucmVtb3ZlRnVsbExpbmVzKHUsZik7cD10aGlzLiRyZUFsaWduVGV4dChwLGwpLHRoaXMuc2Vzc2lvbi5pbnNlcnQoe3Jvdzp1LGNvbHVtbjowfSxwLmpvaW4oIlxuIikrIlxuIiksbHx8KG8uc3RhcnQuY29sdW1uPTAsby5lbmQuY29sdW1uPXBbcC5sZW5ndGgtMV0ubGVuZ3RoKSx0aGlzLnNlbGVjdGlvbi5zZXRSYW5nZShvKX1lbHNle3MuZm9yRWFjaChmdW5jdGlvbihlKXt0LnN1YnN0cmFjdFBvaW50KGUuY3Vyc29yKX0pO3ZhciBkPTAsdj1JbmZpbml0eSxtPW4ubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPXQuY3Vyc29yLHI9ZS5nZXRMaW5lKG4ucm93KSxpPXIuc3Vic3RyKG4uY29sdW1uKS5zZWFyY2goL1xTL2cpO3JldHVybiBpPT0tMSYmKGk9MCksbi5jb2x1bW4+ZCYmKGQ9bi5jb2x1bW4pLGk8diYmKHY9aSksaX0pO24uZm9yRWFjaChmdW5jdGlvbih0LG4pe3ZhciByPXQuY3Vyc29yLHM9ZC1yLmNvbHVtbixvPW1bbl0tdjtzPm8/ZS5pbnNlcnQocixhLnN0cmluZ1JlcGVhdCgiICIscy1vKSk6ZS5yZW1vdmUobmV3IGkoci5yb3csci5jb2x1bW4sci5yb3csci5jb2x1bW4tcytvKSksdC5zdGFydC5jb2x1bW49dC5lbmQuY29sdW1uPWQsdC5zdGFydC5yb3c9dC5lbmQucm93PXIucm93LHQuY3Vyc29yPXQuZW5kfSksdC5mcm9tT3JpZW50ZWRSYW5nZShuWzBdKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpLHRoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKX19LHRoaXMuJHJlQWxpZ25UZXh0PWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gdShlKXtyZXR1cm4gYS5zdHJpbmdSZXBlYXQoIiAiLGUpfWZ1bmN0aW9uIGYoZSl7cmV0dXJuIGVbMl0/dShpKStlWzJdK3Uocy1lWzJdLmxlbmd0aCtvKStlWzRdLnJlcGxhY2UoL14oWz06XSlccysvLCIkMSAiKTplWzBdfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGVbMl0/dShpK3MtZVsyXS5sZW5ndGgpK2VbMl0rdShvKStlWzRdLnJlcGxhY2UoL14oWz06XSlccysvLCIkMSAiKTplWzBdfWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGVbMl0/dShpKStlWzJdK3UobykrZVs0XS5yZXBsYWNlKC9eKFs9Ol0pXHMrLywiJDEgIik6ZVswXX12YXIgbj0hMCxyPSEwLGkscyxvO3JldHVybiBlLm1hcChmdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKC8oXHMqKSguKj8pKFxzKikoWz06XS4qKS8pO3JldHVybiB0P2k9PW51bGw/KGk9dFsxXS5sZW5ndGgscz10WzJdLmxlbmd0aCxvPXRbM10ubGVuZ3RoLHQpOihpK3MrbyE9dFsxXS5sZW5ndGgrdFsyXS5sZW5ndGgrdFszXS5sZW5ndGgmJihyPSExKSxpIT10WzFdLmxlbmd0aCYmKG49ITEpLGk+dFsxXS5sZW5ndGgmJihpPXRbMV0ubGVuZ3RoKSxzPHRbMl0ubGVuZ3RoJiYocz10WzJdLmxlbmd0aCksbz50WzNdLmxlbmd0aCYmKG89dFszXS5sZW5ndGgpLHQpOltlXX0pLm1hcCh0P2Y6bj9yP2w6ZjpjKX19KS5jYWxsKGQucHJvdG90eXBlKSx0Lm9uU2Vzc2lvbkNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdD1lLnNlc3Npb247dCYmIXQubXVsdGlTZWxlY3QmJih0LiRzZWxlY3Rpb25NYXJrZXJzPVtdLHQuc2VsZWN0aW9uLiRpbml0UmFuZ2VMaXN0KCksdC5tdWx0aVNlbGVjdD10LnNlbGVjdGlvbiksdGhpcy5tdWx0aVNlbGVjdD10JiZ0Lm11bHRpU2VsZWN0O3ZhciBuPWUub2xkU2Vzc2lvbjtuJiYobi5tdWx0aVNlbGVjdC5vZmYoImFkZFJhbmdlIix0aGlzLiRvbkFkZFJhbmdlKSxuLm11bHRpU2VsZWN0Lm9mZigicmVtb3ZlUmFuZ2UiLHRoaXMuJG9uUmVtb3ZlUmFuZ2UpLG4ubXVsdGlTZWxlY3Qub2ZmKCJtdWx0aVNlbGVjdCIsdGhpcy4kb25NdWx0aVNlbGVjdCksbi5tdWx0aVNlbGVjdC5vZmYoInNpbmdsZVNlbGVjdCIsdGhpcy4kb25TaW5nbGVTZWxlY3QpLG4ubXVsdGlTZWxlY3QubGVhZC5vZmYoImNoYW5nZSIsdGhpcy4kY2hlY2tNdWx0aXNlbGVjdENoYW5nZSksbi5tdWx0aVNlbGVjdC5hbmNob3Iub2ZmKCJjaGFuZ2UiLHRoaXMuJGNoZWNrTXVsdGlzZWxlY3RDaGFuZ2UpKSx0JiYodC5tdWx0aVNlbGVjdC5vbigiYWRkUmFuZ2UiLHRoaXMuJG9uQWRkUmFuZ2UpLHQubXVsdGlTZWxlY3Qub24oInJlbW92ZVJhbmdlIix0aGlzLiRvblJlbW92ZVJhbmdlKSx0Lm11bHRpU2VsZWN0Lm9uKCJtdWx0aVNlbGVjdCIsdGhpcy4kb25NdWx0aVNlbGVjdCksdC5tdWx0aVNlbGVjdC5vbigic2luZ2xlU2VsZWN0Iix0aGlzLiRvblNpbmdsZVNlbGVjdCksdC5tdWx0aVNlbGVjdC5sZWFkLm9uKCJjaGFuZ2UiLHRoaXMuJGNoZWNrTXVsdGlzZWxlY3RDaGFuZ2UpLHQubXVsdGlTZWxlY3QuYW5jaG9yLm9uKCJjaGFuZ2UiLHRoaXMuJGNoZWNrTXVsdGlzZWxlY3RDaGFuZ2UpKSx0JiZ0aGlzLmluTXVsdGlTZWxlY3RNb2RlIT10LnNlbGVjdGlvbi5pbk11bHRpU2VsZWN0TW9kZSYmKHQuc2VsZWN0aW9uLmluTXVsdGlTZWxlY3RNb2RlP3RoaXMuJG9uTXVsdGlTZWxlY3QoKTp0aGlzLiRvblNpbmdsZVNlbGVjdCgpKX0sdC5NdWx0aVNlbGVjdD1tLGUoIi4vY29uZmlnIikuZGVmaW5lT3B0aW9ucyhkLnByb3RvdHlwZSwiZWRpdG9yIix7ZW5hYmxlTXVsdGlzZWxlY3Q6e3NldDpmdW5jdGlvbihlKXttKHRoaXMpLGU/KHRoaXMub24oImNoYW5nZVNlc3Npb24iLHRoaXMuJG11bHRpc2VsZWN0T25TZXNzaW9uQ2hhbmdlKSx0aGlzLm9uKCJtb3VzZWRvd24iLG8pKToodGhpcy5vZmYoImNoYW5nZVNlc3Npb24iLHRoaXMuJG11bHRpc2VsZWN0T25TZXNzaW9uQ2hhbmdlKSx0aGlzLm9mZigibW91c2Vkb3duIixvKSl9LHZhbHVlOiEwfSxlbmFibGVCbG9ja1NlbGVjdDp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJGJsb2NrU2VsZWN0RW5hYmxlZD1lfSx2YWx1ZTohMH19KX0pLGFjZS5kZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi8uLi9yYW5nZSIpLlJhbmdlLGk9dC5Gb2xkTW9kZT1mdW5jdGlvbigpe307KGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9bnVsbCx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPW51bGwsdGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmdldExpbmUobik7cmV0dXJuIHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnRlc3Qocik/InN0YXJ0Ijp0PT0ibWFya2JlZ2luZW5kIiYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlciYmdGhpcy5mb2xkaW5nU3RvcE1hcmtlci50ZXN0KHIpPyJlbmQiOiIifSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGx9LHRoaXMuaW5kZW50YXRpb25CbG9jaz1mdW5jdGlvbihlLHQsbil7dmFyIGk9L1xTLyxzPWUuZ2V0TGluZSh0KSxvPXMuc2VhcmNoKGkpO2lmKG89PS0xKXJldHVybjt2YXIgdT1ufHxzLmxlbmd0aCxhPWUuZ2V0TGVuZ3RoKCksZj10LGw9dDt3aGlsZSgrK3Q8YSl7dmFyIGM9ZS5nZXRMaW5lKHQpLnNlYXJjaChpKTtpZihjPT0tMSljb250aW51ZTtpZihjPD1vKXt2YXIgaD1lLmdldFRva2VuQXQodCwwKTtpZighaHx8aC50eXBlIT09InN0cmluZyIpYnJlYWt9bD10fWlmKGw+Zil7dmFyIHA9ZS5nZXRMaW5lKGwpLmxlbmd0aDtyZXR1cm4gbmV3IHIoZix1LGwscCl9fSx0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oZSx0LG4saSxzKXt2YXIgbz17cm93Om4sY29sdW1uOmkrMX0sdT1lLiRmaW5kQ2xvc2luZ0JyYWNrZXQodCxvLHMpO2lmKCF1KXJldHVybjt2YXIgYT1lLmZvbGRXaWRnZXRzW3Uucm93XTtyZXR1cm4gYT09bnVsbCYmKGE9ZS5nZXRGb2xkV2lkZ2V0KHUucm93KSksYT09InN0YXJ0IiYmdS5yb3c+by5yb3cmJih1LnJvdy0tLHUuY29sdW1uPWUuZ2V0TGluZSh1LnJvdykubGVuZ3RoKSxyLmZyb21Qb2ludHMobyx1KX0sdGhpcy5jbG9zaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGUsdCxuLGkscyl7dmFyIG89e3JvdzpuLGNvbHVtbjppfSx1PWUuJGZpbmRPcGVuaW5nQnJhY2tldCh0LG8pO2lmKCF1KXJldHVybjtyZXR1cm4gdS5jb2x1bW4rKyxvLmNvbHVtbi0tLHIuZnJvbVBvaW50cyh1LG8pfX0pLmNhbGwoaS5wcm90b3R5cGUpfSksYWNlLmRlZmluZSgiYWNlL3RoZW1lL3RleHRtYXRlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QuaXNEYXJrPSExLHQuY3NzQ2xhc3M9ImFjZS10bSIsdC5jc3NUZXh0PScuYWNlLXRtIC5hY2VfZ3V0dGVyIHtiYWNrZ3JvdW5kOiAjZjBmMGYwO2NvbG9yOiAjMzMzO30uYWNlLXRtIC5hY2VfcHJpbnQtbWFyZ2luIHt3aWR0aDogMXB4O2JhY2tncm91bmQ6ICNlOGU4ZTg7fS5hY2UtdG0gLmFjZV9mb2xkIHtiYWNrZ3JvdW5kLWNvbG9yOiAjNkI3MkU2O30uYWNlLXRtIHtiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGO2NvbG9yOiBibGFjazt9LmFjZS10bSAuYWNlX2N1cnNvciB7Y29sb3I6IGJsYWNrO30uYWNlLXRtIC5hY2VfaW52aXNpYmxlIHtjb2xvcjogcmdiKDE5MSwgMTkxLCAxOTEpO30uYWNlLXRtIC5hY2Vfc3RvcmFnZSwuYWNlLXRtIC5hY2Vfa2V5d29yZCB7Y29sb3I6IGJsdWU7fS5hY2UtdG0gLmFjZV9jb25zdGFudCB7Y29sb3I6IHJnYigxOTcsIDYsIDExKTt9LmFjZS10bSAuYWNlX2NvbnN0YW50LmFjZV9idWlsZGluIHtjb2xvcjogcmdiKDg4LCA3MiwgMjQ2KTt9LmFjZS10bSAuYWNlX2NvbnN0YW50LmFjZV9sYW5ndWFnZSB7Y29sb3I6IHJnYig4OCwgOTIsIDI0Nik7fS5hY2UtdG0gLmFjZV9jb25zdGFudC5hY2VfbGlicmFyeSB7Y29sb3I6IHJnYig2LCAxNTAsIDE0KTt9LmFjZS10bSAuYWNlX2ludmFsaWQge2JhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAwLCAwLCAwLjEpO2NvbG9yOiByZWQ7fS5hY2UtdG0gLmFjZV9zdXBwb3J0LmFjZV9mdW5jdGlvbiB7Y29sb3I6IHJnYig2MCwgNzYsIDExNCk7fS5hY2UtdG0gLmFjZV9zdXBwb3J0LmFjZV9jb25zdGFudCB7Y29sb3I6IHJnYig2LCAxNTAsIDE0KTt9LmFjZS10bSAuYWNlX3N1cHBvcnQuYWNlX3R5cGUsLmFjZS10bSAuYWNlX3N1cHBvcnQuYWNlX2NsYXNzIHtjb2xvcjogcmdiKDEwOSwgMTIxLCAyMjIpO30uYWNlLXRtIC5hY2Vfa2V5d29yZC5hY2Vfb3BlcmF0b3Ige2NvbG9yOiByZ2IoMTA0LCAxMTgsIDEzNSk7fS5hY2UtdG0gLmFjZV9zdHJpbmcge2NvbG9yOiByZ2IoMywgMTA2LCA3KTt9LmFjZS10bSAuYWNlX2NvbW1lbnQge2NvbG9yOiByZ2IoNzYsIDEzNiwgMTA3KTt9LmFjZS10bSAuYWNlX2NvbW1lbnQuYWNlX2RvYyB7Y29sb3I6IHJnYigwLCAxMDIsIDI1NSk7fS5hY2UtdG0gLmFjZV9jb21tZW50LmFjZV9kb2MuYWNlX3RhZyB7Y29sb3I6IHJnYigxMjgsIDE1OSwgMTkxKTt9LmFjZS10bSAuYWNlX2NvbnN0YW50LmFjZV9udW1lcmljIHtjb2xvcjogcmdiKDAsIDAsIDIwNSk7fS5hY2UtdG0gLmFjZV92YXJpYWJsZSB7Y29sb3I6IHJnYig0OSwgMTMyLCAxNDkpO30uYWNlLXRtIC5hY2VfeG1sLXBlIHtjb2xvcjogcmdiKDEwNCwgMTA0LCA5MSk7fS5hY2UtdG0gLmFjZV9lbnRpdHkuYWNlX25hbWUuYWNlX2Z1bmN0aW9uIHtjb2xvcjogIzAwMDBBMjt9LmFjZS10bSAuYWNlX2hlYWRpbmcge2NvbG9yOiByZ2IoMTIsIDcsIDI1NSk7fS5hY2UtdG0gLmFjZV9saXN0IHtjb2xvcjpyZ2IoMTg1LCA2LCAxNDQpO30uYWNlLXRtIC5hY2VfbWV0YS5hY2VfdGFnIHtjb2xvcjpyZ2IoMCwgMjIsIDE0Mik7fS5hY2UtdG0gLmFjZV9zdHJpbmcuYWNlX3JlZ2V4IHtjb2xvcjogcmdiKDI1NSwgMCwgMCl9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7YmFja2dyb3VuZDogcmdiKDE4MSwgMjEzLCAyNTUpO30uYWNlLXRtLmFjZV9tdWx0aXNlbGVjdCAuYWNlX3NlbGVjdGlvbi5hY2Vfc3RhcnQge2JveC1zaGFkb3c6IDAgMCAzcHggMHB4IHdoaXRlO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCB7YmFja2dyb3VuZDogcmdiKDI1MiwgMjU1LCAwKTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0YWNrIHtiYWNrZ3JvdW5kOiByZ2IoMTY0LCAyMjksIDEwMSk7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHttYXJnaW46IC0xcHggMCAwIC0xcHg7Ym9yZGVyOiAxcHggc29saWQgcmdiKDE5MiwgMTkyLCAxOTIpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlLWxpbmUge2JhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNyk7fS5hY2UtdG0gLmFjZV9ndXR0ZXItYWN0aXZlLWxpbmUge2JhY2tncm91bmQtY29sb3IgOiAjZGNkY2RjO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWQtd29yZCB7YmFja2dyb3VuZDogcmdiKDI1MCwgMjUwLCAyNTUpO2JvcmRlcjogMXB4IHNvbGlkIHJnYigyMDAsIDIwMCwgMjUwKTt9LmFjZS10bSAuYWNlX2luZGVudC1ndWlkZSB7YmFja2dyb3VuZDogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFFQUFBQUNDQVlBQUFDWmdiWW5BQUFBRTBsRVFWUUltV1A0Ly8vL2Y0YkxseS8vQndBbVZnZDEvdzExL2dBQUFBQkpSVTVFcmtKZ2dnPT0iKSByaWdodCByZXBlYXQteTt9Jyx0LiRpZD0iYWNlL3RoZW1lL3RleHRtYXRlIjt2YXIgcj1lKCIuLi9saWIvZG9tIik7ci5pbXBvcnRDc3NTdHJpbmcodC5jc3NUZXh0LHQuY3NzQ2xhc3MpfSksYWNlLmRlZmluZSgiYWNlL2xpbmVfd2lkZ2V0cyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7dGhpcy5zZXNzaW9uPWUsdGhpcy5zZXNzaW9uLndpZGdldE1hbmFnZXI9dGhpcyx0aGlzLnNlc3Npb24uZ2V0Um93TGVuZ3RoPXRoaXMuZ2V0Um93TGVuZ3RoLHRoaXMuc2Vzc2lvbi4kZ2V0V2lkZ2V0U2NyZWVuTGVuZ3RoPXRoaXMuJGdldFdpZGdldFNjcmVlbkxlbmd0aCx0aGlzLnVwZGF0ZU9uQ2hhbmdlPXRoaXMudXBkYXRlT25DaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnJlbmRlcldpZGdldHM9dGhpcy5yZW5kZXJXaWRnZXRzLmJpbmQodGhpcyksdGhpcy5tZWFzdXJlV2lkZ2V0cz10aGlzLm1lYXN1cmVXaWRnZXRzLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLl9jaGFuZ2VkV2lkZ2V0cz1bXSx0aGlzLiRvbkNoYW5nZUVkaXRvcj10aGlzLiRvbkNoYW5nZUVkaXRvci5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlIix0aGlzLnVwZGF0ZU9uQ2hhbmdlKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZUZvbGQiLHRoaXMudXBkYXRlT25Gb2xkKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZUVkaXRvciIsdGhpcy4kb25DaGFuZ2VFZGl0b3IpfXZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvZG9tIikscz1lKCIuL3JhbmdlIikuUmFuZ2U7KGZ1bmN0aW9uKCl7dGhpcy5nZXRSb3dMZW5ndGg9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHRoaXMubGluZVdpZGdldHM/dD10aGlzLmxpbmVXaWRnZXRzW2VdJiZ0aGlzLmxpbmVXaWRnZXRzW2VdLnJvd0NvdW50fHwwOnQ9MCwhdGhpcy4kdXNlV3JhcE1vZGV8fCF0aGlzLiR3cmFwRGF0YVtlXT8xK3Q6dGhpcy4kd3JhcERhdGFbZV0ubGVuZ3RoKzErdH0sdGhpcy4kZ2V0V2lkZ2V0U2NyZWVuTGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIGU9MDtyZXR1cm4gdGhpcy5saW5lV2lkZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QmJnQucm93Q291bnQmJiF0LmhpZGRlbiYmKGUrPXQucm93Q291bnQpfSksZX0sdGhpcy4kb25DaGFuZ2VFZGl0b3I9ZnVuY3Rpb24oZSl7dGhpcy5hdHRhY2goZS5lZGl0b3IpfSx0aGlzLmF0dGFjaD1mdW5jdGlvbihlKXtlJiZlLndpZGdldE1hbmFnZXImJmUud2lkZ2V0TWFuYWdlciE9dGhpcyYmZS53aWRnZXRNYW5hZ2VyLmRldGFjaCgpO2lmKHRoaXMuZWRpdG9yPT1lKXJldHVybjt0aGlzLmRldGFjaCgpLHRoaXMuZWRpdG9yPWUsZSYmKGUud2lkZ2V0TWFuYWdlcj10aGlzLGUucmVuZGVyZXIub24oImJlZm9yZVJlbmRlciIsdGhpcy5tZWFzdXJlV2lkZ2V0cyksZS5yZW5kZXJlci5vbigiYWZ0ZXJSZW5kZXIiLHRoaXMucmVuZGVyV2lkZ2V0cykpfSx0aGlzLmRldGFjaD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmVkaXRvcjtpZighdClyZXR1cm47dGhpcy5lZGl0b3I9bnVsbCx0LndpZGdldE1hbmFnZXI9bnVsbCx0LnJlbmRlcmVyLm9mZigiYmVmb3JlUmVuZGVyIix0aGlzLm1lYXN1cmVXaWRnZXRzKSx0LnJlbmRlcmVyLm9mZigiYWZ0ZXJSZW5kZXIiLHRoaXMucmVuZGVyV2lkZ2V0cyk7dmFyIG49dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzO24mJm4uZm9yRWFjaChmdW5jdGlvbihlKXtlJiZlLmVsJiZlLmVsLnBhcmVudE5vZGUmJihlLl9pbkRvY3VtZW50PSExLGUuZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlLmVsKSl9KX0sdGhpcy51cGRhdGVPbkZvbGQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmxpbmVXaWRnZXRzO2lmKCFufHwhZS5hY3Rpb24pcmV0dXJuO3ZhciByPWUuZGF0YSxpPXIuc3RhcnQucm93LHM9ci5lbmQucm93LG89ZS5hY3Rpb249PSJhZGQiO2Zvcih2YXIgdT1pKzE7dTxzO3UrKyluW3VdJiYoblt1XS5oaWRkZW49byk7bltzXSYmKG8/bltpXT9uW3NdLmhpZGRlbj1vOm5baV09bltzXToobltpXT09bltzXSYmKG5baV09dW5kZWZpbmVkKSxuW3NdLmhpZGRlbj1vKSl9LHRoaXMudXBkYXRlT25DaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzO2lmKCF0KXJldHVybjt2YXIgbj1lLnN0YXJ0LnJvdyxyPWUuZW5kLnJvdy1uO2lmKHIhPT0wKWlmKGUuYWN0aW9uPT0icmVtb3ZlIil7dmFyIGk9dC5zcGxpY2UobisxLHIpO2kuZm9yRWFjaChmdW5jdGlvbihlKXtlJiZ0aGlzLnJlbW92ZUxpbmVXaWRnZXQoZSl9LHRoaXMpLHRoaXMuJHVwZGF0ZVJvd3MoKX1lbHNle3ZhciBzPW5ldyBBcnJheShyKTtzLnVuc2hpZnQobiwwKSx0LnNwbGljZS5hcHBseSh0LHMpLHRoaXMuJHVwZGF0ZVJvd3MoKX19LHRoaXMuJHVwZGF0ZVJvd3M9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24ubGluZVdpZGdldHM7aWYoIWUpcmV0dXJuO3ZhciB0PSEwO2UuZm9yRWFjaChmdW5jdGlvbihlLG4pe2lmKGUpe3Q9ITEsZS5yb3c9bjt3aGlsZShlLiRvbGRXaWRnZXQpZS4kb2xkV2lkZ2V0LnJvdz1uLGU9ZS4kb2xkV2lkZ2V0fX0pLHQmJih0aGlzLnNlc3Npb24ubGluZVdpZGdldHM9bnVsbCl9LHRoaXMuYWRkTGluZVdpZGdldD1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb24ubGluZVdpZGdldHN8fCh0aGlzLnNlc3Npb24ubGluZVdpZGdldHM9bmV3IEFycmF5KHRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKSkpO3ZhciB0PXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0c1tlLnJvd107dCYmKGUuJG9sZFdpZGdldD10LHQuZWwmJnQuZWwucGFyZW50Tm9kZSYmKHQuZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0LmVsKSx0Ll9pbkRvY3VtZW50PSExKSksdGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzW2Uucm93XT1lLGUuc2Vzc2lvbj10aGlzLnNlc3Npb247dmFyIG49dGhpcy5lZGl0b3IucmVuZGVyZXI7ZS5odG1sJiYhZS5lbCYmKGUuZWw9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSxlLmVsLmlubmVySFRNTD1lLmh0bWwpLGUuZWwmJihpLmFkZENzc0NsYXNzKGUuZWwsImFjZV9saW5lV2lkZ2V0Q29udGFpbmVyIiksZS5lbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuZWwuc3R5bGUuekluZGV4PTUsbi5jb250YWluZXIuYXBwZW5kQ2hpbGQoZS5lbCksZS5faW5Eb2N1bWVudD0hMCksZS5jb3Zlckd1dHRlcnx8KGUuZWwuc3R5bGUuekluZGV4PTMpLGUucGl4ZWxIZWlnaHQ9PW51bGwmJihlLnBpeGVsSGVpZ2h0PWUuZWwub2Zmc2V0SGVpZ2h0KSxlLnJvd0NvdW50PT1udWxsJiYoZS5yb3dDb3VudD1lLnBpeGVsSGVpZ2h0L24ubGF5ZXJDb25maWcubGluZUhlaWdodCk7dmFyIHI9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLnJvdywwKTtlLiRmb2xkPXI7aWYocil7dmFyIHM9dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzO2Uucm93PT1yLmVuZC5yb3cmJiFzW3Iuc3RhcnQucm93XT9zW3Iuc3RhcnQucm93XT1lOmUuaGlkZGVuPSEwfXJldHVybiB0aGlzLnNlc3Npb24uX2VtaXQoImNoYW5nZUZvbGQiLHtkYXRhOntzdGFydDp7cm93OmUucm93fX19KSx0aGlzLiR1cGRhdGVSb3dzKCksdGhpcy5yZW5kZXJXaWRnZXRzKG51bGwsbiksdGhpcy5vbldpZGdldENoYW5nZWQoZSksZX0sdGhpcy5yZW1vdmVMaW5lV2lkZ2V0PWZ1bmN0aW9uKGUpe2UuX2luRG9jdW1lbnQ9ITEsZS5zZXNzaW9uPW51bGwsZS5lbCYmZS5lbC5wYXJlbnROb2RlJiZlLmVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZS5lbCk7aWYoZS5lZGl0b3ImJmUuZWRpdG9yLmRlc3Ryb3kpdHJ5e2UuZWRpdG9yLmRlc3Ryb3koKX1jYXRjaCh0KXt9aWYodGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzKXt2YXIgbj10aGlzLnNlc3Npb24ubGluZVdpZGdldHNbZS5yb3ddO2lmKG49PWUpdGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzW2Uucm93XT1lLiRvbGRXaWRnZXQsZS4kb2xkV2lkZ2V0JiZ0aGlzLm9uV2lkZ2V0Q2hhbmdlZChlLiRvbGRXaWRnZXQpO2Vsc2Ugd2hpbGUobil7aWYobi4kb2xkV2lkZ2V0PT1lKXtuLiRvbGRXaWRnZXQ9ZS4kb2xkV2lkZ2V0O2JyZWFrfW49bi4kb2xkV2lkZ2V0fX10aGlzLnNlc3Npb24uX2VtaXQoImNoYW5nZUZvbGQiLHtkYXRhOntzdGFydDp7cm93OmUucm93fX19KSx0aGlzLiR1cGRhdGVSb3dzKCl9LHRoaXMuZ2V0V2lkZ2V0c0F0Um93PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cyxuPXQmJnRbZV0scj1bXTt3aGlsZShuKXIucHVzaChuKSxuPW4uJG9sZFdpZGdldDtyZXR1cm4gcn0sdGhpcy5vbldpZGdldENoYW5nZWQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uLl9jaGFuZ2VkV2lkZ2V0cy5wdXNoKGUpLHRoaXMuZWRpdG9yJiZ0aGlzLmVkaXRvci5yZW5kZXJlci51cGRhdGVGdWxsKCl9LHRoaXMubWVhc3VyZVdpZGdldHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNlc3Npb24uX2NoYW5nZWRXaWRnZXRzLHI9dC5sYXllckNvbmZpZztpZighbnx8IW4ubGVuZ3RoKXJldHVybjt2YXIgaT1JbmZpbml0eTtmb3IodmFyIHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIG89bltzXTtpZighb3x8IW8uZWwpY29udGludWU7aWYoby5zZXNzaW9uIT10aGlzLnNlc3Npb24pY29udGludWU7aWYoIW8uX2luRG9jdW1lbnQpe2lmKHRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0c1tvLnJvd10hPW8pY29udGludWU7by5faW5Eb2N1bWVudD0hMCx0LmNvbnRhaW5lci5hcHBlbmRDaGlsZChvLmVsKX1vLmg9by5lbC5vZmZzZXRIZWlnaHQsby5maXhlZFdpZHRofHwoby53PW8uZWwub2Zmc2V0V2lkdGgsby5zY3JlZW5XaWR0aD1NYXRoLmNlaWwoby53L3IuY2hhcmFjdGVyV2lkdGgpKTt2YXIgdT1vLmgvci5saW5lSGVpZ2h0O28uY292ZXJMaW5lJiYodS09dGhpcy5zZXNzaW9uLmdldFJvd0xpbmVDb3VudChvLnJvdyksdTwwJiYodT0wKSksby5yb3dDb3VudCE9dSYmKG8ucm93Q291bnQ9dSxvLnJvdzxpJiYoaT1vLnJvdykpfWkhPUluZmluaXR5JiYodGhpcy5zZXNzaW9uLl9lbWl0KCJjaGFuZ2VGb2xkIix7ZGF0YTp7c3RhcnQ6e3JvdzppfX19KSx0aGlzLnNlc3Npb24ubGluZVdpZGdldFdpZHRoPW51bGwpLHRoaXMuc2Vzc2lvbi5fY2hhbmdlZFdpZGdldHM9W119LHRoaXMucmVuZGVyV2lkZ2V0cz1mdW5jdGlvbihlLHQpe3ZhciBuPXQubGF5ZXJDb25maWcscj10aGlzLnNlc3Npb24ubGluZVdpZGdldHM7aWYoIXIpcmV0dXJuO3ZhciBpPU1hdGgubWluKHRoaXMuZmlyc3RSb3csbi5maXJzdFJvdykscz1NYXRoLm1heCh0aGlzLmxhc3RSb3csbi5sYXN0Um93LHIubGVuZ3RoKTt3aGlsZShpPjAmJiFyW2ldKWktLTt0aGlzLmZpcnN0Um93PW4uZmlyc3RSb3csdGhpcy5sYXN0Um93PW4ubGFzdFJvdyx0LiRjdXJzb3JMYXllci5jb25maWc9bjtmb3IodmFyIG89aTtvPD1zO28rKyl7dmFyIHU9cltvXTtpZighdXx8IXUuZWwpY29udGludWU7aWYodS5oaWRkZW4pe3UuZWwuc3R5bGUudG9wPS0xMDAtKHUucGl4ZWxIZWlnaHR8fDApKyJweCI7Y29udGludWV9dS5faW5Eb2N1bWVudHx8KHUuX2luRG9jdW1lbnQ9ITAsdC5jb250YWluZXIuYXBwZW5kQ2hpbGQodS5lbCkpO3ZhciBhPXQuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oe3JvdzpvLGNvbHVtbjowfSwhMCkudG9wO3UuY292ZXJMaW5lfHwoYSs9bi5saW5lSGVpZ2h0KnRoaXMuc2Vzc2lvbi5nZXRSb3dMaW5lQ291bnQodS5yb3cpKSx1LmVsLnN0eWxlLnRvcD1hLW4ub2Zmc2V0KyJweCI7dmFyIGY9dS5jb3Zlckd1dHRlcj8wOnQuZ3V0dGVyV2lkdGg7dS5maXhlZFdpZHRofHwoZi09dC5zY3JvbGxMZWZ0KSx1LmVsLnN0eWxlLmxlZnQ9ZisicHgiLHUuZnVsbFdpZHRoJiZ1LnNjcmVlbldpZHRoJiYodS5lbC5zdHlsZS5taW5XaWR0aD1uLndpZHRoKzIqbi5wYWRkaW5nKyJweCIpLHUuZml4ZWRXaWR0aD91LmVsLnN0eWxlLnJpZ2h0PXQuc2Nyb2xsQmFyLmdldFdpZHRoKCkrInB4Ijp1LmVsLnN0eWxlLnJpZ2h0PSIifX19KS5jYWxsKG8ucHJvdG90eXBlKSx0LkxpbmVXaWRnZXRzPW99KSxhY2UuZGVmaW5lKCJhY2UvZXh0L2Vycm9yX21hcmtlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saW5lX3dpZGdldHMiLCJhY2UvbGliL2RvbSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQsbil7dmFyIHI9MCxpPWUubGVuZ3RoLTE7d2hpbGUocjw9aSl7dmFyIHM9citpPj4xLG89bih0LGVbc10pO2lmKG8+MClyPXMrMTtlbHNle2lmKCEobzwwKSlyZXR1cm4gcztpPXMtMX19cmV0dXJuLShyKzEpfWZ1bmN0aW9uIHUoZSx0LG4pe3ZhciByPWUuZ2V0QW5ub3RhdGlvbnMoKS5zb3J0KHMuY29tcGFyZVBvaW50cyk7aWYoIXIubGVuZ3RoKXJldHVybjt2YXIgaT1vKHIse3Jvdzp0LGNvbHVtbjotMX0scy5jb21wYXJlUG9pbnRzKTtpPDAmJihpPS1pLTEpLGk+PXIubGVuZ3RoP2k9bj4wPzA6ci5sZW5ndGgtMTppPT09MCYmbjwwJiYoaT1yLmxlbmd0aC0xKTt2YXIgdT1yW2ldO2lmKCF1fHwhbilyZXR1cm47aWYodS5yb3c9PT10KXtkbyB1PXJbaSs9bl07d2hpbGUodSYmdS5yb3c9PT10KTtpZighdSlyZXR1cm4gci5zbGljZSgpfXZhciBhPVtdO3Q9dS5yb3c7ZG8gYVtuPDA/InVuc2hpZnQiOiJwdXNoIl0odSksdT1yW2krPW5dO3doaWxlKHUmJnUucm93PT10KTtyZXR1cm4gYS5sZW5ndGgmJmF9dmFyIHI9ZSgiLi4vbGluZV93aWRnZXRzIikuTGluZVdpZGdldHMsaT1lKCIuLi9saWIvZG9tIikscz1lKCIuLi9yYW5nZSIpLlJhbmdlO3Quc2hvd0Vycm9yTWFya2VyPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zZXNzaW9uO24ud2lkZ2V0TWFuYWdlcnx8KG4ud2lkZ2V0TWFuYWdlcj1uZXcgcihuKSxuLndpZGdldE1hbmFnZXIuYXR0YWNoKGUpKTt2YXIgcz1lLmdldEN1cnNvclBvc2l0aW9uKCksbz1zLnJvdyxhPW4ud2lkZ2V0TWFuYWdlci5nZXRXaWRnZXRzQXRSb3cobykuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PSJlcnJvck1hcmtlciJ9KVswXTthP2EuZGVzdHJveSgpOm8tPXQ7dmFyIGY9dShuLG8sdCksbDtpZihmKXt2YXIgYz1mWzBdO3MuY29sdW1uPShjLnBvcyYmdHlwZW9mIGMuY29sdW1uIT0ibnVtYmVyIj9jLnBvcy5zYzpjLmNvbHVtbil8fDAscy5yb3c9Yy5yb3csbD1lLnJlbmRlcmVyLiRndXR0ZXJMYXllci4kYW5ub3RhdGlvbnNbcy5yb3ddfWVsc2V7aWYoYSlyZXR1cm47bD17dGV4dDpbIkxvb2tzIGdvb2QhIl0sY2xhc3NOYW1lOiJhY2Vfb2sifX1lLnNlc3Npb24udW5mb2xkKHMucm93KSxlLnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbihzKTt2YXIgaD17cm93OnMucm93LGZpeGVkV2lkdGg6ITAsY292ZXJHdXR0ZXI6ITAsZWw6aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0eXBlOiJlcnJvck1hcmtlciJ9LHA9aC5lbC5hcHBlbmRDaGlsZChpLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxkPWguZWwuYXBwZW5kQ2hpbGQoaS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7ZC5jbGFzc05hbWU9ImVycm9yX3dpZGdldF9hcnJvdyAiK2wuY2xhc3NOYW1lO3ZhciB2PWUucmVuZGVyZXIuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24ocykubGVmdDtkLnN0eWxlLmxlZnQ9ditlLnJlbmRlcmVyLmd1dHRlcldpZHRoLTUrInB4IixoLmVsLmNsYXNzTmFtZT0iZXJyb3Jfd2lkZ2V0X3dyYXBwZXIiLHAuY2xhc3NOYW1lPSJlcnJvcl93aWRnZXQgIitsLmNsYXNzTmFtZSxwLmlubmVySFRNTD1sLnRleHQuam9pbigiPGJyPiIpLHAuYXBwZW5kQ2hpbGQoaS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7dmFyIG09ZnVuY3Rpb24oZSx0LG4pe2lmKHQ9PT0wJiYobj09PSJlc2MifHxuPT09InJldHVybiIpKXJldHVybiBoLmRlc3Ryb3koKSx7Y29tbWFuZDoibnVsbCJ9fTtoLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZihlLiRtb3VzZUhhbmRsZXIuaXNNb3VzZVByZXNzZWQpcmV0dXJuO2Uua2V5QmluZGluZy5yZW1vdmVLZXlib2FyZEhhbmRsZXIobSksbi53aWRnZXRNYW5hZ2VyLnJlbW92ZUxpbmVXaWRnZXQoaCksZS5vZmYoImNoYW5nZVNlbGVjdGlvbiIsaC5kZXN0cm95KSxlLm9mZigiY2hhbmdlU2Vzc2lvbiIsaC5kZXN0cm95KSxlLm9mZigibW91c2V1cCIsaC5kZXN0cm95KSxlLm9mZigiY2hhbmdlIixoLmRlc3Ryb3kpfSxlLmtleUJpbmRpbmcuYWRkS2V5Ym9hcmRIYW5kbGVyKG0pLGUub24oImNoYW5nZVNlbGVjdGlvbiIsaC5kZXN0cm95KSxlLm9uKCJjaGFuZ2VTZXNzaW9uIixoLmRlc3Ryb3kpLGUub24oIm1vdXNldXAiLGguZGVzdHJveSksZS5vbigiY2hhbmdlIixoLmRlc3Ryb3kpLGUuc2Vzc2lvbi53aWRnZXRNYW5hZ2VyLmFkZExpbmVXaWRnZXQoaCksaC5lbC5vbm1vdXNlZG93bj1lLmZvY3VzLmJpbmQoZSksZS5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyhudWxsLC41LHtib3R0b206aC5lbC5vZmZzZXRIZWlnaHR9KX0saS5pbXBvcnRDc3NTdHJpbmcoIiAgICAuZXJyb3Jfd2lkZ2V0X3dyYXBwZXIgeyAgICAgICAgYmFja2dyb3VuZDogaW5oZXJpdDsgICAgICAgIGNvbG9yOiBpbmhlcml0OyAgICAgICAgYm9yZGVyOm5vbmUgICAgfSAgICAuZXJyb3Jfd2lkZ2V0IHsgICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDJweDsgICAgICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDJweDsgICAgICAgIG1hcmdpbjogNXB4IDA7ICAgICAgICBwYWRkaW5nOiAxMHB4IDQwcHg7ICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7ICAgIH0gICAgLmVycm9yX3dpZGdldC5hY2VfZXJyb3IsIC5lcnJvcl93aWRnZXRfYXJyb3cuYWNlX2Vycm9yeyAgICAgICAgYm9yZGVyLWNvbG9yOiAjZmY1YTVhICAgIH0gICAgLmVycm9yX3dpZGdldC5hY2Vfd2FybmluZywgLmVycm9yX3dpZGdldF9hcnJvdy5hY2Vfd2FybmluZ3sgICAgICAgIGJvcmRlci1jb2xvcjogI0YxRDgxNyAgICB9ICAgIC5lcnJvcl93aWRnZXQuYWNlX2luZm8sIC5lcnJvcl93aWRnZXRfYXJyb3cuYWNlX2luZm97ICAgICAgICBib3JkZXItY29sb3I6ICM1YTVhNWEgICAgfSAgICAuZXJyb3Jfd2lkZ2V0LmFjZV9vaywgLmVycm9yX3dpZGdldF9hcnJvdy5hY2Vfb2t7ICAgICAgICBib3JkZXItY29sb3I6ICM1YWFhNWEgICAgfSAgICAuZXJyb3Jfd2lkZ2V0X2Fycm93IHsgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgICAgICAgIGJvcmRlcjogc29saWQgNXB4OyAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQhaW1wb3J0YW50OyAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudCFpbXBvcnRhbnQ7ICAgICAgICBib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQhaW1wb3J0YW50OyAgICAgICAgdG9wOiAtNXB4OyAgICB9IiwiIil9KSxhY2UuZGVmaW5lKCJhY2UvYWNlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9maXhvbGRicm93c2VycyIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9ldmVudCIsImFjZS9yYW5nZSIsImFjZS9lZGl0b3IiLCJhY2UvZWRpdF9zZXNzaW9uIiwiYWNlL3VuZG9tYW5hZ2VyIiwiYWNlL3ZpcnR1YWxfcmVuZGVyZXIiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2Uva2V5Ym9hcmQvaGFzaF9oYW5kbGVyIiwiYWNlL3BsYWNlaG9sZGVyIiwiYWNlL211bHRpX3NlbGVjdCIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIiwiYWNlL3RoZW1lL3RleHRtYXRlIiwiYWNlL2V4dC9lcnJvcl9tYXJrZXIiLCJhY2UvY29uZmlnIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlKCIuL2xpYi9maXhvbGRicm93c2VycyIpO3ZhciByPWUoIi4vbGliL2RvbSIpLGk9ZSgiLi9saWIvZXZlbnQiKSxzPWUoIi4vcmFuZ2UiKS5SYW5nZSxvPWUoIi4vZWRpdG9yIikuRWRpdG9yLHU9ZSgiLi9lZGl0X3Nlc3Npb24iKS5FZGl0U2Vzc2lvbixhPWUoIi4vdW5kb21hbmFnZXIiKS5VbmRvTWFuYWdlcixmPWUoIi4vdmlydHVhbF9yZW5kZXJlciIpLlZpcnR1YWxSZW5kZXJlcjtlKCIuL3dvcmtlci93b3JrZXJfY2xpZW50IiksZSgiLi9rZXlib2FyZC9oYXNoX2hhbmRsZXIiKSxlKCIuL3BsYWNlaG9sZGVyIiksZSgiLi9tdWx0aV9zZWxlY3QiKSxlKCIuL21vZGUvZm9sZGluZy9mb2xkX21vZGUiKSxlKCIuL3RoZW1lL3RleHRtYXRlIiksZSgiLi9leHQvZXJyb3JfbWFya2VyIiksdC5jb25maWc9ZSgiLi9jb25maWciKSx0LnJlcXVpcmU9ZSx0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiYodC5kZWZpbmU9ZGVmaW5lKSx0LmVkaXQ9ZnVuY3Rpb24oZSxuKXtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBzPWU7ZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChzKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoImFjZS5lZGl0IGNhbid0IGZpbmQgZGl2ICMiK3MpfWlmKGUmJmUuZW52JiZlLmVudi5lZGl0b3IgaW5zdGFuY2VvZiBvKXJldHVybiBlLmVudi5lZGl0b3I7dmFyIHU9IiI7aWYoZSYmL2lucHV0fHRleHRhcmVhL2kudGVzdChlLnRhZ05hbWUpKXt2YXIgYT1lO3U9YS52YWx1ZSxlPXIuY3JlYXRlRWxlbWVudCgicHJlIiksYS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLGEpfWVsc2UgZSYmKHU9ZS50ZXh0Q29udGVudCxlLmlubmVySFRNTD0iIik7dmFyIGw9dC5jcmVhdGVFZGl0U2Vzc2lvbih1KSxjPW5ldyBvKG5ldyBmKGUpLGwsbiksaD17ZG9jdW1lbnQ6bCxlZGl0b3I6YyxvblJlc2l6ZTpjLnJlc2l6ZS5iaW5kKGMsbnVsbCl9O3JldHVybiBhJiYoaC50ZXh0YXJlYT1hKSxpLmFkZExpc3RlbmVyKHdpbmRvdywicmVzaXplIixoLm9uUmVzaXplKSxjLm9uKCJkZXN0cm95IixmdW5jdGlvbigpe2kucmVtb3ZlTGlzdGVuZXIod2luZG93LCJyZXNpemUiLGgub25SZXNpemUpLGguZWRpdG9yLmNvbnRhaW5lci5lbnY9bnVsbH0pLGMuY29udGFpbmVyLmVudj1jLmVudj1oLGN9LHQuY3JlYXRlRWRpdFNlc3Npb249ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgdShlLHQpO3JldHVybiBuLnNldFVuZG9NYW5hZ2VyKG5ldyBhKSxufSx0LlJhbmdlPXMsdC5FZGl0b3I9byx0LkVkaXRTZXNzaW9uPXUsdC5VbmRvTWFuYWdlcj1hLHQuVmlydHVhbFJlbmRlcmVyPWYsdC52ZXJzaW9uPXQuY29uZmlnLnZlcnNpb259KTsgICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBhY2UucmVxdWlyZShbImFjZS9hY2UiXSwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIGlmIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuY29uZmlnLmluaXQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuZGVmaW5lID0gYWNlLmRlZmluZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuYWNlKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlID0gYTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYSkgaWYgKGEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZVtrZXldID0gYVtrZXldOwogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2VbImRlZmF1bHQiXSA9IHdpbmRvdy5hY2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIgJiYgdHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgbW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gd2luZG93LmFjZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoKTsKfTsKCtC80YPRgNC+0Lwu0LfQsNCz0YDRg9C30LjRgtGM0KDQtdC20LjQvEFDRUpTID0gZnVuY3Rpb24oKQp7CiAgICAvLyDQoNC10LbQuNC8IEphdmFTY3JpcHQg0LTQu9GPIEFDRS4KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hamF4b3JnL2FjZS1idWlsZHMvYmxvYi9tYXN0ZXIvc3JjLW1pbi1ub2NvbmZsaWN0L21vZGUtamF2YXNjcmlwdC5qcwphY2UuZGVmaW5lKCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvb29wIiksaT1lKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLHM9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudC5kb2MudGFnIixyZWdleDoiQFtcXHdcXGRfXSsifSxzLmdldFRhZ1J1bGUoKSx7ZGVmYXVsdFRva2VuOiJjb21tZW50LmRvYyIsY2FzZUluc2Vuc2l0aXZlOiEwfV19fTtyLmluaGVyaXRzKHMsaSkscy5nZXRUYWdSdWxlPWZ1bmN0aW9uKGUpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MudGFnLnN0b3JhZ2UudHlwZSIscmVnZXg6IlxcYig/OlRPRE98RklYTUV8WFhYfEhBQ0spXFxiIn19LHMuZ2V0U3RhcnRSdWxlPWZ1bmN0aW9uKGUpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLHJlZ2V4OiJcXC9cXCooPz1cXCopIixuZXh0OmV9fSxzLmdldEVuZFJ1bGU9ZnVuY3Rpb24oZSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIscmVnZXg6IlxcKlxcLyIsbmV4dDplfX0sdC5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9c30pLGFjZS5kZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYSgpe3ZhciBlPW8ucmVwbGFjZSgiXFxkIiwiXFxkXFwtIiksdD17b25NYXRjaDpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5jaGFyQXQoMSk9PSIvIj8yOjE7aWYocj09MSl0IT10aGlzLm5leHRTdGF0ZT9uLnVuc2hpZnQodGhpcy5uZXh0LHRoaXMubmV4dFN0YXRlLDApOm4udW5zaGlmdCh0aGlzLm5leHQpLG5bMl0rKztlbHNlIGlmKHI9PTImJnQ9PXRoaXMubmV4dFN0YXRlKXtuWzFdLS07aWYoIW5bMV18fG5bMV08MCluLnNoaWZ0KCksbi5zaGlmdCgpfXJldHVyblt7dHlwZToibWV0YS50YWcucHVuY3R1YXRpb24uIisocj09MT8iIjoiZW5kLSIpKyJ0YWctb3Blbi54bWwiLHZhbHVlOmUuc2xpY2UoMCxyKX0se3R5cGU6Im1ldGEudGFnLnRhZy1uYW1lLnhtbCIsdmFsdWU6ZS5zdWJzdHIocil9XX0scmVnZXg6IjwvPyIrZSsiIixuZXh0OiJqc3hBdHRyaWJ1dGVzIixuZXh0U3RhdGU6ImpzeCJ9O3RoaXMuJHJ1bGVzLnN0YXJ0LnVuc2hpZnQodCk7dmFyIG49e3JlZ2V4OiJ7Iix0b2tlbjoicGFyZW4ucXVhc2kuc3RhcnQiLHB1c2g6InN0YXJ0In07dGhpcy4kcnVsZXMuanN4PVtuLHQse2luY2x1ZGU6InJlZmVyZW5jZSJ9LHtkZWZhdWx0VG9rZW46InN0cmluZyJ9XSx0aGlzLiRydWxlcy5qc3hBdHRyaWJ1dGVzPVt7dG9rZW46Im1ldGEudGFnLnB1bmN0dWF0aW9uLnRhZy1jbG9zZS54bWwiLHJlZ2V4OiIvPz4iLG9uTWF0Y2g6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PT1uWzBdJiZuLnNoaWZ0KCksZS5sZW5ndGg9PTImJihuWzBdPT10aGlzLm5leHRTdGF0ZSYmblsxXS0tLCghblsxXXx8blsxXTwwKSYmbi5zcGxpY2UoMCwyKSksdGhpcy5uZXh0PW5bMF18fCJzdGFydCIsW3t0eXBlOnRoaXMudG9rZW4sdmFsdWU6ZX1dfSxuZXh0U3RhdGU6ImpzeCJ9LG4sZigianN4QXR0cmlidXRlcyIpLHt0b2tlbjoiZW50aXR5Lm90aGVyLmF0dHJpYnV0ZS1uYW1lLnhtbCIscmVnZXg6ZX0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yLmF0dHJpYnV0ZS1lcXVhbHMueG1sIixyZWdleDoiPSJ9LHt0b2tlbjoidGV4dC50YWctd2hpdGVzcGFjZS54bWwiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCIscmVnZXg6IiciLHN0YXRlTmFtZToianN4X2F0dHJfcSIscHVzaDpbe3Rva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCIscmVnZXg6IiciLG5leHQ6InBvcCJ9LHtpbmNsdWRlOiJyZWZlcmVuY2UifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCJ9XX0se3Rva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCIscmVnZXg6JyInLHN0YXRlTmFtZToianN4X2F0dHJfcXEiLHB1c2g6W3t0b2tlbjoic3RyaW5nLmF0dHJpYnV0ZS12YWx1ZS54bWwiLHJlZ2V4OiciJyxuZXh0OiJwb3AifSx7aW5jbHVkZToicmVmZXJlbmNlIn0se2RlZmF1bHRUb2tlbjoic3RyaW5nLmF0dHJpYnV0ZS12YWx1ZS54bWwifV19LHRdLHRoaXMuJHJ1bGVzLnJlZmVyZW5jZT1be3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUucmVmZXJlbmNlLnhtbCIscmVnZXg6Iig/OiYjWzAtOV0rOyl8KD86JiN4WzAtOWEtZkEtRl0rOyl8KD86JlthLXpBLVowLTlfOlxcLi1dKzspIn1dfWZ1bmN0aW9uIGYoZSl7cmV0dXJuW3t0b2tlbjoiY29tbWVudCIscmVnZXg6L1wvXCovLG5leHQ6W2kuZ2V0VGFnUnVsZSgpLHt0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcKlxcLyIsbmV4dDplfHwicG9wIn0se2RlZmF1bHRUb2tlbjoiY29tbWVudCIsY2FzZUluc2Vuc2l0aXZlOiEwfV19LHt0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLyIsbmV4dDpbaS5nZXRUYWdSdWxlKCkse3Rva2VuOiJjb21tZW50IixyZWdleDoiJHxeIixuZXh0OmV8fCJwb3AifSx7ZGVmYXVsdFRva2VuOiJjb21tZW50IixjYXNlSW5zZW5zaXRpdmU6ITB9XX1dfXZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLHM9ZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxvPSJbYS16QS1aXFwkX1x1MDBhMS1cdWZmZmZdW2EtekEtWlxcZFxcJF9cdTAwYTEtXHVmZmZmXSoiLHU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jcmVhdGVLZXl3b3JkTWFwcGVyKHsidmFyaWFibGUubGFuZ3VhZ2UiOiJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fE5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHxBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8VWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXxFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258U3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfGRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfGlzTmFOfHBhcnNlRmxvYXR8cGFyc2VJbnR8SlNPTnxNYXRofHRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiLGtleXdvcmQ6ImNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0fGFzeW5jfGF3YWl0fGJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnxpZnxpbnxvZnxpbnN0YW5jZW9mfG5ld3xyZXR1cm58c3dpdGNofHRocm93fHRyeXx0eXBlb2Z8bGV0fHZhcnx3aGlsZXx3aXRofGRlYnVnZ2VyfF9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fX3xjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXxwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIsInN0b3JhZ2UudHlwZSI6ImNvbnN0fGxldHx2YXJ8ZnVuY3Rpb24iLCJjb25zdGFudC5sYW5ndWFnZSI6Im51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIsInN1cHBvcnQuZnVuY3Rpb24iOiJhbGVydCIsImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iOiJ0cnVlfGZhbHNlIn0sImlkZW50aWZpZXIiKSxuPSJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkfHZvaWQiLHI9IlxcXFwoPzp4WzAtOWEtZkEtRl17Mn18dVswLTlhLWZBLUZdezR9fHV7WzAtOWEtZkEtRl17MSw2fX18WzAtMl1bMC03XXswLDJ9fDNbMC03XVswLTddP3xbNC03XVswLTddP3wuKSI7dGhpcy4kcnVsZXM9e25vX3JlZ2V4OltpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksZigibm9fcmVnZXgiKSx7dG9rZW46InN0cmluZyIscmVnZXg6IicoPz0uKSIsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonIig/PS4pJyxuZXh0OiJxcXN0cmluZyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6LzAoPzpbeFhdWzAtOWEtZkEtRl0rfFtvT11bMC03XSt8W2JCXVswMV0rKVxiL30se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDovKD86XGRcZCooPzpcLlxkKik/fFwuXGQrKSg/OltlRV1bKy1dP1xkK1xiKT8vfSx7dG9rZW46WyJzdG9yYWdlLnR5cGUiLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsInN1cHBvcnQuZnVuY3Rpb24iLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsImtleXdvcmQub3BlcmF0b3IiXSxyZWdleDoiKCIrbysiKShcXC4pKHByb3RvdHlwZSkoXFwuKSgiK28rIikoXFxzKikoPSkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjpbInN0b3JhZ2UudHlwZSIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0Iiwia2V5d29yZC5vcGVyYXRvciIsInRleHQiLCJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6IigiK28rIikoXFwuKSgiK28rIikoXFxzKikoPSkoXFxzKikoZnVuY3Rpb24pKFxccyopKFxcKCkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjpbImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsImtleXdvcmQub3BlcmF0b3IiLCJ0ZXh0Iiwic3RvcmFnZS50eXBlIiwidGV4dCIsInBhcmVuLmxwYXJlbiJdLHJlZ2V4OiIoIitvKyIpKFxccyopKD0pKFxccyopKGZ1bmN0aW9uKShcXHMqKShcXCgpIixuZXh0OiJmdW5jdGlvbl9hcmd1bWVudHMifSx7dG9rZW46WyJzdG9yYWdlLnR5cGUiLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsImtleXdvcmQub3BlcmF0b3IiLCJ0ZXh0Iiwic3RvcmFnZS50eXBlIiwidGV4dCIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsInBhcmVuLmxwYXJlbiJdLHJlZ2V4OiIoIitvKyIpKFxcLikoIitvKyIpKFxccyopKD0pKFxccyopKGZ1bmN0aW9uKShcXHMrKShcXHcrKShcXHMqKShcXCgpIixuZXh0OiJmdW5jdGlvbl9hcmd1bWVudHMifSx7dG9rZW46WyJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6IihmdW5jdGlvbikoXFxzKykoIitvKyIpKFxccyopKFxcKCkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjpbImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwidGV4dCIsInN0b3JhZ2UudHlwZSIsInRleHQiLCJwYXJlbi5scGFyZW4iXSxyZWdleDoiKCIrbysiKShcXHMqKSg6KShcXHMqKShmdW5jdGlvbikoXFxzKikoXFwoKSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOlsidGV4dCIsInRleHQiLCJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6Iig6KShcXHMqKShmdW5jdGlvbikoXFxzKikoXFwoKSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiZnJvbSg/PVxccyooJ3xcIikpIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiKD86IituKyIpXFxiIixuZXh0OiJzdGFydCJ9LHt0b2tlbjpbInN1cHBvcnQuY29uc3RhbnQiXSxyZWdleDovdGhhdFxiL30se3Rva2VuOlsic3RvcmFnZS50eXBlIiwicHVuY3R1YXRpb24ub3BlcmF0b3IiLCJzdXBwb3J0LmZ1bmN0aW9uLmZpcmVidWciXSxyZWdleDovKGNvbnNvbGUpKFwuKSh3YXJufGluZm98bG9nfGVycm9yfHRpbWV8dHJhY2V8dGltZUVuZHxhc3NlcnQpXGIvfSx7dG9rZW46dCxyZWdleDpvfSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDovWy5dKD8hWy5dKS8sbmV4dDoicHJvcGVydHkifSx7dG9rZW46InN0b3JhZ2UudHlwZSIscmVnZXg6Lz0+LyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6Ly0tfFwrXCt8XC57M318PT09fD09fD18IT18IT09fDwrPT98Pis9P3whfCYmfFx8XHx8XD86fFshJCUmKitcLX5cL15dPT8vLG5leHQ6InN0YXJ0In0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6L1s/Oiw7Ll0vLG5leHQ6InN0YXJ0In0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4Oi9bXFsoe10vLG5leHQ6InN0YXJ0In0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4Oi9bXF0pfV0vfSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4Oi9eIyEuKiQvfV0scHJvcGVydHk6W3t0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46WyJzdG9yYWdlLnR5cGUiLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsImtleXdvcmQub3BlcmF0b3IiLCJ0ZXh0Iiwic3RvcmFnZS50eXBlIiwidGV4dCIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsInBhcmVuLmxwYXJlbiJdLHJlZ2V4OiIoIitvKyIpKFxcLikoIitvKyIpKFxccyopKD0pKFxccyopKGZ1bmN0aW9uKSg/OihcXHMrKShcXHcrKSk/KFxccyopKFxcKCkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjoicHVuY3R1YXRpb24ub3BlcmF0b3IiLHJlZ2V4Oi9bLl0oPyFbLl0pL30se3Rva2VuOiJzdXBwb3J0LmZ1bmN0aW9uIixyZWdleDovKHMoPzpoKD86aWZ0fG93KD86TW9kKD86ZWxlc3NEaWFsb2d8YWxEaWFsb2cpfEhlbHApKXxjcm9sbCg/Olh8QnkoPzpQYWdlc3xMaW5lcyk/fFl8VG8pP3x0KD86b3B8cmlrZSl8aSg/Om58emVUb0NvbnRlbnR8ZGViYXJ8Z25UZXh0KXxvcnR8dSg/OnB8Yig/OnN0cig/OmluZyk/KT8pfHBsaSg/OmNlfHQpfGUoPzpuZHx0KD86UmUoPzpzaXphYmxlfHF1ZXN0SGVhZGVyKXxNKD86aSg/Om51dGVzfGxsaXNlY29uZHMpfG9udGgpfFNlY29uZHN8SG8oPzp0S2V5c3x1cnMpfFllYXJ8Q3Vyc29yfFRpbWUoPzpvdXQpP3xJbnRlcnZhbHxaT3B0aW9uc3xEYXRlfFVUQyg/Ok0oPzppKD86bnV0ZXN8bGxpc2Vjb25kcyl8b250aCl8U2Vjb25kc3xIb3Vyc3xEYXRlfEZ1bGxZZWFyKXxGdWxsWWVhcnxBY3RpdmUpfGFyY2gpfHFydHxsaWNlfGF2ZVByZWZlcmVuY2VzfG1hbGwpfGgoPzpvbWV8YW5kbGVFdmVudCl8bmF2aWdhdGV8Yyg/Omhhcig/OkNvZGVBdHxBdCl8byg/OnN8big/OmNhdHx0ZXh0dWFsfGZpcm0pfG1waWxlKXxlaWx8bGVhcig/OlRpbWVvdXR8SW50ZXJ2YWwpP3xhKD86cHR1cmVFdmVudHN8bGwpfHJlYXRlKD86U3R5bGVTaGVldHxQb3B1cHxFdmVudE9iamVjdCkpfHQoPzpvKD86R01UU3RyaW5nfFMoPzp0cmluZ3xvdXJjZSl8VSg/OlRDU3RyaW5nfHBwZXJDYXNlKXxMbyg/OmNhbGVTdHJpbmd8d2VyQ2FzZSkpfGVzdHxhKD86bnxpbnQoPzpFbmFibGVkKT8pKXxpKD86cyg/Ok5hTnxGaW5pdGUpfG5kZXhPZnx0YWxpY3MpfGQoPzppc2FibGVFeHRlcm5hbENhcHR1cmV8dW1wfGV0YWNoRXZlbnQpfHUoPzpuKD86c2hpZnR8dGFpbnR8ZXNjYXBlfHdhdGNoKXxwZGF0ZUNvbW1hbmRzKXxqKD86b2lufGF2YUVuYWJsZWQpfHAoPzpvKD86cHx3KXx1c2h8bHVnaW5zLnJlZnJlc2h8YSg/OmRkaW5nc3xyc2UoPzpJbnR8RmxvYXQpPyl8cig/OmludHxvbXB0fGVmZXJlbmNlKSl8ZSg/OnNjYXBlfG5hYmxlRXh0ZXJuYWxDYXB0dXJlfHZhbHxsZW1lbnRGcm9tUG9pbnR8eCg/OnB8ZWMoPzpTY3JpcHR8Q29tbWFuZCk/KSl8dmFsdWVPZnxVVEN8cXVlcnlDb21tYW5kKD86U3RhdGV8SW5kZXRlcm18RW5hYmxlZHxWYWx1ZSl8Zig/OmkoPzpuZHxsZSg/Ok1vZGlmaWVkRGF0ZXxTaXplfENyZWF0ZWREYXRlfFVwZGF0ZWREYXRlKXx4ZWQpfG8oPzpudCg/OnNpemV8Y29sb3IpfHJ3YXJkKXxsb29yfHJvbUNoYXJDb2RlKXx3YXRjaHxsKD86aW5rfG8oPzphZHxnKXxhc3RJbmRleE9mKXxhKD86c2lufG5jaG9yfGNvc3x0KD86dGFjaEV2ZW50fG9ifGFuKD86Mik/KXxwcGx5fGxlcnR8Yig/OnN8b3J0KSl8cig/Om91KD86bmR8dGVFdmVudHMpfGUoPzpzaXplKD86Qnl8VG8pfGNhbGN8dHVyblZhbHVlfHBsYWNlfHZlcnNlfGwoPzpvYWR8ZWFzZSg/OkNhcHR1cmV8RXZlbnRzKSkpfGFuZG9tKXxnKD86b3xldCg/OlJlc3BvbnNlSGVhZGVyfE0oPzppKD86bnV0ZXN8bGxpc2Vjb25kcyl8b250aCl8U2UoPzpjb25kc3xsZWN0aW9uKXxIb3Vyc3xZZWFyfFRpbWUoPzp6b25lT2Zmc2V0KT98RGEoPzp5fHRlKXxVVEMoPzpNKD86aSg/Om51dGVzfGxsaXNlY29uZHMpfG9udGgpfFNlY29uZHN8SG91cnN8RGEoPzp5fHRlKXxGdWxsWWVhcil8RnVsbFllYXJ8QSg/OnR0ZW50aW9ufGxsUmVzcG9uc2VIZWFkZXJzKSkpfG0oPzppbnxvdmUoPzpCKD86eXxlbG93KXxUbyg/OkFic29sdXRlKT98QWJvdmUpfGVyZ2VBdHRyaWJ1dGVzfGEoPzp0Y2h8cmdpbnN8eCkpfGIoPzp0b2F8aWd8byg/OmxkfHJkZXJXaWR0aHMpfGxpbmt8YWNrKSlcYig/PVwoKS99LHt0b2tlbjoic3VwcG9ydC5mdW5jdGlvbi5kb20iLHJlZ2V4Oi8ocyg/OnViKD86c3RyaW5nRGF0YXxtaXQpfHBsaXRUZXh0fGUoPzp0KD86TmFtZWRJdGVtfEF0dHJpYnV0ZSg/Ok5vZGUpPyl8bGVjdCkpfGhhcyg/OkNoaWxkTm9kZXN8RmVhdHVyZSl8bmFtZWRJdGVtfGMoPzpsKD86aWNrfG8oPzpzZXxuZU5vZGUpKXxyZWF0ZSg/OkMoPzpvbW1lbnR8REFUQVNlY3Rpb258YXB0aW9uKXxUKD86SGVhZHxleHROb2RlfEZvb3QpfERvY3VtZW50RnJhZ21lbnR8UHJvY2Vzc2luZ0luc3RydWN0aW9ufEUoPzpudGl0eVJlZmVyZW5jZXxsZW1lbnQpfEF0dHJpYnV0ZSkpfHRhYkluZGV4fGkoPzpuc2VydCg/OlJvd3xCZWZvcmV8Q2VsbHxEYXRhKXx0ZW0pfG9wZW58ZGVsZXRlKD86Um93fEMoPzplbGx8YXB0aW9uKXxUKD86SGVhZHxGb290KXxEYXRhKXxmb2N1c3x3cml0ZSg/OmxuKT98YSg/OmRkfHBwZW5kKD86Q2hpbGR8RGF0YSkpfHJlKD86c2V0fHBsYWNlKD86Q2hpbGR8RGF0YSl8bW92ZSg/Ok5hbWVkSXRlbXxDaGlsZHxBdHRyaWJ1dGUoPzpOb2RlKT8pPyl8Z2V0KD86TmFtZWRJdGVtfEVsZW1lbnQoPzpzQnkoPzpOYW1lfFRhZ05hbWV8Q2xhc3NOYW1lKXxCeUlkKXxBdHRyaWJ1dGUoPzpOb2RlKT8pfGJsdXIpXGIoPz1cKCkvfSx7dG9rZW46InN1cHBvcnQuY29uc3RhbnQiLHJlZ2V4Oi8ocyg/OnlzdGVtTGFuZ3VhZ2V8Y3IoPzppcHRzfG9sbGJhcnN8ZWVuKD86WHxZfFRvcHxMZWZ0KSl8dCg/OnlsZSg/OlNoZWV0cyk/fGF0dXMoPzpUZXh0fGJhcik/KXxpYmxpbmcoPzpCZWxvd3xBYm92ZSl8b3VyY2V8dWZmaXhlc3xlKD86Y3VyaXR5KD86UG9saWN5KT98bCg/OmVjdGlvbnxmKSkpfGgoPzppc3Rvcnl8b3N0KD86bmFtZSk/fGFzKD86aHxGb2N1cykpfHl8WCg/Ok1MRG9jdW1lbnR8U0xEb2N1bWVudCl8big/OmV4dHxhbWUoPzpzcGFjZSg/OnN8VVJJKXxQcm9wKSl8TSg/OklOX1ZBTFVFfEFYX1ZBTFVFKXxjKD86aGFyYWN0ZXJTZXR8byg/Om4oPzpzdHJ1Y3Rvcnx0cm9sbGVycyl8b2tpZUVuYWJsZWR8bG9yRGVwdGh8bXAoPzpvbmVudHN8bGV0ZSkpfHVycmVudHxwdUNsYXNzfGwoPzppKD86cCg/OmJvYXJkRGF0YSk/fGVudEluZm9ybWF0aW9uKXxvc2VkfGFzc2VzKXxhbGxlKD86ZXxyKXxyeXB0byl8dCg/Om8oPzpvbGJhcnxwKXxleHQoPzpUcmFuc2Zvcm18SW5kZW50fERlY29yYXRpb258QWxpZ24pfGFncyl8U1FSVCg/OjFfMnwyKXxpKD86big/Om5lcig/OkhlaWdodHxXaWR0aCl8cHV0KXxkc3xnbm9yZUNhc2UpfHpJbmRleHxvKD86c2NwdXxuKD86cmVhZHlzdGF0ZWNoYW5nZXxMaW5lKXx1dGVyKD86SGVpZ2h0fFdpZHRoKXxwKD86c1Byb2ZpbGV8ZW5lcil8ZmZzY3JlZW5CdWZmZXJpbmcpfE5FR0FUSVZFX0lORklOSVRZfGQoPzppKD86c3BsYXl8YWxvZyg/OkhlaWdodHxUb3B8V2lkdGh8TGVmdHxBcmd1bWVudHMpfHJlY3Rvcmllcyl8ZSg/OnNjcmlwdGlvbnxmYXVsdCg/OlN0YXR1c3xDaCg/OmVja2VkfGFyc2V0KXxWaWV3KSkpfHUoPzpzZXIoPzpQcm9maWxlfExhbmd1YWdlfEFnZW50KXxuKD86aXF1ZUlEfGRlZmluZWQpfHBkYXRlSW50ZXJ2YWwpfF9jb250ZW50fHAoPzppeGVsRGVwdGh8b3J0fGVyc29uYWxiYXJ8a2NzMTF8bCg/OnVnaW5zfGF0Zm9ybSl8YSg/OnRobmFtZXxkZGluZyg/OlJpZ2h0fEJvdHRvbXxUb3B8TGVmdCl8cmVudCg/OldpbmRvd3xMYXllcik/fGdlKD86WCg/Ok9mZnNldCk/fFkoPzpPZmZzZXQpPykpfHIoPzpvKD86dG8oPzpjb2x8dHlwZSl8ZHVjdCg/OlN1Yik/fG1wdGVyKXxlKD86dmlvdXN8Zml4KSkpfGUoPzpuKD86Y29kaW5nfGFibGVkUGx1Z2luKXx4KD86dGVybmFsfHBhbmRvKXxtYmVkcyl8dig/OmlzaWJpbGl0eXxlbmRvcig/OlN1Yik/fExpbmtjb2xvcil8VVJMVW5lbmNvZGVkfFAoPzpJfE9TSVRJVkVfSU5GSU5JVFkpfGYoPzppbGVuYW1lfG8oPzpudCg/OlNpemV8RmFtaWx5fFdlaWdodCl8cm1OYW1lKXxyYW1lKD86c3xFbGVtZW50KXxnQ29sb3IpfEV8d2hpdGVTcGFjZXxsKD86aSg/OnN0U3R5bGVUeXBlfG4oPzplSGVpZ2h0fGtDb2xvcikpfG8oPzpjYSg/OnRpb24oPzpiYXIpP3xsTmFtZSl8d3NyYyl8ZSg/Om5ndGh8ZnQoPzpDb250ZXh0KT8pfGEoPzpzdCg/Ok0oPzpvZGlmaWVkfGF0Y2gpfEluZGV4fFBhcmVuKXx5ZXIoPzpzfFgpfG5ndWFnZSkpfGEoPzpwcCg/Ok1pbm9yVmVyc2lvbnxOYW1lfENvKD86ZGVOYW1lfHJlKXxWZXJzaW9uKXx2YWlsKD86SGVpZ2h0fFRvcHxXaWR0aHxMZWZ0KXxsbHxyKD86aXR5fGd1bWVudHMpfExpbmtjb2xvcnxib3ZlKXxyKD86aWdodCg/OkNvbnRleHQpP3xlKD86c3BvbnNlKD86WE1MfFRleHQpfGFkeVN0YXRlKSl8Z2xvYmFsfHh8bSg/OmltZVR5cGVzfHVsdGlsaW5lfGVudWJhcnxhcmdpbig/OlJpZ2h0fEJvdHRvbXxUb3B8TGVmdCkpfEwoPzpOKD86MTB8Mil8T0coPzoxMEV8MkUpKXxiKD86byg/OnR0b218cmRlcig/OldpZHRofFJpZ2h0V2lkdGh8Qm90dG9tV2lkdGh8U3R5bGV8Q29sb3J8VG9wV2lkdGh8TGVmdFdpZHRoKSl8dWZmZXJEZXB0aHxlbG93fGFja2dyb3VuZCg/OkNvbG9yfEltYWdlKSkpXGIvfSx7dG9rZW46ImlkZW50aWZpZXIiLHJlZ2V4Om99LHtyZWdleDoiIix0b2tlbjoiZW1wdHkiLG5leHQ6Im5vX3JlZ2V4In1dLHN0YXJ0OltpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksZigic3RhcnQiKSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJcXC8iLG5leHQ6InJlZ2V4In0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzK3xeJCIsbmV4dDoic3RhcnQifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJub19yZWdleCJ9XSxyZWdleDpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiL1tzeG5naW15XSoiLG5leHQ6Im5vX3JlZ2V4In0se3Rva2VuOiJpbnZhbGlkIixyZWdleDovXHtcZCtcYiw/XGQqXH1bKypdfFsrKiReP11bKypdfFskXl1bP118XD97Myx9L30se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4Oi9cKFw/Wzo9IV18XCl8XHtcZCtcYiw/XGQqXH18WysqXVw/fFsoKSReKyo/Ll0vfSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmRlbGltaXRlciIscmVnZXg6L1x8L30se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4Oi9cW1xePy8sbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIn0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiQiLG5leHQ6Im5vX3JlZ2V4In0se2RlZmF1bHRUb2tlbjoic3RyaW5nLnJlZ2V4cCJ9XSxyZWdleF9jaGFyYWN0ZXJfY2xhc3M6W3t0b2tlbjoicmVnZXhwLmNoYXJjbGFzcy5rZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6Il0iLG5leHQ6InJlZ2V4In0se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4OiItIn0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiQiLG5leHQ6Im5vX3JlZ2V4In0se2RlZmF1bHRUb2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MifV0sZnVuY3Rpb25fYXJndW1lbnRzOlt7dG9rZW46InZhcmlhYmxlLnBhcmFtZXRlciIscmVnZXg6b30se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IlssIF0rIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IiQifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJub19yZWdleCJ9XSxxcXN0cmluZzpbe3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4OnJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFxcXCQiLGNvbnN1bWVMaW5lRW5kOiEwfSx7dG9rZW46InN0cmluZyIscmVnZXg6JyJ8JCcsbmV4dDoibm9fcmVnZXgifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcifV0scXN0cmluZzpbe3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4OnJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFxcXCQiLGNvbnN1bWVMaW5lRW5kOiEwfSx7dG9rZW46InN0cmluZyIscmVnZXg6Iid8JCIsbmV4dDoibm9fcmVnZXgifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcifV19O2lmKCFlfHwhZS5ub0VTNil0aGlzLiRydWxlcy5ub19yZWdleC51bnNoaWZ0KHtyZWdleDoiW3t9XSIsb25NYXRjaDpmdW5jdGlvbihlLHQsbil7dGhpcy5uZXh0PWU9PSJ7Ij90aGlzLm5leHRTdGF0ZToiIjtpZihlPT0ieyImJm4ubGVuZ3RoKW4udW5zaGlmdCgic3RhcnQiLHQpO2Vsc2UgaWYoZT09In0iJiZuLmxlbmd0aCl7bi5zaGlmdCgpLHRoaXMubmV4dD1uLnNoaWZ0KCk7aWYodGhpcy5uZXh0LmluZGV4T2YoInN0cmluZyIpIT0tMXx8dGhpcy5uZXh0LmluZGV4T2YoImpzeCIpIT0tMSlyZXR1cm4icGFyZW4ucXVhc2kuZW5kIn1yZXR1cm4gZT09InsiPyJwYXJlbi5scGFyZW4iOiJwYXJlbi5ycGFyZW4ifSxuZXh0U3RhdGU6InN0YXJ0In0se3Rva2VuOiJzdHJpbmcucXVhc2kuc3RhcnQiLHJlZ2V4Oi9gLyxwdXNoOlt7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6cn0se3Rva2VuOiJwYXJlbi5xdWFzaS5zdGFydCIscmVnZXg6L1wkey8scHVzaDoic3RhcnQifSx7dG9rZW46InN0cmluZy5xdWFzaS5lbmQiLHJlZ2V4Oi9gLyxuZXh0OiJwb3AifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcucXVhc2kifV19KSwoIWV8fGUuanN4IT0wKSYmYS5jYWxsKHRoaXMpO3RoaXMuZW1iZWRSdWxlcyhpLCJkb2MtIixbaS5nZXRFbmRSdWxlKCJub19yZWdleCIpXSksdGhpcy5ub3JtYWxpemVSdWxlcygpfTtyLmluaGVyaXRzKHUscyksdC5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM9dX0pLGFjZS5kZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL3JhbmdlIikuUmFuZ2UsaT1mdW5jdGlvbigpe307KGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4vXlxzKyQvLnRlc3QoZSk/L15ccypcfS8udGVzdCh0KTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZ2V0TGluZSh0KSxpPW4ubWF0Y2goL14oXHMqXH0pLyk7aWYoIWkpcmV0dXJuIDA7dmFyIHM9aVsxXS5sZW5ndGgsbz1lLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzp0LGNvbHVtbjpzfSk7aWYoIW98fG8ucm93PT10KXJldHVybiAwO3ZhciB1PXRoaXMuJGdldEluZGVudChlLmdldExpbmUoby5yb3cpKTtlLnJlcGxhY2UobmV3IHIodCwwLHQscy0xKSx1KX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlLm1hdGNoKC9eXHMqLylbMF19fSkuY2FsbChpLnByb3RvdHlwZSksdC5NYXRjaGluZ0JyYWNlT3V0ZGVudD1pfSksYWNlLmRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi8uLi9saWIvb29wIiksaT1lKCIuLi8uLi9yYW5nZSIpLlJhbmdlLHM9ZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxvPXQuRm9sZE1vZGU9ZnVuY3Rpb24oZSl7ZSYmKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW5ldyBSZWdFeHAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIuc291cmNlLnJlcGxhY2UoL1x8W158XSo/JC8sInwiK2Uuc3RhcnQpKSx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPW5ldyBSZWdFeHAodGhpcy5mb2xkaW5nU3RvcE1hcmtlci5zb3VyY2UucmVwbGFjZSgvXHxbXnxdKj8kLywifCIrZS5lbmQpKSl9O3IuaW5oZXJpdHMobyxzKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPS8oW1x7XFtcKF0pW15cfVxdXCldKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce1woXSooW1x9XF1cKV0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLnNpbmdsZUxpbmVCbG9ja0NvbW1lbnRSZT0vXlxzKihcL1wqKS4qXCpcL1xzKiQvLHRoaXMudHJpcGxlU3RhckJsb2NrQ29tbWVudFJlPS9eXHMqKFwvXCpcKlwqKS4qXCpcL1xzKiQvLHRoaXMuc3RhcnRSZWdpb25SZT0vXlxzKihcL1wqfFwvXC8pIz9yZWdpb25cYi8sdGhpcy5fZ2V0Rm9sZFdpZGdldEJhc2U9dGhpcy5nZXRGb2xkV2lkZ2V0LHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXRMaW5lKG4pO2lmKHRoaXMuc2luZ2xlTGluZUJsb2NrQ29tbWVudFJlLnRlc3QocikmJiF0aGlzLnN0YXJ0UmVnaW9uUmUudGVzdChyKSYmIXRoaXMudHJpcGxlU3RhckJsb2NrQ29tbWVudFJlLnRlc3QocikpcmV0dXJuIiI7dmFyIGk9dGhpcy5fZ2V0Rm9sZFdpZGdldEJhc2UoZSx0LG4pO3JldHVybiFpJiZ0aGlzLnN0YXJ0UmVnaW9uUmUudGVzdChyKT8ic3RhcnQiOml9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUuZ2V0TGluZShuKTtpZih0aGlzLnN0YXJ0UmVnaW9uUmUudGVzdChpKSlyZXR1cm4gdGhpcy5nZXRDb21tZW50UmVnaW9uQmxvY2soZSxpLG4pO3ZhciBzPWkubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKHMpe3ZhciBvPXMuaW5kZXg7aWYoc1sxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGUsc1sxXSxuLG8pO3ZhciB1PWUuZ2V0Q29tbWVudEZvbGRSYW5nZShuLG8rc1swXS5sZW5ndGgsMSk7cmV0dXJuIHUmJiF1LmlzTXVsdGlMaW5lKCkmJihyP3U9dGhpcy5nZXRTZWN0aW9uUmFuZ2UoZSxuKTp0IT0iYWxsIiYmKHU9bnVsbCkpLHV9aWYodD09PSJtYXJrYmVnaW4iKXJldHVybjt2YXIgcz1pLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpO2lmKHMpe3ZhciBvPXMuaW5kZXgrc1swXS5sZW5ndGg7cmV0dXJuIHNbMV0/dGhpcy5jbG9zaW5nQnJhY2tldEJsb2NrKGUsc1sxXSxuLG8pOmUuZ2V0Q29tbWVudEZvbGRSYW5nZShuLG8sLTEpfX0sdGhpcy5nZXRTZWN0aW9uUmFuZ2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldExpbmUodCkscj1uLnNlYXJjaCgvXFMvKSxzPXQsbz1uLmxlbmd0aDt0Kz0xO3ZhciB1PXQsYT1lLmdldExlbmd0aCgpO3doaWxlKCsrdDxhKXtuPWUuZ2V0TGluZSh0KTt2YXIgZj1uLnNlYXJjaCgvXFMvKTtpZihmPT09LTEpY29udGludWU7aWYocj5mKWJyZWFrO3ZhciBsPXRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlKGUsImFsbCIsdCk7aWYobCl7aWYobC5zdGFydC5yb3c8PXMpYnJlYWs7aWYobC5pc011bHRpTGluZSgpKXQ9bC5lbmQucm93O2Vsc2UgaWYocj09ZilicmVha311PXR9cmV0dXJuIG5ldyBpKHMsbyx1LGUuZ2V0TGluZSh1KS5sZW5ndGgpfSx0aGlzLmdldENvbW1lbnRSZWdpb25CbG9jaz1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5zZWFyY2goL1xzKiQvKSxzPWUuZ2V0TGVuZ3RoKCksbz1uLHU9L15ccyooPzpcL1wqfFwvXC98LS0pIz8oZW5kKT9yZWdpb25cYi8sYT0xO3doaWxlKCsrbjxzKXt0PWUuZ2V0TGluZShuKTt2YXIgZj11LmV4ZWModCk7aWYoIWYpY29udGludWU7ZlsxXT9hLS06YSsrO2lmKCFhKWJyZWFrfXZhciBsPW47aWYobD5vKXJldHVybiBuZXcgaShvLHIsbCx0Lmxlbmd0aCl9fS5jYWxsKG8ucHJvdG90eXBlKX0pLGFjZS5kZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIiwiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4vdGV4dCIpLk1vZGUscz1lKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLG89ZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsdT1lKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxhPWUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixmPWUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxsPWZ1bmN0aW9uKCl7dGhpcy5IaWdobGlnaHRSdWxlcz1zLHRoaXMuJG91dGRlbnQ9bmV3IG8sdGhpcy4kYmVoYXZpb3VyPW5ldyBhLHRoaXMuZm9sZGluZ1J1bGVzPW5ldyBmfTtyLmluaGVyaXRzKGwsaSksZnVuY3Rpb24oKXt0aGlzLmxpbmVDb21tZW50U3RhcnQ9Ii8vIix0aGlzLmJsb2NrQ29tbWVudD17c3RhcnQ6Ii8qIixlbmQ6IiovIn0sdGhpcy4kcXVvdGVzPXsnIic6JyInLCInIjoiJyIsImAiOiJgIn0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy4kZ2V0SW5kZW50KHQpLGk9dGhpcy5nZXRUb2tlbml6ZXIoKS5nZXRMaW5lVG9rZW5zKHQsZSkscz1pLnRva2VucyxvPWkuc3RhdGU7aWYocy5sZW5ndGgmJnNbcy5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiByO2lmKGU9PSJzdGFydCJ8fGU9PSJub19yZWdleCIpe3ZhciB1PXQubWF0Y2goL14uKig/OlxiY2FzZVxiLio6fFtce1woXFtdKVxzKiQvKTt1JiYocis9bil9ZWxzZSBpZihlPT0iZG9jLXN0YXJ0Iil7aWYobz09InN0YXJ0Inx8bz09Im5vX3JlZ2V4IilyZXR1cm4iIjt2YXIgdT10Lm1hdGNoKC9eXHMqKFwvPylcKi8pO3UmJih1WzFdJiYocis9IiAiKSxyKz0iKiAiKX1yZXR1cm4gcn0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudCh0LG4pfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGUsdCxuKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KHQsbil9LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyB1KFsiYWNlIl0sImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwiSmF2YVNjcmlwdFdvcmtlciIpO3JldHVybiB0LmF0dGFjaFRvRG9jdW1lbnQoZS5nZXREb2N1bWVudCgpKSx0Lm9uKCJhbm5vdGF0ZSIsZnVuY3Rpb24odCl7ZS5zZXRBbm5vdGF0aW9ucyh0LmRhdGEpfSksdC5vbigidGVybWluYXRlIixmdW5jdGlvbigpe2UuY2xlYXJBbm5vdGF0aW9ucygpfSksdH0sdGhpcy4kaWQ9ImFjZS9tb2RlL2phdmFzY3JpcHQifS5jYWxsKGwucHJvdG90eXBlKSx0Lk1vZGU9bH0pOyAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgYWNlLnJlcXVpcmUoWyJhY2UvbW9kZS9qYXZhc2NyaXB0Il0sIGZ1bmN0aW9uKG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIgJiYgdHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgbW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKCk7ICAgIAp9Ow==", +{"status":true} +], + + +[ +"муром.редактор.шрифт-22", +"ZnVuY3Rpb24g0LfQsNC00LDRgtGM0KDQsNC30LzQtdGA0KjRgNC40YTRgtCw0KDQtdC00LDQutGC0L7RgNGDKCkKewogICAgaWYgKNC80YPRgNC+0Lwu0YDQtdC00LDQutGC0L7RgCkKICAgIHsKICAgICAgICDQvNGD0YDQvtC8LtGA0LXQtNCw0LrRgtC+0YAuc2V0Rm9udFNpemUoIjIycHgiKTsKICAgIH0KfQoK0LrQvtCz0LTQsCjQvNGD0YDQvtC8LtC/0YPRgdC6LCDQt9Cw0LTQsNGC0YzQoNCw0LfQvNC10YDQqNGA0LjRhNGC0LDQoNC10LTQsNC60YLQvtGA0YMpOw==", +{"status":true} +], + + [ "jquery.min.js_3.4.1", "LyohIGpRdWVyeSB2My40LjEgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lLmRvY3VtZW50P3QoZSwhMCk6ZnVuY3Rpb24oZSl7aWYoIWUuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIHQoZSl9OnQoZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKEMsZSl7InVzZSBzdHJpY3QiO3ZhciB0PVtdLEU9Qy5kb2N1bWVudCxyPU9iamVjdC5nZXRQcm90b3R5cGVPZixzPXQuc2xpY2UsZz10LmNvbmNhdCx1PXQucHVzaCxpPXQuaW5kZXhPZixuPXt9LG89bi50b1N0cmluZyx2PW4uaGFzT3duUHJvcGVydHksYT12LnRvU3RyaW5nLGw9YS5jYWxsKE9iamVjdCkseT17fSxtPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYibnVtYmVyIiE9dHlwZW9mIGUubm9kZVR5cGV9LHg9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJmU9PT1lLndpbmRvd30sYz17dHlwZTohMCxzcmM6ITAsbm9uY2U6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIGIoZSx0LG4pe3ZhciByLGksbz0obj1ufHxFKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtpZihvLnRleHQ9ZSx0KWZvcihyIGluIGMpKGk9dFtyXXx8dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKHIpKSYmby5zZXRBdHRyaWJ1dGUocixpKTtuLmhlYWQuYXBwZW5kQ2hpbGQobykucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKX1mdW5jdGlvbiB3KGUpe3JldHVybiBudWxsPT1lP2UrIiI6Im9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9uW28uY2FsbChlKV18fCJvYmplY3QiOnR5cGVvZiBlfXZhciBmPSIzLjQuMSIsaz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgay5mbi5pbml0KGUsdCl9LHA9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nO2Z1bmN0aW9uIGQoZSl7dmFyIHQ9ISFlJiYibGVuZ3RoImluIGUmJmUubGVuZ3RoLG49dyhlKTtyZXR1cm4hbShlKSYmIXgoZSkmJigiYXJyYXkiPT09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmMDx0JiZ0LTEgaW4gZSl9ay5mbj1rLnByb3RvdHlwZT17anF1ZXJ5OmYsY29uc3RydWN0b3I6ayxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHMuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3MuY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9ay5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHR9LGVhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGsuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGsubWFwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gbi5jYWxsKGUsdCxlKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2socy5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKyhlPDA/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soMDw9biYmbjx0P1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDp1LHNvcnQ6dC5zb3J0LHNwbGljZTp0LnNwbGljZX0say5leHRlbmQ9ay5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG8sYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGw9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fG0oYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW3NdKSlmb3IodCBpbiBlKXI9ZVt0XSwiX19wcm90b19fIiE9PXQmJmEhPT1yJiYobCYmciYmKGsuaXNQbGFpbk9iamVjdChyKXx8KGk9QXJyYXkuaXNBcnJheShyKSkpPyhuPWFbdF0sbz1pJiYhQXJyYXkuaXNBcnJheShuKT9bXTppfHxrLmlzUGxhaW5PYmplY3Qobik/bjp7fSxpPSExLGFbdF09ay5leHRlbmQobCxvLHIpKTp2b2lkIDAhPT1yJiYoYVt0XT1yKSk7cmV0dXJuIGF9LGsuZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhmK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKGUpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuISghZXx8IltvYmplY3QgT2JqZWN0XSIhPT1vLmNhbGwoZSkpJiYoISh0PXIoZSkpfHwiZnVuY3Rpb24iPT10eXBlb2Yobj12LmNhbGwodCwiY29uc3RydWN0b3IiKSYmdC5jb25zdHJ1Y3RvcikmJmEuY2FsbChuKT09PWwpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oZSx0KXtiKGUse25vbmNlOnQmJnQubm9uY2V9KX0sZWFjaDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MDtpZihkKGUpKXtmb3Iobj1lLmxlbmd0aDtyPG47cisrKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVha31lbHNlIGZvcihyIGluIGUpaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrO3JldHVybiBlfSx0cmltOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOihlKyIiKS5yZXBsYWNlKHAsIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgbj10fHxbXTtyZXR1cm4gbnVsbCE9ZSYmKGQoT2JqZWN0KGUpKT9rLm1lcmdlKG4sInN0cmluZyI9PXR5cGVvZiBlP1tlXTplKTp1LmNhbGwobixlKSksbn0saW5BcnJheTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PXQ/LTE6aS5jYWxsKHQsZSxuKX0sbWVyZ2U6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49K3QubGVuZ3RoLHI9MCxpPWUubGVuZ3RoO3I8bjtyKyspZVtpKytdPXRbcl07cmV0dXJuIGUubGVuZ3RoPWksZX0sZ3JlcDpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPVtdLGk9MCxvPWUubGVuZ3RoLGE9IW47aTxvO2krKykhdChlW2ldLGkpIT09YSYmci5wdXNoKGVbaV0pO3JldHVybiByfSxtYXA6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz0wLGE9W107aWYoZChlKSlmb3Iocj1lLmxlbmd0aDtvPHI7bysrKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmYS5wdXNoKGkpO2Vsc2UgZm9yKG8gaW4gZSludWxsIT0oaT10KGVbb10sbyxuKSkmJmEucHVzaChpKTtyZXR1cm4gZy5hcHBseShbXSxhKX0sZ3VpZDoxLHN1cHBvcnQ6eX0pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihrLmZuW1N5bWJvbC5pdGVyYXRvcl09dFtTeW1ib2wuaXRlcmF0b3JdKSxrLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7blsiW29iamVjdCAiK3QrIl0iXT10LnRvTG93ZXJDYXNlKCl9KTt2YXIgaD1mdW5jdGlvbihuKXt2YXIgZSxkLGIsbyxpLGgsZixnLHcsdSxsLFQsQyxhLEUsdixzLGMseSxrPSJzaXp6bGUiKzEqbmV3IERhdGUsbT1uLmRvY3VtZW50LFM9MCxyPTAscD11ZSgpLHg9dWUoKSxOPXVlKCksQT11ZSgpLEQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQmJihsPSEwKSwwfSxqPXt9Lmhhc093blByb3BlcnR5LHQ9W10scT10LnBvcCxMPXQucHVzaCxIPXQucHVzaCxPPXQuc2xpY2UsUD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpZihlW25dPT09dClyZXR1cm4gbjtyZXR1cm4tMX0sUj0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLE09IltcXHgyMFxcdFxcclxcblxcZl0iLEk9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixXPSJcXFsiK00rIiooIitJKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrSSsiKSl8KSIrTSsiKlxcXSIsJD0iOigiK0krIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK1crIikqKXwuKilcXCl8KSIsRj1uZXcgUmVnRXhwKE0rIisiLCJnIiksQj1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLF89bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSx6PW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksVT1uZXcgUmVnRXhwKE0rInw+IiksWD1uZXcgUmVnRXhwKCQpLFY9bmV3IFJlZ0V4cCgiXiIrSSsiJCIpLEc9e0lEOm5ldyBSZWdFeHAoIl4jKCIrSSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitJKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitJKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrVyksUFNFVURPOm5ldyBSZWdFeHAoIl4iKyQpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTSsiKig/OihbKy1dfCkiK00rIiooXFxkKyl8KSkiK00rIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK1IrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitNKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK00rIiooKD86LVxcZCk/XFxkKikiK00rIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L0hUTUwkL2ksUT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLEo9L15oXGQkL2ksSz0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLGVlPS9bK35dLyx0ZT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK00rIj98KCIrTSsiKXwuKSIsImlnIiksbmU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSIweCIrdC02NTUzNjtyZXR1cm4gciE9cnx8bj90OnI8MD9TdHJpbmcuZnJvbUNoYXJDb2RlKHIrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUocj4+MTB8NTUyOTYsMTAyMyZyfDU2MzIwKX0scmU9LyhbXDAtXHgxZlx4N2ZdfF4tP1xkKXxeLSR8W15cMC1ceDFmXHg3Zi1cdUZGRkZcdy1dL2csaWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8iXDAiPT09ZT8iXHVmZmZkIjplLnNsaWNlKDAsLTEpKyJcXCIrZS5jaGFyQ29kZUF0KGUubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIitlfSxvZT1mdW5jdGlvbigpe1QoKX0sYWU9YmUoZnVuY3Rpb24oZSl7cmV0dXJuITA9PT1lLmRpc2FibGVkJiYiZmllbGRzZXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e0guYXBwbHkodD1PLmNhbGwobS5jaGlsZE5vZGVzKSxtLmNoaWxkTm9kZXMpLHRbbS5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZSl7SD17YXBwbHk6dC5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtMLmFwcGx5KGUsTy5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTA7d2hpbGUoZVtuKytdPXRbcisrXSk7ZS5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gc2UodCxlLG4scil7dmFyIGksbyxhLHMsdSxsLGMsZj1lJiZlLm93bmVyRG9jdW1lbnQscD1lP2Uubm9kZVR5cGU6OTtpZihuPW58fFtdLCJzdHJpbmciIT10eXBlb2YgdHx8IXR8fDEhPT1wJiY5IT09cCYmMTEhPT1wKXJldHVybiBuO2lmKCFyJiYoKGU/ZS5vd25lckRvY3VtZW50fHxlOm0pIT09QyYmVChlKSxlPWV8fEMsRSkpe2lmKDExIT09cCYmKHU9Wi5leGVjKHQpKSlpZihpPXVbMV0pe2lmKDk9PT1wKXtpZighKGE9ZS5nZXRFbGVtZW50QnlJZChpKSkpcmV0dXJuIG47aWYoYS5pZD09PWkpcmV0dXJuIG4ucHVzaChhKSxufWVsc2UgaWYoZiYmKGE9Zi5nZXRFbGVtZW50QnlJZChpKSkmJnkoZSxhKSYmYS5pZD09PWkpcmV0dXJuIG4ucHVzaChhKSxufWVsc2V7aWYodVsyXSlyZXR1cm4gSC5hcHBseShuLGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCkpLG47aWYoKGk9dVszXSkmJmQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBILmFwcGx5KG4sZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGkpKSxufWlmKGQucXNhJiYhQVt0KyIgIl0mJighdnx8IXYudGVzdCh0KSkmJigxIT09cHx8Im9iamVjdCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKXtpZihjPXQsZj1lLDE9PT1wJiZVLnRlc3QodCkpeyhzPWUuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXMucmVwbGFjZShyZSxpZSk6ZS5zZXRBdHRyaWJ1dGUoImlkIixzPWspLG89KGw9aCh0KSkubGVuZ3RoO3doaWxlKG8tLSlsW29dPSIjIitzKyIgIit4ZShsW29dKTtjPWwuam9pbigiLCIpLGY9ZWUudGVzdCh0KSYmeWUoZS5wYXJlbnROb2RlKXx8ZX10cnl7cmV0dXJuIEguYXBwbHkobixmLnF1ZXJ5U2VsZWN0b3JBbGwoYykpLG59Y2F0Y2goZSl7QSh0LCEwKX1maW5hbGx5e3M9PT1rJiZlLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBnKHQucmVwbGFjZShCLCIkMSIpLGUsbixyKX1mdW5jdGlvbiB1ZSgpe3ZhciByPVtdO3JldHVybiBmdW5jdGlvbiBlKHQsbil7cmV0dXJuIHIucHVzaCh0KyIgIik+Yi5jYWNoZUxlbmd0aCYmZGVsZXRlIGVbci5zaGlmdCgpXSxlW3QrIiAiXT1ufX1mdW5jdGlvbiBsZShlKXtyZXR1cm4gZVtrXT0hMCxlfWZ1bmN0aW9uIGNlKGUpe3ZhciB0PUMuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTt0cnl7cmV0dXJuISFlKHQpfWNhdGNoKGUpe3JldHVybiExfWZpbmFsbHl7dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksdD1udWxsfX1mdW5jdGlvbiBmZShlLHQpe3ZhciBuPWUuc3BsaXQoInwiKSxyPW4ubGVuZ3RoO3doaWxlKHItLSliLmF0dHJIYW5kbGVbbltyXV09dH1mdW5jdGlvbiBwZShlLHQpe3ZhciBuPXQmJmUscj1uJiYxPT09ZS5ub2RlVHlwZSYmMT09PXQubm9kZVR5cGUmJmUuc291cmNlSW5kZXgtdC5zb3VyY2VJbmRleDtpZihyKXJldHVybiByO2lmKG4pd2hpbGUobj1uLm5leHRTaWJsaW5nKWlmKG49PT10KXJldHVybi0xO3JldHVybiBlPzE6LTF9ZnVuY3Rpb24gZGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJmUudHlwZT09PXR9fWZ1bmN0aW9uIGhlKG4pe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT10fHwiYnV0dG9uIj09PXQpJiZlLnR5cGU9PT1ufX1mdW5jdGlvbiBnZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImZvcm0iaW4gZT9lLnBhcmVudE5vZGUmJiExPT09ZS5kaXNhYmxlZD8ibGFiZWwiaW4gZT8ibGFiZWwiaW4gZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5kaXNhYmxlZD09PXQ6ZS5kaXNhYmxlZD09PXQ6ZS5pc0Rpc2FibGVkPT09dHx8ZS5pc0Rpc2FibGVkIT09IXQmJmFlKGUpPT09dDplLmRpc2FibGVkPT09dDoibGFiZWwiaW4gZSYmZS5kaXNhYmxlZD09PXR9fWZ1bmN0aW9uIHZlKGEpe3JldHVybiBsZShmdW5jdGlvbihvKXtyZXR1cm4gbz0rbyxsZShmdW5jdGlvbihlLHQpe3ZhciBuLHI9YShbXSxlLmxlbmd0aCxvKSxpPXIubGVuZ3RoO3doaWxlKGktLSllW249cltpXV0mJihlW25dPSEodFtuXT1lW25dKSl9KX0pfWZ1bmN0aW9uIHllKGUpe3JldHVybiBlJiYidW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmV9Zm9yKGUgaW4gZD1zZS5zdXBwb3J0PXt9LGk9c2UuaXNYTUw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5uYW1lc3BhY2VVUkksbj0oZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIVkudGVzdCh0fHxuJiZuLm5vZGVOYW1lfHwiSFRNTCIpfSxUPXNlLnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lP2Uub3duZXJEb2N1bWVudHx8ZTptO3JldHVybiByIT09QyYmOT09PXIubm9kZVR5cGUmJnIuZG9jdW1lbnRFbGVtZW50JiYoYT0oQz1yKS5kb2N1bWVudEVsZW1lbnQsRT0haShDKSxtIT09QyYmKG49Qy5kZWZhdWx0VmlldykmJm4udG9wIT09biYmKG4uYWRkRXZlbnRMaXN0ZW5lcj9uLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsb2UsITEpOm4uYXR0YWNoRXZlbnQmJm4uYXR0YWNoRXZlbnQoIm9udW5sb2FkIixvZSkpLGQuYXR0cmlidXRlcz1jZShmdW5jdGlvbihlKXtyZXR1cm4gZS5jbGFzc05hbWU9ImkiLCFlLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxkLmdldEVsZW1lbnRzQnlUYWdOYW1lPWNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKEMuY3JlYXRlQ29tbWVudCgiIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPUsudGVzdChDLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGQuZ2V0QnlJZD1jZShmdW5jdGlvbihlKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChlKS5pZD1rLCFDLmdldEVsZW1lbnRzQnlOYW1lfHwhQy5nZXRFbGVtZW50c0J5TmFtZShrKS5sZW5ndGh9KSxkLmdldEJ5SWQ/KGIuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSh0ZSxuZSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaWQiKT09PXR9fSxiLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkUpe3ZhciBuPXQuZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIG4/W25dOltdfX0pOihiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgbj1lLnJlcGxhY2UodGUsbmUpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiB0JiZ0LnZhbHVlPT09bn19LGIuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmRSl7dmFyIG4scixpLG89dC5nZXRFbGVtZW50QnlJZChlKTtpZihvKXtpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107aT10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDt3aGlsZShvPWlbcisrXSlpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb119cmV0dXJuW119fSksYi5maW5kLlRBRz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGUsdCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6ZC5xc2E/dC5xdWVyeVNlbGVjdG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sYi5maW5kLkNMQVNTPWQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmRSlyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpfSxzPVtdLHY9W10sKGQucXNhPUsudGVzdChDLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKGNlKGZ1bmN0aW9uKGUpe2EuYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPSI8YSBpZD0nIitrKyInPjwvYT48c2VsZWN0IGlkPSciK2srIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmdi5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK1IrIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitrKyItXSIpLmxlbmd0aHx8di5wdXNoKCJ+PSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHYucHVzaCgiOmNoZWNrZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitrKyIrKiIpLmxlbmd0aHx8di5wdXNoKCIuIy4rWyt+XSIpfSksY2UoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIHQ9Qy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3Quc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmdi5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZD0hMCwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnYucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx2LnB1c2goIiwuKjoiKX0pKSwoZC5tYXRjaGVzU2VsZWN0b3I9Sy50ZXN0KGM9YS5tYXRjaGVzfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEub01hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcikpJiZjZShmdW5jdGlvbihlKXtkLmRpc2Nvbm5lY3RlZE1hdGNoPWMuY2FsbChlLCIqIiksYy5jYWxsKGUsIltzIT0nJ106eCIpLHMucHVzaCgiIT0iLCQpfSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSkscz1zLmxlbmd0aCYmbmV3IFJlZ0V4cChzLmpvaW4oInwiKSksdD1LLnRlc3QoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikseT10fHxLLnRlc3QoYS5jb250YWlucyk/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxEPXQ/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gbD0hMCwwO3ZhciBuPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBufHwoMSYobj0oZS5vd25lckRvY3VtZW50fHxlKT09PSh0Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSl8fCFkLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PW4/ZT09PUN8fGUub3duZXJEb2N1bWVudD09PW0mJnkobSxlKT8tMTp0PT09Q3x8dC5vd25lckRvY3VtZW50PT09bSYmeShtLHQpPzE6dT9QKHUsZSktUCh1LHQpOjA6NCZuPy0xOjEpfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBsPSEwLDA7dmFyIG4scj0wLGk9ZS5wYXJlbnROb2RlLG89dC5wYXJlbnROb2RlLGE9W2VdLHM9W3RdO2lmKCFpfHwhbylyZXR1cm4gZT09PUM/LTE6dD09PUM/MTppPy0xOm8/MTp1P1AodSxlKS1QKHUsdCk6MDtpZihpPT09bylyZXR1cm4gcGUoZSx0KTtuPWU7d2hpbGUobj1uLnBhcmVudE5vZGUpYS51bnNoaWZ0KG4pO249dDt3aGlsZShuPW4ucGFyZW50Tm9kZSlzLnVuc2hpZnQobik7d2hpbGUoYVtyXT09PXNbcl0pcisrO3JldHVybiByP3BlKGFbcl0sc1tyXSk6YVtyXT09PW0/LTE6c1tyXT09PW0/MTowfSksQ30sc2UubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBzZShlLG51bGwsbnVsbCx0KX0sc2UubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7aWYoKGUub3duZXJEb2N1bWVudHx8ZSkhPT1DJiZUKGUpLGQubWF0Y2hlc1NlbGVjdG9yJiZFJiYhQVt0KyIgIl0mJighc3x8IXMudGVzdCh0KSkmJighdnx8IXYudGVzdCh0KSkpdHJ5e3ZhciBuPWMuY2FsbChlLHQpO2lmKG58fGQuZGlzY29ubmVjdGVkTWF0Y2h8fGUuZG9jdW1lbnQmJjExIT09ZS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gbn1jYXRjaChlKXtBKHQsITApfXJldHVybiAwPHNlKHQsQyxudWxsLFtlXSkubGVuZ3RofSxzZS5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybihlLm93bmVyRG9jdW1lbnR8fGUpIT09QyYmVChlKSx5KGUsdCl9LHNlLmF0dHI9ZnVuY3Rpb24oZSx0KXsoZS5vd25lckRvY3VtZW50fHxlKSE9PUMmJlQoZSk7dmFyIG49Yi5hdHRySGFuZGxlW3QudG9Mb3dlckNhc2UoKV0scj1uJiZqLmNhbGwoYi5hdHRySGFuZGxlLHQudG9Mb3dlckNhc2UoKSk/bihlLHQsIUUpOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09cj9yOmQuYXR0cmlidXRlc3x8IUU/ZS5nZXRBdHRyaWJ1dGUodCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSxzZS5lc2NhcGU9ZnVuY3Rpb24oZSl7cmV0dXJuKGUrIiIpLnJlcGxhY2UocmUsaWUpfSxzZS5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LHNlLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxyPTAsaT0wO2lmKGw9IWQuZGV0ZWN0RHVwbGljYXRlcyx1PSFkLnNvcnRTdGFibGUmJmUuc2xpY2UoMCksZS5zb3J0KEQpLGwpe3doaWxlKHQ9ZVtpKytdKXQ9PT1lW2ldJiYocj1uLnB1c2goaSkpO3doaWxlKHItLSllLnNwbGljZShuW3JdLDEpfXJldHVybiB1PW51bGwsZX0sbz1zZS5nZXRUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0LG49IiIscj0wLGk9ZS5ub2RlVHlwZTtpZihpKXtpZigxPT09aXx8OT09PWl8fDExPT09aSl7aWYoInN0cmluZyI9PXR5cGVvZiBlLnRleHRDb250ZW50KXJldHVybiBlLnRleHRDb250ZW50O2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyluKz1vKGUpfWVsc2UgaWYoMz09PWl8fDQ9PT1pKXJldHVybiBlLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKHQ9ZVtyKytdKW4rPW8odCk7cmV0dXJuIG59LChiPXNlLnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmxlLG1hdGNoOkcsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZSh0ZSxuZSksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UodGUsbmUpLCJ+PSI9PT1lWzJdJiYoZVszXT0iICIrZVszXSsiICIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09ZVsxXS5zbGljZSgwLDMpPyhlWzNdfHxzZS5lcnJvcihlWzBdKSxlWzRdPSsoZVs0XT9lWzVdKyhlWzZdfHwxKToyKigiZXZlbiI9PT1lWzNdfHwib2RkIj09PWVbM10pKSxlWzVdPSsoZVs3XStlWzhdfHwib2RkIj09PWVbM10pKTplWzNdJiZzZS5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIHQsbj0hZVs2XSYmZVsyXTtyZXR1cm4gRy5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10/ZVsyXT1lWzRdfHxlWzVdfHwiIjpuJiZYLnRlc3QobikmJih0PWgobiwhMCkpJiYodD1uLmluZGV4T2YoIikiLG4ubGVuZ3RoLXQpLW4ubGVuZ3RoKSYmKGVbMF09ZVswXS5zbGljZSgwLHQpLGVbMl09bi5zbGljZSgwLHQpKSxlLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHRlLG5lKS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PWU/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXR9fSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1wW2UrIiAiXTtyZXR1cm4gdHx8KHQ9bmV3IFJlZ0V4cCgiKF58IitNKyIpIitlKyIoIitNKyJ8JCkiKSkmJnAoZSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KCJzdHJpbmciPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHwidW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24obixyLGkpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1zZS5hdHRyKGUsbik7cmV0dXJuIG51bGw9PXQ/IiE9Ij09PXI6IXJ8fCh0Kz0iIiwiPSI9PT1yP3Q9PT1pOiIhPSI9PT1yP3QhPT1pOiJePSI9PT1yP2kmJjA9PT10LmluZGV4T2YoaSk6Iio9Ij09PXI/aSYmLTE8dC5pbmRleE9mKGkpOiIkPSI9PT1yP2kmJnQuc2xpY2UoLWkubGVuZ3RoKT09PWk6In49Ij09PXI/LTE8KCIgIit0LnJlcGxhY2UoRiwiICIpKyIgIikuaW5kZXhPZihpKToifD0iPT09ciYmKHQ9PT1pfHx0LnNsaWNlKDAsaS5sZW5ndGgrMSk9PT1pKyItIikpfX0sQ0hJTEQ6ZnVuY3Rpb24oaCxlLHQsZyx2KXt2YXIgeT0ibnRoIiE9PWguc2xpY2UoMCwzKSxtPSJsYXN0IiE9PWguc2xpY2UoLTQpLHg9Im9mLXR5cGUiPT09ZTtyZXR1cm4gMT09PWcmJjA9PT12P2Z1bmN0aW9uKGUpe3JldHVybiEhZS5wYXJlbnROb2RlfTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGw9eSE9PW0/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixjPWUucGFyZW50Tm9kZSxmPXgmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxwPSFuJiYheCxkPSExO2lmKGMpe2lmKHkpe3doaWxlKGwpe2E9ZTt3aGlsZShhPWFbbF0paWYoeD9hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1mOjE9PT1hLm5vZGVUeXBlKXJldHVybiExO3U9bD0ib25seSI9PT1oJiYhdSYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZih1PVttP2MuZmlyc3RDaGlsZDpjLmxhc3RDaGlsZF0sbSYmcCl7ZD0ocz0ocj0oaT0obz0oYT1jKVtrXXx8KGFba109e30pKVthLnVuaXF1ZUlEXXx8KG9bYS51bmlxdWVJRF09e30pKVtoXXx8W10pWzBdPT09UyYmclsxXSkmJnJbMl0sYT1zJiZjLmNoaWxkTm9kZXNbc107d2hpbGUoYT0rK3MmJmEmJmFbbF18fChkPXM9MCl8fHUucG9wKCkpaWYoMT09PWEubm9kZVR5cGUmJisrZCYmYT09PWUpe2lbaF09W1MscyxkXTticmVha319ZWxzZSBpZihwJiYoZD1zPShyPShpPShvPShhPWUpW2tdfHwoYVtrXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdfHxbXSlbMF09PT1TJiZyWzFdKSwhMT09PWQpd2hpbGUoYT0rK3MmJmEmJmFbbF18fChkPXM9MCl8fHUucG9wKCkpaWYoKHg/YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZjoxPT09YS5ub2RlVHlwZSkmJisrZCYmKHAmJigoaT0obz1hW2tdfHwoYVtrXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdPVtTLGRdKSxhPT09ZSkpYnJlYWs7cmV0dXJuKGQtPXYpPT09Z3x8ZCVnPT0wJiYwPD1kL2d9fX0sUFNFVURPOmZ1bmN0aW9uKGUsbyl7dmFyIHQsYT1iLnBzZXVkb3NbZV18fGIuc2V0RmlsdGVyc1tlLnRvTG93ZXJDYXNlKCldfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2UpO3JldHVybiBhW2tdP2Eobyk6MTxhLmxlbmd0aD8odD1bZSxlLCIiLG9dLGIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP2xlKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1hKGUsbyksaT1yLmxlbmd0aDt3aGlsZShpLS0pZVtuPVAoZSxyW2ldKV09ISh0W25dPXJbaV0pfSk6ZnVuY3Rpb24oZSl7cmV0dXJuIGEoZSwwLHQpfSk6YX19LHBzZXVkb3M6e25vdDpsZShmdW5jdGlvbihlKXt2YXIgcj1bXSxpPVtdLHM9ZihlLnJlcGxhY2UoQiwiJDEiKSk7cmV0dXJuIHNba10/bGUoZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz1zKGUsbnVsbCxyLFtdKSxhPWUubGVuZ3RoO3doaWxlKGEtLSkoaT1vW2FdKSYmKGVbYV09ISh0W2FdPWkpKX0pOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gclswXT1lLHMocixudWxsLG4saSksclswXT1udWxsLCFpLnBvcCgpfX0pLGhhczpsZShmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIDA8c2UodCxlKS5sZW5ndGh9fSksY29udGFpbnM6bGUoZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC5yZXBsYWNlKHRlLG5lKSxmdW5jdGlvbihlKXtyZXR1cm4tMTwoZS50ZXh0Q29udGVudHx8byhlKSkuaW5kZXhPZih0KX19KSxsYW5nOmxlKGZ1bmN0aW9uKG4pe3JldHVybiBWLnRlc3Qobnx8IiIpfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIituKSxuPW4ucmVwbGFjZSh0ZSxuZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihlKXt2YXIgdDtkb3tpZih0PUU/ZS5sYW5nOmUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxlLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybih0PXQudG9Mb3dlckNhc2UoKSk9PT1ufHwwPT09dC5pbmRleE9mKG4rIi0iKX13aGlsZSgoZT1lLnBhcmVudE5vZGUpJiYxPT09ZS5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGUpe3ZhciB0PW4ubG9jYXRpb24mJm4ubG9jYXRpb24uaGFzaDtyZXR1cm4gdCYmdC5zbGljZSgxKT09PWUuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1hfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PUMuYWN0aXZlRWxlbWVudCYmKCFDLmhhc0ZvY3VzfHxDLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmdlKCExKSxkaXNhYmxlZDpnZSghMCksY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIWIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBKLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBRLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiJidXR0b24iPT09ZS50eXBlfHwiYnV0dG9uIj09PXR9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PXQudG9Mb3dlckNhc2UoKSl9LGZpcnN0OnZlKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDp2ZShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6dmUoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSksZXZlbjp2ZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDp2ZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OnZlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDp0PG4/dDpuOzA8PS0tcjspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6dmUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0pLnBzZXVkb3MubnRoPWIucHNldWRvcy5lcSx7cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pYi5wc2V1ZG9zW2VdPWRlKGUpO2ZvcihlIGlue3N1Ym1pdDohMCxyZXNldDohMH0pYi5wc2V1ZG9zW2VdPWhlKGUpO2Z1bmN0aW9uIG1lKCl7fWZ1bmN0aW9uIHhlKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjt0PG47dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24gYmUocyxlLHQpe3ZhciB1PWUuZGlyLGw9ZS5uZXh0LGM9bHx8dSxmPXQmJiJwYXJlbnROb2RlIj09PWMscD1yKys7cmV0dXJuIGUuZmlyc3Q/ZnVuY3Rpb24oZSx0LG4pe3doaWxlKGU9ZVt1XSlpZigxPT09ZS5ub2RlVHlwZXx8ZilyZXR1cm4gcyhlLHQsbik7cmV0dXJuITF9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYT1bUyxwXTtpZihuKXt3aGlsZShlPWVbdV0paWYoKDE9PT1lLm5vZGVUeXBlfHxmKSYmcyhlLHQsbikpcmV0dXJuITB9ZWxzZSB3aGlsZShlPWVbdV0paWYoMT09PWUubm9kZVR5cGV8fGYpaWYoaT0obz1lW2tdfHwoZVtrXT17fSkpW2UudW5pcXVlSURdfHwob1tlLnVuaXF1ZUlEXT17fSksbCYmbD09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSllPWVbdV18fGU7ZWxzZXtpZigocj1pW2NdKSYmclswXT09PVMmJnJbMV09PT1wKXJldHVybiBhWzJdPXJbMl07aWYoKGlbY109YSlbMl09cyhlLHQsbikpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHdlKGkpe3JldHVybiAxPGkubGVuZ3RoP2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1pLmxlbmd0aDt3aGlsZShyLS0paWYoIWlbcl0oZSx0LG4pKXJldHVybiExO3JldHVybiEwfTppWzBdfWZ1bmN0aW9uIFRlKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGE9W10scz0wLHU9ZS5sZW5ndGgsbD1udWxsIT10O3M8dTtzKyspKG89ZVtzXSkmJihuJiYhbihvLHIsaSl8fChhLnB1c2gobyksbCYmdC5wdXNoKHMpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gQ2UoZCxoLGcsdix5LGUpe3JldHVybiB2JiYhdltrXSYmKHY9Q2UodikpLHkmJiF5W2tdJiYoeT1DZSh5LGUpKSxsZShmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1bXSx1PVtdLGw9dC5sZW5ndGgsYz1lfHxmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKXNlKGUsdFtyXSxuKTtyZXR1cm4gbn0oaHx8IioiLG4ubm9kZVR5cGU/W25dOm4sW10pLGY9IWR8fCFlJiZoP2M6VGUoYyxzLGQsbixyKSxwPWc/eXx8KGU/ZDpsfHx2KT9bXTp0OmY7aWYoZyYmZyhmLHAsbixyKSx2KXtpPVRlKHAsdSksdihpLFtdLG4sciksbz1pLmxlbmd0aDt3aGlsZShvLS0pKGE9aVtvXSkmJihwW3Vbb11dPSEoZlt1W29dXT1hKSl9aWYoZSl7aWYoeXx8ZCl7aWYoeSl7aT1bXSxvPXAubGVuZ3RoO3doaWxlKG8tLSkoYT1wW29dKSYmaS5wdXNoKGZbb109YSk7eShudWxsLHA9W10saSxyKX1vPXAubGVuZ3RoO3doaWxlKG8tLSkoYT1wW29dKSYmLTE8KGk9eT9QKGUsYSk6c1tvXSkmJihlW2ldPSEodFtpXT1hKSl9fWVsc2UgcD1UZShwPT09dD9wLnNwbGljZShsLHAubGVuZ3RoKTpwKSx5P3kobnVsbCx0LHAscik6SC5hcHBseSh0LHApfSl9ZnVuY3Rpb24gRWUoZSl7Zm9yKHZhciBpLHQsbixyPWUubGVuZ3RoLG89Yi5yZWxhdGl2ZVtlWzBdLnR5cGVdLGE9b3x8Yi5yZWxhdGl2ZVsiICJdLHM9bz8xOjAsdT1iZShmdW5jdGlvbihlKXtyZXR1cm4gZT09PWl9LGEsITApLGw9YmUoZnVuY3Rpb24oZSl7cmV0dXJuLTE8UChpLGUpfSxhLCEwKSxjPVtmdW5jdGlvbihlLHQsbil7dmFyIHI9IW8mJihufHx0IT09dyl8fCgoaT10KS5ub2RlVHlwZT91KGUsdCxuKTpsKGUsdCxuKSk7cmV0dXJuIGk9bnVsbCxyfV07czxyO3MrKylpZih0PWIucmVsYXRpdmVbZVtzXS50eXBlXSljPVtiZSh3ZShjKSx0KV07ZWxzZXtpZigodD1iLmZpbHRlcltlW3NdLnR5cGVdLmFwcGx5KG51bGwsZVtzXS5tYXRjaGVzKSlba10pe2ZvcihuPSsrcztuPHI7bisrKWlmKGIucmVsYXRpdmVbZVtuXS50eXBlXSlicmVhaztyZXR1cm4gQ2UoMTxzJiZ3ZShjKSwxPHMmJnhlKGUuc2xpY2UoMCxzLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09ZVtzLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoQiwiJDEiKSx0LHM8biYmRWUoZS5zbGljZShzLG4pKSxuPHImJkVlKGU9ZS5zbGljZShuKSksbjxyJiZ4ZShlKSl9Yy5wdXNoKHQpfXJldHVybiB3ZShjKX1yZXR1cm4gbWUucHJvdG90eXBlPWIuZmlsdGVycz1iLnBzZXVkb3MsYi5zZXRGaWx0ZXJzPW5ldyBtZSxoPXNlLnRva2VuaXplPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLHUsbD14W2UrIiAiXTtpZihsKXJldHVybiB0PzA6bC5zbGljZSgwKTthPWUscz1bXSx1PWIucHJlRmlsdGVyO3doaWxlKGEpe2ZvcihvIGluIG4mJiEocj1fLmV4ZWMoYSkpfHwociYmKGE9YS5zbGljZShyWzBdLmxlbmd0aCl8fGEpLHMucHVzaChpPVtdKSksbj0hMSwocj16LmV4ZWMoYSkpJiYobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6clswXS5yZXBsYWNlKEIsIiAiKX0pLGE9YS5zbGljZShuLmxlbmd0aCkpLGIuZmlsdGVyKSEocj1HW29dLmV4ZWMoYSkpfHx1W29dJiYhKHI9dVtvXShyKSl8fChuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpvLG1hdGNoZXM6cn0pLGE9YS5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P2EubGVuZ3RoOmE/c2UuZXJyb3IoZSk6eChlLHMpLnNsaWNlKDApfSxmPXNlLmNvbXBpbGU9ZnVuY3Rpb24oZSx0KXt2YXIgbix2LHksbSx4LHIsaT1bXSxvPVtdLGE9TltlKyIgIl07aWYoIWEpe3R8fCh0PWgoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKShhPUVlKHRbbl0pKVtrXT9pLnB1c2goYSk6by5wdXNoKGEpOyhhPU4oZSwodj1vLG09MDwoeT1pKS5sZW5ndGgseD0wPHYubGVuZ3RoLHI9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdT0wLGw9IjAiLGM9ZSYmW10sZj1bXSxwPXcsZD1lfHx4JiZiLmZpbmQuVEFHKCIqIixpKSxoPVMrPW51bGw9PXA/MTpNYXRoLnJhbmRvbSgpfHwuMSxnPWQubGVuZ3RoO2ZvcihpJiYodz10PT09Q3x8dHx8aSk7bCE9PWcmJm51bGwhPShvPWRbbF0pO2wrKyl7aWYoeCYmbyl7YT0wLHR8fG8ub3duZXJEb2N1bWVudD09PUN8fChUKG8pLG49IUUpO3doaWxlKHM9dlthKytdKWlmKHMobyx0fHxDLG4pKXtyLnB1c2gobyk7YnJlYWt9aSYmKFM9aCl9bSYmKChvPSFzJiZvKSYmdS0tLGUmJmMucHVzaChvKSl9aWYodSs9bCxtJiZsIT09dSl7YT0wO3doaWxlKHM9eVthKytdKXMoYyxmLHQsbik7aWYoZSl7aWYoMDx1KXdoaWxlKGwtLSljW2xdfHxmW2xdfHwoZltsXT1xLmNhbGwocikpO2Y9VGUoZil9SC5hcHBseShyLGYpLGkmJiFlJiYwPGYubGVuZ3RoJiYxPHUreS5sZW5ndGgmJnNlLnVuaXF1ZVNvcnQocil9cmV0dXJuIGkmJihTPWgsdz1wKSxjfSxtP2xlKHIpOnIpKSkuc2VsZWN0b3I9ZX1yZXR1cm4gYX0sZz1zZS5zZWxlY3Q9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLGM9IXImJmgoZT1sLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1jLmxlbmd0aCl7aWYoMjwobz1jWzBdPWNbMF0uc2xpY2UoMCkpLmxlbmd0aCYmIklEIj09PShhPW9bMF0pLnR5cGUmJjk9PT10Lm5vZGVUeXBlJiZFJiZiLnJlbGF0aXZlW29bMV0udHlwZV0pe2lmKCEodD0oYi5maW5kLklEKGEubWF0Y2hlc1swXS5yZXBsYWNlKHRlLG5lKSx0KXx8W10pWzBdKSlyZXR1cm4gbjtsJiYodD10LnBhcmVudE5vZGUpLGU9ZS5zbGljZShvLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPUcubmVlZHNDb250ZXh0LnRlc3QoZSk/MDpvLmxlbmd0aDt3aGlsZShpLS0pe2lmKGE9b1tpXSxiLnJlbGF0aXZlW3M9YS50eXBlXSlicmVhaztpZigodT1iLmZpbmRbc10pJiYocj11KGEubWF0Y2hlc1swXS5yZXBsYWNlKHRlLG5lKSxlZS50ZXN0KG9bMF0udHlwZSkmJnllKHQucGFyZW50Tm9kZSl8fHQpKSl7aWYoby5zcGxpY2UoaSwxKSwhKGU9ci5sZW5ndGgmJnhlKG8pKSlyZXR1cm4gSC5hcHBseShuLHIpLG47YnJlYWt9fX1yZXR1cm4obHx8ZihlLGMpKShyLHQsIUUsbiwhdHx8ZWUudGVzdChlKSYmeWUodC5wYXJlbnROb2RlKXx8dCksbn0sZC5zb3J0U3RhYmxlPWsuc3BsaXQoIiIpLnNvcnQoRCkuam9pbigiIik9PT1rLGQuZGV0ZWN0RHVwbGljYXRlcz0hIWwsVCgpLGQuc29ydERldGFjaGVkPWNlKGZ1bmN0aW9uKGUpe3JldHVybiAxJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oQy5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKX0pLGNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGZlKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihlLHQsbil7aWYoIW4pcmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQsInR5cGUiPT09dC50b0xvd2VyQ2FzZSgpPzE6Mil9KSxkLmF0dHJpYnV0ZXMmJmNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGlucHV0Lz4iLGUuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGZlKCJ2YWx1ZSIsZnVuY3Rpb24oZSx0LG4pe2lmKCFuJiYiaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiBlLmRlZmF1bHRWYWx1ZX0pLGNlKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxmZShSLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZighbilyZXR1cm4hMD09PWVbdF0/dC50b0xvd2VyQ2FzZSgpOihyPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0pLHNlfShDKTtrLmZpbmQ9aCxrLmV4cHI9aC5zZWxlY3RvcnMsay5leHByWyI6Il09ay5leHByLnBzZXVkb3Msay51bmlxdWVTb3J0PWsudW5pcXVlPWgudW5pcXVlU29ydCxrLnRleHQ9aC5nZXRUZXh0LGsuaXNYTUxEb2M9aC5pc1hNTCxrLmNvbnRhaW5zPWguY29udGFpbnMsay5lc2NhcGVTZWxlY3Rvcj1oLmVzY2FwZTt2YXIgVD1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10saT12b2lkIDAhPT1uO3doaWxlKChlPWVbdF0pJiY5IT09ZS5ub2RlVHlwZSlpZigxPT09ZS5ub2RlVHlwZSl7aWYoaSYmayhlKS5pcyhuKSlicmVhaztyLnB1c2goZSl9cmV0dXJuIHJ9LFM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W107ZTtlPWUubmV4dFNpYmxpbmcpMT09PWUubm9kZVR5cGUmJmUhPT10JiZuLnB1c2goZSk7cmV0dXJuIG59LE49ay5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBBKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX12YXIgRD0vXjwoW2Etel1bXlwvXDA+Olx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaTtmdW5jdGlvbiBqKGUsbixyKXtyZXR1cm4gbShuKT9rLmdyZXAoZSxmdW5jdGlvbihlLHQpe3JldHVybiEhbi5jYWxsKGUsdCxlKSE9PXJ9KTpuLm5vZGVUeXBlP2suZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09biE9PXJ9KToic3RyaW5nIiE9dHlwZW9mIG4/ay5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuLTE8aS5jYWxsKG4sZSkhPT1yfSk6ay5maWx0ZXIobixlLHIpfWsuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP2suZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106ay5maW5kLm1hdGNoZXMoZSxrLmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LGsuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayhrKGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7dDxyO3QrKylpZihrLmNvbnRhaW5zKGlbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLHQ9MDt0PHI7dCsrKWsuZmluZChlLGlbdF0sbik7cmV0dXJuIDE8cj9rLnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITApKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFqKHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZOLnRlc3QoZSk/ayhlKTplfHxbXSwhMSkubGVuZ3RofX0pO3ZhciBxLEw9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsoay5mbi5pbml0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKCFlKXJldHVybiB0aGlzO2lmKG49bnx8cSwic3RyaW5nIj09dHlwZW9mIGUpe2lmKCEocj0iPCI9PT1lWzBdJiYiPiI9PT1lW2UubGVuZ3RoLTFdJiYzPD1lLmxlbmd0aD9bbnVsbCxlLG51bGxdOkwuZXhlYyhlKSl8fCFyWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoclsxXSl7aWYodD10IGluc3RhbmNlb2Ygaz90WzBdOnQsay5tZXJnZSh0aGlzLGsucGFyc2VIVE1MKHJbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6RSwhMCkpLEQudGVzdChyWzFdKSYmay5pc1BsYWluT2JqZWN0KHQpKWZvcihyIGluIHQpbSh0aGlzW3JdKT90aGlzW3JdKHRbcl0pOnRoaXMuYXR0cihyLHRbcl0pO3JldHVybiB0aGlzfXJldHVybihpPUUuZ2V0RWxlbWVudEJ5SWQoclsyXSkpJiYodGhpc1swXT1pLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOm0oZSk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KGUpOmUoayk6ay5tYWtlQXJyYXkoZSx0aGlzKX0pLnByb3RvdHlwZT1rLmZuLHE9ayhFKTt2YXIgSD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxPPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2Z1bmN0aW9uIFAoZSx0KXt3aGlsZSgoZT1lW3RdKSYmMSE9PWUubm9kZVR5cGUpO3JldHVybiBlfWsuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9ayhlLHRoaXMpLG49dC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxuO2UrKylpZihrLmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT0ic3RyaW5nIiE9dHlwZW9mIGUmJmsoZSk7aWYoIU4udGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT8tMTxhLmluZGV4KG4pOjE9PT1uLm5vZGVUeXBlJiZrLmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtvLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKDE8by5sZW5ndGg/ay51bmlxdWVTb3J0KG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/aS5jYWxsKGsoZSksdGhpc1swXSk6aS5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhrLnVuaXF1ZVNvcnQoay5tZXJnZSh0aGlzLmdldCgpLGsoZSx0KSkpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSksay5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBUKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gVChlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gUChlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBQKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBUKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIFQoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFQoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBUKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBTKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gUyhlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGUuY29udGVudERvY3VtZW50P2UuY29udGVudERvY3VtZW50OihBKGUsInRlbXBsYXRlIikmJihlPWUuY29udGVudHx8ZSksay5tZXJnZShbXSxlLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKHIsaSl7ay5mbltyXT1mdW5jdGlvbihlLHQpe3ZhciBuPWsubWFwKHRoaXMsaSxlKTtyZXR1cm4iVW50aWwiIT09ci5zbGljZSgtNSkmJih0PWUpLHQmJiJzdHJpbmciPT10eXBlb2YgdCYmKG49ay5maWx0ZXIodCxuKSksMTx0aGlzLmxlbmd0aCYmKE9bcl18fGsudW5pcXVlU29ydChuKSxILnRlc3QocikmJm4ucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgUj0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIE0oZSl7cmV0dXJuIGV9ZnVuY3Rpb24gSShlKXt0aHJvdyBlfWZ1bmN0aW9uIFcoZSx0LG4scil7dmFyIGk7dHJ5e2UmJm0oaT1lLnByb21pc2UpP2kuY2FsbChlKS5kb25lKHQpLmZhaWwobik6ZSYmbShpPWUudGhlbik/aS5jYWxsKGUsdCxuKTp0LmFwcGx5KHZvaWQgMCxbZV0uc2xpY2UocikpfWNhdGNoKGUpe24uYXBwbHkodm9pZCAwLFtlXSl9fWsuQ2FsbGJhY2tzPWZ1bmN0aW9uKHIpe3ZhciBlLG47cj0ic3RyaW5nIj09dHlwZW9mIHI/KGU9cixuPXt9LGsuZWFjaChlLm1hdGNoKFIpfHxbXSxmdW5jdGlvbihlLHQpe25bdF09ITB9KSxuKTprLmV4dGVuZCh7fSxyKTt2YXIgaSx0LG8sYSxzPVtdLHU9W10sbD0tMSxjPWZ1bmN0aW9uKCl7Zm9yKGE9YXx8ci5vbmNlLG89aT0hMDt1Lmxlbmd0aDtsPS0xKXt0PXUuc2hpZnQoKTt3aGlsZSgrK2w8cy5sZW5ndGgpITE9PT1zW2xdLmFwcGx5KHRbMF0sdFsxXSkmJnIuc3RvcE9uRmFsc2UmJihsPXMubGVuZ3RoLHQ9ITEpfXIubWVtb3J5fHwodD0hMSksaT0hMSxhJiYocz10P1tdOiIiKX0sZj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIHMmJih0JiYhaSYmKGw9cy5sZW5ndGgtMSx1LnB1c2godCkpLGZ1bmN0aW9uIG4oZSl7ay5lYWNoKGUsZnVuY3Rpb24oZSx0KXttKHQpP3IudW5pcXVlJiZmLmhhcyh0KXx8cy5wdXNoKHQpOnQmJnQubGVuZ3RoJiYic3RyaW5nIiE9PXcodCkmJm4odCl9KX0oYXJndW1lbnRzKSx0JiYhaSYmYygpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gay5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihlLHQpe3ZhciBuO3doaWxlKC0xPChuPWsuaW5BcnJheSh0LHMsbikpKXMuc3BsaWNlKG4sMSksbjw9bCYmbC0tfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiBlPy0xPGsuaW5BcnJheShlLHMpOjA8cy5sZW5ndGh9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHMmJihzPVtdKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9dT1bXSxzPXQ9IiIsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hc30sbG9jazpmdW5jdGlvbigpe3JldHVybiBhPXU9W10sdHx8aXx8KHM9dD0iIiksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISFhfSxmaXJlV2l0aDpmdW5jdGlvbihlLHQpe3JldHVybiBhfHwodD1bZSwodD10fHxbXSkuc2xpY2U/dC5zbGljZSgpOnRdLHUucHVzaCh0KSxpfHxjKCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIW99fTtyZXR1cm4gZn0say5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGUpe3ZhciBvPVtbIm5vdGlmeSIsInByb2dyZXNzIixrLkNhbGxiYWNrcygibWVtb3J5Iiksay5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLGsuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGsuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixrLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxrLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxpPSJwZW5kaW5nIixhPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBpfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gcy5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LCJjYXRjaCI6ZnVuY3Rpb24oZSl7cmV0dXJuIGEudGhlbihudWxsLGUpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzO3JldHVybiBrLkRlZmVycmVkKGZ1bmN0aW9uKHIpe2suZWFjaChvLGZ1bmN0aW9uKGUsdCl7dmFyIG49bShpW3RbNF1dKSYmaVt0WzRdXTtzW3RbMV1dKGZ1bmN0aW9uKCl7dmFyIGU9biYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSYmbShlLnByb21pc2UpP2UucHJvbWlzZSgpLnByb2dyZXNzKHIubm90aWZ5KS5kb25lKHIucmVzb2x2ZSkuZmFpbChyLnJlamVjdCk6clt0WzBdKyJXaXRoIl0odGhpcyxuP1tlXTphcmd1bWVudHMpfSl9KSxpPW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24odCxuLHIpe3ZhciB1PTA7ZnVuY3Rpb24gbChpLG8sYSxzKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLHI9YXJndW1lbnRzLGU9ZnVuY3Rpb24oKXt2YXIgZSx0O2lmKCEoaTx1KSl7aWYoKGU9YS5hcHBseShuLHIpKT09PW8ucHJvbWlzZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvbiIpO3Q9ZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiZlLnRoZW4sbSh0KT9zP3QuY2FsbChlLGwodSxvLE0scyksbCh1LG8sSSxzKSk6KHUrKyx0LmNhbGwoZSxsKHUsbyxNLHMpLGwodSxvLEkscyksbCh1LG8sTSxvLm5vdGlmeVdpdGgpKSk6KGEhPT1NJiYobj12b2lkIDAscj1bZV0pLChzfHxvLnJlc29sdmVXaXRoKShuLHIpKX19LHQ9cz9lOmZ1bmN0aW9uKCl7dHJ5e2UoKX1jYXRjaChlKXtrLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJmsuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhlLHQuc3RhY2tUcmFjZSksdTw9aSsxJiYoYSE9PUkmJihuPXZvaWQgMCxyPVtlXSksby5yZWplY3RXaXRoKG4scikpfX07aT90KCk6KGsuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYodC5zdGFja1RyYWNlPWsuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLEMuc2V0VGltZW91dCh0KSl9fXJldHVybiBrLkRlZmVycmVkKGZ1bmN0aW9uKGUpe29bMF1bM10uYWRkKGwoMCxlLG0ocik/cjpNLGUubm90aWZ5V2l0aCkpLG9bMV1bM10uYWRkKGwoMCxlLG0odCk/dDpNKSksb1syXVszXS5hZGQobCgwLGUsbShuKT9uOkkpKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT9rLmV4dGVuZChlLGEpOmF9fSxzPXt9O3JldHVybiBrLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPXRbMl0scj10WzVdO2FbdFsxXV09bi5hZGQsciYmbi5hZGQoZnVuY3Rpb24oKXtpPXJ9LG9bMy1lXVsyXS5kaXNhYmxlLG9bMy1lXVszXS5kaXNhYmxlLG9bMF1bMl0ubG9jayxvWzBdWzNdLmxvY2spLG4uYWRkKHRbM10uZmlyZSksc1t0WzBdXT1mdW5jdGlvbigpe3JldHVybiBzW3RbMF0rIldpdGgiXSh0aGlzPT09cz92b2lkIDA6dGhpcyxhcmd1bWVudHMpLHRoaXN9LHNbdFswXSsiV2l0aCJdPW4uZmlyZVdpdGh9KSxhLnByb21pc2UocyksZSYmZS5jYWxsKHMscyksc30sd2hlbjpmdW5jdGlvbihlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHQ9bixyPUFycmF5KHQpLGk9cy5jYWxsKGFyZ3VtZW50cyksbz1rLkRlZmVycmVkKCksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7clt0XT10aGlzLGlbdF09MTxhcmd1bWVudHMubGVuZ3RoP3MuY2FsbChhcmd1bWVudHMpOmUsLS1ufHxvLnJlc29sdmVXaXRoKHIsaSl9fTtpZihuPD0xJiYoVyhlLG8uZG9uZShhKHQpKS5yZXNvbHZlLG8ucmVqZWN0LCFuKSwicGVuZGluZyI9PT1vLnN0YXRlKCl8fG0oaVt0XSYmaVt0XS50aGVuKSkpcmV0dXJuIG8udGhlbigpO3doaWxlKHQtLSlXKGlbdF0sYSh0KSxvLnJlamVjdCk7cmV0dXJuIG8ucHJvbWlzZSgpfX0pO3ZhciAkPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO2suRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbihlLHQpe0MuY29uc29sZSYmQy5jb25zb2xlLndhcm4mJmUmJiQudGVzdChlLm5hbWUpJiZDLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UsZS5zdGFjayx0KX0say5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbihlKXtDLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBlfSl9O3ZhciBGPWsuRGVmZXJyZWQoKTtmdW5jdGlvbiBCKCl7RS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCKSxDLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLEIpLGsucmVhZHkoKX1rLmZuLnJlYWR5PWZ1bmN0aW9uKGUpe3JldHVybiBGLnRoZW4oZSlbImNhdGNoIl0oZnVuY3Rpb24oZSl7ay5yZWFkeUV4Y2VwdGlvbihlKX0pLHRoaXN9LGsuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKGUpeyghMD09PWU/LS1rLnJlYWR5V2FpdDprLmlzUmVhZHkpfHwoay5pc1JlYWR5PSEwKSE9PWUmJjA8LS1rLnJlYWR5V2FpdHx8Ri5yZXNvbHZlV2l0aChFLFtrXSl9fSksay5yZWFkeS50aGVuPUYudGhlbiwiY29tcGxldGUiPT09RS5yZWFkeVN0YXRlfHwibG9hZGluZyIhPT1FLnJlYWR5U3RhdGUmJiFFLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9DLnNldFRpbWVvdXQoay5yZWFkeSk6KEUuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiksQy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixCKSk7dmFyIF89ZnVuY3Rpb24oZSx0LG4scixpLG8sYSl7dmFyIHM9MCx1PWUubGVuZ3RoLGw9bnVsbD09bjtpZigib2JqZWN0Ij09PXcobikpZm9yKHMgaW4gaT0hMCxuKV8oZSx0LHMsbltzXSwhMCxvLGEpO2Vsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsbShyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbChrKGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LHo9L14tbXMtLyxVPS8tKFthLXpdKS9nO2Z1bmN0aW9uIFgoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIFYoZSl7cmV0dXJuIGUucmVwbGFjZSh6LCJtcy0iKS5yZXBsYWNlKFUsWCl9dmFyIEc9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBZKCl7dGhpcy5leHBhbmRvPWsuZXhwYW5kbytZLnVpZCsrfVkudWlkPTEsWS5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdHx8KHQ9e30sRyhlKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdGhpcy5leHBhbmRvLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pKSksdH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPXRoaXMuY2FjaGUoZSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KWlbVih0KV09bjtlbHNlIGZvcihyIGluIHQpaVtWKHIpXT10W3JdO3JldHVybiBpfSxnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmNhY2hlKGUpOmVbdGhpcy5leHBhbmRvXSYmZVt0aGlzLmV4cGFuZG9dW1YodCldfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10fHx0JiYic3RyaW5nIj09dHlwZW9mIHQmJnZvaWQgMD09PW4/dGhpcy5nZXQoZSx0KToodGhpcy5zZXQoZSx0LG4pLHZvaWQgMCE9PW4/bjp0KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lW3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09dCl7bj0odD1BcnJheS5pc0FycmF5KHQpP3QubWFwKFYpOih0PVYodCkpaW4gcj9bdF06dC5tYXRjaChSKXx8W10pLmxlbmd0aDt3aGlsZShuLS0pZGVsZXRlIHJbdFtuXV19KHZvaWQgMD09PXR8fGsuaXNFbXB0eU9iamVjdChyKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09dCYmIWsuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBRPW5ldyBZLEo9bmV3IFksSz0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLFo9L1tBLVpdL2c7ZnVuY3Rpb24gZWUoZSx0LG4pe3ZhciByLGk7aWYodm9pZCAwPT09biYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZShaLCItJCYiKS50b0xvd2VyQ2FzZSgpLCJzdHJpbmciPT10eXBlb2Yobj1lLmdldEF0dHJpYnV0ZShyKSkpe3RyeXtuPSJ0cnVlIj09PShpPW4pfHwiZmFsc2UiIT09aSYmKCJudWxsIj09PWk/bnVsbDppPT09K2krIiI/K2k6Sy50ZXN0KGkpP0pTT04ucGFyc2UoaSk6aSl9Y2F0Y2goZSl7fUouc2V0KGUsdCxuKX1lbHNlIG49dm9pZCAwO3JldHVybiBufWsuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiBKLmhhc0RhdGEoZSl8fFEuaGFzRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEouYWNjZXNzKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe0oucmVtb3ZlKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUS5hY2Nlc3MoZSx0LG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe1EucmVtb3ZlKGUsdCl9fSksay5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24obixlKXt2YXIgdCxyLGksbz10aGlzWzBdLGE9byYmby5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PW4pe2lmKHRoaXMubGVuZ3RoJiYoaT1KLmdldChvKSwxPT09by5ub2RlVHlwZSYmIVEuZ2V0KG8sImhhc0RhdGFBdHRycyIpKSl7dD1hLmxlbmd0aDt3aGlsZSh0LS0pYVt0XSYmMD09PShyPWFbdF0ubmFtZSkuaW5kZXhPZigiZGF0YS0iKSYmKHI9VihyLnNsaWNlKDUpKSxlZShvLHIsaVtyXSkpO1Euc2V0KG8sImhhc0RhdGFBdHRycyIsITApfXJldHVybiBpfXJldHVybiJvYmplY3QiPT10eXBlb2Ygbj90aGlzLmVhY2goZnVuY3Rpb24oKXtKLnNldCh0aGlzLG4pfSk6Xyh0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0O2lmKG8mJnZvaWQgMD09PWUpcmV0dXJuIHZvaWQgMCE9PSh0PUouZ2V0KG8sbikpP3Q6dm9pZCAwIT09KHQ9ZWUobyxuKSk/dDp2b2lkIDA7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Si5zZXQodGhpcyxuLGUpfSl9LG51bGwsZSwxPGFyZ3VtZW50cy5sZW5ndGgsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe0oucmVtb3ZlKHRoaXMsZSl9KX19KSxrLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKGUpcmV0dXJuIHQ9KHR8fCJmeCIpKyJxdWV1ZSIscj1RLmdldChlLHQpLG4mJighcnx8QXJyYXkuaXNBcnJheShuKT9yPVEuYWNjZXNzKGUsdCxrLm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ImZ4Ijt2YXIgbj1rLnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxvPWsuX3F1ZXVlSG9va3MoZSx0KTsiaW5wcm9ncmVzcyI9PT1pJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYoImZ4Ij09PXQmJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBvLnN0b3AsaS5jYWxsKGUsZnVuY3Rpb24oKXtrLmRlcXVldWUoZSx0KX0sbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4gUS5nZXQoZSxuKXx8US5hY2Nlc3MoZSxuLHtlbXB0eTprLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtRLnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSl9KX19KSxrLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24odCxuKXt2YXIgZT0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKG49dCx0PSJmeCIsZS0tKSxhcmd1bWVudHMubGVuZ3RoPGU/ay5xdWV1ZSh0aGlzWzBdLHQpOnZvaWQgMD09PW4/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1rLnF1ZXVlKHRoaXMsdCxuKTtrLl9xdWV1ZUhvb2tzKHRoaXMsdCksImZ4Ij09PXQmJiJpbnByb2dyZXNzIiE9PWVbMF0mJmsuZGVxdWV1ZSh0aGlzLHQpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2suZGVxdWV1ZSh0aGlzLGUpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTEsaT1rLkRlZmVycmVkKCksbz10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8aS5yZXNvbHZlV2l0aChvLFtvXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHwiZngiO3doaWxlKGEtLSkobj1RLmdldChvW2FdLGUrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksaS5wcm9taXNlKHQpfX0pO3ZhciB0ZT0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxuZT1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrdGUrIikoW2EteiVdKikkIiwiaSIpLHJlPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0saWU9RS5kb2N1bWVudEVsZW1lbnQsb2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGsuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfSxhZT17Y29tcG9zZWQ6ITB9O2llLmdldFJvb3ROb2RlJiYob2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGsuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHxlLmdldFJvb3ROb2RlKGFlKT09PWUub3duZXJEb2N1bWVudH0pO3ZhciBzZT1mdW5jdGlvbihlLHQpe3JldHVybiJub25lIj09PShlPXR8fGUpLnN0eWxlLmRpc3BsYXl8fCIiPT09ZS5zdHlsZS5kaXNwbGF5JiZvZShlKSYmIm5vbmUiPT09ay5jc3MoZSwiZGlzcGxheSIpfSx1ZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGE9e307Zm9yKG8gaW4gdClhW29dPWUuc3R5bGVbb10sZS5zdHlsZVtvXT10W29dO2ZvcihvIGluIGk9bi5hcHBseShlLHJ8fFtdKSx0KWUuc3R5bGVbb109YVtvXTtyZXR1cm4gaX07ZnVuY3Rpb24gbGUoZSx0LG4scil7dmFyIGksbyxhPTIwLHM9cj9mdW5jdGlvbigpe3JldHVybiByLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiBrLmNzcyhlLHQsIiIpfSx1PXMoKSxsPW4mJm5bM118fChrLmNzc051bWJlclt0XT8iIjoicHgiKSxjPWUubm9kZVR5cGUmJihrLmNzc051bWJlclt0XXx8InB4IiE9PWwmJit1KSYmbmUuZXhlYyhrLmNzcyhlLHQpKTtpZihjJiZjWzNdIT09bCl7dS89MixsPWx8fGNbM10sYz0rdXx8MTt3aGlsZShhLS0pay5zdHlsZShlLHQsYytsKSwoMS1vKSooMS0obz1zKCkvdXx8LjUpKTw9MCYmKGE9MCksYy89bztjKj0yLGsuc3R5bGUoZSx0LGMrbCksbj1ufHxbXX1yZXR1cm4gbiYmKGM9K2N8fCt1fHwwLGk9blsxXT9jKyhuWzFdKzEpKm5bMl06K25bMl0sciYmKHIudW5pdD1sLHIuc3RhcnQ9YyxyLmVuZD1pKSksaX12YXIgY2U9e307ZnVuY3Rpb24gZmUoZSx0KXtmb3IodmFyIG4scixpLG8sYSxzLHUsbD1bXSxjPTAsZj1lLmxlbmd0aDtjPGY7YysrKShyPWVbY10pLnN0eWxlJiYobj1yLnN0eWxlLmRpc3BsYXksdD8oIm5vbmUiPT09biYmKGxbY109US5nZXQociwiZGlzcGxheSIpfHxudWxsLGxbY118fChyLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PXIuc3R5bGUuZGlzcGxheSYmc2UocikmJihsW2NdPSh1PWE9bz12b2lkIDAsYT0oaT1yKS5vd25lckRvY3VtZW50LHM9aS5ub2RlTmFtZSwodT1jZVtzXSl8fChvPWEuYm9keS5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQocykpLHU9ay5jc3MobywiZGlzcGxheSIpLG8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKSwibm9uZSI9PT11JiYodT0iYmxvY2siKSxjZVtzXT11KSkpKToibm9uZSIhPT1uJiYobFtjXT0ibm9uZSIsUS5zZXQociwiZGlzcGxheSIsbikpKTtmb3IoYz0wO2M8ZjtjKyspbnVsbCE9bFtjXSYmKGVbY10uc3R5bGUuZGlzcGxheT1sW2NdKTtyZXR1cm4gZX1rLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBmZSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBmZSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtzZSh0aGlzKT9rKHRoaXMpLnNob3coKTprKHRoaXMpLmhpZGUoKX0pfX0pO3ZhciBwZT0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxkZT0vPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKikvaSxoZT0vXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksZ2U9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtmdW5jdGlvbiB2ZShlLHQpe3ZhciBuO3JldHVybiBuPSJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHR8fCIqIik6InVuZGVmaW5lZCIhPXR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGw/ZS5xdWVyeVNlbGVjdG9yQWxsKHR8fCIqIik6W10sdm9pZCAwPT09dHx8dCYmQShlLHQpP2subWVyZ2UoW2VdLG4pOm59ZnVuY3Rpb24geWUoZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspUS5zZXQoZVtuXSwiZ2xvYmFsRXZhbCIsIXR8fFEuZ2V0KHRbbl0sImdsb2JhbEV2YWwiKSl9Z2Uub3B0Z3JvdXA9Z2Uub3B0aW9uLGdlLnRib2R5PWdlLnRmb290PWdlLmNvbGdyb3VwPWdlLmNhcHRpb249Z2UudGhlYWQsZ2UudGg9Z2UudGQ7dmFyIG1lLHhlLGJlPS88fCYjP1x3KzsvO2Z1bmN0aW9uIHdlKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGEscyx1LGwsYyxmPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHA9W10sZD0wLGg9ZS5sZW5ndGg7ZDxoO2QrKylpZigobz1lW2RdKXx8MD09PW8paWYoIm9iamVjdCI9PT13KG8pKWsubWVyZ2UocCxvLm5vZGVUeXBlP1tvXTpvKTtlbHNlIGlmKGJlLnRlc3Qobykpe2E9YXx8Zi5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxzPShkZS5leGVjKG8pfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLHU9Z2Vbc118fGdlLl9kZWZhdWx0LGEuaW5uZXJIVE1MPXVbMV0ray5odG1sUHJlZmlsdGVyKG8pK3VbMl0sYz11WzBdO3doaWxlKGMtLSlhPWEubGFzdENoaWxkO2subWVyZ2UocCxhLmNoaWxkTm9kZXMpLChhPWYuZmlyc3RDaGlsZCkudGV4dENvbnRlbnQ9IiJ9ZWxzZSBwLnB1c2godC5jcmVhdGVUZXh0Tm9kZShvKSk7Zi50ZXh0Q29udGVudD0iIixkPTA7d2hpbGUobz1wW2QrK10paWYociYmLTE8ay5pbkFycmF5KG8scikpaSYmaS5wdXNoKG8pO2Vsc2UgaWYobD1vZShvKSxhPXZlKGYuYXBwZW5kQ2hpbGQobyksInNjcmlwdCIpLGwmJnllKGEpLG4pe2M9MDt3aGlsZShvPWFbYysrXSloZS50ZXN0KG8udHlwZXx8IiIpJiZuLnB1c2gobyl9cmV0dXJuIGZ9bWU9RS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuYXBwZW5kQ2hpbGQoRS5jcmVhdGVFbGVtZW50KCJkaXYiKSksKHhlPUUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSx4ZS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIikseGUuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLG1lLmFwcGVuZENoaWxkKHhlKSx5LmNoZWNrQ2xvbmU9bWUuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLG1lLmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIseS5ub0Nsb25lQ2hlY2tlZD0hIW1lLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTt2YXIgVGU9L15rZXkvLENlPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxFZT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24ga2UoKXtyZXR1cm4hMH1mdW5jdGlvbiBTZSgpe3JldHVybiExfWZ1bmN0aW9uIE5lKGUsdCl7cmV0dXJuIGU9PT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gRS5hY3RpdmVFbGVtZW50fWNhdGNoKGUpe319KCk9PSgiZm9jdXMiPT09dCl9ZnVuY3Rpb24gQWUoZSx0LG4scixpLG8pe3ZhciBhLHM7aWYoIm9iamVjdCI9PXR5cGVvZiB0KXtmb3IocyBpbiJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCksdClBZShlLHMsbixyLHRbc10sbyk7cmV0dXJuIGV9aWYobnVsbD09ciYmbnVsbD09aT8oaT1uLHI9bj12b2lkIDApOm51bGw9PWkmJigic3RyaW5nIj09dHlwZW9mIG4/KGk9cixyPXZvaWQgMCk6KGk9cixyPW4sbj12b2lkIDApKSwhMT09PWkpaT1TZTtlbHNlIGlmKCFpKXJldHVybiBlO3JldHVybiAxPT09byYmKGE9aSwoaT1mdW5jdGlvbihlKXtyZXR1cm4gaygpLm9mZihlKSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPWsuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7ay5ldmVudC5hZGQodGhpcyx0LGkscixuKX0pfWZ1bmN0aW9uIERlKGUsaSxvKXtvPyhRLnNldChlLGksITEpLGsuZXZlbnQuYWRkKGUsaSx7bmFtZXNwYWNlOiExLGhhbmRsZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPVEuZ2V0KHRoaXMsaSk7aWYoMSZlLmlzVHJpZ2dlciYmdGhpc1tpXSl7aWYoci5sZW5ndGgpKGsuZXZlbnQuc3BlY2lhbFtpXXx8e30pLmRlbGVnYXRlVHlwZSYmZS5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKHI9cy5jYWxsKGFyZ3VtZW50cyksUS5zZXQodGhpcyxpLHIpLHQ9byh0aGlzLGkpLHRoaXNbaV0oKSxyIT09KG49US5nZXQodGhpcyxpKSl8fHQ/US5zZXQodGhpcyxpLCExKTpuPXt9LHIhPT1uKXJldHVybiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGUucHJldmVudERlZmF1bHQoKSxuLnZhbHVlfWVsc2Ugci5sZW5ndGgmJihRLnNldCh0aGlzLGkse3ZhbHVlOmsuZXZlbnQudHJpZ2dlcihrLmV4dGVuZChyWzBdLGsuRXZlbnQucHJvdG90eXBlKSxyLnNsaWNlKDEpLHRoaXMpfSksZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSl9fSkpOnZvaWQgMD09PVEuZ2V0KGUsaSkmJmsuZXZlbnQuYWRkKGUsaSxrZSl9ay5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLHAsZCxoLGcsdj1RLmdldCh0KTtpZih2KXtuLmhhbmRsZXImJihuPShvPW4pLmhhbmRsZXIsaT1vLnNlbGVjdG9yKSxpJiZrLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGllLGkpLG4uZ3VpZHx8KG4uZ3VpZD1rLmd1aWQrKyksKHU9di5ldmVudHMpfHwodT12LmV2ZW50cz17fSksKGE9di5oYW5kbGUpfHwoYT12LmhhbmRsZT1mdW5jdGlvbihlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGsmJmsuZXZlbnQudHJpZ2dlcmVkIT09ZS50eXBlP2suZXZlbnQuZGlzcGF0Y2guYXBwbHkodCxhcmd1bWVudHMpOnZvaWQgMH0pLGw9KGU9KGV8fCIiKS5tYXRjaChSKXx8WyIiXSkubGVuZ3RoO3doaWxlKGwtLSlkPWc9KHM9RWUuZXhlYyhlW2xdKXx8W10pWzFdLGg9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxkJiYoZj1rLmV2ZW50LnNwZWNpYWxbZF18fHt9LGQ9KGk/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGQsZj1rLmV2ZW50LnNwZWNpYWxbZF18fHt9LGM9ay5leHRlbmQoe3R5cGU6ZCxvcmlnVHlwZTpnLGRhdGE6cixoYW5kbGVyOm4sZ3VpZDpuLmd1aWQsc2VsZWN0b3I6aSxuZWVkc0NvbnRleHQ6aSYmay5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGkpLG5hbWVzcGFjZTpoLmpvaW4oIi4iKX0sbyksKHA9dVtkXSl8fCgocD11W2RdPVtdKS5kZWxlZ2F0ZUNvdW50PTAsZi5zZXR1cCYmITEhPT1mLnNldHVwLmNhbGwodCxyLGgsYSl8fHQuYWRkRXZlbnRMaXN0ZW5lciYmdC5hZGRFdmVudExpc3RlbmVyKGQsYSkpLGYuYWRkJiYoZi5hZGQuY2FsbCh0LGMpLGMuaGFuZGxlci5ndWlkfHwoYy5oYW5kbGVyLmd1aWQ9bi5ndWlkKSksaT9wLnNwbGljZShwLmRlbGVnYXRlQ291bnQrKywwLGMpOnAucHVzaChjKSxrLmV2ZW50Lmdsb2JhbFtkXT0hMCl9fSxyZW1vdmU6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHY9US5oYXNEYXRhKGUpJiZRLmdldChlKTtpZih2JiYodT12LmV2ZW50cykpe2w9KHQ9KHR8fCIiKS5tYXRjaChSKXx8WyIiXSkubGVuZ3RoO3doaWxlKGwtLSlpZihkPWc9KHM9RWUuZXhlYyh0W2xdKXx8W10pWzFdLGg9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxkKXtmPWsuZXZlbnQuc3BlY2lhbFtkXXx8e30scD11W2Q9KHI/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGRdfHxbXSxzPXNbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksYT1vPXAubGVuZ3RoO3doaWxlKG8tLSljPXBbb10sIWkmJmchPT1jLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1jLmd1aWR8fHMmJiFzLnRlc3QoYy5uYW1lc3BhY2UpfHxyJiZyIT09Yy5zZWxlY3RvciYmKCIqKiIhPT1yfHwhYy5zZWxlY3Rvcil8fChwLnNwbGljZShvLDEpLGMuc2VsZWN0b3ImJnAuZGVsZWdhdGVDb3VudC0tLGYucmVtb3ZlJiZmLnJlbW92ZS5jYWxsKGUsYykpO2EmJiFwLmxlbmd0aCYmKGYudGVhcmRvd24mJiExIT09Zi50ZWFyZG93bi5jYWxsKGUsaCx2LmhhbmRsZSl8fGsucmVtb3ZlRXZlbnQoZSxkLHYuaGFuZGxlKSxkZWxldGUgdVtkXSl9ZWxzZSBmb3IoZCBpbiB1KWsuZXZlbnQucmVtb3ZlKGUsZCt0W2xdLG4sciwhMCk7ay5pc0VtcHR5T2JqZWN0KHUpJiZRLnJlbW92ZShlLCJoYW5kbGUgZXZlbnRzIil9fSxkaXNwYXRjaDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscz1rLmV2ZW50LmZpeChlKSx1PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxsPShRLmdldCh0aGlzLCJldmVudHMiKXx8e30pW3MudHlwZV18fFtdLGM9ay5ldmVudC5zcGVjaWFsW3MudHlwZV18fHt9O2Zvcih1WzBdPXMsdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspdVt0XT1hcmd1bWVudHNbdF07aWYocy5kZWxlZ2F0ZVRhcmdldD10aGlzLCFjLnByZURpc3BhdGNofHwhMSE9PWMucHJlRGlzcGF0Y2guY2FsbCh0aGlzLHMpKXthPWsuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLHMsbCksdD0wO3doaWxlKChpPWFbdCsrXSkmJiFzLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe3MuY3VycmVudFRhcmdldD1pLmVsZW0sbj0wO3doaWxlKChvPWkuaGFuZGxlcnNbbisrXSkmJiFzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpcy5ybmFtZXNwYWNlJiYhMSE9PW8ubmFtZXNwYWNlJiYhcy5ybmFtZXNwYWNlLnRlc3Qoby5uYW1lc3BhY2UpfHwocy5oYW5kbGVPYmo9byxzLmRhdGE9by5kYXRhLHZvaWQgMCE9PShyPSgoay5ldmVudC5zcGVjaWFsW28ub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxvLmhhbmRsZXIpLmFwcGx5KGkuZWxlbSx1KSkmJiExPT09KHMucmVzdWx0PXIpJiYocy5wcmV2ZW50RGVmYXVsdCgpLHMuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gYy5wb3N0RGlzcGF0Y2gmJmMucG9zdERpc3BhdGNoLmNhbGwodGhpcyxzKSxzLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzPVtdLHU9dC5kZWxlZ2F0ZUNvdW50LGw9ZS50YXJnZXQ7aWYodSYmbC5ub2RlVHlwZSYmISgiY2xpY2siPT09ZS50eXBlJiYxPD1lLmJ1dHRvbikpZm9yKDtsIT09dGhpcztsPWwucGFyZW50Tm9kZXx8dGhpcylpZigxPT09bC5ub2RlVHlwZSYmKCJjbGljayIhPT1lLnR5cGV8fCEwIT09bC5kaXNhYmxlZCkpe2ZvcihvPVtdLGE9e30sbj0wO248dTtuKyspdm9pZCAwPT09YVtpPShyPXRbbl0pLnNlbGVjdG9yKyIgIl0mJihhW2ldPXIubmVlZHNDb250ZXh0Py0xPGsoaSx0aGlzKS5pbmRleChsKTprLmZpbmQoaSx0aGlzLG51bGwsW2xdKS5sZW5ndGgpLGFbaV0mJm8ucHVzaChyKTtvLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6b30pfXJldHVybiBsPXRoaXMsdTx0Lmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6dC5zbGljZSh1KX0pLHN9LGFkZFByb3A6ZnVuY3Rpb24odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoay5FdmVudC5wcm90b3R5cGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0Om0oZSk/ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIGUodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFt0XX0sc2V0OmZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KX19KX0sZml4OmZ1bmN0aW9uKGUpe3JldHVybiBlW2suZXhwYW5kb10/ZTpuZXcgay5FdmVudChlKX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGNsaWNrOntzZXR1cDpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmRGUodCwiY2xpY2siLGtlKSwhMX0sdHJpZ2dlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmRGUodCwiY2xpY2siKSwhMH0sX2RlZmF1bHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7cmV0dXJuIHBlLnRlc3QodC50eXBlKSYmdC5jbGljayYmQSh0LCJpbnB1dCIpJiZRLmdldCh0LCJjbGljayIpfHxBKHQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUucmVzdWx0JiZlLm9yaWdpbmFsRXZlbnQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19fSxrLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXImJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4pfSxrLkV2ZW50PWZ1bmN0aW9uKGUsdCl7aWYoISh0aGlzIGluc3RhbmNlb2Ygay5FdmVudCkpcmV0dXJuIG5ldyBrLkV2ZW50KGUsdCk7ZSYmZS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9ZSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWUuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09ZS5kZWZhdWx0UHJldmVudGVkJiYhMT09PWUucmV0dXJuVmFsdWU/a2U6U2UsdGhpcy50YXJnZXQ9ZS50YXJnZXQmJjM9PT1lLnRhcmdldC5ub2RlVHlwZT9lLnRhcmdldC5wYXJlbnROb2RlOmUudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD1lLmN1cnJlbnRUYXJnZXQsdGhpcy5yZWxhdGVkVGFyZ2V0PWUucmVsYXRlZFRhcmdldCk6dGhpcy50eXBlPWUsdCYmay5leHRlbmQodGhpcyx0KSx0aGlzLnRpbWVTdGFtcD1lJiZlLnRpbWVTdGFtcHx8RGF0ZS5ub3coKSx0aGlzW2suZXhwYW5kb109ITB9LGsuRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjprLkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDpTZSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpTZSxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpTZSxpc1NpbXVsYXRlZDohMSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1rZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1rZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9a2UsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LGsuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCwiY2hhciI6ITAsY29kZTohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbihlKXt2YXIgdD1lLmJ1dHRvbjtyZXR1cm4gbnVsbD09ZS53aGljaCYmVGUudGVzdChlLnR5cGUpP251bGwhPWUuY2hhckNvZGU/ZS5jaGFyQ29kZTplLmtleUNvZGU6IWUud2hpY2gmJnZvaWQgMCE9PXQmJkNlLnRlc3QoZS50eXBlKT8xJnQ/MToyJnQ/Mzo0JnQ/MjowOmUud2hpY2h9fSxrLmV2ZW50LmFkZFByb3ApLGsuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXtrLmV2ZW50LnNwZWNpYWxbZV09e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIERlKHRoaXMsZSxOZSksITF9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gRGUodGhpcyxlKSwhMH0sZGVsZWdhdGVUeXBlOnR9fSksay5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLGkpe2suZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOmksYmluZFR5cGU6aSxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLnJlbGF0ZWRUYXJnZXQscj1lLmhhbmRsZU9iajtyZXR1cm4gbiYmKG49PT10aGlzfHxrLmNvbnRhaW5zKHRoaXMsbikpfHwoZS50eXBlPXIub3JpZ1R5cGUsdD1yLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT1pKSx0fX19KSxrLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIEFlKHRoaXMsZSx0LG4scil9LG9uZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gQWUodGhpcyxlLHQsbixyLDEpfSxvZmY6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7aWYoZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5oYW5kbGVPYmopcmV0dXJuIHI9ZS5oYW5kbGVPYmosayhlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2U/ci5vcmlnVHlwZSsiLiIrci5uYW1lc3BhY2U6ci5vcmlnVHlwZSxyLnNlbGVjdG9yLHIuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIGUpe2ZvcihpIGluIGUpdGhpcy5vZmYoaSx0LGVbaV0pO3JldHVybiB0aGlzfXJldHVybiExIT09dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHR8fChuPXQsdD12b2lkIDApLCExPT09biYmKG49U2UpLHRoaXMuZWFjaChmdW5jdGlvbigpe2suZXZlbnQucmVtb3ZlKHRoaXMsZSxuLHQpfSl9fSk7dmFyIGplPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKVtePl0qKVwvPi9naSxxZT0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxMZT0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxIZT0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2c7ZnVuY3Rpb24gT2UoZSx0KXtyZXR1cm4gQShlLCJ0YWJsZSIpJiZBKDExIT09dC5ub2RlVHlwZT90OnQuZmlyc3RDaGlsZCwidHIiKSYmayhlKS5jaGlsZHJlbigidGJvZHkiKVswXXx8ZX1mdW5jdGlvbiBQZShlKXtyZXR1cm4gZS50eXBlPShudWxsIT09ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2UudHlwZSxlfWZ1bmN0aW9uIFJlKGUpe3JldHVybiJ0cnVlLyI9PT0oZS50eXBlfHwiIikuc2xpY2UoMCw1KT9lLnR5cGU9ZS50eXBlLnNsaWNlKDUpOmUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksZX1mdW5jdGlvbiBNZShlLHQpe3ZhciBuLHIsaSxvLGEscyx1LGw7aWYoMT09PXQubm9kZVR5cGUpe2lmKFEuaGFzRGF0YShlKSYmKG89US5hY2Nlc3MoZSksYT1RLnNldCh0LG8pLGw9by5ldmVudHMpKWZvcihpIGluIGRlbGV0ZSBhLmhhbmRsZSxhLmV2ZW50cz17fSxsKWZvcihuPTAscj1sW2ldLmxlbmd0aDtuPHI7bisrKWsuZXZlbnQuYWRkKHQsaSxsW2ldW25dKTtKLmhhc0RhdGEoZSkmJihzPUouYWNjZXNzKGUpLHU9ay5leHRlbmQoe30scyksSi5zZXQodCx1KSl9fWZ1bmN0aW9uIEllKG4scixpLG8pe3I9Zy5hcHBseShbXSxyKTt2YXIgZSx0LGEscyx1LGwsYz0wLGY9bi5sZW5ndGgscD1mLTEsZD1yWzBdLGg9bShkKTtpZihofHwxPGYmJiJzdHJpbmciPT10eXBlb2YgZCYmIXkuY2hlY2tDbG9uZSYmTGUudGVzdChkKSlyZXR1cm4gbi5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PW4uZXEoZSk7aCYmKHJbMF09ZC5jYWxsKHRoaXMsZSx0Lmh0bWwoKSkpLEllKHQscixpLG8pfSk7aWYoZiYmKHQ9KGU9d2UocixuWzBdLm93bmVyRG9jdW1lbnQsITEsbixvKSkuZmlyc3RDaGlsZCwxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aCYmKGU9dCksdHx8bykpe2ZvcihzPShhPWsubWFwKHZlKGUsInNjcmlwdCIpLFBlKSkubGVuZ3RoO2M8ZjtjKyspdT1lLGMhPT1wJiYodT1rLmNsb25lKHUsITAsITApLHMmJmsubWVyZ2UoYSx2ZSh1LCJzY3JpcHQiKSkpLGkuY2FsbChuW2NdLHUsYyk7aWYocylmb3IobD1hW2EubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsay5tYXAoYSxSZSksYz0wO2M8cztjKyspdT1hW2NdLGhlLnRlc3QodS50eXBlfHwiIikmJiFRLmFjY2Vzcyh1LCJnbG9iYWxFdmFsIikmJmsuY29udGFpbnMobCx1KSYmKHUuc3JjJiYibW9kdWxlIiE9PSh1LnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpP2suX2V2YWxVcmwmJiF1Lm5vTW9kdWxlJiZrLl9ldmFsVXJsKHUuc3JjLHtub25jZTp1Lm5vbmNlfHx1LmdldEF0dHJpYnV0ZSgibm9uY2UiKX0pOmIodS50ZXh0Q29udGVudC5yZXBsYWNlKEhlLCIiKSx1LGwpKX1yZXR1cm4gbn1mdW5jdGlvbiBXZShlLHQsbil7Zm9yKHZhciByLGk9dD9rLmZpbHRlcih0LGUpOmUsbz0wO251bGwhPShyPWlbb10pO28rKylufHwxIT09ci5ub2RlVHlwZXx8ay5jbGVhbkRhdGEodmUocikpLHIucGFyZW50Tm9kZSYmKG4mJm9lKHIpJiZ5ZSh2ZShyLCJzY3JpcHQiKSksci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpKTtyZXR1cm4gZX1rLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGplLCI8JDE+PC8kMj4iKX0sY2xvbmU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsLGM9ZS5jbG9uZU5vZGUoITApLGY9b2UoZSk7aWYoISh5Lm5vQ2xvbmVDaGVja2VkfHwxIT09ZS5ub2RlVHlwZSYmMTEhPT1lLm5vZGVUeXBlfHxrLmlzWE1MRG9jKGUpKSlmb3IoYT12ZShjKSxyPTAsaT0obz12ZShlKSkubGVuZ3RoO3I8aTtyKyspcz1vW3JdLHU9YVtyXSx2b2lkIDAsImlucHV0Ij09PShsPXUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkmJnBlLnRlc3Qocy50eXBlKT91LmNoZWNrZWQ9cy5jaGVja2VkOiJpbnB1dCIhPT1sJiYidGV4dGFyZWEiIT09bHx8KHUuZGVmYXVsdFZhbHVlPXMuZGVmYXVsdFZhbHVlKTtpZih0KWlmKG4pZm9yKG89b3x8dmUoZSksYT1hfHx2ZShjKSxyPTAsaT1vLmxlbmd0aDtyPGk7cisrKU1lKG9bcl0sYVtyXSk7ZWxzZSBNZShlLGMpO3JldHVybiAwPChhPXZlKGMsInNjcmlwdCIpKS5sZW5ndGgmJnllKGEsIWYmJnZlKGUsInNjcmlwdCIpKSxjfSxjbGVhbkRhdGE6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scixpPWsuZXZlbnQuc3BlY2lhbCxvPTA7dm9pZCAwIT09KG49ZVtvXSk7bysrKWlmKEcobikpe2lmKHQ9bltRLmV4cGFuZG9dKXtpZih0LmV2ZW50cylmb3IociBpbiB0LmV2ZW50cylpW3JdP2suZXZlbnQucmVtb3ZlKG4scik6ay5yZW1vdmVFdmVudChuLHIsdC5oYW5kbGUpO25bUS5leHBhbmRvXT12b2lkIDB9bltKLmV4cGFuZG9dJiYobltKLmV4cGFuZG9dPXZvaWQgMCl9fX0pLGsuZm4uZXh0ZW5kKHtkZXRhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIFdlKHRoaXMsZSwhMCl9LHJlbW92ZTpmdW5jdGlvbihlKXtyZXR1cm4gV2UodGhpcyxlKX0sdGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gXyh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP2sudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHwodGhpcy50ZXh0Q29udGVudD1lKX0pfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiBJZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8T2UodGhpcyxlKS5hcHBlbmRDaGlsZChlKX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEllKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgdD1PZSh0aGlzLGUpO3QuaW5zZXJ0QmVmb3JlKGUsdC5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIEllKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIEllKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMubmV4dFNpYmxpbmcpfSl9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9MDtudWxsIT0oZT10aGlzW3RdKTt0KyspMT09PWUubm9kZVR5cGUmJihrLmNsZWFuRGF0YSh2ZShlLCExKSksZS50ZXh0Q29udGVudD0iIik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9bnVsbCE9ZSYmZSx0PW51bGw9PXQ/ZTp0LHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGsuY2xvbmUodGhpcyxlLHQpfSl9LGh0bWw6ZnVuY3Rpb24oZSl7cmV0dXJuIF8odGhpcyxmdW5jdGlvbihlKXt2YXIgdD10aGlzWzBdfHx7fSxuPTAscj10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT1lJiYxPT09dC5ub2RlVHlwZSlyZXR1cm4gdC5pbm5lckhUTUw7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYhcWUudGVzdChlKSYmIWdlWyhkZS5leGVjKGUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7ZT1rLmh0bWxQcmVmaWx0ZXIoZSk7dHJ5e2Zvcig7bjxyO24rKykxPT09KHQ9dGhpc1tuXXx8e30pLm5vZGVUeXBlJiYoay5jbGVhbkRhdGEodmUodCwhMSkpLHQuaW5uZXJIVE1MPWUpO3Q9MH1jYXRjaChlKXt9fXQmJnRoaXMuZW1wdHkoKS5hcHBlbmQoZSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgbj1bXTtyZXR1cm4gSWUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO2suaW5BcnJheSh0aGlzLG4pPDAmJihrLmNsZWFuRGF0YSh2ZSh0aGlzKSksdCYmdC5yZXBsYWNlQ2hpbGQoZSx0aGlzKSl9LG4pfX0pLGsuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGUsYSl7ay5mbltlXT1mdW5jdGlvbihlKXtmb3IodmFyIHQsbj1bXSxyPWsoZSksaT1yLmxlbmd0aC0xLG89MDtvPD1pO28rKyl0PW89PT1pP3RoaXM6dGhpcy5jbG9uZSghMCksayhyW29dKVthXSh0KSx1LmFwcGx5KG4sdC5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4pfX0pO3ZhciAkZT1uZXcgUmVnRXhwKCJeKCIrdGUrIikoPyFweClbYS16JV0rJCIsImkiKSxGZT1mdW5jdGlvbihlKXt2YXIgdD1lLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIHQmJnQub3BlbmVyfHwodD1DKSx0LmdldENvbXB1dGVkU3R5bGUoZSl9LEJlPW5ldyBSZWdFeHAocmUuam9pbigifCIpLCJpIik7ZnVuY3Rpb24gX2UoZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5zdHlsZTtyZXR1cm4obj1ufHxGZShlKSkmJigiIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSl8fG9lKGUpfHwoYT1rLnN0eWxlKGUsdCkpLCF5LnBpeGVsQm94U3R5bGVzKCkmJiRlLnRlc3QoYSkmJkJlLnRlc3QodCkmJihyPXMud2lkdGgsaT1zLm1pbldpZHRoLG89cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1pLHMubWF4V2lkdGg9bykpLHZvaWQgMCE9PWE/YSsiIjphfWZ1bmN0aW9uIHplKGUsdCl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCFlKCkpcmV0dXJuKHRoaXMuZ2V0PXQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX0hZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7aWYodSl7cy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIix1LnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLGllLmFwcGVuZENoaWxkKHMpLmFwcGVuZENoaWxkKHUpO3ZhciBlPUMuZ2V0Q29tcHV0ZWRTdHlsZSh1KTtuPSIxJSIhPT1lLnRvcCxhPTEyPT09dChlLm1hcmdpbkxlZnQpLHUuc3R5bGUucmlnaHQ9IjYwJSIsbz0zNj09PXQoZS5yaWdodCkscj0zNj09PXQoZS53aWR0aCksdS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGk9MTI9PT10KHUub2Zmc2V0V2lkdGgvMyksaWUucmVtb3ZlQ2hpbGQocyksdT1udWxsfX1mdW5jdGlvbiB0KGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciBuLHIsaSxvLGEscz1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHU9RS5jcmVhdGVFbGVtZW50KCJkaXYiKTt1LnN0eWxlJiYodS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLHUuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIix5LmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09dS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxrLmV4dGVuZCh5LHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBlKCkscn0scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLG99LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLG59LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiBlKCksYX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiBlKCksaX19KSl9KCk7dmFyIFVlPVsiV2Via2l0IiwiTW96IiwibXMiXSxYZT1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLFZlPXt9O2Z1bmN0aW9uIEdlKGUpe3ZhciB0PWsuY3NzUHJvcHNbZV18fFZlW2VdO3JldHVybiB0fHwoZSBpbiBYZT9lOlZlW2VdPWZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLG49VWUubGVuZ3RoO3doaWxlKG4tLSlpZigoZT1VZVtuXSt0KWluIFhlKXJldHVybiBlfShlKXx8ZSl9dmFyIFllPS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxRZT0vXi0tLyxKZT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sS2U9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9O2Z1bmN0aW9uIFplKGUsdCxuKXt2YXIgcj1uZS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTp0fWZ1bmN0aW9uIGV0KGUsdCxuLHIsaSxvKXt2YXIgYT0id2lkdGgiPT09dD8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPWsuY3NzKGUsbityZVthXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKHUtPWsuY3NzKGUsInBhZGRpbmciK3JlW2FdLCEwLGkpKSwibWFyZ2luIiE9PW4mJih1LT1rLmNzcyhlLCJib3JkZXIiK3JlW2FdKyJXaWR0aCIsITAsaSkpKToodSs9ay5jc3MoZSwicGFkZGluZyIrcmVbYV0sITAsaSksInBhZGRpbmciIT09bj91Kz1rLmNzcyhlLCJib3JkZXIiK3JlW2FdKyJXaWR0aCIsITAsaSk6cys9ay5jc3MoZSwiYm9yZGVyIityZVthXSsiV2lkdGgiLCEwLGkpKTtyZXR1cm4hciYmMDw9byYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLW8tdS1zLS41KSl8fDApLHV9ZnVuY3Rpb24gdHQoZSx0LG4pe3ZhciByPUZlKGUpLGk9KCF5LmJveFNpemluZ1JlbGlhYmxlKCl8fG4pJiYiYm9yZGVyLWJveCI9PT1rLmNzcyhlLCJib3hTaXppbmciLCExLHIpLG89aSxhPV9lKGUsdCxyKSxzPSJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2lmKCRlLnRlc3QoYSkpe2lmKCFuKXJldHVybiBhO2E9ImF1dG8ifXJldHVybigheS5ib3hTaXppbmdSZWxpYWJsZSgpJiZpfHwiYXV0byI9PT1hfHwhcGFyc2VGbG9hdChhKSYmImlubGluZSI9PT1rLmNzcyhlLCJkaXNwbGF5IiwhMSxyKSkmJmUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJihpPSJib3JkZXItYm94Ij09PWsuY3NzKGUsImJveFNpemluZyIsITEsciksKG89cyBpbiBlKSYmKGE9ZVtzXSkpLChhPXBhcnNlRmxvYXQoYSl8fDApK2V0KGUsdCxufHwoaT8iYm9yZGVyIjoiY29udGVudCIpLG8scixhKSsicHgifWZ1bmN0aW9uIG50KGUsdCxuLHIsaSl7cmV0dXJuIG5ldyBudC5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfWsuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49X2UoZSwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsZ3JpZEFyZWE6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TdGFydDohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1N0YXJ0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6e30sc3R5bGU6ZnVuY3Rpb24oZSx0LG4scil7aWYoZSYmMyE9PWUubm9kZVR5cGUmJjghPT1lLm5vZGVUeXBlJiZlLnN0eWxlKXt2YXIgaSxvLGEscz1WKHQpLHU9UWUudGVzdCh0KSxsPWUuc3R5bGU7aWYodXx8KHQ9R2UocykpLGE9ay5jc3NIb29rc1t0XXx8ay5jc3NIb29rc1tzXSx2b2lkIDA9PT1uKXJldHVybiBhJiYiZ2V0ImluIGEmJnZvaWQgMCE9PShpPWEuZ2V0KGUsITEscikpP2k6bFt0XTsic3RyaW5nIj09PShvPXR5cGVvZiBuKSYmKGk9bmUuZXhlYyhuKSkmJmlbMV0mJihuPWxlKGUsdCxpKSxvPSJudW1iZXIiKSxudWxsIT1uJiZuPT1uJiYoIm51bWJlciIhPT1vfHx1fHwobis9aSYmaVszXXx8KGsuY3NzTnVtYmVyW3NdPyIiOiJweCIpKSx5LmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1ufHwwIT09dC5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChsW3RdPSJpbmhlcml0IiksYSYmInNldCJpbiBhJiZ2b2lkIDA9PT0obj1hLnNldChlLG4scikpfHwodT9sLnNldFByb3BlcnR5KHQsbik6bFt0XT1uKSl9fSxjc3M6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHM9Vih0KTtyZXR1cm4gUWUudGVzdCh0KXx8KHQ9R2UocykpLChhPWsuY3NzSG9va3NbdF18fGsuY3NzSG9va3Nbc10pJiYiZ2V0ImluIGEmJihpPWEuZ2V0KGUsITAsbikpLHZvaWQgMD09PWkmJihpPV9lKGUsdCxyKSksIm5vcm1hbCI9PT1pJiZ0IGluIEtlJiYoaT1LZVt0XSksIiI9PT1ufHxuPyhvPXBhcnNlRmxvYXQoaSksITA9PT1ufHxpc0Zpbml0ZShvKT9vfHwwOmkpOml9fSksay5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihlLHUpe2suY3NzSG9va3NbdV09e2dldDpmdW5jdGlvbihlLHQsbil7aWYodClyZXR1cm4hWWUudGVzdChrLmNzcyhlLCJkaXNwbGF5IikpfHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiZlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoP3R0KGUsdSxuKTp1ZShlLEplLGZ1bmN0aW9uKCl7cmV0dXJuIHR0KGUsdSxuKX0pfSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9RmUoZSksbz0heS5zY3JvbGxib3hTaXplKCkmJiJhYnNvbHV0ZSI9PT1pLnBvc2l0aW9uLGE9KG98fG4pJiYiYm9yZGVyLWJveCI9PT1rLmNzcyhlLCJib3hTaXppbmciLCExLGkpLHM9bj9ldChlLHUsbixhLGkpOjA7cmV0dXJuIGEmJm8mJihzLT1NYXRoLmNlaWwoZVsib2Zmc2V0Iit1WzBdLnRvVXBwZXJDYXNlKCkrdS5zbGljZSgxKV0tcGFyc2VGbG9hdChpW3VdKS1ldChlLHUsImJvcmRlciIsITEsaSktLjUpKSxzJiYocj1uZS5leGVjKHQpKSYmInB4IiE9PShyWzNdfHwicHgiKSYmKGUuc3R5bGVbdV09dCx0PWsuY3NzKGUsdSkpLFplKDAsdCxzKX19fSksay5jc3NIb29rcy5tYXJnaW5MZWZ0PXplKHkucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4ocGFyc2VGbG9hdChfZShlLCJtYXJnaW5MZWZ0IikpfHxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtdWUoZSx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4In0pLGsuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGksbyl7ay5jc3NIb29rc1tpK29dPXtleHBhbmQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj17fSxyPSJzdHJpbmciPT10eXBlb2YgZT9lLnNwbGl0KCIgIik6W2VdO3Q8NDt0KyspbltpK3JlW3RdK29dPXJbdF18fHJbdC0yXXx8clswXTtyZXR1cm4gbn19LCJtYXJnaW4iIT09aSYmKGsuY3NzSG9va3NbaStvXS5zZXQ9WmUpfSksay5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLHQpe3JldHVybiBfKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fSxhPTA7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHI9RmUoZSksaT10Lmxlbmd0aDthPGk7YSsrKW9bdFthXV09ay5jc3MoZSx0W2FdLCExLHIpO3JldHVybiBvfXJldHVybiB2b2lkIDAhPT1uP2suc3R5bGUoZSx0LG4pOmsuY3NzKGUsdCl9LGUsdCwxPGFyZ3VtZW50cy5sZW5ndGgpfX0pLCgoay5Ud2Vlbj1udCkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpudCxpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHxrLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9dCx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9b3x8KGsuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgZT1udC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gZSYmZS5nZXQ/ZS5nZXQodGhpcyk6bnQucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGUpe3ZhciB0LG49bnQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz10PWsuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTpudC5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSkuaW5pdC5wcm90b3R5cGU9bnQucHJvdG90eXBlLChudC5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIDEhPT1lLmVsZW0ubm9kZVR5cGV8fG51bGwhPWUuZWxlbVtlLnByb3BdJiZudWxsPT1lLmVsZW0uc3R5bGVbZS5wcm9wXT9lLmVsZW1bZS5wcm9wXToodD1rLmNzcyhlLmVsZW0sZS5wcm9wLCIiKSkmJiJhdXRvIiE9PXQ/dDowfSxzZXQ6ZnVuY3Rpb24oZSl7ay5meC5zdGVwW2UucHJvcF0/ay5meC5zdGVwW2UucHJvcF0oZSk6MSE9PWUuZWxlbS5ub2RlVHlwZXx8IWsuY3NzSG9va3NbZS5wcm9wXSYmbnVsbD09ZS5lbGVtLnN0eWxlW0dlKGUucHJvcCldP2UuZWxlbVtlLnByb3BdPWUubm93Omsuc3R5bGUoZS5lbGVtLGUucHJvcCxlLm5vdytlLnVuaXQpfX19KS5zY3JvbGxUb3A9bnQucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihlKXtlLmVsZW0ubm9kZVR5cGUmJmUuZWxlbS5wYXJlbnROb2RlJiYoZS5lbGVtW2UucHJvcF09ZS5ub3cpfX0say5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc3dpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuLjUtTWF0aC5jb3MoZSpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxrLmZ4PW50LnByb3RvdHlwZS5pbml0LGsuZnguc3RlcD17fTt2YXIgcnQsaXQsb3QsYXQsc3Q9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLHV0PS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gbHQoKXtpdCYmKCExPT09RS5oaWRkZW4mJkMucmVxdWVzdEFuaW1hdGlvbkZyYW1lP0MucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGx0KTpDLnNldFRpbWVvdXQobHQsay5meC5pbnRlcnZhbCksay5meC50aWNrKCkpfWZ1bmN0aW9uIGN0KCl7cmV0dXJuIEMuc2V0VGltZW91dChmdW5jdGlvbigpe3J0PXZvaWQgMH0pLHJ0PURhdGUubm93KCl9ZnVuY3Rpb24gZnQoZSx0KXt2YXIgbixyPTAsaT17aGVpZ2h0OmV9O2Zvcih0PXQ/MTowO3I8NDtyKz0yLXQpaVsibWFyZ2luIisobj1yZVtyXSldPWlbInBhZGRpbmciK25dPWU7cmV0dXJuIHQmJihpLm9wYWNpdHk9aS53aWR0aD1lKSxpfWZ1bmN0aW9uIHB0KGUsdCxuKXtmb3IodmFyIHIsaT0oZHQudHdlZW5lcnNbdF18fFtdKS5jb25jYXQoZHQudHdlZW5lcnNbIioiXSksbz0wLGE9aS5sZW5ndGg7bzxhO28rKylpZihyPWlbb10uY2FsbChuLHQsZSkpcmV0dXJuIHJ9ZnVuY3Rpb24gZHQobyxlLHQpe3ZhciBuLGEscj0wLGk9ZHQucHJlZmlsdGVycy5sZW5ndGgscz1rLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihhKXJldHVybiExO2Zvcih2YXIgZT1ydHx8Y3QoKSx0PU1hdGgubWF4KDAsbC5zdGFydFRpbWUrbC5kdXJhdGlvbi1lKSxuPTEtKHQvbC5kdXJhdGlvbnx8MCkscj0wLGk9bC50d2VlbnMubGVuZ3RoO3I8aTtyKyspbC50d2VlbnNbcl0ucnVuKG4pO3JldHVybiBzLm5vdGlmeVdpdGgobyxbbCxuLHRdKSxuPDEmJmk/dDooaXx8cy5ub3RpZnlXaXRoKG8sW2wsMSwwXSkscy5yZXNvbHZlV2l0aChvLFtsXSksITEpfSxsPXMucHJvbWlzZSh7ZWxlbTpvLHByb3BzOmsuZXh0ZW5kKHt9LGUpLG9wdHM6ay5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e30sZWFzaW5nOmsuZWFzaW5nLl9kZWZhdWx0fSx0KSxvcmlnaW5hbFByb3BlcnRpZXM6ZSxvcmlnaW5hbE9wdGlvbnM6dCxzdGFydFRpbWU6cnR8fGN0KCksZHVyYXRpb246dC5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oZSx0KXt2YXIgbj1rLlR3ZWVuKG8sbC5vcHRzLGUsdCxsLm9wdHMuc3BlY2lhbEVhc2luZ1tlXXx8bC5vcHRzLmVhc2luZyk7cmV0dXJuIGwudHdlZW5zLnB1c2gobiksbn0sc3RvcDpmdW5jdGlvbihlKXt2YXIgdD0wLG49ZT9sLnR3ZWVucy5sZW5ndGg6MDtpZihhKXJldHVybiB0aGlzO2ZvcihhPSEwO3Q8bjt0KyspbC50d2VlbnNbdF0ucnVuKDEpO3JldHVybiBlPyhzLm5vdGlmeVdpdGgobyxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKG8sW2wsZV0pKTpzLnJlamVjdFdpdGgobyxbbCxlXSksdGhpc319KSxjPWwucHJvcHM7Zm9yKCFmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGE7Zm9yKG4gaW4gZSlpZihpPXRbcj1WKG4pXSxvPWVbbl0sQXJyYXkuaXNBcnJheShvKSYmKGk9b1sxXSxvPWVbbl09b1swXSksbiE9PXImJihlW3JdPW8sZGVsZXRlIGVbbl0pLChhPWsuY3NzSG9va3Nbcl0pJiYiZXhwYW5kImluIGEpZm9yKG4gaW4gbz1hLmV4cGFuZChvKSxkZWxldGUgZVtyXSxvKW4gaW4gZXx8KGVbbl09b1tuXSx0W25dPWkpO2Vsc2UgdFtyXT1pfShjLGwub3B0cy5zcGVjaWFsRWFzaW5nKTtyPGk7cisrKWlmKG49ZHQucHJlZmlsdGVyc1tyXS5jYWxsKGwsbyxjLGwub3B0cykpcmV0dXJuIG0obi5zdG9wKSYmKGsuX3F1ZXVlSG9va3MobC5lbGVtLGwub3B0cy5xdWV1ZSkuc3RvcD1uLnN0b3AuYmluZChuKSksbjtyZXR1cm4gay5tYXAoYyxwdCxsKSxtKGwub3B0cy5zdGFydCkmJmwub3B0cy5zdGFydC5jYWxsKG8sbCksbC5wcm9ncmVzcyhsLm9wdHMucHJvZ3Jlc3MpLmRvbmUobC5vcHRzLmRvbmUsbC5vcHRzLmNvbXBsZXRlKS5mYWlsKGwub3B0cy5mYWlsKS5hbHdheXMobC5vcHRzLmFsd2F5cyksay5meC50aW1lcihrLmV4dGVuZCh1LHtlbGVtOm8sYW5pbTpsLHF1ZXVlOmwub3B0cy5xdWV1ZX0pKSxsfWsuQW5pbWF0aW9uPWsuZXh0ZW5kKGR0LHt0d2VlbmVyczp7IioiOltmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY3JlYXRlVHdlZW4oZSx0KTtyZXR1cm4gbGUobi5lbGVtLGUsbmUuZXhlYyh0KSxuKSxufV19LHR3ZWVuZXI6ZnVuY3Rpb24oZSx0KXttKGUpPyh0PWUsZT1bIioiXSk6ZT1lLm1hdGNoKFIpO2Zvcih2YXIgbixyPTAsaT1lLmxlbmd0aDtyPGk7cisrKW49ZVtyXSxkdC50d2VlbmVyc1tuXT1kdC50d2VlbmVyc1tuXXx8W10sZHQudHdlZW5lcnNbbl0udW5zaGlmdCh0KX0scHJlZmlsdGVyczpbZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsLGMsZj0id2lkdGgiaW4gdHx8ImhlaWdodCJpbiB0LHA9dGhpcyxkPXt9LGg9ZS5zdHlsZSxnPWUubm9kZVR5cGUmJnNlKGUpLHY9US5nZXQoZSwiZnhzaG93Iik7Zm9yKHIgaW4gbi5xdWV1ZXx8KG51bGw9PShhPWsuX3F1ZXVlSG9va3MoZSwiZngiKSkudW5xdWV1ZWQmJihhLnVucXVldWVkPTAscz1hLmVtcHR5LmZpcmUsYS5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7YS51bnF1ZXVlZHx8cygpfSksYS51bnF1ZXVlZCsrLHAuYWx3YXlzKGZ1bmN0aW9uKCl7cC5hbHdheXMoZnVuY3Rpb24oKXthLnVucXVldWVkLS0say5xdWV1ZShlLCJmeCIpLmxlbmd0aHx8YS5lbXB0eS5maXJlKCl9KX0pKSx0KWlmKGk9dFtyXSxzdC50ZXN0KGkpKXtpZihkZWxldGUgdFtyXSxvPW98fCJ0b2dnbGUiPT09aSxpPT09KGc/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWl8fCF2fHx2b2lkIDA9PT12W3JdKWNvbnRpbnVlO2c9ITB9ZFtyXT12JiZ2W3JdfHxrLnN0eWxlKGUscil9aWYoKHU9IWsuaXNFbXB0eU9iamVjdCh0KSl8fCFrLmlzRW1wdHlPYmplY3QoZCkpZm9yKHIgaW4gZiYmMT09PWUubm9kZVR5cGUmJihuLm92ZXJmbG93PVtoLm92ZXJmbG93LGgub3ZlcmZsb3dYLGgub3ZlcmZsb3dZXSxudWxsPT0obD12JiZ2LmRpc3BsYXkpJiYobD1RLmdldChlLCJkaXNwbGF5IikpLCJub25lIj09PShjPWsuY3NzKGUsImRpc3BsYXkiKSkmJihsP2M9bDooZmUoW2VdLCEwKSxsPWUuc3R5bGUuZGlzcGxheXx8bCxjPWsuY3NzKGUsImRpc3BsYXkiKSxmZShbZV0pKSksKCJpbmxpbmUiPT09Y3x8ImlubGluZS1ibG9jayI9PT1jJiZudWxsIT1sKSYmIm5vbmUiPT09ay5jc3MoZSwiZmxvYXQiKSYmKHV8fChwLmRvbmUoZnVuY3Rpb24oKXtoLmRpc3BsYXk9bH0pLG51bGw9PWwmJihjPWguZGlzcGxheSxsPSJub25lIj09PWM/IiI6YykpLGguZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihoLm92ZXJmbG93PSJoaWRkZW4iLHAuYWx3YXlzKGZ1bmN0aW9uKCl7aC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLGgub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0saC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKSx1PSExLGQpdXx8KHY/ImhpZGRlbiJpbiB2JiYoZz12LmhpZGRlbik6dj1RLmFjY2VzcyhlLCJmeHNob3ciLHtkaXNwbGF5Omx9KSxvJiYodi5oaWRkZW49IWcpLGcmJmZlKFtlXSwhMCkscC5kb25lKGZ1bmN0aW9uKCl7Zm9yKHIgaW4gZ3x8ZmUoW2VdKSxRLnJlbW92ZShlLCJmeHNob3ciKSxkKWsuc3R5bGUoZSxyLGRbcl0pfSkpLHU9cHQoZz92W3JdOjAscixwKSxyIGluIHZ8fCh2W3JdPXUuc3RhcnQsZyYmKHUuZW5kPXUuc3RhcnQsdS5zdGFydD0wKSl9XSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P2R0LnByZWZpbHRlcnMudW5zaGlmdChlKTpkdC5wcmVmaWx0ZXJzLnB1c2goZSl9fSksay5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP2suZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8bShlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYhbSh0KSYmdH07cmV0dXJuIGsuZngub2ZmP3IuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIGsuZnguc3BlZWRzP3IuZHVyYXRpb249ay5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj1rLmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT0iZngiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXttKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZrLmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0say5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoc2UpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPWsuaXNFbXB0eU9iamVjdCh0KSxvPWsuc3BlZWQoZSxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgZT1kdCh0aGlzLGsuZXh0ZW5kKHt9LHQpLG8pOyhpfHxRLmdldCh0aGlzLCJmaW5pc2giKSkmJmUuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fCExPT09by5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGksZSxvKXt2YXIgYT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KG8pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGkmJihvPWUsZT1pLGk9dm9pZCAwKSxlJiYhMSE9PWkmJnRoaXMucXVldWUoaXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9ITAsdD1udWxsIT1pJiZpKyJxdWV1ZUhvb2tzIixuPWsudGltZXJzLHI9US5nZXQodGhpcyk7aWYodClyW3RdJiZyW3RdLnN0b3AmJmEoclt0XSk7ZWxzZSBmb3IodCBpbiByKXJbdF0mJnJbdF0uc3RvcCYmdXQudGVzdCh0KSYmYShyW3RdKTtmb3IodD1uLmxlbmd0aDt0LS07KW5bdF0uZWxlbSE9PXRoaXN8fG51bGwhPWkmJm5bdF0ucXVldWUhPT1pfHwoblt0XS5hbmltLnN0b3AobyksZT0hMSxuLnNwbGljZSh0LDEpKTshZSYmb3x8ay5kZXF1ZXVlKHRoaXMsaSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiExIT09YSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsdD1RLmdldCh0aGlzKSxuPXRbYSsicXVldWUiXSxyPXRbYSsicXVldWVIb29rcyJdLGk9ay50aW1lcnMsbz1uP24ubGVuZ3RoOjA7Zm9yKHQuZmluaXNoPSEwLGsucXVldWUodGhpcyxhLFtdKSxyJiZyLnN0b3AmJnIuc3RvcC5jYWxsKHRoaXMsITApLGU9aS5sZW5ndGg7ZS0tOylpW2VdLmVsZW09PT10aGlzJiZpW2VdLnF1ZXVlPT09YSYmKGlbZV0uYW5pbS5zdG9wKCEwKSxpLnNwbGljZShlLDEpKTtmb3IoZT0wO2U8bztlKyspbltlXSYmbltlXS5maW5pc2gmJm5bZV0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIHQuZmluaXNofSl9fSksay5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHIpe3ZhciBpPWsuZm5bcl07ay5mbltyXT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09dHlwZW9mIGU/aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGZ0KHIsITApLGUsdCxuKX19KSxrLmVhY2goe3NsaWRlRG93bjpmdCgic2hvdyIpLHNsaWRlVXA6ZnQoImhpZGUiKSxzbGlkZVRvZ2dsZTpmdCgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHIpe2suZm5bZV09ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmFuaW1hdGUocixlLHQsbil9fSksay50aW1lcnM9W10say5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49ay50aW1lcnM7Zm9yKHJ0PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8ay5meC5zdG9wKCkscnQ9dm9pZCAwfSxrLmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe2sudGltZXJzLnB1c2goZSksay5meC5zdGFydCgpfSxrLmZ4LmludGVydmFsPTEzLGsuZnguc3RhcnQ9ZnVuY3Rpb24oKXtpdHx8KGl0PSEwLGx0KCkpfSxrLmZ4LnN0b3A9ZnVuY3Rpb24oKXtpdD1udWxsfSxrLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxrLmZuLmRlbGF5PWZ1bmN0aW9uKHIsZSl7cmV0dXJuIHI9ay5meCYmay5meC5zcGVlZHNbcl18fHIsZT1lfHwiZngiLHRoaXMucXVldWUoZSxmdW5jdGlvbihlLHQpe3ZhciBuPUMuc2V0VGltZW91dChlLHIpO3Quc3RvcD1mdW5jdGlvbigpe0MuY2xlYXJUaW1lb3V0KG4pfX0pfSxvdD1FLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYXQ9RS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChFLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxvdC50eXBlPSJjaGVja2JveCIseS5jaGVja09uPSIiIT09b3QudmFsdWUseS5vcHRTZWxlY3RlZD1hdC5zZWxlY3RlZCwob3Q9RS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS52YWx1ZT0idCIsb3QudHlwZT0icmFkaW8iLHkucmFkaW9WYWx1ZT0idCI9PT1vdC52YWx1ZTt2YXIgaHQsZ3Q9ay5leHByLmF0dHJIYW5kbGU7ay5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gXyh0aGlzLGsuYXR0cixlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ay5yZW1vdmVBdHRyKHRoaXMsZSl9KX19KSxrLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGUuZ2V0QXR0cmlidXRlP2sucHJvcChlLHQsbik6KDE9PT1vJiZrLmlzWE1MRG9jKGUpfHwoaT1rLmF0dHJIb29rc1t0LnRvTG93ZXJDYXNlKCldfHwoay5leHByLm1hdGNoLmJvb2wudGVzdCh0KT9odDp2b2lkIDApKSx2b2lkIDAhPT1uP251bGw9PT1uP3ZvaWQgay5yZW1vdmVBdHRyKGUsdCk6aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6KGUuc2V0QXR0cmlidXRlKHQsbisiIiksbik6aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjpudWxsPT0ocj1rLmZpbmQuYXR0cihlLHQpKT92b2lkIDA6cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIXkucmFkaW9WYWx1ZSYmInJhZGlvIj09PXQmJkEoZSwiaW5wdXQiKSl7dmFyIG49ZS52YWx1ZTtyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoInR5cGUiLHQpLG4mJihlLnZhbHVlPW4pLHR9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10JiZ0Lm1hdGNoKFIpO2lmKGkmJjE9PT1lLm5vZGVUeXBlKXdoaWxlKG49aVtyKytdKWUucmVtb3ZlQXR0cmlidXRlKG4pfX0pLGh0PXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExPT09dD9rLnJlbW92ZUF0dHIoZSxuKTplLnNldEF0dHJpYnV0ZShuLG4pLG59fSxrLmVhY2goay5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24oZSx0KXt2YXIgYT1ndFt0XXx8ay5maW5kLmF0dHI7Z3RbdF09ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz10LnRvTG93ZXJDYXNlKCk7cmV0dXJuIG58fChpPWd0W29dLGd0W29dPXIscj1udWxsIT1hKGUsdCxuKT9vOm51bGwsZ3Rbb109aSkscn19KTt2YXIgdnQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSx5dD0vXig/OmF8YXJlYSkkL2k7ZnVuY3Rpb24gbXQoZSl7cmV0dXJuKGUubWF0Y2goUil8fFtdKS5qb2luKCIgIil9ZnVuY3Rpb24geHQoZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24gYnQoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZToic3RyaW5nIj09dHlwZW9mIGUmJmUubWF0Y2goUil8fFtdfWsuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIF8odGhpcyxrLnByb3AsZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW2sucHJvcEZpeFtlXXx8ZV19KX19KSxrLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4gMT09PW8mJmsuaXNYTUxEb2MoZSl8fCh0PWsucHJvcEZpeFt0XXx8dCxpPWsucHJvcEhvb2tzW3RdKSx2b2lkIDAhPT1uP2kmJiJzZXQiaW4gaSYmdm9pZCAwIT09KHI9aS5zZXQoZSxuLHQpKT9yOmVbdF09bjppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOmVbdF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXt2YXIgdD1rLmZpbmQuYXR0cihlLCJ0YWJpbmRleCIpO3JldHVybiB0P3BhcnNlSW50KHQsMTApOnZ0LnRlc3QoZS5ub2RlTmFtZSl8fHl0LnRlc3QoZS5ub2RlTmFtZSkmJmUuaHJlZj8wOi0xfX19LHByb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifX0pLHkub3B0U2VsZWN0ZWR8fChrLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfSxzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3QmJih0LnNlbGVjdGVkSW5kZXgsdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCl9fSksay5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtrLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSksay5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8sYSxzLHU9MDtpZihtKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7ayh0aGlzKS5hZGRDbGFzcyh0LmNhbGwodGhpcyxlLHh0KHRoaXMpKSl9KTtpZigoZT1idCh0KSkubGVuZ3RoKXdoaWxlKG49dGhpc1t1KytdKWlmKGk9eHQobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK210KGkpKyIgIil7YT0wO3doaWxlKG89ZVthKytdKXIuaW5kZXhPZigiICIrbysiICIpPDAmJihyKz1vKyIgIik7aSE9PShzPW10KHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtrKHRoaXMpLnJlbW92ZUNsYXNzKHQuY2FsbCh0aGlzLGUseHQodGhpcykpKX0pO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmF0dHIoImNsYXNzIiwiIik7aWYoKGU9YnQodCkpLmxlbmd0aCl3aGlsZShuPXRoaXNbdSsrXSlpZihpPXh0KG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIittdChpKSsiICIpe2E9MDt3aGlsZShvPWVbYSsrXSl3aGlsZSgtMTxyLmluZGV4T2YoIiAiK28rIiAiKSlyPXIucmVwbGFjZSgiICIrbysiICIsIiAiKTtpIT09KHM9bXQocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihpLHQpe3ZhciBvPXR5cGVvZiBpLGE9InN0cmluZyI9PT1vfHxBcnJheS5pc0FycmF5KGkpO3JldHVybiJib29sZWFuIj09dHlwZW9mIHQmJmE/dD90aGlzLmFkZENsYXNzKGkpOnRoaXMucmVtb3ZlQ2xhc3MoaSk6bShpKT90aGlzLmVhY2goZnVuY3Rpb24oZSl7ayh0aGlzKS50b2dnbGVDbGFzcyhpLmNhbGwodGhpcyxlLHh0KHRoaXMpLHQpLHQpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7aWYoYSl7dD0wLG49ayh0aGlzKSxyPWJ0KGkpO3doaWxlKGU9clt0KytdKW4uaGFzQ2xhc3MoZSk/bi5yZW1vdmVDbGFzcyhlKTpuLmFkZENsYXNzKGUpfWVsc2Ugdm9pZCAwIT09aSYmImJvb2xlYW4iIT09b3x8KChlPXh0KHRoaXMpKSYmUS5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsZSksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsZXx8ITE9PT1pPyIiOlEuZ2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpKX0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHI9MDt0PSIgIitlKyIgIjt3aGlsZShuPXRoaXNbcisrXSlpZigxPT09bi5ub2RlVHlwZSYmLTE8KCIgIittdCh4dChuKSkrIiAiKS5pbmRleE9mKHQpKXJldHVybiEwO3JldHVybiExfX0pO3ZhciB3dD0vXHIvZztrLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKG4pe3ZhciByLGUsaSx0PXRoaXNbMF07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bShuKSx0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIHQ7MT09PXRoaXMubm9kZVR5cGUmJihudWxsPT0odD1pP24uY2FsbCh0aGlzLGUsayh0aGlzKS52YWwoKSk6bik/dD0iIjoibnVtYmVyIj09dHlwZW9mIHQ/dCs9IiI6QXJyYXkuaXNBcnJheSh0KSYmKHQ9ay5tYXAodCxmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplKyIifSkpLChyPWsudmFsSG9va3NbdGhpcy50eXBlXXx8ay52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmInNldCJpbiByJiZ2b2lkIDAhPT1yLnNldCh0aGlzLHQsInZhbHVlIil8fCh0aGlzLnZhbHVlPXQpKX0pKTp0PyhyPWsudmFsSG9va3NbdC50eXBlXXx8ay52YWxIb29rc1t0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiByJiZ2b2lkIDAhPT0oZT1yLmdldCh0LCJ2YWx1ZSIpKT9lOiJzdHJpbmciPT10eXBlb2YoZT10LnZhbHVlKT9lLnJlcGxhY2Uod3QsIiIpOm51bGw9PWU/IiI6ZTp2b2lkIDB9fSksay5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD1rLmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxsIT10P3Q6bXQoay50ZXh0KGUpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPWUub3B0aW9ucyxvPWUuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PWUudHlwZSxzPWE/bnVsbDpbXSx1PWE/bysxOmkubGVuZ3RoO2ZvcihyPW88MD91OmE/bzowO3I8dTtyKyspaWYoKChuPWlbcl0pLnNlbGVjdGVkfHxyPT09bykmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IUEobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD1rKG4pLnZhbCgpLGEpcmV0dXJuIHQ7cy5wdXNoKHQpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89ay5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pKChyPWlbYV0pLnNlbGVjdGVkPS0xPGsuaW5BcnJheShrLnZhbEhvb2tzLm9wdGlvbi5nZXQociksbykpJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX19KSxrLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtrLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBlLmNoZWNrZWQ9LTE8ay5pbkFycmF5KGsoZSkudmFsKCksdCl9fSx5LmNoZWNrT258fChrLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSkseS5mb2N1c2luPSJvbmZvY3VzaW4iaW4gQzt2YXIgVHQ9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLEN0PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O2suZXh0ZW5kKGsuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsLGMsZixwPVtufHxFXSxkPXYuY2FsbChlLCJ0eXBlIik/ZS50eXBlOmUsaD12LmNhbGwoZSwibmFtZXNwYWNlIik/ZS5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihvPWY9YT1uPW58fEUsMyE9PW4ubm9kZVR5cGUmJjghPT1uLm5vZGVUeXBlJiYhVHQudGVzdChkK2suZXZlbnQudHJpZ2dlcmVkKSYmKC0xPGQuaW5kZXhPZigiLiIpJiYoZD0oaD1kLnNwbGl0KCIuIikpLnNoaWZ0KCksaC5zb3J0KCkpLHU9ZC5pbmRleE9mKCI6Iik8MCYmIm9uIitkLChlPWVbay5leHBhbmRvXT9lOm5ldyBrLkV2ZW50KGQsIm9iamVjdCI9PXR5cGVvZiBlJiZlKSkuaXNUcmlnZ2VyPXI/MjozLGUubmFtZXNwYWNlPWguam9pbigiLiIpLGUucm5hbWVzcGFjZT1lLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsZS5yZXN1bHQ9dm9pZCAwLGUudGFyZ2V0fHwoZS50YXJnZXQ9biksdD1udWxsPT10P1tlXTprLm1ha2VBcnJheSh0LFtlXSksYz1rLmV2ZW50LnNwZWNpYWxbZF18fHt9LHJ8fCFjLnRyaWdnZXJ8fCExIT09Yy50cmlnZ2VyLmFwcGx5KG4sdCkpKXtpZighciYmIWMubm9CdWJibGUmJiF4KG4pKXtmb3Iocz1jLmRlbGVnYXRlVHlwZXx8ZCxUdC50ZXN0KHMrZCl8fChvPW8ucGFyZW50Tm9kZSk7bztvPW8ucGFyZW50Tm9kZSlwLnB1c2gobyksYT1vO2E9PT0obi5vd25lckRvY3VtZW50fHxFKSYmcC5wdXNoKGEuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93fHxDKX1pPTA7d2hpbGUoKG89cFtpKytdKSYmIWUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlmPW8sZS50eXBlPTE8aT9zOmMuYmluZFR5cGV8fGQsKGw9KFEuZ2V0KG8sImV2ZW50cyIpfHx7fSlbZS50eXBlXSYmUS5nZXQobywiaGFuZGxlIikpJiZsLmFwcGx5KG8sdCksKGw9dSYmb1t1XSkmJmwuYXBwbHkmJkcobykmJihlLnJlc3VsdD1sLmFwcGx5KG8sdCksITE9PT1lLnJlc3VsdCYmZS5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gZS50eXBlPWQscnx8ZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8Yy5fZGVmYXVsdCYmITEhPT1jLl9kZWZhdWx0LmFwcGx5KHAucG9wKCksdCl8fCFHKG4pfHx1JiZtKG5bZF0pJiYheChuKSYmKChhPW5bdV0pJiYoblt1XT1udWxsKSxrLmV2ZW50LnRyaWdnZXJlZD1kLGUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZi5hZGRFdmVudExpc3RlbmVyKGQsQ3QpLG5bZF0oKSxlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmYucmVtb3ZlRXZlbnRMaXN0ZW5lcihkLEN0KSxrLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsYSYmKG5bdV09YSkpLGUucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWsuZXh0ZW5kKG5ldyBrLkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMH0pO2suZXZlbnQudHJpZ2dlcihyLG51bGwsdCl9fSksay5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ay5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gay5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKX19KSx5LmZvY3VzaW58fGsuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24obixyKXt2YXIgaT1mdW5jdGlvbihlKXtrLmV2ZW50LnNpbXVsYXRlKHIsZS50YXJnZXQsay5ldmVudC5maXgoZSkpfTtrLmV2ZW50LnNwZWNpYWxbcl09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLHQ9US5hY2Nlc3MoZSxyKTt0fHxlLmFkZEV2ZW50TGlzdGVuZXIobixpLCEwKSxRLmFjY2VzcyhlLHIsKHR8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyx0PVEuYWNjZXNzKGUsciktMTt0P1EuYWNjZXNzKGUscix0KTooZS5yZW1vdmVFdmVudExpc3RlbmVyKG4saSwhMCksUS5yZW1vdmUoZSxyKSl9fX0pO3ZhciBFdD1DLmxvY2F0aW9uLGt0PURhdGUubm93KCksU3Q9L1w/LztrLnBhcnNlWE1MPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7dHJ5e3Q9KG5ldyBDLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGUsInRleHQveG1sIil9Y2F0Y2goZSl7dD12b2lkIDB9cmV0dXJuIHQmJiF0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8ay5lcnJvcigiSW52YWxpZCBYTUw6ICIrZSksdH07dmFyIE50PS9cW1xdJC8sQXQ9L1xyP1xuL2csRHQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLGp0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBxdChuLGUscixpKXt2YXIgdDtpZihBcnJheS5pc0FycmF5KGUpKWsuZWFjaChlLGZ1bmN0aW9uKGUsdCl7cnx8TnQudGVzdChuKT9pKG4sdCk6cXQobisiWyIrKCJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9dD9lOiIiKSsiXSIsdCxyLGkpfSk7ZWxzZSBpZihyfHwib2JqZWN0IiE9PXcoZSkpaShuLGUpO2Vsc2UgZm9yKHQgaW4gZSlxdChuKyJbIit0KyJdIixlW3RdLHIsaSl9ay5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1mdW5jdGlvbihlLHQpe3ZhciBuPW0odCk/dCgpOnQ7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYobnVsbD09ZSlyZXR1cm4iIjtpZihBcnJheS5pc0FycmF5KGUpfHxlLmpxdWVyeSYmIWsuaXNQbGFpbk9iamVjdChlKSlrLmVhY2goZSxmdW5jdGlvbigpe2kodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiBlKXF0KG4sZVtuXSx0LGkpO3JldHVybiByLmpvaW4oIiYiKX0say5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBrLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9ay5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGU/ay5tYWtlQXJyYXkoZSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhayh0aGlzKS5pcygiOmRpc2FibGVkIikmJmp0LnRlc3QodGhpcy5ub2RlTmFtZSkmJiFEdC50ZXN0KGUpJiYodGhpcy5jaGVja2VkfHwhcGUudGVzdChlKSl9KS5tYXAoZnVuY3Rpb24oZSx0KXt2YXIgbj1rKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6QXJyYXkuaXNBcnJheShuKT9rLm1hcChuLGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2UoQXQsIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKEF0LCJcclxuIil9fSkuZ2V0KCl9fSk7dmFyIEx0PS8lMjAvZyxIdD0vIy4qJC8sT3Q9LyhbPyZdKV89W14mXSovLFB0PS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKSQvZ20sUnQ9L14oPzpHRVR8SEVBRCkkLyxNdD0vXlwvXC8vLEl0PXt9LFd0PXt9LCR0PSIqLyIuY29uY2F0KCIqIiksRnQ9RS5jcmVhdGVFbGVtZW50KCJhIik7ZnVuY3Rpb24gQnQobyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7InN0cmluZyIhPXR5cGVvZiBlJiYodD1lLGU9IioiKTt2YXIgbixyPTAsaT1lLnRvTG93ZXJDYXNlKCkubWF0Y2goUil8fFtdO2lmKG0odCkpd2hpbGUobj1pW3IrK10pIisiPT09blswXT8obj1uLnNsaWNlKDEpfHwiKiIsKG9bbl09b1tuXXx8W10pLnVuc2hpZnQodCkpOihvW25dPW9bbl18fFtdKS5wdXNoKHQpfX1mdW5jdGlvbiBfdCh0LGksbyxhKXt2YXIgcz17fSx1PXQ9PT1XdDtmdW5jdGlvbiBsKGUpe3ZhciByO3JldHVybiBzW2VdPSEwLGsuZWFjaCh0W2VdfHxbXSxmdW5jdGlvbihlLHQpe3ZhciBuPXQoaSxvLGEpO3JldHVybiJzdHJpbmciIT10eXBlb2Ygbnx8dXx8c1tuXT91PyEocj1uKTp2b2lkIDA6KGkuZGF0YVR5cGVzLnVuc2hpZnQobiksbChuKSwhMSl9KSxyfXJldHVybiBsKGkuZGF0YVR5cGVzWzBdKXx8IXNbIioiXSYmbCgiKiIpfWZ1bmN0aW9uIHp0KGUsdCl7dmFyIG4scixpPWsuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXZvaWQgMCE9PXRbbl0mJigoaVtuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJmsuZXh0ZW5kKCEwLGUsciksZX1GdC5ocmVmPUV0LmhyZWYsay5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOkV0LmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOi9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLnRlc3QoRXQucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6JHQsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOmsucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P3p0KHp0KGUsay5hamF4U2V0dGluZ3MpLHQpOnp0KGsuYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOkJ0KEl0KSxhamF4VHJhbnNwb3J0OkJ0KFd0KSxhamF4OmZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBlJiYodD1lLGU9dm9pZCAwKSx0PXR8fHt9O3ZhciBjLGYscCxuLGQscixoLGcsaSxvLHY9ay5hamF4U2V0dXAoe30sdCkseT12LmNvbnRleHR8fHYsbT12LmNvbnRleHQmJih5Lm5vZGVUeXBlfHx5LmpxdWVyeSk/ayh5KTprLmV2ZW50LHg9ay5EZWZlcnJlZCgpLGI9ay5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksdz12LnN0YXR1c0NvZGV8fHt9LGE9e30scz17fSx1PSJjYW5jZWxlZCIsVD17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGgpe2lmKCFuKXtuPXt9O3doaWxlKHQ9UHQuZXhlYyhwKSluW3RbMV0udG9Mb3dlckNhc2UoKSsiICJdPShuW3RbMV0udG9Mb3dlckNhc2UoKSsiICJdfHxbXSkuY29uY2F0KHRbMl0pfXQ9bltlLnRvTG93ZXJDYXNlKCkrIiAiXX1yZXR1cm4gbnVsbD09dD9udWxsOnQuam9pbigiLCAiKX0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGg/cDpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWgmJihlPXNbZS50b0xvd2VyQ2FzZSgpXT1zW2UudG9Mb3dlckNhc2UoKV18fGUsYVtlXT10KSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1oJiYodi5taW1lVHlwZT1lKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGUpaWYoaClULmFsd2F5cyhlW1Quc3RhdHVzXSk7ZWxzZSBmb3IodCBpbiBlKXdbdF09W3dbdF0sZVt0XV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGUpe3ZhciB0PWV8fHU7cmV0dXJuIGMmJmMuYWJvcnQodCksbCgwLHQpLHRoaXN9fTtpZih4LnByb21pc2UoVCksdi51cmw9KChlfHx2LnVybHx8RXQuaHJlZikrIiIpLnJlcGxhY2UoTXQsRXQucHJvdG9jb2wrIi8vIiksdi50eXBlPXQubWV0aG9kfHx0LnR5cGV8fHYubWV0aG9kfHx2LnR5cGUsdi5kYXRhVHlwZXM9KHYuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChSKXx8WyIiXSxudWxsPT12LmNyb3NzRG9tYWluKXtyPUUuY3JlYXRlRWxlbWVudCgiYSIpO3RyeXtyLmhyZWY9di51cmwsci5ocmVmPXIuaHJlZix2LmNyb3NzRG9tYWluPUZ0LnByb3RvY29sKyIvLyIrRnQuaG9zdCE9ci5wcm90b2NvbCsiLy8iK3IuaG9zdH1jYXRjaChlKXt2LmNyb3NzRG9tYWluPSEwfX1pZih2LmRhdGEmJnYucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2Ygdi5kYXRhJiYodi5kYXRhPWsucGFyYW0odi5kYXRhLHYudHJhZGl0aW9uYWwpKSxfdChJdCx2LHQsVCksaClyZXR1cm4gVDtmb3IoaSBpbihnPWsuZXZlbnQmJnYuZ2xvYmFsKSYmMD09ay5hY3RpdmUrKyYmay5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSx2LnR5cGU9di50eXBlLnRvVXBwZXJDYXNlKCksdi5oYXNDb250ZW50PSFSdC50ZXN0KHYudHlwZSksZj12LnVybC5yZXBsYWNlKEh0LCIiKSx2Lmhhc0NvbnRlbnQ/di5kYXRhJiZ2LnByb2Nlc3NEYXRhJiYwPT09KHYuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmKHYuZGF0YT12LmRhdGEucmVwbGFjZShMdCwiKyIpKToobz12LnVybC5zbGljZShmLmxlbmd0aCksdi5kYXRhJiYodi5wcm9jZXNzRGF0YXx8InN0cmluZyI9PXR5cGVvZiB2LmRhdGEpJiYoZis9KFN0LnRlc3QoZik/IiYiOiI/Iikrdi5kYXRhLGRlbGV0ZSB2LmRhdGEpLCExPT09di5jYWNoZSYmKGY9Zi5yZXBsYWNlKE90LCIkMSIpLG89KFN0LnRlc3QoZik/IiYiOiI/IikrIl89IitrdCsrK28pLHYudXJsPWYrbyksdi5pZk1vZGlmaWVkJiYoay5sYXN0TW9kaWZpZWRbZl0mJlQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLGsubGFzdE1vZGlmaWVkW2ZdKSxrLmV0YWdbZl0mJlQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsay5ldGFnW2ZdKSksKHYuZGF0YSYmdi5oYXNDb250ZW50JiYhMSE9PXYuY29udGVudFR5cGV8fHQuY29udGVudFR5cGUpJiZULnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsdi5jb250ZW50VHlwZSksVC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLHYuZGF0YVR5cGVzWzBdJiZ2LmFjY2VwdHNbdi5kYXRhVHlwZXNbMF1dP3YuYWNjZXB0c1t2LmRhdGFUeXBlc1swXV0rKCIqIiE9PXYuZGF0YVR5cGVzWzBdPyIsICIrJHQrIjsgcT0wLjAxIjoiIik6di5hY2NlcHRzWyIqIl0pLHYuaGVhZGVycylULnNldFJlcXVlc3RIZWFkZXIoaSx2LmhlYWRlcnNbaV0pO2lmKHYuYmVmb3JlU2VuZCYmKCExPT09di5iZWZvcmVTZW5kLmNhbGwoeSxULHYpfHxoKSlyZXR1cm4gVC5hYm9ydCgpO2lmKHU9ImFib3J0IixiLmFkZCh2LmNvbXBsZXRlKSxULmRvbmUodi5zdWNjZXNzKSxULmZhaWwodi5lcnJvciksYz1fdChXdCx2LHQsVCkpe2lmKFQucmVhZHlTdGF0ZT0xLGcmJm0udHJpZ2dlcigiYWpheFNlbmQiLFtULHZdKSxoKXJldHVybiBUO3YuYXN5bmMmJjA8di50aW1lb3V0JiYoZD1DLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtULmFib3J0KCJ0aW1lb3V0Iil9LHYudGltZW91dCkpO3RyeXtoPSExLGMuc2VuZChhLGwpfWNhdGNoKGUpe2lmKGgpdGhyb3cgZTtsKC0xLGUpfX1lbHNlIGwoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIGwoZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPXQ7aHx8KGg9ITAsZCYmQy5jbGVhclRpbWVvdXQoZCksYz12b2lkIDAscD1yfHwiIixULnJlYWR5U3RhdGU9MDxlPzQ6MCxpPTIwMDw9ZSYmZTwzMDB8fDMwND09PWUsbiYmKHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5jb250ZW50cyx1PWUuZGF0YVR5cGVzO3doaWxlKCIqIj09PXVbMF0pdS5zaGlmdCgpLHZvaWQgMD09PXImJihyPWUubWltZVR5cGV8fHQuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihyKWZvcihpIGluIHMpaWYoc1tpXSYmc1tpXS50ZXN0KHIpKXt1LnVuc2hpZnQoaSk7YnJlYWt9aWYodVswXWluIG4pbz11WzBdO2Vsc2V7Zm9yKGkgaW4gbil7aWYoIXVbMF18fGUuY29udmVydGVyc1tpKyIgIit1WzBdXSl7bz1pO2JyZWFrfWF8fChhPWkpfW89b3x8YX1pZihvKXJldHVybiBvIT09dVswXSYmdS51bnNoaWZ0KG8pLG5bb119KHYsVCxuKSkscz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9e30sYz1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGNbMV0pZm9yKGEgaW4gZS5jb252ZXJ0ZXJzKWxbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07bz1jLnNoaWZ0KCk7d2hpbGUobylpZihlLnJlc3BvbnNlRmllbGRzW29dJiYobltlLnJlc3BvbnNlRmllbGRzW29dXT10KSwhdSYmciYmZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSksdT1vLG89Yy5zaGlmdCgpKWlmKCIqIj09PW8pbz11O2Vsc2UgaWYoIioiIT09dSYmdSE9PW8pe2lmKCEoYT1sW3UrIiAiK29dfHxsWyIqICIrb10pKWZvcihpIGluIGwpaWYoKHM9aS5zcGxpdCgiICIpKVsxXT09PW8mJihhPWxbdSsiICIrc1swXV18fGxbIiogIitzWzBdXSkpeyEwPT09YT9hPWxbaV06ITAhPT1sW2ldJiYobz1zWzBdLGMudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoITAhPT1hKWlmKGEmJmVbInRocm93cyJdKXQ9YSh0KTtlbHNlIHRyeXt0PWEodCl9Y2F0Y2goZSl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT9lOiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitvfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOnR9fSh2LHMsVCxpKSxpPyh2LmlmTW9kaWZpZWQmJigodT1ULmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpJiYoay5sYXN0TW9kaWZpZWRbZl09dSksKHU9VC5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpKSYmKGsuZXRhZ1tmXT11KSksMjA0PT09ZXx8IkhFQUQiPT09di50eXBlP2w9Im5vY29udGVudCI6MzA0PT09ZT9sPSJub3Rtb2RpZmllZCI6KGw9cy5zdGF0ZSxvPXMuZGF0YSxpPSEoYT1zLmVycm9yKSkpOihhPWwsIWUmJmx8fChsPSJlcnJvciIsZTwwJiYoZT0wKSkpLFQuc3RhdHVzPWUsVC5zdGF0dXNUZXh0PSh0fHxsKSsiIixpP3gucmVzb2x2ZVdpdGgoeSxbbyxsLFRdKTp4LnJlamVjdFdpdGgoeSxbVCxsLGFdKSxULnN0YXR1c0NvZGUodyksdz12b2lkIDAsZyYmbS50cmlnZ2VyKGk/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbVCx2LGk/bzphXSksYi5maXJlV2l0aCh5LFtULGxdKSxnJiYobS50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtULHZdKSwtLWsuYWN0aXZlfHxrLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gVH0sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGsuZ2V0KGUsdCxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihlLHQpe3JldHVybiBrLmdldChlLHZvaWQgMCx0LCJzY3JpcHQiKX19KSxrLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSxpKXtrW2ldPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBtKHQpJiYocj1yfHxuLG49dCx0PXZvaWQgMCksay5hamF4KGsuZXh0ZW5kKHt1cmw6ZSx0eXBlOmksZGF0YVR5cGU6cixkYXRhOnQsc3VjY2VzczpufSxrLmlzUGxhaW5PYmplY3QoZSkmJmUpKX19KSxrLl9ldmFsVXJsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGsuYWpheCh7dXJsOmUsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0IixjYWNoZTohMCxhc3luYzohMSxnbG9iYWw6ITEsY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbigpe319LGRhdGFGaWx0ZXI6ZnVuY3Rpb24oZSl7ay5nbG9iYWxFdmFsKGUsdCl9fSl9LGsuZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0aGlzWzBdJiYobShlKSYmKGU9ZS5jYWxsKHRoaXNbMF0pKSx0PWsoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJnQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLHQubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpczt3aGlsZShlLmZpcnN0RWxlbWVudENoaWxkKWU9ZS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKG4pe3JldHVybiBtKG4pP3RoaXMuZWFjaChmdW5jdGlvbihlKXtrKHRoaXMpLndyYXBJbm5lcihuLmNhbGwodGhpcyxlKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1rKHRoaXMpLHQ9ZS5jb250ZW50cygpO3QubGVuZ3RoP3Qud3JhcEFsbChuKTplLmFwcGVuZChuKX0pfSx3cmFwOmZ1bmN0aW9uKHQpe3ZhciBuPW0odCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtrKHRoaXMpLndyYXBBbGwobj90LmNhbGwodGhpcyxlKTp0KX0pfSx1bndyYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucGFyZW50KGUpLm5vdCgiYm9keSIpLmVhY2goZnVuY3Rpb24oKXtrKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSx0aGlzfX0pLGsuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbihlKXtyZXR1cm4hay5leHByLnBzZXVkb3MudmlzaWJsZShlKX0say5leHByLnBzZXVkb3MudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4hIShlLm9mZnNldFdpZHRofHxlLm9mZnNldEhlaWdodHx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9LGsuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IEMuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goZSl7fX07dmFyIFV0PXswOjIwMCwxMjIzOjIwNH0sWHQ9ay5hamF4U2V0dGluZ3MueGhyKCk7eS5jb3JzPSEhWHQmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gWHQseS5hamF4PVh0PSEhWHQsay5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGkpe3ZhciBvLGE7aWYoeS5jb3JzfHxYdCYmIWkuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkueGhyKCk7aWYoci5vcGVuKGkudHlwZSxpLnVybCxpLmFzeW5jLGkudXNlcm5hbWUsaS5wYXNzd29yZCksaS54aHJGaWVsZHMpZm9yKG4gaW4gaS54aHJGaWVsZHMpcltuXT1pLnhockZpZWxkc1tuXTtmb3IobiBpbiBpLm1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUmJnIub3ZlcnJpZGVNaW1lVHlwZShpLm1pbWVUeXBlKSxpLmNyb3NzRG9tYWlufHxlWyJYLVJlcXVlc3RlZC1XaXRoIl18fChlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0IiksZSlyLnNldFJlcXVlc3RIZWFkZXIobixlW25dKTtvPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe28mJihvPWE9ci5vbmxvYWQ9ci5vbmVycm9yPXIub25hYm9ydD1yLm9udGltZW91dD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLCJhYm9ydCI9PT1lP3IuYWJvcnQoKToiZXJyb3IiPT09ZT8ibnVtYmVyIiE9dHlwZW9mIHIuc3RhdHVzP3QoMCwiZXJyb3IiKTp0KHIuc3RhdHVzLHIuc3RhdHVzVGV4dCk6dChVdFtyLnN0YXR1c118fHIuc3RhdHVzLHIuc3RhdHVzVGV4dCwidGV4dCIhPT0oci5yZXNwb25zZVR5cGV8fCJ0ZXh0Iil8fCJzdHJpbmciIT10eXBlb2Ygci5yZXNwb25zZVRleHQ/e2JpbmFyeTpyLnJlc3BvbnNlfTp7dGV4dDpyLnJlc3BvbnNlVGV4dH0sci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0sci5vbmxvYWQ9bygpLGE9ci5vbmVycm9yPXIub250aW1lb3V0PW8oImVycm9yIiksdm9pZCAwIT09ci5vbmFib3J0P3Iub25hYm9ydD1hOnIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09PXIucmVhZHlTdGF0ZSYmQy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7byYmYSgpfSl9LG89bygiYWJvcnQiKTt0cnl7ci5zZW5kKGkuaGFzQ29udGVudCYmaS5kYXRhfHxudWxsKX1jYXRjaChlKXtpZihvKXRocm93IGV9fSxhYm9ydDpmdW5jdGlvbigpe28mJm8oKX19fSksay5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGUpe2UuY3Jvc3NEb21haW4mJihlLmNvbnRlbnRzLnNjcmlwdD0hMSl9KSxrLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L1xiKD86amF2YXxlY21hKXNjcmlwdFxiL30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihlKXtyZXR1cm4gay5nbG9iYWxFdmFsKGUpLGV9fX0pLGsuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihlKXt2b2lkIDA9PT1lLmNhY2hlJiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIil9KSxrLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24obil7dmFyIHIsaTtpZihuLmNyb3NzRG9tYWlufHxuLnNjcmlwdEF0dHJzKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsdCl7cj1rKCI8c2NyaXB0PiIpLmF0dHIobi5zY3JpcHRBdHRyc3x8e30pLnByb3Aoe2NoYXJzZXQ6bi5zY3JpcHRDaGFyc2V0LHNyYzpuLnVybH0pLm9uKCJsb2FkIGVycm9yIixpPWZ1bmN0aW9uKGUpe3IucmVtb3ZlKCksaT1udWxsLGUmJnQoImVycm9yIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxFLmhlYWQuYXBwZW5kQ2hpbGQoclswXSl9LGFib3J0OmZ1bmN0aW9uKCl7aSYmaSgpfX19KTt2YXIgVnQsR3Q9W10sWXQ9Lyg9KVw/KD89JnwkKXxcP1w/LztrLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9R3QucG9wKCl8fGsuZXhwYW5kbysiXyIra3QrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLGsuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPSExIT09ZS5qc29ucCYmKFl0LnRlc3QoZS51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgZS5kYXRhJiYwPT09KGUuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmWXQudGVzdChlLmRhdGEpJiYiZGF0YSIpO2lmKGF8fCJqc29ucCI9PT1lLmRhdGFUeXBlc1swXSlyZXR1cm4gcj1lLmpzb25wQ2FsbGJhY2s9bShlLmpzb25wQ2FsbGJhY2spP2UuanNvbnBDYWxsYmFjaygpOmUuanNvbnBDYWxsYmFjayxhP2VbYV09ZVthXS5yZXBsYWNlKFl0LCIkMSIrcik6ITEhPT1lLmpzb25wJiYoZS51cmwrPShTdC50ZXN0KGUudXJsKT8iJiI6Ij8iKStlLmpzb25wKyI9IityKSxlLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gb3x8ay5lcnJvcihyKyIgd2FzIG5vdCBjYWxsZWQiKSxvWzBdfSxlLmRhdGFUeXBlc1swXT0ianNvbiIsaT1DW3JdLENbcl09ZnVuY3Rpb24oKXtvPWFyZ3VtZW50c30sbi5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1pP2soQykucmVtb3ZlUHJvcChyKTpDW3JdPWksZVtyXSYmKGUuanNvbnBDYWxsYmFjaz10Lmpzb25wQ2FsbGJhY2ssR3QucHVzaChyKSksbyYmbShpKSYmaShvWzBdKSxvPWk9dm9pZCAwfSksInNjcmlwdCJ9KSx5LmNyZWF0ZUhUTUxEb2N1bWVudD0oKFZ0PUUuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5KS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IiwyPT09VnQuY2hpbGROb2Rlcy5sZW5ndGgpLGsucGFyc2VIVE1MPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGU/W106KCJib29sZWFuIj09dHlwZW9mIHQmJihuPXQsdD0hMSksdHx8KHkuY3JlYXRlSFRNTERvY3VtZW50Pygocj0odD1FLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikpLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSkuaHJlZj1FLmxvY2F0aW9uLmhyZWYsdC5oZWFkLmFwcGVuZENoaWxkKHIpKTp0PUUpLG89IW4mJltdLChpPUQuZXhlYyhlKSk/W3QuY3JlYXRlRWxlbWVudChpWzFdKV06KGk9d2UoW2VdLHQsbyksbyYmby5sZW5ndGgmJmsobykucmVtb3ZlKCksay5tZXJnZShbXSxpLmNoaWxkTm9kZXMpKSk7dmFyIHIsaSxvfSxrLmZuLmxvYWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPXRoaXMscz1lLmluZGV4T2YoIiAiKTtyZXR1cm4tMTxzJiYocj1tdChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksbSh0KT8obj10LHQ9dm9pZCAwKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIiksMDxhLmxlbmd0aCYmay5hamF4KHt1cmw6ZSx0eXBlOml8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOnR9KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLGEuaHRtbChyP2soIjxkaXY+IikuYXBwZW5kKGsucGFyc2VIVE1MKGUpKS5maW5kKHIpOmUpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKGUsdCl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pfSksdGhpc30say5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oZSx0KXtrLmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSksay5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGsuZ3JlcChrLnRpbWVycyxmdW5jdGlvbihlKXtyZXR1cm4gdD09PWUuZWxlbX0pLmxlbmd0aH0say5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGw9ay5jc3MoZSwicG9zaXRpb24iKSxjPWsoZSksZj17fTsic3RhdGljIj09PWwmJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHM9Yy5vZmZzZXQoKSxvPWsuY3NzKGUsInRvcCIpLHU9ay5jc3MoZSwibGVmdCIpLCgiYWJzb2x1dGUiPT09bHx8ImZpeGVkIj09PWwpJiYtMTwobyt1KS5pbmRleE9mKCJhdXRvIik/KGE9KHI9Yy5wb3NpdGlvbigpKS50b3AsaT1yLmxlZnQpOihhPXBhcnNlRmxvYXQobyl8fDAsaT1wYXJzZUZsb2F0KHUpfHwwKSxtKHQpJiYodD10LmNhbGwoZSxuLGsuZXh0ZW5kKHt9LHMpKSksbnVsbCE9dC50b3AmJihmLnRvcD10LnRvcC1zLnRvcCthKSxudWxsIT10LmxlZnQmJihmLmxlZnQ9dC5sZWZ0LXMubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxmKTpjLmNzcyhmKX19LGsuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24odCl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihlKXtrLm9mZnNldC5zZXRPZmZzZXQodGhpcyx0LGUpfSk7dmFyIGUsbixyPXRoaXNbMF07cmV0dXJuIHI/ci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6ZS50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OmUubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH06dm9pZCAwfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBlLHQsbixyPXRoaXNbMF0saT17dG9wOjAsbGVmdDowfTtpZigiZml4ZWQiPT09ay5jc3MociwicG9zaXRpb24iKSl0PXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZXt0PXRoaXMub2Zmc2V0KCksbj1yLm93bmVyRG9jdW1lbnQsZT1yLm9mZnNldFBhcmVudHx8bi5kb2N1bWVudEVsZW1lbnQ7d2hpbGUoZSYmKGU9PT1uLmJvZHl8fGU9PT1uLmRvY3VtZW50RWxlbWVudCkmJiJzdGF0aWMiPT09ay5jc3MoZSwicG9zaXRpb24iKSllPWUucGFyZW50Tm9kZTtlJiZlIT09ciYmMT09PWUubm9kZVR5cGUmJigoaT1rKGUpLm9mZnNldCgpKS50b3ArPWsuY3NzKGUsImJvcmRlclRvcFdpZHRoIiwhMCksaS5sZWZ0Kz1rLmNzcyhlLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSl9cmV0dXJue3RvcDp0LnRvcC1pLnRvcC1rLmNzcyhyLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OnQubGVmdC1pLmxlZnQtay5jc3MociwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXMub2Zmc2V0UGFyZW50O3doaWxlKGUmJiJzdGF0aWMiPT09ay5jc3MoZSwicG9zaXRpb24iKSllPWUub2Zmc2V0UGFyZW50O3JldHVybiBlfHxpZX0pfX0pLGsuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbih0LGkpe3ZhciBvPSJwYWdlWU9mZnNldCI9PT1pO2suZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIF8odGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoeChlKT9yPWU6OT09PWUubm9kZVR5cGUmJihyPWUuZGVmYXVsdFZpZXcpLHZvaWQgMD09PW4pcmV0dXJuIHI/cltpXTplW3RdO3I/ci5zY3JvbGxUbyhvP3IucGFnZVhPZmZzZXQ6bixvP246ci5wYWdlWU9mZnNldCk6ZVt0XT1ufSx0LGUsYXJndW1lbnRzLmxlbmd0aCl9fSksay5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGUsbil7ay5jc3NIb29rc1tuXT16ZSh5LnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oZSx0KXtpZih0KXJldHVybiB0PV9lKGUsbiksJGUudGVzdCh0KT9rKGUpLnBvc2l0aW9uKClbbl0rInB4Ijp0fSl9KSxrLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLHMpe2suZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpzLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24ocixvKXtrLmZuW29dPWZ1bmN0aW9uKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCYmKHJ8fCJib29sZWFuIiE9dHlwZW9mIGUpLGk9cnx8KCEwPT09ZXx8ITA9PT10PyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gXyh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4geChlKT8wPT09by5pbmRleE9mKCJvdXRlciIpP2VbImlubmVyIithXTplLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTo5PT09ZS5ub2RlVHlwZT8ocj1lLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChlLmJvZHlbInNjcm9sbCIrYV0sclsic2Nyb2xsIithXSxlLmJvZHlbIm9mZnNldCIrYV0sclsib2Zmc2V0IithXSxyWyJjbGllbnQiK2FdKSk6dm9pZCAwPT09bj9rLmNzcyhlLHQsaSk6ay5zdHlsZShlLHQsbixpKX0scyxuP2U6dm9pZCAwLG4pfX0pfSksay5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsbil7ay5mbltuXT1mdW5jdGlvbihlLHQpe3JldHVybiAwPGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vbihuLG51bGwsZSx0KTp0aGlzLnRyaWdnZXIobil9fSksay5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubW91c2VlbnRlcihlKS5tb3VzZWxlYXZlKHR8fGUpfX0pLGsuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vbihlLG51bGwsdCxuKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub2ZmKGUsbnVsbCx0KX0sZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24odCxlLG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihlLCIqKiIpOnRoaXMub2ZmKHQsZXx8IioqIixuKX19KSxrLnByb3h5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKG49ZVt0XSx0PWUsZT1uKSxtKGUpKXJldHVybiByPXMuY2FsbChhcmd1bWVudHMsMiksKGk9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0fHx0aGlzLHIuY29uY2F0KHMuY2FsbChhcmd1bWVudHMpKSl9KS5ndWlkPWUuZ3VpZD1lLmd1aWR8fGsuZ3VpZCsrLGl9LGsuaG9sZFJlYWR5PWZ1bmN0aW9uKGUpe2U/ay5yZWFkeVdhaXQrKzprLnJlYWR5KCEwKX0say5pc0FycmF5PUFycmF5LmlzQXJyYXksay5wYXJzZUpTT049SlNPTi5wYXJzZSxrLm5vZGVOYW1lPUEsay5pc0Z1bmN0aW9uPW0say5pc1dpbmRvdz14LGsuY2FtZWxDYXNlPVYsay50eXBlPXcsay5ub3c9RGF0ZS5ub3csay5pc051bWVyaWM9ZnVuY3Rpb24oZSl7dmFyIHQ9ay50eXBlKGUpO3JldHVybigibnVtYmVyIj09PXR8fCJzdHJpbmciPT09dCkmJiFpc05hTihlLXBhcnNlRmxvYXQoZSkpfSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4ga30pO3ZhciBRdD1DLmpRdWVyeSxKdD1DLiQ7cmV0dXJuIGsubm9Db25mbGljdD1mdW5jdGlvbihlKXtyZXR1cm4gQy4kPT09ayYmKEMuJD1KdCksZSYmQy5qUXVlcnk9PT1rJiYoQy5qUXVlcnk9UXQpLGt9LGV8fChDLmpRdWVyeT1DLiQ9ayksa30pOwo=", @@ -96,7 +89,7 @@ var murom = муром; [ "ModulesList_1.0.0", -"Ly8g0KPQv9GA0LDQstC70LXQvdC40LUg0LzQvtC00YPQu9GP0LzQuCDQstC40LfRg9Cw0LvRjNC90L4KLy8gTWFuYWdlIG1vZHVsZXMgdmlzdWFsbHkKCmZ1bmN0aW9uIE1vZHVsZXNMaXN0KHBhcmVudCkKewogICAgdGhpcy5tb2QgPSBNT0Q7CiAgICB0aGlzLmNyZWF0ZVVJKHBhcmVudCk7CiAgICB0aGlzLnJlZnJlc2goKTsKICAgIHRoaXMudHJhY2tDaGFuZ2VzKCk7CiAgICB0aGlzLnRyYWNrQW5kUmVwb3J0U2VsZWN0aW9uKCk7Cn0KdmFyINCh0L/QuNGB0L7QutCc0L7QtNGD0LvQtdC5ID0gTW9kdWxlc0xpc3Q7CgovKgogKgogKiDQodC+0LfQtNCw0YLRjCDQv9C+0LvRjNC30L7QstCw0YLQtdC70YzRgdC60LjQuSDQuNC90YLQtdGA0YTQtdC50YEKICogQ3JlYXRlIHVzZXIgaW50ZXJmYWNlCiAqCiAqLwpNb2R1bGVzTGlzdC5wcm90b3R5cGUuY3JlYXRlVUkgPSBmdW5jdGlvbihwYXJlbnQpCnsKICAgIHZhciByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICByb290LmlkID0gIk1vZHVsZXNMaXN0IgogICAgcGFyZW50LmFwcGVuZENoaWxkKHJvb3QpOwogICAgdmFyIGNzcyA9CmAKI01vZHVsZXNMaXN0CnsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwp9CmA7CiAgICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgc3R5bGUuaW5uZXJIVE1MID0gY3NzOwogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7CgogICAgCiAgICAkKCIjTW9kdWxlc0xpc3QiKS53MmdyaWQoeyAKICAgICAgICBuYW1lOiAiTW9kdWxlc0xpc3QiLAogICAgICAgIHNob3c6IHsKICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgfSwKICAgICAgICBtdWx0aVNlbGVjdDogZmFsc2UsCiAgICAgICAgcmVvcmRlclJvd3M6IHRydWUsCiAgICAgICAgY29sdW1uczogWyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgeyBmaWVsZDogInN0YXR1cyIsIHRleHQ6ICLQmNGB0L/QvtC70L3Rj9GC0YwiLCBzaXplOiAiMTBlbSIsIHNvcnRhYmxlOiB0cnVlLCBlZGl0YWJsZTogeyB0eXBlOiAiY2hlY2tib3giLCBzdHlsZTogInRleHQtYWxpZ246IGNlbnRlciIgfSB9LAogICAgICAgICAgICB7IGZpZWxkOiAibmFtZSIsIHRleHQ6ICLQmNC80Y8iLCBzaXplOiAiMTAwJSIsIHNvcnRhYmxlOiB0cnVlLCBlZGl0YWJsZTogeyB0eXBlOiAidGV4dCIgfSB9LAogICAgICAgIF0KICAgIH0pOwogICAgdGhpcy5ncmlkID0gdzJ1aVsiTW9kdWxlc0xpc3QiXTsKfTsKCi8qCiAqCiAqINCe0LHQvdC+0LLQuNGC0Ywg0YHQv9C40YHQvtC6INC80L7QtNGD0LvQtdC5CiAqIFJlZnJlc2ggbW9kdWxlIGxpc3QKICoKICovCk1vZHVsZXNMaXN0LnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24oKQp7CiAgICB2YXIgcmVjb3JkcyA9IFtdOwogICAgZm9yICh2YXIgaSBpbiB0aGlzLm1vZC5tb2R1bGVzKQogICAgewogICAgICAgIHZhciBtID0gdGhpcy5tb2QubW9kdWxlc1tpXTsKICAgICAgICB2YXIgaWQgPSBtdXJvbS51dWlkKCk7CiAgICAgICAgcmVjb3Jkcy5wdXNoKAogICAgICAgICAgICB7IHJlY2lkOiBpZCwgc3RhdHVzOiBtLnN0YXR1cywgbmFtZTogbS5uYW1lIH0KICAgICAgICApOwogICAgfQogICAgdGhpcy5ncmlkLmNsZWFyKCk7CiAgICB0aGlzLmdyaWQuYWRkKHJlY29yZHMpOwp9OwpNb2R1bGVzTGlzdC5wcm90b3R5cGUu0L7QsdC90L7QstC40YLRjCA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5yZWZyZXNoKCk7Cn07CgovKgogKgogKiDQn9C10YDQtdCy0L7QtCDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgNCwINC30LDQv9C40YHQuCDRgdC10YLQutC4INCyINC/0L7RgNGP0LTQutC+0LLRi9C5INC90L7QvNC10YAKICogQ29udmVydCBncmlkIHJlY29yZCBpZCBpbnRvIG9yZGVyIG51bWJlcgogKgogKi8KTW9kdWxlc0xpc3QucHJvdG90eXBlLmlkVG9PcmRlciA9IGZ1bmN0aW9uKGlkKQp7CiAgICBmb3IgKHZhciBpIGluIHRoaXMuZ3JpZC5yZWNvcmRzKQogICAgewogICAgICAgIHZhciByID0gdGhpcy5ncmlkLnJlY29yZHNbaV07CiAgICAgICAgaWYgKHIucmVjaWQgPT0gaWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybiBudWxsOwp9OwpNb2R1bGVzTGlzdC5wcm90b3R5cGUu0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YDQktCd0L7QvNC10YAgPSBmdW5jdGlvbijQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCkKewogICAgcmV0dXJuIHRoaXMuaWRUb09yZGVyKNC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAKTsKfTsKCi8qCiAqCiAqINCg0LXQsNC60YbQuNGPINC90LAg0LjQt9C80LXQvdC10L3QuNC1INGB0LLQvtC50YHRgtCy0LAgKNC40LzRjywg0YHRgtCw0YLRg9GBKQogKiBSZWFjdGlvbiB0byBwcm9wZXJ0eSBjaGFuZ2UgKG5hbWUsIHN0YXR1cykKICoKICovCk1vZHVsZXNMaXN0LnByb3RvdHlwZS5yZWFjdFRvUHJvcGVydHlDaGFuZ2UgPSBmdW5jdGlvbihldmVudCkKewogICAgY29uc29sZS5sb2coZXZlbnQpOwogICAgdmFyIG1vZHVsZSA9IHRoaXMubW9kLm1vZHVsZXNbZXZlbnQuaW5kZXhdOwogICAgLy8gU3RhdHVzLgogICAgaWYgKGV2ZW50LmNvbHVtbiA9PSAwKQogICAgewogICAgICAgIHZhciBzdGF0dXMgPSBldmVudC52YWx1ZV9uZXc7CiAgICAgICAgbW9kdWxlLnN0YXR1cyA9IHN0YXR1czsKICAgIH0KICAgIC8vIE5hbWUuCiAgICBlbHNlIGlmIChldmVudC5jb2x1bW4gPT0gMSkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IGV2ZW50LnZhbHVlX25ldzsKICAgICAgICBtb2R1bGUubmFtZSA9IG5hbWU7CiAgICB9Cn07CgovKgogKgogKiDQoNC10LDQutGG0LjRjyDQvdCwINC40LfQvNC10L3QtdC90LjQtSDQvdC+0LzQtdGA0LAKICogUmVhY3Rpb24gdG8gb3JkZXIgY2hhbmdlCiAqCiAqLwpNb2R1bGVzTGlzdC5wcm90b3R5cGUucmVhY3RUb09yZGVyQ2hhbmdlID0gZnVuY3Rpb24oZXZlbnQpCnsKICAgIHZhciBpZFdhcyA9IGV2ZW50LnJlY2lkOwogICAgdmFyIGlkTm93ID0gZXZlbnQubW92ZUFmdGVyOwogICAgLy8gTm90aGluZyBjaGFuZ2VkLgogICAgaWYgKGlkTm93ID09IG51bGwpCiAgICB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIG9yZGVyV2FzID0gdGhpcy5pZFRvT3JkZXIoaWRXYXMpOwogICAgdmFyIG9yZGVyTm93ID0gbnVsbDsKICAgIGlmIChpZE5vdyAhPSAiYm90dG9tIikKICAgIHsKICAgICAgICBvcmRlck5vdyA9IHRoaXMuaWRUb09yZGVyKGlkTm93KTsKICAgIH0KICAgIHRoaXMubW9kLm1vdmUob3JkZXJXYXMsIG9yZGVyTm93KTsKfTsKCi8qCiAqCiAqINCh0LvQtdC00LjRgtGMINC30LAg0LjQt9C80LXQvdC10L3QuNGP0LzQuCAo0YHRgtCw0YLRg9GB0LAsINC40LzQtdC90LgsINC90L7QvNC10YDQsCkKICogVHJhY2sgY2hhbmdlcyAob2Ygc3RhdHVzLCBuYW1lLCBpZCkKICoKICovCk1vZHVsZXNMaXN0LnByb3RvdHlwZS50cmFja0NoYW5nZXMgPSBmdW5jdGlvbigpCnsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHRoaXMuZ3JpZC5vbigiY2hhbmdlIiwgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBzZWxmLnJlYWN0VG9Qcm9wZXJ0eUNoYW5nZShldmVudCk7CiAgICB9KTsKICAgIHRoaXMuZ3JpZC5vbigicmVzdG9yZSIsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgc2VsZi5yZWFjdFRvUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwogICAgfSk7CiAgICB0aGlzLmdyaWQub24oInJlb3JkZXJSb3ciLCBmdW5jdGlvbihldmVudCkgewogICAgICAgIHNlbGYucmVhY3RUb09yZGVyQ2hhbmdlKGV2ZW50KTsKICAgIH0pOwp9OwoKLyoKICoKICog0JLRi9Cx0YDQsNGC0Ywg0LzQvtC00YPQu9GMINCyINGB0LXRgtC60LUKICogU2VsZWN0IGEgbW9kdWxlIGluIGdyaWQKICoKICovCk1vZHVsZXNMaXN0LnByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbihpZCkKewogICAgdmFyIHJlY2lkID0gdGhpcy5ncmlkLnJlY29yZHNbaWRdLnJlY2lkOwogICAgdGhpcy5ncmlkLnNlbGVjdChyZWNpZCk7CiAgICB0aGlzLmdyaWQuc2Nyb2xsSW50b1ZpZXcoaWQsIG51bGwsIHRydWUpOwp9Ck1vZHVsZXNMaXN0LnByb3RvdHlwZS7QstGL0LHRgNCw0YLRjCA9IGZ1bmN0aW9uKNC90L7QvNC10YApCnsKICAgIHRoaXMuc2VsZWN0KNC90L7QvNC10YApOwp9CgovKgogKgogKiDQktGL0LHRgNCw0YLRjCDQv9C+0YHQu9C10LTQvdC40Lkg0LzQvtC00YPQu9GMINCyINGB0LXRgtC60LUKICogU2VsZWN0IHRoZSBsYXN0IG1vZHVsZSBpbiBncmlkCiAqCiAqLwpNb2R1bGVzTGlzdC5wcm90b3R5cGUuc2VsZWN0TGFzdCA9IGZ1bmN0aW9uKCkKewogICAgdmFyIGlkID0gdGhpcy5ncmlkLnJlY29yZHMubGVuZ3RoIC0gMTsKICAgIHRoaXMuc2VsZWN0KGlkKTsKfQpNb2R1bGVzTGlzdC5wcm90b3R5cGUu0LLRi9Cx0YDQsNGC0YzQn9C+0YHQu9C10LTQvdC40LkgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMuc2VsZWN0TGFzdCgpOwp9CgovKgogKgogKiDQndC+0LzQtdGAINCy0YvQsdGA0LDQvdC90L7Qs9C+INGN0LvQtdC80LXQvdGC0LAKICogU2VsZWN0ZWQgaXRlbSBvcmRlcgogKgogKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KE1vZHVsZXNMaXN0LnByb3RvdHlwZSwgInNlbGVjdGVkT3JkZXIiLCB7CiAgICBnZXQ6IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgcmVjaWQgPSB0aGlzLmdyaWQuZ2V0U2VsZWN0aW9uKClbMF07CiAgICAgICAgaWYgKHJlY2lkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWRUb09yZGVyKHJlY2lkKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0pOwpPYmplY3QuZGVmaW5lUHJvcGVydHkoTW9kdWxlc0xpc3QucHJvdG90eXBlLCAi0LLRi9Cx0YDQsNC90L3Ri9C50J3QvtC80LXRgCIsIHsKICAgIGdldDogZnVuY3Rpb24oKQogICAgewogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkT3JkZXI7CiAgICB9Cn0pOwogCi8qCiAqCiAqINCh0LvQtdC00LjRgtGMINC30LAg0LLRi9Cx0L7RgNC+0Lwg0Lgg0YHQvtC+0LHRidCw0YLRjCDQviDQvdGR0LwKICogVHJhY2sgc2VsZWN0aW9uIGFuZCByZXBvcnQgaXQKICoKICovCk1vZHVsZXNMaXN0LnByb3RvdHlwZS50cmFja0FuZFJlcG9ydFNlbGVjdGlvbiA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gbmV3IFJlcG9ydGVyKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgItC40LfQvNC10L3QuNC70LjQktGL0LHQvtGAIiwgewogICAgICAgIGdldDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZDsKICAgICAgICB9CiAgICB9KTsKICAgIAogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgZnVuY3Rpb24gcmVwb3J0KGV2ZW50KQogICAgewogICAgICAgIGV2ZW50Lm9uQ29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgc2VsZi5zZWxlY3Rpb25DaGFuZ2VkLnJlcG9ydCgpOwogICAgICAgIH07CiAgICB9CiAgICB0aGlzLmdyaWQub24oInNlbGVjdCIsIHJlcG9ydCk7CiAgICB0aGlzLmdyaWQub24oInVuc2VsZWN0IiwgcmVwb3J0KTsKfTs=", +"Ly8g0KPQv9GA0LDQstC70LXQvdC40LUg0LzQvtC00YPQu9GP0LzQuCDQstC40LfRg9Cw0LvRjNC90L4KLy8gTWFuYWdlIG1vZHVsZXMgdmlzdWFsbHkKCmZ1bmN0aW9uIE1vZHVsZXNMaXN0KHBhcmVudCkKewogICAgdGhpcy5tb2QgPSBNT0Q7CiAgICB0aGlzLmNyZWF0ZVVJKHBhcmVudCk7CiAgICB0aGlzLnJlZnJlc2goKTsKICAgIHRoaXMudHJhY2tDaGFuZ2VzKCk7CiAgICB0aGlzLnRyYWNrQW5kUmVwb3J0U2VsZWN0aW9uKCk7Cn0KdmFyINCh0L/QuNGB0L7QutCc0L7QtNGD0LvQtdC5ID0gTW9kdWxlc0xpc3Q7CgovKgogKgogKiDQodC+0LfQtNCw0YLRjCDQv9C+0LvRjNC30L7QstCw0YLQtdC70YzRgdC60LjQuSDQuNC90YLQtdGA0YTQtdC50YEKICogQ3JlYXRlIHVzZXIgaW50ZXJmYWNlCiAqCiAqLwpNb2R1bGVzTGlzdC5wcm90b3R5cGUuY3JlYXRlVUkgPSBmdW5jdGlvbihwYXJlbnQpCnsKICAgIHZhciByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICByb290LmlkID0gIk1vZHVsZXNMaXN0IgogICAgcGFyZW50LmFwcGVuZENoaWxkKHJvb3QpOwogICAgdmFyIGNzcyA9CmAKI01vZHVsZXNMaXN0CnsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwp9CmA7CiAgICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgc3R5bGUuaW5uZXJIVE1MID0gY3NzOwogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7CgogICAgCiAgICAkKCIjTW9kdWxlc0xpc3QiKS53MmdyaWQoeyAKICAgICAgICBuYW1lOiAiTW9kdWxlc0xpc3QiLAogICAgICAgIHNob3c6IHsKICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgfSwKICAgICAgICBtdWx0aVNlbGVjdDogZmFsc2UsCiAgICAgICAgcmVvcmRlclJvd3M6IHRydWUsCiAgICAgICAgY29sdW1uczogWyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgeyBmaWVsZDogInN0YXR1cyIsIHRleHQ6ICLQmNGB0L/QvtC70L3Rj9GC0YwiLCBzaXplOiAiMTBlbSIsIHNvcnRhYmxlOiB0cnVlLCBlZGl0YWJsZTogeyB0eXBlOiAiY2hlY2tib3giLCBzdHlsZTogInRleHQtYWxpZ246IGNlbnRlciIgfSB9LAogICAgICAgICAgICB7IGZpZWxkOiAibmFtZSIsIHRleHQ6ICLQmNC80Y8iLCBzaXplOiAiMTAwJSIsIHNvcnRhYmxlOiB0cnVlLCBlZGl0YWJsZTogeyB0eXBlOiAidGV4dCIgfSB9LAogICAgICAgIF0KICAgIH0pOwogICAgdGhpcy5ncmlkID0gdzJ1aVsiTW9kdWxlc0xpc3QiXTsKfTsKCi8qCiAqCiAqINCe0LHQvdC+0LLQuNGC0Ywg0YHQv9C40YHQvtC6INC80L7QtNGD0LvQtdC5CiAqIFJlZnJlc2ggbW9kdWxlIGxpc3QKICoKICovCk1vZHVsZXNMaXN0LnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24oKQp7CiAgICB2YXIgcmVjb3JkcyA9IFtdOwogICAgZm9yICh2YXIgaSBpbiB0aGlzLm1vZC5tb2R1bGVzKQogICAgewogICAgICAgIHZhciBtID0gdGhpcy5tb2QubW9kdWxlc1tpXTsKICAgICAgICB2YXIgaWQgPSBtdXJvbS51dWlkKCk7CiAgICAgICAgcmVjb3Jkcy5wdXNoKAogICAgICAgICAgICB7IHJlY2lkOiBpZCwgc3RhdHVzOiBtLnN0YXR1cywgbmFtZTogbS5uYW1lIH0KICAgICAgICApOwogICAgfQogICAgdGhpcy5ncmlkLmNsZWFyKCk7CiAgICB0aGlzLmdyaWQuYWRkKHJlY29yZHMpOwp9OwpNb2R1bGVzTGlzdC5wcm90b3R5cGUu0L7QsdC90L7QstC40YLRjCA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5yZWZyZXNoKCk7Cn07CgovKgogKgogKiDQn9C10YDQtdCy0L7QtCDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgNCwINC30LDQv9C40YHQuCDRgdC10YLQutC4INCyINC/0L7RgNGP0LTQutC+0LLRi9C5INC90L7QvNC10YAKICogQ29udmVydCBncmlkIHJlY29yZCBpZCBpbnRvIG9yZGVyIG51bWJlcgogKgogKi8KTW9kdWxlc0xpc3QucHJvdG90eXBlLmlkVG9PcmRlciA9IGZ1bmN0aW9uKGlkKQp7CiAgICBmb3IgKHZhciBpIGluIHRoaXMuZ3JpZC5yZWNvcmRzKQogICAgewogICAgICAgIHZhciByID0gdGhpcy5ncmlkLnJlY29yZHNbaV07CiAgICAgICAgaWYgKHIucmVjaWQgPT0gaWQpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybiBudWxsOwp9OwpNb2R1bGVzTGlzdC5wcm90b3R5cGUu0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YDQktCd0L7QvNC10YAgPSBmdW5jdGlvbijQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCkKewogICAgcmV0dXJuIHRoaXMuaWRUb09yZGVyKNC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAKTsKfTsKCi8qCiAqCiAqINCg0LXQsNC60YbQuNGPINC90LAg0LjQt9C80LXQvdC10L3QuNC1INGB0LLQvtC50YHRgtCy0LAgKNC40LzRjywg0YHRgtCw0YLRg9GBKQogKiBSZWFjdGlvbiB0byBwcm9wZXJ0eSBjaGFuZ2UgKG5hbWUsIHN0YXR1cykKICoKICovCk1vZHVsZXNMaXN0LnByb3RvdHlwZS5yZWFjdFRvUHJvcGVydHlDaGFuZ2UgPSBmdW5jdGlvbihldmVudCkKewogICAgdmFyIG1vZHVsZSA9IHRoaXMubW9kLm1vZHVsZXNbZXZlbnQuaW5kZXhdOwogICAgLy8gU3RhdHVzLgogICAgaWYgKGV2ZW50LmNvbHVtbiA9PSAwKQogICAgewogICAgICAgIHZhciBzdGF0dXMgPSBldmVudC52YWx1ZV9uZXc7CiAgICAgICAgbW9kdWxlLnN0YXR1cyA9IHN0YXR1czsKICAgIH0KICAgIC8vIE5hbWUuCiAgICBlbHNlIGlmIChldmVudC5jb2x1bW4gPT0gMSkKICAgIHsKICAgICAgICB2YXIgbmFtZSA9IGV2ZW50LnZhbHVlX25ldzsKICAgICAgICBtb2R1bGUubmFtZSA9IG5hbWU7CiAgICB9Cn07CgovKgogKgogKiDQoNC10LDQutGG0LjRjyDQvdCwINC40LfQvNC10L3QtdC90LjQtSDQvdC+0LzQtdGA0LAKICogUmVhY3Rpb24gdG8gb3JkZXIgY2hhbmdlCiAqCiAqLwpNb2R1bGVzTGlzdC5wcm90b3R5cGUucmVhY3RUb09yZGVyQ2hhbmdlID0gZnVuY3Rpb24oZXZlbnQpCnsKICAgIHZhciBpZFdhcyA9IGV2ZW50LnJlY2lkOwogICAgdmFyIGlkTm93ID0gZXZlbnQubW92ZUFmdGVyOwogICAgLy8gTm90aGluZyBjaGFuZ2VkLgogICAgaWYgKGlkTm93ID09IG51bGwpCiAgICB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIG9yZGVyV2FzID0gdGhpcy5pZFRvT3JkZXIoaWRXYXMpOwogICAgdmFyIG9yZGVyTm93ID0gbnVsbDsKICAgIGlmIChpZE5vdyAhPSAiYm90dG9tIikKICAgIHsKICAgICAgICBvcmRlck5vdyA9IHRoaXMuaWRUb09yZGVyKGlkTm93KTsKICAgIH0KICAgIHRoaXMubW9kLm1vdmUob3JkZXJXYXMsIG9yZGVyTm93KTsKfTsKCi8qCiAqCiAqINCh0LvQtdC00LjRgtGMINC30LAg0LjQt9C80LXQvdC10L3QuNGP0LzQuCAo0YHRgtCw0YLRg9GB0LAsINC40LzQtdC90LgsINC90L7QvNC10YDQsCkKICogVHJhY2sgY2hhbmdlcyAob2Ygc3RhdHVzLCBuYW1lLCBpZCkKICoKICovCk1vZHVsZXNMaXN0LnByb3RvdHlwZS50cmFja0NoYW5nZXMgPSBmdW5jdGlvbigpCnsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHRoaXMuZ3JpZC5vbigiY2hhbmdlIiwgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBzZWxmLnJlYWN0VG9Qcm9wZXJ0eUNoYW5nZShldmVudCk7CiAgICB9KTsKICAgIHRoaXMuZ3JpZC5vbigicmVzdG9yZSIsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgc2VsZi5yZWFjdFRvUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwogICAgfSk7CiAgICB0aGlzLmdyaWQub24oInJlb3JkZXJSb3ciLCBmdW5jdGlvbihldmVudCkgewogICAgICAgIHNlbGYucmVhY3RUb09yZGVyQ2hhbmdlKGV2ZW50KTsKICAgIH0pOwp9OwoKLyoKICoKICog0JLRi9Cx0YDQsNGC0Ywg0LzQvtC00YPQu9GMINCyINGB0LXRgtC60LUKICogU2VsZWN0IGEgbW9kdWxlIGluIGdyaWQKICoKICovCk1vZHVsZXNMaXN0LnByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbihpZCkKewogICAgdmFyIHJlY2lkID0gdGhpcy5ncmlkLnJlY29yZHNbaWRdLnJlY2lkOwogICAgdGhpcy5ncmlkLnNlbGVjdChyZWNpZCk7CiAgICB0aGlzLmdyaWQuc2Nyb2xsSW50b1ZpZXcoaWQsIG51bGwsIHRydWUpOwp9Ck1vZHVsZXNMaXN0LnByb3RvdHlwZS7QstGL0LHRgNCw0YLRjCA9IGZ1bmN0aW9uKNC90L7QvNC10YApCnsKICAgIHRoaXMuc2VsZWN0KNC90L7QvNC10YApOwp9CgovKgogKgogKiDQktGL0LHRgNCw0YLRjCDQv9C+0YHQu9C10LTQvdC40Lkg0LzQvtC00YPQu9GMINCyINGB0LXRgtC60LUKICogU2VsZWN0IHRoZSBsYXN0IG1vZHVsZSBpbiBncmlkCiAqCiAqLwpNb2R1bGVzTGlzdC5wcm90b3R5cGUuc2VsZWN0TGFzdCA9IGZ1bmN0aW9uKCkKewogICAgdmFyIGlkID0gdGhpcy5ncmlkLnJlY29yZHMubGVuZ3RoIC0gMTsKICAgIHRoaXMuc2VsZWN0KGlkKTsKfQpNb2R1bGVzTGlzdC5wcm90b3R5cGUu0LLRi9Cx0YDQsNGC0YzQn9C+0YHQu9C10LTQvdC40LkgPSBmdW5jdGlvbigpCnsKICAgIHRoaXMuc2VsZWN0TGFzdCgpOwp9CgovKgogKgogKiDQndC+0LzQtdGAINCy0YvQsdGA0LDQvdC90L7Qs9C+INGN0LvQtdC80LXQvdGC0LAKICogU2VsZWN0ZWQgaXRlbSBvcmRlcgogKgogKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KE1vZHVsZXNMaXN0LnByb3RvdHlwZSwgInNlbGVjdGVkT3JkZXIiLCB7CiAgICBnZXQ6IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICB2YXIgcmVjaWQgPSB0aGlzLmdyaWQuZ2V0U2VsZWN0aW9uKClbMF07CiAgICAgICAgaWYgKHJlY2lkKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWRUb09yZGVyKHJlY2lkKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0pOwpPYmplY3QuZGVmaW5lUHJvcGVydHkoTW9kdWxlc0xpc3QucHJvdG90eXBlLCAi0LLRi9Cx0YDQsNC90L3Ri9C50J3QvtC80LXRgCIsIHsKICAgIGdldDogZnVuY3Rpb24oKQogICAgewogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkT3JkZXI7CiAgICB9Cn0pOwogCi8qCiAqCiAqINCh0LvQtdC00LjRgtGMINC30LAg0LLRi9Cx0L7RgNC+0Lwg0Lgg0YHQvtC+0LHRidCw0YLRjCDQviDQvdGR0LwKICogVHJhY2sgc2VsZWN0aW9uIGFuZCByZXBvcnQgaXQKICoKICovCk1vZHVsZXNMaXN0LnByb3RvdHlwZS50cmFja0FuZFJlcG9ydFNlbGVjdGlvbiA9IGZ1bmN0aW9uKCkKewogICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gbmV3IFJlcG9ydGVyKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgItC40LfQvNC10L3QuNC70LjQktGL0LHQvtGAIiwgewogICAgICAgIGdldDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZDsKICAgICAgICB9CiAgICB9KTsKICAgIAogICAgdmFyIHNlbGYgPSB0aGlzOwogICAgZnVuY3Rpb24gcmVwb3J0KGV2ZW50KQogICAgewogICAgICAgIGV2ZW50Lm9uQ29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgc2VsZi5zZWxlY3Rpb25DaGFuZ2VkLnJlcG9ydCgpOwogICAgICAgIH07CiAgICB9CiAgICB0aGlzLmdyaWQub24oInNlbGVjdCIsIHJlcG9ydCk7CiAgICB0aGlzLmdyaWQub24oInVuc2VsZWN0IiwgcmVwb3J0KTsKfTs=", {"status":true} ], @@ -131,7 +124,7 @@ var murom = муром; [ "Среда_1.0.0", -"ZnVuY3Rpb24g0KHRgNC10LTQsCgpCnsKICAgIHRoaXMu0YPRgdGC0LDQvdC+0LLQuNGC0YzQntCx0LvQsNGB0YLQuCgpOwogICAgdGhpcy7Rg9GB0YLQsNC90L7QstC40YLRjNCg0LXQtNCw0LrRgtC+0YAoKTsKICAgIHRoaXMu0YPRgdGC0LDQvdC+0LLQuNGC0YzQnNC+0LTRg9C70LgoKTsKICAgIHRoaXMu0YHQu9C10LTQuNGC0YzQl9Cw0JLRi9Cx0L7RgNC+0LwoKTsKICAgIHRoaXMu0L3QsNGB0YLRgNC+0LjRgtGM0KHQvtGF0YDQsNC90LXQvdC40LXQodC60LDRh9C40LLQsNC90LjQtSgpOwp9CgrQodGA0LXQtNCwLnByb3RvdHlwZS7Rg9GB0YLQsNC90L7QstC40YLRjNCe0LHQu9Cw0YHRgtC4ID0gZnVuY3Rpb24oKQp7CiAgICB2YXIgaHRtbCA9CmAKPGRpdiBpZD0i0YHRgNC10LTQsC3QvtCx0LvQsNGB0YLRjC3Qu9C10LLQsNGPIj4KICAgIDxkaXYgaWQ9ItGA0LXQtNCw0LrRgtC+0YAiIGhpZGRlbj48L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ItGB0YDQtdC00LAt0L7QsdC70LDRgdGC0Ywt0LvQtdCy0LDRjy3Qt9Cw0LPQu9GD0YjQutCwIj7QktGL0LHQtdGA0LjRgtC1INC80L7QtNGD0LvRjDwvZGl2PgoKPGRpdiBpZD0i0YHRgNC10LTQsC3QvtCx0LvQsNGB0YLRjC3RhtC10L3RgtGA0LDQu9GM0L3QsNGPLdCy0LXRgNGFIj4KPC9kaXY+Cgo8ZGl2IGlkPSLRgdGA0LXQtNCwLdC+0LHQu9Cw0YHRgtGMLdGG0LXQvdGC0YDQsNC70YzQvdCw0Y8t0L3QuNC3Ij4KICAgIDxhIGlkPSLRgdGA0LXQtNCwLdGB0L7RhdGA0LDQvdC40YLRjCIgY2xhc3M9InVrLWljb24tYnV0dG9uIHVrLW1hcmdpbi10b3AiIHVrLWljb249ImRhdGFiYXNlIiB1ay10b29sdGlwPSLQodC+0YXRgNCw0L3QuNGC0Ywg0LjQt9C80LXQvdC10L3QuNGPINCyINGN0YLQvtC8INCx0YDQsNGD0LfQtdGA0LUiPjwvYT4KICAgIDxhIGlkPSLRgdGA0LXQtNCwLdGB0LrQsNGH0LDRgtGMIiBjbGFzcz0idWstaWNvbi1idXR0b24gdWstbWFyZ2luLXRvcCIgdWstaWNvbj0iZG93bmxvYWQiIHVrLXRvb2x0aXA9ItCh0LrQsNGH0LDRgtGMINGE0LDQudC7INGBINGB0L7RhdGA0LDQvdGR0L3QvdGL0LzQuCDQuNC30LzQtdC90LXQvdC40Y/QvNC4Ij48L2E+CiAgICA8YSBpZD0i0YHRgNC10LTQsC3QtNC+0LHQsNCy0LjRgtGMIiBjbGFzcz0idWstaWNvbi1idXR0b24gdWstbWFyZ2luLWxhcmdlLXRvcCIgdWstaWNvbj0icGx1cyIgdWstdG9vbHRpcD0i0JTQvtCx0LDQstC40YLRjCDQvdC+0LLRi9C5INC80L7QtNGD0LvRjCI+PC9hPgogICAgPGEgaWQ9ItGB0YDQtdC00LAt0YPQtNCw0LvQuNGC0YwiIGNsYXNzPSJ1ay1pY29uLWJ1dHRvbiB1ay1tYXJnaW4tdG9wIiB1ay1pY29uPSJtaW51cyIgdWstdG9vbHRpcD0i0KPQtNCw0LvQuNGC0Ywg0LLRi9Cx0YDQsNC90L3Ri9C5INC80L7QtNGD0LvRjCI+PC9hPgo8L2Rpdj4KCjxkaXYgaWQ9ItGB0YDQtdC00LAt0L7QsdC70LDRgdGC0Ywt0L/RgNCw0LLQsNGPLdCy0LXRgNGFIj4KICAgIDxpZnJhbWUgaWQ9ItCy0YHRgtGA0L7QudC60LAiPgogICAgICAgIDxwPtCe0KjQmNCR0JrQkCDQktCw0Ygg0LLQtdCxLdCx0YDQsNGD0LfQtdGAINC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGCIGlmcmFtZTwvcD4KICAgICAgICA8cD5FUlJPUiBZb3VyIHdlYiBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgaWZyYW1lczwvcD4KICAgIDwvaWZyYW1lPgo8L2Rpdj4KCjxkaXYgaWQ9ItGB0YDQtdC00LAt0L7QsdC70LDRgdGC0Ywt0L/RgNCw0LLQsNGPLdC90LjQtyI+CjwvZGl2PgpgOwogICAgdmFyIGNzcyA9CmAKI9GB0YDQtdC00LAt0L7QsdC70LDRgdGC0Ywt0LvQtdCy0LDRjwp7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7CiAgICBsZWZ0OiAwOwogICAgd2lkdGg6IGNhbGMoNTAlIC0gMmVtKTsKfQoKI9GB0YDQtdC00LAt0L7QsdC70LDRgdGC0Ywt0LvQtdCy0LDRjy3Qt9Cw0LPQu9GD0YjQutCwCnsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogNTAlOwogICAgbGVmdDogMjUlOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0yNSUpIHRyYW5zbGF0ZVkoLTUwJSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKfQoKI9GA0LXQtNCw0LrRgtC+0YAKewogICAgaGVpZ2h0OiAxMDAlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwp9Cgoj0YHRgNC10LTQsC3QvtCx0LvQsNGB0YLRjC3RhtC10L3RgtGA0LDQu9GM0L3QsNGPLdCy0LXRgNGFCnsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMDsKICAgIGhlaWdodDogNTAlOwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDRlbTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMmVtKTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2RkZDsKICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkZGQ7CiAgICBwYWRkaW5nLXRvcDogMWVtOwp9Cgoj0YHRgNC10LTQsC3QvtCx0LvQsNGB0YLRjC3RhtC10L3RgtGA0LDQu9GM0L3QsNGPLdC90LjQtwp7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBib3R0b206IDA7CiAgICBoZWlnaHQ6IDUwJTsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiA0ZW07CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTJlbSk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkOwogICAgcGFkZGluZy10b3A6IDFlbTsKfQoKI9GB0YDQtdC00LAt0L7QsdC70LDRgdGC0Ywt0L/RgNCw0LLQsNGPLdCy0LXRgNGFCnsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMDsKICAgIGhlaWdodDogNTAlOwogICAgcmlnaHQ6IDA7CiAgICB3aWR0aDogY2FsYyg1MCUgLSAyZW0pOwp9Cgoj0YHRgNC10LTQsC3QvtCx0LvQsNGB0YLRjC3Qv9GA0LDQstCw0Y8t0L3QuNC3CnsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIGJvdHRvbTogMDsKICAgIGhlaWdodDogNTAlOwogICAgcmlnaHQ6IDA7CiAgICB3aWR0aDogY2FsYyg1MCUgLSAyZW0gLSAxcHgpOwp9Cgoj0LLRgdGC0YDQvtC50LrQsAp7CiAgICBib3JkZXI6IDAgbm9uZTsKICAgIHdpZHRoOiBjYWxjKDUwJSAtIDJlbSk7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBwb3NpdGlvbjogZml4ZWQ7Cn0KYDsKCiAgICB2YXIg0Y3QutGA0LDQvSA9INGB0L7Qt9C00LDRgtGM0K3QutGA0LDQvSgi0YHRgNC10LTQsCIpOwogICAg0Y3QutGA0LDQvS5pbm5lckhUTUwgPSBodG1sOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCjRjdC60YDQsNC9KTsKICAgIHZhciDQstC40LQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAg0LLQuNC0LmlubmVySFRNTCA9IGNzczsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQo0LLQuNC0KTsKfTsKCtCh0YDQtdC00LAucHJvdG90eXBlLtGD0YHRgtCw0L3QvtCy0LjRgtGM0KDQtdC00LDQutGC0L7RgCA9IGZ1bmN0aW9uKCkKewogICAg0LzRg9GA0L7QvC7Qt9Cw0LPRgNGD0LfQuNGC0YxBQ0UoKTsKICAgINC80YPRgNC+0Lwu0LfQsNCz0YDRg9C30LjRgtGM0KDQtdC20LjQvEFDRUpTKCk7CiAgICDQvNGD0YDQvtC8LtGA0LXQtNCw0LrRgtC+0YAgPSB3aW5kb3cuYWNlLmVkaXQoItGA0LXQtNCw0LrRgtC+0YAiKTsKICAgINC80YPRgNC+0Lwu0YDQtdC00LDQutGC0L7RgC5zZXNzaW9uLnNldE1vZGUoImFjZS9tb2RlL2phdmFzY3JpcHQiKTsKICAgIAogICAgdGhpcy7RgNC10LTQsNC60YLQvtGAID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoItGA0LXQtNCw0LrRgtC+0YAiKTsKICAgIHRoaXMu0LfQsNCz0LvRg9GI0LrQsNCg0LXQtNCw0LrRgtC+0YDQsCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCLRgdGA0LXQtNCwLdC+0LHQu9Cw0YHRgtGMLdC70LXQstCw0Y8t0LfQsNCz0LvRg9GI0LrQsCIpOwp9OwoK0KHRgNC10LTQsC5wcm90b3R5cGUu0YHQtNC10LvQsNGC0YzQoNC10LTQsNC60YLQvtGA0JLQuNC00LjQvNGL0LwgPSBmdW5jdGlvbijRgdC+0YHRgtC+0Y/QvdC40LUpCnsKICAgIHRoaXMu0YDQtdC00LDQutGC0L7RgC5oaWRkZW4gPSAh0YHQvtGB0YLQvtGP0L3QuNC1OwogICAgdGhpcy7Qt9Cw0LPQu9GD0YjQutCw0KDQtdC00LDQutGC0L7RgNCwLmhpZGRlbiA9ICF0aGlzLtGA0LXQtNCw0LrRgtC+0YAuaGlkZGVuOwp9OwoK0KHRgNC10LTQsC5wcm90b3R5cGUu0LTQvtCx0LDQstC40YLRjNCd0L7QstGL0LnQnNC+0LTRg9C70YwgPSBmdW5jdGlvbigpCnsKICAgIHZhciDQvdC+0LzQtdGAID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTWF0aC5mbG9vcigxMDAwKSk7CiAgICB2YXIg0LjQvNGPID0gItC80L7QtNGD0LvRjC0iICsg0L3QvtC80LXRgDsKICAgINCc0J7QlC7QtNC+0LHQsNCy0LjRgtGMKNC40LzRjywgIiIpOwogICAgCiAgICB0aGlzLtGB0L/QuNGB0L7Qui7QvtCx0L3QvtCy0LjRgtGMKCk7CiAgICB2YXIg0L/QvtC30LjRhtC40Y8gPSDQnNCe0JQu0LzQvtC00YPQu9C4Lmxlbmd0aCAtIDE7CiAgICB0aGlzLtGB0L/QuNGB0L7Qui7QstGL0LHRgNCw0YLRjCjQv9C+0LfQuNGG0LjRjyk7Cn07CgrQodGA0LXQtNCwLnByb3RvdHlwZS7Qv9C+0LTRgtCy0LXRgNC00LjRgtGM0KPQtNCw0LvQtdC90LjQtdCc0L7QtNGD0LvRjyA9IGZ1bmN0aW9uKNC+0YLQutC70LjQuikKewogICAgdmFyINC90L7QvNC10YAgPSB0aGlzLtGB0L/QuNGB0L7Qui7QstGL0LHRgNCw0L3QvdGL0LnQndC+0LzQtdGAOwogICAgaWYgKNC90L7QvNC10YApCiAgICB7CiAgICAgICAgdzJjb25maXJtKHsKICAgICAgICAgICAgdGl0bGU6ICLQn9C+0LTRgtCy0LXRgNC20LTQtdC90LjQtSIsCiAgICAgICAgICAgIG1zZzogItCj0LTQsNC70LjRgtGMINCy0YvQsdGA0LDQvdC90YvQuSDQvNC+0LTRg9C70Yw/IiwKICAgICAgICAgICAgeWVzX3RleHQ6ICLQo9C00LDQu9C40YLRjCIsCiAgICAgICAgICAgIG5vX3RleHQ6ICLQntGC0LzQtdC90LAiLAogICAgICAgICAgICB5ZXNfY2FsbEJhY2s6INC+0YLQutC70LjQuiwKICAgICAgICB9KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB3MmFsZXJ0KCLQktGL0LHQtdGA0LjRgtC1INC80L7QtNGD0LvRjCIsICLQn9C+0Y/RgdC90LXQvdC40LUiKTsKICAgIH0KfTsKCtCh0YDQtdC00LAucHJvdG90eXBlLtGD0LTQsNC70LjRgtGM0JzQvtC00YPQu9GMID0gZnVuY3Rpb24oKQp7CiAgICB2YXIg0L3QvtC80LXRgCA9IHRoaXMu0YHQv9C40YHQvtC6LtCy0YvQsdGA0LDQvdC90YvQudCd0L7QvNC10YA7CiAgICDQnNCe0JQu0YPQtNCw0LvQuNGC0Ywo0L3QvtC80LXRgCk7CiAgICB0aGlzLtGB0L/QuNGB0L7Qui7QvtCx0L3QvtCy0LjRgtGMKCk7CiAgICB0aGlzLtGB0L/QuNGB0L7Qui7QstGL0LHRgNCw0YLRjCjQvdC+0LzQtdGAIC0gMSk7Cn07CgrQodGA0LXQtNCwLnByb3RvdHlwZS7Rg9GB0YLQsNC90L7QstC40YLRjNCc0L7QtNGD0LvQuCA9IGZ1bmN0aW9uKCkKewogICAgdmFyINC+0LHQu9Cw0YHRgtGMID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoItGB0YDQtdC00LAt0L7QsdC70LDRgdGC0Ywt0L/RgNCw0LLQsNGPLdC90LjQtyIpOwogICAgdGhpcy7RgdC/0LjRgdC+0LogPSBuZXcg0KHQv9C40YHQvtC60JzQvtC00YPQu9C10Lko0L7QsdC70LDRgdGC0YwpOwogICAgCiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAKICAgIHRoaXMu0LTQvtCx0LDQstC40YLRjCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCLRgdGA0LXQtNCwLdC00L7QsdCw0LLQuNGC0YwiKTsKICAgIHRoaXMu0LTQvtCx0LDQstC40YLRjC5vbmNsaWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgc2VsZi7QtNC+0LHQsNCy0LjRgtGM0J3QvtCy0YvQudCc0L7QtNGD0LvRjCgpOwogICAgfTsKICAgIAogICAgdGhpcy7Rg9C00LDQu9C40YLRjCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCLRgdGA0LXQtNCwLdGD0LTQsNC70LjRgtGMIik7CiAgICB0aGlzLtGD0LTQsNC70LjRgtGMLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKICAgICAgICBzZWxmLtC/0L7QtNGC0LLQtdGA0LTQuNGC0YzQo9C00LDQu9C10L3QuNC10JzQvtC00YPQu9GPKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzZWxmLtGD0LTQsNC70LjRgtGM0JzQvtC00YPQu9GMKCk7CiAgICAgICAgfSk7CiAgICB9Owp9OwoK0KHRgNC10LTQsC5wcm90b3R5cGUu0L7RgtC+0LHRgNCw0LfQuNGC0YzQmtC+0LTQktGL0LHRgNCw0L3QvdC+0LPQvtCc0L7QtNGD0LvRjyA9IGZ1bmN0aW9uKCkKewogICAgdmFyINC90L7QvNC10YAgPSB0aGlzLtGB0L/QuNGB0L7Qui7QstGL0LHRgNCw0L3QvdGL0LnQndC+0LzQtdGAOwogICAgdGhpcy7RgdC00LXQu9Cw0YLRjNCg0LXQtNCw0LrRgtC+0YDQktC40LTQuNC80YvQvCjQvdC+0LzQtdGAICE9IG51bGwpOwogICAgaWYgKNC90L7QvNC10YApCiAgICB7CiAgICAgICAgdmFyINC60L7QtDY0ID0g0JzQntCULtC80L7QtNGD0LvQuFvQvdC+0LzQtdGAXS5jb2RlNjQ7CiAgICAgICAg0LzRg9GA0L7QvC7RgNC10LTQsNC60YLQvtGALnNlc3Npb24uc2V0VmFsdWUo0LzRg9GA0L7QvC5hdG9iKNC60L7QtDY0KSk7CiAgICB9Cn07CgrQodGA0LXQtNCwLnByb3RvdHlwZS7RgdC70LXQtNC40YLRjNCX0LDQktGL0LHQvtGA0L7QvCA9IGZ1bmN0aW9uKCkKewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAg0LrQvtCz0LTQsCh0aGlzLtGB0L/QuNGB0L7Qui7QuNC30LzQtdC90LjQu9C40JLRi9Cx0L7RgCwgZnVuY3Rpb24oKSB7CiAgICAgICAgc2VsZi7QvtGC0L7QsdGA0LDQt9C40YLRjNCa0L7QtNCS0YvQsdGA0LDQvdC90L7Qs9C+0JzQvtC00YPQu9GPKCk7CiAgICB9KTsKfTsKCtCh0YDQtdC00LAucHJvdG90eXBlLtGB0L7RhdGA0LDQvdC40YLRjNCS0YvQsdGA0LDQvdC90YvQudCc0L7QtNGD0LvRjCA9IGZ1bmN0aW9uKCkKewogICAgdmFyINC90L7QvNC10YAgPSB0aGlzLtGB0L/QuNGB0L7Qui7QstGL0LHRgNCw0L3QvdGL0LnQndC+0LzQtdGAOwogICAgaWYgKNC90L7QvNC10YApCiAgICB7CiAgICAgICAgdmFyINC60L7QtCA9INC80YPRgNC+0Lwu0YDQtdC00LDQutGC0L7RgC5zZXNzaW9uLmdldFZhbHVlKCk7CiAgICAgICAg0JzQntCULtC80L7QtNGD0LvQuFvQvdC+0LzQtdGAXS5jb2RlNjQgPSDQvNGD0YDQvtC8LmJ0b2Eo0LrQvtC0KTsKICAgIH0KfTsKCtCh0YDQtdC00LAucHJvdG90eXBlLtGB0L7RhdGA0LDQvdC40YLRjNCS0YHRkSA9IGZ1bmN0aW9uKCkKewogICAgdmFyINC80L7QtNGD0LvQuCA9INCc0J7QlC7RgdC10YDQuNCw0LvQuNC30L7QstCw0L3QvdGL0LXQnNC+0LTRg9C70Lg7CiAgICBsb2NhbGZvcmFnZS5zZXRJdGVtKCJtb2R1bGVzIiwg0LzQvtC00YPQu9C4LCBmdW5jdGlvbijQvtGI0LjQsdC60LAsINC30L3QsNGH0LXQvdC40LUpIHsKICAgICAgICBpZiAo0L7RiNC40LHQutCwKQogICAgICAgIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigi0J3QtSDRg9C00LDQu9C+0YHRjCDRgdC+0YXRgNCw0L3QuNGC0Ywg0LzQvtC00YPQu9C4OiAnIiArINC+0YjQuNCx0LrQsCArICInIik7CiAgICAgICAgfQogICAgfSk7Cn07CgrQodGA0LXQtNCwLnByb3RvdHlwZS7RgdC60LDRh9Cw0YLRjNCk0LDQudC7ID0gZnVuY3Rpb24oKQp7CiAgICAvLyBIb3cgdG8gY3JlYXRlIGEgZmlsZSBpbiBtZW1vcnkgZm9yIHVzZXIgdG8gZG93bmxvYWQsIGJ1dCBub3QgdGhyb3VnaCBzZXJ2ZXI/CiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTgxOTczNDEKICAgIHZhciDRgdC+0LTQtdGA0LbQuNC80L7QtSA9INC80YPRgNC+0Lwu0YTQsNC50Lsu0L3QsNGH0LDQu9C+OwogICAgdmFyINC80L7QtNGD0LvQuCA9INCc0J7QlC7RgdC10YDQuNCw0LvQuNC30L7QstCw0L3QvdGL0LXQnNC+0LTRg9C70Lg7CiAgICBmb3IgKHZhciDQvdC+0LzQtdGAIGluINC80L7QtNGD0LvQuCkKICAgIHsKICAgICAgICB2YXIg0LwgPSDQvNC+0LTRg9C70Lhb0L3QvtC80LXRgF07CiAgICAgICAg0YHQvtC00LXRgNC20LjQvNC+0LUgKz0KYAoKWwoiYCArINC8WzBdICsgYCIsCiJgICsg0LxbMV0gKyBgIiwKYAorCkpTT04uc3RyaW5naWZ5KNC8WzJdKQorCmAKXSwKYAo7CiAgICB9CiAgICDRgdC+0LTQtdGA0LbQuNC80L7QtSArPSDQvNGD0YDQvtC8LtGE0LDQudC7LtC60L7QvdC10YY7CiAgICDRgdC+0LTQtdGA0LbQuNC80L7QtSA9INC80YPRgNC+0LwuYnRvYSjRgdC+0LTQtdGA0LbQuNC80L7QtSk7CiAgICAKICAgIHZhciDRgdGB0YvQu9GMID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwogICAg0YHRgdGL0LvRjC5zZXRBdHRyaWJ1dGUoImhyZWYiLCAiZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsIiArINGB0L7QtNC10YDQttC40LzQvtC1KTsKICAgIHZhciDQuNC80Y8gPSDQuNC80Y/QpNCw0LnQu9CwKCk7CiAgICDRgdGB0YvQu9GMLnNldEF0dHJpYnV0ZSgiZG93bmxvYWQiLCDQuNC80Y8pOwogICAg0YHRgdGL0LvRjC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCjRgdGB0YvQu9GMKTsKICAgINGB0YHRi9C70YwuY2xpY2soKTsKICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQo0YHRgdGL0LvRjCk7Cn07CgrQodGA0LXQtNCwLnByb3RvdHlwZS7QvdCw0YHRgtGA0L7QuNGC0YzQodC+0YXRgNCw0L3QtdC90LjQtdCh0LrQsNGH0LjQstCw0L3QuNC1ID0gZnVuY3Rpb24oKQp7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAKICAgIHRoaXMu0YHQvtGF0YDQsNC90LjRgtGMID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoItGB0YDQtdC00LAt0YHQvtGF0YDQsNC90LjRgtGMIik7CiAgICB0aGlzLtGB0L7RhdGA0LDQvdC40YLRjC5vbmNsaWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgc2VsZi7RgdC+0YXRgNCw0L3QuNGC0YzQktGL0LHRgNCw0L3QvdGL0LnQnNC+0LTRg9C70YwoKTsKICAgICAgICBzZWxmLtGB0L7RhdGA0LDQvdC40YLRjNCS0YHRkSgpOwogICAgfTsKICAgIAogICAgdGhpcy7RgdC60LDRh9Cw0YLRjCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCLRgdGA0LXQtNCwLdGB0LrQsNGH0LDRgtGMIik7CiAgICB0aGlzLtGB0LrQsNGH0LDRgtGMLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKICAgICAgICBzZWxmLtGB0LrQsNGH0LDRgtGM0KTQsNC50LsoKTsKICAgIH07Cn07CgovLyDQo9GB0YLQsNC90L7QstC60LAKLy8gSW5zdGFsbGF0aW9uCgpmdW5jdGlvbiDRg9GB0YLQsNC90L7QstC40YLRjNCh0YDQtdC00YMoKQp7CiAgICB2YXIg0YHRgNC10LTQsCA9IG5ldyDQodGA0LXQtNCwKCk7Cn0KCtC60L7Qs9C00LAo0LzRg9GA0L7QvC7QvtCx0YvRh9C90YvQudCf0YPRgdC6LCDRg9GB0YLQsNC90L7QstC40YLRjNCh0YDQtdC00YMpOw==", +"ZnVuY3Rpb24g0KHRgNC10LTQsCgpCnsKICAgIHRoaXMu0YPRgdGC0LDQvdC+0LLQuNGC0YzQntCx0LvQsNGB0YLQuCgpOwogICAgdGhpcy7Rg9GB0YLQsNC90L7QstC40YLRjNCg0LXQtNCw0LrRgtC+0YAoKTsKICAgIHRoaXMu0YPRgdGC0LDQvdC+0LLQuNGC0YzQnNC+0LTRg9C70LgoKTsKICAgIHRoaXMu0YHQu9C10LTQuNGC0YzQl9Cw0JLRi9Cx0L7RgNC+0LwoKTsKICAgIHRoaXMu0L3QsNGB0YLRgNC+0LjRgtGM0KHQvtGF0YDQsNC90LXQvdC40LXQodC60LDRh9C40LLQsNC90LjQtSgpOwp9CgrQodGA0LXQtNCwLnByb3RvdHlwZS7Rg9GB0YLQsNC90L7QstC40YLRjNCe0LHQu9Cw0YHRgtC4ID0gZnVuY3Rpb24oKQp7CiAgICB2YXIgaHRtbCA9CmAKPGRpdiBpZD0i0YHRgNC10LTQsC3QvtCx0LvQsNGB0YLRjC3Qu9C10LLQsNGPIj4KICAgIDxkaXYgaWQ9ItGA0LXQtNCw0LrRgtC+0YAiIGhpZGRlbj48L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ItGB0YDQtdC00LAt0L7QsdC70LDRgdGC0Ywt0LvQtdCy0LDRjy3Qt9Cw0LPQu9GD0YjQutCwIj7QktGL0LHQtdGA0LjRgtC1INC80L7QtNGD0LvRjDwvZGl2PgoKPGRpdiBpZD0i0YHRgNC10LTQsC3QvtCx0LvQsNGB0YLRjC3RhtC10L3RgtGA0LDQu9GM0L3QsNGPLdCy0LXRgNGFIj4KPC9kaXY+Cgo8ZGl2IGlkPSLRgdGA0LXQtNCwLdC+0LHQu9Cw0YHRgtGMLdGG0LXQvdGC0YDQsNC70YzQvdCw0Y8t0L3QuNC3Ij4KICAgIDxhIGlkPSLRgdGA0LXQtNCwLdGB0L7RhdGA0LDQvdC40YLRjCIgY2xhc3M9InVrLWljb24tYnV0dG9uIHVrLW1hcmdpbi10b3AiIHVrLWljb249ImRhdGFiYXNlIiB1ay10b29sdGlwPSLQodC+0YXRgNCw0L3QuNGC0Ywg0LjQt9C80LXQvdC10L3QuNGPINCyINGN0YLQvtC8INCx0YDQsNGD0LfQtdGA0LUiPjwvYT4KICAgIDxhIGlkPSLRgdGA0LXQtNCwLdGB0LrQsNGH0LDRgtGMIiBjbGFzcz0idWstaWNvbi1idXR0b24gdWstbWFyZ2luLXRvcCIgdWstaWNvbj0iZG93bmxvYWQiIHVrLXRvb2x0aXA9ItCh0LrQsNGH0LDRgtGMINGE0LDQudC7INGBINGB0L7RhdGA0LDQvdGR0L3QvdGL0LzQuCDQuNC30LzQtdC90LXQvdC40Y/QvNC4Ij48L2E+CiAgICA8YSBpZD0i0YHRgNC10LTQsC3QtNC+0LHQsNCy0LjRgtGMIiBjbGFzcz0idWstaWNvbi1idXR0b24gdWstbWFyZ2luLWxhcmdlLXRvcCIgdWstaWNvbj0icGx1cyIgdWstdG9vbHRpcD0i0JTQvtCx0LDQstC40YLRjCDQvdC+0LLRi9C5INC80L7QtNGD0LvRjCI+PC9hPgogICAgPGEgaWQ9ItGB0YDQtdC00LAt0YPQtNCw0LvQuNGC0YwiIGNsYXNzPSJ1ay1pY29uLWJ1dHRvbiB1ay1tYXJnaW4tdG9wIiB1ay1pY29uPSJtaW51cyIgdWstdG9vbHRpcD0i0KPQtNCw0LvQuNGC0Ywg0LLRi9Cx0YDQsNC90L3Ri9C5INC80L7QtNGD0LvRjCI+PC9hPgo8L2Rpdj4KCjxkaXYgaWQ9ItGB0YDQtdC00LAt0L7QsdC70LDRgdGC0Ywt0L/RgNCw0LLQsNGPLdCy0LXRgNGFIj4KICAgIDxpZnJhbWUgaWQ9ItCy0YHRgtGA0L7QudC60LAiPgogICAgICAgIDxwPtCe0KjQmNCR0JrQkCDQktCw0Ygg0LLQtdCxLdCx0YDQsNGD0LfQtdGAINC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGCIGlmcmFtZTwvcD4KICAgICAgICA8cD5FUlJPUiBZb3VyIHdlYiBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgaWZyYW1lczwvcD4KICAgIDwvaWZyYW1lPgo8L2Rpdj4KCjxkaXYgaWQ9ItGB0YDQtdC00LAt0L7QsdC70LDRgdGC0Ywt0L/RgNCw0LLQsNGPLdC90LjQtyI+CjwvZGl2PgpgOwogICAgdmFyIGNzcyA9CmAKI9GB0YDQtdC00LAt0L7QsdC70LDRgdGC0Ywt0LvQtdCy0LDRjwp7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7CiAgICBsZWZ0OiAwOwogICAgd2lkdGg6IGNhbGMoNTAlIC0gMmVtKTsKfQoKI9GB0YDQtdC00LAt0L7QsdC70LDRgdGC0Ywt0LvQtdCy0LDRjy3Qt9Cw0LPQu9GD0YjQutCwCnsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogNTAlOwogICAgbGVmdDogMjUlOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0yNSUpIHRyYW5zbGF0ZVkoLTUwJSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKfQoKI9GA0LXQtNCw0LrRgtC+0YAKewogICAgaGVpZ2h0OiAxMDAlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwp9Cgoj0YHRgNC10LTQsC3QvtCx0LvQsNGB0YLRjC3RhtC10L3RgtGA0LDQu9GM0L3QsNGPLdCy0LXRgNGFCnsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMDsKICAgIGhlaWdodDogNTAlOwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDRlbTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMmVtKTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2RkZDsKICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkZGQ7CiAgICBwYWRkaW5nLXRvcDogMWVtOwp9Cgoj0YHRgNC10LTQsC3QvtCx0LvQsNGB0YLRjC3RhtC10L3RgtGA0LDQu9GM0L3QsNGPLdC90LjQtwp7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBib3R0b206IDA7CiAgICBoZWlnaHQ6IDUwJTsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiA0ZW07CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTJlbSk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkOwogICAgcGFkZGluZy10b3A6IDFlbTsKfQoKI9GB0YDQtdC00LAt0L7QsdC70LDRgdGC0Ywt0L/RgNCw0LLQsNGPLdCy0LXRgNGFCnsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMDsKICAgIGhlaWdodDogNTAlOwogICAgcmlnaHQ6IDA7CiAgICB3aWR0aDogY2FsYyg1MCUgLSAyZW0pOwp9Cgoj0YHRgNC10LTQsC3QvtCx0LvQsNGB0YLRjC3Qv9GA0LDQstCw0Y8t0L3QuNC3CnsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIGJvdHRvbTogMDsKICAgIGhlaWdodDogNTAlOwogICAgcmlnaHQ6IDA7CiAgICB3aWR0aDogY2FsYyg1MCUgLSAyZW0gLSAxcHgpOwp9Cgoj0LLRgdGC0YDQvtC50LrQsAp7CiAgICBib3JkZXI6IDAgbm9uZTsKICAgIHdpZHRoOiBjYWxjKDUwJSAtIDJlbSk7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBwb3NpdGlvbjogZml4ZWQ7Cn0KYDsKCiAgICB2YXIg0Y3QutGA0LDQvSA9INGB0L7Qt9C00LDRgtGM0K3QutGA0LDQvSgi0YHRgNC10LTQsCIpOwogICAg0Y3QutGA0LDQvS5pbm5lckhUTUwgPSBodG1sOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCjRjdC60YDQsNC9KTsKICAgIHZhciDQstC40LQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAg0LLQuNC0LmlubmVySFRNTCA9IGNzczsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQo0LLQuNC0KTsKfTsKCtCh0YDQtdC00LAucHJvdG90eXBlLtGD0YHRgtCw0L3QvtCy0LjRgtGM0KDQtdC00LDQutGC0L7RgCA9IGZ1bmN0aW9uKCkKewogICAg0LzRg9GA0L7QvC7Qt9Cw0LPRgNGD0LfQuNGC0YxBQ0UoKTsKICAgINC80YPRgNC+0Lwu0LfQsNCz0YDRg9C30LjRgtGM0KDQtdC20LjQvEFDRUpTKCk7CiAgICDQvNGD0YDQvtC8LtGA0LXQtNCw0LrRgtC+0YAgPSB3aW5kb3cuYWNlLmVkaXQoItGA0LXQtNCw0LrRgtC+0YAiKTsKICAgINC80YPRgNC+0Lwu0YDQtdC00LDQutGC0L7RgC5zZXNzaW9uLnNldE1vZGUoImFjZS9tb2RlL2phdmFzY3JpcHQiKTsKICAgIAogICAgdGhpcy7RgNC10LTQsNC60YLQvtGAID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoItGA0LXQtNCw0LrRgtC+0YAiKTsKICAgIHRoaXMu0LfQsNCz0LvRg9GI0LrQsNCg0LXQtNCw0LrRgtC+0YDQsCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCLRgdGA0LXQtNCwLdC+0LHQu9Cw0YHRgtGMLdC70LXQstCw0Y8t0LfQsNCz0LvRg9GI0LrQsCIpOwp9OwoK0KHRgNC10LTQsC5wcm90b3R5cGUu0YHQtNC10LvQsNGC0YzQoNC10LTQsNC60YLQvtGA0JLQuNC00LjQvNGL0LwgPSBmdW5jdGlvbijRgdC+0YHRgtC+0Y/QvdC40LUpCnsKICAgIHRoaXMu0YDQtdC00LDQutGC0L7RgC5oaWRkZW4gPSAh0YHQvtGB0YLQvtGP0L3QuNC1OwogICAgdGhpcy7Qt9Cw0LPQu9GD0YjQutCw0KDQtdC00LDQutGC0L7RgNCwLmhpZGRlbiA9ICF0aGlzLtGA0LXQtNCw0LrRgtC+0YAuaGlkZGVuOwp9OwoK0KHRgNC10LTQsC5wcm90b3R5cGUu0LTQvtCx0LDQstC40YLRjNCd0L7QstGL0LnQnNC+0LTRg9C70YwgPSBmdW5jdGlvbigpCnsKICAgIHZhciDQvdC+0LzQtdGAID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTWF0aC5mbG9vcigxMDAwKSk7CiAgICB2YXIg0LjQvNGPID0gItC80L7QtNGD0LvRjC0iICsg0L3QvtC80LXRgDsKICAgINCc0J7QlC7QtNC+0LHQsNCy0LjRgtGMKNC40LzRjywgIiIpOwogICAgCiAgICB0aGlzLtGB0L/QuNGB0L7Qui7QvtCx0L3QvtCy0LjRgtGMKCk7CiAgICB2YXIg0L/QvtC30LjRhtC40Y8gPSDQnNCe0JQu0LzQvtC00YPQu9C4Lmxlbmd0aCAtIDE7CiAgICB0aGlzLtGB0L/QuNGB0L7Qui7QstGL0LHRgNCw0YLRjCjQv9C+0LfQuNGG0LjRjyk7Cn07CgrQodGA0LXQtNCwLnByb3RvdHlwZS7Qv9C+0LTRgtCy0LXRgNC00LjRgtGM0KPQtNCw0LvQtdC90LjQtdCc0L7QtNGD0LvRjyA9IGZ1bmN0aW9uKNC+0YLQutC70LjQuikKewogICAgdmFyINC90L7QvNC10YAgPSB0aGlzLtGB0L/QuNGB0L7Qui7QstGL0LHRgNCw0L3QvdGL0LnQndC+0LzQtdGAOwogICAgaWYgKNC90L7QvNC10YApCiAgICB7CiAgICAgICAgdzJjb25maXJtKHsKICAgICAgICAgICAgdGl0bGU6ICLQn9C+0LTRgtCy0LXRgNC20LTQtdC90LjQtSIsCiAgICAgICAgICAgIG1zZzogItCj0LTQsNC70LjRgtGMINCy0YvQsdGA0LDQvdC90YvQuSDQvNC+0LTRg9C70Yw/IiwKICAgICAgICAgICAgeWVzX3RleHQ6ICLQo9C00LDQu9C40YLRjCIsCiAgICAgICAgICAgIG5vX3RleHQ6ICLQntGC0LzQtdC90LAiLAogICAgICAgICAgICB5ZXNfY2FsbEJhY2s6INC+0YLQutC70LjQuiwKICAgICAgICB9KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB3MmFsZXJ0KCLQktGL0LHQtdGA0LjRgtC1INC80L7QtNGD0LvRjCIsICLQn9C+0Y/RgdC90LXQvdC40LUiKTsKICAgIH0KfTsKCtCh0YDQtdC00LAucHJvdG90eXBlLtGD0LTQsNC70LjRgtGM0JzQvtC00YPQu9GMID0gZnVuY3Rpb24oKQp7CiAgICB2YXIg0L3QvtC80LXRgCA9IHRoaXMu0YHQv9C40YHQvtC6LtCy0YvQsdGA0LDQvdC90YvQudCd0L7QvNC10YA7CiAgICDQnNCe0JQu0YPQtNCw0LvQuNGC0Ywo0L3QvtC80LXRgCk7CiAgICB0aGlzLtGB0L/QuNGB0L7Qui7QvtCx0L3QvtCy0LjRgtGMKCk7CiAgICB0aGlzLtGB0L/QuNGB0L7Qui7QstGL0LHRgNCw0YLRjCjQvdC+0LzQtdGAIC0gMSk7Cn07CgrQodGA0LXQtNCwLnByb3RvdHlwZS7Rg9GB0YLQsNC90L7QstC40YLRjNCc0L7QtNGD0LvQuCA9IGZ1bmN0aW9uKCkKewogICAgdmFyINC+0LHQu9Cw0YHRgtGMID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoItGB0YDQtdC00LAt0L7QsdC70LDRgdGC0Ywt0L/RgNCw0LLQsNGPLdC90LjQtyIpOwogICAgdGhpcy7RgdC/0LjRgdC+0LogPSBuZXcg0KHQv9C40YHQvtC60JzQvtC00YPQu9C10Lko0L7QsdC70LDRgdGC0YwpOwogICAgCiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAKICAgIHRoaXMu0LTQvtCx0LDQstC40YLRjCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCLRgdGA0LXQtNCwLdC00L7QsdCw0LLQuNGC0YwiKTsKICAgIHRoaXMu0LTQvtCx0LDQstC40YLRjC5vbmNsaWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgc2VsZi7QtNC+0LHQsNCy0LjRgtGM0J3QvtCy0YvQudCc0L7QtNGD0LvRjCgpOwogICAgfTsKICAgIAogICAgdGhpcy7Rg9C00LDQu9C40YLRjCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCLRgdGA0LXQtNCwLdGD0LTQsNC70LjRgtGMIik7CiAgICB0aGlzLtGD0LTQsNC70LjRgtGMLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKICAgICAgICBzZWxmLtC/0L7QtNGC0LLQtdGA0LTQuNGC0YzQo9C00LDQu9C10L3QuNC10JzQvtC00YPQu9GPKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzZWxmLtGD0LTQsNC70LjRgtGM0JzQvtC00YPQu9GMKCk7CiAgICAgICAgfSk7CiAgICB9Owp9OwoK0KHRgNC10LTQsC5wcm90b3R5cGUu0L7RgtC+0LHRgNCw0LfQuNGC0YzQmtC+0LTQktGL0LHRgNCw0L3QvdC+0LPQvtCc0L7QtNGD0LvRjyA9IGZ1bmN0aW9uKCkKewogICAgdmFyINC90L7QvNC10YAgPSB0aGlzLtGB0L/QuNGB0L7Qui7QstGL0LHRgNCw0L3QvdGL0LnQndC+0LzQtdGAOwogICAgdGhpcy7RgdC00LXQu9Cw0YLRjNCg0LXQtNCw0LrRgtC+0YDQktC40LTQuNC80YvQvCjQvdC+0LzQtdGAICE9IG51bGwpOwogICAgaWYgKNC90L7QvNC10YApCiAgICB7CiAgICAgICAgdmFyINC60L7QtDY0ID0g0JzQntCULtC80L7QtNGD0LvQuFvQvdC+0LzQtdGAXS5jb2RlNjQ7CiAgICAgICAg0LzRg9GA0L7QvC7RgNC10LTQsNC60YLQvtGALnNlc3Npb24uc2V0VmFsdWUo0LzRg9GA0L7QvC5hdG9iKNC60L7QtDY0KSk7CiAgICB9Cn07CgrQodGA0LXQtNCwLnByb3RvdHlwZS7RgdC70LXQtNC40YLRjNCX0LDQktGL0LHQvtGA0L7QvCA9IGZ1bmN0aW9uKCkKewogICAgdmFyIHNlbGYgPSB0aGlzOwogICAg0LrQvtCz0LTQsCh0aGlzLtGB0L/QuNGB0L7Qui7QuNC30LzQtdC90LjQu9C40JLRi9Cx0L7RgCwgZnVuY3Rpb24oKSB7CiAgICAgICAgc2VsZi7QvtGC0L7QsdGA0LDQt9C40YLRjNCa0L7QtNCS0YvQsdGA0LDQvdC90L7Qs9C+0JzQvtC00YPQu9GPKCk7CiAgICB9KTsKfTsKCtCh0YDQtdC00LAucHJvdG90eXBlLtGB0L7RhdGA0LDQvdC40YLRjNCS0YvQsdGA0LDQvdC90YvQudCc0L7QtNGD0LvRjCA9IGZ1bmN0aW9uKCkKewogICAgdmFyINC90L7QvNC10YAgPSB0aGlzLtGB0L/QuNGB0L7Qui7QstGL0LHRgNCw0L3QvdGL0LnQndC+0LzQtdGAOwogICAgaWYgKNC90L7QvNC10YApCiAgICB7CiAgICAgICAgdmFyINC60L7QtCA9INC80YPRgNC+0Lwu0YDQtdC00LDQutGC0L7RgC5zZXNzaW9uLmdldFZhbHVlKCk7CiAgICAgICAg0JzQntCULtC80L7QtNGD0LvQuFvQvdC+0LzQtdGAXS5jb2RlNjQgPSDQvNGD0YDQvtC8LmJ0b2Eo0LrQvtC0KTsKICAgIH0KfTsKCtCh0YDQtdC00LAucHJvdG90eXBlLtGB0L7RhdGA0LDQvdC40YLRjNCS0YHRkSA9IGZ1bmN0aW9uKCkKewogICAgdmFyINC80L7QtNGD0LvQuCA9INCc0J7QlC7RgdC10YDQuNCw0LvQuNC30L7QstCw0L3QvdGL0LXQnNC+0LTRg9C70Lg7CiAgICBsb2NhbGZvcmFnZS5zZXRJdGVtKCJtb2R1bGVzIiwg0LzQvtC00YPQu9C4LCBmdW5jdGlvbijQvtGI0LjQsdC60LAsINC30L3QsNGH0LXQvdC40LUpIHsKICAgICAgICBpZiAo0L7RiNC40LHQutCwKQogICAgICAgIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigi0J3QtSDRg9C00LDQu9C+0YHRjCDRgdC+0YXRgNCw0L3QuNGC0Ywg0LzQvtC00YPQu9C4OiAnIiArINC+0YjQuNCx0LrQsCArICInIik7CiAgICAgICAgfQogICAgfSk7Cn07CgrQodGA0LXQtNCwLnByb3RvdHlwZS7RgdC60LDRh9Cw0YLRjNCk0LDQudC7ID0gZnVuY3Rpb24oKQp7CiAgICAvLyBIb3cgdG8gY3JlYXRlIGEgZmlsZSBpbiBtZW1vcnkgZm9yIHVzZXIgdG8gZG93bmxvYWQsIGJ1dCBub3QgdGhyb3VnaCBzZXJ2ZXI/CiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTgxOTczNDEKICAgIHZhciDRgdC+0LTQtdGA0LbQuNC80L7QtSA9INC80YPRgNC+0Lwu0YTQsNC50Lsu0L3QsNGH0LDQu9C+OwogICAgdmFyINC80L7QtNGD0LvQuCA9INCc0J7QlC7RgdC10YDQuNCw0LvQuNC30L7QstCw0L3QvdGL0LXQnNC+0LTRg9C70Lg7CiAgICBmb3IgKHZhciDQvdC+0LzQtdGAIGluINC80L7QtNGD0LvQuCkKICAgIHsKICAgICAgICB2YXIg0LwgPSDQvNC+0LTRg9C70Lhb0L3QvtC80LXRgF07CiAgICAgICAg0YHQvtC00LXRgNC20LjQvNC+0LUgKz0KYAoKWwoiYCArINC8WzBdICsgYCIsCiJgICsg0LxbMV0gKyBgIiwKYAorCkpTT04uc3RyaW5naWZ5KNC8WzJdKQorCmAKXSwKYDsKICAgIH0KICAgINGB0L7QtNC10YDQttC40LzQvtC1ICs9INC80YPRgNC+0Lwu0YTQsNC50Lsu0LrQvtC90LXRhjsKICAgINGB0L7QtNC10YDQttC40LzQvtC1ID0g0LzRg9GA0L7QvC5idG9hKNGB0L7QtNC10YDQttC40LzQvtC1KTsKICAgIAogICAgdmFyINGB0YHRi9C70YwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CiAgICDRgdGB0YvQu9GMLnNldEF0dHJpYnV0ZSgiaHJlZiIsICJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwiICsg0YHQvtC00LXRgNC20LjQvNC+0LUpOwogICAgdmFyINC40LzRjyA9INC40LzRj9Ck0LDQudC70LAoKTsKICAgINGB0YHRi9C70Ywuc2V0QXR0cmlidXRlKCJkb3dubG9hZCIsINC40LzRjyk7CiAgICDRgdGB0YvQu9GMLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKNGB0YHRi9C70YwpOwogICAg0YHRgdGL0LvRjC5jbGljaygpOwogICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCjRgdGB0YvQu9GMKTsKfTsKCtCh0YDQtdC00LAucHJvdG90eXBlLtC90LDRgdGC0YDQvtC40YLRjNCh0L7RhdGA0LDQvdC10L3QuNC10KHQutCw0YfQuNCy0LDQvdC40LUgPSBmdW5jdGlvbigpCnsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIAogICAgdGhpcy7RgdC+0YXRgNCw0L3QuNGC0YwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgi0YHRgNC10LTQsC3RgdC+0YXRgNCw0L3QuNGC0YwiKTsKICAgIHRoaXMu0YHQvtGF0YDQsNC90LjRgtGMLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKICAgICAgICBzZWxmLtGB0L7RhdGA0LDQvdC40YLRjNCS0YvQsdGA0LDQvdC90YvQudCc0L7QtNGD0LvRjCgpOwogICAgICAgIHNlbGYu0YHQvtGF0YDQsNC90LjRgtGM0JLRgdGRKCk7CiAgICB9OwogICAgCiAgICB0aGlzLtGB0LrQsNGH0LDRgtGMID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoItGB0YDQtdC00LAt0YHQutCw0YfQsNGC0YwiKTsKICAgIHRoaXMu0YHQutCw0YfQsNGC0Ywub25jbGljayA9IGZ1bmN0aW9uKCkgewogICAgICAgIHNlbGYu0YHQutCw0YfQsNGC0YzQpNCw0LnQuygpOwogICAgfTsKfTsKCi8vINCj0YHRgtCw0L3QvtCy0LrQsAovLyBJbnN0YWxsYXRpb24KaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggPT0gIj8wIikKewogICAgbmV3INCh0YDQtdC00LAoKTsKfQ==", {"status":true} ],