Content-Type: multipart/related; start=; boundary=----------ZDBq1DU4GzMIFwsUruRx8y Content-Location: http://www.icc.cat/vissir3/ Subject: =?utf-8?Q?ICC=20-=20Vissir3?= MIME-Version: 1.0 ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=default.htm Content-Type: text/html; charset=utf-8; name=default.htm Content-ID: Content-Location: http://www.icc.cat/vissir3/ Content-Transfer-Encoding: 8bit ICC - Vissir3 Carregant Aplicació. Navegadors compatibles: Internet Explorer 8 i 9, Firefox 3.6 a 13, i Google Chrome ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=favicon.ico Content-Type: image/x-icon; name=favicon.ico Content-Location: http://www.icc.cat/vissir3/img/favicon.ico Content-Transfer-Encoding: Base64 AAABAAIAEBAAAAAAAABoBQAAJgAAACAgAAAAAAAAqAgAAI4FAAAoAAAAEAAAACAA AAABAAgAAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAHp88Aht7xABDz /wBR0OsAA8rvAOjn5gCX7/8ABpe7AADf/wAIt+EA/+riAA/j/wAA0P8A+Pf2AJLh 8AAGn8QAALnkAP/69QAK8f8ACeH/AATJ9QAA5f8AANb/AAabwAD66eQAB6vSAAO8 5QCW7vsAit7wAA3h/wACuuQAkeHyAADh/wAA1P8AANL/APn49wAHps4A//n1AAeq 0gCH3vEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE DQ0NDQ0fCBMlJSUlJQEAIiQkJCQkDgMaBwcHBwcPACIkJCQkJA4pGgcHBwcHDwAi JCQkJCQOKRoHBwcHBw8AIiQkJCQkDikaBwcHBwcPACIkJCQkJA4pGgcHBwcHDwAX GBgYGBgjIQwaGhoaGicABhwcHBwcIAUQHh4eHh4dAAIZGRkZGQkSIw4ODg4OCgAb EREREREZHBgkJCQkJBUAGxERERERGRwYJCQkJCQVABsRERERERkcGCQkJCQkFQAb EREREREZHBgkJCQkJBUAGxERERERGRwYJCQkJCQVAAsoKCgoKCYWFyIiIiIiFAAA AAAAAAAAAAAAAAAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAA AACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAD//wAAKAAAACAAAABAAAAAAQAIAAAA AACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8ACKjOAG/k/gAi5P8AULnTAK7p 9gDo5+YABcrzAEzT8AA+6f8AlODxAAPh/wBj1OwA/+njAAabvgD19PQAVsTfAAC+ 6ABL3/4Ao+LuAADS/wANsdkAYeX+ADbe/wAc2f8A/PDtAO7t7AD36OUAQ97+AASf xACa3+8AqefzAPLx8AAh2v8AA9z/AJ7h7wAKpssAANb/AAWdwQBNutUAAN7/APnq 5wDw7+4A7OvqAOrp6AA53/8A++7rAALA6QCV3+8AmuHwAFC61QBK4f4ABp/EAADU /wAKqM4AA97/AB/a/wABv+kAAcDoAPfo5ADw7u4ABp3BAAWfxAAKpswAANX/AAmo zgAA0/8AANH/AAPg/wAD3f8AAsDoAAbK8wA43/8ATrrVAEvh/gBM0+8AAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCkkuLi4uLi4u Li4uLkkYBhorKysrKysrKysrKyshEB0pQ0NDQ0NDQ0NDQ0NDQxULKi0tLS0tLS0t LS0tLSw9E0YVFRUVFRUVFRUVFRUVRDEcBwcHBwcHBwcHBwcHLRsTRhUVFRUVFRUV FRUVFRVEMRwHBwcHBwcHBwcHBwctGxNGFRUVFRUVFRUVFRUVFUQxHAcHBwcHBwcH BwcHBy0bE0YVFRUVFRUVFRUVFRUVRDEcBwcHBwcHBwcHBwcHLRsTRhUVFRUVFRUV FRUVFRVEMRwHBwcHBwcHBwcHBwctGxNGFRUVFRUVFRUVFRUVFUQxHAcHBwcHBwcH BwcHBy0bE0YVFRUVFRUVFRUVFRUVRDEcBwcHBwcHBwcHBwcHLRsTRhUVFRUVFRUV FRUVFRVEMRwHBwcHBwcHBwcHBwctGxNGFRUVFRUVFRUVFRUVFUQxHAcHBwcHBwcH BwcHBy0bE0YVFRUVFRUVFRUVFRUVRDEcBwcHBwcHBwcHBwcHLRsTRhUVFRUVFRUV FRUVFRVEMRwHBwcHBwcHBwcHBwctGxNGFRUVFRUVFRUVFRUVFUQxHAcHBwcHBwcH BwcHBy0bS0VBQUFBQUFBQUFBQUFBNiQOPDw8PDw8PDw8PDw8Ki8JSDAwMDAwMDAw MDAwMDA6DRQfHx8fHx8fHx8fHx8yIAVAJz4+Pj4+Pj4+Pj4+Pg8SQURERERERERE RERERBUZMzc/NTU1NTU1NTU1NTU1PjsmFRUVFRUVFRUVFRUVQzkzNz81NTU1NTU1 NTU1NTU+RyYVFRUVFRUVFRUVFRVDIjM3PzU1NTU1NTU1NTU1NT5HJhUVFRUVFRUV FRUVFUMiMzc/NTU1NTU1NTU1NTU1PkcmFRUVFRUVFRUVFRUVQyIzNz81NTU1NTU1 NTU1NTU+RyYVFRUVFRUVFRUVFRVDIjM3PzU1NTU1NTU1NTU1NT5HJhUVFRUVFRUV FRUVFUMiMzc/NTU1NTU1NTU1NTU1PkcmFRUVFRUVFRUVFRUVQyIzNz81NTU1NTU1 NTU1NTU+RyYVFRUVFRUVFRUVFRVDIjM3PzU1NTU1NTU1NTU1NT5HJhUVFRUVFRUV FRUVFUMiMzc/NTU1NTU1NTU1NTU1PkcmFRUVFRUVFRUVFRUVQyIzNz81NTU1NTU1 NTU1NTU+RyYVFRUVFRUVFRUVFRVDIjM3PzU1NTU1NTU1NTU1NT5HJhUVFRUVFRUV FRUVFUMiM0IePz8/Pz8/Pz8/Pz8/JzsmFRUVFRUVFRUVFRUVQyIoFgI3Nzc3Nzc3 Nzc3NzclCAwjIyMjIyMjIyMjIyM4BAARSjMzMzMzMzMzMzMzMwVMSxMTExMTExMT ExMTEzQXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAA= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=ext-base.js Content-Type: application/javascript; charset=utf-8; name=ext-base.js Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/adapter/ext/ext-base.js Content-Transfer-Encoding: Base64 LyoKICogRXh0IEpTIExpYnJhcnkgMy40LjAKICogQ29weXJpZ2h0KGMpIDIwMDYt MjAxMSBTZW5jaGEgSW5jLgogKiBsaWNlbnNpbmdAc2VuY2hhLmNvbQogKiBodHRw Oi8vd3d3LnNlbmNoYS5jb20vbGljZW5zZQogKi8Kd2luZG93LnVuZGVmaW5lZD13 aW5kb3cudW5kZWZpbmVkO0V4dD17dmVyc2lvbjoiMy40LjAiLHZlcnNpb25EZXRh aWw6e21ham9yOjMsbWlub3I6NCxwYXRjaDowfX07RXh0LmFwcGx5PWZ1bmN0aW9u KGQsZSxiKXtpZihiKXtFeHQuYXBwbHkoZCxiKX1pZihkJiZlJiZ0eXBlb2YgZT09 Im9iamVjdCIpe2Zvcih2YXIgYSBpbiBlKXtkW2FdPWVbYV19fXJldHVybiBkfTso ZnVuY3Rpb24oKXt2YXIgZz0wLHU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyx2 PW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSxBPWZ1bmN0aW9uKGUp e3JldHVybiBlLnRlc3Qodil9LGk9ZG9jdW1lbnQsbj1pLmRvY3VtZW50TW9kZSxs PWkuY29tcGF0TW9kZT09IkNTUzFDb21wYXQiLEM9QSgvb3BlcmEvKSxoPUEoL1xi Y2hyb21lXGIvKSx3PUEoL3dlYmtpdC8pLHo9IWgmJkEoL3NhZmFyaS8pLGY9eiYm QSgvYXBwbGV3ZWJraXRcLzQvKSxiPXomJkEoL3ZlcnNpb25cLzMvKSxEPXomJkEo L3ZlcnNpb25cLzQvKSx0PSFDJiZBKC9tc2llLykscj10JiYoQSgvbXNpZSA3Lyl8 fG49PTcpLHE9dCYmKEEoL21zaWUgOC8pJiZuIT03KSxwPXQmJkEoL21zaWUgOS8p LHM9dCYmIXImJiFxJiYhcCxvPSF3JiZBKC9nZWNrby8pLGQ9byYmQSgvcnY6MVwu OC8pLGE9byYmQSgvcnY6MVwuOS8pLHg9dCYmIWwsQj1BKC93aW5kb3dzfHdpbjMy Lyksaz1BKC9tYWNpbnRvc2h8bWFjIG9zIHgvKSxqPUEoL2Fkb2JlYWlyLyksbT1B KC9saW51eC8pLGM9L15odHRwcy9pLnRlc3Qod2luZG93LmxvY2F0aW9uLnByb3Rv Y29sKTtpZihzKXt0cnl7aS5leGVjQ29tbWFuZCgiQmFja2dyb3VuZEltYWdlQ2Fj aGUiLGZhbHNlLHRydWUpfWNhdGNoKHkpe319RXh0LmFwcGx5KEV4dCx7U1NMX1NF Q1VSRV9VUkw6YyYmdD8namF2YXNjcmlwdDoiIic6ImFib3V0OmJsYW5rIixpc1N0 cmljdDpsLGlzU2VjdXJlOmMsaXNSZWFkeTpmYWxzZSxlbmFibGVGb3JjZWRCb3hN b2RlbDpmYWxzZSxlbmFibGVHYXJiYWdlQ29sbGVjdG9yOnRydWUsZW5hYmxlTGlz dGVuZXJDb2xsZWN0aW9uOmZhbHNlLGVuYWJsZU5lc3RlZExpc3RlbmVyUmVtb3Zh bDpmYWxzZSxVU0VfTkFUSVZFX0pTT046ZmFsc2UsYXBwbHlJZjpmdW5jdGlvbihF LEYpe2lmKEUpe2Zvcih2YXIgZSBpbiBGKXtpZighRXh0LmlzRGVmaW5lZChFW2Vd KSl7RVtlXT1GW2VdfX19cmV0dXJuIEV9LGlkOmZ1bmN0aW9uKGUsRSl7ZT1FeHQu Z2V0RG9tKGUsdHJ1ZSl8fHt9O2lmKCFlLmlkKXtlLmlkPShFfHwiZXh0LWdlbiIp KygrK2cpfXJldHVybiBlLmlkfSxleHRlbmQ6ZnVuY3Rpb24oKXt2YXIgRT1mdW5j dGlvbihHKXtmb3IodmFyIEYgaW4gRyl7dGhpc1tGXT1HW0ZdfX07dmFyIGU9T2Jq ZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtyZXR1cm4gZnVuY3Rpb24oTCxJLEsp e2lmKHR5cGVvZiBJPT0ib2JqZWN0Iil7Sz1JO0k9TDtMPUsuY29uc3RydWN0b3Ih PWU/Sy5jb25zdHJ1Y3RvcjpmdW5jdGlvbigpe0kuYXBwbHkodGhpcyxhcmd1bWVu dHMpfX12YXIgSD1mdW5jdGlvbigpe30sSixHPUkucHJvdG90eXBlO0gucHJvdG90 eXBlPUc7Sj1MLnByb3RvdHlwZT1uZXcgSCgpO0ouY29uc3RydWN0b3I9TDtMLnN1 cGVyY2xhc3M9RztpZihHLmNvbnN0cnVjdG9yPT1lKXtHLmNvbnN0cnVjdG9yPUl9 TC5vdmVycmlkZT1mdW5jdGlvbihGKXtFeHQub3ZlcnJpZGUoTCxGKX07Si5zdXBl cmNsYXNzPUouc3Vwcj0oZnVuY3Rpb24oKXtyZXR1cm4gR30pO0oub3ZlcnJpZGU9 RTtFeHQub3ZlcnJpZGUoTCxLKTtMLmV4dGVuZD1mdW5jdGlvbihGKXtyZXR1cm4g RXh0LmV4dGVuZChMLEYpfTtyZXR1cm4gTH19KCksb3ZlcnJpZGU6ZnVuY3Rpb24o ZSxGKXtpZihGKXt2YXIgRT1lLnByb3RvdHlwZTtFeHQuYXBwbHkoRSxGKTtpZihF eHQuaXNJRSYmRi5oYXNPd25Qcm9wZXJ0eSgidG9TdHJpbmciKSl7RS50b1N0cmlu Zz1GLnRvU3RyaW5nfX19LG5hbWVzcGFjZTpmdW5jdGlvbigpe3ZhciBHPWFyZ3Vt ZW50cy5sZW5ndGgsSD0wLEUsRixlLEosSSxLO2Zvcig7SDxHOysrSCl7ZT1hcmd1 bWVudHNbSF07Sj1hcmd1bWVudHNbSF0uc3BsaXQoIi4iKTtLPXdpbmRvd1tKWzBd XTtpZihLPT09dW5kZWZpbmVkKXtLPXdpbmRvd1tKWzBdXT17fX1JPUouc2xpY2Uo MSk7RT1JLmxlbmd0aDtmb3IoRj0wO0Y8RTsrK0Ype0s9S1tJW0ZdXT1LW0lbRl1d fHx7fX19cmV0dXJuIEt9LHVybEVuY29kZTpmdW5jdGlvbihJLEgpe3ZhciBGLEU9 W10sRz1lbmNvZGVVUklDb21wb25lbnQ7RXh0Lml0ZXJhdGUoSSxmdW5jdGlvbihl LEope0Y9RXh0LmlzRW1wdHkoSik7RXh0LmVhY2goRj9lOkosZnVuY3Rpb24oSyl7 RS5wdXNoKCImIixHKGUpLCI9IiwoIUV4dC5pc0VtcHR5KEspJiYoSyE9ZXx8IUYp KT8oRXh0LmlzRGF0ZShLKT9FeHQuZW5jb2RlKEspLnJlcGxhY2UoLyIvZywiIik6 RyhLKSk6IiIpfSl9KTtpZighSCl7RS5zaGlmdCgpO0g9IiJ9cmV0dXJuIEgrRS5q b2luKCIiKX0sdXJsRGVjb2RlOmZ1bmN0aW9uKEYsRSl7aWYoRXh0LmlzRW1wdHko Rikpe3JldHVybnt9fXZhciBJPXt9LEg9Ri5zcGxpdCgiJiIpLEo9ZGVjb2RlVVJJ Q29tcG9uZW50LGUsRztFeHQuZWFjaChILGZ1bmN0aW9uKEspe0s9Sy5zcGxpdCgi PSIpO2U9SihLWzBdKTtHPUooS1sxXSk7SVtlXT1FfHwhSVtlXT9HOltdLmNvbmNh dChJW2VdKS5jb25jYXQoRyl9KTtyZXR1cm4gSX0sdXJsQXBwZW5kOmZ1bmN0aW9u KGUsRSl7aWYoIUV4dC5pc0VtcHR5KEUpKXtyZXR1cm4gZSsoZS5pbmRleE9mKCI/ Iik9PT0tMT8iPyI6IiYiKStFfXJldHVybiBlfSx0b0FycmF5OmZ1bmN0aW9uKCl7 cmV0dXJuIHQ/ZnVuY3Rpb24oRixJLEcsSCl7SD1bXTtmb3IodmFyIEU9MCxlPUYu bGVuZ3RoO0U8ZTtFKyspe0gucHVzaChGW0VdKX1yZXR1cm4gSC5zbGljZShJfHww LEd8fEgubGVuZ3RoKX06ZnVuY3Rpb24oZSxGLEUpe3JldHVybiBBcnJheS5wcm90 b3R5cGUuc2xpY2UuY2FsbChlLEZ8fDAsRXx8ZS5sZW5ndGgpfX0oKSxpc0l0ZXJh YmxlOmZ1bmN0aW9uKGUpe2lmKEV4dC5pc0FycmF5KGUpfHxlLmNhbGxlZSl7cmV0 dXJuIHRydWV9aWYoL05vZGVMaXN0fEhUTUxDb2xsZWN0aW9uLy50ZXN0KHUuY2Fs bChlKSkpe3JldHVybiB0cnVlfXJldHVybigodHlwZW9mIGUubmV4dE5vZGUhPSJ1 bmRlZmluZWQifHxlLml0ZW0pJiZFeHQuaXNOdW1iZXIoZS5sZW5ndGgpKX0sZWFj aDpmdW5jdGlvbihILEcsRil7aWYoRXh0LmlzRW1wdHkoSCx0cnVlKSl7cmV0dXJu fWlmKCFFeHQuaXNJdGVyYWJsZShIKXx8RXh0LmlzUHJpbWl0aXZlKEgpKXtIPVtI XX1mb3IodmFyIEU9MCxlPUgubGVuZ3RoO0U8ZTtFKyspe2lmKEcuY2FsbChGfHxI W0VdLEhbRV0sRSxIKT09PWZhbHNlKXtyZXR1cm4gRX19fSxpdGVyYXRlOmZ1bmN0 aW9uKEYsRSxlKXtpZihFeHQuaXNFbXB0eShGKSl7cmV0dXJufWlmKEV4dC5pc0l0 ZXJhYmxlKEYpKXtFeHQuZWFjaChGLEUsZSk7cmV0dXJufWVsc2V7aWYodHlwZW9m IEY9PSJvYmplY3QiKXtmb3IodmFyIEcgaW4gRil7aWYoRi5oYXNPd25Qcm9wZXJ0 eShHKSl7aWYoRS5jYWxsKGV8fEYsRyxGW0ddLEYpPT09ZmFsc2Upe3JldHVybn19 fX19fSxnZXREb206ZnVuY3Rpb24oRixFKXtpZighRnx8IWkpe3JldHVybiBudWxs fWlmKEYuZG9tKXtyZXR1cm4gRi5kb219ZWxzZXtpZih0eXBlb2YgRj09InN0cmlu ZyIpe3ZhciBHPWkuZ2V0RWxlbWVudEJ5SWQoRik7aWYoRyYmdCYmRSl7aWYoRj09 Ry5nZXRBdHRyaWJ1dGUoImlkIikpe3JldHVybiBHfWVsc2V7cmV0dXJuIG51bGx9 fXJldHVybiBHfWVsc2V7cmV0dXJuIEZ9fX0sZ2V0Qm9keTpmdW5jdGlvbigpe3Jl dHVybiBFeHQuZ2V0KGkuYm9keXx8aS5kb2N1bWVudEVsZW1lbnQpfSxnZXRIZWFk OmZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoZT09dW5kZWZp bmVkKXtlPUV4dC5nZXQoaS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBd KX1yZXR1cm4gZX19KCkscmVtb3ZlTm9kZTp0JiYhcT9mdW5jdGlvbigpe3ZhciBl O3JldHVybiBmdW5jdGlvbihFKXtpZihFJiZFLnRhZ05hbWUhPSJCT0RZIil7KEV4 dC5lbmFibGVOZXN0ZWRMaXN0ZW5lclJlbW92YWwpP0V4dC5FdmVudE1hbmFnZXIu cHVyZ2VFbGVtZW50KEUsdHJ1ZSk6RXh0LkV2ZW50TWFuYWdlci5yZW1vdmVBbGwo RSk7ZT1lfHxpLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuYXBwZW5kQ2hpbGQoRSk7 ZS5pbm5lckhUTUw9IiI7ZGVsZXRlIEV4dC5lbENhY2hlW0UuaWRdfX19KCk6ZnVu Y3Rpb24oZSl7aWYoZSYmZS5wYXJlbnROb2RlJiZlLnRhZ05hbWUhPSJCT0RZIil7 KEV4dC5lbmFibGVOZXN0ZWRMaXN0ZW5lclJlbW92YWwpP0V4dC5FdmVudE1hbmFn ZXIucHVyZ2VFbGVtZW50KGUsdHJ1ZSk6RXh0LkV2ZW50TWFuYWdlci5yZW1vdmVB bGwoZSk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2RlbGV0ZSBFeHQuZWxD YWNoZVtlLmlkXX19LGlzRW1wdHk6ZnVuY3Rpb24oRSxlKXtyZXR1cm4gRT09PW51 bGx8fEU9PT11bmRlZmluZWR8fCgoRXh0LmlzQXJyYXkoRSkmJiFFLmxlbmd0aCkp fHwoIWU/RT09PSIiOmZhbHNlKX0saXNBcnJheTpmdW5jdGlvbihlKXtyZXR1cm4g dS5hcHBseShlKT09PSJbb2JqZWN0IEFycmF5XSJ9LGlzRGF0ZTpmdW5jdGlvbihl KXtyZXR1cm4gdS5hcHBseShlKT09PSJbb2JqZWN0IERhdGVdIn0saXNPYmplY3Q6 ZnVuY3Rpb24oZSl7cmV0dXJuICEhZSYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmlu Zy5jYWxsKGUpPT09IltvYmplY3QgT2JqZWN0XSJ9LGlzUHJpbWl0aXZlOmZ1bmN0 aW9uKGUpe3JldHVybiBFeHQuaXNTdHJpbmcoZSl8fEV4dC5pc051bWJlcihlKXx8 RXh0LmlzQm9vbGVhbihlKX0saXNGdW5jdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4g dS5hcHBseShlKT09PSJbb2JqZWN0IEZ1bmN0aW9uXSJ9LGlzTnVtYmVyOmZ1bmN0 aW9uKGUpe3JldHVybiB0eXBlb2YgZT09PSJudW1iZXIiJiZpc0Zpbml0ZShlKX0s aXNTdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlPT09InN0cmluZyJ9 LGlzQm9vbGVhbjpmdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PT0iYm9vbGVh biJ9LGlzRWxlbWVudDpmdW5jdGlvbihlKXtyZXR1cm4gZT8hIWUudGFnTmFtZTpm YWxzZX0saXNEZWZpbmVkOmZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZSE9PSJ1 bmRlZmluZWQifSxpc09wZXJhOkMsaXNXZWJLaXQ6dyxpc0Nocm9tZTpoLGlzU2Fm YXJpOnosaXNTYWZhcmkzOmIsaXNTYWZhcmk0OkQsaXNTYWZhcmkyOmYsaXNJRTp0 LGlzSUU2OnMsaXNJRTc6cixpc0lFODpxLGlzSUU5OnAsaXNHZWNrbzpvLGlzR2Vj a28yOmQsaXNHZWNrbzM6YSxpc0JvcmRlckJveDp4LGlzTGludXg6bSxpc1dpbmRv d3M6Qixpc01hYzprLGlzQWlyOmp9KTtFeHQubnM9RXh0Lm5hbWVzcGFjZX0pKCk7 RXh0Lm5zKCJFeHQudXRpbCIsIkV4dC5saWIiLCJFeHQuZGF0YSIsIkV4dC5zdXBw b3J0cyIpO0V4dC5lbENhY2hlPXt9O0V4dC5hcHBseShGdW5jdGlvbi5wcm90b3R5 cGUse2NyZWF0ZUludGVyY2VwdG9yOmZ1bmN0aW9uKGIsYSl7dmFyIGM9dGhpczty ZXR1cm4gIUV4dC5pc0Z1bmN0aW9uKGIpP3RoaXM6ZnVuY3Rpb24oKXt2YXIgZT10 aGlzLGQ9YXJndW1lbnRzO2IudGFyZ2V0PWU7Yi5tZXRob2Q9YztyZXR1cm4oYi5h cHBseShhfHxlfHx3aW5kb3csZCkhPT1mYWxzZSk/Yy5hcHBseShlfHx3aW5kb3cs ZCk6bnVsbH19LGNyZWF0ZUNhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1l bnRzLGI9dGhpcztyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYi5hcHBseSh3aW5k b3csYSl9fSxjcmVhdGVEZWxlZ2F0ZTpmdW5jdGlvbihjLGIsYSl7dmFyIGQ9dGhp cztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZj1ifHxhcmd1bWVudHM7aWYoYT09PXRy dWUpe2Y9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO2Y9 Zi5jb25jYXQoYil9ZWxzZXtpZihFeHQuaXNOdW1iZXIoYSkpe2Y9QXJyYXkucHJv dG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3ZhciBlPVthLDBdLmNvbmNh dChiKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGYsZSl9fXJldHVybiBk LmFwcGx5KGN8fHdpbmRvdyxmKX19LGRlZmVyOmZ1bmN0aW9uKGMsZSxiLGEpe3Zh ciBkPXRoaXMuY3JlYXRlRGVsZWdhdGUoZSxiLGEpO2lmKGM+MCl7cmV0dXJuIHNl dFRpbWVvdXQoZCxjKX1kKCk7cmV0dXJuIDB9fSk7RXh0LmFwcGx5SWYoU3RyaW5n LHtmb3JtYXQ6ZnVuY3Rpb24oYil7dmFyIGE9RXh0LnRvQXJyYXkoYXJndW1lbnRz LDEpO3JldHVybiBiLnJlcGxhY2UoL1x7KFxkKylcfS9nLGZ1bmN0aW9uKGMsZCl7 cmV0dXJuIGFbZF19KX19KTtFeHQuYXBwbHlJZihBcnJheS5wcm90b3R5cGUse2lu ZGV4T2Y6ZnVuY3Rpb24oYixjKXt2YXIgYT10aGlzLmxlbmd0aDtjPWN8fDA7Yys9 KGM8MCk/YTowO2Zvcig7YzxhOysrYyl7aWYodGhpc1tjXT09PWIpe3JldHVybiBj fX1yZXR1cm4gLTF9LHJlbW92ZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmluZGV4 T2YoYik7aWYoYSE9LTEpe3RoaXMuc3BsaWNlKGEsMSl9cmV0dXJuIHRoaXN9fSk7 RXh0LnV0aWwuVGFza1J1bm5lcj1mdW5jdGlvbihlKXtlPWV8fDEwO3ZhciBmPVtd LGE9W10sYj0wLGc9ZmFsc2UsZD1mdW5jdGlvbigpe2c9ZmFsc2U7Y2xlYXJJbnRl cnZhbChiKTtiPTB9LGg9ZnVuY3Rpb24oKXtpZighZyl7Zz10cnVlO2I9c2V0SW50 ZXJ2YWwoaSxlKX19LGM9ZnVuY3Rpb24oail7YS5wdXNoKGopO2lmKGoub25TdG9w KXtqLm9uU3RvcC5hcHBseShqLnNjb3BlfHxqKX19LGk9ZnVuY3Rpb24oKXt2YXIg bD1hLmxlbmd0aCxuPW5ldyBEYXRlKCkuZ2V0VGltZSgpO2lmKGw+MCl7Zm9yKHZh ciBwPTA7cDxsO3ArKyl7Zi5yZW1vdmUoYVtwXSl9YT1bXTtpZihmLmxlbmd0aDwx KXtkKCk7cmV0dXJufX1mb3IodmFyIHA9MCxvLGssbSxqPWYubGVuZ3RoO3A8ajsr K3Ape289ZltwXTtrPW4tby50YXNrUnVuVGltZTtpZihvLmludGVydmFsPD1rKXtt PW8ucnVuLmFwcGx5KG8uc2NvcGV8fG8sby5hcmdzfHxbKytvLnRhc2tSdW5Db3Vu dF0pO28udGFza1J1blRpbWU9bjtpZihtPT09ZmFsc2V8fG8udGFza1J1bkNvdW50 PT09by5yZXBlYXQpe2Mobyk7cmV0dXJufX1pZihvLmR1cmF0aW9uJiZvLmR1cmF0 aW9uPD0obi1vLnRhc2tTdGFydFRpbWUpKXtjKG8pfX19O3RoaXMuc3RhcnQ9ZnVu Y3Rpb24oail7Zi5wdXNoKGopO2oudGFza1N0YXJ0VGltZT1uZXcgRGF0ZSgpLmdl dFRpbWUoKTtqLnRhc2tSdW5UaW1lPTA7ai50YXNrUnVuQ291bnQ9MDtoKCk7cmV0 dXJuIGp9O3RoaXMuc3RvcD1mdW5jdGlvbihqKXtjKGopO3JldHVybiBqfTt0aGlz LnN0b3BBbGw9ZnVuY3Rpb24oKXtkKCk7Zm9yKHZhciBrPTAsaj1mLmxlbmd0aDtr PGo7aysrKXtpZihmW2tdLm9uU3RvcCl7ZltrXS5vblN0b3AoKX19Zj1bXTthPVtd fX07RXh0LlRhc2tNZ3I9bmV3IEV4dC51dGlsLlRhc2tSdW5uZXIoKTsoZnVuY3Rp b24oKXt2YXIgYjtmdW5jdGlvbiBjKGQpe2lmKCFiKXtiPW5ldyBFeHQuRWxlbWVu dC5GbHl3ZWlnaHQoKX1iLmRvbT1kO3JldHVybiBifShmdW5jdGlvbigpe3ZhciBn PWRvY3VtZW50LGU9Zy5jb21wYXRNb2RlPT0iQ1NTMUNvbXBhdCIsZj1NYXRoLm1h eCxkPU1hdGgucm91bmQsaD1wYXJzZUludDtFeHQubGliLkRvbT17aXNBbmNlc3Rv cjpmdW5jdGlvbihqLGspe3ZhciBpPWZhbHNlO2o9RXh0LmdldERvbShqKTtrPUV4 dC5nZXREb20oayk7aWYoaiYmayl7aWYoai5jb250YWlucyl7cmV0dXJuIGouY29u dGFpbnMoayl9ZWxzZXtpZihqLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXtyZXR1 cm4gISEoai5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihrKSYxNil9ZWxzZXt3aGls ZShrPWsucGFyZW50Tm9kZSl7aT1rPT1qfHxpfX19fXJldHVybiBpfSxnZXRWaWV3 V2lkdGg6ZnVuY3Rpb24oaSl7cmV0dXJuIGk/dGhpcy5nZXREb2N1bWVudFdpZHRo KCk6dGhpcy5nZXRWaWV3cG9ydFdpZHRoKCl9LGdldFZpZXdIZWlnaHQ6ZnVuY3Rp b24oaSl7cmV0dXJuIGk/dGhpcy5nZXREb2N1bWVudEhlaWdodCgpOnRoaXMuZ2V0 Vmlld3BvcnRIZWlnaHQoKX0sZ2V0RG9jdW1lbnRIZWlnaHQ6ZnVuY3Rpb24oKXty ZXR1cm4gZighZT9nLmJvZHkuc2Nyb2xsSGVpZ2h0OmcuZG9jdW1lbnRFbGVtZW50 LnNjcm9sbEhlaWdodCx0aGlzLmdldFZpZXdwb3J0SGVpZ2h0KCkpfSxnZXREb2N1 bWVudFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIGYoIWU/Zy5ib2R5LnNjcm9sbFdp ZHRoOmcuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLHRoaXMuZ2V0Vmlld3Bv cnRXaWR0aCgpKX0sZ2V0Vmlld3BvcnRIZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4g RXh0LmlzSUU/KEV4dC5pc1N0cmljdD9nLmRvY3VtZW50RWxlbWVudC5jbGllbnRI ZWlnaHQ6Zy5ib2R5LmNsaWVudEhlaWdodCk6c2VsZi5pbm5lckhlaWdodH0sZ2V0 Vmlld3BvcnRXaWR0aDpmdW5jdGlvbigpe3JldHVybiAhRXh0LmlzU3RyaWN0JiYh RXh0LmlzT3BlcmE/Zy5ib2R5LmNsaWVudFdpZHRoOkV4dC5pc0lFP2cuZG9jdW1l bnRFbGVtZW50LmNsaWVudFdpZHRoOnNlbGYuaW5uZXJXaWR0aH0sZ2V0WTpmdW5j dGlvbihpKXtyZXR1cm4gdGhpcy5nZXRYWShpKVsxXX0sZ2V0WDpmdW5jdGlvbihp KXtyZXR1cm4gdGhpcy5nZXRYWShpKVswXX0sZ2V0WFk6ZnVuY3Rpb24oayl7dmFy IGoscSxzLHYsbCxtLHU9MCxyPTAsdCxpLG49KGcuYm9keXx8Zy5kb2N1bWVudEVs ZW1lbnQpLG89WzAsMF07az1FeHQuZ2V0RG9tKGspO2lmKGshPW4pe2lmKGsuZ2V0 Qm91bmRpbmdDbGllbnRSZWN0KXtzPWsuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7 dD1jKGRvY3VtZW50KS5nZXRTY3JvbGwoKTtvPVtkKHMubGVmdCt0LmxlZnQpLGQo cy50b3ArdC50b3ApXX1lbHNle2o9aztpPWMoaykuaXNTdHlsZSgicG9zaXRpb24i LCJhYnNvbHV0ZSIpO3doaWxlKGope3E9YyhqKTt1Kz1qLm9mZnNldExlZnQ7cis9 ai5vZmZzZXRUb3A7aT1pfHxxLmlzU3R5bGUoInBvc2l0aW9uIiwiYWJzb2x1dGUi KTtpZihFeHQuaXNHZWNrbyl7cis9dj1oKHEuZ2V0U3R5bGUoImJvcmRlclRvcFdp ZHRoIiksMTApfHwwO3UrPWw9aChxLmdldFN0eWxlKCJib3JkZXJMZWZ0V2lkdGgi KSwxMCl8fDA7aWYoaiE9ayYmIXEuaXNTdHlsZSgib3ZlcmZsb3ciLCJ2aXNpYmxl Iikpe3UrPWw7cis9dn19aj1qLm9mZnNldFBhcmVudH1pZihFeHQuaXNTYWZhcmkm Jmkpe3UtPW4ub2Zmc2V0TGVmdDtyLT1uLm9mZnNldFRvcH1pZihFeHQuaXNHZWNr byYmIWkpe209YyhuKTt1Kz1oKG0uZ2V0U3R5bGUoImJvcmRlckxlZnRXaWR0aCIp LDEwKXx8MDtyKz1oKG0uZ2V0U3R5bGUoImJvcmRlclRvcFdpZHRoIiksMTApfHww fWo9ay5wYXJlbnROb2RlO3doaWxlKGomJmohPW4pe2lmKCFFeHQuaXNPcGVyYXx8 KGoudGFnTmFtZSE9IlRSIiYmIWMoaikuaXNTdHlsZSgiZGlzcGxheSIsImlubGlu ZSIpKSl7dS09ai5zY3JvbGxMZWZ0O3ItPWouc2Nyb2xsVG9wfWo9ai5wYXJlbnRO b2RlfW89W3Uscl19fXJldHVybiBvfSxzZXRYWTpmdW5jdGlvbihqLGspeyhqPUV4 dC5mbHkoaiwiX3NldFhZIikpLnBvc2l0aW9uKCk7dmFyIGw9ai50cmFuc2xhdGVQ b2ludHMoayksaT1qLmRvbS5zdHlsZSxtO2ZvcihtIGluIGwpe2lmKCFpc05hTihs W21dKSl7aVttXT1sW21dKyJweCJ9fX0sc2V0WDpmdW5jdGlvbihqLGkpe3RoaXMu c2V0WFkoaixbaSxmYWxzZV0pfSxzZXRZOmZ1bmN0aW9uKGksail7dGhpcy5zZXRY WShpLFtmYWxzZSxqXSl9fX0pKCk7RXh0LmxpYi5FdmVudD1mdW5jdGlvbigpe3Zh ciB2PWZhbHNlLGY9e30sej0wLG89W10sZCxBPWZhbHNlLGs9d2luZG93LEU9ZG9j dW1lbnQsbD0yMDAscj0yMCxwPTAsaT0xLHM9Mix3PTMsdD0ic2Nyb2xsTGVmdCIs cT0ic2Nyb2xsVG9wIixnPSJ1bmxvYWQiLHk9Im1vdXNlb3ZlciIsRD0ibW91c2Vv dXQiLGU9ZnVuY3Rpb24oKXt2YXIgRjtpZihrLmFkZEV2ZW50TGlzdGVuZXIpe0Y9 ZnVuY3Rpb24oSixILEksRyl7aWYoSD09Im1vdXNlZW50ZXIiKXtJPUkuY3JlYXRl SW50ZXJjZXB0b3Iobik7Si5hZGRFdmVudExpc3RlbmVyKHksSSwoRykpfWVsc2V7 aWYoSD09Im1vdXNlbGVhdmUiKXtJPUkuY3JlYXRlSW50ZXJjZXB0b3Iobik7Si5h ZGRFdmVudExpc3RlbmVyKEQsSSwoRykpfWVsc2V7Si5hZGRFdmVudExpc3RlbmVy KEgsSSwoRykpfX1yZXR1cm4gSX19ZWxzZXtpZihrLmF0dGFjaEV2ZW50KXtGPWZ1 bmN0aW9uKEosSCxJLEcpe0ouYXR0YWNoRXZlbnQoIm9uIitILEkpO3JldHVybiBJ fX1lbHNle0Y9ZnVuY3Rpb24oKXt9fX1yZXR1cm4gRn0oKSxoPWZ1bmN0aW9uKCl7 dmFyIEY7aWYoay5yZW1vdmVFdmVudExpc3RlbmVyKXtGPWZ1bmN0aW9uKEosSCxJ LEcpe2lmKEg9PSJtb3VzZWVudGVyIil7SD15fWVsc2V7aWYoSD09Im1vdXNlbGVh dmUiKXtIPUR9fUoucmVtb3ZlRXZlbnRMaXN0ZW5lcihILEksKEcpKX19ZWxzZXtp ZihrLmRldGFjaEV2ZW50KXtGPWZ1bmN0aW9uKEksRyxIKXtJLmRldGFjaEV2ZW50 KCJvbiIrRyxIKX19ZWxzZXtGPWZ1bmN0aW9uKCl7fX19cmV0dXJuIEZ9KCk7ZnVu Y3Rpb24gbihGKXtyZXR1cm4gIXUoRi5jdXJyZW50VGFyZ2V0LHguZ2V0UmVsYXRl ZFRhcmdldChGKSl9ZnVuY3Rpb24gdShGLEcpe2lmKEYmJkYuZmlyc3RDaGlsZCl7 d2hpbGUoRyl7aWYoRz09PUYpe3JldHVybiB0cnVlfUc9Ry5wYXJlbnROb2RlO2lm KEcmJihHLm5vZGVUeXBlIT0xKSl7Rz1udWxsfX19cmV0dXJuIGZhbHNlfWZ1bmN0 aW9uIEIoKXt2YXIgRz1mYWxzZSxMPVtdLEosSSxGLEgsSz0hdnx8KHo+MCk7aWYo IUEpe0E9dHJ1ZTtmb3IoST0wO0k8by5sZW5ndGg7KytJKXtGPW9bSV07aWYoRiYm KEo9RS5nZXRFbGVtZW50QnlJZChGLmlkKSkpe2lmKCFGLmNoZWNrUmVhZHl8fHZ8 fEoubmV4dFNpYmxpbmd8fChFJiZFLmJvZHkpKXtIPUYub3ZlcnJpZGU7Sj1IPyhI PT09dHJ1ZT9GLm9iajpIKTpKO0YuZm4uY2FsbChKLEYub2JqKTtvLnJlbW92ZShG KTstLUl9ZWxzZXtMLnB1c2goRil9fX16PShMLmxlbmd0aD09PTApPzA6ei0xO2lm KEspe20oKX1lbHNle2NsZWFySW50ZXJ2YWwoZCk7ZD1udWxsfUc9IShBPWZhbHNl KX1yZXR1cm4gR31mdW5jdGlvbiBtKCl7aWYoIWQpe3ZhciBGPWZ1bmN0aW9uKCl7 QigpfTtkPXNldEludGVydmFsKEYscil9fWZ1bmN0aW9uIEMoKXt2YXIgRj1FLmRv Y3VtZW50RWxlbWVudCxHPUUuYm9keTtpZihGJiYoRltxXXx8Rlt0XSkpe3JldHVy bltGW3RdLEZbcV1dfWVsc2V7aWYoRyl7cmV0dXJuW0dbdF0sR1txXV19ZWxzZXty ZXR1cm5bMCwwXX19fWZ1bmN0aW9uIGooRixHKXtGPUYuYnJvd3NlckV2ZW50fHxG O3ZhciBIPUZbInBhZ2UiK0ddO2lmKCFIJiZIIT09MCl7SD1GWyJjbGllbnQiK0dd fHwwO2lmKEV4dC5pc0lFKXtIKz1DKClbRz09IlgiPzA6MV19fXJldHVybiBIfXZh ciB4PXtleHRBZGFwdGVyOnRydWUsb25BdmFpbGFibGU6ZnVuY3Rpb24oSCxGLEks Ryl7by5wdXNoKHtpZDpILGZuOkYsb2JqOkksb3ZlcnJpZGU6RyxjaGVja1JlYWR5 OmZhbHNlfSk7ej1sO20oKX0sYWRkTGlzdGVuZXI6ZnVuY3Rpb24oSCxGLEcpe0g9 RXh0LmdldERvbShIKTtpZihIJiZHKXtpZihGPT1nKXtpZihmW0guaWRdPT09dW5k ZWZpbmVkKXtmW0guaWRdPVtdfWZbSC5pZF0ucHVzaChbRixHXSk7cmV0dXJuIEd9 cmV0dXJuIGUoSCxGLEcsZmFsc2UpfXJldHVybiBmYWxzZX0scmVtb3ZlTGlzdGVu ZXI6ZnVuY3Rpb24oTCxILEspe0w9RXh0LmdldERvbShMKTt2YXIgSixHLEYsSTtp ZihMJiZLKXtpZihIPT1nKXtpZigoST1mW0wuaWRdKSE9PXVuZGVmaW5lZCl7Zm9y KEo9MCxHPUkubGVuZ3RoO0o8RztKKyspe2lmKChGPUlbSl0pJiZGW3BdPT1IJiZG W2ldPT1LKXtmW0wuaWRdLnNwbGljZShKLDEpfX19cmV0dXJufWgoTCxILEssZmFs c2UpfX0sZ2V0VGFyZ2V0OmZ1bmN0aW9uKEYpe0Y9Ri5icm93c2VyRXZlbnR8fEY7 cmV0dXJuIHRoaXMucmVzb2x2ZVRleHROb2RlKEYudGFyZ2V0fHxGLnNyY0VsZW1l bnQpfSxyZXNvbHZlVGV4dE5vZGU6RXh0LmlzR2Vja28/ZnVuY3Rpb24oRyl7aWYo IUcpe3JldHVybn12YXIgRj1IVE1MRWxlbWVudC5wcm90b3R5cGUudG9TdHJpbmcu Y2FsbChHKTtpZihGPT0iW3hwY29ubmVjdCB3cmFwcGVkIG5hdGl2ZSBwcm90b3R5 cGVdInx8Rj09IltvYmplY3QgWFVMRWxlbWVudF0iKXtyZXR1cm59cmV0dXJuIEcu bm9kZVR5cGU9PTM/Ry5wYXJlbnROb2RlOkd9OmZ1bmN0aW9uKEYpe3JldHVybiBG JiZGLm5vZGVUeXBlPT0zP0YucGFyZW50Tm9kZTpGfSxnZXRSZWxhdGVkVGFyZ2V0 OmZ1bmN0aW9uKEYpe0Y9Ri5icm93c2VyRXZlbnR8fEY7cmV0dXJuIHRoaXMucmVz b2x2ZVRleHROb2RlKEYucmVsYXRlZFRhcmdldHx8KC8obW91c2VvdXR8bW91c2Vs ZWF2ZSkvLnRlc3QoRi50eXBlKT9GLnRvRWxlbWVudDovKG1vdXNlb3Zlcnxtb3Vz ZWVudGVyKS8udGVzdChGLnR5cGUpP0YuZnJvbUVsZW1lbnQ6bnVsbCkpfSxnZXRQ YWdlWDpmdW5jdGlvbihGKXtyZXR1cm4gaihGLCJYIil9LGdldFBhZ2VZOmZ1bmN0 aW9uKEYpe3JldHVybiBqKEYsIlkiKX0sZ2V0WFk6ZnVuY3Rpb24oRil7cmV0dXJu W3RoaXMuZ2V0UGFnZVgoRiksdGhpcy5nZXRQYWdlWShGKV19LHN0b3BFdmVudDpm dW5jdGlvbihGKXt0aGlzLnN0b3BQcm9wYWdhdGlvbihGKTt0aGlzLnByZXZlbnRE ZWZhdWx0KEYpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oRil7Rj1GLmJyb3dz ZXJFdmVudHx8RjtpZihGLnN0b3BQcm9wYWdhdGlvbil7Ri5zdG9wUHJvcGFnYXRp b24oKX1lbHNle0YuY2FuY2VsQnViYmxlPXRydWV9fSxwcmV2ZW50RGVmYXVsdDpm dW5jdGlvbihGKXtGPUYuYnJvd3NlckV2ZW50fHxGO2lmKEYucHJldmVudERlZmF1 bHQpe0YucHJldmVudERlZmF1bHQoKX1lbHNle2lmKEYua2V5Q29kZSl7Ri5rZXlD b2RlPTB9Ri5yZXR1cm5WYWx1ZT1mYWxzZX19LGdldEV2ZW50OmZ1bmN0aW9uKEYp e0Y9Rnx8ay5ldmVudDtpZighRil7dmFyIEc9dGhpcy5nZXRFdmVudC5jYWxsZXI7 d2hpbGUoRyl7Rj1HLmFyZ3VtZW50c1swXTtpZihGJiZFdmVudD09Ri5jb25zdHJ1 Y3Rvcil7YnJlYWt9Rz1HLmNhbGxlcn19cmV0dXJuIEZ9LGdldENoYXJDb2RlOmZ1 bmN0aW9uKEYpe0Y9Ri5icm93c2VyRXZlbnR8fEY7cmV0dXJuIEYuY2hhckNvZGV8 fEYua2V5Q29kZXx8MH0sZ2V0TGlzdGVuZXJzOmZ1bmN0aW9uKEcsRil7RXh0LkV2 ZW50TWFuYWdlci5nZXRMaXN0ZW5lcnMoRyxGKX0scHVyZ2VFbGVtZW50OmZ1bmN0 aW9uKEcsSCxGKXtFeHQuRXZlbnRNYW5hZ2VyLnB1cmdlRWxlbWVudChHLEgsRil9 LF9sb2FkOmZ1bmN0aW9uKEYpe3Y9dHJ1ZTtpZihFeHQuaXNJRSYmRiE9PXRydWUp e2goaywibG9hZCIsYXJndW1lbnRzLmNhbGxlZSl9fSxfdW5sb2FkOmZ1bmN0aW9u KEope3ZhciBHPUV4dC5saWIuRXZlbnQsSCxNLEssRixJLE47Zm9yKEYgaW4gZil7 Sz1mW0ZdO2ZvcihIPTAsST1LLmxlbmd0aDtIPEk7SCsrKXtNPUtbSF07aWYoTSl7 dHJ5e049TVt3XT8oTVt3XT09PXRydWU/TVtzXTpNW3ddKTprO01baV0uY2FsbChO LEcuZ2V0RXZlbnQoSiksTVtzXSl9Y2F0Y2goTCl7fX19fUV4dC5FdmVudE1hbmFn ZXIuX3VubG9hZCgpO2goayxnLEcuX3VubG9hZCl9fTt4Lm9uPXguYWRkTGlzdGVu ZXI7eC51bj14LnJlbW92ZUxpc3RlbmVyO2lmKEUmJkUuYm9keSl7eC5fbG9hZCh0 cnVlKX1lbHNle2UoaywibG9hZCIseC5fbG9hZCl9ZShrLGcseC5fdW5sb2FkKTtC KCk7cmV0dXJuIHh9KCk7RXh0LmxpYi5BamF4PWZ1bmN0aW9uKCl7dmFyIGc9WyJN c3htbDIuWE1MSFRUUC42LjAiLCJNc3htbDIuWE1MSFRUUC4zLjAiLCJNc3htbDIu WE1MSFRUUCJdLGQ9IkNvbnRlbnQtVHlwZSI7ZnVuY3Rpb24gaCh2KXt2YXIgdD12 LmNvbm4sdyx1PXt9O2Z1bmN0aW9uIHMoeCx5KXtmb3IodyBpbiB5KXtpZih5Lmhh c093blByb3BlcnR5KHcpKXt4LnNldFJlcXVlc3RIZWFkZXIodyx5W3ddKX19fUV4 dC5hcHBseSh1LGsuaGVhZGVycyxrLmRlZmF1bHRIZWFkZXJzKTtzKHQsdSk7ZGVs ZXRlIGsuaGVhZGVyc31mdW5jdGlvbiBlKHYsdSx0LHMpe3JldHVybnt0SWQ6dixz dGF0dXM6dD8tMTowLHN0YXR1c1RleHQ6dD8idHJhbnNhY3Rpb24gYWJvcnRlZCI6 ImNvbW11bmljYXRpb24gZmFpbHVyZSIsaXNBYm9ydDp0LGlzVGltZW91dDpzLGFy Z3VtZW50OnV9fWZ1bmN0aW9uIGoocyx0KXsoay5oZWFkZXJzPWsuaGVhZGVyc3x8 e30pW3NdPXR9ZnVuY3Rpb24gcCh1LHkpe3ZhciBDPXt9LHgsdz11LmNvbm4sQSxC LHY9dy5zdGF0dXM9PTEyMjM7dHJ5e3g9dS5jb25uLmdldEFsbFJlc3BvbnNlSGVh ZGVycygpO0V4dC5lYWNoKHgucmVwbGFjZSgvXHJcbi9nLCJcbiIpLnNwbGl0KCJc biIpLGZ1bmN0aW9uKHMpe0E9cy5pbmRleE9mKCI6Iik7aWYoQT49MCl7Qj1zLnN1 YnN0cigwLEEpLnRvTG93ZXJDYXNlKCk7aWYocy5jaGFyQXQoQSsxKT09IiAiKXsr K0F9Q1tCXT1zLnN1YnN0cihBKzEpfX0pfWNhdGNoKHope31yZXR1cm57dElkOnUu dElkLHN0YXR1czp2PzIwNDp3LnN0YXR1cyxzdGF0dXNUZXh0OnY/Ik5vIENvbnRl bnQiOncuc3RhdHVzVGV4dCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihzKXty ZXR1cm4gQ1tzLnRvTG93ZXJDYXNlKCldfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6 ZnVuY3Rpb24oKXtyZXR1cm4geH0scmVzcG9uc2VUZXh0OncucmVzcG9uc2VUZXh0 LHJlc3BvbnNlWE1MOncucmVzcG9uc2VYTUwsYXJndW1lbnQ6eX19ZnVuY3Rpb24g byhzKXtpZihzLnRJZCl7ay5jb25uW3MudElkXT1udWxsfXMuY29ubj1udWxsO3M9 bnVsbH1mdW5jdGlvbiBmKHgseSx0LHMpe2lmKCF5KXtvKHgpO3JldHVybn12YXIg dix1O3RyeXtpZih4LmNvbm4uc3RhdHVzIT09dW5kZWZpbmVkJiZ4LmNvbm4uc3Rh dHVzIT0wKXt2PXguY29ubi5zdGF0dXN9ZWxzZXt2PTEzMDMwfX1jYXRjaCh3KXt2 PTEzMDMwfWlmKCh2Pj0yMDAmJnY8MzAwKXx8KEV4dC5pc0lFJiZ2PT0xMjIzKSl7 dT1wKHgseS5hcmd1bWVudCk7aWYoeS5zdWNjZXNzKXtpZigheS5zY29wZSl7eS5z dWNjZXNzKHUpfWVsc2V7eS5zdWNjZXNzLmFwcGx5KHkuc2NvcGUsW3VdKX19fWVs c2V7c3dpdGNoKHYpe2Nhc2UgMTIwMDI6Y2FzZSAxMjAyOTpjYXNlIDEyMDMwOmNh c2UgMTIwMzE6Y2FzZSAxMjE1MjpjYXNlIDEzMDMwOnU9ZSh4LnRJZCx5LmFyZ3Vt ZW50LCh0P3Q6ZmFsc2UpLHMpO2lmKHkuZmFpbHVyZSl7aWYoIXkuc2NvcGUpe3ku ZmFpbHVyZSh1KX1lbHNle3kuZmFpbHVyZS5hcHBseSh5LnNjb3BlLFt1XSl9fWJy ZWFrO2RlZmF1bHQ6dT1wKHgseS5hcmd1bWVudCk7aWYoeS5mYWlsdXJlKXtpZigh eS5zY29wZSl7eS5mYWlsdXJlKHUpfWVsc2V7eS5mYWlsdXJlLmFwcGx5KHkuc2Nv cGUsW3VdKX19fX1vKHgpO3U9bnVsbH1mdW5jdGlvbiBtKHUseCxzLHcsdCx2KXtp ZihzJiZzLnJlYWR5U3RhdGU9PTQpe2NsZWFySW50ZXJ2YWwodFt3XSk7dFt3XT1u dWxsO2lmKHYpe2NsZWFyVGltZW91dChrLnRpbWVvdXRbd10pO2sudGltZW91dFt3 XT1udWxsfWYodSx4KX19ZnVuY3Rpb24gcihzLHQpe2suYWJvcnQocyx0LHRydWUp fWZ1bmN0aW9uIG4odSx4KXt4PXh8fHt9O3ZhciBzPXUuY29ubix3PXUudElkLHQ9 ay5wb2xsLHY9eC50aW1lb3V0fHxudWxsO2lmKHYpe2suY29ublt3XT1zO2sudGlt ZW91dFt3XT1zZXRUaW1lb3V0KHIuY3JlYXRlQ2FsbGJhY2sodSx4KSx2KX10W3dd PXNldEludGVydmFsKG0uY3JlYXRlQ2FsbGJhY2sodSx4LHMsdyx0LHYpLGsucG9s bEludGVydmFsKX1mdW5jdGlvbiBpKHcsdCx2LHMpe3ZhciB1PWwoKXx8bnVsbDtp Zih1KXt1LmNvbm4ub3Blbih3LHQsdHJ1ZSk7aWYoay51c2VEZWZhdWx0WGhySGVh ZGVyKXtqKCJYLVJlcXVlc3RlZC1XaXRoIixrLmRlZmF1bHRYaHJIZWFkZXIpfWlm KHMmJmsudXNlRGVmYXVsdEhlYWRlciYmKCFrLmhlYWRlcnN8fCFrLmhlYWRlcnNb ZF0pKXtqKGQsay5kZWZhdWx0UG9zdEhlYWRlcil9aWYoay5kZWZhdWx0SGVhZGVy c3x8ay5oZWFkZXJzKXtoKHUpfW4odSx2KTt1LmNvbm4uc2VuZChzfHxudWxsKX1y ZXR1cm4gdX1mdW5jdGlvbiBsKCl7dmFyIHQ7dHJ5e2lmKHQ9cShrLnRyYW5zYWN0 aW9uSWQpKXtrLnRyYW5zYWN0aW9uSWQrK319Y2F0Y2gocyl7fWZpbmFsbHl7cmV0 dXJuIHR9fWZ1bmN0aW9uIHEodil7dmFyIHM7dHJ5e3M9bmV3IFhNTEh0dHBSZXF1 ZXN0KCl9Y2F0Y2godSl7Zm9yKHZhciB0PUV4dC5pc0lFNj8xOjA7dDxnLmxlbmd0 aDsrK3Qpe3RyeXtzPW5ldyBBY3RpdmVYT2JqZWN0KGdbdF0pO2JyZWFrfWNhdGNo KHUpe319fWZpbmFsbHl7cmV0dXJue2Nvbm46cyx0SWQ6dn19fXZhciBrPXtyZXF1 ZXN0OmZ1bmN0aW9uKHMsdSx2LHcsQSl7aWYoQSl7dmFyIHg9dGhpcyx0PUEueG1s RGF0YSx5PUEuanNvbkRhdGEsejtFeHQuYXBwbHlJZih4LEEpO2lmKHR8fHkpe3o9 eC5oZWFkZXJzO2lmKCF6fHwheltkXSl7aihkLHQ/InRleHQveG1sIjoiYXBwbGlj YXRpb24vanNvbiIpfXc9dHx8KCFFeHQuaXNQcmltaXRpdmUoeSk/RXh0LmVuY29k ZSh5KTp5KX19cmV0dXJuIGkoc3x8QS5tZXRob2R8fCJQT1NUIix1LHYsdyl9LHNl cmlhbGl6ZUZvcm06ZnVuY3Rpb24oeSl7dmFyIHg9eS5lbGVtZW50c3x8KGRvY3Vt ZW50LmZvcm1zW3ldfHxFeHQuZ2V0RG9tKHkpKS5lbGVtZW50cyxzPWZhbHNlLHc9 ZW5jb2RlVVJJQ29tcG9uZW50LHQsej0iIix2LHU7RXh0LmVhY2goeCxmdW5jdGlv bihBKXt0PUEubmFtZTt2PUEudHlwZTtpZighQS5kaXNhYmxlZCYmdCl7aWYoL3Nl bGVjdC0ob25lfG11bHRpcGxlKS9pLnRlc3Qodikpe0V4dC5lYWNoKEEub3B0aW9u cyxmdW5jdGlvbihCKXtpZihCLnNlbGVjdGVkKXt1PUIuaGFzQXR0cmlidXRlP0Iu aGFzQXR0cmlidXRlKCJ2YWx1ZSIpOkIuZ2V0QXR0cmlidXRlTm9kZSgidmFsdWUi KS5zcGVjaWZpZWQ7eis9U3RyaW5nLmZvcm1hdCgiezB9PXsxfSYiLHcodCksdyh1 P0IudmFsdWU6Qi50ZXh0KSl9fSl9ZWxzZXtpZighKC9maWxlfHVuZGVmaW5lZHxy ZXNldHxidXR0b24vaS50ZXN0KHYpKSl7aWYoISgvcmFkaW98Y2hlY2tib3gvaS50 ZXN0KHYpJiYhQS5jaGVja2VkKSYmISh2PT0ic3VibWl0IiYmcykpe3orPXcodCkr Ij0iK3coQS52YWx1ZSkrIiYiO3M9L3N1Ym1pdC9pLnRlc3Qodil9fX19fSk7cmV0 dXJuIHouc3Vic3RyKDAsei5sZW5ndGgtMSl9LHVzZURlZmF1bHRIZWFkZXI6dHJ1 ZSxkZWZhdWx0UG9zdEhlYWRlcjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxl bmNvZGVkOyBjaGFyc2V0PVVURi04Iix1c2VEZWZhdWx0WGhySGVhZGVyOnRydWUs ZGVmYXVsdFhockhlYWRlcjoiWE1MSHR0cFJlcXVlc3QiLHBvbGw6e30sdGltZW91 dDp7fSxjb25uOnt9LHBvbGxJbnRlcnZhbDo1MCx0cmFuc2FjdGlvbklkOjAsYWJv cnQ6ZnVuY3Rpb24odix4LHMpe3ZhciB1PXRoaXMsdz12LnRJZCx0PWZhbHNlO2lm KHUuaXNDYWxsSW5Qcm9ncmVzcyh2KSl7di5jb25uLmFib3J0KCk7Y2xlYXJJbnRl cnZhbCh1LnBvbGxbd10pO3UucG9sbFt3XT1udWxsO2NsZWFyVGltZW91dChrLnRp bWVvdXRbd10pO3UudGltZW91dFt3XT1udWxsO2Yodix4LCh0PXRydWUpLHMpfXJl dHVybiB0fSxpc0NhbGxJblByb2dyZXNzOmZ1bmN0aW9uKHMpe3JldHVybiBzLmNv bm4mJiF7MDp0cnVlLDQ6dHJ1ZX1bcy5jb25uLnJlYWR5U3RhdGVdfX07cmV0dXJu IGt9KCk7KGZ1bmN0aW9uKCl7dmFyIGc9RXh0LmxpYixpPS93aWR0aHxoZWlnaHR8 b3BhY2l0eXxwYWRkaW5nL2ksZj0vXigod2lkdGh8aGVpZ2h0KXwodG9wfGxlZnQp KSQvLGQ9L3dpZHRofGhlaWdodHx0b3AkfGJvdHRvbSR8bGVmdCR8cmlnaHQkL2ks aD0vXGQrKGVtfCV8ZW58ZXh8cHR8aW58Y218bW18cGMpJC9pLGo9ZnVuY3Rpb24o ayl7cmV0dXJuIHR5cGVvZiBrIT09InVuZGVmaW5lZCJ9LGU9ZnVuY3Rpb24oKXty ZXR1cm4gbmV3IERhdGUoKX07Zy5BbmltPXttb3Rpb246ZnVuY3Rpb24obixsLG8s cCxrLG0pe3JldHVybiB0aGlzLnJ1bihuLGwsbyxwLGssbSxFeHQubGliLk1vdGlv bil9LHJ1bjpmdW5jdGlvbihvLGwscSxyLGssbixtKXttPW18fEV4dC5saWIuQW5p bUJhc2U7aWYodHlwZW9mIHI9PSJzdHJpbmciKXtyPUV4dC5saWIuRWFzaW5nW3Jd fXZhciBwPW5ldyBtKG8sbCxxLHIpO3AuYW5pbWF0ZVgoZnVuY3Rpb24oKXtpZihF eHQuaXNGdW5jdGlvbihrKSl7ay5jYWxsKG4pfX0pO3JldHVybiBwfX07Zy5Bbmlt QmFzZT1mdW5jdGlvbihsLGssbSxuKXtpZihsKXt0aGlzLmluaXQobCxrLG0sbil9 fTtnLkFuaW1CYXNlLnByb3RvdHlwZT17ZG9NZXRob2Q6ZnVuY3Rpb24oayxuLGwp e3ZhciBtPXRoaXM7cmV0dXJuIG0ubWV0aG9kKG0uY3VyRnJhbWUsbixsLW4sbS50 b3RhbEZyYW1lcyl9LHNldEF0dHI6ZnVuY3Rpb24oayxtLGwpe2lmKGkudGVzdChr KSYmbTwwKXttPTB9RXh0LmZseSh0aGlzLmVsLCJfYW5pbSIpLnNldFN0eWxlKGss bStsKX0sZ2V0QXR0cjpmdW5jdGlvbihrKXt2YXIgbT1FeHQuZmx5KHRoaXMuZWwp LG49bS5nZXRTdHlsZShrKSxsPWYuZXhlYyhrKXx8W107aWYobiE9PSJhdXRvIiYm IWgudGVzdChuKSl7cmV0dXJuIHBhcnNlRmxvYXQobil9cmV0dXJuKCEhKGxbMl0p fHwobS5nZXRTdHlsZSgicG9zaXRpb24iKT09ImFic29sdXRlIiYmISEobFszXSkp KT9tLmRvbVsib2Zmc2V0IitsWzBdLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2xb MF0uc3Vic3RyKDEpXTowfSxnZXREZWZhdWx0VW5pdDpmdW5jdGlvbihrKXtyZXR1 cm4gZC50ZXN0KGspPyJweCI6IiJ9LGFuaW1hdGVYOmZ1bmN0aW9uKG4sayl7dmFy IGw9dGhpcyxtPWZ1bmN0aW9uKCl7bC5vbkNvbXBsZXRlLnJlbW92ZUxpc3RlbmVy KG0pO2lmKEV4dC5pc0Z1bmN0aW9uKG4pKXtuLmNhbGwoa3x8bCxsKX19O2wub25D b21wbGV0ZS5hZGRMaXN0ZW5lcihtLGwpO2wuYW5pbWF0ZSgpfSxzZXRSdW5BdHRy OmZ1bmN0aW9uKHApe3ZhciByPXRoaXMscz10aGlzLmF0dHJpYnV0ZXNbcF0sdD1z LnRvLHE9cy5ieSx1PXMuZnJvbSx2PXMudW5pdCxsPSh0aGlzLnJ1bkF0dHJzW3Bd PXt9KSxtO2lmKCFqKHQpJiYhaihxKSl7cmV0dXJuIGZhbHNlfXZhciBrPWoodSk/ dTpyLmdldEF0dHIocCk7aWYoaih0KSl7bT10fWVsc2V7aWYoaihxKSl7aWYoRXh0 LmlzQXJyYXkoaykpe209W107Zm9yKHZhciBuPTAsbz1rLmxlbmd0aDtuPG87bisr KXttW25dPWtbbl0rcVtuXX19ZWxzZXttPWsrcX19fUV4dC5hcHBseShsLHtzdGFy dDprLGVuZDptLHVuaXQ6aih2KT92OnIuZ2V0RGVmYXVsdFVuaXQocCl9KX0saW5p dDpmdW5jdGlvbihsLHAsbyxrKXt2YXIgcj10aGlzLG49MCxzPWcuQW5pbU1ncjtF eHQuYXBwbHkocix7aXNBbmltYXRlZDpmYWxzZSxzdGFydFRpbWU6bnVsbCxlbDpF eHQuZ2V0RG9tKGwpLGF0dHJpYnV0ZXM6cHx8e30sZHVyYXRpb246b3x8MSxtZXRo b2Q6a3x8Zy5FYXNpbmcuZWFzZU5vbmUsdXNlU2VjOnRydWUsY3VyRnJhbWU6MCx0 b3RhbEZyYW1lczpzLmZwcyxydW5BdHRyczp7fSxhbmltYXRlOmZ1bmN0aW9uKCl7 dmFyIHU9dGhpcyx2PXUuZHVyYXRpb247aWYodS5pc0FuaW1hdGVkKXtyZXR1cm4g ZmFsc2V9dS5jdXJGcmFtZT0wO3UudG90YWxGcmFtZXM9dS51c2VTZWM/TWF0aC5j ZWlsKHMuZnBzKnYpOnY7cy5yZWdpc3RlckVsZW1lbnQodSl9LHN0b3A6ZnVuY3Rp b24odSl7dmFyIHY9dGhpcztpZih1KXt2LmN1ckZyYW1lPXYudG90YWxGcmFtZXM7 di5fb25Ud2Vlbi5maXJlKCl9cy5zdG9wKHYpfX0pO3ZhciB0PWZ1bmN0aW9uKCl7 dmFyIHY9dGhpcyx1O3Yub25TdGFydC5maXJlKCk7di5ydW5BdHRycz17fTtmb3Io dSBpbiB0aGlzLmF0dHJpYnV0ZXMpe3RoaXMuc2V0UnVuQXR0cih1KX12LmlzQW5p bWF0ZWQ9dHJ1ZTt2LnN0YXJ0VGltZT1lKCk7bj0wfTt2YXIgcT1mdW5jdGlvbigp e3ZhciB2PXRoaXM7di5vblR3ZWVuLmZpcmUoe2R1cmF0aW9uOmUoKS12LnN0YXJ0 VGltZSxjdXJGcmFtZTp2LmN1ckZyYW1lfSk7dmFyIHc9di5ydW5BdHRycztmb3Io dmFyIHUgaW4gdyl7dGhpcy5zZXRBdHRyKHUsdi5kb01ldGhvZCh1LHdbdV0uc3Rh cnQsd1t1XS5lbmQpLHdbdV0udW5pdCl9KytufTt2YXIgbT1mdW5jdGlvbigpe3Zh ciB1PXRoaXMsdz0oZSgpLXUuc3RhcnRUaW1lKS8xMDAwLHY9e2R1cmF0aW9uOncs ZnJhbWVzOm4sZnBzOm4vd307dS5pc0FuaW1hdGVkPWZhbHNlO249MDt1Lm9uQ29t cGxldGUuZmlyZSh2KX07ci5vblN0YXJ0PW5ldyBFeHQudXRpbC5FdmVudChyKTty Lm9uVHdlZW49bmV3IEV4dC51dGlsLkV2ZW50KHIpO3Iub25Db21wbGV0ZT1uZXcg RXh0LnV0aWwuRXZlbnQocik7KHIuX29uU3RhcnQ9bmV3IEV4dC51dGlsLkV2ZW50 KHIpKS5hZGRMaXN0ZW5lcih0KTsoci5fb25Ud2Vlbj1uZXcgRXh0LnV0aWwuRXZl bnQocikpLmFkZExpc3RlbmVyKHEpOyhyLl9vbkNvbXBsZXRlPW5ldyBFeHQudXRp bC5FdmVudChyKSkuYWRkTGlzdGVuZXIobSl9fTtFeHQubGliLkFuaW1NZ3I9bmV3 IGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxtPW51bGwsbD1bXSxrPTA7RXh0LmFwcGx5 KG8se2ZwczoxMDAwLGRlbGF5OjEscmVnaXN0ZXJFbGVtZW50OmZ1bmN0aW9uKHEp e2wucHVzaChxKTsrK2s7cS5fb25TdGFydC5maXJlKCk7by5zdGFydCgpfSx1blJl Z2lzdGVyOmZ1bmN0aW9uKHIscSl7ci5fb25Db21wbGV0ZS5maXJlKCk7cT1xfHxw KHIpO2lmKHEhPS0xKXtsLnNwbGljZShxLDEpfWlmKC0tazw9MCl7by5zdG9wKCl9 fSxzdGFydDpmdW5jdGlvbigpe2lmKG09PT1udWxsKXttPXNldEludGVydmFsKG8u cnVuLG8uZGVsYXkpfX0sc3RvcDpmdW5jdGlvbihzKXtpZighcyl7Y2xlYXJJbnRl cnZhbChtKTtmb3IodmFyIHI9MCxxPWwubGVuZ3RoO3I8cTsrK3Ipe2lmKGxbMF0u aXNBbmltYXRlZCl7by51blJlZ2lzdGVyKGxbMF0sMCl9fWw9W107bT1udWxsO2s9 MH1lbHNle28udW5SZWdpc3RlcihzKX19LHJ1bjpmdW5jdGlvbigpe3ZhciB0LHMs cSxyO2ZvcihzPTAscT1sLmxlbmd0aDtzPHE7cysrKXtyPWxbc107aWYociYmci5p c0FuaW1hdGVkKXt0PXIudG90YWxGcmFtZXM7aWYoci5jdXJGcmFtZTx0fHx0PT09 bnVsbCl7KytyLmN1ckZyYW1lO2lmKHIudXNlU2VjKXtuKHIpfXIuX29uVHdlZW4u ZmlyZSgpfWVsc2V7by5zdG9wKHIpfX19fX0pO3ZhciBwPWZ1bmN0aW9uKHMpe3Zh ciByLHE7Zm9yKHI9MCxxPWwubGVuZ3RoO3I8cTtyKyspe2lmKGxbcl09PT1zKXty ZXR1cm4gcn19cmV0dXJuIC0xfTt2YXIgbj1mdW5jdGlvbihyKXt2YXIgdj1yLnRv dGFsRnJhbWVzLHU9ci5jdXJGcmFtZSx0PXIuZHVyYXRpb24scz0odSp0KjEwMDAv dikscT0oZSgpLXIuc3RhcnRUaW1lKSx3PTA7aWYocTx0KjEwMDApe3c9TWF0aC5y b3VuZCgocS9zLTEpKnUpfWVsc2V7dz12LSh1KzEpfWlmKHc+MCYmaXNGaW5pdGUo dykpe2lmKHIuY3VyRnJhbWUrdz49dil7dz12LSh1KzEpfXIuY3VyRnJhbWUrPXd9 fX07Zy5CZXppZXI9bmV3IGZ1bmN0aW9uKCl7dGhpcy5nZXRQb3NpdGlvbj1mdW5j dGlvbihwLG8pe3ZhciByPXAubGVuZ3RoLG09W10scT0xLW8sbCxrO2ZvcihsPTA7 bDxyOysrbCl7bVtsXT1bcFtsXVswXSxwW2xdWzFdXX1mb3Ioaz0xO2s8cjsrK2sp e2ZvcihsPTA7bDxyLWs7KytsKXttW2xdWzBdPXEqbVtsXVswXStvKm1bcGFyc2VJ bnQobCsxLDEwKV1bMF07bVtsXVsxXT1xKm1bbF1bMV0rbyptW3BhcnNlSW50KGwr MSwxMCldWzFdfX1yZXR1cm5bbVswXVswXSxtWzBdWzFdXX19O2cuRWFzaW5nPXtl YXNlTm9uZTpmdW5jdGlvbihsLGssbixtKXtyZXR1cm4gbipsL20ra30sZWFzZUlu OmZ1bmN0aW9uKGwsayxuLG0pe3JldHVybiBuKihsLz1tKSpsK2t9LGVhc2VPdXQ6 ZnVuY3Rpb24obCxrLG4sbSl7cmV0dXJuIC1uKihsLz1tKSoobC0yKStrfX07KGZ1 bmN0aW9uKCl7Zy5Nb3Rpb249ZnVuY3Rpb24obyxuLHAscSl7aWYobyl7Zy5Nb3Rp b24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsbyxuLHAscSl9fTtF eHQuZXh0ZW5kKGcuTW90aW9uLEV4dC5saWIuQW5pbUJhc2UpO3ZhciBtPWcuTW90 aW9uLnN1cGVyY2xhc3MsbD0vXnBvaW50cyQvaTtFeHQuYXBwbHkoZy5Nb3Rpb24u cHJvdG90eXBlLHtzZXRBdHRyOmZ1bmN0aW9uKG4scixxKXt2YXIgcD10aGlzLG89 bS5zZXRBdHRyO2lmKGwudGVzdChuKSl7cT1xfHwicHgiO28uY2FsbChwLCJsZWZ0 IixyWzBdLHEpO28uY2FsbChwLCJ0b3AiLHJbMV0scSl9ZWxzZXtvLmNhbGwocCxu LHIscSl9fSxnZXRBdHRyOmZ1bmN0aW9uKG4pe3ZhciBwPXRoaXMsbz1tLmdldEF0 dHI7cmV0dXJuIGwudGVzdChuKT9bby5jYWxsKHAsImxlZnQiKSxvLmNhbGwocCwi dG9wIildOm8uY2FsbChwLG4pfSxkb01ldGhvZDpmdW5jdGlvbihuLHEsbyl7dmFy IHA9dGhpcztyZXR1cm4gbC50ZXN0KG4pP2cuQmV6aWVyLmdldFBvc2l0aW9uKHAu cnVuQXR0cnNbbl0scC5tZXRob2QocC5jdXJGcmFtZSwwLDEwMCxwLnRvdGFsRnJh bWVzKS8xMDApOm0uZG9NZXRob2QuY2FsbChwLG4scSxvKX0sc2V0UnVuQXR0cjpm dW5jdGlvbih1KXtpZihsLnRlc3QodSkpe3ZhciB3PXRoaXMscD10aGlzLmVsLHo9 dGhpcy5hdHRyaWJ1dGVzLnBvaW50cyxzPXouY29udHJvbHx8W10seD16LmZyb20s eT16LnRvLHY9ei5ieSxBPWcuRG9tLG8scixxLHQsbjtpZihzLmxlbmd0aD4wJiYh RXh0LmlzQXJyYXkoc1swXSkpe3M9W3NdfWVsc2V7fUV4dC5mbHkocCwiX2FuaW0i KS5wb3NpdGlvbigpO0Euc2V0WFkocCxqKHgpP3g6QS5nZXRYWShwKSk7bz13Lmdl dEF0dHIoInBvaW50cyIpO2lmKGooeSkpe3E9ay5jYWxsKHcseSxvKTtmb3Iocj0w LHQ9cy5sZW5ndGg7cjx0Oysrcil7c1tyXT1rLmNhbGwodyxzW3JdLG8pfX1lbHNl e2lmKGoodikpe3E9W29bMF0rdlswXSxvWzFdK3ZbMV1dO2ZvcihyPTAsdD1zLmxl bmd0aDtyPHQ7KytyKXtzW3JdPVtvWzBdK3Nbcl1bMF0sb1sxXStzW3JdWzFdXX19 fW49dGhpcy5ydW5BdHRyc1t1XT1bb107aWYocy5sZW5ndGg+MCl7bj1uLmNvbmNh dChzKX1uW24ubGVuZ3RoXT1xfWVsc2V7bS5zZXRSdW5BdHRyLmNhbGwodGhpcyx1 KX19fSk7dmFyIGs9ZnVuY3Rpb24obixwKXt2YXIgbz1nLkRvbS5nZXRYWSh0aGlz LmVsKTtyZXR1cm5bblswXS1vWzBdK3BbMF0sblsxXS1vWzFdK3BbMV1dfX0pKCl9 KSgpOyhmdW5jdGlvbigpe3ZhciBkPU1hdGguYWJzLGk9TWF0aC5QSSxoPU1hdGgu YXNpbixnPU1hdGgucG93LGU9TWF0aC5zaW4sZj1FeHQubGliO0V4dC5hcHBseShm LkVhc2luZyx7ZWFzZUJvdGg6ZnVuY3Rpb24oayxqLG0sbCl7cmV0dXJuKChrLz1s LzIpPDEpP20vMiprKmsrajotbS8yKigoLS1rKSooay0yKS0xKStqfSxlYXNlSW5T dHJvbmc6ZnVuY3Rpb24oayxqLG0sbCl7cmV0dXJuIG0qKGsvPWwpKmsqayprK2p9 LGVhc2VPdXRTdHJvbmc6ZnVuY3Rpb24oayxqLG0sbCl7cmV0dXJuIC1tKigoaz1r L2wtMSkqayprKmstMSkran0sZWFzZUJvdGhTdHJvbmc6ZnVuY3Rpb24oayxqLG0s bCl7cmV0dXJuKChrLz1sLzIpPDEpP20vMiprKmsqayprK2o6LW0vMiooKGstPTIp KmsqayprLTIpK2p9LGVsYXN0aWNJbjpmdW5jdGlvbihsLGoscSxvLGssbil7aWYo bD09MHx8KGwvPW8pPT0xKXtyZXR1cm4gbD09MD9qOmorcX1uPW58fChvKjAuMyk7 dmFyIG07aWYoaz49ZChxKSl7bT1uLygyKmkpKmgocS9rKX1lbHNle2s9cTttPW4v NH1yZXR1cm4gLShrKmcoMiwxMCoobC09MSkpKmUoKGwqby1tKSooMippKS9uKSkr an0sZWxhc3RpY091dDpmdW5jdGlvbihsLGoscSxvLGssbil7aWYobD09MHx8KGwv PW8pPT0xKXtyZXR1cm4gbD09MD9qOmorcX1uPW58fChvKjAuMyk7dmFyIG07aWYo az49ZChxKSl7bT1uLygyKmkpKmgocS9rKX1lbHNle2s9cTttPW4vNH1yZXR1cm4g aypnKDIsLTEwKmwpKmUoKGwqby1tKSooMippKS9uKStxK2p9LGVsYXN0aWNCb3Ro OmZ1bmN0aW9uKGwsaixxLG8sayxuKXtpZihsPT0wfHwobC89by8yKT09Mil7cmV0 dXJuIGw9PTA/ajpqK3F9bj1ufHwobyooMC4zKjEuNSkpO3ZhciBtO2lmKGs+PWQo cSkpe209bi8oMippKSpoKHEvayl9ZWxzZXtrPXE7bT1uLzR9cmV0dXJuIGw8MT8t MC41KihrKmcoMiwxMCoobC09MSkpKmUoKGwqby1tKSooMippKS9uKSkrajprKmco MiwtMTAqKGwtPTEpKSplKChsKm8tbSkqKDIqaSkvbikqMC41K3Eran0sYmFja0lu OmZ1bmN0aW9uKGssaixuLG0sbCl7bD1sfHwxLjcwMTU4O3JldHVybiBuKihrLz1t KSprKigobCsxKSprLWwpK2p9LGJhY2tPdXQ6ZnVuY3Rpb24oayxqLG4sbSxsKXtp ZighbCl7bD0xLjcwMTU4fXJldHVybiBuKigoaz1rL20tMSkqayooKGwrMSkqayts KSsxKStqfSxiYWNrQm90aDpmdW5jdGlvbihrLGosbixtLGwpe2w9bHx8MS43MDE1 ODtyZXR1cm4oKGsvPW0vMik8MSk/bi8yKihrKmsqKCgobCo9KDEuNTI1KSkrMSkq ay1sKSkrajpuLzIqKChrLT0yKSprKigoKGwqPSgxLjUyNSkpKzEpKmsrbCkrMikr an0sYm91bmNlSW46ZnVuY3Rpb24oayxqLG0sbCl7cmV0dXJuIG0tZi5FYXNpbmcu Ym91bmNlT3V0KGwtaywwLG0sbCkran0sYm91bmNlT3V0OmZ1bmN0aW9uKGssaixt LGwpe2lmKChrLz1sKTwoMS8yLjc1KSl7cmV0dXJuIG0qKDcuNTYyNSprKmspK2p9 ZWxzZXtpZihrPCgyLzIuNzUpKXtyZXR1cm4gbSooNy41NjI1KihrLT0oMS41LzIu NzUpKSprKzAuNzUpK2p9ZWxzZXtpZihrPCgyLjUvMi43NSkpe3JldHVybiBtKig3 LjU2MjUqKGstPSgyLjI1LzIuNzUpKSprKzAuOTM3NSkran19fXJldHVybiBtKig3 LjU2MjUqKGstPSgyLjYyNS8yLjc1KSkqayswLjk4NDM3NSkran0sYm91bmNlQm90 aDpmdW5jdGlvbihrLGosbSxsKXtyZXR1cm4oazxsLzIpP2YuRWFzaW5nLmJvdW5j ZUluKGsqMiwwLG0sbCkqMC41K2o6Zi5FYXNpbmcuYm91bmNlT3V0KGsqMi1sLDAs bSxsKSowLjUrbSowLjUran19KX0pKCk7KGZ1bmN0aW9uKCl7dmFyIGg9RXh0Lmxp YjtoLkFuaW0uY29sb3I9ZnVuY3Rpb24ocCxuLHEscixtLG8pe3JldHVybiBoLkFu aW0ucnVuKHAsbixxLHIsbSxvLGguQ29sb3JBbmltKX07aC5Db2xvckFuaW09ZnVu Y3Rpb24obixtLG8scCl7aC5Db2xvckFuaW0uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rv ci5jYWxsKHRoaXMsbixtLG8scCl9O0V4dC5leHRlbmQoaC5Db2xvckFuaW0saC5B bmltQmFzZSk7dmFyIGo9aC5Db2xvckFuaW0uc3VwZXJjbGFzcyxpPS9jb2xvciQv aSxmPS9edHJhbnNwYXJlbnR8cmdiYVwoMCwgMCwgMCwgMFwpJC8sbD0vXnJnYlwo KFswLTldKylccyosXHMqKFswLTldKylccyosXHMqKFswLTldKylcKSQvaSxkPS9e Iz8oWzAtOUEtRl17Mn0pKFswLTlBLUZdezJ9KShbMC05QS1GXXsyfSkkL2ksZT0v XiM/KFswLTlBLUZdezF9KShbMC05QS1GXXsxfSkoWzAtOUEtRl17MX0pJC9pLGc9 ZnVuY3Rpb24obSl7cmV0dXJuIHR5cGVvZiBtIT09InVuZGVmaW5lZCJ9O2Z1bmN0 aW9uIGsobil7dmFyIHA9cGFyc2VJbnQsbyxtPW51bGwscTtpZihuLmxlbmd0aD09 Myl7cmV0dXJuIG59RXh0LmVhY2goW2QsbCxlXSxmdW5jdGlvbihzLHIpe289KHIl Mj09MCk/MTY6MTA7cT1zLmV4ZWMobik7aWYocSYmcS5sZW5ndGg9PTQpe209W3Ao cVsxXSxvKSxwKHFbMl0sbykscChxWzNdLG8pXTtyZXR1cm4gZmFsc2V9fSk7cmV0 dXJuIG19RXh0LmFwcGx5KGguQ29sb3JBbmltLnByb3RvdHlwZSx7Z2V0QXR0cjpm dW5jdGlvbihtKXt2YXIgbz10aGlzLG49by5lbCxwO2lmKGkudGVzdChtKSl7d2hp bGUobiYmZi50ZXN0KHA9RXh0LmZseShuKS5nZXRTdHlsZShtKSkpe249bi5wYXJl bnROb2RlO3A9ImZmZiJ9fWVsc2V7cD1qLmdldEF0dHIuY2FsbChvLG0pfXJldHVy biBwfSxkb01ldGhvZDpmdW5jdGlvbihzLG0sbyl7dmFyIHQ9dGhpcyxuLHE9TWF0 aC5mbG9vcixwLHIsdTtpZihpLnRlc3Qocykpe249W107bz1vfHxbXTtmb3IocD0w LHI9bS5sZW5ndGg7cDxyO3ArKyl7dT1tW3BdO25bcF09ai5kb01ldGhvZC5jYWxs KHQscyx1LG9bcF0pfW49InJnYigiK3EoblswXSkrIiwiK3EoblsxXSkrIiwiK3Eo blsyXSkrIikifWVsc2V7bj1qLmRvTWV0aG9kLmNhbGwodCxzLG0sbyl9cmV0dXJu IG59LHNldFJ1bkF0dHI6ZnVuY3Rpb24ocil7dmFyIHQ9dGhpcyx1PXQuYXR0cmli dXRlc1tyXSx2PXUudG8scz11LmJ5LG47ai5zZXRSdW5BdHRyLmNhbGwodCxyKTtu PXQucnVuQXR0cnNbcl07aWYoaS50ZXN0KHIpKXt2YXIgbT1rKG4uc3RhcnQpLG89 ayhuLmVuZCk7aWYoIWcodikmJmcocykpe289ayhzKTtmb3IodmFyIHA9MCxxPW0u bGVuZ3RoO3A8cTtwKyspe29bcF09bVtwXStvW3BdfX1uLnN0YXJ0PW07bi5lbmQ9 b319fSl9KSgpOyhmdW5jdGlvbigpe3ZhciBkPUV4dC5saWI7ZC5BbmltLnNjcm9s bD1mdW5jdGlvbihqLGgsayxsLGcsaSl7cmV0dXJuIGQuQW5pbS5ydW4oaixoLGss bCxnLGksZC5TY3JvbGwpfTtkLlNjcm9sbD1mdW5jdGlvbihoLGcsaSxqKXtpZiho KXtkLlNjcm9sbC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxoLGcs aSxqKX19O0V4dC5leHRlbmQoZC5TY3JvbGwsZC5Db2xvckFuaW0pO3ZhciBmPWQu U2Nyb2xsLnN1cGVyY2xhc3MsZT0ic2Nyb2xsIjtFeHQuYXBwbHkoZC5TY3JvbGwu cHJvdG90eXBlLHtkb01ldGhvZDpmdW5jdGlvbihnLG0saCl7dmFyIGssaj10aGlz LGw9ai5jdXJGcmFtZSxpPWoudG90YWxGcmFtZXM7aWYoZz09ZSl7az1bai5tZXRo b2QobCxtWzBdLGhbMF0tbVswXSxpKSxqLm1ldGhvZChsLG1bMV0saFsxXS1tWzFd LGkpXX1lbHNle2s9Zi5kb01ldGhvZC5jYWxsKGosZyxtLGgpfXJldHVybiBrfSxn ZXRBdHRyOmZ1bmN0aW9uKGcpe3ZhciBoPXRoaXM7aWYoZz09ZSl7cmV0dXJuW2gu ZWwuc2Nyb2xsTGVmdCxoLmVsLnNjcm9sbFRvcF19ZWxzZXtyZXR1cm4gZi5nZXRB dHRyLmNhbGwoaCxnKX19LHNldEF0dHI6ZnVuY3Rpb24oZyxqLGkpe3ZhciBoPXRo aXM7aWYoZz09ZSl7aC5lbC5zY3JvbGxMZWZ0PWpbMF07aC5lbC5zY3JvbGxUb3A9 alsxXX1lbHNle2Yuc2V0QXR0ci5jYWxsKGgsZyxqLGkpfX19KX0pKCk7aWYoRXh0 LmlzSUUpe2Z1bmN0aW9uIGEoKXt2YXIgZD1GdW5jdGlvbi5wcm90b3R5cGU7ZGVs ZXRlIGQuY3JlYXRlU2VxdWVuY2U7ZGVsZXRlIGQuZGVmZXI7ZGVsZXRlIGQuY3Jl YXRlRGVsZWdhdGU7ZGVsZXRlIGQuY3JlYXRlQ2FsbGJhY2s7ZGVsZXRlIGQuY3Jl YXRlSW50ZXJjZXB0b3I7d2luZG93LmRldGFjaEV2ZW50KCJvbnVubG9hZCIsYSl9 d2luZG93LmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsYSl9fSkoKTs= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=ext-all.js Content-Type: application/javascript; charset=utf-8; name=ext-all.js Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/ext-all.js Content-Transfer-Encoding: Base64 LyoKICogRXh0IEpTIExpYnJhcnkgMy40LjAKICogQ29weXJpZ2h0KGMpIDIwMDYt MjAxMSBTZW5jaGEgSW5jLgogKiBsaWNlbnNpbmdAc2VuY2hhLmNvbQogKiBodHRw Oi8vd3d3LnNlbmNoYS5jb20vbGljZW5zZQogKi8KKGZ1bmN0aW9uKCl7dmFyIGg9 RXh0LnV0aWwsaj1FeHQuZWFjaCxnPXRydWUsaT1mYWxzZTtoLk9ic2VydmFibGU9 ZnVuY3Rpb24oKXt2YXIgaz10aGlzLGw9ay5ldmVudHM7aWYoay5saXN0ZW5lcnMp e2sub24oay5saXN0ZW5lcnMpO2RlbGV0ZSBrLmxpc3RlbmVyc31rLmV2ZW50cz1s fHx7fX07aC5PYnNlcnZhYmxlLnByb3RvdHlwZT17ZmlsdGVyT3B0UmU6L14oPzpz Y29wZXxkZWxheXxidWZmZXJ8c2luZ2xlKSQvLGZpcmVFdmVudDpmdW5jdGlvbigp e3ZhciBrPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxt PWtbMF0udG9Mb3dlckNhc2UoKSxuPXRoaXMsbD1nLHA9bi5ldmVudHNbbV0scyxv LHI7aWYobi5ldmVudHNTdXNwZW5kZWQ9PT1nKXtpZihvPW4uZXZlbnRRdWV1ZSl7 by5wdXNoKGspfX1lbHNle2lmKHR5cGVvZiBwPT0ib2JqZWN0Iil7aWYocC5idWJi bGUpe2lmKHAuZmlyZS5hcHBseShwLGsuc2xpY2UoMSkpPT09aSl7cmV0dXJuIGl9 cj1uLmdldEJ1YmJsZVRhcmdldCYmbi5nZXRCdWJibGVUYXJnZXQoKTtpZihyJiZy LmVuYWJsZUJ1YmJsZSl7cz1yLmV2ZW50c1ttXTtpZighc3x8dHlwZW9mIHMhPSJv YmplY3QifHwhcy5idWJibGUpe3IuZW5hYmxlQnViYmxlKG0pfXJldHVybiByLmZp cmVFdmVudC5hcHBseShyLGspfX1lbHNle2suc2hpZnQoKTtsPXAuZmlyZS5hcHBs eShwLGspfX19cmV0dXJuIGx9LGFkZExpc3RlbmVyOmZ1bmN0aW9uKGssbSxsLHIp e3ZhciBuPXRoaXMscSxzLHA7aWYodHlwZW9mIGs9PSJvYmplY3QiKXtyPWs7Zm9y KHEgaW4gcil7cz1yW3FdO2lmKCFuLmZpbHRlck9wdFJlLnRlc3QocSkpe24uYWRk TGlzdGVuZXIocSxzLmZufHxzLHMuc2NvcGV8fHIuc2NvcGUscy5mbj9zOnIpfX19 ZWxzZXtrPWsudG9Mb3dlckNhc2UoKTtwPW4uZXZlbnRzW2tdfHxnO2lmKHR5cGVv ZiBwPT0iYm9vbGVhbiIpe24uZXZlbnRzW2tdPXA9bmV3IGguRXZlbnQobixrKX1w LmFkZExpc3RlbmVyKG0sbCx0eXBlb2Ygcj09Im9iamVjdCI/cjp7fSl9fSxyZW1v dmVMaXN0ZW5lcjpmdW5jdGlvbihrLG0sbCl7dmFyIG49dGhpcy5ldmVudHNbay50 b0xvd2VyQ2FzZSgpXTtpZih0eXBlb2Ygbj09Im9iamVjdCIpe24ucmVtb3ZlTGlz dGVuZXIobSxsKX19LHB1cmdlTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dmFyIG09dGhp cy5ldmVudHMsayxsO2ZvcihsIGluIG0pe2s9bVtsXTtpZih0eXBlb2Ygaz09Im9i amVjdCIpe2suY2xlYXJMaXN0ZW5lcnMoKX19fSxhZGRFdmVudHM6ZnVuY3Rpb24o bil7dmFyIG09dGhpczttLmV2ZW50cz1tLmV2ZW50c3x8e307aWYodHlwZW9mIG49 PSJzdHJpbmciKXt2YXIgaz1hcmd1bWVudHMsbD1rLmxlbmd0aDt3aGlsZShsLS0p e20uZXZlbnRzW2tbbF1dPW0uZXZlbnRzW2tbbF1dfHxnfX1lbHNle0V4dC5hcHBs eUlmKG0uZXZlbnRzLG4pfX0saGFzTGlzdGVuZXI6ZnVuY3Rpb24oayl7dmFyIGw9 dGhpcy5ldmVudHNbay50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gdHlwZW9mIGw9PSJv YmplY3QiJiZsLmxpc3RlbmVycy5sZW5ndGg+MH0sc3VzcGVuZEV2ZW50czpmdW5j dGlvbihrKXt0aGlzLmV2ZW50c1N1c3BlbmRlZD1nO2lmKGsmJiF0aGlzLmV2ZW50 UXVldWUpe3RoaXMuZXZlbnRRdWV1ZT1bXX19LHJlc3VtZUV2ZW50czpmdW5jdGlv bigpe3ZhciBrPXRoaXMsbD1rLmV2ZW50UXVldWV8fFtdO2suZXZlbnRzU3VzcGVu ZGVkPWk7ZGVsZXRlIGsuZXZlbnRRdWV1ZTtqKGwsZnVuY3Rpb24obSl7ay5maXJl RXZlbnQuYXBwbHkoayxtKX0pfX07dmFyIGQ9aC5PYnNlcnZhYmxlLnByb3RvdHlw ZTtkLm9uPWQuYWRkTGlzdGVuZXI7ZC51bj1kLnJlbW92ZUxpc3RlbmVyO2guT2Jz ZXJ2YWJsZS5yZWxlYXNlQ2FwdHVyZT1mdW5jdGlvbihrKXtrLmZpcmVFdmVudD1k LmZpcmVFdmVudH07ZnVuY3Rpb24gZShsLG0sayl7cmV0dXJuIGZ1bmN0aW9uKCl7 aWYobS50YXJnZXQ9PWFyZ3VtZW50c1swXSl7bC5hcHBseShrLEFycmF5LnByb3Rv dHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSl9fX1mdW5jdGlvbiBiKG4scCxr LG0pe2sudGFzaz1uZXcgaC5EZWxheWVkVGFzaygpO3JldHVybiBmdW5jdGlvbigp e2sudGFzay5kZWxheShwLmJ1ZmZlcixuLG0sQXJyYXkucHJvdG90eXBlLnNsaWNl LmNhbGwoYXJndW1lbnRzLDApKX19ZnVuY3Rpb24gYyhtLG4sbCxrKXtyZXR1cm4g ZnVuY3Rpb24oKXtuLnJlbW92ZUxpc3RlbmVyKGwsayk7cmV0dXJuIG0uYXBwbHko ayxhcmd1bWVudHMpfX1mdW5jdGlvbiBhKG4scCxrLG0pe3JldHVybiBmdW5jdGlv bigpe3ZhciBsPW5ldyBoLkRlbGF5ZWRUYXNrKCksbz1BcnJheS5wcm90b3R5cGUu c2xpY2UuY2FsbChhcmd1bWVudHMsMCk7aWYoIWsudGFza3Mpe2sudGFza3M9W119 ay50YXNrcy5wdXNoKGwpO2wuZGVsYXkocC5kZWxheXx8MTAsZnVuY3Rpb24oKXtr LnRhc2tzLnJlbW92ZShsKTtuLmFwcGx5KG0sbyl9LG0pfX1oLkV2ZW50PWZ1bmN0 aW9uKGwsayl7dGhpcy5uYW1lPWs7dGhpcy5vYmo9bDt0aGlzLmxpc3RlbmVycz1b XX07aC5FdmVudC5wcm90b3R5cGU9e2FkZExpc3RlbmVyOmZ1bmN0aW9uKG8sbixt KXt2YXIgcD10aGlzLGs7bj1ufHxwLm9iajtpZighcC5pc0xpc3RlbmluZyhvLG4p KXtrPXAuY3JlYXRlTGlzdGVuZXIobyxuLG0pO2lmKHAuZmlyaW5nKXtwLmxpc3Rl bmVycz1wLmxpc3RlbmVycy5zbGljZSgwKX1wLmxpc3RlbmVycy5wdXNoKGspfX0s Y3JlYXRlTGlzdGVuZXI6ZnVuY3Rpb24ocCxuLHEpe3E9cXx8e307bj1ufHx0aGlz Lm9iajt2YXIgaz17Zm46cCxzY29wZTpuLG9wdGlvbnM6cX0sbT1wO2lmKHEudGFy Z2V0KXttPWUobSxxLG4pfWlmKHEuZGVsYXkpe209YShtLHEsayxuKX1pZihxLnNp bmdsZSl7bT1jKG0sdGhpcyxwLG4pfWlmKHEuYnVmZmVyKXttPWIobSxxLGssbil9 ay5maXJlRm49bTtyZXR1cm4ga30sZmluZExpc3RlbmVyOmZ1bmN0aW9uKG8sbil7 dmFyIHA9dGhpcy5saXN0ZW5lcnMsbT1wLmxlbmd0aCxrO249bnx8dGhpcy5vYmo7 d2hpbGUobS0tKXtrPXBbbV07aWYoayl7aWYoay5mbj09byYmay5zY29wZT09bil7 cmV0dXJuIG19fX1yZXR1cm4gLTF9LGlzTGlzdGVuaW5nOmZ1bmN0aW9uKGwsayl7 cmV0dXJuIHRoaXMuZmluZExpc3RlbmVyKGwsaykhPS0xfSxyZW1vdmVMaXN0ZW5l cjpmdW5jdGlvbihyLHEpe3ZhciBwLG0sbixzPXRoaXMsbz1pO2lmKChwPXMuZmlu ZExpc3RlbmVyKHIscSkpIT0tMSl7aWYocy5maXJpbmcpe3MubGlzdGVuZXJzPXMu bGlzdGVuZXJzLnNsaWNlKDApfW09cy5saXN0ZW5lcnNbcF07aWYobS50YXNrKXtt LnRhc2suY2FuY2VsKCk7ZGVsZXRlIG0udGFza31uPW0udGFza3MmJm0udGFza3Mu bGVuZ3RoO2lmKG4pe3doaWxlKG4tLSl7bS50YXNrc1tuXS5jYW5jZWwoKX1kZWxl dGUgbS50YXNrc31zLmxpc3RlbmVycy5zcGxpY2UocCwxKTtvPWd9cmV0dXJuIG99 LGNsZWFyTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dmFyIG49dGhpcyxrPW4ubGlzdGVu ZXJzLG09ay5sZW5ndGg7d2hpbGUobS0tKXtuLnJlbW92ZUxpc3RlbmVyKGtbbV0u Zm4sa1ttXS5zY29wZSl9fSxmaXJlOmZ1bmN0aW9uKCl7dmFyIHE9dGhpcyxwPXEu bGlzdGVuZXJzLGs9cC5sZW5ndGgsbz0wLG07aWYoaz4wKXtxLmZpcmluZz1nO3Zh ciBuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtmb3Io O288aztvKyspe209cFtvXTtpZihtJiZtLmZpcmVGbi5hcHBseShtLnNjb3BlfHxx Lm9ianx8d2luZG93LG4pPT09aSl7cmV0dXJuKHEuZmlyaW5nPWkpfX19cS5maXJp bmc9aTtyZXR1cm4gZ319fSkoKTtFeHQuRG9tSGVscGVyPWZ1bmN0aW9uKCl7dmFy IHg9bnVsbCxrPS9eKD86YnJ8ZnJhbWV8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxy YW5nZXxzcGFjZXJ8d2JyfGFyZWF8cGFyYW18Y29sKSQvaSxtPS9edGFibGV8dGJv ZHl8dHJ8dGQkL2ksZD0vdGFnfGNoaWxkcmVufGNufGh0bWwkL2ksdD0vdGR8dHJ8 dGJvZHkvaSxvPS8oW2EtejAtOS1dKylccyo6XHMqKFteO1xzXSsoPzpccypbXjtc c10rKSopOz8vZ2ksdj0vZW5kL2kscixuPSJhZnRlcmJlZ2luIixwPSJhZnRlcmVu ZCIsYz0iYmVmb3JlYmVnaW4iLHE9ImJlZm9yZWVuZCIsYT0iPHRhYmxlPiIsaT0i PC90YWJsZT4iLGI9YSsiPHRib2R5PiIsaj0iPC90Ym9keT4iK2ksbD1iKyI8dHI+ Iix3PSI8L3RyPiIrajtmdW5jdGlvbiBoKEIsRCxDLEUsQSx5KXt2YXIgej1yLmlu c2VydEh0bWwoRSxFeHQuZ2V0RG9tKEIpLHUoRCkpO3JldHVybiBDP0V4dC5nZXQo eix0cnVlKTp6fWZ1bmN0aW9uIHUoRCl7dmFyIHo9IiIseSxDLEIsRTtpZih0eXBl b2YgRD09InN0cmluZyIpe3o9RH1lbHNle2lmKEV4dC5pc0FycmF5KEQpKXtmb3Io dmFyIEE9MDtBPEQubGVuZ3RoO0ErKyl7aWYoRFtBXSl7eis9dShEW0FdKX19fWVs c2V7eis9IjwiKyhELnRhZz1ELnRhZ3x8ImRpdiIpO2Zvcih5IGluIEQpe0M9RFt5 XTtpZighZC50ZXN0KHkpKXtpZih0eXBlb2YgQz09Im9iamVjdCIpe3orPSIgIit5 Kyc9Iic7Zm9yKEIgaW4gQyl7eis9QisiOiIrQ1tCXSsiOyJ9eis9JyInfWVsc2V7 eis9IiAiKyh7Y2xzOiJjbGFzcyIsaHRtbEZvcjoiZm9yIn1beV18fHkpKyc9Iicr QysnIid9fX1pZihrLnRlc3QoRC50YWcpKXt6Kz0iLz4ifWVsc2V7eis9Ij4iO2lm KChFPUQuY2hpbGRyZW58fEQuY24pKXt6Kz11KEUpfWVsc2V7aWYoRC5odG1sKXt6 Kz1ELmh0bWx9fXorPSI8LyIrRC50YWcrIj4ifX19cmV0dXJuIHp9ZnVuY3Rpb24g ZyhGLEMsQixEKXt4LmlubmVySFRNTD1bQyxCLERdLmpvaW4oIiIpO3ZhciB5PS0x LEE9eCx6O3doaWxlKCsreTxGKXtBPUEuZmlyc3RDaGlsZH1pZih6PUEubmV4dFNp Ymxpbmcpe3ZhciBFPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTt3 aGlsZShBKXt6PUEubmV4dFNpYmxpbmc7RS5hcHBlbmRDaGlsZChBKTtBPXp9QT1F fXJldHVybiBBfWZ1bmN0aW9uIGUoeSx6LEIsQSl7dmFyIEMsRDt4PXh8fGRvY3Vt ZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKHk9PSJ0ZCImJih6PT1ufHx6PT1x KXx8IXQudGVzdCh5KSYmKHo9PWN8fHo9PXApKXtyZXR1cm59RD16PT1jP0I6ej09 cD9CLm5leHRTaWJsaW5nOno9PW4/Qi5maXJzdENoaWxkOm51bGw7aWYoej09Y3x8 ej09cCl7Qj1CLnBhcmVudE5vZGV9aWYoeT09InRkInx8KHk9PSJ0ciImJih6PT1x fHx6PT1uKSkpe0M9Zyg0LGwsQSx3KX1lbHNle2lmKCh5PT0idGJvZHkiJiYoej09 cXx8ej09bikpfHwoeT09InRyIiYmKHo9PWN8fHo9PXApKSl7Qz1nKDMsYixBLGop fWVsc2V7Qz1nKDIsYSxBLGkpfX1CLmluc2VydEJlZm9yZShDLEQpO3JldHVybiBD fWZ1bmN0aW9uIHMoQSl7dmFyIEQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2 IikseT1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksej0wLEIsQztE LmlubmVySFRNTD1BO0M9RC5jaGlsZE5vZGVzO0I9Qy5sZW5ndGg7Zm9yKDt6PEI7 eisrKXt5LmFwcGVuZENoaWxkKENbel0uY2xvbmVOb2RlKHRydWUpKX1yZXR1cm4g eX1yPXttYXJrdXA6ZnVuY3Rpb24oeSl7cmV0dXJuIHUoeSl9LGFwcGx5U3R5bGVz OmZ1bmN0aW9uKHkseil7aWYoeil7dmFyIEE7eT1FeHQuZmx5KHkpO2lmKHR5cGVv ZiB6PT0iZnVuY3Rpb24iKXt6PXouY2FsbCgpfWlmKHR5cGVvZiB6PT0ic3RyaW5n Iil7by5sYXN0SW5kZXg9MDt3aGlsZSgoQT1vLmV4ZWMoeikpKXt5LnNldFN0eWxl KEFbMV0sQVsyXSl9fWVsc2V7aWYodHlwZW9mIHo9PSJvYmplY3QiKXt5LnNldFN0 eWxlKHopfX19fSxpbnNlcnRIdG1sOmZ1bmN0aW9uKEQseSxFKXt2YXIgQj17fSxB LEYsQyxHLEgsejtEPUQudG9Mb3dlckNhc2UoKTtCW2NdPVsiQmVmb3JlQmVnaW4i LCJwcmV2aW91c1NpYmxpbmciXTtCW3BdPVsiQWZ0ZXJFbmQiLCJuZXh0U2libGlu ZyJdO2lmKHkuaW5zZXJ0QWRqYWNlbnRIVE1MKXtpZihtLnRlc3QoeS50YWdOYW1l KSYmKHo9ZSh5LnRhZ05hbWUudG9Mb3dlckNhc2UoKSxELHksRSkpKXtyZXR1cm4g en1CW25dPVsiQWZ0ZXJCZWdpbiIsImZpcnN0Q2hpbGQiXTtCW3FdPVsiQmVmb3Jl RW5kIiwibGFzdENoaWxkIl07aWYoKEE9QltEXSkpe3kuaW5zZXJ0QWRqYWNlbnRI VE1MKEFbMF0sRSk7cmV0dXJuIHlbQVsxXV19fWVsc2V7Rj15Lm93bmVyRG9jdW1l bnQuY3JlYXRlUmFuZ2UoKTtHPSJzZXRTdGFydCIrKHYudGVzdChEKT8iQWZ0ZXIi OiJCZWZvcmUiKTtpZihCW0RdKXtGW0ddKHkpO2lmKCFGLmNyZWF0ZUNvbnRleHR1 YWxGcmFnbWVudCl7SD1zKEUpfWVsc2V7SD1GLmNyZWF0ZUNvbnRleHR1YWxGcmFn bWVudChFKX15LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKEgsRD09Yz95OnkubmV4 dFNpYmxpbmcpO3JldHVybiB5WyhEPT1jPyJwcmV2aW91cyI6Im5leHQiKSsiU2li bGluZyJdfWVsc2V7Qz0oRD09bj8iZmlyc3QiOiJsYXN0IikrIkNoaWxkIjtpZih5 LmZpcnN0Q2hpbGQpe0ZbR10oeVtDXSk7aWYoIUYuY3JlYXRlQ29udGV4dHVhbEZy YWdtZW50KXtIPXMoRSl9ZWxzZXtIPUYuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50 KEUpfWlmKEQ9PW4pe3kuaW5zZXJ0QmVmb3JlKEgseS5maXJzdENoaWxkKX1lbHNl e3kuYXBwZW5kQ2hpbGQoSCl9fWVsc2V7eS5pbm5lckhUTUw9RX1yZXR1cm4geVtD XX19dGhyb3cnSWxsZWdhbCBpbnNlcnRpb24gcG9pbnQgLT4gIicrRCsnIid9LGlu c2VydEJlZm9yZTpmdW5jdGlvbih5LEEseil7cmV0dXJuIGgoeSxBLHosYyl9LGlu c2VydEFmdGVyOmZ1bmN0aW9uKHksQSx6KXtyZXR1cm4gaCh5LEEseixwLCJuZXh0 U2libGluZyIpfSxpbnNlcnRGaXJzdDpmdW5jdGlvbih5LEEseil7cmV0dXJuIGgo eSxBLHosbiwiZmlyc3RDaGlsZCIpfSxhcHBlbmQ6ZnVuY3Rpb24oeSxBLHope3Jl dHVybiBoKHksQSx6LHEsIiIsdHJ1ZSl9LG92ZXJ3cml0ZTpmdW5jdGlvbih5LEEs eil7eT1FeHQuZ2V0RG9tKHkpO3kuaW5uZXJIVE1MPXUoQSk7cmV0dXJuIHo/RXh0 LmdldCh5LmZpcnN0Q2hpbGQpOnkuZmlyc3RDaGlsZH0sY3JlYXRlSHRtbDp1fTty ZXR1cm4gcn0oKTtFeHQuVGVtcGxhdGU9ZnVuY3Rpb24oaCl7dmFyIGo9dGhpcyxj PWFyZ3VtZW50cyxlPVtdLGQ7aWYoRXh0LmlzQXJyYXkoaCkpe2g9aC5qb2luKCIi KX1lbHNle2lmKGMubGVuZ3RoPjEpe2Zvcih2YXIgZz0wLGI9Yy5sZW5ndGg7Zzxi O2crKyl7ZD1jW2ddO2lmKHR5cGVvZiBkPT0ib2JqZWN0Iil7RXh0LmFwcGx5KGos ZCl9ZWxzZXtlLnB1c2goZCl9fWg9ZS5qb2luKCIiKX19ai5odG1sPWg7aWYoai5j b21waWxlZCl7ai5jb21waWxlKCl9fTtFeHQuVGVtcGxhdGUucHJvdG90eXBlPXty ZTovXHsoW1x3XC1dKylcfS9nLGFwcGx5VGVtcGxhdGU6ZnVuY3Rpb24oYSl7dmFy IGI9dGhpcztyZXR1cm4gYi5jb21waWxlZD9iLmNvbXBpbGVkKGEpOmIuaHRtbC5y ZXBsYWNlKGIucmUsZnVuY3Rpb24oYyxkKXtyZXR1cm4gYVtkXSE9PXVuZGVmaW5l ZD9hW2RdOiIifSl9LHNldDpmdW5jdGlvbihhLGMpe3ZhciBiPXRoaXM7Yi5odG1s PWE7Yi5jb21waWxlZD1udWxsO3JldHVybiBjP2IuY29tcGlsZSgpOmJ9LGNvbXBp bGU6ZnVuY3Rpb24oKXt2YXIgbWU9dGhpcyxzZXA9RXh0LmlzR2Vja28/IisiOiIs IjtmdW5jdGlvbiBmbihtLG5hbWUpe25hbWU9InZhbHVlc1snIituYW1lKyInXSI7 cmV0dXJuIiciK3NlcCsiKCIrbmFtZSsiID09IHVuZGVmaW5lZCA/ICcnIDogIitu YW1lKyIpIitzZXArIicifWV2YWwoInRoaXMuY29tcGlsZWQgPSBmdW5jdGlvbih2 YWx1ZXMpeyByZXR1cm4gIisoRXh0LmlzR2Vja28/IiciOiJbJyIpK21lLmh0bWwu cmVwbGFjZSgvXFwvZywiXFxcXCIpLnJlcGxhY2UoLyhcclxufFxuKS9nLCJcXG4i KS5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UodGhpcy5yZSxmbikrKEV4dC5p c0dlY2tvPyInO307IjoiJ10uam9pbignJyk7fTsiKSk7cmV0dXJuIG1lfSxpbnNl cnRGaXJzdDpmdW5jdGlvbihiLGEsYyl7cmV0dXJuIHRoaXMuZG9JbnNlcnQoImFm dGVyQmVnaW4iLGIsYSxjKX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGIsYSxjKXty ZXR1cm4gdGhpcy5kb0luc2VydCgiYmVmb3JlQmVnaW4iLGIsYSxjKX0saW5zZXJ0 QWZ0ZXI6ZnVuY3Rpb24oYixhLGMpe3JldHVybiB0aGlzLmRvSW5zZXJ0KCJhZnRl ckVuZCIsYixhLGMpfSxhcHBlbmQ6ZnVuY3Rpb24oYixhLGMpe3JldHVybiB0aGlz LmRvSW5zZXJ0KCJiZWZvcmVFbmQiLGIsYSxjKX0sZG9JbnNlcnQ6ZnVuY3Rpb24o YyxlLGIsYSl7ZT1FeHQuZ2V0RG9tKGUpO3ZhciBkPUV4dC5Eb21IZWxwZXIuaW5z ZXJ0SHRtbChjLGUsdGhpcy5hcHBseVRlbXBsYXRlKGIpKTtyZXR1cm4gYT9FeHQu Z2V0KGQsdHJ1ZSk6ZH0sb3ZlcndyaXRlOmZ1bmN0aW9uKGIsYSxjKXtiPUV4dC5n ZXREb20oYik7Yi5pbm5lckhUTUw9dGhpcy5hcHBseVRlbXBsYXRlKGEpO3JldHVy biBjP0V4dC5nZXQoYi5maXJzdENoaWxkLHRydWUpOmIuZmlyc3RDaGlsZH19O0V4 dC5UZW1wbGF0ZS5wcm90b3R5cGUuYXBwbHk9RXh0LlRlbXBsYXRlLnByb3RvdHlw ZS5hcHBseVRlbXBsYXRlO0V4dC5UZW1wbGF0ZS5mcm9tPWZ1bmN0aW9uKGIsYSl7 Yj1FeHQuZ2V0RG9tKGIpO3JldHVybiBuZXcgRXh0LlRlbXBsYXRlKGIudmFsdWV8 fGIuaW5uZXJIVE1MLGF8fCIiKX07RXh0LkRvbVF1ZXJ5PWZ1bmN0aW9uKCl7dmFy IGNhY2hlPXt9LHNpbXBsZUNhY2hlPXt9LHZhbHVlQ2FjaGU9e30sbm9uU3BhY2U9 L1xTLyx0cmltUmU9L15ccyt8XHMrJC9nLHRwbFJlPS9ceyhcZCspXH0vZyxtb2Rl UmU9L14oXHM/W1wvPit+XVxzP3xcc3wkKS8sdGFnVG9rZW5SZT0vXigjKT8oW1x3 XC1cKl0rKS8sbnRoUmU9LyhcZCopblwrPyhcZCopLyxudGhSZTI9L1xELyxpc0lF PXdpbmRvdy5BY3RpdmVYT2JqZWN0P3RydWU6ZmFsc2Usa2V5PTMwODAzO2V2YWwo InZhciBiYXRjaCA9IDMwODAzOyIpO2Z1bmN0aW9uIGNoaWxkKHBhcmVudCxpbmRl eCl7dmFyIGk9MCxuPXBhcmVudC5maXJzdENoaWxkO3doaWxlKG4pe2lmKG4ubm9k ZVR5cGU9PTEpe2lmKCsraT09aW5kZXgpe3JldHVybiBufX1uPW4ubmV4dFNpYmxp bmd9cmV0dXJuIG51bGx9ZnVuY3Rpb24gbmV4dChuKXt3aGlsZSgobj1uLm5leHRT aWJsaW5nKSYmbi5ub2RlVHlwZSE9MSl7fXJldHVybiBufWZ1bmN0aW9uIHByZXYo bil7d2hpbGUoKG49bi5wcmV2aW91c1NpYmxpbmcpJiZuLm5vZGVUeXBlIT0xKXt9 cmV0dXJuIG59ZnVuY3Rpb24gY2hpbGRyZW4ocGFyZW50KXt2YXIgbj1wYXJlbnQu Zmlyc3RDaGlsZCxub2RlSW5kZXg9LTEsbmV4dE5vZGU7d2hpbGUobil7bmV4dE5v ZGU9bi5uZXh0U2libGluZztpZihuLm5vZGVUeXBlPT0zJiYhbm9uU3BhY2UudGVz dChuLm5vZGVWYWx1ZSkpe3BhcmVudC5yZW1vdmVDaGlsZChuKX1lbHNle24ubm9k ZUluZGV4PSsrbm9kZUluZGV4fW49bmV4dE5vZGV9cmV0dXJuIHRoaXN9ZnVuY3Rp b24gYnlDbGFzc05hbWUobm9kZVNldCxjbHMpe2lmKCFjbHMpe3JldHVybiBub2Rl U2V0fXZhciByZXN1bHQ9W10scmk9LTE7Zm9yKHZhciBpPTAsY2k7Y2k9bm9kZVNl dFtpXTtpKyspe2lmKCgiICIrY2kuY2xhc3NOYW1lKyIgIikuaW5kZXhPZihjbHMp IT0tMSl7cmVzdWx0WysrcmldPWNpfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGF0 dHJWYWx1ZShuLGF0dHIpe2lmKCFuLnRhZ05hbWUmJnR5cGVvZiBuLmxlbmd0aCE9 InVuZGVmaW5lZCIpe249blswXX1pZighbil7cmV0dXJuIG51bGx9aWYoYXR0cj09 ImZvciIpe3JldHVybiBuLmh0bWxGb3J9aWYoYXR0cj09ImNsYXNzInx8YXR0cj09 ImNsYXNzTmFtZSIpe3JldHVybiBuLmNsYXNzTmFtZX1yZXR1cm4gbi5nZXRBdHRy aWJ1dGUoYXR0cil8fG5bYXR0cl19ZnVuY3Rpb24gZ2V0Tm9kZXMobnMsbW9kZSx0 YWdOYW1lKXt2YXIgcmVzdWx0PVtdLHJpPS0xLGNzO2lmKCFucyl7cmV0dXJuIHJl c3VsdH10YWdOYW1lPXRhZ05hbWV8fCIqIjtpZih0eXBlb2YgbnMuZ2V0RWxlbWVu dHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiKXtucz1bbnNdfWlmKCFtb2RlKXtmb3Io dmFyIGk9MCxuaTtuaT1uc1tpXTtpKyspe2NzPW5pLmdldEVsZW1lbnRzQnlUYWdO YW1lKHRhZ05hbWUpO2Zvcih2YXIgaj0wLGNpO2NpPWNzW2pdO2orKyl7cmVzdWx0 WysrcmldPWNpfX19ZWxzZXtpZihtb2RlPT0iLyJ8fG1vZGU9PSI+Iil7dmFyIHV0 YWc9dGFnTmFtZS50b1VwcGVyQ2FzZSgpO2Zvcih2YXIgaT0wLG5pLGNuO25pPW5z W2ldO2krKyl7Y249bmkuY2hpbGROb2Rlcztmb3IodmFyIGo9MCxjajtjaj1jbltq XTtqKyspe2lmKGNqLm5vZGVOYW1lPT11dGFnfHxjai5ub2RlTmFtZT09dGFnTmFt ZXx8dGFnTmFtZT09IioiKXtyZXN1bHRbKytyaV09Y2p9fX19ZWxzZXtpZihtb2Rl PT0iKyIpe3ZhciB1dGFnPXRhZ05hbWUudG9VcHBlckNhc2UoKTtmb3IodmFyIGk9 MCxuO249bnNbaV07aSsrKXt3aGlsZSgobj1uLm5leHRTaWJsaW5nKSYmbi5ub2Rl VHlwZSE9MSl7fWlmKG4mJihuLm5vZGVOYW1lPT11dGFnfHxuLm5vZGVOYW1lPT10 YWdOYW1lfHx0YWdOYW1lPT0iKiIpKXtyZXN1bHRbKytyaV09bn19fWVsc2V7aWYo bW9kZT09In4iKXt2YXIgdXRhZz10YWdOYW1lLnRvVXBwZXJDYXNlKCk7Zm9yKHZh ciBpPTAsbjtuPW5zW2ldO2krKyl7d2hpbGUoKG49bi5uZXh0U2libGluZykpe2lm KG4ubm9kZU5hbWU9PXV0YWd8fG4ubm9kZU5hbWU9PXRhZ05hbWV8fHRhZ05hbWU9 PSIqIil7cmVzdWx0WysrcmldPW59fX19fX19cmV0dXJuIHJlc3VsdH1mdW5jdGlv biBjb25jYXQoYSxiKXtpZihiLnNsaWNlKXtyZXR1cm4gYS5jb25jYXQoYil9Zm9y KHZhciBpPTAsbD1iLmxlbmd0aDtpPGw7aSsrKXthW2EubGVuZ3RoXT1iW2ldfXJl dHVybiBhfWZ1bmN0aW9uIGJ5VGFnKGNzLHRhZ05hbWUpe2lmKGNzLnRhZ05hbWV8 fGNzPT1kb2N1bWVudCl7Y3M9W2NzXX1pZighdGFnTmFtZSl7cmV0dXJuIGNzfXZh ciByZXN1bHQ9W10scmk9LTE7dGFnTmFtZT10YWdOYW1lLnRvTG93ZXJDYXNlKCk7 Zm9yKHZhciBpPTAsY2k7Y2k9Y3NbaV07aSsrKXtpZihjaS5ub2RlVHlwZT09MSYm Y2kudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT10YWdOYW1lKXtyZXN1bHRbKytyaV09 Y2l9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYnlJZChjcyxpZCl7aWYoY3MudGFn TmFtZXx8Y3M9PWRvY3VtZW50KXtjcz1bY3NdfWlmKCFpZCl7cmV0dXJuIGNzfXZh ciByZXN1bHQ9W10scmk9LTE7Zm9yKHZhciBpPTAsY2k7Y2k9Y3NbaV07aSsrKXtp ZihjaSYmY2kuaWQ9PWlkKXtyZXN1bHRbKytyaV09Y2k7cmV0dXJuIHJlc3VsdH19 cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBieUF0dHJpYnV0ZShjcyxhdHRyLHZhbHVl LG9wLGN1c3RvbSl7dmFyIHJlc3VsdD1bXSxyaT0tMSx1c2VHZXRTdHlsZT1jdXN0 b209PSJ7Iixmbj1FeHQuRG9tUXVlcnkub3BlcmF0b3JzW29wXSxhLHhtbCxoYXNY bWw7Zm9yKHZhciBpPTAsY2k7Y2k9Y3NbaV07aSsrKXtpZihjaS5ub2RlVHlwZSE9 MSl7Y29udGludWV9aWYoIWhhc1htbCl7eG1sPUV4dC5Eb21RdWVyeS5pc1htbChj aSk7aGFzWG1sPXRydWV9aWYoIXhtbCl7aWYodXNlR2V0U3R5bGUpe2E9RXh0LkRv bVF1ZXJ5LmdldFN0eWxlKGNpLGF0dHIpfWVsc2V7aWYoYXR0cj09ImNsYXNzInx8 YXR0cj09ImNsYXNzTmFtZSIpe2E9Y2kuY2xhc3NOYW1lfWVsc2V7aWYoYXR0cj09 ImZvciIpe2E9Y2kuaHRtbEZvcn1lbHNle2lmKGF0dHI9PSJocmVmIil7YT1jaS5n ZXRBdHRyaWJ1dGUoImhyZWYiLDIpfWVsc2V7YT1jaS5nZXRBdHRyaWJ1dGUoYXR0 cil9fX19fWVsc2V7YT1jaS5nZXRBdHRyaWJ1dGUoYXR0cil9aWYoKGZuJiZmbihh LHZhbHVlKSl8fCghZm4mJmEpKXtyZXN1bHRbKytyaV09Y2l9fXJldHVybiByZXN1 bHR9ZnVuY3Rpb24gYnlQc2V1ZG8oY3MsbmFtZSx2YWx1ZSl7cmV0dXJuIEV4dC5E b21RdWVyeS5wc2V1ZG9zW25hbWVdKGNzLHZhbHVlKX1mdW5jdGlvbiBub2R1cElF WG1sKGNzKXt2YXIgZD0rK2tleSxyO2NzWzBdLnNldEF0dHJpYnV0ZSgiX25vZHVw IixkKTtyPVtjc1swXV07Zm9yKHZhciBpPTEsbGVuPWNzLmxlbmd0aDtpPGxlbjtp Kyspe3ZhciBjPWNzW2ldO2lmKCFjLmdldEF0dHJpYnV0ZSgiX25vZHVwIikhPWQp e2Muc2V0QXR0cmlidXRlKCJfbm9kdXAiLGQpO3Jbci5sZW5ndGhdPWN9fWZvcih2 YXIgaT0wLGxlbj1jcy5sZW5ndGg7aTxsZW47aSsrKXtjc1tpXS5yZW1vdmVBdHRy aWJ1dGUoIl9ub2R1cCIpfXJldHVybiByfWZ1bmN0aW9uIG5vZHVwKGNzKXtpZigh Y3Mpe3JldHVybltdfXZhciBsZW49Y3MubGVuZ3RoLGMsaSxyPWNzLGNqLHJpPS0x O2lmKCFsZW58fHR5cGVvZiBjcy5ub2RlVHlwZSE9InVuZGVmaW5lZCJ8fGxlbj09 MSl7cmV0dXJuIGNzfWlmKGlzSUUmJnR5cGVvZiBjc1swXS5zZWxlY3RTaW5nbGVO b2RlIT0idW5kZWZpbmVkIil7cmV0dXJuIG5vZHVwSUVYbWwoY3MpfXZhciBkPSsr a2V5O2NzWzBdLl9ub2R1cD1kO2ZvcihpPTE7Yz1jc1tpXTtpKyspe2lmKGMuX25v ZHVwIT1kKXtjLl9ub2R1cD1kfWVsc2V7cj1bXTtmb3IodmFyIGo9MDtqPGk7aisr KXtyWysrcmldPWNzW2pdfWZvcihqPWkrMTtjaj1jc1tqXTtqKyspe2lmKGNqLl9u b2R1cCE9ZCl7Y2ouX25vZHVwPWQ7clsrK3JpXT1jan19cmV0dXJuIHJ9fXJldHVy biByfWZ1bmN0aW9uIHF1aWNrRGlmZklFWG1sKGMxLGMyKXt2YXIgZD0rK2tleSxy PVtdO2Zvcih2YXIgaT0wLGxlbj1jMS5sZW5ndGg7aTxsZW47aSsrKXtjMVtpXS5z ZXRBdHRyaWJ1dGUoIl9xZGlmZiIsZCl9Zm9yKHZhciBpPTAsbGVuPWMyLmxlbmd0 aDtpPGxlbjtpKyspe2lmKGMyW2ldLmdldEF0dHJpYnV0ZSgiX3FkaWZmIikhPWQp e3Jbci5sZW5ndGhdPWMyW2ldfX1mb3IodmFyIGk9MCxsZW49YzEubGVuZ3RoO2k8 bGVuO2krKyl7YzFbaV0ucmVtb3ZlQXR0cmlidXRlKCJfcWRpZmYiKX1yZXR1cm4g cn1mdW5jdGlvbiBxdWlja0RpZmYoYzEsYzIpe3ZhciBsZW4xPWMxLmxlbmd0aCxk PSsra2V5LHI9W107aWYoIWxlbjEpe3JldHVybiBjMn1pZihpc0lFJiZ0eXBlb2Yg YzFbMF0uc2VsZWN0U2luZ2xlTm9kZSE9InVuZGVmaW5lZCIpe3JldHVybiBxdWlj a0RpZmZJRVhtbChjMSxjMil9Zm9yKHZhciBpPTA7aTxsZW4xO2krKyl7YzFbaV0u X3FkaWZmPWR9Zm9yKHZhciBpPTAsbGVuPWMyLmxlbmd0aDtpPGxlbjtpKyspe2lm KGMyW2ldLl9xZGlmZiE9ZCl7cltyLmxlbmd0aF09YzJbaV19fXJldHVybiByfWZ1 bmN0aW9uIHF1aWNrSWQobnMsbW9kZSxyb290LGlkKXtpZihucz09cm9vdCl7dmFy IGQ9cm9vdC5vd25lckRvY3VtZW50fHxyb290O3JldHVybiBkLmdldEVsZW1lbnRC eUlkKGlkKX1ucz1nZXROb2Rlcyhucyxtb2RlLCIqIik7cmV0dXJuIGJ5SWQobnMs aWQpfXJldHVybntnZXRTdHlsZTpmdW5jdGlvbihlbCxuYW1lKXtyZXR1cm4gRXh0 LmZseShlbCkuZ2V0U3R5bGUobmFtZSl9LGNvbXBpbGU6ZnVuY3Rpb24ocGF0aCx0 eXBlKXt0eXBlPXR5cGV8fCJzZWxlY3QiO3ZhciBmbj1bInZhciBmID0gZnVuY3Rp b24ocm9vdCl7XG4gdmFyIG1vZGU7ICsrYmF0Y2g7IHZhciBuID0gcm9vdCB8fCBk b2N1bWVudDtcbiJdLG1vZGUsbGFzdFBhdGgsbWF0Y2hlcnM9RXh0LkRvbVF1ZXJ5 Lm1hdGNoZXJzLG1hdGNoZXJzTG49bWF0Y2hlcnMubGVuZ3RoLG1vZGVNYXRjaCxs bW9kZT1wYXRoLm1hdGNoKG1vZGVSZSk7aWYobG1vZGUmJmxtb2RlWzFdKXtmbltm bi5sZW5ndGhdPSdtb2RlPSInK2xtb2RlWzFdLnJlcGxhY2UodHJpbVJlLCIiKSsn IjsnO3BhdGg9cGF0aC5yZXBsYWNlKGxtb2RlWzFdLCIiKX13aGlsZShwYXRoLnN1 YnN0cigwLDEpPT0iLyIpe3BhdGg9cGF0aC5zdWJzdHIoMSl9d2hpbGUocGF0aCYm bGFzdFBhdGghPXBhdGgpe2xhc3RQYXRoPXBhdGg7dmFyIHRva2VuTWF0Y2g9cGF0 aC5tYXRjaCh0YWdUb2tlblJlKTtpZih0eXBlPT0ic2VsZWN0Iil7aWYodG9rZW5N YXRjaCl7aWYodG9rZW5NYXRjaFsxXT09IiMiKXtmbltmbi5sZW5ndGhdPSduID0g cXVpY2tJZChuLCBtb2RlLCByb290LCAiJyt0b2tlbk1hdGNoWzJdKyciKTsnfWVs c2V7Zm5bZm4ubGVuZ3RoXT0nbiA9IGdldE5vZGVzKG4sIG1vZGUsICInK3Rva2Vu TWF0Y2hbMl0rJyIpOyd9cGF0aD1wYXRoLnJlcGxhY2UodG9rZW5NYXRjaFswXSwi Iil9ZWxzZXtpZihwYXRoLnN1YnN0cigwLDEpIT0iQCIpe2ZuW2ZuLmxlbmd0aF09 J24gPSBnZXROb2RlcyhuLCBtb2RlLCAiKiIpOyd9fX1lbHNle2lmKHRva2VuTWF0 Y2gpe2lmKHRva2VuTWF0Y2hbMV09PSIjIil7Zm5bZm4ubGVuZ3RoXT0nbiA9IGJ5 SWQobiwgIicrdG9rZW5NYXRjaFsyXSsnIik7J31lbHNle2ZuW2ZuLmxlbmd0aF09 J24gPSBieVRhZyhuLCAiJyt0b2tlbk1hdGNoWzJdKyciKTsnfXBhdGg9cGF0aC5y ZXBsYWNlKHRva2VuTWF0Y2hbMF0sIiIpfX13aGlsZSghKG1vZGVNYXRjaD1wYXRo Lm1hdGNoKG1vZGVSZSkpKXt2YXIgbWF0Y2hlZD1mYWxzZTtmb3IodmFyIGo9MDtq PG1hdGNoZXJzTG47aisrKXt2YXIgdD1tYXRjaGVyc1tqXTt2YXIgbT1wYXRoLm1h dGNoKHQucmUpO2lmKG0pe2ZuW2ZuLmxlbmd0aF09dC5zZWxlY3QucmVwbGFjZSh0 cGxSZSxmdW5jdGlvbih4LGkpe3JldHVybiBtW2ldfSk7cGF0aD1wYXRoLnJlcGxh Y2UobVswXSwiIik7bWF0Y2hlZD10cnVlO2JyZWFrfX1pZighbWF0Y2hlZCl7dGhy b3cnRXJyb3IgcGFyc2luZyBzZWxlY3RvciwgcGFyc2luZyBmYWlsZWQgYXQgIicr cGF0aCsnIid9fWlmKG1vZGVNYXRjaFsxXSl7Zm5bZm4ubGVuZ3RoXT0nbW9kZT0i Jyttb2RlTWF0Y2hbMV0ucmVwbGFjZSh0cmltUmUsIiIpKyciOyc7cGF0aD1wYXRo LnJlcGxhY2UobW9kZU1hdGNoWzFdLCIiKX19Zm5bZm4ubGVuZ3RoXT0icmV0dXJu IG5vZHVwKG4pO1xufSI7ZXZhbChmbi5qb2luKCIiKSk7cmV0dXJuIGZ9LGpzU2Vs ZWN0OmZ1bmN0aW9uKHBhdGgscm9vdCx0eXBlKXtyb290PXJvb3R8fGRvY3VtZW50 O2lmKHR5cGVvZiByb290PT0ic3RyaW5nIil7cm9vdD1kb2N1bWVudC5nZXRFbGVt ZW50QnlJZChyb290KX12YXIgcGF0aHM9cGF0aC5zcGxpdCgiLCIpLHJlc3VsdHM9 W107Zm9yKHZhciBpPTAsbGVuPXBhdGhzLmxlbmd0aDtpPGxlbjtpKyspe3ZhciBz dWJQYXRoPXBhdGhzW2ldLnJlcGxhY2UodHJpbVJlLCIiKTtpZighY2FjaGVbc3Vi UGF0aF0pe2NhY2hlW3N1YlBhdGhdPUV4dC5Eb21RdWVyeS5jb21waWxlKHN1YlBh dGgpO2lmKCFjYWNoZVtzdWJQYXRoXSl7dGhyb3cgc3ViUGF0aCsiIGlzIG5vdCBh IHZhbGlkIHNlbGVjdG9yIn19dmFyIHJlc3VsdD1jYWNoZVtzdWJQYXRoXShyb290 KTtpZihyZXN1bHQmJnJlc3VsdCE9ZG9jdW1lbnQpe3Jlc3VsdHM9cmVzdWx0cy5j b25jYXQocmVzdWx0KX19aWYocGF0aHMubGVuZ3RoPjEpe3JldHVybiBub2R1cChy ZXN1bHRzKX1yZXR1cm4gcmVzdWx0c30saXNYbWw6ZnVuY3Rpb24oZWwpe3ZhciBk b2NFbD0oZWw/ZWwub3duZXJEb2N1bWVudHx8ZWw6MCkuZG9jdW1lbnRFbGVtZW50 O3JldHVybiBkb2NFbD9kb2NFbC5ub2RlTmFtZSE9PSJIVE1MIjpmYWxzZX0sc2Vs ZWN0OmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw/ZnVuY3Rpb24ocGF0aCxyb290 LHR5cGUpe3Jvb3Q9cm9vdHx8ZG9jdW1lbnQ7aWYoIUV4dC5Eb21RdWVyeS5pc1ht bChyb290KSl7dHJ5e3ZhciBjcz1yb290LnF1ZXJ5U2VsZWN0b3JBbGwocGF0aCk7 cmV0dXJuIEV4dC50b0FycmF5KGNzKX1jYXRjaChleCl7fX1yZXR1cm4gRXh0LkRv bVF1ZXJ5LmpzU2VsZWN0LmNhbGwodGhpcyxwYXRoLHJvb3QsdHlwZSl9OmZ1bmN0 aW9uKHBhdGgscm9vdCx0eXBlKXtyZXR1cm4gRXh0LkRvbVF1ZXJ5LmpzU2VsZWN0 LmNhbGwodGhpcyxwYXRoLHJvb3QsdHlwZSl9LHNlbGVjdE5vZGU6ZnVuY3Rpb24o cGF0aCxyb290KXtyZXR1cm4gRXh0LkRvbVF1ZXJ5LnNlbGVjdChwYXRoLHJvb3Qp WzBdfSxzZWxlY3RWYWx1ZTpmdW5jdGlvbihwYXRoLHJvb3QsZGVmYXVsdFZhbHVl KXtwYXRoPXBhdGgucmVwbGFjZSh0cmltUmUsIiIpO2lmKCF2YWx1ZUNhY2hlW3Bh dGhdKXt2YWx1ZUNhY2hlW3BhdGhdPUV4dC5Eb21RdWVyeS5jb21waWxlKHBhdGgs InNlbGVjdCIpfXZhciBuPXZhbHVlQ2FjaGVbcGF0aF0ocm9vdCksdjtuPW5bMF0/ blswXTpuO2lmKHR5cGVvZiBuLm5vcm1hbGl6ZT09ImZ1bmN0aW9uIil7bi5ub3Jt YWxpemUoKX12PShuJiZuLmZpcnN0Q2hpbGQ/bi5maXJzdENoaWxkLm5vZGVWYWx1 ZTpudWxsKTtyZXR1cm4oKHY9PT1udWxsfHx2PT09dW5kZWZpbmVkfHx2PT09IiIp P2RlZmF1bHRWYWx1ZTp2KX0sc2VsZWN0TnVtYmVyOmZ1bmN0aW9uKHBhdGgscm9v dCxkZWZhdWx0VmFsdWUpe3ZhciB2PUV4dC5Eb21RdWVyeS5zZWxlY3RWYWx1ZShw YXRoLHJvb3QsZGVmYXVsdFZhbHVlfHwwKTtyZXR1cm4gcGFyc2VGbG9hdCh2KX0s aXM6ZnVuY3Rpb24oZWwsc3Mpe2lmKHR5cGVvZiBlbD09InN0cmluZyIpe2VsPWRv Y3VtZW50LmdldEVsZW1lbnRCeUlkKGVsKX12YXIgaXNBcnJheT1FeHQuaXNBcnJh eShlbCkscmVzdWx0PUV4dC5Eb21RdWVyeS5maWx0ZXIoaXNBcnJheT9lbDpbZWxd LHNzKTtyZXR1cm4gaXNBcnJheT8ocmVzdWx0Lmxlbmd0aD09ZWwubGVuZ3RoKToo cmVzdWx0Lmxlbmd0aD4wKX0sZmlsdGVyOmZ1bmN0aW9uKGVscyxzcyxub25NYXRj aGVzKXtzcz1zcy5yZXBsYWNlKHRyaW1SZSwiIik7aWYoIXNpbXBsZUNhY2hlW3Nz XSl7c2ltcGxlQ2FjaGVbc3NdPUV4dC5Eb21RdWVyeS5jb21waWxlKHNzLCJzaW1w bGUiKX12YXIgcmVzdWx0PXNpbXBsZUNhY2hlW3NzXShlbHMpO3JldHVybiBub25N YXRjaGVzP3F1aWNrRGlmZihyZXN1bHQsZWxzKTpyZXN1bHR9LG1hdGNoZXJzOlt7 cmU6L15cLihbXHdcLV0rKS8sc2VsZWN0OiduID0gYnlDbGFzc05hbWUobiwgIiB7 MX0gIik7J30se3JlOi9eXDooW1x3XC1dKykoPzpcKCgoPzpbXlxzPlwvXSp8Lio/ KSlcKSk/LyxzZWxlY3Q6J24gPSBieVBzZXVkbyhuLCAiezF9IiwgInsyfSIpOyd9 LHtyZTovXig/OihbXFtce10pKD86QCk/KFtcd1wtXSspXHM/KD86KD18Lj0pXHM/ KFsiJ10/KSguKj8pXDQpP1tcXVx9XSkvLHNlbGVjdDonbiA9IGJ5QXR0cmlidXRl KG4sICJ7Mn0iLCAiezV9IiwgInszfSIsICJ7MX0iKTsnfSx7cmU6L14jKFtcd1wt XSspLyxzZWxlY3Q6J24gPSBieUlkKG4sICJ7MX0iKTsnfSx7cmU6L15AKFtcd1wt XSspLyxzZWxlY3Q6J3JldHVybiB7Zmlyc3RDaGlsZDp7bm9kZVZhbHVlOmF0dHJW YWx1ZShuLCAiezF9Iil9fTsnfV0sb3BlcmF0b3JzOnsiPSI6ZnVuY3Rpb24oYSx2 KXtyZXR1cm4gYT09dn0sIiE9IjpmdW5jdGlvbihhLHYpe3JldHVybiBhIT12fSwi Xj0iOmZ1bmN0aW9uKGEsdil7cmV0dXJuIGEmJmEuc3Vic3RyKDAsdi5sZW5ndGgp PT12fSwiJD0iOmZ1bmN0aW9uKGEsdil7cmV0dXJuIGEmJmEuc3Vic3RyKGEubGVu Z3RoLXYubGVuZ3RoKT09dn0sIio9IjpmdW5jdGlvbihhLHYpe3JldHVybiBhJiZh LmluZGV4T2YodikhPT0tMX0sIiU9IjpmdW5jdGlvbihhLHYpe3JldHVybihhJXYp PT0wfSwifD0iOmZ1bmN0aW9uKGEsdil7cmV0dXJuIGEmJihhPT12fHxhLnN1YnN0 cigwLHYubGVuZ3RoKzEpPT12KyItIil9LCJ+PSI6ZnVuY3Rpb24oYSx2KXtyZXR1 cm4gYSYmKCIgIithKyIgIikuaW5kZXhPZigiICIrdisiICIpIT0tMX19LHBzZXVk b3M6eyJmaXJzdC1jaGlsZCI6ZnVuY3Rpb24oYyl7dmFyIHI9W10scmk9LTEsbjtm b3IodmFyIGk9MCxjaTtjaT1uPWNbaV07aSsrKXt3aGlsZSgobj1uLnByZXZpb3Vz U2libGluZykmJm4ubm9kZVR5cGUhPTEpe31pZighbil7clsrK3JpXT1jaX19cmV0 dXJuIHJ9LCJsYXN0LWNoaWxkIjpmdW5jdGlvbihjKXt2YXIgcj1bXSxyaT0tMSxu O2Zvcih2YXIgaT0wLGNpO2NpPW49Y1tpXTtpKyspe3doaWxlKChuPW4ubmV4dFNp YmxpbmcpJiZuLm5vZGVUeXBlIT0xKXt9aWYoIW4pe3JbKytyaV09Y2l9fXJldHVy biByfSwibnRoLWNoaWxkIjpmdW5jdGlvbihjLGEpe3ZhciByPVtdLHJpPS0xLG09 bnRoUmUuZXhlYyhhPT0iZXZlbiImJiIybiJ8fGE9PSJvZGQiJiYiMm4rMSJ8fCFu dGhSZTIudGVzdChhKSYmIm4rIithfHxhKSxmPShtWzFdfHwxKS0wLGw9bVsyXS0w O2Zvcih2YXIgaT0wLG47bj1jW2ldO2krKyl7dmFyIHBuPW4ucGFyZW50Tm9kZTtp ZihiYXRjaCE9cG4uX2JhdGNoKXt2YXIgaj0wO2Zvcih2YXIgY249cG4uZmlyc3RD aGlsZDtjbjtjbj1jbi5uZXh0U2libGluZyl7aWYoY24ubm9kZVR5cGU9PTEpe2Nu Lm5vZGVJbmRleD0rK2p9fXBuLl9iYXRjaD1iYXRjaH1pZihmPT0xKXtpZihsPT0w fHxuLm5vZGVJbmRleD09bCl7clsrK3JpXT1ufX1lbHNle2lmKChuLm5vZGVJbmRl eCtsKSVmPT0wKXtyWysrcmldPW59fX1yZXR1cm4gcn0sIm9ubHktY2hpbGQiOmZ1 bmN0aW9uKGMpe3ZhciByPVtdLHJpPS0xO2Zvcih2YXIgaT0wLGNpO2NpPWNbaV07 aSsrKXtpZighcHJldihjaSkmJiFuZXh0KGNpKSl7clsrK3JpXT1jaX19cmV0dXJu IHJ9LGVtcHR5OmZ1bmN0aW9uKGMpe3ZhciByPVtdLHJpPS0xO2Zvcih2YXIgaT0w LGNpO2NpPWNbaV07aSsrKXt2YXIgY25zPWNpLmNoaWxkTm9kZXMsaj0wLGNuLGVt cHR5PXRydWU7d2hpbGUoY249Y25zW2pdKXsrK2o7aWYoY24ubm9kZVR5cGU9PTF8 fGNuLm5vZGVUeXBlPT0zKXtlbXB0eT1mYWxzZTticmVha319aWYoZW1wdHkpe3Jb KytyaV09Y2l9fXJldHVybiByfSxjb250YWluczpmdW5jdGlvbihjLHYpe3ZhciBy PVtdLHJpPS0xO2Zvcih2YXIgaT0wLGNpO2NpPWNbaV07aSsrKXtpZigoY2kudGV4 dENvbnRlbnR8fGNpLmlubmVyVGV4dHx8IiIpLmluZGV4T2YodikhPS0xKXtyWysr cmldPWNpfX1yZXR1cm4gcn0sbm9kZVZhbHVlOmZ1bmN0aW9uKGMsdil7dmFyIHI9 W10scmk9LTE7Zm9yKHZhciBpPTAsY2k7Y2k9Y1tpXTtpKyspe2lmKGNpLmZpcnN0 Q2hpbGQmJmNpLmZpcnN0Q2hpbGQubm9kZVZhbHVlPT12KXtyWysrcmldPWNpfX1y ZXR1cm4gcn0sY2hlY2tlZDpmdW5jdGlvbihjKXt2YXIgcj1bXSxyaT0tMTtmb3Io dmFyIGk9MCxjaTtjaT1jW2ldO2krKyl7aWYoY2kuY2hlY2tlZD09dHJ1ZSl7clsr K3JpXT1jaX19cmV0dXJuIHJ9LG5vdDpmdW5jdGlvbihjLHNzKXtyZXR1cm4gRXh0 LkRvbVF1ZXJ5LmZpbHRlcihjLHNzLHRydWUpfSxhbnk6ZnVuY3Rpb24oYyxzZWxl Y3RvcnMpe3ZhciBzcz1zZWxlY3RvcnMuc3BsaXQoInwiKSxyPVtdLHJpPS0xLHM7 Zm9yKHZhciBpPTAsY2k7Y2k9Y1tpXTtpKyspe2Zvcih2YXIgaj0wO3M9c3Nbal07 aisrKXtpZihFeHQuRG9tUXVlcnkuaXMoY2kscykpe3JbKytyaV09Y2k7YnJlYWt9 fX1yZXR1cm4gcn0sb2RkOmZ1bmN0aW9uKGMpe3JldHVybiB0aGlzWyJudGgtY2hp bGQiXShjLCJvZGQiKX0sZXZlbjpmdW5jdGlvbihjKXtyZXR1cm4gdGhpc1sibnRo LWNoaWxkIl0oYywiZXZlbiIpfSxudGg6ZnVuY3Rpb24oYyxhKXtyZXR1cm4gY1th LTFdfHxbXX0sZmlyc3Q6ZnVuY3Rpb24oYyl7cmV0dXJuIGNbMF18fFtdfSxsYXN0 OmZ1bmN0aW9uKGMpe3JldHVybiBjW2MubGVuZ3RoLTFdfHxbXX0saGFzOmZ1bmN0 aW9uKGMsc3Mpe3ZhciBzPUV4dC5Eb21RdWVyeS5zZWxlY3Qscj1bXSxyaT0tMTtm b3IodmFyIGk9MCxjaTtjaT1jW2ldO2krKyl7aWYocyhzcyxjaSkubGVuZ3RoPjAp e3JbKytyaV09Y2l9fXJldHVybiByfSxuZXh0OmZ1bmN0aW9uKGMsc3Mpe3ZhciBp cz1FeHQuRG9tUXVlcnkuaXMscj1bXSxyaT0tMTtmb3IodmFyIGk9MCxjaTtjaT1j W2ldO2krKyl7dmFyIG49bmV4dChjaSk7aWYobiYmaXMobixzcykpe3JbKytyaV09 Y2l9fXJldHVybiByfSxwcmV2OmZ1bmN0aW9uKGMsc3Mpe3ZhciBpcz1FeHQuRG9t UXVlcnkuaXMscj1bXSxyaT0tMTtmb3IodmFyIGk9MCxjaTtjaT1jW2ldO2krKyl7 dmFyIG49cHJldihjaSk7aWYobiYmaXMobixzcykpe3JbKytyaV09Y2l9fXJldHVy biByfX19fSgpO0V4dC5xdWVyeT1FeHQuRG9tUXVlcnkuc2VsZWN0O0V4dC51dGls LkRlbGF5ZWRUYXNrPWZ1bmN0aW9uKGQsYyxhKXt2YXIgZT10aGlzLGcsYj1mdW5j dGlvbigpe2NsZWFySW50ZXJ2YWwoZyk7Zz1udWxsO2QuYXBwbHkoYyxhfHxbXSl9 O2UuZGVsYXk9ZnVuY3Rpb24oaSxrLGosaCl7ZS5jYW5jZWwoKTtkPWt8fGQ7Yz1q fHxjO2E9aHx8YTtnPXNldEludGVydmFsKGIsaSl9O2UuY2FuY2VsPWZ1bmN0aW9u KCl7aWYoZyl7Y2xlYXJJbnRlcnZhbChnKTtnPW51bGx9fX07KGZ1bmN0aW9uKCl7 dmFyIGg9ZG9jdW1lbnQ7RXh0LkVsZW1lbnQ9ZnVuY3Rpb24obCxtKXt2YXIgbj10 eXBlb2YgbD09InN0cmluZyI/aC5nZXRFbGVtZW50QnlJZChsKTpsLG87aWYoIW4p e3JldHVybiBudWxsfW89bi5pZDtpZighbSYmbyYmRXh0LmVsQ2FjaGVbb10pe3Jl dHVybiBFeHQuZWxDYWNoZVtvXS5lbH10aGlzLmRvbT1uO3RoaXMuaWQ9b3x8RXh0 LmlkKG4pfTt2YXIgZD1FeHQuRG9tSGVscGVyLGU9RXh0LkVsZW1lbnQsYT1FeHQu ZWxDYWNoZTtlLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKHEsbSl7dmFyIG49dGhp cy5kb20sbCxwLG09KG0hPT1mYWxzZSkmJiEhbi5zZXRBdHRyaWJ1dGU7Zm9yKGwg aW4gcSl7aWYocS5oYXNPd25Qcm9wZXJ0eShsKSl7cD1xW2xdO2lmKGw9PSJzdHls ZSIpe2QuYXBwbHlTdHlsZXMobixwKX1lbHNle2lmKGw9PSJjbHMiKXtuLmNsYXNz TmFtZT1wfWVsc2V7aWYobSl7bi5zZXRBdHRyaWJ1dGUobCxwKX1lbHNle25bbF09 cH19fX19cmV0dXJuIHRoaXN9LGRlZmF1bHRVbml0OiJweCIsaXM6ZnVuY3Rpb24o bCl7cmV0dXJuIEV4dC5Eb21RdWVyeS5pcyh0aGlzLmRvbSxsKX0sZm9jdXM6ZnVu Y3Rpb24obyxuKXt2YXIgbD10aGlzLG49bnx8bC5kb207dHJ5e2lmKE51bWJlcihv KSl7bC5mb2N1cy5kZWZlcihvLG51bGwsW251bGwsbl0pfWVsc2V7bi5mb2N1cygp fX1jYXRjaChtKXt9cmV0dXJuIGx9LGJsdXI6ZnVuY3Rpb24oKXt0cnl7dGhpcy5k b20uYmx1cigpfWNhdGNoKGwpe31yZXR1cm4gdGhpc30sZ2V0VmFsdWU6ZnVuY3Rp b24obCl7dmFyIG09dGhpcy5kb20udmFsdWU7cmV0dXJuIGw/cGFyc2VJbnQobSwx MCk6bX0sYWRkTGlzdGVuZXI6ZnVuY3Rpb24obCxvLG4sbSl7RXh0LkV2ZW50TWFu YWdlci5vbih0aGlzLmRvbSxsLG8sbnx8dGhpcyxtKTtyZXR1cm4gdGhpc30scmVt b3ZlTGlzdGVuZXI6ZnVuY3Rpb24obCxuLG0pe0V4dC5FdmVudE1hbmFnZXIucmVt b3ZlTGlzdGVuZXIodGhpcy5kb20sbCxuLG18fHRoaXMpO3JldHVybiB0aGlzfSxy ZW1vdmVBbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oKXtFeHQuRXZlbnRNYW5hZ2VyLnJl bW92ZUFsbCh0aGlzLmRvbSk7cmV0dXJuIHRoaXN9LHB1cmdlQWxsTGlzdGVuZXJz OmZ1bmN0aW9uKCl7RXh0LkV2ZW50TWFuYWdlci5wdXJnZUVsZW1lbnQodGhpcyx0 cnVlKTtyZXR1cm4gdGhpc30sYWRkVW5pdHM6ZnVuY3Rpb24obCl7aWYobD09PSIi fHxsPT0iYXV0byJ8fGw9PT11bmRlZmluZWQpe2w9bHx8IiJ9ZWxzZXtpZighaXNO YU4obCl8fCFpLnRlc3QobCkpe2w9bCsodGhpcy5kZWZhdWx0VW5pdHx8InB4Iil9 fXJldHVybiBsfSxsb2FkOmZ1bmN0aW9uKG0sbixsKXtFeHQuQWpheC5yZXF1ZXN0 KEV4dC5hcHBseSh7cGFyYW1zOm4sdXJsOm0udXJsfHxtLGNhbGxiYWNrOmwsZWw6 dGhpcy5kb20saW5kaWNhdG9yVGV4dDptLmluZGljYXRvclRleHR8fCIifSxFeHQu aXNPYmplY3QobSk/bTp7fSkpO3JldHVybiB0aGlzfSxpc0JvcmRlckJveDpmdW5j dGlvbigpe3JldHVybiBFeHQuaXNCb3JkZXJCb3h8fEV4dC5pc0ZvcmNlZEJvcmRl ckJveHx8Z1sodGhpcy5kb20udGFnTmFtZXx8IiIpLnRvTG93ZXJDYXNlKCldfSxy ZW1vdmU6ZnVuY3Rpb24oKXt2YXIgbD10aGlzLG09bC5kb207aWYobSl7ZGVsZXRl IGwuZG9tO0V4dC5yZW1vdmVOb2RlKG0pfX0saG92ZXI6ZnVuY3Rpb24obSxsLG8s bil7dmFyIHA9dGhpcztwLm9uKCJtb3VzZWVudGVyIixtLG98fHAuZG9tLG4pO3Au b24oIm1vdXNlbGVhdmUiLGwsb3x8cC5kb20sbik7cmV0dXJuIHB9LGNvbnRhaW5z OmZ1bmN0aW9uKGwpe3JldHVybiAhbD9mYWxzZTpFeHQubGliLkRvbS5pc0FuY2Vz dG9yKHRoaXMuZG9tLGwuZG9tP2wuZG9tOmwpfSxnZXRBdHRyaWJ1dGVOUzpmdW5j dGlvbihtLGwpe3JldHVybiB0aGlzLmdldEF0dHJpYnV0ZShsLG0pfSxnZXRBdHRy aWJ1dGU6KGZ1bmN0aW9uKCl7dmFyIHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgi dGFibGUiKSxvPWZhbHNlLG09ImdldEF0dHJpYnV0ZSIgaW4gcCxsPS91bmRlZmlu ZWR8dW5rbm93bi87aWYobSl7dHJ5e3AuZ2V0QXR0cmlidXRlKCJleHQ6cXRpcCIp fWNhdGNoKG4pe289dHJ1ZX1yZXR1cm4gZnVuY3Rpb24ocSxzKXt2YXIgcj10aGlz LmRvbSx0O2lmKHIuZ2V0QXR0cmlidXRlTlMpe3Q9ci5nZXRBdHRyaWJ1dGVOUyhz LHEpfHxudWxsfWlmKHQ9PW51bGwpe2lmKHMpe2lmKG8mJnIudGFnTmFtZS50b1Vw cGVyQ2FzZSgpPT0iVEFCTEUiKXt0cnl7dD1yLmdldEF0dHJpYnV0ZShzKyI6Iitx KX1jYXRjaCh1KXt0PSIifX1lbHNle3Q9ci5nZXRBdHRyaWJ1dGUocysiOiIrcSl9 fWVsc2V7dD1yLmdldEF0dHJpYnV0ZShxKXx8cltxXX19cmV0dXJuIHR8fCIifX1l bHNle3JldHVybiBmdW5jdGlvbihxLHMpe3ZhciByPXRoaXMub20sdSx0O2lmKHMp e3Q9cltzKyI6IitxXTt1PWwudGVzdCh0eXBlb2YgdCk/dW5kZWZpbmVkOnR9ZWxz ZXt1PXJbcV19cmV0dXJuIHV8fCIifX1wPW51bGx9KSgpLHVwZGF0ZTpmdW5jdGlv bihsKXtpZih0aGlzLmRvbSl7dGhpcy5kb20uaW5uZXJIVE1MPWx9cmV0dXJuIHRo aXN9fTt2YXIgaz1lLnByb3RvdHlwZTtlLmFkZE1ldGhvZHM9ZnVuY3Rpb24obCl7 RXh0LmFwcGx5KGssbCl9O2sub249ay5hZGRMaXN0ZW5lcjtrLnVuPWsucmVtb3Zl TGlzdGVuZXI7ay5hdXRvQm94QWRqdXN0PXRydWU7dmFyIGk9L1xkKyhweHxlbXwl fGVufGV4fHB0fGlufGNtfG1tfHBjKSQvaSxjO2UuZ2V0PWZ1bmN0aW9uKG0pe3Zh ciBsLHAsbztpZighbSl7cmV0dXJuIG51bGx9aWYodHlwZW9mIG09PSJzdHJpbmci KXtpZighKHA9aC5nZXRFbGVtZW50QnlJZChtKSkpe3JldHVybiBudWxsfWlmKGFb bV0mJmFbbV0uZWwpe2w9YVttXS5lbDtsLmRvbT1wfWVsc2V7bD1lLmFkZFRvQ2Fj aGUobmV3IGUocCkpfXJldHVybiBsfWVsc2V7aWYobS50YWdOYW1lKXtpZighKG89 bS5pZCkpe289RXh0LmlkKG0pfWlmKGFbb10mJmFbb10uZWwpe2w9YVtvXS5lbDts LmRvbT1tfWVsc2V7bD1lLmFkZFRvQ2FjaGUobmV3IGUobSkpfXJldHVybiBsfWVs c2V7aWYobSBpbnN0YW5jZW9mIGUpe2lmKG0hPWMpe2lmKEV4dC5pc0lFJiYobS5p ZD09dW5kZWZpbmVkfHxtLmlkPT0iIikpe20uZG9tPW0uZG9tfWVsc2V7bS5kb209 aC5nZXRFbGVtZW50QnlJZChtLmlkKXx8bS5kb219fXJldHVybiBtfWVsc2V7aWYo bS5pc0NvbXBvc2l0ZSl7cmV0dXJuIG19ZWxzZXtpZihFeHQuaXNBcnJheShtKSl7 cmV0dXJuIGUuc2VsZWN0KG0pfWVsc2V7aWYobT09aCl7aWYoIWMpe3ZhciBuPWZ1 bmN0aW9uKCl7fTtuLnByb3RvdHlwZT1lLnByb3RvdHlwZTtjPW5ldyBuKCk7Yy5k b209aH1yZXR1cm4gY319fX19fXJldHVybiBudWxsfTtlLmFkZFRvQ2FjaGU9ZnVu Y3Rpb24obCxtKXttPW18fGwuaWQ7YVttXT17ZWw6bCxkYXRhOnt9LGV2ZW50czp7 fX07cmV0dXJuIGx9O2UuZGF0YT1mdW5jdGlvbihtLGwsbil7bT1lLmdldChtKTtp ZighbSl7cmV0dXJuIG51bGx9dmFyIG89YVttLmlkXS5kYXRhO2lmKGFyZ3VtZW50 cy5sZW5ndGg9PTIpe3JldHVybiBvW2xdfWVsc2V7cmV0dXJuKG9bbF09bil9fTtm dW5jdGlvbiBqKCl7aWYoIUV4dC5lbmFibGVHYXJiYWdlQ29sbGVjdG9yKXtjbGVh ckludGVydmFsKGUuY29sbGVjdG9yVGhyZWFkSWQpfWVsc2V7dmFyIGwsbixxLHA7 Zm9yKGwgaW4gYSl7cD1hW2xdO2lmKHAuc2tpcEdDKXtjb250aW51ZX1uPXAuZWw7 cT1uLmRvbTtpZighcXx8IXEucGFyZW50Tm9kZXx8KCFxLm9mZnNldFBhcmVudCYm IWguZ2V0RWxlbWVudEJ5SWQobCkpKXtpZihFeHQuZW5hYmxlTGlzdGVuZXJDb2xs ZWN0aW9uKXtFeHQuRXZlbnRNYW5hZ2VyLnJlbW92ZUFsbChxKX1kZWxldGUgYVts XX19aWYoRXh0LmlzSUUpe3ZhciBtPXt9O2ZvcihsIGluIGEpe21bbF09YVtsXX1h PUV4dC5lbENhY2hlPW19fX1lLmNvbGxlY3RvclRocmVhZElkPXNldEludGVydmFs KGosMzAwMDApO3ZhciBiPWZ1bmN0aW9uKCl7fTtiLnByb3RvdHlwZT1lLnByb3Rv dHlwZTtlLkZseXdlaWdodD1mdW5jdGlvbihsKXt0aGlzLmRvbT1sfTtlLkZseXdl aWdodC5wcm90b3R5cGU9bmV3IGIoKTtlLkZseXdlaWdodC5wcm90b3R5cGUuaXNG bHl3ZWlnaHQ9dHJ1ZTtlLl9mbHl3ZWlnaHRzPXt9O2UuZmx5PWZ1bmN0aW9uKG4s bCl7dmFyIG09bnVsbDtsPWx8fCJfZ2xvYmFsIjtpZihuPUV4dC5nZXREb20obikp eyhlLl9mbHl3ZWlnaHRzW2xdPWUuX2ZseXdlaWdodHNbbF18fG5ldyBlLkZseXdl aWdodCgpKS5kb209bjttPWUuX2ZseXdlaWdodHNbbF19cmV0dXJuIG19O0V4dC5n ZXQ9ZS5nZXQ7RXh0LmZseT1lLmZseTt2YXIgZz1FeHQuaXNTdHJpY3Q/e3NlbGVj dDoxfTp7aW5wdXQ6MSxzZWxlY3Q6MSx0ZXh0YXJlYToxfTtpZihFeHQuaXNJRXx8 RXh0LmlzR2Vja28pe2cuYnV0dG9uPTF9fSkoKTtFeHQuRWxlbWVudC5hZGRNZXRo b2RzKGZ1bmN0aW9uKCl7dmFyIGQ9InBhcmVudE5vZGUiLGI9Im5leHRTaWJsaW5n IixjPSJwcmV2aW91c1NpYmxpbmciLGU9RXh0LkRvbVF1ZXJ5LGE9RXh0LmdldDty ZXR1cm57ZmluZFBhcmVudDpmdW5jdGlvbihtLGwsaCl7dmFyIGo9dGhpcy5kb20s Zz1kb2N1bWVudC5ib2R5LGs9MCxpO2lmKEV4dC5pc0dlY2tvJiZPYmplY3QucHJv dG90eXBlLnRvU3RyaW5nLmNhbGwoaik9PSJbb2JqZWN0IFhVTEVsZW1lbnRdIil7 cmV0dXJuIG51bGx9bD1sfHw1MDtpZihpc05hTihsKSl7aT1FeHQuZ2V0RG9tKGwp O2w9TnVtYmVyLk1BWF9WQUxVRX13aGlsZShqJiZqLm5vZGVUeXBlPT0xJiZrPGwm JmohPWcmJmohPWkpe2lmKGUuaXMoaixtKSl7cmV0dXJuIGg/YShqKTpqfWsrKztq PWoucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH0sZmluZFBhcmVudE5vZGU6ZnVuY3Rp b24oaixpLGcpe3ZhciBoPUV4dC5mbHkodGhpcy5kb20ucGFyZW50Tm9kZSwiX2lu dGVybmFsIik7cmV0dXJuIGg/aC5maW5kUGFyZW50KGosaSxnKTpudWxsfSx1cDpm dW5jdGlvbihoLGcpe3JldHVybiB0aGlzLmZpbmRQYXJlbnROb2RlKGgsZyx0cnVl KX0sc2VsZWN0OmZ1bmN0aW9uKGcpe3JldHVybiBFeHQuRWxlbWVudC5zZWxlY3Qo Zyx0aGlzLmRvbSl9LHF1ZXJ5OmZ1bmN0aW9uKGcpe3JldHVybiBlLnNlbGVjdChn LHRoaXMuZG9tKX0sY2hpbGQ6ZnVuY3Rpb24oZyxoKXt2YXIgaT1lLnNlbGVjdE5v ZGUoZyx0aGlzLmRvbSk7cmV0dXJuIGg/aTphKGkpfSxkb3duOmZ1bmN0aW9uKGcs aCl7dmFyIGk9ZS5zZWxlY3ROb2RlKCIgPiAiK2csdGhpcy5kb20pO3JldHVybiBo P2k6YShpKX0scGFyZW50OmZ1bmN0aW9uKGcsaCl7cmV0dXJuIHRoaXMubWF0Y2hO b2RlKGQsZCxnLGgpfSxuZXh0OmZ1bmN0aW9uKGcsaCl7cmV0dXJuIHRoaXMubWF0 Y2hOb2RlKGIsYixnLGgpfSxwcmV2OmZ1bmN0aW9uKGcsaCl7cmV0dXJuIHRoaXMu bWF0Y2hOb2RlKGMsYyxnLGgpfSxmaXJzdDpmdW5jdGlvbihnLGgpe3JldHVybiB0 aGlzLm1hdGNoTm9kZShiLCJmaXJzdENoaWxkIixnLGgpfSxsYXN0OmZ1bmN0aW9u KGcsaCl7cmV0dXJuIHRoaXMubWF0Y2hOb2RlKGMsImxhc3RDaGlsZCIsZyxoKX0s bWF0Y2hOb2RlOmZ1bmN0aW9uKGgsayxnLGkpe3ZhciBqPXRoaXMuZG9tW2tdO3do aWxlKGope2lmKGoubm9kZVR5cGU9PTEmJighZ3x8ZS5pcyhqLGcpKSl7cmV0dXJu ICFpP2Eoaik6an1qPWpbaF19cmV0dXJuIG51bGx9fX0oKSk7RXh0LkVsZW1lbnQu YWRkTWV0aG9kcyhmdW5jdGlvbigpe3ZhciBjPUV4dC5nZXREb20sYT1FeHQuZ2V0 LGI9RXh0LkRvbUhlbHBlcjtyZXR1cm57YXBwZW5kQ2hpbGQ6ZnVuY3Rpb24oZCl7 cmV0dXJuIGEoZCkuYXBwZW5kVG8odGhpcyl9LGFwcGVuZFRvOmZ1bmN0aW9uKGQp e2MoZCkuYXBwZW5kQ2hpbGQodGhpcy5kb20pO3JldHVybiB0aGlzfSxpbnNlcnRC ZWZvcmU6ZnVuY3Rpb24oZCl7KGQ9YyhkKSkucGFyZW50Tm9kZS5pbnNlcnRCZWZv cmUodGhpcy5kb20sZCk7cmV0dXJuIHRoaXN9LGluc2VydEFmdGVyOmZ1bmN0aW9u KGQpeyhkPWMoZCkpLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLGQu bmV4dFNpYmxpbmcpO3JldHVybiB0aGlzfSxpbnNlcnRGaXJzdDpmdW5jdGlvbihl LGQpe2U9ZXx8e307aWYoZS5ub2RlVHlwZXx8ZS5kb218fHR5cGVvZiBlPT0ic3Ry aW5nIil7ZT1jKGUpO3RoaXMuZG9tLmluc2VydEJlZm9yZShlLHRoaXMuZG9tLmZp cnN0Q2hpbGQpO3JldHVybiAhZD9hKGUpOmV9ZWxzZXtyZXR1cm4gdGhpcy5jcmVh dGVDaGlsZChlLHRoaXMuZG9tLmZpcnN0Q2hpbGQsZCl9fSxyZXBsYWNlOmZ1bmN0 aW9uKGQpe2Q9YShkKTt0aGlzLmluc2VydEJlZm9yZShkKTtkLnJlbW92ZSgpO3Jl dHVybiB0aGlzfSxyZXBsYWNlV2l0aDpmdW5jdGlvbihkKXt2YXIgZT10aGlzO2lm KGQubm9kZVR5cGV8fGQuZG9tfHx0eXBlb2YgZD09InN0cmluZyIpe2Q9YyhkKTtl LmRvbS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkLGUuZG9tKX1lbHNle2Q9Yi5p bnNlcnRCZWZvcmUoZS5kb20sZCl9ZGVsZXRlIEV4dC5lbENhY2hlW2UuaWRdO0V4 dC5yZW1vdmVOb2RlKGUuZG9tKTtlLmlkPUV4dC5pZChlLmRvbT1kKTtFeHQuRWxl bWVudC5hZGRUb0NhY2hlKGUuaXNGbHl3ZWlnaHQ/bmV3IEV4dC5FbGVtZW50KGUu ZG9tKTplKTtyZXR1cm4gZX0sY3JlYXRlQ2hpbGQ6ZnVuY3Rpb24oZSxkLGcpe2U9 ZXx8e3RhZzoiZGl2In07cmV0dXJuIGQ/Yi5pbnNlcnRCZWZvcmUoZCxlLGchPT10 cnVlKTpiWyF0aGlzLmRvbS5maXJzdENoaWxkPyJvdmVyd3JpdGUiOiJhcHBlbmQi XSh0aGlzLmRvbSxlLGchPT10cnVlKX0sd3JhcDpmdW5jdGlvbihkLGUpe3ZhciBn PWIuaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLGR8fHt0YWc6ImRpdiJ9LCFlKTtnLmRv bT9nLmRvbS5hcHBlbmRDaGlsZCh0aGlzLmRvbSk6Zy5hcHBlbmRDaGlsZCh0aGlz LmRvbSk7cmV0dXJuIGd9LGluc2VydEh0bWw6ZnVuY3Rpb24oZSxnLGQpe3ZhciBo PWIuaW5zZXJ0SHRtbChlLHRoaXMuZG9tLGcpO3JldHVybiBkP0V4dC5nZXQoaCk6 aH19fSgpKTtFeHQuRWxlbWVudC5hZGRNZXRob2RzKGZ1bmN0aW9uKCl7dmFyIEE9 RXh0LnN1cHBvcnRzLGg9e30seD0vKC1bYS16XSkvZ2kscz1kb2N1bWVudC5kZWZh dWx0VmlldyxEPS9hbHBoYVwob3BhY2l0eT0oLiopXCkvaSxsPS9eXHMrfFxzKyQv ZyxCPUV4dC5FbGVtZW50LHU9L1xzKy8sYj0vXHcvZyxkPSJwYWRkaW5nIixjPSJt YXJnaW4iLHk9ImJvcmRlciIsdD0iLWxlZnQiLHE9Ii1yaWdodCIsdz0iLXRvcCIs bz0iLWJvdHRvbSIsaj0iLXdpZHRoIixyPU1hdGgsej0iaGlkZGVuIixlPSJpc0Ns aXBwZWQiLGs9Im92ZXJmbG93IixuPSJvdmVyZmxvdy14IixtPSJvdmVyZmxvdy15 IixDPSJvcmlnaW5hbENsaXAiLGk9e2w6eSt0K2oscjp5K3Eraix0OnkrdytqLGI6 eStvK2p9LGc9e2w6ZCt0LHI6ZCtxLHQ6ZCt3LGI6ZCtvfSxhPXtsOmMrdCxyOmMr cSx0OmMrdyxiOmMrb30sRT1FeHQuRWxlbWVudC5kYXRhO2Z1bmN0aW9uIHAoRixH KXtyZXR1cm4gRy5jaGFyQXQoMSkudG9VcHBlckNhc2UoKX1mdW5jdGlvbiB2KEYp e3JldHVybiBoW0ZdfHwoaFtGXT1GPT0iZmxvYXQiPyhBLmNzc0Zsb2F0PyJjc3NG bG9hdCI6InN0eWxlRmxvYXQiKTpGLnJlcGxhY2UoeCxwKSl9cmV0dXJue2FkanVz dFdpZHRoOmZ1bmN0aW9uKEYpe3ZhciBHPXRoaXM7dmFyIEg9KHR5cGVvZiBGPT0i bnVtYmVyIik7aWYoSCYmRy5hdXRvQm94QWRqdXN0JiYhRy5pc0JvcmRlckJveCgp KXtGLT0oRy5nZXRCb3JkZXJXaWR0aCgibHIiKStHLmdldFBhZGRpbmcoImxyIikp fXJldHVybihIJiZGPDApPzA6Rn0sYWRqdXN0SGVpZ2h0OmZ1bmN0aW9uKEYpe3Zh ciBHPXRoaXM7dmFyIEg9KHR5cGVvZiBGPT0ibnVtYmVyIik7aWYoSCYmRy5hdXRv Qm94QWRqdXN0JiYhRy5pc0JvcmRlckJveCgpKXtGLT0oRy5nZXRCb3JkZXJXaWR0 aCgidGIiKStHLmdldFBhZGRpbmcoInRiIikpfXJldHVybihIJiZGPDApPzA6Rn0s YWRkQ2xhc3M6ZnVuY3Rpb24oSil7dmFyIEs9dGhpcyxJLEYsSCxHPVtdO2lmKCFF eHQuaXNBcnJheShKKSl7aWYodHlwZW9mIEo9PSJzdHJpbmciJiYhdGhpcy5oYXND bGFzcyhKKSl7Sy5kb20uY2xhc3NOYW1lKz0iICIrSn19ZWxzZXtmb3IoST0wLEY9 Si5sZW5ndGg7STxGO0krKyl7SD1KW0ldO2lmKHR5cGVvZiBIPT0ic3RyaW5nIiYm KCIgIitLLmRvbS5jbGFzc05hbWUrIiAiKS5pbmRleE9mKCIgIitIKyIgIik9PS0x KXtHLnB1c2goSCl9fWlmKEcubGVuZ3RoKXtLLmRvbS5jbGFzc05hbWUrPSIgIitH LmpvaW4oIiAiKX19cmV0dXJuIEt9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKEspe3Zh ciBMPXRoaXMsSixHLEYsSSxIO2lmKCFFeHQuaXNBcnJheShLKSl7Sz1bS119aWYo TC5kb20mJkwuZG9tLmNsYXNzTmFtZSl7SD1MLmRvbS5jbGFzc05hbWUucmVwbGFj ZShsLCIiKS5zcGxpdCh1KTtmb3IoSj0wLEY9Sy5sZW5ndGg7SjxGO0orKyl7ST1L W0pdO2lmKHR5cGVvZiBJPT0ic3RyaW5nIil7ST1JLnJlcGxhY2UobCwiIik7Rz1I LmluZGV4T2YoSSk7aWYoRyE9LTEpe0guc3BsaWNlKEcsMSl9fX1MLmRvbS5jbGFz c05hbWU9SC5qb2luKCIgIil9cmV0dXJuIEx9LHJhZGlvQ2xhc3M6ZnVuY3Rpb24o SSl7dmFyIEo9dGhpcy5kb20ucGFyZW50Tm9kZS5jaGlsZE5vZGVzLEcsSCxGO0k9 RXh0LmlzQXJyYXkoSSk/STpbSV07Zm9yKEg9MCxGPUoubGVuZ3RoO0g8RjtIKysp e0c9SltIXTtpZihHJiZHLm5vZGVUeXBlPT0xKXtFeHQuZmx5KEcsIl9pbnRlcm5h bCIpLnJlbW92ZUNsYXNzKEkpfX1yZXR1cm4gdGhpcy5hZGRDbGFzcyhJKX0sdG9n Z2xlQ2xhc3M6ZnVuY3Rpb24oRil7cmV0dXJuIHRoaXMuaGFzQ2xhc3MoRik/dGhp cy5yZW1vdmVDbGFzcyhGKTp0aGlzLmFkZENsYXNzKEYpfSxoYXNDbGFzczpmdW5j dGlvbihGKXtyZXR1cm4gRiYmKCIgIit0aGlzLmRvbS5jbGFzc05hbWUrIiAiKS5p bmRleE9mKCIgIitGKyIgIikhPS0xfSxyZXBsYWNlQ2xhc3M6ZnVuY3Rpb24oRyxG KXtyZXR1cm4gdGhpcy5yZW1vdmVDbGFzcyhHKS5hZGRDbGFzcyhGKX0saXNTdHls ZTpmdW5jdGlvbihGLEcpe3JldHVybiB0aGlzLmdldFN0eWxlKEYpPT1HfSxnZXRT dHlsZTpmdW5jdGlvbigpe3JldHVybiBzJiZzLmdldENvbXB1dGVkU3R5bGU/ZnVu Y3Rpb24oSyl7dmFyIEk9dGhpcy5kb20sRixILEcsSjtpZihJPT1kb2N1bWVudCl7 cmV0dXJuIG51bGx9Sz12KEspO0c9KEY9SS5zdHlsZVtLXSk/RjooSD1zLmdldENv bXB1dGVkU3R5bGUoSSwiIikpP0hbS106bnVsbDtpZihLPT0ibWFyZ2luUmlnaHQi JiZHIT0iMHB4IiYmIUEuY29ycmVjdFJpZ2h0TWFyZ2luKXtKPUkuc3R5bGUuZGlz cGxheTtJLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI7Rz1zLmdldENvbXB1 dGVkU3R5bGUoSSwiIikubWFyZ2luUmlnaHQ7SS5zdHlsZS5kaXNwbGF5PUp9aWYo Sz09ImJhY2tncm91bmRDb2xvciImJkc9PSJyZ2JhKDAsIDAsIDAsIDApIiYmIUEu Y29ycmVjdFRyYW5zcGFyZW50Q29sb3Ipe0c9InRyYW5zcGFyZW50In1yZXR1cm4g R306ZnVuY3Rpb24oSil7dmFyIEg9dGhpcy5kb20sRixHO2lmKEg9PWRvY3VtZW50 KXtyZXR1cm4gbnVsbH1pZihKPT0ib3BhY2l0eSIpe2lmKEguc3R5bGUuZmlsdGVy Lm1hdGNoKXtpZihGPUguc3R5bGUuZmlsdGVyLm1hdGNoKEQpKXt2YXIgST1wYXJz ZUZsb2F0KEZbMV0pO2lmKCFpc05hTihJKSl7cmV0dXJuIEk/SS8xMDA6MH19fXJl dHVybiAxfUo9dihKKTtyZXR1cm4gSC5zdHlsZVtKXXx8KChHPUguY3VycmVudFN0 eWxlKT9HW0pdOm51bGwpfX0oKSxnZXRDb2xvcjpmdW5jdGlvbihGLEcsSyl7dmFy IEk9dGhpcy5nZXRTdHlsZShGKSxIPSh0eXBlb2YgSyE9InVuZGVmaW5lZCIpP0s6 IiMiLEo7aWYoIUl8fCgvdHJhbnNwYXJlbnR8aW5oZXJpdC8udGVzdChJKSkpe3Jl dHVybiBHfWlmKC9eci8udGVzdChJKSl7RXh0LmVhY2goSS5zbGljZSg0LEkubGVu Z3RoLTEpLnNwbGl0KCIsIiksZnVuY3Rpb24oTCl7Sj1wYXJzZUludChMLDEwKTtI Kz0oSjwxNj8iMCI6IiIpK0oudG9TdHJpbmcoMTYpfSl9ZWxzZXtJPUkucmVwbGFj ZSgiIyIsIiIpO0grPUkubGVuZ3RoPT0zP0kucmVwbGFjZSgvXihcdykoXHcpKFx3 KSQvLCIkMSQxJDIkMiQzJDMiKTpJfXJldHVybihILmxlbmd0aD41P0gudG9Mb3dl ckNhc2UoKTpHKX0sc2V0U3R5bGU6ZnVuY3Rpb24oSSxIKXt2YXIgRixHO2lmKHR5 cGVvZiBJIT0ib2JqZWN0Iil7Rj17fTtGW0ldPUg7ST1GfWZvcihHIGluIEkpe0g9 SVtHXTtHPT0ib3BhY2l0eSI/dGhpcy5zZXRPcGFjaXR5KEgpOnRoaXMuZG9tLnN0 eWxlW3YoRyldPUh9cmV0dXJuIHRoaXN9LHNldE9wYWNpdHk6ZnVuY3Rpb24oRyxG KXt2YXIgSj10aGlzLEg9Si5kb20uc3R5bGU7aWYoIUZ8fCFKLmFuaW0pe2lmKEV4 dC5pc0lFKXt2YXIgST1HPDE/ImFscGhhKG9wYWNpdHk9IitHKjEwMCsiKSI6IiIs Sz1ILmZpbHRlci5yZXBsYWNlKEQsIiIpLnJlcGxhY2UobCwiIik7SC56b29tPTE7 SC5maWx0ZXI9SysoSy5sZW5ndGg+MD8iICI6IiIpK0l9ZWxzZXtILm9wYWNpdHk9 R319ZWxzZXtKLmFuaW0oe29wYWNpdHk6e3RvOkd9fSxKLnByZWFuaW0oYXJndW1l bnRzLDEpLG51bGwsMC4zNSwiZWFzZUluIil9cmV0dXJuIEp9LGNsZWFyT3BhY2l0 eTpmdW5jdGlvbigpe3ZhciBGPXRoaXMuZG9tLnN0eWxlO2lmKEV4dC5pc0lFKXtp ZighRXh0LmlzRW1wdHkoRi5maWx0ZXIpKXtGLmZpbHRlcj1GLmZpbHRlci5yZXBs YWNlKEQsIiIpLnJlcGxhY2UobCwiIil9fWVsc2V7Ri5vcGFjaXR5PUZbIi1tb3ot b3BhY2l0eSJdPUZbIi1raHRtbC1vcGFjaXR5Il09IiJ9cmV0dXJuIHRoaXN9LGdl dEhlaWdodDpmdW5jdGlvbihIKXt2YXIgRz10aGlzLEo9Ry5kb20sST1FeHQuaXNJ RSYmRy5pc1N0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLEY9ci5tYXgoSi5vZmZzZXRI ZWlnaHQsST8wOkouY2xpZW50SGVpZ2h0KXx8MDtGPSFIP0Y6Ri1HLmdldEJvcmRl cldpZHRoKCJ0YiIpLUcuZ2V0UGFkZGluZygidGIiKTtyZXR1cm4gRjwwPzA6Rn0s Z2V0V2lkdGg6ZnVuY3Rpb24oRyl7dmFyIEg9dGhpcyxKPUguZG9tLEk9RXh0Lmlz SUUmJkguaXNTdHlsZSgiZGlzcGxheSIsIm5vbmUiKSxGPXIubWF4KEoub2Zmc2V0 V2lkdGgsST8wOkouY2xpZW50V2lkdGgpfHwwO0Y9IUc/RjpGLUguZ2V0Qm9yZGVy V2lkdGgoImxyIiktSC5nZXRQYWRkaW5nKCJsciIpO3JldHVybiBGPDA/MDpGfSxz ZXRXaWR0aDpmdW5jdGlvbihHLEYpe3ZhciBIPXRoaXM7Rz1ILmFkanVzdFdpZHRo KEcpOyFGfHwhSC5hbmltP0guZG9tLnN0eWxlLndpZHRoPUguYWRkVW5pdHMoRyk6 SC5hbmltKHt3aWR0aDp7dG86R319LEgucHJlYW5pbShhcmd1bWVudHMsMSkpO3Jl dHVybiBIfSxzZXRIZWlnaHQ6ZnVuY3Rpb24oRixHKXt2YXIgSD10aGlzO0Y9SC5h ZGp1c3RIZWlnaHQoRik7IUd8fCFILmFuaW0/SC5kb20uc3R5bGUuaGVpZ2h0PUgu YWRkVW5pdHMoRik6SC5hbmltKHtoZWlnaHQ6e3RvOkZ9fSxILnByZWFuaW0oYXJn dW1lbnRzLDEpKTtyZXR1cm4gSH0sZ2V0Qm9yZGVyV2lkdGg6ZnVuY3Rpb24oRil7 cmV0dXJuIHRoaXMuYWRkU3R5bGVzKEYsaSl9LGdldFBhZGRpbmc6ZnVuY3Rpb24o Ril7cmV0dXJuIHRoaXMuYWRkU3R5bGVzKEYsZyl9LGNsaXA6ZnVuY3Rpb24oKXt2 YXIgRj10aGlzLEc9Ri5kb207aWYoIUUoRyxlKSl7RShHLGUsdHJ1ZSk7RShHLEMs e286Ri5nZXRTdHlsZShrKSx4OkYuZ2V0U3R5bGUobikseTpGLmdldFN0eWxlKG0p fSk7Ri5zZXRTdHlsZShrLHopO0Yuc2V0U3R5bGUobix6KTtGLnNldFN0eWxlKG0s eil9cmV0dXJuIEZ9LHVuY2xpcDpmdW5jdGlvbigpe3ZhciBGPXRoaXMsSD1GLmRv bTtpZihFKEgsZSkpe0UoSCxlLGZhbHNlKTt2YXIgRz1FKEgsQyk7aWYoRy5vKXtG LnNldFN0eWxlKGssRy5vKX1pZihHLngpe0Yuc2V0U3R5bGUobixHLngpfWlmKEcu eSl7Ri5zZXRTdHlsZShtLEcueSl9fXJldHVybiBGfSxhZGRTdHlsZXM6ZnVuY3Rp b24oTSxMKXt2YXIgSj0wLEs9TS5tYXRjaChiKSxJLEgsRyxGPUsubGVuZ3RoO2Zv cihHPTA7RzxGO0crKyl7ST1LW0ddO0g9SSYmcGFyc2VJbnQodGhpcy5nZXRTdHls ZShMW0ldKSwxMCk7aWYoSCl7Sis9ci5hYnMoSCl9fXJldHVybiBKfSxtYXJnaW5z OmF9fSgpKTsoZnVuY3Rpb24oKXt2YXIgYT1FeHQubGliLkRvbSxiPSJsZWZ0Iixn PSJyaWdodCIsZD0idG9wIixpPSJib3R0b20iLGg9InBvc2l0aW9uIixjPSJzdGF0 aWMiLGU9InJlbGF0aXZlIixqPSJhdXRvIixrPSJ6LWluZGV4IjtFeHQuRWxlbWVu dC5hZGRNZXRob2RzKHtnZXRYOmZ1bmN0aW9uKCl7cmV0dXJuIGEuZ2V0WCh0aGlz LmRvbSl9LGdldFk6ZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXRZKHRoaXMuZG9tKX0s Z2V0WFk6ZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXRYWSh0aGlzLmRvbSl9LGdldE9m ZnNldHNUbzpmdW5jdGlvbihsKXt2YXIgbj10aGlzLmdldFhZKCksbT1FeHQuZmx5 KGwsIl9pbnRlcm5hbCIpLmdldFhZKCk7cmV0dXJuW25bMF0tbVswXSxuWzFdLW1b MV1dfSxzZXRYOmZ1bmN0aW9uKGwsbSl7cmV0dXJuIHRoaXMuc2V0WFkoW2wsdGhp cy5nZXRZKCldLHRoaXMuYW5pbVRlc3QoYXJndW1lbnRzLG0sMSkpfSxzZXRZOmZ1 bmN0aW9uKG0sbCl7cmV0dXJuIHRoaXMuc2V0WFkoW3RoaXMuZ2V0WCgpLG1dLHRo aXMuYW5pbVRlc3QoYXJndW1lbnRzLGwsMSkpfSxzZXRMZWZ0OmZ1bmN0aW9uKGwp e3RoaXMuc2V0U3R5bGUoYix0aGlzLmFkZFVuaXRzKGwpKTtyZXR1cm4gdGhpc30s c2V0VG9wOmZ1bmN0aW9uKGwpe3RoaXMuc2V0U3R5bGUoZCx0aGlzLmFkZFVuaXRz KGwpKTtyZXR1cm4gdGhpc30sc2V0UmlnaHQ6ZnVuY3Rpb24obCl7dGhpcy5zZXRT dHlsZShnLHRoaXMuYWRkVW5pdHMobCkpO3JldHVybiB0aGlzfSxzZXRCb3R0b206 ZnVuY3Rpb24obCl7dGhpcy5zZXRTdHlsZShpLHRoaXMuYWRkVW5pdHMobCkpO3Jl dHVybiB0aGlzfSxzZXRYWTpmdW5jdGlvbihuLGwpe3ZhciBtPXRoaXM7aWYoIWx8 fCFtLmFuaW0pe2Euc2V0WFkobS5kb20sbil9ZWxzZXttLmFuaW0oe3BvaW50czp7 dG86bn19LG0ucHJlYW5pbShhcmd1bWVudHMsMSksIm1vdGlvbiIpfXJldHVybiBt fSxzZXRMb2NhdGlvbjpmdW5jdGlvbihsLG4sbSl7cmV0dXJuIHRoaXMuc2V0WFko W2wsbl0sdGhpcy5hbmltVGVzdChhcmd1bWVudHMsbSwyKSl9LG1vdmVUbzpmdW5j dGlvbihsLG4sbSl7cmV0dXJuIHRoaXMuc2V0WFkoW2wsbl0sdGhpcy5hbmltVGVz dChhcmd1bWVudHMsbSwyKSl9LGdldExlZnQ6ZnVuY3Rpb24obCl7cmV0dXJuICFs P3RoaXMuZ2V0WCgpOnBhcnNlSW50KHRoaXMuZ2V0U3R5bGUoYiksMTApfHwwfSxn ZXRSaWdodDpmdW5jdGlvbihsKXt2YXIgbT10aGlzO3JldHVybiAhbD9tLmdldFgo KSttLmdldFdpZHRoKCk6KG0uZ2V0TGVmdCh0cnVlKSttLmdldFdpZHRoKCkpfHww fSxnZXRUb3A6ZnVuY3Rpb24obCl7cmV0dXJuICFsP3RoaXMuZ2V0WSgpOnBhcnNl SW50KHRoaXMuZ2V0U3R5bGUoZCksMTApfHwwfSxnZXRCb3R0b206ZnVuY3Rpb24o bCl7dmFyIG09dGhpcztyZXR1cm4gIWw/bS5nZXRZKCkrbS5nZXRIZWlnaHQoKToo bS5nZXRUb3AodHJ1ZSkrbS5nZXRIZWlnaHQoKSl8fDB9LHBvc2l0aW9uOmZ1bmN0 aW9uKHAsbyxsLG4pe3ZhciBtPXRoaXM7aWYoIXAmJm0uaXNTdHlsZShoLGMpKXtt LnNldFN0eWxlKGgsZSl9ZWxzZXtpZihwKXttLnNldFN0eWxlKGgscCl9fWlmKG8p e20uc2V0U3R5bGUoayxvKX1pZihsfHxuKXttLnNldFhZKFtsfHxmYWxzZSxufHxm YWxzZV0pfX0sY2xlYXJQb3NpdGlvbmluZzpmdW5jdGlvbihsKXtsPWx8fCIiO3Ro aXMuc2V0U3R5bGUoe2xlZnQ6bCxyaWdodDpsLHRvcDpsLGJvdHRvbTpsLCJ6LWlu ZGV4IjoiIixwb3NpdGlvbjpjfSk7cmV0dXJuIHRoaXN9LGdldFBvc2l0aW9uaW5n OmZ1bmN0aW9uKCl7dmFyIG09dGhpcy5nZXRTdHlsZShiKTt2YXIgbj10aGlzLmdl dFN0eWxlKGQpO3JldHVybntwb3NpdGlvbjp0aGlzLmdldFN0eWxlKGgpLGxlZnQ6 bSxyaWdodDptPyIiOnRoaXMuZ2V0U3R5bGUoZyksdG9wOm4sYm90dG9tOm4/IiI6 dGhpcy5nZXRTdHlsZShpKSwiei1pbmRleCI6dGhpcy5nZXRTdHlsZShrKX19LHNl dFBvc2l0aW9uaW5nOmZ1bmN0aW9uKGwpe3ZhciBuPXRoaXMsbT1uLmRvbS5zdHls ZTtuLnNldFN0eWxlKGwpO2lmKGwucmlnaHQ9PWope20ucmlnaHQ9IiJ9aWYobC5i b3R0b209PWope20uYm90dG9tPSIifXJldHVybiBufSx0cmFuc2xhdGVQb2ludHM6 ZnVuY3Rpb24obSx1KXt1PWlzTmFOKG1bMV0pP3U6bVsxXTttPWlzTmFOKG1bMF0p P206bVswXTt2YXIgcT10aGlzLHI9cS5pc1N0eWxlKGgsZSkscz1xLmdldFhZKCks bj1wYXJzZUludChxLmdldFN0eWxlKGIpLDEwKSxwPXBhcnNlSW50KHEuZ2V0U3R5 bGUoZCksMTApO249IWlzTmFOKG4pP246KHI/MDpxLmRvbS5vZmZzZXRMZWZ0KTtw PSFpc05hTihwKT9wOihyPzA6cS5kb20ub2Zmc2V0VG9wKTtyZXR1cm57bGVmdDoo bS1zWzBdK24pLHRvcDoodS1zWzFdK3ApfX0sYW5pbVRlc3Q6ZnVuY3Rpb24obSxs LG4pe3JldHVybiAhIWwmJnRoaXMucHJlYW5pbT90aGlzLnByZWFuaW0obSxuKTpm YWxzZX19KX0pKCk7RXh0LkVsZW1lbnQuYWRkTWV0aG9kcyh7aXNTY3JvbGxhYmxl OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kb207cmV0dXJuIGEuc2Nyb2xsSGVpZ2h0 PmEuY2xpZW50SGVpZ2h0fHxhLnNjcm9sbFdpZHRoPmEuY2xpZW50V2lkdGh9LHNj cm9sbFRvOmZ1bmN0aW9uKGEsYil7dGhpcy5kb21bInNjcm9sbCIrKC90b3AvaS50 ZXN0KGEpPyJUb3AiOiJMZWZ0IildPWI7cmV0dXJuIHRoaXN9LGdldFNjcm9sbDpm dW5jdGlvbigpe3ZhciBpPXRoaXMuZG9tLGg9ZG9jdW1lbnQsYT1oLmJvZHksYz1o LmRvY3VtZW50RWxlbWVudCxiLGcsZTtpZihpPT1ofHxpPT1hKXtpZihFeHQuaXNJ RSYmRXh0LmlzU3RyaWN0KXtiPWMuc2Nyb2xsTGVmdDtnPWMuc2Nyb2xsVG9wfWVs c2V7Yj13aW5kb3cucGFnZVhPZmZzZXQ7Zz13aW5kb3cucGFnZVlPZmZzZXR9ZT17 bGVmdDpifHwoYT9hLnNjcm9sbExlZnQ6MCksdG9wOmd8fChhP2Euc2Nyb2xsVG9w OjApfX1lbHNle2U9e2xlZnQ6aS5zY3JvbGxMZWZ0LHRvcDppLnNjcm9sbFRvcH19 cmV0dXJuIGV9fSk7RXh0LkVsZW1lbnQuVklTSUJJTElUWT0xO0V4dC5FbGVtZW50 LkRJU1BMQVk9MjtFeHQuRWxlbWVudC5PRkZTRVRTPTM7RXh0LkVsZW1lbnQuQVND TEFTUz00O0V4dC5FbGVtZW50LnZpc2liaWxpdHlDbHM9IngtaGlkZS1ub3NpemUi O0V4dC5FbGVtZW50LmFkZE1ldGhvZHMoZnVuY3Rpb24oKXt2YXIgZT1FeHQuRWxl bWVudCxwPSJvcGFjaXR5IixqPSJ2aXNpYmlsaXR5IixnPSJkaXNwbGF5IixkPSJo aWRkZW4iLG49Im9mZnNldHMiLGs9ImFzY2xhc3MiLG09Im5vbmUiLGE9Im5vc2l6 ZSIsYj0ib3JpZ2luYWxEaXNwbGF5IixjPSJ2aXNpYmlsaXR5TW9kZSIsaD0iaXNW aXNpYmxlIixpPWUuZGF0YSxsPWZ1bmN0aW9uKHIpe3ZhciBxPWkocixiKTtpZihx PT09dW5kZWZpbmVkKXtpKHIsYixxPSIiKX1yZXR1cm4gcX0sbz1mdW5jdGlvbihy KXt2YXIgcT1pKHIsYyk7aWYocT09PXVuZGVmaW5lZCl7aShyLGMscT0xKX1yZXR1 cm4gcX07cmV0dXJue29yaWdpbmFsRGlzcGxheToiIix2aXNpYmlsaXR5TW9kZTox LHNldFZpc2liaWxpdHlNb2RlOmZ1bmN0aW9uKHEpe2kodGhpcy5kb20sYyxxKTty ZXR1cm4gdGhpc30sYW5pbWF0ZTpmdW5jdGlvbihyLHQscyx1LHEpe3RoaXMuYW5p bShyLHtkdXJhdGlvbjp0LGNhbGxiYWNrOnMsZWFzaW5nOnV9LHEpO3JldHVybiB0 aGlzfSxhbmltOmZ1bmN0aW9uKHQsdSxyLHcscyxxKXtyPXJ8fCJydW4iO3U9dXx8 e307dmFyIHY9dGhpcyx4PUV4dC5saWIuQW5pbVtyXSh2LmRvbSx0LCh1LmR1cmF0 aW9ufHx3KXx8MC4zNSwodS5lYXNpbmd8fHMpfHwiZWFzZU91dCIsZnVuY3Rpb24o KXtpZihxKXtxLmNhbGwodil9aWYodS5jYWxsYmFjayl7dS5jYWxsYmFjay5jYWxs KHUuc2NvcGV8fHYsdix1KX19LHYpO3UuYW5pbT14O3JldHVybiB4fSxwcmVhbmlt OmZ1bmN0aW9uKHEscil7cmV0dXJuICFxW3JdP2ZhbHNlOih0eXBlb2YgcVtyXT09 Im9iamVjdCI/cVtyXTp7ZHVyYXRpb246cVtyKzFdLGNhbGxiYWNrOnFbcisyXSxl YXNpbmc6cVtyKzNdfSl9LGlzVmlzaWJsZTpmdW5jdGlvbigpe3ZhciBxPXRoaXMs cz1xLmRvbSxyPWkocyxoKTtpZih0eXBlb2Ygcj09ImJvb2xlYW4iKXtyZXR1cm4g cn1yPSFxLmlzU3R5bGUoaixkKSYmIXEuaXNTdHlsZShnLG0pJiYhKChvKHMpPT1l LkFTQ0xBU1MpJiZxLmhhc0NsYXNzKHEudmlzaWJpbGl0eUNsc3x8ZS52aXNpYmls aXR5Q2xzKSk7aShzLGgscik7cmV0dXJuIHJ9LHNldFZpc2libGU6ZnVuY3Rpb24o dCxxKXt2YXIgdz10aGlzLHIseSx4LHYsdT13LmRvbSxzPW8odSk7aWYodHlwZW9m IHE9PSJzdHJpbmciKXtzd2l0Y2gocSl7Y2FzZSBnOnM9ZS5ESVNQTEFZO2JyZWFr O2Nhc2UgajpzPWUuVklTSUJJTElUWTticmVhaztjYXNlIG46cz1lLk9GRlNFVFM7 YnJlYWs7Y2FzZSBhOmNhc2UgazpzPWUuQVNDTEFTUzticmVha313LnNldFZpc2li aWxpdHlNb2RlKHMpO3E9ZmFsc2V9aWYoIXF8fCF3LmFuaW0pe2lmKHM9PWUuQVND TEFTUyl7d1t0PyJyZW1vdmVDbGFzcyI6ImFkZENsYXNzIl0ody52aXNpYmlsaXR5 Q2xzfHxlLnZpc2liaWxpdHlDbHMpfWVsc2V7aWYocz09ZS5ESVNQTEFZKXtyZXR1 cm4gdy5zZXREaXNwbGF5ZWQodCl9ZWxzZXtpZihzPT1lLk9GRlNFVFMpe2lmKCF0 KXt3LmhpZGVNb2RlU3R5bGVzPXtwb3NpdGlvbjp3LmdldFN0eWxlKCJwb3NpdGlv biIpLHRvcDp3LmdldFN0eWxlKCJ0b3AiKSxsZWZ0OncuZ2V0U3R5bGUoImxlZnQi KX07dy5hcHBseVN0eWxlcyh7cG9zaXRpb246ImFic29sdXRlIix0b3A6Ii0xMDAw MHB4IixsZWZ0OiItMTAwMDBweCJ9KX1lbHNle3cuYXBwbHlTdHlsZXMody5oaWRl TW9kZVN0eWxlc3x8e3Bvc2l0aW9uOiIiLHRvcDoiIixsZWZ0OiIifSk7ZGVsZXRl IHcuaGlkZU1vZGVTdHlsZXN9fWVsc2V7dy5maXhEaXNwbGF5KCk7dS5zdHlsZS52 aXNpYmlsaXR5PXQ/InZpc2libGUiOmR9fX19ZWxzZXtpZih0KXt3LnNldE9wYWNp dHkoMC4wMSk7dy5zZXRWaXNpYmxlKHRydWUpfXcuYW5pbSh7b3BhY2l0eTp7dG86 KHQ/MTowKX19LHcucHJlYW5pbShhcmd1bWVudHMsMSksbnVsbCwwLjM1LCJlYXNl SW4iLGZ1bmN0aW9uKCl7dHx8dy5zZXRWaXNpYmxlKGZhbHNlKS5zZXRPcGFjaXR5 KDEpfSl9aSh1LGgsdCk7cmV0dXJuIHd9LGhhc01ldHJpY3M6ZnVuY3Rpb24oKXt2 YXIgcT10aGlzLmRvbTtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKXx8KG8ocSk9PWUu VklTSUJJTElUWSl9LHRvZ2dsZTpmdW5jdGlvbihxKXt2YXIgcj10aGlzO3Iuc2V0 VmlzaWJsZSghci5pc1Zpc2libGUoKSxyLnByZWFuaW0oYXJndW1lbnRzLDApKTty ZXR1cm4gcn0sc2V0RGlzcGxheWVkOmZ1bmN0aW9uKHEpe2lmKHR5cGVvZiBxPT0i Ym9vbGVhbiIpe3E9cT9sKHRoaXMuZG9tKTptfXRoaXMuc2V0U3R5bGUoZyxxKTty ZXR1cm4gdGhpc30sZml4RGlzcGxheTpmdW5jdGlvbigpe3ZhciBxPXRoaXM7aWYo cS5pc1N0eWxlKGcsbSkpe3Euc2V0U3R5bGUoaixkKTtxLnNldFN0eWxlKGcsbCh0 aGlzLmRvbSkpO2lmKHEuaXNTdHlsZShnLG0pKXtxLnNldFN0eWxlKGcsImJsb2Nr Iil9fX0saGlkZTpmdW5jdGlvbihxKXtpZih0eXBlb2YgcT09InN0cmluZyIpe3Ro aXMuc2V0VmlzaWJsZShmYWxzZSxxKTtyZXR1cm4gdGhpc310aGlzLnNldFZpc2li bGUoZmFsc2UsdGhpcy5wcmVhbmltKGFyZ3VtZW50cywwKSk7cmV0dXJuIHRoaXN9 LHNob3c6ZnVuY3Rpb24ocSl7aWYodHlwZW9mIHE9PSJzdHJpbmciKXt0aGlzLnNl dFZpc2libGUodHJ1ZSxxKTtyZXR1cm4gdGhpc310aGlzLnNldFZpc2libGUodHJ1 ZSx0aGlzLnByZWFuaW0oYXJndW1lbnRzLDApKTtyZXR1cm4gdGhpc319fSgpKTso ZnVuY3Rpb24oKXt2YXIgeT1udWxsLEE9dW5kZWZpbmVkLGs9dHJ1ZSx0PWZhbHNl LGo9InNldFgiLGg9InNldFkiLGE9InNldFhZIixuPSJsZWZ0IixsPSJib3R0b20i LHM9InRvcCIsbT0icmlnaHQiLHE9ImhlaWdodCIsZz0id2lkdGgiLGk9InBvaW50 cyIsdz0iaGlkZGVuIix6PSJhYnNvbHV0ZSIsdT0idmlzaWJsZSIsZT0ibW90aW9u IixvPSJwb3NpdGlvbiIscj0iZWFzZU91dCIsZD1uZXcgRXh0LkVsZW1lbnQuRmx5 d2VpZ2h0KCksdj17fSx4PWZ1bmN0aW9uKEIpe3JldHVybiBCfHx7fX0scD1mdW5j dGlvbihCKXtkLmRvbT1CO2QuaWQ9RXh0LmlkKEIpO3JldHVybiBkfSxjPWZ1bmN0 aW9uKEIpe2lmKCF2W0JdKXt2W0JdPVtdfXJldHVybiB2W0JdfSxiPWZ1bmN0aW9u KEMsQil7dltDXT1CfTtFeHQuZW5hYmxlRng9aztFeHQuRng9e3N3aXRjaFN0YXRl bWVudHM6ZnVuY3Rpb24oQyxELEIpe3JldHVybiBELmFwcGx5KHRoaXMsQltDXSl9 LHNsaWRlSW46ZnVuY3Rpb24oSCxFKXtFPXgoRSk7dmFyIEo9dGhpcyxHPUouZG9t LE09Ry5zdHlsZSxPLEIsTCxELEMsTSxJLE4sSyxGO0g9SHx8InQiO0oucXVldWVG eChFLGZ1bmN0aW9uKCl7Tz1wKEcpLmdldFhZKCk7cChHKS5maXhEaXNwbGF5KCk7 Qj1wKEcpLmdldEZ4UmVzdG9yZSgpO0w9e3g6T1swXSx5Ok9bMV0sMDpPWzBdLDE6 T1sxXSx3aWR0aDpHLm9mZnNldFdpZHRoLGhlaWdodDpHLm9mZnNldEhlaWdodH07 TC5yaWdodD1MLngrTC53aWR0aDtMLmJvdHRvbT1MLnkrTC5oZWlnaHQ7cChHKS5z ZXRXaWR0aChMLndpZHRoKS5zZXRIZWlnaHQoTC5oZWlnaHQpO0Q9cChHKS5meFdy YXAoQi5wb3MsRSx3KTtNLnZpc2liaWxpdHk9dTtNLnBvc2l0aW9uPXo7ZnVuY3Rp b24gUCgpe3AoRykuZnhVbndyYXAoRCxCLnBvcyxFKTtNLndpZHRoPUIud2lkdGg7 TS5oZWlnaHQ9Qi5oZWlnaHQ7cChHKS5hZnRlckZ4KEUpfU49e3RvOltMLngsTC55 XX07Sz17dG86TC53aWR0aH07Rj17dG86TC5oZWlnaHR9O2Z1bmN0aW9uIFEoVSxS LFYsUyxYLFosYWMsYWIsYWEsVyxUKXt2YXIgWT17fTtwKFUpLnNldFdpZHRoKFYp LnNldEhlaWdodChTKTtpZihwKFUpW1hdKXtwKFUpW1hdKFopfVJbYWNdPVJbYWJd PSIwIjtpZihhYSl7WS53aWR0aD1hYX1pZihXKXtZLmhlaWdodD1XfWlmKFQpe1ku cG9pbnRzPVR9cmV0dXJuIFl9ST1wKEcpLnN3aXRjaFN0YXRlbWVudHMoSC50b0xv d2VyQ2FzZSgpLFEse3Q6W0QsTSxMLndpZHRoLDAseSx5LG4sbCx5LEYseV0sbDpb RCxNLDAsTC5oZWlnaHQseSx5LG0scyxLLHkseV0scjpbRCxNLEwud2lkdGgsTC5o ZWlnaHQsaixMLnJpZ2h0LG4scyx5LHksTl0sYjpbRCxNLEwud2lkdGgsTC5oZWln aHQsaCxMLmJvdHRvbSxuLHMseSxGLE5dLHRsOltELE0sMCwwLHkseSxtLGwsSyxG LE5dLGJsOltELE0sMCwwLGgsTC55K0wuaGVpZ2h0LG0scyxLLEYsTl0sYnI6W0Qs TSwwLDAsYSxbTC5yaWdodCxMLmJvdHRvbV0sbixzLEssRixOXSx0cjpbRCxNLDAs MCxqLEwueCtMLndpZHRoLG4sbCxLLEYsTl19KTtNLnZpc2liaWxpdHk9dTtwKEQp LnNob3coKTthcmd1bWVudHMuY2FsbGVlLmFuaW09cChEKS5meGFuaW0oSSxFLGUs MC41LHIsUCl9KTtyZXR1cm4gSn0sc2xpZGVPdXQ6ZnVuY3Rpb24oRixEKXtEPXgo RCk7dmFyIEg9dGhpcyxFPUguZG9tLEs9RS5zdHlsZSxMPUguZ2V0WFkoKSxDLEIs SSxKLEc9e3RvOjB9O0Y9Rnx8InQiO0gucXVldWVGeChELGZ1bmN0aW9uKCl7Qj1w KEUpLmdldEZ4UmVzdG9yZSgpO0k9e3g6TFswXSx5OkxbMV0sMDpMWzBdLDE6TFsx XSx3aWR0aDpFLm9mZnNldFdpZHRoLGhlaWdodDpFLm9mZnNldEhlaWdodH07SS5y aWdodD1JLngrSS53aWR0aDtJLmJvdHRvbT1JLnkrSS5oZWlnaHQ7cChFKS5zZXRX aWR0aChJLndpZHRoKS5zZXRIZWlnaHQoSS5oZWlnaHQpO0M9cChFKS5meFdyYXAo Qi5wb3MsRCx1KTtLLnZpc2liaWxpdHk9dTtLLnBvc2l0aW9uPXo7cChDKS5zZXRX aWR0aChJLndpZHRoKS5zZXRIZWlnaHQoSS5oZWlnaHQpO2Z1bmN0aW9uIE0oKXtE LnVzZURpc3BsYXk/cChFKS5zZXREaXNwbGF5ZWQodCk6cChFKS5oaWRlKCk7cChF KS5meFVud3JhcChDLEIucG9zLEQpO0sud2lkdGg9Qi53aWR0aDtLLmhlaWdodD1C LmhlaWdodDtwKEUpLmFmdGVyRngoRCl9ZnVuY3Rpb24gTihPLFcsVSxYLFMsVixS LFQsUSl7dmFyIFA9e307T1tXXT1PW1VdPSIwIjtQW1hdPVM7aWYoVil7UFtWXT1S fWlmKFQpe1BbVF09UX1yZXR1cm4gUH1KPXAoRSkuc3dpdGNoU3RhdGVtZW50cyhG LnRvTG93ZXJDYXNlKCksTix7dDpbSyxuLGwscSxHXSxsOltLLG0scyxnLEddLHI6 W0ssbixzLGcsRyxpLHt0bzpbSS5yaWdodCxJLnldfV0sYjpbSyxuLHMscSxHLGks e3RvOltJLngsSS5ib3R0b21dfV0sdGw6W0ssbSxsLGcsRyxxLEddLGJsOltLLG0s cyxnLEcscSxHLGkse3RvOltJLngsSS5ib3R0b21dfV0sYnI6W0ssbixzLGcsRyxx LEcsaSx7dG86W0kueCtJLndpZHRoLEkuYm90dG9tXX1dLHRyOltLLG4sbCxnLEcs cSxHLGkse3RvOltJLnJpZ2h0LEkueV19XX0pO2FyZ3VtZW50cy5jYWxsZWUuYW5p bT1wKEMpLmZ4YW5pbShKLEQsZSwwLjUscixNKX0pO3JldHVybiBIfSxwdWZmOmZ1 bmN0aW9uKEgpe0g9eChIKTt2YXIgRj10aGlzLEc9Ri5kb20sQz1HLnN0eWxlLEQs QixFO0YucXVldWVGeChILGZ1bmN0aW9uKCl7RD1wKEcpLmdldFdpZHRoKCk7Qj1w KEcpLmdldEhlaWdodCgpO3AoRykuY2xlYXJPcGFjaXR5KCk7cChHKS5zaG93KCk7 RT1wKEcpLmdldEZ4UmVzdG9yZSgpO2Z1bmN0aW9uIEkoKXtILnVzZURpc3BsYXk/ cChHKS5zZXREaXNwbGF5ZWQodCk6cChHKS5oaWRlKCk7cChHKS5jbGVhck9wYWNp dHkoKTtwKEcpLnNldFBvc2l0aW9uaW5nKEUucG9zKTtDLndpZHRoPUUud2lkdGg7 Qy5oZWlnaHQ9RS5oZWlnaHQ7Qy5mb250U2l6ZT0iIjtwKEcpLmFmdGVyRngoSCl9 YXJndW1lbnRzLmNhbGxlZS5hbmltPXAoRykuZnhhbmltKHt3aWR0aDp7dG86cChH KS5hZGp1c3RXaWR0aChEKjIpfSxoZWlnaHQ6e3RvOnAoRykuYWRqdXN0SGVpZ2h0 KEIqMil9LHBvaW50czp7Ynk6Wy1EKjAuNSwtQiowLjVdfSxvcGFjaXR5Ont0bzow fSxmb250U2l6ZTp7dG86MjAwLHVuaXQ6IiUifX0sSCxlLDAuNSxyLEkpfSk7cmV0 dXJuIEZ9LHN3aXRjaE9mZjpmdW5jdGlvbihGKXtGPXgoRik7dmFyIEQ9dGhpcyxF PUQuZG9tLEI9RS5zdHlsZSxDO0QucXVldWVGeChGLGZ1bmN0aW9uKCl7cChFKS5j bGVhck9wYWNpdHkoKTtwKEUpLmNsaXAoKTtDPXAoRSkuZ2V0RnhSZXN0b3JlKCk7 ZnVuY3Rpb24gRygpe0YudXNlRGlzcGxheT9wKEUpLnNldERpc3BsYXllZCh0KTpw KEUpLmhpZGUoKTtwKEUpLmNsZWFyT3BhY2l0eSgpO3AoRSkuc2V0UG9zaXRpb25p bmcoQy5wb3MpO0Iud2lkdGg9Qy53aWR0aDtCLmhlaWdodD1DLmhlaWdodDtwKEUp LmFmdGVyRngoRil9cChFKS5meGFuaW0oe29wYWNpdHk6e3RvOjAuM319LHkseSww LjEseSxmdW5jdGlvbigpe3AoRSkuY2xlYXJPcGFjaXR5KCk7KGZ1bmN0aW9uKCl7 cChFKS5meGFuaW0oe2hlaWdodDp7dG86MX0scG9pbnRzOntieTpbMCxwKEUpLmdl dEhlaWdodCgpKjAuNV19fSxGLGUsMC4zLCJlYXNlSW4iLEcpfSkuZGVmZXIoMTAw KX0pfSk7cmV0dXJuIER9LGhpZ2hsaWdodDpmdW5jdGlvbihELEgpe0g9eChIKTt2 YXIgRj10aGlzLEc9Ri5kb20sQj1ILmF0dHJ8fCJiYWNrZ3JvdW5kQ29sb3IiLEM9 e30sRTtGLnF1ZXVlRngoSCxmdW5jdGlvbigpe3AoRykuY2xlYXJPcGFjaXR5KCk7 cChHKS5zaG93KCk7ZnVuY3Rpb24gSSgpe0cuc3R5bGVbQl09RTtwKEcpLmFmdGVy RngoSCl9RT1HLnN0eWxlW0JdO0NbQl09e2Zyb206RHx8ImZmZmY5YyIsdG86SC5l bmRDb2xvcnx8cChHKS5nZXRDb2xvcihCKXx8ImZmZmZmZiJ9O2FyZ3VtZW50cy5j YWxsZWUuYW5pbT1wKEcpLmZ4YW5pbShDLEgsImNvbG9yIiwxLCJlYXNlSW4iLEkp fSk7cmV0dXJuIEZ9LGZyYW1lOmZ1bmN0aW9uKEIsRSxIKXtIPXgoSCk7dmFyIEQ9 dGhpcyxHPUQuZG9tLEMsRjtELnF1ZXVlRngoSCxmdW5jdGlvbigpe0I9Qnx8IiND M0RBRjkiO2lmKEIubGVuZ3RoPT02KXtCPSIjIitCfUU9RXx8MTtwKEcpLnNob3co KTt2YXIgTD1wKEcpLmdldFhZKCksSj17eDpMWzBdLHk6TFsxXSwwOkxbMF0sMTpM WzFdLHdpZHRoOkcub2Zmc2V0V2lkdGgsaGVpZ2h0Okcub2Zmc2V0SGVpZ2h0fSxJ PWZ1bmN0aW9uKCl7Qz1wKGRvY3VtZW50LmJvZHl8fGRvY3VtZW50LmRvY3VtZW50 RWxlbWVudCkuY3JlYXRlQ2hpbGQoe3N0eWxlOntwb3NpdGlvbjp6LCJ6LWluZGV4 IjozNTAwMCxib3JkZXI6IjBweCBzb2xpZCAiK0J9fSk7cmV0dXJuIEMucXVldWVG eCh7fSxLKX07YXJndW1lbnRzLmNhbGxlZS5hbmltPXtpc0FuaW1hdGVkOnRydWUs c3RvcDpmdW5jdGlvbigpe0U9MDtDLnN0b3BGeCgpfX07ZnVuY3Rpb24gSygpe3Zh ciBNPUV4dC5pc0JvcmRlckJveD8yOjE7Rj1DLmFuaW0oe3RvcDp7ZnJvbTpKLnks dG86Si55LTIwfSxsZWZ0Ontmcm9tOkoueCx0bzpKLngtMjB9LGJvcmRlcldpZHRo Ontmcm9tOjAsdG86MTB9LG9wYWNpdHk6e2Zyb206MSx0bzowfSxoZWlnaHQ6e2Zy b206Si5oZWlnaHQsdG86Si5oZWlnaHQrMjAqTX0sd2lkdGg6e2Zyb206Si53aWR0 aCx0bzpKLndpZHRoKzIwKk19fSx7ZHVyYXRpb246SC5kdXJhdGlvbnx8MSxjYWxs YmFjazpmdW5jdGlvbigpe0MucmVtb3ZlKCk7LS1FPjA/SSgpOnAoRykuYWZ0ZXJG eChIKX19KTthcmd1bWVudHMuY2FsbGVlLmFuaW09e2lzQW5pbWF0ZWQ6dHJ1ZSxz dG9wOmZ1bmN0aW9uKCl7Ri5zdG9wKCl9fX1JKCl9KTtyZXR1cm4gRH0scGF1c2U6 ZnVuY3Rpb24oRCl7dmFyIEM9dGhpcy5kb20sQjt0aGlzLnF1ZXVlRngoe30sZnVu Y3Rpb24oKXtCPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtwKEMpLmFmdGVyRngoe30p fSxEKjEwMDApO2FyZ3VtZW50cy5jYWxsZWUuYW5pbT17aXNBbmltYXRlZDp0cnVl LHN0b3A6ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoQik7cChDKS5hZnRlckZ4KHt9 KX19fSk7cmV0dXJuIHRoaXN9LGZhZGVJbjpmdW5jdGlvbihEKXtEPXgoRCk7dmFy IEI9dGhpcyxDPUIuZG9tLEU9RC5lbmRPcGFjaXR5fHwxO0IucXVldWVGeChELGZ1 bmN0aW9uKCl7cChDKS5zZXRPcGFjaXR5KDApO3AoQykuZml4RGlzcGxheSgpO0Mu c3R5bGUudmlzaWJpbGl0eT11O2FyZ3VtZW50cy5jYWxsZWUuYW5pbT1wKEMpLmZ4 YW5pbSh7b3BhY2l0eTp7dG86RX19LEQseSwwLjUscixmdW5jdGlvbigpe2lmKEU9 PTEpe3AoQykuY2xlYXJPcGFjaXR5KCl9cChDKS5hZnRlckZ4KEQpfSl9KTtyZXR1 cm4gQn0sZmFkZU91dDpmdW5jdGlvbihFKXtFPXgoRSk7dmFyIEM9dGhpcyxEPUMu ZG9tLEI9RC5zdHlsZSxGPUUuZW5kT3BhY2l0eXx8MDtDLnF1ZXVlRngoRSxmdW5j dGlvbigpe2FyZ3VtZW50cy5jYWxsZWUuYW5pbT1wKEQpLmZ4YW5pbSh7b3BhY2l0 eTp7dG86Rn19LEUseSwwLjUscixmdW5jdGlvbigpe2lmKEY9PTApe0V4dC5FbGVt ZW50LmRhdGEoRCwidmlzaWJpbGl0eU1vZGUiKT09RXh0LkVsZW1lbnQuRElTUExB WXx8RS51c2VEaXNwbGF5P0IuZGlzcGxheT0ibm9uZSI6Qi52aXNpYmlsaXR5PXc7 cChEKS5jbGVhck9wYWNpdHkoKX1wKEQpLmFmdGVyRngoRSl9KX0pO3JldHVybiBD fSxzY2FsZTpmdW5jdGlvbihCLEMsRCl7dGhpcy5zaGlmdChFeHQuYXBwbHkoe30s RCx7d2lkdGg6QixoZWlnaHQ6Q30pKTtyZXR1cm4gdGhpc30sc2hpZnQ6ZnVuY3Rp b24oRCl7RD14KEQpO3ZhciBDPXRoaXMuZG9tLEI9e307dGhpcy5xdWV1ZUZ4KEQs ZnVuY3Rpb24oKXtmb3IodmFyIEUgaW4gRCl7aWYoRFtFXSE9QSl7QltFXT17dG86 RFtFXX19fUIud2lkdGg/Qi53aWR0aC50bz1wKEMpLmFkanVzdFdpZHRoKEQud2lk dGgpOkI7Qi5oZWlnaHQ/Qi5oZWlnaHQudG89cChDKS5hZGp1c3RXaWR0aChELmhl aWdodCk6QjtpZihCLnh8fEIueXx8Qi54eSl7Qi5wb2ludHM9Qi54eXx8e3RvOltC Lng/Qi54LnRvOnAoQykuZ2V0WCgpLEIueT9CLnkudG86cChDKS5nZXRZKCldfX1h cmd1bWVudHMuY2FsbGVlLmFuaW09cChDKS5meGFuaW0oQixELGUsMC4zNSxyLGZ1 bmN0aW9uKCl7cChDKS5hZnRlckZ4KEQpfSl9KTtyZXR1cm4gdGhpc30sZ2hvc3Q6 ZnVuY3Rpb24oRSxDKXtDPXgoQyk7dmFyIEc9dGhpcyxEPUcuZG9tLEo9RC5zdHls ZSxIPXtvcGFjaXR5Ont0bzowfSxwb2ludHM6e319LEs9SC5wb2ludHMsQixJLEY7 RT1FfHwiYiI7Ry5xdWV1ZUZ4KEMsZnVuY3Rpb24oKXtCPXAoRCkuZ2V0RnhSZXN0 b3JlKCk7ST1wKEQpLmdldFdpZHRoKCk7Rj1wKEQpLmdldEhlaWdodCgpO2Z1bmN0 aW9uIEwoKXtDLnVzZURpc3BsYXk/cChEKS5zZXREaXNwbGF5ZWQodCk6cChEKS5o aWRlKCk7cChEKS5jbGVhck9wYWNpdHkoKTtwKEQpLnNldFBvc2l0aW9uaW5nKEIu cG9zKTtKLndpZHRoPUIud2lkdGg7Si5oZWlnaHQ9Qi5oZWlnaHQ7cChEKS5hZnRl ckZ4KEMpfUsuYnk9cChEKS5zd2l0Y2hTdGF0ZW1lbnRzKEUudG9Mb3dlckNhc2Uo KSxmdW5jdGlvbihOLE0pe3JldHVybltOLE1dfSx7dDpbMCwtRl0sbDpbLUksMF0s cjpbSSwwXSxiOlswLEZdLHRsOlstSSwtRl0sYmw6Wy1JLEZdLGJyOltJLEZdLHRy OltJLC1GXX0pO2FyZ3VtZW50cy5jYWxsZWUuYW5pbT1wKEQpLmZ4YW5pbShILEMs ZSwwLjUscixMKX0pO3JldHVybiBHfSxzeW5jRng6ZnVuY3Rpb24oKXt2YXIgQj10 aGlzO0IuZnhEZWZhdWx0cz1FeHQuYXBwbHkoQi5meERlZmF1bHRzfHx7fSx7Ymxv Y2s6dCxjb25jdXJyZW50Omssc3RvcEZ4OnR9KTtyZXR1cm4gQn0sc2VxdWVuY2VG eDpmdW5jdGlvbigpe3ZhciBCPXRoaXM7Qi5meERlZmF1bHRzPUV4dC5hcHBseShC LmZ4RGVmYXVsdHN8fHt9LHtibG9jazp0LGNvbmN1cnJlbnQ6dCxzdG9wRng6dH0p O3JldHVybiBCfSxuZXh0Rng6ZnVuY3Rpb24oKXt2YXIgQj1jKHRoaXMuZG9tLmlk KVswXTtpZihCKXtCLmNhbGwodGhpcyl9fSxoYXNBY3RpdmVGeDpmdW5jdGlvbigp e3JldHVybiBjKHRoaXMuZG9tLmlkKVswXX0sc3RvcEZ4OmZ1bmN0aW9uKEIpe3Zh ciBDPXRoaXMsRT1DLmRvbS5pZDtpZihDLmhhc0FjdGl2ZUZ4KCkpe3ZhciBEPWMo RSlbMF07aWYoRCYmRC5hbmltKXtpZihELmFuaW0uaXNBbmltYXRlZCl7YihFLFtE XSk7RC5hbmltLnN0b3AoQiE9PXVuZGVmaW5lZD9COmspfWVsc2V7YihFLFtdKX19 fXJldHVybiBDfSxiZWZvcmVGeDpmdW5jdGlvbihCKXtpZih0aGlzLmhhc0FjdGl2 ZUZ4KCkmJiFCLmNvbmN1cnJlbnQpe2lmKEIuc3RvcEZ4KXt0aGlzLnN0b3BGeCgp O3JldHVybiBrfXJldHVybiB0fXJldHVybiBrfSxoYXNGeEJsb2NrOmZ1bmN0aW9u KCl7dmFyIEI9Yyh0aGlzLmRvbS5pZCk7cmV0dXJuIEImJkJbMF0mJkJbMF0uYmxv Y2t9LHF1ZXVlRng6ZnVuY3Rpb24oRSxCKXt2YXIgQz1wKHRoaXMuZG9tKTtpZigh Qy5oYXNGeEJsb2NrKCkpe0V4dC5hcHBseUlmKEUsQy5meERlZmF1bHRzKTtpZigh RS5jb25jdXJyZW50KXt2YXIgRD1DLmJlZm9yZUZ4KEUpO0IuYmxvY2s9RS5ibG9j aztjKEMuZG9tLmlkKS5wdXNoKEIpO2lmKEQpe0MubmV4dEZ4KCl9fWVsc2V7Qi5j YWxsKEMpfX1yZXR1cm4gQ30sZnhXcmFwOmZ1bmN0aW9uKEgsRixEKXt2YXIgRT10 aGlzLmRvbSxDLEI7aWYoIUYud3JhcHx8IShDPUV4dC5nZXREb20oRi53cmFwKSkp e2lmKEYuZml4UG9zaXRpb24pe0I9cChFKS5nZXRYWSgpfXZhciBHPWRvY3VtZW50 LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuc3R5bGUudmlzaWJpbGl0eT1EO0M9RS5w YXJlbnROb2RlLmluc2VydEJlZm9yZShHLEUpO3AoQykuc2V0UG9zaXRpb25pbmco SCk7aWYocChDKS5pc1N0eWxlKG8sInN0YXRpYyIpKXtwKEMpLnBvc2l0aW9uKCJy ZWxhdGl2ZSIpfXAoRSkuY2xlYXJQb3NpdGlvbmluZygiYXV0byIpO3AoQykuY2xp cCgpO0MuYXBwZW5kQ2hpbGQoRSk7aWYoQil7cChDKS5zZXRYWShCKX19cmV0dXJu IEN9LGZ4VW53cmFwOmZ1bmN0aW9uKEMsRixFKXt2YXIgRD10aGlzLmRvbTtwKEQp LmNsZWFyUG9zaXRpb25pbmcoKTtwKEQpLnNldFBvc2l0aW9uaW5nKEYpO2lmKCFF LndyYXApe3ZhciBCPXAoQykuZG9tLnBhcmVudE5vZGU7Qi5pbnNlcnRCZWZvcmUo RCxDKTtwKEMpLnJlbW92ZSgpfX0sZ2V0RnhSZXN0b3JlOmZ1bmN0aW9uKCl7dmFy IEI9dGhpcy5kb20uc3R5bGU7cmV0dXJue3Bvczp0aGlzLmdldFBvc2l0aW9uaW5n KCksd2lkdGg6Qi53aWR0aCxoZWlnaHQ6Qi5oZWlnaHR9fSxhZnRlckZ4OmZ1bmN0 aW9uKEMpe3ZhciBCPXRoaXMuZG9tLEQ9Qi5pZDtpZihDLmFmdGVyU3R5bGUpe3Ao Qikuc2V0U3R5bGUoQy5hZnRlclN0eWxlKX1pZihDLmFmdGVyQ2xzKXtwKEIpLmFk ZENsYXNzKEMuYWZ0ZXJDbHMpfWlmKEMucmVtb3ZlPT1rKXtwKEIpLnJlbW92ZSgp fWlmKEMuY2FsbGJhY2spe0MuY2FsbGJhY2suY2FsbChDLnNjb3BlLHAoQikpfWlm KCFDLmNvbmN1cnJlbnQpe2MoRCkuc2hpZnQoKTtwKEIpLm5leHRGeCgpfX0sZnhh bmltOmZ1bmN0aW9uKEUsRixDLEcsRCxCKXtDPUN8fCJydW4iO0Y9Rnx8e307dmFy IEg9RXh0LmxpYi5BbmltW0NdKHRoaXMuZG9tLEUsKEYuZHVyYXRpb258fEcpfHww LjM1LChGLmVhc2luZ3x8RCl8fHIsQix0aGlzKTtGLmFuaW09SDtyZXR1cm4gSH19 O0V4dC5GeC5yZXNpemU9RXh0LkZ4LnNjYWxlO0V4dC5FbGVtZW50LmFkZE1ldGhv ZHMoRXh0LkZ4KX0pKCk7RXh0LkNvbXBvc2l0ZUVsZW1lbnRMaXRlPWZ1bmN0aW9u KGIsYSl7dGhpcy5lbGVtZW50cz1bXTt0aGlzLmFkZChiLGEpO3RoaXMuZWw9bmV3 IEV4dC5FbGVtZW50LkZseXdlaWdodCgpfTtFeHQuQ29tcG9zaXRlRWxlbWVudExp dGUucHJvdG90eXBlPXtpc0NvbXBvc2l0ZTp0cnVlLGdldEVsZW1lbnQ6ZnVuY3Rp b24oYSl7dmFyIGI9dGhpcy5lbDtiLmRvbT1hO2IuaWQ9YS5pZDtyZXR1cm4gYn0s dHJhbnNmb3JtRWxlbWVudDpmdW5jdGlvbihhKXtyZXR1cm4gRXh0LmdldERvbShh KX0sZ2V0Q291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5sZW5n dGh9LGFkZDpmdW5jdGlvbihkLGIpe3ZhciBlPXRoaXMsZz1lLmVsZW1lbnRzO2lm KCFkKXtyZXR1cm4gdGhpc31pZih0eXBlb2YgZD09InN0cmluZyIpe2Q9RXh0LkVs ZW1lbnQuc2VsZWN0b3JGdW5jdGlvbihkLGIpfWVsc2V7aWYoZC5pc0NvbXBvc2l0 ZSl7ZD1kLmVsZW1lbnRzfWVsc2V7aWYoIUV4dC5pc0l0ZXJhYmxlKGQpKXtkPVtk XX19fWZvcih2YXIgYz0wLGE9ZC5sZW5ndGg7YzxhOysrYyl7Zy5wdXNoKGUudHJh bnNmb3JtRWxlbWVudChkW2NdKSl9cmV0dXJuIGV9LGludm9rZTpmdW5jdGlvbihn LGIpe3ZhciBoPXRoaXMsZD1oLmVsZW1lbnRzLGE9ZC5sZW5ndGgsaixjO2Zvcihj PTA7YzxhO2MrKyl7aj1kW2NdO2lmKGope0V4dC5FbGVtZW50LnByb3RvdHlwZVtn XS5hcHBseShoLmdldEVsZW1lbnQoaiksYil9fXJldHVybiBofSxpdGVtOmZ1bmN0 aW9uKGIpe3ZhciBkPXRoaXMsYz1kLmVsZW1lbnRzW2JdLGE9bnVsbDtpZihjKXth PWQuZ2V0RWxlbWVudChjKX1yZXR1cm4gYX0sYWRkTGlzdGVuZXI6ZnVuY3Rpb24o YixqLGgsZyl7dmFyIGQ9dGhpcy5lbGVtZW50cyxhPWQubGVuZ3RoLGMsaztmb3Io Yz0wO2M8YTtjKyspe2s9ZFtjXTtpZihrKXtFeHQuRXZlbnRNYW5hZ2VyLm9uKGss YixqLGh8fGssZyl9fXJldHVybiB0aGlzfSxlYWNoOmZ1bmN0aW9uKGcsZCl7dmFy IGg9dGhpcyxjPWguZWxlbWVudHMsYT1jLmxlbmd0aCxiLGo7Zm9yKGI9MDtiPGE7 YisrKXtqPWNbYl07aWYoail7aj10aGlzLmdldEVsZW1lbnQoaik7aWYoZy5jYWxs KGR8fGosaixoLGIpPT09ZmFsc2Upe2JyZWFrfX19cmV0dXJuIGh9LGZpbGw6ZnVu Y3Rpb24oYSl7dmFyIGI9dGhpcztiLmVsZW1lbnRzPVtdO2IuYWRkKGEpO3JldHVy biBifSxmaWx0ZXI6ZnVuY3Rpb24oYSl7dmFyIGI9W10sZD10aGlzLGM9RXh0Lmlz RnVuY3Rpb24oYSk/YTpmdW5jdGlvbihlKXtyZXR1cm4gZS5pcyhhKX07ZC5lYWNo KGZ1bmN0aW9uKGgsZSxnKXtpZihjKGgsZykhPT1mYWxzZSl7YltiLmxlbmd0aF09 ZC50cmFuc2Zvcm1FbGVtZW50KGgpfX0pO2QuZWxlbWVudHM9YjtyZXR1cm4gZH0s aW5kZXhPZjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5pbmRleE9m KHRoaXMudHJhbnNmb3JtRWxlbWVudChhKSl9LHJlcGxhY2VFbGVtZW50OmZ1bmN0 aW9uKGUsYyxhKXt2YXIgYj0haXNOYU4oZSk/ZTp0aGlzLmluZGV4T2YoZSksZztp ZihiPi0xKXtjPUV4dC5nZXREb20oYyk7aWYoYSl7Zz10aGlzLmVsZW1lbnRzW2Jd O2cucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYyxnKTtFeHQucmVtb3ZlTm9kZShn KX10aGlzLmVsZW1lbnRzLnNwbGljZShiLDEsYyl9cmV0dXJuIHRoaXN9LGNsZWFy OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50cz1bXX19O0V4dC5Db21wb3NpdGVFbGVt ZW50TGl0ZS5wcm90b3R5cGUub249RXh0LkNvbXBvc2l0ZUVsZW1lbnRMaXRlLnBy b3RvdHlwZS5hZGRMaXN0ZW5lcjtFeHQuQ29tcG9zaXRlRWxlbWVudExpdGUuaW1w b3J0RWxlbWVudE1ldGhvZHM9ZnVuY3Rpb24oKXt2YXIgYyxiPUV4dC5FbGVtZW50 LnByb3RvdHlwZSxhPUV4dC5Db21wb3NpdGVFbGVtZW50TGl0ZS5wcm90b3R5cGU7 Zm9yKGMgaW4gYil7aWYodHlwZW9mIGJbY109PSJmdW5jdGlvbiIpeyhmdW5jdGlv bihkKXthW2RdPWFbZF18fGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW52b2tlKGQs YXJndW1lbnRzKX19KS5jYWxsKGEsYyl9fX07RXh0LkNvbXBvc2l0ZUVsZW1lbnRM aXRlLmltcG9ydEVsZW1lbnRNZXRob2RzKCk7aWYoRXh0LkRvbVF1ZXJ5KXtFeHQu RWxlbWVudC5zZWxlY3RvckZ1bmN0aW9uPUV4dC5Eb21RdWVyeS5zZWxlY3R9RXh0 LkVsZW1lbnQuc2VsZWN0PWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYodHlwZW9mIGE9 PSJzdHJpbmciKXtjPUV4dC5FbGVtZW50LnNlbGVjdG9yRnVuY3Rpb24oYSxiKX1l bHNle2lmKGEubGVuZ3RoIT09dW5kZWZpbmVkKXtjPWF9ZWxzZXt0aHJvdyJJbnZh bGlkIHNlbGVjdG9yIn19cmV0dXJuIG5ldyBFeHQuQ29tcG9zaXRlRWxlbWVudExp dGUoYyl9O0V4dC5zZWxlY3Q9RXh0LkVsZW1lbnQuc2VsZWN0OyhmdW5jdGlvbigp e3ZhciBiPSJiZWZvcmVyZXF1ZXN0IixlPSJyZXF1ZXN0Y29tcGxldGUiLGQ9InJl cXVlc3RleGNlcHRpb24iLGg9dW5kZWZpbmVkLGM9ImxvYWQiLGk9IlBPU1QiLGE9 IkdFVCIsZz13aW5kb3c7RXh0LmRhdGEuQ29ubmVjdGlvbj1mdW5jdGlvbihqKXtF eHQuYXBwbHkodGhpcyxqKTt0aGlzLmFkZEV2ZW50cyhiLGUsZCk7RXh0LmRhdGEu Q29ubmVjdGlvbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyl9O0V4 dC5leHRlbmQoRXh0LmRhdGEuQ29ubmVjdGlvbixFeHQudXRpbC5PYnNlcnZhYmxl LHt0aW1lb3V0OjMwMDAwLGF1dG9BYm9ydDpmYWxzZSxkaXNhYmxlQ2FjaGluZzp0 cnVlLGRpc2FibGVDYWNoaW5nUGFyYW06Il9kYyIscmVxdWVzdDpmdW5jdGlvbihu KXt2YXIgcz10aGlzO2lmKHMuZmlyZUV2ZW50KGIscyxuKSl7aWYobi5lbCl7aWYo IUV4dC5pc0VtcHR5KG4uaW5kaWNhdG9yVGV4dCkpe3MuaW5kaWNhdG9yVGV4dD0n PGRpdiBjbGFzcz0ibG9hZGluZy1pbmRpY2F0b3IiPicrbi5pbmRpY2F0b3JUZXh0 KyI8L2Rpdj4ifWlmKHMuaW5kaWNhdG9yVGV4dCl7RXh0LmdldERvbShuLmVsKS5p bm5lckhUTUw9cy5pbmRpY2F0b3JUZXh0fW4uc3VjY2Vzcz0oRXh0LmlzRnVuY3Rp b24obi5zdWNjZXNzKT9uLnN1Y2Nlc3M6ZnVuY3Rpb24oKXt9KS5jcmVhdGVJbnRl cmNlcHRvcihmdW5jdGlvbihvKXtFeHQuZ2V0RG9tKG4uZWwpLmlubmVySFRNTD1v LnJlc3BvbnNlVGV4dH0pfXZhciBsPW4ucGFyYW1zLGs9bi51cmx8fHMudXJsLGos cT17c3VjY2VzczpzLmhhbmRsZVJlc3BvbnNlLGZhaWx1cmU6cy5oYW5kbGVGYWls dXJlLHNjb3BlOnMsYXJndW1lbnQ6e29wdGlvbnM6bn0sdGltZW91dDpFeHQubnVt KG4udGltZW91dCxzLnRpbWVvdXQpfSxtLHQ7aWYoRXh0LmlzRnVuY3Rpb24obCkp e2w9bC5jYWxsKG4uc2NvcGV8fGcsbil9bD1FeHQudXJsRW5jb2RlKHMuZXh0cmFQ YXJhbXMsRXh0LmlzT2JqZWN0KGwpP0V4dC51cmxFbmNvZGUobCk6bCk7aWYoRXh0 LmlzRnVuY3Rpb24oaykpe2s9ay5jYWxsKG4uc2NvcGV8fGcsbil9aWYoKG09RXh0 LmdldERvbShuLmZvcm0pKSl7az1rfHxtLmFjdGlvbjtpZihuLmlzVXBsb2FkfHwo L211bHRpcGFydFwvZm9ybS1kYXRhL2kudGVzdChtLmdldEF0dHJpYnV0ZSgiZW5j dHlwZSIpKSkpe3JldHVybiBzLmRvRm9ybVVwbG9hZC5jYWxsKHMsbixsLGspfXQ9 RXh0LmxpYi5BamF4LnNlcmlhbGl6ZUZvcm0obSk7bD1sPyhsKyImIit0KTp0fWo9 bi5tZXRob2R8fHMubWV0aG9kfHwoKGx8fG4ueG1sRGF0YXx8bi5qc29uRGF0YSk/ aTphKTtpZihqPT09YSYmKHMuZGlzYWJsZUNhY2hpbmcmJm4uZGlzYWJsZUNhY2hp bmchPT1mYWxzZSl8fG4uZGlzYWJsZUNhY2hpbmc9PT10cnVlKXt2YXIgcj1uLmRp c2FibGVDYWNoaW5nUGFyYW18fHMuZGlzYWJsZUNhY2hpbmdQYXJhbTtrPUV4dC51 cmxBcHBlbmQoayxyKyI9IisobmV3IERhdGUoKS5nZXRUaW1lKCkpKX1uLmhlYWRl cnM9RXh0LmFwcGx5SWYobi5oZWFkZXJzfHx7fSxzLmRlZmF1bHRIZWFkZXJzfHx7 fSk7aWYobi5hdXRvQWJvcnQ9PT10cnVlfHxzLmF1dG9BYm9ydCl7cy5hYm9ydCgp fWlmKChqPT1hfHxuLnhtbERhdGF8fG4uanNvbkRhdGEpJiZsKXtrPUV4dC51cmxB cHBlbmQoayxsKTtsPSIifXJldHVybihzLnRyYW5zSWQ9RXh0LmxpYi5BamF4LnJl cXVlc3QoaixrLHEsbCxuKSl9ZWxzZXtyZXR1cm4gbi5jYWxsYmFjaz9uLmNhbGxi YWNrLmFwcGx5KG4uc2NvcGUsW24saCxoXSk6bnVsbH19LGlzTG9hZGluZzpmdW5j dGlvbihqKXtyZXR1cm4gaj9FeHQubGliLkFqYXguaXNDYWxsSW5Qcm9ncmVzcyhq KTohIXRoaXMudHJhbnNJZH0sYWJvcnQ6ZnVuY3Rpb24oail7aWYoanx8dGhpcy5p c0xvYWRpbmcoKSl7RXh0LmxpYi5BamF4LmFib3J0KGp8fHRoaXMudHJhbnNJZCl9 fSxoYW5kbGVSZXNwb25zZTpmdW5jdGlvbihqKXt0aGlzLnRyYW5zSWQ9ZmFsc2U7 dmFyIGs9ai5hcmd1bWVudC5vcHRpb25zO2ouYXJndW1lbnQ9az9rLmFyZ3VtZW50 Om51bGw7dGhpcy5maXJlRXZlbnQoZSx0aGlzLGosayk7aWYoay5zdWNjZXNzKXtr LnN1Y2Nlc3MuY2FsbChrLnNjb3BlLGosayl9aWYoay5jYWxsYmFjayl7ay5jYWxs YmFjay5jYWxsKGsuc2NvcGUsayx0cnVlLGopfX0saGFuZGxlRmFpbHVyZTpmdW5j dGlvbihqLGwpe3RoaXMudHJhbnNJZD1mYWxzZTt2YXIgaz1qLmFyZ3VtZW50Lm9w dGlvbnM7ai5hcmd1bWVudD1rP2suYXJndW1lbnQ6bnVsbDt0aGlzLmZpcmVFdmVu dChkLHRoaXMsaixrLGwpO2lmKGsuZmFpbHVyZSl7ay5mYWlsdXJlLmNhbGwoay5z Y29wZSxqLGspfWlmKGsuY2FsbGJhY2spe2suY2FsbGJhY2suY2FsbChrLnNjb3Bl LGssZmFsc2Usail9fSxkb0Zvcm1VcGxvYWQ6ZnVuY3Rpb24ocSxqLGspe3ZhciBs PUV4dC5pZCgpLHY9ZG9jdW1lbnQscj12LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIp LG09RXh0LmdldERvbShxLmZvcm0pLHU9W10sdCxwPSJtdWx0aXBhcnQvZm9ybS1k YXRhIixuPXt0YXJnZXQ6bS50YXJnZXQsbWV0aG9kOm0ubWV0aG9kLGVuY29kaW5n Om0uZW5jb2RpbmcsZW5jdHlwZTptLmVuY3R5cGUsYWN0aW9uOm0uYWN0aW9ufTtF eHQuZmx5KHIpLnNldCh7aWQ6bCxuYW1lOmwsY2xzOiJ4LWhpZGRlbiIsc3JjOkV4 dC5TU0xfU0VDVVJFX1VSTH0pO3YuYm9keS5hcHBlbmRDaGlsZChyKTtpZihFeHQu aXNJRSl7ZG9jdW1lbnQuZnJhbWVzW2xdLm5hbWU9bH1FeHQuZmx5KG0pLnNldCh7 dGFyZ2V0OmwsbWV0aG9kOmksZW5jdHlwZTpwLGVuY29kaW5nOnAsYWN0aW9uOmt8 fG4uYWN0aW9ufSk7RXh0Lml0ZXJhdGUoRXh0LnVybERlY29kZShqLGZhbHNlKSxm dW5jdGlvbih3LG8pe3Q9di5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO0V4dC5mbHko dCkuc2V0KHt0eXBlOiJoaWRkZW4iLHZhbHVlOm8sbmFtZTp3fSk7bS5hcHBlbmRD aGlsZCh0KTt1LnB1c2godCl9KTtmdW5jdGlvbiBzKCl7dmFyIHg9dGhpcyx3PXty ZXNwb25zZVRleHQ6IiIscmVzcG9uc2VYTUw6bnVsbCxhcmd1bWVudDpxLmFyZ3Vt ZW50fSxBLHo7dHJ5e0E9ci5jb250ZW50V2luZG93LmRvY3VtZW50fHxyLmNvbnRl bnREb2N1bWVudHx8Zy5mcmFtZXNbbF0uZG9jdW1lbnQ7aWYoQSl7aWYoQS5ib2R5 KXtpZigvdGV4dGFyZWEvaS50ZXN0KCh6PUEuYm9keS5maXJzdENoaWxkfHx7fSku dGFnTmFtZSkpe3cucmVzcG9uc2VUZXh0PXoudmFsdWV9ZWxzZXt3LnJlc3BvbnNl VGV4dD1BLmJvZHkuaW5uZXJIVE1MfX13LnJlc3BvbnNlWE1MPUEuWE1MRG9jdW1l bnR8fEF9fWNhdGNoKHkpe31FeHQuRXZlbnRNYW5hZ2VyLnJlbW92ZUxpc3RlbmVy KHIsYyxzLHgpO3guZmlyZUV2ZW50KGUseCx3LHEpO2Z1bmN0aW9uIG8oRCxDLEIp e2lmKEV4dC5pc0Z1bmN0aW9uKEQpKXtELmFwcGx5KEMsQil9fW8ocS5zdWNjZXNz LHEuc2NvcGUsW3cscV0pO28ocS5jYWxsYmFjayxxLnNjb3BlLFtxLHRydWUsd10p O2lmKCF4LmRlYnVnVXBsb2Fkcyl7c2V0VGltZW91dChmdW5jdGlvbigpe0V4dC5y ZW1vdmVOb2RlKHIpfSwxMDApfX1FeHQuRXZlbnRNYW5hZ2VyLm9uKHIsYyxzLHRo aXMpO20uc3VibWl0KCk7RXh0LmZseShtKS5zZXQobik7RXh0LmVhY2godSxmdW5j dGlvbihvKXtFeHQucmVtb3ZlTm9kZShvKX0pfX0pfSkoKTtFeHQuQWpheD1uZXcg RXh0LmRhdGEuQ29ubmVjdGlvbih7YXV0b0Fib3J0OmZhbHNlLHNlcmlhbGl6ZUZv cm06ZnVuY3Rpb24oYSl7cmV0dXJuIEV4dC5saWIuQWpheC5zZXJpYWxpemVGb3Jt KGEpfX0pO0V4dC51dGlsLkpTT049bmV3IChmdW5jdGlvbigpe3ZhciB1c2VIYXNP d249ISF7fS5oYXNPd25Qcm9wZXJ0eSxpc05hdGl2ZT1mdW5jdGlvbigpe3ZhciB1 c2VOYXRpdmU9bnVsbDtyZXR1cm4gZnVuY3Rpb24oKXtpZih1c2VOYXRpdmU9PT1u dWxsKXt1c2VOYXRpdmU9RXh0LlVTRV9OQVRJVkVfSlNPTiYmd2luZG93LkpTT04m JkpTT04udG9TdHJpbmcoKT09IltvYmplY3QgSlNPTl0ifXJldHVybiB1c2VOYXRp dmV9fSgpLHBhZD1mdW5jdGlvbihuKXtyZXR1cm4gbjwxMD8iMCIrbjpufSxkb0Rl Y29kZT1mdW5jdGlvbihqc29uKXtyZXR1cm4ganNvbj9ldmFsKCIoIitqc29uKyIp Iik6IiJ9LGRvRW5jb2RlPWZ1bmN0aW9uKG8pe2lmKCFFeHQuaXNEZWZpbmVkKG8p fHxvPT09bnVsbCl7cmV0dXJuIm51bGwifWVsc2V7aWYoRXh0LmlzQXJyYXkobykp e3JldHVybiBlbmNvZGVBcnJheShvKX1lbHNle2lmKEV4dC5pc0RhdGUobykpe3Jl dHVybiBFeHQudXRpbC5KU09OLmVuY29kZURhdGUobyl9ZWxzZXtpZihFeHQuaXNT dHJpbmcobykpe3JldHVybiBlbmNvZGVTdHJpbmcobyl9ZWxzZXtpZih0eXBlb2Yg bz09Im51bWJlciIpe3JldHVybiBpc0Zpbml0ZShvKT9TdHJpbmcobyk6Im51bGwi fWVsc2V7aWYoRXh0LmlzQm9vbGVhbihvKSl7cmV0dXJuIFN0cmluZyhvKX1lbHNl e3ZhciBhPVsieyJdLGIsaSx2O2ZvcihpIGluIG8pe2lmKCFvLmdldEVsZW1lbnRz QnlUYWdOYW1lKXtpZighdXNlSGFzT3dufHxvLmhhc093blByb3BlcnR5KGkpKXt2 PW9baV07c3dpdGNoKHR5cGVvZiB2KXtjYXNlInVuZGVmaW5lZCI6Y2FzZSJmdW5j dGlvbiI6Y2FzZSJ1bmtub3duIjpicmVhaztkZWZhdWx0OmlmKGIpe2EucHVzaCgi LCIpfWEucHVzaChkb0VuY29kZShpKSwiOiIsdj09PW51bGw/Im51bGwiOmRvRW5j b2RlKHYpKTtiPXRydWV9fX19YS5wdXNoKCJ9Iik7cmV0dXJuIGEuam9pbigiIil9 fX19fX19LG09eyJcYiI6IlxcYiIsIlx0IjoiXFx0IiwiXG4iOiJcXG4iLCJcZiI6 IlxcZiIsIlxyIjoiXFxyIiwnIic6J1xcIicsIlxcIjoiXFxcXCJ9LGVuY29kZVN0 cmluZz1mdW5jdGlvbihzKXtpZigvWyJcXFx4MDAtXHgxZl0vLnRlc3Qocykpe3Jl dHVybiciJytzLnJlcGxhY2UoLyhbXHgwMC1ceDFmXFwiXSkvZyxmdW5jdGlvbihh LGIpe3ZhciBjPW1bYl07aWYoYyl7cmV0dXJuIGN9Yz1iLmNoYXJDb2RlQXQoKTty ZXR1cm4iXFx1MDAiK01hdGguZmxvb3IoYy8xNikudG9TdHJpbmcoMTYpKyhjJTE2 KS50b1N0cmluZygxNil9KSsnIid9cmV0dXJuJyInK3MrJyInfSxlbmNvZGVBcnJh eT1mdW5jdGlvbihvKXt2YXIgYT1bIlsiXSxiLGksbD1vLmxlbmd0aCx2O2Zvcihp PTA7aTxsO2krPTEpe3Y9b1tpXTtzd2l0Y2godHlwZW9mIHYpe2Nhc2UidW5kZWZp bmVkIjpjYXNlImZ1bmN0aW9uIjpjYXNlInVua25vd24iOmJyZWFrO2RlZmF1bHQ6 aWYoYil7YS5wdXNoKCIsIil9YS5wdXNoKHY9PT1udWxsPyJudWxsIjpFeHQudXRp bC5KU09OLmVuY29kZSh2KSk7Yj10cnVlfX1hLnB1c2goIl0iKTtyZXR1cm4gYS5q b2luKCIiKX07dGhpcy5lbmNvZGVEYXRlPWZ1bmN0aW9uKG8pe3JldHVybiciJytv LmdldEZ1bGxZZWFyKCkrIi0iK3BhZChvLmdldE1vbnRoKCkrMSkrIi0iK3BhZChv LmdldERhdGUoKSkrIlQiK3BhZChvLmdldEhvdXJzKCkpKyI6IitwYWQoby5nZXRN aW51dGVzKCkpKyI6IitwYWQoby5nZXRTZWNvbmRzKCkpKyciJ307dGhpcy5lbmNv ZGU9ZnVuY3Rpb24oKXt2YXIgZWM7cmV0dXJuIGZ1bmN0aW9uKG8pe2lmKCFlYyl7 ZWM9aXNOYXRpdmUoKT9KU09OLnN0cmluZ2lmeTpkb0VuY29kZX1yZXR1cm4gZWMo byl9fSgpO3RoaXMuZGVjb2RlPWZ1bmN0aW9uKCl7dmFyIGRjO3JldHVybiBmdW5j dGlvbihqc29uKXtpZighZGMpe2RjPWlzTmF0aXZlKCk/SlNPTi5wYXJzZTpkb0Rl Y29kZX1yZXR1cm4gZGMoanNvbil9fSgpfSkoKTtFeHQuZW5jb2RlPUV4dC51dGls LkpTT04uZW5jb2RlO0V4dC5kZWNvZGU9RXh0LnV0aWwuSlNPTi5kZWNvZGU7RXh0 LkV2ZW50TWFuYWdlcj1mdW5jdGlvbigpe3ZhciB6LHAsaj1mYWxzZSxsPUV4dC5p c0dlY2tvfHxFeHQuaXNXZWJLaXR8fEV4dC5pc1NhZmFyaSxvPUV4dC5saWIuRXZl bnQscT1FeHQubGliLkRvbSxjPWRvY3VtZW50LEE9d2luZG93LHI9IkRPTUNvbnRl bnRMb2FkZWQiLHQ9ImNvbXBsZXRlIixnPS9eKD86c2NvcGV8ZGVsYXl8YnVmZmVy fHNpbmdsZXxzdG9wRXZlbnR8cHJldmVudERlZmF1bHR8c3RvcFByb3BhZ2F0aW9u fG5vcm1hbGl6ZWR8YXJnc3xkZWxlZ2F0ZSkkLyx1PVtdO2Z1bmN0aW9uIG4oRSl7 dmFyIEg9ZmFsc2UsRD0wLEM9dS5sZW5ndGgsRj1mYWxzZSxHO2lmKEUpe2lmKEUu Z2V0RWxlbWVudEJ5SWR8fEUubmF2aWdhdG9yKXtmb3IoO0Q8QzsrK0Qpe0c9dVtE XTtpZihHLmVsPT09RSl7SD1HLmlkO2JyZWFrfX1pZighSCl7SD1FeHQuaWQoRSk7 dS5wdXNoKHtpZDpILGVsOkV9KTtGPXRydWV9fWVsc2V7SD1FeHQuaWQoRSl9aWYo IUV4dC5lbENhY2hlW0hdKXtFeHQuRWxlbWVudC5hZGRUb0NhY2hlKG5ldyBFeHQu RWxlbWVudChFKSxIKTtpZihGKXtFeHQuZWxDYWNoZVtIXS5za2lwR0M9dHJ1ZX19 fXJldHVybiBIfWZ1bmN0aW9uIG0oRSxHLEosRixELEwpe0U9RXh0LmdldERvbShF KTt2YXIgQz1uKEUpLEs9RXh0LmVsQ2FjaGVbQ10uZXZlbnRzLEg7SD1vLm9uKEUs RyxEKTtLW0ddPUtbR118fFtdO0tbR10ucHVzaChbSixELEwsSCxGXSk7aWYoRS5h ZGRFdmVudExpc3RlbmVyJiZHPT0ibW91c2V3aGVlbCIpe3ZhciBJPVsiRE9NTW91 c2VTY3JvbGwiLEQsZmFsc2VdO0UuYWRkRXZlbnRMaXN0ZW5lci5hcHBseShFLEkp O0V4dC5FdmVudE1hbmFnZXIuYWRkTGlzdGVuZXIoQSwidW5sb2FkIixmdW5jdGlv bigpe0UucmVtb3ZlRXZlbnRMaXN0ZW5lci5hcHBseShFLEkpfSl9aWYoRT09YyYm Rz09Im1vdXNlZG93biIpe0V4dC5FdmVudE1hbmFnZXIuc3RvcHBlZE1vdXNlRG93 bkV2ZW50LmFkZExpc3RlbmVyKEQpfX1mdW5jdGlvbiBkKCl7aWYod2luZG93IT10 b3Ape3JldHVybiBmYWxzZX10cnl7Yy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwo ImxlZnQiKX1jYXRjaChDKXtyZXR1cm4gZmFsc2V9YigpO3JldHVybiB0cnVlfWZ1 bmN0aW9uIEIoQyl7aWYoRXh0LmlzSUUmJmQoKSl7cmV0dXJuIHRydWV9aWYoYy5y ZWFkeVN0YXRlPT10KXtiKCk7cmV0dXJuIHRydWV9anx8KHA9c2V0VGltZW91dChh cmd1bWVudHMuY2FsbGVlLDIpKTtyZXR1cm4gZmFsc2V9dmFyIGs7ZnVuY3Rpb24g aShDKXtrfHwoaz1FeHQucXVlcnkoInN0eWxlLCBsaW5rW3JlbD1zdHlsZXNoZWV0 XSIpKTtpZihrLmxlbmd0aD09Yy5zdHlsZVNoZWV0cy5sZW5ndGgpe2IoKTtyZXR1 cm4gdHJ1ZX1qfHwocD1zZXRUaW1lb3V0KGFyZ3VtZW50cy5jYWxsZWUsMikpO3Jl dHVybiBmYWxzZX1mdW5jdGlvbiB5KEMpe2MucmVtb3ZlRXZlbnRMaXN0ZW5lcihy LGFyZ3VtZW50cy5jYWxsZWUsZmFsc2UpO2koKX1mdW5jdGlvbiBiKEMpe2lmKCFq KXtqPXRydWU7aWYocCl7Y2xlYXJUaW1lb3V0KHApfWlmKGwpe2MucmVtb3ZlRXZl bnRMaXN0ZW5lcihyLGIsZmFsc2UpfWlmKEV4dC5pc0lFJiZCLmJpbmRJRSl7Yy5k ZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKX1vLnVuKEEsImxvYWQi LGFyZ3VtZW50cy5jYWxsZWUpfWlmKHomJiFFeHQuaXNSZWFkeSl7RXh0LmlzUmVh ZHk9dHJ1ZTt6LmZpcmUoKTt6Lmxpc3RlbmVycz1bXX19ZnVuY3Rpb24gYSgpe3p8 fCh6PW5ldyBFeHQudXRpbC5FdmVudCgpKTtpZihsKXtjLmFkZEV2ZW50TGlzdGVu ZXIocixiLGZhbHNlKX1pZihFeHQuaXNJRSl7aWYoIUIoKSl7Qi5iaW5kSUU9dHJ1 ZTtjLmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEIpfX1lbHNle2lm KEV4dC5pc09wZXJhKXsoYy5yZWFkeVN0YXRlPT10JiZpKCkpfHxjLmFkZEV2ZW50 TGlzdGVuZXIocix5LGZhbHNlKX1lbHNle2lmKEV4dC5pc1dlYktpdCl7QigpfX19 by5vbihBLCJsb2FkIixiKX1mdW5jdGlvbiB4KEMsRCl7cmV0dXJuIGZ1bmN0aW9u KCl7dmFyIEU9RXh0LnRvQXJyYXkoYXJndW1lbnRzKTtpZihELnRhcmdldD09RXh0 LkV2ZW50T2JqZWN0LnNldEV2ZW50KEVbMF0pLnRhcmdldCl7Qy5hcHBseSh0aGlz LEUpfX19ZnVuY3Rpb24gdyhELEUsQyl7cmV0dXJuIGZ1bmN0aW9uKEYpe0MuZGVs YXkoRS5idWZmZXIsRCxudWxsLFtuZXcgRXh0LkV2ZW50T2JqZWN0SW1wbChGKV0p fX1mdW5jdGlvbiBzKEcsRixDLEUsRCl7cmV0dXJuIGZ1bmN0aW9uKEgpe0V4dC5F dmVudE1hbmFnZXIucmVtb3ZlTGlzdGVuZXIoRixDLEUsRCk7RyhIKX19ZnVuY3Rp b24gZShELEUsQyl7cmV0dXJuIGZ1bmN0aW9uKEcpe3ZhciBGPW5ldyBFeHQudXRp bC5EZWxheWVkVGFzayhEKTtpZighQy50YXNrcyl7Qy50YXNrcz1bXX1DLnRhc2tz LnB1c2goRik7Ri5kZWxheShFLmRlbGF5fHwxMCxELG51bGwsW25ldyBFeHQuRXZl bnRPYmplY3RJbXBsKEcpXSl9fWZ1bmN0aW9uIGgoSCxHLEMsSixLKXt2YXIgRD0o IUN8fHR5cGVvZiBDPT0iYm9vbGVhbiIpP3t9OkMsRT1FeHQuZ2V0RG9tKEgpLEY7 Sj1KfHxELmZuO0s9S3x8RC5zY29wZTtpZighRSl7dGhyb3cnRXJyb3IgbGlzdGVu aW5nIGZvciAiJytHKyciLiBFbGVtZW50ICInK0grIlwiIGRvZXNuJ3QgZXhpc3Qu In1mdW5jdGlvbiBJKE0pe2lmKCFFeHQpe3JldHVybn1NPUV4dC5FdmVudE9iamVj dC5zZXRFdmVudChNKTt2YXIgTDtpZihELmRlbGVnYXRlKXtpZighKEw9TS5nZXRU YXJnZXQoRC5kZWxlZ2F0ZSxFKSkpe3JldHVybn19ZWxzZXtMPU0udGFyZ2V0fWlm KEQuc3RvcEV2ZW50KXtNLnN0b3BFdmVudCgpfWlmKEQucHJldmVudERlZmF1bHQp e00ucHJldmVudERlZmF1bHQoKX1pZihELnN0b3BQcm9wYWdhdGlvbil7TS5zdG9w UHJvcGFnYXRpb24oKX1pZihELm5vcm1hbGl6ZWQ9PT1mYWxzZSl7TT1NLmJyb3dz ZXJFdmVudH1KLmNhbGwoS3x8RSxNLEwsRCl9aWYoRC50YXJnZXQpe0k9eChJLEQp fWlmKEQuZGVsYXkpe0k9ZShJLEQsSil9aWYoRC5zaW5nbGUpe0k9cyhJLEUsRyxK LEspfWlmKEQuYnVmZmVyKXtGPW5ldyBFeHQudXRpbC5EZWxheWVkVGFzayhJKTtJ PXcoSSxELEYpfW0oRSxHLEosRixJLEspO3JldHVybiBJfXZhciB2PXthZGRMaXN0 ZW5lcjpmdW5jdGlvbihFLEMsRyxGLEQpe2lmKHR5cGVvZiBDPT0ib2JqZWN0Iil7 dmFyIEo9QyxILEk7Zm9yKEggaW4gSil7ST1KW0hdO2lmKCFnLnRlc3QoSCkpe2lm KEV4dC5pc0Z1bmN0aW9uKEkpKXtoKEUsSCxKLEksSi5zY29wZSl9ZWxzZXtoKEUs SCxJKX19fX1lbHNle2goRSxDLEQsRyxGKX19LHJlbW92ZUxpc3RlbmVyOmZ1bmN0 aW9uKEUsSSxNLE4pe0U9RXh0LmdldERvbShFKTt2YXIgQz1uKEUpLEs9RSYmKEV4 dC5lbENhY2hlW0NdLmV2ZW50cylbSV18fFtdLEQsSCxGLEcsSixMO2ZvcihIPTAs Sj1LLmxlbmd0aDtIPEo7SCsrKXtpZihFeHQuaXNBcnJheShMPUtbSF0pJiZMWzBd PT1NJiYoIU58fExbMl09PU4pKXtpZihMWzRdKXtMWzRdLmNhbmNlbCgpfUc9TS50 YXNrcyYmTS50YXNrcy5sZW5ndGg7aWYoRyl7d2hpbGUoRy0tKXtNLnRhc2tzW0dd LmNhbmNlbCgpfWRlbGV0ZSBNLnRhc2tzfUQ9TFsxXTtvLnVuKEUsSSxvLmV4dEFk YXB0ZXI/TFszXTpEKTtpZihEJiZFLmFkZEV2ZW50TGlzdGVuZXImJkk9PSJtb3Vz ZXdoZWVsIil7RS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Nb3VzZVNjcm9sbCIs RCxmYWxzZSl9aWYoRCYmRT09YyYmST09Im1vdXNlZG93biIpe0V4dC5FdmVudE1h bmFnZXIuc3RvcHBlZE1vdXNlRG93bkV2ZW50LnJlbW92ZUxpc3RlbmVyKEQpfUsu c3BsaWNlKEgsMSk7aWYoSy5sZW5ndGg9PT0wKXtkZWxldGUgRXh0LmVsQ2FjaGVb Q10uZXZlbnRzW0ldfWZvcihHIGluIEV4dC5lbENhY2hlW0NdLmV2ZW50cyl7cmV0 dXJuIGZhbHNlfUV4dC5lbENhY2hlW0NdLmV2ZW50cz17fTtyZXR1cm4gZmFsc2V9 fX0scmVtb3ZlQWxsOmZ1bmN0aW9uKEUpe0U9RXh0LmdldERvbShFKTt2YXIgRD1u KEUpLEo9RXh0LmVsQ2FjaGVbRF18fHt9LE09Si5ldmVudHN8fHt9LEksSCxLLEYs TCxHLEM7Zm9yKEYgaW4gTSl7aWYoTS5oYXNPd25Qcm9wZXJ0eShGKSl7ST1NW0Zd O2ZvcihIPTAsSz1JLmxlbmd0aDtIPEs7SCsrKXtMPUlbSF07aWYoTFs0XSl7TFs0 XS5jYW5jZWwoKX1pZihMWzBdLnRhc2tzJiYoRz1MWzBdLnRhc2tzLmxlbmd0aCkp e3doaWxlKEctLSl7TFswXS50YXNrc1tHXS5jYW5jZWwoKX1kZWxldGUgTC50YXNr c31DPUxbMV07by51bihFLEYsby5leHRBZGFwdGVyP0xbM106Qyk7aWYoRS5hZGRF dmVudExpc3RlbmVyJiZDJiZGPT0ibW91c2V3aGVlbCIpe0UucmVtb3ZlRXZlbnRM aXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLEMsZmFsc2UpfWlmKEMmJkU9PWMmJkY9 PSJtb3VzZWRvd24iKXtFeHQuRXZlbnRNYW5hZ2VyLnN0b3BwZWRNb3VzZURvd25F dmVudC5yZW1vdmVMaXN0ZW5lcihDKX19fX1pZihFeHQuZWxDYWNoZVtEXSl7RXh0 LmVsQ2FjaGVbRF0uZXZlbnRzPXt9fX0sZ2V0TGlzdGVuZXJzOmZ1bmN0aW9uKEYs Qyl7Rj1FeHQuZ2V0RG9tKEYpO3ZhciBIPW4oRiksRD1FeHQuZWxDYWNoZVtIXXx8 e30sRz1ELmV2ZW50c3x8e30sRT1bXTtpZihHJiZHW0NdKXtyZXR1cm4gR1tDXX1l bHNle3JldHVybiBudWxsfX0scHVyZ2VFbGVtZW50OmZ1bmN0aW9uKEUsQyxHKXtF PUV4dC5nZXREb20oRSk7dmFyIEQ9bihFKSxKPUV4dC5lbENhY2hlW0RdfHx7fSxL PUouZXZlbnRzfHx7fSxGLEksSDtpZihHKXtpZihLJiZLLmhhc093blByb3BlcnR5 KEcpKXtJPUtbR107Zm9yKEY9MCxIPUkubGVuZ3RoO0Y8SDtGKyspe0V4dC5FdmVu dE1hbmFnZXIucmVtb3ZlTGlzdGVuZXIoRSxHLElbRl1bMF0pfX19ZWxzZXtFeHQu RXZlbnRNYW5hZ2VyLnJlbW92ZUFsbChFKX1pZihDJiZFJiZFLmNoaWxkTm9kZXMp e2ZvcihGPTAsSD1FLmNoaWxkTm9kZXMubGVuZ3RoO0Y8SDtGKyspe0V4dC5FdmVu dE1hbmFnZXIucHVyZ2VFbGVtZW50KEUuY2hpbGROb2Rlc1tGXSxDLEcpfX19LF91 bmxvYWQ6ZnVuY3Rpb24oKXt2YXIgQztmb3IoQyBpbiBFeHQuZWxDYWNoZSl7RXh0 LkV2ZW50TWFuYWdlci5yZW1vdmVBbGwoQyl9ZGVsZXRlIEV4dC5lbENhY2hlO2Rl bGV0ZSBFeHQuRWxlbWVudC5fZmx5d2VpZ2h0czt2YXIgRyxELEYsRT1FeHQubGli LkFqYXg7KHR5cGVvZiBFLmNvbm49PSJvYmplY3QiKT9EPUUuY29ubjpEPXt9O2Zv cihGIGluIEQpe0c9RFtGXTtpZihHKXtFLmFib3J0KHtjb25uOkcsdElkOkZ9KX19 fSxvbkRvY3VtZW50UmVhZHk6ZnVuY3Rpb24oRSxELEMpe2lmKEV4dC5pc1JlYWR5 KXt6fHwoej1uZXcgRXh0LnV0aWwuRXZlbnQoKSk7ei5hZGRMaXN0ZW5lcihFLEQs Qyk7ei5maXJlKCk7ei5saXN0ZW5lcnM9W119ZWxzZXtpZigheil7YSgpfUM9Q3x8 e307Qy5kZWxheT1DLmRlbGF5fHwxO3ouYWRkTGlzdGVuZXIoRSxELEMpfX0sZmly ZURvY1JlYWR5OmJ9O3Yub249di5hZGRMaXN0ZW5lcjt2LnVuPXYucmVtb3ZlTGlz dGVuZXI7di5zdG9wcGVkTW91c2VEb3duRXZlbnQ9bmV3IEV4dC51dGlsLkV2ZW50 KCk7cmV0dXJuIHZ9KCk7RXh0Lm9uUmVhZHk9RXh0LkV2ZW50TWFuYWdlci5vbkRv Y3VtZW50UmVhZHk7KGZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXt2YXIgYz1k b2N1bWVudC5ib2R5fHxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9k eSIpWzBdO2lmKCFjKXtyZXR1cm4gZmFsc2V9dmFyIGI9WyIgIixFeHQuaXNJRT8i ZXh0LWllICIrKEV4dC5pc0lFNj8iZXh0LWllNiI6KEV4dC5pc0lFNz8iZXh0LWll NyI6KEV4dC5pc0lFOD8iZXh0LWllOCI6ImV4dC1pZTkiKSkpOkV4dC5pc0dlY2tv PyJleHQtZ2Vja28gIisoRXh0LmlzR2Vja28yPyJleHQtZ2Vja28yIjoiZXh0LWdl Y2tvMyIpOkV4dC5pc09wZXJhPyJleHQtb3BlcmEiOkV4dC5pc1dlYktpdD8iZXh0 LXdlYmtpdCI6IiJdO2lmKEV4dC5pc1NhZmFyaSl7Yi5wdXNoKCJleHQtc2FmYXJp ICIrKEV4dC5pc1NhZmFyaTI/ImV4dC1zYWZhcmkyIjooRXh0LmlzU2FmYXJpMz8i ZXh0LXNhZmFyaTMiOiJleHQtc2FmYXJpNCIpKSl9ZWxzZXtpZihFeHQuaXNDaHJv bWUpe2IucHVzaCgiZXh0LWNocm9tZSIpfX1pZihFeHQuaXNNYWMpe2IucHVzaCgi ZXh0LW1hYyIpfWlmKEV4dC5pc0xpbnV4KXtiLnB1c2goImV4dC1saW51eCIpfWlm KEV4dC5pc1N0cmljdHx8RXh0LmlzQm9yZGVyQm94KXt2YXIgZD1jLnBhcmVudE5v ZGU7aWYoZCl7aWYoIUV4dC5pc1N0cmljdCl7RXh0LmZseShkLCJfaW50ZXJuYWwi KS5hZGRDbGFzcygieC1xdWlya3MiKTtpZihFeHQuaXNJRSYmIUV4dC5pc1N0cmlj dCl7RXh0LmlzSUVRdWlya3M9dHJ1ZX19RXh0LmZseShkLCJfaW50ZXJuYWwiKS5h ZGRDbGFzcygoKEV4dC5pc1N0cmljdCYmRXh0LmlzSUUpfHwoIUV4dC5lbmFibGVG b3JjZWRCb3hNb2RlbCYmIUV4dC5pc0lFKSk/IiBleHQtc3RyaWN0IjoiIGV4dC1i b3JkZXItYm94Iil9fWlmKEV4dC5lbmFibGVGb3JjZWRCb3hNb2RlbCYmIUV4dC5p c0lFKXtFeHQuaXNGb3JjZWRCb3JkZXJCb3g9dHJ1ZTtiLnB1c2goImV4dC1mb3Jj ZWQtYm9yZGVyLWJveCIpfUV4dC5mbHkoYywiX2ludGVybmFsIikuYWRkQ2xhc3Mo Yik7cmV0dXJuIHRydWV9O2lmKCFhKCkpe0V4dC5vblJlYWR5KGEpfX0pKCk7KGZ1 bmN0aW9uKCl7dmFyIGI9RXh0LmFwcGx5KEV4dC5zdXBwb3J0cyx7Y29ycmVjdFJp Z2h0TWFyZ2luOnRydWUsY29ycmVjdFRyYW5zcGFyZW50Q29sb3I6dHJ1ZSxjc3NG bG9hdDp0cnVlfSk7dmFyIGE9ZnVuY3Rpb24oKXt2YXIgZz1kb2N1bWVudC5jcmVh dGVFbGVtZW50KCJkaXYiKSxlPWRvY3VtZW50LGMsZDtnLmlubmVySFRNTD0nPGRp diBzdHlsZT0iaGVpZ2h0OjMwcHg7d2lkdGg6NTBweDsiPjxkaXYgc3R5bGU9Imhl aWdodDoyMHB4O3dpZHRoOjIwcHg7Ij48L2Rpdj48L2Rpdj48ZGl2IHN0eWxlPSJm bG9hdDpsZWZ0O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ij4nO2UuYm9k eS5hcHBlbmRDaGlsZChnKTtkPWcubGFzdENoaWxkO2lmKChjPWUuZGVmYXVsdFZp ZXcpKXtpZihjLmdldENvbXB1dGVkU3R5bGUoZy5maXJzdENoaWxkLmZpcnN0Q2hp bGQsbnVsbCkubWFyZ2luUmlnaHQhPSIwcHgiKXtiLmNvcnJlY3RSaWdodE1hcmdp bj1mYWxzZX1pZihjLmdldENvbXB1dGVkU3R5bGUoZCxudWxsKS5iYWNrZ3JvdW5k Q29sb3IhPSJ0cmFuc3BhcmVudCIpe2IuY29ycmVjdFRyYW5zcGFyZW50Q29sb3I9 ZmFsc2V9fWIuY3NzRmxvYXQ9ISFkLnN0eWxlLmNzc0Zsb2F0O2UuYm9keS5yZW1v dmVDaGlsZChnKX07aWYoRXh0LmlzUmVhZHkpe2EoKX1lbHNle0V4dC5vblJlYWR5 KGEpfX0pKCk7RXh0LkV2ZW50T2JqZWN0PWZ1bmN0aW9uKCl7dmFyIGI9RXh0Lmxp Yi5FdmVudCxjPS8oZGJsKT9jbGljay8sYT17MzoxMyw2MzIzNDozNyw2MzIzNToz OSw2MzIzMjozOCw2MzIzMzo0MCw2MzI3NjozMyw2MzI3NzozNCw2MzI3Mjo0Niw2 MzI3MzozNiw2MzI3NTozNX0sZD1FeHQuaXNJRT97MTowLDQ6MSwyOjJ9OnswOjAs MToxLDI6Mn07RXh0LkV2ZW50T2JqZWN0SW1wbD1mdW5jdGlvbihnKXtpZihnKXt0 aGlzLnNldEV2ZW50KGcuYnJvd3NlckV2ZW50fHxnKX19O0V4dC5FdmVudE9iamVj dEltcGwucHJvdG90eXBlPXtzZXRFdmVudDpmdW5jdGlvbihoKXt2YXIgZz10aGlz O2lmKGg9PWd8fChoJiZoLmJyb3dzZXJFdmVudCkpe3JldHVybiBofWcuYnJvd3Nl ckV2ZW50PWg7aWYoaCl7Zy5idXR0b249aC5idXR0b24/ZFtoLmJ1dHRvbl06KGgu d2hpY2g/aC53aGljaC0xOi0xKTtpZihjLnRlc3QoaC50eXBlKSYmZy5idXR0b249 PS0xKXtnLmJ1dHRvbj0wfWcudHlwZT1oLnR5cGU7Zy5zaGlmdEtleT1oLnNoaWZ0 S2V5O2cuY3RybEtleT1oLmN0cmxLZXl8fGgubWV0YUtleXx8ZmFsc2U7Zy5hbHRL ZXk9aC5hbHRLZXk7Zy5rZXlDb2RlPWgua2V5Q29kZTtnLmNoYXJDb2RlPWguY2hh ckNvZGU7Zy50YXJnZXQ9Yi5nZXRUYXJnZXQoaCk7Zy54eT1iLmdldFhZKGgpfWVs c2V7Zy5idXR0b249LTE7Zy5zaGlmdEtleT1mYWxzZTtnLmN0cmxLZXk9ZmFsc2U7 Zy5hbHRLZXk9ZmFsc2U7Zy5rZXlDb2RlPTA7Zy5jaGFyQ29kZT0wO2cudGFyZ2V0 PW51bGw7Zy54eT1bMCwwXX1yZXR1cm4gZ30sc3RvcEV2ZW50OmZ1bmN0aW9uKCl7 dmFyIGU9dGhpcztpZihlLmJyb3dzZXJFdmVudCl7aWYoZS5icm93c2VyRXZlbnQu dHlwZT09Im1vdXNlZG93biIpe0V4dC5FdmVudE1hbmFnZXIuc3RvcHBlZE1vdXNl RG93bkV2ZW50LmZpcmUoZSl9Yi5zdG9wRXZlbnQoZS5icm93c2VyRXZlbnQpfX0s cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXtpZih0aGlzLmJyb3dzZXJFdmVudCl7 Yi5wcmV2ZW50RGVmYXVsdCh0aGlzLmJyb3dzZXJFdmVudCl9fSxzdG9wUHJvcGFn YXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKGUuYnJvd3NlckV2ZW50KXtp ZihlLmJyb3dzZXJFdmVudC50eXBlPT0ibW91c2Vkb3duIil7RXh0LkV2ZW50TWFu YWdlci5zdG9wcGVkTW91c2VEb3duRXZlbnQuZmlyZShlKX1iLnN0b3BQcm9wYWdh dGlvbihlLmJyb3dzZXJFdmVudCl9fSxnZXRDaGFyQ29kZTpmdW5jdGlvbigpe3Jl dHVybiB0aGlzLmNoYXJDb2RlfHx0aGlzLmtleUNvZGV9LGdldEtleTpmdW5jdGlv bigpe3JldHVybiB0aGlzLm5vcm1hbGl6ZUtleSh0aGlzLmtleUNvZGV8fHRoaXMu Y2hhckNvZGUpfSxub3JtYWxpemVLZXk6ZnVuY3Rpb24oZSl7cmV0dXJuIEV4dC5p c1NhZmFyaT8oYVtlXXx8ZSk6ZX0sZ2V0UGFnZVg6ZnVuY3Rpb24oKXtyZXR1cm4g dGhpcy54eVswXX0sZ2V0UGFnZVk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54eVsx XX0sZ2V0WFk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54eX0sZ2V0VGFyZ2V0OmZ1 bmN0aW9uKGcsaCxlKXtyZXR1cm4gZz9FeHQuZmx5KHRoaXMudGFyZ2V0KS5maW5k UGFyZW50KGcsaCxlKTooZT9FeHQuZ2V0KHRoaXMudGFyZ2V0KTp0aGlzLnRhcmdl dCl9LGdldFJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5icm93 c2VyRXZlbnQ/Yi5nZXRSZWxhdGVkVGFyZ2V0KHRoaXMuYnJvd3NlckV2ZW50KTpu dWxsfSxnZXRXaGVlbERlbHRhOmZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5icm93c2Vy RXZlbnQ7dmFyIGg9MDtpZihnLndoZWVsRGVsdGEpe2g9Zy53aGVlbERlbHRhLzEy MH1lbHNle2lmKGcuZGV0YWlsKXtoPS1nLmRldGFpbC8zfX1yZXR1cm4gaH0sd2l0 aGluOmZ1bmN0aW9uKGgsaSxlKXtpZihoKXt2YXIgZz10aGlzW2k/ImdldFJlbGF0 ZWRUYXJnZXQiOiJnZXRUYXJnZXQiXSgpO3JldHVybiBnJiYoKGU/KGc9PUV4dC5n ZXREb20oaCkpOmZhbHNlKXx8RXh0LmZseShoKS5jb250YWlucyhnKSl9cmV0dXJu IGZhbHNlfX07cmV0dXJuIG5ldyBFeHQuRXZlbnRPYmplY3RJbXBsKCl9KCk7RXh0 LkxvYWRlcj1FeHQuYXBwbHkoe30se2xvYWQ6ZnVuY3Rpb24oaixpLGssYyl7dmFy IGs9a3x8dGhpcyxnPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFk IilbMF0sYj1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksYT1qLmxl bmd0aCxoPTAsZT10aGlzO3ZhciBsPWZ1bmN0aW9uKG0pe2cuYXBwZW5kQ2hpbGQo ZS5idWlsZFNjcmlwdFRhZyhqW21dLGQpKX07dmFyIGQ9ZnVuY3Rpb24oKXtoKys7 aWYoYT09aCYmdHlwZW9mIGk9PSJmdW5jdGlvbiIpe2kuY2FsbChrKX1lbHNle2lm KGM9PT10cnVlKXtsKGgpfX19O2lmKGM9PT10cnVlKXtsLmNhbGwodGhpcywwKX1l bHNle0V4dC5lYWNoKGosZnVuY3Rpb24obixtKXtiLmFwcGVuZENoaWxkKHRoaXMu YnVpbGRTY3JpcHRUYWcobixkKSl9LHRoaXMpO2cuYXBwZW5kQ2hpbGQoYil9fSxi dWlsZFNjcmlwdFRhZzpmdW5jdGlvbihiLGMpe3ZhciBhPWRvY3VtZW50LmNyZWF0 ZUVsZW1lbnQoInNjcmlwdCIpO2EudHlwZT0idGV4dC9qYXZhc2NyaXB0IjthLnNy Yz1iO2lmKGEucmVhZHlTdGF0ZSl7YS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rp b24oKXtpZihhLnJlYWR5U3RhdGU9PSJsb2FkZWQifHxhLnJlYWR5U3RhdGU9PSJj b21wbGV0ZSIpe2Eub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7YygpfX19ZWxzZXth Lm9ubG9hZD1jfXJldHVybiBhfX0pO0V4dC5ucygiRXh0LmdyaWQiLCJFeHQubGlz dCIsIkV4dC5kZCIsIkV4dC50cmVlIiwiRXh0LmZvcm0iLCJFeHQubWVudSIsIkV4 dC5zdGF0ZSIsIkV4dC5sYXlvdXQuYm94T3ZlcmZsb3ciLCJFeHQuYXBwIiwiRXh0 LnV4IiwiRXh0LmNoYXJ0IiwiRXh0LmRpcmVjdCIsIkV4dC5zbGlkZXIiKTtFeHQu YXBwbHkoRXh0LGZ1bmN0aW9uKCl7dmFyIGM9RXh0LGE9MCxiPW51bGw7cmV0dXJu e2VtcHR5Rm46ZnVuY3Rpb24oKXt9LEJMQU5LX0lNQUdFX1VSTDpFeHQuaXNJRTZ8 fEV4dC5pc0lFN3x8RXh0LmlzQWlyPyJodHRwOi8vd3d3LmV4dGpzLmNvbS9zLmdp ZiI6ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBSUQvQU1EQXdB QUFBQ0g1QkFFQUFBQUFMQUFBQUFBQkFBRUFBQUlDUkFFQU93PT0iLGV4dGVuZFg6 ZnVuY3Rpb24oZCxlKXtyZXR1cm4gRXh0LmV4dGVuZChkLGUoZC5wcm90b3R5cGUp KX0sZ2V0RG9jOmZ1bmN0aW9uKCl7cmV0dXJuIEV4dC5nZXQoZG9jdW1lbnQpfSxu dW06ZnVuY3Rpb24oZSxkKXtlPU51bWJlcihFeHQuaXNFbXB0eShlKXx8RXh0Lmlz QXJyYXkoZSl8fHR5cGVvZiBlPT0iYm9vbGVhbiJ8fCh0eXBlb2YgZT09InN0cmlu ZyImJmUudHJpbSgpLmxlbmd0aD09MCk/TmFOOmUpO3JldHVybiBpc05hTihlKT9k OmV9LHZhbHVlOmZ1bmN0aW9uKGcsZCxlKXtyZXR1cm4gRXh0LmlzRW1wdHkoZyxl KT9kOmd9LGVzY2FwZVJlOmZ1bmN0aW9uKGQpe3JldHVybiBkLnJlcGxhY2UoLyhb LS4qKz9eJHt9KCl8W1xdXC9cXF0pL2csIlxcJDEiKX0sc2VxdWVuY2U6ZnVuY3Rp b24oaCxkLGcsZSl7aFtkXT1oW2RdLmNyZWF0ZVNlcXVlbmNlKGcsZSl9LGFkZEJl aGF2aW9yczpmdW5jdGlvbihpKXtpZighRXh0LmlzUmVhZHkpe0V4dC5vblJlYWR5 KGZ1bmN0aW9uKCl7RXh0LmFkZEJlaGF2aW9ycyhpKX0pfWVsc2V7dmFyIGU9e30s aCxkLGc7Zm9yKGQgaW4gaSl7aWYoKGg9ZC5zcGxpdCgiQCIpKVsxXSl7Zz1oWzBd O2lmKCFlW2ddKXtlW2ddPUV4dC5zZWxlY3QoZyl9ZVtnXS5vbihoWzFdLGlbZF0p fX1lPW51bGx9fSxnZXRTY3JvbGxCYXJXaWR0aDpmdW5jdGlvbihnKXtpZighRXh0 LmlzUmVhZHkpe3JldHVybiAwfWlmKGc9PT10cnVlfHxiPT09bnVsbCl7dmFyIGk9 RXh0LmdldEJvZHkoKS5jcmVhdGVDaGlsZCgnPGRpdiBjbGFzcz0ieC1oaWRlLW9m ZnNldHMiIHN0eWxlPSJ3aWR0aDoxMDBweDtoZWlnaHQ6NTBweDtvdmVyZmxvdzpo aWRkZW47Ij48ZGl2IHN0eWxlPSJoZWlnaHQ6MjAwcHg7Ij48L2Rpdj48L2Rpdj4n KSxoPWkuY2hpbGQoImRpdiIsdHJ1ZSk7dmFyIGU9aC5vZmZzZXRXaWR0aDtpLnNl dFN0eWxlKCJvdmVyZmxvdyIsKEV4dC5pc1dlYktpdHx8RXh0LmlzR2Vja28pPyJh dXRvIjoic2Nyb2xsIik7dmFyIGQ9aC5vZmZzZXRXaWR0aDtpLnJlbW92ZSgpO2I9 ZS1kKzJ9cmV0dXJuIGJ9LGNvbWJpbmU6ZnVuY3Rpb24oKXt2YXIgZz1hcmd1bWVu dHMsZT1nLmxlbmd0aCxqPVtdO2Zvcih2YXIgaD0wO2g8ZTtoKyspe3ZhciBkPWdb aF07aWYoRXh0LmlzQXJyYXkoZCkpe2o9ai5jb25jYXQoZCl9ZWxzZXtpZihkLmxl bmd0aCE9PXVuZGVmaW5lZCYmIWQuc3Vic3RyKXtqPWouY29uY2F0KEFycmF5LnBy b3RvdHlwZS5zbGljZS5jYWxsKGQsMCkpfWVsc2V7ai5wdXNoKGQpfX19cmV0dXJu IGp9LGNvcHlUbzpmdW5jdGlvbihkLGUsZyl7aWYodHlwZW9mIGc9PSJzdHJpbmci KXtnPWcuc3BsaXQoL1ssO1xzXS8pfUV4dC5lYWNoKGcsZnVuY3Rpb24oaCl7aWYo ZS5oYXNPd25Qcm9wZXJ0eShoKSl7ZFtoXT1lW2hdfX0sdGhpcyk7cmV0dXJuIGR9 LGRlc3Ryb3k6ZnVuY3Rpb24oKXtFeHQuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24o ZCl7aWYoZCl7aWYoRXh0LmlzQXJyYXkoZCkpe3RoaXMuZGVzdHJveS5hcHBseSh0 aGlzLGQpfWVsc2V7aWYodHlwZW9mIGQuZGVzdHJveT09ImZ1bmN0aW9uIil7ZC5k ZXN0cm95KCl9ZWxzZXtpZihkLmRvbSl7ZC5yZW1vdmUoKX19fX19LHRoaXMpfSxk ZXN0cm95TWVtYmVyczpmdW5jdGlvbihsLGosZyxoKXtmb3IodmFyIGs9MSxlPWFy Z3VtZW50cyxkPWUubGVuZ3RoO2s8ZDtrKyspe0V4dC5kZXN0cm95KGxbZVtrXV0p O2RlbGV0ZSBsW2Vba11dfX0sY2xlYW46ZnVuY3Rpb24oZCl7dmFyIGU9W107RXh0 LmVhY2goZCxmdW5jdGlvbihnKXtpZighIWcpe2UucHVzaChnKX19KTtyZXR1cm4g ZX0sdW5pcXVlOmZ1bmN0aW9uKGQpe3ZhciBlPVtdLGc9e307RXh0LmVhY2goZCxm dW5jdGlvbihoKXtpZighZ1toXSl7ZS5wdXNoKGgpfWdbaF09dHJ1ZX0pO3JldHVy biBlfSxmbGF0dGVuOmZ1bmN0aW9uKGQpe3ZhciBnPVtdO2Z1bmN0aW9uIGUoaCl7 RXh0LmVhY2goaCxmdW5jdGlvbihpKXtpZihFeHQuaXNBcnJheShpKSl7ZShpKX1l bHNle2cucHVzaChpKX19KTtyZXR1cm4gZ31yZXR1cm4gZShkKX0sbWluOmZ1bmN0 aW9uKGQsZSl7dmFyIGc9ZFswXTtlPWV8fGZ1bmN0aW9uKGksaCl7cmV0dXJuIGk8 aD8tMToxfTtFeHQuZWFjaChkLGZ1bmN0aW9uKGgpe2c9ZShnLGgpPT0tMT9nOmh9 KTtyZXR1cm4gZ30sbWF4OmZ1bmN0aW9uKGQsZSl7dmFyIGc9ZFswXTtlPWV8fGZ1 bmN0aW9uKGksaCl7cmV0dXJuIGk+aD8xOi0xfTtFeHQuZWFjaChkLGZ1bmN0aW9u KGgpe2c9ZShnLGgpPT0xP2c6aH0pO3JldHVybiBnfSxtZWFuOmZ1bmN0aW9uKGQp e3JldHVybiBkLmxlbmd0aD4wP0V4dC5zdW0oZCkvZC5sZW5ndGg6dW5kZWZpbmVk fSxzdW06ZnVuY3Rpb24oZCl7dmFyIGU9MDtFeHQuZWFjaChkLGZ1bmN0aW9uKGcp e2UrPWd9KTtyZXR1cm4gZX0scGFydGl0aW9uOmZ1bmN0aW9uKGQsZSl7dmFyIGc9 W1tdLFtdXTtFeHQuZWFjaChkLGZ1bmN0aW9uKGosayxoKXtnWyhlJiZlKGosayxo KSl8fCghZSYmaik/MDoxXS5wdXNoKGopfSk7cmV0dXJuIGd9LGludm9rZTpmdW5j dGlvbihkLGUpe3ZhciBoPVtdLGc9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwo YXJndW1lbnRzLDIpO0V4dC5lYWNoKGQsZnVuY3Rpb24oaixrKXtpZihqJiZ0eXBl b2YgaltlXT09ImZ1bmN0aW9uIil7aC5wdXNoKGpbZV0uYXBwbHkoaixnKSl9ZWxz ZXtoLnB1c2godW5kZWZpbmVkKX19KTtyZXR1cm4gaH0scGx1Y2s6ZnVuY3Rpb24o ZCxnKXt2YXIgZT1bXTtFeHQuZWFjaChkLGZ1bmN0aW9uKGgpe2UucHVzaChoW2dd KX0pO3JldHVybiBlfSx6aXA6ZnVuY3Rpb24oKXt2YXIgbj1FeHQucGFydGl0aW9u KGFyZ3VtZW50cyxmdW5jdGlvbihpKXtyZXR1cm4gdHlwZW9mIGkhPSJmdW5jdGlv biJ9KSxrPW5bMF0sbT1uWzFdWzBdLGQ9RXh0Lm1heChFeHQucGx1Y2soaywibGVu Z3RoIikpLGg9W107Zm9yKHZhciBsPTA7bDxkO2wrKyl7aFtsXT1bXTtpZihtKXto W2xdPW0uYXBwbHkobSxFeHQucGx1Y2soayxsKSl9ZWxzZXtmb3IodmFyIGc9MCxl PWsubGVuZ3RoO2c8ZTtnKyspe2hbbF0ucHVzaChrW2ddW2xdKX19fXJldHVybiBo fSxnZXRDbXA6ZnVuY3Rpb24oZCl7cmV0dXJuIEV4dC5Db21wb25lbnRNZ3IuZ2V0 KGQpfSx1c2VTaGltczpjLmlzSUU2fHwoYy5pc01hYyYmYy5pc0dlY2tvMiksdHlw ZTpmdW5jdGlvbihlKXtpZihlPT09dW5kZWZpbmVkfHxlPT09bnVsbCl7cmV0dXJu IGZhbHNlfWlmKGUuaHRtbEVsZW1lbnQpe3JldHVybiJlbGVtZW50In12YXIgZD10 eXBlb2YgZTtpZihkPT0ib2JqZWN0IiYmZS5ub2RlTmFtZSl7c3dpdGNoKGUubm9k ZVR5cGUpe2Nhc2UgMTpyZXR1cm4iZWxlbWVudCI7Y2FzZSAzOnJldHVybigvXFMv KS50ZXN0KGUubm9kZVZhbHVlKT8idGV4dG5vZGUiOiJ3aGl0ZXNwYWNlIn19aWYo ZD09Im9iamVjdCJ8fGQ9PSJmdW5jdGlvbiIpe3N3aXRjaChlLmNvbnN0cnVjdG9y KXtjYXNlIEFycmF5OnJldHVybiJhcnJheSI7Y2FzZSBSZWdFeHA6cmV0dXJuInJl Z2V4cCI7Y2FzZSBEYXRlOnJldHVybiJkYXRlIn1pZih0eXBlb2YgZS5sZW5ndGg9 PSJudW1iZXIiJiZ0eXBlb2YgZS5pdGVtPT0iZnVuY3Rpb24iKXtyZXR1cm4ibm9k ZWxpc3QifX1yZXR1cm4gZH0saW50ZXJjZXB0OmZ1bmN0aW9uKGgsZCxnLGUpe2hb ZF09aFtkXS5jcmVhdGVJbnRlcmNlcHRvcihnLGUpfSxjYWxsYmFjazpmdW5jdGlv bihkLGgsZyxlKXtpZih0eXBlb2YgZD09ImZ1bmN0aW9uIil7aWYoZSl7ZC5kZWZl cihlLGgsZ3x8W10pfWVsc2V7ZC5hcHBseShoLGd8fFtdKX19fX19KCkpO0V4dC5h cHBseShGdW5jdGlvbi5wcm90b3R5cGUse2NyZWF0ZVNlcXVlbmNlOmZ1bmN0aW9u KGIsYSl7dmFyIGM9dGhpcztyZXR1cm4odHlwZW9mIGIhPSJmdW5jdGlvbiIpP3Ro aXM6ZnVuY3Rpb24oKXt2YXIgZD1jLmFwcGx5KHRoaXN8fHdpbmRvdyxhcmd1bWVu dHMpO2IuYXBwbHkoYXx8dGhpc3x8d2luZG93LGFyZ3VtZW50cyk7cmV0dXJuIGR9 fX0pO0V4dC5hcHBseUlmKFN0cmluZyx7ZXNjYXBlOmZ1bmN0aW9uKGEpe3JldHVy biBhLnJlcGxhY2UoLygnfFxcKS9nLCJcXCQxIil9LGxlZnRQYWQ6ZnVuY3Rpb24o ZCxiLGMpe3ZhciBhPVN0cmluZyhkKTtpZighYyl7Yz0iICJ9d2hpbGUoYS5sZW5n dGg8Yil7YT1jK2F9cmV0dXJuIGF9fSk7U3RyaW5nLnByb3RvdHlwZS50b2dnbGU9 ZnVuY3Rpb24oYixhKXtyZXR1cm4gdGhpcz09Yj9hOmJ9O1N0cmluZy5wcm90b3R5 cGUudHJpbT1mdW5jdGlvbigpe3ZhciBhPS9eXHMrfFxzKyQvZztyZXR1cm4gZnVu Y3Rpb24oKXtyZXR1cm4gdGhpcy5yZXBsYWNlKGEsIiIpfX0oKTtEYXRlLnByb3Rv dHlwZS5nZXRFbGFwc2VkPWZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLmFicygoYXx8 bmV3IERhdGUoKSkuZ2V0VGltZSgpLXRoaXMuZ2V0VGltZSgpKX07RXh0LmFwcGx5 SWYoTnVtYmVyLnByb3RvdHlwZSx7Y29uc3RyYWluOmZ1bmN0aW9uKGIsYSl7cmV0 dXJuIE1hdGgubWluKE1hdGgubWF4KHRoaXMsYiksYSl9fSk7RXh0LmxpYi5Eb20u Z2V0UmVnaW9uPWZ1bmN0aW9uKGEpe3JldHVybiBFeHQubGliLlJlZ2lvbi5nZXRS ZWdpb24oYSl9O0V4dC5saWIuUmVnaW9uPWZ1bmN0aW9uKGQsZyxhLGMpe3ZhciBl PXRoaXM7ZS50b3A9ZDtlWzFdPWQ7ZS5yaWdodD1nO2UuYm90dG9tPWE7ZS5sZWZ0 PWM7ZVswXT1jfTtFeHQubGliLlJlZ2lvbi5wcm90b3R5cGU9e2NvbnRhaW5zOmZ1 bmN0aW9uKGIpe3ZhciBhPXRoaXM7cmV0dXJuKGIubGVmdD49YS5sZWZ0JiZiLnJp Z2h0PD1hLnJpZ2h0JiZiLnRvcD49YS50b3AmJmIuYm90dG9tPD1hLmJvdHRvbSl9 LGdldEFyZWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybigoYS5ib3R0b20t YS50b3ApKihhLnJpZ2h0LWEubGVmdCkpfSxpbnRlcnNlY3Q6ZnVuY3Rpb24oaCl7 dmFyIGc9dGhpcyxkPU1hdGgubWF4KGcudG9wLGgudG9wKSxlPU1hdGgubWluKGcu cmlnaHQsaC5yaWdodCksYT1NYXRoLm1pbihnLmJvdHRvbSxoLmJvdHRvbSksYz1N YXRoLm1heChnLmxlZnQsaC5sZWZ0KTtpZihhPj1kJiZlPj1jKXtyZXR1cm4gbmV3 IEV4dC5saWIuUmVnaW9uKGQsZSxhLGMpfX0sdW5pb246ZnVuY3Rpb24oaCl7dmFy IGc9dGhpcyxkPU1hdGgubWluKGcudG9wLGgudG9wKSxlPU1hdGgubWF4KGcucmln aHQsaC5yaWdodCksYT1NYXRoLm1heChnLmJvdHRvbSxoLmJvdHRvbSksYz1NYXRo Lm1pbihnLmxlZnQsaC5sZWZ0KTtyZXR1cm4gbmV3IEV4dC5saWIuUmVnaW9uKGQs ZSxhLGMpfSxjb25zdHJhaW5UbzpmdW5jdGlvbihiKXt2YXIgYT10aGlzO2EudG9w PWEudG9wLmNvbnN0cmFpbihiLnRvcCxiLmJvdHRvbSk7YS5ib3R0b209YS5ib3R0 b20uY29uc3RyYWluKGIudG9wLGIuYm90dG9tKTthLmxlZnQ9YS5sZWZ0LmNvbnN0 cmFpbihiLmxlZnQsYi5yaWdodCk7YS5yaWdodD1hLnJpZ2h0LmNvbnN0cmFpbihi LmxlZnQsYi5yaWdodCk7cmV0dXJuIGF9LGFkanVzdDpmdW5jdGlvbihkLGMsYSxn KXt2YXIgZT10aGlzO2UudG9wKz1kO2UubGVmdCs9YztlLnJpZ2h0Kz1nO2UuYm90 dG9tKz1hO3JldHVybiBlfX07RXh0LmxpYi5SZWdpb24uZ2V0UmVnaW9uPWZ1bmN0 aW9uKGUpe3ZhciBoPUV4dC5saWIuRG9tLmdldFhZKGUpLGQ9aFsxXSxnPWhbMF0r ZS5vZmZzZXRXaWR0aCxhPWhbMV0rZS5vZmZzZXRIZWlnaHQsYz1oWzBdO3JldHVy biBuZXcgRXh0LmxpYi5SZWdpb24oZCxnLGEsYyl9O0V4dC5saWIuUG9pbnQ9ZnVu Y3Rpb24oYSxjKXtpZihFeHQuaXNBcnJheShhKSl7Yz1hWzFdO2E9YVswXX12YXIg Yj10aGlzO2IueD1iLnJpZ2h0PWIubGVmdD1iWzBdPWE7Yi55PWIudG9wPWIuYm90 dG9tPWJbMV09Y307RXh0LmxpYi5Qb2ludC5wcm90b3R5cGU9bmV3IEV4dC5saWIu UmVnaW9uKCk7RXh0LmFwcGx5KEV4dC5Eb21IZWxwZXIsZnVuY3Rpb24oKXt2YXIg ZSxhPSJhZnRlcmJlZ2luIixoPSJhZnRlcmVuZCIsaT0iYmVmb3JlYmVnaW4iLGQ9 ImJlZm9yZWVuZCIsYj0vdGFnfGNoaWxkcmVufGNufGh0bWwkL2k7ZnVuY3Rpb24g ZyhtLHAsbixxLGwsail7bT1FeHQuZ2V0RG9tKG0pO3ZhciBrO2lmKGUudXNlRG9t KXtrPWMocCxudWxsKTtpZihqKXttLmFwcGVuZENoaWxkKGspfWVsc2V7KGw9PSJm aXJzdENoaWxkIj9tOm0ucGFyZW50Tm9kZSkuaW5zZXJ0QmVmb3JlKGssbVtsXXx8 bSl9fWVsc2V7az1FeHQuRG9tSGVscGVyLmluc2VydEh0bWwocSxtLEV4dC5Eb21I ZWxwZXIuY3JlYXRlSHRtbChwKSl9cmV0dXJuIG4/RXh0LmdldChrLHRydWUpOmt9 ZnVuY3Rpb24gYyhqLHIpe3ZhciBrLHU9ZG9jdW1lbnQscCxzLG0sdDtpZihFeHQu aXNBcnJheShqKSl7az11LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IodmFy IHE9MCxuPWoubGVuZ3RoO3E8bjtxKyspe2MoaltxXSxrKX19ZWxzZXtpZih0eXBl b2Ygaj09InN0cmluZyIpe2s9dS5jcmVhdGVUZXh0Tm9kZShqKX1lbHNle2s9dS5j cmVhdGVFbGVtZW50KGoudGFnfHwiZGl2Iik7cD0hIWsuc2V0QXR0cmlidXRlO2Zv cih2YXIgcyBpbiBqKXtpZighYi50ZXN0KHMpKXttPWpbc107aWYocz09ImNscyIp e2suY2xhc3NOYW1lPW19ZWxzZXtpZihwKXtrLnNldEF0dHJpYnV0ZShzLG0pfWVs c2V7a1tzXT1tfX19fUV4dC5Eb21IZWxwZXIuYXBwbHlTdHlsZXMoayxqLnN0eWxl KTtpZigodD1qLmNoaWxkcmVufHxqLmNuKSl7Yyh0LGspfWVsc2V7aWYoai5odG1s KXtrLmlubmVySFRNTD1qLmh0bWx9fX19aWYocil7ci5hcHBlbmRDaGlsZChrKX1y ZXR1cm4ga31lPXtjcmVhdGVUZW1wbGF0ZTpmdW5jdGlvbihrKXt2YXIgaj1FeHQu RG9tSGVscGVyLmNyZWF0ZUh0bWwoayk7cmV0dXJuIG5ldyBFeHQuVGVtcGxhdGUo ail9LHVzZURvbTpmYWxzZSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24oaixsLGspe3Jl dHVybiBnKGosbCxrLGkpfSxpbnNlcnRBZnRlcjpmdW5jdGlvbihqLGwsayl7cmV0 dXJuIGcoaixsLGssaCwibmV4dFNpYmxpbmciKX0saW5zZXJ0Rmlyc3Q6ZnVuY3Rp b24oaixsLGspe3JldHVybiBnKGosbCxrLGEsImZpcnN0Q2hpbGQiKX0sYXBwZW5k OmZ1bmN0aW9uKGosbCxrKXtyZXR1cm4gZyhqLGwsayxkLCIiLHRydWUpfSxjcmVh dGVEb206Y307cmV0dXJuIGV9KCkpO0V4dC5hcHBseShFeHQuVGVtcGxhdGUucHJv dG90eXBlLHtkaXNhYmxlRm9ybWF0czpmYWxzZSxyZTovXHsoW1x3XC1dKykoPzpc OihbXHdcLl0qKSg/OlwoKC4qPyk/XCkpPyk/XH0vZyxhcmdzUmU6L15ccypbJyJd KC4qKVsiJ11ccyokLyxjb21waWxlQVJlOi9cXC9nLGNvbXBpbGVCUmU6Lyhcclxu fFxuKS9nLGNvbXBpbGVDUmU6LycvZyxhcHBseVRlbXBsYXRlOmZ1bmN0aW9uKGIp e3ZhciBnPXRoaXMsYT1nLmRpc2FibGVGb3JtYXRzIT09dHJ1ZSxlPUV4dC51dGls LkZvcm1hdCxjPWc7aWYoZy5jb21waWxlZCl7cmV0dXJuIGcuY29tcGlsZWQoYil9 ZnVuY3Rpb24gZChqLGwscCxrKXtpZihwJiZhKXtpZihwLnN1YnN0cigwLDUpPT0i dGhpcy4iKXtyZXR1cm4gYy5jYWxsKHAuc3Vic3RyKDUpLGJbbF0sYil9ZWxzZXtp ZihrKXt2YXIgbz1nLmFyZ3NSZTtrPWsuc3BsaXQoIiwiKTtmb3IodmFyIG49MCxo PWsubGVuZ3RoO248aDtuKyspe2tbbl09a1tuXS5yZXBsYWNlKG8sIiQxIil9az1b YltsXV0uY29uY2F0KGspfWVsc2V7az1bYltsXV19cmV0dXJuIGVbcF0uYXBwbHko ZSxrKX19ZWxzZXtyZXR1cm4gYltsXSE9PXVuZGVmaW5lZD9iW2xdOiIifX1yZXR1 cm4gZy5odG1sLnJlcGxhY2UoZy5yZSxkKX0sY29tcGlsZTpmdW5jdGlvbigpe3Zh ciBtZT10aGlzLGZtPUV4dC51dGlsLkZvcm1hdCx1c2VGPW1lLmRpc2FibGVGb3Jt YXRzIT09dHJ1ZSxzZXA9RXh0LmlzR2Vja28/IisiOiIsIixib2R5O2Z1bmN0aW9u IGZuKG0sbmFtZSxmb3JtYXQsYXJncyl7aWYoZm9ybWF0JiZ1c2VGKXthcmdzPWFy Z3M/IiwiK2FyZ3M6IiI7aWYoZm9ybWF0LnN1YnN0cigwLDUpIT0idGhpcy4iKXtm b3JtYXQ9ImZtLiIrZm9ybWF0KyIoIn1lbHNle2Zvcm1hdD0ndGhpcy5jYWxsKCIn K2Zvcm1hdC5zdWJzdHIoNSkrJyIsICc7YXJncz0iLCB2YWx1ZXMifX1lbHNle2Fy Z3M9IiI7Zm9ybWF0PSIodmFsdWVzWyciK25hbWUrIiddID09IHVuZGVmaW5lZCA/ ICcnIDogIn1yZXR1cm4iJyIrc2VwK2Zvcm1hdCsidmFsdWVzWyciK25hbWUrIidd IithcmdzKyIpIitzZXArIicifWlmKEV4dC5pc0dlY2tvKXtib2R5PSJ0aGlzLmNv bXBpbGVkID0gZnVuY3Rpb24odmFsdWVzKXsgcmV0dXJuICciK21lLmh0bWwucmVw bGFjZShtZS5jb21waWxlQVJlLCJcXFxcIikucmVwbGFjZShtZS5jb21waWxlQlJl LCJcXG4iKS5yZXBsYWNlKG1lLmNvbXBpbGVDUmUsIlxcJyIpLnJlcGxhY2UobWUu cmUsZm4pKyInO307In1lbHNle2JvZHk9WyJ0aGlzLmNvbXBpbGVkID0gZnVuY3Rp b24odmFsdWVzKXsgcmV0dXJuIFsnIl07Ym9keS5wdXNoKG1lLmh0bWwucmVwbGFj ZShtZS5jb21waWxlQVJlLCJcXFxcIikucmVwbGFjZShtZS5jb21waWxlQlJlLCJc XG4iKS5yZXBsYWNlKG1lLmNvbXBpbGVDUmUsIlxcJyIpLnJlcGxhY2UobWUucmUs Zm4pKTtib2R5LnB1c2goIiddLmpvaW4oJycpO307Iik7Ym9keT1ib2R5LmpvaW4o IiIpfWV2YWwoYm9keSk7cmV0dXJuIG1lfSxjYWxsOmZ1bmN0aW9uKGMsYixhKXty ZXR1cm4gdGhpc1tjXShiLGEpfX0pO0V4dC5UZW1wbGF0ZS5wcm90b3R5cGUuYXBw bHk9RXh0LlRlbXBsYXRlLnByb3RvdHlwZS5hcHBseVRlbXBsYXRlO0V4dC51dGls LkZ1bmN0aW9ucz17Y3JlYXRlSW50ZXJjZXB0b3I6ZnVuY3Rpb24oYyxiLGEpe3Zh ciBkPWM7aWYoIUV4dC5pc0Z1bmN0aW9uKGIpKXtyZXR1cm4gY31lbHNle3JldHVy biBmdW5jdGlvbigpe3ZhciBnPXRoaXMsZT1hcmd1bWVudHM7Yi50YXJnZXQ9Zzti Lm1ldGhvZD1jO3JldHVybihiLmFwcGx5KGF8fGd8fHdpbmRvdyxlKSE9PWZhbHNl KT9jLmFwcGx5KGd8fHdpbmRvdyxlKTpudWxsfX19LGNyZWF0ZURlbGVnYXRlOmZ1 bmN0aW9uKGMsZCxiLGEpe2lmKCFFeHQuaXNGdW5jdGlvbihjKSl7cmV0dXJuIGN9 cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9Ynx8YXJndW1lbnRzO2lmKGE9PT10cnVl KXtnPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtnPWcu Y29uY2F0KGIpfWVsc2V7aWYoRXh0LmlzTnVtYmVyKGEpKXtnPUFycmF5LnByb3Rv dHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTt2YXIgZT1bYSwwXS5jb25jYXQo Yik7QXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShnLGUpfX1yZXR1cm4gYy5h cHBseShkfHx3aW5kb3csZyl9fSxkZWZlcjpmdW5jdGlvbihkLGMsZSxiLGEpe2Q9 RXh0LnV0aWwuRnVuY3Rpb25zLmNyZWF0ZURlbGVnYXRlKGQsZSxiLGEpO2lmKGM+ MCl7cmV0dXJuIHNldFRpbWVvdXQoZCxjKX1kKCk7cmV0dXJuIDB9LGNyZWF0ZVNl cXVlbmNlOmZ1bmN0aW9uKGMsYixhKXtpZighRXh0LmlzRnVuY3Rpb24oYikpe3Jl dHVybiBjfWVsc2V7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGQ9Yy5hcHBseSh0aGlz fHx3aW5kb3csYXJndW1lbnRzKTtiLmFwcGx5KGF8fHRoaXN8fHdpbmRvdyxhcmd1 bWVudHMpO3JldHVybiBkfX19fTtFeHQuZGVmZXI9RXh0LnV0aWwuRnVuY3Rpb25z LmRlZmVyO0V4dC5jcmVhdGVJbnRlcmNlcHRvcj1FeHQudXRpbC5GdW5jdGlvbnMu Y3JlYXRlSW50ZXJjZXB0b3I7RXh0LmNyZWF0ZVNlcXVlbmNlPUV4dC51dGlsLkZ1 bmN0aW9ucy5jcmVhdGVTZXF1ZW5jZTtFeHQuY3JlYXRlRGVsZWdhdGU9RXh0LnV0 aWwuRnVuY3Rpb25zLmNyZWF0ZURlbGVnYXRlO0V4dC5hcHBseShFeHQudXRpbC5P YnNlcnZhYmxlLnByb3RvdHlwZSxmdW5jdGlvbigpe2Z1bmN0aW9uIGEoail7dmFy IGk9KHRoaXMubWV0aG9kRXZlbnRzPXRoaXMubWV0aG9kRXZlbnRzfHx7fSlbal0s ZCxjLGcsaD10aGlzO2lmKCFpKXt0aGlzLm1ldGhvZEV2ZW50c1tqXT1pPXt9O2ku b3JpZ2luYWxGbj10aGlzW2pdO2kubWV0aG9kTmFtZT1qO2kuYmVmb3JlPVtdO2ku YWZ0ZXI9W107dmFyIGI9ZnVuY3Rpb24obCxrLGUpe2lmKChjPWwuYXBwbHkoa3x8 aCxlKSkhPT11bmRlZmluZWQpe2lmKHR5cGVvZiBjPT0ib2JqZWN0Iil7aWYoYy5y ZXR1cm5WYWx1ZSE9PXVuZGVmaW5lZCl7ZD1jLnJldHVyblZhbHVlfWVsc2V7ZD1j fWc9ISFjLmNhbmNlbH1lbHNle2lmKGM9PT1mYWxzZSl7Zz10cnVlfWVsc2V7ZD1j fX19fTt0aGlzW2pdPWZ1bmN0aW9uKCl7dmFyIGw9QXJyYXkucHJvdG90eXBlLnNs aWNlLmNhbGwoYXJndW1lbnRzLDApLGs7ZD1jPXVuZGVmaW5lZDtnPWZhbHNlO2Zv cih2YXIgbT0wLGU9aS5iZWZvcmUubGVuZ3RoO208ZTttKyspe2s9aS5iZWZvcmVb bV07YihrLmZuLGsuc2NvcGUsbCk7aWYoZyl7cmV0dXJuIGR9fWlmKChjPWkub3Jp Z2luYWxGbi5hcHBseShoLGwpKSE9PXVuZGVmaW5lZCl7ZD1jfWZvcih2YXIgbT0w LGU9aS5hZnRlci5sZW5ndGg7bTxlO20rKyl7az1pLmFmdGVyW21dO2Ioay5mbixr LnNjb3BlLGwpO2lmKGcpe3JldHVybiBkfX1yZXR1cm4gZH19cmV0dXJuIGl9cmV0 dXJue2JlZm9yZU1ldGhvZDpmdW5jdGlvbihkLGMsYil7YS5jYWxsKHRoaXMsZCku YmVmb3JlLnB1c2goe2ZuOmMsc2NvcGU6Yn0pfSxhZnRlck1ldGhvZDpmdW5jdGlv bihkLGMsYil7YS5jYWxsKHRoaXMsZCkuYWZ0ZXIucHVzaCh7Zm46YyxzY29wZTpi fSl9LHJlbW92ZU1ldGhvZExpc3RlbmVyOmZ1bmN0aW9uKGosZyxkKXt2YXIgaD10 aGlzLmdldE1ldGhvZEV2ZW50KGopO2Zvcih2YXIgYz0wLGI9aC5iZWZvcmUubGVu Z3RoO2M8YjtjKyspe2lmKGguYmVmb3JlW2NdLmZuPT1nJiZoLmJlZm9yZVtjXS5z Y29wZT09ZCl7aC5iZWZvcmUuc3BsaWNlKGMsMSk7cmV0dXJufX1mb3IodmFyIGM9 MCxiPWguYWZ0ZXIubGVuZ3RoO2M8YjtjKyspe2lmKGguYWZ0ZXJbY10uZm49PWcm JmguYWZ0ZXJbY10uc2NvcGU9PWQpe2guYWZ0ZXIuc3BsaWNlKGMsMSk7cmV0dXJu fX19LHJlbGF5RXZlbnRzOmZ1bmN0aW9uKGosZSl7dmFyIGg9dGhpcztmdW5jdGlv biBnKGkpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBoLmZpcmVFdmVudC5hcHBs eShoLFtpXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1l bnRzLDApKSl9fWZvcih2YXIgZD0wLGI9ZS5sZW5ndGg7ZDxiO2QrKyl7dmFyIGM9 ZVtkXTtoLmV2ZW50c1tjXT1oLmV2ZW50c1tjXXx8dHJ1ZTtqLm9uKGMsZyhjKSxo KX19LGVuYWJsZUJ1YmJsZTpmdW5jdGlvbihlKXt2YXIgZz10aGlzO2lmKCFFeHQu aXNFbXB0eShlKSl7ZT1FeHQuaXNBcnJheShlKT9lOkFycmF5LnByb3RvdHlwZS5z bGljZS5jYWxsKGFyZ3VtZW50cywwKTtmb3IodmFyIGQ9MCxiPWUubGVuZ3RoO2Q8 YjtkKyspe3ZhciBjPWVbZF07Yz1jLnRvTG93ZXJDYXNlKCk7dmFyIGg9Zy5ldmVu dHNbY118fHRydWU7aWYodHlwZW9mIGg9PSJib29sZWFuIil7aD1uZXcgRXh0LnV0 aWwuRXZlbnQoZyxjKTtnLmV2ZW50c1tjXT1ofWguYnViYmxlPXRydWV9fX19fSgp KTtFeHQudXRpbC5PYnNlcnZhYmxlLmNhcHR1cmU9ZnVuY3Rpb24oYyxiLGEpe2Mu ZmlyZUV2ZW50PWMuZmlyZUV2ZW50LmNyZWF0ZUludGVyY2VwdG9yKGIsYSl9O0V4 dC51dGlsLk9ic2VydmFibGUub2JzZXJ2ZUNsYXNzPWZ1bmN0aW9uKGIsYSl7aWYo Yil7aWYoIWIuZmlyZUV2ZW50KXtFeHQuYXBwbHkoYixuZXcgRXh0LnV0aWwuT2Jz ZXJ2YWJsZSgpKTtFeHQudXRpbC5PYnNlcnZhYmxlLmNhcHR1cmUoYi5wcm90b3R5 cGUsYi5maXJlRXZlbnQsYil9aWYodHlwZW9mIGE9PSJvYmplY3QiKXtiLm9uKGEp fXJldHVybiBifX07RXh0LmFwcGx5KEV4dC5FdmVudE1hbmFnZXIsZnVuY3Rpb24o KXt2YXIgZCxrLGcsYixhPUV4dC5saWIuRG9tLGo9L14oPzpzY29wZXxkZWxheXxi dWZmZXJ8c2luZ2xlfHN0b3BFdmVudHxwcmV2ZW50RGVmYXVsdHxzdG9wUHJvcGFn YXRpb258bm9ybWFsaXplZHxhcmdzfGRlbGVnYXRlKSQvLGM9RXh0LkV2ZW50TWFu YWdlci5fdW5sb2FkLGk9MCxoPTAsZT1FeHQuaXNXZWJLaXQ/RXh0Lm51bShuYXZp Z2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvKFxkKykvKVsxXSk+ PTUyNTohKChFeHQuaXNHZWNrbyYmIUV4dC5pc1dpbmRvd3MpfHxFeHQuaXNPcGVy YSk7cmV0dXJue191bmxvYWQ6ZnVuY3Rpb24oKXtFeHQuRXZlbnRNYW5hZ2VyLnVu KHdpbmRvdywicmVzaXplIix0aGlzLmZpcmVXaW5kb3dSZXNpemUsdGhpcyk7Yy5j YWxsKEV4dC5FdmVudE1hbmFnZXIpfSxkb1Jlc2l6ZUV2ZW50OmZ1bmN0aW9uKCl7 dmFyIG09YS5nZXRWaWV3SGVpZ2h0KCksbD1hLmdldFZpZXdXaWR0aCgpO2lmKGgh PW18fGkhPWwpe2QuZmlyZShpPWwsaD1tKX19LG9uV2luZG93UmVzaXplOmZ1bmN0 aW9uKG4sbSxsKXtpZighZCl7ZD1uZXcgRXh0LnV0aWwuRXZlbnQoKTtrPW5ldyBF eHQudXRpbC5EZWxheWVkVGFzayh0aGlzLmRvUmVzaXplRXZlbnQpO0V4dC5FdmVu dE1hbmFnZXIub24od2luZG93LCJyZXNpemUiLHRoaXMuZmlyZVdpbmRvd1Jlc2l6 ZSx0aGlzKX1kLmFkZExpc3RlbmVyKG4sbSxsKX0sZmlyZVdpbmRvd1Jlc2l6ZTpm dW5jdGlvbigpe2lmKGQpe2suZGVsYXkoMTAwKX19LG9uVGV4dFJlc2l6ZTpmdW5j dGlvbihvLG4sbCl7aWYoIWcpe2c9bmV3IEV4dC51dGlsLkV2ZW50KCk7dmFyIG09 bmV3IEV4dC5FbGVtZW50KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTtt LmRvbS5jbGFzc05hbWU9IngtdGV4dC1yZXNpemUiO20uZG9tLmlubmVySFRNTD0i WCI7bS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtiPW0uZG9tLm9mZnNldEhlaWdo dDtzZXRJbnRlcnZhbChmdW5jdGlvbigpe2lmKG0uZG9tLm9mZnNldEhlaWdodCE9 Yil7Zy5maXJlKGIsYj1tLmRvbS5vZmZzZXRIZWlnaHQpfX0sdGhpcy50ZXh0UmVz aXplSW50ZXJ2YWwpfWcuYWRkTGlzdGVuZXIobyxuLGwpfSxyZW1vdmVSZXNpemVM aXN0ZW5lcjpmdW5jdGlvbihtLGwpe2lmKGQpe2QucmVtb3ZlTGlzdGVuZXIobSxs KX19LGZpcmVSZXNpemU6ZnVuY3Rpb24oKXtpZihkKXtkLmZpcmUoYS5nZXRWaWV3 V2lkdGgoKSxhLmdldFZpZXdIZWlnaHQoKSl9fSx0ZXh0UmVzaXplSW50ZXJ2YWw6 NTAsaWVEZWZlclNyYzpmYWxzZSxnZXRLZXlFdmVudDpmdW5jdGlvbigpe3JldHVy biBlPyJrZXlkb3duIjoia2V5cHJlc3MifSx1c2VLZXlkb3duOmV9fSgpKTtFeHQu RXZlbnRNYW5hZ2VyLm9uPUV4dC5FdmVudE1hbmFnZXIuYWRkTGlzdGVuZXI7RXh0 LmFwcGx5KEV4dC5FdmVudE9iamVjdEltcGwucHJvdG90eXBlLHtCQUNLU1BBQ0U6 OCxUQUI6OSxOVU1fQ0VOVEVSOjEyLEVOVEVSOjEzLFJFVFVSTjoxMyxTSElGVDox NixDVFJMOjE3LENPTlRST0w6MTcsQUxUOjE4LFBBVVNFOjE5LENBUFNfTE9DSzoy MCxFU0M6MjcsU1BBQ0U6MzIsUEFHRV9VUDozMyxQQUdFVVA6MzMsUEFHRV9ET1dO OjM0LFBBR0VET1dOOjM0LEVORDozNSxIT01FOjM2LExFRlQ6MzcsVVA6MzgsUklH SFQ6MzksRE9XTjo0MCxQUklOVF9TQ1JFRU46NDQsSU5TRVJUOjQ1LERFTEVURTo0 NixaRVJPOjQ4LE9ORTo0OSxUV086NTAsVEhSRUU6NTEsRk9VUjo1MixGSVZFOjUz LFNJWDo1NCxTRVZFTjo1NSxFSUdIVDo1NixOSU5FOjU3LEE6NjUsQjo2NixDOjY3 LEQ6NjgsRTo2OSxGOjcwLEc6NzEsSDo3MixJOjczLEo6NzQsSzo3NSxMOjc2LE06 NzcsTjo3OCxPOjc5LFA6ODAsUTo4MSxSOjgyLFM6ODMsVDo4NCxVOjg1LFY6ODYs Vzo4NyxYOjg4LFk6ODksWjo5MCxDT05URVhUX01FTlU6OTMsTlVNX1pFUk86OTYs TlVNX09ORTo5NyxOVU1fVFdPOjk4LE5VTV9USFJFRTo5OSxOVU1fRk9VUjoxMDAs TlVNX0ZJVkU6MTAxLE5VTV9TSVg6MTAyLE5VTV9TRVZFTjoxMDMsTlVNX0VJR0hU OjEwNCxOVU1fTklORToxMDUsTlVNX01VTFRJUExZOjEwNixOVU1fUExVUzoxMDcs TlVNX01JTlVTOjEwOSxOVU1fUEVSSU9EOjExMCxOVU1fRElWSVNJT046MTExLEYx OjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxG ODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLGlzTmF2S2V5UHJl c3M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGE9dGhpcy5ub3JtYWxpemVLZXkoYi5r ZXlDb2RlKTtyZXR1cm4oYT49MzMmJmE8PTQwKXx8YT09Yi5SRVRVUk58fGE9PWIu VEFCfHxhPT1iLkVTQ30saXNTcGVjaWFsS2V5OmZ1bmN0aW9uKCl7dmFyIGE9dGhp cy5ub3JtYWxpemVLZXkodGhpcy5rZXlDb2RlKTtyZXR1cm4odGhpcy50eXBlPT0i a2V5cHJlc3MiJiZ0aGlzLmN0cmxLZXkpfHx0aGlzLmlzTmF2S2V5UHJlc3MoKXx8 KGE9PXRoaXMuQkFDS1NQQUNFKXx8KGE+PTE2JiZhPD0yMCl8fChhPj00NCYmYTw9 NDYpfSxnZXRQb2ludDpmdW5jdGlvbigpe3JldHVybiBuZXcgRXh0LmxpYi5Qb2lu dCh0aGlzLnh5WzBdLHRoaXMueHlbMV0pfSxoYXNNb2RpZmllcjpmdW5jdGlvbigp e3JldHVybigodGhpcy5jdHJsS2V5fHx0aGlzLmFsdEtleSl8fHRoaXMuc2hpZnRL ZXkpfX0pO0V4dC5FbGVtZW50LmFkZE1ldGhvZHMoe3N3YWxsb3dFdmVudDpmdW5j dGlvbihhLGIpe3ZhciBkPXRoaXM7ZnVuY3Rpb24gYyhnKXtnLnN0b3BQcm9wYWdh dGlvbigpO2lmKGIpe2cucHJldmVudERlZmF1bHQoKX19aWYoRXh0LmlzQXJyYXko YSkpe0V4dC5lYWNoKGEsZnVuY3Rpb24oZyl7ZC5vbihnLGMpfSk7cmV0dXJuIGR9 ZC5vbihhLGMpO3JldHVybiBkfSxyZWxheUV2ZW50OmZ1bmN0aW9uKGEsYil7dGhp cy5vbihhLGZ1bmN0aW9uKGMpe2IuZmlyZUV2ZW50KGEsYyl9KX0sY2xlYW46ZnVu Y3Rpb24oYil7dmFyIGQ9dGhpcyxlPWQuZG9tLGc9ZS5maXJzdENoaWxkLGM9LTE7 aWYoRXh0LkVsZW1lbnQuZGF0YShlLCJpc0NsZWFuZWQiKSYmYiE9PXRydWUpe3Jl dHVybiBkfXdoaWxlKGcpe3ZhciBhPWcubmV4dFNpYmxpbmc7aWYoZy5ub2RlVHlw ZT09MyYmISgvXFMvLnRlc3QoZy5ub2RlVmFsdWUpKSl7ZS5yZW1vdmVDaGlsZChn KX1lbHNle2cubm9kZUluZGV4PSsrY31nPWF9RXh0LkVsZW1lbnQuZGF0YShlLCJp c0NsZWFuZWQiLHRydWUpO3JldHVybiBkfSxsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9 dGhpcy5nZXRVcGRhdGVyKCk7YS51cGRhdGUuYXBwbHkoYSxhcmd1bWVudHMpO3Jl dHVybiB0aGlzfSxnZXRVcGRhdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXBk YXRlTWFuYWdlcnx8KHRoaXMudXBkYXRlTWFuYWdlcj1uZXcgRXh0LlVwZGF0ZXIo dGhpcykpfSx1cGRhdGU6ZnVuY3Rpb24oaHRtbCxsb2FkU2NyaXB0cyxjYWxsYmFj ayl7aWYoIXRoaXMuZG9tKXtyZXR1cm4gdGhpc31odG1sPWh0bWx8fCIiO2lmKGxv YWRTY3JpcHRzIT09dHJ1ZSl7dGhpcy5kb20uaW5uZXJIVE1MPWh0bWw7aWYodHlw ZW9mIGNhbGxiYWNrPT0iZnVuY3Rpb24iKXtjYWxsYmFjaygpfXJldHVybiB0aGlz fXZhciBpZD1FeHQuaWQoKSxkb209dGhpcy5kb207aHRtbCs9JzxzcGFuIGlkPSIn K2lkKyciPjwvc3Bhbj4nO0V4dC5saWIuRXZlbnQub25BdmFpbGFibGUoaWQsZnVu Y3Rpb24oKXt2YXIgRE9DPWRvY3VtZW50LGhkPURPQy5nZXRFbGVtZW50c0J5VGFn TmFtZSgiaGVhZCIpWzBdLHJlPS8oPzo8c2NyaXB0KFtePl0qKT8+KSgoXG58XHJ8 LikqPykoPzo8XC9zY3JpcHQ+KS9pZyxzcmNSZT0vXHNzcmM9KFtcJ1wiXSkoLio/ KVwxL2ksdHlwZVJlPS9cc3R5cGU9KFtcJ1wiXSkoLio/KVwxL2ksbWF0Y2gsYXR0 cnMsc3JjTWF0Y2gsdHlwZU1hdGNoLGVsLHM7d2hpbGUoKG1hdGNoPXJlLmV4ZWMo aHRtbCkpKXthdHRycz1tYXRjaFsxXTtzcmNNYXRjaD1hdHRycz9hdHRycy5tYXRj aChzcmNSZSk6ZmFsc2U7aWYoc3JjTWF0Y2gmJnNyY01hdGNoWzJdKXtzPURPQy5j cmVhdGVFbGVtZW50KCJzY3JpcHQiKTtzLnNyYz1zcmNNYXRjaFsyXTt0eXBlTWF0 Y2g9YXR0cnMubWF0Y2godHlwZVJlKTtpZih0eXBlTWF0Y2gmJnR5cGVNYXRjaFsy XSl7cy50eXBlPXR5cGVNYXRjaFsyXX1oZC5hcHBlbmRDaGlsZChzKX1lbHNle2lm KG1hdGNoWzJdJiZtYXRjaFsyXS5sZW5ndGg+MCl7aWYod2luZG93LmV4ZWNTY3Jp cHQpe3dpbmRvdy5leGVjU2NyaXB0KG1hdGNoWzJdKX1lbHNle3dpbmRvdy5ldmFs KG1hdGNoWzJdKX19fX1lbD1ET0MuZ2V0RWxlbWVudEJ5SWQoaWQpO2lmKGVsKXtF eHQucmVtb3ZlTm9kZShlbCl9aWYodHlwZW9mIGNhbGxiYWNrPT0iZnVuY3Rpb24i KXtjYWxsYmFjaygpfX0pO2RvbS5pbm5lckhUTUw9aHRtbC5yZXBsYWNlKC8oPzo8 c2NyaXB0Lio/PikoKFxufFxyfC4pKj8pKD86PFwvc2NyaXB0PikvaWcsIiIpO3Jl dHVybiB0aGlzfSxyZW1vdmVBbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLnJl bW92ZUFuY2hvcigpO0V4dC5FdmVudE1hbmFnZXIucmVtb3ZlQWxsKHRoaXMuZG9t KTtyZXR1cm4gdGhpc30sY3JlYXRlUHJveHk6ZnVuY3Rpb24oYSxlLGQpe2E9KHR5 cGVvZiBhPT0ib2JqZWN0Iik/YTp7dGFnOiJkaXYiLGNsczphfTt2YXIgYz10aGlz LGI9ZT9FeHQuRG9tSGVscGVyLmFwcGVuZChlLGEsdHJ1ZSk6RXh0LkRvbUhlbHBl ci5pbnNlcnRCZWZvcmUoYy5kb20sYSx0cnVlKTtpZihkJiZjLnNldEJveCYmYy5n ZXRCb3gpe2Iuc2V0Qm94KGMuZ2V0Qm94KCkpfXJldHVybiBifX0pO0V4dC5FbGVt ZW50LnByb3RvdHlwZS5nZXRVcGRhdGVNYW5hZ2VyPUV4dC5FbGVtZW50LnByb3Rv dHlwZS5nZXRVcGRhdGVyO0V4dC5FbGVtZW50LmFkZE1ldGhvZHMoe2dldEFuY2hv clhZOmZ1bmN0aW9uKGUsbCxxKXtlPShlfHwidGwiKS50b0xvd2VyQ2FzZSgpO3E9 cXx8e307dmFyIGs9dGhpcyxiPWsuZG9tPT1kb2N1bWVudC5ib2R5fHxrLmRvbT09 ZG9jdW1lbnQsbj1xLndpZHRofHxiP0V4dC5saWIuRG9tLmdldFZpZXdXaWR0aCgp OmsuZ2V0V2lkdGgoKSxpPXEuaGVpZ2h0fHxiP0V4dC5saWIuRG9tLmdldFZpZXdI ZWlnaHQoKTprLmdldEhlaWdodCgpLHAsYT1NYXRoLnJvdW5kLGM9ay5nZXRYWSgp LG09ay5nZXRTY3JvbGwoKSxqPWI/bS5sZWZ0OiFsP2NbMF06MCxnPWI/bS50b3A6 IWw/Y1sxXTowLGQ9e2M6W2EobiowLjUpLGEoaSowLjUpXSx0OlthKG4qMC41KSww XSxsOlswLGEoaSowLjUpXSxyOltuLGEoaSowLjUpXSxiOlthKG4qMC41KSxpXSx0 bDpbMCwwXSxibDpbMCxpXSxicjpbbixpXSx0cjpbbiwwXX07cD1kW2VdO3JldHVy bltwWzBdK2oscFsxXStnXX0sYW5jaG9yVG86ZnVuY3Rpb24oYixoLGMsYSxrLGwp e3ZhciBpPXRoaXMsZT1pLmRvbSxqPSFFeHQuaXNFbXB0eShrKSxkPWZ1bmN0aW9u KCl7RXh0LmZseShlKS5hbGlnblRvKGIsaCxjLGEpO0V4dC5jYWxsYmFjayhsLEV4 dC5mbHkoZSkpfSxnPXRoaXMuZ2V0QW5jaG9yKCk7dGhpcy5yZW1vdmVBbmNob3Io KTtFeHQuYXBwbHkoZyx7Zm46ZCxzY3JvbGw6an0pO0V4dC5FdmVudE1hbmFnZXIu b25XaW5kb3dSZXNpemUoZCxudWxsKTtpZihqKXtFeHQuRXZlbnRNYW5hZ2VyLm9u KHdpbmRvdywic2Nyb2xsIixkLG51bGwse2J1ZmZlcjohaXNOYU4oayk/azo1MH0p fWQuY2FsbChpKTtyZXR1cm4gaX0scmVtb3ZlQW5jaG9yOmZ1bmN0aW9uKCl7dmFy IGI9dGhpcyxhPXRoaXMuZ2V0QW5jaG9yKCk7aWYoYSYmYS5mbil7RXh0LkV2ZW50 TWFuYWdlci5yZW1vdmVSZXNpemVMaXN0ZW5lcihhLmZuKTtpZihhLnNjcm9sbCl7 RXh0LkV2ZW50TWFuYWdlci51bih3aW5kb3csInNjcm9sbCIsYS5mbil9ZGVsZXRl IGEuZm59cmV0dXJuIGJ9LGdldEFuY2hvcjpmdW5jdGlvbigpe3ZhciBiPUV4dC5F bGVtZW50LmRhdGEsYz10aGlzLmRvbTtpZighYyl7cmV0dXJufXZhciBhPWIoYywi X2FuY2hvciIpO2lmKCFhKXthPWIoYywiX2FuY2hvciIse30pfXJldHVybiBhfSxn ZXRBbGlnblRvWFk6ZnVuY3Rpb24oZyxBLEIpe2c9RXh0LmdldChnKTtpZighZ3x8 IWcuZG9tKXt0aHJvdyJFbGVtZW50LmFsaWduVG9YWSB3aXRoIGFuIGVsZW1lbnQg dGhhdCBkb2Vzbid0IGV4aXN0In1CPUJ8fFswLDBdO0E9KCFBfHxBPT0iPyI/InRs LWJsPyI6KCEoLy0vKS50ZXN0KEEpJiZBIT09IiI/InRsLSIrQTpBfHwidGwtYmwi KSkudG9Mb3dlckNhc2UoKTt2YXIgSz10aGlzLEg9Sy5kb20sTSxMLG4sbCxzLEYs dix0PUV4dC5saWIuRG9tLmdldFZpZXdXaWR0aCgpLTEwLEc9RXh0LmxpYi5Eb20u Z2V0Vmlld0hlaWdodCgpLTEwLGIsaSxqLGssdSx6LE49ZG9jdW1lbnQsSj1OLmRv Y3VtZW50RWxlbWVudCxxPU4uYm9keSxFPShKLnNjcm9sbExlZnR8fHEuc2Nyb2xs TGVmdHx8MCkrNSxEPShKLnNjcm9sbFRvcHx8cS5zY3JvbGxUb3B8fDApKzUsST1m YWxzZSxlPSIiLGE9IiIsQz1BLm1hdGNoKC9eKFthLXpdKyktKFthLXpdKykoXD8p PyQvKTtpZighQyl7dGhyb3ciRWxlbWVudC5hbGlnblRvIHdpdGggYW4gaW52YWxp ZCBhbGlnbm1lbnQgIitBfWU9Q1sxXTthPUNbMl07ST0hIUNbM107TT1LLmdldEFu Y2hvclhZKGUsdHJ1ZSk7TD1nLmdldEFuY2hvclhZKGEsZmFsc2UpO249TFswXS1N WzBdK0JbMF07bD1MWzFdLU1bMV0rQlsxXTtpZihJKXtzPUsuZ2V0V2lkdGgoKTtG PUsuZ2V0SGVpZ2h0KCk7dj1nLmdldFJlZ2lvbigpO2I9ZS5jaGFyQXQoMCk7aT1l LmNoYXJBdChlLmxlbmd0aC0xKTtqPWEuY2hhckF0KDApO2s9YS5jaGFyQXQoYS5s ZW5ndGgtMSk7dT0oKGI9PSJ0IiYmaj09ImIiKXx8KGI9PSJiIiYmaj09InQiKSk7 ej0oKGk9PSJyIiYmaz09ImwiKXx8KGk9PSJsIiYmaz09InIiKSk7aWYobitzPnQr RSl7bj16P3YubGVmdC1zOnQrRS1zfWlmKG48RSl7bj16P3YucmlnaHQ6RX1pZihs K0Y+RytEKXtsPXU/di50b3AtRjpHK0QtRn1pZihsPEQpe2w9dT92LmJvdHRvbTpE fX1yZXR1cm5bbixsXX0sYWxpZ25UbzpmdW5jdGlvbihjLGEsZSxiKXt2YXIgZD10 aGlzO3JldHVybiBkLnNldFhZKGQuZ2V0QWxpZ25Ub1hZKGMsYSxlKSxkLnByZWFu aW0mJiEhYj9kLnByZWFuaW0oYXJndW1lbnRzLDMpOmZhbHNlKX0sYWRqdXN0Rm9y Q29uc3RyYWludHM6ZnVuY3Rpb24oYyxhLGIpe3JldHVybiB0aGlzLmdldENvbnN0 cmFpblRvWFkoYXx8ZG9jdW1lbnQsZmFsc2UsYixjKXx8Y30sZ2V0Q29uc3RyYWlu VG9YWTpmdW5jdGlvbihiLGEsYyxlKXt2YXIgZD17dG9wOjAsbGVmdDowLGJvdHRv bTowLHJpZ2h0OjB9O3JldHVybiBmdW5jdGlvbihpLEEsbCxuKXtpPUV4dC5nZXQo aSk7bD1sP0V4dC5hcHBseUlmKGwsZCk6ZDt2YXIgeixELHY9MCx1PTA7aWYoaS5k b209PWRvY3VtZW50LmJvZHl8fGkuZG9tPT1kb2N1bWVudCl7ej1FeHQubGliLkRv bS5nZXRWaWV3V2lkdGgoKTtEPUV4dC5saWIuRG9tLmdldFZpZXdIZWlnaHQoKX1l bHNle3o9aS5kb20uY2xpZW50V2lkdGg7RD1pLmRvbS5jbGllbnRIZWlnaHQ7aWYo IUEpe3ZhciB0PWkuZ2V0WFkoKTt2PXRbMF07dT10WzFdfX12YXIgcj1pLmdldFNj cm9sbCgpO3YrPWwubGVmdCtyLmxlZnQ7dSs9bC50b3Arci50b3A7ei09bC5yaWdo dDtELT1sLmJvdHRvbTt2YXIgQj12K3osZz11K0Qsaj1ufHwoIUE/dGhpcy5nZXRY WSgpOlt0aGlzLmdldExlZnQodHJ1ZSksdGhpcy5nZXRUb3AodHJ1ZSldKSxwPWpb MF0sbz1qWzFdLGs9dGhpcy5nZXRDb25zdHJhaW5PZmZzZXQoKSxxPXRoaXMuZG9t Lm9mZnNldFdpZHRoK2ssQz10aGlzLmRvbS5vZmZzZXRIZWlnaHQrazt2YXIgbT1m YWxzZTtpZigocCtxKT5CKXtwPUItcTttPXRydWV9aWYoKG8rQyk+Zyl7bz1nLUM7 bT10cnVlfWlmKHA8dil7cD12O209dHJ1ZX1pZihvPHUpe289dTttPXRydWV9cmV0 dXJuIG0/W3Asb106ZmFsc2V9fSgpLGdldENvbnN0cmFpbk9mZnNldDpmdW5jdGlv bigpe3JldHVybiAwfSxnZXRDZW50ZXJYWTpmdW5jdGlvbigpe3JldHVybiB0aGlz LmdldEFsaWduVG9YWShkb2N1bWVudCwiYy1jIil9LGNlbnRlcjpmdW5jdGlvbihh KXtyZXR1cm4gdGhpcy5hbGlnblRvKGF8fGRvY3VtZW50LCJjLWMiKX19KTtFeHQu RWxlbWVudC5hZGRNZXRob2RzKHtzZWxlY3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g RXh0LkVsZW1lbnQuc2VsZWN0KGEsYix0aGlzLmRvbSl9fSk7RXh0LmFwcGx5KEV4 dC5FbGVtZW50LnByb3RvdHlwZSxmdW5jdGlvbigpe3ZhciBjPUV4dC5nZXREb20s YT1FeHQuZ2V0LGI9RXh0LkRvbUhlbHBlcjtyZXR1cm57aW5zZXJ0U2libGluZzpm dW5jdGlvbihpLGcsaCl7dmFyIGo9dGhpcyxlLGQ9KGd8fCJiZWZvcmUiKS50b0xv d2VyQ2FzZSgpPT0iYWZ0ZXIiLGs7aWYoRXh0LmlzQXJyYXkoaSkpe2s9ajtFeHQu ZWFjaChpLGZ1bmN0aW9uKGwpe2U9RXh0LmZseShrLCJfaW50ZXJuYWwiKS5pbnNl cnRTaWJsaW5nKGwsZyxoKTtpZihkKXtrPWV9fSk7cmV0dXJuIGV9aT1pfHx7fTtp ZihpLm5vZGVUeXBlfHxpLmRvbSl7ZT1qLmRvbS5wYXJlbnROb2RlLmluc2VydEJl Zm9yZShjKGkpLGQ/ai5kb20ubmV4dFNpYmxpbmc6ai5kb20pO2lmKCFoKXtlPWEo ZSl9fWVsc2V7aWYoZCYmIWouZG9tLm5leHRTaWJsaW5nKXtlPWIuYXBwZW5kKGou ZG9tLnBhcmVudE5vZGUsaSwhaCl9ZWxzZXtlPWJbZD8iaW5zZXJ0QWZ0ZXIiOiJp bnNlcnRCZWZvcmUiXShqLmRvbSxpLCFoKX19cmV0dXJuIGV9fX0oKSk7RXh0LkVs ZW1lbnQuYm94TWFya3VwPSc8ZGl2IGNsYXNzPSJ7MH0tdGwiPjxkaXYgY2xhc3M9 InswfS10ciI+PGRpdiBjbGFzcz0iezB9LXRjIj48L2Rpdj48L2Rpdj48L2Rpdj48 ZGl2IGNsYXNzPSJ7MH0tbWwiPjxkaXYgY2xhc3M9InswfS1tciI+PGRpdiBjbGFz cz0iezB9LW1jIj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJ7MH0tYmwi PjxkaXYgY2xhc3M9InswfS1iciI+PGRpdiBjbGFzcz0iezB9LWJjIj48L2Rpdj48 L2Rpdj48L2Rpdj4nO0V4dC5FbGVtZW50LmFkZE1ldGhvZHMoZnVuY3Rpb24oKXt2 YXIgYT0iX2ludGVybmFsIixiPS8oXGQrXC4/XGQrKXB4LztyZXR1cm57YXBwbHlT dHlsZXM6ZnVuY3Rpb24oYyl7RXh0LkRvbUhlbHBlci5hcHBseVN0eWxlcyh0aGlz LmRvbSxjKTtyZXR1cm4gdGhpc30sZ2V0U3R5bGVzOmZ1bmN0aW9uKCl7dmFyIGM9 e307RXh0LmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGQpe2NbZF09dGhpcy5nZXRT dHlsZShkKX0sdGhpcyk7cmV0dXJuIGN9LHNldE92ZXJmbG93OmZ1bmN0aW9uKGMp e3ZhciBkPXRoaXMuZG9tO2lmKGM9PSJhdXRvIiYmRXh0LmlzTWFjJiZFeHQuaXNH ZWNrbzIpe2Quc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiI7KGZ1bmN0aW9uKCl7ZC5z dHlsZS5vdmVyZmxvdz0iYXV0byJ9KS5kZWZlcigxKX1lbHNle2Quc3R5bGUub3Zl cmZsb3c9Y319LGJveFdyYXA6ZnVuY3Rpb24oYyl7Yz1jfHwieC1ib3giO3ZhciBk PUV4dC5nZXQodGhpcy5pbnNlcnRIdG1sKCJiZWZvcmVCZWdpbiIsIjxkaXYgY2xh c3M9JyIrYysiJz4iK1N0cmluZy5mb3JtYXQoRXh0LkVsZW1lbnQuYm94TWFya3Vw LGMpKyI8L2Rpdj4iKSk7RXh0LkRvbVF1ZXJ5LnNlbGVjdE5vZGUoIi4iK2MrIi1t YyIsZC5kb20pLmFwcGVuZENoaWxkKHRoaXMuZG9tKTtyZXR1cm4gZH0sc2V0U2l6 ZTpmdW5jdGlvbihlLGMsZCl7dmFyIGc9dGhpcztpZih0eXBlb2YgZT09Im9iamVj dCIpe2M9ZS5oZWlnaHQ7ZT1lLndpZHRofWU9Zy5hZGp1c3RXaWR0aChlKTtjPWcu YWRqdXN0SGVpZ2h0KGMpO2lmKCFkfHwhZy5hbmltKXtnLmRvbS5zdHlsZS53aWR0 aD1nLmFkZFVuaXRzKGUpO2cuZG9tLnN0eWxlLmhlaWdodD1nLmFkZFVuaXRzKGMp fWVsc2V7Zy5hbmltKHt3aWR0aDp7dG86ZX0saGVpZ2h0Ont0bzpjfX0sZy5wcmVh bmltKGFyZ3VtZW50cywyKSl9cmV0dXJuIGd9LGdldENvbXB1dGVkSGVpZ2h0OmZ1 bmN0aW9uKCl7dmFyIGQ9dGhpcyxjPU1hdGgubWF4KGQuZG9tLm9mZnNldEhlaWdo dCxkLmRvbS5jbGllbnRIZWlnaHQpO2lmKCFjKXtjPXBhcnNlRmxvYXQoZC5nZXRT dHlsZSgiaGVpZ2h0IikpfHwwO2lmKCFkLmlzQm9yZGVyQm94KCkpe2MrPWQuZ2V0 RnJhbWVXaWR0aCgidGIiKX19cmV0dXJuIGN9LGdldENvbXB1dGVkV2lkdGg6ZnVu Y3Rpb24oKXt2YXIgYz1NYXRoLm1heCh0aGlzLmRvbS5vZmZzZXRXaWR0aCx0aGlz LmRvbS5jbGllbnRXaWR0aCk7aWYoIWMpe2M9cGFyc2VGbG9hdCh0aGlzLmdldFN0 eWxlKCJ3aWR0aCIpKXx8MDtpZighdGhpcy5pc0JvcmRlckJveCgpKXtjKz10aGlz LmdldEZyYW1lV2lkdGgoImxyIil9fXJldHVybiBjfSxnZXRGcmFtZVdpZHRoOmZ1 bmN0aW9uKGQsYyl7cmV0dXJuIGMmJnRoaXMuaXNCb3JkZXJCb3goKT8wOih0aGlz LmdldFBhZGRpbmcoZCkrdGhpcy5nZXRCb3JkZXJXaWR0aChkKSl9LGFkZENsYXNz T25PdmVyOmZ1bmN0aW9uKGMpe3RoaXMuaG92ZXIoZnVuY3Rpb24oKXtFeHQuZmx5 KHRoaXMsYSkuYWRkQ2xhc3MoYyl9LGZ1bmN0aW9uKCl7RXh0LmZseSh0aGlzLGEp LnJlbW92ZUNsYXNzKGMpfSk7cmV0dXJuIHRoaXN9LGFkZENsYXNzT25Gb2N1czpm dW5jdGlvbihjKXt0aGlzLm9uKCJmb2N1cyIsZnVuY3Rpb24oKXtFeHQuZmx5KHRo aXMsYSkuYWRkQ2xhc3MoYyl9LHRoaXMuZG9tKTt0aGlzLm9uKCJibHVyIixmdW5j dGlvbigpe0V4dC5mbHkodGhpcyxhKS5yZW1vdmVDbGFzcyhjKX0sdGhpcy5kb20p O3JldHVybiB0aGlzfSxhZGRDbGFzc09uQ2xpY2s6ZnVuY3Rpb24oYyl7dmFyIGQ9 dGhpcy5kb207dGhpcy5vbigibW91c2Vkb3duIixmdW5jdGlvbigpe0V4dC5mbHko ZCxhKS5hZGRDbGFzcyhjKTt2YXIgZz1FeHQuZ2V0RG9jKCksZT1mdW5jdGlvbigp e0V4dC5mbHkoZCxhKS5yZW1vdmVDbGFzcyhjKTtnLnJlbW92ZUxpc3RlbmVyKCJt b3VzZXVwIixlKX07Zy5vbigibW91c2V1cCIsZSl9KTtyZXR1cm4gdGhpc30sZ2V0 Vmlld1NpemU6ZnVuY3Rpb24oKXt2YXIgZz1kb2N1bWVudCxoPXRoaXMuZG9tLGM9 KGg9PWd8fGg9PWcuYm9keSk7aWYoYyl7dmFyIGU9RXh0LmxpYi5Eb207cmV0dXJu e3dpZHRoOmUuZ2V0Vmlld1dpZHRoKCksaGVpZ2h0OmUuZ2V0Vmlld0hlaWdodCgp fX1lbHNle3JldHVybnt3aWR0aDpoLmNsaWVudFdpZHRoLGhlaWdodDpoLmNsaWVu dEhlaWdodH19fSxnZXRTdHlsZVNpemU6ZnVuY3Rpb24oKXt2YXIgaj10aGlzLGMs aSxsPWRvY3VtZW50LG09dGhpcy5kb20sZT0obT09bHx8bT09bC5ib2R5KSxnPW0u c3R5bGU7aWYoZSl7dmFyIGs9RXh0LmxpYi5Eb207cmV0dXJue3dpZHRoOmsuZ2V0 Vmlld1dpZHRoKCksaGVpZ2h0OmsuZ2V0Vmlld0hlaWdodCgpfX1pZihnLndpZHRo JiZnLndpZHRoIT0iYXV0byIpe2M9cGFyc2VGbG9hdChnLndpZHRoKTtpZihqLmlz Qm9yZGVyQm94KCkpe2MtPWouZ2V0RnJhbWVXaWR0aCgibHIiKX19aWYoZy5oZWln aHQmJmcuaGVpZ2h0IT0iYXV0byIpe2k9cGFyc2VGbG9hdChnLmhlaWdodCk7aWYo ai5pc0JvcmRlckJveCgpKXtpLT1qLmdldEZyYW1lV2lkdGgoInRiIil9fXJldHVy bnt3aWR0aDpjfHxqLmdldFdpZHRoKHRydWUpLGhlaWdodDppfHxqLmdldEhlaWdo dCh0cnVlKX19LGdldFNpemU6ZnVuY3Rpb24oYyl7cmV0dXJue3dpZHRoOnRoaXMu Z2V0V2lkdGgoYyksaGVpZ2h0OnRoaXMuZ2V0SGVpZ2h0KGMpfX0scmVwYWludDpm dW5jdGlvbigpe3ZhciBjPXRoaXMuZG9tO3RoaXMuYWRkQ2xhc3MoIngtcmVwYWlu dCIpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtFeHQuZmx5KGMpLnJlbW92ZUNsYXNz KCJ4LXJlcGFpbnQiKX0sMSk7cmV0dXJuIHRoaXN9LHVuc2VsZWN0YWJsZTpmdW5j dGlvbigpe3RoaXMuZG9tLnVuc2VsZWN0YWJsZT0ib24iO3JldHVybiB0aGlzLnN3 YWxsb3dFdmVudCgic2VsZWN0c3RhcnQiLHRydWUpLmFwcGx5U3R5bGVzKCItbW96 LXVzZXItc2VsZWN0Om5vbmU7LWtodG1sLXVzZXItc2VsZWN0Om5vbmU7IikuYWRk Q2xhc3MoIngtdW5zZWxlY3RhYmxlIil9LGdldE1hcmdpbnM6ZnVuY3Rpb24oZCl7 dmFyIGU9dGhpcyxjLGc9e3Q6InRvcCIsbDoibGVmdCIscjoicmlnaHQiLGI6ImJv dHRvbSJ9LGg9e307aWYoIWQpe2ZvcihjIGluIGUubWFyZ2lucyl7aFtnW2NdXT1w YXJzZUZsb2F0KGUuZ2V0U3R5bGUoZS5tYXJnaW5zW2NdKSl8fDB9cmV0dXJuIGh9 ZWxzZXtyZXR1cm4gZS5hZGRTdHlsZXMuY2FsbChlLGQsZS5tYXJnaW5zKX19fX0o KSk7RXh0LkVsZW1lbnQuYWRkTWV0aG9kcyh7c2V0Qm94OmZ1bmN0aW9uKGUsZyxi KXt2YXIgZD10aGlzLGE9ZS53aWR0aCxjPWUuaGVpZ2h0O2lmKChnJiYhZC5hdXRv Qm94QWRqdXN0KSYmIWQuaXNCb3JkZXJCb3goKSl7YS09KGQuZ2V0Qm9yZGVyV2lk dGgoImxyIikrZC5nZXRQYWRkaW5nKCJsciIpKTtjLT0oZC5nZXRCb3JkZXJXaWR0 aCgidGIiKStkLmdldFBhZGRpbmcoInRiIikpfWQuc2V0Qm91bmRzKGUueCxlLnks YSxjLGQuYW5pbVRlc3QuY2FsbChkLGFyZ3VtZW50cyxiLDIpKTtyZXR1cm4gZH0s Z2V0Qm94OmZ1bmN0aW9uKGoscCl7dmFyIG09dGhpcyx2LGUsbyxkPW0uZ2V0Qm9y ZGVyV2lkdGgscT1tLmdldFBhZGRpbmcsZyxhLHUsbjtpZighcCl7dj1tLmdldFhZ KCl9ZWxzZXtlPXBhcnNlSW50KG0uZ2V0U3R5bGUoImxlZnQiKSwxMCl8fDA7bz1w YXJzZUludChtLmdldFN0eWxlKCJ0b3AiKSwxMCl8fDA7dj1bZSxvXX12YXIgYz1t LmRvbSxzPWMub2Zmc2V0V2lkdGgsaT1jLm9mZnNldEhlaWdodCxrO2lmKCFqKXtr PXt4OnZbMF0seTp2WzFdLDA6dlswXSwxOnZbMV0sd2lkdGg6cyxoZWlnaHQ6aX19 ZWxzZXtnPWQuY2FsbChtLCJsIikrcS5jYWxsKG0sImwiKTthPWQuY2FsbChtLCJy IikrcS5jYWxsKG0sInIiKTt1PWQuY2FsbChtLCJ0IikrcS5jYWxsKG0sInQiKTtu PWQuY2FsbChtLCJiIikrcS5jYWxsKG0sImIiKTtrPXt4OnZbMF0rZyx5OnZbMV0r dSwwOnZbMF0rZywxOnZbMV0rdSx3aWR0aDpzLShnK2EpLGhlaWdodDppLSh1K24p fX1rLnJpZ2h0PWsueCtrLndpZHRoO2suYm90dG9tPWsueStrLmhlaWdodDtyZXR1 cm4ga30sbW92ZTpmdW5jdGlvbihqLGIsYyl7dmFyIGc9dGhpcyxtPWcuZ2V0WFko KSxrPW1bMF0saT1tWzFdLGQ9W2stYixpXSxsPVtrK2IsaV0saD1bayxpLWJdLGE9 W2ssaStiXSxlPXtsOmQsbGVmdDpkLHI6bCxyaWdodDpsLHQ6aCx0b3A6aCx1cDpo LGI6YSxib3R0b206YSxkb3duOmF9O2o9ai50b0xvd2VyQ2FzZSgpO2cubW92ZVRv KGVbal1bMF0sZVtqXVsxXSxnLmFuaW1UZXN0LmNhbGwoZyxhcmd1bWVudHMsYywy KSl9LHNldExlZnRUb3A6ZnVuY3Rpb24oZCxjKXt2YXIgYj10aGlzLGE9Yi5kb20u c3R5bGU7YS5sZWZ0PWIuYWRkVW5pdHMoZCk7YS50b3A9Yi5hZGRVbml0cyhjKTty ZXR1cm4gYn0sZ2V0UmVnaW9uOmZ1bmN0aW9uKCl7cmV0dXJuIEV4dC5saWIuRG9t LmdldFJlZ2lvbih0aGlzLmRvbSl9LHNldEJvdW5kczpmdW5jdGlvbihiLGcsZCxh LGMpe3ZhciBlPXRoaXM7aWYoIWN8fCFlLmFuaW0pe2Uuc2V0U2l6ZShkLGEpO2Uu c2V0TG9jYXRpb24oYixnKX1lbHNle2UuYW5pbSh7cG9pbnRzOnt0bzpbYixnXX0s d2lkdGg6e3RvOmUuYWRqdXN0V2lkdGgoZCl9LGhlaWdodDp7dG86ZS5hZGp1c3RI ZWlnaHQoYSl9fSxlLnByZWFuaW0oYXJndW1lbnRzLDQpLCJtb3Rpb24iKX1yZXR1 cm4gZX0sc2V0UmVnaW9uOmZ1bmN0aW9uKGIsYSl7cmV0dXJuIHRoaXMuc2V0Qm91 bmRzKGIubGVmdCxiLnRvcCxiLnJpZ2h0LWIubGVmdCxiLmJvdHRvbS1iLnRvcCx0 aGlzLmFuaW1UZXN0LmNhbGwodGhpcyxhcmd1bWVudHMsYSwxKSl9fSk7RXh0LkVs ZW1lbnQuYWRkTWV0aG9kcyh7c2Nyb2xsVG86ZnVuY3Rpb24oYixkLGEpe3ZhciBl PS90b3AvaS50ZXN0KGIpLGM9dGhpcyxnPWMuZG9tLGg7aWYoIWF8fCFjLmFuaW0p e2g9InNjcm9sbCIrKGU/IlRvcCI6IkxlZnQiKTtnW2hdPWR9ZWxzZXtoPSJzY3Jv bGwiKyhlPyJMZWZ0IjoiVG9wIik7Yy5hbmltKHtzY3JvbGw6e3RvOmU/W2dbaF0s ZF06W2QsZ1toXV19fSxjLnByZWFuaW0oYXJndW1lbnRzLDIpLCJzY3JvbGwiKX1y ZXR1cm4gY30sc2Nyb2xsSW50b1ZpZXc6ZnVuY3Rpb24oZSxpKXt2YXIgcD1FeHQu Z2V0RG9tKGUpfHxFeHQuZ2V0Qm9keSgpLmRvbSxoPXRoaXMuZG9tLGc9dGhpcy5n ZXRPZmZzZXRzVG8ocCksaz1nWzBdK3Auc2Nyb2xsTGVmdCx1PWdbMV0rcC5zY3Jv bGxUb3AscT11K2gub2Zmc2V0SGVpZ2h0LGQ9aytoLm9mZnNldFdpZHRoLGE9cC5j bGllbnRIZWlnaHQsbT1wYXJzZUludChwLnNjcm9sbFRvcCwxMCkscz1wYXJzZUlu dChwLnNjcm9sbExlZnQsMTApLGo9bSthLG49cytwLmNsaWVudFdpZHRoO2lmKGgu b2Zmc2V0SGVpZ2h0PmF8fHU8bSl7cC5zY3JvbGxUb3A9dX1lbHNle2lmKHE+ail7 cC5zY3JvbGxUb3A9cS1hfX1wLnNjcm9sbFRvcD1wLnNjcm9sbFRvcDtpZihpIT09 ZmFsc2Upe2lmKGgub2Zmc2V0V2lkdGg+cC5jbGllbnRXaWR0aHx8azxzKXtwLnNj cm9sbExlZnQ9a31lbHNle2lmKGQ+bil7cC5zY3JvbGxMZWZ0PWQtcC5jbGllbnRX aWR0aH19cC5zY3JvbGxMZWZ0PXAuc2Nyb2xsTGVmdH1yZXR1cm4gdGhpc30sc2Ny b2xsQ2hpbGRJbnRvVmlldzpmdW5jdGlvbihiLGEpe0V4dC5mbHkoYiwiX3Njcm9s bENoaWxkSW50b1ZpZXciKS5zY3JvbGxJbnRvVmlldyh0aGlzLGEpfSxzY3JvbGw6 ZnVuY3Rpb24obSxiLGQpe2lmKCF0aGlzLmlzU2Nyb2xsYWJsZSgpKXtyZXR1cm4g ZmFsc2V9dmFyIGU9dGhpcy5kb20sZz1lLnNjcm9sbExlZnQscD1lLnNjcm9sbFRv cCxuPWUuc2Nyb2xsV2lkdGgsaz1lLnNjcm9sbEhlaWdodCxpPWUuY2xpZW50V2lk dGgsYT1lLmNsaWVudEhlaWdodCxjPWZhbHNlLG8saj17bDpNYXRoLm1pbihnK2Is bi1pKSxyOm89TWF0aC5tYXgoZy1iLDApLHQ6TWF0aC5tYXgocC1iLDApLGI6TWF0 aC5taW4ocCtiLGstYSl9O2ouZD1qLmI7ai51PWoudDttPW0uc3Vic3RyKDAsMSk7 aWYoKG89alttXSk+LTEpe2M9dHJ1ZTt0aGlzLnNjcm9sbFRvKG09PSJsInx8bT09 InIiPyJsZWZ0IjoidG9wIixvLHRoaXMucHJlYW5pbShhcmd1bWVudHMsMikpfXJl dHVybiBjfX0pO0V4dC5FbGVtZW50LmFkZE1ldGhvZHMoZnVuY3Rpb24oKXt2YXIg ZD0idmlzaWJpbGl0eSIsYj0iZGlzcGxheSIsYT0iaGlkZGVuIixoPSJub25lIixj PSJ4LW1hc2tlZCIsZz0ieC1tYXNrZWQtcmVsYXRpdmUiLGU9RXh0LkVsZW1lbnQu ZGF0YTtyZXR1cm57aXNWaXNpYmxlOmZ1bmN0aW9uKGkpe3ZhciBqPSF0aGlzLmlz U3R5bGUoZCxhKSYmIXRoaXMuaXNTdHlsZShiLGgpLGs9dGhpcy5kb20ucGFyZW50 Tm9kZTtpZihpIT09dHJ1ZXx8IWope3JldHVybiBqfXdoaWxlKGsmJiEoL15ib2R5 L2kudGVzdChrLnRhZ05hbWUpKSl7aWYoIUV4dC5mbHkoaywiX2lzVmlzaWJsZSIp LmlzVmlzaWJsZSgpKXtyZXR1cm4gZmFsc2V9az1rLnBhcmVudE5vZGV9cmV0dXJu IHRydWV9LGlzRGlzcGxheWVkOmZ1bmN0aW9uKCl7cmV0dXJuICF0aGlzLmlzU3R5 bGUoYixoKX0sZW5hYmxlRGlzcGxheU1vZGU6ZnVuY3Rpb24oaSl7dGhpcy5zZXRW aXNpYmlsaXR5TW9kZShFeHQuRWxlbWVudC5ESVNQTEFZKTtpZighRXh0LmlzRW1w dHkoaSkpe2UodGhpcy5kb20sIm9yaWdpbmFsRGlzcGxheSIsaSl9cmV0dXJuIHRo aXN9LG1hc2s6ZnVuY3Rpb24oaixuKXt2YXIgcD10aGlzLGw9cC5kb20sbz1FeHQu RG9tSGVscGVyLG09ImV4dC1lbC1tYXNrLW1zZyIsaSxxO2lmKCEvXmJvZHkvaS50 ZXN0KGwudGFnTmFtZSkmJnAuZ2V0U3R5bGUoInBvc2l0aW9uIik9PSJzdGF0aWMi KXtwLmFkZENsYXNzKGcpfWlmKGk9ZShsLCJtYXNrTXNnIikpe2kucmVtb3ZlKCl9 aWYoaT1lKGwsIm1hc2siKSl7aS5yZW1vdmUoKX1xPW8uYXBwZW5kKGwse2Nsczoi ZXh0LWVsLW1hc2sifSx0cnVlKTtlKGwsIm1hc2siLHEpO3AuYWRkQ2xhc3MoYyk7 cS5zZXREaXNwbGF5ZWQodHJ1ZSk7aWYodHlwZW9mIGo9PSJzdHJpbmciKXt2YXIg az1vLmFwcGVuZChsLHtjbHM6bSxjbjp7dGFnOiJkaXYifX0sdHJ1ZSk7ZShsLCJt YXNrTXNnIixrKTtrLmRvbS5jbGFzc05hbWU9bj9tKyIgIituOm07ay5kb20uZmly c3RDaGlsZC5pbm5lckhUTUw9ajtrLnNldERpc3BsYXllZCh0cnVlKTtrLmNlbnRl cihwKX1pZihFeHQuaXNJRSYmIShFeHQuaXNJRTcmJkV4dC5pc1N0cmljdCkmJnAu Z2V0U3R5bGUoImhlaWdodCIpPT0iYXV0byIpe3Euc2V0U2l6ZSh1bmRlZmluZWQs cC5nZXRIZWlnaHQoKSl9cmV0dXJuIHF9LHVubWFzazpmdW5jdGlvbigpe3ZhciBr PXRoaXMsbD1rLmRvbSxpPWUobCwibWFzayIpLGo9ZShsLCJtYXNrTXNnIik7aWYo aSl7aWYoail7ai5yZW1vdmUoKTtlKGwsIm1hc2tNc2ciLHVuZGVmaW5lZCl9aS5y ZW1vdmUoKTtlKGwsIm1hc2siLHVuZGVmaW5lZCk7ay5yZW1vdmVDbGFzcyhbYyxn XSl9fSxpc01hc2tlZDpmdW5jdGlvbigpe3ZhciBpPWUodGhpcy5kb20sIm1hc2si KTtyZXR1cm4gaSYmaS5pc1Zpc2libGUoKX0sY3JlYXRlU2hpbTpmdW5jdGlvbigp e3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGo7aS5mcmFt ZUJvcmRlcj0iMCI7aS5jbGFzc05hbWU9ImV4dC1zaGltIjtpLnNyYz1FeHQuU1NM X1NFQ1VSRV9VUkw7aj1FeHQuZ2V0KHRoaXMuZG9tLnBhcmVudE5vZGUuaW5zZXJ0 QmVmb3JlKGksdGhpcy5kb20pKTtqLmF1dG9Cb3hBZGp1c3Q9ZmFsc2U7cmV0dXJu IGp9fX0oKSk7RXh0LkVsZW1lbnQuYWRkTWV0aG9kcyh7YWRkS2V5TGlzdGVuZXI6 ZnVuY3Rpb24oYixkLGMpe3ZhciBhO2lmKHR5cGVvZiBiIT0ib2JqZWN0Inx8RXh0 LmlzQXJyYXkoYikpe2E9e2tleTpiLGZuOmQsc2NvcGU6Y319ZWxzZXthPXtrZXk6 Yi5rZXksc2hpZnQ6Yi5zaGlmdCxjdHJsOmIuY3RybCxhbHQ6Yi5hbHQsZm46ZCxz Y29wZTpjfX1yZXR1cm4gbmV3IEV4dC5LZXlNYXAodGhpcyxhKX0sYWRkS2V5TWFw OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgRXh0LktleU1hcCh0aGlzLGEpfX0pO0V4 dC5Db21wb3NpdGVFbGVtZW50TGl0ZS5pbXBvcnRFbGVtZW50TWV0aG9kcygpO0V4 dC5hcHBseShFeHQuQ29tcG9zaXRlRWxlbWVudExpdGUucHJvdG90eXBlLHthZGRF bGVtZW50czpmdW5jdGlvbihjLGEpe2lmKCFjKXtyZXR1cm4gdGhpc31pZih0eXBl b2YgYz09InN0cmluZyIpe2M9RXh0LkVsZW1lbnQuc2VsZWN0b3JGdW5jdGlvbihj LGEpfXZhciBiPXRoaXMuZWxlbWVudHM7RXh0LmVhY2goYyxmdW5jdGlvbihkKXti LnB1c2goRXh0LmdldChkKSl9KTtyZXR1cm4gdGhpc30sZmlyc3Q6ZnVuY3Rpb24o KXtyZXR1cm4gdGhpcy5pdGVtKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRo aXMuaXRlbSh0aGlzLmdldENvdW50KCktMSl9LGNvbnRhaW5zOmZ1bmN0aW9uKGEp e3JldHVybiB0aGlzLmluZGV4T2YoYSkhPS0xfSxyZW1vdmVFbGVtZW50OmZ1bmN0 aW9uKGQsZSl7dmFyIGM9dGhpcyxhPXRoaXMuZWxlbWVudHMsYjtFeHQuZWFjaChk LGZ1bmN0aW9uKGcpe2lmKChiPShhW2ddfHxhW2c9Yy5pbmRleE9mKGcpXSkpKXtp ZihlKXtpZihiLmRvbSl7Yi5yZW1vdmUoKX1lbHNle0V4dC5yZW1vdmVOb2RlKGIp fX1hLnNwbGljZShnLDEpfX0pO3JldHVybiB0aGlzfX0pO0V4dC5Db21wb3NpdGVF bGVtZW50PUV4dC5leHRlbmQoRXh0LkNvbXBvc2l0ZUVsZW1lbnRMaXRlLHtjb25z dHJ1Y3RvcjpmdW5jdGlvbihiLGEpe3RoaXMuZWxlbWVudHM9W107dGhpcy5hZGQo YixhKX0sZ2V0RWxlbWVudDpmdW5jdGlvbihhKXtyZXR1cm4gYX0sdHJhbnNmb3Jt RWxlbWVudDpmdW5jdGlvbihhKXtyZXR1cm4gRXh0LmdldChhKX19KTtFeHQuRWxl bWVudC5zZWxlY3Q9ZnVuY3Rpb24oYSxkLGIpe3ZhciBjO2lmKHR5cGVvZiBhPT0i c3RyaW5nIil7Yz1FeHQuRWxlbWVudC5zZWxlY3RvckZ1bmN0aW9uKGEsYil9ZWxz ZXtpZihhLmxlbmd0aCE9PXVuZGVmaW5lZCl7Yz1hfWVsc2V7dGhyb3ciSW52YWxp ZCBzZWxlY3RvciJ9fXJldHVybihkPT09dHJ1ZSk/bmV3IEV4dC5Db21wb3NpdGVF bGVtZW50KGMpOm5ldyBFeHQuQ29tcG9zaXRlRWxlbWVudExpdGUoYyl9O0V4dC5z ZWxlY3Q9RXh0LkVsZW1lbnQuc2VsZWN0O0V4dC5VcGRhdGVNYW5hZ2VyPUV4dC5V cGRhdGVyPUV4dC5leHRlbmQoRXh0LnV0aWwuT2JzZXJ2YWJsZSxmdW5jdGlvbigp e3ZhciBiPSJiZWZvcmV1cGRhdGUiLGQ9InVwZGF0ZSIsYz0iZmFpbHVyZSI7ZnVu Y3Rpb24gYShoKXt2YXIgaT10aGlzO2kudHJhbnNhY3Rpb249bnVsbDtpZihoLmFy Z3VtZW50LmZvcm0mJmguYXJndW1lbnQucmVzZXQpe3RyeXtoLmFyZ3VtZW50LmZv cm0ucmVzZXQoKX1jYXRjaChqKXt9fWlmKGkubG9hZFNjcmlwdHMpe2kucmVuZGVy ZXIucmVuZGVyKGkuZWwsaCxpLGcuY3JlYXRlRGVsZWdhdGUoaSxbaF0pKX1lbHNl e2kucmVuZGVyZXIucmVuZGVyKGkuZWwsaCxpKTtnLmNhbGwoaSxoKX19ZnVuY3Rp b24gZyhoLGksail7dGhpcy5maXJlRXZlbnQoaXx8ZCx0aGlzLmVsLGgpO2lmKEV4 dC5pc0Z1bmN0aW9uKGguYXJndW1lbnQuY2FsbGJhY2spKXtoLmFyZ3VtZW50LmNh bGxiYWNrLmNhbGwoaC5hcmd1bWVudC5zY29wZSx0aGlzLmVsLEV4dC5pc0VtcHR5 KGopP3RydWU6ZmFsc2UsaCxoLmFyZ3VtZW50Lm9wdGlvbnMpfX1mdW5jdGlvbiBl KGgpe2cuY2FsbCh0aGlzLGgsYywhISh0aGlzLnRyYW5zYWN0aW9uPW51bGwpKX1y ZXR1cm57Y29uc3RydWN0b3I6ZnVuY3Rpb24oaSxoKXt2YXIgaj10aGlzO2k9RXh0 LmdldChpKTtpZighaCYmaS51cGRhdGVNYW5hZ2VyKXtyZXR1cm4gaS51cGRhdGVN YW5hZ2VyfWouZWw9aTtqLmRlZmF1bHRVcmw9bnVsbDtqLmFkZEV2ZW50cyhiLGQs Yyk7RXh0LmFwcGx5KGosRXh0LlVwZGF0ZXIuZGVmYXVsdHMpO2oudHJhbnNhY3Rp b249bnVsbDtqLnJlZnJlc2hEZWxlZ2F0ZT1qLnJlZnJlc2guY3JlYXRlRGVsZWdh dGUoaik7ai51cGRhdGVEZWxlZ2F0ZT1qLnVwZGF0ZS5jcmVhdGVEZWxlZ2F0ZShq KTtqLmZvcm1VcGRhdGVEZWxlZ2F0ZT0oai5mb3JtVXBkYXRlfHxmdW5jdGlvbigp e30pLmNyZWF0ZURlbGVnYXRlKGopO2oucmVuZGVyZXI9ai5yZW5kZXJlcnx8ai5n ZXREZWZhdWx0UmVuZGVyZXIoKTtFeHQuVXBkYXRlci5zdXBlcmNsYXNzLmNvbnN0 cnVjdG9yLmNhbGwoail9LHNldFJlbmRlcmVyOmZ1bmN0aW9uKGgpe3RoaXMucmVu ZGVyZXI9aH0sZ2V0UmVuZGVyZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5k ZXJlcn0sZ2V0RGVmYXVsdFJlbmRlcmVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBF eHQuVXBkYXRlci5CYXNpY1JlbmRlcmVyKCl9LHNldERlZmF1bHRVcmw6ZnVuY3Rp b24oaCl7dGhpcy5kZWZhdWx0VXJsPWh9LGdldEVsOmZ1bmN0aW9uKCl7cmV0dXJu IHRoaXMuZWx9LHVwZGF0ZTpmdW5jdGlvbihpLG4scCxsKXt2YXIgaz10aGlzLGgs ajtpZihrLmZpcmVFdmVudChiLGsuZWwsaSxuKSE9PWZhbHNlKXtpZihFeHQuaXNP YmplY3QoaSkpe2g9aTtpPWgudXJsO249bnx8aC5wYXJhbXM7cD1wfHxoLmNhbGxi YWNrO2w9bHx8aC5kaXNjYXJkVXJsO2o9aC5zY29wZTtpZighRXh0LmlzRW1wdHko aC5ub2NhY2hlKSl7ay5kaXNhYmxlQ2FjaGluZz1oLm5vY2FjaGV9aWYoIUV4dC5p c0VtcHR5KGgudGV4dCkpe2suaW5kaWNhdG9yVGV4dD0nPGRpdiBjbGFzcz0ibG9h ZGluZy1pbmRpY2F0b3IiPicraC50ZXh0KyI8L2Rpdj4ifWlmKCFFeHQuaXNFbXB0 eShoLnNjcmlwdHMpKXtrLmxvYWRTY3JpcHRzPWguc2NyaXB0c31pZighRXh0Lmlz RW1wdHkoaC50aW1lb3V0KSl7ay50aW1lb3V0PWgudGltZW91dH19ay5zaG93TG9h ZGluZygpO2lmKCFsKXtrLmRlZmF1bHRVcmw9aX1pZihFeHQuaXNGdW5jdGlvbihp KSl7aT1pLmNhbGwoayl9dmFyIG09RXh0LmFwcGx5KHt9LHt1cmw6aSxwYXJhbXM6 KEV4dC5pc0Z1bmN0aW9uKG4pJiZqKT9uLmNyZWF0ZURlbGVnYXRlKGopOm4sc3Vj Y2VzczphLGZhaWx1cmU6ZSxzY29wZTprLGNhbGxiYWNrOnVuZGVmaW5lZCx0aW1l b3V0OihrLnRpbWVvdXQqMTAwMCksZGlzYWJsZUNhY2hpbmc6ay5kaXNhYmxlQ2Fj aGluZyxhcmd1bWVudDp7b3B0aW9uczpoLHVybDppLGZvcm06bnVsbCxjYWxsYmFj azpwLHNjb3BlOmp8fHdpbmRvdyxwYXJhbXM6bn19LGgpO2sudHJhbnNhY3Rpb249 RXh0LkFqYXgucmVxdWVzdChtKX19LGZvcm1VcGRhdGU6ZnVuY3Rpb24oayxoLGos bCl7dmFyIGk9dGhpcztpZihpLmZpcmVFdmVudChiLGkuZWwsayxoKSE9PWZhbHNl KXtpZihFeHQuaXNGdW5jdGlvbihoKSl7aD1oLmNhbGwoaSl9az1FeHQuZ2V0RG9t KGspO2kudHJhbnNhY3Rpb249RXh0LkFqYXgucmVxdWVzdCh7Zm9ybTprLHVybDpo LHN1Y2Nlc3M6YSxmYWlsdXJlOmUsc2NvcGU6aSx0aW1lb3V0OihpLnRpbWVvdXQq MTAwMCksYXJndW1lbnQ6e3VybDpoLGZvcm06ayxjYWxsYmFjazpsLHJlc2V0Omp9 fSk7aS5zaG93TG9hZGluZy5kZWZlcigxLGkpfX0sc3RhcnRBdXRvUmVmcmVzaDpm dW5jdGlvbihpLGosbCxtLGgpe3ZhciBrPXRoaXM7aWYoaCl7ay51cGRhdGUoanx8 ay5kZWZhdWx0VXJsLGwsbSx0cnVlKX1pZihrLmF1dG9SZWZyZXNoUHJvY0lkKXtj bGVhckludGVydmFsKGsuYXV0b1JlZnJlc2hQcm9jSWQpfWsuYXV0b1JlZnJlc2hQ cm9jSWQ9c2V0SW50ZXJ2YWwoay51cGRhdGUuY3JlYXRlRGVsZWdhdGUoayxbanx8 ay5kZWZhdWx0VXJsLGwsbSx0cnVlXSksaSoxMDAwKX0sc3RvcEF1dG9SZWZyZXNo OmZ1bmN0aW9uKCl7aWYodGhpcy5hdXRvUmVmcmVzaFByb2NJZCl7Y2xlYXJJbnRl cnZhbCh0aGlzLmF1dG9SZWZyZXNoUHJvY0lkKTtkZWxldGUgdGhpcy5hdXRvUmVm cmVzaFByb2NJZH19LGlzQXV0b1JlZnJlc2hpbmc6ZnVuY3Rpb24oKXtyZXR1cm4g ISF0aGlzLmF1dG9SZWZyZXNoUHJvY0lkfSxzaG93TG9hZGluZzpmdW5jdGlvbigp e2lmKHRoaXMuc2hvd0xvYWRJbmRpY2F0b3Ipe3RoaXMuZWwuZG9tLmlubmVySFRN TD10aGlzLmluZGljYXRvclRleHR9fSxhYm9ydDpmdW5jdGlvbigpe2lmKHRoaXMu dHJhbnNhY3Rpb24pe0V4dC5BamF4LmFib3J0KHRoaXMudHJhbnNhY3Rpb24pfX0s aXNVcGRhdGluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRyYW5zYWN0aW9uP0V4 dC5BamF4LmlzTG9hZGluZyh0aGlzLnRyYW5zYWN0aW9uKTpmYWxzZX0scmVmcmVz aDpmdW5jdGlvbihoKXtpZih0aGlzLmRlZmF1bHRVcmwpe3RoaXMudXBkYXRlKHRo aXMuZGVmYXVsdFVybCxudWxsLGgsdHJ1ZSl9fX19KCkpO0V4dC5VcGRhdGVyLmRl ZmF1bHRzPXt0aW1lb3V0OjMwLGRpc2FibGVDYWNoaW5nOmZhbHNlLHNob3dMb2Fk SW5kaWNhdG9yOnRydWUsaW5kaWNhdG9yVGV4dDonPGRpdiBjbGFzcz0ibG9hZGlu Zy1pbmRpY2F0b3IiPkxvYWRpbmcuLi48L2Rpdj4nLGxvYWRTY3JpcHRzOmZhbHNl LHNzbEJsYW5rVXJsOkV4dC5TU0xfU0VDVVJFX1VSTH07RXh0LlVwZGF0ZXIudXBk YXRlRWxlbWVudD1mdW5jdGlvbihkLGMsZSxiKXt2YXIgYT1FeHQuZ2V0KGQpLmdl dFVwZGF0ZXIoKTtFeHQuYXBwbHkoYSxiKTthLnVwZGF0ZShjLGUsYj9iLmNhbGxi YWNrOm51bGwpfTtFeHQuVXBkYXRlci5CYXNpY1JlbmRlcmVyPWZ1bmN0aW9uKCl7 fTtFeHQuVXBkYXRlci5CYXNpY1JlbmRlcmVyLnByb3RvdHlwZT17cmVuZGVyOmZ1 bmN0aW9uKGMsYSxiLGQpe2MudXBkYXRlKGEucmVzcG9uc2VUZXh0LGIubG9hZFNj cmlwdHMsZCl9fTsoZnVuY3Rpb24oKXtEYXRlLnVzZVN0cmljdD1mYWxzZTtmdW5j dGlvbiBiKGQpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3Vt ZW50cywxKTtyZXR1cm4gZC5yZXBsYWNlKC9ceyhcZCspXH0vZyxmdW5jdGlvbihl LGcpe3JldHVybiBjW2ddfSl9RGF0ZS5mb3JtYXRDb2RlVG9SZWdleD1mdW5jdGlv bihkLGMpe3ZhciBlPURhdGUucGFyc2VDb2Rlc1tkXTtpZihlKXtlPXR5cGVvZiBl PT0iZnVuY3Rpb24iP2UoKTplO0RhdGUucGFyc2VDb2Rlc1tkXT1lfXJldHVybiBl P0V4dC5hcHBseUlmKHtjOmUuYz9iKGUuYyxjfHwiezB9Iik6ZS5jfSxlKTp7Zzow LGM6bnVsbCxzOkV4dC5lc2NhcGVSZShkKX19O3ZhciBhPURhdGUuZm9ybWF0Q29k ZVRvUmVnZXg7RXh0LmFwcGx5KERhdGUse3BhcnNlRnVuY3Rpb25zOnsiTSQiOmZ1 bmN0aW9uKGQsYyl7dmFyIGU9bmV3IFJlZ0V4cCgiXFwvRGF0ZVxcKChbLStdKT8o XFxkKykoPzpbKy1dXFxkezR9KT9cXClcXC8iKTt2YXIgZz0oZHx8IiIpLm1hdGNo KGUpO3JldHVybiBnP25ldyBEYXRlKCgoZ1sxXXx8IiIpK2dbMl0pKjEpOm51bGx9 fSxwYXJzZVJlZ2V4ZXM6W10sZm9ybWF0RnVuY3Rpb25zOnsiTSQiOmZ1bmN0aW9u KCl7cmV0dXJuIlxcL0RhdGUoIit0aGlzLmdldFRpbWUoKSsiKVxcLyJ9fSx5MmtZ ZWFyOjUwLE1JTExJOiJtcyIsU0VDT05EOiJzIixNSU5VVEU6Im1pIixIT1VSOiJo IixEQVk6ImQiLE1PTlRIOiJtbyIsWUVBUjoieSIsZGVmYXVsdHM6e30sZGF5TmFt ZXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1 cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLG1vbnRoTmFtZXM6WyJKYW51YXJ5 IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHki LCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNl bWJlciJdLG1vbnRoTnVtYmVyczp7SmFuOjAsRmViOjEsTWFyOjIsQXByOjMsTWF5 OjQsSnVuOjUsSnVsOjYsQXVnOjcsU2VwOjgsT2N0OjksTm92OjEwLERlYzoxMX0s Z2V0U2hvcnRNb250aE5hbWU6ZnVuY3Rpb24oYyl7cmV0dXJuIERhdGUubW9udGhO YW1lc1tjXS5zdWJzdHJpbmcoMCwzKX0sZ2V0U2hvcnREYXlOYW1lOmZ1bmN0aW9u KGMpe3JldHVybiBEYXRlLmRheU5hbWVzW2NdLnN1YnN0cmluZygwLDMpfSxnZXRN b250aE51bWJlcjpmdW5jdGlvbihjKXtyZXR1cm4gRGF0ZS5tb250aE51bWJlcnNb Yy5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpK2Muc3Vic3RyaW5nKDEsMyku dG9Mb3dlckNhc2UoKV19LGZvcm1hdENvbnRhaW5zSG91ckluZm86KGZ1bmN0aW9u KCl7dmFyIGQ9LyhcXC4pL2csYz0vKFtnR2hIaXN1Y1VPUFpdfE1cJCkvO3JldHVy biBmdW5jdGlvbihlKXtyZXR1cm4gYy50ZXN0KGUucmVwbGFjZShkLCIiKSl9fSko KSxmb3JtYXRDb2Rlczp7ZDoiU3RyaW5nLmxlZnRQYWQodGhpcy5nZXREYXRlKCks IDIsICcwJykiLEQ6IkRhdGUuZ2V0U2hvcnREYXlOYW1lKHRoaXMuZ2V0RGF5KCkp IixqOiJ0aGlzLmdldERhdGUoKSIsbDoiRGF0ZS5kYXlOYW1lc1t0aGlzLmdldERh eSgpXSIsTjoiKHRoaXMuZ2V0RGF5KCkgPyB0aGlzLmdldERheSgpIDogNykiLFM6 InRoaXMuZ2V0U3VmZml4KCkiLHc6InRoaXMuZ2V0RGF5KCkiLHo6InRoaXMuZ2V0 RGF5T2ZZZWFyKCkiLFc6IlN0cmluZy5sZWZ0UGFkKHRoaXMuZ2V0V2Vla09mWWVh cigpLCAyLCAnMCcpIixGOiJEYXRlLm1vbnRoTmFtZXNbdGhpcy5nZXRNb250aCgp XSIsbToiU3RyaW5nLmxlZnRQYWQodGhpcy5nZXRNb250aCgpICsgMSwgMiwgJzAn KSIsTToiRGF0ZS5nZXRTaG9ydE1vbnRoTmFtZSh0aGlzLmdldE1vbnRoKCkpIixu OiIodGhpcy5nZXRNb250aCgpICsgMSkiLHQ6InRoaXMuZ2V0RGF5c0luTW9udGgo KSIsTDoiKHRoaXMuaXNMZWFwWWVhcigpID8gMSA6IDApIixvOiIodGhpcy5nZXRG dWxsWWVhcigpICsgKHRoaXMuZ2V0V2Vla09mWWVhcigpID09IDEgJiYgdGhpcy5n ZXRNb250aCgpID4gMCA/ICsxIDogKHRoaXMuZ2V0V2Vla09mWWVhcigpID49IDUy ICYmIHRoaXMuZ2V0TW9udGgoKSA8IDExID8gLTEgOiAwKSkpIixZOiJTdHJpbmcu bGVmdFBhZCh0aGlzLmdldEZ1bGxZZWFyKCksIDQsICcwJykiLHk6IignJyArIHRo aXMuZ2V0RnVsbFllYXIoKSkuc3Vic3RyaW5nKDIsIDQpIixhOiIodGhpcy5nZXRI b3VycygpIDwgMTIgPyAnYW0nIDogJ3BtJykiLEE6Iih0aGlzLmdldEhvdXJzKCkg PCAxMiA/ICdBTScgOiAnUE0nKSIsZzoiKCh0aGlzLmdldEhvdXJzKCkgJSAxMikg PyB0aGlzLmdldEhvdXJzKCkgJSAxMiA6IDEyKSIsRzoidGhpcy5nZXRIb3Vycygp IixoOiJTdHJpbmcubGVmdFBhZCgodGhpcy5nZXRIb3VycygpICUgMTIpID8gdGhp cy5nZXRIb3VycygpICUgMTIgOiAxMiwgMiwgJzAnKSIsSDoiU3RyaW5nLmxlZnRQ YWQodGhpcy5nZXRIb3VycygpLCAyLCAnMCcpIixpOiJTdHJpbmcubGVmdFBhZCh0 aGlzLmdldE1pbnV0ZXMoKSwgMiwgJzAnKSIsczoiU3RyaW5nLmxlZnRQYWQodGhp cy5nZXRTZWNvbmRzKCksIDIsICcwJykiLHU6IlN0cmluZy5sZWZ0UGFkKHRoaXMu Z2V0TWlsbGlzZWNvbmRzKCksIDMsICcwJykiLE86InRoaXMuZ2V0R01UT2Zmc2V0 KCkiLFA6InRoaXMuZ2V0R01UT2Zmc2V0KHRydWUpIixUOiJ0aGlzLmdldFRpbWV6 b25lKCkiLFo6Iih0aGlzLmdldFRpbWV6b25lT2Zmc2V0KCkgKiAtNjApIixjOmZ1 bmN0aW9uKCl7Zm9yKHZhciBrPSJZLW0tZFRIOmk6c1AiLGg9W10sZz0wLGQ9ay5s ZW5ndGg7ZzxkOysrZyl7dmFyIGo9ay5jaGFyQXQoZyk7aC5wdXNoKGo9PSJUIj8i J1QnIjpEYXRlLmdldEZvcm1hdENvZGUoaikpfXJldHVybiBoLmpvaW4oIiArICIp fSxVOiJNYXRoLnJvdW5kKHRoaXMuZ2V0VGltZSgpIC8gMTAwMCkifSxpc1ZhbGlk OmZ1bmN0aW9uKG8sYyxuLGssZyxqLGUpe2s9a3x8MDtnPWd8fDA7aj1qfHwwO2U9 ZXx8MDt2YXIgbD1uZXcgRGF0ZShvPDEwMD8xMDA6byxjLTEsbixrLGcsaixlKS5h ZGQoRGF0ZS5ZRUFSLG88MTAwP28tMTAwOjApO3JldHVybiBvPT1sLmdldEZ1bGxZ ZWFyKCkmJmM9PWwuZ2V0TW9udGgoKSsxJiZuPT1sLmdldERhdGUoKSYmaz09bC5n ZXRIb3VycygpJiZnPT1sLmdldE1pbnV0ZXMoKSYmaj09bC5nZXRTZWNvbmRzKCkm JmU9PWwuZ2V0TWlsbGlzZWNvbmRzKCl9LHBhcnNlRGF0ZTpmdW5jdGlvbihkLGcs Yyl7dmFyIGU9RGF0ZS5wYXJzZUZ1bmN0aW9ucztpZihlW2ddPT1udWxsKXtEYXRl LmNyZWF0ZVBhcnNlcihnKX1yZXR1cm4gZVtnXShkLEV4dC5pc0RlZmluZWQoYyk/ YzpEYXRlLnVzZVN0cmljdCl9LGdldEZvcm1hdENvZGU6ZnVuY3Rpb24oZCl7dmFy IGM9RGF0ZS5mb3JtYXRDb2Rlc1tkXTtpZihjKXtjPXR5cGVvZiBjPT0iZnVuY3Rp b24iP2MoKTpjO0RhdGUuZm9ybWF0Q29kZXNbZF09Y31yZXR1cm4gY3x8KCInIitT dHJpbmcuZXNjYXBlKGQpKyInIil9LGNyZWF0ZUZvcm1hdDpmdW5jdGlvbihoKXt2 YXIgZz1bXSxjPWZhbHNlLGU9IiI7Zm9yKHZhciBkPTA7ZDxoLmxlbmd0aDsrK2Qp e2U9aC5jaGFyQXQoZCk7aWYoIWMmJmU9PSJcXCIpe2M9dHJ1ZX1lbHNle2lmKGMp e2M9ZmFsc2U7Zy5wdXNoKCInIitTdHJpbmcuZXNjYXBlKGUpKyInIil9ZWxzZXtn LnB1c2goRGF0ZS5nZXRGb3JtYXRDb2RlKGUpKX19fURhdGUuZm9ybWF0RnVuY3Rp b25zW2hdPW5ldyBGdW5jdGlvbigicmV0dXJuICIrZy5qb2luKCIrIikpfSxjcmVh dGVQYXJzZXI6ZnVuY3Rpb24oKXt2YXIgYz1bInZhciBkdCwgeSwgbSwgZCwgaCwg aSwgcywgbXMsIG8sIHosIHp6LCB1LCB2LCIsImRlZiA9IERhdGUuZGVmYXVsdHMs IiwicmVzdWx0cyA9IFN0cmluZyhpbnB1dCkubWF0Y2goRGF0ZS5wYXJzZVJlZ2V4 ZXNbezB9XSk7IiwiaWYocmVzdWx0cyl7IiwiezF9IiwiaWYodSAhPSBudWxsKXsi LCJ2ID0gbmV3IERhdGUodSAqIDEwMDApOyIsIn1lbHNleyIsImR0ID0gKG5ldyBE YXRlKCkpLmNsZWFyVGltZSgpOyIsInkgPSBFeHQubnVtKHksIEV4dC5udW0oZGVm LnksIGR0LmdldEZ1bGxZZWFyKCkpKTsiLCJtID0gRXh0Lm51bShtLCBFeHQubnVt KGRlZi5tIC0gMSwgZHQuZ2V0TW9udGgoKSkpOyIsImQgPSBFeHQubnVtKGQsIEV4 dC5udW0oZGVmLmQsIGR0LmdldERhdGUoKSkpOyIsImggID0gRXh0Lm51bShoLCBF eHQubnVtKGRlZi5oLCBkdC5nZXRIb3VycygpKSk7IiwiaSAgPSBFeHQubnVtKGks IEV4dC5udW0oZGVmLmksIGR0LmdldE1pbnV0ZXMoKSkpOyIsInMgID0gRXh0Lm51 bShzLCBFeHQubnVtKGRlZi5zLCBkdC5nZXRTZWNvbmRzKCkpKTsiLCJtcyA9IEV4 dC5udW0obXMsIEV4dC5udW0oZGVmLm1zLCBkdC5nZXRNaWxsaXNlY29uZHMoKSkp OyIsImlmKHogPj0gMCAmJiB5ID49IDApeyIsInYgPSBuZXcgRGF0ZSh5IDwgMTAw ID8gMTAwIDogeSwgMCwgMSwgaCwgaSwgcywgbXMpLmFkZChEYXRlLllFQVIsIHkg PCAxMDAgPyB5IC0gMTAwIDogMCk7IiwidiA9ICFzdHJpY3Q/IHYgOiAoc3RyaWN0 ID09PSB0cnVlICYmICh6IDw9IDM2NCB8fCAodi5pc0xlYXBZZWFyKCkgJiYgeiA8 PSAzNjUpKT8gdi5hZGQoRGF0ZS5EQVksIHopIDogbnVsbCk7IiwifWVsc2UgaWYo c3RyaWN0ID09PSB0cnVlICYmICFEYXRlLmlzVmFsaWQoeSwgbSArIDEsIGQsIGgs IGksIHMsIG1zKSl7IiwidiA9IG51bGw7IiwifWVsc2V7IiwidiA9IG5ldyBEYXRl KHkgPCAxMDAgPyAxMDAgOiB5LCBtLCBkLCBoLCBpLCBzLCBtcykuYWRkKERhdGUu WUVBUiwgeSA8IDEwMCA/IHkgLSAxMDAgOiAwKTsiLCJ9IiwifSIsIn0iLCJpZih2 KXsiLCJpZih6eiAhPSBudWxsKXsiLCJ2ID0gdi5hZGQoRGF0ZS5TRUNPTkQsIC12 LmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MCAtIHp6KTsiLCJ9ZWxzZSBpZihvKXsi LCJ2ID0gdi5hZGQoRGF0ZS5NSU5VVEUsIC12LmdldFRpbWV6b25lT2Zmc2V0KCkg KyAoc24gPT0gJysnPyAtMSA6IDEpICogKGhyICogNjAgKyBtbikpOyIsIn0iLCJ9 IiwicmV0dXJuIHY7Il0uam9pbigiXG4iKTtyZXR1cm4gZnVuY3Rpb24obSl7dmFy IGU9RGF0ZS5wYXJzZVJlZ2V4ZXMubGVuZ3RoLG89MSxnPVtdLGw9W10saz1mYWxz ZSxkPSIiLGo9MCxoLG47Zm9yKDtqPG0ubGVuZ3RoOysrail7ZD1tLmNoYXJBdChq KTtpZighayYmZD09IlxcIil7az10cnVlfWVsc2V7aWYoayl7az1mYWxzZTtsLnB1 c2goU3RyaW5nLmVzY2FwZShkKSl9ZWxzZXtoPWEoZCxvKTtvKz1oLmc7bC5wdXNo KGgucyk7aWYoaC5nJiZoLmMpe2lmKGguY2FsY0xhc3Qpe249aC5jfWVsc2V7Zy5w dXNoKGguYyl9fX19fWlmKG4pe2cucHVzaChuKX1EYXRlLnBhcnNlUmVnZXhlc1tl XT1uZXcgUmVnRXhwKCJeIitsLmpvaW4oIiIpKyIkIiwiaSIpO0RhdGUucGFyc2VG dW5jdGlvbnNbbV09bmV3IEZ1bmN0aW9uKCJpbnB1dCIsInN0cmljdCIsYihjLGUs Zy5qb2luKCIiKSkpfX0oKSxwYXJzZUNvZGVzOntkOntnOjEsYzoiZCA9IHBhcnNl SW50KHJlc3VsdHNbezB9XSwgMTApO1xuIixzOiIoXFxkezJ9KSJ9LGo6e2c6MSxj OiJkID0gcGFyc2VJbnQocmVzdWx0c1t7MH1dLCAxMCk7XG4iLHM6IihcXGR7MSwy fSkifSxEOmZ1bmN0aW9uKCl7Zm9yKHZhciBjPVtdLGQ9MDtkPDc7Yy5wdXNoKERh dGUuZ2V0U2hvcnREYXlOYW1lKGQpKSwrK2Qpe31yZXR1cm57ZzowLGM6bnVsbCxz OiIoPzoiK2Muam9pbigifCIpKyIpIn19LGw6ZnVuY3Rpb24oKXtyZXR1cm57Zzow LGM6bnVsbCxzOiIoPzoiK0RhdGUuZGF5TmFtZXMuam9pbigifCIpKyIpIn19LE46 e2c6MCxjOm51bGwsczoiWzEtN10ifSxTOntnOjAsYzpudWxsLHM6Iig/OnN0fG5k fHJkfHRoKSJ9LHc6e2c6MCxjOm51bGwsczoiWzAtNl0ifSx6OntnOjEsYzoieiA9 IHBhcnNlSW50KHJlc3VsdHNbezB9XSwgMTApO1xuIixzOiIoXFxkezEsM30pIn0s Vzp7ZzowLGM6bnVsbCxzOiIoPzpcXGR7Mn0pIn0sRjpmdW5jdGlvbigpe3JldHVy bntnOjEsYzoibSA9IHBhcnNlSW50KERhdGUuZ2V0TW9udGhOdW1iZXIocmVzdWx0 c1t7MH1dKSwgMTApO1xuIixzOiIoIitEYXRlLm1vbnRoTmFtZXMuam9pbigifCIp KyIpIn19LE06ZnVuY3Rpb24oKXtmb3IodmFyIGM9W10sZD0wO2Q8MTI7Yy5wdXNo KERhdGUuZ2V0U2hvcnRNb250aE5hbWUoZCkpLCsrZCl7fXJldHVybiBFeHQuYXBw bHlJZih7czoiKCIrYy5qb2luKCJ8IikrIikifSxhKCJGIikpfSxtOntnOjEsYzoi bSA9IHBhcnNlSW50KHJlc3VsdHNbezB9XSwgMTApIC0gMTtcbiIsczoiKFxcZHsy fSkifSxuOntnOjEsYzoibSA9IHBhcnNlSW50KHJlc3VsdHNbezB9XSwgMTApIC0g MTtcbiIsczoiKFxcZHsxLDJ9KSJ9LHQ6e2c6MCxjOm51bGwsczoiKD86XFxkezJ9 KSJ9LEw6e2c6MCxjOm51bGwsczoiKD86MXwwKSJ9LG86ZnVuY3Rpb24oKXtyZXR1 cm4gYSgiWSIpfSxZOntnOjEsYzoieSA9IHBhcnNlSW50KHJlc3VsdHNbezB9XSwg MTApO1xuIixzOiIoXFxkezR9KSJ9LHk6e2c6MSxjOiJ2YXIgdHkgPSBwYXJzZUlu dChyZXN1bHRzW3swfV0sIDEwKTtcbnkgPSB0eSA+IERhdGUueTJrWWVhciA/IDE5 MDAgKyB0eSA6IDIwMDAgKyB0eTtcbiIsczoiKFxcZHsxLDJ9KSJ9LGE6ZnVuY3Rp b24oKXtyZXR1cm4gYSgiQSIpfSxBOntjYWxjTGFzdDp0cnVlLGc6MSxjOiJpZiAo LyhhbSkvaS50ZXN0KHJlc3VsdHNbezB9XSkpIHtcbmlmICghaCB8fCBoID09IDEy KSB7IGggPSAwOyB9XG59IGVsc2UgeyBpZiAoIWggfHwgaCA8IDEyKSB7IGggPSAo aCB8fCAwKSArIDEyOyB9fSIsczoiKEFNfFBNfGFtfHBtKSJ9LGc6ZnVuY3Rpb24o KXtyZXR1cm4gYSgiRyIpfSxHOntnOjEsYzoiaCA9IHBhcnNlSW50KHJlc3VsdHNb ezB9XSwgMTApO1xuIixzOiIoXFxkezEsMn0pIn0saDpmdW5jdGlvbigpe3JldHVy biBhKCJIIil9LEg6e2c6MSxjOiJoID0gcGFyc2VJbnQocmVzdWx0c1t7MH1dLCAx MCk7XG4iLHM6IihcXGR7Mn0pIn0saTp7ZzoxLGM6ImkgPSBwYXJzZUludChyZXN1 bHRzW3swfV0sIDEwKTtcbiIsczoiKFxcZHsyfSkifSxzOntnOjEsYzoicyA9IHBh cnNlSW50KHJlc3VsdHNbezB9XSwgMTApO1xuIixzOiIoXFxkezJ9KSJ9LHU6e2c6 MSxjOiJtcyA9IHJlc3VsdHNbezB9XTsgbXMgPSBwYXJzZUludChtcywgMTApL01h dGgucG93KDEwLCBtcy5sZW5ndGggLSAzKTtcbiIsczoiKFxcZCspIn0sTzp7Zzox LGM6WyJvID0gcmVzdWx0c1t7MH1dOyIsInZhciBzbiA9IG8uc3Vic3RyaW5nKDAs MSksIiwiaHIgPSBvLnN1YnN0cmluZygxLDMpKjEgKyBNYXRoLmZsb29yKG8uc3Vi c3RyaW5nKDMsNSkgLyA2MCksIiwibW4gPSBvLnN1YnN0cmluZygzLDUpICUgNjA7 IiwibyA9ICgoLTEyIDw9IChocio2MCArIG1uKS82MCkgJiYgKChocio2MCArIG1u KS82MCA8PSAxNCkpPyAoc24gKyBTdHJpbmcubGVmdFBhZChociwgMiwgJzAnKSAr IFN0cmluZy5sZWZ0UGFkKG1uLCAyLCAnMCcpKSA6IG51bGw7XG4iXS5qb2luKCJc biIpLHM6IihbKy1dXFxkezR9KSJ9LFA6e2c6MSxjOlsibyA9IHJlc3VsdHNbezB9 XTsiLCJ2YXIgc24gPSBvLnN1YnN0cmluZygwLDEpLCIsImhyID0gby5zdWJzdHJp bmcoMSwzKSoxICsgTWF0aC5mbG9vcihvLnN1YnN0cmluZyg0LDYpIC8gNjApLCIs Im1uID0gby5zdWJzdHJpbmcoNCw2KSAlIDYwOyIsIm8gPSAoKC0xMiA8PSAoaHIq NjAgKyBtbikvNjApICYmICgoaHIqNjAgKyBtbikvNjAgPD0gMTQpKT8gKHNuICsg U3RyaW5nLmxlZnRQYWQoaHIsIDIsICcwJykgKyBTdHJpbmcubGVmdFBhZChtbiwg MiwgJzAnKSkgOiBudWxsO1xuIl0uam9pbigiXG4iKSxzOiIoWystXVxcZHsyfTpc XGR7Mn0pIn0sVDp7ZzowLGM6bnVsbCxzOiJbQS1aXXsxLDR9In0sWjp7ZzoxLGM6 Inp6ID0gcmVzdWx0c1t7MH1dICogMTtcbnp6ID0gKC00MzIwMCA8PSB6eiAmJiB6 eiA8PSA1MDQwMCk/IHp6IDogbnVsbDtcbiIsczoiKFsrLV0/XFxkezEsNX0pIn0s YzpmdW5jdGlvbigpe3ZhciBlPVtdLGM9W2EoIlkiLDEpLGEoIm0iLDIpLGEoImQi LDMpLGEoImgiLDQpLGEoImkiLDUpLGEoInMiLDYpLHtjOiJtcyA9IHJlc3VsdHNb N10gfHwgJzAnOyBtcyA9IHBhcnNlSW50KG1zLCAxMCkvTWF0aC5wb3coMTAsIG1z Lmxlbmd0aCAtIDMpO1xuIn0se2M6WyJpZihyZXN1bHRzWzhdKSB7IiwiaWYocmVz dWx0c1s4XSA9PSAnWicpeyIsInp6ID0gMDsiLCJ9ZWxzZSBpZiAocmVzdWx0c1s4 XS5pbmRleE9mKCc6JykgPiAtMSl7IixhKCJQIiw4KS5jLCJ9ZWxzZXsiLGEoIk8i LDgpLmMsIn0iLCJ9Il0uam9pbigiXG4iKX1dO2Zvcih2YXIgZz0wLGQ9Yy5sZW5n dGg7ZzxkOysrZyl7ZS5wdXNoKGNbZ10uYyl9cmV0dXJue2c6MSxjOmUuam9pbigi IiksczpbY1swXS5zLCIoPzoiLCItIixjWzFdLnMsIig/OiIsIi0iLGNbMl0ucywi KD86IiwiKD86VHwgKT8iLGNbM10ucywiOiIsY1s0XS5zLCIoPzo6IixjWzVdLnMs Iik/IiwiKD86KD86XFwufCwpKFxcZCspKT8iLCIoWnwoPzpbLStdXFxkezJ9KD86 Oik/XFxkezJ9KSk/IiwiKT8iLCIpPyIsIik/Il0uam9pbigiIil9fSxVOntnOjEs YzoidSA9IHBhcnNlSW50KHJlc3VsdHNbezB9XSwgMTApO1xuIixzOiIoLT9cXGQr KSJ9fX0pfSgpKTtFeHQuYXBwbHkoRGF0ZS5wcm90b3R5cGUse2RhdGVGb3JtYXQ6 ZnVuY3Rpb24oYSl7aWYoRGF0ZS5mb3JtYXRGdW5jdGlvbnNbYV09PW51bGwpe0Rh dGUuY3JlYXRlRm9ybWF0KGEpfXJldHVybiBEYXRlLmZvcm1hdEZ1bmN0aW9uc1th XS5jYWxsKHRoaXMpfSxnZXRUaW1lem9uZTpmdW5jdGlvbigpe3JldHVybiB0aGlz LnRvU3RyaW5nKCkucmVwbGFjZSgvXi4qICg/OlwoKC4qKVwpfChbQS1aXXsxLDR9 KSg/OltcLStdWzAtOV17NH0pPyg/OiAtP1xkKyk/KSQvLCIkMSQyIikucmVwbGFj ZSgvW15BLVpdL2csIiIpfSxnZXRHTVRPZmZzZXQ6ZnVuY3Rpb24oYSl7cmV0dXJu KHRoaXMuZ2V0VGltZXpvbmVPZmZzZXQoKT4wPyItIjoiKyIpK1N0cmluZy5sZWZ0 UGFkKE1hdGguZmxvb3IoTWF0aC5hYnModGhpcy5nZXRUaW1lem9uZU9mZnNldCgp KS82MCksMiwiMCIpKyhhPyI6IjoiIikrU3RyaW5nLmxlZnRQYWQoTWF0aC5hYnMo dGhpcy5nZXRUaW1lem9uZU9mZnNldCgpJTYwKSwyLCIwIil9LGdldERheU9mWWVh cjpmdW5jdGlvbigpe3ZhciBiPTAsZT10aGlzLmNsb25lKCksYT10aGlzLmdldE1v bnRoKCksYztmb3IoYz0wLGUuc2V0RGF0ZSgxKSxlLnNldE1vbnRoKDApO2M8YTtl LnNldE1vbnRoKCsrYykpe2IrPWUuZ2V0RGF5c0luTW9udGgoKX1yZXR1cm4gYit0 aGlzLmdldERhdGUoKS0xfSxnZXRXZWVrT2ZZZWFyOmZ1bmN0aW9uKCl7dmFyIGE9 ODY0MDAwMDAsYj03KmE7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGQ9RGF0ZS5VVEMo dGhpcy5nZXRGdWxsWWVhcigpLHRoaXMuZ2V0TW9udGgoKSx0aGlzLmdldERhdGUo KSszKS9hLGM9TWF0aC5mbG9vcihkLzcpLGU9bmV3IERhdGUoYypiKS5nZXRVVENG dWxsWWVhcigpO3JldHVybiBjLU1hdGguZmxvb3IoRGF0ZS5VVEMoZSwwLDcpL2Ip KzF9fSgpLGlzTGVhcFllYXI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEZ1bGxZ ZWFyKCk7cmV0dXJuICEhKChhJjMpPT0wJiYoYSUxMDB8fChhJTQwMD09MCYmYSkp KX0sZ2V0Rmlyc3REYXlPZk1vbnRoOmZ1bmN0aW9uKCl7dmFyIGE9KHRoaXMuZ2V0 RGF5KCktKHRoaXMuZ2V0RGF0ZSgpLTEpKSU3O3JldHVybihhPDApPyhhKzcpOmF9 LGdldExhc3REYXlPZk1vbnRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TGFz dERhdGVPZk1vbnRoKCkuZ2V0RGF5KCl9LGdldEZpcnN0RGF0ZU9mTW9udGg6ZnVu Y3Rpb24oKXtyZXR1cm4gbmV3IERhdGUodGhpcy5nZXRGdWxsWWVhcigpLHRoaXMu Z2V0TW9udGgoKSwxKX0sZ2V0TGFzdERhdGVPZk1vbnRoOmZ1bmN0aW9uKCl7cmV0 dXJuIG5ldyBEYXRlKHRoaXMuZ2V0RnVsbFllYXIoKSx0aGlzLmdldE1vbnRoKCks dGhpcy5nZXREYXlzSW5Nb250aCgpKX0sZ2V0RGF5c0luTW9udGg6ZnVuY3Rpb24o KXt2YXIgYT1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO3Jl dHVybiBmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0TW9udGgoKTtyZXR1cm4gYj09 MSYmdGhpcy5pc0xlYXBZZWFyKCk/Mjk6YVtiXX19KCksZ2V0U3VmZml4OmZ1bmN0 aW9uKCl7c3dpdGNoKHRoaXMuZ2V0RGF0ZSgpKXtjYXNlIDE6Y2FzZSAyMTpjYXNl IDMxOnJldHVybiJzdCI7Y2FzZSAyOmNhc2UgMjI6cmV0dXJuIm5kIjtjYXNlIDM6 Y2FzZSAyMzpyZXR1cm4icmQiO2RlZmF1bHQ6cmV0dXJuInRoIn19LGNsb25lOmZ1 bmN0aW9uKCl7cmV0dXJuIG5ldyBEYXRlKHRoaXMuZ2V0VGltZSgpKX0saXNEU1Q6 ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERhdGUodGhpcy5nZXRGdWxsWWVhcigpLDAs MSkuZ2V0VGltZXpvbmVPZmZzZXQoKSE9dGhpcy5nZXRUaW1lem9uZU9mZnNldCgp fSxjbGVhclRpbWU6ZnVuY3Rpb24oZyl7aWYoZyl7cmV0dXJuIHRoaXMuY2xvbmUo KS5jbGVhclRpbWUoKX12YXIgYj10aGlzLmdldERhdGUoKTt0aGlzLnNldEhvdXJz KDApO3RoaXMuc2V0TWludXRlcygwKTt0aGlzLnNldFNlY29uZHMoMCk7dGhpcy5z ZXRNaWxsaXNlY29uZHMoMCk7aWYodGhpcy5nZXREYXRlKCkhPWIpe2Zvcih2YXIg YT0xLGU9dGhpcy5hZGQoRGF0ZS5IT1VSLGEpO2UuZ2V0RGF0ZSgpIT1iO2ErKyxl PXRoaXMuYWRkKERhdGUuSE9VUixhKSl7fXRoaXMuc2V0RGF0ZShiKTt0aGlzLnNl dEhvdXJzKGUuZ2V0SG91cnMoKSl9cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihi LGMpe3ZhciBlPXRoaXMuY2xvbmUoKTtpZighYnx8Yz09PTApe3JldHVybiBlfXN3 aXRjaChiLnRvTG93ZXJDYXNlKCkpe2Nhc2UgRGF0ZS5NSUxMSTplLnNldE1pbGxp c2Vjb25kcyh0aGlzLmdldE1pbGxpc2Vjb25kcygpK2MpO2JyZWFrO2Nhc2UgRGF0 ZS5TRUNPTkQ6ZS5zZXRTZWNvbmRzKHRoaXMuZ2V0U2Vjb25kcygpK2MpO2JyZWFr O2Nhc2UgRGF0ZS5NSU5VVEU6ZS5zZXRNaW51dGVzKHRoaXMuZ2V0TWludXRlcygp K2MpO2JyZWFrO2Nhc2UgRGF0ZS5IT1VSOmUuc2V0SG91cnModGhpcy5nZXRIb3Vy cygpK2MpO2JyZWFrO2Nhc2UgRGF0ZS5EQVk6ZS5zZXREYXRlKHRoaXMuZ2V0RGF0 ZSgpK2MpO2JyZWFrO2Nhc2UgRGF0ZS5NT05USDp2YXIgYT10aGlzLmdldERhdGUo KTtpZihhPjI4KXthPU1hdGgubWluKGEsdGhpcy5nZXRGaXJzdERhdGVPZk1vbnRo KCkuYWRkKCJtbyIsYykuZ2V0TGFzdERhdGVPZk1vbnRoKCkuZ2V0RGF0ZSgpKX1l LnNldERhdGUoYSk7ZS5zZXRNb250aCh0aGlzLmdldE1vbnRoKCkrYyk7YnJlYWs7 Y2FzZSBEYXRlLllFQVI6ZS5zZXRGdWxsWWVhcih0aGlzLmdldEZ1bGxZZWFyKCkr Yyk7YnJlYWt9cmV0dXJuIGV9LGJldHdlZW46ZnVuY3Rpb24oYyxhKXt2YXIgYj10 aGlzLmdldFRpbWUoKTtyZXR1cm4gYy5nZXRUaW1lKCk8PWImJmI8PWEuZ2V0VGlt ZSgpfX0pO0RhdGUucHJvdG90eXBlLmZvcm1hdD1EYXRlLnByb3RvdHlwZS5kYXRl Rm9ybWF0O2lmKEV4dC5pc1NhZmFyaSYmKG5hdmlnYXRvci51c2VyQWdlbnQubWF0 Y2goL1dlYktpdFwvKFxkKykvKVsxXXx8TmFOKTw0MjApe0V4dC5hcHBseShEYXRl LnByb3RvdHlwZSx7X3hNb250aDpEYXRlLnByb3RvdHlwZS5zZXRNb250aCxfeERh dGU6RGF0ZS5wcm90b3R5cGUuc2V0RGF0ZSxzZXRNb250aDpmdW5jdGlvbihhKXtp ZihhPD0tMSl7dmFyIGQ9TWF0aC5jZWlsKC1hKSxjPU1hdGguY2VpbChkLzEyKSxi PShkJTEyKT8xMi1kJTEyOjA7dGhpcy5zZXRGdWxsWWVhcih0aGlzLmdldEZ1bGxZ ZWFyKCktYyk7cmV0dXJuIHRoaXMuX3hNb250aChiKX1lbHNle3JldHVybiB0aGlz Ll94TW9udGgoYSl9fSxzZXREYXRlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNl dFRpbWUodGhpcy5nZXRUaW1lKCktKHRoaXMuZ2V0RGF0ZSgpLWEpKjg2NDAwMDAw KX19KX1FeHQudXRpbC5NaXhlZENvbGxlY3Rpb249ZnVuY3Rpb24oYixhKXt0aGlz Lml0ZW1zPVtdO3RoaXMubWFwPXt9O3RoaXMua2V5cz1bXTt0aGlzLmxlbmd0aD0w O3RoaXMuYWRkRXZlbnRzKCJjbGVhciIsImFkZCIsInJlcGxhY2UiLCJyZW1vdmUi LCJzb3J0Iik7dGhpcy5hbGxvd0Z1bmN0aW9ucz1iPT09dHJ1ZTtpZihhKXt0aGlz LmdldEtleT1hfUV4dC51dGlsLk1peGVkQ29sbGVjdGlvbi5zdXBlcmNsYXNzLmNv bnN0cnVjdG9yLmNhbGwodGhpcyl9O0V4dC5leHRlbmQoRXh0LnV0aWwuTWl4ZWRD b2xsZWN0aW9uLEV4dC51dGlsLk9ic2VydmFibGUse2FsbG93RnVuY3Rpb25zOmZh bHNlLGFkZDpmdW5jdGlvbihiLGMpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PTEpe2M9 YXJndW1lbnRzWzBdO2I9dGhpcy5nZXRLZXkoYyl9aWYodHlwZW9mIGIhPSJ1bmRl ZmluZWQiJiZiIT09bnVsbCl7dmFyIGE9dGhpcy5tYXBbYl07aWYodHlwZW9mIGEh PSJ1bmRlZmluZWQiKXtyZXR1cm4gdGhpcy5yZXBsYWNlKGIsYyl9dGhpcy5tYXBb Yl09Y310aGlzLmxlbmd0aCsrO3RoaXMuaXRlbXMucHVzaChjKTt0aGlzLmtleXMu cHVzaChiKTt0aGlzLmZpcmVFdmVudCgiYWRkIix0aGlzLmxlbmd0aC0xLGMsYik7 cmV0dXJuIGN9LGdldEtleTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pZH0scmVwbGFj ZTpmdW5jdGlvbihjLGQpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PTEpe2Q9YXJndW1l bnRzWzBdO2M9dGhpcy5nZXRLZXkoZCl9dmFyIGE9dGhpcy5tYXBbY107aWYodHlw ZW9mIGM9PSJ1bmRlZmluZWQifHxjPT09bnVsbHx8dHlwZW9mIGE9PSJ1bmRlZmlu ZWQiKXtyZXR1cm4gdGhpcy5hZGQoYyxkKX12YXIgYj10aGlzLmluZGV4T2ZLZXko Yyk7dGhpcy5pdGVtc1tiXT1kO3RoaXMubWFwW2NdPWQ7dGhpcy5maXJlRXZlbnQo InJlcGxhY2UiLGMsYSxkKTtyZXR1cm4gZH0sYWRkQWxsOmZ1bmN0aW9uKGUpe2lm KGFyZ3VtZW50cy5sZW5ndGg+MXx8RXh0LmlzQXJyYXkoZSkpe3ZhciBiPWFyZ3Vt ZW50cy5sZW5ndGg+MT9hcmd1bWVudHM6ZTtmb3IodmFyIGQ9MCxhPWIubGVuZ3Ro O2Q8YTtkKyspe3RoaXMuYWRkKGJbZF0pfX1lbHNle2Zvcih2YXIgYyBpbiBlKXtp Zih0aGlzLmFsbG93RnVuY3Rpb25zfHx0eXBlb2YgZVtjXSE9ImZ1bmN0aW9uIil7 dGhpcy5hZGQoYyxlW2NdKX19fX0sZWFjaDpmdW5jdGlvbihlLGQpe3ZhciBiPVtd LmNvbmNhdCh0aGlzLml0ZW1zKTtmb3IodmFyIGM9MCxhPWIubGVuZ3RoO2M8YTtj Kyspe2lmKGUuY2FsbChkfHxiW2NdLGJbY10sYyxhKT09PWZhbHNlKXticmVha319 fSxlYWNoS2V5OmZ1bmN0aW9uKGQsYyl7Zm9yKHZhciBiPTAsYT10aGlzLmtleXMu bGVuZ3RoO2I8YTtiKyspe2QuY2FsbChjfHx3aW5kb3csdGhpcy5rZXlzW2JdLHRo aXMuaXRlbXNbYl0sYixhKX19LGZpbmQ6ZnVuY3Rpb24oZCxjKXtmb3IodmFyIGI9 MCxhPXRoaXMuaXRlbXMubGVuZ3RoO2I8YTtiKyspe2lmKGQuY2FsbChjfHx3aW5k b3csdGhpcy5pdGVtc1tiXSx0aGlzLmtleXNbYl0pKXtyZXR1cm4gdGhpcy5pdGVt c1tiXX19cmV0dXJuIG51bGx9LGluc2VydDpmdW5jdGlvbihhLGIsYyl7aWYoYXJn dW1lbnRzLmxlbmd0aD09Mil7Yz1hcmd1bWVudHNbMV07Yj10aGlzLmdldEtleShj KX1pZih0aGlzLmNvbnRhaW5zS2V5KGIpKXt0aGlzLnN1c3BlbmRFdmVudHMoKTt0 aGlzLnJlbW92ZUtleShiKTt0aGlzLnJlc3VtZUV2ZW50cygpfWlmKGE+PXRoaXMu bGVuZ3RoKXtyZXR1cm4gdGhpcy5hZGQoYixjKX10aGlzLmxlbmd0aCsrO3RoaXMu aXRlbXMuc3BsaWNlKGEsMCxjKTtpZih0eXBlb2YgYiE9InVuZGVmaW5lZCImJmIh PT1udWxsKXt0aGlzLm1hcFtiXT1jfXRoaXMua2V5cy5zcGxpY2UoYSwwLGIpO3Ro aXMuZmlyZUV2ZW50KCJhZGQiLGEsYyxiKTtyZXR1cm4gY30scmVtb3ZlOmZ1bmN0 aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZUF0KHRoaXMuaW5kZXhPZihhKSl9LHJl bW92ZUF0OmZ1bmN0aW9uKGEpe2lmKGE8dGhpcy5sZW5ndGgmJmE+PTApe3RoaXMu bGVuZ3RoLS07dmFyIGM9dGhpcy5pdGVtc1thXTt0aGlzLml0ZW1zLnNwbGljZShh LDEpO3ZhciBiPXRoaXMua2V5c1thXTtpZih0eXBlb2YgYiE9InVuZGVmaW5lZCIp e2RlbGV0ZSB0aGlzLm1hcFtiXX10aGlzLmtleXMuc3BsaWNlKGEsMSk7dGhpcy5m aXJlRXZlbnQoInJlbW92ZSIsYyxiKTtyZXR1cm4gY31yZXR1cm4gZmFsc2V9LHJl bW92ZUtleTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmVBdCh0aGlzLmlu ZGV4T2ZLZXkoYSkpfSxnZXRDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxl bmd0aH0saW5kZXhPZjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pdGVtcy5pbmRl eE9mKGEpfSxpbmRleE9mS2V5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmtleXMu aW5kZXhPZihhKX0saXRlbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLm1hcFtiXSxj PWEhPT11bmRlZmluZWQ/YToodHlwZW9mIGI9PSJudW1iZXIiKT90aGlzLml0ZW1z W2JdOnVuZGVmaW5lZDtyZXR1cm4gdHlwZW9mIGMhPSJmdW5jdGlvbiJ8fHRoaXMu YWxsb3dGdW5jdGlvbnM/YzpudWxsfSxpdGVtQXQ6ZnVuY3Rpb24oYSl7cmV0dXJu IHRoaXMuaXRlbXNbYV19LGtleTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tYXBb YV19LGNvbnRhaW5zOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmluZGV4T2YoYSkh PS0xfSxjb250YWluc0tleTpmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIHRoaXMu bWFwW2FdIT0idW5kZWZpbmVkIn0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmxlbmd0 aD0wO3RoaXMuaXRlbXM9W107dGhpcy5rZXlzPVtdO3RoaXMubWFwPXt9O3RoaXMu ZmlyZUV2ZW50KCJjbGVhciIpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlz Lml0ZW1zWzBdfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlbXNbdGhp cy5sZW5ndGgtMV19LF9zb3J0OmZ1bmN0aW9uKGssYSxqKXt2YXIgZCxlLGI9U3Ry aW5nKGEpLnRvVXBwZXJDYXNlKCk9PSJERVNDIj8tMToxLGg9W10sbD10aGlzLmtl eXMsZz10aGlzLml0ZW1zO2o9anx8ZnVuY3Rpb24oaSxjKXtyZXR1cm4gaS1jfTtm b3IoZD0wLGU9Zy5sZW5ndGg7ZDxlO2QrKyl7aFtoLmxlbmd0aF09e2tleTpsW2Rd LHZhbHVlOmdbZF0saW5kZXg6ZH19aC5zb3J0KGZ1bmN0aW9uKGksYyl7dmFyIG09 aihpW2tdLGNba10pKmI7aWYobT09PTApe209KGkuaW5kZXg8Yy5pbmRleD8tMTox KX1yZXR1cm4gbX0pO2ZvcihkPTAsZT1oLmxlbmd0aDtkPGU7ZCsrKXtnW2RdPWhb ZF0udmFsdWU7bFtkXT1oW2RdLmtleX10aGlzLmZpcmVFdmVudCgic29ydCIsdGhp cyl9LHNvcnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLl9zb3J0KCJ2YWx1ZSIsYSxiKX0s cmVvcmRlcjpmdW5jdGlvbihkKXt0aGlzLnN1c3BlbmRFdmVudHMoKTt2YXIgYj10 aGlzLml0ZW1zLGM9MCxnPWIubGVuZ3RoLGE9W10sZT1bXSxoO2ZvcihoIGluIGQp e2FbZFtoXV09YltoXX1mb3IoYz0wO2M8ZztjKyspe2lmKGRbY109PXVuZGVmaW5l ZCl7ZS5wdXNoKGJbY10pfX1mb3IoYz0wO2M8ZztjKyspe2lmKGFbY109PXVuZGVm aW5lZCl7YVtjXT1lLnNoaWZ0KCl9fXRoaXMuY2xlYXIoKTt0aGlzLmFkZEFsbChh KTt0aGlzLnJlc3VtZUV2ZW50cygpO3RoaXMuZmlyZUV2ZW50KCJzb3J0Iix0aGlz KX0sa2V5U29ydDpmdW5jdGlvbihhLGIpe3RoaXMuX3NvcnQoImtleSIsYSxifHxm dW5jdGlvbihkLGMpe3ZhciBnPVN0cmluZyhkKS50b1VwcGVyQ2FzZSgpLGU9U3Ry aW5nKGMpLnRvVXBwZXJDYXNlKCk7cmV0dXJuIGc+ZT8xOihnPGU/LTE6MCl9KX0s Z2V0UmFuZ2U6ZnVuY3Rpb24oZSxhKXt2YXIgYj10aGlzLml0ZW1zO2lmKGIubGVu Z3RoPDEpe3JldHVybltdfWU9ZXx8MDthPU1hdGgubWluKHR5cGVvZiBhPT0idW5k ZWZpbmVkIj90aGlzLmxlbmd0aC0xOmEsdGhpcy5sZW5ndGgtMSk7dmFyIGMsZD1b XTtpZihlPD1hKXtmb3IoYz1lO2M8PWE7YysrKXtkW2QubGVuZ3RoXT1iW2NdfX1l bHNle2ZvcihjPWU7Yz49YTtjLS0pe2RbZC5sZW5ndGhdPWJbY119fXJldHVybiBk fSxmaWx0ZXI6ZnVuY3Rpb24oYyxiLGQsYSl7aWYoRXh0LmlzRW1wdHkoYixmYWxz ZSkpe3JldHVybiB0aGlzLmNsb25lKCl9Yj10aGlzLmNyZWF0ZVZhbHVlTWF0Y2hl cihiLGQsYSk7cmV0dXJuIHRoaXMuZmlsdGVyQnkoZnVuY3Rpb24oZSl7cmV0dXJu IGUmJmIudGVzdChlW2NdKX0pfSxmaWx0ZXJCeTpmdW5jdGlvbihnLGUpe3ZhciBo PW5ldyBFeHQudXRpbC5NaXhlZENvbGxlY3Rpb24oKTtoLmdldEtleT10aGlzLmdl dEtleTt2YXIgYj10aGlzLmtleXMsZD10aGlzLml0ZW1zO2Zvcih2YXIgYz0wLGE9 ZC5sZW5ndGg7YzxhO2MrKyl7aWYoZy5jYWxsKGV8fHRoaXMsZFtjXSxiW2NdKSl7 aC5hZGQoYltjXSxkW2NdKX19cmV0dXJuIGh9LGZpbmRJbmRleDpmdW5jdGlvbihj LGIsZSxkLGEpe2lmKEV4dC5pc0VtcHR5KGIsZmFsc2UpKXtyZXR1cm4gLTF9Yj10 aGlzLmNyZWF0ZVZhbHVlTWF0Y2hlcihiLGQsYSk7cmV0dXJuIHRoaXMuZmluZElu ZGV4QnkoZnVuY3Rpb24oZyl7cmV0dXJuIGcmJmIudGVzdChnW2NdKX0sbnVsbCxl KX0sZmluZEluZGV4Qnk6ZnVuY3Rpb24oZyxlLGgpe3ZhciBiPXRoaXMua2V5cyxk PXRoaXMuaXRlbXM7Zm9yKHZhciBjPShofHwwKSxhPWQubGVuZ3RoO2M8YTtjKysp e2lmKGcuY2FsbChlfHx0aGlzLGRbY10sYltjXSkpe3JldHVybiBjfX1yZXR1cm4g LTF9LGNyZWF0ZVZhbHVlTWF0Y2hlcjpmdW5jdGlvbihjLGUsYSxiKXtpZighYy5l eGVjKXt2YXIgZD1FeHQuZXNjYXBlUmU7Yz1TdHJpbmcoYyk7aWYoZT09PXRydWUp e2M9ZChjKX1lbHNle2M9Il4iK2QoYyk7aWYoYj09PXRydWUpe2MrPSIkIn19Yz1u ZXcgUmVnRXhwKGMsYT8iIjoiaSIpfXJldHVybiBjfSxjbG9uZTpmdW5jdGlvbigp e3ZhciBlPW5ldyBFeHQudXRpbC5NaXhlZENvbGxlY3Rpb24oKTt2YXIgYj10aGlz LmtleXMsZD10aGlzLml0ZW1zO2Zvcih2YXIgYz0wLGE9ZC5sZW5ndGg7YzxhO2Mr Kyl7ZS5hZGQoYltjXSxkW2NdKX1lLmdldEtleT10aGlzLmdldEtleTtyZXR1cm4g ZX19KTtFeHQudXRpbC5NaXhlZENvbGxlY3Rpb24ucHJvdG90eXBlLmdldD1FeHQu dXRpbC5NaXhlZENvbGxlY3Rpb24ucHJvdG90eXBlLml0ZW07RXh0LkFic3RyYWN0 TWFuYWdlcj1FeHQuZXh0ZW5kKE9iamVjdCx7dHlwZU5hbWU6InR5cGUiLGNvbnN0 cnVjdG9yOmZ1bmN0aW9uKGEpe0V4dC5hcHBseSh0aGlzLGF8fHt9KTt0aGlzLmFs bD1uZXcgRXh0LnV0aWwuTWl4ZWRDb2xsZWN0aW9uKCk7dGhpcy50eXBlcz17fX0s Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFsbC5nZXQoYSl9LHJlZ2lzdGVy OmZ1bmN0aW9uKGEpe3RoaXMuYWxsLmFkZChhKX0sdW5yZWdpc3RlcjpmdW5jdGlv bihhKXt0aGlzLmFsbC5yZW1vdmUoYSl9LHJlZ2lzdGVyVHlwZTpmdW5jdGlvbihi LGEpe3RoaXMudHlwZXNbYl09YTthW3RoaXMudHlwZU5hbWVdPWJ9LGlzUmVnaXN0 ZXJlZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50eXBlc1thXSE9PXVuZGVmaW5l ZH0sY3JlYXRlOmZ1bmN0aW9uKGEsZCl7dmFyIGI9YVt0aGlzLnR5cGVOYW1lXXx8 YS50eXBlfHxkLGM9dGhpcy50eXBlc1tiXTtpZihjPT11bmRlZmluZWQpe3Rocm93 IG5ldyBFcnJvcihTdHJpbmcuZm9ybWF0KCJUaGUgJ3swfScgdHlwZSBoYXMgbm90 IGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoaXMgbWFuYWdlciIsYikpfXJldHVybiBu ZXcgYyhhKX0sb25BdmFpbGFibGU6ZnVuY3Rpb24oZCxjLGIpe3ZhciBhPXRoaXMu YWxsO2Eub24oImFkZCIsZnVuY3Rpb24oZSxnKXtpZihnLmlkPT1kKXtjLmNhbGwo Ynx8ZyxnKTthLnVuKCJhZGQiLGMsYil9fSl9fSk7RXh0LnV0aWwuRm9ybWF0PWZ1 bmN0aW9uKCl7dmFyIHRyaW1SZT0vXlxzK3xccyskL2csc3RyaXBUYWdzUkU9Lzxc Lz9bXj5dKz4vZ2ksc3RyaXBTY3JpcHRzUmU9Lyg/OjxzY3JpcHQuKj8+KSgoXG58 XHJ8LikqPykoPzo8XC9zY3JpcHQ+KS9pZyxubDJiclJlPS9ccj9cbi9nO3JldHVy bntlbGxpcHNpczpmdW5jdGlvbih2YWx1ZSxsZW4sd29yZCl7aWYodmFsdWUmJnZh bHVlLmxlbmd0aD5sZW4pe2lmKHdvcmQpe3ZhciB2cz12YWx1ZS5zdWJzdHIoMCxs ZW4tMiksaW5kZXg9TWF0aC5tYXgodnMubGFzdEluZGV4T2YoIiAiKSx2cy5sYXN0 SW5kZXhPZigiLiIpLHZzLmxhc3RJbmRleE9mKCIhIiksdnMubGFzdEluZGV4T2Yo Ij8iKSk7aWYoaW5kZXg9PS0xfHxpbmRleDwobGVuLTE1KSl7cmV0dXJuIHZhbHVl LnN1YnN0cigwLGxlbi0zKSsiLi4uIn1lbHNle3JldHVybiB2cy5zdWJzdHIoMCxp bmRleCkrIi4uLiJ9fWVsc2V7cmV0dXJuIHZhbHVlLnN1YnN0cigwLGxlbi0zKSsi Li4uIn19cmV0dXJuIHZhbHVlfSx1bmRlZjpmdW5jdGlvbih2YWx1ZSl7cmV0dXJu IHZhbHVlIT09dW5kZWZpbmVkP3ZhbHVlOiIifSxkZWZhdWx0VmFsdWU6ZnVuY3Rp b24odmFsdWUsZGVmYXVsdFZhbHVlKXtyZXR1cm4gdmFsdWUhPT11bmRlZmluZWQm JnZhbHVlIT09IiI/dmFsdWU6ZGVmYXVsdFZhbHVlfSxodG1sRW5jb2RlOmZ1bmN0 aW9uKHZhbHVlKXtyZXR1cm4gIXZhbHVlP3ZhbHVlOlN0cmluZyh2YWx1ZSkucmVw bGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2Uo LzwvZywiJmx0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7Iil9LGh0bWxEZWNvZGU6 ZnVuY3Rpb24odmFsdWUpe3JldHVybiAhdmFsdWU/dmFsdWU6U3RyaW5nKHZhbHVl KS5yZXBsYWNlKC8mZ3Q7L2csIj4iKS5yZXBsYWNlKC8mbHQ7L2csIjwiKS5yZXBs YWNlKC8mcXVvdDsvZywnIicpLnJlcGxhY2UoLyZhbXA7L2csIiYiKX0sdHJpbTpm dW5jdGlvbih2YWx1ZSl7cmV0dXJuIFN0cmluZyh2YWx1ZSkucmVwbGFjZSh0cmlt UmUsIiIpfSxzdWJzdHI6ZnVuY3Rpb24odmFsdWUsc3RhcnQsbGVuZ3RoKXtyZXR1 cm4gU3RyaW5nKHZhbHVlKS5zdWJzdHIoc3RhcnQsbGVuZ3RoKX0sbG93ZXJjYXNl OmZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2Fz ZSgpfSx1cHBlcmNhc2U6ZnVuY3Rpb24odmFsdWUpe3JldHVybiBTdHJpbmcodmFs dWUpLnRvVXBwZXJDYXNlKCl9LGNhcGl0YWxpemU6ZnVuY3Rpb24odmFsdWUpe3Jl dHVybiAhdmFsdWU/dmFsdWU6dmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkr dmFsdWUuc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCl9LGNhbGw6ZnVuY3Rpb24odmFs dWUsZm4pe2lmKGFyZ3VtZW50cy5sZW5ndGg+Mil7dmFyIGFyZ3M9QXJyYXkucHJv dG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpO2FyZ3MudW5zaGlmdCh2YWx1 ZSk7cmV0dXJuIGV2YWwoZm4pLmFwcGx5KHdpbmRvdyxhcmdzKX1lbHNle3JldHVy biBldmFsKGZuKS5jYWxsKHdpbmRvdyx2YWx1ZSl9fSx1c01vbmV5OmZ1bmN0aW9u KHYpe3Y9KE1hdGgucm91bmQoKHYtMCkqMTAwKSkvMTAwO3Y9KHY9PU1hdGguZmxv b3IodikpP3YrIi4wMCI6KCh2KjEwPT1NYXRoLmZsb29yKHYqMTApKT92KyIwIjp2 KTt2PVN0cmluZyh2KTt2YXIgcHM9di5zcGxpdCgiLiIpLHdob2xlPXBzWzBdLHN1 Yj1wc1sxXT8iLiIrcHNbMV06Ii4wMCIscj0vKFxkKykoXGR7M30pLzt3aGlsZShy LnRlc3Qod2hvbGUpKXt3aG9sZT13aG9sZS5yZXBsYWNlKHIsIiQxLCQyIil9dj13 aG9sZStzdWI7aWYodi5jaGFyQXQoMCk9PSItIil7cmV0dXJuIi0kIit2LnN1YnN0 cigxKX1yZXR1cm4iJCIrdn0sZGF0ZTpmdW5jdGlvbih2LGZvcm1hdCl7aWYoIXYp e3JldHVybiIifWlmKCFFeHQuaXNEYXRlKHYpKXt2PW5ldyBEYXRlKERhdGUucGFy c2UodikpfXJldHVybiB2LmRhdGVGb3JtYXQoZm9ybWF0fHwibS9kL1kiKX0sZGF0 ZVJlbmRlcmVyOmZ1bmN0aW9uKGZvcm1hdCl7cmV0dXJuIGZ1bmN0aW9uKHYpe3Jl dHVybiBFeHQudXRpbC5Gb3JtYXQuZGF0ZSh2LGZvcm1hdCl9fSxzdHJpcFRhZ3M6 ZnVuY3Rpb24odil7cmV0dXJuICF2P3Y6U3RyaW5nKHYpLnJlcGxhY2Uoc3RyaXBU YWdzUkUsIiIpfSxzdHJpcFNjcmlwdHM6ZnVuY3Rpb24odil7cmV0dXJuICF2P3Y6 U3RyaW5nKHYpLnJlcGxhY2Uoc3RyaXBTY3JpcHRzUmUsIiIpfSxmaWxlU2l6ZTpm dW5jdGlvbihzaXplKXtpZihzaXplPDEwMjQpe3JldHVybiBzaXplKyIgYnl0ZXMi fWVsc2V7aWYoc2l6ZTwxMDQ4NTc2KXtyZXR1cm4oTWF0aC5yb3VuZCgoKHNpemUq MTApLzEwMjQpKS8xMCkrIiBLQiJ9ZWxzZXtyZXR1cm4oTWF0aC5yb3VuZCgoKHNp emUqMTApLzEwNDg1NzYpKS8xMCkrIiBNQiJ9fX0sbWF0aDpmdW5jdGlvbigpe3Zh ciBmbnM9e307cmV0dXJuIGZ1bmN0aW9uKHYsYSl7aWYoIWZuc1thXSl7Zm5zW2Fd PW5ldyBGdW5jdGlvbigidiIsInJldHVybiB2ICIrYSsiOyIpfXJldHVybiBmbnNb YV0odil9fSgpLHJvdW5kOmZ1bmN0aW9uKHZhbHVlLHByZWNpc2lvbil7dmFyIHJl c3VsdD1OdW1iZXIodmFsdWUpO2lmKHR5cGVvZiBwcmVjaXNpb249PSJudW1iZXIi KXtwcmVjaXNpb249TWF0aC5wb3coMTAscHJlY2lzaW9uKTtyZXN1bHQ9TWF0aC5y b3VuZCh2YWx1ZSpwcmVjaXNpb24pL3ByZWNpc2lvbn1yZXR1cm4gcmVzdWx0fSxu dW1iZXI6ZnVuY3Rpb24odixmb3JtYXQpe2lmKCFmb3JtYXQpe3JldHVybiB2fXY9 RXh0Lm51bSh2LE5hTik7aWYoaXNOYU4odikpe3JldHVybiIifXZhciBjb21tYT0i LCIsZGVjPSIuIixpMThuPWZhbHNlLG5lZz12PDA7dj1NYXRoLmFicyh2KTtpZihm b3JtYXQuc3Vic3RyKGZvcm1hdC5sZW5ndGgtMik9PSIvaSIpe2Zvcm1hdD1mb3Jt YXQuc3Vic3RyKDAsZm9ybWF0Lmxlbmd0aC0yKTtpMThuPXRydWU7Y29tbWE9Ii4i O2RlYz0iLCJ9dmFyIGhhc0NvbW1hPWZvcm1hdC5pbmRleE9mKGNvbW1hKSE9LTEs cHNwbGl0PShpMThuP2Zvcm1hdC5yZXBsYWNlKC9bXlxkXCxdL2csIiIpOmZvcm1h dC5yZXBsYWNlKC9bXlxkXC5dL2csIiIpKS5zcGxpdChkZWMpO2lmKDE8cHNwbGl0 Lmxlbmd0aCl7dj12LnRvRml4ZWQocHNwbGl0WzFdLmxlbmd0aCl9ZWxzZXtpZigy PHBzcGxpdC5sZW5ndGgpe3Rocm93ICgiTnVtYmVyRm9ybWF0RXhjZXB0aW9uOiBp bnZhbGlkIGZvcm1hdCwgZm9ybWF0cyBzaG91bGQgaGF2ZSBubyBtb3JlIHRoYW4g MSBwZXJpb2Q6ICIrZm9ybWF0KX1lbHNle3Y9di50b0ZpeGVkKDApfX12YXIgZm51 bT12LnRvU3RyaW5nKCk7cHNwbGl0PWZudW0uc3BsaXQoIi4iKTtpZihoYXNDb21t YSl7dmFyIGNudW09cHNwbGl0WzBdLHBhcnI9W10saj1jbnVtLmxlbmd0aCxtPU1h dGguZmxvb3Ioai8zKSxuPWNudW0ubGVuZ3RoJTN8fDMsaTtmb3IoaT0wO2k8ajtp Kz1uKXtpZihpIT0wKXtuPTN9cGFycltwYXJyLmxlbmd0aF09Y251bS5zdWJzdHIo aSxuKTttLT0xfWZudW09cGFyci5qb2luKGNvbW1hKTtpZihwc3BsaXRbMV0pe2Zu dW0rPWRlYytwc3BsaXRbMV19fWVsc2V7aWYocHNwbGl0WzFdKXtmbnVtPXBzcGxp dFswXStkZWMrcHNwbGl0WzFdfX1yZXR1cm4obmVnPyItIjoiIikrZm9ybWF0LnJl cGxhY2UoL1tcZCw/XC4/XSsvLGZudW0pfSxudW1iZXJSZW5kZXJlcjpmdW5jdGlv bihmb3JtYXQpe3JldHVybiBmdW5jdGlvbih2KXtyZXR1cm4gRXh0LnV0aWwuRm9y bWF0Lm51bWJlcih2LGZvcm1hdCl9fSxwbHVyYWw6ZnVuY3Rpb24odixzLHApe3Jl dHVybiB2KyIgIisodj09MT9zOihwP3A6cysicyIpKX0sbmwyYnI6ZnVuY3Rpb24o dil7cmV0dXJuIEV4dC5pc0VtcHR5KHYpPyIiOnYucmVwbGFjZShubDJiclJlLCI8 YnIvPiIpfX19KCk7RXh0LlhUZW1wbGF0ZT1mdW5jdGlvbigpe0V4dC5YVGVtcGxh dGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7 dmFyIHk9dGhpcyxqPXkuaHRtbCxxPS88dHBsXGJbXj5dKj4oKD86KD89KFtePF0r KSlcMnw8KD8hdHBsXGJbXj5dKj4pKSo/KTxcL3RwbD4vLGQ9L148dHBsXGJbXj5d Kj9mb3I9IiguKj8pIi8sdj0vXjx0cGxcYltePl0qP2lmPSIoLio/KSIvLHg9L148 dHBsXGJbXj5dKj9leGVjPSIoLio/KSIvLHIscD0wLGs9W10sbz0idmFsdWVzIix3 PSJwYXJlbnQiLGw9InhpbmRleCIsbj0ieGNvdW50IixlPSJyZXR1cm4gIixjPSJ3 aXRoKHZhbHVlcyl7ICI7aj1bIjx0cGw+IixqLCI8L3RwbD4iXS5qb2luKCIiKTt3 aGlsZSgocj1qLm1hdGNoKHEpKSl7dmFyIGI9clswXS5tYXRjaChkKSxhPXJbMF0u bWF0Y2godiksQT1yWzBdLm1hdGNoKHgpLGc9bnVsbCxoPW51bGwsdD1udWxsLHo9 YiYmYlsxXT9iWzFdOiIiO2lmKGEpe2c9YSYmYVsxXT9hWzFdOm51bGw7aWYoZyl7 aD1uZXcgRnVuY3Rpb24obyx3LGwsbixjK2UrKEV4dC51dGlsLkZvcm1hdC5odG1s RGVjb2RlKGcpKSsiOyB9Iil9fWlmKEEpe2c9QSYmQVsxXT9BWzFdOm51bGw7aWYo Zyl7dD1uZXcgRnVuY3Rpb24obyx3LGwsbixjKyhFeHQudXRpbC5Gb3JtYXQuaHRt bERlY29kZShnKSkrIjsgfSIpfX1pZih6KXtzd2l0Y2goeil7Y2FzZSIuIjp6PW5l dyBGdW5jdGlvbihvLHcsYytlK28rIjsgfSIpO2JyZWFrO2Nhc2UiLi4iOno9bmV3 IEZ1bmN0aW9uKG8sdyxjK2UrdysiOyB9Iik7YnJlYWs7ZGVmYXVsdDp6PW5ldyBG dW5jdGlvbihvLHcsYytlK3orIjsgfSIpfX1rLnB1c2goe2lkOnAsdGFyZ2V0Onos ZXhlYzp0LHRlc3Q6aCxib2R5OnJbMV18fCIifSk7aj1qLnJlcGxhY2UoclswXSwi e3h0cGwiK3ArIn0iKTsrK3B9Zm9yKHZhciB1PWsubGVuZ3RoLTE7dT49MDstLXUp e3kuY29tcGlsZVRwbChrW3VdKX15Lm1hc3Rlcj1rW2subGVuZ3RoLTFdO3kudHBs cz1rfTtFeHQuZXh0ZW5kKEV4dC5YVGVtcGxhdGUsRXh0LlRlbXBsYXRlLHtyZTov XHsoW1x3XC1cLlwjXSspKD86XDooW1x3XC5dKikoPzpcKCguKj8pP1wpKT8pPyhc cz9bXCtcLVwqXFxdXHM/W1xkXC5cK1wtXCpcXFwoXCldKyk/XH0vZyxjb2RlUmU6 L1x7XFsoKD86XFxcXXwufFxuKSo/KVxdXH0vZyxhcHBseVN1YlRlbXBsYXRlOmZ1 bmN0aW9uKGEsayxqLGQsYyl7dmFyIGg9dGhpcyxnLG09aC50cGxzW2FdLGwsYj1b XTtpZigobS50ZXN0JiYhbS50ZXN0LmNhbGwoaCxrLGosZCxjKSl8fChtLmV4ZWMm Jm0uZXhlYy5jYWxsKGgsayxqLGQsYykpKXtyZXR1cm4iIn1sPW0udGFyZ2V0P20u dGFyZ2V0LmNhbGwoaCxrLGopOms7Zz1sLmxlbmd0aDtqPW0udGFyZ2V0P2s6ajtp ZihtLnRhcmdldCYmRXh0LmlzQXJyYXkobCkpe2Zvcih2YXIgZT0wLGc9bC5sZW5n dGg7ZTxnO2UrKyl7YltiLmxlbmd0aF09bS5jb21waWxlZC5jYWxsKGgsbFtlXSxq LGUrMSxnKX1yZXR1cm4gYi5qb2luKCIiKX1yZXR1cm4gbS5jb21waWxlZC5jYWxs KGgsbCxqLGQsYyl9LGNvbXBpbGVUcGw6ZnVuY3Rpb24odHBsKXt2YXIgZm09RXh0 LnV0aWwuRm9ybWF0LHVzZUY9dGhpcy5kaXNhYmxlRm9ybWF0cyE9PXRydWUsc2Vw PUV4dC5pc0dlY2tvPyIrIjoiLCIsYm9keTtmdW5jdGlvbiBmbihtLG5hbWUsZm9y bWF0LGFyZ3MsbWF0aCl7aWYobmFtZS5zdWJzdHIoMCw0KT09Inh0cGwiKXtyZXR1 cm4iJyIrc2VwKyJ0aGlzLmFwcGx5U3ViVGVtcGxhdGUoIituYW1lLnN1YnN0cig0 KSsiLCB2YWx1ZXMsIHBhcmVudCwgeGluZGV4LCB4Y291bnQpIitzZXArIicifXZh ciB2O2lmKG5hbWU9PT0iLiIpe3Y9InZhbHVlcyJ9ZWxzZXtpZihuYW1lPT09IiMi KXt2PSJ4aW5kZXgifWVsc2V7aWYobmFtZS5pbmRleE9mKCIuIikhPS0xKXt2PW5h bWV9ZWxzZXt2PSJ2YWx1ZXNbJyIrbmFtZSsiJ10ifX19aWYobWF0aCl7dj0iKCIr dittYXRoKyIpIn1pZihmb3JtYXQmJnVzZUYpe2FyZ3M9YXJncz8iLCIrYXJnczoi IjtpZihmb3JtYXQuc3Vic3RyKDAsNSkhPSJ0aGlzLiIpe2Zvcm1hdD0iZm0uIitm b3JtYXQrIigifWVsc2V7Zm9ybWF0PSd0aGlzLmNhbGwoIicrZm9ybWF0LnN1YnN0 cig1KSsnIiwgJzthcmdzPSIsIHZhbHVlcyJ9fWVsc2V7YXJncz0iIjtmb3JtYXQ9 IigiK3YrIiA9PT0gdW5kZWZpbmVkID8gJycgOiAifXJldHVybiInIitzZXArZm9y bWF0K3YrYXJncysiKSIrc2VwKyInIn1mdW5jdGlvbiBjb2RlRm4obSxjb2RlKXty ZXR1cm4iJyIrc2VwKyIoIitjb2RlLnJlcGxhY2UoL1xcJy9nLCInIikrIikiK3Nl cCsiJyJ9aWYoRXh0LmlzR2Vja28pe2JvZHk9InRwbC5jb21waWxlZCA9IGZ1bmN0 aW9uKHZhbHVlcywgcGFyZW50LCB4aW5kZXgsIHhjb3VudCl7IHJldHVybiAnIit0 cGwuYm9keS5yZXBsYWNlKC8oXHJcbnxcbikvZywiXFxuIikucmVwbGFjZSgvJy9n LCJcXCciKS5yZXBsYWNlKHRoaXMucmUsZm4pLnJlcGxhY2UodGhpcy5jb2RlUmUs Y29kZUZuKSsiJzt9OyJ9ZWxzZXtib2R5PVsidHBsLmNvbXBpbGVkID0gZnVuY3Rp b24odmFsdWVzLCBwYXJlbnQsIHhpbmRleCwgeGNvdW50KXsgcmV0dXJuIFsnIl07 Ym9keS5wdXNoKHRwbC5ib2R5LnJlcGxhY2UoLyhcclxufFxuKS9nLCJcXG4iKS5y ZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UodGhpcy5yZSxmbikucmVwbGFjZSh0 aGlzLmNvZGVSZSxjb2RlRm4pKTtib2R5LnB1c2goIiddLmpvaW4oJycpO307Iik7 Ym9keT1ib2R5LmpvaW4oIiIpfWV2YWwoYm9keSk7cmV0dXJuIHRoaXN9LGFwcGx5 VGVtcGxhdGU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWFzdGVyLmNvbXBpbGVk LmNhbGwodGhpcyxhLHt9LDEsMSl9LGNvbXBpbGU6ZnVuY3Rpb24oKXtyZXR1cm4g dGhpc319KTtFeHQuWFRlbXBsYXRlLnByb3RvdHlwZS5hcHBseT1FeHQuWFRlbXBs YXRlLnByb3RvdHlwZS5hcHBseVRlbXBsYXRlO0V4dC5YVGVtcGxhdGUuZnJvbT1m dW5jdGlvbihhKXthPUV4dC5nZXREb20oYSk7cmV0dXJuIG5ldyBFeHQuWFRlbXBs YXRlKGEudmFsdWV8fGEuaW5uZXJIVE1MKX07RXh0LnV0aWwuQ1NTPWZ1bmN0aW9u KCl7dmFyIGQ9bnVsbDt2YXIgYz1kb2N1bWVudDt2YXIgYj0vKC1bYS16XSkvZ2k7 dmFyIGE9ZnVuY3Rpb24oZSxnKXtyZXR1cm4gZy5jaGFyQXQoMSkudG9VcHBlckNh c2UoKX07cmV0dXJue2NyZWF0ZVN0eWxlU2hlZXQ6ZnVuY3Rpb24oaSxsKXt2YXIg aDt2YXIgZz1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07dmFyIGs9 Yy5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2suc2V0QXR0cmlidXRlKCJ0eXBlIiwi dGV4dC9jc3MiKTtpZihsKXtrLnNldEF0dHJpYnV0ZSgiaWQiLGwpfWlmKEV4dC5p c0lFKXtnLmFwcGVuZENoaWxkKGspO2g9ay5zdHlsZVNoZWV0O2guY3NzVGV4dD1p fWVsc2V7dHJ5e2suYXBwZW5kQ2hpbGQoYy5jcmVhdGVUZXh0Tm9kZShpKSl9Y2F0 Y2goail7ay5jc3NUZXh0PWl9Zy5hcHBlbmRDaGlsZChrKTtoPWsuc3R5bGVTaGVl dD9rLnN0eWxlU2hlZXQ6KGsuc2hlZXR8fGMuc3R5bGVTaGVldHNbYy5zdHlsZVNo ZWV0cy5sZW5ndGgtMV0pfXRoaXMuY2FjaGVTdHlsZVNoZWV0KGgpO3JldHVybiBo fSxyZW1vdmVTdHlsZVNoZWV0OmZ1bmN0aW9uKGcpe3ZhciBlPWMuZ2V0RWxlbWVu dEJ5SWQoZyk7aWYoZSl7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfX0sc3dh cFN0eWxlU2hlZXQ6ZnVuY3Rpb24oaCxlKXt0aGlzLnJlbW92ZVN0eWxlU2hlZXQo aCk7dmFyIGc9Yy5jcmVhdGVFbGVtZW50KCJsaW5rIik7Zy5zZXRBdHRyaWJ1dGUo InJlbCIsInN0eWxlc2hlZXQiKTtnLnNldEF0dHJpYnV0ZSgidHlwZSIsInRleHQv Y3NzIik7Zy5zZXRBdHRyaWJ1dGUoImlkIixoKTtnLnNldEF0dHJpYnV0ZSgiaHJl ZiIsZSk7Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENo aWxkKGcpfSxyZWZyZXNoQ2FjaGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRS dWxlcyh0cnVlKX0sY2FjaGVTdHlsZVNoZWV0OmZ1bmN0aW9uKGgpe2lmKCFkKXtk PXt9fXRyeXt2YXIgaz1oLmNzc1J1bGVzfHxoLnJ1bGVzO2Zvcih2YXIgZz1rLmxl bmd0aC0xO2c+PTA7LS1nKXtkW2tbZ10uc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNl KCldPWtbZ119fWNhdGNoKGkpe319LGdldFJ1bGVzOmZ1bmN0aW9uKGgpe2lmKGQ9 PT1udWxsfHxoKXtkPXt9O3ZhciBrPWMuc3R5bGVTaGVldHM7Zm9yKHZhciBqPTAs Zz1rLmxlbmd0aDtqPGc7aisrKXt0cnl7dGhpcy5jYWNoZVN0eWxlU2hlZXQoa1tq XSl9Y2F0Y2gobCl7fX19cmV0dXJuIGR9LGdldFJ1bGU6ZnVuY3Rpb24oZSxoKXt2 YXIgZz10aGlzLmdldFJ1bGVzKGgpO2lmKCFFeHQuaXNBcnJheShlKSl7cmV0dXJu IGdbZS50b0xvd2VyQ2FzZSgpXX1mb3IodmFyIGo9MDtqPGUubGVuZ3RoO2orKyl7 aWYoZ1tlW2pdXSl7cmV0dXJuIGdbZVtqXS50b0xvd2VyQ2FzZSgpXX19cmV0dXJu IG51bGx9LHVwZGF0ZVJ1bGU6ZnVuY3Rpb24oZSxqLGgpe2lmKCFFeHQuaXNBcnJh eShlKSl7dmFyIGs9dGhpcy5nZXRSdWxlKGUpO2lmKGspe2suc3R5bGVbai5yZXBs YWNlKGIsYSldPWg7cmV0dXJuIHRydWV9fWVsc2V7Zm9yKHZhciBnPTA7ZzxlLmxl bmd0aDtnKyspe2lmKHRoaXMudXBkYXRlUnVsZShlW2ddLGosaCkpe3JldHVybiB0 cnVlfX19cmV0dXJuIGZhbHNlfX19KCk7RXh0LnV0aWwuQ2xpY2tSZXBlYXRlcj1F eHQuZXh0ZW5kKEV4dC51dGlsLk9ic2VydmFibGUse2NvbnN0cnVjdG9yOmZ1bmN0 aW9uKGIsYSl7dGhpcy5lbD1FeHQuZ2V0KGIpO3RoaXMuZWwudW5zZWxlY3RhYmxl KCk7RXh0LmFwcGx5KHRoaXMsYSk7dGhpcy5hZGRFdmVudHMoIm1vdXNlZG93biIs ImNsaWNrIiwibW91c2V1cCIpO2lmKCF0aGlzLmRpc2FibGVkKXt0aGlzLmRpc2Fi bGVkPXRydWU7dGhpcy5lbmFibGUoKX1pZih0aGlzLmhhbmRsZXIpe3RoaXMub24o ImNsaWNrIix0aGlzLmhhbmRsZXIsdGhpcy5zY29wZXx8dGhpcyl9RXh0LnV0aWwu Q2xpY2tSZXBlYXRlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyl9 LGludGVydmFsOjIwLGRlbGF5OjI1MCxwcmV2ZW50RGVmYXVsdDp0cnVlLHN0b3BE ZWZhdWx0OmZhbHNlLHRpbWVyOjAsZW5hYmxlOmZ1bmN0aW9uKCl7aWYodGhpcy5k aXNhYmxlZCl7dGhpcy5lbC5vbigibW91c2Vkb3duIix0aGlzLmhhbmRsZU1vdXNl RG93bix0aGlzKTtpZihFeHQuaXNJRSl7dGhpcy5lbC5vbigiZGJsY2xpY2siLHRo aXMuaGFuZGxlRGJsQ2xpY2ssdGhpcyl9aWYodGhpcy5wcmV2ZW50RGVmYXVsdHx8 dGhpcy5zdG9wRGVmYXVsdCl7dGhpcy5lbC5vbigiY2xpY2siLHRoaXMuZXZlbnRP cHRpb25zLHRoaXMpfX10aGlzLmRpc2FibGVkPWZhbHNlfSxkaXNhYmxlOmZ1bmN0 aW9uKGEpe2lmKGF8fCF0aGlzLmRpc2FibGVkKXtjbGVhclRpbWVvdXQodGhpcy50 aW1lcik7aWYodGhpcy5wcmVzc0NsYXNzKXt0aGlzLmVsLnJlbW92ZUNsYXNzKHRo aXMucHJlc3NDbGFzcyl9RXh0LmdldERvYygpLnVuKCJtb3VzZXVwIix0aGlzLmhh bmRsZU1vdXNlVXAsdGhpcyk7dGhpcy5lbC5yZW1vdmVBbGxMaXN0ZW5lcnMoKX10 aGlzLmRpc2FibGVkPXRydWV9LHNldERpc2FibGVkOmZ1bmN0aW9uKGEpe3RoaXNb YT8iZGlzYWJsZSI6ImVuYWJsZSJdKCl9LGV2ZW50T3B0aW9uczpmdW5jdGlvbihh KXtpZih0aGlzLnByZXZlbnREZWZhdWx0KXthLnByZXZlbnREZWZhdWx0KCl9aWYo dGhpcy5zdG9wRGVmYXVsdCl7YS5zdG9wRXZlbnQoKX19LGRlc3Ryb3k6ZnVuY3Rp b24oKXt0aGlzLmRpc2FibGUodHJ1ZSk7RXh0LmRlc3Ryb3kodGhpcy5lbCk7dGhp cy5wdXJnZUxpc3RlbmVycygpfSxoYW5kbGVEYmxDbGljazpmdW5jdGlvbihhKXtj bGVhclRpbWVvdXQodGhpcy50aW1lcik7dGhpcy5lbC5ibHVyKCk7dGhpcy5maXJl RXZlbnQoIm1vdXNlZG93biIsdGhpcyxhKTt0aGlzLmZpcmVFdmVudCgiY2xpY2si LHRoaXMsYSl9LGhhbmRsZU1vdXNlRG93bjpmdW5jdGlvbihhKXtjbGVhclRpbWVv dXQodGhpcy50aW1lcik7dGhpcy5lbC5ibHVyKCk7aWYodGhpcy5wcmVzc0NsYXNz KXt0aGlzLmVsLmFkZENsYXNzKHRoaXMucHJlc3NDbGFzcyl9dGhpcy5tb3VzZWRv d25UaW1lPW5ldyBEYXRlKCk7RXh0LmdldERvYygpLm9uKCJtb3VzZXVwIix0aGlz LmhhbmRsZU1vdXNlVXAsdGhpcyk7dGhpcy5lbC5vbigibW91c2VvdXQiLHRoaXMu aGFuZGxlTW91c2VPdXQsdGhpcyk7dGhpcy5maXJlRXZlbnQoIm1vdXNlZG93biIs dGhpcyxhKTt0aGlzLmZpcmVFdmVudCgiY2xpY2siLHRoaXMsYSk7aWYodGhpcy5h Y2NlbGVyYXRlKXt0aGlzLmRlbGF5PTQwMH10aGlzLnRpbWVyPXRoaXMuY2xpY2su ZGVmZXIodGhpcy5kZWxheXx8dGhpcy5pbnRlcnZhbCx0aGlzLFthXSl9LGNsaWNr OmZ1bmN0aW9uKGEpe3RoaXMuZmlyZUV2ZW50KCJjbGljayIsdGhpcyxhKTt0aGlz LnRpbWVyPXRoaXMuY2xpY2suZGVmZXIodGhpcy5hY2NlbGVyYXRlP3RoaXMuZWFz ZU91dEV4cG8odGhpcy5tb3VzZWRvd25UaW1lLmdldEVsYXBzZWQoKSw0MDAsLTM5 MCwxMjAwMCk6dGhpcy5pbnRlcnZhbCx0aGlzLFthXSl9LGVhc2VPdXRFeHBvOmZ1 bmN0aW9uKGUsYSxoLGcpe3JldHVybihlPT1nKT9hK2g6aCooLU1hdGgucG93KDIs LTEwKmUvZykrMSkrYX0saGFuZGxlTW91c2VPdXQ6ZnVuY3Rpb24oKXtjbGVhclRp bWVvdXQodGhpcy50aW1lcik7aWYodGhpcy5wcmVzc0NsYXNzKXt0aGlzLmVsLnJl bW92ZUNsYXNzKHRoaXMucHJlc3NDbGFzcyl9dGhpcy5lbC5vbigibW91c2VvdmVy Iix0aGlzLmhhbmRsZU1vdXNlUmV0dXJuLHRoaXMpfSxoYW5kbGVNb3VzZVJldHVy bjpmdW5jdGlvbigpe3RoaXMuZWwudW4oIm1vdXNlb3ZlciIsdGhpcy5oYW5kbGVN b3VzZVJldHVybix0aGlzKTtpZih0aGlzLnByZXNzQ2xhc3Mpe3RoaXMuZWwuYWRk Q2xhc3ModGhpcy5wcmVzc0NsYXNzKX10aGlzLmNsaWNrKCl9LGhhbmRsZU1vdXNl VXA6ZnVuY3Rpb24oYSl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO3RoaXMuZWwu dW4oIm1vdXNlb3ZlciIsdGhpcy5oYW5kbGVNb3VzZVJldHVybix0aGlzKTt0aGlz LmVsLnVuKCJtb3VzZW91dCIsdGhpcy5oYW5kbGVNb3VzZU91dCx0aGlzKTtFeHQu Z2V0RG9jKCkudW4oIm1vdXNldXAiLHRoaXMuaGFuZGxlTW91c2VVcCx0aGlzKTt0 aGlzLmVsLnJlbW92ZUNsYXNzKHRoaXMucHJlc3NDbGFzcyk7dGhpcy5maXJlRXZl bnQoIm1vdXNldXAiLHRoaXMsYSl9fSk7RXh0LktleU5hdj1mdW5jdGlvbihiLGEp e3RoaXMuZWw9RXh0LmdldChiKTtFeHQuYXBwbHkodGhpcyxhKTtpZighdGhpcy5k aXNhYmxlZCl7dGhpcy5kaXNhYmxlZD10cnVlO3RoaXMuZW5hYmxlKCl9fTtFeHQu S2V5TmF2LnByb3RvdHlwZT17ZGlzYWJsZWQ6ZmFsc2UsZGVmYXVsdEV2ZW50QWN0 aW9uOiJzdG9wRXZlbnQiLGZvcmNlS2V5RG93bjpmYWxzZSxyZWxheTpmdW5jdGlv bihjKXt2YXIgYT1jLmdldEtleSgpLGI9dGhpcy5rZXlUb0hhbmRsZXJbYV07aWYo YiYmdGhpc1tiXSl7aWYodGhpcy5kb1JlbGF5KGMsdGhpc1tiXSxiKSE9PXRydWUp e2NbdGhpcy5kZWZhdWx0RXZlbnRBY3Rpb25dKCl9fX0sZG9SZWxheTpmdW5jdGlv bihjLGIsYSl7cmV0dXJuIGIuY2FsbCh0aGlzLnNjb3BlfHx0aGlzLGMsYSl9LGVu dGVyOmZhbHNlLGxlZnQ6ZmFsc2UscmlnaHQ6ZmFsc2UsdXA6ZmFsc2UsZG93bjpm YWxzZSx0YWI6ZmFsc2UsZXNjOmZhbHNlLHBhZ2VVcDpmYWxzZSxwYWdlRG93bjpm YWxzZSxkZWw6ZmFsc2UsaG9tZTpmYWxzZSxlbmQ6ZmFsc2Usc3BhY2U6ZmFsc2Us a2V5VG9IYW5kbGVyOnszNzoibGVmdCIsMzk6InJpZ2h0IiwzODoidXAiLDQwOiJk b3duIiwzMzoicGFnZVVwIiwzNDoicGFnZURvd24iLDQ2OiJkZWwiLDM2OiJob21l IiwzNToiZW5kIiwxMzoiZW50ZXIiLDI3OiJlc2MiLDk6InRhYiIsMzI6InNwYWNl In0sc3RvcEtleVVwOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0S2V5KCk7aWYoYT49 MzcmJmE8PTQwKXtiLnN0b3BFdmVudCgpfX0sZGVzdHJveTpmdW5jdGlvbigpe3Ro aXMuZGlzYWJsZSgpfSxlbmFibGU6ZnVuY3Rpb24oKXtpZih0aGlzLmRpc2FibGVk KXtpZihFeHQuaXNTYWZhcmkyKXt0aGlzLmVsLm9uKCJrZXl1cCIsdGhpcy5zdG9w S2V5VXAsdGhpcyl9dGhpcy5lbC5vbih0aGlzLmlzS2V5ZG93bigpPyJrZXlkb3du Ijoia2V5cHJlc3MiLHRoaXMucmVsYXksdGhpcyk7dGhpcy5kaXNhYmxlZD1mYWxz ZX19LGRpc2FibGU6ZnVuY3Rpb24oKXtpZighdGhpcy5kaXNhYmxlZCl7aWYoRXh0 LmlzU2FmYXJpMil7dGhpcy5lbC51bigia2V5dXAiLHRoaXMuc3RvcEtleVVwLHRo aXMpfXRoaXMuZWwudW4odGhpcy5pc0tleWRvd24oKT8ia2V5ZG93biI6ImtleXBy ZXNzIix0aGlzLnJlbGF5LHRoaXMpO3RoaXMuZGlzYWJsZWQ9dHJ1ZX19LHNldERp c2FibGVkOmZ1bmN0aW9uKGEpe3RoaXNbYT8iZGlzYWJsZSI6ImVuYWJsZSJdKCl9 LGlzS2V5ZG93bjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZvcmNlS2V5RG93bnx8 RXh0LkV2ZW50TWFuYWdlci51c2VLZXlkb3dufX07RXh0LktleU1hcD1mdW5jdGlv bihjLGIsYSl7dGhpcy5lbD1FeHQuZ2V0KGMpO3RoaXMuZXZlbnROYW1lPWF8fCJr ZXlkb3duIjt0aGlzLmJpbmRpbmdzPVtdO2lmKGIpe3RoaXMuYWRkQmluZGluZyhi KX10aGlzLmVuYWJsZSgpfTtFeHQuS2V5TWFwLnByb3RvdHlwZT17c3RvcEV2ZW50 OmZhbHNlLGFkZEJpbmRpbmc6ZnVuY3Rpb24oYil7aWYoRXh0LmlzQXJyYXkoYikp e0V4dC5lYWNoKGIsZnVuY3Rpb24oail7dGhpcy5hZGRCaW5kaW5nKGopfSx0aGlz KTtyZXR1cm59dmFyIGs9Yi5rZXksZz1iLmZufHxiLmhhbmRsZXIsbD1iLnNjb3Bl O2lmKGIuc3RvcEV2ZW50KXt0aGlzLnN0b3BFdmVudD1iLnN0b3BFdmVudH1pZih0 eXBlb2Ygaz09InN0cmluZyIpe3ZhciBoPVtdO3ZhciBlPWsudG9VcHBlckNhc2Uo KTtmb3IodmFyIGM9MCxkPWUubGVuZ3RoO2M8ZDtjKyspe2gucHVzaChlLmNoYXJD b2RlQXQoYykpfWs9aH12YXIgYT1FeHQuaXNBcnJheShrKTt2YXIgaT1mdW5jdGlv bihvKXtpZih0aGlzLmNoZWNrTW9kaWZpZXJzKGIsbykpe3ZhciBtPW8uZ2V0S2V5 KCk7aWYoYSl7Zm9yKHZhciBuPTAsaj1rLmxlbmd0aDtuPGo7bisrKXtpZihrW25d PT1tKXtpZih0aGlzLnN0b3BFdmVudCl7by5zdG9wRXZlbnQoKX1nLmNhbGwobHx8 d2luZG93LG0sbyk7cmV0dXJufX19ZWxzZXtpZihtPT1rKXtpZih0aGlzLnN0b3BF dmVudCl7by5zdG9wRXZlbnQoKX1nLmNhbGwobHx8d2luZG93LG0sbyl9fX19O3Ro aXMuYmluZGluZ3MucHVzaChpKX0sY2hlY2tNb2RpZmllcnM6ZnVuY3Rpb24oYixo KXt2YXIgaixkLGc9WyJzaGlmdCIsImN0cmwiLCJhbHQiXTtmb3IodmFyIGM9MCxh PWcubGVuZ3RoO2M8YTsrK2Mpe2Q9Z1tjXTtqPWJbZF07aWYoIShqPT09dW5kZWZp bmVkfHwoaj09PWhbZCsiS2V5Il0pKSl7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1 ZX0sb246ZnVuY3Rpb24oYixkLGMpe3ZhciBoLGEsZSxnO2lmKHR5cGVvZiBiPT0i b2JqZWN0IiYmIUV4dC5pc0FycmF5KGIpKXtoPWIua2V5O2E9Yi5zaGlmdDtlPWIu Y3RybDtnPWIuYWx0fWVsc2V7aD1ifXRoaXMuYWRkQmluZGluZyh7a2V5Omgsc2hp ZnQ6YSxjdHJsOmUsYWx0OmcsZm46ZCxzY29wZTpjfSl9LGhhbmRsZUtleURvd246 ZnVuY3Rpb24oZyl7aWYodGhpcy5lbmFibGVkKXt2YXIgYz10aGlzLmJpbmRpbmdz O2Zvcih2YXIgZD0wLGE9Yy5sZW5ndGg7ZDxhO2QrKyl7Y1tkXS5jYWxsKHRoaXMs Zyl9fX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5hYmxlZH0s ZW5hYmxlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZW5hYmxlZCl7dGhpcy5lbC5vbih0 aGlzLmV2ZW50TmFtZSx0aGlzLmhhbmRsZUtleURvd24sdGhpcyk7dGhpcy5lbmFi bGVkPXRydWV9fSxkaXNhYmxlOmZ1bmN0aW9uKCl7aWYodGhpcy5lbmFibGVkKXt0 aGlzLmVsLnJlbW92ZUxpc3RlbmVyKHRoaXMuZXZlbnROYW1lLHRoaXMuaGFuZGxl S2V5RG93bix0aGlzKTt0aGlzLmVuYWJsZWQ9ZmFsc2V9fSxzZXREaXNhYmxlZDpm dW5jdGlvbihhKXt0aGlzW2E/ImRpc2FibGUiOiJlbmFibGUiXSgpfX07RXh0LnV0 aWwuVGV4dE1ldHJpY3M9ZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm57bWVhc3VyZTpm dW5jdGlvbihiLGMsZCl7aWYoIWEpe2E9RXh0LnV0aWwuVGV4dE1ldHJpY3MuSW5z dGFuY2UoYixkKX1hLmJpbmQoYik7YS5zZXRGaXhlZFdpZHRoKGR8fCJhdXRvIik7 cmV0dXJuIGEuZ2V0U2l6ZShjKX0sY3JlYXRlSW5zdGFuY2U6ZnVuY3Rpb24oYixj KXtyZXR1cm4gRXh0LnV0aWwuVGV4dE1ldHJpY3MuSW5zdGFuY2UoYixjKX19fSgp O0V4dC51dGlsLlRleHRNZXRyaWNzLkluc3RhbmNlPWZ1bmN0aW9uKGIsZCl7dmFy IGM9bmV3IEV4dC5FbGVtZW50KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIp KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGMuZG9tKTtjLnBvc2l0aW9uKCJh YnNvbHV0ZSIpO2Muc2V0TGVmdFRvcCgtMTAwMCwtMTAwMCk7Yy5oaWRlKCk7aWYo ZCl7Yy5zZXRXaWR0aChkKX12YXIgYT17Z2V0U2l6ZTpmdW5jdGlvbihnKXtjLnVw ZGF0ZShnKTt2YXIgZT1jLmdldFNpemUoKTtjLnVwZGF0ZSgiIik7cmV0dXJuIGV9 LGJpbmQ6ZnVuY3Rpb24oZSl7Yy5zZXRTdHlsZShFeHQuZmx5KGUpLmdldFN0eWxl cygiZm9udC1zaXplIiwiZm9udC1zdHlsZSIsImZvbnQtd2VpZ2h0IiwiZm9udC1m YW1pbHkiLCJsaW5lLWhlaWdodCIsInRleHQtdHJhbnNmb3JtIiwibGV0dGVyLXNw YWNpbmciKSl9LHNldEZpeGVkV2lkdGg6ZnVuY3Rpb24oZSl7Yy5zZXRXaWR0aChl KX0sZ2V0V2lkdGg6ZnVuY3Rpb24oZSl7Yy5kb20uc3R5bGUud2lkdGg9ImF1dG8i O3JldHVybiB0aGlzLmdldFNpemUoZSkud2lkdGh9LGdldEhlaWdodDpmdW5jdGlv bihlKXtyZXR1cm4gdGhpcy5nZXRTaXplKGUpLmhlaWdodH19O2EuYmluZChiKTty ZXR1cm4gYX07RXh0LkVsZW1lbnQuYWRkTWV0aG9kcyh7Z2V0VGV4dFdpZHRoOmZ1 bmN0aW9uKGMsYixhKXtyZXR1cm4oRXh0LnV0aWwuVGV4dE1ldHJpY3MubWVhc3Vy ZSh0aGlzLmRvbSxFeHQudmFsdWUoYyx0aGlzLmRvbS5pbm5lckhUTUwsdHJ1ZSkp LndpZHRoKS5jb25zdHJhaW4oYnx8MCxhfHwxMDAwMDAwKX19KTtFeHQudXRpbC5D b29raWVzPXtzZXQ6ZnVuY3Rpb24oYyxlKXt2YXIgYT1hcmd1bWVudHM7dmFyIGk9 YXJndW1lbnRzLmxlbmd0aDt2YXIgYj0oaT4yKT9hWzJdOm51bGw7dmFyIGg9KGk+ Myk/YVszXToiLyI7dmFyIGQ9KGk+NCk/YVs0XTpudWxsO3ZhciBnPShpPjUpP2Fb NV06ZmFsc2U7ZG9jdW1lbnQuY29va2llPWMrIj0iK2VzY2FwZShlKSsoKGI9PT1u dWxsKT8iIjooIjsgZXhwaXJlcz0iK2IudG9HTVRTdHJpbmcoKSkpKygoaD09PW51 bGwpPyIiOigiOyBwYXRoPSIraCkpKygoZD09PW51bGwpPyIiOigiOyBkb21haW49 IitkKSkrKChnPT09dHJ1ZSk/Ijsgc2VjdXJlIjoiIil9LGdldDpmdW5jdGlvbihk KXt2YXIgYj1kKyI9Ijt2YXIgZz1iLmxlbmd0aDt2YXIgYT1kb2N1bWVudC5jb29r aWUubGVuZ3RoO3ZhciBlPTA7dmFyIGM9MDt3aGlsZShlPGEpe2M9ZStnO2lmKGRv Y3VtZW50LmNvb2tpZS5zdWJzdHJpbmcoZSxjKT09Yil7cmV0dXJuIEV4dC51dGls LkNvb2tpZXMuZ2V0Q29va2llVmFsKGMpfWU9ZG9jdW1lbnQuY29va2llLmluZGV4 T2YoIiAiLGUpKzE7aWYoZT09PTApe2JyZWFrfX1yZXR1cm4gbnVsbH0sY2xlYXI6 ZnVuY3Rpb24oYSl7aWYoRXh0LnV0aWwuQ29va2llcy5nZXQoYSkpe2RvY3VtZW50 LmNvb2tpZT1hKyI9OyBleHBpcmVzPVRodSwgMDEtSmFuLTcwIDAwOjAwOjAxIEdN VCJ9fSxnZXRDb29raWVWYWw6ZnVuY3Rpb24oYil7dmFyIGE9ZG9jdW1lbnQuY29v a2llLmluZGV4T2YoIjsiLGIpO2lmKGE9PS0xKXthPWRvY3VtZW50LmNvb2tpZS5s ZW5ndGh9cmV0dXJuIHVuZXNjYXBlKGRvY3VtZW50LmNvb2tpZS5zdWJzdHJpbmco YixhKSl9fTtFeHQuaGFuZGxlRXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgYX07RXh0 LkVycm9yPWZ1bmN0aW9uKGEpe3RoaXMubWVzc2FnZT0odGhpcy5sYW5nW2FdKT90 aGlzLmxhbmdbYV06YX07RXh0LkVycm9yLnByb3RvdHlwZT1uZXcgRXJyb3IoKTtF eHQuYXBwbHkoRXh0LkVycm9yLnByb3RvdHlwZSx7bGFuZzp7fSxuYW1lOiJFeHQu RXJyb3IiLGdldE5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lfSxnZXRN ZXNzYWdlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVzc2FnZX0sdG9Kc29uOmZ1 bmN0aW9uKCl7cmV0dXJuIEV4dC5lbmNvZGUodGhpcyl9fSk7RXh0LkNvbXBvbmVu dE1ncj1mdW5jdGlvbigpe3ZhciBjPW5ldyBFeHQudXRpbC5NaXhlZENvbGxlY3Rp b24oKTt2YXIgYj17fTt2YXIgYT17fTtyZXR1cm57cmVnaXN0ZXI6ZnVuY3Rpb24o ZCl7Yy5hZGQoZCl9LHVucmVnaXN0ZXI6ZnVuY3Rpb24oZCl7Yy5yZW1vdmUoZCl9 LGdldDpmdW5jdGlvbihkKXtyZXR1cm4gYy5nZXQoZCl9LG9uQXZhaWxhYmxlOmZ1 bmN0aW9uKGcsZSxkKXtjLm9uKCJhZGQiLGZ1bmN0aW9uKGgsaSl7aWYoaS5pZD09 Zyl7ZS5jYWxsKGR8fGksaSk7Yy51bigiYWRkIixlLGQpfX0pfSxhbGw6Yyx0eXBl czpiLHB0eXBlczphLGlzUmVnaXN0ZXJlZDpmdW5jdGlvbihkKXtyZXR1cm4gYltk XSE9PXVuZGVmaW5lZH0saXNQbHVnaW5SZWdpc3RlcmVkOmZ1bmN0aW9uKGQpe3Jl dHVybiBhW2RdIT09dW5kZWZpbmVkfSxyZWdpc3RlclR5cGU6ZnVuY3Rpb24oZSxk KXtiW2VdPWQ7ZC54dHlwZT1lfSxjcmVhdGU6ZnVuY3Rpb24oZCxlKXtyZXR1cm4g ZC5yZW5kZXI/ZDpuZXcgYltkLnh0eXBlfHxlXShkKX0scmVnaXN0ZXJQbHVnaW46 ZnVuY3Rpb24oZSxkKXthW2VdPWQ7ZC5wdHlwZT1lfSxjcmVhdGVQbHVnaW46ZnVu Y3Rpb24oZSxnKXt2YXIgZD1hW2UucHR5cGV8fGddO2lmKGQuaW5pdCl7cmV0dXJu IGR9ZWxzZXtyZXR1cm4gbmV3IGQoZSl9fX19KCk7RXh0LnJlZz1FeHQuQ29tcG9u ZW50TWdyLnJlZ2lzdGVyVHlwZTtFeHQucHJlZz1FeHQuQ29tcG9uZW50TWdyLnJl Z2lzdGVyUGx1Z2luO0V4dC5jcmVhdGU9RXh0LkNvbXBvbmVudE1nci5jcmVhdGU7 RXh0LkNvbXBvbmVudD1mdW5jdGlvbihiKXtiPWJ8fHt9O2lmKGIuaW5pdGlhbENv bmZpZyl7aWYoYi5pc0FjdGlvbil7dGhpcy5iYXNlQWN0aW9uPWJ9Yj1iLmluaXRp YWxDb25maWd9ZWxzZXtpZihiLnRhZ05hbWV8fGIuZG9tfHxFeHQuaXNTdHJpbmco Yikpe2I9e2FwcGx5VG86YixpZDpiLmlkfHxifX19dGhpcy5pbml0aWFsQ29uZmln PWI7RXh0LmFwcGx5KHRoaXMsYik7dGhpcy5hZGRFdmVudHMoImFkZGVkIiwiZGlz YWJsZSIsImVuYWJsZSIsImJlZm9yZXNob3ciLCJzaG93IiwiYmVmb3JlaGlkZSIs ImhpZGUiLCJyZW1vdmVkIiwiYmVmb3JlcmVuZGVyIiwicmVuZGVyIiwiYWZ0ZXJy ZW5kZXIiLCJiZWZvcmVkZXN0cm95IiwiZGVzdHJveSIsImJlZm9yZXN0YXRlcmVz dG9yZSIsInN0YXRlcmVzdG9yZSIsImJlZm9yZXN0YXRlc2F2ZSIsInN0YXRlc2F2 ZSIpO3RoaXMuZ2V0SWQoKTtFeHQuQ29tcG9uZW50TWdyLnJlZ2lzdGVyKHRoaXMp O0V4dC5Db21wb25lbnQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMp O2lmKHRoaXMuYmFzZUFjdGlvbil7dGhpcy5iYXNlQWN0aW9uLmFkZENvbXBvbmVu dCh0aGlzKX10aGlzLmluaXRDb21wb25lbnQoKTtpZih0aGlzLnBsdWdpbnMpe2lm KEV4dC5pc0FycmF5KHRoaXMucGx1Z2lucykpe2Zvcih2YXIgYz0wLGE9dGhpcy5w bHVnaW5zLmxlbmd0aDtjPGE7YysrKXt0aGlzLnBsdWdpbnNbY109dGhpcy5pbml0 UGx1Z2luKHRoaXMucGx1Z2luc1tjXSl9fWVsc2V7dGhpcy5wbHVnaW5zPXRoaXMu aW5pdFBsdWdpbih0aGlzLnBsdWdpbnMpfX1pZih0aGlzLnN0YXRlZnVsIT09ZmFs c2Upe3RoaXMuaW5pdFN0YXRlKCl9aWYodGhpcy5hcHBseVRvKXt0aGlzLmFwcGx5 VG9NYXJrdXAodGhpcy5hcHBseVRvKTtkZWxldGUgdGhpcy5hcHBseVRvfWVsc2V7 aWYodGhpcy5yZW5kZXJUbyl7dGhpcy5yZW5kZXIodGhpcy5yZW5kZXJUbyk7ZGVs ZXRlIHRoaXMucmVuZGVyVG99fX07RXh0LkNvbXBvbmVudC5BVVRPX0lEPTEwMDA7 RXh0LmV4dGVuZChFeHQuQ29tcG9uZW50LEV4dC51dGlsLk9ic2VydmFibGUse2Rp c2FibGVkOmZhbHNlLGhpZGRlbjpmYWxzZSxhdXRvRWw6ImRpdiIsZGlzYWJsZWRD bGFzczoieC1pdGVtLWRpc2FibGVkIixhbGxvd0RvbU1vdmU6dHJ1ZSxhdXRvU2hv dzpmYWxzZSxoaWRlTW9kZToiZGlzcGxheSIsaGlkZVBhcmVudDpmYWxzZSxyZW5k ZXJlZDpmYWxzZSx0cGxXcml0ZU1vZGU6Im92ZXJ3cml0ZSIsYnViYmxlRXZlbnRz OltdLGN0eXBlOiJFeHQuQ29tcG9uZW50IixhY3Rpb25Nb2RlOiJlbCIsZ2V0QWN0 aW9uRWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0aGlzLmFjdGlvbk1vZGVdfSxp bml0UGx1Z2luOmZ1bmN0aW9uKGEpe2lmKGEucHR5cGUmJiFFeHQuaXNGdW5jdGlv bihhLmluaXQpKXthPUV4dC5Db21wb25lbnRNZ3IuY3JlYXRlUGx1Z2luKGEpfWVs c2V7aWYoRXh0LmlzU3RyaW5nKGEpKXthPUV4dC5Db21wb25lbnRNZ3IuY3JlYXRl UGx1Z2luKHtwdHlwZTphfSl9fWEuaW5pdCh0aGlzKTtyZXR1cm4gYX0saW5pdENv bXBvbmVudDpmdW5jdGlvbigpe2lmKHRoaXMubGlzdGVuZXJzKXt0aGlzLm9uKHRo aXMubGlzdGVuZXJzKTtkZWxldGUgdGhpcy5saXN0ZW5lcnN9dGhpcy5lbmFibGVC dWJibGUodGhpcy5idWJibGVFdmVudHMpfSxyZW5kZXI6ZnVuY3Rpb24oYixhKXtp ZighdGhpcy5yZW5kZXJlZCYmdGhpcy5maXJlRXZlbnQoImJlZm9yZXJlbmRlciIs dGhpcykhPT1mYWxzZSl7aWYoIWImJnRoaXMuZWwpe3RoaXMuZWw9RXh0LmdldCh0 aGlzLmVsKTtiPXRoaXMuZWwuZG9tLnBhcmVudE5vZGU7dGhpcy5hbGxvd0RvbU1v dmU9ZmFsc2V9dGhpcy5jb250YWluZXI9RXh0LmdldChiKTtpZih0aGlzLmN0Q2xz KXt0aGlzLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmN0Q2xzKX10aGlzLnJlbmRl cmVkPXRydWU7aWYoYSE9PXVuZGVmaW5lZCl7aWYoRXh0LmlzTnVtYmVyKGEpKXth PXRoaXMuY29udGFpbmVyLmRvbS5jaGlsZE5vZGVzW2FdfWVsc2V7YT1FeHQuZ2V0 RG9tKGEpfX10aGlzLm9uUmVuZGVyKHRoaXMuY29udGFpbmVyLGF8fG51bGwpO2lm KHRoaXMuYXV0b1Nob3cpe3RoaXMuZWwucmVtb3ZlQ2xhc3MoWyJ4LWhpZGRlbiIs IngtaGlkZS0iK3RoaXMuaGlkZU1vZGVdKX1pZih0aGlzLmNscyl7dGhpcy5lbC5h ZGRDbGFzcyh0aGlzLmNscyk7ZGVsZXRlIHRoaXMuY2xzfWlmKHRoaXMuc3R5bGUp e3RoaXMuZWwuYXBwbHlTdHlsZXModGhpcy5zdHlsZSk7ZGVsZXRlIHRoaXMuc3R5 bGV9aWYodGhpcy5vdmVyQ2xzKXt0aGlzLmVsLmFkZENsYXNzT25PdmVyKHRoaXMu b3ZlckNscyl9dGhpcy5maXJlRXZlbnQoInJlbmRlciIsdGhpcyk7dmFyIGM9dGhp cy5nZXRDb250ZW50VGFyZ2V0KCk7aWYodGhpcy5odG1sKXtjLnVwZGF0ZShFeHQu RG9tSGVscGVyLm1hcmt1cCh0aGlzLmh0bWwpKTtkZWxldGUgdGhpcy5odG1sfWlm KHRoaXMuY29udGVudEVsKXt2YXIgZD1FeHQuZ2V0RG9tKHRoaXMuY29udGVudEVs KTtFeHQuZmx5KGQpLnJlbW92ZUNsYXNzKFsieC1oaWRkZW4iLCJ4LWhpZGUtZGlz cGxheSJdKTtjLmFwcGVuZENoaWxkKGQpfWlmKHRoaXMudHBsKXtpZighdGhpcy50 cGwuY29tcGlsZSl7dGhpcy50cGw9bmV3IEV4dC5YVGVtcGxhdGUodGhpcy50cGwp fWlmKHRoaXMuZGF0YSl7dGhpcy50cGxbdGhpcy50cGxXcml0ZU1vZGVdKGMsdGhp cy5kYXRhKTtkZWxldGUgdGhpcy5kYXRhfX10aGlzLmFmdGVyUmVuZGVyKHRoaXMu Y29udGFpbmVyKTtpZih0aGlzLmhpZGRlbil7dGhpcy5kb0hpZGUoKX1pZih0aGlz LmRpc2FibGVkKXt0aGlzLmRpc2FibGUodHJ1ZSl9aWYodGhpcy5zdGF0ZWZ1bCE9 PWZhbHNlKXt0aGlzLmluaXRTdGF0ZUV2ZW50cygpfXRoaXMuZmlyZUV2ZW50KCJh ZnRlcnJlbmRlciIsdGhpcyl9cmV0dXJuIHRoaXN9LHVwZGF0ZTpmdW5jdGlvbihi LGQsYSl7dmFyIGM9dGhpcy5nZXRDb250ZW50VGFyZ2V0KCk7aWYodGhpcy50cGwm JnR5cGVvZiBiIT09InN0cmluZyIpe3RoaXMudHBsW3RoaXMudHBsV3JpdGVNb2Rl XShjLGJ8fHt9KX1lbHNle3ZhciBlPUV4dC5pc09iamVjdChiKT9FeHQuRG9tSGVs cGVyLm1hcmt1cChiKTpiO2MudXBkYXRlKGUsZCxhKX19LG9uQWRkZWQ6ZnVuY3Rp b24oYSxiKXt0aGlzLm93bmVyQ3Q9YTt0aGlzLmluaXRSZWYoKTt0aGlzLmZpcmVF dmVudCgiYWRkZWQiLHRoaXMsYSxiKX0sb25SZW1vdmVkOmZ1bmN0aW9uKCl7dGhp cy5yZW1vdmVSZWYoKTt0aGlzLmZpcmVFdmVudCgicmVtb3ZlZCIsdGhpcyx0aGlz Lm93bmVyQ3QpO2RlbGV0ZSB0aGlzLm93bmVyQ3R9LGluaXRSZWY6ZnVuY3Rpb24o KXtpZih0aGlzLnJlZiYmIXRoaXMucmVmT3duZXIpe3ZhciBkPXRoaXMucmVmLnNw bGl0KCIvIiksYz1kLmxlbmd0aCxiPTAsYT10aGlzO3doaWxlKGEmJmI8Yyl7YT1h Lm93bmVyQ3Q7KytifWlmKGEpe2FbdGhpcy5yZWZOYW1lPWRbLS1iXV09dGhpczt0 aGlzLnJlZk93bmVyPWF9fX0scmVtb3ZlUmVmOmZ1bmN0aW9uKCl7aWYodGhpcy5y ZWZPd25lciYmdGhpcy5yZWZOYW1lKXtkZWxldGUgdGhpcy5yZWZPd25lclt0aGlz LnJlZk5hbWVdO2RlbGV0ZSB0aGlzLnJlZk93bmVyfX0saW5pdFN0YXRlOmZ1bmN0 aW9uKCl7aWYoRXh0LnN0YXRlLk1hbmFnZXIpe3ZhciBiPXRoaXMuZ2V0U3RhdGVJ ZCgpO2lmKGIpe3ZhciBhPUV4dC5zdGF0ZS5NYW5hZ2VyLmdldChiKTtpZihhKXtp Zih0aGlzLmZpcmVFdmVudCgiYmVmb3Jlc3RhdGVyZXN0b3JlIix0aGlzLGEpIT09 ZmFsc2Upe3RoaXMuYXBwbHlTdGF0ZShFeHQuYXBwbHkoe30sYSkpO3RoaXMuZmly ZUV2ZW50KCJzdGF0ZXJlc3RvcmUiLHRoaXMsYSl9fX19fSxnZXRTdGF0ZUlkOmZ1 bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGVJZHx8KCgvXihleHQtY29tcC18ZXh0 LWdlbikvKS50ZXN0KFN0cmluZyh0aGlzLmlkKSk/bnVsbDp0aGlzLmlkKX0saW5p dFN0YXRlRXZlbnRzOmZ1bmN0aW9uKCl7aWYodGhpcy5zdGF0ZUV2ZW50cyl7Zm9y KHZhciBhPTAsYjtiPXRoaXMuc3RhdGVFdmVudHNbYV07YSsrKXt0aGlzLm9uKGIs dGhpcy5zYXZlU3RhdGUsdGhpcyx7ZGVsYXk6MTAwfSl9fX0sYXBwbHlTdGF0ZTpm dW5jdGlvbihhKXtpZihhKXtFeHQuYXBwbHkodGhpcyxhKX19LGdldFN0YXRlOmZ1 bmN0aW9uKCl7cmV0dXJuIG51bGx9LHNhdmVTdGF0ZTpmdW5jdGlvbigpe2lmKEV4 dC5zdGF0ZS5NYW5hZ2VyJiZ0aGlzLnN0YXRlZnVsIT09ZmFsc2Upe3ZhciBiPXRo aXMuZ2V0U3RhdGVJZCgpO2lmKGIpe3ZhciBhPXRoaXMuZ2V0U3RhdGUoKTtpZih0 aGlzLmZpcmVFdmVudCgiYmVmb3Jlc3RhdGVzYXZlIix0aGlzLGEpIT09ZmFsc2Up e0V4dC5zdGF0ZS5NYW5hZ2VyLnNldChiLGEpO3RoaXMuZmlyZUV2ZW50KCJzdGF0 ZXNhdmUiLHRoaXMsYSl9fX19LGFwcGx5VG9NYXJrdXA6ZnVuY3Rpb24oYSl7dGhp cy5hbGxvd0RvbU1vdmU9ZmFsc2U7dGhpcy5lbD1FeHQuZ2V0KGEpO3RoaXMucmVu ZGVyKHRoaXMuZWwuZG9tLnBhcmVudE5vZGUpfSxhZGRDbGFzczpmdW5jdGlvbihh KXtpZih0aGlzLmVsKXt0aGlzLmVsLmFkZENsYXNzKGEpfWVsc2V7dGhpcy5jbHM9 dGhpcy5jbHM/dGhpcy5jbHMrIiAiK2E6YX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xh c3M6ZnVuY3Rpb24oYSl7aWYodGhpcy5lbCl7dGhpcy5lbC5yZW1vdmVDbGFzcyhh KX1lbHNle2lmKHRoaXMuY2xzKXt0aGlzLmNscz10aGlzLmNscy5zcGxpdCgiICIp LnJlbW92ZShhKS5qb2luKCIgIil9fXJldHVybiB0aGlzfSxvblJlbmRlcjpmdW5j dGlvbihiLGEpe2lmKCF0aGlzLmVsJiZ0aGlzLmF1dG9FbCl7aWYoRXh0LmlzU3Ry aW5nKHRoaXMuYXV0b0VsKSl7dGhpcy5lbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50 KHRoaXMuYXV0b0VsKX1lbHNle3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo ImRpdiIpO0V4dC5Eb21IZWxwZXIub3ZlcndyaXRlKGMsdGhpcy5hdXRvRWwpO3Ro aXMuZWw9Yy5maXJzdENoaWxkfWlmKCF0aGlzLmVsLmlkKXt0aGlzLmVsLmlkPXRo aXMuZ2V0SWQoKX19aWYodGhpcy5lbCl7dGhpcy5lbD1FeHQuZ2V0KHRoaXMuZWwp O2lmKHRoaXMuYWxsb3dEb21Nb3ZlIT09ZmFsc2Upe2IuZG9tLmluc2VydEJlZm9y ZSh0aGlzLmVsLmRvbSxhKTtpZihjKXtFeHQucmVtb3ZlTm9kZShjKTtjPW51bGx9 fX19LGdldEF1dG9DcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYT1FeHQuaXNPYmplY3Qo dGhpcy5hdXRvQ3JlYXRlKT90aGlzLmF1dG9DcmVhdGU6RXh0LmFwcGx5KHt9LHRo aXMuZGVmYXVsdEF1dG9DcmVhdGUpO2lmKHRoaXMuaWQmJiFhLmlkKXthLmlkPXRo aXMuaWR9cmV0dXJuIGF9LGFmdGVyUmVuZGVyOkV4dC5lbXB0eUZuLGRlc3Ryb3k6 ZnVuY3Rpb24oKXtpZighdGhpcy5pc0Rlc3Ryb3llZCl7aWYodGhpcy5maXJlRXZl bnQoImJlZm9yZWRlc3Ryb3kiLHRoaXMpIT09ZmFsc2Upe3RoaXMuZGVzdHJveWlu Zz10cnVlO3RoaXMuYmVmb3JlRGVzdHJveSgpO2lmKHRoaXMub3duZXJDdCYmdGhp cy5vd25lckN0LnJlbW92ZSl7dGhpcy5vd25lckN0LnJlbW92ZSh0aGlzLGZhbHNl KX1pZih0aGlzLnJlbmRlcmVkKXt0aGlzLmVsLnJlbW92ZSgpO2lmKHRoaXMuYWN0 aW9uTW9kZT09ImNvbnRhaW5lciJ8fHRoaXMucmVtb3ZlTW9kZT09ImNvbnRhaW5l ciIpe3RoaXMuY29udGFpbmVyLnJlbW92ZSgpfX1pZih0aGlzLmZvY3VzVGFzayYm dGhpcy5mb2N1c1Rhc2suY2FuY2VsKXt0aGlzLmZvY3VzVGFzay5jYW5jZWwoKX10 aGlzLm9uRGVzdHJveSgpO0V4dC5Db21wb25lbnRNZ3IudW5yZWdpc3Rlcih0aGlz KTt0aGlzLmZpcmVFdmVudCgiZGVzdHJveSIsdGhpcyk7dGhpcy5wdXJnZUxpc3Rl bmVycygpO3RoaXMuZGVzdHJveWluZz1mYWxzZTt0aGlzLmlzRGVzdHJveWVkPXRy dWV9fX0sZGVsZXRlTWVtYmVyczpmdW5jdGlvbigpe3ZhciBiPWFyZ3VtZW50cztm b3IodmFyIGM9MCxhPWIubGVuZ3RoO2M8YTsrK2Mpe2RlbGV0ZSB0aGlzW2JbY11d fX0sYmVmb3JlRGVzdHJveTpFeHQuZW1wdHlGbixvbkRlc3Ryb3k6RXh0LmVtcHR5 Rm4sZ2V0RWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbH0sZ2V0Q29udGVudFRh cmdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsfSxnZXRJZDpmdW5jdGlvbigp e3JldHVybiB0aGlzLmlkfHwodGhpcy5pZD0iZXh0LWNvbXAtIisoKytFeHQuQ29t cG9uZW50LkFVVE9fSUQpKX0sZ2V0SXRlbUlkOmZ1bmN0aW9uKCl7cmV0dXJuIHRo aXMuaXRlbUlkfHx0aGlzLmdldElkKCl9LGZvY3VzOmZ1bmN0aW9uKGIsYSl7aWYo YSl7dGhpcy5mb2N1c1Rhc2s9bmV3IEV4dC51dGlsLkRlbGF5ZWRUYXNrKHRoaXMu Zm9jdXMsdGhpcyxbYixmYWxzZV0pO3RoaXMuZm9jdXNUYXNrLmRlbGF5KEV4dC5p c051bWJlcihhKT9hOjEwKTtyZXR1cm4gdGhpc31pZih0aGlzLnJlbmRlcmVkJiYh dGhpcy5pc0Rlc3Ryb3llZCl7dGhpcy5lbC5mb2N1cygpO2lmKGI9PT10cnVlKXt0 aGlzLmVsLmRvbS5zZWxlY3QoKX19cmV0dXJuIHRoaXN9LGJsdXI6ZnVuY3Rpb24o KXtpZih0aGlzLnJlbmRlcmVkKXt0aGlzLmVsLmJsdXIoKX1yZXR1cm4gdGhpc30s ZGlzYWJsZTpmdW5jdGlvbihhKXtpZih0aGlzLnJlbmRlcmVkKXt0aGlzLm9uRGlz YWJsZSgpfXRoaXMuZGlzYWJsZWQ9dHJ1ZTtpZihhIT09dHJ1ZSl7dGhpcy5maXJl RXZlbnQoImRpc2FibGUiLHRoaXMpfXJldHVybiB0aGlzfSxvbkRpc2FibGU6ZnVu Y3Rpb24oKXt0aGlzLmdldEFjdGlvbkVsKCkuYWRkQ2xhc3ModGhpcy5kaXNhYmxl ZENsYXNzKTt0aGlzLmVsLmRvbS5kaXNhYmxlZD10cnVlfSxlbmFibGU6ZnVuY3Rp b24oKXtpZih0aGlzLnJlbmRlcmVkKXt0aGlzLm9uRW5hYmxlKCl9dGhpcy5kaXNh YmxlZD1mYWxzZTt0aGlzLmZpcmVFdmVudCgiZW5hYmxlIix0aGlzKTtyZXR1cm4g dGhpc30sb25FbmFibGU6ZnVuY3Rpb24oKXt0aGlzLmdldEFjdGlvbkVsKCkucmVt b3ZlQ2xhc3ModGhpcy5kaXNhYmxlZENsYXNzKTt0aGlzLmVsLmRvbS5kaXNhYmxl ZD1mYWxzZX0sc2V0RGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXNbYT8i ZGlzYWJsZSI6ImVuYWJsZSJdKCl9LHNob3c6ZnVuY3Rpb24oKXtpZih0aGlzLmZp cmVFdmVudCgiYmVmb3Jlc2hvdyIsdGhpcykhPT1mYWxzZSl7dGhpcy5oaWRkZW49 ZmFsc2U7aWYodGhpcy5hdXRvUmVuZGVyKXt0aGlzLnJlbmRlcihFeHQuaXNCb29s ZWFuKHRoaXMuYXV0b1JlbmRlcik/RXh0LmdldEJvZHkoKTp0aGlzLmF1dG9SZW5k ZXIpfWlmKHRoaXMucmVuZGVyZWQpe3RoaXMub25TaG93KCl9dGhpcy5maXJlRXZl bnQoInNob3ciLHRoaXMpfXJldHVybiB0aGlzfSxvblNob3c6ZnVuY3Rpb24oKXt0 aGlzLmdldFZpc2liaWxpdHlFbCgpLnJlbW92ZUNsYXNzKCJ4LWhpZGUtIit0aGlz LmhpZGVNb2RlKX0saGlkZTpmdW5jdGlvbigpe2lmKHRoaXMuZmlyZUV2ZW50KCJi ZWZvcmVoaWRlIix0aGlzKSE9PWZhbHNlKXt0aGlzLmRvSGlkZSgpO3RoaXMuZmly ZUV2ZW50KCJoaWRlIix0aGlzKX1yZXR1cm4gdGhpc30sZG9IaWRlOmZ1bmN0aW9u KCl7dGhpcy5oaWRkZW49dHJ1ZTtpZih0aGlzLnJlbmRlcmVkKXt0aGlzLm9uSGlk ZSgpfX0sb25IaWRlOmZ1bmN0aW9uKCl7dGhpcy5nZXRWaXNpYmlsaXR5RWwoKS5h ZGRDbGFzcygieC1oaWRlLSIrdGhpcy5oaWRlTW9kZSl9LGdldFZpc2liaWxpdHlF bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZGVQYXJlbnQ/dGhpcy5jb250YWlu ZXI6dGhpcy5nZXRBY3Rpb25FbCgpfSxzZXRWaXNpYmxlOmZ1bmN0aW9uKGEpe3Jl dHVybiB0aGlzW2E/InNob3ciOiJoaWRlIl0oKX0saXNWaXNpYmxlOmZ1bmN0aW9u KCl7cmV0dXJuIHRoaXMucmVuZGVyZWQmJnRoaXMuZ2V0VmlzaWJpbGl0eUVsKCku aXNWaXNpYmxlKCl9LGNsb25lQ29uZmlnOmZ1bmN0aW9uKGIpe2I9Ynx8e307dmFy IGM9Yi5pZHx8RXh0LmlkKCk7dmFyIGE9RXh0LmFwcGx5SWYoYix0aGlzLmluaXRp YWxDb25maWcpO2EuaWQ9YztyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoYSl9 LGdldFhUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IueHR5 cGV9LGlzWFR5cGU6ZnVuY3Rpb24oYixhKXtpZihFeHQuaXNGdW5jdGlvbihiKSl7 Yj1iLnh0eXBlfWVsc2V7aWYoRXh0LmlzT2JqZWN0KGIpKXtiPWIuY29uc3RydWN0 b3IueHR5cGV9fXJldHVybiAhYT8oIi8iK3RoaXMuZ2V0WFR5cGVzKCkrIi8iKS5p bmRleE9mKCIvIitiKyIvIikhPS0xOnRoaXMuY29uc3RydWN0b3IueHR5cGU9PWJ9 LGdldFhUeXBlczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY29uc3RydWN0b3I7aWYo IWEueHR5cGVzKXt2YXIgZD1bXSxiPXRoaXM7d2hpbGUoYiYmYi5jb25zdHJ1Y3Rv ci54dHlwZSl7ZC51bnNoaWZ0KGIuY29uc3RydWN0b3IueHR5cGUpO2I9Yi5jb25z dHJ1Y3Rvci5zdXBlcmNsYXNzfWEueHR5cGVDaGFpbj1kO2EueHR5cGVzPWQuam9p bigiLyIpfXJldHVybiBhLnh0eXBlc30sZmluZFBhcmVudEJ5OmZ1bmN0aW9uKGEp e2Zvcih2YXIgYj10aGlzLm93bmVyQ3Q7KGIhPW51bGwpJiYhYShiLHRoaXMpO2I9 Yi5vd25lckN0KXt9cmV0dXJuIGJ8fG51bGx9LGZpbmRQYXJlbnRCeVR5cGU6ZnVu Y3Rpb24oYixhKXtyZXR1cm4gdGhpcy5maW5kUGFyZW50QnkoZnVuY3Rpb24oZCl7 cmV0dXJuIGQuaXNYVHlwZShiLGEpfSl9LGJ1YmJsZTpmdW5jdGlvbihjLGIsYSl7 dmFyIGQ9dGhpczt3aGlsZShkKXtpZihjLmFwcGx5KGJ8fGQsYXx8W2RdKT09PWZh bHNlKXticmVha31kPWQub3duZXJDdH1yZXR1cm4gdGhpc30sZ2V0UG9zaXRpb25F bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uRWx8fHRoaXMuZWx9LHB1 cmdlTGlzdGVuZXJzOmZ1bmN0aW9uKCl7RXh0LkNvbXBvbmVudC5zdXBlcmNsYXNz LnB1cmdlTGlzdGVuZXJzLmNhbGwodGhpcyk7aWYodGhpcy5tb25zKXt0aGlzLm9u KCJiZWZvcmVkZXN0cm95Iix0aGlzLmNsZWFyTW9ucyx0aGlzLHtzaW5nbGU6dHJ1 ZX0pfX0sY2xlYXJNb25zOmZ1bmN0aW9uKCl7RXh0LmVhY2godGhpcy5tb25zLGZ1 bmN0aW9uKGEpe2EuaXRlbS51bihhLmVuYW1lLGEuZm4sYS5zY29wZSl9LHRoaXMp O3RoaXMubW9ucz1bXX0sY3JlYXRlTW9uczpmdW5jdGlvbigpe2lmKCF0aGlzLm1v bnMpe3RoaXMubW9ucz1bXTt0aGlzLm9uKCJiZWZvcmVkZXN0cm95Iix0aGlzLmNs ZWFyTW9ucyx0aGlzLHtzaW5nbGU6dHJ1ZX0pfX0sbW9uOmZ1bmN0aW9uKGcsYixk LGMsYSl7dGhpcy5jcmVhdGVNb25zKCk7aWYoRXh0LmlzT2JqZWN0KGIpKXt2YXIg aj0vXig/OnNjb3BlfGRlbGF5fGJ1ZmZlcnxzaW5nbGV8c3RvcEV2ZW50fHByZXZl bnREZWZhdWx0fHN0b3BQcm9wYWdhdGlvbnxub3JtYWxpemVkfGFyZ3N8ZGVsZWdh dGUpJC87dmFyIGk9Yjtmb3IodmFyIGggaW4gaSl7aWYoai50ZXN0KGgpKXtjb250 aW51ZX1pZihFeHQuaXNGdW5jdGlvbihpW2hdKSl7dGhpcy5tb25zLnB1c2goe2l0 ZW06ZyxlbmFtZTpoLGZuOmlbaF0sc2NvcGU6aS5zY29wZX0pO2cub24oaCxpW2hd LGkuc2NvcGUsaSl9ZWxzZXt0aGlzLm1vbnMucHVzaCh7aXRlbTpnLGVuYW1lOmgs Zm46aVtoXSxzY29wZTppLnNjb3BlfSk7Zy5vbihoLGlbaF0pfX1yZXR1cm59dGhp cy5tb25zLnB1c2goe2l0ZW06ZyxlbmFtZTpiLGZuOmQsc2NvcGU6Y30pO2cub24o YixkLGMsYSl9LG11bjpmdW5jdGlvbihoLGMsZyxlKXt2YXIgaixkO3RoaXMuY3Jl YXRlTW9ucygpO2Zvcih2YXIgYj0wLGE9dGhpcy5tb25zLmxlbmd0aDtiPGE7Kyti KXtkPXRoaXMubW9uc1tiXTtpZihoPT09ZC5pdGVtJiZjPT1kLmVuYW1lJiZnPT09 ZC5mbiYmZT09PWQuc2NvcGUpe3RoaXMubW9ucy5zcGxpY2UoYiwxKTtoLnVuKGMs ZyxlKTtqPXRydWU7YnJlYWt9fXJldHVybiBqfSxuZXh0U2libGluZzpmdW5jdGlv bigpe2lmKHRoaXMub3duZXJDdCl7dmFyIGE9dGhpcy5vd25lckN0Lml0ZW1zLmlu ZGV4T2YodGhpcyk7aWYoYSE9LTEmJmErMTx0aGlzLm93bmVyQ3QuaXRlbXMuZ2V0 Q291bnQoKSl7cmV0dXJuIHRoaXMub3duZXJDdC5pdGVtcy5pdGVtQXQoYSsxKX19 cmV0dXJuIG51bGx9LHByZXZpb3VzU2libGluZzpmdW5jdGlvbigpe2lmKHRoaXMu b3duZXJDdCl7dmFyIGE9dGhpcy5vd25lckN0Lml0ZW1zLmluZGV4T2YodGhpcyk7 aWYoYT4wKXtyZXR1cm4gdGhpcy5vd25lckN0Lml0ZW1zLml0ZW1BdChhLTEpfX1y ZXR1cm4gbnVsbH0sZ2V0QnViYmxlVGFyZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRo aXMub3duZXJDdH19KTtFeHQucmVnKCJjb21wb25lbnQiLEV4dC5Db21wb25lbnQp O0V4dC5BY3Rpb249RXh0LmV4dGVuZChPYmplY3Qse2NvbnN0cnVjdG9yOmZ1bmN0 aW9uKGEpe3RoaXMuaW5pdGlhbENvbmZpZz1hO3RoaXMuaXRlbUlkPWEuaXRlbUlk PShhLml0ZW1JZHx8YS5pZHx8RXh0LmlkKCkpO3RoaXMuaXRlbXM9W119LGlzQWN0 aW9uOnRydWUsc2V0VGV4dDpmdW5jdGlvbihhKXt0aGlzLmluaXRpYWxDb25maWcu dGV4dD1hO3RoaXMuY2FsbEVhY2goInNldFRleHQiLFthXSl9LGdldFRleHQ6ZnVu Y3Rpb24oKXtyZXR1cm4gdGhpcy5pbml0aWFsQ29uZmlnLnRleHR9LHNldEljb25D bGFzczpmdW5jdGlvbihhKXt0aGlzLmluaXRpYWxDb25maWcuaWNvbkNscz1hO3Ro aXMuY2FsbEVhY2goInNldEljb25DbGFzcyIsW2FdKX0sZ2V0SWNvbkNsYXNzOmZ1 bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5pdGlhbENvbmZpZy5pY29uQ2xzfSxzZXRE aXNhYmxlZDpmdW5jdGlvbihhKXt0aGlzLmluaXRpYWxDb25maWcuZGlzYWJsZWQ9 YTt0aGlzLmNhbGxFYWNoKCJzZXREaXNhYmxlZCIsW2FdKX0sZW5hYmxlOmZ1bmN0 aW9uKCl7dGhpcy5zZXREaXNhYmxlZChmYWxzZSl9LGRpc2FibGU6ZnVuY3Rpb24o KXt0aGlzLnNldERpc2FibGVkKHRydWUpfSxpc0Rpc2FibGVkOmZ1bmN0aW9uKCl7 cmV0dXJuIHRoaXMuaW5pdGlhbENvbmZpZy5kaXNhYmxlZH0sc2V0SGlkZGVuOmZ1 bmN0aW9uKGEpe3RoaXMuaW5pdGlhbENvbmZpZy5oaWRkZW49YTt0aGlzLmNhbGxF YWNoKCJzZXRWaXNpYmxlIixbIWFdKX0sc2hvdzpmdW5jdGlvbigpe3RoaXMuc2V0 SGlkZGVuKGZhbHNlKX0saGlkZTpmdW5jdGlvbigpe3RoaXMuc2V0SGlkZGVuKHRy dWUpfSxpc0hpZGRlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluaXRpYWxDb25m aWcuaGlkZGVufSxzZXRIYW5kbGVyOmZ1bmN0aW9uKGIsYSl7dGhpcy5pbml0aWFs Q29uZmlnLmhhbmRsZXI9Yjt0aGlzLmluaXRpYWxDb25maWcuc2NvcGU9YTt0aGlz LmNhbGxFYWNoKCJzZXRIYW5kbGVyIixbYixhXSl9LGVhY2g6ZnVuY3Rpb24oYixh KXtFeHQuZWFjaCh0aGlzLml0ZW1zLGIsYSl9LGNhbGxFYWNoOmZ1bmN0aW9uKGUs Yil7dmFyIGQ9dGhpcy5pdGVtcztmb3IodmFyIGM9MCxhPWQubGVuZ3RoO2M8YTtj Kyspe2RbY11bZV0uYXBwbHkoZFtjXSxiKX19LGFkZENvbXBvbmVudDpmdW5jdGlv bihhKXt0aGlzLml0ZW1zLnB1c2goYSk7YS5vbigiZGVzdHJveSIsdGhpcy5yZW1v dmVDb21wb25lbnQsdGhpcyl9LHJlbW92ZUNvbXBvbmVudDpmdW5jdGlvbihhKXt0 aGlzLml0ZW1zLnJlbW92ZShhKX0sZXhlY3V0ZTpmdW5jdGlvbigpe3RoaXMuaW5p dGlhbENvbmZpZy5oYW5kbGVyLmFwcGx5KHRoaXMuaW5pdGlhbENvbmZpZy5zY29w ZXx8d2luZG93LGFyZ3VtZW50cyl9fSk7KGZ1bmN0aW9uKCl7RXh0LkxheWVyPWZ1 bmN0aW9uKGQsYyl7ZD1kfHx7fTt2YXIgZT1FeHQuRG9tSGVscGVyLGg9ZC5wYXJl bnRFbCxnPWg/RXh0LmdldERvbShoKTpkb2N1bWVudC5ib2R5O2lmKGMpe3RoaXMu ZG9tPUV4dC5nZXREb20oYyl9aWYoIXRoaXMuZG9tKXt2YXIgaT1kLmRofHx7dGFn OiJkaXYiLGNsczoieC1sYXllciJ9O3RoaXMuZG9tPWUuYXBwZW5kKGcsaSl9aWYo ZC5jbHMpe3RoaXMuYWRkQ2xhc3MoZC5jbHMpfXRoaXMuY29uc3RyYWluPWQuY29u c3RyYWluIT09ZmFsc2U7dGhpcy5zZXRWaXNpYmlsaXR5TW9kZShFeHQuRWxlbWVu dC5WSVNJQklMSVRZKTtpZihkLmlkKXt0aGlzLmlkPXRoaXMuZG9tLmlkPWQuaWR9 ZWxzZXt0aGlzLmlkPUV4dC5pZCh0aGlzLmRvbSl9dGhpcy56aW5kZXg9ZC56aW5k ZXh8fHRoaXMuZ2V0WkluZGV4KCk7dGhpcy5wb3NpdGlvbigiYWJzb2x1dGUiLHRo aXMuemluZGV4KTtpZihkLnNoYWRvdyl7dGhpcy5zaGFkb3dPZmZzZXQ9ZC5zaGFk b3dPZmZzZXR8fDQ7dGhpcy5zaGFkb3c9bmV3IEV4dC5TaGFkb3coe29mZnNldDp0 aGlzLnNoYWRvd09mZnNldCxtb2RlOmQuc2hhZG93fSl9ZWxzZXt0aGlzLnNoYWRv d09mZnNldD0wfXRoaXMudXNlU2hpbT1kLnNoaW0hPT1mYWxzZSYmRXh0LnVzZVNo aW1zO3RoaXMudXNlRGlzcGxheT1kLnVzZURpc3BsYXk7dGhpcy5oaWRlKCl9O3Zh ciBhPUV4dC5FbGVtZW50LnByb3RvdHlwZTt2YXIgYj1bXTtFeHQuZXh0ZW5kKEV4 dC5MYXllcixFeHQuRWxlbWVudCx7Z2V0WkluZGV4OmZ1bmN0aW9uKCl7cmV0dXJu IHRoaXMuemluZGV4fHxwYXJzZUludCgodGhpcy5nZXRTaGltKCl8fHRoaXMpLmdl dFN0eWxlKCJ6LWluZGV4IiksMTApfHwxMTAwMH0sZ2V0U2hpbTpmdW5jdGlvbigp e2lmKCF0aGlzLnVzZVNoaW0pe3JldHVybiBudWxsfWlmKHRoaXMuc2hpbSl7cmV0 dXJuIHRoaXMuc2hpbX12YXIgZD1iLnNoaWZ0KCk7aWYoIWQpe2Q9dGhpcy5jcmVh dGVTaGltKCk7ZC5lbmFibGVEaXNwbGF5TW9kZSgiYmxvY2siKTtkLmRvbS5zdHls ZS5kaXNwbGF5PSJub25lIjtkLmRvbS5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxl In12YXIgYz10aGlzLmRvbS5wYXJlbnROb2RlO2lmKGQuZG9tLnBhcmVudE5vZGUh PWMpe2MuaW5zZXJ0QmVmb3JlKGQuZG9tLHRoaXMuZG9tKX1kLnNldFN0eWxlKCJ6 LWluZGV4Iix0aGlzLmdldFpJbmRleCgpLTIpO3RoaXMuc2hpbT1kO3JldHVybiBk fSxoaWRlU2hpbTpmdW5jdGlvbigpe2lmKHRoaXMuc2hpbSl7dGhpcy5zaGltLnNl dERpc3BsYXllZChmYWxzZSk7Yi5wdXNoKHRoaXMuc2hpbSk7ZGVsZXRlIHRoaXMu c2hpbX19LGRpc2FibGVTaGFkb3c6ZnVuY3Rpb24oKXtpZih0aGlzLnNoYWRvdyl7 dGhpcy5zaGFkb3dEaXNhYmxlZD10cnVlO3RoaXMuc2hhZG93LmhpZGUoKTt0aGlz Lmxhc3RTaGFkb3dPZmZzZXQ9dGhpcy5zaGFkb3dPZmZzZXQ7dGhpcy5zaGFkb3dP ZmZzZXQ9MH19LGVuYWJsZVNoYWRvdzpmdW5jdGlvbihjKXtpZih0aGlzLnNoYWRv dyl7dGhpcy5zaGFkb3dEaXNhYmxlZD1mYWxzZTtpZihFeHQuaXNEZWZpbmVkKHRo aXMubGFzdFNoYWRvd09mZnNldCkpe3RoaXMuc2hhZG93T2Zmc2V0PXRoaXMubGFz dFNoYWRvd09mZnNldDtkZWxldGUgdGhpcy5sYXN0U2hhZG93T2Zmc2V0fWlmKGMp e3RoaXMuc3luYyh0cnVlKX19fSxzeW5jOmZ1bmN0aW9uKGQpe3ZhciBuPXRoaXMu c2hhZG93O2lmKCF0aGlzLnVwZGF0aW5nJiZ0aGlzLmlzVmlzaWJsZSgpJiYobnx8 dGhpcy51c2VTaGltKSl7dmFyIGk9dGhpcy5nZXRTaGltKCksbT10aGlzLmdldFdp ZHRoKCksaj10aGlzLmdldEhlaWdodCgpLGU9dGhpcy5nZXRMZWZ0KHRydWUpLG89 dGhpcy5nZXRUb3AodHJ1ZSk7aWYobiYmIXRoaXMuc2hhZG93RGlzYWJsZWQpe2lm KGQmJiFuLmlzVmlzaWJsZSgpKXtuLnNob3codGhpcyl9ZWxzZXtuLnJlYWxpZ24o ZSxvLG0sail9aWYoaSl7aWYoZCl7aS5zaG93KCl9dmFyIGs9bi5lbC5nZXRYWSgp LGc9aS5kb20uc3R5bGUsYz1uLmVsLmdldFNpemUoKTtnLmxlZnQ9KGtbMF0pKyJw eCI7Zy50b3A9KGtbMV0pKyJweCI7Zy53aWR0aD0oYy53aWR0aCkrInB4IjtnLmhl aWdodD0oYy5oZWlnaHQpKyJweCJ9fWVsc2V7aWYoaSl7aWYoZCl7aS5zaG93KCl9 aS5zZXRTaXplKG0saik7aS5zZXRMZWZ0VG9wKGUsbyl9fX19LGRlc3Ryb3k6ZnVu Y3Rpb24oKXt0aGlzLmhpZGVTaGltKCk7aWYodGhpcy5zaGFkb3cpe3RoaXMuc2hh ZG93LmhpZGUoKX10aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO0V4dC5yZW1vdmVO b2RlKHRoaXMuZG9tKTtkZWxldGUgdGhpcy5kb219LHJlbW92ZTpmdW5jdGlvbigp e3RoaXMuZGVzdHJveSgpfSxiZWdpblVwZGF0ZTpmdW5jdGlvbigpe3RoaXMudXBk YXRpbmc9dHJ1ZX0sZW5kVXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGluZz1m YWxzZTt0aGlzLnN5bmModHJ1ZSl9LGhpZGVVbmRlcnM6ZnVuY3Rpb24oYyl7aWYo dGhpcy5zaGFkb3cpe3RoaXMuc2hhZG93LmhpZGUoKX10aGlzLmhpZGVTaGltKCl9 LGNvbnN0cmFpblhZOmZ1bmN0aW9uKCl7aWYodGhpcy5jb25zdHJhaW4pe3ZhciBq PUV4dC5saWIuRG9tLmdldFZpZXdXaWR0aCgpLGQ9RXh0LmxpYi5Eb20uZ2V0Vmll d0hlaWdodCgpO3ZhciBvPUV4dC5nZXREb2MoKS5nZXRTY3JvbGwoKTt2YXIgbj10 aGlzLmdldFhZKCk7dmFyIGs9blswXSxpPW5bMV07dmFyIGM9dGhpcy5zaGFkb3dP ZmZzZXQ7dmFyIGw9dGhpcy5kb20ub2Zmc2V0V2lkdGgrYyxlPXRoaXMuZG9tLm9m ZnNldEhlaWdodCtjO3ZhciBnPWZhbHNlO2lmKChrK2wpPmorby5sZWZ0KXtrPWot bC1jO2c9dHJ1ZX1pZigoaStlKT5kK28udG9wKXtpPWQtZS1jO2c9dHJ1ZX1pZihr PG8ubGVmdCl7az1vLmxlZnQ7Zz10cnVlfWlmKGk8by50b3Ape2k9by50b3A7Zz10 cnVlfWlmKGcpe2lmKHRoaXMuYXZvaWRZKXt2YXIgbT10aGlzLmF2b2lkWTtpZihp PD1tJiYoaStlKT49bSl7aT1tLWUtNX19bj1bayxpXTt0aGlzLnN0b3JlWFkobik7 YS5zZXRYWS5jYWxsKHRoaXMsbik7dGhpcy5zeW5jKCl9fXJldHVybiB0aGlzfSxn ZXRDb25zdHJhaW5PZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaGFkb3dP ZmZzZXR9LGlzVmlzaWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpc2libGV9 LHNob3dBY3Rpb246ZnVuY3Rpb24oKXt0aGlzLnZpc2libGU9dHJ1ZTtpZih0aGlz LnVzZURpc3BsYXk9PT10cnVlKXt0aGlzLnNldERpc3BsYXllZCgiIil9ZWxzZXtp Zih0aGlzLmxhc3RYWSl7YS5zZXRYWS5jYWxsKHRoaXMsdGhpcy5sYXN0WFkpfWVs c2V7aWYodGhpcy5sYXN0TFQpe2Euc2V0TGVmdFRvcC5jYWxsKHRoaXMsdGhpcy5s YXN0TFRbMF0sdGhpcy5sYXN0TFRbMV0pfX19fSxoaWRlQWN0aW9uOmZ1bmN0aW9u KCl7dGhpcy52aXNpYmxlPWZhbHNlO2lmKHRoaXMudXNlRGlzcGxheT09PXRydWUp e3RoaXMuc2V0RGlzcGxheWVkKGZhbHNlKX1lbHNle3RoaXMuc2V0TGVmdFRvcCgt MTAwMDAsLTEwMDAwKX19LHNldFZpc2libGU6ZnVuY3Rpb24oaSxoLGssbCxqKXtp ZihpKXt0aGlzLnNob3dBY3Rpb24oKX1pZihoJiZpKXt2YXIgZz1mdW5jdGlvbigp e3RoaXMuc3luYyh0cnVlKTtpZihsKXtsKCl9fS5jcmVhdGVEZWxlZ2F0ZSh0aGlz KTthLnNldFZpc2libGUuY2FsbCh0aGlzLHRydWUsdHJ1ZSxrLGcsail9ZWxzZXtp ZighaSl7dGhpcy5oaWRlVW5kZXJzKHRydWUpfXZhciBnPWw7aWYoaCl7Zz1mdW5j dGlvbigpe3RoaXMuaGlkZUFjdGlvbigpO2lmKGwpe2woKX19LmNyZWF0ZURlbGVn YXRlKHRoaXMpfWEuc2V0VmlzaWJsZS5jYWxsKHRoaXMsaSxoLGssZyxqKTtpZihp KXt0aGlzLnN5bmModHJ1ZSl9ZWxzZXtpZighaCl7dGhpcy5oaWRlQWN0aW9uKCl9 fX1yZXR1cm4gdGhpc30sc3RvcmVYWTpmdW5jdGlvbihjKXtkZWxldGUgdGhpcy5s YXN0TFQ7dGhpcy5sYXN0WFk9Y30sc3RvcmVMZWZ0VG9wOmZ1bmN0aW9uKGQsYyl7 ZGVsZXRlIHRoaXMubGFzdFhZO3RoaXMubGFzdExUPVtkLGNdfSxiZWZvcmVGeDpm dW5jdGlvbigpe3RoaXMuYmVmb3JlQWN0aW9uKCk7cmV0dXJuIEV4dC5MYXllci5z dXBlcmNsYXNzLmJlZm9yZUZ4LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYWZ0ZXJG eDpmdW5jdGlvbigpe0V4dC5MYXllci5zdXBlcmNsYXNzLmFmdGVyRnguYXBwbHko dGhpcyxhcmd1bWVudHMpO3RoaXMuc3luYyh0aGlzLmlzVmlzaWJsZSgpKX0sYmVm b3JlQWN0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXMudXBkYXRpbmcmJnRoaXMuc2hh ZG93KXt0aGlzLnNoYWRvdy5oaWRlKCl9fSxzZXRMZWZ0OmZ1bmN0aW9uKGMpe3Ro aXMuc3RvcmVMZWZ0VG9wKGMsdGhpcy5nZXRUb3AodHJ1ZSkpO2Euc2V0TGVmdC5h cHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5zeW5jKCk7cmV0dXJuIHRoaXN9LHNl dFRvcDpmdW5jdGlvbihjKXt0aGlzLnN0b3JlTGVmdFRvcCh0aGlzLmdldExlZnQo dHJ1ZSksYyk7YS5zZXRUb3AuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuc3lu YygpO3JldHVybiB0aGlzfSxzZXRMZWZ0VG9wOmZ1bmN0aW9uKGQsYyl7dGhpcy5z dG9yZUxlZnRUb3AoZCxjKTthLnNldExlZnRUb3AuYXBwbHkodGhpcyxhcmd1bWVu dHMpO3RoaXMuc3luYygpO3JldHVybiB0aGlzfSxzZXRYWTpmdW5jdGlvbihqLGgs ayxsLGkpe3RoaXMuZml4RGlzcGxheSgpO3RoaXMuYmVmb3JlQWN0aW9uKCk7dGhp cy5zdG9yZVhZKGopO3ZhciBnPXRoaXMuY3JlYXRlQ0IobCk7YS5zZXRYWS5jYWxs KHRoaXMsaixoLGssZyxpKTtpZighaCl7ZygpfXJldHVybiB0aGlzfSxjcmVhdGVD QjpmdW5jdGlvbihlKXt2YXIgZD10aGlzO3JldHVybiBmdW5jdGlvbigpe2QuY29u c3RyYWluWFkoKTtkLnN5bmModHJ1ZSk7aWYoZSl7ZSgpfX19LHNldFg6ZnVuY3Rp b24oZyxoLGosayxpKXt0aGlzLnNldFhZKFtnLHRoaXMuZ2V0WSgpXSxoLGosayxp KTtyZXR1cm4gdGhpc30sc2V0WTpmdW5jdGlvbihrLGcsaSxqLGgpe3RoaXMuc2V0 WFkoW3RoaXMuZ2V0WCgpLGtdLGcsaSxqLGgpO3JldHVybiB0aGlzfSxzZXRTaXpl OmZ1bmN0aW9uKGosayxpLG0sbixsKXt0aGlzLmJlZm9yZUFjdGlvbigpO3ZhciBn PXRoaXMuY3JlYXRlQ0Iobik7YS5zZXRTaXplLmNhbGwodGhpcyxqLGssaSxtLGcs bCk7aWYoIWkpe2coKX1yZXR1cm4gdGhpc30sc2V0V2lkdGg6ZnVuY3Rpb24oaSxo LGssbCxqKXt0aGlzLmJlZm9yZUFjdGlvbigpO3ZhciBnPXRoaXMuY3JlYXRlQ0Io bCk7YS5zZXRXaWR0aC5jYWxsKHRoaXMsaSxoLGssZyxqKTtpZighaCl7ZygpfXJl dHVybiB0aGlzfSxzZXRIZWlnaHQ6ZnVuY3Rpb24oaixpLGwsbSxrKXt0aGlzLmJl Zm9yZUFjdGlvbigpO3ZhciBnPXRoaXMuY3JlYXRlQ0IobSk7YS5zZXRIZWlnaHQu Y2FsbCh0aGlzLGosaSxsLGcsayk7aWYoIWkpe2coKX1yZXR1cm4gdGhpc30sc2V0 Qm91bmRzOmZ1bmN0aW9uKG8sbSxwLGksbixrLGwsail7dGhpcy5iZWZvcmVBY3Rp b24oKTt2YXIgZz10aGlzLmNyZWF0ZUNCKGwpO2lmKCFuKXt0aGlzLnN0b3JlWFko W28sbV0pO2Euc2V0WFkuY2FsbCh0aGlzLFtvLG1dKTthLnNldFNpemUuY2FsbCh0 aGlzLHAsaSxuLGssZyxqKTtnKCl9ZWxzZXthLnNldEJvdW5kcy5jYWxsKHRoaXMs byxtLHAsaSxuLGssZyxqKX1yZXR1cm4gdGhpc30sc2V0WkluZGV4OmZ1bmN0aW9u KGMpe3RoaXMuemluZGV4PWM7dGhpcy5zZXRTdHlsZSgiei1pbmRleCIsYysyKTtp Zih0aGlzLnNoYWRvdyl7dGhpcy5zaGFkb3cuc2V0WkluZGV4KGMrMSl9aWYodGhp cy5zaGltKXt0aGlzLnNoaW0uc2V0U3R5bGUoInotaW5kZXgiLGMpfXJldHVybiB0 aGlzfX0pfSkoKTtFeHQuU2hhZG93PWZ1bmN0aW9uKGQpe0V4dC5hcHBseSh0aGlz LGQpO2lmKHR5cGVvZiB0aGlzLm1vZGUhPSJzdHJpbmciKXt0aGlzLm1vZGU9dGhp cy5kZWZhdWx0TW9kZX12YXIgZT10aGlzLm9mZnNldCxjPXtoOjB9LGI9TWF0aC5m bG9vcih0aGlzLm9mZnNldC8yKTtzd2l0Y2godGhpcy5tb2RlLnRvTG93ZXJDYXNl KCkpe2Nhc2UiZHJvcCI6Yy53PTA7Yy5sPWMudD1lO2MudC09MTtpZihFeHQuaXNJ RSl7Yy5sLT10aGlzLm9mZnNldCtiO2MudC09dGhpcy5vZmZzZXQrYjtjLnctPWI7 Yy5oLT1iO2MudCs9MX1icmVhaztjYXNlInNpZGVzIjpjLnc9KGUqMik7Yy5sPS1l O2MudD1lLTE7aWYoRXh0LmlzSUUpe2MubC09KHRoaXMub2Zmc2V0LWIpO2MudC09 dGhpcy5vZmZzZXQrYjtjLmwrPTE7Yy53LT0odGhpcy5vZmZzZXQtYikqMjtjLnct PWIrMTtjLmgtPTF9YnJlYWs7Y2FzZSJmcmFtZSI6Yy53PWMuaD0oZSoyKTtjLmw9 Yy50PS1lO2MudCs9MTtjLmgtPTI7aWYoRXh0LmlzSUUpe2MubC09KHRoaXMub2Zm c2V0LWIpO2MudC09KHRoaXMub2Zmc2V0LWIpO2MubCs9MTtjLnctPSh0aGlzLm9m ZnNldCtiKzEpO2MuaC09KHRoaXMub2Zmc2V0K2IpO2MuaCs9MX1icmVha310aGlz LmFkanVzdHM9Y307RXh0LlNoYWRvdy5wcm90b3R5cGU9e29mZnNldDo0LGRlZmF1 bHRNb2RlOiJkcm9wIixzaG93OmZ1bmN0aW9uKGEpe2E9RXh0LmdldChhKTtpZigh dGhpcy5lbCl7dGhpcy5lbD1FeHQuU2hhZG93LlBvb2wucHVsbCgpO2lmKHRoaXMu ZWwuZG9tLm5leHRTaWJsaW5nIT1hLmRvbSl7dGhpcy5lbC5pbnNlcnRCZWZvcmUo YSl9fXRoaXMuZWwuc2V0U3R5bGUoInotaW5kZXgiLHRoaXMuekluZGV4fHxwYXJz ZUludChhLmdldFN0eWxlKCJ6LWluZGV4IiksMTApLTEpO2lmKEV4dC5pc0lFKXt0 aGlzLmVsLmRvbS5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3Jt Lk1pY3Jvc29mdC5hbHBoYShvcGFjaXR5PTUwKSBwcm9naWQ6RFhJbWFnZVRyYW5z Zm9ybS5NaWNyb3NvZnQuQmx1cihwaXhlbHJhZGl1cz0iKyh0aGlzLm9mZnNldCkr IikifXRoaXMucmVhbGlnbihhLmdldExlZnQodHJ1ZSksYS5nZXRUb3AodHJ1ZSks YS5nZXRXaWR0aCgpLGEuZ2V0SGVpZ2h0KCkpO3RoaXMuZWwuZG9tLnN0eWxlLmRp c3BsYXk9ImJsb2NrIn0saXNWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMu ZWw/dHJ1ZTpmYWxzZX0scmVhbGlnbjpmdW5jdGlvbihiLHIscSxnKXtpZighdGhp cy5lbCl7cmV0dXJufXZhciBuPXRoaXMuYWRqdXN0cyxrPXRoaXMuZWwuZG9tLHU9 ay5zdHlsZSxpPTAscD0ocStuLncpLGU9KGcrbi5oKSxqPXArInB4IixvPWUrInB4 IixtLGM7dS5sZWZ0PShiK24ubCkrInB4Ijt1LnRvcD0ocituLnQpKyJweCI7aWYo dS53aWR0aCE9anx8dS5oZWlnaHQhPW8pe3Uud2lkdGg9ajt1LmhlaWdodD1vO2lm KCFFeHQuaXNJRSl7bT1rLmNoaWxkTm9kZXM7Yz1NYXRoLm1heCgwLChwLTEyKSkr InB4IjttWzBdLmNoaWxkTm9kZXNbMV0uc3R5bGUud2lkdGg9YzttWzFdLmNoaWxk Tm9kZXNbMV0uc3R5bGUud2lkdGg9YzttWzJdLmNoaWxkTm9kZXNbMV0uc3R5bGUu d2lkdGg9YzttWzFdLnN0eWxlLmhlaWdodD1NYXRoLm1heCgwLChlLTEyKSkrInB4 In19fSxoaWRlOmZ1bmN0aW9uKCl7aWYodGhpcy5lbCl7dGhpcy5lbC5kb20uc3R5 bGUuZGlzcGxheT0ibm9uZSI7RXh0LlNoYWRvdy5Qb29sLnB1c2godGhpcy5lbCk7 ZGVsZXRlIHRoaXMuZWx9fSxzZXRaSW5kZXg6ZnVuY3Rpb24oYSl7dGhpcy56SW5k ZXg9YTtpZih0aGlzLmVsKXt0aGlzLmVsLnNldFN0eWxlKCJ6LWluZGV4IixhKX19 fTtFeHQuU2hhZG93LlBvb2w9ZnVuY3Rpb24oKXt2YXIgYj1bXSxhPUV4dC5pc0lF Pyc8ZGl2IGNsYXNzPSJ4LWllLXNoYWRvdyI+PC9kaXY+JzonPGRpdiBjbGFzcz0i eC1zaGFkb3ciPjxkaXYgY2xhc3M9InhzdCI+PGRpdiBjbGFzcz0ieHN0bCI+PC9k aXY+PGRpdiBjbGFzcz0ieHN0YyI+PC9kaXY+PGRpdiBjbGFzcz0ieHN0ciI+PC9k aXY+PC9kaXY+PGRpdiBjbGFzcz0ieHNjIj48ZGl2IGNsYXNzPSJ4c21sIj48L2Rp dj48ZGl2IGNsYXNzPSJ4c21jIj48L2Rpdj48ZGl2IGNsYXNzPSJ4c21yIj48L2Rp dj48L2Rpdj48ZGl2IGNsYXNzPSJ4c2IiPjxkaXYgY2xhc3M9InhzYmwiPjwvZGl2 PjxkaXYgY2xhc3M9InhzYmMiPjwvZGl2PjxkaXYgY2xhc3M9InhzYnIiPjwvZGl2 PjwvZGl2PjwvZGl2Pic7cmV0dXJue3B1bGw6ZnVuY3Rpb24oKXt2YXIgYz1iLnNo aWZ0KCk7aWYoIWMpe2M9RXh0LmdldChFeHQuRG9tSGVscGVyLmluc2VydEh0bWwo ImJlZm9yZUJlZ2luIixkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQsYSkpO2MuYXV0 b0JveEFkanVzdD1mYWxzZX1yZXR1cm4gY30scHVzaDpmdW5jdGlvbihjKXtiLnB1 c2goYyl9fX0oKTtFeHQuQm94Q29tcG9uZW50PUV4dC5leHRlbmQoRXh0LkNvbXBv bmVudCx7aW5pdENvbXBvbmVudDpmdW5jdGlvbigpe0V4dC5Cb3hDb21wb25lbnQu c3VwZXJjbGFzcy5pbml0Q29tcG9uZW50LmNhbGwodGhpcyk7dGhpcy5hZGRFdmVu dHMoInJlc2l6ZSIsIm1vdmUiKX0sYm94UmVhZHk6ZmFsc2UsZGVmZXJIZWlnaHQ6 ZmFsc2Usc2V0U2l6ZTpmdW5jdGlvbihiLGQpe2lmKHR5cGVvZiBiPT0ib2JqZWN0 Iil7ZD1iLmhlaWdodDtiPWIud2lkdGh9aWYoRXh0LmlzRGVmaW5lZChiKSYmRXh0 LmlzRGVmaW5lZCh0aGlzLmJveE1pbldpZHRoKSYmKGI8dGhpcy5ib3hNaW5XaWR0 aCkpe2I9dGhpcy5ib3hNaW5XaWR0aH1pZihFeHQuaXNEZWZpbmVkKGQpJiZFeHQu aXNEZWZpbmVkKHRoaXMuYm94TWluSGVpZ2h0KSYmKGQ8dGhpcy5ib3hNaW5IZWln aHQpKXtkPXRoaXMuYm94TWluSGVpZ2h0fWlmKEV4dC5pc0RlZmluZWQoYikmJkV4 dC5pc0RlZmluZWQodGhpcy5ib3hNYXhXaWR0aCkmJihiPnRoaXMuYm94TWF4V2lk dGgpKXtiPXRoaXMuYm94TWF4V2lkdGh9aWYoRXh0LmlzRGVmaW5lZChkKSYmRXh0 LmlzRGVmaW5lZCh0aGlzLmJveE1heEhlaWdodCkmJihkPnRoaXMuYm94TWF4SGVp Z2h0KSl7ZD10aGlzLmJveE1heEhlaWdodH1pZighdGhpcy5ib3hSZWFkeSl7dGhp cy53aWR0aD1iO3RoaXMuaGVpZ2h0PWQ7cmV0dXJuIHRoaXN9aWYodGhpcy5jYWNo ZVNpemVzIT09ZmFsc2UmJnRoaXMubGFzdFNpemUmJnRoaXMubGFzdFNpemUud2lk dGg9PWImJnRoaXMubGFzdFNpemUuaGVpZ2h0PT1kKXtyZXR1cm4gdGhpc310aGlz Lmxhc3RTaXplPXt3aWR0aDpiLGhlaWdodDpkfTt2YXIgYz10aGlzLmFkanVzdFNp emUoYixkKSxnPWMud2lkdGgsYT1jLmhlaWdodCxlO2lmKGchPT11bmRlZmluZWR8 fGEhPT11bmRlZmluZWQpe2U9dGhpcy5nZXRSZXNpemVFbCgpO2lmKCF0aGlzLmRl ZmVySGVpZ2h0JiZnIT09dW5kZWZpbmVkJiZhIT09dW5kZWZpbmVkKXtlLnNldFNp emUoZyxhKX1lbHNle2lmKCF0aGlzLmRlZmVySGVpZ2h0JiZhIT09dW5kZWZpbmVk KXtlLnNldEhlaWdodChhKX1lbHNle2lmKGchPT11bmRlZmluZWQpe2Uuc2V0V2lk dGgoZyl9fX10aGlzLm9uUmVzaXplKGcsYSxiLGQpO3RoaXMuZmlyZUV2ZW50KCJy ZXNpemUiLHRoaXMsZyxhLGIsZCl9cmV0dXJuIHRoaXN9LHNldFdpZHRoOmZ1bmN0 aW9uKGEpe3JldHVybiB0aGlzLnNldFNpemUoYSl9LHNldEhlaWdodDpmdW5jdGlv bihhKXtyZXR1cm4gdGhpcy5zZXRTaXplKHVuZGVmaW5lZCxhKX0sZ2V0U2l6ZTpm dW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJlc2l6ZUVsKCkuZ2V0U2l6ZSgpfSxn ZXRXaWR0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJlc2l6ZUVsKCkuZ2V0 V2lkdGgoKX0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmVz aXplRWwoKS5nZXRIZWlnaHQoKX0sZ2V0T3V0ZXJTaXplOmZ1bmN0aW9uKCl7dmFy IGE9dGhpcy5nZXRSZXNpemVFbCgpO3JldHVybnt3aWR0aDphLmdldFdpZHRoKCkr YS5nZXRNYXJnaW5zKCJsciIpLGhlaWdodDphLmdldEhlaWdodCgpK2EuZ2V0TWFy Z2lucygidGIiKX19LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMu Z2V0UG9zaXRpb25FbCgpO2lmKGE9PT10cnVlKXtyZXR1cm5bYi5nZXRMZWZ0KHRy dWUpLGIuZ2V0VG9wKHRydWUpXX1yZXR1cm4gdGhpcy54eXx8Yi5nZXRYWSgpfSxn ZXRCb3g6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXRQb3NpdGlvbihhKTt2YXIg Yj10aGlzLmdldFNpemUoKTtiLng9Y1swXTtiLnk9Y1sxXTtyZXR1cm4gYn0sdXBk YXRlQm94OmZ1bmN0aW9uKGEpe3RoaXMuc2V0U2l6ZShhLndpZHRoLGEuaGVpZ2h0 KTt0aGlzLnNldFBhZ2VQb3NpdGlvbihhLngsYS55KTtyZXR1cm4gdGhpc30sZ2V0 UmVzaXplRWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXNpemVFbHx8dGhpcy5l bH0sc2V0QXV0b1Njcm9sbDpmdW5jdGlvbihhKXtpZih0aGlzLnJlbmRlcmVkKXt0 aGlzLmdldENvbnRlbnRUYXJnZXQoKS5zZXRPdmVyZmxvdyhhPyJhdXRvIjoiIil9 dGhpcy5hdXRvU2Nyb2xsPWE7cmV0dXJuIHRoaXN9LHNldFBvc2l0aW9uOmZ1bmN0 aW9uKGEsZyl7aWYoYSYmdHlwZW9mIGFbMV09PSJudW1iZXIiKXtnPWFbMV07YT1h WzBdfXRoaXMueD1hO3RoaXMueT1nO2lmKCF0aGlzLmJveFJlYWR5KXtyZXR1cm4g dGhpc312YXIgYj10aGlzLmFkanVzdFBvc2l0aW9uKGEsZyk7dmFyIGU9Yi54LGQ9 Yi55O3ZhciBjPXRoaXMuZ2V0UG9zaXRpb25FbCgpO2lmKGUhPT11bmRlZmluZWR8 fGQhPT11bmRlZmluZWQpe2lmKGUhPT11bmRlZmluZWQmJmQhPT11bmRlZmluZWQp e2Muc2V0TGVmdFRvcChlLGQpfWVsc2V7aWYoZSE9PXVuZGVmaW5lZCl7Yy5zZXRM ZWZ0KGUpfWVsc2V7aWYoZCE9PXVuZGVmaW5lZCl7Yy5zZXRUb3AoZCl9fX10aGlz Lm9uUG9zaXRpb24oZSxkKTt0aGlzLmZpcmVFdmVudCgibW92ZSIsdGhpcyxlLGQp fXJldHVybiB0aGlzfSxzZXRQYWdlUG9zaXRpb246ZnVuY3Rpb24oYSxjKXtpZihh JiZ0eXBlb2YgYVsxXT09Im51bWJlciIpe2M9YVsxXTthPWFbMF19dGhpcy5wYWdl WD1hO3RoaXMucGFnZVk9YztpZighdGhpcy5ib3hSZWFkeSl7cmV0dXJufWlmKGE9 PT11bmRlZmluZWR8fGM9PT11bmRlZmluZWQpe3JldHVybn12YXIgYj10aGlzLmdl dFBvc2l0aW9uRWwoKS50cmFuc2xhdGVQb2ludHMoYSxjKTt0aGlzLnNldFBvc2l0 aW9uKGIubGVmdCxiLnRvcCk7cmV0dXJuIHRoaXN9LGFmdGVyUmVuZGVyOmZ1bmN0 aW9uKCl7RXh0LkJveENvbXBvbmVudC5zdXBlcmNsYXNzLmFmdGVyUmVuZGVyLmNh bGwodGhpcyk7aWYodGhpcy5yZXNpemVFbCl7dGhpcy5yZXNpemVFbD1FeHQuZ2V0 KHRoaXMucmVzaXplRWwpfWlmKHRoaXMucG9zaXRpb25FbCl7dGhpcy5wb3NpdGlv bkVsPUV4dC5nZXQodGhpcy5wb3NpdGlvbkVsKX10aGlzLmJveFJlYWR5PXRydWU7 RXh0LmlzRGVmaW5lZCh0aGlzLmF1dG9TY3JvbGwpJiZ0aGlzLnNldEF1dG9TY3Jv bGwodGhpcy5hdXRvU2Nyb2xsKTt0aGlzLnNldFNpemUodGhpcy53aWR0aCx0aGlz LmhlaWdodCk7aWYodGhpcy54fHx0aGlzLnkpe3RoaXMuc2V0UG9zaXRpb24odGhp cy54LHRoaXMueSl9ZWxzZXtpZih0aGlzLnBhZ2VYfHx0aGlzLnBhZ2VZKXt0aGlz LnNldFBhZ2VQb3NpdGlvbih0aGlzLnBhZ2VYLHRoaXMucGFnZVkpfX19LHN5bmNT aXplOmZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMubGFzdFNpemU7dGhpcy5zZXRTaXpl KHRoaXMuYXV0b1dpZHRoP3VuZGVmaW5lZDp0aGlzLmdldFJlc2l6ZUVsKCkuZ2V0 V2lkdGgoKSx0aGlzLmF1dG9IZWlnaHQ/dW5kZWZpbmVkOnRoaXMuZ2V0UmVzaXpl RWwoKS5nZXRIZWlnaHQoKSk7cmV0dXJuIHRoaXN9LG9uUmVzaXplOmZ1bmN0aW9u KGQsYixhLGMpe30sb25Qb3NpdGlvbjpmdW5jdGlvbihhLGIpe30sYWRqdXN0U2l6 ZTpmdW5jdGlvbihhLGIpe2lmKHRoaXMuYXV0b1dpZHRoKXthPSJhdXRvIn1pZih0 aGlzLmF1dG9IZWlnaHQpe2I9ImF1dG8ifXJldHVybnt3aWR0aDphLGhlaWdodDpi fX0sYWRqdXN0UG9zaXRpb246ZnVuY3Rpb24oYSxiKXtyZXR1cm57eDphLHk6Yn19 fSk7RXh0LnJlZygiYm94IixFeHQuQm94Q29tcG9uZW50KTtFeHQuU3BhY2VyPUV4 dC5leHRlbmQoRXh0LkJveENvbXBvbmVudCx7YXV0b0VsOiJkaXYifSk7RXh0LnJl Zygic3BhY2VyIixFeHQuU3BhY2VyKTtFeHQuU3BsaXRCYXI9ZnVuY3Rpb24oYyxl LGIsZCxhKXt0aGlzLmVsPUV4dC5nZXQoYyx0cnVlKTt0aGlzLmVsLmRvbS51bnNl bGVjdGFibGU9Im9uIjt0aGlzLnJlc2l6aW5nRWw9RXh0LmdldChlLHRydWUpO3Ro aXMub3JpZW50YXRpb249Ynx8RXh0LlNwbGl0QmFyLkhPUklaT05UQUw7dGhpcy5t aW5TaXplPTA7dGhpcy5tYXhTaXplPTIwMDA7dGhpcy5hbmltYXRlPWZhbHNlO3Ro aXMudXNlU2hpbT1mYWxzZTt0aGlzLnNoaW09bnVsbDtpZighYSl7dGhpcy5wcm94 eT1FeHQuU3BsaXRCYXIuY3JlYXRlUHJveHkodGhpcy5vcmllbnRhdGlvbil9ZWxz ZXt0aGlzLnByb3h5PUV4dC5nZXQoYSkuZG9tfXRoaXMuZGQ9bmV3IEV4dC5kZC5E RFByb3h5KHRoaXMuZWwuZG9tLmlkLCJYU3BsaXRCYXJzIix7ZHJhZ0VsSWQ6dGhp cy5wcm94eS5pZH0pO3RoaXMuZGQuYjRTdGFydERyYWc9dGhpcy5vblN0YXJ0UHJv eHlEcmFnLmNyZWF0ZURlbGVnYXRlKHRoaXMpO3RoaXMuZGQuZW5kRHJhZz10aGlz Lm9uRW5kUHJveHlEcmFnLmNyZWF0ZURlbGVnYXRlKHRoaXMpO3RoaXMuZHJhZ1Nw ZWNzPXt9O3RoaXMuYWRhcHRlcj1uZXcgRXh0LlNwbGl0QmFyLkJhc2ljTGF5b3V0 QWRhcHRlcigpO3RoaXMuYWRhcHRlci5pbml0KHRoaXMpO2lmKHRoaXMub3JpZW50 YXRpb249PUV4dC5TcGxpdEJhci5IT1JJWk9OVEFMKXt0aGlzLnBsYWNlbWVudD1k fHwodGhpcy5lbC5nZXRYKCk+dGhpcy5yZXNpemluZ0VsLmdldFgoKT9FeHQuU3Bs aXRCYXIuTEVGVDpFeHQuU3BsaXRCYXIuUklHSFQpO3RoaXMuZWwuYWRkQ2xhc3Mo Ingtc3BsaXRiYXItaCIpfWVsc2V7dGhpcy5wbGFjZW1lbnQ9ZHx8KHRoaXMuZWwu Z2V0WSgpPnRoaXMucmVzaXppbmdFbC5nZXRZKCk/RXh0LlNwbGl0QmFyLlRPUDpF eHQuU3BsaXRCYXIuQk9UVE9NKTt0aGlzLmVsLmFkZENsYXNzKCJ4LXNwbGl0YmFy LXYiKX10aGlzLmFkZEV2ZW50cygicmVzaXplIiwibW92ZWQiLCJiZWZvcmVyZXNp emUiLCJiZWZvcmVhcHBseSIpO0V4dC5TcGxpdEJhci5zdXBlcmNsYXNzLmNvbnN0 cnVjdG9yLmNhbGwodGhpcyl9O0V4dC5leHRlbmQoRXh0LlNwbGl0QmFyLEV4dC51 dGlsLk9ic2VydmFibGUse29uU3RhcnRQcm94eURyYWc6ZnVuY3Rpb24oYSxlKXt0 aGlzLmZpcmVFdmVudCgiYmVmb3JlcmVzaXplIix0aGlzKTt0aGlzLm92ZXJsYXk9 RXh0LkRvbUhlbHBlci5hcHBlbmQoZG9jdW1lbnQuYm9keSx7Y2xzOiJ4LWRyYWct b3ZlcmxheSIsaHRtbDoiJiMxNjA7In0sdHJ1ZSk7dGhpcy5vdmVybGF5LnVuc2Vs ZWN0YWJsZSgpO3RoaXMub3ZlcmxheS5zZXRTaXplKEV4dC5saWIuRG9tLmdldFZp ZXdXaWR0aCh0cnVlKSxFeHQubGliLkRvbS5nZXRWaWV3SGVpZ2h0KHRydWUpKTt0 aGlzLm92ZXJsYXkuc2hvdygpO0V4dC5nZXQodGhpcy5wcm94eSkuc2V0RGlzcGxh eWVkKCJibG9jayIpO3ZhciBjPXRoaXMuYWRhcHRlci5nZXRFbGVtZW50U2l6ZSh0 aGlzKTt0aGlzLmFjdGl2ZU1pblNpemU9dGhpcy5nZXRNaW5pbXVtU2l6ZSgpO3Ro aXMuYWN0aXZlTWF4U2l6ZT10aGlzLmdldE1heGltdW1TaXplKCk7dmFyIGQ9Yy10 aGlzLmFjdGl2ZU1pblNpemU7dmFyIGI9TWF0aC5tYXgodGhpcy5hY3RpdmVNYXhT aXplLWMsMCk7aWYodGhpcy5vcmllbnRhdGlvbj09RXh0LlNwbGl0QmFyLkhPUkla T05UQUwpe3RoaXMuZGQucmVzZXRDb25zdHJhaW50cygpO3RoaXMuZGQuc2V0WENv bnN0cmFpbnQodGhpcy5wbGFjZW1lbnQ9PUV4dC5TcGxpdEJhci5MRUZUP2Q6Yix0 aGlzLnBsYWNlbWVudD09RXh0LlNwbGl0QmFyLkxFRlQ/YjpkLHRoaXMudGlja1Np emUpO3RoaXMuZGQuc2V0WUNvbnN0cmFpbnQoMCwwKX1lbHNle3RoaXMuZGQucmVz ZXRDb25zdHJhaW50cygpO3RoaXMuZGQuc2V0WENvbnN0cmFpbnQoMCwwKTt0aGlz LmRkLnNldFlDb25zdHJhaW50KHRoaXMucGxhY2VtZW50PT1FeHQuU3BsaXRCYXIu VE9QP2Q6Yix0aGlzLnBsYWNlbWVudD09RXh0LlNwbGl0QmFyLlRPUD9iOmQsdGhp cy50aWNrU2l6ZSl9dGhpcy5kcmFnU3BlY3Muc3RhcnRTaXplPWM7dGhpcy5kcmFn U3BlY3Muc3RhcnRQb2ludD1bYSxlXTtFeHQuZGQuRERQcm94eS5wcm90b3R5cGUu YjRTdGFydERyYWcuY2FsbCh0aGlzLmRkLGEsZSl9LG9uRW5kUHJveHlEcmFnOmZ1 bmN0aW9uKGMpe0V4dC5nZXQodGhpcy5wcm94eSkuc2V0RGlzcGxheWVkKGZhbHNl KTt2YXIgYj1FeHQubGliLkV2ZW50LmdldFhZKGMpO2lmKHRoaXMub3ZlcmxheSl7 RXh0LmRlc3Ryb3kodGhpcy5vdmVybGF5KTtkZWxldGUgdGhpcy5vdmVybGF5fXZh ciBhO2lmKHRoaXMub3JpZW50YXRpb249PUV4dC5TcGxpdEJhci5IT1JJWk9OVEFM KXthPXRoaXMuZHJhZ1NwZWNzLnN0YXJ0U2l6ZSsodGhpcy5wbGFjZW1lbnQ9PUV4 dC5TcGxpdEJhci5MRUZUP2JbMF0tdGhpcy5kcmFnU3BlY3Muc3RhcnRQb2ludFsw XTp0aGlzLmRyYWdTcGVjcy5zdGFydFBvaW50WzBdLWJbMF0pfWVsc2V7YT10aGlz LmRyYWdTcGVjcy5zdGFydFNpemUrKHRoaXMucGxhY2VtZW50PT1FeHQuU3BsaXRC YXIuVE9QP2JbMV0tdGhpcy5kcmFnU3BlY3Muc3RhcnRQb2ludFsxXTp0aGlzLmRy YWdTcGVjcy5zdGFydFBvaW50WzFdLWJbMV0pfWE9TWF0aC5taW4oTWF0aC5tYXgo YSx0aGlzLmFjdGl2ZU1pblNpemUpLHRoaXMuYWN0aXZlTWF4U2l6ZSk7aWYoYSE9 dGhpcy5kcmFnU3BlY3Muc3RhcnRTaXplKXtpZih0aGlzLmZpcmVFdmVudCgiYmVm b3JlYXBwbHkiLHRoaXMsYSkhPT1mYWxzZSl7dGhpcy5hZGFwdGVyLnNldEVsZW1l bnRTaXplKHRoaXMsYSk7dGhpcy5maXJlRXZlbnQoIm1vdmVkIix0aGlzLGEpO3Ro aXMuZmlyZUV2ZW50KCJyZXNpemUiLHRoaXMsYSl9fX0sZ2V0QWRhcHRlcjpmdW5j dGlvbigpe3JldHVybiB0aGlzLmFkYXB0ZXJ9LHNldEFkYXB0ZXI6ZnVuY3Rpb24o YSl7dGhpcy5hZGFwdGVyPWE7dGhpcy5hZGFwdGVyLmluaXQodGhpcyl9LGdldE1p bmltdW1TaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWluU2l6ZX0sc2V0TWlu aW11bVNpemU6ZnVuY3Rpb24oYSl7dGhpcy5taW5TaXplPWF9LGdldE1heGltdW1T aXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF4U2l6ZX0sc2V0TWF4aW11bVNp emU6ZnVuY3Rpb24oYSl7dGhpcy5tYXhTaXplPWF9LHNldEN1cnJlbnRTaXplOmZ1 bmN0aW9uKGIpe3ZhciBhPXRoaXMuYW5pbWF0ZTt0aGlzLmFuaW1hdGU9ZmFsc2U7 dGhpcy5hZGFwdGVyLnNldEVsZW1lbnRTaXplKHRoaXMsYik7dGhpcy5hbmltYXRl PWF9LGRlc3Ryb3k6ZnVuY3Rpb24oYSl7RXh0LmRlc3Ryb3kodGhpcy5zaGltLEV4 dC5nZXQodGhpcy5wcm94eSkpO3RoaXMuZGQudW5yZWcoKTtpZihhKXt0aGlzLmVs LnJlbW92ZSgpfXRoaXMucHVyZ2VMaXN0ZW5lcnMoKX19KTtFeHQuU3BsaXRCYXIu Y3JlYXRlUHJveHk9ZnVuY3Rpb24oYil7dmFyIGM9bmV3IEV4dC5FbGVtZW50KGRv Y3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTtkb2N1bWVudC5ib2R5LmFwcGVu ZENoaWxkKGMuZG9tKTtjLnVuc2VsZWN0YWJsZSgpO3ZhciBhPSJ4LXNwbGl0YmFy LXByb3h5IjtjLmFkZENsYXNzKGErIiAiKyhiPT1FeHQuU3BsaXRCYXIuSE9SSVpP TlRBTD9hKyItaCI6YSsiLXYiKSk7cmV0dXJuIGMuZG9tfTtFeHQuU3BsaXRCYXIu QmFzaWNMYXlvdXRBZGFwdGVyPWZ1bmN0aW9uKCl7fTtFeHQuU3BsaXRCYXIuQmFz aWNMYXlvdXRBZGFwdGVyLnByb3RvdHlwZT17aW5pdDpmdW5jdGlvbihhKXt9LGdl dEVsZW1lbnRTaXplOmZ1bmN0aW9uKGEpe2lmKGEub3JpZW50YXRpb249PUV4dC5T cGxpdEJhci5IT1JJWk9OVEFMKXtyZXR1cm4gYS5yZXNpemluZ0VsLmdldFdpZHRo KCl9ZWxzZXtyZXR1cm4gYS5yZXNpemluZ0VsLmdldEhlaWdodCgpfX0sc2V0RWxl bWVudFNpemU6ZnVuY3Rpb24oYixhLGMpe2lmKGIub3JpZW50YXRpb249PUV4dC5T cGxpdEJhci5IT1JJWk9OVEFMKXtpZighYi5hbmltYXRlKXtiLnJlc2l6aW5nRWwu c2V0V2lkdGgoYSk7aWYoYyl7YyhiLGEpfX1lbHNle2IucmVzaXppbmdFbC5zZXRX aWR0aChhLHRydWUsMC4xLGMsImVhc2VPdXQiKX19ZWxzZXtpZighYi5hbmltYXRl KXtiLnJlc2l6aW5nRWwuc2V0SGVpZ2h0KGEpO2lmKGMpe2MoYixhKX19ZWxzZXti LnJlc2l6aW5nRWwuc2V0SGVpZ2h0KGEsdHJ1ZSwwLjEsYywiZWFzZU91dCIpfX19 fTtFeHQuU3BsaXRCYXIuQWJzb2x1dGVMYXlvdXRBZGFwdGVyPWZ1bmN0aW9uKGEp e3RoaXMuYmFzaWM9bmV3IEV4dC5TcGxpdEJhci5CYXNpY0xheW91dEFkYXB0ZXIo KTt0aGlzLmNvbnRhaW5lcj1FeHQuZ2V0KGEpfTtFeHQuU3BsaXRCYXIuQWJzb2x1 dGVMYXlvdXRBZGFwdGVyLnByb3RvdHlwZT17aW5pdDpmdW5jdGlvbihhKXt0aGlz LmJhc2ljLmluaXQoYSl9LGdldEVsZW1lbnRTaXplOmZ1bmN0aW9uKGEpe3JldHVy biB0aGlzLmJhc2ljLmdldEVsZW1lbnRTaXplKGEpfSxzZXRFbGVtZW50U2l6ZTpm dW5jdGlvbihiLGEsYyl7dGhpcy5iYXNpYy5zZXRFbGVtZW50U2l6ZShiLGEsdGhp cy5tb3ZlU3BsaXR0ZXIuY3JlYXRlRGVsZWdhdGUodGhpcyxbYl0pKX0sbW92ZVNw bGl0dGVyOmZ1bmN0aW9uKGEpe3ZhciBiPUV4dC5TcGxpdEJhcjtzd2l0Y2goYS5w bGFjZW1lbnQpe2Nhc2UgYi5MRUZUOmEuZWwuc2V0WChhLnJlc2l6aW5nRWwuZ2V0 UmlnaHQoKSk7YnJlYWs7Y2FzZSBiLlJJR0hUOmEuZWwuc2V0U3R5bGUoInJpZ2h0 IiwodGhpcy5jb250YWluZXIuZ2V0V2lkdGgoKS1hLnJlc2l6aW5nRWwuZ2V0TGVm dCgpKSsicHgiKTticmVhaztjYXNlIGIuVE9QOmEuZWwuc2V0WShhLnJlc2l6aW5n RWwuZ2V0Qm90dG9tKCkpO2JyZWFrO2Nhc2UgYi5CT1RUT006YS5lbC5zZXRZKGEu cmVzaXppbmdFbC5nZXRUb3AoKS1hLmVsLmdldEhlaWdodCgpKTticmVha319fTtF eHQuU3BsaXRCYXIuVkVSVElDQUw9MTtFeHQuU3BsaXRCYXIuSE9SSVpPTlRBTD0y O0V4dC5TcGxpdEJhci5MRUZUPTE7RXh0LlNwbGl0QmFyLlJJR0hUPTI7RXh0LlNw bGl0QmFyLlRPUD0zO0V4dC5TcGxpdEJhci5CT1RUT009NDtFeHQuQ29udGFpbmVy PUV4dC5leHRlbmQoRXh0LkJveENvbXBvbmVudCx7YnVmZmVyUmVzaXplOjUwLGF1 dG9EZXN0cm95OnRydWUsZm9yY2VMYXlvdXQ6ZmFsc2UsZGVmYXVsdFR5cGU6InBh bmVsIixyZXNpemVFdmVudDoicmVzaXplIixidWJibGVFdmVudHM6WyJhZGQiLCJy ZW1vdmUiXSxpbml0Q29tcG9uZW50OmZ1bmN0aW9uKCl7RXh0LkNvbnRhaW5lci5z dXBlcmNsYXNzLmluaXRDb21wb25lbnQuY2FsbCh0aGlzKTt0aGlzLmFkZEV2ZW50 cygiYWZ0ZXJsYXlvdXQiLCJiZWZvcmVhZGQiLCJiZWZvcmVyZW1vdmUiLCJhZGQi LCJyZW1vdmUiKTt2YXIgYT10aGlzLml0ZW1zO2lmKGEpe2RlbGV0ZSB0aGlzLml0 ZW1zO3RoaXMuYWRkKGEpfX0saW5pdEl0ZW1zOmZ1bmN0aW9uKCl7aWYoIXRoaXMu aXRlbXMpe3RoaXMuaXRlbXM9bmV3IEV4dC51dGlsLk1peGVkQ29sbGVjdGlvbihm YWxzZSx0aGlzLmdldENvbXBvbmVudElkKTt0aGlzLmdldExheW91dCgpfX0sc2V0 TGF5b3V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMubGF5b3V0JiZ0aGlzLmxheW91dCE9 YSl7dGhpcy5sYXlvdXQuc2V0Q29udGFpbmVyKG51bGwpfXRoaXMubGF5b3V0PWE7 dGhpcy5pbml0SXRlbXMoKTthLnNldENvbnRhaW5lcih0aGlzKX0sYWZ0ZXJSZW5k ZXI6ZnVuY3Rpb24oKXtFeHQuQ29udGFpbmVyLnN1cGVyY2xhc3MuYWZ0ZXJSZW5k ZXIuY2FsbCh0aGlzKTtpZighdGhpcy5sYXlvdXQpe3RoaXMubGF5b3V0PSJhdXRv In1pZihFeHQuaXNPYmplY3QodGhpcy5sYXlvdXQpJiYhdGhpcy5sYXlvdXQubGF5 b3V0KXt0aGlzLmxheW91dENvbmZpZz10aGlzLmxheW91dDt0aGlzLmxheW91dD10 aGlzLmxheW91dENvbmZpZy50eXBlfWlmKEV4dC5pc1N0cmluZyh0aGlzLmxheW91 dCkpe3RoaXMubGF5b3V0PW5ldyBFeHQuQ29udGFpbmVyLkxBWU9VVFNbdGhpcy5s YXlvdXQudG9Mb3dlckNhc2UoKV0odGhpcy5sYXlvdXRDb25maWcpfXRoaXMuc2V0 TGF5b3V0KHRoaXMubGF5b3V0KTtpZih0aGlzLmFjdGl2ZUl0ZW0hPT11bmRlZmlu ZWQmJnRoaXMubGF5b3V0LnNldEFjdGl2ZUl0ZW0pe3ZhciBhPXRoaXMuYWN0aXZl SXRlbTtkZWxldGUgdGhpcy5hY3RpdmVJdGVtO3RoaXMubGF5b3V0LnNldEFjdGl2 ZUl0ZW0oYSl9aWYoIXRoaXMub3duZXJDdCl7dGhpcy5kb0xheW91dChmYWxzZSx0 cnVlKX1pZih0aGlzLm1vbml0b3JSZXNpemU9PT10cnVlKXtFeHQuRXZlbnRNYW5h Z2VyLm9uV2luZG93UmVzaXplKHRoaXMuZG9MYXlvdXQsdGhpcyxbZmFsc2VdKX19 LGdldExheW91dFRhcmdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsfSxnZXRD b21wb25lbnRJZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRJdGVtSWQoKX0sYWRk OmZ1bmN0aW9uKGIpe3RoaXMuaW5pdEl0ZW1zKCk7dmFyIGU9YXJndW1lbnRzLmxl bmd0aD4xO2lmKGV8fEV4dC5pc0FycmF5KGIpKXt2YXIgYT1bXTtFeHQuZWFjaChl P2FyZ3VtZW50czpiLGZ1bmN0aW9uKGgpe2EucHVzaCh0aGlzLmFkZChoKSl9LHRo aXMpO3JldHVybiBhfXZhciBnPXRoaXMubG9va3VwQ29tcG9uZW50KHRoaXMuYXBw bHlEZWZhdWx0cyhiKSk7dmFyIGQ9dGhpcy5pdGVtcy5sZW5ndGg7aWYodGhpcy5m aXJlRXZlbnQoImJlZm9yZWFkZCIsdGhpcyxnLGQpIT09ZmFsc2UmJnRoaXMub25C ZWZvcmVBZGQoZykhPT1mYWxzZSl7dGhpcy5pdGVtcy5hZGQoZyk7Zy5vbkFkZGVk KHRoaXMsZCk7dGhpcy5vbkFkZChnKTt0aGlzLmZpcmVFdmVudCgiYWRkIix0aGlz LGcsZCl9cmV0dXJuIGd9LG9uQWRkOmZ1bmN0aW9uKGEpe30sb25BZGRlZDpmdW5j dGlvbihhLGIpe3RoaXMub3duZXJDdD1hO3RoaXMuaW5pdFJlZigpO3RoaXMuY2Fz Y2FkZShmdW5jdGlvbihkKXtkLmluaXRSZWYoKX0pO3RoaXMuZmlyZUV2ZW50KCJh ZGRlZCIsdGhpcyxhLGIpfSxpbnNlcnQ6ZnVuY3Rpb24oZSxiKXt2YXIgZD1hcmd1 bWVudHMsaD1kLmxlbmd0aCxhPVtdLGcsajt0aGlzLmluaXRJdGVtcygpO2lmKGg+ Mil7Zm9yKGc9aC0xO2c+PTE7LS1nKXthLnB1c2godGhpcy5pbnNlcnQoZSxkW2dd KSl9cmV0dXJuIGF9aj10aGlzLmxvb2t1cENvbXBvbmVudCh0aGlzLmFwcGx5RGVm YXVsdHMoYikpO2U9TWF0aC5taW4oZSx0aGlzLml0ZW1zLmxlbmd0aCk7aWYodGhp cy5maXJlRXZlbnQoImJlZm9yZWFkZCIsdGhpcyxqLGUpIT09ZmFsc2UmJnRoaXMu b25CZWZvcmVBZGQoaikhPT1mYWxzZSl7aWYoai5vd25lckN0PT10aGlzKXt0aGlz Lml0ZW1zLnJlbW92ZShqKX10aGlzLml0ZW1zLmluc2VydChlLGopO2oub25BZGRl ZCh0aGlzLGUpO3RoaXMub25BZGQoaik7dGhpcy5maXJlRXZlbnQoImFkZCIsdGhp cyxqLGUpfXJldHVybiBqfSxhcHBseURlZmF1bHRzOmZ1bmN0aW9uKGIpe3ZhciBh PXRoaXMuZGVmYXVsdHM7aWYoYSl7aWYoRXh0LmlzRnVuY3Rpb24oYSkpe2E9YS5j YWxsKHRoaXMsYil9aWYoRXh0LmlzU3RyaW5nKGIpKXtiPUV4dC5Db21wb25lbnRN Z3IuZ2V0KGIpO0V4dC5hcHBseShiLGEpfWVsc2V7aWYoIWIuZXZlbnRzKXtFeHQu YXBwbHlJZihiLmlzQWN0aW9uP2IuaW5pdGlhbENvbmZpZzpiLGEpfWVsc2V7RXh0 LmFwcGx5KGIsYSl9fX1yZXR1cm4gYn0sb25CZWZvcmVBZGQ6ZnVuY3Rpb24oYSl7 aWYoYS5vd25lckN0KXthLm93bmVyQ3QucmVtb3ZlKGEsZmFsc2UpfWlmKHRoaXMu aGlkZUJvcmRlcnM9PT10cnVlKXthLmJvcmRlcj0oYS5ib3JkZXI9PT10cnVlKX19 LHJlbW92ZTpmdW5jdGlvbihhLGIpe3RoaXMuaW5pdEl0ZW1zKCk7dmFyIGQ9dGhp cy5nZXRDb21wb25lbnQoYSk7aWYoZCYmdGhpcy5maXJlRXZlbnQoImJlZm9yZXJl bW92ZSIsdGhpcyxkKSE9PWZhbHNlKXt0aGlzLmRvUmVtb3ZlKGQsYik7dGhpcy5m aXJlRXZlbnQoInJlbW92ZSIsdGhpcyxkKX1yZXR1cm4gZH0sb25SZW1vdmU6ZnVu Y3Rpb24oYSl7fSxkb1JlbW92ZTpmdW5jdGlvbihlLGQpe3ZhciBiPXRoaXMubGF5 b3V0LGE9YiYmdGhpcy5yZW5kZXJlZDtpZihhKXtiLm9uUmVtb3ZlKGUpfXRoaXMu aXRlbXMucmVtb3ZlKGUpO2Uub25SZW1vdmVkKCk7dGhpcy5vblJlbW92ZShlKTtp ZihkPT09dHJ1ZXx8KGQhPT1mYWxzZSYmdGhpcy5hdXRvRGVzdHJveSkpe2UuZGVz dHJveSgpfWlmKGEpe2IuYWZ0ZXJSZW1vdmUoZSl9fSxyZW1vdmVBbGw6ZnVuY3Rp b24oYyl7dGhpcy5pbml0SXRlbXMoKTt2YXIgZSxnPVtdLGI9W107dGhpcy5pdGVt cy5lYWNoKGZ1bmN0aW9uKGgpe2cucHVzaChoKX0pO2Zvcih2YXIgZD0wLGE9Zy5s ZW5ndGg7ZDxhOysrZCl7ZT1nW2RdO3RoaXMucmVtb3ZlKGUsYyk7aWYoZS5vd25l ckN0IT09dGhpcyl7Yi5wdXNoKGUpfX1yZXR1cm4gYn0sZ2V0Q29tcG9uZW50OmZ1 bmN0aW9uKGEpe2lmKEV4dC5pc09iamVjdChhKSl7YT1hLmdldEl0ZW1JZCgpfXJl dHVybiB0aGlzLml0ZW1zLmdldChhKX0sbG9va3VwQ29tcG9uZW50OmZ1bmN0aW9u KGEpe2lmKEV4dC5pc1N0cmluZyhhKSl7cmV0dXJuIEV4dC5Db21wb25lbnRNZ3Iu Z2V0KGEpfWVsc2V7aWYoIWEuZXZlbnRzKXtyZXR1cm4gdGhpcy5jcmVhdGVDb21w b25lbnQoYSl9fXJldHVybiBhfSxjcmVhdGVDb21wb25lbnQ6ZnVuY3Rpb24oYSxk KXtpZihhLnJlbmRlcil7cmV0dXJuIGF9dmFyIGI9RXh0LmNyZWF0ZShFeHQuYXBw bHkoe293bmVyQ3Q6dGhpc30sYSksZHx8dGhpcy5kZWZhdWx0VHlwZSk7ZGVsZXRl IGIuaW5pdGlhbENvbmZpZy5vd25lckN0O2RlbGV0ZSBiLm93bmVyQ3Q7cmV0dXJu IGJ9LGNhbkxheW91dDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0VmlzaWJpbGl0 eUVsKCk7cmV0dXJuIGEmJmEuZG9tJiYhYS5pc1N0eWxlKCJkaXNwbGF5Iiwibm9u ZSIpfSxkb0xheW91dDpmdW5jdGlvbihnLGUpe3ZhciBrPXRoaXMucmVuZGVyZWQs aj1lfHx0aGlzLmZvcmNlTGF5b3V0O2lmKHRoaXMuY29sbGFwc2VkfHwhdGhpcy5j YW5MYXlvdXQoKSl7dGhpcy5kZWZlckxheW91dD10aGlzLmRlZmVyTGF5b3V0fHwh ZztpZighail7cmV0dXJufWc9ZyYmIXRoaXMuZGVmZXJMYXlvdXR9ZWxzZXtkZWxl dGUgdGhpcy5kZWZlckxheW91dH1pZihrJiZ0aGlzLmxheW91dCl7dGhpcy5sYXlv dXQubGF5b3V0KCl9aWYoZyE9PXRydWUmJnRoaXMuaXRlbXMpe3ZhciBkPXRoaXMu aXRlbXMuaXRlbXM7Zm9yKHZhciBiPTAsYT1kLmxlbmd0aDtiPGE7YisrKXt2YXIg aD1kW2JdO2lmKGguZG9MYXlvdXQpe2guZG9MYXlvdXQoZmFsc2Usail9fX1pZihr KXt0aGlzLm9uTGF5b3V0KGcsail9dGhpcy5oYXNMYXlvdXQ9dHJ1ZTtkZWxldGUg dGhpcy5mb3JjZUxheW91dH0sb25MYXlvdXQ6RXh0LmVtcHR5Rm4sc2hvdWxkQnVm ZmVyTGF5b3V0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5oYXNMYXlvdXQ7aWYodGhp cy5vd25lckN0KXtyZXR1cm4gYT8hdGhpcy5oYXNMYXlvdXRQZW5kaW5nKCk6ZmFs c2V9cmV0dXJuIGF9LGhhc0xheW91dFBlbmRpbmc6ZnVuY3Rpb24oKXt2YXIgYT1m YWxzZTt0aGlzLm93bmVyQ3QuYnViYmxlKGZ1bmN0aW9uKGIpe2lmKGIubGF5b3V0 UGVuZGluZyl7YT10cnVlO3JldHVybiBmYWxzZX19KTtyZXR1cm4gYX0sb25TaG93 OmZ1bmN0aW9uKCl7RXh0LkNvbnRhaW5lci5zdXBlcmNsYXNzLm9uU2hvdy5jYWxs KHRoaXMpO2lmKEV4dC5pc0RlZmluZWQodGhpcy5kZWZlckxheW91dCkpe2RlbGV0 ZSB0aGlzLmRlZmVyTGF5b3V0O3RoaXMuZG9MYXlvdXQodHJ1ZSl9fSxnZXRMYXlv dXQ6ZnVuY3Rpb24oKXtpZighdGhpcy5sYXlvdXQpe3ZhciBhPW5ldyBFeHQubGF5 b3V0LkF1dG9MYXlvdXQodGhpcy5sYXlvdXRDb25maWcpO3RoaXMuc2V0TGF5b3V0 KGEpfXJldHVybiB0aGlzLmxheW91dH0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigp e3ZhciBhO2lmKHRoaXMuaXRlbXMpe3doaWxlKGE9dGhpcy5pdGVtcy5maXJzdCgp KXt0aGlzLmRvUmVtb3ZlKGEsdHJ1ZSl9fWlmKHRoaXMubW9uaXRvclJlc2l6ZSl7 RXh0LkV2ZW50TWFuYWdlci5yZW1vdmVSZXNpemVMaXN0ZW5lcih0aGlzLmRvTGF5 b3V0LHRoaXMpfUV4dC5kZXN0cm95KHRoaXMubGF5b3V0KTtFeHQuQ29udGFpbmVy LnN1cGVyY2xhc3MuYmVmb3JlRGVzdHJveS5jYWxsKHRoaXMpfSxjYXNjYWRlOmZ1 bmN0aW9uKGcsZSxiKXtpZihnLmFwcGx5KGV8fHRoaXMsYnx8W3RoaXNdKSE9PWZh bHNlKXtpZih0aGlzLml0ZW1zKXt2YXIgZD10aGlzLml0ZW1zLml0ZW1zO2Zvcih2 YXIgYz0wLGE9ZC5sZW5ndGg7YzxhO2MrKyl7aWYoZFtjXS5jYXNjYWRlKXtkW2Nd LmNhc2NhZGUoZyxlLGIpfWVsc2V7Zy5hcHBseShlfHxkW2NdLGJ8fFtkW2NdXSl9 fX19cmV0dXJuIHRoaXN9LGZpbmRCeUlkOmZ1bmN0aW9uKGMpe3ZhciBhPW51bGws Yj10aGlzO3RoaXMuY2FzY2FkZShmdW5jdGlvbihkKXtpZihiIT1kJiZkLmlkPT09 Yyl7YT1kO3JldHVybiBmYWxzZX19KTtyZXR1cm4gYX0sZmluZEJ5VHlwZTpmdW5j dGlvbihiLGEpe3JldHVybiB0aGlzLmZpbmRCeShmdW5jdGlvbihkKXtyZXR1cm4g ZC5pc1hUeXBlKGIsYSl9KX0sZmluZDpmdW5jdGlvbihiLGEpe3JldHVybiB0aGlz LmZpbmRCeShmdW5jdGlvbihkKXtyZXR1cm4gZFtiXT09PWF9KX0sZmluZEJ5OmZ1 bmN0aW9uKGQsYyl7dmFyIGE9W10sYj10aGlzO3RoaXMuY2FzY2FkZShmdW5jdGlv bihlKXtpZihiIT1lJiZkLmNhbGwoY3x8ZSxlLGIpPT09dHJ1ZSl7YS5wdXNoKGUp fX0pO3JldHVybiBhfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2V0Q29t cG9uZW50KGEpfX0pO0V4dC5Db250YWluZXIuTEFZT1VUUz17fTtFeHQucmVnKCJj b250YWluZXIiLEV4dC5Db250YWluZXIpO0V4dC5sYXlvdXQuQ29udGFpbmVyTGF5 b3V0PUV4dC5leHRlbmQoT2JqZWN0LHttb25pdG9yUmVzaXplOmZhbHNlLGFjdGl2 ZUl0ZW06bnVsbCxjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLmlkPUV4dC5p ZChudWxsLCJleHQtbGF5b3V0LSIpO0V4dC5hcHBseSh0aGlzLGEpfSx0eXBlOiJj b250YWluZXIiLElFTWVhc3VyZUhhY2s6ZnVuY3Rpb24oayxnKXt2YXIgYT1rLmRv bS5jaGlsZE5vZGVzLGI9YS5sZW5ndGgsbixtPVtdLGwsaCxqO2ZvcihoPTA7aDxi O2grKyl7bj1hW2hdO2w9RXh0LmdldChuKTtpZihsKXttW2hdPWwuZ2V0U3R5bGUo ImRpc3BsYXkiKTtsLnNldFN0eWxlKHtkaXNwbGF5OiJub25lIn0pfX1qPWs/ay5n ZXRWaWV3U2l6ZShnKTp7fTtmb3IoaD0wO2g8YjtoKyspe249YVtoXTtsPUV4dC5n ZXQobik7aWYobCl7bC5zZXRTdHlsZSh7ZGlzcGxheTptW2hdfSl9fXJldHVybiBq fSxnZXRMYXlvdXRUYXJnZXRTaXplOkV4dC5FbXB0eUZuLGxheW91dDpmdW5jdGlv bigpe3ZhciBhPXRoaXMuY29udGFpbmVyLGI9YS5nZXRMYXlvdXRUYXJnZXQoKTtp ZighKHRoaXMuaGFzTGF5b3V0fHxFeHQuaXNFbXB0eSh0aGlzLnRhcmdldENscykp KXtiLmFkZENsYXNzKHRoaXMudGFyZ2V0Q2xzKX10aGlzLm9uTGF5b3V0KGEsYik7 YS5maXJlRXZlbnQoImFmdGVybGF5b3V0IixhLHRoaXMpfSxvbkxheW91dDpmdW5j dGlvbihhLGIpe3RoaXMucmVuZGVyQWxsKGEsYil9LGlzVmFsaWRQYXJlbnQ6ZnVu Y3Rpb24oYixhKXtyZXR1cm4gYSYmYi5nZXRQb3NpdGlvbkVsKCkuZG9tLnBhcmVu dE5vZGU9PShhLmRvbXx8YSl9LHJlbmRlckFsbDpmdW5jdGlvbihlLGcpe3ZhciBi PWUuaXRlbXMuaXRlbXMsZCxoLGE9Yi5sZW5ndGg7Zm9yKGQ9MDtkPGE7ZCsrKXto PWJbZF07aWYoaCYmKCFoLnJlbmRlcmVkfHwhdGhpcy5pc1ZhbGlkUGFyZW50KGgs ZykpKXt0aGlzLnJlbmRlckl0ZW0oaCxkLGcpfX19LHJlbmRlckl0ZW06ZnVuY3Rp b24oZCxhLGIpe2lmKGQpe2lmKCFkLnJlbmRlcmVkKXtkLnJlbmRlcihiLGEpO3Ro aXMuY29uZmlndXJlSXRlbShkKX1lbHNle2lmKCF0aGlzLmlzVmFsaWRQYXJlbnQo ZCxiKSl7aWYoRXh0LmlzTnVtYmVyKGEpKXthPWIuZG9tLmNoaWxkTm9kZXNbYV19 Yi5kb20uaW5zZXJ0QmVmb3JlKGQuZ2V0UG9zaXRpb25FbCgpLmRvbSxhfHxudWxs KTtkLmNvbnRhaW5lcj1iO3RoaXMuY29uZmlndXJlSXRlbShkKX19fX0sZ2V0UmVu ZGVyZWRJdGVtczpmdW5jdGlvbihnKXt2YXIgZT1nLmdldExheW91dFRhcmdldCgp LGg9Zy5pdGVtcy5pdGVtcyxhPWgubGVuZ3RoLGQsaixiPVtdO2ZvcihkPTA7ZDxh O2QrKyl7aWYoKGo9aFtkXSkucmVuZGVyZWQmJnRoaXMuaXNWYWxpZFBhcmVudChq LGUpJiZqLnNob3VsZExheW91dCE9PWZhbHNlKXtiLnB1c2goail9fXJldHVybiBi fSxjb25maWd1cmVJdGVtOmZ1bmN0aW9uKGIpe2lmKHRoaXMuZXh0cmFDbHMpe3Zh ciBhPWIuZ2V0UG9zaXRpb25FbD9iLmdldFBvc2l0aW9uRWwoKTpiO2EuYWRkQ2xh c3ModGhpcy5leHRyYUNscyl9aWYoYi5kb0xheW91dCYmdGhpcy5mb3JjZUxheW91 dCl7Yi5kb0xheW91dCgpfWlmKHRoaXMucmVuZGVySGlkZGVuJiZiIT10aGlzLmFj dGl2ZUl0ZW0pe2IuaGlkZSgpfX0sb25SZW1vdmU6ZnVuY3Rpb24oYil7aWYodGhp cy5hY3RpdmVJdGVtPT1iKXtkZWxldGUgdGhpcy5hY3RpdmVJdGVtfWlmKGIucmVu ZGVyZWQmJnRoaXMuZXh0cmFDbHMpe3ZhciBhPWIuZ2V0UG9zaXRpb25FbD9iLmdl dFBvc2l0aW9uRWwoKTpiO2EucmVtb3ZlQ2xhc3ModGhpcy5leHRyYUNscyl9fSxh ZnRlclJlbW92ZTpmdW5jdGlvbihhKXtpZihhLnJlbW92ZVJlc3RvcmUpe2EucmVt b3ZlTW9kZT0iY29udGFpbmVyIjtkZWxldGUgYS5yZW1vdmVSZXN0b3JlfX0sb25S ZXNpemU6ZnVuY3Rpb24oKXt2YXIgYz10aGlzLmNvbnRhaW5lcixhO2lmKGMuY29s bGFwc2VkKXtyZXR1cm59aWYoYT1jLmJ1ZmZlclJlc2l6ZSYmYy5zaG91bGRCdWZm ZXJMYXlvdXQoKSl7aWYoIXRoaXMucmVzaXplVGFzayl7dGhpcy5yZXNpemVUYXNr PW5ldyBFeHQudXRpbC5EZWxheWVkVGFzayh0aGlzLnJ1bkxheW91dCx0aGlzKTt0 aGlzLnJlc2l6ZUJ1ZmZlcj1FeHQuaXNOdW1iZXIoYSk/YTo1MH1jLmxheW91dFBl bmRpbmc9dHJ1ZTt0aGlzLnJlc2l6ZVRhc2suZGVsYXkodGhpcy5yZXNpemVCdWZm ZXIpfWVsc2V7dGhpcy5ydW5MYXlvdXQoKX19LHJ1bkxheW91dDpmdW5jdGlvbigp e3ZhciBhPXRoaXMuY29udGFpbmVyO3RoaXMubGF5b3V0KCk7YS5vbkxheW91dCgp O2RlbGV0ZSBhLmxheW91dFBlbmRpbmd9LHNldENvbnRhaW5lcjpmdW5jdGlvbihi KXtpZih0aGlzLm1vbml0b3JSZXNpemUmJmIhPXRoaXMuY29udGFpbmVyKXt2YXIg YT10aGlzLmNvbnRhaW5lcjtpZihhKXthLnVuKGEucmVzaXplRXZlbnQsdGhpcy5v blJlc2l6ZSx0aGlzKX1pZihiKXtiLm9uKGIucmVzaXplRXZlbnQsdGhpcy5vblJl c2l6ZSx0aGlzKX19dGhpcy5jb250YWluZXI9Yn0scGFyc2VNYXJnaW5zOmZ1bmN0 aW9uKGIpe2lmKEV4dC5pc051bWJlcihiKSl7Yj1iLnRvU3RyaW5nKCl9dmFyIGM9 Yi5zcGxpdCgiICIpLGE9Yy5sZW5ndGg7aWYoYT09MSl7Y1sxXT1jWzJdPWNbM109 Y1swXX1lbHNle2lmKGE9PTIpe2NbMl09Y1swXTtjWzNdPWNbMV19ZWxzZXtpZihh PT0zKXtjWzNdPWNbMV19fX1yZXR1cm57dG9wOnBhcnNlSW50KGNbMF0sMTApfHww LHJpZ2h0OnBhcnNlSW50KGNbMV0sMTApfHwwLGJvdHRvbTpwYXJzZUludChjWzJd LDEwKXx8MCxsZWZ0OnBhcnNlSW50KGNbM10sMTApfHwwfX0sZmllbGRUcGw6KGZ1 bmN0aW9uKCl7dmFyIGE9bmV3IEV4dC5UZW1wbGF0ZSgnPGRpdiBjbGFzcz0ieC1m b3JtLWl0ZW0ge2l0ZW1DbHN9IiB0YWJJbmRleD0iLTEiPicsJzxsYWJlbCBmb3I9 IntpZH0iIHN0eWxlPSJ7bGFiZWxTdHlsZX0iIGNsYXNzPSJ4LWZvcm0taXRlbS1s YWJlbCI+e2xhYmVsfXtsYWJlbFNlcGFyYXRvcn08L2xhYmVsPicsJzxkaXYgY2xh c3M9IngtZm9ybS1lbGVtZW50IiBpZD0ieC1mb3JtLWVsLXtpZH0iIHN0eWxlPSJ7 ZWxlbWVudFN0eWxlfSI+JywnPC9kaXY+PGRpdiBjbGFzcz0ie2NsZWFyQ2xzfSI+ PC9kaXY+JywiPC9kaXY+Iik7YS5kaXNhYmxlRm9ybWF0cz10cnVlO3JldHVybiBh LmNvbXBpbGUoKX0pKCksZGVzdHJveTpmdW5jdGlvbigpe2lmKHRoaXMucmVzaXpl VGFzayYmdGhpcy5yZXNpemVUYXNrLmNhbmNlbCl7dGhpcy5yZXNpemVUYXNrLmNh bmNlbCgpfWlmKHRoaXMuY29udGFpbmVyKXt0aGlzLmNvbnRhaW5lci51bih0aGlz LmNvbnRhaW5lci5yZXNpemVFdmVudCx0aGlzLm9uUmVzaXplLHRoaXMpfWlmKCFF eHQuaXNFbXB0eSh0aGlzLnRhcmdldENscykpe3ZhciBhPXRoaXMuY29udGFpbmVy LmdldExheW91dFRhcmdldCgpO2lmKGEpe2EucmVtb3ZlQ2xhc3ModGhpcy50YXJn ZXRDbHMpfX19fSk7RXh0LmxheW91dC5BdXRvTGF5b3V0PUV4dC5leHRlbmQoRXh0 LmxheW91dC5Db250YWluZXJMYXlvdXQse3R5cGU6ImF1dG8iLG1vbml0b3JSZXNp emU6dHJ1ZSxvbkxheW91dDpmdW5jdGlvbihkLGcpe0V4dC5sYXlvdXQuQXV0b0xh eW91dC5zdXBlcmNsYXNzLm9uTGF5b3V0LmNhbGwodGhpcyxkLGcpO3ZhciBlPXRo aXMuZ2V0UmVuZGVyZWRJdGVtcyhkKSxhPWUubGVuZ3RoLGIsaDtmb3IoYj0wO2I8 YTtiKyspe2g9ZVtiXTtpZihoLmRvTGF5b3V0KXtoLmRvTGF5b3V0KHRydWUpfX19 fSk7RXh0LkNvbnRhaW5lci5MQVlPVVRTLmF1dG89RXh0LmxheW91dC5BdXRvTGF5 b3V0O0V4dC5sYXlvdXQuRml0TGF5b3V0PUV4dC5leHRlbmQoRXh0LmxheW91dC5D b250YWluZXJMYXlvdXQse21vbml0b3JSZXNpemU6dHJ1ZSx0eXBlOiJmaXQiLGdl dExheW91dFRhcmdldFNpemU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNvbnRhaW5l ci5nZXRMYXlvdXRUYXJnZXQoKTtpZighYSl7cmV0dXJue319cmV0dXJuIGEuZ2V0 U3R5bGVTaXplKCl9LG9uTGF5b3V0OmZ1bmN0aW9uKGEsYil7RXh0LmxheW91dC5G aXRMYXlvdXQuc3VwZXJjbGFzcy5vbkxheW91dC5jYWxsKHRoaXMsYSxiKTtpZigh YS5jb2xsYXBzZWQpe3RoaXMuc2V0SXRlbVNpemUodGhpcy5hY3RpdmVJdGVtfHxh Lml0ZW1zLml0ZW1BdCgwKSx0aGlzLmdldExheW91dFRhcmdldFNpemUoKSl9fSxz ZXRJdGVtU2l6ZTpmdW5jdGlvbihiLGEpe2lmKGImJmEuaGVpZ2h0PjApe2Iuc2V0 U2l6ZShhKX19fSk7RXh0LkNvbnRhaW5lci5MQVlPVVRTLmZpdD1FeHQubGF5b3V0 LkZpdExheW91dDtFeHQubGF5b3V0LkNhcmRMYXlvdXQ9RXh0LmV4dGVuZChFeHQu bGF5b3V0LkZpdExheW91dCx7ZGVmZXJyZWRSZW5kZXI6ZmFsc2UsbGF5b3V0T25D YXJkQ2hhbmdlOmZhbHNlLHJlbmRlckhpZGRlbjp0cnVlLHR5cGU6ImNhcmQiLHNl dEFjdGl2ZUl0ZW06ZnVuY3Rpb24oZCl7dmFyIGE9dGhpcy5hY3RpdmVJdGVtLGI9 dGhpcy5jb250YWluZXI7ZD1iLmdldENvbXBvbmVudChkKTtpZihkJiZhIT1kKXtp ZihhKXthLmhpZGUoKTtpZihhLmhpZGRlbiE9PXRydWUpe3JldHVybiBmYWxzZX1h LmZpcmVFdmVudCgiZGVhY3RpdmF0ZSIsYSl9dmFyIGM9ZC5kb0xheW91dCYmKHRo aXMubGF5b3V0T25DYXJkQ2hhbmdlfHwhZC5yZW5kZXJlZCk7dGhpcy5hY3RpdmVJ dGVtPWQ7ZGVsZXRlIGQuZGVmZXJMYXlvdXQ7ZC5zaG93KCk7dGhpcy5sYXlvdXQo KTtpZihjKXtkLmRvTGF5b3V0KCl9ZC5maXJlRXZlbnQoImFjdGl2YXRlIixkKX19 LHJlbmRlckFsbDpmdW5jdGlvbihhLGIpe2lmKHRoaXMuZGVmZXJyZWRSZW5kZXIp e3RoaXMucmVuZGVySXRlbSh0aGlzLmFjdGl2ZUl0ZW0sdW5kZWZpbmVkLGIpfWVs c2V7RXh0LmxheW91dC5DYXJkTGF5b3V0LnN1cGVyY2xhc3MucmVuZGVyQWxsLmNh bGwodGhpcyxhLGIpfX19KTtFeHQuQ29udGFpbmVyLkxBWU9VVFMuY2FyZD1FeHQu bGF5b3V0LkNhcmRMYXlvdXQ7RXh0LmxheW91dC5BbmNob3JMYXlvdXQ9RXh0LmV4 dGVuZChFeHQubGF5b3V0LkNvbnRhaW5lckxheW91dCx7bW9uaXRvclJlc2l6ZTp0 cnVlLHR5cGU6ImFuY2hvciIsZGVmYXVsdEFuY2hvcjoiMTAwJSIscGFyc2VBbmNo b3JSRTovXihyfHJpZ2h0fGJ8Ym90dG9tKSQvaSxnZXRMYXlvdXRUYXJnZXRTaXpl OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jb250YWluZXIuZ2V0TGF5b3V0VGFyZ2V0 KCksYT17fTtpZihiKXthPWIuZ2V0Vmlld1NpemUoKTtpZihFeHQuaXNJRSYmRXh0 LmlzU3RyaWN0JiZhLndpZHRoPT0wKXthPWIuZ2V0U3R5bGVTaXplKCl9YS53aWR0 aC09Yi5nZXRQYWRkaW5nKCJsciIpO2EuaGVpZ2h0LT1iLmdldFBhZGRpbmcoInRi Iil9cmV0dXJuIGF9LG9uTGF5b3V0OmZ1bmN0aW9uKG0sdyl7RXh0LmxheW91dC5B bmNob3JMYXlvdXQuc3VwZXJjbGFzcy5vbkxheW91dC5jYWxsKHRoaXMsbSx3KTt2 YXIgcD10aGlzLmdldExheW91dFRhcmdldFNpemUoKSxrPXAud2lkdGgsbz1wLmhl aWdodCxxPXcuZ2V0U3R5bGUoIm92ZXJmbG93Iiksbj10aGlzLmdldFJlbmRlcmVk SXRlbXMobSksdD1uLmxlbmd0aCxnPVtdLGosYSx2LGwsaCxjLGUsZCx1PTAscyxi O2lmKGs8MjAmJm88MjApe3JldHVybn1pZihtLmFuY2hvclNpemUpe2lmKHR5cGVv ZiBtLmFuY2hvclNpemU9PSJudW1iZXIiKXthPW0uYW5jaG9yU2l6ZX1lbHNle2E9 bS5hbmNob3JTaXplLndpZHRoO3Y9bS5hbmNob3JTaXplLmhlaWdodH19ZWxzZXth PW0uaW5pdGlhbENvbmZpZy53aWR0aDt2PW0uaW5pdGlhbENvbmZpZy5oZWlnaHR9 Zm9yKHM9MDtzPHQ7cysrKXtsPW5bc107Yj1sLmdldFBvc2l0aW9uRWwoKTtpZigh bC5hbmNob3ImJmwuaXRlbXMmJiFFeHQuaXNOdW1iZXIobC53aWR0aCkmJiEoRXh0 LmlzSUU2JiZFeHQuaXNTdHJpY3QpKXtsLmFuY2hvcj10aGlzLmRlZmF1bHRBbmNo b3J9aWYobC5hbmNob3Ipe2g9bC5hbmNob3JTcGVjO2lmKCFoKXtkPWwuYW5jaG9y LnNwbGl0KCIgIik7bC5hbmNob3JTcGVjPWg9e3JpZ2h0OnRoaXMucGFyc2VBbmNo b3IoZFswXSxsLmluaXRpYWxDb25maWcud2lkdGgsYSksYm90dG9tOnRoaXMucGFy c2VBbmNob3IoZFsxXSxsLmluaXRpYWxDb25maWcuaGVpZ2h0LHYpfX1jPWgucmln aHQ/dGhpcy5hZGp1c3RXaWR0aEFuY2hvcihoLnJpZ2h0KGspLWIuZ2V0TWFyZ2lu cygibHIiKSxsKTp1bmRlZmluZWQ7ZT1oLmJvdHRvbT90aGlzLmFkanVzdEhlaWdo dEFuY2hvcihoLmJvdHRvbShvKS1iLmdldE1hcmdpbnMoInRiIiksbCk6dW5kZWZp bmVkO2lmKGN8fGUpe2cucHVzaCh7Y29tcG9uZW50Omwsd2lkdGg6Y3x8dW5kZWZp bmVkLGhlaWdodDplfHx1bmRlZmluZWR9KX19fWZvcihzPTAsdD1nLmxlbmd0aDtz PHQ7cysrKXtqPWdbc107ai5jb21wb25lbnQuc2V0U2l6ZShqLndpZHRoLGouaGVp Z2h0KX1pZihxJiZxIT0iaGlkZGVuIiYmIXRoaXMuYWRqdXN0bWVudFBhc3Mpe3Zh ciByPXRoaXMuZ2V0TGF5b3V0VGFyZ2V0U2l6ZSgpO2lmKHIud2lkdGghPXAud2lk dGh8fHIuaGVpZ2h0IT1wLmhlaWdodCl7dGhpcy5hZGp1c3RtZW50UGFzcz10cnVl O3RoaXMub25MYXlvdXQobSx3KX19ZGVsZXRlIHRoaXMuYWRqdXN0bWVudFBhc3N9 LHBhcnNlQW5jaG9yOmZ1bmN0aW9uKGMsaCxiKXtpZihjJiZjIT0ibm9uZSIpe3Zh ciBlO2lmKHRoaXMucGFyc2VBbmNob3JSRS50ZXN0KGMpKXt2YXIgZz1iLWg7cmV0 dXJuIGZ1bmN0aW9uKGEpe2lmKGEhPT1lKXtlPWE7cmV0dXJuIGEtZ319fWVsc2V7 aWYoYy5pbmRleE9mKCIlIikhPS0xKXt2YXIgZD1wYXJzZUZsb2F0KGMucmVwbGFj ZSgiJSIsIiIpKSowLjAxO3JldHVybiBmdW5jdGlvbihhKXtpZihhIT09ZSl7ZT1h O3JldHVybiBNYXRoLmZsb29yKGEqZCl9fX1lbHNle2M9cGFyc2VJbnQoYywxMCk7 aWYoIWlzTmFOKGMpKXtyZXR1cm4gZnVuY3Rpb24oYSl7aWYoYSE9PWUpe2U9YTty ZXR1cm4gYStjfX19fX19cmV0dXJuIGZhbHNlfSxhZGp1c3RXaWR0aEFuY2hvcjpm dW5jdGlvbihiLGEpe3JldHVybiBifSxhZGp1c3RIZWlnaHRBbmNob3I6ZnVuY3Rp b24oYixhKXtyZXR1cm4gYn19KTtFeHQuQ29udGFpbmVyLkxBWU9VVFMuYW5jaG9y PUV4dC5sYXlvdXQuQW5jaG9yTGF5b3V0O0V4dC5sYXlvdXQuQ29sdW1uTGF5b3V0 PUV4dC5leHRlbmQoRXh0LmxheW91dC5Db250YWluZXJMYXlvdXQse21vbml0b3JS ZXNpemU6dHJ1ZSx0eXBlOiJjb2x1bW4iLGV4dHJhQ2xzOiJ4LWNvbHVtbiIsc2Ny b2xsT2Zmc2V0OjAsdGFyZ2V0Q2xzOiJ4LWNvbHVtbi1sYXlvdXQtY3QiLGlzVmFs aWRQYXJlbnQ6ZnVuY3Rpb24oYixhKXtyZXR1cm4gdGhpcy5pbm5lckN0JiZiLmdl dFBvc2l0aW9uRWwoKS5kb20ucGFyZW50Tm9kZT09dGhpcy5pbm5lckN0LmRvbX0s Z2V0TGF5b3V0VGFyZ2V0U2l6ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuY29udGFp bmVyLmdldExheW91dFRhcmdldCgpLGE7aWYoYil7YT1iLmdldFZpZXdTaXplKCk7 aWYoRXh0LmlzSUUmJkV4dC5pc1N0cmljdCYmYS53aWR0aD09MCl7YT1iLmdldFN0 eWxlU2l6ZSgpfWEud2lkdGgtPWIuZ2V0UGFkZGluZygibHIiKTthLmhlaWdodC09 Yi5nZXRQYWRkaW5nKCJ0YiIpfXJldHVybiBhfSxyZW5kZXJBbGw6ZnVuY3Rpb24o YSxiKXtpZighdGhpcy5pbm5lckN0KXt0aGlzLmlubmVyQ3Q9Yi5jcmVhdGVDaGls ZCh7Y2xzOiJ4LWNvbHVtbi1pbm5lciJ9KTt0aGlzLmlubmVyQ3QuY3JlYXRlQ2hp bGQoe2NsczoieC1jbGVhciJ9KX1FeHQubGF5b3V0LkNvbHVtbkxheW91dC5zdXBl cmNsYXNzLnJlbmRlckFsbC5jYWxsKHRoaXMsYSx0aGlzLmlubmVyQ3QpfSxvbkxh eW91dDpmdW5jdGlvbihlLGspe3ZhciBnPWUuaXRlbXMuaXRlbXMsaj1nLmxlbmd0 aCxuLGIsYSxvPVtdO3RoaXMucmVuZGVyQWxsKGUsayk7dmFyIHI9dGhpcy5nZXRM YXlvdXRUYXJnZXRTaXplKCk7aWYoci53aWR0aDwxJiZyLmhlaWdodDwxKXtyZXR1 cm59dmFyIHA9ci53aWR0aC10aGlzLnNjcm9sbE9mZnNldCxkPXIuaGVpZ2h0LHE9 cDt0aGlzLmlubmVyQ3Quc2V0V2lkdGgocCk7Zm9yKGI9MDtiPGo7YisrKXtuPWdb Yl07YT1uLmdldFBvc2l0aW9uRWwoKS5nZXRNYXJnaW5zKCJsciIpO29bYl09YTtp Zighbi5jb2x1bW5XaWR0aCl7cS09KG4uZ2V0V2lkdGgoKSthKX19cT1xPDA/MDpx O2ZvcihiPTA7YjxqO2IrKyl7bj1nW2JdO2E9b1tiXTtpZihuLmNvbHVtbldpZHRo KXtuLnNldFNpemUoTWF0aC5mbG9vcihuLmNvbHVtbldpZHRoKnEpLWEpfX1pZihF eHQuaXNJRSl7aWYoYj1rLmdldFN0eWxlKCJvdmVyZmxvdyIpJiZiIT0iaGlkZGVu IiYmIXRoaXMuYWRqdXN0bWVudFBhc3Mpe3ZhciBsPXRoaXMuZ2V0TGF5b3V0VGFy Z2V0U2l6ZSgpO2lmKGwud2lkdGghPXIud2lkdGgpe3RoaXMuYWRqdXN0bWVudFBh c3M9dHJ1ZTt0aGlzLm9uTGF5b3V0KGUsayl9fX1kZWxldGUgdGhpcy5hZGp1c3Rt ZW50UGFzc319KTtFeHQuQ29udGFpbmVyLkxBWU9VVFMuY29sdW1uPUV4dC5sYXlv dXQuQ29sdW1uTGF5b3V0O0V4dC5sYXlvdXQuQm9yZGVyTGF5b3V0PUV4dC5leHRl bmQoRXh0LmxheW91dC5Db250YWluZXJMYXlvdXQse21vbml0b3JSZXNpemU6dHJ1 ZSxyZW5kZXJlZDpmYWxzZSx0eXBlOiJib3JkZXIiLHRhcmdldENsczoieC1ib3Jk ZXItbGF5b3V0LWN0IixnZXRMYXlvdXRUYXJnZXRTaXplOmZ1bmN0aW9uKCl7dmFy IGE9dGhpcy5jb250YWluZXIuZ2V0TGF5b3V0VGFyZ2V0KCk7cmV0dXJuIGE/YS5n ZXRWaWV3U2l6ZSgpOnt9fSxvbkxheW91dDpmdW5jdGlvbihnLEkpe3ZhciBqLEIs RixvLHg9Zy5pdGVtcy5pdGVtcyxDPXgubGVuZ3RoO2lmKCF0aGlzLnJlbmRlcmVk KXtqPVtdO2ZvcihCPTA7QjxDO0IrKyl7Rj14W0JdO289Ri5yZWdpb247aWYoRi5j b2xsYXBzZWQpe2oucHVzaChGKX1GLmNvbGxhcHNlZD1mYWxzZTtpZighRi5yZW5k ZXJlZCl7Ri5yZW5kZXIoSSxCKTtGLmdldFBvc2l0aW9uRWwoKS5hZGRDbGFzcygi eC1ib3JkZXItcGFuZWwiKX10aGlzW29dPW8hPSJjZW50ZXIiJiZGLnNwbGl0P25l dyBFeHQubGF5b3V0LkJvcmRlckxheW91dC5TcGxpdFJlZ2lvbih0aGlzLEYuaW5p dGlhbENvbmZpZyxvKTpuZXcgRXh0LmxheW91dC5Cb3JkZXJMYXlvdXQuUmVnaW9u KHRoaXMsRi5pbml0aWFsQ29uZmlnLG8pO3RoaXNbb10ucmVuZGVyKEksRil9dGhp cy5yZW5kZXJlZD10cnVlfXZhciB2PXRoaXMuZ2V0TGF5b3V0VGFyZ2V0U2l6ZSgp O2lmKHYud2lkdGg8MjB8fHYuaGVpZ2h0PDIwKXtpZihqKXt0aGlzLnJlc3RvcmVD b2xsYXBzZWQ9an1yZXR1cm59ZWxzZXtpZih0aGlzLnJlc3RvcmVDb2xsYXBzZWQp e2o9dGhpcy5yZXN0b3JlQ29sbGFwc2VkO2RlbGV0ZSB0aGlzLnJlc3RvcmVDb2xs YXBzZWR9fXZhciB0PXYud2lkdGgsRD12LmhlaWdodCxyPXQsQT1ELHA9MCxxPTAs eT10aGlzLm5vcnRoLHU9dGhpcy5zb3V0aCxsPXRoaXMud2VzdCxFPXRoaXMuZWFz dCxGPXRoaXMuY2VudGVyLEgseixkLEc7aWYoIUYmJkV4dC5sYXlvdXQuQm9yZGVy TGF5b3V0LldBUk4hPT1mYWxzZSl7dGhyb3ciTm8gY2VudGVyIHJlZ2lvbiBkZWZp bmVkIGluIEJvcmRlckxheW91dCAiK2cuaWR9aWYoeSYmeS5pc1Zpc2libGUoKSl7 SD15LmdldFNpemUoKTt6PXkuZ2V0TWFyZ2lucygpO0gud2lkdGg9dC0oei5sZWZ0 K3oucmlnaHQpO0gueD16LmxlZnQ7SC55PXoudG9wO3A9SC5oZWlnaHQrSC55K3ou Ym90dG9tO0EtPXA7eS5hcHBseUxheW91dChIKX1pZih1JiZ1LmlzVmlzaWJsZSgp KXtIPXUuZ2V0U2l6ZSgpO3o9dS5nZXRNYXJnaW5zKCk7SC53aWR0aD10LSh6Lmxl ZnQrei5yaWdodCk7SC54PXoubGVmdDtHPShILmhlaWdodCt6LnRvcCt6LmJvdHRv bSk7SC55PUQtRyt6LnRvcDtBLT1HO3UuYXBwbHlMYXlvdXQoSCl9aWYobCYmbC5p c1Zpc2libGUoKSl7SD1sLmdldFNpemUoKTt6PWwuZ2V0TWFyZ2lucygpO0guaGVp Z2h0PUEtKHoudG9wK3ouYm90dG9tKTtILng9ei5sZWZ0O0gueT1wK3oudG9wO2Q9 KEgud2lkdGgrei5sZWZ0K3oucmlnaHQpO3ErPWQ7ci09ZDtsLmFwcGx5TGF5b3V0 KEgpfWlmKEUmJkUuaXNWaXNpYmxlKCkpe0g9RS5nZXRTaXplKCk7ej1FLmdldE1h cmdpbnMoKTtILmhlaWdodD1BLSh6LnRvcCt6LmJvdHRvbSk7ZD0oSC53aWR0aCt6 LmxlZnQrei5yaWdodCk7SC54PXQtZCt6LmxlZnQ7SC55PXArei50b3A7ci09ZDtF LmFwcGx5TGF5b3V0KEgpfWlmKEYpe3o9Ri5nZXRNYXJnaW5zKCk7dmFyIGs9e3g6 cSt6LmxlZnQseTpwK3oudG9wLHdpZHRoOnItKHoubGVmdCt6LnJpZ2h0KSxoZWln aHQ6QS0oei50b3Arei5ib3R0b20pfTtGLmFwcGx5TGF5b3V0KGspfWlmKGope2Zv cihCPTAsQz1qLmxlbmd0aDtCPEM7QisrKXtqW0JdLmNvbGxhcHNlKGZhbHNlKX19 aWYoRXh0LmlzSUUmJkV4dC5pc1N0cmljdCl7SS5yZXBhaW50KCl9aWYoQj1JLmdl dFN0eWxlKCJvdmVyZmxvdyIpJiZCIT0iaGlkZGVuIiYmIXRoaXMuYWRqdXN0bWVu dFBhc3Mpe3ZhciBhPXRoaXMuZ2V0TGF5b3V0VGFyZ2V0U2l6ZSgpO2lmKGEud2lk dGghPXYud2lkdGh8fGEuaGVpZ2h0IT12LmhlaWdodCl7dGhpcy5hZGp1c3RtZW50 UGFzcz10cnVlO3RoaXMub25MYXlvdXQoZyxJKX19ZGVsZXRlIHRoaXMuYWRqdXN0 bWVudFBhc3N9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgYj1bIm5vcnRoIiwic291 dGgiLCJlYXN0Iiwid2VzdCJdLGEsYztmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXtj PXRoaXNbYlthXV07aWYoYyl7aWYoYy5kZXN0cm95KXtjLmRlc3Ryb3koKX1lbHNl e2lmKGMuc3BsaXQpe2Muc3BsaXQuZGVzdHJveSh0cnVlKX19fX1FeHQubGF5b3V0 LkJvcmRlckxheW91dC5zdXBlcmNsYXNzLmRlc3Ryb3kuY2FsbCh0aGlzKX19KTtF eHQubGF5b3V0LkJvcmRlckxheW91dC5SZWdpb249ZnVuY3Rpb24oYixhLGMpe0V4 dC5hcHBseSh0aGlzLGEpO3RoaXMubGF5b3V0PWI7dGhpcy5wb3NpdGlvbj1jO3Ro aXMuc3RhdGU9e307aWYodHlwZW9mIHRoaXMubWFyZ2lucz09InN0cmluZyIpe3Ro aXMubWFyZ2lucz10aGlzLmxheW91dC5wYXJzZU1hcmdpbnModGhpcy5tYXJnaW5z KX10aGlzLm1hcmdpbnM9RXh0LmFwcGx5SWYodGhpcy5tYXJnaW5zfHx7fSx0aGlz LmRlZmF1bHRNYXJnaW5zKTtpZih0aGlzLmNvbGxhcHNpYmxlKXtpZih0eXBlb2Yg dGhpcy5jbWFyZ2lucz09InN0cmluZyIpe3RoaXMuY21hcmdpbnM9dGhpcy5sYXlv dXQucGFyc2VNYXJnaW5zKHRoaXMuY21hcmdpbnMpfWlmKHRoaXMuY29sbGFwc2VN b2RlPT0ibWluaSImJiF0aGlzLmNtYXJnaW5zKXt0aGlzLmNtYXJnaW5zPXtsZWZ0 OjAsdG9wOjAscmlnaHQ6MCxib3R0b206MH19ZWxzZXt0aGlzLmNtYXJnaW5zPUV4 dC5hcHBseUlmKHRoaXMuY21hcmdpbnN8fHt9LGM9PSJub3J0aCJ8fGM9PSJzb3V0 aCI/dGhpcy5kZWZhdWx0TlNDTWFyZ2luczp0aGlzLmRlZmF1bHRFV0NNYXJnaW5z KX19fTtFeHQubGF5b3V0LkJvcmRlckxheW91dC5SZWdpb24ucHJvdG90eXBlPXtj b2xsYXBzaWJsZTpmYWxzZSxzcGxpdDpmYWxzZSxmbG9hdGFibGU6dHJ1ZSxtaW5X aWR0aDo1MCxtaW5IZWlnaHQ6NTAsZGVmYXVsdE1hcmdpbnM6e2xlZnQ6MCx0b3A6 MCxyaWdodDowLGJvdHRvbTowfSxkZWZhdWx0TlNDTWFyZ2luczp7bGVmdDo1LHRv cDo1LHJpZ2h0OjUsYm90dG9tOjV9LGRlZmF1bHRFV0NNYXJnaW5zOntsZWZ0OjUs dG9wOjAscmlnaHQ6NSxib3R0b206MH0sZmxvYXRpbmdaSW5kZXg6MTAwLGlzQ29s bGFwc2VkOmZhbHNlLHJlbmRlcjpmdW5jdGlvbihiLGMpe3RoaXMucGFuZWw9Yztj LmVsLmVuYWJsZURpc3BsYXlNb2RlKCk7dGhpcy50YXJnZXRFbD1iO3RoaXMuZWw9 Yy5lbDt2YXIgYT1jLmdldFN0YXRlLGQ9dGhpcy5wb3NpdGlvbjtjLmdldFN0YXRl PWZ1bmN0aW9uKCl7cmV0dXJuIEV4dC5hcHBseShhLmNhbGwoYyl8fHt9LHRoaXMu c3RhdGUpfS5jcmVhdGVEZWxlZ2F0ZSh0aGlzKTtpZihkIT0iY2VudGVyIil7Yy5h bGxvd1F1ZXVlZEV4cGFuZD1mYWxzZTtjLm9uKHtiZWZvcmVjb2xsYXBzZTp0aGlz LmJlZm9yZUNvbGxhcHNlLGNvbGxhcHNlOnRoaXMub25Db2xsYXBzZSxiZWZvcmVl eHBhbmQ6dGhpcy5iZWZvcmVFeHBhbmQsZXhwYW5kOnRoaXMub25FeHBhbmQsaGlk ZTp0aGlzLm9uSGlkZSxzaG93OnRoaXMub25TaG93LHNjb3BlOnRoaXN9KTtpZih0 aGlzLmNvbGxhcHNpYmxlfHx0aGlzLmZsb2F0YWJsZSl7Yy5jb2xsYXBzZUVsPSJl bCI7Yy5zbGlkZUFuY2hvcj10aGlzLmdldFNsaWRlQW5jaG9yKCl9aWYoYy50b29s cyYmYy50b29scy50b2dnbGUpe2MudG9vbHMudG9nZ2xlLmFkZENsYXNzKCJ4LXRv b2wtY29sbGFwc2UtIitkKTtjLnRvb2xzLnRvZ2dsZS5hZGRDbGFzc09uT3Zlcigi eC10b29sLWNvbGxhcHNlLSIrZCsiLW92ZXIiKX19fSxnZXRDb2xsYXBzZWRFbDpm dW5jdGlvbigpe2lmKCF0aGlzLmNvbGxhcHNlZEVsKXtpZighdGhpcy50b29sVGVt cGxhdGUpe3ZhciBiPW5ldyBFeHQuVGVtcGxhdGUoJzxkaXYgY2xhc3M9IngtdG9v bCB4LXRvb2wte2lkfSI+JiMxNjA7PC9kaXY+Jyk7Yi5kaXNhYmxlRm9ybWF0cz10 cnVlO2IuY29tcGlsZSgpO0V4dC5sYXlvdXQuQm9yZGVyTGF5b3V0LlJlZ2lvbi5w cm90b3R5cGUudG9vbFRlbXBsYXRlPWJ9dGhpcy5jb2xsYXBzZWRFbD10aGlzLnRh cmdldEVsLmNyZWF0ZUNoaWxkKHtjbHM6IngtbGF5b3V0LWNvbGxhcHNlZCB4LWxh eW91dC1jb2xsYXBzZWQtIit0aGlzLnBvc2l0aW9uLGlkOnRoaXMucGFuZWwuaWQr Ii14Y29sbGFwc2VkIn0pO3RoaXMuY29sbGFwc2VkRWwuZW5hYmxlRGlzcGxheU1v ZGUoImJsb2NrIik7aWYodGhpcy5jb2xsYXBzZU1vZGU9PSJtaW5pIil7dGhpcy5j b2xsYXBzZWRFbC5hZGRDbGFzcygieC1sYXlvdXQtY21pbmktIit0aGlzLnBvc2l0 aW9uKTt0aGlzLm1pbmlDb2xsYXBzZWRFbD10aGlzLmNvbGxhcHNlZEVsLmNyZWF0 ZUNoaWxkKHtjbHM6IngtbGF5b3V0LW1pbmkgeC1sYXlvdXQtbWluaS0iK3RoaXMu cG9zaXRpb24saHRtbDoiJiMxNjA7In0pO3RoaXMubWluaUNvbGxhcHNlZEVsLmFk ZENsYXNzT25PdmVyKCJ4LWxheW91dC1taW5pLW92ZXIiKTt0aGlzLmNvbGxhcHNl ZEVsLmFkZENsYXNzT25PdmVyKCJ4LWxheW91dC1jb2xsYXBzZWQtb3ZlciIpO3Ro aXMuY29sbGFwc2VkRWwub24oImNsaWNrIix0aGlzLm9uRXhwYW5kQ2xpY2ssdGhp cyx7c3RvcEV2ZW50OnRydWV9KX1lbHNle2lmKHRoaXMuY29sbGFwc2libGUhPT1m YWxzZSYmIXRoaXMuaGlkZUNvbGxhcHNlVG9vbCl7dmFyIGE9dGhpcy5leHBhbmRU b29sRWw9dGhpcy50b29sVGVtcGxhdGUuYXBwZW5kKHRoaXMuY29sbGFwc2VkRWwu ZG9tLHtpZDoiZXhwYW5kLSIrdGhpcy5wb3NpdGlvbn0sdHJ1ZSk7YS5hZGRDbGFz c09uT3ZlcigieC10b29sLWV4cGFuZC0iK3RoaXMucG9zaXRpb24rIi1vdmVyIik7 YS5vbigiY2xpY2siLHRoaXMub25FeHBhbmRDbGljayx0aGlzLHtzdG9wRXZlbnQ6 dHJ1ZX0pfWlmKHRoaXMuZmxvYXRhYmxlIT09ZmFsc2V8fHRoaXMudGl0bGVDb2xs YXBzZSl7dGhpcy5jb2xsYXBzZWRFbC5hZGRDbGFzc09uT3ZlcigieC1sYXlvdXQt Y29sbGFwc2VkLW92ZXIiKTt0aGlzLmNvbGxhcHNlZEVsLm9uKCJjbGljayIsdGhp c1t0aGlzLmZsb2F0YWJsZT8iY29sbGFwc2VDbGljayI6Im9uRXhwYW5kQ2xpY2si XSx0aGlzKX19fXJldHVybiB0aGlzLmNvbGxhcHNlZEVsfSxvbkV4cGFuZENsaWNr OmZ1bmN0aW9uKGEpe2lmKHRoaXMuaXNTbGlkKXt0aGlzLnBhbmVsLmV4cGFuZChm YWxzZSl9ZWxzZXt0aGlzLnBhbmVsLmV4cGFuZCgpfX0sb25Db2xsYXBzZUNsaWNr OmZ1bmN0aW9uKGEpe3RoaXMucGFuZWwuY29sbGFwc2UoKX0sYmVmb3JlQ29sbGFw c2U6ZnVuY3Rpb24oYyxhKXt0aGlzLmxhc3RBbmltPWE7aWYodGhpcy5zcGxpdEVs KXt0aGlzLnNwbGl0RWwuaGlkZSgpfXRoaXMuZ2V0Q29sbGFwc2VkRWwoKS5zaG93 KCk7dmFyIGI9dGhpcy5wYW5lbC5nZXRFbCgpO3RoaXMub3JpZ2luYWxaSW5kZXg9 Yi5nZXRTdHlsZSgiei1pbmRleCIpO2Iuc2V0U3R5bGUoInotaW5kZXgiLDEwMCk7 dGhpcy5pc0NvbGxhcHNlZD10cnVlO3RoaXMubGF5b3V0LmxheW91dCgpfSxvbkNv bGxhcHNlOmZ1bmN0aW9uKGEpe3RoaXMucGFuZWwuZWwuc2V0U3R5bGUoInotaW5k ZXgiLDEpO2lmKHRoaXMubGFzdEFuaW09PT1mYWxzZXx8dGhpcy5wYW5lbC5hbmlt Q29sbGFwc2U9PT1mYWxzZSl7dGhpcy5nZXRDb2xsYXBzZWRFbCgpLmRvbS5zdHls ZS52aXNpYmlsaXR5PSJ2aXNpYmxlIn1lbHNle3RoaXMuZ2V0Q29sbGFwc2VkRWwo KS5zbGlkZUluKHRoaXMucGFuZWwuc2xpZGVBbmNob3Ise2R1cmF0aW9uOjAuMn0p fXRoaXMuc3RhdGUuY29sbGFwc2VkPXRydWU7dGhpcy5wYW5lbC5zYXZlU3RhdGUo KX0sYmVmb3JlRXhwYW5kOmZ1bmN0aW9uKGEpe2lmKHRoaXMuaXNTbGlkKXt0aGlz LmFmdGVyU2xpZGVJbigpfXZhciBiPXRoaXMuZ2V0Q29sbGFwc2VkRWwoKTt0aGlz LmVsLnNob3coKTtpZih0aGlzLnBvc2l0aW9uPT0iZWFzdCJ8fHRoaXMucG9zaXRp b249PSJ3ZXN0Iil7dGhpcy5wYW5lbC5zZXRTaXplKHVuZGVmaW5lZCxiLmdldEhl aWdodCgpKX1lbHNle3RoaXMucGFuZWwuc2V0U2l6ZShiLmdldFdpZHRoKCksdW5k ZWZpbmVkKX1iLmhpZGUoKTtiLmRvbS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4i O3RoaXMucGFuZWwuZWwuc2V0U3R5bGUoInotaW5kZXgiLHRoaXMuZmxvYXRpbmda SW5kZXgpfSxvbkV4cGFuZDpmdW5jdGlvbigpe3RoaXMuaXNDb2xsYXBzZWQ9ZmFs c2U7aWYodGhpcy5zcGxpdEVsKXt0aGlzLnNwbGl0RWwuc2hvdygpfXRoaXMubGF5 b3V0LmxheW91dCgpO3RoaXMucGFuZWwuZWwuc2V0U3R5bGUoInotaW5kZXgiLHRo aXMub3JpZ2luYWxaSW5kZXgpO3RoaXMuc3RhdGUuY29sbGFwc2VkPWZhbHNlO3Ro aXMucGFuZWwuc2F2ZVN0YXRlKCl9LGNvbGxhcHNlQ2xpY2s6ZnVuY3Rpb24oYSl7 aWYodGhpcy5pc1NsaWQpe2Euc3RvcFByb3BhZ2F0aW9uKCk7dGhpcy5zbGlkZUlu KCl9ZWxzZXthLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuc2xpZGVPdXQoKX19LG9u SGlkZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNDb2xsYXBzZWQpe3RoaXMuZ2V0Q29s bGFwc2VkRWwoKS5oaWRlKCl9ZWxzZXtpZih0aGlzLnNwbGl0RWwpe3RoaXMuc3Bs aXRFbC5oaWRlKCl9fX0sb25TaG93OmZ1bmN0aW9uKCl7aWYodGhpcy5pc0NvbGxh cHNlZCl7dGhpcy5nZXRDb2xsYXBzZWRFbCgpLnNob3coKX1lbHNle2lmKHRoaXMu c3BsaXRFbCl7dGhpcy5zcGxpdEVsLnNob3coKX19fSxpc1Zpc2libGU6ZnVuY3Rp b24oKXtyZXR1cm4gIXRoaXMucGFuZWwuaGlkZGVufSxnZXRNYXJnaW5zOmZ1bmN0 aW9uKCl7cmV0dXJuIHRoaXMuaXNDb2xsYXBzZWQmJnRoaXMuY21hcmdpbnM/dGhp cy5jbWFyZ2luczp0aGlzLm1hcmdpbnN9LGdldFNpemU6ZnVuY3Rpb24oKXtyZXR1 cm4gdGhpcy5pc0NvbGxhcHNlZD90aGlzLmdldENvbGxhcHNlZEVsKCkuZ2V0U2l6 ZSgpOnRoaXMucGFuZWwuZ2V0U2l6ZSgpfSxzZXRQYW5lbDpmdW5jdGlvbihhKXt0 aGlzLnBhbmVsPWF9LGdldE1pbldpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMu bWluV2lkdGh9LGdldE1pbkhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1p bkhlaWdodH0sYXBwbHlMYXlvdXRDb2xsYXBzZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9 dGhpcy5nZXRDb2xsYXBzZWRFbCgpO2Iuc2V0TGVmdFRvcChhLngsYS55KTtiLnNl dFNpemUoYS53aWR0aCxhLmhlaWdodCl9LGFwcGx5TGF5b3V0OmZ1bmN0aW9uKGEp e2lmKHRoaXMuaXNDb2xsYXBzZWQpe3RoaXMuYXBwbHlMYXlvdXRDb2xsYXBzZWQo YSl9ZWxzZXt0aGlzLnBhbmVsLnNldFBvc2l0aW9uKGEueCxhLnkpO3RoaXMucGFu ZWwuc2V0U2l6ZShhLndpZHRoLGEuaGVpZ2h0KX19LGJlZm9yZVNsaWRlOmZ1bmN0 aW9uKCl7dGhpcy5wYW5lbC5iZWZvcmVFZmZlY3QoKX0sYWZ0ZXJTbGlkZTpmdW5j dGlvbigpe3RoaXMucGFuZWwuYWZ0ZXJFZmZlY3QoKX0saW5pdEF1dG9IaWRlOmZ1 bmN0aW9uKCl7aWYodGhpcy5hdXRvSGlkZSE9PWZhbHNlKXtpZighdGhpcy5hdXRv SGlkZUhkKXt0aGlzLmF1dG9IaWRlU2xpZGVUYXNrPW5ldyBFeHQudXRpbC5EZWxh eWVkVGFzayh0aGlzLnNsaWRlSW4sdGhpcyk7dGhpcy5hdXRvSGlkZUhkPXttb3Vz ZW91dDpmdW5jdGlvbihhKXtpZighYS53aXRoaW4odGhpcy5lbCx0cnVlKSl7dGhp cy5hdXRvSGlkZVNsaWRlVGFzay5kZWxheSg1MDApfX0sbW91c2VvdmVyOmZ1bmN0 aW9uKGEpe3RoaXMuYXV0b0hpZGVTbGlkZVRhc2suY2FuY2VsKCl9LHNjb3BlOnRo aXN9fXRoaXMuZWwub24odGhpcy5hdXRvSGlkZUhkKTt0aGlzLmNvbGxhcHNlZEVs Lm9uKHRoaXMuYXV0b0hpZGVIZCl9fSxjbGVhckF1dG9IaWRlOmZ1bmN0aW9uKCl7 aWYodGhpcy5hdXRvSGlkZSE9PWZhbHNlKXt0aGlzLmVsLnVuKCJtb3VzZW91dCIs dGhpcy5hdXRvSGlkZUhkLm1vdXNlb3V0KTt0aGlzLmVsLnVuKCJtb3VzZW92ZXIi LHRoaXMuYXV0b0hpZGVIZC5tb3VzZW92ZXIpO3RoaXMuY29sbGFwc2VkRWwudW4o Im1vdXNlb3V0Iix0aGlzLmF1dG9IaWRlSGQubW91c2VvdXQpO3RoaXMuY29sbGFw c2VkRWwudW4oIm1vdXNlb3ZlciIsdGhpcy5hdXRvSGlkZUhkLm1vdXNlb3Zlcil9 fSxjbGVhck1vbml0b3I6ZnVuY3Rpb24oKXtFeHQuZ2V0RG9jKCkudW4oImNsaWNr Iix0aGlzLnNsaWRlSW5JZix0aGlzKX0sc2xpZGVPdXQ6ZnVuY3Rpb24oKXtpZih0 aGlzLmlzU2xpZHx8dGhpcy5lbC5oYXNBY3RpdmVGeCgpKXtyZXR1cm59dGhpcy5p c1NsaWQ9dHJ1ZTt2YXIgYj10aGlzLnBhbmVsLnRvb2xzLGMsYTtpZihiJiZiLnRv Z2dsZSl7Yi50b2dnbGUuaGlkZSgpfXRoaXMuZWwuc2hvdygpO2E9dGhpcy5wYW5l bC5jb2xsYXBzZWQ7dGhpcy5wYW5lbC5jb2xsYXBzZWQ9ZmFsc2U7aWYodGhpcy5w b3NpdGlvbj09ImVhc3QifHx0aGlzLnBvc2l0aW9uPT0id2VzdCIpe2M9dGhpcy5w YW5lbC5kZWZlckhlaWdodDt0aGlzLnBhbmVsLmRlZmVySGVpZ2h0PWZhbHNlO3Ro aXMucGFuZWwuc2V0U2l6ZSh1bmRlZmluZWQsdGhpcy5jb2xsYXBzZWRFbC5nZXRI ZWlnaHQoKSk7dGhpcy5wYW5lbC5kZWZlckhlaWdodD1jfWVsc2V7dGhpcy5wYW5l bC5zZXRTaXplKHRoaXMuY29sbGFwc2VkRWwuZ2V0V2lkdGgoKSx1bmRlZmluZWQp fXRoaXMucGFuZWwuY29sbGFwc2VkPWE7dGhpcy5yZXN0b3JlTFQ9W3RoaXMuZWwu ZG9tLnN0eWxlLmxlZnQsdGhpcy5lbC5kb20uc3R5bGUudG9wXTt0aGlzLmVsLmFs aWduVG8odGhpcy5jb2xsYXBzZWRFbCx0aGlzLmdldENvbGxhcHNlQW5jaG9yKCkp O3RoaXMuZWwuc2V0U3R5bGUoInotaW5kZXgiLHRoaXMuZmxvYXRpbmdaSW5kZXgr Mik7dGhpcy5wYW5lbC5lbC5yZXBsYWNlQ2xhc3MoIngtcGFuZWwtY29sbGFwc2Vk IiwieC1wYW5lbC1mbG9hdGluZyIpO2lmKHRoaXMuYW5pbUZsb2F0IT09ZmFsc2Up e3RoaXMuYmVmb3JlU2xpZGUoKTt0aGlzLmVsLnNsaWRlSW4odGhpcy5nZXRTbGlk ZUFuY2hvcigpLHtjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuYWZ0ZXJTbGlkZSgp O3RoaXMuaW5pdEF1dG9IaWRlKCk7RXh0LmdldERvYygpLm9uKCJjbGljayIsdGhp cy5zbGlkZUluSWYsdGhpcyl9LHNjb3BlOnRoaXMsYmxvY2s6dHJ1ZX0pfWVsc2V7 dGhpcy5pbml0QXV0b0hpZGUoKTtFeHQuZ2V0RG9jKCkub24oImNsaWNrIix0aGlz LnNsaWRlSW5JZix0aGlzKX19LGFmdGVyU2xpZGVJbjpmdW5jdGlvbigpe3RoaXMu Y2xlYXJBdXRvSGlkZSgpO3RoaXMuaXNTbGlkPWZhbHNlO3RoaXMuY2xlYXJNb25p dG9yKCk7dGhpcy5lbC5zZXRTdHlsZSgiei1pbmRleCIsIiIpO3RoaXMucGFuZWwu ZWwucmVwbGFjZUNsYXNzKCJ4LXBhbmVsLWZsb2F0aW5nIiwieC1wYW5lbC1jb2xs YXBzZWQiKTt0aGlzLmVsLmRvbS5zdHlsZS5sZWZ0PXRoaXMucmVzdG9yZUxUWzBd O3RoaXMuZWwuZG9tLnN0eWxlLnRvcD10aGlzLnJlc3RvcmVMVFsxXTt2YXIgYT10 aGlzLnBhbmVsLnRvb2xzO2lmKGEmJmEudG9nZ2xlKXthLnRvZ2dsZS5zaG93KCl9 fSxzbGlkZUluOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmlzU2xpZHx8dGhpcy5lbC5o YXNBY3RpdmVGeCgpKXtFeHQuY2FsbGJhY2soYSk7cmV0dXJufXRoaXMuaXNTbGlk PWZhbHNlO2lmKHRoaXMuYW5pbUZsb2F0IT09ZmFsc2Upe3RoaXMuYmVmb3JlU2xp ZGUoKTt0aGlzLmVsLnNsaWRlT3V0KHRoaXMuZ2V0U2xpZGVBbmNob3IoKSx7Y2Fs bGJhY2s6ZnVuY3Rpb24oKXt0aGlzLmVsLmhpZGUoKTt0aGlzLmFmdGVyU2xpZGUo KTt0aGlzLmFmdGVyU2xpZGVJbigpO0V4dC5jYWxsYmFjayhhKX0sc2NvcGU6dGhp cyxibG9jazp0cnVlfSl9ZWxzZXt0aGlzLmVsLmhpZGUoKTt0aGlzLmFmdGVyU2xp ZGVJbigpfX0sc2xpZGVJbklmOmZ1bmN0aW9uKGEpe2lmKCFhLndpdGhpbih0aGlz LmVsKSl7dGhpcy5zbGlkZUluKCl9fSxhbmNob3JzOnt3ZXN0OiJsZWZ0IixlYXN0 OiJyaWdodCIsbm9ydGg6InRvcCIsc291dGg6ImJvdHRvbSJ9LHNhbmNob3JzOnt3 ZXN0OiJsIixlYXN0OiJyIixub3J0aDoidCIsc291dGg6ImIifSxjYW5jaG9yczp7 d2VzdDoidGwtdHIiLGVhc3Q6InRyLXRsIixub3J0aDoidGwtYmwiLHNvdXRoOiJi bC10bCJ9LGdldEFuY2hvcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFuY2hvcnNb dGhpcy5wb3NpdGlvbl19LGdldENvbGxhcHNlQW5jaG9yOmZ1bmN0aW9uKCl7cmV0 dXJuIHRoaXMuY2FuY2hvcnNbdGhpcy5wb3NpdGlvbl19LGdldFNsaWRlQW5jaG9y OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2FuY2hvcnNbdGhpcy5wb3NpdGlvbl19 LGdldEFsaWduQWRqOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jbWFyZ2lucztzd2l0 Y2godGhpcy5wb3NpdGlvbil7Y2FzZSJ3ZXN0IjpyZXR1cm5bMCwwXTticmVhaztj YXNlImVhc3QiOnJldHVyblswLDBdO2JyZWFrO2Nhc2Uibm9ydGgiOnJldHVyblsw LDBdO2JyZWFrO2Nhc2Uic291dGgiOnJldHVyblswLDBdO2JyZWFrfX0sZ2V0RXhw YW5kQWRqOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jb2xsYXBzZWRFbCxhPXRoaXMu Y21hcmdpbnM7c3dpdGNoKHRoaXMucG9zaXRpb24pe2Nhc2Uid2VzdCI6cmV0dXJu Wy0oYS5yaWdodCtiLmdldFdpZHRoKCkrYS5sZWZ0KSwwXTticmVhaztjYXNlImVh c3QiOnJldHVyblthLnJpZ2h0K2IuZ2V0V2lkdGgoKSthLmxlZnQsMF07YnJlYWs7 Y2FzZSJub3J0aCI6cmV0dXJuWzAsLShhLnRvcCthLmJvdHRvbStiLmdldEhlaWdo dCgpKV07YnJlYWs7Y2FzZSJzb3V0aCI6cmV0dXJuWzAsYS50b3ArYS5ib3R0b20r Yi5nZXRIZWlnaHQoKV07YnJlYWt9fSxkZXN0cm95OmZ1bmN0aW9uKCl7aWYodGhp cy5hdXRvSGlkZVNsaWRlVGFzayYmdGhpcy5hdXRvSGlkZVNsaWRlVGFzay5jYW5j ZWwpe3RoaXMuYXV0b0hpZGVTbGlkZVRhc2suY2FuY2VsKCl9RXh0LmRlc3Ryb3lN ZW1iZXJzKHRoaXMsIm1pbmlDb2xsYXBzZWRFbCIsImNvbGxhcHNlZEVsIiwiZXhw YW5kVG9vbEVsIil9fTtFeHQubGF5b3V0LkJvcmRlckxheW91dC5TcGxpdFJlZ2lv bj1mdW5jdGlvbihiLGEsYyl7RXh0LmxheW91dC5Cb3JkZXJMYXlvdXQuU3BsaXRS ZWdpb24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYixhLGMpO3Ro aXMuYXBwbHlMYXlvdXQ9dGhpcy5hcHBseUZuc1tjXX07RXh0LmV4dGVuZChFeHQu bGF5b3V0LkJvcmRlckxheW91dC5TcGxpdFJlZ2lvbixFeHQubGF5b3V0LkJvcmRl ckxheW91dC5SZWdpb24se3NwbGl0VGlwOiJEcmFnIHRvIHJlc2l6ZS4iLGNvbGxh cHNpYmxlU3BsaXRUaXA6IkRyYWcgdG8gcmVzaXplLiBEb3VibGUgY2xpY2sgdG8g aGlkZS4iLHVzZVNwbGl0VGlwczpmYWxzZSxzcGxpdFNldHRpbmdzOntub3J0aDp7 b3JpZW50YXRpb246RXh0LlNwbGl0QmFyLlZFUlRJQ0FMLHBsYWNlbWVudDpFeHQu U3BsaXRCYXIuVE9QLG1heEZuOiJnZXRWTWF4U2l6ZSIsbWluUHJvcDoibWluSGVp Z2h0IixtYXhQcm9wOiJtYXhIZWlnaHQifSxzb3V0aDp7b3JpZW50YXRpb246RXh0 LlNwbGl0QmFyLlZFUlRJQ0FMLHBsYWNlbWVudDpFeHQuU3BsaXRCYXIuQk9UVE9N LG1heEZuOiJnZXRWTWF4U2l6ZSIsbWluUHJvcDoibWluSGVpZ2h0IixtYXhQcm9w OiJtYXhIZWlnaHQifSxlYXN0OntvcmllbnRhdGlvbjpFeHQuU3BsaXRCYXIuSE9S SVpPTlRBTCxwbGFjZW1lbnQ6RXh0LlNwbGl0QmFyLlJJR0hULG1heEZuOiJnZXRI TWF4U2l6ZSIsbWluUHJvcDoibWluV2lkdGgiLG1heFByb3A6Im1heFdpZHRoIn0s d2VzdDp7b3JpZW50YXRpb246RXh0LlNwbGl0QmFyLkhPUklaT05UQUwscGxhY2Vt ZW50OkV4dC5TcGxpdEJhci5MRUZULG1heEZuOiJnZXRITWF4U2l6ZSIsbWluUHJv cDoibWluV2lkdGgiLG1heFByb3A6Im1heFdpZHRoIn19LGFwcGx5Rm5zOnt3ZXN0 OmZ1bmN0aW9uKGMpe2lmKHRoaXMuaXNDb2xsYXBzZWQpe3JldHVybiB0aGlzLmFw cGx5TGF5b3V0Q29sbGFwc2VkKGMpfXZhciBkPXRoaXMuc3BsaXRFbC5kb20sYj1k LnN0eWxlO3RoaXMucGFuZWwuc2V0UG9zaXRpb24oYy54LGMueSk7dmFyIGE9ZC5v ZmZzZXRXaWR0aDtiLmxlZnQ9KGMueCtjLndpZHRoLWEpKyJweCI7Yi50b3A9KGMu eSkrInB4IjtiLmhlaWdodD1NYXRoLm1heCgwLGMuaGVpZ2h0KSsicHgiO3RoaXMu cGFuZWwuc2V0U2l6ZShjLndpZHRoLWEsYy5oZWlnaHQpfSxlYXN0OmZ1bmN0aW9u KGMpe2lmKHRoaXMuaXNDb2xsYXBzZWQpe3JldHVybiB0aGlzLmFwcGx5TGF5b3V0 Q29sbGFwc2VkKGMpfXZhciBkPXRoaXMuc3BsaXRFbC5kb20sYj1kLnN0eWxlO3Zh ciBhPWQub2Zmc2V0V2lkdGg7dGhpcy5wYW5lbC5zZXRQb3NpdGlvbihjLngrYSxj LnkpO2IubGVmdD0oYy54KSsicHgiO2IudG9wPShjLnkpKyJweCI7Yi5oZWlnaHQ9 TWF0aC5tYXgoMCxjLmhlaWdodCkrInB4Ijt0aGlzLnBhbmVsLnNldFNpemUoYy53 aWR0aC1hLGMuaGVpZ2h0KX0sbm9ydGg6ZnVuY3Rpb24oYyl7aWYodGhpcy5pc0Nv bGxhcHNlZCl7cmV0dXJuIHRoaXMuYXBwbHlMYXlvdXRDb2xsYXBzZWQoYyl9dmFy IGQ9dGhpcy5zcGxpdEVsLmRvbSxiPWQuc3R5bGU7dmFyIGE9ZC5vZmZzZXRIZWln aHQ7dGhpcy5wYW5lbC5zZXRQb3NpdGlvbihjLngsYy55KTtiLmxlZnQ9KGMueCkr InB4IjtiLnRvcD0oYy55K2MuaGVpZ2h0LWEpKyJweCI7Yi53aWR0aD1NYXRoLm1h eCgwLGMud2lkdGgpKyJweCI7dGhpcy5wYW5lbC5zZXRTaXplKGMud2lkdGgsYy5o ZWlnaHQtYSl9LHNvdXRoOmZ1bmN0aW9uKGMpe2lmKHRoaXMuaXNDb2xsYXBzZWQp e3JldHVybiB0aGlzLmFwcGx5TGF5b3V0Q29sbGFwc2VkKGMpfXZhciBkPXRoaXMu c3BsaXRFbC5kb20sYj1kLnN0eWxlO3ZhciBhPWQub2Zmc2V0SGVpZ2h0O3RoaXMu cGFuZWwuc2V0UG9zaXRpb24oYy54LGMueSthKTtiLmxlZnQ9KGMueCkrInB4Ijti LnRvcD0oYy55KSsicHgiO2Iud2lkdGg9TWF0aC5tYXgoMCxjLndpZHRoKSsicHgi O3RoaXMucGFuZWwuc2V0U2l6ZShjLndpZHRoLGMuaGVpZ2h0LWEpfX0scmVuZGVy OmZ1bmN0aW9uKGEsYyl7RXh0LmxheW91dC5Cb3JkZXJMYXlvdXQuU3BsaXRSZWdp b24uc3VwZXJjbGFzcy5yZW5kZXIuY2FsbCh0aGlzLGEsYyk7dmFyIGQ9dGhpcy5w b3NpdGlvbjt0aGlzLnNwbGl0RWw9YS5jcmVhdGVDaGlsZCh7Y2xzOiJ4LWxheW91 dC1zcGxpdCB4LWxheW91dC1zcGxpdC0iK2QsaHRtbDoiJiMxNjA7IixpZDp0aGlz LnBhbmVsLmlkKyIteHNwbGl0In0pO2lmKHRoaXMuY29sbGFwc2VNb2RlPT0ibWlu aSIpe3RoaXMubWluaVNwbGl0RWw9dGhpcy5zcGxpdEVsLmNyZWF0ZUNoaWxkKHtj bHM6IngtbGF5b3V0LW1pbmkgeC1sYXlvdXQtbWluaS0iK2QsaHRtbDoiJiMxNjA7 In0pO3RoaXMubWluaVNwbGl0RWwuYWRkQ2xhc3NPbk92ZXIoIngtbGF5b3V0LW1p bmktb3ZlciIpO3RoaXMubWluaVNwbGl0RWwub24oImNsaWNrIix0aGlzLm9uQ29s bGFwc2VDbGljayx0aGlzLHtzdG9wRXZlbnQ6dHJ1ZX0pfXZhciBiPXRoaXMuc3Bs aXRTZXR0aW5nc1tkXTt0aGlzLnNwbGl0PW5ldyBFeHQuU3BsaXRCYXIodGhpcy5z cGxpdEVsLmRvbSxjLmVsLGIub3JpZW50YXRpb24pO3RoaXMuc3BsaXQudGlja1Np emU9dGhpcy50aWNrU2l6ZTt0aGlzLnNwbGl0LnBsYWNlbWVudD1iLnBsYWNlbWVu dDt0aGlzLnNwbGl0LmdldE1heGltdW1TaXplPXRoaXNbYi5tYXhGbl0uY3JlYXRl RGVsZWdhdGUodGhpcyk7dGhpcy5zcGxpdC5taW5TaXplPXRoaXMubWluU2l6ZXx8 dGhpc1tiLm1pblByb3BdO3RoaXMuc3BsaXQub24oImJlZm9yZWFwcGx5Iix0aGlz Lm9uU3BsaXRNb3ZlLHRoaXMpO3RoaXMuc3BsaXQudXNlU2hpbT10aGlzLnVzZVNo aW09PT10cnVlO3RoaXMubWF4U2l6ZT10aGlzLm1heFNpemV8fHRoaXNbYi5tYXhQ cm9wXTtpZihjLmhpZGRlbil7dGhpcy5zcGxpdEVsLmhpZGUoKX1pZih0aGlzLnVz ZVNwbGl0VGlwcyl7dGhpcy5zcGxpdEVsLmRvbS50aXRsZT10aGlzLmNvbGxhcHNp YmxlP3RoaXMuY29sbGFwc2libGVTcGxpdFRpcDp0aGlzLnNwbGl0VGlwfWlmKHRo aXMuY29sbGFwc2libGUpe3RoaXMuc3BsaXRFbC5vbigiZGJsY2xpY2siLHRoaXMu b25Db2xsYXBzZUNsaWNrLHRoaXMpfX0sZ2V0U2l6ZTpmdW5jdGlvbigpe2lmKHRo aXMuaXNDb2xsYXBzZWQpe3JldHVybiB0aGlzLmNvbGxhcHNlZEVsLmdldFNpemUo KX12YXIgYT10aGlzLnBhbmVsLmdldFNpemUoKTtpZih0aGlzLnBvc2l0aW9uPT0i bm9ydGgifHx0aGlzLnBvc2l0aW9uPT0ic291dGgiKXthLmhlaWdodCs9dGhpcy5z cGxpdEVsLmRvbS5vZmZzZXRIZWlnaHR9ZWxzZXthLndpZHRoKz10aGlzLnNwbGl0 RWwuZG9tLm9mZnNldFdpZHRofXJldHVybiBhfSxnZXRITWF4U2l6ZTpmdW5jdGlv bigpe3ZhciBiPXRoaXMubWF4U2l6ZXx8MTAwMDA7dmFyIGE9dGhpcy5sYXlvdXQu Y2VudGVyO3JldHVybiBNYXRoLm1pbihiLCh0aGlzLmVsLmdldFdpZHRoKCkrYS5l bC5nZXRXaWR0aCgpKS1hLmdldE1pbldpZHRoKCkpfSxnZXRWTWF4U2l6ZTpmdW5j dGlvbigpe3ZhciBiPXRoaXMubWF4U2l6ZXx8MTAwMDA7dmFyIGE9dGhpcy5sYXlv dXQuY2VudGVyO3JldHVybiBNYXRoLm1pbihiLCh0aGlzLmVsLmdldEhlaWdodCgp K2EuZWwuZ2V0SGVpZ2h0KCkpLWEuZ2V0TWluSGVpZ2h0KCkpfSxvblNwbGl0TW92 ZTpmdW5jdGlvbihiLGEpe3ZhciBjPXRoaXMucGFuZWwuZ2V0U2l6ZSgpO3RoaXMu bGFzdFNwbGl0U2l6ZT1hO2lmKHRoaXMucG9zaXRpb249PSJub3J0aCJ8fHRoaXMu cG9zaXRpb249PSJzb3V0aCIpe3RoaXMucGFuZWwuc2V0U2l6ZShjLndpZHRoLGEp O3RoaXMuc3RhdGUuaGVpZ2h0PWF9ZWxzZXt0aGlzLnBhbmVsLnNldFNpemUoYSxj LmhlaWdodCk7dGhpcy5zdGF0ZS53aWR0aD1hfXRoaXMubGF5b3V0LmxheW91dCgp O3RoaXMucGFuZWwuc2F2ZVN0YXRlKCk7cmV0dXJuIGZhbHNlfSxnZXRTcGxpdEJh cjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNwbGl0fSxkZXN0cm95OmZ1bmN0aW9u KCl7RXh0LmRlc3Ryb3kodGhpcy5taW5pU3BsaXRFbCx0aGlzLnNwbGl0LHRoaXMu c3BsaXRFbCk7RXh0LmxheW91dC5Cb3JkZXJMYXlvdXQuU3BsaXRSZWdpb24uc3Vw ZXJjbGFzcy5kZXN0cm95LmNhbGwodGhpcyl9fSk7RXh0LkNvbnRhaW5lci5MQVlP VVRTLmJvcmRlcj1FeHQubGF5b3V0LkJvcmRlckxheW91dDtFeHQubGF5b3V0LkZv cm1MYXlvdXQ9RXh0LmV4dGVuZChFeHQubGF5b3V0LkFuY2hvckxheW91dCx7bGFi ZWxTZXBhcmF0b3I6IjoiLHRyYWNrTGFiZWxzOnRydWUsdHlwZToiZm9ybSIsb25S ZW1vdmU6ZnVuY3Rpb24oZCl7RXh0LmxheW91dC5Gb3JtTGF5b3V0LnN1cGVyY2xh c3Mub25SZW1vdmUuY2FsbCh0aGlzLGQpO2lmKHRoaXMudHJhY2tMYWJlbHMpe2Qu dW4oInNob3ciLHRoaXMub25GaWVsZFNob3csdGhpcyk7ZC51bigiaGlkZSIsdGhp cy5vbkZpZWxkSGlkZSx0aGlzKX12YXIgYj1kLmdldFBvc2l0aW9uRWwoKSxhPWQu Z2V0SXRlbUN0JiZkLmdldEl0ZW1DdCgpO2lmKGQucmVuZGVyZWQmJmEpe2lmKGIm JmIuZG9tKXtiLmluc2VydEFmdGVyKGEpfUV4dC5kZXN0cm95KGEpO0V4dC5kZXN0 cm95TWVtYmVycyhkLCJsYWJlbCIsIml0ZW1DdCIpO2lmKGQuY3VzdG9tSXRlbUN0 KXtFeHQuZGVzdHJveU1lbWJlcnMoZCwiZ2V0SXRlbUN0IiwiY3VzdG9tSXRlbUN0 Iil9fX0sc2V0Q29udGFpbmVyOmZ1bmN0aW9uKGEpe0V4dC5sYXlvdXQuRm9ybUxh eW91dC5zdXBlcmNsYXNzLnNldENvbnRhaW5lci5jYWxsKHRoaXMsYSk7aWYoYS5s YWJlbEFsaWduKXthLmFkZENsYXNzKCJ4LWZvcm0tbGFiZWwtIithLmxhYmVsQWxp Z24pfWlmKGEuaGlkZUxhYmVscyl7RXh0LmFwcGx5KHRoaXMse2xhYmVsU3R5bGU6 ImRpc3BsYXk6bm9uZSIsZWxlbWVudFN0eWxlOiJwYWRkaW5nLWxlZnQ6MDsiLGxh YmVsQWRqdXN0OjB9KX1lbHNle3RoaXMubGFiZWxTZXBhcmF0b3I9RXh0LmlzRGVm aW5lZChhLmxhYmVsU2VwYXJhdG9yKT9hLmxhYmVsU2VwYXJhdG9yOnRoaXMubGFi ZWxTZXBhcmF0b3I7YS5sYWJlbFdpZHRoPWEubGFiZWxXaWR0aHx8MTAwO2lmKEV4 dC5pc051bWJlcihhLmxhYmVsV2lkdGgpKXt2YXIgYj1FeHQuaXNOdW1iZXIoYS5s YWJlbFBhZCk/YS5sYWJlbFBhZDo1O0V4dC5hcHBseSh0aGlzLHtsYWJlbEFkanVz dDphLmxhYmVsV2lkdGgrYixsYWJlbFN0eWxlOiJ3aWR0aDoiK2EubGFiZWxXaWR0 aCsicHg7IixlbGVtZW50U3R5bGU6InBhZGRpbmctbGVmdDoiKyhhLmxhYmVsV2lk dGgrYikrInB4In0pfWlmKGEubGFiZWxBbGlnbj09InRvcCIpe0V4dC5hcHBseSh0 aGlzLHtsYWJlbFN0eWxlOiJ3aWR0aDphdXRvOyIsbGFiZWxBZGp1c3Q6MCxlbGVt ZW50U3R5bGU6InBhZGRpbmctbGVmdDowOyJ9KX19fSxpc0hpZGU6ZnVuY3Rpb24o YSl7cmV0dXJuIGEuaGlkZUxhYmVsfHx0aGlzLmNvbnRhaW5lci5oaWRlTGFiZWxz fSxvbkZpZWxkU2hvdzpmdW5jdGlvbihhKXthLmdldEl0ZW1DdCgpLnJlbW92ZUNs YXNzKCJ4LWhpZGUtIithLmhpZGVNb2RlKTtpZihhLmlzQ29tcG9zaXRlKXthLmRv TGF5b3V0KCl9fSxvbkZpZWxkSGlkZTpmdW5jdGlvbihhKXthLmdldEl0ZW1DdCgp LmFkZENsYXNzKCJ4LWhpZGUtIithLmhpZGVNb2RlKX0sZ2V0TGFiZWxTdHlsZTpm dW5jdGlvbihlKXt2YXIgYj0iIixjPVt0aGlzLmxhYmVsU3R5bGUsZV07Zm9yKHZh ciBkPTAsYT1jLmxlbmd0aDtkPGE7KytkKXtpZihjW2RdKXtiKz1jW2RdO2lmKGIu c3Vic3RyKC0xLDEpIT0iOyIpe2IrPSI7In19fXJldHVybiBifSxyZW5kZXJJdGVt OmZ1bmN0aW9uKGUsYSxkKXtpZihlJiYoZS5pc0Zvcm1GaWVsZHx8ZS5maWVsZExh YmVsKSYmZS5pbnB1dFR5cGUhPSJoaWRkZW4iKXt2YXIgYj10aGlzLmdldFRlbXBs YXRlQXJncyhlKTtpZihFeHQuaXNOdW1iZXIoYSkpe2E9ZC5kb20uY2hpbGROb2Rl c1thXXx8bnVsbH1pZihhKXtlLml0ZW1DdD10aGlzLmZpZWxkVHBsLmluc2VydEJl Zm9yZShhLGIsdHJ1ZSl9ZWxzZXtlLml0ZW1DdD10aGlzLmZpZWxkVHBsLmFwcGVu ZChkLGIsdHJ1ZSl9aWYoIWUuZ2V0SXRlbUN0KXtFeHQuYXBwbHkoZSx7Z2V0SXRl bUN0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuaXRlbUN0fSxjdXN0b21JdGVtQ3Q6dHJ1 ZX0pfWUubGFiZWw9ZS5nZXRJdGVtQ3QoKS5jaGlsZCgibGFiZWwueC1mb3JtLWl0 ZW0tbGFiZWwiKTtpZighZS5yZW5kZXJlZCl7ZS5yZW5kZXIoIngtZm9ybS1lbC0i K2UuaWQpfWVsc2V7aWYoIXRoaXMuaXNWYWxpZFBhcmVudChlLGQpKXtFeHQuZmx5 KCJ4LWZvcm0tZWwtIitlLmlkKS5hcHBlbmRDaGlsZChlLmdldFBvc2l0aW9uRWwo KSl9fWlmKHRoaXMudHJhY2tMYWJlbHMpe2lmKGUuaGlkZGVuKXt0aGlzLm9uRmll bGRIaWRlKGUpfWUub24oe3Njb3BlOnRoaXMsc2hvdzp0aGlzLm9uRmllbGRTaG93 LGhpZGU6dGhpcy5vbkZpZWxkSGlkZX0pfXRoaXMuY29uZmlndXJlSXRlbShlKX1l bHNle0V4dC5sYXlvdXQuRm9ybUxheW91dC5zdXBlcmNsYXNzLnJlbmRlckl0ZW0u YXBwbHkodGhpcyxhcmd1bWVudHMpfX0sZ2V0VGVtcGxhdGVBcmdzOmZ1bmN0aW9u KGMpe3ZhciBhPSFjLmZpZWxkTGFiZWx8fGMuaGlkZUxhYmVsLGI9KGMuaXRlbUNs c3x8dGhpcy5jb250YWluZXIuaXRlbUNsc3x8IiIpKyhjLmhpZGVMYWJlbD8iIHgt aGlkZS1sYWJlbCI6IiIpO2lmKEV4dC5pc0lFOSYmRXh0LmlzSUVRdWlya3MmJmMg aW5zdGFuY2VvZiBFeHQuZm9ybS5UZXh0RmllbGQpe2IrPSIgeC1pbnB1dC13cmFw cGVyIn1yZXR1cm57aWQ6Yy5pZCxsYWJlbDpjLmZpZWxkTGFiZWwsaXRlbUNsczpi LGNsZWFyQ2xzOmMuY2xlYXJDbHN8fCJ4LWZvcm0tY2xlYXItbGVmdCIsbGFiZWxT dHlsZTp0aGlzLmdldExhYmVsU3R5bGUoYy5sYWJlbFN0eWxlKSxlbGVtZW50U3R5 bGU6dGhpcy5lbGVtZW50U3R5bGV8fCIiLGxhYmVsU2VwYXJhdG9yOmE/IiI6KEV4 dC5pc0RlZmluZWQoYy5sYWJlbFNlcGFyYXRvcik/Yy5sYWJlbFNlcGFyYXRvcjp0 aGlzLmxhYmVsU2VwYXJhdG9yKX19LGFkanVzdFdpZHRoQW5jaG9yOmZ1bmN0aW9u KGEsZCl7aWYoZC5sYWJlbCYmIXRoaXMuaXNIaWRlKGQpJiYodGhpcy5jb250YWlu ZXIubGFiZWxBbGlnbiE9InRvcCIpKXt2YXIgYj1FeHQuaXNJRTZ8fChFeHQuaXNJ RSYmIUV4dC5pc1N0cmljdCk7cmV0dXJuIGEtdGhpcy5sYWJlbEFkanVzdCsoYj8t MzowKX1yZXR1cm4gYX0sYWRqdXN0SGVpZ2h0QW5jaG9yOmZ1bmN0aW9uKGEsYil7 aWYoYi5sYWJlbCYmIXRoaXMuaXNIaWRlKGIpJiYodGhpcy5jb250YWluZXIubGFi ZWxBbGlnbj09InRvcCIpKXtyZXR1cm4gYS1iLmxhYmVsLmdldEhlaWdodCgpfXJl dHVybiBhfSxpc1ZhbGlkUGFyZW50OmZ1bmN0aW9uKGIsYSl7cmV0dXJuIGEmJnRo aXMuY29udGFpbmVyLmdldEVsKCkuY29udGFpbnMoYi5nZXRQb3NpdGlvbkVsKCkp fX0pO0V4dC5Db250YWluZXIuTEFZT1VUUy5mb3JtPUV4dC5sYXlvdXQuRm9ybUxh eW91dDtFeHQubGF5b3V0LkFjY29yZGlvbkxheW91dD1FeHQuZXh0ZW5kKEV4dC5s YXlvdXQuRml0TGF5b3V0LHtmaWxsOnRydWUsYXV0b1dpZHRoOnRydWUsdGl0bGVD b2xsYXBzZTp0cnVlLGhpZGVDb2xsYXBzZVRvb2w6ZmFsc2UsY29sbGFwc2VGaXJz dDpmYWxzZSxhbmltYXRlOmZhbHNlLHNlcXVlbmNlOmZhbHNlLGFjdGl2ZU9uVG9w OmZhbHNlLHR5cGU6ImFjY29yZGlvbiIscmVuZGVySXRlbTpmdW5jdGlvbihhKXtp Zih0aGlzLmFuaW1hdGU9PT1mYWxzZSl7YS5hbmltQ29sbGFwc2U9ZmFsc2V9YS5j b2xsYXBzaWJsZT10cnVlO2lmKHRoaXMuYXV0b1dpZHRoKXthLmF1dG9XaWR0aD10 cnVlfWlmKHRoaXMudGl0bGVDb2xsYXBzZSl7YS50aXRsZUNvbGxhcHNlPXRydWV9 aWYodGhpcy5oaWRlQ29sbGFwc2VUb29sKXthLmhpZGVDb2xsYXBzZVRvb2w9dHJ1 ZX1pZih0aGlzLmNvbGxhcHNlRmlyc3QhPT11bmRlZmluZWQpe2EuY29sbGFwc2VG aXJzdD10aGlzLmNvbGxhcHNlRmlyc3R9aWYoIXRoaXMuYWN0aXZlSXRlbSYmIWEu Y29sbGFwc2VkKXt0aGlzLnNldEFjdGl2ZUl0ZW0oYSx0cnVlKX1lbHNle2lmKHRo aXMuYWN0aXZlSXRlbSYmdGhpcy5hY3RpdmVJdGVtIT1hKXthLmNvbGxhcHNlZD10 cnVlfX1FeHQubGF5b3V0LkFjY29yZGlvbkxheW91dC5zdXBlcmNsYXNzLnJlbmRl ckl0ZW0uYXBwbHkodGhpcyxhcmd1bWVudHMpO2EuaGVhZGVyLmFkZENsYXNzKCJ4 LWFjY29yZGlvbi1oZCIpO2Eub24oImJlZm9yZWV4cGFuZCIsdGhpcy5iZWZvcmVF eHBhbmQsdGhpcyl9LG9uUmVtb3ZlOmZ1bmN0aW9uKGEpe0V4dC5sYXlvdXQuQWNj b3JkaW9uTGF5b3V0LnN1cGVyY2xhc3Mub25SZW1vdmUuY2FsbCh0aGlzLGEpO2lm KGEucmVuZGVyZWQpe2EuaGVhZGVyLnJlbW92ZUNsYXNzKCJ4LWFjY29yZGlvbi1o ZCIpfWEudW4oImJlZm9yZWV4cGFuZCIsdGhpcy5iZWZvcmVFeHBhbmQsdGhpcyl9 LGJlZm9yZUV4cGFuZDpmdW5jdGlvbihjLGIpe3ZhciBhPXRoaXMuYWN0aXZlSXRl bTtpZihhKXtpZih0aGlzLnNlcXVlbmNlKXtkZWxldGUgdGhpcy5hY3RpdmVJdGVt O2lmKCFhLmNvbGxhcHNlZCl7YS5jb2xsYXBzZSh7Y2FsbGJhY2s6ZnVuY3Rpb24o KXtjLmV4cGFuZChifHx0cnVlKX0sc2NvcGU6dGhpc30pO3JldHVybiBmYWxzZX19 ZWxzZXthLmNvbGxhcHNlKHRoaXMuYW5pbWF0ZSl9fXRoaXMuc2V0QWN0aXZlKGMp O2lmKHRoaXMuYWN0aXZlT25Ub3Ape2MuZWwuZG9tLnBhcmVudE5vZGUuaW5zZXJ0 QmVmb3JlKGMuZWwuZG9tLGMuZWwuZG9tLnBhcmVudE5vZGUuZmlyc3RDaGlsZCl9 dGhpcy5sYXlvdXQoKX0sc2V0SXRlbVNpemU6ZnVuY3Rpb24oZyxlKXtpZih0aGlz LmZpbGwmJmcpe3ZhciBkPTAsYyxiPXRoaXMuZ2V0UmVuZGVyZWRJdGVtcyh0aGlz LmNvbnRhaW5lciksYT1iLmxlbmd0aCxoO2ZvcihjPTA7YzxhO2MrKyl7aWYoKGg9 YltjXSkhPWcmJiFoLmhpZGRlbil7ZCs9aC5oZWFkZXIuZ2V0SGVpZ2h0KCl9fWUu aGVpZ2h0LT1kO2cuc2V0U2l6ZShlKX19LHNldEFjdGl2ZUl0ZW06ZnVuY3Rpb24o YSl7dGhpcy5zZXRBY3RpdmUoYSx0cnVlKX0sc2V0QWN0aXZlOmZ1bmN0aW9uKGMs Yil7dmFyIGE9dGhpcy5hY3RpdmVJdGVtO2M9dGhpcy5jb250YWluZXIuZ2V0Q29t cG9uZW50KGMpO2lmKGEhPWMpe2lmKGMucmVuZGVyZWQmJmMuY29sbGFwc2VkJiZi KXtjLmV4cGFuZCgpfWVsc2V7aWYoYSl7YS5maXJlRXZlbnQoImRlYWN0aXZhdGUi LGEpfXRoaXMuYWN0aXZlSXRlbT1jO2MuZmlyZUV2ZW50KCJhY3RpdmF0ZSIsYyl9 fX19KTtFeHQuQ29udGFpbmVyLkxBWU9VVFMuYWNjb3JkaW9uPUV4dC5sYXlvdXQu QWNjb3JkaW9uTGF5b3V0O0V4dC5sYXlvdXQuQWNjb3JkaW9uPUV4dC5sYXlvdXQu QWNjb3JkaW9uTGF5b3V0O0V4dC5sYXlvdXQuVGFibGVMYXlvdXQ9RXh0LmV4dGVu ZChFeHQubGF5b3V0LkNvbnRhaW5lckxheW91dCx7bW9uaXRvclJlc2l6ZTpmYWxz ZSx0eXBlOiJ0YWJsZSIsdGFyZ2V0Q2xzOiJ4LXRhYmxlLWxheW91dC1jdCIsdGFi bGVBdHRyczpudWxsLHNldENvbnRhaW5lcjpmdW5jdGlvbihhKXtFeHQubGF5b3V0 LlRhYmxlTGF5b3V0LnN1cGVyY2xhc3Muc2V0Q29udGFpbmVyLmNhbGwodGhpcyxh KTt0aGlzLmN1cnJlbnRSb3c9MDt0aGlzLmN1cnJlbnRDb2x1bW49MDt0aGlzLmNl bGxzPVtdfSxvbkxheW91dDpmdW5jdGlvbihkLGcpe3ZhciBlPWQuaXRlbXMuaXRl bXMsYT1lLmxlbmd0aCxoLGI7aWYoIXRoaXMudGFibGUpe2cuYWRkQ2xhc3MoIngt dGFibGUtbGF5b3V0LWN0Iik7dGhpcy50YWJsZT1nLmNyZWF0ZUNoaWxkKEV4dC5h cHBseSh7dGFnOiJ0YWJsZSIsY2xzOiJ4LXRhYmxlLWxheW91dCIsY2VsbHNwYWNp bmc6MCxjbjp7dGFnOiJ0Ym9keSJ9fSx0aGlzLnRhYmxlQXR0cnMpLG51bGwsdHJ1 ZSl9dGhpcy5yZW5kZXJBbGwoZCxnKX0sZ2V0Um93OmZ1bmN0aW9uKGEpe3ZhciBi PXRoaXMudGFibGUudEJvZGllc1swXS5jaGlsZE5vZGVzW2FdO2lmKCFiKXtiPWRv Y3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7dGhpcy50YWJsZS50Qm9kaWVzWzBd LmFwcGVuZENoaWxkKGIpfXJldHVybiBifSxnZXROZXh0Q2VsbDpmdW5jdGlvbihq KXt2YXIgYT10aGlzLmdldE5leHROb25TcGFuKHRoaXMuY3VycmVudENvbHVtbix0 aGlzLmN1cnJlbnRSb3cpO3ZhciBnPXRoaXMuY3VycmVudENvbHVtbj1hWzBdLGU9 dGhpcy5jdXJyZW50Um93PWFbMV07Zm9yKHZhciBpPWU7aTxlKyhqLnJvd3NwYW58 fDEpO2krKyl7aWYoIXRoaXMuY2VsbHNbaV0pe3RoaXMuY2VsbHNbaV09W119Zm9y KHZhciBkPWc7ZDxnKyhqLmNvbHNwYW58fDEpO2QrKyl7dGhpcy5jZWxsc1tpXVtk XT10cnVlfX12YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2lmKGou Y2VsbElkKXtoLmlkPWouY2VsbElkfXZhciBiPSJ4LXRhYmxlLWxheW91dC1jZWxs IjtpZihqLmNlbGxDbHMpe2IrPSIgIitqLmNlbGxDbHN9aC5jbGFzc05hbWU9Yjtp ZihqLmNvbHNwYW4pe2guY29sU3Bhbj1qLmNvbHNwYW59aWYoai5yb3dzcGFuKXto LnJvd1NwYW49ai5yb3dzcGFufXRoaXMuZ2V0Um93KGUpLmFwcGVuZENoaWxkKGgp O3JldHVybiBofSxnZXROZXh0Tm9uU3BhbjpmdW5jdGlvbihhLGMpe3ZhciBiPXRo aXMuY29sdW1uczt3aGlsZSgoYiYmYT49Yil8fCh0aGlzLmNlbGxzW2NdJiZ0aGlz LmNlbGxzW2NdW2FdKSl7aWYoYiYmYT49Yil7YysrO2E9MH1lbHNle2ErK319cmV0 dXJuW2EsY119LHJlbmRlckl0ZW06ZnVuY3Rpb24oZSxhLGQpe2lmKCF0aGlzLnRh YmxlKXt0aGlzLnRhYmxlPWQuY3JlYXRlQ2hpbGQoRXh0LmFwcGx5KHt0YWc6InRh YmxlIixjbHM6IngtdGFibGUtbGF5b3V0IixjZWxsc3BhY2luZzowLGNuOnt0YWc6 InRib2R5In19LHRoaXMudGFibGVBdHRycyksbnVsbCx0cnVlKX1pZihlJiYhZS5y ZW5kZXJlZCl7ZS5yZW5kZXIodGhpcy5nZXROZXh0Q2VsbChlKSk7dGhpcy5jb25m aWd1cmVJdGVtKGUpfWVsc2V7aWYoZSYmIXRoaXMuaXNWYWxpZFBhcmVudChlLGQp KXt2YXIgYj10aGlzLmdldE5leHRDZWxsKGUpO2IuaW5zZXJ0QmVmb3JlKGUuZ2V0 UG9zaXRpb25FbCgpLmRvbSxudWxsKTtlLmNvbnRhaW5lcj1FeHQuZ2V0KGIpO3Ro aXMuY29uZmlndXJlSXRlbShlKX19fSxpc1ZhbGlkUGFyZW50OmZ1bmN0aW9uKGIs YSl7cmV0dXJuIGIuZ2V0UG9zaXRpb25FbCgpLnVwKCJ0YWJsZSIsNSkuZG9tLnBh cmVudE5vZGU9PT0oYS5kb218fGEpfSxkZXN0cm95OmZ1bmN0aW9uKCl7ZGVsZXRl IHRoaXMudGFibGU7RXh0LmxheW91dC5UYWJsZUxheW91dC5zdXBlcmNsYXNzLmRl c3Ryb3kuY2FsbCh0aGlzKX19KTtFeHQuQ29udGFpbmVyLkxBWU9VVFMudGFibGU9 RXh0LmxheW91dC5UYWJsZUxheW91dDtFeHQubGF5b3V0LkFic29sdXRlTGF5b3V0 PUV4dC5leHRlbmQoRXh0LmxheW91dC5BbmNob3JMYXlvdXQse2V4dHJhQ2xzOiJ4 LWFicy1sYXlvdXQtaXRlbSIsdHlwZToiYWJzb2x1dGUiLG9uTGF5b3V0OmZ1bmN0 aW9uKGEsYil7Yi5wb3NpdGlvbigpO3RoaXMucGFkZGluZ0xlZnQ9Yi5nZXRQYWRk aW5nKCJsIik7dGhpcy5wYWRkaW5nVG9wPWIuZ2V0UGFkZGluZygidCIpO0V4dC5s YXlvdXQuQWJzb2x1dGVMYXlvdXQuc3VwZXJjbGFzcy5vbkxheW91dC5jYWxsKHRo aXMsYSxiKX0sYWRqdXN0V2lkdGhBbmNob3I6ZnVuY3Rpb24oYixhKXtyZXR1cm4g Yj9iLWEuZ2V0UG9zaXRpb24odHJ1ZSlbMF0rdGhpcy5wYWRkaW5nTGVmdDpifSxh ZGp1c3RIZWlnaHRBbmNob3I6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYj9iLWEuZ2V0 UG9zaXRpb24odHJ1ZSlbMV0rdGhpcy5wYWRkaW5nVG9wOmJ9fSk7RXh0LkNvbnRh aW5lci5MQVlPVVRTLmFic29sdXRlPUV4dC5sYXlvdXQuQWJzb2x1dGVMYXlvdXQ7 RXh0LmxheW91dC5Cb3hMYXlvdXQ9RXh0LmV4dGVuZChFeHQubGF5b3V0LkNvbnRh aW5lckxheW91dCx7ZGVmYXVsdE1hcmdpbnM6e2xlZnQ6MCx0b3A6MCxyaWdodDow LGJvdHRvbTowfSxwYWRkaW5nOiIwIixwYWNrOiJzdGFydCIsbW9uaXRvclJlc2l6 ZTp0cnVlLHR5cGU6ImJveCIsc2Nyb2xsT2Zmc2V0OjAsZXh0cmFDbHM6IngtYm94 LWl0ZW0iLHRhcmdldENsczoieC1ib3gtbGF5b3V0LWN0Iixpbm5lckNsczoieC1i b3gtaW5uZXIiLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe0V4dC5sYXlvdXQuQm94 TGF5b3V0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO2lmKEV4 dC5pc1N0cmluZyh0aGlzLmRlZmF1bHRNYXJnaW5zKSl7dGhpcy5kZWZhdWx0TWFy Z2lucz10aGlzLnBhcnNlTWFyZ2lucyh0aGlzLmRlZmF1bHRNYXJnaW5zKX12YXIg ZD10aGlzLm92ZXJmbG93SGFuZGxlcjtpZih0eXBlb2YgZD09InN0cmluZyIpe2Q9 e3R5cGU6ZH19dmFyIGM9Im5vbmUiO2lmKGQmJmQudHlwZSE9dW5kZWZpbmVkKXtj PWQudHlwZX12YXIgYj1FeHQubGF5b3V0LmJveE92ZXJmbG93W2NdO2lmKGJbdGhp cy50eXBlXSl7Yj1iW3RoaXMudHlwZV19dGhpcy5vdmVyZmxvd0hhbmRsZXI9bmV3 IGIodGhpcyxkKX0sb25MYXlvdXQ6ZnVuY3Rpb24oYixoKXtFeHQubGF5b3V0LkJv eExheW91dC5zdXBlcmNsYXNzLm9uTGF5b3V0LmNhbGwodGhpcyxiLGgpO3ZhciBk PXRoaXMuZ2V0TGF5b3V0VGFyZ2V0U2l6ZSgpLGk9dGhpcy5nZXRWaXNpYmxlSXRl bXMoYiksYz10aGlzLmNhbGN1bGF0ZUNoaWxkQm94ZXMoaSxkKSxnPWMuYm94ZXMs aj1jLm1ldGE7aWYoZC53aWR0aD4wKXt2YXIgaz10aGlzLm92ZXJmbG93SGFuZGxl cixhPWoudG9vTmFycm93PyJoYW5kbGVPdmVyZmxvdyI6ImNsZWFyT3ZlcmZsb3ci O3ZhciBlPWtbYV0oYyxkKTtpZihlKXtpZihlLnRhcmdldFNpemUpe2Q9ZS50YXJn ZXRTaXplfWlmKGUucmVjYWxjdWxhdGUpe2k9dGhpcy5nZXRWaXNpYmxlSXRlbXMo Yik7Yz10aGlzLmNhbGN1bGF0ZUNoaWxkQm94ZXMoaSxkKTtnPWMuYm94ZXN9fX10 aGlzLmxheW91dFRhcmdldExhc3RTaXplPWQ7dGhpcy5jaGlsZEJveENhY2hlPWM7 dGhpcy51cGRhdGVJbm5lckN0U2l6ZShkLGMpO3RoaXMudXBkYXRlQ2hpbGRCb3hl cyhnKTt0aGlzLmhhbmRsZVRhcmdldE92ZXJmbG93KGQsYixoKX0sdXBkYXRlQ2hp bGRCb3hlczpmdW5jdGlvbihjKXtmb3IodmFyIGI9MCxlPWMubGVuZ3RoO2I8ZTti Kyspe3ZhciBkPWNbYl0sYT1kLmNvbXBvbmVudDtpZihkLmRpcnR5U2l6ZSl7YS5z ZXRTaXplKGQud2lkdGgsZC5oZWlnaHQpfWlmKGlzTmFOKGQubGVmdCl8fGlzTmFO KGQudG9wKSl7Y29udGludWV9YS5zZXRQb3NpdGlvbihkLmxlZnQsZC50b3ApfX0s dXBkYXRlSW5uZXJDdFNpemU6ZnVuY3Rpb24oYyxoKXt2YXIgaT10aGlzLmFsaWdu LGc9dGhpcy5wYWRkaW5nLGU9Yy53aWR0aCxhPWMuaGVpZ2h0O2lmKHRoaXMudHlw ZT09Imhib3giKXt2YXIgYj1lLGQ9aC5tZXRhLm1heEhlaWdodCtnLnRvcCtnLmJv dHRvbTtpZihpPT0ic3RyZXRjaCIpe2Q9YX1lbHNle2lmKGk9PSJtaWRkbGUiKXtk PU1hdGgubWF4KGEsZCl9fX1lbHNle3ZhciBkPWEsYj1oLm1ldGEubWF4V2lkdGgr Zy5sZWZ0K2cucmlnaHQ7aWYoaT09InN0cmV0Y2giKXtiPWV9ZWxzZXtpZihpPT0i Y2VudGVyIil7Yj1NYXRoLm1heChlLGIpfX19dGhpcy5pbm5lckN0LnNldFNpemUo Ynx8dW5kZWZpbmVkLGR8fHVuZGVmaW5lZCl9LGhhbmRsZVRhcmdldE92ZXJmbG93 OmZ1bmN0aW9uKGQsYSxjKXt2YXIgZT1jLmdldFN0eWxlKCJvdmVyZmxvdyIpO2lm KGUmJmUhPSJoaWRkZW4iJiYhdGhpcy5hZGp1c3RtZW50UGFzcyl7dmFyIGI9dGhp cy5nZXRMYXlvdXRUYXJnZXRTaXplKCk7aWYoYi53aWR0aCE9ZC53aWR0aHx8Yi5o ZWlnaHQhPWQuaGVpZ2h0KXt0aGlzLmFkanVzdG1lbnRQYXNzPXRydWU7dGhpcy5v bkxheW91dChhLGMpfX1kZWxldGUgdGhpcy5hZGp1c3RtZW50UGFzc30saXNWYWxp ZFBhcmVudDpmdW5jdGlvbihiLGEpe3JldHVybiB0aGlzLmlubmVyQ3QmJmIuZ2V0 UG9zaXRpb25FbCgpLmRvbS5wYXJlbnROb2RlPT10aGlzLmlubmVyQ3QuZG9tfSxn ZXRWaXNpYmxlSXRlbXM6ZnVuY3Rpb24oZyl7dmFyIGc9Z3x8dGhpcy5jb250YWlu ZXIsZT1nLmdldExheW91dFRhcmdldCgpLGg9Zy5pdGVtcy5pdGVtcyxhPWgubGVu Z3RoLGQsaixiPVtdO2ZvcihkPTA7ZDxhO2QrKyl7aWYoKGo9aFtkXSkucmVuZGVy ZWQmJnRoaXMuaXNWYWxpZFBhcmVudChqLGUpJiZqLmhpZGRlbiE9PXRydWUmJmou Y29sbGFwc2VkIT09dHJ1ZSYmai5zaG91bGRMYXlvdXQhPT1mYWxzZSl7Yi5wdXNo KGopfX1yZXR1cm4gYn0scmVuZGVyQWxsOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMu aW5uZXJDdCl7dGhpcy5pbm5lckN0PWIuY3JlYXRlQ2hpbGQoe2Nsczp0aGlzLmlu bmVyQ2xzfSk7dGhpcy5wYWRkaW5nPXRoaXMucGFyc2VNYXJnaW5zKHRoaXMucGFk ZGluZyl9RXh0LmxheW91dC5Cb3hMYXlvdXQuc3VwZXJjbGFzcy5yZW5kZXJBbGwu Y2FsbCh0aGlzLGEsdGhpcy5pbm5lckN0KX0sZ2V0TGF5b3V0VGFyZ2V0U2l6ZTpm dW5jdGlvbigpe3ZhciBiPXRoaXMuY29udGFpbmVyLmdldExheW91dFRhcmdldCgp LGE7aWYoYil7YT1iLmdldFZpZXdTaXplKCk7aWYoRXh0LmlzSUUmJkV4dC5pc1N0 cmljdCYmYS53aWR0aD09MCl7YT1iLmdldFN0eWxlU2l6ZSgpfWEud2lkdGgtPWIu Z2V0UGFkZGluZygibHIiKTthLmhlaWdodC09Yi5nZXRQYWRkaW5nKCJ0YiIpfXJl dHVybiBhfSxyZW5kZXJJdGVtOmZ1bmN0aW9uKGEpe2lmKEV4dC5pc1N0cmluZyhh Lm1hcmdpbnMpKXthLm1hcmdpbnM9dGhpcy5wYXJzZU1hcmdpbnMoYS5tYXJnaW5z KX1lbHNle2lmKCFhLm1hcmdpbnMpe2EubWFyZ2lucz10aGlzLmRlZmF1bHRNYXJn aW5zfX1FeHQubGF5b3V0LkJveExheW91dC5zdXBlcmNsYXNzLnJlbmRlckl0ZW0u YXBwbHkodGhpcyxhcmd1bWVudHMpfSxkZXN0cm95OmZ1bmN0aW9uKCl7RXh0LmRl c3Ryb3kodGhpcy5vdmVyZmxvd0hhbmRsZXIpO0V4dC5sYXlvdXQuQm94TGF5b3V0 LnN1cGVyY2xhc3MuZGVzdHJveS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSk7RXh0 LmxheW91dC5ib3hPdmVyZmxvdy5Ob25lPUV4dC5leHRlbmQoT2JqZWN0LHtjb25z dHJ1Y3RvcjpmdW5jdGlvbihiLGEpe3RoaXMubGF5b3V0PWI7RXh0LmFwcGx5KHRo aXMsYXx8e30pfSxoYW5kbGVPdmVyZmxvdzpFeHQuZW1wdHlGbixjbGVhck92ZXJm bG93OkV4dC5lbXB0eUZufSk7RXh0LmxheW91dC5ib3hPdmVyZmxvdy5ub25lPUV4 dC5sYXlvdXQuYm94T3ZlcmZsb3cuTm9uZTtFeHQubGF5b3V0LmJveE92ZXJmbG93 Lk1lbnU9RXh0LmV4dGVuZChFeHQubGF5b3V0LmJveE92ZXJmbG93Lk5vbmUse2Fm dGVyQ2xzOiJ4LXN0cmlwLXJpZ2h0Iixub0l0ZW1zTWVudVRleHQ6JzxkaXYgY2xh c3M9IngtdG9vbGJhci1uby1pdGVtcyI+KE5vbmUpPC9kaXY+Jyxjb25zdHJ1Y3Rv cjpmdW5jdGlvbihhKXtFeHQubGF5b3V0LmJveE92ZXJmbG93Lk1lbnUuc3VwZXJj bGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5tZW51 SXRlbXM9W119LGNyZWF0ZUlubmVyRWxlbWVudHM6ZnVuY3Rpb24oKXtpZighdGhp cy5hZnRlckN0KXt0aGlzLmFmdGVyQ3Q9dGhpcy5sYXlvdXQuaW5uZXJDdC5pbnNl cnRTaWJsaW5nKHtjbHM6dGhpcy5hZnRlckNsc30sImJlZm9yZSIpfX0sY2xlYXJP dmVyZmxvdzpmdW5jdGlvbihhLGcpe3ZhciBlPWcud2lkdGgrKHRoaXMuYWZ0ZXJD dD90aGlzLmFmdGVyQ3QuZ2V0V2lkdGgoKTowKSxiPXRoaXMubWVudUl0ZW1zO3Ro aXMuaGlkZVRyaWdnZXIoKTtmb3IodmFyIGM9MCxkPWIubGVuZ3RoO2M8ZDtjKysp e2IucG9wKCkuY29tcG9uZW50LnNob3coKX1yZXR1cm57dGFyZ2V0U2l6ZTp7aGVp Z2h0OmcuaGVpZ2h0LHdpZHRoOmV9fX0sc2hvd1RyaWdnZXI6ZnVuY3Rpb24oKXt0 aGlzLmNyZWF0ZU1lbnUoKTt0aGlzLm1lbnVUcmlnZ2VyLnNob3coKX0saGlkZVRy aWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzLm1lbnVUcmlnZ2VyIT11bmRlZmluZWQp e3RoaXMubWVudVRyaWdnZXIuaGlkZSgpfX0sYmVmb3JlTWVudVNob3c6ZnVuY3Rp b24oaCl7dmFyIGI9dGhpcy5tZW51SXRlbXMsYT1iLmxlbmd0aCxnLGU7dmFyIGM9 ZnVuY3Rpb24oaixpKXtyZXR1cm4gai5pc1hUeXBlKCJidXR0b25ncm91cCIpJiYh KGkgaW5zdGFuY2VvZiBFeHQuVG9vbGJhci5TZXBhcmF0b3IpfTt0aGlzLmNsZWFy TWVudSgpO2gucmVtb3ZlQWxsKCk7Zm9yKHZhciBkPTA7ZDxhO2QrKyl7Zz1iW2Rd LmNvbXBvbmVudDtpZihlJiYoYyhnLGUpfHxjKGUsZykpKXtoLmFkZCgiLSIpfXRo aXMuYWRkQ29tcG9uZW50VG9NZW51KGgsZyk7ZT1nfWlmKGguaXRlbXMubGVuZ3Ro PDEpe2guYWRkKHRoaXMubm9JdGVtc01lbnVUZXh0KX19LGNyZWF0ZU1lbnVDb25m aWc6ZnVuY3Rpb24oYyxhKXt2YXIgYj1FeHQuYXBwbHkoe30sYy5pbml0aWFsQ29u ZmlnKSxkPWMudG9nZ2xlR3JvdXA7RXh0LmNvcHlUbyhiLGMsWyJpY29uQ2xzIiwi aWNvbiIsIml0ZW1JZCIsImRpc2FibGVkIiwiaGFuZGxlciIsInNjb3BlIiwibWVu dSJdKTtFeHQuYXBwbHkoYix7dGV4dDpjLm92ZXJmbG93VGV4dHx8Yy50ZXh0LGhp ZGVPbkNsaWNrOmF9KTtpZihkfHxjLmVuYWJsZVRvZ2dsZSl7RXh0LmFwcGx5KGIs e2dyb3VwOmQsY2hlY2tlZDpjLnByZXNzZWQsbGlzdGVuZXJzOntjaGVja2NoYW5n ZTpmdW5jdGlvbihnLGUpe2MudG9nZ2xlKGUpfX19KX1kZWxldGUgYi5vd25lckN0 O2RlbGV0ZSBiLnh0eXBlO2RlbGV0ZSBiLmlkO3JldHVybiBifSxhZGRDb21wb25l bnRUb01lbnU6ZnVuY3Rpb24oYixhKXtpZihhIGluc3RhbmNlb2YgRXh0LlRvb2xi YXIuU2VwYXJhdG9yKXtiLmFkZCgiLSIpfWVsc2V7aWYoRXh0LmlzRnVuY3Rpb24o YS5pc1hUeXBlKSl7aWYoYS5pc1hUeXBlKCJzcGxpdGJ1dHRvbiIpKXtiLmFkZCh0 aGlzLmNyZWF0ZU1lbnVDb25maWcoYSx0cnVlKSl9ZWxzZXtpZihhLmlzWFR5cGUo ImJ1dHRvbiIpKXtiLmFkZCh0aGlzLmNyZWF0ZU1lbnVDb25maWcoYSwhYS5tZW51 KSl9ZWxzZXtpZihhLmlzWFR5cGUoImJ1dHRvbmdyb3VwIikpe2EuaXRlbXMuZWFj aChmdW5jdGlvbihjKXt0aGlzLmFkZENvbXBvbmVudFRvTWVudShiLGMpfSx0aGlz KX19fX19fSxjbGVhck1lbnU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm1vcmVNZW51 O2lmKGEmJmEuaXRlbXMpe2EuaXRlbXMuZWFjaChmdW5jdGlvbihiKXtkZWxldGUg Yi5tZW51fSl9fSxjcmVhdGVNZW51OmZ1bmN0aW9uKCl7aWYoIXRoaXMubWVudVRy aWdnZXIpe3RoaXMuY3JlYXRlSW5uZXJFbGVtZW50cygpO3RoaXMubWVudT1uZXcg RXh0Lm1lbnUuTWVudSh7b3duZXJDdDp0aGlzLmxheW91dC5jb250YWluZXIsbGlz dGVuZXJzOntzY29wZTp0aGlzLGJlZm9yZXNob3c6dGhpcy5iZWZvcmVNZW51U2hv d319KTt0aGlzLm1lbnVUcmlnZ2VyPW5ldyBFeHQuQnV0dG9uKHtpY29uQ2xzOiJ4 LXRvb2xiYXItbW9yZS1pY29uIixjbHM6IngtdG9vbGJhci1tb3JlIixtZW51OnRo aXMubWVudSxyZW5kZXJUbzp0aGlzLmFmdGVyQ3R9KX19LGRlc3Ryb3k6ZnVuY3Rp b24oKXtFeHQuZGVzdHJveSh0aGlzLm1lbnUsdGhpcy5tZW51VHJpZ2dlcil9fSk7 RXh0LmxheW91dC5ib3hPdmVyZmxvdy5tZW51PUV4dC5sYXlvdXQuYm94T3ZlcmZs b3cuTWVudTtFeHQubGF5b3V0LmJveE92ZXJmbG93Lkhvcml6b250YWxNZW51PUV4 dC5leHRlbmQoRXh0LmxheW91dC5ib3hPdmVyZmxvdy5NZW51LHtjb25zdHJ1Y3Rv cjpmdW5jdGlvbigpe0V4dC5sYXlvdXQuYm94T3ZlcmZsb3cuSG9yaXpvbnRhbE1l bnUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7 dmFyIGM9dGhpcyxiPWMubGF5b3V0LGE9Yi5jYWxjdWxhdGVDaGlsZEJveGVzO2Iu Y2FsY3VsYXRlQ2hpbGRCb3hlcz1mdW5jdGlvbihkLGkpe3ZhciBsPWEuYXBwbHko Yixhcmd1bWVudHMpLGs9bC5tZXRhLGU9Yy5tZW51SXRlbXM7dmFyIGo9MDtmb3Io dmFyIGc9MCxoPWUubGVuZ3RoO2c8aDtnKyspe2orPWVbZ10ud2lkdGh9ay5taW5p bXVtV2lkdGgrPWo7ay50b29OYXJyb3c9ay5taW5pbXVtV2lkdGg+aS53aWR0aDty ZXR1cm4gbH19LGhhbmRsZU92ZXJmbG93OmZ1bmN0aW9uKGQsaCl7dGhpcy5zaG93 VHJpZ2dlcigpO3ZhciBrPWgud2lkdGgtdGhpcy5hZnRlckN0LmdldFdpZHRoKCks bD1kLmJveGVzLGU9MCxyPWZhbHNlO2Zvcih2YXIgbz0wLGM9bC5sZW5ndGg7bzxj O28rKyl7ZSs9bFtvXS53aWR0aH12YXIgYT1rLWUsZz0wO2Zvcih2YXIgbz0wLGM9 dGhpcy5tZW51SXRlbXMubGVuZ3RoO288YztvKyspe3ZhciBuPXRoaXMubWVudUl0 ZW1zW29dLG09bi5jb21wb25lbnQsYj1uLndpZHRoO2lmKGI8YSl7bS5zaG93KCk7 YS09YjtnKys7cj10cnVlfWVsc2V7YnJlYWt9fWlmKHIpe3RoaXMubWVudUl0ZW1z PXRoaXMubWVudUl0ZW1zLnNsaWNlKGcpfWVsc2V7Zm9yKHZhciBqPWwubGVuZ3Ro LTE7aj49MDtqLS0pe3ZhciBxPWxbal0uY29tcG9uZW50LHA9bFtqXS5sZWZ0K2xb al0ud2lkdGg7aWYocD49ayl7dGhpcy5tZW51SXRlbXMudW5zaGlmdCh7Y29tcG9u ZW50OnEsd2lkdGg6bFtqXS53aWR0aH0pO3EuaGlkZSgpfWVsc2V7YnJlYWt9fX1p Zih0aGlzLm1lbnVJdGVtcy5sZW5ndGg9PTApe3RoaXMuaGlkZVRyaWdnZXIoKX1y ZXR1cm57dGFyZ2V0U2l6ZTp7aGVpZ2h0OmguaGVpZ2h0LHdpZHRoOmt9LHJlY2Fs Y3VsYXRlOnJ9fX0pO0V4dC5sYXlvdXQuYm94T3ZlcmZsb3cubWVudS5oYm94PUV4 dC5sYXlvdXQuYm94T3ZlcmZsb3cuSG9yaXpvbnRhbE1lbnU7RXh0LmxheW91dC5i b3hPdmVyZmxvdy5TY3JvbGxlcj1FeHQuZXh0ZW5kKEV4dC5sYXlvdXQuYm94T3Zl cmZsb3cuTm9uZSx7YW5pbWF0ZVNjcm9sbDp0cnVlLHNjcm9sbEluY3JlbWVudDox MDAsd2hlZWxJbmNyZW1lbnQ6MyxzY3JvbGxSZXBlYXRJbnRlcnZhbDo0MDAsc2Ny b2xsRHVyYXRpb246MC40LGJlZm9yZUNsczoieC1zdHJpcC1sZWZ0IixhZnRlckNs czoieC1zdHJpcC1yaWdodCIsc2Nyb2xsZXJDbHM6Ingtc3RyaXAtc2Nyb2xsZXIi LGJlZm9yZVNjcm9sbGVyQ2xzOiJ4LXN0cmlwLXNjcm9sbGVyLWxlZnQiLGFmdGVy U2Nyb2xsZXJDbHM6Ingtc3RyaXAtc2Nyb2xsZXItcmlnaHQiLGNyZWF0ZVdoZWVs TGlzdGVuZXI6ZnVuY3Rpb24oKXt0aGlzLmxheW91dC5pbm5lckN0Lm9uKHtzY29w ZTp0aGlzLG1vdXNld2hlZWw6ZnVuY3Rpb24oYSl7YS5zdG9wRXZlbnQoKTt0aGlz LnNjcm9sbEJ5KGEuZ2V0V2hlZWxEZWx0YSgpKnRoaXMud2hlZWxJbmNyZW1lbnQq LTEsZmFsc2UpfX0pfSxoYW5kbGVPdmVyZmxvdzpmdW5jdGlvbihhLGIpe3RoaXMu Y3JlYXRlSW5uZXJFbGVtZW50cygpO3RoaXMuc2hvd1Njcm9sbGVycygpfSxjbGVh ck92ZXJmbG93OmZ1bmN0aW9uKCl7dGhpcy5oaWRlU2Nyb2xsZXJzKCl9LHNob3dT Y3JvbGxlcnM6ZnVuY3Rpb24oKXt0aGlzLmNyZWF0ZVNjcm9sbGVycygpO3RoaXMu YmVmb3JlU2Nyb2xsZXIuc2hvdygpO3RoaXMuYWZ0ZXJTY3JvbGxlci5zaG93KCk7 dGhpcy51cGRhdGVTY3JvbGxCdXR0b25zKCl9LGhpZGVTY3JvbGxlcnM6ZnVuY3Rp b24oKXtpZih0aGlzLmJlZm9yZVNjcm9sbGVyIT11bmRlZmluZWQpe3RoaXMuYmVm b3JlU2Nyb2xsZXIuaGlkZSgpO3RoaXMuYWZ0ZXJTY3JvbGxlci5oaWRlKCl9fSxj cmVhdGVTY3JvbGxlcnM6ZnVuY3Rpb24oKXtpZighdGhpcy5iZWZvcmVTY3JvbGxl ciYmIXRoaXMuYWZ0ZXJTY3JvbGxlcil7dmFyIGE9dGhpcy5iZWZvcmVDdC5jcmVh dGVDaGlsZCh7Y2xzOlN0cmluZy5mb3JtYXQoInswfSB7MX0gIix0aGlzLnNjcm9s bGVyQ2xzLHRoaXMuYmVmb3JlU2Nyb2xsZXJDbHMpfSk7dmFyIGI9dGhpcy5hZnRl ckN0LmNyZWF0ZUNoaWxkKHtjbHM6U3RyaW5nLmZvcm1hdCgiezB9IHsxfSIsdGhp cy5zY3JvbGxlckNscyx0aGlzLmFmdGVyU2Nyb2xsZXJDbHMpfSk7YS5hZGRDbGFz c09uT3Zlcih0aGlzLmJlZm9yZVNjcm9sbGVyQ2xzKyItaG92ZXIiKTtiLmFkZENs YXNzT25PdmVyKHRoaXMuYWZ0ZXJTY3JvbGxlckNscysiLWhvdmVyIik7YS5zZXRW aXNpYmlsaXR5TW9kZShFeHQuRWxlbWVudC5ESVNQTEFZKTtiLnNldFZpc2liaWxp dHlNb2RlKEV4dC5FbGVtZW50LkRJU1BMQVkpO3RoaXMuYmVmb3JlUmVwZWF0ZXI9 bmV3IEV4dC51dGlsLkNsaWNrUmVwZWF0ZXIoYSx7aW50ZXJ2YWw6dGhpcy5zY3Jv bGxSZXBlYXRJbnRlcnZhbCxoYW5kbGVyOnRoaXMuc2Nyb2xsTGVmdCxzY29wZTp0 aGlzfSk7dGhpcy5hZnRlclJlcGVhdGVyPW5ldyBFeHQudXRpbC5DbGlja1JlcGVh dGVyKGIse2ludGVydmFsOnRoaXMuc2Nyb2xsUmVwZWF0SW50ZXJ2YWwsaGFuZGxl cjp0aGlzLnNjcm9sbFJpZ2h0LHNjb3BlOnRoaXN9KTt0aGlzLmJlZm9yZVNjcm9s bGVyPWE7dGhpcy5hZnRlclNjcm9sbGVyPWJ9fSxkZXN0cm95OmZ1bmN0aW9uKCl7 RXh0LmRlc3Ryb3kodGhpcy5iZWZvcmVTY3JvbGxlcix0aGlzLmFmdGVyU2Nyb2xs ZXIsdGhpcy5iZWZvcmVSZXBlYXRlcix0aGlzLmFmdGVyUmVwZWF0ZXIsdGhpcy5i ZWZvcmVDdCx0aGlzLmFmdGVyQ3QpfSxzY3JvbGxCeTpmdW5jdGlvbihiLGEpe3Ro aXMuc2Nyb2xsVG8odGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpK2IsYSl9LGdldEl0 ZW06ZnVuY3Rpb24oYSl7aWYoRXh0LmlzU3RyaW5nKGEpKXthPUV4dC5nZXRDbXAo YSl9ZWxzZXtpZihFeHQuaXNOdW1iZXIoYSkpe2E9dGhpcy5pdGVtc1thXX19cmV0 dXJuIGF9LGdldFNjcm9sbEFuaW06ZnVuY3Rpb24oKXtyZXR1cm57ZHVyYXRpb246 dGhpcy5zY3JvbGxEdXJhdGlvbixjYWxsYmFjazp0aGlzLnVwZGF0ZVNjcm9sbEJ1 dHRvbnMsc2NvcGU6dGhpc319LHVwZGF0ZVNjcm9sbEJ1dHRvbnM6ZnVuY3Rpb24o KXtpZih0aGlzLmJlZm9yZVNjcm9sbGVyPT11bmRlZmluZWR8fHRoaXMuYWZ0ZXJT Y3JvbGxlcj09dW5kZWZpbmVkKXtyZXR1cm59dmFyIGQ9dGhpcy5hdEV4dHJlbWVC ZWZvcmUoKT8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyIsYz10aGlzLmF0RXh0cmVt ZUFmdGVyKCk/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiLGE9dGhpcy5iZWZvcmVT Y3JvbGxlckNscysiLWRpc2FibGVkIixiPXRoaXMuYWZ0ZXJTY3JvbGxlckNscysi LWRpc2FibGVkIjt0aGlzLmJlZm9yZVNjcm9sbGVyW2RdKGEpO3RoaXMuYWZ0ZXJT Y3JvbGxlcltjXShiKTt0aGlzLnNjcm9sbGluZz1mYWxzZX0sYXRFeHRyZW1lQmVm b3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U2Nyb2xsUG9zaXRpb24oKT09 PTB9LHNjcm9sbExlZnQ6ZnVuY3Rpb24oYSl7dGhpcy5zY3JvbGxCeSgtdGhpcy5z Y3JvbGxJbmNyZW1lbnQsYSl9LHNjcm9sbFJpZ2h0OmZ1bmN0aW9uKGEpe3RoaXMu c2Nyb2xsQnkodGhpcy5zY3JvbGxJbmNyZW1lbnQsYSl9LHNjcm9sbFRvSXRlbTpm dW5jdGlvbihkLGIpe2Q9dGhpcy5nZXRJdGVtKGQpO2lmKGQhPXVuZGVmaW5lZCl7 dmFyIGE9dGhpcy5nZXRJdGVtVmlzaWJpbGl0eShkKTtpZighYS5mdWxseVZpc2li bGUpe3ZhciBjPWQuZ2V0Qm94KHRydWUsdHJ1ZSksZT1jLng7aWYoYS5oaWRkZW5S aWdodCl7ZS09KHRoaXMubGF5b3V0LmlubmVyQ3QuZ2V0V2lkdGgoKS1jLndpZHRo KX10aGlzLnNjcm9sbFRvKGUsYil9fX0sZ2V0SXRlbVZpc2liaWxpdHk6ZnVuY3Rp b24oZSl7dmFyIGQ9dGhpcy5nZXRJdGVtKGUpLmdldEJveCh0cnVlLHRydWUpLGE9 ZC54LGM9ZC54K2Qud2lkdGgsZz10aGlzLmdldFNjcm9sbFBvc2l0aW9uKCksYj10 aGlzLmxheW91dC5pbm5lckN0LmdldFdpZHRoKCkrZztyZXR1cm57aGlkZGVuTGVm dDphPGcsaGlkZGVuUmlnaHQ6Yz5iLGZ1bGx5VmlzaWJsZTphPmcmJmM8Yn19fSk7 RXh0LmxheW91dC5ib3hPdmVyZmxvdy5zY3JvbGxlcj1FeHQubGF5b3V0LmJveE92 ZXJmbG93LlNjcm9sbGVyO0V4dC5sYXlvdXQuYm94T3ZlcmZsb3cuVmVydGljYWxT Y3JvbGxlcj1FeHQuZXh0ZW5kKEV4dC5sYXlvdXQuYm94T3ZlcmZsb3cuU2Nyb2xs ZXIse3Njcm9sbEluY3JlbWVudDo3NSx3aGVlbEluY3JlbWVudDoyLGhhbmRsZU92 ZXJmbG93OmZ1bmN0aW9uKGEsYil7RXh0LmxheW91dC5ib3hPdmVyZmxvdy5WZXJ0 aWNhbFNjcm9sbGVyLnN1cGVyY2xhc3MuaGFuZGxlT3ZlcmZsb3cuYXBwbHkodGhp cyxhcmd1bWVudHMpO3JldHVybnt0YXJnZXRTaXplOntoZWlnaHQ6Yi5oZWlnaHQt KHRoaXMuYmVmb3JlQ3QuZ2V0SGVpZ2h0KCkrdGhpcy5hZnRlckN0LmdldEhlaWdo dCgpKSx3aWR0aDpiLndpZHRofX19LGNyZWF0ZUlubmVyRWxlbWVudHM6ZnVuY3Rp b24oKXt2YXIgYT10aGlzLmxheW91dC5pbm5lckN0O2lmKCF0aGlzLmJlZm9yZUN0 KXt0aGlzLmJlZm9yZUN0PWEuaW5zZXJ0U2libGluZyh7Y2xzOnRoaXMuYmVmb3Jl Q2xzfSwiYmVmb3JlIik7dGhpcy5hZnRlckN0PWEuaW5zZXJ0U2libGluZyh7Y2xz OnRoaXMuYWZ0ZXJDbHN9LCJhZnRlciIpO3RoaXMuY3JlYXRlV2hlZWxMaXN0ZW5l cigpfX0sc2Nyb2xsVG86ZnVuY3Rpb24oYSxiKXt2YXIgZD10aGlzLmdldFNjcm9s bFBvc2l0aW9uKCksYz1hLmNvbnN0cmFpbigwLHRoaXMuZ2V0TWF4U2Nyb2xsQm90 dG9tKCkpO2lmKGMhPWQmJiF0aGlzLnNjcm9sbGluZyl7aWYoYj09dW5kZWZpbmVk KXtiPXRoaXMuYW5pbWF0ZVNjcm9sbH10aGlzLmxheW91dC5pbm5lckN0LnNjcm9s bFRvKCJ0b3AiLGMsYj90aGlzLmdldFNjcm9sbEFuaW0oKTpmYWxzZSk7aWYoYil7 dGhpcy5zY3JvbGxpbmc9dHJ1ZX1lbHNle3RoaXMuc2Nyb2xsaW5nPWZhbHNlO3Ro aXMudXBkYXRlU2Nyb2xsQnV0dG9ucygpfX19LGdldFNjcm9sbFBvc2l0aW9uOmZ1 bmN0aW9uKCl7cmV0dXJuIHBhcnNlSW50KHRoaXMubGF5b3V0LmlubmVyQ3QuZG9t LnNjcm9sbFRvcCwxMCl8fDB9LGdldE1heFNjcm9sbEJvdHRvbTpmdW5jdGlvbigp e3JldHVybiB0aGlzLmxheW91dC5pbm5lckN0LmRvbS5zY3JvbGxIZWlnaHQtdGhp cy5sYXlvdXQuaW5uZXJDdC5nZXRIZWlnaHQoKX0sYXRFeHRyZW1lQWZ0ZXI6ZnVu Y3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpPj10aGlzLmdl dE1heFNjcm9sbEJvdHRvbSgpfX0pO0V4dC5sYXlvdXQuYm94T3ZlcmZsb3cuc2Ny b2xsZXIudmJveD1FeHQubGF5b3V0LmJveE92ZXJmbG93LlZlcnRpY2FsU2Nyb2xs ZXI7RXh0LmxheW91dC5ib3hPdmVyZmxvdy5Ib3Jpem9udGFsU2Nyb2xsZXI9RXh0 LmV4dGVuZChFeHQubGF5b3V0LmJveE92ZXJmbG93LlNjcm9sbGVyLHtoYW5kbGVP dmVyZmxvdzpmdW5jdGlvbihhLGIpe0V4dC5sYXlvdXQuYm94T3ZlcmZsb3cuSG9y aXpvbnRhbFNjcm9sbGVyLnN1cGVyY2xhc3MuaGFuZGxlT3ZlcmZsb3cuYXBwbHko dGhpcyxhcmd1bWVudHMpO3JldHVybnt0YXJnZXRTaXplOntoZWlnaHQ6Yi5oZWln aHQsd2lkdGg6Yi53aWR0aC0odGhpcy5iZWZvcmVDdC5nZXRXaWR0aCgpK3RoaXMu YWZ0ZXJDdC5nZXRXaWR0aCgpKX19fSxjcmVhdGVJbm5lckVsZW1lbnRzOmZ1bmN0 aW9uKCl7dmFyIGE9dGhpcy5sYXlvdXQuaW5uZXJDdDtpZighdGhpcy5iZWZvcmVD dCl7dGhpcy5hZnRlckN0PWEuaW5zZXJ0U2libGluZyh7Y2xzOnRoaXMuYWZ0ZXJD bHN9LCJiZWZvcmUiKTt0aGlzLmJlZm9yZUN0PWEuaW5zZXJ0U2libGluZyh7Y2xz OnRoaXMuYmVmb3JlQ2xzfSwiYmVmb3JlIik7dGhpcy5jcmVhdGVXaGVlbExpc3Rl bmVyKCl9fSxzY3JvbGxUbzpmdW5jdGlvbihhLGIpe3ZhciBkPXRoaXMuZ2V0U2Ny b2xsUG9zaXRpb24oKSxjPWEuY29uc3RyYWluKDAsdGhpcy5nZXRNYXhTY3JvbGxS aWdodCgpKTtpZihjIT1kJiYhdGhpcy5zY3JvbGxpbmcpe2lmKGI9PXVuZGVmaW5l ZCl7Yj10aGlzLmFuaW1hdGVTY3JvbGx9dGhpcy5sYXlvdXQuaW5uZXJDdC5zY3Jv bGxUbygibGVmdCIsYyxiP3RoaXMuZ2V0U2Nyb2xsQW5pbSgpOmZhbHNlKTtpZihi KXt0aGlzLnNjcm9sbGluZz10cnVlfWVsc2V7dGhpcy5zY3JvbGxpbmc9ZmFsc2U7 dGhpcy51cGRhdGVTY3JvbGxCdXR0b25zKCl9fX0sZ2V0U2Nyb2xsUG9zaXRpb246 ZnVuY3Rpb24oKXtyZXR1cm4gcGFyc2VJbnQodGhpcy5sYXlvdXQuaW5uZXJDdC5k b20uc2Nyb2xsTGVmdCwxMCl8fDB9LGdldE1heFNjcm9sbFJpZ2h0OmZ1bmN0aW9u KCl7cmV0dXJuIHRoaXMubGF5b3V0LmlubmVyQ3QuZG9tLnNjcm9sbFdpZHRoLXRo aXMubGF5b3V0LmlubmVyQ3QuZ2V0V2lkdGgoKX0sYXRFeHRyZW1lQWZ0ZXI6ZnVu Y3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpPj10aGlzLmdl dE1heFNjcm9sbFJpZ2h0KCl9fSk7RXh0LmxheW91dC5ib3hPdmVyZmxvdy5zY3Jv bGxlci5oYm94PUV4dC5sYXlvdXQuYm94T3ZlcmZsb3cuSG9yaXpvbnRhbFNjcm9s bGVyO0V4dC5sYXlvdXQuSEJveExheW91dD1FeHQuZXh0ZW5kKEV4dC5sYXlvdXQu Qm94TGF5b3V0LHthbGlnbjoidG9wIix0eXBlOiJoYm94IixjYWxjdWxhdGVDaGls ZEJveGVzOmZ1bmN0aW9uKHIsYil7dmFyIEY9ci5sZW5ndGgsUj10aGlzLnBhZGRp bmcsRD1SLnRvcCxVPVIubGVmdCx5PUQrUi5ib3R0b20sTz1VK1IucmlnaHQsYT1i LndpZHRoLXRoaXMuc2Nyb2xsT2Zmc2V0LGU9Yi5oZWlnaHQsbz1NYXRoLm1heCgw LGUteSksUD10aGlzLnBhY2s9PSJzdGFydCIsVz10aGlzLnBhY2s9PSJjZW50ZXIi LEE9dGhpcy5wYWNrPT0iZW5kIixMPTAsUT0wLFQ9MCxsPTAsWD0wLEg9W10sayxK LE0sVix3LGosUyxJLGMseCxxLE47Zm9yKFM9MDtTPEY7UysrKXtrPXJbU107TT1r LmhlaWdodDtKPWsud2lkdGg7aj0hay5oYXNMYXlvdXQmJnR5cGVvZiBrLmRvTGF5 b3V0PT0iZnVuY3Rpb24iO2lmKHR5cGVvZiBKIT0ibnVtYmVyIil7aWYoay5mbGV4 JiYhSil7VCs9ay5mbGV4fWVsc2V7aWYoIUomJmope2suZG9MYXlvdXQoKX1WPWsu Z2V0U2l6ZSgpO0o9Vi53aWR0aDtNPVYuaGVpZ2h0fX13PWsubWFyZ2luczt4PXcu bGVmdCt3LnJpZ2h0O0wrPXgrKEp8fDApO2wrPXgrKGsuZmxleD9rLm1pbldpZHRo fHwwOkopO1grPXgrKGsubWluV2lkdGh8fEp8fDApO2lmKHR5cGVvZiBNIT0ibnVt YmVyIil7aWYoail7ay5kb0xheW91dCgpfU09ay5nZXRIZWlnaHQoKX1RPU1hdGgu bWF4KFEsTSt3LnRvcCt3LmJvdHRvbSk7SC5wdXNoKHtjb21wb25lbnQ6ayxoZWln aHQ6TXx8dW5kZWZpbmVkLHdpZHRoOkp8fHVuZGVmaW5lZH0pfXZhciBLPWwtYSxw PVg+YTt2YXIgbj1NYXRoLm1heCgwLGEtTC1PKTtpZihwKXtmb3IoUz0wO1M8RjtT Kyspe0hbU10ud2lkdGg9cltTXS5taW5XaWR0aHx8cltTXS53aWR0aHx8SFtTXS53 aWR0aH19ZWxzZXtpZihLPjApe3ZhciBDPVtdO2Zvcih2YXIgRT0wLHY9RjtFPHY7 RSsrKXt2YXIgQj1yW0VdLHQ9Qi5taW5XaWR0aHx8MDtpZihCLmZsZXgpe0hbRV0u d2lkdGg9dH1lbHNle0MucHVzaCh7bWluV2lkdGg6dCxhdmFpbGFibGU6SFtFXS53 aWR0aC10LGluZGV4OkV9KX19Qy5zb3J0KGZ1bmN0aW9uKFksaSl7cmV0dXJuIFku YXZhaWxhYmxlPmkuYXZhaWxhYmxlPzE6LTF9KTtmb3IodmFyIFM9MCx2PUMubGVu Z3RoO1M8djtTKyspe3ZhciBHPUNbU10uaW5kZXg7aWYoRz09dW5kZWZpbmVkKXtj b250aW51ZX12YXIgQj1yW0ddLG09SFtHXSx1PW0ud2lkdGgsdD1CLm1pbldpZHRo LGQ9TWF0aC5tYXgodCx1LU1hdGguY2VpbChLLyh2LVMpKSksZz11LWQ7SFtHXS53 aWR0aD1kO0stPWd9fWVsc2V7dmFyIGg9bixzPVQ7Zm9yKFM9MDtTPEY7UysrKXtr PXJbU107ST1IW1NdO3c9ay5tYXJnaW5zO3E9dy50b3Ardy5ib3R0b207aWYoUCYm ay5mbGV4JiYhay53aWR0aCl7Yz1NYXRoLmNlaWwoKGsuZmxleC9zKSpoKTtoLT1j O3MtPWsuZmxleDtJLndpZHRoPWM7SS5kaXJ0eVNpemU9dHJ1ZX19fX1pZihXKXtV Kz1uLzJ9ZWxzZXtpZihBKXtVKz1ufX1mb3IoUz0wO1M8RjtTKyspe2s9cltTXTtJ PUhbU107dz1rLm1hcmdpbnM7VSs9dy5sZWZ0O3E9dy50b3Ardy5ib3R0b207SS5s ZWZ0PVU7SS50b3A9RCt3LnRvcDtzd2l0Y2godGhpcy5hbGlnbil7Y2FzZSJzdHJl dGNoIjpOPW8tcTtJLmhlaWdodD1OLmNvbnN0cmFpbihrLm1pbkhlaWdodHx8MCxr Lm1heEhlaWdodHx8MTAwMDAwMCk7SS5kaXJ0eVNpemU9dHJ1ZTticmVhaztjYXNl InN0cmV0Y2htYXgiOk49US1xO0kuaGVpZ2h0PU4uY29uc3RyYWluKGsubWluSGVp Z2h0fHwwLGsubWF4SGVpZ2h0fHwxMDAwMDAwKTtJLmRpcnR5U2l6ZT10cnVlO2Jy ZWFrO2Nhc2UibWlkZGxlIjp2YXIgej1vLUkuaGVpZ2h0LXE7aWYoej4wKXtJLnRv cD1EK3ErKHovMil9fVUrPUkud2lkdGgrdy5yaWdodH1yZXR1cm57Ym94ZXM6SCxt ZXRhOnttYXhIZWlnaHQ6USxub25GbGV4V2lkdGg6TCxkZXNpcmVkV2lkdGg6bCxt aW5pbXVtV2lkdGg6WCxzaG9ydGZhbGw6bC1hLHRvb05hcnJvdzpwfX19fSk7RXh0 LkNvbnRhaW5lci5MQVlPVVRTLmhib3g9RXh0LmxheW91dC5IQm94TGF5b3V0O0V4 dC5sYXlvdXQuVkJveExheW91dD1FeHQuZXh0ZW5kKEV4dC5sYXlvdXQuQm94TGF5 b3V0LHthbGlnbjoibGVmdCIsdHlwZToidmJveCIsY2FsY3VsYXRlQ2hpbGRCb3hl czpmdW5jdGlvbihvLGIpe3ZhciBFPW8ubGVuZ3RoLFI9dGhpcy5wYWRkaW5nLEM9 Ui50b3AsVj1SLmxlZnQseD1DK1IuYm90dG9tLE89VitSLnJpZ2h0LGE9Yi53aWR0 aC10aGlzLnNjcm9sbE9mZnNldCxjPWIuaGVpZ2h0LEs9TWF0aC5tYXgoMCxhLU8p LFA9dGhpcy5wYWNrPT0ic3RhcnQiLFg9dGhpcy5wYWNrPT0iY2VudGVyIix6PXRo aXMucGFjaz09ImVuZCIsaz0wLHU9MCxVPTAsTD0wLG09MCxHPVtdLGgsSSxOLFcs dCxnLFQsSCxTLHcsbixkLHI7Zm9yKFQ9MDtUPEU7VCsrKXtoPW9bVF07Tj1oLmhl aWdodDtJPWgud2lkdGg7Zz0haC5oYXNMYXlvdXQmJnR5cGVvZiBoLmRvTGF5b3V0 PT0iZnVuY3Rpb24iO2lmKHR5cGVvZiBOIT0ibnVtYmVyIil7aWYoaC5mbGV4JiYh Til7VSs9aC5mbGV4fWVsc2V7aWYoIU4mJmcpe2guZG9MYXlvdXQoKX1XPWguZ2V0 U2l6ZSgpO0k9Vy53aWR0aDtOPVcuaGVpZ2h0fX10PWgubWFyZ2lucztuPXQudG9w K3QuYm90dG9tO2srPW4rKE58fDApO0wrPW4rKGguZmxleD9oLm1pbkhlaWdodHx8 MDpOKTttKz1uKyhoLm1pbkhlaWdodHx8Tnx8MCk7aWYodHlwZW9mIEkhPSJudW1i ZXIiKXtpZihnKXtoLmRvTGF5b3V0KCl9ST1oLmdldFdpZHRoKCl9dT1NYXRoLm1h eCh1LEkrdC5sZWZ0K3QucmlnaHQpO0cucHVzaCh7Y29tcG9uZW50OmgsaGVpZ2h0 Ok58fHVuZGVmaW5lZCx3aWR0aDpJfHx1bmRlZmluZWR9KX12YXIgTT1MLWMsbD1t PmM7dmFyIHE9TWF0aC5tYXgoMCwoYy1rLXgpKTtpZihsKXtmb3IoVD0wLHI9RTtU PHI7VCsrKXtHW1RdLmhlaWdodD1vW1RdLm1pbkhlaWdodHx8b1tUXS5oZWlnaHR8 fEdbVF0uaGVpZ2h0fX1lbHNle2lmKE0+MCl7dmFyIEo9W107Zm9yKHZhciBEPTAs cj1FO0Q8cjtEKyspe3ZhciBBPW9bRF0scz1BLm1pbkhlaWdodHx8MDtpZihBLmZs ZXgpe0dbRF0uaGVpZ2h0PXN9ZWxzZXtKLnB1c2goe21pbkhlaWdodDpzLGF2YWls YWJsZTpHW0RdLmhlaWdodC1zLGluZGV4OkR9KX19Si5zb3J0KGZ1bmN0aW9uKFks aSl7cmV0dXJuIFkuYXZhaWxhYmxlPmkuYXZhaWxhYmxlPzE6LTF9KTtmb3IodmFy IFQ9MCxyPUoubGVuZ3RoO1Q8cjtUKyspe3ZhciBGPUpbVF0uaW5kZXg7aWYoRj09 dW5kZWZpbmVkKXtjb250aW51ZX12YXIgQT1vW0ZdLGo9R1tGXSx2PWouaGVpZ2h0 LHM9QS5taW5IZWlnaHQsQj1NYXRoLm1heChzLHYtTWF0aC5jZWlsKE0vKHItVCkp KSxlPXYtQjtHW0ZdLmhlaWdodD1CO00tPWV9fWVsc2V7dmFyIFE9cSxwPVU7Zm9y KFQ9MDtUPEU7VCsrKXtoPW9bVF07SD1HW1RdO3Q9aC5tYXJnaW5zO3c9dC5sZWZ0 K3QucmlnaHQ7aWYoUCYmaC5mbGV4JiYhaC5oZWlnaHQpe1M9TWF0aC5jZWlsKCho LmZsZXgvcCkqUSk7US09UztwLT1oLmZsZXg7SC5oZWlnaHQ9UztILmRpcnR5U2l6 ZT10cnVlfX19fWlmKFgpe0MrPXEvMn1lbHNle2lmKHope0MrPXF9fWZvcihUPTA7 VDxFO1QrKyl7aD1vW1RdO0g9R1tUXTt0PWgubWFyZ2lucztDKz10LnRvcDt3PXQu bGVmdCt0LnJpZ2h0O0gubGVmdD1WK3QubGVmdDtILnRvcD1DO3N3aXRjaCh0aGlz LmFsaWduKXtjYXNlInN0cmV0Y2giOmQ9Sy13O0gud2lkdGg9ZC5jb25zdHJhaW4o aC5taW5XaWR0aHx8MCxoLm1heFdpZHRofHwxMDAwMDAwKTtILmRpcnR5U2l6ZT10 cnVlO2JyZWFrO2Nhc2Uic3RyZXRjaG1heCI6ZD11LXc7SC53aWR0aD1kLmNvbnN0 cmFpbihoLm1pbldpZHRofHwwLGgubWF4V2lkdGh8fDEwMDAwMDApO0guZGlydHlT aXplPXRydWU7YnJlYWs7Y2FzZSJjZW50ZXIiOnZhciB5PUstSC53aWR0aC13O2lm KHk+MCl7SC5sZWZ0PVYrdysoeS8yKX19Qys9SC5oZWlnaHQrdC5ib3R0b219cmV0 dXJue2JveGVzOkcsbWV0YTp7bWF4V2lkdGg6dSxub25GbGV4SGVpZ2h0OmssZGVz aXJlZEhlaWdodDpMLG1pbmltdW1IZWlnaHQ6bSxzaG9ydGZhbGw6TC1jLHRvb05h cnJvdzpsfX19fSk7RXh0LkNvbnRhaW5lci5MQVlPVVRTLnZib3g9RXh0LmxheW91 dC5WQm94TGF5b3V0O0V4dC5sYXlvdXQuVG9vbGJhckxheW91dD1FeHQuZXh0ZW5k KEV4dC5sYXlvdXQuQ29udGFpbmVyTGF5b3V0LHttb25pdG9yUmVzaXplOnRydWUs dHlwZToidG9vbGJhciIsdHJpZ2dlcldpZHRoOjE4LG5vSXRlbXNNZW51VGV4dDon PGRpdiBjbGFzcz0ieC10b29sYmFyLW5vLWl0ZW1zIj4oTm9uZSk8L2Rpdj4nLGxh c3RPdmVyZmxvdzpmYWxzZSx0YWJsZUhUTUw6Wyc8dGFibGUgY2VsbHNwYWNpbmc9 IjAiIGNsYXNzPSJ4LXRvb2xiYXItY3QiPicsIjx0Ym9keT4iLCI8dHI+IiwnPHRk IGNsYXNzPSJ4LXRvb2xiYXItbGVmdCIgYWxpZ249InswfSI+JywnPHRhYmxlIGNl bGxzcGFjaW5nPSIwIj4nLCI8dGJvZHk+IiwnPHRyIGNsYXNzPSJ4LXRvb2xiYXIt bGVmdC1yb3ciPjwvdHI+JywiPC90Ym9keT4iLCI8L3RhYmxlPiIsIjwvdGQ+Iiwn PHRkIGNsYXNzPSJ4LXRvb2xiYXItcmlnaHQiIGFsaWduPSJyaWdodCI+JywnPHRh YmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ieC10b29sYmFyLXJpZ2h0LWN0Ij4n LCI8dGJvZHk+IiwiPHRyPiIsIjx0ZD4iLCc8dGFibGUgY2VsbHNwYWNpbmc9IjAi PicsIjx0Ym9keT4iLCc8dHIgY2xhc3M9IngtdG9vbGJhci1yaWdodC1yb3ciPjwv dHI+JywiPC90Ym9keT4iLCI8L3RhYmxlPiIsIjwvdGQ+IiwiPHRkPiIsJzx0YWJs ZSBjZWxsc3BhY2luZz0iMCI+JywiPHRib2R5PiIsJzx0ciBjbGFzcz0ieC10b29s YmFyLWV4dHJhcy1yb3ciPjwvdHI+JywiPC90Ym9keT4iLCI8L3RhYmxlPiIsIjwv dGQ+IiwiPC90cj4iLCI8L3Rib2R5PiIsIjwvdGFibGU+IiwiPC90ZD4iLCI8L3Ry PiIsIjwvdGJvZHk+IiwiPC90YWJsZT4iXS5qb2luKCIiKSxvbkxheW91dDpmdW5j dGlvbihlLGope2lmKCF0aGlzLmxlZnRUcil7dmFyIGg9ZS5idXR0b25BbGlnbj09 ImNlbnRlciI/ImNlbnRlciI6ImxlZnQiO2ouYWRkQ2xhc3MoIngtdG9vbGJhci1s YXlvdXQtY3QiKTtqLmluc2VydEh0bWwoImJlZm9yZUVuZCIsU3RyaW5nLmZvcm1h dCh0aGlzLnRhYmxlSFRNTCxoKSk7dGhpcy5sZWZ0VHI9ai5jaGlsZCgidHIueC10 b29sYmFyLWxlZnQtcm93Iix0cnVlKTt0aGlzLnJpZ2h0VHI9ai5jaGlsZCgidHIu eC10b29sYmFyLXJpZ2h0LXJvdyIsdHJ1ZSk7dGhpcy5leHRyYXNUcj1qLmNoaWxk KCJ0ci54LXRvb2xiYXItZXh0cmFzLXJvdyIsdHJ1ZSk7aWYodGhpcy5oaWRkZW5J dGVtPT11bmRlZmluZWQpe3RoaXMuaGlkZGVuSXRlbXM9W119fXZhciBrPWUuYnV0 dG9uQWxpZ249PSJyaWdodCI/dGhpcy5yaWdodFRyOnRoaXMubGVmdFRyLGw9ZS5p dGVtcy5pdGVtcyxkPTA7Zm9yKHZhciBiPTAsZz1sLmxlbmd0aCxtO2I8ZztiKyss ZCsrKXttPWxbYl07aWYobS5pc0ZpbGwpe2s9dGhpcy5yaWdodFRyO2Q9LTF9ZWxz ZXtpZighbS5yZW5kZXJlZCl7bS5yZW5kZXIodGhpcy5pbnNlcnRDZWxsKG0sayxk KSk7dGhpcy5jb25maWd1cmVJdGVtKG0pfWVsc2V7aWYoIW0ueHRiSGlkZGVuJiYh dGhpcy5pc1ZhbGlkUGFyZW50KG0say5jaGlsZE5vZGVzW2RdKSl7dmFyIGE9dGhp cy5pbnNlcnRDZWxsKG0sayxkKTthLmFwcGVuZENoaWxkKG0uZ2V0UG9zaXRpb25F bCgpLmRvbSk7bS5jb250YWluZXI9RXh0LmdldChhKX19fX10aGlzLmNsZWFudXAo dGhpcy5sZWZ0VHIpO3RoaXMuY2xlYW51cCh0aGlzLnJpZ2h0VHIpO3RoaXMuY2xl YW51cCh0aGlzLmV4dHJhc1RyKTt0aGlzLmZpdFRvU2l6ZShqKX0sY2xlYW51cDpm dW5jdGlvbihiKXt2YXIgZT1iLmNoaWxkTm9kZXMsYSxkO2ZvcihhPWUubGVuZ3Ro LTE7YT49MCYmKGQ9ZVthXSk7YS0tKXtpZighZC5maXJzdENoaWxkKXtiLnJlbW92 ZUNoaWxkKGQpfX19LGluc2VydENlbGw6ZnVuY3Rpb24oZSxiLGEpe3ZhciBkPWRv Y3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7ZC5jbGFzc05hbWU9IngtdG9vbGJh ci1jZWxsIjtiLmluc2VydEJlZm9yZShkLGIuY2hpbGROb2Rlc1thXXx8bnVsbCk7 cmV0dXJuIGR9LGhpZGVJdGVtOmZ1bmN0aW9uKGEpe3RoaXMuaGlkZGVuSXRlbXMu cHVzaChhKTthLnh0YkhpZGRlbj10cnVlO2EueHRiV2lkdGg9YS5nZXRQb3NpdGlv bkVsKCkuZG9tLnBhcmVudE5vZGUub2Zmc2V0V2lkdGg7YS5oaWRlKCl9LHVuaGlk ZUl0ZW06ZnVuY3Rpb24oYSl7YS5zaG93KCk7YS54dGJIaWRkZW49ZmFsc2U7dGhp cy5oaWRkZW5JdGVtcy5yZW1vdmUoYSl9LGdldEl0ZW1XaWR0aDpmdW5jdGlvbihh KXtyZXR1cm4gYS5oaWRkZW4/KGEueHRiV2lkdGh8fDApOmEuZ2V0UG9zaXRpb25F bCgpLmRvbS5wYXJlbnROb2RlLm9mZnNldFdpZHRofSxmaXRUb1NpemU6ZnVuY3Rp b24oayl7aWYodGhpcy5jb250YWluZXIuZW5hYmxlT3ZlcmZsb3c9PT1mYWxzZSl7 cmV0dXJufXZhciBiPWsuZG9tLmNsaWVudFdpZHRoLGo9ay5kb20uZmlyc3RDaGls ZC5vZmZzZXRXaWR0aCxtPWItdGhpcy50cmlnZ2VyV2lkdGgsYT10aGlzLmxhc3RX aWR0aHx8MCxjPXRoaXMuaGlkZGVuSXRlbXMsZT1jLmxlbmd0aCE9MCxuPWI+PWE7 dGhpcy5sYXN0V2lkdGg9YjtpZihqPmJ8fChlJiZuKSl7dmFyIGw9dGhpcy5jb250 YWluZXIuaXRlbXMuaXRlbXMsaD1sLmxlbmd0aCxkPTAsbztmb3IodmFyIGc9MDtn PGg7ZysrKXtvPWxbZ107aWYoIW8uaXNGaWxsKXtkKz10aGlzLmdldEl0ZW1XaWR0 aChvKTtpZihkPm0pe2lmKCEoby5oaWRkZW58fG8ueHRiSGlkZGVuKSl7dGhpcy5o aWRlSXRlbShvKX19ZWxzZXtpZihvLnh0YkhpZGRlbil7dGhpcy51bmhpZGVJdGVt KG8pfX19fX1lPWMubGVuZ3RoIT0wO2lmKGUpe3RoaXMuaW5pdE1vcmUoKTtpZigh dGhpcy5sYXN0T3ZlcmZsb3cpe3RoaXMuY29udGFpbmVyLmZpcmVFdmVudCgib3Zl cmZsb3djaGFuZ2UiLHRoaXMuY29udGFpbmVyLHRydWUpO3RoaXMubGFzdE92ZXJm bG93PXRydWV9fWVsc2V7aWYodGhpcy5tb3JlKXt0aGlzLmNsZWFyTWVudSgpO3Ro aXMubW9yZS5kZXN0cm95KCk7ZGVsZXRlIHRoaXMubW9yZTtpZih0aGlzLmxhc3RP dmVyZmxvdyl7dGhpcy5jb250YWluZXIuZmlyZUV2ZW50KCJvdmVyZmxvd2NoYW5n ZSIsdGhpcy5jb250YWluZXIsZmFsc2UpO3RoaXMubGFzdE92ZXJmbG93PWZhbHNl fX19fSxjcmVhdGVNZW51Q29uZmlnOmZ1bmN0aW9uKGMsYSl7dmFyIGI9RXh0LmFw cGx5KHt9LGMuaW5pdGlhbENvbmZpZyksZD1jLnRvZ2dsZUdyb3VwO0V4dC5jb3B5 VG8oYixjLFsiaWNvbkNscyIsImljb24iLCJpdGVtSWQiLCJkaXNhYmxlZCIsImhh bmRsZXIiLCJzY29wZSIsIm1lbnUiXSk7RXh0LmFwcGx5KGIse3RleHQ6Yy5vdmVy Zmxvd1RleHR8fGMudGV4dCxoaWRlT25DbGljazphfSk7aWYoZHx8Yy5lbmFibGVU b2dnbGUpe0V4dC5hcHBseShiLHtncm91cDpkLGNoZWNrZWQ6Yy5wcmVzc2VkLGxp c3RlbmVyczp7Y2hlY2tjaGFuZ2U6ZnVuY3Rpb24oZyxlKXtjLnRvZ2dsZShlKX19 fSl9ZGVsZXRlIGIub3duZXJDdDtkZWxldGUgYi54dHlwZTtkZWxldGUgYi5pZDty ZXR1cm4gYn0sYWRkQ29tcG9uZW50VG9NZW51OmZ1bmN0aW9uKGIsYSl7aWYoYSBp bnN0YW5jZW9mIEV4dC5Ub29sYmFyLlNlcGFyYXRvcil7Yi5hZGQoIi0iKX1lbHNl e2lmKEV4dC5pc0Z1bmN0aW9uKGEuaXNYVHlwZSkpe2lmKGEuaXNYVHlwZSgic3Bs aXRidXR0b24iKSl7Yi5hZGQodGhpcy5jcmVhdGVNZW51Q29uZmlnKGEsdHJ1ZSkp fWVsc2V7aWYoYS5pc1hUeXBlKCJidXR0b24iKSl7Yi5hZGQodGhpcy5jcmVhdGVN ZW51Q29uZmlnKGEsIWEubWVudSkpfWVsc2V7aWYoYS5pc1hUeXBlKCJidXR0b25n cm91cCIpKXthLml0ZW1zLmVhY2goZnVuY3Rpb24oYyl7dGhpcy5hZGRDb21wb25l bnRUb01lbnUoYixjKX0sdGhpcyl9fX19fX0sY2xlYXJNZW51OmZ1bmN0aW9uKCl7 dmFyIGE9dGhpcy5tb3JlTWVudTtpZihhJiZhLml0ZW1zKXthLml0ZW1zLmVhY2go ZnVuY3Rpb24oYil7ZGVsZXRlIGIubWVudX0pfX0sYmVmb3JlTW9yZVNob3c6ZnVu Y3Rpb24oaCl7dmFyIGI9dGhpcy5jb250YWluZXIuaXRlbXMuaXRlbXMsYT1iLmxl bmd0aCxnLGU7dmFyIGM9ZnVuY3Rpb24oaixpKXtyZXR1cm4gai5pc1hUeXBlKCJi dXR0b25ncm91cCIpJiYhKGkgaW5zdGFuY2VvZiBFeHQuVG9vbGJhci5TZXBhcmF0 b3IpfTt0aGlzLmNsZWFyTWVudSgpO2gucmVtb3ZlQWxsKCk7Zm9yKHZhciBkPTA7 ZDxhO2QrKyl7Zz1iW2RdO2lmKGcueHRiSGlkZGVuKXtpZihlJiYoYyhnLGUpfHxj KGUsZykpKXtoLmFkZCgiLSIpfXRoaXMuYWRkQ29tcG9uZW50VG9NZW51KGgsZyk7 ZT1nfX1pZihoLml0ZW1zLmxlbmd0aDwxKXtoLmFkZCh0aGlzLm5vSXRlbXNNZW51 VGV4dCl9fSxpbml0TW9yZTpmdW5jdGlvbigpe2lmKCF0aGlzLm1vcmUpe3RoaXMu bW9yZU1lbnU9bmV3IEV4dC5tZW51Lk1lbnUoe293bmVyQ3Q6dGhpcy5jb250YWlu ZXIsbGlzdGVuZXJzOntiZWZvcmVzaG93OnRoaXMuYmVmb3JlTW9yZVNob3csc2Nv cGU6dGhpc319KTt0aGlzLm1vcmU9bmV3IEV4dC5CdXR0b24oe2ljb25DbHM6Ingt dG9vbGJhci1tb3JlLWljb24iLGNsczoieC10b29sYmFyLW1vcmUiLG1lbnU6dGhp cy5tb3JlTWVudSxvd25lckN0OnRoaXMuY29udGFpbmVyfSk7dmFyIGE9dGhpcy5p bnNlcnRDZWxsKHRoaXMubW9yZSx0aGlzLmV4dHJhc1RyLDEwMCk7dGhpcy5tb3Jl LnJlbmRlcihhKX19LGRlc3Ryb3k6ZnVuY3Rpb24oKXtFeHQuZGVzdHJveSh0aGlz Lm1vcmUsdGhpcy5tb3JlTWVudSk7ZGVsZXRlIHRoaXMubGVmdFRyO2RlbGV0ZSB0 aGlzLnJpZ2h0VHI7ZGVsZXRlIHRoaXMuZXh0cmFzVHI7RXh0LmxheW91dC5Ub29s YmFyTGF5b3V0LnN1cGVyY2xhc3MuZGVzdHJveS5jYWxsKHRoaXMpfX0pO0V4dC5D b250YWluZXIuTEFZT1VUUy50b29sYmFyPUV4dC5sYXlvdXQuVG9vbGJhckxheW91 dDtFeHQubGF5b3V0Lk1lbnVMYXlvdXQ9RXh0LmV4dGVuZChFeHQubGF5b3V0LkNv bnRhaW5lckxheW91dCx7bW9uaXRvclJlc2l6ZTp0cnVlLHR5cGU6Im1lbnUiLHNl dENvbnRhaW5lcjpmdW5jdGlvbihhKXt0aGlzLm1vbml0b3JSZXNpemU9IWEuZmxv YXRpbmc7YS5vbigiYXV0b3NpemUiLHRoaXMuZG9BdXRvU2l6ZSx0aGlzKTtFeHQu bGF5b3V0Lk1lbnVMYXlvdXQuc3VwZXJjbGFzcy5zZXRDb250YWluZXIuY2FsbCh0 aGlzLGEpfSxyZW5kZXJJdGVtOmZ1bmN0aW9uKGcsYixlKXtpZighdGhpcy5pdGVt VHBsKXt0aGlzLml0ZW1UcGw9RXh0LmxheW91dC5NZW51TGF5b3V0LnByb3RvdHlw ZS5pdGVtVHBsPW5ldyBFeHQuWFRlbXBsYXRlKCc8bGkgaWQ9IntpdGVtSWR9IiBj bGFzcz0ie2l0ZW1DbHN9Ij4nLCc8dHBsIGlmPSJuZWVkc0ljb24iPicsJzxpbWcg YWx0PSJ7YWx0VGV4dH0iIHNyYz0ie2ljb259IiBjbGFzcz0ie2ljb25DbHN9Ii8+ JywiPC90cGw+IiwiPC9saT4iKX1pZihnJiYhZy5yZW5kZXJlZCl7aWYoRXh0Lmlz TnVtYmVyKGIpKXtiPWUuZG9tLmNoaWxkTm9kZXNbYl19dmFyIGQ9dGhpcy5nZXRJ dGVtQXJncyhnKTtnLnJlbmRlcihnLnBvc2l0aW9uRWw9Yj90aGlzLml0ZW1UcGwu aW5zZXJ0QmVmb3JlKGIsZCx0cnVlKTp0aGlzLml0ZW1UcGwuYXBwZW5kKGUsZCx0 cnVlKSk7Zy5wb3NpdGlvbkVsLm1lbnVJdGVtSWQ9Zy5nZXRJdGVtSWQoKTtpZigh ZC5pc01lbnVJdGVtJiZkLm5lZWRzSWNvbil7Zy5wb3NpdGlvbkVsLmFkZENsYXNz KCJ4LW1lbnUtbGlzdC1pdGVtLWluZGVudCIpfXRoaXMuY29uZmlndXJlSXRlbShn KX1lbHNle2lmKGcmJiF0aGlzLmlzVmFsaWRQYXJlbnQoZyxlKSl7aWYoRXh0Lmlz TnVtYmVyKGIpKXtiPWUuZG9tLmNoaWxkTm9kZXNbYl19ZS5kb20uaW5zZXJ0QmVm b3JlKGcuZ2V0QWN0aW9uRWwoKS5kb20sYnx8bnVsbCl9fX0sZ2V0SXRlbUFyZ3M6 ZnVuY3Rpb24oZCl7dmFyIGE9ZCBpbnN0YW5jZW9mIEV4dC5tZW51Lkl0ZW0sYj0h KGF8fGQgaW5zdGFuY2VvZiBFeHQubWVudS5TZXBhcmF0b3IpO3JldHVybntpc01l bnVJdGVtOmEsbmVlZHNJY29uOmImJihkLmljb258fGQuaWNvbkNscyksaWNvbjpk Lmljb258fEV4dC5CTEFOS19JTUFHRV9VUkwsaWNvbkNsczoieC1tZW51LWl0ZW0t aWNvbiAiKyhkLmljb25DbHN8fCIiKSxpdGVtSWQ6IngtbWVudS1lbC0iK2QuaWQs aXRlbUNsczoieC1tZW51LWxpc3QtaXRlbSAiLGFsdFRleHQ6ZC5hbHRUZXh0fHwi In19LGlzVmFsaWRQYXJlbnQ6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYi5lbC51cCgi bGkueC1tZW51LWxpc3QtaXRlbSIsNSkuZG9tLnBhcmVudE5vZGU9PT0oYS5kb218 fGEpfSxvbkxheW91dDpmdW5jdGlvbihhLGIpe0V4dC5sYXlvdXQuTWVudUxheW91 dC5zdXBlcmNsYXNzLm9uTGF5b3V0LmNhbGwodGhpcyxhLGIpO3RoaXMuZG9BdXRv U2l6ZSgpfSxkb0F1dG9TaXplOmZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5jb250YWlu ZXIsYT1jLndpZHRoO2lmKGMuZmxvYXRpbmcpe2lmKGEpe2Muc2V0V2lkdGgoYSl9 ZWxzZXtpZihFeHQuaXNJRSl7Yy5zZXRXaWR0aChFeHQuaXNTdHJpY3QmJihFeHQu aXNJRTd8fEV4dC5pc0lFOHx8RXh0LmlzSUU5KT8iYXV0byI6Yy5taW5XaWR0aCk7 dmFyIGQ9Yy5nZXRFbCgpLGI9ZC5kb20ub2Zmc2V0V2lkdGg7Yy5zZXRXaWR0aChj LmdldExheW91dFRhcmdldCgpLmdldFdpZHRoKCkrZC5nZXRGcmFtZVdpZHRoKCJs ciIpKX19fX19KTtFeHQuQ29udGFpbmVyLkxBWU9VVFMubWVudT1FeHQubGF5b3V0 Lk1lbnVMYXlvdXQ7RXh0LlZpZXdwb3J0PUV4dC5leHRlbmQoRXh0LkNvbnRhaW5l cix7aW5pdENvbXBvbmVudDpmdW5jdGlvbigpe0V4dC5WaWV3cG9ydC5zdXBlcmNs YXNzLmluaXRDb21wb25lbnQuY2FsbCh0aGlzKTtkb2N1bWVudC5nZXRFbGVtZW50 c0J5VGFnTmFtZSgiaHRtbCIpWzBdLmNsYXNzTmFtZSs9IiB4LXZpZXdwb3J0Ijt0 aGlzLmVsPUV4dC5nZXRCb2R5KCk7dGhpcy5lbC5zZXRIZWlnaHQ9RXh0LmVtcHR5 Rm47dGhpcy5lbC5zZXRXaWR0aD1FeHQuZW1wdHlGbjt0aGlzLmVsLnNldFNpemU9 RXh0LmVtcHR5Rm47dGhpcy5lbC5kb20uc2Nyb2xsPSJubyI7dGhpcy5hbGxvd0Rv bU1vdmU9ZmFsc2U7dGhpcy5hdXRvV2lkdGg9dHJ1ZTt0aGlzLmF1dG9IZWlnaHQ9 dHJ1ZTtFeHQuRXZlbnRNYW5hZ2VyLm9uV2luZG93UmVzaXplKHRoaXMuZmlyZVJl c2l6ZSx0aGlzKTt0aGlzLnJlbmRlclRvPXRoaXMuZWx9LGZpcmVSZXNpemU6ZnVu Y3Rpb24oYSxiKXt0aGlzLmZpcmVFdmVudCgicmVzaXplIix0aGlzLGEsYixhLGIp fX0pO0V4dC5yZWcoInZpZXdwb3J0IixFeHQuVmlld3BvcnQpO0V4dC5QYW5lbD1F eHQuZXh0ZW5kKEV4dC5Db250YWluZXIse2Jhc2VDbHM6IngtcGFuZWwiLGNvbGxh cHNlZENsczoieC1wYW5lbC1jb2xsYXBzZWQiLG1hc2tEaXNhYmxlZDp0cnVlLGFu aW1Db2xsYXBzZTpFeHQuZW5hYmxlRngsaGVhZGVyQXNUZXh0OnRydWUsYnV0dG9u QWxpZ246InJpZ2h0Iixjb2xsYXBzZWQ6ZmFsc2UsY29sbGFwc2VGaXJzdDp0cnVl LG1pbkJ1dHRvbldpZHRoOjc1LGVsZW1lbnRzOiJib2R5IixwcmV2ZW50Qm9keVJl c2V0OmZhbHNlLHBhZGRpbmc6dW5kZWZpbmVkLHJlc2l6ZUV2ZW50OiJib2R5cmVz aXplIix0b29sVGFyZ2V0OiJoZWFkZXIiLGNvbGxhcHNlRWw6ImJ3cmFwIixzbGlk ZUFuY2hvcjoidCIsZGlzYWJsZWRDbGFzczoiIixkZWZlckhlaWdodDp0cnVlLGV4 cGFuZERlZmF1bHRzOntkdXJhdGlvbjowLjI1fSxjb2xsYXBzZURlZmF1bHRzOntk dXJhdGlvbjowLjI1fSxpbml0Q29tcG9uZW50OmZ1bmN0aW9uKCl7RXh0LlBhbmVs LnN1cGVyY2xhc3MuaW5pdENvbXBvbmVudC5jYWxsKHRoaXMpO3RoaXMuYWRkRXZl bnRzKCJib2R5cmVzaXplIiwidGl0bGVjaGFuZ2UiLCJpY29uY2hhbmdlIiwiY29s bGFwc2UiLCJleHBhbmQiLCJiZWZvcmVjb2xsYXBzZSIsImJlZm9yZWV4cGFuZCIs ImJlZm9yZWNsb3NlIiwiY2xvc2UiLCJhY3RpdmF0ZSIsImRlYWN0aXZhdGUiKTtp Zih0aGlzLnVuc3R5bGVkKXt0aGlzLmJhc2VDbHM9IngtcGxhaW4ifXRoaXMudG9v bGJhcnM9W107aWYodGhpcy50YmFyKXt0aGlzLmVsZW1lbnRzKz0iLHRiYXIiO3Ro aXMudG9wVG9vbGJhcj10aGlzLmNyZWF0ZVRvb2xiYXIodGhpcy50YmFyKTt0aGlz LnRiYXI9bnVsbH1pZih0aGlzLmJiYXIpe3RoaXMuZWxlbWVudHMrPSIsYmJhciI7 dGhpcy5ib3R0b21Ub29sYmFyPXRoaXMuY3JlYXRlVG9vbGJhcih0aGlzLmJiYXIp O3RoaXMuYmJhcj1udWxsfWlmKHRoaXMuaGVhZGVyPT09dHJ1ZSl7dGhpcy5lbGVt ZW50cys9IixoZWFkZXIiO3RoaXMuaGVhZGVyPW51bGx9ZWxzZXtpZih0aGlzLmhl YWRlckNmZ3x8KHRoaXMudGl0bGUmJnRoaXMuaGVhZGVyIT09ZmFsc2UpKXt0aGlz LmVsZW1lbnRzKz0iLGhlYWRlciJ9fWlmKHRoaXMuZm9vdGVyQ2ZnfHx0aGlzLmZv b3Rlcj09PXRydWUpe3RoaXMuZWxlbWVudHMrPSIsZm9vdGVyIjt0aGlzLmZvb3Rl cj1udWxsfWlmKHRoaXMuYnV0dG9ucyl7dGhpcy5mYmFyPXRoaXMuYnV0dG9uczt0 aGlzLmJ1dHRvbnM9bnVsbH1pZih0aGlzLmZiYXIpe3RoaXMuY3JlYXRlRmJhcih0 aGlzLmZiYXIpfWlmKHRoaXMuYXV0b0xvYWQpe3RoaXMub24oInJlbmRlciIsdGhp cy5kb0F1dG9Mb2FkLHRoaXMse2RlbGF5OjEwfSl9fSxjcmVhdGVGYmFyOmZ1bmN0 aW9uKGIpe3ZhciBhPXRoaXMubWluQnV0dG9uV2lkdGg7dGhpcy5lbGVtZW50cys9 Iixmb290ZXIiO3RoaXMuZmJhcj10aGlzLmNyZWF0ZVRvb2xiYXIoYix7YnV0dG9u QWxpZ246dGhpcy5idXR0b25BbGlnbix0b29sYmFyQ2xzOiJ4LXBhbmVsLWZiYXIi LGVuYWJsZU92ZXJmbG93OmZhbHNlLGRlZmF1bHRzOmZ1bmN0aW9uKGQpe3JldHVy bnttaW5XaWR0aDpkLm1pbldpZHRofHxhfX19KTt0aGlzLmZiYXIuaXRlbXMuZWFj aChmdW5jdGlvbihkKXtkLm1pbldpZHRoPWQubWluV2lkdGh8fHRoaXMubWluQnV0 dG9uV2lkdGh9LHRoaXMpO3RoaXMuYnV0dG9ucz10aGlzLmZiYXIuaXRlbXMuaXRl bXN9LGNyZWF0ZVRvb2xiYXI6ZnVuY3Rpb24oYixjKXt2YXIgYTtpZihFeHQuaXNB cnJheShiKSl7Yj17aXRlbXM6Yn19YT1iLmV2ZW50cz9FeHQuYXBwbHkoYixjKTp0 aGlzLmNyZWF0ZUNvbXBvbmVudChFeHQuYXBwbHkoe30sYixjKSwidG9vbGJhciIp O3RoaXMudG9vbGJhcnMucHVzaChhKTtyZXR1cm4gYX0sY3JlYXRlRWxlbWVudDpm dW5jdGlvbihhLGMpe2lmKHRoaXNbYV0pe2MuYXBwZW5kQ2hpbGQodGhpc1thXS5k b20pO3JldHVybn1pZihhPT09ImJ3cmFwInx8dGhpcy5lbGVtZW50cy5pbmRleE9m KGEpIT0tMSl7aWYodGhpc1thKyJDZmciXSl7dGhpc1thXT1FeHQuZmx5KGMpLmNy ZWF0ZUNoaWxkKHRoaXNbYSsiQ2ZnIl0pfWVsc2V7dmFyIGI9ZG9jdW1lbnQuY3Jl YXRlRWxlbWVudCgiZGl2Iik7Yi5jbGFzc05hbWU9dGhpc1thKyJDbHMiXTt0aGlz W2FdPUV4dC5nZXQoYy5hcHBlbmRDaGlsZChiKSl9aWYodGhpc1thKyJDc3NDbGFz cyJdKXt0aGlzW2FdLmFkZENsYXNzKHRoaXNbYSsiQ3NzQ2xhc3MiXSl9aWYodGhp c1thKyJTdHlsZSJdKXt0aGlzW2FdLmFwcGx5U3R5bGVzKHRoaXNbYSsiU3R5bGUi XSl9fX0sb25SZW5kZXI6ZnVuY3Rpb24oZyxlKXtFeHQuUGFuZWwuc3VwZXJjbGFz cy5vblJlbmRlci5jYWxsKHRoaXMsZyxlKTt0aGlzLmNyZWF0ZUNsYXNzZXMoKTt2 YXIgYT10aGlzLmVsLGg9YS5kb20sayxpO2lmKHRoaXMuY29sbGFwc2libGUmJiF0 aGlzLmhpZGVDb2xsYXBzZVRvb2wpe3RoaXMudG9vbHM9dGhpcy50b29scz90aGlz LnRvb2xzLnNsaWNlKDApOltdO3RoaXMudG9vbHNbdGhpcy5jb2xsYXBzZUZpcnN0 PyJ1bnNoaWZ0IjoicHVzaCJdKHtpZDoidG9nZ2xlIixoYW5kbGVyOnRoaXMudG9n Z2xlQ29sbGFwc2Usc2NvcGU6dGhpc30pfWlmKHRoaXMudG9vbHMpe2k9dGhpcy50 b29sczt0aGlzLmVsZW1lbnRzKz0odGhpcy5oZWFkZXIhPT1mYWxzZSk/IixoZWFk ZXIiOiIifXRoaXMudG9vbHM9e307YS5hZGRDbGFzcyh0aGlzLmJhc2VDbHMpO2lm KGguZmlyc3RDaGlsZCl7dGhpcy5oZWFkZXI9YS5kb3duKCIuIit0aGlzLmhlYWRl ckNscyk7dGhpcy5id3JhcD1hLmRvd24oIi4iK3RoaXMuYndyYXBDbHMpO3ZhciBq PXRoaXMuYndyYXA/dGhpcy5id3JhcDphO3RoaXMudGJhcj1qLmRvd24oIi4iK3Ro aXMudGJhckNscyk7dGhpcy5ib2R5PWouZG93bigiLiIrdGhpcy5ib2R5Q2xzKTt0 aGlzLmJiYXI9ai5kb3duKCIuIit0aGlzLmJiYXJDbHMpO3RoaXMuZm9vdGVyPWou ZG93bigiLiIrdGhpcy5mb290ZXJDbHMpO3RoaXMuZnJvbU1hcmt1cD10cnVlfWlm KHRoaXMucHJldmVudEJvZHlSZXNldD09PXRydWUpe2EuYWRkQ2xhc3MoIngtcGFu ZWwtcmVzZXQiKX1pZih0aGlzLmNscyl7YS5hZGRDbGFzcyh0aGlzLmNscyl9aWYo dGhpcy5idXR0b25zKXt0aGlzLmVsZW1lbnRzKz0iLGZvb3RlciJ9aWYodGhpcy5m cmFtZSl7YS5pbnNlcnRIdG1sKCJhZnRlckJlZ2luIixTdHJpbmcuZm9ybWF0KEV4 dC5FbGVtZW50LmJveE1hcmt1cCx0aGlzLmJhc2VDbHMpKTt0aGlzLmNyZWF0ZUVs ZW1lbnQoImhlYWRlciIsaC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGls ZCk7dGhpcy5jcmVhdGVFbGVtZW50KCJid3JhcCIsaCk7az10aGlzLmJ3cmFwLmRv bTt2YXIgYz1oLmNoaWxkTm9kZXNbMV0sYj1oLmNoaWxkTm9kZXNbMl07ay5hcHBl bmRDaGlsZChjKTtrLmFwcGVuZENoaWxkKGIpO3ZhciBsPWsuZmlyc3RDaGlsZC5m aXJzdENoaWxkLmZpcnN0Q2hpbGQ7dGhpcy5jcmVhdGVFbGVtZW50KCJ0YmFyIixs KTt0aGlzLmNyZWF0ZUVsZW1lbnQoImJvZHkiLGwpO3RoaXMuY3JlYXRlRWxlbWVu dCgiYmJhciIsbCk7dGhpcy5jcmVhdGVFbGVtZW50KCJmb290ZXIiLGsubGFzdENo aWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCk7aWYoIXRoaXMuZm9vdGVyKXt0aGlz LmJ3cmFwLmRvbS5sYXN0Q2hpbGQuY2xhc3NOYW1lKz0iIHgtcGFuZWwtbm9mb290 ZXIifXRoaXMuZnQ9RXh0LmdldCh0aGlzLmJ3cmFwLmRvbS5sYXN0Q2hpbGQpO3Ro aXMubWM9RXh0LmdldChsKX1lbHNle3RoaXMuY3JlYXRlRWxlbWVudCgiaGVhZGVy IixoKTt0aGlzLmNyZWF0ZUVsZW1lbnQoImJ3cmFwIixoKTtrPXRoaXMuYndyYXAu ZG9tO3RoaXMuY3JlYXRlRWxlbWVudCgidGJhciIsayk7dGhpcy5jcmVhdGVFbGVt ZW50KCJib2R5IixrKTt0aGlzLmNyZWF0ZUVsZW1lbnQoImJiYXIiLGspO3RoaXMu Y3JlYXRlRWxlbWVudCgiZm9vdGVyIixrKTtpZighdGhpcy5oZWFkZXIpe3RoaXMu Ym9keS5hZGRDbGFzcyh0aGlzLmJvZHlDbHMrIi1ub2hlYWRlciIpO2lmKHRoaXMu dGJhcil7dGhpcy50YmFyLmFkZENsYXNzKHRoaXMudGJhckNscysiLW5vaGVhZGVy Iil9fX1pZihFeHQuaXNEZWZpbmVkKHRoaXMucGFkZGluZykpe3RoaXMuYm9keS5z ZXRTdHlsZSgicGFkZGluZyIsdGhpcy5ib2R5LmFkZFVuaXRzKHRoaXMucGFkZGlu ZykpfWlmKHRoaXMuYm9yZGVyPT09ZmFsc2Upe3RoaXMuZWwuYWRkQ2xhc3ModGhp cy5iYXNlQ2xzKyItbm9ib3JkZXIiKTt0aGlzLmJvZHkuYWRkQ2xhc3ModGhpcy5i b2R5Q2xzKyItbm9ib3JkZXIiKTtpZih0aGlzLmhlYWRlcil7dGhpcy5oZWFkZXIu YWRkQ2xhc3ModGhpcy5oZWFkZXJDbHMrIi1ub2JvcmRlciIpfWlmKHRoaXMuZm9v dGVyKXt0aGlzLmZvb3Rlci5hZGRDbGFzcyh0aGlzLmZvb3RlckNscysiLW5vYm9y ZGVyIil9aWYodGhpcy50YmFyKXt0aGlzLnRiYXIuYWRkQ2xhc3ModGhpcy50YmFy Q2xzKyItbm9ib3JkZXIiKX1pZih0aGlzLmJiYXIpe3RoaXMuYmJhci5hZGRDbGFz cyh0aGlzLmJiYXJDbHMrIi1ub2JvcmRlciIpfX1pZih0aGlzLmJvZHlCb3JkZXI9 PT1mYWxzZSl7dGhpcy5ib2R5LmFkZENsYXNzKHRoaXMuYm9keUNscysiLW5vYm9y ZGVyIil9dGhpcy5id3JhcC5lbmFibGVEaXNwbGF5TW9kZSgiYmxvY2siKTtpZih0 aGlzLmhlYWRlcil7dGhpcy5oZWFkZXIudW5zZWxlY3RhYmxlKCk7aWYodGhpcy5o ZWFkZXJBc1RleHQpe3RoaXMuaGVhZGVyLmRvbS5pbm5lckhUTUw9JzxzcGFuIGNs YXNzPSInK3RoaXMuaGVhZGVyVGV4dENscysnIj4nK3RoaXMuaGVhZGVyLmRvbS5p bm5lckhUTUwrIjwvc3Bhbj4iO2lmKHRoaXMuaWNvbkNscyl7dGhpcy5zZXRJY29u Q2xhc3ModGhpcy5pY29uQ2xzKX19fWlmKHRoaXMuZmxvYXRpbmcpe3RoaXMubWFr ZUZsb2F0aW5nKHRoaXMuZmxvYXRpbmcpfWlmKHRoaXMuY29sbGFwc2libGUmJnRo aXMudGl0bGVDb2xsYXBzZSYmdGhpcy5oZWFkZXIpe3RoaXMubW9uKHRoaXMuaGVh ZGVyLCJjbGljayIsdGhpcy50b2dnbGVDb2xsYXBzZSx0aGlzKTt0aGlzLmhlYWRl ci5zZXRTdHlsZSgiY3Vyc29yIiwicG9pbnRlciIpfWlmKGkpe3RoaXMuYWRkVG9v bC5hcHBseSh0aGlzLGkpfWlmKHRoaXMuZmJhcil7dGhpcy5mb290ZXIuYWRkQ2xh c3MoIngtcGFuZWwtYnRucyIpO3RoaXMuZmJhci5vd25lckN0PXRoaXM7dGhpcy5m YmFyLnJlbmRlcih0aGlzLmZvb3Rlcik7dGhpcy5mb290ZXIuY3JlYXRlQ2hpbGQo e2NsczoieC1jbGVhciJ9KX1pZih0aGlzLnRiYXImJnRoaXMudG9wVG9vbGJhcil7 dGhpcy50b3BUb29sYmFyLm93bmVyQ3Q9dGhpczt0aGlzLnRvcFRvb2xiYXIucmVu ZGVyKHRoaXMudGJhcil9aWYodGhpcy5iYmFyJiZ0aGlzLmJvdHRvbVRvb2xiYXIp e3RoaXMuYm90dG9tVG9vbGJhci5vd25lckN0PXRoaXM7dGhpcy5ib3R0b21Ub29s YmFyLnJlbmRlcih0aGlzLmJiYXIpfX0sc2V0SWNvbkNsYXNzOmZ1bmN0aW9uKGIp e3ZhciBhPXRoaXMuaWNvbkNsczt0aGlzLmljb25DbHM9YjtpZih0aGlzLnJlbmRl cmVkJiZ0aGlzLmhlYWRlcil7aWYodGhpcy5mcmFtZSl7dGhpcy5oZWFkZXIuYWRk Q2xhc3MoIngtcGFuZWwtaWNvbiIpO3RoaXMuaGVhZGVyLnJlcGxhY2VDbGFzcyhh LHRoaXMuaWNvbkNscyl9ZWxzZXt2YXIgZT10aGlzLmhlYWRlcixjPWUuY2hpbGQo ImltZy54LXBhbmVsLWlubGluZS1pY29uIik7aWYoYyl7RXh0LmZseShjKS5yZXBs YWNlQ2xhc3MoYSx0aGlzLmljb25DbHMpfWVsc2V7dmFyIGQ9ZS5jaGlsZCgic3Bh bi4iK3RoaXMuaGVhZGVyVGV4dENscyk7aWYoZCl7RXh0LkRvbUhlbHBlci5pbnNl cnRCZWZvcmUoZC5kb20se3RhZzoiaW1nIixhbHQ6IiIsc3JjOkV4dC5CTEFOS19J TUFHRV9VUkwsY2xzOiJ4LXBhbmVsLWlubGluZS1pY29uICIrdGhpcy5pY29uQ2xz fSl9fX19dGhpcy5maXJlRXZlbnQoImljb25jaGFuZ2UiLHRoaXMsYixhKX0sbWFr ZUZsb2F0aW5nOmZ1bmN0aW9uKGEpe3RoaXMuZmxvYXRpbmc9dHJ1ZTt0aGlzLmVs PW5ldyBFeHQuTGF5ZXIoRXh0LmFwcGx5KHt9LGEse3NoYWRvdzpFeHQuaXNEZWZp bmVkKHRoaXMuc2hhZG93KT90aGlzLnNoYWRvdzoic2lkZXMiLHNoYWRvd09mZnNl dDp0aGlzLnNoYWRvd09mZnNldCxjb25zdHJhaW46ZmFsc2Usc2hpbTp0aGlzLnNo aW09PT1mYWxzZT9mYWxzZTp1bmRlZmluZWR9KSx0aGlzLmVsKX0sZ2V0VG9wVG9v bGJhcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRvcFRvb2xiYXJ9LGdldEJvdHRv bVRvb2xiYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ib3R0b21Ub29sYmFyfSxn ZXRGb290ZXJUb29sYmFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmJhcn0sYWRk QnV0dG9uOmZ1bmN0aW9uKGEsYyxiKXtpZighdGhpcy5mYmFyKXt0aGlzLmNyZWF0 ZUZiYXIoW10pfWlmKGMpe2lmKEV4dC5pc1N0cmluZyhhKSl7YT17dGV4dDphfX1h PUV4dC5hcHBseSh7aGFuZGxlcjpjLHNjb3BlOmJ9LGEpfXJldHVybiB0aGlzLmZi YXIuYWRkKGEpfSxhZGRUb29sOmZ1bmN0aW9uKCl7aWYoIXRoaXMucmVuZGVyZWQp e2lmKCF0aGlzLnRvb2xzKXt0aGlzLnRvb2xzPVtdfUV4dC5lYWNoKGFyZ3VtZW50 cyxmdW5jdGlvbihhKXt0aGlzLnRvb2xzLnB1c2goYSl9LHRoaXMpO3JldHVybn1p ZighdGhpc1t0aGlzLnRvb2xUYXJnZXRdKXtyZXR1cm59aWYoIXRoaXMudG9vbFRl bXBsYXRlKXt2YXIgaD1uZXcgRXh0LlRlbXBsYXRlKCc8ZGl2IGNsYXNzPSJ4LXRv b2wgeC10b29sLXtpZH0iPiYjMTYwOzwvZGl2PicpO2guZGlzYWJsZUZvcm1hdHM9 dHJ1ZTtoLmNvbXBpbGUoKTtFeHQuUGFuZWwucHJvdG90eXBlLnRvb2xUZW1wbGF0 ZT1ofWZvcih2YXIgZz0wLGQ9YXJndW1lbnRzLGM9ZC5sZW5ndGg7ZzxjO2crKyl7 dmFyIGI9ZFtnXTtpZighdGhpcy50b29sc1tiLmlkXSl7dmFyIGo9IngtdG9vbC0i K2IuaWQrIi1vdmVyIjt2YXIgZT10aGlzLnRvb2xUZW1wbGF0ZS5pbnNlcnRGaXJz dCh0aGlzW3RoaXMudG9vbFRhcmdldF0sYix0cnVlKTt0aGlzLnRvb2xzW2IuaWRd PWU7ZS5lbmFibGVEaXNwbGF5TW9kZSgiYmxvY2siKTt0aGlzLm1vbihlLCJjbGlj ayIsdGhpcy5jcmVhdGVUb29sSGFuZGxlcihlLGIsaix0aGlzKSk7aWYoYi5vbil7 dGhpcy5tb24oZSxiLm9uKX1pZihiLmhpZGRlbil7ZS5oaWRlKCl9aWYoYi5xdGlw KXtpZihFeHQuaXNPYmplY3QoYi5xdGlwKSl7RXh0LlF1aWNrVGlwcy5yZWdpc3Rl cihFeHQuYXBwbHkoe3RhcmdldDplLmlkfSxiLnF0aXApKX1lbHNle2UuZG9tLnF0 aXA9Yi5xdGlwfX1lLmFkZENsYXNzT25PdmVyKGopfX19LG9uTGF5b3V0OmZ1bmN0 aW9uKGIsYSl7RXh0LlBhbmVsLnN1cGVyY2xhc3Mub25MYXlvdXQuYXBwbHkodGhp cyxhcmd1bWVudHMpO2lmKHRoaXMuaGFzTGF5b3V0JiZ0aGlzLnRvb2xiYXJzLmxl bmd0aD4wKXtFeHQuZWFjaCh0aGlzLnRvb2xiYXJzLGZ1bmN0aW9uKGMpe2MuZG9M YXlvdXQodW5kZWZpbmVkLGEpfSk7dGhpcy5zeW5jSGVpZ2h0KCl9fSxzeW5jSGVp Z2h0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy50b29sYmFySGVpZ2h0LGM9dGhpcy5i b2R5LGE9dGhpcy5sYXN0U2l6ZS5oZWlnaHQsZDtpZih0aGlzLmF1dG9IZWlnaHR8 fCFFeHQuaXNEZWZpbmVkKGEpfHxhPT0iYXV0byIpe3JldHVybn1pZihiIT10aGlz LmdldFRvb2xiYXJIZWlnaHQoKSl7Yj1NYXRoLm1heCgwLGEtdGhpcy5nZXRGcmFt ZUhlaWdodCgpKTtjLnNldEhlaWdodChiKTtkPWMuZ2V0U2l6ZSgpO3RoaXMudG9v bGJhckhlaWdodD10aGlzLmdldFRvb2xiYXJIZWlnaHQoKTt0aGlzLm9uQm9keVJl c2l6ZShkLndpZHRoLGQuaGVpZ2h0KX19LG9uU2hvdzpmdW5jdGlvbigpe2lmKHRo aXMuZmxvYXRpbmcpe3JldHVybiB0aGlzLmVsLnNob3coKX1FeHQuUGFuZWwuc3Vw ZXJjbGFzcy5vblNob3cuY2FsbCh0aGlzKX0sb25IaWRlOmZ1bmN0aW9uKCl7aWYo dGhpcy5mbG9hdGluZyl7cmV0dXJuIHRoaXMuZWwuaGlkZSgpfUV4dC5QYW5lbC5z dXBlcmNsYXNzLm9uSGlkZS5jYWxsKHRoaXMpfSxjcmVhdGVUb29sSGFuZGxlcjpm dW5jdGlvbihjLGEsZCxiKXtyZXR1cm4gZnVuY3Rpb24oZyl7Yy5yZW1vdmVDbGFz cyhkKTtpZihhLnN0b3BFdmVudCE9PWZhbHNlKXtnLnN0b3BFdmVudCgpfWlmKGEu aGFuZGxlcil7YS5oYW5kbGVyLmNhbGwoYS5zY29wZXx8YyxnLGMsYixhKX19fSxh ZnRlclJlbmRlcjpmdW5jdGlvbigpe2lmKHRoaXMuZmxvYXRpbmcmJiF0aGlzLmhp ZGRlbil7dGhpcy5lbC5zaG93KCl9aWYodGhpcy50aXRsZSl7dGhpcy5zZXRUaXRs ZSh0aGlzLnRpdGxlKX1FeHQuUGFuZWwuc3VwZXJjbGFzcy5hZnRlclJlbmRlci5j YWxsKHRoaXMpO2lmKHRoaXMuY29sbGFwc2VkKXt0aGlzLmNvbGxhcHNlZD1mYWxz ZTt0aGlzLmNvbGxhcHNlKGZhbHNlKX10aGlzLmluaXRFdmVudHMoKX0sZ2V0S2V5 TWFwOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2V5TWFwKXt0aGlzLmtleU1hcD1uZXcg RXh0LktleU1hcCh0aGlzLmVsLHRoaXMua2V5cyl9cmV0dXJuIHRoaXMua2V5TWFw fSxpbml0RXZlbnRzOmZ1bmN0aW9uKCl7aWYodGhpcy5rZXlzKXt0aGlzLmdldEtl eU1hcCgpfWlmKHRoaXMuZHJhZ2dhYmxlKXt0aGlzLmluaXREcmFnZ2FibGUoKX1p Zih0aGlzLnRvb2xiYXJzLmxlbmd0aD4wKXtFeHQuZWFjaCh0aGlzLnRvb2xiYXJz LGZ1bmN0aW9uKGEpe2EuZG9MYXlvdXQoKTthLm9uKHtzY29wZTp0aGlzLGFmdGVy bGF5b3V0OnRoaXMuc3luY0hlaWdodCxyZW1vdmU6dGhpcy5zeW5jSGVpZ2h0fSl9 LHRoaXMpO3RoaXMuc3luY0hlaWdodCgpfX0saW5pdERyYWdnYWJsZTpmdW5jdGlv bigpe3RoaXMuZGQ9bmV3IEV4dC5QYW5lbC5ERCh0aGlzLEV4dC5pc0Jvb2xlYW4o dGhpcy5kcmFnZ2FibGUpP251bGw6dGhpcy5kcmFnZ2FibGUpfSxiZWZvcmVFZmZl Y3Q6ZnVuY3Rpb24oYSl7aWYodGhpcy5mbG9hdGluZyl7dGhpcy5lbC5iZWZvcmVB Y3Rpb24oKX1pZihhIT09ZmFsc2Upe3RoaXMuZWwuYWRkQ2xhc3MoIngtcGFuZWwt YW5pbWF0ZWQiKX19LGFmdGVyRWZmZWN0OmZ1bmN0aW9uKGEpe3RoaXMuc3luY1No YWRvdygpO3RoaXMuZWwucmVtb3ZlQ2xhc3MoIngtcGFuZWwtYW5pbWF0ZWQiKX0s Y3JlYXRlRWZmZWN0OmZ1bmN0aW9uKGMsYixkKXt2YXIgZT17c2NvcGU6ZCxibG9j azp0cnVlfTtpZihjPT09dHJ1ZSl7ZS5jYWxsYmFjaz1iO3JldHVybiBlfWVsc2V7 aWYoIWMuY2FsbGJhY2spe2UuY2FsbGJhY2s9Yn1lbHNle2UuY2FsbGJhY2s9ZnVu Y3Rpb24oKXtiLmNhbGwoZCk7RXh0LmNhbGxiYWNrKGMuY2FsbGJhY2ssYy5zY29w ZSl9fX1yZXR1cm4gRXh0LmFwcGx5SWYoZSxjKX0sY29sbGFwc2U6ZnVuY3Rpb24o Yil7aWYodGhpcy5jb2xsYXBzZWR8fHRoaXMuZWwuaGFzRnhCbG9jaygpfHx0aGlz LmZpcmVFdmVudCgiYmVmb3JlY29sbGFwc2UiLHRoaXMsYik9PT1mYWxzZSl7cmV0 dXJufXZhciBhPWI9PT10cnVlfHwoYiE9PWZhbHNlJiZ0aGlzLmFuaW1Db2xsYXBz ZSk7dGhpcy5iZWZvcmVFZmZlY3QoYSk7dGhpcy5vbkNvbGxhcHNlKGEsYik7cmV0 dXJuIHRoaXN9LG9uQ29sbGFwc2U6ZnVuY3Rpb24oYSxiKXtpZihhKXt0aGlzW3Ro aXMuY29sbGFwc2VFbF0uc2xpZGVPdXQodGhpcy5zbGlkZUFuY2hvcixFeHQuYXBw bHkodGhpcy5jcmVhdGVFZmZlY3QoYnx8dHJ1ZSx0aGlzLmFmdGVyQ29sbGFwc2Us dGhpcyksdGhpcy5jb2xsYXBzZURlZmF1bHRzKSl9ZWxzZXt0aGlzW3RoaXMuY29s bGFwc2VFbF0uaGlkZSh0aGlzLmhpZGVNb2RlKTt0aGlzLmFmdGVyQ29sbGFwc2Uo ZmFsc2UpfX0sYWZ0ZXJDb2xsYXBzZTpmdW5jdGlvbihhKXt0aGlzLmNvbGxhcHNl ZD10cnVlO3RoaXMuZWwuYWRkQ2xhc3ModGhpcy5jb2xsYXBzZWRDbHMpO2lmKGEh PT1mYWxzZSl7dGhpc1t0aGlzLmNvbGxhcHNlRWxdLmhpZGUodGhpcy5oaWRlTW9k ZSl9dGhpcy5hZnRlckVmZmVjdChhKTt0aGlzLmNhc2NhZGUoZnVuY3Rpb24oYil7 aWYoYi5sYXN0U2l6ZSl7Yi5sYXN0U2l6ZT17d2lkdGg6dW5kZWZpbmVkLGhlaWdo dDp1bmRlZmluZWR9fX0pO3RoaXMuZmlyZUV2ZW50KCJjb2xsYXBzZSIsdGhpcyl9 LGV4cGFuZDpmdW5jdGlvbihiKXtpZighdGhpcy5jb2xsYXBzZWR8fHRoaXMuZWwu aGFzRnhCbG9jaygpfHx0aGlzLmZpcmVFdmVudCgiYmVmb3JlZXhwYW5kIix0aGlz LGIpPT09ZmFsc2Upe3JldHVybn12YXIgYT1iPT09dHJ1ZXx8KGIhPT1mYWxzZSYm dGhpcy5hbmltQ29sbGFwc2UpO3RoaXMuZWwucmVtb3ZlQ2xhc3ModGhpcy5jb2xs YXBzZWRDbHMpO3RoaXMuYmVmb3JlRWZmZWN0KGEpO3RoaXMub25FeHBhbmQoYSxi KTtyZXR1cm4gdGhpc30sb25FeHBhbmQ6ZnVuY3Rpb24oYSxiKXtpZihhKXt0aGlz W3RoaXMuY29sbGFwc2VFbF0uc2xpZGVJbih0aGlzLnNsaWRlQW5jaG9yLEV4dC5h cHBseSh0aGlzLmNyZWF0ZUVmZmVjdChifHx0cnVlLHRoaXMuYWZ0ZXJFeHBhbmQs dGhpcyksdGhpcy5leHBhbmREZWZhdWx0cykpfWVsc2V7dGhpc1t0aGlzLmNvbGxh cHNlRWxdLnNob3codGhpcy5oaWRlTW9kZSk7dGhpcy5hZnRlckV4cGFuZChmYWxz ZSl9fSxhZnRlckV4cGFuZDpmdW5jdGlvbihhKXt0aGlzLmNvbGxhcHNlZD1mYWxz ZTtpZihhIT09ZmFsc2Upe3RoaXNbdGhpcy5jb2xsYXBzZUVsXS5zaG93KHRoaXMu aGlkZU1vZGUpfXRoaXMuYWZ0ZXJFZmZlY3QoYSk7aWYodGhpcy5kZWZlckxheW91 dCl7ZGVsZXRlIHRoaXMuZGVmZXJMYXlvdXQ7dGhpcy5kb0xheW91dCh0cnVlKX10 aGlzLmZpcmVFdmVudCgiZXhwYW5kIix0aGlzKX0sdG9nZ2xlQ29sbGFwc2U6ZnVu Y3Rpb24oYSl7dGhpc1t0aGlzLmNvbGxhcHNlZD8iZXhwYW5kIjoiY29sbGFwc2Ui XShhKTtyZXR1cm4gdGhpc30sb25EaXNhYmxlOmZ1bmN0aW9uKCl7aWYodGhpcy5y ZW5kZXJlZCYmdGhpcy5tYXNrRGlzYWJsZWQpe3RoaXMuZWwubWFzaygpfUV4dC5Q YW5lbC5zdXBlcmNsYXNzLm9uRGlzYWJsZS5jYWxsKHRoaXMpfSxvbkVuYWJsZTpm dW5jdGlvbigpe2lmKHRoaXMucmVuZGVyZWQmJnRoaXMubWFza0Rpc2FibGVkKXt0 aGlzLmVsLnVubWFzaygpfUV4dC5QYW5lbC5zdXBlcmNsYXNzLm9uRW5hYmxlLmNh bGwodGhpcyl9LG9uUmVzaXplOmZ1bmN0aW9uKGcsZCxjLGUpe3ZhciBhPWcsYj1k O2lmKEV4dC5pc0RlZmluZWQoYSl8fEV4dC5pc0RlZmluZWQoYikpe2lmKCF0aGlz LmNvbGxhcHNlZCl7aWYoRXh0LmlzTnVtYmVyKGEpKXt0aGlzLmJvZHkuc2V0V2lk dGgoYT10aGlzLmFkanVzdEJvZHlXaWR0aChhLXRoaXMuZ2V0RnJhbWVXaWR0aCgp KSl9ZWxzZXtpZihhPT0iYXV0byIpe2E9dGhpcy5ib2R5LnNldFdpZHRoKCJhdXRv IikuZG9tLm9mZnNldFdpZHRofWVsc2V7YT10aGlzLmJvZHkuZG9tLm9mZnNldFdp ZHRofX1pZih0aGlzLnRiYXIpe3RoaXMudGJhci5zZXRXaWR0aChhKTtpZih0aGlz LnRvcFRvb2xiYXIpe3RoaXMudG9wVG9vbGJhci5zZXRTaXplKGEpfX1pZih0aGlz LmJiYXIpe3RoaXMuYmJhci5zZXRXaWR0aChhKTtpZih0aGlzLmJvdHRvbVRvb2xi YXIpe3RoaXMuYm90dG9tVG9vbGJhci5zZXRTaXplKGEpO2lmKEV4dC5pc0lFKXt0 aGlzLmJiYXIuc2V0U3R5bGUoInBvc2l0aW9uIiwic3RhdGljIik7dGhpcy5iYmFy LnNldFN0eWxlKCJwb3NpdGlvbiIsIiIpfX19aWYodGhpcy5mb290ZXIpe3RoaXMu Zm9vdGVyLnNldFdpZHRoKGEpO2lmKHRoaXMuZmJhcil7dGhpcy5mYmFyLnNldFNp emUoRXh0LmlzSUU/KGEtdGhpcy5mb290ZXIuZ2V0RnJhbWVXaWR0aCgibHIiKSk6 ImF1dG8iKX19aWYoRXh0LmlzTnVtYmVyKGIpKXtiPU1hdGgubWF4KDAsYi10aGlz LmdldEZyYW1lSGVpZ2h0KCkpO3RoaXMuYm9keS5zZXRIZWlnaHQoYil9ZWxzZXtp ZihiPT0iYXV0byIpe3RoaXMuYm9keS5zZXRIZWlnaHQoYil9fWlmKHRoaXMuZGlz YWJsZWQmJnRoaXMuZWwuX21hc2spe3RoaXMuZWwuX21hc2suc2V0U2l6ZSh0aGlz LmVsLmRvbS5jbGllbnRXaWR0aCx0aGlzLmVsLmdldEhlaWdodCgpKX19ZWxzZXt0 aGlzLnF1ZXVlZEJvZHlTaXplPXt3aWR0aDphLGhlaWdodDpifTtpZighdGhpcy5x dWV1ZWRFeHBhbmQmJnRoaXMuYWxsb3dRdWV1ZWRFeHBhbmQhPT1mYWxzZSl7dGhp cy5xdWV1ZWRFeHBhbmQ9dHJ1ZTt0aGlzLm9uKCJleHBhbmQiLGZ1bmN0aW9uKCl7 ZGVsZXRlIHRoaXMucXVldWVkRXhwYW5kO3RoaXMub25SZXNpemUodGhpcy5xdWV1 ZWRCb2R5U2l6ZS53aWR0aCx0aGlzLnF1ZXVlZEJvZHlTaXplLmhlaWdodCl9LHRo aXMse3NpbmdsZTp0cnVlfSl9fXRoaXMub25Cb2R5UmVzaXplKGEsYil9dGhpcy5z eW5jU2hhZG93KCk7RXh0LlBhbmVsLnN1cGVyY2xhc3Mub25SZXNpemUuY2FsbCh0 aGlzLGcsZCxjLGUpfSxvbkJvZHlSZXNpemU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZp cmVFdmVudCgiYm9keXJlc2l6ZSIsdGhpcyxhLGIpfSxnZXRUb29sYmFySGVpZ2h0 OmZ1bmN0aW9uKCl7dmFyIGE9MDtpZih0aGlzLnJlbmRlcmVkKXtFeHQuZWFjaCh0 aGlzLnRvb2xiYXJzLGZ1bmN0aW9uKGIpe2ErPWIuZ2V0SGVpZ2h0KCl9LHRoaXMp fXJldHVybiBhfSxhZGp1c3RCb2R5SGVpZ2h0OmZ1bmN0aW9uKGEpe3JldHVybiBh fSxhZGp1c3RCb2R5V2lkdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LG9uUG9zaXRp b246ZnVuY3Rpb24oKXt0aGlzLnN5bmNTaGFkb3coKX0sZ2V0RnJhbWVXaWR0aDpm dW5jdGlvbigpe3ZhciBiPXRoaXMuZWwuZ2V0RnJhbWVXaWR0aCgibHIiKSt0aGlz LmJ3cmFwLmdldEZyYW1lV2lkdGgoImxyIik7aWYodGhpcy5mcmFtZSl7dmFyIGE9 dGhpcy5id3JhcC5kb20uZmlyc3RDaGlsZDtiKz0oRXh0LmZseShhKS5nZXRGcmFt ZVdpZHRoKCJsIikrRXh0LmZseShhLmZpcnN0Q2hpbGQpLmdldEZyYW1lV2lkdGgo InIiKSk7Yis9dGhpcy5tYy5nZXRGcmFtZVdpZHRoKCJsciIpfXJldHVybiBifSxn ZXRGcmFtZUhlaWdodDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWwuZ2V0RnJhbWVX aWR0aCgidGIiKSt0aGlzLmJ3cmFwLmdldEZyYW1lV2lkdGgoInRiIik7YSs9KHRo aXMudGJhcj90aGlzLnRiYXIuZ2V0SGVpZ2h0KCk6MCkrKHRoaXMuYmJhcj90aGlz LmJiYXIuZ2V0SGVpZ2h0KCk6MCk7aWYodGhpcy5mcmFtZSl7YSs9dGhpcy5lbC5k b20uZmlyc3RDaGlsZC5vZmZzZXRIZWlnaHQrdGhpcy5mdC5kb20ub2Zmc2V0SGVp Z2h0K3RoaXMubWMuZ2V0RnJhbWVXaWR0aCgidGIiKX1lbHNle2ErPSh0aGlzLmhl YWRlcj90aGlzLmhlYWRlci5nZXRIZWlnaHQoKTowKSsodGhpcy5mb290ZXI/dGhp cy5mb290ZXIuZ2V0SGVpZ2h0KCk6MCl9cmV0dXJuIGF9LGdldElubmVyV2lkdGg6 ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTaXplKCkud2lkdGgtdGhpcy5nZXRG cmFtZVdpZHRoKCl9LGdldElubmVySGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRo aXMuYm9keS5nZXRIZWlnaHQoKX0sc3luY1NoYWRvdzpmdW5jdGlvbigpe2lmKHRo aXMuZmxvYXRpbmcpe3RoaXMuZWwuc3luYyh0cnVlKX19LGdldExheW91dFRhcmdl dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvZHl9LGdldENvbnRlbnRUYXJnZXQ6 ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ib2R5fSxzZXRUaXRsZTpmdW5jdGlvbihi LGEpe3RoaXMudGl0bGU9YjtpZih0aGlzLmhlYWRlciYmdGhpcy5oZWFkZXJBc1Rl eHQpe3RoaXMuaGVhZGVyLmNoaWxkKCJzcGFuIikudXBkYXRlKGIpfWlmKGEpe3Ro aXMuc2V0SWNvbkNsYXNzKGEpfXRoaXMuZmlyZUV2ZW50KCJ0aXRsZWNoYW5nZSIs dGhpcyxiKTtyZXR1cm4gdGhpc30sZ2V0VXBkYXRlcjpmdW5jdGlvbigpe3JldHVy biB0aGlzLmJvZHkuZ2V0VXBkYXRlcigpfSxsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9 dGhpcy5ib2R5LmdldFVwZGF0ZXIoKTthLnVwZGF0ZS5hcHBseShhLGFyZ3VtZW50 cyk7cmV0dXJuIHRoaXN9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXtFeHQuUGFu ZWwuc3VwZXJjbGFzcy5iZWZvcmVEZXN0cm95LmNhbGwodGhpcyk7aWYodGhpcy5o ZWFkZXIpe3RoaXMuaGVhZGVyLnJlbW92ZUFsbExpc3RlbmVycygpfWlmKHRoaXMu dG9vbHMpe2Zvcih2YXIgYSBpbiB0aGlzLnRvb2xzKXtFeHQuZGVzdHJveSh0aGlz LnRvb2xzW2FdKX19aWYodGhpcy50b29sYmFycy5sZW5ndGg+MCl7RXh0LmVhY2go dGhpcy50b29sYmFycyxmdW5jdGlvbihiKXtiLnVuKCJhZnRlcmxheW91dCIsdGhp cy5zeW5jSGVpZ2h0LHRoaXMpO2IudW4oInJlbW92ZSIsdGhpcy5zeW5jSGVpZ2h0 LHRoaXMpfSx0aGlzKX1pZihFeHQuaXNBcnJheSh0aGlzLmJ1dHRvbnMpKXt3aGls ZSh0aGlzLmJ1dHRvbnMubGVuZ3RoKXtFeHQuZGVzdHJveSh0aGlzLmJ1dHRvbnNb MF0pfX1pZih0aGlzLnJlbmRlcmVkKXtFeHQuZGVzdHJveSh0aGlzLmZ0LHRoaXMu aGVhZGVyLHRoaXMuZm9vdGVyLHRoaXMudGJhcix0aGlzLmJiYXIsdGhpcy5ib2R5 LHRoaXMubWMsdGhpcy5id3JhcCx0aGlzLmRkKTtpZih0aGlzLmZiYXIpe0V4dC5k ZXN0cm95KHRoaXMuZmJhcix0aGlzLmZiYXIuZWwpfX1FeHQuZGVzdHJveSh0aGlz LnRvb2xiYXJzKX0sY3JlYXRlQ2xhc3NlczpmdW5jdGlvbigpe3RoaXMuaGVhZGVy Q2xzPXRoaXMuYmFzZUNscysiLWhlYWRlciI7dGhpcy5oZWFkZXJUZXh0Q2xzPXRo aXMuYmFzZUNscysiLWhlYWRlci10ZXh0Ijt0aGlzLmJ3cmFwQ2xzPXRoaXMuYmFz ZUNscysiLWJ3cmFwIjt0aGlzLnRiYXJDbHM9dGhpcy5iYXNlQ2xzKyItdGJhciI7 dGhpcy5ib2R5Q2xzPXRoaXMuYmFzZUNscysiLWJvZHkiO3RoaXMuYmJhckNscz10 aGlzLmJhc2VDbHMrIi1iYmFyIjt0aGlzLmZvb3RlckNscz10aGlzLmJhc2VDbHMr Ii1mb290ZXIifSxjcmVhdGVHaG9zdDpmdW5jdGlvbihhLGUsYil7dmFyIGQ9ZG9j dW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5jbGFzc05hbWU9IngtcGFuZWwt Z2hvc3QgIisoYT9hOiIiKTtpZih0aGlzLmhlYWRlcil7ZC5hcHBlbmRDaGlsZCh0 aGlzLmVsLmRvbS5maXJzdENoaWxkLmNsb25lTm9kZSh0cnVlKSl9RXh0LmZseShk LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInVsIikpKS5zZXRI ZWlnaHQodGhpcy5id3JhcC5nZXRIZWlnaHQoKSk7ZC5zdHlsZS53aWR0aD10aGlz LmVsLmRvbS5vZmZzZXRXaWR0aCsicHgiO2lmKCFiKXt0aGlzLmNvbnRhaW5lci5k b20uYXBwZW5kQ2hpbGQoZCl9ZWxzZXtFeHQuZ2V0RG9tKGIpLmFwcGVuZENoaWxk KGQpfWlmKGUhPT1mYWxzZSYmdGhpcy5lbC51c2VTaGltIT09ZmFsc2Upe3ZhciBj PW5ldyBFeHQuTGF5ZXIoe3NoYWRvdzpmYWxzZSx1c2VEaXNwbGF5OnRydWUsY29u c3RyYWluOmZhbHNlfSxkKTtjLnNob3coKTtyZXR1cm4gY31lbHNle3JldHVybiBu ZXcgRXh0LkVsZW1lbnQoZCl9fSxkb0F1dG9Mb2FkOmZ1bmN0aW9uKCl7dmFyIGE9 dGhpcy5ib2R5LmdldFVwZGF0ZXIoKTtpZih0aGlzLnJlbmRlcmVyKXthLnNldFJl bmRlcmVyKHRoaXMucmVuZGVyZXIpfWEudXBkYXRlKEV4dC5pc09iamVjdCh0aGlz LmF1dG9Mb2FkKT90aGlzLmF1dG9Mb2FkOnt1cmw6dGhpcy5hdXRvTG9hZH0pfSxn ZXRUb29sOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRvb2xzW2FdfX0pO0V4dC5y ZWcoInBhbmVsIixFeHQuUGFuZWwpO0V4dC5FZGl0b3I9ZnVuY3Rpb24oYixhKXtp ZihiLmZpZWxkKXt0aGlzLmZpZWxkPUV4dC5jcmVhdGUoYi5maWVsZCwidGV4dGZp ZWxkIik7YT1FeHQuYXBwbHkoe30sYik7ZGVsZXRlIGEuZmllbGR9ZWxzZXt0aGlz LmZpZWxkPWJ9RXh0LkVkaXRvci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwo dGhpcyxhKX07RXh0LmV4dGVuZChFeHQuRWRpdG9yLEV4dC5Db21wb25lbnQse2Fs bG93Qmx1cjp0cnVlLHZhbHVlOiIiLGFsaWdubWVudDoiYy1jPyIsb2Zmc2V0czpb MCwwXSxzaGFkb3c6ImZyYW1lIixjb25zdHJhaW46ZmFsc2Usc3dhbGxvd0tleXM6 dHJ1ZSxjb21wbGV0ZU9uRW50ZXI6dHJ1ZSxjYW5jZWxPbkVzYzp0cnVlLHVwZGF0 ZUVsOmZhbHNlLGluaXRDb21wb25lbnQ6ZnVuY3Rpb24oKXtFeHQuRWRpdG9yLnN1 cGVyY2xhc3MuaW5pdENvbXBvbmVudC5jYWxsKHRoaXMpO3RoaXMuYWRkRXZlbnRz KCJiZWZvcmVzdGFydGVkaXQiLCJzdGFydGVkaXQiLCJiZWZvcmVjb21wbGV0ZSIs ImNvbXBsZXRlIiwiY2FuY2VsZWRpdCIsInNwZWNpYWxrZXkiKX0sb25SZW5kZXI6 ZnVuY3Rpb24oYixhKXt0aGlzLmVsPW5ldyBFeHQuTGF5ZXIoe3NoYWRvdzp0aGlz LnNoYWRvdyxjbHM6IngtZWRpdG9yIixwYXJlbnRFbDpiLHNoaW06dGhpcy5zaGlt LHNoYWRvd09mZnNldDp0aGlzLnNoYWRvd09mZnNldHx8NCxpZDp0aGlzLmlkLGNv bnN0cmFpbjp0aGlzLmNvbnN0cmFpbn0pO2lmKHRoaXMuekluZGV4KXt0aGlzLmVs LnNldFpJbmRleCh0aGlzLnpJbmRleCl9dGhpcy5lbC5zZXRTdHlsZSgib3ZlcmZs b3ciLEV4dC5pc0dlY2tvPyJhdXRvIjoiaGlkZGVuIik7aWYodGhpcy5maWVsZC5t c2dUYXJnZXQhPSJ0aXRsZSIpe3RoaXMuZmllbGQubXNnVGFyZ2V0PSJxdGlwIn10 aGlzLmZpZWxkLmluRWRpdG9yPXRydWU7dGhpcy5tb24odGhpcy5maWVsZCx7c2Nv cGU6dGhpcyxibHVyOnRoaXMub25CbHVyLHNwZWNpYWxrZXk6dGhpcy5vblNwZWNp YWxLZXl9KTtpZih0aGlzLmZpZWxkLmdyb3cpe3RoaXMubW9uKHRoaXMuZmllbGQs ImF1dG9zaXplIix0aGlzLmVsLnN5bmMsdGhpcy5lbCx7ZGVsYXk6MX0pfXRoaXMu ZmllbGQucmVuZGVyKHRoaXMuZWwpLnNob3coKTt0aGlzLmZpZWxkLmdldEVsKCku ZG9tLm5hbWU9IiI7aWYodGhpcy5zd2FsbG93S2V5cyl7dGhpcy5maWVsZC5lbC5z d2FsbG93RXZlbnQoWyJrZXlwcmVzcyIsImtleWRvd24iXSl9fSxvblNwZWNpYWxL ZXk6ZnVuY3Rpb24oZyxkKXt2YXIgYj1kLmdldEtleSgpLGE9dGhpcy5jb21wbGV0 ZU9uRW50ZXImJmI9PWQuRU5URVIsYz10aGlzLmNhbmNlbE9uRXNjJiZiPT1kLkVT QztpZihhfHxjKXtkLnN0b3BFdmVudCgpO2lmKGEpe3RoaXMuY29tcGxldGVFZGl0 KCl9ZWxzZXt0aGlzLmNhbmNlbEVkaXQoKX1pZihnLnRyaWdnZXJCbHVyKXtnLnRy aWdnZXJCbHVyKCl9fXRoaXMuZmlyZUV2ZW50KCJzcGVjaWFsa2V5IixnLGQpfSxz dGFydEVkaXQ6ZnVuY3Rpb24oYixjKXtpZih0aGlzLmVkaXRpbmcpe3RoaXMuY29t cGxldGVFZGl0KCl9dGhpcy5ib3VuZEVsPUV4dC5nZXQoYik7dmFyIGE9YyE9PXVu ZGVmaW5lZD9jOnRoaXMuYm91bmRFbC5kb20uaW5uZXJIVE1MO2lmKCF0aGlzLnJl bmRlcmVkKXt0aGlzLnJlbmRlcih0aGlzLnBhcmVudEVsfHxkb2N1bWVudC5ib2R5 KX1pZih0aGlzLmZpcmVFdmVudCgiYmVmb3Jlc3RhcnRlZGl0Iix0aGlzLHRoaXMu Ym91bmRFbCxhKSE9PWZhbHNlKXt0aGlzLnN0YXJ0VmFsdWU9YTt0aGlzLmZpZWxk LnJlc2V0KCk7dGhpcy5maWVsZC5zZXRWYWx1ZShhKTt0aGlzLnJlYWxpZ24odHJ1 ZSk7dGhpcy5lZGl0aW5nPXRydWU7dGhpcy5zaG93KCl9fSxkb0F1dG9TaXplOmZ1 bmN0aW9uKCl7aWYodGhpcy5hdXRvU2l6ZSl7dmFyIGI9dGhpcy5ib3VuZEVsLmdl dFNpemUoKSxhPXRoaXMuZmllbGQuZ2V0U2l6ZSgpO3N3aXRjaCh0aGlzLmF1dG9T aXplKXtjYXNlIndpZHRoIjp0aGlzLnNldFNpemUoYi53aWR0aCxhLmhlaWdodCk7 YnJlYWs7Y2FzZSJoZWlnaHQiOnRoaXMuc2V0U2l6ZShhLndpZHRoLGIuaGVpZ2h0 KTticmVhaztjYXNlIm5vbmUiOnRoaXMuc2V0U2l6ZShhLndpZHRoLGEuaGVpZ2h0 KTticmVhaztkZWZhdWx0OnRoaXMuc2V0U2l6ZShiLndpZHRoLGIuaGVpZ2h0KX19 fSxzZXRTaXplOmZ1bmN0aW9uKGEsYil7ZGVsZXRlIHRoaXMuZmllbGQubGFzdFNp emU7dGhpcy5maWVsZC5zZXRTaXplKGEsYik7aWYodGhpcy5lbCl7aWYoRXh0Lmlz R2Vja28yfHxFeHQuaXNPcGVyYXx8KEV4dC5pc0lFNyYmRXh0LmlzU3RyaWN0KSl7 dGhpcy5lbC5zZXRTaXplKGEsYil9dGhpcy5lbC5zeW5jKCl9fSxyZWFsaWduOmZ1 bmN0aW9uKGEpe2lmKGE9PT10cnVlKXt0aGlzLmRvQXV0b1NpemUoKX10aGlzLmVs LmFsaWduVG8odGhpcy5ib3VuZEVsLHRoaXMuYWxpZ25tZW50LHRoaXMub2Zmc2V0 cyl9LGNvbXBsZXRlRWRpdDpmdW5jdGlvbihhKXtpZighdGhpcy5lZGl0aW5nKXty ZXR1cm59aWYodGhpcy5maWVsZC5hc3NlcnRWYWx1ZSl7dGhpcy5maWVsZC5hc3Nl cnRWYWx1ZSgpfXZhciBiPXRoaXMuZ2V0VmFsdWUoKTtpZighdGhpcy5maWVsZC5p c1ZhbGlkKCkpe2lmKHRoaXMucmV2ZXJ0SW52YWxpZCE9PWZhbHNlKXt0aGlzLmNh bmNlbEVkaXQoYSl9cmV0dXJufWlmKFN0cmluZyhiKT09PVN0cmluZyh0aGlzLnN0 YXJ0VmFsdWUpJiZ0aGlzLmlnbm9yZU5vQ2hhbmdlKXt0aGlzLmhpZGVFZGl0KGEp O3JldHVybn1pZih0aGlzLmZpcmVFdmVudCgiYmVmb3JlY29tcGxldGUiLHRoaXMs Yix0aGlzLnN0YXJ0VmFsdWUpIT09ZmFsc2Upe2I9dGhpcy5nZXRWYWx1ZSgpO2lm KHRoaXMudXBkYXRlRWwmJnRoaXMuYm91bmRFbCl7dGhpcy5ib3VuZEVsLnVwZGF0 ZShiKX10aGlzLmhpZGVFZGl0KGEpO3RoaXMuZmlyZUV2ZW50KCJjb21wbGV0ZSIs dGhpcyxiLHRoaXMuc3RhcnRWYWx1ZSl9fSxvblNob3c6ZnVuY3Rpb24oKXt0aGlz LmVsLnNob3coKTtpZih0aGlzLmhpZGVFbCE9PWZhbHNlKXt0aGlzLmJvdW5kRWwu aGlkZSgpfXRoaXMuZmllbGQuc2hvdygpLmZvY3VzKGZhbHNlLHRydWUpO3RoaXMu ZmlyZUV2ZW50KCJzdGFydGVkaXQiLHRoaXMuYm91bmRFbCx0aGlzLnN0YXJ0VmFs dWUpfSxjYW5jZWxFZGl0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuZWRpdGluZyl7dmFy IGI9dGhpcy5nZXRWYWx1ZSgpO3RoaXMuc2V0VmFsdWUodGhpcy5zdGFydFZhbHVl KTt0aGlzLmhpZGVFZGl0KGEpO3RoaXMuZmlyZUV2ZW50KCJjYW5jZWxlZGl0Iix0 aGlzLGIsdGhpcy5zdGFydFZhbHVlKX19LGhpZGVFZGl0OmZ1bmN0aW9uKGEpe2lm KGEhPT10cnVlKXt0aGlzLmVkaXRpbmc9ZmFsc2U7dGhpcy5oaWRlKCl9fSxvbkJs dXI6ZnVuY3Rpb24oKXtpZih0aGlzLmFsbG93Qmx1cj09PXRydWUmJnRoaXMuZWRp dGluZyYmdGhpcy5zZWxlY3RTYW1lRWRpdG9yIT09dHJ1ZSl7dGhpcy5jb21wbGV0 ZUVkaXQoKX19LG9uSGlkZTpmdW5jdGlvbigpe2lmKHRoaXMuZWRpdGluZyl7dGhp cy5jb21wbGV0ZUVkaXQoKTtyZXR1cm59dGhpcy5maWVsZC5ibHVyKCk7aWYodGhp cy5maWVsZC5jb2xsYXBzZSl7dGhpcy5maWVsZC5jb2xsYXBzZSgpfXRoaXMuZWwu aGlkZSgpO2lmKHRoaXMuaGlkZUVsIT09ZmFsc2Upe3RoaXMuYm91bmRFbC5zaG93 KCl9fSxzZXRWYWx1ZTpmdW5jdGlvbihhKXt0aGlzLmZpZWxkLnNldFZhbHVlKGEp fSxnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpZWxkLmdldFZhbHVl KCl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXtFeHQuZGVzdHJveU1lbWJlcnMo dGhpcywiZmllbGQiKTtkZWxldGUgdGhpcy5wYXJlbnRFbDtkZWxldGUgdGhpcy5i b3VuZEVsfX0pO0V4dC5yZWcoImVkaXRvciIsRXh0LkVkaXRvcik7RXh0LkNvbG9y UGFsZXR0ZT1FeHQuZXh0ZW5kKEV4dC5Db21wb25lbnQse2l0ZW1DbHM6IngtY29s b3ItcGFsZXR0ZSIsdmFsdWU6bnVsbCxjbGlja0V2ZW50OiJjbGljayIsY3R5cGU6 IkV4dC5Db2xvclBhbGV0dGUiLGFsbG93UmVzZWxlY3Q6ZmFsc2UsY29sb3JzOlsi MDAwMDAwIiwiOTkzMzAwIiwiMzMzMzAwIiwiMDAzMzAwIiwiMDAzMzY2IiwiMDAw MDgwIiwiMzMzMzk5IiwiMzMzMzMzIiwiODAwMDAwIiwiRkY2NjAwIiwiODA4MDAw IiwiMDA4MDAwIiwiMDA4MDgwIiwiMDAwMEZGIiwiNjY2Njk5IiwiODA4MDgwIiwi RkYwMDAwIiwiRkY5OTAwIiwiOTlDQzAwIiwiMzM5OTY2IiwiMzNDQ0NDIiwiMzM2 NkZGIiwiODAwMDgwIiwiOTY5Njk2IiwiRkYwMEZGIiwiRkZDQzAwIiwiRkZGRjAw IiwiMDBGRjAwIiwiMDBGRkZGIiwiMDBDQ0ZGIiwiOTkzMzY2IiwiQzBDMEMwIiwi RkY5OUNDIiwiRkZDQzk5IiwiRkZGRjk5IiwiQ0NGRkNDIiwiQ0NGRkZGIiwiOTlD Q0ZGIiwiQ0M5OUZGIiwiRkZGRkZGIl0saW5pdENvbXBvbmVudDpmdW5jdGlvbigp e0V4dC5Db2xvclBhbGV0dGUuc3VwZXJjbGFzcy5pbml0Q29tcG9uZW50LmNhbGwo dGhpcyk7dGhpcy5hZGRFdmVudHMoInNlbGVjdCIpO2lmKHRoaXMuaGFuZGxlcil7 dGhpcy5vbigic2VsZWN0Iix0aGlzLmhhbmRsZXIsdGhpcy5zY29wZSx0cnVlKX19 LG9uUmVuZGVyOmZ1bmN0aW9uKGIsYSl7dGhpcy5hdXRvRWw9e3RhZzoiZGl2Iixj bHM6dGhpcy5pdGVtQ2xzfTtFeHQuQ29sb3JQYWxldHRlLnN1cGVyY2xhc3Mub25S ZW5kZXIuY2FsbCh0aGlzLGIsYSk7dmFyIGM9dGhpcy50cGx8fG5ldyBFeHQuWFRl bXBsYXRlKCc8dHBsIGZvcj0iLiI+PGEgaHJlZj0iIyIgY2xhc3M9ImNvbG9yLXsu fSIgaGlkZWZvY3VzPSJvbiI+PGVtPjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kOiN7 Ln0iIHVuc2VsZWN0YWJsZT0ib24iPiYjMTYwOzwvc3Bhbj48L2VtPjwvYT48L3Rw bD4nKTtjLm92ZXJ3cml0ZSh0aGlzLmVsLHRoaXMuY29sb3JzKTt0aGlzLm1vbih0 aGlzLmVsLHRoaXMuY2xpY2tFdmVudCx0aGlzLmhhbmRsZUNsaWNrLHRoaXMse2Rl bGVnYXRlOiJhIn0pO2lmKHRoaXMuY2xpY2tFdmVudCE9ImNsaWNrIil7dGhpcy5t b24odGhpcy5lbCwiY2xpY2siLEV4dC5lbXB0eUZuLHRoaXMse2RlbGVnYXRlOiJh IixwcmV2ZW50RGVmYXVsdDp0cnVlfSl9fSxhZnRlclJlbmRlcjpmdW5jdGlvbigp e0V4dC5Db2xvclBhbGV0dGUuc3VwZXJjbGFzcy5hZnRlclJlbmRlci5jYWxsKHRo aXMpO2lmKHRoaXMudmFsdWUpe3ZhciBhPXRoaXMudmFsdWU7dGhpcy52YWx1ZT1u dWxsO3RoaXMuc2VsZWN0KGEsdHJ1ZSl9fSxoYW5kbGVDbGljazpmdW5jdGlvbihi LGEpe2IucHJldmVudERlZmF1bHQoKTtpZighdGhpcy5kaXNhYmxlZCl7dmFyIGQ9 YS5jbGFzc05hbWUubWF0Y2goLyg/Ol58XHMpY29sb3ItKC57Nn0pKD86XHN8JCkv KVsxXTt0aGlzLnNlbGVjdChkLnRvVXBwZXJDYXNlKCkpfX0sc2VsZWN0OmZ1bmN0 aW9uKGIsYSl7Yj1iLnJlcGxhY2UoIiMiLCIiKTtpZihiIT10aGlzLnZhbHVlfHx0 aGlzLmFsbG93UmVzZWxlY3Qpe3ZhciBjPXRoaXMuZWw7aWYodGhpcy52YWx1ZSl7 Yy5jaGlsZCgiYS5jb2xvci0iK3RoaXMudmFsdWUpLnJlbW92ZUNsYXNzKCJ4LWNv bG9yLXBhbGV0dGUtc2VsIil9Yy5jaGlsZCgiYS5jb2xvci0iK2IpLmFkZENsYXNz KCJ4LWNvbG9yLXBhbGV0dGUtc2VsIik7dGhpcy52YWx1ZT1iO2lmKGEhPT10cnVl KXt0aGlzLmZpcmVFdmVudCgic2VsZWN0Iix0aGlzLGIpfX19fSk7RXh0LnJlZygi Y29sb3JwYWxldHRlIixFeHQuQ29sb3JQYWxldHRlKTtFeHQuRGF0ZVBpY2tlcj1F eHQuZXh0ZW5kKEV4dC5Cb3hDb21wb25lbnQse3RvZGF5VGV4dDoiVG9kYXkiLG9r VGV4dDoiJiMxNjA7T0smIzE2MDsiLGNhbmNlbFRleHQ6IkNhbmNlbCIsdG9kYXlU aXA6InswfSAoU3BhY2ViYXIpIixtaW5UZXh0OiJUaGlzIGRhdGUgaXMgYmVmb3Jl IHRoZSBtaW5pbXVtIGRhdGUiLG1heFRleHQ6IlRoaXMgZGF0ZSBpcyBhZnRlciB0 aGUgbWF4aW11bSBkYXRlIixmb3JtYXQ6Im0vZC95IixkaXNhYmxlZERheXNUZXh0 OiJEaXNhYmxlZCIsZGlzYWJsZWREYXRlc1RleHQ6IkRpc2FibGVkIixtb250aE5h bWVzOkRhdGUubW9udGhOYW1lcyxkYXlOYW1lczpEYXRlLmRheU5hbWVzLG5leHRU ZXh0OiJOZXh0IE1vbnRoIChDb250cm9sK1JpZ2h0KSIscHJldlRleHQ6IlByZXZp b3VzIE1vbnRoIChDb250cm9sK0xlZnQpIixtb250aFllYXJUZXh0OiJDaG9vc2Ug YSBtb250aCAoQ29udHJvbCtVcC9Eb3duIHRvIG1vdmUgeWVhcnMpIixzdGFydERh eTowLHNob3dUb2RheTp0cnVlLGZvY3VzT25TZWxlY3Q6dHJ1ZSxpbml0SG91cjox Mixpbml0Q29tcG9uZW50OmZ1bmN0aW9uKCl7RXh0LkRhdGVQaWNrZXIuc3VwZXJj bGFzcy5pbml0Q29tcG9uZW50LmNhbGwodGhpcyk7dGhpcy52YWx1ZT10aGlzLnZh bHVlP3RoaXMudmFsdWUuY2xlYXJUaW1lKHRydWUpOm5ldyBEYXRlKCkuY2xlYXJU aW1lKCk7dGhpcy5hZGRFdmVudHMoInNlbGVjdCIpO2lmKHRoaXMuaGFuZGxlcil7 dGhpcy5vbigic2VsZWN0Iix0aGlzLmhhbmRsZXIsdGhpcy5zY29wZXx8dGhpcyl9 dGhpcy5pbml0RGlzYWJsZWREYXlzKCl9LGluaXREaXNhYmxlZERheXM6ZnVuY3Rp b24oKXtpZighdGhpcy5kaXNhYmxlZERhdGVzUkUmJnRoaXMuZGlzYWJsZWREYXRl cyl7dmFyIGI9dGhpcy5kaXNhYmxlZERhdGVzLGE9Yi5sZW5ndGgtMSxjPSIoPzoi O0V4dC5lYWNoKGIsZnVuY3Rpb24oZyxlKXtjKz1FeHQuaXNEYXRlKGcpPyJeIitF eHQuZXNjYXBlUmUoZy5kYXRlRm9ybWF0KHRoaXMuZm9ybWF0KSkrIiQiOmJbZV07 aWYoZSE9YSl7Yys9InwifX0sdGhpcyk7dGhpcy5kaXNhYmxlZERhdGVzUkU9bmV3 IFJlZ0V4cChjKyIpIil9fSxzZXREaXNhYmxlZERhdGVzOmZ1bmN0aW9uKGEpe2lm KEV4dC5pc0FycmF5KGEpKXt0aGlzLmRpc2FibGVkRGF0ZXM9YTt0aGlzLmRpc2Fi bGVkRGF0ZXNSRT1udWxsfWVsc2V7dGhpcy5kaXNhYmxlZERhdGVzUkU9YX10aGlz LmluaXREaXNhYmxlZERheXMoKTt0aGlzLnVwZGF0ZSh0aGlzLnZhbHVlLHRydWUp fSxzZXREaXNhYmxlZERheXM6ZnVuY3Rpb24oYSl7dGhpcy5kaXNhYmxlZERheXM9 YTt0aGlzLnVwZGF0ZSh0aGlzLnZhbHVlLHRydWUpfSxzZXRNaW5EYXRlOmZ1bmN0 aW9uKGEpe3RoaXMubWluRGF0ZT1hO3RoaXMudXBkYXRlKHRoaXMudmFsdWUsdHJ1 ZSl9LHNldE1heERhdGU6ZnVuY3Rpb24oYSl7dGhpcy5tYXhEYXRlPWE7dGhpcy51 cGRhdGUodGhpcy52YWx1ZSx0cnVlKX0sc2V0VmFsdWU6ZnVuY3Rpb24oYSl7dGhp cy52YWx1ZT1hLmNsZWFyVGltZSh0cnVlKTt0aGlzLnVwZGF0ZSh0aGlzLnZhbHVl KX0sZ2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZX0sZm9jdXM6 ZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZSh0aGlzLmFjdGl2ZURhdGUpfSxvbkVuYWJs ZTpmdW5jdGlvbihhKXtFeHQuRGF0ZVBpY2tlci5zdXBlcmNsYXNzLm9uRW5hYmxl LmNhbGwodGhpcyk7dGhpcy5kb0Rpc2FibGVkKGZhbHNlKTt0aGlzLnVwZGF0ZShh P3RoaXMudmFsdWU6dGhpcy5hY3RpdmVEYXRlKTtpZihFeHQuaXNJRSl7dGhpcy5l bC5yZXBhaW50KCl9fSxvbkRpc2FibGU6ZnVuY3Rpb24oKXtFeHQuRGF0ZVBpY2tl ci5zdXBlcmNsYXNzLm9uRGlzYWJsZS5jYWxsKHRoaXMpO3RoaXMuZG9EaXNhYmxl ZCh0cnVlKTtpZihFeHQuaXNJRSYmIUV4dC5pc0lFOCl7RXh0LmVhY2goW10uY29u Y2F0KHRoaXMudGV4dE5vZGVzLHRoaXMuZWwucXVlcnkoInRoIHNwYW4iKSksZnVu Y3Rpb24oYSl7RXh0LmZseShhKS5yZXBhaW50KCl9KX19LGRvRGlzYWJsZWQ6ZnVu Y3Rpb24oYSl7dGhpcy5rZXlOYXYuc2V0RGlzYWJsZWQoYSk7dGhpcy5wcmV2UmVw ZWF0ZXIuc2V0RGlzYWJsZWQoYSk7dGhpcy5uZXh0UmVwZWF0ZXIuc2V0RGlzYWJs ZWQoYSk7aWYodGhpcy5zaG93VG9kYXkpe3RoaXMudG9kYXlLZXlMaXN0ZW5lci5z ZXREaXNhYmxlZChhKTt0aGlzLnRvZGF5QnRuLnNldERpc2FibGVkKGEpfX0sb25S ZW5kZXI6ZnVuY3Rpb24oZSxiKXt2YXIgYT1bJzx0YWJsZSBjZWxsc3BhY2luZz0i MCI+JywnPHRyPjx0ZCBjbGFzcz0ieC1kYXRlLWxlZnQiPjxhIGhyZWY9IiMiIHRp dGxlPSInLHRoaXMucHJldlRleHQsJyI+JiMxNjA7PC9hPjwvdGQ+PHRkIGNsYXNz PSJ4LWRhdGUtbWlkZGxlIiBhbGlnbj0iY2VudGVyIj48L3RkPjx0ZCBjbGFzcz0i eC1kYXRlLXJpZ2h0Ij48YSBocmVmPSIjIiB0aXRsZT0iJyx0aGlzLm5leHRUZXh0 LCciPiYjMTYwOzwvYT48L3RkPjwvdHI+JywnPHRyPjx0ZCBjb2xzcGFuPSIzIj48 dGFibGUgY2xhc3M9IngtZGF0ZS1pbm5lciIgY2VsbHNwYWNpbmc9IjAiPjx0aGVh ZD48dHI+J10sYz10aGlzLmRheU5hbWVzLGg7Zm9yKGg9MDtoPDc7aCsrKXt2YXIg az10aGlzLnN0YXJ0RGF5K2g7aWYoaz42KXtrPWstN31hLnB1c2goIjx0aD48c3Bh bj4iLGNba10uc3Vic3RyKDAsMSksIjwvc3Bhbj48L3RoPiIpfWFbYS5sZW5ndGhd PSI8L3RyPjwvdGhlYWQ+PHRib2R5Pjx0cj4iO2ZvcihoPTA7aDw0MjtoKyspe2lm KGglNz09PTAmJmghPT0wKXthW2EubGVuZ3RoXT0iPC90cj48dHI+In1hW2EubGVu Z3RoXT0nPHRkPjxhIGhyZWY9IiMiIGhpZGVmb2N1cz0ib24iIGNsYXNzPSJ4LWRh dGUtZGF0ZSIgdGFiSW5kZXg9IjEiPjxlbT48c3Bhbj48L3NwYW4+PC9lbT48L2E+ PC90ZD4nfWEucHVzaCgiPC90cj48L3Rib2R5PjwvdGFibGU+PC90ZD48L3RyPiIs dGhpcy5zaG93VG9kYXk/Jzx0cj48dGQgY29sc3Bhbj0iMyIgY2xhc3M9IngtZGF0 ZS1ib3R0b20iIGFsaWduPSJjZW50ZXIiPjwvdGQ+PC90cj4nOiIiLCc8L3RhYmxl PjxkaXYgY2xhc3M9IngtZGF0ZS1tcCI+PC9kaXY+Jyk7dmFyIGo9ZG9jdW1lbnQu Y3JlYXRlRWxlbWVudCgiZGl2Iik7ai5jbGFzc05hbWU9IngtZGF0ZS1waWNrZXIi O2ouaW5uZXJIVE1MPWEuam9pbigiIik7ZS5kb20uaW5zZXJ0QmVmb3JlKGosYik7 dGhpcy5lbD1FeHQuZ2V0KGopO3RoaXMuZXZlbnRFbD1FeHQuZ2V0KGouZmlyc3RD aGlsZCk7dGhpcy5wcmV2UmVwZWF0ZXI9bmV3IEV4dC51dGlsLkNsaWNrUmVwZWF0 ZXIodGhpcy5lbC5jaGlsZCgidGQueC1kYXRlLWxlZnQgYSIpLHtoYW5kbGVyOnRo aXMuc2hvd1ByZXZNb250aCxzY29wZTp0aGlzLHByZXZlbnREZWZhdWx0OnRydWUs c3RvcERlZmF1bHQ6dHJ1ZX0pO3RoaXMubmV4dFJlcGVhdGVyPW5ldyBFeHQudXRp bC5DbGlja1JlcGVhdGVyKHRoaXMuZWwuY2hpbGQoInRkLngtZGF0ZS1yaWdodCBh Iikse2hhbmRsZXI6dGhpcy5zaG93TmV4dE1vbnRoLHNjb3BlOnRoaXMscHJldmVu dERlZmF1bHQ6dHJ1ZSxzdG9wRGVmYXVsdDp0cnVlfSk7dGhpcy5tb250aFBpY2tl cj10aGlzLmVsLmRvd24oImRpdi54LWRhdGUtbXAiKTt0aGlzLm1vbnRoUGlja2Vy LmVuYWJsZURpc3BsYXlNb2RlKCJibG9jayIpO3RoaXMua2V5TmF2PW5ldyBFeHQu S2V5TmF2KHRoaXMuZXZlbnRFbCx7bGVmdDpmdW5jdGlvbihkKXtpZihkLmN0cmxL ZXkpe3RoaXMuc2hvd1ByZXZNb250aCgpfWVsc2V7dGhpcy51cGRhdGUodGhpcy5h Y3RpdmVEYXRlLmFkZCgiZCIsLTEpKX19LHJpZ2h0OmZ1bmN0aW9uKGQpe2lmKGQu Y3RybEtleSl7dGhpcy5zaG93TmV4dE1vbnRoKCl9ZWxzZXt0aGlzLnVwZGF0ZSh0 aGlzLmFjdGl2ZURhdGUuYWRkKCJkIiwxKSl9fSx1cDpmdW5jdGlvbihkKXtpZihk LmN0cmxLZXkpe3RoaXMuc2hvd05leHRZZWFyKCl9ZWxzZXt0aGlzLnVwZGF0ZSh0 aGlzLmFjdGl2ZURhdGUuYWRkKCJkIiwtNykpfX0sZG93bjpmdW5jdGlvbihkKXtp ZihkLmN0cmxLZXkpe3RoaXMuc2hvd1ByZXZZZWFyKCl9ZWxzZXt0aGlzLnVwZGF0 ZSh0aGlzLmFjdGl2ZURhdGUuYWRkKCJkIiw3KSl9fSxwYWdlVXA6ZnVuY3Rpb24o ZCl7dGhpcy5zaG93TmV4dE1vbnRoKCl9LHBhZ2VEb3duOmZ1bmN0aW9uKGQpe3Ro aXMuc2hvd1ByZXZNb250aCgpfSxlbnRlcjpmdW5jdGlvbihkKXtkLnN0b3BQcm9w YWdhdGlvbigpO3JldHVybiB0cnVlfSxzY29wZTp0aGlzfSk7dGhpcy5lbC51bnNl bGVjdGFibGUoKTt0aGlzLmNlbGxzPXRoaXMuZWwuc2VsZWN0KCJ0YWJsZS54LWRh dGUtaW5uZXIgdGJvZHkgdGQiKTt0aGlzLnRleHROb2Rlcz10aGlzLmVsLnF1ZXJ5 KCJ0YWJsZS54LWRhdGUtaW5uZXIgdGJvZHkgc3BhbiIpO3RoaXMubWJ0bj1uZXcg RXh0LkJ1dHRvbih7dGV4dDoiJiMxNjA7Iix0b29sdGlwOnRoaXMubW9udGhZZWFy VGV4dCxyZW5kZXJUbzp0aGlzLmVsLmNoaWxkKCJ0ZC54LWRhdGUtbWlkZGxlIix0 cnVlKX0pO3RoaXMubWJ0bi5lbC5jaGlsZCgiZW0iKS5hZGRDbGFzcygieC1idG4t YXJyb3ciKTtpZih0aGlzLnNob3dUb2RheSl7dGhpcy50b2RheUtleUxpc3RlbmVy PXRoaXMuZXZlbnRFbC5hZGRLZXlMaXN0ZW5lcihFeHQuRXZlbnRPYmplY3QuU1BB Q0UsdGhpcy5zZWxlY3RUb2RheSx0aGlzKTt2YXIgZz0obmV3IERhdGUoKSkuZGF0 ZUZvcm1hdCh0aGlzLmZvcm1hdCk7dGhpcy50b2RheUJ0bj1uZXcgRXh0LkJ1dHRv bih7cmVuZGVyVG86dGhpcy5lbC5jaGlsZCgidGQueC1kYXRlLWJvdHRvbSIsdHJ1 ZSksdGV4dDpTdHJpbmcuZm9ybWF0KHRoaXMudG9kYXlUZXh0LGcpLHRvb2x0aXA6 U3RyaW5nLmZvcm1hdCh0aGlzLnRvZGF5VGlwLGcpLGhhbmRsZXI6dGhpcy5zZWxl Y3RUb2RheSxzY29wZTp0aGlzfSl9dGhpcy5tb24odGhpcy5ldmVudEVsLCJtb3Vz ZXdoZWVsIix0aGlzLmhhbmRsZU1vdXNlV2hlZWwsdGhpcyk7dGhpcy5tb24odGhp cy5ldmVudEVsLCJjbGljayIsdGhpcy5oYW5kbGVEYXRlQ2xpY2ssdGhpcyx7ZGVs ZWdhdGU6ImEueC1kYXRlLWRhdGUifSk7dGhpcy5tb24odGhpcy5tYnRuLCJjbGlj ayIsdGhpcy5zaG93TW9udGhQaWNrZXIsdGhpcyk7dGhpcy5vbkVuYWJsZSh0cnVl KX0sY3JlYXRlTW9udGhQaWNrZXI6ZnVuY3Rpb24oKXtpZighdGhpcy5tb250aFBp Y2tlci5kb20uZmlyc3RDaGlsZCl7dmFyIGE9Wyc8dGFibGUgYm9yZGVyPSIwIiBj ZWxsc3BhY2luZz0iMCI+J107Zm9yKHZhciBiPTA7Yjw2O2IrKyl7YS5wdXNoKCc8 dHI+PHRkIGNsYXNzPSJ4LWRhdGUtbXAtbW9udGgiPjxhIGhyZWY9IiMiPicsRGF0 ZS5nZXRTaG9ydE1vbnRoTmFtZShiKSwiPC9hPjwvdGQ+IiwnPHRkIGNsYXNzPSJ4 LWRhdGUtbXAtbW9udGggeC1kYXRlLW1wLXNlcCI+PGEgaHJlZj0iIyI+JyxEYXRl LmdldFNob3J0TW9udGhOYW1lKGIrNiksIjwvYT48L3RkPiIsYj09PTA/Jzx0ZCBj bGFzcz0ieC1kYXRlLW1wLXlidG4iIGFsaWduPSJjZW50ZXIiPjxhIGNsYXNzPSJ4 LWRhdGUtbXAtcHJldiI+PC9hPjwvdGQ+PHRkIGNsYXNzPSJ4LWRhdGUtbXAteWJ0 biIgYWxpZ249ImNlbnRlciI+PGEgY2xhc3M9IngtZGF0ZS1tcC1uZXh0Ij48L2E+ PC90ZD48L3RyPic6Jzx0ZCBjbGFzcz0ieC1kYXRlLW1wLXllYXIiPjxhIGhyZWY9 IiMiPjwvYT48L3RkPjx0ZCBjbGFzcz0ieC1kYXRlLW1wLXllYXIiPjxhIGhyZWY9 IiMiPjwvYT48L3RkPjwvdHI+Jyl9YS5wdXNoKCc8dHIgY2xhc3M9IngtZGF0ZS1t cC1idG5zIj48dGQgY29sc3Bhbj0iNCI+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNs YXNzPSJ4LWRhdGUtbXAtb2siPicsdGhpcy5va1RleHQsJzwvYnV0dG9uPjxidXR0 b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0ieC1kYXRlLW1wLWNhbmNlbCI+Jyx0aGlz LmNhbmNlbFRleHQsIjwvYnV0dG9uPjwvdGQ+PC90cj4iLCI8L3RhYmxlPiIpO3Ro aXMubW9udGhQaWNrZXIudXBkYXRlKGEuam9pbigiIikpO3RoaXMubW9uKHRoaXMu bW9udGhQaWNrZXIsImNsaWNrIix0aGlzLm9uTW9udGhDbGljayx0aGlzKTt0aGlz Lm1vbih0aGlzLm1vbnRoUGlja2VyLCJkYmxjbGljayIsdGhpcy5vbk1vbnRoRGJs Q2xpY2ssdGhpcyk7dGhpcy5tcE1vbnRocz10aGlzLm1vbnRoUGlja2VyLnNlbGVj dCgidGQueC1kYXRlLW1wLW1vbnRoIik7dGhpcy5tcFllYXJzPXRoaXMubW9udGhQ aWNrZXIuc2VsZWN0KCJ0ZC54LWRhdGUtbXAteWVhciIpO3RoaXMubXBNb250aHMu ZWFjaChmdW5jdGlvbihjLGQsZSl7ZSs9MTtpZigoZSUyKT09PTApe2MuZG9tLnht b250aD01K01hdGgucm91bmQoZSowLjUpfWVsc2V7Yy5kb20ueG1vbnRoPU1hdGgu cm91bmQoKGUtMSkqMC41KX19KX19LHNob3dNb250aFBpY2tlcjpmdW5jdGlvbigp e2lmKCF0aGlzLmRpc2FibGVkKXt0aGlzLmNyZWF0ZU1vbnRoUGlja2VyKCk7dmFy IGE9dGhpcy5lbC5nZXRTaXplKCk7dGhpcy5tb250aFBpY2tlci5zZXRTaXplKGEp O3RoaXMubW9udGhQaWNrZXIuY2hpbGQoInRhYmxlIikuc2V0U2l6ZShhKTt0aGlz Lm1wU2VsTW9udGg9KHRoaXMuYWN0aXZlRGF0ZXx8dGhpcy52YWx1ZSkuZ2V0TW9u dGgoKTt0aGlzLnVwZGF0ZU1QTW9udGgodGhpcy5tcFNlbE1vbnRoKTt0aGlzLm1w U2VsWWVhcj0odGhpcy5hY3RpdmVEYXRlfHx0aGlzLnZhbHVlKS5nZXRGdWxsWWVh cigpO3RoaXMudXBkYXRlTVBZZWFyKHRoaXMubXBTZWxZZWFyKTt0aGlzLm1vbnRo UGlja2VyLnNsaWRlSW4oInQiLHtkdXJhdGlvbjowLjJ9KX19LHVwZGF0ZU1QWWVh cjpmdW5jdGlvbihlKXt0aGlzLm1weWVhcj1lO3ZhciBjPXRoaXMubXBZZWFycy5l bGVtZW50cztmb3IodmFyIGI9MTtiPD0xMDtiKyspe3ZhciBkPWNbYi0xXSxhO2lm KChiJTIpPT09MCl7YT1lK01hdGgucm91bmQoYiowLjUpO2QuZmlyc3RDaGlsZC5p bm5lckhUTUw9YTtkLnh5ZWFyPWF9ZWxzZXthPWUtKDUtTWF0aC5yb3VuZChiKjAu NSkpO2QuZmlyc3RDaGlsZC5pbm5lckhUTUw9YTtkLnh5ZWFyPWF9dGhpcy5tcFll YXJzLml0ZW0oYi0xKVthPT10aGlzLm1wU2VsWWVhcj8iYWRkQ2xhc3MiOiJyZW1v dmVDbGFzcyJdKCJ4LWRhdGUtbXAtc2VsIil9fSx1cGRhdGVNUE1vbnRoOmZ1bmN0 aW9uKGEpe3RoaXMubXBNb250aHMuZWFjaChmdW5jdGlvbihiLGMsZCl7YltiLmRv bS54bW9udGg9PWE/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgieC1kYXRlLW1w LXNlbCIpfSl9LHNlbGVjdE1QTW9udGg6ZnVuY3Rpb24oYSl7fSxvbk1vbnRoQ2xp Y2s6ZnVuY3Rpb24oZyxiKXtnLnN0b3BFdmVudCgpO3ZhciBjPW5ldyBFeHQuRWxl bWVudChiKSxhO2lmKGMuaXMoImJ1dHRvbi54LWRhdGUtbXAtY2FuY2VsIikpe3Ro aXMuaGlkZU1vbnRoUGlja2VyKCl9ZWxzZXtpZihjLmlzKCJidXR0b24ueC1kYXRl LW1wLW9rIikpe3ZhciBoPW5ldyBEYXRlKHRoaXMubXBTZWxZZWFyLHRoaXMubXBT ZWxNb250aCwodGhpcy5hY3RpdmVEYXRlfHx0aGlzLnZhbHVlKS5nZXREYXRlKCkp O2lmKGguZ2V0TW9udGgoKSE9dGhpcy5tcFNlbE1vbnRoKXtoPW5ldyBEYXRlKHRo aXMubXBTZWxZZWFyLHRoaXMubXBTZWxNb250aCwxKS5nZXRMYXN0RGF0ZU9mTW9u dGgoKX10aGlzLnVwZGF0ZShoKTt0aGlzLmhpZGVNb250aFBpY2tlcigpfWVsc2V7 aWYoKGE9Yy51cCgidGQueC1kYXRlLW1wLW1vbnRoIiwyKSkpe3RoaXMubXBNb250 aHMucmVtb3ZlQ2xhc3MoIngtZGF0ZS1tcC1zZWwiKTthLmFkZENsYXNzKCJ4LWRh dGUtbXAtc2VsIik7dGhpcy5tcFNlbE1vbnRoPWEuZG9tLnhtb250aH1lbHNle2lm KChhPWMudXAoInRkLngtZGF0ZS1tcC15ZWFyIiwyKSkpe3RoaXMubXBZZWFycy5y ZW1vdmVDbGFzcygieC1kYXRlLW1wLXNlbCIpO2EuYWRkQ2xhc3MoIngtZGF0ZS1t cC1zZWwiKTt0aGlzLm1wU2VsWWVhcj1hLmRvbS54eWVhcn1lbHNle2lmKGMuaXMo ImEueC1kYXRlLW1wLXByZXYiKSl7dGhpcy51cGRhdGVNUFllYXIodGhpcy5tcHll YXItMTApfWVsc2V7aWYoYy5pcygiYS54LWRhdGUtbXAtbmV4dCIpKXt0aGlzLnVw ZGF0ZU1QWWVhcih0aGlzLm1weWVhcisxMCl9fX19fX19LG9uTW9udGhEYmxDbGlj azpmdW5jdGlvbihkLGIpe2Quc3RvcEV2ZW50KCk7dmFyIGM9bmV3IEV4dC5FbGVt ZW50KGIpLGE7aWYoKGE9Yy51cCgidGQueC1kYXRlLW1wLW1vbnRoIiwyKSkpe3Ro aXMudXBkYXRlKG5ldyBEYXRlKHRoaXMubXBTZWxZZWFyLGEuZG9tLnhtb250aCwo dGhpcy5hY3RpdmVEYXRlfHx0aGlzLnZhbHVlKS5nZXREYXRlKCkpKTt0aGlzLmhp ZGVNb250aFBpY2tlcigpfWVsc2V7aWYoKGE9Yy51cCgidGQueC1kYXRlLW1wLXll YXIiLDIpKSl7dGhpcy51cGRhdGUobmV3IERhdGUoYS5kb20ueHllYXIsdGhpcy5t cFNlbE1vbnRoLCh0aGlzLmFjdGl2ZURhdGV8fHRoaXMudmFsdWUpLmdldERhdGUo KSkpO3RoaXMuaGlkZU1vbnRoUGlja2VyKCl9fX0saGlkZU1vbnRoUGlja2VyOmZ1 bmN0aW9uKGEpe2lmKHRoaXMubW9udGhQaWNrZXIpe2lmKGE9PT10cnVlKXt0aGlz Lm1vbnRoUGlja2VyLmhpZGUoKX1lbHNle3RoaXMubW9udGhQaWNrZXIuc2xpZGVP dXQoInQiLHtkdXJhdGlvbjowLjJ9KX19fSxzaG93UHJldk1vbnRoOmZ1bmN0aW9u KGEpe3RoaXMudXBkYXRlKHRoaXMuYWN0aXZlRGF0ZS5hZGQoIm1vIiwtMSkpfSxz aG93TmV4dE1vbnRoOmZ1bmN0aW9uKGEpe3RoaXMudXBkYXRlKHRoaXMuYWN0aXZl RGF0ZS5hZGQoIm1vIiwxKSl9LHNob3dQcmV2WWVhcjpmdW5jdGlvbigpe3RoaXMu dXBkYXRlKHRoaXMuYWN0aXZlRGF0ZS5hZGQoInkiLC0xKSl9LHNob3dOZXh0WWVh cjpmdW5jdGlvbigpe3RoaXMudXBkYXRlKHRoaXMuYWN0aXZlRGF0ZS5hZGQoInki LDEpKX0saGFuZGxlTW91c2VXaGVlbDpmdW5jdGlvbihhKXthLnN0b3BFdmVudCgp O2lmKCF0aGlzLmRpc2FibGVkKXt2YXIgYj1hLmdldFdoZWVsRGVsdGEoKTtpZihi PjApe3RoaXMuc2hvd1ByZXZNb250aCgpfWVsc2V7aWYoYjwwKXt0aGlzLnNob3dO ZXh0TW9udGgoKX19fX0saGFuZGxlRGF0ZUNsaWNrOmZ1bmN0aW9uKGIsYSl7Yi5z dG9wRXZlbnQoKTtpZighdGhpcy5kaXNhYmxlZCYmYS5kYXRlVmFsdWUmJiFFeHQu Zmx5KGEucGFyZW50Tm9kZSkuaGFzQ2xhc3MoIngtZGF0ZS1kaXNhYmxlZCIpKXt0 aGlzLmNhbmNlbEZvY3VzPXRoaXMuZm9jdXNPblNlbGVjdD09PWZhbHNlO3RoaXMu c2V0VmFsdWUobmV3IERhdGUoYS5kYXRlVmFsdWUpKTtkZWxldGUgdGhpcy5jYW5j ZWxGb2N1czt0aGlzLmZpcmVFdmVudCgic2VsZWN0Iix0aGlzLHRoaXMudmFsdWUp fX0sc2VsZWN0VG9kYXk6ZnVuY3Rpb24oKXtpZih0aGlzLnRvZGF5QnRuJiYhdGhp cy50b2RheUJ0bi5kaXNhYmxlZCl7dGhpcy5zZXRWYWx1ZShuZXcgRGF0ZSgpLmNs ZWFyVGltZSgpKTt0aGlzLmZpcmVFdmVudCgic2VsZWN0Iix0aGlzLHRoaXMudmFs dWUpfX0sdXBkYXRlOmZ1bmN0aW9uKEcsQSl7aWYodGhpcy5yZW5kZXJlZCl7dmFy IGE9dGhpcy5hY3RpdmVEYXRlLHA9dGhpcy5pc1Zpc2libGUoKTt0aGlzLmFjdGl2 ZURhdGU9RztpZighQSYmYSYmdGhpcy5lbCl7dmFyIG89Ry5nZXRUaW1lKCk7aWYo YS5nZXRNb250aCgpPT1HLmdldE1vbnRoKCkmJmEuZ2V0RnVsbFllYXIoKT09Ry5n ZXRGdWxsWWVhcigpKXt0aGlzLmNlbGxzLnJlbW92ZUNsYXNzKCJ4LWRhdGUtc2Vs ZWN0ZWQiKTt0aGlzLmNlbGxzLmVhY2goZnVuY3Rpb24oZCl7aWYoZC5kb20uZmly c3RDaGlsZC5kYXRlVmFsdWU9PW8pe2QuYWRkQ2xhc3MoIngtZGF0ZS1zZWxlY3Rl ZCIpO2lmKHAmJiF0aGlzLmNhbmNlbEZvY3VzKXtFeHQuZmx5KGQuZG9tLmZpcnN0 Q2hpbGQpLmZvY3VzKDUwKX1yZXR1cm4gZmFsc2V9fSx0aGlzKTtyZXR1cm59fXZh ciBrPUcuZ2V0RGF5c0luTW9udGgoKSxxPUcuZ2V0Rmlyc3REYXRlT2ZNb250aCgp LGc9cS5nZXREYXkoKS10aGlzLnN0YXJ0RGF5O2lmKGc8MCl7Zys9N31rKz1nO3Zh ciBCPUcuYWRkKCJtbyIsLTEpLGg9Qi5nZXREYXlzSW5Nb250aCgpLWcsZT10aGlz LmNlbGxzLmVsZW1lbnRzLHI9dGhpcy50ZXh0Tm9kZXMsRD0obmV3IERhdGUoQi5n ZXRGdWxsWWVhcigpLEIuZ2V0TW9udGgoKSxoLHRoaXMuaW5pdEhvdXIpKSxDPW5l dyBEYXRlKCkuY2xlYXJUaW1lKCkuZ2V0VGltZSgpLHY9Ry5jbGVhclRpbWUodHJ1 ZSkuZ2V0VGltZSgpLHU9dGhpcy5taW5EYXRlP3RoaXMubWluRGF0ZS5jbGVhclRp bWUodHJ1ZSk6TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLHk9dGhpcy5tYXhEYXRl P3RoaXMubWF4RGF0ZS5jbGVhclRpbWUodHJ1ZSk6TnVtYmVyLlBPU0lUSVZFX0lO RklOSVRZLEY9dGhpcy5kaXNhYmxlZERhdGVzUkUscz10aGlzLmRpc2FibGVkRGF0 ZXNUZXh0LEk9dGhpcy5kaXNhYmxlZERheXM/dGhpcy5kaXNhYmxlZERheXMuam9p bigiIik6ZmFsc2UsRT10aGlzLmRpc2FibGVkRGF5c1RleHQsej10aGlzLmZvcm1h dDtpZih0aGlzLnNob3dUb2RheSl7dmFyIG09bmV3IERhdGUoKS5jbGVhclRpbWUo KSxjPShtPHV8fG0+eXx8KEYmJnomJkYudGVzdChtLmRhdGVGb3JtYXQoeikpKXx8 KEkmJkkuaW5kZXhPZihtLmdldERheSgpKSE9LTEpKTtpZighdGhpcy5kaXNhYmxl ZCl7dGhpcy50b2RheUJ0bi5zZXREaXNhYmxlZChjKTt0aGlzLnRvZGF5S2V5TGlz dGVuZXJbYz8iZGlzYWJsZSI6ImVuYWJsZSJdKCl9fXZhciBsPWZ1bmN0aW9uKEos ZCl7ZC50aXRsZT0iIjt2YXIgaT1ELmNsZWFyVGltZSh0cnVlKS5nZXRUaW1lKCk7 ZC5maXJzdENoaWxkLmRhdGVWYWx1ZT1pO2lmKGk9PUMpe2QuY2xhc3NOYW1lKz0i IHgtZGF0ZS10b2RheSI7ZC50aXRsZT1KLnRvZGF5VGV4dH1pZihpPT12KXtkLmNs YXNzTmFtZSs9IiB4LWRhdGUtc2VsZWN0ZWQiO2lmKHApe0V4dC5mbHkoZC5maXJz dENoaWxkKS5mb2N1cyg1MCl9fWlmKGk8dSl7ZC5jbGFzc05hbWU9IiB4LWRhdGUt ZGlzYWJsZWQiO2QudGl0bGU9Si5taW5UZXh0O3JldHVybn1pZihpPnkpe2QuY2xh c3NOYW1lPSIgeC1kYXRlLWRpc2FibGVkIjtkLnRpdGxlPUoubWF4VGV4dDtyZXR1 cm59aWYoSSl7aWYoSS5pbmRleE9mKEQuZ2V0RGF5KCkpIT0tMSl7ZC50aXRsZT1F O2QuY2xhc3NOYW1lPSIgeC1kYXRlLWRpc2FibGVkIn19aWYoRiYmeil7dmFyIHc9 RC5kYXRlRm9ybWF0KHopO2lmKEYudGVzdCh3KSl7ZC50aXRsZT1zLnJlcGxhY2Uo IiUwIix3KTtkLmNsYXNzTmFtZT0iIHgtZGF0ZS1kaXNhYmxlZCJ9fX07dmFyIHg9 MDtmb3IoO3g8Zzt4Kyspe3JbeF0uaW5uZXJIVE1MPSgrK2gpO0Quc2V0RGF0ZShE LmdldERhdGUoKSsxKTtlW3hdLmNsYXNzTmFtZT0ieC1kYXRlLXByZXZkYXkiO2wo dGhpcyxlW3hdKX1mb3IoO3g8azt4Kyspe3ZhciBiPXgtZysxO3JbeF0uaW5uZXJI VE1MPShiKTtELnNldERhdGUoRC5nZXREYXRlKCkrMSk7ZVt4XS5jbGFzc05hbWU9 IngtZGF0ZS1hY3RpdmUiO2wodGhpcyxlW3hdKX12YXIgSD0wO2Zvcig7eDw0Mjt4 Kyspe3JbeF0uaW5uZXJIVE1MPSgrK0gpO0Quc2V0RGF0ZShELmdldERhdGUoKSsx KTtlW3hdLmNsYXNzTmFtZT0ieC1kYXRlLW5leHRkYXkiO2wodGhpcyxlW3hdKX10 aGlzLm1idG4uc2V0VGV4dCh0aGlzLm1vbnRoTmFtZXNbRy5nZXRNb250aCgpXSsi ICIrRy5nZXRGdWxsWWVhcigpKTtpZighdGhpcy5pbnRlcm5hbFJlbmRlcil7dmFy IGo9dGhpcy5lbC5kb20uZmlyc3RDaGlsZCxuPWoub2Zmc2V0V2lkdGg7dGhpcy5l bC5zZXRXaWR0aChuK3RoaXMuZWwuZ2V0Qm9yZGVyV2lkdGgoImxyIikpO0V4dC5m bHkoaikuc2V0V2lkdGgobik7dGhpcy5pbnRlcm5hbFJlbmRlcj10cnVlO2lmKEV4 dC5pc09wZXJhJiYhdGhpcy5zZWNvbmRQYXNzKXtqLnJvd3NbMF0uY2VsbHNbMV0u c3R5bGUud2lkdGg9KG4tKGoucm93c1swXS5jZWxsc1swXS5vZmZzZXRXaWR0aCtq LnJvd3NbMF0uY2VsbHNbMl0ub2Zmc2V0V2lkdGgpKSsicHgiO3RoaXMuc2Vjb25k UGFzcz10cnVlO3RoaXMudXBkYXRlLmRlZmVyKDEwLHRoaXMsW0ddKX19fX0sYmVm b3JlRGVzdHJveTpmdW5jdGlvbigpe2lmKHRoaXMucmVuZGVyZWQpe0V4dC5kZXN0 cm95KHRoaXMua2V5TmF2LHRoaXMubW9udGhQaWNrZXIsdGhpcy5ldmVudEVsLHRo aXMubWJ0bix0aGlzLm5leHRSZXBlYXRlcix0aGlzLnByZXZSZXBlYXRlcix0aGlz LmNlbGxzLmVsLHRoaXMudG9kYXlCdG4pO2RlbGV0ZSB0aGlzLnRleHROb2Rlcztk ZWxldGUgdGhpcy5jZWxscy5lbGVtZW50c319fSk7RXh0LnJlZygiZGF0ZXBpY2tl ciIsRXh0LkRhdGVQaWNrZXIpO0V4dC5Mb2FkTWFzaz1mdW5jdGlvbihjLGIpe3Ro aXMuZWw9RXh0LmdldChjKTtFeHQuYXBwbHkodGhpcyxiKTtpZih0aGlzLnN0b3Jl KXt0aGlzLnN0b3JlLm9uKHtzY29wZTp0aGlzLGJlZm9yZWxvYWQ6dGhpcy5vbkJl Zm9yZUxvYWQsbG9hZDp0aGlzLm9uTG9hZCxleGNlcHRpb246dGhpcy5vbkxvYWR9 KTt0aGlzLnJlbW92ZU1hc2s9RXh0LnZhbHVlKHRoaXMucmVtb3ZlTWFzayxmYWxz ZSl9ZWxzZXt2YXIgYT10aGlzLmVsLmdldFVwZGF0ZXIoKTthLnNob3dMb2FkSW5k aWNhdG9yPWZhbHNlO2Eub24oe3Njb3BlOnRoaXMsYmVmb3JldXBkYXRlOnRoaXMu b25CZWZvcmVMb2FkLHVwZGF0ZTp0aGlzLm9uTG9hZCxmYWlsdXJlOnRoaXMub25M b2FkfSk7dGhpcy5yZW1vdmVNYXNrPUV4dC52YWx1ZSh0aGlzLnJlbW92ZU1hc2ss dHJ1ZSl9fTtFeHQuTG9hZE1hc2sucHJvdG90eXBlPXttc2c6IkxvYWRpbmcuLi4i LG1zZ0NsczoieC1tYXNrLWxvYWRpbmciLGRpc2FibGVkOmZhbHNlLGRpc2FibGU6 ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkPXRydWV9LGVuYWJsZTpmdW5jdGlvbigp e3RoaXMuZGlzYWJsZWQ9ZmFsc2V9LG9uTG9hZDpmdW5jdGlvbigpe3RoaXMuZWwu dW5tYXNrKHRoaXMucmVtb3ZlTWFzayl9LG9uQmVmb3JlTG9hZDpmdW5jdGlvbigp e2lmKCF0aGlzLmRpc2FibGVkKXt0aGlzLmVsLm1hc2sodGhpcy5tc2csdGhpcy5t c2dDbHMpfX0sc2hvdzpmdW5jdGlvbigpe3RoaXMub25CZWZvcmVMb2FkKCl9LGhp ZGU6ZnVuY3Rpb24oKXt0aGlzLm9uTG9hZCgpfSxkZXN0cm95OmZ1bmN0aW9uKCl7 aWYodGhpcy5zdG9yZSl7dGhpcy5zdG9yZS51bigiYmVmb3JlbG9hZCIsdGhpcy5v bkJlZm9yZUxvYWQsdGhpcyk7dGhpcy5zdG9yZS51bigibG9hZCIsdGhpcy5vbkxv YWQsdGhpcyk7dGhpcy5zdG9yZS51bigiZXhjZXB0aW9uIix0aGlzLm9uTG9hZCx0 aGlzKX1lbHNle3ZhciBhPXRoaXMuZWwuZ2V0VXBkYXRlcigpO2EudW4oImJlZm9y ZXVwZGF0ZSIsdGhpcy5vbkJlZm9yZUxvYWQsdGhpcyk7YS51bigidXBkYXRlIix0 aGlzLm9uTG9hZCx0aGlzKTthLnVuKCJmYWlsdXJlIix0aGlzLm9uTG9hZCx0aGlz KX19fTtFeHQuc2xpZGVyLlRodW1iPUV4dC5leHRlbmQoT2JqZWN0LHtkcmFnZ2lu ZzpmYWxzZSxjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtFeHQuYXBwbHkodGhpcyxh fHx7fSx7Y2xzOiJ4LXNsaWRlci10aHVtYiIsY29uc3RyYWluOmZhbHNlfSk7RXh0 LnNsaWRlci5UaHVtYi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxh KTtpZih0aGlzLnNsaWRlci52ZXJ0aWNhbCl7RXh0LmFwcGx5KHRoaXMsRXh0LnNs aWRlci5UaHVtYi5WZXJ0aWNhbCl9fSxyZW5kZXI6ZnVuY3Rpb24oKXt0aGlzLmVs PXRoaXMuc2xpZGVyLmlubmVyRWwuaW5zZXJ0Rmlyc3Qoe2Nsczp0aGlzLmNsc30p O3RoaXMuaW5pdEV2ZW50cygpfSxlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLmRpc2Fi bGVkPWZhbHNlO3RoaXMuZWwucmVtb3ZlQ2xhc3ModGhpcy5zbGlkZXIuZGlzYWJs ZWRDbGFzcyl9LGRpc2FibGU6ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkPXRydWU7 dGhpcy5lbC5hZGRDbGFzcyh0aGlzLnNsaWRlci5kaXNhYmxlZENsYXNzKX0saW5p dEV2ZW50czpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWw7YS5hZGRDbGFzc09uT3Zl cigieC1zbGlkZXItdGh1bWItb3ZlciIpO3RoaXMudHJhY2tlcj1uZXcgRXh0LmRk LkRyYWdUcmFja2VyKHtvbkJlZm9yZVN0YXJ0OnRoaXMub25CZWZvcmVEcmFnU3Rh cnQuY3JlYXRlRGVsZWdhdGUodGhpcyksb25TdGFydDp0aGlzLm9uRHJhZ1N0YXJ0 LmNyZWF0ZURlbGVnYXRlKHRoaXMpLG9uRHJhZzp0aGlzLm9uRHJhZy5jcmVhdGVE ZWxlZ2F0ZSh0aGlzKSxvbkVuZDp0aGlzLm9uRHJhZ0VuZC5jcmVhdGVEZWxlZ2F0 ZSh0aGlzKSx0b2xlcmFuY2U6MyxhdXRvU3RhcnQ6MzAwfSk7dGhpcy50cmFja2Vy LmluaXRFbChhKX0sb25CZWZvcmVEcmFnU3RhcnQ6ZnVuY3Rpb24oYSl7aWYodGhp cy5kaXNhYmxlZCl7cmV0dXJuIGZhbHNlfWVsc2V7dGhpcy5zbGlkZXIucHJvbW90 ZVRodW1iKHRoaXMpO3JldHVybiB0cnVlfX0sb25EcmFnU3RhcnQ6ZnVuY3Rpb24o YSl7dGhpcy5lbC5hZGRDbGFzcygieC1zbGlkZXItdGh1bWItZHJhZyIpO3RoaXMu ZHJhZ2dpbmc9dHJ1ZTt0aGlzLmRyYWdTdGFydFZhbHVlPXRoaXMudmFsdWU7dGhp cy5zbGlkZXIuZmlyZUV2ZW50KCJkcmFnc3RhcnQiLHRoaXMuc2xpZGVyLGEsdGhp cyl9LG9uRHJhZzpmdW5jdGlvbihnKXt2YXIgYz10aGlzLnNsaWRlcixiPXRoaXMu aW5kZXgsZD10aGlzLmdldE5ld1ZhbHVlKCk7aWYodGhpcy5jb25zdHJhaW4pe3Zh ciBhPWMudGh1bWJzW2IrMV0saD1jLnRodW1ic1tiLTFdO2lmKGghPXVuZGVmaW5l ZCYmZDw9aC52YWx1ZSl7ZD1oLnZhbHVlfWlmKGEhPXVuZGVmaW5lZCYmZD49YS52 YWx1ZSl7ZD1hLnZhbHVlfX1jLnNldFZhbHVlKGIsZCxmYWxzZSk7Yy5maXJlRXZl bnQoImRyYWciLGMsZyx0aGlzKX0sZ2V0TmV3VmFsdWU6ZnVuY3Rpb24oKXt2YXIg YT10aGlzLnNsaWRlcixiPWEuaW5uZXJFbC50cmFuc2xhdGVQb2ludHModGhpcy50 cmFja2VyLmdldFhZKCkpO3JldHVybiBFeHQudXRpbC5Gb3JtYXQucm91bmQoYS5y ZXZlcnNlVmFsdWUoYi5sZWZ0KSxhLmRlY2ltYWxQcmVjaXNpb24pfSxvbkRyYWdF bmQ6ZnVuY3Rpb24oYyl7dmFyIGE9dGhpcy5zbGlkZXIsYj10aGlzLnZhbHVlO3Ro aXMuZWwucmVtb3ZlQ2xhc3MoIngtc2xpZGVyLXRodW1iLWRyYWciKTt0aGlzLmRy YWdnaW5nPWZhbHNlO2EuZmlyZUV2ZW50KCJkcmFnZW5kIixhLGMpO2lmKHRoaXMu ZHJhZ1N0YXJ0VmFsdWUhPWIpe2EuZmlyZUV2ZW50KCJjaGFuZ2Vjb21wbGV0ZSIs YSxiLHRoaXMpfX0sZGVzdHJveTpmdW5jdGlvbigpe0V4dC5kZXN0cm95TWVtYmVy cyh0aGlzLCJ0cmFja2VyIiwiZWwiKX19KTtFeHQuc2xpZGVyLk11bHRpU2xpZGVy PUV4dC5leHRlbmQoRXh0LkJveENvbXBvbmVudCx7dmVydGljYWw6ZmFsc2UsbWlu VmFsdWU6MCxtYXhWYWx1ZToxMDAsZGVjaW1hbFByZWNpc2lvbjowLGtleUluY3Jl bWVudDoxLGluY3JlbWVudDowLGNsaWNrUmFuZ2U6WzUsMTVdLGNsaWNrVG9DaGFu Z2U6dHJ1ZSxhbmltYXRlOnRydWUsY29uc3RyYWluVGh1bWJzOnRydWUsdG9wVGh1 bWJaSW5kZXg6MTAwMDAsaW5pdENvbXBvbmVudDpmdW5jdGlvbigpe2lmKCFFeHQu aXNEZWZpbmVkKHRoaXMudmFsdWUpKXt0aGlzLnZhbHVlPXRoaXMubWluVmFsdWV9 dGhpcy50aHVtYnM9W107RXh0LnNsaWRlci5NdWx0aVNsaWRlci5zdXBlcmNsYXNz LmluaXRDb21wb25lbnQuY2FsbCh0aGlzKTt0aGlzLmtleUluY3JlbWVudD1NYXRo Lm1heCh0aGlzLmluY3JlbWVudCx0aGlzLmtleUluY3JlbWVudCk7dGhpcy5hZGRF dmVudHMoImJlZm9yZWNoYW5nZSIsImNoYW5nZSIsImNoYW5nZWNvbXBsZXRlIiwi ZHJhZ3N0YXJ0IiwiZHJhZyIsImRyYWdlbmQiKTtpZih0aGlzLnZhbHVlcz09dW5k ZWZpbmVkfHxFeHQuaXNFbXB0eSh0aGlzLnZhbHVlcykpe3RoaXMudmFsdWVzPVsw XX12YXIgYT10aGlzLnZhbHVlcztmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7 dGhpcy5hZGRUaHVtYihhW2JdKX1pZih0aGlzLnZlcnRpY2FsKXtFeHQuYXBwbHko dGhpcyxFeHQuc2xpZGVyLlZlcnRpY2FsKX19LGFkZFRodW1iOmZ1bmN0aW9uKGIp e3ZhciBhPW5ldyBFeHQuc2xpZGVyLlRodW1iKHt2YWx1ZTpiLHNsaWRlcjp0aGlz LGluZGV4OnRoaXMudGh1bWJzLmxlbmd0aCxjb25zdHJhaW46dGhpcy5jb25zdHJh aW5UaHVtYnN9KTt0aGlzLnRodW1icy5wdXNoKGEpO2lmKHRoaXMucmVuZGVyZWQp e2EucmVuZGVyKCl9fSxwcm9tb3RlVGh1bWI6ZnVuY3Rpb24oZCl7dmFyIGE9dGhp cy50aHVtYnMsZyxiO2Zvcih2YXIgZT0wLGM9YS5sZW5ndGg7ZTxjO2UrKyl7Yj1h W2VdO2lmKGI9PWQpe2c9dGhpcy50b3BUaHVtYlpJbmRleH1lbHNle2c9IiJ9Yi5l bC5zZXRTdHlsZSgiekluZGV4IixnKX19LG9uUmVuZGVyOmZ1bmN0aW9uKCl7dGhp cy5hdXRvRWw9e2NsczoieC1zbGlkZXIgIisodGhpcy52ZXJ0aWNhbD8ieC1zbGlk ZXItdmVydCI6Ingtc2xpZGVyLWhvcnoiKSxjbjp7Y2xzOiJ4LXNsaWRlci1lbmQi LGNuOntjbHM6Ingtc2xpZGVyLWlubmVyIixjbjpbe3RhZzoiYSIsY2xzOiJ4LXNs aWRlci1mb2N1cyIsaHJlZjoiIyIsdGFiSW5kZXg6Ii0xIixoaWRlZm9jdXM6Im9u In1dfX19O0V4dC5zbGlkZXIuTXVsdGlTbGlkZXIuc3VwZXJjbGFzcy5vblJlbmRl ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5lbmRFbD10aGlzLmVsLmZpcnN0 KCk7dGhpcy5pbm5lckVsPXRoaXMuZW5kRWwuZmlyc3QoKTt0aGlzLmZvY3VzRWw9 dGhpcy5pbm5lckVsLmNoaWxkKCIueC1zbGlkZXItZm9jdXMiKTtmb3IodmFyIGI9 MDtiPHRoaXMudGh1bWJzLmxlbmd0aDtiKyspe3RoaXMudGh1bWJzW2JdLnJlbmRl cigpfXZhciBhPXRoaXMuaW5uZXJFbC5jaGlsZCgiLngtc2xpZGVyLXRodW1iIik7 dGhpcy5oYWxmVGh1bWI9KHRoaXMudmVydGljYWw/YS5nZXRIZWlnaHQoKTphLmdl dFdpZHRoKCkpLzI7dGhpcy5pbml0RXZlbnRzKCl9LGluaXRFdmVudHM6ZnVuY3Rp b24oKXt0aGlzLm1vbih0aGlzLmVsLHtzY29wZTp0aGlzLG1vdXNlZG93bjp0aGlz Lm9uTW91c2VEb3duLGtleWRvd246dGhpcy5vbktleURvd259KTt0aGlzLmZvY3Vz RWwuc3dhbGxvd0V2ZW50KCJjbGljayIsdHJ1ZSl9LG9uTW91c2VEb3duOmZ1bmN0 aW9uKGQpe2lmKHRoaXMuZGlzYWJsZWQpe3JldHVybn12YXIgYz1mYWxzZTtmb3Io dmFyIGI9MDtiPHRoaXMudGh1bWJzLmxlbmd0aDtiKyspe2M9Y3x8ZC50YXJnZXQ9 PXRoaXMudGh1bWJzW2JdLmVsLmRvbX1pZih0aGlzLmNsaWNrVG9DaGFuZ2UmJiFj KXt2YXIgYT10aGlzLmlubmVyRWwudHJhbnNsYXRlUG9pbnRzKGQuZ2V0WFkoKSk7 dGhpcy5vbkNsaWNrQ2hhbmdlKGEpfXRoaXMuZm9jdXMoKX0sb25DbGlja0NoYW5n ZTpmdW5jdGlvbihjKXtpZihjLnRvcD50aGlzLmNsaWNrUmFuZ2VbMF0mJmMudG9w PHRoaXMuY2xpY2tSYW5nZVsxXSl7dmFyIGE9dGhpcy5nZXROZWFyZXN0KGMsImxl ZnQiKSxiPWEuaW5kZXg7dGhpcy5zZXRWYWx1ZShiLEV4dC51dGlsLkZvcm1hdC5y b3VuZCh0aGlzLnJldmVyc2VWYWx1ZShjLmxlZnQpLHRoaXMuZGVjaW1hbFByZWNp c2lvbiksdW5kZWZpbmVkLHRydWUpfX0sZ2V0TmVhcmVzdDpmdW5jdGlvbihrLGIp e3ZhciBtPWI9PSJ0b3AiP3RoaXMuaW5uZXJFbC5nZXRIZWlnaHQoKS1rW2JdOmtb Yl0sZz10aGlzLnJldmVyc2VWYWx1ZShtKSxqPSh0aGlzLm1heFZhbHVlLXRoaXMu bWluVmFsdWUpKzUsZT0wLGM9bnVsbDtmb3IodmFyIGQ9MDtkPHRoaXMudGh1bWJz Lmxlbmd0aDtkKyspe3ZhciBhPXRoaXMudGh1bWJzW2RdLGw9YS52YWx1ZSxoPU1h dGguYWJzKGwtZyk7aWYoTWF0aC5hYnMoaDw9aikpe2M9YTtlPWQ7aj1ofX1yZXR1 cm4gY30sb25LZXlEb3duOmZ1bmN0aW9uKGIpe2lmKHRoaXMuZGlzYWJsZWR8fHRo aXMudGh1bWJzLmxlbmd0aCE9PTEpe2IucHJldmVudERlZmF1bHQoKTtyZXR1cm59 dmFyIGE9Yi5nZXRLZXkoKSxjO3N3aXRjaChhKXtjYXNlIGIuVVA6Y2FzZSBiLlJJ R0hUOmIuc3RvcEV2ZW50KCk7Yz1iLmN0cmxLZXk/dGhpcy5tYXhWYWx1ZTp0aGlz LmdldFZhbHVlKDApK3RoaXMua2V5SW5jcmVtZW50O3RoaXMuc2V0VmFsdWUoMCxj LHVuZGVmaW5lZCx0cnVlKTticmVhaztjYXNlIGIuRE9XTjpjYXNlIGIuTEVGVDpi LnN0b3BFdmVudCgpO2M9Yi5jdHJsS2V5P3RoaXMubWluVmFsdWU6dGhpcy5nZXRW YWx1ZSgwKS10aGlzLmtleUluY3JlbWVudDt0aGlzLnNldFZhbHVlKDAsYyx1bmRl ZmluZWQsdHJ1ZSk7YnJlYWs7ZGVmYXVsdDpiLnByZXZlbnREZWZhdWx0KCl9fSxk b1NuYXA6ZnVuY3Rpb24oYil7aWYoISh0aGlzLmluY3JlbWVudCYmYikpe3JldHVy biBifXZhciBkPWIsYz10aGlzLmluY3JlbWVudCxhPWIlYztpZihhIT0wKXtkLT1h O2lmKGEqMj49Yyl7ZCs9Y31lbHNle2lmKGEqMjwtYyl7ZC09Y319fXJldHVybiBk LmNvbnN0cmFpbih0aGlzLm1pblZhbHVlLHRoaXMubWF4VmFsdWUpfSxhZnRlclJl bmRlcjpmdW5jdGlvbigpe0V4dC5zbGlkZXIuTXVsdGlTbGlkZXIuc3VwZXJjbGFz cy5hZnRlclJlbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Zm9yKHZhciBjPTA7 Yzx0aGlzLnRodW1icy5sZW5ndGg7YysrKXt2YXIgYj10aGlzLnRodW1ic1tjXTtp ZihiLnZhbHVlIT09dW5kZWZpbmVkKXt2YXIgYT10aGlzLm5vcm1hbGl6ZVZhbHVl KGIudmFsdWUpO2lmKGEhPT1iLnZhbHVlKXt0aGlzLnNldFZhbHVlKGMsYSxmYWxz ZSl9ZWxzZXt0aGlzLm1vdmVUaHVtYihjLHRoaXMudHJhbnNsYXRlVmFsdWUoYSks ZmFsc2UpfX19fSxnZXRSYXRpbzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaW5uZXJF bC5nZXRXaWR0aCgpLGI9dGhpcy5tYXhWYWx1ZS10aGlzLm1pblZhbHVlO3JldHVy biBiPT0wP2E6KGEvYil9LG5vcm1hbGl6ZVZhbHVlOmZ1bmN0aW9uKGEpe2E9dGhp cy5kb1NuYXAoYSk7YT1FeHQudXRpbC5Gb3JtYXQucm91bmQoYSx0aGlzLmRlY2lt YWxQcmVjaXNpb24pO2E9YS5jb25zdHJhaW4odGhpcy5taW5WYWx1ZSx0aGlzLm1h eFZhbHVlKTtyZXR1cm4gYX0sc2V0TWluVmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5t aW5WYWx1ZT1lO3ZhciBkPTAsYj10aGlzLnRodW1icyxhPWIubGVuZ3RoLGM7Zm9y KDtkPGE7KytkKXtjPWJbZF07Yy52YWx1ZT1jLnZhbHVlPGU/ZTpjLnZhbHVlfXRo aXMuc3luY1RodW1iKCl9LHNldE1heFZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMubWF4 VmFsdWU9ZTt2YXIgZD0wLGI9dGhpcy50aHVtYnMsYT1iLmxlbmd0aCxjO2Zvcig7 ZDxhOysrZCl7Yz1iW2RdO2MudmFsdWU9Yy52YWx1ZT5lP2U6Yy52YWx1ZX10aGlz LnN5bmNUaHVtYigpfSxzZXRWYWx1ZTpmdW5jdGlvbihkLGMsYixnKXt2YXIgYT10 aGlzLnRodW1ic1tkXSxlPWEuZWw7Yz10aGlzLm5vcm1hbGl6ZVZhbHVlKGMpO2lm KGMhPT1hLnZhbHVlJiZ0aGlzLmZpcmVFdmVudCgiYmVmb3JlY2hhbmdlIix0aGlz LGMsYS52YWx1ZSxhKSE9PWZhbHNlKXthLnZhbHVlPWM7aWYodGhpcy5yZW5kZXJl ZCl7dGhpcy5tb3ZlVGh1bWIoZCx0aGlzLnRyYW5zbGF0ZVZhbHVlKGMpLGIhPT1m YWxzZSk7dGhpcy5maXJlRXZlbnQoImNoYW5nZSIsdGhpcyxjLGEpO2lmKGcpe3Ro aXMuZmlyZUV2ZW50KCJjaGFuZ2Vjb21wbGV0ZSIsdGhpcyxjLGEpfX19fSx0cmFu c2xhdGVWYWx1ZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFJhdGlvKCk7cmV0 dXJuKGEqYiktKHRoaXMubWluVmFsdWUqYiktdGhpcy5oYWxmVGh1bWJ9LHJldmVy c2VWYWx1ZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFJhdGlvKCk7cmV0dXJu KGIrKHRoaXMubWluVmFsdWUqYSkpL2F9LG1vdmVUaHVtYjpmdW5jdGlvbihkLGMs Yil7dmFyIGE9dGhpcy50aHVtYnNbZF0uZWw7aWYoIWJ8fHRoaXMuYW5pbWF0ZT09 PWZhbHNlKXthLnNldExlZnQoYyl9ZWxzZXthLnNoaWZ0KHtsZWZ0OmMsc3RvcEZ4 OnRydWUsZHVyYXRpb246MC4zNX0pfX0sZm9jdXM6ZnVuY3Rpb24oKXt0aGlzLmZv Y3VzRWwuZm9jdXMoMTApfSxvblJlc2l6ZTpmdW5jdGlvbihjLGUpe3ZhciBiPXRo aXMudGh1bWJzLGE9Yi5sZW5ndGgsZD0wO2Zvcig7ZDxhOysrZCl7YltkXS5lbC5z dG9wRngoKX1pZihFeHQuaXNOdW1iZXIoYykpe3RoaXMuaW5uZXJFbC5zZXRXaWR0 aChjLSh0aGlzLmVsLmdldFBhZGRpbmcoImwiKSt0aGlzLmVuZEVsLmdldFBhZGRp bmcoInIiKSkpfXRoaXMuc3luY1RodW1iKCk7RXh0LnNsaWRlci5NdWx0aVNsaWRl ci5zdXBlcmNsYXNzLm9uUmVzaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sb25E aXNhYmxlOmZ1bmN0aW9uKCl7RXh0LnNsaWRlci5NdWx0aVNsaWRlci5zdXBlcmNs YXNzLm9uRGlzYWJsZS5jYWxsKHRoaXMpO2Zvcih2YXIgYj0wO2I8dGhpcy50aHVt YnMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy50aHVtYnNbYl0sYz1hLmVsO2EuZGlz YWJsZSgpO2lmKEV4dC5pc0lFKXt2YXIgZD1jLmdldFhZKCk7Yy5oaWRlKCk7dGhp cy5pbm5lckVsLmFkZENsYXNzKHRoaXMuZGlzYWJsZWRDbGFzcykuZG9tLmRpc2Fi bGVkPXRydWU7aWYoIXRoaXMudGh1bWJIb2xkZXIpe3RoaXMudGh1bWJIb2xkZXI9 dGhpcy5lbmRFbC5jcmVhdGVDaGlsZCh7Y2xzOiJ4LXNsaWRlci10aHVtYiAiK3Ro aXMuZGlzYWJsZWRDbGFzc30pfXRoaXMudGh1bWJIb2xkZXIuc2hvdygpLnNldFhZ KGQpfX19LG9uRW5hYmxlOmZ1bmN0aW9uKCl7RXh0LnNsaWRlci5NdWx0aVNsaWRl ci5zdXBlcmNsYXNzLm9uRW5hYmxlLmNhbGwodGhpcyk7Zm9yKHZhciBiPTA7Yjx0 aGlzLnRodW1icy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLnRodW1ic1tiXSxjPWEu ZWw7YS5lbmFibGUoKTtpZihFeHQuaXNJRSl7dGhpcy5pbm5lckVsLnJlbW92ZUNs YXNzKHRoaXMuZGlzYWJsZWRDbGFzcykuZG9tLmRpc2FibGVkPWZhbHNlO2lmKHRo aXMudGh1bWJIb2xkZXIpe3RoaXMudGh1bWJIb2xkZXIuaGlkZSgpfWMuc2hvdygp O3RoaXMuc3luY1RodW1iKCl9fX0sc3luY1RodW1iOmZ1bmN0aW9uKCl7aWYodGhp cy5yZW5kZXJlZCl7Zm9yKHZhciBhPTA7YTx0aGlzLnRodW1icy5sZW5ndGg7YSsr KXt0aGlzLm1vdmVUaHVtYihhLHRoaXMudHJhbnNsYXRlVmFsdWUodGhpcy50aHVt YnNbYV0udmFsdWUpKX19fSxnZXRWYWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhp cy50aHVtYnNbYV0udmFsdWV9LGdldFZhbHVlczpmdW5jdGlvbigpe3ZhciBhPVtd O2Zvcih2YXIgYj0wO2I8dGhpcy50aHVtYnMubGVuZ3RoO2IrKyl7YS5wdXNoKHRo aXMudGh1bWJzW2JdLnZhbHVlKX1yZXR1cm4gYX0sYmVmb3JlRGVzdHJveTpmdW5j dGlvbigpe3ZhciBiPXRoaXMudGh1bWJzO2Zvcih2YXIgYz0wLGE9Yi5sZW5ndGg7 YzxhOysrYyl7YltjXS5kZXN0cm95KCk7YltjXT1udWxsfUV4dC5kZXN0cm95TWVt YmVycyh0aGlzLCJlbmRFbCIsImlubmVyRWwiLCJmb2N1c0VsIiwidGh1bWJIb2xk ZXIiKTtFeHQuc2xpZGVyLk11bHRpU2xpZGVyLnN1cGVyY2xhc3MuYmVmb3JlRGVz dHJveS5jYWxsKHRoaXMpfX0pO0V4dC5yZWcoIm11bHRpc2xpZGVyIixFeHQuc2xp ZGVyLk11bHRpU2xpZGVyKTtFeHQuc2xpZGVyLlNpbmdsZVNsaWRlcj1FeHQuZXh0 ZW5kKEV4dC5zbGlkZXIuTXVsdGlTbGlkZXIse2NvbnN0cnVjdG9yOmZ1bmN0aW9u KGEpe2E9YXx8e307RXh0LmFwcGx5SWYoYSx7dmFsdWVzOlthLnZhbHVlfHwwXX0p O0V4dC5zbGlkZXIuU2luZ2xlU2xpZGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3Iu Y2FsbCh0aGlzLGEpfSxnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiBFeHQuc2xp ZGVyLlNpbmdsZVNsaWRlci5zdXBlcmNsYXNzLmdldFZhbHVlLmNhbGwodGhpcyww KX0sc2V0VmFsdWU6ZnVuY3Rpb24oZCxiKXt2YXIgYz1FeHQudG9BcnJheShhcmd1 bWVudHMpLGE9Yy5sZW5ndGg7aWYoYT09MXx8KGE8PTMmJnR5cGVvZiBhcmd1bWVu dHNbMV0hPSJudW1iZXIiKSl7Yy51bnNoaWZ0KDApfXJldHVybiBFeHQuc2xpZGVy LlNpbmdsZVNsaWRlci5zdXBlcmNsYXNzLnNldFZhbHVlLmFwcGx5KHRoaXMsYyl9 LHN5bmNUaHVtYjpmdW5jdGlvbigpe3JldHVybiBFeHQuc2xpZGVyLlNpbmdsZVNs aWRlci5zdXBlcmNsYXNzLnN5bmNUaHVtYi5hcHBseSh0aGlzLFswXS5jb25jYXQo YXJndW1lbnRzKSl9LGdldE5lYXJlc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50 aHVtYnNbMF19fSk7RXh0LlNsaWRlcj1FeHQuc2xpZGVyLlNpbmdsZVNsaWRlcjtF eHQucmVnKCJzbGlkZXIiLEV4dC5zbGlkZXIuU2luZ2xlU2xpZGVyKTtFeHQuc2xp ZGVyLlZlcnRpY2FsPXtvblJlc2l6ZTpmdW5jdGlvbihhLGIpe3RoaXMuaW5uZXJF bC5zZXRIZWlnaHQoYi0odGhpcy5lbC5nZXRQYWRkaW5nKCJ0IikrdGhpcy5lbmRF bC5nZXRQYWRkaW5nKCJiIikpKTt0aGlzLnN5bmNUaHVtYigpfSxnZXRSYXRpbzpm dW5jdGlvbigpe3ZhciBiPXRoaXMuaW5uZXJFbC5nZXRIZWlnaHQoKSxhPXRoaXMu bWF4VmFsdWUtdGhpcy5taW5WYWx1ZTtyZXR1cm4gYi9hfSxtb3ZlVGh1bWI6ZnVu Y3Rpb24oZCxjLGIpe3ZhciBhPXRoaXMudGh1bWJzW2RdLGU9YS5lbDtpZighYnx8 dGhpcy5hbmltYXRlPT09ZmFsc2Upe2Uuc2V0Qm90dG9tKGMpfWVsc2V7ZS5zaGlm dCh7Ym90dG9tOmMsc3RvcEZ4OnRydWUsZHVyYXRpb246MC4zNX0pfX0sb25DbGlj a0NoYW5nZTpmdW5jdGlvbihjKXtpZihjLmxlZnQ+dGhpcy5jbGlja1JhbmdlWzBd JiZjLmxlZnQ8dGhpcy5jbGlja1JhbmdlWzFdKXt2YXIgYT10aGlzLmdldE5lYXJl c3QoYywidG9wIiksYj1hLmluZGV4LGQ9dGhpcy5taW5WYWx1ZSt0aGlzLnJldmVy c2VWYWx1ZSh0aGlzLmlubmVyRWwuZ2V0SGVpZ2h0KCktYy50b3ApO3RoaXMuc2V0 VmFsdWUoYixFeHQudXRpbC5Gb3JtYXQucm91bmQoZCx0aGlzLmRlY2ltYWxQcmVj aXNpb24pLHVuZGVmaW5lZCx0cnVlKX19fTtFeHQuc2xpZGVyLlRodW1iLlZlcnRp Y2FsPXtnZXROZXdWYWx1ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuc2xpZGVyLGM9 Yi5pbm5lckVsLGQ9Yy50cmFuc2xhdGVQb2ludHModGhpcy50cmFja2VyLmdldFhZ KCkpLGE9Yy5nZXRIZWlnaHQoKS1kLnRvcDtyZXR1cm4gYi5taW5WYWx1ZStFeHQu dXRpbC5Gb3JtYXQucm91bmQoYS9iLmdldFJhdGlvKCksYi5kZWNpbWFsUHJlY2lz aW9uKX19O0V4dC5Qcm9ncmVzc0Jhcj1FeHQuZXh0ZW5kKEV4dC5Cb3hDb21wb25l bnQse2Jhc2VDbHM6IngtcHJvZ3Jlc3MiLGFuaW1hdGU6ZmFsc2Usd2FpdFRpbWVy Om51bGwsaW5pdENvbXBvbmVudDpmdW5jdGlvbigpe0V4dC5Qcm9ncmVzc0Jhci5z dXBlcmNsYXNzLmluaXRDb21wb25lbnQuY2FsbCh0aGlzKTt0aGlzLmFkZEV2ZW50 cygidXBkYXRlIil9LG9uUmVuZGVyOmZ1bmN0aW9uKGQsYSl7dmFyIGM9bmV3IEV4 dC5UZW1wbGF0ZSgnPGRpdiBjbGFzcz0ie2Nsc30td3JhcCI+JywnPGRpdiBjbGFz cz0ie2Nsc30taW5uZXIiPicsJzxkaXYgY2xhc3M9IntjbHN9LWJhciI+JywnPGRp diBjbGFzcz0ie2Nsc30tdGV4dCI+JywiPGRpdj4mIzE2MDs8L2Rpdj4iLCI8L2Rp dj4iLCI8L2Rpdj4iLCc8ZGl2IGNsYXNzPSJ7Y2xzfS10ZXh0IHtjbHN9LXRleHQt YmFjayI+JywiPGRpdj4mIzE2MDs8L2Rpdj4iLCI8L2Rpdj4iLCI8L2Rpdj4iLCI8 L2Rpdj4iKTt0aGlzLmVsPWE/Yy5pbnNlcnRCZWZvcmUoYSx7Y2xzOnRoaXMuYmFz ZUNsc30sdHJ1ZSk6Yy5hcHBlbmQoZCx7Y2xzOnRoaXMuYmFzZUNsc30sdHJ1ZSk7 aWYodGhpcy5pZCl7dGhpcy5lbC5kb20uaWQ9dGhpcy5pZH12YXIgYj10aGlzLmVs LmRvbS5maXJzdENoaWxkO3RoaXMucHJvZ3Jlc3NCYXI9RXh0LmdldChiLmZpcnN0 Q2hpbGQpO2lmKHRoaXMudGV4dEVsKXt0aGlzLnRleHRFbD1FeHQuZ2V0KHRoaXMu dGV4dEVsKTtkZWxldGUgdGhpcy50ZXh0VG9wRWx9ZWxzZXt0aGlzLnRleHRUb3BF bD1FeHQuZ2V0KHRoaXMucHJvZ3Jlc3NCYXIuZG9tLmZpcnN0Q2hpbGQpO3ZhciBl PUV4dC5nZXQoYi5jaGlsZE5vZGVzWzFdKTt0aGlzLnRleHRUb3BFbC5zZXRTdHls ZSgiei1pbmRleCIsOTkpLmFkZENsYXNzKCJ4LWhpZGRlbiIpO3RoaXMudGV4dEVs PW5ldyBFeHQuQ29tcG9zaXRlRWxlbWVudChbdGhpcy50ZXh0VG9wRWwuZG9tLmZp cnN0Q2hpbGQsZS5kb20uZmlyc3RDaGlsZF0pO3RoaXMudGV4dEVsLnNldFdpZHRo KGIub2Zmc2V0V2lkdGgpfXRoaXMucHJvZ3Jlc3NCYXIuc2V0SGVpZ2h0KGIub2Zm c2V0SGVpZ2h0KX0sYWZ0ZXJSZW5kZXI6ZnVuY3Rpb24oKXtFeHQuUHJvZ3Jlc3NC YXIuc3VwZXJjbGFzcy5hZnRlclJlbmRlci5jYWxsKHRoaXMpO2lmKHRoaXMudmFs dWUpe3RoaXMudXBkYXRlUHJvZ3Jlc3ModGhpcy52YWx1ZSx0aGlzLnRleHQpfWVs c2V7dGhpcy51cGRhdGVUZXh0KHRoaXMudGV4dCl9fSx1cGRhdGVQcm9ncmVzczpm dW5jdGlvbihjLGQsYil7dGhpcy52YWx1ZT1jfHwwO2lmKGQpe3RoaXMudXBkYXRl VGV4dChkKX1pZih0aGlzLnJlbmRlcmVkJiYhdGhpcy5pc0Rlc3Ryb3llZCl7dmFy IGE9TWF0aC5mbG9vcihjKnRoaXMuZWwuZG9tLmZpcnN0Q2hpbGQub2Zmc2V0V2lk dGgpO3RoaXMucHJvZ3Jlc3NCYXIuc2V0V2lkdGgoYSxiPT09dHJ1ZXx8KGIhPT1m YWxzZSYmdGhpcy5hbmltYXRlKSk7aWYodGhpcy50ZXh0VG9wRWwpe3RoaXMudGV4 dFRvcEVsLnJlbW92ZUNsYXNzKCJ4LWhpZGRlbiIpLnNldFdpZHRoKGEpfX10aGlz LmZpcmVFdmVudCgidXBkYXRlIix0aGlzLGMsZCk7cmV0dXJuIHRoaXN9LHdhaXQ6 ZnVuY3Rpb24oYil7aWYoIXRoaXMud2FpdFRpbWVyKXt2YXIgYT10aGlzO2I9Ynx8 e307dGhpcy51cGRhdGVUZXh0KGIudGV4dCk7dGhpcy53YWl0VGltZXI9RXh0LlRh c2tNZ3Iuc3RhcnQoe3J1bjpmdW5jdGlvbihjKXt2YXIgZD1iLmluY3JlbWVudHx8 MTA7Yy09MTt0aGlzLnVwZGF0ZVByb2dyZXNzKCgoKChjK2QpJWQpKzEpKigxMDAv ZCkpKjAuMDEsbnVsbCxiLmFuaW1hdGUpfSxpbnRlcnZhbDpiLmludGVydmFsfHwx MDAwLGR1cmF0aW9uOmIuZHVyYXRpb24sb25TdG9wOmZ1bmN0aW9uKCl7aWYoYi5m bil7Yi5mbi5hcHBseShiLnNjb3BlfHx0aGlzKX10aGlzLnJlc2V0KCl9LHNjb3Bl OmF9KX1yZXR1cm4gdGhpc30saXNXYWl0aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRo aXMud2FpdFRpbWVyIT09bnVsbH0sdXBkYXRlVGV4dDpmdW5jdGlvbihhKXt0aGlz LnRleHQ9YXx8IiYjMTYwOyI7aWYodGhpcy5yZW5kZXJlZCl7dGhpcy50ZXh0RWwu dXBkYXRlKHRoaXMudGV4dCl9cmV0dXJuIHRoaXN9LHN5bmNQcm9ncmVzc0Jhcjpm dW5jdGlvbigpe2lmKHRoaXMudmFsdWUpe3RoaXMudXBkYXRlUHJvZ3Jlc3ModGhp cy52YWx1ZSx0aGlzLnRleHQpfXJldHVybiB0aGlzfSxzZXRTaXplOmZ1bmN0aW9u KGEsYyl7RXh0LlByb2dyZXNzQmFyLnN1cGVyY2xhc3Muc2V0U2l6ZS5jYWxsKHRo aXMsYSxjKTtpZih0aGlzLnRleHRUb3BFbCl7dmFyIGI9dGhpcy5lbC5kb20uZmly c3RDaGlsZDt0aGlzLnRleHRFbC5zZXRTaXplKGIub2Zmc2V0V2lkdGgsYi5vZmZz ZXRIZWlnaHQpfXRoaXMuc3luY1Byb2dyZXNzQmFyKCk7cmV0dXJuIHRoaXN9LHJl c2V0OmZ1bmN0aW9uKGEpe3RoaXMudXBkYXRlUHJvZ3Jlc3MoMCk7aWYodGhpcy50 ZXh0VG9wRWwpe3RoaXMudGV4dFRvcEVsLmFkZENsYXNzKCJ4LWhpZGRlbiIpfXRo aXMuY2xlYXJUaW1lcigpO2lmKGE9PT10cnVlKXt0aGlzLmhpZGUoKX1yZXR1cm4g dGhpc30sY2xlYXJUaW1lcjpmdW5jdGlvbigpe2lmKHRoaXMud2FpdFRpbWVyKXt0 aGlzLndhaXRUaW1lci5vblN0b3A9bnVsbDtFeHQuVGFza01nci5zdG9wKHRoaXMu d2FpdFRpbWVyKTt0aGlzLndhaXRUaW1lcj1udWxsfX0sb25EZXN0cm95OmZ1bmN0 aW9uKCl7dGhpcy5jbGVhclRpbWVyKCk7aWYodGhpcy5yZW5kZXJlZCl7aWYodGhp cy50ZXh0RWwuaXNDb21wb3NpdGUpe3RoaXMudGV4dEVsLmNsZWFyKCl9RXh0LmRl c3Ryb3lNZW1iZXJzKHRoaXMsInRleHRFbCIsInByb2dyZXNzQmFyIiwidGV4dFRv cEVsIil9RXh0LlByb2dyZXNzQmFyLnN1cGVyY2xhc3Mub25EZXN0cm95LmNhbGwo dGhpcyl9fSk7RXh0LnJlZygicHJvZ3Jlc3MiLEV4dC5Qcm9ncmVzc0Jhcik7KGZ1 bmN0aW9uKCl7dmFyIGE9RXh0LkV2ZW50TWFuYWdlcjt2YXIgYj1FeHQubGliLkRv bTtFeHQuZGQuRHJhZ0Ryb3A9ZnVuY3Rpb24oZSxjLGQpe2lmKGUpe3RoaXMuaW5p dChlLGMsZCl9fTtFeHQuZGQuRHJhZ0Ryb3AucHJvdG90eXBlPXtpZDpudWxsLGNv bmZpZzpudWxsLGRyYWdFbElkOm51bGwsaGFuZGxlRWxJZDpudWxsLGludmFsaWRI YW5kbGVUeXBlczpudWxsLGludmFsaWRIYW5kbGVJZHM6bnVsbCxpbnZhbGlkSGFu ZGxlQ2xhc3NlczpudWxsLHN0YXJ0UGFnZVg6MCxzdGFydFBhZ2VZOjAsZ3JvdXBz Om51bGwsbG9ja2VkOmZhbHNlLGxvY2s6ZnVuY3Rpb24oKXt0aGlzLmxvY2tlZD10 cnVlfSxtb3ZlT25seTpmYWxzZSx1bmxvY2s6ZnVuY3Rpb24oKXt0aGlzLmxvY2tl ZD1mYWxzZX0saXNUYXJnZXQ6dHJ1ZSxwYWRkaW5nOm51bGwsX2RvbVJlZjpudWxs LF9feWdEcmFnRHJvcDp0cnVlLGNvbnN0cmFpblg6ZmFsc2UsY29uc3RyYWluWTpm YWxzZSxtaW5YOjAsbWF4WDowLG1pblk6MCxtYXhZOjAsbWFpbnRhaW5PZmZzZXQ6 ZmFsc2UseFRpY2tzOm51bGwseVRpY2tzOm51bGwscHJpbWFyeUJ1dHRvbk9ubHk6 dHJ1ZSxhdmFpbGFibGU6ZmFsc2UsaGFzT3V0ZXJIYW5kbGVzOmZhbHNlLGI0U3Rh cnREcmFnOmZ1bmN0aW9uKGMsZCl7fSxzdGFydERyYWc6ZnVuY3Rpb24oYyxkKXt9 LGI0RHJhZzpmdW5jdGlvbihjKXt9LG9uRHJhZzpmdW5jdGlvbihjKXt9LG9uRHJh Z0VudGVyOmZ1bmN0aW9uKGMsZCl7fSxiNERyYWdPdmVyOmZ1bmN0aW9uKGMpe30s b25EcmFnT3ZlcjpmdW5jdGlvbihjLGQpe30sYjREcmFnT3V0OmZ1bmN0aW9uKGMp e30sb25EcmFnT3V0OmZ1bmN0aW9uKGMsZCl7fSxiNERyYWdEcm9wOmZ1bmN0aW9u KGMpe30sb25EcmFnRHJvcDpmdW5jdGlvbihjLGQpe30sb25JbnZhbGlkRHJvcDpm dW5jdGlvbihjKXt9LGI0RW5kRHJhZzpmdW5jdGlvbihjKXt9LGVuZERyYWc6ZnVu Y3Rpb24oYyl7fSxiNE1vdXNlRG93bjpmdW5jdGlvbihjKXt9LG9uTW91c2VEb3du OmZ1bmN0aW9uKGMpe30sb25Nb3VzZVVwOmZ1bmN0aW9uKGMpe30sb25BdmFpbGFi bGU6ZnVuY3Rpb24oKXt9LGRlZmF1bHRQYWRkaW5nOntsZWZ0OjAscmlnaHQ6MCx0 b3A6MCxib3R0b206MH0sY29uc3RyYWluVG86ZnVuY3Rpb24oaixoLG8pe2lmKEV4 dC5pc051bWJlcihoKSl7aD17bGVmdDpoLHJpZ2h0OmgsdG9wOmgsYm90dG9tOmh9 fWg9aHx8dGhpcy5kZWZhdWx0UGFkZGluZzt2YXIgbD1FeHQuZ2V0KHRoaXMuZ2V0 RWwoKSkuZ2V0Qm94KCksZD1FeHQuZ2V0KGopLG49ZC5nZXRTY3JvbGwoKSxrLGU9 ZC5kb207aWYoZT09ZG9jdW1lbnQuYm9keSl7az17eDpuLmxlZnQseTpuLnRvcCx3 aWR0aDpFeHQubGliLkRvbS5nZXRWaWV3V2lkdGgoKSxoZWlnaHQ6RXh0LmxpYi5E b20uZ2V0Vmlld0hlaWdodCgpfX1lbHNle3ZhciBtPWQuZ2V0WFkoKTtrPXt4Om1b MF0seTptWzFdLHdpZHRoOmUuY2xpZW50V2lkdGgsaGVpZ2h0OmUuY2xpZW50SGVp Z2h0fX12YXIgaT1sLnktay55LGc9bC54LWsueDt0aGlzLnJlc2V0Q29uc3RyYWlu dHMoKTt0aGlzLnNldFhDb25zdHJhaW50KGctKGgubGVmdHx8MCksay53aWR0aC1n LWwud2lkdGgtKGgucmlnaHR8fDApLHRoaXMueFRpY2tTaXplKTt0aGlzLnNldFlD b25zdHJhaW50KGktKGgudG9wfHwwKSxrLmhlaWdodC1pLWwuaGVpZ2h0LShoLmJv dHRvbXx8MCksdGhpcy55VGlja1NpemUpfSxnZXRFbDpmdW5jdGlvbigpe2lmKCF0 aGlzLl9kb21SZWYpe3RoaXMuX2RvbVJlZj1FeHQuZ2V0RG9tKHRoaXMuaWQpfXJl dHVybiB0aGlzLl9kb21SZWZ9LGdldERyYWdFbDpmdW5jdGlvbigpe3JldHVybiBF eHQuZ2V0RG9tKHRoaXMuZHJhZ0VsSWQpfSxpbml0OmZ1bmN0aW9uKGUsYyxkKXt0 aGlzLmluaXRUYXJnZXQoZSxjLGQpO2Eub24odGhpcy5pZCwibW91c2Vkb3duIix0 aGlzLmhhbmRsZU1vdXNlRG93bix0aGlzKX0saW5pdFRhcmdldDpmdW5jdGlvbihl LGMsZCl7dGhpcy5jb25maWc9ZHx8e307dGhpcy5ERE09RXh0LmRkLkRETTt0aGlz Lmdyb3Vwcz17fTtpZih0eXBlb2YgZSE9PSJzdHJpbmciKXtlPUV4dC5pZChlKX10 aGlzLmlkPWU7dGhpcy5hZGRUb0dyb3VwKChjKT9jOiJkZWZhdWx0Iik7dGhpcy5o YW5kbGVFbElkPWU7dGhpcy5zZXREcmFnRWxJZChlKTt0aGlzLmludmFsaWRIYW5k bGVUeXBlcz17QToiQSJ9O3RoaXMuaW52YWxpZEhhbmRsZUlkcz17fTt0aGlzLmlu dmFsaWRIYW5kbGVDbGFzc2VzPVtdO3RoaXMuYXBwbHlDb25maWcoKTt0aGlzLmhh bmRsZU9uQXZhaWxhYmxlKCl9LGFwcGx5Q29uZmlnOmZ1bmN0aW9uKCl7dGhpcy5w YWRkaW5nPXRoaXMuY29uZmlnLnBhZGRpbmd8fFswLDAsMCwwXTt0aGlzLmlzVGFy Z2V0PSh0aGlzLmNvbmZpZy5pc1RhcmdldCE9PWZhbHNlKTt0aGlzLm1haW50YWlu T2Zmc2V0PSh0aGlzLmNvbmZpZy5tYWludGFpbk9mZnNldCk7dGhpcy5wcmltYXJ5 QnV0dG9uT25seT0odGhpcy5jb25maWcucHJpbWFyeUJ1dHRvbk9ubHkhPT1mYWxz ZSl9LGhhbmRsZU9uQXZhaWxhYmxlOmZ1bmN0aW9uKCl7dGhpcy5hdmFpbGFibGU9 dHJ1ZTt0aGlzLnJlc2V0Q29uc3RyYWludHMoKTt0aGlzLm9uQXZhaWxhYmxlKCl9 LHNldFBhZGRpbmc6ZnVuY3Rpb24oZSxjLGcsZCl7aWYoIWMmJjAhPT1jKXt0aGlz LnBhZGRpbmc9W2UsZSxlLGVdfWVsc2V7aWYoIWcmJjAhPT1nKXt0aGlzLnBhZGRp bmc9W2UsYyxlLGNdfWVsc2V7dGhpcy5wYWRkaW5nPVtlLGMsZyxkXX19fSxzZXRJ bml0UG9zaXRpb246ZnVuY3Rpb24oZyxlKXt2YXIgaD10aGlzLmdldEVsKCk7aWYo IXRoaXMuRERNLnZlcmlmeUVsKGgpKXtyZXR1cm59dmFyIGQ9Z3x8MDt2YXIgYz1l fHwwO3ZhciBpPWIuZ2V0WFkoaCk7dGhpcy5pbml0UGFnZVg9aVswXS1kO3RoaXMu aW5pdFBhZ2VZPWlbMV0tYzt0aGlzLmxhc3RQYWdlWD1pWzBdO3RoaXMubGFzdFBh Z2VZPWlbMV07dGhpcy5zZXRTdGFydFBvc2l0aW9uKGkpfSxzZXRTdGFydFBvc2l0 aW9uOmZ1bmN0aW9uKGQpe3ZhciBjPWR8fGIuZ2V0WFkodGhpcy5nZXRFbCgpKTt0 aGlzLmRlbHRhU2V0WFk9bnVsbDt0aGlzLnN0YXJ0UGFnZVg9Y1swXTt0aGlzLnN0 YXJ0UGFnZVk9Y1sxXX0sYWRkVG9Hcm91cDpmdW5jdGlvbihjKXt0aGlzLmdyb3Vw c1tjXT10cnVlO3RoaXMuRERNLnJlZ0RyYWdEcm9wKHRoaXMsYyl9LHJlbW92ZUZy b21Hcm91cDpmdW5jdGlvbihjKXtpZih0aGlzLmdyb3Vwc1tjXSl7ZGVsZXRlIHRo aXMuZ3JvdXBzW2NdfXRoaXMuRERNLnJlbW92ZURERnJvbUdyb3VwKHRoaXMsYyl9 LHNldERyYWdFbElkOmZ1bmN0aW9uKGMpe3RoaXMuZHJhZ0VsSWQ9Y30sc2V0SGFu ZGxlRWxJZDpmdW5jdGlvbihjKXtpZih0eXBlb2YgYyE9PSJzdHJpbmciKXtjPUV4 dC5pZChjKX10aGlzLmhhbmRsZUVsSWQ9Yzt0aGlzLkRETS5yZWdIYW5kbGUodGhp cy5pZCxjKX0sc2V0T3V0ZXJIYW5kbGVFbElkOmZ1bmN0aW9uKGMpe2lmKHR5cGVv ZiBjIT09InN0cmluZyIpe2M9RXh0LmlkKGMpfWEub24oYywibW91c2Vkb3duIix0 aGlzLmhhbmRsZU1vdXNlRG93bix0aGlzKTt0aGlzLnNldEhhbmRsZUVsSWQoYyk7 dGhpcy5oYXNPdXRlckhhbmRsZXM9dHJ1ZX0sdW5yZWc6ZnVuY3Rpb24oKXthLnVu KHRoaXMuaWQsIm1vdXNlZG93biIsdGhpcy5oYW5kbGVNb3VzZURvd24pO3RoaXMu X2RvbVJlZj1udWxsO3RoaXMuRERNLl9yZW1vdmUodGhpcyl9LGRlc3Ryb3k6ZnVu Y3Rpb24oKXt0aGlzLnVucmVnKCl9LGlzTG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJu KHRoaXMuRERNLmlzTG9ja2VkKCl8fHRoaXMubG9ja2VkKX0saGFuZGxlTW91c2VE b3duOmZ1bmN0aW9uKGcsZCl7aWYodGhpcy5wcmltYXJ5QnV0dG9uT25seSYmZy5i dXR0b24hPTApe3JldHVybn1pZih0aGlzLmlzTG9ja2VkKCkpe3JldHVybn10aGlz LkRETS5yZWZyZXNoQ2FjaGUodGhpcy5ncm91cHMpO3ZhciBjPW5ldyBFeHQubGli LlBvaW50KEV4dC5saWIuRXZlbnQuZ2V0UGFnZVgoZyksRXh0LmxpYi5FdmVudC5n ZXRQYWdlWShnKSk7aWYoIXRoaXMuaGFzT3V0ZXJIYW5kbGVzJiYhdGhpcy5ERE0u aXNPdmVyVGFyZ2V0KGMsdGhpcykpe31lbHNle2lmKHRoaXMuY2xpY2tWYWxpZGF0 b3IoZykpe3RoaXMuc2V0U3RhcnRQb3NpdGlvbigpO3RoaXMuYjRNb3VzZURvd24o Zyk7dGhpcy5vbk1vdXNlRG93bihnKTt0aGlzLkRETS5oYW5kbGVNb3VzZURvd24o Zyx0aGlzKTt0aGlzLkRETS5zdG9wRXZlbnQoZyl9ZWxzZXt9fX0sY2xpY2tWYWxp ZGF0b3I6ZnVuY3Rpb24oZCl7dmFyIGM9ZC5nZXRUYXJnZXQoKTtyZXR1cm4odGhp cy5pc1ZhbGlkSGFuZGxlQ2hpbGQoYykmJih0aGlzLmlkPT10aGlzLmhhbmRsZUVs SWR8fHRoaXMuRERNLmhhbmRsZVdhc0NsaWNrZWQoYyx0aGlzLmlkKSkpfSxhZGRJ bnZhbGlkSGFuZGxlVHlwZTpmdW5jdGlvbihjKXt2YXIgZD1jLnRvVXBwZXJDYXNl KCk7dGhpcy5pbnZhbGlkSGFuZGxlVHlwZXNbZF09ZH0sYWRkSW52YWxpZEhhbmRs ZUlkOmZ1bmN0aW9uKGMpe2lmKHR5cGVvZiBjIT09InN0cmluZyIpe2M9RXh0Lmlk KGMpfXRoaXMuaW52YWxpZEhhbmRsZUlkc1tjXT1jfSxhZGRJbnZhbGlkSGFuZGxl Q2xhc3M6ZnVuY3Rpb24oYyl7dGhpcy5pbnZhbGlkSGFuZGxlQ2xhc3Nlcy5wdXNo KGMpfSxyZW1vdmVJbnZhbGlkSGFuZGxlVHlwZTpmdW5jdGlvbihjKXt2YXIgZD1j LnRvVXBwZXJDYXNlKCk7ZGVsZXRlIHRoaXMuaW52YWxpZEhhbmRsZVR5cGVzW2Rd fSxyZW1vdmVJbnZhbGlkSGFuZGxlSWQ6ZnVuY3Rpb24oYyl7aWYodHlwZW9mIGMh PT0ic3RyaW5nIil7Yz1FeHQuaWQoYyl9ZGVsZXRlIHRoaXMuaW52YWxpZEhhbmRs ZUlkc1tjXX0scmVtb3ZlSW52YWxpZEhhbmRsZUNsYXNzOmZ1bmN0aW9uKGQpe2Zv cih2YXIgZT0wLGM9dGhpcy5pbnZhbGlkSGFuZGxlQ2xhc3Nlcy5sZW5ndGg7ZTxj OysrZSl7aWYodGhpcy5pbnZhbGlkSGFuZGxlQ2xhc3Nlc1tlXT09ZCl7ZGVsZXRl IHRoaXMuaW52YWxpZEhhbmRsZUNsYXNzZXNbZV19fX0saXNWYWxpZEhhbmRsZUNo aWxkOmZ1bmN0aW9uKGgpe3ZhciBnPXRydWU7dmFyIGs7dHJ5e2s9aC5ub2RlTmFt ZS50b1VwcGVyQ2FzZSgpfWNhdGNoKGope2s9aC5ub2RlTmFtZX1nPWcmJiF0aGlz LmludmFsaWRIYW5kbGVUeXBlc1trXTtnPWcmJiF0aGlzLmludmFsaWRIYW5kbGVJ ZHNbaC5pZF07Zm9yKHZhciBkPTAsYz10aGlzLmludmFsaWRIYW5kbGVDbGFzc2Vz Lmxlbmd0aDtnJiZkPGM7KytkKXtnPSFFeHQuZmx5KGgpLmhhc0NsYXNzKHRoaXMu aW52YWxpZEhhbmRsZUNsYXNzZXNbZF0pfXJldHVybiBnfSxzZXRYVGlja3M6ZnVu Y3Rpb24oZyxjKXt0aGlzLnhUaWNrcz1bXTt0aGlzLnhUaWNrU2l6ZT1jO3ZhciBl PXt9O2Zvcih2YXIgZD10aGlzLmluaXRQYWdlWDtkPj10aGlzLm1pblg7ZD1kLWMp e2lmKCFlW2RdKXt0aGlzLnhUaWNrc1t0aGlzLnhUaWNrcy5sZW5ndGhdPWQ7ZVtk XT10cnVlfX1mb3IoZD10aGlzLmluaXRQYWdlWDtkPD10aGlzLm1heFg7ZD1kK2Mp e2lmKCFlW2RdKXt0aGlzLnhUaWNrc1t0aGlzLnhUaWNrcy5sZW5ndGhdPWQ7ZVtk XT10cnVlfX10aGlzLnhUaWNrcy5zb3J0KHRoaXMuRERNLm51bWVyaWNTb3J0KX0s c2V0WVRpY2tzOmZ1bmN0aW9uKGcsYyl7dGhpcy55VGlja3M9W107dGhpcy55VGlj a1NpemU9Yzt2YXIgZT17fTtmb3IodmFyIGQ9dGhpcy5pbml0UGFnZVk7ZD49dGhp cy5taW5ZO2Q9ZC1jKXtpZighZVtkXSl7dGhpcy55VGlja3NbdGhpcy55VGlja3Mu bGVuZ3RoXT1kO2VbZF09dHJ1ZX19Zm9yKGQ9dGhpcy5pbml0UGFnZVk7ZDw9dGhp cy5tYXhZO2Q9ZCtjKXtpZighZVtkXSl7dGhpcy55VGlja3NbdGhpcy55VGlja3Mu bGVuZ3RoXT1kO2VbZF09dHJ1ZX19dGhpcy55VGlja3Muc29ydCh0aGlzLkRETS5u dW1lcmljU29ydCl9LHNldFhDb25zdHJhaW50OmZ1bmN0aW9uKGUsZCxjKXt0aGlz LmxlZnRDb25zdHJhaW50PWU7dGhpcy5yaWdodENvbnN0cmFpbnQ9ZDt0aGlzLm1p blg9dGhpcy5pbml0UGFnZVgtZTt0aGlzLm1heFg9dGhpcy5pbml0UGFnZVgrZDtp ZihjKXt0aGlzLnNldFhUaWNrcyh0aGlzLmluaXRQYWdlWCxjKX10aGlzLmNvbnN0 cmFpblg9dHJ1ZX0sY2xlYXJDb25zdHJhaW50czpmdW5jdGlvbigpe3RoaXMuY29u c3RyYWluWD1mYWxzZTt0aGlzLmNvbnN0cmFpblk9ZmFsc2U7dGhpcy5jbGVhclRp Y2tzKCl9LGNsZWFyVGlja3M6ZnVuY3Rpb24oKXt0aGlzLnhUaWNrcz1udWxsO3Ro aXMueVRpY2tzPW51bGw7dGhpcy54VGlja1NpemU9MDt0aGlzLnlUaWNrU2l6ZT0w fSxzZXRZQ29uc3RyYWludDpmdW5jdGlvbihjLGUsZCl7dGhpcy50b3BDb25zdHJh aW50PWM7dGhpcy5ib3R0b21Db25zdHJhaW50PWU7dGhpcy5taW5ZPXRoaXMuaW5p dFBhZ2VZLWM7dGhpcy5tYXhZPXRoaXMuaW5pdFBhZ2VZK2U7aWYoZCl7dGhpcy5z ZXRZVGlja3ModGhpcy5pbml0UGFnZVksZCl9dGhpcy5jb25zdHJhaW5ZPXRydWV9 LHJlc2V0Q29uc3RyYWludHM6ZnVuY3Rpb24oKXtpZih0aGlzLmluaXRQYWdlWHx8 dGhpcy5pbml0UGFnZVg9PT0wKXt2YXIgZD0odGhpcy5tYWludGFpbk9mZnNldCk/ dGhpcy5sYXN0UGFnZVgtdGhpcy5pbml0UGFnZVg6MDt2YXIgYz0odGhpcy5tYWlu dGFpbk9mZnNldCk/dGhpcy5sYXN0UGFnZVktdGhpcy5pbml0UGFnZVk6MDt0aGlz LnNldEluaXRQb3NpdGlvbihkLGMpfWVsc2V7dGhpcy5zZXRJbml0UG9zaXRpb24o KX1pZih0aGlzLmNvbnN0cmFpblgpe3RoaXMuc2V0WENvbnN0cmFpbnQodGhpcy5s ZWZ0Q29uc3RyYWludCx0aGlzLnJpZ2h0Q29uc3RyYWludCx0aGlzLnhUaWNrU2l6 ZSl9aWYodGhpcy5jb25zdHJhaW5ZKXt0aGlzLnNldFlDb25zdHJhaW50KHRoaXMu dG9wQ29uc3RyYWludCx0aGlzLmJvdHRvbUNvbnN0cmFpbnQsdGhpcy55VGlja1Np emUpfX0sZ2V0VGljazpmdW5jdGlvbihrLGcpe2lmKCFnKXtyZXR1cm4ga31lbHNl e2lmKGdbMF0+PWspe3JldHVybiBnWzBdfWVsc2V7Zm9yKHZhciBkPTAsYz1nLmxl bmd0aDtkPGM7KytkKXt2YXIgZT1kKzE7aWYoZ1tlXSYmZ1tlXT49ayl7dmFyIGo9 ay1nW2RdO3ZhciBoPWdbZV0taztyZXR1cm4oaD5qKT9nW2RdOmdbZV19fXJldHVy biBnW2cubGVuZ3RoLTFdfX19LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuKCJE cmFnRHJvcCAiK3RoaXMuaWQpfX19KSgpO2lmKCFFeHQuZGQuRHJhZ0Ryb3BNZ3Ip e0V4dC5kZC5EcmFnRHJvcE1ncj1mdW5jdGlvbigpe3ZhciBhPUV4dC5FdmVudE1h bmFnZXI7cmV0dXJue2lkczp7fSxoYW5kbGVJZHM6e30sZHJhZ0N1cnJlbnQ6bnVs bCxkcmFnT3ZlcnM6e30sZGVsdGFYOjAsZGVsdGFZOjAscHJldmVudERlZmF1bHQ6 dHJ1ZSxzdG9wUHJvcGFnYXRpb246dHJ1ZSxpbml0aWFsaXplZDpmYWxzZSxsb2Nr ZWQ6ZmFsc2UsaW5pdDpmdW5jdGlvbigpe3RoaXMuaW5pdGlhbGl6ZWQ9dHJ1ZX0s UE9JTlQ6MCxJTlRFUlNFQ1Q6MSxtb2RlOjAsX2V4ZWNPbkFsbDpmdW5jdGlvbihk LGMpe2Zvcih2YXIgZSBpbiB0aGlzLmlkcyl7Zm9yKHZhciBiIGluIHRoaXMuaWRz W2VdKXt2YXIgZz10aGlzLmlkc1tlXVtiXTtpZighdGhpcy5pc1R5cGVPZkREKGcp KXtjb250aW51ZX1nW2RdLmFwcGx5KGcsYyl9fX0sX29uTG9hZDpmdW5jdGlvbigp e3RoaXMuaW5pdCgpO2Eub24oZG9jdW1lbnQsIm1vdXNldXAiLHRoaXMuaGFuZGxl TW91c2VVcCx0aGlzLHRydWUpO2Eub24oZG9jdW1lbnQsIm1vdXNlbW92ZSIsdGhp cy5oYW5kbGVNb3VzZU1vdmUsdGhpcyx0cnVlKTthLm9uKHdpbmRvdywidW5sb2Fk Iix0aGlzLl9vblVubG9hZCx0aGlzLHRydWUpO2Eub24od2luZG93LCJyZXNpemUi LHRoaXMuX29uUmVzaXplLHRoaXMsdHJ1ZSl9LF9vblJlc2l6ZTpmdW5jdGlvbihi KXt0aGlzLl9leGVjT25BbGwoInJlc2V0Q29uc3RyYWludHMiLFtdKX0sbG9jazpm dW5jdGlvbigpe3RoaXMubG9ja2VkPXRydWV9LHVubG9jazpmdW5jdGlvbigpe3Ro aXMubG9ja2VkPWZhbHNlfSxpc0xvY2tlZDpmdW5jdGlvbigpe3JldHVybiB0aGlz LmxvY2tlZH0sbG9jYXRpb25DYWNoZTp7fSx1c2VDYWNoZTp0cnVlLGNsaWNrUGl4 ZWxUaHJlc2g6MyxjbGlja1RpbWVUaHJlc2g6MzUwLGRyYWdUaHJlc2hNZXQ6ZmFs c2UsY2xpY2tUaW1lb3V0Om51bGwsc3RhcnRYOjAsc3RhcnRZOjAscmVnRHJhZ0Ry b3A6ZnVuY3Rpb24oYyxiKXtpZighdGhpcy5pbml0aWFsaXplZCl7dGhpcy5pbml0 KCl9aWYoIXRoaXMuaWRzW2JdKXt0aGlzLmlkc1tiXT17fX10aGlzLmlkc1tiXVtj LmlkXT1jfSxyZW1vdmVEREZyb21Hcm91cDpmdW5jdGlvbihkLGIpe2lmKCF0aGlz Lmlkc1tiXSl7dGhpcy5pZHNbYl09e319dmFyIGM9dGhpcy5pZHNbYl07aWYoYyYm Y1tkLmlkXSl7ZGVsZXRlIGNbZC5pZF19fSxfcmVtb3ZlOmZ1bmN0aW9uKGMpe2Zv cih2YXIgYiBpbiBjLmdyb3Vwcyl7aWYoYiYmdGhpcy5pZHNbYl0mJnRoaXMuaWRz W2JdW2MuaWRdKXtkZWxldGUgdGhpcy5pZHNbYl1bYy5pZF19fWRlbGV0ZSB0aGlz LmhhbmRsZUlkc1tjLmlkXX0scmVnSGFuZGxlOmZ1bmN0aW9uKGMsYil7aWYoIXRo aXMuaGFuZGxlSWRzW2NdKXt0aGlzLmhhbmRsZUlkc1tjXT17fX10aGlzLmhhbmRs ZUlkc1tjXVtiXT1ifSxpc0RyYWdEcm9wOmZ1bmN0aW9uKGIpe3JldHVybih0aGlz LmdldEREQnlJZChiKSk/dHJ1ZTpmYWxzZX0sZ2V0UmVsYXRlZDpmdW5jdGlvbiho LGMpe3ZhciBnPVtdO2Zvcih2YXIgZSBpbiBoLmdyb3Vwcyl7Zm9yKHZhciBkIGlu IHRoaXMuaWRzW2VdKXt2YXIgYj10aGlzLmlkc1tlXVtkXTtpZighdGhpcy5pc1R5 cGVPZkREKGIpKXtjb250aW51ZX1pZighY3x8Yi5pc1RhcmdldCl7Z1tnLmxlbmd0 aF09Yn19fXJldHVybiBnfSxpc0xlZ2FsVGFyZ2V0OmZ1bmN0aW9uKGcsZSl7dmFy IGM9dGhpcy5nZXRSZWxhdGVkKGcsdHJ1ZSk7Zm9yKHZhciBkPTAsYj1jLmxlbmd0 aDtkPGI7KytkKXtpZihjW2RdLmlkPT1lLmlkKXtyZXR1cm4gdHJ1ZX19cmV0dXJu IGZhbHNlfSxpc1R5cGVPZkREOmZ1bmN0aW9uKGIpe3JldHVybihiJiZiLl9feWdE cmFnRHJvcCl9LGlzSGFuZGxlOmZ1bmN0aW9uKGMsYil7cmV0dXJuKHRoaXMuaGFu ZGxlSWRzW2NdJiZ0aGlzLmhhbmRsZUlkc1tjXVtiXSl9LGdldEREQnlJZDpmdW5j dGlvbihjKXtmb3IodmFyIGIgaW4gdGhpcy5pZHMpe2lmKHRoaXMuaWRzW2JdW2Nd KXtyZXR1cm4gdGhpcy5pZHNbYl1bY119fXJldHVybiBudWxsfSxoYW5kbGVNb3Vz ZURvd246ZnVuY3Rpb24oZCxjKXtpZihFeHQuUXVpY2tUaXBzKXtFeHQuUXVpY2tU aXBzLmRkRGlzYWJsZSgpfWlmKHRoaXMuZHJhZ0N1cnJlbnQpe3RoaXMuaGFuZGxl TW91c2VVcChkKX10aGlzLmN1cnJlbnRUYXJnZXQ9ZC5nZXRUYXJnZXQoKTt0aGlz LmRyYWdDdXJyZW50PWM7dmFyIGI9Yy5nZXRFbCgpO3RoaXMuc3RhcnRYPWQuZ2V0 UGFnZVgoKTt0aGlzLnN0YXJ0WT1kLmdldFBhZ2VZKCk7dGhpcy5kZWx0YVg9dGhp cy5zdGFydFgtYi5vZmZzZXRMZWZ0O3RoaXMuZGVsdGFZPXRoaXMuc3RhcnRZLWIu b2Zmc2V0VG9wO3RoaXMuZHJhZ1RocmVzaE1ldD1mYWxzZTt0aGlzLmNsaWNrVGlt ZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGU9RXh0LmRkLkRETTtlLnN0 YXJ0RHJhZyhlLnN0YXJ0WCxlLnN0YXJ0WSl9LHRoaXMuY2xpY2tUaW1lVGhyZXNo KX0sc3RhcnREcmFnOmZ1bmN0aW9uKGIsYyl7Y2xlYXJUaW1lb3V0KHRoaXMuY2xp Y2tUaW1lb3V0KTtpZih0aGlzLmRyYWdDdXJyZW50KXt0aGlzLmRyYWdDdXJyZW50 LmI0U3RhcnREcmFnKGIsYyk7dGhpcy5kcmFnQ3VycmVudC5zdGFydERyYWcoYixj KX10aGlzLmRyYWdUaHJlc2hNZXQ9dHJ1ZX0saGFuZGxlTW91c2VVcDpmdW5jdGlv bihiKXtpZihFeHQuUXVpY2tUaXBzKXtFeHQuUXVpY2tUaXBzLmRkRW5hYmxlKCl9 aWYoIXRoaXMuZHJhZ0N1cnJlbnQpe3JldHVybn1jbGVhclRpbWVvdXQodGhpcy5j bGlja1RpbWVvdXQpO2lmKHRoaXMuZHJhZ1RocmVzaE1ldCl7dGhpcy5maXJlRXZl bnRzKGIsdHJ1ZSl9ZWxzZXt9dGhpcy5zdG9wRHJhZyhiKTt0aGlzLnN0b3BFdmVu dChiKX0sc3RvcEV2ZW50OmZ1bmN0aW9uKGIpe2lmKHRoaXMuc3RvcFByb3BhZ2F0 aW9uKXtiLnN0b3BQcm9wYWdhdGlvbigpfWlmKHRoaXMucHJldmVudERlZmF1bHQp e2IucHJldmVudERlZmF1bHQoKX19LHN0b3BEcmFnOmZ1bmN0aW9uKGIpe2lmKHRo aXMuZHJhZ0N1cnJlbnQpe2lmKHRoaXMuZHJhZ1RocmVzaE1ldCl7dGhpcy5kcmFn Q3VycmVudC5iNEVuZERyYWcoYik7dGhpcy5kcmFnQ3VycmVudC5lbmREcmFnKGIp fXRoaXMuZHJhZ0N1cnJlbnQub25Nb3VzZVVwKGIpfXRoaXMuZHJhZ0N1cnJlbnQ9 bnVsbDt0aGlzLmRyYWdPdmVycz17fX0saGFuZGxlTW91c2VNb3ZlOmZ1bmN0aW9u KGQpe2lmKCF0aGlzLmRyYWdDdXJyZW50KXtyZXR1cm4gdHJ1ZX1pZihFeHQuaXNJ RSYmKGQuYnV0dG9uIT09MCYmZC5idXR0b24hPT0xJiZkLmJ1dHRvbiE9PTIpKXt0 aGlzLnN0b3BFdmVudChkKTtyZXR1cm4gdGhpcy5oYW5kbGVNb3VzZVVwKGQpfWlm KCF0aGlzLmRyYWdUaHJlc2hNZXQpe3ZhciBjPU1hdGguYWJzKHRoaXMuc3RhcnRY LWQuZ2V0UGFnZVgoKSk7dmFyIGI9TWF0aC5hYnModGhpcy5zdGFydFktZC5nZXRQ YWdlWSgpKTtpZihjPnRoaXMuY2xpY2tQaXhlbFRocmVzaHx8Yj50aGlzLmNsaWNr UGl4ZWxUaHJlc2gpe3RoaXMuc3RhcnREcmFnKHRoaXMuc3RhcnRYLHRoaXMuc3Rh cnRZKX19aWYodGhpcy5kcmFnVGhyZXNoTWV0KXt0aGlzLmRyYWdDdXJyZW50LmI0 RHJhZyhkKTt0aGlzLmRyYWdDdXJyZW50Lm9uRHJhZyhkKTtpZighdGhpcy5kcmFn Q3VycmVudC5tb3ZlT25seSl7dGhpcy5maXJlRXZlbnRzKGQsZmFsc2UpfX10aGlz LnN0b3BFdmVudChkKTtyZXR1cm4gdHJ1ZX0sZmlyZUV2ZW50czpmdW5jdGlvbihu LG8pe3ZhciBxPXRoaXMuZHJhZ0N1cnJlbnQ7aWYoIXF8fHEuaXNMb2NrZWQoKSl7 cmV0dXJufXZhciByPW4uZ2V0UG9pbnQoKTt2YXIgYj1bXTt2YXIgZz1bXTt2YXIg bD1bXTt2YXIgaj1bXTt2YXIgZD1bXTtmb3IodmFyIGggaW4gdGhpcy5kcmFnT3Zl cnMpe3ZhciBjPXRoaXMuZHJhZ092ZXJzW2hdO2lmKCF0aGlzLmlzVHlwZU9mREQo Yykpe2NvbnRpbnVlfWlmKCF0aGlzLmlzT3ZlclRhcmdldChyLGMsdGhpcy5tb2Rl KSl7Zy5wdXNoKGMpfWJbaF09dHJ1ZTtkZWxldGUgdGhpcy5kcmFnT3ZlcnNbaF19 Zm9yKHZhciBwIGluIHEuZ3JvdXBzKXtpZigic3RyaW5nIiE9dHlwZW9mIHApe2Nv bnRpbnVlfWZvcihoIGluIHRoaXMuaWRzW3BdKXt2YXIgaz10aGlzLmlkc1twXVto XTtpZighdGhpcy5pc1R5cGVPZkREKGspKXtjb250aW51ZX1pZihrLmlzVGFyZ2V0 JiYhay5pc0xvY2tlZCgpJiYoKGshPXEpfHwocS5pZ25vcmVTZWxmPT09ZmFsc2Up KSl7aWYodGhpcy5pc092ZXJUYXJnZXQocixrLHRoaXMubW9kZSkpe2lmKG8pe2ou cHVzaChrKX1lbHNle2lmKCFiW2suaWRdKXtkLnB1c2goayl9ZWxzZXtsLnB1c2go ayl9dGhpcy5kcmFnT3ZlcnNbay5pZF09a319fX19aWYodGhpcy5tb2RlKXtpZihn Lmxlbmd0aCl7cS5iNERyYWdPdXQobixnKTtxLm9uRHJhZ091dChuLGcpfWlmKGQu bGVuZ3RoKXtxLm9uRHJhZ0VudGVyKG4sZCl9aWYobC5sZW5ndGgpe3EuYjREcmFn T3ZlcihuLGwpO3Eub25EcmFnT3ZlcihuLGwpfWlmKGoubGVuZ3RoKXtxLmI0RHJh Z0Ryb3AobixqKTtxLm9uRHJhZ0Ryb3AobixqKX19ZWxzZXt2YXIgbT0wO2Zvciho PTAsbT1nLmxlbmd0aDtoPG07KytoKXtxLmI0RHJhZ091dChuLGdbaF0uaWQpO3Eu b25EcmFnT3V0KG4sZ1toXS5pZCl9Zm9yKGg9MCxtPWQubGVuZ3RoO2g8bTsrK2gp e3Eub25EcmFnRW50ZXIobixkW2hdLmlkKX1mb3IoaD0wLG09bC5sZW5ndGg7aDxt OysraCl7cS5iNERyYWdPdmVyKG4sbFtoXS5pZCk7cS5vbkRyYWdPdmVyKG4sbFto XS5pZCl9Zm9yKGg9MCxtPWoubGVuZ3RoO2g8bTsrK2gpe3EuYjREcmFnRHJvcChu LGpbaF0uaWQpO3Eub25EcmFnRHJvcChuLGpbaF0uaWQpfX1pZihvJiYhai5sZW5n dGgpe3Eub25JbnZhbGlkRHJvcChuKX19LGdldEJlc3RNYXRjaDpmdW5jdGlvbihk KXt2YXIgZz1udWxsO3ZhciBjPWQubGVuZ3RoO2lmKGM9PTEpe2c9ZFswXX1lbHNl e2Zvcih2YXIgZT0wO2U8YzsrK2Upe3ZhciBiPWRbZV07aWYoYi5jdXJzb3JJc092 ZXIpe2c9YjticmVha31lbHNle2lmKCFnfHxnLm92ZXJsYXAuZ2V0QXJlYSgpPGIu b3ZlcmxhcC5nZXRBcmVhKCkpe2c9Yn19fX1yZXR1cm4gZ30scmVmcmVzaENhY2hl OmZ1bmN0aW9uKGMpe2Zvcih2YXIgYiBpbiBjKXtpZigic3RyaW5nIiE9dHlwZW9m IGIpe2NvbnRpbnVlfWZvcih2YXIgZCBpbiB0aGlzLmlkc1tiXSl7dmFyIGU9dGhp cy5pZHNbYl1bZF07aWYodGhpcy5pc1R5cGVPZkREKGUpKXt2YXIgZz10aGlzLmdl dExvY2F0aW9uKGUpO2lmKGcpe3RoaXMubG9jYXRpb25DYWNoZVtlLmlkXT1nfWVs c2V7ZGVsZXRlIHRoaXMubG9jYXRpb25DYWNoZVtlLmlkXX19fX19LHZlcmlmeUVs OmZ1bmN0aW9uKGMpe2lmKGMpe3ZhciBiO2lmKEV4dC5pc0lFKXt0cnl7Yj1jLm9m ZnNldFBhcmVudH1jYXRjaChkKXt9fWVsc2V7Yj1jLm9mZnNldFBhcmVudH1pZihi KXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfSxnZXRMb2NhdGlvbjpmdW5jdGlv bihqKXtpZighdGhpcy5pc1R5cGVPZkREKGopKXtyZXR1cm4gbnVsbH12YXIgaD1q LmdldEVsKCksbyxnLGQscSxwLHMsYyxuLGksbTt0cnl7bz1FeHQubGliLkRvbS5n ZXRYWShoKX1jYXRjaChrKXt9aWYoIW8pe3JldHVybiBudWxsfWc9b1swXTtkPWcr aC5vZmZzZXRXaWR0aDtxPW9bMV07cD1xK2gub2Zmc2V0SGVpZ2h0O3M9cS1qLnBh ZGRpbmdbMF07Yz1kK2oucGFkZGluZ1sxXTtuPXArai5wYWRkaW5nWzJdO2k9Zy1q LnBhZGRpbmdbM107bT1uZXcgRXh0LmxpYi5SZWdpb24ocyxjLG4saSk7aD1FeHQu Z2V0KGgucGFyZW50Tm9kZSk7d2hpbGUoaCYmbSl7aWYoaC5pc1Njcm9sbGFibGUo KSl7bT1tLmludGVyc2VjdChoLmdldFJlZ2lvbigpKX1oPWgucGFyZW50KCl9cmV0 dXJuIG19LGlzT3ZlclRhcmdldDpmdW5jdGlvbihrLGIsZCl7dmFyIGc9dGhpcy5s b2NhdGlvbkNhY2hlW2IuaWRdO2lmKCFnfHwhdGhpcy51c2VDYWNoZSl7Zz10aGlz LmdldExvY2F0aW9uKGIpO3RoaXMubG9jYXRpb25DYWNoZVtiLmlkXT1nfWlmKCFn KXtyZXR1cm4gZmFsc2V9Yi5jdXJzb3JJc092ZXI9Zy5jb250YWlucyhrKTt2YXIg aj10aGlzLmRyYWdDdXJyZW50O2lmKCFqfHwhai5nZXRUYXJnZXRDb29yZHx8KCFk JiYhai5jb25zdHJhaW5YJiYhai5jb25zdHJhaW5ZKSl7cmV0dXJuIGIuY3Vyc29y SXNPdmVyfWIub3ZlcmxhcD1udWxsO3ZhciBoPWouZ2V0VGFyZ2V0Q29vcmQoay54 LGsueSk7dmFyIGM9ai5nZXREcmFnRWwoKTt2YXIgZT1uZXcgRXh0LmxpYi5SZWdp b24oaC55LGgueCtjLm9mZnNldFdpZHRoLGgueStjLm9mZnNldEhlaWdodCxoLngp O3ZhciBpPWUuaW50ZXJzZWN0KGcpO2lmKGkpe2Iub3ZlcmxhcD1pO3JldHVybihk KT90cnVlOmIuY3Vyc29ySXNPdmVyfWVsc2V7cmV0dXJuIGZhbHNlfX0sX29uVW5s b2FkOmZ1bmN0aW9uKGMsYil7YS5yZW1vdmVMaXN0ZW5lcihkb2N1bWVudCwibW91 c2V1cCIsdGhpcy5oYW5kbGVNb3VzZVVwLHRoaXMpO2EucmVtb3ZlTGlzdGVuZXIo ZG9jdW1lbnQsIm1vdXNlbW92ZSIsdGhpcy5oYW5kbGVNb3VzZU1vdmUsdGhpcyk7 YS5yZW1vdmVMaXN0ZW5lcih3aW5kb3csInJlc2l6ZSIsdGhpcy5fb25SZXNpemUs dGhpcyk7RXh0LmRkLkRyYWdEcm9wTWdyLnVucmVnQWxsKCl9LHVucmVnQWxsOmZ1 bmN0aW9uKCl7aWYodGhpcy5kcmFnQ3VycmVudCl7dGhpcy5zdG9wRHJhZygpO3Ro aXMuZHJhZ0N1cnJlbnQ9bnVsbH10aGlzLl9leGVjT25BbGwoInVucmVnIixbXSk7 Zm9yKHZhciBiIGluIHRoaXMuZWxlbWVudENhY2hlKXtkZWxldGUgdGhpcy5lbGVt ZW50Q2FjaGVbYl19dGhpcy5lbGVtZW50Q2FjaGU9e307dGhpcy5pZHM9e319LGVs ZW1lbnRDYWNoZTp7fSxnZXRFbFdyYXBwZXI6ZnVuY3Rpb24oYyl7dmFyIGI9dGhp cy5lbGVtZW50Q2FjaGVbY107aWYoIWJ8fCFiLmVsKXtiPXRoaXMuZWxlbWVudENh Y2hlW2NdPW5ldyB0aGlzLkVsZW1lbnRXcmFwcGVyKEV4dC5nZXREb20oYykpfXJl dHVybiBifSxnZXRFbGVtZW50OmZ1bmN0aW9uKGIpe3JldHVybiBFeHQuZ2V0RG9t KGIpfSxnZXRDc3M6ZnVuY3Rpb24oYyl7dmFyIGI9RXh0LmdldERvbShjKTtyZXR1 cm4oYik/Yi5zdHlsZTpudWxsfSxFbGVtZW50V3JhcHBlcjpmdW5jdGlvbihiKXt0 aGlzLmVsPWJ8fG51bGw7dGhpcy5pZD10aGlzLmVsJiZiLmlkO3RoaXMuY3NzPXRo aXMuZWwmJmIuc3R5bGV9LGdldFBvc1g6ZnVuY3Rpb24oYil7cmV0dXJuIEV4dC5s aWIuRG9tLmdldFgoYil9LGdldFBvc1k6ZnVuY3Rpb24oYil7cmV0dXJuIEV4dC5s aWIuRG9tLmdldFkoYil9LHN3YXBOb2RlOmZ1bmN0aW9uKGQsYil7aWYoZC5zd2Fw Tm9kZSl7ZC5zd2FwTm9kZShiKX1lbHNle3ZhciBlPWIucGFyZW50Tm9kZTt2YXIg Yz1iLm5leHRTaWJsaW5nO2lmKGM9PWQpe2UuaW5zZXJ0QmVmb3JlKGQsYil9ZWxz ZXtpZihiPT1kLm5leHRTaWJsaW5nKXtlLmluc2VydEJlZm9yZShiLGQpfWVsc2V7 ZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChiLGQpO2UuaW5zZXJ0QmVmb3JlKGQs Yyl9fX19LGdldFNjcm9sbDpmdW5jdGlvbigpe3ZhciBkLGIsZT1kb2N1bWVudC5k b2N1bWVudEVsZW1lbnQsYz1kb2N1bWVudC5ib2R5O2lmKGUmJihlLnNjcm9sbFRv cHx8ZS5zY3JvbGxMZWZ0KSl7ZD1lLnNjcm9sbFRvcDtiPWUuc2Nyb2xsTGVmdH1l bHNle2lmKGMpe2Q9Yy5zY3JvbGxUb3A7Yj1jLnNjcm9sbExlZnR9ZWxzZXt9fXJl dHVybnt0b3A6ZCxsZWZ0OmJ9fSxnZXRTdHlsZTpmdW5jdGlvbihjLGIpe3JldHVy biBFeHQuZmx5KGMpLmdldFN0eWxlKGIpfSxnZXRTY3JvbGxUb3A6ZnVuY3Rpb24o KXtyZXR1cm4gdGhpcy5nZXRTY3JvbGwoKS50b3B9LGdldFNjcm9sbExlZnQ6ZnVu Y3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTY3JvbGwoKS5sZWZ0fSxtb3ZlVG9FbDpm dW5jdGlvbihiLGQpe3ZhciBjPUV4dC5saWIuRG9tLmdldFhZKGQpO0V4dC5saWIu RG9tLnNldFhZKGIsYyl9LG51bWVyaWNTb3J0OmZ1bmN0aW9uKGQsYyl7cmV0dXJu KGQtYyl9LF90aW1lb3V0Q291bnQ6MCxfYWRkTGlzdGVuZXJzOmZ1bmN0aW9uKCl7 dmFyIGI9RXh0LmRkLkRETTtpZihFeHQubGliLkV2ZW50JiZkb2N1bWVudCl7Yi5f b25Mb2FkKCl9ZWxzZXtpZihiLl90aW1lb3V0Q291bnQ+MjAwMCl7fWVsc2V7c2V0 VGltZW91dChiLl9hZGRMaXN0ZW5lcnMsMTApO2lmKGRvY3VtZW50JiZkb2N1bWVu dC5ib2R5KXtiLl90aW1lb3V0Q291bnQrPTF9fX19LGhhbmRsZVdhc0NsaWNrZWQ6 ZnVuY3Rpb24oYixkKXtpZih0aGlzLmlzSGFuZGxlKGQsYi5pZCkpe3JldHVybiB0 cnVlfWVsc2V7dmFyIGM9Yi5wYXJlbnROb2RlO3doaWxlKGMpe2lmKHRoaXMuaXNI YW5kbGUoZCxjLmlkKSl7cmV0dXJuIHRydWV9ZWxzZXtjPWMucGFyZW50Tm9kZX19 fXJldHVybiBmYWxzZX19fSgpO0V4dC5kZC5ERE09RXh0LmRkLkRyYWdEcm9wTWdy O0V4dC5kZC5ERE0uX2FkZExpc3RlbmVycygpfUV4dC5kZC5ERD1mdW5jdGlvbihj LGEsYil7aWYoYyl7dGhpcy5pbml0KGMsYSxiKX19O0V4dC5leHRlbmQoRXh0LmRk LkRELEV4dC5kZC5EcmFnRHJvcCx7c2Nyb2xsOnRydWUsYXV0b09mZnNldDpmdW5j dGlvbihjLGIpe3ZhciBhPWMtdGhpcy5zdGFydFBhZ2VYO3ZhciBkPWItdGhpcy5z dGFydFBhZ2VZO3RoaXMuc2V0RGVsdGEoYSxkKX0sc2V0RGVsdGE6ZnVuY3Rpb24o YixhKXt0aGlzLmRlbHRhWD1iO3RoaXMuZGVsdGFZPWF9LHNldERyYWdFbFBvczpm dW5jdGlvbihjLGIpe3ZhciBhPXRoaXMuZ2V0RHJhZ0VsKCk7dGhpcy5hbGlnbkVs V2l0aE1vdXNlKGEsYyxiKX0sYWxpZ25FbFdpdGhNb3VzZTpmdW5jdGlvbihjLGgs Zyl7dmFyIGU9dGhpcy5nZXRUYXJnZXRDb29yZChoLGcpO3ZhciBiPWMuZG9tP2M6 RXh0LmZseShjLCJfZGQiKTtpZighdGhpcy5kZWx0YVNldFhZKXt2YXIgaT1bZS54 LGUueV07Yi5zZXRYWShpKTt2YXIgZD1iLmdldExlZnQodHJ1ZSk7dmFyIGE9Yi5n ZXRUb3AodHJ1ZSk7dGhpcy5kZWx0YVNldFhZPVtkLWUueCxhLWUueV19ZWxzZXti LnNldExlZnRUb3AoZS54K3RoaXMuZGVsdGFTZXRYWVswXSxlLnkrdGhpcy5kZWx0 YVNldFhZWzFdKX10aGlzLmNhY2hlUG9zaXRpb24oZS54LGUueSk7dGhpcy5hdXRv U2Nyb2xsKGUueCxlLnksYy5vZmZzZXRIZWlnaHQsYy5vZmZzZXRXaWR0aCk7cmV0 dXJuIGV9LGNhY2hlUG9zaXRpb246ZnVuY3Rpb24oYixhKXtpZihiKXt0aGlzLmxh c3RQYWdlWD1iO3RoaXMubGFzdFBhZ2VZPWF9ZWxzZXt2YXIgYz1FeHQubGliLkRv bS5nZXRYWSh0aGlzLmdldEVsKCkpO3RoaXMubGFzdFBhZ2VYPWNbMF07dGhpcy5s YXN0UGFnZVk9Y1sxXX19LGF1dG9TY3JvbGw6ZnVuY3Rpb24obCxrLGUsbSl7aWYo dGhpcy5zY3JvbGwpe3ZhciBuPUV4dC5saWIuRG9tLmdldFZpZXdIZWlnaHQoKTt2 YXIgYj1FeHQubGliLkRvbS5nZXRWaWV3V2lkdGgoKTt2YXIgcD10aGlzLkRETS5n ZXRTY3JvbGxUb3AoKTt2YXIgZD10aGlzLkRETS5nZXRTY3JvbGxMZWZ0KCk7dmFy IGo9ZStrO3ZhciBvPW0rbDt2YXIgaT0obitwLWstdGhpcy5kZWx0YVkpO3ZhciBn PShiK2QtbC10aGlzLmRlbHRhWCk7dmFyIGM9NDA7dmFyIGE9KGRvY3VtZW50LmFs bCk/ODA6MzA7aWYoaj5uJiZpPGMpe3dpbmRvdy5zY3JvbGxUbyhkLHArYSl9aWYo azxwJiZwPjAmJmstcDxjKXt3aW5kb3cuc2Nyb2xsVG8oZCxwLWEpfWlmKG8+YiYm ZzxjKXt3aW5kb3cuc2Nyb2xsVG8oZCthLHApfWlmKGw8ZCYmZD4wJiZsLWQ8Yyl7 d2luZG93LnNjcm9sbFRvKGQtYSxwKX19fSxnZXRUYXJnZXRDb29yZDpmdW5jdGlv bihjLGIpe3ZhciBhPWMtdGhpcy5kZWx0YVg7dmFyIGQ9Yi10aGlzLmRlbHRhWTtp Zih0aGlzLmNvbnN0cmFpblgpe2lmKGE8dGhpcy5taW5YKXthPXRoaXMubWluWH1p ZihhPnRoaXMubWF4WCl7YT10aGlzLm1heFh9fWlmKHRoaXMuY29uc3RyYWluWSl7 aWYoZDx0aGlzLm1pblkpe2Q9dGhpcy5taW5ZfWlmKGQ+dGhpcy5tYXhZKXtkPXRo aXMubWF4WX19YT10aGlzLmdldFRpY2soYSx0aGlzLnhUaWNrcyk7ZD10aGlzLmdl dFRpY2soZCx0aGlzLnlUaWNrcyk7cmV0dXJue3g6YSx5OmR9fSxhcHBseUNvbmZp ZzpmdW5jdGlvbigpe0V4dC5kZC5ERC5zdXBlcmNsYXNzLmFwcGx5Q29uZmlnLmNh bGwodGhpcyk7dGhpcy5zY3JvbGw9KHRoaXMuY29uZmlnLnNjcm9sbCE9PWZhbHNl KX0sYjRNb3VzZURvd246ZnVuY3Rpb24oYSl7dGhpcy5hdXRvT2Zmc2V0KGEuZ2V0 UGFnZVgoKSxhLmdldFBhZ2VZKCkpfSxiNERyYWc6ZnVuY3Rpb24oYSl7dGhpcy5z ZXREcmFnRWxQb3MoYS5nZXRQYWdlWCgpLGEuZ2V0UGFnZVkoKSl9LHRvU3RyaW5n OmZ1bmN0aW9uKCl7cmV0dXJuKCJERCAiK3RoaXMuaWQpfX0pO0V4dC5kZC5ERFBy b3h5PWZ1bmN0aW9uKGMsYSxiKXtpZihjKXt0aGlzLmluaXQoYyxhLGIpO3RoaXMu aW5pdEZyYW1lKCl9fTtFeHQuZGQuRERQcm94eS5kcmFnRWxJZD0ieWdkZGZkaXYi O0V4dC5leHRlbmQoRXh0LmRkLkREUHJveHksRXh0LmRkLkRELHtyZXNpemVGcmFt ZTp0cnVlLGNlbnRlckZyYW1lOmZhbHNlLGNyZWF0ZUZyYW1lOmZ1bmN0aW9uKCl7 dmFyIGI9dGhpczt2YXIgYT1kb2N1bWVudC5ib2R5O2lmKCFhfHwhYS5maXJzdENo aWxkKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5jcmVhdGVGcmFtZSgpfSw1MCk7 cmV0dXJufXZhciBkPXRoaXMuZ2V0RHJhZ0VsKCk7aWYoIWQpe2Q9ZG9jdW1lbnQu Y3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5pZD10aGlzLmRyYWdFbElkO3ZhciBjPWQu c3R5bGU7Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2MudmlzaWJpbGl0eT0iaGlkZGVu IjtjLmN1cnNvcj0ibW92ZSI7Yy5ib3JkZXI9IjJweCBzb2xpZCAjYWFhIjtjLnpJ bmRleD05OTk7YS5pbnNlcnRCZWZvcmUoZCxhLmZpcnN0Q2hpbGQpfX0saW5pdEZy YW1lOmZ1bmN0aW9uKCl7dGhpcy5jcmVhdGVGcmFtZSgpfSxhcHBseUNvbmZpZzpm dW5jdGlvbigpe0V4dC5kZC5ERFByb3h5LnN1cGVyY2xhc3MuYXBwbHlDb25maWcu Y2FsbCh0aGlzKTt0aGlzLnJlc2l6ZUZyYW1lPSh0aGlzLmNvbmZpZy5yZXNpemVG cmFtZSE9PWZhbHNlKTt0aGlzLmNlbnRlckZyYW1lPSh0aGlzLmNvbmZpZy5jZW50 ZXJGcmFtZSk7dGhpcy5zZXREcmFnRWxJZCh0aGlzLmNvbmZpZy5kcmFnRWxJZHx8 RXh0LmRkLkREUHJveHkuZHJhZ0VsSWQpfSxzaG93RnJhbWU6ZnVuY3Rpb24oZSxk KXt2YXIgYz10aGlzLmdldEVsKCk7dmFyIGE9dGhpcy5nZXREcmFnRWwoKTt2YXIg Yj1hLnN0eWxlO3RoaXMuX3Jlc2l6ZVByb3h5KCk7aWYodGhpcy5jZW50ZXJGcmFt ZSl7dGhpcy5zZXREZWx0YShNYXRoLnJvdW5kKHBhcnNlSW50KGIud2lkdGgsMTAp LzIpLE1hdGgucm91bmQocGFyc2VJbnQoYi5oZWlnaHQsMTApLzIpKX10aGlzLnNl dERyYWdFbFBvcyhlLGQpO0V4dC5mbHkoYSkuc2hvdygpfSxfcmVzaXplUHJveHk6 ZnVuY3Rpb24oKXtpZih0aGlzLnJlc2l6ZUZyYW1lKXt2YXIgYT10aGlzLmdldEVs KCk7RXh0LmZseSh0aGlzLmdldERyYWdFbCgpKS5zZXRTaXplKGEub2Zmc2V0V2lk dGgsYS5vZmZzZXRIZWlnaHQpfX0sYjRNb3VzZURvd246ZnVuY3Rpb24oYil7dmFy IGE9Yi5nZXRQYWdlWCgpO3ZhciBjPWIuZ2V0UGFnZVkoKTt0aGlzLmF1dG9PZmZz ZXQoYSxjKTt0aGlzLnNldERyYWdFbFBvcyhhLGMpfSxiNFN0YXJ0RHJhZzpmdW5j dGlvbihhLGIpe3RoaXMuc2hvd0ZyYW1lKGEsYil9LGI0RW5kRHJhZzpmdW5jdGlv bihhKXtFeHQuZmx5KHRoaXMuZ2V0RHJhZ0VsKCkpLmhpZGUoKX0sZW5kRHJhZzpm dW5jdGlvbihjKXt2YXIgYj10aGlzLmdldEVsKCk7dmFyIGE9dGhpcy5nZXREcmFn RWwoKTthLnN0eWxlLnZpc2liaWxpdHk9IiI7dGhpcy5iZWZvcmVNb3ZlKCk7Yi5z dHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO0V4dC5kZC5ERE0ubW92ZVRvRWwoYixh KTthLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiI7Yi5zdHlsZS52aXNpYmlsaXR5 PSIiO3RoaXMuYWZ0ZXJEcmFnKCl9LGJlZm9yZU1vdmU6ZnVuY3Rpb24oKXt9LGFm dGVyRHJhZzpmdW5jdGlvbigpe30sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4o IkREUHJveHkgIit0aGlzLmlkKX19KTtFeHQuZGQuRERUYXJnZXQ9ZnVuY3Rpb24o YyxhLGIpe2lmKGMpe3RoaXMuaW5pdFRhcmdldChjLGEsYil9fTtFeHQuZXh0ZW5k KEV4dC5kZC5ERFRhcmdldCxFeHQuZGQuRHJhZ0Ryb3Ase2dldERyYWdFbDpFeHQu ZW1wdHlGbixpc1ZhbGlkSGFuZGxlQ2hpbGQ6RXh0LmVtcHR5Rm4sc3RhcnREcmFn OkV4dC5lbXB0eUZuLGVuZERyYWc6RXh0LmVtcHR5Rm4sb25EcmFnOkV4dC5lbXB0 eUZuLG9uRHJhZ0Ryb3A6RXh0LmVtcHR5Rm4sb25EcmFnRW50ZXI6RXh0LmVtcHR5 Rm4sb25EcmFnT3V0OkV4dC5lbXB0eUZuLG9uRHJhZ092ZXI6RXh0LmVtcHR5Rm4s b25JbnZhbGlkRHJvcDpFeHQuZW1wdHlGbixvbk1vdXNlRG93bjpFeHQuZW1wdHlG bixvbk1vdXNlVXA6RXh0LmVtcHR5Rm4sc2V0WENvbnN0cmFpbnQ6RXh0LmVtcHR5 Rm4sc2V0WUNvbnN0cmFpbnQ6RXh0LmVtcHR5Rm4scmVzZXRDb25zdHJhaW50czpF eHQuZW1wdHlGbixjbGVhckNvbnN0cmFpbnRzOkV4dC5lbXB0eUZuLGNsZWFyVGlj a3M6RXh0LmVtcHR5Rm4sc2V0SW5pdFBvc2l0aW9uOkV4dC5lbXB0eUZuLHNldERy YWdFbElkOkV4dC5lbXB0eUZuLHNldEhhbmRsZUVsSWQ6RXh0LmVtcHR5Rm4sc2V0 T3V0ZXJIYW5kbGVFbElkOkV4dC5lbXB0eUZuLGFkZEludmFsaWRIYW5kbGVDbGFz czpFeHQuZW1wdHlGbixhZGRJbnZhbGlkSGFuZGxlSWQ6RXh0LmVtcHR5Rm4sYWRk SW52YWxpZEhhbmRsZVR5cGU6RXh0LmVtcHR5Rm4scmVtb3ZlSW52YWxpZEhhbmRs ZUNsYXNzOkV4dC5lbXB0eUZuLHJlbW92ZUludmFsaWRIYW5kbGVJZDpFeHQuZW1w dHlGbixyZW1vdmVJbnZhbGlkSGFuZGxlVHlwZTpFeHQuZW1wdHlGbix0b1N0cmlu ZzpmdW5jdGlvbigpe3JldHVybigiRERUYXJnZXQgIit0aGlzLmlkKX19KTtFeHQu ZGQuRHJhZ1RyYWNrZXI9RXh0LmV4dGVuZChFeHQudXRpbC5PYnNlcnZhYmxlLHth Y3RpdmU6ZmFsc2UsdG9sZXJhbmNlOjUsYXV0b1N0YXJ0OmZhbHNlLGNvbnN0cnVj dG9yOmZ1bmN0aW9uKGEpe0V4dC5hcHBseSh0aGlzLGEpO3RoaXMuYWRkRXZlbnRz KCJtb3VzZWRvd24iLCJtb3VzZXVwIiwibW91c2Vtb3ZlIiwiZHJhZ3N0YXJ0Iiwi ZHJhZ2VuZCIsImRyYWciKTt0aGlzLmRyYWdSZWdpb249bmV3IEV4dC5saWIuUmVn aW9uKDAsMCwwLDApO2lmKHRoaXMuZWwpe3RoaXMuaW5pdEVsKHRoaXMuZWwpfUV4 dC5kZC5EcmFnVHJhY2tlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhp cyxhKX0saW5pdEVsOmZ1bmN0aW9uKGEpe3RoaXMuZWw9RXh0LmdldChhKTthLm9u KCJtb3VzZWRvd24iLHRoaXMub25Nb3VzZURvd24sdGhpcyx0aGlzLmRlbGVnYXRl P3tkZWxlZ2F0ZTp0aGlzLmRlbGVnYXRlfTp1bmRlZmluZWQpfSxkZXN0cm95OmZ1 bmN0aW9uKCl7dGhpcy5lbC51bigibW91c2Vkb3duIix0aGlzLm9uTW91c2VEb3du LHRoaXMpO2RlbGV0ZSB0aGlzLmVsfSxvbk1vdXNlRG93bjpmdW5jdGlvbihiLGEp e2lmKHRoaXMuZmlyZUV2ZW50KCJtb3VzZWRvd24iLHRoaXMsYikhPT1mYWxzZSYm dGhpcy5vbkJlZm9yZVN0YXJ0KGIpIT09ZmFsc2Upe3RoaXMuc3RhcnRYWT10aGlz Lmxhc3RYWT1iLmdldFhZKCk7dGhpcy5kcmFnVGFyZ2V0PXRoaXMuZGVsZWdhdGU/ YTp0aGlzLmVsLmRvbTtpZih0aGlzLnByZXZlbnREZWZhdWx0IT09ZmFsc2Upe2Iu cHJldmVudERlZmF1bHQoKX1FeHQuZ2V0RG9jKCkub24oe3Njb3BlOnRoaXMsbW91 c2V1cDp0aGlzLm9uTW91c2VVcCxtb3VzZW1vdmU6dGhpcy5vbk1vdXNlTW92ZSxz ZWxlY3RzdGFydDp0aGlzLnN0b3BTZWxlY3R9KTtpZih0aGlzLmF1dG9TdGFydCl7 dGhpcy50aW1lcj10aGlzLnRyaWdnZXJTdGFydC5kZWZlcih0aGlzLmF1dG9TdGFy dD09PXRydWU/MTAwMDp0aGlzLmF1dG9TdGFydCx0aGlzLFtiXSl9fX0sb25Nb3Vz ZU1vdmU6ZnVuY3Rpb24oZCxjKXtpZih0aGlzLmFjdGl2ZSYmRXh0LmlzSUUmJiFk LmJyb3dzZXJFdmVudC5idXR0b24pe2QucHJldmVudERlZmF1bHQoKTt0aGlzLm9u TW91c2VVcChkKTtyZXR1cm59ZC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBiPWQuZ2V0 WFkoKSxhPXRoaXMuc3RhcnRYWTt0aGlzLmxhc3RYWT1iO2lmKCF0aGlzLmFjdGl2 ZSl7aWYoTWF0aC5hYnMoYVswXS1iWzBdKT50aGlzLnRvbGVyYW5jZXx8TWF0aC5h YnMoYVsxXS1iWzFdKT50aGlzLnRvbGVyYW5jZSl7dGhpcy50cmlnZ2VyU3RhcnQo ZCl9ZWxzZXtyZXR1cm59fXRoaXMuZmlyZUV2ZW50KCJtb3VzZW1vdmUiLHRoaXMs ZCk7dGhpcy5vbkRyYWcoZCk7dGhpcy5maXJlRXZlbnQoImRyYWciLHRoaXMsZCl9 LG9uTW91c2VVcDpmdW5jdGlvbihjKXt2YXIgYj1FeHQuZ2V0RG9jKCksYT10aGlz LmFjdGl2ZTtiLnVuKCJtb3VzZW1vdmUiLHRoaXMub25Nb3VzZU1vdmUsdGhpcyk7 Yi51bigibW91c2V1cCIsdGhpcy5vbk1vdXNlVXAsdGhpcyk7Yi51bigic2VsZWN0 c3RhcnQiLHRoaXMuc3RvcFNlbGVjdCx0aGlzKTtjLnByZXZlbnREZWZhdWx0KCk7 dGhpcy5jbGVhclN0YXJ0KCk7dGhpcy5hY3RpdmU9ZmFsc2U7ZGVsZXRlIHRoaXMu ZWxSZWdpb247dGhpcy5maXJlRXZlbnQoIm1vdXNldXAiLHRoaXMsYyk7aWYoYSl7 dGhpcy5vbkVuZChjKTt0aGlzLmZpcmVFdmVudCgiZHJhZ2VuZCIsdGhpcyxjKX19 LHRyaWdnZXJTdGFydDpmdW5jdGlvbihhKXt0aGlzLmNsZWFyU3RhcnQoKTt0aGlz LmFjdGl2ZT10cnVlO3RoaXMub25TdGFydChhKTt0aGlzLmZpcmVFdmVudCgiZHJh Z3N0YXJ0Iix0aGlzLGEpfSxjbGVhclN0YXJ0OmZ1bmN0aW9uKCl7aWYodGhpcy50 aW1lcil7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO2RlbGV0ZSB0aGlzLnRpbWVy fX0sc3RvcFNlbGVjdDpmdW5jdGlvbihhKXthLnN0b3BFdmVudCgpO3JldHVybiBm YWxzZX0sb25CZWZvcmVTdGFydDpmdW5jdGlvbihhKXt9LG9uU3RhcnQ6ZnVuY3Rp b24oYSl7fSxvbkRyYWc6ZnVuY3Rpb24oYSl7fSxvbkVuZDpmdW5jdGlvbihhKXt9 LGdldERyYWdUYXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kcmFnVGFyZ2V0 fSxnZXREcmFnQ3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbH0sZ2V0WFk6ZnVu Y3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5jb25zdHJhaW5Nb2Rlc1thXS5jYWxsKHRo aXMsdGhpcy5sYXN0WFkpOnRoaXMubGFzdFhZfSxnZXRPZmZzZXQ6ZnVuY3Rpb24o Yyl7dmFyIGI9dGhpcy5nZXRYWShjKSxhPXRoaXMuc3RhcnRYWTtyZXR1cm5bYVsw XS1iWzBdLGFbMV0tYlsxXV19LGNvbnN0cmFpbk1vZGVzOntwb2ludDpmdW5jdGlv bihiKXtpZighdGhpcy5lbFJlZ2lvbil7dGhpcy5lbFJlZ2lvbj10aGlzLmdldERy YWdDdCgpLmdldFJlZ2lvbigpfXZhciBhPXRoaXMuZHJhZ1JlZ2lvbjthLmxlZnQ9 YlswXTthLnRvcD1iWzFdO2EucmlnaHQ9YlswXTthLmJvdHRvbT1iWzFdO2EuY29u c3RyYWluVG8odGhpcy5lbFJlZ2lvbik7cmV0dXJuW2EubGVmdCxhLnRvcF19fX0p O0V4dC5kZC5TY3JvbGxNYW5hZ2VyPWZ1bmN0aW9uKCl7dmFyIGM9RXh0LmRkLkRy YWdEcm9wTWdyO3ZhciBlPXt9O3ZhciBiPW51bGw7dmFyIGk9e307dmFyIGg9ZnVu Y3Rpb24obCl7Yj1udWxsO2EoKX07dmFyIGo9ZnVuY3Rpb24oKXtpZihjLmRyYWdD dXJyZW50KXtjLnJlZnJlc2hDYWNoZShjLmRyYWdDdXJyZW50Lmdyb3Vwcyl9fTt2 YXIgZD1mdW5jdGlvbigpe2lmKGMuZHJhZ0N1cnJlbnQpe3ZhciBsPUV4dC5kZC5T Y3JvbGxNYW5hZ2VyO3ZhciBtPWkuZWwuZGRTY3JvbGxDb25maWc/aS5lbC5kZFNj cm9sbENvbmZpZy5pbmNyZW1lbnQ6bC5pbmNyZW1lbnQ7aWYoIWwuYW5pbWF0ZSl7 aWYoaS5lbC5zY3JvbGwoaS5kaXIsbSkpe2ooKX19ZWxzZXtpLmVsLnNjcm9sbChp LmRpcixtLHRydWUsbC5hbmltRHVyYXRpb24sail9fX07dmFyIGE9ZnVuY3Rpb24o KXtpZihpLmlkKXtjbGVhckludGVydmFsKGkuaWQpfWkuaWQ9MDtpLmVsPW51bGw7 aS5kaXI9IiJ9O3ZhciBnPWZ1bmN0aW9uKG0sbCl7YSgpO2kuZWw9bTtpLmRpcj1s O3ZhciBvPW0uZGRTY3JvbGxDb25maWc/bS5kZFNjcm9sbENvbmZpZy5kZEdyb3Vw OnVuZGVmaW5lZCxuPShtLmRkU2Nyb2xsQ29uZmlnJiZtLmRkU2Nyb2xsQ29uZmln LmZyZXF1ZW5jeSk/bS5kZFNjcm9sbENvbmZpZy5mcmVxdWVuY3k6RXh0LmRkLlNj cm9sbE1hbmFnZXIuZnJlcXVlbmN5O2lmKG89PT11bmRlZmluZWR8fGMuZHJhZ0N1 cnJlbnQuZGRHcm91cD09byl7aS5pZD1zZXRJbnRlcnZhbChkLG4pfX07dmFyIGs9 ZnVuY3Rpb24obyxxKXtpZihxfHwhYy5kcmFnQ3VycmVudCl7cmV0dXJufXZhciBz PUV4dC5kZC5TY3JvbGxNYW5hZ2VyO2lmKCFifHxiIT1jLmRyYWdDdXJyZW50KXti PWMuZHJhZ0N1cnJlbnQ7cy5yZWZyZXNoQ2FjaGUoKX12YXIgdD1FeHQubGliLkV2 ZW50LmdldFhZKG8pO3ZhciB1PW5ldyBFeHQubGliLlBvaW50KHRbMF0sdFsxXSk7 Zm9yKHZhciBtIGluIGUpe3ZhciBuPWVbbV0sbD1uLl9yZWdpb247dmFyIHA9bi5k ZFNjcm9sbENvbmZpZz9uLmRkU2Nyb2xsQ29uZmlnOnM7aWYobCYmbC5jb250YWlu cyh1KSYmbi5pc1Njcm9sbGFibGUoKSl7aWYobC5ib3R0b20tdS55PD1wLnZ0aHJl c2gpe2lmKGkuZWwhPW4pe2cobiwiZG93biIpfXJldHVybn1lbHNle2lmKGwucmln aHQtdS54PD1wLmh0aHJlc2gpe2lmKGkuZWwhPW4pe2cobiwibGVmdCIpfXJldHVy bn1lbHNle2lmKHUueS1sLnRvcDw9cC52dGhyZXNoKXtpZihpLmVsIT1uKXtnKG4s InVwIil9cmV0dXJufWVsc2V7aWYodS54LWwubGVmdDw9cC5odGhyZXNoKXtpZihp LmVsIT1uKXtnKG4sInJpZ2h0Iil9cmV0dXJufX19fX19YSgpfTtjLmZpcmVFdmVu dHM9Yy5maXJlRXZlbnRzLmNyZWF0ZVNlcXVlbmNlKGssYyk7Yy5zdG9wRHJhZz1j LnN0b3BEcmFnLmNyZWF0ZVNlcXVlbmNlKGgsYyk7cmV0dXJue3JlZ2lzdGVyOmZ1 bmN0aW9uKG4pe2lmKEV4dC5pc0FycmF5KG4pKXtmb3IodmFyIG09MCxsPW4ubGVu Z3RoO208bDttKyspe3RoaXMucmVnaXN0ZXIoblttXSl9fWVsc2V7bj1FeHQuZ2V0 KG4pO2Vbbi5pZF09bn19LHVucmVnaXN0ZXI6ZnVuY3Rpb24obil7aWYoRXh0Lmlz QXJyYXkobikpe2Zvcih2YXIgbT0wLGw9bi5sZW5ndGg7bTxsO20rKyl7dGhpcy51 bnJlZ2lzdGVyKG5bbV0pfX1lbHNle249RXh0LmdldChuKTtkZWxldGUgZVtuLmlk XX19LHZ0aHJlc2g6MjUsaHRocmVzaDoyNSxpbmNyZW1lbnQ6MTAwLGZyZXF1ZW5j eTo1MDAsYW5pbWF0ZTp0cnVlLGFuaW1EdXJhdGlvbjowLjQsZGRHcm91cDp1bmRl ZmluZWQscmVmcmVzaENhY2hlOmZ1bmN0aW9uKCl7Zm9yKHZhciBsIGluIGUpe2lm KHR5cGVvZiBlW2xdPT0ib2JqZWN0Iil7ZVtsXS5fcmVnaW9uPWVbbF0uZ2V0UmVn aW9uKCl9fX19fSgpO0V4dC5kZC5SZWdpc3RyeT1mdW5jdGlvbigpe3ZhciBkPXt9 O3ZhciBiPXt9O3ZhciBhPTA7dmFyIGM9ZnVuY3Rpb24oZyxlKXtpZih0eXBlb2Yg Zz09InN0cmluZyIpe3JldHVybiBnfXZhciBoPWcuaWQ7aWYoIWgmJmUhPT1mYWxz ZSl7aD0iZXh0ZGQtIisoKythKTtnLmlkPWh9cmV0dXJuIGh9O3JldHVybntyZWdp c3RlcjpmdW5jdGlvbihqLGspe2s9a3x8e307aWYodHlwZW9mIGo9PSJzdHJpbmci KXtqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGopfWsuZGRlbD1qO2RbYyhqKV09 aztpZihrLmlzSGFuZGxlIT09ZmFsc2Upe2Jbay5kZGVsLmlkXT1rfWlmKGsuaGFu ZGxlcyl7dmFyIGg9ay5oYW5kbGVzO2Zvcih2YXIgZz0wLGU9aC5sZW5ndGg7Zzxl O2crKyl7YltjKGhbZ10pXT1rfX19LHVucmVnaXN0ZXI6ZnVuY3Rpb24oail7dmFy IGw9YyhqLGZhbHNlKTt2YXIgaz1kW2xdO2lmKGspe2RlbGV0ZSBkW2xdO2lmKGsu aGFuZGxlcyl7dmFyIGg9ay5oYW5kbGVzO2Zvcih2YXIgZz0wLGU9aC5sZW5ndGg7 ZzxlO2crKyl7ZGVsZXRlIGJbYyhoW2ddLGZhbHNlKV19fX19LGdldEhhbmRsZTpm dW5jdGlvbihlKXtpZih0eXBlb2YgZSE9InN0cmluZyIpe2U9ZS5pZH1yZXR1cm4g YltlXX0sZ2V0SGFuZGxlRnJvbUV2ZW50OmZ1bmN0aW9uKGgpe3ZhciBnPUV4dC5s aWIuRXZlbnQuZ2V0VGFyZ2V0KGgpO3JldHVybiBnP2JbZy5pZF06bnVsbH0sZ2V0 VGFyZ2V0OmZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlIT0ic3RyaW5nIil7ZT1lLmlk fXJldHVybiBkW2VdfSxnZXRUYXJnZXRGcm9tRXZlbnQ6ZnVuY3Rpb24oaCl7dmFy IGc9RXh0LmxpYi5FdmVudC5nZXRUYXJnZXQoaCk7cmV0dXJuIGc/ZFtnLmlkXXx8 YltnLmlkXTpudWxsfX19KCk7RXh0LmRkLlN0YXR1c1Byb3h5PWZ1bmN0aW9uKGEp e0V4dC5hcHBseSh0aGlzLGEpO3RoaXMuaWQ9dGhpcy5pZHx8RXh0LmlkKCk7dGhp cy5lbD1uZXcgRXh0LkxheWVyKHtkaDp7aWQ6dGhpcy5pZCx0YWc6ImRpdiIsY2xz OiJ4LWRkLWRyYWctcHJveHkgIit0aGlzLmRyb3BOb3RBbGxvd2VkLGNoaWxkcmVu Olt7dGFnOiJkaXYiLGNsczoieC1kZC1kcm9wLWljb24ifSx7dGFnOiJkaXYiLGNs czoieC1kZC1kcmFnLWdob3N0In1dfSxzaGFkb3c6IWF8fGEuc2hhZG93IT09ZmFs c2V9KTt0aGlzLmdob3N0PUV4dC5nZXQodGhpcy5lbC5kb20uY2hpbGROb2Rlc1sx XSk7dGhpcy5kcm9wU3RhdHVzPXRoaXMuZHJvcE5vdEFsbG93ZWR9O0V4dC5kZC5T dGF0dXNQcm94eS5wcm90b3R5cGU9e2Ryb3BBbGxvd2VkOiJ4LWRkLWRyb3Atb2si LGRyb3BOb3RBbGxvd2VkOiJ4LWRkLWRyb3Atbm9kcm9wIixzZXRTdGF0dXM6ZnVu Y3Rpb24oYSl7YT1hfHx0aGlzLmRyb3BOb3RBbGxvd2VkO2lmKHRoaXMuZHJvcFN0 YXR1cyE9YSl7dGhpcy5lbC5yZXBsYWNlQ2xhc3ModGhpcy5kcm9wU3RhdHVzLGEp O3RoaXMuZHJvcFN0YXR1cz1hfX0scmVzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5lbC5k b20uY2xhc3NOYW1lPSJ4LWRkLWRyYWctcHJveHkgIit0aGlzLmRyb3BOb3RBbGxv d2VkO3RoaXMuZHJvcFN0YXR1cz10aGlzLmRyb3BOb3RBbGxvd2VkO2lmKGEpe3Ro aXMuZ2hvc3QudXBkYXRlKCIiKX19LHVwZGF0ZTpmdW5jdGlvbihhKXtpZih0eXBl b2YgYT09InN0cmluZyIpe3RoaXMuZ2hvc3QudXBkYXRlKGEpfWVsc2V7dGhpcy5n aG9zdC51cGRhdGUoIiIpO2Euc3R5bGUubWFyZ2luPSIwIjt0aGlzLmdob3N0LmRv bS5hcHBlbmRDaGlsZChhKX12YXIgYj10aGlzLmdob3N0LmRvbS5maXJzdENoaWxk O2lmKGIpe0V4dC5mbHkoYikuc2V0U3R5bGUoImZsb2F0Iiwibm9uZSIpfX0sZ2V0 RWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbH0sZ2V0R2hvc3Q6ZnVuY3Rpb24o KXtyZXR1cm4gdGhpcy5naG9zdH0saGlkZTpmdW5jdGlvbihhKXt0aGlzLmVsLmhp ZGUoKTtpZihhKXt0aGlzLnJlc2V0KHRydWUpfX0sc3RvcDpmdW5jdGlvbigpe2lm KHRoaXMuYW5pbSYmdGhpcy5hbmltLmlzQW5pbWF0ZWQmJnRoaXMuYW5pbS5pc0Fu aW1hdGVkKCkpe3RoaXMuYW5pbS5zdG9wKCl9fSxzaG93OmZ1bmN0aW9uKCl7dGhp cy5lbC5zaG93KCl9LHN5bmM6ZnVuY3Rpb24oKXt0aGlzLmVsLnN5bmMoKX0scmVw YWlyOmZ1bmN0aW9uKGIsYyxhKXt0aGlzLmNhbGxiYWNrPWM7dGhpcy5zY29wZT1h O2lmKGImJnRoaXMuYW5pbVJlcGFpciE9PWZhbHNlKXt0aGlzLmVsLmFkZENsYXNz KCJ4LWRkLWRyYWctcmVwYWlyIik7dGhpcy5lbC5oaWRlVW5kZXJzKHRydWUpO3Ro aXMuYW5pbT10aGlzLmVsLnNoaWZ0KHtkdXJhdGlvbjp0aGlzLnJlcGFpckR1cmF0 aW9ufHwwLjUsZWFzaW5nOiJlYXNlT3V0Iix4eTpiLHN0b3BGeDp0cnVlLGNhbGxi YWNrOnRoaXMuYWZ0ZXJSZXBhaXIsc2NvcGU6dGhpc30pfWVsc2V7dGhpcy5hZnRl clJlcGFpcigpfX0sYWZ0ZXJSZXBhaXI6ZnVuY3Rpb24oKXt0aGlzLmhpZGUodHJ1 ZSk7aWYodHlwZW9mIHRoaXMuY2FsbGJhY2s9PSJmdW5jdGlvbiIpe3RoaXMuY2Fs bGJhY2suY2FsbCh0aGlzLnNjb3BlfHx0aGlzKX10aGlzLmNhbGxiYWNrPW51bGw7 dGhpcy5zY29wZT1udWxsfSxkZXN0cm95OmZ1bmN0aW9uKCl7RXh0LmRlc3Ryb3ko dGhpcy5naG9zdCx0aGlzLmVsKX19O0V4dC5kZC5EcmFnU291cmNlPWZ1bmN0aW9u KGIsYSl7dGhpcy5lbD1FeHQuZ2V0KGIpO2lmKCF0aGlzLmRyYWdEYXRhKXt0aGlz LmRyYWdEYXRhPXt9fUV4dC5hcHBseSh0aGlzLGEpO2lmKCF0aGlzLnByb3h5KXt0 aGlzLnByb3h5PW5ldyBFeHQuZGQuU3RhdHVzUHJveHkoKX1FeHQuZGQuRHJhZ1Nv dXJjZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyx0aGlzLmVsLmRv bSx0aGlzLmRkR3JvdXB8fHRoaXMuZ3JvdXAse2RyYWdFbElkOnRoaXMucHJveHku aWQscmVzaXplRnJhbWU6ZmFsc2UsaXNUYXJnZXQ6ZmFsc2Usc2Nyb2xsOnRoaXMu c2Nyb2xsPT09dHJ1ZX0pO3RoaXMuZHJhZ2dpbmc9ZmFsc2V9O0V4dC5leHRlbmQo RXh0LmRkLkRyYWdTb3VyY2UsRXh0LmRkLkREUHJveHkse2Ryb3BBbGxvd2VkOiJ4 LWRkLWRyb3Atb2siLGRyb3BOb3RBbGxvd2VkOiJ4LWRkLWRyb3Atbm9kcm9wIixn ZXREcmFnRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kcmFnRGF0YX0sb25E cmFnRW50ZXI6ZnVuY3Rpb24oYyxkKXt2YXIgYj1FeHQuZGQuRHJhZ0Ryb3BNZ3Iu Z2V0RERCeUlkKGQpO3RoaXMuY2FjaGVkVGFyZ2V0PWI7aWYodGhpcy5iZWZvcmVE cmFnRW50ZXIoYixjLGQpIT09ZmFsc2Upe2lmKGIuaXNOb3RpZnlUYXJnZXQpe3Zh ciBhPWIubm90aWZ5RW50ZXIodGhpcyxjLHRoaXMuZHJhZ0RhdGEpO3RoaXMucHJv eHkuc2V0U3RhdHVzKGEpfWVsc2V7dGhpcy5wcm94eS5zZXRTdGF0dXModGhpcy5k cm9wQWxsb3dlZCl9aWYodGhpcy5hZnRlckRyYWdFbnRlcil7dGhpcy5hZnRlckRy YWdFbnRlcihiLGMsZCl9fX0sYmVmb3JlRHJhZ0VudGVyOmZ1bmN0aW9uKGIsYSxj KXtyZXR1cm4gdHJ1ZX0sYWxpZ25FbFdpdGhNb3VzZTpmdW5jdGlvbigpe0V4dC5k ZC5EcmFnU291cmNlLnN1cGVyY2xhc3MuYWxpZ25FbFdpdGhNb3VzZS5hcHBseSh0 aGlzLGFyZ3VtZW50cyk7dGhpcy5wcm94eS5zeW5jKCl9LG9uRHJhZ092ZXI6ZnVu Y3Rpb24oYyxkKXt2YXIgYj10aGlzLmNhY2hlZFRhcmdldHx8RXh0LmRkLkRyYWdE cm9wTWdyLmdldEREQnlJZChkKTtpZih0aGlzLmJlZm9yZURyYWdPdmVyKGIsYyxk KSE9PWZhbHNlKXtpZihiLmlzTm90aWZ5VGFyZ2V0KXt2YXIgYT1iLm5vdGlmeU92 ZXIodGhpcyxjLHRoaXMuZHJhZ0RhdGEpO3RoaXMucHJveHkuc2V0U3RhdHVzKGEp fWlmKHRoaXMuYWZ0ZXJEcmFnT3Zlcil7dGhpcy5hZnRlckRyYWdPdmVyKGIsYyxk KX19fSxiZWZvcmVEcmFnT3ZlcjpmdW5jdGlvbihiLGEsYyl7cmV0dXJuIHRydWV9 LG9uRHJhZ091dDpmdW5jdGlvbihiLGMpe3ZhciBhPXRoaXMuY2FjaGVkVGFyZ2V0 fHxFeHQuZGQuRHJhZ0Ryb3BNZ3IuZ2V0RERCeUlkKGMpO2lmKHRoaXMuYmVmb3Jl RHJhZ091dChhLGIsYykhPT1mYWxzZSl7aWYoYS5pc05vdGlmeVRhcmdldCl7YS5u b3RpZnlPdXQodGhpcyxiLHRoaXMuZHJhZ0RhdGEpfXRoaXMucHJveHkucmVzZXQo KTtpZih0aGlzLmFmdGVyRHJhZ091dCl7dGhpcy5hZnRlckRyYWdPdXQoYSxiLGMp fX10aGlzLmNhY2hlZFRhcmdldD1udWxsfSxiZWZvcmVEcmFnT3V0OmZ1bmN0aW9u KGIsYSxjKXtyZXR1cm4gdHJ1ZX0sb25EcmFnRHJvcDpmdW5jdGlvbihiLGMpe3Zh ciBhPXRoaXMuY2FjaGVkVGFyZ2V0fHxFeHQuZGQuRHJhZ0Ryb3BNZ3IuZ2V0RERC eUlkKGMpO2lmKHRoaXMuYmVmb3JlRHJhZ0Ryb3AoYSxiLGMpIT09ZmFsc2Upe2lm KGEuaXNOb3RpZnlUYXJnZXQpe2lmKGEubm90aWZ5RHJvcCh0aGlzLGIsdGhpcy5k cmFnRGF0YSkpe3RoaXMub25WYWxpZERyb3AoYSxiLGMpfWVsc2V7dGhpcy5vbklu dmFsaWREcm9wKGEsYixjKX19ZWxzZXt0aGlzLm9uVmFsaWREcm9wKGEsYixjKX1p Zih0aGlzLmFmdGVyRHJhZ0Ryb3Ape3RoaXMuYWZ0ZXJEcmFnRHJvcChhLGIsYyl9 fWRlbGV0ZSB0aGlzLmNhY2hlZFRhcmdldH0sYmVmb3JlRHJhZ0Ryb3A6ZnVuY3Rp b24oYixhLGMpe3JldHVybiB0cnVlfSxvblZhbGlkRHJvcDpmdW5jdGlvbihiLGEs Yyl7dGhpcy5oaWRlUHJveHkoKTtpZih0aGlzLmFmdGVyVmFsaWREcm9wKXt0aGlz LmFmdGVyVmFsaWREcm9wKGIsYSxjKX19LGdldFJlcGFpclhZOmZ1bmN0aW9uKGIs YSl7cmV0dXJuIHRoaXMuZWwuZ2V0WFkoKX0sb25JbnZhbGlkRHJvcDpmdW5jdGlv bihiLGEsYyl7dGhpcy5iZWZvcmVJbnZhbGlkRHJvcChiLGEsYyk7aWYodGhpcy5j YWNoZWRUYXJnZXQpe2lmKHRoaXMuY2FjaGVkVGFyZ2V0LmlzTm90aWZ5VGFyZ2V0 KXt0aGlzLmNhY2hlZFRhcmdldC5ub3RpZnlPdXQodGhpcyxhLHRoaXMuZHJhZ0Rh dGEpfXRoaXMuY2FjaGVUYXJnZXQ9bnVsbH10aGlzLnByb3h5LnJlcGFpcih0aGlz LmdldFJlcGFpclhZKGEsdGhpcy5kcmFnRGF0YSksdGhpcy5hZnRlclJlcGFpcix0 aGlzKTtpZih0aGlzLmFmdGVySW52YWxpZERyb3Ape3RoaXMuYWZ0ZXJJbnZhbGlk RHJvcChhLGMpfX0sYWZ0ZXJSZXBhaXI6ZnVuY3Rpb24oKXtpZihFeHQuZW5hYmxl Rngpe3RoaXMuZWwuaGlnaGxpZ2h0KHRoaXMuaGxDb2xvcnx8ImMzZGFmOSIpfXRo aXMuZHJhZ2dpbmc9ZmFsc2V9LGJlZm9yZUludmFsaWREcm9wOmZ1bmN0aW9uKGIs YSxjKXtyZXR1cm4gdHJ1ZX0saGFuZGxlTW91c2VEb3duOmZ1bmN0aW9uKGIpe2lm KHRoaXMuZHJhZ2dpbmcpe3JldHVybn12YXIgYT10aGlzLmdldERyYWdEYXRhKGIp O2lmKGEmJnRoaXMub25CZWZvcmVEcmFnKGEsYikhPT1mYWxzZSl7dGhpcy5kcmFn RGF0YT1hO3RoaXMucHJveHkuc3RvcCgpO0V4dC5kZC5EcmFnU291cmNlLnN1cGVy Y2xhc3MuaGFuZGxlTW91c2VEb3duLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LG9u QmVmb3JlRHJhZzpmdW5jdGlvbihhLGIpe3JldHVybiB0cnVlfSxvblN0YXJ0RHJh ZzpFeHQuZW1wdHlGbixzdGFydERyYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnByb3h5 LnJlc2V0KCk7dGhpcy5kcmFnZ2luZz10cnVlO3RoaXMucHJveHkudXBkYXRlKCIi KTt0aGlzLm9uSW5pdERyYWcoYSxiKTt0aGlzLnByb3h5LnNob3coKX0sb25Jbml0 RHJhZzpmdW5jdGlvbihhLGMpe3ZhciBiPXRoaXMuZWwuZG9tLmNsb25lTm9kZSh0 cnVlKTtiLmlkPUV4dC5pZCgpO3RoaXMucHJveHkudXBkYXRlKGIpO3RoaXMub25T dGFydERyYWcoYSxjKTtyZXR1cm4gdHJ1ZX0sZ2V0UHJveHk6ZnVuY3Rpb24oKXty ZXR1cm4gdGhpcy5wcm94eX0saGlkZVByb3h5OmZ1bmN0aW9uKCl7dGhpcy5wcm94 eS5oaWRlKCk7dGhpcy5wcm94eS5yZXNldCh0cnVlKTt0aGlzLmRyYWdnaW5nPWZh bHNlfSx0cmlnZ2VyQ2FjaGVSZWZyZXNoOmZ1bmN0aW9uKCl7RXh0LmRkLkRETS5y ZWZyZXNoQ2FjaGUodGhpcy5ncm91cHMpfSxiNEVuZERyYWc6ZnVuY3Rpb24oYSl7 fSxlbmREcmFnOmZ1bmN0aW9uKGEpe3RoaXMub25FbmREcmFnKHRoaXMuZHJhZ0Rh dGEsYSl9LG9uRW5kRHJhZzpmdW5jdGlvbihhLGIpe30sYXV0b09mZnNldDpmdW5j dGlvbihhLGIpe3RoaXMuc2V0RGVsdGEoLTEyLC0yMCl9LGRlc3Ryb3k6ZnVuY3Rp b24oKXtFeHQuZGQuRHJhZ1NvdXJjZS5zdXBlcmNsYXNzLmRlc3Ryb3kuY2FsbCh0 aGlzKTtFeHQuZGVzdHJveSh0aGlzLnByb3h5KX19KTtFeHQuZGQuRHJvcFRhcmdl dD1FeHQuZXh0ZW5kKEV4dC5kZC5ERFRhcmdldCx7Y29uc3RydWN0b3I6ZnVuY3Rp b24oYixhKXt0aGlzLmVsPUV4dC5nZXQoYik7RXh0LmFwcGx5KHRoaXMsYSk7aWYo dGhpcy5jb250YWluZXJTY3JvbGwpe0V4dC5kZC5TY3JvbGxNYW5hZ2VyLnJlZ2lz dGVyKHRoaXMuZWwpfUV4dC5kZC5Ecm9wVGFyZ2V0LnN1cGVyY2xhc3MuY29uc3Ry dWN0b3IuY2FsbCh0aGlzLHRoaXMuZWwuZG9tLHRoaXMuZGRHcm91cHx8dGhpcy5n cm91cCx7aXNUYXJnZXQ6dHJ1ZX0pfSxkcm9wQWxsb3dlZDoieC1kZC1kcm9wLW9r Iixkcm9wTm90QWxsb3dlZDoieC1kZC1kcm9wLW5vZHJvcCIsaXNUYXJnZXQ6dHJ1 ZSxpc05vdGlmeVRhcmdldDp0cnVlLG5vdGlmeUVudGVyOmZ1bmN0aW9uKGEsYyxi KXtpZih0aGlzLm92ZXJDbGFzcyl7dGhpcy5lbC5hZGRDbGFzcyh0aGlzLm92ZXJD bGFzcyl9cmV0dXJuIHRoaXMuZHJvcEFsbG93ZWR9LG5vdGlmeU92ZXI6ZnVuY3Rp b24oYSxjLGIpe3JldHVybiB0aGlzLmRyb3BBbGxvd2VkfSxub3RpZnlPdXQ6ZnVu Y3Rpb24oYSxjLGIpe2lmKHRoaXMub3ZlckNsYXNzKXt0aGlzLmVsLnJlbW92ZUNs YXNzKHRoaXMub3ZlckNsYXNzKX19LG5vdGlmeURyb3A6ZnVuY3Rpb24oYSxjLGIp e3JldHVybiBmYWxzZX0sZGVzdHJveTpmdW5jdGlvbigpe0V4dC5kZC5Ecm9wVGFy Z2V0LnN1cGVyY2xhc3MuZGVzdHJveS5jYWxsKHRoaXMpO2lmKHRoaXMuY29udGFp bmVyU2Nyb2xsKXtFeHQuZGQuU2Nyb2xsTWFuYWdlci51bnJlZ2lzdGVyKHRoaXMu ZWwpfX19KTtFeHQuZGQuRHJhZ1pvbmU9RXh0LmV4dGVuZChFeHQuZGQuRHJhZ1Nv dXJjZSx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYixhKXtFeHQuZGQuRHJhZ1pvbmUu c3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYixhKTtpZih0aGlzLmNv bnRhaW5lclNjcm9sbCl7RXh0LmRkLlNjcm9sbE1hbmFnZXIucmVnaXN0ZXIodGhp cy5lbCl9fSxnZXREcmFnRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gRXh0LmRkLlJl Z2lzdHJ5LmdldEhhbmRsZUZyb21FdmVudChhKX0sb25Jbml0RHJhZzpmdW5jdGlv bihhLGIpe3RoaXMucHJveHkudXBkYXRlKHRoaXMuZHJhZ0RhdGEuZGRlbC5jbG9u ZU5vZGUodHJ1ZSkpO3RoaXMub25TdGFydERyYWcoYSxiKTtyZXR1cm4gdHJ1ZX0s YWZ0ZXJSZXBhaXI6ZnVuY3Rpb24oKXtpZihFeHQuZW5hYmxlRngpe0V4dC5FbGVt ZW50LmZseSh0aGlzLmRyYWdEYXRhLmRkZWwpLmhpZ2hsaWdodCh0aGlzLmhsQ29s b3J8fCJjM2RhZjkiKX10aGlzLmRyYWdnaW5nPWZhbHNlfSxnZXRSZXBhaXJYWTpm dW5jdGlvbihhKXtyZXR1cm4gRXh0LkVsZW1lbnQuZmx5KHRoaXMuZHJhZ0RhdGEu ZGRlbCkuZ2V0WFkoKX0sZGVzdHJveTpmdW5jdGlvbigpe0V4dC5kZC5EcmFnWm9u ZS5zdXBlcmNsYXNzLmRlc3Ryb3kuY2FsbCh0aGlzKTtpZih0aGlzLmNvbnRhaW5l clNjcm9sbCl7RXh0LmRkLlNjcm9sbE1hbmFnZXIudW5yZWdpc3Rlcih0aGlzLmVs KX19fSk7RXh0LmRkLkRyb3Bab25lPWZ1bmN0aW9uKGIsYSl7RXh0LmRkLkRyb3Ba b25lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGIsYSl9O0V4dC5l eHRlbmQoRXh0LmRkLkRyb3Bab25lLEV4dC5kZC5Ecm9wVGFyZ2V0LHtnZXRUYXJn ZXRGcm9tRXZlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEV4dC5kZC5SZWdpc3RyeS5n ZXRUYXJnZXRGcm9tRXZlbnQoYSl9LG9uTm9kZUVudGVyOmZ1bmN0aW9uKGQsYSxj LGIpe30sb25Ob2RlT3ZlcjpmdW5jdGlvbihkLGEsYyxiKXtyZXR1cm4gdGhpcy5k cm9wQWxsb3dlZH0sb25Ob2RlT3V0OmZ1bmN0aW9uKGQsYSxjLGIpe30sb25Ob2Rl RHJvcDpmdW5jdGlvbihkLGEsYyxiKXtyZXR1cm4gZmFsc2V9LG9uQ29udGFpbmVy T3ZlcjpmdW5jdGlvbihhLGMsYil7cmV0dXJuIHRoaXMuZHJvcE5vdEFsbG93ZWR9 LG9uQ29udGFpbmVyRHJvcDpmdW5jdGlvbihhLGMsYil7cmV0dXJuIGZhbHNlfSxu b3RpZnlFbnRlcjpmdW5jdGlvbihhLGMsYil7cmV0dXJuIHRoaXMuZHJvcE5vdEFs bG93ZWR9LG5vdGlmeU92ZXI6ZnVuY3Rpb24oYSxjLGIpe3ZhciBkPXRoaXMuZ2V0 VGFyZ2V0RnJvbUV2ZW50KGMpO2lmKCFkKXtpZih0aGlzLmxhc3RPdmVyTm9kZSl7 dGhpcy5vbk5vZGVPdXQodGhpcy5sYXN0T3Zlck5vZGUsYSxjLGIpO3RoaXMubGFz dE92ZXJOb2RlPW51bGx9cmV0dXJuIHRoaXMub25Db250YWluZXJPdmVyKGEsYyxi KX1pZih0aGlzLmxhc3RPdmVyTm9kZSE9ZCl7aWYodGhpcy5sYXN0T3Zlck5vZGUp e3RoaXMub25Ob2RlT3V0KHRoaXMubGFzdE92ZXJOb2RlLGEsYyxiKX10aGlzLm9u Tm9kZUVudGVyKGQsYSxjLGIpO3RoaXMubGFzdE92ZXJOb2RlPWR9cmV0dXJuIHRo aXMub25Ob2RlT3ZlcihkLGEsYyxiKX0sbm90aWZ5T3V0OmZ1bmN0aW9uKGEsYyxi KXtpZih0aGlzLmxhc3RPdmVyTm9kZSl7dGhpcy5vbk5vZGVPdXQodGhpcy5sYXN0 T3Zlck5vZGUsYSxjLGIpO3RoaXMubGFzdE92ZXJOb2RlPW51bGx9fSxub3RpZnlE cm9wOmZ1bmN0aW9uKGEsYyxiKXtpZih0aGlzLmxhc3RPdmVyTm9kZSl7dGhpcy5v bk5vZGVPdXQodGhpcy5sYXN0T3Zlck5vZGUsYSxjLGIpO3RoaXMubGFzdE92ZXJO b2RlPW51bGx9dmFyIGQ9dGhpcy5nZXRUYXJnZXRGcm9tRXZlbnQoYyk7cmV0dXJu IGQ/dGhpcy5vbk5vZGVEcm9wKGQsYSxjLGIpOnRoaXMub25Db250YWluZXJEcm9w KGEsYyxiKX0sdHJpZ2dlckNhY2hlUmVmcmVzaDpmdW5jdGlvbigpe0V4dC5kZC5E RE0ucmVmcmVzaENhY2hlKHRoaXMuZ3JvdXBzKX19KTtFeHQuRWxlbWVudC5hZGRN ZXRob2RzKHtpbml0REQ6ZnVuY3Rpb24oYyxiLGQpe3ZhciBhPW5ldyBFeHQuZGQu REQoRXh0LmlkKHRoaXMuZG9tKSxjLGIpO3JldHVybiBFeHQuYXBwbHkoYSxkKX0s aW5pdEREUHJveHk6ZnVuY3Rpb24oYyxiLGQpe3ZhciBhPW5ldyBFeHQuZGQuRERQ cm94eShFeHQuaWQodGhpcy5kb20pLGMsYik7cmV0dXJuIEV4dC5hcHBseShhLGQp fSxpbml0RERUYXJnZXQ6ZnVuY3Rpb24oYyxiLGQpe3ZhciBhPW5ldyBFeHQuZGQu RERUYXJnZXQoRXh0LmlkKHRoaXMuZG9tKSxjLGIpO3JldHVybiBFeHQuYXBwbHko YSxkKX19KTtFeHQuZGF0YS5BcGk9KGZ1bmN0aW9uKCl7dmFyIGE9e307cmV0dXJu e2FjdGlvbnM6e2NyZWF0ZToiY3JlYXRlIixyZWFkOiJyZWFkIix1cGRhdGU6InVw ZGF0ZSIsZGVzdHJveToiZGVzdHJveSJ9LHJlc3RBY3Rpb25zOntjcmVhdGU6IlBP U1QiLHJlYWQ6IkdFVCIsdXBkYXRlOiJQVVQiLGRlc3Ryb3k6IkRFTEVURSJ9LGlz QWN0aW9uOmZ1bmN0aW9uKGIpe3JldHVybihFeHQuZGF0YS5BcGkuYWN0aW9uc1ti XSk/dHJ1ZTpmYWxzZX0sZ2V0VmVyYjpmdW5jdGlvbihiKXtpZihhW2JdKXtyZXR1 cm4gYVtiXX1mb3IodmFyIGMgaW4gdGhpcy5hY3Rpb25zKXtpZih0aGlzLmFjdGlv bnNbY109PT1iKXthW2JdPWM7YnJlYWt9fXJldHVybihhW2JdIT09dW5kZWZpbmVk KT9hW2JdOm51bGx9LGlzVmFsaWQ6ZnVuY3Rpb24oYil7dmFyIGU9W107dmFyIGQ9 dGhpcy5hY3Rpb25zO2Zvcih2YXIgYyBpbiBiKXtpZighKGMgaW4gZCkpe2UucHVz aChjKX19cmV0dXJuKCFlLmxlbmd0aCk/dHJ1ZTplfSxoYXNVbmlxdWVVcmw6ZnVu Y3Rpb24oYyxnKXt2YXIgYj0oYy5hcGlbZ10pP2MuYXBpW2ddLnVybDpudWxsO3Zh ciBlPXRydWU7Zm9yKHZhciBkIGluIGMuYXBpKXtpZigoZT0oZD09PWcpP3RydWU6 KGMuYXBpW2RdLnVybCE9Yik/dHJ1ZTpmYWxzZSk9PT1mYWxzZSl7YnJlYWt9fXJl dHVybiBlfSxwcmVwYXJlOmZ1bmN0aW9uKGIpe2lmKCFiLmFwaSl7Yi5hcGk9e319 Zm9yKHZhciBkIGluIHRoaXMuYWN0aW9ucyl7dmFyIGM9dGhpcy5hY3Rpb25zW2Rd O2IuYXBpW2NdPWIuYXBpW2NdfHxiLnVybHx8Yi5kaXJlY3RGbjtpZih0eXBlb2Yo Yi5hcGlbY10pPT0ic3RyaW5nIil7Yi5hcGlbY109e3VybDpiLmFwaVtjXSxtZXRo b2Q6KGIucmVzdGZ1bD09PXRydWUpP0V4dC5kYXRhLkFwaS5yZXN0QWN0aW9uc1tj XTp1bmRlZmluZWR9fX19LHJlc3RpZnk6ZnVuY3Rpb24oYil7Yi5yZXN0ZnVsPXRy dWU7Zm9yKHZhciBjIGluIHRoaXMucmVzdEFjdGlvbnMpe2IuYXBpW3RoaXMuYWN0 aW9uc1tjXV0ubWV0aG9kfHwoYi5hcGlbdGhpcy5hY3Rpb25zW2NdXS5tZXRob2Q9 dGhpcy5yZXN0QWN0aW9uc1tjXSl9Yi5vbldyaXRlPWIub25Xcml0ZS5jcmVhdGVJ bnRlcmNlcHRvcihmdW5jdGlvbihpLGosZyxlKXt2YXIgZD1qLnJlYWRlcjt2YXIg aD1uZXcgRXh0LmRhdGEuUmVzcG9uc2Uoe2FjdGlvbjppLHJhdzpnfSk7c3dpdGNo KGcuc3RhdHVzKXtjYXNlIDIwMDpyZXR1cm4gdHJ1ZTticmVhaztjYXNlIDIwMTpp ZihFeHQuaXNFbXB0eShoLnJhdy5yZXNwb25zZVRleHQpKXtoLnN1Y2Nlc3M9dHJ1 ZX1lbHNle3JldHVybiB0cnVlfWJyZWFrO2Nhc2UgMjA0Omguc3VjY2Vzcz10cnVl O2guZGF0YT1udWxsO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIHRydWU7YnJlYWt9aWYo aC5zdWNjZXNzPT09dHJ1ZSl7dGhpcy5maXJlRXZlbnQoIndyaXRlIix0aGlzLGks aC5kYXRhLGgsZSxqLnJlcXVlc3QuYXJnKX1lbHNle3RoaXMuZmlyZUV2ZW50KCJl eGNlcHRpb24iLHRoaXMsInJlbW90ZSIsaSxqLGgsZSl9ai5yZXF1ZXN0LmNhbGxi YWNrLmNhbGwoai5yZXF1ZXN0LnNjb3BlLGguZGF0YSxoLGguc3VjY2Vzcyk7cmV0 dXJuIGZhbHNlfSxiKX19fSkoKTtFeHQuZGF0YS5SZXNwb25zZT1mdW5jdGlvbihi LGEpe0V4dC5hcHBseSh0aGlzLGIse3JhdzphfSl9O0V4dC5kYXRhLlJlc3BvbnNl LnByb3RvdHlwZT17bWVzc2FnZTpudWxsLHN1Y2Nlc3M6ZmFsc2Usc3RhdHVzOm51 bGwscm9vdDpudWxsLHJhdzpudWxsLGdldE1lc3NhZ2U6ZnVuY3Rpb24oKXtyZXR1 cm4gdGhpcy5tZXNzYWdlfSxnZXRTdWNjZXNzOmZ1bmN0aW9uKCl7cmV0dXJuIHRo aXMuc3VjY2Vzc30sZ2V0U3RhdHVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3Rh dHVzfSxnZXRSb290OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm9vdH0sZ2V0UmF3 UmVzcG9uc2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYXd9fTtFeHQuZGF0YS5B cGkuRXJyb3I9RXh0LmV4dGVuZChFeHQuRXJyb3Ise2NvbnN0cnVjdG9yOmZ1bmN0 aW9uKGIsYSl7dGhpcy5hcmc9YTtFeHQuRXJyb3IuY2FsbCh0aGlzLGIpfSxuYW1l OiJFeHQuZGF0YS5BcGkifSk7RXh0LmFwcGx5KEV4dC5kYXRhLkFwaS5FcnJvci5w cm90b3R5cGUse2xhbmc6eyJhY3Rpb24tdXJsLXVuZGVmaW5lZCI6Ik5vIGZhbGxi YWNrIHVybCBkZWZpbmVkIGZvciB0aGlzIGFjdGlvbi4gIFdoZW4gZGVmaW5pbmcg YSBEYXRhUHJveHkgYXBpLCBwbGVhc2UgYmUgc3VyZSB0byBkZWZpbmUgYW4gdXJs IGZvciBlYWNoIENSVUQgYWN0aW9uIGluIEV4dC5kYXRhLkFwaS5hY3Rpb25zIG9y IGRlZmluZSBhIGRlZmF1bHQgdXJsIGluIGFkZGl0aW9uIHRvIHlvdXIgYXBpLWNv bmZpZ3VyYXRpb24uIixpbnZhbGlkOiJyZWNlaXZlZCBhbiBpbnZhbGlkIEFQSS1j b25maWd1cmF0aW9uLiAgUGxlYXNlIGVuc3VyZSB5b3VyIHByb3h5IEFQSS1jb25m aWd1cmF0aW9uIGNvbnRhaW5zIG9ubHkgdGhlIGFjdGlvbnMgZGVmaW5lZCBpbiBF eHQuZGF0YS5BcGkuYWN0aW9ucyIsImludmFsaWQtdXJsIjoiSW52YWxpZCB1cmwu ICBQbGVhc2UgcmV2aWV3IHlvdXIgcHJveHkgY29uZmlndXJhdGlvbi4iLGV4ZWN1 dGU6J0F0dGVtcHRlZCB0byBleGVjdXRlIGFuIHVua25vd24gYWN0aW9uLiAgVmFs aWQgQVBJIGFjdGlvbnMgYXJlIGRlZmluZWQgaW4gRXh0LmRhdGEuQXBpLmFjdGlv bnMiJ319KTtFeHQuZGF0YS5Tb3J0VHlwZXM9e25vbmU6ZnVuY3Rpb24oYSl7cmV0 dXJuIGF9LHN0cmlwVGFnc1JFOi88XC8/W14+XSs+L2dpLGFzVGV4dDpmdW5jdGlv bihhKXtyZXR1cm4gU3RyaW5nKGEpLnJlcGxhY2UodGhpcy5zdHJpcFRhZ3NSRSwi Iil9LGFzVUNUZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSkudG9VcHBl ckNhc2UoKS5yZXBsYWNlKHRoaXMuc3RyaXBUYWdzUkUsIiIpfSxhc1VDU3RyaW5n OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSkudG9VcHBlckNhc2UoKX0sYXNE YXRlOmZ1bmN0aW9uKGEpe2lmKCFhKXtyZXR1cm4gMH1pZihFeHQuaXNEYXRlKGEp KXtyZXR1cm4gYS5nZXRUaW1lKCl9cmV0dXJuIERhdGUucGFyc2UoU3RyaW5nKGEp KX0sYXNGbG9hdDpmdW5jdGlvbihhKXt2YXIgYj1wYXJzZUZsb2F0KFN0cmluZyhh KS5yZXBsYWNlKC8sL2csIiIpKTtyZXR1cm4gaXNOYU4oYik/MDpifSxhc0ludDpm dW5jdGlvbihhKXt2YXIgYj1wYXJzZUludChTdHJpbmcoYSkucmVwbGFjZSgvLC9n LCIiKSwxMCk7cmV0dXJuIGlzTmFOKGIpPzA6Yn19O0V4dC5kYXRhLlJlY29yZD1m dW5jdGlvbihhLGIpe3RoaXMuaWQ9KGJ8fGI9PT0wKT9iOkV4dC5kYXRhLlJlY29y ZC5pZCh0aGlzKTt0aGlzLmRhdGE9YXx8e319O0V4dC5kYXRhLlJlY29yZC5jcmVh dGU9ZnVuY3Rpb24oZSl7dmFyIGM9RXh0LmV4dGVuZChFeHQuZGF0YS5SZWNvcmQs e30pO3ZhciBkPWMucHJvdG90eXBlO2QuZmllbGRzPW5ldyBFeHQudXRpbC5NaXhl ZENvbGxlY3Rpb24oZmFsc2UsZnVuY3Rpb24oZyl7cmV0dXJuIGcubmFtZX0pO2Zv cih2YXIgYj0wLGE9ZS5sZW5ndGg7YjxhO2IrKyl7ZC5maWVsZHMuYWRkKG5ldyBF eHQuZGF0YS5GaWVsZChlW2JdKSl9Yy5nZXRGaWVsZD1mdW5jdGlvbihnKXtyZXR1 cm4gZC5maWVsZHMuZ2V0KGcpfTtyZXR1cm4gY307RXh0LmRhdGEuUmVjb3JkLlBS RUZJWD0iZXh0LXJlY29yZCI7RXh0LmRhdGEuUmVjb3JkLkFVVE9fSUQ9MTtFeHQu ZGF0YS5SZWNvcmQuRURJVD0iZWRpdCI7RXh0LmRhdGEuUmVjb3JkLlJFSkVDVD0i cmVqZWN0IjtFeHQuZGF0YS5SZWNvcmQuQ09NTUlUPSJjb21taXQiO0V4dC5kYXRh LlJlY29yZC5pZD1mdW5jdGlvbihhKXthLnBoYW50b209dHJ1ZTtyZXR1cm5bRXh0 LmRhdGEuUmVjb3JkLlBSRUZJWCwiLSIsRXh0LmRhdGEuUmVjb3JkLkFVVE9fSUQr K10uam9pbigiIil9O0V4dC5kYXRhLlJlY29yZC5wcm90b3R5cGU9e2RpcnR5OmZh bHNlLGVkaXRpbmc6ZmFsc2UsZXJyb3I6bnVsbCxtb2RpZmllZDpudWxsLHBoYW50 b206ZmFsc2Usam9pbjpmdW5jdGlvbihhKXt0aGlzLnN0b3JlPWF9LHNldDpmdW5j dGlvbihhLGMpe3ZhciBiPUV4dC5pc1ByaW1pdGl2ZShjKT9TdHJpbmc6RXh0LmVu Y29kZTtpZihiKHRoaXMuZGF0YVthXSk9PWIoYykpe3JldHVybn10aGlzLmRpcnR5 PXRydWU7aWYoIXRoaXMubW9kaWZpZWQpe3RoaXMubW9kaWZpZWQ9e319aWYodGhp cy5tb2RpZmllZFthXT09PXVuZGVmaW5lZCl7dGhpcy5tb2RpZmllZFthXT10aGlz LmRhdGFbYV19dGhpcy5kYXRhW2FdPWM7aWYoIXRoaXMuZWRpdGluZyl7dGhpcy5h ZnRlckVkaXQoKX19LGFmdGVyRWRpdDpmdW5jdGlvbigpe2lmKHRoaXMuc3RvcmUh PXVuZGVmaW5lZCYmdHlwZW9mIHRoaXMuc3RvcmUuYWZ0ZXJFZGl0PT0iZnVuY3Rp b24iKXt0aGlzLnN0b3JlLmFmdGVyRWRpdCh0aGlzKX19LGFmdGVyUmVqZWN0OmZ1 bmN0aW9uKCl7aWYodGhpcy5zdG9yZSl7dGhpcy5zdG9yZS5hZnRlclJlamVjdCh0 aGlzKX19LGFmdGVyQ29tbWl0OmZ1bmN0aW9uKCl7aWYodGhpcy5zdG9yZSl7dGhp cy5zdG9yZS5hZnRlckNvbW1pdCh0aGlzKX19LGdldDpmdW5jdGlvbihhKXtyZXR1 cm4gdGhpcy5kYXRhW2FdfSxiZWdpbkVkaXQ6ZnVuY3Rpb24oKXt0aGlzLmVkaXRp bmc9dHJ1ZTt0aGlzLm1vZGlmaWVkPXRoaXMubW9kaWZpZWR8fHt9fSxjYW5jZWxF ZGl0OmZ1bmN0aW9uKCl7dGhpcy5lZGl0aW5nPWZhbHNlO2RlbGV0ZSB0aGlzLm1v ZGlmaWVkfSxlbmRFZGl0OmZ1bmN0aW9uKCl7dGhpcy5lZGl0aW5nPWZhbHNlO2lm KHRoaXMuZGlydHkpe3RoaXMuYWZ0ZXJFZGl0KCl9fSxyZWplY3Q6ZnVuY3Rpb24o Yil7dmFyIGE9dGhpcy5tb2RpZmllZDtmb3IodmFyIGMgaW4gYSl7aWYodHlwZW9m IGFbY10hPSJmdW5jdGlvbiIpe3RoaXMuZGF0YVtjXT1hW2NdfX10aGlzLmRpcnR5 PWZhbHNlO2RlbGV0ZSB0aGlzLm1vZGlmaWVkO3RoaXMuZWRpdGluZz1mYWxzZTtp ZihiIT09dHJ1ZSl7dGhpcy5hZnRlclJlamVjdCgpfX0sY29tbWl0OmZ1bmN0aW9u KGEpe3RoaXMuZGlydHk9ZmFsc2U7ZGVsZXRlIHRoaXMubW9kaWZpZWQ7dGhpcy5l ZGl0aW5nPWZhbHNlO2lmKGEhPT10cnVlKXt0aGlzLmFmdGVyQ29tbWl0KCl9fSxn ZXRDaGFuZ2VzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tb2RpZmllZCxiPXt9O2Zv cih2YXIgYyBpbiBhKXtpZihhLmhhc093blByb3BlcnR5KGMpKXtiW2NdPXRoaXMu ZGF0YVtjXX19cmV0dXJuIGJ9LGhhc0Vycm9yOmZ1bmN0aW9uKCl7cmV0dXJuIHRo aXMuZXJyb3IhPT1udWxsfSxjbGVhckVycm9yOmZ1bmN0aW9uKCl7dGhpcy5lcnJv cj1udWxsfSxjb3B5OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1 Y3RvcihFeHQuYXBwbHkoe30sdGhpcy5kYXRhKSxhfHx0aGlzLmlkKX0saXNNb2Rp ZmllZDpmdW5jdGlvbihhKXtyZXR1cm4gISEodGhpcy5tb2RpZmllZCYmdGhpcy5t b2RpZmllZC5oYXNPd25Qcm9wZXJ0eShhKSl9LGlzVmFsaWQ6ZnVuY3Rpb24oKXty ZXR1cm4gdGhpcy5maWVsZHMuZmluZChmdW5jdGlvbihhKXtyZXR1cm4oYS5hbGxv d0JsYW5rPT09ZmFsc2UmJkV4dC5pc0VtcHR5KHRoaXMuZGF0YVthLm5hbWVdKSk/ dHJ1ZTpmYWxzZX0sdGhpcyk/ZmFsc2U6dHJ1ZX0sbWFya0RpcnR5OmZ1bmN0aW9u KCl7dGhpcy5kaXJ0eT10cnVlO2lmKCF0aGlzLm1vZGlmaWVkKXt0aGlzLm1vZGlm aWVkPXt9fXRoaXMuZmllbGRzLmVhY2goZnVuY3Rpb24oYSl7dGhpcy5tb2RpZmll ZFthLm5hbWVdPXRoaXMuZGF0YVthLm5hbWVdfSx0aGlzKX19O0V4dC5TdG9yZU1n cj1FeHQuYXBwbHkobmV3IEV4dC51dGlsLk1peGVkQ29sbGVjdGlvbigpLHtyZWdp c3RlcjpmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGI7KGI9YXJndW1lbnRzW2FdKTth Kyspe3RoaXMuYWRkKGIpfX0sdW5yZWdpc3RlcjpmdW5jdGlvbigpe2Zvcih2YXIg YT0wLGI7KGI9YXJndW1lbnRzW2FdKTthKyspe3RoaXMucmVtb3ZlKHRoaXMubG9v a3VwKGIpKX19LGxvb2t1cDpmdW5jdGlvbihlKXtpZihFeHQuaXNBcnJheShlKSl7 dmFyIGI9WyJmaWVsZDEiXSxkPSFFeHQuaXNBcnJheShlWzBdKTtpZighZCl7Zm9y KHZhciBjPTIsYT1lWzBdLmxlbmd0aDtjPD1hOysrYyl7Yi5wdXNoKCJmaWVsZCIr Yyl9fXJldHVybiBuZXcgRXh0LmRhdGEuQXJyYXlTdG9yZSh7ZmllbGRzOmIsZGF0 YTplLGV4cGFuZERhdGE6ZCxhdXRvRGVzdHJveTp0cnVlLGF1dG9DcmVhdGVkOnRy dWV9KX1yZXR1cm4gRXh0LmlzT2JqZWN0KGUpPyhlLmV2ZW50cz9lOkV4dC5jcmVh dGUoZSwic3RvcmUiKSk6dGhpcy5nZXQoZSl9LGdldEtleTpmdW5jdGlvbihhKXty ZXR1cm4gYS5zdG9yZUlkfX0pO0V4dC5kYXRhLlN0b3JlPUV4dC5leHRlbmQoRXh0 LnV0aWwuT2JzZXJ2YWJsZSx7d3JpdGVyOnVuZGVmaW5lZCxyZW1vdGVTb3J0OmZh bHNlLGF1dG9EZXN0cm95OmZhbHNlLHBydW5lTW9kaWZpZWRSZWNvcmRzOmZhbHNl LGxhc3RPcHRpb25zOm51bGwsYXV0b1NhdmU6dHJ1ZSxiYXRjaDp0cnVlLHJlc3Rm dWw6ZmFsc2UscGFyYW1OYW1lczp1bmRlZmluZWQsZGVmYXVsdFBhcmFtTmFtZXM6 e3N0YXJ0OiJzdGFydCIsbGltaXQ6ImxpbWl0Iixzb3J0OiJzb3J0IixkaXI6ImRp ciJ9LGlzRGVzdHJveWVkOmZhbHNlLGhhc011bHRpU29ydDpmYWxzZSxiYXRjaEtl eToiX2V4dF9iYXRjaF8iLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuZGF0 YT1uZXcgRXh0LnV0aWwuTWl4ZWRDb2xsZWN0aW9uKGZhbHNlKTt0aGlzLmRhdGEu Z2V0S2V5PWZ1bmN0aW9uKGIpe3JldHVybiBiLmlkfTt0aGlzLnJlbW92ZWQ9W107 aWYoYSYmYS5kYXRhKXt0aGlzLmlubGluZURhdGE9YS5kYXRhO2RlbGV0ZSBhLmRh dGF9RXh0LmFwcGx5KHRoaXMsYSk7dGhpcy5iYXNlUGFyYW1zPUV4dC5pc09iamVj dCh0aGlzLmJhc2VQYXJhbXMpP3RoaXMuYmFzZVBhcmFtczp7fTt0aGlzLnBhcmFt TmFtZXM9RXh0LmFwcGx5SWYodGhpcy5wYXJhbU5hbWVzfHx7fSx0aGlzLmRlZmF1 bHRQYXJhbU5hbWVzKTtpZigodGhpcy51cmx8fHRoaXMuYXBpKSYmIXRoaXMucHJv eHkpe3RoaXMucHJveHk9bmV3IEV4dC5kYXRhLkh0dHBQcm94eSh7dXJsOnRoaXMu dXJsLGFwaTp0aGlzLmFwaX0pfWlmKHRoaXMucmVzdGZ1bD09PXRydWUmJnRoaXMu cHJveHkpe3RoaXMuYmF0Y2g9ZmFsc2U7RXh0LmRhdGEuQXBpLnJlc3RpZnkodGhp cy5wcm94eSl9aWYodGhpcy5yZWFkZXIpe2lmKCF0aGlzLnJlY29yZFR5cGUpe3Ro aXMucmVjb3JkVHlwZT10aGlzLnJlYWRlci5yZWNvcmRUeXBlfWlmKHRoaXMucmVh ZGVyLm9uTWV0YUNoYW5nZSl7dGhpcy5yZWFkZXIub25NZXRhQ2hhbmdlPXRoaXMu cmVhZGVyLm9uTWV0YUNoYW5nZS5jcmVhdGVTZXF1ZW5jZSh0aGlzLm9uTWV0YUNo YW5nZSx0aGlzKX1pZih0aGlzLndyaXRlcil7aWYodGhpcy53cml0ZXIgaW5zdGFu Y2VvZiAoRXh0LmRhdGEuRGF0YVdyaXRlcik9PT1mYWxzZSl7dGhpcy53cml0ZXI9 dGhpcy5idWlsZFdyaXRlcih0aGlzLndyaXRlcil9dGhpcy53cml0ZXIubWV0YT10 aGlzLnJlYWRlci5tZXRhO3RoaXMucHJ1bmVNb2RpZmllZFJlY29yZHM9dHJ1ZX19 aWYodGhpcy5yZWNvcmRUeXBlKXt0aGlzLmZpZWxkcz10aGlzLnJlY29yZFR5cGUu cHJvdG90eXBlLmZpZWxkc310aGlzLm1vZGlmaWVkPVtdO3RoaXMuYWRkRXZlbnRz KCJkYXRhY2hhbmdlZCIsIm1ldGFjaGFuZ2UiLCJhZGQiLCJyZW1vdmUiLCJ1cGRh dGUiLCJjbGVhciIsImV4Y2VwdGlvbiIsImJlZm9yZWxvYWQiLCJsb2FkIiwibG9h ZGV4Y2VwdGlvbiIsImJlZm9yZXdyaXRlIiwid3JpdGUiLCJiZWZvcmVzYXZlIiwi c2F2ZSIpO2lmKHRoaXMucHJveHkpe3RoaXMucmVsYXlFdmVudHModGhpcy5wcm94 eSxbImxvYWRleGNlcHRpb24iLCJleGNlcHRpb24iXSl9aWYodGhpcy53cml0ZXIp e3RoaXMub24oe3Njb3BlOnRoaXMsYWRkOnRoaXMuY3JlYXRlUmVjb3JkcyxyZW1v dmU6dGhpcy5kZXN0cm95UmVjb3JkLHVwZGF0ZTp0aGlzLnVwZGF0ZVJlY29yZCxj bGVhcjp0aGlzLm9uQ2xlYXJ9KX10aGlzLnNvcnRUb2dnbGU9e307aWYodGhpcy5z b3J0RmllbGQpe3RoaXMuc2V0RGVmYXVsdFNvcnQodGhpcy5zb3J0RmllbGQsdGhp cy5zb3J0RGlyKX1lbHNle2lmKHRoaXMuc29ydEluZm8pe3RoaXMuc2V0RGVmYXVs dFNvcnQodGhpcy5zb3J0SW5mby5maWVsZCx0aGlzLnNvcnRJbmZvLmRpcmVjdGlv bil9fUV4dC5kYXRhLlN0b3JlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0 aGlzKTtpZih0aGlzLmlkKXt0aGlzLnN0b3JlSWQ9dGhpcy5pZDtkZWxldGUgdGhp cy5pZH1pZih0aGlzLnN0b3JlSWQpe0V4dC5TdG9yZU1nci5yZWdpc3Rlcih0aGlz KX1pZih0aGlzLmlubGluZURhdGEpe3RoaXMubG9hZERhdGEodGhpcy5pbmxpbmVE YXRhKTtkZWxldGUgdGhpcy5pbmxpbmVEYXRhfWVsc2V7aWYodGhpcy5hdXRvTG9h ZCl7dGhpcy5sb2FkLmRlZmVyKDEwLHRoaXMsW3R5cGVvZiB0aGlzLmF1dG9Mb2Fk PT0ib2JqZWN0Ij90aGlzLmF1dG9Mb2FkOnVuZGVmaW5lZF0pfX10aGlzLmJhdGNo Q291bnRlcj0wO3RoaXMuYmF0Y2hlcz17fX0sYnVpbGRXcml0ZXI6ZnVuY3Rpb24o Yil7dmFyIGE9dW5kZWZpbmVkLGM9KGIuZm9ybWF0fHwianNvbiIpLnRvTG93ZXJD YXNlKCk7c3dpdGNoKGMpe2Nhc2UianNvbiI6YT1FeHQuZGF0YS5Kc29uV3JpdGVy O2JyZWFrO2Nhc2UieG1sIjphPUV4dC5kYXRhLlhtbFdyaXRlcjticmVhaztkZWZh dWx0OmE9RXh0LmRhdGEuSnNvbldyaXRlcn1yZXR1cm4gbmV3IGEoYil9LGRlc3Ry b3k6ZnVuY3Rpb24oKXtpZighdGhpcy5pc0Rlc3Ryb3llZCl7aWYodGhpcy5zdG9y ZUlkKXtFeHQuU3RvcmVNZ3IudW5yZWdpc3Rlcih0aGlzKX10aGlzLmNsZWFyRGF0 YSgpO3RoaXMuZGF0YT1udWxsO0V4dC5kZXN0cm95KHRoaXMucHJveHkpO3RoaXMu cmVhZGVyPXRoaXMud3JpdGVyPW51bGw7dGhpcy5wdXJnZUxpc3RlbmVycygpO3Ro aXMuaXNEZXN0cm95ZWQ9dHJ1ZX19LGFkZDpmdW5jdGlvbihjKXt2YXIgZSxhLGIs ZDtjPVtdLmNvbmNhdChjKTtpZihjLmxlbmd0aDwxKXtyZXR1cm59Zm9yKGU9MCxh PWMubGVuZ3RoO2U8YTtlKyspe2I9Y1tlXTtiLmpvaW4odGhpcyk7aWYoYi5kaXJ0 eXx8Yi5waGFudG9tKXt0aGlzLm1vZGlmaWVkLnB1c2goYil9fWQ9dGhpcy5kYXRh Lmxlbmd0aDt0aGlzLmRhdGEuYWRkQWxsKGMpO2lmKHRoaXMuc25hcHNob3Qpe3Ro aXMuc25hcHNob3QuYWRkQWxsKGMpfXRoaXMuZmlyZUV2ZW50KCJhZGQiLHRoaXMs YyxkKX0sYWRkU29ydGVkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZmluZEluc2Vy dEluZGV4KGEpO3RoaXMuaW5zZXJ0KGIsYSl9LGRvVXBkYXRlOmZ1bmN0aW9uKGEp e3ZhciBiPWEuaWQ7dGhpcy5nZXRCeUlkKGIpLmpvaW4obnVsbCk7dGhpcy5kYXRh LnJlcGxhY2UoYixhKTtpZih0aGlzLnNuYXBzaG90KXt0aGlzLnNuYXBzaG90LnJl cGxhY2UoYixhKX1hLmpvaW4odGhpcyk7dGhpcy5maXJlRXZlbnQoInVwZGF0ZSIs dGhpcyxhLEV4dC5kYXRhLlJlY29yZC5DT01NSVQpfSxyZW1vdmU6ZnVuY3Rpb24o YSl7aWYoRXh0LmlzQXJyYXkoYSkpe0V4dC5lYWNoKGEsZnVuY3Rpb24oYyl7dGhp cy5yZW1vdmUoYyl9LHRoaXMpO3JldHVybn12YXIgYj10aGlzLmRhdGEuaW5kZXhP ZihhKTtpZihiPi0xKXthLmpvaW4obnVsbCk7dGhpcy5kYXRhLnJlbW92ZUF0KGIp fWlmKHRoaXMucHJ1bmVNb2RpZmllZFJlY29yZHMpe3RoaXMubW9kaWZpZWQucmVt b3ZlKGEpfWlmKHRoaXMuc25hcHNob3Qpe3RoaXMuc25hcHNob3QucmVtb3ZlKGEp fWlmKGI+LTEpe3RoaXMuZmlyZUV2ZW50KCJyZW1vdmUiLHRoaXMsYSxiKX19LHJl bW92ZUF0OmZ1bmN0aW9uKGEpe3RoaXMucmVtb3ZlKHRoaXMuZ2V0QXQoYSkpfSxy ZW1vdmVBbGw6ZnVuY3Rpb24oYil7dmFyIGE9W107dGhpcy5lYWNoKGZ1bmN0aW9u KGMpe2EucHVzaChjKX0pO3RoaXMuY2xlYXJEYXRhKCk7aWYodGhpcy5zbmFwc2hv dCl7dGhpcy5zbmFwc2hvdC5jbGVhcigpfWlmKHRoaXMucHJ1bmVNb2RpZmllZFJl Y29yZHMpe3RoaXMubW9kaWZpZWQ9W119aWYoYiE9PXRydWUpe3RoaXMuZmlyZUV2 ZW50KCJjbGVhciIsdGhpcyxhKX19LG9uQ2xlYXI6ZnVuY3Rpb24oYixhKXtFeHQu ZWFjaChhLGZ1bmN0aW9uKGQsYyl7dGhpcy5kZXN0cm95UmVjb3JkKHRoaXMsZCxj KX0sdGhpcyl9LGluc2VydDpmdW5jdGlvbihkLGMpe3ZhciBlLGEsYjtjPVtdLmNv bmNhdChjKTtmb3IoZT0wLGE9Yy5sZW5ndGg7ZTxhO2UrKyl7Yj1jW2VdO3RoaXMu ZGF0YS5pbnNlcnQoZCtlLGIpO2Iuam9pbih0aGlzKTtpZihiLmRpcnR5fHxiLnBo YW50b20pe3RoaXMubW9kaWZpZWQucHVzaChiKX19aWYodGhpcy5zbmFwc2hvdCl7 dGhpcy5zbmFwc2hvdC5hZGRBbGwoYyl9dGhpcy5maXJlRXZlbnQoImFkZCIsdGhp cyxjLGQpfSxpbmRleE9mOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuaW5k ZXhPZihhKX0saW5kZXhPZklkOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEu aW5kZXhPZktleShhKX0sZ2V0QnlJZDpmdW5jdGlvbihhKXtyZXR1cm4odGhpcy5z bmFwc2hvdHx8dGhpcy5kYXRhKS5rZXkoYSl9LGdldEF0OmZ1bmN0aW9uKGEpe3Jl dHVybiB0aGlzLmRhdGEuaXRlbUF0KGEpfSxnZXRSYW5nZTpmdW5jdGlvbihiLGEp e3JldHVybiB0aGlzLmRhdGEuZ2V0UmFuZ2UoYixhKX0sc3RvcmVPcHRpb25zOmZ1 bmN0aW9uKGEpe2E9RXh0LmFwcGx5KHt9LGEpO2RlbGV0ZSBhLmNhbGxiYWNrO2Rl bGV0ZSBhLnNjb3BlO3RoaXMubGFzdE9wdGlvbnM9YX0sY2xlYXJEYXRhOmZ1bmN0 aW9uKCl7dGhpcy5kYXRhLmVhY2goZnVuY3Rpb24oYSl7YS5qb2luKG51bGwpfSk7 dGhpcy5kYXRhLmNsZWFyKCl9LGxvYWQ6ZnVuY3Rpb24oYil7Yj1FeHQuYXBwbHko e30sYik7dGhpcy5zdG9yZU9wdGlvbnMoYik7aWYodGhpcy5zb3J0SW5mbyYmdGhp cy5yZW1vdGVTb3J0KXt2YXIgYT10aGlzLnBhcmFtTmFtZXM7Yi5wYXJhbXM9RXh0 LmFwcGx5KHt9LGIucGFyYW1zKTtiLnBhcmFtc1thLnNvcnRdPXRoaXMuc29ydElu Zm8uZmllbGQ7Yi5wYXJhbXNbYS5kaXJdPXRoaXMuc29ydEluZm8uZGlyZWN0aW9u fXRyeXtyZXR1cm4gdGhpcy5leGVjdXRlKCJyZWFkIixudWxsLGIpfWNhdGNoKGMp e3RoaXMuaGFuZGxlRXhjZXB0aW9uKGMpO3JldHVybiBmYWxzZX19LHVwZGF0ZVJl Y29yZDpmdW5jdGlvbihiLGEsYyl7aWYoYz09RXh0LmRhdGEuUmVjb3JkLkVESVQm JnRoaXMuYXV0b1NhdmU9PT10cnVlJiYoIWEucGhhbnRvbXx8KGEucGhhbnRvbSYm YS5pc1ZhbGlkKCkpKSl7dGhpcy5zYXZlKCl9fSxjcmVhdGVSZWNvcmRzOmZ1bmN0 aW9uKGMsYixlKXt2YXIgZD10aGlzLm1vZGlmaWVkLGg9Yi5sZW5ndGgsYSxnO2Zv cihnPTA7ZzxoO2crKyl7YT1iW2ddO2lmKGEucGhhbnRvbSYmYS5pc1ZhbGlkKCkp e2EubWFya0RpcnR5KCk7aWYoZC5pbmRleE9mKGEpPT0tMSl7ZC5wdXNoKGEpfX19 aWYodGhpcy5hdXRvU2F2ZT09PXRydWUpe3RoaXMuc2F2ZSgpfX0sZGVzdHJveVJl Y29yZDpmdW5jdGlvbihiLGEsYyl7aWYodGhpcy5tb2RpZmllZC5pbmRleE9mKGEp IT0tMSl7dGhpcy5tb2RpZmllZC5yZW1vdmUoYSl9aWYoIWEucGhhbnRvbSl7dGhp cy5yZW1vdmVkLnB1c2goYSk7YS5sYXN0SW5kZXg9YztpZih0aGlzLmF1dG9TYXZl PT09dHJ1ZSl7dGhpcy5zYXZlKCl9fX0sZXhlY3V0ZTpmdW5jdGlvbihlLGEsYyxi KXtpZighRXh0LmRhdGEuQXBpLmlzQWN0aW9uKGUpKXt0aHJvdyBuZXcgRXh0LmRh dGEuQXBpLkVycm9yKCJleGVjdXRlIixlKX1jPUV4dC5hcHBseUlmKGN8fHt9LHtw YXJhbXM6e319KTtpZihiIT09dW5kZWZpbmVkKXt0aGlzLmFkZFRvQmF0Y2goYil9 dmFyIGQ9dHJ1ZTtpZihlPT09InJlYWQiKXtkPXRoaXMuZmlyZUV2ZW50KCJiZWZv cmVsb2FkIix0aGlzLGMpO0V4dC5hcHBseUlmKGMucGFyYW1zLHRoaXMuYmFzZVBh cmFtcyl9ZWxzZXtpZih0aGlzLndyaXRlci5saXN0ZnVsPT09dHJ1ZSYmdGhpcy5y ZXN0ZnVsIT09dHJ1ZSl7YT0oRXh0LmlzQXJyYXkoYSkpP2E6W2FdfWVsc2V7aWYo RXh0LmlzQXJyYXkoYSkmJmEubGVuZ3RoPT0xKXthPWEuc2hpZnQoKX19aWYoKGQ9 dGhpcy5maXJlRXZlbnQoImJlZm9yZXdyaXRlIix0aGlzLGUsYSxjKSkhPT1mYWxz ZSl7dGhpcy53cml0ZXIuYXBwbHkoYy5wYXJhbXMsdGhpcy5iYXNlUGFyYW1zLGUs YSl9fWlmKGQhPT1mYWxzZSl7aWYodGhpcy53cml0ZXImJnRoaXMucHJveHkudXJs JiYhdGhpcy5wcm94eS5yZXN0ZnVsJiYhRXh0LmRhdGEuQXBpLmhhc1VuaXF1ZVVy bCh0aGlzLnByb3h5LGUpKXtjLnBhcmFtcy54YWN0aW9uPWV9dGhpcy5wcm94eS5y ZXF1ZXN0KEV4dC5kYXRhLkFwaS5hY3Rpb25zW2VdLGEsYy5wYXJhbXMsdGhpcy5y ZWFkZXIsdGhpcy5jcmVhdGVDYWxsYmFjayhlLGEsYiksdGhpcyxjKX1yZXR1cm4g ZH0sc2F2ZTpmdW5jdGlvbigpe2lmKCF0aGlzLndyaXRlcil7dGhyb3cgbmV3IEV4 dC5kYXRhLlN0b3JlLkVycm9yKCJ3cml0ZXItdW5kZWZpbmVkIil9dmFyIGg9W10s aixrLGUsYz17fSxkO2lmKHRoaXMucmVtb3ZlZC5sZW5ndGgpe2gucHVzaChbImRl c3Ryb3kiLHRoaXMucmVtb3ZlZF0pfXZhciBiPVtdLmNvbmNhdCh0aGlzLmdldE1v ZGlmaWVkUmVjb3JkcygpKTtpZihiLmxlbmd0aCl7dmFyIGc9W107Zm9yKGQ9Yi5s ZW5ndGgtMTtkPj0wO2QtLSl7aWYoYltkXS5waGFudG9tPT09dHJ1ZSl7dmFyIGE9 Yi5zcGxpY2UoZCwxKS5zaGlmdCgpO2lmKGEuaXNWYWxpZCgpKXtnLnB1c2goYSl9 fWVsc2V7aWYoIWJbZF0uaXNWYWxpZCgpKXtiLnNwbGljZShkLDEpfX19aWYoZy5s ZW5ndGgpe2gucHVzaChbImNyZWF0ZSIsZ10pfWlmKGIubGVuZ3RoKXtoLnB1c2go WyJ1cGRhdGUiLGJdKX19aj1oLmxlbmd0aDtpZihqKXtlPSsrdGhpcy5iYXRjaENv dW50ZXI7Zm9yKGQ9MDtkPGo7KytkKXtrPWhbZF07Y1trWzBdXT1rWzFdfWlmKHRo aXMuZmlyZUV2ZW50KCJiZWZvcmVzYXZlIix0aGlzLGMpIT09ZmFsc2Upe2Zvcihk PTA7ZDxqOysrZCl7az1oW2RdO3RoaXMuZG9UcmFuc2FjdGlvbihrWzBdLGtbMV0s ZSl9cmV0dXJuIGV9fXJldHVybiAtMX0sZG9UcmFuc2FjdGlvbjpmdW5jdGlvbihl LGIsYyl7ZnVuY3Rpb24gZyhoKXt0cnl7dGhpcy5leGVjdXRlKGUsaCx1bmRlZmlu ZWQsYyl9Y2F0Y2goaSl7dGhpcy5oYW5kbGVFeGNlcHRpb24oaSl9fWlmKHRoaXMu YmF0Y2g9PT1mYWxzZSl7Zm9yKHZhciBkPTAsYT1iLmxlbmd0aDtkPGE7ZCsrKXtn LmNhbGwodGhpcyxiW2RdKX19ZWxzZXtnLmNhbGwodGhpcyxiKX19LGFkZFRvQmF0 Y2g6ZnVuY3Rpb24oYyl7dmFyIGE9dGhpcy5iYXRjaGVzLGQ9dGhpcy5iYXRjaEtl eStjLGU9YVtkXTtpZighZSl7YVtkXT1lPXtpZDpjLGNvdW50OjAsZGF0YTp7fX19 KytlLmNvdW50fSxyZW1vdmVGcm9tQmF0Y2g6ZnVuY3Rpb24oZCxoLGcpe3ZhciBj PXRoaXMuYmF0Y2hlcyxlPXRoaXMuYmF0Y2hLZXkrZCxpPWNbZV0sYTtpZihpKXth PWkuZGF0YVtoXXx8W107aS5kYXRhW2hdPWEuY29uY2F0KGcpO2lmKGkuY291bnQ9 PT0xKXtnPWkuZGF0YTtkZWxldGUgY1tlXTt0aGlzLmZpcmVFdmVudCgic2F2ZSIs dGhpcyxkLGcpfWVsc2V7LS1pLmNvdW50fX19LGNyZWF0ZUNhbGxiYWNrOmZ1bmN0 aW9uKGMsYSxiKXt2YXIgZD1FeHQuZGF0YS5BcGkuYWN0aW9ucztyZXR1cm4oYz09 InJlYWQiKT90aGlzLmxvYWRSZWNvcmRzOmZ1bmN0aW9uKGcsZSxoKXt0aGlzWyJv biIrRXh0LnV0aWwuRm9ybWF0LmNhcGl0YWxpemUoYykrIlJlY29yZHMiXShoLGEs W10uY29uY2F0KGcpKTtpZihoPT09dHJ1ZSl7dGhpcy5maXJlRXZlbnQoIndyaXRl Iix0aGlzLGMsZyxlLGEpfXRoaXMucmVtb3ZlRnJvbUJhdGNoKGIsYyxnKX19LGNs ZWFyTW9kaWZpZWQ6ZnVuY3Rpb24oYSl7aWYoRXh0LmlzQXJyYXkoYSkpe2Zvcih2 YXIgYj1hLmxlbmd0aC0xO2I+PTA7Yi0tKXt0aGlzLm1vZGlmaWVkLnNwbGljZSh0 aGlzLm1vZGlmaWVkLmluZGV4T2YoYVtiXSksMSl9fWVsc2V7dGhpcy5tb2RpZmll ZC5zcGxpY2UodGhpcy5tb2RpZmllZC5pbmRleE9mKGEpLDEpfX0scmVNYXA6ZnVu Y3Rpb24oYil7aWYoRXh0LmlzQXJyYXkoYikpe2Zvcih2YXIgZD0wLGE9Yi5sZW5n dGg7ZDxhO2QrKyl7dGhpcy5yZU1hcChiW2RdKX19ZWxzZXtkZWxldGUgdGhpcy5k YXRhLm1hcFtiLl9waGlkXTt0aGlzLmRhdGEubWFwW2IuaWRdPWI7dmFyIGM9dGhp cy5kYXRhLmtleXMuaW5kZXhPZihiLl9waGlkKTt0aGlzLmRhdGEua2V5cy5zcGxp Y2UoYywxLGIuaWQpO2RlbGV0ZSBiLl9waGlkfX0sb25DcmVhdGVSZWNvcmRzOmZ1 bmN0aW9uKGQsYSxiKXtpZihkPT09dHJ1ZSl7dHJ5e3RoaXMucmVhZGVyLnJlYWxp emUoYSxiKX1jYXRjaChjKXt0aGlzLmhhbmRsZUV4Y2VwdGlvbihjKTtpZihFeHQu aXNBcnJheShhKSl7dGhpcy5vbkNyZWF0ZVJlY29yZHMoZCxhLGIpfX19fSxvblVw ZGF0ZVJlY29yZHM6ZnVuY3Rpb24oZCxhLGIpe2lmKGQ9PT10cnVlKXt0cnl7dGhp cy5yZWFkZXIudXBkYXRlKGEsYil9Y2F0Y2goYyl7dGhpcy5oYW5kbGVFeGNlcHRp b24oYyk7aWYoRXh0LmlzQXJyYXkoYSkpe3RoaXMub25VcGRhdGVSZWNvcmRzKGQs YSxiKX19fX0sb25EZXN0cm95UmVjb3JkczpmdW5jdGlvbihlLGIsZCl7Yj0oYiBp bnN0YW5jZW9mIEV4dC5kYXRhLlJlY29yZCk/W2JdOltdLmNvbmNhdChiKTtmb3Io dmFyIGM9MCxhPWIubGVuZ3RoO2M8YTtjKyspe3RoaXMucmVtb3ZlZC5zcGxpY2Uo dGhpcy5yZW1vdmVkLmluZGV4T2YoYltjXSksMSl9aWYoZT09PWZhbHNlKXtmb3Io Yz1iLmxlbmd0aC0xO2M+PTA7Yy0tKXt0aGlzLmluc2VydChiW2NdLmxhc3RJbmRl eCxiW2NdKX19fSxoYW5kbGVFeGNlcHRpb246ZnVuY3Rpb24oYSl7RXh0LmhhbmRs ZUVycm9yKGEpfSxyZWxvYWQ6ZnVuY3Rpb24oYSl7dGhpcy5sb2FkKEV4dC5hcHBs eUlmKGF8fHt9LHRoaXMubGFzdE9wdGlvbnMpKX0sbG9hZFJlY29yZHM6ZnVuY3Rp b24oYixsLGgpe3ZhciBlLGc7aWYodGhpcy5pc0Rlc3Ryb3llZD09PXRydWUpe3Jl dHVybn1pZighYnx8aD09PWZhbHNlKXtpZihoIT09ZmFsc2Upe3RoaXMuZmlyZUV2 ZW50KCJsb2FkIix0aGlzLFtdLGwpfWlmKGwuY2FsbGJhY2spe2wuY2FsbGJhY2su Y2FsbChsLnNjb3BlfHx0aGlzLFtdLGwsZmFsc2UsYil9cmV0dXJufXZhciBhPWIu cmVjb3JkcyxqPWIudG90YWxSZWNvcmRzfHxhLmxlbmd0aDtpZighbHx8bC5hZGQh PT10cnVlKXtpZih0aGlzLnBydW5lTW9kaWZpZWRSZWNvcmRzKXt0aGlzLm1vZGlm aWVkPVtdfWZvcihlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKXthW2VdLmpvaW4odGhp cyl9aWYodGhpcy5zbmFwc2hvdCl7dGhpcy5kYXRhPXRoaXMuc25hcHNob3Q7ZGVs ZXRlIHRoaXMuc25hcHNob3R9dGhpcy5jbGVhckRhdGEoKTt0aGlzLmRhdGEuYWRk QWxsKGEpO3RoaXMudG90YWxMZW5ndGg9ajt0aGlzLmFwcGx5U29ydCgpO3RoaXMu ZmlyZUV2ZW50KCJkYXRhY2hhbmdlZCIsdGhpcyl9ZWxzZXt2YXIgaz1bXSxkLGM9 MDtmb3IoZT0wLGc9YS5sZW5ndGg7ZTxnOysrZSl7ZD1hW2VdO2lmKHRoaXMuaW5k ZXhPZklkKGQuaWQpPi0xKXt0aGlzLmRvVXBkYXRlKGQpfWVsc2V7ay5wdXNoKGQp OysrY319dGhpcy50b3RhbExlbmd0aD1NYXRoLm1heChqLHRoaXMuZGF0YS5sZW5n dGgrYyk7dGhpcy5hZGQoayl9dGhpcy5maXJlRXZlbnQoImxvYWQiLHRoaXMsYSxs KTtpZihsLmNhbGxiYWNrKXtsLmNhbGxiYWNrLmNhbGwobC5zY29wZXx8dGhpcyxh LGwsdHJ1ZSl9fSxsb2FkRGF0YTpmdW5jdGlvbihjLGEpe3ZhciBiPXRoaXMucmVh ZGVyLnJlYWRSZWNvcmRzKGMpO3RoaXMubG9hZFJlY29yZHMoYix7YWRkOmF9LHRy dWUpfSxnZXRDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGEubGVuZ3Ro fHwwfSxnZXRUb3RhbENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG90YWxM ZW5ndGh8fDB9LGdldFNvcnRTdGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNv cnRJbmZvfSxhcHBseVNvcnQ6ZnVuY3Rpb24oKXtpZigodGhpcy5zb3J0SW5mb3x8 dGhpcy5tdWx0aVNvcnRJbmZvKSYmIXRoaXMucmVtb3RlU29ydCl7dGhpcy5zb3J0 RGF0YSgpfX0sc29ydERhdGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmhhc011bHRp U29ydD90aGlzLm11bHRpU29ydEluZm86dGhpcy5zb3J0SW5mbyxrPWEuZGlyZWN0 aW9ufHwiQVNDIixoPWEuc29ydGVycyxjPVtdO2lmKCF0aGlzLmhhc011bHRpU29y dCl7aD1be2RpcmVjdGlvbjprLGZpZWxkOmEuZmllbGR9XX1mb3IodmFyIGQ9MCxi PWgubGVuZ3RoO2Q8YjtkKyspe2MucHVzaCh0aGlzLmNyZWF0ZVNvcnRGdW5jdGlv bihoW2RdLmZpZWxkLGhbZF0uZGlyZWN0aW9uKSl9aWYoYy5sZW5ndGg9PTApe3Jl dHVybn12YXIgZz1rLnRvVXBwZXJDYXNlKCk9PSJERVNDIj8tMToxO3ZhciBlPWZ1 bmN0aW9uKG4sbSl7dmFyIGw9Y1swXS5jYWxsKHRoaXMsbixtKTtpZihjLmxlbmd0 aD4xKXtmb3IodmFyIHA9MSxvPWMubGVuZ3RoO3A8bztwKyspe2w9bHx8Y1twXS5j YWxsKHRoaXMsbixtKX19cmV0dXJuIGcqbH07dGhpcy5kYXRhLnNvcnQoayxlKTtp Zih0aGlzLnNuYXBzaG90JiZ0aGlzLnNuYXBzaG90IT10aGlzLmRhdGEpe3RoaXMu c25hcHNob3Quc29ydChrLGUpfX0sY3JlYXRlU29ydEZ1bmN0aW9uOmZ1bmN0aW9u KGMsYil7Yj1ifHwiQVNDIjt2YXIgYT1iLnRvVXBwZXJDYXNlKCk9PSJERVNDIj8t MToxO3ZhciBkPXRoaXMuZmllbGRzLmdldChjKS5zb3J0VHlwZTtyZXR1cm4gZnVu Y3Rpb24oZyxlKXt2YXIgaT1kKGcuZGF0YVtjXSksaD1kKGUuZGF0YVtjXSk7cmV0 dXJuIGEqKGk+aD8xOihpPGg/LTE6MCkpfX0sc2V0RGVmYXVsdFNvcnQ6ZnVuY3Rp b24oYixhKXthPWE/YS50b1VwcGVyQ2FzZSgpOiJBU0MiO3RoaXMuc29ydEluZm89 e2ZpZWxkOmIsZGlyZWN0aW9uOmF9O3RoaXMuc29ydFRvZ2dsZVtiXT1hfSxzb3J0 OmZ1bmN0aW9uKGIsYSl7aWYoRXh0LmlzQXJyYXkoYXJndW1lbnRzWzBdKSl7cmV0 dXJuIHRoaXMubXVsdGlTb3J0LmNhbGwodGhpcyxiLGEpfWVsc2V7cmV0dXJuIHRo aXMuc2luZ2xlU29ydChiLGEpfX0sc2luZ2xlU29ydDpmdW5jdGlvbihnLGMpe3Zh ciBlPXRoaXMuZmllbGRzLmdldChnKTtpZighZSl7cmV0dXJuIGZhbHNlfXZhciBi PWUubmFtZSxhPXRoaXMuc29ydEluZm98fG51bGwsZD10aGlzLnNvcnRUb2dnbGU/ dGhpcy5zb3J0VG9nZ2xlW2JdOm51bGw7aWYoIWMpe2lmKGEmJmEuZmllbGQ9PWIp e2M9KHRoaXMuc29ydFRvZ2dsZVtiXXx8IkFTQyIpLnRvZ2dsZSgiQVNDIiwiREVT QyIpfWVsc2V7Yz1lLnNvcnREaXJ9fXRoaXMuc29ydFRvZ2dsZVtiXT1jO3RoaXMu c29ydEluZm89e2ZpZWxkOmIsZGlyZWN0aW9uOmN9O3RoaXMuaGFzTXVsdGlTb3J0 PWZhbHNlO2lmKHRoaXMucmVtb3RlU29ydCl7aWYoIXRoaXMubG9hZCh0aGlzLmxh c3RPcHRpb25zKSl7aWYoZCl7dGhpcy5zb3J0VG9nZ2xlW2JdPWR9aWYoYSl7dGhp cy5zb3J0SW5mbz1hfX19ZWxzZXt0aGlzLmFwcGx5U29ydCgpO3RoaXMuZmlyZUV2 ZW50KCJkYXRhY2hhbmdlZCIsdGhpcyl9cmV0dXJuIHRydWV9LG11bHRpU29ydDpm dW5jdGlvbihiLGEpe3RoaXMuaGFzTXVsdGlTb3J0PXRydWU7YT1hfHwiQVNDIjtp Zih0aGlzLm11bHRpU29ydEluZm8mJmE9PXRoaXMubXVsdGlTb3J0SW5mby5kaXJl Y3Rpb24pe2E9YS50b2dnbGUoIkFTQyIsIkRFU0MiKX10aGlzLm11bHRpU29ydElu Zm89e3NvcnRlcnM6YixkaXJlY3Rpb246YX07aWYodGhpcy5yZW1vdGVTb3J0KXt0 aGlzLnNpbmdsZVNvcnQoYlswXS5maWVsZCxiWzBdLmRpcmVjdGlvbil9ZWxzZXt0 aGlzLmFwcGx5U29ydCgpO3RoaXMuZmlyZUV2ZW50KCJkYXRhY2hhbmdlZCIsdGhp cyl9fSxlYWNoOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhLmVhY2goYixhKX0sZ2V0 TW9kaWZpZWRSZWNvcmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW9kaWZpZWR9 LHN1bTpmdW5jdGlvbihlLGcsYSl7dmFyIGM9dGhpcy5kYXRhLml0ZW1zLGI9MDtn PWd8fDA7YT0oYXx8YT09PTApP2E6Yy5sZW5ndGgtMTtmb3IodmFyIGQ9ZztkPD1h O2QrKyl7Yis9KGNbZF0uZGF0YVtlXXx8MCl9cmV0dXJuIGJ9LGNyZWF0ZUZpbHRl ckZuOmZ1bmN0aW9uKGQsYyxlLGEsYil7aWYoRXh0LmlzRW1wdHkoYyxmYWxzZSkp e3JldHVybiBmYWxzZX1jPXRoaXMuZGF0YS5jcmVhdGVWYWx1ZU1hdGNoZXIoYyxl LGEsYik7cmV0dXJuIGZ1bmN0aW9uKGcpe3JldHVybiBjLnRlc3QoZy5kYXRhW2Rd KX19LGNyZWF0ZU11bHRpcGxlRmlsdGVyRm46ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1 bmN0aW9uKGIpe3ZhciBrPXRydWU7Zm9yKHZhciBkPTAsYz1hLmxlbmd0aDtkPGM7 ZCsrKXt2YXIgaD1hW2RdLGc9aC5mbixlPWguc2NvcGU7az1rJiZnLmNhbGwoZSxi KX1yZXR1cm4ga319LGZpbHRlcjpmdW5jdGlvbihuLG0saCxrLGUpe3ZhciBsO2lm KEV4dC5pc09iamVjdChuKSl7bj1bbl19aWYoRXh0LmlzQXJyYXkobikpe3ZhciBi PVtdO2Zvcih2YXIgZz0wLGQ9bi5sZW5ndGg7ZzxkO2crKyl7dmFyIGE9bltnXSxj PWEuZm4sbz1hLnNjb3BlfHx0aGlzO2lmKCFFeHQuaXNGdW5jdGlvbihjKSl7Yz10 aGlzLmNyZWF0ZUZpbHRlckZuKGEucHJvcGVydHksYS52YWx1ZSxhLmFueU1hdGNo LGEuY2FzZVNlbnNpdGl2ZSxhLmV4YWN0TWF0Y2gpfWIucHVzaCh7Zm46YyxzY29w ZTpvfSl9bD10aGlzLmNyZWF0ZU11bHRpcGxlRmlsdGVyRm4oYil9ZWxzZXtsPXRo aXMuY3JlYXRlRmlsdGVyRm4obixtLGgsayxlKX1yZXR1cm4gbD90aGlzLmZpbHRl ckJ5KGwpOnRoaXMuY2xlYXJGaWx0ZXIoKX0sZmlsdGVyQnk6ZnVuY3Rpb24oYixh KXt0aGlzLnNuYXBzaG90PXRoaXMuc25hcHNob3R8fHRoaXMuZGF0YTt0aGlzLmRh dGE9dGhpcy5xdWVyeUJ5KGIsYXx8dGhpcyk7dGhpcy5maXJlRXZlbnQoImRhdGFj aGFuZ2VkIix0aGlzKX0sY2xlYXJGaWx0ZXI6ZnVuY3Rpb24oYSl7aWYodGhpcy5p c0ZpbHRlcmVkKCkpe3RoaXMuZGF0YT10aGlzLnNuYXBzaG90O2RlbGV0ZSB0aGlz LnNuYXBzaG90O2lmKGEhPT10cnVlKXt0aGlzLmZpcmVFdmVudCgiZGF0YWNoYW5n ZWQiLHRoaXMpfX19LGlzRmlsdGVyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gISF0aGlz LnNuYXBzaG90JiZ0aGlzLnNuYXBzaG90IT10aGlzLmRhdGF9LHF1ZXJ5OmZ1bmN0 aW9uKGQsYyxlLGEpe3ZhciBiPXRoaXMuY3JlYXRlRmlsdGVyRm4oZCxjLGUsYSk7 cmV0dXJuIGI/dGhpcy5xdWVyeUJ5KGIpOnRoaXMuZGF0YS5jbG9uZSgpfSxxdWVy eUJ5OmZ1bmN0aW9uKGIsYSl7dmFyIGM9dGhpcy5zbmFwc2hvdHx8dGhpcy5kYXRh O3JldHVybiBjLmZpbHRlckJ5KGIsYXx8dGhpcyl9LGZpbmQ6ZnVuY3Rpb24oZCxj LGcsZSxhKXt2YXIgYj10aGlzLmNyZWF0ZUZpbHRlckZuKGQsYyxlLGEpO3JldHVy biBiP3RoaXMuZGF0YS5maW5kSW5kZXhCeShiLG51bGwsZyk6LTF9LGZpbmRFeGFj dDpmdW5jdGlvbihiLGEsYyl7cmV0dXJuIHRoaXMuZGF0YS5maW5kSW5kZXhCeShm dW5jdGlvbihkKXtyZXR1cm4gZC5nZXQoYik9PT1hfSx0aGlzLGMpfSxmaW5kQnk6 ZnVuY3Rpb24oYixhLGMpe3JldHVybiB0aGlzLmRhdGEuZmluZEluZGV4QnkoYixh LGMpfSxjb2xsZWN0OmZ1bmN0aW9uKGosayxiKXt2YXIgaD0oYj09PXRydWUmJnRo aXMuc25hcHNob3QpP3RoaXMuc25hcHNob3QuaXRlbXM6dGhpcy5kYXRhLml0ZW1z O3ZhciBtLG4sYT1bXSxjPXt9O2Zvcih2YXIgZT0wLGc9aC5sZW5ndGg7ZTxnO2Ur Kyl7bT1oW2VdLmRhdGFbal07bj1TdHJpbmcobSk7aWYoKGt8fCFFeHQuaXNFbXB0 eShtKSkmJiFjW25dKXtjW25dPXRydWU7YVthLmxlbmd0aF09bX19cmV0dXJuIGF9 LGFmdGVyRWRpdDpmdW5jdGlvbihhKXtpZih0aGlzLm1vZGlmaWVkLmluZGV4T2Yo YSk9PS0xKXt0aGlzLm1vZGlmaWVkLnB1c2goYSl9dGhpcy5maXJlRXZlbnQoInVw ZGF0ZSIsdGhpcyxhLEV4dC5kYXRhLlJlY29yZC5FRElUKX0sYWZ0ZXJSZWplY3Q6 ZnVuY3Rpb24oYSl7dGhpcy5tb2RpZmllZC5yZW1vdmUoYSk7dGhpcy5maXJlRXZl bnQoInVwZGF0ZSIsdGhpcyxhLEV4dC5kYXRhLlJlY29yZC5SRUpFQ1QpfSxhZnRl ckNvbW1pdDpmdW5jdGlvbihhKXt0aGlzLm1vZGlmaWVkLnJlbW92ZShhKTt0aGlz LmZpcmVFdmVudCgidXBkYXRlIix0aGlzLGEsRXh0LmRhdGEuUmVjb3JkLkNPTU1J VCl9LGNvbW1pdENoYW5nZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm1vZGlmaWVk LnNsaWNlKDApLGM9YS5sZW5ndGgsYjtmb3IoYj0wO2I8YztiKyspe2FbYl0uY29t bWl0KCl9dGhpcy5tb2RpZmllZD1bXTt0aGlzLnJlbW92ZWQ9W119LHJlamVjdENo YW5nZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm1vZGlmaWVkLnNsaWNlKDApLGU9 dGhpcy5yZW1vdmVkLnNsaWNlKDApLnJldmVyc2UoKSxjPWEubGVuZ3RoLGQ9ZS5s ZW5ndGgsYjtmb3IoYj0wO2I8YztiKyspe2FbYl0ucmVqZWN0KCl9Zm9yKGI9MDti PGQ7YisrKXt0aGlzLmluc2VydChlW2JdLmxhc3RJbmRleHx8MCxlW2JdKTtlW2Jd LnJlamVjdCgpfXRoaXMubW9kaWZpZWQ9W107dGhpcy5yZW1vdmVkPVtdfSxvbk1l dGFDaGFuZ2U6ZnVuY3Rpb24oYSl7dGhpcy5yZWNvcmRUeXBlPXRoaXMucmVhZGVy LnJlY29yZFR5cGU7dGhpcy5maWVsZHM9dGhpcy5yZWNvcmRUeXBlLnByb3RvdHlw ZS5maWVsZHM7ZGVsZXRlIHRoaXMuc25hcHNob3Q7aWYodGhpcy5yZWFkZXIubWV0 YS5zb3J0SW5mbyl7dGhpcy5zb3J0SW5mbz10aGlzLnJlYWRlci5tZXRhLnNvcnRJ bmZvfWVsc2V7aWYodGhpcy5zb3J0SW5mbyYmIXRoaXMuZmllbGRzLmdldCh0aGlz LnNvcnRJbmZvLmZpZWxkKSl7ZGVsZXRlIHRoaXMuc29ydEluZm99fWlmKHRoaXMu d3JpdGVyKXt0aGlzLndyaXRlci5tZXRhPXRoaXMucmVhZGVyLm1ldGF9dGhpcy5t b2RpZmllZD1bXTt0aGlzLmZpcmVFdmVudCgibWV0YWNoYW5nZSIsdGhpcyx0aGlz LnJlYWRlci5tZXRhKX0sZmluZEluc2VydEluZGV4OmZ1bmN0aW9uKGEpe3RoaXMu c3VzcGVuZEV2ZW50cygpO3ZhciBjPXRoaXMuZGF0YS5jbG9uZSgpO3RoaXMuZGF0 YS5hZGQoYSk7dGhpcy5hcHBseVNvcnQoKTt2YXIgYj10aGlzLmRhdGEuaW5kZXhP ZihhKTt0aGlzLmRhdGE9Yzt0aGlzLnJlc3VtZUV2ZW50cygpO3JldHVybiBifSxz ZXRCYXNlUGFyYW06ZnVuY3Rpb24oYSxiKXt0aGlzLmJhc2VQYXJhbXM9dGhpcy5i YXNlUGFyYW1zfHx7fTt0aGlzLmJhc2VQYXJhbXNbYV09Yn19KTtFeHQucmVnKCJz dG9yZSIsRXh0LmRhdGEuU3RvcmUpO0V4dC5kYXRhLlN0b3JlLkVycm9yPUV4dC5l eHRlbmQoRXh0LkVycm9yLHtuYW1lOiJFeHQuZGF0YS5TdG9yZSJ9KTtFeHQuYXBw bHkoRXh0LmRhdGEuU3RvcmUuRXJyb3IucHJvdG90eXBlLHtsYW5nOnsid3JpdGVy LXVuZGVmaW5lZCI6IkF0dGVtcHRlZCB0byBleGVjdXRlIGEgd3JpdGUtYWN0aW9u IHdpdGhvdXQgYSBEYXRhV3JpdGVyIGluc3RhbGxlZC4ifX0pO0V4dC5kYXRhLkZp ZWxkPUV4dC5leHRlbmQoT2JqZWN0LHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihiKXtp ZihFeHQuaXNTdHJpbmcoYikpe2I9e25hbWU6Yn19RXh0LmFwcGx5KHRoaXMsYik7 dmFyIGQ9RXh0LmRhdGEuVHlwZXMsYT10aGlzLnNvcnRUeXBlLGM7aWYodGhpcy50 eXBlKXtpZihFeHQuaXNTdHJpbmcodGhpcy50eXBlKSl7dGhpcy50eXBlPUV4dC5k YXRhLlR5cGVzW3RoaXMudHlwZS50b1VwcGVyQ2FzZSgpXXx8ZC5BVVRPfX1lbHNl e3RoaXMudHlwZT1kLkFVVE99aWYoRXh0LmlzU3RyaW5nKGEpKXt0aGlzLnNvcnRU eXBlPUV4dC5kYXRhLlNvcnRUeXBlc1thXX1lbHNle2lmKEV4dC5pc0VtcHR5KGEp KXt0aGlzLnNvcnRUeXBlPXRoaXMudHlwZS5zb3J0VHlwZX19aWYoIXRoaXMuY29u dmVydCl7dGhpcy5jb252ZXJ0PXRoaXMudHlwZS5jb252ZXJ0fX0sZGF0ZUZvcm1h dDpudWxsLHVzZU51bGw6ZmFsc2UsZGVmYXVsdFZhbHVlOiIiLG1hcHBpbmc6bnVs bCxzb3J0VHlwZTpudWxsLHNvcnREaXI6IkFTQyIsYWxsb3dCbGFuazp0cnVlfSk7 RXh0LmRhdGEuRGF0YVJlYWRlcj1mdW5jdGlvbihhLGIpe3RoaXMubWV0YT1hO3Ro aXMucmVjb3JkVHlwZT1FeHQuaXNBcnJheShiKT9FeHQuZGF0YS5SZWNvcmQuY3Jl YXRlKGIpOmI7aWYodGhpcy5yZWNvcmRUeXBlKXt0aGlzLmJ1aWxkRXh0cmFjdG9y cygpfX07RXh0LmRhdGEuRGF0YVJlYWRlci5wcm90b3R5cGU9e2dldFRvdGFsOkV4 dC5lbXB0eUZuLGdldFJvb3Q6RXh0LmVtcHR5Rm4sZ2V0TWVzc2FnZTpFeHQuZW1w dHlGbixnZXRTdWNjZXNzOkV4dC5lbXB0eUZuLGdldElkOkV4dC5lbXB0eUZuLGJ1 aWxkRXh0cmFjdG9yczpFeHQuZW1wdHlGbixleHRyYWN0VmFsdWVzOkV4dC5lbXB0 eUZuLHJlYWxpemU6ZnVuY3Rpb24oYSxjKXtpZihFeHQuaXNBcnJheShhKSl7Zm9y KHZhciBiPWEubGVuZ3RoLTE7Yj49MDtiLS0pe2lmKEV4dC5pc0FycmF5KGMpKXt0 aGlzLnJlYWxpemUoYS5zcGxpY2UoYiwxKS5zaGlmdCgpLGMuc3BsaWNlKGIsMSku c2hpZnQoKSl9ZWxzZXt0aGlzLnJlYWxpemUoYS5zcGxpY2UoYiwxKS5zaGlmdCgp LGMpfX19ZWxzZXtpZihFeHQuaXNBcnJheShjKSYmYy5sZW5ndGg9PTEpe2M9Yy5z aGlmdCgpfWlmKCF0aGlzLmlzRGF0YShjKSl7dGhyb3cgbmV3IEV4dC5kYXRhLkRh dGFSZWFkZXIuRXJyb3IoInJlYWxpemUiLGEpfWEucGhhbnRvbT1mYWxzZTthLl9w aGlkPWEuaWQ7YS5pZD10aGlzLmdldElkKGMpO2EuZGF0YT1jO2EuY29tbWl0KCk7 YS5zdG9yZS5yZU1hcChhKX19LHVwZGF0ZTpmdW5jdGlvbihhLGMpe2lmKEV4dC5p c0FycmF5KGEpKXtmb3IodmFyIGI9YS5sZW5ndGgtMTtiPj0wO2ItLSl7aWYoRXh0 LmlzQXJyYXkoYykpe3RoaXMudXBkYXRlKGEuc3BsaWNlKGIsMSkuc2hpZnQoKSxj LnNwbGljZShiLDEpLnNoaWZ0KCkpfWVsc2V7dGhpcy51cGRhdGUoYS5zcGxpY2Uo YiwxKS5zaGlmdCgpLGMpfX19ZWxzZXtpZihFeHQuaXNBcnJheShjKSYmYy5sZW5n dGg9PTEpe2M9Yy5zaGlmdCgpfWlmKHRoaXMuaXNEYXRhKGMpKXthLmRhdGE9RXh0 LmFwcGx5KGEuZGF0YSxjKX1hLmNvbW1pdCgpfX0sZXh0cmFjdERhdGE6ZnVuY3Rp b24oayxhKXt2YXIgaj0odGhpcyBpbnN0YW5jZW9mIEV4dC5kYXRhLkpzb25SZWFk ZXIpPyJqc29uIjoibm9kZSI7dmFyIGM9W107aWYodGhpcy5pc0RhdGEoaykmJiEo dGhpcyBpbnN0YW5jZW9mIEV4dC5kYXRhLlhtbFJlYWRlcikpe2s9W2tdfXZhciBo PXRoaXMucmVjb3JkVHlwZS5wcm90b3R5cGUuZmllbGRzLG89aC5pdGVtcyxtPWgu bGVuZ3RoLGM9W107aWYoYT09PXRydWUpe3ZhciBsPXRoaXMucmVjb3JkVHlwZTtm b3IodmFyIGU9MDtlPGsubGVuZ3RoO2UrKyl7dmFyIGI9a1tlXTt2YXIgZz1uZXcg bCh0aGlzLmV4dHJhY3RWYWx1ZXMoYixvLG0pLHRoaXMuZ2V0SWQoYikpO2dbal09 YjtjLnB1c2goZyl9fWVsc2V7Zm9yKHZhciBlPTA7ZTxrLmxlbmd0aDtlKyspe3Zh ciBkPXRoaXMuZXh0cmFjdFZhbHVlcyhrW2VdLG8sbSk7ZFt0aGlzLm1ldGEuaWRQ cm9wZXJ0eV09dGhpcy5nZXRJZChrW2VdKTtjLnB1c2goZCl9fXJldHVybiBjfSxp c0RhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuKGEmJkV4dC5pc09iamVjdChhKSYmIUV4 dC5pc0VtcHR5KHRoaXMuZ2V0SWQoYSkpKT90cnVlOmZhbHNlfSxvbk1ldGFDaGFu Z2U6ZnVuY3Rpb24oYSl7ZGVsZXRlIHRoaXMuZWY7dGhpcy5tZXRhPWE7dGhpcy5y ZWNvcmRUeXBlPUV4dC5kYXRhLlJlY29yZC5jcmVhdGUoYS5maWVsZHMpO3RoaXMu YnVpbGRFeHRyYWN0b3JzKCl9fTtFeHQuZGF0YS5EYXRhUmVhZGVyLkVycm9yPUV4 dC5leHRlbmQoRXh0LkVycm9yLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihiLGEpe3Ro aXMuYXJnPWE7RXh0LkVycm9yLmNhbGwodGhpcyxiKX0sbmFtZToiRXh0LmRhdGEu RGF0YVJlYWRlciJ9KTtFeHQuYXBwbHkoRXh0LmRhdGEuRGF0YVJlYWRlci5FcnJv ci5wcm90b3R5cGUse2xhbmc6e3VwZGF0ZToiI3VwZGF0ZSByZWNlaXZlZCBpbnZh bGlkIGRhdGEgZnJvbSBzZXJ2ZXIuICBQbGVhc2Ugc2VlIGRvY3MgZm9yIERhdGFS ZWFkZXIjdXBkYXRlIGFuZCByZXZpZXcgeW91ciBEYXRhUmVhZGVyIGNvbmZpZ3Vy YXRpb24uIixyZWFsaXplOiIjcmVhbGl6ZSB3YXMgY2FsbGVkIHdpdGggaW52YWxp ZCByZW1vdGUtZGF0YS4gIFBsZWFzZSBzZWUgdGhlIGRvY3MgZm9yIERhdGFSZWFk ZXIjcmVhbGl6ZSBhbmQgcmV2aWV3IHlvdXIgRGF0YVJlYWRlciBjb25maWd1cmF0 aW9uLiIsImludmFsaWQtcmVzcG9uc2UiOiIjcmVhZFJlc3BvbnNlIHJlY2VpdmVk IGFuIGludmFsaWQgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiJ9fSk7RXh0LmRh dGEuRGF0YVdyaXRlcj1mdW5jdGlvbihhKXtFeHQuYXBwbHkodGhpcyxhKX07RXh0 LmRhdGEuRGF0YVdyaXRlci5wcm90b3R5cGU9e3dyaXRlQWxsRmllbGRzOmZhbHNl LGxpc3RmdWw6ZmFsc2UsYXBwbHk6ZnVuY3Rpb24oZSxnLGQsYSl7dmFyIGM9W10s Yj1kKyJSZWNvcmQiO2lmKEV4dC5pc0FycmF5KGEpKXtFeHQuZWFjaChhLGZ1bmN0 aW9uKGgpe2MucHVzaCh0aGlzW2JdKGgpKX0sdGhpcyl9ZWxzZXtpZihhIGluc3Rh bmNlb2YgRXh0LmRhdGEuUmVjb3JkKXtjPXRoaXNbYl0oYSl9fXRoaXMucmVuZGVy KGUsZyxjKX0scmVuZGVyOkV4dC5lbXB0eUZuLHVwZGF0ZVJlY29yZDpFeHQuZW1w dHlGbixjcmVhdGVSZWNvcmQ6RXh0LmVtcHR5Rm4sZGVzdHJveVJlY29yZDpFeHQu ZW1wdHlGbix0b0hhc2g6ZnVuY3Rpb24oZyxjKXt2YXIgZT1nLmZpZWxkcy5tYXAs ZD17fSxiPSh0aGlzLndyaXRlQWxsRmllbGRzPT09ZmFsc2UmJmcucGhhbnRvbT09 PWZhbHNlKT9nLmdldENoYW5nZXMoKTpnLmRhdGEsYTtFeHQuaXRlcmF0ZShiLGZ1 bmN0aW9uKGksaCl7aWYoKGE9ZVtpXSkpe2RbYS5tYXBwaW5nP2EubWFwcGluZzph Lm5hbWVdPWh9fSk7aWYoZy5waGFudG9tKXtpZihnLmZpZWxkcy5jb250YWluc0tl eSh0aGlzLm1ldGEuaWRQcm9wZXJ0eSkmJkV4dC5pc0VtcHR5KGcuZGF0YVt0aGlz Lm1ldGEuaWRQcm9wZXJ0eV0pKXtkZWxldGUgZFt0aGlzLm1ldGEuaWRQcm9wZXJ0 eV19fWVsc2V7ZFt0aGlzLm1ldGEuaWRQcm9wZXJ0eV09Zy5pZH1yZXR1cm4gZH0s dG9BcnJheTpmdW5jdGlvbihiKXt2YXIgYT1bXTtFeHQuaXRlcmF0ZShiLGZ1bmN0 aW9uKGQsYyl7YS5wdXNoKHtuYW1lOmQsdmFsdWU6Y30pfSx0aGlzKTtyZXR1cm4g YX19O0V4dC5kYXRhLkRhdGFQcm94eT1mdW5jdGlvbihhKXthPWF8fHt9O3RoaXMu YXBpPWEuYXBpO3RoaXMudXJsPWEudXJsO3RoaXMucmVzdGZ1bD1hLnJlc3RmdWw7 dGhpcy5saXN0ZW5lcnM9YS5saXN0ZW5lcnM7dGhpcy5wcmV0dHlVcmxzPWEucHJl dHR5VXJsczt0aGlzLmFkZEV2ZW50cygiZXhjZXB0aW9uIiwiYmVmb3JlbG9hZCIs ImxvYWQiLCJsb2FkZXhjZXB0aW9uIiwiYmVmb3Jld3JpdGUiLCJ3cml0ZSIpO0V4 dC5kYXRhLkRhdGFQcm94eS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhp cyk7dHJ5e0V4dC5kYXRhLkFwaS5wcmVwYXJlKHRoaXMpfWNhdGNoKGIpe2lmKGIg aW5zdGFuY2VvZiBFeHQuZGF0YS5BcGkuRXJyb3Ipe2IudG9Db25zb2xlKCl9fUV4 dC5kYXRhLkRhdGFQcm94eS5yZWxheUV2ZW50cyh0aGlzLFsiYmVmb3Jld3JpdGUi LCJ3cml0ZSIsImV4Y2VwdGlvbiJdKX07RXh0LmV4dGVuZChFeHQuZGF0YS5EYXRh UHJveHksRXh0LnV0aWwuT2JzZXJ2YWJsZSx7cmVzdGZ1bDpmYWxzZSxzZXRBcGk6 ZnVuY3Rpb24oKXtpZihhcmd1bWVudHMubGVuZ3RoPT0xKXt2YXIgYT1FeHQuZGF0 YS5BcGkuaXNWYWxpZChhcmd1bWVudHNbMF0pO2lmKGE9PT10cnVlKXt0aGlzLmFw aT1hcmd1bWVudHNbMF19ZWxzZXt0aHJvdyBuZXcgRXh0LmRhdGEuQXBpLkVycm9y KCJpbnZhbGlkIixhKX19ZWxzZXtpZihhcmd1bWVudHMubGVuZ3RoPT0yKXtpZigh RXh0LmRhdGEuQXBpLmlzQWN0aW9uKGFyZ3VtZW50c1swXSkpe3Rocm93IG5ldyBF eHQuZGF0YS5BcGkuRXJyb3IoImludmFsaWQiLGFyZ3VtZW50c1swXSl9dGhpcy5h cGlbYXJndW1lbnRzWzBdXT1hcmd1bWVudHNbMV19fUV4dC5kYXRhLkFwaS5wcmVw YXJlKHRoaXMpfSxpc0FwaUFjdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4odGhpcy5h cGlbYV0pP3RydWU6ZmFsc2V9LHJlcXVlc3Q6ZnVuY3Rpb24oZSxiLGcsYSxoLGQs Yyl7aWYoIXRoaXMuYXBpW2VdJiYhdGhpcy5sb2FkKXt0aHJvdyBuZXcgRXh0LmRh dGEuRGF0YVByb3h5LkVycm9yKCJhY3Rpb24tdW5kZWZpbmVkIixlKX1nPWd8fHt9 O2lmKChlPT09RXh0LmRhdGEuQXBpLmFjdGlvbnMucmVhZCk/dGhpcy5maXJlRXZl bnQoImJlZm9yZWxvYWQiLHRoaXMsZyk6dGhpcy5maXJlRXZlbnQoImJlZm9yZXdy aXRlIix0aGlzLGUsYixnKSE9PWZhbHNlKXt0aGlzLmRvUmVxdWVzdC5hcHBseSh0 aGlzLGFyZ3VtZW50cyl9ZWxzZXtoLmNhbGwoZHx8dGhpcyxudWxsLGMsZmFsc2Up fX0sbG9hZDpudWxsLGRvUmVxdWVzdDpmdW5jdGlvbihlLGIsZyxhLGgsZCxjKXt0 aGlzLmxvYWQoZyxhLGgsZCxjKX0sb25SZWFkOkV4dC5lbXB0eUZuLG9uV3JpdGU6 RXh0LmVtcHR5Rm4sYnVpbGRVcmw6ZnVuY3Rpb24oZCxiKXtiPWJ8fG51bGw7dmFy IGM9KHRoaXMuY29ubiYmdGhpcy5jb25uLnVybCk/dGhpcy5jb25uLnVybDoodGhp cy5hcGlbZF0pP3RoaXMuYXBpW2RdLnVybDp0aGlzLnVybDtpZighYyl7dGhyb3cg bmV3IEV4dC5kYXRhLkFwaS5FcnJvcigiaW52YWxpZC11cmwiLGQpfXZhciBlPW51 bGw7dmFyIGE9Yy5tYXRjaCgvKC4qKShcLmpzb258XC54bWx8XC5odG1sKSQvKTtp ZihhKXtlPWFbMl07Yz1hWzFdfWlmKCh0aGlzLnJlc3RmdWw9PT10cnVlfHx0aGlz LnByZXR0eVVybHM9PT10cnVlKSYmYiBpbnN0YW5jZW9mIEV4dC5kYXRhLlJlY29y ZCYmIWIucGhhbnRvbSl7Yys9Ii8iK2IuaWR9cmV0dXJuKGU9PT1udWxsKT9jOmMr ZX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMucHVyZ2VMaXN0ZW5lcnMoKX19KTtF eHQuYXBwbHkoRXh0LmRhdGEuRGF0YVByb3h5LEV4dC51dGlsLk9ic2VydmFibGUu cHJvdG90eXBlKTtFeHQudXRpbC5PYnNlcnZhYmxlLmNhbGwoRXh0LmRhdGEuRGF0 YVByb3h5KTtFeHQuZGF0YS5EYXRhUHJveHkuRXJyb3I9RXh0LmV4dGVuZChFeHQu RXJyb3Ise2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGIsYSl7dGhpcy5hcmc9YTtFeHQu RXJyb3IuY2FsbCh0aGlzLGIpfSxuYW1lOiJFeHQuZGF0YS5EYXRhUHJveHkifSk7 RXh0LmFwcGx5KEV4dC5kYXRhLkRhdGFQcm94eS5FcnJvci5wcm90b3R5cGUse2xh bmc6eyJhY3Rpb24tdW5kZWZpbmVkIjoiRGF0YVByb3h5IGF0dGVtcHRlZCB0byBl eGVjdXRlIGFuIEFQSS1hY3Rpb24gYnV0IGZvdW5kIGFuIHVuZGVmaW5lZCB1cmwg LyBmdW5jdGlvbi4gIFBsZWFzZSByZXZpZXcgeW91ciBQcm94eSB1cmwvYXBpLWNv bmZpZ3VyYXRpb24uIiwiYXBpLWludmFsaWQiOiJSZWNpZXZlZCBhbiBpbnZhbGlk IEFQSS1jb25maWd1cmF0aW9uLiAgUGxlYXNlIGVuc3VyZSB5b3VyIHByb3h5IEFQ SS1jb25maWd1cmF0aW9uIGNvbnRhaW5zIG9ubHkgdGhlIGFjdGlvbnMgZnJvbSBF eHQuZGF0YS5BcGkuYWN0aW9ucy4ifX0pO0V4dC5kYXRhLlJlcXVlc3Q9ZnVuY3Rp b24oYSl7RXh0LmFwcGx5KHRoaXMsYSl9O0V4dC5kYXRhLlJlcXVlc3QucHJvdG90 eXBlPXthY3Rpb246dW5kZWZpbmVkLHJzOnVuZGVmaW5lZCxwYXJhbXM6dW5kZWZp bmVkLGNhbGxiYWNrOkV4dC5lbXB0eUZuLHNjb3BlOnVuZGVmaW5lZCxyZWFkZXI6 dW5kZWZpbmVkfTtFeHQuZGF0YS5SZXNwb25zZT1mdW5jdGlvbihhKXtFeHQuYXBw bHkodGhpcyxhKX07RXh0LmRhdGEuUmVzcG9uc2UucHJvdG90eXBlPXthY3Rpb246 dW5kZWZpbmVkLHN1Y2Nlc3M6dW5kZWZpbmVkLG1lc3NhZ2U6dW5kZWZpbmVkLGRh dGE6dW5kZWZpbmVkLHJhdzp1bmRlZmluZWQscmVjb3Jkczp1bmRlZmluZWR9O0V4 dC5kYXRhLlNjcmlwdFRhZ1Byb3h5PWZ1bmN0aW9uKGEpe0V4dC5hcHBseSh0aGlz LGEpO0V4dC5kYXRhLlNjcmlwdFRhZ1Byb3h5LnN1cGVyY2xhc3MuY29uc3RydWN0 b3IuY2FsbCh0aGlzLGEpO3RoaXMuaGVhZD1kb2N1bWVudC5nZXRFbGVtZW50c0J5 VGFnTmFtZSgiaGVhZCIpWzBdfTtFeHQuZGF0YS5TY3JpcHRUYWdQcm94eS5UUkFO U19JRD0xMDAwO0V4dC5leHRlbmQoRXh0LmRhdGEuU2NyaXB0VGFnUHJveHksRXh0 LmRhdGEuRGF0YVByb3h5LHt0aW1lb3V0OjMwMDAwLGNhbGxiYWNrUGFyYW06ImNh bGxiYWNrIixub2NhY2hlOnRydWUsZG9SZXF1ZXN0OmZ1bmN0aW9uKGUsZyxkLGgs aixrLGwpe3ZhciBjPUV4dC51cmxFbmNvZGUoRXh0LmFwcGx5KGQsdGhpcy5leHRy YVBhcmFtcykpO3ZhciBiPXRoaXMuYnVpbGRVcmwoZSxnKTtpZighYil7dGhyb3cg bmV3IEV4dC5kYXRhLkFwaS5FcnJvcigiaW52YWxpZC11cmwiLGIpfWI9RXh0LnVy bEFwcGVuZChiLGMpO2lmKHRoaXMubm9jYWNoZSl7Yj1FeHQudXJsQXBwZW5kKGIs Il9kYz0iKyhuZXcgRGF0ZSgpLmdldFRpbWUoKSkpfXZhciBhPSsrRXh0LmRhdGEu U2NyaXB0VGFnUHJveHkuVFJBTlNfSUQ7dmFyIG09e2lkOmEsYWN0aW9uOmUsY2I6 InN0Y0NhbGxiYWNrIithLHNjcmlwdElkOiJzdGNTY3JpcHQiK2EscGFyYW1zOmQs YXJnOmwsdXJsOmIsY2FsbGJhY2s6aixzY29wZTprLHJlYWRlcjpofTt3aW5kb3db bS5jYl09dGhpcy5jcmVhdGVDYWxsYmFjayhlLGcsbSk7Yis9U3RyaW5nLmZvcm1h dCgiJnswfT17MX0iLHRoaXMuY2FsbGJhY2tQYXJhbSxtLmNiKTtpZih0aGlzLmF1 dG9BYm9ydCE9PWZhbHNlKXt0aGlzLmFib3J0KCl9bS50aW1lb3V0SWQ9dGhpcy5o YW5kbGVGYWlsdXJlLmRlZmVyKHRoaXMudGltZW91dCx0aGlzLFttXSk7dmFyIGk9 ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aS5zZXRBdHRyaWJ1dGUo InNyYyIsYik7aS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJ0ZXh0L2phdmFzY3JpcHQi KTtpLnNldEF0dHJpYnV0ZSgiaWQiLG0uc2NyaXB0SWQpO3RoaXMuaGVhZC5hcHBl bmRDaGlsZChpKTt0aGlzLnRyYW5zPW19LGNyZWF0ZUNhbGxiYWNrOmZ1bmN0aW9u KGQsYixjKXt2YXIgYT10aGlzO3JldHVybiBmdW5jdGlvbihlKXthLnRyYW5zPWZh bHNlO2EuZGVzdHJveVRyYW5zKGMsdHJ1ZSk7aWYoZD09PUV4dC5kYXRhLkFwaS5h Y3Rpb25zLnJlYWQpe2Eub25SZWFkLmNhbGwoYSxkLGMsZSl9ZWxzZXthLm9uV3Jp dGUuY2FsbChhLGQsYyxlLGIpfX19LG9uUmVhZDpmdW5jdGlvbihkLGMsYil7dmFy IGE7dHJ5e2E9Yy5yZWFkZXIucmVhZFJlY29yZHMoYil9Y2F0Y2goZyl7dGhpcy5m aXJlRXZlbnQoImxvYWRleGNlcHRpb24iLHRoaXMsYyxiLGcpO3RoaXMuZmlyZUV2 ZW50KCJleGNlcHRpb24iLHRoaXMsInJlc3BvbnNlIixkLGMsYixnKTtjLmNhbGxi YWNrLmNhbGwoYy5zY29wZXx8d2luZG93LG51bGwsYy5hcmcsZmFsc2UpO3JldHVy bn1pZihhLnN1Y2Nlc3M9PT1mYWxzZSl7dGhpcy5maXJlRXZlbnQoImxvYWRleGNl cHRpb24iLHRoaXMsYyxiKTt0aGlzLmZpcmVFdmVudCgiZXhjZXB0aW9uIix0aGlz LCJyZW1vdGUiLGQsYyxiLG51bGwpfWVsc2V7dGhpcy5maXJlRXZlbnQoImxvYWQi LHRoaXMsYixjLmFyZyl9Yy5jYWxsYmFjay5jYWxsKGMuc2NvcGV8fHdpbmRvdyxh LGMuYXJnLGEuc3VjY2Vzcyl9LG9uV3JpdGU6ZnVuY3Rpb24oaCxnLGMsYil7dmFy IGE9Zy5yZWFkZXI7dHJ5e3ZhciBkPWEucmVhZFJlc3BvbnNlKGgsYyl9Y2F0Y2go aSl7dGhpcy5maXJlRXZlbnQoImV4Y2VwdGlvbiIsdGhpcywicmVzcG9uc2UiLGgs ZyxkLGkpO2cuY2FsbGJhY2suY2FsbChnLnNjb3BlfHx3aW5kb3csbnVsbCxkLGZh bHNlKTtyZXR1cm59aWYoIWQuc3VjY2Vzcz09PXRydWUpe3RoaXMuZmlyZUV2ZW50 KCJleGNlcHRpb24iLHRoaXMsInJlbW90ZSIsaCxnLGQsYik7Zy5jYWxsYmFjay5j YWxsKGcuc2NvcGV8fHdpbmRvdyxudWxsLGQsZmFsc2UpO3JldHVybn10aGlzLmZp cmVFdmVudCgid3JpdGUiLHRoaXMsaCxkLmRhdGEsZCxiLGcuYXJnKTtnLmNhbGxi YWNrLmNhbGwoZy5zY29wZXx8d2luZG93LGQuZGF0YSxkLHRydWUpfSxpc0xvYWRp bmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmFucz90cnVlOmZhbHNlfSxhYm9y dDpmdW5jdGlvbigpe2lmKHRoaXMuaXNMb2FkaW5nKCkpe3RoaXMuZGVzdHJveVRy YW5zKHRoaXMudHJhbnMpfX0sZGVzdHJveVRyYW5zOmZ1bmN0aW9uKGIsYSl7dGhp cy5oZWFkLnJlbW92ZUNoaWxkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuc2Ny aXB0SWQpKTtjbGVhclRpbWVvdXQoYi50aW1lb3V0SWQpO2lmKGEpe3dpbmRvd1ti LmNiXT11bmRlZmluZWQ7dHJ5e2RlbGV0ZSB3aW5kb3dbYi5jYl19Y2F0Y2goYyl7 fX1lbHNle3dpbmRvd1tiLmNiXT1mdW5jdGlvbigpe3dpbmRvd1tiLmNiXT11bmRl ZmluZWQ7dHJ5e2RlbGV0ZSB3aW5kb3dbYi5jYl19Y2F0Y2goZCl7fX19fSxoYW5k bGVGYWlsdXJlOmZ1bmN0aW9uKGEpe3RoaXMudHJhbnM9ZmFsc2U7dGhpcy5kZXN0 cm95VHJhbnMoYSxmYWxzZSk7aWYoYS5hY3Rpb249PT1FeHQuZGF0YS5BcGkuYWN0 aW9ucy5yZWFkKXt0aGlzLmZpcmVFdmVudCgibG9hZGV4Y2VwdGlvbiIsdGhpcyxu dWxsLGEuYXJnKX10aGlzLmZpcmVFdmVudCgiZXhjZXB0aW9uIix0aGlzLCJyZXNw b25zZSIsYS5hY3Rpb24se3Jlc3BvbnNlOm51bGwsb3B0aW9uczphLmFyZ30pO2Eu Y2FsbGJhY2suY2FsbChhLnNjb3BlfHx3aW5kb3csbnVsbCxhLmFyZyxmYWxzZSl9 LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmFib3J0KCk7RXh0LmRhdGEuU2NyaXB0 VGFnUHJveHkuc3VwZXJjbGFzcy5kZXN0cm95LmNhbGwodGhpcyl9fSk7RXh0LmRh dGEuSHR0cFByb3h5PWZ1bmN0aW9uKGEpe0V4dC5kYXRhLkh0dHBQcm94eS5zdXBl cmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmNvbm49YTt0aGlz LmNvbm4udXJsPW51bGw7dGhpcy51c2VBamF4PSFhfHwhYS5ldmVudHM7dmFyIGM9 RXh0LmRhdGEuQXBpLmFjdGlvbnM7dGhpcy5hY3RpdmVSZXF1ZXN0PXt9O2Zvcih2 YXIgYiBpbiBjKXt0aGlzLmFjdGl2ZVJlcXVlc3RbY1tiXV09dW5kZWZpbmVkfX07 RXh0LmV4dGVuZChFeHQuZGF0YS5IdHRwUHJveHksRXh0LmRhdGEuRGF0YVByb3h5 LHtnZXRDb25uZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXNlQWpheD9F eHQuQWpheDp0aGlzLmNvbm59LHNldFVybDpmdW5jdGlvbihhLGIpe3RoaXMuY29u bi51cmw9YTtpZihiPT09dHJ1ZSl7dGhpcy51cmw9YTt0aGlzLmFwaT1udWxsO0V4 dC5kYXRhLkFwaS5wcmVwYXJlKHRoaXMpfX0sZG9SZXF1ZXN0OmZ1bmN0aW9uKGcs ZCxpLGMsYixlLGEpe3ZhciBoPXttZXRob2Q6KHRoaXMuYXBpW2ddKT90aGlzLmFw aVtnXVsibWV0aG9kIl06dW5kZWZpbmVkLHJlcXVlc3Q6e2NhbGxiYWNrOmIsc2Nv cGU6ZSxhcmc6YX0scmVhZGVyOmMsY2FsbGJhY2s6dGhpcy5jcmVhdGVDYWxsYmFj ayhnLGQpLHNjb3BlOnRoaXN9O2lmKGkuanNvbkRhdGEpe2guanNvbkRhdGE9aS5q c29uRGF0YX1lbHNle2lmKGkueG1sRGF0YSl7aC54bWxEYXRhPWkueG1sRGF0YX1l bHNle2gucGFyYW1zPWl8fHt9fX10aGlzLmNvbm4udXJsPXRoaXMuYnVpbGRVcmwo ZyxkKTtpZih0aGlzLnVzZUFqYXgpe0V4dC5hcHBseUlmKGgsdGhpcy5jb25uKTtp Zih0aGlzLmFjdGl2ZVJlcXVlc3RbZ10pe310aGlzLmFjdGl2ZVJlcXVlc3RbZ109 RXh0LkFqYXgucmVxdWVzdChoKX1lbHNle3RoaXMuY29ubi5yZXF1ZXN0KGgpfXRo aXMuY29ubi51cmw9bnVsbH0sY3JlYXRlQ2FsbGJhY2s6ZnVuY3Rpb24oYixhKXty ZXR1cm4gZnVuY3Rpb24oZSxkLGMpe3RoaXMuYWN0aXZlUmVxdWVzdFtiXT11bmRl ZmluZWQ7aWYoIWQpe2lmKGI9PT1FeHQuZGF0YS5BcGkuYWN0aW9ucy5yZWFkKXt0 aGlzLmZpcmVFdmVudCgibG9hZGV4Y2VwdGlvbiIsdGhpcyxlLGMpfXRoaXMuZmly ZUV2ZW50KCJleGNlcHRpb24iLHRoaXMsInJlc3BvbnNlIixiLGUsYyk7ZS5yZXF1 ZXN0LmNhbGxiYWNrLmNhbGwoZS5yZXF1ZXN0LnNjb3BlLG51bGwsZS5yZXF1ZXN0 LmFyZyxmYWxzZSk7cmV0dXJufWlmKGI9PT1FeHQuZGF0YS5BcGkuYWN0aW9ucy5y ZWFkKXt0aGlzLm9uUmVhZChiLGUsYyl9ZWxzZXt0aGlzLm9uV3JpdGUoYixlLGMs YSl9fX0sb25SZWFkOmZ1bmN0aW9uKGQsaCxiKXt2YXIgYTt0cnl7YT1oLnJlYWRl ci5yZWFkKGIpfWNhdGNoKGcpe3RoaXMuZmlyZUV2ZW50KCJsb2FkZXhjZXB0aW9u Iix0aGlzLGgsYixnKTt0aGlzLmZpcmVFdmVudCgiZXhjZXB0aW9uIix0aGlzLCJy ZXNwb25zZSIsZCxoLGIsZyk7aC5yZXF1ZXN0LmNhbGxiYWNrLmNhbGwoaC5yZXF1 ZXN0LnNjb3BlLG51bGwsaC5yZXF1ZXN0LmFyZyxmYWxzZSk7cmV0dXJufWlmKGEu c3VjY2Vzcz09PWZhbHNlKXt0aGlzLmZpcmVFdmVudCgibG9hZGV4Y2VwdGlvbiIs dGhpcyxoLGIpO3ZhciBjPWgucmVhZGVyLnJlYWRSZXNwb25zZShkLGIpO3RoaXMu ZmlyZUV2ZW50KCJleGNlcHRpb24iLHRoaXMsInJlbW90ZSIsZCxoLGMsbnVsbCl9 ZWxzZXt0aGlzLmZpcmVFdmVudCgibG9hZCIsdGhpcyxoLGgucmVxdWVzdC5hcmcp fWgucmVxdWVzdC5jYWxsYmFjay5jYWxsKGgucmVxdWVzdC5zY29wZSxhLGgucmVx dWVzdC5hcmcsYS5zdWNjZXNzKX0sb25Xcml0ZTpmdW5jdGlvbihnLGksYyxiKXt2 YXIgYT1pLnJlYWRlcjt2YXIgZDt0cnl7ZD1hLnJlYWRSZXNwb25zZShnLGMpfWNh dGNoKGgpe3RoaXMuZmlyZUV2ZW50KCJleGNlcHRpb24iLHRoaXMsInJlc3BvbnNl IixnLGksYyxoKTtpLnJlcXVlc3QuY2FsbGJhY2suY2FsbChpLnJlcXVlc3Quc2Nv cGUsbnVsbCxpLnJlcXVlc3QuYXJnLGZhbHNlKTtyZXR1cm59aWYoZC5zdWNjZXNz PT09dHJ1ZSl7dGhpcy5maXJlRXZlbnQoIndyaXRlIix0aGlzLGcsZC5kYXRhLGQs YixpLnJlcXVlc3QuYXJnKX1lbHNle3RoaXMuZmlyZUV2ZW50KCJleGNlcHRpb24i LHRoaXMsInJlbW90ZSIsZyxpLGQsYil9aS5yZXF1ZXN0LmNhbGxiYWNrLmNhbGwo aS5yZXF1ZXN0LnNjb3BlLGQuZGF0YSxkLGQuc3VjY2Vzcyl9LGRlc3Ryb3k6ZnVu Y3Rpb24oKXtpZighdGhpcy51c2VBamF4KXt0aGlzLmNvbm4uYWJvcnQoKX1lbHNl e2lmKHRoaXMuYWN0aXZlUmVxdWVzdCl7dmFyIGI9RXh0LmRhdGEuQXBpLmFjdGlv bnM7Zm9yKHZhciBhIGluIGIpe2lmKHRoaXMuYWN0aXZlUmVxdWVzdFtiW2FdXSl7 RXh0LkFqYXguYWJvcnQodGhpcy5hY3RpdmVSZXF1ZXN0W2JbYV1dKX19fX1FeHQu ZGF0YS5IdHRwUHJveHkuc3VwZXJjbGFzcy5kZXN0cm95LmNhbGwodGhpcyl9fSk7 RXh0LmRhdGEuTWVtb3J5UHJveHk9ZnVuY3Rpb24oYil7dmFyIGE9e307YVtFeHQu ZGF0YS5BcGkuYWN0aW9ucy5yZWFkXT10cnVlO0V4dC5kYXRhLk1lbW9yeVByb3h5 LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLHthcGk6YX0pO3RoaXMu ZGF0YT1ifTtFeHQuZXh0ZW5kKEV4dC5kYXRhLk1lbW9yeVByb3h5LEV4dC5kYXRh LkRhdGFQcm94eSx7ZG9SZXF1ZXN0OmZ1bmN0aW9uKGIsYyxhLGQsaCxpLGope2E9 YXx8e307dmFyIGs7dHJ5e2s9ZC5yZWFkUmVjb3Jkcyh0aGlzLmRhdGEpfWNhdGNo KGcpe3RoaXMuZmlyZUV2ZW50KCJsb2FkZXhjZXB0aW9uIix0aGlzLG51bGwsaixn KTt0aGlzLmZpcmVFdmVudCgiZXhjZXB0aW9uIix0aGlzLCJyZXNwb25zZSIsYixq LG51bGwsZyk7aC5jYWxsKGksbnVsbCxqLGZhbHNlKTtyZXR1cm59aC5jYWxsKGks ayxqLHRydWUpfX0pO0V4dC5kYXRhLlR5cGVzPW5ldyBmdW5jdGlvbigpe3ZhciBh PUV4dC5kYXRhLlNvcnRUeXBlcztFeHQuYXBwbHkodGhpcyx7c3RyaXBSZTovW1wk LCVdL2csQVVUTzp7Y29udmVydDpmdW5jdGlvbihiKXtyZXR1cm4gYn0sc29ydFR5 cGU6YS5ub25lLHR5cGU6ImF1dG8ifSxTVFJJTkc6e2NvbnZlcnQ6ZnVuY3Rpb24o Yil7cmV0dXJuKGI9PT11bmRlZmluZWR8fGI9PT1udWxsKT8iIjpTdHJpbmcoYil9 LHNvcnRUeXBlOmEuYXNVQ1N0cmluZyx0eXBlOiJzdHJpbmcifSxJTlQ6e2NvbnZl cnQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIhPT11bmRlZmluZWQmJmIhPT1udWxsJiZi IT09IiI/cGFyc2VJbnQoU3RyaW5nKGIpLnJlcGxhY2UoRXh0LmRhdGEuVHlwZXMu c3RyaXBSZSwiIiksMTApOih0aGlzLnVzZU51bGw/bnVsbDowKX0sc29ydFR5cGU6 YS5ub25lLHR5cGU6ImludCJ9LEZMT0FUOntjb252ZXJ0OmZ1bmN0aW9uKGIpe3Jl dHVybiBiIT09dW5kZWZpbmVkJiZiIT09bnVsbCYmYiE9PSIiP3BhcnNlRmxvYXQo U3RyaW5nKGIpLnJlcGxhY2UoRXh0LmRhdGEuVHlwZXMuc3RyaXBSZSwiIiksMTAp Oih0aGlzLnVzZU51bGw/bnVsbDowKX0sc29ydFR5cGU6YS5ub25lLHR5cGU6ImZs b2F0In0sQk9PTDp7Y29udmVydDpmdW5jdGlvbihiKXtyZXR1cm4gYj09PXRydWV8 fGI9PT0idHJ1ZSJ8fGI9PTF9LHNvcnRUeXBlOmEubm9uZSx0eXBlOiJib29sIn0s REFURTp7Y29udmVydDpmdW5jdGlvbihjKXt2YXIgZD10aGlzLmRhdGVGb3JtYXQ7 aWYoIWMpe3JldHVybiBudWxsfWlmKEV4dC5pc0RhdGUoYykpe3JldHVybiBjfWlm KGQpe2lmKGQ9PSJ0aW1lc3RhbXAiKXtyZXR1cm4gbmV3IERhdGUoYyoxMDAwKX1p ZihkPT0idGltZSIpe3JldHVybiBuZXcgRGF0ZShwYXJzZUludChjLDEwKSl9cmV0 dXJuIERhdGUucGFyc2VEYXRlKGMsZCl9dmFyIGI9RGF0ZS5wYXJzZShjKTtyZXR1 cm4gYj9uZXcgRGF0ZShiKTpudWxsfSxzb3J0VHlwZTphLmFzRGF0ZSx0eXBlOiJk YXRlIn19KTtFeHQuYXBwbHkodGhpcyx7Qk9PTEVBTjp0aGlzLkJPT0wsSU5URUdF Ujp0aGlzLklOVCxOVU1CRVI6dGhpcy5GTE9BVH0pfTtFeHQuZGF0YS5Kc29uV3Jp dGVyPUV4dC5leHRlbmQoRXh0LmRhdGEuRGF0YVdyaXRlcix7ZW5jb2RlOnRydWUs ZW5jb2RlRGVsZXRlOmZhbHNlLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe0V4dC5k YXRhLkpzb25Xcml0ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMs YSl9LHJlbmRlcjpmdW5jdGlvbihjLGQsYil7aWYodGhpcy5lbmNvZGU9PT10cnVl KXtFeHQuYXBwbHkoYyxkKTtjW3RoaXMubWV0YS5yb290XT1FeHQuZW5jb2RlKGIp fWVsc2V7dmFyIGE9RXh0LmFwcGx5KHt9LGQpO2FbdGhpcy5tZXRhLnJvb3RdPWI7 Yy5qc29uRGF0YT1hfX0sY3JlYXRlUmVjb3JkOmZ1bmN0aW9uKGEpe3JldHVybiB0 aGlzLnRvSGFzaChhKX0sdXBkYXRlUmVjb3JkOmZ1bmN0aW9uKGEpe3JldHVybiB0 aGlzLnRvSGFzaChhKX0sZGVzdHJveVJlY29yZDpmdW5jdGlvbihiKXtpZih0aGlz LmVuY29kZURlbGV0ZSl7dmFyIGE9e307YVt0aGlzLm1ldGEuaWRQcm9wZXJ0eV09 Yi5pZDtyZXR1cm4gYX1lbHNle3JldHVybiBiLmlkfX19KTtFeHQuZGF0YS5Kc29u UmVhZGVyPWZ1bmN0aW9uKGEsYil7YT1hfHx7fTtFeHQuYXBwbHlJZihhLHtpZFBy b3BlcnR5OiJpZCIsc3VjY2Vzc1Byb3BlcnR5OiJzdWNjZXNzIix0b3RhbFByb3Bl cnR5OiJ0b3RhbCJ9KTtFeHQuZGF0YS5Kc29uUmVhZGVyLnN1cGVyY2xhc3MuY29u c3RydWN0b3IuY2FsbCh0aGlzLGEsYnx8YS5maWVsZHMpfTtFeHQuZXh0ZW5kKEV4 dC5kYXRhLkpzb25SZWFkZXIsRXh0LmRhdGEuRGF0YVJlYWRlcix7cmVhZDpmdW5j dGlvbihhKXt2YXIgYj1hLnJlc3BvbnNlVGV4dDt2YXIgYz1FeHQuZGVjb2RlKGIp O2lmKCFjKXt0aHJvdyB7bWVzc2FnZToiSnNvblJlYWRlci5yZWFkOiBKc29uIG9i amVjdCBub3QgZm91bmQifX1yZXR1cm4gdGhpcy5yZWFkUmVjb3JkcyhjKX0scmVh ZFJlc3BvbnNlOmZ1bmN0aW9uKGUsYil7dmFyIGg9KGIucmVzcG9uc2VUZXh0IT09 dW5kZWZpbmVkKT9FeHQuZGVjb2RlKGIucmVzcG9uc2VUZXh0KTpiO2lmKCFoKXt0 aHJvdyBuZXcgRXh0LmRhdGEuSnNvblJlYWRlci5FcnJvcigicmVzcG9uc2UiKX12 YXIgYT10aGlzLmdldFJvb3QoaCksZz10aGlzLmdldFN1Y2Nlc3MoaCk7aWYoZyYm ZT09PUV4dC5kYXRhLkFwaS5hY3Rpb25zLmNyZWF0ZSl7dmFyIGQ9RXh0LmlzRGVm aW5lZChhKTtpZihkJiZFeHQuaXNFbXB0eShhKSl7dGhyb3cgbmV3IEV4dC5kYXRh Lkpzb25SZWFkZXIuRXJyb3IoInJvb3QtZW1wdHkiLHRoaXMubWV0YS5yb290KX1l bHNle2lmKCFkKXt0aHJvdyBuZXcgRXh0LmRhdGEuSnNvblJlYWRlci5FcnJvcigi cm9vdC11bmRlZmluZWQtcmVzcG9uc2UiLHRoaXMubWV0YS5yb290KX19fXZhciBj PW5ldyBFeHQuZGF0YS5SZXNwb25zZSh7YWN0aW9uOmUsc3VjY2VzczpnLGRhdGE6 KGEpP3RoaXMuZXh0cmFjdERhdGEoYSxmYWxzZSk6W10sbWVzc2FnZTp0aGlzLmdl dE1lc3NhZ2UoaCkscmF3Omh9KTtpZihFeHQuaXNFbXB0eShjLnN1Y2Nlc3MpKXt0 aHJvdyBuZXcgRXh0LmRhdGEuSnNvblJlYWRlci5FcnJvcigic3VjY2Vzc1Byb3Bl cnR5LXJlc3BvbnNlIix0aGlzLm1ldGEuc3VjY2Vzc1Byb3BlcnR5KX1yZXR1cm4g Y30scmVhZFJlY29yZHM6ZnVuY3Rpb24oYSl7dGhpcy5qc29uRGF0YT1hO2lmKGEu bWV0YURhdGEpe3RoaXMub25NZXRhQ2hhbmdlKGEubWV0YURhdGEpfXZhciBtPXRo aXMubWV0YSxoPXRoaXMucmVjb3JkVHlwZSxiPWgucHJvdG90eXBlLmZpZWxkcyxs PWIuaXRlbXMsaT1iLmxlbmd0aCxqO3ZhciBnPXRoaXMuZ2V0Um9vdChhKSxlPWcu bGVuZ3RoLGQ9ZSxrPXRydWU7aWYobS50b3RhbFByb3BlcnR5KXtqPXBhcnNlSW50 KHRoaXMuZ2V0VG90YWwoYSksMTApO2lmKCFpc05hTihqKSl7ZD1qfX1pZihtLnN1 Y2Nlc3NQcm9wZXJ0eSl7aj10aGlzLmdldFN1Y2Nlc3MoYSk7aWYoaj09PWZhbHNl fHxqPT09ImZhbHNlIil7az1mYWxzZX19cmV0dXJue3N1Y2Nlc3M6ayxyZWNvcmRz OnRoaXMuZXh0cmFjdERhdGEoZyx0cnVlKSx0b3RhbFJlY29yZHM6ZH19LGJ1aWxk RXh0cmFjdG9yczpmdW5jdGlvbigpe2lmKHRoaXMuZWYpe3JldHVybn12YXIgbD10 aGlzLm1ldGEsaD10aGlzLnJlY29yZFR5cGUsZT1oLnByb3RvdHlwZS5maWVsZHMs az1lLml0ZW1zLGo9ZS5sZW5ndGg7aWYobC50b3RhbFByb3BlcnR5KXt0aGlzLmdl dFRvdGFsPXRoaXMuY3JlYXRlQWNjZXNzb3IobC50b3RhbFByb3BlcnR5KX1pZihs LnN1Y2Nlc3NQcm9wZXJ0eSl7dGhpcy5nZXRTdWNjZXNzPXRoaXMuY3JlYXRlQWNj ZXNzb3IobC5zdWNjZXNzUHJvcGVydHkpfWlmKGwubWVzc2FnZVByb3BlcnR5KXt0 aGlzLmdldE1lc3NhZ2U9dGhpcy5jcmVhdGVBY2Nlc3NvcihsLm1lc3NhZ2VQcm9w ZXJ0eSl9dGhpcy5nZXRSb290PWwucm9vdD90aGlzLmNyZWF0ZUFjY2Vzc29yKGwu cm9vdCk6ZnVuY3Rpb24oZyl7cmV0dXJuIGd9O2lmKGwuaWR8fGwuaWRQcm9wZXJ0 eSl7dmFyIGQ9dGhpcy5jcmVhdGVBY2Nlc3NvcihsLmlkfHxsLmlkUHJvcGVydHkp O3RoaXMuZ2V0SWQ9ZnVuY3Rpb24oaSl7dmFyIGc9ZChpKTtyZXR1cm4oZz09PXVu ZGVmaW5lZHx8Zz09PSIiKT9udWxsOmd9fWVsc2V7dGhpcy5nZXRJZD1mdW5jdGlv bigpe3JldHVybiBudWxsfX12YXIgYz1bXTtmb3IodmFyIGI9MDtiPGo7YisrKXtl PWtbYl07dmFyIGE9KGUubWFwcGluZyE9PXVuZGVmaW5lZCYmZS5tYXBwaW5nIT09 bnVsbCk/ZS5tYXBwaW5nOmUubmFtZTtjLnB1c2godGhpcy5jcmVhdGVBY2Nlc3Nv cihhKSl9dGhpcy5lZj1jfSxzaW1wbGVBY2Nlc3M6ZnVuY3Rpb24oYixhKXtyZXR1 cm4gYlthXX0sY3JlYXRlQWNjZXNzb3I6ZnVuY3Rpb24oKXt2YXIgYT0vW1xbXC5d LztyZXR1cm4gZnVuY3Rpb24oYyl7aWYoRXh0LmlzRW1wdHkoYykpe3JldHVybiBF eHQuZW1wdHlGbn1pZihFeHQuaXNGdW5jdGlvbihjKSl7cmV0dXJuIGN9dmFyIGI9 U3RyaW5nKGMpLnNlYXJjaChhKTtpZihiPj0wKXtyZXR1cm4gbmV3IEZ1bmN0aW9u KCJvYmoiLCJyZXR1cm4gb2JqIisoYj4wPyIuIjoiIikrYyl9cmV0dXJuIGZ1bmN0 aW9uKGQpe3JldHVybiBkW2NdfX19KCksZXh0cmFjdFZhbHVlczpmdW5jdGlvbiho LGQsYSl7dmFyIGcsYz17fTtmb3IodmFyIGU9MDtlPGE7ZSsrKXtnPWRbZV07dmFy IGI9dGhpcy5lZltlXShoKTtjW2cubmFtZV09Zy5jb252ZXJ0KChiIT09dW5kZWZp bmVkKT9iOmcuZGVmYXVsdFZhbHVlLGgpfXJldHVybiBjfX0pO0V4dC5kYXRhLkpz b25SZWFkZXIuRXJyb3I9RXh0LmV4dGVuZChFeHQuRXJyb3Ise2NvbnN0cnVjdG9y OmZ1bmN0aW9uKGIsYSl7dGhpcy5hcmc9YTtFeHQuRXJyb3IuY2FsbCh0aGlzLGIp fSxuYW1lOiJFeHQuZGF0YS5Kc29uUmVhZGVyIn0pO0V4dC5hcHBseShFeHQuZGF0 YS5Kc29uUmVhZGVyLkVycm9yLnByb3RvdHlwZSx7bGFuZzp7cmVzcG9uc2U6IkFu IGVycm9yIG9jY3VycmVkIHdoaWxlIGpzb24tZGVjb2RpbmcgeW91ciBzZXJ2ZXIg cmVzcG9uc2UiLCJzdWNjZXNzUHJvcGVydHktcmVzcG9uc2UiOidDb3VsZCBub3Qg bG9jYXRlIHlvdXIgInN1Y2Nlc3NQcm9wZXJ0eSIgaW4geW91ciBzZXJ2ZXIgcmVz cG9uc2UuICBQbGVhc2UgcmV2aWV3IHlvdXIgSnNvblJlYWRlciBjb25maWcgdG8g ZW5zdXJlIHRoZSBjb25maWctcHJvcGVydHkgInN1Y2Nlc3NQcm9wZXJ0eSIgbWF0 Y2hlcyB0aGUgcHJvcGVydHkgaW4geW91ciBzZXJ2ZXItcmVzcG9uc2UuICBTZWUg dGhlIEpzb25SZWFkZXIgZG9jcy4nLCJyb290LXVuZGVmaW5lZC1jb25maWciOidZ b3VyIEpzb25SZWFkZXIgd2FzIGNvbmZpZ3VyZWQgd2l0aG91dCBhICJyb290IiBw cm9wZXJ0eS4gIFBsZWFzZSByZXZpZXcgeW91ciBKc29uUmVhZGVyIGNvbmZpZyBh bmQgbWFrZSBzdXJlIHRvIGRlZmluZSB0aGUgcm9vdCBwcm9wZXJ0eS4gIFNlZSB0 aGUgSnNvblJlYWRlciBkb2NzLicsImlkUHJvcGVydHktdW5kZWZpbmVkIjonWW91 ciBKc29uUmVhZGVyIHdhcyBjb25maWd1cmVkIHdpdGhvdXQgYW4gImlkUHJvcGVy dHkiICBQbGVhc2UgcmV2aWV3IHlvdXIgSnNvblJlYWRlciBjb25maWd1cmF0aW9u IGFuZCBlbnN1cmUgdGhlICJpZFByb3BlcnR5IiBpcyBzZXQgKGUuZy46ICJpZCIp LiAgU2VlIHRoZSBKc29uUmVhZGVyIGRvY3MuJywicm9vdC1lbXB0eSI6J0RhdGEg d2FzIGV4cGVjdGVkIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIgaW4gdGhl ICJyb290IiBwcm9wZXJ0eSBvZiB0aGUgcmVzcG9uc2UuICBQbGVhc2UgcmV2aWV3 IHlvdXIgSnNvblJlYWRlciBjb25maWd1cmF0aW9uIHRvIGVuc3VyZSB0aGUgInJv b3QiIHByb3BlcnR5IG1hdGNoZXMgdGhhdCByZXR1cm5lZCBpbiB0aGUgc2VydmVy LXJlc3BvbnNlLiAgU2VlIEpzb25SZWFkZXIgZG9jcy4nfX0pO0V4dC5kYXRhLkFy cmF5UmVhZGVyPUV4dC5leHRlbmQoRXh0LmRhdGEuSnNvblJlYWRlcix7cmVhZFJl Y29yZHM6ZnVuY3Rpb24ocil7dGhpcy5hcnJheURhdGE9cjt2YXIgbD10aGlzLm1l dGEsZD1sP0V4dC5udW0obC5pZEluZGV4LGwuaWQpOm51bGwsYj10aGlzLnJlY29y ZFR5cGUscT1iLnByb3RvdHlwZS5maWVsZHMsej1bXSxlPXRydWUsZzt2YXIgdT10 aGlzLmdldFJvb3Qocik7Zm9yKHZhciB5PTAsQT11Lmxlbmd0aDt5PEE7eSsrKXt2 YXIgdD11W3ldLGE9e30scD0oKGR8fGQ9PT0wKSYmdFtkXSE9PXVuZGVmaW5lZCYm dFtkXSE9PSIiP3RbZF06bnVsbCk7Zm9yKHZhciB4PTAsbT1xLmxlbmd0aDt4PG07 eCsrKXt2YXIgQj1xLml0ZW1zW3hdLHc9Qi5tYXBwaW5nIT09dW5kZWZpbmVkJiZC Lm1hcHBpbmchPT1udWxsP0IubWFwcGluZzp4O2c9dFt3XSE9PXVuZGVmaW5lZD90 W3ddOkIuZGVmYXVsdFZhbHVlO2c9Qi5jb252ZXJ0KGcsdCk7YVtCLm5hbWVdPWd9 dmFyIGM9bmV3IGIoYSxwKTtjLmpzb249dDt6W3oubGVuZ3RoXT1jfXZhciBoPXou bGVuZ3RoO2lmKGwudG90YWxQcm9wZXJ0eSl7Zz1wYXJzZUludCh0aGlzLmdldFRv dGFsKHIpLDEwKTtpZighaXNOYU4oZykpe2g9Z319aWYobC5zdWNjZXNzUHJvcGVy dHkpe2c9dGhpcy5nZXRTdWNjZXNzKHIpO2lmKGc9PT1mYWxzZXx8Zz09PSJmYWxz ZSIpe2U9ZmFsc2V9fXJldHVybntzdWNjZXNzOmUscmVjb3Jkczp6LHRvdGFsUmVj b3JkczpofX19KTtFeHQuZGF0YS5BcnJheVN0b3JlPUV4dC5leHRlbmQoRXh0LmRh dGEuU3RvcmUse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe0V4dC5kYXRhLkFycmF5 U3RvcmUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsRXh0LmFwcGx5 KGEse3JlYWRlcjpuZXcgRXh0LmRhdGEuQXJyYXlSZWFkZXIoYSl9KSl9LGxvYWRE YXRhOmZ1bmN0aW9uKGUsYil7aWYodGhpcy5leHBhbmREYXRhPT09dHJ1ZSl7dmFy IGQ9W107Zm9yKHZhciBjPTAsYT1lLmxlbmd0aDtjPGE7YysrKXtkW2QubGVuZ3Ro XT1bZVtjXV19ZT1kfUV4dC5kYXRhLkFycmF5U3RvcmUuc3VwZXJjbGFzcy5sb2Fk RGF0YS5jYWxsKHRoaXMsZSxiKX19KTtFeHQucmVnKCJhcnJheXN0b3JlIixFeHQu ZGF0YS5BcnJheVN0b3JlKTtFeHQuZGF0YS5TaW1wbGVTdG9yZT1FeHQuZGF0YS5B cnJheVN0b3JlO0V4dC5yZWcoInNpbXBsZXN0b3JlIixFeHQuZGF0YS5TaW1wbGVT dG9yZSk7RXh0LmRhdGEuSnNvblN0b3JlPUV4dC5leHRlbmQoRXh0LmRhdGEuU3Rv cmUse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe0V4dC5kYXRhLkpzb25TdG9yZS5z dXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxFeHQuYXBwbHkoYSx7cmVh ZGVyOm5ldyBFeHQuZGF0YS5Kc29uUmVhZGVyKGEpfSkpfX0pO0V4dC5yZWcoImpz b25zdG9yZSIsRXh0LmRhdGEuSnNvblN0b3JlKTtFeHQuZGF0YS5YbWxXcml0ZXI9 ZnVuY3Rpb24oYSl7RXh0LmRhdGEuWG1sV3JpdGVyLnN1cGVyY2xhc3MuY29uc3Ry dWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudHBsPSh0eXBlb2YodGhp cy50cGwpPT09InN0cmluZyIpP25ldyBFeHQuWFRlbXBsYXRlKHRoaXMudHBsKS5j b21waWxlKCk6dGhpcy50cGwuY29tcGlsZSgpfTtFeHQuZXh0ZW5kKEV4dC5kYXRh LlhtbFdyaXRlcixFeHQuZGF0YS5EYXRhV3JpdGVyLHtkb2N1bWVudFJvb3Q6Inhy ZXF1ZXN0Iixmb3JjZURvY3VtZW50Um9vdDpmYWxzZSxyb290OiJyZWNvcmRzIix4 bWxWZXJzaW9uOiIxLjAiLHhtbEVuY29kaW5nOiJJU08tODg1OS0xNSIsdHBsOic8 dHBsIGZvcj0iLiI+PFx1MDAzZnhtbCB2ZXJzaW9uPSJ7dmVyc2lvbn0iIGVuY29k aW5nPSJ7ZW5jb2Rpbmd9Ilx1MDAzZj48dHBsIGlmPSJkb2N1bWVudFJvb3QiPjx7 ZG9jdW1lbnRSb290fT48dHBsIGZvcj0iYmFzZVBhcmFtcyI+PHRwbCBmb3I9Ii4i Pjx7bmFtZX0+e3ZhbHVlfTwve25hbWV9PjwvdHBsPjwvdHBsPjwvdHBsPjx0cGwg aWY9InJlY29yZHMubGVuZ3RoJmd0OzEiPjx7cm9vdH0+PC90cGw+PHRwbCBmb3I9 InJlY29yZHMiPjx7cGFyZW50LnJlY29yZH0+PHRwbCBmb3I9Ii4iPjx7bmFtZX0+ e3ZhbHVlfTwve25hbWV9PjwvdHBsPjwve3BhcmVudC5yZWNvcmR9PjwvdHBsPjx0 cGwgaWY9InJlY29yZHMubGVuZ3RoJmd0OzEiPjwve3Jvb3R9PjwvdHBsPjx0cGwg aWY9ImRvY3VtZW50Um9vdCI+PC97ZG9jdW1lbnRSb290fT48L3RwbD48L3RwbD4n LHJlbmRlcjpmdW5jdGlvbihiLGMsYSl7Yz10aGlzLnRvQXJyYXkoYyk7Yi54bWxE YXRhPXRoaXMudHBsLmFwcGx5VGVtcGxhdGUoe3ZlcnNpb246dGhpcy54bWxWZXJz aW9uLGVuY29kaW5nOnRoaXMueG1sRW5jb2RpbmcsZG9jdW1lbnRSb290OihjLmxl bmd0aD4wfHx0aGlzLmZvcmNlRG9jdW1lbnRSb290PT09dHJ1ZSk/dGhpcy5kb2N1 bWVudFJvb3Q6ZmFsc2UscmVjb3JkOnRoaXMubWV0YS5yZWNvcmQscm9vdDp0aGlz LnJvb3QsYmFzZVBhcmFtczpjLHJlY29yZHM6KEV4dC5pc0FycmF5KGFbMF0pKT9h OlthXX0pfSxjcmVhdGVSZWNvcmQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudG9B cnJheSh0aGlzLnRvSGFzaChhKSl9LHVwZGF0ZVJlY29yZDpmdW5jdGlvbihhKXty ZXR1cm4gdGhpcy50b0FycmF5KHRoaXMudG9IYXNoKGEpKX0sZGVzdHJveVJlY29y ZDpmdW5jdGlvbihiKXt2YXIgYT17fTthW3RoaXMubWV0YS5pZFByb3BlcnR5XT1i LmlkO3JldHVybiB0aGlzLnRvQXJyYXkoYSl9fSk7RXh0LmRhdGEuWG1sUmVhZGVy PWZ1bmN0aW9uKGEsYil7YT1hfHx7fTtFeHQuYXBwbHlJZihhLHtpZFByb3BlcnR5 OmEuaWRQcm9wZXJ0eXx8YS5pZFBhdGh8fGEuaWQsc3VjY2Vzc1Byb3BlcnR5OmEu c3VjY2Vzc1Byb3BlcnR5fHxhLnN1Y2Nlc3N9KTtFeHQuZGF0YS5YbWxSZWFkZXIu c3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSxifHxhLmZpZWxkcyl9 O0V4dC5leHRlbmQoRXh0LmRhdGEuWG1sUmVhZGVyLEV4dC5kYXRhLkRhdGFSZWFk ZXIse3JlYWQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXNwb25zZVhNTDtpZighYil7 dGhyb3cge21lc3NhZ2U6IlhtbFJlYWRlci5yZWFkOiBYTUwgRG9jdW1lbnQgbm90 IGF2YWlsYWJsZSJ9fXJldHVybiB0aGlzLnJlYWRSZWNvcmRzKGIpfSxyZWFkUmVj b3JkczpmdW5jdGlvbihkKXt0aGlzLnhtbERhdGE9ZDt2YXIgYT1kLmRvY3VtZW50 RWxlbWVudHx8ZCxjPUV4dC5Eb21RdWVyeSxnPTAsZT10cnVlO2lmKHRoaXMubWV0 YS50b3RhbFByb3BlcnR5KXtnPXRoaXMuZ2V0VG90YWwoYSwwKX1pZih0aGlzLm1l dGEuc3VjY2Vzc1Byb3BlcnR5KXtlPXRoaXMuZ2V0U3VjY2VzcyhhKX12YXIgYj10 aGlzLmV4dHJhY3REYXRhKGMuc2VsZWN0KHRoaXMubWV0YS5yZWNvcmQsYSksdHJ1 ZSk7cmV0dXJue3N1Y2Nlc3M6ZSxyZWNvcmRzOmIsdG90YWxSZWNvcmRzOmd8fGIu bGVuZ3RofX0scmVhZFJlc3BvbnNlOmZ1bmN0aW9uKGcsYil7dmFyIGU9RXh0LkRv bVF1ZXJ5LGg9Yi5yZXNwb25zZVhNTCxhPWguZG9jdW1lbnRFbGVtZW50fHxoO3Zh ciBjPW5ldyBFeHQuZGF0YS5SZXNwb25zZSh7YWN0aW9uOmcsc3VjY2Vzczp0aGlz LmdldFN1Y2Nlc3MoYSksbWVzc2FnZTp0aGlzLmdldE1lc3NhZ2UoYSksZGF0YTp0 aGlzLmV4dHJhY3REYXRhKGUuc2VsZWN0KHRoaXMubWV0YS5yZWNvcmQsYSl8fGUu c2VsZWN0KHRoaXMubWV0YS5yb290LGEpLGZhbHNlKSxyYXc6aH0pO2lmKEV4dC5p c0VtcHR5KGMuc3VjY2Vzcykpe3Rocm93IG5ldyBFeHQuZGF0YS5EYXRhUmVhZGVy LkVycm9yKCJzdWNjZXNzUHJvcGVydHktcmVzcG9uc2UiLHRoaXMubWV0YS5zdWNj ZXNzUHJvcGVydHkpfWlmKGc9PT1FeHQuZGF0YS5BcGkuYWN0aW9ucy5jcmVhdGUp e3ZhciBkPUV4dC5pc0RlZmluZWQoYy5kYXRhKTtpZihkJiZFeHQuaXNFbXB0eShj LmRhdGEpKXt0aHJvdyBuZXcgRXh0LmRhdGEuSnNvblJlYWRlci5FcnJvcigicm9v dC1lbXB0eSIsdGhpcy5tZXRhLnJvb3QpfWVsc2V7aWYoIWQpe3Rocm93IG5ldyBF eHQuZGF0YS5Kc29uUmVhZGVyLkVycm9yKCJyb290LXVuZGVmaW5lZC1yZXNwb25z ZSIsdGhpcy5tZXRhLnJvb3QpfX19cmV0dXJuIGN9LGdldFN1Y2Nlc3M6ZnVuY3Rp b24oKXtyZXR1cm4gdHJ1ZX0sYnVpbGRFeHRyYWN0b3JzOmZ1bmN0aW9uKCl7aWYo dGhpcy5lZil7cmV0dXJufXZhciBsPXRoaXMubWV0YSxoPXRoaXMucmVjb3JkVHlw ZSxlPWgucHJvdG90eXBlLmZpZWxkcyxrPWUuaXRlbXMsaj1lLmxlbmd0aDtpZihs LnRvdGFsUHJvcGVydHkpe3RoaXMuZ2V0VG90YWw9dGhpcy5jcmVhdGVBY2Nlc3Nv cihsLnRvdGFsUHJvcGVydHkpfWlmKGwuc3VjY2Vzc1Byb3BlcnR5KXt0aGlzLmdl dFN1Y2Nlc3M9dGhpcy5jcmVhdGVBY2Nlc3NvcihsLnN1Y2Nlc3NQcm9wZXJ0eSl9 aWYobC5tZXNzYWdlUHJvcGVydHkpe3RoaXMuZ2V0TWVzc2FnZT10aGlzLmNyZWF0 ZUFjY2Vzc29yKGwubWVzc2FnZVByb3BlcnR5KX10aGlzLmdldFJvb3Q9ZnVuY3Rp b24oZyl7cmV0dXJuKCFFeHQuaXNFbXB0eShnW3RoaXMubWV0YS5yZWNvcmRdKSk/ Z1t0aGlzLm1ldGEucmVjb3JkXTpnW3RoaXMubWV0YS5yb290XX07aWYobC5pZFBh dGh8fGwuaWRQcm9wZXJ0eSl7dmFyIGQ9dGhpcy5jcmVhdGVBY2Nlc3NvcihsLmlk UGF0aHx8bC5pZFByb3BlcnR5KTt0aGlzLmdldElkPWZ1bmN0aW9uKGcpe3ZhciBp PWQoZyl8fGcuaWQ7cmV0dXJuKGk9PT11bmRlZmluZWR8fGk9PT0iIik/bnVsbDpp fX1lbHNle3RoaXMuZ2V0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH19dmFyIGM9 W107Zm9yKHZhciBiPTA7YjxqO2IrKyl7ZT1rW2JdO3ZhciBhPShlLm1hcHBpbmch PT11bmRlZmluZWQmJmUubWFwcGluZyE9PW51bGwpP2UubWFwcGluZzplLm5hbWU7 Yy5wdXNoKHRoaXMuY3JlYXRlQWNjZXNzb3IoYSkpfXRoaXMuZWY9Y30sY3JlYXRl QWNjZXNzb3I6ZnVuY3Rpb24oKXt2YXIgYT1FeHQuRG9tUXVlcnk7cmV0dXJuIGZ1 bmN0aW9uKGIpe2lmKEV4dC5pc0Z1bmN0aW9uKGIpKXtyZXR1cm4gYn1zd2l0Y2go Yil7Y2FzZSB0aGlzLm1ldGEudG90YWxQcm9wZXJ0eTpyZXR1cm4gZnVuY3Rpb24o YyxkKXtyZXR1cm4gYS5zZWxlY3ROdW1iZXIoYixjLGQpfTticmVhaztjYXNlIHRo aXMubWV0YS5zdWNjZXNzUHJvcGVydHk6cmV0dXJuIGZ1bmN0aW9uKGQsZSl7dmFy IGM9YS5zZWxlY3RWYWx1ZShiLGQsdHJ1ZSk7dmFyIGc9YyE9PWZhbHNlJiZjIT09 ImZhbHNlIjtyZXR1cm4gZ307YnJlYWs7ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24o YyxkKXtyZXR1cm4gYS5zZWxlY3RWYWx1ZShiLGMsZCl9O2JyZWFrfX19KCksZXh0 cmFjdFZhbHVlczpmdW5jdGlvbihoLGQsYSl7dmFyIGcsYz17fTtmb3IodmFyIGU9 MDtlPGE7ZSsrKXtnPWRbZV07dmFyIGI9dGhpcy5lZltlXShoKTtjW2cubmFtZV09 Zy5jb252ZXJ0KChiIT09dW5kZWZpbmVkKT9iOmcuZGVmYXVsdFZhbHVlLGgpfXJl dHVybiBjfX0pO0V4dC5kYXRhLlhtbFN0b3JlPUV4dC5leHRlbmQoRXh0LmRhdGEu U3RvcmUse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe0V4dC5kYXRhLlhtbFN0b3Jl LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLEV4dC5hcHBseShhLHty ZWFkZXI6bmV3IEV4dC5kYXRhLlhtbFJlYWRlcihhKX0pKX19KTtFeHQucmVnKCJ4 bWxzdG9yZSIsRXh0LmRhdGEuWG1sU3RvcmUpO0V4dC5kYXRhLkdyb3VwaW5nU3Rv cmU9RXh0LmV4dGVuZChFeHQuZGF0YS5TdG9yZSx7Y29uc3RydWN0b3I6ZnVuY3Rp b24oZCl7ZD1kfHx7fTt0aGlzLmhhc011bHRpU29ydD10cnVlO3RoaXMubXVsdGlT b3J0SW5mbz10aGlzLm11bHRpU29ydEluZm98fHtzb3J0ZXJzOltdfTt2YXIgZT10 aGlzLm11bHRpU29ydEluZm8uc29ydGVycyxjPWQuZ3JvdXBGaWVsZHx8dGhpcy5n cm91cEZpZWxkLGI9ZC5zb3J0SW5mb3x8dGhpcy5zb3J0SW5mbyxhPWQuZ3JvdXBE aXJ8fHRoaXMuZ3JvdXBEaXI7aWYoYyl7ZS5wdXNoKHtmaWVsZDpjLGRpcmVjdGlv bjphfSl9aWYoYil7ZS5wdXNoKGIpfUV4dC5kYXRhLkdyb3VwaW5nU3RvcmUuc3Vw ZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZCk7dGhpcy5hZGRFdmVudHMo Imdyb3VwY2hhbmdlIik7dGhpcy5hcHBseUdyb3VwRmllbGQoKX0scmVtb3RlR3Jv dXA6ZmFsc2UsZ3JvdXBPblNvcnQ6ZmFsc2UsZ3JvdXBEaXI6IkFTQyIsY2xlYXJH cm91cGluZzpmdW5jdGlvbigpe3RoaXMuZ3JvdXBGaWVsZD1mYWxzZTtpZih0aGlz LnJlbW90ZUdyb3VwKXtpZih0aGlzLmJhc2VQYXJhbXMpe2RlbGV0ZSB0aGlzLmJh c2VQYXJhbXMuZ3JvdXBCeTtkZWxldGUgdGhpcy5iYXNlUGFyYW1zLmdyb3VwRGly fXZhciBhPXRoaXMubGFzdE9wdGlvbnM7aWYoYSYmYS5wYXJhbXMpe2RlbGV0ZSBh LnBhcmFtcy5ncm91cEJ5O2RlbGV0ZSBhLnBhcmFtcy5ncm91cERpcn10aGlzLnJl bG9hZCgpfWVsc2V7dGhpcy5zb3J0KCk7dGhpcy5maXJlRXZlbnQoImRhdGFjaGFu Z2VkIix0aGlzKX19LGdyb3VwQnk6ZnVuY3Rpb24oZSxhLGQpe2Q9ZD8oU3RyaW5n KGQpLnRvVXBwZXJDYXNlKCk9PSJERVNDIj8iREVTQyI6IkFTQyIpOnRoaXMuZ3Jv dXBEaXI7aWYodGhpcy5ncm91cEZpZWxkPT1lJiZ0aGlzLmdyb3VwRGlyPT1kJiYh YSl7cmV0dXJufXZhciBjPXRoaXMubXVsdGlTb3J0SW5mby5zb3J0ZXJzO2lmKGMu bGVuZ3RoPjAmJmNbMF0uZmllbGQ9PXRoaXMuZ3JvdXBGaWVsZCl7Yy5zaGlmdCgp fXRoaXMuZ3JvdXBGaWVsZD1lO3RoaXMuZ3JvdXBEaXI9ZDt0aGlzLmFwcGx5R3Jv dXBGaWVsZCgpO3ZhciBiPWZ1bmN0aW9uKCl7dGhpcy5maXJlRXZlbnQoImdyb3Vw Y2hhbmdlIix0aGlzLHRoaXMuZ2V0R3JvdXBTdGF0ZSgpKX07aWYodGhpcy5ncm91 cE9uU29ydCl7dGhpcy5zb3J0KGUsZCk7Yi5jYWxsKHRoaXMpO3JldHVybn1pZih0 aGlzLnJlbW90ZUdyb3VwKXt0aGlzLm9uKCJsb2FkIixiLHRoaXMse3NpbmdsZTp0 cnVlfSk7dGhpcy5yZWxvYWQoKX1lbHNle3RoaXMuc29ydChjKTtiLmNhbGwodGhp cyl9fSxzb3J0OmZ1bmN0aW9uKGgsYyl7aWYodGhpcy5yZW1vdGVTb3J0KXtyZXR1 cm4gRXh0LmRhdGEuR3JvdXBpbmdTdG9yZS5zdXBlcmNsYXNzLnNvcnQuY2FsbCh0 aGlzLGgsYyl9dmFyIGc9W107aWYoRXh0LmlzQXJyYXkoYXJndW1lbnRzWzBdKSl7 Zz1hcmd1bWVudHNbMF19ZWxzZXtpZihoPT11bmRlZmluZWQpe2c9dGhpcy5zb3J0 SW5mbz9bdGhpcy5zb3J0SW5mb106W119ZWxzZXt2YXIgZT10aGlzLmZpZWxkcy5n ZXQoaCk7aWYoIWUpe3JldHVybiBmYWxzZX12YXIgYj1lLm5hbWUsYT10aGlzLnNv cnRJbmZvfHxudWxsLGQ9dGhpcy5zb3J0VG9nZ2xlP3RoaXMuc29ydFRvZ2dsZVti XTpudWxsO2lmKCFjKXtpZihhJiZhLmZpZWxkPT1iKXtjPSh0aGlzLnNvcnRUb2dn bGVbYl18fCJBU0MiKS50b2dnbGUoIkFTQyIsIkRFU0MiKX1lbHNle2M9ZS5zb3J0 RGlyfX10aGlzLnNvcnRUb2dnbGVbYl09Yzt0aGlzLnNvcnRJbmZvPXtmaWVsZDpi LGRpcmVjdGlvbjpjfTtnPVt0aGlzLnNvcnRJbmZvXX19aWYodGhpcy5ncm91cEZp ZWxkKXtnLnVuc2hpZnQoe2RpcmVjdGlvbjp0aGlzLmdyb3VwRGlyLGZpZWxkOnRo aXMuZ3JvdXBGaWVsZH0pfXJldHVybiB0aGlzLm11bHRpU29ydC5jYWxsKHRoaXMs ZyxjKX0sYXBwbHlHcm91cEZpZWxkOmZ1bmN0aW9uKCl7aWYodGhpcy5yZW1vdGVH cm91cCl7aWYoIXRoaXMuYmFzZVBhcmFtcyl7dGhpcy5iYXNlUGFyYW1zPXt9fUV4 dC5hcHBseSh0aGlzLmJhc2VQYXJhbXMse2dyb3VwQnk6dGhpcy5ncm91cEZpZWxk LGdyb3VwRGlyOnRoaXMuZ3JvdXBEaXJ9KTt2YXIgYT10aGlzLmxhc3RPcHRpb25z O2lmKGEmJmEucGFyYW1zKXthLnBhcmFtcy5ncm91cERpcj10aGlzLmdyb3VwRGly O2RlbGV0ZSBhLnBhcmFtcy5ncm91cEJ5fX19LGFwcGx5R3JvdXBpbmc6ZnVuY3Rp b24oYSl7aWYodGhpcy5ncm91cEZpZWxkIT09ZmFsc2Upe3RoaXMuZ3JvdXBCeSh0 aGlzLmdyb3VwRmllbGQsdHJ1ZSx0aGlzLmdyb3VwRGlyKTtyZXR1cm4gdHJ1ZX1l bHNle2lmKGE9PT10cnVlKXt0aGlzLmZpcmVFdmVudCgiZGF0YWNoYW5nZWQiLHRo aXMpfXJldHVybiBmYWxzZX19LGdldEdyb3VwU3RhdGU6ZnVuY3Rpb24oKXtyZXR1 cm4gdGhpcy5ncm91cE9uU29ydCYmdGhpcy5ncm91cEZpZWxkIT09ZmFsc2U/KHRo aXMuc29ydEluZm8/dGhpcy5zb3J0SW5mby5maWVsZDp1bmRlZmluZWQpOnRoaXMu Z3JvdXBGaWVsZH19KTtFeHQucmVnKCJncm91cGluZ3N0b3JlIixFeHQuZGF0YS5H cm91cGluZ1N0b3JlKTtFeHQuZGF0YS5EaXJlY3RQcm94eT1mdW5jdGlvbihhKXtF eHQuYXBwbHkodGhpcyxhKTtpZih0eXBlb2YgdGhpcy5wYXJhbU9yZGVyPT0ic3Ry aW5nIil7dGhpcy5wYXJhbU9yZGVyPXRoaXMucGFyYW1PcmRlci5zcGxpdCgvW1xz LHxdLyl9RXh0LmRhdGEuRGlyZWN0UHJveHkuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rv ci5jYWxsKHRoaXMsYSl9O0V4dC5leHRlbmQoRXh0LmRhdGEuRGlyZWN0UHJveHks RXh0LmRhdGEuRGF0YVByb3h5LHtwYXJhbU9yZGVyOnVuZGVmaW5lZCxwYXJhbXNB c0hhc2g6dHJ1ZSxkaXJlY3RGbjp1bmRlZmluZWQsZG9SZXF1ZXN0OmZ1bmN0aW9u KGIsYyxhLGUsayxsLG4pe3ZhciBqPVtdLGg9dGhpcy5hcGlbYl18fHRoaXMuZGly ZWN0Rm47c3dpdGNoKGIpe2Nhc2UgRXh0LmRhdGEuQXBpLmFjdGlvbnMuY3JlYXRl OmoucHVzaChhLmpzb25EYXRhKTticmVhaztjYXNlIEV4dC5kYXRhLkFwaS5hY3Rp b25zLnJlYWQ6aWYoaC5kaXJlY3RDZmcubWV0aG9kLmxlbj4wKXtpZih0aGlzLnBh cmFtT3JkZXIpe2Zvcih2YXIgZD0wLGc9dGhpcy5wYXJhbU9yZGVyLmxlbmd0aDtk PGc7ZCsrKXtqLnB1c2goYVt0aGlzLnBhcmFtT3JkZXJbZF1dKX19ZWxzZXtpZih0 aGlzLnBhcmFtc0FzSGFzaCl7ai5wdXNoKGEpfX19YnJlYWs7Y2FzZSBFeHQuZGF0 YS5BcGkuYWN0aW9ucy51cGRhdGU6ai5wdXNoKGEuanNvbkRhdGEpO2JyZWFrO2Nh c2UgRXh0LmRhdGEuQXBpLmFjdGlvbnMuZGVzdHJveTpqLnB1c2goYS5qc29uRGF0 YSk7YnJlYWt9dmFyIG09e3BhcmFtczphfHx7fSxyZXF1ZXN0OntjYWxsYmFjazpr LHNjb3BlOmwsYXJnOm59LHJlYWRlcjplfTtqLnB1c2godGhpcy5jcmVhdGVDYWxs YmFjayhiLGMsbSksdGhpcyk7aC5hcHBseSh3aW5kb3csail9LGNyZWF0ZUNhbGxi YWNrOmZ1bmN0aW9uKGQsYSxiKXt2YXIgYz10aGlzO3JldHVybiBmdW5jdGlvbihl LGcpe2lmKCFnLnN0YXR1cyl7aWYoZD09PUV4dC5kYXRhLkFwaS5hY3Rpb25zLnJl YWQpe2MuZmlyZUV2ZW50KCJsb2FkZXhjZXB0aW9uIixjLGIsZyxudWxsKX1jLmZp cmVFdmVudCgiZXhjZXB0aW9uIixjLCJyZW1vdGUiLGQsYixnLG51bGwpO2IucmVx dWVzdC5jYWxsYmFjay5jYWxsKGIucmVxdWVzdC5zY29wZSxudWxsLGIucmVxdWVz dC5hcmcsZmFsc2UpO3JldHVybn1pZihkPT09RXh0LmRhdGEuQXBpLmFjdGlvbnMu cmVhZCl7Yy5vblJlYWQoZCxiLGUsZyl9ZWxzZXtjLm9uV3JpdGUoZCxiLGUsZyxh KX19fSxvblJlYWQ6ZnVuY3Rpb24oZyxlLGEsZCl7dmFyIGI7dHJ5e2I9ZS5yZWFk ZXIucmVhZFJlY29yZHMoYSl9Y2F0Y2goYyl7dGhpcy5maXJlRXZlbnQoImxvYWRl eGNlcHRpb24iLHRoaXMsZSxkLGMpO3RoaXMuZmlyZUV2ZW50KCJleGNlcHRpb24i LHRoaXMsInJlc3BvbnNlIixnLGUsZCxjKTtlLnJlcXVlc3QuY2FsbGJhY2suY2Fs bChlLnJlcXVlc3Quc2NvcGUsbnVsbCxlLnJlcXVlc3QuYXJnLGZhbHNlKTtyZXR1 cm59dGhpcy5maXJlRXZlbnQoImxvYWQiLHRoaXMsZCxlLnJlcXVlc3QuYXJnKTtl LnJlcXVlc3QuY2FsbGJhY2suY2FsbChlLnJlcXVlc3Quc2NvcGUsYixlLnJlcXVl c3QuYXJnLHRydWUpfSxvbldyaXRlOmZ1bmN0aW9uKGcsZCxhLGMsYil7dmFyIGU9 ZC5yZWFkZXIuZXh0cmFjdERhdGEoZC5yZWFkZXIuZ2V0Um9vdChhKSxmYWxzZSk7 dmFyIGg9ZC5yZWFkZXIuZ2V0U3VjY2VzcyhhKTtoPShoIT09ZmFsc2UpO2lmKGgp e3RoaXMuZmlyZUV2ZW50KCJ3cml0ZSIsdGhpcyxnLGUsYyxiLGQucmVxdWVzdC5h cmcpfWVsc2V7dGhpcy5maXJlRXZlbnQoImV4Y2VwdGlvbiIsdGhpcywicmVtb3Rl IixnLGQsYSxiKX1kLnJlcXVlc3QuY2FsbGJhY2suY2FsbChkLnJlcXVlc3Quc2Nv cGUsZSxjLGgpfX0pO0V4dC5kYXRhLkRpcmVjdFN0b3JlPUV4dC5leHRlbmQoRXh0 LmRhdGEuU3RvcmUse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZhciBiPUV4dC5h cHBseSh7fSx7YmF0Y2hUcmFuc2FjdGlvbnM6ZmFsc2V9LGEpO0V4dC5kYXRhLkRp cmVjdFN0b3JlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLEV4dC5h cHBseShiLHtwcm94eTpFeHQuaXNEZWZpbmVkKGIucHJveHkpP2IucHJveHk6bmV3 IEV4dC5kYXRhLkRpcmVjdFByb3h5KEV4dC5jb3B5VG8oe30sYiwicGFyYW1PcmRl cixwYXJhbXNBc0hhc2gsZGlyZWN0Rm4sYXBpIikpLHJlYWRlcjooIUV4dC5pc0Rl ZmluZWQoYi5yZWFkZXIpJiZiLmZpZWxkcyk/bmV3IEV4dC5kYXRhLkpzb25SZWFk ZXIoRXh0LmNvcHlUbyh7fSxiLCJ0b3RhbFByb3BlcnR5LHJvb3QsaWRQcm9wZXJ0 eSIpLGIuZmllbGRzKTpiLnJlYWRlcn0pKX19KTtFeHQucmVnKCJkaXJlY3RzdG9y ZSIsRXh0LmRhdGEuRGlyZWN0U3RvcmUpO0V4dC5EaXJlY3Q9RXh0LmV4dGVuZChF eHQudXRpbC5PYnNlcnZhYmxlLHtleGNlcHRpb25zOntUUkFOU1BPUlQ6InhociIs UEFSU0U6InBhcnNlIixMT0dJTjoibG9naW4iLFNFUlZFUjoiZXhjZXB0aW9uIn0s Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLmFkZEV2ZW50cygiZXZlbnQiLCJl eGNlcHRpb24iKTt0aGlzLnRyYW5zYWN0aW9ucz17fTt0aGlzLnByb3ZpZGVycz17 fX0sYWRkUHJvdmlkZXI6ZnVuY3Rpb24oZSl7dmFyIGM9YXJndW1lbnRzO2lmKGMu bGVuZ3RoPjEpe2Zvcih2YXIgZD0wLGI9Yy5sZW5ndGg7ZDxiO2QrKyl7dGhpcy5h ZGRQcm92aWRlcihjW2RdKX1yZXR1cm59aWYoIWUuZXZlbnRzKXtlPW5ldyBFeHQu RGlyZWN0LlBST1ZJREVSU1tlLnR5cGVdKGUpfWUuaWQ9ZS5pZHx8RXh0LmlkKCk7 dGhpcy5wcm92aWRlcnNbZS5pZF09ZTtlLm9uKCJkYXRhIix0aGlzLm9uUHJvdmlk ZXJEYXRhLHRoaXMpO2Uub24oImV4Y2VwdGlvbiIsdGhpcy5vblByb3ZpZGVyRXhj ZXB0aW9uLHRoaXMpO2lmKCFlLmlzQ29ubmVjdGVkKCkpe2UuY29ubmVjdCgpfXJl dHVybiBlfSxnZXRQcm92aWRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wcm92 aWRlcnNbYV19LHJlbW92ZVByb3ZpZGVyOmZ1bmN0aW9uKGIpe3ZhciBhPWIuaWQ/ Yjp0aGlzLnByb3ZpZGVyc1tiXTthLnVuKCJkYXRhIix0aGlzLm9uUHJvdmlkZXJE YXRhLHRoaXMpO2EudW4oImV4Y2VwdGlvbiIsdGhpcy5vblByb3ZpZGVyRXhjZXB0 aW9uLHRoaXMpO2RlbGV0ZSB0aGlzLnByb3ZpZGVyc1thLmlkXTtyZXR1cm4gYX0s YWRkVHJhbnNhY3Rpb246ZnVuY3Rpb24oYSl7dGhpcy50cmFuc2FjdGlvbnNbYS50 aWRdPWE7cmV0dXJuIGF9LHJlbW92ZVRyYW5zYWN0aW9uOmZ1bmN0aW9uKGEpe2Rl bGV0ZSB0aGlzLnRyYW5zYWN0aW9uc1thLnRpZHx8YV07cmV0dXJuIGF9LGdldFRy YW5zYWN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRyYW5zYWN0aW9uc1th LnRpZHx8YV19LG9uUHJvdmlkZXJEYXRhOmZ1bmN0aW9uKGQsYyl7aWYoRXh0Lmlz QXJyYXkoYykpe2Zvcih2YXIgYj0wLGE9Yy5sZW5ndGg7YjxhO2IrKyl7dGhpcy5v blByb3ZpZGVyRGF0YShkLGNbYl0pfXJldHVybn1pZihjLm5hbWUmJmMubmFtZSE9 ImV2ZW50IiYmYy5uYW1lIT0iZXhjZXB0aW9uIil7dGhpcy5maXJlRXZlbnQoYy5u YW1lLGMpfWVsc2V7aWYoYy50eXBlPT0iZXhjZXB0aW9uIil7dGhpcy5maXJlRXZl bnQoImV4Y2VwdGlvbiIsYyl9fXRoaXMuZmlyZUV2ZW50KCJldmVudCIsYyxkKX0s Y3JlYXRlRXZlbnQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEV4dC5EaXJlY3Qu ZXZlbnRUeXBlc1thLnR5cGVdKEV4dC5hcHBseShhLGIpKX19KTtFeHQuRGlyZWN0 PW5ldyBFeHQuRGlyZWN0KCk7RXh0LkRpcmVjdC5USUQ9MTtFeHQuRGlyZWN0LlBS T1ZJREVSUz17fTtFeHQuRGlyZWN0LlRyYW5zYWN0aW9uPWZ1bmN0aW9uKGEpe0V4 dC5hcHBseSh0aGlzLGEpO3RoaXMudGlkPSsrRXh0LkRpcmVjdC5USUQ7dGhpcy5y ZXRyeUNvdW50PTB9O0V4dC5EaXJlY3QuVHJhbnNhY3Rpb24ucHJvdG90eXBlPXtz ZW5kOmZ1bmN0aW9uKCl7dGhpcy5wcm92aWRlci5xdWV1ZVRyYW5zYWN0aW9uKHRo aXMpfSxyZXRyeTpmdW5jdGlvbigpe3RoaXMucmV0cnlDb3VudCsrO3RoaXMuc2Vu ZCgpfSxnZXRQcm92aWRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3ZpZGVy fX07RXh0LkRpcmVjdC5FdmVudD1mdW5jdGlvbihhKXtFeHQuYXBwbHkodGhpcyxh KX07RXh0LkRpcmVjdC5FdmVudC5wcm90b3R5cGU9e3N0YXR1czp0cnVlLGdldERh dGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfX07RXh0LkRpcmVjdC5SZW1v dGluZ0V2ZW50PUV4dC5leHRlbmQoRXh0LkRpcmVjdC5FdmVudCx7dHlwZToicnBj IixnZXRUcmFuc2FjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRyYW5zYWN0 aW9ufHxFeHQuRGlyZWN0LmdldFRyYW5zYWN0aW9uKHRoaXMudGlkKX19KTtFeHQu RGlyZWN0LkV4Y2VwdGlvbkV2ZW50PUV4dC5leHRlbmQoRXh0LkRpcmVjdC5SZW1v dGluZ0V2ZW50LHtzdGF0dXM6ZmFsc2UsdHlwZToiZXhjZXB0aW9uIn0pO0V4dC5E aXJlY3QuZXZlbnRUeXBlcz17cnBjOkV4dC5EaXJlY3QuUmVtb3RpbmdFdmVudCxl dmVudDpFeHQuRGlyZWN0LkV2ZW50LGV4Y2VwdGlvbjpFeHQuRGlyZWN0LkV4Y2Vw dGlvbkV2ZW50fTtFeHQuZGlyZWN0LlByb3ZpZGVyPUV4dC5leHRlbmQoRXh0LnV0 aWwuT2JzZXJ2YWJsZSx7cHJpb3JpdHk6MSxjb25zdHJ1Y3RvcjpmdW5jdGlvbihh KXtFeHQuYXBwbHkodGhpcyxhKTt0aGlzLmFkZEV2ZW50cygiY29ubmVjdCIsImRp c2Nvbm5lY3QiLCJkYXRhIiwiZXhjZXB0aW9uIik7RXh0LmRpcmVjdC5Qcm92aWRl ci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKX0saXNDb25uZWN0 ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9LGNvbm5lY3Q6RXh0LmVtcHR5Rm4s ZGlzY29ubmVjdDpFeHQuZW1wdHlGbn0pO0V4dC5kaXJlY3QuSnNvblByb3ZpZGVy PUV4dC5leHRlbmQoRXh0LmRpcmVjdC5Qcm92aWRlcix7cGFyc2VSZXNwb25zZTpm dW5jdGlvbihhKXtpZighRXh0LmlzRW1wdHkoYS5yZXNwb25zZVRleHQpKXtpZih0 eXBlb2YgYS5yZXNwb25zZVRleHQ9PSJvYmplY3QiKXtyZXR1cm4gYS5yZXNwb25z ZVRleHR9cmV0dXJuIEV4dC5kZWNvZGUoYS5yZXNwb25zZVRleHQpfXJldHVybiBu dWxsfSxnZXRFdmVudHM6ZnVuY3Rpb24oail7dmFyIGc9bnVsbDt0cnl7Zz10aGlz LnBhcnNlUmVzcG9uc2Uoail9Y2F0Y2goaCl7dmFyIGQ9bmV3IEV4dC5EaXJlY3Qu RXhjZXB0aW9uRXZlbnQoe2RhdGE6aCx4aHI6aixjb2RlOkV4dC5EaXJlY3QuZXhj ZXB0aW9ucy5QQVJTRSxtZXNzYWdlOiJFcnJvciBwYXJzaW5nIGpzb24gcmVzcG9u c2U6IFxuXG4gIitnfSk7cmV0dXJuW2RdfXZhciBjPVtdO2lmKEV4dC5pc0FycmF5 KGcpKXtmb3IodmFyIGI9MCxhPWcubGVuZ3RoO2I8YTtiKyspe2MucHVzaChFeHQu RGlyZWN0LmNyZWF0ZUV2ZW50KGdbYl0pKX19ZWxzZXtjLnB1c2goRXh0LkRpcmVj dC5jcmVhdGVFdmVudChnKSl9cmV0dXJuIGN9fSk7RXh0LmRpcmVjdC5Qb2xsaW5n UHJvdmlkZXI9RXh0LmV4dGVuZChFeHQuZGlyZWN0Lkpzb25Qcm92aWRlcix7cHJp b3JpdHk6MyxpbnRlcnZhbDozMDAwLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe0V4 dC5kaXJlY3QuUG9sbGluZ1Byb3ZpZGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3Iu Y2FsbCh0aGlzLGEpO3RoaXMuYWRkRXZlbnRzKCJiZWZvcmVwb2xsIiwicG9sbCIp fSxpc0Nvbm5lY3RlZDpmdW5jdGlvbigpe3JldHVybiAhIXRoaXMucG9sbFRhc2t9 LGNvbm5lY3Q6ZnVuY3Rpb24oKXtpZih0aGlzLnVybCYmIXRoaXMucG9sbFRhc2sp e3RoaXMucG9sbFRhc2s9RXh0LlRhc2tNZ3Iuc3RhcnQoe3J1bjpmdW5jdGlvbigp e2lmKHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVwb2xsIix0aGlzKSE9PWZhbHNlKXtp Zih0eXBlb2YgdGhpcy51cmw9PSJmdW5jdGlvbiIpe3RoaXMudXJsKHRoaXMuYmFz ZVBhcmFtcyl9ZWxzZXtFeHQuQWpheC5yZXF1ZXN0KHt1cmw6dGhpcy51cmwsY2Fs bGJhY2s6dGhpcy5vbkRhdGEsc2NvcGU6dGhpcyxwYXJhbXM6dGhpcy5iYXNlUGFy YW1zfSl9fX0saW50ZXJ2YWw6dGhpcy5pbnRlcnZhbCxzY29wZTp0aGlzfSk7dGhp cy5maXJlRXZlbnQoImNvbm5lY3QiLHRoaXMpfWVsc2V7aWYoIXRoaXMudXJsKXt0 aHJvdyJFcnJvciBpbml0aWFsaXppbmcgUG9sbGluZ1Byb3ZpZGVyLCBubyB1cmwg Y29uZmlndXJlZC4ifX19LGRpc2Nvbm5lY3Q6ZnVuY3Rpb24oKXtpZih0aGlzLnBv bGxUYXNrKXtFeHQuVGFza01nci5zdG9wKHRoaXMucG9sbFRhc2spO2RlbGV0ZSB0 aGlzLnBvbGxUYXNrO3RoaXMuZmlyZUV2ZW50KCJkaXNjb25uZWN0Iix0aGlzKX19 LG9uRGF0YTpmdW5jdGlvbihkLGosaCl7aWYoail7dmFyIGM9dGhpcy5nZXRFdmVu dHMoaCk7Zm9yKHZhciBiPTAsYT1jLmxlbmd0aDtiPGE7YisrKXt2YXIgZz1jW2Jd O3RoaXMuZmlyZUV2ZW50KCJkYXRhIix0aGlzLGcpfX1lbHNle3ZhciBnPW5ldyBF eHQuRGlyZWN0LkV4Y2VwdGlvbkV2ZW50KHtkYXRhOmcsY29kZTpFeHQuRGlyZWN0 LmV4Y2VwdGlvbnMuVFJBTlNQT1JULG1lc3NhZ2U6IlVuYWJsZSB0byBjb25uZWN0 IHRvIHRoZSBzZXJ2ZXIuIix4aHI6aH0pO3RoaXMuZmlyZUV2ZW50KCJkYXRhIix0 aGlzLGcpfX19KTtFeHQuRGlyZWN0LlBST1ZJREVSUy5wb2xsaW5nPUV4dC5kaXJl Y3QuUG9sbGluZ1Byb3ZpZGVyO0V4dC5kaXJlY3QuUmVtb3RpbmdQcm92aWRlcj1F eHQuZXh0ZW5kKEV4dC5kaXJlY3QuSnNvblByb3ZpZGVyLHtlbmFibGVCdWZmZXI6 MTAsbWF4UmV0cmllczoxLHRpbWVvdXQ6dW5kZWZpbmVkLGNvbnN0cnVjdG9yOmZ1 bmN0aW9uKGEpe0V4dC5kaXJlY3QuUmVtb3RpbmdQcm92aWRlci5zdXBlcmNsYXNz LmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmFkZEV2ZW50cygiYmVmb3Jl Y2FsbCIsImNhbGwiKTt0aGlzLm5hbWVzcGFjZT0oRXh0LmlzU3RyaW5nKHRoaXMu bmFtZXNwYWNlKSk/RXh0Lm5zKHRoaXMubmFtZXNwYWNlKTp0aGlzLm5hbWVzcGFj ZXx8d2luZG93O3RoaXMudHJhbnNhY3Rpb25zPXt9O3RoaXMuY2FsbEJ1ZmZlcj1b XX0saW5pdEFQSTpmdW5jdGlvbigpe3ZhciBoPXRoaXMuYWN0aW9ucztmb3IodmFy IGogaW4gaCl7dmFyIGQ9dGhpcy5uYW1lc3BhY2Vbal18fCh0aGlzLm5hbWVzcGFj ZVtqXT17fSksZT1oW2pdO2Zvcih2YXIgZz0wLGI9ZS5sZW5ndGg7ZzxiO2crKyl7 dmFyIGE9ZVtnXTtkW2EubmFtZV09dGhpcy5jcmVhdGVNZXRob2QoaixhKX19fSxp c0Nvbm5lY3RlZDpmdW5jdGlvbigpe3JldHVybiAhIXRoaXMuY29ubmVjdGVkfSxj b25uZWN0OmZ1bmN0aW9uKCl7aWYodGhpcy51cmwpe3RoaXMuaW5pdEFQSSgpO3Ro aXMuY29ubmVjdGVkPXRydWU7dGhpcy5maXJlRXZlbnQoImNvbm5lY3QiLHRoaXMp fWVsc2V7aWYoIXRoaXMudXJsKXt0aHJvdyJFcnJvciBpbml0aWFsaXppbmcgUmVt b3RpbmdQcm92aWRlciwgbm8gdXJsIGNvbmZpZ3VyZWQuIn19fSxkaXNjb25uZWN0 OmZ1bmN0aW9uKCl7aWYodGhpcy5jb25uZWN0ZWQpe3RoaXMuY29ubmVjdGVkPWZh bHNlO3RoaXMuZmlyZUV2ZW50KCJkaXNjb25uZWN0Iix0aGlzKX19LG9uRGF0YTpm dW5jdGlvbihhLGgsail7aWYoaCl7dmFyIGs9dGhpcy5nZXRFdmVudHMoaik7Zm9y KHZhciBiPTAsYz1rLmxlbmd0aDtiPGM7YisrKXt2YXIgZD1rW2JdLGw9dGhpcy5n ZXRUcmFuc2FjdGlvbihkKTt0aGlzLmZpcmVFdmVudCgiZGF0YSIsdGhpcyxkKTtp ZihsKXt0aGlzLmRvQ2FsbGJhY2sobCxkLHRydWUpO0V4dC5EaXJlY3QucmVtb3Zl VHJhbnNhY3Rpb24obCl9fX1lbHNle3ZhciBnPVtdLmNvbmNhdChhLnRzKTtmb3Io dmFyIGI9MCxjPWcubGVuZ3RoO2I8YztiKyspe3ZhciBsPXRoaXMuZ2V0VHJhbnNh Y3Rpb24oZ1tiXSk7aWYobCYmbC5yZXRyeUNvdW50PHRoaXMubWF4UmV0cmllcyl7 bC5yZXRyeSgpfWVsc2V7dmFyIGQ9bmV3IEV4dC5EaXJlY3QuRXhjZXB0aW9uRXZl bnQoe2RhdGE6ZCx0cmFuc2FjdGlvbjpsLGNvZGU6RXh0LkRpcmVjdC5leGNlcHRp b25zLlRSQU5TUE9SVCxtZXNzYWdlOiJVbmFibGUgdG8gY29ubmVjdCB0byB0aGUg c2VydmVyLiIseGhyOmp9KTt0aGlzLmZpcmVFdmVudCgiZGF0YSIsdGhpcyxkKTtp ZihsKXt0aGlzLmRvQ2FsbGJhY2sobCxkLGZhbHNlKTtFeHQuRGlyZWN0LnJlbW92 ZVRyYW5zYWN0aW9uKGwpfX19fX0sZ2V0Q2FsbERhdGE6ZnVuY3Rpb24oYSl7cmV0 dXJue2FjdGlvbjphLmFjdGlvbixtZXRob2Q6YS5tZXRob2QsZGF0YTphLmRhdGEs dHlwZToicnBjIix0aWQ6YS50aWR9fSxkb1NlbmQ6ZnVuY3Rpb24oZCl7dmFyIGc9 e3VybDp0aGlzLnVybCxjYWxsYmFjazp0aGlzLm9uRGF0YSxzY29wZTp0aGlzLHRz OmQsdGltZW91dDp0aGlzLnRpbWVvdXR9LGI7aWYoRXh0LmlzQXJyYXkoZCkpe2I9 W107Zm9yKHZhciBjPTAsYT1kLmxlbmd0aDtjPGE7YysrKXtiLnB1c2godGhpcy5n ZXRDYWxsRGF0YShkW2NdKSl9fWVsc2V7Yj10aGlzLmdldENhbGxEYXRhKGQpfWlm KHRoaXMuZW5hYmxlVXJsRW5jb2RlKXt2YXIgZT17fTtlW0V4dC5pc1N0cmluZyh0 aGlzLmVuYWJsZVVybEVuY29kZSk/dGhpcy5lbmFibGVVcmxFbmNvZGU6ImRhdGEi XT1FeHQuZW5jb2RlKGIpO2cucGFyYW1zPWV9ZWxzZXtnLmpzb25EYXRhPWJ9RXh0 LkFqYXgucmVxdWVzdChnKX0sY29tYmluZUFuZFNlbmQ6ZnVuY3Rpb24oKXt2YXIg YT10aGlzLmNhbGxCdWZmZXIubGVuZ3RoO2lmKGE+MCl7dGhpcy5kb1NlbmQoYT09 MT90aGlzLmNhbGxCdWZmZXJbMF06dGhpcy5jYWxsQnVmZmVyKTt0aGlzLmNhbGxC dWZmZXI9W119fSxxdWV1ZVRyYW5zYWN0aW9uOmZ1bmN0aW9uKGEpe2lmKGEuZm9y bSl7dGhpcy5wcm9jZXNzRm9ybShhKTtyZXR1cm59dGhpcy5jYWxsQnVmZmVyLnB1 c2goYSk7aWYodGhpcy5lbmFibGVCdWZmZXIpe2lmKCF0aGlzLmNhbGxUYXNrKXt0 aGlzLmNhbGxUYXNrPW5ldyBFeHQudXRpbC5EZWxheWVkVGFzayh0aGlzLmNvbWJp bmVBbmRTZW5kLHRoaXMpfXRoaXMuY2FsbFRhc2suZGVsYXkoRXh0LmlzTnVtYmVy KHRoaXMuZW5hYmxlQnVmZmVyKT90aGlzLmVuYWJsZUJ1ZmZlcjoxMCl9ZWxzZXt0 aGlzLmNvbWJpbmVBbmRTZW5kKCl9fSxkb0NhbGw6ZnVuY3Rpb24oaSxhLGIpe3Zh ciBoPW51bGwsZT1iW2EubGVuXSxnPWJbYS5sZW4rMV07aWYoYS5sZW4hPT0wKXto PWIuc2xpY2UoMCxhLmxlbil9dmFyIGQ9bmV3IEV4dC5EaXJlY3QuVHJhbnNhY3Rp b24oe3Byb3ZpZGVyOnRoaXMsYXJnczpiLGFjdGlvbjppLG1ldGhvZDphLm5hbWUs ZGF0YTpoLGNiOmcmJkV4dC5pc0Z1bmN0aW9uKGUpP2UuY3JlYXRlRGVsZWdhdGUo Zyk6ZX0pO2lmKHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVjYWxsIix0aGlzLGQsYSkh PT1mYWxzZSl7RXh0LkRpcmVjdC5hZGRUcmFuc2FjdGlvbihkKTt0aGlzLnF1ZXVl VHJhbnNhY3Rpb24oZCk7dGhpcy5maXJlRXZlbnQoImNhbGwiLHRoaXMsZCxhKX19 LGRvRm9ybTpmdW5jdGlvbihqLGIsZyxpLGUpe3ZhciBkPW5ldyBFeHQuRGlyZWN0 LlRyYW5zYWN0aW9uKHtwcm92aWRlcjp0aGlzLGFjdGlvbjpqLG1ldGhvZDpiLm5h bWUsYXJnczpbZyxpLGVdLGNiOmUmJkV4dC5pc0Z1bmN0aW9uKGkpP2kuY3JlYXRl RGVsZWdhdGUoZSk6aSxpc0Zvcm06dHJ1ZX0pO2lmKHRoaXMuZmlyZUV2ZW50KCJi ZWZvcmVjYWxsIix0aGlzLGQsYikhPT1mYWxzZSl7RXh0LkRpcmVjdC5hZGRUcmFu c2FjdGlvbihkKTt2YXIgYT1TdHJpbmcoZy5nZXRBdHRyaWJ1dGUoImVuY3R5cGUi KSkudG9Mb3dlckNhc2UoKT09Im11bHRpcGFydC9mb3JtLWRhdGEiLGg9e2V4dFRJ RDpkLnRpZCxleHRBY3Rpb246aixleHRNZXRob2Q6Yi5uYW1lLGV4dFR5cGU6InJw YyIsZXh0VXBsb2FkOlN0cmluZyhhKX07RXh0LmFwcGx5KGQse2Zvcm06RXh0Lmdl dERvbShnKSxpc1VwbG9hZDphLHBhcmFtczppJiZFeHQuaXNPYmplY3QoaS5wYXJh bXMpP0V4dC5hcHBseShoLGkucGFyYW1zKTpofSk7dGhpcy5maXJlRXZlbnQoImNh bGwiLHRoaXMsZCxiKTt0aGlzLnByb2Nlc3NGb3JtKGQpfX0scHJvY2Vzc0Zvcm06 ZnVuY3Rpb24oYSl7RXh0LkFqYXgucmVxdWVzdCh7dXJsOnRoaXMudXJsLHBhcmFt czphLnBhcmFtcyxjYWxsYmFjazp0aGlzLm9uRGF0YSxzY29wZTp0aGlzLGZvcm06 YS5mb3JtLGlzVXBsb2FkOmEuaXNVcGxvYWQsdHM6YX0pfSxjcmVhdGVNZXRob2Q6 ZnVuY3Rpb24oZCxhKXt2YXIgYjtpZighYS5mb3JtSGFuZGxlcil7Yj1mdW5jdGlv bigpe3RoaXMuZG9DYWxsKGQsYSxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChh cmd1bWVudHMsMCkpfS5jcmVhdGVEZWxlZ2F0ZSh0aGlzKX1lbHNle2I9ZnVuY3Rp b24oZSxnLGMpe3RoaXMuZG9Gb3JtKGQsYSxlLGcsYyl9LmNyZWF0ZURlbGVnYXRl KHRoaXMpfWIuZGlyZWN0Q2ZnPXthY3Rpb246ZCxtZXRob2Q6YX07cmV0dXJuIGJ9 LGdldFRyYW5zYWN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLnRpZD9FeHQu RGlyZWN0LmdldFRyYW5zYWN0aW9uKGEudGlkKTpudWxsfSxkb0NhbGxiYWNrOmZ1 bmN0aW9uKGMsZyl7dmFyIGQ9Zy5zdGF0dXM/InN1Y2Nlc3MiOiJmYWlsdXJlIjtp ZihjJiZjLmNiKXt2YXIgYj1jLmNiLGE9RXh0LmlzRGVmaW5lZChnLnJlc3VsdCk/ Zy5yZXN1bHQ6Zy5kYXRhO2lmKEV4dC5pc0Z1bmN0aW9uKGIpKXtiKGEsZyl9ZWxz ZXtFeHQuY2FsbGJhY2soYltkXSxiLnNjb3BlLFthLGddKTtFeHQuY2FsbGJhY2so Yi5jYWxsYmFjayxiLnNjb3BlLFthLGddKX19fX0pO0V4dC5EaXJlY3QuUFJPVklE RVJTLnJlbW90aW5nPUV4dC5kaXJlY3QuUmVtb3RpbmdQcm92aWRlcjtFeHQuUmVz aXphYmxlPUV4dC5leHRlbmQoRXh0LnV0aWwuT2JzZXJ2YWJsZSx7Y29uc3RydWN0 b3I6ZnVuY3Rpb24oZCxlKXt0aGlzLmVsPUV4dC5nZXQoZCk7aWYoZSYmZS53cmFw KXtlLnJlc2l6ZUNoaWxkPXRoaXMuZWw7dGhpcy5lbD10aGlzLmVsLndyYXAodHlw ZW9mIGUud3JhcD09Im9iamVjdCI/ZS53cmFwOntjbHM6InhyZXNpemFibGUtd3Jh cCJ9KTt0aGlzLmVsLmlkPXRoaXMuZWwuZG9tLmlkPWUucmVzaXplQ2hpbGQuaWQr Ii1yendyYXAiO3RoaXMuZWwuc2V0U3R5bGUoIm92ZXJmbG93IiwiaGlkZGVuIik7 dGhpcy5lbC5zZXRQb3NpdGlvbmluZyhlLnJlc2l6ZUNoaWxkLmdldFBvc2l0aW9u aW5nKCkpO2UucmVzaXplQ2hpbGQuY2xlYXJQb3NpdGlvbmluZygpO2lmKCFlLndp ZHRofHwhZS5oZWlnaHQpe3ZhciBnPWUucmVzaXplQ2hpbGQuZ2V0U2l6ZSgpO3Ro aXMuZWwuc2V0U2l6ZShnLndpZHRoLGcuaGVpZ2h0KX1pZihlLnBpbm5lZCYmIWUu YWRqdXN0bWVudHMpe2UuYWRqdXN0bWVudHM9ImF1dG8ifX10aGlzLnByb3h5PXRo aXMuZWwuY3JlYXRlUHJveHkoe3RhZzoiZGl2IixjbHM6IngtcmVzaXphYmxlLXBy b3h5IixpZDp0aGlzLmVsLmlkKyItcnpwcm94eSJ9LEV4dC5nZXRCb2R5KCkpO3Ro aXMucHJveHkudW5zZWxlY3RhYmxlKCk7dGhpcy5wcm94eS5lbmFibGVEaXNwbGF5 TW9kZSgiYmxvY2siKTtFeHQuYXBwbHkodGhpcyxlKTtpZih0aGlzLnBpbm5lZCl7 dGhpcy5kaXNhYmxlVHJhY2tPdmVyPXRydWU7dGhpcy5lbC5hZGRDbGFzcygieC1y ZXNpemFibGUtcGlubmVkIil9dmFyIGs9dGhpcy5lbC5nZXRTdHlsZSgicG9zaXRp b24iKTtpZihrIT0iYWJzb2x1dGUiJiZrIT0iZml4ZWQiKXt0aGlzLmVsLnNldFN0 eWxlKCJwb3NpdGlvbiIsInJlbGF0aXZlIil9aWYoIXRoaXMuaGFuZGxlcyl7dGhp cy5oYW5kbGVzPSJzLGUsc2UiO2lmKHRoaXMubXVsdGlEaXJlY3Rpb25hbCl7dGhp cy5oYW5kbGVzKz0iLG4sdyJ9fWlmKHRoaXMuaGFuZGxlcz09ImFsbCIpe3RoaXMu aGFuZGxlcz0ibiBzIGUgdyBuZSBudyBzZSBzdyJ9dmFyIG89dGhpcy5oYW5kbGVz LnNwbGl0KC9ccyo/Wyw7XVxzKj98IC8pO3ZhciBjPUV4dC5SZXNpemFibGUucG9z aXRpb25zO2Zvcih2YXIgaj0wLGw9by5sZW5ndGg7ajxsO2orKyl7aWYob1tqXSYm Y1tvW2pdXSl7dmFyIG49Y1tvW2pdXTt0aGlzW25dPW5ldyBFeHQuUmVzaXphYmxl LkhhbmRsZSh0aGlzLG4sdGhpcy5kaXNhYmxlVHJhY2tPdmVyLHRoaXMudHJhbnNw YXJlbnQsdGhpcy5oYW5kbGVDbHMpfX10aGlzLmNvcm5lcj10aGlzLnNvdXRoZWFz dDtpZih0aGlzLmhhbmRsZXMuaW5kZXhPZigibiIpIT0tMXx8dGhpcy5oYW5kbGVz LmluZGV4T2YoInciKSE9LTEpe3RoaXMudXBkYXRlQm94PXRydWV9dGhpcy5hY3Rp dmVIYW5kbGU9bnVsbDtpZih0aGlzLnJlc2l6ZUNoaWxkKXtpZih0eXBlb2YgdGhp cy5yZXNpemVDaGlsZD09ImJvb2xlYW4iKXt0aGlzLnJlc2l6ZUNoaWxkPUV4dC5n ZXQodGhpcy5lbC5kb20uZmlyc3RDaGlsZCx0cnVlKX1lbHNle3RoaXMucmVzaXpl Q2hpbGQ9RXh0LmdldCh0aGlzLnJlc2l6ZUNoaWxkLHRydWUpfX1pZih0aGlzLmFk anVzdG1lbnRzPT0iYXV0byIpe3ZhciBiPXRoaXMucmVzaXplQ2hpbGQ7dmFyIG09 dGhpcy53ZXN0LGg9dGhpcy5lYXN0LGE9dGhpcy5ub3J0aCxvPXRoaXMuc291dGg7 aWYoYiYmKG18fGEpKXtiLnBvc2l0aW9uKCJyZWxhdGl2ZSIpO2Iuc2V0TGVmdCht P20uZWwuZ2V0V2lkdGgoKTowKTtiLnNldFRvcChhP2EuZWwuZ2V0SGVpZ2h0KCk6 MCl9dGhpcy5hZGp1c3RtZW50cz1bKGg/LWguZWwuZ2V0V2lkdGgoKTowKSsobT8t bS5lbC5nZXRXaWR0aCgpOjApLChhPy1hLmVsLmdldEhlaWdodCgpOjApKyhvPy1v LmVsLmdldEhlaWdodCgpOjApLTFdfWlmKHRoaXMuZHJhZ2dhYmxlKXt0aGlzLmRk PXRoaXMuZHluYW1pYz90aGlzLmVsLmluaXRERChudWxsKTp0aGlzLmVsLmluaXRE RFByb3h5KG51bGwse2RyYWdFbElkOnRoaXMucHJveHkuaWR9KTt0aGlzLmRkLnNl dEhhbmRsZUVsSWQodGhpcy5yZXNpemVDaGlsZD90aGlzLnJlc2l6ZUNoaWxkLmlk OnRoaXMuZWwuaWQpO2lmKHRoaXMuY29uc3RyYWluVG8pe3RoaXMuZGQuY29uc3Ry YWluVG8odGhpcy5jb25zdHJhaW5Ubyl9fXRoaXMuYWRkRXZlbnRzKCJiZWZvcmVy ZXNpemUiLCJyZXNpemUiKTtpZih0aGlzLndpZHRoIT09bnVsbCYmdGhpcy5oZWln aHQhPT1udWxsKXt0aGlzLnJlc2l6ZVRvKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQp fWVsc2V7dGhpcy51cGRhdGVDaGlsZFNpemUoKX1pZihFeHQuaXNJRSl7dGhpcy5l bC5kb20uc3R5bGUuem9vbT0xfUV4dC5SZXNpemFibGUuc3VwZXJjbGFzcy5jb25z dHJ1Y3Rvci5jYWxsKHRoaXMpfSxhZGp1c3RtZW50czpbMCwwXSxhbmltYXRlOmZh bHNlLGRpc2FibGVUcmFja092ZXI6ZmFsc2UsZHJhZ2dhYmxlOmZhbHNlLGR1cmF0 aW9uOjAuMzUsZHluYW1pYzpmYWxzZSxlYXNpbmc6ImVhc2VPdXRTdHJvbmciLGVu YWJsZWQ6dHJ1ZSxoYW5kbGVzOmZhbHNlLG11bHRpRGlyZWN0aW9uYWw6ZmFsc2Us aGVpZ2h0Om51bGwsd2lkdGg6bnVsbCxoZWlnaHRJbmNyZW1lbnQ6MCx3aWR0aElu Y3JlbWVudDowLG1pbkhlaWdodDo1LG1pbldpZHRoOjUsbWF4SGVpZ2h0OjEwMDAw LG1heFdpZHRoOjEwMDAwLG1pblg6MCxtaW5ZOjAscGlubmVkOmZhbHNlLHByZXNl cnZlUmF0aW86ZmFsc2UscmVzaXplQ2hpbGQ6ZmFsc2UsdHJhbnNwYXJlbnQ6ZmFs c2UscmVzaXplVG86ZnVuY3Rpb24oYixhKXt0aGlzLmVsLnNldFNpemUoYixhKTt0 aGlzLnVwZGF0ZUNoaWxkU2l6ZSgpO3RoaXMuZmlyZUV2ZW50KCJyZXNpemUiLHRo aXMsYixhLG51bGwpfSxzdGFydFNpemluZzpmdW5jdGlvbihjLGIpe3RoaXMuZmly ZUV2ZW50KCJiZWZvcmVyZXNpemUiLHRoaXMsYyk7aWYodGhpcy5lbmFibGVkKXtp ZighdGhpcy5vdmVybGF5KXt0aGlzLm92ZXJsYXk9dGhpcy5lbC5jcmVhdGVQcm94 eSh7dGFnOiJkaXYiLGNsczoieC1yZXNpemFibGUtb3ZlcmxheSIsaHRtbDoiJiMx NjA7In0sRXh0LmdldEJvZHkoKSk7dGhpcy5vdmVybGF5LnVuc2VsZWN0YWJsZSgp O3RoaXMub3ZlcmxheS5lbmFibGVEaXNwbGF5TW9kZSgiYmxvY2siKTt0aGlzLm92 ZXJsYXkub24oe3Njb3BlOnRoaXMsbW91c2Vtb3ZlOnRoaXMub25Nb3VzZU1vdmUs bW91c2V1cDp0aGlzLm9uTW91c2VVcH0pfXRoaXMub3ZlcmxheS5zZXRTdHlsZSgi Y3Vyc29yIixiLmVsLmdldFN0eWxlKCJjdXJzb3IiKSk7dGhpcy5yZXNpemluZz10 cnVlO3RoaXMuc3RhcnRCb3g9dGhpcy5lbC5nZXRCb3goKTt0aGlzLnN0YXJ0UG9p bnQ9Yy5nZXRYWSgpO3RoaXMub2Zmc2V0cz1bKHRoaXMuc3RhcnRCb3gueCt0aGlz LnN0YXJ0Qm94LndpZHRoKS10aGlzLnN0YXJ0UG9pbnRbMF0sKHRoaXMuc3RhcnRC b3gueSt0aGlzLnN0YXJ0Qm94LmhlaWdodCktdGhpcy5zdGFydFBvaW50WzFdXTt0 aGlzLm92ZXJsYXkuc2V0U2l6ZShFeHQubGliLkRvbS5nZXRWaWV3V2lkdGgodHJ1 ZSksRXh0LmxpYi5Eb20uZ2V0Vmlld0hlaWdodCh0cnVlKSk7dGhpcy5vdmVybGF5 LnNob3coKTtpZih0aGlzLmNvbnN0cmFpblRvKXt2YXIgYT1FeHQuZ2V0KHRoaXMu Y29uc3RyYWluVG8pO3RoaXMucmVzaXplUmVnaW9uPWEuZ2V0UmVnaW9uKCkuYWRq dXN0KGEuZ2V0RnJhbWVXaWR0aCgidCIpLGEuZ2V0RnJhbWVXaWR0aCgibCIpLC1h LmdldEZyYW1lV2lkdGgoImIiKSwtYS5nZXRGcmFtZVdpZHRoKCJyIikpfXRoaXMu cHJveHkuc2V0U3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKTt0aGlzLnByb3h5 LnNob3coKTt0aGlzLnByb3h5LnNldEJveCh0aGlzLnN0YXJ0Qm94KTtpZighdGhp cy5keW5hbWljKXt0aGlzLnByb3h5LnNldFN0eWxlKCJ2aXNpYmlsaXR5Iiwidmlz aWJsZSIpfX19LG9uTW91c2VEb3duOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5lbmFi bGVkKXtiLnN0b3BFdmVudCgpO3RoaXMuYWN0aXZlSGFuZGxlPWE7dGhpcy5zdGFy dFNpemluZyhiLGEpfX0sb25Nb3VzZVVwOmZ1bmN0aW9uKGIpe3RoaXMuYWN0aXZl SGFuZGxlPW51bGw7dmFyIGE9dGhpcy5yZXNpemVFbGVtZW50KCk7dGhpcy5yZXNp emluZz1mYWxzZTt0aGlzLmhhbmRsZU91dCgpO3RoaXMub3ZlcmxheS5oaWRlKCk7 dGhpcy5wcm94eS5oaWRlKCk7dGhpcy5maXJlRXZlbnQoInJlc2l6ZSIsdGhpcyxh LndpZHRoLGEuaGVpZ2h0LGIpfSx1cGRhdGVDaGlsZFNpemU6ZnVuY3Rpb24oKXtp Zih0aGlzLnJlc2l6ZUNoaWxkKXt2YXIgZD10aGlzLmVsO3ZhciBlPXRoaXMucmVz aXplQ2hpbGQ7dmFyIGM9dGhpcy5hZGp1c3RtZW50cztpZihkLmRvbS5vZmZzZXRX aWR0aCl7dmFyIGE9ZC5nZXRTaXplKHRydWUpO2Uuc2V0U2l6ZShhLndpZHRoK2Nb MF0sYS5oZWlnaHQrY1sxXSl9aWYoRXh0LmlzSUUpe3NldFRpbWVvdXQoZnVuY3Rp b24oKXtpZihkLmRvbS5vZmZzZXRXaWR0aCl7dmFyIGc9ZC5nZXRTaXplKHRydWUp O2Uuc2V0U2l6ZShnLndpZHRoK2NbMF0sZy5oZWlnaHQrY1sxXSl9fSwxMCl9fX0s c25hcDpmdW5jdGlvbihjLGUsYil7aWYoIWV8fCFjKXtyZXR1cm4gY312YXIgZD1j O3ZhciBhPWMlZTtpZihhPjApe2lmKGE+KGUvMikpe2Q9YysoZS1hKX1lbHNle2Q9 Yy1hfX1yZXR1cm4gTWF0aC5tYXgoYixkKX0scmVzaXplRWxlbWVudDpmdW5jdGlv bigpe3ZhciBhPXRoaXMucHJveHkuZ2V0Qm94KCk7aWYodGhpcy51cGRhdGVCb3gp e3RoaXMuZWwuc2V0Qm94KGEsZmFsc2UsdGhpcy5hbmltYXRlLHRoaXMuZHVyYXRp b24sbnVsbCx0aGlzLmVhc2luZyl9ZWxzZXt0aGlzLmVsLnNldFNpemUoYS53aWR0 aCxhLmhlaWdodCx0aGlzLmFuaW1hdGUsdGhpcy5kdXJhdGlvbixudWxsLHRoaXMu ZWFzaW5nKX10aGlzLnVwZGF0ZUNoaWxkU2l6ZSgpO2lmKCF0aGlzLmR5bmFtaWMp e3RoaXMucHJveHkuaGlkZSgpfWlmKHRoaXMuZHJhZ2dhYmxlJiZ0aGlzLmNvbnN0 cmFpblRvKXt0aGlzLmRkLnJlc2V0Q29uc3RyYWludHMoKTt0aGlzLmRkLmNvbnN0 cmFpblRvKHRoaXMuY29uc3RyYWluVG8pfXJldHVybiBhfSxjb25zdHJhaW46ZnVu Y3Rpb24oYixjLGEsZCl7aWYoYi1jPGEpe2M9Yi1hfWVsc2V7aWYoYi1jPmQpe2M9 Yi1kfX1yZXR1cm4gY30sb25Nb3VzZU1vdmU6ZnVuY3Rpb24oeil7aWYodGhpcy5l bmFibGVkJiZ0aGlzLmFjdGl2ZUhhbmRsZSl7dHJ5e2lmKHRoaXMucmVzaXplUmVn aW9uJiYhdGhpcy5yZXNpemVSZWdpb24uY29udGFpbnMoei5nZXRQb2ludCgpKSl7 cmV0dXJufXZhciB0PXRoaXMuY3VyU2l6ZXx8dGhpcy5zdGFydEJveCxsPXRoaXMu c3RhcnRCb3gueCxrPXRoaXMuc3RhcnRCb3gueSxjPWwsYj1rLG09dC53aWR0aCx1 PXQuaGVpZ2h0LGQ9bSxvPXUsbj10aGlzLm1pbldpZHRoLEE9dGhpcy5taW5IZWln aHQscz10aGlzLm1heFdpZHRoLEQ9dGhpcy5tYXhIZWlnaHQsaT10aGlzLndpZHRo SW5jcmVtZW50LGE9dGhpcy5oZWlnaHRJbmNyZW1lbnQsQj16LmdldFhZKCkscj0t KHRoaXMuc3RhcnRQb2ludFswXS1NYXRoLm1heCh0aGlzLm1pblgsQlswXSkpLHA9 LSh0aGlzLnN0YXJ0UG9pbnRbMV0tTWF0aC5tYXgodGhpcy5taW5ZLEJbMV0pKSxq PXRoaXMuYWN0aXZlSGFuZGxlLnBvc2l0aW9uLEUsZztzd2l0Y2goail7Y2FzZSJl YXN0IjptKz1yO209TWF0aC5taW4oTWF0aC5tYXgobixtKSxzKTticmVhaztjYXNl InNvdXRoIjp1Kz1wO3U9TWF0aC5taW4oTWF0aC5tYXgoQSx1KSxEKTticmVhaztj YXNlInNvdXRoZWFzdCI6bSs9cjt1Kz1wO209TWF0aC5taW4oTWF0aC5tYXgobixt KSxzKTt1PU1hdGgubWluKE1hdGgubWF4KEEsdSksRCk7YnJlYWs7Y2FzZSJub3J0 aCI6cD10aGlzLmNvbnN0cmFpbih1LHAsQSxEKTtrKz1wO3UtPXA7YnJlYWs7Y2Fz ZSJ3ZXN0IjpyPXRoaXMuY29uc3RyYWluKG0scixuLHMpO2wrPXI7bS09cjticmVh aztjYXNlIm5vcnRoZWFzdCI6bSs9cjttPU1hdGgubWluKE1hdGgubWF4KG4sbSks cyk7cD10aGlzLmNvbnN0cmFpbih1LHAsQSxEKTtrKz1wO3UtPXA7YnJlYWs7Y2Fz ZSJub3J0aHdlc3QiOnI9dGhpcy5jb25zdHJhaW4obSxyLG4scyk7cD10aGlzLmNv bnN0cmFpbih1LHAsQSxEKTtrKz1wO3UtPXA7bCs9cjttLT1yO2JyZWFrO2Nhc2Ui c291dGh3ZXN0IjpyPXRoaXMuY29uc3RyYWluKG0scixuLHMpO3UrPXA7dT1NYXRo Lm1pbihNYXRoLm1heChBLHUpLEQpO2wrPXI7bS09cjticmVha312YXIgcT10aGlz LnNuYXAobSxpLG4pO3ZhciBDPXRoaXMuc25hcCh1LGEsQSk7aWYocSE9bXx8QyE9 dSl7c3dpdGNoKGope2Nhc2Uibm9ydGhlYXN0IjprLT1DLXU7YnJlYWs7Y2FzZSJu b3J0aCI6ay09Qy11O2JyZWFrO2Nhc2Uic291dGh3ZXN0IjpsLT1xLW07YnJlYWs7 Y2FzZSJ3ZXN0IjpsLT1xLW07YnJlYWs7Y2FzZSJub3J0aHdlc3QiOmwtPXEtbTtr LT1DLXU7YnJlYWt9bT1xO3U9Q31pZih0aGlzLnByZXNlcnZlUmF0aW8pe3N3aXRj aChqKXtjYXNlInNvdXRoZWFzdCI6Y2FzZSJlYXN0Ijp1PW8qKG0vZCk7dT1NYXRo Lm1pbihNYXRoLm1heChBLHUpLEQpO209ZCoodS9vKTticmVhaztjYXNlInNvdXRo IjptPWQqKHUvbyk7bT1NYXRoLm1pbihNYXRoLm1heChuLG0pLHMpO3U9byoobS9k KTticmVhaztjYXNlIm5vcnRoZWFzdCI6bT1kKih1L28pO209TWF0aC5taW4oTWF0 aC5tYXgobixtKSxzKTt1PW8qKG0vZCk7YnJlYWs7Y2FzZSJub3J0aCI6RT1tO209 ZCoodS9vKTttPU1hdGgubWluKE1hdGgubWF4KG4sbSkscyk7dT1vKihtL2QpO2wr PShFLW0pLzI7YnJlYWs7Y2FzZSJzb3V0aHdlc3QiOnU9byoobS9kKTt1PU1hdGgu bWluKE1hdGgubWF4KEEsdSksRCk7RT1tO209ZCoodS9vKTtsKz1FLW07YnJlYWs7 Y2FzZSJ3ZXN0IjpnPXU7dT1vKihtL2QpO3U9TWF0aC5taW4oTWF0aC5tYXgoQSx1 KSxEKTtrKz0oZy11KS8yO0U9bTttPWQqKHUvbyk7bCs9RS1tO2JyZWFrO2Nhc2Ui bm9ydGh3ZXN0IjpFPW07Zz11O3U9byoobS9kKTt1PU1hdGgubWluKE1hdGgubWF4 KEEsdSksRCk7bT1kKih1L28pO2srPWctdTtsKz1FLW07YnJlYWt9fXRoaXMucHJv eHkuc2V0Qm91bmRzKGwsayxtLHUpO2lmKHRoaXMuZHluYW1pYyl7dGhpcy5yZXNp emVFbGVtZW50KCl9fWNhdGNoKHYpe319fSxoYW5kbGVPdmVyOmZ1bmN0aW9uKCl7 aWYodGhpcy5lbmFibGVkKXt0aGlzLmVsLmFkZENsYXNzKCJ4LXJlc2l6YWJsZS1v dmVyIil9fSxoYW5kbGVPdXQ6ZnVuY3Rpb24oKXtpZighdGhpcy5yZXNpemluZyl7 dGhpcy5lbC5yZW1vdmVDbGFzcygieC1yZXNpemFibGUtb3ZlciIpfX0sZ2V0RWw6 ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbH0sZ2V0UmVzaXplQ2hpbGQ6ZnVuY3Rp b24oKXtyZXR1cm4gdGhpcy5yZXNpemVDaGlsZH0sZGVzdHJveTpmdW5jdGlvbihi KXtFeHQuZGVzdHJveSh0aGlzLmRkLHRoaXMub3ZlcmxheSx0aGlzLnByb3h5KTt0 aGlzLm92ZXJsYXk9bnVsbDt0aGlzLnByb3h5PW51bGw7dmFyIGM9RXh0LlJlc2l6 YWJsZS5wb3NpdGlvbnM7Zm9yKHZhciBhIGluIGMpe2lmKHR5cGVvZiBjW2FdIT0i ZnVuY3Rpb24iJiZ0aGlzW2NbYV1dKXt0aGlzW2NbYV1dLmRlc3Ryb3koKX19aWYo Yil7dGhpcy5lbC51cGRhdGUoIiIpO0V4dC5kZXN0cm95KHRoaXMuZWwpO3RoaXMu ZWw9bnVsbH10aGlzLnB1cmdlTGlzdGVuZXJzKCl9LHN5bmNIYW5kbGVIZWlnaHQ6 ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsLmdldEhlaWdodCh0cnVlKTtpZih0aGlz Lndlc3Qpe3RoaXMud2VzdC5lbC5zZXRIZWlnaHQoYSl9aWYodGhpcy5lYXN0KXt0 aGlzLmVhc3QuZWwuc2V0SGVpZ2h0KGEpfX19KTtFeHQuUmVzaXphYmxlLnBvc2l0 aW9ucz17bjoibm9ydGgiLHM6InNvdXRoIixlOiJlYXN0Iix3OiJ3ZXN0IixzZToi c291dGhlYXN0Iixzdzoic291dGh3ZXN0Iixudzoibm9ydGh3ZXN0IixuZToibm9y dGhlYXN0In07RXh0LlJlc2l6YWJsZS5IYW5kbGU9RXh0LmV4dGVuZChPYmplY3Qs e2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGQsZyxjLGUsYSl7aWYoIXRoaXMudHBsKXt2 YXIgYj1FeHQuRG9tSGVscGVyLmNyZWF0ZVRlbXBsYXRlKHt0YWc6ImRpdiIsY2xz OiJ4LXJlc2l6YWJsZS1oYW5kbGUgeC1yZXNpemFibGUtaGFuZGxlLXswfSJ9KTti LmNvbXBpbGUoKTtFeHQuUmVzaXphYmxlLkhhbmRsZS5wcm90b3R5cGUudHBsPWJ9 dGhpcy5wb3NpdGlvbj1nO3RoaXMucno9ZDt0aGlzLmVsPXRoaXMudHBsLmFwcGVu ZChkLmVsLmRvbSxbdGhpcy5wb3NpdGlvbl0sdHJ1ZSk7dGhpcy5lbC51bnNlbGVj dGFibGUoKTtpZihlKXt0aGlzLmVsLnNldE9wYWNpdHkoMCl9aWYoIUV4dC5pc0Vt cHR5KGEpKXt0aGlzLmVsLmFkZENsYXNzKGEpfXRoaXMuZWwub24oIm1vdXNlZG93 biIsdGhpcy5vbk1vdXNlRG93bix0aGlzKTtpZighYyl7dGhpcy5lbC5vbih7c2Nv cGU6dGhpcyxtb3VzZW92ZXI6dGhpcy5vbk1vdXNlT3Zlcixtb3VzZW91dDp0aGlz Lm9uTW91c2VPdXR9KX19LGFmdGVyUmVzaXplOmZ1bmN0aW9uKGEpe30sb25Nb3Vz ZURvd246ZnVuY3Rpb24oYSl7dGhpcy5yei5vbk1vdXNlRG93bih0aGlzLGEpfSxv bk1vdXNlT3ZlcjpmdW5jdGlvbihhKXt0aGlzLnJ6LmhhbmRsZU92ZXIodGhpcyxh KX0sb25Nb3VzZU91dDpmdW5jdGlvbihhKXt0aGlzLnJ6LmhhbmRsZU91dCh0aGlz LGEpfSxkZXN0cm95OmZ1bmN0aW9uKCl7RXh0LmRlc3Ryb3kodGhpcy5lbCk7dGhp cy5lbD1udWxsfX0pO0V4dC5XaW5kb3c9RXh0LmV4dGVuZChFeHQuUGFuZWwse2Jh c2VDbHM6Ingtd2luZG93IixyZXNpemFibGU6dHJ1ZSxkcmFnZ2FibGU6dHJ1ZSxj bG9zYWJsZTp0cnVlLGNsb3NlQWN0aW9uOiJjbG9zZSIsY29uc3RyYWluOmZhbHNl LGNvbnN0cmFpbkhlYWRlcjpmYWxzZSxwbGFpbjpmYWxzZSxtaW5pbWl6YWJsZTpm YWxzZSxtYXhpbWl6YWJsZTpmYWxzZSxtaW5IZWlnaHQ6MTAwLG1pbldpZHRoOjIw MCxleHBhbmRPblNob3c6dHJ1ZSxzaG93QW5pbUR1cmF0aW9uOjAuMjUsaGlkZUFu aW1EdXJhdGlvbjowLjI1LGNvbGxhcHNpYmxlOmZhbHNlLGluaXRIaWRkZW46dW5k ZWZpbmVkLGhpZGRlbjp0cnVlLGVsZW1lbnRzOiJoZWFkZXIsYm9keSIsZnJhbWU6 dHJ1ZSxmbG9hdGluZzp0cnVlLGluaXRDb21wb25lbnQ6ZnVuY3Rpb24oKXt0aGlz LmluaXRUb29scygpO0V4dC5XaW5kb3cuc3VwZXJjbGFzcy5pbml0Q29tcG9uZW50 LmNhbGwodGhpcyk7dGhpcy5hZGRFdmVudHMoInJlc2l6ZSIsIm1heGltaXplIiwi bWluaW1pemUiLCJyZXN0b3JlIik7aWYoRXh0LmlzRGVmaW5lZCh0aGlzLmluaXRI aWRkZW4pKXt0aGlzLmhpZGRlbj10aGlzLmluaXRIaWRkZW59aWYodGhpcy5oaWRk ZW49PT1mYWxzZSl7dGhpcy5oaWRkZW49dHJ1ZTt0aGlzLnNob3coKX19LGdldFN0 YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIEV4dC5hcHBseShFeHQuV2luZG93LnN1cGVy Y2xhc3MuZ2V0U3RhdGUuY2FsbCh0aGlzKXx8e30sdGhpcy5nZXRCb3godHJ1ZSkp fSxvblJlbmRlcjpmdW5jdGlvbihiLGEpe0V4dC5XaW5kb3cuc3VwZXJjbGFzcy5v blJlbmRlci5jYWxsKHRoaXMsYixhKTtpZih0aGlzLnBsYWluKXt0aGlzLmVsLmFk ZENsYXNzKCJ4LXdpbmRvdy1wbGFpbiIpfXRoaXMuZm9jdXNFbD10aGlzLmVsLmNy ZWF0ZUNoaWxkKHt0YWc6ImEiLGhyZWY6IiMiLGNsczoieC1kbGctZm9jdXMiLHRh YkluZGV4OiItMSIsaHRtbDoiJiMxNjA7In0pO3RoaXMuZm9jdXNFbC5zd2FsbG93 RXZlbnQoImNsaWNrIix0cnVlKTt0aGlzLnByb3h5PXRoaXMuZWwuY3JlYXRlUHJv eHkoIngtd2luZG93LXByb3h5Iik7dGhpcy5wcm94eS5lbmFibGVEaXNwbGF5TW9k ZSgiYmxvY2siKTtpZih0aGlzLm1vZGFsKXt0aGlzLm1hc2s9dGhpcy5jb250YWlu ZXIuY3JlYXRlQ2hpbGQoe2NsczoiZXh0LWVsLW1hc2sifSx0aGlzLmVsLmRvbSk7 dGhpcy5tYXNrLmVuYWJsZURpc3BsYXlNb2RlKCJibG9jayIpO3RoaXMubWFzay5o aWRlKCk7dGhpcy5tb24odGhpcy5tYXNrLCJjbGljayIsdGhpcy5mb2N1cyx0aGlz KX1pZih0aGlzLm1heGltaXphYmxlKXt0aGlzLm1vbih0aGlzLmhlYWRlciwiZGJs Y2xpY2siLHRoaXMudG9nZ2xlTWF4aW1pemUsdGhpcyl9fSxpbml0RXZlbnRzOmZ1 bmN0aW9uKCl7RXh0LldpbmRvdy5zdXBlcmNsYXNzLmluaXRFdmVudHMuY2FsbCh0 aGlzKTtpZih0aGlzLmFuaW1hdGVUYXJnZXQpe3RoaXMuc2V0QW5pbWF0ZVRhcmdl dCh0aGlzLmFuaW1hdGVUYXJnZXQpfWlmKHRoaXMucmVzaXphYmxlKXt0aGlzLnJl c2l6ZXI9bmV3IEV4dC5SZXNpemFibGUodGhpcy5lbCx7bWluV2lkdGg6dGhpcy5t aW5XaWR0aCxtaW5IZWlnaHQ6dGhpcy5taW5IZWlnaHQsaGFuZGxlczp0aGlzLnJl c2l6ZUhhbmRsZXN8fCJhbGwiLHBpbm5lZDp0cnVlLHJlc2l6ZUVsZW1lbnQ6dGhp cy5yZXNpemVyQWN0aW9uLGhhbmRsZUNsczoieC13aW5kb3ctaGFuZGxlIn0pO3Ro aXMucmVzaXplci53aW5kb3c9dGhpczt0aGlzLm1vbih0aGlzLnJlc2l6ZXIsImJl Zm9yZXJlc2l6ZSIsdGhpcy5iZWZvcmVSZXNpemUsdGhpcyl9aWYodGhpcy5kcmFn Z2FibGUpe3RoaXMuaGVhZGVyLmFkZENsYXNzKCJ4LXdpbmRvdy1kcmFnZ2FibGUi KX10aGlzLm1vbih0aGlzLmVsLCJtb3VzZWRvd24iLHRoaXMudG9Gcm9udCx0aGlz KTt0aGlzLm1hbmFnZXI9dGhpcy5tYW5hZ2VyfHxFeHQuV2luZG93TWdyO3RoaXMu bWFuYWdlci5yZWdpc3Rlcih0aGlzKTtpZih0aGlzLm1heGltaXplZCl7dGhpcy5t YXhpbWl6ZWQ9ZmFsc2U7dGhpcy5tYXhpbWl6ZSgpfWlmKHRoaXMuY2xvc2FibGUp e3ZhciBhPXRoaXMuZ2V0S2V5TWFwKCk7YS5vbigyNyx0aGlzLm9uRXNjLHRoaXMp O2EuZGlzYWJsZSgpfX0saW5pdERyYWdnYWJsZTpmdW5jdGlvbigpe3RoaXMuZGQ9 bmV3IEV4dC5XaW5kb3cuREQodGhpcyl9LG9uRXNjOmZ1bmN0aW9uKGEsYil7aWYo dGhpcy5hY3RpdmVHaG9zdCl7dGhpcy51bmdob3N0KCl9Yi5zdG9wRXZlbnQoKTt0 aGlzW3RoaXMuY2xvc2VBY3Rpb25dKCl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24o KXtpZih0aGlzLnJlbmRlcmVkKXt0aGlzLmhpZGUoKTt0aGlzLmNsZWFyQW5jaG9y KCk7RXh0LmRlc3Ryb3kodGhpcy5mb2N1c0VsLHRoaXMucmVzaXplcix0aGlzLmRk LHRoaXMucHJveHksdGhpcy5tYXNrKX1FeHQuV2luZG93LnN1cGVyY2xhc3MuYmVm b3JlRGVzdHJveS5jYWxsKHRoaXMpfSxvbkRlc3Ryb3k6ZnVuY3Rpb24oKXtpZih0 aGlzLm1hbmFnZXIpe3RoaXMubWFuYWdlci51bnJlZ2lzdGVyKHRoaXMpfUV4dC5X aW5kb3cuc3VwZXJjbGFzcy5vbkRlc3Ryb3kuY2FsbCh0aGlzKX0saW5pdFRvb2xz OmZ1bmN0aW9uKCl7aWYodGhpcy5taW5pbWl6YWJsZSl7dGhpcy5hZGRUb29sKHtp ZDoibWluaW1pemUiLGhhbmRsZXI6dGhpcy5taW5pbWl6ZS5jcmVhdGVEZWxlZ2F0 ZSh0aGlzLFtdKX0pfWlmKHRoaXMubWF4aW1pemFibGUpe3RoaXMuYWRkVG9vbCh7 aWQ6Im1heGltaXplIixoYW5kbGVyOnRoaXMubWF4aW1pemUuY3JlYXRlRGVsZWdh dGUodGhpcyxbXSl9KTt0aGlzLmFkZFRvb2woe2lkOiJyZXN0b3JlIixoYW5kbGVy OnRoaXMucmVzdG9yZS5jcmVhdGVEZWxlZ2F0ZSh0aGlzLFtdKSxoaWRkZW46dHJ1 ZX0pfWlmKHRoaXMuY2xvc2FibGUpe3RoaXMuYWRkVG9vbCh7aWQ6ImNsb3NlIixo YW5kbGVyOnRoaXNbdGhpcy5jbG9zZUFjdGlvbl0uY3JlYXRlRGVsZWdhdGUodGhp cyxbXSl9KX19LHJlc2l6ZXJBY3Rpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBy b3h5LmdldEJveCgpO3RoaXMucHJveHkuaGlkZSgpO3RoaXMud2luZG93LmhhbmRs ZVJlc2l6ZShhKTtyZXR1cm4gYX0sYmVmb3JlUmVzaXplOmZ1bmN0aW9uKCl7dGhp cy5yZXNpemVyLm1pbkhlaWdodD1NYXRoLm1heCh0aGlzLm1pbkhlaWdodCx0aGlz LmdldEZyYW1lSGVpZ2h0KCkrNDApO3RoaXMucmVzaXplci5taW5XaWR0aD1NYXRo Lm1heCh0aGlzLm1pbldpZHRoLHRoaXMuZ2V0RnJhbWVXaWR0aCgpKzQwKTt0aGlz LnJlc2l6ZUJveD10aGlzLmVsLmdldEJveCgpfSx1cGRhdGVIYW5kbGVzOmZ1bmN0 aW9uKCl7aWYoRXh0LmlzSUUmJnRoaXMucmVzaXplcil7dGhpcy5yZXNpemVyLnN5 bmNIYW5kbGVIZWlnaHQoKTt0aGlzLmVsLnJlcGFpbnQoKX19LGhhbmRsZVJlc2l6 ZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnJlc2l6ZUJveDtpZihhLnghPWIueHx8 YS55IT1iLnkpe3RoaXMudXBkYXRlQm94KGIpfWVsc2V7dGhpcy5zZXRTaXplKGIp O2lmKEV4dC5pc0lFNiYmRXh0LmlzU3RyaWN0KXt0aGlzLmRvTGF5b3V0KCl9fXRo aXMuZm9jdXMoKTt0aGlzLnVwZGF0ZUhhbmRsZXMoKTt0aGlzLnNhdmVTdGF0ZSgp fSxmb2N1czpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZm9jdXNFbCxhPXRoaXMuZGVm YXVsdEJ1dHRvbixjPXR5cGVvZiBhLGQsYjtpZihFeHQuaXNEZWZpbmVkKGEpKXtp ZihFeHQuaXNOdW1iZXIoYSkmJnRoaXMuZmJhcil7ZT10aGlzLmZiYXIuaXRlbXMu Z2V0KGEpfWVsc2V7aWYoRXh0LmlzU3RyaW5nKGEpKXtlPUV4dC5nZXRDbXAoYSl9 ZWxzZXtlPWF9fWQ9ZS5nZXRFbCgpO2I9RXh0LmdldERvbSh0aGlzLmNvbnRhaW5l cik7aWYoZCYmYil7aWYoYiE9ZG9jdW1lbnQuYm9keSYmIUV4dC5saWIuUmVnaW9u LmdldFJlZ2lvbihiKS5jb250YWlucyhFeHQubGliLlJlZ2lvbi5nZXRSZWdpb24o ZC5kb20pKSl7cmV0dXJufX19ZT1lfHx0aGlzLmZvY3VzRWw7ZS5mb2N1cy5kZWZl cigxMCxlKX0sc2V0QW5pbWF0ZVRhcmdldDpmdW5jdGlvbihhKXthPUV4dC5nZXQo YSk7dGhpcy5hbmltYXRlVGFyZ2V0PWF9LGJlZm9yZVNob3c6ZnVuY3Rpb24oKXtk ZWxldGUgdGhpcy5lbC5sYXN0WFk7ZGVsZXRlIHRoaXMuZWwubGFzdExUO2lmKHRo aXMueD09PXVuZGVmaW5lZHx8dGhpcy55PT09dW5kZWZpbmVkKXt2YXIgYT10aGlz LmVsLmdldEFsaWduVG9YWSh0aGlzLmNvbnRhaW5lciwiYy1jIik7dmFyIGI9dGhp cy5lbC50cmFuc2xhdGVQb2ludHMoYVswXSxhWzFdKTt0aGlzLng9dGhpcy54PT09 dW5kZWZpbmVkP2IubGVmdDp0aGlzLng7dGhpcy55PXRoaXMueT09PXVuZGVmaW5l ZD9iLnRvcDp0aGlzLnl9dGhpcy5lbC5zZXRMZWZ0VG9wKHRoaXMueCx0aGlzLnkp O2lmKHRoaXMuZXhwYW5kT25TaG93KXt0aGlzLmV4cGFuZChmYWxzZSl9aWYodGhp cy5tb2RhbCl7RXh0LmdldEJvZHkoKS5hZGRDbGFzcygieC1ib2R5LW1hc2tlZCIp O3RoaXMubWFzay5zZXRTaXplKEV4dC5saWIuRG9tLmdldFZpZXdXaWR0aCh0cnVl KSxFeHQubGliLkRvbS5nZXRWaWV3SGVpZ2h0KHRydWUpKTt0aGlzLm1hc2suc2hv dygpfX0sc2hvdzpmdW5jdGlvbihjLGEsYil7aWYoIXRoaXMucmVuZGVyZWQpe3Ro aXMucmVuZGVyKEV4dC5nZXRCb2R5KCkpfWlmKHRoaXMuaGlkZGVuPT09ZmFsc2Up e3RoaXMudG9Gcm9udCgpO3JldHVybiB0aGlzfWlmKHRoaXMuZmlyZUV2ZW50KCJi ZWZvcmVzaG93Iix0aGlzKT09PWZhbHNlKXtyZXR1cm4gdGhpc31pZihhKXt0aGlz Lm9uKCJzaG93IixhLGIse3NpbmdsZTp0cnVlfSl9dGhpcy5oaWRkZW49ZmFsc2U7 aWYoRXh0LmlzRGVmaW5lZChjKSl7dGhpcy5zZXRBbmltYXRlVGFyZ2V0KGMpfXRo aXMuYmVmb3JlU2hvdygpO2lmKHRoaXMuYW5pbWF0ZVRhcmdldCl7dGhpcy5hbmlt U2hvdygpfWVsc2V7dGhpcy5hZnRlclNob3coKX1yZXR1cm4gdGhpc30sYWZ0ZXJT aG93OmZ1bmN0aW9uKGIpe2lmKHRoaXMuaXNEZXN0cm95ZWQpe3JldHVybiBmYWxz ZX10aGlzLnByb3h5LmhpZGUoKTt0aGlzLmVsLnNldFN0eWxlKCJkaXNwbGF5Iiwi YmxvY2siKTt0aGlzLmVsLnNob3coKTtpZih0aGlzLm1heGltaXplZCl7dGhpcy5m aXRDb250YWluZXIoKX1pZihFeHQuaXNNYWMmJkV4dC5pc0dlY2tvMil7dGhpcy5j YXNjYWRlKHRoaXMuc2V0QXV0b1Njcm9sbCl9aWYodGhpcy5tb25pdG9yUmVzaXpl fHx0aGlzLm1vZGFsfHx0aGlzLmNvbnN0cmFpbnx8dGhpcy5jb25zdHJhaW5IZWFk ZXIpe0V4dC5FdmVudE1hbmFnZXIub25XaW5kb3dSZXNpemUodGhpcy5vbldpbmRv d1Jlc2l6ZSx0aGlzKX10aGlzLmRvQ29uc3RyYWluKCk7dGhpcy5kb0xheW91dCgp O2lmKHRoaXMua2V5TWFwKXt0aGlzLmtleU1hcC5lbmFibGUoKX10aGlzLnRvRnJv bnQoKTt0aGlzLnVwZGF0ZUhhbmRsZXMoKTtpZihiJiYoRXh0LmlzSUV8fEV4dC5p c1dlYktpdCkpe3ZhciBhPXRoaXMuZ2V0U2l6ZSgpO3RoaXMub25SZXNpemUoYS53 aWR0aCxhLmhlaWdodCl9dGhpcy5vblNob3coKTt0aGlzLmZpcmVFdmVudCgic2hv dyIsdGhpcyl9LGFuaW1TaG93OmZ1bmN0aW9uKCl7dGhpcy5wcm94eS5zaG93KCk7 dGhpcy5wcm94eS5zZXRCb3godGhpcy5hbmltYXRlVGFyZ2V0LmdldEJveCgpKTt0 aGlzLnByb3h5LnNldE9wYWNpdHkoMCk7dmFyIGE9dGhpcy5nZXRCb3goKTt0aGlz LmVsLnNldFN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpO3RoaXMucHJveHkuc2hpZnQo RXh0LmFwcGx5KGEse2NhbGxiYWNrOnRoaXMuYWZ0ZXJTaG93LmNyZWF0ZURlbGVn YXRlKHRoaXMsW3RydWVdLGZhbHNlKSxzY29wZTp0aGlzLGVhc2luZzoiZWFzZU5v bmUiLGR1cmF0aW9uOnRoaXMuc2hvd0FuaW1EdXJhdGlvbixvcGFjaXR5OjAuNX0p KX0saGlkZTpmdW5jdGlvbihjLGEsYil7aWYodGhpcy5oaWRkZW58fHRoaXMuZmly ZUV2ZW50KCJiZWZvcmVoaWRlIix0aGlzKT09PWZhbHNlKXtyZXR1cm4gdGhpc31p ZihhKXt0aGlzLm9uKCJoaWRlIixhLGIse3NpbmdsZTp0cnVlfSl9dGhpcy5oaWRk ZW49dHJ1ZTtpZihjIT09dW5kZWZpbmVkKXt0aGlzLnNldEFuaW1hdGVUYXJnZXQo Yyl9aWYodGhpcy5tb2RhbCl7dGhpcy5tYXNrLmhpZGUoKTtFeHQuZ2V0Qm9keSgp LnJlbW92ZUNsYXNzKCJ4LWJvZHktbWFza2VkIil9aWYodGhpcy5hbmltYXRlVGFy Z2V0KXt0aGlzLmFuaW1IaWRlKCl9ZWxzZXt0aGlzLmVsLmhpZGUoKTt0aGlzLmFm dGVySGlkZSgpfXJldHVybiB0aGlzfSxhZnRlckhpZGU6ZnVuY3Rpb24oKXt0aGlz LnByb3h5LmhpZGUoKTtpZih0aGlzLm1vbml0b3JSZXNpemV8fHRoaXMubW9kYWx8 fHRoaXMuY29uc3RyYWlufHx0aGlzLmNvbnN0cmFpbkhlYWRlcil7RXh0LkV2ZW50 TWFuYWdlci5yZW1vdmVSZXNpemVMaXN0ZW5lcih0aGlzLm9uV2luZG93UmVzaXpl LHRoaXMpfWlmKHRoaXMua2V5TWFwKXt0aGlzLmtleU1hcC5kaXNhYmxlKCl9dGhp cy5vbkhpZGUoKTt0aGlzLmZpcmVFdmVudCgiaGlkZSIsdGhpcyl9LGFuaW1IaWRl OmZ1bmN0aW9uKCl7dGhpcy5wcm94eS5zZXRPcGFjaXR5KDAuNSk7dGhpcy5wcm94 eS5zaG93KCk7dmFyIGE9dGhpcy5nZXRCb3goZmFsc2UpO3RoaXMucHJveHkuc2V0 Qm94KGEpO3RoaXMuZWwuaGlkZSgpO3RoaXMucHJveHkuc2hpZnQoRXh0LmFwcGx5 KHRoaXMuYW5pbWF0ZVRhcmdldC5nZXRCb3goKSx7Y2FsbGJhY2s6dGhpcy5hZnRl ckhpZGUsc2NvcGU6dGhpcyxkdXJhdGlvbjp0aGlzLmhpZGVBbmltRHVyYXRpb24s ZWFzaW5nOiJlYXNlTm9uZSIsb3BhY2l0eTowfSkpfSxvblNob3c6RXh0LmVtcHR5 Rm4sb25IaWRlOkV4dC5lbXB0eUZuLG9uV2luZG93UmVzaXplOmZ1bmN0aW9uKCl7 aWYodGhpcy5tYXhpbWl6ZWQpe3RoaXMuZml0Q29udGFpbmVyKCl9aWYodGhpcy5t b2RhbCl7dGhpcy5tYXNrLnNldFNpemUoIjEwMCUiLCIxMDAlIik7dmFyIGE9dGhp cy5tYXNrLmRvbS5vZmZzZXRIZWlnaHQ7dGhpcy5tYXNrLnNldFNpemUoRXh0Lmxp Yi5Eb20uZ2V0Vmlld1dpZHRoKHRydWUpLEV4dC5saWIuRG9tLmdldFZpZXdIZWln aHQodHJ1ZSkpfXRoaXMuZG9Db25zdHJhaW4oKX0sZG9Db25zdHJhaW46ZnVuY3Rp b24oKXtpZih0aGlzLmNvbnN0cmFpbnx8dGhpcy5jb25zdHJhaW5IZWFkZXIpe3Zh ciBiO2lmKHRoaXMuY29uc3RyYWluKXtiPXtyaWdodDp0aGlzLmVsLnNoYWRvd09m ZnNldCxsZWZ0OnRoaXMuZWwuc2hhZG93T2Zmc2V0LGJvdHRvbTp0aGlzLmVsLnNo YWRvd09mZnNldH19ZWxzZXt2YXIgYT10aGlzLmdldFNpemUoKTtiPXtyaWdodDot KGEud2lkdGgtMTAwKSxib3R0b206LShhLmhlaWdodC0yNSt0aGlzLmVsLmdldENv bnN0cmFpbk9mZnNldCgpKX19dmFyIGM9dGhpcy5lbC5nZXRDb25zdHJhaW5Ub1hZ KHRoaXMuY29udGFpbmVyLHRydWUsYik7aWYoYyl7dGhpcy5zZXRQb3NpdGlvbihj WzBdLGNbMV0pfX19LGdob3N0OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY3JlYXRl R2hvc3QoYSk7dmFyIGI9dGhpcy5nZXRCb3godHJ1ZSk7Yy5zZXRMZWZ0VG9wKGIu eCxiLnkpO2Muc2V0V2lkdGgoYi53aWR0aCk7dGhpcy5lbC5oaWRlKCk7dGhpcy5h Y3RpdmVHaG9zdD1jO3JldHVybiBjfSx1bmdob3N0OmZ1bmN0aW9uKGIsYSl7aWYo IXRoaXMuYWN0aXZlR2hvc3Qpe3JldHVybn1pZihiIT09ZmFsc2Upe3RoaXMuZWwu c2hvdygpO3RoaXMuZm9jdXMuZGVmZXIoMTAsdGhpcyk7aWYoRXh0LmlzTWFjJiZF eHQuaXNHZWNrbzIpe3RoaXMuY2FzY2FkZSh0aGlzLnNldEF1dG9TY3JvbGwpfX1p ZihhIT09ZmFsc2Upe3RoaXMuc2V0UG9zaXRpb24odGhpcy5hY3RpdmVHaG9zdC5n ZXRMZWZ0KHRydWUpLHRoaXMuYWN0aXZlR2hvc3QuZ2V0VG9wKHRydWUpKX10aGlz LmFjdGl2ZUdob3N0LmhpZGUoKTt0aGlzLmFjdGl2ZUdob3N0LnJlbW92ZSgpO2Rl bGV0ZSB0aGlzLmFjdGl2ZUdob3N0fSxtaW5pbWl6ZTpmdW5jdGlvbigpe3RoaXMu ZmlyZUV2ZW50KCJtaW5pbWl6ZSIsdGhpcyk7cmV0dXJuIHRoaXN9LGNsb3NlOmZ1 bmN0aW9uKCl7aWYodGhpcy5maXJlRXZlbnQoImJlZm9yZWNsb3NlIix0aGlzKSE9 PWZhbHNlKXtpZih0aGlzLmhpZGRlbil7dGhpcy5kb0Nsb3NlKCl9ZWxzZXt0aGlz LmhpZGUobnVsbCx0aGlzLmRvQ2xvc2UsdGhpcyl9fX0sZG9DbG9zZTpmdW5jdGlv bigpe3RoaXMuZmlyZUV2ZW50KCJjbG9zZSIsdGhpcyk7dGhpcy5kZXN0cm95KCl9 LG1heGltaXplOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWF4aW1pemVkKXt0aGlzLmV4 cGFuZChmYWxzZSk7dGhpcy5yZXN0b3JlU2l6ZT10aGlzLmdldFNpemUoKTt0aGlz LnJlc3RvcmVQb3M9dGhpcy5nZXRQb3NpdGlvbih0cnVlKTtpZih0aGlzLm1heGlt aXphYmxlKXt0aGlzLnRvb2xzLm1heGltaXplLmhpZGUoKTt0aGlzLnRvb2xzLnJl c3RvcmUuc2hvdygpfXRoaXMubWF4aW1pemVkPXRydWU7dGhpcy5lbC5kaXNhYmxl U2hhZG93KCk7aWYodGhpcy5kZCl7dGhpcy5kZC5sb2NrKCl9aWYodGhpcy5jb2xs YXBzaWJsZSl7dGhpcy50b29scy50b2dnbGUuaGlkZSgpfXRoaXMuZWwuYWRkQ2xh c3MoIngtd2luZG93LW1heGltaXplZCIpO3RoaXMuY29udGFpbmVyLmFkZENsYXNz KCJ4LXdpbmRvdy1tYXhpbWl6ZWQtY3QiKTt0aGlzLnNldFBvc2l0aW9uKDAsMCk7 dGhpcy5maXRDb250YWluZXIoKTt0aGlzLmZpcmVFdmVudCgibWF4aW1pemUiLHRo aXMpfXJldHVybiB0aGlzfSxyZXN0b3JlOmZ1bmN0aW9uKCl7aWYodGhpcy5tYXhp bWl6ZWQpe3ZhciBhPXRoaXMudG9vbHM7dGhpcy5lbC5yZW1vdmVDbGFzcygieC13 aW5kb3ctbWF4aW1pemVkIik7aWYoYS5yZXN0b3JlKXthLnJlc3RvcmUuaGlkZSgp fWlmKGEubWF4aW1pemUpe2EubWF4aW1pemUuc2hvdygpfXRoaXMuc2V0UG9zaXRp b24odGhpcy5yZXN0b3JlUG9zWzBdLHRoaXMucmVzdG9yZVBvc1sxXSk7dGhpcy5z ZXRTaXplKHRoaXMucmVzdG9yZVNpemUud2lkdGgsdGhpcy5yZXN0b3JlU2l6ZS5o ZWlnaHQpO2RlbGV0ZSB0aGlzLnJlc3RvcmVQb3M7ZGVsZXRlIHRoaXMucmVzdG9y ZVNpemU7dGhpcy5tYXhpbWl6ZWQ9ZmFsc2U7dGhpcy5lbC5lbmFibGVTaGFkb3co dHJ1ZSk7aWYodGhpcy5kZCl7dGhpcy5kZC51bmxvY2soKX1pZih0aGlzLmNvbGxh cHNpYmxlJiZhLnRvZ2dsZSl7YS50b2dnbGUuc2hvdygpfXRoaXMuY29udGFpbmVy LnJlbW92ZUNsYXNzKCJ4LXdpbmRvdy1tYXhpbWl6ZWQtY3QiKTt0aGlzLmRvQ29u c3RyYWluKCk7dGhpcy5maXJlRXZlbnQoInJlc3RvcmUiLHRoaXMpfXJldHVybiB0 aGlzfSx0b2dnbGVNYXhpbWl6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzW3RoaXMu bWF4aW1pemVkPyJyZXN0b3JlIjoibWF4aW1pemUiXSgpfSxmaXRDb250YWluZXI6 ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNvbnRhaW5lci5nZXRWaWV3U2l6ZShmYWxz ZSk7dGhpcy5zZXRTaXplKGEud2lkdGgsYS5oZWlnaHQpfSxzZXRaSW5kZXg6ZnVu Y3Rpb24oYSl7aWYodGhpcy5tb2RhbCl7dGhpcy5tYXNrLnNldFN0eWxlKCJ6LWlu ZGV4IixhKX10aGlzLmVsLnNldFpJbmRleCgrK2EpO2ErPTU7aWYodGhpcy5yZXNp emVyKXt0aGlzLnJlc2l6ZXIucHJveHkuc2V0U3R5bGUoInotaW5kZXgiLCsrYSl9 dGhpcy5sYXN0WkluZGV4PWF9LGFsaWduVG86ZnVuY3Rpb24oYixhLGMpe3ZhciBk PXRoaXMuZWwuZ2V0QWxpZ25Ub1hZKGIsYSxjKTt0aGlzLnNldFBhZ2VQb3NpdGlv bihkWzBdLGRbMV0pO3JldHVybiB0aGlzfSxhbmNob3JUbzpmdW5jdGlvbihjLGUs ZCxiKXt0aGlzLmNsZWFyQW5jaG9yKCk7dGhpcy5hbmNob3JUYXJnZXQ9e2VsOmMs YWxpZ25tZW50OmUsb2Zmc2V0czpkfTtFeHQuRXZlbnRNYW5hZ2VyLm9uV2luZG93 UmVzaXplKHRoaXMuZG9BbmNob3IsdGhpcyk7dmFyIGE9dHlwZW9mIGI7aWYoYSE9 InVuZGVmaW5lZCIpe0V4dC5FdmVudE1hbmFnZXIub24od2luZG93LCJzY3JvbGwi LHRoaXMuZG9BbmNob3IsdGhpcyx7YnVmZmVyOmE9PSJudW1iZXIiP2I6NTB9KX1y ZXR1cm4gdGhpcy5kb0FuY2hvcigpfSxkb0FuY2hvcjpmdW5jdGlvbigpe3ZhciBh PXRoaXMuYW5jaG9yVGFyZ2V0O3RoaXMuYWxpZ25UbyhhLmVsLGEuYWxpZ25tZW50 LGEub2Zmc2V0cyk7cmV0dXJuIHRoaXN9LGNsZWFyQW5jaG9yOmZ1bmN0aW9uKCl7 aWYodGhpcy5hbmNob3JUYXJnZXQpe0V4dC5FdmVudE1hbmFnZXIucmVtb3ZlUmVz aXplTGlzdGVuZXIodGhpcy5kb0FuY2hvcix0aGlzKTtFeHQuRXZlbnRNYW5hZ2Vy LnVuKHdpbmRvdywic2Nyb2xsIix0aGlzLmRvQW5jaG9yLHRoaXMpO2RlbGV0ZSB0 aGlzLmFuY2hvclRhcmdldH1yZXR1cm4gdGhpc30sdG9Gcm9udDpmdW5jdGlvbihh KXtpZih0aGlzLm1hbmFnZXIuYnJpbmdUb0Zyb250KHRoaXMpKXtpZighYXx8IWEu Z2V0VGFyZ2V0KCkuZm9jdXMpe3RoaXMuZm9jdXMoKX19cmV0dXJuIHRoaXN9LHNl dEFjdGl2ZTpmdW5jdGlvbihhKXtpZihhKXtpZighdGhpcy5tYXhpbWl6ZWQpe3Ro aXMuZWwuZW5hYmxlU2hhZG93KHRydWUpfXRoaXMuZmlyZUV2ZW50KCJhY3RpdmF0 ZSIsdGhpcyl9ZWxzZXt0aGlzLmVsLmRpc2FibGVTaGFkb3coKTt0aGlzLmZpcmVF dmVudCgiZGVhY3RpdmF0ZSIsdGhpcyl9fSx0b0JhY2s6ZnVuY3Rpb24oKXt0aGlz Lm1hbmFnZXIuc2VuZFRvQmFjayh0aGlzKTtyZXR1cm4gdGhpc30sY2VudGVyOmZ1 bmN0aW9uKCl7dmFyIGE9dGhpcy5lbC5nZXRBbGlnblRvWFkodGhpcy5jb250YWlu ZXIsImMtYyIpO3RoaXMuc2V0UGFnZVBvc2l0aW9uKGFbMF0sYVsxXSk7cmV0dXJu IHRoaXN9fSk7RXh0LnJlZygid2luZG93IixFeHQuV2luZG93KTtFeHQuV2luZG93 LkREPUV4dC5leHRlbmQoRXh0LmRkLkRELHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihh KXt0aGlzLndpbj1hO0V4dC5XaW5kb3cuREQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rv ci5jYWxsKHRoaXMsYS5lbC5pZCwiV2luZG93REQtIithLmlkKTt0aGlzLnNldEhh bmRsZUVsSWQoYS5oZWFkZXIuaWQpO3RoaXMuc2Nyb2xsPWZhbHNlfSxtb3ZlT25s eTp0cnVlLGhlYWRlck9mZnNldHM6WzEwMCwyNV0sc3RhcnREcmFnOmZ1bmN0aW9u KCl7dmFyIGE9dGhpcy53aW47dGhpcy5wcm94eT1hLmdob3N0KGEuaW5pdGlhbENv bmZpZy5jbHMpO2lmKGEuY29uc3RyYWluIT09ZmFsc2Upe3ZhciBjPWEuZWwuc2hh ZG93T2Zmc2V0O3RoaXMuY29uc3RyYWluVG8oYS5jb250YWluZXIse3JpZ2h0OmMs bGVmdDpjLGJvdHRvbTpjfSl9ZWxzZXtpZihhLmNvbnN0cmFpbkhlYWRlciE9PWZh bHNlKXt2YXIgYj10aGlzLnByb3h5LmdldFNpemUoKTt0aGlzLmNvbnN0cmFpblRv KGEuY29udGFpbmVyLHtyaWdodDotKGIud2lkdGgtdGhpcy5oZWFkZXJPZmZzZXRz WzBdKSxib3R0b206LShiLmhlaWdodC10aGlzLmhlYWRlck9mZnNldHNbMV0pfSl9 fX0sYjREcmFnOkV4dC5lbXB0eUZuLG9uRHJhZzpmdW5jdGlvbihhKXt0aGlzLmFs aWduRWxXaXRoTW91c2UodGhpcy5wcm94eSxhLmdldFBhZ2VYKCksYS5nZXRQYWdl WSgpKX0sZW5kRHJhZzpmdW5jdGlvbihhKXt0aGlzLndpbi51bmdob3N0KCk7dGhp cy53aW4uc2F2ZVN0YXRlKCl9fSk7RXh0LldpbmRvd0dyb3VwPWZ1bmN0aW9uKCl7 dmFyIGc9e307dmFyIGQ9W107dmFyIGU9bnVsbDt2YXIgYz1mdW5jdGlvbihqLGkp e3JldHVybighai5fbGFzdEFjY2Vzc3x8ai5fbGFzdEFjY2VzczxpLl9sYXN0QWNj ZXNzKT8tMToxfTt2YXIgaD1mdW5jdGlvbigpe3ZhciBsPWQsaj1sLmxlbmd0aDtp ZihqPjApe2wuc29ydChjKTt2YXIgaz1sWzBdLm1hbmFnZXIuenNlZWQ7Zm9yKHZh ciBtPTA7bTxqO20rKyl7dmFyIG49bFttXTtpZihuJiYhbi5oaWRkZW4pe24uc2V0 WkluZGV4KGsrKG0qMTApKX19fWEoKX07dmFyIGI9ZnVuY3Rpb24oaSl7aWYoaSE9 ZSl7aWYoZSl7ZS5zZXRBY3RpdmUoZmFsc2UpfWU9aTtpZihpKXtpLnNldEFjdGl2 ZSh0cnVlKX19fTt2YXIgYT1mdW5jdGlvbigpe2Zvcih2YXIgaj1kLmxlbmd0aC0x O2o+PTA7LS1qKXtpZighZFtqXS5oaWRkZW4pe2IoZFtqXSk7cmV0dXJufX1iKG51 bGwpfTtyZXR1cm57enNlZWQ6OTAwMCxyZWdpc3RlcjpmdW5jdGlvbihpKXtpZihp Lm1hbmFnZXIpe2kubWFuYWdlci51bnJlZ2lzdGVyKGkpfWkubWFuYWdlcj10aGlz O2dbaS5pZF09aTtkLnB1c2goaSk7aS5vbigiaGlkZSIsYSl9LHVucmVnaXN0ZXI6 ZnVuY3Rpb24oaSl7ZGVsZXRlIGkubWFuYWdlcjtkZWxldGUgZ1tpLmlkXTtpLnVu KCJoaWRlIixhKTtkLnJlbW92ZShpKX0sZ2V0OmZ1bmN0aW9uKGkpe3JldHVybiB0 eXBlb2YgaT09Im9iamVjdCI/aTpnW2ldfSxicmluZ1RvRnJvbnQ6ZnVuY3Rpb24o aSl7aT10aGlzLmdldChpKTtpZihpIT1lKXtpLl9sYXN0QWNjZXNzPW5ldyBEYXRl KCkuZ2V0VGltZSgpO2goKTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9LHNlbmRU b0JhY2s6ZnVuY3Rpb24oaSl7aT10aGlzLmdldChpKTtpLl9sYXN0QWNjZXNzPS0o bmV3IERhdGUoKS5nZXRUaW1lKCkpO2goKTtyZXR1cm4gaX0saGlkZUFsbDpmdW5j dGlvbigpe2Zvcih2YXIgaSBpbiBnKXtpZihnW2ldJiZ0eXBlb2YgZ1tpXSE9ImZ1 bmN0aW9uIiYmZ1tpXS5pc1Zpc2libGUoKSl7Z1tpXS5oaWRlKCl9fX0sZ2V0QWN0 aXZlOmZ1bmN0aW9uKCl7cmV0dXJuIGV9LGdldEJ5OmZ1bmN0aW9uKGwsayl7dmFy IG09W107Zm9yKHZhciBqPWQubGVuZ3RoLTE7aj49MDstLWope3ZhciBuPWRbal07 aWYobC5jYWxsKGt8fG4sbikhPT1mYWxzZSl7bS5wdXNoKG4pfX1yZXR1cm4gbX0s ZWFjaDpmdW5jdGlvbihqLGkpe2Zvcih2YXIgayBpbiBnKXtpZihnW2tdJiZ0eXBl b2YgZ1trXSE9ImZ1bmN0aW9uIil7aWYoai5jYWxsKGl8fGdba10sZ1trXSk9PT1m YWxzZSl7cmV0dXJufX19fX19O0V4dC5XaW5kb3dNZ3I9bmV3IEV4dC5XaW5kb3dH cm91cCgpO0V4dC5NZXNzYWdlQm94PWZ1bmN0aW9uKCl7dmFyIHUsYixxLHQsaCxs LHMsYSxuLHAsaixnLHIsdixvLGk9IiIsZD0iIixtPVsib2siLCJ5ZXMiLCJubyIs ImNhbmNlbCJdO3ZhciBjPWZ1bmN0aW9uKHgpe3JbeF0uYmx1cigpO2lmKHUuaXNW aXNpYmxlKCkpe3UuaGlkZSgpO3coKTtFeHQuY2FsbGJhY2soYi5mbixiLnNjb3Bl fHx3aW5kb3csW3gsdi5kb20udmFsdWUsYl0sMSl9fTt2YXIgdz1mdW5jdGlvbigp e2lmKGImJmIuY2xzKXt1LmVsLnJlbW92ZUNsYXNzKGIuY2xzKX1uLnJlc2V0KCl9 O3ZhciBlPWZ1bmN0aW9uKHoseCx5KXtpZihiJiZiLmNsb3NhYmxlIT09ZmFsc2Up e3UuaGlkZSgpO3coKX1pZih5KXt5LnN0b3BFdmVudCgpfX07dmFyIGs9ZnVuY3Rp b24oeCl7dmFyIHo9MCx5O2lmKCF4KXtFeHQuZWFjaChtLGZ1bmN0aW9uKEEpe3Jb QV0uaGlkZSgpfSk7cmV0dXJuIHp9dS5mb290ZXIuZG9tLnN0eWxlLmRpc3BsYXk9 IiI7RXh0Lml0ZXJhdGUocixmdW5jdGlvbihBLEIpe3k9eFtBXTtpZih5KXtCLnNo b3coKTtCLnNldFRleHQoRXh0LmlzU3RyaW5nKHkpP3k6RXh0Lk1lc3NhZ2VCb3gu YnV0dG9uVGV4dFtBXSk7eis9Qi5nZXRFbCgpLmdldFdpZHRoKCkrMTV9ZWxzZXtC LmhpZGUoKX19KTtyZXR1cm4gen07cmV0dXJue2dldERpYWxvZzpmdW5jdGlvbih4 KXtpZighdSl7dmFyIHo9W107cj17fTtFeHQuZWFjaChtLGZ1bmN0aW9uKEEpe3ou cHVzaChyW0FdPW5ldyBFeHQuQnV0dG9uKHt0ZXh0OnRoaXMuYnV0dG9uVGV4dFtB XSxoYW5kbGVyOmMuY3JlYXRlQ2FsbGJhY2soQSksaGlkZU1vZGU6Im9mZnNldHMi fSkpfSx0aGlzKTt1PW5ldyBFeHQuV2luZG93KHthdXRvQ3JlYXRlOnRydWUsdGl0 bGU6eCxyZXNpemFibGU6ZmFsc2UsY29uc3RyYWluOnRydWUsY29uc3RyYWluSGVh ZGVyOnRydWUsbWluaW1pemFibGU6ZmFsc2UsbWF4aW1pemFibGU6ZmFsc2Usc3Rh dGVmdWw6ZmFsc2UsbW9kYWw6dHJ1ZSxzaGltOnRydWUsYnV0dG9uQWxpZ246ImNl bnRlciIsd2lkdGg6NDAwLGhlaWdodDoxMDAsbWluSGVpZ2h0OjgwLHBsYWluOnRy dWUsZm9vdGVyOnRydWUsY2xvc2FibGU6dHJ1ZSxjbG9zZTpmdW5jdGlvbigpe2lm KGImJmIuYnV0dG9ucyYmYi5idXR0b25zLm5vJiYhYi5idXR0b25zLmNhbmNlbCl7 Yygibm8iKX1lbHNle2MoImNhbmNlbCIpfX0sZmJhcjpuZXcgRXh0LlRvb2xiYXIo e2l0ZW1zOnosZW5hYmxlT3ZlcmZsb3c6ZmFsc2V9KX0pO3UucmVuZGVyKGRvY3Vt ZW50LmJvZHkpO3UuZ2V0RWwoKS5hZGRDbGFzcygieC13aW5kb3ctZGxnIik7cT11 Lm1hc2s7aD11LmJvZHkuY3JlYXRlQ2hpbGQoe2h0bWw6JzxkaXYgY2xhc3M9ImV4 dC1tYi1pY29uIj48L2Rpdj48ZGl2IGNsYXNzPSJleHQtbWItY29udGVudCI+PHNw YW4gY2xhc3M9ImV4dC1tYi10ZXh0Ij48L3NwYW4+PGJyIC8+PGRpdiBjbGFzcz0i ZXh0LW1iLWZpeC1jdXJzb3IiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZXh0 LW1iLWlucHV0IiAvPjx0ZXh0YXJlYSBjbGFzcz0iZXh0LW1iLXRleHRhcmVhIj48 L3RleHRhcmVhPjwvZGl2PjwvZGl2Pid9KTtqPUV4dC5nZXQoaC5kb20uZmlyc3RD aGlsZCk7dmFyIHk9aC5kb20uY2hpbGROb2Rlc1sxXTtsPUV4dC5nZXQoeS5maXJz dENoaWxkKTtzPUV4dC5nZXQoeS5jaGlsZE5vZGVzWzJdLmZpcnN0Q2hpbGQpO3Mu ZW5hYmxlRGlzcGxheU1vZGUoKTtzLmFkZEtleUxpc3RlbmVyKFsxMCwxM10sZnVu Y3Rpb24oKXtpZih1LmlzVmlzaWJsZSgpJiZiJiZiLmJ1dHRvbnMpe2lmKGIuYnV0 dG9ucy5vayl7Yygib2siKX1lbHNle2lmKGIuYnV0dG9ucy55ZXMpe2MoInllcyIp fX19fSk7YT1FeHQuZ2V0KHkuY2hpbGROb2Rlc1syXS5jaGlsZE5vZGVzWzFdKTth LmVuYWJsZURpc3BsYXlNb2RlKCk7bj1uZXcgRXh0LlByb2dyZXNzQmFyKHtyZW5k ZXJUbzpofSk7aC5jcmVhdGVDaGlsZCh7Y2xzOiJ4LWNsZWFyIn0pfXJldHVybiB1 fSx1cGRhdGVUZXh0OmZ1bmN0aW9uKEEpe2lmKCF1LmlzVmlzaWJsZSgpJiYhYi53 aWR0aCl7dS5zZXRTaXplKHRoaXMubWF4V2lkdGgsMTAwKX1sLnVwZGF0ZShBP0Er IiAiOiImIzE2MDsiKTt2YXIgeT1kIT0iIj8oai5nZXRXaWR0aCgpK2ouZ2V0TWFy Z2lucygibHIiKSk6MCxDPWwuZ2V0V2lkdGgoKStsLmdldE1hcmdpbnMoImxyIiks ej11LmdldEZyYW1lV2lkdGgoImxyIiksQj11LmJvZHkuZ2V0RnJhbWVXaWR0aCgi bHIiKSx4O3g9TWF0aC5tYXgoTWF0aC5taW4oYi53aWR0aHx8eStDK3orQixiLm1h eFdpZHRofHx0aGlzLm1heFdpZHRoKSxNYXRoLm1heChiLm1pbldpZHRofHx0aGlz Lm1pbldpZHRoLG98fDApKTtpZihiLnByb21wdD09PXRydWUpe3Yuc2V0V2lkdGgo eC15LXotQil9aWYoYi5wcm9ncmVzcz09PXRydWV8fGIud2FpdD09PXRydWUpe24u c2V0U2l6ZSh4LXktei1CKX1pZihFeHQuaXNJRSYmeD09byl7eCs9NH1sLnVwZGF0 ZShBfHwiJiMxNjA7Iik7dS5zZXRTaXplKHgsImF1dG8iKS5jZW50ZXIoKTtyZXR1 cm4gdGhpc30sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24oeSx4LHope24udXBkYXRl UHJvZ3Jlc3MoeSx4KTtpZih6KXt0aGlzLnVwZGF0ZVRleHQoeil9cmV0dXJuIHRo aXN9LGlzVmlzaWJsZTpmdW5jdGlvbigpe3JldHVybiB1JiZ1LmlzVmlzaWJsZSgp fSxoaWRlOmZ1bmN0aW9uKCl7dmFyIHg9dT91LmFjdGl2ZUdob3N0Om51bGw7aWYo dGhpcy5pc1Zpc2libGUoKXx8eCl7dS5oaWRlKCk7dygpO2lmKHgpe3UudW5naG9z dChmYWxzZSxmYWxzZSl9fXJldHVybiB0aGlzfSxzaG93OmZ1bmN0aW9uKEEpe2lm KHRoaXMuaXNWaXNpYmxlKCkpe3RoaXMuaGlkZSgpfWI9QTt2YXIgQj10aGlzLmdl dERpYWxvZyhiLnRpdGxlfHwiJiMxNjA7Iik7Qi5zZXRUaXRsZShiLnRpdGxlfHwi JiMxNjA7Iik7dmFyIHg9KGIuY2xvc2FibGUhPT1mYWxzZSYmYi5wcm9ncmVzcyE9 PXRydWUmJmIud2FpdCE9PXRydWUpO0IudG9vbHMuY2xvc2Uuc2V0RGlzcGxheWVk KHgpO3Y9cztiLnByb21wdD1iLnByb21wdHx8KGIubXVsdGlsaW5lP3RydWU6ZmFs c2UpO2lmKGIucHJvbXB0KXtpZihiLm11bHRpbGluZSl7cy5oaWRlKCk7YS5zaG93 KCk7YS5zZXRIZWlnaHQoRXh0LmlzTnVtYmVyKGIubXVsdGlsaW5lKT9iLm11bHRp bGluZTp0aGlzLmRlZmF1bHRUZXh0SGVpZ2h0KTt2PWF9ZWxzZXtzLnNob3coKTth LmhpZGUoKX19ZWxzZXtzLmhpZGUoKTthLmhpZGUoKX12LmRvbS52YWx1ZT1iLnZh bHVlfHwiIjtpZihiLnByb21wdCl7Qi5mb2N1c0VsPXZ9ZWxzZXt2YXIgej1iLmJ1 dHRvbnM7dmFyIHk9bnVsbDtpZih6JiZ6Lm9rKXt5PXIub2t9ZWxzZXtpZih6JiZ6 Lnllcyl7eT1yLnllc319aWYoeSl7Qi5mb2N1c0VsPXl9fWlmKEV4dC5pc0RlZmlu ZWQoYi5pY29uQ2xzKSl7Qi5zZXRJY29uQ2xhc3MoYi5pY29uQ2xzKX10aGlzLnNl dEljb24oRXh0LmlzRGVmaW5lZChiLmljb24pP2IuaWNvbjppKTtvPWsoYi5idXR0 b25zKTtuLnNldFZpc2libGUoYi5wcm9ncmVzcz09PXRydWV8fGIud2FpdD09PXRy dWUpO3RoaXMudXBkYXRlUHJvZ3Jlc3MoMCxiLnByb2dyZXNzVGV4dCk7dGhpcy51 cGRhdGVUZXh0KGIubXNnKTtpZihiLmNscyl7Qi5lbC5hZGRDbGFzcyhiLmNscyl9 Qi5wcm94eURyYWc9Yi5wcm94eURyYWc9PT10cnVlO0IubW9kYWw9Yi5tb2RhbCE9 PWZhbHNlO0IubWFzaz1iLm1vZGFsIT09ZmFsc2U/cTpmYWxzZTtpZighQi5pc1Zp c2libGUoKSl7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh1LmVsLmRvbSk7Qi5z ZXRBbmltYXRlVGFyZ2V0KGIuYW5pbUVsKTtCLm9uKCJzaG93IixmdW5jdGlvbigp e2lmKHg9PT10cnVlKXtCLmtleU1hcC5lbmFibGUoKX1lbHNle0Iua2V5TWFwLmRp c2FibGUoKX19LHRoaXMse3NpbmdsZTp0cnVlfSk7Qi5zaG93KGIuYW5pbUVsKX1p ZihiLndhaXQ9PT10cnVlKXtuLndhaXQoYi53YWl0Q29uZmlnKX1yZXR1cm4gdGhp c30sc2V0SWNvbjpmdW5jdGlvbih4KXtpZighdSl7aT14O3JldHVybn1pPXVuZGVm aW5lZDtpZih4JiZ4IT0iIil7ai5yZW1vdmVDbGFzcygieC1oaWRkZW4iKTtqLnJl cGxhY2VDbGFzcyhkLHgpO2guYWRkQ2xhc3MoIngtZGxnLWljb24iKTtkPXh9ZWxz ZXtqLnJlcGxhY2VDbGFzcyhkLCJ4LWhpZGRlbiIpO2gucmVtb3ZlQ2xhc3MoIngt ZGxnLWljb24iKTtkPSIifXJldHVybiB0aGlzfSxwcm9ncmVzczpmdW5jdGlvbih6 LHkseCl7dGhpcy5zaG93KHt0aXRsZTp6LG1zZzp5LGJ1dHRvbnM6ZmFsc2UscHJv Z3Jlc3M6dHJ1ZSxjbG9zYWJsZTpmYWxzZSxtaW5XaWR0aDp0aGlzLm1pblByb2dy ZXNzV2lkdGgscHJvZ3Jlc3NUZXh0Onh9KTtyZXR1cm4gdGhpc30sd2FpdDpmdW5j dGlvbih6LHkseCl7dGhpcy5zaG93KHt0aXRsZTp5LG1zZzp6LGJ1dHRvbnM6ZmFs c2UsY2xvc2FibGU6ZmFsc2Usd2FpdDp0cnVlLG1vZGFsOnRydWUsbWluV2lkdGg6 dGhpcy5taW5Qcm9ncmVzc1dpZHRoLHdhaXRDb25maWc6eH0pO3JldHVybiB0aGlz fSxhbGVydDpmdW5jdGlvbihBLHoseSx4KXt0aGlzLnNob3coe3RpdGxlOkEsbXNn OnosYnV0dG9uczp0aGlzLk9LLGZuOnksc2NvcGU6eCxtaW5XaWR0aDp0aGlzLm1p bldpZHRofSk7cmV0dXJuIHRoaXN9LGNvbmZpcm06ZnVuY3Rpb24oQSx6LHkseCl7 dGhpcy5zaG93KHt0aXRsZTpBLG1zZzp6LGJ1dHRvbnM6dGhpcy5ZRVNOTyxmbjp5 LHNjb3BlOngsaWNvbjp0aGlzLlFVRVNUSU9OLG1pbldpZHRoOnRoaXMubWluV2lk dGh9KTtyZXR1cm4gdGhpc30scHJvbXB0OmZ1bmN0aW9uKEMsQix6LHkseCxBKXt0 aGlzLnNob3coe3RpdGxlOkMsbXNnOkIsYnV0dG9uczp0aGlzLk9LQ0FOQ0VMLGZu OnosbWluV2lkdGg6dGhpcy5taW5Qcm9tcHRXaWR0aCxzY29wZTp5LHByb21wdDp0 cnVlLG11bHRpbGluZTp4LHZhbHVlOkF9KTtyZXR1cm4gdGhpc30sT0s6e29rOnRy dWV9LENBTkNFTDp7Y2FuY2VsOnRydWV9LE9LQ0FOQ0VMOntvazp0cnVlLGNhbmNl bDp0cnVlfSxZRVNOTzp7eWVzOnRydWUsbm86dHJ1ZX0sWUVTTk9DQU5DRUw6e3ll czp0cnVlLG5vOnRydWUsY2FuY2VsOnRydWV9LElORk86ImV4dC1tYi1pbmZvIixX QVJOSU5HOiJleHQtbWItd2FybmluZyIsUVVFU1RJT046ImV4dC1tYi1xdWVzdGlv biIsRVJST1I6ImV4dC1tYi1lcnJvciIsZGVmYXVsdFRleHRIZWlnaHQ6NzUsbWF4 V2lkdGg6NjAwLG1pbldpZHRoOjEwMCxtaW5Qcm9ncmVzc1dpZHRoOjI1MCxtaW5Q cm9tcHRXaWR0aDoyNTAsYnV0dG9uVGV4dDp7b2s6Ik9LIixjYW5jZWw6IkNhbmNl bCIseWVzOiJZZXMiLG5vOiJObyJ9fX0oKTtFeHQuTXNnPUV4dC5NZXNzYWdlQm94 O0V4dC5kZC5QYW5lbFByb3h5PUV4dC5leHRlbmQoT2JqZWN0LHtjb25zdHJ1Y3Rv cjpmdW5jdGlvbihhLGIpe3RoaXMucGFuZWw9YTt0aGlzLmlkPXRoaXMucGFuZWwu aWQrIi1kZHByb3h5IjtFeHQuYXBwbHkodGhpcyxiKX0saW5zZXJ0UHJveHk6dHJ1 ZSxzZXRTdGF0dXM6RXh0LmVtcHR5Rm4scmVzZXQ6RXh0LmVtcHR5Rm4sdXBkYXRl OkV4dC5lbXB0eUZuLHN0b3A6RXh0LmVtcHR5Rm4sc3luYzpFeHQuZW1wdHlGbixn ZXRFbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdob3N0fSxnZXRHaG9zdDpmdW5j dGlvbigpe3JldHVybiB0aGlzLmdob3N0fSxnZXRQcm94eTpmdW5jdGlvbigpe3Jl dHVybiB0aGlzLnByb3h5fSxoaWRlOmZ1bmN0aW9uKCl7aWYodGhpcy5naG9zdCl7 aWYodGhpcy5wcm94eSl7dGhpcy5wcm94eS5yZW1vdmUoKTtkZWxldGUgdGhpcy5w cm94eX10aGlzLnBhbmVsLmVsLmRvbS5zdHlsZS5kaXNwbGF5PSIiO3RoaXMuZ2hv c3QucmVtb3ZlKCk7ZGVsZXRlIHRoaXMuZ2hvc3R9fSxzaG93OmZ1bmN0aW9uKCl7 aWYoIXRoaXMuZ2hvc3Qpe3RoaXMuZ2hvc3Q9dGhpcy5wYW5lbC5jcmVhdGVHaG9z dCh0aGlzLnBhbmVsLmluaXRpYWxDb25maWcuY2xzLHVuZGVmaW5lZCxFeHQuZ2V0 Qm9keSgpKTt0aGlzLmdob3N0LnNldFhZKHRoaXMucGFuZWwuZWwuZ2V0WFkoKSk7 aWYodGhpcy5pbnNlcnRQcm94eSl7dGhpcy5wcm94eT10aGlzLnBhbmVsLmVsLmlu c2VydFNpYmxpbmcoe2NsczoieC1wYW5lbC1kZC1zcGFjZXIifSk7dGhpcy5wcm94 eS5zZXRTaXplKHRoaXMucGFuZWwuZ2V0U2l6ZSgpKX10aGlzLnBhbmVsLmVsLmRv bS5zdHlsZS5kaXNwbGF5PSJub25lIn19LHJlcGFpcjpmdW5jdGlvbihiLGMsYSl7 dGhpcy5oaWRlKCk7aWYodHlwZW9mIGM9PSJmdW5jdGlvbiIpe2MuY2FsbChhfHx0 aGlzKX19LG1vdmVQcm94eTpmdW5jdGlvbihhLGIpe2lmKHRoaXMucHJveHkpe2Eu aW5zZXJ0QmVmb3JlKHRoaXMucHJveHkuZG9tLGIpfX19KTtFeHQuUGFuZWwuREQ9 RXh0LmV4dGVuZChFeHQuZGQuRHJhZ1NvdXJjZSx7Y29uc3RydWN0b3I6ZnVuY3Rp b24oYixhKXt0aGlzLnBhbmVsPWI7dGhpcy5kcmFnRGF0YT17cGFuZWw6Yn07dGhp cy5wcm94eT1uZXcgRXh0LmRkLlBhbmVsUHJveHkoYixhKTtFeHQuUGFuZWwuREQu c3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYi5lbCxhKTt2YXIgZD1i LmhlYWRlcixjPWIuYm9keTtpZihkKXt0aGlzLnNldEhhbmRsZUVsSWQoZC5pZCk7 Yz1iLmhlYWRlcn1jLnNldFN0eWxlKCJjdXJzb3IiLCJtb3ZlIik7dGhpcy5zY3Jv bGw9ZmFsc2V9LHNob3dGcmFtZTpFeHQuZW1wdHlGbixzdGFydERyYWc6RXh0LmVt cHR5Rm4sYjRTdGFydERyYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnByb3h5LnNob3co KX0sYjRNb3VzZURvd246ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRQYWdlWCgpLGM9 Yi5nZXRQYWdlWSgpO3RoaXMuYXV0b09mZnNldChhLGMpfSxvbkluaXREcmFnOmZ1 bmN0aW9uKGEsYil7dGhpcy5vblN0YXJ0RHJhZyhhLGIpO3JldHVybiB0cnVlfSxj cmVhdGVGcmFtZTpFeHQuZW1wdHlGbixnZXREcmFnRWw6ZnVuY3Rpb24oYSl7cmV0 dXJuIHRoaXMucHJveHkuZ2hvc3QuZG9tfSxlbmREcmFnOmZ1bmN0aW9uKGEpe3Ro aXMucHJveHkuaGlkZSgpO3RoaXMucGFuZWwuc2F2ZVN0YXRlKCl9LGF1dG9PZmZz ZXQ6ZnVuY3Rpb24oYSxiKXthLT10aGlzLnN0YXJ0UGFnZVg7Yi09dGhpcy5zdGFy dFBhZ2VZO3RoaXMuc2V0RGVsdGEoYSxiKX19KTtFeHQuc3RhdGUuUHJvdmlkZXI9 RXh0LmV4dGVuZChFeHQudXRpbC5PYnNlcnZhYmxlLHtjb25zdHJ1Y3RvcjpmdW5j dGlvbigpe3RoaXMuYWRkRXZlbnRzKCJzdGF0ZWNoYW5nZSIpO3RoaXMuc3RhdGU9 e307RXh0LnN0YXRlLlByb3ZpZGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2Fs bCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGIsYSl7cmV0dXJuIHR5cGVvZiB0aGlzLnN0 YXRlW2JdPT0idW5kZWZpbmVkIj9hOnRoaXMuc3RhdGVbYl19LGNsZWFyOmZ1bmN0 aW9uKGEpe2RlbGV0ZSB0aGlzLnN0YXRlW2FdO3RoaXMuZmlyZUV2ZW50KCJzdGF0 ZWNoYW5nZSIsdGhpcyxhLG51bGwpfSxzZXQ6ZnVuY3Rpb24oYSxiKXt0aGlzLnN0 YXRlW2FdPWI7dGhpcy5maXJlRXZlbnQoInN0YXRlY2hhbmdlIix0aGlzLGEsYil9 LGRlY29kZVZhbHVlOmZ1bmN0aW9uKGIpe3ZhciBlPS9eKGF8bnxkfGJ8c3xvfGUp XDooLiopJC8saD1lLmV4ZWModW5lc2NhcGUoYikpLGQsYyxhLGc7aWYoIWh8fCFo WzFdKXtyZXR1cm59Yz1oWzFdO2E9aFsyXTtzd2l0Y2goYyl7Y2FzZSJlIjpyZXR1 cm4gbnVsbDtjYXNlIm4iOnJldHVybiBwYXJzZUZsb2F0KGEpO2Nhc2UiZCI6cmV0 dXJuIG5ldyBEYXRlKERhdGUucGFyc2UoYSkpO2Nhc2UiYiI6cmV0dXJuKGE9PSIx Iik7Y2FzZSJhIjpkPVtdO2lmKGEhPSIiKXtFeHQuZWFjaChhLnNwbGl0KCJeIiks ZnVuY3Rpb24oaSl7ZC5wdXNoKHRoaXMuZGVjb2RlVmFsdWUoaSkpfSx0aGlzKX1y ZXR1cm4gZDtjYXNlIm8iOmQ9e307aWYoYSE9IiIpe0V4dC5lYWNoKGEuc3BsaXQo Il4iKSxmdW5jdGlvbihpKXtnPWkuc3BsaXQoIj0iKTtkW2dbMF1dPXRoaXMuZGVj b2RlVmFsdWUoZ1sxXSl9LHRoaXMpfXJldHVybiBkO2RlZmF1bHQ6cmV0dXJuIGF9 fSxlbmNvZGVWYWx1ZTpmdW5jdGlvbihjKXt2YXIgYixnPSIiLGU9MCxhLGQ7aWYo Yz09bnVsbCl7cmV0dXJuImU6MSJ9ZWxzZXtpZih0eXBlb2YgYz09Im51bWJlciIp e2I9Im46IitjfWVsc2V7aWYodHlwZW9mIGM9PSJib29sZWFuIil7Yj0iYjoiKyhj PyIxIjoiMCIpfWVsc2V7aWYoRXh0LmlzRGF0ZShjKSl7Yj0iZDoiK2MudG9HTVRT dHJpbmcoKX1lbHNle2lmKEV4dC5pc0FycmF5KGMpKXtmb3IoYT1jLmxlbmd0aDtl PGE7ZSsrKXtnKz10aGlzLmVuY29kZVZhbHVlKGNbZV0pO2lmKGUhPWEtMSl7Zys9 Il4ifX1iPSJhOiIrZ31lbHNle2lmKHR5cGVvZiBjPT0ib2JqZWN0Iil7Zm9yKGQg aW4gYyl7aWYodHlwZW9mIGNbZF0hPSJmdW5jdGlvbiImJmNbZF0hPT11bmRlZmlu ZWQpe2crPWQrIj0iK3RoaXMuZW5jb2RlVmFsdWUoY1tkXSkrIl4ifX1iPSJvOiIr Zy5zdWJzdHJpbmcoMCxnLmxlbmd0aC0xKX1lbHNle2I9InM6IitjfX19fX19cmV0 dXJuIGVzY2FwZShiKX19KTtFeHQuc3RhdGUuTWFuYWdlcj1mdW5jdGlvbigpe3Zh ciBhPW5ldyBFeHQuc3RhdGUuUHJvdmlkZXIoKTtyZXR1cm57c2V0UHJvdmlkZXI6 ZnVuY3Rpb24oYil7YT1ifSxnZXQ6ZnVuY3Rpb24oYyxiKXtyZXR1cm4gYS5nZXQo YyxiKX0sc2V0OmZ1bmN0aW9uKGIsYyl7YS5zZXQoYixjKX0sY2xlYXI6ZnVuY3Rp b24oYil7YS5jbGVhcihiKX0sZ2V0UHJvdmlkZXI6ZnVuY3Rpb24oKXtyZXR1cm4g YX19fSgpO0V4dC5zdGF0ZS5Db29raWVQcm92aWRlcj1FeHQuZXh0ZW5kKEV4dC5z dGF0ZS5Qcm92aWRlcix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7RXh0LnN0YXRl LkNvb2tpZVByb3ZpZGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlz KTt0aGlzLnBhdGg9Ii8iO3RoaXMuZXhwaXJlcz1uZXcgRGF0ZShuZXcgRGF0ZSgp LmdldFRpbWUoKSsoMTAwMCo2MCo2MCoyNCo3KSk7dGhpcy5kb21haW49bnVsbDt0 aGlzLnNlY3VyZT1mYWxzZTtFeHQuYXBwbHkodGhpcyxhKTt0aGlzLnN0YXRlPXRo aXMucmVhZENvb2tpZXMoKX0sc2V0OmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGI9 PSJ1bmRlZmluZWQifHxiPT09bnVsbCl7dGhpcy5jbGVhcihhKTtyZXR1cm59dGhp cy5zZXRDb29raWUoYSxiKTtFeHQuc3RhdGUuQ29va2llUHJvdmlkZXIuc3VwZXJj bGFzcy5zZXQuY2FsbCh0aGlzLGEsYil9LGNsZWFyOmZ1bmN0aW9uKGEpe3RoaXMu Y2xlYXJDb29raWUoYSk7RXh0LnN0YXRlLkNvb2tpZVByb3ZpZGVyLnN1cGVyY2xh c3MuY2xlYXIuY2FsbCh0aGlzLGEpfSxyZWFkQ29va2llczpmdW5jdGlvbigpe3Zh ciBkPXt9LGg9ZG9jdW1lbnQuY29va2llKyI7IixiPS9ccz8oLio/KT0oLio/KTsv ZyxnLGEsZTt3aGlsZSgoZz1iLmV4ZWMoaCkpIT1udWxsKXthPWdbMV07ZT1nWzJd O2lmKGEmJmEuc3Vic3RyaW5nKDAsMyk9PSJ5cy0iKXtkW2Euc3Vic3RyKDMpXT10 aGlzLmRlY29kZVZhbHVlKGUpfX1yZXR1cm4gZH0sc2V0Q29va2llOmZ1bmN0aW9u KGEsYil7ZG9jdW1lbnQuY29va2llPSJ5cy0iK2ErIj0iK3RoaXMuZW5jb2RlVmFs dWUoYikrKCh0aGlzLmV4cGlyZXM9PW51bGwpPyIiOigiOyBleHBpcmVzPSIrdGhp cy5leHBpcmVzLnRvR01UU3RyaW5nKCkpKSsoKHRoaXMucGF0aD09bnVsbCk/IiI6 KCI7IHBhdGg9Iit0aGlzLnBhdGgpKSsoKHRoaXMuZG9tYWluPT1udWxsKT8iIjoo IjsgZG9tYWluPSIrdGhpcy5kb21haW4pKSsoKHRoaXMuc2VjdXJlPT10cnVlKT8i OyBzZWN1cmUiOiIiKX0sY2xlYXJDb29raWU6ZnVuY3Rpb24oYSl7ZG9jdW1lbnQu Y29va2llPSJ5cy0iK2ErIj1udWxsOyBleHBpcmVzPVRodSwgMDEtSmFuLTcwIDAw OjAwOjAxIEdNVCIrKCh0aGlzLnBhdGg9PW51bGwpPyIiOigiOyBwYXRoPSIrdGhp cy5wYXRoKSkrKCh0aGlzLmRvbWFpbj09bnVsbCk/IiI6KCI7IGRvbWFpbj0iK3Ro aXMuZG9tYWluKSkrKCh0aGlzLnNlY3VyZT09dHJ1ZSk/Ijsgc2VjdXJlIjoiIil9 fSk7RXh0LkRhdGFWaWV3PUV4dC5leHRlbmQoRXh0LkJveENvbXBvbmVudCx7c2Vs ZWN0ZWRDbGFzczoieC12aWV3LXNlbGVjdGVkIixlbXB0eVRleHQ6IiIsZGVmZXJF bXB0eVRleHQ6dHJ1ZSx0cmFja092ZXI6ZmFsc2UsYmxvY2tSZWZyZXNoOmZhbHNl LGxhc3Q6ZmFsc2UsaW5pdENvbXBvbmVudDpmdW5jdGlvbigpe0V4dC5EYXRhVmll dy5zdXBlcmNsYXNzLmluaXRDb21wb25lbnQuY2FsbCh0aGlzKTtpZihFeHQuaXNT dHJpbmcodGhpcy50cGwpfHxFeHQuaXNBcnJheSh0aGlzLnRwbCkpe3RoaXMudHBs PW5ldyBFeHQuWFRlbXBsYXRlKHRoaXMudHBsKX10aGlzLmFkZEV2ZW50cygiYmVm b3JlY2xpY2siLCJjbGljayIsIm1vdXNlZW50ZXIiLCJtb3VzZWxlYXZlIiwiY29u dGFpbmVyY2xpY2siLCJkYmxjbGljayIsImNvbnRleHRtZW51IiwiY29udGFpbmVy Y29udGV4dG1lbnUiLCJzZWxlY3Rpb25jaGFuZ2UiLCJiZWZvcmVzZWxlY3QiKTt0 aGlzLnN0b3JlPUV4dC5TdG9yZU1nci5sb29rdXAodGhpcy5zdG9yZSk7dGhpcy5h bGw9bmV3IEV4dC5Db21wb3NpdGVFbGVtZW50TGl0ZSgpO3RoaXMuc2VsZWN0ZWQ9 bmV3IEV4dC5Db21wb3NpdGVFbGVtZW50TGl0ZSgpfSxhZnRlclJlbmRlcjpmdW5j dGlvbigpe0V4dC5EYXRhVmlldy5zdXBlcmNsYXNzLmFmdGVyUmVuZGVyLmNhbGwo dGhpcyk7dGhpcy5tb24odGhpcy5nZXRUZW1wbGF0ZVRhcmdldCgpLHtjbGljazp0 aGlzLm9uQ2xpY2ssZGJsY2xpY2s6dGhpcy5vbkRibENsaWNrLGNvbnRleHRtZW51 OnRoaXMub25Db250ZXh0TWVudSxzY29wZTp0aGlzfSk7aWYodGhpcy5vdmVyQ2xh c3N8fHRoaXMudHJhY2tPdmVyKXt0aGlzLm1vbih0aGlzLmdldFRlbXBsYXRlVGFy Z2V0KCkse21vdXNlb3Zlcjp0aGlzLm9uTW91c2VPdmVyLG1vdXNlb3V0OnRoaXMu b25Nb3VzZU91dCxzY29wZTp0aGlzfSl9aWYodGhpcy5zdG9yZSl7dGhpcy5iaW5k U3RvcmUodGhpcy5zdG9yZSx0cnVlKX19LHJlZnJlc2g6ZnVuY3Rpb24oKXt0aGlz LmNsZWFyU2VsZWN0aW9ucyhmYWxzZSx0cnVlKTt2YXIgYj10aGlzLmdldFRlbXBs YXRlVGFyZ2V0KCksYT10aGlzLnN0b3JlLmdldFJhbmdlKCk7Yi51cGRhdGUoIiIp O2lmKGEubGVuZ3RoPDEpe2lmKCF0aGlzLmRlZmVyRW1wdHlUZXh0fHx0aGlzLmhh c1NraXBwZWRFbXB0eVRleHQpe2IudXBkYXRlKHRoaXMuZW1wdHlUZXh0KX10aGlz LmFsbC5jbGVhcigpfWVsc2V7dGhpcy50cGwub3ZlcndyaXRlKGIsdGhpcy5jb2xs ZWN0RGF0YShhLDApKTt0aGlzLmFsbC5maWxsKEV4dC5xdWVyeSh0aGlzLml0ZW1T ZWxlY3RvcixiLmRvbSkpO3RoaXMudXBkYXRlSW5kZXhlcygwKX10aGlzLmhhc1Nr aXBwZWRFbXB0eVRleHQ9dHJ1ZX0sZ2V0VGVtcGxhdGVUYXJnZXQ6ZnVuY3Rpb24o KXtyZXR1cm4gdGhpcy5lbH0scHJlcGFyZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJu IGF9LGNvbGxlY3REYXRhOmZ1bmN0aW9uKGIsZSl7dmFyIGQ9W10sYz0wLGE9Yi5s ZW5ndGg7Zm9yKDtjPGE7YysrKXtkW2QubGVuZ3RoXT10aGlzLnByZXBhcmVEYXRh KGJbY10uZGF0YSxlK2MsYltjXSl9cmV0dXJuIGR9LGJ1ZmZlclJlbmRlcjpmdW5j dGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Ro aXMudHBsLm92ZXJ3cml0ZShjLHRoaXMuY29sbGVjdERhdGEoYSxiKSk7cmV0dXJu IEV4dC5xdWVyeSh0aGlzLml0ZW1TZWxlY3RvcixjKX0sb25VcGRhdGU6ZnVuY3Rp b24oZyxhKXt2YXIgYj10aGlzLnN0b3JlLmluZGV4T2YoYSk7aWYoYj4tMSl7dmFy IGU9dGhpcy5pc1NlbGVjdGVkKGIpLGM9dGhpcy5hbGwuZWxlbWVudHNbYl0sZD10 aGlzLmJ1ZmZlclJlbmRlcihbYV0sYilbMF07dGhpcy5hbGwucmVwbGFjZUVsZW1l bnQoYixkLHRydWUpO2lmKGUpe3RoaXMuc2VsZWN0ZWQucmVwbGFjZUVsZW1lbnQo YyxkKTt0aGlzLmFsbC5pdGVtKGIpLmFkZENsYXNzKHRoaXMuc2VsZWN0ZWRDbGFz cyl9dGhpcy51cGRhdGVJbmRleGVzKGIsYil9fSxvbkFkZDpmdW5jdGlvbihnLGQs ZSl7aWYodGhpcy5hbGwuZ2V0Q291bnQoKT09PTApe3RoaXMucmVmcmVzaCgpO3Jl dHVybn12YXIgYz10aGlzLmJ1ZmZlclJlbmRlcihkLGUpLGgsYj10aGlzLmFsbC5l bGVtZW50cztpZihlPHRoaXMuYWxsLmdldENvdW50KCkpe2g9dGhpcy5hbGwuaXRl bShlKS5pbnNlcnRTaWJsaW5nKGMsImJlZm9yZSIsdHJ1ZSk7Yi5zcGxpY2UuYXBw bHkoYixbZSwwXS5jb25jYXQoYykpfWVsc2V7aD10aGlzLmFsbC5sYXN0KCkuaW5z ZXJ0U2libGluZyhjLCJhZnRlciIsdHJ1ZSk7Yi5wdXNoLmFwcGx5KGIsYyl9dGhp cy51cGRhdGVJbmRleGVzKGUpfSxvblJlbW92ZTpmdW5jdGlvbihjLGEsYil7dGhp cy5kZXNlbGVjdChiKTt0aGlzLmFsbC5yZW1vdmVFbGVtZW50KGIsdHJ1ZSk7dGhp cy51cGRhdGVJbmRleGVzKGIpO2lmKHRoaXMuc3RvcmUuZ2V0Q291bnQoKT09PTAp e3RoaXMucmVmcmVzaCgpfX0scmVmcmVzaE5vZGU6ZnVuY3Rpb24oYSl7dGhpcy5v blVwZGF0ZSh0aGlzLnN0b3JlLHRoaXMuc3RvcmUuZ2V0QXQoYSkpfSx1cGRhdGVJ bmRleGVzOmZ1bmN0aW9uKGQsYyl7dmFyIGI9dGhpcy5hbGwuZWxlbWVudHM7ZD1k fHwwO2M9Y3x8KChjPT09MCk/MDooYi5sZW5ndGgtMSkpO2Zvcih2YXIgYT1kO2E8 PWM7YSsrKXtiW2FdLnZpZXdJbmRleD1hfX0sZ2V0U3RvcmU6ZnVuY3Rpb24oKXty ZXR1cm4gdGhpcy5zdG9yZX0sYmluZFN0b3JlOmZ1bmN0aW9uKGEsYil7aWYoIWIm JnRoaXMuc3RvcmUpe2lmKGEhPT10aGlzLnN0b3JlJiZ0aGlzLnN0b3JlLmF1dG9E ZXN0cm95KXt0aGlzLnN0b3JlLmRlc3Ryb3koKX1lbHNle3RoaXMuc3RvcmUudW4o ImJlZm9yZWxvYWQiLHRoaXMub25CZWZvcmVMb2FkLHRoaXMpO3RoaXMuc3RvcmUu dW4oImRhdGFjaGFuZ2VkIix0aGlzLm9uRGF0YUNoYW5nZWQsdGhpcyk7dGhpcy5z dG9yZS51bigiYWRkIix0aGlzLm9uQWRkLHRoaXMpO3RoaXMuc3RvcmUudW4oInJl bW92ZSIsdGhpcy5vblJlbW92ZSx0aGlzKTt0aGlzLnN0b3JlLnVuKCJ1cGRhdGUi LHRoaXMub25VcGRhdGUsdGhpcyk7dGhpcy5zdG9yZS51bigiY2xlYXIiLHRoaXMu cmVmcmVzaCx0aGlzKX1pZighYSl7dGhpcy5zdG9yZT1udWxsfX1pZihhKXthPUV4 dC5TdG9yZU1nci5sb29rdXAoYSk7YS5vbih7c2NvcGU6dGhpcyxiZWZvcmVsb2Fk OnRoaXMub25CZWZvcmVMb2FkLGRhdGFjaGFuZ2VkOnRoaXMub25EYXRhQ2hhbmdl ZCxhZGQ6dGhpcy5vbkFkZCxyZW1vdmU6dGhpcy5vblJlbW92ZSx1cGRhdGU6dGhp cy5vblVwZGF0ZSxjbGVhcjp0aGlzLnJlZnJlc2h9KX10aGlzLnN0b3JlPWE7aWYo YSl7dGhpcy5yZWZyZXNoKCl9fSxvbkRhdGFDaGFuZ2VkOmZ1bmN0aW9uKCl7aWYo dGhpcy5ibG9ja1JlZnJlc2ghPT10cnVlKXt0aGlzLnJlZnJlc2guYXBwbHkodGhp cyxhcmd1bWVudHMpfX0sZmluZEl0ZW1Gcm9tQ2hpbGQ6ZnVuY3Rpb24oYSl7cmV0 dXJuIEV4dC5mbHkoYSkuZmluZFBhcmVudCh0aGlzLml0ZW1TZWxlY3Rvcix0aGlz LmdldFRlbXBsYXRlVGFyZ2V0KCkpfSxvbkNsaWNrOmZ1bmN0aW9uKGMpe3ZhciBi PWMuZ2V0VGFyZ2V0KHRoaXMuaXRlbVNlbGVjdG9yLHRoaXMuZ2V0VGVtcGxhdGVU YXJnZXQoKSksYTtpZihiKXthPXRoaXMuaW5kZXhPZihiKTtpZih0aGlzLm9uSXRl bUNsaWNrKGIsYSxjKSE9PWZhbHNlKXt0aGlzLmZpcmVFdmVudCgiY2xpY2siLHRo aXMsYSxiLGMpfX1lbHNle2lmKHRoaXMuZmlyZUV2ZW50KCJjb250YWluZXJjbGlj ayIsdGhpcyxjKSE9PWZhbHNlKXt0aGlzLm9uQ29udGFpbmVyQ2xpY2soYyl9fX0s b25Db250YWluZXJDbGljazpmdW5jdGlvbihhKXt0aGlzLmNsZWFyU2VsZWN0aW9u cygpfSxvbkNvbnRleHRNZW51OmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0VGFyZ2V0 KHRoaXMuaXRlbVNlbGVjdG9yLHRoaXMuZ2V0VGVtcGxhdGVUYXJnZXQoKSk7aWYo YSl7dGhpcy5maXJlRXZlbnQoImNvbnRleHRtZW51Iix0aGlzLHRoaXMuaW5kZXhP ZihhKSxhLGIpfWVsc2V7dGhpcy5maXJlRXZlbnQoImNvbnRhaW5lcmNvbnRleHRt ZW51Iix0aGlzLGIpfX0sb25EYmxDbGljazpmdW5jdGlvbihiKXt2YXIgYT1iLmdl dFRhcmdldCh0aGlzLml0ZW1TZWxlY3Rvcix0aGlzLmdldFRlbXBsYXRlVGFyZ2V0 KCkpO2lmKGEpe3RoaXMuZmlyZUV2ZW50KCJkYmxjbGljayIsdGhpcyx0aGlzLmlu ZGV4T2YoYSksYSxiKX19LG9uTW91c2VPdmVyOmZ1bmN0aW9uKGIpe3ZhciBhPWIu Z2V0VGFyZ2V0KHRoaXMuaXRlbVNlbGVjdG9yLHRoaXMuZ2V0VGVtcGxhdGVUYXJn ZXQoKSk7aWYoYSYmYSE9PXRoaXMubGFzdEl0ZW0pe3RoaXMubGFzdEl0ZW09YTtF eHQuZmx5KGEpLmFkZENsYXNzKHRoaXMub3ZlckNsYXNzKTt0aGlzLmZpcmVFdmVu dCgibW91c2VlbnRlciIsdGhpcyx0aGlzLmluZGV4T2YoYSksYSxiKX19LG9uTW91 c2VPdXQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5sYXN0SXRlbSl7aWYoIWEud2l0aGlu KHRoaXMubGFzdEl0ZW0sdHJ1ZSx0cnVlKSl7RXh0LmZseSh0aGlzLmxhc3RJdGVt KS5yZW1vdmVDbGFzcyh0aGlzLm92ZXJDbGFzcyk7dGhpcy5maXJlRXZlbnQoIm1v dXNlbGVhdmUiLHRoaXMsdGhpcy5pbmRleE9mKHRoaXMubGFzdEl0ZW0pLHRoaXMu bGFzdEl0ZW0sYSk7ZGVsZXRlIHRoaXMubGFzdEl0ZW19fX0sb25JdGVtQ2xpY2s6 ZnVuY3Rpb24oYixhLGMpe2lmKHRoaXMuZmlyZUV2ZW50KCJiZWZvcmVjbGljayIs dGhpcyxhLGIsYyk9PT1mYWxzZSl7cmV0dXJuIGZhbHNlfWlmKHRoaXMubXVsdGlT ZWxlY3Qpe3RoaXMuZG9NdWx0aVNlbGVjdGlvbihiLGEsYyk7Yy5wcmV2ZW50RGVm YXVsdCgpfWVsc2V7aWYodGhpcy5zaW5nbGVTZWxlY3Qpe3RoaXMuZG9TaW5nbGVT ZWxlY3Rpb24oYixhLGMpO2MucHJldmVudERlZmF1bHQoKX19cmV0dXJuIHRydWV9 LGRvU2luZ2xlU2VsZWN0aW9uOmZ1bmN0aW9uKGIsYSxjKXtpZihjLmN0cmxLZXkm JnRoaXMuaXNTZWxlY3RlZChhKSl7dGhpcy5kZXNlbGVjdChhKX1lbHNle3RoaXMu c2VsZWN0KGEsZmFsc2UpfX0sZG9NdWx0aVNlbGVjdGlvbjpmdW5jdGlvbihjLGEs ZCl7aWYoZC5zaGlmdEtleSYmdGhpcy5sYXN0IT09ZmFsc2Upe3ZhciBiPXRoaXMu bGFzdDt0aGlzLnNlbGVjdFJhbmdlKGIsYSxkLmN0cmxLZXkpO3RoaXMubGFzdD1i fWVsc2V7aWYoKGQuY3RybEtleXx8dGhpcy5zaW1wbGVTZWxlY3QpJiZ0aGlzLmlz U2VsZWN0ZWQoYSkpe3RoaXMuZGVzZWxlY3QoYSl9ZWxzZXt0aGlzLnNlbGVjdChh LGQuY3RybEtleXx8ZC5zaGlmdEtleXx8dGhpcy5zaW1wbGVTZWxlY3QpfX19LGdl dFNlbGVjdGlvbkNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0ZWQu Z2V0Q291bnQoKX0sZ2V0U2VsZWN0ZWROb2RlczpmdW5jdGlvbigpe3JldHVybiB0 aGlzLnNlbGVjdGVkLmVsZW1lbnRzfSxnZXRTZWxlY3RlZEluZGV4ZXM6ZnVuY3Rp b24oKXt2YXIgYj1bXSxkPXRoaXMuc2VsZWN0ZWQuZWxlbWVudHMsYz0wLGE9ZC5s ZW5ndGg7Zm9yKDtjPGE7YysrKXtiLnB1c2goZFtjXS52aWV3SW5kZXgpfXJldHVy biBifSxnZXRTZWxlY3RlZFJlY29yZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5n ZXRSZWNvcmRzKHRoaXMuc2VsZWN0ZWQuZWxlbWVudHMpfSxnZXRSZWNvcmRzOmZ1 bmN0aW9uKGMpe3ZhciBiPVtdLGQ9MCxhPWMubGVuZ3RoO2Zvcig7ZDxhO2QrKyl7 YltiLmxlbmd0aF09dGhpcy5zdG9yZS5nZXRBdChjW2RdLnZpZXdJbmRleCl9cmV0 dXJuIGJ9LGdldFJlY29yZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zdG9yZS5n ZXRBdChhLnZpZXdJbmRleCl9LGNsZWFyU2VsZWN0aW9uczpmdW5jdGlvbihhLGIp e2lmKCh0aGlzLm11bHRpU2VsZWN0fHx0aGlzLnNpbmdsZVNlbGVjdCkmJnRoaXMu c2VsZWN0ZWQuZ2V0Q291bnQoKT4wKXtpZighYil7dGhpcy5zZWxlY3RlZC5yZW1v dmVDbGFzcyh0aGlzLnNlbGVjdGVkQ2xhc3MpfXRoaXMuc2VsZWN0ZWQuY2xlYXIo KTt0aGlzLmxhc3Q9ZmFsc2U7aWYoIWEpe3RoaXMuZmlyZUV2ZW50KCJzZWxlY3Rp b25jaGFuZ2UiLHRoaXMsdGhpcy5zZWxlY3RlZC5lbGVtZW50cyl9fX0saXNTZWxl Y3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZWxlY3RlZC5jb250YWlucyh0 aGlzLmdldE5vZGUoYSkpfSxkZXNlbGVjdDpmdW5jdGlvbihhKXtpZih0aGlzLmlz U2VsZWN0ZWQoYSkpe2E9dGhpcy5nZXROb2RlKGEpO3RoaXMuc2VsZWN0ZWQucmVt b3ZlRWxlbWVudChhKTtpZih0aGlzLmxhc3Q9PWEudmlld0luZGV4KXt0aGlzLmxh c3Q9ZmFsc2V9RXh0LmZseShhKS5yZW1vdmVDbGFzcyh0aGlzLnNlbGVjdGVkQ2xh c3MpO3RoaXMuZmlyZUV2ZW50KCJzZWxlY3Rpb25jaGFuZ2UiLHRoaXMsdGhpcy5z ZWxlY3RlZC5lbGVtZW50cyl9fSxzZWxlY3Q6ZnVuY3Rpb24oZCxnLGIpe2lmKEV4 dC5pc0FycmF5KGQpKXtpZighZyl7dGhpcy5jbGVhclNlbGVjdGlvbnModHJ1ZSl9 Zm9yKHZhciBjPTAsYT1kLmxlbmd0aDtjPGE7YysrKXt0aGlzLnNlbGVjdChkW2Nd LHRydWUsdHJ1ZSl9aWYoIWIpe3RoaXMuZmlyZUV2ZW50KCJzZWxlY3Rpb25jaGFu Z2UiLHRoaXMsdGhpcy5zZWxlY3RlZC5lbGVtZW50cyl9fWVsc2V7dmFyIGU9dGhp cy5nZXROb2RlKGQpO2lmKCFnKXt0aGlzLmNsZWFyU2VsZWN0aW9ucyh0cnVlKX1p ZihlJiYhdGhpcy5pc1NlbGVjdGVkKGUpKXtpZih0aGlzLmZpcmVFdmVudCgiYmVm b3Jlc2VsZWN0Iix0aGlzLGUsdGhpcy5zZWxlY3RlZC5lbGVtZW50cykhPT1mYWxz ZSl7RXh0LmZseShlKS5hZGRDbGFzcyh0aGlzLnNlbGVjdGVkQ2xhc3MpO3RoaXMu c2VsZWN0ZWQuYWRkKGUpO3RoaXMubGFzdD1lLnZpZXdJbmRleDtpZighYil7dGhp cy5maXJlRXZlbnQoInNlbGVjdGlvbmNoYW5nZSIsdGhpcyx0aGlzLnNlbGVjdGVk LmVsZW1lbnRzKX19fX19LHNlbGVjdFJhbmdlOmZ1bmN0aW9uKGMsYSxiKXtpZigh Yil7dGhpcy5jbGVhclNlbGVjdGlvbnModHJ1ZSl9dGhpcy5zZWxlY3QodGhpcy5n ZXROb2RlcyhjLGEpLHRydWUpfSxnZXROb2RlOmZ1bmN0aW9uKGIpe2lmKEV4dC5p c1N0cmluZyhiKSl7cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpfWVs c2V7aWYoRXh0LmlzTnVtYmVyKGIpKXtyZXR1cm4gdGhpcy5hbGwuZWxlbWVudHNb Yl19ZWxzZXtpZihiIGluc3RhbmNlb2YgRXh0LmRhdGEuUmVjb3JkKXt2YXIgYT10 aGlzLnN0b3JlLmluZGV4T2YoYik7cmV0dXJuIHRoaXMuYWxsLmVsZW1lbnRzW2Fd fX19cmV0dXJuIGJ9LGdldE5vZGVzOmZ1bmN0aW9uKGUsYSl7dmFyIGQ9dGhpcy5h bGwuZWxlbWVudHMsYj1bXSxjO2U9ZXx8MDthPSFFeHQuaXNEZWZpbmVkKGEpP01h dGgubWF4KGQubGVuZ3RoLTEsMCk6YTtpZihlPD1hKXtmb3IoYz1lO2M8PWEmJmRb Y107YysrKXtiLnB1c2goZFtjXSl9fWVsc2V7Zm9yKGM9ZTtjPj1hJiZkW2NdO2Mt LSl7Yi5wdXNoKGRbY10pfX1yZXR1cm4gYn0saW5kZXhPZjpmdW5jdGlvbihhKXth PXRoaXMuZ2V0Tm9kZShhKTtpZihFeHQuaXNOdW1iZXIoYS52aWV3SW5kZXgpKXty ZXR1cm4gYS52aWV3SW5kZXh9cmV0dXJuIHRoaXMuYWxsLmluZGV4T2YoYSl9LG9u QmVmb3JlTG9hZDpmdW5jdGlvbigpe2lmKHRoaXMubG9hZGluZ1RleHQpe3RoaXMu Y2xlYXJTZWxlY3Rpb25zKGZhbHNlLHRydWUpO3RoaXMuZ2V0VGVtcGxhdGVUYXJn ZXQoKS51cGRhdGUoJzxkaXYgY2xhc3M9ImxvYWRpbmctaW5kaWNhdG9yIj4nK3Ro aXMubG9hZGluZ1RleHQrIjwvZGl2PiIpO3RoaXMuYWxsLmNsZWFyKCl9fSxvbkRl c3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmFsbC5jbGVhcigpO3RoaXMuc2VsZWN0ZWQu Y2xlYXIoKTtFeHQuRGF0YVZpZXcuc3VwZXJjbGFzcy5vbkRlc3Ryb3kuY2FsbCh0 aGlzKTt0aGlzLmJpbmRTdG9yZShudWxsKX19KTtFeHQuRGF0YVZpZXcucHJvdG90 eXBlLnNldFN0b3JlPUV4dC5EYXRhVmlldy5wcm90b3R5cGUuYmluZFN0b3JlO0V4 dC5yZWcoImRhdGF2aWV3IixFeHQuRGF0YVZpZXcpO0V4dC5saXN0Lkxpc3RWaWV3 PUV4dC5leHRlbmQoRXh0LkRhdGFWaWV3LHtpdGVtU2VsZWN0b3I6ImRsIixzZWxl Y3RlZENsYXNzOiJ4LWxpc3Qtc2VsZWN0ZWQiLG92ZXJDbGFzczoieC1saXN0LW92 ZXIiLHNjcm9sbE9mZnNldDp1bmRlZmluZWQsY29sdW1uUmVzaXplOnRydWUsY29s dW1uU29ydDp0cnVlLG1heENvbHVtbldpZHRoOkV4dC5pc0lFPzk5OjEwMCxpbml0 Q29tcG9uZW50OmZ1bmN0aW9uKCl7aWYodGhpcy5jb2x1bW5SZXNpemUpe3RoaXMu Y29sUmVzaXplcj1uZXcgRXh0Lmxpc3QuQ29sdW1uUmVzaXplcih0aGlzLmNvbFJl c2l6ZXIpO3RoaXMuY29sUmVzaXplci5pbml0KHRoaXMpfWlmKHRoaXMuY29sdW1u U29ydCl7dGhpcy5jb2xTb3J0ZXI9bmV3IEV4dC5saXN0LlNvcnRlcih0aGlzLmNv bHVtblNvcnQpO3RoaXMuY29sU29ydGVyLmluaXQodGhpcyl9aWYoIXRoaXMuaW50 ZXJuYWxUcGwpe3RoaXMuaW50ZXJuYWxUcGw9bmV3IEV4dC5YVGVtcGxhdGUoJzxk aXYgY2xhc3M9IngtbGlzdC1oZWFkZXIiPjxkaXYgY2xhc3M9IngtbGlzdC1oZWFk ZXItaW5uZXIiPicsJzx0cGwgZm9yPSJjb2x1bW5zIj4nLCc8ZGl2IHN0eWxlPSJ3 aWR0aDp7W3ZhbHVlcy53aWR0aCoxMDBdfSU7dGV4dC1hbGlnbjp7YWxpZ259OyI+ PGVtIHVuc2VsZWN0YWJsZT0ib24iIGlkPSInLHRoaXMuaWQsJy14bGhkLXsjfSI+ Jywie2hlYWRlcn0iLCI8L2VtPjwvZGl2PiIsIjwvdHBsPiIsJzxkaXYgY2xhc3M9 IngtY2xlYXIiPjwvZGl2PicsIjwvZGl2PjwvZGl2PiIsJzxkaXYgY2xhc3M9Ingt bGlzdC1ib2R5Ij48ZGl2IGNsYXNzPSJ4LWxpc3QtYm9keS1pbm5lciI+JywiPC9k aXY+PC9kaXY+Iil9aWYoIXRoaXMudHBsKXt0aGlzLnRwbD1uZXcgRXh0LlhUZW1w bGF0ZSgnPHRwbCBmb3I9InJvd3MiPicsIjxkbD4iLCc8dHBsIGZvcj0icGFyZW50 LmNvbHVtbnMiPicsJzxkdCBzdHlsZT0id2lkdGg6e1t2YWx1ZXMud2lkdGgqMTAw XX0lO3RleHQtYWxpZ246e2FsaWdufTsiPicsJzxlbSB1bnNlbGVjdGFibGU9Im9u Ijx0cGwgaWY9ImNscyI+IGNsYXNzPSJ7Y2xzfTwvdHBsPiI+Jywie1t2YWx1ZXMu dHBsLmFwcGx5KHBhcmVudCldfSIsIjwvZW0+PC9kdD4iLCI8L3RwbD4iLCc8ZGl2 IGNsYXNzPSJ4LWNsZWFyIj48L2Rpdj4nLCI8L2RsPiIsIjwvdHBsPiIpfXZhciBs PXRoaXMuY29sdW1ucyxoPTAsaz0wLG09bC5sZW5ndGgsYj1bXTtmb3IodmFyIGc9 MDtnPG07ZysrKXt2YXIgbj1sW2ddO2lmKCFuLmlzQ29sdW1uKXtuLnh0eXBlPW4u eHR5cGU/KC9ebHYvLnRlc3Qobi54dHlwZSk/bi54dHlwZToibHYiK24ueHR5cGUp OiJsdmNvbHVtbiI7bj1FeHQuY3JlYXRlKG4pfWlmKG4ud2lkdGgpe2grPW4ud2lk dGgqMTAwO2lmKGg+dGhpcy5tYXhDb2x1bW5XaWR0aCl7bi53aWR0aC09KGgtdGhp cy5tYXhDb2x1bW5XaWR0aCkvMTAwfWsrK31iLnB1c2gobil9bD10aGlzLmNvbHVt bnM9YjtpZihrPG0pe3ZhciBkPW0taztpZihoPHRoaXMubWF4Q29sdW1uV2lkdGgp e3ZhciBhPSgodGhpcy5tYXhDb2x1bW5XaWR0aC1oKS9kKS8xMDA7Zm9yKHZhciBl PTA7ZTxtO2UrKyl7dmFyIG49bFtlXTtpZighbi53aWR0aCl7bi53aWR0aD1hfX19 fUV4dC5saXN0Lkxpc3RWaWV3LnN1cGVyY2xhc3MuaW5pdENvbXBvbmVudC5jYWxs KHRoaXMpfSxvblJlbmRlcjpmdW5jdGlvbigpe3RoaXMuYXV0b0VsPXtjbHM6Ingt bGlzdC13cmFwIn07RXh0Lmxpc3QuTGlzdFZpZXcuc3VwZXJjbGFzcy5vblJlbmRl ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbnRlcm5hbFRwbC5vdmVyd3Jp dGUodGhpcy5lbCx7Y29sdW1uczp0aGlzLmNvbHVtbnN9KTt0aGlzLmlubmVyQm9k eT1FeHQuZ2V0KHRoaXMuZWwuZG9tLmNoaWxkTm9kZXNbMV0uZmlyc3RDaGlsZCk7 dGhpcy5pbm5lckhkPUV4dC5nZXQodGhpcy5lbC5kb20uZmlyc3RDaGlsZC5maXJz dENoaWxkKTtpZih0aGlzLmhpZGVIZWFkZXJzKXt0aGlzLmVsLmRvbS5maXJzdENo aWxkLnN0eWxlLmRpc3BsYXk9Im5vbmUifX0sZ2V0VGVtcGxhdGVUYXJnZXQ6ZnVu Y3Rpb24oKXtyZXR1cm4gdGhpcy5pbm5lckJvZHl9LGNvbGxlY3REYXRhOmZ1bmN0 aW9uKCl7dmFyIGE9RXh0Lmxpc3QuTGlzdFZpZXcuc3VwZXJjbGFzcy5jb2xsZWN0 RGF0YS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJue2NvbHVtbnM6dGhpcy5j b2x1bW5zLHJvd3M6YX19LHZlcmlmeUludGVybmFsU2l6ZTpmdW5jdGlvbigpe2lm KHRoaXMubGFzdFNpemUpe3RoaXMub25SZXNpemUodGhpcy5sYXN0U2l6ZS53aWR0 aCx0aGlzLmxhc3RTaXplLmhlaWdodCl9fSxvblJlc2l6ZTpmdW5jdGlvbihjLGUp e3ZhciBiPXRoaXMuaW5uZXJCb2R5LmRvbSxnPXRoaXMuaW5uZXJIZC5kb20sZD1j LUV4dC5udW0odGhpcy5zY3JvbGxPZmZzZXQsRXh0LmdldFNjcm9sbEJhcldpZHRo KCkpKyJweCIsYTtpZighYil7cmV0dXJufWE9Yi5wYXJlbnROb2RlO2lmKEV4dC5p c051bWJlcihjKSl7aWYodGhpcy5yZXNlcnZlU2Nyb2xsT2Zmc2V0fHwoKGEub2Zm c2V0V2lkdGgtYS5jbGllbnRXaWR0aCk+MTApKXtiLnN0eWxlLndpZHRoPWQ7Zy5z dHlsZS53aWR0aD1kfWVsc2V7Yi5zdHlsZS53aWR0aD1jKyJweCI7Zy5zdHlsZS53 aWR0aD1jKyJweCI7c2V0VGltZW91dChmdW5jdGlvbigpe2lmKChhLm9mZnNldFdp ZHRoLWEuY2xpZW50V2lkdGgpPjEwKXtiLnN0eWxlLndpZHRoPWQ7Zy5zdHlsZS53 aWR0aD1kfX0sMTApfX1pZihFeHQuaXNOdW1iZXIoZSkpe2Euc3R5bGUuaGVpZ2h0 PU1hdGgubWF4KDAsZS1nLnBhcmVudE5vZGUub2Zmc2V0SGVpZ2h0KSsicHgifX0s dXBkYXRlSW5kZXhlczpmdW5jdGlvbigpe0V4dC5saXN0Lkxpc3RWaWV3LnN1cGVy Y2xhc3MudXBkYXRlSW5kZXhlcy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy52 ZXJpZnlJbnRlcm5hbFNpemUoKX0sZmluZEhlYWRlckluZGV4OmZ1bmN0aW9uKGcp e2c9Zy5kb218fGc7dmFyIGE9Zy5wYXJlbnROb2RlLGQ9YS5wYXJlbnROb2RlLmNo aWxkTm9kZXMsYj0wLGU7Zm9yKDtlPWRbYl07YisrKXtpZihlPT1hKXtyZXR1cm4g Yn19cmV0dXJuIC0xfSxzZXRIZFdpZHRoczpmdW5jdGlvbigpe3ZhciBkPXRoaXMu aW5uZXJIZC5kb20uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpLGM9MCxiPXRo aXMuY29sdW1ucyxhPWIubGVuZ3RoO2Zvcig7YzxhO2MrKyl7ZFtjXS5zdHlsZS53 aWR0aD0oYltjXS53aWR0aCoxMDApKyIlIn19fSk7RXh0LnJlZygibGlzdHZpZXci LEV4dC5saXN0Lkxpc3RWaWV3KTtFeHQuTGlzdFZpZXc9RXh0Lmxpc3QuTGlzdFZp ZXc7RXh0Lmxpc3QuQ29sdW1uPUV4dC5leHRlbmQoT2JqZWN0LHtpc0NvbHVtbjp0 cnVlLGFsaWduOiJsZWZ0IixoZWFkZXI6IiIsd2lkdGg6bnVsbCxjbHM6IiIsY29u c3RydWN0b3I6ZnVuY3Rpb24oYSl7aWYoIWEudHBsKXthLnRwbD1uZXcgRXh0LlhU ZW1wbGF0ZSgieyIrYS5kYXRhSW5kZXgrIn0iKX1lbHNle2lmKEV4dC5pc1N0cmlu ZyhhLnRwbCkpe2EudHBsPW5ldyBFeHQuWFRlbXBsYXRlKGEudHBsKX19RXh0LmFw cGx5KHRoaXMsYSl9fSk7RXh0LnJlZygibHZjb2x1bW4iLEV4dC5saXN0LkNvbHVt bik7RXh0Lmxpc3QuTnVtYmVyQ29sdW1uPUV4dC5leHRlbmQoRXh0Lmxpc3QuQ29s dW1uLHtmb3JtYXQ6IjAsMDAwLjAwIixjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXth LnRwbD1hLnRwbHx8bmV3IEV4dC5YVGVtcGxhdGUoInsiK2EuZGF0YUluZGV4Kyc6 bnVtYmVyKCInKyhhLmZvcm1hdHx8dGhpcy5mb3JtYXQpKyciKX0nKTtFeHQubGlz dC5OdW1iZXJDb2x1bW4uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMs YSl9fSk7RXh0LnJlZygibHZudW1iZXJjb2x1bW4iLEV4dC5saXN0Lk51bWJlckNv bHVtbik7RXh0Lmxpc3QuRGF0ZUNvbHVtbj1FeHQuZXh0ZW5kKEV4dC5saXN0LkNv bHVtbix7Zm9ybWF0OiJtL2QvWSIsY29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7YS50 cGw9YS50cGx8fG5ldyBFeHQuWFRlbXBsYXRlKCJ7IithLmRhdGFJbmRleCsnOmRh dGUoIicrKGEuZm9ybWF0fHx0aGlzLmZvcm1hdCkrJyIpfScpO0V4dC5saXN0LkRh dGVDb2x1bW4uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSl9fSk7 RXh0LnJlZygibHZkYXRlY29sdW1uIixFeHQubGlzdC5EYXRlQ29sdW1uKTtFeHQu bGlzdC5Cb29sZWFuQ29sdW1uPUV4dC5leHRlbmQoRXh0Lmxpc3QuQ29sdW1uLHt0 cnVlVGV4dDoidHJ1ZSIsZmFsc2VUZXh0OiJmYWxzZSIsdW5kZWZpbmVkVGV4dDoi JiMxNjA7Iixjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtlLnRwbD1lLnRwbHx8bmV3 IEV4dC5YVGVtcGxhdGUoInsiK2UuZGF0YUluZGV4KyI6dGhpcy5mb3JtYXR9Iik7 dmFyIGI9dGhpcy50cnVlVGV4dCxkPXRoaXMuZmFsc2VUZXh0LGE9dGhpcy51bmRl ZmluZWRUZXh0O2UudHBsLmZvcm1hdD1mdW5jdGlvbihjKXtpZihjPT09dW5kZWZp bmVkKXtyZXR1cm4gYX1pZighY3x8Yz09PSJmYWxzZSIpe3JldHVybiBkfXJldHVy biBifTtFeHQubGlzdC5EYXRlQ29sdW1uLnN1cGVyY2xhc3MuY29uc3RydWN0b3Iu Y2FsbCh0aGlzLGUpfX0pO0V4dC5yZWcoImx2Ym9vbGVhbmNvbHVtbiIsRXh0Lmxp c3QuQm9vbGVhbkNvbHVtbik7RXh0Lmxpc3QuQ29sdW1uUmVzaXplcj1FeHQuZXh0 ZW5kKEV4dC51dGlsLk9ic2VydmFibGUse21pblBjdDowLjA1LGNvbnN0cnVjdG9y OmZ1bmN0aW9uKGEpe0V4dC5hcHBseSh0aGlzLGEpO0V4dC5saXN0LkNvbHVtblJl c2l6ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpfSxpbml0OmZ1 bmN0aW9uKGEpe3RoaXMudmlldz1hO2Eub24oInJlbmRlciIsdGhpcy5pbml0RXZl bnRzLHRoaXMpfSxpbml0RXZlbnRzOmZ1bmN0aW9uKGEpe2EubW9uKGEuaW5uZXJI ZCwibW91c2Vtb3ZlIix0aGlzLmhhbmRsZUhkTW92ZSx0aGlzKTt0aGlzLnRyYWNr ZXI9bmV3IEV4dC5kZC5EcmFnVHJhY2tlcih7b25CZWZvcmVTdGFydDp0aGlzLm9u QmVmb3JlU3RhcnQuY3JlYXRlRGVsZWdhdGUodGhpcyksb25TdGFydDp0aGlzLm9u U3RhcnQuY3JlYXRlRGVsZWdhdGUodGhpcyksb25EcmFnOnRoaXMub25EcmFnLmNy ZWF0ZURlbGVnYXRlKHRoaXMpLG9uRW5kOnRoaXMub25FbmQuY3JlYXRlRGVsZWdh dGUodGhpcyksdG9sZXJhbmNlOjMsYXV0b1N0YXJ0OjMwMH0pO3RoaXMudHJhY2tl ci5pbml0RWwoYS5pbm5lckhkKTthLm9uKCJiZWZvcmVkZXN0cm95Iix0aGlzLnRy YWNrZXIuZGVzdHJveSx0aGlzLnRyYWNrZXIpfSxoYW5kbGVIZE1vdmU6ZnVuY3Rp b24oaSxkKXt2YXIgYz01LGI9aS5nZXRQYWdlWCgpLGo9aS5nZXRUYXJnZXQoImVt IiwzLHRydWUpO2lmKGope3ZhciBoPWouZ2V0UmVnaW9uKCksZz1qLmRvbS5zdHls ZSxhPWouZG9tLnBhcmVudE5vZGU7aWYoYi1oLmxlZnQ8PWMmJmEhPWEucGFyZW50 Tm9kZS5maXJzdENoaWxkKXt0aGlzLmFjdGl2ZUhkPUV4dC5nZXQoYS5wcmV2aW91 c1NpYmxpbmcuZmlyc3RDaGlsZCk7Zy5jdXJzb3I9RXh0LmlzV2ViS2l0PyJlLXJl c2l6ZSI6ImNvbC1yZXNpemUifWVsc2V7aWYoaC5yaWdodC1iPD1jJiZhIT1hLnBh cmVudE5vZGUubGFzdENoaWxkLnByZXZpb3VzU2libGluZyl7dGhpcy5hY3RpdmVI ZD1qO2cuY3Vyc29yPUV4dC5pc1dlYktpdD8idy1yZXNpemUiOiJjb2wtcmVzaXpl In1lbHNle2RlbGV0ZSB0aGlzLmFjdGl2ZUhkO2cuY3Vyc29yPSIifX19fSxvbkJl Zm9yZVN0YXJ0OmZ1bmN0aW9uKGEpe3RoaXMuZHJhZ0hkPXRoaXMuYWN0aXZlSGQ7 cmV0dXJuICEhdGhpcy5kcmFnSGR9LG9uU3RhcnQ6ZnVuY3Rpb24oZyl7dmFyIGQ9 dGhpcyxiPWQudmlldyxjPWQuZHJhZ0hkLGE9ZC50cmFja2VyLmdldFhZKClbMF07 ZC5wcm94eT1iLmVsLmNyZWF0ZUNoaWxkKHtjbHM6IngtbGlzdC1yZXNpemVyIn0p O2QuZHJhZ1g9Yy5nZXRYKCk7ZC5oZWFkZXJJbmRleD1iLmZpbmRIZWFkZXJJbmRl eChjKTtkLmhlYWRlcnNEaXNhYmxlZD1iLmRpc2FibGVIZWFkZXJzO2IuZGlzYWJs ZUhlYWRlcnM9dHJ1ZTtkLnByb3h5LnNldEhlaWdodChiLmVsLmdldEhlaWdodCgp KTtkLnByb3h5LnNldFgoZC5kcmFnWCk7ZC5wcm94eS5zZXRXaWR0aChhLWQuZHJh Z1gpO3RoaXMuc2V0Qm91bmRhcmllcygpfSxzZXRCb3VuZGFyaWVzOmZ1bmN0aW9u KGope3ZhciBrPXRoaXMudmlldyxoPXRoaXMuaGVhZGVySW5kZXgsYz1rLmlubmVy SGQuZ2V0V2lkdGgoKSxqPWsuaW5uZXJIZC5nZXRYKCksYj1NYXRoLmNlaWwoYyp0 aGlzLm1pblBjdCksbD1jLWIsZT1rLmNvbHVtbnMubGVuZ3RoLGQ9ay5pbm5lckhk LnNlbGVjdCgiZW0iLHRydWUpLGc9YitqLGE9bCtqLGk7aWYoZT09Mil7dGhpcy5t aW5YPWc7dGhpcy5tYXhYPWF9ZWxzZXtpPWQuaXRlbShoKzIpO3RoaXMubWluWD1k Lml0ZW0oaCkuZ2V0WCgpK2I7dGhpcy5tYXhYPWk/aS5nZXRYKCktYjphO2lmKGg9 PTApe3RoaXMubWluWD1nfWVsc2V7aWYoaD09ZS0yKXt0aGlzLm1heFg9YX19fX0s b25EcmFnOmZ1bmN0aW9uKGMpe3ZhciBiPXRoaXMsYT1iLnRyYWNrZXIuZ2V0WFko KVswXS5jb25zdHJhaW4oYi5taW5YLGIubWF4WCk7Yi5wcm94eS5zZXRXaWR0aChh LXRoaXMuZHJhZ1gpfSxvbkVuZDpmdW5jdGlvbihpKXt2YXIgZz10aGlzLnByb3h5 LmdldFdpZHRoKCksaD10aGlzLmhlYWRlckluZGV4LGw9dGhpcy52aWV3LGM9bC5j b2x1bW5zLGI9bC5pbm5lckhkLmdldFdpZHRoKCksaz1NYXRoLmNlaWwoZypsLm1h eENvbHVtbldpZHRoL2IpLzEwMCxkPXRoaXMuaGVhZGVyc0Rpc2FibGVkLG09Y1to XSxqPWNbaCsxXSxhPW0ud2lkdGgrai53aWR0aDt0aGlzLnByb3h5LnJlbW92ZSgp O20ud2lkdGg9aztqLndpZHRoPWEtaztkZWxldGUgdGhpcy5kcmFnSGQ7bC5zZXRI ZFdpZHRocygpO2wucmVmcmVzaCgpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtsLmRp c2FibGVIZWFkZXJzPWR9LDEwMCl9fSk7RXh0Lkxpc3RWaWV3LkNvbHVtblJlc2l6 ZXI9RXh0Lmxpc3QuQ29sdW1uUmVzaXplcjtFeHQubGlzdC5Tb3J0ZXI9RXh0LmV4 dGVuZChFeHQudXRpbC5PYnNlcnZhYmxlLHtzb3J0Q2xhc3NlczpbInNvcnQtYXNj Iiwic29ydC1kZXNjIl0sY29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7RXh0LmFwcGx5 KHRoaXMsYSk7RXh0Lmxpc3QuU29ydGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3Iu Y2FsbCh0aGlzKX0saW5pdDpmdW5jdGlvbihhKXt0aGlzLnZpZXc9YTthLm9uKCJy ZW5kZXIiLHRoaXMuaW5pdEV2ZW50cyx0aGlzKX0saW5pdEV2ZW50czpmdW5jdGlv bihhKXthLm1vbihhLmlubmVySGQsImNsaWNrIix0aGlzLm9uSGRDbGljayx0aGlz KTthLmlubmVySGQuc2V0U3R5bGUoImN1cnNvciIsInBvaW50ZXIiKTthLm1vbihh LnN0b3JlLCJkYXRhY2hhbmdlZCIsdGhpcy51cGRhdGVTb3J0U3RhdGUsdGhpcyk7 dGhpcy51cGRhdGVTb3J0U3RhdGUuZGVmZXIoMTAsdGhpcyxbYS5zdG9yZV0pfSx1 cGRhdGVTb3J0U3RhdGU6ZnVuY3Rpb24oYyl7dmFyIGc9Yy5nZXRTb3J0U3RhdGUo KTtpZighZyl7cmV0dXJufXRoaXMuc29ydFN0YXRlPWc7dmFyIGU9dGhpcy52aWV3 LmNvbHVtbnMsaD0tMTtmb3IodmFyIGQ9MCxhPWUubGVuZ3RoO2Q8YTtkKyspe2lm KGVbZF0uZGF0YUluZGV4PT1nLmZpZWxkKXtoPWQ7YnJlYWt9fWlmKGghPS0xKXt2 YXIgYj1nLmRpcmVjdGlvbjt0aGlzLnVwZGF0ZVNvcnRJY29uKGgsYil9fSx1cGRh dGVTb3J0SWNvbjpmdW5jdGlvbihiLGEpe3ZhciBkPXRoaXMuc29ydENsYXNzZXM7 dmFyIGM9dGhpcy52aWV3LmlubmVySGQuc2VsZWN0KCJlbSIpLnJlbW92ZUNsYXNz KGQpO2MuaXRlbShiKS5hZGRDbGFzcyhkW2E9PSJERVNDIj8xOjBdKX0sb25IZENs aWNrOmZ1bmN0aW9uKGMpe3ZhciBiPWMuZ2V0VGFyZ2V0KCJlbSIsMyk7aWYoYiYm IXRoaXMudmlldy5kaXNhYmxlSGVhZGVycyl7dmFyIGE9dGhpcy52aWV3LmZpbmRI ZWFkZXJJbmRleChiKTt0aGlzLnZpZXcuc3RvcmUuc29ydCh0aGlzLnZpZXcuY29s dW1uc1thXS5kYXRhSW5kZXgpfX19KTtFeHQuTGlzdFZpZXcuU29ydGVyPUV4dC5s aXN0LlNvcnRlcjtFeHQuVGFiUGFuZWw9RXh0LmV4dGVuZChFeHQuUGFuZWwse2Rl ZmVycmVkUmVuZGVyOnRydWUsdGFiV2lkdGg6MTIwLG1pblRhYldpZHRoOjMwLHJl c2l6ZVRhYnM6ZmFsc2UsZW5hYmxlVGFiU2Nyb2xsOmZhbHNlLHNjcm9sbEluY3Jl bWVudDowLHNjcm9sbFJlcGVhdEludGVydmFsOjQwMCxzY3JvbGxEdXJhdGlvbjow LjM1LGFuaW1TY3JvbGw6dHJ1ZSx0YWJQb3NpdGlvbjoidG9wIixiYXNlQ2xzOiJ4 LXRhYi1wYW5lbCIsYXV0b1RhYnM6ZmFsc2UsYXV0b1RhYlNlbGVjdG9yOiJkaXYu eC10YWIiLGFjdGl2ZVRhYjp1bmRlZmluZWQsdGFiTWFyZ2luOjIscGxhaW46ZmFs c2Usd2hlZWxJbmNyZW1lbnQ6MjAsaWREZWxpbWl0ZXI6Il9fIixpdGVtQ2xzOiJ4 LXRhYi1pdGVtIixlbGVtZW50czoiYm9keSIsaGVhZGVyQXNUZXh0OmZhbHNlLGZy YW1lOmZhbHNlLGhpZGVCb3JkZXJzOnRydWUsaW5pdENvbXBvbmVudDpmdW5jdGlv bigpe3RoaXMuZnJhbWU9ZmFsc2U7RXh0LlRhYlBhbmVsLnN1cGVyY2xhc3MuaW5p dENvbXBvbmVudC5jYWxsKHRoaXMpO3RoaXMuYWRkRXZlbnRzKCJiZWZvcmV0YWJj aGFuZ2UiLCJ0YWJjaGFuZ2UiLCJjb250ZXh0bWVudSIpO3RoaXMuc2V0TGF5b3V0 KG5ldyBFeHQubGF5b3V0LkNhcmRMYXlvdXQoRXh0LmFwcGx5KHtsYXlvdXRPbkNh cmRDaGFuZ2U6dGhpcy5sYXlvdXRPblRhYkNoYW5nZSxkZWZlcnJlZFJlbmRlcjp0 aGlzLmRlZmVycmVkUmVuZGVyfSx0aGlzLmxheW91dENvbmZpZykpKTtpZih0aGlz LnRhYlBvc2l0aW9uPT0idG9wIil7dGhpcy5lbGVtZW50cys9IixoZWFkZXIiO3Ro aXMuc3RyaXBUYXJnZXQ9ImhlYWRlciJ9ZWxzZXt0aGlzLmVsZW1lbnRzKz0iLGZv b3RlciI7dGhpcy5zdHJpcFRhcmdldD0iZm9vdGVyIn1pZighdGhpcy5zdGFjayl7 dGhpcy5zdGFjaz1FeHQuVGFiUGFuZWwuQWNjZXNzU3RhY2soKX10aGlzLmluaXRJ dGVtcygpfSxvblJlbmRlcjpmdW5jdGlvbihjLGEpe0V4dC5UYWJQYW5lbC5zdXBl cmNsYXNzLm9uUmVuZGVyLmNhbGwodGhpcyxjLGEpO2lmKHRoaXMucGxhaW4pe3Zh ciBnPXRoaXMudGFiUG9zaXRpb249PSJ0b3AiPyJoZWFkZXIiOiJmb290ZXIiO3Ro aXNbZ10uYWRkQ2xhc3MoIngtdGFiLXBhbmVsLSIrZysiLXBsYWluIil9dmFyIGI9 dGhpc1t0aGlzLnN0cmlwVGFyZ2V0XTt0aGlzLnN0cmlwV3JhcD1iLmNyZWF0ZUNo aWxkKHtjbHM6IngtdGFiLXN0cmlwLXdyYXAiLGNuOnt0YWc6InVsIixjbHM6Ingt dGFiLXN0cmlwIHgtdGFiLXN0cmlwLSIrdGhpcy50YWJQb3NpdGlvbn19KTt2YXIg ZT0odGhpcy50YWJQb3NpdGlvbj09ImJvdHRvbSI/dGhpcy5zdHJpcFdyYXA6bnVs bCk7Yi5jcmVhdGVDaGlsZCh7Y2xzOiJ4LXRhYi1zdHJpcC1zcGFjZXIifSxlKTt0 aGlzLnN0cmlwPW5ldyBFeHQuRWxlbWVudCh0aGlzLnN0cmlwV3JhcC5kb20uZmly c3RDaGlsZCk7dGhpcy5lZGdlPXRoaXMuc3RyaXAuY3JlYXRlQ2hpbGQoe3RhZzoi bGkiLGNsczoieC10YWItZWRnZSIsY246W3t0YWc6InNwYW4iLGNsczoieC10YWIt c3RyaXAtdGV4dCIsY246IiYjMTYwOyJ9XX0pO3RoaXMuc3RyaXAuY3JlYXRlQ2hp bGQoe2NsczoieC1jbGVhciJ9KTt0aGlzLmJvZHkuYWRkQ2xhc3MoIngtdGFiLXBh bmVsLWJvZHktIit0aGlzLnRhYlBvc2l0aW9uKTtpZighdGhpcy5pdGVtVHBsKXt2 YXIgZD1uZXcgRXh0LlRlbXBsYXRlKCc8bGkgY2xhc3M9IntjbHN9IiBpZD0ie2lk fSI+PGEgY2xhc3M9IngtdGFiLXN0cmlwLWNsb3NlIj48L2E+JywnPGEgY2xhc3M9 IngtdGFiLXJpZ2h0IiBocmVmPSIjIj48ZW0gY2xhc3M9IngtdGFiLWxlZnQiPics JzxzcGFuIGNsYXNzPSJ4LXRhYi1zdHJpcC1pbm5lciI+PHNwYW4gY2xhc3M9Ingt dGFiLXN0cmlwLXRleHQge2ljb25DbHN9Ij57dGV4dH08L3NwYW4+PC9zcGFuPics IjwvZW0+PC9hPjwvbGk+Iik7ZC5kaXNhYmxlRm9ybWF0cz10cnVlO2QuY29tcGls ZSgpO0V4dC5UYWJQYW5lbC5wcm90b3R5cGUuaXRlbVRwbD1kfXRoaXMuaXRlbXMu ZWFjaCh0aGlzLmluaXRUYWIsdGhpcyl9LGFmdGVyUmVuZGVyOmZ1bmN0aW9uKCl7 RXh0LlRhYlBhbmVsLnN1cGVyY2xhc3MuYWZ0ZXJSZW5kZXIuY2FsbCh0aGlzKTtp Zih0aGlzLmF1dG9UYWJzKXt0aGlzLnJlYWRUYWJzKGZhbHNlKX1pZih0aGlzLmFj dGl2ZVRhYiE9PXVuZGVmaW5lZCl7dmFyIGE9RXh0LmlzT2JqZWN0KHRoaXMuYWN0 aXZlVGFiKT90aGlzLmFjdGl2ZVRhYjp0aGlzLml0ZW1zLmdldCh0aGlzLmFjdGl2 ZVRhYik7ZGVsZXRlIHRoaXMuYWN0aXZlVGFiO3RoaXMuc2V0QWN0aXZlVGFiKGEp fX0saW5pdEV2ZW50czpmdW5jdGlvbigpe0V4dC5UYWJQYW5lbC5zdXBlcmNsYXNz LmluaXRFdmVudHMuY2FsbCh0aGlzKTt0aGlzLm1vbih0aGlzLnN0cmlwLHtzY29w ZTp0aGlzLG1vdXNlZG93bjp0aGlzLm9uU3RyaXBNb3VzZURvd24sY29udGV4dG1l bnU6dGhpcy5vblN0cmlwQ29udGV4dE1lbnV9KTtpZih0aGlzLmVuYWJsZVRhYlNj cm9sbCl7dGhpcy5tb24odGhpcy5zdHJpcCwibW91c2V3aGVlbCIsdGhpcy5vbldo ZWVsLHRoaXMpfX0sZmluZFRhcmdldHM6ZnVuY3Rpb24oYyl7dmFyIGI9bnVsbCxh PWMuZ2V0VGFyZ2V0KCJsaTpub3QoLngtdGFiLWVkZ2UpIix0aGlzLnN0cmlwKTtp ZihhKXtiPXRoaXMuZ2V0Q29tcG9uZW50KGEuaWQuc3BsaXQodGhpcy5pZERlbGlt aXRlcilbMV0pO2lmKGIuZGlzYWJsZWQpe3JldHVybntjbG9zZTpudWxsLGl0ZW06 bnVsbCxlbDpudWxsfX19cmV0dXJue2Nsb3NlOmMuZ2V0VGFyZ2V0KCIueC10YWIt c3RyaXAtY2xvc2UiLHRoaXMuc3RyaXApLGl0ZW06YixlbDphfX0sb25TdHJpcE1v dXNlRG93bjpmdW5jdGlvbihiKXtpZihiLmJ1dHRvbiE9PTApe3JldHVybn1iLnBy ZXZlbnREZWZhdWx0KCk7dmFyIGE9dGhpcy5maW5kVGFyZ2V0cyhiKTtpZihhLmNs b3NlKXtpZihhLml0ZW0uZmlyZUV2ZW50KCJiZWZvcmVjbG9zZSIsYS5pdGVtKSE9 PWZhbHNlKXthLml0ZW0uZmlyZUV2ZW50KCJjbG9zZSIsYS5pdGVtKTt0aGlzLnJl bW92ZShhLml0ZW0pfXJldHVybn1pZihhLml0ZW0mJmEuaXRlbSE9dGhpcy5hY3Rp dmVUYWIpe3RoaXMuc2V0QWN0aXZlVGFiKGEuaXRlbSl9fSxvblN0cmlwQ29udGV4 dE1lbnU6ZnVuY3Rpb24oYil7Yi5wcmV2ZW50RGVmYXVsdCgpO3ZhciBhPXRoaXMu ZmluZFRhcmdldHMoYik7aWYoYS5pdGVtKXt0aGlzLmZpcmVFdmVudCgiY29udGV4 dG1lbnUiLHRoaXMsYS5pdGVtLGIpfX0scmVhZFRhYnM6ZnVuY3Rpb24oZCl7aWYo ZD09PXRydWUpe3RoaXMuaXRlbXMuZWFjaChmdW5jdGlvbihoKXt0aGlzLnJlbW92 ZShoKX0sdGhpcyl9dmFyIGM9dGhpcy5lbC5xdWVyeSh0aGlzLmF1dG9UYWJTZWxl Y3Rvcik7Zm9yKHZhciBiPTAsYT1jLmxlbmd0aDtiPGE7YisrKXt2YXIgZT1jW2Jd LGc9ZS5nZXRBdHRyaWJ1dGUoInRpdGxlIik7ZS5yZW1vdmVBdHRyaWJ1dGUoInRp dGxlIik7dGhpcy5hZGQoe3RpdGxlOmcsY29udGVudEVsOmV9KX19LGluaXRUYWI6 ZnVuY3Rpb24oZCxiKXt2YXIgZT10aGlzLnN0cmlwLmRvbS5jaGlsZE5vZGVzW2Jd LGc9dGhpcy5nZXRUZW1wbGF0ZUFyZ3MoZCksYz1lP3RoaXMuaXRlbVRwbC5pbnNl cnRCZWZvcmUoZSxnKTp0aGlzLml0ZW1UcGwuYXBwZW5kKHRoaXMuc3RyaXAsZyks YT0ieC10YWItc3RyaXAtb3ZlciIsaD1FeHQuZ2V0KGMpO2guaG92ZXIoZnVuY3Rp b24oKXtpZighZC5kaXNhYmxlZCl7aC5hZGRDbGFzcyhhKX19LGZ1bmN0aW9uKCl7 aC5yZW1vdmVDbGFzcyhhKX0pO2lmKGQudGFiVGlwKXtoLmNoaWxkKCJzcGFuLngt dGFiLXN0cmlwLXRleHQiLHRydWUpLnF0aXA9ZC50YWJUaXB9ZC50YWJFbD1jO2gu c2VsZWN0KCJhIikub24oImNsaWNrIixmdW5jdGlvbihpKXtpZighaS5nZXRQYWdl WCgpKXt0aGlzLm9uU3RyaXBNb3VzZURvd24oaSl9fSx0aGlzLHtwcmV2ZW50RGVm YXVsdDp0cnVlfSk7ZC5vbih7c2NvcGU6dGhpcyxkaXNhYmxlOnRoaXMub25JdGVt RGlzYWJsZWQsZW5hYmxlOnRoaXMub25JdGVtRW5hYmxlZCx0aXRsZWNoYW5nZTp0 aGlzLm9uSXRlbVRpdGxlQ2hhbmdlZCxpY29uY2hhbmdlOnRoaXMub25JdGVtSWNv bkNoYW5nZWQsYmVmb3Jlc2hvdzp0aGlzLm9uQmVmb3JlU2hvd0l0ZW19KX0sZ2V0 VGVtcGxhdGVBcmdzOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY2xvc2FibGU/IngtdGFi LXN0cmlwLWNsb3NhYmxlIjoiIjtpZihiLmRpc2FibGVkKXthKz0iIHgtaXRlbS1k aXNhYmxlZCJ9aWYoYi5pY29uQ2xzKXthKz0iIHgtdGFiLXdpdGgtaWNvbiJ9aWYo Yi50YWJDbHMpe2ErPSIgIitiLnRhYkNsc31yZXR1cm57aWQ6dGhpcy5pZCt0aGlz LmlkRGVsaW1pdGVyK2IuZ2V0SXRlbUlkKCksdGV4dDpiLnRpdGxlLGNsczphLGlj b25DbHM6Yi5pY29uQ2xzfHwiIn19LG9uQWRkOmZ1bmN0aW9uKGIpe0V4dC5UYWJQ YW5lbC5zdXBlcmNsYXNzLm9uQWRkLmNhbGwodGhpcyxiKTtpZih0aGlzLnJlbmRl cmVkKXt2YXIgYT10aGlzLml0ZW1zO3RoaXMuaW5pdFRhYihiLGEuaW5kZXhPZihi KSk7dGhpcy5kZWxlZ2F0ZVVwZGF0ZXMoKX19LG9uQmVmb3JlQWRkOmZ1bmN0aW9u KGIpe3ZhciBhPWIuZXZlbnRzPyh0aGlzLml0ZW1zLmNvbnRhaW5zS2V5KGIuZ2V0 SXRlbUlkKCkpP2I6bnVsbCk6dGhpcy5pdGVtcy5nZXQoYik7aWYoYSl7dGhpcy5z ZXRBY3RpdmVUYWIoYik7cmV0dXJuIGZhbHNlfUV4dC5UYWJQYW5lbC5zdXBlcmNs YXNzLm9uQmVmb3JlQWRkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYz1iLmVs ZW1lbnRzO2IuZWxlbWVudHM9Yz9jLnJlcGxhY2UoIixoZWFkZXIiLCIiKTpjO2Iu Ym9yZGVyPShiLmJvcmRlcj09PXRydWUpfSxvblJlbW92ZTpmdW5jdGlvbihkKXt2 YXIgYj1FeHQuZ2V0KGQudGFiRWwpO2lmKGIpe2Iuc2VsZWN0KCJhIikucmVtb3Zl QWxsTGlzdGVuZXJzKCk7RXh0LmRlc3Ryb3koYil9RXh0LlRhYlBhbmVsLnN1cGVy Y2xhc3Mub25SZW1vdmUuY2FsbCh0aGlzLGQpO3RoaXMuc3RhY2sucmVtb3ZlKGQp O2RlbGV0ZSBkLnRhYkVsO2QudW4oImRpc2FibGUiLHRoaXMub25JdGVtRGlzYWJs ZWQsdGhpcyk7ZC51bigiZW5hYmxlIix0aGlzLm9uSXRlbUVuYWJsZWQsdGhpcyk7 ZC51bigidGl0bGVjaGFuZ2UiLHRoaXMub25JdGVtVGl0bGVDaGFuZ2VkLHRoaXMp O2QudW4oImljb25jaGFuZ2UiLHRoaXMub25JdGVtSWNvbkNoYW5nZWQsdGhpcyk7 ZC51bigiYmVmb3Jlc2hvdyIsdGhpcy5vbkJlZm9yZVNob3dJdGVtLHRoaXMpO2lm KGQ9PXRoaXMuYWN0aXZlVGFiKXt2YXIgYT10aGlzLnN0YWNrLm5leHQoKTtpZihh KXt0aGlzLnNldEFjdGl2ZVRhYihhKX1lbHNle2lmKHRoaXMuaXRlbXMuZ2V0Q291 bnQoKT4wKXt0aGlzLnNldEFjdGl2ZVRhYigwKX1lbHNle3RoaXMuc2V0QWN0aXZl VGFiKG51bGwpfX19aWYoIXRoaXMuZGVzdHJveWluZyl7dGhpcy5kZWxlZ2F0ZVVw ZGF0ZXMoKX19LG9uQmVmb3JlU2hvd0l0ZW06ZnVuY3Rpb24oYSl7aWYoYSE9dGhp cy5hY3RpdmVUYWIpe3RoaXMuc2V0QWN0aXZlVGFiKGEpO3JldHVybiBmYWxzZX19 LG9uSXRlbURpc2FibGVkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0VGFiRWwo Yik7aWYoYSl7RXh0LmZseShhKS5hZGRDbGFzcygieC1pdGVtLWRpc2FibGVkIil9 dGhpcy5zdGFjay5yZW1vdmUoYil9LG9uSXRlbUVuYWJsZWQ6ZnVuY3Rpb24oYil7 dmFyIGE9dGhpcy5nZXRUYWJFbChiKTtpZihhKXtFeHQuZmx5KGEpLnJlbW92ZUNs YXNzKCJ4LWl0ZW0tZGlzYWJsZWQiKX19LG9uSXRlbVRpdGxlQ2hhbmdlZDpmdW5j dGlvbihiKXt2YXIgYT10aGlzLmdldFRhYkVsKGIpO2lmKGEpe0V4dC5mbHkoYSku Y2hpbGQoInNwYW4ueC10YWItc3RyaXAtdGV4dCIsdHJ1ZSkuaW5uZXJIVE1MPWIu dGl0bGV9fSxvbkl0ZW1JY29uQ2hhbmdlZDpmdW5jdGlvbihkLGEsYyl7dmFyIGI9 dGhpcy5nZXRUYWJFbChkKTtpZihiKXtiPUV4dC5nZXQoYik7Yi5jaGlsZCgic3Bh bi54LXRhYi1zdHJpcC10ZXh0IikucmVwbGFjZUNsYXNzKGMsYSk7YltFeHQuaXNF bXB0eShhKT8icmVtb3ZlQ2xhc3MiOiJhZGRDbGFzcyJdKCJ4LXRhYi13aXRoLWlj b24iKX19LGdldFRhYkVsOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0Q29tcG9u ZW50KGEpO3JldHVybiBiP2IudGFiRWw6bnVsbH0sb25SZXNpemU6ZnVuY3Rpb24o KXtFeHQuVGFiUGFuZWwuc3VwZXJjbGFzcy5vblJlc2l6ZS5hcHBseSh0aGlzLGFy Z3VtZW50cyk7dGhpcy5kZWxlZ2F0ZVVwZGF0ZXMoKX0sYmVnaW5VcGRhdGU6ZnVu Y3Rpb24oKXt0aGlzLnN1c3BlbmRVcGRhdGVzPXRydWV9LGVuZFVwZGF0ZTpmdW5j dGlvbigpe3RoaXMuc3VzcGVuZFVwZGF0ZXM9ZmFsc2U7dGhpcy5kZWxlZ2F0ZVVw ZGF0ZXMoKX0saGlkZVRhYlN0cmlwSXRlbTpmdW5jdGlvbihiKXtiPXRoaXMuZ2V0 Q29tcG9uZW50KGIpO3ZhciBhPXRoaXMuZ2V0VGFiRWwoYik7aWYoYSl7YS5zdHls ZS5kaXNwbGF5PSJub25lIjt0aGlzLmRlbGVnYXRlVXBkYXRlcygpfXRoaXMuc3Rh Y2sucmVtb3ZlKGIpfSx1bmhpZGVUYWJTdHJpcEl0ZW06ZnVuY3Rpb24oYil7Yj10 aGlzLmdldENvbXBvbmVudChiKTt2YXIgYT10aGlzLmdldFRhYkVsKGIpO2lmKGEp e2Euc3R5bGUuZGlzcGxheT0iIjt0aGlzLmRlbGVnYXRlVXBkYXRlcygpfX0sZGVs ZWdhdGVVcGRhdGVzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yZW5kZXJlZDtpZih0 aGlzLnN1c3BlbmRVcGRhdGVzKXtyZXR1cm59aWYodGhpcy5yZXNpemVUYWJzJiZh KXt0aGlzLmF1dG9TaXplVGFicygpfWlmKHRoaXMuZW5hYmxlVGFiU2Nyb2xsJiZh KXt0aGlzLmF1dG9TY3JvbGxUYWJzKCl9fSxhdXRvU2l6ZVRhYnM6ZnVuY3Rpb24o KXt2YXIgaD10aGlzLml0ZW1zLmxlbmd0aCxiPXRoaXMudGFiUG9zaXRpb24hPSJi b3R0b20iPyJoZWFkZXIiOiJmb290ZXIiLGM9dGhpc1tiXS5kb20ub2Zmc2V0V2lk dGgsYT10aGlzW2JdLmRvbS5jbGllbnRXaWR0aDtpZighdGhpcy5yZXNpemVUYWJz fHxoPDF8fCFhKXtyZXR1cm59dmFyIGs9TWF0aC5tYXgoTWF0aC5taW4oTWF0aC5m bG9vcigoYS00KS9oKS10aGlzLnRhYk1hcmdpbix0aGlzLnRhYldpZHRoKSx0aGlz Lm1pblRhYldpZHRoKTt0aGlzLmxhc3RUYWJXaWR0aD1rO3ZhciBtPXRoaXMuc3Ry aXAucXVlcnkoImxpOm5vdCgueC10YWItZWRnZSkiKTtmb3IodmFyIGU9MCxqPW0u bGVuZ3RoO2U8ajtlKyspe3ZhciBsPW1bZV0sbj1FeHQuZmx5KGwpLmNoaWxkKCIu eC10YWItc3RyaXAtaW5uZXIiLHRydWUpLGc9bC5vZmZzZXRXaWR0aCxkPW4ub2Zm c2V0V2lkdGg7bi5zdHlsZS53aWR0aD0oay0oZy1kKSkrInB4In19LGFkanVzdEJv ZHlXaWR0aDpmdW5jdGlvbihhKXtpZih0aGlzLmhlYWRlcil7dGhpcy5oZWFkZXIu c2V0V2lkdGgoYSl9aWYodGhpcy5mb290ZXIpe3RoaXMuZm9vdGVyLnNldFdpZHRo KGEpfXJldHVybiBhfSxzZXRBY3RpdmVUYWI6ZnVuY3Rpb24oYyl7Yz10aGlzLmdl dENvbXBvbmVudChjKTtpZih0aGlzLmZpcmVFdmVudCgiYmVmb3JldGFiY2hhbmdl Iix0aGlzLGMsdGhpcy5hY3RpdmVUYWIpPT09ZmFsc2Upe3JldHVybn1pZighdGhp cy5yZW5kZXJlZCl7dGhpcy5hY3RpdmVUYWI9YztyZXR1cm59aWYodGhpcy5hY3Rp dmVUYWIhPWMpe2lmKHRoaXMuYWN0aXZlVGFiKXt2YXIgYT10aGlzLmdldFRhYkVs KHRoaXMuYWN0aXZlVGFiKTtpZihhKXtFeHQuZmx5KGEpLnJlbW92ZUNsYXNzKCJ4 LXRhYi1zdHJpcC1hY3RpdmUiKX19dGhpcy5hY3RpdmVUYWI9YztpZihjKXt2YXIg Yj10aGlzLmdldFRhYkVsKGMpO0V4dC5mbHkoYikuYWRkQ2xhc3MoIngtdGFiLXN0 cmlwLWFjdGl2ZSIpO3RoaXMuc3RhY2suYWRkKGMpO3RoaXMubGF5b3V0LnNldEFj dGl2ZUl0ZW0oYyk7dGhpcy5kZWxlZ2F0ZVVwZGF0ZXMoKTtpZih0aGlzLnNjcm9s bGluZyl7dGhpcy5zY3JvbGxUb1RhYihjLHRoaXMuYW5pbVNjcm9sbCl9fXRoaXMu ZmlyZUV2ZW50KCJ0YWJjaGFuZ2UiLHRoaXMsYyl9fSxnZXRBY3RpdmVUYWI6ZnVu Y3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmVUYWJ8fG51bGx9LGdldEl0ZW06ZnVu Y3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50KGEpfSxhdXRvU2Nyb2xs VGFiczpmdW5jdGlvbigpe3RoaXMucG9zPXRoaXMudGFiUG9zaXRpb249PSJib3R0 b20iP3RoaXMuZm9vdGVyOnRoaXMuaGVhZGVyO3ZhciBoPXRoaXMuaXRlbXMubGVu Z3RoLGQ9dGhpcy5wb3MuZG9tLm9mZnNldFdpZHRoLGM9dGhpcy5wb3MuZG9tLmNs aWVudFdpZHRoLGc9dGhpcy5zdHJpcFdyYXAsZT1nLmRvbSxiPWUub2Zmc2V0V2lk dGgsaT10aGlzLmdldFNjcm9sbFBvcygpLGE9dGhpcy5lZGdlLmdldE9mZnNldHNU byh0aGlzLnN0cmlwV3JhcClbMF0raTtpZighdGhpcy5lbmFibGVUYWJTY3JvbGx8 fGI8MjApe3JldHVybn1pZihoPT0wfHxhPD1jKXtlLnNjcm9sbExlZnQ9MDtnLnNl dFdpZHRoKGMpO2lmKHRoaXMuc2Nyb2xsaW5nKXt0aGlzLnNjcm9sbGluZz1mYWxz ZTt0aGlzLnBvcy5yZW1vdmVDbGFzcygieC10YWItc2Nyb2xsaW5nIik7dGhpcy5z Y3JvbGxMZWZ0LmhpZGUoKTt0aGlzLnNjcm9sbFJpZ2h0LmhpZGUoKTtpZihFeHQu aXNBaXJ8fEV4dC5pc1dlYktpdCl7ZS5zdHlsZS5tYXJnaW5MZWZ0PSIiO2Uuc3R5 bGUubWFyZ2luUmlnaHQ9IiJ9fX1lbHNle2lmKCF0aGlzLnNjcm9sbGluZyl7dGhp cy5wb3MuYWRkQ2xhc3MoIngtdGFiLXNjcm9sbGluZyIpO2lmKEV4dC5pc0Fpcnx8 RXh0LmlzV2ViS2l0KXtlLnN0eWxlLm1hcmdpbkxlZnQ9IjE4cHgiO2Uuc3R5bGUu bWFyZ2luUmlnaHQ9IjE4cHgifX1jLT1nLmdldE1hcmdpbnMoImxyIik7Zy5zZXRX aWR0aChjPjIwP2M6MjApO2lmKCF0aGlzLnNjcm9sbGluZyl7aWYoIXRoaXMuc2Ny b2xsTGVmdCl7dGhpcy5jcmVhdGVTY3JvbGxlcnMoKX1lbHNle3RoaXMuc2Nyb2xs TGVmdC5zaG93KCk7dGhpcy5zY3JvbGxSaWdodC5zaG93KCl9fXRoaXMuc2Nyb2xs aW5nPXRydWU7aWYoaT4oYS1jKSl7ZS5zY3JvbGxMZWZ0PWEtY31lbHNle3RoaXMu c2Nyb2xsVG9UYWIodGhpcy5hY3RpdmVUYWIsZmFsc2UpfXRoaXMudXBkYXRlU2Ny b2xsQnV0dG9ucygpfX0sY3JlYXRlU2Nyb2xsZXJzOmZ1bmN0aW9uKCl7dGhpcy5w b3MuYWRkQ2xhc3MoIngtdGFiLXNjcm9sbGluZy0iK3RoaXMudGFiUG9zaXRpb24p O3ZhciBjPXRoaXMuc3RyaXBXcmFwLmRvbS5vZmZzZXRIZWlnaHQ7dmFyIGE9dGhp cy5wb3MuaW5zZXJ0Rmlyc3Qoe2NsczoieC10YWItc2Nyb2xsZXItbGVmdCJ9KTth LnNldEhlaWdodChjKTthLmFkZENsYXNzT25PdmVyKCJ4LXRhYi1zY3JvbGxlci1s ZWZ0LW92ZXIiKTt0aGlzLmxlZnRSZXBlYXRlcj1uZXcgRXh0LnV0aWwuQ2xpY2tS ZXBlYXRlcihhLHtpbnRlcnZhbDp0aGlzLnNjcm9sbFJlcGVhdEludGVydmFsLGhh bmRsZXI6dGhpcy5vblNjcm9sbExlZnQsc2NvcGU6dGhpc30pO3RoaXMuc2Nyb2xs TGVmdD1hO3ZhciBiPXRoaXMucG9zLmluc2VydEZpcnN0KHtjbHM6IngtdGFiLXNj cm9sbGVyLXJpZ2h0In0pO2Iuc2V0SGVpZ2h0KGMpO2IuYWRkQ2xhc3NPbk92ZXIo IngtdGFiLXNjcm9sbGVyLXJpZ2h0LW92ZXIiKTt0aGlzLnJpZ2h0UmVwZWF0ZXI9 bmV3IEV4dC51dGlsLkNsaWNrUmVwZWF0ZXIoYix7aW50ZXJ2YWw6dGhpcy5zY3Jv bGxSZXBlYXRJbnRlcnZhbCxoYW5kbGVyOnRoaXMub25TY3JvbGxSaWdodCxzY29w ZTp0aGlzfSk7dGhpcy5zY3JvbGxSaWdodD1ifSxnZXRTY3JvbGxXaWR0aDpmdW5j dGlvbigpe3JldHVybiB0aGlzLmVkZ2UuZ2V0T2Zmc2V0c1RvKHRoaXMuc3RyaXBX cmFwKVswXSt0aGlzLmdldFNjcm9sbFBvcygpfSxnZXRTY3JvbGxQb3M6ZnVuY3Rp b24oKXtyZXR1cm4gcGFyc2VJbnQodGhpcy5zdHJpcFdyYXAuZG9tLnNjcm9sbExl ZnQsMTApfHwwfSxnZXRTY3JvbGxBcmVhOmZ1bmN0aW9uKCl7cmV0dXJuIHBhcnNl SW50KHRoaXMuc3RyaXBXcmFwLmRvbS5jbGllbnRXaWR0aCwxMCl8fDB9LGdldFNj cm9sbEFuaW06ZnVuY3Rpb24oKXtyZXR1cm57ZHVyYXRpb246dGhpcy5zY3JvbGxE dXJhdGlvbixjYWxsYmFjazp0aGlzLnVwZGF0ZVNjcm9sbEJ1dHRvbnMsc2NvcGU6 dGhpc319LGdldFNjcm9sbEluY3JlbWVudDpmdW5jdGlvbigpe3JldHVybiB0aGlz LnNjcm9sbEluY3JlbWVudHx8KHRoaXMucmVzaXplVGFicz90aGlzLmxhc3RUYWJX aWR0aCsyOjEwMCl9LHNjcm9sbFRvVGFiOmZ1bmN0aW9uKGUsYSl7aWYoIWUpe3Jl dHVybn12YXIgYz10aGlzLmdldFRhYkVsKGUpLGg9dGhpcy5nZXRTY3JvbGxQb3Mo KSxkPXRoaXMuZ2V0U2Nyb2xsQXJlYSgpLGc9RXh0LmZseShjKS5nZXRPZmZzZXRz VG8odGhpcy5zdHJpcFdyYXApWzBdK2gsYj1nK2Mub2Zmc2V0V2lkdGg7aWYoZzxo KXt0aGlzLnNjcm9sbFRvKGcsYSl9ZWxzZXtpZihiPihoK2QpKXt0aGlzLnNjcm9s bFRvKGItZCxhKX19fSxzY3JvbGxUbzpmdW5jdGlvbihiLGEpe3RoaXMuc3RyaXBX cmFwLnNjcm9sbFRvKCJsZWZ0IixiLGE/dGhpcy5nZXRTY3JvbGxBbmltKCk6ZmFs c2UpO2lmKCFhKXt0aGlzLnVwZGF0ZVNjcm9sbEJ1dHRvbnMoKX19LG9uV2hlZWw6 ZnVuY3Rpb24oZyl7dmFyIGg9Zy5nZXRXaGVlbERlbHRhKCkqdGhpcy53aGVlbElu Y3JlbWVudCotMTtnLnN0b3BFdmVudCgpO3ZhciBpPXRoaXMuZ2V0U2Nyb2xsUG9z KCksYz1pK2gsYT10aGlzLmdldFNjcm9sbFdpZHRoKCktdGhpcy5nZXRTY3JvbGxB cmVhKCk7dmFyIGI9TWF0aC5tYXgoMCxNYXRoLm1pbihhLGMpKTtpZihiIT1pKXt0 aGlzLnNjcm9sbFRvKGIsZmFsc2UpfX0sb25TY3JvbGxSaWdodDpmdW5jdGlvbigp e3ZhciBhPXRoaXMuZ2V0U2Nyb2xsV2lkdGgoKS10aGlzLmdldFNjcm9sbEFyZWEo KSxjPXRoaXMuZ2V0U2Nyb2xsUG9zKCksYj1NYXRoLm1pbihhLGMrdGhpcy5nZXRT Y3JvbGxJbmNyZW1lbnQoKSk7aWYoYiE9Yyl7dGhpcy5zY3JvbGxUbyhiLHRoaXMu YW5pbVNjcm9sbCl9fSxvblNjcm9sbExlZnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlz LmdldFNjcm9sbFBvcygpLGE9TWF0aC5tYXgoMCxiLXRoaXMuZ2V0U2Nyb2xsSW5j cmVtZW50KCkpO2lmKGEhPWIpe3RoaXMuc2Nyb2xsVG8oYSx0aGlzLmFuaW1TY3Jv bGwpfX0sdXBkYXRlU2Nyb2xsQnV0dG9uczpmdW5jdGlvbigpe3ZhciBhPXRoaXMu Z2V0U2Nyb2xsUG9zKCk7dGhpcy5zY3JvbGxMZWZ0W2E9PT0wPyJhZGRDbGFzcyI6 InJlbW92ZUNsYXNzIl0oIngtdGFiLXNjcm9sbGVyLWxlZnQtZGlzYWJsZWQiKTt0 aGlzLnNjcm9sbFJpZ2h0W2E+PSh0aGlzLmdldFNjcm9sbFdpZHRoKCktdGhpcy5n ZXRTY3JvbGxBcmVhKCkpPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oIngtdGFi LXNjcm9sbGVyLXJpZ2h0LWRpc2FibGVkIil9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rp b24oKXtFeHQuZGVzdHJveSh0aGlzLmxlZnRSZXBlYXRlcix0aGlzLnJpZ2h0UmVw ZWF0ZXIpO3RoaXMuZGVsZXRlTWVtYmVycygic3RyaXAiLCJlZGdlIiwic2Nyb2xs TGVmdCIsInNjcm9sbFJpZ2h0Iiwic3RyaXBXcmFwIik7dGhpcy5hY3RpdmVUYWI9 bnVsbDtFeHQuVGFiUGFuZWwuc3VwZXJjbGFzcy5iZWZvcmVEZXN0cm95LmFwcGx5 KHRoaXMpfX0pO0V4dC5yZWcoInRhYnBhbmVsIixFeHQuVGFiUGFuZWwpO0V4dC5U YWJQYW5lbC5wcm90b3R5cGUuYWN0aXZhdGU9RXh0LlRhYlBhbmVsLnByb3RvdHlw ZS5zZXRBY3RpdmVUYWI7RXh0LlRhYlBhbmVsLkFjY2Vzc1N0YWNrPWZ1bmN0aW9u KCl7dmFyIGE9W107cmV0dXJue2FkZDpmdW5jdGlvbihiKXthLnB1c2goYik7aWYo YS5sZW5ndGg+MTApe2Euc2hpZnQoKX19LHJlbW92ZTpmdW5jdGlvbihlKXt2YXIg ZD1bXTtmb3IodmFyIGM9MCxiPWEubGVuZ3RoO2M8YjtjKyspe2lmKGFbY10hPWUp e2QucHVzaChhW2NdKX19YT1kfSxuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIGEucG9w KCl9fX07RXh0LkJ1dHRvbj1FeHQuZXh0ZW5kKEV4dC5Cb3hDb21wb25lbnQse2hp ZGRlbjpmYWxzZSxkaXNhYmxlZDpmYWxzZSxwcmVzc2VkOmZhbHNlLGVuYWJsZVRv Z2dsZTpmYWxzZSxtZW51QWxpZ246InRsLWJsPyIsdHlwZToiYnV0dG9uIixtZW51 Q2xhc3NUYXJnZXQ6InRyOm50aCgyKSIsY2xpY2tFdmVudDoiY2xpY2siLGhhbmRs ZU1vdXNlRXZlbnRzOnRydWUsdG9vbHRpcFR5cGU6InF0aXAiLGJ1dHRvblNlbGVj dG9yOiJidXR0b246Zmlyc3QtY2hpbGQiLHNjYWxlOiJzbWFsbCIsaWNvbkFsaWdu OiJsZWZ0IixhcnJvd0FsaWduOiJyaWdodCIsaW5pdENvbXBvbmVudDpmdW5jdGlv bigpe2lmKHRoaXMubWVudSl7aWYoRXh0LmlzQXJyYXkodGhpcy5tZW51KSl7dGhp cy5tZW51PXtpdGVtczp0aGlzLm1lbnV9fWlmKEV4dC5pc09iamVjdCh0aGlzLm1l bnUpKXt0aGlzLm1lbnUub3duZXJDdD10aGlzfXRoaXMubWVudT1FeHQubWVudS5N ZW51TWdyLmdldCh0aGlzLm1lbnUpO3RoaXMubWVudS5vd25lckN0PXVuZGVmaW5l ZH1FeHQuQnV0dG9uLnN1cGVyY2xhc3MuaW5pdENvbXBvbmVudC5jYWxsKHRoaXMp O3RoaXMuYWRkRXZlbnRzKCJjbGljayIsInRvZ2dsZSIsIm1vdXNlb3ZlciIsIm1v dXNlb3V0IiwibWVudXNob3ciLCJtZW51aGlkZSIsIm1lbnV0cmlnZ2Vyb3ZlciIs Im1lbnV0cmlnZ2Vyb3V0Iik7aWYoRXh0LmlzU3RyaW5nKHRoaXMudG9nZ2xlR3Jv dXApKXt0aGlzLmVuYWJsZVRvZ2dsZT10cnVlfX0sZ2V0VGVtcGxhdGVBcmdzOmZ1 bmN0aW9uKCl7cmV0dXJuW3RoaXMudHlwZSwieC1idG4tIit0aGlzLnNjYWxlKyIg eC1idG4taWNvbi0iK3RoaXMuc2NhbGUrIi0iK3RoaXMuaWNvbkFsaWduLHRoaXMu Z2V0TWVudUNsYXNzKCksdGhpcy5jbHMsdGhpcy5pZF19LHNldEJ1dHRvbkNsYXNz OmZ1bmN0aW9uKCl7aWYodGhpcy51c2VTZXRDbGFzcyl7aWYoIUV4dC5pc0VtcHR5 KHRoaXMub2xkQ2xzKSl7dGhpcy5lbC5yZW1vdmVDbGFzcyhbdGhpcy5vbGRDbHMs IngtYnRuLXByZXNzZWQiXSl9dGhpcy5vbGRDbHM9KHRoaXMuaWNvbkNsc3x8dGhp cy5pY29uKT8odGhpcy50ZXh0PyJ4LWJ0bi10ZXh0LWljb24iOiJ4LWJ0bi1pY29u Iik6IngtYnRuLW5vaWNvbiI7dGhpcy5lbC5hZGRDbGFzcyhbdGhpcy5vbGRDbHMs dGhpcy5wcmVzc2VkPyJ4LWJ0bi1wcmVzc2VkIjpudWxsXSl9fSxnZXRNZW51Q2xh c3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZW51Pyh0aGlzLmFycm93QWxpZ24h PSJib3R0b20iPyJ4LWJ0bi1hcnJvdyI6IngtYnRuLWFycm93LWJvdHRvbSIpOiIi fSxvblJlbmRlcjpmdW5jdGlvbihjLGEpe2lmKCF0aGlzLnRlbXBsYXRlKXtpZigh RXh0LkJ1dHRvbi5idXR0b25UZW1wbGF0ZSl7RXh0LkJ1dHRvbi5idXR0b25UZW1w bGF0ZT1uZXcgRXh0LlRlbXBsYXRlKCc8dGFibGUgaWQ9Ins0fSIgY2VsbHNwYWNp bmc9IjAiIGNsYXNzPSJ4LWJ0biB7M30iPjx0Ym9keSBjbGFzcz0iezF9Ij4nLCc8 dHI+PHRkIGNsYXNzPSJ4LWJ0bi10bCI+PGk+JiMxNjA7PC9pPjwvdGQ+PHRkIGNs YXNzPSJ4LWJ0bi10YyI+PC90ZD48dGQgY2xhc3M9IngtYnRuLXRyIj48aT4mIzE2 MDs8L2k+PC90ZD48L3RyPicsJzx0cj48dGQgY2xhc3M9IngtYnRuLW1sIj48aT4m IzE2MDs8L2k+PC90ZD48dGQgY2xhc3M9IngtYnRuLW1jIj48ZW0gY2xhc3M9Insy fSIgdW5zZWxlY3RhYmxlPSJvbiI+PGJ1dHRvbiB0eXBlPSJ7MH0iPjwvYnV0dG9u PjwvZW0+PC90ZD48dGQgY2xhc3M9IngtYnRuLW1yIj48aT4mIzE2MDs8L2k+PC90 ZD48L3RyPicsJzx0cj48dGQgY2xhc3M9IngtYnRuLWJsIj48aT4mIzE2MDs8L2k+ PC90ZD48dGQgY2xhc3M9IngtYnRuLWJjIj48L3RkPjx0ZCBjbGFzcz0ieC1idG4t YnIiPjxpPiYjMTYwOzwvaT48L3RkPjwvdHI+JywiPC90Ym9keT48L3RhYmxlPiIp O0V4dC5CdXR0b24uYnV0dG9uVGVtcGxhdGUuY29tcGlsZSgpfXRoaXMudGVtcGxh dGU9RXh0LkJ1dHRvbi5idXR0b25UZW1wbGF0ZX12YXIgYixkPXRoaXMuZ2V0VGVt cGxhdGVBcmdzKCk7aWYoYSl7Yj10aGlzLnRlbXBsYXRlLmluc2VydEJlZm9yZShh LGQsdHJ1ZSl9ZWxzZXtiPXRoaXMudGVtcGxhdGUuYXBwZW5kKGMsZCx0cnVlKX10 aGlzLmJ0bkVsPWIuY2hpbGQodGhpcy5idXR0b25TZWxlY3Rvcik7dGhpcy5tb24o dGhpcy5idG5FbCx7c2NvcGU6dGhpcyxmb2N1czp0aGlzLm9uRm9jdXMsYmx1cjp0 aGlzLm9uQmx1cn0pO3RoaXMuaW5pdEJ1dHRvbkVsKGIsdGhpcy5idG5FbCk7RXh0 LkJ1dHRvblRvZ2dsZU1nci5yZWdpc3Rlcih0aGlzKX0saW5pdEJ1dHRvbkVsOmZ1 bmN0aW9uKGIsYyl7dGhpcy5lbD1iO3RoaXMuc2V0SWNvbih0aGlzLmljb24pO3Ro aXMuc2V0VGV4dCh0aGlzLnRleHQpO3RoaXMuc2V0SWNvbkNsYXNzKHRoaXMuaWNv bkNscyk7aWYoRXh0LmlzRGVmaW5lZCh0aGlzLnRhYkluZGV4KSl7Yy5kb20udGFi SW5kZXg9dGhpcy50YWJJbmRleH1pZih0aGlzLnRvb2x0aXApe3RoaXMuc2V0VG9v bHRpcCh0aGlzLnRvb2x0aXAsdHJ1ZSl9aWYodGhpcy5oYW5kbGVNb3VzZUV2ZW50 cyl7dGhpcy5tb24oYix7c2NvcGU6dGhpcyxtb3VzZW92ZXI6dGhpcy5vbk1vdXNl T3Zlcixtb3VzZWRvd246dGhpcy5vbk1vdXNlRG93bn0pfWlmKHRoaXMubWVudSl7 dGhpcy5tb24odGhpcy5tZW51LHtzY29wZTp0aGlzLHNob3c6dGhpcy5vbk1lbnVT aG93LGhpZGU6dGhpcy5vbk1lbnVIaWRlfSl9aWYodGhpcy5yZXBlYXQpe3ZhciBh PW5ldyBFeHQudXRpbC5DbGlja1JlcGVhdGVyKGIsRXh0LmlzT2JqZWN0KHRoaXMu cmVwZWF0KT90aGlzLnJlcGVhdDp7fSk7dGhpcy5tb24oYSwiY2xpY2siLHRoaXMu b25SZXBlYXRDbGljayx0aGlzKX1lbHNle3RoaXMubW9uKGIsdGhpcy5jbGlja0V2 ZW50LHRoaXMub25DbGljayx0aGlzKX19LGFmdGVyUmVuZGVyOmZ1bmN0aW9uKCl7 RXh0LkJ1dHRvbi5zdXBlcmNsYXNzLmFmdGVyUmVuZGVyLmNhbGwodGhpcyk7dGhp cy51c2VTZXRDbGFzcz10cnVlO3RoaXMuc2V0QnV0dG9uQ2xhc3MoKTt0aGlzLmRv Yz1FeHQuZ2V0RG9jKCk7dGhpcy5kb0F1dG9XaWR0aCgpfSxzZXRJY29uQ2xhc3M6 ZnVuY3Rpb24oYSl7dGhpcy5pY29uQ2xzPWE7aWYodGhpcy5lbCl7dGhpcy5idG5F bC5kb20uY2xhc3NOYW1lPSIiO3RoaXMuYnRuRWwuYWRkQ2xhc3MoWyJ4LWJ0bi10 ZXh0IixhfHwiIl0pO3RoaXMuc2V0QnV0dG9uQ2xhc3MoKX1yZXR1cm4gdGhpc30s c2V0VG9vbHRpcDpmdW5jdGlvbihiLGEpe2lmKHRoaXMucmVuZGVyZWQpe2lmKCFh KXt0aGlzLmNsZWFyVGlwKCl9aWYoRXh0LmlzT2JqZWN0KGIpKXtFeHQuUXVpY2tU aXBzLnJlZ2lzdGVyKEV4dC5hcHBseSh7dGFyZ2V0OnRoaXMuYnRuRWwuaWR9LGIp KTt0aGlzLnRvb2x0aXA9Yn1lbHNle3RoaXMuYnRuRWwuZG9tW3RoaXMudG9vbHRp cFR5cGVdPWJ9fWVsc2V7dGhpcy50b29sdGlwPWJ9cmV0dXJuIHRoaXN9LGNsZWFy VGlwOmZ1bmN0aW9uKCl7aWYoRXh0LmlzT2JqZWN0KHRoaXMudG9vbHRpcCkpe0V4 dC5RdWlja1RpcHMudW5yZWdpc3Rlcih0aGlzLmJ0bkVsKX19LGJlZm9yZURlc3Ry b3k6ZnVuY3Rpb24oKXtpZih0aGlzLnJlbmRlcmVkKXt0aGlzLmNsZWFyVGlwKCl9 aWYodGhpcy5tZW51JiZ0aGlzLmRlc3Ryb3lNZW51IT09ZmFsc2Upe0V4dC5kZXN0 cm95KHRoaXMuYnRuRWwsdGhpcy5tZW51KX1FeHQuZGVzdHJveSh0aGlzLnJlcGVh dGVyKX0sb25EZXN0cm95OmZ1bmN0aW9uKCl7aWYodGhpcy5yZW5kZXJlZCl7dGhp cy5kb2MudW4oIm1vdXNlb3ZlciIsdGhpcy5tb25pdG9yTW91c2VPdmVyLHRoaXMp O3RoaXMuZG9jLnVuKCJtb3VzZXVwIix0aGlzLm9uTW91c2VVcCx0aGlzKTtkZWxl dGUgdGhpcy5kb2M7ZGVsZXRlIHRoaXMuYnRuRWw7RXh0LkJ1dHRvblRvZ2dsZU1n ci51bnJlZ2lzdGVyKHRoaXMpfUV4dC5CdXR0b24uc3VwZXJjbGFzcy5vbkRlc3Ry b3kuY2FsbCh0aGlzKX0sZG9BdXRvV2lkdGg6ZnVuY3Rpb24oKXtpZih0aGlzLmF1 dG9XaWR0aCE9PWZhbHNlJiZ0aGlzLmVsJiZ0aGlzLnRleHQmJnRoaXMud2lkdGg9 PT11bmRlZmluZWQpe3RoaXMuZWwuc2V0V2lkdGgoImF1dG8iKTtpZihFeHQuaXNJ RTcmJkV4dC5pc1N0cmljdCl7dmFyIGE9dGhpcy5idG5FbDtpZihhJiZhLmdldFdp ZHRoKCk+MjApe2EuY2xpcCgpO2Euc2V0V2lkdGgoRXh0LnV0aWwuVGV4dE1ldHJp Y3MubWVhc3VyZShhLHRoaXMudGV4dCkud2lkdGgrYS5nZXRGcmFtZVdpZHRoKCJs ciIpKX19aWYodGhpcy5taW5XaWR0aCl7aWYodGhpcy5lbC5nZXRXaWR0aCgpPHRo aXMubWluV2lkdGgpe3RoaXMuZWwuc2V0V2lkdGgodGhpcy5taW5XaWR0aCl9fX19 LHNldEhhbmRsZXI6ZnVuY3Rpb24oYixhKXt0aGlzLmhhbmRsZXI9Yjt0aGlzLnNj b3BlPWE7cmV0dXJuIHRoaXN9LHNldFRleHQ6ZnVuY3Rpb24oYSl7dGhpcy50ZXh0 PWE7aWYodGhpcy5lbCl7dGhpcy5idG5FbC51cGRhdGUoYXx8IiYjMTYwOyIpO3Ro aXMuc2V0QnV0dG9uQ2xhc3MoKX10aGlzLmRvQXV0b1dpZHRoKCk7cmV0dXJuIHRo aXN9LHNldEljb246ZnVuY3Rpb24oYSl7dGhpcy5pY29uPWE7aWYodGhpcy5lbCl7 dGhpcy5idG5FbC5zZXRTdHlsZSgiYmFja2dyb3VuZC1pbWFnZSIsYT8idXJsKCIr YSsiKSI6IiIpO3RoaXMuc2V0QnV0dG9uQ2xhc3MoKX1yZXR1cm4gdGhpc30sZ2V0 VGV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHR9LHRvZ2dsZTpmdW5jdGlv bihiLGEpe2I9Yj09PXVuZGVmaW5lZD8hdGhpcy5wcmVzc2VkOiEhYjtpZihiIT10 aGlzLnByZXNzZWQpe2lmKHRoaXMucmVuZGVyZWQpe3RoaXMuZWxbYj8iYWRkQ2xh c3MiOiJyZW1vdmVDbGFzcyJdKCJ4LWJ0bi1wcmVzc2VkIil9dGhpcy5wcmVzc2Vk PWI7aWYoIWEpe3RoaXMuZmlyZUV2ZW50KCJ0b2dnbGUiLHRoaXMsYik7aWYodGhp cy50b2dnbGVIYW5kbGVyKXt0aGlzLnRvZ2dsZUhhbmRsZXIuY2FsbCh0aGlzLnNj b3BlfHx0aGlzLHRoaXMsYil9fX1yZXR1cm4gdGhpc30sb25EaXNhYmxlOmZ1bmN0 aW9uKCl7dGhpcy5vbkRpc2FibGVDaGFuZ2UodHJ1ZSl9LG9uRW5hYmxlOmZ1bmN0 aW9uKCl7dGhpcy5vbkRpc2FibGVDaGFuZ2UoZmFsc2UpfSxvbkRpc2FibGVDaGFu Z2U6ZnVuY3Rpb24oYSl7aWYodGhpcy5lbCl7aWYoIUV4dC5pc0lFNnx8IXRoaXMu dGV4dCl7dGhpcy5lbFthPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0odGhpcy5k aXNhYmxlZENsYXNzKX10aGlzLmVsLmRvbS5kaXNhYmxlZD1hfXRoaXMuZGlzYWJs ZWQ9YX0sc2hvd01lbnU6ZnVuY3Rpb24oKXtpZih0aGlzLnJlbmRlcmVkJiZ0aGlz Lm1lbnUpe2lmKHRoaXMudG9vbHRpcCl7RXh0LlF1aWNrVGlwcy5nZXRRdWlja1Rp cCgpLmNhbmNlbFNob3codGhpcy5idG5FbCl9aWYodGhpcy5tZW51LmlzVmlzaWJs ZSgpKXt0aGlzLm1lbnUuaGlkZSgpfXRoaXMubWVudS5vd25lckN0PXRoaXM7dGhp cy5tZW51LnNob3codGhpcy5lbCx0aGlzLm1lbnVBbGlnbil9cmV0dXJuIHRoaXN9 LGhpZGVNZW51OmZ1bmN0aW9uKCl7aWYodGhpcy5oYXNWaXNpYmxlTWVudSgpKXt0 aGlzLm1lbnUuaGlkZSgpfXJldHVybiB0aGlzfSxoYXNWaXNpYmxlTWVudTpmdW5j dGlvbigpe3JldHVybiB0aGlzLm1lbnUmJnRoaXMubWVudS5vd25lckN0PT10aGlz JiZ0aGlzLm1lbnUuaXNWaXNpYmxlKCl9LG9uUmVwZWF0Q2xpY2s6ZnVuY3Rpb24o YSxiKXt0aGlzLm9uQ2xpY2soYil9LG9uQ2xpY2s6ZnVuY3Rpb24oYSl7aWYoYSl7 YS5wcmV2ZW50RGVmYXVsdCgpfWlmKGEuYnV0dG9uIT09MCl7cmV0dXJufWlmKCF0 aGlzLmRpc2FibGVkKXt0aGlzLmRvVG9nZ2xlKCk7aWYodGhpcy5tZW51JiYhdGhp cy5oYXNWaXNpYmxlTWVudSgpJiYhdGhpcy5pZ25vcmVOZXh0Q2xpY2spe3RoaXMu c2hvd01lbnUoKX10aGlzLmZpcmVFdmVudCgiY2xpY2siLHRoaXMsYSk7aWYodGhp cy5oYW5kbGVyKXt0aGlzLmhhbmRsZXIuY2FsbCh0aGlzLnNjb3BlfHx0aGlzLHRo aXMsYSl9fX0sZG9Ub2dnbGU6ZnVuY3Rpb24oKXtpZih0aGlzLmVuYWJsZVRvZ2ds ZSYmKHRoaXMuYWxsb3dEZXByZXNzIT09ZmFsc2V8fCF0aGlzLnByZXNzZWQpKXt0 aGlzLnRvZ2dsZSgpfX0saXNNZW51VHJpZ2dlck92ZXI6ZnVuY3Rpb24oYixhKXty ZXR1cm4gdGhpcy5tZW51JiYhYX0saXNNZW51VHJpZ2dlck91dDpmdW5jdGlvbihi LGEpe3JldHVybiB0aGlzLm1lbnUmJiFhfSxvbk1vdXNlT3ZlcjpmdW5jdGlvbihi KXtpZighdGhpcy5kaXNhYmxlZCl7dmFyIGE9Yi53aXRoaW4odGhpcy5lbCx0cnVl KTtpZighYSl7dGhpcy5lbC5hZGRDbGFzcygieC1idG4tb3ZlciIpO2lmKCF0aGlz Lm1vbml0b3JpbmdNb3VzZU92ZXIpe3RoaXMuZG9jLm9uKCJtb3VzZW92ZXIiLHRo aXMubW9uaXRvck1vdXNlT3Zlcix0aGlzKTt0aGlzLm1vbml0b3JpbmdNb3VzZU92 ZXI9dHJ1ZX10aGlzLmZpcmVFdmVudCgibW91c2VvdmVyIix0aGlzLGIpfWlmKHRo aXMuaXNNZW51VHJpZ2dlck92ZXIoYixhKSl7dGhpcy5maXJlRXZlbnQoIm1lbnV0 cmlnZ2Vyb3ZlciIsdGhpcyx0aGlzLm1lbnUsYil9fX0sbW9uaXRvck1vdXNlT3Zl cjpmdW5jdGlvbihhKXtpZihhLnRhcmdldCE9dGhpcy5lbC5kb20mJiFhLndpdGhp bih0aGlzLmVsKSl7aWYodGhpcy5tb25pdG9yaW5nTW91c2VPdmVyKXt0aGlzLmRv Yy51bigibW91c2VvdmVyIix0aGlzLm1vbml0b3JNb3VzZU92ZXIsdGhpcyk7dGhp cy5tb25pdG9yaW5nTW91c2VPdmVyPWZhbHNlfXRoaXMub25Nb3VzZU91dChhKX19 LG9uTW91c2VPdXQ6ZnVuY3Rpb24oYil7dmFyIGE9Yi53aXRoaW4odGhpcy5lbCkm JmIudGFyZ2V0IT10aGlzLmVsLmRvbTt0aGlzLmVsLnJlbW92ZUNsYXNzKCJ4LWJ0 bi1vdmVyIik7dGhpcy5maXJlRXZlbnQoIm1vdXNlb3V0Iix0aGlzLGIpO2lmKHRo aXMuaXNNZW51VHJpZ2dlck91dChiLGEpKXt0aGlzLmZpcmVFdmVudCgibWVudXRy aWdnZXJvdXQiLHRoaXMsdGhpcy5tZW51LGIpfX0sZm9jdXM6ZnVuY3Rpb24oKXt0 aGlzLmJ0bkVsLmZvY3VzKCl9LGJsdXI6ZnVuY3Rpb24oKXt0aGlzLmJ0bkVsLmJs dXIoKX0sb25Gb2N1czpmdW5jdGlvbihhKXtpZighdGhpcy5kaXNhYmxlZCl7dGhp cy5lbC5hZGRDbGFzcygieC1idG4tZm9jdXMiKX19LG9uQmx1cjpmdW5jdGlvbihh KXt0aGlzLmVsLnJlbW92ZUNsYXNzKCJ4LWJ0bi1mb2N1cyIpfSxnZXRDbGlja0Vs OmZ1bmN0aW9uKGIsYSl7cmV0dXJuIHRoaXMuZWx9LG9uTW91c2VEb3duOmZ1bmN0 aW9uKGEpe2lmKCF0aGlzLmRpc2FibGVkJiZhLmJ1dHRvbj09PTApe3RoaXMuZ2V0 Q2xpY2tFbChhKS5hZGRDbGFzcygieC1idG4tY2xpY2siKTt0aGlzLmRvYy5vbigi bW91c2V1cCIsdGhpcy5vbk1vdXNlVXAsdGhpcyl9fSxvbk1vdXNlVXA6ZnVuY3Rp b24oYSl7aWYoYS5idXR0b249PT0wKXt0aGlzLmdldENsaWNrRWwoYSx0cnVlKS5y ZW1vdmVDbGFzcygieC1idG4tY2xpY2siKTt0aGlzLmRvYy51bigibW91c2V1cCIs dGhpcy5vbk1vdXNlVXAsdGhpcyl9fSxvbk1lbnVTaG93OmZ1bmN0aW9uKGEpe2lm KHRoaXMubWVudS5vd25lckN0PT10aGlzKXt0aGlzLm1lbnUub3duZXJDdD10aGlz O3RoaXMuaWdub3JlTmV4dENsaWNrPTA7dGhpcy5lbC5hZGRDbGFzcygieC1idG4t bWVudS1hY3RpdmUiKTt0aGlzLmZpcmVFdmVudCgibWVudXNob3ciLHRoaXMsdGhp cy5tZW51KX19LG9uTWVudUhpZGU6ZnVuY3Rpb24oYSl7aWYodGhpcy5tZW51Lm93 bmVyQ3Q9PXRoaXMpe3RoaXMuZWwucmVtb3ZlQ2xhc3MoIngtYnRuLW1lbnUtYWN0 aXZlIik7dGhpcy5pZ25vcmVOZXh0Q2xpY2s9dGhpcy5yZXN0b3JlQ2xpY2suZGVm ZXIoMjUwLHRoaXMpO3RoaXMuZmlyZUV2ZW50KCJtZW51aGlkZSIsdGhpcyx0aGlz Lm1lbnUpO2RlbGV0ZSB0aGlzLm1lbnUub3duZXJDdH19LHJlc3RvcmVDbGljazpm dW5jdGlvbigpe3RoaXMuaWdub3JlTmV4dENsaWNrPTB9fSk7RXh0LnJlZygiYnV0 dG9uIixFeHQuQnV0dG9uKTtFeHQuQnV0dG9uVG9nZ2xlTWdyPWZ1bmN0aW9uKCl7 dmFyIGE9e307ZnVuY3Rpb24gYihlLGope2lmKGope3ZhciBoPWFbZS50b2dnbGVH cm91cF07Zm9yKHZhciBkPTAsYz1oLmxlbmd0aDtkPGM7ZCsrKXtpZihoW2RdIT1l KXtoW2RdLnRvZ2dsZShmYWxzZSl9fX19cmV0dXJue3JlZ2lzdGVyOmZ1bmN0aW9u KGMpe2lmKCFjLnRvZ2dsZUdyb3VwKXtyZXR1cm59dmFyIGQ9YVtjLnRvZ2dsZUdy b3VwXTtpZighZCl7ZD1hW2MudG9nZ2xlR3JvdXBdPVtdfWQucHVzaChjKTtjLm9u KCJ0b2dnbGUiLGIpfSx1bnJlZ2lzdGVyOmZ1bmN0aW9uKGMpe2lmKCFjLnRvZ2ds ZUdyb3VwKXtyZXR1cm59dmFyIGQ9YVtjLnRvZ2dsZUdyb3VwXTtpZihkKXtkLnJl bW92ZShjKTtjLnVuKCJ0b2dnbGUiLGIpfX0sZ2V0UHJlc3NlZDpmdW5jdGlvbiho KXt2YXIgZT1hW2hdO2lmKGUpe2Zvcih2YXIgZD0wLGM9ZS5sZW5ndGg7ZDxjO2Qr Kyl7aWYoZVtkXS5wcmVzc2VkPT09dHJ1ZSl7cmV0dXJuIGVbZF19fX1yZXR1cm4g bnVsbH19fSgpO0V4dC5TcGxpdEJ1dHRvbj1FeHQuZXh0ZW5kKEV4dC5CdXR0b24s e2Fycm93U2VsZWN0b3I6ImVtIixzcGxpdDp0cnVlLGluaXRDb21wb25lbnQ6ZnVu Y3Rpb24oKXtFeHQuU3BsaXRCdXR0b24uc3VwZXJjbGFzcy5pbml0Q29tcG9uZW50 LmNhbGwodGhpcyk7dGhpcy5hZGRFdmVudHMoImFycm93Y2xpY2siKX0sb25SZW5k ZXI6ZnVuY3Rpb24oKXtFeHQuU3BsaXRCdXR0b24uc3VwZXJjbGFzcy5vblJlbmRl ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYodGhpcy5hcnJvd1Rvb2x0aXApe3Ro aXMuZWwuY2hpbGQodGhpcy5hcnJvd1NlbGVjdG9yKS5kb21bdGhpcy50b29sdGlw VHlwZV09dGhpcy5hcnJvd1Rvb2x0aXB9fSxzZXRBcnJvd0hhbmRsZXI6ZnVuY3Rp b24oYixhKXt0aGlzLmFycm93SGFuZGxlcj1iO3RoaXMuc2NvcGU9YX0sZ2V0TWVu dUNsYXNzOmZ1bmN0aW9uKCl7cmV0dXJuIngtYnRuLXNwbGl0IisodGhpcy5hcnJv d0FsaWduPT0iYm90dG9tIj8iLWJvdHRvbSI6IiIpfSxpc0NsaWNrT25BcnJvdzpm dW5jdGlvbihjKXtpZih0aGlzLmFycm93QWxpZ24hPSJib3R0b20iKXt2YXIgYj10 aGlzLmVsLmNoaWxkKCJlbS54LWJ0bi1zcGxpdCIpO3ZhciBhPWIuZ2V0UmVnaW9u KCkucmlnaHQtYi5nZXRQYWRkaW5nKCJyIik7cmV0dXJuIGMuZ2V0UGFnZVgoKT5h fWVsc2V7cmV0dXJuIGMuZ2V0UGFnZVkoKT50aGlzLmJ0bkVsLmdldFJlZ2lvbigp LmJvdHRvbX19LG9uQ2xpY2s6ZnVuY3Rpb24oYixhKXtiLnByZXZlbnREZWZhdWx0 KCk7aWYoIXRoaXMuZGlzYWJsZWQpe2lmKHRoaXMuaXNDbGlja09uQXJyb3coYikp e2lmKHRoaXMubWVudSYmIXRoaXMubWVudS5pc1Zpc2libGUoKSYmIXRoaXMuaWdu b3JlTmV4dENsaWNrKXt0aGlzLnNob3dNZW51KCl9dGhpcy5maXJlRXZlbnQoImFy cm93Y2xpY2siLHRoaXMsYik7aWYodGhpcy5hcnJvd0hhbmRsZXIpe3RoaXMuYXJy b3dIYW5kbGVyLmNhbGwodGhpcy5zY29wZXx8dGhpcyx0aGlzLGIpfX1lbHNle3Ro aXMuZG9Ub2dnbGUoKTt0aGlzLmZpcmVFdmVudCgiY2xpY2siLHRoaXMsYik7aWYo dGhpcy5oYW5kbGVyKXt0aGlzLmhhbmRsZXIuY2FsbCh0aGlzLnNjb3BlfHx0aGlz LHRoaXMsYil9fX19LGlzTWVudVRyaWdnZXJPdmVyOmZ1bmN0aW9uKGEpe3JldHVy biB0aGlzLm1lbnUmJmEudGFyZ2V0LnRhZ05hbWU9PXRoaXMuYXJyb3dTZWxlY3Rv cn0saXNNZW51VHJpZ2dlck91dDpmdW5jdGlvbihiLGEpe3JldHVybiB0aGlzLm1l bnUmJmIudGFyZ2V0LnRhZ05hbWUhPXRoaXMuYXJyb3dTZWxlY3Rvcn19KTtFeHQu cmVnKCJzcGxpdGJ1dHRvbiIsRXh0LlNwbGl0QnV0dG9uKTtFeHQuQ3ljbGVCdXR0 b249RXh0LmV4dGVuZChFeHQuU3BsaXRCdXR0b24se2dldEl0ZW1UZXh0OmZ1bmN0 aW9uKGEpe2lmKGEmJnRoaXMuc2hvd1RleHQ9PT10cnVlKXt2YXIgYj0iIjtpZih0 aGlzLnByZXBlbmRUZXh0KXtiKz10aGlzLnByZXBlbmRUZXh0fWIrPWEudGV4dDty ZXR1cm4gYn1yZXR1cm4gdW5kZWZpbmVkfSxzZXRBY3RpdmVJdGVtOmZ1bmN0aW9u KGMsYSl7aWYoIUV4dC5pc09iamVjdChjKSl7Yz10aGlzLm1lbnUuZ2V0Q29tcG9u ZW50KGMpfWlmKGMpe2lmKCF0aGlzLnJlbmRlcmVkKXt0aGlzLnRleHQ9dGhpcy5n ZXRJdGVtVGV4dChjKTt0aGlzLmljb25DbHM9Yy5pY29uQ2xzfWVsc2V7dmFyIGI9 dGhpcy5nZXRJdGVtVGV4dChjKTtpZihiKXt0aGlzLnNldFRleHQoYil9dGhpcy5z ZXRJY29uQ2xhc3MoYy5pY29uQ2xzKX10aGlzLmFjdGl2ZUl0ZW09YztpZighYy5j aGVja2VkKXtjLnNldENoZWNrZWQodHJ1ZSxhKX1pZih0aGlzLmZvcmNlSWNvbil7 dGhpcy5zZXRJY29uQ2xhc3ModGhpcy5mb3JjZUljb24pfWlmKCFhKXt0aGlzLmZp cmVFdmVudCgiY2hhbmdlIix0aGlzLGMpfX19LGdldEFjdGl2ZUl0ZW06ZnVuY3Rp b24oKXtyZXR1cm4gdGhpcy5hY3RpdmVJdGVtfSxpbml0Q29tcG9uZW50OmZ1bmN0 aW9uKCl7dGhpcy5hZGRFdmVudHMoImNoYW5nZSIpO2lmKHRoaXMuY2hhbmdlSGFu ZGxlcil7dGhpcy5vbigiY2hhbmdlIix0aGlzLmNoYW5nZUhhbmRsZXIsdGhpcy5z Y29wZXx8dGhpcyk7ZGVsZXRlIHRoaXMuY2hhbmdlSGFuZGxlcn10aGlzLml0ZW1D b3VudD10aGlzLml0ZW1zLmxlbmd0aDt0aGlzLm1lbnU9e2NsczoieC1jeWNsZS1t ZW51IixpdGVtczpbXX07dmFyIGE9MDtFeHQuZWFjaCh0aGlzLml0ZW1zLGZ1bmN0 aW9uKGMsYil7RXh0LmFwcGx5KGMse2dyb3VwOmMuZ3JvdXB8fHRoaXMuaWQsaXRl bUluZGV4OmIsY2hlY2tIYW5kbGVyOnRoaXMuY2hlY2tIYW5kbGVyLHNjb3BlOnRo aXMsY2hlY2tlZDpjLmNoZWNrZWR8fGZhbHNlfSk7dGhpcy5tZW51Lml0ZW1zLnB1 c2goYyk7aWYoYy5jaGVja2VkKXthPWJ9fSx0aGlzKTtFeHQuQ3ljbGVCdXR0b24u c3VwZXJjbGFzcy5pbml0Q29tcG9uZW50LmNhbGwodGhpcyk7dGhpcy5vbigiY2xp Y2siLHRoaXMudG9nZ2xlU2VsZWN0ZWQsdGhpcyk7dGhpcy5zZXRBY3RpdmVJdGVt KGEsdHJ1ZSl9LGNoZWNrSGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKGIpe3RoaXMu c2V0QWN0aXZlSXRlbShhKX19LHRvZ2dsZVNlbGVjdGVkOmZ1bmN0aW9uKCl7dmFy IGE9dGhpcy5tZW51O2EucmVuZGVyKCk7aWYoIWEuaGFzTGF5b3V0KXthLmRvTGF5 b3V0KCl9dmFyIGQsYjtmb3IodmFyIGM9MTtjPHRoaXMuaXRlbUNvdW50O2MrKyl7 ZD0odGhpcy5hY3RpdmVJdGVtLml0ZW1JbmRleCtjKSV0aGlzLml0ZW1Db3VudDti PWEuaXRlbXMuaXRlbUF0KGQpO2lmKCFiLmRpc2FibGVkKXtiLnNldENoZWNrZWQo dHJ1ZSk7YnJlYWt9fX19KTtFeHQucmVnKCJjeWNsZSIsRXh0LkN5Y2xlQnV0dG9u KTtFeHQuVG9vbGJhcj1mdW5jdGlvbihhKXtpZihFeHQuaXNBcnJheShhKSl7YT17 aXRlbXM6YSxsYXlvdXQ6InRvb2xiYXIifX1lbHNle2E9RXh0LmFwcGx5KHtsYXlv dXQ6InRvb2xiYXIifSxhKTtpZihhLmJ1dHRvbnMpe2EuaXRlbXM9YS5idXR0b25z fX1FeHQuVG9vbGJhci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxh KX07KGZ1bmN0aW9uKCl7dmFyIGE9RXh0LlRvb2xiYXI7RXh0LmV4dGVuZChhLEV4 dC5Db250YWluZXIse2RlZmF1bHRUeXBlOiJidXR0b24iLGVuYWJsZU92ZXJmbG93 OmZhbHNlLHRyYWNrTWVudXM6dHJ1ZSxpbnRlcm5hbERlZmF1bHRzOntyZW1vdmVN b2RlOiJjb250YWluZXIiLGhpZGVQYXJlbnQ6dHJ1ZX0sdG9vbGJhckNsczoieC10 b29sYmFyIixpbml0Q29tcG9uZW50OmZ1bmN0aW9uKCl7YS5zdXBlcmNsYXNzLmlu aXRDb21wb25lbnQuY2FsbCh0aGlzKTt0aGlzLmFkZEV2ZW50cygib3ZlcmZsb3dj aGFuZ2UiKX0sb25SZW5kZXI6ZnVuY3Rpb24oYyxiKXtpZighdGhpcy5lbCl7aWYo IXRoaXMuYXV0b0NyZWF0ZSl7dGhpcy5hdXRvQ3JlYXRlPXtjbHM6dGhpcy50b29s YmFyQ2xzKyIgeC1zbWFsbC1lZGl0b3IifX10aGlzLmVsPWMuY3JlYXRlQ2hpbGQo RXh0LmFwcGx5KHtpZDp0aGlzLmlkfSx0aGlzLmF1dG9DcmVhdGUpLGIpO0V4dC5U b29sYmFyLnN1cGVyY2xhc3Mub25SZW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMp fX0sbG9va3VwQ29tcG9uZW50OmZ1bmN0aW9uKGIpe2lmKEV4dC5pc1N0cmluZyhi KSl7aWYoYj09Ii0iKXtiPW5ldyBhLlNlcGFyYXRvcigpfWVsc2V7aWYoYj09IiAi KXtiPW5ldyBhLlNwYWNlcigpfWVsc2V7aWYoYj09Ii0+Iil7Yj1uZXcgYS5GaWxs KCl9ZWxzZXtiPW5ldyBhLlRleHRJdGVtKGIpfX19dGhpcy5hcHBseURlZmF1bHRz KGIpfWVsc2V7aWYoYi5pc0Zvcm1GaWVsZHx8Yi5yZW5kZXIpe2I9dGhpcy5jcmVh dGVDb21wb25lbnQoYil9ZWxzZXtpZihiLnRhZyl7Yj1uZXcgYS5JdGVtKHthdXRv RWw6Yn0pfWVsc2V7aWYoYi50YWdOYW1lKXtiPW5ldyBhLkl0ZW0oe2VsOmJ9KX1l bHNle2lmKEV4dC5pc09iamVjdChiKSl7Yj1iLnh0eXBlP3RoaXMuY3JlYXRlQ29t cG9uZW50KGIpOnRoaXMuY29uc3RydWN0QnV0dG9uKGIpfX19fX1yZXR1cm4gYn0s YXBwbHlEZWZhdWx0czpmdW5jdGlvbihlKXtpZighRXh0LmlzU3RyaW5nKGUpKXtl PUV4dC5Ub29sYmFyLnN1cGVyY2xhc3MuYXBwbHlEZWZhdWx0cy5jYWxsKHRoaXMs ZSk7dmFyIGI9dGhpcy5pbnRlcm5hbERlZmF1bHRzO2lmKGUuZXZlbnRzKXtFeHQu YXBwbHlJZihlLmluaXRpYWxDb25maWcsYik7RXh0LmFwcGx5KGUsYil9ZWxzZXtF eHQuYXBwbHlJZihlLGIpfX1yZXR1cm4gZX0sYWRkU2VwYXJhdG9yOmZ1bmN0aW9u KCl7cmV0dXJuIHRoaXMuYWRkKG5ldyBhLlNlcGFyYXRvcigpKX0sYWRkU3BhY2Vy OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKG5ldyBhLlNwYWNlcigpKX0sYWRk RmlsbDpmdW5jdGlvbigpe3RoaXMuYWRkKG5ldyBhLkZpbGwoKSl9LGFkZEVsZW1l bnQ6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuYWRkSXRlbShuZXcgYS5JdGVtKHtl bDpifSkpfSxhZGRJdGVtOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkZC5hcHBs eSh0aGlzLGFyZ3VtZW50cyl9LGFkZEJ1dHRvbjpmdW5jdGlvbihjKXtpZihFeHQu aXNBcnJheShjKSl7dmFyIGU9W107Zm9yKHZhciBkPTAsYj1jLmxlbmd0aDtkPGI7 ZCsrKXtlLnB1c2godGhpcy5hZGRCdXR0b24oY1tkXSkpfXJldHVybiBlfXJldHVy biB0aGlzLmFkZCh0aGlzLmNvbnN0cnVjdEJ1dHRvbihjKSl9LGFkZFRleHQ6ZnVu Y3Rpb24oYil7cmV0dXJuIHRoaXMuYWRkSXRlbShuZXcgYS5UZXh0SXRlbShiKSl9 LGFkZERvbTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5hZGQobmV3IGEuSXRlbSh7 YXV0b0VsOmJ9KSl9LGFkZEZpZWxkOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFk ZChiKX0saW5zZXJ0QnV0dG9uOmZ1bmN0aW9uKGMsZyl7aWYoRXh0LmlzQXJyYXko Zykpe3ZhciBlPVtdO2Zvcih2YXIgZD0wLGI9Zy5sZW5ndGg7ZDxiO2QrKyl7ZS5w dXNoKHRoaXMuaW5zZXJ0QnV0dG9uKGMrZCxnW2RdKSl9cmV0dXJuIGV9cmV0dXJu IEV4dC5Ub29sYmFyLnN1cGVyY2xhc3MuaW5zZXJ0LmNhbGwodGhpcyxjLGcpfSx0 cmFja01lbnU6ZnVuY3Rpb24oYyxiKXtpZih0aGlzLnRyYWNrTWVudXMmJmMubWVu dSl7dmFyIGQ9Yj8ibXVuIjoibW9uIjt0aGlzW2RdKGMsIm1lbnV0cmlnZ2Vyb3Zl ciIsdGhpcy5vbkJ1dHRvblRyaWdnZXJPdmVyLHRoaXMpO3RoaXNbZF0oYywibWVu dXNob3ciLHRoaXMub25CdXR0b25NZW51U2hvdyx0aGlzKTt0aGlzW2RdKGMsIm1l bnVoaWRlIix0aGlzLm9uQnV0dG9uTWVudUhpZGUsdGhpcyl9fSxjb25zdHJ1Y3RC dXR0b246ZnVuY3Rpb24oZCl7dmFyIGM9ZC5ldmVudHM/ZDp0aGlzLmNyZWF0ZUNv bXBvbmVudChkLGQuc3BsaXQ/InNwbGl0YnV0dG9uIjp0aGlzLmRlZmF1bHRUeXBl KTtyZXR1cm4gY30sb25BZGQ6ZnVuY3Rpb24oYil7RXh0LlRvb2xiYXIuc3VwZXJj bGFzcy5vbkFkZC5jYWxsKHRoaXMpO3RoaXMudHJhY2tNZW51KGIpO2lmKHRoaXMu ZGlzYWJsZWQpe2IuZGlzYWJsZSgpfX0sb25SZW1vdmU6ZnVuY3Rpb24oYil7RXh0 LlRvb2xiYXIuc3VwZXJjbGFzcy5vblJlbW92ZS5jYWxsKHRoaXMpO2lmKGI9PXRo aXMuYWN0aXZlTWVudUJ0bil7ZGVsZXRlIHRoaXMuYWN0aXZlTWVudUJ0bn10aGlz LnRyYWNrTWVudShiLHRydWUpfSxvbkRpc2FibGU6ZnVuY3Rpb24oKXt0aGlzLml0 ZW1zLmVhY2goZnVuY3Rpb24oYil7aWYoYi5kaXNhYmxlKXtiLmRpc2FibGUoKX19 KX0sb25FbmFibGU6ZnVuY3Rpb24oKXt0aGlzLml0ZW1zLmVhY2goZnVuY3Rpb24o Yil7aWYoYi5lbmFibGUpe2IuZW5hYmxlKCl9fSl9LG9uQnV0dG9uVHJpZ2dlck92 ZXI6ZnVuY3Rpb24oYil7aWYodGhpcy5hY3RpdmVNZW51QnRuJiZ0aGlzLmFjdGl2 ZU1lbnVCdG4hPWIpe3RoaXMuYWN0aXZlTWVudUJ0bi5oaWRlTWVudSgpO2Iuc2hv d01lbnUoKTt0aGlzLmFjdGl2ZU1lbnVCdG49Yn19LG9uQnV0dG9uTWVudVNob3c6 ZnVuY3Rpb24oYil7dGhpcy5hY3RpdmVNZW51QnRuPWJ9LG9uQnV0dG9uTWVudUhp ZGU6ZnVuY3Rpb24oYil7ZGVsZXRlIHRoaXMuYWN0aXZlTWVudUJ0bn19KTtFeHQu cmVnKCJ0b29sYmFyIixFeHQuVG9vbGJhcik7YS5JdGVtPUV4dC5leHRlbmQoRXh0 LkJveENvbXBvbmVudCx7aGlkZVBhcmVudDp0cnVlLGVuYWJsZTpFeHQuZW1wdHlG bixkaXNhYmxlOkV4dC5lbXB0eUZuLGZvY3VzOkV4dC5lbXB0eUZufSk7RXh0LnJl ZygidGJpdGVtIixhLkl0ZW0pO2EuU2VwYXJhdG9yPUV4dC5leHRlbmQoYS5JdGVt LHtvblJlbmRlcjpmdW5jdGlvbihjLGIpe3RoaXMuZWw9Yy5jcmVhdGVDaGlsZCh7 dGFnOiJzcGFuIixjbHM6Inh0Yi1zZXAifSxiKX19KTtFeHQucmVnKCJ0YnNlcGFy YXRvciIsYS5TZXBhcmF0b3IpO2EuU3BhY2VyPUV4dC5leHRlbmQoYS5JdGVtLHtv blJlbmRlcjpmdW5jdGlvbihjLGIpe3RoaXMuZWw9Yy5jcmVhdGVDaGlsZCh7dGFn OiJkaXYiLGNsczoieHRiLXNwYWNlciIsc3R5bGU6dGhpcy53aWR0aD8id2lkdGg6 Iit0aGlzLndpZHRoKyJweCI6IiJ9LGIpfX0pO0V4dC5yZWcoInRic3BhY2VyIixh LlNwYWNlcik7YS5GaWxsPUV4dC5leHRlbmQoYS5JdGVtLHtyZW5kZXI6RXh0LmVt cHR5Rm4saXNGaWxsOnRydWV9KTtFeHQucmVnKCJ0YmZpbGwiLGEuRmlsbCk7YS5U ZXh0SXRlbT1FeHQuZXh0ZW5kKGEuSXRlbSx7Y29uc3RydWN0b3I6ZnVuY3Rpb24o Yil7YS5UZXh0SXRlbS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxF eHQuaXNTdHJpbmcoYik/e3RleHQ6Yn06Yil9LG9uUmVuZGVyOmZ1bmN0aW9uKGMs Yil7dGhpcy5hdXRvRWw9e2NsczoieHRiLXRleHQiLGh0bWw6dGhpcy50ZXh0fHwi In07YS5UZXh0SXRlbS5zdXBlcmNsYXNzLm9uUmVuZGVyLmNhbGwodGhpcyxjLGIp fSxzZXRUZXh0OmZ1bmN0aW9uKGIpe2lmKHRoaXMucmVuZGVyZWQpe3RoaXMuZWwu dXBkYXRlKGIpfWVsc2V7dGhpcy50ZXh0PWJ9fX0pO0V4dC5yZWcoInRidGV4dCIs YS5UZXh0SXRlbSk7YS5CdXR0b249RXh0LmV4dGVuZChFeHQuQnV0dG9uLHt9KTth LlNwbGl0QnV0dG9uPUV4dC5leHRlbmQoRXh0LlNwbGl0QnV0dG9uLHt9KTtFeHQu cmVnKCJ0YmJ1dHRvbiIsYS5CdXR0b24pO0V4dC5yZWcoInRic3BsaXQiLGEuU3Bs aXRCdXR0b24pfSkoKTtFeHQuQnV0dG9uR3JvdXA9RXh0LmV4dGVuZChFeHQuUGFu ZWwse2Jhc2VDbHM6IngtYnRuLWdyb3VwIixsYXlvdXQ6InRhYmxlIixkZWZhdWx0 VHlwZToiYnV0dG9uIixmcmFtZTp0cnVlLGludGVybmFsRGVmYXVsdHM6e3JlbW92 ZU1vZGU6ImNvbnRhaW5lciIsaGlkZVBhcmVudDp0cnVlfSxpbml0Q29tcG9uZW50 OmZ1bmN0aW9uKCl7dGhpcy5sYXlvdXRDb25maWc9dGhpcy5sYXlvdXRDb25maWd8 fHt9O0V4dC5hcHBseUlmKHRoaXMubGF5b3V0Q29uZmlnLHtjb2x1bW5zOnRoaXMu Y29sdW1uc30pO2lmKCF0aGlzLnRpdGxlKXt0aGlzLmFkZENsYXNzKCJ4LWJ0bi1n cm91cC1ub3RpdGxlIil9dGhpcy5vbigiYWZ0ZXJsYXlvdXQiLHRoaXMub25BZnRl ckxheW91dCx0aGlzKTtFeHQuQnV0dG9uR3JvdXAuc3VwZXJjbGFzcy5pbml0Q29t cG9uZW50LmNhbGwodGhpcyl9LGFwcGx5RGVmYXVsdHM6ZnVuY3Rpb24oYil7Yj1F eHQuQnV0dG9uR3JvdXAuc3VwZXJjbGFzcy5hcHBseURlZmF1bHRzLmNhbGwodGhp cyxiKTt2YXIgYT10aGlzLmludGVybmFsRGVmYXVsdHM7aWYoYi5ldmVudHMpe0V4 dC5hcHBseUlmKGIuaW5pdGlhbENvbmZpZyxhKTtFeHQuYXBwbHkoYixhKX1lbHNl e0V4dC5hcHBseUlmKGIsYSl9cmV0dXJuIGJ9LG9uQWZ0ZXJMYXlvdXQ6ZnVuY3Rp b24oKXt2YXIgYT10aGlzLmJvZHkuZ2V0RnJhbWVXaWR0aCgibHIiKSt0aGlzLmJv ZHkuZG9tLmZpcnN0Q2hpbGQub2Zmc2V0V2lkdGg7dGhpcy5ib2R5LnNldFdpZHRo KGEpO3RoaXMuZWwuc2V0V2lkdGgoYSt0aGlzLmdldEZyYW1lV2lkdGgoKSl9fSk7 RXh0LnJlZygiYnV0dG9uZ3JvdXAiLEV4dC5CdXR0b25Hcm91cCk7KGZ1bmN0aW9u KCl7dmFyIGE9RXh0LlRvb2xiYXI7RXh0LlBhZ2luZ1Rvb2xiYXI9RXh0LmV4dGVu ZChFeHQuVG9vbGJhcix7cGFnZVNpemU6MjAsZGlzcGxheU1zZzoiRGlzcGxheWlu ZyB7MH0gLSB7MX0gb2YgezJ9IixlbXB0eU1zZzoiTm8gZGF0YSB0byBkaXNwbGF5 IixiZWZvcmVQYWdlVGV4dDoiUGFnZSIsYWZ0ZXJQYWdlVGV4dDoib2YgezB9Iixm aXJzdFRleHQ6IkZpcnN0IFBhZ2UiLHByZXZUZXh0OiJQcmV2aW91cyBQYWdlIixu ZXh0VGV4dDoiTmV4dCBQYWdlIixsYXN0VGV4dDoiTGFzdCBQYWdlIixyZWZyZXNo VGV4dDoiUmVmcmVzaCIsaW5pdENvbXBvbmVudDpmdW5jdGlvbigpe3ZhciBjPVt0 aGlzLmZpcnN0PW5ldyBhLkJ1dHRvbih7dG9vbHRpcDp0aGlzLmZpcnN0VGV4dCxv dmVyZmxvd1RleHQ6dGhpcy5maXJzdFRleHQsaWNvbkNsczoieC10YmFyLXBhZ2Ut Zmlyc3QiLGRpc2FibGVkOnRydWUsaGFuZGxlcjp0aGlzLm1vdmVGaXJzdCxzY29w ZTp0aGlzfSksdGhpcy5wcmV2PW5ldyBhLkJ1dHRvbih7dG9vbHRpcDp0aGlzLnBy ZXZUZXh0LG92ZXJmbG93VGV4dDp0aGlzLnByZXZUZXh0LGljb25DbHM6IngtdGJh ci1wYWdlLXByZXYiLGRpc2FibGVkOnRydWUsaGFuZGxlcjp0aGlzLm1vdmVQcmV2 aW91cyxzY29wZTp0aGlzfSksIi0iLHRoaXMuYmVmb3JlUGFnZVRleHQsdGhpcy5p bnB1dEl0ZW09bmV3IEV4dC5mb3JtLk51bWJlckZpZWxkKHtjbHM6IngtdGJhci1w YWdlLW51bWJlciIsYWxsb3dEZWNpbWFsczpmYWxzZSxhbGxvd05lZ2F0aXZlOmZh bHNlLGVuYWJsZUtleUV2ZW50czp0cnVlLHNlbGVjdE9uRm9jdXM6dHJ1ZSxzdWJt aXRWYWx1ZTpmYWxzZSxsaXN0ZW5lcnM6e3Njb3BlOnRoaXMsa2V5ZG93bjp0aGlz Lm9uUGFnaW5nS2V5RG93bixibHVyOnRoaXMub25QYWdpbmdCbHVyfX0pLHRoaXMu YWZ0ZXJUZXh0SXRlbT1uZXcgYS5UZXh0SXRlbSh7dGV4dDpTdHJpbmcuZm9ybWF0 KHRoaXMuYWZ0ZXJQYWdlVGV4dCwxKX0pLCItIix0aGlzLm5leHQ9bmV3IGEuQnV0 dG9uKHt0b29sdGlwOnRoaXMubmV4dFRleHQsb3ZlcmZsb3dUZXh0OnRoaXMubmV4 dFRleHQsaWNvbkNsczoieC10YmFyLXBhZ2UtbmV4dCIsZGlzYWJsZWQ6dHJ1ZSxo YW5kbGVyOnRoaXMubW92ZU5leHQsc2NvcGU6dGhpc30pLHRoaXMubGFzdD1uZXcg YS5CdXR0b24oe3Rvb2x0aXA6dGhpcy5sYXN0VGV4dCxvdmVyZmxvd1RleHQ6dGhp cy5sYXN0VGV4dCxpY29uQ2xzOiJ4LXRiYXItcGFnZS1sYXN0IixkaXNhYmxlZDp0 cnVlLGhhbmRsZXI6dGhpcy5tb3ZlTGFzdCxzY29wZTp0aGlzfSksIi0iLHRoaXMu cmVmcmVzaD1uZXcgYS5CdXR0b24oe3Rvb2x0aXA6dGhpcy5yZWZyZXNoVGV4dCxv dmVyZmxvd1RleHQ6dGhpcy5yZWZyZXNoVGV4dCxpY29uQ2xzOiJ4LXRiYXItbG9h ZGluZyIsaGFuZGxlcjp0aGlzLmRvUmVmcmVzaCxzY29wZTp0aGlzfSldO3ZhciBi PXRoaXMuaXRlbXN8fHRoaXMuYnV0dG9uc3x8W107aWYodGhpcy5wcmVwZW5kQnV0 dG9ucyl7dGhpcy5pdGVtcz1iLmNvbmNhdChjKX1lbHNle3RoaXMuaXRlbXM9Yy5j b25jYXQoYil9ZGVsZXRlIHRoaXMuYnV0dG9ucztpZih0aGlzLmRpc3BsYXlJbmZv KXt0aGlzLml0ZW1zLnB1c2goIi0+Iik7dGhpcy5pdGVtcy5wdXNoKHRoaXMuZGlz cGxheUl0ZW09bmV3IGEuVGV4dEl0ZW0oe30pKX1FeHQuUGFnaW5nVG9vbGJhci5z dXBlcmNsYXNzLmluaXRDb21wb25lbnQuY2FsbCh0aGlzKTt0aGlzLmFkZEV2ZW50 cygiY2hhbmdlIiwiYmVmb3JlY2hhbmdlIik7dGhpcy5vbigiYWZ0ZXJsYXlvdXQi LHRoaXMub25GaXJzdExheW91dCx0aGlzLHtzaW5nbGU6dHJ1ZX0pO3RoaXMuY3Vy c29yPTA7dGhpcy5iaW5kU3RvcmUodGhpcy5zdG9yZSx0cnVlKX0sb25GaXJzdExh eW91dDpmdW5jdGlvbigpe2lmKHRoaXMuZHNMb2FkZWQpe3RoaXMub25Mb2FkLmFw cGx5KHRoaXMsdGhpcy5kc0xvYWRlZCl9fSx1cGRhdGVJbmZvOmZ1bmN0aW9uKCl7 aWYodGhpcy5kaXNwbGF5SXRlbSl7dmFyIGI9dGhpcy5zdG9yZS5nZXRDb3VudCgp O3ZhciBjPWI9PTA/dGhpcy5lbXB0eU1zZzpTdHJpbmcuZm9ybWF0KHRoaXMuZGlz cGxheU1zZyx0aGlzLmN1cnNvcisxLHRoaXMuY3Vyc29yK2IsdGhpcy5zdG9yZS5n ZXRUb3RhbENvdW50KCkpO3RoaXMuZGlzcGxheUl0ZW0uc2V0VGV4dChjKX19LG9u TG9hZDpmdW5jdGlvbihiLGUsail7aWYoIXRoaXMucmVuZGVyZWQpe3RoaXMuZHNM b2FkZWQ9W2IsZSxqXTtyZXR1cm59dmFyIGc9dGhpcy5nZXRQYXJhbXMoKTt0aGlz LmN1cnNvcj0oai5wYXJhbXMmJmoucGFyYW1zW2cuc3RhcnRdKT9qLnBhcmFtc1tn LnN0YXJ0XTowO3ZhciBpPXRoaXMuZ2V0UGFnZURhdGEoKSxjPWkuYWN0aXZlUGFn ZSxoPWkucGFnZXM7dGhpcy5hZnRlclRleHRJdGVtLnNldFRleHQoU3RyaW5nLmZv cm1hdCh0aGlzLmFmdGVyUGFnZVRleHQsaS5wYWdlcykpO3RoaXMuaW5wdXRJdGVt LnNldFZhbHVlKGMpO3RoaXMuZmlyc3Quc2V0RGlzYWJsZWQoYz09MSk7dGhpcy5w cmV2LnNldERpc2FibGVkKGM9PTEpO3RoaXMubmV4dC5zZXREaXNhYmxlZChjPT1o KTt0aGlzLmxhc3Quc2V0RGlzYWJsZWQoYz09aCk7dGhpcy5yZWZyZXNoLmVuYWJs ZSgpO3RoaXMudXBkYXRlSW5mbygpO3RoaXMuZmlyZUV2ZW50KCJjaGFuZ2UiLHRo aXMsaSl9LGdldFBhZ2VEYXRhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zdG9yZS5n ZXRUb3RhbENvdW50KCk7cmV0dXJue3RvdGFsOmIsYWN0aXZlUGFnZTpNYXRoLmNl aWwoKHRoaXMuY3Vyc29yK3RoaXMucGFnZVNpemUpL3RoaXMucGFnZVNpemUpLHBh Z2VzOmI8dGhpcy5wYWdlU2l6ZT8xOk1hdGguY2VpbChiL3RoaXMucGFnZVNpemUp fX0sY2hhbmdlUGFnZTpmdW5jdGlvbihiKXt0aGlzLmRvTG9hZCgoKGItMSkqdGhp cy5wYWdlU2l6ZSkuY29uc3RyYWluKDAsdGhpcy5zdG9yZS5nZXRUb3RhbENvdW50 KCkpKX0sb25Mb2FkRXJyb3I6ZnVuY3Rpb24oKXtpZighdGhpcy5yZW5kZXJlZCl7 cmV0dXJufXRoaXMucmVmcmVzaC5lbmFibGUoKX0scmVhZFBhZ2U6ZnVuY3Rpb24o ZSl7dmFyIGI9dGhpcy5pbnB1dEl0ZW0uZ2V0VmFsdWUoKSxjO2lmKCFifHxpc05h TihjPXBhcnNlSW50KGIsMTApKSl7dGhpcy5pbnB1dEl0ZW0uc2V0VmFsdWUoZS5h Y3RpdmVQYWdlKTtyZXR1cm4gZmFsc2V9cmV0dXJuIGN9LG9uUGFnaW5nRm9jdXM6 ZnVuY3Rpb24oKXt0aGlzLmlucHV0SXRlbS5zZWxlY3QoKX0sb25QYWdpbmdCbHVy OmZ1bmN0aW9uKGIpe3RoaXMuaW5wdXRJdGVtLnNldFZhbHVlKHRoaXMuZ2V0UGFn ZURhdGEoKS5hY3RpdmVQYWdlKX0sb25QYWdpbmdLZXlEb3duOmZ1bmN0aW9uKGks aCl7dmFyIGM9aC5nZXRLZXkoKSxqPXRoaXMuZ2V0UGFnZURhdGEoKSxnO2lmKGM9 PWguUkVUVVJOKXtoLnN0b3BFdmVudCgpO2c9dGhpcy5yZWFkUGFnZShqKTtpZihn IT09ZmFsc2Upe2c9TWF0aC5taW4oTWF0aC5tYXgoMSxnKSxqLnBhZ2VzKS0xO3Ro aXMuZG9Mb2FkKGcqdGhpcy5wYWdlU2l6ZSl9fWVsc2V7aWYoYz09aC5IT01FfHxj PT1oLkVORCl7aC5zdG9wRXZlbnQoKTtnPWM9PWguSE9NRT8xOmoucGFnZXM7aS5z ZXRWYWx1ZShnKX1lbHNle2lmKGM9PWguVVB8fGM9PWguUEFHRVVQfHxjPT1oLkRP V058fGM9PWguUEFHRURPV04pe2guc3RvcEV2ZW50KCk7aWYoKGc9dGhpcy5yZWFk UGFnZShqKSkpe3ZhciBiPWguc2hpZnRLZXk/MTA6MTtpZihjPT1oLkRPV058fGM9 PWguUEFHRURPV04pe2IqPS0xfWcrPWI7aWYoZz49MSZnPD1qLnBhZ2VzKXtpLnNl dFZhbHVlKGcpfX19fX19LGdldFBhcmFtczpmdW5jdGlvbigpe3JldHVybiB0aGlz LnBhcmFtTmFtZXN8fHRoaXMuc3RvcmUucGFyYW1OYW1lc30sYmVmb3JlTG9hZDpm dW5jdGlvbigpe2lmKHRoaXMucmVuZGVyZWQmJnRoaXMucmVmcmVzaCl7dGhpcy5y ZWZyZXNoLmRpc2FibGUoKX19LGRvTG9hZDpmdW5jdGlvbihkKXt2YXIgYz17fSxi PXRoaXMuZ2V0UGFyYW1zKCk7Y1tiLnN0YXJ0XT1kO2NbYi5saW1pdF09dGhpcy5w YWdlU2l6ZTtpZih0aGlzLmZpcmVFdmVudCgiYmVmb3JlY2hhbmdlIix0aGlzLGMp IT09ZmFsc2Upe3RoaXMuc3RvcmUubG9hZCh7cGFyYW1zOmN9KX19LG1vdmVGaXJz dDpmdW5jdGlvbigpe3RoaXMuZG9Mb2FkKDApfSxtb3ZlUHJldmlvdXM6ZnVuY3Rp b24oKXt0aGlzLmRvTG9hZChNYXRoLm1heCgwLHRoaXMuY3Vyc29yLXRoaXMucGFn ZVNpemUpKX0sbW92ZU5leHQ6ZnVuY3Rpb24oKXt0aGlzLmRvTG9hZCh0aGlzLmN1 cnNvcit0aGlzLnBhZ2VTaXplKX0sbW92ZUxhc3Q6ZnVuY3Rpb24oKXt2YXIgYz10 aGlzLnN0b3JlLmdldFRvdGFsQ291bnQoKSxiPWMldGhpcy5wYWdlU2l6ZTt0aGlz LmRvTG9hZChiPyhjLWIpOmMtdGhpcy5wYWdlU2l6ZSl9LGRvUmVmcmVzaDpmdW5j dGlvbigpe3RoaXMuZG9Mb2FkKHRoaXMuY3Vyc29yKX0sYmluZFN0b3JlOmZ1bmN0 aW9uKGMsZCl7dmFyIGI7aWYoIWQmJnRoaXMuc3RvcmUpe2lmKGMhPT10aGlzLnN0 b3JlJiZ0aGlzLnN0b3JlLmF1dG9EZXN0cm95KXt0aGlzLnN0b3JlLmRlc3Ryb3ko KX1lbHNle3RoaXMuc3RvcmUudW4oImJlZm9yZWxvYWQiLHRoaXMuYmVmb3JlTG9h ZCx0aGlzKTt0aGlzLnN0b3JlLnVuKCJsb2FkIix0aGlzLm9uTG9hZCx0aGlzKTt0 aGlzLnN0b3JlLnVuKCJleGNlcHRpb24iLHRoaXMub25Mb2FkRXJyb3IsdGhpcyl9 aWYoIWMpe3RoaXMuc3RvcmU9bnVsbH19aWYoYyl7Yz1FeHQuU3RvcmVNZ3IubG9v a3VwKGMpO2Mub24oe3Njb3BlOnRoaXMsYmVmb3JlbG9hZDp0aGlzLmJlZm9yZUxv YWQsbG9hZDp0aGlzLm9uTG9hZCxleGNlcHRpb246dGhpcy5vbkxvYWRFcnJvcn0p O2I9dHJ1ZX10aGlzLnN0b3JlPWM7aWYoYil7dGhpcy5vbkxvYWQoYyxudWxsLHt9 KX19LHVuYmluZDpmdW5jdGlvbihiKXt0aGlzLmJpbmRTdG9yZShudWxsKX0sYmlu ZDpmdW5jdGlvbihiKXt0aGlzLmJpbmRTdG9yZShiKX0sb25EZXN0cm95OmZ1bmN0 aW9uKCl7dGhpcy5iaW5kU3RvcmUobnVsbCk7RXh0LlBhZ2luZ1Rvb2xiYXIuc3Vw ZXJjbGFzcy5vbkRlc3Ryb3kuY2FsbCh0aGlzKX19KX0pKCk7RXh0LnJlZygicGFn aW5nIixFeHQuUGFnaW5nVG9vbGJhcik7RXh0Lkhpc3Rvcnk9KGZ1bmN0aW9uKCl7 dmFyIGUsYzt2YXIgaz1mYWxzZTt2YXIgZDtmdW5jdGlvbiBnKCl7dmFyIGw9bG9j YXRpb24uaHJlZixtPWwuaW5kZXhPZigiIyIpLG49bT49MD9sLnN1YnN0cihtKzEp Om51bGw7aWYoRXh0LmlzR2Vja28pe249ZGVjb2RlVVJJQ29tcG9uZW50KG4pfXJl dHVybiBufWZ1bmN0aW9uIGEoKXtjLnZhbHVlPWR9ZnVuY3Rpb24gaChsKXtkPWw7 RXh0Lkhpc3RvcnkuZmlyZUV2ZW50KCJjaGFuZ2UiLGwpfWZ1bmN0aW9uIGkobSl7 dmFyIGw9Wyc8aHRtbD48Ym9keT48ZGl2IGlkPSJzdGF0ZSI+JyxFeHQudXRpbC5G b3JtYXQuaHRtbEVuY29kZShtKSwiPC9kaXY+PC9ib2R5PjwvaHRtbD4iXS5qb2lu KCIiKTt0cnl7dmFyIG89ZS5jb250ZW50V2luZG93LmRvY3VtZW50O28ub3Blbigp O28ud3JpdGUobCk7by5jbG9zZSgpO3JldHVybiB0cnVlfWNhdGNoKG4pe3JldHVy biBmYWxzZX19ZnVuY3Rpb24gYigpe2lmKCFlLmNvbnRlbnRXaW5kb3d8fCFlLmNv bnRlbnRXaW5kb3cuZG9jdW1lbnQpe3NldFRpbWVvdXQoYiwxMCk7cmV0dXJufXZh ciBvPWUuY29udGVudFdpbmRvdy5kb2N1bWVudDt2YXIgbT1vLmdldEVsZW1lbnRC eUlkKCJzdGF0ZSIpO3ZhciBsPW0/bS5pbm5lclRleHQ6bnVsbDt2YXIgbj1nKCk7 c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtvPWUuY29udGVudFdpbmRvdy5kb2N1bWVu dDttPW8uZ2V0RWxlbWVudEJ5SWQoInN0YXRlIik7dmFyIHE9bT9tLmlubmVyVGV4 dDpudWxsO3ZhciBwPWcoKTtpZihxIT09bCl7bD1xO2gobCk7bG9jYXRpb24uaGFz aD1sO249bDthKCl9ZWxzZXtpZihwIT09bil7bj1wO2kocCl9fX0sNTApO2s9dHJ1 ZTtFeHQuSGlzdG9yeS5maXJlRXZlbnQoInJlYWR5IixFeHQuSGlzdG9yeSl9ZnVu Y3Rpb24gaigpe2Q9Yy52YWx1ZT9jLnZhbHVlOmcoKTtpZihFeHQuaXNJRSl7Yigp fWVsc2V7dmFyIGw9ZygpO3NldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIG09Zygp O2lmKG0hPT1sKXtsPW07aChsKTthKCl9fSw1MCk7az10cnVlO0V4dC5IaXN0b3J5 LmZpcmVFdmVudCgicmVhZHkiLEV4dC5IaXN0b3J5KX19cmV0dXJue2ZpZWxkSWQ6 IngtaGlzdG9yeS1maWVsZCIsaWZyYW1lSWQ6IngtaGlzdG9yeS1mcmFtZSIsZXZl bnRzOnt9LGluaXQ6ZnVuY3Rpb24obSxsKXtpZihrKXtFeHQuY2FsbGJhY2sobSxs LFt0aGlzXSk7cmV0dXJufWlmKCFFeHQuaXNSZWFkeSl7RXh0Lm9uUmVhZHkoZnVu Y3Rpb24oKXtFeHQuSGlzdG9yeS5pbml0KG0sbCl9KTtyZXR1cm59Yz1FeHQuZ2V0 RG9tKEV4dC5IaXN0b3J5LmZpZWxkSWQpO2lmKEV4dC5pc0lFKXtlPUV4dC5nZXRE b20oRXh0Lkhpc3RvcnkuaWZyYW1lSWQpfXRoaXMuYWRkRXZlbnRzKCJyZWFkeSIs ImNoYW5nZSIpO2lmKG0pe3RoaXMub24oInJlYWR5IixtLGwse3NpbmdsZTp0cnVl fSl9aigpfSxhZGQ6ZnVuY3Rpb24obCxtKXtpZihtIT09ZmFsc2Upe2lmKHRoaXMu Z2V0VG9rZW4oKT09bCl7cmV0dXJuIHRydWV9fWlmKEV4dC5pc0lFKXtyZXR1cm4g aShsKX1lbHNle2xvY2F0aW9uLmhhc2g9bDtyZXR1cm4gdHJ1ZX19LGJhY2s6ZnVu Y3Rpb24oKXtoaXN0b3J5LmdvKC0xKX0sZm9yd2FyZDpmdW5jdGlvbigpe2hpc3Rv cnkuZ28oMSl9LGdldFRva2VuOmZ1bmN0aW9uKCl7cmV0dXJuIGs/ZDpnKCl9fX0p KCk7RXh0LmFwcGx5KEV4dC5IaXN0b3J5LG5ldyBFeHQudXRpbC5PYnNlcnZhYmxl KCkpO0V4dC5UaXA9RXh0LmV4dGVuZChFeHQuUGFuZWwse21pbldpZHRoOjQwLG1h eFdpZHRoOjMwMCxzaGFkb3c6InNpZGVzIixkZWZhdWx0QWxpZ246InRsLWJsPyIs YXV0b1JlbmRlcjp0cnVlLHF1aWNrU2hvd0ludGVydmFsOjI1MCxmcmFtZTp0cnVl LGhpZGRlbjp0cnVlLGJhc2VDbHM6IngtdGlwIixmbG9hdGluZzp7c2hhZG93OnRy dWUsc2hpbTp0cnVlLHVzZURpc3BsYXk6dHJ1ZSxjb25zdHJhaW46ZmFsc2V9LGF1 dG9IZWlnaHQ6dHJ1ZSxjbG9zZUFjdGlvbjoiaGlkZSIsaW5pdENvbXBvbmVudDpm dW5jdGlvbigpe0V4dC5UaXAuc3VwZXJjbGFzcy5pbml0Q29tcG9uZW50LmNhbGwo dGhpcyk7aWYodGhpcy5jbG9zYWJsZSYmIXRoaXMudGl0bGUpe3RoaXMuZWxlbWVu dHMrPSIsaGVhZGVyIn19LGFmdGVyUmVuZGVyOmZ1bmN0aW9uKCl7RXh0LlRpcC5z dXBlcmNsYXNzLmFmdGVyUmVuZGVyLmNhbGwodGhpcyk7aWYodGhpcy5jbG9zYWJs ZSl7dGhpcy5hZGRUb29sKHtpZDoiY2xvc2UiLGhhbmRsZXI6dGhpc1t0aGlzLmNs b3NlQWN0aW9uXSxzY29wZTp0aGlzfSl9fSxzaG93QXQ6ZnVuY3Rpb24oYSl7RXh0 LlRpcC5zdXBlcmNsYXNzLnNob3cuY2FsbCh0aGlzKTtpZih0aGlzLm1lYXN1cmVX aWR0aCE9PWZhbHNlJiYoIXRoaXMuaW5pdGlhbENvbmZpZ3x8dHlwZW9mIHRoaXMu aW5pdGlhbENvbmZpZy53aWR0aCE9Im51bWJlciIpKXt0aGlzLmRvQXV0b1dpZHRo KCl9aWYodGhpcy5jb25zdHJhaW5Qb3NpdGlvbil7YT10aGlzLmVsLmFkanVzdEZv ckNvbnN0cmFpbnRzKGEpfXRoaXMuc2V0UGFnZVBvc2l0aW9uKGFbMF0sYVsxXSl9 LGRvQXV0b1dpZHRoOmZ1bmN0aW9uKGEpe2E9YXx8MDt2YXIgYj10aGlzLmJvZHku Z2V0VGV4dFdpZHRoKCk7aWYodGhpcy50aXRsZSl7Yj1NYXRoLm1heChiLHRoaXMu aGVhZGVyLmNoaWxkKCJzcGFuIikuZ2V0VGV4dFdpZHRoKHRoaXMudGl0bGUpKX1i Kz10aGlzLmdldEZyYW1lV2lkdGgoKSsodGhpcy5jbG9zYWJsZT8yMDowKSt0aGlz LmJvZHkuZ2V0UGFkZGluZygibHIiKSthO3RoaXMuc2V0V2lkdGgoYi5jb25zdHJh aW4odGhpcy5taW5XaWR0aCx0aGlzLm1heFdpZHRoKSk7aWYoRXh0LmlzSUU3JiYh dGhpcy5yZXBhaW50ZWQpe3RoaXMuZWwucmVwYWludCgpO3RoaXMucmVwYWludGVk PXRydWV9fSxzaG93Qnk6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5yZW5kZXJlZCl7 dGhpcy5yZW5kZXIoRXh0LmdldEJvZHkoKSl9dGhpcy5zaG93QXQodGhpcy5lbC5n ZXRBbGlnblRvWFkoYSxifHx0aGlzLmRlZmF1bHRBbGlnbikpfSxpbml0RHJhZ2dh YmxlOmZ1bmN0aW9uKCl7dGhpcy5kZD1uZXcgRXh0LlRpcC5ERCh0aGlzLHR5cGVv ZiB0aGlzLmRyYWdnYWJsZT09ImJvb2xlYW4iP251bGw6dGhpcy5kcmFnZ2FibGUp O3RoaXMuaGVhZGVyLmFkZENsYXNzKCJ4LXRpcC1kcmFnZ2FibGUiKX19KTtFeHQu cmVnKCJ0aXAiLEV4dC5UaXApO0V4dC5UaXAuREQ9ZnVuY3Rpb24oYixhKXtFeHQu YXBwbHkodGhpcyxhKTt0aGlzLnRpcD1iO0V4dC5UaXAuREQuc3VwZXJjbGFzcy5j b25zdHJ1Y3Rvci5jYWxsKHRoaXMsYi5lbC5pZCwiV2luZG93REQtIitiLmlkKTt0 aGlzLnNldEhhbmRsZUVsSWQoYi5oZWFkZXIuaWQpO3RoaXMuc2Nyb2xsPWZhbHNl fTtFeHQuZXh0ZW5kKEV4dC5UaXAuREQsRXh0LmRkLkRELHttb3ZlT25seTp0cnVl LHNjcm9sbDpmYWxzZSxoZWFkZXJPZmZzZXRzOlsxMDAsMjVdLHN0YXJ0RHJhZzpm dW5jdGlvbigpe3RoaXMudGlwLmVsLmRpc2FibGVTaGFkb3coKX0sZW5kRHJhZzpm dW5jdGlvbihhKXt0aGlzLnRpcC5lbC5lbmFibGVTaGFkb3codHJ1ZSl9fSk7RXh0 LlRvb2xUaXA9RXh0LmV4dGVuZChFeHQuVGlwLHtzaG93RGVsYXk6NTAwLGhpZGVE ZWxheToyMDAsZGlzbWlzc0RlbGF5OjUwMDAsdHJhY2tNb3VzZTpmYWxzZSxhbmNo b3JUb1RhcmdldDp0cnVlLGFuY2hvck9mZnNldDowLHRhcmdldENvdW50ZXI6MCxj b25zdHJhaW5Qb3NpdGlvbjpmYWxzZSxpbml0Q29tcG9uZW50OmZ1bmN0aW9uKCl7 RXh0LlRvb2xUaXAuc3VwZXJjbGFzcy5pbml0Q29tcG9uZW50LmNhbGwodGhpcyk7 dGhpcy5sYXN0QWN0aXZlPW5ldyBEYXRlKCk7dGhpcy5pbml0VGFyZ2V0KHRoaXMu dGFyZ2V0KTt0aGlzLm9yaWdBbmNob3I9dGhpcy5hbmNob3J9LG9uUmVuZGVyOmZ1 bmN0aW9uKGIsYSl7RXh0LlRvb2xUaXAuc3VwZXJjbGFzcy5vblJlbmRlci5jYWxs KHRoaXMsYixhKTt0aGlzLmFuY2hvckNscz0ieC10aXAtYW5jaG9yLSIrdGhpcy5n ZXRBbmNob3JQb3NpdGlvbigpO3RoaXMuYW5jaG9yRWw9dGhpcy5lbC5jcmVhdGVD aGlsZCh7Y2xzOiJ4LXRpcC1hbmNob3IgIit0aGlzLmFuY2hvckNsc30pfSxhZnRl clJlbmRlcjpmdW5jdGlvbigpe0V4dC5Ub29sVGlwLnN1cGVyY2xhc3MuYWZ0ZXJS ZW5kZXIuY2FsbCh0aGlzKTt0aGlzLmFuY2hvckVsLnNldFN0eWxlKCJ6LWluZGV4 Iix0aGlzLmVsLmdldFpJbmRleCgpKzEpLnNldFZpc2liaWxpdHlNb2RlKEV4dC5F bGVtZW50LkRJU1BMQVkpfSxpbml0VGFyZ2V0OmZ1bmN0aW9uKGMpe3ZhciBhO2lm KChhPUV4dC5nZXQoYykpKXtpZih0aGlzLnRhcmdldCl7dmFyIGI9RXh0LmdldCh0 aGlzLnRhcmdldCk7dGhpcy5tdW4oYiwibW91c2VvdmVyIix0aGlzLm9uVGFyZ2V0 T3Zlcix0aGlzKTt0aGlzLm11bihiLCJtb3VzZW91dCIsdGhpcy5vblRhcmdldE91 dCx0aGlzKTt0aGlzLm11bihiLCJtb3VzZW1vdmUiLHRoaXMub25Nb3VzZU1vdmUs dGhpcyl9dGhpcy5tb24oYSx7bW91c2VvdmVyOnRoaXMub25UYXJnZXRPdmVyLG1v dXNlb3V0OnRoaXMub25UYXJnZXRPdXQsbW91c2Vtb3ZlOnRoaXMub25Nb3VzZU1v dmUsc2NvcGU6dGhpc30pO3RoaXMudGFyZ2V0PWF9aWYodGhpcy5hbmNob3Ipe3Ro aXMuYW5jaG9yVGFyZ2V0PXRoaXMudGFyZ2V0fX0sb25Nb3VzZU1vdmU6ZnVuY3Rp b24oYil7dmFyIGE9dGhpcy5kZWxlZ2F0ZT9iLmdldFRhcmdldCh0aGlzLmRlbGVn YXRlKTp0aGlzLnRyaWdnZXJFbGVtZW50PXRydWU7aWYoYSl7dGhpcy50YXJnZXRY WT1iLmdldFhZKCk7aWYoYT09PXRoaXMudHJpZ2dlckVsZW1lbnQpe2lmKCF0aGlz LmhpZGRlbiYmdGhpcy50cmFja01vdXNlKXt0aGlzLnNldFBhZ2VQb3NpdGlvbih0 aGlzLmdldFRhcmdldFhZKCkpfX1lbHNle3RoaXMuaGlkZSgpO3RoaXMubGFzdEFj dGl2ZT1uZXcgRGF0ZSgwKTt0aGlzLm9uVGFyZ2V0T3ZlcihiKX19ZWxzZXtpZigh dGhpcy5jbG9zYWJsZSYmdGhpcy5pc1Zpc2libGUoKSl7dGhpcy5oaWRlKCl9fX0s Z2V0VGFyZ2V0WFk6ZnVuY3Rpb24oKXtpZih0aGlzLmRlbGVnYXRlKXt0aGlzLmFu Y2hvclRhcmdldD10aGlzLnRyaWdnZXJFbGVtZW50fWlmKHRoaXMuYW5jaG9yKXt0 aGlzLnRhcmdldENvdW50ZXIrKzt2YXIgYz10aGlzLmdldE9mZnNldHMoKSxsPSh0 aGlzLmFuY2hvclRvVGFyZ2V0JiYhdGhpcy50cmFja01vdXNlKT90aGlzLmVsLmdl dEFsaWduVG9YWSh0aGlzLmFuY2hvclRhcmdldCx0aGlzLmdldEFuY2hvckFsaWdu KCkpOnRoaXMudGFyZ2V0WFksYT1FeHQubGliLkRvbS5nZXRWaWV3V2lkdGgoKS01 LGg9RXh0LmxpYi5Eb20uZ2V0Vmlld0hlaWdodCgpLTUsaT1kb2N1bWVudC5kb2N1 bWVudEVsZW1lbnQsZT1kb2N1bWVudC5ib2R5LGs9KGkuc2Nyb2xsTGVmdHx8ZS5z Y3JvbGxMZWZ0fHwwKSs1LGo9KGkuc2Nyb2xsVG9wfHxlLnNjcm9sbFRvcHx8MCkr NSxiPVtsWzBdK2NbMF0sbFsxXStjWzFdXSxnPXRoaXMuZ2V0U2l6ZSgpO3RoaXMu YW5jaG9yRWwucmVtb3ZlQ2xhc3ModGhpcy5hbmNob3JDbHMpO2lmKHRoaXMudGFy Z2V0Q291bnRlcjwyKXtpZihiWzBdPGspe2lmKHRoaXMuYW5jaG9yVG9UYXJnZXQp e3RoaXMuZGVmYXVsdEFsaWduPSJsLXIiO2lmKHRoaXMubW91c2VPZmZzZXQpe3Ro aXMubW91c2VPZmZzZXRbMF0qPS0xfX10aGlzLmFuY2hvcj0ibGVmdCI7cmV0dXJu IHRoaXMuZ2V0VGFyZ2V0WFkoKX1pZihiWzBdK2cud2lkdGg+YSl7aWYodGhpcy5h bmNob3JUb1RhcmdldCl7dGhpcy5kZWZhdWx0QWxpZ249InItbCI7aWYodGhpcy5t b3VzZU9mZnNldCl7dGhpcy5tb3VzZU9mZnNldFswXSo9LTF9fXRoaXMuYW5jaG9y PSJyaWdodCI7cmV0dXJuIHRoaXMuZ2V0VGFyZ2V0WFkoKX1pZihiWzFdPGope2lm KHRoaXMuYW5jaG9yVG9UYXJnZXQpe3RoaXMuZGVmYXVsdEFsaWduPSJ0LWIiO2lm KHRoaXMubW91c2VPZmZzZXQpe3RoaXMubW91c2VPZmZzZXRbMV0qPS0xfX10aGlz LmFuY2hvcj0idG9wIjtyZXR1cm4gdGhpcy5nZXRUYXJnZXRYWSgpfWlmKGJbMV0r Zy5oZWlnaHQ+aCl7aWYodGhpcy5hbmNob3JUb1RhcmdldCl7dGhpcy5kZWZhdWx0 QWxpZ249ImItdCI7aWYodGhpcy5tb3VzZU9mZnNldCl7dGhpcy5tb3VzZU9mZnNl dFsxXSo9LTF9fXRoaXMuYW5jaG9yPSJib3R0b20iO3JldHVybiB0aGlzLmdldFRh cmdldFhZKCl9fXRoaXMuYW5jaG9yQ2xzPSJ4LXRpcC1hbmNob3ItIit0aGlzLmdl dEFuY2hvclBvc2l0aW9uKCk7dGhpcy5hbmNob3JFbC5hZGRDbGFzcyh0aGlzLmFu Y2hvckNscyk7dGhpcy50YXJnZXRDb3VudGVyPTA7cmV0dXJuIGJ9ZWxzZXt2YXIg ZD10aGlzLmdldE1vdXNlT2Zmc2V0KCk7cmV0dXJuW3RoaXMudGFyZ2V0WFlbMF0r ZFswXSx0aGlzLnRhcmdldFhZWzFdK2RbMV1dfX0sZ2V0TW91c2VPZmZzZXQ6ZnVu Y3Rpb24oKXt2YXIgYT10aGlzLmFuY2hvcj9bMCwwXTpbMTUsMThdO2lmKHRoaXMu bW91c2VPZmZzZXQpe2FbMF0rPXRoaXMubW91c2VPZmZzZXRbMF07YVsxXSs9dGhp cy5tb3VzZU9mZnNldFsxXX1yZXR1cm4gYX0sZ2V0QW5jaG9yUG9zaXRpb246ZnVu Y3Rpb24oKXtpZih0aGlzLmFuY2hvcil7dGhpcy50aXBBbmNob3I9dGhpcy5hbmNo b3IuY2hhckF0KDApfWVsc2V7dmFyIGE9dGhpcy5kZWZhdWx0QWxpZ24ubWF0Y2go L14oW2Etel0rKS0oW2Etel0rKShcPyk/JC8pO2lmKCFhKXt0aHJvdyJBbmNob3JU aXAuZGVmYXVsdEFsaWduIGlzIGludmFsaWQifXRoaXMudGlwQW5jaG9yPWFbMV0u Y2hhckF0KDApfXN3aXRjaCh0aGlzLnRpcEFuY2hvcil7Y2FzZSJ0IjpyZXR1cm4i dG9wIjtjYXNlImIiOnJldHVybiJib3R0b20iO2Nhc2UiciI6cmV0dXJuInJpZ2h0 In1yZXR1cm4ibGVmdCJ9LGdldEFuY2hvckFsaWduOmZ1bmN0aW9uKCl7c3dpdGNo KHRoaXMuYW5jaG9yKXtjYXNlInRvcCI6cmV0dXJuInRsLWJsIjtjYXNlImxlZnQi OnJldHVybiJ0bC10ciI7Y2FzZSJyaWdodCI6cmV0dXJuInRyLXRsIjtkZWZhdWx0 OnJldHVybiJibC10bCJ9fSxnZXRPZmZzZXRzOmZ1bmN0aW9uKCl7dmFyIGIsYT10 aGlzLmdldEFuY2hvclBvc2l0aW9uKCkuY2hhckF0KDApO2lmKHRoaXMuYW5jaG9y VG9UYXJnZXQmJiF0aGlzLnRyYWNrTW91c2Upe3N3aXRjaChhKXtjYXNlInQiOmI9 WzAsOV07YnJlYWs7Y2FzZSJiIjpiPVswLC0xM107YnJlYWs7Y2FzZSJyIjpiPVst MTMsMF07YnJlYWs7ZGVmYXVsdDpiPVs5LDBdO2JyZWFrfX1lbHNle3N3aXRjaChh KXtjYXNlInQiOmI9Wy0xNS10aGlzLmFuY2hvck9mZnNldCwzMF07YnJlYWs7Y2Fz ZSJiIjpiPVstMTktdGhpcy5hbmNob3JPZmZzZXQsLTEzLXRoaXMuZWwuZG9tLm9m ZnNldEhlaWdodF07YnJlYWs7Y2FzZSJyIjpiPVstMTUtdGhpcy5lbC5kb20ub2Zm c2V0V2lkdGgsLTEzLXRoaXMuYW5jaG9yT2Zmc2V0XTticmVhaztkZWZhdWx0OmI9 WzI1LC0xMy10aGlzLmFuY2hvck9mZnNldF07YnJlYWt9fXZhciBjPXRoaXMuZ2V0 TW91c2VPZmZzZXQoKTtiWzBdKz1jWzBdO2JbMV0rPWNbMV07cmV0dXJuIGJ9LG9u VGFyZ2V0T3ZlcjpmdW5jdGlvbihiKXtpZih0aGlzLmRpc2FibGVkfHxiLndpdGhp bih0aGlzLnRhcmdldC5kb20sdHJ1ZSkpe3JldHVybn12YXIgYT1iLmdldFRhcmdl dCh0aGlzLmRlbGVnYXRlKTtpZihhKXt0aGlzLnRyaWdnZXJFbGVtZW50PWE7dGhp cy5jbGVhclRpbWVyKCJoaWRlIik7dGhpcy50YXJnZXRYWT1iLmdldFhZKCk7dGhp cy5kZWxheVNob3coKX19LGRlbGF5U2hvdzpmdW5jdGlvbigpe2lmKHRoaXMuaGlk ZGVuJiYhdGhpcy5zaG93VGltZXIpe2lmKHRoaXMubGFzdEFjdGl2ZS5nZXRFbGFw c2VkKCk8dGhpcy5xdWlja1Nob3dJbnRlcnZhbCl7dGhpcy5zaG93KCl9ZWxzZXt0 aGlzLnNob3dUaW1lcj10aGlzLnNob3cuZGVmZXIodGhpcy5zaG93RGVsYXksdGhp cyl9fWVsc2V7aWYoIXRoaXMuaGlkZGVuJiZ0aGlzLmF1dG9IaWRlIT09ZmFsc2Up e3RoaXMuc2hvdygpfX19LG9uVGFyZ2V0T3V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMu ZGlzYWJsZWR8fGEud2l0aGluKHRoaXMudGFyZ2V0LmRvbSx0cnVlKSl7cmV0dXJu fXRoaXMuY2xlYXJUaW1lcigic2hvdyIpO2lmKHRoaXMuYXV0b0hpZGUhPT1mYWxz ZSl7dGhpcy5kZWxheUhpZGUoKX19LGRlbGF5SGlkZTpmdW5jdGlvbigpe2lmKCF0 aGlzLmhpZGRlbiYmIXRoaXMuaGlkZVRpbWVyKXt0aGlzLmhpZGVUaW1lcj10aGlz LmhpZGUuZGVmZXIodGhpcy5oaWRlRGVsYXksdGhpcyl9fSxoaWRlOmZ1bmN0aW9u KCl7dGhpcy5jbGVhclRpbWVyKCJkaXNtaXNzIik7dGhpcy5sYXN0QWN0aXZlPW5l dyBEYXRlKCk7aWYodGhpcy5hbmNob3JFbCl7dGhpcy5hbmNob3JFbC5oaWRlKCl9 RXh0LlRvb2xUaXAuc3VwZXJjbGFzcy5oaWRlLmNhbGwodGhpcyk7ZGVsZXRlIHRo aXMudHJpZ2dlckVsZW1lbnR9LHNob3c6ZnVuY3Rpb24oKXtpZih0aGlzLmFuY2hv cil7dGhpcy5zaG93QXQoWy0xMDAwLC0xMDAwXSk7dGhpcy5vcmlnQ29uc3RyYWlu UG9zaXRpb249dGhpcy5jb25zdHJhaW5Qb3NpdGlvbjt0aGlzLmNvbnN0cmFpblBv c2l0aW9uPWZhbHNlO3RoaXMuYW5jaG9yPXRoaXMub3JpZ0FuY2hvcn10aGlzLnNo b3dBdCh0aGlzLmdldFRhcmdldFhZKCkpO2lmKHRoaXMuYW5jaG9yKXt0aGlzLmFu Y2hvckVsLnNob3coKTt0aGlzLnN5bmNBbmNob3IoKTt0aGlzLmNvbnN0cmFpblBv c2l0aW9uPXRoaXMub3JpZ0NvbnN0cmFpblBvc2l0aW9ufWVsc2V7dGhpcy5hbmNo b3JFbC5oaWRlKCl9fSxzaG93QXQ6ZnVuY3Rpb24oYSl7dGhpcy5sYXN0QWN0aXZl PW5ldyBEYXRlKCk7dGhpcy5jbGVhclRpbWVycygpO0V4dC5Ub29sVGlwLnN1cGVy Y2xhc3Muc2hvd0F0LmNhbGwodGhpcyxhKTtpZih0aGlzLmRpc21pc3NEZWxheSYm dGhpcy5hdXRvSGlkZSE9PWZhbHNlKXt0aGlzLmRpc21pc3NUaW1lcj10aGlzLmhp ZGUuZGVmZXIodGhpcy5kaXNtaXNzRGVsYXksdGhpcyl9aWYodGhpcy5hbmNob3Im JiF0aGlzLmFuY2hvckVsLmlzVmlzaWJsZSgpKXt0aGlzLnN5bmNBbmNob3IoKTt0 aGlzLmFuY2hvckVsLnNob3coKX1lbHNle3RoaXMuYW5jaG9yRWwuaGlkZSgpfX0s c3luY0FuY2hvcjpmdW5jdGlvbigpe3ZhciBhLGIsYztzd2l0Y2godGhpcy50aXBB bmNob3IuY2hhckF0KDApKXtjYXNlInQiOmE9ImIiO2I9InRsIjtjPVsyMCt0aGlz LmFuY2hvck9mZnNldCwyXTticmVhaztjYXNlInIiOmE9ImwiO2I9InRyIjtjPVst MiwxMSt0aGlzLmFuY2hvck9mZnNldF07YnJlYWs7Y2FzZSJiIjphPSJ0IjtiPSJi bCI7Yz1bMjArdGhpcy5hbmNob3JPZmZzZXQsLTJdO2JyZWFrO2RlZmF1bHQ6YT0i ciI7Yj0idGwiO2M9WzIsMTErdGhpcy5hbmNob3JPZmZzZXRdO2JyZWFrfXRoaXMu YW5jaG9yRWwuYWxpZ25Ubyh0aGlzLmVsLGErIi0iK2IsYyl9LHNldFBhZ2VQb3Np dGlvbjpmdW5jdGlvbihhLGIpe0V4dC5Ub29sVGlwLnN1cGVyY2xhc3Muc2V0UGFn ZVBvc2l0aW9uLmNhbGwodGhpcyxhLGIpO2lmKHRoaXMuYW5jaG9yKXt0aGlzLnN5 bmNBbmNob3IoKX19LGNsZWFyVGltZXI6ZnVuY3Rpb24oYSl7YT1hKyJUaW1lciI7 Y2xlYXJUaW1lb3V0KHRoaXNbYV0pO2RlbGV0ZSB0aGlzW2FdfSxjbGVhclRpbWVy czpmdW5jdGlvbigpe3RoaXMuY2xlYXJUaW1lcigic2hvdyIpO3RoaXMuY2xlYXJU aW1lcigiZGlzbWlzcyIpO3RoaXMuY2xlYXJUaW1lcigiaGlkZSIpfSxvblNob3c6 ZnVuY3Rpb24oKXtFeHQuVG9vbFRpcC5zdXBlcmNsYXNzLm9uU2hvdy5jYWxsKHRo aXMpO0V4dC5nZXREb2MoKS5vbigibW91c2Vkb3duIix0aGlzLm9uRG9jTW91c2VE b3duLHRoaXMpfSxvbkhpZGU6ZnVuY3Rpb24oKXtFeHQuVG9vbFRpcC5zdXBlcmNs YXNzLm9uSGlkZS5jYWxsKHRoaXMpO0V4dC5nZXREb2MoKS51bigibW91c2Vkb3du Iix0aGlzLm9uRG9jTW91c2VEb3duLHRoaXMpfSxvbkRvY01vdXNlRG93bjpmdW5j dGlvbihhKXtpZih0aGlzLmF1dG9IaWRlIT09dHJ1ZSYmIXRoaXMuY2xvc2FibGUm JiFhLndpdGhpbih0aGlzLmVsLmRvbSkpe3RoaXMuZGlzYWJsZSgpO3RoaXMuZG9F bmFibGUuZGVmZXIoMTAwLHRoaXMpfX0sZG9FbmFibGU6ZnVuY3Rpb24oKXtpZigh dGhpcy5pc0Rlc3Ryb3llZCl7dGhpcy5lbmFibGUoKX19LG9uRGlzYWJsZTpmdW5j dGlvbigpe3RoaXMuY2xlYXJUaW1lcnMoKTt0aGlzLmhpZGUoKX0sYWRqdXN0UG9z aXRpb246ZnVuY3Rpb24oYSxkKXtpZih0aGlzLmNvbnN0cmFpblBvc2l0aW9uKXt2 YXIgYz10aGlzLnRhcmdldFhZWzFdLGI9dGhpcy5nZXRTaXplKCkuaGVpZ2h0O2lm KGQ8PWMmJihkK2IpPj1jKXtkPWMtYi01fX1yZXR1cm57eDphLHk6ZH19LGJlZm9y ZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmNsZWFyVGltZXJzKCk7RXh0LmRlc3Ry b3kodGhpcy5hbmNob3JFbCk7ZGVsZXRlIHRoaXMuYW5jaG9yRWw7ZGVsZXRlIHRo aXMudGFyZ2V0O2RlbGV0ZSB0aGlzLmFuY2hvclRhcmdldDtkZWxldGUgdGhpcy50 cmlnZ2VyRWxlbWVudDtFeHQuVG9vbFRpcC5zdXBlcmNsYXNzLmJlZm9yZURlc3Ry b3kuY2FsbCh0aGlzKX0sb25EZXN0cm95OmZ1bmN0aW9uKCl7RXh0LmdldERvYygp LnVuKCJtb3VzZWRvd24iLHRoaXMub25Eb2NNb3VzZURvd24sdGhpcyk7RXh0LlRv b2xUaXAuc3VwZXJjbGFzcy5vbkRlc3Ryb3kuY2FsbCh0aGlzKX19KTtFeHQucmVn KCJ0b29sdGlwIixFeHQuVG9vbFRpcCk7RXh0LlF1aWNrVGlwPUV4dC5leHRlbmQo RXh0LlRvb2xUaXAse2ludGVyY2VwdFRpdGxlczpmYWxzZSx0YWdDb25maWc6e25h bWVzcGFjZToiZXh0IixhdHRyaWJ1dGU6InF0aXAiLHdpZHRoOiJxd2lkdGgiLHRh cmdldDoidGFyZ2V0Iix0aXRsZToicXRpdGxlIixoaWRlOiJoaWRlIixjbHM6InFj bGFzcyIsYWxpZ246InFhbGlnbiIsYW5jaG9yOiJhbmNob3IifSxpbml0Q29tcG9u ZW50OmZ1bmN0aW9uKCl7dGhpcy50YXJnZXQ9dGhpcy50YXJnZXR8fEV4dC5nZXRE b2MoKTt0aGlzLnRhcmdldHM9dGhpcy50YXJnZXRzfHx7fTtFeHQuUXVpY2tUaXAu c3VwZXJjbGFzcy5pbml0Q29tcG9uZW50LmNhbGwodGhpcyl9LHJlZ2lzdGVyOmZ1 bmN0aW9uKGUpe3ZhciBoPUV4dC5pc0FycmF5KGUpP2U6YXJndW1lbnRzO2Zvcih2 YXIgZz0wLGE9aC5sZW5ndGg7ZzxhO2crKyl7dmFyIGw9aFtnXTt2YXIgaz1sLnRh cmdldDtpZihrKXtpZihFeHQuaXNBcnJheShrKSl7Zm9yKHZhciBkPTAsYj1rLmxl bmd0aDtkPGI7ZCsrKXt0aGlzLnRhcmdldHNbRXh0LmlkKGtbZF0pXT1sfX1lbHNl e3RoaXMudGFyZ2V0c1tFeHQuaWQoayldPWx9fX19LHVucmVnaXN0ZXI6ZnVuY3Rp b24oYSl7ZGVsZXRlIHRoaXMudGFyZ2V0c1tFeHQuaWQoYSldfSxjYW5jZWxTaG93 OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWN0aXZlVGFyZ2V0O2I9RXh0LmdldChi KS5kb207aWYodGhpcy5pc1Zpc2libGUoKSl7aWYoYSYmYS5lbD09Yil7dGhpcy5o aWRlKCl9fWVsc2V7aWYoYSYmYS5lbD09Yil7dGhpcy5jbGVhclRpbWVyKCJzaG93 Iil9fX0sZ2V0VGlwQ2ZnOmZ1bmN0aW9uKGQpe3ZhciBiPWQuZ2V0VGFyZ2V0KCks YyxhO2lmKHRoaXMuaW50ZXJjZXB0VGl0bGVzJiZiLnRpdGxlJiZFeHQuaXNTdHJp bmcoYi50aXRsZSkpe2M9Yi50aXRsZTtiLnF0aXA9YztiLnJlbW92ZUF0dHJpYnV0 ZSgidGl0bGUiKTtkLnByZXZlbnREZWZhdWx0KCl9ZWxzZXthPXRoaXMudGFnQ29u ZmlnO2M9Yi5xdGlwfHxFeHQuZmx5KGIpLmdldEF0dHJpYnV0ZShhLmF0dHJpYnV0 ZSxhLm5hbWVzcGFjZSl9cmV0dXJuIGN9LG9uVGFyZ2V0T3ZlcjpmdW5jdGlvbihp KXtpZih0aGlzLmRpc2FibGVkKXtyZXR1cm59dGhpcy50YXJnZXRYWT1pLmdldFhZ KCk7dmFyIGM9aS5nZXRUYXJnZXQoKTtpZighY3x8Yy5ub2RlVHlwZSE9PTF8fGM9 PWRvY3VtZW50fHxjPT1kb2N1bWVudC5ib2R5KXtyZXR1cm59aWYodGhpcy5hY3Rp dmVUYXJnZXQmJigoYz09dGhpcy5hY3RpdmVUYXJnZXQuZWwpfHxFeHQuZmx5KHRo aXMuYWN0aXZlVGFyZ2V0LmVsKS5jb250YWlucyhjKSkpe3RoaXMuY2xlYXJUaW1l cigiaGlkZSIpO3RoaXMuc2hvdygpO3JldHVybn1pZihjJiZ0aGlzLnRhcmdldHNb Yy5pZF0pe3RoaXMuYWN0aXZlVGFyZ2V0PXRoaXMudGFyZ2V0c1tjLmlkXTt0aGlz LmFjdGl2ZVRhcmdldC5lbD1jO3RoaXMuYW5jaG9yPXRoaXMuYWN0aXZlVGFyZ2V0 LmFuY2hvcjtpZih0aGlzLmFuY2hvcil7dGhpcy5hbmNob3JUYXJnZXQ9Y310aGlz LmRlbGF5U2hvdygpO3JldHVybn12YXIgZyxoPUV4dC5mbHkoYyksYj10aGlzLnRh Z0NvbmZpZyxkPWIubmFtZXNwYWNlO2lmKGc9dGhpcy5nZXRUaXBDZmcoaSkpe3Zh ciBhPWguZ2V0QXR0cmlidXRlKGIuaGlkZSxkKTt0aGlzLmFjdGl2ZVRhcmdldD17 ZWw6Yyx0ZXh0Omcsd2lkdGg6aC5nZXRBdHRyaWJ1dGUoYi53aWR0aCxkKSxhdXRv SGlkZTphIT0idXNlciImJmEhPT0iZmFsc2UiLHRpdGxlOmguZ2V0QXR0cmlidXRl KGIudGl0bGUsZCksY2xzOmguZ2V0QXR0cmlidXRlKGIuY2xzLGQpLGFsaWduOmgu Z2V0QXR0cmlidXRlKGIuYWxpZ24sZCl9O3RoaXMuYW5jaG9yPWguZ2V0QXR0cmli dXRlKGIuYW5jaG9yLGQpO2lmKHRoaXMuYW5jaG9yKXt0aGlzLmFuY2hvclRhcmdl dD1jfXRoaXMuZGVsYXlTaG93KCl9fSxvblRhcmdldE91dDpmdW5jdGlvbihhKXtp Zih0aGlzLmFjdGl2ZVRhcmdldCYmYS53aXRoaW4odGhpcy5hY3RpdmVUYXJnZXQu ZWwpJiYhdGhpcy5nZXRUaXBDZmcoYSkpe3JldHVybn10aGlzLmNsZWFyVGltZXIo InNob3ciKTtpZih0aGlzLmF1dG9IaWRlIT09ZmFsc2Upe3RoaXMuZGVsYXlIaWRl KCl9fSxzaG93QXQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5hY3RpdmVUYXJnZXQ7 aWYoYSl7aWYoIXRoaXMucmVuZGVyZWQpe3RoaXMucmVuZGVyKEV4dC5nZXRCb2R5 KCkpO3RoaXMuYWN0aXZlVGFyZ2V0PWF9aWYoYS53aWR0aCl7dGhpcy5zZXRXaWR0 aChhLndpZHRoKTt0aGlzLmJvZHkuc2V0V2lkdGgodGhpcy5hZGp1c3RCb2R5V2lk dGgoYS53aWR0aC10aGlzLmdldEZyYW1lV2lkdGgoKSkpO3RoaXMubWVhc3VyZVdp ZHRoPWZhbHNlfWVsc2V7dGhpcy5tZWFzdXJlV2lkdGg9dHJ1ZX10aGlzLnNldFRp dGxlKGEudGl0bGV8fCIiKTt0aGlzLmJvZHkudXBkYXRlKGEudGV4dCk7dGhpcy5h dXRvSGlkZT1hLmF1dG9IaWRlO3RoaXMuZGlzbWlzc0RlbGF5PWEuZGlzbWlzc0Rl bGF5fHx0aGlzLmRpc21pc3NEZWxheTtpZih0aGlzLmxhc3RDbHMpe3RoaXMuZWwu cmVtb3ZlQ2xhc3ModGhpcy5sYXN0Q2xzKTtkZWxldGUgdGhpcy5sYXN0Q2xzfWlm KGEuY2xzKXt0aGlzLmVsLmFkZENsYXNzKGEuY2xzKTt0aGlzLmxhc3RDbHM9YS5j bHN9aWYodGhpcy5hbmNob3Ipe3RoaXMuY29uc3RyYWluUG9zaXRpb249ZmFsc2V9 ZWxzZXtpZihhLmFsaWduKXtiPXRoaXMuZWwuZ2V0QWxpZ25Ub1hZKGEuZWwsYS5h bGlnbik7dGhpcy5jb25zdHJhaW5Qb3NpdGlvbj1mYWxzZX1lbHNle3RoaXMuY29u c3RyYWluUG9zaXRpb249dHJ1ZX19fUV4dC5RdWlja1RpcC5zdXBlcmNsYXNzLnNo b3dBdC5jYWxsKHRoaXMsYil9LGhpZGU6ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5h Y3RpdmVUYXJnZXQ7RXh0LlF1aWNrVGlwLnN1cGVyY2xhc3MuaGlkZS5jYWxsKHRo aXMpfX0pO0V4dC5yZWcoInF1aWNrdGlwIixFeHQuUXVpY2tUaXApO0V4dC5RdWlj a1RpcHM9ZnVuY3Rpb24oKXt2YXIgYixhPWZhbHNlO3JldHVybntpbml0OmZ1bmN0 aW9uKGMpe2lmKCFiKXtpZighRXh0LmlzUmVhZHkpe0V4dC5vblJlYWR5KGZ1bmN0 aW9uKCl7RXh0LlF1aWNrVGlwcy5pbml0KGMpfSk7cmV0dXJufWI9bmV3IEV4dC5R dWlja1RpcCh7ZWxlbWVudHM6ImhlYWRlcixib2R5IixkaXNhYmxlZDphfSk7aWYo YyE9PWZhbHNlKXtiLnJlbmRlcihFeHQuZ2V0Qm9keSgpKX19fSxkZERpc2FibGU6 ZnVuY3Rpb24oKXtpZihiJiYhYSl7Yi5kaXNhYmxlKCl9fSxkZEVuYWJsZTpmdW5j dGlvbigpe2lmKGImJiFhKXtiLmVuYWJsZSgpfX0sZW5hYmxlOmZ1bmN0aW9uKCl7 aWYoYil7Yi5lbmFibGUoKX1hPWZhbHNlfSxkaXNhYmxlOmZ1bmN0aW9uKCl7aWYo Yil7Yi5kaXNhYmxlKCl9YT10cnVlfSxpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1 cm4gYiE9PXVuZGVmaW5lZCYmIWIuZGlzYWJsZWR9LGdldFF1aWNrVGlwOmZ1bmN0 aW9uKCl7cmV0dXJuIGJ9LHJlZ2lzdGVyOmZ1bmN0aW9uKCl7Yi5yZWdpc3Rlci5h cHBseShiLGFyZ3VtZW50cyl9LHVucmVnaXN0ZXI6ZnVuY3Rpb24oKXtiLnVucmVn aXN0ZXIuYXBwbHkoYixhcmd1bWVudHMpfSx0aXBzOmZ1bmN0aW9uKCl7Yi5yZWdp c3Rlci5hcHBseShiLGFyZ3VtZW50cyl9fX0oKTtFeHQuc2xpZGVyLlRpcD1FeHQu ZXh0ZW5kKEV4dC5UaXAse21pbldpZHRoOjEwLG9mZnNldHM6WzAsLTEwXSxpbml0 OmZ1bmN0aW9uKGEpe2Eub24oe3Njb3BlOnRoaXMsZHJhZ3N0YXJ0OnRoaXMub25T bGlkZSxkcmFnOnRoaXMub25TbGlkZSxkcmFnZW5kOnRoaXMuaGlkZSxkZXN0cm95 OnRoaXMuZGVzdHJveX0pfSxvblNsaWRlOmZ1bmN0aW9uKGIsYyxhKXt0aGlzLnNo b3coKTt0aGlzLmJvZHkudXBkYXRlKHRoaXMuZ2V0VGV4dChhKSk7dGhpcy5kb0F1 dG9XaWR0aCgpO3RoaXMuZWwuYWxpZ25UbyhhLmVsLCJiLXQ/Iix0aGlzLm9mZnNl dHMpfSxnZXRUZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYS52YWx1ZSl9 fSk7RXh0LnV4LlNsaWRlclRpcD1FeHQuc2xpZGVyLlRpcDtFeHQudHJlZS5UcmVl UGFuZWw9RXh0LmV4dGVuZChFeHQuUGFuZWwse3Jvb3RWaXNpYmxlOnRydWUsYW5p bWF0ZTpFeHQuZW5hYmxlRngsbGluZXM6dHJ1ZSxlbmFibGVERDpmYWxzZSxobERy b3A6RXh0LmVuYWJsZUZ4LHBhdGhTZXBhcmF0b3I6Ii8iLGJ1YmJsZUV2ZW50czpb XSxpbml0Q29tcG9uZW50OmZ1bmN0aW9uKCl7RXh0LnRyZWUuVHJlZVBhbmVsLnN1 cGVyY2xhc3MuaW5pdENvbXBvbmVudC5jYWxsKHRoaXMpO2lmKCF0aGlzLmV2ZW50 TW9kZWwpe3RoaXMuZXZlbnRNb2RlbD1uZXcgRXh0LnRyZWUuVHJlZUV2ZW50TW9k ZWwodGhpcyl9dmFyIGE9dGhpcy5sb2FkZXI7aWYoIWEpe2E9bmV3IEV4dC50cmVl LlRyZWVMb2FkZXIoe2RhdGFVcmw6dGhpcy5kYXRhVXJsLHJlcXVlc3RNZXRob2Q6 dGhpcy5yZXF1ZXN0TWV0aG9kfSl9ZWxzZXtpZihFeHQuaXNPYmplY3QoYSkmJiFh LmxvYWQpe2E9bmV3IEV4dC50cmVlLlRyZWVMb2FkZXIoYSl9fXRoaXMubG9hZGVy PWE7dGhpcy5ub2RlSGFzaD17fTtpZih0aGlzLnJvb3Qpe3ZhciBiPXRoaXMucm9v dDtkZWxldGUgdGhpcy5yb290O3RoaXMuc2V0Um9vdE5vZGUoYil9dGhpcy5hZGRF dmVudHMoImFwcGVuZCIsInJlbW92ZSIsIm1vdmVub2RlIiwiaW5zZXJ0IiwiYmVm b3JlYXBwZW5kIiwiYmVmb3JlcmVtb3ZlIiwiYmVmb3JlbW92ZW5vZGUiLCJiZWZv cmVpbnNlcnQiLCJiZWZvcmVsb2FkIiwibG9hZCIsInRleHRjaGFuZ2UiLCJiZWZv cmVleHBhbmRub2RlIiwiYmVmb3JlY29sbGFwc2Vub2RlIiwiZXhwYW5kbm9kZSIs ImRpc2FibGVkY2hhbmdlIiwiY29sbGFwc2Vub2RlIiwiYmVmb3JlY2xpY2siLCJj bGljayIsImNvbnRhaW5lcmNsaWNrIiwiY2hlY2tjaGFuZ2UiLCJiZWZvcmVkYmxj bGljayIsImRibGNsaWNrIiwiY29udGFpbmVyZGJsY2xpY2siLCJjb250ZXh0bWVu dSIsImNvbnRhaW5lcmNvbnRleHRtZW51IiwiYmVmb3JlY2hpbGRyZW5yZW5kZXJl ZCIsInN0YXJ0ZHJhZyIsImVuZGRyYWciLCJkcmFnZHJvcCIsImJlZm9yZW5vZGVk cm9wIiwibm9kZWRyb3AiLCJub2RlZHJhZ292ZXIiKTtpZih0aGlzLnNpbmdsZUV4 cGFuZCl7dGhpcy5vbigiYmVmb3JlZXhwYW5kbm9kZSIsdGhpcy5yZXN0cmljdEV4 cGFuZCx0aGlzKX19LHByb3h5Tm9kZUV2ZW50OmZ1bmN0aW9uKGMsYixhLGgsZyxl LGQpe2lmKGM9PSJjb2xsYXBzZSJ8fGM9PSJleHBhbmQifHxjPT0iYmVmb3JlY29s bGFwc2UifHxjPT0iYmVmb3JlZXhwYW5kInx8Yz09Im1vdmUifHxjPT0iYmVmb3Jl bW92ZSIpe2M9Yysibm9kZSJ9cmV0dXJuIHRoaXMuZmlyZUV2ZW50KGMsYixhLGgs ZyxlLGQpfSxnZXRSb290Tm9kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJvb3R9 LHNldFJvb3ROb2RlOmZ1bmN0aW9uKGIpe3RoaXMuZGVzdHJveVJvb3QoKTtpZigh Yi5yZW5kZXIpe2I9dGhpcy5sb2FkZXIuY3JlYXRlTm9kZShiKX10aGlzLnJvb3Q9 YjtiLm93bmVyVHJlZT10aGlzO2IuaXNSb290PXRydWU7dGhpcy5yZWdpc3Rlck5v ZGUoYik7aWYoIXRoaXMucm9vdFZpc2libGUpe3ZhciBhPWIuYXR0cmlidXRlcy51 aVByb3ZpZGVyO2IudWk9YT9uZXcgYShiKTpuZXcgRXh0LnRyZWUuUm9vdFRyZWVO b2RlVUkoYil9aWYodGhpcy5pbm5lckN0KXt0aGlzLmNsZWFySW5uZXJDdCgpO3Ro aXMucmVuZGVyUm9vdCgpfXJldHVybiBifSxjbGVhcklubmVyQ3Q6ZnVuY3Rpb24o KXt0aGlzLmlubmVyQ3QudXBkYXRlKCIiKX0scmVuZGVyUm9vdDpmdW5jdGlvbigp e3RoaXMucm9vdC5yZW5kZXIoKTtpZighdGhpcy5yb290VmlzaWJsZSl7dGhpcy5y b290LnJlbmRlckNoaWxkcmVuKCl9fSxnZXROb2RlQnlJZDpmdW5jdGlvbihhKXty ZXR1cm4gdGhpcy5ub2RlSGFzaFthXX0scmVnaXN0ZXJOb2RlOmZ1bmN0aW9uKGEp e3RoaXMubm9kZUhhc2hbYS5pZF09YX0sdW5yZWdpc3Rlck5vZGU6ZnVuY3Rpb24o YSl7ZGVsZXRlIHRoaXMubm9kZUhhc2hbYS5pZF19LHRvU3RyaW5nOmZ1bmN0aW9u KCl7cmV0dXJuIltUcmVlIisodGhpcy5pZD8iICIrdGhpcy5pZDoiIikrIl0ifSxy ZXN0cmljdEV4cGFuZDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7aWYo Yil7aWYoYi5leHBhbmRlZENoaWxkJiZiLmV4cGFuZGVkQ2hpbGQucGFyZW50Tm9k ZT09Yil7Yi5leHBhbmRlZENoaWxkLmNvbGxhcHNlKCl9Yi5leHBhbmRlZENoaWxk PWF9fSxnZXRDaGVja2VkOmZ1bmN0aW9uKGIsYyl7Yz1jfHx0aGlzLnJvb3Q7dmFy IGQ9W107dmFyIGU9ZnVuY3Rpb24oKXtpZih0aGlzLmF0dHJpYnV0ZXMuY2hlY2tl ZCl7ZC5wdXNoKCFiP3RoaXM6KGI9PSJpZCI/dGhpcy5pZDp0aGlzLmF0dHJpYnV0 ZXNbYl0pKX19O2MuY2FzY2FkZShlKTtyZXR1cm4gZH0sZ2V0TG9hZGVyOmZ1bmN0 aW9uKCl7cmV0dXJuIHRoaXMubG9hZGVyfSxleHBhbmRBbGw6ZnVuY3Rpb24oKXt0 aGlzLnJvb3QuZXhwYW5kKHRydWUpfSxjb2xsYXBzZUFsbDpmdW5jdGlvbigpe3Ro aXMucm9vdC5jb2xsYXBzZSh0cnVlKX0sZ2V0U2VsZWN0aW9uTW9kZWw6ZnVuY3Rp b24oKXtpZighdGhpcy5zZWxNb2RlbCl7dGhpcy5zZWxNb2RlbD1uZXcgRXh0LnRy ZWUuRGVmYXVsdFNlbGVjdGlvbk1vZGVsKCl9cmV0dXJuIHRoaXMuc2VsTW9kZWx9 LGV4cGFuZFBhdGg6ZnVuY3Rpb24oZyxhLGgpe2lmKEV4dC5pc0VtcHR5KGcpKXtp ZihoKXtoKGZhbHNlLHVuZGVmaW5lZCl9cmV0dXJufWE9YXx8ImlkIjt2YXIgZD1n LnNwbGl0KHRoaXMucGF0aFNlcGFyYXRvcik7dmFyIGM9dGhpcy5yb290O2lmKGMu YXR0cmlidXRlc1thXSE9ZFsxXSl7aWYoaCl7aChmYWxzZSxudWxsKX1yZXR1cm59 dmFyIGI9MTt2YXIgZT1mdW5jdGlvbigpe2lmKCsrYj09ZC5sZW5ndGgpe2lmKGgp e2godHJ1ZSxjKX1yZXR1cm59dmFyIGk9Yy5maW5kQ2hpbGQoYSxkW2JdKTtpZigh aSl7aWYoaCl7aChmYWxzZSxjKX1yZXR1cm59Yz1pO2kuZXhwYW5kKGZhbHNlLGZh bHNlLGUpfTtjLmV4cGFuZChmYWxzZSxmYWxzZSxlKX0sc2VsZWN0UGF0aDpmdW5j dGlvbihlLGEsZyl7aWYoRXh0LmlzRW1wdHkoZSkpe2lmKGcpe2coZmFsc2UsdW5k ZWZpbmVkKX1yZXR1cm59YT1hfHwiaWQiO3ZhciBjPWUuc3BsaXQodGhpcy5wYXRo U2VwYXJhdG9yKSxiPWMucG9wKCk7aWYoYy5sZW5ndGg+MSl7dmFyIGQ9ZnVuY3Rp b24oaSxoKXtpZihpJiZoKXt2YXIgaj1oLmZpbmRDaGlsZChhLGIpO2lmKGope2ou c2VsZWN0KCk7aWYoZyl7Zyh0cnVlLGopfX1lbHNle2lmKGcpe2coZmFsc2Usail9 fX1lbHNle2lmKGcpe2coZmFsc2Usail9fX07dGhpcy5leHBhbmRQYXRoKGMuam9p bih0aGlzLnBhdGhTZXBhcmF0b3IpLGEsZCl9ZWxzZXt0aGlzLnJvb3Quc2VsZWN0 KCk7aWYoZyl7Zyh0cnVlLHRoaXMucm9vdCl9fX0sZ2V0VHJlZUVsOmZ1bmN0aW9u KCl7cmV0dXJuIHRoaXMuYm9keX0sb25SZW5kZXI6ZnVuY3Rpb24oYixhKXtFeHQu dHJlZS5UcmVlUGFuZWwuc3VwZXJjbGFzcy5vblJlbmRlci5jYWxsKHRoaXMsYixh KTt0aGlzLmVsLmFkZENsYXNzKCJ4LXRyZWUiKTt0aGlzLmlubmVyQ3Q9dGhpcy5i b2R5LmNyZWF0ZUNoaWxkKHt0YWc6InVsIixjbHM6IngtdHJlZS1yb290LWN0ICIr KHRoaXMudXNlQXJyb3dzPyJ4LXRyZWUtYXJyb3dzIjp0aGlzLmxpbmVzPyJ4LXRy ZWUtbGluZXMiOiJ4LXRyZWUtbm8tbGluZXMiKX0pfSxpbml0RXZlbnRzOmZ1bmN0 aW9uKCl7RXh0LnRyZWUuVHJlZVBhbmVsLnN1cGVyY2xhc3MuaW5pdEV2ZW50cy5j YWxsKHRoaXMpO2lmKHRoaXMuY29udGFpbmVyU2Nyb2xsKXtFeHQuZGQuU2Nyb2xs TWFuYWdlci5yZWdpc3Rlcih0aGlzLmJvZHkpfWlmKCh0aGlzLmVuYWJsZUREfHx0 aGlzLmVuYWJsZURyb3ApJiYhdGhpcy5kcm9wWm9uZSl7dGhpcy5kcm9wWm9uZT1u ZXcgRXh0LnRyZWUuVHJlZURyb3Bab25lKHRoaXMsdGhpcy5kcm9wQ29uZmlnfHx7 ZGRHcm91cDp0aGlzLmRkR3JvdXB8fCJUcmVlREQiLGFwcGVuZE9ubHk6dGhpcy5k ZEFwcGVuZE9ubHk9PT10cnVlfSl9aWYoKHRoaXMuZW5hYmxlRER8fHRoaXMuZW5h YmxlRHJhZykmJiF0aGlzLmRyYWdab25lKXt0aGlzLmRyYWdab25lPW5ldyBFeHQu dHJlZS5UcmVlRHJhZ1pvbmUodGhpcyx0aGlzLmRyYWdDb25maWd8fHtkZEdyb3Vw OnRoaXMuZGRHcm91cHx8IlRyZWVERCIsc2Nyb2xsOnRoaXMuZGRTY3JvbGx9KX10 aGlzLmdldFNlbGVjdGlvbk1vZGVsKCkuaW5pdCh0aGlzKX0sYWZ0ZXJSZW5kZXI6 ZnVuY3Rpb24oKXtFeHQudHJlZS5UcmVlUGFuZWwuc3VwZXJjbGFzcy5hZnRlclJl bmRlci5jYWxsKHRoaXMpO3RoaXMucmVuZGVyUm9vdCgpfSxiZWZvcmVEZXN0cm95 OmZ1bmN0aW9uKCl7aWYodGhpcy5yZW5kZXJlZCl7RXh0LmRkLlNjcm9sbE1hbmFn ZXIudW5yZWdpc3Rlcih0aGlzLmJvZHkpO0V4dC5kZXN0cm95KHRoaXMuZHJvcFpv bmUsdGhpcy5kcmFnWm9uZSl9dGhpcy5kZXN0cm95Um9vdCgpO0V4dC5kZXN0cm95 KHRoaXMubG9hZGVyKTt0aGlzLm5vZGVIYXNoPXRoaXMucm9vdD10aGlzLmxvYWRl cj1udWxsO0V4dC50cmVlLlRyZWVQYW5lbC5zdXBlcmNsYXNzLmJlZm9yZURlc3Ry b3kuY2FsbCh0aGlzKX0sZGVzdHJveVJvb3Q6ZnVuY3Rpb24oKXtpZih0aGlzLnJv b3QmJnRoaXMucm9vdC5kZXN0cm95KXt0aGlzLnJvb3QuZGVzdHJveSh0cnVlKX19 fSk7RXh0LnRyZWUuVHJlZVBhbmVsLm5vZGVUeXBlcz17fTtFeHQucmVnKCJ0cmVl cGFuZWwiLEV4dC50cmVlLlRyZWVQYW5lbCk7RXh0LnRyZWUuVHJlZUV2ZW50TW9k ZWw9ZnVuY3Rpb24oYSl7dGhpcy50cmVlPWE7dGhpcy50cmVlLm9uKCJyZW5kZXIi LHRoaXMuaW5pdEV2ZW50cyx0aGlzKX07RXh0LnRyZWUuVHJlZUV2ZW50TW9kZWwu cHJvdG90eXBlPXtpbml0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50cmVl O2lmKGEudHJhY2tNb3VzZU92ZXIhPT1mYWxzZSl7YS5tb24oYS5pbm5lckN0LHtz Y29wZTp0aGlzLG1vdXNlb3Zlcjp0aGlzLmRlbGVnYXRlT3Zlcixtb3VzZW91dDp0 aGlzLmRlbGVnYXRlT3V0fSl9YS5tb24oYS5nZXRUcmVlRWwoKSx7c2NvcGU6dGhp cyxjbGljazp0aGlzLmRlbGVnYXRlQ2xpY2ssZGJsY2xpY2s6dGhpcy5kZWxlZ2F0 ZURibENsaWNrLGNvbnRleHRtZW51OnRoaXMuZGVsZWdhdGVDb250ZXh0TWVudX0p fSxnZXROb2RlOmZ1bmN0aW9uKGIpe3ZhciBhO2lmKGE9Yi5nZXRUYXJnZXQoIi54 LXRyZWUtbm9kZS1lbCIsMTApKXt2YXIgYz1FeHQuZmx5KGEsIl90cmVlRXZlbnRz IikuZ2V0QXR0cmlidXRlKCJ0cmVlLW5vZGUtaWQiLCJleHQiKTtpZihjKXtyZXR1 cm4gdGhpcy50cmVlLmdldE5vZGVCeUlkKGMpfX1yZXR1cm4gbnVsbH0sZ2V0Tm9k ZVRhcmdldDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFRhcmdldCgiLngtdHJlZS1u b2RlLWljb24iLDEpO2lmKCFhKXthPWIuZ2V0VGFyZ2V0KCIueC10cmVlLW5vZGUt ZWwiLDYpfXJldHVybiBhfSxkZWxlZ2F0ZU91dDpmdW5jdGlvbihiLGEpe2lmKCF0 aGlzLmJlZm9yZUV2ZW50KGIpKXtyZXR1cm59aWYoYi5nZXRUYXJnZXQoIi54LXRy ZWUtZWMtaWNvbiIsMSkpe3ZhciBjPXRoaXMuZ2V0Tm9kZShiKTt0aGlzLm9uSWNv bk91dChiLGMpO2lmKGM9PXRoaXMubGFzdEVjT3Zlcil7ZGVsZXRlIHRoaXMubGFz dEVjT3Zlcn19aWYoKGE9dGhpcy5nZXROb2RlVGFyZ2V0KGIpKSYmIWIud2l0aGlu KGEsdHJ1ZSkpe3RoaXMub25Ob2RlT3V0KGIsdGhpcy5nZXROb2RlKGIpKX19LGRl bGVnYXRlT3ZlcjpmdW5jdGlvbihiLGEpe2lmKCF0aGlzLmJlZm9yZUV2ZW50KGIp KXtyZXR1cm59aWYoRXh0LmlzR2Vja28mJiF0aGlzLnRyYWNraW5nRG9jKXtFeHQu Z2V0Qm9keSgpLm9uKCJtb3VzZW92ZXIiLHRoaXMudHJhY2tFeGl0LHRoaXMpO3Ro aXMudHJhY2tpbmdEb2M9dHJ1ZX1pZih0aGlzLmxhc3RFY092ZXIpe3RoaXMub25J Y29uT3V0KGIsdGhpcy5sYXN0RWNPdmVyKTtkZWxldGUgdGhpcy5sYXN0RWNPdmVy fWlmKGIuZ2V0VGFyZ2V0KCIueC10cmVlLWVjLWljb24iLDEpKXt0aGlzLmxhc3RF Y092ZXI9dGhpcy5nZXROb2RlKGIpO3RoaXMub25JY29uT3ZlcihiLHRoaXMubGFz dEVjT3Zlcil9aWYoYT10aGlzLmdldE5vZGVUYXJnZXQoYikpe3RoaXMub25Ob2Rl T3ZlcihiLHRoaXMuZ2V0Tm9kZShiKSl9fSx0cmFja0V4aXQ6ZnVuY3Rpb24oYSl7 aWYodGhpcy5sYXN0T3Zlck5vZGUpe2lmKHRoaXMubGFzdE92ZXJOb2RlLnVpJiYh YS53aXRoaW4odGhpcy5sYXN0T3Zlck5vZGUudWkuZ2V0RWwoKSkpe3RoaXMub25O b2RlT3V0KGEsdGhpcy5sYXN0T3Zlck5vZGUpfWRlbGV0ZSB0aGlzLmxhc3RPdmVy Tm9kZTtFeHQuZ2V0Qm9keSgpLnVuKCJtb3VzZW92ZXIiLHRoaXMudHJhY2tFeGl0 LHRoaXMpO3RoaXMudHJhY2tpbmdEb2M9ZmFsc2V9fSxkZWxlZ2F0ZUNsaWNrOmZ1 bmN0aW9uKGIsYSl7aWYodGhpcy5iZWZvcmVFdmVudChiKSl7aWYoYi5nZXRUYXJn ZXQoImlucHV0W3R5cGU9Y2hlY2tib3hdIiwxKSl7dGhpcy5vbkNoZWNrYm94Q2xp Y2soYix0aGlzLmdldE5vZGUoYikpfWVsc2V7aWYoYi5nZXRUYXJnZXQoIi54LXRy ZWUtZWMtaWNvbiIsMSkpe3RoaXMub25JY29uQ2xpY2soYix0aGlzLmdldE5vZGUo YikpfWVsc2V7aWYodGhpcy5nZXROb2RlVGFyZ2V0KGIpKXt0aGlzLm9uTm9kZUNs aWNrKGIsdGhpcy5nZXROb2RlKGIpKX19fX1lbHNle3RoaXMuY2hlY2tDb250YWlu ZXJFdmVudChiLCJjbGljayIpfX0sZGVsZWdhdGVEYmxDbGljazpmdW5jdGlvbihi LGEpe2lmKHRoaXMuYmVmb3JlRXZlbnQoYikpe2lmKHRoaXMuZ2V0Tm9kZVRhcmdl dChiKSl7dGhpcy5vbk5vZGVEYmxDbGljayhiLHRoaXMuZ2V0Tm9kZShiKSl9fWVs c2V7dGhpcy5jaGVja0NvbnRhaW5lckV2ZW50KGIsImRibGNsaWNrIil9fSxkZWxl Z2F0ZUNvbnRleHRNZW51OmZ1bmN0aW9uKGIsYSl7aWYodGhpcy5iZWZvcmVFdmVu dChiKSl7aWYodGhpcy5nZXROb2RlVGFyZ2V0KGIpKXt0aGlzLm9uTm9kZUNvbnRl eHRNZW51KGIsdGhpcy5nZXROb2RlKGIpKX19ZWxzZXt0aGlzLmNoZWNrQ29udGFp bmVyRXZlbnQoYiwiY29udGV4dG1lbnUiKX19LGNoZWNrQ29udGFpbmVyRXZlbnQ6 ZnVuY3Rpb24oYixhKXtpZih0aGlzLmRpc2FibGVkKXtiLnN0b3BFdmVudCgpO3Jl dHVybiBmYWxzZX10aGlzLm9uQ29udGFpbmVyRXZlbnQoYixhKX0sb25Db250YWlu ZXJFdmVudDpmdW5jdGlvbihiLGEpe3RoaXMudHJlZS5maXJlRXZlbnQoImNvbnRh aW5lciIrYSx0aGlzLnRyZWUsYil9LG9uTm9kZUNsaWNrOmZ1bmN0aW9uKGIsYSl7 YS51aS5vbkNsaWNrKGIpfSxvbk5vZGVPdmVyOmZ1bmN0aW9uKGIsYSl7dGhpcy5s YXN0T3Zlck5vZGU9YTthLnVpLm9uT3ZlcihiKX0sb25Ob2RlT3V0OmZ1bmN0aW9u KGIsYSl7YS51aS5vbk91dChiKX0sb25JY29uT3ZlcjpmdW5jdGlvbihiLGEpe2Eu dWkuYWRkQ2xhc3MoIngtdHJlZS1lYy1vdmVyIil9LG9uSWNvbk91dDpmdW5jdGlv bihiLGEpe2EudWkucmVtb3ZlQ2xhc3MoIngtdHJlZS1lYy1vdmVyIil9LG9uSWNv bkNsaWNrOmZ1bmN0aW9uKGIsYSl7YS51aS5lY0NsaWNrKGIpfSxvbkNoZWNrYm94 Q2xpY2s6ZnVuY3Rpb24oYixhKXthLnVpLm9uQ2hlY2tDaGFuZ2UoYil9LG9uTm9k ZURibENsaWNrOmZ1bmN0aW9uKGIsYSl7YS51aS5vbkRibENsaWNrKGIpfSxvbk5v ZGVDb250ZXh0TWVudTpmdW5jdGlvbihiLGEpe2EudWkub25Db250ZXh0TWVudShi KX0sYmVmb3JlRXZlbnQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXROb2RlKGIp O2lmKHRoaXMuZGlzYWJsZWR8fCFhfHwhYS51aSl7Yi5zdG9wRXZlbnQoKTtyZXR1 cm4gZmFsc2V9cmV0dXJuIHRydWV9LGRpc2FibGU6ZnVuY3Rpb24oKXt0aGlzLmRp c2FibGVkPXRydWV9LGVuYWJsZTpmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWQ9ZmFs c2V9fTtFeHQudHJlZS5EZWZhdWx0U2VsZWN0aW9uTW9kZWw9RXh0LmV4dGVuZChF eHQudXRpbC5PYnNlcnZhYmxlLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlz LnNlbE5vZGU9bnVsbDt0aGlzLmFkZEV2ZW50cygic2VsZWN0aW9uY2hhbmdlIiwi YmVmb3Jlc2VsZWN0Iik7RXh0LmFwcGx5KHRoaXMsYSk7RXh0LnRyZWUuRGVmYXVs dFNlbGVjdGlvbk1vZGVsLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlz KX0saW5pdDpmdW5jdGlvbihhKXt0aGlzLnRyZWU9YTthLm1vbihhLmdldFRyZWVF bCgpLCJrZXlkb3duIix0aGlzLm9uS2V5RG93bix0aGlzKTthLm9uKCJjbGljayIs dGhpcy5vbk5vZGVDbGljayx0aGlzKX0sb25Ob2RlQ2xpY2s6ZnVuY3Rpb24oYSxi KXt0aGlzLnNlbGVjdChhKX0sc2VsZWN0OmZ1bmN0aW9uKGMsYSl7aWYoIUV4dC5m bHkoYy51aS53cmFwKS5pc1Zpc2libGUoKSYmYSl7cmV0dXJuIGEuY2FsbCh0aGlz LGMpfXZhciBiPXRoaXMuc2VsTm9kZTtpZihjPT1iKXtjLnVpLm9uU2VsZWN0ZWRD aGFuZ2UodHJ1ZSl9ZWxzZXtpZih0aGlzLmZpcmVFdmVudCgiYmVmb3Jlc2VsZWN0 Iix0aGlzLGMsYikhPT1mYWxzZSl7aWYoYiYmYi51aSl7Yi51aS5vblNlbGVjdGVk Q2hhbmdlKGZhbHNlKX10aGlzLnNlbE5vZGU9YztjLnVpLm9uU2VsZWN0ZWRDaGFu Z2UodHJ1ZSk7dGhpcy5maXJlRXZlbnQoInNlbGVjdGlvbmNoYW5nZSIsdGhpcyxj LGIpfX1yZXR1cm4gY30sdW5zZWxlY3Q6ZnVuY3Rpb24oYixhKXtpZih0aGlzLnNl bE5vZGU9PWIpe3RoaXMuY2xlYXJTZWxlY3Rpb25zKGEpfX0sY2xlYXJTZWxlY3Rp b25zOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc2VsTm9kZTtpZihiKXtiLnVpLm9u U2VsZWN0ZWRDaGFuZ2UoZmFsc2UpO3RoaXMuc2VsTm9kZT1udWxsO2lmKGEhPT10 cnVlKXt0aGlzLmZpcmVFdmVudCgic2VsZWN0aW9uY2hhbmdlIix0aGlzLG51bGwp fX1yZXR1cm4gYn0sZ2V0U2VsZWN0ZWROb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRo aXMuc2VsTm9kZX0saXNTZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5z ZWxOb2RlPT1hfSxzZWxlY3RQcmV2aW91czpmdW5jdGlvbihhKXtpZighKGE9YXx8 dGhpcy5zZWxOb2RlfHx0aGlzLmxhc3RTZWxOb2RlKSl7cmV0dXJuIG51bGx9dmFy IGM9YS5wcmV2aW91c1NpYmxpbmc7aWYoYyl7aWYoIWMuaXNFeHBhbmRlZCgpfHxj LmNoaWxkTm9kZXMubGVuZ3RoPDEpe3JldHVybiB0aGlzLnNlbGVjdChjLHRoaXMu c2VsZWN0UHJldmlvdXMpfWVsc2V7dmFyIGI9Yy5sYXN0Q2hpbGQ7d2hpbGUoYiYm Yi5pc0V4cGFuZGVkKCkmJkV4dC5mbHkoYi51aS53cmFwKS5pc1Zpc2libGUoKSYm Yi5jaGlsZE5vZGVzLmxlbmd0aD4wKXtiPWIubGFzdENoaWxkfXJldHVybiB0aGlz LnNlbGVjdChiLHRoaXMuc2VsZWN0UHJldmlvdXMpfX1lbHNle2lmKGEucGFyZW50 Tm9kZSYmKHRoaXMudHJlZS5yb290VmlzaWJsZXx8IWEucGFyZW50Tm9kZS5pc1Jv b3QpKXtyZXR1cm4gdGhpcy5zZWxlY3QoYS5wYXJlbnROb2RlLHRoaXMuc2VsZWN0 UHJldmlvdXMpfX1yZXR1cm4gbnVsbH0sc2VsZWN0TmV4dDpmdW5jdGlvbihiKXtp ZighKGI9Ynx8dGhpcy5zZWxOb2RlfHx0aGlzLmxhc3RTZWxOb2RlKSl7cmV0dXJu IG51bGx9aWYoYi5maXJzdENoaWxkJiZiLmlzRXhwYW5kZWQoKSYmRXh0LmZseShi LnVpLndyYXApLmlzVmlzaWJsZSgpKXtyZXR1cm4gdGhpcy5zZWxlY3QoYi5maXJz dENoaWxkLHRoaXMuc2VsZWN0TmV4dCl9ZWxzZXtpZihiLm5leHRTaWJsaW5nKXty ZXR1cm4gdGhpcy5zZWxlY3QoYi5uZXh0U2libGluZyx0aGlzLnNlbGVjdE5leHQp fWVsc2V7aWYoYi5wYXJlbnROb2RlKXt2YXIgYT1udWxsO2IucGFyZW50Tm9kZS5i dWJibGUoZnVuY3Rpb24oKXtpZih0aGlzLm5leHRTaWJsaW5nKXthPXRoaXMuZ2V0 T3duZXJUcmVlKCkuc2VsTW9kZWwuc2VsZWN0KHRoaXMubmV4dFNpYmxpbmcsdGhp cy5zZWxlY3ROZXh0KTtyZXR1cm4gZmFsc2V9fSk7cmV0dXJuIGF9fX1yZXR1cm4g bnVsbH0sb25LZXlEb3duOmZ1bmN0aW9uKGMpe3ZhciBiPXRoaXMuc2VsTm9kZXx8 dGhpcy5sYXN0U2VsTm9kZTt2YXIgZD10aGlzO2lmKCFiKXtyZXR1cm59dmFyIGE9 Yy5nZXRLZXkoKTtzd2l0Y2goYSl7Y2FzZSBjLkRPV046Yy5zdG9wRXZlbnQoKTt0 aGlzLnNlbGVjdE5leHQoKTticmVhaztjYXNlIGMuVVA6Yy5zdG9wRXZlbnQoKTt0 aGlzLnNlbGVjdFByZXZpb3VzKCk7YnJlYWs7Y2FzZSBjLlJJR0hUOmMucHJldmVu dERlZmF1bHQoKTtpZihiLmhhc0NoaWxkTm9kZXMoKSl7aWYoIWIuaXNFeHBhbmRl ZCgpKXtiLmV4cGFuZCgpfWVsc2V7aWYoYi5maXJzdENoaWxkKXt0aGlzLnNlbGVj dChiLmZpcnN0Q2hpbGQsYyl9fX1icmVhaztjYXNlIGMuTEVGVDpjLnByZXZlbnRE ZWZhdWx0KCk7aWYoYi5oYXNDaGlsZE5vZGVzKCkmJmIuaXNFeHBhbmRlZCgpKXti LmNvbGxhcHNlKCl9ZWxzZXtpZihiLnBhcmVudE5vZGUmJih0aGlzLnRyZWUucm9v dFZpc2libGV8fGIucGFyZW50Tm9kZSE9dGhpcy50cmVlLmdldFJvb3ROb2RlKCkp KXt0aGlzLnNlbGVjdChiLnBhcmVudE5vZGUsYyl9fWJyZWFrfX19KTtFeHQudHJl ZS5NdWx0aVNlbGVjdGlvbk1vZGVsPUV4dC5leHRlbmQoRXh0LnV0aWwuT2JzZXJ2 YWJsZSx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5zZWxOb2Rlcz1bXTt0 aGlzLnNlbE1hcD17fTt0aGlzLmFkZEV2ZW50cygic2VsZWN0aW9uY2hhbmdlIik7 RXh0LmFwcGx5KHRoaXMsYSk7RXh0LnRyZWUuTXVsdGlTZWxlY3Rpb25Nb2RlbC5z dXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyl9LGluaXQ6ZnVuY3Rpb24o YSl7dGhpcy50cmVlPWE7YS5tb24oYS5nZXRUcmVlRWwoKSwia2V5ZG93biIsdGhp cy5vbktleURvd24sdGhpcyk7YS5vbigiY2xpY2siLHRoaXMub25Ob2RlQ2xpY2ss dGhpcyl9LG9uTm9kZUNsaWNrOmZ1bmN0aW9uKGEsYil7aWYoYi5jdHJsS2V5JiZ0 aGlzLmlzU2VsZWN0ZWQoYSkpe3RoaXMudW5zZWxlY3QoYSl9ZWxzZXt0aGlzLnNl bGVjdChhLGIsYi5jdHJsS2V5KX19LHNlbGVjdDpmdW5jdGlvbihhLGMsYil7aWYo YiE9PXRydWUpe3RoaXMuY2xlYXJTZWxlY3Rpb25zKHRydWUpfWlmKHRoaXMuaXNT ZWxlY3RlZChhKSl7dGhpcy5sYXN0U2VsTm9kZT1hO3JldHVybiBhfXRoaXMuc2Vs Tm9kZXMucHVzaChhKTt0aGlzLnNlbE1hcFthLmlkXT1hO3RoaXMubGFzdFNlbE5v ZGU9YTthLnVpLm9uU2VsZWN0ZWRDaGFuZ2UodHJ1ZSk7dGhpcy5maXJlRXZlbnQo InNlbGVjdGlvbmNoYW5nZSIsdGhpcyx0aGlzLnNlbE5vZGVzKTtyZXR1cm4gYX0s dW5zZWxlY3Q6ZnVuY3Rpb24oYil7aWYodGhpcy5zZWxNYXBbYi5pZF0pe2IudWku b25TZWxlY3RlZENoYW5nZShmYWxzZSk7dmFyIGM9dGhpcy5zZWxOb2Rlczt2YXIg YT1jLmluZGV4T2YoYik7aWYoYSE9LTEpe3RoaXMuc2VsTm9kZXMuc3BsaWNlKGEs MSl9ZGVsZXRlIHRoaXMuc2VsTWFwW2IuaWRdO3RoaXMuZmlyZUV2ZW50KCJzZWxl Y3Rpb25jaGFuZ2UiLHRoaXMsdGhpcy5zZWxOb2Rlcyl9fSxjbGVhclNlbGVjdGlv bnM6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5zZWxOb2RlcztpZihkLmxlbmd0aD4w KXtmb3IodmFyIGM9MCxhPWQubGVuZ3RoO2M8YTtjKyspe2RbY10udWkub25TZWxl Y3RlZENoYW5nZShmYWxzZSl9dGhpcy5zZWxOb2Rlcz1bXTt0aGlzLnNlbE1hcD17 fTtpZihiIT09dHJ1ZSl7dGhpcy5maXJlRXZlbnQoInNlbGVjdGlvbmNoYW5nZSIs dGhpcyx0aGlzLnNlbE5vZGVzKX19fSxpc1NlbGVjdGVkOmZ1bmN0aW9uKGEpe3Jl dHVybiB0aGlzLnNlbE1hcFthLmlkXT90cnVlOmZhbHNlfSxnZXRTZWxlY3RlZE5v ZGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsTm9kZXMuY29uY2F0KFtdKX0s b25LZXlEb3duOkV4dC50cmVlLkRlZmF1bHRTZWxlY3Rpb25Nb2RlbC5wcm90b3R5 cGUub25LZXlEb3duLHNlbGVjdE5leHQ6RXh0LnRyZWUuRGVmYXVsdFNlbGVjdGlv bk1vZGVsLnByb3RvdHlwZS5zZWxlY3ROZXh0LHNlbGVjdFByZXZpb3VzOkV4dC50 cmVlLkRlZmF1bHRTZWxlY3Rpb25Nb2RlbC5wcm90b3R5cGUuc2VsZWN0UHJldmlv dXN9KTtFeHQuZGF0YS5UcmVlPUV4dC5leHRlbmQoRXh0LnV0aWwuT2JzZXJ2YWJs ZSx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5ub2RlSGFzaD17fTt0aGlz LnJvb3Q9bnVsbDtpZihhKXt0aGlzLnNldFJvb3ROb2RlKGEpfXRoaXMuYWRkRXZl bnRzKCJhcHBlbmQiLCJyZW1vdmUiLCJtb3ZlIiwiaW5zZXJ0IiwiYmVmb3JlYXBw ZW5kIiwiYmVmb3JlcmVtb3ZlIiwiYmVmb3JlbW92ZSIsImJlZm9yZWluc2VydCIp O0V4dC5kYXRhLlRyZWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMp fSxwYXRoU2VwYXJhdG9yOiIvIixwcm94eU5vZGVFdmVudDpmdW5jdGlvbigpe3Jl dHVybiB0aGlzLmZpcmVFdmVudC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGdldFJv b3ROb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm9vdH0sc2V0Um9vdE5vZGU6 ZnVuY3Rpb24oYSl7dGhpcy5yb290PWE7YS5vd25lclRyZWU9dGhpczthLmlzUm9v dD10cnVlO3RoaXMucmVnaXN0ZXJOb2RlKGEpO3JldHVybiBhfSxnZXROb2RlQnlJ ZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlSGFzaFthXX0scmVnaXN0ZXJO b2RlOmZ1bmN0aW9uKGEpe3RoaXMubm9kZUhhc2hbYS5pZF09YX0sdW5yZWdpc3Rl ck5vZGU6ZnVuY3Rpb24oYSl7ZGVsZXRlIHRoaXMubm9kZUhhc2hbYS5pZF19LHRv U3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIltUcmVlIisodGhpcy5pZD8iICIrdGhp cy5pZDoiIikrIl0ifX0pO0V4dC5kYXRhLk5vZGU9RXh0LmV4dGVuZChFeHQudXRp bC5PYnNlcnZhYmxlLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLmF0dHJp YnV0ZXM9YXx8e307dGhpcy5sZWFmPXRoaXMuYXR0cmlidXRlcy5sZWFmO3RoaXMu aWQ9dGhpcy5hdHRyaWJ1dGVzLmlkO2lmKCF0aGlzLmlkKXt0aGlzLmlkPUV4dC5p ZChudWxsLCJ4bm9kZS0iKTt0aGlzLmF0dHJpYnV0ZXMuaWQ9dGhpcy5pZH10aGlz LmNoaWxkTm9kZXM9W107dGhpcy5wYXJlbnROb2RlPW51bGw7dGhpcy5maXJzdENo aWxkPW51bGw7dGhpcy5sYXN0Q2hpbGQ9bnVsbDt0aGlzLnByZXZpb3VzU2libGlu Zz1udWxsO3RoaXMubmV4dFNpYmxpbmc9bnVsbDt0aGlzLmFkZEV2ZW50cyh7YXBw ZW5kOnRydWUscmVtb3ZlOnRydWUsbW92ZTp0cnVlLGluc2VydDp0cnVlLGJlZm9y ZWFwcGVuZDp0cnVlLGJlZm9yZXJlbW92ZTp0cnVlLGJlZm9yZW1vdmU6dHJ1ZSxi ZWZvcmVpbnNlcnQ6dHJ1ZX0pO3RoaXMubGlzdGVuZXJzPXRoaXMuYXR0cmlidXRl cy5saXN0ZW5lcnM7RXh0LmRhdGEuTm9kZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9y LmNhbGwodGhpcyl9LGZpcmVFdmVudDpmdW5jdGlvbihiKXtpZihFeHQuZGF0YS5O b2RlLnN1cGVyY2xhc3MuZmlyZUV2ZW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKT09 PWZhbHNlKXtyZXR1cm4gZmFsc2V9dmFyIGE9dGhpcy5nZXRPd25lclRyZWUoKTtp ZihhKXtpZihhLnByb3h5Tm9kZUV2ZW50LmFwcGx5KGEsYXJndW1lbnRzKT09PWZh bHNlKXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfSxpc0xlYWY6ZnVuY3Rpb24o KXtyZXR1cm4gdGhpcy5sZWFmPT09dHJ1ZX0sc2V0Rmlyc3RDaGlsZDpmdW5jdGlv bihhKXt0aGlzLmZpcnN0Q2hpbGQ9YX0sc2V0TGFzdENoaWxkOmZ1bmN0aW9uKGEp e3RoaXMubGFzdENoaWxkPWF9LGlzTGFzdDpmdW5jdGlvbigpe3JldHVybighdGhp cy5wYXJlbnROb2RlP3RydWU6dGhpcy5wYXJlbnROb2RlLmxhc3RDaGlsZD09dGhp cyl9LGlzRmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4oIXRoaXMucGFyZW50Tm9kZT90 cnVlOnRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkPT10aGlzKX0saGFzQ2hpbGRO b2RlczpmdW5jdGlvbigpe3JldHVybiAhdGhpcy5pc0xlYWYoKSYmdGhpcy5jaGls ZE5vZGVzLmxlbmd0aD4wfSxpc0V4cGFuZGFibGU6ZnVuY3Rpb24oKXtyZXR1cm4g dGhpcy5hdHRyaWJ1dGVzLmV4cGFuZGFibGV8fHRoaXMuaGFzQ2hpbGROb2Rlcygp fSxhcHBlbmRDaGlsZDpmdW5jdGlvbihlKXt2YXIgZz1mYWxzZTtpZihFeHQuaXNB cnJheShlKSl7Zz1lfWVsc2V7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtnPWFyZ3Vt ZW50c319aWYoZyl7Zm9yKHZhciBkPTAsYT1nLmxlbmd0aDtkPGE7ZCsrKXt0aGlz LmFwcGVuZENoaWxkKGdbZF0pfX1lbHNle2lmKHRoaXMuZmlyZUV2ZW50KCJiZWZv cmVhcHBlbmQiLHRoaXMub3duZXJUcmVlLHRoaXMsZSk9PT1mYWxzZSl7cmV0dXJu IGZhbHNlfXZhciBiPXRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7dmFyIGM9ZS5wYXJl bnROb2RlO2lmKGMpe2lmKGUuZmlyZUV2ZW50KCJiZWZvcmVtb3ZlIixlLmdldE93 bmVyVHJlZSgpLGUsYyx0aGlzLGIpPT09ZmFsc2Upe3JldHVybiBmYWxzZX1jLnJl bW92ZUNoaWxkKGUpfWI9dGhpcy5jaGlsZE5vZGVzLmxlbmd0aDtpZihiPT09MCl7 dGhpcy5zZXRGaXJzdENoaWxkKGUpfXRoaXMuY2hpbGROb2Rlcy5wdXNoKGUpO2Uu cGFyZW50Tm9kZT10aGlzO3ZhciBoPXRoaXMuY2hpbGROb2Rlc1tiLTFdO2lmKGgp e2UucHJldmlvdXNTaWJsaW5nPWg7aC5uZXh0U2libGluZz1lfWVsc2V7ZS5wcmV2 aW91c1NpYmxpbmc9bnVsbH1lLm5leHRTaWJsaW5nPW51bGw7dGhpcy5zZXRMYXN0 Q2hpbGQoZSk7ZS5zZXRPd25lclRyZWUodGhpcy5nZXRPd25lclRyZWUoKSk7dGhp cy5maXJlRXZlbnQoImFwcGVuZCIsdGhpcy5vd25lclRyZWUsdGhpcyxlLGIpO2lm KGMpe2UuZmlyZUV2ZW50KCJtb3ZlIix0aGlzLm93bmVyVHJlZSxlLGMsdGhpcyxi KX1yZXR1cm4gZX19LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKGMsYil7dmFyIGE9dGhp cy5jaGlsZE5vZGVzLmluZGV4T2YoYyk7aWYoYT09LTEpe3JldHVybiBmYWxzZX1p Zih0aGlzLmZpcmVFdmVudCgiYmVmb3JlcmVtb3ZlIix0aGlzLm93bmVyVHJlZSx0 aGlzLGMpPT09ZmFsc2Upe3JldHVybiBmYWxzZX10aGlzLmNoaWxkTm9kZXMuc3Bs aWNlKGEsMSk7aWYoYy5wcmV2aW91c1NpYmxpbmcpe2MucHJldmlvdXNTaWJsaW5n Lm5leHRTaWJsaW5nPWMubmV4dFNpYmxpbmd9aWYoYy5uZXh0U2libGluZyl7Yy5u ZXh0U2libGluZy5wcmV2aW91c1NpYmxpbmc9Yy5wcmV2aW91c1NpYmxpbmd9aWYo dGhpcy5maXJzdENoaWxkPT1jKXt0aGlzLnNldEZpcnN0Q2hpbGQoYy5uZXh0U2li bGluZyl9aWYodGhpcy5sYXN0Q2hpbGQ9PWMpe3RoaXMuc2V0TGFzdENoaWxkKGMu cHJldmlvdXNTaWJsaW5nKX10aGlzLmZpcmVFdmVudCgicmVtb3ZlIix0aGlzLm93 bmVyVHJlZSx0aGlzLGMpO2lmKGIpe2MuZGVzdHJveSh0cnVlKX1lbHNle2MuY2xl YXIoKX1yZXR1cm4gY30sY2xlYXI6ZnVuY3Rpb24oYSl7dGhpcy5zZXRPd25lclRy ZWUobnVsbCxhKTt0aGlzLnBhcmVudE5vZGU9dGhpcy5wcmV2aW91c1NpYmxpbmc9 dGhpcy5uZXh0U2libGluZz1udWxsO2lmKGEpe3RoaXMuZmlyc3RDaGlsZD10aGlz Lmxhc3RDaGlsZD1udWxsfX0sZGVzdHJveTpmdW5jdGlvbihhKXtpZihhPT09dHJ1 ZSl7dGhpcy5wdXJnZUxpc3RlbmVycygpO3RoaXMuY2xlYXIodHJ1ZSk7RXh0LmVh Y2godGhpcy5jaGlsZE5vZGVzLGZ1bmN0aW9uKGIpe2IuZGVzdHJveSh0cnVlKX0p O3RoaXMuY2hpbGROb2Rlcz1udWxsfWVsc2V7dGhpcy5yZW1vdmUodHJ1ZSl9fSxp bnNlcnRCZWZvcmU6ZnVuY3Rpb24oZCxhKXtpZighYSl7cmV0dXJuIHRoaXMuYXBw ZW5kQ2hpbGQoZCl9aWYoZD09YSl7cmV0dXJuIGZhbHNlfWlmKHRoaXMuZmlyZUV2 ZW50KCJiZWZvcmVpbnNlcnQiLHRoaXMub3duZXJUcmVlLHRoaXMsZCxhKT09PWZh bHNlKXtyZXR1cm4gZmFsc2V9dmFyIGI9dGhpcy5jaGlsZE5vZGVzLmluZGV4T2Yo YSk7dmFyIGM9ZC5wYXJlbnROb2RlO3ZhciBlPWI7aWYoYz09dGhpcyYmdGhpcy5j aGlsZE5vZGVzLmluZGV4T2YoZCk8Yil7ZS0tfWlmKGMpe2lmKGQuZmlyZUV2ZW50 KCJiZWZvcmVtb3ZlIixkLmdldE93bmVyVHJlZSgpLGQsYyx0aGlzLGIsYSk9PT1m YWxzZSl7cmV0dXJuIGZhbHNlfWMucmVtb3ZlQ2hpbGQoZCl9aWYoZT09PTApe3Ro aXMuc2V0Rmlyc3RDaGlsZChkKX10aGlzLmNoaWxkTm9kZXMuc3BsaWNlKGUsMCxk KTtkLnBhcmVudE5vZGU9dGhpczt2YXIgZz10aGlzLmNoaWxkTm9kZXNbZS0xXTtp ZihnKXtkLnByZXZpb3VzU2libGluZz1nO2cubmV4dFNpYmxpbmc9ZH1lbHNle2Qu cHJldmlvdXNTaWJsaW5nPW51bGx9ZC5uZXh0U2libGluZz1hO2EucHJldmlvdXNT aWJsaW5nPWQ7ZC5zZXRPd25lclRyZWUodGhpcy5nZXRPd25lclRyZWUoKSk7dGhp cy5maXJlRXZlbnQoImluc2VydCIsdGhpcy5vd25lclRyZWUsdGhpcyxkLGEpO2lm KGMpe2QuZmlyZUV2ZW50KCJtb3ZlIix0aGlzLm93bmVyVHJlZSxkLGMsdGhpcyxl LGEpfXJldHVybiBkfSxyZW1vdmU6ZnVuY3Rpb24oYSl7aWYodGhpcy5wYXJlbnRO b2RlKXt0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyxhKX1yZXR1cm4g dGhpc30scmVtb3ZlQWxsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY2hpbGROb2Rl cyxiO3doaWxlKChiPWNbMF0pKXt0aGlzLnJlbW92ZUNoaWxkKGIsYSl9cmV0dXJu IHRoaXN9LGl0ZW06ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc1th XX0scmVwbGFjZUNoaWxkOmZ1bmN0aW9uKGEsYyl7dmFyIGI9Yz9jLm5leHRTaWJs aW5nOm51bGw7dGhpcy5yZW1vdmVDaGlsZChjKTt0aGlzLmluc2VydEJlZm9yZShh LGIpO3JldHVybiBjfSxpbmRleE9mOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNo aWxkTm9kZXMuaW5kZXhPZihhKX0sZ2V0T3duZXJUcmVlOmZ1bmN0aW9uKCl7aWYo IXRoaXMub3duZXJUcmVlKXt2YXIgYT10aGlzO3doaWxlKGEpe2lmKGEub3duZXJU cmVlKXt0aGlzLm93bmVyVHJlZT1hLm93bmVyVHJlZTticmVha31hPWEucGFyZW50 Tm9kZX19cmV0dXJuIHRoaXMub3duZXJUcmVlfSxnZXREZXB0aDpmdW5jdGlvbigp e3ZhciBiPTA7dmFyIGE9dGhpczt3aGlsZShhLnBhcmVudE5vZGUpeysrYjthPWEu cGFyZW50Tm9kZX1yZXR1cm4gYn0sc2V0T3duZXJUcmVlOmZ1bmN0aW9uKGEsYil7 aWYoYSE9dGhpcy5vd25lclRyZWUpe2lmKHRoaXMub3duZXJUcmVlKXt0aGlzLm93 bmVyVHJlZS51bnJlZ2lzdGVyTm9kZSh0aGlzKX10aGlzLm93bmVyVHJlZT1hO2lm KGIhPT10cnVlKXtFeHQuZWFjaCh0aGlzLmNoaWxkTm9kZXMsZnVuY3Rpb24oYyl7 Yy5zZXRPd25lclRyZWUoYSl9KX1pZihhKXthLnJlZ2lzdGVyTm9kZSh0aGlzKX19 fSxzZXRJZDpmdW5jdGlvbihiKXtpZihiIT09dGhpcy5pZCl7dmFyIGE9dGhpcy5v d25lclRyZWU7aWYoYSl7YS51bnJlZ2lzdGVyTm9kZSh0aGlzKX10aGlzLmlkPXRo aXMuYXR0cmlidXRlcy5pZD1iO2lmKGEpe2EucmVnaXN0ZXJOb2RlKHRoaXMpfXRo aXMub25JZENoYW5nZShiKX19LG9uSWRDaGFuZ2U6RXh0LmVtcHR5Rm4sZ2V0UGF0 aDpmdW5jdGlvbihjKXtjPWN8fCJpZCI7dmFyIGU9dGhpcy5wYXJlbnROb2RlO3Zh ciBhPVt0aGlzLmF0dHJpYnV0ZXNbY11dO3doaWxlKGUpe2EudW5zaGlmdChlLmF0 dHJpYnV0ZXNbY10pO2U9ZS5wYXJlbnROb2RlfXZhciBkPXRoaXMuZ2V0T3duZXJU cmVlKCkucGF0aFNlcGFyYXRvcjtyZXR1cm4gZCthLmpvaW4oZCl9LGJ1YmJsZTpm dW5jdGlvbihjLGIsYSl7dmFyIGQ9dGhpczt3aGlsZShkKXtpZihjLmFwcGx5KGJ8 fGQsYXx8W2RdKT09PWZhbHNlKXticmVha31kPWQucGFyZW50Tm9kZX19LGNhc2Nh ZGU6ZnVuY3Rpb24oZyxlLGIpe2lmKGcuYXBwbHkoZXx8dGhpcyxifHxbdGhpc10p IT09ZmFsc2Upe3ZhciBkPXRoaXMuY2hpbGROb2Rlcztmb3IodmFyIGM9MCxhPWQu bGVuZ3RoO2M8YTtjKyspe2RbY10uY2FzY2FkZShnLGUsYil9fX0sZWFjaENoaWxk OmZ1bmN0aW9uKGcsZSxiKXt2YXIgZD10aGlzLmNoaWxkTm9kZXM7Zm9yKHZhciBj PTAsYT1kLmxlbmd0aDtjPGE7YysrKXtpZihnLmFwcGx5KGV8fGRbY10sYnx8W2Rb Y11dKT09PWZhbHNlKXticmVha319fSxmaW5kQ2hpbGQ6ZnVuY3Rpb24oYixjLGEp e3JldHVybiB0aGlzLmZpbmRDaGlsZEJ5KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMu YXR0cmlidXRlc1tiXT09Y30sbnVsbCxhKX0sZmluZENoaWxkQnk6ZnVuY3Rpb24o aCxnLGIpe3ZhciBlPXRoaXMuY2hpbGROb2RlcyxhPWUubGVuZ3RoLGQ9MCxqLGM7 Zm9yKDtkPGE7ZCsrKXtqPWVbZF07aWYoaC5jYWxsKGd8fGosaik9PT10cnVlKXty ZXR1cm4gan1lbHNle2lmKGIpe2M9ai5maW5kQ2hpbGRCeShoLGcsYik7aWYoYyE9 bnVsbCl7cmV0dXJuIGN9fX19cmV0dXJuIG51bGx9LHNvcnQ6ZnVuY3Rpb24oZSxk KXt2YXIgYz10aGlzLmNoaWxkTm9kZXM7dmFyIGE9Yy5sZW5ndGg7aWYoYT4wKXt2 YXIgZz1kP2Z1bmN0aW9uKCl7ZS5hcHBseShkLGFyZ3VtZW50cyl9OmU7Yy5zb3J0 KGcpO2Zvcih2YXIgYj0wO2I8YTtiKyspe3ZhciBoPWNbYl07aC5wcmV2aW91c1Np Ymxpbmc9Y1tiLTFdO2gubmV4dFNpYmxpbmc9Y1tiKzFdO2lmKGI9PT0wKXt0aGlz LnNldEZpcnN0Q2hpbGQoaCl9aWYoYj09YS0xKXt0aGlzLnNldExhc3RDaGlsZCho KX19fX0sY29udGFpbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNBbmNlc3Rvcih0 aGlzKX0saXNBbmNlc3RvcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBhcmVudE5v ZGU7d2hpbGUoYil7aWYoYj09YSl7cmV0dXJuIHRydWV9Yj1iLnBhcmVudE5vZGV9 cmV0dXJuIGZhbHNlfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJbTm9kZSIr KHRoaXMuaWQ/IiAiK3RoaXMuaWQ6IiIpKyJdIn19KTtFeHQudHJlZS5UcmVlTm9k ZT1FeHQuZXh0ZW5kKEV4dC5kYXRhLk5vZGUse2NvbnN0cnVjdG9yOmZ1bmN0aW9u KGEpe2E9YXx8e307aWYoRXh0LmlzU3RyaW5nKGEpKXthPXt0ZXh0OmF9fXRoaXMu Y2hpbGRyZW5SZW5kZXJlZD1mYWxzZTt0aGlzLnJlbmRlcmVkPWZhbHNlO0V4dC50 cmVlLlRyZWVOb2RlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEp O3RoaXMuZXhwYW5kZWQ9YS5leHBhbmRlZD09PXRydWU7dGhpcy5pc1RhcmdldD1h LmlzVGFyZ2V0IT09ZmFsc2U7dGhpcy5kcmFnZ2FibGU9YS5kcmFnZ2FibGUhPT1m YWxzZSYmYS5hbGxvd0RyYWchPT1mYWxzZTt0aGlzLmFsbG93Q2hpbGRyZW49YS5h bGxvd0NoaWxkcmVuIT09ZmFsc2UmJmEuYWxsb3dEcm9wIT09ZmFsc2U7dGhpcy50 ZXh0PWEudGV4dDt0aGlzLmRpc2FibGVkPWEuZGlzYWJsZWQ9PT10cnVlO3RoaXMu aGlkZGVuPWEuaGlkZGVuPT09dHJ1ZTt0aGlzLmFkZEV2ZW50cygidGV4dGNoYW5n ZSIsImJlZm9yZWV4cGFuZCIsImJlZm9yZWNvbGxhcHNlIiwiZXhwYW5kIiwiZGlz YWJsZWRjaGFuZ2UiLCJjb2xsYXBzZSIsImJlZm9yZWNsaWNrIiwiY2xpY2siLCJj aGVja2NoYW5nZSIsImJlZm9yZWRibGNsaWNrIiwiZGJsY2xpY2siLCJjb250ZXh0 bWVudSIsImJlZm9yZWNoaWxkcmVucmVuZGVyZWQiKTt2YXIgYj10aGlzLmF0dHJp YnV0ZXMudWlQcm92aWRlcnx8dGhpcy5kZWZhdWx0VUl8fEV4dC50cmVlLlRyZWVO b2RlVUk7dGhpcy51aT1uZXcgYih0aGlzKX0scHJldmVudEhTY3JvbGw6dHJ1ZSxp c0V4cGFuZGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXhwYW5kZWR9LGdldFVJ OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWl9LGdldExvYWRlcjpmdW5jdGlvbigp e3ZhciBhO3JldHVybiB0aGlzLmxvYWRlcnx8KChhPXRoaXMuZ2V0T3duZXJUcmVl KCkpJiZhLmxvYWRlcj9hLmxvYWRlcjoodGhpcy5sb2FkZXI9bmV3IEV4dC50cmVl LlRyZWVMb2FkZXIoKSkpfSxzZXRGaXJzdENoaWxkOmZ1bmN0aW9uKGEpe3ZhciBi PXRoaXMuZmlyc3RDaGlsZDtFeHQudHJlZS5UcmVlTm9kZS5zdXBlcmNsYXNzLnNl dEZpcnN0Q2hpbGQuY2FsbCh0aGlzLGEpO2lmKHRoaXMuY2hpbGRyZW5SZW5kZXJl ZCYmYiYmYSE9Yil7Yi5yZW5kZXJJbmRlbnQodHJ1ZSx0cnVlKX1pZih0aGlzLnJl bmRlcmVkKXt0aGlzLnJlbmRlckluZGVudCh0cnVlLHRydWUpfX0sc2V0TGFzdENo aWxkOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMubGFzdENoaWxkO0V4dC50cmVlLlRy ZWVOb2RlLnN1cGVyY2xhc3Muc2V0TGFzdENoaWxkLmNhbGwodGhpcyxiKTtpZih0 aGlzLmNoaWxkcmVuUmVuZGVyZWQmJmEmJmIhPWEpe2EucmVuZGVySW5kZW50KHRy dWUsdHJ1ZSl9aWYodGhpcy5yZW5kZXJlZCl7dGhpcy5yZW5kZXJJbmRlbnQodHJ1 ZSx0cnVlKX19LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGIpe2lmKCFiLnJlbmRlciYm IUV4dC5pc0FycmF5KGIpKXtiPXRoaXMuZ2V0TG9hZGVyKCkuY3JlYXRlTm9kZShi KX12YXIgYT1FeHQudHJlZS5UcmVlTm9kZS5zdXBlcmNsYXNzLmFwcGVuZENoaWxk LmNhbGwodGhpcyxiKTtpZihhJiZ0aGlzLmNoaWxkcmVuUmVuZGVyZWQpe2EucmVu ZGVyKCl9dGhpcy51aS51cGRhdGVFeHBhbmRJY29uKCk7cmV0dXJuIGF9LHJlbW92 ZUNoaWxkOmZ1bmN0aW9uKGIsYSl7dGhpcy5vd25lclRyZWUuZ2V0U2VsZWN0aW9u TW9kZWwoKS51bnNlbGVjdChiKTtFeHQudHJlZS5UcmVlTm9kZS5zdXBlcmNsYXNz LnJlbW92ZUNoaWxkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighYSl7dmFyIGM9 Yi51aS5yZW5kZXJlZDtpZihjKXtiLnVpLnJlbW92ZSgpfWlmKGMmJnRoaXMuY2hp bGROb2Rlcy5sZW5ndGg8MSl7dGhpcy5jb2xsYXBzZShmYWxzZSxmYWxzZSl9ZWxz ZXt0aGlzLnVpLnVwZGF0ZUV4cGFuZEljb24oKX1pZighdGhpcy5maXJzdENoaWxk JiYhdGhpcy5pc0hpZGRlblJvb3QoKSl7dGhpcy5jaGlsZHJlblJlbmRlcmVkPWZh bHNlfX1yZXR1cm4gYn0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGMsYSl7aWYoIWMu cmVuZGVyKXtjPXRoaXMuZ2V0TG9hZGVyKCkuY3JlYXRlTm9kZShjKX12YXIgYj1F eHQudHJlZS5UcmVlTm9kZS5zdXBlcmNsYXNzLmluc2VydEJlZm9yZS5jYWxsKHRo aXMsYyxhKTtpZihiJiZhJiZ0aGlzLmNoaWxkcmVuUmVuZGVyZWQpe2MucmVuZGVy KCl9dGhpcy51aS51cGRhdGVFeHBhbmRJY29uKCk7cmV0dXJuIGJ9LHNldFRleHQ6 ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy50ZXh0O3RoaXMudGV4dD10aGlzLmF0dHJp YnV0ZXMudGV4dD1iO2lmKHRoaXMucmVuZGVyZWQpe3RoaXMudWkub25UZXh0Q2hh bmdlKHRoaXMsYixhKX10aGlzLmZpcmVFdmVudCgidGV4dGNoYW5nZSIsdGhpcyxi LGEpfSxzZXRJY29uQ2xzOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYXR0cmlidXRl cy5pY29uQ2xzO3RoaXMuYXR0cmlidXRlcy5pY29uQ2xzPWI7aWYodGhpcy5yZW5k ZXJlZCl7dGhpcy51aS5vbkljb25DbHNDaGFuZ2UodGhpcyxiLGEpfX0sc2V0VG9v bHRpcDpmdW5jdGlvbihhLGIpe3RoaXMuYXR0cmlidXRlcy5xdGlwPWE7dGhpcy5h dHRyaWJ1dGVzLnF0aXBUaXRsZT1iO2lmKHRoaXMucmVuZGVyZWQpe3RoaXMudWku b25UaXBDaGFuZ2UodGhpcyxhLGIpfX0sc2V0SWNvbjpmdW5jdGlvbihhKXt0aGlz LmF0dHJpYnV0ZXMuaWNvbj1hO2lmKHRoaXMucmVuZGVyZWQpe3RoaXMudWkub25J Y29uQ2hhbmdlKHRoaXMsYSl9fSxzZXRIcmVmOmZ1bmN0aW9uKGEsYil7dGhpcy5h dHRyaWJ1dGVzLmhyZWY9YTt0aGlzLmF0dHJpYnV0ZXMuaHJlZlRhcmdldD1iO2lm KHRoaXMucmVuZGVyZWQpe3RoaXMudWkub25IcmVmQ2hhbmdlKHRoaXMsYSxiKX19 LHNldENsczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmF0dHJpYnV0ZXMuY2xzO3Ro aXMuYXR0cmlidXRlcy5jbHM9YjtpZih0aGlzLnJlbmRlcmVkKXt0aGlzLnVpLm9u Q2xzQ2hhbmdlKHRoaXMsYixhKX19LHNlbGVjdDpmdW5jdGlvbigpe3ZhciBhPXRo aXMuZ2V0T3duZXJUcmVlKCk7aWYoYSl7YS5nZXRTZWxlY3Rpb25Nb2RlbCgpLnNl bGVjdCh0aGlzKX19LHVuc2VsZWN0OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0 T3duZXJUcmVlKCk7aWYoYil7Yi5nZXRTZWxlY3Rpb25Nb2RlbCgpLnVuc2VsZWN0 KHRoaXMsYSl9fSxpc1NlbGVjdGVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRP d25lclRyZWUoKTtyZXR1cm4gYT9hLmdldFNlbGVjdGlvbk1vZGVsKCkuaXNTZWxl Y3RlZCh0aGlzKTpmYWxzZX0sZXhwYW5kOmZ1bmN0aW9uKGEsYyxkLGIpe2lmKCF0 aGlzLmV4cGFuZGVkKXtpZih0aGlzLmZpcmVFdmVudCgiYmVmb3JlZXhwYW5kIix0 aGlzLGEsYyk9PT1mYWxzZSl7cmV0dXJufWlmKCF0aGlzLmNoaWxkcmVuUmVuZGVy ZWQpe3RoaXMucmVuZGVyQ2hpbGRyZW4oKX10aGlzLmV4cGFuZGVkPXRydWU7aWYo IXRoaXMuaXNIaWRkZW5Sb290KCkmJih0aGlzLmdldE93bmVyVHJlZSgpLmFuaW1h dGUmJmMhPT1mYWxzZSl8fGMpe3RoaXMudWkuYW5pbUV4cGFuZChmdW5jdGlvbigp e3RoaXMuZmlyZUV2ZW50KCJleHBhbmQiLHRoaXMpO3RoaXMucnVuQ2FsbGJhY2so ZCxifHx0aGlzLFt0aGlzXSk7aWYoYT09PXRydWUpe3RoaXMuZXhwYW5kQ2hpbGRO b2Rlcyh0cnVlLHRydWUpfX0uY3JlYXRlRGVsZWdhdGUodGhpcykpO3JldHVybn1l bHNle3RoaXMudWkuZXhwYW5kKCk7dGhpcy5maXJlRXZlbnQoImV4cGFuZCIsdGhp cyk7dGhpcy5ydW5DYWxsYmFjayhkLGJ8fHRoaXMsW3RoaXNdKX19ZWxzZXt0aGlz LnJ1bkNhbGxiYWNrKGQsYnx8dGhpcyxbdGhpc10pfWlmKGE9PT10cnVlKXt0aGlz LmV4cGFuZENoaWxkTm9kZXModHJ1ZSl9fSxydW5DYWxsYmFjazpmdW5jdGlvbihh LGMsYil7aWYoRXh0LmlzRnVuY3Rpb24oYSkpe2EuYXBwbHkoYyxiKX19LGlzSGlk ZGVuUm9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlzUm9vdCYmIXRoaXMuZ2V0 T3duZXJUcmVlKCkucm9vdFZpc2libGV9LGNvbGxhcHNlOmZ1bmN0aW9uKGIsZyxo LGUpe2lmKHRoaXMuZXhwYW5kZWQmJiF0aGlzLmlzSGlkZGVuUm9vdCgpKXtpZih0 aGlzLmZpcmVFdmVudCgiYmVmb3JlY29sbGFwc2UiLHRoaXMsYixnKT09PWZhbHNl KXtyZXR1cm59dGhpcy5leHBhbmRlZD1mYWxzZTtpZigodGhpcy5nZXRPd25lclRy ZWUoKS5hbmltYXRlJiZnIT09ZmFsc2UpfHxnKXt0aGlzLnVpLmFuaW1Db2xsYXBz ZShmdW5jdGlvbigpe3RoaXMuZmlyZUV2ZW50KCJjb2xsYXBzZSIsdGhpcyk7dGhp cy5ydW5DYWxsYmFjayhoLGV8fHRoaXMsW3RoaXNdKTtpZihiPT09dHJ1ZSl7dGhp cy5jb2xsYXBzZUNoaWxkTm9kZXModHJ1ZSl9fS5jcmVhdGVEZWxlZ2F0ZSh0aGlz KSk7cmV0dXJufWVsc2V7dGhpcy51aS5jb2xsYXBzZSgpO3RoaXMuZmlyZUV2ZW50 KCJjb2xsYXBzZSIsdGhpcyk7dGhpcy5ydW5DYWxsYmFjayhoLGV8fHRoaXMsW3Ro aXNdKX19ZWxzZXtpZighdGhpcy5leHBhbmRlZCl7dGhpcy5ydW5DYWxsYmFjayho LGV8fHRoaXMsW3RoaXNdKX19aWYoYj09PXRydWUpe3ZhciBkPXRoaXMuY2hpbGRO b2Rlcztmb3IodmFyIGM9MCxhPWQubGVuZ3RoO2M8YTtjKyspe2RbY10uY29sbGFw c2UodHJ1ZSxmYWxzZSl9fX0sZGVsYXllZEV4cGFuZDpmdW5jdGlvbihhKXtpZigh dGhpcy5leHBhbmRQcm9jSWQpe3RoaXMuZXhwYW5kUHJvY0lkPXRoaXMuZXhwYW5k LmRlZmVyKGEsdGhpcyl9fSxjYW5jZWxFeHBhbmQ6ZnVuY3Rpb24oKXtpZih0aGlz LmV4cGFuZFByb2NJZCl7Y2xlYXJUaW1lb3V0KHRoaXMuZXhwYW5kUHJvY0lkKX10 aGlzLmV4cGFuZFByb2NJZD1mYWxzZX0sdG9nZ2xlOmZ1bmN0aW9uKCl7aWYodGhp cy5leHBhbmRlZCl7dGhpcy5jb2xsYXBzZSgpfWVsc2V7dGhpcy5leHBhbmQoKX19 LGVuc3VyZVZpc2libGU6ZnVuY3Rpb24oYyxiKXt2YXIgYT10aGlzLmdldE93bmVy VHJlZSgpO2EuZXhwYW5kUGF0aCh0aGlzLnBhcmVudE5vZGU/dGhpcy5wYXJlbnRO b2RlLmdldFBhdGgoKTp0aGlzLmdldFBhdGgoKSxmYWxzZSxmdW5jdGlvbigpe3Zh ciBkPWEuZ2V0Tm9kZUJ5SWQodGhpcy5pZCk7YS5nZXRUcmVlRWwoKS5zY3JvbGxD aGlsZEludG9WaWV3KGQudWkuYW5jaG9yKTt0aGlzLnJ1bkNhbGxiYWNrKGMsYnx8 dGhpcyxbdGhpc10pfS5jcmVhdGVEZWxlZ2F0ZSh0aGlzKSl9LGV4cGFuZENoaWxk Tm9kZXM6ZnVuY3Rpb24oYixlKXt2YXIgZD10aGlzLmNoaWxkTm9kZXMsYyxhPWQu bGVuZ3RoO2ZvcihjPTA7YzxhO2MrKyl7ZFtjXS5leHBhbmQoYixlKX19LGNvbGxh cHNlQ2hpbGROb2RlczpmdW5jdGlvbihiKXt2YXIgZD10aGlzLmNoaWxkTm9kZXM7 Zm9yKHZhciBjPTAsYT1kLmxlbmd0aDtjPGE7YysrKXtkW2NdLmNvbGxhcHNlKGIp fX0sZGlzYWJsZTpmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWQ9dHJ1ZTt0aGlzLnVu c2VsZWN0KCk7aWYodGhpcy5yZW5kZXJlZCYmdGhpcy51aS5vbkRpc2FibGVDaGFu Z2Upe3RoaXMudWkub25EaXNhYmxlQ2hhbmdlKHRoaXMsdHJ1ZSl9dGhpcy5maXJl RXZlbnQoImRpc2FibGVkY2hhbmdlIix0aGlzLHRydWUpfSxlbmFibGU6ZnVuY3Rp b24oKXt0aGlzLmRpc2FibGVkPWZhbHNlO2lmKHRoaXMucmVuZGVyZWQmJnRoaXMu dWkub25EaXNhYmxlQ2hhbmdlKXt0aGlzLnVpLm9uRGlzYWJsZUNoYW5nZSh0aGlz LGZhbHNlKX10aGlzLmZpcmVFdmVudCgiZGlzYWJsZWRjaGFuZ2UiLHRoaXMsZmFs c2UpfSxyZW5kZXJDaGlsZHJlbjpmdW5jdGlvbihiKXtpZihiIT09ZmFsc2Upe3Ro aXMuZmlyZUV2ZW50KCJiZWZvcmVjaGlsZHJlbnJlbmRlcmVkIix0aGlzKX12YXIg ZD10aGlzLmNoaWxkTm9kZXM7Zm9yKHZhciBjPTAsYT1kLmxlbmd0aDtjPGE7Yysr KXtkW2NdLnJlbmRlcih0cnVlKX10aGlzLmNoaWxkcmVuUmVuZGVyZWQ9dHJ1ZX0s c29ydDpmdW5jdGlvbihlLGQpe0V4dC50cmVlLlRyZWVOb2RlLnN1cGVyY2xhc3Mu c29ydC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYodGhpcy5jaGlsZHJlblJlbmRl cmVkKXt2YXIgYz10aGlzLmNoaWxkTm9kZXM7Zm9yKHZhciBiPTAsYT1jLmxlbmd0 aDtiPGE7YisrKXtjW2JdLnJlbmRlcih0cnVlKX19fSxyZW5kZXI6ZnVuY3Rpb24o YSl7dGhpcy51aS5yZW5kZXIoYSk7aWYoIXRoaXMucmVuZGVyZWQpe3RoaXMuZ2V0 T3duZXJUcmVlKCkucmVnaXN0ZXJOb2RlKHRoaXMpO3RoaXMucmVuZGVyZWQ9dHJ1 ZTtpZih0aGlzLmV4cGFuZGVkKXt0aGlzLmV4cGFuZGVkPWZhbHNlO3RoaXMuZXhw YW5kKGZhbHNlLGZhbHNlKX19fSxyZW5kZXJJbmRlbnQ6ZnVuY3Rpb24oYixlKXtp ZihlKXt0aGlzLnVpLmNoaWxkSW5kZW50PW51bGx9dGhpcy51aS5yZW5kZXJJbmRl bnQoKTtpZihiPT09dHJ1ZSYmdGhpcy5jaGlsZHJlblJlbmRlcmVkKXt2YXIgZD10 aGlzLmNoaWxkTm9kZXM7Zm9yKHZhciBjPTAsYT1kLmxlbmd0aDtjPGE7YysrKXtk W2NdLnJlbmRlckluZGVudCh0cnVlLGUpfX19LGJlZ2luVXBkYXRlOmZ1bmN0aW9u KCl7dGhpcy5jaGlsZHJlblJlbmRlcmVkPWZhbHNlfSxlbmRVcGRhdGU6ZnVuY3Rp b24oKXtpZih0aGlzLmV4cGFuZGVkJiZ0aGlzLnJlbmRlcmVkKXt0aGlzLnJlbmRl ckNoaWxkcmVuKCl9fSxkZXN0cm95OmZ1bmN0aW9uKGEpe2lmKGE9PT10cnVlKXt0 aGlzLnVuc2VsZWN0KHRydWUpfUV4dC50cmVlLlRyZWVOb2RlLnN1cGVyY2xhc3Mu ZGVzdHJveS5jYWxsKHRoaXMsYSk7RXh0LmRlc3Ryb3kodGhpcy51aSx0aGlzLmxv YWRlcik7dGhpcy51aT10aGlzLmxvYWRlcj1udWxsfSxvbklkQ2hhbmdlOmZ1bmN0 aW9uKGEpe3RoaXMudWkub25JZENoYW5nZShhKX19KTtFeHQudHJlZS5UcmVlUGFu ZWwubm9kZVR5cGVzLm5vZGU9RXh0LnRyZWUuVHJlZU5vZGU7RXh0LnRyZWUuQXN5 bmNUcmVlTm9kZT1mdW5jdGlvbihhKXt0aGlzLmxvYWRlZD1hJiZhLmxvYWRlZD09 PXRydWU7dGhpcy5sb2FkaW5nPWZhbHNlO0V4dC50cmVlLkFzeW5jVHJlZU5vZGUu c3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhp cy5hZGRFdmVudHMoImJlZm9yZWxvYWQiLCJsb2FkIil9O0V4dC5leHRlbmQoRXh0 LnRyZWUuQXN5bmNUcmVlTm9kZSxFeHQudHJlZS5UcmVlTm9kZSx7ZXhwYW5kOmZ1 bmN0aW9uKGIsZSxoLGMpe2lmKHRoaXMubG9hZGluZyl7dmFyIGc7dmFyIGQ9ZnVu Y3Rpb24oKXtpZighdGhpcy5sb2FkaW5nKXtjbGVhckludGVydmFsKGcpO3RoaXMu ZXhwYW5kKGIsZSxoLGMpfX0uY3JlYXRlRGVsZWdhdGUodGhpcyk7Zz1zZXRJbnRl cnZhbChkLDIwMCk7cmV0dXJufWlmKCF0aGlzLmxvYWRlZCl7aWYodGhpcy5maXJl RXZlbnQoImJlZm9yZWxvYWQiLHRoaXMpPT09ZmFsc2Upe3JldHVybn10aGlzLmxv YWRpbmc9dHJ1ZTt0aGlzLnVpLmJlZm9yZUxvYWQodGhpcyk7dmFyIGE9dGhpcy5s b2FkZXJ8fHRoaXMuYXR0cmlidXRlcy5sb2FkZXJ8fHRoaXMuZ2V0T3duZXJUcmVl KCkuZ2V0TG9hZGVyKCk7aWYoYSl7YS5sb2FkKHRoaXMsdGhpcy5sb2FkQ29tcGxl dGUuY3JlYXRlRGVsZWdhdGUodGhpcyxbYixlLGgsY10pLHRoaXMpO3JldHVybn19 RXh0LnRyZWUuQXN5bmNUcmVlTm9kZS5zdXBlcmNsYXNzLmV4cGFuZC5jYWxsKHRo aXMsYixlLGgsYyl9LGlzTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxv YWRpbmd9LGxvYWRDb21wbGV0ZTpmdW5jdGlvbihhLGMsZCxiKXt0aGlzLmxvYWRp bmc9ZmFsc2U7dGhpcy5sb2FkZWQ9dHJ1ZTt0aGlzLnVpLmFmdGVyTG9hZCh0aGlz KTt0aGlzLmZpcmVFdmVudCgibG9hZCIsdGhpcyk7dGhpcy5leHBhbmQoYSxjLGQs Yil9LGlzTG9hZGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9hZGVkfSxoYXND aGlsZE5vZGVzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNMZWFmKCkmJiF0aGlzLmxv YWRlZCl7cmV0dXJuIHRydWV9ZWxzZXtyZXR1cm4gRXh0LnRyZWUuQXN5bmNUcmVl Tm9kZS5zdXBlcmNsYXNzLmhhc0NoaWxkTm9kZXMuY2FsbCh0aGlzKX19LHJlbG9h ZDpmdW5jdGlvbihiLGEpe3RoaXMuY29sbGFwc2UoZmFsc2UsZmFsc2UpO3doaWxl KHRoaXMuZmlyc3RDaGlsZCl7dGhpcy5yZW1vdmVDaGlsZCh0aGlzLmZpcnN0Q2hp bGQpLmRlc3Ryb3koKX10aGlzLmNoaWxkcmVuUmVuZGVyZWQ9ZmFsc2U7dGhpcy5s b2FkZWQ9ZmFsc2U7aWYodGhpcy5pc0hpZGRlblJvb3QoKSl7dGhpcy5leHBhbmRl ZD1mYWxzZX10aGlzLmV4cGFuZChmYWxzZSxmYWxzZSxiLGEpfX0pO0V4dC50cmVl LlRyZWVQYW5lbC5ub2RlVHlwZXMuYXN5bmM9RXh0LnRyZWUuQXN5bmNUcmVlTm9k ZTtFeHQudHJlZS5UcmVlTm9kZVVJPUV4dC5leHRlbmQoT2JqZWN0LHtjb25zdHJ1 Y3RvcjpmdW5jdGlvbihhKXtFeHQuYXBwbHkodGhpcyx7bm9kZTphLHJlbmRlcmVk OmZhbHNlLGFuaW1hdGluZzpmYWxzZSx3YXNMZWFmOnRydWUsZWNjOiJ4LXRyZWUt ZWMtaWNvbiB4LXRyZWUtZWxib3ciLGVtcHR5SWNvbjpFeHQuQkxBTktfSU1BR0Vf VVJMfSl9LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKGEpe2lmKHRoaXMucmVuZGVyZWQp e3RoaXMuY3ROb2RlLnJlbW92ZUNoaWxkKGEudWkuZ2V0RWwoKSl9fSxiZWZvcmVM b2FkOmZ1bmN0aW9uKCl7dGhpcy5hZGRDbGFzcygieC10cmVlLW5vZGUtbG9hZGlu ZyIpfSxhZnRlckxvYWQ6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUNsYXNzKCJ4LXRy ZWUtbm9kZS1sb2FkaW5nIil9LG9uVGV4dENoYW5nZTpmdW5jdGlvbihiLGMsYSl7 aWYodGhpcy5yZW5kZXJlZCl7dGhpcy50ZXh0Tm9kZS5pbm5lckhUTUw9Y319LG9u SWNvbkNsc0NoYW5nZTpmdW5jdGlvbihjLGEsYil7aWYodGhpcy5yZW5kZXJlZCl7 RXh0LmZseSh0aGlzLmljb25Ob2RlKS5yZXBsYWNlQ2xhc3MoYixhKX19LG9uSWNv bkNoYW5nZTpmdW5jdGlvbihiLGEpe2lmKHRoaXMucmVuZGVyZWQpe3ZhciBjPUV4 dC5pc0VtcHR5KGEpO3RoaXMuaWNvbk5vZGUuc3JjPWM/dGhpcy5lbXB0eUljb246 YTtFeHQuZmx5KHRoaXMuaWNvbk5vZGUpW2M/InJlbW92ZUNsYXNzIjoiYWRkQ2xh c3MiXSgieC10cmVlLW5vZGUtaW5saW5lLWljb24iKX19LG9uVGlwQ2hhbmdlOmZ1 bmN0aW9uKGIsYyxkKXtpZih0aGlzLnJlbmRlcmVkKXt2YXIgYT1FeHQuaXNEZWZp bmVkKGQpO2lmKHRoaXMudGV4dE5vZGUuc2V0QXR0cmlidXRlTlMpe3RoaXMudGV4 dE5vZGUuc2V0QXR0cmlidXRlTlMoImV4dCIsInF0aXAiLGMpO2lmKGEpe3RoaXMu dGV4dE5vZGUuc2V0QXR0cmlidXRlTlMoImV4dCIsInF0aXRsZSIsZCl9fWVsc2V7 dGhpcy50ZXh0Tm9kZS5zZXRBdHRyaWJ1dGUoImV4dDpxdGlwIixjKTtpZihhKXt0 aGlzLnRleHROb2RlLnNldEF0dHJpYnV0ZSgiZXh0OnF0aXRsZSIsZCl9fX19LG9u SHJlZkNoYW5nZTpmdW5jdGlvbihiLGEsYyl7aWYodGhpcy5yZW5kZXJlZCl7dGhp cy5hbmNob3IuaHJlZj10aGlzLmdldEhyZWYoYSk7aWYoRXh0LmlzRGVmaW5lZChj KSl7dGhpcy5hbmNob3IudGFyZ2V0PWN9fX0sb25DbHNDaGFuZ2U6ZnVuY3Rpb24o YyxhLGIpe2lmKHRoaXMucmVuZGVyZWQpe0V4dC5mbHkodGhpcy5lbE5vZGUpLnJl cGxhY2VDbGFzcyhiLGEpfX0sb25EaXNhYmxlQ2hhbmdlOmZ1bmN0aW9uKGEsYil7 dGhpcy5kaXNhYmxlZD1iO2lmKHRoaXMuY2hlY2tib3gpe3RoaXMuY2hlY2tib3gu ZGlzYWJsZWQ9Yn10aGlzW2I/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgieC10 cmVlLW5vZGUtZGlzYWJsZWQiKX0sb25TZWxlY3RlZENoYW5nZTpmdW5jdGlvbihh KXtpZihhKXt0aGlzLmZvY3VzKCk7dGhpcy5hZGRDbGFzcygieC10cmVlLXNlbGVj dGVkIil9ZWxzZXt0aGlzLnJlbW92ZUNsYXNzKCJ4LXRyZWUtc2VsZWN0ZWQiKX19 LG9uTW92ZTpmdW5jdGlvbihhLGgsZSxnLGQsYil7dGhpcy5jaGlsZEluZGVudD1u dWxsO2lmKHRoaXMucmVuZGVyZWQpe3ZhciBpPWcudWkuZ2V0Q29udGFpbmVyKCk7 aWYoIWkpe3RoaXMuaG9sZGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIp O3RoaXMuaG9sZGVyLmFwcGVuZENoaWxkKHRoaXMud3JhcCk7cmV0dXJufXZhciBj PWI/Yi51aS5nZXRFbCgpOm51bGw7aWYoYyl7aS5pbnNlcnRCZWZvcmUodGhpcy53 cmFwLGMpfWVsc2V7aS5hcHBlbmRDaGlsZCh0aGlzLndyYXApfXRoaXMubm9kZS5y ZW5kZXJJbmRlbnQodHJ1ZSxlIT1nKX19LGFkZENsYXNzOmZ1bmN0aW9uKGEpe2lm KHRoaXMuZWxOb2RlKXtFeHQuZmx5KHRoaXMuZWxOb2RlKS5hZGRDbGFzcyhhKX19 LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe2lmKHRoaXMuZWxOb2RlKXtFeHQuZmx5 KHRoaXMuZWxOb2RlKS5yZW1vdmVDbGFzcyhhKX19LHJlbW92ZTpmdW5jdGlvbigp e2lmKHRoaXMucmVuZGVyZWQpe3RoaXMuaG9sZGVyPWRvY3VtZW50LmNyZWF0ZUVs ZW1lbnQoImRpdiIpO3RoaXMuaG9sZGVyLmFwcGVuZENoaWxkKHRoaXMud3JhcCl9 fSxmaXJlRXZlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLmZpcmVFdmVu dC5hcHBseSh0aGlzLm5vZGUsYXJndW1lbnRzKX0saW5pdEV2ZW50czpmdW5jdGlv bigpe3RoaXMubm9kZS5vbigibW92ZSIsdGhpcy5vbk1vdmUsdGhpcyk7aWYodGhp cy5ub2RlLmRpc2FibGVkKXt0aGlzLm9uRGlzYWJsZUNoYW5nZSh0aGlzLm5vZGUs dHJ1ZSl9aWYodGhpcy5ub2RlLmhpZGRlbil7dGhpcy5oaWRlKCl9dmFyIGI9dGhp cy5ub2RlLmdldE93bmVyVHJlZSgpO3ZhciBhPWIuZW5hYmxlRER8fGIuZW5hYmxl RHJhZ3x8Yi5lbmFibGVEcm9wO2lmKGEmJighdGhpcy5ub2RlLmlzUm9vdHx8Yi5y b290VmlzaWJsZSkpe0V4dC5kZC5SZWdpc3RyeS5yZWdpc3Rlcih0aGlzLmVsTm9k ZSx7bm9kZTp0aGlzLm5vZGUsaGFuZGxlczp0aGlzLmdldERESGFuZGxlcygpLGlz SGFuZGxlOmZhbHNlfSl9fSxnZXREREhhbmRsZXM6ZnVuY3Rpb24oKXtyZXR1cm5b dGhpcy5pY29uTm9kZSx0aGlzLnRleHROb2RlLHRoaXMuZWxOb2RlXX0saGlkZTpm dW5jdGlvbigpe3RoaXMubm9kZS5oaWRkZW49dHJ1ZTtpZih0aGlzLndyYXApe3Ro aXMud3JhcC5zdHlsZS5kaXNwbGF5PSJub25lIn19LHNob3c6ZnVuY3Rpb24oKXt0 aGlzLm5vZGUuaGlkZGVuPWZhbHNlO2lmKHRoaXMud3JhcCl7dGhpcy53cmFwLnN0 eWxlLmRpc3BsYXk9IiJ9fSxvbkNvbnRleHRNZW51OmZ1bmN0aW9uKGEpe2lmKHRo aXMubm9kZS5oYXNMaXN0ZW5lcigiY29udGV4dG1lbnUiKXx8dGhpcy5ub2RlLmdl dE93bmVyVHJlZSgpLmhhc0xpc3RlbmVyKCJjb250ZXh0bWVudSIpKXthLnByZXZl bnREZWZhdWx0KCk7dGhpcy5mb2N1cygpO3RoaXMuZmlyZUV2ZW50KCJjb250ZXh0 bWVudSIsdGhpcy5ub2RlLGEpfX0sb25DbGljazpmdW5jdGlvbihjKXtpZih0aGlz LmRyb3BwaW5nKXtjLnN0b3BFdmVudCgpO3JldHVybn1pZih0aGlzLmZpcmVFdmVu dCgiYmVmb3JlY2xpY2siLHRoaXMubm9kZSxjKSE9PWZhbHNlKXt2YXIgYj1jLmdl dFRhcmdldCgiYSIpO2lmKCF0aGlzLmRpc2FibGVkJiZ0aGlzLm5vZGUuYXR0cmli dXRlcy5ocmVmJiZiKXt0aGlzLmZpcmVFdmVudCgiY2xpY2siLHRoaXMubm9kZSxj KTtyZXR1cm59ZWxzZXtpZihiJiZjLmN0cmxLZXkpe2Muc3RvcEV2ZW50KCl9fWMu cHJldmVudERlZmF1bHQoKTtpZih0aGlzLmRpc2FibGVkKXtyZXR1cm59aWYodGhp cy5ub2RlLmF0dHJpYnV0ZXMuc2luZ2xlQ2xpY2tFeHBhbmQmJiF0aGlzLmFuaW1h dGluZyYmdGhpcy5ub2RlLmlzRXhwYW5kYWJsZSgpKXt0aGlzLm5vZGUudG9nZ2xl KCl9dGhpcy5maXJlRXZlbnQoImNsaWNrIix0aGlzLm5vZGUsYyl9ZWxzZXtjLnN0 b3BFdmVudCgpfX0sb25EYmxDbGljazpmdW5jdGlvbihhKXthLnByZXZlbnREZWZh dWx0KCk7aWYodGhpcy5kaXNhYmxlZCl7cmV0dXJufWlmKHRoaXMuZmlyZUV2ZW50 KCJiZWZvcmVkYmxjbGljayIsdGhpcy5ub2RlLGEpIT09ZmFsc2Upe2lmKHRoaXMu Y2hlY2tib3gpe3RoaXMudG9nZ2xlQ2hlY2soKX1pZighdGhpcy5hbmltYXRpbmcm JnRoaXMubm9kZS5pc0V4cGFuZGFibGUoKSl7dGhpcy5ub2RlLnRvZ2dsZSgpfXRo aXMuZmlyZUV2ZW50KCJkYmxjbGljayIsdGhpcy5ub2RlLGEpfX0sb25PdmVyOmZ1 bmN0aW9uKGEpe3RoaXMuYWRkQ2xhc3MoIngtdHJlZS1ub2RlLW92ZXIiKX0sb25P dXQ6ZnVuY3Rpb24oYSl7dGhpcy5yZW1vdmVDbGFzcygieC10cmVlLW5vZGUtb3Zl ciIpfSxvbkNoZWNrQ2hhbmdlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jaGVja2Jv eC5jaGVja2VkO3RoaXMuY2hlY2tib3guZGVmYXVsdENoZWNrZWQ9YTt0aGlzLm5v ZGUuYXR0cmlidXRlcy5jaGVja2VkPWE7dGhpcy5maXJlRXZlbnQoImNoZWNrY2hh bmdlIix0aGlzLm5vZGUsYSl9LGVjQ2xpY2s6ZnVuY3Rpb24oYSl7aWYoIXRoaXMu YW5pbWF0aW5nJiZ0aGlzLm5vZGUuaXNFeHBhbmRhYmxlKCkpe3RoaXMubm9kZS50 b2dnbGUoKX19LHN0YXJ0RHJvcDpmdW5jdGlvbigpe3RoaXMuZHJvcHBpbmc9dHJ1 ZX0sZW5kRHJvcDpmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlz LmRyb3BwaW5nPWZhbHNlfS5jcmVhdGVEZWxlZ2F0ZSh0aGlzKSw1MCl9LGV4cGFu ZDpmdW5jdGlvbigpe3RoaXMudXBkYXRlRXhwYW5kSWNvbigpO3RoaXMuY3ROb2Rl LnN0eWxlLmRpc3BsYXk9IiJ9LGZvY3VzOmZ1bmN0aW9uKCl7aWYoIXRoaXMubm9k ZS5wcmV2ZW50SFNjcm9sbCl7dHJ5e3RoaXMuYW5jaG9yLmZvY3VzKCl9Y2F0Y2go Yyl7fX1lbHNle3RyeXt2YXIgYj10aGlzLm5vZGUuZ2V0T3duZXJUcmVlKCkuZ2V0 VHJlZUVsKCkuZG9tO3ZhciBhPWIuc2Nyb2xsTGVmdDt0aGlzLmFuY2hvci5mb2N1 cygpO2Iuc2Nyb2xsTGVmdD1hfWNhdGNoKGMpe319fSx0b2dnbGVDaGVjazpmdW5j dGlvbihiKXt2YXIgYT10aGlzLmNoZWNrYm94O2lmKGEpe2EuY2hlY2tlZD0oYj09 PXVuZGVmaW5lZD8hYS5jaGVja2VkOmIpO3RoaXMub25DaGVja0NoYW5nZSgpfX0s Ymx1cjpmdW5jdGlvbigpe3RyeXt0aGlzLmFuY2hvci5ibHVyKCl9Y2F0Y2goYSl7 fX0sYW5pbUV4cGFuZDpmdW5jdGlvbihiKXt2YXIgYT1FeHQuZ2V0KHRoaXMuY3RO b2RlKTthLnN0b3BGeCgpO2lmKCF0aGlzLm5vZGUuaXNFeHBhbmRhYmxlKCkpe3Ro aXMudXBkYXRlRXhwYW5kSWNvbigpO3RoaXMuY3ROb2RlLnN0eWxlLmRpc3BsYXk9 IiI7RXh0LmNhbGxiYWNrKGIpO3JldHVybn10aGlzLmFuaW1hdGluZz10cnVlO3Ro aXMudXBkYXRlRXhwYW5kSWNvbigpO2Euc2xpZGVJbigidCIse2NhbGxiYWNrOmZ1 bmN0aW9uKCl7dGhpcy5hbmltYXRpbmc9ZmFsc2U7RXh0LmNhbGxiYWNrKGIpfSxz Y29wZTp0aGlzLGR1cmF0aW9uOnRoaXMubm9kZS5vd25lclRyZWUuZHVyYXRpb258 fDAuMjV9KX0saGlnaGxpZ2h0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ub2RlLmdl dE93bmVyVHJlZSgpO0V4dC5mbHkodGhpcy53cmFwKS5oaWdobGlnaHQoYS5obENv bG9yfHwiQzNEQUY5Iix7ZW5kQ29sb3I6YS5obEJhc2VDb2xvcn0pfSxjb2xsYXBz ZTpmdW5jdGlvbigpe3RoaXMudXBkYXRlRXhwYW5kSWNvbigpO3RoaXMuY3ROb2Rl LnN0eWxlLmRpc3BsYXk9Im5vbmUifSxhbmltQ29sbGFwc2U6ZnVuY3Rpb24oYil7 dmFyIGE9RXh0LmdldCh0aGlzLmN0Tm9kZSk7YS5lbmFibGVEaXNwbGF5TW9kZSgi YmxvY2siKTthLnN0b3BGeCgpO3RoaXMuYW5pbWF0aW5nPXRydWU7dGhpcy51cGRh dGVFeHBhbmRJY29uKCk7YS5zbGlkZU91dCgidCIse2NhbGxiYWNrOmZ1bmN0aW9u KCl7dGhpcy5hbmltYXRpbmc9ZmFsc2U7RXh0LmNhbGxiYWNrKGIpfSxzY29wZTp0 aGlzLGR1cmF0aW9uOnRoaXMubm9kZS5vd25lclRyZWUuZHVyYXRpb258fDAuMjV9 KX0sZ2V0Q29udGFpbmVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3ROb2RlfSxn ZXRFbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndyYXB9LGFwcGVuZERER2hvc3Q6 ZnVuY3Rpb24oYSl7YS5hcHBlbmRDaGlsZCh0aGlzLmVsTm9kZS5jbG9uZU5vZGUo dHJ1ZSkpfSxnZXRERFJlcGFpclhZOmZ1bmN0aW9uKCl7cmV0dXJuIEV4dC5saWIu RG9tLmdldFhZKHRoaXMuaWNvbk5vZGUpfSxvblJlbmRlcjpmdW5jdGlvbigpe3Ro aXMucmVuZGVyKCl9LHJlbmRlcjpmdW5jdGlvbihjKXt2YXIgZT10aGlzLm5vZGUs Yj1lLmF0dHJpYnV0ZXM7dmFyIGQ9ZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS51 aS5nZXRDb250YWluZXIoKTplLm93bmVyVHJlZS5pbm5lckN0LmRvbTtpZighdGhp cy5yZW5kZXJlZCl7dGhpcy5yZW5kZXJlZD10cnVlO3RoaXMucmVuZGVyRWxlbWVu dHMoZSxiLGQsYyk7aWYoYi5xdGlwKXt0aGlzLm9uVGlwQ2hhbmdlKGUsYi5xdGlw LGIucXRpcFRpdGxlKX1lbHNle2lmKGIucXRpcENmZyl7Yi5xdGlwQ2ZnLnRhcmdl dD1FeHQuaWQodGhpcy50ZXh0Tm9kZSk7RXh0LlF1aWNrVGlwcy5yZWdpc3Rlcihi LnF0aXBDZmcpfX10aGlzLmluaXRFdmVudHMoKTtpZighdGhpcy5ub2RlLmV4cGFu ZGVkKXt0aGlzLnVwZGF0ZUV4cGFuZEljb24odHJ1ZSl9fWVsc2V7aWYoYz09PXRy dWUpe2QuYXBwZW5kQ2hpbGQodGhpcy53cmFwKX19fSxyZW5kZXJFbGVtZW50czpm dW5jdGlvbihlLGssaixsKXt0aGlzLmluZGVudE1hcmt1cD1lLnBhcmVudE5vZGU/ ZS5wYXJlbnROb2RlLnVpLmdldENoaWxkSW5kZW50KCk6IiI7dmFyIGc9RXh0Lmlz Qm9vbGVhbihrLmNoZWNrZWQpLGIsYz10aGlzLmdldEhyZWYoay5ocmVmKSxkPVsn PGxpIGNsYXNzPSJ4LXRyZWUtbm9kZSI+PGRpdiBleHQ6dHJlZS1ub2RlLWlkPSIn LGUuaWQsJyIgY2xhc3M9IngtdHJlZS1ub2RlLWVsIHgtdHJlZS1ub2RlLWxlYWYg eC11bnNlbGVjdGFibGUgJyxrLmNscywnIiB1bnNlbGVjdGFibGU9Im9uIj4nLCc8 c3BhbiBjbGFzcz0ieC10cmVlLW5vZGUtaW5kZW50Ij4nLHRoaXMuaW5kZW50TWFy a3VwLCI8L3NwYW4+IiwnPGltZyBhbHQ9IiIgc3JjPSInLHRoaXMuZW1wdHlJY29u LCciIGNsYXNzPSJ4LXRyZWUtZWMtaWNvbiB4LXRyZWUtZWxib3ciIC8+JywnPGlt ZyBhbHQ9IiIgc3JjPSInLGsuaWNvbnx8dGhpcy5lbXB0eUljb24sJyIgY2xhc3M9 IngtdHJlZS1ub2RlLWljb24nLChrLmljb24/IiB4LXRyZWUtbm9kZS1pbmxpbmUt aWNvbiI6IiIpLChrLmljb25DbHM/IiAiK2suaWNvbkNsczoiIiksJyIgdW5zZWxl Y3RhYmxlPSJvbiIgLz4nLGc/KCc8aW5wdXQgY2xhc3M9IngtdHJlZS1ub2RlLWNi IiB0eXBlPSJjaGVja2JveCIgJysoay5jaGVja2VkPydjaGVja2VkPSJjaGVja2Vk IiAvPic6Ii8+IikpOiIiLCc8YSBoaWRlZm9jdXM9Im9uIiBjbGFzcz0ieC10cmVl LW5vZGUtYW5jaG9yIiBocmVmPSInLGMsJyIgdGFiSW5kZXg9IjEiICcsay5ocmVm VGFyZ2V0PycgdGFyZ2V0PSInK2suaHJlZlRhcmdldCsnIic6IiIsJz48c3BhbiB1 bnNlbGVjdGFibGU9Im9uIj4nLGUudGV4dCwiPC9zcGFuPjwvYT48L2Rpdj4iLCc8 dWwgY2xhc3M9IngtdHJlZS1ub2RlLWN0IiBzdHlsZT0iZGlzcGxheTpub25lOyI+ PC91bD4nLCI8L2xpPiJdLmpvaW4oIiIpO2lmKGwhPT10cnVlJiZlLm5leHRTaWJs aW5nJiYoYj1lLm5leHRTaWJsaW5nLnVpLmdldEVsKCkpKXt0aGlzLndyYXA9RXh0 LkRvbUhlbHBlci5pbnNlcnRIdG1sKCJiZWZvcmVCZWdpbiIsYixkKX1lbHNle3Ro aXMud3JhcD1FeHQuRG9tSGVscGVyLmluc2VydEh0bWwoImJlZm9yZUVuZCIsaixk KX10aGlzLmVsTm9kZT10aGlzLndyYXAuY2hpbGROb2Rlc1swXTt0aGlzLmN0Tm9k ZT10aGlzLndyYXAuY2hpbGROb2Rlc1sxXTt2YXIgaT10aGlzLmVsTm9kZS5jaGls ZE5vZGVzO3RoaXMuaW5kZW50Tm9kZT1pWzBdO3RoaXMuZWNOb2RlPWlbMV07dGhp cy5pY29uTm9kZT1pWzJdO3ZhciBoPTM7aWYoZyl7dGhpcy5jaGVja2JveD1pWzNd O3RoaXMuY2hlY2tib3guZGVmYXVsdENoZWNrZWQ9dGhpcy5jaGVja2JveC5jaGVj a2VkO2grK310aGlzLmFuY2hvcj1pW2hdO3RoaXMudGV4dE5vZGU9aVtoXS5maXJz dENoaWxkfSxnZXRIcmVmOmZ1bmN0aW9uKGEpe3JldHVybiBFeHQuaXNFbXB0eShh KT8oRXh0LmlzR2Vja28/IiI6IiMiKTphfSxnZXRBbmNob3I6ZnVuY3Rpb24oKXty ZXR1cm4gdGhpcy5hbmNob3J9LGdldFRleHRFbDpmdW5jdGlvbigpe3JldHVybiB0 aGlzLnRleHROb2RlfSxnZXRJY29uRWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5p Y29uTm9kZX0saXNDaGVja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hlY2ti b3g/dGhpcy5jaGVja2JveC5jaGVja2VkOmZhbHNlfSx1cGRhdGVFeHBhbmRJY29u OmZ1bmN0aW9uKCl7aWYodGhpcy5yZW5kZXJlZCl7dmFyIGc9dGhpcy5ub2RlLGQs YyxhPWcuaXNMYXN0KCk/IngtdHJlZS1lbGJvdy1lbmQiOiJ4LXRyZWUtZWxib3ci LGU9Zy5oYXNDaGlsZE5vZGVzKCk7aWYoZXx8Zy5hdHRyaWJ1dGVzLmV4cGFuZGFi bGUpe2lmKGcuZXhwYW5kZWQpe2ErPSItbWludXMiO2Q9IngtdHJlZS1ub2RlLWNv bGxhcHNlZCI7Yz0ieC10cmVlLW5vZGUtZXhwYW5kZWQifWVsc2V7YSs9Ii1wbHVz IjtkPSJ4LXRyZWUtbm9kZS1leHBhbmRlZCI7Yz0ieC10cmVlLW5vZGUtY29sbGFw c2VkIn1pZih0aGlzLndhc0xlYWYpe3RoaXMucmVtb3ZlQ2xhc3MoIngtdHJlZS1u b2RlLWxlYWYiKTt0aGlzLndhc0xlYWY9ZmFsc2V9aWYodGhpcy5jMSE9ZHx8dGhp cy5jMiE9Yyl7RXh0LmZseSh0aGlzLmVsTm9kZSkucmVwbGFjZUNsYXNzKGQsYyk7 dGhpcy5jMT1kO3RoaXMuYzI9Y319ZWxzZXtpZighdGhpcy53YXNMZWFmKXtFeHQu Zmx5KHRoaXMuZWxOb2RlKS5yZXBsYWNlQ2xhc3MoIngtdHJlZS1ub2RlLWV4cGFu ZGVkIiwieC10cmVlLW5vZGUtY29sbGFwc2VkIik7ZGVsZXRlIHRoaXMuYzE7ZGVs ZXRlIHRoaXMuYzI7dGhpcy53YXNMZWFmPXRydWV9fXZhciBiPSJ4LXRyZWUtZWMt aWNvbiAiK2E7aWYodGhpcy5lY2MhPWIpe3RoaXMuZWNOb2RlLmNsYXNzTmFtZT1i O3RoaXMuZWNjPWJ9fX0sb25JZENoYW5nZTpmdW5jdGlvbihhKXtpZih0aGlzLnJl bmRlcmVkKXt0aGlzLmVsTm9kZS5zZXRBdHRyaWJ1dGUoImV4dDp0cmVlLW5vZGUt aWQiLGEpfX0sZ2V0Q2hpbGRJbmRlbnQ6ZnVuY3Rpb24oKXtpZighdGhpcy5jaGls ZEluZGVudCl7dmFyIGE9W10sYj10aGlzLm5vZGU7d2hpbGUoYil7aWYoIWIuaXNS b290fHwoYi5pc1Jvb3QmJmIub3duZXJUcmVlLnJvb3RWaXNpYmxlKSl7aWYoIWIu aXNMYXN0KCkpe2EudW5zaGlmdCgnPGltZyBhbHQ9IiIgc3JjPSInK3RoaXMuZW1w dHlJY29uKyciIGNsYXNzPSJ4LXRyZWUtZWxib3ctbGluZSIgLz4nKX1lbHNle2Eu dW5zaGlmdCgnPGltZyBhbHQ9IiIgc3JjPSInK3RoaXMuZW1wdHlJY29uKyciIGNs YXNzPSJ4LXRyZWUtaWNvbiIgLz4nKX19Yj1iLnBhcmVudE5vZGV9dGhpcy5jaGls ZEluZGVudD1hLmpvaW4oIiIpfXJldHVybiB0aGlzLmNoaWxkSW5kZW50fSxyZW5k ZXJJbmRlbnQ6ZnVuY3Rpb24oKXtpZih0aGlzLnJlbmRlcmVkKXt2YXIgYT0iIixi PXRoaXMubm9kZS5wYXJlbnROb2RlO2lmKGIpe2E9Yi51aS5nZXRDaGlsZEluZGVu dCgpfWlmKHRoaXMuaW5kZW50TWFya3VwIT1hKXt0aGlzLmluZGVudE5vZGUuaW5u ZXJIVE1MPWE7dGhpcy5pbmRlbnRNYXJrdXA9YX10aGlzLnVwZGF0ZUV4cGFuZElj b24oKX19LGRlc3Ryb3k6ZnVuY3Rpb24oKXtpZih0aGlzLmVsTm9kZSl7RXh0LmRk LlJlZ2lzdHJ5LnVucmVnaXN0ZXIodGhpcy5lbE5vZGUuaWQpfUV4dC5lYWNoKFsi dGV4dG5vZGUiLCJhbmNob3IiLCJjaGVja2JveCIsImluZGVudE5vZGUiLCJlY05v ZGUiLCJpY29uTm9kZSIsImVsTm9kZSIsImN0Tm9kZSIsIndyYXAiLCJob2xkZXIi XSxmdW5jdGlvbihhKXtpZih0aGlzW2FdKXtFeHQuZmx5KHRoaXNbYV0pLnJlbW92 ZSgpO2RlbGV0ZSB0aGlzW2FdfX0sdGhpcyk7ZGVsZXRlIHRoaXMubm9kZX19KTtF eHQudHJlZS5Sb290VHJlZU5vZGVVST1FeHQuZXh0ZW5kKEV4dC50cmVlLlRyZWVO b2RlVUkse3JlbmRlcjpmdW5jdGlvbigpe2lmKCF0aGlzLnJlbmRlcmVkKXt2YXIg YT10aGlzLm5vZGUub3duZXJUcmVlLmlubmVyQ3QuZG9tO3RoaXMubm9kZS5leHBh bmRlZD10cnVlO2EuaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJ4LXRyZWUtcm9vdC1u b2RlIj48L2Rpdj4nO3RoaXMud3JhcD10aGlzLmN0Tm9kZT1hLmZpcnN0Q2hpbGR9 fSxjb2xsYXBzZTpFeHQuZW1wdHlGbixleHBhbmQ6RXh0LmVtcHR5Rm59KTtFeHQu dHJlZS5UcmVlTG9hZGVyPWZ1bmN0aW9uKGEpe3RoaXMuYmFzZVBhcmFtcz17fTtF eHQuYXBwbHkodGhpcyxhKTt0aGlzLmFkZEV2ZW50cygiYmVmb3JlbG9hZCIsImxv YWQiLCJsb2FkZXhjZXB0aW9uIik7RXh0LnRyZWUuVHJlZUxvYWRlci5zdXBlcmNs YXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7aWYoRXh0LmlzU3RyaW5nKHRoaXMu cGFyYW1PcmRlcikpe3RoaXMucGFyYW1PcmRlcj10aGlzLnBhcmFtT3JkZXIuc3Bs aXQoL1tccyx8XS8pfX07RXh0LmV4dGVuZChFeHQudHJlZS5UcmVlTG9hZGVyLEV4 dC51dGlsLk9ic2VydmFibGUse3VpUHJvdmlkZXJzOnt9LGNsZWFyT25Mb2FkOnRy dWUscGFyYW1PcmRlcjp1bmRlZmluZWQscGFyYW1zQXNIYXNoOmZhbHNlLG5vZGVQ YXJhbWV0ZXI6Im5vZGUiLGRpcmVjdEZuOnVuZGVmaW5lZCxsb2FkOmZ1bmN0aW9u KGIsYyxhKXtpZih0aGlzLmNsZWFyT25Mb2FkKXt3aGlsZShiLmZpcnN0Q2hpbGQp e2IucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX19aWYodGhpcy5kb1ByZWxvYWQo Yikpe3RoaXMucnVuQ2FsbGJhY2soYyxhfHxiLFtiXSl9ZWxzZXtpZih0aGlzLmRp cmVjdEZufHx0aGlzLmRhdGFVcmx8fHRoaXMudXJsKXt0aGlzLnJlcXVlc3REYXRh KGIsYyxhfHxiKX19fSxkb1ByZWxvYWQ6ZnVuY3Rpb24oZCl7aWYoZC5hdHRyaWJ1 dGVzLmNoaWxkcmVuKXtpZihkLmNoaWxkTm9kZXMubGVuZ3RoPDEpe3ZhciBjPWQu YXR0cmlidXRlcy5jaGlsZHJlbjtkLmJlZ2luVXBkYXRlKCk7Zm9yKHZhciBiPTAs YT1jLmxlbmd0aDtiPGE7YisrKXt2YXIgZT1kLmFwcGVuZENoaWxkKHRoaXMuY3Jl YXRlTm9kZShjW2JdKSk7aWYodGhpcy5wcmVsb2FkQ2hpbGRyZW4pe3RoaXMuZG9Q cmVsb2FkKGUpfX1kLmVuZFVwZGF0ZSgpfXJldHVybiB0cnVlfXJldHVybiBmYWxz ZX0sZ2V0UGFyYW1zOmZ1bmN0aW9uKGcpe3ZhciBlPUV4dC5hcHBseSh7fSx0aGlz LmJhc2VQYXJhbXMpLGg9dGhpcy5ub2RlUGFyYW1ldGVyLGI9dGhpcy5wYXJhbU9y ZGVyO2gmJihlW2hdPWcuaWQpO2lmKHRoaXMuZGlyZWN0Rm4pe3ZhciBjPVtnLmlk XTtpZihiKXtpZihoJiZiLmluZGV4T2YoaCk+LTEpe2M9W119Zm9yKHZhciBkPTAs YT1iLmxlbmd0aDtkPGE7ZCsrKXtjLnB1c2goZVtiW2RdXSl9fWVsc2V7aWYodGhp cy5wYXJhbXNBc0hhc2gpe2M9W2VdfX1yZXR1cm4gY31lbHNle3JldHVybiBlfX0s cmVxdWVzdERhdGE6ZnVuY3Rpb24oYyxkLGIpe2lmKHRoaXMuZmlyZUV2ZW50KCJi ZWZvcmVsb2FkIix0aGlzLGMsZCkhPT1mYWxzZSl7aWYodGhpcy5kaXJlY3RGbil7 dmFyIGE9dGhpcy5nZXRQYXJhbXMoYyk7YS5wdXNoKHRoaXMucHJvY2Vzc0RpcmVj dFJlc3BvbnNlLmNyZWF0ZURlbGVnYXRlKHRoaXMsW3tjYWxsYmFjazpkLG5vZGU6 YyxzY29wZTpifV0sdHJ1ZSkpO3RoaXMuZGlyZWN0Rm4uYXBwbHkod2luZG93LGEp fWVsc2V7dGhpcy50cmFuc0lkPUV4dC5BamF4LnJlcXVlc3Qoe21ldGhvZDp0aGlz LnJlcXVlc3RNZXRob2QsdXJsOnRoaXMuZGF0YVVybHx8dGhpcy51cmwsc3VjY2Vz czp0aGlzLmhhbmRsZVJlc3BvbnNlLGZhaWx1cmU6dGhpcy5oYW5kbGVGYWlsdXJl LHNjb3BlOnRoaXMsYXJndW1lbnQ6e2NhbGxiYWNrOmQsbm9kZTpjLHNjb3BlOmJ9 LHBhcmFtczp0aGlzLmdldFBhcmFtcyhjKX0pfX1lbHNle3RoaXMucnVuQ2FsbGJh Y2soZCxifHxjLFtdKX19LHByb2Nlc3NEaXJlY3RSZXNwb25zZTpmdW5jdGlvbihh LGIsYyl7aWYoYi5zdGF0dXMpe3RoaXMuaGFuZGxlUmVzcG9uc2Uoe3Jlc3BvbnNl RGF0YTpFeHQuaXNBcnJheShhKT9hOm51bGwscmVzcG9uc2VUZXh0OmEsYXJndW1l bnQ6Y30pfWVsc2V7dGhpcy5oYW5kbGVGYWlsdXJlKHthcmd1bWVudDpjfSl9fSxy dW5DYWxsYmFjazpmdW5jdGlvbihhLGMsYil7aWYoRXh0LmlzRnVuY3Rpb24oYSkp e2EuYXBwbHkoYyxiKX19LGlzTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiAhIXRo aXMudHJhbnNJZH0sYWJvcnQ6ZnVuY3Rpb24oKXtpZih0aGlzLmlzTG9hZGluZygp KXtFeHQuQWpheC5hYm9ydCh0aGlzLnRyYW5zSWQpfX0sY3JlYXRlTm9kZTpmdW5j dGlvbihhdHRyKXtpZih0aGlzLmJhc2VBdHRycyl7RXh0LmFwcGx5SWYoYXR0cix0 aGlzLmJhc2VBdHRycyl9aWYodGhpcy5hcHBseUxvYWRlciE9PWZhbHNlJiYhYXR0 ci5sb2FkZXIpe2F0dHIubG9hZGVyPXRoaXN9aWYoRXh0LmlzU3RyaW5nKGF0dHIu dWlQcm92aWRlcikpe2F0dHIudWlQcm92aWRlcj10aGlzLnVpUHJvdmlkZXJzW2F0 dHIudWlQcm92aWRlcl18fGV2YWwoYXR0ci51aVByb3ZpZGVyKX1pZihhdHRyLm5v ZGVUeXBlKXtyZXR1cm4gbmV3IEV4dC50cmVlLlRyZWVQYW5lbC5ub2RlVHlwZXNb YXR0ci5ub2RlVHlwZV0oYXR0cil9ZWxzZXtyZXR1cm4gYXR0ci5sZWFmP25ldyBF eHQudHJlZS5UcmVlTm9kZShhdHRyKTpuZXcgRXh0LnRyZWUuQXN5bmNUcmVlTm9k ZShhdHRyKX19LHByb2Nlc3NSZXNwb25zZTpmdW5jdGlvbihkLGMsayxsKXt2YXIg bT1kLnJlc3BvbnNlVGV4dDt0cnl7dmFyIGE9ZC5yZXNwb25zZURhdGF8fEV4dC5k ZWNvZGUobSk7Yy5iZWdpblVwZGF0ZSgpO2Zvcih2YXIgZz0wLGg9YS5sZW5ndGg7 ZzxoO2crKyl7dmFyIGI9dGhpcy5jcmVhdGVOb2RlKGFbZ10pO2lmKGIpe2MuYXBw ZW5kQ2hpbGQoYil9fWMuZW5kVXBkYXRlKCk7dGhpcy5ydW5DYWxsYmFjayhrLGx8 fGMsW2NdKX1jYXRjaChqKXt0aGlzLmhhbmRsZUZhaWx1cmUoZCl9fSxoYW5kbGVS ZXNwb25zZTpmdW5jdGlvbihjKXt0aGlzLnRyYW5zSWQ9ZmFsc2U7dmFyIGI9Yy5h cmd1bWVudDt0aGlzLnByb2Nlc3NSZXNwb25zZShjLGIubm9kZSxiLmNhbGxiYWNr LGIuc2NvcGUpO3RoaXMuZmlyZUV2ZW50KCJsb2FkIix0aGlzLGIubm9kZSxjKX0s aGFuZGxlRmFpbHVyZTpmdW5jdGlvbihjKXt0aGlzLnRyYW5zSWQ9ZmFsc2U7dmFy IGI9Yy5hcmd1bWVudDt0aGlzLmZpcmVFdmVudCgibG9hZGV4Y2VwdGlvbiIsdGhp cyxiLm5vZGUsYyk7dGhpcy5ydW5DYWxsYmFjayhiLmNhbGxiYWNrLGIuc2NvcGV8 fGIubm9kZSxbYi5ub2RlXSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmFib3J0 KCk7dGhpcy5wdXJnZUxpc3RlbmVycygpfX0pO0V4dC50cmVlLlRyZWVGaWx0ZXI9 ZnVuY3Rpb24oYSxiKXt0aGlzLnRyZWU9YTt0aGlzLmZpbHRlcmVkPXt9O0V4dC5h cHBseSh0aGlzLGIpfTtFeHQudHJlZS5UcmVlRmlsdGVyLnByb3RvdHlwZT17Y2xl YXJCbGFuazpmYWxzZSxyZXZlcnNlOmZhbHNlLGF1dG9DbGVhcjpmYWxzZSxyZW1v dmU6ZmFsc2UsZmlsdGVyOmZ1bmN0aW9uKGQsYSxiKXthPWF8fCJ0ZXh0Ijt2YXIg YztpZih0eXBlb2YgZD09InN0cmluZyIpe3ZhciBlPWQubGVuZ3RoO2lmKGU9PTAm JnRoaXMuY2xlYXJCbGFuayl7dGhpcy5jbGVhcigpO3JldHVybn1kPWQudG9Mb3dl ckNhc2UoKTtjPWZ1bmN0aW9uKGcpe3JldHVybiBnLmF0dHJpYnV0ZXNbYV0uc3Vi c3RyKDAsZSkudG9Mb3dlckNhc2UoKT09ZH19ZWxzZXtpZihkLmV4ZWMpe2M9ZnVu Y3Rpb24oZyl7cmV0dXJuIGQudGVzdChnLmF0dHJpYnV0ZXNbYV0pfX1lbHNle3Ro cm93IklsbGVnYWwgZmlsdGVyIHR5cGUsIG11c3QgYmUgc3RyaW5nIG9yIHJlZ2V4 In19dGhpcy5maWx0ZXJCeShjLG51bGwsYil9LGZpbHRlckJ5OmZ1bmN0aW9uKGQs YyxiKXtiPWJ8fHRoaXMudHJlZS5yb290O2lmKHRoaXMuYXV0b0NsZWFyKXt0aGlz LmNsZWFyKCl9dmFyIGE9dGhpcy5maWx0ZXJlZCxpPXRoaXMucmV2ZXJzZTt2YXIg ZT1mdW5jdGlvbihrKXtpZihrPT1iKXtyZXR1cm4gdHJ1ZX1pZihhW2suaWRdKXty ZXR1cm4gZmFsc2V9dmFyIGo9ZC5jYWxsKGN8fGssayk7aWYoIWp8fGkpe2Fbay5p ZF09aztrLnVpLmhpZGUoKTtyZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9O2IuY2Fz Y2FkZShlKTtpZih0aGlzLnJlbW92ZSl7Zm9yKHZhciBoIGluIGEpe2lmKHR5cGVv ZiBoIT0iZnVuY3Rpb24iKXt2YXIgZz1hW2hdO2lmKGcmJmcucGFyZW50Tm9kZSl7 Zy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGcpfX19fX0sY2xlYXI6ZnVuY3Rpb24o KXt2YXIgYj10aGlzLnRyZWU7dmFyIGE9dGhpcy5maWx0ZXJlZDtmb3IodmFyIGQg aW4gYSl7aWYodHlwZW9mIGQhPSJmdW5jdGlvbiIpe3ZhciBjPWFbZF07aWYoYyl7 Yy51aS5zaG93KCl9fX10aGlzLmZpbHRlcmVkPXt9fX07RXh0LnRyZWUuVHJlZVNv cnRlcj1FeHQuZXh0ZW5kKE9iamVjdCx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxj KXtFeHQuYXBwbHkodGhpcyxjKTthLm9uKHtzY29wZTp0aGlzLGJlZm9yZWNoaWxk cmVucmVuZGVyZWQ6dGhpcy5kb1NvcnQsYXBwZW5kOnRoaXMudXBkYXRlU29ydCxp bnNlcnQ6dGhpcy51cGRhdGVTb3J0LHRleHRjaGFuZ2U6dGhpcy51cGRhdGVTb3J0 UGFyZW50fSk7dmFyIGU9dGhpcy5kaXImJnRoaXMuZGlyLnRvTG93ZXJDYXNlKCk9 PSJkZXNjIixpPXRoaXMucHJvcGVydHl8fCJ0ZXh0IixkPXRoaXMuc29ydFR5cGUs aD10aGlzLmZvbGRlclNvcnQsYj10aGlzLmNhc2VTZW5zaXRpdmU9PT10cnVlLGc9 dGhpcy5sZWFmQXR0cnx8ImxlYWYiO2lmKEV4dC5pc1N0cmluZyhkKSl7ZD1FeHQu ZGF0YS5Tb3J0VHlwZXNbZF19dGhpcy5zb3J0Rm49ZnVuY3Rpb24obyxtKXt2YXIg az1vLmF0dHJpYnV0ZXMsaj1tLmF0dHJpYnV0ZXM7aWYoaCl7aWYoa1tnXSYmIWpb Z10pe3JldHVybiAxfWlmKCFrW2ddJiZqW2ddKXtyZXR1cm4gLTF9fXZhciBuPWtb aV0sbD1qW2ldLHE9ZD9kKG4pOihiP246bi50b1VwcGVyQ2FzZSgpKSxwPWQ/ZChs KTooYj9sOmwudG9VcHBlckNhc2UoKSk7aWYocTxwKXtyZXR1cm4gZT8xOi0xfWVs c2V7aWYocT5wKXtyZXR1cm4gZT8tMToxfX1yZXR1cm4gMH19LGRvU29ydDpmdW5j dGlvbihhKXthLnNvcnQodGhpcy5zb3J0Rm4pfSx1cGRhdGVTb3J0OmZ1bmN0aW9u KGEsYil7aWYoYi5jaGlsZHJlblJlbmRlcmVkKXt0aGlzLmRvU29ydC5kZWZlcigx LHRoaXMsW2JdKX19LHVwZGF0ZVNvcnRQYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9 YS5wYXJlbnROb2RlO2lmKGImJmIuY2hpbGRyZW5SZW5kZXJlZCl7dGhpcy5kb1Nv cnQuZGVmZXIoMSx0aGlzLFtiXSl9fX0pO2lmKEV4dC5kZC5Ecm9wWm9uZSl7RXh0 LnRyZWUuVHJlZURyb3Bab25lPWZ1bmN0aW9uKGEsYil7dGhpcy5hbGxvd1BhcmVu dEluc2VydD1iLmFsbG93UGFyZW50SW5zZXJ0fHxmYWxzZTt0aGlzLmFsbG93Q29u dGFpbmVyRHJvcD1iLmFsbG93Q29udGFpbmVyRHJvcHx8ZmFsc2U7dGhpcy5hcHBl bmRPbmx5PWIuYXBwZW5kT25seXx8ZmFsc2U7RXh0LnRyZWUuVHJlZURyb3Bab25l LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEuZ2V0VHJlZUVsKCks Yik7dGhpcy50cmVlPWE7dGhpcy5kcmFnT3ZlckRhdGE9e307dGhpcy5sYXN0SW5z ZXJ0Q2xhc3M9IngtdHJlZS1uby1zdGF0dXMifTtFeHQuZXh0ZW5kKEV4dC50cmVl LlRyZWVEcm9wWm9uZSxFeHQuZGQuRHJvcFpvbmUse2RkR3JvdXA6IlRyZWVERCIs ZXhwYW5kRGVsYXk6MTAwMCxleHBhbmROb2RlOmZ1bmN0aW9uKGEpe2lmKGEuaGFz Q2hpbGROb2RlcygpJiYhYS5pc0V4cGFuZGVkKCkpe2EuZXhwYW5kKGZhbHNlLG51 bGwsdGhpcy50cmlnZ2VyQ2FjaGVSZWZyZXNoLmNyZWF0ZURlbGVnYXRlKHRoaXMp KX19LHF1ZXVlRXhwYW5kOmZ1bmN0aW9uKGEpe3RoaXMuZXhwYW5kUHJvY0lkPXRo aXMuZXhwYW5kTm9kZS5kZWZlcih0aGlzLmV4cGFuZERlbGF5LHRoaXMsW2FdKX0s Y2FuY2VsRXhwYW5kOmZ1bmN0aW9uKCl7aWYodGhpcy5leHBhbmRQcm9jSWQpe2Ns ZWFyVGltZW91dCh0aGlzLmV4cGFuZFByb2NJZCk7dGhpcy5leHBhbmRQcm9jSWQ9 ZmFsc2V9fSxpc1ZhbGlkRHJvcFBvaW50OmZ1bmN0aW9uKGEsayxpLGQsYyl7aWYo IWF8fCFjKXtyZXR1cm4gZmFsc2V9dmFyIGc9YS5ub2RlO3ZhciBoPWMubm9kZTtp ZighKGcmJmcuaXNUYXJnZXQmJmspKXtyZXR1cm4gZmFsc2V9aWYoaz09ImFwcGVu ZCImJmcuYWxsb3dDaGlsZHJlbj09PWZhbHNlKXtyZXR1cm4gZmFsc2V9aWYoKGs9 PSJhYm92ZSJ8fGs9PSJiZWxvdyIpJiYoZy5wYXJlbnROb2RlJiZnLnBhcmVudE5v ZGUuYWxsb3dDaGlsZHJlbj09PWZhbHNlKSl7cmV0dXJuIGZhbHNlfWlmKGgmJihn PT1ofHxoLmNvbnRhaW5zKGcpKSl7cmV0dXJuIGZhbHNlfXZhciBiPXRoaXMuZHJh Z092ZXJEYXRhO2IudHJlZT10aGlzLnRyZWU7Yi50YXJnZXQ9ZztiLmRhdGE9Yzti LnBvaW50PWs7Yi5zb3VyY2U9aTtiLnJhd0V2ZW50PWQ7Yi5kcm9wTm9kZT1oO2Iu Y2FuY2VsPWZhbHNlO3ZhciBqPXRoaXMudHJlZS5maXJlRXZlbnQoIm5vZGVkcmFn b3ZlciIsYik7cmV0dXJuIGIuY2FuY2VsPT09ZmFsc2UmJmohPT1mYWxzZX0sZ2V0 RHJvcFBvaW50OmZ1bmN0aW9uKGgsZyxsKXt2YXIgbT1nLm5vZGU7aWYobS5pc1Jv b3Qpe3JldHVybiBtLmFsbG93Q2hpbGRyZW4hPT1mYWxzZT8iYXBwZW5kIjpmYWxz ZX12YXIgYz1nLmRkZWw7dmFyIG89RXh0LmxpYi5Eb20uZ2V0WShjKSxqPW8rYy5v ZmZzZXRIZWlnaHQ7dmFyIGk9RXh0LmxpYi5FdmVudC5nZXRQYWdlWShoKTt2YXIg az1tLmFsbG93Q2hpbGRyZW49PT1mYWxzZXx8bS5pc0xlYWYoKTtpZih0aGlzLmFw cGVuZE9ubHl8fG0ucGFyZW50Tm9kZS5hbGxvd0NoaWxkcmVuPT09ZmFsc2Upe3Jl dHVybiBrP2ZhbHNlOiJhcHBlbmQifXZhciBkPWZhbHNlO2lmKCF0aGlzLmFsbG93 UGFyZW50SW5zZXJ0KXtkPW0uaGFzQ2hpbGROb2RlcygpJiZtLmlzRXhwYW5kZWQo KX12YXIgYT0oai1vKS8oaz8yOjMpO2lmKGk+PW8mJmk8KG8rYSkpe3JldHVybiJh Ym92ZSJ9ZWxzZXtpZighZCYmKGt8fGk+PWotYSYmaTw9aikpe3JldHVybiJiZWxv dyJ9ZWxzZXtyZXR1cm4iYXBwZW5kIn19fSxvbk5vZGVFbnRlcjpmdW5jdGlvbihk LGEsYyxiKXt0aGlzLmNhbmNlbEV4cGFuZCgpfSxvbkNvbnRhaW5lck92ZXI6ZnVu Y3Rpb24oYSxjLGIpe2lmKHRoaXMuYWxsb3dDb250YWluZXJEcm9wJiZ0aGlzLmlz VmFsaWREcm9wUG9pbnQoe2RkZWw6dGhpcy50cmVlLmdldFJvb3ROb2RlKCkudWku ZWxOb2RlLG5vZGU6dGhpcy50cmVlLmdldFJvb3ROb2RlKCl9LCJhcHBlbmQiLGEs YyxiKSl7cmV0dXJuIHRoaXMuZHJvcEFsbG93ZWR9cmV0dXJuIHRoaXMuZHJvcE5v dEFsbG93ZWR9LG9uTm9kZU92ZXI6ZnVuY3Rpb24oYixpLGgsZyl7dmFyIGs9dGhp cy5nZXREcm9wUG9pbnQoaCxiLGkpO3ZhciBjPWIubm9kZTtpZighdGhpcy5leHBh bmRQcm9jSWQmJms9PSJhcHBlbmQiJiZjLmhhc0NoaWxkTm9kZXMoKSYmIWIubm9k ZS5pc0V4cGFuZGVkKCkpe3RoaXMucXVldWVFeHBhbmQoYyl9ZWxzZXtpZihrIT0i YXBwZW5kIil7dGhpcy5jYW5jZWxFeHBhbmQoKX19dmFyIGQ9dGhpcy5kcm9wTm90 QWxsb3dlZDtpZih0aGlzLmlzVmFsaWREcm9wUG9pbnQoYixrLGksaCxnKSl7aWYo ayl7dmFyIGE9Yi5kZGVsO3ZhciBqO2lmKGs9PSJhYm92ZSIpe2Q9Yi5ub2RlLmlz Rmlyc3QoKT8ieC10cmVlLWRyb3Atb2stYWJvdmUiOiJ4LXRyZWUtZHJvcC1vay1i ZXR3ZWVuIjtqPSJ4LXRyZWUtZHJhZy1pbnNlcnQtYWJvdmUifWVsc2V7aWYoaz09 ImJlbG93Iil7ZD1iLm5vZGUuaXNMYXN0KCk/IngtdHJlZS1kcm9wLW9rLWJlbG93 IjoieC10cmVlLWRyb3Atb2stYmV0d2VlbiI7aj0ieC10cmVlLWRyYWctaW5zZXJ0 LWJlbG93In1lbHNle2Q9IngtdHJlZS1kcm9wLW9rLWFwcGVuZCI7aj0ieC10cmVl LWRyYWctYXBwZW5kIn19aWYodGhpcy5sYXN0SW5zZXJ0Q2xhc3MhPWope0V4dC5m bHkoYSkucmVwbGFjZUNsYXNzKHRoaXMubGFzdEluc2VydENsYXNzLGopO3RoaXMu bGFzdEluc2VydENsYXNzPWp9fX1yZXR1cm4gZH0sb25Ob2RlT3V0OmZ1bmN0aW9u KGQsYSxjLGIpe3RoaXMuY2FuY2VsRXhwYW5kKCk7dGhpcy5yZW1vdmVEcm9wSW5k aWNhdG9ycyhkKX0sb25Ob2RlRHJvcDpmdW5jdGlvbihpLGIsaCxkKXt2YXIgYT10 aGlzLmdldERyb3BQb2ludChoLGksYik7dmFyIGc9aS5ub2RlO2cudWkuc3RhcnRE cm9wKCk7aWYoIXRoaXMuaXNWYWxpZERyb3BQb2ludChpLGEsYixoLGQpKXtnLnVp LmVuZERyb3AoKTtyZXR1cm4gZmFsc2V9dmFyIGM9ZC5ub2RlfHwoYi5nZXRUcmVl Tm9kZT9iLmdldFRyZWVOb2RlKGQsZyxhLGgpOm51bGwpO3JldHVybiB0aGlzLnBy b2Nlc3NEcm9wKGcsZCxhLGIsaCxjKX0sb25Db250YWluZXJEcm9wOmZ1bmN0aW9u KGEsZyxjKXtpZih0aGlzLmFsbG93Q29udGFpbmVyRHJvcCYmdGhpcy5pc1ZhbGlk RHJvcFBvaW50KHtkZGVsOnRoaXMudHJlZS5nZXRSb290Tm9kZSgpLnVpLmVsTm9k ZSxub2RlOnRoaXMudHJlZS5nZXRSb290Tm9kZSgpfSwiYXBwZW5kIixhLGcsYykp e3ZhciBkPXRoaXMudHJlZS5nZXRSb290Tm9kZSgpO2QudWkuc3RhcnREcm9wKCk7 dmFyIGI9Yy5ub2RlfHwoYS5nZXRUcmVlTm9kZT9hLmdldFRyZWVOb2RlKGMsZCwi YXBwZW5kIixnKTpudWxsKTtyZXR1cm4gdGhpcy5wcm9jZXNzRHJvcChkLGMsImFw cGVuZCIsYSxnLGIpfXJldHVybiBmYWxzZX0scHJvY2Vzc0Ryb3A6ZnVuY3Rpb24o aixoLGIsYSxpLGQpe3ZhciBnPXt0cmVlOnRoaXMudHJlZSx0YXJnZXQ6aixkYXRh OmgscG9pbnQ6Yixzb3VyY2U6YSxyYXdFdmVudDppLGRyb3BOb2RlOmQsY2FuY2Vs OiFkLGRyb3BTdGF0dXM6ZmFsc2V9O3ZhciBjPXRoaXMudHJlZS5maXJlRXZlbnQo ImJlZm9yZW5vZGVkcm9wIixnKTtpZihjPT09ZmFsc2V8fGcuY2FuY2VsPT09dHJ1 ZXx8IWcuZHJvcE5vZGUpe2oudWkuZW5kRHJvcCgpO3JldHVybiBnLmRyb3BTdGF0 dXN9aj1nLnRhcmdldDtpZihiPT0iYXBwZW5kIiYmIWouaXNFeHBhbmRlZCgpKXtq LmV4cGFuZChmYWxzZSxudWxsLGZ1bmN0aW9uKCl7dGhpcy5jb21wbGV0ZURyb3Ao Zyl9LmNyZWF0ZURlbGVnYXRlKHRoaXMpKX1lbHNle3RoaXMuY29tcGxldGVEcm9w KGcpfXJldHVybiB0cnVlfSxjb21wbGV0ZURyb3A6ZnVuY3Rpb24oaCl7dmFyIGQ9 aC5kcm9wTm9kZSxlPWgucG9pbnQsYz1oLnRhcmdldDtpZighRXh0LmlzQXJyYXko ZCkpe2Q9W2RdfXZhciBnO2Zvcih2YXIgYj0wLGE9ZC5sZW5ndGg7YjxhO2IrKyl7 Zz1kW2JdO2lmKGU9PSJhYm92ZSIpe2MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUo ZyxjKX1lbHNle2lmKGU9PSJiZWxvdyIpe2MucGFyZW50Tm9kZS5pbnNlcnRCZWZv cmUoZyxjLm5leHRTaWJsaW5nKX1lbHNle2MuYXBwZW5kQ2hpbGQoZyl9fX1nLnVp LmZvY3VzKCk7aWYoRXh0LmVuYWJsZUZ4JiZ0aGlzLnRyZWUuaGxEcm9wKXtnLnVp LmhpZ2hsaWdodCgpfWMudWkuZW5kRHJvcCgpO3RoaXMudHJlZS5maXJlRXZlbnQo Im5vZGVkcm9wIixoKX0sYWZ0ZXJOb2RlTW92ZWQ6ZnVuY3Rpb24oYSxjLGcsZCxi KXtpZihFeHQuZW5hYmxlRngmJnRoaXMudHJlZS5obERyb3Ape2IudWkuZm9jdXMo KTtiLnVpLmhpZ2hsaWdodCgpfXRoaXMudHJlZS5maXJlRXZlbnQoIm5vZGVkcm9w Iix0aGlzLnRyZWUsZCxjLGEsZyl9LGdldFRyZWU6ZnVuY3Rpb24oKXtyZXR1cm4g dGhpcy50cmVlfSxyZW1vdmVEcm9wSW5kaWNhdG9yczpmdW5jdGlvbihiKXtpZihi JiZiLmRkZWwpe3ZhciBhPWIuZGRlbDtFeHQuZmx5KGEpLnJlbW92ZUNsYXNzKFsi eC10cmVlLWRyYWctaW5zZXJ0LWFib3ZlIiwieC10cmVlLWRyYWctaW5zZXJ0LWJl bG93IiwieC10cmVlLWRyYWctYXBwZW5kIl0pO3RoaXMubGFzdEluc2VydENsYXNz PSJfbm9jbGFzcyJ9fSxiZWZvcmVEcmFnRHJvcDpmdW5jdGlvbihiLGEsYyl7dGhp cy5jYW5jZWxFeHBhbmQoKTtyZXR1cm4gdHJ1ZX0sYWZ0ZXJSZXBhaXI6ZnVuY3Rp b24oYSl7aWYoYSYmRXh0LmVuYWJsZUZ4KXthLm5vZGUudWkuaGlnaGxpZ2h0KCl9 dGhpcy5oaWRlUHJveHkoKX19KX1pZihFeHQuZGQuRHJhZ1pvbmUpe0V4dC50cmVl LlRyZWVEcmFnWm9uZT1mdW5jdGlvbihhLGIpe0V4dC50cmVlLlRyZWVEcmFnWm9u ZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhLmlubmVyQ3QsYik7 dGhpcy50cmVlPWF9O0V4dC5leHRlbmQoRXh0LnRyZWUuVHJlZURyYWdab25lLEV4 dC5kZC5EcmFnWm9uZSx7ZGRHcm91cDoiVHJlZUREIixvbkJlZm9yZURyYWc6ZnVu Y3Rpb24oYSxiKXt2YXIgYz1hLm5vZGU7cmV0dXJuIGMmJmMuZHJhZ2dhYmxlJiYh Yy5kaXNhYmxlZH0sb25Jbml0RHJhZzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmRy YWdEYXRhO3RoaXMudHJlZS5nZXRTZWxlY3Rpb25Nb2RlbCgpLnNlbGVjdChhLm5v ZGUpO3RoaXMudHJlZS5ldmVudE1vZGVsLmRpc2FibGUoKTt0aGlzLnByb3h5LnVw ZGF0ZSgiIik7YS5ub2RlLnVpLmFwcGVuZERER2hvc3QodGhpcy5wcm94eS5naG9z dC5kb20pO3RoaXMudHJlZS5maXJlRXZlbnQoInN0YXJ0ZHJhZyIsdGhpcy50cmVl LGEubm9kZSxiKX0sZ2V0UmVwYWlyWFk6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYS5u b2RlLnVpLmdldEREUmVwYWlyWFkoKX0sb25FbmREcmFnOmZ1bmN0aW9uKGEsYil7 dGhpcy50cmVlLmV2ZW50TW9kZWwuZW5hYmxlLmRlZmVyKDEwMCx0aGlzLnRyZWUu ZXZlbnRNb2RlbCk7dGhpcy50cmVlLmZpcmVFdmVudCgiZW5kZHJhZyIsdGhpcy50 cmVlLGEubm9kZSxiKX0sb25WYWxpZERyb3A6ZnVuY3Rpb24oYSxiLGMpe3RoaXMu dHJlZS5maXJlRXZlbnQoImRyYWdkcm9wIix0aGlzLnRyZWUsdGhpcy5kcmFnRGF0 YS5ub2RlLGEsYik7dGhpcy5oaWRlUHJveHkoKX0sYmVmb3JlSW52YWxpZERyb3A6 ZnVuY3Rpb24oYSxjKXt2YXIgYj10aGlzLnRyZWUuZ2V0U2VsZWN0aW9uTW9kZWwo KTtiLmNsZWFyU2VsZWN0aW9ucygpO2Iuc2VsZWN0KHRoaXMuZHJhZ0RhdGEubm9k ZSl9LGFmdGVyUmVwYWlyOmZ1bmN0aW9uKCl7aWYoRXh0LmVuYWJsZUZ4JiZ0aGlz LnRyZWUuaGxEcm9wKXtFeHQuRWxlbWVudC5mbHkodGhpcy5kcmFnRGF0YS5kZGVs KS5oaWdobGlnaHQodGhpcy5obENvbG9yfHwiYzNkYWY5Iil9dGhpcy5kcmFnZ2lu Zz1mYWxzZX19KX1FeHQudHJlZS5UcmVlRWRpdG9yPWZ1bmN0aW9uKGEsYyxiKXtj PWN8fHt9O3ZhciBkPWMuZXZlbnRzP2M6bmV3IEV4dC5mb3JtLlRleHRGaWVsZChj KTtFeHQudHJlZS5UcmVlRWRpdG9yLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2Fs bCh0aGlzLGQsYik7dGhpcy50cmVlPWE7aWYoIWEucmVuZGVyZWQpe2Eub24oInJl bmRlciIsdGhpcy5pbml0RWRpdG9yLHRoaXMpfWVsc2V7dGhpcy5pbml0RWRpdG9y KGEpfX07RXh0LmV4dGVuZChFeHQudHJlZS5UcmVlRWRpdG9yLEV4dC5FZGl0b3Is e2FsaWdubWVudDoibC1sIixhdXRvU2l6ZTpmYWxzZSxoaWRlRWw6ZmFsc2UsY2xz OiJ4LXNtYWxsLWVkaXRvciB4LXRyZWUtZWRpdG9yIixzaGltOmZhbHNlLHNoYWRv dzoiZnJhbWUiLG1heFdpZHRoOjI1MCxlZGl0RGVsYXk6MzUwLGluaXRFZGl0b3I6 ZnVuY3Rpb24oYSl7YS5vbih7c2NvcGU6dGhpcyxiZWZvcmVjbGljazp0aGlzLmJl Zm9yZU5vZGVDbGljayxkYmxjbGljazp0aGlzLm9uTm9kZURibENsaWNrfSk7dGhp cy5vbih7c2NvcGU6dGhpcyxjb21wbGV0ZTp0aGlzLnVwZGF0ZU5vZGUsYmVmb3Jl c3RhcnRlZGl0OnRoaXMuZml0VG9UcmVlLHNwZWNpYWxrZXk6dGhpcy5vblNwZWNp YWxLZXl9KTt0aGlzLm9uKCJzdGFydGVkaXQiLHRoaXMuYmluZFNjcm9sbCx0aGlz LHtkZWxheToxMH0pfSxmaXRUb1RyZWU6ZnVuY3Rpb24oYixjKXt2YXIgZT10aGlz LnRyZWUuZ2V0VHJlZUVsKCkuZG9tLGQ9Yy5kb207aWYoZS5zY3JvbGxMZWZ0PmQu b2Zmc2V0TGVmdCl7ZS5zY3JvbGxMZWZ0PWQub2Zmc2V0TGVmdH12YXIgYT1NYXRo Lm1pbih0aGlzLm1heFdpZHRoLChlLmNsaWVudFdpZHRoPjIwP2UuY2xpZW50V2lk dGg6ZS5vZmZzZXRXaWR0aCktTWF0aC5tYXgoMCxkLm9mZnNldExlZnQtZS5zY3Jv bGxMZWZ0KS01KTt0aGlzLnNldFNpemUoYSwiIil9LHRyaWdnZXJFZGl0OmZ1bmN0 aW9uKGEsYyl7dGhpcy5jb21wbGV0ZUVkaXQoKTtpZihhLmF0dHJpYnV0ZXMuZWRp dGFibGUhPT1mYWxzZSl7dGhpcy5lZGl0Tm9kZT1hO2lmKHRoaXMudHJlZS5hdXRv U2Nyb2xsKXtFeHQuZmx5KGEudWkuZ2V0RWwoKSkuc2Nyb2xsSW50b1ZpZXcodGhp cy50cmVlLmJvZHkpfXZhciBiPWEudGV4dHx8IiI7aWYoIUV4dC5pc0dlY2tvJiZF eHQuaXNFbXB0eShhLnRleHQpKXthLnNldFRleHQoIiYjMTYwOyIpfXRoaXMuYXV0 b0VkaXRUaW1lcj10aGlzLnN0YXJ0RWRpdC5kZWZlcih0aGlzLmVkaXREZWxheSx0 aGlzLFthLnVpLnRleHROb2RlLGJdKTtyZXR1cm4gZmFsc2V9fSxiaW5kU2Nyb2xs OmZ1bmN0aW9uKCl7dGhpcy50cmVlLmdldFRyZWVFbCgpLm9uKCJzY3JvbGwiLHRo aXMuY2FuY2VsRWRpdCx0aGlzKX0sYmVmb3JlTm9kZUNsaWNrOmZ1bmN0aW9uKGEs Yil7Y2xlYXJUaW1lb3V0KHRoaXMuYXV0b0VkaXRUaW1lcik7aWYodGhpcy50cmVl LmdldFNlbGVjdGlvbk1vZGVsKCkuaXNTZWxlY3RlZChhKSl7Yi5zdG9wRXZlbnQo KTtyZXR1cm4gdGhpcy50cmlnZ2VyRWRpdChhKX19LG9uTm9kZURibENsaWNrOmZ1 bmN0aW9uKGEsYil7Y2xlYXJUaW1lb3V0KHRoaXMuYXV0b0VkaXRUaW1lcil9LHVw ZGF0ZU5vZGU6ZnVuY3Rpb24oYSxiKXt0aGlzLnRyZWUuZ2V0VHJlZUVsKCkudW4o InNjcm9sbCIsdGhpcy5jYW5jZWxFZGl0LHRoaXMpO3RoaXMuZWRpdE5vZGUuc2V0 VGV4dChiKX0sb25IaWRlOmZ1bmN0aW9uKCl7RXh0LnRyZWUuVHJlZUVkaXRvci5z dXBlcmNsYXNzLm9uSGlkZS5jYWxsKHRoaXMpO2lmKHRoaXMuZWRpdE5vZGUpe3Ro aXMuZWRpdE5vZGUudWkuZm9jdXMuZGVmZXIoNTAsdGhpcy5lZGl0Tm9kZS51aSl9 fSxvblNwZWNpYWxLZXk6ZnVuY3Rpb24oYyxiKXt2YXIgYT1iLmdldEtleSgpO2lm KGE9PWIuRVNDKXtiLnN0b3BFdmVudCgpO3RoaXMuY2FuY2VsRWRpdCgpfWVsc2V7 aWYoYT09Yi5FTlRFUiYmIWIuaGFzTW9kaWZpZXIoKSl7Yi5zdG9wRXZlbnQoKTt0 aGlzLmNvbXBsZXRlRWRpdCgpfX19LG9uRGVzdHJveTpmdW5jdGlvbigpe2NsZWFy VGltZW91dCh0aGlzLmF1dG9FZGl0VGltZXIpO0V4dC50cmVlLlRyZWVFZGl0b3Iu c3VwZXJjbGFzcy5vbkRlc3Ryb3kuY2FsbCh0aGlzKTt2YXIgYT10aGlzLnRyZWU7 YS51bigiYmVmb3JlY2xpY2siLHRoaXMuYmVmb3JlTm9kZUNsaWNrLHRoaXMpO2Eu dW4oImRibGNsaWNrIix0aGlzLm9uTm9kZURibENsaWNrLHRoaXMpfX0pOwovKiBT V0ZPYmplY3QgdjIuMiA8aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3N3Zm9iamVj dC8+IAogICAgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIDxodHRw Oi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocD4g CiovCnZhciBzd2ZvYmplY3Q9ZnVuY3Rpb24oKXt2YXIgRT0idW5kZWZpbmVkIixz PSJvYmplY3QiLFQ9IlNob2Nrd2F2ZSBGbGFzaCIsWD0iU2hvY2t3YXZlRmxhc2gu U2hvY2t3YXZlRmxhc2giLHI9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNo IixTPSJTV0ZPYmplY3RFeHBySW5zdCIseT0ib25yZWFkeXN0YXRlY2hhbmdlIixQ PXdpbmRvdyxrPWRvY3VtZW50LHU9bmF2aWdhdG9yLFU9ZmFsc2UsVj1baV0scD1b XSxPPVtdLEo9W10sbSxSLEYsQyxLPWZhbHNlLGE9ZmFsc2UsbyxILG49dHJ1ZSxO PWZ1bmN0aW9uKCl7dmFyIGFiPXR5cGVvZiBrLmdldEVsZW1lbnRCeUlkIT1FJiZ0 eXBlb2Ygay5nZXRFbGVtZW50c0J5VGFnTmFtZSE9RSYmdHlwZW9mIGsuY3JlYXRl RWxlbWVudCE9RSxhaT11LnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLFo9dS5wbGF0 Zm9ybS50b0xvd2VyQ2FzZSgpLGFmPVo/KC93aW4vKS50ZXN0KFopOi93aW4vLnRl c3QoYWkpLGFkPVo/KC9tYWMvKS50ZXN0KFopOi9tYWMvLnRlc3QoYWkpLGFnPS93 ZWJraXQvLnRlc3QoYWkpP3BhcnNlRmxvYXQoYWkucmVwbGFjZSgvXi4qd2Via2l0 XC8oXGQrKFwuXGQrKT8pLiokLywiJDEiKSk6ZmFsc2UsWT0hKyJcdjEiLGFoPVsw LDAsMF0sYWM9bnVsbDtpZih0eXBlb2YgdS5wbHVnaW5zIT1FJiZ0eXBlb2YgdS5w bHVnaW5zW1RdPT1zKXthYz11LnBsdWdpbnNbVF0uZGVzY3JpcHRpb247aWYoYWMm JiEodHlwZW9mIHUubWltZVR5cGVzIT1FJiZ1Lm1pbWVUeXBlc1tyXSYmIXUubWlt ZVR5cGVzW3JdLmVuYWJsZWRQbHVnaW4pKXtVPXRydWU7WT1mYWxzZTthYz1hYy5y ZXBsYWNlKC9eLipccysoXFMrXHMrXFMrJCkvLCIkMSIpO2FoWzBdPXBhcnNlSW50 KGFjLnJlcGxhY2UoL14oLiopXC4uKiQvLCIkMSIpLDEwKTthaFsxXT1wYXJzZUlu dChhYy5yZXBsYWNlKC9eLipcLiguKilccy4qJC8sIiQxIiksMTApO2FoWzJdPS9b YS16QS1aXS8udGVzdChhYyk/cGFyc2VJbnQoYWMucmVwbGFjZSgvXi4qW2EtekEt Wl0rKC4qKSQvLCIkMSIpLDEwKTowfX1lbHNle2lmKHR5cGVvZiBQLkFjdGl2ZVhP YmplY3QhPUUpe3RyeXt2YXIgYWU9bmV3IEFjdGl2ZVhPYmplY3QoWCk7aWYoYWUp e2FjPWFlLkdldFZhcmlhYmxlKCIkdmVyc2lvbiIpO2lmKGFjKXtZPXRydWU7YWM9 YWMuc3BsaXQoIiAiKVsxXS5zcGxpdCgiLCIpO2FoPVtwYXJzZUludChhY1swXSwx MCkscGFyc2VJbnQoYWNbMV0sMTApLHBhcnNlSW50KGFjWzJdLDEwKV19fX1jYXRj aChhYSl7fX19cmV0dXJue3czOmFiLHB2OmFoLHdrOmFnLGllOlksd2luOmFmLG1h YzphZH19KCksbD1mdW5jdGlvbigpe2lmKCFOLnczKXtyZXR1cm59aWYoKHR5cGVv ZiBrLnJlYWR5U3RhdGUhPUUmJmsucmVhZHlTdGF0ZT09ImNvbXBsZXRlIil8fCh0 eXBlb2Ygay5yZWFkeVN0YXRlPT1FJiYoay5nZXRFbGVtZW50c0J5VGFnTmFtZSgi Ym9keSIpWzBdfHxrLmJvZHkpKSl7ZygpfWlmKCFLKXtpZih0eXBlb2Ygay5hZGRF dmVudExpc3RlbmVyIT1FKXtrLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRM b2FkZWQiLGcsZmFsc2UpfWlmKE4uaWUmJk4ud2luKXtrLmF0dGFjaEV2ZW50KHks ZnVuY3Rpb24oKXtpZihrLnJlYWR5U3RhdGU9PSJjb21wbGV0ZSIpe2suZGV0YWNo RXZlbnQoeSxhcmd1bWVudHMuY2FsbGVlKTtnKCl9fSk7aWYoUD09dG9wKXsoZnVu Y3Rpb24oKXtpZihLKXtyZXR1cm59dHJ5e2suZG9jdW1lbnRFbGVtZW50LmRvU2Ny b2xsKCJsZWZ0Iil9Y2F0Y2goWSl7c2V0VGltZW91dChhcmd1bWVudHMuY2FsbGVl LDApO3JldHVybn1nKCl9KSgpfX1pZihOLndrKXsoZnVuY3Rpb24oKXtpZihLKXty ZXR1cm59aWYoISgvbG9hZGVkfGNvbXBsZXRlLykudGVzdChrLnJlYWR5U3RhdGUp KXtzZXRUaW1lb3V0KGFyZ3VtZW50cy5jYWxsZWUsMCk7cmV0dXJufWcoKX0pKCl9 dChnKX19KCk7ZnVuY3Rpb24gZygpe2lmKEspe3JldHVybn10cnl7dmFyIGFhPWsu Z2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXS5hcHBlbmRDaGlsZChEKCJz cGFuIikpO2FhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYWEpfWNhdGNoKGFiKXty ZXR1cm59Sz10cnVlO3ZhciBZPVYubGVuZ3RoO2Zvcih2YXIgWj0wO1o8WTtaKysp e1ZbWl0oKX19ZnVuY3Rpb24gTChZKXtpZihLKXtZKCl9ZWxzZXtWW1YubGVuZ3Ro XT1ZfX1mdW5jdGlvbiB0KFope2lmKHR5cGVvZiBQLmFkZEV2ZW50TGlzdGVuZXIh PUUpe1AuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsWixmYWxzZSl9ZWxzZXtpZih0 eXBlb2Ygay5hZGRFdmVudExpc3RlbmVyIT1FKXtrLmFkZEV2ZW50TGlzdGVuZXIo ImxvYWQiLFosZmFsc2UpfWVsc2V7aWYodHlwZW9mIFAuYXR0YWNoRXZlbnQhPUUp e2ooUCwib25sb2FkIixaKX1lbHNle2lmKHR5cGVvZiBQLm9ubG9hZD09ImZ1bmN0 aW9uIil7dmFyIFk9UC5vbmxvYWQ7UC5vbmxvYWQ9ZnVuY3Rpb24oKXtZKCk7Wigp fX1lbHNle1Aub25sb2FkPVp9fX19fWZ1bmN0aW9uIGkoKXtpZihVKXtXKCl9ZWxz ZXtJKCl9fWZ1bmN0aW9uIFcoKXt2YXIgWT1rLmdldEVsZW1lbnRzQnlUYWdOYW1l KCJib2R5IilbMF07dmFyIGFiPUQocyk7YWIuc2V0QXR0cmlidXRlKCJ0eXBlIixy KTt2YXIgYWE9WS5hcHBlbmRDaGlsZChhYik7aWYoYWEpe3ZhciBaPTA7KGZ1bmN0 aW9uKCl7aWYodHlwZW9mIGFhLkdldFZhcmlhYmxlIT1FKXt2YXIgYWM9YWEuR2V0 VmFyaWFibGUoIiR2ZXJzaW9uIik7aWYoYWMpe2FjPWFjLnNwbGl0KCIgIilbMV0u c3BsaXQoIiwiKTtOLnB2PVtwYXJzZUludChhY1swXSwxMCkscGFyc2VJbnQoYWNb MV0sMTApLHBhcnNlSW50KGFjWzJdLDEwKV19fWVsc2V7aWYoWjwxMCl7WisrO3Nl dFRpbWVvdXQoYXJndW1lbnRzLmNhbGxlZSwxMCk7cmV0dXJufX1ZLnJlbW92ZUNo aWxkKGFiKTthYT1udWxsO0koKX0pKCl9ZWxzZXtJKCl9fWZ1bmN0aW9uIEkoKXt2 YXIgYWg9cC5sZW5ndGg7aWYoYWg+MCl7Zm9yKHZhciBhZz0wO2FnPGFoO2FnKysp e3ZhciBaPXBbYWddLmlkO3ZhciBhYz1wW2FnXS5jYWxsYmFja0ZuO3ZhciBhYj17 c3VjY2VzczpmYWxzZSxpZDpafTtpZihOLnB2WzBdPjApe3ZhciBhZj1jKFopO2lm KGFmKXtpZihHKHBbYWddLnN3ZlZlcnNpb24pJiYhKE4ud2smJk4ud2s8MzEyKSl7 eChaLHRydWUpO2lmKGFjKXthYi5zdWNjZXNzPXRydWU7YWIucmVmPUEoWik7YWMo YWIpfX1lbHNle2lmKHBbYWddLmV4cHJlc3NJbnN0YWxsJiZCKCkpe3ZhciBhaj17 fTthai5kYXRhPXBbYWddLmV4cHJlc3NJbnN0YWxsO2FqLndpZHRoPWFmLmdldEF0 dHJpYnV0ZSgid2lkdGgiKXx8IjAiO2FqLmhlaWdodD1hZi5nZXRBdHRyaWJ1dGUo ImhlaWdodCIpfHwiMCI7aWYoYWYuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKXthai5z dHlsZWNsYXNzPWFmLmdldEF0dHJpYnV0ZSgiY2xhc3MiKX1pZihhZi5nZXRBdHRy aWJ1dGUoImFsaWduIikpe2FqLmFsaWduPWFmLmdldEF0dHJpYnV0ZSgiYWxpZ24i KX12YXIgYWk9e307dmFyIFk9YWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcmFt Iik7dmFyIGFkPVkubGVuZ3RoO2Zvcih2YXIgYWU9MDthZTxhZDthZSsrKXtpZihZ W2FlXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKS50b0xvd2VyQ2FzZSgpIT0ibW92aWUi KXthaVtZW2FlXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKV09WVthZV0uZ2V0QXR0cmli dXRlKCJ2YWx1ZSIpfX1RKGFqLGFpLFosYWMpfWVsc2V7cShhZik7aWYoYWMpe2Fj KGFiKX19fX19ZWxzZXt4KFosdHJ1ZSk7aWYoYWMpe3ZhciBhYT1BKFopO2lmKGFh JiZ0eXBlb2YgYWEuU2V0VmFyaWFibGUhPUUpe2FiLnN1Y2Nlc3M9dHJ1ZTthYi5y ZWY9YWF9YWMoYWIpfX19fX1mdW5jdGlvbiBBKGFiKXt2YXIgWT1udWxsO3ZhciBa PWMoYWIpO2lmKFomJloubm9kZU5hbWU9PSJPQkpFQ1QiKXtpZih0eXBlb2YgWi5T ZXRWYXJpYWJsZSE9RSl7WT1afWVsc2V7dmFyIGFhPVouZ2V0RWxlbWVudHNCeVRh Z05hbWUocylbMF07aWYoYWEpe1k9YWF9fX1yZXR1cm4gWX1mdW5jdGlvbiBCKCl7 cmV0dXJuICFhJiZHKCI2LjAuNjUiKSYmKE4ud2lufHxOLm1hYykmJiEoTi53ayYm Ti53azwzMTIpfWZ1bmN0aW9uIFEoYWIsYWMsWSxhYSl7YT10cnVlO0Y9YWF8fG51 bGw7Qz17c3VjY2VzczpmYWxzZSxpZDpZfTt2YXIgYWY9YyhZKTtpZihhZil7aWYo YWYubm9kZU5hbWU9PSJPQkpFQ1QiKXttPWgoYWYpO1I9bnVsbH1lbHNle209YWY7 Uj1ZfWFiLmlkPVM7aWYodHlwZW9mIGFiLndpZHRoPT1FfHwoISgvJSQvKS50ZXN0 KGFiLndpZHRoKSYmcGFyc2VJbnQoYWIud2lkdGgsMTApPDMxMCkpe2FiLndpZHRo PSIzMTAifWlmKHR5cGVvZiBhYi5oZWlnaHQ9PUV8fCghKC8lJC8pLnRlc3QoYWIu aGVpZ2h0KSYmcGFyc2VJbnQoYWIuaGVpZ2h0LDEwKTwxMzcpKXthYi5oZWlnaHQ9 IjEzNyJ9ay50aXRsZT1rLnRpdGxlLnNsaWNlKDAsNDcpKyIgLSBGbGFzaCBQbGF5 ZXIgSW5zdGFsbGF0aW9uIjt2YXIgYWU9Ti5pZSYmTi53aW4/IkFjdGl2ZVgiOiJQ bHVnSW4iLGFkPSJNTXJlZGlyZWN0VVJMPSIrUC5sb2NhdGlvbi50b1N0cmluZygp LnJlcGxhY2UoLyYvZywiJTI2IikrIiZNTXBsYXllclR5cGU9IithZSsiJk1NZG9j dGl0bGU9IitrLnRpdGxlO2lmKHR5cGVvZiBhYy5mbGFzaHZhcnMhPUUpe2FjLmZs YXNodmFycys9IiYiK2FkfWVsc2V7YWMuZmxhc2h2YXJzPWFkfWlmKE4uaWUmJk4u d2luJiZhZi5yZWFkeVN0YXRlIT00KXt2YXIgWj1EKCJkaXYiKTtZKz0iU1dGT2Jq ZWN0TmV3IjtaLnNldEF0dHJpYnV0ZSgiaWQiLFkpO2FmLnBhcmVudE5vZGUuaW5z ZXJ0QmVmb3JlKFosYWYpO2FmLnN0eWxlLmRpc3BsYXk9Im5vbmUiOyhmdW5jdGlv bigpe2lmKGFmLnJlYWR5U3RhdGU9PTQpe2FmLnBhcmVudE5vZGUucmVtb3ZlQ2hp bGQoYWYpfWVsc2V7c2V0VGltZW91dChhcmd1bWVudHMuY2FsbGVlLDEwKX19KSgp fXYoYWIsYWMsWSl9fWZ1bmN0aW9uIHEoWil7aWYoTi5pZSYmTi53aW4mJloucmVh ZHlTdGF0ZSE9NCl7dmFyIFk9RCgiZGl2Iik7Wi5wYXJlbnROb2RlLmluc2VydEJl Zm9yZShZLFopO1kucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaChaKSxZKTtaLnN0 eWxlLmRpc3BsYXk9Im5vbmUiOyhmdW5jdGlvbigpe2lmKFoucmVhZHlTdGF0ZT09 NCl7Wi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKFopfWVsc2V7c2V0VGltZW91dChh cmd1bWVudHMuY2FsbGVlLDEwKX19KSgpfWVsc2V7Wi5wYXJlbnROb2RlLnJlcGxh Y2VDaGlsZChoKFopLFopfX1mdW5jdGlvbiBoKGFkKXt2YXIgYWI9RCgiZGl2Iik7 aWYoTi53aW4mJk4uaWUpe2FiLmlubmVySFRNTD1hZC5pbm5lckhUTUx9ZWxzZXt2 YXIgWj1hZC5nZXRFbGVtZW50c0J5VGFnTmFtZShzKVswXTtpZihaKXt2YXIgYWU9 Wi5jaGlsZE5vZGVzO2lmKGFlKXt2YXIgWT1hZS5sZW5ndGg7Zm9yKHZhciBhYT0w O2FhPFk7YWErKyl7aWYoIShhZVthYV0ubm9kZVR5cGU9PTEmJmFlW2FhXS5ub2Rl TmFtZT09IlBBUkFNIikmJiEoYWVbYWFdLm5vZGVUeXBlPT04KSl7YWIuYXBwZW5k Q2hpbGQoYWVbYWFdLmNsb25lTm9kZSh0cnVlKSl9fX19fXJldHVybiBhYn1mdW5j dGlvbiB2KGFqLGFoLFope3ZhciBZLGFiPWMoWik7aWYoTi53ayYmTi53azwzMTIp e3JldHVybiBZfWlmKGFiKXtpZih0eXBlb2YgYWouaWQ9PUUpe2FqLmlkPVp9aWYo Ti5pZSYmTi53aW4pe3ZhciBhaT0iIjtmb3IodmFyIGFmIGluIGFqKXtpZihhalth Zl0hPU9iamVjdC5wcm90b3R5cGVbYWZdKXtpZihhZi50b0xvd2VyQ2FzZSgpPT0i ZGF0YSIpe2FoLm1vdmllPWFqW2FmXX1lbHNle2lmKGFmLnRvTG93ZXJDYXNlKCk9 PSJzdHlsZWNsYXNzIil7YWkrPScgY2xhc3M9IicrYWpbYWZdKyciJ31lbHNle2lm KGFmLnRvTG93ZXJDYXNlKCkhPSJjbGFzc2lkIil7YWkrPSIgIithZisnPSInK2Fq W2FmXSsnIid9fX19fXZhciBhZz0iIjtmb3IodmFyIGFlIGluIGFoKXtpZihhaFth ZV0hPU9iamVjdC5wcm90b3R5cGVbYWVdKXthZys9JzxwYXJhbSBuYW1lPSInK2Fl KyciIHZhbHVlPSInK2FoW2FlXSsnIiAvPid9fWFiLm91dGVySFRNTD0nPG9iamVj dCBjbGFzc2lkPSJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1 NDAwMDAiJythaSsiPiIrYWcrIjwvb2JqZWN0PiI7T1tPLmxlbmd0aF09YWouaWQ7 WT1jKGFqLmlkKX1lbHNle3ZhciBhYT1EKHMpO2FhLnNldEF0dHJpYnV0ZSgidHlw ZSIscik7Zm9yKHZhciBhZCBpbiBhail7aWYoYWpbYWRdIT1PYmplY3QucHJvdG90 eXBlW2FkXSl7aWYoYWQudG9Mb3dlckNhc2UoKT09InN0eWxlY2xhc3MiKXthYS5z ZXRBdHRyaWJ1dGUoImNsYXNzIixhalthZF0pfWVsc2V7aWYoYWQudG9Mb3dlckNh c2UoKSE9ImNsYXNzaWQiKXthYS5zZXRBdHRyaWJ1dGUoYWQsYWpbYWRdKX19fX1m b3IodmFyIGFjIGluIGFoKXtpZihhaFthY10hPU9iamVjdC5wcm90b3R5cGVbYWNd JiZhYy50b0xvd2VyQ2FzZSgpIT0ibW92aWUiKXtlKGFhLGFjLGFoW2FjXSl9fWFi LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGFhLGFiKTtZPWFhfX1yZXR1cm4gWX1m dW5jdGlvbiBlKGFhLFksWil7dmFyIGFiPUQoInBhcmFtIik7YWIuc2V0QXR0cmli dXRlKCJuYW1lIixZKTthYi5zZXRBdHRyaWJ1dGUoInZhbHVlIixaKTthYS5hcHBl bmRDaGlsZChhYil9ZnVuY3Rpb24geihaKXt2YXIgWT1jKFopO2lmKFkmJlkubm9k ZU5hbWU9PSJPQkpFQ1QiKXtpZihOLmllJiZOLndpbil7WS5zdHlsZS5kaXNwbGF5 PSJub25lIjsoZnVuY3Rpb24oKXtpZihZLnJlYWR5U3RhdGU9PTQpe2IoWil9ZWxz ZXtzZXRUaW1lb3V0KGFyZ3VtZW50cy5jYWxsZWUsMTApfX0pKCl9ZWxzZXtZLnBh cmVudE5vZGUucmVtb3ZlQ2hpbGQoWSl9fX1mdW5jdGlvbiBiKGFhKXt2YXIgWj1j KGFhKTtpZihaKXtmb3IodmFyIFkgaW4gWil7aWYodHlwZW9mIFpbWV09PSJmdW5j dGlvbiIpe1pbWV09bnVsbH19Wi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKFopfX1m dW5jdGlvbiBjKGFhKXt2YXIgWT1udWxsO3RyeXtZPWsuZ2V0RWxlbWVudEJ5SWQo YWEpfWNhdGNoKFope31yZXR1cm4gWX1mdW5jdGlvbiBEKFkpe3JldHVybiBrLmNy ZWF0ZUVsZW1lbnQoWSl9ZnVuY3Rpb24gaihhYSxZLFope2FhLmF0dGFjaEV2ZW50 KFksWik7SltKLmxlbmd0aF09W2FhLFksWl19ZnVuY3Rpb24gRyhhYSl7dmFyIFo9 Ti5wdixZPWFhLnNwbGl0KCIuIik7WVswXT1wYXJzZUludChZWzBdLDEwKTtZWzFd PXBhcnNlSW50KFlbMV0sMTApfHwwO1lbMl09cGFyc2VJbnQoWVsyXSwxMCl8fDA7 cmV0dXJuKFpbMF0+WVswXXx8KFpbMF09PVlbMF0mJlpbMV0+WVsxXSl8fChaWzBd PT1ZWzBdJiZaWzFdPT1ZWzFdJiZaWzJdPj1ZWzJdKSk/dHJ1ZTpmYWxzZX1mdW5j dGlvbiB3KGFkLFosYWUsYWMpe2lmKE4uaWUmJk4ubWFjKXtyZXR1cm59dmFyIGFi PWsuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTtpZighYWIpe3JldHVy bn12YXIgWT0oYWUmJnR5cGVvZiBhZT09InN0cmluZyIpP2FlOiJzY3JlZW4iO2lm KGFjKXtvPW51bGw7SD1udWxsfWlmKCFvfHxIIT1ZKXt2YXIgYWE9RCgic3R5bGUi KTthYS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJ0ZXh0L2NzcyIpO2FhLnNldEF0dHJp YnV0ZSgibWVkaWEiLFkpO289YWIuYXBwZW5kQ2hpbGQoYWEpO2lmKE4uaWUmJk4u d2luJiZ0eXBlb2Ygay5zdHlsZVNoZWV0cyE9RSYmay5zdHlsZVNoZWV0cy5sZW5n dGg+MCl7bz1rLnN0eWxlU2hlZXRzW2suc3R5bGVTaGVldHMubGVuZ3RoLTFdfUg9 WX1pZihOLmllJiZOLndpbil7aWYobyYmdHlwZW9mIG8uYWRkUnVsZT09cyl7by5h ZGRSdWxlKGFkLFopfX1lbHNle2lmKG8mJnR5cGVvZiBrLmNyZWF0ZVRleHROb2Rl IT1FKXtvLmFwcGVuZENoaWxkKGsuY3JlYXRlVGV4dE5vZGUoYWQrIiB7IitaKyJ9 IikpfX19ZnVuY3Rpb24geChhYSxZKXtpZighbil7cmV0dXJufXZhciBaPVk/InZp c2libGUiOiJoaWRkZW4iO2lmKEsmJmMoYWEpKXtjKGFhKS5zdHlsZS52aXNpYmls aXR5PVp9ZWxzZXt3KCIjIithYSwidmlzaWJpbGl0eToiK1opfX1mdW5jdGlvbiBN KFope3ZhciBhYT0vW1xcXCI8PlwuO10vO3ZhciBZPWFhLmV4ZWMoWikhPW51bGw7 cmV0dXJuIFkmJnR5cGVvZiBlbmNvZGVVUklDb21wb25lbnQhPUU/ZW5jb2RlVVJJ Q29tcG9uZW50KFopOlp9dmFyIGQ9ZnVuY3Rpb24oKXtpZihOLmllJiZOLndpbil7 d2luZG93LmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsZnVuY3Rpb24oKXt2YXIgYWQ9 Si5sZW5ndGg7Zm9yKHZhciBhYz0wO2FjPGFkO2FjKyspe0pbYWNdWzBdLmRldGFj aEV2ZW50KEpbYWNdWzFdLEpbYWNdWzJdKX12YXIgYWE9Ty5sZW5ndGg7Zm9yKHZh ciBhYj0wO2FiPGFhO2FiKyspe3ooT1thYl0pfWZvcih2YXIgWiBpbiBOKXtOW1pd PW51bGx9Tj1udWxsO2Zvcih2YXIgWSBpbiBzd2ZvYmplY3Qpe3N3Zm9iamVjdFtZ XT1udWxsfXN3Zm9iamVjdD1udWxsO3dpbmRvdy5kZXRhY2hFdmVudCgib251bmxv YWQiLGFyZ3VtZW50cy5jYWxsZWUpfSl9fSgpO3JldHVybntyZWdpc3Rlck9iamVj dDpmdW5jdGlvbihhYyxZLGFiLGFhKXtpZihOLnczJiZhYyYmWSl7dmFyIFo9e307 Wi5pZD1hYztaLnN3ZlZlcnNpb249WTtaLmV4cHJlc3NJbnN0YWxsPWFiO1ouY2Fs bGJhY2tGbj1hYTtwW3AubGVuZ3RoXT1aO3goYWMsZmFsc2UpfWVsc2V7aWYoYWEp e2FhKHtzdWNjZXNzOmZhbHNlLGlkOmFjfSl9fX0sZ2V0T2JqZWN0QnlJZDpmdW5j dGlvbihZKXtpZihOLnczKXtyZXR1cm4gQShZKX19LGVtYmVkU1dGOmZ1bmN0aW9u KGFjLGFpLGFmLGFoLFosYWIsYWEsYWUsYWcsYWQpe3ZhciBZPXtzdWNjZXNzOmZh bHNlLGlkOmFpfTtpZihOLnczJiYhKE4ud2smJk4ud2s8MzEyKSYmYWMmJmFpJiZh ZiYmYWgmJlope3goYWksZmFsc2UpO0woZnVuY3Rpb24oKXthZis9IiI7YWgrPSIi O3ZhciBhaz17fTtpZihhZyYmdHlwZW9mIGFnPT09cyl7Zm9yKHZhciBhbSBpbiBh Zyl7YWtbYW1dPWFnW2FtXX19YWsuZGF0YT1hYzthay53aWR0aD1hZjthay5oZWln aHQ9YWg7dmFyIGFuPXt9O2lmKGFlJiZ0eXBlb2YgYWU9PT1zKXtmb3IodmFyIGFs IGluIGFlKXthblthbF09YWVbYWxdfX1pZihhYSYmdHlwZW9mIGFhPT09cyl7Zm9y KHZhciBhaiBpbiBhYSl7aWYodHlwZW9mIGFuLmZsYXNodmFycyE9RSl7YW4uZmxh c2h2YXJzKz0iJiIrYWorIj0iK2FhW2FqXX1lbHNle2FuLmZsYXNodmFycz1haisi PSIrYWFbYWpdfX19aWYoRyhaKSl7dmFyIGFvPXYoYWssYW4sYWkpO2lmKGFrLmlk PT1haSl7eChhaSx0cnVlKX1ZLnN1Y2Nlc3M9dHJ1ZTtZLnJlZj1hb31lbHNle2lm KGFiJiZCKCkpe2FrLmRhdGE9YWI7UShhayxhbixhaSxhZCk7cmV0dXJufWVsc2V7 eChhaSx0cnVlKX19aWYoYWQpe2FkKFkpfX0pfWVsc2V7aWYoYWQpe2FkKFkpfX19 LHN3aXRjaE9mZkF1dG9IaWRlU2hvdzpmdW5jdGlvbigpe249ZmFsc2V9LHVhOk4s Z2V0Rmxhc2hQbGF5ZXJWZXJzaW9uOmZ1bmN0aW9uKCl7cmV0dXJue21ham9yOk4u cHZbMF0sbWlub3I6Ti5wdlsxXSxyZWxlYXNlOk4ucHZbMl19fSxoYXNGbGFzaFBs YXllclZlcnNpb246RyxjcmVhdGVTV0Y6ZnVuY3Rpb24oYWEsWixZKXtpZihOLncz KXtyZXR1cm4gdihhYSxaLFkpfWVsc2V7cmV0dXJuIHVuZGVmaW5lZH19LHNob3dF eHByZXNzSW5zdGFsbDpmdW5jdGlvbihhYSxhYixZLFope2lmKE4udzMmJkIoKSl7 UShhYSxhYixZLFopfX0scmVtb3ZlU1dGOmZ1bmN0aW9uKFkpe2lmKE4udzMpe3oo WSl9fSxjcmVhdGVDU1M6ZnVuY3Rpb24oYWIsYWEsWixZKXtpZihOLnczKXt3KGFi LGFhLFosWSl9fSxhZGREb21Mb2FkRXZlbnQ6TCxhZGRMb2FkRXZlbnQ6dCxnZXRR dWVyeVBhcmFtVmFsdWU6ZnVuY3Rpb24oYWIpe3ZhciBhYT1rLmxvY2F0aW9uLnNl YXJjaHx8ay5sb2NhdGlvbi5oYXNoO2lmKGFhKXtpZigvXD8vLnRlc3QoYWEpKXth YT1hYS5zcGxpdCgiPyIpWzFdfWlmKGFiPT1udWxsKXtyZXR1cm4gTShhYSl9dmFy IFo9YWEuc3BsaXQoIiYiKTtmb3IodmFyIFk9MDtZPFoubGVuZ3RoO1krKyl7aWYo WltZXS5zdWJzdHJpbmcoMCxaW1ldLmluZGV4T2YoIj0iKSk9PWFiKXtyZXR1cm4g TShaW1ldLnN1YnN0cmluZygoWltZXS5pbmRleE9mKCI9IikrMSkpKX19fXJldHVy biIifSxleHByZXNzSW5zdGFsbENhbGxiYWNrOmZ1bmN0aW9uKCl7aWYoYSl7dmFy IFk9YyhTKTtpZihZJiZtKXtZLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG0sWSk7 aWYoUil7eChSLHRydWUpO2lmKE4uaWUmJk4ud2luKXttLnN0eWxlLmRpc3BsYXk9 ImJsb2NrIn19aWYoRil7RihDKX19YT1mYWxzZX19fX0oKTtFeHQuRmxhc2hDb21w b25lbnQ9RXh0LmV4dGVuZChFeHQuQm94Q29tcG9uZW50LHtmbGFzaFZlcnNpb246 IjkuMC4xMTUiLGJhY2tncm91bmRDb2xvcjoiI2ZmZmZmZiIsd21vZGU6Im9wYXF1 ZSIsZmxhc2hWYXJzOnVuZGVmaW5lZCxmbGFzaFBhcmFtczp1bmRlZmluZWQsdXJs OnVuZGVmaW5lZCxzd2ZJZDp1bmRlZmluZWQsc3dmV2lkdGg6IjEwMCUiLHN3Zkhl aWdodDoiMTAwJSIsZXhwcmVzc0luc3RhbGw6ZmFsc2UsaW5pdENvbXBvbmVudDpm dW5jdGlvbigpe0V4dC5GbGFzaENvbXBvbmVudC5zdXBlcmNsYXNzLmluaXRDb21w b25lbnQuY2FsbCh0aGlzKTt0aGlzLmFkZEV2ZW50cygiaW5pdGlhbGl6ZSIpfSxv blJlbmRlcjpmdW5jdGlvbigpe0V4dC5GbGFzaENvbXBvbmVudC5zdXBlcmNsYXNz Lm9uUmVuZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYj1FeHQuYXBwbHko e2FsbG93U2NyaXB0QWNjZXNzOiJhbHdheXMiLGJnY29sb3I6dGhpcy5iYWNrZ3Jv dW5kQ29sb3Isd21vZGU6dGhpcy53bW9kZX0sdGhpcy5mbGFzaFBhcmFtcyksYT1F eHQuYXBwbHkoe2FsbG93ZWREb21haW46ZG9jdW1lbnQubG9jYXRpb24uaG9zdG5h bWUsWVVJU3dmSWQ6dGhpcy5nZXRJZCgpLFlVSUJyaWRnZUNhbGxiYWNrOiJFeHQu Rmxhc2hFdmVudFByb3h5Lm9uRXZlbnQifSx0aGlzLmZsYXNoVmFycyk7bmV3IHN3 Zm9iamVjdC5lbWJlZFNXRih0aGlzLnVybCx0aGlzLmlkLHRoaXMuc3dmV2lkdGgs dGhpcy5zd2ZIZWlnaHQsdGhpcy5mbGFzaFZlcnNpb24sdGhpcy5leHByZXNzSW5z dGFsbD9FeHQuRmxhc2hDb21wb25lbnQuRVhQUkVTU19JTlNUQUxMX1VSTDp1bmRl ZmluZWQsYSxiKTt0aGlzLnN3Zj1FeHQuZ2V0RG9tKHRoaXMuaWQpO3RoaXMuZWw9 RXh0LmdldCh0aGlzLnN3Zil9LGdldFN3ZklkOmZ1bmN0aW9uKCl7cmV0dXJuIHRo aXMuc3dmSWR8fCh0aGlzLnN3ZklkPSJleHRzd2YiKygrK0V4dC5Db21wb25lbnQu QVVUT19JRCkpfSxnZXRJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfHwodGhp cy5pZD0iZXh0Zmxhc2hjbXAiKygrK0V4dC5Db21wb25lbnQuQVVUT19JRCkpfSxv bkZsYXNoRXZlbnQ6ZnVuY3Rpb24oYSl7c3dpdGNoKGEudHlwZSl7Y2FzZSJzd2ZS ZWFkeSI6dGhpcy5pbml0U3dmKCk7cmV0dXJuO2Nhc2UibG9nIjpyZXR1cm59YS5j b21wb25lbnQ9dGhpczt0aGlzLmZpcmVFdmVudChhLnR5cGUudG9Mb3dlckNhc2Uo KS5yZXBsYWNlKC9ldmVudCQvLCIiKSxhKX0saW5pdFN3ZjpmdW5jdGlvbigpe3Ro aXMub25Td2ZSZWFkeSghIXRoaXMuaXNJbml0aWFsaXplZCk7dGhpcy5pc0luaXRp YWxpemVkPXRydWU7dGhpcy5maXJlRXZlbnQoImluaXRpYWxpemUiLHRoaXMpfSxi ZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7aWYodGhpcy5yZW5kZXJlZCl7c3dmb2Jq ZWN0LnJlbW92ZVNXRih0aGlzLnN3Zi5pZCl9RXh0LkZsYXNoQ29tcG9uZW50LnN1 cGVyY2xhc3MuYmVmb3JlRGVzdHJveS5jYWxsKHRoaXMpfSxvblN3ZlJlYWR5OkV4 dC5lbXB0eUZufSk7RXh0LkZsYXNoQ29tcG9uZW50LkVYUFJFU1NfSU5TVEFMTF9V Ukw9Imh0dHA6Ly9zd2ZvYmplY3QuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rL3N3 Zm9iamVjdC9leHByZXNzSW5zdGFsbC5zd2YiO0V4dC5yZWcoImZsYXNoIixFeHQu Rmxhc2hDb21wb25lbnQpO0V4dC5GbGFzaEV2ZW50UHJveHk9e29uRXZlbnQ6ZnVu Y3Rpb24oYyxiKXt2YXIgYT1FeHQuZ2V0Q21wKGMpO2lmKGEpe2Eub25GbGFzaEV2 ZW50KGIpfWVsc2V7YXJndW1lbnRzLmNhbGxlZS5kZWZlcigxMCx0aGlzLFtjLGJd KX19fTtFeHQuY2hhcnQuQ2hhcnQ9RXh0LmV4dGVuZChFeHQuRmxhc2hDb21wb25l bnQse3JlZnJlc2hCdWZmZXI6MTAwLGNoYXJ0U3R5bGU6e3BhZGRpbmc6MTAsYW5p bWF0aW9uRW5hYmxlZDp0cnVlLGZvbnQ6e25hbWU6IlRhaG9tYSIsY29sb3I6NDQ3 MzkyNCxzaXplOjExfSxkYXRhVGlwOntwYWRkaW5nOjUsYm9yZGVyOntjb2xvcjox MDA3NTExMixzaXplOjF9LGJhY2tncm91bmQ6e2NvbG9yOjE0MzQ2MjMwLGFscGhh OjAuOX0sZm9udDp7bmFtZToiVGFob21hIixjb2xvcjoxMzkzMjkxLHNpemU6MTAs Ym9sZDp0cnVlfX19LGV4dHJhU3R5bGU6bnVsbCxzZXJpZXNTdHlsZXM6bnVsbCxk aXNhYmxlQ2FjaGluZzpFeHQuaXNJRXx8RXh0LmlzT3BlcmEsZGlzYWJsZUNhY2hl UGFyYW06Il9kYyIsaW5pdENvbXBvbmVudDpmdW5jdGlvbigpe0V4dC5jaGFydC5D aGFydC5zdXBlcmNsYXNzLmluaXRDb21wb25lbnQuY2FsbCh0aGlzKTtpZighdGhp cy51cmwpe3RoaXMudXJsPUV4dC5jaGFydC5DaGFydC5DSEFSVF9VUkx9aWYodGhp cy5kaXNhYmxlQ2FjaGluZyl7dGhpcy51cmw9RXh0LnVybEFwcGVuZCh0aGlzLnVy bCxTdHJpbmcuZm9ybWF0KCJ7MH09ezF9Iix0aGlzLmRpc2FibGVDYWNoZVBhcmFt LG5ldyBEYXRlKCkuZ2V0VGltZSgpKSl9dGhpcy5hZGRFdmVudHMoIml0ZW1tb3Vz ZW92ZXIiLCJpdGVtbW91c2VvdXQiLCJpdGVtY2xpY2siLCJpdGVtZG91YmxlY2xp Y2siLCJpdGVtZHJhZ3N0YXJ0IiwiaXRlbWRyYWciLCJpdGVtZHJhZ2VuZCIsImJl Zm9yZXJlZnJlc2giLCJyZWZyZXNoIik7dGhpcy5zdG9yZT1FeHQuU3RvcmVNZ3Iu bG9va3VwKHRoaXMuc3RvcmUpfSxzZXRTdHlsZTpmdW5jdGlvbihhLGIpe3RoaXMu c3dmLnNldFN0eWxlKGEsRXh0LmVuY29kZShiKSl9LHNldFN0eWxlczpmdW5jdGlv bihhKXt0aGlzLnN3Zi5zZXRTdHlsZXMoRXh0LmVuY29kZShhKSl9LHNldFNlcmll c1N0eWxlczpmdW5jdGlvbihiKXt0aGlzLnNlcmllc1N0eWxlcz1iO3ZhciBhPVtd O0V4dC5lYWNoKGIsZnVuY3Rpb24oYyl7YS5wdXNoKEV4dC5lbmNvZGUoYykpfSk7 dGhpcy5zd2Yuc2V0U2VyaWVzU3R5bGVzKGEpfSxzZXRDYXRlZ29yeU5hbWVzOmZ1 bmN0aW9uKGEpe3RoaXMuc3dmLnNldENhdGVnb3J5TmFtZXMoYSl9LHNldExlZ2Vu ZFJlbmRlcmVyOmZ1bmN0aW9uKGMsYil7dmFyIGE9dGhpcztiPWJ8fGE7YS5yZW1v dmVGblByb3h5KGEubGVnZW5kRm5OYW1lKTthLmxlZ2VuZEZuTmFtZT1hLmNyZWF0 ZUZuUHJveHkoZnVuY3Rpb24oZCl7cmV0dXJuIGMuY2FsbChiLGQpfSk7YS5zd2Yu c2V0TGVnZW5kTGFiZWxGdW5jdGlvbihhLmxlZ2VuZEZuTmFtZSl9LHNldFRpcFJl bmRlcmVyOmZ1bmN0aW9uKGMsYil7dmFyIGE9dGhpcztiPWJ8fGE7YS5yZW1vdmVG blByb3h5KGEudGlwRm5OYW1lKTthLnRpcEZuTmFtZT1hLmNyZWF0ZUZuUHJveHko ZnVuY3Rpb24oaCxlLGcpe3ZhciBkPWEuc3RvcmUuZ2V0QXQoZSk7cmV0dXJuIGMu Y2FsbChiLGEsZCxlLGcpfSk7YS5zd2Yuc2V0RGF0YVRpcEZ1bmN0aW9uKGEudGlw Rm5OYW1lKX0sc2V0U2VyaWVzOmZ1bmN0aW9uKGEpe3RoaXMuc2VyaWVzPWE7dGhp cy5yZWZyZXNoKCl9LGJpbmRTdG9yZTpmdW5jdGlvbihhLGIpe2lmKCFiJiZ0aGlz LnN0b3JlKXtpZihhIT09dGhpcy5zdG9yZSYmdGhpcy5zdG9yZS5hdXRvRGVzdHJv eSl7dGhpcy5zdG9yZS5kZXN0cm95KCl9ZWxzZXt0aGlzLnN0b3JlLnVuKCJkYXRh Y2hhbmdlZCIsdGhpcy5yZWZyZXNoLHRoaXMpO3RoaXMuc3RvcmUudW4oImFkZCIs dGhpcy5kZWxheVJlZnJlc2gsdGhpcyk7dGhpcy5zdG9yZS51bigicmVtb3ZlIix0 aGlzLmRlbGF5UmVmcmVzaCx0aGlzKTt0aGlzLnN0b3JlLnVuKCJ1cGRhdGUiLHRo aXMuZGVsYXlSZWZyZXNoLHRoaXMpO3RoaXMuc3RvcmUudW4oImNsZWFyIix0aGlz LnJlZnJlc2gsdGhpcyl9fWlmKGEpe2E9RXh0LlN0b3JlTWdyLmxvb2t1cChhKTth Lm9uKHtzY29wZTp0aGlzLGRhdGFjaGFuZ2VkOnRoaXMucmVmcmVzaCxhZGQ6dGhp cy5kZWxheVJlZnJlc2gscmVtb3ZlOnRoaXMuZGVsYXlSZWZyZXNoLHVwZGF0ZTp0 aGlzLmRlbGF5UmVmcmVzaCxjbGVhcjp0aGlzLnJlZnJlc2h9KX10aGlzLnN0b3Jl PWE7aWYoYSYmIWIpe3RoaXMucmVmcmVzaCgpfX0sb25Td2ZSZWFkeTpmdW5jdGlv bihiKXtFeHQuY2hhcnQuQ2hhcnQuc3VwZXJjbGFzcy5vblN3ZlJlYWR5LmNhbGwo dGhpcyxiKTt2YXIgYTt0aGlzLnN3Zi5zZXRUeXBlKHRoaXMudHlwZSk7aWYodGhp cy5jaGFydFN0eWxlKXt0aGlzLnNldFN0eWxlcyhFeHQuYXBwbHkoe30sdGhpcy5l eHRyYVN0eWxlLHRoaXMuY2hhcnRTdHlsZSkpfWlmKHRoaXMuY2F0ZWdvcnlOYW1l cyl7dGhpcy5zZXRDYXRlZ29yeU5hbWVzKHRoaXMuY2F0ZWdvcnlOYW1lcyl9aWYo dGhpcy50aXBSZW5kZXJlcil7YT10aGlzLmdldEZ1bmN0aW9uUmVmKHRoaXMudGlw UmVuZGVyZXIpO3RoaXMuc2V0VGlwUmVuZGVyZXIoYS5mbixhLnNjb3BlKX1pZih0 aGlzLmxlZ2VuZFJlbmRlcmVyKXthPXRoaXMuZ2V0RnVuY3Rpb25SZWYodGhpcy5s ZWdlbmRSZW5kZXJlcik7dGhpcy5zZXRMZWdlbmRSZW5kZXJlcihhLmZuLGEuc2Nv cGUpfWlmKCFiKXt0aGlzLmJpbmRTdG9yZSh0aGlzLnN0b3JlLHRydWUpfXRoaXMu cmVmcmVzaC5kZWZlcigxMCx0aGlzKX0sZGVsYXlSZWZyZXNoOmZ1bmN0aW9uKCl7 aWYoIXRoaXMucmVmcmVzaFRhc2spe3RoaXMucmVmcmVzaFRhc2s9bmV3IEV4dC51 dGlsLkRlbGF5ZWRUYXNrKHRoaXMucmVmcmVzaCx0aGlzKX10aGlzLnJlZnJlc2hU YXNrLmRlbGF5KHRoaXMucmVmcmVzaEJ1ZmZlcil9LHJlZnJlc2g6ZnVuY3Rpb24o KXtpZih0aGlzLmZpcmVFdmVudCgiYmVmb3JlcmVmcmVzaCIsdGhpcykhPT1mYWxz ZSl7dmFyIG09ZmFsc2U7dmFyIGs9W10sYz10aGlzLnN0b3JlLmRhdGEuaXRlbXM7 Zm9yKHZhciBnPTAsbD1jLmxlbmd0aDtnPGw7ZysrKXtrW2ddPWNbZ10uZGF0YX12 YXIgZT1bXTt2YXIgZD0wO3ZhciBuPW51bGw7dmFyIGg9MDtpZih0aGlzLnNlcmll cyl7ZD10aGlzLnNlcmllcy5sZW5ndGg7Zm9yKGg9MDtoPGQ7aCsrKXtuPXRoaXMu c2VyaWVzW2hdO3ZhciBiPXt9O2Zvcih2YXIgYSBpbiBuKXtpZihhPT0ic3R5bGUi JiZuLnN0eWxlIT09bnVsbCl7Yi5zdHlsZT1FeHQuZW5jb2RlKG4uc3R5bGUpO209 dHJ1ZX1lbHNle2JbYV09blthXX19ZS5wdXNoKGIpfX1pZihkPjApe2ZvcihoPTA7 aDxkO2grKyl7bj1lW2hdO2lmKCFuLnR5cGUpe24udHlwZT10aGlzLnR5cGV9bi5k YXRhUHJvdmlkZXI9a319ZWxzZXtlLnB1c2goe3R5cGU6dGhpcy50eXBlLGRhdGFQ cm92aWRlcjprfSl9dGhpcy5zd2Yuc2V0RGF0YVByb3ZpZGVyKGUpO2lmKHRoaXMu c2VyaWVzU3R5bGVzKXt0aGlzLnNldFNlcmllc1N0eWxlcyh0aGlzLnNlcmllc1N0 eWxlcyl9dGhpcy5maXJlRXZlbnQoInJlZnJlc2giLHRoaXMpfX0sY3JlYXRlRm5Q cm94eTpmdW5jdGlvbihhKXt2YXIgYj0iZXh0Rm5Qcm94eSIrKCsrRXh0LmNoYXJ0 LkNoYXJ0LlBST1hZX0ZOX0lEKTtFeHQuY2hhcnQuQ2hhcnQucHJveHlGdW5jdGlv bltiXT1hO3JldHVybiJFeHQuY2hhcnQuQ2hhcnQucHJveHlGdW5jdGlvbi4iK2J9 LHJlbW92ZUZuUHJveHk6ZnVuY3Rpb24oYSl7aWYoIUV4dC5pc0VtcHR5KGEpKXth PWEucmVwbGFjZSgiRXh0LmNoYXJ0LkNoYXJ0LnByb3h5RnVuY3Rpb24uIiwiIik7 ZGVsZXRlIEV4dC5jaGFydC5DaGFydC5wcm94eUZ1bmN0aW9uW2FdfX0sZ2V0RnVu Y3Rpb25SZWY6ZnVuY3Rpb24oYSl7aWYoRXh0LmlzRnVuY3Rpb24oYSkpe3JldHVy bntmbjphLHNjb3BlOnRoaXN9fWVsc2V7cmV0dXJue2ZuOmEuZm4sc2NvcGU6YS5z Y29wZXx8dGhpc319fSxvbkRlc3Ryb3k6ZnVuY3Rpb24oKXtpZih0aGlzLnJlZnJl c2hUYXNrJiZ0aGlzLnJlZnJlc2hUYXNrLmNhbmNlbCl7dGhpcy5yZWZyZXNoVGFz ay5jYW5jZWwoKX1FeHQuY2hhcnQuQ2hhcnQuc3VwZXJjbGFzcy5vbkRlc3Ryb3ku Y2FsbCh0aGlzKTt0aGlzLmJpbmRTdG9yZShudWxsKTt0aGlzLnJlbW92ZUZuUHJv eHkodGhpcy50aXBGbk5hbWUpO3RoaXMucmVtb3ZlRm5Qcm94eSh0aGlzLmxlZ2Vu ZEZuTmFtZSl9fSk7RXh0LnJlZygiY2hhcnQiLEV4dC5jaGFydC5DaGFydCk7RXh0 LmNoYXJ0LkNoYXJ0LlBST1hZX0ZOX0lEPTA7RXh0LmNoYXJ0LkNoYXJ0LnByb3h5 RnVuY3Rpb249e307RXh0LmNoYXJ0LkNoYXJ0LkNIQVJUX1VSTD0iaHR0cDovL3l1 aS55YWhvb2FwaXMuY29tLzIuOC4yL2J1aWxkL2NoYXJ0cy9hc3NldHMvY2hhcnRz LnN3ZiI7RXh0LmNoYXJ0LlBpZUNoYXJ0PUV4dC5leHRlbmQoRXh0LmNoYXJ0LkNo YXJ0LHt0eXBlOiJwaWUiLG9uU3dmUmVhZHk6ZnVuY3Rpb24oYSl7RXh0LmNoYXJ0 LlBpZUNoYXJ0LnN1cGVyY2xhc3Mub25Td2ZSZWFkeS5jYWxsKHRoaXMsYSk7dGhp cy5zZXREYXRhRmllbGQodGhpcy5kYXRhRmllbGQpO3RoaXMuc2V0Q2F0ZWdvcnlG aWVsZCh0aGlzLmNhdGVnb3J5RmllbGQpfSxzZXREYXRhRmllbGQ6ZnVuY3Rpb24o YSl7dGhpcy5kYXRhRmllbGQ9YTt0aGlzLnN3Zi5zZXREYXRhRmllbGQoYSl9LHNl dENhdGVnb3J5RmllbGQ6ZnVuY3Rpb24oYSl7dGhpcy5jYXRlZ29yeUZpZWxkPWE7 dGhpcy5zd2Yuc2V0Q2F0ZWdvcnlGaWVsZChhKX19KTtFeHQucmVnKCJwaWVjaGFy dCIsRXh0LmNoYXJ0LlBpZUNoYXJ0KTtFeHQuY2hhcnQuQ2FydGVzaWFuQ2hhcnQ9 RXh0LmV4dGVuZChFeHQuY2hhcnQuQ2hhcnQse29uU3dmUmVhZHk6ZnVuY3Rpb24o YSl7RXh0LmNoYXJ0LkNhcnRlc2lhbkNoYXJ0LnN1cGVyY2xhc3Mub25Td2ZSZWFk eS5jYWxsKHRoaXMsYSk7dGhpcy5sYWJlbEZuPVtdO2lmKHRoaXMueEZpZWxkKXt0 aGlzLnNldFhGaWVsZCh0aGlzLnhGaWVsZCl9aWYodGhpcy55RmllbGQpe3RoaXMu c2V0WUZpZWxkKHRoaXMueUZpZWxkKX1pZih0aGlzLnhBeGlzKXt0aGlzLnNldFhB eGlzKHRoaXMueEF4aXMpfWlmKHRoaXMueEF4ZXMpe3RoaXMuc2V0WEF4ZXModGhp cy54QXhlcyl9aWYodGhpcy55QXhpcyl7dGhpcy5zZXRZQXhpcyh0aGlzLnlBeGlz KX1pZih0aGlzLnlBeGVzKXt0aGlzLnNldFlBeGVzKHRoaXMueUF4ZXMpfWlmKEV4 dC5pc0RlZmluZWQodGhpcy5jb25zdHJhaW5WaWV3cG9ydCkpe3RoaXMuc3dmLnNl dENvbnN0cmFpblZpZXdwb3J0KHRoaXMuY29uc3RyYWluVmlld3BvcnQpfX0sc2V0 WEZpZWxkOmZ1bmN0aW9uKGEpe3RoaXMueEZpZWxkPWE7dGhpcy5zd2Yuc2V0SG9y aXpvbnRhbEZpZWxkKGEpfSxzZXRZRmllbGQ6ZnVuY3Rpb24oYSl7dGhpcy55Rmll bGQ9YTt0aGlzLnN3Zi5zZXRWZXJ0aWNhbEZpZWxkKGEpfSxzZXRYQXhpczpmdW5j dGlvbihhKXt0aGlzLnhBeGlzPXRoaXMuY3JlYXRlQXhpcygieEF4aXMiLGEpO3Ro aXMuc3dmLnNldEhvcml6b250YWxBeGlzKHRoaXMueEF4aXMpfSxzZXRYQXhlczpm dW5jdGlvbihjKXt2YXIgYjtmb3IodmFyIGE9MDthPGMubGVuZ3RoO2ErKyl7Yj10 aGlzLmNyZWF0ZUF4aXMoInhBeGlzIithLGNbYV0pO3RoaXMuc3dmLnNldEhvcml6 b250YWxBeGlzKGIpfX0sc2V0WUF4aXM6ZnVuY3Rpb24oYSl7dGhpcy55QXhpcz10 aGlzLmNyZWF0ZUF4aXMoInlBeGlzIixhKTt0aGlzLnN3Zi5zZXRWZXJ0aWNhbEF4 aXModGhpcy55QXhpcyl9LHNldFlBeGVzOmZ1bmN0aW9uKGMpe3ZhciBiO2Zvcih2 YXIgYT0wO2E8Yy5sZW5ndGg7YSsrKXtiPXRoaXMuY3JlYXRlQXhpcygieUF4aXMi K2EsY1thXSk7dGhpcy5zd2Yuc2V0VmVydGljYWxBeGlzKGIpfX0sY3JlYXRlQXhp czpmdW5jdGlvbihiLGQpe3ZhciBlPUV4dC5hcHBseSh7fSxkKSxjLGE7aWYodGhp c1tiXSl7YT10aGlzW2JdLmxhYmVsRnVuY3Rpb247dGhpcy5yZW1vdmVGblByb3h5 KGEpO3RoaXMubGFiZWxGbi5yZW1vdmUoYSl9aWYoZS5sYWJlbFJlbmRlcmVyKXtj PXRoaXMuZ2V0RnVuY3Rpb25SZWYoZS5sYWJlbFJlbmRlcmVyKTtlLmxhYmVsRnVu Y3Rpb249dGhpcy5jcmVhdGVGblByb3h5KGZ1bmN0aW9uKGcpe3JldHVybiBjLmZu LmNhbGwoYy5zY29wZSxnKX0pO2RlbGV0ZSBlLmxhYmVsUmVuZGVyZXI7dGhpcy5s YWJlbEZuLnB1c2goZS5sYWJlbEZ1bmN0aW9uKX1pZihiLmluZGV4T2YoInhBeGlz Iik+LTEmJmUucG9zaXRpb249PSJsZWZ0Iil7ZS5wb3NpdGlvbj0iYm90dG9tIn1y ZXR1cm4gZX0sb25EZXN0cm95OmZ1bmN0aW9uKCl7RXh0LmNoYXJ0LkNhcnRlc2lh bkNoYXJ0LnN1cGVyY2xhc3Mub25EZXN0cm95LmNhbGwodGhpcyk7RXh0LmVhY2go dGhpcy5sYWJlbEZuLGZ1bmN0aW9uKGEpe3RoaXMucmVtb3ZlRm5Qcm94eShhKX0s dGhpcyl9fSk7RXh0LnJlZygiY2FydGVzaWFuY2hhcnQiLEV4dC5jaGFydC5DYXJ0 ZXNpYW5DaGFydCk7RXh0LmNoYXJ0LkxpbmVDaGFydD1FeHQuZXh0ZW5kKEV4dC5j aGFydC5DYXJ0ZXNpYW5DaGFydCx7dHlwZToibGluZSJ9KTtFeHQucmVnKCJsaW5l Y2hhcnQiLEV4dC5jaGFydC5MaW5lQ2hhcnQpO0V4dC5jaGFydC5Db2x1bW5DaGFy dD1FeHQuZXh0ZW5kKEV4dC5jaGFydC5DYXJ0ZXNpYW5DaGFydCx7dHlwZToiY29s dW1uIn0pO0V4dC5yZWcoImNvbHVtbmNoYXJ0IixFeHQuY2hhcnQuQ29sdW1uQ2hh cnQpO0V4dC5jaGFydC5TdGFja2VkQ29sdW1uQ2hhcnQ9RXh0LmV4dGVuZChFeHQu Y2hhcnQuQ2FydGVzaWFuQ2hhcnQse3R5cGU6InN0YWNrY29sdW1uIn0pO0V4dC5y ZWcoInN0YWNrZWRjb2x1bW5jaGFydCIsRXh0LmNoYXJ0LlN0YWNrZWRDb2x1bW5D aGFydCk7RXh0LmNoYXJ0LkJhckNoYXJ0PUV4dC5leHRlbmQoRXh0LmNoYXJ0LkNh cnRlc2lhbkNoYXJ0LHt0eXBlOiJiYXIifSk7RXh0LnJlZygiYmFyY2hhcnQiLEV4 dC5jaGFydC5CYXJDaGFydCk7RXh0LmNoYXJ0LlN0YWNrZWRCYXJDaGFydD1FeHQu ZXh0ZW5kKEV4dC5jaGFydC5DYXJ0ZXNpYW5DaGFydCx7dHlwZToic3RhY2tiYXIi fSk7RXh0LnJlZygic3RhY2tlZGJhcmNoYXJ0IixFeHQuY2hhcnQuU3RhY2tlZEJh ckNoYXJ0KTtFeHQuY2hhcnQuQXhpcz1mdW5jdGlvbihhKXtFeHQuYXBwbHkodGhp cyxhKX07RXh0LmNoYXJ0LkF4aXMucHJvdG90eXBlPXt0eXBlOm51bGwsb3JpZW50 YXRpb246Imhvcml6b250YWwiLHJldmVyc2U6ZmFsc2UsbGFiZWxGdW5jdGlvbjpu dWxsLGhpZGVPdmVybGFwcGluZ0xhYmVsczp0cnVlLGxhYmVsU3BhY2luZzoyfTtF eHQuY2hhcnQuTnVtZXJpY0F4aXM9RXh0LmV4dGVuZChFeHQuY2hhcnQuQXhpcyx7 dHlwZToibnVtZXJpYyIsbWluaW11bTpOYU4sbWF4aW11bTpOYU4sbWFqb3JVbml0 Ok5hTixtaW5vclVuaXQ6TmFOLHNuYXBUb1VuaXRzOnRydWUsYWx3YXlzU2hvd1pl cm86dHJ1ZSxzY2FsZToibGluZWFyIixyb3VuZE1ham9yVW5pdDp0cnVlLGNhbGN1 bGF0ZUJ5TGFiZWxTaXplOnRydWUscG9zaXRpb246ImxlZnQiLGFkanVzdE1heGlt dW1CeU1ham9yVW5pdDp0cnVlLGFkanVzdE1pbmltdW1CeU1ham9yVW5pdDp0cnVl fSk7RXh0LmNoYXJ0LlRpbWVBeGlzPUV4dC5leHRlbmQoRXh0LmNoYXJ0LkF4aXMs e3R5cGU6InRpbWUiLG1pbmltdW06bnVsbCxtYXhpbXVtOm51bGwsbWFqb3JVbml0 Ok5hTixtYWpvclRpbWVVbml0Om51bGwsbWlub3JVbml0Ok5hTixtaW5vclRpbWVV bml0Om51bGwsc25hcFRvVW5pdHM6dHJ1ZSxzdGFja2luZ0VuYWJsZWQ6ZmFsc2Us Y2FsY3VsYXRlQnlMYWJlbFNpemU6dHJ1ZX0pO0V4dC5jaGFydC5DYXRlZ29yeUF4 aXM9RXh0LmV4dGVuZChFeHQuY2hhcnQuQXhpcyx7dHlwZToiY2F0ZWdvcnkiLGNh dGVnb3J5TmFtZXM6bnVsbCxjYWxjdWxhdGVDYXRlZ29yeUNvdW50OmZhbHNlfSk7 RXh0LmNoYXJ0LlNlcmllcz1mdW5jdGlvbihhKXtFeHQuYXBwbHkodGhpcyxhKX07 RXh0LmNoYXJ0LlNlcmllcy5wcm90b3R5cGU9e3R5cGU6bnVsbCxkaXNwbGF5TmFt ZTpudWxsfTtFeHQuY2hhcnQuQ2FydGVzaWFuU2VyaWVzPUV4dC5leHRlbmQoRXh0 LmNoYXJ0LlNlcmllcyx7eEZpZWxkOm51bGwseUZpZWxkOm51bGwsc2hvd0luTGVn ZW5kOnRydWUsYXhpczoicHJpbWFyeSJ9KTtFeHQuY2hhcnQuQ29sdW1uU2VyaWVz PUV4dC5leHRlbmQoRXh0LmNoYXJ0LkNhcnRlc2lhblNlcmllcyx7dHlwZToiY29s dW1uIn0pO0V4dC5jaGFydC5MaW5lU2VyaWVzPUV4dC5leHRlbmQoRXh0LmNoYXJ0 LkNhcnRlc2lhblNlcmllcyx7dHlwZToibGluZSJ9KTtFeHQuY2hhcnQuQmFyU2Vy aWVzPUV4dC5leHRlbmQoRXh0LmNoYXJ0LkNhcnRlc2lhblNlcmllcyx7dHlwZToi YmFyIn0pO0V4dC5jaGFydC5QaWVTZXJpZXM9RXh0LmV4dGVuZChFeHQuY2hhcnQu U2VyaWVzLHt0eXBlOiJwaWUiLGRhdGFGaWVsZDpudWxsLGNhdGVnb3J5RmllbGQ6 bnVsbH0pO0V4dC5tZW51Lk1lbnU9RXh0LmV4dGVuZChFeHQuQ29udGFpbmVyLHtt aW5XaWR0aDoxMjAsc2hhZG93OiJzaWRlcyIsc3ViTWVudUFsaWduOiJ0bC10cj8i LGRlZmF1bHRBbGlnbjoidGwtYmw/IixhbGxvd090aGVyTWVudXM6ZmFsc2UsaWdu b3JlUGFyZW50Q2xpY2tzOmZhbHNlLGVuYWJsZVNjcm9sbGluZzp0cnVlLG1heEhl aWdodDpudWxsLHNjcm9sbEluY3JlbWVudDoyNCxzaG93U2VwYXJhdG9yOnRydWUs ZGVmYXVsdE9mZnNldHM6WzAsMF0scGxhaW46ZmFsc2UsZmxvYXRpbmc6dHJ1ZSx6 SW5kZXg6MTUwMDAsaGlkZGVuOnRydWUsbGF5b3V0OiJtZW51IixoaWRlTW9kZToi b2Zmc2V0cyIsc2Nyb2xsZXJIZWlnaHQ6OCxhdXRvTGF5b3V0OnRydWUsZGVmYXVs dFR5cGU6Im1lbnVpdGVtIixidWZmZXJSZXNpemU6ZmFsc2UsaW5pdENvbXBvbmVu dDpmdW5jdGlvbigpe2lmKEV4dC5pc0FycmF5KHRoaXMuaW5pdGlhbENvbmZpZykp e0V4dC5hcHBseSh0aGlzLHtpdGVtczp0aGlzLmluaXRpYWxDb25maWd9KX10aGlz LmFkZEV2ZW50cygiY2xpY2siLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsIml0ZW1j bGljayIpO0V4dC5tZW51Lk1lbnVNZ3IucmVnaXN0ZXIodGhpcyk7aWYodGhpcy5m bG9hdGluZyl7RXh0LkV2ZW50TWFuYWdlci5vbldpbmRvd1Jlc2l6ZSh0aGlzLmhp ZGUsdGhpcyl9ZWxzZXtpZih0aGlzLmluaXRpYWxDb25maWcuaGlkZGVuIT09ZmFs c2Upe3RoaXMuaGlkZGVuPWZhbHNlfXRoaXMuaW50ZXJuYWxEZWZhdWx0cz17aGlk ZU9uQ2xpY2s6ZmFsc2V9fUV4dC5tZW51Lk1lbnUuc3VwZXJjbGFzcy5pbml0Q29t cG9uZW50LmNhbGwodGhpcyk7aWYodGhpcy5hdXRvTGF5b3V0KXt2YXIgYT10aGlz LmRvTGF5b3V0LmNyZWF0ZURlbGVnYXRlKHRoaXMsW10pO3RoaXMub24oe2FkZDph LHJlbW92ZTphfSl9fSxnZXRMYXlvdXRUYXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4g dGhpcy51bH0sb25SZW5kZXI6ZnVuY3Rpb24oYixhKXtpZighYil7Yj1FeHQuZ2V0 Qm9keSgpfXZhciBjPXtpZDp0aGlzLmdldElkKCksY2xzOiJ4LW1lbnUgIisoKHRo aXMuZmxvYXRpbmcpPyJ4LW1lbnUtZmxvYXRpbmcgeC1sYXllciAiOiIiKSsodGhp cy5jbHN8fCIiKSsodGhpcy5wbGFpbj8iIHgtbWVudS1wbGFpbiI6IiIpKyh0aGlz LnNob3dTZXBhcmF0b3I/IiI6IiB4LW1lbnUtbm9zZXAiKSxzdHlsZTp0aGlzLnN0 eWxlLGNuOlt7dGFnOiJhIixjbHM6IngtbWVudS1mb2N1cyIsaHJlZjoiIyIsb25j bGljazoicmV0dXJuIGZhbHNlOyIsdGFiSW5kZXg6Ii0xIn0se3RhZzoidWwiLGNs czoieC1tZW51LWxpc3QifV19O2lmKHRoaXMuZmxvYXRpbmcpe3RoaXMuZWw9bmV3 IEV4dC5MYXllcih7c2hhZG93OnRoaXMuc2hhZG93LGRoOmMsY29uc3RyYWluOmZh bHNlLHBhcmVudEVsOmIsemluZGV4OnRoaXMuekluZGV4fSl9ZWxzZXt0aGlzLmVs PWIuY3JlYXRlQ2hpbGQoYyl9RXh0Lm1lbnUuTWVudS5zdXBlcmNsYXNzLm9uUmVu ZGVyLmNhbGwodGhpcyxiLGEpO2lmKCF0aGlzLmtleU5hdil7dGhpcy5rZXlOYXY9 bmV3IEV4dC5tZW51Lk1lbnVOYXYodGhpcyl9dGhpcy5mb2N1c0VsPXRoaXMuZWwu Y2hpbGQoImEueC1tZW51LWZvY3VzIik7dGhpcy51bD10aGlzLmVsLmNoaWxkKCJ1 bC54LW1lbnUtbGlzdCIpO3RoaXMubW9uKHRoaXMudWwse3Njb3BlOnRoaXMsY2xp Y2s6dGhpcy5vbkNsaWNrLG1vdXNlb3Zlcjp0aGlzLm9uTW91c2VPdmVyLG1vdXNl b3V0OnRoaXMub25Nb3VzZU91dH0pO2lmKHRoaXMuZW5hYmxlU2Nyb2xsaW5nKXt0 aGlzLm1vbih0aGlzLmVsLHtzY29wZTp0aGlzLGRlbGVnYXRlOiIueC1tZW51LXNj cm9sbGVyIixjbGljazp0aGlzLm9uU2Nyb2xsLG1vdXNlb3Zlcjp0aGlzLmRlYWN0 aXZhdGVBY3RpdmV9KX19LGZpbmRUYXJnZXRJdGVtOmZ1bmN0aW9uKGIpe3ZhciBh PWIuZ2V0VGFyZ2V0KCIueC1tZW51LWxpc3QtaXRlbSIsdGhpcy51bCx0cnVlKTtp ZihhJiZhLm1lbnVJdGVtSWQpe3JldHVybiB0aGlzLml0ZW1zLmdldChhLm1lbnVJ dGVtSWQpfX0sb25DbGljazpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmZpbmRUYXJn ZXRJdGVtKGIpO2lmKGEpe2lmKGEuaXNGb3JtRmllbGQpe3RoaXMuc2V0QWN0aXZl SXRlbShhKX1lbHNle2lmKGEgaW5zdGFuY2VvZiBFeHQubWVudS5CYXNlSXRlbSl7 aWYoYS5tZW51JiZ0aGlzLmlnbm9yZVBhcmVudENsaWNrcyl7YS5leHBhbmRNZW51 KCk7Yi5wcmV2ZW50RGVmYXVsdCgpfWVsc2V7aWYoYS5vbkNsaWNrKXthLm9uQ2xp Y2soYik7dGhpcy5maXJlRXZlbnQoImNsaWNrIix0aGlzLGEsYil9fX19fX0sc2V0 QWN0aXZlSXRlbTpmdW5jdGlvbihhLGIpe2lmKGEhPXRoaXMuYWN0aXZlSXRlbSl7 dGhpcy5kZWFjdGl2YXRlQWN0aXZlKCk7aWYoKHRoaXMuYWN0aXZlSXRlbT1hKS5p c0Zvcm1GaWVsZCl7YS5mb2N1cygpfWVsc2V7YS5hY3RpdmF0ZShiKX19ZWxzZXtp ZihiKXthLmV4cGFuZE1lbnUoKX19fSxkZWFjdGl2YXRlQWN0aXZlOmZ1bmN0aW9u KCl7dmFyIGI9dGhpcy5hY3RpdmVJdGVtO2lmKGIpe2lmKGIuaXNGb3JtRmllbGQp e2lmKGIuY29sbGFwc2Upe2IuY29sbGFwc2UoKX19ZWxzZXtiLmRlYWN0aXZhdGUo KX1kZWxldGUgdGhpcy5hY3RpdmVJdGVtfX0sdHJ5QWN0aXZhdGU6ZnVuY3Rpb24o ZyxlKXt2YXIgYj10aGlzLml0ZW1zO2Zvcih2YXIgYz1nLGE9Yi5sZW5ndGg7Yz49 MCYmYzxhO2MrPWUpe3ZhciBkPWIuZ2V0KGMpO2lmKGQuaXNWaXNpYmxlKCkmJiFk LmRpc2FibGVkJiYoZC5jYW5BY3RpdmF0ZXx8ZC5pc0Zvcm1GaWVsZCkpe3RoaXMu c2V0QWN0aXZlSXRlbShkLGZhbHNlKTtyZXR1cm4gZH19cmV0dXJuIGZhbHNlfSxv bk1vdXNlT3ZlcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmZpbmRUYXJnZXRJdGVt KGIpO2lmKGEpe2lmKGEuY2FuQWN0aXZhdGUmJiFhLmRpc2FibGVkKXt0aGlzLnNl dEFjdGl2ZUl0ZW0oYSx0cnVlKX19dGhpcy5vdmVyPXRydWU7dGhpcy5maXJlRXZl bnQoIm1vdXNlb3ZlciIsdGhpcyxiLGEpfSxvbk1vdXNlT3V0OmZ1bmN0aW9uKGIp e3ZhciBhPXRoaXMuZmluZFRhcmdldEl0ZW0oYik7aWYoYSl7aWYoYT09dGhpcy5h Y3RpdmVJdGVtJiZhLnNob3VsZERlYWN0aXZhdGUmJmEuc2hvdWxkRGVhY3RpdmF0 ZShiKSl7dGhpcy5hY3RpdmVJdGVtLmRlYWN0aXZhdGUoKTtkZWxldGUgdGhpcy5h Y3RpdmVJdGVtfX10aGlzLm92ZXI9ZmFsc2U7dGhpcy5maXJlRXZlbnQoIm1vdXNl b3V0Iix0aGlzLGIsYSl9LG9uU2Nyb2xsOmZ1bmN0aW9uKGQsYil7aWYoZCl7ZC5z dG9wRXZlbnQoKX12YXIgYT10aGlzLnVsLmRvbSxjPUV4dC5mbHkoYikuaXMoIi54 LW1lbnUtc2Nyb2xsZXItdG9wIik7YS5zY3JvbGxUb3ArPXRoaXMuc2Nyb2xsSW5j cmVtZW50KihjPy0xOjEpO2lmKGM/YS5zY3JvbGxUb3A8PTA6YS5zY3JvbGxUb3Ar dGhpcy5hY3RpdmVNYXg+PWEuc2Nyb2xsSGVpZ2h0KXt0aGlzLm9uU2Nyb2xsZXJP dXQobnVsbCxiKX19LG9uU2Nyb2xsZXJJbjpmdW5jdGlvbihkLGIpe3ZhciBhPXRo aXMudWwuZG9tLGM9RXh0LmZseShiKS5pcygiLngtbWVudS1zY3JvbGxlci10b3Ai KTtpZihjP2Euc2Nyb2xsVG9wPjA6YS5zY3JvbGxUb3ArdGhpcy5hY3RpdmVNYXg8 YS5zY3JvbGxIZWlnaHQpe0V4dC5mbHkoYikuYWRkQ2xhc3MoWyJ4LW1lbnUtaXRl bS1hY3RpdmUiLCJ4LW1lbnUtc2Nyb2xsZXItYWN0aXZlIl0pfX0sb25TY3JvbGxl ck91dDpmdW5jdGlvbihiLGEpe0V4dC5mbHkoYSkucmVtb3ZlQ2xhc3MoWyJ4LW1l bnUtaXRlbS1hY3RpdmUiLCJ4LW1lbnUtc2Nyb2xsZXItYWN0aXZlIl0pfSxzaG93 OmZ1bmN0aW9uKGIsYyxhKXtpZih0aGlzLmZsb2F0aW5nKXt0aGlzLnBhcmVudE1l bnU9YTtpZighdGhpcy5lbCl7dGhpcy5yZW5kZXIoKTt0aGlzLmRvTGF5b3V0KGZh bHNlLHRydWUpfXRoaXMuc2hvd0F0KHRoaXMuZWwuZ2V0QWxpZ25Ub1hZKGIsY3x8 dGhpcy5kZWZhdWx0QWxpZ24sdGhpcy5kZWZhdWx0T2Zmc2V0cyksYSl9ZWxzZXtF eHQubWVudS5NZW51LnN1cGVyY2xhc3Muc2hvdy5jYWxsKHRoaXMpfX0sc2hvd0F0 OmZ1bmN0aW9uKGIsYSl7aWYodGhpcy5maXJlRXZlbnQoImJlZm9yZXNob3ciLHRo aXMpIT09ZmFsc2Upe3RoaXMucGFyZW50TWVudT1hO2lmKCF0aGlzLmVsKXt0aGlz LnJlbmRlcigpfWlmKHRoaXMuZW5hYmxlU2Nyb2xsaW5nKXt0aGlzLmVsLnNldFhZ KGIpO2JbMV09dGhpcy5jb25zdHJhaW5TY3JvbGwoYlsxXSk7Yj1bdGhpcy5lbC5h ZGp1c3RGb3JDb25zdHJhaW50cyhiKVswXSxiWzFdXX1lbHNle2I9dGhpcy5lbC5h ZGp1c3RGb3JDb25zdHJhaW50cyhiKX10aGlzLmVsLnNldFhZKGIpO3RoaXMuZWwu c2hvdygpO0V4dC5tZW51Lk1lbnUuc3VwZXJjbGFzcy5vblNob3cuY2FsbCh0aGlz KTtpZihFeHQuaXNJRSl7dGhpcy5maXJlRXZlbnQoImF1dG9zaXplIix0aGlzKTtp ZighRXh0LmlzSUU4KXt0aGlzLmVsLnJlcGFpbnQoKX19dGhpcy5oaWRkZW49ZmFs c2U7dGhpcy5mb2N1cygpO3RoaXMuZmlyZUV2ZW50KCJzaG93Iix0aGlzKX19LGNv bnN0cmFpblNjcm9sbDpmdW5jdGlvbihpKXt2YXIgYixkPXRoaXMudWwuc2V0SGVp Z2h0KCJhdXRvIikuZ2V0SGVpZ2h0KCksYT1pLGgsZSxnLGM7aWYodGhpcy5mbG9h dGluZyl7ZT1FeHQuZmx5KHRoaXMuZWwuZG9tLnBhcmVudE5vZGUpO2c9ZS5nZXRT Y3JvbGwoKS50b3A7Yz1lLmdldFZpZXdTaXplKCkuaGVpZ2h0O2g9aS1nO2I9dGhp cy5tYXhIZWlnaHQ/dGhpcy5tYXhIZWlnaHQ6Yy1oO2lmKGQ+Yyl7Yj1jO2E9aS1o fWVsc2V7aWYoYjxkKXthPWktKGQtYik7Yj1kfX19ZWxzZXtiPXRoaXMuZ2V0SGVp Z2h0KCl9aWYodGhpcy5tYXhIZWlnaHQpe2I9TWF0aC5taW4odGhpcy5tYXhIZWln aHQsYil9aWYoZD5iJiZiPjApe3RoaXMuYWN0aXZlTWF4PWItdGhpcy5zY3JvbGxl ckhlaWdodCoyLXRoaXMuZWwuZ2V0RnJhbWVXaWR0aCgidGIiKS1FeHQubnVtKHRo aXMuZWwuc2hhZG93T2Zmc2V0LDApO3RoaXMudWwuc2V0SGVpZ2h0KHRoaXMuYWN0 aXZlTWF4KTt0aGlzLmNyZWF0ZVNjcm9sbGVycygpO3RoaXMuZWwuc2VsZWN0KCIu eC1tZW51LXNjcm9sbGVyIikuc2V0RGlzcGxheWVkKCIiKX1lbHNle3RoaXMudWwu c2V0SGVpZ2h0KGQpO3RoaXMuZWwuc2VsZWN0KCIueC1tZW51LXNjcm9sbGVyIiku c2V0RGlzcGxheWVkKCJub25lIil9dGhpcy51bC5kb20uc2Nyb2xsVG9wPTA7cmV0 dXJuIGF9LGNyZWF0ZVNjcm9sbGVyczpmdW5jdGlvbigpe2lmKCF0aGlzLnNjcm9s bGVyKXt0aGlzLnNjcm9sbGVyPXtwb3M6MCx0b3A6dGhpcy5lbC5pbnNlcnRGaXJz dCh7dGFnOiJkaXYiLGNsczoieC1tZW51LXNjcm9sbGVyIHgtbWVudS1zY3JvbGxl ci10b3AiLGh0bWw6IiYjMTYwOyJ9KSxib3R0b206dGhpcy5lbC5jcmVhdGVDaGls ZCh7dGFnOiJkaXYiLGNsczoieC1tZW51LXNjcm9sbGVyIHgtbWVudS1zY3JvbGxl ci1ib3R0b20iLGh0bWw6IiYjMTYwOyJ9KX07dGhpcy5zY3JvbGxlci50b3AuaG92 ZXIodGhpcy5vblNjcm9sbGVySW4sdGhpcy5vblNjcm9sbGVyT3V0LHRoaXMpO3Ro aXMuc2Nyb2xsZXIudG9wUmVwZWF0ZXI9bmV3IEV4dC51dGlsLkNsaWNrUmVwZWF0 ZXIodGhpcy5zY3JvbGxlci50b3Ase2xpc3RlbmVyczp7Y2xpY2s6dGhpcy5vblNj cm9sbC5jcmVhdGVEZWxlZ2F0ZSh0aGlzLFtudWxsLHRoaXMuc2Nyb2xsZXIudG9w XSxmYWxzZSl9fSk7dGhpcy5zY3JvbGxlci5ib3R0b20uaG92ZXIodGhpcy5vblNj cm9sbGVySW4sdGhpcy5vblNjcm9sbGVyT3V0LHRoaXMpO3RoaXMuc2Nyb2xsZXIu Ym90dG9tUmVwZWF0ZXI9bmV3IEV4dC51dGlsLkNsaWNrUmVwZWF0ZXIodGhpcy5z Y3JvbGxlci5ib3R0b20se2xpc3RlbmVyczp7Y2xpY2s6dGhpcy5vblNjcm9sbC5j cmVhdGVEZWxlZ2F0ZSh0aGlzLFtudWxsLHRoaXMuc2Nyb2xsZXIuYm90dG9tXSxm YWxzZSl9fSl9fSxvbkxheW91dDpmdW5jdGlvbigpe2lmKHRoaXMuaXNWaXNpYmxl KCkpe2lmKHRoaXMuZW5hYmxlU2Nyb2xsaW5nKXt0aGlzLmNvbnN0cmFpblNjcm9s bCh0aGlzLmVsLmdldFRvcCgpKX1pZih0aGlzLmZsb2F0aW5nKXt0aGlzLmVsLnN5 bmMoKX19fSxmb2N1czpmdW5jdGlvbigpe2lmKCF0aGlzLmhpZGRlbil7dGhpcy5k b0ZvY3VzLmRlZmVyKDUwLHRoaXMpfX0sZG9Gb2N1czpmdW5jdGlvbigpe2lmKCF0 aGlzLmhpZGRlbil7dGhpcy5mb2N1c0VsLmZvY3VzKCl9fSxoaWRlOmZ1bmN0aW9u KGEpe2lmKCF0aGlzLmlzRGVzdHJveWVkKXt0aGlzLmRlZXBIaWRlPWE7RXh0Lm1l bnUuTWVudS5zdXBlcmNsYXNzLmhpZGUuY2FsbCh0aGlzKTtkZWxldGUgdGhpcy5k ZWVwSGlkZX19LG9uSGlkZTpmdW5jdGlvbigpe0V4dC5tZW51Lk1lbnUuc3VwZXJj bGFzcy5vbkhpZGUuY2FsbCh0aGlzKTt0aGlzLmRlYWN0aXZhdGVBY3RpdmUoKTtp Zih0aGlzLmVsJiZ0aGlzLmZsb2F0aW5nKXt0aGlzLmVsLmhpZGUoKX12YXIgYT10 aGlzLnBhcmVudE1lbnU7aWYodGhpcy5kZWVwSGlkZT09PXRydWUmJmEpe2lmKGEu ZmxvYXRpbmcpe2EuaGlkZSh0cnVlKX1lbHNle2EuZGVhY3RpdmF0ZUFjdGl2ZSgp fX19LGxvb2t1cENvbXBvbmVudDpmdW5jdGlvbihhKXtpZihFeHQuaXNTdHJpbmco YSkpe2E9KGE9PSJzZXBhcmF0b3IifHxhPT0iLSIpP25ldyBFeHQubWVudS5TZXBh cmF0b3IoKTpuZXcgRXh0Lm1lbnUuVGV4dEl0ZW0oYSk7dGhpcy5hcHBseURlZmF1 bHRzKGEpfWVsc2V7aWYoRXh0LmlzT2JqZWN0KGEpKXthPXRoaXMuZ2V0TWVudUl0 ZW0oYSl9ZWxzZXtpZihhLnRhZ05hbWV8fGEuZWwpe2E9bmV3IEV4dC5Cb3hDb21w b25lbnQoe2VsOmF9KX19fXJldHVybiBhfSxhcHBseURlZmF1bHRzOmZ1bmN0aW9u KGIpe2lmKCFFeHQuaXNTdHJpbmcoYikpe2I9RXh0Lm1lbnUuTWVudS5zdXBlcmNs YXNzLmFwcGx5RGVmYXVsdHMuY2FsbCh0aGlzLGIpO3ZhciBhPXRoaXMuaW50ZXJu YWxEZWZhdWx0cztpZihhKXtpZihiLmV2ZW50cyl7RXh0LmFwcGx5SWYoYi5pbml0 aWFsQ29uZmlnLGEpO0V4dC5hcHBseShiLGEpfWVsc2V7RXh0LmFwcGx5SWYoYixh KX19fXJldHVybiBifSxnZXRNZW51SXRlbTpmdW5jdGlvbihhKXthLm93bmVyQ3Q9 dGhpcztpZighYS5pc1hUeXBlKXtpZighYS54dHlwZSYmRXh0LmlzQm9vbGVhbihh LmNoZWNrZWQpKXtyZXR1cm4gbmV3IEV4dC5tZW51LkNoZWNrSXRlbShhKX1yZXR1 cm4gRXh0LmNyZWF0ZShhLHRoaXMuZGVmYXVsdFR5cGUpfXJldHVybiBhfSxhZGRT ZXBhcmF0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGQobmV3IEV4dC5tZW51 LlNlcGFyYXRvcigpKX0sYWRkRWxlbWVudDpmdW5jdGlvbihhKXtyZXR1cm4gdGhp cy5hZGQobmV3IEV4dC5tZW51LkJhc2VJdGVtKHtlbDphfSkpfSxhZGRJdGVtOmZ1 bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChhKX0sYWRkTWVudUl0ZW06ZnVuY3Rp b24oYSl7cmV0dXJuIHRoaXMuYWRkKHRoaXMuZ2V0TWVudUl0ZW0oYSkpfSxhZGRU ZXh0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChuZXcgRXh0Lm1lbnUuVGV4 dEl0ZW0oYSkpfSxvbkRlc3Ryb3k6ZnVuY3Rpb24oKXtFeHQuRXZlbnRNYW5hZ2Vy LnJlbW92ZVJlc2l6ZUxpc3RlbmVyKHRoaXMuaGlkZSx0aGlzKTt2YXIgYT10aGlz LnBhcmVudE1lbnU7aWYoYSYmYS5hY3RpdmVDaGlsZD09dGhpcyl7ZGVsZXRlIGEu YWN0aXZlQ2hpbGR9ZGVsZXRlIHRoaXMucGFyZW50TWVudTtFeHQubWVudS5NZW51 LnN1cGVyY2xhc3Mub25EZXN0cm95LmNhbGwodGhpcyk7RXh0Lm1lbnUuTWVudU1n ci51bnJlZ2lzdGVyKHRoaXMpO2lmKHRoaXMua2V5TmF2KXt0aGlzLmtleU5hdi5k aXNhYmxlKCl9dmFyIGI9dGhpcy5zY3JvbGxlcjtpZihiKXtFeHQuZGVzdHJveShi LnRvcFJlcGVhdGVyLGIuYm90dG9tUmVwZWF0ZXIsYi50b3AsYi5ib3R0b20pfUV4 dC5kZXN0cm95KHRoaXMuZWwsdGhpcy5mb2N1c0VsLHRoaXMudWwpfX0pO0V4dC5y ZWcoIm1lbnUiLEV4dC5tZW51Lk1lbnUpO0V4dC5tZW51Lk1lbnVOYXY9RXh0LmV4 dGVuZChFeHQuS2V5TmF2LGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShkLGMpe2lmKCFj LnRyeUFjdGl2YXRlKGMuaXRlbXMuaW5kZXhPZihjLmFjdGl2ZUl0ZW0pLTEsLTEp KXtjLnRyeUFjdGl2YXRlKGMuaXRlbXMubGVuZ3RoLTEsLTEpfX1mdW5jdGlvbiBi KGQsYyl7aWYoIWMudHJ5QWN0aXZhdGUoYy5pdGVtcy5pbmRleE9mKGMuYWN0aXZl SXRlbSkrMSwxKSl7Yy50cnlBY3RpdmF0ZSgwLDEpfX1yZXR1cm57Y29uc3RydWN0 b3I6ZnVuY3Rpb24oYyl7RXh0Lm1lbnUuTWVudU5hdi5zdXBlcmNsYXNzLmNvbnN0 cnVjdG9yLmNhbGwodGhpcyxjLmVsKTt0aGlzLnNjb3BlPXRoaXMubWVudT1jfSxk b1JlbGF5OmZ1bmN0aW9uKGcsZCl7dmFyIGM9Zy5nZXRLZXkoKTtpZih0aGlzLm1l bnUuYWN0aXZlSXRlbSYmdGhpcy5tZW51LmFjdGl2ZUl0ZW0uaXNGb3JtRmllbGQm JmMhPWcuVEFCKXtyZXR1cm4gZmFsc2V9aWYoIXRoaXMubWVudS5hY3RpdmVJdGVt JiZnLmlzTmF2S2V5UHJlc3MoKSYmYyE9Zy5TUEFDRSYmYyE9Zy5SRVRVUk4pe3Ro aXMubWVudS50cnlBY3RpdmF0ZSgwLDEpO3JldHVybiBmYWxzZX1yZXR1cm4gZC5j YWxsKHRoaXMuc2NvcGV8fHRoaXMsZyx0aGlzLm1lbnUpfSx0YWI6ZnVuY3Rpb24o ZCxjKXtkLnN0b3BFdmVudCgpO2lmKGQuc2hpZnRLZXkpe2EoZCxjKX1lbHNle2Io ZCxjKX19LHVwOmEsZG93bjpiLHJpZ2h0OmZ1bmN0aW9uKGQsYyl7aWYoYy5hY3Rp dmVJdGVtKXtjLmFjdGl2ZUl0ZW0uZXhwYW5kTWVudSh0cnVlKX19LGxlZnQ6ZnVu Y3Rpb24oZCxjKXtjLmhpZGUoKTtpZihjLnBhcmVudE1lbnUmJmMucGFyZW50TWVu dS5hY3RpdmVJdGVtKXtjLnBhcmVudE1lbnUuYWN0aXZlSXRlbS5hY3RpdmF0ZSgp fX0sZW50ZXI6ZnVuY3Rpb24oZCxjKXtpZihjLmFjdGl2ZUl0ZW0pe2Quc3RvcFBy b3BhZ2F0aW9uKCk7Yy5hY3RpdmVJdGVtLm9uQ2xpY2soZCk7Yy5maXJlRXZlbnQo ImNsaWNrIix0aGlzLGMuYWN0aXZlSXRlbSk7cmV0dXJuIHRydWV9fX19KCkpO0V4 dC5tZW51Lk1lbnVNZ3I9ZnVuY3Rpb24oKXt2YXIgaCxlLGIsZD17fSxhPWZhbHNl LGw9bmV3IERhdGUoKTtmdW5jdGlvbiBuKCl7aD17fTtlPW5ldyBFeHQudXRpbC5N aXhlZENvbGxlY3Rpb24oKTtiPUV4dC5nZXREb2MoKS5hZGRLZXlMaXN0ZW5lcigy NyxqKTtiLmRpc2FibGUoKX1mdW5jdGlvbiBqKCl7aWYoZSYmZS5sZW5ndGg+MCl7 dmFyIG89ZS5jbG9uZSgpO28uZWFjaChmdW5jdGlvbihwKXtwLmhpZGUoKX0pO3Jl dHVybiB0cnVlfXJldHVybiBmYWxzZX1mdW5jdGlvbiBnKG8pe2UucmVtb3ZlKG8p O2lmKGUubGVuZ3RoPDEpe2IuZGlzYWJsZSgpO0V4dC5nZXREb2MoKS51bigibW91 c2Vkb3duIixtKTthPWZhbHNlfX1mdW5jdGlvbiBrKG8pe3ZhciBwPWUubGFzdCgp O2w9bmV3IERhdGUoKTtlLmFkZChvKTtpZighYSl7Yi5lbmFibGUoKTtFeHQuZ2V0 RG9jKCkub24oIm1vdXNlZG93biIsbSk7YT10cnVlfWlmKG8ucGFyZW50TWVudSl7 by5nZXRFbCgpLnNldFpJbmRleChwYXJzZUludChvLnBhcmVudE1lbnUuZ2V0RWwo KS5nZXRTdHlsZSgiei1pbmRleCIpLDEwKSszKTtvLnBhcmVudE1lbnUuYWN0aXZl Q2hpbGQ9b31lbHNle2lmKHAmJiFwLmlzRGVzdHJveWVkJiZwLmlzVmlzaWJsZSgp KXtvLmdldEVsKCkuc2V0WkluZGV4KHBhcnNlSW50KHAuZ2V0RWwoKS5nZXRTdHls ZSgiei1pbmRleCIpLDEwKSszKX19fWZ1bmN0aW9uIGMobyl7aWYoby5hY3RpdmVD aGlsZCl7by5hY3RpdmVDaGlsZC5oaWRlKCl9aWYoby5hdXRvSGlkZVRpbWVyKXtj bGVhclRpbWVvdXQoby5hdXRvSGlkZVRpbWVyKTtkZWxldGUgby5hdXRvSGlkZVRp bWVyfX1mdW5jdGlvbiBpKG8pe3ZhciBwPW8ucGFyZW50TWVudTtpZighcCYmIW8u YWxsb3dPdGhlck1lbnVzKXtqKCl9ZWxzZXtpZihwJiZwLmFjdGl2ZUNoaWxkKXtw LmFjdGl2ZUNoaWxkLmhpZGUoKX19fWZ1bmN0aW9uIG0obyl7aWYobC5nZXRFbGFw c2VkKCk+NTAmJmUubGVuZ3RoPjAmJiFvLmdldFRhcmdldCgiLngtbWVudSIpKXtq KCl9fXJldHVybntoaWRlQWxsOmZ1bmN0aW9uKCl7cmV0dXJuIGooKX0scmVnaXN0 ZXI6ZnVuY3Rpb24obyl7aWYoIWgpe24oKX1oW28uaWRdPW87by5vbih7YmVmb3Jl aGlkZTpjLGhpZGU6ZyxiZWZvcmVzaG93Omksc2hvdzprfSl9LGdldDpmdW5jdGlv bihvKXtpZih0eXBlb2Ygbz09InN0cmluZyIpe2lmKCFoKXtyZXR1cm4gbnVsbH1y ZXR1cm4gaFtvXX1lbHNle2lmKG8uZXZlbnRzKXtyZXR1cm4gb31lbHNle2lmKHR5 cGVvZiBvLmxlbmd0aD09Im51bWJlciIpe3JldHVybiBuZXcgRXh0Lm1lbnUuTWVu dSh7aXRlbXM6b30pfWVsc2V7cmV0dXJuIEV4dC5jcmVhdGUobywibWVudSIpfX19 fSx1bnJlZ2lzdGVyOmZ1bmN0aW9uKG8pe2RlbGV0ZSBoW28uaWRdO28udW4oImJl Zm9yZWhpZGUiLGMpO28udW4oImhpZGUiLGcpO28udW4oImJlZm9yZXNob3ciLGkp O28udW4oInNob3ciLGspfSxyZWdpc3RlckNoZWNrYWJsZTpmdW5jdGlvbihvKXt2 YXIgcD1vLmdyb3VwO2lmKHApe2lmKCFkW3BdKXtkW3BdPVtdfWRbcF0ucHVzaChv KX19LHVucmVnaXN0ZXJDaGVja2FibGU6ZnVuY3Rpb24obyl7dmFyIHA9by5ncm91 cDtpZihwKXtkW3BdLnJlbW92ZShvKX19LG9uQ2hlY2tDaGFuZ2U6ZnVuY3Rpb24o cSxyKXtpZihxLmdyb3VwJiZyKXt2YXIgdD1kW3EuZ3JvdXBdLHA9MCxvPXQubGVu Z3RoLHM7Zm9yKDtwPG87cCsrKXtzPXRbcF07aWYocyE9cSl7cy5zZXRDaGVja2Vk KGZhbHNlKX19fX0sZ2V0Q2hlY2tlZEl0ZW06ZnVuY3Rpb24ocSl7dmFyIHI9ZFtx XTtpZihyKXtmb3IodmFyIHA9MCxvPXIubGVuZ3RoO3A8bztwKyspe2lmKHJbcF0u Y2hlY2tlZCl7cmV0dXJuIHJbcF19fX1yZXR1cm4gbnVsbH0sc2V0Q2hlY2tlZEl0 ZW06ZnVuY3Rpb24ocSxzKXt2YXIgcj1kW3FdO2lmKHIpe2Zvcih2YXIgcD0wLG89 ci5sZW5ndGg7cDxvO3ArKyl7aWYocltwXS5pZD09cyl7cltwXS5zZXRDaGVja2Vk KHRydWUpfX19cmV0dXJuIG51bGx9fX0oKTtFeHQubWVudS5CYXNlSXRlbT1FeHQu ZXh0ZW5kKEV4dC5Db21wb25lbnQse2NhbkFjdGl2YXRlOmZhbHNlLGFjdGl2ZUNs YXNzOiJ4LW1lbnUtaXRlbS1hY3RpdmUiLGhpZGVPbkNsaWNrOnRydWUsY2xpY2tI aWRlRGVsYXk6MSxjdHlwZToiRXh0Lm1lbnUuQmFzZUl0ZW0iLGFjdGlvbk1vZGU6 ImNvbnRhaW5lciIsaW5pdENvbXBvbmVudDpmdW5jdGlvbigpe0V4dC5tZW51LkJh c2VJdGVtLnN1cGVyY2xhc3MuaW5pdENvbXBvbmVudC5jYWxsKHRoaXMpO3RoaXMu YWRkRXZlbnRzKCJjbGljayIsImFjdGl2YXRlIiwiZGVhY3RpdmF0ZSIpO2lmKHRo aXMuaGFuZGxlcil7dGhpcy5vbigiY2xpY2siLHRoaXMuaGFuZGxlcix0aGlzLnNj b3BlKX19LG9uUmVuZGVyOmZ1bmN0aW9uKGIsYSl7RXh0Lm1lbnUuQmFzZUl0ZW0u c3VwZXJjbGFzcy5vblJlbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYodGhp cy5vd25lckN0JiZ0aGlzLm93bmVyQ3QgaW5zdGFuY2VvZiBFeHQubWVudS5NZW51 KXt0aGlzLnBhcmVudE1lbnU9dGhpcy5vd25lckN0fWVsc2V7dGhpcy5jb250YWlu ZXIuYWRkQ2xhc3MoIngtbWVudS1saXN0LWl0ZW0iKTt0aGlzLm1vbih0aGlzLmVs LHtzY29wZTp0aGlzLGNsaWNrOnRoaXMub25DbGljayxtb3VzZWVudGVyOnRoaXMu YWN0aXZhdGUsbW91c2VsZWF2ZTp0aGlzLmRlYWN0aXZhdGV9KX19LHNldEhhbmRs ZXI6ZnVuY3Rpb24oYixhKXtpZih0aGlzLmhhbmRsZXIpe3RoaXMudW4oImNsaWNr Iix0aGlzLmhhbmRsZXIsdGhpcy5zY29wZSl9dGhpcy5vbigiY2xpY2siLHRoaXMu aGFuZGxlcj1iLHRoaXMuc2NvcGU9YSl9LG9uQ2xpY2s6ZnVuY3Rpb24oYSl7aWYo IXRoaXMuZGlzYWJsZWQmJnRoaXMuZmlyZUV2ZW50KCJjbGljayIsdGhpcyxhKSE9 PWZhbHNlJiYodGhpcy5wYXJlbnRNZW51JiZ0aGlzLnBhcmVudE1lbnUuZmlyZUV2 ZW50KCJpdGVtY2xpY2siLHRoaXMsYSkhPT1mYWxzZSkpe3RoaXMuaGFuZGxlQ2xp Y2soYSl9ZWxzZXthLnN0b3BFdmVudCgpfX0sYWN0aXZhdGU6ZnVuY3Rpb24oKXtp Zih0aGlzLmRpc2FibGVkKXtyZXR1cm4gZmFsc2V9dmFyIGE9dGhpcy5jb250YWlu ZXI7YS5hZGRDbGFzcyh0aGlzLmFjdGl2ZUNsYXNzKTt0aGlzLnJlZ2lvbj1hLmdl dFJlZ2lvbigpLmFkanVzdCgyLDIsLTIsLTIpO3RoaXMuZmlyZUV2ZW50KCJhY3Rp dmF0ZSIsdGhpcyk7cmV0dXJuIHRydWV9LGRlYWN0aXZhdGU6ZnVuY3Rpb24oKXt0 aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcyh0aGlzLmFjdGl2ZUNsYXNzKTt0aGlz LmZpcmVFdmVudCgiZGVhY3RpdmF0ZSIsdGhpcyl9LHNob3VsZERlYWN0aXZhdGU6 ZnVuY3Rpb24oYSl7cmV0dXJuICF0aGlzLnJlZ2lvbnx8IXRoaXMucmVnaW9uLmNv bnRhaW5zKGEuZ2V0UG9pbnQoKSl9LGhhbmRsZUNsaWNrOmZ1bmN0aW9uKGIpe3Zh ciBhPXRoaXMucGFyZW50TWVudTtpZih0aGlzLmhpZGVPbkNsaWNrKXtpZihhLmZs b2F0aW5nKXt0aGlzLmNsaWNrSGlkZURlbGF5VGltZXI9YS5oaWRlLmRlZmVyKHRo aXMuY2xpY2tIaWRlRGVsYXksYSxbdHJ1ZV0pfWVsc2V7YS5kZWFjdGl2YXRlQWN0 aXZlKCl9fX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0 aGlzLmNsaWNrSGlkZURlbGF5VGltZXIpO0V4dC5tZW51LkJhc2VJdGVtLnN1cGVy Y2xhc3MuYmVmb3JlRGVzdHJveS5jYWxsKHRoaXMpfSxleHBhbmRNZW51OkV4dC5l bXB0eUZuLGhpZGVNZW51OkV4dC5lbXB0eUZufSk7RXh0LnJlZygibWVudWJhc2Vp dGVtIixFeHQubWVudS5CYXNlSXRlbSk7RXh0Lm1lbnUuVGV4dEl0ZW09RXh0LmV4 dGVuZChFeHQubWVudS5CYXNlSXRlbSx7aGlkZU9uQ2xpY2s6ZmFsc2UsaXRlbUNs czoieC1tZW51LXRleHQiLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe2lmKHR5cGVv ZiBhPT0ic3RyaW5nIil7YT17dGV4dDphfX1FeHQubWVudS5UZXh0SXRlbS5zdXBl cmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKX0sb25SZW5kZXI6ZnVuY3Rp b24oKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7YS5jbGFz c05hbWU9dGhpcy5pdGVtQ2xzO2EuaW5uZXJIVE1MPXRoaXMudGV4dDt0aGlzLmVs PWE7RXh0Lm1lbnUuVGV4dEl0ZW0uc3VwZXJjbGFzcy5vblJlbmRlci5hcHBseSh0 aGlzLGFyZ3VtZW50cyl9fSk7RXh0LnJlZygibWVudXRleHRpdGVtIixFeHQubWVu dS5UZXh0SXRlbSk7RXh0Lm1lbnUuU2VwYXJhdG9yPUV4dC5leHRlbmQoRXh0Lm1l bnUuQmFzZUl0ZW0se2l0ZW1DbHM6IngtbWVudS1zZXAiLGhpZGVPbkNsaWNrOmZh bHNlLGFjdGl2ZUNsYXNzOiIiLG9uUmVuZGVyOmZ1bmN0aW9uKGEpe3ZhciBiPWRv Y3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtiLmNsYXNzTmFtZT10aGlzLml0 ZW1DbHM7Yi5pbm5lckhUTUw9IiYjMTYwOyI7dGhpcy5lbD1iO2EuYWRkQ2xhc3Mo IngtbWVudS1zZXAtbGkiKTtFeHQubWVudS5TZXBhcmF0b3Iuc3VwZXJjbGFzcy5v blJlbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSk7RXh0LnJlZygibWVudXNl cGFyYXRvciIsRXh0Lm1lbnUuU2VwYXJhdG9yKTtFeHQubWVudS5JdGVtPUV4dC5l eHRlbmQoRXh0Lm1lbnUuQmFzZUl0ZW0se2l0ZW1DbHM6IngtbWVudS1pdGVtIixj YW5BY3RpdmF0ZTp0cnVlLHNob3dEZWxheToyMDAsYWx0VGV4dDoiIixoaWRlRGVs YXk6MjAwLGN0eXBlOiJFeHQubWVudS5JdGVtIixpbml0Q29tcG9uZW50OmZ1bmN0 aW9uKCl7RXh0Lm1lbnUuSXRlbS5zdXBlcmNsYXNzLmluaXRDb21wb25lbnQuY2Fs bCh0aGlzKTtpZih0aGlzLm1lbnUpe2lmKEV4dC5pc0FycmF5KHRoaXMubWVudSkp e3RoaXMubWVudT17aXRlbXM6dGhpcy5tZW51fX1pZihFeHQuaXNPYmplY3QodGhp cy5tZW51KSl7dGhpcy5tZW51Lm93bmVyQ3Q9dGhpc310aGlzLm1lbnU9RXh0Lm1l bnUuTWVudU1nci5nZXQodGhpcy5tZW51KTt0aGlzLm1lbnUub3duZXJDdD11bmRl ZmluZWR9fSxvblJlbmRlcjpmdW5jdGlvbihkLGIpe2lmKCF0aGlzLml0ZW1UcGwp e3RoaXMuaXRlbVRwbD1FeHQubWVudS5JdGVtLnByb3RvdHlwZS5pdGVtVHBsPW5l dyBFeHQuWFRlbXBsYXRlKCc8YSBpZD0ie2lkfSIgY2xhc3M9IntjbHN9IiBoaWRl Zm9jdXM9InRydWUiIHVuc2VsZWN0YWJsZT0ib24iIGhyZWY9IntocmVmfSInLCc8 dHBsIGlmPSJocmVmVGFyZ2V0Ij4nLCcgdGFyZ2V0PSJ7aHJlZlRhcmdldH0iJywi PC90cGw+IiwiPiIsJzxpbWcgYWx0PSJ7YWx0VGV4dH0iIHNyYz0ie2ljb259IiBj bGFzcz0ieC1tZW51LWl0ZW0taWNvbiB7aWNvbkNsc30iLz4nLCc8c3BhbiBjbGFz cz0ieC1tZW51LWl0ZW0tdGV4dCI+e3RleHR9PC9zcGFuPicsIjwvYT4iKX12YXIg Yz10aGlzLmdldFRlbXBsYXRlQXJncygpO3RoaXMuZWw9Yj90aGlzLml0ZW1UcGwu aW5zZXJ0QmVmb3JlKGIsYyx0cnVlKTp0aGlzLml0ZW1UcGwuYXBwZW5kKGQsYyx0 cnVlKTt0aGlzLmljb25FbD10aGlzLmVsLmNoaWxkKCJpbWcueC1tZW51LWl0ZW0t aWNvbiIpO3RoaXMudGV4dEVsPXRoaXMuZWwuY2hpbGQoIi54LW1lbnUtaXRlbS10 ZXh0Iik7aWYoIXRoaXMuaHJlZil7dGhpcy5tb24odGhpcy5lbCwiY2xpY2siLEV4 dC5lbXB0eUZuLG51bGwse3ByZXZlbnREZWZhdWx0OnRydWV9KX1FeHQubWVudS5J dGVtLnN1cGVyY2xhc3Mub25SZW5kZXIuY2FsbCh0aGlzLGQsYil9LGdldFRlbXBs YXRlQXJnczpmdW5jdGlvbigpe3JldHVybntpZDp0aGlzLmlkLGNsczp0aGlzLml0 ZW1DbHMrKHRoaXMubWVudT8iIHgtbWVudS1pdGVtLWFycm93IjoiIikrKHRoaXMu Y2xzPyIgIit0aGlzLmNsczoiIiksaHJlZjp0aGlzLmhyZWZ8fCIjIixocmVmVGFy Z2V0OnRoaXMuaHJlZlRhcmdldCxpY29uOnRoaXMuaWNvbnx8RXh0LkJMQU5LX0lN QUdFX1VSTCxpY29uQ2xzOnRoaXMuaWNvbkNsc3x8IiIsdGV4dDp0aGlzLml0ZW1U ZXh0fHx0aGlzLnRleHR8fCImIzE2MDsiLGFsdFRleHQ6dGhpcy5hbHRUZXh0fHwi In19LHNldFRleHQ6ZnVuY3Rpb24oYSl7dGhpcy50ZXh0PWF8fCImIzE2MDsiO2lm KHRoaXMucmVuZGVyZWQpe3RoaXMudGV4dEVsLnVwZGF0ZSh0aGlzLnRleHQpO3Ro aXMucGFyZW50TWVudS5sYXlvdXQuZG9BdXRvU2l6ZSgpfX0sc2V0SWNvbkNsYXNz OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuaWNvbkNsczt0aGlzLmljb25DbHM9YTtp Zih0aGlzLnJlbmRlcmVkKXt0aGlzLmljb25FbC5yZXBsYWNlQ2xhc3MoYix0aGlz Lmljb25DbHMpfX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe2NsZWFyVGltZW91 dCh0aGlzLnNob3dUaW1lcik7Y2xlYXJUaW1lb3V0KHRoaXMuaGlkZVRpbWVyKTtp Zih0aGlzLm1lbnUpe2RlbGV0ZSB0aGlzLm1lbnUub3duZXJDdDt0aGlzLm1lbnUu ZGVzdHJveSgpfUV4dC5tZW51Lkl0ZW0uc3VwZXJjbGFzcy5iZWZvcmVEZXN0cm95 LmNhbGwodGhpcyl9LGhhbmRsZUNsaWNrOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhy ZWYpe2Euc3RvcEV2ZW50KCl9RXh0Lm1lbnUuSXRlbS5zdXBlcmNsYXNzLmhhbmRs ZUNsaWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYWN0aXZhdGU6ZnVuY3Rpb24o YSl7aWYoRXh0Lm1lbnUuSXRlbS5zdXBlcmNsYXNzLmFjdGl2YXRlLmFwcGx5KHRo aXMsYXJndW1lbnRzKSl7dGhpcy5mb2N1cygpO2lmKGEpe3RoaXMuZXhwYW5kTWVu dSgpfX1yZXR1cm4gdHJ1ZX0sc2hvdWxkRGVhY3RpdmF0ZTpmdW5jdGlvbihhKXtp ZihFeHQubWVudS5JdGVtLnN1cGVyY2xhc3Muc2hvdWxkRGVhY3RpdmF0ZS5jYWxs KHRoaXMsYSkpe2lmKHRoaXMubWVudSYmdGhpcy5tZW51LmlzVmlzaWJsZSgpKXty ZXR1cm4gIXRoaXMubWVudS5nZXRFbCgpLmdldFJlZ2lvbigpLmNvbnRhaW5zKGEu Z2V0UG9pbnQoKSl9cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfSxkZWFjdGl2YXRl OmZ1bmN0aW9uKCl7RXh0Lm1lbnUuSXRlbS5zdXBlcmNsYXNzLmRlYWN0aXZhdGUu YXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaGlkZU1lbnUoKX0sZXhwYW5kTWVu dTpmdW5jdGlvbihhKXtpZighdGhpcy5kaXNhYmxlZCYmdGhpcy5tZW51KXtjbGVh clRpbWVvdXQodGhpcy5oaWRlVGltZXIpO2RlbGV0ZSB0aGlzLmhpZGVUaW1lcjtp ZighdGhpcy5tZW51LmlzVmlzaWJsZSgpJiYhdGhpcy5zaG93VGltZXIpe3RoaXMu c2hvd1RpbWVyPXRoaXMuZGVmZXJFeHBhbmQuZGVmZXIodGhpcy5zaG93RGVsYXks dGhpcyxbYV0pfWVsc2V7aWYodGhpcy5tZW51LmlzVmlzaWJsZSgpJiZhKXt0aGlz Lm1lbnUudHJ5QWN0aXZhdGUoMCwxKX19fX0sZGVmZXJFeHBhbmQ6ZnVuY3Rpb24o YSl7ZGVsZXRlIHRoaXMuc2hvd1RpbWVyO3RoaXMubWVudS5zaG93KHRoaXMuY29u dGFpbmVyLHRoaXMucGFyZW50TWVudS5zdWJNZW51QWxpZ258fCJ0bC10cj8iLHRo aXMucGFyZW50TWVudSk7aWYoYSl7dGhpcy5tZW51LnRyeUFjdGl2YXRlKDAsMSl9 fSxoaWRlTWVudTpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLnNob3dUaW1l cik7ZGVsZXRlIHRoaXMuc2hvd1RpbWVyO2lmKCF0aGlzLmhpZGVUaW1lciYmdGhp cy5tZW51JiZ0aGlzLm1lbnUuaXNWaXNpYmxlKCkpe3RoaXMuaGlkZVRpbWVyPXRo aXMuZGVmZXJIaWRlLmRlZmVyKHRoaXMuaGlkZURlbGF5LHRoaXMpfX0sZGVmZXJI aWRlOmZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMuaGlkZVRpbWVyO2lmKHRoaXMubWVu dS5vdmVyKXt0aGlzLnBhcmVudE1lbnUuc2V0QWN0aXZlSXRlbSh0aGlzLGZhbHNl KX1lbHNle3RoaXMubWVudS5oaWRlKCl9fX0pO0V4dC5yZWcoIm1lbnVpdGVtIixF eHQubWVudS5JdGVtKTtFeHQubWVudS5DaGVja0l0ZW09RXh0LmV4dGVuZChFeHQu bWVudS5JdGVtLHtpdGVtQ2xzOiJ4LW1lbnUtaXRlbSB4LW1lbnUtY2hlY2staXRl bSIsZ3JvdXBDbGFzczoieC1tZW51LWdyb3VwLWl0ZW0iLGNoZWNrZWQ6ZmFsc2Us Y3R5cGU6IkV4dC5tZW51LkNoZWNrSXRlbSIsaW5pdENvbXBvbmVudDpmdW5jdGlv bigpe0V4dC5tZW51LkNoZWNrSXRlbS5zdXBlcmNsYXNzLmluaXRDb21wb25lbnQu Y2FsbCh0aGlzKTt0aGlzLmFkZEV2ZW50cygiYmVmb3JlY2hlY2tjaGFuZ2UiLCJj aGVja2NoYW5nZSIpO2lmKHRoaXMuY2hlY2tIYW5kbGVyKXt0aGlzLm9uKCJjaGVj a2NoYW5nZSIsdGhpcy5jaGVja0hhbmRsZXIsdGhpcy5zY29wZSl9RXh0Lm1lbnUu TWVudU1nci5yZWdpc3RlckNoZWNrYWJsZSh0aGlzKX0sb25SZW5kZXI6ZnVuY3Rp b24oYSl7RXh0Lm1lbnUuQ2hlY2tJdGVtLnN1cGVyY2xhc3Mub25SZW5kZXIuYXBw bHkodGhpcyxhcmd1bWVudHMpO2lmKHRoaXMuZ3JvdXApe3RoaXMuZWwuYWRkQ2xh c3ModGhpcy5ncm91cENsYXNzKX1pZih0aGlzLmNoZWNrZWQpe3RoaXMuY2hlY2tl ZD1mYWxzZTt0aGlzLnNldENoZWNrZWQodHJ1ZSx0cnVlKX19LGRlc3Ryb3k6ZnVu Y3Rpb24oKXtFeHQubWVudS5NZW51TWdyLnVucmVnaXN0ZXJDaGVja2FibGUodGhp cyk7RXh0Lm1lbnUuQ2hlY2tJdGVtLnN1cGVyY2xhc3MuZGVzdHJveS5hcHBseSh0 aGlzLGFyZ3VtZW50cyl9LHNldENoZWNrZWQ6ZnVuY3Rpb24oYixhKXt2YXIgYz1h PT09dHJ1ZTtpZih0aGlzLmNoZWNrZWQhPWImJihjfHx0aGlzLmZpcmVFdmVudCgi YmVmb3JlY2hlY2tjaGFuZ2UiLHRoaXMsYikhPT1mYWxzZSkpe0V4dC5tZW51Lk1l bnVNZ3Iub25DaGVja0NoYW5nZSh0aGlzLGIpO2lmKHRoaXMuY29udGFpbmVyKXt0 aGlzLmNvbnRhaW5lcltiPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oIngtbWVu dS1pdGVtLWNoZWNrZWQiKX10aGlzLmNoZWNrZWQ9YjtpZighYyl7dGhpcy5maXJl RXZlbnQoImNoZWNrY2hhbmdlIix0aGlzLGIpfX19LGhhbmRsZUNsaWNrOmZ1bmN0 aW9uKGEpe2lmKCF0aGlzLmRpc2FibGVkJiYhKHRoaXMuY2hlY2tlZCYmdGhpcy5n cm91cCkpe3RoaXMuc2V0Q2hlY2tlZCghdGhpcy5jaGVja2VkKX1FeHQubWVudS5D aGVja0l0ZW0uc3VwZXJjbGFzcy5oYW5kbGVDbGljay5hcHBseSh0aGlzLGFyZ3Vt ZW50cyl9fSk7RXh0LnJlZygibWVudWNoZWNraXRlbSIsRXh0Lm1lbnUuQ2hlY2tJ dGVtKTtFeHQubWVudS5EYXRlTWVudT1FeHQuZXh0ZW5kKEV4dC5tZW51Lk1lbnUs e2VuYWJsZVNjcm9sbGluZzpmYWxzZSxoaWRlT25DbGljazp0cnVlLHBpY2tlcklk Om51bGwsY2xzOiJ4LWRhdGUtbWVudSIsaW5pdENvbXBvbmVudDpmdW5jdGlvbigp e3RoaXMub24oImJlZm9yZXNob3ciLHRoaXMub25CZWZvcmVTaG93LHRoaXMpO2lm KHRoaXMuc3RyaWN0PShFeHQuaXNJRTcmJkV4dC5pc1N0cmljdCkpe3RoaXMub24o InNob3ciLHRoaXMub25TaG93LHRoaXMse3NpbmdsZTp0cnVlLGRlbGF5OjIwfSl9 RXh0LmFwcGx5KHRoaXMse3BsYWluOnRydWUsc2hvd1NlcGFyYXRvcjpmYWxzZSxp dGVtczp0aGlzLnBpY2tlcj1uZXcgRXh0LkRhdGVQaWNrZXIoRXh0LmFwcGx5SWYo e2ludGVybmFsUmVuZGVyOnRoaXMuc3RyaWN0fHwhRXh0LmlzSUUsY3RDbHM6Ingt bWVudS1kYXRlLWl0ZW0iLGlkOnRoaXMucGlja2VySWR9LHRoaXMuaW5pdGlhbENv bmZpZykpfSk7dGhpcy5waWNrZXIucHVyZ2VMaXN0ZW5lcnMoKTtFeHQubWVudS5E YXRlTWVudS5zdXBlcmNsYXNzLmluaXRDb21wb25lbnQuY2FsbCh0aGlzKTt0aGlz LnJlbGF5RXZlbnRzKHRoaXMucGlja2VyLFsic2VsZWN0Il0pO3RoaXMub24oInNo b3ciLHRoaXMucGlja2VyLmZvY3VzLHRoaXMucGlja2VyKTt0aGlzLm9uKCJzZWxl Y3QiLHRoaXMubWVudUhpZGUsdGhpcyk7aWYodGhpcy5oYW5kbGVyKXt0aGlzLm9u KCJzZWxlY3QiLHRoaXMuaGFuZGxlcix0aGlzLnNjb3BlfHx0aGlzKX19LG1lbnVI aWRlOmZ1bmN0aW9uKCl7aWYodGhpcy5oaWRlT25DbGljayl7dGhpcy5oaWRlKHRy dWUpfX0sb25CZWZvcmVTaG93OmZ1bmN0aW9uKCl7aWYodGhpcy5waWNrZXIpe3Ro aXMucGlja2VyLmhpZGVNb250aFBpY2tlcih0cnVlKX19LG9uU2hvdzpmdW5jdGlv bigpe3ZhciBhPXRoaXMucGlja2VyLmdldEVsKCk7YS5zZXRXaWR0aChhLmdldFdp ZHRoKCkpfX0pO0V4dC5yZWcoImRhdGVtZW51IixFeHQubWVudS5EYXRlTWVudSk7 RXh0Lm1lbnUuQ29sb3JNZW51PUV4dC5leHRlbmQoRXh0Lm1lbnUuTWVudSx7ZW5h YmxlU2Nyb2xsaW5nOmZhbHNlLGhpZGVPbkNsaWNrOnRydWUsY2xzOiJ4LWNvbG9y LW1lbnUiLHBhbGV0dGVJZDpudWxsLGluaXRDb21wb25lbnQ6ZnVuY3Rpb24oKXtF eHQuYXBwbHkodGhpcyx7cGxhaW46dHJ1ZSxzaG93U2VwYXJhdG9yOmZhbHNlLGl0 ZW1zOnRoaXMucGFsZXR0ZT1uZXcgRXh0LkNvbG9yUGFsZXR0ZShFeHQuYXBwbHlJ Zih7aWQ6dGhpcy5wYWxldHRlSWR9LHRoaXMuaW5pdGlhbENvbmZpZykpfSk7dGhp cy5wYWxldHRlLnB1cmdlTGlzdGVuZXJzKCk7RXh0Lm1lbnUuQ29sb3JNZW51LnN1 cGVyY2xhc3MuaW5pdENvbXBvbmVudC5jYWxsKHRoaXMpO3RoaXMucmVsYXlFdmVu dHModGhpcy5wYWxldHRlLFsic2VsZWN0Il0pO3RoaXMub24oInNlbGVjdCIsdGhp cy5tZW51SGlkZSx0aGlzKTtpZih0aGlzLmhhbmRsZXIpe3RoaXMub24oInNlbGVj dCIsdGhpcy5oYW5kbGVyLHRoaXMuc2NvcGV8fHRoaXMpfX0sbWVudUhpZGU6ZnVu Y3Rpb24oKXtpZih0aGlzLmhpZGVPbkNsaWNrKXt0aGlzLmhpZGUodHJ1ZSl9fX0p O0V4dC5yZWcoImNvbG9ybWVudSIsRXh0Lm1lbnUuQ29sb3JNZW51KTtFeHQuZm9y bS5GaWVsZD1FeHQuZXh0ZW5kKEV4dC5Cb3hDb21wb25lbnQse2ludmFsaWRDbGFz czoieC1mb3JtLWludmFsaWQiLGludmFsaWRUZXh0OiJUaGUgdmFsdWUgaW4gdGhp cyBmaWVsZCBpcyBpbnZhbGlkIixmb2N1c0NsYXNzOiJ4LWZvcm0tZm9jdXMiLHZh bGlkYXRpb25FdmVudDoia2V5dXAiLHZhbGlkYXRlT25CbHVyOnRydWUsdmFsaWRh dGlvbkRlbGF5OjI1MCxkZWZhdWx0QXV0b0NyZWF0ZTp7dGFnOiJpbnB1dCIsdHlw ZToidGV4dCIsc2l6ZToiMjAiLGF1dG9jb21wbGV0ZToib2ZmIn0sZmllbGRDbGFz czoieC1mb3JtLWZpZWxkIixtc2dUYXJnZXQ6InF0aXAiLG1zZ0Z4OiJub3JtYWwi LHJlYWRPbmx5OmZhbHNlLGRpc2FibGVkOmZhbHNlLHN1Ym1pdFZhbHVlOnRydWUs aXNGb3JtRmllbGQ6dHJ1ZSxtc2dEaXNwbGF5OiIiLGhhc0ZvY3VzOmZhbHNlLGlu aXRDb21wb25lbnQ6ZnVuY3Rpb24oKXtFeHQuZm9ybS5GaWVsZC5zdXBlcmNsYXNz LmluaXRDb21wb25lbnQuY2FsbCh0aGlzKTt0aGlzLmFkZEV2ZW50cygiZm9jdXMi LCJibHVyIiwic3BlY2lhbGtleSIsImNoYW5nZSIsImludmFsaWQiLCJ2YWxpZCIp fSxnZXROYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZWQmJnRoaXMu ZWwuZG9tLm5hbWU/dGhpcy5lbC5kb20ubmFtZTp0aGlzLm5hbWV8fHRoaXMuaWR8 fCIifSxvblJlbmRlcjpmdW5jdGlvbihjLGEpe2lmKCF0aGlzLmVsKXt2YXIgYj10 aGlzLmdldEF1dG9DcmVhdGUoKTtpZighYi5uYW1lKXtiLm5hbWU9dGhpcy5uYW1l fHx0aGlzLmlkfWlmKHRoaXMuaW5wdXRUeXBlKXtiLnR5cGU9dGhpcy5pbnB1dFR5 cGV9dGhpcy5hdXRvRWw9Yn1FeHQuZm9ybS5GaWVsZC5zdXBlcmNsYXNzLm9uUmVu ZGVyLmNhbGwodGhpcyxjLGEpO2lmKHRoaXMuc3VibWl0VmFsdWU9PT1mYWxzZSl7 dGhpcy5lbC5kb20ucmVtb3ZlQXR0cmlidXRlKCJuYW1lIil9dmFyIGQ9dGhpcy5l bC5kb20udHlwZTtpZihkKXtpZihkPT0icGFzc3dvcmQiKXtkPSJ0ZXh0In10aGlz LmVsLmFkZENsYXNzKCJ4LWZvcm0tIitkKX1pZih0aGlzLnJlYWRPbmx5KXt0aGlz LnNldFJlYWRPbmx5KHRydWUpfWlmKHRoaXMudGFiSW5kZXghPT11bmRlZmluZWQp e3RoaXMuZWwuZG9tLnNldEF0dHJpYnV0ZSgidGFiSW5kZXgiLHRoaXMudGFiSW5k ZXgpfXRoaXMuZWwuYWRkQ2xhc3MoW3RoaXMuZmllbGRDbGFzcyx0aGlzLmNsc10p fSxnZXRJdGVtQ3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVtQ3R9LGluaXRW YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMudmFsdWUhPT11bmRlZmluZWQpe3RoaXMu c2V0VmFsdWUodGhpcy52YWx1ZSl9ZWxzZXtpZighRXh0LmlzRW1wdHkodGhpcy5l bC5kb20udmFsdWUpJiZ0aGlzLmVsLmRvbS52YWx1ZSE9dGhpcy5lbXB0eVRleHQp e3RoaXMuc2V0VmFsdWUodGhpcy5lbC5kb20udmFsdWUpfX10aGlzLm9yaWdpbmFs VmFsdWU9dGhpcy5nZXRWYWx1ZSgpfSxpc0RpcnR5OmZ1bmN0aW9uKCl7aWYodGhp cy5kaXNhYmxlZHx8IXRoaXMucmVuZGVyZWQpe3JldHVybiBmYWxzZX1yZXR1cm4g U3RyaW5nKHRoaXMuZ2V0VmFsdWUoKSkhPT1TdHJpbmcodGhpcy5vcmlnaW5hbFZh bHVlKX0sc2V0UmVhZE9ubHk6ZnVuY3Rpb24oYSl7aWYodGhpcy5yZW5kZXJlZCl7 dGhpcy5lbC5kb20ucmVhZE9ubHk9YX10aGlzLnJlYWRPbmx5PWF9LGFmdGVyUmVu ZGVyOmZ1bmN0aW9uKCl7RXh0LmZvcm0uRmllbGQuc3VwZXJjbGFzcy5hZnRlclJl bmRlci5jYWxsKHRoaXMpO3RoaXMuaW5pdEV2ZW50cygpO3RoaXMuaW5pdFZhbHVl KCl9LGZpcmVLZXk6ZnVuY3Rpb24oYSl7aWYoYS5pc1NwZWNpYWxLZXkoKSl7dGhp cy5maXJlRXZlbnQoInNwZWNpYWxrZXkiLHRoaXMsYSl9fSxyZXNldDpmdW5jdGlv bigpe3RoaXMuc2V0VmFsdWUodGhpcy5vcmlnaW5hbFZhbHVlKTt0aGlzLmNsZWFy SW52YWxpZCgpfSxpbml0RXZlbnRzOmZ1bmN0aW9uKCl7dGhpcy5tb24odGhpcy5l bCxFeHQuRXZlbnRNYW5hZ2VyLmdldEtleUV2ZW50KCksdGhpcy5maXJlS2V5LHRo aXMpO3RoaXMubW9uKHRoaXMuZWwsImZvY3VzIix0aGlzLm9uRm9jdXMsdGhpcyk7 dGhpcy5tb24odGhpcy5lbCwiYmx1ciIsdGhpcy5vbkJsdXIsdGhpcyx0aGlzLmlu RWRpdG9yP3tidWZmZXI6MTB9Om51bGwpfSxwcmVGb2N1czpFeHQuZW1wdHlGbixv bkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5wcmVGb2N1cygpO2lmKHRoaXMuZm9jdXND bGFzcyl7dGhpcy5lbC5hZGRDbGFzcyh0aGlzLmZvY3VzQ2xhc3MpfWlmKCF0aGlz Lmhhc0ZvY3VzKXt0aGlzLmhhc0ZvY3VzPXRydWU7dGhpcy5zdGFydFZhbHVlPXRo aXMuZ2V0VmFsdWUoKTt0aGlzLmZpcmVFdmVudCgiZm9jdXMiLHRoaXMpfX0sYmVm b3JlQmx1cjpFeHQuZW1wdHlGbixvbkJsdXI6ZnVuY3Rpb24oKXt0aGlzLmJlZm9y ZUJsdXIoKTtpZih0aGlzLmZvY3VzQ2xhc3Mpe3RoaXMuZWwucmVtb3ZlQ2xhc3Mo dGhpcy5mb2N1c0NsYXNzKX10aGlzLmhhc0ZvY3VzPWZhbHNlO2lmKHRoaXMudmFs aWRhdGlvbkV2ZW50IT09ZmFsc2UmJih0aGlzLnZhbGlkYXRlT25CbHVyfHx0aGlz LnZhbGlkYXRpb25FdmVudD09ImJsdXIiKSl7dGhpcy52YWxpZGF0ZSgpfXZhciBh PXRoaXMuZ2V0VmFsdWUoKTtpZihTdHJpbmcoYSkhPT1TdHJpbmcodGhpcy5zdGFy dFZhbHVlKSl7dGhpcy5maXJlRXZlbnQoImNoYW5nZSIsdGhpcyxhLHRoaXMuc3Rh cnRWYWx1ZSl9dGhpcy5maXJlRXZlbnQoImJsdXIiLHRoaXMpO3RoaXMucG9zdEJs dXIoKX0scG9zdEJsdXI6RXh0LmVtcHR5Rm4saXNWYWxpZDpmdW5jdGlvbihhKXtp Zih0aGlzLmRpc2FibGVkKXtyZXR1cm4gdHJ1ZX12YXIgYz10aGlzLnByZXZlbnRN YXJrO3RoaXMucHJldmVudE1hcms9YT09PXRydWU7dmFyIGI9dGhpcy52YWxpZGF0 ZVZhbHVlKHRoaXMucHJvY2Vzc1ZhbHVlKHRoaXMuZ2V0UmF3VmFsdWUoKSksYSk7 dGhpcy5wcmV2ZW50TWFyaz1jO3JldHVybiBifSx2YWxpZGF0ZTpmdW5jdGlvbigp e2lmKHRoaXMuZGlzYWJsZWR8fHRoaXMudmFsaWRhdGVWYWx1ZSh0aGlzLnByb2Nl c3NWYWx1ZSh0aGlzLmdldFJhd1ZhbHVlKCkpKSl7dGhpcy5jbGVhckludmFsaWQo KTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9LHByb2Nlc3NWYWx1ZTpmdW5jdGlv bihhKXtyZXR1cm4gYX0sdmFsaWRhdGVWYWx1ZTpmdW5jdGlvbihiKXt2YXIgYT10 aGlzLmdldEVycm9ycyhiKVswXTtpZihhPT11bmRlZmluZWQpe3JldHVybiB0cnVl fWVsc2V7dGhpcy5tYXJrSW52YWxpZChhKTtyZXR1cm4gZmFsc2V9fSxnZXRFcnJv cnM6ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZ2V0QWN0aXZlRXJyb3I6ZnVuY3Rpb24o KXtyZXR1cm4gdGhpcy5hY3RpdmVFcnJvcnx8IiJ9LG1hcmtJbnZhbGlkOmZ1bmN0 aW9uKGMpe2lmKHRoaXMucmVuZGVyZWQmJiF0aGlzLnByZXZlbnRNYXJrKXtjPWN8 fHRoaXMuaW52YWxpZFRleHQ7dmFyIGE9dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigp O2lmKGEpe2EubWFyayh0aGlzLGMpfWVsc2V7aWYodGhpcy5tc2dUYXJnZXQpe3Ro aXMuZWwuYWRkQ2xhc3ModGhpcy5pbnZhbGlkQ2xhc3MpO3ZhciBiPUV4dC5nZXRE b20odGhpcy5tc2dUYXJnZXQpO2lmKGIpe2IuaW5uZXJIVE1MPWM7Yi5zdHlsZS5k aXNwbGF5PXRoaXMubXNnRGlzcGxheX19fX10aGlzLnNldEFjdGl2ZUVycm9yKGMp fSxjbGVhckludmFsaWQ6ZnVuY3Rpb24oKXtpZih0aGlzLnJlbmRlcmVkJiYhdGhp cy5wcmV2ZW50TWFyayl7dGhpcy5lbC5yZW1vdmVDbGFzcyh0aGlzLmludmFsaWRD bGFzcyk7dmFyIGE9dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpO2lmKGEpe2EuY2xl YXIodGhpcyl9ZWxzZXtpZih0aGlzLm1zZ1RhcmdldCl7dGhpcy5lbC5yZW1vdmVD bGFzcyh0aGlzLmludmFsaWRDbGFzcyk7dmFyIGI9RXh0LmdldERvbSh0aGlzLm1z Z1RhcmdldCk7aWYoYil7Yi5pbm5lckhUTUw9IiI7Yi5zdHlsZS5kaXNwbGF5PSJu b25lIn19fX10aGlzLnVuc2V0QWN0aXZlRXJyb3IoKX0sc2V0QWN0aXZlRXJyb3I6 ZnVuY3Rpb24oYixhKXt0aGlzLmFjdGl2ZUVycm9yPWI7aWYoYSE9PXRydWUpe3Ro aXMuZmlyZUV2ZW50KCJpbnZhbGlkIix0aGlzLGIpfX0sdW5zZXRBY3RpdmVFcnJv cjpmdW5jdGlvbihhKXtkZWxldGUgdGhpcy5hY3RpdmVFcnJvcjtpZihhIT09dHJ1 ZSl7dGhpcy5maXJlRXZlbnQoInZhbGlkIix0aGlzKX19LGdldE1lc3NhZ2VIYW5k bGVyOmZ1bmN0aW9uKCl7cmV0dXJuIEV4dC5mb3JtLk1lc3NhZ2VUYXJnZXRzW3Ro aXMubXNnVGFyZ2V0XX0sZ2V0RXJyb3JDdDpmdW5jdGlvbigpe3JldHVybiB0aGlz LmVsLmZpbmRQYXJlbnQoIi54LWZvcm0tZWxlbWVudCIsNSx0cnVlKXx8dGhpcy5l bC5maW5kUGFyZW50KCIueC1mb3JtLWZpZWxkLXdyYXAiLDUsdHJ1ZSl9LGFsaWdu RXJyb3JFbDpmdW5jdGlvbigpe3RoaXMuZXJyb3JFbC5zZXRXaWR0aCh0aGlzLmdl dEVycm9yQ3QoKS5nZXRXaWR0aCh0cnVlKS0yMCl9LGFsaWduRXJyb3JJY29uOmZ1 bmN0aW9uKCl7dGhpcy5lcnJvckljb24uYWxpZ25Ubyh0aGlzLmVsLCJ0bC10ciIs WzIsMF0pfSxnZXRSYXdWYWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucmVuZGVy ZWQ/dGhpcy5lbC5nZXRWYWx1ZSgpOkV4dC52YWx1ZSh0aGlzLnZhbHVlLCIiKTtp ZihhPT09dGhpcy5lbXB0eVRleHQpe2E9IiJ9cmV0dXJuIGF9LGdldFZhbHVlOmZ1 bmN0aW9uKCl7aWYoIXRoaXMucmVuZGVyZWQpe3JldHVybiB0aGlzLnZhbHVlfXZh ciBhPXRoaXMuZWwuZ2V0VmFsdWUoKTtpZihhPT09dGhpcy5lbXB0eVRleHR8fGE9 PT11bmRlZmluZWQpe2E9IiJ9cmV0dXJuIGF9LHNldFJhd1ZhbHVlOmZ1bmN0aW9u KGEpe3JldHVybiB0aGlzLnJlbmRlcmVkPyh0aGlzLmVsLmRvbS52YWx1ZT0oRXh0 LmlzRW1wdHkoYSk/IiI6YSkpOiIifSxzZXRWYWx1ZTpmdW5jdGlvbihhKXt0aGlz LnZhbHVlPWE7aWYodGhpcy5yZW5kZXJlZCl7dGhpcy5lbC5kb20udmFsdWU9KEV4 dC5pc0VtcHR5KGEpPyIiOmEpO3RoaXMudmFsaWRhdGUoKX1yZXR1cm4gdGhpc30s YXBwZW5kOmZ1bmN0aW9uKGEpe3RoaXMuc2V0VmFsdWUoW3RoaXMuZ2V0VmFsdWUo KSxhXS5qb2luKCIiKSl9fSk7RXh0LmZvcm0uTWVzc2FnZVRhcmdldHM9e3F0aXA6 e21hcms6ZnVuY3Rpb24oYSxiKXthLmVsLmFkZENsYXNzKGEuaW52YWxpZENsYXNz KTthLmVsLmRvbS5xdGlwPWI7YS5lbC5kb20ucWNsYXNzPSJ4LWZvcm0taW52YWxp ZC10aXAiO2lmKEV4dC5RdWlja1RpcHMpe0V4dC5RdWlja1RpcHMuZW5hYmxlKCl9 fSxjbGVhcjpmdW5jdGlvbihhKXthLmVsLnJlbW92ZUNsYXNzKGEuaW52YWxpZENs YXNzKTthLmVsLmRvbS5xdGlwPSIifX0sdGl0bGU6e21hcms6ZnVuY3Rpb24oYSxi KXthLmVsLmFkZENsYXNzKGEuaW52YWxpZENsYXNzKTthLmVsLmRvbS50aXRsZT1i fSxjbGVhcjpmdW5jdGlvbihhKXthLmVsLmRvbS50aXRsZT0iIn19LHVuZGVyOntt YXJrOmZ1bmN0aW9uKGIsYyl7Yi5lbC5hZGRDbGFzcyhiLmludmFsaWRDbGFzcyk7 aWYoIWIuZXJyb3JFbCl7dmFyIGE9Yi5nZXRFcnJvckN0KCk7aWYoIWEpe2IuZWwu ZG9tLnRpdGxlPWM7cmV0dXJufWIuZXJyb3JFbD1hLmNyZWF0ZUNoaWxkKHtjbHM6 IngtZm9ybS1pbnZhbGlkLW1zZyJ9KTtiLm9uKCJyZXNpemUiLGIuYWxpZ25FcnJv ckVsLGIpO2Iub24oImRlc3Ryb3kiLGZ1bmN0aW9uKCl7RXh0LmRlc3Ryb3kodGhp cy5lcnJvckVsKX0sYil9Yi5hbGlnbkVycm9yRWwoKTtiLmVycm9yRWwudXBkYXRl KGMpO0V4dC5mb3JtLkZpZWxkLm1zZ0Z4W2IubXNnRnhdLnNob3coYi5lcnJvckVs LGIpfSxjbGVhcjpmdW5jdGlvbihhKXthLmVsLnJlbW92ZUNsYXNzKGEuaW52YWxp ZENsYXNzKTtpZihhLmVycm9yRWwpe0V4dC5mb3JtLkZpZWxkLm1zZ0Z4W2EubXNn RnhdLmhpZGUoYS5lcnJvckVsLGEpfWVsc2V7YS5lbC5kb20udGl0bGU9IiJ9fX0s c2lkZTp7bWFyazpmdW5jdGlvbihiLGMpe2IuZWwuYWRkQ2xhc3MoYi5pbnZhbGlk Q2xhc3MpO2lmKCFiLmVycm9ySWNvbil7dmFyIGE9Yi5nZXRFcnJvckN0KCk7aWYo IWEpe2IuZWwuZG9tLnRpdGxlPWM7cmV0dXJufWIuZXJyb3JJY29uPWEuY3JlYXRl Q2hpbGQoe2NsczoieC1mb3JtLWludmFsaWQtaWNvbiJ9KTtpZihiLm93bmVyQ3Qp e2Iub3duZXJDdC5vbigiYWZ0ZXJsYXlvdXQiLGIuYWxpZ25FcnJvckljb24sYik7 Yi5vd25lckN0Lm9uKCJleHBhbmQiLGIuYWxpZ25FcnJvckljb24sYil9Yi5vbigi cmVzaXplIixiLmFsaWduRXJyb3JJY29uLGIpO2Iub24oImRlc3Ryb3kiLGZ1bmN0 aW9uKCl7RXh0LmRlc3Ryb3kodGhpcy5lcnJvckljb24pfSxiKX1iLmFsaWduRXJy b3JJY29uKCk7Yi5lcnJvckljb24uZG9tLnF0aXA9YztiLmVycm9ySWNvbi5kb20u cWNsYXNzPSJ4LWZvcm0taW52YWxpZC10aXAiO2IuZXJyb3JJY29uLnNob3coKX0s Y2xlYXI6ZnVuY3Rpb24oYSl7YS5lbC5yZW1vdmVDbGFzcyhhLmludmFsaWRDbGFz cyk7aWYoYS5lcnJvckljb24pe2EuZXJyb3JJY29uLmRvbS5xdGlwPSIiO2EuZXJy b3JJY29uLmhpZGUoKX1lbHNle2EuZWwuZG9tLnRpdGxlPSIifX19fTtFeHQuZm9y bS5GaWVsZC5tc2dGeD17bm9ybWFsOntzaG93OmZ1bmN0aW9uKGEsYil7YS5zZXRE aXNwbGF5ZWQoImJsb2NrIil9LGhpZGU6ZnVuY3Rpb24oYSxiKXthLnNldERpc3Bs YXllZChmYWxzZSkudXBkYXRlKCIiKX19LHNsaWRlOntzaG93OmZ1bmN0aW9uKGEs Yil7YS5zbGlkZUluKCJ0Iix7c3RvcEZ4OnRydWV9KX0saGlkZTpmdW5jdGlvbihh LGIpe2Euc2xpZGVPdXQoInQiLHtzdG9wRng6dHJ1ZSx1c2VEaXNwbGF5OnRydWV9 KX19LHNsaWRlUmlnaHQ6e3Nob3c6ZnVuY3Rpb24oYSxiKXthLmZpeERpc3BsYXko KTthLmFsaWduVG8oYi5lbCwidGwtdHIiKTthLnNsaWRlSW4oImwiLHtzdG9wRng6 dHJ1ZX0pfSxoaWRlOmZ1bmN0aW9uKGEsYil7YS5zbGlkZU91dCgibCIse3N0b3BG eDp0cnVlLHVzZURpc3BsYXk6dHJ1ZX0pfX19O0V4dC5yZWcoImZpZWxkIixFeHQu Zm9ybS5GaWVsZCk7RXh0LmZvcm0uVGV4dEZpZWxkPUV4dC5leHRlbmQoRXh0LmZv cm0uRmllbGQse2dyb3c6ZmFsc2UsZ3Jvd01pbjozMCxncm93TWF4OjgwMCx2dHlw ZTpudWxsLG1hc2tSZTpudWxsLGRpc2FibGVLZXlGaWx0ZXI6ZmFsc2UsYWxsb3dC bGFuazp0cnVlLG1pbkxlbmd0aDowLG1heExlbmd0aDpOdW1iZXIuTUFYX1ZBTFVF LG1pbkxlbmd0aFRleHQ6IlRoZSBtaW5pbXVtIGxlbmd0aCBmb3IgdGhpcyBmaWVs ZCBpcyB7MH0iLG1heExlbmd0aFRleHQ6IlRoZSBtYXhpbXVtIGxlbmd0aCBmb3Ig dGhpcyBmaWVsZCBpcyB7MH0iLHNlbGVjdE9uRm9jdXM6ZmFsc2UsYmxhbmtUZXh0 OiJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIix2YWxpZGF0b3I6bnVsbCxyZWdleDpu dWxsLHJlZ2V4VGV4dDoiIixlbXB0eVRleHQ6bnVsbCxlbXB0eUNsYXNzOiJ4LWZv cm0tZW1wdHktZmllbGQiLGluaXRDb21wb25lbnQ6ZnVuY3Rpb24oKXtFeHQuZm9y bS5UZXh0RmllbGQuc3VwZXJjbGFzcy5pbml0Q29tcG9uZW50LmNhbGwodGhpcyk7 dGhpcy5hZGRFdmVudHMoImF1dG9zaXplIiwia2V5ZG93biIsImtleXVwIiwia2V5 cHJlc3MiKX0saW5pdEV2ZW50czpmdW5jdGlvbigpe0V4dC5mb3JtLlRleHRGaWVs ZC5zdXBlcmNsYXNzLmluaXRFdmVudHMuY2FsbCh0aGlzKTtpZih0aGlzLnZhbGlk YXRpb25FdmVudD09ImtleXVwIil7dGhpcy52YWxpZGF0aW9uVGFzaz1uZXcgRXh0 LnV0aWwuRGVsYXllZFRhc2sodGhpcy52YWxpZGF0ZSx0aGlzKTt0aGlzLm1vbih0 aGlzLmVsLCJrZXl1cCIsdGhpcy5maWx0ZXJWYWxpZGF0aW9uLHRoaXMpfWVsc2V7 aWYodGhpcy52YWxpZGF0aW9uRXZlbnQhPT1mYWxzZSYmdGhpcy52YWxpZGF0aW9u RXZlbnQhPSJibHVyIil7dGhpcy5tb24odGhpcy5lbCx0aGlzLnZhbGlkYXRpb25F dmVudCx0aGlzLnZhbGlkYXRlLHRoaXMse2J1ZmZlcjp0aGlzLnZhbGlkYXRpb25E ZWxheX0pfX1pZih0aGlzLnNlbGVjdE9uRm9jdXN8fHRoaXMuZW1wdHlUZXh0KXt0 aGlzLm1vbih0aGlzLmVsLCJtb3VzZWRvd24iLHRoaXMub25Nb3VzZURvd24sdGhp cyk7aWYodGhpcy5lbXB0eVRleHQpe3RoaXMuYXBwbHlFbXB0eVRleHQoKX19aWYo dGhpcy5tYXNrUmV8fCh0aGlzLnZ0eXBlJiZ0aGlzLmRpc2FibGVLZXlGaWx0ZXIh PT10cnVlJiYodGhpcy5tYXNrUmU9RXh0LmZvcm0uVlR5cGVzW3RoaXMudnR5cGUr Ik1hc2siXSkpKXt0aGlzLm1vbih0aGlzLmVsLCJrZXlwcmVzcyIsdGhpcy5maWx0 ZXJLZXlzLHRoaXMpfWlmKHRoaXMuZ3Jvdyl7dGhpcy5tb24odGhpcy5lbCwia2V5 dXAiLHRoaXMub25LZXlVcEJ1ZmZlcmVkLHRoaXMse2J1ZmZlcjo1MH0pO3RoaXMu bW9uKHRoaXMuZWwsImNsaWNrIix0aGlzLmF1dG9TaXplLHRoaXMpfWlmKHRoaXMu ZW5hYmxlS2V5RXZlbnRzKXt0aGlzLm1vbih0aGlzLmVsLHtzY29wZTp0aGlzLGtl eXVwOnRoaXMub25LZXlVcCxrZXlkb3duOnRoaXMub25LZXlEb3duLGtleXByZXNz OnRoaXMub25LZXlQcmVzc30pfX0sb25Nb3VzZURvd246ZnVuY3Rpb24oYSl7aWYo IXRoaXMuaGFzRm9jdXMpe3RoaXMubW9uKHRoaXMuZWwsIm1vdXNldXAiLEV4dC5l bXB0eUZuLHRoaXMse3NpbmdsZTp0cnVlLHByZXZlbnREZWZhdWx0OnRydWV9KX19 LHByb2Nlc3NWYWx1ZTpmdW5jdGlvbihhKXtpZih0aGlzLnN0cmlwQ2hhcnNSZSl7 dmFyIGI9YS5yZXBsYWNlKHRoaXMuc3RyaXBDaGFyc1JlLCIiKTtpZihiIT09YSl7 dGhpcy5zZXRSYXdWYWx1ZShiKTtyZXR1cm4gYn19cmV0dXJuIGF9LGZpbHRlclZh bGlkYXRpb246ZnVuY3Rpb24oYSl7aWYoIWEuaXNOYXZLZXlQcmVzcygpKXt0aGlz LnZhbGlkYXRpb25UYXNrLmRlbGF5KHRoaXMudmFsaWRhdGlvbkRlbGF5KX19LG9u RGlzYWJsZTpmdW5jdGlvbigpe0V4dC5mb3JtLlRleHRGaWVsZC5zdXBlcmNsYXNz Lm9uRGlzYWJsZS5jYWxsKHRoaXMpO2lmKEV4dC5pc0lFKXt0aGlzLmVsLmRvbS51 bnNlbGVjdGFibGU9Im9uIn19LG9uRW5hYmxlOmZ1bmN0aW9uKCl7RXh0LmZvcm0u VGV4dEZpZWxkLnN1cGVyY2xhc3Mub25FbmFibGUuY2FsbCh0aGlzKTtpZihFeHQu aXNJRSl7dGhpcy5lbC5kb20udW5zZWxlY3RhYmxlPSIifX0sb25LZXlVcEJ1ZmZl cmVkOmZ1bmN0aW9uKGEpe2lmKHRoaXMuZG9BdXRvU2l6ZShhKSl7dGhpcy5hdXRv U2l6ZSgpfX0sZG9BdXRvU2l6ZTpmdW5jdGlvbihhKXtyZXR1cm4gIWEuaXNOYXZL ZXlQcmVzcygpfSxvbktleVVwOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZUV2ZW50KCJr ZXl1cCIsdGhpcyxhKX0sb25LZXlEb3duOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZUV2 ZW50KCJrZXlkb3duIix0aGlzLGEpfSxvbktleVByZXNzOmZ1bmN0aW9uKGEpe3Ro aXMuZmlyZUV2ZW50KCJrZXlwcmVzcyIsdGhpcyxhKX0scmVzZXQ6ZnVuY3Rpb24o KXtFeHQuZm9ybS5UZXh0RmllbGQuc3VwZXJjbGFzcy5yZXNldC5jYWxsKHRoaXMp O3RoaXMuYXBwbHlFbXB0eVRleHQoKX0sYXBwbHlFbXB0eVRleHQ6ZnVuY3Rpb24o KXtpZih0aGlzLnJlbmRlcmVkJiZ0aGlzLmVtcHR5VGV4dCYmdGhpcy5nZXRSYXdW YWx1ZSgpLmxlbmd0aDwxJiYhdGhpcy5oYXNGb2N1cyl7dGhpcy5zZXRSYXdWYWx1 ZSh0aGlzLmVtcHR5VGV4dCk7dGhpcy5lbC5hZGRDbGFzcyh0aGlzLmVtcHR5Q2xh c3MpfX0scHJlRm9jdXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsLGI7aWYodGhp cy5lbXB0eVRleHQpe2lmKGEuZG9tLnZhbHVlPT10aGlzLmVtcHR5VGV4dCl7dGhp cy5zZXRSYXdWYWx1ZSgiIik7Yj10cnVlfWEucmVtb3ZlQ2xhc3ModGhpcy5lbXB0 eUNsYXNzKX1pZih0aGlzLnNlbGVjdE9uRm9jdXN8fGIpe2EuZG9tLnNlbGVjdCgp fX0scG9zdEJsdXI6ZnVuY3Rpb24oKXt0aGlzLmFwcGx5RW1wdHlUZXh0KCl9LGZp bHRlcktleXM6ZnVuY3Rpb24oYil7aWYoYi5jdHJsS2V5KXtyZXR1cm59dmFyIGE9 Yi5nZXRLZXkoKTtpZihFeHQuaXNHZWNrbyYmKGIuaXNOYXZLZXlQcmVzcygpfHxh PT1iLkJBQ0tTUEFDRXx8KGE9PWIuREVMRVRFJiZiLmJ1dHRvbj09LTEpKSl7cmV0 dXJufXZhciBjPVN0cmluZy5mcm9tQ2hhckNvZGUoYi5nZXRDaGFyQ29kZSgpKTtp ZighRXh0LmlzR2Vja28mJmIuaXNTcGVjaWFsS2V5KCkmJiFjKXtyZXR1cm59aWYo IXRoaXMubWFza1JlLnRlc3QoYykpe2Iuc3RvcEV2ZW50KCl9fSxzZXRWYWx1ZTpm dW5jdGlvbihhKXtpZih0aGlzLmVtcHR5VGV4dCYmdGhpcy5lbCYmIUV4dC5pc0Vt cHR5KGEpKXt0aGlzLmVsLnJlbW92ZUNsYXNzKHRoaXMuZW1wdHlDbGFzcyl9RXh0 LmZvcm0uVGV4dEZpZWxkLnN1cGVyY2xhc3Muc2V0VmFsdWUuYXBwbHkodGhpcyxh cmd1bWVudHMpO3RoaXMuYXBwbHlFbXB0eVRleHQoKTt0aGlzLmF1dG9TaXplKCk7 cmV0dXJuIHRoaXN9LGdldEVycm9yczpmdW5jdGlvbihhKXt2YXIgZD1FeHQuZm9y bS5UZXh0RmllbGQuc3VwZXJjbGFzcy5nZXRFcnJvcnMuYXBwbHkodGhpcyxhcmd1 bWVudHMpO2E9RXh0LmlzRGVmaW5lZChhKT9hOnRoaXMucHJvY2Vzc1ZhbHVlKHRo aXMuZ2V0UmF3VmFsdWUoKSk7aWYoRXh0LmlzRnVuY3Rpb24odGhpcy52YWxpZGF0 b3IpKXt2YXIgYz10aGlzLnZhbGlkYXRvcihhKTtpZihjIT09dHJ1ZSl7ZC5wdXNo KGMpfX1pZihhLmxlbmd0aDwxfHxhPT09dGhpcy5lbXB0eVRleHQpe2lmKHRoaXMu YWxsb3dCbGFuayl7cmV0dXJuIGR9ZWxzZXtkLnB1c2godGhpcy5ibGFua1RleHQp fX1pZighdGhpcy5hbGxvd0JsYW5rJiYoYS5sZW5ndGg8MXx8YT09PXRoaXMuZW1w dHlUZXh0KSl7ZC5wdXNoKHRoaXMuYmxhbmtUZXh0KX1pZihhLmxlbmd0aDx0aGlz Lm1pbkxlbmd0aCl7ZC5wdXNoKFN0cmluZy5mb3JtYXQodGhpcy5taW5MZW5ndGhU ZXh0LHRoaXMubWluTGVuZ3RoKSl9aWYoYS5sZW5ndGg+dGhpcy5tYXhMZW5ndGgp e2QucHVzaChTdHJpbmcuZm9ybWF0KHRoaXMubWF4TGVuZ3RoVGV4dCx0aGlzLm1h eExlbmd0aCkpfWlmKHRoaXMudnR5cGUpe3ZhciBiPUV4dC5mb3JtLlZUeXBlcztp ZighYlt0aGlzLnZ0eXBlXShhLHRoaXMpKXtkLnB1c2godGhpcy52dHlwZVRleHR8 fGJbdGhpcy52dHlwZSsiVGV4dCJdKX19aWYodGhpcy5yZWdleCYmIXRoaXMucmVn ZXgudGVzdChhKSl7ZC5wdXNoKHRoaXMucmVnZXhUZXh0KX1yZXR1cm4gZH0sc2Vs ZWN0VGV4dDpmdW5jdGlvbihoLGEpe3ZhciBjPXRoaXMuZ2V0UmF3VmFsdWUoKTt2 YXIgZT1mYWxzZTtpZihjLmxlbmd0aD4wKXtoPWg9PT11bmRlZmluZWQ/MDpoO2E9 YT09PXVuZGVmaW5lZD9jLmxlbmd0aDphO3ZhciBnPXRoaXMuZWwuZG9tO2lmKGcu c2V0U2VsZWN0aW9uUmFuZ2Upe2cuc2V0U2VsZWN0aW9uUmFuZ2UoaCxhKX1lbHNl e2lmKGcuY3JlYXRlVGV4dFJhbmdlKXt2YXIgYj1nLmNyZWF0ZVRleHRSYW5nZSgp O2IubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLGgpO2IubW92ZUVuZCgiY2hhcmFjdGVy IixhLWMubGVuZ3RoKTtiLnNlbGVjdCgpfX1lPUV4dC5pc0dlY2tvfHxFeHQuaXNP cGVyYX1lbHNle2U9dHJ1ZX1pZihlKXt0aGlzLmZvY3VzKCl9fSxhdXRvU2l6ZTpm dW5jdGlvbigpe2lmKCF0aGlzLmdyb3d8fCF0aGlzLnJlbmRlcmVkKXtyZXR1cm59 aWYoIXRoaXMubWV0cmljcyl7dGhpcy5tZXRyaWNzPUV4dC51dGlsLlRleHRNZXRy aWNzLmNyZWF0ZUluc3RhbmNlKHRoaXMuZWwpfXZhciBjPXRoaXMuZWw7dmFyIGI9 Yy5kb20udmFsdWU7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7 ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShiKSk7Yj1lLmlu bmVySFRNTDtFeHQucmVtb3ZlTm9kZShlKTtlPW51bGw7Yis9IiYjMTYwOyI7dmFy IGE9TWF0aC5taW4odGhpcy5ncm93TWF4LE1hdGgubWF4KHRoaXMubWV0cmljcy5n ZXRXaWR0aChiKSsxMCx0aGlzLmdyb3dNaW4pKTt0aGlzLmVsLnNldFdpZHRoKGEp O3RoaXMuZmlyZUV2ZW50KCJhdXRvc2l6ZSIsdGhpcyxhKX0sb25EZXN0cm95OmZ1 bmN0aW9uKCl7aWYodGhpcy52YWxpZGF0aW9uVGFzayl7dGhpcy52YWxpZGF0aW9u VGFzay5jYW5jZWwoKTt0aGlzLnZhbGlkYXRpb25UYXNrPW51bGx9RXh0LmZvcm0u VGV4dEZpZWxkLnN1cGVyY2xhc3Mub25EZXN0cm95LmNhbGwodGhpcyl9fSk7RXh0 LnJlZygidGV4dGZpZWxkIixFeHQuZm9ybS5UZXh0RmllbGQpO0V4dC5mb3JtLlRy aWdnZXJGaWVsZD1FeHQuZXh0ZW5kKEV4dC5mb3JtLlRleHRGaWVsZCx7ZGVmYXVs dEF1dG9DcmVhdGU6e3RhZzoiaW5wdXQiLHR5cGU6InRleHQiLHNpemU6IjE2Iixh dXRvY29tcGxldGU6Im9mZiJ9LGhpZGVUcmlnZ2VyOmZhbHNlLGVkaXRhYmxlOnRy dWUscmVhZE9ubHk6ZmFsc2Usd3JhcEZvY3VzQ2xhc3M6IngtdHJpZ2dlci13cmFw LWZvY3VzIixhdXRvU2l6ZTpFeHQuZW1wdHlGbixtb25pdG9yVGFiOnRydWUsZGVm ZXJIZWlnaHQ6dHJ1ZSxtaW1pY2luZzpmYWxzZSxhY3Rpb25Nb2RlOiJ3cmFwIixk ZWZhdWx0VHJpZ2dlcldpZHRoOjE3LG9uUmVzaXplOmZ1bmN0aW9uKGEsYyl7RXh0 LmZvcm0uVHJpZ2dlckZpZWxkLnN1cGVyY2xhc3Mub25SZXNpemUuY2FsbCh0aGlz LGEsYyk7dmFyIGI9dGhpcy5nZXRUcmlnZ2VyV2lkdGgoKTtpZihFeHQuaXNOdW1i ZXIoYSkpe3RoaXMuZWwuc2V0V2lkdGgoYS1iKX10aGlzLndyYXAuc2V0V2lkdGgo dGhpcy5lbC5nZXRXaWR0aCgpK2IpfSxnZXRUcmlnZ2VyV2lkdGg6ZnVuY3Rpb24o KXt2YXIgYT10aGlzLnRyaWdnZXIuZ2V0V2lkdGgoKTtpZighdGhpcy5oaWRlVHJp Z2dlciYmIXRoaXMucmVhZE9ubHkmJmE9PT0wKXthPXRoaXMuZGVmYXVsdFRyaWdn ZXJXaWR0aH1yZXR1cm4gYX0sYWxpZ25FcnJvckljb246ZnVuY3Rpb24oKXtpZih0 aGlzLndyYXApe3RoaXMuZXJyb3JJY29uLmFsaWduVG8odGhpcy53cmFwLCJ0bC10 ciIsWzIsMF0pfX0sb25SZW5kZXI6ZnVuY3Rpb24oYixhKXt0aGlzLmRvYz1FeHQu aXNJRT9FeHQuZ2V0Qm9keSgpOkV4dC5nZXREb2MoKTtFeHQuZm9ybS5UcmlnZ2Vy RmllbGQuc3VwZXJjbGFzcy5vblJlbmRlci5jYWxsKHRoaXMsYixhKTt0aGlzLndy YXA9dGhpcy5lbC53cmFwKHtjbHM6IngtZm9ybS1maWVsZC13cmFwIHgtZm9ybS1m aWVsZC10cmlnZ2VyLXdyYXAifSk7dGhpcy50cmlnZ2VyPXRoaXMud3JhcC5jcmVh dGVDaGlsZCh0aGlzLnRyaWdnZXJDb25maWd8fHt0YWc6ImltZyIsc3JjOkV4dC5C TEFOS19JTUFHRV9VUkwsYWx0OiIiLGNsczoieC1mb3JtLXRyaWdnZXIgIit0aGlz LnRyaWdnZXJDbGFzc30pO3RoaXMuaW5pdFRyaWdnZXIoKTtpZighdGhpcy53aWR0 aCl7dGhpcy53cmFwLnNldFdpZHRoKHRoaXMuZWwuZ2V0V2lkdGgoKSt0aGlzLnRy aWdnZXIuZ2V0V2lkdGgoKSl9dGhpcy5yZXNpemVFbD10aGlzLnBvc2l0aW9uRWw9 dGhpcy53cmFwfSxnZXRXaWR0aDpmdW5jdGlvbigpe3JldHVybih0aGlzLmVsLmdl dFdpZHRoKCkrdGhpcy50cmlnZ2VyLmdldFdpZHRoKCkpfSx1cGRhdGVFZGl0U3Rh dGU6ZnVuY3Rpb24oKXtpZih0aGlzLnJlbmRlcmVkKXtpZih0aGlzLnJlYWRPbmx5 KXt0aGlzLmVsLmRvbS5yZWFkT25seT10cnVlO3RoaXMuZWwuYWRkQ2xhc3MoIngt dHJpZ2dlci1ub2VkaXQiKTt0aGlzLm11bih0aGlzLmVsLCJjbGljayIsdGhpcy5v blRyaWdnZXJDbGljayx0aGlzKTt0aGlzLnRyaWdnZXIuc2V0RGlzcGxheWVkKGZh bHNlKX1lbHNle2lmKCF0aGlzLmVkaXRhYmxlKXt0aGlzLmVsLmRvbS5yZWFkT25s eT10cnVlO3RoaXMuZWwuYWRkQ2xhc3MoIngtdHJpZ2dlci1ub2VkaXQiKTt0aGlz Lm1vbih0aGlzLmVsLCJjbGljayIsdGhpcy5vblRyaWdnZXJDbGljayx0aGlzKX1l bHNle3RoaXMuZWwuZG9tLnJlYWRPbmx5PWZhbHNlO3RoaXMuZWwucmVtb3ZlQ2xh c3MoIngtdHJpZ2dlci1ub2VkaXQiKTt0aGlzLm11bih0aGlzLmVsLCJjbGljayIs dGhpcy5vblRyaWdnZXJDbGljayx0aGlzKX10aGlzLnRyaWdnZXIuc2V0RGlzcGxh eWVkKCF0aGlzLmhpZGVUcmlnZ2VyKX10aGlzLm9uUmVzaXplKHRoaXMud2lkdGh8 fHRoaXMud3JhcC5nZXRXaWR0aCgpKX19LHNldEhpZGVUcmlnZ2VyOmZ1bmN0aW9u KGEpe2lmKGEhPXRoaXMuaGlkZVRyaWdnZXIpe3RoaXMuaGlkZVRyaWdnZXI9YTt0 aGlzLnVwZGF0ZUVkaXRTdGF0ZSgpfX0sc2V0RWRpdGFibGU6ZnVuY3Rpb24oYSl7 aWYoYSE9dGhpcy5lZGl0YWJsZSl7dGhpcy5lZGl0YWJsZT1hO3RoaXMudXBkYXRl RWRpdFN0YXRlKCl9fSxzZXRSZWFkT25seTpmdW5jdGlvbihhKXtpZihhIT10aGlz LnJlYWRPbmx5KXt0aGlzLnJlYWRPbmx5PWE7dGhpcy51cGRhdGVFZGl0U3RhdGUo KX19LGFmdGVyUmVuZGVyOmZ1bmN0aW9uKCl7RXh0LmZvcm0uVHJpZ2dlckZpZWxk LnN1cGVyY2xhc3MuYWZ0ZXJSZW5kZXIuY2FsbCh0aGlzKTt0aGlzLnVwZGF0ZUVk aXRTdGF0ZSgpfSxpbml0VHJpZ2dlcjpmdW5jdGlvbigpe3RoaXMubW9uKHRoaXMu dHJpZ2dlciwiY2xpY2siLHRoaXMub25UcmlnZ2VyQ2xpY2ssdGhpcyx7cHJldmVu dERlZmF1bHQ6dHJ1ZX0pO3RoaXMudHJpZ2dlci5hZGRDbGFzc09uT3ZlcigieC1m b3JtLXRyaWdnZXItb3ZlciIpO3RoaXMudHJpZ2dlci5hZGRDbGFzc09uQ2xpY2so IngtZm9ybS10cmlnZ2VyLWNsaWNrIil9LG9uRGVzdHJveTpmdW5jdGlvbigpe0V4 dC5kZXN0cm95KHRoaXMudHJpZ2dlcix0aGlzLndyYXApO2lmKHRoaXMubWltaWNp bmcpe3RoaXMuZG9jLnVuKCJtb3VzZWRvd24iLHRoaXMubWltaWNCbHVyLHRoaXMp fWRlbGV0ZSB0aGlzLmRvYztFeHQuZm9ybS5UcmlnZ2VyRmllbGQuc3VwZXJjbGFz cy5vbkRlc3Ryb3kuY2FsbCh0aGlzKX0sb25Gb2N1czpmdW5jdGlvbigpe0V4dC5m b3JtLlRyaWdnZXJGaWVsZC5zdXBlcmNsYXNzLm9uRm9jdXMuY2FsbCh0aGlzKTtp ZighdGhpcy5taW1pY2luZyl7dGhpcy53cmFwLmFkZENsYXNzKHRoaXMud3JhcEZv Y3VzQ2xhc3MpO3RoaXMubWltaWNpbmc9dHJ1ZTt0aGlzLmRvYy5vbigibW91c2Vk b3duIix0aGlzLm1pbWljQmx1cix0aGlzLHtkZWxheToxMH0pO2lmKHRoaXMubW9u aXRvclRhYil7dGhpcy5vbigic3BlY2lhbGtleSIsdGhpcy5jaGVja1RhYix0aGlz KX19fSxjaGVja1RhYjpmdW5jdGlvbihhLGIpe2lmKGIuZ2V0S2V5KCk9PWIuVEFC KXt0aGlzLnRyaWdnZXJCbHVyKCl9fSxvbkJsdXI6RXh0LmVtcHR5Rm4sbWltaWNC bHVyOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmlzRGVzdHJveWVkJiYhdGhpcy53cmFw LmNvbnRhaW5zKGEudGFyZ2V0KSYmdGhpcy52YWxpZGF0ZUJsdXIoYSkpe3RoaXMu dHJpZ2dlckJsdXIoKX19LHRyaWdnZXJCbHVyOmZ1bmN0aW9uKCl7dGhpcy5taW1p Y2luZz1mYWxzZTt0aGlzLmRvYy51bigibW91c2Vkb3duIix0aGlzLm1pbWljQmx1 cix0aGlzKTtpZih0aGlzLm1vbml0b3JUYWImJnRoaXMuZWwpe3RoaXMudW4oInNw ZWNpYWxrZXkiLHRoaXMuY2hlY2tUYWIsdGhpcyl9RXh0LmZvcm0uVHJpZ2dlckZp ZWxkLnN1cGVyY2xhc3Mub25CbHVyLmNhbGwodGhpcyk7aWYodGhpcy53cmFwKXt0 aGlzLndyYXAucmVtb3ZlQ2xhc3ModGhpcy53cmFwRm9jdXNDbGFzcyl9fSxiZWZv cmVCbHVyOkV4dC5lbXB0eUZuLHZhbGlkYXRlQmx1cjpmdW5jdGlvbihhKXtyZXR1 cm4gdHJ1ZX0sb25UcmlnZ2VyQ2xpY2s6RXh0LmVtcHR5Rm59KTtFeHQuZm9ybS5U d2luVHJpZ2dlckZpZWxkPUV4dC5leHRlbmQoRXh0LmZvcm0uVHJpZ2dlckZpZWxk LHtpbml0Q29tcG9uZW50OmZ1bmN0aW9uKCl7RXh0LmZvcm0uVHdpblRyaWdnZXJG aWVsZC5zdXBlcmNsYXNzLmluaXRDb21wb25lbnQuY2FsbCh0aGlzKTt0aGlzLnRy aWdnZXJDb25maWc9e3RhZzoic3BhbiIsY2xzOiJ4LWZvcm0tdHdpbi10cmlnZ2Vy cyIsY246W3t0YWc6ImltZyIsc3JjOkV4dC5CTEFOS19JTUFHRV9VUkwsYWx0OiIi LGNsczoieC1mb3JtLXRyaWdnZXIgIit0aGlzLnRyaWdnZXIxQ2xhc3N9LHt0YWc6 ImltZyIsc3JjOkV4dC5CTEFOS19JTUFHRV9VUkwsYWx0OiIiLGNsczoieC1mb3Jt LXRyaWdnZXIgIit0aGlzLnRyaWdnZXIyQ2xhc3N9XX19LGdldFRyaWdnZXI6ZnVu Y3Rpb24oYSl7cmV0dXJuIHRoaXMudHJpZ2dlcnNbYV19LGFmdGVyUmVuZGVyOmZ1 bmN0aW9uKCl7RXh0LmZvcm0uVHdpblRyaWdnZXJGaWVsZC5zdXBlcmNsYXNzLmFm dGVyUmVuZGVyLmNhbGwodGhpcyk7dmFyIGM9dGhpcy50cmlnZ2VycyxiPTAsYT1j Lmxlbmd0aDtmb3IoO2I8YTsrK2Ipe2lmKHRoaXNbImhpZGVUcmlnZ2VyIisoYisx KV0pe2NbYl0uaGlkZSgpfX19LGluaXRUcmlnZ2VyOmZ1bmN0aW9uKCl7dmFyIGE9 dGhpcy50cmlnZ2VyLnNlbGVjdCgiLngtZm9ybS10cmlnZ2VyIix0cnVlKSxiPXRo aXM7YS5lYWNoKGZ1bmN0aW9uKGQsZyxjKXt2YXIgZT0iVHJpZ2dlciIrKGMrMSk7 ZC5oaWRlPWZ1bmN0aW9uKCl7dmFyIGg9Yi53cmFwLmdldFdpZHRoKCk7dGhpcy5k b20uc3R5bGUuZGlzcGxheT0ibm9uZSI7Yi5lbC5zZXRXaWR0aChoLWIudHJpZ2dl ci5nZXRXaWR0aCgpKTtiWyJoaWRkZW4iK2VdPXRydWV9O2Quc2hvdz1mdW5jdGlv bigpe3ZhciBoPWIud3JhcC5nZXRXaWR0aCgpO3RoaXMuZG9tLnN0eWxlLmRpc3Bs YXk9IiI7Yi5lbC5zZXRXaWR0aChoLWIudHJpZ2dlci5nZXRXaWR0aCgpKTtiWyJo aWRkZW4iK2VdPWZhbHNlfTt0aGlzLm1vbihkLCJjbGljayIsdGhpc1sib24iK2Ur IkNsaWNrIl0sdGhpcyx7cHJldmVudERlZmF1bHQ6dHJ1ZX0pO2QuYWRkQ2xhc3NP bk92ZXIoIngtZm9ybS10cmlnZ2VyLW92ZXIiKTtkLmFkZENsYXNzT25DbGljaygi eC1mb3JtLXRyaWdnZXItY2xpY2siKX0sdGhpcyk7dGhpcy50cmlnZ2Vycz1hLmVs ZW1lbnRzfSxnZXRUcmlnZ2VyV2lkdGg6ZnVuY3Rpb24oKXt2YXIgYT0wO0V4dC5l YWNoKHRoaXMudHJpZ2dlcnMsZnVuY3Rpb24oZCxjKXt2YXIgZT0iVHJpZ2dlciIr KGMrMSksYj1kLmdldFdpZHRoKCk7aWYoYj09PTAmJiF0aGlzWyJoaWRkZW4iK2Vd KXthKz10aGlzLmRlZmF1bHRUcmlnZ2VyV2lkdGh9ZWxzZXthKz1ifX0sdGhpcyk7 cmV0dXJuIGF9LG9uRGVzdHJveTpmdW5jdGlvbigpe0V4dC5kZXN0cm95KHRoaXMu dHJpZ2dlcnMpO0V4dC5mb3JtLlR3aW5UcmlnZ2VyRmllbGQuc3VwZXJjbGFzcy5v bkRlc3Ryb3kuY2FsbCh0aGlzKX0sb25UcmlnZ2VyMUNsaWNrOkV4dC5lbXB0eUZu LG9uVHJpZ2dlcjJDbGljazpFeHQuZW1wdHlGbn0pO0V4dC5yZWcoInRyaWdnZXIi LEV4dC5mb3JtLlRyaWdnZXJGaWVsZCk7RXh0LmZvcm0uVGV4dEFyZWE9RXh0LmV4 dGVuZChFeHQuZm9ybS5UZXh0RmllbGQse2dyb3dNaW46NjAsZ3Jvd01heDoxMDAw LGdyb3dBcHBlbmQ6IiYjMTYwO1xuJiMxNjA7IixlbnRlcklzU3BlY2lhbDpmYWxz ZSxwcmV2ZW50U2Nyb2xsYmFyczpmYWxzZSxvblJlbmRlcjpmdW5jdGlvbihiLGEp e2lmKCF0aGlzLmVsKXt0aGlzLmRlZmF1bHRBdXRvQ3JlYXRlPXt0YWc6InRleHRh cmVhIixzdHlsZToid2lkdGg6MTAwcHg7aGVpZ2h0OjYwcHg7IixhdXRvY29tcGxl dGU6Im9mZiJ9fUV4dC5mb3JtLlRleHRBcmVhLnN1cGVyY2xhc3Mub25SZW5kZXIu Y2FsbCh0aGlzLGIsYSk7aWYodGhpcy5ncm93KXt0aGlzLnRleHRTaXplRWw9RXh0 LkRvbUhlbHBlci5hcHBlbmQoZG9jdW1lbnQuYm9keSx7dGFnOiJwcmUiLGNsczoi eC1mb3JtLWdyb3ctc2l6ZXIifSk7aWYodGhpcy5wcmV2ZW50U2Nyb2xsYmFycyl7 dGhpcy5lbC5zZXRTdHlsZSgib3ZlcmZsb3ciLCJoaWRkZW4iKX10aGlzLmVsLnNl dEhlaWdodCh0aGlzLmdyb3dNaW4pfX0sb25EZXN0cm95OmZ1bmN0aW9uKCl7RXh0 LnJlbW92ZU5vZGUodGhpcy50ZXh0U2l6ZUVsKTtFeHQuZm9ybS5UZXh0QXJlYS5z dXBlcmNsYXNzLm9uRGVzdHJveS5jYWxsKHRoaXMpfSxmaXJlS2V5OmZ1bmN0aW9u KGEpe2lmKGEuaXNTcGVjaWFsS2V5KCkmJih0aGlzLmVudGVySXNTcGVjaWFsfHwo YS5nZXRLZXkoKSE9YS5FTlRFUnx8YS5oYXNNb2RpZmllcigpKSkpe3RoaXMuZmly ZUV2ZW50KCJzcGVjaWFsa2V5Iix0aGlzLGEpfX0sZG9BdXRvU2l6ZTpmdW5jdGlv bihhKXtyZXR1cm4gIWEuaXNOYXZLZXlQcmVzcygpfHxhLmdldEtleSgpPT1hLkVO VEVSfSxmaWx0ZXJWYWxpZGF0aW9uOmZ1bmN0aW9uKGEpe2lmKCFhLmlzTmF2S2V5 UHJlc3MoKXx8KCF0aGlzLmVudGVySXNTcGVjaWFsJiZhLmtleUNvZGU9PWEuRU5U RVIpKXt0aGlzLnZhbGlkYXRpb25UYXNrLmRlbGF5KHRoaXMudmFsaWRhdGlvbkRl bGF5KX19LGF1dG9TaXplOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZ3Jvd3x8IXRoaXMu dGV4dFNpemVFbCl7cmV0dXJufXZhciBjPXRoaXMuZWwsYT1FeHQudXRpbC5Gb3Jt YXQuaHRtbEVuY29kZShjLmRvbS52YWx1ZSksZD10aGlzLnRleHRTaXplRWwsYjtF eHQuZmx5KGQpLnNldFdpZHRoKHRoaXMuZWwuZ2V0V2lkdGgoKSk7aWYoYS5sZW5n dGg8MSl7YT0iJiMxNjA7JiMxNjA7In1lbHNle2ErPXRoaXMuZ3Jvd0FwcGVuZDtp ZihFeHQuaXNJRSl7YT1hLnJlcGxhY2UoL1xuL2csIiYjMTYwOzxiciAvPiIpfX1k LmlubmVySFRNTD1hO2I9TWF0aC5taW4odGhpcy5ncm93TWF4LE1hdGgubWF4KGQu b2Zmc2V0SGVpZ2h0LHRoaXMuZ3Jvd01pbikpO2lmKGIhPXRoaXMubGFzdEhlaWdo dCl7dGhpcy5sYXN0SGVpZ2h0PWI7dGhpcy5lbC5zZXRIZWlnaHQoYik7dGhpcy5m aXJlRXZlbnQoImF1dG9zaXplIix0aGlzLGIpfX19KTtFeHQucmVnKCJ0ZXh0YXJl YSIsRXh0LmZvcm0uVGV4dEFyZWEpO0V4dC5mb3JtLk51bWJlckZpZWxkPUV4dC5l eHRlbmQoRXh0LmZvcm0uVGV4dEZpZWxkLHtmaWVsZENsYXNzOiJ4LWZvcm0tZmll bGQgeC1mb3JtLW51bS1maWVsZCIsYWxsb3dEZWNpbWFsczp0cnVlLGRlY2ltYWxT ZXBhcmF0b3I6Ii4iLGRlY2ltYWxQcmVjaXNpb246MixhbGxvd05lZ2F0aXZlOnRy dWUsbWluVmFsdWU6TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLG1heFZhbHVlOk51 bWJlci5NQVhfVkFMVUUsbWluVGV4dDoiVGhlIG1pbmltdW0gdmFsdWUgZm9yIHRo aXMgZmllbGQgaXMgezB9IixtYXhUZXh0OiJUaGUgbWF4aW11bSB2YWx1ZSBmb3Ig dGhpcyBmaWVsZCBpcyB7MH0iLG5hblRleHQ6InswfSBpcyBub3QgYSB2YWxpZCBu dW1iZXIiLGJhc2VDaGFyczoiMDEyMzQ1Njc4OSIsYXV0b1N0cmlwQ2hhcnM6ZmFs c2UsaW5pdEV2ZW50czpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYmFzZUNoYXJzKyIi O2lmKHRoaXMuYWxsb3dEZWNpbWFscyl7YSs9dGhpcy5kZWNpbWFsU2VwYXJhdG9y fWlmKHRoaXMuYWxsb3dOZWdhdGl2ZSl7YSs9Ii0ifWE9RXh0LmVzY2FwZVJlKGEp O3RoaXMubWFza1JlPW5ldyBSZWdFeHAoIlsiK2ErIl0iKTtpZih0aGlzLmF1dG9T dHJpcENoYXJzKXt0aGlzLnN0cmlwQ2hhcnNSZT1uZXcgUmVnRXhwKCJbXiIrYSsi XSIsImdpIil9RXh0LmZvcm0uTnVtYmVyRmllbGQuc3VwZXJjbGFzcy5pbml0RXZl bnRzLmNhbGwodGhpcyl9LGdldEVycm9yczpmdW5jdGlvbihiKXt2YXIgYz1FeHQu Zm9ybS5OdW1iZXJGaWVsZC5zdXBlcmNsYXNzLmdldEVycm9ycy5hcHBseSh0aGlz LGFyZ3VtZW50cyk7Yj1FeHQuaXNEZWZpbmVkKGIpP2I6dGhpcy5wcm9jZXNzVmFs dWUodGhpcy5nZXRSYXdWYWx1ZSgpKTtpZihiLmxlbmd0aDwxKXtyZXR1cm4gY31i PVN0cmluZyhiKS5yZXBsYWNlKHRoaXMuZGVjaW1hbFNlcGFyYXRvciwiLiIpO2lm KGlzTmFOKGIpKXtjLnB1c2goU3RyaW5nLmZvcm1hdCh0aGlzLm5hblRleHQsYikp fXZhciBhPXRoaXMucGFyc2VWYWx1ZShiKTtpZihhPHRoaXMubWluVmFsdWUpe2Mu cHVzaChTdHJpbmcuZm9ybWF0KHRoaXMubWluVGV4dCx0aGlzLm1pblZhbHVlKSl9 aWYoYT50aGlzLm1heFZhbHVlKXtjLnB1c2goU3RyaW5nLmZvcm1hdCh0aGlzLm1h eFRleHQsdGhpcy5tYXhWYWx1ZSkpfXJldHVybiBjfSxnZXRWYWx1ZTpmdW5jdGlv bigpe3JldHVybiB0aGlzLmZpeFByZWNpc2lvbih0aGlzLnBhcnNlVmFsdWUoRXh0 LmZvcm0uTnVtYmVyRmllbGQuc3VwZXJjbGFzcy5nZXRWYWx1ZS5jYWxsKHRoaXMp KSl9LHNldFZhbHVlOmZ1bmN0aW9uKGEpe2E9RXh0LmlzTnVtYmVyKGEpP2E6cGFy c2VGbG9hdChTdHJpbmcoYSkucmVwbGFjZSh0aGlzLmRlY2ltYWxTZXBhcmF0b3Is Ii4iKSk7YT10aGlzLmZpeFByZWNpc2lvbihhKTthPWlzTmFOKGEpPyIiOlN0cmlu ZyhhKS5yZXBsYWNlKCIuIix0aGlzLmRlY2ltYWxTZXBhcmF0b3IpO3JldHVybiBF eHQuZm9ybS5OdW1iZXJGaWVsZC5zdXBlcmNsYXNzLnNldFZhbHVlLmNhbGwodGhp cyxhKX0sc2V0TWluVmFsdWU6ZnVuY3Rpb24oYSl7dGhpcy5taW5WYWx1ZT1FeHQu bnVtKGEsTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKX0sc2V0TWF4VmFsdWU6ZnVu Y3Rpb24oYSl7dGhpcy5tYXhWYWx1ZT1FeHQubnVtKGEsTnVtYmVyLk1BWF9WQUxV RSl9LHBhcnNlVmFsdWU6ZnVuY3Rpb24oYSl7YT1wYXJzZUZsb2F0KFN0cmluZyhh KS5yZXBsYWNlKHRoaXMuZGVjaW1hbFNlcGFyYXRvciwiLiIpKTtyZXR1cm4gaXNO YU4oYSk/IiI6YX0sZml4UHJlY2lzaW9uOmZ1bmN0aW9uKGIpe3ZhciBhPWlzTmFO KGIpO2lmKCF0aGlzLmFsbG93RGVjaW1hbHN8fHRoaXMuZGVjaW1hbFByZWNpc2lv bj09LTF8fGF8fCFiKXtyZXR1cm4gYT8iIjpifXJldHVybiBwYXJzZUZsb2F0KHBh cnNlRmxvYXQoYikudG9GaXhlZCh0aGlzLmRlY2ltYWxQcmVjaXNpb24pKX0sYmVm b3JlQmx1cjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGFyc2VWYWx1ZSh0aGlzLmdl dFJhd1ZhbHVlKCkpO2lmKCFFeHQuaXNFbXB0eShhKSl7dGhpcy5zZXRWYWx1ZShh KX19fSk7RXh0LnJlZygibnVtYmVyZmllbGQiLEV4dC5mb3JtLk51bWJlckZpZWxk KTtFeHQuZm9ybS5EYXRlRmllbGQ9RXh0LmV4dGVuZChFeHQuZm9ybS5UcmlnZ2Vy RmllbGQse2Zvcm1hdDoibS9kL1kiLGFsdEZvcm1hdHM6Im0vZC9ZfG4vai9ZfG4v ai95fG0vai95fG4vZC95fG0vai9ZfG4vZC9ZfG0tZC15fG0tZC1ZfG0vZHxtLWR8 bWR8bWR5fG1kWXxkfFktbS1kfG4tanxuL2oiLGRpc2FibGVkRGF5c1RleHQ6IkRp c2FibGVkIixkaXNhYmxlZERhdGVzVGV4dDoiRGlzYWJsZWQiLG1pblRleHQ6IlRo ZSBkYXRlIGluIHRoaXMgZmllbGQgbXVzdCBiZSBlcXVhbCB0byBvciBhZnRlciB7 MH0iLG1heFRleHQ6IlRoZSBkYXRlIGluIHRoaXMgZmllbGQgbXVzdCBiZSBlcXVh bCB0byBvciBiZWZvcmUgezB9IixpbnZhbGlkVGV4dDoiezB9IGlzIG5vdCBhIHZh bGlkIGRhdGUgLSBpdCBtdXN0IGJlIGluIHRoZSBmb3JtYXQgezF9Iix0cmlnZ2Vy Q2xhc3M6IngtZm9ybS1kYXRlLXRyaWdnZXIiLHNob3dUb2RheTp0cnVlLHN0YXJ0 RGF5OjAsZGVmYXVsdEF1dG9DcmVhdGU6e3RhZzoiaW5wdXQiLHR5cGU6InRleHQi LHNpemU6IjEwIixhdXRvY29tcGxldGU6Im9mZiJ9LGluaXRUaW1lOiIxMiIsaW5p dFRpbWVGb3JtYXQ6IkgiLHNhZmVQYXJzZTpmdW5jdGlvbihiLGMpe2lmKERhdGUu Zm9ybWF0Q29udGFpbnNIb3VySW5mbyhjKSl7cmV0dXJuIERhdGUucGFyc2VEYXRl KGIsYyl9ZWxzZXt2YXIgYT1EYXRlLnBhcnNlRGF0ZShiKyIgIit0aGlzLmluaXRU aW1lLGMrIiAiK3RoaXMuaW5pdFRpbWVGb3JtYXQpO2lmKGEpe3JldHVybiBhLmNs ZWFyVGltZSgpfX19LGluaXRDb21wb25lbnQ6ZnVuY3Rpb24oKXtFeHQuZm9ybS5E YXRlRmllbGQuc3VwZXJjbGFzcy5pbml0Q29tcG9uZW50LmNhbGwodGhpcyk7dGhp cy5hZGRFdmVudHMoInNlbGVjdCIpO2lmKEV4dC5pc1N0cmluZyh0aGlzLm1pblZh bHVlKSl7dGhpcy5taW5WYWx1ZT10aGlzLnBhcnNlRGF0ZSh0aGlzLm1pblZhbHVl KX1pZihFeHQuaXNTdHJpbmcodGhpcy5tYXhWYWx1ZSkpe3RoaXMubWF4VmFsdWU9 dGhpcy5wYXJzZURhdGUodGhpcy5tYXhWYWx1ZSl9dGhpcy5kaXNhYmxlZERhdGVz UkU9bnVsbDt0aGlzLmluaXREaXNhYmxlZERheXMoKX0saW5pdEV2ZW50czpmdW5j dGlvbigpe0V4dC5mb3JtLkRhdGVGaWVsZC5zdXBlcmNsYXNzLmluaXRFdmVudHMu Y2FsbCh0aGlzKTt0aGlzLmtleU5hdj1uZXcgRXh0LktleU5hdih0aGlzLmVsLHtk b3duOmZ1bmN0aW9uKGEpe3RoaXMub25UcmlnZ2VyQ2xpY2soKX0sc2NvcGU6dGhp cyxmb3JjZUtleURvd246dHJ1ZX0pfSxpbml0RGlzYWJsZWREYXlzOmZ1bmN0aW9u KCl7aWYodGhpcy5kaXNhYmxlZERhdGVzKXt2YXIgYj10aGlzLmRpc2FibGVkRGF0 ZXMsYT1iLmxlbmd0aC0xLGM9Iig/OiI7RXh0LmVhY2goYixmdW5jdGlvbihnLGUp e2MrPUV4dC5pc0RhdGUoZyk/Il4iK0V4dC5lc2NhcGVSZShnLmRhdGVGb3JtYXQo dGhpcy5mb3JtYXQpKSsiJCI6YltlXTtpZihlIT1hKXtjKz0ifCJ9fSx0aGlzKTt0 aGlzLmRpc2FibGVkRGF0ZXNSRT1uZXcgUmVnRXhwKGMrIikiKX19LHNldERpc2Fi bGVkRGF0ZXM6ZnVuY3Rpb24oYSl7dGhpcy5kaXNhYmxlZERhdGVzPWE7dGhpcy5p bml0RGlzYWJsZWREYXlzKCk7aWYodGhpcy5tZW51KXt0aGlzLm1lbnUucGlja2Vy LnNldERpc2FibGVkRGF0ZXModGhpcy5kaXNhYmxlZERhdGVzUkUpfX0sc2V0RGlz YWJsZWREYXlzOmZ1bmN0aW9uKGEpe3RoaXMuZGlzYWJsZWREYXlzPWE7aWYodGhp cy5tZW51KXt0aGlzLm1lbnUucGlja2VyLnNldERpc2FibGVkRGF5cyhhKX19LHNl dE1pblZhbHVlOmZ1bmN0aW9uKGEpe3RoaXMubWluVmFsdWU9KEV4dC5pc1N0cmlu ZyhhKT90aGlzLnBhcnNlRGF0ZShhKTphKTtpZih0aGlzLm1lbnUpe3RoaXMubWVu dS5waWNrZXIuc2V0TWluRGF0ZSh0aGlzLm1pblZhbHVlKX19LHNldE1heFZhbHVl OmZ1bmN0aW9uKGEpe3RoaXMubWF4VmFsdWU9KEV4dC5pc1N0cmluZyhhKT90aGlz LnBhcnNlRGF0ZShhKTphKTtpZih0aGlzLm1lbnUpe3RoaXMubWVudS5waWNrZXIu c2V0TWF4RGF0ZSh0aGlzLm1heFZhbHVlKX19LGdldEVycm9yczpmdW5jdGlvbihl KXt2YXIgaD1FeHQuZm9ybS5EYXRlRmllbGQuc3VwZXJjbGFzcy5nZXRFcnJvcnMu YXBwbHkodGhpcyxhcmd1bWVudHMpO2U9dGhpcy5mb3JtYXREYXRlKGV8fHRoaXMu cHJvY2Vzc1ZhbHVlKHRoaXMuZ2V0UmF3VmFsdWUoKSkpO2lmKGUubGVuZ3RoPDEp e3JldHVybiBofXZhciBjPWU7ZT10aGlzLnBhcnNlRGF0ZShlKTtpZighZSl7aC5w dXNoKFN0cmluZy5mb3JtYXQodGhpcy5pbnZhbGlkVGV4dCxjLHRoaXMuZm9ybWF0 KSk7cmV0dXJuIGh9dmFyIGc9ZS5nZXRUaW1lKCk7aWYodGhpcy5taW5WYWx1ZSYm Zzx0aGlzLm1pblZhbHVlLmNsZWFyVGltZSgpLmdldFRpbWUoKSl7aC5wdXNoKFN0 cmluZy5mb3JtYXQodGhpcy5taW5UZXh0LHRoaXMuZm9ybWF0RGF0ZSh0aGlzLm1p blZhbHVlKSkpfWlmKHRoaXMubWF4VmFsdWUmJmc+dGhpcy5tYXhWYWx1ZS5jbGVh clRpbWUoKS5nZXRUaW1lKCkpe2gucHVzaChTdHJpbmcuZm9ybWF0KHRoaXMubWF4 VGV4dCx0aGlzLmZvcm1hdERhdGUodGhpcy5tYXhWYWx1ZSkpKX1pZih0aGlzLmRp c2FibGVkRGF5cyl7dmFyIGE9ZS5nZXREYXkoKTtmb3IodmFyIGI9MDtiPHRoaXMu ZGlzYWJsZWREYXlzLmxlbmd0aDtiKyspe2lmKGE9PT10aGlzLmRpc2FibGVkRGF5 c1tiXSl7aC5wdXNoKHRoaXMuZGlzYWJsZWREYXlzVGV4dCk7YnJlYWt9fX12YXIg ZD10aGlzLmZvcm1hdERhdGUoZSk7aWYodGhpcy5kaXNhYmxlZERhdGVzUkUmJnRo aXMuZGlzYWJsZWREYXRlc1JFLnRlc3QoZCkpe2gucHVzaChTdHJpbmcuZm9ybWF0 KHRoaXMuZGlzYWJsZWREYXRlc1RleHQsZCkpfXJldHVybiBofSx2YWxpZGF0ZUJs dXI6ZnVuY3Rpb24oKXtyZXR1cm4gIXRoaXMubWVudXx8IXRoaXMubWVudS5pc1Zp c2libGUoKX0sZ2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJzZURh dGUoRXh0LmZvcm0uRGF0ZUZpZWxkLnN1cGVyY2xhc3MuZ2V0VmFsdWUuY2FsbCh0 aGlzKSl8fCIifSxzZXRWYWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gRXh0LmZvcm0u RGF0ZUZpZWxkLnN1cGVyY2xhc3Muc2V0VmFsdWUuY2FsbCh0aGlzLHRoaXMuZm9y bWF0RGF0ZSh0aGlzLnBhcnNlRGF0ZShhKSkpfSxwYXJzZURhdGU6ZnVuY3Rpb24o Zyl7aWYoIWd8fEV4dC5pc0RhdGUoZykpe3JldHVybiBnfXZhciBiPXRoaXMuc2Fm ZVBhcnNlKGcsdGhpcy5mb3JtYXQpLGM9dGhpcy5hbHRGb3JtYXRzLGU9dGhpcy5h bHRGb3JtYXRzQXJyYXk7aWYoIWImJmMpe2U9ZXx8Yy5zcGxpdCgifCIpO2Zvcih2 YXIgZD0wLGE9ZS5sZW5ndGg7ZDxhJiYhYjtkKyspe2I9dGhpcy5zYWZlUGFyc2Uo ZyxlW2RdKX19cmV0dXJuIGJ9LG9uRGVzdHJveTpmdW5jdGlvbigpe0V4dC5kZXN0 cm95KHRoaXMubWVudSx0aGlzLmtleU5hdik7RXh0LmZvcm0uRGF0ZUZpZWxkLnN1 cGVyY2xhc3Mub25EZXN0cm95LmNhbGwodGhpcyl9LGZvcm1hdERhdGU6ZnVuY3Rp b24oYSl7cmV0dXJuIEV4dC5pc0RhdGUoYSk/YS5kYXRlRm9ybWF0KHRoaXMuZm9y bWF0KTphfSxvblRyaWdnZXJDbGljazpmdW5jdGlvbigpe2lmKHRoaXMuZGlzYWJs ZWQpe3JldHVybn1pZih0aGlzLm1lbnU9PW51bGwpe3RoaXMubWVudT1uZXcgRXh0 Lm1lbnUuRGF0ZU1lbnUoe2hpZGVPbkNsaWNrOmZhbHNlLGZvY3VzT25TZWxlY3Q6 ZmFsc2V9KX10aGlzLm9uRm9jdXMoKTtFeHQuYXBwbHkodGhpcy5tZW51LnBpY2tl cix7bWluRGF0ZTp0aGlzLm1pblZhbHVlLG1heERhdGU6dGhpcy5tYXhWYWx1ZSxk aXNhYmxlZERhdGVzUkU6dGhpcy5kaXNhYmxlZERhdGVzUkUsZGlzYWJsZWREYXRl c1RleHQ6dGhpcy5kaXNhYmxlZERhdGVzVGV4dCxkaXNhYmxlZERheXM6dGhpcy5k aXNhYmxlZERheXMsZGlzYWJsZWREYXlzVGV4dDp0aGlzLmRpc2FibGVkRGF5c1Rl eHQsZm9ybWF0OnRoaXMuZm9ybWF0LHNob3dUb2RheTp0aGlzLnNob3dUb2RheSxz dGFydERheTp0aGlzLnN0YXJ0RGF5LG1pblRleHQ6U3RyaW5nLmZvcm1hdCh0aGlz Lm1pblRleHQsdGhpcy5mb3JtYXREYXRlKHRoaXMubWluVmFsdWUpKSxtYXhUZXh0 OlN0cmluZy5mb3JtYXQodGhpcy5tYXhUZXh0LHRoaXMuZm9ybWF0RGF0ZSh0aGlz Lm1heFZhbHVlKSl9KTt0aGlzLm1lbnUucGlja2VyLnNldFZhbHVlKHRoaXMuZ2V0 VmFsdWUoKXx8bmV3IERhdGUoKSk7dGhpcy5tZW51LnNob3codGhpcy5lbCwidGwt Ymw/Iik7dGhpcy5tZW51RXZlbnRzKCJvbiIpfSxtZW51RXZlbnRzOmZ1bmN0aW9u KGEpe3RoaXMubWVudVthXSgic2VsZWN0Iix0aGlzLm9uU2VsZWN0LHRoaXMpO3Ro aXMubWVudVthXSgiaGlkZSIsdGhpcy5vbk1lbnVIaWRlLHRoaXMpO3RoaXMubWVu dVthXSgic2hvdyIsdGhpcy5vbkZvY3VzLHRoaXMpfSxvblNlbGVjdDpmdW5jdGlv bihhLGIpe3RoaXMuc2V0VmFsdWUoYik7dGhpcy5maXJlRXZlbnQoInNlbGVjdCIs dGhpcyxiKTt0aGlzLm1lbnUuaGlkZSgpfSxvbk1lbnVIaWRlOmZ1bmN0aW9uKCl7 dGhpcy5mb2N1cyhmYWxzZSw2MCk7dGhpcy5tZW51RXZlbnRzKCJ1biIpfSxiZWZv cmVCbHVyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wYXJzZURhdGUodGhpcy5nZXRS YXdWYWx1ZSgpKTtpZihhKXt0aGlzLnNldFZhbHVlKGEpfX19KTtFeHQucmVnKCJk YXRlZmllbGQiLEV4dC5mb3JtLkRhdGVGaWVsZCk7RXh0LmZvcm0uRGlzcGxheUZp ZWxkPUV4dC5leHRlbmQoRXh0LmZvcm0uRmllbGQse3ZhbGlkYXRpb25FdmVudDpm YWxzZSx2YWxpZGF0ZU9uQmx1cjpmYWxzZSxkZWZhdWx0QXV0b0NyZWF0ZTp7dGFn OiJkaXYifSxmaWVsZENsYXNzOiJ4LWZvcm0tZGlzcGxheS1maWVsZCIsaHRtbEVu Y29kZTpmYWxzZSxpbml0RXZlbnRzOkV4dC5lbXB0eUZuLGlzVmFsaWQ6ZnVuY3Rp b24oKXtyZXR1cm4gdHJ1ZX0sdmFsaWRhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdHJ1 ZX0sZ2V0UmF3VmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlbmRlcmVkP3Ro aXMuZWwuZG9tLmlubmVySFRNTDpFeHQudmFsdWUodGhpcy52YWx1ZSwiIik7aWYo YT09PXRoaXMuZW1wdHlUZXh0KXthPSIifWlmKHRoaXMuaHRtbEVuY29kZSl7YT1F eHQudXRpbC5Gb3JtYXQuaHRtbERlY29kZShhKX1yZXR1cm4gYX0sZ2V0VmFsdWU6 ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdWYWx1ZSgpfSxnZXROYW1lOmZ1 bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZX0sc2V0UmF3VmFsdWU6ZnVuY3Rpb24o YSl7aWYodGhpcy5odG1sRW5jb2RlKXthPUV4dC51dGlsLkZvcm1hdC5odG1sRW5j b2RlKGEpfXJldHVybiB0aGlzLnJlbmRlcmVkPyh0aGlzLmVsLmRvbS5pbm5lckhU TUw9KEV4dC5pc0VtcHR5KGEpPyIiOmEpKToodGhpcy52YWx1ZT1hKX0sc2V0VmFs dWU6ZnVuY3Rpb24oYSl7dGhpcy5zZXRSYXdWYWx1ZShhKTtyZXR1cm4gdGhpc319 KTtFeHQucmVnKCJkaXNwbGF5ZmllbGQiLEV4dC5mb3JtLkRpc3BsYXlGaWVsZCk7 RXh0LmZvcm0uQ29tYm9Cb3g9RXh0LmV4dGVuZChFeHQuZm9ybS5UcmlnZ2VyRmll bGQse2RlZmF1bHRBdXRvQ3JlYXRlOnt0YWc6ImlucHV0Iix0eXBlOiJ0ZXh0Iixz aXplOiIyNCIsYXV0b2NvbXBsZXRlOiJvZmYifSxsaXN0Q2xhc3M6IiIsc2VsZWN0 ZWRDbGFzczoieC1jb21iby1zZWxlY3RlZCIsbGlzdEVtcHR5VGV4dDoiIix0cmln Z2VyQ2xhc3M6IngtZm9ybS1hcnJvdy10cmlnZ2VyIixzaGFkb3c6InNpZGVzIixs aXN0QWxpZ246InRsLWJsPyIsbWF4SGVpZ2h0OjMwMCxtaW5IZWlnaHQ6OTAsdHJp Z2dlckFjdGlvbjoicXVlcnkiLG1pbkNoYXJzOjQsYXV0b1NlbGVjdDp0cnVlLHR5 cGVBaGVhZDpmYWxzZSxxdWVyeURlbGF5OjUwMCxwYWdlU2l6ZTowLHNlbGVjdE9u Rm9jdXM6ZmFsc2UscXVlcnlQYXJhbToicXVlcnkiLGxvYWRpbmdUZXh0OiJMb2Fk aW5nLi4uIixyZXNpemFibGU6ZmFsc2UsaGFuZGxlSGVpZ2h0OjgsYWxsUXVlcnk6 IiIsbW9kZToicmVtb3RlIixtaW5MaXN0V2lkdGg6NzAsZm9yY2VTZWxlY3Rpb246 ZmFsc2UsdHlwZUFoZWFkRGVsYXk6MjUwLGxhenlJbml0OnRydWUsY2xlYXJGaWx0 ZXJPblJlc2V0OnRydWUsc3VibWl0VmFsdWU6dW5kZWZpbmVkLGluaXRDb21wb25l bnQ6ZnVuY3Rpb24oKXtFeHQuZm9ybS5Db21ib0JveC5zdXBlcmNsYXNzLmluaXRD b21wb25lbnQuY2FsbCh0aGlzKTt0aGlzLmFkZEV2ZW50cygiZXhwYW5kIiwiY29s bGFwc2UiLCJiZWZvcmVzZWxlY3QiLCJzZWxlY3QiLCJiZWZvcmVxdWVyeSIpO2lm KHRoaXMudHJhbnNmb3JtKXt2YXIgYz1FeHQuZ2V0RG9tKHRoaXMudHJhbnNmb3Jt KTtpZighdGhpcy5oaWRkZW5OYW1lKXt0aGlzLmhpZGRlbk5hbWU9Yy5uYW1lfWlm KCF0aGlzLnN0b3JlKXt0aGlzLm1vZGU9ImxvY2FsIjt2YXIgaj1bXSxlPWMub3B0 aW9ucztmb3IodmFyIGI9MCxhPWUubGVuZ3RoO2I8YTtiKyspe3ZhciBoPWVbYl0s Zz0oaC5oYXNBdHRyaWJ1dGU/aC5oYXNBdHRyaWJ1dGUoInZhbHVlIik6aC5nZXRB dHRyaWJ1dGVOb2RlKCJ2YWx1ZSIpLnNwZWNpZmllZCk/aC52YWx1ZTpoLnRleHQ7 aWYoaC5zZWxlY3RlZCYmRXh0LmlzRW1wdHkodGhpcy52YWx1ZSx0cnVlKSl7dGhp cy52YWx1ZT1nfWoucHVzaChbZyxoLnRleHRdKX10aGlzLnN0b3JlPW5ldyBFeHQu ZGF0YS5BcnJheVN0b3JlKHtpZEluZGV4OjAsZmllbGRzOlsidmFsdWUiLCJ0ZXh0 Il0sZGF0YTpqLGF1dG9EZXN0cm95OnRydWV9KTt0aGlzLnZhbHVlRmllbGQ9InZh bHVlIjt0aGlzLmRpc3BsYXlGaWVsZD0idGV4dCJ9Yy5uYW1lPUV4dC5pZCgpO2lm KCF0aGlzLmxhenlSZW5kZXIpe3RoaXMudGFyZ2V0PXRydWU7dGhpcy5lbD1FeHQu RG9tSGVscGVyLmluc2VydEJlZm9yZShjLHRoaXMuYXV0b0NyZWF0ZXx8dGhpcy5k ZWZhdWx0QXV0b0NyZWF0ZSk7dGhpcy5yZW5kZXIodGhpcy5lbC5wYXJlbnROb2Rl LGMpfUV4dC5yZW1vdmVOb2RlKGMpfWVsc2V7aWYodGhpcy5zdG9yZSl7dGhpcy5z dG9yZT1FeHQuU3RvcmVNZ3IubG9va3VwKHRoaXMuc3RvcmUpO2lmKHRoaXMuc3Rv cmUuYXV0b0NyZWF0ZWQpe3RoaXMuZGlzcGxheUZpZWxkPXRoaXMudmFsdWVGaWVs ZD0iZmllbGQxIjtpZighdGhpcy5zdG9yZS5leHBhbmREYXRhKXt0aGlzLmRpc3Bs YXlGaWVsZD0iZmllbGQyIn10aGlzLm1vZGU9ImxvY2FsIn19fXRoaXMuc2VsZWN0 ZWRJbmRleD0tMTtpZih0aGlzLm1vZGU9PSJsb2NhbCIpe2lmKCFFeHQuaXNEZWZp bmVkKHRoaXMuaW5pdGlhbENvbmZpZy5xdWVyeURlbGF5KSl7dGhpcy5xdWVyeURl bGF5PTEwfWlmKCFFeHQuaXNEZWZpbmVkKHRoaXMuaW5pdGlhbENvbmZpZy5taW5D aGFycykpe3RoaXMubWluQ2hhcnM9MH19fSxvblJlbmRlcjpmdW5jdGlvbihiLGEp e2lmKHRoaXMuaGlkZGVuTmFtZSYmIUV4dC5pc0RlZmluZWQodGhpcy5zdWJtaXRW YWx1ZSkpe3RoaXMuc3VibWl0VmFsdWU9ZmFsc2V9RXh0LmZvcm0uQ29tYm9Cb3gu c3VwZXJjbGFzcy5vblJlbmRlci5jYWxsKHRoaXMsYixhKTtpZih0aGlzLmhpZGRl bk5hbWUpe3RoaXMuaGlkZGVuRmllbGQ9dGhpcy5lbC5pbnNlcnRTaWJsaW5nKHt0 YWc6ImlucHV0Iix0eXBlOiJoaWRkZW4iLG5hbWU6dGhpcy5oaWRkZW5OYW1lLGlk Oih0aGlzLmhpZGRlbklkfHxFeHQuaWQoKSl9LCJiZWZvcmUiLHRydWUpfWlmKEV4 dC5pc0dlY2tvKXt0aGlzLmVsLmRvbS5zZXRBdHRyaWJ1dGUoImF1dG9jb21wbGV0 ZSIsIm9mZiIpfWlmKCF0aGlzLmxhenlJbml0KXt0aGlzLmluaXRMaXN0KCl9ZWxz ZXt0aGlzLm9uKCJmb2N1cyIsdGhpcy5pbml0TGlzdCx0aGlzLHtzaW5nbGU6dHJ1 ZX0pfX0saW5pdFZhbHVlOmZ1bmN0aW9uKCl7RXh0LmZvcm0uQ29tYm9Cb3guc3Vw ZXJjbGFzcy5pbml0VmFsdWUuY2FsbCh0aGlzKTtpZih0aGlzLmhpZGRlbkZpZWxk KXt0aGlzLmhpZGRlbkZpZWxkLnZhbHVlPUV4dC52YWx1ZShFeHQuaXNEZWZpbmVk KHRoaXMuaGlkZGVuVmFsdWUpP3RoaXMuaGlkZGVuVmFsdWU6dGhpcy52YWx1ZSwi Iil9fSxnZXRQYXJlbnRaSW5kZXg6ZnVuY3Rpb24oKXt2YXIgYTtpZih0aGlzLm93 bmVyQ3Qpe3RoaXMuZmluZFBhcmVudEJ5KGZ1bmN0aW9uKGIpe2E9cGFyc2VJbnQo Yi5nZXRQb3NpdGlvbkVsKCkuZ2V0U3R5bGUoInotaW5kZXgiKSwxMCk7cmV0dXJu ICEhYX0pfXJldHVybiBhfSxnZXRaSW5kZXg6ZnVuY3Rpb24oYil7Yj1ifHxFeHQu Z2V0RG9tKHRoaXMuZ2V0TGlzdFBhcmVudCgpfHxFeHQuZ2V0Qm9keSgpKTt2YXIg YT1wYXJzZUludChFeHQuZmx5KGIpLmdldFN0eWxlKCJ6LWluZGV4IiksMTApO2lm KCFhKXthPXRoaXMuZ2V0UGFyZW50WkluZGV4KCl9cmV0dXJuKGF8fDEyMDAwKSs1 fSxpbml0TGlzdDpmdW5jdGlvbigpe2lmKCF0aGlzLmxpc3Qpe3ZhciBhPSJ4LWNv bWJvLWxpc3QiLGM9RXh0LmdldERvbSh0aGlzLmdldExpc3RQYXJlbnQoKXx8RXh0 LmdldEJvZHkoKSk7dGhpcy5saXN0PW5ldyBFeHQuTGF5ZXIoe3BhcmVudEVsOmMs c2hhZG93OnRoaXMuc2hhZG93LGNsczpbYSx0aGlzLmxpc3RDbGFzc10uam9pbigi ICIpLGNvbnN0cmFpbjpmYWxzZSx6aW5kZXg6dGhpcy5nZXRaSW5kZXgoYyl9KTt2 YXIgYj10aGlzLmxpc3RXaWR0aHx8TWF0aC5tYXgodGhpcy53cmFwLmdldFdpZHRo KCksdGhpcy5taW5MaXN0V2lkdGgpO3RoaXMubGlzdC5zZXRTaXplKGIsMCk7dGhp cy5saXN0LnN3YWxsb3dFdmVudCgibW91c2V3aGVlbCIpO3RoaXMuYXNzZXRIZWln aHQ9MDtpZih0aGlzLnN5bmNGb250IT09ZmFsc2Upe3RoaXMubGlzdC5zZXRTdHls ZSgiZm9udC1zaXplIix0aGlzLmVsLmdldFN0eWxlKCJmb250LXNpemUiKSl9aWYo dGhpcy50aXRsZSl7dGhpcy5oZWFkZXI9dGhpcy5saXN0LmNyZWF0ZUNoaWxkKHtj bHM6YSsiLWhkIixodG1sOnRoaXMudGl0bGV9KTt0aGlzLmFzc2V0SGVpZ2h0Kz10 aGlzLmhlYWRlci5nZXRIZWlnaHQoKX10aGlzLmlubmVyTGlzdD10aGlzLmxpc3Qu Y3JlYXRlQ2hpbGQoe2NsczphKyItaW5uZXIifSk7dGhpcy5tb24odGhpcy5pbm5l ckxpc3QsIm1vdXNlb3ZlciIsdGhpcy5vblZpZXdPdmVyLHRoaXMpO3RoaXMubW9u KHRoaXMuaW5uZXJMaXN0LCJtb3VzZW1vdmUiLHRoaXMub25WaWV3TW92ZSx0aGlz KTt0aGlzLmlubmVyTGlzdC5zZXRXaWR0aChiLXRoaXMubGlzdC5nZXRGcmFtZVdp ZHRoKCJsciIpKTtpZih0aGlzLnBhZ2VTaXplKXt0aGlzLmZvb3Rlcj10aGlzLmxp c3QuY3JlYXRlQ2hpbGQoe2NsczphKyItZnQifSk7dGhpcy5wYWdlVGI9bmV3IEV4 dC5QYWdpbmdUb29sYmFyKHtzdG9yZTp0aGlzLnN0b3JlLHBhZ2VTaXplOnRoaXMu cGFnZVNpemUscmVuZGVyVG86dGhpcy5mb290ZXJ9KTt0aGlzLmFzc2V0SGVpZ2h0 Kz10aGlzLmZvb3Rlci5nZXRIZWlnaHQoKX1pZighdGhpcy50cGwpe3RoaXMudHBs PSc8dHBsIGZvcj0iLiI+PGRpdiBjbGFzcz0iJythKyctaXRlbSI+eycrdGhpcy5k aXNwbGF5RmllbGQrIn08L2Rpdj48L3RwbD4ifXRoaXMudmlldz1uZXcgRXh0LkRh dGFWaWV3KHthcHBseVRvOnRoaXMuaW5uZXJMaXN0LHRwbDp0aGlzLnRwbCxzaW5n bGVTZWxlY3Q6dHJ1ZSxzZWxlY3RlZENsYXNzOnRoaXMuc2VsZWN0ZWRDbGFzcyxp dGVtU2VsZWN0b3I6dGhpcy5pdGVtU2VsZWN0b3J8fCIuIithKyItaXRlbSIsZW1w dHlUZXh0OnRoaXMubGlzdEVtcHR5VGV4dCxkZWZlckVtcHR5VGV4dDpmYWxzZX0p O3RoaXMubW9uKHRoaXMudmlldyx7Y29udGFpbmVyY2xpY2s6dGhpcy5vblZpZXdD bGljayxjbGljazp0aGlzLm9uVmlld0NsaWNrLHNjb3BlOnRoaXN9KTt0aGlzLmJp bmRTdG9yZSh0aGlzLnN0b3JlLHRydWUpO2lmKHRoaXMucmVzaXphYmxlKXt0aGlz LnJlc2l6ZXI9bmV3IEV4dC5SZXNpemFibGUodGhpcy5saXN0LHtwaW5uZWQ6dHJ1 ZSxoYW5kbGVzOiJzZSJ9KTt0aGlzLm1vbih0aGlzLnJlc2l6ZXIsInJlc2l6ZSIs ZnVuY3Rpb24oZyxkLGUpe3RoaXMubWF4SGVpZ2h0PWUtdGhpcy5oYW5kbGVIZWln aHQtdGhpcy5saXN0LmdldEZyYW1lV2lkdGgoInRiIiktdGhpcy5hc3NldEhlaWdo dDt0aGlzLmxpc3RXaWR0aD1kO3RoaXMuaW5uZXJMaXN0LnNldFdpZHRoKGQtdGhp cy5saXN0LmdldEZyYW1lV2lkdGgoImxyIikpO3RoaXMucmVzdHJpY3RIZWlnaHQo KX0sdGhpcyk7dGhpc1t0aGlzLnBhZ2VTaXplPyJmb290ZXIiOiJpbm5lckxpc3Qi XS5zZXRTdHlsZSgibWFyZ2luLWJvdHRvbSIsdGhpcy5oYW5kbGVIZWlnaHQrInB4 Iil9fX0sZ2V0TGlzdFBhcmVudDpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5i b2R5fSxnZXRTdG9yZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0b3JlfSxiaW5k U3RvcmU6ZnVuY3Rpb24oYSxiKXtpZih0aGlzLnN0b3JlJiYhYil7aWYodGhpcy5z dG9yZSE9PWEmJnRoaXMuc3RvcmUuYXV0b0Rlc3Ryb3kpe3RoaXMuc3RvcmUuZGVz dHJveSgpfWVsc2V7dGhpcy5zdG9yZS51bigiYmVmb3JlbG9hZCIsdGhpcy5vbkJl Zm9yZUxvYWQsdGhpcyk7dGhpcy5zdG9yZS51bigibG9hZCIsdGhpcy5vbkxvYWQs dGhpcyk7dGhpcy5zdG9yZS51bigiZXhjZXB0aW9uIix0aGlzLmNvbGxhcHNlLHRo aXMpfWlmKCFhKXt0aGlzLnN0b3JlPW51bGw7aWYodGhpcy52aWV3KXt0aGlzLnZp ZXcuYmluZFN0b3JlKG51bGwpfWlmKHRoaXMucGFnZVRiKXt0aGlzLnBhZ2VUYi5i aW5kU3RvcmUobnVsbCl9fX1pZihhKXtpZighYil7dGhpcy5sYXN0UXVlcnk9bnVs bDtpZih0aGlzLnBhZ2VUYil7dGhpcy5wYWdlVGIuYmluZFN0b3JlKGEpfX10aGlz LnN0b3JlPUV4dC5TdG9yZU1nci5sb29rdXAoYSk7dGhpcy5zdG9yZS5vbih7c2Nv cGU6dGhpcyxiZWZvcmVsb2FkOnRoaXMub25CZWZvcmVMb2FkLGxvYWQ6dGhpcy5v bkxvYWQsZXhjZXB0aW9uOnRoaXMuY29sbGFwc2V9KTtpZih0aGlzLnZpZXcpe3Ro aXMudmlldy5iaW5kU3RvcmUoYSl9fX0scmVzZXQ6ZnVuY3Rpb24oKXtpZih0aGlz LmNsZWFyRmlsdGVyT25SZXNldCYmdGhpcy5tb2RlPT0ibG9jYWwiKXt0aGlzLnN0 b3JlLmNsZWFyRmlsdGVyKCl9RXh0LmZvcm0uQ29tYm9Cb3guc3VwZXJjbGFzcy5y ZXNldC5jYWxsKHRoaXMpfSxpbml0RXZlbnRzOmZ1bmN0aW9uKCl7RXh0LmZvcm0u Q29tYm9Cb3guc3VwZXJjbGFzcy5pbml0RXZlbnRzLmNhbGwodGhpcyk7dGhpcy5r ZXlOYXY9bmV3IEV4dC5LZXlOYXYodGhpcy5lbCx7dXA6ZnVuY3Rpb24oYSl7dGhp cy5pbktleU1vZGU9dHJ1ZTt0aGlzLnNlbGVjdFByZXYoKX0sZG93bjpmdW5jdGlv bihhKXtpZighdGhpcy5pc0V4cGFuZGVkKCkpe3RoaXMub25UcmlnZ2VyQ2xpY2so KX1lbHNle3RoaXMuaW5LZXlNb2RlPXRydWU7dGhpcy5zZWxlY3ROZXh0KCl9fSxl bnRlcjpmdW5jdGlvbihhKXt0aGlzLm9uVmlld0NsaWNrKCl9LGVzYzpmdW5jdGlv bihhKXt0aGlzLmNvbGxhcHNlKCl9LHRhYjpmdW5jdGlvbihhKXtpZih0aGlzLmZv cmNlU2VsZWN0aW9uPT09dHJ1ZSl7dGhpcy5jb2xsYXBzZSgpfWVsc2V7dGhpcy5v blZpZXdDbGljayhmYWxzZSl9cmV0dXJuIHRydWV9LHNjb3BlOnRoaXMsZG9SZWxh eTpmdW5jdGlvbihjLGIsYSl7aWYoYT09ImRvd24ifHx0aGlzLnNjb3BlLmlzRXhw YW5kZWQoKSl7dmFyIGQ9RXh0LktleU5hdi5wcm90b3R5cGUuZG9SZWxheS5hcHBs eSh0aGlzLGFyZ3VtZW50cyk7aWYoIUV4dC5pc0lFJiZFeHQuRXZlbnRNYW5hZ2Vy LnVzZUtleWRvd24pe3RoaXMuc2NvcGUuZmlyZUtleShjKX1yZXR1cm4gZH1yZXR1 cm4gdHJ1ZX0sZm9yY2VLZXlEb3duOnRydWUsZGVmYXVsdEV2ZW50QWN0aW9uOiJz dG9wRXZlbnQifSk7dGhpcy5xdWVyeURlbGF5PU1hdGgubWF4KHRoaXMucXVlcnlE ZWxheXx8MTAsdGhpcy5tb2RlPT0ibG9jYWwiPzEwOjI1MCk7dGhpcy5kcVRhc2s9 bmV3IEV4dC51dGlsLkRlbGF5ZWRUYXNrKHRoaXMuaW5pdFF1ZXJ5LHRoaXMpO2lm KHRoaXMudHlwZUFoZWFkKXt0aGlzLnRhVGFzaz1uZXcgRXh0LnV0aWwuRGVsYXll ZFRhc2sodGhpcy5vblR5cGVBaGVhZCx0aGlzKX1pZighdGhpcy5lbmFibGVLZXlF dmVudHMpe3RoaXMubW9uKHRoaXMuZWwsImtleXVwIix0aGlzLm9uS2V5VXAsdGhp cyl9fSxvbkRlc3Ryb3k6ZnVuY3Rpb24oKXtpZih0aGlzLmRxVGFzayl7dGhpcy5k cVRhc2suY2FuY2VsKCk7dGhpcy5kcVRhc2s9bnVsbH10aGlzLmJpbmRTdG9yZShu dWxsKTtFeHQuZGVzdHJveSh0aGlzLnJlc2l6ZXIsdGhpcy52aWV3LHRoaXMucGFn ZVRiLHRoaXMubGlzdCk7RXh0LmRlc3Ryb3lNZW1iZXJzKHRoaXMsImhpZGRlbkZp ZWxkIik7RXh0LmZvcm0uQ29tYm9Cb3guc3VwZXJjbGFzcy5vbkRlc3Ryb3kuY2Fs bCh0aGlzKX0sZmlyZUtleTpmdW5jdGlvbihhKXtpZighdGhpcy5pc0V4cGFuZGVk KCkpe0V4dC5mb3JtLkNvbWJvQm94LnN1cGVyY2xhc3MuZmlyZUtleS5jYWxsKHRo aXMsYSl9fSxvblJlc2l6ZTpmdW5jdGlvbihhLGIpe0V4dC5mb3JtLkNvbWJvQm94 LnN1cGVyY2xhc3Mub25SZXNpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCFp c05hTihhKSYmdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5saXN0KXt0aGlzLmRvUmVz aXplKGEpfWVsc2V7dGhpcy5idWZmZXJTaXplPWF9fSxkb1Jlc2l6ZTpmdW5jdGlv bihhKXtpZighRXh0LmlzRGVmaW5lZCh0aGlzLmxpc3RXaWR0aCkpe3ZhciBiPU1h dGgubWF4KGEsdGhpcy5taW5MaXN0V2lkdGgpO3RoaXMubGlzdC5zZXRXaWR0aChi KTt0aGlzLmlubmVyTGlzdC5zZXRXaWR0aChiLXRoaXMubGlzdC5nZXRGcmFtZVdp ZHRoKCJsciIpKX19LG9uRW5hYmxlOmZ1bmN0aW9uKCl7RXh0LmZvcm0uQ29tYm9C b3guc3VwZXJjbGFzcy5vbkVuYWJsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYo dGhpcy5oaWRkZW5GaWVsZCl7dGhpcy5oaWRkZW5GaWVsZC5kaXNhYmxlZD1mYWxz ZX19LG9uRGlzYWJsZTpmdW5jdGlvbigpe0V4dC5mb3JtLkNvbWJvQm94LnN1cGVy Y2xhc3Mub25EaXNhYmxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZih0aGlzLmhp ZGRlbkZpZWxkKXt0aGlzLmhpZGRlbkZpZWxkLmRpc2FibGVkPXRydWV9fSxvbkJl Zm9yZUxvYWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5oYXNGb2N1cyl7cmV0dXJufXRo aXMuaW5uZXJMaXN0LnVwZGF0ZSh0aGlzLmxvYWRpbmdUZXh0Pyc8ZGl2IGNsYXNz PSJsb2FkaW5nLWluZGljYXRvciI+Jyt0aGlzLmxvYWRpbmdUZXh0KyI8L2Rpdj4i OiIiKTt0aGlzLnJlc3RyaWN0SGVpZ2h0KCk7dGhpcy5zZWxlY3RlZEluZGV4PS0x fSxvbkxvYWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5oYXNGb2N1cyl7cmV0dXJufWlm KHRoaXMuc3RvcmUuZ2V0Q291bnQoKT4wfHx0aGlzLmxpc3RFbXB0eVRleHQpe3Ro aXMuZXhwYW5kKCk7dGhpcy5yZXN0cmljdEhlaWdodCgpO2lmKHRoaXMubGFzdFF1 ZXJ5PT10aGlzLmFsbFF1ZXJ5KXtpZih0aGlzLmVkaXRhYmxlKXt0aGlzLmVsLmRv bS5zZWxlY3QoKX1pZih0aGlzLmF1dG9TZWxlY3QhPT1mYWxzZSYmIXRoaXMuc2Vs ZWN0QnlWYWx1ZSh0aGlzLnZhbHVlLHRydWUpKXt0aGlzLnNlbGVjdCgwLHRydWUp fX1lbHNle2lmKHRoaXMuYXV0b1NlbGVjdCE9PWZhbHNlKXt0aGlzLnNlbGVjdE5l eHQoKX1pZih0aGlzLnR5cGVBaGVhZCYmdGhpcy5sYXN0S2V5IT1FeHQuRXZlbnRP YmplY3QuQkFDS1NQQUNFJiZ0aGlzLmxhc3RLZXkhPUV4dC5FdmVudE9iamVjdC5E RUxFVEUpe3RoaXMudGFUYXNrLmRlbGF5KHRoaXMudHlwZUFoZWFkRGVsYXkpfX19 ZWxzZXt0aGlzLmNvbGxhcHNlKCl9fSxvblR5cGVBaGVhZDpmdW5jdGlvbigpe2lm KHRoaXMuc3RvcmUuZ2V0Q291bnQoKT4wKXt2YXIgYj10aGlzLnN0b3JlLmdldEF0 KDApO3ZhciBjPWIuZGF0YVt0aGlzLmRpc3BsYXlGaWVsZF07dmFyIGE9Yy5sZW5n dGg7dmFyIGQ9dGhpcy5nZXRSYXdWYWx1ZSgpLmxlbmd0aDtpZihkIT1hKXt0aGlz LnNldFJhd1ZhbHVlKGMpO3RoaXMuc2VsZWN0VGV4dChkLGMubGVuZ3RoKX19fSxh c3NlcnRWYWx1ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3VmFsdWUoKSxh O2lmKHRoaXMudmFsdWVGaWVsZCYmRXh0LmlzRGVmaW5lZCh0aGlzLnZhbHVlKSl7 YT10aGlzLmZpbmRSZWNvcmQodGhpcy52YWx1ZUZpZWxkLHRoaXMudmFsdWUpfWlm KCFhfHxhLmdldCh0aGlzLmRpc3BsYXlGaWVsZCkhPWIpe2E9dGhpcy5maW5kUmVj b3JkKHRoaXMuZGlzcGxheUZpZWxkLGIpfWlmKCFhJiZ0aGlzLmZvcmNlU2VsZWN0 aW9uKXtpZihiLmxlbmd0aD4wJiZiIT10aGlzLmVtcHR5VGV4dCl7dGhpcy5lbC5k b20udmFsdWU9RXh0LnZhbHVlKHRoaXMubGFzdFNlbGVjdGlvblRleHQsIiIpO3Ro aXMuYXBwbHlFbXB0eVRleHQoKX1lbHNle3RoaXMuY2xlYXJWYWx1ZSgpfX1lbHNl e2lmKGEmJnRoaXMudmFsdWVGaWVsZCl7aWYodGhpcy52YWx1ZT09Yil7cmV0dXJu fWI9YS5nZXQodGhpcy52YWx1ZUZpZWxkfHx0aGlzLmRpc3BsYXlGaWVsZCl9dGhp cy5zZXRWYWx1ZShiKX19LG9uU2VsZWN0OmZ1bmN0aW9uKGEsYil7aWYodGhpcy5m aXJlRXZlbnQoImJlZm9yZXNlbGVjdCIsdGhpcyxhLGIpIT09ZmFsc2Upe3RoaXMu c2V0VmFsdWUoYS5kYXRhW3RoaXMudmFsdWVGaWVsZHx8dGhpcy5kaXNwbGF5Rmll bGRdKTt0aGlzLmNvbGxhcHNlKCk7dGhpcy5maXJlRXZlbnQoInNlbGVjdCIsdGhp cyxhLGIpfX0sZ2V0TmFtZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaGlkZGVuRmll bGQ7cmV0dXJuIGEmJmEubmFtZT9hLm5hbWU6dGhpcy5oaWRkZW5OYW1lfHxFeHQu Zm9ybS5Db21ib0JveC5zdXBlcmNsYXNzLmdldE5hbWUuY2FsbCh0aGlzKX0sZ2V0 VmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLnZhbHVlRmllbGQpe3JldHVybiBFeHQu aXNEZWZpbmVkKHRoaXMudmFsdWUpP3RoaXMudmFsdWU6IiJ9ZWxzZXtyZXR1cm4g RXh0LmZvcm0uQ29tYm9Cb3guc3VwZXJjbGFzcy5nZXRWYWx1ZS5jYWxsKHRoaXMp fX0sY2xlYXJWYWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMuaGlkZGVuRmllbGQpe3Ro aXMuaGlkZGVuRmllbGQudmFsdWU9IiJ9dGhpcy5zZXRSYXdWYWx1ZSgiIik7dGhp cy5sYXN0U2VsZWN0aW9uVGV4dD0iIjt0aGlzLmFwcGx5RW1wdHlUZXh0KCk7dGhp cy52YWx1ZT0iIn0sc2V0VmFsdWU6ZnVuY3Rpb24oYSl7dmFyIGM9YTtpZih0aGlz LnZhbHVlRmllbGQpe3ZhciBiPXRoaXMuZmluZFJlY29yZCh0aGlzLnZhbHVlRmll bGQsYSk7aWYoYil7Yz1iLmRhdGFbdGhpcy5kaXNwbGF5RmllbGRdfWVsc2V7aWYo RXh0LmlzRGVmaW5lZCh0aGlzLnZhbHVlTm90Rm91bmRUZXh0KSl7Yz10aGlzLnZh bHVlTm90Rm91bmRUZXh0fX19dGhpcy5sYXN0U2VsZWN0aW9uVGV4dD1jO2lmKHRo aXMuaGlkZGVuRmllbGQpe3RoaXMuaGlkZGVuRmllbGQudmFsdWU9RXh0LnZhbHVl KGEsIiIpfUV4dC5mb3JtLkNvbWJvQm94LnN1cGVyY2xhc3Muc2V0VmFsdWUuY2Fs bCh0aGlzLGMpO3RoaXMudmFsdWU9YTtyZXR1cm4gdGhpc30sZmluZFJlY29yZDpm dW5jdGlvbihjLGIpe3ZhciBhO2lmKHRoaXMuc3RvcmUuZ2V0Q291bnQoKT4wKXt0 aGlzLnN0b3JlLmVhY2goZnVuY3Rpb24oZCl7aWYoZC5kYXRhW2NdPT1iKXthPWQ7 cmV0dXJuIGZhbHNlfX0pfXJldHVybiBhfSxvblZpZXdNb3ZlOmZ1bmN0aW9uKGIs YSl7dGhpcy5pbktleU1vZGU9ZmFsc2V9LG9uVmlld092ZXI6ZnVuY3Rpb24oZCxi KXtpZih0aGlzLmluS2V5TW9kZSl7cmV0dXJufXZhciBjPXRoaXMudmlldy5maW5k SXRlbUZyb21DaGlsZChiKTtpZihjKXt2YXIgYT10aGlzLnZpZXcuaW5kZXhPZihj KTt0aGlzLnNlbGVjdChhLGZhbHNlKX19LG9uVmlld0NsaWNrOmZ1bmN0aW9uKGIp e3ZhciBhPXRoaXMudmlldy5nZXRTZWxlY3RlZEluZGV4ZXMoKVswXSxjPXRoaXMu c3RvcmUsZD1jLmdldEF0KGEpO2lmKGQpe3RoaXMub25TZWxlY3QoZCxhKX1lbHNl e3RoaXMuY29sbGFwc2UoKX1pZihiIT09ZmFsc2Upe3RoaXMuZWwuZm9jdXMoKX19 LHJlc3RyaWN0SGVpZ2h0OmZ1bmN0aW9uKCl7dGhpcy5pbm5lckxpc3QuZG9tLnN0 eWxlLmhlaWdodD0iIjt2YXIgYj10aGlzLmlubmVyTGlzdC5kb20sZT10aGlzLmxp c3QuZ2V0RnJhbWVXaWR0aCgidGIiKSsodGhpcy5yZXNpemFibGU/dGhpcy5oYW5k bGVIZWlnaHQ6MCkrdGhpcy5hc3NldEhlaWdodCxjPU1hdGgubWF4KGIuY2xpZW50 SGVpZ2h0LGIub2Zmc2V0SGVpZ2h0LGIuc2Nyb2xsSGVpZ2h0KSxhPXRoaXMuZ2V0 UG9zaXRpb24oKVsxXS1FeHQuZ2V0Qm9keSgpLmdldFNjcm9sbCgpLnRvcCxnPUV4 dC5saWIuRG9tLmdldFZpZXdIZWlnaHQoKS1hLXRoaXMuZ2V0U2l6ZSgpLmhlaWdo dCxkPU1hdGgubWF4KGEsZyx0aGlzLm1pbkhlaWdodHx8MCktdGhpcy5saXN0LnNo YWRvd09mZnNldC1lLTU7Yz1NYXRoLm1pbihjLGQsdGhpcy5tYXhIZWlnaHQpO3Ro aXMuaW5uZXJMaXN0LnNldEhlaWdodChjKTt0aGlzLmxpc3QuYmVnaW5VcGRhdGUo KTt0aGlzLmxpc3Quc2V0SGVpZ2h0KGMrZSk7dGhpcy5saXN0LmFsaWduVG8uYXBw bHkodGhpcy5saXN0LFt0aGlzLmVsXS5jb25jYXQodGhpcy5saXN0QWxpZ24pKTt0 aGlzLmxpc3QuZW5kVXBkYXRlKCl9LGlzRXhwYW5kZWQ6ZnVuY3Rpb24oKXtyZXR1 cm4gdGhpcy5saXN0JiZ0aGlzLmxpc3QuaXNWaXNpYmxlKCl9LHNlbGVjdEJ5VmFs dWU6ZnVuY3Rpb24oYSxjKXtpZighRXh0LmlzRW1wdHkoYSx0cnVlKSl7dmFyIGI9 dGhpcy5maW5kUmVjb3JkKHRoaXMudmFsdWVGaWVsZHx8dGhpcy5kaXNwbGF5Rmll bGQsYSk7aWYoYil7dGhpcy5zZWxlY3QodGhpcy5zdG9yZS5pbmRleE9mKGIpLGMp O3JldHVybiB0cnVlfX1yZXR1cm4gZmFsc2V9LHNlbGVjdDpmdW5jdGlvbihhLGMp e3RoaXMuc2VsZWN0ZWRJbmRleD1hO3RoaXMudmlldy5zZWxlY3QoYSk7aWYoYyE9 PWZhbHNlKXt2YXIgYj10aGlzLnZpZXcuZ2V0Tm9kZShhKTtpZihiKXt0aGlzLmlu bmVyTGlzdC5zY3JvbGxDaGlsZEludG9WaWV3KGIsZmFsc2UpfX19LHNlbGVjdE5l eHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnN0b3JlLmdldENvdW50KCk7aWYoYT4w KXtpZih0aGlzLnNlbGVjdGVkSW5kZXg9PS0xKXt0aGlzLnNlbGVjdCgwKX1lbHNl e2lmKHRoaXMuc2VsZWN0ZWRJbmRleDxhLTEpe3RoaXMuc2VsZWN0KHRoaXMuc2Vs ZWN0ZWRJbmRleCsxKX19fX0sc2VsZWN0UHJldjpmdW5jdGlvbigpe3ZhciBhPXRo aXMuc3RvcmUuZ2V0Q291bnQoKTtpZihhPjApe2lmKHRoaXMuc2VsZWN0ZWRJbmRl eD09LTEpe3RoaXMuc2VsZWN0KDApfWVsc2V7aWYodGhpcy5zZWxlY3RlZEluZGV4 IT09MCl7dGhpcy5zZWxlY3QodGhpcy5zZWxlY3RlZEluZGV4LTEpfX19fSxvbktl eVVwOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0S2V5KCk7aWYodGhpcy5lZGl0YWJs ZSE9PWZhbHNlJiZ0aGlzLnJlYWRPbmx5IT09dHJ1ZSYmKGE9PWIuQkFDS1NQQUNF fHwhYi5pc1NwZWNpYWxLZXkoKSkpe3RoaXMubGFzdEtleT1hO3RoaXMuZHFUYXNr LmRlbGF5KHRoaXMucXVlcnlEZWxheSl9RXh0LmZvcm0uQ29tYm9Cb3guc3VwZXJj bGFzcy5vbktleVVwLmNhbGwodGhpcyxiKX0sdmFsaWRhdGVCbHVyOmZ1bmN0aW9u KCl7cmV0dXJuICF0aGlzLmxpc3R8fCF0aGlzLmxpc3QuaXNWaXNpYmxlKCl9LGlu aXRRdWVyeTpmdW5jdGlvbigpe3RoaXMuZG9RdWVyeSh0aGlzLmdldFJhd1ZhbHVl KCkpfSxiZWZvcmVCbHVyOmZ1bmN0aW9uKCl7dGhpcy5hc3NlcnRWYWx1ZSgpfSxw b3N0Qmx1cjpmdW5jdGlvbigpe0V4dC5mb3JtLkNvbWJvQm94LnN1cGVyY2xhc3Mu cG9zdEJsdXIuY2FsbCh0aGlzKTt0aGlzLmNvbGxhcHNlKCk7dGhpcy5pbktleU1v ZGU9ZmFsc2V9LGRvUXVlcnk6ZnVuY3Rpb24oYyxiKXtjPUV4dC5pc0VtcHR5KGMp PyIiOmM7dmFyIGE9e3F1ZXJ5OmMsZm9yY2VBbGw6Yixjb21ibzp0aGlzLGNhbmNl bDpmYWxzZX07aWYodGhpcy5maXJlRXZlbnQoImJlZm9yZXF1ZXJ5IixhKT09PWZh bHNlfHxhLmNhbmNlbCl7cmV0dXJuIGZhbHNlfWM9YS5xdWVyeTtiPWEuZm9yY2VB bGw7aWYoYj09PXRydWV8fChjLmxlbmd0aD49dGhpcy5taW5DaGFycykpe2lmKHRo aXMubGFzdFF1ZXJ5IT09Yyl7dGhpcy5sYXN0UXVlcnk9YztpZih0aGlzLm1vZGU9 PSJsb2NhbCIpe3RoaXMuc2VsZWN0ZWRJbmRleD0tMTtpZihiKXt0aGlzLnN0b3Jl LmNsZWFyRmlsdGVyKCl9ZWxzZXt0aGlzLnN0b3JlLmZpbHRlcih0aGlzLmRpc3Bs YXlGaWVsZCxjKX10aGlzLm9uTG9hZCgpfWVsc2V7dGhpcy5zdG9yZS5iYXNlUGFy YW1zW3RoaXMucXVlcnlQYXJhbV09Yzt0aGlzLnN0b3JlLmxvYWQoe3BhcmFtczp0 aGlzLmdldFBhcmFtcyhjKX0pO3RoaXMuZXhwYW5kKCl9fWVsc2V7dGhpcy5zZWxl Y3RlZEluZGV4PS0xO3RoaXMub25Mb2FkKCl9fX0sZ2V0UGFyYW1zOmZ1bmN0aW9u KGEpe3ZhciBiPXt9LGM9dGhpcy5zdG9yZS5wYXJhbU5hbWVzO2lmKHRoaXMucGFn ZVNpemUpe2JbYy5zdGFydF09MDtiW2MubGltaXRdPXRoaXMucGFnZVNpemV9cmV0 dXJuIGJ9LGNvbGxhcHNlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNFeHBhbmRlZCgp KXtyZXR1cm59dGhpcy5saXN0LmhpZGUoKTtFeHQuZ2V0RG9jKCkudW4oIm1vdXNl d2hlZWwiLHRoaXMuY29sbGFwc2VJZix0aGlzKTtFeHQuZ2V0RG9jKCkudW4oIm1v dXNlZG93biIsdGhpcy5jb2xsYXBzZUlmLHRoaXMpO3RoaXMuZmlyZUV2ZW50KCJj b2xsYXBzZSIsdGhpcyl9LGNvbGxhcHNlSWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMu aXNEZXN0cm95ZWQmJiFhLndpdGhpbih0aGlzLndyYXApJiYhYS53aXRoaW4odGhp cy5saXN0KSl7dGhpcy5jb2xsYXBzZSgpfX0sZXhwYW5kOmZ1bmN0aW9uKCl7aWYo dGhpcy5pc0V4cGFuZGVkKCl8fCF0aGlzLmhhc0ZvY3VzKXtyZXR1cm59aWYodGhp cy50aXRsZXx8dGhpcy5wYWdlU2l6ZSl7dGhpcy5hc3NldEhlaWdodD0wO2lmKHRo aXMudGl0bGUpe3RoaXMuYXNzZXRIZWlnaHQrPXRoaXMuaGVhZGVyLmdldEhlaWdo dCgpfWlmKHRoaXMucGFnZVNpemUpe3RoaXMuYXNzZXRIZWlnaHQrPXRoaXMuZm9v dGVyLmdldEhlaWdodCgpfX1pZih0aGlzLmJ1ZmZlclNpemUpe3RoaXMuZG9SZXNp emUodGhpcy5idWZmZXJTaXplKTtkZWxldGUgdGhpcy5idWZmZXJTaXplfXRoaXMu bGlzdC5hbGlnblRvLmFwcGx5KHRoaXMubGlzdCxbdGhpcy5lbF0uY29uY2F0KHRo aXMubGlzdEFsaWduKSk7dGhpcy5saXN0LnNldFpJbmRleCh0aGlzLmdldFpJbmRl eCgpKTt0aGlzLmxpc3Quc2hvdygpO2lmKEV4dC5pc0dlY2tvMil7dGhpcy5pbm5l ckxpc3Quc2V0T3ZlcmZsb3coImF1dG8iKX10aGlzLm1vbihFeHQuZ2V0RG9jKCks e3Njb3BlOnRoaXMsbW91c2V3aGVlbDp0aGlzLmNvbGxhcHNlSWYsbW91c2Vkb3du OnRoaXMuY29sbGFwc2VJZn0pO3RoaXMuZmlyZUV2ZW50KCJleHBhbmQiLHRoaXMp fSxvblRyaWdnZXJDbGljazpmdW5jdGlvbigpe2lmKHRoaXMucmVhZE9ubHl8fHRo aXMuZGlzYWJsZWQpe3JldHVybn1pZih0aGlzLmlzRXhwYW5kZWQoKSl7dGhpcy5j b2xsYXBzZSgpO3RoaXMuZWwuZm9jdXMoKX1lbHNle3RoaXMub25Gb2N1cyh7fSk7 aWYodGhpcy50cmlnZ2VyQWN0aW9uPT0iYWxsIil7dGhpcy5kb1F1ZXJ5KHRoaXMu YWxsUXVlcnksdHJ1ZSl9ZWxzZXt0aGlzLmRvUXVlcnkodGhpcy5nZXRSYXdWYWx1 ZSgpKX10aGlzLmVsLmZvY3VzKCl9fX0pO0V4dC5yZWcoImNvbWJvIixFeHQuZm9y bS5Db21ib0JveCk7RXh0LmZvcm0uQ2hlY2tib3g9RXh0LmV4dGVuZChFeHQuZm9y bS5GaWVsZCx7Zm9jdXNDbGFzczp1bmRlZmluZWQsZmllbGRDbGFzczoieC1mb3Jt LWZpZWxkIixjaGVja2VkOmZhbHNlLGJveExhYmVsOiImIzE2MDsiLGRlZmF1bHRB dXRvQ3JlYXRlOnt0YWc6ImlucHV0Iix0eXBlOiJjaGVja2JveCIsYXV0b2NvbXBs ZXRlOiJvZmYifSxhY3Rpb25Nb2RlOiJ3cmFwIixpbml0Q29tcG9uZW50OmZ1bmN0 aW9uKCl7RXh0LmZvcm0uQ2hlY2tib3guc3VwZXJjbGFzcy5pbml0Q29tcG9uZW50 LmNhbGwodGhpcyk7dGhpcy5hZGRFdmVudHMoImNoZWNrIil9LG9uUmVzaXplOmZ1 bmN0aW9uKCl7RXh0LmZvcm0uQ2hlY2tib3guc3VwZXJjbGFzcy5vblJlc2l6ZS5h cHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMuYm94TGFiZWwmJiF0aGlzLmZp ZWxkTGFiZWwpe3RoaXMuZWwuYWxpZ25Ubyh0aGlzLndyYXAsImMtYyIpfX0saW5p dEV2ZW50czpmdW5jdGlvbigpe0V4dC5mb3JtLkNoZWNrYm94LnN1cGVyY2xhc3Mu aW5pdEV2ZW50cy5jYWxsKHRoaXMpO3RoaXMubW9uKHRoaXMuZWwse3Njb3BlOnRo aXMsY2xpY2s6dGhpcy5vbkNsaWNrLGNoYW5nZTp0aGlzLm9uQ2xpY2t9KX0sbWFy a0ludmFsaWQ6RXh0LmVtcHR5Rm4sY2xlYXJJbnZhbGlkOkV4dC5lbXB0eUZuLG9u UmVuZGVyOmZ1bmN0aW9uKGIsYSl7RXh0LmZvcm0uQ2hlY2tib3guc3VwZXJjbGFz cy5vblJlbmRlci5jYWxsKHRoaXMsYixhKTtpZih0aGlzLmlucHV0VmFsdWUhPT11 bmRlZmluZWQpe3RoaXMuZWwuZG9tLnZhbHVlPXRoaXMuaW5wdXRWYWx1ZX10aGlz LndyYXA9dGhpcy5lbC53cmFwKHtjbHM6IngtZm9ybS1jaGVjay13cmFwIn0pO2lm KHRoaXMuYm94TGFiZWwpe3RoaXMud3JhcC5jcmVhdGVDaGlsZCh7dGFnOiJsYWJl bCIsaHRtbEZvcjp0aGlzLmVsLmlkLGNsczoieC1mb3JtLWNiLWxhYmVsIixodG1s OnRoaXMuYm94TGFiZWx9KX1pZih0aGlzLmNoZWNrZWQpe3RoaXMuc2V0VmFsdWUo dHJ1ZSl9ZWxzZXt0aGlzLmNoZWNrZWQ9dGhpcy5lbC5kb20uY2hlY2tlZH1pZihF eHQuaXNJRSYmIUV4dC5pc1N0cmljdCl7dGhpcy53cmFwLnJlcGFpbnQoKX10aGlz LnJlc2l6ZUVsPXRoaXMucG9zaXRpb25FbD10aGlzLndyYXB9LG9uRGVzdHJveTpm dW5jdGlvbigpe0V4dC5kZXN0cm95KHRoaXMud3JhcCk7RXh0LmZvcm0uQ2hlY2ti b3guc3VwZXJjbGFzcy5vbkRlc3Ryb3kuY2FsbCh0aGlzKX0saW5pdFZhbHVlOmZ1 bmN0aW9uKCl7dGhpcy5vcmlnaW5hbFZhbHVlPXRoaXMuZ2V0VmFsdWUoKX0sZ2V0 VmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLnJlbmRlcmVkKXtyZXR1cm4gdGhpcy5l bC5kb20uY2hlY2tlZH1yZXR1cm4gdGhpcy5jaGVja2VkfSxvbkNsaWNrOmZ1bmN0 aW9uKCl7aWYodGhpcy5lbC5kb20uY2hlY2tlZCE9dGhpcy5jaGVja2VkKXt0aGlz LnNldFZhbHVlKHRoaXMuZWwuZG9tLmNoZWNrZWQpfX0sc2V0VmFsdWU6ZnVuY3Rp b24oYSl7dmFyIGM9dGhpcy5jaGVja2VkLGI9dGhpcy5pbnB1dFZhbHVlO2lmKGE9 PT1mYWxzZSl7dGhpcy5jaGVja2VkPWZhbHNlfWVsc2V7dGhpcy5jaGVja2VkPShh PT09dHJ1ZXx8YT09PSJ0cnVlInx8YT09IjEifHwoYj9hPT1iOlN0cmluZyhhKS50 b0xvd2VyQ2FzZSgpPT0ib24iKSl9aWYodGhpcy5yZW5kZXJlZCl7dGhpcy5lbC5k b20uY2hlY2tlZD10aGlzLmNoZWNrZWQ7dGhpcy5lbC5kb20uZGVmYXVsdENoZWNr ZWQ9dGhpcy5jaGVja2VkfWlmKGMhPXRoaXMuY2hlY2tlZCl7dGhpcy5maXJlRXZl bnQoImNoZWNrIix0aGlzLHRoaXMuY2hlY2tlZCk7aWYodGhpcy5oYW5kbGVyKXt0 aGlzLmhhbmRsZXIuY2FsbCh0aGlzLnNjb3BlfHx0aGlzLHRoaXMsdGhpcy5jaGVj a2VkKX19cmV0dXJuIHRoaXN9fSk7RXh0LnJlZygiY2hlY2tib3giLEV4dC5mb3Jt LkNoZWNrYm94KTtFeHQuZm9ybS5DaGVja2JveEdyb3VwPUV4dC5leHRlbmQoRXh0 LmZvcm0uRmllbGQse2NvbHVtbnM6ImF1dG8iLHZlcnRpY2FsOmZhbHNlLGFsbG93 Qmxhbms6dHJ1ZSxibGFua1RleHQ6IllvdSBtdXN0IHNlbGVjdCBhdCBsZWFzdCBv bmUgaXRlbSBpbiB0aGlzIGdyb3VwIixkZWZhdWx0VHlwZToiY2hlY2tib3giLGdy b3VwQ2xzOiJ4LWZvcm0tY2hlY2stZ3JvdXAiLGluaXRDb21wb25lbnQ6ZnVuY3Rp b24oKXt0aGlzLmFkZEV2ZW50cygiY2hhbmdlIik7dGhpcy5vbigiY2hhbmdlIix0 aGlzLnZhbGlkYXRlLHRoaXMpO0V4dC5mb3JtLkNoZWNrYm94R3JvdXAuc3VwZXJj bGFzcy5pbml0Q29tcG9uZW50LmNhbGwodGhpcyl9LG9uUmVuZGVyOmZ1bmN0aW9u KGosZyl7aWYoIXRoaXMuZWwpe3ZhciBwPXthdXRvRWw6e2lkOnRoaXMuaWR9LGNs czp0aGlzLmdyb3VwQ2xzLGxheW91dDoiY29sdW1uIixyZW5kZXJUbzpqLGJ1ZmZl clJlc2l6ZTpmYWxzZX07dmFyIGE9e3h0eXBlOiJjb250YWluZXIiLGRlZmF1bHRU eXBlOnRoaXMuZGVmYXVsdFR5cGUsbGF5b3V0OiJmb3JtIixkZWZhdWx0czp7aGlk ZUxhYmVsOnRydWUsYW5jaG9yOiIxMDAlIn19O2lmKHRoaXMuaXRlbXNbMF0uaXRl bXMpe0V4dC5hcHBseShwLHtsYXlvdXRDb25maWc6e2NvbHVtbnM6dGhpcy5pdGVt cy5sZW5ndGh9LGRlZmF1bHRzOnRoaXMuZGVmYXVsdHMsaXRlbXM6dGhpcy5pdGVt c30pO2Zvcih2YXIgZT0wLG09dGhpcy5pdGVtcy5sZW5ndGg7ZTxtO2UrKyl7RXh0 LmFwcGx5SWYodGhpcy5pdGVtc1tlXSxhKX19ZWxzZXt2YXIgZCxuPVtdO2lmKHR5 cGVvZiB0aGlzLmNvbHVtbnM9PSJzdHJpbmciKXt0aGlzLmNvbHVtbnM9dGhpcy5p dGVtcy5sZW5ndGh9aWYoIUV4dC5pc0FycmF5KHRoaXMuY29sdW1ucykpe3ZhciBr PVtdO2Zvcih2YXIgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl7ay5wdXNoKCgxMDAv dGhpcy5jb2x1bW5zKSowLjAxKX10aGlzLmNvbHVtbnM9a31kPXRoaXMuY29sdW1u cy5sZW5ndGg7Zm9yKHZhciBlPTA7ZTxkO2UrKyl7dmFyIGI9RXh0LmFwcGx5KHtp dGVtczpbXX0sYSk7Ylt0aGlzLmNvbHVtbnNbZV08PTE/ImNvbHVtbldpZHRoIjoi d2lkdGgiXT10aGlzLmNvbHVtbnNbZV07aWYodGhpcy5kZWZhdWx0cyl7Yi5kZWZh dWx0cz1FeHQuYXBwbHkoYi5kZWZhdWx0c3x8e30sdGhpcy5kZWZhdWx0cyl9bi5w dXNoKGIpfWlmKHRoaXMudmVydGljYWwpe3ZhciByPU1hdGguY2VpbCh0aGlzLml0 ZW1zLmxlbmd0aC9kKSxvPTA7Zm9yKHZhciBlPTAsbT10aGlzLml0ZW1zLmxlbmd0 aDtlPG07ZSsrKXtpZihlPjAmJmUlcj09MCl7bysrfWlmKHRoaXMuaXRlbXNbZV0u ZmllbGRMYWJlbCl7dGhpcy5pdGVtc1tlXS5oaWRlTGFiZWw9ZmFsc2V9bltvXS5p dGVtcy5wdXNoKHRoaXMuaXRlbXNbZV0pfX1lbHNle2Zvcih2YXIgZT0wLG09dGhp cy5pdGVtcy5sZW5ndGg7ZTxtO2UrKyl7dmFyIHE9ZSVkO2lmKHRoaXMuaXRlbXNb ZV0uZmllbGRMYWJlbCl7dGhpcy5pdGVtc1tlXS5oaWRlTGFiZWw9ZmFsc2V9bltx XS5pdGVtcy5wdXNoKHRoaXMuaXRlbXNbZV0pfX1FeHQuYXBwbHkocCx7bGF5b3V0 Q29uZmlnOntjb2x1bW5zOmR9LGl0ZW1zOm59KX10aGlzLnBhbmVsPW5ldyBFeHQu Q29udGFpbmVyKHApO3RoaXMucGFuZWwub3duZXJDdD10aGlzO3RoaXMuZWw9dGhp cy5wYW5lbC5nZXRFbCgpO2lmKHRoaXMuZm9ySWQmJnRoaXMuaXRlbUNscyl7dmFy IGM9dGhpcy5lbC51cCh0aGlzLml0ZW1DbHMpLmNoaWxkKCJsYWJlbCIsdHJ1ZSk7 aWYoYyl7Yy5zZXRBdHRyaWJ1dGUoImh0bWxGb3IiLHRoaXMuZm9ySWQpfX12YXIg aD10aGlzLnBhbmVsLmZpbmRCeShmdW5jdGlvbihpKXtyZXR1cm4gaS5pc0Zvcm1G aWVsZH0sdGhpcyk7dGhpcy5pdGVtcz1uZXcgRXh0LnV0aWwuTWl4ZWRDb2xsZWN0 aW9uKCk7dGhpcy5pdGVtcy5hZGRBbGwoaCl9RXh0LmZvcm0uQ2hlY2tib3hHcm91 cC5zdXBlcmNsYXNzLm9uUmVuZGVyLmNhbGwodGhpcyxqLGcpfSxpbml0VmFsdWU6 ZnVuY3Rpb24oKXtpZih0aGlzLnZhbHVlKXt0aGlzLnNldFZhbHVlLmFwcGx5KHRo aXMsdGhpcy5idWZmZXJlZD90aGlzLnZhbHVlOlt0aGlzLnZhbHVlXSk7ZGVsZXRl IHRoaXMuYnVmZmVyZWQ7ZGVsZXRlIHRoaXMudmFsdWV9fSxhZnRlclJlbmRlcjpm dW5jdGlvbigpe0V4dC5mb3JtLkNoZWNrYm94R3JvdXAuc3VwZXJjbGFzcy5hZnRl clJlbmRlci5jYWxsKHRoaXMpO3RoaXMuZWFjaEl0ZW0oZnVuY3Rpb24oYSl7YS5v bigiY2hlY2siLHRoaXMuZmlyZUNoZWNrZWQsdGhpcyk7YS5pbkdyb3VwPXRydWV9 KX0sZG9MYXlvdXQ6ZnVuY3Rpb24oKXtpZih0aGlzLnJlbmRlcmVkKXt0aGlzLnBh bmVsLmZvcmNlTGF5b3V0PXRoaXMub3duZXJDdC5mb3JjZUxheW91dDt0aGlzLnBh bmVsLmRvTGF5b3V0KCl9fSxmaXJlQ2hlY2tlZDpmdW5jdGlvbigpe3ZhciBhPVtd O3RoaXMuZWFjaEl0ZW0oZnVuY3Rpb24oYil7aWYoYi5jaGVja2VkKXthLnB1c2go Yil9fSk7dGhpcy5maXJlRXZlbnQoImNoYW5nZSIsdGhpcyxhKX0sZ2V0RXJyb3Jz OmZ1bmN0aW9uKCl7dmFyIGI9RXh0LmZvcm0uQ2hlY2tib3hHcm91cC5zdXBlcmNs YXNzLmdldEVycm9ycy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMuYWxs b3dCbGFuayl7dmFyIGE9dHJ1ZTt0aGlzLmVhY2hJdGVtKGZ1bmN0aW9uKGMpe2lm KGMuY2hlY2tlZCl7cmV0dXJuKGE9ZmFsc2UpfX0pO2lmKGEpe2IucHVzaCh0aGlz LmJsYW5rVGV4dCl9fXJldHVybiBifSxpc0RpcnR5OmZ1bmN0aW9uKCl7aWYodGhp cy5kaXNhYmxlZHx8IXRoaXMucmVuZGVyZWQpe3JldHVybiBmYWxzZX12YXIgYT1m YWxzZTt0aGlzLmVhY2hJdGVtKGZ1bmN0aW9uKGIpe2lmKGIuaXNEaXJ0eSgpKXth PXRydWU7cmV0dXJuIGZhbHNlfX0pO3JldHVybiBhfSxzZXRSZWFkT25seTpmdW5j dGlvbihhKXtpZih0aGlzLnJlbmRlcmVkKXt0aGlzLmVhY2hJdGVtKGZ1bmN0aW9u KGIpe2Iuc2V0UmVhZE9ubHkoYSl9KX10aGlzLnJlYWRPbmx5PWF9LG9uRGlzYWJs ZTpmdW5jdGlvbigpe3RoaXMuZWFjaEl0ZW0oZnVuY3Rpb24oYSl7YS5kaXNhYmxl KCl9KX0sb25FbmFibGU6ZnVuY3Rpb24oKXt0aGlzLmVhY2hJdGVtKGZ1bmN0aW9u KGEpe2EuZW5hYmxlKCl9KX0sb25SZXNpemU6ZnVuY3Rpb24oYSxiKXt0aGlzLnBh bmVsLnNldFNpemUoYSxiKTt0aGlzLnBhbmVsLmRvTGF5b3V0KCl9LHJlc2V0OmZ1 bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbFZhbHVlKXt0aGlzLmVhY2hJdGVtKGZ1 bmN0aW9uKGEpe2lmKGEuc2V0VmFsdWUpe2Euc2V0VmFsdWUoZmFsc2UpO2Eub3Jp Z2luYWxWYWx1ZT1hLmdldFZhbHVlKCl9fSk7dGhpcy5yZXNldE9yaWdpbmFsPXRy dWU7dGhpcy5zZXRWYWx1ZSh0aGlzLm9yaWdpbmFsVmFsdWUpO2RlbGV0ZSB0aGlz LnJlc2V0T3JpZ2luYWx9ZWxzZXt0aGlzLmVhY2hJdGVtKGZ1bmN0aW9uKGEpe2lm KGEucmVzZXQpe2EucmVzZXQoKX19KX0oZnVuY3Rpb24oKXt0aGlzLmNsZWFySW52 YWxpZCgpfSkuZGVmZXIoNTAsdGhpcyl9LHNldFZhbHVlOmZ1bmN0aW9uKCl7aWYo dGhpcy5yZW5kZXJlZCl7dGhpcy5vblNldFZhbHVlLmFwcGx5KHRoaXMsYXJndW1l bnRzKX1lbHNle3RoaXMuYnVmZmVyZWQ9dHJ1ZTt0aGlzLnZhbHVlPWFyZ3VtZW50 c31yZXR1cm4gdGhpc30sb25TZXRWYWx1ZTpmdW5jdGlvbihkLGMpe2lmKGFyZ3Vt ZW50cy5sZW5ndGg9PTEpe2lmKEV4dC5pc0FycmF5KGQpKXtFeHQuZWFjaChkLGZ1 bmN0aW9uKGgsZSl7aWYoRXh0LmlzT2JqZWN0KGgpJiZoLnNldFZhbHVlKXtoLnNl dFZhbHVlKHRydWUpO2lmKHRoaXMucmVzZXRPcmlnaW5hbD09PXRydWUpe2gub3Jp Z2luYWxWYWx1ZT1oLmdldFZhbHVlKCl9fWVsc2V7dmFyIGc9dGhpcy5pdGVtcy5p dGVtQXQoZSk7aWYoZyl7Zy5zZXRWYWx1ZShoKX19fSx0aGlzKX1lbHNle2lmKEV4 dC5pc09iamVjdChkKSl7Zm9yKHZhciBhIGluIGQpe3ZhciBiPXRoaXMuZ2V0Qm94 KGEpO2lmKGIpe2Iuc2V0VmFsdWUoZFthXSl9fX1lbHNle3RoaXMuc2V0VmFsdWVG b3JJdGVtKGQpfX19ZWxzZXt2YXIgYj10aGlzLmdldEJveChkKTtpZihiKXtiLnNl dFZhbHVlKGMpfX19LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXtFeHQuZGVzdHJv eSh0aGlzLnBhbmVsKTtpZighdGhpcy5yZW5kZXJlZCl7RXh0LmRlc3Ryb3kodGhp cy5pdGVtcyl9RXh0LmZvcm0uQ2hlY2tib3hHcm91cC5zdXBlcmNsYXNzLmJlZm9y ZURlc3Ryb3kuY2FsbCh0aGlzKX0sc2V0VmFsdWVGb3JJdGVtOmZ1bmN0aW9uKGEp e2E9U3RyaW5nKGEpLnNwbGl0KCIsIik7dGhpcy5lYWNoSXRlbShmdW5jdGlvbihi KXtpZihhLmluZGV4T2YoYi5pbnB1dFZhbHVlKT4tMSl7Yi5zZXRWYWx1ZSh0cnVl KX19KX0sZ2V0Qm94OmZ1bmN0aW9uKGIpe3ZhciBhPW51bGw7dGhpcy5lYWNoSXRl bShmdW5jdGlvbihjKXtpZihiPT1jfHxjLmRhdGFJbmRleD09Ynx8Yy5pZD09Ynx8 Yy5nZXROYW1lKCk9PWIpe2E9YztyZXR1cm4gZmFsc2V9fSk7cmV0dXJuIGF9LGdl dFZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9W107dGhpcy5lYWNoSXRlbShmdW5jdGlv bihiKXtpZihiLmNoZWNrZWQpe2EucHVzaChiKX19KTtyZXR1cm4gYX0sZWFjaEl0 ZW06ZnVuY3Rpb24oYixhKXtpZih0aGlzLml0ZW1zJiZ0aGlzLml0ZW1zLmVhY2gp e3RoaXMuaXRlbXMuZWFjaChiLGF8fHRoaXMpfX0sZ2V0UmF3VmFsdWU6RXh0LmVt cHR5Rm4sc2V0UmF3VmFsdWU6RXh0LmVtcHR5Rm59KTtFeHQucmVnKCJjaGVja2Jv eGdyb3VwIixFeHQuZm9ybS5DaGVja2JveEdyb3VwKTtFeHQuZm9ybS5Db21wb3Np dGVGaWVsZD1FeHQuZXh0ZW5kKEV4dC5mb3JtLkZpZWxkLHtkZWZhdWx0TWFyZ2lu czoiMCA1IDAgMCIsc2tpcExhc3RJdGVtTWFyZ2luOnRydWUsaXNDb21wb3NpdGU6 dHJ1ZSxjb21iaW5lRXJyb3JzOnRydWUsbGFiZWxDb25uZWN0b3I6IiwgIixpbml0 Q29tcG9uZW50OmZ1bmN0aW9uKCl7dmFyIGc9W10sYj10aGlzLml0ZW1zLGU7Zm9y KHZhciBkPTAsYz1iLmxlbmd0aDtkPGM7ZCsrKXtlPWJbZF07aWYoIUV4dC5pc0Vt cHR5KGUucmVmKSl7ZS5yZWY9Ii4uLyIrZS5yZWZ9Zy5wdXNoKGUuZmllbGRMYWJl bCk7RXh0LmFwcGx5SWYoZSx0aGlzLmRlZmF1bHRzKTtpZighKGQ9PWMtMSYmdGhp cy5za2lwTGFzdEl0ZW1NYXJnaW4pKXtFeHQuYXBwbHlJZihlLHttYXJnaW5zOnRo aXMuZGVmYXVsdE1hcmdpbnN9KX19dGhpcy5maWVsZExhYmVsPXRoaXMuZmllbGRM YWJlbHx8dGhpcy5idWlsZExhYmVsKGcpO3RoaXMuZmllbGRFcnJvcnM9bmV3IEV4 dC51dGlsLk1peGVkQ29sbGVjdGlvbih0cnVlLGZ1bmN0aW9uKGgpe3JldHVybiBo LmZpZWxkfSk7dGhpcy5maWVsZEVycm9ycy5vbih7c2NvcGU6dGhpcyxhZGQ6dGhp cy51cGRhdGVJbnZhbGlkTWFyayxyZW1vdmU6dGhpcy51cGRhdGVJbnZhbGlkTWFy ayxyZXBsYWNlOnRoaXMudXBkYXRlSW52YWxpZE1hcmt9KTtFeHQuZm9ybS5Db21w b3NpdGVGaWVsZC5zdXBlcmNsYXNzLmluaXRDb21wb25lbnQuYXBwbHkodGhpcyxh cmd1bWVudHMpO3RoaXMuaW5uZXJDdD1uZXcgRXh0LkNvbnRhaW5lcih7bGF5b3V0 OiJoYm94IixpdGVtczp0aGlzLml0ZW1zLGNsczoieC1mb3JtLWNvbXBvc2l0ZSIs ZGVmYXVsdE1hcmdpbnM6IjAgMyAwIDAiLG93bmVyQ3Q6dGhpc30pO3RoaXMuaW5u ZXJDdC5vd25lckN0PXVuZGVmaW5lZDt2YXIgYT10aGlzLmlubmVyQ3QuZmluZEJ5 KGZ1bmN0aW9uKGgpe3JldHVybiBoLmlzRm9ybUZpZWxkfSx0aGlzKTt0aGlzLml0 ZW1zPW5ldyBFeHQudXRpbC5NaXhlZENvbGxlY3Rpb24oKTt0aGlzLml0ZW1zLmFk ZEFsbChhKX0sb25SZW5kZXI6ZnVuY3Rpb24oYyxhKXtpZighdGhpcy5lbCl7dmFy IGQ9dGhpcy5pbm5lckN0O2QucmVuZGVyKGMpO3RoaXMuZWw9ZC5nZXRFbCgpO2lm KHRoaXMuY29tYmluZUVycm9ycyl7dGhpcy5lYWNoSXRlbShmdW5jdGlvbihlKXtF eHQuYXBwbHkoZSx7bWFya0ludmFsaWQ6dGhpcy5vbkZpZWxkTWFya0ludmFsaWQu Y3JlYXRlRGVsZWdhdGUodGhpcyxbZV0sMCksY2xlYXJJbnZhbGlkOnRoaXMub25G aWVsZENsZWFySW52YWxpZC5jcmVhdGVEZWxlZ2F0ZSh0aGlzLFtlXSwwKX0pfSl9 dmFyIGI9dGhpcy5lbC5wYXJlbnQoKS5wYXJlbnQoKS5jaGlsZCgibGFiZWwiLHRy dWUpO2lmKGIpe2Iuc2V0QXR0cmlidXRlKCJmb3IiLHRoaXMuaXRlbXMuaXRlbXNb MF0uaWQpfX1FeHQuZm9ybS5Db21wb3NpdGVGaWVsZC5zdXBlcmNsYXNzLm9uUmVu ZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sb25GaWVsZE1hcmtJbnZhbGlkOmZ1 bmN0aW9uKGQsYyl7dmFyIGI9ZC5nZXROYW1lKCksYT17ZmllbGQ6YixlcnJvck5h bWU6ZC5maWVsZExhYmVsfHxiLGVycm9yOmN9O3RoaXMuZmllbGRFcnJvcnMucmVw bGFjZShiLGEpO2lmKCFkLnByZXZlbnRNYXJrKXtkLmVsLmFkZENsYXNzKGQuaW52 YWxpZENsYXNzKX19LG9uRmllbGRDbGVhckludmFsaWQ6ZnVuY3Rpb24oYSl7dGhp cy5maWVsZEVycm9ycy5yZW1vdmVLZXkoYS5nZXROYW1lKCkpO2EuZWwucmVtb3Zl Q2xhc3MoYS5pbnZhbGlkQ2xhc3MpfSx1cGRhdGVJbnZhbGlkTWFyazpmdW5jdGlv bigpe3ZhciBhPUV4dC5pc0lFNiYmRXh0LmlzU3RyaWN0O2lmKHRoaXMuZmllbGRF cnJvcnMubGVuZ3RoPT0wKXt0aGlzLmNsZWFySW52YWxpZCgpO2lmKGEpe3RoaXMu Y2xlYXJJbnZhbGlkLmRlZmVyKDUwLHRoaXMpfX1lbHNle3ZhciBiPXRoaXMuYnVp bGRDb21iaW5lZEVycm9yTWVzc2FnZSh0aGlzLmZpZWxkRXJyb3JzLml0ZW1zKTt0 aGlzLnNvcnRFcnJvcnMoKTt0aGlzLm1hcmtJbnZhbGlkKGIpO2lmKGEpe3RoaXMu bWFya0ludmFsaWQoYil9fX0sdmFsaWRhdGVWYWx1ZTpmdW5jdGlvbihjLGEpe3Zh ciBiPXRydWU7dGhpcy5lYWNoSXRlbShmdW5jdGlvbihkKXtpZighZC5pc1ZhbGlk KGEpKXtiPWZhbHNlfX0pO3JldHVybiBifSxidWlsZENvbWJpbmVkRXJyb3JNZXNz YWdlOmZ1bmN0aW9uKGUpe3ZhciBkPVtdLGI7Zm9yKHZhciBjPTAsYT1lLmxlbmd0 aDtjPGE7YysrKXtiPWVbY107ZC5wdXNoKFN0cmluZy5mb3JtYXQoInswfTogezF9 IixiLmVycm9yTmFtZSxiLmVycm9yKSl9cmV0dXJuIGQuam9pbigiPGJyIC8+Iil9 LHNvcnRFcnJvcnM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLml0ZW1zO3RoaXMuZmll bGRFcnJvcnMuc29ydCgiQVNDIixmdW5jdGlvbihnLGQpe3ZhciBjPWZ1bmN0aW9u KGIpe3JldHVybiBmdW5jdGlvbihpKXtyZXR1cm4gaS5nZXROYW1lKCk9PWJ9fTt2 YXIgaD1hLmZpbmRJbmRleEJ5KGMoZy5maWVsZCkpLGU9YS5maW5kSW5kZXhCeShj KGQuZmllbGQpKTtyZXR1cm4gaDxlPy0xOjF9KX0scmVzZXQ6ZnVuY3Rpb24oKXt0 aGlzLmVhY2hJdGVtKGZ1bmN0aW9uKGEpe2EucmVzZXQoKX0pOyhmdW5jdGlvbigp e3RoaXMuY2xlYXJJbnZhbGlkKCl9KS5kZWZlcig1MCx0aGlzKX0sY2xlYXJJbnZh bGlkQ2hpbGRyZW46ZnVuY3Rpb24oKXt0aGlzLmVhY2hJdGVtKGZ1bmN0aW9uKGEp e2EuY2xlYXJJbnZhbGlkKCl9KX0sYnVpbGRMYWJlbDpmdW5jdGlvbihhKXtyZXR1 cm4gRXh0LmNsZWFuKGEpLmpvaW4odGhpcy5sYWJlbENvbm5lY3Rvcil9LGlzRGly dHk6ZnVuY3Rpb24oKXtpZih0aGlzLmRpc2FibGVkfHwhdGhpcy5yZW5kZXJlZCl7 cmV0dXJuIGZhbHNlfXZhciBhPWZhbHNlO3RoaXMuZWFjaEl0ZW0oZnVuY3Rpb24o Yil7aWYoYi5pc0RpcnR5KCkpe2E9dHJ1ZTtyZXR1cm4gZmFsc2V9fSk7cmV0dXJu IGF9LGVhY2hJdGVtOmZ1bmN0aW9uKGIsYSl7aWYodGhpcy5pdGVtcyYmdGhpcy5p dGVtcy5lYWNoKXt0aGlzLml0ZW1zLmVhY2goYixhfHx0aGlzKX19LG9uUmVzaXpl OmZ1bmN0aW9uKGUsYyxhLGQpe3ZhciBiPXRoaXMuaW5uZXJDdDtpZih0aGlzLnJl bmRlcmVkJiZiLnJlbmRlcmVkKXtiLnNldFNpemUoZSxjKX1FeHQuZm9ybS5Db21w b3NpdGVGaWVsZC5zdXBlcmNsYXNzLm9uUmVzaXplLmFwcGx5KHRoaXMsYXJndW1l bnRzKX0sZG9MYXlvdXQ6ZnVuY3Rpb24oYyxiKXtpZih0aGlzLnJlbmRlcmVkKXt2 YXIgYT10aGlzLmlubmVyQ3Q7YS5mb3JjZUxheW91dD10aGlzLm93bmVyQ3QuZm9y Y2VMYXlvdXQ7YS5kb0xheW91dChjLGIpfX0sYmVmb3JlRGVzdHJveTpmdW5jdGlv bigpe0V4dC5kZXN0cm95KHRoaXMuaW5uZXJDdCk7RXh0LmZvcm0uQ29tcG9zaXRl RmllbGQuc3VwZXJjbGFzcy5iZWZvcmVEZXN0cm95LmNhbGwodGhpcyl9LHNldFJl YWRPbmx5OmZ1bmN0aW9uKGEpe2lmKGE9PXVuZGVmaW5lZCl7YT10cnVlfWE9ISFh O2lmKHRoaXMucmVuZGVyZWQpe3RoaXMuZWFjaEl0ZW0oZnVuY3Rpb24oYil7Yi5z ZXRSZWFkT25seShhKX0pfXRoaXMucmVhZE9ubHk9YX0sb25TaG93OmZ1bmN0aW9u KCl7RXh0LmZvcm0uQ29tcG9zaXRlRmllbGQuc3VwZXJjbGFzcy5vblNob3cuY2Fs bCh0aGlzKTt0aGlzLmRvTGF5b3V0KCl9LG9uRGlzYWJsZTpmdW5jdGlvbigpe3Ro aXMuZWFjaEl0ZW0oZnVuY3Rpb24oYSl7YS5kaXNhYmxlKCl9KX0sb25FbmFibGU6 ZnVuY3Rpb24oKXt0aGlzLmVhY2hJdGVtKGZ1bmN0aW9uKGEpe2EuZW5hYmxlKCl9 KX19KTtFeHQucmVnKCJjb21wb3NpdGVmaWVsZCIsRXh0LmZvcm0uQ29tcG9zaXRl RmllbGQpO0V4dC5mb3JtLlJhZGlvPUV4dC5leHRlbmQoRXh0LmZvcm0uQ2hlY2ti b3gse2lucHV0VHlwZToicmFkaW8iLG1hcmtJbnZhbGlkOkV4dC5lbXB0eUZuLGNs ZWFySW52YWxpZDpFeHQuZW1wdHlGbixnZXRHcm91cFZhbHVlOmZ1bmN0aW9uKCl7 dmFyIGE9dGhpcy5lbC51cCgiZm9ybSIpfHxFeHQuZ2V0Qm9keSgpO3ZhciBiPWEu Y2hpbGQoJ2lucHV0W25hbWU9IicrdGhpcy5lbC5kb20ubmFtZSsnIl06Y2hlY2tl ZCcsdHJ1ZSk7cmV0dXJuIGI/Yi52YWx1ZTpudWxsfSxzZXRWYWx1ZTpmdW5jdGlv bihiKXt2YXIgYSxkLGM7aWYodHlwZW9mIGI9PSJib29sZWFuIil7RXh0LmZvcm0u UmFkaW8uc3VwZXJjbGFzcy5zZXRWYWx1ZS5jYWxsKHRoaXMsYil9ZWxzZXtpZih0 aGlzLnJlbmRlcmVkKXthPXRoaXMuZ2V0Q2hlY2tFbCgpO2M9YS5jaGlsZCgnaW5w dXRbbmFtZT0iJyt0aGlzLmVsLmRvbS5uYW1lKyciXVt2YWx1ZT0iJytiKyciXScs dHJ1ZSk7aWYoYyl7RXh0LmdldENtcChjLmlkKS5zZXRWYWx1ZSh0cnVlKX19fWlm KHRoaXMucmVuZGVyZWQmJnRoaXMuY2hlY2tlZCl7YT1hfHx0aGlzLmdldENoZWNr RWwoKTtkPXRoaXMuZ2V0Q2hlY2tFbCgpLnNlbGVjdCgnaW5wdXRbbmFtZT0iJyt0 aGlzLmVsLmRvbS5uYW1lKyciXScpO2QuZWFjaChmdW5jdGlvbihlKXtpZihlLmRv bS5pZCE9dGhpcy5pZCl7RXh0LmdldENtcChlLmRvbS5pZCkuc2V0VmFsdWUoZmFs c2UpfX0sdGhpcyl9cmV0dXJuIHRoaXN9LGdldENoZWNrRWw6ZnVuY3Rpb24oKXtp Zih0aGlzLmluR3JvdXApe3JldHVybiB0aGlzLmVsLnVwKCIueC1mb3JtLXJhZGlv LWdyb3VwIil9cmV0dXJuIHRoaXMuZWwudXAoImZvcm0iKXx8RXh0LmdldEJvZHko KX19KTtFeHQucmVnKCJyYWRpbyIsRXh0LmZvcm0uUmFkaW8pO0V4dC5mb3JtLlJh ZGlvR3JvdXA9RXh0LmV4dGVuZChFeHQuZm9ybS5DaGVja2JveEdyb3VwLHthbGxv d0JsYW5rOnRydWUsYmxhbmtUZXh0OiJZb3UgbXVzdCBzZWxlY3Qgb25lIGl0ZW0g aW4gdGhpcyBncm91cCIsZGVmYXVsdFR5cGU6InJhZGlvIixncm91cENsczoieC1m b3JtLXJhZGlvLWdyb3VwIixnZXRWYWx1ZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7 dGhpcy5lYWNoSXRlbShmdW5jdGlvbihiKXtpZihiLmNoZWNrZWQpe2E9YjtyZXR1 cm4gZmFsc2V9fSk7cmV0dXJuIGF9LG9uU2V0VmFsdWU6ZnVuY3Rpb24oYyxiKXtp Zihhcmd1bWVudHMubGVuZ3RoPjEpe3ZhciBhPXRoaXMuZ2V0Qm94KGMpO2lmKGEp e2Euc2V0VmFsdWUoYik7aWYoYS5jaGVja2VkKXt0aGlzLmVhY2hJdGVtKGZ1bmN0 aW9uKGQpe2lmKGQhPT1hKXtkLnNldFZhbHVlKGZhbHNlKX19KX19fWVsc2V7dGhp cy5zZXRWYWx1ZUZvckl0ZW0oYyl9fSxzZXRWYWx1ZUZvckl0ZW06ZnVuY3Rpb24o YSl7YT1TdHJpbmcoYSkuc3BsaXQoIiwiKVswXTt0aGlzLmVhY2hJdGVtKGZ1bmN0 aW9uKGIpe2Iuc2V0VmFsdWUoYT09Yi5pbnB1dFZhbHVlKX0pfSxmaXJlQ2hlY2tl ZDpmdW5jdGlvbigpe2lmKCF0aGlzLmNoZWNrVGFzayl7dGhpcy5jaGVja1Rhc2s9 bmV3IEV4dC51dGlsLkRlbGF5ZWRUYXNrKHRoaXMuYnVmZmVyQ2hlY2tlZCx0aGlz KX10aGlzLmNoZWNrVGFzay5kZWxheSgxMCl9LGJ1ZmZlckNoZWNrZWQ6ZnVuY3Rp b24oKXt2YXIgYT1udWxsO3RoaXMuZWFjaEl0ZW0oZnVuY3Rpb24oYil7aWYoYi5j aGVja2VkKXthPWI7cmV0dXJuIGZhbHNlfX0pO3RoaXMuZmlyZUV2ZW50KCJjaGFu Z2UiLHRoaXMsYSl9LG9uRGVzdHJveTpmdW5jdGlvbigpe2lmKHRoaXMuY2hlY2tU YXNrKXt0aGlzLmNoZWNrVGFzay5jYW5jZWwoKTt0aGlzLmNoZWNrVGFzaz1udWxs fUV4dC5mb3JtLlJhZGlvR3JvdXAuc3VwZXJjbGFzcy5vbkRlc3Ryb3kuY2FsbCh0 aGlzKX19KTtFeHQucmVnKCJyYWRpb2dyb3VwIixFeHQuZm9ybS5SYWRpb0dyb3Vw KTtFeHQuZm9ybS5IaWRkZW49RXh0LmV4dGVuZChFeHQuZm9ybS5GaWVsZCx7aW5w dXRUeXBlOiJoaWRkZW4iLHNob3VsZExheW91dDpmYWxzZSxvblJlbmRlcjpmdW5j dGlvbigpe0V4dC5mb3JtLkhpZGRlbi5zdXBlcmNsYXNzLm9uUmVuZGVyLmFwcGx5 KHRoaXMsYXJndW1lbnRzKX0saW5pdEV2ZW50czpmdW5jdGlvbigpe3RoaXMub3Jp Z2luYWxWYWx1ZT10aGlzLmdldFZhbHVlKCl9LHNldFNpemU6RXh0LmVtcHR5Rm4s c2V0V2lkdGg6RXh0LmVtcHR5Rm4sc2V0SGVpZ2h0OkV4dC5lbXB0eUZuLHNldFBv c2l0aW9uOkV4dC5lbXB0eUZuLHNldFBhZ2VQb3NpdGlvbjpFeHQuZW1wdHlGbixt YXJrSW52YWxpZDpFeHQuZW1wdHlGbixjbGVhckludmFsaWQ6RXh0LmVtcHR5Rm59 KTtFeHQucmVnKCJoaWRkZW4iLEV4dC5mb3JtLkhpZGRlbik7RXh0LmZvcm0uQmFz aWNGb3JtPUV4dC5leHRlbmQoRXh0LnV0aWwuT2JzZXJ2YWJsZSx7Y29uc3RydWN0 b3I6ZnVuY3Rpb24oYixhKXtFeHQuYXBwbHkodGhpcyxhKTtpZihFeHQuaXNTdHJp bmcodGhpcy5wYXJhbU9yZGVyKSl7dGhpcy5wYXJhbU9yZGVyPXRoaXMucGFyYW1P cmRlci5zcGxpdCgvW1xzLHxdLyl9dGhpcy5pdGVtcz1uZXcgRXh0LnV0aWwuTWl4 ZWRDb2xsZWN0aW9uKGZhbHNlLGZ1bmN0aW9uKGMpe3JldHVybiBjLmdldEl0ZW1J ZCgpfSk7dGhpcy5hZGRFdmVudHMoImJlZm9yZWFjdGlvbiIsImFjdGlvbmZhaWxl ZCIsImFjdGlvbmNvbXBsZXRlIik7aWYoYil7dGhpcy5pbml0RWwoYil9RXh0LmZv cm0uQmFzaWNGb3JtLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKX0s dGltZW91dDozMCxwYXJhbU9yZGVyOnVuZGVmaW5lZCxwYXJhbXNBc0hhc2g6ZmFs c2Usd2FpdFRpdGxlOiJQbGVhc2UgV2FpdC4uLiIsYWN0aXZlQWN0aW9uOm51bGws dHJhY2tSZXNldE9uTG9hZDpmYWxzZSxpbml0RWw6ZnVuY3Rpb24oYSl7dGhpcy5l bD1FeHQuZ2V0KGEpO3RoaXMuaWQ9dGhpcy5lbC5pZHx8RXh0LmlkKCk7aWYoIXRo aXMuc3RhbmRhcmRTdWJtaXQpe3RoaXMuZWwub24oInN1Ym1pdCIsdGhpcy5vblN1 Ym1pdCx0aGlzKX10aGlzLmVsLmFkZENsYXNzKCJ4LWZvcm0iKX0sZ2V0RWw6ZnVu Y3Rpb24oKXtyZXR1cm4gdGhpcy5lbH0sb25TdWJtaXQ6ZnVuY3Rpb24oYSl7YS5z dG9wRXZlbnQoKX0sZGVzdHJveTpmdW5jdGlvbihhKXtpZihhIT09dHJ1ZSl7dGhp cy5pdGVtcy5lYWNoKGZ1bmN0aW9uKGIpe0V4dC5kZXN0cm95KGIpfSk7RXh0LmRl c3Ryb3kodGhpcy5lbCl9dGhpcy5pdGVtcy5jbGVhcigpO3RoaXMucHVyZ2VMaXN0 ZW5lcnMoKX0saXNWYWxpZDpmdW5jdGlvbigpe3ZhciBhPXRydWU7dGhpcy5pdGVt cy5lYWNoKGZ1bmN0aW9uKGIpe2lmKCFiLnZhbGlkYXRlKCkpe2E9ZmFsc2V9fSk7 cmV0dXJuIGF9LGlzRGlydHk6ZnVuY3Rpb24oKXt2YXIgYT1mYWxzZTt0aGlzLml0 ZW1zLmVhY2goZnVuY3Rpb24oYil7aWYoYi5pc0RpcnR5KCkpe2E9dHJ1ZTtyZXR1 cm4gZmFsc2V9fSk7cmV0dXJuIGF9LGRvQWN0aW9uOmZ1bmN0aW9uKGIsYSl7aWYo RXh0LmlzU3RyaW5nKGIpKXtiPW5ldyBFeHQuZm9ybS5BY3Rpb24uQUNUSU9OX1RZ UEVTW2JdKHRoaXMsYSl9aWYodGhpcy5maXJlRXZlbnQoImJlZm9yZWFjdGlvbiIs dGhpcyxiKSE9PWZhbHNlKXt0aGlzLmJlZm9yZUFjdGlvbihiKTtiLnJ1bi5kZWZl cigxMDAsYil9cmV0dXJuIHRoaXN9LHN1Ym1pdDpmdW5jdGlvbihiKXtiPWJ8fHt9 O2lmKHRoaXMuc3RhbmRhcmRTdWJtaXQpe3ZhciBhPWIuY2xpZW50VmFsaWRhdGlv bj09PWZhbHNlfHx0aGlzLmlzVmFsaWQoKTtpZihhKXt2YXIgYz10aGlzLmVsLmRv bTtpZih0aGlzLnVybCYmRXh0LmlzRW1wdHkoYy5hY3Rpb24pKXtjLmFjdGlvbj10 aGlzLnVybH1jLnN1Ym1pdCgpfXJldHVybiBhfXZhciBkPVN0cmluZy5mb3JtYXQo InswfXN1Ym1pdCIsdGhpcy5hcGk/ImRpcmVjdCI6IiIpO3RoaXMuZG9BY3Rpb24o ZCxiKTtyZXR1cm4gdGhpc30sbG9hZDpmdW5jdGlvbihhKXt2YXIgYj1TdHJpbmcu Zm9ybWF0KCJ7MH1sb2FkIix0aGlzLmFwaT8iZGlyZWN0IjoiIik7dGhpcy5kb0Fj dGlvbihiLGEpO3JldHVybiB0aGlzfSx1cGRhdGVSZWNvcmQ6ZnVuY3Rpb24oYil7 Yi5iZWdpbkVkaXQoKTt2YXIgYT1iLmZpZWxkcyxkLGM7YS5lYWNoKGZ1bmN0aW9u KGUpe2Q9dGhpcy5maW5kRmllbGQoZS5uYW1lKTtpZihkKXtjPWQuZ2V0VmFsdWUo KTtpZihFeHQudHlwZShjKSE9PWZhbHNlJiZjLmdldEdyb3VwVmFsdWUpe2M9Yy5n ZXRHcm91cFZhbHVlKCl9ZWxzZXtpZihkLmVhY2hJdGVtKXtjPVtdO2QuZWFjaEl0 ZW0oZnVuY3Rpb24oZyl7Yy5wdXNoKGcuZ2V0VmFsdWUoKSl9KX19Yi5zZXQoZS5u YW1lLGMpfX0sdGhpcyk7Yi5lbmRFZGl0KCk7cmV0dXJuIHRoaXN9LGxvYWRSZWNv cmQ6ZnVuY3Rpb24oYSl7dGhpcy5zZXRWYWx1ZXMoYS5kYXRhKTtyZXR1cm4gdGhp c30sYmVmb3JlQWN0aW9uOmZ1bmN0aW9uKGEpe3RoaXMuaXRlbXMuZWFjaChmdW5j dGlvbihjKXtpZihjLmlzRm9ybUZpZWxkJiZjLnN5bmNWYWx1ZSl7Yy5zeW5jVmFs dWUoKX19KTt2YXIgYj1hLm9wdGlvbnM7aWYoYi53YWl0TXNnKXtpZih0aGlzLndh aXRNc2dUYXJnZXQ9PT10cnVlKXt0aGlzLmVsLm1hc2soYi53YWl0TXNnLCJ4LW1h c2stbG9hZGluZyIpfWVsc2V7aWYodGhpcy53YWl0TXNnVGFyZ2V0KXt0aGlzLndh aXRNc2dUYXJnZXQ9RXh0LmdldCh0aGlzLndhaXRNc2dUYXJnZXQpO3RoaXMud2Fp dE1zZ1RhcmdldC5tYXNrKGIud2FpdE1zZywieC1tYXNrLWxvYWRpbmciKX1lbHNl e0V4dC5NZXNzYWdlQm94LndhaXQoYi53YWl0TXNnLGIud2FpdFRpdGxlfHx0aGlz LndhaXRUaXRsZSl9fX19LGFmdGVyQWN0aW9uOmZ1bmN0aW9uKGEsYyl7dGhpcy5h Y3RpdmVBY3Rpb249bnVsbDt2YXIgYj1hLm9wdGlvbnM7aWYoYi53YWl0TXNnKXtp Zih0aGlzLndhaXRNc2dUYXJnZXQ9PT10cnVlKXt0aGlzLmVsLnVubWFzaygpfWVs c2V7aWYodGhpcy53YWl0TXNnVGFyZ2V0KXt0aGlzLndhaXRNc2dUYXJnZXQudW5t YXNrKCl9ZWxzZXtFeHQuTWVzc2FnZUJveC51cGRhdGVQcm9ncmVzcygxKTtFeHQu TWVzc2FnZUJveC5oaWRlKCl9fX1pZihjKXtpZihiLnJlc2V0KXt0aGlzLnJlc2V0 KCl9RXh0LmNhbGxiYWNrKGIuc3VjY2VzcyxiLnNjb3BlLFt0aGlzLGFdKTt0aGlz LmZpcmVFdmVudCgiYWN0aW9uY29tcGxldGUiLHRoaXMsYSl9ZWxzZXtFeHQuY2Fs bGJhY2soYi5mYWlsdXJlLGIuc2NvcGUsW3RoaXMsYV0pO3RoaXMuZmlyZUV2ZW50 KCJhY3Rpb25mYWlsZWQiLHRoaXMsYSl9fSxmaW5kRmllbGQ6ZnVuY3Rpb24oYyl7 dmFyIGI9dGhpcy5pdGVtcy5nZXQoYyk7aWYoIUV4dC5pc09iamVjdChiKSl7dmFy IGE9ZnVuY3Rpb24oZCl7aWYoZC5pc0Zvcm1GaWVsZCl7aWYoZC5kYXRhSW5kZXg9 PWN8fGQuaWQ9PWN8fGQuZ2V0TmFtZSgpPT1jKXtiPWQ7cmV0dXJuIGZhbHNlfWVs c2V7aWYoZC5pc0NvbXBvc2l0ZSl7cmV0dXJuIGQuaXRlbXMuZWFjaChhKX1lbHNl e2lmKGQgaW5zdGFuY2VvZiBFeHQuZm9ybS5DaGVja2JveEdyb3VwJiZkLnJlbmRl cmVkKXtyZXR1cm4gZC5lYWNoSXRlbShhKX19fX19O3RoaXMuaXRlbXMuZWFjaChh KX1yZXR1cm4gYnx8bnVsbH0sbWFya0ludmFsaWQ6ZnVuY3Rpb24oaCl7aWYoRXh0 LmlzQXJyYXkoaCkpe2Zvcih2YXIgYz0wLGE9aC5sZW5ndGg7YzxhO2MrKyl7dmFy IGI9aFtjXTt2YXIgZD10aGlzLmZpbmRGaWVsZChiLmlkKTtpZihkKXtkLm1hcmtJ bnZhbGlkKGIubXNnKX19fWVsc2V7dmFyIGUsZztmb3IoZyBpbiBoKXtpZighRXh0 LmlzRnVuY3Rpb24oaFtnXSkmJihlPXRoaXMuZmluZEZpZWxkKGcpKSl7ZS5tYXJr SW52YWxpZChoW2ddKX19fXJldHVybiB0aGlzfSxzZXRWYWx1ZXM6ZnVuY3Rpb24o Yyl7aWYoRXh0LmlzQXJyYXkoYykpe2Zvcih2YXIgZD0wLGE9Yy5sZW5ndGg7ZDxh O2QrKyl7dmFyIGI9Y1tkXTt2YXIgZT10aGlzLmZpbmRGaWVsZChiLmlkKTtpZihl KXtlLnNldFZhbHVlKGIudmFsdWUpO2lmKHRoaXMudHJhY2tSZXNldE9uTG9hZCl7 ZS5vcmlnaW5hbFZhbHVlPWUuZ2V0VmFsdWUoKX19fX1lbHNle3ZhciBnLGg7Zm9y KGggaW4gYyl7aWYoIUV4dC5pc0Z1bmN0aW9uKGNbaF0pJiYoZz10aGlzLmZpbmRG aWVsZChoKSkpe2cuc2V0VmFsdWUoY1toXSk7aWYodGhpcy50cmFja1Jlc2V0T25M b2FkKXtnLm9yaWdpbmFsVmFsdWU9Zy5nZXRWYWx1ZSgpfX19fXJldHVybiB0aGlz fSxnZXRWYWx1ZXM6ZnVuY3Rpb24oYil7dmFyIGE9RXh0LmxpYi5BamF4LnNlcmlh bGl6ZUZvcm0odGhpcy5lbC5kb20pO2lmKGI9PT10cnVlKXtyZXR1cm4gYX1yZXR1 cm4gRXh0LnVybERlY29kZShhKX0sZ2V0RmllbGRWYWx1ZXM6ZnVuY3Rpb24oYSl7 dmFyIGQ9e30sZSxiLGM7dGhpcy5pdGVtcy5lYWNoKGZ1bmN0aW9uKGcpe2lmKCFn LmRpc2FibGVkJiYoYSE9PXRydWV8fGcuaXNEaXJ0eSgpKSl7ZT1nLmdldE5hbWUo KTtiPWRbZV07Yz1nLmdldFZhbHVlKCk7aWYoRXh0LmlzRGVmaW5lZChiKSl7aWYo RXh0LmlzQXJyYXkoYikpe2RbZV0ucHVzaChjKX1lbHNle2RbZV09W2IsY119fWVs c2V7ZFtlXT1jfX19KTtyZXR1cm4gZH0sY2xlYXJJbnZhbGlkOmZ1bmN0aW9uKCl7 dGhpcy5pdGVtcy5lYWNoKGZ1bmN0aW9uKGEpe2EuY2xlYXJJbnZhbGlkKCl9KTty ZXR1cm4gdGhpc30scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLml0ZW1zLmVhY2goZnVu Y3Rpb24oYSl7YS5yZXNldCgpfSk7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbigp e3RoaXMuaXRlbXMuYWRkQWxsKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFy Z3VtZW50cywwKSk7cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbihhKXt0aGlz Lml0ZW1zLnJlbW92ZShhKTtyZXR1cm4gdGhpc30sY2xlYW5EZXN0cm95ZWQ6ZnVu Y3Rpb24oKXt0aGlzLml0ZW1zLmZpbHRlckJ5KGZ1bmN0aW9uKGEpe3JldHVybiAh IWEuaXNEZXN0cm95ZWR9KS5lYWNoKHRoaXMucmVtb3ZlLHRoaXMpfSxyZW5kZXI6 ZnVuY3Rpb24oKXt0aGlzLml0ZW1zLmVhY2goZnVuY3Rpb24oYSl7aWYoYS5pc0Zv cm1GaWVsZCYmIWEucmVuZGVyZWQmJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEu aWQpKXthLmFwcGx5VG9NYXJrdXAoYS5pZCl9fSk7cmV0dXJuIHRoaXN9LGFwcGx5 VG9GaWVsZHM6ZnVuY3Rpb24oYSl7dGhpcy5pdGVtcy5lYWNoKGZ1bmN0aW9uKGIp e0V4dC5hcHBseShiLGEpfSk7cmV0dXJuIHRoaXN9LGFwcGx5SWZUb0ZpZWxkczpm dW5jdGlvbihhKXt0aGlzLml0ZW1zLmVhY2goZnVuY3Rpb24oYil7RXh0LmFwcGx5 SWYoYixhKX0pO3JldHVybiB0aGlzfSxjYWxsRmllbGRNZXRob2Q6ZnVuY3Rpb24o YixhKXthPWF8fFtdO3RoaXMuaXRlbXMuZWFjaChmdW5jdGlvbihjKXtpZihFeHQu aXNGdW5jdGlvbihjW2JdKSl7Y1tiXS5hcHBseShjLGEpfX0pO3JldHVybiB0aGlz fX0pO0V4dC5CYXNpY0Zvcm09RXh0LmZvcm0uQmFzaWNGb3JtO0V4dC5Gb3JtUGFu ZWw9RXh0LmV4dGVuZChFeHQuUGFuZWwse21pbkJ1dHRvbldpZHRoOjc1LGxhYmVs QWxpZ246ImxlZnQiLG1vbml0b3JWYWxpZDpmYWxzZSxtb25pdG9yUG9sbDoyMDAs bGF5b3V0OiJmb3JtIixpbml0Q29tcG9uZW50OmZ1bmN0aW9uKCl7dGhpcy5mb3Jt PXRoaXMuY3JlYXRlRm9ybSgpO0V4dC5Gb3JtUGFuZWwuc3VwZXJjbGFzcy5pbml0 Q29tcG9uZW50LmNhbGwodGhpcyk7dGhpcy5ib2R5Q2ZnPXt0YWc6ImZvcm0iLGNs czp0aGlzLmJhc2VDbHMrIi1ib2R5IixtZXRob2Q6dGhpcy5tZXRob2R8fCJQT1NU IixpZDp0aGlzLmZvcm1JZHx8RXh0LmlkKCl9O2lmKHRoaXMuZmlsZVVwbG9hZCl7 dGhpcy5ib2R5Q2ZnLmVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEifXRoaXMu aW5pdEl0ZW1zKCk7dGhpcy5hZGRFdmVudHMoImNsaWVudHZhbGlkYXRpb24iKTt0 aGlzLnJlbGF5RXZlbnRzKHRoaXMuZm9ybSxbImJlZm9yZWFjdGlvbiIsImFjdGlv bmZhaWxlZCIsImFjdGlvbmNvbXBsZXRlIl0pfSxjcmVhdGVGb3JtOmZ1bmN0aW9u KCl7dmFyIGE9RXh0LmFwcGx5SWYoe2xpc3RlbmVyczp7fX0sdGhpcy5pbml0aWFs Q29uZmlnKTtyZXR1cm4gbmV3IEV4dC5mb3JtLkJhc2ljRm9ybShudWxsLGEpfSxp bml0RmllbGRzOmZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5mb3JtO3ZhciBhPXRoaXM7 dmFyIGI9ZnVuY3Rpb24oZCl7aWYoYS5pc0ZpZWxkKGQpKXtjLmFkZChkKX1lbHNl e2lmKGQuZmluZEJ5JiZkIT1hKXthLmFwcGx5U2V0dGluZ3MoZCk7aWYoZC5pdGVt cyYmZC5pdGVtcy5lYWNoKXtkLml0ZW1zLmVhY2goYix0aGlzKX19fX07dGhpcy5p dGVtcy5lYWNoKGIsdGhpcyl9LGFwcGx5U2V0dGluZ3M6ZnVuY3Rpb24oYil7dmFy IGE9Yi5vd25lckN0O0V4dC5hcHBseUlmKGIse2xhYmVsQWxpZ246YS5sYWJlbEFs aWduLGxhYmVsV2lkdGg6YS5sYWJlbFdpZHRoLGl0ZW1DbHM6YS5pdGVtQ2xzfSl9 LGdldExheW91dFRhcmdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZvcm0uZWx9 LGdldEZvcm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mb3JtfSxvblJlbmRlcjpm dW5jdGlvbihiLGEpe3RoaXMuaW5pdEZpZWxkcygpO0V4dC5Gb3JtUGFuZWwuc3Vw ZXJjbGFzcy5vblJlbmRlci5jYWxsKHRoaXMsYixhKTt0aGlzLmZvcm0uaW5pdEVs KHRoaXMuYm9keSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnN0b3BN b25pdG9yaW5nKCk7dGhpcy5mb3JtLmRlc3Ryb3kodHJ1ZSk7RXh0LkZvcm1QYW5l bC5zdXBlcmNsYXNzLmJlZm9yZURlc3Ryb3kuY2FsbCh0aGlzKX0saXNGaWVsZDpm dW5jdGlvbihhKXtyZXR1cm4gISFhLnNldFZhbHVlJiYhIWEuZ2V0VmFsdWUmJiEh YS5tYXJrSW52YWxpZCYmISFhLmNsZWFySW52YWxpZH0saW5pdEV2ZW50czpmdW5j dGlvbigpe0V4dC5Gb3JtUGFuZWwuc3VwZXJjbGFzcy5pbml0RXZlbnRzLmNhbGwo dGhpcyk7dGhpcy5vbih7c2NvcGU6dGhpcyxhZGQ6dGhpcy5vbkFkZEV2ZW50LHJl bW92ZTp0aGlzLm9uUmVtb3ZlRXZlbnR9KTtpZih0aGlzLm1vbml0b3JWYWxpZCl7 dGhpcy5zdGFydE1vbml0b3JpbmcoKX19LG9uQWRkOmZ1bmN0aW9uKGEpe0V4dC5G b3JtUGFuZWwuc3VwZXJjbGFzcy5vbkFkZC5jYWxsKHRoaXMsYSk7dGhpcy5wcm9j ZXNzQWRkKGEpfSxvbkFkZEV2ZW50OmZ1bmN0aW9uKGEsYil7aWYoYSE9PXRoaXMp e3RoaXMucHJvY2Vzc0FkZChiKX19LHByb2Nlc3NBZGQ6ZnVuY3Rpb24oYSl7aWYo dGhpcy5pc0ZpZWxkKGEpKXt0aGlzLmZvcm0uYWRkKGEpfWVsc2V7aWYoYS5maW5k Qnkpe3RoaXMuYXBwbHlTZXR0aW5ncyhhKTt0aGlzLmZvcm0uYWRkLmFwcGx5KHRo aXMuZm9ybSxhLmZpbmRCeSh0aGlzLmlzRmllbGQpKX19fSxvblJlbW92ZTpmdW5j dGlvbihhKXtFeHQuRm9ybVBhbmVsLnN1cGVyY2xhc3Mub25SZW1vdmUuY2FsbCh0 aGlzLGEpO3RoaXMucHJvY2Vzc1JlbW92ZShhKX0sb25SZW1vdmVFdmVudDpmdW5j dGlvbihhLGIpe2lmKGEhPT10aGlzKXt0aGlzLnByb2Nlc3NSZW1vdmUoYil9fSxw cm9jZXNzUmVtb3ZlOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmRlc3Ryb3lpbmcpe2lm KHRoaXMuaXNGaWVsZChhKSl7dGhpcy5mb3JtLnJlbW92ZShhKX1lbHNle2lmKGEu ZmluZEJ5KXtFeHQuZWFjaChhLmZpbmRCeSh0aGlzLmlzRmllbGQpLHRoaXMuZm9y bS5yZW1vdmUsdGhpcy5mb3JtKTt0aGlzLmZvcm0uY2xlYW5EZXN0cm95ZWQoKX19 fX0sc3RhcnRNb25pdG9yaW5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmFsaWRUYXNr KXt0aGlzLnZhbGlkVGFzaz1uZXcgRXh0LnV0aWwuVGFza1J1bm5lcigpO3RoaXMu dmFsaWRUYXNrLnN0YXJ0KHtydW46dGhpcy5iaW5kSGFuZGxlcixpbnRlcnZhbDp0 aGlzLm1vbml0b3JQb2xsfHwyMDAsc2NvcGU6dGhpc30pfX0sc3RvcE1vbml0b3Jp bmc6ZnVuY3Rpb24oKXtpZih0aGlzLnZhbGlkVGFzayl7dGhpcy52YWxpZFRhc2su c3RvcEFsbCgpO3RoaXMudmFsaWRUYXNrPW51bGx9fSxsb2FkOmZ1bmN0aW9uKCl7 dGhpcy5mb3JtLmxvYWQuYXBwbHkodGhpcy5mb3JtLGFyZ3VtZW50cyl9LG9uRGlz YWJsZTpmdW5jdGlvbigpe0V4dC5Gb3JtUGFuZWwuc3VwZXJjbGFzcy5vbkRpc2Fi bGUuY2FsbCh0aGlzKTtpZih0aGlzLmZvcm0pe3RoaXMuZm9ybS5pdGVtcy5lYWNo KGZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlKCl9KX19LG9uRW5hYmxlOmZ1bmN0aW9u KCl7RXh0LkZvcm1QYW5lbC5zdXBlcmNsYXNzLm9uRW5hYmxlLmNhbGwodGhpcyk7 aWYodGhpcy5mb3JtKXt0aGlzLmZvcm0uaXRlbXMuZWFjaChmdW5jdGlvbigpe3Ro aXMuZW5hYmxlKCl9KX19LGJpbmRIYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGU9dHJ1 ZTt0aGlzLmZvcm0uaXRlbXMuZWFjaChmdW5jdGlvbihnKXtpZighZy5pc1ZhbGlk KHRydWUpKXtlPWZhbHNlO3JldHVybiBmYWxzZX19KTtpZih0aGlzLmZiYXIpe3Zh ciBiPXRoaXMuZmJhci5pdGVtcy5pdGVtcztmb3IodmFyIGQ9MCxhPWIubGVuZ3Ro O2Q8YTtkKyspe3ZhciBjPWJbZF07aWYoYy5mb3JtQmluZD09PXRydWUmJmMuZGlz YWJsZWQ9PT1lKXtjLnNldERpc2FibGVkKCFlKX19fXRoaXMuZmlyZUV2ZW50KCJj bGllbnR2YWxpZGF0aW9uIix0aGlzLGUpfX0pO0V4dC5yZWcoImZvcm0iLEV4dC5G b3JtUGFuZWwpO0V4dC5mb3JtLkZvcm1QYW5lbD1FeHQuRm9ybVBhbmVsO0V4dC5m b3JtLkZpZWxkU2V0PUV4dC5leHRlbmQoRXh0LlBhbmVsLHtiYXNlQ2xzOiJ4LWZp ZWxkc2V0IixsYXlvdXQ6ImZvcm0iLGFuaW1Db2xsYXBzZTpmYWxzZSxvblJlbmRl cjpmdW5jdGlvbihiLGEpe2lmKCF0aGlzLmVsKXt0aGlzLmVsPWRvY3VtZW50LmNy ZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dGhpcy5lbC5pZD10aGlzLmlkO2lmKHRo aXMudGl0bGV8fHRoaXMuaGVhZGVyfHx0aGlzLmNoZWNrYm94VG9nZ2xlKXt0aGlz LmVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxlZ2VuZCIp KS5jbGFzc05hbWU9dGhpcy5iYXNlQ2xzKyItaGVhZGVyIn19RXh0LmZvcm0uRmll bGRTZXQuc3VwZXJjbGFzcy5vblJlbmRlci5jYWxsKHRoaXMsYixhKTtpZih0aGlz LmNoZWNrYm94VG9nZ2xlKXt2YXIgYz10eXBlb2YgdGhpcy5jaGVja2JveFRvZ2ds ZT09Im9iamVjdCI/dGhpcy5jaGVja2JveFRvZ2dsZTp7dGFnOiJpbnB1dCIsdHlw ZToiY2hlY2tib3giLG5hbWU6dGhpcy5jaGVja2JveE5hbWV8fHRoaXMuaWQrIi1j aGVja2JveCJ9O3RoaXMuY2hlY2tib3g9dGhpcy5oZWFkZXIuaW5zZXJ0Rmlyc3Qo Yyk7dGhpcy5jaGVja2JveC5kb20uY2hlY2tlZD0hdGhpcy5jb2xsYXBzZWQ7dGhp cy5tb24odGhpcy5jaGVja2JveCwiY2xpY2siLHRoaXMub25DaGVja0NsaWNrLHRo aXMpfX0sb25Db2xsYXBzZTpmdW5jdGlvbihhLGIpe2lmKHRoaXMuY2hlY2tib3gp e3RoaXMuY2hlY2tib3guZG9tLmNoZWNrZWQ9ZmFsc2V9RXh0LmZvcm0uRmllbGRT ZXQuc3VwZXJjbGFzcy5vbkNvbGxhcHNlLmNhbGwodGhpcyxhLGIpfSxvbkV4cGFu ZDpmdW5jdGlvbihhLGIpe2lmKHRoaXMuY2hlY2tib3gpe3RoaXMuY2hlY2tib3gu ZG9tLmNoZWNrZWQ9dHJ1ZX1FeHQuZm9ybS5GaWVsZFNldC5zdXBlcmNsYXNzLm9u RXhwYW5kLmNhbGwodGhpcyxhLGIpfSxvbkNoZWNrQ2xpY2s6ZnVuY3Rpb24oKXt0 aGlzW3RoaXMuY2hlY2tib3guZG9tLmNoZWNrZWQ/ImV4cGFuZCI6ImNvbGxhcHNl Il0oKX19KTtFeHQucmVnKCJmaWVsZHNldCIsRXh0LmZvcm0uRmllbGRTZXQpO0V4 dC5mb3JtLkh0bWxFZGl0b3I9RXh0LmV4dGVuZChFeHQuZm9ybS5GaWVsZCx7ZW5h YmxlRm9ybWF0OnRydWUsZW5hYmxlRm9udFNpemU6dHJ1ZSxlbmFibGVDb2xvcnM6 dHJ1ZSxlbmFibGVBbGlnbm1lbnRzOnRydWUsZW5hYmxlTGlzdHM6dHJ1ZSxlbmFi bGVTb3VyY2VFZGl0OnRydWUsZW5hYmxlTGlua3M6dHJ1ZSxlbmFibGVGb250OnRy dWUsY3JlYXRlTGlua1RleHQ6IlBsZWFzZSBlbnRlciB0aGUgVVJMIGZvciB0aGUg bGluazoiLGRlZmF1bHRMaW5rVmFsdWU6Imh0dHA6Ly8iLGZvbnRGYW1pbGllczpb IkFyaWFsIiwiQ291cmllciBOZXciLCJUYWhvbWEiLCJUaW1lcyBOZXcgUm9tYW4i LCJWZXJkYW5hIl0sZGVmYXVsdEZvbnQ6InRhaG9tYSIsZGVmYXVsdFZhbHVlOihF eHQuaXNPcGVyYXx8RXh0LmlzSUU2KT8iJiMxNjA7IjoiJiM4MjAzOyIsYWN0aW9u TW9kZToid3JhcCIsdmFsaWRhdGlvbkV2ZW50OmZhbHNlLGRlZmVySGVpZ2h0OnRy dWUsaW5pdGlhbGl6ZWQ6ZmFsc2UsYWN0aXZhdGVkOmZhbHNlLHNvdXJjZUVkaXRN b2RlOmZhbHNlLG9uRm9jdXM6RXh0LmVtcHR5Rm4saWZyYW1lUGFkOjMsaGlkZU1v ZGU6Im9mZnNldHMiLGRlZmF1bHRBdXRvQ3JlYXRlOnt0YWc6InRleHRhcmVhIixz dHlsZToid2lkdGg6NTAwcHg7aGVpZ2h0OjMwMHB4OyIsYXV0b2NvbXBsZXRlOiJv ZmYifSxpbml0Q29tcG9uZW50OmZ1bmN0aW9uKCl7dGhpcy5hZGRFdmVudHMoImlu aXRpYWxpemUiLCJhY3RpdmF0ZSIsImJlZm9yZXN5bmMiLCJiZWZvcmVwdXNoIiwi c3luYyIsInB1c2giLCJlZGl0bW9kZWNoYW5nZSIpO0V4dC5mb3JtLkh0bWxFZGl0 b3Iuc3VwZXJjbGFzcy5pbml0Q29tcG9uZW50LmNhbGwodGhpcyl9LGNyZWF0ZUZv bnRPcHRpb25zOmZ1bmN0aW9uKCl7dmFyIGQ9W10sYj10aGlzLmZvbnRGYW1pbGll cyxjLGc7Zm9yKHZhciBlPTAsYT1iLmxlbmd0aDtlPGE7ZSsrKXtjPWJbZV07Zz1j LnRvTG93ZXJDYXNlKCk7ZC5wdXNoKCc8b3B0aW9uIHZhbHVlPSInLGcsJyIgc3R5 bGU9ImZvbnQtZmFtaWx5OicsYywnOyInLCh0aGlzLmRlZmF1bHRGb250PT1nPycg c2VsZWN0ZWQ9InRydWUiPic6Ij4iKSxjLCI8L29wdGlvbj4iKX1yZXR1cm4gZC5q b2luKCIiKX0sY3JlYXRlVG9vbGJhcjpmdW5jdGlvbihlKXt2YXIgYz1bXTt2YXIg YT1FeHQuUXVpY2tUaXBzJiZFeHQuUXVpY2tUaXBzLmlzRW5hYmxlZCgpO2Z1bmN0 aW9uIGQoaixoLGkpe3JldHVybntpdGVtSWQ6aixjbHM6IngtYnRuLWljb24iLGlj b25DbHM6IngtZWRpdC0iK2osZW5hYmxlVG9nZ2xlOmghPT1mYWxzZSxzY29wZTpl LGhhbmRsZXI6aXx8ZS5yZWxheUJ0bkNtZCxjbGlja0V2ZW50OiJtb3VzZWRvd24i LHRvb2x0aXA6YT9lLmJ1dHRvblRpcHNbal18fHVuZGVmaW5lZDp1bmRlZmluZWQs b3ZlcmZsb3dUZXh0OmUuYnV0dG9uVGlwc1tqXS50aXRsZXx8dW5kZWZpbmVkLHRh YkluZGV4Oi0xfX1pZih0aGlzLmVuYWJsZUZvbnQmJiFFeHQuaXNTYWZhcmkyKXt2 YXIgZz1uZXcgRXh0LlRvb2xiYXIuSXRlbSh7YXV0b0VsOnt0YWc6InNlbGVjdCIs Y2xzOiJ4LWZvbnQtc2VsZWN0IixodG1sOnRoaXMuY3JlYXRlRm9udE9wdGlvbnMo KX19KTtjLnB1c2goZywiLSIpfWlmKHRoaXMuZW5hYmxlRm9ybWF0KXtjLnB1c2go ZCgiYm9sZCIpLGQoIml0YWxpYyIpLGQoInVuZGVybGluZSIpKX1pZih0aGlzLmVu YWJsZUZvbnRTaXplKXtjLnB1c2goIi0iLGQoImluY3JlYXNlZm9udHNpemUiLGZh bHNlLHRoaXMuYWRqdXN0Rm9udCksZCgiZGVjcmVhc2Vmb250c2l6ZSIsZmFsc2Us dGhpcy5hZGp1c3RGb250KSl9aWYodGhpcy5lbmFibGVDb2xvcnMpe2MucHVzaCgi LSIse2l0ZW1JZDoiZm9yZWNvbG9yIixjbHM6IngtYnRuLWljb24iLGljb25DbHM6 IngtZWRpdC1mb3JlY29sb3IiLGNsaWNrRXZlbnQ6Im1vdXNlZG93biIsdG9vbHRp cDphP2UuYnV0dG9uVGlwcy5mb3JlY29sb3J8fHVuZGVmaW5lZDp1bmRlZmluZWQs dGFiSW5kZXg6LTEsbWVudTpuZXcgRXh0Lm1lbnUuQ29sb3JNZW51KHthbGxvd1Jl c2VsZWN0OnRydWUsZm9jdXM6RXh0LmVtcHR5Rm4sdmFsdWU6IjAwMDAwMCIscGxh aW46dHJ1ZSxsaXN0ZW5lcnM6e3Njb3BlOnRoaXMsc2VsZWN0OmZ1bmN0aW9uKGks aCl7dGhpcy5leGVjQ21kKCJmb3JlY29sb3IiLEV4dC5pc1dlYktpdHx8RXh0Lmlz SUU/IiMiK2g6aCk7dGhpcy5kZWZlckZvY3VzKCl9fSxjbGlja0V2ZW50OiJtb3Vz ZWRvd24ifSl9LHtpdGVtSWQ6ImJhY2tjb2xvciIsY2xzOiJ4LWJ0bi1pY29uIixp Y29uQ2xzOiJ4LWVkaXQtYmFja2NvbG9yIixjbGlja0V2ZW50OiJtb3VzZWRvd24i LHRvb2x0aXA6YT9lLmJ1dHRvblRpcHMuYmFja2NvbG9yfHx1bmRlZmluZWQ6dW5k ZWZpbmVkLHRhYkluZGV4Oi0xLG1lbnU6bmV3IEV4dC5tZW51LkNvbG9yTWVudSh7 Zm9jdXM6RXh0LmVtcHR5Rm4sdmFsdWU6IkZGRkZGRiIscGxhaW46dHJ1ZSxhbGxv d1Jlc2VsZWN0OnRydWUsbGlzdGVuZXJzOntzY29wZTp0aGlzLHNlbGVjdDpmdW5j dGlvbihpLGgpe2lmKEV4dC5pc0dlY2tvKXt0aGlzLmV4ZWNDbWQoInVzZUNTUyIs ZmFsc2UpO3RoaXMuZXhlY0NtZCgiaGlsaXRlY29sb3IiLGgpO3RoaXMuZXhlY0Nt ZCgidXNlQ1NTIix0cnVlKTt0aGlzLmRlZmVyRm9jdXMoKX1lbHNle3RoaXMuZXhl Y0NtZChFeHQuaXNPcGVyYT8iaGlsaXRlY29sb3IiOiJiYWNrY29sb3IiLEV4dC5p c1dlYktpdHx8RXh0LmlzSUU/IiMiK2g6aCk7dGhpcy5kZWZlckZvY3VzKCl9fX0s Y2xpY2tFdmVudDoibW91c2Vkb3duIn0pfSl9aWYodGhpcy5lbmFibGVBbGlnbm1l bnRzKXtjLnB1c2goIi0iLGQoImp1c3RpZnlsZWZ0IiksZCgianVzdGlmeWNlbnRl ciIpLGQoImp1c3RpZnlyaWdodCIpKX1pZighRXh0LmlzU2FmYXJpMil7aWYodGhp cy5lbmFibGVMaW5rcyl7Yy5wdXNoKCItIixkKCJjcmVhdGVsaW5rIixmYWxzZSx0 aGlzLmNyZWF0ZUxpbmspKX1pZih0aGlzLmVuYWJsZUxpc3RzKXtjLnB1c2goIi0i LGQoImluc2VydG9yZGVyZWRsaXN0IiksZCgiaW5zZXJ0dW5vcmRlcmVkbGlzdCIp KX1pZih0aGlzLmVuYWJsZVNvdXJjZUVkaXQpe2MucHVzaCgiLSIsZCgic291cmNl ZWRpdCIsdHJ1ZSxmdW5jdGlvbihoKXt0aGlzLnRvZ2dsZVNvdXJjZUVkaXQoIXRo aXMuc291cmNlRWRpdE1vZGUpfSkpfX12YXIgYj1uZXcgRXh0LlRvb2xiYXIoe3Jl bmRlclRvOnRoaXMud3JhcC5kb20uZmlyc3RDaGlsZCxpdGVtczpjfSk7aWYoZyl7 dGhpcy5mb250U2VsZWN0PWcuZWw7dGhpcy5tb24odGhpcy5mb250U2VsZWN0LCJj aGFuZ2UiLGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5mb250U2VsZWN0LmRvbS52YWx1 ZTt0aGlzLnJlbGF5Q21kKCJmb250bmFtZSIsaCk7dGhpcy5kZWZlckZvY3VzKCl9 LHRoaXMpfXRoaXMubW9uKGIuZWwsImNsaWNrIixmdW5jdGlvbihoKXtoLnByZXZl bnREZWZhdWx0KCl9KTt0aGlzLnRiPWI7dGhpcy50Yi5kb0xheW91dCgpfSxvbkRp c2FibGU6ZnVuY3Rpb24oKXt0aGlzLndyYXAubWFzaygpO0V4dC5mb3JtLkh0bWxF ZGl0b3Iuc3VwZXJjbGFzcy5vbkRpc2FibGUuY2FsbCh0aGlzKX0sb25FbmFibGU6 ZnVuY3Rpb24oKXt0aGlzLndyYXAudW5tYXNrKCk7RXh0LmZvcm0uSHRtbEVkaXRv ci5zdXBlcmNsYXNzLm9uRW5hYmxlLmNhbGwodGhpcyl9LHNldFJlYWRPbmx5OmZ1 bmN0aW9uKGIpe0V4dC5mb3JtLkh0bWxFZGl0b3Iuc3VwZXJjbGFzcy5zZXRSZWFk T25seS5jYWxsKHRoaXMsYik7aWYodGhpcy5pbml0aWFsaXplZCl7aWYoRXh0Lmlz SUUpe3RoaXMuZ2V0RWRpdG9yQm9keSgpLmNvbnRlbnRFZGl0YWJsZT0hYn1lbHNl e3RoaXMuc2V0RGVzaWduTW9kZSghYil9dmFyIGE9dGhpcy5nZXRFZGl0b3JCb2R5 KCk7aWYoYSl7YS5zdHlsZS5jdXJzb3I9dGhpcy5yZWFkT25seT8iZGVmYXVsdCI6 InRleHQifXRoaXMuZGlzYWJsZUl0ZW1zKGIpfX0sZ2V0RG9jTWFya3VwOmZ1bmN0 aW9uKCl7dmFyIGE9RXh0LmZseSh0aGlzLmlmcmFtZSkuZ2V0SGVpZ2h0KCktdGhp cy5pZnJhbWVQYWQqMjtyZXR1cm4gU3RyaW5nLmZvcm1hdCgnPGh0bWw+PGhlYWQ+ PHN0eWxlIHR5cGU9InRleHQvY3NzIj5ib2R5e2JvcmRlcjogMDsgbWFyZ2luOiAw OyBwYWRkaW5nOiB7MH1weDsgaGVpZ2h0OiB7MX1weDsgY3Vyc29yOiB0ZXh0fTwv c3R5bGU+PC9oZWFkPjxib2R5PjwvYm9keT48L2h0bWw+Jyx0aGlzLmlmcmFtZVBh ZCxhKX0sZ2V0RWRpdG9yQm9keTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0RG9j KCk7cmV0dXJuIGEuYm9keXx8YS5kb2N1bWVudEVsZW1lbnR9LGdldERvYzpmdW5j dGlvbigpe3JldHVybiBFeHQuaXNJRT90aGlzLmdldFdpbigpLmRvY3VtZW50Oih0 aGlzLmlmcmFtZS5jb250ZW50RG9jdW1lbnR8fHRoaXMuZ2V0V2luKCkuZG9jdW1l bnQpfSxnZXRXaW46ZnVuY3Rpb24oKXtyZXR1cm4gRXh0LmlzSUU/dGhpcy5pZnJh bWUuY29udGVudFdpbmRvdzp3aW5kb3cuZnJhbWVzW3RoaXMuaWZyYW1lLm5hbWVd fSxvblJlbmRlcjpmdW5jdGlvbihiLGEpe0V4dC5mb3JtLkh0bWxFZGl0b3Iuc3Vw ZXJjbGFzcy5vblJlbmRlci5jYWxsKHRoaXMsYixhKTt0aGlzLmVsLmRvbS5zdHls ZS5ib3JkZXI9IjAgbm9uZSI7dGhpcy5lbC5kb20uc2V0QXR0cmlidXRlKCJ0YWJJ bmRleCIsLTEpO3RoaXMuZWwuYWRkQ2xhc3MoIngtaGlkZGVuIik7aWYoRXh0Lmlz SUUpe3RoaXMuZWwuYXBwbHlTdHlsZXMoIm1hcmdpbi10b3A6LTFweDttYXJnaW4t Ym90dG9tOi0xcHg7Iil9dGhpcy53cmFwPXRoaXMuZWwud3JhcCh7Y2xzOiJ4LWh0 bWwtZWRpdG9yLXdyYXAiLGNuOntjbHM6IngtaHRtbC1lZGl0b3ItdGIifX0pO3Ro aXMuY3JlYXRlVG9vbGJhcih0aGlzKTt0aGlzLmRpc2FibGVJdGVtcyh0cnVlKTt0 aGlzLnRiLmRvTGF5b3V0KCk7dGhpcy5jcmVhdGVJRnJhbWUoKTtpZighdGhpcy53 aWR0aCl7dmFyIGM9dGhpcy5lbC5nZXRTaXplKCk7dGhpcy5zZXRTaXplKGMud2lk dGgsdGhpcy5oZWlnaHR8fGMuaGVpZ2h0KX10aGlzLnJlc2l6ZUVsPXRoaXMucG9z aXRpb25FbD10aGlzLndyYXB9LGNyZWF0ZUlGcmFtZTpmdW5jdGlvbigpe3ZhciBh PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2EubmFtZT1FeHQuaWQo KTthLmZyYW1lQm9yZGVyPSIwIjthLnN0eWxlLm92ZXJmbG93PSJhdXRvIjthLnNy Yz1FeHQuU1NMX1NFQ1VSRV9VUkw7dGhpcy53cmFwLmRvbS5hcHBlbmRDaGlsZChh KTt0aGlzLmlmcmFtZT1hO3RoaXMubW9uaXRvclRhc2s9RXh0LlRhc2tNZ3Iuc3Rh cnQoe3J1bjp0aGlzLmNoZWNrRGVzaWduTW9kZSxzY29wZTp0aGlzLGludGVydmFs OjEwMH0pfSxpbml0RnJhbWU6ZnVuY3Rpb24oKXtFeHQuVGFza01nci5zdG9wKHRo aXMubW9uaXRvclRhc2spO3ZhciBiPXRoaXMuZ2V0RG9jKCk7dGhpcy53aW49dGhp cy5nZXRXaW4oKTtiLm9wZW4oKTtiLndyaXRlKHRoaXMuZ2V0RG9jTWFya3VwKCkp O2IuY2xvc2UoKTt2YXIgYT17cnVuOmZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5nZXRE b2MoKTtpZihjLmJvZHl8fGMucmVhZHlTdGF0ZT09ImNvbXBsZXRlIil7RXh0LlRh c2tNZ3Iuc3RvcChhKTt0aGlzLnNldERlc2lnbk1vZGUodHJ1ZSk7dGhpcy5pbml0 RWRpdG9yLmRlZmVyKDEwLHRoaXMpfX0saW50ZXJ2YWw6MTAsZHVyYXRpb246MTAw MDAsc2NvcGU6dGhpc307RXh0LlRhc2tNZ3Iuc3RhcnQoYSl9LGNoZWNrRGVzaWdu TW9kZTpmdW5jdGlvbigpe2lmKHRoaXMud3JhcCYmdGhpcy53cmFwLmRvbS5vZmZz ZXRXaWR0aCl7dmFyIGE9dGhpcy5nZXREb2MoKTtpZighYSl7cmV0dXJufWlmKCFh LmVkaXRvckluaXRpYWxpemVkfHx0aGlzLmdldERlc2lnbk1vZGUoKSE9Im9uIil7 dGhpcy5pbml0RnJhbWUoKX19fSxzZXREZXNpZ25Nb2RlOmZ1bmN0aW9uKGIpe3Zh ciBhPXRoaXMuZ2V0RG9jKCk7aWYoYSl7aWYodGhpcy5yZWFkT25seSl7Yj1mYWxz ZX1hLmRlc2lnbk1vZGU9KC9vbnx0cnVlL2kpLnRlc3QoU3RyaW5nKGIpLnRvTG93 ZXJDYXNlKCkpPyJvbiI6Im9mZiJ9fSxnZXREZXNpZ25Nb2RlOmZ1bmN0aW9uKCl7 dmFyIGE9dGhpcy5nZXREb2MoKTtpZighYSl7cmV0dXJuIiJ9cmV0dXJuIFN0cmlu ZyhhLmRlc2lnbk1vZGUpLnRvTG93ZXJDYXNlKCl9LGRpc2FibGVJdGVtczpmdW5j dGlvbihhKXtpZih0aGlzLmZvbnRTZWxlY3Qpe3RoaXMuZm9udFNlbGVjdC5kb20u ZGlzYWJsZWQ9YX10aGlzLnRiLml0ZW1zLmVhY2goZnVuY3Rpb24oYil7aWYoYi5n ZXRJdGVtSWQoKSE9InNvdXJjZWVkaXQiKXtiLnNldERpc2FibGVkKGEpfX0pfSxv blJlc2l6ZTpmdW5jdGlvbihiLGMpe0V4dC5mb3JtLkh0bWxFZGl0b3Iuc3VwZXJj bGFzcy5vblJlc2l6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYodGhpcy5lbCYm dGhpcy5pZnJhbWUpe2lmKEV4dC5pc051bWJlcihiKSl7dmFyIGU9Yi10aGlzLndy YXAuZ2V0RnJhbWVXaWR0aCgibHIiKTt0aGlzLmVsLnNldFdpZHRoKGUpO3RoaXMu dGIuc2V0V2lkdGgoZSk7dGhpcy5pZnJhbWUuc3R5bGUud2lkdGg9TWF0aC5tYXgo ZSwwKSsicHgifWlmKEV4dC5pc051bWJlcihjKSl7dmFyIGE9Yy10aGlzLndyYXAu Z2V0RnJhbWVXaWR0aCgidGIiKS10aGlzLnRiLmVsLmdldEhlaWdodCgpO3RoaXMu ZWwuc2V0SGVpZ2h0KGEpO3RoaXMuaWZyYW1lLnN0eWxlLmhlaWdodD1NYXRoLm1h eChhLDApKyJweCI7dmFyIGQ9dGhpcy5nZXRFZGl0b3JCb2R5KCk7aWYoZCl7ZC5z dHlsZS5oZWlnaHQ9TWF0aC5tYXgoKGEtKHRoaXMuaWZyYW1lUGFkKjIpKSwwKSsi cHgifX19fSx0b2dnbGVTb3VyY2VFZGl0OmZ1bmN0aW9uKGIpe3ZhciBkLGE7aWYo Yj09PXVuZGVmaW5lZCl7Yj0hdGhpcy5zb3VyY2VFZGl0TW9kZX10aGlzLnNvdXJj ZUVkaXRNb2RlPWI9PT10cnVlO3ZhciBjPXRoaXMudGIuZ2V0Q29tcG9uZW50KCJz b3VyY2VlZGl0Iik7aWYoYy5wcmVzc2VkIT09dGhpcy5zb3VyY2VFZGl0TW9kZSl7 Yy50b2dnbGUodGhpcy5zb3VyY2VFZGl0TW9kZSk7aWYoIWMueHRiSGlkZGVuKXty ZXR1cm59fWlmKHRoaXMuc291cmNlRWRpdE1vZGUpe3RoaXMucHJldmlvdXNTaXpl PXRoaXMuZ2V0U2l6ZSgpO2Q9RXh0LmdldCh0aGlzLmlmcmFtZSkuZ2V0SGVpZ2h0 KCk7dGhpcy5kaXNhYmxlSXRlbXModHJ1ZSk7dGhpcy5zeW5jVmFsdWUoKTt0aGlz LmlmcmFtZS5jbGFzc05hbWU9IngtaGlkZGVuIjt0aGlzLmVsLnJlbW92ZUNsYXNz KCJ4LWhpZGRlbiIpO3RoaXMuZWwuZG9tLnJlbW92ZUF0dHJpYnV0ZSgidGFiSW5k ZXgiKTt0aGlzLmVsLmZvY3VzKCk7dGhpcy5lbC5kb20uc3R5bGUuaGVpZ2h0PWQr InB4In1lbHNle2E9cGFyc2VJbnQodGhpcy5lbC5kb20uc3R5bGUuaGVpZ2h0LDEw KTtpZih0aGlzLmluaXRpYWxpemVkKXt0aGlzLmRpc2FibGVJdGVtcyh0aGlzLnJl YWRPbmx5KX10aGlzLnB1c2hWYWx1ZSgpO3RoaXMuaWZyYW1lLmNsYXNzTmFtZT0i Ijt0aGlzLmVsLmFkZENsYXNzKCJ4LWhpZGRlbiIpO3RoaXMuZWwuZG9tLnNldEF0 dHJpYnV0ZSgidGFiSW5kZXgiLC0xKTt0aGlzLmRlZmVyRm9jdXMoKTt0aGlzLnNl dFNpemUodGhpcy5wcmV2aW91c1NpemUpO2RlbGV0ZSB0aGlzLnByZXZpb3VzU2l6 ZTt0aGlzLmlmcmFtZS5zdHlsZS5oZWlnaHQ9YSsicHgifXRoaXMuZmlyZUV2ZW50 KCJlZGl0bW9kZWNoYW5nZSIsdGhpcyx0aGlzLnNvdXJjZUVkaXRNb2RlKX0sY3Jl YXRlTGluazpmdW5jdGlvbigpe3ZhciBhPXByb21wdCh0aGlzLmNyZWF0ZUxpbmtU ZXh0LHRoaXMuZGVmYXVsdExpbmtWYWx1ZSk7aWYoYSYmYSE9Imh0dHA6Ly8iKXt0 aGlzLnJlbGF5Q21kKCJjcmVhdGVsaW5rIixhKX19LGluaXRFdmVudHM6ZnVuY3Rp b24oKXt0aGlzLm9yaWdpbmFsVmFsdWU9dGhpcy5nZXRWYWx1ZSgpfSxtYXJrSW52 YWxpZDpFeHQuZW1wdHlGbixjbGVhckludmFsaWQ6RXh0LmVtcHR5Rm4sc2V0VmFs dWU6ZnVuY3Rpb24oYSl7RXh0LmZvcm0uSHRtbEVkaXRvci5zdXBlcmNsYXNzLnNl dFZhbHVlLmNhbGwodGhpcyxhKTt0aGlzLnB1c2hWYWx1ZSgpO3JldHVybiB0aGlz fSxjbGVhbkh0bWw6ZnVuY3Rpb24oYSl7YT1TdHJpbmcoYSk7aWYoRXh0LmlzV2Vi S2l0KXthPWEucmVwbGFjZSgvXHNjbGFzcz0iKD86QXBwbGUtc3R5bGUtc3Bhbnxr aHRtbC1ibG9jay1wbGFjZWhvbGRlcikiL2dpLCIiKX1pZihhLmNoYXJDb2RlQXQo MCk9PXRoaXMuZGVmYXVsdFZhbHVlLnJlcGxhY2UoL1xEL2csIiIpKXthPWEuc3Vi c3RyaW5nKDEpfXJldHVybiBhfSxzeW5jVmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlz LmluaXRpYWxpemVkKXt2YXIgZD10aGlzLmdldEVkaXRvckJvZHkoKTt2YXIgYz1k LmlubmVySFRNTDtpZihFeHQuaXNXZWJLaXQpe3ZhciBiPWQuZ2V0QXR0cmlidXRl KCJzdHlsZSIpO3ZhciBhPWIubWF0Y2goL3RleHQtYWxpZ246KC4qPyk7L2kpO2lm KGEmJmFbMV0pe2M9JzxkaXYgc3R5bGU9IicrYVswXSsnIj4nK2MrIjwvZGl2PiJ9 fWM9dGhpcy5jbGVhbkh0bWwoYyk7aWYodGhpcy5maXJlRXZlbnQoImJlZm9yZXN5 bmMiLHRoaXMsYykhPT1mYWxzZSl7dGhpcy5lbC5kb20udmFsdWU9Yzt0aGlzLmZp cmVFdmVudCgic3luYyIsdGhpcyxjKX19fSxnZXRWYWx1ZTpmdW5jdGlvbigpe3Ro aXNbdGhpcy5zb3VyY2VFZGl0TW9kZT8icHVzaFZhbHVlIjoic3luY1ZhbHVlIl0o KTtyZXR1cm4gRXh0LmZvcm0uSHRtbEVkaXRvci5zdXBlcmNsYXNzLmdldFZhbHVl LmNhbGwodGhpcyl9LHB1c2hWYWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMuaW5pdGlh bGl6ZWQpe3ZhciBhPXRoaXMuZWwuZG9tLnZhbHVlO2lmKCF0aGlzLmFjdGl2YXRl ZCYmYS5sZW5ndGg8MSl7YT10aGlzLmRlZmF1bHRWYWx1ZX1pZih0aGlzLmZpcmVF dmVudCgiYmVmb3JlcHVzaCIsdGhpcyxhKSE9PWZhbHNlKXt0aGlzLmdldEVkaXRv ckJvZHkoKS5pbm5lckhUTUw9YTtpZihFeHQuaXNHZWNrbyl7dGhpcy5zZXREZXNp Z25Nb2RlKGZhbHNlKTt0aGlzLnNldERlc2lnbk1vZGUodHJ1ZSl9dGhpcy5maXJl RXZlbnQoInB1c2giLHRoaXMsYSl9fX0sZGVmZXJGb2N1czpmdW5jdGlvbigpe3Ro aXMuZm9jdXMuZGVmZXIoMTAsdGhpcyl9LGZvY3VzOmZ1bmN0aW9uKCl7aWYodGhp cy53aW4mJiF0aGlzLnNvdXJjZUVkaXRNb2RlKXt0aGlzLndpbi5mb2N1cygpfWVs c2V7dGhpcy5lbC5mb2N1cygpfX0saW5pdEVkaXRvcjpmdW5jdGlvbigpe3RyeXt2 YXIgYz10aGlzLmdldEVkaXRvckJvZHkoKSxhPXRoaXMuZWwuZ2V0U3R5bGVzKCJm b250LXNpemUiLCJmb250LWZhbWlseSIsImJhY2tncm91bmQtaW1hZ2UiLCJiYWNr Z3JvdW5kLXJlcGVhdCIsImJhY2tncm91bmQtY29sb3IiLCJjb2xvciIpLGcsYjth WyJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiXT0iZml4ZWQiO2MuYmdQcm9wZXJ0aWVz PSJmaXhlZCI7RXh0LkRvbUhlbHBlci5hcHBseVN0eWxlcyhjLGEpO2c9dGhpcy5n ZXREb2MoKTtpZihnKXt0cnl7RXh0LkV2ZW50TWFuYWdlci5yZW1vdmVBbGwoZyl9 Y2F0Y2goZCl7fX1iPXRoaXMub25FZGl0b3JFdmVudC5jcmVhdGVEZWxlZ2F0ZSh0 aGlzKTtFeHQuRXZlbnRNYW5hZ2VyLm9uKGcse21vdXNlZG93bjpiLGRibGNsaWNr OmIsY2xpY2s6YixrZXl1cDpiLGJ1ZmZlcjoxMDB9KTtpZihFeHQuaXNHZWNrbyl7 RXh0LkV2ZW50TWFuYWdlci5vbihnLCJrZXlwcmVzcyIsdGhpcy5hcHBseUNvbW1h bmQsdGhpcyl9aWYoRXh0LmlzSUV8fEV4dC5pc1dlYktpdHx8RXh0LmlzT3BlcmEp e0V4dC5FdmVudE1hbmFnZXIub24oZywia2V5ZG93biIsdGhpcy5maXhLZXlzLHRo aXMpfWcuZWRpdG9ySW5pdGlhbGl6ZWQ9dHJ1ZTt0aGlzLmluaXRpYWxpemVkPXRy dWU7dGhpcy5wdXNoVmFsdWUoKTt0aGlzLnNldFJlYWRPbmx5KHRoaXMucmVhZE9u bHkpO3RoaXMuZmlyZUV2ZW50KCJpbml0aWFsaXplIix0aGlzKX1jYXRjaChkKXt9 fSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7aWYodGhpcy5tb25pdG9yVGFzayl7 RXh0LlRhc2tNZ3Iuc3RvcCh0aGlzLm1vbml0b3JUYXNrKX1pZih0aGlzLnJlbmRl cmVkKXtFeHQuZGVzdHJveSh0aGlzLnRiKTt2YXIgYj10aGlzLmdldERvYygpO2lm KGIpe3RyeXtFeHQuRXZlbnRNYW5hZ2VyLnJlbW92ZUFsbChiKTtmb3IodmFyIGMg aW4gYil7ZGVsZXRlIGJbY119fWNhdGNoKGEpe319aWYodGhpcy53cmFwKXt0aGlz LndyYXAuZG9tLmlubmVySFRNTD0iIjt0aGlzLndyYXAucmVtb3ZlKCl9fUV4dC5m b3JtLkh0bWxFZGl0b3Iuc3VwZXJjbGFzcy5iZWZvcmVEZXN0cm95LmNhbGwodGhp cyl9LG9uRmlyc3RGb2N1czpmdW5jdGlvbigpe3RoaXMuYWN0aXZhdGVkPXRydWU7 dGhpcy5kaXNhYmxlSXRlbXModGhpcy5yZWFkT25seSk7aWYoRXh0LmlzR2Vja28p e3RoaXMud2luLmZvY3VzKCk7dmFyIGE9dGhpcy53aW4uZ2V0U2VsZWN0aW9uKCk7 aWYoIWEuZm9jdXNOb2RlfHxhLmZvY3VzTm9kZS5ub2RlVHlwZSE9Myl7dmFyIGI9 YS5nZXRSYW5nZUF0KDApO2Iuc2VsZWN0Tm9kZUNvbnRlbnRzKHRoaXMuZ2V0RWRp dG9yQm9keSgpKTtiLmNvbGxhcHNlKHRydWUpO3RoaXMuZGVmZXJGb2N1cygpfXRy eXt0aGlzLmV4ZWNDbWQoInVzZUNTUyIsdHJ1ZSk7dGhpcy5leGVjQ21kKCJzdHls ZVdpdGhDU1MiLGZhbHNlKX1jYXRjaChjKXt9fXRoaXMuZmlyZUV2ZW50KCJhY3Rp dmF0ZSIsdGhpcyl9LGFkanVzdEZvbnQ6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5nZXRJ dGVtSWQoKT09ImluY3JlYXNlZm9udHNpemUiPzE6LTEsYz10aGlzLmdldERvYygp LGE9cGFyc2VJbnQoYy5xdWVyeUNvbW1hbmRWYWx1ZSgiRm9udFNpemUiKXx8Miwx MCk7aWYoKEV4dC5pc1NhZmFyaSYmIUV4dC5pc1NhZmFyaTIpfHxFeHQuaXNDaHJv bWV8fEV4dC5pc0Fpcil7aWYoYTw9MTApe2E9MStkfWVsc2V7aWYoYTw9MTMpe2E9 MitkfWVsc2V7aWYoYTw9MTYpe2E9MytkfWVsc2V7aWYoYTw9MTgpe2E9NCtkfWVs c2V7aWYoYTw9MjQpe2E9NStkfWVsc2V7YT02K2R9fX19fWE9YS5jb25zdHJhaW4o MSw2KX1lbHNle2lmKEV4dC5pc1NhZmFyaSl7ZCo9Mn1hPU1hdGgubWF4KDEsYStk KSsoRXh0LmlzU2FmYXJpPyJweCI6MCl9dGhpcy5leGVjQ21kKCJGb250U2l6ZSIs YSl9LG9uRWRpdG9yRXZlbnQ6ZnVuY3Rpb24oYSl7dGhpcy51cGRhdGVUb29sYmFy KCl9LHVwZGF0ZVRvb2xiYXI6ZnVuY3Rpb24oKXtpZih0aGlzLnJlYWRPbmx5KXty ZXR1cm59aWYoIXRoaXMuYWN0aXZhdGVkKXt0aGlzLm9uRmlyc3RGb2N1cygpO3Jl dHVybn12YXIgYj10aGlzLnRiLml0ZW1zLm1hcCxjPXRoaXMuZ2V0RG9jKCk7aWYo dGhpcy5lbmFibGVGb250JiYhRXh0LmlzU2FmYXJpMil7dmFyIGE9KGMucXVlcnlD b21tYW5kVmFsdWUoIkZvbnROYW1lIil8fHRoaXMuZGVmYXVsdEZvbnQpLnRvTG93 ZXJDYXNlKCk7aWYoYSE9dGhpcy5mb250U2VsZWN0LmRvbS52YWx1ZSl7dGhpcy5m b250U2VsZWN0LmRvbS52YWx1ZT1hfX1pZih0aGlzLmVuYWJsZUZvcm1hdCl7Yi5i b2xkLnRvZ2dsZShjLnF1ZXJ5Q29tbWFuZFN0YXRlKCJib2xkIikpO2IuaXRhbGlj LnRvZ2dsZShjLnF1ZXJ5Q29tbWFuZFN0YXRlKCJpdGFsaWMiKSk7Yi51bmRlcmxp bmUudG9nZ2xlKGMucXVlcnlDb21tYW5kU3RhdGUoInVuZGVybGluZSIpKX1pZih0 aGlzLmVuYWJsZUFsaWdubWVudHMpe2IuanVzdGlmeWxlZnQudG9nZ2xlKGMucXVl cnlDb21tYW5kU3RhdGUoImp1c3RpZnlsZWZ0IikpO2IuanVzdGlmeWNlbnRlci50 b2dnbGUoYy5xdWVyeUNvbW1hbmRTdGF0ZSgianVzdGlmeWNlbnRlciIpKTtiLmp1 c3RpZnlyaWdodC50b2dnbGUoYy5xdWVyeUNvbW1hbmRTdGF0ZSgianVzdGlmeXJp Z2h0IikpfWlmKCFFeHQuaXNTYWZhcmkyJiZ0aGlzLmVuYWJsZUxpc3RzKXtiLmlu c2VydG9yZGVyZWRsaXN0LnRvZ2dsZShjLnF1ZXJ5Q29tbWFuZFN0YXRlKCJpbnNl cnRvcmRlcmVkbGlzdCIpKTtiLmluc2VydHVub3JkZXJlZGxpc3QudG9nZ2xlKGMu cXVlcnlDb21tYW5kU3RhdGUoImluc2VydHVub3JkZXJlZGxpc3QiKSl9RXh0Lm1l bnUuTWVudU1nci5oaWRlQWxsKCk7dGhpcy5zeW5jVmFsdWUoKX0scmVsYXlCdG5D bWQ6ZnVuY3Rpb24oYSl7dGhpcy5yZWxheUNtZChhLmdldEl0ZW1JZCgpKX0scmVs YXlDbWQ6ZnVuY3Rpb24oYixhKXsoZnVuY3Rpb24oKXt0aGlzLmZvY3VzKCk7dGhp cy5leGVjQ21kKGIsYSk7dGhpcy51cGRhdGVUb29sYmFyKCl9KS5kZWZlcigxMCx0 aGlzKX0sZXhlY0NtZDpmdW5jdGlvbihiLGEpe3ZhciBjPXRoaXMuZ2V0RG9jKCk7 Yy5leGVjQ29tbWFuZChiLGZhbHNlLGE9PT11bmRlZmluZWQ/bnVsbDphKTt0aGlz LnN5bmNWYWx1ZSgpfSxhcHBseUNvbW1hbmQ6ZnVuY3Rpb24oYil7aWYoYi5jdHJs S2V5KXt2YXIgZD1iLmdldENoYXJDb2RlKCksYTtpZihkPjApe2Q9U3RyaW5nLmZy b21DaGFyQ29kZShkKTtzd2l0Y2goZCl7Y2FzZSJiIjphPSJib2xkIjticmVhaztj YXNlImkiOmE9Iml0YWxpYyI7YnJlYWs7Y2FzZSJ1IjphPSJ1bmRlcmxpbmUiO2Jy ZWFrfWlmKGEpe3RoaXMud2luLmZvY3VzKCk7dGhpcy5leGVjQ21kKGEpO3RoaXMu ZGVmZXJGb2N1cygpO2IucHJldmVudERlZmF1bHQoKX19fX0saW5zZXJ0QXRDdXJz b3I6ZnVuY3Rpb24oYyl7aWYoIXRoaXMuYWN0aXZhdGVkKXtyZXR1cm59aWYoRXh0 LmlzSUUpe3RoaXMud2luLmZvY3VzKCk7dmFyIGI9dGhpcy5nZXREb2MoKSxhPWIu c2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7aWYoYSl7YS5wYXN0ZUhUTUwoYyk7dGhp cy5zeW5jVmFsdWUoKTt0aGlzLmRlZmVyRm9jdXMoKX19ZWxzZXt0aGlzLndpbi5m b2N1cygpO3RoaXMuZXhlY0NtZCgiSW5zZXJ0SFRNTCIsYyk7dGhpcy5kZWZlckZv Y3VzKCl9fSxmaXhLZXlzOmZ1bmN0aW9uKCl7aWYoRXh0LmlzSUUpe3JldHVybiBm dW5jdGlvbihnKXt2YXIgYT1nLmdldEtleSgpLGQ9dGhpcy5nZXREb2MoKSxiO2lm KGE9PWcuVEFCKXtnLnN0b3BFdmVudCgpO2I9ZC5zZWxlY3Rpb24uY3JlYXRlUmFu Z2UoKTtpZihiKXtiLmNvbGxhcHNlKHRydWUpO2IucGFzdGVIVE1MKCImbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsiKTt0aGlzLmRlZmVyRm9jdXMoKX19ZWxzZXtpZihh PT1nLkVOVEVSKXtiPWQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7aWYoYil7dmFy IGM9Yi5wYXJlbnRFbGVtZW50KCk7aWYoIWN8fGMudGFnTmFtZS50b0xvd2VyQ2Fz ZSgpIT0ibGkiKXtnLnN0b3BFdmVudCgpO2IucGFzdGVIVE1MKCI8YnIgLz4iKTti LmNvbGxhcHNlKGZhbHNlKTtiLnNlbGVjdCgpfX19fX19ZWxzZXtpZihFeHQuaXNP cGVyYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0S2V5KCk7aWYoYT09 Yi5UQUIpe2Iuc3RvcEV2ZW50KCk7dGhpcy53aW4uZm9jdXMoKTt0aGlzLmV4ZWND bWQoIkluc2VydEhUTUwiLCImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsiKTt0aGlz LmRlZmVyRm9jdXMoKX19fWVsc2V7aWYoRXh0LmlzV2ViS2l0KXtyZXR1cm4gZnVu Y3Rpb24oYil7dmFyIGE9Yi5nZXRLZXkoKTtpZihhPT1iLlRBQil7Yi5zdG9wRXZl bnQoKTt0aGlzLmV4ZWNDbWQoIkluc2VydFRleHQiLCJcdCIpO3RoaXMuZGVmZXJG b2N1cygpfWVsc2V7aWYoYT09Yi5FTlRFUil7Yi5zdG9wRXZlbnQoKTt0aGlzLmV4 ZWNDbWQoIkluc2VydEh0bWwiLCI8YnIgLz48YnIgLz4iKTt0aGlzLmRlZmVyRm9j dXMoKX19fX19fX0oKSxnZXRUb29sYmFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMu dGJ9LGJ1dHRvblRpcHM6e2JvbGQ6e3RpdGxlOiJCb2xkIChDdHJsK0IpIix0ZXh0 OiJNYWtlIHRoZSBzZWxlY3RlZCB0ZXh0IGJvbGQuIixjbHM6IngtaHRtbC1lZGl0 b3ItdGlwIn0saXRhbGljOnt0aXRsZToiSXRhbGljIChDdHJsK0kpIix0ZXh0OiJN YWtlIHRoZSBzZWxlY3RlZCB0ZXh0IGl0YWxpYy4iLGNsczoieC1odG1sLWVkaXRv ci10aXAifSx1bmRlcmxpbmU6e3RpdGxlOiJVbmRlcmxpbmUgKEN0cmwrVSkiLHRl eHQ6IlVuZGVybGluZSB0aGUgc2VsZWN0ZWQgdGV4dC4iLGNsczoieC1odG1sLWVk aXRvci10aXAifSxpbmNyZWFzZWZvbnRzaXplOnt0aXRsZToiR3JvdyBUZXh0Iix0 ZXh0OiJJbmNyZWFzZSB0aGUgZm9udCBzaXplLiIsY2xzOiJ4LWh0bWwtZWRpdG9y LXRpcCJ9LGRlY3JlYXNlZm9udHNpemU6e3RpdGxlOiJTaHJpbmsgVGV4dCIsdGV4 dDoiRGVjcmVhc2UgdGhlIGZvbnQgc2l6ZS4iLGNsczoieC1odG1sLWVkaXRvci10 aXAifSxiYWNrY29sb3I6e3RpdGxlOiJUZXh0IEhpZ2hsaWdodCBDb2xvciIsdGV4 dDoiQ2hhbmdlIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBzZWxlY3RlZCB0 ZXh0LiIsY2xzOiJ4LWh0bWwtZWRpdG9yLXRpcCJ9LGZvcmVjb2xvcjp7dGl0bGU6 IkZvbnQgQ29sb3IiLHRleHQ6IkNoYW5nZSB0aGUgY29sb3Igb2YgdGhlIHNlbGVj dGVkIHRleHQuIixjbHM6IngtaHRtbC1lZGl0b3ItdGlwIn0sanVzdGlmeWxlZnQ6 e3RpdGxlOiJBbGlnbiBUZXh0IExlZnQiLHRleHQ6IkFsaWduIHRleHQgdG8gdGhl IGxlZnQuIixjbHM6IngtaHRtbC1lZGl0b3ItdGlwIn0sanVzdGlmeWNlbnRlcjp7 dGl0bGU6IkNlbnRlciBUZXh0Iix0ZXh0OiJDZW50ZXIgdGV4dCBpbiB0aGUgZWRp dG9yLiIsY2xzOiJ4LWh0bWwtZWRpdG9yLXRpcCJ9LGp1c3RpZnlyaWdodDp7dGl0 bGU6IkFsaWduIFRleHQgUmlnaHQiLHRleHQ6IkFsaWduIHRleHQgdG8gdGhlIHJp Z2h0LiIsY2xzOiJ4LWh0bWwtZWRpdG9yLXRpcCJ9LGluc2VydHVub3JkZXJlZGxp c3Q6e3RpdGxlOiJCdWxsZXQgTGlzdCIsdGV4dDoiU3RhcnQgYSBidWxsZXRlZCBs aXN0LiIsY2xzOiJ4LWh0bWwtZWRpdG9yLXRpcCJ9LGluc2VydG9yZGVyZWRsaXN0 Ont0aXRsZToiTnVtYmVyZWQgTGlzdCIsdGV4dDoiU3RhcnQgYSBudW1iZXJlZCBs aXN0LiIsY2xzOiJ4LWh0bWwtZWRpdG9yLXRpcCJ9LGNyZWF0ZWxpbms6e3RpdGxl OiJIeXBlcmxpbmsiLHRleHQ6Ik1ha2UgdGhlIHNlbGVjdGVkIHRleHQgYSBoeXBl cmxpbmsuIixjbHM6IngtaHRtbC1lZGl0b3ItdGlwIn0sc291cmNlZWRpdDp7dGl0 bGU6IlNvdXJjZSBFZGl0Iix0ZXh0OiJTd2l0Y2ggdG8gc291cmNlIGVkaXRpbmcg bW9kZS4iLGNsczoieC1odG1sLWVkaXRvci10aXAifX19KTtFeHQucmVnKCJodG1s ZWRpdG9yIixFeHQuZm9ybS5IdG1sRWRpdG9yKTtFeHQuZm9ybS5UaW1lRmllbGQ9 RXh0LmV4dGVuZChFeHQuZm9ybS5Db21ib0JveCx7bWluVmFsdWU6dW5kZWZpbmVk LG1heFZhbHVlOnVuZGVmaW5lZCxtaW5UZXh0OiJUaGUgdGltZSBpbiB0aGlzIGZp ZWxkIG11c3QgYmUgZXF1YWwgdG8gb3IgYWZ0ZXIgezB9IixtYXhUZXh0OiJUaGUg dGltZSBpbiB0aGlzIGZpZWxkIG11c3QgYmUgZXF1YWwgdG8gb3IgYmVmb3JlIHsw fSIsaW52YWxpZFRleHQ6InswfSBpcyBub3QgYSB2YWxpZCB0aW1lIixmb3JtYXQ6 Imc6aSBBIixhbHRGb3JtYXRzOiJnOmlhfGc6aUF8ZzppIGF8ZzppIEF8aDppfGc6 aXxIOml8Z2F8aGF8Z0F8aCBhfGcgYXxnIEF8Z2l8aGl8Z2lhfGhpYXxnfEh8Z2kg YXxoaSBhfGdpQXxoaUF8Z2kgQXxoaSBBIixpbmNyZW1lbnQ6MTUsbW9kZToibG9j YWwiLHRyaWdnZXJBY3Rpb246ImFsbCIsdHlwZUFoZWFkOmZhbHNlLGluaXREYXRl OiIxLzEvMjAwOCIsaW5pdERhdGVGb3JtYXQ6Imovbi9ZIixpbml0Q29tcG9uZW50 OmZ1bmN0aW9uKCl7aWYoRXh0LmlzRGVmaW5lZCh0aGlzLm1pblZhbHVlKSl7dGhp cy5zZXRNaW5WYWx1ZSh0aGlzLm1pblZhbHVlLHRydWUpfWlmKEV4dC5pc0RlZmlu ZWQodGhpcy5tYXhWYWx1ZSkpe3RoaXMuc2V0TWF4VmFsdWUodGhpcy5tYXhWYWx1 ZSx0cnVlKX1pZighdGhpcy5zdG9yZSl7dGhpcy5nZW5lcmF0ZVN0b3JlKHRydWUp fUV4dC5mb3JtLlRpbWVGaWVsZC5zdXBlcmNsYXNzLmluaXRDb21wb25lbnQuY2Fs bCh0aGlzKX0sc2V0TWluVmFsdWU6ZnVuY3Rpb24oYixhKXt0aGlzLnNldExpbWl0 KGIsdHJ1ZSxhKTtyZXR1cm4gdGhpc30sc2V0TWF4VmFsdWU6ZnVuY3Rpb24oYixh KXt0aGlzLnNldExpbWl0KGIsZmFsc2UsYSk7cmV0dXJuIHRoaXN9LGdlbmVyYXRl U3RvcmU6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5taW5WYWx1ZXx8bmV3IERhdGUo dGhpcy5pbml0RGF0ZSkuY2xlYXJUaW1lKCksYT10aGlzLm1heFZhbHVlfHxuZXcg RGF0ZSh0aGlzLmluaXREYXRlKS5jbGVhclRpbWUoKS5hZGQoIm1pIiwoMjQqNjAp LTEpLGQ9W107d2hpbGUoYzw9YSl7ZC5wdXNoKGMuZGF0ZUZvcm1hdCh0aGlzLmZv cm1hdCkpO2M9Yy5hZGQoIm1pIix0aGlzLmluY3JlbWVudCl9dGhpcy5iaW5kU3Rv cmUoZCxiKX0sc2V0TGltaXQ6ZnVuY3Rpb24oYixnLGEpe3ZhciBlO2lmKEV4dC5p c1N0cmluZyhiKSl7ZT10aGlzLnBhcnNlRGF0ZShiKX1lbHNle2lmKEV4dC5pc0Rh dGUoYikpe2U9Yn19aWYoZSl7dmFyIGM9bmV3IERhdGUodGhpcy5pbml0RGF0ZSku Y2xlYXJUaW1lKCk7Yy5zZXRIb3VycyhlLmdldEhvdXJzKCksZS5nZXRNaW51dGVz KCksZS5nZXRTZWNvbmRzKCksZS5nZXRNaWxsaXNlY29uZHMoKSk7dGhpc1tnPyJt aW5WYWx1ZSI6Im1heFZhbHVlIl09YztpZighYSl7dGhpcy5nZW5lcmF0ZVN0b3Jl KCl9fX0sZ2V0VmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT1FeHQuZm9ybS5UaW1lRmll bGQuc3VwZXJjbGFzcy5nZXRWYWx1ZS5jYWxsKHRoaXMpO3JldHVybiB0aGlzLmZv cm1hdERhdGUodGhpcy5wYXJzZURhdGUoYSkpfHwiIn0sc2V0VmFsdWU6ZnVuY3Rp b24oYSl7cmV0dXJuIEV4dC5mb3JtLlRpbWVGaWVsZC5zdXBlcmNsYXNzLnNldFZh bHVlLmNhbGwodGhpcyx0aGlzLmZvcm1hdERhdGUodGhpcy5wYXJzZURhdGUoYSkp KX0sdmFsaWRhdGVWYWx1ZTpFeHQuZm9ybS5EYXRlRmllbGQucHJvdG90eXBlLnZh bGlkYXRlVmFsdWUsZm9ybWF0RGF0ZTpFeHQuZm9ybS5EYXRlRmllbGQucHJvdG90 eXBlLmZvcm1hdERhdGUscGFyc2VEYXRlOmZ1bmN0aW9uKGgpe2lmKCFofHxFeHQu aXNEYXRlKGgpKXtyZXR1cm4gaH12YXIgaj10aGlzLmluaXREYXRlKyIgIixnPXRo aXMuaW5pdERhdGVGb3JtYXQrIiAiLGI9RGF0ZS5wYXJzZURhdGUoaitoLGcrdGhp cy5mb3JtYXQpLGM9dGhpcy5hbHRGb3JtYXRzO2lmKCFiJiZjKXtpZighdGhpcy5h bHRGb3JtYXRzQXJyYXkpe3RoaXMuYWx0Rm9ybWF0c0FycmF5PWMuc3BsaXQoInwi KX1mb3IodmFyIGU9MCxkPXRoaXMuYWx0Rm9ybWF0c0FycmF5LGE9ZC5sZW5ndGg7 ZTxhJiYhYjtlKyspe2I9RGF0ZS5wYXJzZURhdGUoaitoLGcrZFtlXSl9fXJldHVy biBifX0pO0V4dC5yZWcoInRpbWVmaWVsZCIsRXh0LmZvcm0uVGltZUZpZWxkKTtF eHQuZm9ybS5TbGlkZXJGaWVsZD1FeHQuZXh0ZW5kKEV4dC5mb3JtLkZpZWxkLHt1 c2VUaXBzOnRydWUsdGlwVGV4dDpudWxsLGFjdGlvbk1vZGU6IndyYXAiLGluaXRD b21wb25lbnQ6ZnVuY3Rpb24oKXt2YXIgYj1FeHQuY29weVRvKHtpZDp0aGlzLmlk KyItc2xpZGVyIn0sdGhpcy5pbml0aWFsQ29uZmlnLFsidmVydGljYWwiLCJtaW5W YWx1ZSIsIm1heFZhbHVlIiwiZGVjaW1hbFByZWNpc2lvbiIsImtleUluY3JlbWVu dCIsImluY3JlbWVudCIsImNsaWNrVG9DaGFuZ2UiLCJhbmltYXRlIl0pO2lmKHRo aXMudXNlVGlwcyl7dmFyIGE9dGhpcy50aXBUZXh0P3tnZXRUZXh0OnRoaXMudGlw VGV4dH06e307Yi5wbHVnaW5zPVtuZXcgRXh0LnNsaWRlci5UaXAoYSldfXRoaXMu c2xpZGVyPW5ldyBFeHQuU2xpZGVyKGIpO0V4dC5mb3JtLlNsaWRlckZpZWxkLnN1 cGVyY2xhc3MuaW5pdENvbXBvbmVudC5jYWxsKHRoaXMpfSxvblJlbmRlcjpmdW5j dGlvbihiLGEpe3RoaXMuYXV0b0NyZWF0ZT17aWQ6dGhpcy5pZCxuYW1lOnRoaXMu bmFtZSx0eXBlOiJoaWRkZW4iLHRhZzoiaW5wdXQifTtFeHQuZm9ybS5TbGlkZXJG aWVsZC5zdXBlcmNsYXNzLm9uUmVuZGVyLmNhbGwodGhpcyxiLGEpO3RoaXMud3Jh cD10aGlzLmVsLndyYXAoe2NsczoieC1mb3JtLWZpZWxkLXdyYXAifSk7dGhpcy5y ZXNpemVFbD10aGlzLnBvc2l0aW9uRWw9dGhpcy53cmFwO3RoaXMuc2xpZGVyLnJl bmRlcih0aGlzLndyYXApfSxvblJlc2l6ZTpmdW5jdGlvbihiLGMsZCxhKXtFeHQu Zm9ybS5TbGlkZXJGaWVsZC5zdXBlcmNsYXNzLm9uUmVzaXplLmNhbGwodGhpcyxi LGMsZCxhKTt0aGlzLnNsaWRlci5zZXRTaXplKGIsYyl9LGluaXRFdmVudHM6ZnVu Y3Rpb24oKXtFeHQuZm9ybS5TbGlkZXJGaWVsZC5zdXBlcmNsYXNzLmluaXRFdmVu dHMuY2FsbCh0aGlzKTt0aGlzLnNsaWRlci5vbigiY2hhbmdlIix0aGlzLm9uQ2hh bmdlLHRoaXMpfSxvbkNoYW5nZTpmdW5jdGlvbihiLGEpe3RoaXMuc2V0VmFsdWUo YSx1bmRlZmluZWQsdHJ1ZSl9LG9uRW5hYmxlOmZ1bmN0aW9uKCl7RXh0LmZvcm0u U2xpZGVyRmllbGQuc3VwZXJjbGFzcy5vbkVuYWJsZS5jYWxsKHRoaXMpO3RoaXMu c2xpZGVyLmVuYWJsZSgpfSxvbkRpc2FibGU6ZnVuY3Rpb24oKXtFeHQuZm9ybS5T bGlkZXJGaWVsZC5zdXBlcmNsYXNzLm9uRGlzYWJsZS5jYWxsKHRoaXMpO3RoaXMu c2xpZGVyLmRpc2FibGUoKX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe0V4dC5k ZXN0cm95KHRoaXMuc2xpZGVyKTtFeHQuZm9ybS5TbGlkZXJGaWVsZC5zdXBlcmNs YXNzLmJlZm9yZURlc3Ryb3kuY2FsbCh0aGlzKX0sYWxpZ25FcnJvckljb246ZnVu Y3Rpb24oKXt0aGlzLmVycm9ySWNvbi5hbGlnblRvKHRoaXMuc2xpZGVyLmVsLCJ0 bC10ciIsWzIsMF0pfSxzZXRNaW5WYWx1ZTpmdW5jdGlvbihhKXt0aGlzLnNsaWRl ci5zZXRNaW5WYWx1ZShhKTtyZXR1cm4gdGhpc30sc2V0TWF4VmFsdWU6ZnVuY3Rp b24oYSl7dGhpcy5zbGlkZXIuc2V0TWF4VmFsdWUoYSk7cmV0dXJuIHRoaXN9LHNl dFZhbHVlOmZ1bmN0aW9uKGMsYixhKXtpZighYSl7dGhpcy5zbGlkZXIuc2V0VmFs dWUoYyxiKX1yZXR1cm4gRXh0LmZvcm0uU2xpZGVyRmllbGQuc3VwZXJjbGFzcy5z ZXRWYWx1ZS5jYWxsKHRoaXMsdGhpcy5zbGlkZXIuZ2V0VmFsdWUoKSl9LGdldFZh bHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2xpZGVyLmdldFZhbHVlKCl9fSk7 RXh0LnJlZygic2xpZGVyZmllbGQiLEV4dC5mb3JtLlNsaWRlckZpZWxkKTtFeHQu Zm9ybS5MYWJlbD1FeHQuZXh0ZW5kKEV4dC5Cb3hDb21wb25lbnQse29uUmVuZGVy OmZ1bmN0aW9uKGIsYSl7aWYoIXRoaXMuZWwpe3RoaXMuZWw9ZG9jdW1lbnQuY3Jl YXRlRWxlbWVudCgibGFiZWwiKTt0aGlzLmVsLmlkPXRoaXMuZ2V0SWQoKTt0aGlz LmVsLmlubmVySFRNTD10aGlzLnRleHQ/RXh0LnV0aWwuRm9ybWF0Lmh0bWxFbmNv ZGUodGhpcy50ZXh0KToodGhpcy5odG1sfHwiIik7aWYodGhpcy5mb3JJZCl7dGhp cy5lbC5zZXRBdHRyaWJ1dGUoImZvciIsdGhpcy5mb3JJZCl9fUV4dC5mb3JtLkxh YmVsLnN1cGVyY2xhc3Mub25SZW5kZXIuY2FsbCh0aGlzLGIsYSl9LHNldFRleHQ6 ZnVuY3Rpb24oYSxiKXt2YXIgYz1iPT09ZmFsc2U7dGhpc1shYz8idGV4dCI6Imh0 bWwiXT1hO2RlbGV0ZSB0aGlzW2M/InRleHQiOiJodG1sIl07aWYodGhpcy5yZW5k ZXJlZCl7dGhpcy5lbC5kb20uaW5uZXJIVE1MPWIhPT1mYWxzZT9FeHQudXRpbC5G b3JtYXQuaHRtbEVuY29kZShhKTphfXJldHVybiB0aGlzfX0pO0V4dC5yZWcoImxh YmVsIixFeHQuZm9ybS5MYWJlbCk7RXh0LmZvcm0uQWN0aW9uPWZ1bmN0aW9uKGIs YSl7dGhpcy5mb3JtPWI7dGhpcy5vcHRpb25zPWF8fHt9fTtFeHQuZm9ybS5BY3Rp b24uQ0xJRU5UX0lOVkFMSUQ9ImNsaWVudCI7RXh0LmZvcm0uQWN0aW9uLlNFUlZF Ul9JTlZBTElEPSJzZXJ2ZXIiO0V4dC5mb3JtLkFjdGlvbi5DT05ORUNUX0ZBSUxV UkU9ImNvbm5lY3QiO0V4dC5mb3JtLkFjdGlvbi5MT0FEX0ZBSUxVUkU9ImxvYWQi O0V4dC5mb3JtLkFjdGlvbi5wcm90b3R5cGU9e3R5cGU6ImRlZmF1bHQiLHJ1bjpm dW5jdGlvbihhKXt9LHN1Y2Nlc3M6ZnVuY3Rpb24oYSl7fSxoYW5kbGVSZXNwb25z ZTpmdW5jdGlvbihhKXt9LGZhaWx1cmU6ZnVuY3Rpb24oYSl7dGhpcy5yZXNwb25z ZT1hO3RoaXMuZmFpbHVyZVR5cGU9RXh0LmZvcm0uQWN0aW9uLkNPTk5FQ1RfRkFJ TFVSRTt0aGlzLmZvcm0uYWZ0ZXJBY3Rpb24odGhpcyxmYWxzZSl9LHByb2Nlc3NS ZXNwb25zZTpmdW5jdGlvbihhKXt0aGlzLnJlc3BvbnNlPWE7aWYoIWEucmVzcG9u c2VUZXh0JiYhYS5yZXNwb25zZVhNTCl7cmV0dXJuIHRydWV9dGhpcy5yZXN1bHQ9 dGhpcy5oYW5kbGVSZXNwb25zZShhKTtyZXR1cm4gdGhpcy5yZXN1bHR9LGRlY29k ZVJlc3BvbnNlOmZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4gRXh0LmRlY29kZShhLnJl c3BvbnNlVGV4dCl9Y2F0Y2goYil7cmV0dXJuIGZhbHNlfX0sZ2V0VXJsOmZ1bmN0 aW9uKGMpe3ZhciBhPXRoaXMub3B0aW9ucy51cmx8fHRoaXMuZm9ybS51cmx8fHRo aXMuZm9ybS5lbC5kb20uYWN0aW9uO2lmKGMpe3ZhciBiPXRoaXMuZ2V0UGFyYW1z KCk7aWYoYil7YT1FeHQudXJsQXBwZW5kKGEsYil9fXJldHVybiBhfSxnZXRNZXRo b2Q6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5vcHRpb25zLm1ldGhvZHx8dGhpcy5m b3JtLm1ldGhvZHx8dGhpcy5mb3JtLmVsLmRvbS5tZXRob2R8fCJQT1NUIikudG9V cHBlckNhc2UoKX0sZ2V0UGFyYW1zOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5mb3Jt LmJhc2VQYXJhbXM7dmFyIGI9dGhpcy5vcHRpb25zLnBhcmFtcztpZihiKXtpZih0 eXBlb2YgYj09Im9iamVjdCIpe2I9RXh0LnVybEVuY29kZShFeHQuYXBwbHlJZihi LGEpKX1lbHNle2lmKHR5cGVvZiBiPT0ic3RyaW5nIiYmYSl7Yis9IiYiK0V4dC51 cmxFbmNvZGUoYSl9fX1lbHNle2lmKGEpe2I9RXh0LnVybEVuY29kZShhKX19cmV0 dXJuIGJ9LGNyZWF0ZUNhbGxiYWNrOmZ1bmN0aW9uKGEpe3ZhciBhPWF8fHt9O3Jl dHVybntzdWNjZXNzOnRoaXMuc3VjY2VzcyxmYWlsdXJlOnRoaXMuZmFpbHVyZSxz Y29wZTp0aGlzLHRpbWVvdXQ6KGEudGltZW91dCoxMDAwKXx8KHRoaXMuZm9ybS50 aW1lb3V0KjEwMDApLHVwbG9hZDp0aGlzLmZvcm0uZmlsZVVwbG9hZD90aGlzLnN1 Y2Nlc3M6dW5kZWZpbmVkfX19O0V4dC5mb3JtLkFjdGlvbi5TdWJtaXQ9ZnVuY3Rp b24oYixhKXtFeHQuZm9ybS5BY3Rpb24uU3VibWl0LnN1cGVyY2xhc3MuY29uc3Ry dWN0b3IuY2FsbCh0aGlzLGIsYSl9O0V4dC5leHRlbmQoRXh0LmZvcm0uQWN0aW9u LlN1Ym1pdCxFeHQuZm9ybS5BY3Rpb24se3R5cGU6InN1Ym1pdCIscnVuOmZ1bmN0 aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zLGc9dGhpcy5nZXRNZXRob2QoKSxkPWc9 PSJHRVQiO2lmKGUuY2xpZW50VmFsaWRhdGlvbj09PWZhbHNlfHx0aGlzLmZvcm0u aXNWYWxpZCgpKXtpZihlLnN1Ym1pdEVtcHR5VGV4dD09PWZhbHNlKXt2YXIgYT10 aGlzLmZvcm0uaXRlbXMsYz1bXSxiPWZ1bmN0aW9uKGgpe2lmKGguZWwuZ2V0VmFs dWUoKT09aC5lbXB0eVRleHQpe2MucHVzaChoKTtoLmVsLmRvbS52YWx1ZT0iIn1p ZihoLmlzQ29tcG9zaXRlJiZoLnJlbmRlcmVkKXtoLml0ZW1zLmVhY2goYil9fTth LmVhY2goYil9RXh0LkFqYXgucmVxdWVzdChFeHQuYXBwbHkodGhpcy5jcmVhdGVD YWxsYmFjayhlKSx7Zm9ybTp0aGlzLmZvcm0uZWwuZG9tLHVybDp0aGlzLmdldFVy bChkKSxtZXRob2Q6ZyxoZWFkZXJzOmUuaGVhZGVycyxwYXJhbXM6IWQ/dGhpcy5n ZXRQYXJhbXMoKTpudWxsLGlzVXBsb2FkOnRoaXMuZm9ybS5maWxlVXBsb2FkfSkp O2lmKGUuc3VibWl0RW1wdHlUZXh0PT09ZmFsc2Upe0V4dC5lYWNoKGMsZnVuY3Rp b24oaCl7aWYoaC5hcHBseUVtcHR5VGV4dCl7aC5hcHBseUVtcHR5VGV4dCgpfX0p fX1lbHNle2lmKGUuY2xpZW50VmFsaWRhdGlvbiE9PWZhbHNlKXt0aGlzLmZhaWx1 cmVUeXBlPUV4dC5mb3JtLkFjdGlvbi5DTElFTlRfSU5WQUxJRDt0aGlzLmZvcm0u YWZ0ZXJBY3Rpb24odGhpcyxmYWxzZSl9fX0sc3VjY2VzczpmdW5jdGlvbihiKXt2 YXIgYT10aGlzLnByb2Nlc3NSZXNwb25zZShiKTtpZihhPT09dHJ1ZXx8YS5zdWNj ZXNzKXt0aGlzLmZvcm0uYWZ0ZXJBY3Rpb24odGhpcyx0cnVlKTtyZXR1cm59aWYo YS5lcnJvcnMpe3RoaXMuZm9ybS5tYXJrSW52YWxpZChhLmVycm9ycyl9dGhpcy5m YWlsdXJlVHlwZT1FeHQuZm9ybS5BY3Rpb24uU0VSVkVSX0lOVkFMSUQ7dGhpcy5m b3JtLmFmdGVyQWN0aW9uKHRoaXMsZmFsc2UpfSxoYW5kbGVSZXNwb25zZTpmdW5j dGlvbihjKXtpZih0aGlzLmZvcm0uZXJyb3JSZWFkZXIpe3ZhciBiPXRoaXMuZm9y bS5lcnJvclJlYWRlci5yZWFkKGMpO3ZhciBnPVtdO2lmKGIucmVjb3Jkcyl7Zm9y KHZhciBkPTAsYT1iLnJlY29yZHMubGVuZ3RoO2Q8YTtkKyspe3ZhciBlPWIucmVj b3Jkc1tkXTtnW2RdPWUuZGF0YX19aWYoZy5sZW5ndGg8MSl7Zz1udWxsfXJldHVy bntzdWNjZXNzOmIuc3VjY2VzcyxlcnJvcnM6Z319cmV0dXJuIHRoaXMuZGVjb2Rl UmVzcG9uc2UoYyl9fSk7RXh0LmZvcm0uQWN0aW9uLkxvYWQ9ZnVuY3Rpb24oYixh KXtFeHQuZm9ybS5BY3Rpb24uTG9hZC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNh bGwodGhpcyxiLGEpO3RoaXMucmVhZGVyPXRoaXMuZm9ybS5yZWFkZXJ9O0V4dC5l eHRlbmQoRXh0LmZvcm0uQWN0aW9uLkxvYWQsRXh0LmZvcm0uQWN0aW9uLHt0eXBl OiJsb2FkIixydW46ZnVuY3Rpb24oKXtFeHQuQWpheC5yZXF1ZXN0KEV4dC5hcHBs eSh0aGlzLmNyZWF0ZUNhbGxiYWNrKHRoaXMub3B0aW9ucykse21ldGhvZDp0aGlz LmdldE1ldGhvZCgpLHVybDp0aGlzLmdldFVybChmYWxzZSksaGVhZGVyczp0aGlz Lm9wdGlvbnMuaGVhZGVycyxwYXJhbXM6dGhpcy5nZXRQYXJhbXMoKX0pKX0sc3Vj Y2VzczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnByb2Nlc3NSZXNwb25zZShiKTtp ZihhPT09dHJ1ZXx8IWEuc3VjY2Vzc3x8IWEuZGF0YSl7dGhpcy5mYWlsdXJlVHlw ZT1FeHQuZm9ybS5BY3Rpb24uTE9BRF9GQUlMVVJFO3RoaXMuZm9ybS5hZnRlckFj dGlvbih0aGlzLGZhbHNlKTtyZXR1cm59dGhpcy5mb3JtLmNsZWFySW52YWxpZCgp O3RoaXMuZm9ybS5zZXRWYWx1ZXMoYS5kYXRhKTt0aGlzLmZvcm0uYWZ0ZXJBY3Rp b24odGhpcyx0cnVlKX0saGFuZGxlUmVzcG9uc2U6ZnVuY3Rpb24oYil7aWYodGhp cy5mb3JtLnJlYWRlcil7dmFyIGE9dGhpcy5mb3JtLnJlYWRlci5yZWFkKGIpO3Zh ciBjPWEucmVjb3JkcyYmYS5yZWNvcmRzWzBdP2EucmVjb3Jkc1swXS5kYXRhOm51 bGw7cmV0dXJue3N1Y2Nlc3M6YS5zdWNjZXNzLGRhdGE6Y319cmV0dXJuIHRoaXMu ZGVjb2RlUmVzcG9uc2UoYil9fSk7RXh0LmZvcm0uQWN0aW9uLkRpcmVjdExvYWQ9 RXh0LmV4dGVuZChFeHQuZm9ybS5BY3Rpb24uTG9hZCx7Y29uc3RydWN0b3I6ZnVu Y3Rpb24oYixhKXtFeHQuZm9ybS5BY3Rpb24uRGlyZWN0TG9hZC5zdXBlcmNsYXNz LmNvbnN0cnVjdG9yLmNhbGwodGhpcyxiLGEpfSx0eXBlOiJkaXJlY3Rsb2FkIixy dW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBhcmFtcygpO2EucHVzaCh0aGlz LnN1Y2Nlc3MsdGhpcyk7dGhpcy5mb3JtLmFwaS5sb2FkLmFwcGx5KHdpbmRvdyxh KX0sZ2V0UGFyYW1zOmZ1bmN0aW9uKCl7dmFyIGM9W10saD17fTt2YXIgZT10aGlz LmZvcm0uYmFzZVBhcmFtczt2YXIgZz10aGlzLm9wdGlvbnMucGFyYW1zO0V4dC5h cHBseShoLGcsZSk7dmFyIGI9dGhpcy5mb3JtLnBhcmFtT3JkZXI7aWYoYil7Zm9y KHZhciBkPTAsYT1iLmxlbmd0aDtkPGE7ZCsrKXtjLnB1c2goaFtiW2RdXSl9fWVs c2V7aWYodGhpcy5mb3JtLnBhcmFtc0FzSGFzaCl7Yy5wdXNoKGgpfX1yZXR1cm4g Y30scHJvY2Vzc1Jlc3BvbnNlOmZ1bmN0aW9uKGEpe3RoaXMucmVzdWx0PWE7cmV0 dXJuIGF9LHN1Y2Nlc3M6ZnVuY3Rpb24oYSxiKXtpZihiLnR5cGU9PUV4dC5EaXJl Y3QuZXhjZXB0aW9ucy5TRVJWRVIpe2E9e319RXh0LmZvcm0uQWN0aW9uLkRpcmVj dExvYWQuc3VwZXJjbGFzcy5zdWNjZXNzLmNhbGwodGhpcyxhKX19KTtFeHQuZm9y bS5BY3Rpb24uRGlyZWN0U3VibWl0PUV4dC5leHRlbmQoRXh0LmZvcm0uQWN0aW9u LlN1Ym1pdCx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYixhKXtFeHQuZm9ybS5BY3Rp b24uRGlyZWN0U3VibWl0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlz LGIsYSl9LHR5cGU6ImRpcmVjdHN1Ym1pdCIscnVuOmZ1bmN0aW9uKCl7dmFyIGE9 dGhpcy5vcHRpb25zO2lmKGEuY2xpZW50VmFsaWRhdGlvbj09PWZhbHNlfHx0aGlz LmZvcm0uaXNWYWxpZCgpKXt0aGlzLnN1Y2Nlc3MucGFyYW1zPXRoaXMuZ2V0UGFy YW1zKCk7dGhpcy5mb3JtLmFwaS5zdWJtaXQodGhpcy5mb3JtLmVsLmRvbSx0aGlz LnN1Y2Nlc3MsdGhpcyl9ZWxzZXtpZihhLmNsaWVudFZhbGlkYXRpb24hPT1mYWxz ZSl7dGhpcy5mYWlsdXJlVHlwZT1FeHQuZm9ybS5BY3Rpb24uQ0xJRU5UX0lOVkFM SUQ7dGhpcy5mb3JtLmFmdGVyQWN0aW9uKHRoaXMsZmFsc2UpfX19LGdldFBhcmFt czpmdW5jdGlvbigpe3ZhciBjPXt9O3ZhciBhPXRoaXMuZm9ybS5iYXNlUGFyYW1z O3ZhciBiPXRoaXMub3B0aW9ucy5wYXJhbXM7RXh0LmFwcGx5KGMsYixhKTtyZXR1 cm4gY30scHJvY2Vzc1Jlc3BvbnNlOmZ1bmN0aW9uKGEpe3RoaXMucmVzdWx0PWE7 cmV0dXJuIGF9LHN1Y2Nlc3M6ZnVuY3Rpb24oYSxiKXtpZihiLnR5cGU9PUV4dC5E aXJlY3QuZXhjZXB0aW9ucy5TRVJWRVIpe2E9e319RXh0LmZvcm0uQWN0aW9uLkRp cmVjdFN1Ym1pdC5zdXBlcmNsYXNzLnN1Y2Nlc3MuY2FsbCh0aGlzLGEpfX0pO0V4 dC5mb3JtLkFjdGlvbi5BQ1RJT05fVFlQRVM9e2xvYWQ6RXh0LmZvcm0uQWN0aW9u LkxvYWQsc3VibWl0OkV4dC5mb3JtLkFjdGlvbi5TdWJtaXQsZGlyZWN0bG9hZDpF eHQuZm9ybS5BY3Rpb24uRGlyZWN0TG9hZCxkaXJlY3RzdWJtaXQ6RXh0LmZvcm0u QWN0aW9uLkRpcmVjdFN1Ym1pdH07RXh0LmZvcm0uVlR5cGVzPWZ1bmN0aW9uKCl7 dmFyIGM9L15bYS16QS1aX10rJC8sZD0vXlthLXpBLVowLTlfXSskLyxiPS9eKFx3 KykoW1wtKy5cJ11bXHddKykqQChcd1tcLVx3XSpcLil7MSw1fShbQS1aYS16XSl7 Miw2fSQvLGE9LygoKF5odHRwcz8pfCheZnRwKSk6XC9cLyhbXC1cd10rXC4pK1x3 ezIsM30oXC9bJVwtXHddKyhcLlx3ezIsfSk/KSooKFtcd1wtXC5cP1xcXC8rQCYj O2B+PSUhXSopKFwuXHd7Mix9KT8pKlwvPykvaTtyZXR1cm57ZW1haWw6ZnVuY3Rp b24oZSl7cmV0dXJuIGIudGVzdChlKX0sZW1haWxUZXh0OidUaGlzIGZpZWxkIHNo b3VsZCBiZSBhbiBlLW1haWwgYWRkcmVzcyBpbiB0aGUgZm9ybWF0ICJ1c2VyQGV4 YW1wbGUuY29tIicsZW1haWxNYXNrOi9bYS16MC05X1wuXC1cK1wnQF0vaSx1cmw6 ZnVuY3Rpb24oZSl7cmV0dXJuIGEudGVzdChlKX0sdXJsVGV4dDonVGhpcyBmaWVs ZCBzaG91bGQgYmUgYSBVUkwgaW4gdGhlIGZvcm1hdCAiaHR0cDovL3d3dy5leGFt cGxlLmNvbSInLGFscGhhOmZ1bmN0aW9uKGUpe3JldHVybiBjLnRlc3QoZSl9LGFs cGhhVGV4dDoiVGhpcyBmaWVsZCBzaG91bGQgb25seSBjb250YWluIGxldHRlcnMg YW5kIF8iLGFscGhhTWFzazovW2Etel9dL2ksYWxwaGFudW06ZnVuY3Rpb24oZSl7 cmV0dXJuIGQudGVzdChlKX0sYWxwaGFudW1UZXh0OiJUaGlzIGZpZWxkIHNob3Vs ZCBvbmx5IGNvbnRhaW4gbGV0dGVycywgbnVtYmVycyBhbmQgXyIsYWxwaGFudW1N YXNrOi9bYS16MC05X10vaX19KCk7RXh0LmdyaWQuR3JpZFBhbmVsPUV4dC5leHRl bmQoRXh0LlBhbmVsLHthdXRvRXhwYW5kQ29sdW1uOmZhbHNlLGF1dG9FeHBhbmRN YXg6MTAwMCxhdXRvRXhwYW5kTWluOjUwLGNvbHVtbkxpbmVzOmZhbHNlLGRkVGV4 dDoiezB9IHNlbGVjdGVkIHJvd3sxfSIsZGVmZXJSb3dSZW5kZXI6dHJ1ZSxlbmFi bGVDb2x1bW5IaWRlOnRydWUsZW5hYmxlQ29sdW1uTW92ZTp0cnVlLGVuYWJsZURy YWdEcm9wOmZhbHNlLGVuYWJsZUhkTWVudTp0cnVlLGxvYWRNYXNrOmZhbHNlLG1p bkNvbHVtbldpZHRoOjI1LHN0cmlwZVJvd3M6ZmFsc2UsdHJhY2tNb3VzZU92ZXI6 dHJ1ZSxzdGF0ZUV2ZW50czpbImNvbHVtbm1vdmUiLCJjb2x1bW5yZXNpemUiLCJz b3J0Y2hhbmdlIiwiZ3JvdXBjaGFuZ2UiXSx2aWV3Om51bGwsYnViYmxlRXZlbnRz OltdLHJlbmRlcmVkOmZhbHNlLHZpZXdSZWFkeTpmYWxzZSxpbml0Q29tcG9uZW50 OmZ1bmN0aW9uKCl7RXh0LmdyaWQuR3JpZFBhbmVsLnN1cGVyY2xhc3MuaW5pdENv bXBvbmVudC5jYWxsKHRoaXMpO2lmKHRoaXMuY29sdW1uTGluZXMpe3RoaXMuY2xz PSh0aGlzLmNsc3x8IiIpKyIgeC1ncmlkLXdpdGgtY29sLWxpbmVzIn10aGlzLmF1 dG9TY3JvbGw9ZmFsc2U7dGhpcy5hdXRvV2lkdGg9ZmFsc2U7aWYoRXh0LmlzQXJy YXkodGhpcy5jb2x1bW5zKSl7dGhpcy5jb2xNb2RlbD1uZXcgRXh0LmdyaWQuQ29s dW1uTW9kZWwodGhpcy5jb2x1bW5zKTtkZWxldGUgdGhpcy5jb2x1bW5zfWlmKHRo aXMuZHMpe3RoaXMuc3RvcmU9dGhpcy5kcztkZWxldGUgdGhpcy5kc31pZih0aGlz LmNtKXt0aGlzLmNvbE1vZGVsPXRoaXMuY207ZGVsZXRlIHRoaXMuY219aWYodGhp cy5zbSl7dGhpcy5zZWxNb2RlbD10aGlzLnNtO2RlbGV0ZSB0aGlzLnNtfXRoaXMu c3RvcmU9RXh0LlN0b3JlTWdyLmxvb2t1cCh0aGlzLnN0b3JlKTt0aGlzLmFkZEV2 ZW50cygiY2xpY2siLCJkYmxjbGljayIsImNvbnRleHRtZW51IiwibW91c2Vkb3du IiwibW91c2V1cCIsIm1vdXNlb3ZlciIsIm1vdXNlb3V0Iiwia2V5cHJlc3MiLCJr ZXlkb3duIiwiY2VsbG1vdXNlZG93biIsInJvd21vdXNlZG93biIsImhlYWRlcm1v dXNlZG93biIsImdyb3VwbW91c2Vkb3duIiwicm93Ym9keW1vdXNlZG93biIsImNv bnRhaW5lcm1vdXNlZG93biIsImNlbGxjbGljayIsImNlbGxkYmxjbGljayIsInJv d2NsaWNrIiwicm93ZGJsY2xpY2siLCJoZWFkZXJjbGljayIsImhlYWRlcmRibGNs aWNrIiwiZ3JvdXBjbGljayIsImdyb3VwZGJsY2xpY2siLCJjb250YWluZXJjbGlj ayIsImNvbnRhaW5lcmRibGNsaWNrIiwicm93Ym9keWNsaWNrIiwicm93Ym9keWRi bGNsaWNrIiwicm93Y29udGV4dG1lbnUiLCJjZWxsY29udGV4dG1lbnUiLCJoZWFk ZXJjb250ZXh0bWVudSIsImdyb3VwY29udGV4dG1lbnUiLCJjb250YWluZXJjb250 ZXh0bWVudSIsInJvd2JvZHljb250ZXh0bWVudSIsImJvZHlzY3JvbGwiLCJjb2x1 bW5yZXNpemUiLCJjb2x1bW5tb3ZlIiwic29ydGNoYW5nZSIsImdyb3VwY2hhbmdl IiwicmVjb25maWd1cmUiLCJ2aWV3cmVhZHkiKX0sb25SZW5kZXI6ZnVuY3Rpb24o ZCxhKXtFeHQuZ3JpZC5HcmlkUGFuZWwuc3VwZXJjbGFzcy5vblJlbmRlci5hcHBs eSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9dGhpcy5nZXRHcmlkRWwoKTt0aGlzLmVs LmFkZENsYXNzKCJ4LWdyaWQtcGFuZWwiKTt0aGlzLm1vbihlLHtzY29wZTp0aGlz LG1vdXNlZG93bjp0aGlzLm9uTW91c2VEb3duLGNsaWNrOnRoaXMub25DbGljayxk YmxjbGljazp0aGlzLm9uRGJsQ2xpY2ssY29udGV4dG1lbnU6dGhpcy5vbkNvbnRl eHRNZW51fSk7dGhpcy5yZWxheUV2ZW50cyhlLFsibW91c2Vkb3duIiwibW91c2V1 cCIsIm1vdXNlb3ZlciIsIm1vdXNlb3V0Iiwia2V5cHJlc3MiLCJrZXlkb3duIl0p O3ZhciBiPXRoaXMuZ2V0VmlldygpO2IuaW5pdCh0aGlzKTtiLnJlbmRlcigpO3Ro aXMuZ2V0U2VsZWN0aW9uTW9kZWwoKS5pbml0KHRoaXMpfSxpbml0RXZlbnRzOmZ1 bmN0aW9uKCl7RXh0LmdyaWQuR3JpZFBhbmVsLnN1cGVyY2xhc3MuaW5pdEV2ZW50 cy5jYWxsKHRoaXMpO2lmKHRoaXMubG9hZE1hc2spe3RoaXMubG9hZE1hc2s9bmV3 IEV4dC5Mb2FkTWFzayh0aGlzLmJ3cmFwLEV4dC5hcHBseSh7c3RvcmU6dGhpcy5z dG9yZX0sdGhpcy5sb2FkTWFzaykpfX0saW5pdFN0YXRlRXZlbnRzOmZ1bmN0aW9u KCl7RXh0LmdyaWQuR3JpZFBhbmVsLnN1cGVyY2xhc3MuaW5pdFN0YXRlRXZlbnRz LmNhbGwodGhpcyk7dGhpcy5tb24odGhpcy5jb2xNb2RlbCwiaGlkZGVuY2hhbmdl Iix0aGlzLnNhdmVTdGF0ZSx0aGlzLHtkZWxheToxMDB9KX0sYXBwbHlTdGF0ZTpm dW5jdGlvbihhKXt2YXIgaz10aGlzLmNvbE1vZGVsLGc9YS5jb2x1bW5zLGo9dGhp cy5zdG9yZSxtLGgsbDtpZihnKXtmb3IodmFyIGQ9MCxlPWcubGVuZ3RoO2Q8ZTtk Kyspe209Z1tkXTtoPWsuZ2V0Q29sdW1uQnlJZChtLmlkKTtpZihoKXtsPWsuZ2V0 SW5kZXhCeUlkKG0uaWQpO2suc2V0U3RhdGUobCx7aGlkZGVuOm0uaGlkZGVuLHdp ZHRoOm0ud2lkdGgsc29ydGFibGU6bS5zb3J0YWJsZX0pO2lmKGwhPWQpe2subW92 ZUNvbHVtbihsLGQpfX19fWlmKGope209YS5zb3J0O2lmKG0pe2pbai5yZW1vdGVT b3J0PyJzZXREZWZhdWx0U29ydCI6InNvcnQiXShtLmZpZWxkLG0uZGlyZWN0aW9u KX1tPWEuZ3JvdXA7aWYoai5ncm91cEJ5KXtpZihtKXtqLmdyb3VwQnkobSl9ZWxz ZXtqLmNsZWFyR3JvdXBpbmcoKX19fXZhciBiPUV4dC5hcHBseSh7fSxhKTtkZWxl dGUgYi5jb2x1bW5zO2RlbGV0ZSBiLnNvcnQ7RXh0LmdyaWQuR3JpZFBhbmVsLnN1 cGVyY2xhc3MuYXBwbHlTdGF0ZS5jYWxsKHRoaXMsYil9LGdldFN0YXRlOmZ1bmN0 aW9uKCl7dmFyIGc9e2NvbHVtbnM6W119LGI9dGhpcy5zdG9yZSxlLGE7Zm9yKHZh ciBkPTAsaDsoaD10aGlzLmNvbE1vZGVsLmNvbmZpZ1tkXSk7ZCsrKXtnLmNvbHVt bnNbZF09e2lkOmguaWQsd2lkdGg6aC53aWR0aH07aWYoaC5oaWRkZW4pe2cuY29s dW1uc1tkXS5oaWRkZW49dHJ1ZX1pZihoLnNvcnRhYmxlKXtnLmNvbHVtbnNbZF0u c29ydGFibGU9dHJ1ZX19aWYoYil7ZT1iLmdldFNvcnRTdGF0ZSgpO2lmKGUpe2cu c29ydD1lfWlmKGIuZ2V0R3JvdXBTdGF0ZSl7YT1iLmdldEdyb3VwU3RhdGUoKTtp ZihhKXtnLmdyb3VwPWF9fX1yZXR1cm4gZ30sYWZ0ZXJSZW5kZXI6ZnVuY3Rpb24o KXtFeHQuZ3JpZC5HcmlkUGFuZWwuc3VwZXJjbGFzcy5hZnRlclJlbmRlci5jYWxs KHRoaXMpO3ZhciBhPXRoaXMudmlldzt0aGlzLm9uKCJib2R5cmVzaXplIixhLmxh eW91dCxhKTthLmxheW91dCh0cnVlKTtpZih0aGlzLmRlZmVyUm93UmVuZGVyKXtp ZighdGhpcy5kZWZlclJvd1JlbmRlclRhc2spe3RoaXMuZGVmZXJSb3dSZW5kZXJU YXNrPW5ldyBFeHQudXRpbC5EZWxheWVkVGFzayhhLmFmdGVyUmVuZGVyLHRoaXMu dmlldyl9dGhpcy5kZWZlclJvd1JlbmRlclRhc2suZGVsYXkoMTApfWVsc2V7YS5h ZnRlclJlbmRlcigpfXRoaXMudmlld1JlYWR5PXRydWV9LHJlY29uZmlndXJlOmZ1 bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5yZW5kZXJlZDtpZihjKXtpZih0aGlzLmxv YWRNYXNrKXt0aGlzLmxvYWRNYXNrLmRlc3Ryb3koKTt0aGlzLmxvYWRNYXNrPW5l dyBFeHQuTG9hZE1hc2sodGhpcy5id3JhcCxFeHQuYXBwbHkoe30se3N0b3JlOmF9 LHRoaXMuaW5pdGlhbENvbmZpZy5sb2FkTWFzaykpfX1pZih0aGlzLnZpZXcpe3Ro aXMudmlldy5pbml0RGF0YShhLGIpfXRoaXMuc3RvcmU9YTt0aGlzLmNvbE1vZGVs PWI7aWYoYyl7dGhpcy52aWV3LnJlZnJlc2godHJ1ZSl9dGhpcy5maXJlRXZlbnQo InJlY29uZmlndXJlIix0aGlzLGEsYil9LG9uRGVzdHJveTpmdW5jdGlvbigpe2lm KHRoaXMuZGVmZXJSb3dSZW5kZXJUYXNrJiZ0aGlzLmRlZmVyUm93UmVuZGVyVGFz ay5jYW5jZWwpe3RoaXMuZGVmZXJSb3dSZW5kZXJUYXNrLmNhbmNlbCgpfWlmKHRo aXMucmVuZGVyZWQpe0V4dC5kZXN0cm95KHRoaXMudmlldyx0aGlzLmxvYWRNYXNr KX1lbHNle2lmKHRoaXMuc3RvcmUmJnRoaXMuc3RvcmUuYXV0b0Rlc3Ryb3kpe3Ro aXMuc3RvcmUuZGVzdHJveSgpfX1FeHQuZGVzdHJveSh0aGlzLmNvbE1vZGVsLHRo aXMuc2VsTW9kZWwpO3RoaXMuc3RvcmU9dGhpcy5zZWxNb2RlbD10aGlzLmNvbE1v ZGVsPXRoaXMudmlldz10aGlzLmxvYWRNYXNrPW51bGw7RXh0LmdyaWQuR3JpZFBh bmVsLnN1cGVyY2xhc3Mub25EZXN0cm95LmNhbGwodGhpcyl9LHByb2Nlc3NFdmVu dDpmdW5jdGlvbihhLGIpe3RoaXMudmlldy5wcm9jZXNzRXZlbnQoYSxiKX0sb25D bGljazpmdW5jdGlvbihhKXt0aGlzLnByb2Nlc3NFdmVudCgiY2xpY2siLGEpfSxv bk1vdXNlRG93bjpmdW5jdGlvbihhKXt0aGlzLnByb2Nlc3NFdmVudCgibW91c2Vk b3duIixhKX0sb25Db250ZXh0TWVudTpmdW5jdGlvbihiLGEpe3RoaXMucHJvY2Vz c0V2ZW50KCJjb250ZXh0bWVudSIsYil9LG9uRGJsQ2xpY2s6ZnVuY3Rpb24oYSl7 dGhpcy5wcm9jZXNzRXZlbnQoImRibGNsaWNrIixhKX0sd2Fsa0NlbGxzOmZ1bmN0 aW9uKGssYyxiLGUsail7dmFyIGk9dGhpcy5jb2xNb2RlbCxnPWkuZ2V0Q29sdW1u Q291bnQoKSxhPXRoaXMuc3RvcmUsaD1hLmdldENvdW50KCksZD10cnVlO2lmKGI8 MCl7aWYoYzwwKXtrLS07ZD1mYWxzZX13aGlsZShrPj0wKXtpZighZCl7Yz1nLTF9 ZD1mYWxzZTt3aGlsZShjPj0wKXtpZihlLmNhbGwoanx8dGhpcyxrLGMsaSk9PT10 cnVlKXtyZXR1cm5bayxjXX1jLS19ay0tfX1lbHNle2lmKGM+PWcpe2srKztkPWZh bHNlfXdoaWxlKGs8aCl7aWYoIWQpe2M9MH1kPWZhbHNlO3doaWxlKGM8Zyl7aWYo ZS5jYWxsKGp8fHRoaXMsayxjLGkpPT09dHJ1ZSl7cmV0dXJuW2ssY119YysrfWsr K319cmV0dXJuIG51bGx9LGdldEdyaWRFbDpmdW5jdGlvbigpe3JldHVybiB0aGlz LmJvZHl9LHN0b3BFZGl0aW5nOkV4dC5lbXB0eUZuLGdldFNlbGVjdGlvbk1vZGVs OmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2VsTW9kZWwpe3RoaXMuc2VsTW9kZWw9bmV3 IEV4dC5ncmlkLlJvd1NlbGVjdGlvbk1vZGVsKHRoaXMuZGlzYWJsZVNlbGVjdGlv bj97c2VsZWN0Um93OkV4dC5lbXB0eUZufTpudWxsKX1yZXR1cm4gdGhpcy5zZWxN b2RlbH0sZ2V0U3RvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdG9yZX0sZ2V0 Q29sdW1uTW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb2xNb2RlbH0sZ2V0 VmlldzpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZXcpe3RoaXMudmlldz1uZXcgRXh0 LmdyaWQuR3JpZFZpZXcodGhpcy52aWV3Q29uZmlnKX1yZXR1cm4gdGhpcy52aWV3 fSxnZXREcmFnRHJvcFRleHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlbE1vZGVs LmdldENvdW50KCk7cmV0dXJuIFN0cmluZy5mb3JtYXQodGhpcy5kZFRleHQsYSxh PT0xPyIiOiJzIil9fSk7RXh0LnJlZygiZ3JpZCIsRXh0LmdyaWQuR3JpZFBhbmVs KTtFeHQuZ3JpZC5QaXZvdEdyaWQ9RXh0LmV4dGVuZChFeHQuZ3JpZC5HcmlkUGFu ZWwse2FnZ3JlZ2F0b3I6InN1bSIscmVuZGVyZXI6dW5kZWZpbmVkLGluaXRDb21w b25lbnQ6ZnVuY3Rpb24oKXtFeHQuZ3JpZC5QaXZvdEdyaWQuc3VwZXJjbGFzcy5p bml0Q29tcG9uZW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmluaXRBeGVz KCk7dGhpcy5lbmFibGVDb2x1bW5SZXNpemU9ZmFsc2U7dGhpcy52aWV3Q29uZmln PUV4dC5hcHBseSh0aGlzLnZpZXdDb25maWd8fHt9LHtmb3JjZUZpdDp0cnVlfSk7 dGhpcy5jb2xNb2RlbD1uZXcgRXh0LmdyaWQuQ29sdW1uTW9kZWwoe30pfSxnZXRB Z2dyZWdhdG9yOmZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuYWdncmVnYXRvcj09 InN0cmluZyIpe3JldHVybiBFeHQuZ3JpZC5QaXZvdEFnZ3JlZ2F0b3JNZ3IudHlw ZXNbdGhpcy5hZ2dyZWdhdG9yXX1lbHNle3JldHVybiB0aGlzLmFnZ3JlZ2F0b3J9 fSxzZXRBZ2dyZWdhdG9yOmZ1bmN0aW9uKGEpe3RoaXMuYWdncmVnYXRvcj1hfSxz ZXRNZWFzdXJlOmZ1bmN0aW9uKGEpe3RoaXMubWVhc3VyZT1hfSxzZXRMZWZ0QXhp czpmdW5jdGlvbihiLGEpe3RoaXMubGVmdEF4aXM9YjtpZihhKXt0aGlzLnZpZXcu cmVmcmVzaCgpfX0sc2V0VG9wQXhpczpmdW5jdGlvbihiLGEpe3RoaXMudG9wQXhp cz1iO2lmKGEpe3RoaXMudmlldy5yZWZyZXNoKCl9fSxpbml0QXhlczpmdW5jdGlv bigpe3ZhciBhPUV4dC5ncmlkLlBpdm90QXhpcztpZighKHRoaXMubGVmdEF4aXMg aW5zdGFuY2VvZiBhKSl7dGhpcy5zZXRMZWZ0QXhpcyhuZXcgYSh7b3JpZW50YXRp b246InZlcnRpY2FsIixkaW1lbnNpb25zOnRoaXMubGVmdEF4aXN8fFtdLHN0b3Jl OnRoaXMuc3RvcmV9KSl9aWYoISh0aGlzLnRvcEF4aXMgaW5zdGFuY2VvZiBhKSl7 dGhpcy5zZXRUb3BBeGlzKG5ldyBhKHtvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIs ZGltZW5zaW9uczp0aGlzLnRvcEF4aXN8fFtdLHN0b3JlOnRoaXMuc3RvcmV9KSl9 fSxleHRyYWN0RGF0YTpmdW5jdGlvbigpe3ZhciBjPXRoaXMuc3RvcmUuZGF0YS5p dGVtcyxzPWMubGVuZ3RoLHE9W10saCxnLGUsZDtpZihzPT0wKXtyZXR1cm5bXX12 YXIgbD10aGlzLmxlZnRBeGlzLmdldFR1cGxlcygpLG89bC5sZW5ndGgsbT10aGlz LnRvcEF4aXMuZ2V0VHVwbGVzKCksYT1tLmxlbmd0aCxiPXRoaXMuZ2V0QWdncmVn YXRvcigpO2ZvcihnPTA7ZzxzO2crKyl7aD1jW2ddO2ZvcihlPTA7ZTxvO2UrKyl7 cVtlXT1xW2VdfHxbXTtpZihsW2VdLm1hdGNoZXIoaCk9PT10cnVlKXtmb3IoZD0w O2Q8YTtkKyspe3FbZV1bZF09cVtlXVtkXXx8W107aWYobVtkXS5tYXRjaGVyKGgp KXtxW2VdW2RdLnB1c2goaCl9fX19fXZhciBuPXEubGVuZ3RoLHAscjtmb3IoZz0w O2c8bjtnKyspe3I9cVtnXTtwPXIubGVuZ3RoO2ZvcihlPTA7ZTxwO2UrKyl7cVtn XVtlXT1iKHFbZ11bZV0sdGhpcy5tZWFzdXJlKX19cmV0dXJuIHF9LGdldFZpZXc6 ZnVuY3Rpb24oKXtpZighdGhpcy52aWV3KXt0aGlzLnZpZXc9bmV3IEV4dC5ncmlk LlBpdm90R3JpZFZpZXcodGhpcy52aWV3Q29uZmlnKX1yZXR1cm4gdGhpcy52aWV3 fX0pO0V4dC5yZWcoInBpdm90Z3JpZCIsRXh0LmdyaWQuUGl2b3RHcmlkKTtFeHQu Z3JpZC5QaXZvdEFnZ3JlZ2F0b3JNZ3I9bmV3IEV4dC5BYnN0cmFjdE1hbmFnZXIo KTtFeHQuZ3JpZC5QaXZvdEFnZ3JlZ2F0b3JNZ3IucmVnaXN0ZXJUeXBlKCJzdW0i LGZ1bmN0aW9uKGEsYyl7dmFyIGU9YS5sZW5ndGgsZD0wLGI7Zm9yKGI9MDtiPGU7 YisrKXtkKz1hW2JdLmdldChjKX1yZXR1cm4gZH0pO0V4dC5ncmlkLlBpdm90QWdn cmVnYXRvck1nci5yZWdpc3RlclR5cGUoImF2ZyIsZnVuY3Rpb24oYSxjKXt2YXIg ZT1hLmxlbmd0aCxkPTAsYjtmb3IoYj0wO2I8ZTtiKyspe2QrPWFbYl0uZ2V0KGMp fXJldHVybihkL2UpfHwibi9hIn0pO0V4dC5ncmlkLlBpdm90QWdncmVnYXRvck1n ci5yZWdpc3RlclR5cGUoIm1pbiIsZnVuY3Rpb24oYSxjKXt2YXIgZT1bXSxkPWEu bGVuZ3RoLGI7Zm9yKGI9MDtiPGQ7YisrKXtlLnB1c2goYVtiXS5nZXQoYykpfXJl dHVybiBNYXRoLm1pbi5hcHBseSh0aGlzLGUpfHwibi9hIn0pO0V4dC5ncmlkLlBp dm90QWdncmVnYXRvck1nci5yZWdpc3RlclR5cGUoIm1heCIsZnVuY3Rpb24oYSxj KXt2YXIgZT1bXSxkPWEubGVuZ3RoLGI7Zm9yKGI9MDtiPGQ7YisrKXtlLnB1c2go YVtiXS5nZXQoYykpfXJldHVybiBNYXRoLm1heC5hcHBseSh0aGlzLGUpfHwibi9h In0pO0V4dC5ncmlkLlBpdm90QWdncmVnYXRvck1nci5yZWdpc3RlclR5cGUoImNv dW50IixmdW5jdGlvbihhLGIpe3JldHVybiBhLmxlbmd0aH0pO0V4dC5ncmlkLkdy aWRWaWV3PUV4dC5leHRlbmQoRXh0LnV0aWwuT2JzZXJ2YWJsZSx7ZGVmZXJFbXB0 eVRleHQ6dHJ1ZSxzY3JvbGxPZmZzZXQ6dW5kZWZpbmVkLGF1dG9GaWxsOmZhbHNl LGZvcmNlRml0OmZhbHNlLHNvcnRDbGFzc2VzOlsic29ydC1hc2MiLCJzb3J0LWRl c2MiXSxzb3J0QXNjVGV4dDoiU29ydCBBc2NlbmRpbmciLHNvcnREZXNjVGV4dDoi U29ydCBEZXNjZW5kaW5nIixjb2x1bW5zVGV4dDoiQ29sdW1ucyIsc2VsZWN0ZWRS b3dDbGFzczoieC1ncmlkMy1yb3ctc2VsZWN0ZWQiLGJvcmRlcldpZHRoOjIsdGRD bGFzczoieC1ncmlkMy1jZWxsIixoZENsczoieC1ncmlkMy1oZCIsbWFya0RpcnR5 OnRydWUsY2VsbFNlbGVjdG9yRGVwdGg6NCxyb3dTZWxlY3RvckRlcHRoOjEwLHJv d0JvZHlTZWxlY3RvckRlcHRoOjEwLGNlbGxTZWxlY3RvcjoidGQueC1ncmlkMy1j ZWxsIixyb3dTZWxlY3RvcjoiZGl2LngtZ3JpZDMtcm93Iixyb3dCb2R5U2VsZWN0 b3I6ImRpdi54LWdyaWQzLXJvdy1ib2R5IixmaXJzdFJvd0NsczoieC1ncmlkMy1y b3ctZmlyc3QiLGxhc3RSb3dDbHM6IngtZ3JpZDMtcm93LWxhc3QiLHJvd0Nsc1Jl Oi8oPzpefFxzKyl4LWdyaWQzLXJvdy0oZmlyc3R8bGFzdHxhbHQpKD86XHMrfCQp L2csaGVhZGVyTWVudU9wZW5DbHM6IngtZ3JpZDMtaGQtbWVudS1vcGVuIixyb3dP dmVyQ2xzOiJ4LWdyaWQzLXJvdy1vdmVyIixjb25zdHJ1Y3RvcjpmdW5jdGlvbihh KXtFeHQuYXBwbHkodGhpcyxhKTt0aGlzLmFkZEV2ZW50cygiYmVmb3Jlcm93cmVt b3ZlZCIsImJlZm9yZXJvd3NpbnNlcnRlZCIsImJlZm9yZXJlZnJlc2giLCJyb3dy ZW1vdmVkIiwicm93c2luc2VydGVkIiwicm93dXBkYXRlZCIsInJlZnJlc2giKTtF eHQuZ3JpZC5HcmlkVmlldy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhp cyl9LG1hc3RlclRwbDpuZXcgRXh0LlRlbXBsYXRlKCc8ZGl2IGNsYXNzPSJ4LWdy aWQzIiBoaWRlZm9jdXM9InRydWUiPicsJzxkaXYgY2xhc3M9IngtZ3JpZDMtdmll d3BvcnQiPicsJzxkaXYgY2xhc3M9IngtZ3JpZDMtaGVhZGVyIj4nLCc8ZGl2IGNs YXNzPSJ4LWdyaWQzLWhlYWRlci1pbm5lciI+JywnPGRpdiBjbGFzcz0ieC1ncmlk My1oZWFkZXItb2Zmc2V0IiBzdHlsZT0ie29zdHlsZX0iPntoZWFkZXJ9PC9kaXY+ JywiPC9kaXY+IiwnPGRpdiBjbGFzcz0ieC1jbGVhciI+PC9kaXY+JywiPC9kaXY+ IiwnPGRpdiBjbGFzcz0ieC1ncmlkMy1zY3JvbGxlciI+JywnPGRpdiBjbGFzcz0i eC1ncmlkMy1ib2R5IiBzdHlsZT0ie2JzdHlsZX0iPntib2R5fTwvZGl2PicsJzxh IGhyZWY9IiMiIGNsYXNzPSJ4LWdyaWQzLWZvY3VzIiB0YWJJbmRleD0iLTEiPjwv YT4nLCI8L2Rpdj4iLCI8L2Rpdj4iLCc8ZGl2IGNsYXNzPSJ4LWdyaWQzLXJlc2l6 ZS1tYXJrZXIiPiYjMTYwOzwvZGl2PicsJzxkaXYgY2xhc3M9IngtZ3JpZDMtcmVz aXplLXByb3h5Ij4mIzE2MDs8L2Rpdj4nLCI8L2Rpdj4iKSxoZWFkZXJUcGw6bmV3 IEV4dC5UZW1wbGF0ZSgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAi IGNlbGxwYWRkaW5nPSIwIiBzdHlsZT0ie3RzdHlsZX0iPicsIjx0aGVhZD4iLCc8 dHIgY2xhc3M9IngtZ3JpZDMtaGQtcm93Ij57Y2VsbHN9PC90cj4nLCI8L3RoZWFk PiIsIjwvdGFibGU+IiksYm9keVRwbDpuZXcgRXh0LlRlbXBsYXRlKCJ7cm93c30i KSxjZWxsVHBsOm5ldyBFeHQuVGVtcGxhdGUoJzx0ZCBjbGFzcz0ieC1ncmlkMy1j b2wgeC1ncmlkMy1jZWxsIHgtZ3JpZDMtdGQte2lkfSB7Y3NzfSIgc3R5bGU9Intz dHlsZX0iIHRhYkluZGV4PSIwIiB7Y2VsbEF0dHJ9PicsJzxkaXYgY2xhc3M9Ingt Z3JpZDMtY2VsbC1pbm5lciB4LWdyaWQzLWNvbC17aWR9IiB1bnNlbGVjdGFibGU9 Im9uIiB7YXR0cn0+e3ZhbHVlfTwvZGl2PicsIjwvdGQ+IiksaW5pdFRlbXBsYXRl czpmdW5jdGlvbigpe3ZhciBjPXRoaXMudGVtcGxhdGVzfHx7fSxkLGIsZz1uZXcg RXh0LlRlbXBsYXRlKCc8dGQgY2xhc3M9IngtZ3JpZDMtaGQgeC1ncmlkMy1jZWxs IHgtZ3JpZDMtdGQte2lkfSB7Y3NzfSIgc3R5bGU9IntzdHlsZX0iPicsJzxkaXYg e3Rvb2x0aXB9IHthdHRyfSBjbGFzcz0ieC1ncmlkMy1oZC1pbm5lciB4LWdyaWQz LWhkLXtpZH0iIHVuc2VsZWN0YWJsZT0ib24iIHN0eWxlPSJ7aXN0eWxlfSI+Jyx0 aGlzLmdyaWQuZW5hYmxlSGRNZW51Pyc8YSBjbGFzcz0ieC1ncmlkMy1oZC1idG4i IGhyZWY9IiMiPjwvYT4nOiIiLCJ7dmFsdWV9IiwnPGltZyBhbHQ9IiIgY2xhc3M9 IngtZ3JpZDMtc29ydC1pY29uIiBzcmM9IicsRXh0LkJMQU5LX0lNQUdFX1VSTCwn IiAvPicsIjwvZGl2PiIsIjwvdGQ+IiksYT1bJzx0ciBjbGFzcz0ieC1ncmlkMy1y b3ctYm9keS10ciIgc3R5bGU9Intib2R5U3R5bGV9Ij4nLCc8dGQgY29sc3Bhbj0i e2NvbHN9IiBjbGFzcz0ieC1ncmlkMy1ib2R5LWNlbGwiIHRhYkluZGV4PSIwIiBo aWRlZm9jdXM9Im9uIj4nLCc8ZGl2IGNsYXNzPSJ4LWdyaWQzLXJvdy1ib2R5Ij57 Ym9keX08L2Rpdj4nLCI8L3RkPiIsIjwvdHI+Il0uam9pbigiIiksZT1bJzx0YWJs ZSBjbGFzcz0ieC1ncmlkMy1yb3ctdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNp bmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBzdHlsZT0ie3RzdHlsZX0iPicsIjx0Ym9k eT4iLCI8dHI+e2NlbGxzfTwvdHI+Iix0aGlzLmVuYWJsZVJvd0JvZHk/YToiIiwi PC90Ym9keT4iLCI8L3RhYmxlPiJdLmpvaW4oIiIpO0V4dC5hcHBseUlmKGMse2hj ZWxsOmcsY2VsbDp0aGlzLmNlbGxUcGwsYm9keTp0aGlzLmJvZHlUcGwsaGVhZGVy OnRoaXMuaGVhZGVyVHBsLG1hc3Rlcjp0aGlzLm1hc3RlclRwbCxyb3c6bmV3IEV4 dC5UZW1wbGF0ZSgnPGRpdiBjbGFzcz0ieC1ncmlkMy1yb3cge2FsdH0iIHN0eWxl PSJ7dHN0eWxlfSI+JytlKyI8L2Rpdj4iKSxyb3dJbm5lcjpuZXcgRXh0LlRlbXBs YXRlKGUpfSk7Zm9yKGIgaW4gYyl7ZD1jW2JdO2lmKGQmJkV4dC5pc0Z1bmN0aW9u KGQuY29tcGlsZSkmJiFkLmNvbXBpbGVkKXtkLmRpc2FibGVGb3JtYXRzPXRydWU7 ZC5jb21waWxlKCl9fXRoaXMudGVtcGxhdGVzPWM7dGhpcy5jb2xSZT1uZXcgUmVn RXhwKCJ4LWdyaWQzLXRkLShbXlxcc10rKSIsIiIpfSxmbHk6ZnVuY3Rpb24oYSl7 aWYoIXRoaXMuX2ZseXdlaWdodCl7dGhpcy5fZmx5d2VpZ2h0PW5ldyBFeHQuRWxl bWVudC5GbHl3ZWlnaHQoZG9jdW1lbnQuYm9keSl9dGhpcy5fZmx5d2VpZ2h0LmRv bT1hO3JldHVybiB0aGlzLl9mbHl3ZWlnaHR9LGdldEVkaXRvclBhcmVudDpmdW5j dGlvbigpe3JldHVybiB0aGlzLnNjcm9sbGVyLmRvbX0saW5pdEVsZW1lbnRzOmZ1 bmN0aW9uKCl7dmFyIGI9RXh0LkVsZW1lbnQsZD1FeHQuZ2V0KHRoaXMuZ3JpZC5n ZXRHcmlkRWwoKS5kb20uZmlyc3RDaGlsZCksZT1uZXcgYihkLmNoaWxkKCJkaXYu eC1ncmlkMy12aWV3cG9ydCIpKSxjPW5ldyBiKGUuY2hpbGQoImRpdi54LWdyaWQz LWhlYWRlciIpKSxhPW5ldyBiKGUuY2hpbGQoImRpdi54LWdyaWQzLXNjcm9sbGVy IikpO2lmKHRoaXMuZ3JpZC5oaWRlSGVhZGVycyl7Yy5zZXREaXNwbGF5ZWQoZmFs c2UpfWlmKHRoaXMuZm9yY2VGaXQpe2Euc2V0U3R5bGUoIm92ZXJmbG93LXgiLCJo aWRkZW4iKX1FeHQuYXBwbHkodGhpcyx7ZWw6ZCxtYWluV3JhcDplLHNjcm9sbGVy OmEsbWFpbkhkOmMsaW5uZXJIZDpjLmNoaWxkKCJkaXYueC1ncmlkMy1oZWFkZXIt aW5uZXIiKS5kb20sbWFpbkJvZHk6bmV3IGIoYi5mbHkoYSkuY2hpbGQoImRpdi54 LWdyaWQzLWJvZHkiKSksZm9jdXNFbDpuZXcgYihiLmZseShhKS5jaGlsZCgiYSIp KSxyZXNpemVNYXJrZXI6bmV3IGIoZC5jaGlsZCgiZGl2LngtZ3JpZDMtcmVzaXpl LW1hcmtlciIpKSxyZXNpemVQcm94eTpuZXcgYihkLmNoaWxkKCJkaXYueC1ncmlk My1yZXNpemUtcHJveHkiKSl9KTt0aGlzLmZvY3VzRWwuc3dhbGxvd0V2ZW50KCJj bGljayIsdHJ1ZSl9LGdldFJvd3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYXNS b3dzKCk/dGhpcy5tYWluQm9keS5kb20uY2hpbGROb2RlczpbXX0sZmluZENlbGw6 ZnVuY3Rpb24oYSl7aWYoIWEpe3JldHVybiBmYWxzZX1yZXR1cm4gdGhpcy5mbHko YSkuZmluZFBhcmVudCh0aGlzLmNlbGxTZWxlY3Rvcix0aGlzLmNlbGxTZWxlY3Rv ckRlcHRoKX0sZmluZENlbGxJbmRleDpmdW5jdGlvbihkLGMpe3ZhciBiPXRoaXMu ZmluZENlbGwoZCksYTtpZihiKXthPXRoaXMuZmx5KGIpLmhhc0NsYXNzKGMpO2lm KCFjfHxhKXtyZXR1cm4gdGhpcy5nZXRDZWxsSW5kZXgoYil9fXJldHVybiBmYWxz ZX0sZ2V0Q2VsbEluZGV4OmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPWIuY2xhc3NO YW1lLm1hdGNoKHRoaXMuY29sUmUpO2lmKGEmJmFbMV0pe3JldHVybiB0aGlzLmNt LmdldEluZGV4QnlJZChhWzFdKX19cmV0dXJuIGZhbHNlfSxmaW5kSGVhZGVyQ2Vs bDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmZpbmRDZWxsKGIpO3JldHVybiBhJiZ0 aGlzLmZseShhKS5oYXNDbGFzcyh0aGlzLmhkQ2xzKT9hOm51bGx9LGZpbmRIZWFk ZXJJbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5maW5kQ2VsbEluZGV4KGEs dGhpcy5oZENscyl9LGZpbmRSb3c6ZnVuY3Rpb24oYSl7aWYoIWEpe3JldHVybiBm YWxzZX1yZXR1cm4gdGhpcy5mbHkoYSkuZmluZFBhcmVudCh0aGlzLnJvd1NlbGVj dG9yLHRoaXMucm93U2VsZWN0b3JEZXB0aCl9LGZpbmRSb3dJbmRleDpmdW5jdGlv bihhKXt2YXIgYj10aGlzLmZpbmRSb3coYSk7cmV0dXJuIGI/Yi5yb3dJbmRleDpm YWxzZX0sZmluZFJvd0JvZHk6ZnVuY3Rpb24oYSl7aWYoIWEpe3JldHVybiBmYWxz ZX1yZXR1cm4gdGhpcy5mbHkoYSkuZmluZFBhcmVudCh0aGlzLnJvd0JvZHlTZWxl Y3Rvcix0aGlzLnJvd0JvZHlTZWxlY3RvckRlcHRoKX0sZ2V0Um93OmZ1bmN0aW9u KGEpe3JldHVybiB0aGlzLmdldFJvd3MoKVthXX0sZ2V0Q2VsbDpmdW5jdGlvbihi LGEpe3JldHVybiBFeHQuZmx5KHRoaXMuZ2V0Um93KGIpKS5xdWVyeSh0aGlzLmNl bGxTZWxlY3RvcilbYV19LGdldEhlYWRlckNlbGw6ZnVuY3Rpb24oYSl7cmV0dXJu IHRoaXMubWFpbkhkLmRvbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKVthXX0s YWRkUm93Q2xhc3M6ZnVuY3Rpb24oYixhKXt2YXIgYz10aGlzLmdldFJvdyhiKTtp ZihjKXt0aGlzLmZseShjKS5hZGRDbGFzcyhhKX19LHJlbW92ZVJvd0NsYXNzOmZ1 bmN0aW9uKGMsYSl7dmFyIGI9dGhpcy5nZXRSb3coYyk7aWYoYil7dGhpcy5mbHko YikucmVtb3ZlQ2xhc3MoYSl9fSxyZW1vdmVSb3c6ZnVuY3Rpb24oYSl7RXh0LnJl bW92ZU5vZGUodGhpcy5nZXRSb3coYSkpO3RoaXMuc3luY0ZvY3VzRWwoYSl9LHJl bW92ZVJvd3M6ZnVuY3Rpb24oYyxhKXt2YXIgYj10aGlzLm1haW5Cb2R5LmRvbSxk O2ZvcihkPWM7ZDw9YTtkKyspe0V4dC5yZW1vdmVOb2RlKGIuY2hpbGROb2Rlc1tj XSl9dGhpcy5zeW5jRm9jdXNFbChjKX0sZ2V0U2Nyb2xsU3RhdGU6ZnVuY3Rpb24o KXt2YXIgYT10aGlzLnNjcm9sbGVyLmRvbTtyZXR1cm57bGVmdDphLnNjcm9sbExl ZnQsdG9wOmEuc2Nyb2xsVG9wfX0scmVzdG9yZVNjcm9sbDpmdW5jdGlvbihhKXt2 YXIgYj10aGlzLnNjcm9sbGVyLmRvbTtiLnNjcm9sbExlZnQ9YS5sZWZ0O2Iuc2Ny b2xsVG9wPWEudG9wfSxzY3JvbGxUb1RvcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMu c2Nyb2xsZXIuZG9tO2Euc2Nyb2xsVG9wPTA7YS5zY3JvbGxMZWZ0PTB9LHN5bmNT Y3JvbGw6ZnVuY3Rpb24oKXt0aGlzLnN5bmNIZWFkZXJTY3JvbGwoKTt2YXIgYT10 aGlzLnNjcm9sbGVyLmRvbTt0aGlzLmdyaWQuZmlyZUV2ZW50KCJib2R5c2Nyb2xs IixhLnNjcm9sbExlZnQsYS5zY3JvbGxUb3ApfSxzeW5jSGVhZGVyU2Nyb2xsOmZ1 bmN0aW9uKCl7dmFyIGE9dGhpcy5pbm5lckhkLGI9dGhpcy5zY3JvbGxlci5kb20u c2Nyb2xsTGVmdDthLnNjcm9sbExlZnQ9YjthLnNjcm9sbExlZnQ9Yn0sdXBkYXRl U29ydEljb246ZnVuY3Rpb24oZCxjKXt2YXIgYT10aGlzLnNvcnRDbGFzc2VzLGI9 YVtjPT0iREVTQyI/MTowXSxlPXRoaXMubWFpbkhkLnNlbGVjdCgidGQiKS5yZW1v dmVDbGFzcyhhKTtlLml0ZW0oZCkuYWRkQ2xhc3MoYil9LHVwZGF0ZUFsbENvbHVt bldpZHRoczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0VG90YWxXaWR0aCgpLGs9 dGhpcy5jbS5nZXRDb2x1bW5Db3VudCgpLG09dGhpcy5nZXRSb3dzKCksZz1tLmxl bmd0aCxiPVtdLGwsYSxoLGQsYztmb3IoZD0wO2Q8aztkKyspe2JbZF09dGhpcy5n ZXRDb2x1bW5XaWR0aChkKTt0aGlzLmdldEhlYWRlckNlbGwoZCkuc3R5bGUud2lk dGg9YltkXX10aGlzLnVwZGF0ZUhlYWRlcldpZHRoKCk7Zm9yKGQ9MDtkPGc7ZCsr KXtsPW1bZF07bC5zdHlsZS53aWR0aD1lO2E9bC5maXJzdENoaWxkO2lmKGEpe2Eu c3R5bGUud2lkdGg9ZTtoPWEucm93c1swXTtmb3IoYz0wO2M8aztjKyspe2guY2hp bGROb2Rlc1tjXS5zdHlsZS53aWR0aD1iW2NdfX19dGhpcy5vbkFsbENvbHVtbldp ZHRoc1VwZGF0ZWQoYixlKX0sdXBkYXRlQ29sdW1uV2lkdGg6ZnVuY3Rpb24oZCxi KXt2YXIgYz10aGlzLmdldENvbHVtbldpZHRoKGQpLGo9dGhpcy5nZXRUb3RhbFdp ZHRoKCksaD10aGlzLmdldEhlYWRlckNlbGwoZCksYT10aGlzLmdldFJvd3MoKSxl PWEubGVuZ3RoLGwsZyxrO3RoaXMudXBkYXRlSGVhZGVyV2lkdGgoKTtoLnN0eWxl LndpZHRoPWM7Zm9yKGc9MDtnPGU7ZysrKXtsPWFbZ107az1sLmZpcnN0Q2hpbGQ7 bC5zdHlsZS53aWR0aD1qO2lmKGspe2suc3R5bGUud2lkdGg9ajtrLnJvd3NbMF0u Y2hpbGROb2Rlc1tkXS5zdHlsZS53aWR0aD1jfX10aGlzLm9uQ29sdW1uV2lkdGhV cGRhdGVkKGQsYyxqKX0sdXBkYXRlQ29sdW1uSGlkZGVuOmZ1bmN0aW9uKGIsail7 dmFyIGg9dGhpcy5nZXRUb3RhbFdpZHRoKCksaz1qPyJub25lIjoiIixnPXRoaXMu Z2V0SGVhZGVyQ2VsbChiKSxhPXRoaXMuZ2V0Um93cygpLGQ9YS5sZW5ndGgsbCxj LGU7dGhpcy51cGRhdGVIZWFkZXJXaWR0aCgpO2cuc3R5bGUuZGlzcGxheT1rO2Zv cihlPTA7ZTxkO2UrKyl7bD1hW2VdO2wuc3R5bGUud2lkdGg9aDtjPWwuZmlyc3RD aGlsZDtpZihjKXtjLnN0eWxlLndpZHRoPWg7Yy5yb3dzWzBdLmNoaWxkTm9kZXNb Yl0uc3R5bGUuZGlzcGxheT1rfX10aGlzLm9uQ29sdW1uSGlkZGVuVXBkYXRlZChi LGosaCk7ZGVsZXRlIHRoaXMubGFzdFZpZXdXaWR0aDt0aGlzLmxheW91dCgpfSxk b1JlbmRlcjpmdW5jdGlvbihkLHYsbSxhLHIsdCl7dmFyIGg9dGhpcy50ZW1wbGF0 ZXMsYz1oLmNlbGwseT1oLnJvdyxvPXItMSxiPSJ3aWR0aDoiK3RoaXMuZ2V0VG90 YWxXaWR0aCgpKyI7IixrPVtdLGw9W10sbj17dHN0eWxlOmJ9LHE9e30sdz12Lmxl bmd0aCx4LGcsZSx1LHMscDtmb3Iocz0wO3M8dztzKyspe2U9dltzXTtsPVtdO3A9 cythO2Zvcih1PTA7dTxyO3UrKyl7Zz1kW3VdO3EuaWQ9Zy5pZDtxLmNzcz11PT09 MD8ieC1ncmlkMy1jZWxsLWZpcnN0ICI6KHU9PW8/IngtZ3JpZDMtY2VsbC1sYXN0 ICI6IiIpO3EuYXR0cj1xLmNlbGxBdHRyPSIiO3Euc3R5bGU9Zy5zdHlsZTtxLnZh bHVlPWcucmVuZGVyZXIuY2FsbChnLnNjb3BlLGUuZGF0YVtnLm5hbWVdLHEsZSxw LHUsbSk7aWYoRXh0LmlzRW1wdHkocS52YWx1ZSkpe3EudmFsdWU9IiYjMTYwOyJ9 aWYodGhpcy5tYXJrRGlydHkmJmUuZGlydHkmJnR5cGVvZiBlLm1vZGlmaWVkW2cu bmFtZV0hPSJ1bmRlZmluZWQiKXtxLmNzcys9IiB4LWdyaWQzLWRpcnR5LWNlbGwi fWxbbC5sZW5ndGhdPWMuYXBwbHkocSl9eD1bXTtpZih0JiYoKHArMSklMj09PTAp KXt4WzBdPSJ4LWdyaWQzLXJvdy1hbHQifWlmKGUuZGlydHkpe3hbMV09IiB4LWdy aWQzLWRpcnR5LXJvdyJ9bi5jb2xzPXI7aWYodGhpcy5nZXRSb3dDbGFzcyl7eFsy XT10aGlzLmdldFJvd0NsYXNzKGUscCxuLG0pfW4uYWx0PXguam9pbigiICIpO24u Y2VsbHM9bC5qb2luKCIiKTtrW2subGVuZ3RoXT15LmFwcGx5KG4pfXJldHVybiBr LmpvaW4oIiIpfSxwcm9jZXNzUm93czpmdW5jdGlvbihhLGcpe2lmKCF0aGlzLmRz fHx0aGlzLmRzLmdldENvdW50KCk8MSl7cmV0dXJufXZhciBkPXRoaXMuZ2V0Um93 cygpLGM9ZC5sZW5ndGgsZSxiO2c9Z3x8IXRoaXMuZ3JpZC5zdHJpcGVSb3dzO2E9 YXx8MDtmb3IoYj0wO2I8YztiKyspe2U9ZFtiXTtpZihlKXtlLnJvd0luZGV4PWI7 aWYoIWcpe2UuY2xhc3NOYW1lPWUuY2xhc3NOYW1lLnJlcGxhY2UodGhpcy5yb3dD bHNSZSwiICIpO2lmKChiKzEpJTI9PT0wKXtlLmNsYXNzTmFtZSs9IiB4LWdyaWQz LXJvdy1hbHQifX19fWlmKGE9PT0wKXtFeHQuZmx5KGRbMF0pLmFkZENsYXNzKHRo aXMuZmlyc3RSb3dDbHMpfUV4dC5mbHkoZFtjLTFdKS5hZGRDbGFzcyh0aGlzLmxh c3RSb3dDbHMpfSxhZnRlclJlbmRlcjpmdW5jdGlvbigpe2lmKCF0aGlzLmRzfHwh dGhpcy5jbSl7cmV0dXJufXRoaXMubWFpbkJvZHkuZG9tLmlubmVySFRNTD10aGlz LnJlbmRlckJvZHkoKXx8IiYjMTYwOyI7dGhpcy5wcm9jZXNzUm93cygwLHRydWUp O2lmKHRoaXMuZGVmZXJFbXB0eVRleHQhPT10cnVlKXt0aGlzLmFwcGx5RW1wdHlU ZXh0KCl9dGhpcy5ncmlkLmZpcmVFdmVudCgidmlld3JlYWR5Iix0aGlzLmdyaWQp fSxhZnRlclJlbmRlclVJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ncmlkO3RoaXMu aW5pdEVsZW1lbnRzKCk7RXh0LmZseSh0aGlzLmlubmVySGQpLm9uKCJjbGljayIs dGhpcy5oYW5kbGVIZERvd24sdGhpcyk7dGhpcy5tYWluSGQub24oe3Njb3BlOnRo aXMsbW91c2VvdmVyOnRoaXMuaGFuZGxlSGRPdmVyLG1vdXNlb3V0OnRoaXMuaGFu ZGxlSGRPdXQsbW91c2Vtb3ZlOnRoaXMuaGFuZGxlSGRNb3ZlfSk7dGhpcy5zY3Jv bGxlci5vbigic2Nyb2xsIix0aGlzLnN5bmNTY3JvbGwsdGhpcyk7aWYoYS5lbmFi bGVDb2x1bW5SZXNpemUhPT1mYWxzZSl7dGhpcy5zcGxpdFpvbmU9bmV3IEV4dC5n cmlkLkdyaWRWaWV3LlNwbGl0RHJhZ1pvbmUoYSx0aGlzLm1haW5IZC5kb20pfWlm KGEuZW5hYmxlQ29sdW1uTW92ZSl7dGhpcy5jb2x1bW5EcmFnPW5ldyBFeHQuZ3Jp ZC5HcmlkVmlldy5Db2x1bW5EcmFnWm9uZShhLHRoaXMuaW5uZXJIZCk7dGhpcy5j b2x1bW5Ecm9wPW5ldyBFeHQuZ3JpZC5IZWFkZXJEcm9wWm9uZShhLHRoaXMubWFp bkhkLmRvbSl9aWYoYS5lbmFibGVIZE1lbnUhPT1mYWxzZSl7dGhpcy5obWVudT1u ZXcgRXh0Lm1lbnUuTWVudSh7aWQ6YS5pZCsiLWhjdHgifSk7dGhpcy5obWVudS5h ZGQoe2l0ZW1JZDoiYXNjIix0ZXh0OnRoaXMuc29ydEFzY1RleHQsY2xzOiJ4Zy1o bWVudS1zb3J0LWFzYyJ9LHtpdGVtSWQ6ImRlc2MiLHRleHQ6dGhpcy5zb3J0RGVz Y1RleHQsY2xzOiJ4Zy1obWVudS1zb3J0LWRlc2MifSk7aWYoYS5lbmFibGVDb2x1 bW5IaWRlIT09ZmFsc2Upe3RoaXMuY29sTWVudT1uZXcgRXh0Lm1lbnUuTWVudSh7 aWQ6YS5pZCsiLWhjb2xzLW1lbnUifSk7dGhpcy5jb2xNZW51Lm9uKHtzY29wZTp0 aGlzLGJlZm9yZXNob3c6dGhpcy5iZWZvcmVDb2xNZW51U2hvdyxpdGVtY2xpY2s6 dGhpcy5oYW5kbGVIZE1lbnVDbGlja30pO3RoaXMuaG1lbnUuYWRkKCItIix7aXRl bUlkOiJjb2x1bW5zIixoaWRlT25DbGljazpmYWxzZSx0ZXh0OnRoaXMuY29sdW1u c1RleHQsbWVudTp0aGlzLmNvbE1lbnUsaWNvbkNsczoieC1jb2xzLWljb24ifSl9 dGhpcy5obWVudS5vbigiaXRlbWNsaWNrIix0aGlzLmhhbmRsZUhkTWVudUNsaWNr LHRoaXMpfWlmKGEudHJhY2tNb3VzZU92ZXIpe3RoaXMubWFpbkJvZHkub24oe3Nj b3BlOnRoaXMsbW91c2VvdmVyOnRoaXMub25Sb3dPdmVyLG1vdXNlb3V0OnRoaXMu b25Sb3dPdXR9KX1pZihhLmVuYWJsZURyYWdEcm9wfHxhLmVuYWJsZURyYWcpe3Ro aXMuZHJhZ1pvbmU9bmV3IEV4dC5ncmlkLkdyaWREcmFnWm9uZShhLHtkZEdyb3Vw OmEuZGRHcm91cHx8IkdyaWRERCJ9KX10aGlzLnVwZGF0ZUhlYWRlclNvcnRTdGF0 ZSgpfSxyZW5kZXJVSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGVtcGxhdGVzO3Jl dHVybiBhLm1hc3Rlci5hcHBseSh7Ym9keTphLmJvZHkuYXBwbHkoe3Jvd3M6IiYj MTYwOyJ9KSxoZWFkZXI6dGhpcy5yZW5kZXJIZWFkZXJzKCksb3N0eWxlOiJ3aWR0 aDoiK3RoaXMuZ2V0T2Zmc2V0V2lkdGgoKSsiOyIsYnN0eWxlOiJ3aWR0aDoiK3Ro aXMuZ2V0VG90YWxXaWR0aCgpKyI7In0pfSxwcm9jZXNzRXZlbnQ6ZnVuY3Rpb24o YixoKXt2YXIgaT1oLmdldFRhcmdldCgpLGE9dGhpcy5ncmlkLGQ9dGhpcy5maW5k SGVhZGVySW5kZXgoaSksayxqLGMsZzthLmZpcmVFdmVudChiLGgpO2lmKGQhPT1m YWxzZSl7YS5maXJlRXZlbnQoImhlYWRlciIrYixhLGQsaCl9ZWxzZXtrPXRoaXMu ZmluZFJvd0luZGV4KGkpO2lmKGshPT1mYWxzZSl7aj10aGlzLmZpbmRDZWxsSW5k ZXgoaSk7aWYoaiE9PWZhbHNlKXtjPWEuY29sTW9kZWwuZ2V0Q29sdW1uQXQoaik7 aWYoYS5maXJlRXZlbnQoImNlbGwiK2IsYSxrLGosaCkhPT1mYWxzZSl7aWYoIWN8 fChjLnByb2Nlc3NFdmVudCYmKGMucHJvY2Vzc0V2ZW50KGIsaCxhLGssaikhPT1m YWxzZSkpKXthLmZpcmVFdmVudCgicm93IitiLGEsayxoKX19fWVsc2V7aWYoYS5m aXJlRXZlbnQoInJvdyIrYixhLGssaCkhPT1mYWxzZSl7KGc9dGhpcy5maW5kUm93 Qm9keShpKSkmJmEuZmlyZUV2ZW50KCJyb3dib2R5IitiLGEsayxoKX19fWVsc2V7 YS5maXJlRXZlbnQoImNvbnRhaW5lciIrYixhLGgpfX19LGxheW91dDpmdW5jdGlv bihqKXtpZighdGhpcy5tYWluQm9keSl7cmV0dXJufXZhciBhPXRoaXMuZ3JpZCxk PWEuZ2V0R3JpZEVsKCksYz1kLmdldFNpemUodHJ1ZSksaT1jLndpZHRoLGI9Yy5o ZWlnaHQsaD10aGlzLnNjcm9sbGVyLGcsZSxrO2lmKGk8MjB8fGI8MjApe3JldHVy bn1pZihhLmF1dG9IZWlnaHQpe2c9aC5kb20uc3R5bGU7Zy5vdmVyZmxvdz0idmlz aWJsZSI7aWYoRXh0LmlzV2ViS2l0KXtnLnBvc2l0aW9uPSJzdGF0aWMifX1lbHNl e3RoaXMuZWwuc2V0U2l6ZShpLGIpO2U9dGhpcy5tYWluSGQuZ2V0SGVpZ2h0KCk7 az1iLWU7aC5zZXRTaXplKGksayk7aWYodGhpcy5pbm5lckhkKXt0aGlzLmlubmVy SGQuc3R5bGUud2lkdGg9KGkpKyJweCJ9fWlmKHRoaXMuZm9yY2VGaXR8fChqPT09 dHJ1ZSYmdGhpcy5hdXRvRmlsbCkpe2lmKHRoaXMubGFzdFZpZXdXaWR0aCE9aSl7 dGhpcy5maXRDb2x1bW5zKGZhbHNlLGZhbHNlKTt0aGlzLmxhc3RWaWV3V2lkdGg9 aX19ZWxzZXt0aGlzLmF1dG9FeHBhbmQoKTt0aGlzLnN5bmNIZWFkZXJTY3JvbGwo KX10aGlzLm9uTGF5b3V0KGksayl9LG9uTGF5b3V0OmZ1bmN0aW9uKGEsYil7fSxv bkNvbHVtbldpZHRoVXBkYXRlZDpmdW5jdGlvbihjLGEsYil7fSxvbkFsbENvbHVt bldpZHRoc1VwZGF0ZWQ6ZnVuY3Rpb24oYSxiKXt9LG9uQ29sdW1uSGlkZGVuVXBk YXRlZDpmdW5jdGlvbihiLGMsYSl7fSx1cGRhdGVDb2x1bW5UZXh0OmZ1bmN0aW9u KGEsYil7fSxhZnRlck1vdmU6ZnVuY3Rpb24oYSl7fSxpbml0OmZ1bmN0aW9uKGEp e3RoaXMuZ3JpZD1hO3RoaXMuaW5pdFRlbXBsYXRlcygpO3RoaXMuaW5pdERhdGEo YS5zdG9yZSxhLmNvbE1vZGVsKTt0aGlzLmluaXRVSShhKX0sZ2V0Q29sdW1uSWQ6 ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY20uZ2V0Q29sdW1uSWQoYSl9LGdldE9m ZnNldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuY20uZ2V0VG90YWxXaWR0 aCgpK3RoaXMuZ2V0U2Nyb2xsT2Zmc2V0KCkpKyJweCJ9LGdldFNjcm9sbE9mZnNl dDpmdW5jdGlvbigpe3JldHVybiBFeHQubnVtKHRoaXMuc2Nyb2xsT2Zmc2V0LEV4 dC5nZXRTY3JvbGxCYXJXaWR0aCgpKX0scmVuZGVySGVhZGVyczpmdW5jdGlvbigp e3ZhciBlPXRoaXMuY20sZz10aGlzLnRlbXBsYXRlcyxhPWcuaGNlbGwsZD17fSxo PWUuZ2V0Q29sdW1uQ291bnQoKSxqPWgtMSxrPVtdLGMsYjtmb3IoYz0wO2M8aDtj Kyspe2lmKGM9PTApe2I9IngtZ3JpZDMtY2VsbC1maXJzdCAifWVsc2V7Yj1jPT1q PyJ4LWdyaWQzLWNlbGwtbGFzdCAiOiIifWQ9e2lkOmUuZ2V0Q29sdW1uSWQoYyks dmFsdWU6ZS5nZXRDb2x1bW5IZWFkZXIoYyl8fCIiLHN0eWxlOnRoaXMuZ2V0Q29s dW1uU3R5bGUoYyx0cnVlKSxjc3M6Yix0b29sdGlwOnRoaXMuZ2V0Q29sdW1uVG9v bHRpcChjKX07aWYoZS5jb25maWdbY10uYWxpZ249PSJyaWdodCIpe2QuaXN0eWxl PSJwYWRkaW5nLXJpZ2h0OiAxNnB4OyJ9ZWxzZXtkZWxldGUgZC5pc3R5bGV9a1tj XT1hLmFwcGx5KGQpfXJldHVybiBnLmhlYWRlci5hcHBseSh7Y2VsbHM6ay5qb2lu KCIiKSx0c3R5bGU6U3RyaW5nLmZvcm1hdCgid2lkdGg6IHswfTsiLHRoaXMuZ2V0 VG90YWxXaWR0aCgpKX0pfSxnZXRDb2x1bW5Ub29sdGlwOmZ1bmN0aW9uKGEpe3Zh ciBiPXRoaXMuY20uZ2V0Q29sdW1uVG9vbHRpcChhKTtpZihiKXtpZihFeHQuUXVp Y2tUaXBzLmlzRW5hYmxlZCgpKXtyZXR1cm4nZXh0OnF0aXA9IicrYisnIid9ZWxz ZXtyZXR1cm4ndGl0bGU9IicrYisnIid9fXJldHVybiIifSxiZWZvcmVVcGRhdGU6 ZnVuY3Rpb24oKXt0aGlzLmdyaWQuc3RvcEVkaXRpbmcodHJ1ZSl9LHVwZGF0ZUhl YWRlcnM6ZnVuY3Rpb24oKXt0aGlzLmlubmVySGQuZmlyc3RDaGlsZC5pbm5lckhU TUw9dGhpcy5yZW5kZXJIZWFkZXJzKCk7dGhpcy51cGRhdGVIZWFkZXJXaWR0aChm YWxzZSl9LHVwZGF0ZUhlYWRlcldpZHRoOmZ1bmN0aW9uKGMpe3ZhciBiPXRoaXMu aW5uZXJIZC5maXJzdENoaWxkLGE9dGhpcy5nZXRUb3RhbFdpZHRoKCk7Yi5zdHls ZS53aWR0aD10aGlzLmdldE9mZnNldFdpZHRoKCk7Yi5maXJzdENoaWxkLnN0eWxl LndpZHRoPWE7aWYoYyE9PWZhbHNlKXt0aGlzLm1haW5Cb2R5LmRvbS5zdHlsZS53 aWR0aD1hfX0sZm9jdXNSb3c6ZnVuY3Rpb24oYSl7dGhpcy5mb2N1c0NlbGwoYSww LGZhbHNlKX0sZm9jdXNDZWxsOmZ1bmN0aW9uKGQsYixjKXt0aGlzLnN5bmNGb2N1 c0VsKHRoaXMuZW5zdXJlVmlzaWJsZShkLGIsYykpO3ZhciBhPXRoaXMuZm9jdXNF bDtpZihFeHQuaXNHZWNrbyl7YS5mb2N1cygpfWVsc2V7YS5mb2N1cy5kZWZlcigx LGEpfX0scmVzb2x2ZUNlbGw6ZnVuY3Rpb24oaCxkLGcpe2lmKCFFeHQuaXNOdW1i ZXIoaCkpe2g9aC5yb3dJbmRleH1pZighdGhpcy5kcyl7cmV0dXJuIG51bGx9aWYo aDwwfHxoPj10aGlzLmRzLmdldENvdW50KCkpe3JldHVybiBudWxsfWQ9KGQhPT11 bmRlZmluZWQ/ZDowKTt2YXIgYz10aGlzLmdldFJvdyhoKSxiPXRoaXMuY20sZT1i LmdldENvbHVtbkNvdW50KCksYTtpZighKGc9PT1mYWxzZSYmZD09PTApKXt3aGls ZShkPGUmJmIuaXNIaWRkZW4oZCkpe2QrK31hPXRoaXMuZ2V0Q2VsbChoLGQpfXJl dHVybntyb3c6YyxjZWxsOmF9fSxnZXRSZXNvbHZlZFhZOmZ1bmN0aW9uKGIpe2lm KCFiKXtyZXR1cm4gbnVsbH12YXIgYT1iLmNlbGwsYz1iLnJvdztpZihhKXtyZXR1 cm4gRXh0LmZseShhKS5nZXRYWSgpfWVsc2V7cmV0dXJuW3RoaXMuZWwuZ2V0WCgp LEV4dC5mbHkoYykuZ2V0WSgpXX19LHN5bmNGb2N1c0VsOmZ1bmN0aW9uKGQsYSxj KXt2YXIgYj1kO2lmKCFFeHQuaXNBcnJheShiKSl7ZD1NYXRoLm1pbihkLE1hdGgu bWF4KDAsdGhpcy5nZXRSb3dzKCkubGVuZ3RoLTEpKTtpZihpc05hTihkKSl7cmV0 dXJufWI9dGhpcy5nZXRSZXNvbHZlZFhZKHRoaXMucmVzb2x2ZUNlbGwoZCxhLGMp KX10aGlzLmZvY3VzRWwuc2V0WFkoYnx8dGhpcy5zY3JvbGxlci5nZXRYWSgpKX0s ZW5zdXJlVmlzaWJsZTpmdW5jdGlvbih0LGcsZSl7dmFyIHI9dGhpcy5yZXNvbHZl Q2VsbCh0LGcsZSk7aWYoIXJ8fCFyLnJvdyl7cmV0dXJuIG51bGx9dmFyIGs9ci5y b3csaD1yLmNlbGwsbj10aGlzLnNjcm9sbGVyLmRvbSxkPWsscz0wLG89dGhpcy5l bC5kb207d2hpbGUoZCYmZCE9byl7cys9ZC5vZmZzZXRUb3A7ZD1kLm9mZnNldFBh cmVudH1zLT10aGlzLm1haW5IZC5kb20ub2Zmc2V0SGVpZ2h0O289cGFyc2VJbnQo bi5zY3JvbGxUb3AsMTApO3ZhciBxPXMray5vZmZzZXRIZWlnaHQsYT1uLmNsaWVu dEhlaWdodCxtPW8rYTtpZihzPG8pe24uc2Nyb2xsVG9wPXN9ZWxzZXtpZihxPm0p e24uc2Nyb2xsVG9wPXEtYX19aWYoZSE9PWZhbHNlKXt2YXIgbD1wYXJzZUludCho Lm9mZnNldExlZnQsMTApLGo9bCtoLm9mZnNldFdpZHRoLGk9cGFyc2VJbnQobi5z Y3JvbGxMZWZ0LDEwKSxiPWkrbi5jbGllbnRXaWR0aDtpZihsPGkpe24uc2Nyb2xs TGVmdD1sfWVsc2V7aWYoaj5iKXtuLnNjcm9sbExlZnQ9ai1uLmNsaWVudFdpZHRo fX19cmV0dXJuIHRoaXMuZ2V0UmVzb2x2ZWRYWShyKX0saW5zZXJ0Um93czpmdW5j dGlvbihhLGksZSxoKXt2YXIgZD1hLmdldENvdW50KCktMTtpZighaCYmaT09PTAm JmU+PWQpe3RoaXMuZmlyZUV2ZW50KCJiZWZvcmVyb3dzaW5zZXJ0ZWQiLHRoaXMs aSxlKTt0aGlzLnJlZnJlc2goKTt0aGlzLmZpcmVFdmVudCgicm93c2luc2VydGVk Iix0aGlzLGksZSl9ZWxzZXtpZighaCl7dGhpcy5maXJlRXZlbnQoImJlZm9yZXJv d3NpbnNlcnRlZCIsdGhpcyxpLGUpfXZhciBiPXRoaXMucmVuZGVyUm93cyhpLGUp LGc9dGhpcy5nZXRSb3coaSk7aWYoZyl7aWYoaT09PTApe0V4dC5mbHkodGhpcy5n ZXRSb3coMCkpLnJlbW92ZUNsYXNzKHRoaXMuZmlyc3RSb3dDbHMpfUV4dC5Eb21I ZWxwZXIuaW5zZXJ0SHRtbCgiYmVmb3JlQmVnaW4iLGcsYil9ZWxzZXt2YXIgYz10 aGlzLmdldFJvdyhkLTEpO2lmKGMpe0V4dC5mbHkoYykucmVtb3ZlQ2xhc3ModGhp cy5sYXN0Um93Q2xzKX1FeHQuRG9tSGVscGVyLmluc2VydEh0bWwoImJlZm9yZUVu ZCIsdGhpcy5tYWluQm9keS5kb20sYil9aWYoIWgpe3RoaXMucHJvY2Vzc1Jvd3Mo aSk7dGhpcy5maXJlRXZlbnQoInJvd3NpbnNlcnRlZCIsdGhpcyxpLGUpfWVsc2V7 aWYoaT09PTB8fGk+PWQpe0V4dC5mbHkodGhpcy5nZXRSb3coaSkpLmFkZENsYXNz KGk9PT0wP3RoaXMuZmlyc3RSb3dDbHM6dGhpcy5sYXN0Um93Q2xzKX19fXRoaXMu c3luY0ZvY3VzRWwoaSl9LGRlbGV0ZVJvd3M6ZnVuY3Rpb24oYSxjLGIpe2lmKGEu Z2V0Um93Q291bnQoKTwxKXt0aGlzLnJlZnJlc2goKX1lbHNle3RoaXMuZmlyZUV2 ZW50KCJiZWZvcmVyb3dzZGVsZXRlZCIsdGhpcyxjLGIpO3RoaXMucmVtb3ZlUm93 cyhjLGIpO3RoaXMucHJvY2Vzc1Jvd3MoYyk7dGhpcy5maXJlRXZlbnQoInJvd3Nk ZWxldGVkIix0aGlzLGMsYil9fSxnZXRDb2x1bW5TdHlsZTpmdW5jdGlvbihiLGQp e3ZhciBhPXRoaXMuY20sZz1hLmNvbmZpZyxjPWQ/IiI6Z1tiXS5jc3N8fCIiLGU9 Z1tiXS5hbGlnbjtjKz1TdHJpbmcuZm9ybWF0KCJ3aWR0aDogezB9OyIsdGhpcy5n ZXRDb2x1bW5XaWR0aChiKSk7aWYoYS5pc0hpZGRlbihiKSl7Yys9ImRpc3BsYXk6 IG5vbmU7ICJ9aWYoZSl7Yys9U3RyaW5nLmZvcm1hdCgidGV4dC1hbGlnbjogezB9 OyIsZSl9cmV0dXJuIGN9LGdldENvbHVtbldpZHRoOmZ1bmN0aW9uKGIpe3ZhciBj PXRoaXMuY20uZ2V0Q29sdW1uV2lkdGgoYiksYT10aGlzLmJvcmRlcldpZHRoO2lm KEV4dC5pc051bWJlcihjKSl7aWYoRXh0LmlzQm9yZGVyQm94fHwoRXh0LmlzV2Vi S2l0JiYhRXh0LmlzU2FmYXJpMikpe3JldHVybiBjKyJweCJ9ZWxzZXtyZXR1cm4g TWF0aC5tYXgoYy1hLDApKyJweCJ9fWVsc2V7cmV0dXJuIGN9fSxnZXRUb3RhbFdp ZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY20uZ2V0VG90YWxXaWR0aCgpKyJw eCJ9LGZpdENvbHVtbnM6ZnVuY3Rpb24oZyxqLGgpe3ZhciBhPXRoaXMuZ3JpZCxs PXRoaXMuY20scz1sLmdldFRvdGFsV2lkdGgoZmFsc2UpLHE9dGhpcy5nZXRHcmlk SW5uZXJXaWR0aCgpLHI9cS1zLGM9W10sbz0wLG49MCx1LGQscDtpZihxPDIwfHxy PT09MCl7cmV0dXJuIGZhbHNlfXZhciBlPWwuZ2V0Q29sdW1uQ291bnQodHJ1ZSks bT1sLmdldENvbHVtbkNvdW50KGZhbHNlKSxiPWUtKEV4dC5pc051bWJlcihoKT8x OjApO2lmKGI9PT0wKXtiPTE7aD11bmRlZmluZWR9Zm9yKHA9MDtwPG07cCsrKXtp ZighbC5pc0ZpeGVkKHApJiZwIT09aCl7dT1sLmdldENvbHVtbldpZHRoKHApO2Mu cHVzaChwLHUpO2lmKCFsLmlzSGlkZGVuKHApKXtvPXA7bis9dX19fWQ9KHEtbC5n ZXRUb3RhbFdpZHRoKCkpL247d2hpbGUoYy5sZW5ndGgpe3U9Yy5wb3AoKTtwPWMu cG9wKCk7bC5zZXRDb2x1bW5XaWR0aChwLE1hdGgubWF4KGEubWluQ29sdW1uV2lk dGgsTWF0aC5mbG9vcih1K3UqZCkpLHRydWUpfXM9bC5nZXRUb3RhbFdpZHRoKGZh bHNlKTtpZihzPnEpe3ZhciB0PShiPT1lKT9vOmgsaz1NYXRoLm1heCgxLGwuZ2V0 Q29sdW1uV2lkdGgodCktKHMtcSkpO2wuc2V0Q29sdW1uV2lkdGgodCxrLHRydWUp fWlmKGchPT10cnVlKXt0aGlzLnVwZGF0ZUFsbENvbHVtbldpZHRocygpfXJldHVy biB0cnVlfSxhdXRvRXhwYW5kOmZ1bmN0aW9uKGspe3ZhciBhPXRoaXMuZ3JpZCxp PXRoaXMuY20sZT10aGlzLmdldEdyaWRJbm5lcldpZHRoKCksYz1pLmdldFRvdGFs V2lkdGgoZmFsc2UpLGc9YS5hdXRvRXhwYW5kQ29sdW1uO2lmKCF0aGlzLnVzZXJS ZXNpemVkJiZnKXtpZihlIT1jKXt2YXIgaj1pLmdldEluZGV4QnlJZChnKSxiPWku Z2V0Q29sdW1uV2lkdGgoaiksaD1lLWMrYixkPU1hdGgubWluKE1hdGgubWF4KGgs YS5hdXRvRXhwYW5kTWluKSxhLmF1dG9FeHBhbmRNYXgpO2lmKGIhPWQpe2kuc2V0 Q29sdW1uV2lkdGgoaixkLHRydWUpO2lmKGshPT10cnVlKXt0aGlzLnVwZGF0ZUNv bHVtbldpZHRoKGosZCl9fX19fSxnZXRHcmlkSW5uZXJXaWR0aDpmdW5jdGlvbigp e3JldHVybiB0aGlzLmdyaWQuZ2V0R3JpZEVsKCkuZ2V0V2lkdGgodHJ1ZSktdGhp cy5nZXRTY3JvbGxPZmZzZXQoKX0sZ2V0Q29sdW1uRGF0YTpmdW5jdGlvbigpe3Zh ciBlPVtdLGM9dGhpcy5jbSxnPWMuZ2V0Q29sdW1uQ291bnQoKSxhPXRoaXMuZHMu ZmllbGRzLGQsYjtmb3IoZD0wO2Q8ZztkKyspe2I9Yy5nZXREYXRhSW5kZXgoZCk7 ZVtkXT17bmFtZTpFeHQuaXNEZWZpbmVkKGIpP2I6KGEuZ2V0KGQpP2EuZ2V0KGQp Lm5hbWU6dW5kZWZpbmVkKSxyZW5kZXJlcjpjLmdldFJlbmRlcmVyKGQpLHNjb3Bl OmMuZ2V0UmVuZGVyZXJTY29wZShkKSxpZDpjLmdldENvbHVtbklkKGQpLHN0eWxl OnRoaXMuZ2V0Q29sdW1uU3R5bGUoZCl9fXJldHVybiBlfSxyZW5kZXJSb3dzOmZ1 bmN0aW9uKGksYyl7dmFyIGE9dGhpcy5ncmlkLGc9YS5zdG9yZSxqPWEuc3RyaXBl Um93cyxlPWEuY29sTW9kZWwsaD1lLmdldENvbHVtbkNvdW50KCksZD1nLmdldENv dW50KCksYjtpZihkPDEpe3JldHVybiIifWk9aXx8MDtjPUV4dC5pc0RlZmluZWQo Yyk/YzpkLTE7Yj1nLmdldFJhbmdlKGksYyk7cmV0dXJuIHRoaXMuZG9SZW5kZXIo dGhpcy5nZXRDb2x1bW5EYXRhKCksYixnLGksaCxqKX0scmVuZGVyQm9keTpmdW5j dGlvbigpe3ZhciBhPXRoaXMucmVuZGVyUm93cygpfHwiJiMxNjA7IjtyZXR1cm4g dGhpcy50ZW1wbGF0ZXMuYm9keS5hcHBseSh7cm93czphfSl9LHJlZnJlc2hSb3c6 ZnVuY3Rpb24oZyl7dmFyIGw9dGhpcy5kcyxtPXRoaXMuY20uZ2V0Q29sdW1uQ291 bnQoKSxjPXRoaXMuZ2V0Q29sdW1uRGF0YSgpLG49bS0xLHA9WyJ4LWdyaWQzLXJv dyJdLGU9e3RzdHlsZTpTdHJpbmcuZm9ybWF0KCJ3aWR0aDogezB9OyIsdGhpcy5n ZXRUb3RhbFdpZHRoKCkpfSxhPVtdLGs9dGhpcy50ZW1wbGF0ZXMuY2VsbCxqLHEs YixvLGgsZDtpZihFeHQuaXNOdW1iZXIoZykpe2o9ZztnPWwuZ2V0QXQoail9ZWxz ZXtqPWwuaW5kZXhPZihnKX1pZighZ3x8ajwwKXtyZXR1cm59Zm9yKGQ9MDtkPG07 ZCsrKXtiPWNbZF07aWYoZD09MCl7aD0ieC1ncmlkMy1jZWxsLWZpcnN0In1lbHNl e2g9KGQ9PW4pPyJ4LWdyaWQzLWNlbGwtbGFzdCAiOiIifW89e2lkOmIuaWQsc3R5 bGU6Yi5zdHlsZSxjc3M6aCxhdHRyOiIiLGNlbGxBdHRyOiIifTtvLnZhbHVlPWIu cmVuZGVyZXIuY2FsbChiLnNjb3BlLGcuZGF0YVtiLm5hbWVdLG8sZyxqLGQsbCk7 aWYoRXh0LmlzRW1wdHkoby52YWx1ZSkpe28udmFsdWU9IiYjMTYwOyJ9aWYodGhp cy5tYXJrRGlydHkmJmcuZGlydHkmJnR5cGVvZiBnLm1vZGlmaWVkW2IubmFtZV0h PSJ1bmRlZmluZWQiKXtvLmNzcys9IiB4LWdyaWQzLWRpcnR5LWNlbGwifWFbZF09 ay5hcHBseShvKX1xPXRoaXMuZ2V0Um93KGopO3EuY2xhc3NOYW1lPSIiO2lmKHRo aXMuZ3JpZC5zdHJpcGVSb3dzJiYoKGorMSklMj09PTApKXtwLnB1c2goIngtZ3Jp ZDMtcm93LWFsdCIpfWlmKHRoaXMuZ2V0Um93Q2xhc3Mpe2UuY29scz1tO3AucHVz aCh0aGlzLmdldFJvd0NsYXNzKGcsaixlLGwpKX10aGlzLmZseShxKS5hZGRDbGFz cyhwKS5zZXRTdHlsZShlLnRzdHlsZSk7ZS5jZWxscz1hLmpvaW4oIiIpO3EuaW5u ZXJIVE1MPXRoaXMudGVtcGxhdGVzLnJvd0lubmVyLmFwcGx5KGUpO3RoaXMuZmly ZUV2ZW50KCJyb3d1cGRhdGVkIix0aGlzLGosZyl9LHJlZnJlc2g6ZnVuY3Rpb24o Yil7dGhpcy5maXJlRXZlbnQoImJlZm9yZXJlZnJlc2giLHRoaXMpO3RoaXMuZ3Jp ZC5zdG9wRWRpdGluZyh0cnVlKTt2YXIgYT10aGlzLnJlbmRlckJvZHkoKTt0aGlz Lm1haW5Cb2R5LnVwZGF0ZShhKS5zZXRXaWR0aCh0aGlzLmdldFRvdGFsV2lkdGgo KSk7aWYoYj09PXRydWUpe3RoaXMudXBkYXRlSGVhZGVycygpO3RoaXMudXBkYXRl SGVhZGVyU29ydFN0YXRlKCl9dGhpcy5wcm9jZXNzUm93cygwLHRydWUpO3RoaXMu bGF5b3V0KCk7dGhpcy5hcHBseUVtcHR5VGV4dCgpO3RoaXMuZmlyZUV2ZW50KCJy ZWZyZXNoIix0aGlzKX0sYXBwbHlFbXB0eVRleHQ6ZnVuY3Rpb24oKXtpZih0aGlz LmVtcHR5VGV4dCYmIXRoaXMuaGFzUm93cygpKXt0aGlzLm1haW5Cb2R5LnVwZGF0 ZSgnPGRpdiBjbGFzcz0ieC1ncmlkLWVtcHR5Ij4nK3RoaXMuZW1wdHlUZXh0KyI8 L2Rpdj4iKX19LHVwZGF0ZUhlYWRlclNvcnRTdGF0ZTpmdW5jdGlvbigpe3ZhciBi PXRoaXMuZHMuZ2V0U29ydFN0YXRlKCk7aWYoIWIpe3JldHVybn1pZighdGhpcy5z b3J0U3RhdGV8fCh0aGlzLnNvcnRTdGF0ZS5maWVsZCE9Yi5maWVsZHx8dGhpcy5z b3J0U3RhdGUuZGlyZWN0aW9uIT1iLmRpcmVjdGlvbikpe3RoaXMuZ3JpZC5maXJl RXZlbnQoInNvcnRjaGFuZ2UiLHRoaXMuZ3JpZCxiKX10aGlzLnNvcnRTdGF0ZT1i O3ZhciBjPXRoaXMuY20uZmluZENvbHVtbkluZGV4KGIuZmllbGQpO2lmKGMhPS0x KXt2YXIgYT1iLmRpcmVjdGlvbjt0aGlzLnVwZGF0ZVNvcnRJY29uKGMsYSl9fSxj bGVhckhlYWRlclNvcnRTdGF0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNvcnRTdGF0 ZSl7cmV0dXJufXRoaXMuZ3JpZC5maXJlRXZlbnQoInNvcnRjaGFuZ2UiLHRoaXMu Z3JpZCxudWxsKTt0aGlzLm1haW5IZC5zZWxlY3QoInRkIikucmVtb3ZlQ2xhc3Mo dGhpcy5zb3J0Q2xhc3Nlcyk7ZGVsZXRlIHRoaXMuc29ydFN0YXRlfSxkZXN0cm95 OmZ1bmN0aW9uKCl7dmFyIGo9dGhpcyxhPWouZ3JpZCxkPWEuZ2V0R3JpZEVsKCks aT1qLmRyYWdab25lLGc9ai5zcGxpdFpvbmUsaD1qLmNvbHVtbkRyYWcsZT1qLmNv bHVtbkRyb3Asaz1qLnNjcm9sbFRvVG9wVGFzayxjLGI7aWYoayYmay5jYW5jZWwp e2suY2FuY2VsKCl9RXh0LmRlc3Ryb3lNZW1iZXJzKGosImNvbE1lbnUiLCJobWVu dSIpO2ouaW5pdERhdGEobnVsbCxudWxsKTtqLnB1cmdlTGlzdGVuZXJzKCk7RXh0 LmZseShqLmlubmVySGQpLnVuKCJjbGljayIsai5oYW5kbGVIZERvd24saik7aWYo YS5lbmFibGVDb2x1bW5Nb3ZlKXtjPWguZHJhZ0RhdGE7Yj1oLnByb3h5O0V4dC5k ZXN0cm95KGguZWwsYi5naG9zdCxiLmVsLGUuZWwsZS5wcm94eVRvcCxlLnByb3h5 Qm90dG9tLGMuZGRlbCxjLmhlYWRlcik7aWYoYi5hbmltKXtFeHQuZGVzdHJveShi LmFuaW0pfWRlbGV0ZSBiLmdob3N0O2RlbGV0ZSBjLmRkZWw7ZGVsZXRlIGMuaGVh ZGVyO2guZGVzdHJveSgpO2RlbGV0ZSBFeHQuZGQuRERNLmxvY2F0aW9uQ2FjaGVb aC5pZF07ZGVsZXRlIGguX2RvbVJlZjtkZWxldGUgZS5wcm94eVRvcDtkZWxldGUg ZS5wcm94eUJvdHRvbTtlLmRlc3Ryb3koKTtkZWxldGUgRXh0LmRkLkRETS5sb2Nh dGlvbkNhY2hlWyJncmlkSGVhZGVyIitkLmlkXTtkZWxldGUgZS5fZG9tUmVmO2Rl bGV0ZSBFeHQuZGQuRERNLmlkc1tlLmRkR3JvdXBdfWlmKGcpe2cuZGVzdHJveSgp O2RlbGV0ZSBnLl9kb21SZWY7ZGVsZXRlIEV4dC5kZC5ERE0uaWRzWyJncmlkU3Bs aXR0ZXJzIitkLmlkXX1FeHQuZmx5KGouaW5uZXJIZCkucmVtb3ZlQWxsTGlzdGVu ZXJzKCk7RXh0LnJlbW92ZU5vZGUoai5pbm5lckhkKTtkZWxldGUgai5pbm5lckhk O0V4dC5kZXN0cm95KGouZWwsai5tYWluV3JhcCxqLm1haW5IZCxqLnNjcm9sbGVy LGoubWFpbkJvZHksai5mb2N1c0VsLGoucmVzaXplTWFya2VyLGoucmVzaXplUHJv eHksai5hY3RpdmVIZEJ0bixqLl9mbHl3ZWlnaHQsaSxnKTtkZWxldGUgYS5jb250 YWluZXI7aWYoaSl7aS5kZXN0cm95KCl9RXh0LmRkLkRETS5jdXJyZW50VGFyZ2V0 PW51bGw7ZGVsZXRlIEV4dC5kZC5ERE0ubG9jYXRpb25DYWNoZVtkLmlkXTtFeHQu RXZlbnRNYW5hZ2VyLnJlbW92ZVJlc2l6ZUxpc3RlbmVyKGoub25XaW5kb3dSZXNp emUsail9LG9uRGVueUNvbHVtbkhpZGU6ZnVuY3Rpb24oKXt9LHJlbmRlcjpmdW5j dGlvbigpe2lmKHRoaXMuYXV0b0ZpbGwpe3ZhciBhPXRoaXMuZ3JpZC5vd25lckN0 O2lmKGEmJmEuZ2V0TGF5b3V0KCkpe2Eub24oImFmdGVybGF5b3V0IixmdW5jdGlv bigpe3RoaXMuZml0Q29sdW1ucyh0cnVlLHRydWUpO3RoaXMudXBkYXRlSGVhZGVy cygpO3RoaXMudXBkYXRlSGVhZGVyU29ydFN0YXRlKCl9LHRoaXMse3NpbmdsZTp0 cnVlfSl9fWVsc2V7aWYodGhpcy5mb3JjZUZpdCl7dGhpcy5maXRDb2x1bW5zKHRy dWUsZmFsc2UpfWVsc2V7aWYodGhpcy5ncmlkLmF1dG9FeHBhbmRDb2x1bW4pe3Ro aXMuYXV0b0V4cGFuZCh0cnVlKX19fXRoaXMuZ3JpZC5nZXRHcmlkRWwoKS5kb20u aW5uZXJIVE1MPXRoaXMucmVuZGVyVUkoKTt0aGlzLmFmdGVyUmVuZGVyVUkoKX0s aW5pdERhdGE6ZnVuY3Rpb24oYSxlKXt2YXIgYj10aGlzO2lmKGIuZHMpe3ZhciBk PWIuZHM7ZC51bigiYWRkIixiLm9uQWRkLGIpO2QudW4oImxvYWQiLGIub25Mb2Fk LGIpO2QudW4oImNsZWFyIixiLm9uQ2xlYXIsYik7ZC51bigicmVtb3ZlIixiLm9u UmVtb3ZlLGIpO2QudW4oInVwZGF0ZSIsYi5vblVwZGF0ZSxiKTtkLnVuKCJkYXRh Y2hhbmdlZCIsYi5vbkRhdGFDaGFuZ2UsYik7aWYoZCE9PWEmJmQuYXV0b0Rlc3Ry b3kpe2QuZGVzdHJveSgpfX1pZihhKXthLm9uKHtzY29wZTpiLGxvYWQ6Yi5vbkxv YWQsYWRkOmIub25BZGQscmVtb3ZlOmIub25SZW1vdmUsdXBkYXRlOmIub25VcGRh dGUsY2xlYXI6Yi5vbkNsZWFyLGRhdGFjaGFuZ2VkOmIub25EYXRhQ2hhbmdlfSl9 aWYoYi5jbSl7dmFyIGM9Yi5jbTtjLnVuKCJjb25maWdjaGFuZ2UiLGIub25Db2xD b25maWdDaGFuZ2UsYik7Yy51bigid2lkdGhjaGFuZ2UiLGIub25Db2xXaWR0aENo YW5nZSxiKTtjLnVuKCJoZWFkZXJjaGFuZ2UiLGIub25IZWFkZXJDaGFuZ2UsYik7 Yy51bigiaGlkZGVuY2hhbmdlIixiLm9uSGlkZGVuQ2hhbmdlLGIpO2MudW4oImNv bHVtbm1vdmVkIixiLm9uQ29sdW1uTW92ZSxiKX1pZihlKXtkZWxldGUgYi5sYXN0 Vmlld1dpZHRoO2Uub24oe3Njb3BlOmIsY29uZmlnY2hhbmdlOmIub25Db2xDb25m aWdDaGFuZ2Usd2lkdGhjaGFuZ2U6Yi5vbkNvbFdpZHRoQ2hhbmdlLGhlYWRlcmNo YW5nZTpiLm9uSGVhZGVyQ2hhbmdlLGhpZGRlbmNoYW5nZTpiLm9uSGlkZGVuQ2hh bmdlLGNvbHVtbm1vdmVkOmIub25Db2x1bW5Nb3ZlfSl9Yi5kcz1hO2IuY209ZX0s b25EYXRhQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoKHRydWUpO3RoaXMu dXBkYXRlSGVhZGVyU29ydFN0YXRlKCk7dGhpcy5zeW5jRm9jdXNFbCgwKX0sb25D bGVhcjpmdW5jdGlvbigpe3RoaXMucmVmcmVzaCgpO3RoaXMuc3luY0ZvY3VzRWwo MCl9LG9uVXBkYXRlOmZ1bmN0aW9uKGIsYSl7dGhpcy5yZWZyZXNoUm93KGEpfSxv bkFkZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5pbnNlcnRSb3dzKGIsYyxjKyhhLmxl bmd0aC0xKSl9LG9uUmVtb3ZlOmZ1bmN0aW9uKGIsYSxjLGQpe2lmKGQhPT10cnVl KXt0aGlzLmZpcmVFdmVudCgiYmVmb3Jlcm93cmVtb3ZlZCIsdGhpcyxjLGEpfXRo aXMucmVtb3ZlUm93KGMpO2lmKGQhPT10cnVlKXt0aGlzLnByb2Nlc3NSb3dzKGMp O3RoaXMuYXBwbHlFbXB0eVRleHQoKTt0aGlzLmZpcmVFdmVudCgicm93cmVtb3Zl ZCIsdGhpcyxjLGEpfX0sb25Mb2FkOmZ1bmN0aW9uKCl7aWYoRXh0LmlzR2Vja28p e2lmKCF0aGlzLnNjcm9sbFRvVG9wVGFzayl7dGhpcy5zY3JvbGxUb1RvcFRhc2s9 bmV3IEV4dC51dGlsLkRlbGF5ZWRUYXNrKHRoaXMuc2Nyb2xsVG9Ub3AsdGhpcyl9 dGhpcy5zY3JvbGxUb1RvcFRhc2suZGVsYXkoMSl9ZWxzZXt0aGlzLnNjcm9sbFRv VG9wKCl9fSxvbkNvbFdpZHRoQ2hhbmdlOmZ1bmN0aW9uKGEsYixjKXt0aGlzLnVw ZGF0ZUNvbHVtbldpZHRoKGIsYyl9LG9uSGVhZGVyQ2hhbmdlOmZ1bmN0aW9uKGEs YixjKXt0aGlzLnVwZGF0ZUhlYWRlcnMoKX0sb25IaWRkZW5DaGFuZ2U6ZnVuY3Rp b24oYSxiLGMpe3RoaXMudXBkYXRlQ29sdW1uSGlkZGVuKGIsYyl9LG9uQ29sdW1u TW92ZTpmdW5jdGlvbihhLGMsYil7dGhpcy5pbmRleE1hcD1udWxsO3RoaXMucmVm cmVzaCh0cnVlKTt0aGlzLnJlc3RvcmVTY3JvbGwodGhpcy5nZXRTY3JvbGxTdGF0 ZSgpKTt0aGlzLmFmdGVyTW92ZShiKTt0aGlzLmdyaWQuZmlyZUV2ZW50KCJjb2x1 bW5tb3ZlIixjLGIpfSxvbkNvbENvbmZpZ0NoYW5nZTpmdW5jdGlvbigpe2RlbGV0 ZSB0aGlzLmxhc3RWaWV3V2lkdGg7dGhpcy5pbmRleE1hcD1udWxsO3RoaXMucmVm cmVzaCh0cnVlKX0saW5pdFVJOmZ1bmN0aW9uKGEpe2Eub24oImhlYWRlcmNsaWNr Iix0aGlzLm9uSGVhZGVyQ2xpY2ssdGhpcyl9LGluaXRFdmVudHM6RXh0LmVtcHR5 Rm4sb25IZWFkZXJDbGljazpmdW5jdGlvbihiLGEpe2lmKHRoaXMuaGVhZGVyc0Rp c2FibGVkfHwhdGhpcy5jbS5pc1NvcnRhYmxlKGEpKXtyZXR1cm59Yi5zdG9wRWRp dGluZyh0cnVlKTtiLnN0b3JlLnNvcnQodGhpcy5jbS5nZXREYXRhSW5kZXgoYSkp fSxvblJvd092ZXI6ZnVuY3Rpb24oYixhKXt2YXIgYz10aGlzLmZpbmRSb3dJbmRl eChhKTtpZihjIT09ZmFsc2Upe3RoaXMuYWRkUm93Q2xhc3MoYyx0aGlzLnJvd092 ZXJDbHMpfX0sb25Sb3dPdXQ6ZnVuY3Rpb24oYixhKXt2YXIgYz10aGlzLmZpbmRS b3dJbmRleChhKTtpZihjIT09ZmFsc2UmJiFiLndpdGhpbih0aGlzLmdldFJvdyhj KSx0cnVlKSl7dGhpcy5yZW1vdmVSb3dDbGFzcyhjLHRoaXMucm93T3ZlckNscyl9 fSxvblJvd1NlbGVjdDpmdW5jdGlvbihhKXt0aGlzLmFkZFJvd0NsYXNzKGEsdGhp cy5zZWxlY3RlZFJvd0NsYXNzKX0sb25Sb3dEZXNlbGVjdDpmdW5jdGlvbihhKXt0 aGlzLnJlbW92ZVJvd0NsYXNzKGEsdGhpcy5zZWxlY3RlZFJvd0NsYXNzKX0sb25D ZWxsU2VsZWN0OmZ1bmN0aW9uKGMsYil7dmFyIGE9dGhpcy5nZXRDZWxsKGMsYik7 aWYoYSl7dGhpcy5mbHkoYSkuYWRkQ2xhc3MoIngtZ3JpZDMtY2VsbC1zZWxlY3Rl ZCIpfX0sb25DZWxsRGVzZWxlY3Q6ZnVuY3Rpb24oYyxiKXt2YXIgYT10aGlzLmdl dENlbGwoYyxiKTtpZihhKXt0aGlzLmZseShhKS5yZW1vdmVDbGFzcygieC1ncmlk My1jZWxsLXNlbGVjdGVkIil9fSxoYW5kbGVXaGVlbDpmdW5jdGlvbihhKXthLnN0 b3BQcm9wYWdhdGlvbigpfSxvbkNvbHVtblNwbGl0dGVyTW92ZWQ6ZnVuY3Rpb24o YSxiKXt0aGlzLnVzZXJSZXNpemVkPXRydWU7dGhpcy5ncmlkLmNvbE1vZGVsLnNl dENvbHVtbldpZHRoKGEsYix0cnVlKTtpZih0aGlzLmZvcmNlRml0KXt0aGlzLmZp dENvbHVtbnModHJ1ZSxmYWxzZSxhKTt0aGlzLnVwZGF0ZUFsbENvbHVtbldpZHRo cygpfWVsc2V7dGhpcy51cGRhdGVDb2x1bW5XaWR0aChhLGIpO3RoaXMuc3luY0hl YWRlclNjcm9sbCgpfXRoaXMuZ3JpZC5maXJlRXZlbnQoImNvbHVtbnJlc2l6ZSIs YSxiKX0sYmVmb3JlQ29sTWVudVNob3c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmNt LGQ9Yi5nZXRDb2x1bW5Db3VudCgpLGE9dGhpcy5jb2xNZW51LGM7YS5yZW1vdmVB bGwoKTtmb3IoYz0wO2M8ZDtjKyspe2lmKGIuY29uZmlnW2NdLmhpZGVhYmxlIT09 ZmFsc2Upe2EuYWRkKG5ldyBFeHQubWVudS5DaGVja0l0ZW0oe3RleHQ6Yi5nZXRD b2x1bW5IZWFkZXIoYyksaXRlbUlkOiJjb2wtIitiLmdldENvbHVtbklkKGMpLGNo ZWNrZWQ6IWIuaXNIaWRkZW4oYyksZGlzYWJsZWQ6Yi5jb25maWdbY10uaGlkZWFi bGU9PT1mYWxzZSxoaWRlT25DbGljazpmYWxzZX0pKX19fSxoYW5kbGVIZE1lbnVD bGljazpmdW5jdGlvbihjKXt2YXIgYT10aGlzLmRzLGI9dGhpcy5jbS5nZXREYXRh SW5kZXgodGhpcy5oZEN0eEluZGV4KTtzd2l0Y2goYy5nZXRJdGVtSWQoKSl7Y2Fz ZSJhc2MiOmEuc29ydChiLCJBU0MiKTticmVhaztjYXNlImRlc2MiOmEuc29ydChi LCJERVNDIik7YnJlYWs7ZGVmYXVsdDp0aGlzLmhhbmRsZUhkTWVudUNsaWNrRGVm YXVsdChjKX1yZXR1cm4gdHJ1ZX0saGFuZGxlSGRNZW51Q2xpY2tEZWZhdWx0OmZ1 bmN0aW9uKGMpe3ZhciBiPXRoaXMuY20sZD1jLmdldEl0ZW1JZCgpLGE9Yi5nZXRJ bmRleEJ5SWQoZC5zdWJzdHIoNCkpO2lmKGEhPS0xKXtpZihjLmNoZWNrZWQmJmIu Z2V0Q29sdW1uc0J5KHRoaXMuaXNIaWRlYWJsZUNvbHVtbix0aGlzKS5sZW5ndGg8 PTEpe3RoaXMub25EZW55Q29sdW1uSGlkZSgpO3JldHVybn1iLnNldEhpZGRlbihh LGMuY2hlY2tlZCl9fSxoYW5kbGVIZERvd246ZnVuY3Rpb24oaSxqKXtpZihFeHQu Zmx5KGopLmhhc0NsYXNzKCJ4LWdyaWQzLWhkLWJ0biIpKXtpLnN0b3BFdmVudCgp O3ZhciBrPXRoaXMuY20sZz10aGlzLmZpbmRIZWFkZXJDZWxsKGopLGg9dGhpcy5n ZXRDZWxsSW5kZXgoZyksZD1rLmlzU29ydGFibGUoaCksYz10aGlzLmhtZW51LGI9 Yy5pdGVtcyxhPXRoaXMuaGVhZGVyTWVudU9wZW5DbHM7dGhpcy5oZEN0eEluZGV4 PWg7RXh0LmZseShnKS5hZGRDbGFzcyhhKTtiLmdldCgiYXNjIikuc2V0RGlzYWJs ZWQoIWQpO2IuZ2V0KCJkZXNjIikuc2V0RGlzYWJsZWQoIWQpO2Mub24oImhpZGUi LGZ1bmN0aW9uKCl7RXh0LmZseShnKS5yZW1vdmVDbGFzcyhhKX0sdGhpcyx7c2lu Z2xlOnRydWV9KTtjLnNob3coaiwidGwtYmw/Iil9fSxoYW5kbGVIZE1vdmU6ZnVu Y3Rpb24oayl7dmFyIGk9dGhpcy5maW5kSGVhZGVyQ2VsbCh0aGlzLmFjdGl2ZUhk UmVmKTtpZihpJiYhdGhpcy5oZWFkZXJzRGlzYWJsZWQpe3ZhciBsPXRoaXMuc3Bs aXRIYW5kbGVXaWR0aHx8NSxqPXRoaXMuYWN0aXZlSGRSZWdpb24scD1pLnN0eWxl LG09dGhpcy5jbSxvPSIiLGc9ay5nZXRQYWdlWCgpO2lmKHRoaXMuZ3JpZC5lbmFi bGVDb2x1bW5SZXNpemUhPT1mYWxzZSl7dmFyIGE9dGhpcy5hY3RpdmVIZEluZGV4 LGI9dGhpcy5nZXRQcmV2aW91c1Zpc2libGUoYSksbj1tLmlzUmVzaXphYmxlKGEp LGM9YiYmbS5pc1Jlc2l6YWJsZShiKSxkPWctai5sZWZ0PD1sLGg9ai5yaWdodC1n PD0oIXRoaXMuYWN0aXZlSGRCdG4/bDoyKTtpZihkJiZjKXtvPUV4dC5pc0Fpcj8i bW92ZSI6RXh0LmlzV2ViS2l0PyJlLXJlc2l6ZSI6ImNvbC1yZXNpemUifWVsc2V7 aWYoaCYmbil7bz1FeHQuaXNBaXI/Im1vdmUiOkV4dC5pc1dlYktpdD8idy1yZXNp emUiOiJjb2wtcmVzaXplIn19fXAuY3Vyc29yPW99fSxnZXRQcmV2aW91c1Zpc2li bGU6ZnVuY3Rpb24oYSl7d2hpbGUoYT4wKXtpZighdGhpcy5jbS5pc0hpZGRlbihh LTEpKXtyZXR1cm4gYX1hLS19cmV0dXJuIHVuZGVmaW5lZH0saGFuZGxlSGRPdmVy OmZ1bmN0aW9uKGMsYil7dmFyIGQ9dGhpcy5maW5kSGVhZGVyQ2VsbChiKTtpZihk JiYhdGhpcy5oZWFkZXJzRGlzYWJsZWQpe3ZhciBhPXRoaXMuZmx5KGQpO3RoaXMu YWN0aXZlSGRSZWY9Yjt0aGlzLmFjdGl2ZUhkSW5kZXg9dGhpcy5nZXRDZWxsSW5k ZXgoZCk7dGhpcy5hY3RpdmVIZFJlZ2lvbj1hLmdldFJlZ2lvbigpO2lmKCF0aGlz LmlzTWVudURpc2FibGVkKHRoaXMuYWN0aXZlSGRJbmRleCxhKSl7YS5hZGRDbGFz cygieC1ncmlkMy1oZC1vdmVyIik7dGhpcy5hY3RpdmVIZEJ0bj1hLmNoaWxkKCIu eC1ncmlkMy1oZC1idG4iKTtpZih0aGlzLmFjdGl2ZUhkQnRuKXt0aGlzLmFjdGl2 ZUhkQnRuLmRvbS5zdHlsZS5oZWlnaHQ9KGQuZmlyc3RDaGlsZC5vZmZzZXRIZWln aHQtMSkrInB4In19fX0saGFuZGxlSGRPdXQ6ZnVuY3Rpb24oYixhKXt2YXIgYz10 aGlzLmZpbmRIZWFkZXJDZWxsKGEpO2lmKGMmJighRXh0LmlzSUV8fCFiLndpdGhp bihjLHRydWUpKSl7dGhpcy5hY3RpdmVIZFJlZj1udWxsO3RoaXMuZmx5KGMpLnJl bW92ZUNsYXNzKCJ4LWdyaWQzLWhkLW92ZXIiKTtjLnN0eWxlLmN1cnNvcj0iIn19 LGlzTWVudURpc2FibGVkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY20uaXNN ZW51RGlzYWJsZWQoYSl9LGhhc1Jvd3M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm1h aW5Cb2R5LmRvbS5maXJzdENoaWxkO3JldHVybiBhJiZhLm5vZGVUeXBlPT0xJiZh LmNsYXNzTmFtZSE9IngtZ3JpZC1lbXB0eSJ9LGlzSGlkZWFibGVDb2x1bW46ZnVu Y3Rpb24oYSl7cmV0dXJuICFhLmhpZGRlbn0sYmluZDpmdW5jdGlvbihhLGIpe3Ro aXMuaW5pdERhdGEoYSxiKX19KTtFeHQuZ3JpZC5HcmlkVmlldy5TcGxpdERyYWda b25lPUV4dC5leHRlbmQoRXh0LmRkLkREUHJveHkse2NvbnN0cnVjdG9yOmZ1bmN0 aW9uKGEsYil7dGhpcy5ncmlkPWE7dGhpcy52aWV3PWEuZ2V0VmlldygpO3RoaXMu bWFya2VyPXRoaXMudmlldy5yZXNpemVNYXJrZXI7dGhpcy5wcm94eT10aGlzLnZp ZXcucmVzaXplUHJveHk7RXh0LmdyaWQuR3JpZFZpZXcuU3BsaXREcmFnWm9uZS5z dXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxiLCJncmlkU3BsaXR0ZXJz Iit0aGlzLmdyaWQuZ2V0R3JpZEVsKCkuaWQse2RyYWdFbElkOkV4dC5pZCh0aGlz LnByb3h5LmRvbSkscmVzaXplRnJhbWU6ZmFsc2V9KTt0aGlzLnNjcm9sbD1mYWxz ZTt0aGlzLmh3PXRoaXMudmlldy5zcGxpdEhhbmRsZVdpZHRofHw1fSxiNFN0YXJ0 RHJhZzpmdW5jdGlvbihhLGUpe3RoaXMuZHJhZ0hlYWRlcnNEaXNhYmxlZD10aGlz LnZpZXcuaGVhZGVyc0Rpc2FibGVkO3RoaXMudmlldy5oZWFkZXJzRGlzYWJsZWQ9 dHJ1ZTt2YXIgZD10aGlzLnZpZXcubWFpbldyYXAuZ2V0SGVpZ2h0KCk7dGhpcy5t YXJrZXIuc2V0SGVpZ2h0KGQpO3RoaXMubWFya2VyLnNob3coKTt0aGlzLm1hcmtl ci5hbGlnblRvKHRoaXMudmlldy5nZXRIZWFkZXJDZWxsKHRoaXMuY2VsbEluZGV4 KSwidGwtdGwiLFstMiwwXSk7dGhpcy5wcm94eS5zZXRIZWlnaHQoZCk7dmFyIGI9 dGhpcy5jbS5nZXRDb2x1bW5XaWR0aCh0aGlzLmNlbGxJbmRleCksYz1NYXRoLm1h eChiLXRoaXMuZ3JpZC5taW5Db2x1bW5XaWR0aCwwKTt0aGlzLnJlc2V0Q29uc3Ry YWludHMoKTt0aGlzLnNldFhDb25zdHJhaW50KGMsMTAwMCk7dGhpcy5zZXRZQ29u c3RyYWludCgwLDApO3RoaXMubWluWD1hLWM7dGhpcy5tYXhYPWErMTAwMDt0aGlz LnN0YXJ0UG9zPWE7RXh0LmRkLkREUHJveHkucHJvdG90eXBlLmI0U3RhcnREcmFn LmNhbGwodGhpcyxhLGUpfSxhbGxvd0hlYWRlckRyYWc6ZnVuY3Rpb24oYSl7cmV0 dXJuIHRydWV9LGhhbmRsZU1vdXNlRG93bjpmdW5jdGlvbihhKXt2YXIgaD10aGlz LnZpZXcuZmluZEhlYWRlckNlbGwoYS5nZXRUYXJnZXQoKSk7aWYoaCYmdGhpcy5h bGxvd0hlYWRlckRyYWcoYSkpe3ZhciBrPXRoaXMudmlldy5mbHkoaCkuZ2V0WFko KSxjPWtbMF0saT1hLmdldFhZKCksYj1pWzBdLGc9aC5vZmZzZXRXaWR0aCxkPWZh bHNlO2lmKChiLWMpPD10aGlzLmh3KXtkPS0xfWVsc2V7aWYoKGMrZyktYjw9dGhp cy5odyl7ZD0wfX1pZihkIT09ZmFsc2Upe3RoaXMuY209dGhpcy5ncmlkLmNvbE1v ZGVsO3ZhciBqPXRoaXMudmlldy5nZXRDZWxsSW5kZXgoaCk7aWYoZD09LTEpe2lm KGorZDwwKXtyZXR1cm59d2hpbGUodGhpcy5jbS5pc0hpZGRlbihqK2QpKXstLWQ7 aWYoaitkPDApe3JldHVybn19fXRoaXMuY2VsbEluZGV4PWorZDt0aGlzLnNwbGl0 PWguZG9tO2lmKHRoaXMuY20uaXNSZXNpemFibGUodGhpcy5jZWxsSW5kZXgpJiYh dGhpcy5jbS5pc0ZpeGVkKHRoaXMuY2VsbEluZGV4KSl7RXh0LmdyaWQuR3JpZFZp ZXcuU3BsaXREcmFnWm9uZS5zdXBlcmNsYXNzLmhhbmRsZU1vdXNlRG93bi5hcHBs eSh0aGlzLGFyZ3VtZW50cyl9fWVsc2V7aWYodGhpcy52aWV3LmNvbHVtbkRyYWcp e3RoaXMudmlldy5jb2x1bW5EcmFnLmNhbGxIYW5kbGVNb3VzZURvd24oYSl9fX19 LGVuZERyYWc6ZnVuY3Rpb24oZyl7dGhpcy5tYXJrZXIuaGlkZSgpO3ZhciBhPXRo aXMudmlldyxjPU1hdGgubWF4KHRoaXMubWluWCxnLmdldFBhZ2VYKCkpLGQ9Yy10 aGlzLnN0YXJ0UG9zLGI9dGhpcy5kcmFnSGVhZGVyc0Rpc2FibGVkO2Eub25Db2x1 bW5TcGxpdHRlck1vdmVkKHRoaXMuY2VsbEluZGV4LHRoaXMuY20uZ2V0Q29sdW1u V2lkdGgodGhpcy5jZWxsSW5kZXgpK2QpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXth LmhlYWRlcnNEaXNhYmxlZD1ifSw1MCl9LGF1dG9PZmZzZXQ6ZnVuY3Rpb24oKXt0 aGlzLnNldERlbHRhKDAsMCl9fSk7RXh0LmdyaWQuUGl2b3RHcmlkVmlldz1FeHQu ZXh0ZW5kKEV4dC5ncmlkLkdyaWRWaWV3LHtjb2xIZWFkZXJDZWxsQ2xzOiJncmlk LWhkLWdyb3VwLWNlbGwiLHRpdGxlOiIiLGdldENvbHVtbkhlYWRlcnM6ZnVuY3Rp b24oKXtyZXR1cm4gdGhpcy5ncmlkLnRvcEF4aXMuYnVpbGRIZWFkZXJzKCl9LGdl dFJvd0hlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ncmlkLmxlZnRBeGlz LmJ1aWxkSGVhZGVycygpfSxyZW5kZXJSb3dzOmZ1bmN0aW9uKGEsdCl7dmFyIGI9 dGhpcy5ncmlkLG89Yi5leHRyYWN0RGF0YSgpLHA9by5sZW5ndGgsZz10aGlzLnRl bXBsYXRlcyxzPWIucmVuZGVyZXIsaD10eXBlb2Ygcz09ImZ1bmN0aW9uIix3PXRo aXMuZ2V0Q2VsbENscyxuPXR5cGVvZiB3PT0iZnVuY3Rpb24iLGQ9Zy5jZWxsLHg9 Zy5yb3csaz1bXSxxPXt9LGM9IndpZHRoOiIrdGhpcy5nZXRHcmlkSW5uZXJXaWR0 aCgpKyJweDsiLGwscixlLHYsbTthPWF8fDA7dD1FeHQuaXNEZWZpbmVkKHQpP3Q6 cC0xO2Zvcih2PTA7djxwO3YrKyl7bT1vW3ZdO3I9bS5sZW5ndGg7bD1bXTtmb3Io dmFyIHU9MDt1PHI7dSsrKXtxLmlkPXYrIi0iK3U7cS5jc3M9dT09PTA/IngtZ3Jp ZDMtY2VsbC1maXJzdCAiOih1PT0oci0xKT8ieC1ncmlkMy1jZWxsLWxhc3QgIjoi Iik7cS5hdHRyPXEuY2VsbEF0dHI9IiI7cS52YWx1ZT1tW3VdO2lmKEV4dC5pc0Vt cHR5KHEudmFsdWUpKXtxLnZhbHVlPSImIzE2MDsifWlmKGgpe3EudmFsdWU9cyhx LnZhbHVlKX1pZihuKXtxLmNzcys9dyhxLnZhbHVlKSsiICJ9bFtsLmxlbmd0aF09 ZC5hcHBseShxKX1rW2subGVuZ3RoXT14LmFwcGx5KHt0c3R5bGU6Yyxjb2xzOnIs Y2VsbHM6bC5qb2luKCIiKSxhbHQ6IiJ9KX1yZXR1cm4gay5qb2luKCIiKX0sbWFz dGVyVHBsOm5ldyBFeHQuVGVtcGxhdGUoJzxkaXYgY2xhc3M9IngtZ3JpZDMgeC1w aXZvdGdyaWQiIGhpZGVmb2N1cz0idHJ1ZSI+JywnPGRpdiBjbGFzcz0ieC1ncmlk My12aWV3cG9ydCI+JywnPGRpdiBjbGFzcz0ieC1ncmlkMy1oZWFkZXIiPicsJzxk aXYgY2xhc3M9IngtZ3JpZDMtaGVhZGVyLXRpdGxlIj48c3Bhbj57dGl0bGV9PC9z cGFuPjwvZGl2PicsJzxkaXYgY2xhc3M9IngtZ3JpZDMtaGVhZGVyLWlubmVyIj4n LCc8ZGl2IGNsYXNzPSJ4LWdyaWQzLWhlYWRlci1vZmZzZXQiIHN0eWxlPSJ7b3N0 eWxlfSI+PC9kaXY+JywiPC9kaXY+IiwnPGRpdiBjbGFzcz0ieC1jbGVhciI+PC9k aXY+JywiPC9kaXY+IiwnPGRpdiBjbGFzcz0ieC1ncmlkMy1zY3JvbGxlciI+Jywn PGRpdiBjbGFzcz0ieC1ncmlkMy1yb3ctaGVhZGVycyI+PC9kaXY+JywnPGRpdiBj bGFzcz0ieC1ncmlkMy1ib2R5IiBzdHlsZT0ie2JzdHlsZX0iPntib2R5fTwvZGl2 PicsJzxhIGhyZWY9IiMiIGNsYXNzPSJ4LWdyaWQzLWZvY3VzIiB0YWJJbmRleD0i LTEiPjwvYT4nLCI8L2Rpdj4iLCI8L2Rpdj4iLCc8ZGl2IGNsYXNzPSJ4LWdyaWQz LXJlc2l6ZS1tYXJrZXIiPiYjMTYwOzwvZGl2PicsJzxkaXYgY2xhc3M9IngtZ3Jp ZDMtcmVzaXplLXByb3h5Ij4mIzE2MDs8L2Rpdj4nLCI8L2Rpdj4iKSxpbml0VGVt cGxhdGVzOmZ1bmN0aW9uKCl7RXh0LmdyaWQuUGl2b3RHcmlkVmlldy5zdXBlcmNs YXNzLmluaXRUZW1wbGF0ZXMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBhPXRo aXMudGVtcGxhdGVzfHx7fTtpZighYS5nY2VsbCl7YS5nY2VsbD1uZXcgRXh0LlhU ZW1wbGF0ZSgnPHRkIGNsYXNzPSJ4LWdyaWQzLWhkIHgtZ3JpZDMtZ2NlbGwgeC1n cmlkMy10ZC17aWR9IHV4LWdyaWQtaGQtZ3JvdXAtcm93LXtyb3d9ICcrdGhpcy5j b2xIZWFkZXJDZWxsQ2xzKyciIHN0eWxlPSJ7c3R5bGV9Ij4nLCc8ZGl2IHt0b29s dGlwfSBjbGFzcz0ieC1ncmlkMy1oZC1pbm5lciB4LWdyaWQzLWhkLXtpZH0iIHVu c2VsZWN0YWJsZT0ib24iIHN0eWxlPSJ7aXN0eWxlfSI+Jyx0aGlzLmdyaWQuZW5h YmxlSGRNZW51Pyc8YSBjbGFzcz0ieC1ncmlkMy1oZC1idG4iIGhyZWY9IiMiPjwv YT4nOiIiLCJ7dmFsdWV9IiwiPC9kaXY+IiwiPC90ZD4iKX10aGlzLnRlbXBsYXRl cz1hO3RoaXMuaHJvd1JlPW5ldyBSZWdFeHAoInV4LWdyaWQtaGQtZ3JvdXAtcm93 LShcXGQrKSIsIiIpfSxpbml0RWxlbWVudHM6ZnVuY3Rpb24oKXtFeHQuZ3JpZC5Q aXZvdEdyaWRWaWV3LnN1cGVyY2xhc3MuaW5pdEVsZW1lbnRzLmFwcGx5KHRoaXMs YXJndW1lbnRzKTt0aGlzLnJvd0hlYWRlcnNFbD1uZXcgRXh0LkVsZW1lbnQodGhp cy5zY3JvbGxlci5jaGlsZCgiZGl2LngtZ3JpZDMtcm93LWhlYWRlcnMiKSk7dGhp cy5oZWFkZXJUaXRsZUVsPW5ldyBFeHQuRWxlbWVudCh0aGlzLm1haW5IZC5jaGls ZCgiZGl2LngtZ3JpZDMtaGVhZGVyLXRpdGxlIikpfSxnZXRHcmlkSW5uZXJXaWR0 aDpmdW5jdGlvbigpe3ZhciBhPUV4dC5ncmlkLlBpdm90R3JpZFZpZXcuc3VwZXJj bGFzcy5nZXRHcmlkSW5uZXJXaWR0aC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0 dXJuIGEtdGhpcy5nZXRUb3RhbFJvd0hlYWRlcldpZHRoKCl9LGdldFRvdGFsUm93 SGVhZGVyV2lkdGg6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLmdldFJvd0hlYWRlcnMo KSxjPWQubGVuZ3RoLGI9MCxhO2ZvcihhPTA7YTxjO2ErKyl7Yis9ZFthXS53aWR0 aH1yZXR1cm4gYn0sZ2V0VG90YWxDb2x1bW5IZWFkZXJIZWlnaHQ6ZnVuY3Rpb24o KXtyZXR1cm4gdGhpcy5nZXRDb2x1bW5IZWFkZXJzKCkubGVuZ3RoKjIxfSxnZXRD ZWxsSW5kZXg6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9Yi5jbGFzc05hbWUubWF0 Y2godGhpcy5jb2xSZSksYztpZihhJiYoYz1hWzFdKSl7cmV0dXJuIHBhcnNlSW50 KGMuc3BsaXQoIi0iKVsxXSwxMCl9fXJldHVybiBmYWxzZX0scmVuZGVyVUk6ZnVu Y3Rpb24oKXt2YXIgYj10aGlzLnRlbXBsYXRlcyxhPXRoaXMuZ2V0R3JpZElubmVy V2lkdGgoKTtyZXR1cm4gYi5tYXN0ZXIuYXBwbHkoe2JvZHk6Yi5ib2R5LmFwcGx5 KHtyb3dzOiImIzE2MDsifSksb3N0eWxlOiJ3aWR0aDoiK2ErInB4Iixic3R5bGU6 IndpZHRoOiIrYSsicHgifSl9LG9uTGF5b3V0OmZ1bmN0aW9uKGIsYSl7RXh0Lmdy aWQuUGl2b3RHcmlkVmlldy5zdXBlcmNsYXNzLm9uTGF5b3V0LmFwcGx5KHRoaXMs YXJndW1lbnRzKTt2YXIgYj10aGlzLmdldEdyaWRJbm5lcldpZHRoKCk7dGhpcy5y ZXNpemVDb2x1bW5IZWFkZXJzKGIpO3RoaXMucmVzaXplQWxsUm93cyhiKX0scmVm cmVzaDpmdW5jdGlvbihiKXt0aGlzLmZpcmVFdmVudCgiYmVmb3JlcmVmcmVzaCIs dGhpcyk7dGhpcy5ncmlkLnN0b3BFZGl0aW5nKHRydWUpO3ZhciBhPXRoaXMucmVu ZGVyQm9keSgpO3RoaXMubWFpbkJvZHkudXBkYXRlKGEpLnNldFdpZHRoKHRoaXMu Z2V0R3JpZElubmVyV2lkdGgoKSk7aWYoYj09PXRydWUpe3RoaXMudXBkYXRlSGVh ZGVycygpO3RoaXMudXBkYXRlSGVhZGVyU29ydFN0YXRlKCl9dGhpcy5wcm9jZXNz Um93cygwLHRydWUpO3RoaXMubGF5b3V0KCk7dGhpcy5hcHBseUVtcHR5VGV4dCgp O3RoaXMuZmlyZUV2ZW50KCJyZWZyZXNoIix0aGlzKX0scmVuZGVySGVhZGVyczpF eHQuZW1wdHlGbixmaXRDb2x1bW5zOkV4dC5lbXB0eUZuLHJlc2l6ZUNvbHVtbkhl YWRlcnM6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5ncmlkLnRvcEF4aXM7aWYoYS5y ZW5kZXJlZCl7YS5lbC5zZXRXaWR0aChiKX19LHJlc2l6ZVJvd0hlYWRlcnM6ZnVu Y3Rpb24oKXt2YXIgYT10aGlzLmdldFRvdGFsUm93SGVhZGVyV2lkdGgoKSxiPVN0 cmluZy5mb3JtYXQoIm1hcmdpbi1sZWZ0OiB7MH1weDsiLGEpO3RoaXMucm93SGVh ZGVyc0VsLnNldFdpZHRoKGEpO3RoaXMubWFpbkJvZHkuYXBwbHlTdHlsZXMoYik7 RXh0LmZseSh0aGlzLmlubmVySGQpLmFwcGx5U3R5bGVzKGIpO3RoaXMuaGVhZGVy VGl0bGVFbC5zZXRXaWR0aChhKTt0aGlzLmhlYWRlclRpdGxlRWwuc2V0SGVpZ2h0 KHRoaXMuZ2V0VG90YWxDb2x1bW5IZWFkZXJIZWlnaHQoKSl9LHJlc2l6ZUFsbFJv d3M6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5nZXRSb3dzKCksYz1kLmxlbmd0aCxh O2ZvcihhPTA7YTxjO2ErKyl7RXh0LmZseShkW2FdKS5zZXRXaWR0aChiKTtFeHQu Zmx5KGRbYV0pLmNoaWxkKCJ0YWJsZSIpLnNldFdpZHRoKGIpfX0sdXBkYXRlSGVh ZGVyczpmdW5jdGlvbigpe3RoaXMucmVuZGVyR3JvdXBSb3dIZWFkZXJzKCk7dGhp cy5yZW5kZXJHcm91cENvbHVtbkhlYWRlcnMoKX0scmVuZGVyR3JvdXBSb3dIZWFk ZXJzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ncmlkLmxlZnRBeGlzO3RoaXMucmVz aXplUm93SGVhZGVycygpO2EucmVuZGVyZWQ9ZmFsc2U7YS5yZW5kZXIodGhpcy5y b3dIZWFkZXJzRWwpO3RoaXMuc2V0VGl0bGUodGhpcy50aXRsZSl9LHNldFRpdGxl OmZ1bmN0aW9uKGEpe3RoaXMuaGVhZGVyVGl0bGVFbC5jaGlsZCgic3BhbiIpLmRv bS5pbm5lckhUTUw9YX0scmVuZGVyR3JvdXBDb2x1bW5IZWFkZXJzOmZ1bmN0aW9u KCl7dmFyIGE9dGhpcy5ncmlkLnRvcEF4aXM7YS5yZW5kZXJlZD1mYWxzZTthLnJl bmRlcih0aGlzLmlubmVySGQuZmlyc3RDaGlsZCl9LGlzTWVudURpc2FibGVkOmZ1 bmN0aW9uKGEsYil7cmV0dXJuIHRydWV9fSk7RXh0LmdyaWQuUGl2b3RBeGlzPUV4 dC5leHRlbmQoRXh0LkNvbXBvbmVudCx7b3JpZW50YXRpb246Imhvcml6b250YWwi LGRlZmF1bHRIZWFkZXJXaWR0aDo4MCxwYWRkaW5nV2lkdGg6NyxzZXREaW1lbnNp b25zOmZ1bmN0aW9uKGEpe3RoaXMuZGltZW5zaW9ucz1hfSxvblJlbmRlcjpmdW5j dGlvbihiLGEpe3ZhciBjPXRoaXMub3JpZW50YXRpb249PSJob3Jpem9udGFsIj90 aGlzLnJlbmRlckhvcml6b250YWxSb3dzKCk6dGhpcy5yZW5kZXJWZXJ0aWNhbFJv d3MoKTt0aGlzLmVsPUV4dC5Eb21IZWxwZXIub3ZlcndyaXRlKGIuZG9tLHt0YWc6 InRhYmxlIixjbjpjfSx0cnVlKX0scmVuZGVySG9yaXpvbnRhbFJvd3M6ZnVuY3Rp b24oKXt2YXIgaz10aGlzLmJ1aWxkSGVhZGVycygpLGE9ay5sZW5ndGgsZz1bXSxj LGgsZSxkLGI7Zm9yKGQ9MDtkPGE7ZCsrKXtjPVtdO2g9a1tkXS5pdGVtcztlPWgu bGVuZ3RoO2ZvcihiPTA7YjxlO2IrKyl7Yy5wdXNoKHt0YWc6InRkIixodG1sOmhb Yl0uaGVhZGVyLGNvbHNwYW46aFtiXS5zcGFufSl9Z1tkXT17dGFnOiJ0ciIsY246 Y319cmV0dXJuIGd9LHJlbmRlclZlcnRpY2FsUm93czpmdW5jdGlvbigpe3ZhciBi PXRoaXMuYnVpbGRIZWFkZXJzKCksaz1iLmxlbmd0aCxhPVtdLG09W10saCxjLGws ZyxlLGQ7Zm9yKGU9MDtlPGs7ZSsrKXtjPWJbZV07Zz1jLndpZHRofHw4MDtoPWMu aXRlbXMubGVuZ3RoO2ZvcihkPTA7ZDxoO2QrKyl7bD1jLml0ZW1zW2RdO2FbbC5z dGFydF09YVtsLnN0YXJ0XXx8W107YVtsLnN0YXJ0XS5wdXNoKHt0YWc6InRkIixo dG1sOmwuaGVhZGVyLHJvd3NwYW46bC5zcGFuLHdpZHRoOkV4dC5pc0JvcmRlckJv eD9nOmctdGhpcy5wYWRkaW5nV2lkdGh9KX19aD1hLmxlbmd0aDtmb3IoZT0wO2U8 aDtlKyspe21bZV09e3RhZzoidHIiLGNuOmFbZV19fXJldHVybiBtfSxnZXRUdXBs ZXM6ZnVuY3Rpb24oKXt2YXIgYj1uZXcgRXh0LmRhdGEuU3RvcmUoe30pO2IuZGF0 YT10aGlzLnN0b3JlLmRhdGEuY2xvbmUoKTtiLmZpZWxkcz10aGlzLnN0b3JlLmZp ZWxkczt2YXIgbD1bXSxhPXRoaXMuZGltZW5zaW9ucyxjPWEubGVuZ3RoLGo7Zm9y KGo9MDtqPGM7aisrKXtsLnB1c2goe2ZpZWxkOmFbal0uZGF0YUluZGV4LGRpcmVj dGlvbjphW2pdLmRpcmVjdGlvbnx8IkFTQyJ9KX1iLnNvcnQobCk7dmFyIGU9Yi5k YXRhLml0ZW1zLG49W10saz1bXSxvLGgsZCxnLG07Yz1lLmxlbmd0aDtmb3Ioaj0w O2o8YztqKyspe2Q9dGhpcy5nZXRSZWNvcmRJbmZvKGVbal0pO2c9ZC5kYXRhO2g9 IiI7Zm9yKG0gaW4gZyl7aCs9Z1ttXSsiLS0tIn1pZihuLmluZGV4T2YoaCk9PS0x KXtuLnB1c2goaCk7ay5wdXNoKGQpfX1iLmRlc3Ryb3koKTtyZXR1cm4ga30sZ2V0 UmVjb3JkSW5mbzpmdW5jdGlvbihhKXt2YXIgZT10aGlzLmRpbWVuc2lvbnMsZD1l Lmxlbmd0aCxoPXt9LGosYyxiO2ZvcihiPTA7YjxkO2IrKyl7aj1lW2JdO2M9ai5k YXRhSW5kZXg7aFtjXT1hLmdldChjKX12YXIgZz1mdW5jdGlvbihpKXtyZXR1cm4g ZnVuY3Rpb24oayl7Zm9yKHZhciBsIGluIGkpe2lmKGsuZ2V0KGwpIT1pW2xdKXty ZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfX07cmV0dXJue2RhdGE6aCxtYXRjaGVy OmcoaCl9fSxidWlsZEhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgbD10aGlzLmdldFR1 cGxlcygpLG09bC5sZW5ndGgsYT10aGlzLmRpbWVuc2lvbnMsZSxyPWEubGVuZ3Ro LGM9W10sbyxzLG4scSxwLGIsayxoLGcsZDtmb3IoZz0wO2c8cjtnKyspe2U9YVtn XTtzPVtdO3A9MDtiPTA7Zm9yKGQ9MDtkPG07ZCsrKXtvPWxbZF07az1kPT0obS0x KTtuPW8uZGF0YVtlLmRhdGFJbmRleF07aD1xIT11bmRlZmluZWQmJnEhPW47aWYo Zz4wJiZkPjApe2g9aHx8by5kYXRhW2FbZy0xXS5kYXRhSW5kZXhdIT1sW2QtMV0u ZGF0YVthW2ctMV0uZGF0YUluZGV4XX1pZihoKXtzLnB1c2goe2hlYWRlcjpxLHNw YW46cCxzdGFydDpifSk7Yis9cDtwPTB9aWYoayl7cy5wdXNoKHtoZWFkZXI6bixz cGFuOnArMSxzdGFydDpifSk7Yis9cDtwPTB9cT1uO3ArK31jLnB1c2goe2l0ZW1z OnMsd2lkdGg6ZS53aWR0aHx8dGhpcy5kZWZhdWx0SGVhZGVyV2lkdGh9KTtxPXVu ZGVmaW5lZH1yZXR1cm4gY319KTtFeHQuZ3JpZC5IZWFkZXJEcmFnWm9uZT1FeHQu ZXh0ZW5kKEV4dC5kZC5EcmFnWm9uZSx7bWF4RHJhZ1dpZHRoOjEyMCxjb25zdHJ1 Y3RvcjpmdW5jdGlvbihhLGMsYil7dGhpcy5ncmlkPWE7dGhpcy52aWV3PWEuZ2V0 VmlldygpO3RoaXMuZGRHcm91cD0iZ3JpZEhlYWRlciIrdGhpcy5ncmlkLmdldEdy aWRFbCgpLmlkO0V4dC5ncmlkLkhlYWRlckRyYWdab25lLnN1cGVyY2xhc3MuY29u c3RydWN0b3IuY2FsbCh0aGlzLGMpO2lmKGIpe3RoaXMuc2V0SGFuZGxlRWxJZChF eHQuaWQoYykpO3RoaXMuc2V0T3V0ZXJIYW5kbGVFbElkKEV4dC5pZChiKSl9dGhp cy5zY3JvbGw9ZmFsc2V9LGdldERyYWdEYXRhOmZ1bmN0aW9uKGMpe3ZhciBhPUV4 dC5saWIuRXZlbnQuZ2V0VGFyZ2V0KGMpLGI9dGhpcy52aWV3LmZpbmRIZWFkZXJD ZWxsKGEpO2lmKGIpe3JldHVybntkZGVsOmIuZmlyc3RDaGlsZCxoZWFkZXI6Yn19 cmV0dXJuIGZhbHNlfSxvbkluaXREcmFnOmZ1bmN0aW9uKGEpe3RoaXMuZHJhZ0hl YWRlcnNEaXNhYmxlZD10aGlzLnZpZXcuaGVhZGVyc0Rpc2FibGVkO3RoaXMudmll dy5oZWFkZXJzRGlzYWJsZWQ9dHJ1ZTt2YXIgYj10aGlzLmRyYWdEYXRhLmRkZWwu Y2xvbmVOb2RlKHRydWUpO2IuaWQ9RXh0LmlkKCk7Yi5zdHlsZS53aWR0aD1NYXRo Lm1pbih0aGlzLmRyYWdEYXRhLmhlYWRlci5vZmZzZXRXaWR0aCx0aGlzLm1heERy YWdXaWR0aCkrInB4Ijt0aGlzLnByb3h5LnVwZGF0ZShiKTtyZXR1cm4gdHJ1ZX0s YWZ0ZXJWYWxpZERyb3A6ZnVuY3Rpb24oKXt0aGlzLmNvbXBsZXRlRHJvcCgpfSxh ZnRlckludmFsaWREcm9wOmZ1bmN0aW9uKCl7dGhpcy5jb21wbGV0ZURyb3AoKX0s Y29tcGxldGVEcm9wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWV3LGI9dGhpcy5k cmFnSGVhZGVyc0Rpc2FibGVkO3NldFRpbWVvdXQoZnVuY3Rpb24oKXthLmhlYWRl cnNEaXNhYmxlZD1ifSw1MCl9fSk7RXh0LmdyaWQuSGVhZGVyRHJvcFpvbmU9RXh0 LmV4dGVuZChFeHQuZGQuRHJvcFpvbmUse3Byb3h5T2Zmc2V0czpbLTQsLTldLGZs eTpFeHQuRWxlbWVudC5mbHksY29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjLGIpe3Ro aXMuZ3JpZD1hO3RoaXMudmlldz1hLmdldFZpZXcoKTt0aGlzLnByb3h5VG9wPUV4 dC5Eb21IZWxwZXIuYXBwZW5kKGRvY3VtZW50LmJvZHkse2NsczoiY29sLW1vdmUt dG9wIixodG1sOiImIzE2MDsifSx0cnVlKTt0aGlzLnByb3h5Qm90dG9tPUV4dC5E b21IZWxwZXIuYXBwZW5kKGRvY3VtZW50LmJvZHkse2NsczoiY29sLW1vdmUtYm90 dG9tIixodG1sOiImIzE2MDsifSx0cnVlKTt0aGlzLnByb3h5VG9wLmhpZGU9dGhp cy5wcm94eUJvdHRvbS5oaWRlPWZ1bmN0aW9uKCl7dGhpcy5zZXRMZWZ0VG9wKC0x MDAsLTEwMCk7dGhpcy5zZXRTdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfTt0 aGlzLmRkR3JvdXA9ImdyaWRIZWFkZXIiK3RoaXMuZ3JpZC5nZXRHcmlkRWwoKS5p ZDtFeHQuZ3JpZC5IZWFkZXJEcm9wWm9uZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9y LmNhbGwodGhpcyxhLmdldEdyaWRFbCgpLmRvbSl9LGdldFRhcmdldEZyb21FdmVu dDpmdW5jdGlvbihjKXt2YXIgYT1FeHQubGliLkV2ZW50LmdldFRhcmdldChjKSxi PXRoaXMudmlldy5maW5kQ2VsbEluZGV4KGEpO2lmKGIhPT1mYWxzZSl7cmV0dXJu IHRoaXMudmlldy5nZXRIZWFkZXJDZWxsKGIpfX0sbmV4dFZpc2libGU6ZnVuY3Rp b24oYyl7dmFyIGI9dGhpcy52aWV3LGE9dGhpcy5ncmlkLmNvbE1vZGVsO2M9Yy5u ZXh0U2libGluZzt3aGlsZShjKXtpZighYS5pc0hpZGRlbihiLmdldENlbGxJbmRl eChjKSkpe3JldHVybiBjfWM9Yy5uZXh0U2libGluZ31yZXR1cm4gbnVsbH0scHJl dlZpc2libGU6ZnVuY3Rpb24oYyl7dmFyIGI9dGhpcy52aWV3LGE9dGhpcy5ncmlk LmNvbE1vZGVsO2M9Yy5wcmV2U2libGluZzt3aGlsZShjKXtpZighYS5pc0hpZGRl bihiLmdldENlbGxJbmRleChjKSkpe3JldHVybiBjfWM9Yy5wcmV2U2libGluZ31y ZXR1cm4gbnVsbH0scG9zaXRpb25JbmRpY2F0b3I6ZnVuY3Rpb24oZCxrLGope3Zh ciBhPUV4dC5saWIuRXZlbnQuZ2V0UGFnZVgoaiksZz1FeHQubGliLkRvbS5nZXRS ZWdpb24oay5maXJzdENoaWxkKSxjLGksYj1nLnRvcCt0aGlzLnByb3h5T2Zmc2V0 c1sxXTtpZigoZy5yaWdodC1hKTw9KGcucmlnaHQtZy5sZWZ0KS8yKXtjPWcucmln aHQrdGhpcy52aWV3LmJvcmRlcldpZHRoO2k9ImFmdGVyIn1lbHNle2M9Zy5sZWZ0 O2k9ImJlZm9yZSJ9aWYodGhpcy5ncmlkLmNvbE1vZGVsLmlzRml4ZWQodGhpcy52 aWV3LmdldENlbGxJbmRleChrKSkpe3JldHVybiBmYWxzZX1jKz10aGlzLnByb3h5 T2Zmc2V0c1swXTt0aGlzLnByb3h5VG9wLnNldExlZnRUb3AoYyxiKTt0aGlzLnBy b3h5VG9wLnNob3coKTtpZighdGhpcy5ib3R0b21PZmZzZXQpe3RoaXMuYm90dG9t T2Zmc2V0PXRoaXMudmlldy5tYWluSGQuZ2V0SGVpZ2h0KCl9dGhpcy5wcm94eUJv dHRvbS5zZXRMZWZ0VG9wKGMsYit0aGlzLnByb3h5VG9wLmRvbS5vZmZzZXRIZWln aHQrdGhpcy5ib3R0b21PZmZzZXQpO3RoaXMucHJveHlCb3R0b20uc2hvdygpO3Jl dHVybiBpfSxvbk5vZGVFbnRlcjpmdW5jdGlvbihkLGEsYyxiKXtpZihiLmhlYWRl ciE9ZCl7dGhpcy5wb3NpdGlvbkluZGljYXRvcihiLmhlYWRlcixkLGMpfX0sb25O b2RlT3ZlcjpmdW5jdGlvbihnLGIsZCxjKXt2YXIgYT1mYWxzZTtpZihjLmhlYWRl ciE9Zyl7YT10aGlzLnBvc2l0aW9uSW5kaWNhdG9yKGMuaGVhZGVyLGcsZCl9aWYo IWEpe3RoaXMucHJveHlUb3AuaGlkZSgpO3RoaXMucHJveHlCb3R0b20uaGlkZSgp fXJldHVybiBhP3RoaXMuZHJvcEFsbG93ZWQ6dGhpcy5kcm9wTm90QWxsb3dlZH0s b25Ob2RlT3V0OmZ1bmN0aW9uKGQsYSxjLGIpe3RoaXMucHJveHlUb3AuaGlkZSgp O3RoaXMucHJveHlCb3R0b20uaGlkZSgpfSxvbk5vZGVEcm9wOmZ1bmN0aW9uKGIs bSxnLGMpe3ZhciBkPWMuaGVhZGVyO2lmKGQhPWIpe3ZhciBrPXRoaXMuZ3JpZC5j b2xNb2RlbCxqPUV4dC5saWIuRXZlbnQuZ2V0UGFnZVgoZyksYT1FeHQubGliLkRv bS5nZXRSZWdpb24oYi5maXJzdENoaWxkKSxvPShhLnJpZ2h0LWopPD0oKGEucmln aHQtYS5sZWZ0KS8yKT8iYWZ0ZXIiOiJiZWZvcmUiLGk9dGhpcy52aWV3LmdldENl bGxJbmRleChkKSxsPXRoaXMudmlldy5nZXRDZWxsSW5kZXgoYik7aWYobz09ImFm dGVyIil7bCsrfWlmKGk8bCl7bC0tfWsubW92ZUNvbHVtbihpLGwpO3JldHVybiB0 cnVlfXJldHVybiBmYWxzZX19KTtFeHQuZ3JpZC5HcmlkVmlldy5Db2x1bW5EcmFn Wm9uZT1FeHQuZXh0ZW5kKEV4dC5ncmlkLkhlYWRlckRyYWdab25lLHtjb25zdHJ1 Y3RvcjpmdW5jdGlvbihhLGIpe0V4dC5ncmlkLkdyaWRWaWV3LkNvbHVtbkRyYWda b25lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEsYixudWxsKTt0 aGlzLnByb3h5LmVsLmFkZENsYXNzKCJ4LWdyaWQzLWNvbC1kZCIpfSxoYW5kbGVN b3VzZURvd246ZnVuY3Rpb24oYSl7fSxjYWxsSGFuZGxlTW91c2VEb3duOmZ1bmN0 aW9uKGEpe0V4dC5ncmlkLkdyaWRWaWV3LkNvbHVtbkRyYWdab25lLnN1cGVyY2xh c3MuaGFuZGxlTW91c2VEb3duLmNhbGwodGhpcyxhKX19KTtFeHQuZ3JpZC5TcGxp dERyYWdab25lPUV4dC5leHRlbmQoRXh0LmRkLkREUHJveHkse2ZseTpFeHQuRWxl bWVudC5mbHksY29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjLGIpe3RoaXMuZ3JpZD1h O3RoaXMudmlldz1hLmdldFZpZXcoKTt0aGlzLnByb3h5PXRoaXMudmlldy5yZXNp emVQcm94eTtFeHQuZ3JpZC5TcGxpdERyYWdab25lLnN1cGVyY2xhc3MuY29uc3Ry dWN0b3IuY2FsbCh0aGlzLGMsImdyaWRTcGxpdHRlcnMiK3RoaXMuZ3JpZC5nZXRH cmlkRWwoKS5pZCx7ZHJhZ0VsSWQ6RXh0LmlkKHRoaXMucHJveHkuZG9tKSxyZXNp emVGcmFtZTpmYWxzZX0pO3RoaXMuc2V0SGFuZGxlRWxJZChFeHQuaWQoYykpO3Ro aXMuc2V0T3V0ZXJIYW5kbGVFbElkKEV4dC5pZChiKSk7dGhpcy5zY3JvbGw9ZmFs c2V9LGI0U3RhcnREcmFnOmZ1bmN0aW9uKGEsZCl7dGhpcy52aWV3LmhlYWRlcnNE aXNhYmxlZD10cnVlO3RoaXMucHJveHkuc2V0SGVpZ2h0KHRoaXMudmlldy5tYWlu V3JhcC5nZXRIZWlnaHQoKSk7dmFyIGI9dGhpcy5jbS5nZXRDb2x1bW5XaWR0aCh0 aGlzLmNlbGxJbmRleCk7dmFyIGM9TWF0aC5tYXgoYi10aGlzLmdyaWQubWluQ29s dW1uV2lkdGgsMCk7dGhpcy5yZXNldENvbnN0cmFpbnRzKCk7dGhpcy5zZXRYQ29u c3RyYWludChjLDEwMDApO3RoaXMuc2V0WUNvbnN0cmFpbnQoMCwwKTt0aGlzLm1p blg9YS1jO3RoaXMubWF4WD1hKzEwMDA7dGhpcy5zdGFydFBvcz1hO0V4dC5kZC5E RFByb3h5LnByb3RvdHlwZS5iNFN0YXJ0RHJhZy5jYWxsKHRoaXMsYSxkKX0saGFu ZGxlTW91c2VEb3duOmZ1bmN0aW9uKGMpe3ZhciBiPUV4dC5FdmVudE9iamVjdC5z ZXRFdmVudChjKTt2YXIgYT10aGlzLmZseShiLmdldFRhcmdldCgpKTtpZihhLmhh c0NsYXNzKCJ4LWdyaWQtc3BsaXQiKSl7dGhpcy5jZWxsSW5kZXg9dGhpcy52aWV3 LmdldENlbGxJbmRleChhLmRvbSk7dGhpcy5zcGxpdD1hLmRvbTt0aGlzLmNtPXRo aXMuZ3JpZC5jb2xNb2RlbDtpZih0aGlzLmNtLmlzUmVzaXphYmxlKHRoaXMuY2Vs bEluZGV4KSYmIXRoaXMuY20uaXNGaXhlZCh0aGlzLmNlbGxJbmRleCkpe0V4dC5n cmlkLlNwbGl0RHJhZ1pvbmUuc3VwZXJjbGFzcy5oYW5kbGVNb3VzZURvd24uYXBw bHkodGhpcyxhcmd1bWVudHMpfX19LGVuZERyYWc6ZnVuY3Rpb24oYyl7dGhpcy52 aWV3LmhlYWRlcnNEaXNhYmxlZD1mYWxzZTt2YXIgYT1NYXRoLm1heCh0aGlzLm1p blgsRXh0LmxpYi5FdmVudC5nZXRQYWdlWChjKSk7dmFyIGI9YS10aGlzLnN0YXJ0 UG9zO3RoaXMudmlldy5vbkNvbHVtblNwbGl0dGVyTW92ZWQodGhpcy5jZWxsSW5k ZXgsdGhpcy5jbS5nZXRDb2x1bW5XaWR0aCh0aGlzLmNlbGxJbmRleCkrYil9LGF1 dG9PZmZzZXQ6ZnVuY3Rpb24oKXt0aGlzLnNldERlbHRhKDAsMCl9fSk7RXh0Lmdy aWQuR3JpZERyYWdab25lPWZ1bmN0aW9uKGIsYSl7dGhpcy52aWV3PWIuZ2V0Vmll dygpO0V4dC5ncmlkLkdyaWREcmFnWm9uZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9y LmNhbGwodGhpcyx0aGlzLnZpZXcubWFpbkJvZHkuZG9tLGEpO3RoaXMuc2Nyb2xs PWZhbHNlO3RoaXMuZ3JpZD1iO3RoaXMuZGRlbD1kb2N1bWVudC5jcmVhdGVFbGVt ZW50KCJkaXYiKTt0aGlzLmRkZWwuY2xhc3NOYW1lPSJ4LWdyaWQtZGQtd3JhcCJ9 O0V4dC5leHRlbmQoRXh0LmdyaWQuR3JpZERyYWdab25lLEV4dC5kZC5EcmFnWm9u ZSx7ZGRHcm91cDoiR3JpZEREIixnZXREcmFnRGF0YTpmdW5jdGlvbihiKXt2YXIg YT1FeHQubGliLkV2ZW50LmdldFRhcmdldChiKTt2YXIgZD10aGlzLnZpZXcuZmlu ZFJvd0luZGV4KGEpO2lmKGQhPT1mYWxzZSl7dmFyIGM9dGhpcy5ncmlkLnNlbE1v ZGVsO2lmKCFjLmlzU2VsZWN0ZWQoZCl8fGIuaGFzTW9kaWZpZXIoKSl7Yy5oYW5k bGVNb3VzZURvd24odGhpcy5ncmlkLGQsYil9cmV0dXJue2dyaWQ6dGhpcy5ncmlk LGRkZWw6dGhpcy5kZGVsLHJvd0luZGV4OmQsc2VsZWN0aW9uczpjLmdldFNlbGVj dGlvbnMoKX19cmV0dXJuIGZhbHNlfSxvbkluaXREcmFnOmZ1bmN0aW9uKGIpe3Zh ciBhPXRoaXMuZHJhZ0RhdGE7dGhpcy5kZGVsLmlubmVySFRNTD10aGlzLmdyaWQu Z2V0RHJhZ0Ryb3BUZXh0KCk7dGhpcy5wcm94eS51cGRhdGUodGhpcy5kZGVsKX0s YWZ0ZXJSZXBhaXI6ZnVuY3Rpb24oKXt0aGlzLmRyYWdnaW5nPWZhbHNlfSxnZXRS ZXBhaXJYWTpmdW5jdGlvbihiLGEpe3JldHVybiBmYWxzZX0sb25FbmREcmFnOmZ1 bmN0aW9uKGEsYil7fSxvblZhbGlkRHJvcDpmdW5jdGlvbihhLGIsYyl7dGhpcy5o aWRlUHJveHkoKX0sYmVmb3JlSW52YWxpZERyb3A6ZnVuY3Rpb24oYSxiKXt9fSk7 RXh0LmdyaWQuQ29sdW1uTW9kZWw9RXh0LmV4dGVuZChFeHQudXRpbC5PYnNlcnZh YmxlLHtkZWZhdWx0V2lkdGg6MTAwLGRlZmF1bHRTb3J0YWJsZTpmYWxzZSxjb25z dHJ1Y3RvcjpmdW5jdGlvbihhKXtpZihhLmNvbHVtbnMpe0V4dC5hcHBseSh0aGlz LGEpO3RoaXMuc2V0Q29uZmlnKGEuY29sdW1ucyx0cnVlKX1lbHNle3RoaXMuc2V0 Q29uZmlnKGEsdHJ1ZSl9dGhpcy5hZGRFdmVudHMoIndpZHRoY2hhbmdlIiwiaGVh ZGVyY2hhbmdlIiwiaGlkZGVuY2hhbmdlIiwiY29sdW1ubW92ZWQiLCJjb25maWdj aGFuZ2UiKTtFeHQuZ3JpZC5Db2x1bW5Nb2RlbC5zdXBlcmNsYXNzLmNvbnN0cnVj dG9yLmNhbGwodGhpcyl9LGdldENvbHVtbklkOmZ1bmN0aW9uKGEpe3JldHVybiB0 aGlzLmNvbmZpZ1thXS5pZH0sZ2V0Q29sdW1uQXQ6ZnVuY3Rpb24oYSl7cmV0dXJu IHRoaXMuY29uZmlnW2FdfSxzZXRDb25maWc6ZnVuY3Rpb24oZCxiKXt2YXIgZSxo LGE7aWYoIWIpe2RlbGV0ZSB0aGlzLnRvdGFsV2lkdGg7Zm9yKGU9MCxhPXRoaXMu Y29uZmlnLmxlbmd0aDtlPGE7ZSsrKXtoPXRoaXMuY29uZmlnW2VdO2lmKGguc2V0 RWRpdG9yKXtoLnNldEVkaXRvcihudWxsKX19fXRoaXMuZGVmYXVsdHM9RXh0LmFw cGx5KHt3aWR0aDp0aGlzLmRlZmF1bHRXaWR0aCxzb3J0YWJsZTp0aGlzLmRlZmF1 bHRTb3J0YWJsZX0sdGhpcy5kZWZhdWx0cyk7dGhpcy5jb25maWc9ZDt0aGlzLmxv b2t1cD17fTtmb3IoZT0wLGE9ZC5sZW5ndGg7ZTxhO2UrKyl7aD1FeHQuYXBwbHlJ ZihkW2VdLHRoaXMuZGVmYXVsdHMpO2lmKEV4dC5pc0VtcHR5KGguaWQpKXtoLmlk PWV9aWYoIWguaXNDb2x1bW4pe3ZhciBnPUV4dC5ncmlkLkNvbHVtbi50eXBlc1to Lnh0eXBlfHwiZ3JpZGNvbHVtbiJdO2g9bmV3IGcoaCk7ZFtlXT1ofXRoaXMubG9v a3VwW2guaWRdPWh9aWYoIWIpe3RoaXMuZmlyZUV2ZW50KCJjb25maWdjaGFuZ2Ui LHRoaXMpfX0sZ2V0Q29sdW1uQnlJZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5s b29rdXBbYV19LGdldEluZGV4QnlJZDpmdW5jdGlvbihjKXtmb3IodmFyIGI9MCxh PXRoaXMuY29uZmlnLmxlbmd0aDtiPGE7YisrKXtpZih0aGlzLmNvbmZpZ1tiXS5p ZD09Yyl7cmV0dXJuIGJ9fXJldHVybiAtMX0sbW92ZUNvbHVtbjpmdW5jdGlvbihl LGIpe3ZhciBhPXRoaXMuY29uZmlnLGQ9YVtlXTthLnNwbGljZShlLDEpO2Euc3Bs aWNlKGIsMCxkKTt0aGlzLmRhdGFNYXA9bnVsbDt0aGlzLmZpcmVFdmVudCgiY29s dW1ubW92ZWQiLHRoaXMsZSxiKX0sZ2V0Q29sdW1uQ291bnQ6ZnVuY3Rpb24oYil7 dmFyIGQ9dGhpcy5jb25maWcubGVuZ3RoLGU9MCxhO2lmKGI9PT10cnVlKXtmb3Io YT0wO2E8ZDthKyspe2lmKCF0aGlzLmlzSGlkZGVuKGEpKXtlKyt9fXJldHVybiBl fXJldHVybiBkfSxnZXRDb2x1bW5zQnk6ZnVuY3Rpb24oZyxlKXt2YXIgYj10aGlz LmNvbmZpZyxoPWIubGVuZ3RoLGE9W10sZCxqO2ZvcihkPTA7ZDxoO2QrKyl7aj1i W2RdO2lmKGcuY2FsbChlfHx0aGlzLGosZCk9PT10cnVlKXthW2EubGVuZ3RoXT1q fX1yZXR1cm4gYX0saXNTb3J0YWJsZTpmdW5jdGlvbihhKXtyZXR1cm4gISF0aGlz LmNvbmZpZ1thXS5zb3J0YWJsZX0saXNNZW51RGlzYWJsZWQ6ZnVuY3Rpb24oYSl7 cmV0dXJuICEhdGhpcy5jb25maWdbYV0ubWVudURpc2FibGVkfSxnZXRSZW5kZXJl cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb25maWdbYV0ucmVuZGVyZXJ8fEV4 dC5ncmlkLkNvbHVtbk1vZGVsLmRlZmF1bHRSZW5kZXJlcn0sZ2V0UmVuZGVyZXJT Y29wZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb25maWdbYV0uc2NvcGV9LHNl dFJlbmRlcmVyOmZ1bmN0aW9uKGEsYil7dGhpcy5jb25maWdbYV0ucmVuZGVyZXI9 Yn0sZ2V0Q29sdW1uV2lkdGg6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25maWdb YV0ud2lkdGg7aWYodHlwZW9mIGIhPSJudW1iZXIiKXtiPXRoaXMuZGVmYXVsdFdp ZHRofXJldHVybiBifSxzZXRDb2x1bW5XaWR0aDpmdW5jdGlvbihiLGMsYSl7dGhp cy5jb25maWdbYl0ud2lkdGg9Yzt0aGlzLnRvdGFsV2lkdGg9bnVsbDtpZighYSl7 dGhpcy5maXJlRXZlbnQoIndpZHRoY2hhbmdlIix0aGlzLGIsYyl9fSxnZXRUb3Rh bFdpZHRoOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLnRvdGFsV2lkdGgpe3RoaXMudG90 YWxXaWR0aD0wO2Zvcih2YXIgYz0wLGE9dGhpcy5jb25maWcubGVuZ3RoO2M8YTtj Kyspe2lmKGJ8fCF0aGlzLmlzSGlkZGVuKGMpKXt0aGlzLnRvdGFsV2lkdGgrPXRo aXMuZ2V0Q29sdW1uV2lkdGgoYyl9fX1yZXR1cm4gdGhpcy50b3RhbFdpZHRofSxn ZXRDb2x1bW5IZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29uZmlnW2Fd LmhlYWRlcn0sc2V0Q29sdW1uSGVhZGVyOmZ1bmN0aW9uKGEsYil7dGhpcy5jb25m aWdbYV0uaGVhZGVyPWI7dGhpcy5maXJlRXZlbnQoImhlYWRlcmNoYW5nZSIsdGhp cyxhLGIpfSxnZXRDb2x1bW5Ub29sdGlwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlz LmNvbmZpZ1thXS50b29sdGlwfSxzZXRDb2x1bW5Ub29sdGlwOmZ1bmN0aW9uKGEs Yil7dGhpcy5jb25maWdbYV0udG9vbHRpcD1ifSxnZXREYXRhSW5kZXg6ZnVuY3Rp b24oYSl7cmV0dXJuIHRoaXMuY29uZmlnW2FdLmRhdGFJbmRleH0sc2V0RGF0YUlu ZGV4OmZ1bmN0aW9uKGEsYil7dGhpcy5jb25maWdbYV0uZGF0YUluZGV4PWJ9LGZp bmRDb2x1bW5JbmRleDpmdW5jdGlvbihkKXt2YXIgZT10aGlzLmNvbmZpZztmb3Io dmFyIGI9MCxhPWUubGVuZ3RoO2I8YTtiKyspe2lmKGVbYl0uZGF0YUluZGV4PT1k KXtyZXR1cm4gYn19cmV0dXJuIC0xfSxpc0NlbGxFZGl0YWJsZTpmdW5jdGlvbihi LGUpe3ZhciBkPXRoaXMuY29uZmlnW2JdLGE9ZC5lZGl0YWJsZTtyZXR1cm4gISEo YXx8KCFFeHQuaXNEZWZpbmVkKGEpJiZkLmVkaXRvcikpfSxnZXRDZWxsRWRpdG9y OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY29uZmlnW2FdLmdldENlbGxFZGl0 b3IoYil9LHNldEVkaXRhYmxlOmZ1bmN0aW9uKGEsYil7dGhpcy5jb25maWdbYV0u ZWRpdGFibGU9Yn0saXNIaWRkZW46ZnVuY3Rpb24oYSl7cmV0dXJuICEhdGhpcy5j b25maWdbYV0uaGlkZGVufSxpc0ZpeGVkOmZ1bmN0aW9uKGEpe3JldHVybiAhIXRo aXMuY29uZmlnW2FdLmZpeGVkfSxpc1Jlc2l6YWJsZTpmdW5jdGlvbihhKXtyZXR1 cm4gYT49MCYmdGhpcy5jb25maWdbYV0ucmVzaXphYmxlIT09ZmFsc2UmJnRoaXMu Y29uZmlnW2FdLmZpeGVkIT09dHJ1ZX0sc2V0SGlkZGVuOmZ1bmN0aW9uKGEsYil7 dmFyIGQ9dGhpcy5jb25maWdbYV07aWYoZC5oaWRkZW4hPT1iKXtkLmhpZGRlbj1i O3RoaXMudG90YWxXaWR0aD1udWxsO3RoaXMuZmlyZUV2ZW50KCJoaWRkZW5jaGFu Z2UiLHRoaXMsYSxiKX19LHNldEVkaXRvcjpmdW5jdGlvbihhLGIpe3RoaXMuY29u ZmlnW2FdLnNldEVkaXRvcihiKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBiPXRo aXMuY29uZmlnLmxlbmd0aCxhPTA7Zm9yKDthPGI7YSsrKXt0aGlzLmNvbmZpZ1th XS5kZXN0cm95KCl9ZGVsZXRlIHRoaXMuY29uZmlnO2RlbGV0ZSB0aGlzLmxvb2t1 cDt0aGlzLnB1cmdlTGlzdGVuZXJzKCl9LHNldFN0YXRlOmZ1bmN0aW9uKGEsYil7 Yj1FeHQuYXBwbHlJZihiLHRoaXMuZGVmYXVsdHMpO0V4dC5hcHBseSh0aGlzLmNv bmZpZ1thXSxiKX19KTtFeHQuZ3JpZC5Db2x1bW5Nb2RlbC5kZWZhdWx0UmVuZGVy ZXI9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJzdHJpbmciJiZhLmxlbmd0aDwx KXtyZXR1cm4iJiMxNjA7In1yZXR1cm4gYX07RXh0LmdyaWQuQWJzdHJhY3RTZWxl Y3Rpb25Nb2RlbD1FeHQuZXh0ZW5kKEV4dC51dGlsLk9ic2VydmFibGUse2NvbnN0 cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5sb2NrZWQ9ZmFsc2U7RXh0LmdyaWQuQWJz dHJhY3RTZWxlY3Rpb25Nb2RlbC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwo dGhpcyl9LGluaXQ6ZnVuY3Rpb24oYSl7dGhpcy5ncmlkPWE7aWYodGhpcy5sb2Nr T25Jbml0KXtkZWxldGUgdGhpcy5sb2NrT25Jbml0O3RoaXMubG9ja2VkPWZhbHNl O3RoaXMubG9jaygpfXRoaXMuaW5pdEV2ZW50cygpfSxsb2NrOmZ1bmN0aW9uKCl7 aWYoIXRoaXMubG9ja2VkKXt0aGlzLmxvY2tlZD10cnVlO3ZhciBhPXRoaXMuZ3Jp ZDtpZihhKXthLmdldFZpZXcoKS5vbih7c2NvcGU6dGhpcyxiZWZvcmVyZWZyZXNo OnRoaXMuc29ydFVuTG9jayxyZWZyZXNoOnRoaXMuc29ydExvY2t9KX1lbHNle3Ro aXMubG9ja09uSW5pdD10cnVlfX19LHNvcnRMb2NrOmZ1bmN0aW9uKCl7dGhpcy5s b2NrZWQ9dHJ1ZX0sc29ydFVuTG9jazpmdW5jdGlvbigpe3RoaXMubG9ja2VkPWZh bHNlfSx1bmxvY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmxvY2tlZCl7dGhpcy5sb2Nr ZWQ9ZmFsc2U7dmFyIGE9dGhpcy5ncmlkLGI7aWYoYSl7Yj1hLmdldFZpZXcoKTti LnVuKCJiZWZvcmVyZWZyZXNoIix0aGlzLnNvcnRVbkxvY2ssdGhpcyk7Yi51bigi cmVmcmVzaCIsdGhpcy5zb3J0TG9jayx0aGlzKX1lbHNle2RlbGV0ZSB0aGlzLmxv Y2tPbkluaXR9fX0saXNMb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2Nr ZWR9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnVubG9jaygpO3RoaXMucHVyZ2VM aXN0ZW5lcnMoKX19KTtFeHQuZ3JpZC5Sb3dTZWxlY3Rpb25Nb2RlbD1FeHQuZXh0 ZW5kKEV4dC5ncmlkLkFic3RyYWN0U2VsZWN0aW9uTW9kZWwse3NpbmdsZVNlbGVj dDpmYWxzZSxjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtFeHQuYXBwbHkodGhpcyxh KTt0aGlzLnNlbGVjdGlvbnM9bmV3IEV4dC51dGlsLk1peGVkQ29sbGVjdGlvbihm YWxzZSxmdW5jdGlvbihiKXtyZXR1cm4gYi5pZH0pO3RoaXMubGFzdD1mYWxzZTt0 aGlzLmxhc3RBY3RpdmU9ZmFsc2U7dGhpcy5hZGRFdmVudHMoInNlbGVjdGlvbmNo YW5nZSIsImJlZm9yZXJvd3NlbGVjdCIsInJvd3NlbGVjdCIsInJvd2Rlc2VsZWN0 Iik7RXh0LmdyaWQuUm93U2VsZWN0aW9uTW9kZWwuc3VwZXJjbGFzcy5jb25zdHJ1 Y3Rvci5jYWxsKHRoaXMpfSxpbml0RXZlbnRzOmZ1bmN0aW9uKCl7aWYoIXRoaXMu Z3JpZC5lbmFibGVEcmFnRHJvcCYmIXRoaXMuZ3JpZC5lbmFibGVEcmFnKXt0aGlz LmdyaWQub24oInJvd21vdXNlZG93biIsdGhpcy5oYW5kbGVNb3VzZURvd24sdGhp cyl9dGhpcy5yb3dOYXY9bmV3IEV4dC5LZXlOYXYodGhpcy5ncmlkLmdldEdyaWRF bCgpLHt1cDp0aGlzLm9uS2V5UHJlc3MsZG93bjp0aGlzLm9uS2V5UHJlc3Msc2Nv cGU6dGhpc30pO3RoaXMuZ3JpZC5nZXRWaWV3KCkub24oe3Njb3BlOnRoaXMscmVm cmVzaDp0aGlzLm9uUmVmcmVzaCxyb3d1cGRhdGVkOnRoaXMub25Sb3dVcGRhdGVk LHJvd3JlbW92ZWQ6dGhpcy5vblJlbW92ZX0pfSxvbktleVByZXNzOmZ1bmN0aW9u KGcsYil7dmFyIGE9Yj09InVwIixoPWE/InNlbGVjdFByZXZpb3VzIjoic2VsZWN0 TmV4dCIsZD1hPy0xOjEsYztpZighZy5zaGlmdEtleXx8dGhpcy5zaW5nbGVTZWxl Y3Qpe3RoaXNbaF0oZmFsc2UpfWVsc2V7aWYodGhpcy5sYXN0IT09ZmFsc2UmJnRo aXMubGFzdEFjdGl2ZSE9PWZhbHNlKXtjPXRoaXMubGFzdDt0aGlzLnNlbGVjdFJh bmdlKHRoaXMubGFzdCx0aGlzLmxhc3RBY3RpdmUrZCk7dGhpcy5ncmlkLmdldFZp ZXcoKS5mb2N1c1Jvdyh0aGlzLmxhc3RBY3RpdmUpO2lmKGMhPT1mYWxzZSl7dGhp cy5sYXN0PWN9fWVsc2V7dGhpcy5zZWxlY3RGaXJzdFJvdygpfX19LG9uUmVmcmVz aDpmdW5jdGlvbigpe3ZhciBnPXRoaXMuZ3JpZC5zdG9yZSxkPXRoaXMuZ2V0U2Vs ZWN0aW9ucygpLGM9MCxhPWQubGVuZ3RoLGIsZTt0aGlzLnNpbGVudD10cnVlO3Ro aXMuY2xlYXJTZWxlY3Rpb25zKHRydWUpO2Zvcig7YzxhO2MrKyl7ZT1kW2NdO2lm KChiPWcuaW5kZXhPZklkKGUuaWQpKSE9LTEpe3RoaXMuc2VsZWN0Um93KGIsdHJ1 ZSl9fWlmKGQubGVuZ3RoIT10aGlzLnNlbGVjdGlvbnMuZ2V0Q291bnQoKSl7dGhp cy5maXJlRXZlbnQoInNlbGVjdGlvbmNoYW5nZSIsdGhpcyl9dGhpcy5zaWxlbnQ9 ZmFsc2V9LG9uUmVtb3ZlOmZ1bmN0aW9uKGEsYixjKXtpZih0aGlzLnNlbGVjdGlv bnMucmVtb3ZlKGMpIT09ZmFsc2Upe3RoaXMuZmlyZUV2ZW50KCJzZWxlY3Rpb25j aGFuZ2UiLHRoaXMpfX0sb25Sb3dVcGRhdGVkOmZ1bmN0aW9uKGEsYixjKXtpZih0 aGlzLmlzU2VsZWN0ZWQoYykpe2Eub25Sb3dTZWxlY3QoYil9fSxzZWxlY3RSZWNv cmRzOmZ1bmN0aW9uKGIsZSl7aWYoIWUpe3RoaXMuY2xlYXJTZWxlY3Rpb25zKCl9 dmFyIGQ9dGhpcy5ncmlkLnN0b3JlLGM9MCxhPWIubGVuZ3RoO2Zvcig7YzxhO2Mr Kyl7dGhpcy5zZWxlY3RSb3coZC5pbmRleE9mKGJbY10pLHRydWUpfX0sZ2V0Q291 bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25zLmxlbmd0aH0sc2Vs ZWN0Rmlyc3RSb3c6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdFJvdygwKX0sc2VsZWN0 TGFzdFJvdzpmdW5jdGlvbihhKXt0aGlzLnNlbGVjdFJvdyh0aGlzLmdyaWQuc3Rv cmUuZ2V0Q291bnQoKS0xLGEpfSxzZWxlY3ROZXh0OmZ1bmN0aW9uKGEpe2lmKHRo aXMuaGFzTmV4dCgpKXt0aGlzLnNlbGVjdFJvdyh0aGlzLmxhc3QrMSxhKTt0aGlz LmdyaWQuZ2V0VmlldygpLmZvY3VzUm93KHRoaXMubGFzdCk7cmV0dXJuIHRydWV9 cmV0dXJuIGZhbHNlfSxzZWxlY3RQcmV2aW91czpmdW5jdGlvbihhKXtpZih0aGlz Lmhhc1ByZXZpb3VzKCkpe3RoaXMuc2VsZWN0Um93KHRoaXMubGFzdC0xLGEpO3Ro aXMuZ3JpZC5nZXRWaWV3KCkuZm9jdXNSb3codGhpcy5sYXN0KTtyZXR1cm4gdHJ1 ZX1yZXR1cm4gZmFsc2V9LGhhc05leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5s YXN0IT09ZmFsc2UmJih0aGlzLmxhc3QrMSk8dGhpcy5ncmlkLnN0b3JlLmdldENv dW50KCl9LGhhc1ByZXZpb3VzOmZ1bmN0aW9uKCl7cmV0dXJuICEhdGhpcy5sYXN0 fSxnZXRTZWxlY3Rpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW10uY29uY2F0KHRoaXMu c2VsZWN0aW9ucy5pdGVtcyl9LGdldFNlbGVjdGVkOmZ1bmN0aW9uKCl7cmV0dXJu IHRoaXMuc2VsZWN0aW9ucy5pdGVtQXQoMCl9LGVhY2g6ZnVuY3Rpb24oZSxkKXt2 YXIgYz10aGlzLmdldFNlbGVjdGlvbnMoKSxiPTAsYT1jLmxlbmd0aDtmb3IoO2I8 YTtiKyspe2lmKGUuY2FsbChkfHx0aGlzLGNbYl0sYik9PT1mYWxzZSl7cmV0dXJu IGZhbHNlfX1yZXR1cm4gdHJ1ZX0sY2xlYXJTZWxlY3Rpb25zOmZ1bmN0aW9uKGEp e2lmKHRoaXMuaXNMb2NrZWQoKSl7cmV0dXJufWlmKGEhPT10cnVlKXt2YXIgYz10 aGlzLmdyaWQuc3RvcmUsYj10aGlzLnNlbGVjdGlvbnM7Yi5lYWNoKGZ1bmN0aW9u KGQpe3RoaXMuZGVzZWxlY3RSb3coYy5pbmRleE9mSWQoZC5pZCkpfSx0aGlzKTti LmNsZWFyKCl9ZWxzZXt0aGlzLnNlbGVjdGlvbnMuY2xlYXIoKX10aGlzLmxhc3Q9 ZmFsc2V9LHNlbGVjdEFsbDpmdW5jdGlvbigpe2lmKHRoaXMuaXNMb2NrZWQoKSl7 cmV0dXJufXRoaXMuc2VsZWN0aW9ucy5jbGVhcigpO2Zvcih2YXIgYj0wLGE9dGhp cy5ncmlkLnN0b3JlLmdldENvdW50KCk7YjxhO2IrKyl7dGhpcy5zZWxlY3RSb3co Yix0cnVlKX19LGhhc1NlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNl bGVjdGlvbnMubGVuZ3RoPjB9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9 RXh0LmlzTnVtYmVyKGEpP3RoaXMuZ3JpZC5zdG9yZS5nZXRBdChhKTphO3JldHVy bihiJiZ0aGlzLnNlbGVjdGlvbnMua2V5KGIuaWQpP3RydWU6ZmFsc2UpfSxpc0lk U2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuKHRoaXMuc2VsZWN0aW9ucy5rZXko YSk/dHJ1ZTpmYWxzZSl9LGhhbmRsZU1vdXNlRG93bjpmdW5jdGlvbihkLGksaCl7 aWYoaC5idXR0b24hPT0wfHx0aGlzLmlzTG9ja2VkKCkpe3JldHVybn12YXIgYT10 aGlzLmdyaWQuZ2V0VmlldygpO2lmKGguc2hpZnRLZXkmJiF0aGlzLnNpbmdsZVNl bGVjdCYmdGhpcy5sYXN0IT09ZmFsc2Upe3ZhciBjPXRoaXMubGFzdDt0aGlzLnNl bGVjdFJhbmdlKGMsaSxoLmN0cmxLZXkpO3RoaXMubGFzdD1jO2EuZm9jdXNSb3co aSl9ZWxzZXt2YXIgYj10aGlzLmlzU2VsZWN0ZWQoaSk7aWYoaC5jdHJsS2V5JiZi KXt0aGlzLmRlc2VsZWN0Um93KGkpfWVsc2V7aWYoIWJ8fHRoaXMuZ2V0Q291bnQo KT4xKXt0aGlzLnNlbGVjdFJvdyhpLGguY3RybEtleXx8aC5zaGlmdEtleSk7YS5m b2N1c1JvdyhpKX19fX0sc2VsZWN0Um93czpmdW5jdGlvbihjLGQpe2lmKCFkKXt0 aGlzLmNsZWFyU2VsZWN0aW9ucygpfWZvcih2YXIgYj0wLGE9Yy5sZW5ndGg7Yjxh O2IrKyl7dGhpcy5zZWxlY3RSb3coY1tiXSx0cnVlKX19LHNlbGVjdFJhbmdlOmZ1 bmN0aW9uKGIsYSxkKXt2YXIgYztpZih0aGlzLmlzTG9ja2VkKCkpe3JldHVybn1p ZighZCl7dGhpcy5jbGVhclNlbGVjdGlvbnMoKX1pZihiPD1hKXtmb3IoYz1iO2M8 PWE7YysrKXt0aGlzLnNlbGVjdFJvdyhjLHRydWUpfX1lbHNle2ZvcihjPWI7Yz49 YTtjLS0pe3RoaXMuc2VsZWN0Um93KGMsdHJ1ZSl9fX0sZGVzZWxlY3RSYW5nZTpm dW5jdGlvbihjLGIsYSl7aWYodGhpcy5pc0xvY2tlZCgpKXtyZXR1cm59Zm9yKHZh ciBkPWM7ZDw9YjtkKyspe3RoaXMuZGVzZWxlY3RSb3coZCxhKX19LHNlbGVjdFJv dzpmdW5jdGlvbihiLGQsYSl7aWYodGhpcy5pc0xvY2tlZCgpfHwoYjwwfHxiPj10 aGlzLmdyaWQuc3RvcmUuZ2V0Q291bnQoKSl8fChkJiZ0aGlzLmlzU2VsZWN0ZWQo YikpKXtyZXR1cm59dmFyIGM9dGhpcy5ncmlkLnN0b3JlLmdldEF0KGIpO2lmKGMm JnRoaXMuZmlyZUV2ZW50KCJiZWZvcmVyb3dzZWxlY3QiLHRoaXMsYixkLGMpIT09 ZmFsc2Upe2lmKCFkfHx0aGlzLnNpbmdsZVNlbGVjdCl7dGhpcy5jbGVhclNlbGVj dGlvbnMoKX10aGlzLnNlbGVjdGlvbnMuYWRkKGMpO3RoaXMubGFzdD10aGlzLmxh c3RBY3RpdmU9YjtpZighYSl7dGhpcy5ncmlkLmdldFZpZXcoKS5vblJvd1NlbGVj dChiKX1pZighdGhpcy5zaWxlbnQpe3RoaXMuZmlyZUV2ZW50KCJyb3dzZWxlY3Qi LHRoaXMsYixjKTt0aGlzLmZpcmVFdmVudCgic2VsZWN0aW9uY2hhbmdlIix0aGlz KX19fSxkZXNlbGVjdFJvdzpmdW5jdGlvbihiLGEpe2lmKHRoaXMuaXNMb2NrZWQo KSl7cmV0dXJufWlmKHRoaXMubGFzdD09Yil7dGhpcy5sYXN0PWZhbHNlfWlmKHRo aXMubGFzdEFjdGl2ZT09Yil7dGhpcy5sYXN0QWN0aXZlPWZhbHNlfXZhciBjPXRo aXMuZ3JpZC5zdG9yZS5nZXRBdChiKTtpZihjKXt0aGlzLnNlbGVjdGlvbnMucmVt b3ZlKGMpO2lmKCFhKXt0aGlzLmdyaWQuZ2V0VmlldygpLm9uUm93RGVzZWxlY3Qo Yil9dGhpcy5maXJlRXZlbnQoInJvd2Rlc2VsZWN0Iix0aGlzLGIsYyk7dGhpcy5m aXJlRXZlbnQoInNlbGVjdGlvbmNoYW5nZSIsdGhpcyl9fSxhY2NlcHRzTmF2OmZ1 bmN0aW9uKGMsYixhKXtyZXR1cm4gIWEuaXNIaWRkZW4oYikmJmEuaXNDZWxsRWRp dGFibGUoYixjKX0sb25FZGl0b3JLZXk6ZnVuY3Rpb24obixsKXt2YXIgZD1sLmdl dEtleSgpLGgsaT10aGlzLmdyaWQscD1pLmxhc3RFZGl0LGo9aS5hY3RpdmVFZGl0 b3IsYj1sLnNoaWZ0S2V5LG8scCxhLG07aWYoZD09bC5UQUIpe2wuc3RvcEV2ZW50 KCk7ai5jb21wbGV0ZUVkaXQoKTtpZihiKXtoPWkud2Fsa0NlbGxzKGoucm93LGou Y29sLTEsLTEsdGhpcy5hY2NlcHRzTmF2LHRoaXMpfWVsc2V7aD1pLndhbGtDZWxs cyhqLnJvdyxqLmNvbCsxLDEsdGhpcy5hY2NlcHRzTmF2LHRoaXMpfX1lbHNle2lm KGQ9PWwuRU5URVIpe2lmKHRoaXMubW92ZUVkaXRvck9uRW50ZXIhPT1mYWxzZSl7 aWYoYil7aD1pLndhbGtDZWxscyhwLnJvdy0xLHAuY29sLC0xLHRoaXMuYWNjZXB0 c05hdix0aGlzKX1lbHNle2g9aS53YWxrQ2VsbHMocC5yb3crMSxwLmNvbCwxLHRo aXMuYWNjZXB0c05hdix0aGlzKX19fX1pZihoKXthPWhbMF07bT1oWzFdO3RoaXMu b25FZGl0b3JTZWxlY3QoYSxwLnJvdyk7aWYoaS5pc0VkaXRvciYmaS5lZGl0aW5n KXtvPWkuYWN0aXZlRWRpdG9yO2lmKG8mJm8uZmllbGQudHJpZ2dlckJsdXIpe28u ZmllbGQudHJpZ2dlckJsdXIoKX19aS5zdGFydEVkaXRpbmcoYSxtKX19LG9uRWRp dG9yU2VsZWN0OmZ1bmN0aW9uKGIsYSl7aWYoYSE9Yil7dGhpcy5zZWxlY3RSb3co Yil9fSxkZXN0cm95OmZ1bmN0aW9uKCl7RXh0LmRlc3Ryb3kodGhpcy5yb3dOYXYp O3RoaXMucm93TmF2PW51bGw7RXh0LmdyaWQuUm93U2VsZWN0aW9uTW9kZWwuc3Vw ZXJjbGFzcy5kZXN0cm95LmNhbGwodGhpcyl9fSk7RXh0LmdyaWQuQ29sdW1uPUV4 dC5leHRlbmQoRXh0LnV0aWwuT2JzZXJ2YWJsZSx7aXNDb2x1bW46dHJ1ZSxjb25z dHJ1Y3RvcjpmdW5jdGlvbihiKXtFeHQuYXBwbHkodGhpcyxiKTtpZihFeHQuaXNT dHJpbmcodGhpcy5yZW5kZXJlcikpe3RoaXMucmVuZGVyZXI9RXh0LnV0aWwuRm9y bWF0W3RoaXMucmVuZGVyZXJdfWVsc2V7aWYoRXh0LmlzT2JqZWN0KHRoaXMucmVu ZGVyZXIpKXt0aGlzLnNjb3BlPXRoaXMucmVuZGVyZXIuc2NvcGU7dGhpcy5yZW5k ZXJlcj10aGlzLnJlbmRlcmVyLmZufX1pZighdGhpcy5zY29wZSl7dGhpcy5zY29w ZT10aGlzfXZhciBhPXRoaXMuZWRpdG9yO2RlbGV0ZSB0aGlzLmVkaXRvcjt0aGlz LnNldEVkaXRvcihhKTt0aGlzLmFkZEV2ZW50cygiY2xpY2siLCJjb250ZXh0bWVu dSIsImRibGNsaWNrIiwibW91c2Vkb3duIik7RXh0LmdyaWQuQ29sdW1uLnN1cGVy Y2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKX0scHJvY2Vzc0V2ZW50OmZ1bmN0 aW9uKGIsZCxjLGcsYSl7cmV0dXJuIHRoaXMuZmlyZUV2ZW50KGIsdGhpcyxjLGcs ZCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtpZih0aGlzLnNldEVkaXRvcil7dGhpcy5z ZXRFZGl0b3IobnVsbCl9dGhpcy5wdXJnZUxpc3RlbmVycygpfSxyZW5kZXJlcjpm dW5jdGlvbihhKXtyZXR1cm4gYX0sZ2V0RWRpdG9yOmZ1bmN0aW9uKGEpe3JldHVy biB0aGlzLmVkaXRhYmxlIT09ZmFsc2U/dGhpcy5lZGl0b3I6bnVsbH0sc2V0RWRp dG9yOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZWRpdG9yO2lmKGEpe2lmKGEuZ3Jp ZEVkaXRvcil7YS5ncmlkRWRpdG9yLmRlc3Ryb3koKTtkZWxldGUgYS5ncmlkRWRp dG9yfWVsc2V7YS5kZXN0cm95KCl9fXRoaXMuZWRpdG9yPW51bGw7aWYoYil7aWYo IWIuaXNYVHlwZSl7Yj1FeHQuY3JlYXRlKGIsInRleHRmaWVsZCIpfXRoaXMuZWRp dG9yPWJ9fSxnZXRDZWxsRWRpdG9yOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0 RWRpdG9yKGIpO2lmKGEpe2lmKCFhLnN0YXJ0RWRpdCl7aWYoIWEuZ3JpZEVkaXRv cil7YS5ncmlkRWRpdG9yPW5ldyBFeHQuZ3JpZC5HcmlkRWRpdG9yKGEpfWE9YS5n cmlkRWRpdG9yfX1yZXR1cm4gYX19KTtFeHQuZ3JpZC5Cb29sZWFuQ29sdW1uPUV4 dC5leHRlbmQoRXh0LmdyaWQuQ29sdW1uLHt0cnVlVGV4dDoidHJ1ZSIsZmFsc2VU ZXh0OiJmYWxzZSIsdW5kZWZpbmVkVGV4dDoiJiMxNjA7Iixjb25zdHJ1Y3Rvcjpm dW5jdGlvbihhKXtFeHQuZ3JpZC5Cb29sZWFuQ29sdW1uLnN1cGVyY2xhc3MuY29u c3RydWN0b3IuY2FsbCh0aGlzLGEpO3ZhciBjPXRoaXMudHJ1ZVRleHQsZD10aGlz LmZhbHNlVGV4dCxiPXRoaXMudW5kZWZpbmVkVGV4dDt0aGlzLnJlbmRlcmVyPWZ1 bmN0aW9uKGUpe2lmKGU9PT11bmRlZmluZWQpe3JldHVybiBifWlmKCFlfHxlPT09 ImZhbHNlIil7cmV0dXJuIGR9cmV0dXJuIGN9fX0pO0V4dC5ncmlkLk51bWJlckNv bHVtbj1FeHQuZXh0ZW5kKEV4dC5ncmlkLkNvbHVtbix7Zm9ybWF0OiIwLDAwMC4w MCIsY29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7RXh0LmdyaWQuTnVtYmVyQ29sdW1u LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMucmVuZGVy ZXI9RXh0LnV0aWwuRm9ybWF0Lm51bWJlclJlbmRlcmVyKHRoaXMuZm9ybWF0KX19 KTtFeHQuZ3JpZC5EYXRlQ29sdW1uPUV4dC5leHRlbmQoRXh0LmdyaWQuQ29sdW1u LHtmb3JtYXQ6Im0vZC9ZIixjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtFeHQuZ3Jp ZC5EYXRlQ29sdW1uLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEp O3RoaXMucmVuZGVyZXI9RXh0LnV0aWwuRm9ybWF0LmRhdGVSZW5kZXJlcih0aGlz LmZvcm1hdCl9fSk7RXh0LmdyaWQuVGVtcGxhdGVDb2x1bW49RXh0LmV4dGVuZChF eHQuZ3JpZC5Db2x1bW4se2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe0V4dC5ncmlk LlRlbXBsYXRlQ29sdW1uLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlz LGEpO3ZhciBiPSghRXh0LmlzUHJpbWl0aXZlKHRoaXMudHBsKSYmdGhpcy50cGwu Y29tcGlsZSk/dGhpcy50cGw6bmV3IEV4dC5YVGVtcGxhdGUodGhpcy50cGwpO3Ro aXMucmVuZGVyZXI9ZnVuY3Rpb24oZCxlLGMpe3JldHVybiBiLmFwcGx5KGMuZGF0 YSl9O3RoaXMudHBsPWJ9fSk7RXh0LmdyaWQuQWN0aW9uQ29sdW1uPUV4dC5leHRl bmQoRXh0LmdyaWQuQ29sdW1uLHtoZWFkZXI6IiYjMTYwOyIsYWN0aW9uSWRSZTov eC1hY3Rpb24tY29sLShcZCspLyxhbHRUZXh0OiIiLGNvbnN0cnVjdG9yOmZ1bmN0 aW9uKGIpe3ZhciBnPXRoaXMsYz1iLml0ZW1zfHwoZy5pdGVtcz1bZ10pLGE9Yy5s ZW5ndGgsZCxlO0V4dC5ncmlkLkFjdGlvbkNvbHVtbi5zdXBlcmNsYXNzLmNvbnN0 cnVjdG9yLmNhbGwoZyxiKTtnLnJlbmRlcmVyPWZ1bmN0aW9uKGgsaSl7aD1FeHQu aXNGdW5jdGlvbihiLnJlbmRlcmVyKT9iLnJlbmRlcmVyLmFwcGx5KHRoaXMsYXJn dW1lbnRzKXx8IiI6IiI7aS5jc3MrPSIgeC1hY3Rpb24tY29sLWNlbGwiO2Zvcihk PTA7ZDxhO2QrKyl7ZT1jW2RdO2grPSc8aW1nIGFsdD0iJysoZS5hbHRUZXh0fHxn LmFsdFRleHQpKyciIHNyYz0iJysoZS5pY29ufHxFeHQuQkxBTktfSU1BR0VfVVJM KSsnIiBjbGFzcz0ieC1hY3Rpb24tY29sLWljb24geC1hY3Rpb24tY29sLScrU3Ry aW5nKGQpKyIgIisoZS5pY29uQ2xzfHwiIikrIiAiKyhFeHQuaXNGdW5jdGlvbihl LmdldENsYXNzKT9lLmdldENsYXNzLmFwcGx5KGUuc2NvcGV8fHRoaXMuc2NvcGV8 fHRoaXMsYXJndW1lbnRzKToiIikrJyInKygoZS50b29sdGlwKT8nIGV4dDpxdGlw PSInK2UudG9vbHRpcCsnIic6IiIpKyIgLz4ifXJldHVybiBofX0sZGVzdHJveTpm dW5jdGlvbigpe2RlbGV0ZSB0aGlzLml0ZW1zO2RlbGV0ZSB0aGlzLnJlbmRlcmVy O3JldHVybiBFeHQuZ3JpZC5BY3Rpb25Db2x1bW4uc3VwZXJjbGFzcy5kZXN0cm95 LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scHJvY2Vzc0V2ZW50OmZ1bmN0aW9uKGMs aSxkLGosYil7dmFyIGE9aS5nZXRUYXJnZXQoKS5jbGFzc05hbWUubWF0Y2godGhp cy5hY3Rpb25JZFJlKSxoLGc7aWYoYSYmKGg9dGhpcy5pdGVtc1twYXJzZUludChh WzFdLDEwKV0pKXtpZihjPT0iY2xpY2siKXsoZz1oLmhhbmRsZXJ8fHRoaXMuaGFu ZGxlcikmJmcuY2FsbChoLnNjb3BlfHx0aGlzLnNjb3BlfHx0aGlzLGQsaixiLGgs aSl9ZWxzZXtpZigoYz09Im1vdXNlZG93biIpJiYoaC5zdG9wU2VsZWN0aW9uIT09 ZmFsc2UpKXtyZXR1cm4gZmFsc2V9fX1yZXR1cm4gRXh0LmdyaWQuQWN0aW9uQ29s dW1uLnN1cGVyY2xhc3MucHJvY2Vzc0V2ZW50LmFwcGx5KHRoaXMsYXJndW1lbnRz KX19KTtFeHQuZ3JpZC5Db2x1bW4udHlwZXM9e2dyaWRjb2x1bW46RXh0LmdyaWQu Q29sdW1uLGJvb2xlYW5jb2x1bW46RXh0LmdyaWQuQm9vbGVhbkNvbHVtbixudW1i ZXJjb2x1bW46RXh0LmdyaWQuTnVtYmVyQ29sdW1uLGRhdGVjb2x1bW46RXh0Lmdy aWQuRGF0ZUNvbHVtbix0ZW1wbGF0ZWNvbHVtbjpFeHQuZ3JpZC5UZW1wbGF0ZUNv bHVtbixhY3Rpb25jb2x1bW46RXh0LmdyaWQuQWN0aW9uQ29sdW1ufTtFeHQuZ3Jp ZC5Sb3dOdW1iZXJlcj1FeHQuZXh0ZW5kKE9iamVjdCx7aGVhZGVyOiIiLHdpZHRo OjIzLHNvcnRhYmxlOmZhbHNlLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe0V4dC5h cHBseSh0aGlzLGEpO2lmKHRoaXMucm93c3Bhbil7dGhpcy5yZW5kZXJlcj10aGlz LnJlbmRlcmVyLmNyZWF0ZURlbGVnYXRlKHRoaXMpfX0sZml4ZWQ6dHJ1ZSxoaWRl YWJsZTpmYWxzZSxtZW51RGlzYWJsZWQ6dHJ1ZSxkYXRhSW5kZXg6IiIsaWQ6Im51 bWJlcmVyIixyb3dzcGFuOnVuZGVmaW5lZCxyZW5kZXJlcjpmdW5jdGlvbihiLGMs YSxkKXtpZih0aGlzLnJvd3NwYW4pe2MuY2VsbEF0dHI9J3Jvd3NwYW49IicrdGhp cy5yb3dzcGFuKyciJ31yZXR1cm4gZCsxfX0pO0V4dC5ncmlkLkNoZWNrYm94U2Vs ZWN0aW9uTW9kZWw9RXh0LmV4dGVuZChFeHQuZ3JpZC5Sb3dTZWxlY3Rpb25Nb2Rl bCx7aGVhZGVyOic8ZGl2IGNsYXNzPSJ4LWdyaWQzLWhkLWNoZWNrZXIiPiYjMTYw OzwvZGl2Picsd2lkdGg6MjAsc29ydGFibGU6ZmFsc2UsbWVudURpc2FibGVkOnRy dWUsZml4ZWQ6dHJ1ZSxoaWRlYWJsZTpmYWxzZSxkYXRhSW5kZXg6IiIsaWQ6ImNo ZWNrZXIiLGlzQ29sdW1uOnRydWUsY29uc3RydWN0b3I6ZnVuY3Rpb24oKXtFeHQu Z3JpZC5DaGVja2JveFNlbGVjdGlvbk1vZGVsLnN1cGVyY2xhc3MuY29uc3RydWN0 b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKHRoaXMuY2hlY2tPbmx5KXt0aGlz LmhhbmRsZU1vdXNlRG93bj1FeHQuZW1wdHlGbn19LGluaXRFdmVudHM6ZnVuY3Rp b24oKXtFeHQuZ3JpZC5DaGVja2JveFNlbGVjdGlvbk1vZGVsLnN1cGVyY2xhc3Mu aW5pdEV2ZW50cy5jYWxsKHRoaXMpO3RoaXMuZ3JpZC5vbigicmVuZGVyIixmdW5j dGlvbigpe0V4dC5mbHkodGhpcy5ncmlkLmdldFZpZXcoKS5pbm5lckhkKS5vbigi bW91c2Vkb3duIix0aGlzLm9uSGRNb3VzZURvd24sdGhpcyl9LHRoaXMpfSxwcm9j ZXNzRXZlbnQ6ZnVuY3Rpb24oYixkLGMsZyxhKXtpZihiPT0ibW91c2Vkb3duIil7 dGhpcy5vbk1vdXNlRG93bihkLGQuZ2V0VGFyZ2V0KCkpO3JldHVybiBmYWxzZX1l bHNle3JldHVybiBFeHQuZ3JpZC5Db2x1bW4ucHJvdG90eXBlLnByb2Nlc3NFdmVu dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSxvbk1vdXNlRG93bjpmdW5jdGlvbihj LGIpe2lmKGMuYnV0dG9uPT09MCYmYi5jbGFzc05hbWU9PSJ4LWdyaWQzLXJvdy1j aGVja2VyIil7Yy5zdG9wRXZlbnQoKTt2YXIgZD1jLmdldFRhcmdldCgiLngtZ3Jp ZDMtcm93Iik7aWYoZCl7dmFyIGE9ZC5yb3dJbmRleDtpZih0aGlzLmlzU2VsZWN0 ZWQoYSkpe3RoaXMuZGVzZWxlY3RSb3coYSl9ZWxzZXt0aGlzLnNlbGVjdFJvdyhh LHRydWUpO3RoaXMuZ3JpZC5nZXRWaWV3KCkuZm9jdXNSb3coYSl9fX19LG9uSGRN b3VzZURvd246ZnVuY3Rpb24oYyxhKXtpZihhLmNsYXNzTmFtZT09IngtZ3JpZDMt aGQtY2hlY2tlciIpe2Muc3RvcEV2ZW50KCk7dmFyIGI9RXh0LmZseShhLnBhcmVu dE5vZGUpO3ZhciBkPWIuaGFzQ2xhc3MoIngtZ3JpZDMtaGQtY2hlY2tlci1vbiIp O2lmKGQpe2IucmVtb3ZlQ2xhc3MoIngtZ3JpZDMtaGQtY2hlY2tlci1vbiIpO3Ro aXMuY2xlYXJTZWxlY3Rpb25zKCl9ZWxzZXtiLmFkZENsYXNzKCJ4LWdyaWQzLWhk LWNoZWNrZXItb24iKTt0aGlzLnNlbGVjdEFsbCgpfX19LHJlbmRlcmVyOmZ1bmN0 aW9uKGIsYyxhKXtyZXR1cm4nPGRpdiBjbGFzcz0ieC1ncmlkMy1yb3ctY2hlY2tl ciI+JiMxNjA7PC9kaXY+J30sb25FZGl0b3JTZWxlY3Q6ZnVuY3Rpb24oYixhKXtp ZihhIT1iJiYhdGhpcy5jaGVja09ubHkpe3RoaXMuc2VsZWN0Um93KGIpfX19KTtF eHQuZ3JpZC5DZWxsU2VsZWN0aW9uTW9kZWw9RXh0LmV4dGVuZChFeHQuZ3JpZC5B YnN0cmFjdFNlbGVjdGlvbk1vZGVsLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtF eHQuYXBwbHkodGhpcyxhKTt0aGlzLnNlbGVjdGlvbj1udWxsO3RoaXMuYWRkRXZl bnRzKCJiZWZvcmVjZWxsc2VsZWN0IiwiY2VsbHNlbGVjdCIsInNlbGVjdGlvbmNo YW5nZSIpO0V4dC5ncmlkLkNlbGxTZWxlY3Rpb25Nb2RlbC5zdXBlcmNsYXNzLmNv bnN0cnVjdG9yLmNhbGwodGhpcyl9LGluaXRFdmVudHM6ZnVuY3Rpb24oKXt0aGlz LmdyaWQub24oImNlbGxtb3VzZWRvd24iLHRoaXMuaGFuZGxlTW91c2VEb3duLHRo aXMpO3RoaXMuZ3JpZC5vbihFeHQuRXZlbnRNYW5hZ2VyLmdldEtleUV2ZW50KCks dGhpcy5oYW5kbGVLZXlEb3duLHRoaXMpO3RoaXMuZ3JpZC5nZXRWaWV3KCkub24o e3Njb3BlOnRoaXMscmVmcmVzaDp0aGlzLm9uVmlld0NoYW5nZSxyb3d1cGRhdGVk OnRoaXMub25Sb3dVcGRhdGVkLGJlZm9yZXJvd3JlbW92ZWQ6dGhpcy5jbGVhclNl bGVjdGlvbnMsYmVmb3Jlcm93c2luc2VydGVkOnRoaXMuY2xlYXJTZWxlY3Rpb25z fSk7aWYodGhpcy5ncmlkLmlzRWRpdG9yKXt0aGlzLmdyaWQub24oImJlZm9yZWVk aXQiLHRoaXMuYmVmb3JlRWRpdCx0aGlzKX19LGJlZm9yZUVkaXQ6ZnVuY3Rpb24o YSl7dGhpcy5zZWxlY3QoYS5yb3csYS5jb2x1bW4sZmFsc2UsdHJ1ZSxhLnJlY29y ZCl9LG9uUm93VXBkYXRlZDpmdW5jdGlvbihhLGIsYyl7aWYodGhpcy5zZWxlY3Rp b24mJnRoaXMuc2VsZWN0aW9uLnJlY29yZD09Yyl7YS5vbkNlbGxTZWxlY3QoYix0 aGlzLnNlbGVjdGlvbi5jZWxsWzFdKX19LG9uVmlld0NoYW5nZTpmdW5jdGlvbigp e3RoaXMuY2xlYXJTZWxlY3Rpb25zKHRydWUpfSxnZXRTZWxlY3RlZENlbGw6ZnVu Y3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb24/dGhpcy5zZWxlY3Rpb24uY2Vs bDpudWxsfSxjbGVhclNlbGVjdGlvbnM6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5z ZWxlY3Rpb247aWYoYSl7aWYoYiE9PXRydWUpe3RoaXMuZ3JpZC52aWV3Lm9uQ2Vs bERlc2VsZWN0KGEuY2VsbFswXSxhLmNlbGxbMV0pfXRoaXMuc2VsZWN0aW9uPW51 bGw7dGhpcy5maXJlRXZlbnQoInNlbGVjdGlvbmNoYW5nZSIsdGhpcyxudWxsKX19 LGhhc1NlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbj90 cnVlOmZhbHNlfSxoYW5kbGVNb3VzZURvd246ZnVuY3Rpb24oYixkLGEsYyl7aWYo Yy5idXR0b24hPT0wfHx0aGlzLmlzTG9ja2VkKCkpe3JldHVybn10aGlzLnNlbGVj dChkLGEpfSxzZWxlY3Q6ZnVuY3Rpb24oZyxjLGIsZSxkKXtpZih0aGlzLmZpcmVF dmVudCgiYmVmb3JlY2VsbHNlbGVjdCIsdGhpcyxnLGMpIT09ZmFsc2Upe3RoaXMu Y2xlYXJTZWxlY3Rpb25zKCk7ZD1kfHx0aGlzLmdyaWQuc3RvcmUuZ2V0QXQoZyk7 dGhpcy5zZWxlY3Rpb249e3JlY29yZDpkLGNlbGw6W2csY119O2lmKCFiKXt2YXIg YT10aGlzLmdyaWQuZ2V0VmlldygpO2Eub25DZWxsU2VsZWN0KGcsYyk7aWYoZSE9 PXRydWUpe2EuZm9jdXNDZWxsKGcsYyl9fXRoaXMuZmlyZUV2ZW50KCJjZWxsc2Vs ZWN0Iix0aGlzLGcsYyk7dGhpcy5maXJlRXZlbnQoInNlbGVjdGlvbmNoYW5nZSIs dGhpcyx0aGlzLnNlbGVjdGlvbil9fSxpc1NlbGVjdGFibGU6ZnVuY3Rpb24oYyxi LGEpe3JldHVybiAhYS5pc0hpZGRlbihiKX0sb25FZGl0b3JLZXk6ZnVuY3Rpb24o YixhKXtpZihhLmdldEtleSgpPT1hLlRBQil7dGhpcy5oYW5kbGVLZXlEb3duKGEp fX0saGFuZGxlS2V5RG93bjpmdW5jdGlvbihqKXtpZighai5pc05hdktleVByZXNz KCkpe3JldHVybn12YXIgZD1qLmdldEtleSgpLGk9dGhpcy5ncmlkLHA9dGhpcy5z ZWxlY3Rpb24sYj10aGlzLG09ZnVuY3Rpb24oZyxjLGUpe3JldHVybiBpLndhbGtD ZWxscyhnLGMsZSxpLmlzRWRpdG9yJiZpLmVkaXRpbmc/Yi5hY2NlcHRzTmF2OmIu aXNTZWxlY3RhYmxlLGIpfSxvLGgsYSxsLG47c3dpdGNoKGQpe2Nhc2Ugai5FU0M6 Y2FzZSBqLlBBR0VfVVA6Y2FzZSBqLlBBR0VfRE9XTjpicmVhaztkZWZhdWx0Omou c3RvcEV2ZW50KCk7YnJlYWt9aWYoIXApe289bSgwLDAsMSk7aWYobyl7dGhpcy5z ZWxlY3Qob1swXSxvWzFdKX1yZXR1cm59bz1wLmNlbGw7YT1vWzBdO2w9b1sxXTtz d2l0Y2goZCl7Y2FzZSBqLlRBQjppZihqLnNoaWZ0S2V5KXtoPW0oYSxsLTEsLTEp fWVsc2V7aD1tKGEsbCsxLDEpfWJyZWFrO2Nhc2Ugai5ET1dOOmg9bShhKzEsbCwx KTticmVhaztjYXNlIGouVVA6aD1tKGEtMSxsLC0xKTticmVhaztjYXNlIGouUklH SFQ6aD1tKGEsbCsxLDEpO2JyZWFrO2Nhc2Ugai5MRUZUOmg9bShhLGwtMSwtMSk7 YnJlYWs7Y2FzZSBqLkVOVEVSOmlmKGkuaXNFZGl0b3ImJiFpLmVkaXRpbmcpe2ku c3RhcnRFZGl0aW5nKGEsbCk7cmV0dXJufWJyZWFrfWlmKGgpe2E9aFswXTtsPWhb MV07dGhpcy5zZWxlY3QoYSxsKTtpZihpLmlzRWRpdG9yJiZpLmVkaXRpbmcpe249 aS5hY3RpdmVFZGl0b3I7aWYobiYmbi5maWVsZC50cmlnZ2VyQmx1cil7bi5maWVs ZC50cmlnZ2VyQmx1cigpfWkuc3RhcnRFZGl0aW5nKGEsbCl9fX0sYWNjZXB0c05h djpmdW5jdGlvbihjLGIsYSl7cmV0dXJuICFhLmlzSGlkZGVuKGIpJiZhLmlzQ2Vs bEVkaXRhYmxlKGIsYyl9fSk7RXh0LmdyaWQuRWRpdG9yR3JpZFBhbmVsPUV4dC5l eHRlbmQoRXh0LmdyaWQuR3JpZFBhbmVsLHtjbGlja3NUb0VkaXQ6Mixmb3JjZVZh bGlkYXRpb246ZmFsc2UsaXNFZGl0b3I6dHJ1ZSxkZXRlY3RFZGl0OmZhbHNlLGF1 dG9FbmNvZGU6ZmFsc2UsdHJhY2tNb3VzZU92ZXI6ZmFsc2UsaW5pdENvbXBvbmVu dDpmdW5jdGlvbigpe0V4dC5ncmlkLkVkaXRvckdyaWRQYW5lbC5zdXBlcmNsYXNz LmluaXRDb21wb25lbnQuY2FsbCh0aGlzKTtpZighdGhpcy5zZWxNb2RlbCl7dGhp cy5zZWxNb2RlbD1uZXcgRXh0LmdyaWQuQ2VsbFNlbGVjdGlvbk1vZGVsKCl9dGhp cy5hY3RpdmVFZGl0b3I9bnVsbDt0aGlzLmFkZEV2ZW50cygiYmVmb3JlZWRpdCIs ImFmdGVyZWRpdCIsInZhbGlkYXRlZWRpdCIpfSxpbml0RXZlbnRzOmZ1bmN0aW9u KCl7RXh0LmdyaWQuRWRpdG9yR3JpZFBhbmVsLnN1cGVyY2xhc3MuaW5pdEV2ZW50 cy5jYWxsKHRoaXMpO3RoaXMuZ2V0R3JpZEVsKCkub24oIm1vdXNld2hlZWwiLHRo aXMuc3RvcEVkaXRpbmcuY3JlYXRlRGVsZWdhdGUodGhpcyxbdHJ1ZV0pLHRoaXMp O3RoaXMub24oImNvbHVtbnJlc2l6ZSIsdGhpcy5zdG9wRWRpdGluZyx0aGlzLFt0 cnVlXSk7aWYodGhpcy5jbGlja3NUb0VkaXQ9PTEpe3RoaXMub24oImNlbGxjbGlj ayIsdGhpcy5vbkNlbGxEYmxDbGljayx0aGlzKX1lbHNle3ZhciBhPXRoaXMuZ2V0 VmlldygpO2lmKHRoaXMuY2xpY2tzVG9FZGl0PT0iYXV0byImJmEubWFpbkJvZHkp e2EubWFpbkJvZHkub24oIm1vdXNlZG93biIsdGhpcy5vbkF1dG9FZGl0Q2xpY2ss dGhpcyl9dGhpcy5vbigiY2VsbGRibGNsaWNrIix0aGlzLm9uQ2VsbERibENsaWNr LHRoaXMpfX0sb25SZXNpemU6ZnVuY3Rpb24oKXtFeHQuZ3JpZC5FZGl0b3JHcmlk UGFuZWwuc3VwZXJjbGFzcy5vblJlc2l6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7 dmFyIGE9dGhpcy5hY3RpdmVFZGl0b3I7aWYodGhpcy5lZGl0aW5nJiZhKXthLnJl YWxpZ24odHJ1ZSl9fSxvbkNlbGxEYmxDbGljazpmdW5jdGlvbihiLGMsYSl7dGhp cy5zdGFydEVkaXRpbmcoYyxhKX0sb25BdXRvRWRpdENsaWNrOmZ1bmN0aW9uKGMs Yil7aWYoYy5idXR0b24hPT0wKXtyZXR1cm59dmFyIGc9dGhpcy52aWV3LmZpbmRS b3dJbmRleChiKSxhPXRoaXMudmlldy5maW5kQ2VsbEluZGV4KGIpO2lmKGchPT1m YWxzZSYmYSE9PWZhbHNlKXt0aGlzLnN0b3BFZGl0aW5nKCk7aWYodGhpcy5zZWxN b2RlbC5nZXRTZWxlY3RlZENlbGwpe3ZhciBkPXRoaXMuc2VsTW9kZWwuZ2V0U2Vs ZWN0ZWRDZWxsKCk7aWYoZCYmZFswXT09PWcmJmRbMV09PT1hKXt0aGlzLnN0YXJ0 RWRpdGluZyhnLGEpfX1lbHNle2lmKHRoaXMuc2VsTW9kZWwuaXNTZWxlY3RlZChn KSl7dGhpcy5zdGFydEVkaXRpbmcoZyxhKX19fX0sb25FZGl0Q29tcGxldGU6ZnVu Y3Rpb24oYixkLGEpe3RoaXMuZWRpdGluZz1mYWxzZTt0aGlzLmxhc3RBY3RpdmVF ZGl0b3I9dGhpcy5hY3RpdmVFZGl0b3I7dGhpcy5hY3RpdmVFZGl0b3I9bnVsbDt2 YXIgYz1iLnJlY29yZCxoPXRoaXMuY29sTW9kZWwuZ2V0RGF0YUluZGV4KGIuY29s KTtkPXRoaXMucG9zdEVkaXRWYWx1ZShkLGEsYyxoKTtpZih0aGlzLmZvcmNlVmFs aWRhdGlvbj09PXRydWV8fFN0cmluZyhkKSE9PVN0cmluZyhhKSl7dmFyIGc9e2dy aWQ6dGhpcyxyZWNvcmQ6YyxmaWVsZDpoLG9yaWdpbmFsVmFsdWU6YSx2YWx1ZTpk LHJvdzpiLnJvdyxjb2x1bW46Yi5jb2wsY2FuY2VsOmZhbHNlfTtpZih0aGlzLmZp cmVFdmVudCgidmFsaWRhdGVlZGl0IixnKSE9PWZhbHNlJiYhZy5jYW5jZWwmJlN0 cmluZyhkKSE9PVN0cmluZyhhKSl7Yy5zZXQoaCxnLnZhbHVlKTtkZWxldGUgZy5j YW5jZWw7dGhpcy5maXJlRXZlbnQoImFmdGVyZWRpdCIsZyl9fXRoaXMudmlldy5m b2N1c0NlbGwoYi5yb3csYi5jb2wpfSxzdGFydEVkaXRpbmc6ZnVuY3Rpb24oaSxj KXt0aGlzLnN0b3BFZGl0aW5nKCk7aWYodGhpcy5jb2xNb2RlbC5pc0NlbGxFZGl0 YWJsZShjLGkpKXt0aGlzLnZpZXcuZW5zdXJlVmlzaWJsZShpLGMsdHJ1ZSk7dmFy IGQ9dGhpcy5zdG9yZS5nZXRBdChpKSxoPXRoaXMuY29sTW9kZWwuZ2V0RGF0YUlu ZGV4KGMpLGc9e2dyaWQ6dGhpcyxyZWNvcmQ6ZCxmaWVsZDpoLHZhbHVlOmQuZGF0 YVtoXSxyb3c6aSxjb2x1bW46YyxjYW5jZWw6ZmFsc2V9O2lmKHRoaXMuZmlyZUV2 ZW50KCJiZWZvcmVlZGl0IixnKSE9PWZhbHNlJiYhZy5jYW5jZWwpe3RoaXMuZWRp dGluZz10cnVlO3ZhciBiPXRoaXMuY29sTW9kZWwuZ2V0Q2VsbEVkaXRvcihjLGkp O2lmKCFiKXtyZXR1cm59aWYoIWIucmVuZGVyZWQpe2IucGFyZW50RWw9dGhpcy52 aWV3LmdldEVkaXRvclBhcmVudChiKTtiLm9uKHtzY29wZTp0aGlzLHJlbmRlcjp7 Zm46ZnVuY3Rpb24oZSl7ZS5maWVsZC5mb2N1cyhmYWxzZSx0cnVlKX0sc2luZ2xl OnRydWUsc2NvcGU6dGhpc30sc3BlY2lhbGtleTpmdW5jdGlvbihrLGope3RoaXMu Z2V0U2VsZWN0aW9uTW9kZWwoKS5vbkVkaXRvcktleShrLGopfSxjb21wbGV0ZTp0 aGlzLm9uRWRpdENvbXBsZXRlLGNhbmNlbGVkaXQ6dGhpcy5zdG9wRWRpdGluZy5j cmVhdGVEZWxlZ2F0ZSh0aGlzLFt0cnVlXSl9KX1FeHQuYXBwbHkoYix7cm93Omks Y29sOmMscmVjb3JkOmR9KTt0aGlzLmxhc3RFZGl0PXtyb3c6aSxjb2w6Y307dGhp cy5hY3RpdmVFZGl0b3I9YjtiLnNlbGVjdFNhbWVFZGl0b3I9KHRoaXMuYWN0aXZl RWRpdG9yPT10aGlzLmxhc3RBY3RpdmVFZGl0b3IpO3ZhciBhPXRoaXMucHJlRWRp dFZhbHVlKGQsaCk7Yi5zdGFydEVkaXQodGhpcy52aWV3LmdldENlbGwoaSxjKS5m aXJzdENoaWxkLEV4dC5pc0RlZmluZWQoYSk/YToiIik7KGZ1bmN0aW9uKCl7ZGVs ZXRlIGIuc2VsZWN0U2FtZUVkaXRvcn0pLmRlZmVyKDUwKX19fSxwcmVFZGl0VmFs dWU6ZnVuY3Rpb24oYSxjKXt2YXIgYj1hLmRhdGFbY107cmV0dXJuIHRoaXMuYXV0 b0VuY29kZSYmRXh0LmlzU3RyaW5nKGIpP0V4dC51dGlsLkZvcm1hdC5odG1sRGVj b2RlKGIpOmJ9LHBvc3RFZGl0VmFsdWU6ZnVuY3Rpb24oYyxhLGIsZCl7cmV0dXJu IHRoaXMuYXV0b0VuY29kZSYmRXh0LmlzU3RyaW5nKGMpP0V4dC51dGlsLkZvcm1h dC5odG1sRW5jb2RlKGMpOmN9LHN0b3BFZGl0aW5nOmZ1bmN0aW9uKGIpe2lmKHRo aXMuZWRpdGluZyl7dmFyIGE9dGhpcy5sYXN0QWN0aXZlRWRpdG9yPXRoaXMuYWN0 aXZlRWRpdG9yO2lmKGEpe2FbYj09PXRydWU/ImNhbmNlbEVkaXQiOiJjb21wbGV0 ZUVkaXQiXSgpO3RoaXMudmlldy5mb2N1c0NlbGwoYS5yb3csYS5jb2wpfXRoaXMu YWN0aXZlRWRpdG9yPW51bGx9dGhpcy5lZGl0aW5nPWZhbHNlfX0pO0V4dC5yZWco ImVkaXRvcmdyaWQiLEV4dC5ncmlkLkVkaXRvckdyaWRQYW5lbCk7RXh0LmdyaWQu R3JpZEVkaXRvcj1mdW5jdGlvbihiLGEpe0V4dC5ncmlkLkdyaWRFZGl0b3Iuc3Vw ZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYixhKTtiLm1vbml0b3JUYWI9 ZmFsc2V9O0V4dC5leHRlbmQoRXh0LmdyaWQuR3JpZEVkaXRvcixFeHQuRWRpdG9y LHthbGlnbm1lbnQ6InRsLXRsIixhdXRvU2l6ZToid2lkdGgiLGhpZGVFbDpmYWxz ZSxjbHM6Ingtc21hbGwtZWRpdG9yIHgtZ3JpZC1lZGl0b3IiLHNoaW06ZmFsc2Us c2hhZG93OmZhbHNlfSk7RXh0LmdyaWQuUHJvcGVydHlSZWNvcmQ9RXh0LmRhdGEu UmVjb3JkLmNyZWF0ZShbe25hbWU6Im5hbWUiLHR5cGU6InN0cmluZyJ9LCJ2YWx1 ZSJdKTtFeHQuZ3JpZC5Qcm9wZXJ0eVN0b3JlPUV4dC5leHRlbmQoRXh0LnV0aWwu T2JzZXJ2YWJsZSx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiKXt0aGlzLmdyaWQ9 YTt0aGlzLnN0b3JlPW5ldyBFeHQuZGF0YS5TdG9yZSh7cmVjb3JkVHlwZTpFeHQu Z3JpZC5Qcm9wZXJ0eVJlY29yZH0pO3RoaXMuc3RvcmUub24oInVwZGF0ZSIsdGhp cy5vblVwZGF0ZSx0aGlzKTtpZihiKXt0aGlzLnNldFNvdXJjZShiKX1FeHQuZ3Jp ZC5Qcm9wZXJ0eVN0b3JlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlz KX0sc2V0U291cmNlOmZ1bmN0aW9uKGMpe3RoaXMuc291cmNlPWM7dGhpcy5zdG9y ZS5yZW1vdmVBbGwoKTt2YXIgYj1bXTtmb3IodmFyIGEgaW4gYyl7aWYodGhpcy5p c0VkaXRhYmxlVmFsdWUoY1thXSkpe2IucHVzaChuZXcgRXh0LmdyaWQuUHJvcGVy dHlSZWNvcmQoe25hbWU6YSx2YWx1ZTpjW2FdfSxhKSl9fXRoaXMuc3RvcmUubG9h ZFJlY29yZHMoe3JlY29yZHM6Yn0se30sdHJ1ZSl9LG9uVXBkYXRlOmZ1bmN0aW9u KGUsYSxkKXtpZihkPT1FeHQuZGF0YS5SZWNvcmQuRURJVCl7dmFyIGI9YS5kYXRh LnZhbHVlO3ZhciBjPWEubW9kaWZpZWQudmFsdWU7aWYodGhpcy5ncmlkLmZpcmVF dmVudCgiYmVmb3JlcHJvcGVydHljaGFuZ2UiLHRoaXMuc291cmNlLGEuaWQsYixj KSE9PWZhbHNlKXt0aGlzLnNvdXJjZVthLmlkXT1iO2EuY29tbWl0KCk7dGhpcy5n cmlkLmZpcmVFdmVudCgicHJvcGVydHljaGFuZ2UiLHRoaXMuc291cmNlLGEuaWQs YixjKX1lbHNle2EucmVqZWN0KCl9fX0sZ2V0UHJvcGVydHk6ZnVuY3Rpb24oYSl7 cmV0dXJuIHRoaXMuc3RvcmUuZ2V0QXQoYSl9LGlzRWRpdGFibGVWYWx1ZTpmdW5j dGlvbihhKXtyZXR1cm4gRXh0LmlzUHJpbWl0aXZlKGEpfHxFeHQuaXNEYXRlKGEp fSxzZXRWYWx1ZTpmdW5jdGlvbihkLGMsYSl7dmFyIGI9dGhpcy5nZXRSZWMoZCk7 aWYoYil7Yi5zZXQoInZhbHVlIixjKTt0aGlzLnNvdXJjZVtkXT1jfWVsc2V7aWYo YSl7dGhpcy5zb3VyY2VbZF09YztiPW5ldyBFeHQuZ3JpZC5Qcm9wZXJ0eVJlY29y ZCh7bmFtZTpkLHZhbHVlOmN9LGQpO3RoaXMuc3RvcmUuYWRkKGIpfX19LHJlbW92 ZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFJlYyhiKTtpZihhKXt0aGlzLnN0 b3JlLnJlbW92ZShhKTtkZWxldGUgdGhpcy5zb3VyY2VbYl19fSxnZXRSZWM6ZnVu Y3Rpb24oYSl7cmV0dXJuIHRoaXMuc3RvcmUuZ2V0QnlJZChhKX0sZ2V0U291cmNl OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc291cmNlfX0pO0V4dC5ncmlkLlByb3Bl cnR5Q29sdW1uTW9kZWw9RXh0LmV4dGVuZChFeHQuZ3JpZC5Db2x1bW5Nb2RlbCx7 bmFtZVRleHQ6Ik5hbWUiLHZhbHVlVGV4dDoiVmFsdWUiLGRhdGVGb3JtYXQ6Im0v ai9ZIix0cnVlVGV4dDoidHJ1ZSIsZmFsc2VUZXh0OiJmYWxzZSIsY29uc3RydWN0 b3I6ZnVuY3Rpb24oYyxiKXt2YXIgZD1FeHQuZ3JpZCxlPUV4dC5mb3JtO3RoaXMu Z3JpZD1jO2QuUHJvcGVydHlDb2x1bW5Nb2RlbC5zdXBlcmNsYXNzLmNvbnN0cnVj dG9yLmNhbGwodGhpcyxbe2hlYWRlcjp0aGlzLm5hbWVUZXh0LHdpZHRoOjUwLHNv cnRhYmxlOnRydWUsZGF0YUluZGV4OiJuYW1lIixpZDoibmFtZSIsbWVudURpc2Fi bGVkOnRydWV9LHtoZWFkZXI6dGhpcy52YWx1ZVRleHQsd2lkdGg6NTAscmVzaXph YmxlOmZhbHNlLGRhdGFJbmRleDoidmFsdWUiLGlkOiJ2YWx1ZSIsbWVudURpc2Fi bGVkOnRydWV9XSk7dGhpcy5zdG9yZT1iO3ZhciBhPW5ldyBlLkZpZWxkKHthdXRv Q3JlYXRlOnt0YWc6InNlbGVjdCIsY2hpbGRyZW46W3t0YWc6Im9wdGlvbiIsdmFs dWU6InRydWUiLGh0bWw6dGhpcy50cnVlVGV4dH0se3RhZzoib3B0aW9uIix2YWx1 ZToiZmFsc2UiLGh0bWw6dGhpcy5mYWxzZVRleHR9XX0sZ2V0VmFsdWU6ZnVuY3Rp b24oKXtyZXR1cm4gdGhpcy5lbC5kb20udmFsdWU9PSJ0cnVlIn19KTt0aGlzLmVk aXRvcnM9e2RhdGU6bmV3IGQuR3JpZEVkaXRvcihuZXcgZS5EYXRlRmllbGQoe3Nl bGVjdE9uRm9jdXM6dHJ1ZX0pKSxzdHJpbmc6bmV3IGQuR3JpZEVkaXRvcihuZXcg ZS5UZXh0RmllbGQoe3NlbGVjdE9uRm9jdXM6dHJ1ZX0pKSxudW1iZXI6bmV3IGQu R3JpZEVkaXRvcihuZXcgZS5OdW1iZXJGaWVsZCh7c2VsZWN0T25Gb2N1czp0cnVl LHN0eWxlOiJ0ZXh0LWFsaWduOmxlZnQ7In0pKSwiYm9vbGVhbiI6bmV3IGQuR3Jp ZEVkaXRvcihhLHthdXRvU2l6ZToiYm90aCJ9KX07dGhpcy5yZW5kZXJDZWxsRGVs ZWdhdGU9dGhpcy5yZW5kZXJDZWxsLmNyZWF0ZURlbGVnYXRlKHRoaXMpO3RoaXMu cmVuZGVyUHJvcERlbGVnYXRlPXRoaXMucmVuZGVyUHJvcC5jcmVhdGVEZWxlZ2F0 ZSh0aGlzKX0scmVuZGVyRGF0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5kYXRlRm9y bWF0KHRoaXMuZGF0ZUZvcm1hdCl9LHJlbmRlckJvb2w6ZnVuY3Rpb24oYSl7cmV0 dXJuIHRoaXNbYT8idHJ1ZVRleHQiOiJmYWxzZVRleHQiXX0saXNDZWxsRWRpdGFi bGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09MX0sZ2V0UmVuZGVyZXI6ZnVuY3Rp b24oYSl7cmV0dXJuIGE9PTE/dGhpcy5yZW5kZXJDZWxsRGVsZWdhdGU6dGhpcy5y ZW5kZXJQcm9wRGVsZWdhdGV9LHJlbmRlclByb3A6ZnVuY3Rpb24oYSl7cmV0dXJu IHRoaXMuZ2V0UHJvcGVydHlOYW1lKGEpfSxyZW5kZXJDZWxsOmZ1bmN0aW9uKGQs YixjKXt2YXIgYT10aGlzLmdyaWQuY3VzdG9tUmVuZGVyZXJzW2MuZ2V0KCJuYW1l IildO2lmKGEpe3JldHVybiBhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX12YXIgZT1k O2lmKEV4dC5pc0RhdGUoZCkpe2U9dGhpcy5yZW5kZXJEYXRlKGQpfWVsc2V7aWYo dHlwZW9mIGQ9PSJib29sZWFuIil7ZT10aGlzLnJlbmRlckJvb2woZCl9fXJldHVy biBFeHQudXRpbC5Gb3JtYXQuaHRtbEVuY29kZShlKX0sZ2V0UHJvcGVydHlOYW1l OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ3JpZC5wcm9wZXJ0eU5hbWVzO3JldHVy biBhJiZhW2JdP2FbYl06Yn0sZ2V0Q2VsbEVkaXRvcjpmdW5jdGlvbihhLGUpe3Zh ciBiPXRoaXMuc3RvcmUuZ2V0UHJvcGVydHkoZSksZD1iLmRhdGEubmFtZSxjPWIu ZGF0YS52YWx1ZTtpZih0aGlzLmdyaWQuY3VzdG9tRWRpdG9yc1tkXSl7cmV0dXJu IHRoaXMuZ3JpZC5jdXN0b21FZGl0b3JzW2RdfWlmKEV4dC5pc0RhdGUoYykpe3Jl dHVybiB0aGlzLmVkaXRvcnMuZGF0ZX1lbHNle2lmKHR5cGVvZiBjPT0ibnVtYmVy Iil7cmV0dXJuIHRoaXMuZWRpdG9ycy5udW1iZXJ9ZWxzZXtpZih0eXBlb2YgYz09 ImJvb2xlYW4iKXtyZXR1cm4gdGhpcy5lZGl0b3JzWyJib29sZWFuIl19ZWxzZXty ZXR1cm4gdGhpcy5lZGl0b3JzLnN0cmluZ319fX0sZGVzdHJveTpmdW5jdGlvbigp e0V4dC5ncmlkLlByb3BlcnR5Q29sdW1uTW9kZWwuc3VwZXJjbGFzcy5kZXN0cm95 LmNhbGwodGhpcyk7dGhpcy5kZXN0cm95RWRpdG9ycyh0aGlzLmVkaXRvcnMpO3Ro aXMuZGVzdHJveUVkaXRvcnModGhpcy5ncmlkLmN1c3RvbUVkaXRvcnMpfSxkZXN0 cm95RWRpdG9yczpmdW5jdGlvbihiKXtmb3IodmFyIGEgaW4gYil7RXh0LmRlc3Ry b3koYlthXSl9fX0pO0V4dC5ncmlkLlByb3BlcnR5R3JpZD1FeHQuZXh0ZW5kKEV4 dC5ncmlkLkVkaXRvckdyaWRQYW5lbCx7ZW5hYmxlQ29sdW1uTW92ZTpmYWxzZSxz dHJpcGVSb3dzOmZhbHNlLHRyYWNrTW91c2VPdmVyOmZhbHNlLGNsaWNrc1RvRWRp dDoxLGVuYWJsZUhkTWVudTpmYWxzZSx2aWV3Q29uZmlnOntmb3JjZUZpdDp0cnVl fSxpbml0Q29tcG9uZW50OmZ1bmN0aW9uKCl7dGhpcy5jdXN0b21SZW5kZXJlcnM9 dGhpcy5jdXN0b21SZW5kZXJlcnN8fHt9O3RoaXMuY3VzdG9tRWRpdG9ycz10aGlz LmN1c3RvbUVkaXRvcnN8fHt9O3RoaXMubGFzdEVkaXRSb3c9bnVsbDt2YXIgYj1u ZXcgRXh0LmdyaWQuUHJvcGVydHlTdG9yZSh0aGlzKTt0aGlzLnByb3BTdG9yZT1i O3ZhciBhPW5ldyBFeHQuZ3JpZC5Qcm9wZXJ0eUNvbHVtbk1vZGVsKHRoaXMsYik7 Yi5zdG9yZS5zb3J0KCJuYW1lIiwiQVNDIik7dGhpcy5hZGRFdmVudHMoImJlZm9y ZXByb3BlcnR5Y2hhbmdlIiwicHJvcGVydHljaGFuZ2UiKTt0aGlzLmNtPWE7dGhp cy5kcz1iLnN0b3JlO0V4dC5ncmlkLlByb3BlcnR5R3JpZC5zdXBlcmNsYXNzLmlu aXRDb21wb25lbnQuY2FsbCh0aGlzKTt0aGlzLm1vbih0aGlzLnNlbE1vZGVsLCJi ZWZvcmVjZWxsc2VsZWN0IixmdW5jdGlvbihlLGQsYyl7aWYoYz09PTApe3RoaXMu c3RhcnRFZGl0aW5nLmRlZmVyKDIwMCx0aGlzLFtkLDFdKTtyZXR1cm4gZmFsc2V9 fSx0aGlzKX0sb25SZW5kZXI6ZnVuY3Rpb24oKXtFeHQuZ3JpZC5Qcm9wZXJ0eUdy aWQuc3VwZXJjbGFzcy5vblJlbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhp cy5nZXRHcmlkRWwoKS5hZGRDbGFzcygieC1wcm9wcy1ncmlkIil9LGFmdGVyUmVu ZGVyOmZ1bmN0aW9uKCl7RXh0LmdyaWQuUHJvcGVydHlHcmlkLnN1cGVyY2xhc3Mu YWZ0ZXJSZW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKHRoaXMuc291cmNl KXt0aGlzLnNldFNvdXJjZSh0aGlzLnNvdXJjZSl9fSxzZXRTb3VyY2U6ZnVuY3Rp b24oYSl7dGhpcy5wcm9wU3RvcmUuc2V0U291cmNlKGEpfSxnZXRTb3VyY2U6ZnVu Y3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wU3RvcmUuZ2V0U291cmNlKCl9LHNldFBy b3BlcnR5OmZ1bmN0aW9uKGMsYixhKXt0aGlzLnByb3BTdG9yZS5zZXRWYWx1ZShj LGIsYSl9LHJlbW92ZVByb3BlcnR5OmZ1bmN0aW9uKGEpe3RoaXMucHJvcFN0b3Jl LnJlbW92ZShhKX19KTtFeHQucmVnKCJwcm9wZXJ0eWdyaWQiLEV4dC5ncmlkLlBy b3BlcnR5R3JpZCk7RXh0LmdyaWQuR3JvdXBpbmdWaWV3PUV4dC5leHRlbmQoRXh0 LmdyaWQuR3JpZFZpZXcse2dyb3VwQnlUZXh0OiJHcm91cCBCeSBUaGlzIEZpZWxk IixzaG93R3JvdXBzVGV4dDoiU2hvdyBpbiBHcm91cHMiLGhpZGVHcm91cGVkQ29s dW1uOmZhbHNlLHNob3dHcm91cE5hbWU6dHJ1ZSxzdGFydENvbGxhcHNlZDpmYWxz ZSxlbmFibGVHcm91cGluZzp0cnVlLGVuYWJsZUdyb3VwaW5nTWVudTp0cnVlLGVu YWJsZU5vR3JvdXBzOnRydWUsZW1wdHlHcm91cFRleHQ6IihOb25lKSIsaWdub3Jl QWRkOmZhbHNlLGdyb3VwVGV4dFRwbDoie3RleHR9Iixncm91cE1vZGU6InZhbHVl IixjYW5jZWxFZGl0T25Ub2dnbGU6dHJ1ZSxpbml0VGVtcGxhdGVzOmZ1bmN0aW9u KCl7RXh0LmdyaWQuR3JvdXBpbmdWaWV3LnN1cGVyY2xhc3MuaW5pdFRlbXBsYXRl cy5jYWxsKHRoaXMpO3RoaXMuc3RhdGU9e307dmFyIGE9dGhpcy5ncmlkLmdldFNl bGVjdGlvbk1vZGVsKCk7YS5vbihhLnNlbGVjdFJvdz8iYmVmb3Jlcm93c2VsZWN0 IjoiYmVmb3JlY2VsbHNlbGVjdCIsdGhpcy5vbkJlZm9yZVJvd1NlbGVjdCx0aGlz KTtpZighdGhpcy5zdGFydEdyb3VwKXt0aGlzLnN0YXJ0R3JvdXA9bmV3IEV4dC5Y VGVtcGxhdGUoJzxkaXYgaWQ9Intncm91cElkfSIgY2xhc3M9IngtZ3JpZC1ncm91 cCB7Y2xzfSI+JywnPGRpdiBpZD0ie2dyb3VwSWR9LWhkIiBjbGFzcz0ieC1ncmlk LWdyb3VwLWhkIiBzdHlsZT0ie3N0eWxlfSI+PGRpdiBjbGFzcz0ieC1ncmlkLWdy b3VwLXRpdGxlIj4nLHRoaXMuZ3JvdXBUZXh0VHBsLCI8L2Rpdj48L2Rpdj4iLCc8 ZGl2IGlkPSJ7Z3JvdXBJZH0tYmQiIGNsYXNzPSJ4LWdyaWQtZ3JvdXAtYm9keSI+ Jyl9dGhpcy5zdGFydEdyb3VwLmNvbXBpbGUoKTtpZighdGhpcy5lbmRHcm91cCl7 dGhpcy5lbmRHcm91cD0iPC9kaXY+PC9kaXY+In19LGZpbmRHcm91cDpmdW5jdGlv bihhKXtyZXR1cm4gRXh0LmZseShhKS51cCgiLngtZ3JpZC1ncm91cCIsdGhpcy5t YWluQm9keS5kb20pfSxnZXRHcm91cHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5o YXNSb3dzKCk/dGhpcy5tYWluQm9keS5kb20uY2hpbGROb2RlczpbXX0sb25BZGQ6 ZnVuY3Rpb24oZCxhLGIpe2lmKHRoaXMuY2FuR3JvdXAoKSYmIXRoaXMuaWdub3Jl QWRkKXt2YXIgYz10aGlzLmdldFNjcm9sbFN0YXRlKCk7dGhpcy5maXJlRXZlbnQo ImJlZm9yZXJvd3NpbnNlcnRlZCIsZCxiLGIrKGEubGVuZ3RoLTEpKTt0aGlzLnJl ZnJlc2goKTt0aGlzLnJlc3RvcmVTY3JvbGwoYyk7dGhpcy5maXJlRXZlbnQoInJv d3NpbnNlcnRlZCIsZCxiLGIrKGEubGVuZ3RoLTEpKX1lbHNle2lmKCF0aGlzLmNh bkdyb3VwKCkpe0V4dC5ncmlkLkdyb3VwaW5nVmlldy5zdXBlcmNsYXNzLm9uQWRk LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fSxvblJlbW92ZTpmdW5jdGlvbihlLGEs YixkKXtFeHQuZ3JpZC5Hcm91cGluZ1ZpZXcuc3VwZXJjbGFzcy5vblJlbW92ZS5h cHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 SWQoYS5fZ3JvdXBJZCk7aWYoYyYmYy5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXMu bGVuZ3RoPDEpe0V4dC5yZW1vdmVOb2RlKGMpfXRoaXMuYXBwbHlFbXB0eVRleHQo KX0scmVmcmVzaFJvdzpmdW5jdGlvbihhKXtpZih0aGlzLmRzLmdldENvdW50KCk9 PTEpe3RoaXMucmVmcmVzaCgpfWVsc2V7dGhpcy5pc1VwZGF0aW5nPXRydWU7RXh0 LmdyaWQuR3JvdXBpbmdWaWV3LnN1cGVyY2xhc3MucmVmcmVzaFJvdy5hcHBseSh0 aGlzLGFyZ3VtZW50cyk7dGhpcy5pc1VwZGF0aW5nPWZhbHNlfX0sYmVmb3JlTWVu dVNob3c6ZnVuY3Rpb24oKXt2YXIgYyxhPXRoaXMuaG1lbnUuaXRlbXMsYj10aGlz LmNtLmNvbmZpZ1t0aGlzLmhkQ3R4SW5kZXhdLmdyb3VwYWJsZT09PWZhbHNlO2lm KChjPWEuZ2V0KCJncm91cEJ5IikpKXtjLnNldERpc2FibGVkKGIpfWlmKChjPWEu Z2V0KCJzaG93R3JvdXBzIikpKXtjLnNldERpc2FibGVkKGIpO2Muc2V0Q2hlY2tl ZCh0aGlzLmNhbkdyb3VwKCksdHJ1ZSl9fSxyZW5kZXJVSTpmdW5jdGlvbigpe3Zh ciBhPUV4dC5ncmlkLkdyb3VwaW5nVmlldy5zdXBlcmNsYXNzLnJlbmRlclVJLmNh bGwodGhpcyk7aWYodGhpcy5lbmFibGVHcm91cGluZ01lbnUmJnRoaXMuaG1lbnUp e3RoaXMuaG1lbnUuYWRkKCItIix7aXRlbUlkOiJncm91cEJ5Iix0ZXh0OnRoaXMu Z3JvdXBCeVRleHQsaGFuZGxlcjp0aGlzLm9uR3JvdXBCeUNsaWNrLHNjb3BlOnRo aXMsaWNvbkNsczoieC1ncm91cC1ieS1pY29uIn0pO2lmKHRoaXMuZW5hYmxlTm9H cm91cHMpe3RoaXMuaG1lbnUuYWRkKHtpdGVtSWQ6InNob3dHcm91cHMiLHRleHQ6 dGhpcy5zaG93R3JvdXBzVGV4dCxjaGVja2VkOnRydWUsY2hlY2tIYW5kbGVyOnRo aXMub25TaG93R3JvdXBzQ2xpY2ssc2NvcGU6dGhpc30pfXRoaXMuaG1lbnUub24o ImJlZm9yZXNob3ciLHRoaXMuYmVmb3JlTWVudVNob3csdGhpcyl9cmV0dXJuIGF9 LHByb2Nlc3NFdmVudDpmdW5jdGlvbihiLGkpe0V4dC5ncmlkLkdyb3VwaW5nVmll dy5zdXBlcmNsYXNzLnByb2Nlc3NFdmVudC5jYWxsKHRoaXMsYixpKTt2YXIgaD1p LmdldFRhcmdldCgiLngtZ3JpZC1ncm91cC1oZCIsdGhpcy5tYWluQm9keSk7aWYo aCl7dmFyIGc9dGhpcy5nZXRHcm91cEZpZWxkKCksZD10aGlzLmdldFByZWZpeChn KSxhPWguaWQuc3Vic3RyaW5nKGQubGVuZ3RoKSxjPW5ldyBSZWdFeHAoImdwLSIr RXh0LmVzY2FwZVJlKGcpKyItLWhkIik7YT1hLnN1YnN0cigwLGEubGVuZ3RoLTMp O2lmKGF8fGMudGVzdChoLmlkKSl7dGhpcy5ncmlkLmZpcmVFdmVudCgiZ3JvdXAi K2IsdGhpcy5ncmlkLGcsYSxpKX1pZihiPT0ibW91c2Vkb3duIiYmaS5idXR0b249 PTApe3RoaXMudG9nZ2xlR3JvdXAoaC5wYXJlbnROb2RlKX19fSxvbkdyb3VwQnlD bGljazpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ3JpZDt0aGlzLmVuYWJsZUdyb3Vw aW5nPXRydWU7YS5zdG9yZS5ncm91cEJ5KHRoaXMuY20uZ2V0RGF0YUluZGV4KHRo aXMuaGRDdHhJbmRleCkpO2EuZmlyZUV2ZW50KCJncm91cGNoYW5nZSIsYSxhLnN0 b3JlLmdldEdyb3VwU3RhdGUoKSk7dGhpcy5iZWZvcmVNZW51U2hvdygpO3RoaXMu cmVmcmVzaCgpfSxvblNob3dHcm91cHNDbGljazpmdW5jdGlvbihhLGIpe3RoaXMu ZW5hYmxlR3JvdXBpbmc9YjtpZihiKXt0aGlzLm9uR3JvdXBCeUNsaWNrKCl9ZWxz ZXt0aGlzLmdyaWQuc3RvcmUuY2xlYXJHcm91cGluZygpO3RoaXMuZ3JpZC5maXJl RXZlbnQoImdyb3VwY2hhbmdlIix0aGlzLG51bGwpfX0sdG9nZ2xlUm93SW5kZXg6 ZnVuY3Rpb24oYyxhKXtpZighdGhpcy5jYW5Hcm91cCgpKXtyZXR1cm59dmFyIGI9 dGhpcy5nZXRSb3coYyk7aWYoYil7dGhpcy50b2dnbGVHcm91cCh0aGlzLmZpbmRH cm91cChiKSxhKX19LHRvZ2dsZUdyb3VwOmZ1bmN0aW9uKGMsYil7dmFyIGE9RXh0 LmdldChjKSxkPUV4dC51dGlsLkZvcm1hdC5odG1sRW5jb2RlKGEuaWQpO2I9RXh0 LmlzRGVmaW5lZChiKT9iOmEuaGFzQ2xhc3MoIngtZ3JpZC1ncm91cC1jb2xsYXBz ZWQiKTtpZih0aGlzLnN0YXRlW2RdIT09Yil7aWYodGhpcy5jYW5jZWxFZGl0T25U b2dnbGUhPT1mYWxzZSl7dGhpcy5ncmlkLnN0b3BFZGl0aW5nKHRydWUpfXRoaXMu c3RhdGVbZF09YjthW2I/InJlbW92ZUNsYXNzIjoiYWRkQ2xhc3MiXSgieC1ncmlk LWdyb3VwLWNvbGxhcHNlZCIpfX0sdG9nZ2xlQWxsR3JvdXBzOmZ1bmN0aW9uKGMp e3ZhciBiPXRoaXMuZ2V0R3JvdXBzKCk7Zm9yKHZhciBkPTAsYT1iLmxlbmd0aDtk PGE7ZCsrKXt0aGlzLnRvZ2dsZUdyb3VwKGJbZF0sYyl9fSxleHBhbmRBbGxHcm91 cHM6ZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZUFsbEdyb3Vwcyh0cnVlKX0sY29sbGFw c2VBbGxHcm91cHM6ZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZUFsbEdyb3VwcyhmYWxz ZSl9LGdldEdyb3VwOmZ1bmN0aW9uKGEsZSxpLGosYixoKXt2YXIgYz10aGlzLmNt LmNvbmZpZ1tiXSxkPWk/aS5jYWxsKGMuc2NvcGUsYSx7fSxlLGosYixoKTpTdHJp bmcoYSk7aWYoZD09PSIifHxkPT09IiYjMTYwOyIpe2Q9Yy5lbXB0eUdyb3VwVGV4 dHx8dGhpcy5lbXB0eUdyb3VwVGV4dH1yZXR1cm4gZH0sZ2V0R3JvdXBGaWVsZDpm dW5jdGlvbigpe3JldHVybiB0aGlzLmdyaWQuc3RvcmUuZ2V0R3JvdXBTdGF0ZSgp fSxhZnRlclJlbmRlcjpmdW5jdGlvbigpe2lmKCF0aGlzLmRzfHwhdGhpcy5jbSl7 cmV0dXJufUV4dC5ncmlkLkdyb3VwaW5nVmlldy5zdXBlcmNsYXNzLmFmdGVyUmVu ZGVyLmNhbGwodGhpcyk7aWYodGhpcy5ncmlkLmRlZmVyUm93UmVuZGVyKXt0aGlz LnVwZGF0ZUdyb3VwV2lkdGhzKCl9fSxhZnRlclJlbmRlclVJOmZ1bmN0aW9uKCl7 RXh0LmdyaWQuR3JvdXBpbmdWaWV3LnN1cGVyY2xhc3MuYWZ0ZXJSZW5kZXJVSS5j YWxsKHRoaXMpO2lmKHRoaXMuZW5hYmxlR3JvdXBpbmdNZW51JiZ0aGlzLmhtZW51 KXt0aGlzLmhtZW51LmFkZCgiLSIse2l0ZW1JZDoiZ3JvdXBCeSIsdGV4dDp0aGlz Lmdyb3VwQnlUZXh0LGhhbmRsZXI6dGhpcy5vbkdyb3VwQnlDbGljayxzY29wZTp0 aGlzLGljb25DbHM6IngtZ3JvdXAtYnktaWNvbiJ9KTtpZih0aGlzLmVuYWJsZU5v R3JvdXBzKXt0aGlzLmhtZW51LmFkZCh7aXRlbUlkOiJzaG93R3JvdXBzIix0ZXh0 OnRoaXMuc2hvd0dyb3Vwc1RleHQsY2hlY2tlZDp0cnVlLGNoZWNrSGFuZGxlcjp0 aGlzLm9uU2hvd0dyb3Vwc0NsaWNrLHNjb3BlOnRoaXN9KX10aGlzLmhtZW51Lm9u KCJiZWZvcmVzaG93Iix0aGlzLmJlZm9yZU1lbnVTaG93LHRoaXMpfX0scmVuZGVy Um93czpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0R3JvdXBGaWVsZCgpO3ZhciBl PSEhYTtpZih0aGlzLmhpZGVHcm91cGVkQ29sdW1uKXt2YXIgYj10aGlzLmNtLmZp bmRDb2x1bW5JbmRleChhKSxkPUV4dC5pc0RlZmluZWQodGhpcy5sYXN0R3JvdXBG aWVsZCk7aWYoIWUmJmQpe3RoaXMubWFpbkJvZHkudXBkYXRlKCIiKTt0aGlzLmNt LnNldEhpZGRlbih0aGlzLmNtLmZpbmRDb2x1bW5JbmRleCh0aGlzLmxhc3RHcm91 cEZpZWxkKSxmYWxzZSk7ZGVsZXRlIHRoaXMubGFzdEdyb3VwRmllbGR9ZWxzZXtp ZihlJiYhZCl7dGhpcy5sYXN0R3JvdXBGaWVsZD1hO3RoaXMuY20uc2V0SGlkZGVu KGIsdHJ1ZSl9ZWxzZXtpZihlJiZkJiZhIT09dGhpcy5sYXN0R3JvdXBGaWVsZCl7 dGhpcy5tYWluQm9keS51cGRhdGUoIiIpO3ZhciBjPXRoaXMuY20uZmluZENvbHVt bkluZGV4KHRoaXMubGFzdEdyb3VwRmllbGQpO3RoaXMuY20uc2V0SGlkZGVuKGMs ZmFsc2UpO3RoaXMubGFzdEdyb3VwRmllbGQ9YTt0aGlzLmNtLnNldEhpZGRlbihi LHRydWUpfX19fXJldHVybiBFeHQuZ3JpZC5Hcm91cGluZ1ZpZXcuc3VwZXJjbGFz cy5yZW5kZXJSb3dzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZG9SZW5kZXI6ZnVu Y3Rpb24oYyxoLHEsYSxwLHMpe2lmKGgubGVuZ3RoPDEpe3JldHVybiIifWlmKCF0 aGlzLmNhbkdyb3VwKCl8fHRoaXMuaXNVcGRhdGluZyl7cmV0dXJuIEV4dC5ncmlk Lkdyb3VwaW5nVmlldy5zdXBlcmNsYXNzLmRvUmVuZGVyLmFwcGx5KHRoaXMsYXJn dW1lbnRzKX12YXIgej10aGlzLmdldEdyb3VwRmllbGQoKSxvPXRoaXMuY20uZmlu ZENvbHVtbkluZGV4KHopLHcsaj0id2lkdGg6Iit0aGlzLmdldFRvdGFsV2lkdGgo KSsiOyIsZT10aGlzLmNtLmNvbmZpZ1tvXSxiPWUuZ3JvdXBSZW5kZXJlcnx8ZS5y ZW5kZXJlcix0PXRoaXMuc2hvd0dyb3VwTmFtZT8oZS5ncm91cE5hbWV8fGUuaGVh ZGVyKSsiOiAiOiIiLHk9W10sbCx1LHYsbjtmb3IodT0wLHY9aC5sZW5ndGg7dTx2 O3UrKyl7dmFyIGs9YSt1LG09aFt1XSxkPW0uZGF0YVt6XTt3PXRoaXMuZ2V0R3Jv dXAoZCxtLGIsayxvLHEpO2lmKCFsfHxsLmdyb3VwIT13KXtuPXRoaXMuY29uc3Ry dWN0SWQoZCx6LG8pO3RoaXMuc3RhdGVbbl09IShFeHQuaXNEZWZpbmVkKHRoaXMu c3RhdGVbbl0pPyF0aGlzLnN0YXRlW25dOnRoaXMuc3RhcnRDb2xsYXBzZWQpO2w9 e2dyb3VwOncsZ3ZhbHVlOmQsdGV4dDp0K3csZ3JvdXBJZDpuLHN0YXJ0Um93Omss cnM6W21dLGNsczp0aGlzLnN0YXRlW25dPyIiOiJ4LWdyaWQtZ3JvdXAtY29sbGFw c2VkIixzdHlsZTpqfTt5LnB1c2gobCl9ZWxzZXtsLnJzLnB1c2gobSl9bS5fZ3Jv dXBJZD1ufXZhciB4PVtdO2Zvcih1PTAsdj15Lmxlbmd0aDt1PHY7dSsrKXt3PXlb dV07dGhpcy5kb0dyb3VwU3RhcnQoeCx3LGMscSxwKTt4W3gubGVuZ3RoXT1FeHQu Z3JpZC5Hcm91cGluZ1ZpZXcuc3VwZXJjbGFzcy5kb1JlbmRlci5jYWxsKHRoaXMs Yyx3LnJzLHEsdy5zdGFydFJvdyxwLHMpO3RoaXMuZG9Hcm91cEVuZCh4LHcsYyxx LHApfXJldHVybiB4LmpvaW4oIiIpfSxnZXRHcm91cElkOmZ1bmN0aW9uKGEpe3Zh ciBiPXRoaXMuZ2V0R3JvdXBGaWVsZCgpO3JldHVybiB0aGlzLmNvbnN0cnVjdElk KGEsYix0aGlzLmNtLmZpbmRDb2x1bW5JbmRleChiKSl9LGNvbnN0cnVjdElkOmZ1 bmN0aW9uKGMsZSxhKXt2YXIgYj10aGlzLmNtLmNvbmZpZ1thXSxkPWIuZ3JvdXBS ZW5kZXJlcnx8Yi5yZW5kZXJlcixnPSh0aGlzLmdyb3VwTW9kZT09InZhbHVlIik/ Yzp0aGlzLmdldEdyb3VwKGMse2RhdGE6e319LGQsMCxhLHRoaXMuZHMpO3JldHVy biB0aGlzLmdldFByZWZpeChlKStFeHQudXRpbC5Gb3JtYXQuaHRtbEVuY29kZShn KX0sY2FuR3JvdXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmFibGVHcm91cGlu ZyYmISF0aGlzLmdldEdyb3VwRmllbGQoKX0sZ2V0UHJlZml4OmZ1bmN0aW9uKGEp e3JldHVybiB0aGlzLmdyaWQuZ2V0R3JpZEVsKCkuaWQrIi1ncC0iK2ErIi0ifSxk b0dyb3VwU3RhcnQ6ZnVuY3Rpb24oYSxkLGIsZSxjKXthW2EubGVuZ3RoXT10aGlz LnN0YXJ0R3JvdXAuYXBwbHkoZCl9LGRvR3JvdXBFbmQ6ZnVuY3Rpb24oYSxkLGIs ZSxjKXthW2EubGVuZ3RoXT10aGlzLmVuZEdyb3VwfSxnZXRSb3dzOmZ1bmN0aW9u KCl7aWYoIXRoaXMuY2FuR3JvdXAoKSl7cmV0dXJuIEV4dC5ncmlkLkdyb3VwaW5n Vmlldy5zdXBlcmNsYXNzLmdldFJvd3MuY2FsbCh0aGlzKX12YXIgaz1bXSxjPXRo aXMuZ2V0R3JvdXBzKCksaCxlPTAsYT1jLmxlbmd0aCxkLGI7Zm9yKDtlPGE7Kytl KXtoPWNbZV0uY2hpbGROb2Rlc1sxXTtpZihoKXtoPWguY2hpbGROb2Rlcztmb3Io ZD0wLGI9aC5sZW5ndGg7ZDxiOysrZCl7a1trLmxlbmd0aF09aFtkXX19fXJldHVy biBrfSx1cGRhdGVHcm91cFdpZHRoczpmdW5jdGlvbigpe2lmKCF0aGlzLmNhbkdy b3VwKCl8fCF0aGlzLmhhc1Jvd3MoKSl7cmV0dXJufXZhciBjPU1hdGgubWF4KHRo aXMuY20uZ2V0VG90YWxXaWR0aCgpLHRoaXMuZWwuZG9tLm9mZnNldFdpZHRoLXRo aXMuZ2V0U2Nyb2xsT2Zmc2V0KCkpKyJweCI7dmFyIGI9dGhpcy5nZXRHcm91cHMo KTtmb3IodmFyIGQ9MCxhPWIubGVuZ3RoO2Q8YTtkKyspe2JbZF0uZmlyc3RDaGls ZC5zdHlsZS53aWR0aD1jfX0sb25Db2x1bW5XaWR0aFVwZGF0ZWQ6ZnVuY3Rpb24o YyxhLGIpe0V4dC5ncmlkLkdyb3VwaW5nVmlldy5zdXBlcmNsYXNzLm9uQ29sdW1u V2lkdGhVcGRhdGVkLmNhbGwodGhpcyxjLGEsYik7dGhpcy51cGRhdGVHcm91cFdp ZHRocygpfSxvbkFsbENvbHVtbldpZHRoc1VwZGF0ZWQ6ZnVuY3Rpb24oYSxiKXtF eHQuZ3JpZC5Hcm91cGluZ1ZpZXcuc3VwZXJjbGFzcy5vbkFsbENvbHVtbldpZHRo c1VwZGF0ZWQuY2FsbCh0aGlzLGEsYik7dGhpcy51cGRhdGVHcm91cFdpZHRocygp fSxvbkNvbHVtbkhpZGRlblVwZGF0ZWQ6ZnVuY3Rpb24oYixjLGEpe0V4dC5ncmlk Lkdyb3VwaW5nVmlldy5zdXBlcmNsYXNzLm9uQ29sdW1uSGlkZGVuVXBkYXRlZC5j YWxsKHRoaXMsYixjLGEpO3RoaXMudXBkYXRlR3JvdXBXaWR0aHMoKX0sb25MYXlv dXQ6ZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZUdyb3VwV2lkdGhzKCl9LG9uQmVmb3Jl Um93U2VsZWN0OmZ1bmN0aW9uKGIsYSl7dGhpcy50b2dnbGVSb3dJbmRleChhLHRy dWUpfX0pO0V4dC5ncmlkLkdyb3VwaW5nVmlldy5HUk9VUF9JRD0xMDAwOw== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/default/form/text-bg.gif Content-Transfer-Encoding: Base64 R0lGODlhAQASAIcAAN7j5vDz8/P19fX39/f5+fn7+/z8/f3+/v///wAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACH5BAAAAP8ALAAAAAABABIAAAgQAAEEEDCAQAEDBxAoXMgw IAA7 ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/default/grid/grid-split.gif Content-Transfer-Encoding: Base64 R0lGODlhAgANAIcAAKyomf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACH5BAAAAP8ALAAAAAACAA0AAAgOAAEEEEhwoMGCCA8GCAgA Ow== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/default/slider/slider-bg.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAcAAABCCAMAAACsGTw+AAAALHRFWHRDcmVhdGlv biBUaW1lAFRodSAyNyBNYXIgMjAwOCAwMzo0MDoxNyAtMDUwMLm0WfoAAAAHdElN RQfYBBoWIzvvlGReAAAACXBIWXMAAA7CAAAOwgEVKEqAAAAABGdBTUEAALGPC/xh BQAAACRQTFRF////vLu4xM3Rs6+pw7+53drX0M3HzMfBqqShw8TBzMjBvLu5ACxD 7wAAAAF0Uk5TAEDm2GYAAABGSURBVHjazZC5DcAwEMPkyIm//fcNEOK8wLkIGwFq REhK0kEX6Iad0RfIzuVZ+Fbj5YlnZPT6ie9nO8SPrvzaTD7e/SHdFwQ4AeewCIHL AAAAAElFTkSuQmCC ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/default/slider/slider-v-bg.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAEIAAAAHCAMAAACLH2sFAAAALHRFWHRDcmVhdGlv biBUaW1lAFRodSAyNyBNYXIgMjAwOCAwMzo0MDoxNyAtMDUwMLm0WfoAAAAHdElN RQfYBBoWJAgfBZOPAAAACXBIWXMAAA7CAAAOwgEVKEqAAAAABGdBTUEAALGPC/xh BQAAACRQTFRF////qqShxM3R3drXvLu4w7+5s6+pvLu5zMjBw8TBzMfB0M3HAgaZ wgAAAAF0Uk5TAEDm2GYAAAA6SURBVHjaY2CAAkYmZmYmFgY0gF2UgZWNjRVDkCQj ONm4uNlYKDICh9sGsxHsbBwcbJQZgT3sUdUCAGGeAYGTRrHZAAAAAElFTkSuQmCC ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=ext-all.css Content-Type: text/css; charset=utf-8; name=ext-all.css Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/css/ext-all.css Content-Transfer-Encoding: 8bit /*! * Ext JS Library 3.4.0 * Copyright(c) 2006-2011 Sencha Inc. * licensing@sencha.com * http://www.sencha.com/license */ html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;}img,body,html{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;}q:before,q:after{content:'';} .ext-forced-border-box, .ext-forced-border-box * { -moz-box-sizing: border-box; -ms-box-sizing: border-box; -webkit-box-sizing: border-box; } .ext-el-mask { z-index: 100; position: absolute; top:0; left:0; -moz-opacity: 0.5; opacity: .50; filter: alpha(opacity=50); width: 100%; height: 100%; zoom: 1; } .ext-el-mask-msg { z-index: 20001; position: absolute; top: 0; left: 0; border:1px solid; background:repeat-x 0 -16px; padding:2px; } .ext-el-mask-msg div { padding:5px 10px 5px 10px; border:1px solid; cursor:wait; } .ext-shim { position:absolute; visibility:hidden; left:0; top:0; overflow:hidden; } .ext-ie .ext-shim { filter: alpha(opacity=0); } .ext-ie6 .ext-shim { margin-left: 5px; margin-top: 3px; } .x-mask-loading div { padding:5px 10px 5px 25px; background:no-repeat 5px 5px; line-height:16px; } /* class for hiding elements without using display:none */ .x-hidden, .x-hide-offsets { position:absolute !important; left:-10000px; top:-10000px; visibility:hidden; } .x-hide-display { display:none !important; } .x-hide-nosize, .x-hide-nosize * /* Emulate display:none for children */ { height:0px!important; width:0px!important; visibility:hidden!important; border:none!important; zoom:1; } .x-hide-visibility { visibility:hidden !important; } .x-masked { overflow: hidden !important; } .x-masked-relative { position: relative !important; } .x-masked select, .x-masked object, .x-masked embed { visibility: hidden; } .x-layer { visibility: hidden; } .x-unselectable, .x-unselectable * { -moz-user-select: none; -khtml-user-select: none; -webkit-user-select:ignore; } .x-repaint { zoom: 1; background-color: transparent; -moz-outline: none; outline: none; } .x-item-disabled { cursor: default; opacity: .6; -moz-opacity: .6; filter: alpha(opacity=60); } .x-item-disabled * { cursor: default !important; } .x-form-radio-group .x-item-disabled { filter: none; } .x-splitbar-proxy { position: absolute; visibility: hidden; z-index: 20001; zoom: 1; line-height: 1px; font-size: 1px; overflow: hidden; } .x-splitbar-h, .x-splitbar-proxy-h { cursor: e-resize; cursor: col-resize; } .x-splitbar-v, .x-splitbar-proxy-v { cursor: s-resize; cursor: row-resize; } .x-color-palette { width: 150px; height: 92px; cursor: pointer; } .x-color-palette a { border: 1px solid; float: left; padding: 2px; text-decoration: none; -moz-outline: 0 none; outline: 0 none; cursor: pointer; } .x-color-palette a:hover, .x-color-palette a.x-color-palette-sel { border: 1px solid; } .x-color-palette em { display: block; border: 1px solid; } .x-color-palette em span { cursor: pointer; display: block; height: 10px; line-height: 10px; width: 10px; } .x-ie-shadow { display: none; position: absolute; overflow: hidden; left:0; top:0; zoom:1; } .x-shadow { display: none; position: absolute; overflow: hidden; left:0; top:0; } .x-shadow * { overflow: hidden; } .x-shadow * { padding: 0; border: 0; margin: 0; clear: none; zoom: 1; } /* top bottom */ .x-shadow .xstc, .x-shadow .xsbc { height: 6px; float: left; } /* corners */ .x-shadow .xstl, .x-shadow .xstr, .x-shadow .xsbl, .x-shadow .xsbr { width: 6px; height: 6px; float: left; } /* sides */ .x-shadow .xsc { width: 100%; } .x-shadow .xsml, .x-shadow .xsmr { width: 6px; float: left; height: 100%; } .x-shadow .xsmc { float: left; height: 100%; background-color: transparent; } .x-shadow .xst, .x-shadow .xsb { height: 6px; overflow: hidden; width: 100%; } .x-shadow .xsml { background: transparent repeat-y 0 0; } .x-shadow .xsmr { background: transparent repeat-y -6px 0; } .x-shadow .xstl { background: transparent no-repeat 0 0; } .x-shadow .xstc { background: transparent repeat-x 0 -30px; } .x-shadow .xstr { background: transparent repeat-x 0 -18px; } .x-shadow .xsbl { background: transparent no-repeat 0 -12px; } .x-shadow .xsbc { background: transparent repeat-x 0 -36px; } .x-shadow .xsbr { background: transparent repeat-x 0 -6px; } .loading-indicator { background: no-repeat left; padding-left: 20px; line-height: 16px; margin: 3px; } .x-text-resize { position: absolute; left: -1000px; top: -1000px; visibility: hidden; zoom: 1; } .x-drag-overlay { width: 100%; height: 100%; display: none; position: absolute; left: 0; top: 0; background-image:url(../images/default/s.gif); z-index: 20000; } .x-clear { clear:both; height:0; overflow:hidden; line-height:0; font-size:0; } .x-spotlight { z-index: 8999; position: absolute; top:0; left:0; -moz-opacity: 0.5; opacity: .50; filter: alpha(opacity=50); width:0; height:0; zoom: 1; } #x-history-frame { position:absolute; top:-1px; left:0; width:1px; height:1px; visibility:hidden; } #x-history-field { position:absolute; top:0; left:-1px; width:1px; height:1px; visibility:hidden; } .x-resizable-handle { position:absolute; z-index:100; /* ie needs these */ font-size:1px; line-height:6px; overflow:hidden; filter:alpha(opacity=0); opacity:0; zoom:1; } .x-resizable-handle-east{ width:6px; cursor:e-resize; right:0; top:0; height:100%; } .ext-ie .x-resizable-handle-east { margin-right:-1px; /*IE rounding error*/ } .x-resizable-handle-south{ width:100%; cursor:s-resize; left:0; bottom:0; height:6px; } .ext-ie .x-resizable-handle-south { margin-bottom:-1px; /*IE rounding error*/ } .x-resizable-handle-west{ width:6px; cursor:w-resize; left:0; top:0; height:100%; } .x-resizable-handle-north{ width:100%; cursor:n-resize; left:0; top:0; height:6px; } .x-resizable-handle-southeast{ width:6px; cursor:se-resize; right:0; bottom:0; height:6px; z-index:101; } .x-resizable-handle-northwest{ width:6px; cursor:nw-resize; left:0; top:0; height:6px; z-index:101; } .x-resizable-handle-northeast{ width:6px; cursor:ne-resize; right:0; top:0; height:6px; z-index:101; } .x-resizable-handle-southwest{ width:6px; cursor:sw-resize; left:0; bottom:0; height:6px; z-index:101; } .x-resizable-over .x-resizable-handle, .x-resizable-pinned .x-resizable-handle{ filter:alpha(opacity=100); opacity:1; } .x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east, .x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west { background-position: left; } .x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south, .x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north { background-position: top; } .x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ background-position: top left; } .x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ background-position:bottom right; } .x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ background-position: bottom left; } .x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ background-position: top right; } .x-resizable-proxy{ border: 1px dashed; position:absolute; overflow:hidden; display:none; left:0; top:0; z-index:50000; } .x-resizable-overlay{ width:100%; height:100%; display:none; position:absolute; left:0; top:0; z-index:200000; -moz-opacity: 0; opacity:0; filter: alpha(opacity=0); } .x-tab-panel { overflow:hidden; } .x-tab-panel-header, .x-tab-panel-footer { border: 1px solid; overflow:hidden; zoom:1; } .x-tab-panel-header { border: 1px solid; padding-bottom: 2px; } .x-tab-panel-footer { border: 1px solid; padding-top: 2px; } .x-tab-strip-wrap { width:100%; overflow:hidden; position:relative; zoom:1; } ul.x-tab-strip { display:block; width:5000px; zoom:1; } ul.x-tab-strip-top{ padding-top: 1px; background: repeat-x bottom; border-bottom: 1px solid; } ul.x-tab-strip-bottom{ padding-bottom: 1px; background: repeat-x top; border-top: 1px solid; border-bottom: 0 none; } .x-tab-panel-header-plain .x-tab-strip-top { background:transparent !important; padding-top:0 !important; } .x-tab-panel-header-plain { background:transparent !important; border-width:0 !important; padding-bottom:0 !important; } .x-tab-panel-header-plain .x-tab-strip-spacer, .x-tab-panel-footer-plain .x-tab-strip-spacer { border:1px solid; height:2px; font-size:1px; line-height:1px; } .x-tab-panel-header-plain .x-tab-strip-spacer { border-top: 0 none; } .x-tab-panel-footer-plain .x-tab-strip-spacer { border-bottom: 0 none; } .x-tab-panel-footer-plain .x-tab-strip-bottom { background:transparent !important; padding-bottom:0 !important; } .x-tab-panel-footer-plain { background:transparent !important; border-width:0 !important; padding-top:0 !important; } .ext-border-box .x-tab-panel-header-plain .x-tab-strip-spacer, .ext-border-box .x-tab-panel-footer-plain .x-tab-strip-spacer { height:3px; } ul.x-tab-strip li { float:left; margin-left:2px; } ul.x-tab-strip li.x-tab-edge { float:left; margin:0 !important; padding:0 !important; border:0 none !important; font-size:1px !important; line-height:1px !important; overflow:hidden; zoom:1; background:transparent !important; width:1px; } .x-tab-strip a, .x-tab-strip span, .x-tab-strip em { display:block; } .x-tab-strip a { text-decoration:none !important; -moz-outline: none; outline: none; cursor:pointer; } .x-tab-strip-inner { overflow:hidden; text-overflow: ellipsis; } .x-tab-strip span.x-tab-strip-text { white-space: nowrap; cursor:pointer; padding:4px 0; } .x-tab-strip-top .x-tab-with-icon .x-tab-right { padding-left:6px; } .x-tab-strip .x-tab-with-icon span.x-tab-strip-text { padding-left:20px; background-position: 0 3px; background-repeat: no-repeat; } .x-tab-strip-active, .x-tab-strip-active a.x-tab-right { cursor:default; } .x-tab-strip-active span.x-tab-strip-text { cursor:default; } .x-tab-strip-disabled .x-tabs-text { cursor:default; } .x-tab-panel-body { overflow:hidden; } .x-tab-panel-bwrap { overflow:hidden; } .ext-ie .x-tab-strip .x-tab-right { position:relative; } .x-tab-strip-top .x-tab-strip-active .x-tab-right { margin-bottom:-1px; } /* * Horrible hack for IE8 in quirks mode */ .ext-ie8 .x-tab-strip li { position: relative; } .ext-border-box .ext-ie8 .x-tab-strip-top .x-tab-right { top: 1px; } .ext-ie8 .x-tab-strip-top { padding-top: 1; } .ext-border-box .ext-ie8 .x-tab-strip-top { padding-top: 0; } .ext-ie8 .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { top:3px; } .ext-border-box .ext-ie8 .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { top:4px; } .ext-ie8 .x-tab-strip-bottom .x-tab-right{ top:0; } .x-tab-strip-top .x-tab-strip-active .x-tab-right span.x-tab-strip-text { padding-bottom:5px; } .x-tab-strip-bottom .x-tab-strip-active .x-tab-right { margin-top:-1px; } .x-tab-strip-bottom .x-tab-strip-active .x-tab-right span.x-tab-strip-text { padding-top:5px; } .x-tab-strip-top .x-tab-right { background: transparent no-repeat 0 -51px; padding-left:10px; } .x-tab-strip-top .x-tab-left { background: transparent no-repeat right -351px; padding-right:10px; } .x-tab-strip-top .x-tab-strip-inner { background: transparent repeat-x 0 -201px; } .x-tab-strip-top .x-tab-strip-over .x-tab-right { background-position:0 -101px; } .x-tab-strip-top .x-tab-strip-over .x-tab-left { background-position:right -401px; } .x-tab-strip-top .x-tab-strip-over .x-tab-strip-inner { background-position:0 -251px; } .x-tab-strip-top .x-tab-strip-active .x-tab-right { background-position: 0 0; } .x-tab-strip-top .x-tab-strip-active .x-tab-left { background-position: right -301px; } .x-tab-strip-top .x-tab-strip-active .x-tab-strip-inner { background-position: 0 -151px; } .x-tab-strip-bottom .x-tab-right { background: no-repeat bottom right; } .x-tab-strip-bottom .x-tab-left { background: no-repeat bottom left; } .x-tab-strip-bottom .x-tab-strip-active .x-tab-right { background: no-repeat bottom right; } .x-tab-strip-bottom .x-tab-strip-active .x-tab-left { background: no-repeat bottom left; } .x-tab-strip-bottom .x-tab-left { margin-right: 3px; padding:0 10px; } .x-tab-strip-bottom .x-tab-right { padding:0; } .x-tab-strip .x-tab-strip-close { display:none; } .x-tab-strip-closable { position:relative; } .x-tab-strip-closable .x-tab-left { padding-right:19px; } .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { opacity:.6; -moz-opacity:.6; background-repeat:no-repeat; display:block; width:11px; height:11px; position:absolute; top:3px; right:3px; cursor:pointer; z-index:2; } .x-tab-strip .x-tab-strip-active a.x-tab-strip-close { opacity:.8; -moz-opacity:.8; } .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{ opacity:1; -moz-opacity:1; } .x-tab-panel-body { border: 1px solid; } .x-tab-panel-body-top { border-top: 0 none; } .x-tab-panel-body-bottom { border-bottom: 0 none; } .x-tab-scroller-left { background: transparent no-repeat -18px 0; border-bottom: 1px solid; width:18px; position:absolute; left:0; top:0; z-index:10; cursor:pointer; } .x-tab-scroller-left-over { background-position: 0 0; } .x-tab-scroller-left-disabled { background-position: -18px 0; opacity:.5; -moz-opacity:.5; filter:alpha(opacity=50); cursor:default; } .x-tab-scroller-right { background: transparent no-repeat 0 0; border-bottom: 1px solid; width:18px; position:absolute; right:0; top:0; z-index:10; cursor:pointer; } .x-tab-scroller-right-over { background-position: -18px 0; } .x-tab-scroller-right-disabled { background-position: 0 0; opacity:.5; -moz-opacity:.5; filter:alpha(opacity=50); cursor:default; } .x-tab-scrolling-bottom .x-tab-scroller-left, .x-tab-scrolling-bottom .x-tab-scroller-right{ margin-top: 1px; } .x-tab-scrolling .x-tab-strip-wrap { margin-left:18px; margin-right:18px; } .x-tab-scrolling { position:relative; } .x-tab-panel-bbar .x-toolbar { border:1px solid; border-top:0 none; overflow:hidden; padding:2px; } .x-tab-panel-tbar .x-toolbar { border:1px solid; border-top:0 none; overflow:hidden; padding:2px; }/* all fields */ .x-form-field{ margin: 0 0 0 0; } .ext-webkit *:focus{ outline: none !important; } /* ---- text fields ---- */ .x-form-text, textarea.x-form-field{ padding:1px 3px; background:repeat-x 0 0; border:1px solid; } textarea.x-form-field { padding:2px 3px; } .x-form-text, .ext-ie .x-form-file { height:22px; line-height:18px; vertical-align:middle; } .ext-ie6 .x-form-text, .ext-ie7 .x-form-text { margin:-1px 0; /* ie bogus margin bug */ height:22px; /* ie quirks */ line-height:18px; } .x-quirks .ext-ie9 .x-form-text { height: 22px; padding-top: 3px; padding-bottom: 0px; } /* Ugly hacks for the bogus 1px margin bug in IE9 quirks */ .x-quirks .ext-ie9 .x-input-wrapper .x-form-text, .x-quirks .ext-ie9 .x-form-field-trigger-wrap .x-form-text { margin-top: -1px; margin-bottom: -1px; } .x-quirks .ext-ie9 .x-input-wrapper .x-form-element { margin-bottom: -1px; } .ext-ie6 .x-form-field-wrap .x-form-file-btn, .ext-ie7 .x-form-field-wrap .x-form-file-btn { top: -1px; /* because of all these margin hacks, these buttons are off by one pixel in IE6,7 */ } .ext-ie6 textarea.x-form-field, .ext-ie7 textarea.x-form-field { margin:-1px 0; /* ie bogus margin bug */ } .ext-strict .x-form-text { height:18px; } .ext-safari.ext-mac textarea.x-form-field { margin-bottom:-2px; /* another bogus margin bug, safari/mac only */ } /* .ext-strict .ext-ie8 .x-form-text, .ext-strict .ext-ie8 textarea.x-form-field { margin-bottom: 1px; } */ .ext-gecko .x-form-text , .ext-ie8 .x-form-text { padding-top:2px; /* FF won't center the text vertically */ padding-bottom:0; } .ext-ie6 .x-form-composite .x-form-text.x-box-item, .ext-ie7 .x-form-composite .x-form-text.x-box-item { margin: 0 !important; /* clear ie bogus margin bug fix */ } textarea { resize: none; /* Disable browser resizable textarea */ } /* select boxes */ .x-form-select-one { height:20px; line-height:18px; vertical-align:middle; border: 1px solid; } /* multi select boxes */ /* --- TODO --- */ /* 2.0.2 style */ .x-form-check-wrap { line-height:18px; height: auto; } .ext-ie .x-form-check-wrap input { width:15px; height:15px; } .x-form-check-wrap input{ vertical-align: bottom; } .x-editor .x-form-check-wrap { padding:3px; } .x-editor .x-form-checkbox { height:13px; } .x-form-check-group-label { border-bottom: 1px solid; margin-bottom: 5px; padding-left: 3px !important; float: none !important; } /* wrapped fields and triggers */ .x-form-field-wrap .x-form-trigger{ width:17px; height:21px; border:0; background:transparent no-repeat 0 0; cursor:pointer; border-bottom: 1px solid; position:absolute; top:0; } .x-form-field-wrap .x-form-date-trigger, .x-form-field-wrap .x-form-clear-trigger, .x-form-field-wrap .x-form-search-trigger{ cursor:pointer; } .x-form-field-wrap .x-form-twin-triggers .x-form-trigger{ position:static; top:auto; vertical-align:top; } .x-form-field-wrap { position:relative; left:0;top:0; text-align: left; zoom:1; white-space: nowrap; } .ext-strict .ext-ie8 .x-toolbar-cell .x-form-field-trigger-wrap .x-form-trigger { right: 0; /* IE8 Strict mode trigger bug */ } .x-form-field-wrap .x-form-trigger-over{ background-position:-17px 0; } .x-form-field-wrap .x-form-trigger-click{ background-position:-34px 0; } .x-trigger-wrap-focus .x-form-trigger{ background-position:-51px 0; } .x-trigger-wrap-focus .x-form-trigger-over{ background-position:-68px 0; } .x-trigger-wrap-focus .x-form-trigger-click{ background-position:-85px 0; } .x-trigger-wrap-focus .x-form-trigger{ border-bottom: 1px solid; } .x-item-disabled .x-form-trigger-over{ background-position:0 0 !important; border-bottom: 1px solid; } .x-item-disabled .x-form-trigger-click{ background-position:0 0 !important; border-bottom: 1px solid; } .x-trigger-noedit{ cursor:pointer; } /* field focus style */ .x-form-focus, textarea.x-form-focus{ border: 1px solid; } /* invalid fields */ .x-form-invalid, textarea.x-form-invalid{ background:repeat-x bottom; border: 1px solid; } .x-form-inner-invalid, textarea.x-form-inner-invalid{ background:repeat-x bottom; } /* editors */ .x-editor { visibility:hidden; padding:0; margin:0; } .x-form-grow-sizer { left: -10000px; padding: 8px 3px; position: absolute; visibility:hidden; top: -10000px; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word; zoom:1; } .x-form-grow-sizer p { margin:0 !important; border:0 none !important; padding:0 !important; } /* Form Items CSS */ .x-form-item { display:block; margin-bottom:4px; zoom:1; } .x-form-item label.x-form-item-label { display:block; float:left; width:100px; padding:3px; padding-left:0; clear:left; z-index:2; position:relative; } .x-form-element { padding-left:105px; position:relative; } .x-form-invalid-msg { padding:2px; padding-left:18px; background: transparent no-repeat 0 2px; line-height:16px; width:200px; } .x-form-label-left label.x-form-item-label { text-align:left; } .x-form-label-right label.x-form-item-label { text-align:right; } .x-form-label-top .x-form-item label.x-form-item-label { width:auto; float:none; clear:none; display:inline; margin-bottom:4px; position:static; } .x-form-label-top .x-form-element { padding-left:0; padding-top:4px; } .x-form-label-top .x-form-item { padding-bottom:4px; } /* Editor small font for grid, toolbar and tree */ .x-small-editor .x-form-text { height:20px; line-height:16px; vertical-align:middle; } .ext-ie6 .x-small-editor .x-form-text, .ext-ie7 .x-small-editor .x-form-text { margin-top:-1px !important; /* ie bogus margin bug */ margin-bottom:-1px !important; height:20px !important; /* ie quirks */ line-height:16px !important; } .ext-strict .x-small-editor .x-form-text { height:16px !important; } .ext-ie6 .x-small-editor .x-form-text, .ext-ie7 .x-small-editor .x-form-text { height:20px; line-height:16px; } .ext-border-box .x-small-editor .x-form-text { height:20px; } .x-small-editor .x-form-select-one { height:20px; line-height:16px; vertical-align:middle; } .x-small-editor .x-form-num-field { text-align:right; } .x-small-editor .x-form-field-wrap .x-form-trigger{ height:19px; } .ext-webkit .x-small-editor .x-form-text{padding-top:3px;font-size:100%;} .ext-strict .ext-webkit .x-small-editor .x-form-text{ height:14px !important; } .x-form-clear { clear:both; height:0; overflow:hidden; line-height:0; font-size:0; } .x-form-clear-left { clear:left; height:0; overflow:hidden; line-height:0; font-size:0; } .ext-ie6 .x-form-check-wrap input, .ext-border-box .x-form-check-wrap input{ margin-top: 3px; } .x-form-cb-label { position: relative; margin-left:4px; top: 2px; } .ext-ie .x-form-cb-label{ top: 1px; } .ext-ie6 .x-form-cb-label, .ext-border-box .x-form-cb-label{ top: 3px; } .x-form-display-field{ padding-top: 2px; } .ext-gecko .x-form-display-field, .ext-strict .ext-ie7 .x-form-display-field{ padding-top: 1px; } .ext-ie .x-form-display-field{ padding-top: 3px; } .ext-strict .ext-ie8 .x-form-display-field{ padding-top: 0; } .x-form-column { float:left; padding:0; margin:0; width:48%; overflow:hidden; zoom:1; } /* buttons */ .x-form .x-form-btns-ct .x-btn{ float:right; clear:none; } .x-form .x-form-btns-ct .x-form-btns td { border:0; padding:0; } .x-form .x-form-btns-ct .x-form-btns-right table{ float:right; clear:none; } .x-form .x-form-btns-ct .x-form-btns-left table{ float:left; clear:none; } .x-form .x-form-btns-ct .x-form-btns-center{ text-align:center; /*ie*/ } .x-form .x-form-btns-ct .x-form-btns-center table{ margin:0 auto; /*everyone else*/ } .x-form .x-form-btns-ct table td.x-form-btn-td{ padding:3px; } .x-form .x-form-btns-ct .x-btn-focus .x-btn-left{ background-position:0 -147px; } .x-form .x-form-btns-ct .x-btn-focus .x-btn-right{ background-position:0 -168px; } .x-form .x-form-btns-ct .x-btn-focus .x-btn-center{ background-position:0 -189px; } .x-form .x-form-btns-ct .x-btn-click .x-btn-center{ background-position:0 -126px; } .x-form .x-form-btns-ct .x-btn-click .x-btn-right{ background-position:0 -84px; } .x-form .x-form-btns-ct .x-btn-click .x-btn-left{ background-position:0 -63px; } .x-form-invalid-icon { width:16px; height:18px; visibility:hidden; position:absolute; left:0; top:0; display:block; background:transparent no-repeat 0 2px; } /* fieldsets */ .x-fieldset { border:1px solid; padding:10px; margin-bottom:10px; display:block; /* preserve margins in IE */ } /* make top of checkbox/tools visible in webkit */ .ext-webkit .x-fieldset-header { padding-top: 1px; } .ext-ie .x-fieldset legend { margin-bottom:10px; } .ext-strict .ext-ie9 .x-fieldset legend.x-fieldset-header { padding-top: 1px; } .ext-ie .x-fieldset { padding-top: 0; padding-bottom:10px; } .x-fieldset legend .x-tool-toggle { margin-right:3px; margin-left:0; float:left !important; } .x-fieldset legend input { margin-right:3px; float:left !important; height:13px; width:13px; } fieldset.x-panel-collapsed { padding-bottom:0 !important; border-width: 1px 1px 0 1px !important; border-left-color: transparent; border-right-color: transparent; } .ext-ie6 fieldset.x-panel-collapsed{ padding-bottom:0 !important; border-width: 1px 0 0 0 !important; margin-left: 1px; margin-right: 1px; } fieldset.x-panel-collapsed .x-fieldset-bwrap { visibility:hidden; position:absolute; left:-1000px; top:-1000px; } .ext-ie .x-fieldset-bwrap { zoom:1; } .x-fieldset-noborder { border:0px none transparent; } .x-fieldset-noborder legend { margin-left:-3px; } /* IE legend positioning bug */ .ext-ie .x-fieldset-noborder legend { position: relative; margin-bottom:23px; } .ext-ie .x-fieldset-noborder legend span { position: absolute; left:16px; } .ext-gecko .x-window-body .x-form-item { -moz-outline: none; outline: none; overflow: auto; } .ext-mac.ext-gecko .x-window-body .x-form-item { overflow:hidden; } .ext-gecko .x-form-item { -moz-outline: none; outline: none; } .x-hide-label label.x-form-item-label { display:none; } .x-hide-label .x-form-element { padding-left: 0 !important; } .x-form-label-top .x-hide-label label.x-form-item-label{ display: none; } .x-fieldset { overflow:hidden; } .x-fieldset-bwrap { overflow:hidden; zoom:1; } .x-fieldset-body { overflow:hidden; } .x-btn{ cursor:pointer; white-space: nowrap; } .x-btn button{ border:0 none; background-color:transparent; padding-left:3px; padding-right:3px; cursor:pointer; margin:0; overflow:visible; width:auto; -moz-outline:0 none; outline:0 none; } * html .ext-ie .x-btn button { width:1px; } .ext-gecko .x-btn button, .ext-webkit .x-btn button { padding-left:0; padding-right:0; } .ext-gecko .x-btn button::-moz-focus-inner { padding:0; } .ext-ie .x-btn button { padding-top:2px; } .x-btn td { padding:0 !important; } .x-btn-text { cursor:pointer; white-space: nowrap; padding:0; } /* icon placement and sizing styles */ /* Only text */ .x-btn-noicon .x-btn-small .x-btn-text{ height: 16px; } .x-btn-noicon .x-btn-medium .x-btn-text{ height: 24px; } .x-btn-noicon .x-btn-large .x-btn-text{ height: 32px; } /* Only icons */ .x-btn-icon .x-btn-text{ background-position: center; background-repeat: no-repeat; } .x-btn-icon .x-btn-small .x-btn-text{ height: 16px; width: 16px; } .x-btn-icon .x-btn-medium .x-btn-text{ height: 24px; width: 24px; } .x-btn-icon .x-btn-large .x-btn-text{ height: 32px; width: 32px; } /* Icons and text */ /* left */ .x-btn-text-icon .x-btn-icon-small-left .x-btn-text{ background-position: 0 center; background-repeat: no-repeat; padding-left:18px; height:16px; } .x-btn-text-icon .x-btn-icon-medium-left .x-btn-text{ background-position: 0 center; background-repeat: no-repeat; padding-left:26px; height:24px; } .x-btn-text-icon .x-btn-icon-large-left .x-btn-text{ background-position: 0 center; background-repeat: no-repeat; padding-left:34px; height:32px; } /* top */ .x-btn-text-icon .x-btn-icon-small-top .x-btn-text{ background-position: center 0; background-repeat: no-repeat; padding-top:18px; } .x-btn-text-icon .x-btn-icon-medium-top .x-btn-text{ background-position: center 0; background-repeat: no-repeat; padding-top:26px; } .x-btn-text-icon .x-btn-icon-large-top .x-btn-text{ background-position: center 0; background-repeat: no-repeat; padding-top:34px; } /* right */ .x-btn-text-icon .x-btn-icon-small-right .x-btn-text{ background-position: right center; background-repeat: no-repeat; padding-right:18px; height:16px; } .x-btn-text-icon .x-btn-icon-medium-right .x-btn-text{ background-position: right center; background-repeat: no-repeat; padding-right:26px; height:24px; } .x-btn-text-icon .x-btn-icon-large-right .x-btn-text{ background-position: right center; background-repeat: no-repeat; padding-right:34px; height:32px; } /* bottom */ .x-btn-text-icon .x-btn-icon-small-bottom .x-btn-text{ background-position: center bottom; background-repeat: no-repeat; padding-bottom:18px; } .x-btn-text-icon .x-btn-icon-medium-bottom .x-btn-text{ background-position: center bottom; background-repeat: no-repeat; padding-bottom:26px; } .x-btn-text-icon .x-btn-icon-large-bottom .x-btn-text{ background-position: center bottom; background-repeat: no-repeat; padding-bottom:34px; } /* background positioning */ .x-btn-tr i, .x-btn-tl i, .x-btn-mr i, .x-btn-ml i, .x-btn-br i, .x-btn-bl i{ font-size:1px; line-height:1px; width:3px; display:block; overflow:hidden; } .x-btn-tr i, .x-btn-tl i, .x-btn-br i, .x-btn-bl i{ height:3px; } .x-btn-tl{ width:3px; height:3px; background:no-repeat 0 0; } .x-btn-tr{ width:3px; height:3px; background:no-repeat -3px 0; } .x-btn-tc{ height:3px; background:repeat-x 0 -6px; } .x-btn-ml{ width:3px; background:no-repeat 0 -24px; } .x-btn-mr{ width:3px; background:no-repeat -3px -24px; } .x-btn-mc{ background:repeat-x 0 -1096px; vertical-align: middle; text-align:center; padding:0 5px; cursor:pointer; white-space:nowrap; } /* Fixes an issue with the button height */ .ext-strict .ext-ie6 .x-btn-mc, .ext-strict .ext-ie7 .x-btn-mc { height: 100%; } .x-btn-bl{ width:3px; height:3px; background:no-repeat 0 -3px; } .x-btn-br{ width:3px; height:3px; background:no-repeat -3px -3px; } .x-btn-bc{ height:3px; background:repeat-x 0 -15px; } .x-btn-over .x-btn-tl{ background-position: -6px 0; } .x-btn-over .x-btn-tr{ background-position: -9px 0; } .x-btn-over .x-btn-tc{ background-position: 0 -9px; } .x-btn-over .x-btn-ml{ background-position: -6px -24px; } .x-btn-over .x-btn-mr{ background-position: -9px -24px; } .x-btn-over .x-btn-mc{ background-position: 0 -2168px; } .x-btn-over .x-btn-bl{ background-position: -6px -3px; } .x-btn-over .x-btn-br{ background-position: -9px -3px; } .x-btn-over .x-btn-bc{ background-position: 0 -18px; } .x-btn-click .x-btn-tl, .x-btn-menu-active .x-btn-tl, .x-btn-pressed .x-btn-tl{ background-position: -12px 0; } .x-btn-click .x-btn-tr, .x-btn-menu-active .x-btn-tr, .x-btn-pressed .x-btn-tr{ background-position: -15px 0; } .x-btn-click .x-btn-tc, .x-btn-menu-active .x-btn-tc, .x-btn-pressed .x-btn-tc{ background-position: 0 -12px; } .x-btn-click .x-btn-ml, .x-btn-menu-active .x-btn-ml, .x-btn-pressed .x-btn-ml{ background-position: -12px -24px; } .x-btn-click .x-btn-mr, .x-btn-menu-active .x-btn-mr, .x-btn-pressed .x-btn-mr{ background-position: -15px -24px; } .x-btn-click .x-btn-mc, .x-btn-menu-active .x-btn-mc, .x-btn-pressed .x-btn-mc{ background-position: 0 -3240px; } .x-btn-click .x-btn-bl, .x-btn-menu-active .x-btn-bl, .x-btn-pressed .x-btn-bl{ background-position: -12px -3px; } .x-btn-click .x-btn-br, .x-btn-menu-active .x-btn-br, .x-btn-pressed .x-btn-br{ background-position: -15px -3px; } .x-btn-click .x-btn-bc, .x-btn-menu-active .x-btn-bc, .x-btn-pressed .x-btn-bc{ background-position: 0 -21px; } .x-btn-disabled *{ cursor:default !important; } /* With a menu arrow */ /* right */ .x-btn-mc em.x-btn-arrow { display:block; background:transparent no-repeat right center; padding-right:10px; } .x-btn-mc em.x-btn-split { display:block; background:transparent no-repeat right center; padding-right:14px; } /* bottom */ .x-btn-mc em.x-btn-arrow-bottom { display:block; background:transparent no-repeat center bottom; padding-bottom:14px; } .x-btn-mc em.x-btn-split-bottom { display:block; background:transparent no-repeat center bottom; padding-bottom:14px; } /* height adjustment class */ .x-btn-as-arrow .x-btn-mc em { display:block; background-color:transparent; padding-bottom:14px; } /* groups */ .x-btn-group { padding:1px; } .x-btn-group-header { padding:2px; text-align:center; } .x-btn-group-tc { background: transparent repeat-x 0 0; overflow:hidden; } .x-btn-group-tl { background: transparent no-repeat 0 0; padding-left:3px; zoom:1; } .x-btn-group-tr { background: transparent no-repeat right 0; zoom:1; padding-right:3px; } .x-btn-group-bc { background: transparent repeat-x 0 bottom; zoom:1; } .x-btn-group-bc .x-panel-footer { zoom:1; } .x-btn-group-bl { background: transparent no-repeat 0 bottom; padding-left:3px; zoom:1; } .x-btn-group-br { background: transparent no-repeat right bottom; padding-right:3px; zoom:1; } .x-btn-group-mc { border:0 none; padding:1px 0 0 0; margin:0; } .x-btn-group-mc .x-btn-group-body { background-color:transparent; border: 0 none; } .x-btn-group-ml { background: transparent repeat-y 0 0; padding-left:3px; zoom:1; } .x-btn-group-mr { background: transparent repeat-y right 0; padding-right:3px; zoom:1; } .x-btn-group-bc .x-btn-group-footer { padding-bottom:6px; } .x-panel-nofooter .x-btn-group-bc { height:3px; font-size:0; line-height:0; } .x-btn-group-bwrap { overflow:hidden; zoom:1; } .x-btn-group-body { overflow:hidden; zoom:1; } .x-btn-group-notitle .x-btn-group-tc { background: transparent repeat-x 0 0; overflow:hidden; height:2px; }.x-toolbar{ border-style:solid; border-width:0 0 1px 0; display: block; padding:2px; background:repeat-x top left; position:relative; left:0; top:0; zoom:1; overflow:hidden; } .x-toolbar-left { width: 100%; } .x-toolbar .x-item-disabled .x-btn-icon { opacity: .35; -moz-opacity: .35; filter: alpha(opacity=35); } .x-toolbar td { vertical-align:middle; } .x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{ white-space: nowrap; } .x-toolbar .x-item-disabled { cursor:default; opacity:.6; -moz-opacity:.6; filter:alpha(opacity=60); } .x-toolbar .x-item-disabled * { cursor:default; } .x-toolbar .x-toolbar-cell { vertical-align:middle; } .x-toolbar .x-btn-tl, .x-toolbar .x-btn-tr, .x-toolbar .x-btn-tc, .x-toolbar .x-btn-ml, .x-toolbar .x-btn-mr, .x-toolbar .x-btn-mc, .x-toolbar .x-btn-bl, .x-toolbar .x-btn-br, .x-toolbar .x-btn-bc { background-position: 500px 500px; } /* These rules are duplicated from button.css to give priority of x-toolbar rules above */ .x-toolbar .x-btn-over .x-btn-tl{ background-position: -6px 0; } .x-toolbar .x-btn-over .x-btn-tr{ background-position: -9px 0; } .x-toolbar .x-btn-over .x-btn-tc{ background-position: 0 -9px; } .x-toolbar .x-btn-over .x-btn-ml{ background-position: -6px -24px; } .x-toolbar .x-btn-over .x-btn-mr{ background-position: -9px -24px; } .x-toolbar .x-btn-over .x-btn-mc{ background-position: 0 -2168px; } .x-toolbar .x-btn-over .x-btn-bl{ background-position: -6px -3px; } .x-toolbar .x-btn-over .x-btn-br{ background-position: -9px -3px; } .x-toolbar .x-btn-over .x-btn-bc{ background-position: 0 -18px; } .x-toolbar .x-btn-click .x-btn-tl, .x-toolbar .x-btn-menu-active .x-btn-tl, .x-toolbar .x-btn-pressed .x-btn-tl{ background-position: -12px 0; } .x-toolbar .x-btn-click .x-btn-tr, .x-toolbar .x-btn-menu-active .x-btn-tr, .x-toolbar .x-btn-pressed .x-btn-tr{ background-position: -15px 0; } .x-toolbar .x-btn-click .x-btn-tc, .x-toolbar .x-btn-menu-active .x-btn-tc, .x-toolbar .x-btn-pressed .x-btn-tc{ background-position: 0 -12px; } .x-toolbar .x-btn-click .x-btn-ml, .x-toolbar .x-btn-menu-active .x-btn-ml, .x-toolbar .x-btn-pressed .x-btn-ml{ background-position: -12px -24px; } .x-toolbar .x-btn-click .x-btn-mr, .x-toolbar .x-btn-menu-active .x-btn-mr, .x-toolbar .x-btn-pressed .x-btn-mr{ background-position: -15px -24px; } .x-toolbar .x-btn-click .x-btn-mc, .x-toolbar .x-btn-menu-active .x-btn-mc, .x-toolbar .x-btn-pressed .x-btn-mc{ background-position: 0 -3240px; } .x-toolbar .x-btn-click .x-btn-bl, .x-toolbar .x-btn-menu-active .x-btn-bl, .x-toolbar .x-btn-pressed .x-btn-bl{ background-position: -12px -3px; } .x-toolbar .x-btn-click .x-btn-br, .x-toolbar .x-btn-menu-active .x-btn-br, .x-toolbar .x-btn-pressed .x-btn-br{ background-position: -15px -3px; } .x-toolbar .x-btn-click .x-btn-bc, .x-toolbar .x-btn-menu-active .x-btn-bc, .x-toolbar .x-btn-pressed .x-btn-bc{ background-position: 0 -21px; } .x-toolbar div.xtb-text{ padding:2px 2px 0; line-height:16px; display:block; } .x-toolbar .xtb-sep { background-position: center; background-repeat: no-repeat; display: block; font-size: 1px; height: 16px; width:4px; overflow: hidden; cursor:default; margin: 0 2px 0; border:0; } .x-toolbar .xtb-spacer { width:2px; } /* Paging Toolbar */ .x-tbar-page-number{ width:30px; height:14px; } .ext-ie .x-tbar-page-number{ margin-top: 2px; } .x-paging-info { position:absolute; top:5px; right: 8px; } /* floating */ .x-toolbar-ct { width:100%; } .x-toolbar-right td { text-align: center; } .x-panel-tbar, .x-panel-bbar, .x-window-tbar, .x-window-bbar, .x-tab-panel-tbar, .x-tab-panel-bbar, .x-plain-tbar, .x-plain-bbar { overflow:hidden; zoom:1; } .x-toolbar-more .x-btn-small .x-btn-text{ height: 16px; width: 12px; } .x-toolbar-more em.x-btn-arrow { display:inline; background-color:transparent; padding-right:0; } .x-toolbar-more .x-btn-mc em.x-btn-arrow { background-image: none; } div.x-toolbar-no-items { color:gray !important; padding:5px 10px !important; } /* fix ie toolbar form items */ .ext-border-box .x-toolbar-cell .x-form-text { margin-bottom:-1px !important; } .ext-border-box .x-toolbar-cell .x-form-field-wrap .x-form-text { margin:0 !important; } .ext-ie .x-toolbar-cell .x-form-field-wrap { height:21px; } .ext-ie .x-toolbar-cell .x-form-text { position:relative; top:-1px; } .ext-strict .ext-ie8 .x-toolbar-cell .x-form-field-trigger-wrap .x-form-text, .ext-strict .ext-ie .x-toolbar-cell .x-form-text { top: 0px; } .x-toolbar-right td .x-form-field-trigger-wrap{ text-align: left; } .x-toolbar-cell .x-form-checkbox, .x-toolbar-cell .x-form-radio{ margin-top: 5px; } .x-toolbar-cell .x-form-cb-label{ vertical-align: bottom; top: 1px; } .ext-ie .x-toolbar-cell .x-form-checkbox, .ext-ie .x-toolbar-cell .x-form-radio{ margin-top: 4px; } .ext-ie .x-toolbar-cell .x-form-cb-label{ top: 0; } /* Grid3 styles */ .x-grid3 { position:relative; overflow:hidden; } .x-grid-panel .x-panel-body { overflow:hidden !important; } .x-grid-panel .x-panel-mc .x-panel-body { border:1px solid; } .x-grid3 table { table-layout:fixed; } .x-grid3-viewport{ overflow:hidden; } .x-grid3-hd-row td, .x-grid3-row td, .x-grid3-summary-row td{ -moz-outline: none; outline: none; -moz-user-focus: normal; } .x-grid3-row td, .x-grid3-summary-row td { line-height:13px; vertical-align: top; padding-left:1px; padding-right:1px; -moz-user-select: none; -khtml-user-select:none; -webkit-user-select:ignore; } .x-grid3-cell{ -moz-user-select: none; -khtml-user-select:none; -webkit-user-select:ignore; } .x-grid3-hd-row td { line-height:15px; vertical-align:middle; border-left:1px solid; border-right:1px solid; } .x-grid3-hd-row .x-grid3-marker-hd { padding:3px; } .x-grid3-row .x-grid3-marker { padding:3px; } .x-grid3-cell-inner, .x-grid3-hd-inner{ overflow:hidden; -o-text-overflow: ellipsis; text-overflow: ellipsis; padding:3px 3px 3px 5px; white-space: nowrap; } /* ActionColumn, reduce padding to accommodate 16x16 icons in normal row height */ .x-action-col-cell .x-grid3-cell-inner { padding-top: 1px; padding-bottom: 1px; } .x-action-col-icon { cursor: pointer; } .x-grid3-hd-inner { position:relative; cursor:inherit; padding:4px 3px 4px 5px; } .x-grid3-row-body { white-space:normal; } .x-grid3-body-cell { -moz-outline:0 none; outline:0 none; } /* IE Quirks to clip */ .ext-ie .x-grid3-cell-inner, .ext-ie .x-grid3-hd-inner{ width:100%; } /* reverse above in strict mode */ .ext-strict .x-grid3-cell-inner, .ext-strict .x-grid3-hd-inner{ width:auto; } .x-grid-row-loading { background: no-repeat center center; } .x-grid-page { overflow:hidden; } .x-grid3-row { cursor: default; border: 1px solid; width:100%; } .x-grid3-row-over { border:1px solid; background: repeat-x left top; } .x-grid3-resize-proxy { width:1px; left:0; cursor: e-resize; cursor: col-resize; position:absolute; top:0; height:100px; overflow:hidden; visibility:hidden; border:0 none; z-index:7; } .x-grid3-resize-marker { width:1px; left:0; position:absolute; top:0; height:100px; overflow:hidden; visibility:hidden; border:0 none; z-index:7; } .x-grid3-focus { position:absolute; left:0; top:0; width:1px; height:1px; line-height:1px; font-size:1px; -moz-outline:0 none; outline:0 none; -moz-user-select: text; -khtml-user-select: text; -webkit-user-select:ignore; } /* header styles */ .x-grid3-header{ background: repeat-x 0 bottom; cursor:default; zoom:1; padding:1px 0 0 0; } .x-grid3-header-pop { border-left:1px solid; float:right; clear:none; } .x-grid3-header-pop-inner { border-left:1px solid; width:14px; height:19px; background: transparent no-repeat center center; } .ext-ie .x-grid3-header-pop-inner { width:15px; } .ext-strict .x-grid3-header-pop-inner { width:14px; } .x-grid3-header-inner { overflow:hidden; zoom:1; float:left; } .x-grid3-header-offset { padding-left:1px; text-align: left; } td.x-grid3-hd-over, td.sort-desc, td.sort-asc, td.x-grid3-hd-menu-open { border-left:1px solid; border-right:1px solid; } td.x-grid3-hd-over .x-grid3-hd-inner, td.sort-desc .x-grid3-hd-inner, td.sort-asc .x-grid3-hd-inner, td.x-grid3-hd-menu-open .x-grid3-hd-inner { background: repeat-x left bottom; } .x-grid3-sort-icon{ background-repeat: no-repeat; display: none; height: 4px; width: 13px; margin-left:3px; vertical-align: middle; } .sort-asc .x-grid3-sort-icon, .sort-desc .x-grid3-sort-icon { display: inline; } /* Header position fixes for IE strict mode */ .ext-strict .ext-ie .x-grid3-header-inner, .ext-strict .ext-ie6 .x-grid3-hd { position:relative; } .ext-strict .ext-ie6 .x-grid3-hd-inner{ position:static; } /* Body Styles */ .x-grid3-body { zoom:1; } .x-grid3-scroller { overflow:auto; zoom:1; position:relative; } .x-grid3-cell-text, .x-grid3-hd-text { display: block; padding: 3px 5px 3px 5px; -moz-user-select: none; -khtml-user-select: none; -webkit-user-select:ignore; } .x-grid3-split { background-position: center; background-repeat: no-repeat; cursor: e-resize; cursor: col-resize; display: block; font-size: 1px; height: 16px; overflow: hidden; position: absolute; top: 2px; width: 6px; z-index: 3; } /* Column Reorder DD */ .x-dd-drag-proxy .x-grid3-hd-inner{ background: repeat-x left bottom; width:120px; padding:3px; border:1px solid; overflow:hidden; } .col-move-top, .col-move-bottom{ width:9px; height:9px; position:absolute; top:0; line-height:1px; font-size:1px; overflow:hidden; visibility:hidden; z-index:20000; background:transparent no-repeat left top; } /* Selection Styles */ .x-grid3-row-selected { border:1px dotted; } .x-grid3-locked td.x-grid3-row-marker, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker{ background: repeat-x 0 bottom !important; vertical-align:middle !important; padding:0; border-top:1px solid; border-bottom:none !important; border-right:1px solid !important; text-align:center; } .x-grid3-locked td.x-grid3-row-marker div, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div{ padding:0 4px; text-align:center; } /* dirty cells */ .x-grid3-dirty-cell { background: transparent no-repeat 0 0; } /* Grid Toolbars */ .x-grid3-topbar, .x-grid3-bottombar{ overflow:hidden; display:none; zoom:1; position:relative; } .x-grid3-topbar .x-toolbar{ border-right:0 none; } .x-grid3-bottombar .x-toolbar{ border-right:0 none; border-bottom:0 none; border-top:1px solid; } /* Props Grid Styles */ .x-props-grid .x-grid3-cell{ padding:1px; } .x-props-grid .x-grid3-td-name .x-grid3-cell-inner{ background:transparent repeat-y -16px !important; padding-left:12px; } .x-props-grid .x-grid3-body .x-grid3-td-name{ padding:1px; padding-right:0; border:0 none; border-right:1px solid; } /* dd */ .x-grid3-col-dd { border:0 none; padding:0; background-color:transparent; } .x-dd-drag-ghost .x-grid3-dd-wrap { padding:1px 3px 3px 1px; } .x-grid3-hd { -moz-user-select:none; -khtml-user-select:none; -webkit-user-select:ignore; } .x-grid3-hd-btn { display:none; position:absolute; width:14px; background:no-repeat left center; right:0; top:0; z-index:2; cursor:pointer; } .x-grid3-hd-over .x-grid3-hd-btn, .x-grid3-hd-menu-open .x-grid3-hd-btn { display:block; } a.x-grid3-hd-btn:hover { background-position:-14px center; } /* Expanders */ .x-grid3-body .x-grid3-td-expander { background:transparent repeat-y right; } .x-grid3-body .x-grid3-td-expander .x-grid3-cell-inner { padding:0 !important; height:100%; } .x-grid3-row-expander { width:100%; height:18px; background-position:4px 2px; background-repeat:no-repeat; background-color:transparent; } .x-grid3-row-collapsed .x-grid3-row-expander { background-position:4px 2px; } .x-grid3-row-expanded .x-grid3-row-expander { background-position:-21px 2px; } .x-grid3-row-collapsed .x-grid3-row-body { display:none !important; } .x-grid3-row-expanded .x-grid3-row-body { display:block !important; } /* Checkers */ .x-grid3-body .x-grid3-td-checker { background:transparent repeat-y right; } .x-grid3-body .x-grid3-td-checker .x-grid3-cell-inner, .x-grid3-header .x-grid3-td-checker .x-grid3-hd-inner { padding:0 !important; height:100%; } .x-grid3-row-checker, .x-grid3-hd-checker { width:100%; height:18px; background-position:2px 2px; background-repeat:no-repeat; background-color:transparent; } .x-grid3-row .x-grid3-row-checker { background-position:2px 2px; } .x-grid3-row-selected .x-grid3-row-checker, .x-grid3-hd-checker-on .x-grid3-hd-checker,.x-grid3-row-checked .x-grid3-row-checker { background-position:-23px 2px; } .x-grid3-hd-checker { background-position:2px 1px; } .ext-border-box .x-grid3-hd-checker { background-position:2px 3px; } .x-grid3-hd-checker-on .x-grid3-hd-checker { background-position:-23px 1px; } .ext-border-box .x-grid3-hd-checker-on .x-grid3-hd-checker { background-position:-23px 3px; } /* Numberer */ .x-grid3-body .x-grid3-td-numberer { background:transparent repeat-y right; } .x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner { padding:3px 5px 0 0 !important; text-align:right; } /* Row Icon */ .x-grid3-body .x-grid3-td-row-icon { background:transparent repeat-y right; vertical-align:top; text-align:center; } .x-grid3-body .x-grid3-td-row-icon .x-grid3-cell-inner { padding:0 !important; background-position:center center; background-repeat:no-repeat; width:16px; height:16px; margin-left:2px; margin-top:3px; } /* All specials */ .x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer, .x-grid3-body .x-grid3-row-selected .x-grid3-td-checker, .x-grid3-body .x-grid3-row-selected .x-grid3-td-expander { background:transparent repeat-y right; } .x-grid3-body .x-grid3-check-col-td .x-grid3-cell-inner { padding: 1px 0 0 0 !important; } .x-grid3-check-col { width:100%; height:16px; background-position:center center; background-repeat:no-repeat; background-color:transparent; } .x-grid3-check-col-on { width:100%; height:16px; background-position:center center; background-repeat:no-repeat; background-color:transparent; } /* Grouping classes */ .x-grid-group, .x-grid-group-body, .x-grid-group-hd { zoom:1; } .x-grid-group-hd { border-bottom: 2px solid; cursor:pointer; padding-top:6px; } .x-grid-group-hd div.x-grid-group-title { background:transparent no-repeat 3px 3px; padding:4px 4px 4px 17px; } .x-grid-group-collapsed .x-grid-group-body { display:none; } .ext-ie6 .x-grid3 .x-editor .x-form-text, .ext-ie7 .x-grid3 .x-editor .x-form-text { position:relative; top:-1px; } .ext-ie .x-props-grid .x-editor .x-form-text { position:static; top:0; } .x-grid-empty { padding:10px; } /* fix floating toolbar issue */ .ext-ie7 .x-grid-panel .x-panel-bbar { position:relative; } /* Reset position to static when Grid Panel has been framed */ /* to resolve 'snapping' from top to bottom behavior. */ /* @forumThread 86656 */ .ext-ie7 .x-grid-panel .x-panel-mc .x-panel-bbar { position: static; } .ext-ie6 .x-grid3-header { position: relative; } /* Fix WebKit bug in Grids */ .ext-webkit .x-grid-panel .x-panel-bwrap{ -webkit-user-select:none; } .ext-webkit .x-tbar-page-number{ -webkit-user-select:ignore; } /* end*/ /* column lines */ .x-grid-with-col-lines .x-grid3-row td.x-grid3-cell { padding-right:0; border-right:1px solid; } .x-pivotgrid .x-grid3-header-offset table { width: 100%; border-collapse: collapse; } .x-pivotgrid .x-grid3-header-offset table td { padding: 4px 3px 4px 5px; text-align: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 11px; line-height: 13px; font-family: tahoma; } .x-pivotgrid .x-grid3-row-headers { display: block; float: left; } .x-pivotgrid .x-grid3-row-headers table { height: 100%; width: 100%; border-collapse: collapse; } .x-pivotgrid .x-grid3-row-headers table td { height: 18px; padding: 2px 7px 0 0; text-align: right; text-overflow: ellipsis; font-size: 11px; font-family: tahoma; } .ext-gecko .x-pivotgrid .x-grid3-row-headers table td { height: 21px; } .x-grid3-header-title { top: 0%; left: 0%; position: absolute; text-align: center; vertical-align: middle; font-family: tahoma; font-size: 11px; padding: auto 1px; display: table-cell; } .x-grid3-header-title span { position: absolute; top: 50%; left: 0%; width: 100%; margin-top: -6px; }.x-dd-drag-proxy{ position:absolute; left:0; top:0; visibility:hidden; z-index:15000; } .x-dd-drag-ghost{ -moz-opacity: 0.85; opacity:.85; filter: alpha(opacity=85); border: 1px solid; padding:3px; padding-left:20px; white-space:nowrap; } .x-dd-drag-repair .x-dd-drag-ghost{ -moz-opacity: 0.4; opacity:.4; filter: alpha(opacity=40); border:0 none; padding:0; background-color:transparent; } .x-dd-drag-repair .x-dd-drop-icon{ visibility:hidden; } .x-dd-drop-icon{ position:absolute; top:3px; left:3px; display:block; width:16px; height:16px; background-color:transparent; background-position: center; background-repeat: no-repeat; z-index:1; } .x-view-selector { position:absolute; left:0; top:0; width:0; border:1px dotted; opacity: .5; -moz-opacity: .5; filter:alpha(opacity=50); zoom:1; }.ext-strict .ext-ie .x-tree .x-panel-bwrap{ position:relative; overflow:hidden; } .x-tree-icon, .x-tree-ec-icon, .x-tree-elbow-line, .x-tree-elbow, .x-tree-elbow-end, .x-tree-elbow-plus, .x-tree-elbow-minus, .x-tree-elbow-end-plus, .x-tree-elbow-end-minus{ border: 0 none; height: 18px; margin: 0; padding: 0; vertical-align: top; width: 16px; background-repeat: no-repeat; } .x-tree-node-collapsed .x-tree-node-icon, .x-tree-node-expanded .x-tree-node-icon, .x-tree-node-leaf .x-tree-node-icon{ border: 0 none; height: 18px; margin: 0; padding: 0; vertical-align: top; width: 16px; background-position:center; background-repeat: no-repeat; } .ext-ie .x-tree-node-indent img, .ext-ie .x-tree-node-icon, .ext-ie .x-tree-ec-icon { vertical-align: middle !important; } .ext-strict .ext-ie8 .x-tree-node-indent img, .ext-strict .ext-ie8 .x-tree-node-icon, .ext-strict .ext-ie8 .x-tree-ec-icon { vertical-align: top !important; } /* checkboxes */ input.x-tree-node-cb { margin-left:1px; height: 19px; vertical-align: bottom; } .ext-ie input.x-tree-node-cb { margin-left:0; margin-top: 1px; width: 16px; height: 16px; vertical-align: middle; } .ext-strict .ext-ie8 input.x-tree-node-cb{ margin: 1px 1px; height: 14px; vertical-align: bottom; } .ext-strict .ext-ie8 input.x-tree-node-cb + a{ vertical-align: bottom; } .ext-opera input.x-tree-node-cb { height: 14px; vertical-align: middle; } .x-tree-noicon .x-tree-node-icon{ width:0; height:0; } /* No line styles */ .x-tree-no-lines .x-tree-elbow{ background-color:transparent; } .x-tree-no-lines .x-tree-elbow-end{ background-color:transparent; } .x-tree-no-lines .x-tree-elbow-line{ background-color:transparent; } /* Arrows */ .x-tree-arrows .x-tree-elbow{ background-color:transparent; } .x-tree-arrows .x-tree-elbow-plus{ background:transparent no-repeat 0 0; } .x-tree-arrows .x-tree-elbow-minus{ background:transparent no-repeat -16px 0; } .x-tree-arrows .x-tree-elbow-end{ background-color:transparent; } .x-tree-arrows .x-tree-elbow-end-plus{ background:transparent no-repeat 0 0; } .x-tree-arrows .x-tree-elbow-end-minus{ background:transparent no-repeat -16px 0; } .x-tree-arrows .x-tree-elbow-line{ background-color:transparent; } .x-tree-arrows .x-tree-ec-over .x-tree-elbow-plus{ background-position:-32px 0; } .x-tree-arrows .x-tree-ec-over .x-tree-elbow-minus{ background-position:-48px 0; } .x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-plus{ background-position:-32px 0; } .x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-minus{ background-position:-48px 0; } .x-tree-elbow-plus, .x-tree-elbow-minus, .x-tree-elbow-end-plus, .x-tree-elbow-end-minus{ cursor:pointer; } .ext-ie ul.x-tree-node-ct{ font-size:0; line-height:0; zoom:1; } .x-tree-node{ white-space: nowrap; } .x-tree-node-el { line-height:18px; cursor:pointer; } .x-tree-node a, .x-dd-drag-ghost a{ text-decoration:none; -khtml-user-select:none; -moz-user-select:none; -webkit-user-select:ignore; -kthml-user-focus:normal; -moz-user-focus:normal; -moz-outline: 0 none; outline:0 none; } .x-tree-node a span, .x-dd-drag-ghost a span{ text-decoration:none; padding:1px 3px 1px 2px; } .x-tree-node .x-tree-node-disabled .x-tree-node-icon{ -moz-opacity: 0.5; opacity:.5; filter: alpha(opacity=50); } .x-tree-node .x-tree-node-inline-icon{ background-color:transparent; } .x-tree-node a:hover, .x-dd-drag-ghost a:hover{ text-decoration:none; } .x-tree-node div.x-tree-drag-insert-below{ border-bottom:1px dotted; } .x-tree-node div.x-tree-drag-insert-above{ border-top:1px dotted; } .x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below{ border-bottom:0 none; } .x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above{ border-top:0 none; } .x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a{ border-bottom:2px solid; } .x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a{ border-top:2px solid; } .x-tree-node .x-tree-drag-append a span{ border:1px dotted; } .x-dd-drag-ghost .x-tree-node-indent, .x-dd-drag-ghost .x-tree-ec-icon{ display:none !important; } /* Fix for ie rootVisible:false issue */ .x-tree-root-ct { zoom:1; } .x-date-picker { border: 1px solid; border-top:0 none; position:relative; } .x-date-picker a { -moz-outline:0 none; outline:0 none; } .x-date-inner, .x-date-inner td, .x-date-inner th{ border-collapse:separate; } .x-date-middle,.x-date-left,.x-date-right { background: repeat-x 0 -83px; overflow:hidden; } .x-date-middle .x-btn-tc,.x-date-middle .x-btn-tl,.x-date-middle .x-btn-tr, .x-date-middle .x-btn-mc,.x-date-middle .x-btn-ml,.x-date-middle .x-btn-mr, .x-date-middle .x-btn-bc,.x-date-middle .x-btn-bl,.x-date-middle .x-btn-br{ background:transparent !important; vertical-align:middle; } .x-date-middle .x-btn-mc em.x-btn-arrow { background:transparent no-repeat right 0; } .x-date-right, .x-date-left { width:18px; } .x-date-right{ text-align:right; } .x-date-middle { padding-top:2px; padding-bottom:2px; width:130px; /* FF3 */ } .x-date-right a, .x-date-left a{ display:block; width:16px; height:16px; background-position: center; background-repeat: no-repeat; cursor:pointer; -moz-opacity: 0.6; opacity:.6; filter: alpha(opacity=60); } .x-date-right a:hover, .x-date-left a:hover{ -moz-opacity: 1; opacity:1; filter: alpha(opacity=100); } .x-item-disabled .x-date-right a:hover, .x-item-disabled .x-date-left a:hover{ -moz-opacity: 0.6; opacity:.6; filter: alpha(opacity=60); } .x-date-right a { margin-right:2px; text-decoration:none !important; } .x-date-left a{ margin-left:2px; text-decoration:none !important; } table.x-date-inner { width: 100%; table-layout:fixed; } .ext-webkit table.x-date-inner{ /* Fix for webkit browsers */ width: 175px; } .x-date-inner th { width:25px; } .x-date-inner th { background: repeat-x left top; text-align:right !important; border-bottom: 1px solid; cursor:default; padding:0; border-collapse:separate; } .x-date-inner th span { display:block; padding:2px; padding-right:7px; } .x-date-inner td { border: 1px solid; text-align:right; padding:0; } .x-date-inner a { padding:2px 5px; display:block; text-decoration:none; text-align:right; zoom:1; } .x-date-inner .x-date-active{ cursor:pointer; color:black; } .x-date-inner .x-date-selected a{ background: repeat-x left top; border:1px solid; padding:1px 4px; } .x-date-inner .x-date-today a{ border: 1px solid; padding:1px 4px; } .x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { text-decoration:none !important; } .x-date-bottom { padding:4px; border-top: 1px solid; background: repeat-x left top; } .x-date-inner a:hover, .x-date-inner .x-date-disabled a:hover{ text-decoration:none !important; } .x-item-disabled .x-date-inner a:hover{ background: none; } .x-date-inner .x-date-disabled a { cursor:default; } .x-date-menu .x-menu-item { padding:1px 24px 1px 4px; white-space: nowrap; } .x-date-menu .x-menu-item .x-menu-item-icon { width:10px; height:10px; margin-right:5px; background-position:center -4px !important; } .x-date-mp { position:absolute; left:0; top:0; display:none; } .x-date-mp td { padding:2px; font:normal 11px arial, helvetica,tahoma,sans-serif; } td.x-date-mp-month,td.x-date-mp-year,td.x-date-mp-ybtn { border: 0 none; text-align:center; vertical-align: middle; width:25%; } .x-date-mp-ok { margin-right:3px; } .x-date-mp-btns button { text-decoration:none; text-align:center; text-decoration:none !important; border:1px solid; padding:1px 3px 1px; cursor:pointer; } .x-date-mp-btns { background: repeat-x left top; } .x-date-mp-btns td { border-top: 1px solid; text-align:center; } td.x-date-mp-month a,td.x-date-mp-year a { display:block; padding:2px 4px; text-decoration:none; text-align:center; } td.x-date-mp-month a:hover,td.x-date-mp-year a:hover { text-decoration:none; cursor:pointer; } td.x-date-mp-sel a { padding:1px 3px; background: repeat-x left top; border:1px solid; } .x-date-mp-ybtn a { overflow:hidden; width:15px; height:15px; cursor:pointer; background:transparent no-repeat; display:block; margin:0 auto; } .x-date-mp-ybtn a.x-date-mp-next { background-position:0 -120px; } .x-date-mp-ybtn a.x-date-mp-next:hover { background-position:-15px -120px; } .x-date-mp-ybtn a.x-date-mp-prev { background-position:0 -105px; } .x-date-mp-ybtn a.x-date-mp-prev:hover { background-position:-15px -105px; } .x-date-mp-ybtn { text-align:center; } td.x-date-mp-sep { border-right:1px solid; }.x-tip{ position: absolute; top: 0; left:0; visibility: hidden; z-index: 20002; border:0 none; } .x-tip .x-tip-close{ height: 15px; float:right; width: 15px; margin:0 0 2px 2px; cursor:pointer; display:none; } .x-tip .x-tip-tc { background: transparent no-repeat 0 -62px; padding-top:3px; overflow:hidden; zoom:1; } .x-tip .x-tip-tl { background: transparent no-repeat 0 0; padding-left:6px; overflow:hidden; zoom:1; } .x-tip .x-tip-tr { background: transparent no-repeat right 0; padding-right:6px; overflow:hidden; zoom:1; } .x-tip .x-tip-bc { background: transparent no-repeat 0 -121px; height:3px; overflow:hidden; } .x-tip .x-tip-bl { background: transparent no-repeat 0 -59px; padding-left:6px; zoom:1; } .x-tip .x-tip-br { background: transparent no-repeat right -59px; padding-right:6px; zoom:1; } .x-tip .x-tip-mc { border:0 none; } .x-tip .x-tip-ml { background: no-repeat 0 -124px; padding-left:6px; zoom:1; } .x-tip .x-tip-mr { background: transparent no-repeat right -124px; padding-right:6px; zoom:1; } .ext-ie .x-tip .x-tip-header,.ext-ie .x-tip .x-tip-tc { font-size:0; line-height:0; } .ext-border-box .x-tip .x-tip-header, .ext-border-box .x-tip .x-tip-tc{ line-height: 1px; } .x-tip .x-tip-header-text { padding:0; margin:0 0 2px 0; } .x-tip .x-tip-body { margin:0 !important; line-height:14px; padding:0; } .x-tip .x-tip-body .loading-indicator { margin:0; } .x-tip-draggable .x-tip-header,.x-tip-draggable .x-tip-header-text { cursor:move; } .x-form-invalid-tip .x-tip-tc { background: repeat-x 0 -12px; padding-top:6px; } .x-form-invalid-tip .x-tip-bc { background: repeat-x 0 -18px; height:6px; } .x-form-invalid-tip .x-tip-bl { background: no-repeat 0 -6px; } .x-form-invalid-tip .x-tip-br { background: no-repeat right -6px; } .x-form-invalid-tip .x-tip-body { padding:2px; } .x-form-invalid-tip .x-tip-body { padding-left:24px; background:transparent no-repeat 2px 2px; } .x-tip-anchor { position: absolute; width: 9px; height: 10px; overflow:hidden; background: transparent no-repeat 0 0; zoom:1; } .x-tip-anchor-bottom { background-position: -9px 0; } .x-tip-anchor-right { background-position: -18px 0; width: 10px; } .x-tip-anchor-left { background-position: -28px 0; width: 10px; }.x-menu { z-index: 15000; zoom: 1; background: repeat-y; } .x-menu-floating{ border: 1px solid; } .x-menu a { text-decoration: none !important; } .ext-ie .x-menu { zoom:1; overflow:hidden; } .x-menu-list{ padding: 2px; background-color:transparent; border:0 none; overflow:hidden; overflow-y: hidden; } .ext-strict .ext-ie .x-menu-list{ position: relative; } .x-menu li{ line-height:100%; } .x-menu li.x-menu-sep-li{ font-size:1px; line-height:1px; } .x-menu-list-item{ white-space: nowrap; display:block; padding:1px; } .x-menu-item{ -moz-user-select: none; -khtml-user-select:none; -webkit-user-select:ignore; } .x-menu-item-arrow{ background:transparent no-repeat right; } .x-menu-sep { display:block; font-size:1px; line-height:1px; margin: 2px 3px; border-bottom:1px solid; overflow:hidden; } .x-menu-focus { position:absolute; left:-1px; top:-1px; width:1px; height:1px; line-height:1px; font-size:1px; -moz-outline:0 none; outline:0 none; -moz-user-select: none; -khtml-user-select:none; -webkit-user-select:ignore; overflow:hidden; display:block; } a.x-menu-item { cursor: pointer; display: block; line-height: 16px; outline-color: -moz-use-text-color; outline-style: none; outline-width: 0; padding: 3px 21px 3px 27px; position: relative; text-decoration: none; white-space: nowrap; } .x-menu-item-active { background-repeat: repeat-x; background-position: left bottom; border-style:solid; border-width: 1px 0; margin:0 1px; padding: 0; } .x-menu-item-active a.x-menu-item { border-style:solid; border-width:0 1px; margin:0 -1px; } .x-menu-item-icon { border: 0 none; height: 16px; padding: 0; vertical-align: top; width: 16px; position: absolute; left: 3px; top: 3px; margin: 0; background-position:center; } .ext-ie .x-menu-item-icon { left: -24px; } .ext-strict .x-menu-item-icon { left: 3px; } .ext-ie6 .x-menu-item-icon { left: -24px; } .ext-ie .x-menu-item-icon { vertical-align: middle; } .x-menu-check-item .x-menu-item-icon{ background: transparent no-repeat center; } .x-menu-group-item .x-menu-item-icon{ background-color: transparent; } .x-menu-item-checked .x-menu-group-item .x-menu-item-icon{ background: transparent no-repeat center; } .x-date-menu .x-menu-list{ padding: 0; } .x-menu-date-item{ padding:0; } .x-menu .x-color-palette, .x-menu .x-date-picker{ margin-left: 26px; margin-right:4px; } .x-menu .x-date-picker{ border:1px solid; margin-top:2px; margin-bottom:2px; } .x-menu-plain .x-color-palette, .x-menu-plain .x-date-picker{ margin: 0; border: 0 none; } .x-date-menu { padding:0 !important; } /* * fixes separator visibility problem in IE 6 */ .ext-strict .ext-ie6 .x-menu-sep-li { padding: 3px 4px; } .ext-strict .ext-ie6 .x-menu-sep { margin: 0; height: 1px; } /* * Fixes an issue with "fat" separators in webkit */ .ext-webkit .x-menu-sep{ height: 1px; } /* * Ugly mess to remove the white border under the picker */ .ext-ie .x-date-menu{ height: 199px; } .ext-strict .ext-ie .x-date-menu, .ext-border-box .ext-ie8 .x-date-menu{ height: 197px; } .ext-strict .ext-ie7 .x-date-menu{ height: 195px; } .ext-strict .ext-ie8 .x-date-menu{ height: auto; } .x-cycle-menu .x-menu-item-checked { border:1px dotted !important; padding:0; } .x-menu .x-menu-scroller { width: 100%; background-repeat:no-repeat; background-position:center; height:8px; line-height: 8px; cursor:pointer; margin: 0; padding: 0; } .x-menu .x-menu-scroller-active{ height: 6px; line-height: 6px; } .x-menu-list-item-indent{ padding-left: 27px; }/* Creates rounded, raised boxes like on the Ext website - the markup isn't pretty: YOUR TITLE HERE (optional) YOUR CONTENT HERE */ .x-box-tl { background: transparent no-repeat 0 0; zoom:1; } .x-box-tc { height: 8px; background: transparent repeat-x 0 0; overflow: hidden; } .x-box-tr { background: transparent no-repeat right -8px; } .x-box-ml { background: transparent repeat-y 0; padding-left: 4px; overflow: hidden; zoom:1; } .x-box-mc { background: repeat-x 0 -16px; padding: 4px 10px; } .x-box-mc h3 { margin: 0 0 4px 0; zoom:1; } .x-box-mr { background: transparent repeat-y right; padding-right: 4px; overflow: hidden; } .x-box-bl { background: transparent no-repeat 0 -16px; zoom:1; } .x-box-bc { background: transparent repeat-x 0 -8px; height: 8px; overflow: hidden; } .x-box-br { background: transparent no-repeat right -24px; } .x-box-tl, .x-box-bl { padding-left: 8px; overflow: hidden; } .x-box-tr, .x-box-br { padding-right: 8px; overflow: hidden; }.x-combo-list { border:1px solid; zoom:1; overflow:hidden; } .x-combo-list-inner { overflow:auto; position:relative; /* for calculating scroll offsets */ zoom:1; overflow-x:hidden; } .x-combo-list-hd { border-bottom:1px solid; padding:3px; } .x-resizable-pinned .x-combo-list-inner { border-bottom:1px solid; } .x-combo-list-item { padding:2px; border:1px solid; white-space: nowrap; overflow:hidden; text-overflow: ellipsis; } .x-combo-list .x-combo-selected{ border:1px dotted !important; cursor:pointer; } .x-combo-list .x-toolbar { border-top:1px solid; border-bottom:0 none; }.x-panel { border-style: solid; border-width:0; } .x-panel-header { overflow:hidden; zoom:1; padding:5px 3px 4px 5px; border:1px solid; line-height: 15px; background: transparent repeat-x 0 -1px; } .x-panel-body { border:1px solid; border-top:0 none; overflow:hidden; position: relative; /* added for item scroll positioning */ } .x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar { border:1px solid; border-top:0 none; overflow:hidden; padding:2px; } .x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { border-top:1px solid; border-bottom: 0 none; } .x-panel-body-noheader, .x-panel-mc .x-panel-body { border-top:1px solid; } .x-panel-header { overflow:hidden; zoom:1; } .x-panel-tl .x-panel-header { padding:5px 0 4px 0; border:0 none; background:transparent no-repeat; } .x-panel-tl .x-panel-icon, .x-window-tl .x-panel-icon { padding-left:20px !important; background-repeat:no-repeat; background-position:0 4px; zoom:1; } .x-panel-inline-icon { width:16px; height:16px; background-repeat:no-repeat; background-position:0 0; vertical-align:middle; margin-right:4px; margin-top:-1px; margin-bottom:-1px; } .x-panel-tc { background: transparent repeat-x 0 0; overflow:hidden; } /* fix ie7 strict mode bug */ .ext-strict .ext-ie7 .x-panel-tc { overflow: visible; } .x-panel-tl { background: transparent no-repeat 0 0; padding-left:6px; zoom:1; border-bottom:1px solid; } .x-panel-tr { background: transparent no-repeat right 0; zoom:1; padding-right:6px; } .x-panel-bc { background: transparent repeat-x 0 bottom; zoom:1; } .x-panel-bc .x-panel-footer { zoom:1; } .x-panel-bl { background: transparent no-repeat 0 bottom; padding-left:6px; zoom:1; } .x-panel-br { background: transparent no-repeat right bottom; padding-right:6px; zoom:1; } .x-panel-mc { border:0 none; padding:0; margin:0; padding-top:6px; } .x-panel-mc .x-panel-body { background-color:transparent; border: 0 none; } .x-panel-ml { background: repeat-y 0 0; padding-left:6px; zoom:1; } .x-panel-mr { background: transparent repeat-y right 0; padding-right:6px; zoom:1; } .x-panel-bc .x-panel-footer { padding-bottom:6px; } .x-panel-nofooter .x-panel-bc, .x-panel-nofooter .x-window-bc { height:6px; font-size:0; line-height:0; } .x-panel-bwrap { overflow:hidden; zoom:1; left:0; top:0; } .x-panel-body { overflow:hidden; zoom:1; } .x-panel-collapsed .x-resizable-handle{ display:none; } .ext-gecko .x-panel-animated div { overflow:hidden !important; } /* Plain */ .x-plain-body { overflow:hidden; } .x-plain-bbar .x-toolbar { overflow:hidden; padding:2px; } .x-plain-tbar .x-toolbar { overflow:hidden; padding:2px; } .x-plain-bwrap { overflow:hidden; zoom:1; } .x-plain { overflow:hidden; } /* Tools */ .x-tool { overflow:hidden; width:15px; height:15px; float:right; cursor:pointer; background:transparent no-repeat; margin-left:2px; } /* expand / collapse tools */ .x-tool-toggle { background-position:0 -60px; } .x-tool-toggle-over { background-position:-15px -60px; } .x-panel-collapsed .x-tool-toggle { background-position:0 -75px; } .x-panel-collapsed .x-tool-toggle-over { background-position:-15px -75px; } .x-tool-close { background-position:0 -0; } .x-tool-close-over { background-position:-15px 0; } .x-tool-minimize { background-position:0 -15px; } .x-tool-minimize-over { background-position:-15px -15px; } .x-tool-maximize { background-position:0 -30px; } .x-tool-maximize-over { background-position:-15px -30px; } .x-tool-restore { background-position:0 -45px; } .x-tool-restore-over { background-position:-15px -45px; } .x-tool-gear { background-position:0 -90px; } .x-tool-gear-over { background-position:-15px -90px; } .x-tool-prev { background-position:0 -105px; } .x-tool-prev-over { background-position:-15px -105px; } .x-tool-next { background-position:0 -120px; } .x-tool-next-over { background-position:-15px -120px; } .x-tool-pin { background-position:0 -135px; } .x-tool-pin-over { background-position:-15px -135px; } .x-tool-unpin { background-position:0 -150px; } .x-tool-unpin-over { background-position:-15px -150px; } .x-tool-right { background-position:0 -165px; } .x-tool-right-over { background-position:-15px -165px; } .x-tool-left { background-position:0 -180px; } .x-tool-left-over { background-position:-15px -180px; } .x-tool-down { background-position:0 -195px; } .x-tool-down-over { background-position:-15px -195px; } .x-tool-up { background-position:0 -210px; } .x-tool-up-over { background-position:-15px -210px; } .x-tool-refresh { background-position:0 -225px; } .x-tool-refresh-over { background-position:-15px -225px; } .x-tool-plus { background-position:0 -240px; } .x-tool-plus-over { background-position:-15px -240px; } .x-tool-minus { background-position:0 -255px; } .x-tool-minus-over { background-position:-15px -255px; } .x-tool-search { background-position:0 -270px; } .x-tool-search-over { background-position:-15px -270px; } .x-tool-save { background-position:0 -285px; } .x-tool-save-over { background-position:-15px -285px; } .x-tool-help { background-position:0 -300px; } .x-tool-help-over { background-position:-15px -300px; } .x-tool-print { background-position:0 -315px; } .x-tool-print-over { background-position:-15px -315px; } .x-tool-expand { background-position:0 -330px; } .x-tool-expand-over { background-position:-15px -330px; } .x-tool-collapse { background-position:0 -345px; } .x-tool-collapse-over { background-position:-15px -345px; } .x-tool-resize { background-position:0 -360px; } .x-tool-resize-over { background-position:-15px -360px; } .x-tool-move { background-position:0 -375px; } .x-tool-move-over { background-position:-15px -375px; } /* Ghosting */ .x-panel-ghost { z-index:12000; overflow:hidden; position:absolute; left:0;top:0; opacity:.65; -moz-opacity:.65; filter:alpha(opacity=65); } .x-panel-ghost ul { margin:0; padding:0; overflow:hidden; font-size:0; line-height:0; border:1px solid; border-top:0 none; display:block; } .x-panel-ghost * { cursor:move !important; } .x-panel-dd-spacer { border:2px dashed; } /* Buttons */ .x-panel-btns { padding:5px; overflow:hidden; } .x-panel-btns td.x-toolbar-cell{ padding:3px; } .x-panel-btns .x-btn-focus .x-btn-left{ background-position:0 -147px; } .x-panel-btns .x-btn-focus .x-btn-right{ background-position:0 -168px; } .x-panel-btns .x-btn-focus .x-btn-center{ background-position:0 -189px; } .x-panel-btns .x-btn-over .x-btn-left{ background-position:0 -63px; } .x-panel-btns .x-btn-over .x-btn-right{ background-position:0 -84px; } .x-panel-btns .x-btn-over .x-btn-center{ background-position:0 -105px; } .x-panel-btns .x-btn-click .x-btn-center{ background-position:0 -126px; } .x-panel-btns .x-btn-click .x-btn-right{ background-position:0 -84px; } .x-panel-btns .x-btn-click .x-btn-left{ background-position:0 -63px; } .x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{ white-space: nowrap; } /** * W3C Suggested Default style sheet for HTML 4 * http://www.w3.org/TR/CSS21/sample.html * * Resets for Ext.Panel @cfg normal: true */ .x-panel-reset .x-panel-body html, .x-panel-reset .x-panel-body address, .x-panel-reset .x-panel-body blockquote, .x-panel-reset .x-panel-body body, .x-panel-reset .x-panel-body dd, .x-panel-reset .x-panel-body div, .x-panel-reset .x-panel-body dl, .x-panel-reset .x-panel-body dt, .x-panel-reset .x-panel-body fieldset, .x-panel-reset .x-panel-body form, .x-panel-reset .x-panel-body frame, frameset, .x-panel-reset .x-panel-body h1, .x-panel-reset .x-panel-body h2, .x-panel-reset .x-panel-body h3, .x-panel-reset .x-panel-body h4, .x-panel-reset .x-panel-body h5, .x-panel-reset .x-panel-body h6, .x-panel-reset .x-panel-body noframes, .x-panel-reset .x-panel-body ol, .x-panel-reset .x-panel-body p, .x-panel-reset .x-panel-body ul, .x-panel-reset .x-panel-body center, .x-panel-reset .x-panel-body dir, .x-panel-reset .x-panel-body hr, .x-panel-reset .x-panel-body menu, .x-panel-reset .x-panel-body pre { display: block } .x-panel-reset .x-panel-body li { display: list-item } .x-panel-reset .x-panel-body head { display: none } .x-panel-reset .x-panel-body table { display: table } .x-panel-reset .x-panel-body tr { display: table-row } .x-panel-reset .x-panel-body thead { display: table-header-group } .x-panel-reset .x-panel-body tbody { display: table-row-group } .x-panel-reset .x-panel-body tfoot { display: table-footer-group } .x-panel-reset .x-panel-body col { display: table-column } .x-panel-reset .x-panel-body colgroup { display: table-column-group } .x-panel-reset .x-panel-body td, .x-panel-reset .x-panel-body th { display: table-cell } .x-panel-reset .x-panel-body caption { display: table-caption } .x-panel-reset .x-panel-body th { font-weight: bolder; text-align: center } .x-panel-reset .x-panel-body caption { text-align: center } .x-panel-reset .x-panel-body body { margin: 8px } .x-panel-reset .x-panel-body h1 { font-size: 2em; margin: .67em 0 } .x-panel-reset .x-panel-body h2 { font-size: 1.5em; margin: .75em 0 } .x-panel-reset .x-panel-body h3 { font-size: 1.17em; margin: .83em 0 } .x-panel-reset .x-panel-body h4, .x-panel-reset .x-panel-body p, .x-panel-reset .x-panel-body blockquote, .x-panel-reset .x-panel-body ul, .x-panel-reset .x-panel-body fieldset, .x-panel-reset .x-panel-body form, .x-panel-reset .x-panel-body ol, .x-panel-reset .x-panel-body dl, .x-panel-reset .x-panel-body dir, .x-panel-reset .x-panel-body menu { margin: 1.12em 0 } .x-panel-reset .x-panel-body h5 { font-size: .83em; margin: 1.5em 0 } .x-panel-reset .x-panel-body h6 { font-size: .75em; margin: 1.67em 0 } .x-panel-reset .x-panel-body h1, .x-panel-reset .x-panel-body h2, .x-panel-reset .x-panel-body h3, .x-panel-reset .x-panel-body h4, .x-panel-reset .x-panel-body h5, .x-panel-reset .x-panel-body h6, .x-panel-reset .x-panel-body b, .x-panel-reset .x-panel-body strong { font-weight: bolder } .x-panel-reset .x-panel-body blockquote { margin-left: 40px; margin-right: 40px } .x-panel-reset .x-panel-body i, .x-panel-reset .x-panel-body cite, .x-panel-reset .x-panel-body em, .x-panel-reset .x-panel-body var, .x-panel-reset .x-panel-body address { font-style: italic } .x-panel-reset .x-panel-body pre, .x-panel-reset .x-panel-body tt, .x-panel-reset .x-panel-body code, .x-panel-reset .x-panel-body kbd, .x-panel-reset .x-panel-body samp { font-family: monospace } .x-panel-reset .x-panel-body pre { white-space: pre } .x-panel-reset .x-panel-body button, .x-panel-reset .x-panel-body textarea, .x-panel-reset .x-panel-body input, .x-panel-reset .x-panel-body select { display: inline-block } .x-panel-reset .x-panel-body big { font-size: 1.17em } .x-panel-reset .x-panel-body small, .x-panel-reset .x-panel-body sub, .x-panel-reset .x-panel-body sup { font-size: .83em } .x-panel-reset .x-panel-body sub { vertical-align: sub } .x-panel-reset .x-panel-body sup { vertical-align: super } .x-panel-reset .x-panel-body table { border-spacing: 2px; } .x-panel-reset .x-panel-body thead, .x-panel-reset .x-panel-body tbody, .x-panel-reset .x-panel-body tfoot { vertical-align: middle } .x-panel-reset .x-panel-body td, .x-panel-reset .x-panel-body th { vertical-align: inherit } .x-panel-reset .x-panel-body s, .x-panel-reset .x-panel-body strike, .x-panel-reset .x-panel-body del { text-decoration: line-through } .x-panel-reset .x-panel-body hr { border: 1px inset } .x-panel-reset .x-panel-body ol, .x-panel-reset .x-panel-body ul, .x-panel-reset .x-panel-body dir, .x-panel-reset .x-panel-body menu, .x-panel-reset .x-panel-body dd { margin-left: 40px } .x-panel-reset .x-panel-body ul, .x-panel-reset .x-panel-body menu, .x-panel-reset .x-panel-body dir { list-style-type: disc;} .x-panel-reset .x-panel-body ol { list-style-type: decimal } .x-panel-reset .x-panel-body ol ul, .x-panel-reset .x-panel-body ul ol, .x-panel-reset .x-panel-body ul ul, .x-panel-reset .x-panel-body ol ol { margin-top: 0; margin-bottom: 0 } .x-panel-reset .x-panel-body u, .x-panel-reset .x-panel-body ins { text-decoration: underline } .x-panel-reset .x-panel-body br:before { content: "\A" } .x-panel-reset .x-panel-body :before, .x-panel-reset .x-panel-body :after { white-space: pre-line } .x-panel-reset .x-panel-body center { text-align: center } .x-panel-reset .x-panel-body :link, .x-panel-reset .x-panel-body :visited { text-decoration: underline } .x-panel-reset .x-panel-body :focus { outline: invert dotted thin } /* Begin bidirectionality settings (do not change) */ .x-panel-reset .x-panel-body BDO[DIR="ltr"] { direction: ltr; unicode-bidi: bidi-override } .x-panel-reset .x-panel-body BDO[DIR="rtl"] { direction: rtl; unicode-bidi: bidi-override } .x-window { zoom:1; } .x-window .x-window-handle { opacity:0; -moz-opacity:0; filter:alpha(opacity=0); } .x-window-proxy { border:1px solid; z-index:12000; overflow:hidden; position:absolute; left:0;top:0; display:none; opacity:.5; -moz-opacity:.5; filter:alpha(opacity=50); } .x-window-header { overflow:hidden; zoom:1; } .x-window-bwrap { z-index:1; position:relative; zoom:1; left:0;top:0; } .x-window-tl .x-window-header { padding:5px 0 4px 0; } .x-window-header-text { cursor:pointer; } .x-window-tc { background: transparent repeat-x 0 0; overflow:hidden; zoom:1; } .x-window-tl { background: transparent no-repeat 0 0; padding-left:6px; zoom:1; z-index:1; position:relative; } .x-window-tr { background: transparent no-repeat right 0; padding-right:6px; } .x-window-bc { background: transparent repeat-x 0 bottom; zoom:1; } .x-window-bc .x-window-footer { padding-bottom:6px; zoom:1; font-size:0; line-height:0; } .x-window-bl { background: transparent no-repeat 0 bottom; padding-left:6px; zoom:1; } .x-window-br { background: transparent no-repeat right bottom; padding-right:6px; zoom:1; } .x-window-mc { border:1px solid; padding:0; margin:0; } .x-window-ml { background: transparent repeat-y 0 0; padding-left:6px; zoom:1; } .x-window-mr { background: transparent repeat-y right 0; padding-right:6px; zoom:1; } .x-window-body { overflow:hidden; } .x-window-bwrap { overflow:hidden; } .x-window-maximized .x-window-bl, .x-window-maximized .x-window-br, .x-window-maximized .x-window-ml, .x-window-maximized .x-window-mr, .x-window-maximized .x-window-tl, .x-window-maximized .x-window-tr { padding:0; } .x-window-maximized .x-window-footer { padding-bottom:0; } .x-window-maximized .x-window-tc { padding-left:3px; padding-right:3px; } .x-window-maximized .x-window-mc { border-left:0 none; border-right:0 none; } .x-window-tbar .x-toolbar, .x-window-bbar .x-toolbar { border-left:0 none; border-right: 0 none; } .x-window-bbar .x-toolbar { border-top:1px solid; border-bottom:0 none; } .x-window-draggable, .x-window-draggable .x-window-header-text { cursor:move; } .x-window-maximized .x-window-draggable, .x-window-maximized .x-window-draggable .x-window-header-text { cursor:default; } .x-window-body { background-color:transparent; } .x-panel-ghost .x-window-tl { border-bottom:1px solid; } .x-panel-collapsed .x-window-tl { border-bottom:1px solid; } .x-window-maximized-ct { overflow:hidden; } .x-window-maximized .x-window-handle { display:none; } .x-window-sizing-ghost ul { border:0 none !important; } .x-dlg-focus{ -moz-outline:0 none; outline:0 none; width:0; height:0; overflow:hidden; position:absolute; top:0; left:0; } .ext-webkit .x-dlg-focus{ width: 1px; height: 1px; } .x-dlg-mask{ z-index:10000; display:none; position:absolute; top:0; left:0; -moz-opacity: 0.5; opacity:.50; filter: alpha(opacity=50); } body.ext-ie6.x-body-masked select { visibility:hidden; } body.ext-ie6.x-body-masked .x-window select { visibility:visible; } .x-window-plain .x-window-mc { border: 1px solid; } .x-window-plain .x-window-body { border: 1px solid; background:transparent !important; }.x-html-editor-wrap { border:1px solid; } .x-html-editor-tb .x-btn-text { background:transparent no-repeat; } .x-html-editor-tb .x-edit-bold, .x-menu-item img.x-edit-bold { background-position:0 0; background-image:url(../images/default/editor/tb-sprite.gif); } .x-html-editor-tb .x-edit-italic, .x-menu-item img.x-edit-italic { background-position:-16px 0; background-image:url(../images/default/editor/tb-sprite.gif); } .x-html-editor-tb .x-edit-underline, .x-menu-item img.x-edit-underline { background-position:-32px 0; background-image:url(../images/default/editor/tb-sprite.gif); } .x-html-editor-tb .x-edit-forecolor, .x-menu-item img.x-edit-forecolor { background-position:-160px 0; background-image:url(../images/default/editor/tb-sprite.gif); } .x-html-editor-tb .x-edit-backcolor, .x-menu-item img.x-edit-backcolor { background-position:-176px 0; background-image:url(../images/default/editor/tb-sprite.gif); } .x-html-editor-tb .x-edit-justifyleft, .x-menu-item img.x-edit-justifyleft { background-position:-112px 0; background-image:url(../images/default/editor/tb-sprite.gif); } .x-html-editor-tb .x-edit-justifycenter, .x-menu-item img.x-edit-justifycenter { background-position:-128px 0; background-image:url(../images/default/editor/tb-sprite.gif); } .x-html-editor-tb .x-edit-justifyright, .x-menu-item img.x-edit-justifyright { background-position:-144px 0; background-image:url(../images/default/editor/tb-sprite.gif); } .x-html-editor-tb .x-edit-insertorderedlist, .x-menu-item img.x-edit-insertorderedlist { background-position:-80px 0; background-image:url(../images/default/editor/tb-sprite.gif); } .x-html-editor-tb .x-edit-insertunorderedlist, .x-menu-item img.x-edit-insertunorderedlist { background-position:-96px 0; background-image:url(../images/default/editor/tb-sprite.gif); } .x-html-editor-tb .x-edit-increasefontsize, .x-menu-item img.x-edit-increasefontsize { background-position:-48px 0; background-image:url(../images/default/editor/tb-sprite.gif); } .x-html-editor-tb .x-edit-decreasefontsize, .x-menu-item img.x-edit-decreasefontsize { background-position:-64px 0; background-image:url(../images/default/editor/tb-sprite.gif); } .x-html-editor-tb .x-edit-sourceedit, .x-menu-item img.x-edit-sourceedit { background-position:-192px 0; background-image:url(../images/default/editor/tb-sprite.gif); } .x-html-editor-tb .x-edit-createlink, .x-menu-item img.x-edit-createlink { background-position:-208px 0; background-image:url(../images/default/editor/tb-sprite.gif); } .x-html-editor-tip .x-tip-bd .x-tip-bd-inner { padding:5px; padding-bottom:1px; } .x-html-editor-tb .x-toolbar { position:static !important; }.x-panel-noborder .x-panel-body-noborder { border-width:0; } .x-panel-noborder .x-panel-header-noborder { border-width:0 0 1px; border-style:solid; } .x-panel-noborder .x-panel-tbar-noborder .x-toolbar { border-width:0 0 1px; border-style:solid; } .x-panel-noborder .x-panel-bbar-noborder .x-toolbar { border-width:1px 0 0 0; border-style:solid; } .x-window-noborder .x-window-mc { border-width:0; } .x-window-plain .x-window-body-noborder { border-width:0; } .x-tab-panel-noborder .x-tab-panel-body-noborder { border-width:0; } .x-tab-panel-noborder .x-tab-panel-header-noborder { border-width: 0 0 1px 0; } .x-tab-panel-noborder .x-tab-panel-footer-noborder { border-width: 1px 0 0 0; } .x-tab-panel-bbar-noborder .x-toolbar { border-width: 1px 0 0 0; border-style:solid; } .x-tab-panel-tbar-noborder .x-toolbar { border-width:0 0 1px; border-style:solid; }.x-border-layout-ct { position: relative; } .x-border-panel { position:absolute; left:0; top:0; } .x-tool-collapse-south { background-position:0 -195px; } .x-tool-collapse-south-over { background-position:-15px -195px; } .x-tool-collapse-north { background-position:0 -210px; } .x-tool-collapse-north-over { background-position:-15px -210px; } .x-tool-collapse-west { background-position:0 -180px; } .x-tool-collapse-west-over { background-position:-15px -180px; } .x-tool-collapse-east { background-position:0 -165px; } .x-tool-collapse-east-over { background-position:-15px -165px; } .x-tool-expand-south { background-position:0 -210px; } .x-tool-expand-south-over { background-position:-15px -210px; } .x-tool-expand-north { background-position:0 -195px; } .x-tool-expand-north-over { background-position:-15px -195px; } .x-tool-expand-west { background-position:0 -165px; } .x-tool-expand-west-over { background-position:-15px -165px; } .x-tool-expand-east { background-position:0 -180px; } .x-tool-expand-east-over { background-position:-15px -180px; } .x-tool-expand-north, .x-tool-expand-south { float:right; margin:3px; } .x-tool-expand-east, .x-tool-expand-west { float:none; margin:3px 2px; } .x-accordion-hd .x-tool-toggle { background-position:0 -255px; } .x-accordion-hd .x-tool-toggle-over { background-position:-15px -255px; } .x-panel-collapsed .x-accordion-hd .x-tool-toggle { background-position:0 -240px; } .x-panel-collapsed .x-accordion-hd .x-tool-toggle-over { background-position:-15px -240px; } .x-accordion-hd { padding-top:4px; padding-bottom:3px; border-top:0 none; background: transparent repeat-x 0 -9px; } .x-layout-collapsed{ position:absolute; left:-10000px; top:-10000px; visibility:hidden; width:20px; height:20px; overflow:hidden; border:1px solid; z-index:20; } .ext-border-box .x-layout-collapsed{ width:22px; height:22px; } .x-layout-collapsed-over{ cursor:pointer; } .x-layout-collapsed-west .x-layout-collapsed-tools, .x-layout-collapsed-east .x-layout-collapsed-tools{ position:absolute; top:0; left:0; width:20px; height:20px; } .x-layout-split{ position:absolute; height:5px; width:5px; line-height:1px; font-size:1px; z-index:3; background-color:transparent; } /* IE6 strict won't drag w/out a color */ .ext-strict .ext-ie6 .x-layout-split{ background-color: #fff !important; filter: alpha(opacity=1); } .x-layout-split-h{ background-image:url(../images/default/s.gif); background-position: left; } .x-layout-split-v{ background-image:url(../images/default/s.gif); background-position: top; } .x-column-layout-ct { overflow:hidden; zoom:1; } .x-column { float:left; padding:0; margin:0; overflow:hidden; zoom:1; } .x-column-inner { overflow:hidden; zoom:1; } /* mini mode */ .x-layout-mini { position:absolute; top:0; left:0; display:block; width:5px; height:35px; cursor:pointer; opacity:.5; -moz-opacity:.5; filter:alpha(opacity=50); } .x-layout-mini-over, .x-layout-collapsed-over .x-layout-mini{ opacity:1; -moz-opacity:1; filter:none; } .x-layout-split-west .x-layout-mini { top:48%; } .x-layout-split-east .x-layout-mini { top:48%; } .x-layout-split-north .x-layout-mini { left:48%; height:5px; width:35px; } .x-layout-split-south .x-layout-mini { left:48%; height:5px; width:35px; } .x-layout-cmini-west .x-layout-mini { top:48%; } .x-layout-cmini-east .x-layout-mini { top:48%; } .x-layout-cmini-north .x-layout-mini { left:48%; height:5px; width:35px; } .x-layout-cmini-south .x-layout-mini { left:48%; height:5px; width:35px; } .x-layout-cmini-west, .x-layout-cmini-east { border:0 none; width:5px !important; padding:0; background-color:transparent; } .x-layout-cmini-north, .x-layout-cmini-south { border:0 none; height:5px !important; padding:0; background-color:transparent; } .x-viewport, .x-viewport body { margin: 0; padding: 0; border: 0 none; overflow: hidden; height: 100%; } .x-abs-layout-item { position:absolute; left:0; top:0; } .ext-ie input.x-abs-layout-item, .ext-ie textarea.x-abs-layout-item { margin:0; } .x-box-layout-ct { overflow:hidden; zoom:1; } .x-box-inner { overflow:hidden; zoom:1; position:relative; left:0; top:0; } .x-box-item { position:absolute; left:0; top:0; }.x-progress-wrap { border:1px solid; overflow:hidden; } .x-progress-inner { height:18px; background:repeat-x; position:relative; } .x-progress-bar { height:18px; float:left; width:0; background: repeat-x left center; border-top:1px solid; border-bottom:1px solid; border-right:1px solid; } .x-progress-text { padding:1px 5px; overflow:hidden; position:absolute; left:0; text-align:center; } .x-progress-text-back { line-height:16px; } .ext-ie .x-progress-text-back { line-height:15px; } .ext-strict .ext-ie7 .x-progress-text-back{ width: 100%; } .x-list-header{ background: repeat-x 0 bottom; cursor:default; zoom:1; height:22px; } .x-list-header-inner div { display:block; float:left; overflow:hidden; -o-text-overflow: ellipsis; text-overflow: ellipsis; white-space: nowrap; } .x-list-header-inner div em { display:block; border-left:1px solid; padding:4px 4px; overflow:hidden; -moz-user-select: none; -khtml-user-select: none; line-height:14px; } .x-list-body { overflow:auto; overflow-x:hidden; overflow-y:auto; zoom:1; float: left; width: 100%; } .x-list-body dl { zoom:1; } .x-list-body dt { display:block; float:left; overflow:hidden; -o-text-overflow: ellipsis; text-overflow: ellipsis; white-space: nowrap; cursor:pointer; zoom:1; } .x-list-body dt em { display:block; padding:3px 4px; overflow:hidden; -moz-user-select: none; -khtml-user-select: none; } .x-list-resizer { border-left:1px solid; border-right:1px solid; position:absolute; left:0; top:0; } .x-list-header-inner em.sort-asc { background: transparent no-repeat center 0; border-style:solid; border-width: 0 1px 1px; padding-bottom:3px; } .x-list-header-inner em.sort-desc { background: transparent no-repeat center -23px; border-style:solid; border-width: 0 1px 1px; padding-bottom:3px; } /* Shared styles */ .x-slider { zoom:1; } .x-slider-inner { position:relative; left:0; top:0; overflow:visible; zoom:1; } .x-slider-focus { position:absolute; left:0; top:0; width:1px; height:1px; line-height:1px; font-size:1px; -moz-outline:0 none; outline:0 none; -moz-user-select: none; -khtml-user-select:none; -webkit-user-select:ignore; display:block; overflow:hidden; } /* Horizontal styles */ .x-slider-horz { padding-left:7px; background:transparent no-repeat 0 -22px; } .x-slider-horz .x-slider-end { padding-right:7px; zoom:1; background:transparent no-repeat right -44px; } .x-slider-horz .x-slider-inner { background:transparent repeat-x 0 0; height:22px; } .x-slider-horz .x-slider-thumb { width:14px; height:15px; position:absolute; left:0; top:3px; background:transparent no-repeat 0 0; } .x-slider-horz .x-slider-thumb-over { background-position: -14px -15px; } .x-slider-horz .x-slider-thumb-drag { background-position: -28px -30px; } /* Vertical styles */ .x-slider-vert { padding-top:7px; background:transparent no-repeat -44px 0; width:22px; } .x-slider-vert .x-slider-end { padding-bottom:7px; zoom:1; background:transparent no-repeat -22px bottom; } .x-slider-vert .x-slider-inner { background:transparent repeat-y 0 0; } .x-slider-vert .x-slider-thumb { width:15px; height:14px; position:absolute; left:3px; bottom:0; background:transparent no-repeat 0 0; } .x-slider-vert .x-slider-thumb-over { background-position: -15px -14px; } .x-slider-vert .x-slider-thumb-drag { background-position: -30px -28px; }.x-window-dlg .x-window-body { border:0 none !important; padding:5px 10px; overflow:hidden !important; } .x-window-dlg .x-window-mc { border:0 none !important; } .x-window-dlg .ext-mb-input { margin-top:4px; width:95%; } .x-window-dlg .ext-mb-textarea { margin-top:4px; } .x-window-dlg .x-progress-wrap { margin-top:4px; } .ext-ie .x-window-dlg .x-progress-wrap { margin-top:6px; } .x-window-dlg .x-msg-box-wait { background:transparent no-repeat left; display:block; width:300px; padding-left:18px; line-height:18px; } .x-window-dlg .ext-mb-icon { float:left; width:47px; height:32px; } .x-window-dlg .x-dlg-icon .ext-mb-content{ zoom: 1; margin-left: 47px; } .x-window-dlg .ext-mb-info, .x-window-dlg .ext-mb-warning, .x-window-dlg .ext-mb-question, .x-window-dlg .ext-mb-error { background:transparent no-repeat top left; } .ext-gecko2 .ext-mb-fix-cursor { overflow:auto; }.ext-el-mask { background-color: #ccc; } .ext-el-mask-msg { border-color:#6593cf; background-color:#c3daf9; background-image:url(../images/default/box/tb-blue.gif); } .ext-el-mask-msg div { background-color: #eee; border-color:#a3bad9; color:#222; font:normal 11px tahoma, arial, helvetica, sans-serif; } .x-mask-loading div { background-color:#fbfbfb; background-image:url(../images/default/grid/loading.gif); } .x-item-disabled { color: gray; } .x-item-disabled * { color: gray !important; } .x-splitbar-proxy { background-color: #aaa; } .x-color-palette a { border-color:#fff; } .x-color-palette a:hover, .x-color-palette a.x-color-palette-sel { border-color:#8bb8f3; background-color: #deecfd; } /* .x-color-palette em:hover, .x-color-palette span:hover{ background-color: #deecfd; } */ .x-color-palette em { border-color:#aca899; } .x-ie-shadow { background-color:#777; } .x-shadow .xsmc { background-image: url(../images/default/shadow-c.png); } .x-shadow .xsml, .x-shadow .xsmr { background-image: url(../images/default/shadow-lr.png); } .x-shadow .xstl, .x-shadow .xstc, .x-shadow .xstr, .x-shadow .xsbl, .x-shadow .xsbc, .x-shadow .xsbr{ background-image: url(../images/default/shadow.png); } .loading-indicator { font-size: 11px; background-image: url(../images/default/grid/loading.gif); } .x-spotlight { background-color: #ccc; } .x-tab-panel-header, .x-tab-panel-footer { background-color: #deecfd; border-color:#8db2e3; overflow:hidden; zoom:1; } .x-tab-panel-header, .x-tab-panel-footer { border-color:#8db2e3; } ul.x-tab-strip-top{ background-color:#cedff5; background-image: url(../images/default/tabs/tab-strip-bg.gif); border-bottom-color:#8db2e3; } ul.x-tab-strip-bottom{ background-color:#cedff5; background-image: url(../images/default/tabs/tab-strip-btm-bg.gif); border-top-color:#8db2e3; } .x-tab-panel-header-plain .x-tab-strip-spacer, .x-tab-panel-footer-plain .x-tab-strip-spacer { border-color:#8db2e3; background-color: #deecfd; } .x-tab-strip span.x-tab-strip-text { font:normal 11px tahoma,arial,helvetica; color:#416aa3; } .x-tab-strip-over span.x-tab-strip-text { color:#15428b; } .x-tab-strip-active span.x-tab-strip-text { color:#15428b; font-weight:bold; } .x-tab-strip-disabled .x-tabs-text { color:#aaaaaa; } .x-tab-strip-top .x-tab-right, .x-tab-strip-top .x-tab-left, .x-tab-strip-top .x-tab-strip-inner{ background-image: url(../images/default/tabs/tabs-sprite.gif); } .x-tab-strip-bottom .x-tab-right { background-image: url(../images/default/tabs/tab-btm-inactive-right-bg.gif); } .x-tab-strip-bottom .x-tab-left { background-image: url(../images/default/tabs/tab-btm-inactive-left-bg.gif); } .x-tab-strip-bottom .x-tab-strip-over .x-tab-right { background-image: url(../images/default/tabs/tab-btm-over-right-bg.gif); } .x-tab-strip-bottom .x-tab-strip-over .x-tab-left { background-image: url(../images/default/tabs/tab-btm-over-left-bg.gif); } .x-tab-strip-bottom .x-tab-strip-active .x-tab-right { background-image: url(../images/default/tabs/tab-btm-right-bg.gif); } .x-tab-strip-bottom .x-tab-strip-active .x-tab-left { background-image: url(../images/default/tabs/tab-btm-left-bg.gif); } .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { background-image:url(../images/default/tabs/tab-close.gif); } .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{ background-image:url(../images/default/tabs/tab-close.gif); } .x-tab-panel-body { border-color:#8db2e3; background-color:#fff; } .x-tab-panel-body-top { border-top: 0 none; } .x-tab-panel-body-bottom { border-bottom: 0 none; } .x-tab-scroller-left { background-image:url(../images/default/tabs/scroll-left.gif); border-bottom-color:#8db2e3; } .x-tab-scroller-left-over { background-position: 0 0; } .x-tab-scroller-left-disabled { background-position: -18px 0; opacity:.5; -moz-opacity:.5; filter:alpha(opacity=50); cursor:default; } .x-tab-scroller-right { background-image:url(../images/default/tabs/scroll-right.gif); border-bottom-color:#8db2e3; } .x-tab-panel-bbar .x-toolbar, .x-tab-panel-tbar .x-toolbar { border-color:#99bbe8; }.x-form-field { font:normal 12px tahoma, arial, helvetica, sans-serif; } .x-form-text, textarea.x-form-field { background-color:#fff; background-image:url(../images/default/form/text-bg.gif); border-color:#b5b8c8; } .x-form-select-one { background-color:#fff; border-color:#b5b8c8; } .x-form-check-group-label { border-bottom: 1px solid #99bbe8; color: #15428b; } .x-editor .x-form-check-wrap { background-color:#fff; } .x-form-field-wrap .x-form-trigger { background-image:url(../images/default/form/trigger.gif); border-bottom-color:#b5b8c8; } .x-form-field-wrap .x-form-date-trigger { background-image: url(../images/default/form/date-trigger.gif); } .x-form-field-wrap .x-form-clear-trigger { background-image: url(../images/default/form/clear-trigger.gif); } .x-form-field-wrap .x-form-search-trigger { background-image: url(../images/default/form/search-trigger.gif); } .x-trigger-wrap-focus .x-form-trigger { border-bottom-color:#7eadd9; } .x-item-disabled .x-form-trigger-over { border-bottom-color:#b5b8c8; } .x-item-disabled .x-form-trigger-click { border-bottom-color:#b5b8c8; } .x-form-focus, textarea.x-form-focus { border-color:#7eadd9; } .x-form-invalid, textarea.x-form-invalid { background-color:#fff; background-image:url(../images/default/grid/invalid_line.gif); border-color:#c30; } .x-form-invalid.x-form-composite { border: none; background-image: none; } .x-form-invalid.x-form-composite .x-form-invalid { background-color:#fff; background-image:url(../images/default/grid/invalid_line.gif); border-color:#c30; } .x-form-inner-invalid, textarea.x-form-inner-invalid { background-color:#fff; background-image:url(../images/default/grid/invalid_line.gif); } .x-form-grow-sizer { font:normal 12px tahoma, arial, helvetica, sans-serif; } .x-form-item { font:normal 12px tahoma, arial, helvetica, sans-serif; } .x-form-invalid-msg { color:#c0272b; font:normal 11px tahoma, arial, helvetica, sans-serif; background-image:url(../images/default/shared/warning.gif); } .x-form-empty-field { color:gray; } .x-small-editor .x-form-field { font:normal 11px arial, tahoma, helvetica, sans-serif; } .ext-webkit .x-small-editor .x-form-field { font:normal 11px arial, tahoma, helvetica, sans-serif; } .x-form-invalid-icon { background-image:url(../images/default/form/exclamation.gif); } .x-fieldset { border-color:#b5b8c8; } .x-fieldset legend { font:bold 11px tahoma, arial, helvetica, sans-serif; color:#15428b; } .x-btn{ font:normal 11px tahoma, verdana, helvetica; } .x-btn button{ font:normal 11px arial,tahoma,verdana,helvetica; color:#333; } .x-btn em { font-style:normal; font-weight:normal; } .x-btn-tl, .x-btn-tr, .x-btn-tc, .x-btn-ml, .x-btn-mr, .x-btn-mc, .x-btn-bl, .x-btn-br, .x-btn-bc{ background-image:url(../images/default/button/btn.gif); } .x-btn-click .x-btn-text, .x-btn-menu-active .x-btn-text, .x-btn-pressed .x-btn-text{ color:#000; } .x-btn-disabled *{ color:gray !important; } .x-btn-mc em.x-btn-arrow { background-image:url(../images/default/button/arrow.gif); } .x-btn-mc em.x-btn-split { background-image:url(../images/default/button/s-arrow.gif); } .x-btn-over .x-btn-mc em.x-btn-split, .x-btn-click .x-btn-mc em.x-btn-split, .x-btn-menu-active .x-btn-mc em.x-btn-split, .x-btn-pressed .x-btn-mc em.x-btn-split { background-image:url(../images/default/button/s-arrow-o.gif); } .x-btn-mc em.x-btn-arrow-bottom { background-image:url(../images/default/button/s-arrow-b-noline.gif); } .x-btn-mc em.x-btn-split-bottom { background-image:url(../images/default/button/s-arrow-b.gif); } .x-btn-over .x-btn-mc em.x-btn-split-bottom, .x-btn-click .x-btn-mc em.x-btn-split-bottom, .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom, .x-btn-pressed .x-btn-mc em.x-btn-split-bottom { background-image:url(../images/default/button/s-arrow-bo.gif); } .x-btn-group-header { color: #3e6aaa; } .x-btn-group-tc { background-image: url(../images/default/button/group-tb.gif); } .x-btn-group-tl { background-image: url(../images/default/button/group-cs.gif); } .x-btn-group-tr { background-image: url(../images/default/button/group-cs.gif); } .x-btn-group-bc { background-image: url(../images/default/button/group-tb.gif); } .x-btn-group-bl { background-image: url(../images/default/button/group-cs.gif); } .x-btn-group-br { background-image: url(../images/default/button/group-cs.gif); } .x-btn-group-ml { background-image: url(../images/default/button/group-lr.gif); } .x-btn-group-mr { background-image: url(../images/default/button/group-lr.gif); } .x-btn-group-notitle .x-btn-group-tc { background-image: url(../images/default/button/group-tb.gif); }.x-toolbar{ border-color:#a9bfd3; background-color:#d0def0; background-image:url(../images/default/toolbar/bg.gif); } .x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{ font:normal 11px arial,tahoma, helvetica, sans-serif; } .x-toolbar .x-item-disabled { color:gray; } .x-toolbar .x-item-disabled * { color:gray; } .x-toolbar .x-btn-mc em.x-btn-split { background-image:url(../images/default/button/s-arrow-noline.gif); } .x-toolbar .x-btn-over .x-btn-mc em.x-btn-split, .x-toolbar .x-btn-click .x-btn-mc em.x-btn-split, .x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split, .x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split { background-image:url(../images/default/button/s-arrow-o.gif); } .x-toolbar .x-btn-mc em.x-btn-split-bottom { background-image:url(../images/default/button/s-arrow-b-noline.gif); } .x-toolbar .x-btn-over .x-btn-mc em.x-btn-split-bottom, .x-toolbar .x-btn-click .x-btn-mc em.x-btn-split-bottom, .x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom, .x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split-bottom { background-image:url(../images/default/button/s-arrow-bo.gif); } .x-toolbar .xtb-sep { background-image: url(../images/default/grid/grid-blue-split.gif); } .x-tbar-page-first{ background-image: url(../images/default/grid/page-first.gif) !important; } .x-tbar-loading{ background-image: url(../images/default/grid/refresh.gif) !important; } .x-tbar-page-last{ background-image: url(../images/default/grid/page-last.gif) !important; } .x-tbar-page-next{ background-image: url(../images/default/grid/page-next.gif) !important; } .x-tbar-page-prev{ background-image: url(../images/default/grid/page-prev.gif) !important; } .x-item-disabled .x-tbar-loading{ background-image: url(../images/default/grid/refresh-disabled.gif) !important; } .x-item-disabled .x-tbar-page-first{ background-image: url(../images/default/grid/page-first-disabled.gif) !important; } .x-item-disabled .x-tbar-page-last{ background-image: url(../images/default/grid/page-last-disabled.gif) !important; } .x-item-disabled .x-tbar-page-next{ background-image: url(../images/default/grid/page-next-disabled.gif) !important; } .x-item-disabled .x-tbar-page-prev{ background-image: url(../images/default/grid/page-prev-disabled.gif) !important; } .x-paging-info { color:#444; } .x-toolbar-more-icon { background-image: url(../images/default/toolbar/more.gif) !important; }.x-resizable-handle { background-color:#fff; } .x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east, .x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west { background-image:url(../images/default/sizer/e-handle.gif); } .x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south, .x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north { background-image:url(../images/default/sizer/s-handle.gif); } .x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north{ background-image:url(../images/default/sizer/s-handle.gif); } .x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ background-image:url(../images/default/sizer/se-handle.gif); } .x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ background-image:url(../images/default/sizer/nw-handle.gif); } .x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ background-image:url(../images/default/sizer/ne-handle.gif); } .x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ background-image:url(../images/default/sizer/sw-handle.gif); } .x-resizable-proxy{ border-color:#3b5a82; } .x-resizable-overlay{ background-color:#fff; } .x-grid3 { background-color:#fff; } .x-grid-panel .x-panel-mc .x-panel-body { border-color:#99bbe8; } .x-grid3-row td, .x-grid3-summary-row td{ font:normal 11px/13px arial, tahoma, helvetica, sans-serif; } .x-grid3-hd-row td { font:normal 11px/15px arial, tahoma, helvetica, sans-serif; } .x-grid3-hd-row td { border-left-color:#eee; border-right-color:#d0d0d0; } .x-grid-row-loading { background-color: #fff; background-image:url(../images/default/shared/loading-balls.gif); } .x-grid3-row { border-color:#ededed; border-top-color:#fff; } .x-grid3-row-alt{ background-color:#fafafa; } .x-grid3-row-over { border-color:#ddd; background-color:#efefef; background-image:url(../images/default/grid/row-over.gif); } .x-grid3-resize-proxy { background-color:#777; } .x-grid3-resize-marker { background-color:#777; } .x-grid3-header{ background-color:#f9f9f9; background-image:url(../images/default/grid/grid3-hrow.gif); } .x-grid3-header-pop { border-left-color:#d0d0d0; } .x-grid3-header-pop-inner { border-left-color:#eee; background-image:url(../images/default/grid/hd-pop.gif); } td.x-grid3-hd-over, td.sort-desc, td.sort-asc, td.x-grid3-hd-menu-open { border-left-color:#aaccf6; border-right-color:#aaccf6; } td.x-grid3-hd-over .x-grid3-hd-inner, td.sort-desc .x-grid3-hd-inner, td.sort-asc .x-grid3-hd-inner, td.x-grid3-hd-menu-open .x-grid3-hd-inner { background-color:#ebf3fd; background-image:url(../images/default/grid/grid3-hrow-over.gif); } .sort-asc .x-grid3-sort-icon { background-image: url(../images/default/grid/sort_asc.gif); } .sort-desc .x-grid3-sort-icon { background-image: url(../images/default/grid/sort_desc.gif); } .x-grid3-cell-text, .x-grid3-hd-text { color:#000; } .x-grid3-split { background-image: url(../images/default/grid/grid-split.gif); } .x-grid3-hd-text { color:#15428b; } .x-dd-drag-proxy .x-grid3-hd-inner{ background-color:#ebf3fd; background-image:url(../images/default/grid/grid3-hrow-over.gif); border-color:#aaccf6; } .col-move-top{ background-image:url(../images/default/grid/col-move-top.gif); } .col-move-bottom{ background-image:url(../images/default/grid/col-move-bottom.gif); } td.grid-hd-group-cell { background: url(../images/default/grid/grid3-hrow.gif) repeat-x bottom; } .x-grid3-row-selected { background-color: #dfe8f6 !important; background-image: none; border-color:#a3bae9; } .x-grid3-cell-selected{ background-color: #b8cfee !important; color:#000; } .x-grid3-cell-selected span{ color:#000 !important; } .x-grid3-cell-selected .x-grid3-cell-text{ color:#000; } .x-grid3-locked td.x-grid3-row-marker, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker{ background-color:#ebeadb !important; background-image:url(../images/default/grid/grid-hrow.gif) !important; color:#000; border-top-color:#fff; border-right-color:#6fa0df !important; } .x-grid3-locked td.x-grid3-row-marker div, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div{ color:#15428b !important; } .x-grid3-dirty-cell { background-image:url(../images/default/grid/dirty.gif); } .x-grid3-topbar, .x-grid3-bottombar{ font:normal 11px arial, tahoma, helvetica, sans-serif; } .x-grid3-bottombar .x-toolbar{ border-top-color:#a9bfd3; } .x-props-grid .x-grid3-td-name .x-grid3-cell-inner{ background-image:url(../images/default/grid/grid3-special-col-bg.gif) !important; color:#000 !important; } .x-props-grid .x-grid3-body .x-grid3-td-name{ background-color:#fff !important; border-right-color:#eee; } .xg-hmenu-sort-asc .x-menu-item-icon{ background-image: url(../images/default/grid/hmenu-asc.gif); } .xg-hmenu-sort-desc .x-menu-item-icon{ background-image: url(../images/default/grid/hmenu-desc.gif); } .xg-hmenu-lock .x-menu-item-icon{ background-image: url(../images/default/grid/hmenu-lock.gif); } .xg-hmenu-unlock .x-menu-item-icon{ background-image: url(../images/default/grid/hmenu-unlock.gif); } .x-grid3-hd-btn { background-color:#c3daf9; background-image:url(../images/default/grid/grid3-hd-btn.gif); } .x-grid3-body .x-grid3-td-expander { background-image:url(../images/default/grid/grid3-special-col-bg.gif); } .x-grid3-row-expander { background-image:url(../images/default/grid/row-expand-sprite.gif); } .x-grid3-body .x-grid3-td-checker { background-image: url(../images/default/grid/grid3-special-col-bg.gif); } .x-grid3-row-checker, .x-grid3-hd-checker { background-image:url(../images/default/grid/row-check-sprite.gif); } .x-grid3-body .x-grid3-td-numberer { background-image:url(../images/default/grid/grid3-special-col-bg.gif); } .x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner { color:#444; } .x-grid3-body .x-grid3-td-row-icon { background-image:url(../images/default/grid/grid3-special-col-bg.gif); } .x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer, .x-grid3-body .x-grid3-row-selected .x-grid3-td-checker, .x-grid3-body .x-grid3-row-selected .x-grid3-td-expander { background-image:url(../images/default/grid/grid3-special-col-sel-bg.gif); } .x-grid3-check-col { background-image:url(../images/default/menu/unchecked.gif); } .x-grid3-check-col-on { background-image:url(../images/default/menu/checked.gif); } .x-grid-group, .x-grid-group-body, .x-grid-group-hd { zoom:1; } .x-grid-group-hd { border-bottom-color:#99bbe8; } .x-grid-group-hd div.x-grid-group-title { background-image:url(../images/default/grid/group-collapse.gif); color:#3764a0; font:bold 11px tahoma, arial, helvetica, sans-serif; } .x-grid-group-collapsed .x-grid-group-hd div.x-grid-group-title { background-image:url(../images/default/grid/group-expand.gif); } .x-group-by-icon { background-image:url(../images/default/grid/group-by.gif); } .x-cols-icon { background-image:url(../images/default/grid/columns.gif); } .x-show-groups-icon { background-image:url(../images/default/grid/group-by.gif); } .x-grid-empty { color:gray; font:normal 11px tahoma, arial, helvetica, sans-serif; } .x-grid-with-col-lines .x-grid3-row td.x-grid3-cell { border-right-color:#ededed; } .x-grid-with-col-lines .x-grid3-row-selected { border-top-color:#a3bae9; }.x-pivotgrid .x-grid3-header-offset table td { background: url(../images/default/grid/grid3-hrow.gif) repeat-x 50% 100%; border-left: 1px solid; border-right: 1px solid; border-left-color: #EEE; border-right-color: #D0D0D0; } .x-pivotgrid .x-grid3-row-headers { background-color: #f9f9f9; } .x-pivotgrid .x-grid3-row-headers table td { background: #EEE url(../images/default/grid/grid3-rowheader.gif) repeat-x left top; border-left: 1px solid; border-right: 1px solid; border-left-color: #EEE; border-right-color: #D0D0D0; border-bottom: 1px solid; border-bottom-color: #D0D0D0; height: 18px; } .x-dd-drag-ghost{ color:#000; font: normal 11px arial, helvetica, sans-serif; border-color: #ddd #bbb #bbb #ddd; background-color:#fff; } .x-dd-drop-nodrop .x-dd-drop-icon{ background-image: url(../images/default/dd/drop-no.gif); } .x-dd-drop-ok .x-dd-drop-icon{ background-image: url(../images/default/dd/drop-yes.gif); } .x-dd-drop-ok-add .x-dd-drop-icon{ background-image: url(../images/default/dd/drop-add.gif); } .x-view-selector { background-color:#c3daf9; border-color:#3399bb; }.x-tree-node-expanded .x-tree-node-icon{ background-image:url(../images/default/tree/folder-open.gif); } .x-tree-node-leaf .x-tree-node-icon{ background-image:url(../images/default/tree/leaf.gif); } .x-tree-node-collapsed .x-tree-node-icon{ background-image:url(../images/default/tree/folder.gif); } .x-tree-node-loading .x-tree-node-icon{ background-image:url(../images/default/tree/loading.gif) !important; } .x-tree-node .x-tree-node-inline-icon { background-image: none; } .x-tree-node-loading a span{ font-style: italic; color:#444444; } .x-tree-lines .x-tree-elbow{ background-image:url(../images/default/tree/elbow.gif); } .x-tree-lines .x-tree-elbow-plus{ background-image:url(../images/default/tree/elbow-plus.gif); } .x-tree-lines .x-tree-elbow-minus{ background-image:url(../images/default/tree/elbow-minus.gif); } .x-tree-lines .x-tree-elbow-end{ background-image:url(../images/default/tree/elbow-end.gif); } .x-tree-lines .x-tree-elbow-end-plus{ background-image:url(../images/default/tree/elbow-end-plus.gif); } .x-tree-lines .x-tree-elbow-end-minus{ background-image:url(../images/default/tree/elbow-end-minus.gif); } .x-tree-lines .x-tree-elbow-line{ background-image:url(../images/default/tree/elbow-line.gif); } .x-tree-no-lines .x-tree-elbow-plus{ background-image:url(../images/default/tree/elbow-plus-nl.gif); } .x-tree-no-lines .x-tree-elbow-minus{ background-image:url(../images/default/tree/elbow-minus-nl.gif); } .x-tree-no-lines .x-tree-elbow-end-plus{ background-image:url(../images/default/tree/elbow-end-plus-nl.gif); } .x-tree-no-lines .x-tree-elbow-end-minus{ background-image:url(../images/default/tree/elbow-end-minus-nl.gif); } .x-tree-arrows .x-tree-elbow-plus{ background-image:url(../images/default/tree/arrows.gif); } .x-tree-arrows .x-tree-elbow-minus{ background-image:url(../images/default/tree/arrows.gif); } .x-tree-arrows .x-tree-elbow-end-plus{ background-image:url(../images/default/tree/arrows.gif); } .x-tree-arrows .x-tree-elbow-end-minus{ background-image:url(../images/default/tree/arrows.gif); } .x-tree-node{ color:#000; font: normal 11px arial, tahoma, helvetica, sans-serif; } .x-tree-node a, .x-dd-drag-ghost a{ color:#000; } .x-tree-node a span, .x-dd-drag-ghost a span{ color:#000; } .x-tree-node .x-tree-node-disabled a span{ color:gray !important; } .x-tree-node div.x-tree-drag-insert-below{ border-bottom-color:#36c; } .x-tree-node div.x-tree-drag-insert-above{ border-top-color:#36c; } .x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a{ border-bottom-color:#36c; } .x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a{ border-top-color:#36c; } .x-tree-node .x-tree-drag-append a span{ background-color:#ddd; border-color:gray; } .x-tree-node .x-tree-node-over { background-color: #eee; } .x-tree-node .x-tree-selected { background-color: #d9e8fb; } .x-tree-drop-ok-append .x-dd-drop-icon{ background-image: url(../images/default/tree/drop-add.gif); } .x-tree-drop-ok-above .x-dd-drop-icon{ background-image: url(../images/default/tree/drop-over.gif); } .x-tree-drop-ok-below .x-dd-drop-icon{ background-image: url(../images/default/tree/drop-under.gif); } .x-tree-drop-ok-between .x-dd-drop-icon{ background-image: url(../images/default/tree/drop-between.gif); }.x-date-picker { border-color: #1b376c; background-color:#fff; } .x-date-middle,.x-date-left,.x-date-right { background-image: url(../images/default/shared/hd-sprite.gif); color:#fff; font:bold 11px "sans serif", tahoma, verdana, helvetica; } .x-date-middle .x-btn .x-btn-text { color:#fff; } .x-date-middle .x-btn-mc em.x-btn-arrow { background-image:url(../images/default/toolbar/btn-arrow-light.gif); } .x-date-right a { background-image: url(../images/default/shared/right-btn.gif); } .x-date-left a{ background-image: url(../images/default/shared/left-btn.gif); } .x-date-inner th { background-color:#dfecfb; background-image:url(../images/default/shared/glass-bg.gif); border-bottom-color:#a3bad9; font:normal 10px arial, helvetica,tahoma,sans-serif; color:#233d6d; } .x-date-inner td { border-color:#fff; } .x-date-inner a { font:normal 11px arial, helvetica,tahoma,sans-serif; color:#000; } .x-date-inner .x-date-active{ color:#000; } .x-date-inner .x-date-selected a{ background-color:#dfecfb; background-image:url(../images/default/shared/glass-bg.gif); border-color:#8db2e3; } .x-date-inner .x-date-today a{ border-color:darkred; } .x-date-inner .x-date-selected span{ font-weight:bold; } .x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { color:#aaa; } .x-date-bottom { border-top-color:#a3bad9; background-color:#dfecfb; background-image:url(../images/default/shared/glass-bg.gif); } .x-date-inner a:hover, .x-date-inner .x-date-disabled a:hover{ color:#000; background-color:#ddecfe; } .x-date-inner .x-date-disabled a { background-color:#eee; color:#bbb; } .x-date-mmenu{ background-color:#eee !important; } .x-date-mmenu .x-menu-item { font-size:10px; color:#000; } .x-date-mp { background-color:#fff; } .x-date-mp td { font:normal 11px arial, helvetica,tahoma,sans-serif; } .x-date-mp-btns button { background-color:#083772; color:#fff; border-color: #3366cc #000055 #000055 #3366cc; font:normal 11px arial, helvetica,tahoma,sans-serif; } .x-date-mp-btns { background-color: #dfecfb; background-image: url(../images/default/shared/glass-bg.gif); } .x-date-mp-btns td { border-top-color: #c5d2df; } td.x-date-mp-month a,td.x-date-mp-year a { color:#15428b; } td.x-date-mp-month a:hover,td.x-date-mp-year a:hover { color:#15428b; background-color: #ddecfe; } td.x-date-mp-sel a { background-color: #dfecfb; background-image: url(../images/default/shared/glass-bg.gif); border-color:#8db2e3; } .x-date-mp-ybtn a { background-image:url(../images/default/panel/tool-sprites.gif); } td.x-date-mp-sep { border-right-color:#c5d2df; }.x-tip .x-tip-close{ background-image: url(../images/default/qtip/close.gif); } .x-tip .x-tip-tc, .x-tip .x-tip-tl, .x-tip .x-tip-tr, .x-tip .x-tip-bc, .x-tip .x-tip-bl, .x-tip .x-tip-br, .x-tip .x-tip-ml, .x-tip .x-tip-mr { background-image: url(../images/default/qtip/tip-sprite.gif); } .x-tip .x-tip-mc { font: normal 11px tahoma,arial,helvetica,sans-serif; } .x-tip .x-tip-ml { background-color: #fff; } .x-tip .x-tip-header-text { font: bold 11px tahoma,arial,helvetica,sans-serif; color:#444; } .x-tip .x-tip-body { font: normal 11px tahoma,arial,helvetica,sans-serif; color:#444; } .x-form-invalid-tip .x-tip-tc, .x-form-invalid-tip .x-tip-tl, .x-form-invalid-tip .x-tip-tr, .x-form-invalid-tip .x-tip-bc, .x-form-invalid-tip .x-tip-bl, .x-form-invalid-tip .x-tip-br, .x-form-invalid-tip .x-tip-ml, .x-form-invalid-tip .x-tip-mr { background-image: url(../images/default/form/error-tip-corners.gif); } .x-form-invalid-tip .x-tip-body { background-image:url(../images/default/form/exclamation.gif); } .x-tip-anchor { background-image:url(../images/default/qtip/tip-anchor-sprite.gif); }.x-menu { background-color:#f0f0f0; background-image:url(../images/default/menu/menu.gif); } .x-menu-floating{ border-color:#718bb7; } .x-menu-nosep { background-image:none; } .x-menu-list-item{ font:normal 11px arial,tahoma,sans-serif; } .x-menu-item-arrow{ background-image:url(../images/default/menu/menu-parent.gif); } .x-menu-sep { background-color:#e0e0e0; border-bottom-color:#fff; } a.x-menu-item { color:#222; } .x-menu-item-active { background-image: url(../images/default/menu/item-over.gif); background-color: #dbecf4; border-color:#aaccf6; } .x-menu-item-active a.x-menu-item { border-color:#aaccf6; } .x-menu-check-item .x-menu-item-icon{ background-image:url(../images/default/menu/unchecked.gif); } .x-menu-item-checked .x-menu-item-icon{ background-image:url(../images/default/menu/checked.gif); } .x-menu-item-checked .x-menu-group-item .x-menu-item-icon{ background-image:url(../images/default/menu/group-checked.gif); } .x-menu-group-item .x-menu-item-icon{ background-image:none; } .x-menu-plain { background-color:#f0f0f0 !important; background-image: none; } .x-date-menu, .x-color-menu{ background-color: #fff !important; } .x-menu .x-date-picker{ border-color:#a3bad9; } .x-cycle-menu .x-menu-item-checked { border-color:#a3bae9 !important; background-color:#def8f6; } .x-menu-scroller-top { background-image:url(../images/default/layout/mini-top.gif); } .x-menu-scroller-bottom { background-image:url(../images/default/layout/mini-bottom.gif); } .x-box-tl { background-image: url(../images/default/box/corners.gif); } .x-box-tc { background-image: url(../images/default/box/tb.gif); } .x-box-tr { background-image: url(../images/default/box/corners.gif); } .x-box-ml { background-image: url(../images/default/box/l.gif); } .x-box-mc { background-color: #eee; background-image: url(../images/default/box/tb.gif); font-family: "Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif; color: #393939; font-size: 12px; } .x-box-mc h3 { font-size: 14px; font-weight: bold; } .x-box-mr { background-image: url(../images/default/box/r.gif); } .x-box-bl { background-image: url(../images/default/box/corners.gif); } .x-box-bc { background-image: url(../images/default/box/tb.gif); } .x-box-br { background-image: url(../images/default/box/corners.gif); } .x-box-blue .x-box-bl, .x-box-blue .x-box-br, .x-box-blue .x-box-tl, .x-box-blue .x-box-tr { background-image: url(../images/default/box/corners-blue.gif); } .x-box-blue .x-box-bc, .x-box-blue .x-box-mc, .x-box-blue .x-box-tc { background-image: url(../images/default/box/tb-blue.gif); } .x-box-blue .x-box-mc { background-color: #c3daf9; } .x-box-blue .x-box-mc h3 { color: #17385b; } .x-box-blue .x-box-ml { background-image: url(../images/default/box/l-blue.gif); } .x-box-blue .x-box-mr { background-image: url(../images/default/box/r-blue.gif); }.x-combo-list { border-color:#98c0f4; background-color:#ddecfe; font:normal 12px tahoma, arial, helvetica, sans-serif; } .x-combo-list-inner { background-color:#fff; } .x-combo-list-hd { font:bold 11px tahoma, arial, helvetica, sans-serif; color:#15428b; background-image: url(../images/default/layout/panel-title-light-bg.gif); border-bottom-color:#98c0f4; } .x-resizable-pinned .x-combo-list-inner { border-bottom-color:#98c0f4; } .x-combo-list-item { border-color:#fff; } .x-combo-list .x-combo-selected{ border-color:#a3bae9 !important; background-color:#dfe8f6; } .x-combo-list .x-toolbar { border-top-color:#98c0f4; } .x-combo-list-small { font:normal 11px tahoma, arial, helvetica, sans-serif; }.x-panel { border-color: #99bbe8; } .x-panel-header { color:#15428b; font-weight:bold; font-size: 11px; font-family: tahoma,arial,verdana,sans-serif; border-color:#99bbe8; background-image: url(../images/default/panel/white-top-bottom.gif); } .x-panel-body { border-color:#99bbe8; background-color:#fff; } .x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar { border-color:#99bbe8; } .x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { border-top-color:#99bbe8; } .x-panel-body-noheader, .x-panel-mc .x-panel-body { border-top-color:#99bbe8; } .x-panel-tl .x-panel-header { color:#15428b; font:bold 11px tahoma,arial,verdana,sans-serif; } .x-panel-tc { background-image: url(../images/default/panel/top-bottom.gif); } .x-panel-tl, .x-panel-tr, .x-panel-bl, .x-panel-br{ background-image: url(../images/default/panel/corners-sprite.gif); border-bottom-color:#99bbe8; } .x-panel-bc { background-image: url(../images/default/panel/top-bottom.gif); } .x-panel-mc { font: normal 11px tahoma,arial,helvetica,sans-serif; background-color:#dfe8f6; } .x-panel-ml { background-color: #fff; background-image:url(../images/default/panel/left-right.gif); } .x-panel-mr { background-image: url(../images/default/panel/left-right.gif); } .x-tool { background-image:url(../images/default/panel/tool-sprites.gif); } .x-panel-ghost { background-color:#cbddf3; } .x-panel-ghost ul { border-color:#99bbe8; } .x-panel-dd-spacer { border-color:#99bbe8; } .x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{ font:normal 11px arial,tahoma, helvetica, sans-serif; } .x-window-proxy { background-color:#c7dffc; border-color:#99bbe8; } .x-window-tl .x-window-header { color:#15428b; font:bold 11px tahoma,arial,verdana,sans-serif; } .x-window-tc { background-image: url(../images/default/window/top-bottom.png); } .x-window-tl { background-image: url(../images/default/window/left-corners.png); } .x-window-tr { background-image: url(../images/default/window/right-corners.png); } .x-window-bc { background-image: url(../images/default/window/top-bottom.png); } .x-window-bl { background-image: url(../images/default/window/left-corners.png); } .x-window-br { background-image: url(../images/default/window/right-corners.png); } .x-window-mc { border-color:#99bbe8; font: normal 11px tahoma,arial,helvetica,sans-serif; background-color:#dfe8f6; } .x-window-ml { background-image: url(../images/default/window/left-right.png); } .x-window-mr { background-image: url(../images/default/window/left-right.png); } .x-window-maximized .x-window-tc { background-color:#fff; } .x-window-bbar .x-toolbar { border-top-color:#99bbe8; } .x-panel-ghost .x-window-tl { border-bottom-color:#99bbe8; } .x-panel-collapsed .x-window-tl { border-bottom-color:#84a0c4; } .x-dlg-mask{ background-color:#ccc; } .x-window-plain .x-window-mc { background-color: #ccd9e8; border-color: #a3bae9 #dfe8f6 #dfe8f6 #a3bae9; } .x-window-plain .x-window-body { border-color: #dfe8f6 #a3bae9 #a3bae9 #dfe8f6; } body.x-body-masked .x-window-plain .x-window-mc { background-color: #ccd9e8; }.x-html-editor-wrap { border-color:#a9bfd3; background-color:#fff; } .x-html-editor-tb .x-btn-text { background-image:url(../images/default/editor/tb-sprite.gif); }.x-panel-noborder .x-panel-header-noborder { border-bottom-color:#99bbe8; } .x-panel-noborder .x-panel-tbar-noborder .x-toolbar { border-bottom-color:#99bbe8; } .x-panel-noborder .x-panel-bbar-noborder .x-toolbar { border-top-color:#99bbe8; } .x-tab-panel-bbar-noborder .x-toolbar { border-top-color:#99bbe8; } .x-tab-panel-tbar-noborder .x-toolbar { border-bottom-color:#99bbe8; }.x-border-layout-ct { background-color:#dfe8f6; } .x-accordion-hd { color:#222; font-weight:normal; background-image: url(../images/default/panel/light-hd.gif); } .x-layout-collapsed{ background-color:#d2e0f2; border-color:#98c0f4; } .x-layout-collapsed-over{ background-color:#d9e8fb; } .x-layout-split-west .x-layout-mini { background-image:url(../images/default/layout/mini-left.gif); } .x-layout-split-east .x-layout-mini { background-image:url(../images/default/layout/mini-right.gif); } .x-layout-split-north .x-layout-mini { background-image:url(../images/default/layout/mini-top.gif); } .x-layout-split-south .x-layout-mini { background-image:url(../images/default/layout/mini-bottom.gif); } .x-layout-cmini-west .x-layout-mini { background-image:url(../images/default/layout/mini-right.gif); } .x-layout-cmini-east .x-layout-mini { background-image:url(../images/default/layout/mini-left.gif); } .x-layout-cmini-north .x-layout-mini { background-image:url(../images/default/layout/mini-bottom.gif); } .x-layout-cmini-south .x-layout-mini { background-image:url(../images/default/layout/mini-top.gif); }.x-progress-wrap { border-color:#6593cf; } .x-progress-inner { background-color:#e0e8f3; background-image:url(../images/default/qtip/bg.gif); } .x-progress-bar { background-color:#9cbfee; background-image:url(../images/default/progress/progress-bg.gif); border-top-color:#d1e4fd; border-bottom-color:#7fa9e4; border-right-color:#7fa9e4; } .x-progress-text { font-size:11px; font-weight:bold; color:#fff; } .x-progress-text-back { color:#396095; }.x-list-header{ background-color:#f9f9f9; background-image:url(../images/default/grid/grid3-hrow.gif); } .x-list-header-inner div em { border-left-color:#ddd; font:normal 11px arial, tahoma, helvetica, sans-serif; } .x-list-body dt em { font:normal 11px arial, tahoma, helvetica, sans-serif; } .x-list-over { background-color:#eee; } .x-list-selected { background-color:#dfe8f6; } .x-list-resizer { border-left-color:#555; border-right-color:#555; } .x-list-header-inner em.sort-asc, .x-list-header-inner em.sort-desc { background-image:url(../images/default/grid/sort-hd.gif); border-color: #99bbe8; }.x-slider-horz, .x-slider-horz .x-slider-end, .x-slider-horz .x-slider-inner { background-image:url(../images/default/slider/slider-bg.png); } .x-slider-horz .x-slider-thumb { background-image:url(../images/default/slider/slider-thumb.png); } .x-slider-vert, .x-slider-vert .x-slider-end, .x-slider-vert .x-slider-inner { background-image:url(../images/default/slider/slider-v-bg.png); } .x-slider-vert .x-slider-thumb { background-image:url(../images/default/slider/slider-v-thumb.png); }.x-window-dlg .ext-mb-text, .x-window-dlg .x-window-header-text { font-size:12px; } .x-window-dlg .ext-mb-textarea { font:normal 12px tahoma,arial,helvetica,sans-serif; } .x-window-dlg .x-msg-box-wait { background-image:url(../images/default/grid/loading.gif); } .x-window-dlg .ext-mb-info { background-image:url(../images/default/window/icon-info.gif); } .x-window-dlg .ext-mb-warning { background-image:url(../images/default/window/icon-warning.gif); } .x-window-dlg .ext-mb-question { background-image:url(../images/default/window/icon-question.gif); } .x-window-dlg .ext-mb-error { background-image:url(../images/default/window/icon-error.gif); } ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/gray/panel/white-top-bottom.gif Content-Transfer-Encoding: Base64 R0lGODlhAQAsAcQAANra2vTiovHmwvrYXO3t7e7r3vrZYPnaavnZZfDozvjce/jc dPPkr/PjqPXglPDoyO7q2u3t6vvXWfnbb+/q1PHmvPXfjvShA/Tim/feh/fdgfLl te7s4u7s5vvXVv///yH5BAAAAAAALAAAAAABACwBAAU2IPARUccVEJU8QrUxTYA5 VqYpy3QgxiB5wKBwSCwaj8ikcslkXj7QqHRKrVqv2Kx2y+16t4AQADs= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/gray/tabs/tabs-sprite.gif Content-Transfer-Encoding: Base64 R0lGODlhGADCAYcAAED/QK6urr29vdra2tzc3N7e3t/f3+Dg4OHh4eLi4uTk5OXl 5ebm5ufn5+jo6Onp6erq6uzs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb2 9vf39/j4+Pn5+fr6+vv7+/z8/P7+/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACH5BAMAAAAALAAAAAAYAMIBAAj/AAEACECwoMGDCAMMHMGw ocOHEEcEIBCxYsQAI0Ro3Mixo0cRGEOIHEmypMkQGEGoXMmypUsQGD3InEmzpk0P GDvo3Mmzp88OGDcIHUq0qNENGDMoXcq0qdMMGC9InUq1qtULGC1o3cq1q1cLGCGI HUu2rFkIYc+qNZt2rVu0I96+bSv3LN26Ze/iHat3L1y/bOMCJtt3b2G8h+smlrt4 ruDBYhu7lbyWslrLdh9DxhwYMl/NgznnBQ1YNGHSfk1/9hwZtWHXiGErls2YtmPW f1mrbo1bYMLfCRdaHM4QI4HjyJMrX04gAIQC0KNLn069QIAJBrJr3869u4EAFxCI /x9Pvrx5BAEsJFjPvr379wkCYFBAv779+/gVyF/Av7///wAuEIAGDRRo4IEIJtjA gA/ohgFu8kH4oIMQXgAhBRBGAKEDECoA4QEfhqgbiCOK6FkAJJ6Y4mYrhtZiaS+m FqNhMyJWo2I3MpbjXDtO1mNlP14WpF1DslVkXkcSliRfS0bWJFpPomgii70BIMCV WGap5ZYCCEecRQEMwMCYZJZp5pkMOOfAmmy26eabDlz3wJx01mnnnQ+AB6EFEfTp 55+ABhqBfBIUauihiCYqgXwTNOroo5BGOsGAFVRq6aWYZlrBgBh06umnoIaKgXyi lioqqaam2imqqprKaqunXv8Aq6sUzFpqABHYeqoDuoYagAK9gopisJ8OS+yqBxyL rLKjJqusscdCS6y0wVLbq7W6YmurtrNyC6u3rYKrqripkuuqs9GiO6261bJ7rbvZ wrutvN3S+6294eI7rr7l8nsus8AFfNCXBBds0UcIJ3zSwgy/5PDDN0Us8U8UV3zU xRg/pfHGV3Xs8Vcgh4zbyCSXbPLJKKes8sost+zyyzDHLPPMNNds880456zzzoYJ 7LPBFjEn9NDVFW20d0gnfd7STMPn9NP5RS11gFRXreDVWPOs9dZcd+3112CHLfbY ZJdt9tlop60Wl2y3DXRFaMYtN5x0143n3XiTLOjefCv/6vffkgYuuKaEF87s4Ygn rvjijDfu+OOQRy755JRXbvnlmGeu+eacd+7556Bv6zNwAr3tUHMAmH56AAm3vpFE DMc+kkQP176SRBLnPpNEFfe+k0QYBz+URBsXv5REHic/lUQhN7+VRLhBz5r0nlEP mfWDYQ+Y9n5xv5f3eIFfl/hykf+W+W6hv5b6arF/lvtmwV+W/GTRP5b9YuEPgf78 Oze9/9UD4PUEmD0Cbs+A3UPg9xQYPgaOz4Hlg+D5JJg+Cq7Pgu0bXcBKp7riAGBo IESORIxGwuigJWko1M6kmMbC8WDlaTBkD1ikRsP6jKpqOOzPqLDGQwNpAINmecAP /3EzKiIC0SxFZE0SPYMV3FDgiGUZFG7ihBv94OYAUCQLFq+YxbFskTVf9EwYITPG wZQRMGf0Sxr3ska8tLEub5RLHN8yR7fUcS13VEsez7JHs/SxLH/UYhfFEkgvDhIC hSTkIROJyEU6sm2QxBIHO9gluVmSTCMQQN02ySYMCABvoKTTBgSAmw8IgG+o9JMH BPC3VhrKlIKLpaNAIIDC2dJSIRCAsiyQS2bR0pe6VNYvlWVKZhVTWRwI5rEyoExi WaCZwZIANHvlgGnqqprMwqaytHksbhLLm8ECJzWtaStxXpOcszJnOdEJK3Wmk52t cmc74akqecaTnqmyZz3xaRoqfeaTn6XyZz8BKiqBBpSgoTJoQREKqmoGBAA7 ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/gray/button/btn.gif Content-Transfer-Encoding: Base64 R0lGODlhEgDYEIcAAHt9f0D/QJqampubm5ycnJ2dnZ6enp+fn5ieoKCgoKGhoaKi oqOjo6SkpKWlpaampqenp6mpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOz s7S0tLu7u8fHx8rKys7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ 2dra2tvb29zc3N3d3d7e3uPj4+Xl5ebm5ufn5+np6erq6uvr6+zs7O3t7e7u7u/v 7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f///wAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAASANgQAAj/AAME6NBBoEAECAwGQGiw Aw0aBRcOGZJwoQcPCR0eOQIRwcSJCEuAAFECgQCHEAsA6AADRgcAAD6M/AAgQAGC BQSufKnzA02DBXIahKmQ6ECCSJMqRaqkqdOnUKNKnYqwqtWrVqdqVbKxq9evXrGK vTqyrNmzaNOqBfGwrdu3cOPKpRG0rt27dlvq3cu3r9+/MGAKHkx48IvDiBMrXsy4 ceHHhDskmZykgMePMM0i6ICkMxLLH4fADEE6xGavoDEDEMFaxGYjsI2kngiztesO RXIXmS0awIjfIzYTGU7EcpDjQWCSWE5ic2jLQKIDgVmieskOQrILsfyj+w+YJsKb /9iMPIjlHuh7gBe/WToQyzzi84B5ov6Jzd5/WNbBXwdMFACisJkPBPpgWQ4I5gBT CgymMGCBBya4YIObpdeDZThkiANMKnSowmby8WCZDSTaANMKKK6w2Q4s7mBZDTDW ABMLNLKwWX86WOYWTC302MJmCeZg2QxEzsCjj5tpiINlMjQpA0wuROnCZjdUeYNl MWQZA0yJbeaWZXtxiZiXbYGpl5iHkfmQmS2h+YKadCEQJgBdorSmnGfSOaadcc5Z 55d4tqlnmnyyGdigbxYa6KF/lrmom3AaCqmifu4JaKWEXppno3dimqimgnLa56aW OupppI8iiuqplJKaqamufv8Ka6ildhrrqre2Suurtu4qa6+M1jqqr7gSq2uwvA6L 7K/KTgrqssVCe6yzs0r7LLXAYtusqtNye6231WorKbjZkrutqOOim6q6rH7Lbq7u CpuuvOvS22645s6brL7M8hutuPXuG3C/A/+bb8HdvmtsvALfW67C1uILMcAOn2sv vBJfvHDGDWP8sMYRf9zxxiITXLG/CYNMsccWjxxyyyazjDLDMZMMs8ETH3wywjTj rLLOMvPMcc0vzzy0zy6vbLPRJSNNtNJFC910ykkDvbTUN1P9tNVR7+x10F9fHXbX YJctttlkn6122mxD7TbXb+cs989zV1331nc7rbfWe/f/zPfffgd+NOCDCz614Vkj znTihTd+uOOMPy555JQvbjnWl48dN92c29053p/3DXnmaG/u+emgoy765KSvbXrq sK9eOea0aw737XkTznrtpeMeuu6z25674ry77rvqwLfe9vGxJ1/88sOP/vzrsitP vfPC/0589shv33v0u3PfvPfGgx/899pLL3710zPP/vrYo9+9+vKPT3/56Ydf//v7 x4///Pr7n/0CCL38nU+A/EOg/woIwAMycIAOvB75HphACi5Qgvez4AQxSEAORtB9 FwThBkWYQQ9aj4QdROEHzXdCFrbPhfAbIQz7J0MDttCGL8RhDEuowhs20IcQBGIF /02Ywx8WMYhHHGIPkxjCGSqwhkbcYQqdqEEeUpGIUlyhDmloxS0+sYtR5OIUvVjF MYbxi2ZEYhaF2EQyYlGMWjxjGeOoRjiyEYp1RCMdlXjFJa6RiXjkoxv9aEdAgjGP c7zjIQUpxzfqUZFpZCQiHZlIQ0ayjY0k5CMtuUdMTlKTlfyjKAs5yk2WMpSkTKUp VYnKVbqylbCkpCxBOcs+2nKQt8xkLj+5S0n60pO/DCQwhynMYi6SmMc05iWV2Ulm QrKZyYzmMqUJzWlas5rYfKY2ObnNU9YSl+DUZTh5Oc5gUrObrPymONdJTnaa85ro fKU620nPd2aTm/j0Ji332f9LZMIzn+nkZzn9eU999tOZAJWnQN1J0HjGcqH1bGhC H3rQc050nvZ0KEYlatCBIrSjDP1oQCv6T5BGVKQKJWlBR+pRi5o0oxeFKExfylGW htSlNj0pTlPa0pLmdKY/rSlPb+rToeq0qBTt6UqNClSmCjWpRF0qVI8q1Y2idKpN xepTrbpTrV6Vq0gFa1VlulWyftWsXRWrRtEaVraOVaVrhWtMu0SZutr1rp7Jq173 Cpa+fiU2gA2sYHVD2MIaljiITaxiQ8PYxn5EO5CNrGTLQ9nKIsc9mM2sdPLD2c56 p0CgDa1oR0vaAlnotKhNT4hWy1r5tOi1sI0tjmZL2/7/BOm2uE2QknbLWw1Z6bfA De5chkvc4hr3uMhNrnKXy9zmOve50I2udKdL3epa97rYza52t8vd7nr3u+ANr3jH S97ymve86E2vetfL3va6973wja9850vf+tr3vvjNr373y9/++ve/AA6wgAdM4AIb +MAITrCCF8zgBjv4wRCOsIQnTOEKW/jCGM6whjfM4Q57+MMgDrGIR0ziEpv4xChO sYpXzOIWu/jFMI6xjGdM4xrb+MY4zrGOd8zjHvv4x0AOspCHTOQiG/nISE6ykpfM 5CY7+clQjrKUp0zlKlv5yljOspa3zOUue/nLYA6zmMdM5jKb+cxoTrOa18zmNrv5 /81wjrOc50znOtv5znjOs573LF/H+vnPgA60oAdN6MZa9tCX1ayio+PZRnsntZBW bWsnHZ/aWtq2uc20pjedg956WkMlCrWoRx2jUpv61MstkqpXzWonufrVsNaSrGdN a8DY+ta4zrWud83rXvv618AOtrCHTexiG/vYyE62spfN7GY7+9nQjra0p03talv7 2tjOtra3ze1ue/vb4A63uMdN7nKb+9zoTre6183udrv73fCOt7znTe962/ve+M63 vvfN7377+98AD7jAB07wghv84AhPuMIXzvCGO/zhEI+4xCdO8Ypb/OIYz7jGN87x jnv84yAPuchHTvKSm/zkKP9PucpXzvKWu/zlMI+5zGdO85rb/OY4z7nOd87znvv8 50APutCHTvSiG/3oSE+60pfO9KY7/elQj7rUp071qlv96ljPuta3zvWue/3rYA+7 2MdO9rKb/exoT7va1872tru93GtZS2nmTve62+bueM+73vEOnL77/e/MCbzgB2+d whv+8OJJvOIXz/jGi8c+kI+85ANE+cpbvkGYz7zmN8/5Bnno86APfYpGT/rS1+j0 qE+9j1bP+ta7/vU+kpLsZ0/7xtj+9rjPve53z/ve+/73wA++8IdP/OIb//jIT77y l8/85jv/+dCPvvSnT/3qW//62M++9rfP/e57//vgD7/U+MdP/vKb//zoT7/618/+ 9rv//fCPv/znT//62//++M+//vfP//77//8AGIACOIAEWIAGeIAImIAKuIAM2IAO +IAQGIESOIEUWIEWeIEYmIEauIEc2IEe+IEgGIIiOIIkWIImeIIomIIquIIs2IIu +IIwGIMyOIM0WIM2eIM4mIM6uIM82IM++INAGIRCOIREWIRGeIRImIRKuIRM2IRO +IRQGIVSOIVUWIVWeIVYmIVauIVc2IVe+IVgGIZiOIZkWIZmeIZomIZquIZs2IZu +IbwFxAAOw== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/gray/toolbar/bg.gif Content-Transfer-Encoding: Base64 R0lGODlhAgA4AIcAAObm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8P// /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACH5BAAAAP8ALAAAAAACADgAAAgzABcsAEAQQICDAQQoXDig 4QACECMWmFjAgMWLBzIeQMCxY4KPCRSIHEmypMmTKFOqPBkQADs= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/gray/panel/tool-sprites.gif Content-Transfer-Encoding: Base64 R0lGODlhHgBoAfeAAP///+Hh4ZycnLi4uOrq6vv7++jo6EZGRvf39+bm5vT09PDw 8ODg4JmZmePj43t7e1lZWfLy8rKysuTk5OLi4srKytXV1Xl5eVVVVc/Pz5SUlO/v 74WFhba2toqKisvLy6CgoL+/v9vb2/Hx8Zubm5CQkO7u7p6enkxMTLu7u6Ghofn5 +XZ2ds7OzoeHh9HR0aSkpJ2dndDQ0LS0tIGBgezs7F5eXoODg4iIiGdnZ319fYyM jJeXl8TExLe3t5qamqOjo4+Pj9fX146Ojn9/f7CwsMHBwfz8/LW1tZ+fn4uLi2lp ab6+vqWlpf7+/m9vb6KiopWVlY2Njb29vaioqICAgGFhYWRkZGJiYmVlZYSEhG1t bU5OTsPDw1tbW3x8fGhoaPX19a+vr7y8vK2trXp6emtra2xsbKenp6ysrFRUVH5+ flBQUFhYWG5ubrm5ubGxsTo6OlxcXHh4eHNzc6urq0BAQEhISHBwcJaWlkJCQjU1 NR8fH0lJSf39/VpaWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78i IGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxu czp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4w LWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8 cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjIt cmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4 bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnht cE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJl Zj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVm IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9z aCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1QkI4Rjg1RkU1MUYxMURGQTg1 Q0IzNzFDQzg3NDJFNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1QkI4Rjg2 MEU1MUYxMURGQTg1Q0IzNzFDQzg3NDJFNyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBz dFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVCQjhGODVERTUxRjExREZBODVDQjM3 MUNDODc0MkU3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVCQjhGODVFRTUx RjExREZBODVDQjM3MUNDODc0MkU3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3Jk ZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn4 9/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnI x8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmY l5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramlo Z2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4 NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkI BwYFBAMCAQAAIfkEAQAAgAAsAAAAAB4AaAEACP8AAQEaQLCgwQECBQpYyLChgIQD AEicSBEAQkACAmjcyDHAw4gVQ1rMKJKix4gFCkhIyXJlgZEBUrpsmfIkAAQSDkhA wDPnTpgAfPLEqROBTQUKfCbViRRoUKY+ASiwuaCqT51VF8Cs+jRqVZscfXKEubEr AI4CIjpYe1XCWgcw13bVCWCtzQQJfObViRdmArNRE9g04NOA4cJAoxowa5MAAQmO I0MmAJOyBACRg2K2WSCyZ8cvB2TsjNkz5gIeB5aceDFjx44PBR6cnRCjQ4e1Zx+s fRu37NUSW7+GrRp4cJLAObNczhIm8+c2h0qXDnO69aNIs2tXAHO7d6pZw2f/3Spe PNjhZUWXDbkxbV0HEuLLdwtXPdz58uveTXCgv/8Dfan313/+ASCYe4fhJ4FhMC2m 4GUGNPbZZ5X9FVICBHA2YWShjbYhaKmBtJpw6GkU20C6FcRbbwzlliJBK7J4oogl kVjiR8YdF4Bxyj3XnHo+LhcdBEQWWSQCQBH431nuKWDkk9ypB4CSBVIFQXkLXJmk SAcwGVEAEAwX5pYdTellXRC8pWaaW6oJV5d3QYDXnHjJuWVIcCL4pJGLSUllf2d+ mJmUybnX2YcdxiQoajgCZyN6M754kUIynojiizGyCJFxjw7XKKfIrdZjkM6lJBKj EQ21JwRIqsfTlEqe/5kdBPhBEGVGTek0X54RZXVleFqqx9UB4vF61qpg7uinkgEY 6wCt8xVZH0m6ylelewnISae2f/lpYF9dGjgYBIaVSy6D3lLUpWGNrTootbE6piGi zokE4qc1KlSiiRBJmmlvLmKaUKUzcqrvvviOGGpJo/pYapCo3mQdda5SNx12s27X XXZmagdeVUWGR55WBWZ1HphGpufajgSeZaJaz+4pl32wtuzAfnTm7JeFFeE1WLlA l9tg0EFLKGhlgmZo6KLOLRqiwRjtm5ps/g5cacAp/nvbpo4efGNxoO5YKEoQJ1p2 xBNTnFHaQ2HsXVPqNRUSUuCtypWwNS+5wMlPqv9cVsvtwbyWtG/FJVeBb+Fcp84C zmkmnT8TLbR6kgNt9IdICzrvhmY7nXBInb4WqcCUyoi1blr7Bna+USO8usJii2oo SxrUvtzDBdSugZDu8YRGA0bEMAAORbxa8e/BD1+8UU0qMEAFPXwwBQgawI2r89BL Tz3d7lUlRRceEPGDDzfcnZH34ItP/lfuBeCBDCHcEEATM2jwhLKuvR///PXfb5MD HthCCpAAgyKQgQNXmFYAAChAAhoQgTfDVgKqAIcZSIAKSShDgDKCFwpaEIMaPFBE DMOCPzwhCl6gwRrQlRESmhCFKmSXezwTBDYEoQjvCgANbYhDeS2NXkDy3Ov/QOc1 SPWLdLYx3RGzZjUlDrEioSMOjWDHo9lBDHem4l2qpsOqoVSHOhCQGPMish0iaWdj TSGSVLjXK18RSWTC4kqRAGCy9mkkZX7TCACM5LKXvWdwRFKT4eAyx8RJcE5EotPO +qLGOUXOXEAbmtDCWK7LbShzmfHM5ibUOUQ9rWut+xrVkEiw09GmiZr6DShXZsQp 1mhhImnYc3AHAOj0TlXW+SKSwnix5iHFjGeMWxrD6LHuufFX5gvAeOZYxy9tBI/4 GwsfA/fHmKWpcPaRSyHtcshscWuDAXBcIx2JIEgGTZJ7BEDRZpg0TJZGkz/kXNM8 +TkoFtFTS0QdKgGW/89Tli6VT6RIFNESUCjCkj1WdMiPRpMSArEkOjwRgAIY4sWK IeAACvBP23wpUYZwTJgZzWh/svMxASyAIeOJ4wKI5Z9m9jEjDMmjRg7QrP6gRXAC cABDsJmRtxzAAf4xZETw0htw4oVKPitnuQRQgUhSDmgHaGol2RkZpppGPZ+JKjxR 4hmrgmaejtHqvQoanHuKrp+72efW0GqQ1DWEayMyqxRz5BTZke2KQCobRBHwgInp 8gATw9gDBkvYB9wqANmh0lSMuYAHiMexIyNWeIhlk8Ja9gHR/JNNbVKBzl72AQrs bAWoFMGh4uWz3eLgUZUkQnUa5gGSk+QBJGfJCf9hckOb/EwnOffJuIbSiKNk4j/5 GVx9DnetZLWIXAnqSpEQyq61LBsWbbnFvvLEusZb20WHAtiNklEBg0VKeK2HWJEi ZaRspGNVBrtex2pFpf2pSnz3ZkeNDNa+mCXLRja7Wfe8ZbBrAbACffpToBZ4P4M9 7QMc17j+rJacIzQAbF/r1BYaYLaGwbAMI5I0ymA1abn1zG452VvWsRKfxfVnEgF6 KeGumLjNFehy25NcHVXxrqTKK8T2ytehWFeX2+VJdwVrWPAWGY3oRS942NtY9773 fCuV7Hzp+6X7BsDKelRPTWdK05u+R8ACHrCB19IfoX4rAQlG84JTG84H8wf/QK0F 2oQlzMIAQLVcGK4thT6suXhyEqwkrqeMf4viFhv3xcg1tIpLqUrfnvisMTZo7Bhm xRwzdMe3HKyPf1yx/nB3yL4M73gPm1iMonexbWyvk5+szKy01KUdwexYtMyRLns5 wKDF9cx6OmYyH/iQCU4zm+fkYAcnNcKvHWyF7Yzn/liOqo55wJ4zktXPhJhDgNZt iZ07Y36lOK3HVZ2iwY1o1UW6rISGNF2fS2kcF+ABzMHiAZjDY8KqLQDS0ah312jk fpO31OZNb3uzwmTyTHm+J7NvmWi9X9EJzgGEFWQ2fV1gbppWzRg36oONHWcJz1nZ fbKwszOcZ2hfks8f/7r2V4NIz+QOlMbfbqtaxS2pSZX7rY02sdQELekbR3c58F5o TJgz74fekieexS6QO+tpnmCnApf9twJGSyCBN5bgTja4qyVLZZdV4Mpg/3o0NfJ1 mtJU7P/TdYB3vUBf+9Ti37psBTSupLl33OOdXXaz8z5VDkdG2tPWYWQOMCGVE2DE 2uY5uh9NnJiraOY4dzyMIN+inHM73XPNEbtjWWmH6ThIPGaAABhwb+kw4AGk37d2 Ts+AYF4PKQw4QOtJakwG2B71tk9mVWwfe96zz5kCsKxr9PsAAsk67RZI/gOSbwG2 r4X5B2A+3OlkgeUrsnF4sUD0IadUA1hAABbQe/+5qh/+vr8TcyjHrZ91m20Rb5uI mCeo5G3O6Pm7tfIu7/b7nXvQisgy3p/nIzzmVxaVNm7zNmj0NqimXrzXgLq3AA3o e11nIsKXZStTfP9xfP7lAMzXgc7HgR2YfNOXM4yjWiQIYa5VOSHHbCqoZ1dFbSC2 fiLWfhyyf4PGePI3bjIXbpGng4/Hg/h3bsoVfzQmhDY2Nj/HATfwbjogdCyhhExo dFsUAHXgBRsgByDwBtmFb0ZRhVeYhU7XPBdQAlwAA20gAGogdWNYhmeYhgu4AB1w BUzwBB6wBB1gBSDAanAoh3Roh3g4gTpABzYAAVRwB1ygB3swdoE4iIV4iIn/+D9a IAIDoAEOMAcZgARYMGCROImVeImZeBdfIAQckAUJcAEv4AFxMGyhOIqleIqpOBhn MAAPgAIGkAVNgAd8sIIGEIuzWIu3mIuNgQLCiAIEIIx20AceRm3DSIzGiIyGh3ju p3hDiIMw54OTB4QLYUrkVn9C+HL8YoR11W61pAFRoAI7MAQ8kAc44AJmQ47miI7q yI7RoQUAUAISUQAIkAYu0CprQ4/2WEv5uI9HwQFHcARO4AcFcARNoAOkRpAGiZAK yZBU4QFQAAQgEAMxIAAkQAN6SJEWiZEayZFggQMwAAMgcAIayQNfMHYkaZIoSQIq 6UcOQAQjsAEbYAIb/6AAP+AGA0aTNomTOsmTd6EDIyAGKTAGYjACJJADw0aURomU SsmUg1EFTkABBFADFOAEKgAGukiVVomVWsmVjbEEHlACUrADSuABZmADyahDZGmW aKmWbPmMNDhW3ah/o+Ni9WeN9Hc1lgd/1PiN69Z/JjE7JoAGHBAEZJAATtgZHgAB OVACDCCFEkMGNEAENEADJFBR2qUBamADVmAD2IUdJUADadABLsABH3U9S2AFPAAF oEl7qVYVIOABJvWAWcEBoglrG0EFUlACs3ZiQ5ADOQAbD7cDO+Amg+QAOZCJaqI4 PdAFJdhmeBECU5Azj8QBQ3BOT2UYNoAF6+R3jv8BBAIQeJ6hAThgbTKIbSzHW9Lo jVPDl/eXjQlhnWMwBimQn/qZArUBBP6pAgAaoABanxswAgtwkyaQoAm6AEwgEDCQ ATKQARI6oRIqA1AACCEwAmyDAAowAkyQBB9gAI5RORagAhk6AgqQmqkJBQZQoCg6 ADyQAQ5AACxQoywAAnZGAAYgBCCQoRtQAxwgAgvEASBglSYwAj7AAx/AAA7AAiLA AAHAAifAAHghBEkQAgtQAwnAAQzgGCDgAjEgAgmwAR0QBRXwpCzQpQQAAkQgAEJq AVe6ARHiAgyQoA7AADhgAQxQA0jAAz1gAULAlDeZAAwABkIgAhZwAiGwAQz/0AEn AAQwAAUg0AAloAQykAAz0AA9kAEnMAS6UwIlsAMsIKGKagIioAQv8KS2JwKo+QEU MAM/0AUVcAMWIKRrwQAnsAUV8AGKWgOn+gIa0AEdoAEZ0AE38AEBMAMkYAQVUAUW EKzDyqm6yqsh4Ks7MAUVIAMWkAE90AEckAEMIAECwKxEwAQV8AIWIAM9cAJnUAEZ EAPVKgJJAKpBEARDUAIcoATIOgPj+gFDoEJlAAZLYAY5wALuCq814AAv8AGiJVof IAQOwK9GsLAf8AEZYLEMmwEiIAMnAAhMYBgJQAEUsBEUgCH8iRG7OqEy8AIsm3wd KxApMAAd4AM0K6wz/4sEvNEAJLCzPEsCP/ADtdEAQju0RNsAQVu0RZsQDRCBTGu0 gLC0TNuARru0xsEAQssAVXu1FxABXNu1XbsCVru0GOC1ZAu2WnsBW4u2aMu1YRC2 DIABcBsBcBu3EdC2Wtu1LZC3LdC1bju2XEu0fHu3ZNu1jHq1fju4EVC4S6u2aDsB jGt7hju3GDABkgu5SzsBjou5E6C3LUABbou5k4u5ROu5V4u5F6C5qDsBn0u5qau5 q6u2jtu4hFq6lAu3tTu5s9sArbu5eTsBBhC2uzu0vuu2K6CCZru0xVs5Zvu0USu1 AgG1zWu1Sou0RHu01Cu01nu92Uu9Shu9kPu83owrvVQLHG6btYuLuFx7vG+LvhGg vmtLvXYrtmMLv267tezbt+wbAfXLvoq7vujbv2hLAdRruW+LAQKMtAR8ASIbtaQr tgvMtA3MAAosshRMwapruBWcwRe8uAqMtCXbtwbswbk7ARQMwb8rtCT8wA1IASeM vMZLvC88teHrtNDbvE77tNeLvdObwwIREAA7 ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/gray/qtip/tip-sprite.gif Content-Transfer-Encoding: Base64 R0lGODlh9AFqA6IEAPHx8fT09Kampr+/vwAAAAAAAAAAAAAAACH5BAEAAAQALAAA AAD0AWoDAAP/SLJL/jDKSau9OOvNu/9gKI5kaZ5oqo5MIwxADKx0bd94ru987/8T GWCwAASOAaByyWw6n9Co9IEMAIrVqXbL7Xq/YFT1KjAiw+i0es1u18ZFoXtOr9vv XiFZj+/7/4CBI3pxMoKHiImKdoRlcouQkZKTTI18lJiZmpsilo+coKGinJ6Go6eo qYKlMaqur7BrrDOxtba3TrO4u7y9Nrq+wcLDHcDEx8jJxsnMzbvLztHSqdDT1teZ 1djb3Ija3eDhjEKFreLn6HPf6eztU+vu8fJA8PP297/kjqb4/f419f4JHLghIMGD CCMYTMiQ4MKGEPs9jEhR3sSKGNNdzMgR/9zGjiCvfQxJ0tnIkiiPnUzJ0tfKljBv vYxJ89XMmjhP3czJk5S+Sz2D9toptCgkokaTHkKqtKkfpk6j1oEqtSobqlazhsGq tSsXrl7DRgErtmyln5/Mqr1Ddq1bHW3fygWIlt/cu1vrmsPLN8/PLH0Db4FTBrDg w1AImzmCuLETwjDsOp7cQwgRBS0oa+7RQgDmzqBDix5NurTp06hTq17NurXr17Bj y55Nu7bt27hzm9bDu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59OvTrxKtiza9/O vbv37+DDix9Pvrz58+jTq1/Pvr379/Djy59Pv779+/jz69/Pv7////8ABijggAQW aOCBCCaInnUMNujggxBGKOGEFFZo4YUYZqjhhhx26OGHIIYo4ogklmjiiSimqOKK LLbo4oswxijjjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnkkkw26eSTUEYp 5ZRUVmnllVhmqeWWXHbp5ZdghinmmGSWaeaZaKap5ppstunmm3DGKeecdNZp5514 5qnnnnz26eefgAYq6KCEFmrooYgmquiijDbq6KOQRirppJRWaumlmGaq6aacdurp p6CGKuqopJZq6qmopqrqqqy26uqrsMYq66y01mrrrbjmquuuvPbq66/ABivssMQW a+yxyCar7LL/zDbr7LPQMqrgtNRWa+212Gar7bbcduvtt+CGK+645JZr7rnWRquu hLq16+678MYr77z01mvvvfiGtu6+DJbD77/P+QvwwMoJTPDBxRmM8MLAKczww7NA LLFeE1e8h8UYO4wxwhpvTHDHHgMMcsj8jkzyuiafHG3KKj/LcsvNvgzzsjLPnGzN Nh+Lc87F7szzsD7/HGzQQv9KdNG9Ho30rkovnWvTTt8KddS1Tk31rFZfHWvWWr/K ddetfg32qmKPnWrZZp+Kdtqlrs32qG6/HWrccn9Kd92d3o33pnrvnWnffl8KeOCV Dk74pIYfHmniij/KeOONPg75opJPnmjl/5YfinnmhW7O+aCefx5o6KL/SXrpfZ6O +p6qr55n667fCXvsdc5O+5y23x5n7rq/yXvvbf4O/JrCD59m8cafiXzyZS7P/JjO Px9m9NJ/SX31XV6P/Zbab59l995fCX74VY5P/pTmnx9l+uo/yX77Tb4P/5Lyz59k /fYfiX/+Re7P/5D++1+QAijAHxGwgD06IAJ3pMAF5qiBDrwRBCNYowlScEYWvGCM MqjBF3Gwgy36IAhXJMIRpqiEJjwRClNYohWycEQufGGIYijDD9Gwhh26IQ43pMMd ZqiHPrwQEINYoSEScUJGPGKEkqjEBzGxiQ16IhStI8UpUqeKVpQOFv+zCJ0tctE5 Xvwic8IoxoLto4xyIiMaj6PGNSbsjG50UxvjKJw50rFhcLyjmuyox97wsY8RA6SZ /ijIGBCykIcUZCIBucg+NlKPj7xjJOk4yThW0o2XXGMm0bjJMnZSjJ/8Yii5OMos ltKKp5xiKqG4yia2UomvPGIsiTjLINbSh7fcYS5xuMsa9lKGv3xhMFk4zBQW04TH HGEyQbjMDjZTg8+8YDQpOM0IVtOB11xgNhG4zQJ2U4Df/F84+TfO/JXTfuecXzrh t872tVN97zxfPMk3z/DV03v33F4+sbfP6vVTev98XkCZN9DkFdR4Bx1eQoG30N41 VHcPvV1EaTf/0dhV1HUXXV1GUbfR0nVUdB/9XEg5N9LMldRyJ51cSiG30sa1VHEv PVxMCTfTwNXUbzfdW07xttO69VRuP31bUNk21LQV1WxHHVtSwbbUrjVVa0+9WlSp NtWoVdVpV11aVpG21aJ1VWhf/VlYeTbWnJXVZmedWVphttaWtVVlbz1ZXEk215DV 1WN33VheM5bHQpJprxYDbMUEOzHCSsywEEPswxTLMMYuzLEc66tfxQTZg1X2Y5Kd LJguOzDOiiyzmvWSZ/812pKBNrRcKu2+VIuy06JWS6xVV2xX5trXYmm20MKty2pr Wyvp1lm/jRlve0ul4DLLuDQbLnGlhFxl/zX3ZspdLpSeiyzq6iy60nWSdY213Z5h N7tM6i6xxAu074JXSeQVVnqHZt7zImm9wIKv0drrXiPJ11f3TRp960uk/PLKv0zb L3+FBGBdFfhpAh4wkA6MKwZLLcEK9pGDbTXhqkE4wjyqMK00jLULY1hHHJZViLfm 4Q/jaMSwQrHXSmxiG6nYVS8OG4tbTKMYs8rGZJsxjWWEY1X1+Gw63jGMfowqIqst yEJ2kZFNteS2ITnJLGoyqaQMtydDWUVUFlWW52blK6Noy6ACs9267GUTidlTZ84b mctMojRzys18WzObRQRnTdX5b3KeM4jujCk+Cy7PevaQny016MIBOv/QHCo0pRSN uEMjWkOMllSkF+foR2No0pDCtOMqbWkLadpRn44cpztNoVAzytSUGzWp2aXqVUMI 1YqC9eVa7WoHyRpRt9YcrWvdr13zujq5NlSwO+frX09n2IRCNuiKbezoKFtQzx4d s5sdsGlTuznRBlS2TWftay9n234Cd+q67e3kiJtP52YducvNxnWz+43vrrG7413H edMbj/feoL3z7cd98zuQ/1ahvwNuyIETPN16QvjrDB5whePJ4bJj+L8hbieK107i /LY4nTSOO4znm+Np9Pi9Qb47kdOb5HBCue9MHm+Vy5Hl73Z58GDObpmzyebEo3m5 cb5HnXub58f/8/m1gY4moitP6NQ2+iCR3mylN4/pxnb6X6H+a6lDj+q8tjplsV5r rU+P6672+mbBvmqxW4/spDa7aNHeabVnj+2Wdntq4f5ouXOP7oi2O2zxHmi9f4/v evb7bQE/Z8GLj/BsNrxvEV9mxZeP8V52fHEhf2XJo4/yULY8czGfZM2vj/NC9vx0 Qb9j0buP9DQ2vXZR32LVx4/1JnZ9eGH/YdnTj/YYtj16cR9h3d+P9wr2/XuBP2Dh 64/4/DW+fZFfX+X3j/nudX5/oX9e6QOQ+uC1PoGxn13tD5D70vX+gsG/XPEbkPzE Nb+E0d9b9SeQ/bZ1f4bh/1r5M5D+qLU//4jxH1r9P5D/muV/JwaAkyWAEkSAfmWA LoaAiMSAiuSAjASBjiSBkESBkmSBlISBlqSBmMSBmuSBnASCniSCoESComSCpISC pqSCqMSCquSCrASDriSDsESDsmSDtISDtqSDuMSDuuSDvASEviSEwESEwmSExISE xqSEyMSEyuSEzASFziSF0ESF0mSF1ISF1qSF2MSF2uSF3ASG3iSG4ESG4mSG5ISG 5qSG6MSG6uSG7ASH7iSH8ESH8mSH9ISH9qSH+MSH+uSH/ASI/iSIAEWIAmWIBIWI BqWICMWICuWIDAWJDiWJEEWJEmWJFIWJFqWJGMWJGuWJHAWKHiWKIP9FiiJliiSF iialiijFiirliiwFiy4lizBFizJlizSFizalizjFizrlizwFjD4ljEBFjEJljESF jEaljEjFjErljEwFjU4ljVBFjVJljVSFjValjVjFjVrljVwFjl4ljmBFjmJljmSF jmaljmjFjmrljmwFj24lj3BFj3Jlj3SFj3alj3jFj3rlj3xFcFEGkIFFkINlkIWF kIelkInFkIvlkI0FkY8lkZElkCREkZaFkZhlkVimkZ3lkZ/FkScEkqRFkqYlkl9m kqulkq2FkgLnkmbGkrIlk7QFky1Ek7mFk7tlk22mk8Dlk8LFkzAElMdFlMkllHRm lM6llNCFlDNuxJTVBZXX5ZR7JpXcZZXeRZU2hJXjxZXlpZWC5pXqJZbsBZY5RJbx hZbzZZaJppb45Zb6xZY8BJf/RZcBJpeQZpcGppcIhpc/xJcNBpgP5peXJpgUZpgW RphChJgbxpgdppie5pgiJpkkBplFlAAAOw== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/gray/qtip/tip-anchor-sprite.gif Content-Transfer-Encoding: Base64 R0lGODlhJgAKAKIFAPT09Kampr+/v+fn5/Hx8QAAAAAAAAAAACH5BAEAAAUALAAA AAAmAAoAAANpWFqxRQRICUloLrtLVhAYM0zSEBADGGrMN3RKYHoCCYBTemmXMEqx GsjzA8xsOkyvCBQZQ5/J0FZS+agARk0yjI1mBaQq5rI5S1AhJjfOLCdRUlcUQrVZ LZ+F+aTVd3huJxA2EBuBiBkJADs= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/gray/panel/top-bottom.gif Content-Transfer-Encoding: Base64 R0lGODlhAQAsAYcAAM7OztfX19jY2Nra2tvb29zc3N3d3d7e3uDg4OHh4eLi4uPj 4+Xl5ebm5ufn5+jo6Onp6evr6+zs7O3t7e7u7vDw8PHx8fX19f///////woKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCiH5BAAAAP8ALAAAAAABACwBAAhEAAdgqEBhgoQIEB44YLBg gQIEBw4UIDBAQICLGDNq3Mixo8ePIEOKHEnSo4WTKFOqXMmypcuXMGPKnEmzpssL ODMMCAgAOw== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/gray/panel/corners-sprite.gif Content-Transfer-Encoding: Base64 R0lGODlhDAAsAYcAAEr/StfX19jY2Nra2tvb29zc3N7e3uDg4OHh4eLi4uPj4+Tk 5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/X1 9fb29vf39/j4+Pr6+vv7+////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAMACwBAAj/AAEMGEiwoMABIRIqTEjw w4WHEB9+GOihgsWLFj0M7ECho8eOHQZymECyJEkOAzdIWMly5YaBGiDInClTw8AM D3LqzJlhIAYHQIMCxTDQAoOjSI9aGEhBgdOnTikwhQpV6oAJCbJqzTphYIQDYMOC jTDwgYGzaM8+KJs27doBDQrInSu3wUAGBPLqzctg4IKCBf8OSCCgsOHCCQYiCMC4 MWMEih07hjxgseTHkS8HoGz5MmfNmzN7Fi35s2bToyuDRl2a9GTXjVm/Vn0aNmba qTu3xr1b92zfsW2H5v17tXDZwYknB36b+XDnyJsbVy69NvXn06Ef3349Onbr2rtz /w9PPrt58Odzp++9vjj69+rhs5fvPr79+ffr49+vv//y9v/RF2B+A/JXoH/VEZig gQsi+J2CDzIYoYPeVTgegA0eqGGGHE64oYcdWijeiOUJGOKFJoKoooglQsgihsOB gMGMNM4IwkAy1kjjjQPkqCMGPPqoY5A/2ohjkUAeWSSRSyr5I5NPOjmklDVCOWWP SFpZJZU7cmkklk2CGaWYVwq5JZlnmtklmmuq+aWbSbL5ZpZexgmnlm3SKaedet5Z J55zhunnnoDyKWifiB6q6JiDNpooo4+WGWmak+a5qKSXUpqppZBuGminoGIaqqaj cirqqaSiamqqrK7q6qeqwlfaqqyvGloqrbjaGquus/Jaa6HA/iksocM66qmvuQZL 7LLG3orss8o2u2u0lSZbbLXQXnsstdtq6yy333o7LY4blGtuuUGee2666qJL0EIL DXQQYAQBEBAAOw== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/gray/panel/left-right.gif Content-Transfer-Encoding: Base64 R0lGODlhDAABAIcAANra2vHx8f///woKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCiH5BAAAAP8ALAAAAAAMAAEAAAgMAAEICECwIEEBAAICADs= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/gray/panel/light-hd.gif Content-Transfer-Encoding: Base64 R0lGODlhAQAuANUAAPbPMfnonP7tsfvUQvnTQ/nhffnWUvvqofzsrvvxwPvXVv3v t////v/67vvZXPnca/nWWPXOMfv0xPvhe/733vnfd/z0yvrmjv722PzrpvfRNv/8 8v3ssvjRPvjjifrjgf757vz22v///fvnlP746Przxvvcafjlj/z11P/9+fvVSPnp ovveb/naZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAC4AAAYqwAhA0yEMVAaIwtF6mFiV wuTjOV1GgdUhg+AIFomSxIIKYSgkUGOTYoiCADs= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/gray/slider/slider-thumb.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAACoAAAAtCAMAAADvGAnRAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKtQTFRF4eHhs7Ozv7+/+/v77e3t5ubm kJCQ8fHx9PT01tbW39/f6+vr0tLS4uLimZmZz8/P2tra9fX1zMzMxsbGyMjIx8fH 09PT8vLy2dnZ+Pj47Ozs9vb27u7u8/Pz0dHR6enp9/f329vb5OTk7+/v5eXl3d3d 4+Pjtra22NjY1NTUwsLC5+fnxcXF+fn58PDw19fX6Ojo3Nzc3t7e4ODg6urq1dXV ysrKzs7OAAAAyBnhTQAAADl0Uk5T//////////////////////////////////// //////////////////////////////////////8AOqxlQAAAAUlJREFUeNrs1Mly gkAQgOGZ6TARkQFXRoXgArgkxi2L7/9kmU6qUHLo9pZL/oOUVV81FLYjLj1ZN7hQ iZ4cz6bdLHlNJ2+yT1I57bayx+Uk9yohJE2TxEENorTWMjRN3UQN646LofnBq9oa Pnsuhi7C9nGvYYgxtH20m0hDH2PofL2JPjQMMIbG+1HkpkYYO9X3fQ0+xj0rpuH7 wlDvJpoO5UOdXJH08nLdrBW9Wb++W1X3TlOrdrvxGNeylakRSdWP+97fVNF0NnUD DaR5URQM7bo7JwYWp7IsGZolyTIwYPG3Y6j7RxwqA7jnHYYGeXGeG3jCGPq8OM99 AyOMoV51imMDMcZODcPQQIgxdBK4DOBnwL2Bm2i6Ua06taU3q3PdrC2zhM0ap6Sg paiTfZLeSGfvoO6U/Kd/Sz3vDto8JenNapySXwIMAJ3sMBgNT+18AAAAAElFTkSu QmCC ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/gray/slider/slider-v-thumb.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAC0AAAAqCAMAAAAQwSIQAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKtQTFRF4eHhs7Ozv7+/+/v77e3t5ubm kJCQ8fHx9PT01tbW39/f6+vr0tLS4uLimZmZz8/P2tra9fX1zMzMxsbGyMjIx8fH 09PT8vLy2dnZ+Pj47Ozs9vb27u7u8/Pz0dHR6enp9/f329vb5OTk7+/v5eXl3d3d 4+Pjtra22NjY1NTUwsLC5+fnxcXF+fn58PDw19fX6Ojo3Nzc3t7e4ODg6urq1dXV ysrKzs7OAAAAyBnhTQAAADl0Uk5T//////////////////////////////////// //////////////////////////////////////8AOqxlQAAAAR5JREFUeNrU1Nlu wjAQBVDbJc1Kg0OIszYbZAHK2iX//2UVlUIWpM7kkftoHVlj+WpIs6JdrOb/kD2V tHSRalkcigDihM4krTpW5/kpFNyjCK06tatJvqwkKG2a9bmI8yjA6W/zeLucI/Rr mzxC6Jc2vsBNYi9XPxWJD2htGRspnKDdwp+iySekS9rT1AZ0U/ZatYRaNT6oWRcX 0gaT/Z200+WIJ94DH2umyHpWZHEueOB9MISeX65rXyhYvUivp/xvFJRW00K/XY7Q b204Rt8ryRPcJM674WZhFKC1eokFx+vN+qBM0WEE6S3rafYFtWrba5UDdnCU4ZYE 9J6SLtQCNJ2RPn8i3W1JlL5X8rleOUWXg5+3oVYNt+SvAAMAkN8wGM1Hxy0AAAAA SUVORK5CYII= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/images/gray/panel/white-top-bottom3.gif Content-Transfer-Encoding: Base64 R0lGODlhAQAsAfcAANDQ0P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABACwBAAgeAAMIHEiwoMGDCBMqXMiw ocOHECNKnEixosWLGAMCADs= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/img/treeIcons/compare_icon.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK 6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABfSURBVHja Yvz//z8DJYAFRERERJBkyooVKxhRDEAXxAfQLWNioBBQbAALIScS8gYLNgWWlhY4 NR8/fgIuD2IPojBA9hfIacQCRvSUCDIIXxigh8cgTAcUhwHdvQAQYAC6JibppIUW /QAAAABJRU5ErkJggg== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=xtheme-gray.css Content-Type: text/css; charset=utf-8; name=xtheme-gray.css Content-Location: http://www.icc.cat/vissir3/lib/ext/Ext/resources/css/xtheme-gray.css Content-Transfer-Encoding: 8bit /*! * Ext JS Library 3.4.0 * Copyright(c) 2006-2011 Sencha Inc. * licensing@sencha.com * http://www.sencha.com/license */ .ext-el-mask { background-color: #ccc; } .ext-el-mask-msg { border-color:#999; background-color:#ddd; background-image:url(../images/gray/panel/white-top-bottom.gif); background-position: 0 -1px; } .ext-el-mask-msg div { background-color: #eee; border-color:#d0d0d0; color:#222; font:normal 11px tahoma, arial, helvetica, sans-serif; } .x-mask-loading div { background-color:#fbfbfb; background-image:url(../images/default/grid/loading.gif); } .x-item-disabled { color: gray; } .x-item-disabled * { color: gray !important; } .x-splitbar-proxy { background-color: #aaa; } .x-color-palette a { border-color:#fff; } .x-color-palette a:hover, .x-color-palette a.x-color-palette-sel { border-color:#CFCFCF; background-color: #eaeaea; } /* .x-color-palette em:hover, .x-color-palette span:hover{ background-color: #eaeaea; } */ .x-color-palette em { border-color:#aca899; } .x-ie-shadow { background-color:#777; } .x-shadow .xsmc { background-image: url(../images/default/shadow-c.png); } .x-shadow .xsml, .x-shadow .xsmr { background-image: url(../images/default/shadow-lr.png); } .x-shadow .xstl, .x-shadow .xstc, .x-shadow .xstr, .x-shadow .xsbl, .x-shadow .xsbc, .x-shadow .xsbr{ background-image: url(../images/default/shadow.png); } .loading-indicator { font-size: 11px; background-image: url(../images/default/grid/loading.gif); } .x-spotlight { background-color: #ccc; }.x-tab-panel-header, .x-tab-panel-footer { background-color: #eaeaea; border-color:#d0d0d0; overflow:hidden; zoom:1; } .x-tab-panel-header, .x-tab-panel-footer { border-color:#d0d0d0; } ul.x-tab-strip-top{ background-color:#dbdbdb; background-image: url(../images/gray/tabs/tab-strip-bg.gif); border-bottom-color:#d0d0d0; } ul.x-tab-strip-bottom{ background-color:#dbdbdb; background-image: url(../images/gray/tabs/tab-strip-btm-bg.gif); border-top-color:#d0d0d0; } .x-tab-panel-header-plain .x-tab-strip-spacer, .x-tab-panel-footer-plain .x-tab-strip-spacer { border-color:#d0d0d0; background-color: #eaeaea; } .x-tab-strip span.x-tab-strip-text { font:normal 11px tahoma,arial,helvetica; color:#333; } .x-tab-strip-over span.x-tab-strip-text { color:#111; } .x-tab-strip-active span.x-tab-strip-text { color:#333; font-weight:bold; } .x-tab-strip-disabled .x-tabs-text { color:#aaaaaa; } .x-tab-strip-top .x-tab-right, .x-tab-strip-top .x-tab-left, .x-tab-strip-top .x-tab-strip-inner{ background-image: url(../images/gray/tabs/tabs-sprite.gif); } .x-tab-strip-bottom .x-tab-right { background-image: url(../images/gray/tabs/tab-btm-inactive-right-bg.gif); } .x-tab-strip-bottom .x-tab-left { background-image: url(../images/gray/tabs/tab-btm-inactive-left-bg.gif); } .x-tab-strip-bottom .x-tab-strip-over .x-tab-left { background-image: url(../images/gray/tabs/tab-btm-over-left-bg.gif); } .x-tab-strip-bottom .x-tab-strip-over .x-tab-right { background-image: url(../images/gray/tabs/tab-btm-over-right-bg.gif); } .x-tab-strip-bottom .x-tab-strip-active .x-tab-right { background-image: url(../images/gray/tabs/tab-btm-right-bg.gif); } .x-tab-strip-bottom .x-tab-strip-active .x-tab-left { background-image: url(../images/gray/tabs/tab-btm-left-bg.gif); } .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { background-image:url(../images/gray/tabs/tab-close.gif); } .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{ background-image:url(../images/gray/tabs/tab-close.gif); } .x-tab-panel-body { border-color:#d0d0d0; background-color:#fff; } .x-tab-panel-body-top { border-top: 0 none; } .x-tab-panel-body-bottom { border-bottom: 0 none; } .x-tab-scroller-left { background-image:url(../images/gray/tabs/scroll-left.gif); border-bottom-color:#d0d0d0; } .x-tab-scroller-left-over { background-position: 0 0; } .x-tab-scroller-left-disabled { background-position: -18px 0; opacity:.5; -moz-opacity:.5; filter:alpha(opacity=50); cursor:default; } .x-tab-scroller-right { background-image:url(../images/gray/tabs/scroll-right.gif); border-bottom-color:#d0d0d0; } .x-tab-panel-bbar .x-toolbar, .x-tab-panel-tbar .x-toolbar { border-color:#d0d0d0; } .x-form-field{ font:normal 12px tahoma, arial, helvetica, sans-serif; } .x-form-text, textarea.x-form-field{ background-color:#fff; background-image:url(../images/default/form/text-bg.gif); border-color:#C1C1C1; } .x-form-select-one { background-color:#fff; border-color:#C1C1C1; } .x-form-check-group-label { border-bottom: 1px solid #d0d0d0; color: #333; } .x-editor .x-form-check-wrap { background-color:#fff; } .x-form-field-wrap .x-form-trigger{ background-image:url(../images/gray/form/trigger.gif); border-bottom-color:#b5b8c8; } .x-form-field-wrap .x-form-date-trigger{ background-image: url(../images/gray/form/date-trigger.gif); } .x-form-field-wrap .x-form-clear-trigger{ background-image: url(../images/gray/form/clear-trigger.gif); } .x-form-field-wrap .x-form-search-trigger{ background-image: url(../images/gray/form/search-trigger.gif); } .x-trigger-wrap-focus .x-form-trigger{ border-bottom-color: #777777; } .x-item-disabled .x-form-trigger-over{ border-bottom-color:#b5b8c8; } .x-item-disabled .x-form-trigger-click{ border-bottom-color:#b5b8c8; } .x-form-focus, textarea.x-form-focus{ border-color:#777777; } .x-form-invalid, textarea.x-form-invalid{ background-color:#fff; background-image:url(../images/default/grid/invalid_line.gif); border-color:#c30; } .ext-webkit .x-form-invalid{ background-color:#fee; border-color:#ff7870; } .x-form-inner-invalid, textarea.x-form-inner-invalid{ background-color:#fff; background-image:url(../images/default/grid/invalid_line.gif); } .x-form-grow-sizer { font:normal 12px tahoma, arial, helvetica, sans-serif; } .x-form-item { font:normal 12px tahoma, arial, helvetica, sans-serif; } .x-form-invalid-msg { color:#c0272b; font:normal 11px tahoma, arial, helvetica, sans-serif; background-image:url(../images/default/shared/warning.gif); } .x-form-empty-field { color:gray; } .x-small-editor .x-form-field { font:normal 11px arial, tahoma, helvetica, sans-serif; } .ext-webkit .x-small-editor .x-form-field { font:normal 12px arial, tahoma, helvetica, sans-serif; } .x-form-invalid-icon { background-image:url(../images/default/form/exclamation.gif); } .x-fieldset { border-color:#CCCCCC; } .x-fieldset legend { font:bold 11px tahoma, arial, helvetica, sans-serif; color:#777777; }.x-btn{ font:normal 11px tahoma, verdana, helvetica; } .x-btn button{ font:normal 11px arial,tahoma,verdana,helvetica; color:#333; } .x-btn em { font-style:normal; font-weight:normal; } .x-btn-tl, .x-btn-tr, .x-btn-tc, .x-btn-ml, .x-btn-mr, .x-btn-mc, .x-btn-bl, .x-btn-br, .x-btn-bc{ background-image:url(../images/gray/button/btn.gif); } .x-btn-click .x-btn-text, .x-btn-menu-active .x-btn-text, .x-btn-pressed .x-btn-text{ color:#000; } .x-btn-disabled *{ color:gray !important; } .x-btn-mc em.x-btn-arrow { background-image:url(../images/default/button/arrow.gif); } .x-btn-mc em.x-btn-split { background-image:url(../images/default/button/s-arrow.gif); } .x-btn-over .x-btn-mc em.x-btn-split, .x-btn-click .x-btn-mc em.x-btn-split, .x-btn-menu-active .x-btn-mc em.x-btn-split, .x-btn-pressed .x-btn-mc em.x-btn-split { background-image:url(../images/gray/button/s-arrow-o.gif); } .x-btn-mc em.x-btn-arrow-bottom { background-image:url(../images/default/button/s-arrow-b-noline.gif); } .x-btn-mc em.x-btn-split-bottom { background-image:url(../images/default/button/s-arrow-b.gif); } .x-btn-over .x-btn-mc em.x-btn-split-bottom, .x-btn-click .x-btn-mc em.x-btn-split-bottom, .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom, .x-btn-pressed .x-btn-mc em.x-btn-split-bottom { background-image:url(../images/gray/button/s-arrow-bo.gif); } .x-btn-group-header { color: #666; } .x-btn-group-tc { background-image: url(../images/gray/button/group-tb.gif); } .x-btn-group-tl { background-image: url(../images/gray/button/group-cs.gif); } .x-btn-group-tr { background-image: url(../images/gray/button/group-cs.gif); } .x-btn-group-bc { background-image: url(../images/gray/button/group-tb.gif); } .x-btn-group-bl { background-image: url(../images/gray/button/group-cs.gif); } .x-btn-group-br { background-image: url(../images/gray/button/group-cs.gif); } .x-btn-group-ml { background-image: url(../images/gray/button/group-lr.gif); } .x-btn-group-mr { background-image: url(../images/gray/button/group-lr.gif); } .x-btn-group-notitle .x-btn-group-tc { background-image: url(../images/gray/button/group-tb.gif); } .x-toolbar{ border-color:#d0d0d0; background-color:#f0f0f0; background-image:url(../images/gray/toolbar/bg.gif); } .x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{ font:normal 11px arial,tahoma, helvetica, sans-serif; } .x-toolbar .x-item-disabled { color:gray; } .x-toolbar .x-item-disabled * { color:gray; } .x-toolbar .x-btn-mc em.x-btn-split { background-image:url(../images/default/button/s-arrow-noline.gif); } .x-toolbar .x-btn-over .x-btn-mc em.x-btn-split, .x-toolbar .x-btn-click .x-btn-mc em.x-btn-split, .x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split, .x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split { background-image:url(../images/gray/button/s-arrow-o.gif); } .x-toolbar .x-btn-mc em.x-btn-split-bottom { background-image:url(../images/default/button/s-arrow-b-noline.gif); } .x-toolbar .x-btn-over .x-btn-mc em.x-btn-split-bottom, .x-toolbar .x-btn-click .x-btn-mc em.x-btn-split-bottom, .x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom, .x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split-bottom { background-image:url(../images/gray/button/s-arrow-bo.gif); } .x-toolbar .xtb-sep { background-image: url(../images/default/grid/grid-split.gif); } .x-tbar-page-first{ background-image: url(../images/gray/grid/page-first.gif) !important; } .x-tbar-loading{ background-image: url(../images/gray/grid/refresh.gif) !important; } .x-tbar-page-last{ background-image: url(../images/gray/grid/page-last.gif) !important; } .x-tbar-page-next{ background-image: url(../images/gray/grid/page-next.gif) !important; } .x-tbar-page-prev{ background-image: url(../images/gray/grid/page-prev.gif) !important; } .x-item-disabled .x-tbar-loading{ background-image: url(../images/default/grid/loading.gif) !important; } .x-item-disabled .x-tbar-page-first{ background-image: url(../images/default/grid/page-first-disabled.gif) !important; } .x-item-disabled .x-tbar-page-last{ background-image: url(../images/default/grid/page-last-disabled.gif) !important; } .x-item-disabled .x-tbar-page-next{ background-image: url(../images/default/grid/page-next-disabled.gif) !important; } .x-item-disabled .x-tbar-page-prev{ background-image: url(../images/default/grid/page-prev-disabled.gif) !important; } .x-paging-info { color:#444; } .x-toolbar-more-icon { background-image: url(../images/gray/toolbar/more.gif) !important; } .x-resizable-handle { background-color:#fff; } .x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east, .x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west { background-image:url(../images/gray/sizer/e-handle.gif); } .x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south, .x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north { background-image:url(../images/gray/sizer/s-handle.gif); } .x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north{ background-image:url(../images/gray/sizer/s-handle.gif); } .x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ background-image:url(../images/gray/sizer/se-handle.gif); } .x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ background-image:url(../images/gray/sizer/nw-handle.gif); } .x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ background-image:url(../images/gray/sizer/ne-handle.gif); } .x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ background-image:url(../images/gray/sizer/sw-handle.gif); } .x-resizable-proxy{ border-color:#565656; } .x-resizable-overlay{ background-color:#fff; } .x-grid3 { background-color:#fff; } .x-grid-panel .x-panel-mc .x-panel-body { border-color:#d0d0d0; } .x-grid3-row td, .x-grid3-summary-row td{ font:normal 11px/13px arial, tahoma, helvetica, sans-serif; } .x-grid3-hd-row td { font:normal 11px/15px arial, tahoma, helvetica, sans-serif; } .x-grid3-hd-row td { border-left-color:#eee; border-right-color:#d0d0d0; } .x-grid-row-loading { background-color: #fff; background-image:url(../images/default/shared/loading-balls.gif); } .x-grid3-row { border-color:#ededed; border-top-color:#fff; } .x-grid3-row-alt{ background-color:#fafafa; } .x-grid3-row-over { border-color:#ddd; background-color:#efefef; background-image:url(../images/default/grid/row-over.gif); } .x-grid3-resize-proxy { background-color:#777; } .x-grid3-resize-marker { background-color:#777; } .x-grid3-header{ background-color:#f9f9f9; background-image:url(../images/gray/grid/grid3-hrow2.gif); } .x-grid3-header-pop { border-left-color:#d0d0d0; } .x-grid3-header-pop-inner { border-left-color:#eee; background-image:url(../images/default/grid/hd-pop.gif); } td.x-grid3-hd-over, td.sort-desc, td.sort-asc, td.x-grid3-hd-menu-open { border-left-color:#ACACAC; border-right-color:#ACACAC; } td.x-grid3-hd-over .x-grid3-hd-inner, td.sort-desc .x-grid3-hd-inner, td.sort-asc .x-grid3-hd-inner, td.x-grid3-hd-menu-open .x-grid3-hd-inner { background-color:#f9f9f9; background-image:url(../images/gray/grid/grid3-hrow-over2.gif); } .sort-asc .x-grid3-sort-icon { background-image: url(../images/gray/grid/sort_asc.gif); } .sort-desc .x-grid3-sort-icon { background-image: url(../images/gray/grid/sort_desc.gif); } .x-grid3-cell-text, .x-grid3-hd-text { color:#000; } .x-grid3-split { background-image: url(../images/default/grid/grid-split.gif); } .x-grid3-hd-text { color:#333; } .x-dd-drag-proxy .x-grid3-hd-inner{ background-color:#f9f9f9; background-image:url(../images/gray/grid/grid3-hrow-over2.gif); border-color:#ACACAC; } .col-move-top{ background-image:url(../images/gray/grid/col-move-top.gif); } .col-move-bottom{ background-image:url(../images/gray/grid/col-move-bottom.gif); } .x-grid3-row-selected { background-color:#CCCCCC !important; background-image: none; border-color:#ACACAC; } .x-grid3-cell-selected{ background-color: #CBCBCB !important; color:#000; } .x-grid3-cell-selected span{ color:#000 !important; } .x-grid3-cell-selected .x-grid3-cell-text{ color:#000; } .x-grid3-locked td.x-grid3-row-marker, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker{ background-color:#ebeadb !important; background-image:url(../images/default/grid/grid-hrow.gif) !important; color:#000; border-top-color:#fff; border-right-color:#6fa0df !important; } .x-grid3-locked td.x-grid3-row-marker div, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div{ color:#333 !important; } .x-grid3-dirty-cell { background-image:url(../images/default/grid/dirty.gif); } .x-grid3-topbar, .x-grid3-bottombar{ font:normal 11px arial, tahoma, helvetica, sans-serif; } .x-grid3-bottombar .x-toolbar{ border-top-color:#a9bfd3; } .x-props-grid .x-grid3-td-name .x-grid3-cell-inner{ background-image:url(../images/default/grid/grid3-special-col-bg.gif) !important; color:#000 !important; } .x-props-grid .x-grid3-body .x-grid3-td-name{ background-color:#fff !important; border-right-color:#eee; } .xg-hmenu-sort-asc .x-menu-item-icon{ background-image: url(../images/default/grid/hmenu-asc.gif); } .xg-hmenu-sort-desc .x-menu-item-icon{ background-image: url(../images/default/grid/hmenu-desc.gif); } .xg-hmenu-lock .x-menu-item-icon{ background-image: url(../images/default/grid/hmenu-lock.gif); } .xg-hmenu-unlock .x-menu-item-icon{ background-image: url(../images/default/grid/hmenu-unlock.gif); } .x-grid3-hd-btn { background-color:#f9f9f9; background-image:url(../images/gray/grid/grid3-hd-btn.gif); } .x-grid3-body .x-grid3-td-expander { background-image:url(../images/default/grid/grid3-special-col-bg.gif); } .x-grid3-row-expander { background-image:url(../images/gray/grid/row-expand-sprite.gif); } .x-grid3-body .x-grid3-td-checker { background-image: url(../images/default/grid/grid3-special-col-bg.gif); } .x-grid3-row-checker, .x-grid3-hd-checker { background-image:url(../images/default/grid/row-check-sprite.gif); } .x-grid3-body .x-grid3-td-numberer { background-image:url(../images/default/grid/grid3-special-col-bg.gif); } .x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner { color:#444; } .x-grid3-body .x-grid3-td-row-icon { background-image:url(../images/default/grid/grid3-special-col-bg.gif); } .x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer, .x-grid3-body .x-grid3-row-selected .x-grid3-td-checker, .x-grid3-body .x-grid3-row-selected .x-grid3-td-expander { background-image:url(../images/gray/grid/grid3-special-col-sel-bg.gif); } .x-grid3-check-col { background-image:url(../images/default/menu/unchecked.gif); } .x-grid3-check-col-on { background-image:url(../images/default/menu/checked.gif); } .x-grid-group, .x-grid-group-body, .x-grid-group-hd { zoom:1; } .x-grid-group-hd { border-bottom-color:#d0d0d0; } .x-grid-group-hd div.x-grid-group-title { background-image:url(../images/gray/grid/group-collapse.gif); color:#5F5F5F; font:bold 11px tahoma, arial, helvetica, sans-serif; } .x-grid-group-collapsed .x-grid-group-hd div.x-grid-group-title { background-image:url(../images/gray/grid/group-expand.gif); } .x-group-by-icon { background-image:url(../images/default/grid/group-by.gif); } .x-cols-icon { background-image:url(../images/default/grid/columns.gif); } .x-show-groups-icon { background-image:url(../images/default/grid/group-by.gif); } .x-grid-empty { color:gray; font:normal 11px tahoma, arial, helvetica, sans-serif; } .x-grid-with-col-lines .x-grid3-row td.x-grid3-cell { border-right-color:#ededed; } .x-grid-with-col-lines .x-grid3-row{ border-top-color:#ededed; } .x-grid-with-col-lines .x-grid3-row-selected { border-top-color:#B9B9B9; } .x-pivotgrid .x-grid3-header-offset table td { background: url(../images/gray/grid/grid3-hrow2.gif) repeat-x 50% 100%; border-left: 1px solid; border-right: 1px solid; border-left-color: #D0D0D0; border-right-color: #D0D0D0; } .x-pivotgrid .x-grid3-row-headers { background-color: #f9f9f9; } .x-pivotgrid .x-grid3-row-headers table td { background: #EEE url(../images/default/grid/grid3-rowheader.gif) repeat-x left top; border-left: 1px solid; border-right: 1px solid; border-left-color: #EEE; border-right-color: #D0D0D0; border-bottom: 1px solid; border-bottom-color: #D0D0D0; height: 18px; } .x-dd-drag-ghost{ color:#000; font: normal 11px arial, helvetica, sans-serif; border-color: #ddd #bbb #bbb #ddd; background-color:#fff; } .x-dd-drop-nodrop .x-dd-drop-icon{ background-image: url(../images/default/dd/drop-no.gif); } .x-dd-drop-ok .x-dd-drop-icon{ background-image: url(../images/default/dd/drop-yes.gif); } .x-dd-drop-ok-add .x-dd-drop-icon{ background-image: url(../images/default/dd/drop-add.gif); } .x-view-selector { background-color:#D6D6D6; border-color:#888888; }.x-tree-node-expanded .x-tree-node-icon{ background-image:url(../images/default/tree/folder-open.gif); } .x-tree-node-leaf .x-tree-node-icon{ background-image:url(../images/default/tree/leaf.gif); } .x-tree-node-collapsed .x-tree-node-icon{ background-image:url(../images/default/tree/folder.gif); } .x-tree-node-loading .x-tree-node-icon{ background-image:url(../images/default/tree/loading.gif) !important; } .x-tree-node .x-tree-node-inline-icon { background-image: none; } .x-tree-node-loading a span{ font-style: italic; color:#444444; } .ext-ie .x-tree-node-el input { width:15px; height:15px; } .x-tree-lines .x-tree-elbow{ background-image:url(../images/default/tree/elbow.gif); } .x-tree-lines .x-tree-elbow-plus{ background-image:url(../images/default/tree/elbow-plus.gif); } .x-tree-lines .x-tree-elbow-minus{ background-image:url(../images/default/tree/elbow-minus.gif); } .x-tree-lines .x-tree-elbow-end{ background-image:url(../images/default/tree/elbow-end.gif); } .x-tree-lines .x-tree-elbow-end-plus{ background-image:url(../images/gray/tree/elbow-end-plus.gif); } .x-tree-lines .x-tree-elbow-end-minus{ background-image:url(../images/gray/tree/elbow-end-minus.gif); } .x-tree-lines .x-tree-elbow-line{ background-image:url(../images/default/tree/elbow-line.gif); } .x-tree-no-lines .x-tree-elbow-plus{ background-image:url(../images/default/tree/elbow-plus-nl.gif); } .x-tree-no-lines .x-tree-elbow-minus{ background-image:url(../images/default/tree/elbow-minus-nl.gif); } .x-tree-no-lines .x-tree-elbow-end-plus{ background-image:url(../images/gray/tree/elbow-end-plus-nl.gif); } .x-tree-no-lines .x-tree-elbow-end-minus{ background-image:url(../images/gray/tree/elbow-end-minus-nl.gif); } .x-tree-arrows .x-tree-elbow-plus{ background-image:url(../images/gray/tree/arrows.gif); } .x-tree-arrows .x-tree-elbow-minus{ background-image:url(../images/gray/tree/arrows.gif); } .x-tree-arrows .x-tree-elbow-end-plus{ background-image:url(../images/gray/tree/arrows.gif); } .x-tree-arrows .x-tree-elbow-end-minus{ background-image:url(../images/gray/tree/arrows.gif); } .x-tree-node{ color:#000; font: normal 11px arial, tahoma, helvetica, sans-serif; } .x-tree-node a, .x-dd-drag-ghost a{ color:#000; } .x-tree-node a span, .x-dd-drag-ghost a span{ color:#000; } .x-tree-node .x-tree-node-disabled a span{ color:gray !important; } .x-tree-node div.x-tree-drag-insert-below{ border-bottom-color:#36c; } .x-tree-node div.x-tree-drag-insert-above{ border-top-color:#36c; } .x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a{ border-bottom-color:#36c; } .x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a{ border-top-color:#36c; } .x-tree-node .x-tree-drag-append a span{ background-color:#ddd; border-color:gray; } .x-tree-node .x-tree-node-over { background-color: #eee; } .x-tree-node .x-tree-selected { background-color: #ddd; } .x-tree-drop-ok-append .x-dd-drop-icon{ background-image: url(../images/default/tree/drop-add.gif); } .x-tree-drop-ok-above .x-dd-drop-icon{ background-image: url(../images/default/tree/drop-over.gif); } .x-tree-drop-ok-below .x-dd-drop-icon{ background-image: url(../images/default/tree/drop-under.gif); } .x-tree-drop-ok-between .x-dd-drop-icon{ background-image: url(../images/default/tree/drop-between.gif); } .x-date-picker { border-color:#585858; background-color:#fff; } .x-date-middle,.x-date-left,.x-date-right { background-image: url(../images/gray/shared/hd-sprite.gif); color:#fff; font:bold 11px "sans serif", tahoma, verdana, helvetica; } .x-date-middle .x-btn .x-btn-text { color:#fff; } .x-date-middle .x-btn-mc em.x-btn-arrow { background-image:url(../images/gray/toolbar/btn-arrow-light.gif); } .x-date-right a { background-image: url(../images/gray/shared/right-btn.gif); } .x-date-left a{ background-image: url(../images/gray/shared/left-btn.gif); } .x-date-inner th { background-color:#D8D8D8; background-image: url(../images/gray/panel/white-top-bottom.gif); border-bottom-color:#AFAFAF; font:normal 10px arial, helvetica,tahoma,sans-serif; color:#595959; } .x-date-inner td { border-color:#fff; } .x-date-inner a { font:normal 11px arial, helvetica,tahoma,sans-serif; color:#000; } .x-date-inner .x-date-active{ color:#000; } .x-date-inner .x-date-selected a{ background-image: none; background-color:#D8D8D8; border-color:#DCDCDC; } .x-date-inner .x-date-today a{ border-color:darkred; } .x-date-inner .x-date-selected span{ font-weight:bold; } .x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { color:#aaa; } .x-date-bottom { border-top-color:#AFAFAF; background-color:#D8D8D8; background:#D8D8D8 url(../images/gray/panel/white-top-bottom.gif) 0 -2px; } .x-date-inner a:hover, .x-date-inner .x-date-disabled a:hover{ color:#000; background-color:#D8D8D8; } .x-date-inner .x-date-disabled a { background-color:#eee; color:#bbb; } .x-date-mmenu{ background-color:#eee !important; } .x-date-mmenu .x-menu-item { font-size:10px; color:#000; } .x-date-mp { background-color:#fff; } .x-date-mp td { font:normal 11px arial, helvetica,tahoma,sans-serif; } .x-date-mp-btns button { background-color:#4E565F; color:#fff; border-color:#C0C0C0 #434343 #434343 #C0C0C0; font:normal 11px arial, helvetica,tahoma,sans-serif; } .x-date-mp-btns { background-color:#D8D8D8; background:#D8D8D8 url(../images/gray/panel/white-top-bottom.gif) 0 -2px; } .x-date-mp-btns td { border-top-color:#AFAFAF; } td.x-date-mp-month a,td.x-date-mp-year a { color: #333; } td.x-date-mp-month a:hover,td.x-date-mp-year a:hover { color:#333; background-color:#FDFDFD; } td.x-date-mp-sel a { background-color:#D8D8D8; background:#D8D8D8 url(../images/gray/panel/white-top-bottom.gif) 0 -2px; border-color:#DCDCDC; } .x-date-mp-ybtn a { background-image:url(../images/gray/panel/tool-sprites.gif); } td.x-date-mp-sep { border-right-color:#D7D7D7; }.x-tip .x-tip-close{ background-image: url(../images/gray/qtip/close.gif); } .x-tip .x-tip-tc, .x-tip .x-tip-tl, .x-tip .x-tip-tr, .x-tip .x-tip-bc, .x-tip .x-tip-bl, .x-tip .x-tip-br, .x-tip .x-tip-ml, .x-tip .x-tip-mr { background-image: url(../images/gray/qtip/tip-sprite.gif); } .x-tip .x-tip-mc { font: normal 11px tahoma,arial,helvetica,sans-serif; } .x-tip .x-tip-ml { background-color: #fff; } .x-tip .x-tip-header-text { font: bold 11px tahoma,arial,helvetica,sans-serif; color:#444; } .x-tip .x-tip-body { font: normal 11px tahoma,arial,helvetica,sans-serif; color:#444; } .x-form-invalid-tip .x-tip-tc, .x-form-invalid-tip .x-tip-tl, .x-form-invalid-tip .x-tip-tr, .x-form-invalid-tip .x-tip-bc, .x-form-invalid-tip .x-tip-bl, .x-form-invalid-tip .x-tip-br, .x-form-invalid-tip .x-tip-ml, .x-form-invalid-tip .x-tip-mr { background-image: url(../images/default/form/error-tip-corners.gif); } .x-form-invalid-tip .x-tip-body { background-image:url(../images/default/form/exclamation.gif); } .x-tip-anchor { background-image:url(../images/gray/qtip/tip-anchor-sprite.gif); }.x-menu { background-color:#f0f0f0; background-image:url(../images/default/menu/menu.gif); } .x-menu-floating{ border-color:#7D7D7D; } .x-menu-nosep { background-image:none; } .x-menu-list-item{ font:normal 11px arial,tahoma,sans-serif; } .x-menu-item-arrow{ background-image:url(../images/gray/menu/menu-parent.gif); } .x-menu-sep { background-color:#e0e0e0; border-bottom-color:#fff; } a.x-menu-item { color:#222; } .x-menu-item-active { background-image: url(../images/gray/menu/item-over.gif); background-color: #f1f1f1; border-color:#ACACAC; } .x-menu-item-active a.x-menu-item { border-color:#ACACAC; } .x-menu-check-item .x-menu-item-icon{ background-image:url(../images/default/menu/unchecked.gif); } .x-menu-item-checked .x-menu-item-icon{ background-image:url(../images/default/menu/checked.gif); } .x-menu-item-checked .x-menu-group-item .x-menu-item-icon{ background-image:url(../images/gray/menu/group-checked.gif); } .x-menu-group-item .x-menu-item-icon{ background-image:none; } .x-menu-plain { background-color:#fff !important; } .x-menu .x-date-picker{ border-color:#AFAFAF; } .x-cycle-menu .x-menu-item-checked { border-color:#B9B9B9 !important; background-color:#F1F1F1; } .x-menu-scroller-top { background-image:url(../images/default/layout/mini-top.gif); } .x-menu-scroller-bottom { background-image:url(../images/default/layout/mini-bottom.gif); }.x-box-tl { background-image: url(../images/default/box/corners.gif); } .x-box-tc { background-image: url(../images/default/box/tb.gif); } .x-box-tr { background-image: url(../images/default/box/corners.gif); } .x-box-ml { background-image: url(../images/default/box/l.gif); } .x-box-mc { background-color: #eee; background-image: url(../images/default/box/tb.gif); font-family: "Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif; color: #393939; font-size: 12px; } .x-box-mc h3 { font-size: 14px; font-weight: bold; } .x-box-mr { background-image: url(../images/default/box/r.gif); } .x-box-bl { background-image: url(../images/default/box/corners.gif); } .x-box-bc { background-image: url(../images/default/box/tb.gif); } .x-box-br { background-image: url(../images/default/box/corners.gif); } .x-box-blue .x-box-bl, .x-box-blue .x-box-br, .x-box-blue .x-box-tl, .x-box-blue .x-box-tr { background-image: url(../images/default/box/corners-blue.gif); } .x-box-blue .x-box-bc, .x-box-blue .x-box-mc, .x-box-blue .x-box-tc { background-image: url(../images/default/box/tb-blue.gif); } .x-box-blue .x-box-mc { background-color: #c3daf9; } .x-box-blue .x-box-mc h3 { color: #17385b; } .x-box-blue .x-box-ml { background-image: url(../images/default/box/l-blue.gif); } .x-box-blue .x-box-mr { background-image: url(../images/default/box/r-blue.gif); } .x-combo-list { border-color:#ccc; background-color:#ddd; font:normal 12px tahoma, arial, helvetica, sans-serif; } .x-combo-list-inner { background-color:#fff; } .x-combo-list-hd { font:bold 11px tahoma, arial, helvetica, sans-serif; color:#333; background-image: url(../images/default/layout/panel-title-light-bg.gif); border-bottom-color:#BCBCBC; } .x-resizable-pinned .x-combo-list-inner { border-bottom-color:#BEBEBE; } .x-combo-list-item { border-color:#fff; } .x-combo-list .x-combo-selected{ border-color:#777 !important; background-color:#f0f0f0; } .x-combo-list .x-toolbar { border-top-color:#BCBCBC; } .x-combo-list-small { font:normal 11px tahoma, arial, helvetica, sans-serif; }.x-panel { border-color: #d0d0d0; } .x-panel-header { color:#333; font-weight:bold; font-size: 12px; font-family: tahoma,arial,verdana,sans-serif; border-color:#d0d0d0; background-image: url(../images/gray/panel/white-top-bottom.gif); } .x-panel-body { border-color:#d0d0d0; background-color:#fff; } .icc-separator{ background-color:#e90; } .x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar { border-color:#d0d0d0; } .x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { border-top-color:#d0d0d0; } .x-panel-body-noheader, .x-panel-mc .x-panel-body { border-top-color:#d0d0d0; } .x-panel-tl .x-panel-header { color:#333; font:bold 11px tahoma,arial,verdana,sans-serif; } .x-panel-tc { background-image: url(../images/gray/panel/top-bottom.gif); } .x-panel-tl, .x-panel-tr, .x-panel-bl, .x-panel-br{ background-image: url(../images/gray/panel/corners-sprite.gif); border-bottom-color:#d0d0d0; } .x-panel-bc { background-image: url(../images/gray/panel/top-bottom.gif); } .x-panel-mc { font: normal 11px tahoma,arial,helvetica,sans-serif; background-color:#f1f1f1; } .x-panel-ml { background-color: #fff; background-image:url(../images/gray/panel/left-right.gif); } .x-panel-mr { background-image: url(../images/gray/panel/left-right.gif); } .x-tool { background-image:url(../images/gray/panel/tool-sprites.gif); } .x-panel-ghost { background-color:#f2f2f2; } .x-panel-ghost ul { border-color:#d0d0d0; } .x-panel-dd-spacer { border-color:#d0d0d0; } .x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{ font:normal 11px arial,tahoma, helvetica, sans-serif; } .x-window-proxy { background-color:#fcfcfc; border-color:#d0d0d0; } .x-window-tl .x-window-header { color:#555; font:bold 11px tahoma,arial,verdana,sans-serif; } .x-window-tc { background-image: url(../images/gray/window/top-bottom.png); } .x-window-tl { background-image: url(../images/gray/window/left-corners.png); } .x-window-tr { background-image: url(../images/gray/window/right-corners.png); } .x-window-bc { background-image: url(../images/gray/window/top-bottom.png); } .x-window-bl { background-image: url(../images/gray/window/left-corners.png); } .x-window-br { background-image: url(../images/gray/window/right-corners.png); } .x-window-mc { border-color:#d0d0d0; font: normal 11px tahoma,arial,helvetica,sans-serif; background-color:#e8e8e8; } .x-window-ml { background-image: url(../images/gray/window/left-right.png); } .x-window-mr { background-image: url(../images/gray/window/left-right.png); } .x-window-maximized .x-window-tc { background-color:#fff; } .x-window-bbar .x-toolbar { border-top-color:#d0d0d0; } .x-panel-ghost .x-window-tl { border-bottom-color:#d0d0d0; } .x-panel-collapsed .x-window-tl { border-bottom-color:#d0d0d0; } .x-dlg-mask{ background-color:#ccc; } .x-window-plain .x-window-mc { background-color: #E8E8E8; border-color: #D0D0D0 #EEEEEE #EEEEEE #D0D0D0; } .x-window-plain .x-window-body { border-color: #EEEEEE #D0D0D0 #D0D0D0 #EEEEEE; } body.x-body-masked .x-window-plain .x-window-mc { background-color: #E4E4E4; } .x-html-editor-wrap { border-color:#BCBCBC; background-color:#fff; } .x-html-editor-tb .x-btn-text { background-image:url(../images/default/editor/tb-sprite.gif); } .x-panel-noborder .x-panel-header-noborder { border-bottom-color:#d0d0d0; } .x-panel-noborder .x-panel-tbar-noborder .x-toolbar { border-bottom-color:#d0d0d0; } .x-panel-noborder .x-panel-bbar-noborder .x-toolbar { border-top-color:#d0d0d0; } .x-tab-panel-bbar-noborder .x-toolbar { border-top-color:#d0d0d0; } .x-tab-panel-tbar-noborder .x-toolbar { border-bottom-color:#d0d0d0; } .x-border-layout-ct { background-color:#f0f0f0; } .x-border-layout-ct { background-color:#f0f0f0; } .x-accordion-hd { color:#444; font-weight:bold; font-size: 11px; background-image: url(../images/gray/panel/light-hd.gif); /*background-image: url(../images/gray/panel/light-hd2.gif);*/ } .x-layout-collapsed{ background-color:#dfdfdf; border-color:#d0d0d0; } .x-layout-collapsed-over{ background-color:#e7e7e7; } .x-layout-split-west .x-layout-mini { background-image:url(../images/default/layout/mini-left.gif); } .x-layout-split-east .x-layout-mini { background-image:url(../images/default/layout/mini-right.gif); } .x-layout-split-north .x-layout-mini { background-image:url(../images/default/layout/mini-top.gif); } .x-layout-split-south .x-layout-mini { background-image:url(../images/default/layout/mini-bottom.gif); } .x-layout-cmini-west .x-layout-mini { background-image:url(../images/default/layout/mini-right.gif); } .x-layout-cmini-east .x-layout-mini { background-image:url(../images/default/layout/mini-left.gif); } .x-layout-cmini-north .x-layout-mini { background-image:url(../images/default/layout/mini-bottom.gif); } .x-layout-cmini-south .x-layout-mini { background-image:url(../images/default/layout/mini-top.gif); } .x-progress-wrap { border-color:#8E8E8E; } .x-progress-inner { background-color:#E7E7E7; background-image:url(../images/gray/qtip/bg.gif); } .x-progress-bar { background-color:#BCBCBC; background-image:url(../images/gray/progress/progress-bg.gif); border-top-color:#E2E2E2; border-bottom-color:#A4A4A4; border-right-color:#A4A4A4; } .x-progress-text { font-size:11px; font-weight:bold; color:#fff; } .x-progress-text-back { color:#5F5F5F; } .x-list-header{ background-color:#f9f9f9; background-image:url(../images/gray/grid/grid3-hrow2.gif); } .x-list-header-inner div em { border-left-color:#ddd; font:normal 11px arial, tahoma, helvetica, sans-serif; } .x-list-body dt em { font:normal 11px arial, tahoma, helvetica, sans-serif; } .x-list-over { background-color:#eee; } .x-list-selected { background-color:#f0f0f0; } .x-list-resizer { border-left-color:#555; border-right-color:#555; } .x-list-header-inner em.sort-asc, .x-list-header-inner em.sort-desc { background-image:url(../images/gray/grid/sort-hd.gif); border-color: #d0d0d0; } .x-slider-horz, .x-slider-horz .x-slider-end, .x-slider-horz .x-slider-inner { background-image:url(../images/default/slider/slider-bg.png); } .x-slider-horz .x-slider-thumb { background-image:url(../images/gray/slider/slider-thumb.png); } .x-slider-vert, .x-slider-vert .x-slider-end, .x-slider-vert .x-slider-inner { background-image:url(../images/default/slider/slider-v-bg.png); } .x-slider-vert .x-slider-thumb { background-image:url(../images/gray/slider/slider-v-thumb.png); } .x-window-dlg .ext-mb-text, .x-window-dlg .x-window-header-text { font-size:12px; } .x-window-dlg .ext-mb-textarea { font:normal 12px tahoma,arial,helvetica,sans-serif; } .x-window-dlg .x-msg-box-wait { background-image:url(../images/default/grid/loading.gif); } .x-window-dlg .ext-mb-info { background-image:url(../images/gray/window/icon-info.gif); } .x-window-dlg .ext-mb-warning { background-image:url(../images/gray/window/icon-warning.gif); } .x-window-dlg .ext-mb-question { background-image:url(../images/gray/window/icon-question.gif); } .x-window-dlg .ext-mb-error { background-image:url(../images/gray/window/icon-error.gif); } .my-header .x-panel-header { color: #555; font-weight:bold; font-size: 11px; font-family: tahoma,arial,verdana,sans-serif; /*border-color:#d0d0d0;*/ border: 0; background-image: url(../images/gray/panel/white-top-bottom2.gif); } .my-header3 .x-panel-header { color: #555; font-weight:bold; font-size: 11px; font-family: tahoma,arial,verdana,sans-serif; /*border-color:#d0d0d0;*/ border: 0; background-image: url(../images/gray/panel/white-top-bottom3.gif); } .my-icon { background-image: url(../images/gray/panel/icc-square2.gif); } .my-icon-compare { background-image: url(../../../../../img/treeIcons/compare_icon.png); } .x-panel-notstyled { /*background-image:url(../img/slider-thumb.png);*/ background-color:#00f; } ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/openlayers/theme/default/img/blank.gif Content-Transfer-Encoding: Base64 R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAQAIBRAA7 ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/gif Content-Location: http://www.icc.cat/vissir3/lib/openlayers/theme/default/img/overview_replacement.gif Content-Transfer-Encoding: Base64 R0lGODlhDwAPAIABAMwAAP///yH5BAEKAAEALAAAAAAPAA8AAAImjB+Au8oGopwO UoriqXrX/HWJZ0mJhp0byTYh156X6c0i8z0rUwAAOw== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=style.css Content-Type: text/css; charset=utf-8; name=style.css Content-Location: http://www.icc.cat/vissir3/lib/openlayers/theme/default/style.css Content-Transfer-Encoding: 8bit div.olMap { z-index: 0; padding: 0px!important; margin: 0px!important; cursor: default; } div.olMapViewport { text-align: left; } div.olLayerDiv { -moz-user-select: none; } .olLayerGoogleCopyright { left: 2px; bottom: 2px; } .olLayerGooglePoweredBy { left: 2px; bottom: 15px; } .olControlAttribution { font-size: smaller; right: 3px; bottom: 4.5em; position: absolute; display: block; } .olControlScale { right: 3px; bottom: 3em; display: block; position: absolute; font-size: smaller; } .olControlScaleLine { display: block; position: absolute; left: 10px; bottom: 15px; font-size: xx-small; } .olControlScaleLineBottom { border: solid 2px black; border-bottom: none; margin-top:-2px; text-align: center; } .olControlScaleLineTop { border: solid 2px black; border-top: none; text-align: center; } .olControlPermalink { right: 3px; bottom: 1.5em; display: block; position: absolute; font-size: smaller; } div.olControlMousePosition { bottom: 0em; right: 0px; display: block; position: absolute; font-family: Arial; } .olControlOverviewMapContainer { position: absolute; bottom: 50px; right: 0px; } .olControlOverviewMapElement { padding: 10px 18px 10px 10px; background-color: #00008B; -moz-border-radius: 1em 0 0 0; } .olControlOverviewMapMinimizeButton { right: 0px; bottom: 100px; } .olControlOverviewMapMaximizeButton { right: 0px; bottom: 100px; } .olControlOverviewMapExtentRectangle { overflow: hidden; background-image: url("img/blank.gif"); cursor: move; border: 2px dotted red; } .olControlOverviewMapRectReplacement { overflow: hidden; cursor: move; background-image: url("img/overview_replacement.gif"); background-repeat: no-repeat; background-position: center; } .olLayerGeoRSSDescription { float:left; width:100%; overflow:auto; font-size:1.0em; } .olLayerGeoRSSClose { float:right; color:gray; font-size:1.2em; margin-right:6px; font-family:sans-serif; } .olLayerGeoRSSTitle { float:left;font-size:1.2em; } .olPopupContent { padding:5px; overflow: auto; } .olControlNavToolbar { width:0px; height:0px; } .olControlNavToolbar div { display:block; width: 28px; height: 28px; top: 300px; left: 6px; position: relative; } .olControlNavigationHistory { background-image: url("img/navigation_history.png"); background-repeat: no-repeat; width: 24px; height: 24px; } .olControlNavigationHistoryPreviousItemActive { background-position: 0px 0px; } .olControlNavigationHistoryPreviousItemInactive { background-position: 0px -24px; } .olControlNavigationHistoryNextItemActive { background-position: -24px 0px; } .olControlNavigationHistoryNextItemInactive { background-position: -24px -24px; } .olControlNavToolbar .olControlNavigationItemActive { background-image: url("img/panning-hand-on.png"); background-repeat: no-repeat; } .olControlNavToolbar .olControlNavigationItemInactive { background-image: url("img/panning-hand-off.png"); background-repeat: no-repeat; } .olControlNavToolbar .olControlZoomBoxItemActive { background-image: url("img/drag-rectangle-on.png"); background-color: orange; background-repeat: no-repeat; } .olControlNavToolbar .olControlZoomBoxItemInactive { background-image: url("img/drag-rectangle-off.png"); background-repeat: no-repeat; } .olControlEditingToolbar { float:right; right: 0px; height: 30px; width: 200px; } .olControlEditingToolbar div { background-image: url("img/editing_tool_bar.png"); background-repeat: no-repeat; float:right; width: 24px; height: 24px; margin: 5px; } .olControlEditingToolbar .olControlNavigationItemActive { background-position: -103px -23px; } .olControlEditingToolbar .olControlNavigationItemInactive { background-position: -103px -0px; } .olControlEditingToolbar .olControlDrawFeaturePointItemActive { background-position: -77px -23px; } .olControlEditingToolbar .olControlDrawFeaturePointItemInactive { background-position: -77px -0px; } .olControlEditingToolbar .olControlDrawFeaturePathItemInactive { background-position: -51px 0px; } .olControlEditingToolbar .olControlDrawFeaturePathItemActive { background-position: -51px -23px; } .olControlEditingToolbar .olControlDrawFeaturePolygonItemInactive { background-position: -26px 0px; } .olControlEditingToolbar .olControlDrawFeaturePolygonItemActive { background-position: -26px -23px ; } div.olControlSaveFeaturesItemActive { background-image: url(img/save_features_on.png); background-repeat: no-repeat; background-position: 0px 1px; } div.olControlSaveFeaturesItemInactive { background-image: url(img/save_features_off.png); background-repeat: no-repeat; background-position: 0px 1px; } .olHandlerBoxZoomBox { border: 2px solid red; position: absolute; background-color: white; opacity: 0.50; font-size: 1px; filter: alpha(opacity=50); } .olHandlerBoxSelectFeature { border: 2px solid blue; position: absolute; background-color: white; opacity: 0.50; font-size: 1px; filter: alpha(opacity=50); } .olControlPanPanel { top: 10px; left: 5px; } .olControlPanPanel div { background-image: url(img/pan-panel.png); height: 18px; width: 18px; cursor: pointer; position: absolute; } .olControlPanPanel .olControlPanNorthItemInactive { top: 0px; left: 9px; background-position: 0px 0px; } .olControlPanPanel .olControlPanSouthItemInactive { top: 36px; left: 9px; background-position: 18px 0px; } .olControlPanPanel .olControlPanWestItemInactive { position: absolute; top: 18px; left: 0px; background-position: 0px 18px; } .olControlPanPanel .olControlPanEastItemInactive { top: 18px; left: 18px; background-position: 18px 18px; } .olControlZoomPanel { top: 71px; left: 14px; } .olControlZoomPanel div { background-image: url(img/zoom-panel.png); position: absolute; height: 18px; width: 18px; cursor: pointer; } .olControlZoomPanel .olControlZoomInItemInactive { top: 0px; left: 0px; background-position: 0px 0px; } .olControlZoomPanel .olControlZoomToMaxExtentItemInactive { top: 18px; left: 0px; background-position: 0px -18px; } .olControlZoomPanel .olControlZoomOutItemInactive { top: 36px; left: 0px; background-position: 0px 18px; } .olPopupCloseBox { background: url("img/close.gif") no-repeat; cursor: pointer; } .olFramedCloudPopupContent { padding: 5px; overflow: auto; } .olControlNoSelect { -moz-user-select: none; } .olImageLoadError { background-color: transparent; opacity: 0.5; filter: alpha(opacity=50); /* IE */ } /** * Cursor styles */ .olCursorWait { cursor: wait; } .olDragDown { cursor: move; } .olDrawBox { cursor: crosshair; } .olControlDragFeatureOver { cursor: move; } .olControlDragFeatureActive.olControlDragFeatureOver.olDragDown { cursor: -moz-grabbing; } /** * Layer switcher */ .olControlLayerSwitcher { position: absolute; top: 25px; right: 0px; width: 20em; font-family: sans-serif; font-weight: bold; margin-top: 3px; margin-left: 3px; margin-bottom: 3px; font-size: smaller; color: white; background-color: transparent; } .olControlLayerSwitcher .layersDiv { padding-top: 5px; padding-left: 10px; padding-bottom: 5px; padding-right: 75px; background-color: darkblue; width: 100%; height: 100%; } .olControlLayerSwitcher .layersDiv .baseLbl, .olControlLayerSwitcher .layersDiv .dataLbl { margin-top: 3px; margin-left: 3px; margin-bottom: 3px; } .olControlLayerSwitcher .layersDiv .baseLayersDiv, .olControlLayerSwitcher .layersDiv .dataLayersDiv { padding-left: 10px; } .olControlLayerSwitcher .maximizeDiv, .olControlLayerSwitcher .minimizeDiv { top: 5px; right: 0px; } ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/app/img/icon_zoomin.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAB3RJTUUH0wkLDiwV 3B2DHgAAAAlwSFlzAAALEgAACxIB0t1+/AAAAARnQU1BAACxjwv8YQUAAADVUExU RQAAADktEteySlFAGr/B04+TsgAJUDUzA/brOqLD0QAAZjlh9kxIBJe/zb3s7Mvx 8cDu7na3xZTi4qfn57fr6wtNTarn5/r+/pXi4pfi4pjj4ws6Oqjn58zx8aPD0Zfj 48Hu7qro6Jvk5Jnj47Lq6uL396TD0s7y8gtkZAtubgtgYCeYmAs/P6XD0s/y8t/3 9+/7+8Xv7wtzc6zo6L3t7abn57/t7dDz8/v+/sTu7q7p6Xu3xp3k5NHz8/P8/Lzt 7Zrj45m/zny4xtDy8sXw8Hm3xabD0gBuC1kAAAABdFJOUwBA5thmAAAApklEQVR4 2mNgwAVYWNnY2FhZUMXY2NzcdNnYWFDEnGzMnV2UXZFEWdisbWztjOwdpBwRoqxs SuYWFkaWVlJmbKwwQTZdPX0DQyNjE1MzTja4oJq6hqaWto60liySoJy8gqKStLKK Kj9CkJVNQlJKSlpGRJYfYSYLm6CQsIioGL84J4qbePn4BQSAmrlQfcTJycnGxsXN g8Xv7BzMWEKGkYlGojhiAgDcWA5O/RrbAwAAAABJRU5ErkJggg== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/app/img/icon_zoomout.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAB3RJTUUH0wkLDiwV 3B2DHgAAAAlwSFlzAAALEgAACxIB0t1+/AAAAARnQU1BAACxjwv8YQUAAADSUExU RQAAADktEteySlFAGr/B04+TsgAJUDUzA/brOqLD0QAAZjlh9kxIBJe/zb3s7Mvx 8cDu7na3xZTi4qfn57fr66vn56rn5/r+/pXi4pfi4pjj46jn58zx8aPD0Zfj48Hu 7qro6Jvk5Jrj45nj47Lq6uL396TD0s7y8gtkZAtubgtgYCeYmAs/Pws6OqXD0s/y 8t/39+/7+8Xv76zo6L3t7abn57/t7dDz8/v+/sTu7q7p6Xu3xp3k5NHz8/P8/Lzt 7Zm/zny4xtDy8sXw8Hm3xabD0t3vRsgAAAABdFJOUwBA5thmAAAApUlEQVR42rXR 2xaBUBAG4LD3z86hkNOWQ+UYQqiQs97/lbihWkuX5vJba2bNPyMISUUoAEriBgSB BZCY3Xz3/jCeESU4+qezfdH5NVQKzfU8e3/gDugHYS1Xa9vebHcOwxdH48nUnM0X phrBTrfX13RjMJRCpGi2OOdtRZXCmQTlSlWp1aUGi+1ULEmy/G4W44kYY4CYL/zI ns1lflwmlf6TJnziBcMgDj6hDjjWAAAAAElFTkSuQmCC ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/app/img/icon_pan.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAB3RJTUUH0wkLDiwV 3B2DHgAAAAlwSFlzAAALEgAACxIB0t1+/AAAAARnQU1BAACxjwv8YQUAAADbUExU RQAAAAAJUMPS3LLE0LLEz6C0w22Gm+fy9+Tw9uXy9+Xw9tvp767AzOHr8ejy9unz 9+jz9+fz9+fx9sTT3Nbg5eTu8uny9+rz98/c5IqdrOXt8ebu8uv0+Oz0+erz+eDr 8bbEze/1+ez0+O31+ez1+evz+dLe5JKiriYmJufv8+70+Ov0+evz9+Ls8bvIz/L2 +u/2+vD2+u71+c3Y3vX5+/P4+/D1+djh5Z6qsvD3+sLM0PL3+u70+eTr7/H3+vD2 +e/2+fD1+vL5+uvy9fb6/PT5+/T4+/H2+fb5+8VqdPEAAAABdFJOUwBA5thmAAAA wklEQVR42pXO6VLCQBAE4G05lSORK2AScFmVUcMVILAcCcgh7/9EpACTAFVU2T+/ 6poexu6G6BZov0teOG22oJ0L9xcR/HFBUsJbg4Vlcj1ID8slaBWUaSbhOOA25guE M9Lhth/o0xPScER0MrM5npyx2+sTt4UQpmEM/k7S5xf3SXxbVrsT7IA3hXh71zTl oxXii26YdU1TG6+R71EqV3xTq7UIMuTyivpcKEbN11T68SmTvcKHWDyeSF4iwzHs nzkAagAWW9+fYeMAAAAASUVORK5CYII= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/app/img/resultset_previous.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAA AKJQTFRFAAAAETCwEjO0Ezm0Ezm3FEC5FUe9Fkq9F1LAGVzEGVzGG2XJMV/EJ27N N2vJKnLPPXfQOnzUQYDWSIXWSofZUInZU43ZWZDdWpDbX5XcYJXdYpXaYpfhZpjb ZZnfZZnhZ5rcaZvca5vha53gbp/dcaDgcaHecqHfdaTjd6TgeqbheqblfKnhgavj g63jhq/ljbLmi7Pllbjolbnombvpmr3qhjXUFwAAAAF0Uk5TAEDm2GYAAAABYktH RACIBR1IAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH2AIaESYqclxTzAAA AFtJREFUGNNjYCAeKMmj8uVkxFH4UtqmIsh8CQ0TY0Ekvpiqib4BP4Ivqmykq67H jRAQkjTUVNDiQtLCK6wjq8aBbCingIoiG4q17HzSrKgOY+ZhQXM6IxORfgQAZ2gF zPI9SIMAAAAASUVORK5CYII= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/app/img/resultset_next.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAA AKVQTFRFAAAJFEG3FUW5Fkq9Fk7AF1C9GFPAGFnEGVnGGmLGGmLJI27NLHLNO3HM PHTPNXfSPXfQP3rQQ3/TQ4TWR4TWS4jWU47bYJXdYZfdYpfhbqDicqHfdKLidKPg daPfdaTjd6TgeabgeafmfqjhfKnhfKnofqnogKrjgavigavjgKvogKvqh6/kh7Do irHkkLXnkrfombvpmbvqocHso8LtqMfurcjv/jEClgAAAAF0Uk5TAEDm2GYAAAAB YktHRACIBR1IAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH2AIaESYWXTMv SwAAAFtJREFUGNNjYCAKaKmhCWiryqAKKJnpiqMISJmayIsgC0gaGxhK8CAJiBmp a+qJciIEhPVlFTSEOBAC/DrSKoJsSFq4lRUFWJEN5ZLjY0axlp2XCdVhLIwMJAAA gNwFzmhYliYAAAAASUVORK5CYII= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/app/img/icon_zoomfull.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAB3RJTUUH0wkLDiwV 3B2DHgAAAAlwSFlzAAALEgAACxIB0t1+/AAAAARnQU1BAACxjwv8YQUAAAFcUExU RQAAADktEgBCUNeySlFAGipWVH6np4Ogw7vOzr7M3IChqI28vJS13StXVoqpzr3S 0gAAZrnLyyYmJpPExJu/6FuNWyyJLJWrqq/R4sfv87fR4zlh9pnMzKPI9GCVYC6S Lq7HraTl66vv8Kru7snz9NL09KW5pKbM95rMzDGZMbDLsJbL3Kbt6cn09KjN95zN zafM95rNzZnNmc3w79T29vb7/MPt7JK5kp7OzqnN92meaTdqaM3m5rnT5qzw8q3P 3qa7pqvO+GygbDxtbJu0s6Xm7Kvv8aLi56i9pyd5J6DQ0EChQG6hbj5vbTqeOs7m 5tLy+JnN4KvCqimAKVF+UUKiQnCicEGiQW+ibz+hP8be3laFViqDKkOjQ3CjcNLl +8rj45zA6nGjcUSjRD6gPjtsaqTK9pTFxVuOW3KkcqzP+DygPJ3OzjCYMF+UX6LR 0aHQ0KvP+J/Pz2SaZFOS3EoAAAABdFJOUwBA5thmAAAA90lEQVR42mNgwAOEQABd KMvH0UIPRVgoP7agsMhSX70YISqUmRyX5ZOdY6CRm8cEE0tKTgqNSEnVM0xLF8mA igrFxoVGRDpb2sQnJIryQASFQsPCIyKdLP2B1kfxRMeARYW8vH18nf38hWwDAgWC gkMggo5OzhaWLkKudiZu7gIenhBBC0sraxshWzsTU10dewEHiKCevoGhkZAxUExJ 2UzAHGqTuoamlpC2DlBMRUqAC+okGVk5eQUBRaCYqoAaF8z1wiKiYuICEpJSAtIs cH8ycfPw8vELCAgIMjIjiTKxsrFzcHJxMSCLAoWBAMRAEYUDRhzRAADdyigZBbRz HgAAAABJRU5ErkJggg== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/app/img/info_off.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABgAAAAWCAMAAADto6y6AAAAAXNSR0IArs4c6QAA AwBQTFRF0dDOnJuQ+Pv26efj8fHxVVNTtrWrvr69YlYzw7+1NTQ0paWk4N/dhYR4 6unjn56TVlRUtbSzxMTEhYSE2NfOdXR04t3Q+vbr9/f36Ofix8S2paGZzsu85+fi 9/Xy+Pf18d+rExERRUNC7uzfZWRk6Obi6+rl8sAhqaie7u3q+vv+39vM+/r5aGho JSIi/vrt0rhjzc3MAAAA9fX1w8LB+fj2dnNr09PTs7Cnzc3C5uPT9vf++ffw9Pb9 6erp5rcj//zx6unk6ebi7e3t9vTr7u7hjYyLtrOk8MAulpWT/fz7vryt/f3/kI+N vbu1ZWNd1askaWhhk5ORq6un9PLrlJKEXFpS7MZT+Pj1sbCv7r8yfXxxrYwr//32 paGUjYx/3dzYgoF36+nkuK2N+Pn+ureo8e/qr6ydkpGP4+Lds7Chubm4cG5o9fXu lJSK7ezqn56e7Ovp8fHm6+vr1dLE5ublVVNO4eLhwr+xfXx6qqml///76Mt22tbI 28Bs+/nx/////fz4/v79sK6nsKWF+Pn2XV1a+fz36ezn6unn//75mpuY/v/++/37 9vb25+nvrq2noKCjLCwompmX//rsYF9e////+vn37Ozn/Pz7/f38/Pv6+vn47+/v +/v5+/r4/Pz89PT0+vr6l5aW//7+/f396+vm+fn5/v388PDw8/Pz/v397Ovm7Ovn 99Rv6+zm0tHHra2ir4oU6+vllpGK7+/u7Ozm6+zn18GB/Pnu/////fns/Pv7/v// /v7/4+HR+PXrl5WKmJeN+/z/+/v7+/v66+vn3NnJ6unZyh0A+vz5////6uvl+vn6 1tLE///9y8e52dbH+vn59PTz+vr5n4IuoqGgqqeb1NHB2NXFj5CU8O/v0s7B6urq 8vLympmOwcC/6ejmwp0oHBsYsbK429zh7vDu7/DxkZGV7Onh0Miw////////7Ojf 0tHRuLiviYmFe2kwlpWVlZaU+fn4+vjywKZT+f335+fkqaWXy8Cfzs7S6+ro2NTG 69B+/P77wmHmigAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAH dElNRQfaBBQMJRs+BhOOAAABlElEQVQoz2XSMUvDQBgG4EhsHQxJGltIdnO4OIQK pUvhGujWpZmyna4REUI9dAoOWYRsQpdCqzRiSWhLqbsi9xPcRP0DUTCDo19MFdF3 evmeu+E+jjstF6V/mU1PuWmx3vubqFyccrNy3GPsn8046Sa+YZBhEKjBeMzy9CRO iqMI2tgNBl2vugjMbD6JASYsYg1y4XmO7JteYBKAeAIQhRF7UdN0ZB1tknRwJRgg IUAYIuqqQXA1ouZ9N3XTxGFhBvM5qrnqMDX8gk9XBZUSazFHAAghpd9wG/2O7Cvm I2kkbzWUwR7Cz6RK+nSt4K9RQRCSY4r3ADASHUr6RMgA5kTZT3B2Q8RYeYaB4BR8 OFFTTs5fsAjAY3FhOQCXst8ihmIVWkzEGfA8Mw5LirHReV/fcQ79zS7jxSUwstE5 s23DvtyWK/A+ngfQMmD0obXdLrXlyjr7AY3PN0oqdvvh+qtq+Q1tuWt6vGvlTWtK 3JaufQNb2MmyNbe4erH8AUXTdaYv09T11zr3+zOs3B3cPuWfwfsEy03VBggEZT8A AAAASUVORK5CYII= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/app/img/dwld_off.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABgAAAAWCAIAAABVH8vfAAAABGdBTUEAAK/INwWK 6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAOgSURBVHja lFRNTFxVFH73vvfmzf8bBVp+jG2wDbZQEzFB0xgbbWzBxIVN2LNj1QULdyzUhG5d adzoSiPGotFNdVcbEoyCWi3olIIEKLypA8PMm3n/991+710Z6LSL9ixm7rv33O98 5zvnXBKG7Hbx5urqSqlkSE9ueV0/eeLkwJkh5dZfv2xubh7tPDr08qtPDMN5uWyA BJbK8p3lixffMYxSpVIXp7quy7J8yJkzxrBjmqbv+9jp7u4OAide0/aOns6uY9ev /6jUqtXFxaXJyclEIoE7yWRybGwMWLiMO9icm5ubnZ0dHR2dn59fWlrC/YmJibNn h/ajcN/3GvW6gi/XdR3HoZSKyEpshBABBCKGYXieh88gCLCwbZsQCqKHs6TiDx4h ZGcMi4elEOyCfYPnwz4RIxx4scEJvMC2BQVHIoxww1rwbVoQ+AdASFCkdtgDF4CO I/jAGxrEa9YSDKdKrFgICQUQ1IHe6XRapJOKTVVVLZ9wiVO3LNf1Td+SZZVLoUzk IPRJrM8BIwQX/GdmZnK5nBACm9Vq9dSpvp9//X2dj/S8diGbonfM459eK9cabjZD x94sCHaCEQcdcEHtkMj09HRTBRxFdZQlj2VOXxq5cK5XzySebUs9nZLXdhrFtbJM 2zgnB4yQmmVZAwMDaLYWIeN2YXVC9jI0lyS6Jtmua5KEFzBKQxYyiZMomAACFwSf mpoaHBwUaTbbGqeqQkv/ee9/UYQats88Fjp+uLVj254v3Do7ewQQx2WgIsFaDa1e JZFJojJc4npWtRvubtVq17tKu42Q8yDga0Yjo/oPVA0CIzWhkejyJiP8U0I++ebf v7fNmpVcNRqaShyHuR67u2OHzt7H36+8/nyPYdylzbFs9iRjUe2E4YtLLJdWf7oR pPL5te367Q1ze8+rWOxIW2Z9I/H51RU9lwTC/xrhV/Qk5siyGi16n38xnZYLH367 tdfVoWmilMo9o97eXvly8u18jt+6qVExtOPj49lsFup4j7LdivNSX/rd0cLG4sqW YddMVlwua7T09XvDTxWioBisCKi/v1/TtOHhYQEK1emDhg3Xo6ePaSN9605t85/i vWd0c+aDt3JZsj/pAflq+rM3zo88/qO4vhV8dPW3K5fPJROYISjAweiHa9+RhYUb JaPU2/ucXjiiKNHEojujXo1rL6sq8/1HIjZb/48/Fzo62sjjPP6ifCinTCS8e5jh lsf/zAuv3BdgAJ5Xpw8vU6TKAAAAAElFTkSuQmCC ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/app/img/imprimir.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAAL EwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5Jf xUYAAAKQSURBVHjapJNLixRXAIW/e6v6VvX0Kz3jTLTnQUTEMTtFEeJGk5WBrLII xr8SF4IICSHoQg3oj1CGmUW0VRCZgCCOSogRHRLEmG5a+1E9XbfuK4vgRiEJeJZn 8XEOnCNCCLyP4reNiz9eDrVaDfB4Z5BCEUJAlSKe/PqYb06dFP8KsNZy/MRXeA9S gvXgLaQKTp86804C+baRqBgZIJZgC0vuLL2sj3YwzLf+u4LNxwhnsMETnEVrjRIx kYBi8j8ArwdjiEtobdnSBkLCeJgTeU11qv4uoNN5GVZXV2k2Z2hOz1Gg2OxOGGlD 4cBpi7fQzYZ8vO8QP91oh37vBeOR5rOjnxOvrVzh+NcnSMs1XnQH9HLoZoZcpGgP Rniss0RGE6pN9h7Yg86W8Npx8dIF4kajQVKuwRa8zvo8UMusZ3U6f8LLMXQllLwh iSqI8TKfDPugHQuLu3HeEGcOcrtFWUJnrFi5L7jXm4ApQwSpgzwIEIKasxQHU5Z3 7qD/KiOuVol7f3S43r7NR60WpqiwtyyZm69ji4KRsyQ6grKnrizbKlOMRs9Z//kZ 3lpedZ8TV0sR860lNn//jfbaCkvlD9mDIQ4TJkmKDxI5UCRhyF8Tw9UNyeEvvmRh tgLGE6tGTGt+ltG4w6AI7D9ygBhBiQInS0iXo12KdH3mnGP91h1acy22TScUTiHW 2mvBW0WzPsX22QUWdy1ii0BkM4z2FNZQuH/mLyPF5pNH1D+Y5uH9De5uPEAe+/SY kCHll0dP2bF9kcgZIm/xkcBGJYrKDKGk8FISpYqpxgw/nD3P46fP+O7b00K8ufOt 69dCqprkboCQVbJ8QCQVwRjEBHziyfIh5bhO++Y1zp77XgD8PQAzHkLjX6kzOQAA AABJRU5ErkJggg== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/app/img/report_error.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK 6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKrSURBVHja jJPLTxNRFMZ/M52WvqAWKrZVLNWKGAGBSGLiM8bExLh1qTv/A3du1JhoWOjKncSE kLjzkWgIC5DEiASQKAuqVTRoqYItfXem7cxcR3cGiJ7cuzy/+53vfFcSQrBZLa3l xOX745hmjcGLpxiIhJD4ff4uaSvA1ZFJEdgdodGUmPkc586ls3gVeQNA3qw5kVwX C8kCx3qi9O5rZ3m1wtvPq5s+tClgaDLO6YFujLLKD7XMye6DDI/O/R9gPpkX75bT 9EYD+JwKLT6FQKCZ9+kiEwsfxD8B90dnONHfgd/rwFEtEdR+Irb5aOs6wIOJRbJq TWwJmF3Oim+ZMn0dO/HIBvcGb3Lv9g2iHmj0t7CQEZYXqa0VjIzNMtB/EJujgbDP TnLpI3OLi5z0S3g9QZrC+xh6PE6xnhMbAJPxFTGXrdC+o5ltrgZsQieyP0YwFsHu tHG8WaLuDfAqZ2NqLrlRwaOpr6h6iLF3ZdqlipUQF+FAG3vaY8hansNhBXchSU32 8XDs5d+AF4sp8XopTa7uI9oEAaeG3dTo7emk/9ARaHASdBucibgpVxXGvpo8m1r4 M4as1nUxPB1H9rcSUEpc6NQpmYKq7MCzexex8C4MuQE1n+FidyN9jUVoDjL06LmV k4KQ3yRW+bBUIpXzcj7mobNJwlFUcZkyQ3dvcffWdarVKoZiI+TSOdcTYr1YYSYt 82Q6ga3WeeLamuFlpe5hp6dgSSzzJW3dvIYnHGZv11FSlRqJ1LoV8Qyf0iXmV7KY Di/fv60g9V95KlyhHpL5OnWtiF/RMYRMoZTD5WtBslfIF7I4bQJdValqBYTbbX1L OyKVQIm2CuLLk7TIFTTJjVpQEEYWh8NaW1LCZmSsjbjRzTqa5Y2CjlIqUaua9LVt 55cAAwDPuSy1QESOigAAAABJRU5ErkJggg== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/app/img/permalink_off.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABgAAAAWCAYAAADafVyIAAAABGdBTUEAAK/INwWK 6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAOTSURBVHja tJVvaJVVHMe/53nOee5f72LXuXZJqNxAxQ0qbLVIoQWbbORC5ptEI+uFOREpgt5M YyEqhP2RKAolrWYvQnphTRKkYG6OZuYKlpNZdu+8o225e5/dP8/znHP63QtKeMkb dPd7ODznPH8+3+/zO7/zHKYpBr7+HBoWpqeTqEREqqrQUN+AxqbHwMcuDxfhtffW YntHN6uEwNHTn+l4PE69YfCJqxMI+k10PrKuIvBCvNDxXJF15Mvjmqfm59Gzaddt +JTSUMyGof1wGA9aWmU0y4I5AXgWYCBD98KAzgPSJ6SAa2p6kVqOIfKgwVK3WAW2 USLvQUAL6nBYMpuBZ4gsQlEagLmGKMIpXMMSEK6rkCWwDirY8DGk7sSVCphwHSjk GYJKW/BIy4I9Sxxhkts0U9GCYUaHoteFDsCvWcbwwkKRu/ICXgaMcfg0MoZpgmvX pRHgI7uQWALMMpYDVyD3ZKWYHheae66JXAmOl/BFUHx4AU5yfApJe54e4HA4wzMt Dwx0NcoNUCb6L/PBsSszLVOzc5BOEH5rjkpytfv8E+EVhPjjrgLvD8HJpubwxtYY TXYM8RlgnDLbe+C7drZj/VnPb2NoXLa83LYUKyNLIVXB1H145fCYOKHqrxezdzeB q4nfsa+7FucngVcPfQF/rB4RfRMPtazCzzN2q+Uo/Dk3iR37U5RNDYdKoK+nHW/u acTrR34tn6L8DaDa8+P0cBybO7pw5bcEPtjVRHNPxig9CarF9ZlGDP7I8enHx9G2 7VmcG7mOdfUx/PDTZHkBSQV9k652Nddh94GziNRF0d47i1z6LyQnfqH5DMA2bDi0 DFauWYtvvxrBW6+14lpaoToWRaKcwKNr7sfGnlN4Z38n+t9uxcQUQzrNcPDQSTR1 diJAtTo5NILevZthagnuSaQMhRd7+tG24WmMlRPY/lSeSb3xkz2HR7faCwlkaYID VhVWPd6MWPUyHOxewnY6pu776CLchWvwHBMBFkJzQxPC3Fc+RWbOh5davW3+wMM3 FvTa1WG2cMlzQzUwPGfLk3y3Unm8u3M56x9cvvdSvG5fSDq2w5aFuRnP9W26J3Di TuCxo+/pOjrfavT3/l/tn6wC28AiR0mKYoxVVGDRv8AIBkOLBi+w2ejo93o6OU3r 1Lm9E1Uijg2c0jU1UTClpD7zzcn/vOlLKeHR4vLobJIdk3MIIf510/9bgAEAA5+n WTcsTJAAAAAASUVORK5CYII= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/app/img/ajuda.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK 6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAH7UExURfz8 /6+94qHG1v/08vj//+Po5FeQvfX//+3i3tPj8oq80+jz/OPs8vv+/szk8Mzj8+ve 5fr+///z8/3y8Nrn3eb1+73W6jFup3qu032p00B6uOHu/hVtrN/p9xuIwOre4unq 5cPa4uHs9O7h6+vn6ECIs2+bysnd273P48zW1efy6v/35/z9/1iMv3qxzVKGtqXF 0meuz015u+7m5Km+2+vm4vbm6ZW611qev+7c2v/68PXn5rDM13K90aLDzPn9/ni1 13K01mu21efg1lR9vaXC6iBmo/7//fz//+Ll6jmAt+3t+VCp1U2lzKDE3FKZx9/p 6Nfm6cDT6NLk5PDm3cLU4liazPXt6vTs6vT9/9Lb7E6bvvv6/8Hc7YzF2DhspXW7 xcXa7J21zfv//+ju4G25yYq+2LHG2XGc1sXD0ESEw2epwfjx6b/W5t7n8O3j4vz9 +Pvz8V6ewl+ivNPY+FGOvfr8/P3+/f/+/+bq61eRwtDb3erz/cvc5qzJ2+zy+fn+ /5y5yfT78xB3svP59d3p34fB2c3q8vj7/xqSxp66yKLH0K/O6j5zwfv0+2SwyPzq +P/8/0d+vjWiw1aRvNno41itwy58tPLn4T6myenj5fz79urw8OXn2sng6ZTAyW+8 z4y60f7/9Nzd4vPm4LTK4avK5t3u9v///6UuZFQAAACpdFJOU/////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// /////////////////wD7b3sWAAAA3UlEQVR42mJYgQYYQERDrppUluS8cpiAkpHL MunKumJDboiArFv6oiZGrpLZTL6iIAGGSUt1JvTGi8uYaxss4AUKBOmzTOxQdOeU 81kikt0OFMhwZfeoiEzu6WSyVu5KAwp4aRb0MbfMnZnqHOiZaQEUUA0NnxOS4zQ5 iqN1hk00UMBhYUSeyuKEOGMFVrNGPaAAX5HlVIFZjGIBpt6FpYlAAUHH+fkp1c3+ QsJWSVX2IIfVTzOR19IIjmH2m84DcXqNbX+3eq0dm+5ymOcY+NvCpkjElsF9iwwA AgwAXk1t8yb2K5YAAAAASUVORK5CYII= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline Content-Type: image/png Content-Location: http://www.icc.cat/vissir3/app/img/ticks.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAMAAAAAZCAYAAABn7SHgAAAABGdBTUEAAK/INwWK 6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAASfSURBVHja 7JpdaBRXFMdvNC+JYIuJRMXUivXzoSJKUQuCoqAErJA++KIPeYmgtiqkgrWfBqQf pAoNmD4o6Iug9iFSIyoVBMUHJUbEj9r4UaWkuLE14O5DUtv9HTnDZJ1Jdmc2o7Ln HzaTe+bOvf977vm6synr+TvznzMYShSjTAUGcwCDwRzAYDAHMBhK0wEy6fQLNx8+ uD+o3Zt6JDI+/D1U30IR9HyYLJdrkOx151EIl7Bnk9bJSK47Li6ePxcoL+fX2dMn 3cUL59y6hkY3uXaKGPdPrT+4dPqpq6wc47Y07XQVlZVuz3fN3oNVVePdlk92uq7O S+7o4UMiW7Z8lVu6YmVBxJhLx9W5ALLc+Q/tb3O/3bou99c3bHDTZ84eJPtw7To3 d96CSAqKy6PtxxZv41QWFYVwYWPZgxkz53i6D+L3MngEyfIxVOyJvVz4/pLAPnu+ bRZbraoen/dafmk/5ia/NUXs24/RGz/a9iXG39Pzp1vw3iI39o033Yn2n4V0Q+Nm 19f3j7t753dpnz1z0jVu2ubW1K8VckSYttYWTzZ12jsFKxklzpg1R56/fq1LxsSQ UOqmrdvdX1lej1MpNzDQL076efP38gyKmjBxkjvV0e52fbPXlWV/bt+6EdkB4vAY 6O+X+02ffi2bcurE8dDNKyYX9N115ZK7d6dbNpY2Osjlx74mzQMEyYYDxl+T3dd7 WZtTHbImbJJr35MnMu7j3pTMTT/2BL1j5LW1bwvX0x3HpX/NhEmyDmxX7XtQCcRi 8KYXvL/3kRfRmEhBpMMDGRzvZnBku7/aIe0oUK9kUdNnzZZ5yTCaaaTs+uO+1w9P RkabD3yY+91582Olyag8tITUsgPdxUU+XEDd6vpBUS2MX9I8wmTDZRx0R9biKu3s 5+D+fTIOturnpetjzZo9eA575T57QSUzFMqDhEuXr5Q02tbZIgauKZS0hKfdvnlD PHXh4iWuouK5A0ECL40agXEiDLgQhanB1X1QLw5wtfNy5Pnj8CBSERB4FqNAZ8VA FC4jgaR4sH/oD0PmShvkllBEepwRPmG1/a9nOqK/BcLIqe93fLFbDFwdgI1VzwPj qqs9byykHgtSMGMSMXQ8jaJc/d7uj3I4IlEBfhi+1r1J8wAEAUox7sfNRPlyCYzY IfyS5hHpoJot3bAjyTLZK232V1+4SHZNBWdX/4Ef4yeLUJoPh3L/QYfFStrKLpi/ NbphXJqKFHrgxEs/2/6xJysUHMD1zRLezHwcpuHEuDhdXVO9KAJl61x6uMPo48xf DB6AEpCDIffyUXwxuOiBEENED+nMU6/syOX3MngEycJABtVAokCnOAI61/UwBnaH fXIl2FCN+CM+PLHVfDJxGf8L5K8T1aO11vPXXWHysL5RXnv5x9E6f6TnLwYPjUxx MmEULsybyaQD+yWpkyAeYdzCQBT39/G3c9fjbzMPxk4AUv0rP+4h02ugA9jXIYZS hX0TbDAHGApHDrTKJwjPnv3bnQTJoTgkDePyavKIysEygMEygMFgDmAwmAMYDOYA BkPJwL4HMFgGMBjMAQwGcwCDobTwvwADAL4q3irWicoTAAAAAElFTkSuQmCC ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=main.css Content-Type: text/css; charset=utf-8; name=main.css Content-Location: http://www.icc.cat/vissir3/app/css/main.css Content-Transfer-Encoding: 8bit .zoomin { background-image:url(../img/icon_zoomin.png) !important; height:20px !important; width:20px !important; } .zoomout { background-image:url(../img/icon_zoomout.png) !important; height:20px !important; width:20px !important; } .pan { background-image:url(../img/icon_pan.png) !important; height:20px !important; width:20px !important; } .back { background-image:url(../img/resultset_previous.png) !important; height:20px !important; width:20px !important; } .next { background-image:url(../img/resultset_next.png) !important; height:20px !important; width:20px !important; } .zoomfull { background-image:url(../img/icon_zoomfull.png) !important; height:20px !important; width:20px !important; } .drawpoint { background-image:url(../img/draw_point_off.png) !important; height:20px !important; width:20px !important; } .drawline { background-image:url(../img/draw_line_off.png) !important; height:20px !important; width:20px !important; } .drawlinefreehand { background-image:url(../img/draw_freehand_off.png) !important; height:20px !important; width:20px !important; } .drawpolygon { background-image:url(../img/draw_polygon_off.png) !important; height:20px !important; width:20px !important; } .modifyfeature{ background-image:url(../img/modify_feature_off.png) !important; height:20px !important; width:20px !important; } .removefeature{ background-image:url(../img/remove_feature_off.png) !important; height:20px !important; width:20px !important; } .textfeature{ background-image:url(../img/draw_text_off.png) !important; height:20px !important; width:20px !important; } .infobutton { background-image:url(../img/info_off.png) !important; height:20px !important; width:20px !important; } .dowldbutton { background-image:url(../img/dwld_off.png) !important; height:20px !important; width:20px !important; } .print{ background-image:url(../img/imprimir.png) !important; height:20px !important; width:20px !important; } .curtainControl { background-image:url(../img/curtain_off.png) !important; height:20px !important; width:20px !important; } .broomControl { background-image:url(../img/broom_off.png) !important; height:20px !important; width:20px !important; } .compareControl { background-image:url(../img/compare_off.png) !important; height:20px !important; width:20px !important; } .report_error{ background-image:url(../img/report_error.png) !important; height:20px !important; width:20px !important; } .permalinkControl { background-image:url(../img/permalink_off.png) !important; height:20px !important; width:20px !important; } .helpControl { background-image:url(../img/ajuda.png) !important; height:20px !important; width:20px !important; } /* #hist_slider{ width:214px; padding-top:6px; background-image:url(../img/ticks.gif); } */ #hist_slider .x-slider-thumb { background-image:url(../img/slider-thumb.png); } .hist_slider_class{ height: 50px; padding-top:20px; background-image:url(../img/ticks.png); } .olControlLoadingPanel { background-image:url(../img/loading.gif); position: relative; top: 45%; left: 40%;; width: 195px; height: 11px; background-position:center; background-repeat:no-repeat; display: none; } #containerAddsLyrsDiv { /*background-image:url(../img/slider-thumb.png);*/ background-color:#00f; } ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=visualitzador.css Content-Type: text/css; charset=utf-8; name=visualitzador.css Content-Location: http://www.icc.cat/vissir3/app/css/visualitzador.css Content-Transfer-Encoding: 8bit img {border: 0;} img.ajuda {vertical-align: bottom;} a {color:#0000EE} a:visited{color:#0000EE} .sep5 {height: 5px;} .sep15 {height: 15px;} .sep50 {height: 50px;} .enunciat {margin-bottom: 5px;} .sepSuperior{margin-top:10px;} /* secci� cerca */ #cerca {display: block;} #resultats_cerca {display: none; margin-top: 20px;} /* secci� productes */ .plist{padding: 5px 0 0 5px;} #productes {display: none;} #prod_mapes {display: none;} #prod_bt5m {display: none;} #prod_mt10m{display: none;} #prod_bt25m{display: none;} #prod_bt50m{display: none;} #prod_bm1000m {display: none;} #prod_com50m {display: none;} #prod_mtc250m{display: none;} #prod_mtc500m{display: none;} #prod_mtc1000m{display: none;} #prod_aeries {display: none;} #prod_of2 {display: none;} #prod_of5 {display: none;} #prod_of25 {display: none;} #prod_sat250 {display: none;} #prod_met {display: none;} #prod_altres {display: none;} #prod_mp20 {display: none;} #prod_p1000 {display: none;} #prod_promo {display: none;} #prod_calendari {display: none;} #prod_bm50m {display: none;} #prod_talls {display: none;} #prod_polind{display: none;} #prod_click {display: none;} /* secci� desc�rrega */ #descarrega {display: none;} #descarrega_p1000 {display: none;} #descarrega_bt5m {display: none;} #descarrega_mt10m {display: none;} #descarrega_bt25m {display: none;} #descarrega_bt50m {display: none;} .enunciat_prod {margin-bottom: 5px; font-weight: bold; color: #555555;} .fitxa_prod {border: 1px solid #aaaaaa; padding: 5px; overflow: hidden;} .titol_prod{font-weight:bold;color:#555} ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=fileuploadfield.css Content-Type: text/css; charset=utf-8; name=fileuploadfield.css Content-Location: http://www.icc.cat/vissir3/app/css/fileuploadfield.css Content-Transfer-Encoding: 8bit /*! * Ext JS Library 3.3.0 * Copyright(c) 2006-2010 Ext JS, Inc. * licensing@extjs.com * http://www.extjs.com/license */ /* * FileUploadField component styles */ .x-form-file-wrap { position: relative; height: 22px; } .x-form-file-wrap .x-form-file { position: absolute; right: 0; -moz-opacity: 0; filter:alpha(opacity: 0); opacity: 0; z-index: 2; height: 22px; } .x-form-file-wrap .x-form-file-btn { position: absolute; right: 0; z-index: 1; } .x-form-file-wrap .x-form-file-text { position: absolute; left: 0; z-index: 3; color: #777; } .upload-icon { background: url('../img/folder_explore.png') no-repeat 0 0 !important; } ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=OpenLayers.js Content-Type: application/javascript; charset=utf-8; name=OpenLayers.js Content-Location: http://www.icc.cat/vissir3/lib/openlayers/OpenLayers.js Content-Transfer-Encoding: Base64 LyoKCiAgT3BlbkxheWVycy5qcyAtLSBPcGVuTGF5ZXJzIE1hcCBWaWV3ZXIgTGli cmFyeQoKICBDb3B5cmlnaHQgMjAwNS0yMDExIE9wZW5MYXllcnMgQ29udHJpYnV0 b3JzLCByZWxlYXNlZCB1bmRlciB0aGUgRnJlZUJTRAogIGxpY2Vuc2UuIFBsZWFz ZSBzZWUgaHR0cDovL3N2bi5vcGVubGF5ZXJzLm9yZy90cnVuay9vcGVubGF5ZXJz L2xpY2Vuc2UudHh0CiAgZm9yIHRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2Uu CgogIEluY2x1ZGVzIGNvbXByZXNzZWQgY29kZSB1bmRlciB0aGUgZm9sbG93aW5n IGxpY2Vuc2VzOgoKICAoRm9yIHVuY29tcHJlc3NlZCB2ZXJzaW9ucyBvZiB0aGUg Y29kZSB1c2VkIHBsZWFzZSBzZWUgdGhlCiAgT3BlbkxheWVycyBTVk4gcmVwb3Np dG9yeTogPGh0dHA6Ly9vcGVubGF5ZXJzLm9yZy8+KQoKKi8KCi8qIENvbnRhaW5z IHBvcnRpb25zIG9mIFByb3RvdHlwZS5qczoKICoKICogUHJvdG90eXBlIEphdmFT Y3JpcHQgZnJhbWV3b3JrLCB2ZXJzaW9uIDEuNC4wCiAqICAoYykgMjAwNSBTYW0g U3RlcGhlbnNvbiA8c2FtQGNvbmlvLm5ldD4KICoKICogIFByb3RvdHlwZSBpcyBm cmVlbHkgZGlzdHJpYnV0YWJsZSB1bmRlciB0aGUgdGVybXMgb2YgYW4gTUlULXN0 eWxlIGxpY2Vuc2UuCiAqICBGb3IgZGV0YWlscywgc2VlIHRoZSBQcm90b3R5cGUg d2ViIHNpdGU6IGh0dHA6Ly9wcm90b3R5cGUuY29uaW8ubmV0LwogKgogKi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qKiAgCiogIAoqICBDb250YWlucyBw b3J0aW9ucyBvZiBSaWNvIDxodHRwOi8vb3BlbnJpY28ub3JnLz4KKiAKKiAgQ29w eXJpZ2h0IDIwMDUgU2FicmUgQWlybGluZSBTb2x1dGlvbnMgIAoqICAKKiAgTGlj ZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhl ICJMaWNlbnNlIik7IHlvdQoqICBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0 IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91CiogIG1heSBvYnRh aW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiogIAoqICAgICAgICAgaHR0cDov L3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAKKiAgCiogIFVu bGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4g d3JpdGluZywgc29mdHdhcmUKKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vu c2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKiAgV0lUSE9V VCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBl eHByZXNzIG9yCiogIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNw ZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwoqICBwZXJtaXNzaW9ucyBhbmQgbGlt aXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIAoqCioqLwoKLyoqCiAqIENvbnRh aW5zIFhNTEh0dHBSZXF1ZXN0LmpzIDxodHRwOi8vY29kZS5nb29nbGUuY29tL3Av eG1saHR0cHJlcXVlc3QvPgogKiBDb3B5cmlnaHQgMjAwNyBTZXJnZXkgSWxpbnNr eSAoaHR0cDovL3d3dy5pbGluc2t5LmNvbSkKICoKICogTGljZW5zZWQgdW5kZXIg dGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7 CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFu Y2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9m IHRoZSBMaWNlbnNlIGF0CiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNl cy9MSUNFTlNFLTIuMAogKi8KCi8qKgogKiBDb250YWlucyBwb3J0aW9ucyBvZiBH ZWFycyA8aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hcGlzL2dlYXJzLz4KICoKICog Q29weXJpZ2h0IDIwMDcsIEdvb2dsZSBJbmMuCiAqCiAqIFJlZGlzdHJpYnV0aW9u IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0 aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKICoKICogIDEuIFJl ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv dmUgY29weXJpZ2h0IG5vdGljZSwKICogICAgIHRoaXMgbGlzdCBvZiBjb25kaXRp b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqICAyLiBSZWRpc3Ry aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl IGNvcHlyaWdodCBub3RpY2UsCiAqICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0 aW9uCiAqICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg dGhlIGRpc3RyaWJ1dGlvbi4KICogIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBi ZQogKiAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy aXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAogKiAgICAgc3BlY2lmaWMg cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElT IFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVT UyBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5U QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF IERJU0NMQUlNRUQuIElOIE5PCiAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUg TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKICog U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAogKiBQUk9DVVJFTUVOVCBPRiBT VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg T1IgUFJPRklUUzsKICogT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCiAqIFdIRVRI RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV RElORyBORUdMSUdFTkNFIE9SCiAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKICog QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAq IFNldHMgdXAgZ29vZ2xlLmdlYXJzLiosIHdoaWNoIGlzICp0aGUgb25seSogc3Vw cG9ydGVkIHdheSB0byBhY2Nlc3MgR2VhcnMuCiAqCiAqIENpcmN1bXZlbnQgdGhp cyBmaWxlIGF0IHlvdXIgb3duIHJpc2shCiAqCiAqIEluIHRoZSBmdXR1cmUsIEdl YXJzIG1heSBhdXRvbWF0aWNhbGx5IGRlZmluZSBnb29nbGUuZ2VhcnMuKiB3aXRo b3V0IHRoaXMKICogZmlsZS4gR2VhcnMgbWF5IHVzZSB0aGVzZSBvYmplY3RzIHRv IHRyYW5zcGFyZW50bHkgZml4IGJ1Z3MgYW5kIGNvbXBhdGliaWxpdHkKICogaXNz dWVzLiBBcHBsaWNhdGlvbnMgdGhhdCB1c2UgdGhlIGNvZGUgYmVsb3cgd2lsbCBj b250aW51ZSB0byB3b3JrIHNlYW1sZXNzbHkKICogd2hlbiB0aGF0IGhhcHBlbnMu CiAqLwoKLyoqCiAqIE9wZW5MYXllcnMuVXRpbC5wYWdlUG9zaXRpb24gaXMgYmFz ZWQgb24gWWFob28ncyBnZXRYWSBtZXRob2QsIHdoaWNoIGlzCiAqIENvcHlyaWdo dCAoYykgMjAwNiwgWWFob28hIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4K ICogCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBp biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgogKiB3aXRob3V0IG1v ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs b3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAKICogKiBSZWRpc3RyaWJ1 dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly aWdodCBub3RpY2UsCiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogCiAqICogUmVkaXN0cmlidXRpb25z IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln aHQgbm90aWNlLAogKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KICogICBh bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1 dGlvbi4KICogCiAqICogTmVpdGhlciB0aGUgbmFtZSBvZiBZYWhvbyEgSW5jLiBu b3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCiAqICAgdXNl ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRo aXMgc29mdHdhcmUgd2l0aG91dAogKiAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g cGVybWlzc2lvbiBvZiBZYWhvbyEgSW5jLgogKiAKICogVEhJUyBTT0ZUV0FSRSBJ UyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV VE9SUyAiQVMgSVMiCiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1Q TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIERJU0NMQUlNRUQuIElOIE5P IEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JT IEJFCiAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKICogQ09OU0VRVUVOVElBTCBEQU1B R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg T0YKICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCiAqIElOVEVSUlVQVElPTikg SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX SEVUSEVSIElOCiAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCiAqIEFSSVNJTkcg SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO IElGIEFEVklTRUQgT0YgVEhFIAogKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH RS4KICovKGZ1bmN0aW9uKCl7aWYod2luZG93Lmdvb2dsZSYmZ29vZ2xlLmdlYXJz KXtyZXR1cm47fQp2YXIgZmFjdG9yeT1udWxsO2lmKHR5cGVvZiBHZWFyc0ZhY3Rv cnkhPSd1bmRlZmluZWQnKXtmYWN0b3J5PW5ldyBHZWFyc0ZhY3RvcnkoKTt9ZWxz ZXt0cnl7ZmFjdG9yeT1uZXcgQWN0aXZlWE9iamVjdCgnR2VhcnMuRmFjdG9yeScp O2lmKGZhY3RvcnkuZ2V0QnVpbGRJbmZvKCkuaW5kZXhPZignaWVfbW9iaWxlJykh PS0xKXtmYWN0b3J5LnByaXZhdGVTZXRHbG9iYWxPYmplY3QodGhpcyk7fX1jYXRj aChlKXtpZigodHlwZW9mIG5hdmlnYXRvci5taW1lVHlwZXMhPSd1bmRlZmluZWQn KSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1nb29nbGVnZWFy cyJdKXtmYWN0b3J5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Zh Y3Rvcnkuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZmFjdG9yeS53aWR0aD0wO2ZhY3Rv cnkuaGVpZ2h0PTA7ZmFjdG9yeS50eXBlPSJhcHBsaWNhdGlvbi94LWdvb2dsZWdl YXJzIjtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZmFjdG9y eSk7fX19CmlmKCFmYWN0b3J5KXtyZXR1cm47fQppZighd2luZG93Lmdvb2dsZSl7 Z29vZ2xlPXt9O30KaWYoIWdvb2dsZS5nZWFycyl7Z29vZ2xlLmdlYXJzPXtmYWN0 b3J5OmZhY3Rvcnl9O319KSgpO3ZhciBPcGVuTGF5ZXJzPXtWRVJTSU9OX05VTUJF UjoiUmVsZWFzZSAyLjExIixzaW5nbGVGaWxlOnRydWUsX2dldFNjcmlwdExvY2F0 aW9uOihmdW5jdGlvbigpe3ZhciByPW5ldyBSZWdFeHAoIihefCguKj9cXC8pKShP cGVuTGF5ZXJzXC5qcykoXFw/fCQpIikscz1kb2N1bWVudC5nZXRFbGVtZW50c0J5 VGFnTmFtZSgnc2NyaXB0Jyksc3JjLG0sbD0iIjtmb3IodmFyIGk9MCxsZW49cy5s ZW5ndGg7aTxsZW47aSsrKXtzcmM9c1tpXS5nZXRBdHRyaWJ1dGUoJ3NyYycpO2lm KHNyYyl7dmFyIG09c3JjLm1hdGNoKHIpO2lmKG0pe2w9bVsxXTticmVhazt9fX0K cmV0dXJuKGZ1bmN0aW9uKCl7cmV0dXJuIGw7fSk7fSkoKX07T3BlbkxheWVycy5D bGFzcz1mdW5jdGlvbigpe3ZhciBsZW49YXJndW1lbnRzLmxlbmd0aDt2YXIgUD1h cmd1bWVudHNbMF07dmFyIEY9YXJndW1lbnRzW2xlbi0xXTt2YXIgQz10eXBlb2Yg Ri5pbml0aWFsaXplPT0iZnVuY3Rpb24iP0YuaW5pdGlhbGl6ZTpmdW5jdGlvbigp e1AucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO307 aWYobGVuPjEpe3ZhciBuZXdBcmdzPVtDLFBdLmNvbmNhdChBcnJheS5wcm90b3R5 cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLnNsaWNlKDEsbGVuLTEpLEYpO09wZW5M YXllcnMuaW5oZXJpdC5hcHBseShudWxsLG5ld0FyZ3MpO31lbHNle0MucHJvdG90 eXBlPUY7fQpyZXR1cm4gQzt9O09wZW5MYXllcnMuQ2xhc3MuaXNQcm90b3R5cGU9 ZnVuY3Rpb24oKXt9O09wZW5MYXllcnMuQ2xhc3MuY3JlYXRlPWZ1bmN0aW9uKCl7 cmV0dXJuIGZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzJiZhcmd1bWVudHNbMF0hPU9w ZW5MYXllcnMuQ2xhc3MuaXNQcm90b3R5cGUpe3RoaXMuaW5pdGlhbGl6ZS5hcHBs eSh0aGlzLGFyZ3VtZW50cyk7fX07fTtPcGVuTGF5ZXJzLkNsYXNzLmluaGVyaXQ9 ZnVuY3Rpb24oUCl7dmFyIEM9ZnVuY3Rpb24oKXtQLmNhbGwodGhpcyk7fTt2YXIg bmV3QXJncz1bQ10uY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFy Z3VtZW50cykpO09wZW5MYXllcnMuaW5oZXJpdC5hcHBseShudWxsLG5ld0FyZ3Mp O3JldHVybiBDLnByb3RvdHlwZTt9O09wZW5MYXllcnMuaW5oZXJpdD1mdW5jdGlv bihDLFApe3ZhciBGPWZ1bmN0aW9uKCl7fTtGLnByb3RvdHlwZT1QLnByb3RvdHlw ZTtDLnByb3RvdHlwZT1uZXcgRjt2YXIgaSxsLG87Zm9yKGk9MixsPWFyZ3VtZW50 cy5sZW5ndGg7aTxsO2krKyl7bz1hcmd1bWVudHNbaV07aWYodHlwZW9mIG89PT0i ZnVuY3Rpb24iKXtvPW8ucHJvdG90eXBlO30KT3BlbkxheWVycy5VdGlsLmV4dGVu ZChDLnByb3RvdHlwZSxvKTt9fTtPcGVuTGF5ZXJzLlV0aWw9T3BlbkxheWVycy5V dGlsfHx7fTtPcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kPWZ1bmN0aW9uKGRlc3RpbmF0 aW9uLHNvdXJjZSl7ZGVzdGluYXRpb249ZGVzdGluYXRpb258fHt9O2lmKHNvdXJj ZSl7Zm9yKHZhciBwcm9wZXJ0eSBpbiBzb3VyY2Upe3ZhciB2YWx1ZT1zb3VyY2Vb cHJvcGVydHldO2lmKHZhbHVlIT09dW5kZWZpbmVkKXtkZXN0aW5hdGlvbltwcm9w ZXJ0eV09dmFsdWU7fX0KdmFyIHNvdXJjZUlzRXZ0PXR5cGVvZiB3aW5kb3cuRXZl bnQ9PSJmdW5jdGlvbiImJnNvdXJjZSBpbnN0YW5jZW9mIHdpbmRvdy5FdmVudDtp Zighc291cmNlSXNFdnQmJnNvdXJjZS5oYXNPd25Qcm9wZXJ0eSYmc291cmNlLmhh c093blByb3BlcnR5KCJ0b1N0cmluZyIpKXtkZXN0aW5hdGlvbi50b1N0cmluZz1z b3VyY2UudG9TdHJpbmc7fX0KcmV0dXJuIGRlc3RpbmF0aW9uO307T3BlbkxheWVy cy5Qcm90b2NvbD1PcGVuTGF5ZXJzLkNsYXNzKHtmb3JtYXQ6bnVsbCxvcHRpb25z Om51bGwsYXV0b0Rlc3Ryb3k6dHJ1ZSxkZWZhdWx0RmlsdGVyOm51bGwsaW5pdGlh bGl6ZTpmdW5jdGlvbihvcHRpb25zKXtvcHRpb25zPW9wdGlvbnN8fHt9O09wZW5M YXllcnMuVXRpbC5leHRlbmQodGhpcyxvcHRpb25zKTt0aGlzLm9wdGlvbnM9b3B0 aW9uczt9LG1lcmdlV2l0aERlZmF1bHRGaWx0ZXI6ZnVuY3Rpb24oZmlsdGVyKXt2 YXIgbWVyZ2VkO2lmKGZpbHRlciYmdGhpcy5kZWZhdWx0RmlsdGVyKXttZXJnZWQ9 bmV3IE9wZW5MYXllcnMuRmlsdGVyLkxvZ2ljYWwoe3R5cGU6T3BlbkxheWVycy5G aWx0ZXIuTG9naWNhbC5BTkQsZmlsdGVyczpbdGhpcy5kZWZhdWx0RmlsdGVyLGZp bHRlcl19KTt9ZWxzZXttZXJnZWQ9ZmlsdGVyfHx0aGlzLmRlZmF1bHRGaWx0ZXJ8 fHVuZGVmaW5lZDt9CnJldHVybiBtZXJnZWQ7fSxkZXN0cm95OmZ1bmN0aW9uKCl7 dGhpcy5vcHRpb25zPW51bGw7dGhpcy5mb3JtYXQ9bnVsbDt9LHJlYWQ6ZnVuY3Rp b24ob3B0aW9ucyl7b3B0aW9ucz1vcHRpb25zfHx7fTtvcHRpb25zLmZpbHRlcj10 aGlzLm1lcmdlV2l0aERlZmF1bHRGaWx0ZXIob3B0aW9ucy5maWx0ZXIpO30sY3Jl YXRlOmZ1bmN0aW9uKCl7fSx1cGRhdGU6ZnVuY3Rpb24oKXt9LCJkZWxldGUiOmZ1 bmN0aW9uKCl7fSxjb21taXQ6ZnVuY3Rpb24oKXt9LGFib3J0OmZ1bmN0aW9uKHJl c3BvbnNlKXt9LGNyZWF0ZUNhbGxiYWNrOmZ1bmN0aW9uKG1ldGhvZCxyZXNwb25z ZSxvcHRpb25zKXtyZXR1cm4gT3BlbkxheWVycy5GdW5jdGlvbi5iaW5kKGZ1bmN0 aW9uKCl7bWV0aG9kLmFwcGx5KHRoaXMsW3Jlc3BvbnNlLG9wdGlvbnNdKTt9LHRo aXMpO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Qcm90b2NvbCJ9KTtPcGVuTGF5 ZXJzLlByb3RvY29sLlJlc3BvbnNlPU9wZW5MYXllcnMuQ2xhc3Moe2NvZGU6bnVs bCxyZXF1ZXN0VHlwZTpudWxsLGxhc3Q6dHJ1ZSxmZWF0dXJlczpudWxsLHJlcUZl YXR1cmVzOm51bGwscHJpdjpudWxsLGVycm9yOm51bGwsaW5pdGlhbGl6ZTpmdW5j dGlvbihvcHRpb25zKXtPcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHRoaXMsb3B0aW9u cyk7fSxzdWNjZXNzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29kZT4wO30sQ0xB U1NfTkFNRToiT3BlbkxheWVycy5Qcm90b2NvbC5SZXNwb25zZSJ9KTtPcGVuTGF5 ZXJzLlByb3RvY29sLlJlc3BvbnNlLlNVQ0NFU1M9MTtPcGVuTGF5ZXJzLlByb3Rv Y29sLlJlc3BvbnNlLkZBSUxVUkU9MDtPcGVuTGF5ZXJzLlByb3RvY29sLlNRTD1P cGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuUHJvdG9jb2wse2RhdGFiYXNlTmFt ZTonb2wnLHRhYmxlTmFtZToib2xfdmVjdG9yX2ZlYXR1cmVzIixwb3N0UmVhZEZp bHRlcmluZzp0cnVlLGluaXRpYWxpemU6ZnVuY3Rpb24ob3B0aW9ucyl7T3Blbkxh eWVycy5Qcm90b2NvbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtv cHRpb25zXSk7fSxkZXN0cm95OmZ1bmN0aW9uKCl7T3BlbkxheWVycy5Qcm90b2Nv bC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzKTt9LHN1cHBvcnRlZDpmdW5j dGlvbigpe3JldHVybiBmYWxzZTt9LGV2YWx1YXRlRmlsdGVyOmZ1bmN0aW9uKGZl YXR1cmUsZmlsdGVyKXtyZXR1cm4gZmlsdGVyJiZ0aGlzLnBvc3RSZWFkRmlsdGVy aW5nP2ZpbHRlci5ldmFsdWF0ZShmZWF0dXJlKTp0cnVlO30sQ0xBU1NfTkFNRToi T3BlbkxheWVycy5Qcm90b2NvbC5TUUwifSk7T3BlbkxheWVycy5Db25zb2xlPXts b2c6ZnVuY3Rpb24oKXt9LGRlYnVnOmZ1bmN0aW9uKCl7fSxpbmZvOmZ1bmN0aW9u KCl7fSx3YXJuOmZ1bmN0aW9uKCl7fSxlcnJvcjpmdW5jdGlvbigpe30sdXNlckVy cm9yOmZ1bmN0aW9uKGVycm9yKXthbGVydChlcnJvcik7fSxhc3NlcnQ6ZnVuY3Rp b24oKXt9LGRpcjpmdW5jdGlvbigpe30sZGlyeG1sOmZ1bmN0aW9uKCl7fSx0cmFj ZTpmdW5jdGlvbigpe30sZ3JvdXA6ZnVuY3Rpb24oKXt9LGdyb3VwRW5kOmZ1bmN0 aW9uKCl7fSx0aW1lOmZ1bmN0aW9uKCl7fSx0aW1lRW5kOmZ1bmN0aW9uKCl7fSxw cm9maWxlOmZ1bmN0aW9uKCl7fSxwcm9maWxlRW5kOmZ1bmN0aW9uKCl7fSxjb3Vu dDpmdW5jdGlvbigpe30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Db25zb2xlIn07 KGZ1bmN0aW9uKCl7dmFyIHNjcmlwdHM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRh Z05hbWUoInNjcmlwdCIpO2Zvcih2YXIgaT0wLGxlbj1zY3JpcHRzLmxlbmd0aDtp PGxlbjsrK2kpe2lmKHNjcmlwdHNbaV0uc3JjLmluZGV4T2YoImZpcmVidWcuanMi KSE9LTEpe2lmKGNvbnNvbGUpe09wZW5MYXllcnMuVXRpbC5leHRlbmQoT3Blbkxh eWVycy5Db25zb2xlLGNvbnNvbGUpO2JyZWFrO319fX0pKCk7T3BlbkxheWVycy5M YW5nPXtjb2RlOm51bGwsZGVmYXVsdENvZGU6ImVuIixnZXRDb2RlOmZ1bmN0aW9u KCl7aWYoIU9wZW5MYXllcnMuTGFuZy5jb2RlKXtPcGVuTGF5ZXJzLkxhbmcuc2V0 Q29kZSgpO30KcmV0dXJuIE9wZW5MYXllcnMuTGFuZy5jb2RlO30sc2V0Q29kZTpm dW5jdGlvbihjb2RlKXt2YXIgbGFuZztpZighY29kZSl7Y29kZT0oT3BlbkxheWVy cy5CUk9XU0VSX05BTUU9PSJtc2llIik/bmF2aWdhdG9yLnVzZXJMYW5ndWFnZTpu YXZpZ2F0b3IubGFuZ3VhZ2U7fQp2YXIgcGFydHM9Y29kZS5zcGxpdCgnLScpO3Bh cnRzWzBdPXBhcnRzWzBdLnRvTG93ZXJDYXNlKCk7aWYodHlwZW9mIE9wZW5MYXll cnMuTGFuZ1twYXJ0c1swXV09PSJvYmplY3QiKXtsYW5nPXBhcnRzWzBdO30KaWYo cGFydHNbMV0pe3ZhciB0ZXN0TGFuZz1wYXJ0c1swXSsnLScrcGFydHNbMV0udG9V cHBlckNhc2UoKTtpZih0eXBlb2YgT3BlbkxheWVycy5MYW5nW3Rlc3RMYW5nXT09 Im9iamVjdCIpe2xhbmc9dGVzdExhbmc7fX0KaWYoIWxhbmcpe09wZW5MYXllcnMu Q29uc29sZS53YXJuKCdGYWlsZWQgdG8gZmluZCBPcGVuTGF5ZXJzLkxhbmcuJytw YXJ0cy5qb2luKCItIikrJyBkaWN0aW9uYXJ5LCBmYWxsaW5nIGJhY2sgdG8gZGVm YXVsdCBsYW5ndWFnZScpO2xhbmc9T3BlbkxheWVycy5MYW5nLmRlZmF1bHRDb2Rl O30KT3BlbkxheWVycy5MYW5nLmNvZGU9bGFuZzt9LHRyYW5zbGF0ZTpmdW5jdGlv bihrZXksY29udGV4dCl7dmFyIGRpY3Rpb25hcnk9T3BlbkxheWVycy5MYW5nW09w ZW5MYXllcnMuTGFuZy5nZXRDb2RlKCldO3ZhciBtZXNzYWdlPWRpY3Rpb25hcnkm JmRpY3Rpb25hcnlba2V5XTtpZighbWVzc2FnZSl7bWVzc2FnZT1rZXk7fQppZihj b250ZXh0KXttZXNzYWdlPU9wZW5MYXllcnMuU3RyaW5nLmZvcm1hdChtZXNzYWdl LGNvbnRleHQpO30KcmV0dXJuIG1lc3NhZ2U7fX07T3BlbkxheWVycy5pMThuPU9w ZW5MYXllcnMuTGFuZy50cmFuc2xhdGU7T3BlbkxheWVycy5TdHJpbmc9e3N0YXJ0 c1dpdGg6ZnVuY3Rpb24oc3RyLHN1Yil7cmV0dXJuKHN0ci5pbmRleE9mKHN1Yik9 PTApO30sY29udGFpbnM6ZnVuY3Rpb24oc3RyLHN1Yil7cmV0dXJuKHN0ci5pbmRl eE9mKHN1YikhPS0xKTt9LHRyaW06ZnVuY3Rpb24oc3RyKXtyZXR1cm4gc3RyLnJl cGxhY2UoL15cc1xzKi8sJycpLnJlcGxhY2UoL1xzXHMqJC8sJycpO30sY2FtZWxp emU6ZnVuY3Rpb24oc3RyKXt2YXIgb1N0cmluZ0xpc3Q9c3RyLnNwbGl0KCctJyk7 dmFyIGNhbWVsaXplZFN0cmluZz1vU3RyaW5nTGlzdFswXTtmb3IodmFyIGk9MSxs ZW49b1N0cmluZ0xpc3QubGVuZ3RoO2k8bGVuO2krKyl7dmFyIHM9b1N0cmluZ0xp c3RbaV07Y2FtZWxpemVkU3RyaW5nKz1zLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgp K3Muc3Vic3RyaW5nKDEpO30KcmV0dXJuIGNhbWVsaXplZFN0cmluZzt9LGZvcm1h dDpmdW5jdGlvbih0ZW1wbGF0ZSxjb250ZXh0LGFyZ3Mpe2lmKCFjb250ZXh0KXtj b250ZXh0PXdpbmRvdzt9CnZhciByZXBsYWNlcj1mdW5jdGlvbihzdHIsbWF0Y2gp e3ZhciByZXBsYWNlbWVudDt2YXIgc3Vicz1tYXRjaC5zcGxpdCgvXC4rLyk7Zm9y KHZhciBpPTA7aTxzdWJzLmxlbmd0aDtpKyspe2lmKGk9PTApe3JlcGxhY2VtZW50 PWNvbnRleHQ7fQpyZXBsYWNlbWVudD1yZXBsYWNlbWVudFtzdWJzW2ldXTt9Cmlm KHR5cGVvZiByZXBsYWNlbWVudD09ImZ1bmN0aW9uIil7cmVwbGFjZW1lbnQ9YXJn cz9yZXBsYWNlbWVudC5hcHBseShudWxsLGFyZ3MpOnJlcGxhY2VtZW50KCk7fQpp Zih0eXBlb2YgcmVwbGFjZW1lbnQ9PSd1bmRlZmluZWQnKXtyZXR1cm4ndW5kZWZp bmVkJzt9ZWxzZXtyZXR1cm4gcmVwbGFjZW1lbnQ7fX07cmV0dXJuIHRlbXBsYXRl LnJlcGxhY2UoT3BlbkxheWVycy5TdHJpbmcudG9rZW5SZWdFeCxyZXBsYWNlcik7 fSx0b2tlblJlZ0V4Oi9cJFx7KFtcdy5dKz8pXH0vZyxudW1iZXJSZWdFeDovXihb Ky1dPykoPz1cZHxcLlxkKVxkKihcLlxkKik/KFtFZV0oWystXT9cZCspKT8kLyxp c051bWVyaWM6ZnVuY3Rpb24odmFsdWUpe3JldHVybiBPcGVuTGF5ZXJzLlN0cmlu Zy5udW1iZXJSZWdFeC50ZXN0KHZhbHVlKTt9LG51bWVyaWNJZjpmdW5jdGlvbih2 YWx1ZSl7cmV0dXJuIE9wZW5MYXllcnMuU3RyaW5nLmlzTnVtZXJpYyh2YWx1ZSk/ cGFyc2VGbG9hdCh2YWx1ZSk6dmFsdWU7fX07aWYoIVN0cmluZy5wcm90b3R5cGUu c3RhcnRzV2l0aCl7U3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoPWZ1bmN0aW9u KHNTdGFydCl7T3BlbkxheWVycy5Db25zb2xlLndhcm4oT3BlbkxheWVycy5pMThu KCJtZXRob2REZXByZWNhdGVkIix7J25ld01ldGhvZCc6J09wZW5MYXllcnMuU3Ry aW5nLnN0YXJ0c1dpdGgnfSkpO3JldHVybiBPcGVuTGF5ZXJzLlN0cmluZy5zdGFy dHNXaXRoKHRoaXMsc1N0YXJ0KTt9O30KaWYoIVN0cmluZy5wcm90b3R5cGUuY29u dGFpbnMpe1N0cmluZy5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24oc3RyKXtP cGVuTGF5ZXJzLkNvbnNvbGUud2FybihPcGVuTGF5ZXJzLmkxOG4oIm1ldGhvZERl cHJlY2F0ZWQiLHsnbmV3TWV0aG9kJzonT3BlbkxheWVycy5TdHJpbmcuY29udGFp bnMnfSkpO3JldHVybiBPcGVuTGF5ZXJzLlN0cmluZy5jb250YWlucyh0aGlzLHN0 cik7fTt9CmlmKCFTdHJpbmcucHJvdG90eXBlLnRyaW0pe1N0cmluZy5wcm90b3R5 cGUudHJpbT1mdW5jdGlvbigpe09wZW5MYXllcnMuQ29uc29sZS53YXJuKE9wZW5M YXllcnMuaTE4bigibWV0aG9kRGVwcmVjYXRlZCIseyduZXdNZXRob2QnOidPcGVu TGF5ZXJzLlN0cmluZy50cmltJ30pKTtyZXR1cm4gT3BlbkxheWVycy5TdHJpbmcu dHJpbSh0aGlzKTt9O30KaWYoIVN0cmluZy5wcm90b3R5cGUuY2FtZWxpemUpe1N0 cmluZy5wcm90b3R5cGUuY2FtZWxpemU9ZnVuY3Rpb24oKXtPcGVuTGF5ZXJzLkNv bnNvbGUud2FybihPcGVuTGF5ZXJzLmkxOG4oIm1ldGhvZERlcHJlY2F0ZWQiLHsn bmV3TWV0aG9kJzonT3BlbkxheWVycy5TdHJpbmcuY2FtZWxpemUnfSkpO3JldHVy biBPcGVuTGF5ZXJzLlN0cmluZy5jYW1lbGl6ZSh0aGlzKTt9O30KT3BlbkxheWVy cy5OdW1iZXI9e2RlY2ltYWxTZXBhcmF0b3I6Ii4iLHRob3VzYW5kc1NlcGFyYXRv cjoiLCIsbGltaXRTaWdEaWdzOmZ1bmN0aW9uKG51bSxzaWcpe3ZhciBmaWc9MDtp ZihzaWc+MCl7ZmlnPXBhcnNlRmxvYXQobnVtLnRvUHJlY2lzaW9uKHNpZykpO30K cmV0dXJuIGZpZzt9LGZvcm1hdDpmdW5jdGlvbihudW0sZGVjLHRzZXAsZHNlcCl7 ZGVjPSh0eXBlb2YgZGVjIT0idW5kZWZpbmVkIik/ZGVjOjA7dHNlcD0odHlwZW9m IHRzZXAhPSJ1bmRlZmluZWQiKT90c2VwOk9wZW5MYXllcnMuTnVtYmVyLnRob3Vz YW5kc1NlcGFyYXRvcjtkc2VwPSh0eXBlb2YgZHNlcCE9InVuZGVmaW5lZCIpP2Rz ZXA6T3BlbkxheWVycy5OdW1iZXIuZGVjaW1hbFNlcGFyYXRvcjtpZihkZWMhPW51 bGwpe251bT1wYXJzZUZsb2F0KG51bS50b0ZpeGVkKGRlYykpO30KdmFyIHBhcnRz PW51bS50b1N0cmluZygpLnNwbGl0KCIuIik7aWYocGFydHMubGVuZ3RoPT0xJiZk ZWM9PW51bGwpe2RlYz0wO30KdmFyIGludGVnZXI9cGFydHNbMF07aWYodHNlcCl7 dmFyIHRob3VzYW5kcz0vKC0/WzAtOV0rKShbMC05XXszfSkvO3doaWxlKHRob3Vz YW5kcy50ZXN0KGludGVnZXIpKXtpbnRlZ2VyPWludGVnZXIucmVwbGFjZSh0aG91 c2FuZHMsIiQxIit0c2VwKyIkMiIpO319CnZhciBzdHI7aWYoZGVjPT0wKXtzdHI9 aW50ZWdlcjt9ZWxzZXt2YXIgcmVtPXBhcnRzLmxlbmd0aD4xP3BhcnRzWzFdOiIw IjtpZihkZWMhPW51bGwpe3JlbT1yZW0rbmV3IEFycmF5KGRlYy1yZW0ubGVuZ3Ro KzEpLmpvaW4oIjAiKTt9CnN0cj1pbnRlZ2VyK2RzZXArcmVtO30KcmV0dXJuIHN0 cjt9fTtpZighTnVtYmVyLnByb3RvdHlwZS5saW1pdFNpZ0RpZ3Mpe051bWJlci5w cm90b3R5cGUubGltaXRTaWdEaWdzPWZ1bmN0aW9uKHNpZyl7T3BlbkxheWVycy5D b25zb2xlLndhcm4oT3BlbkxheWVycy5pMThuKCJtZXRob2REZXByZWNhdGVkIix7 J25ld01ldGhvZCc6J09wZW5MYXllcnMuTnVtYmVyLmxpbWl0U2lnRGlncyd9KSk7 cmV0dXJuIE9wZW5MYXllcnMuTnVtYmVyLmxpbWl0U2lnRGlncyh0aGlzLHNpZyk7 fTt9Ck9wZW5MYXllcnMuRnVuY3Rpb249e2JpbmQ6ZnVuY3Rpb24oZnVuYyxvYmpl Y3Qpe3ZhciBhcmdzPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVu dHMsWzJdKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbmV3QXJncz1hcmdzLmNvbmNh dChBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzLFswXSkpO3Jl dHVybiBmdW5jLmFwcGx5KG9iamVjdCxuZXdBcmdzKTt9O30sYmluZEFzRXZlbnRM aXN0ZW5lcjpmdW5jdGlvbihmdW5jLG9iamVjdCl7cmV0dXJuIGZ1bmN0aW9uKGV2 ZW50KXtyZXR1cm4gZnVuYy5jYWxsKG9iamVjdCxldmVudHx8d2luZG93LmV2ZW50 KTt9O30sRmFsc2U6ZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2U7fSxUcnVlOmZ1bmN0 aW9uKCl7cmV0dXJuIHRydWU7fSxWb2lkOmZ1bmN0aW9uKCl7fX07aWYoIUZ1bmN0 aW9uLnByb3RvdHlwZS5iaW5kKXtGdW5jdGlvbi5wcm90b3R5cGUuYmluZD1mdW5j dGlvbigpe09wZW5MYXllcnMuQ29uc29sZS53YXJuKE9wZW5MYXllcnMuaTE4bigi bWV0aG9kRGVwcmVjYXRlZCIseyduZXdNZXRob2QnOidPcGVuTGF5ZXJzLkZ1bmN0 aW9uLmJpbmQnfSkpO0FycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KGFyZ3Vt ZW50cyxbdGhpc10pO3JldHVybiBPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQuYXBw bHkobnVsbCxhcmd1bWVudHMpO307fQppZighRnVuY3Rpb24ucHJvdG90eXBlLmJp bmRBc0V2ZW50TGlzdGVuZXIpe0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kQXNFdmVu dExpc3RlbmVyPWZ1bmN0aW9uKG9iamVjdCl7T3BlbkxheWVycy5Db25zb2xlLndh cm4oT3BlbkxheWVycy5pMThuKCJtZXRob2REZXByZWNhdGVkIix7J25ld01ldGhv ZCc6J09wZW5MYXllcnMuRnVuY3Rpb24uYmluZEFzRXZlbnRMaXN0ZW5lcid9KSk7 cmV0dXJuIE9wZW5MYXllcnMuRnVuY3Rpb24uYmluZEFzRXZlbnRMaXN0ZW5lcih0 aGlzLG9iamVjdCk7fTt9Ck9wZW5MYXllcnMuQXJyYXk9e2ZpbHRlcjpmdW5jdGlv bihhcnJheSxjYWxsYmFjayxjYWxsZXIpe3ZhciBzZWxlY3RlZD1bXTtpZihBcnJh eS5wcm90b3R5cGUuZmlsdGVyKXtzZWxlY3RlZD1hcnJheS5maWx0ZXIoY2FsbGJh Y2ssY2FsbGVyKTt9ZWxzZXt2YXIgbGVuPWFycmF5Lmxlbmd0aDtpZih0eXBlb2Yg Y2FsbGJhY2shPSJmdW5jdGlvbiIpe3Rocm93IG5ldyBUeXBlRXJyb3IoKTt9CmZv cih2YXIgaT0wO2k8bGVuO2krKyl7aWYoaSBpbiBhcnJheSl7dmFyIHZhbD1hcnJh eVtpXTtpZihjYWxsYmFjay5jYWxsKGNhbGxlcix2YWwsaSxhcnJheSkpe3NlbGVj dGVkLnB1c2godmFsKTt9fX19CnJldHVybiBzZWxlY3RlZDt9fTtPcGVuTGF5ZXJz LkJvdW5kcz1PcGVuTGF5ZXJzLkNsYXNzKHtsZWZ0Om51bGwsYm90dG9tOm51bGws cmlnaHQ6bnVsbCx0b3A6bnVsbCxjZW50ZXJMb25MYXQ6bnVsbCxpbml0aWFsaXpl OmZ1bmN0aW9uKGxlZnQsYm90dG9tLHJpZ2h0LHRvcCl7aWYobGVmdCE9bnVsbCl7 dGhpcy5sZWZ0PU9wZW5MYXllcnMuVXRpbC50b0Zsb2F0KGxlZnQpO30KaWYoYm90 dG9tIT1udWxsKXt0aGlzLmJvdHRvbT1PcGVuTGF5ZXJzLlV0aWwudG9GbG9hdChi b3R0b20pO30KaWYocmlnaHQhPW51bGwpe3RoaXMucmlnaHQ9T3BlbkxheWVycy5V dGlsLnRvRmxvYXQocmlnaHQpO30KaWYodG9wIT1udWxsKXt0aGlzLnRvcD1PcGVu TGF5ZXJzLlV0aWwudG9GbG9hdCh0b3ApO319LGNsb25lOmZ1bmN0aW9uKCl7cmV0 dXJuIG5ldyBPcGVuTGF5ZXJzLkJvdW5kcyh0aGlzLmxlZnQsdGhpcy5ib3R0b20s dGhpcy5yaWdodCx0aGlzLnRvcCk7fSxlcXVhbHM6ZnVuY3Rpb24oYm91bmRzKXt2 YXIgZXF1YWxzPWZhbHNlO2lmKGJvdW5kcyE9bnVsbCl7ZXF1YWxzPSgodGhpcy5s ZWZ0PT1ib3VuZHMubGVmdCkmJih0aGlzLnJpZ2h0PT1ib3VuZHMucmlnaHQpJiYo dGhpcy50b3A9PWJvdW5kcy50b3ApJiYodGhpcy5ib3R0b209PWJvdW5kcy5ib3R0 b20pKTt9CnJldHVybiBlcXVhbHM7fSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVy blt0aGlzLmxlZnQsdGhpcy5ib3R0b20sdGhpcy5yaWdodCx0aGlzLnRvcF0uam9p bigiLCIpO30sdG9BcnJheTpmdW5jdGlvbihyZXZlcnNlQXhpc09yZGVyKXtpZihy ZXZlcnNlQXhpc09yZGVyPT09dHJ1ZSl7cmV0dXJuW3RoaXMuYm90dG9tLHRoaXMu bGVmdCx0aGlzLnRvcCx0aGlzLnJpZ2h0XTt9ZWxzZXtyZXR1cm5bdGhpcy5sZWZ0 LHRoaXMuYm90dG9tLHRoaXMucmlnaHQsdGhpcy50b3BdO319LHRvQkJPWDpmdW5j dGlvbihkZWNpbWFsLHJldmVyc2VBeGlzT3JkZXIpe2lmKGRlY2ltYWw9PW51bGwp e2RlY2ltYWw9Njt9CnZhciBtdWx0PU1hdGgucG93KDEwLGRlY2ltYWwpO3ZhciB4 bWluPU1hdGgucm91bmQodGhpcy5sZWZ0Km11bHQpL211bHQ7dmFyIHltaW49TWF0 aC5yb3VuZCh0aGlzLmJvdHRvbSptdWx0KS9tdWx0O3ZhciB4bWF4PU1hdGgucm91 bmQodGhpcy5yaWdodCptdWx0KS9tdWx0O3ZhciB5bWF4PU1hdGgucm91bmQodGhp cy50b3AqbXVsdCkvbXVsdDtpZihyZXZlcnNlQXhpc09yZGVyPT09dHJ1ZSl7cmV0 dXJuIHltaW4rIiwiK3htaW4rIiwiK3ltYXgrIiwiK3htYXg7fWVsc2V7cmV0dXJu IHhtaW4rIiwiK3ltaW4rIiwiK3htYXgrIiwiK3ltYXg7fX0sdG9HZW9tZXRyeTpm dW5jdGlvbigpe3JldHVybiBuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2x5Z29u KFtuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5MaW5lYXJSaW5nKFtuZXcgT3Blbkxh eWVycy5HZW9tZXRyeS5Qb2ludCh0aGlzLmxlZnQsdGhpcy5ib3R0b20pLG5ldyBP cGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KHRoaXMucmlnaHQsdGhpcy5ib3R0b20p LG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KHRoaXMucmlnaHQsdGhpcy50 b3ApLG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KHRoaXMubGVmdCx0aGlz LnRvcCldKV0pO30sZ2V0V2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yaWdo dC10aGlzLmxlZnQpO30sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMu dG9wLXRoaXMuYm90dG9tKTt9LGdldFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3 IE9wZW5MYXllcnMuU2l6ZSh0aGlzLmdldFdpZHRoKCksdGhpcy5nZXRIZWlnaHQo KSk7fSxnZXRDZW50ZXJQaXhlbDpmdW5jdGlvbigpe3JldHVybiBuZXcgT3Blbkxh eWVycy5QaXhlbCgodGhpcy5sZWZ0K3RoaXMucmlnaHQpLzIsKHRoaXMuYm90dG9t K3RoaXMudG9wKS8yKTt9LGdldENlbnRlckxvbkxhdDpmdW5jdGlvbigpe2lmKCF0 aGlzLmNlbnRlckxvbkxhdCl7dGhpcy5jZW50ZXJMb25MYXQ9bmV3IE9wZW5MYXll cnMuTG9uTGF0KCh0aGlzLmxlZnQrdGhpcy5yaWdodCkvMiwodGhpcy5ib3R0b20r dGhpcy50b3ApLzIpO30KcmV0dXJuIHRoaXMuY2VudGVyTG9uTGF0O30sc2NhbGU6 ZnVuY3Rpb24ocmF0aW8sb3JpZ2luKXtpZihvcmlnaW49PW51bGwpe29yaWdpbj10 aGlzLmdldENlbnRlckxvbkxhdCgpO30KdmFyIG9yaWd4LG9yaWd5O2lmKG9yaWdp bi5DTEFTU19OQU1FPT0iT3BlbkxheWVycy5Mb25MYXQiKXtvcmlneD1vcmlnaW4u bG9uO29yaWd5PW9yaWdpbi5sYXQ7fWVsc2V7b3JpZ3g9b3JpZ2luLng7b3JpZ3k9 b3JpZ2luLnk7fQp2YXIgbGVmdD0odGhpcy5sZWZ0LW9yaWd4KSpyYXRpbytvcmln eDt2YXIgYm90dG9tPSh0aGlzLmJvdHRvbS1vcmlneSkqcmF0aW8rb3JpZ3k7dmFy IHJpZ2h0PSh0aGlzLnJpZ2h0LW9yaWd4KSpyYXRpbytvcmlneDt2YXIgdG9wPSh0 aGlzLnRvcC1vcmlneSkqcmF0aW8rb3JpZ3k7cmV0dXJuIG5ldyBPcGVuTGF5ZXJz LkJvdW5kcyhsZWZ0LGJvdHRvbSxyaWdodCx0b3ApO30sYWRkOmZ1bmN0aW9uKHgs eSl7aWYoKHg9PW51bGwpfHwoeT09bnVsbCkpe3ZhciBtc2c9T3BlbkxheWVycy5p MThuKCJib3VuZHNBZGRFcnJvciIpO09wZW5MYXllcnMuQ29uc29sZS5lcnJvciht c2cpO3JldHVybiBudWxsO30KcmV0dXJuIG5ldyBPcGVuTGF5ZXJzLkJvdW5kcyh0 aGlzLmxlZnQreCx0aGlzLmJvdHRvbSt5LHRoaXMucmlnaHQreCx0aGlzLnRvcCt5 KTt9LGV4dGVuZDpmdW5jdGlvbihvYmplY3Qpe3ZhciBib3VuZHM9bnVsbDtpZihv YmplY3Qpe3N3aXRjaChvYmplY3QuQ0xBU1NfTkFNRSl7Y2FzZSJPcGVuTGF5ZXJz LkxvbkxhdCI6Ym91bmRzPW5ldyBPcGVuTGF5ZXJzLkJvdW5kcyhvYmplY3QubG9u LG9iamVjdC5sYXQsb2JqZWN0LmxvbixvYmplY3QubGF0KTticmVhaztjYXNlIk9w ZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQiOmJvdW5kcz1uZXcgT3BlbkxheWVycy5C b3VuZHMob2JqZWN0Lngsb2JqZWN0Lnksb2JqZWN0Lngsb2JqZWN0LnkpO2JyZWFr O2Nhc2UiT3BlbkxheWVycy5Cb3VuZHMiOmJvdW5kcz1vYmplY3Q7YnJlYWs7fQpp Zihib3VuZHMpe3RoaXMuY2VudGVyTG9uTGF0PW51bGw7aWYoKHRoaXMubGVmdD09 bnVsbCl8fChib3VuZHMubGVmdDx0aGlzLmxlZnQpKXt0aGlzLmxlZnQ9Ym91bmRz LmxlZnQ7fQppZigodGhpcy5ib3R0b209PW51bGwpfHwoYm91bmRzLmJvdHRvbTx0 aGlzLmJvdHRvbSkpe3RoaXMuYm90dG9tPWJvdW5kcy5ib3R0b207fQppZigodGhp cy5yaWdodD09bnVsbCl8fChib3VuZHMucmlnaHQ+dGhpcy5yaWdodCkpe3RoaXMu cmlnaHQ9Ym91bmRzLnJpZ2h0O30KaWYoKHRoaXMudG9wPT1udWxsKXx8KGJvdW5k cy50b3A+dGhpcy50b3ApKXt0aGlzLnRvcD1ib3VuZHMudG9wO319fX0sY29udGFp bnNMb25MYXQ6ZnVuY3Rpb24obGwsaW5jbHVzaXZlKXtyZXR1cm4gdGhpcy5jb250 YWlucyhsbC5sb24sbGwubGF0LGluY2x1c2l2ZSk7fSxjb250YWluc1BpeGVsOmZ1 bmN0aW9uKHB4LGluY2x1c2l2ZSl7cmV0dXJuIHRoaXMuY29udGFpbnMocHgueCxw eC55LGluY2x1c2l2ZSk7fSxjb250YWluczpmdW5jdGlvbih4LHksaW5jbHVzaXZl KXtpZihpbmNsdXNpdmU9PW51bGwpe2luY2x1c2l2ZT10cnVlO30KaWYoeD09bnVs bHx8eT09bnVsbCl7cmV0dXJuIGZhbHNlO30KeD1PcGVuTGF5ZXJzLlV0aWwudG9G bG9hdCh4KTt5PU9wZW5MYXllcnMuVXRpbC50b0Zsb2F0KHkpO3ZhciBjb250YWlu cz1mYWxzZTtpZihpbmNsdXNpdmUpe2NvbnRhaW5zPSgoeD49dGhpcy5sZWZ0KSYm KHg8PXRoaXMucmlnaHQpJiYoeT49dGhpcy5ib3R0b20pJiYoeTw9dGhpcy50b3Ap KTt9ZWxzZXtjb250YWlucz0oKHg+dGhpcy5sZWZ0KSYmKHg8dGhpcy5yaWdodCkm Jih5PnRoaXMuYm90dG9tKSYmKHk8dGhpcy50b3ApKTt9CnJldHVybiBjb250YWlu czt9LGludGVyc2VjdHNCb3VuZHM6ZnVuY3Rpb24oYm91bmRzLGluY2x1c2l2ZSl7 aWYoaW5jbHVzaXZlPT1udWxsKXtpbmNsdXNpdmU9dHJ1ZTt9CnZhciBpbnRlcnNl Y3RzPWZhbHNlO3ZhciBtaWdodFRvdWNoPSh0aGlzLmxlZnQ9PWJvdW5kcy5yaWdo dHx8dGhpcy5yaWdodD09Ym91bmRzLmxlZnR8fHRoaXMudG9wPT1ib3VuZHMuYm90 dG9tfHx0aGlzLmJvdHRvbT09Ym91bmRzLnRvcCk7aWYoaW5jbHVzaXZlfHwhbWln aHRUb3VjaCl7dmFyIGluQm90dG9tPSgoKGJvdW5kcy5ib3R0b20+PXRoaXMuYm90 dG9tKSYmKGJvdW5kcy5ib3R0b208PXRoaXMudG9wKSl8fCgodGhpcy5ib3R0b20+ PWJvdW5kcy5ib3R0b20pJiYodGhpcy5ib3R0b208PWJvdW5kcy50b3ApKSk7dmFy IGluVG9wPSgoKGJvdW5kcy50b3A+PXRoaXMuYm90dG9tKSYmKGJvdW5kcy50b3A8 PXRoaXMudG9wKSl8fCgodGhpcy50b3A+Ym91bmRzLmJvdHRvbSkmJih0aGlzLnRv cDxib3VuZHMudG9wKSkpO3ZhciBpbkxlZnQ9KCgoYm91bmRzLmxlZnQ+PXRoaXMu bGVmdCkmJihib3VuZHMubGVmdDw9dGhpcy5yaWdodCkpfHwoKHRoaXMubGVmdD49 Ym91bmRzLmxlZnQpJiYodGhpcy5sZWZ0PD1ib3VuZHMucmlnaHQpKSk7dmFyIGlu UmlnaHQ9KCgoYm91bmRzLnJpZ2h0Pj10aGlzLmxlZnQpJiYoYm91bmRzLnJpZ2h0 PD10aGlzLnJpZ2h0KSl8fCgodGhpcy5yaWdodD49Ym91bmRzLmxlZnQpJiYodGhp cy5yaWdodDw9Ym91bmRzLnJpZ2h0KSkpO2ludGVyc2VjdHM9KChpbkJvdHRvbXx8 aW5Ub3ApJiYoaW5MZWZ0fHxpblJpZ2h0KSk7fQpyZXR1cm4gaW50ZXJzZWN0czt9 LGNvbnRhaW5zQm91bmRzOmZ1bmN0aW9uKGJvdW5kcyxwYXJ0aWFsLGluY2x1c2l2 ZSl7aWYocGFydGlhbD09bnVsbCl7cGFydGlhbD1mYWxzZTt9CmlmKGluY2x1c2l2 ZT09bnVsbCl7aW5jbHVzaXZlPXRydWU7fQp2YXIgYm90dG9tTGVmdD10aGlzLmNv bnRhaW5zKGJvdW5kcy5sZWZ0LGJvdW5kcy5ib3R0b20saW5jbHVzaXZlKTt2YXIg Ym90dG9tUmlnaHQ9dGhpcy5jb250YWlucyhib3VuZHMucmlnaHQsYm91bmRzLmJv dHRvbSxpbmNsdXNpdmUpO3ZhciB0b3BMZWZ0PXRoaXMuY29udGFpbnMoYm91bmRz LmxlZnQsYm91bmRzLnRvcCxpbmNsdXNpdmUpO3ZhciB0b3BSaWdodD10aGlzLmNv bnRhaW5zKGJvdW5kcy5yaWdodCxib3VuZHMudG9wLGluY2x1c2l2ZSk7cmV0dXJu KHBhcnRpYWwpPyhib3R0b21MZWZ0fHxib3R0b21SaWdodHx8dG9wTGVmdHx8dG9w UmlnaHQpOihib3R0b21MZWZ0JiZib3R0b21SaWdodCYmdG9wTGVmdCYmdG9wUmln aHQpO30sZGV0ZXJtaW5lUXVhZHJhbnQ6ZnVuY3Rpb24obG9ubGF0KXt2YXIgcXVh ZHJhbnQ9IiI7dmFyIGNlbnRlcj10aGlzLmdldENlbnRlckxvbkxhdCgpO3F1YWRy YW50Kz0obG9ubGF0LmxhdDxjZW50ZXIubGF0KT8iYiI6InQiO3F1YWRyYW50Kz0o bG9ubGF0LmxvbjxjZW50ZXIubG9uKT8ibCI6InIiO3JldHVybiBxdWFkcmFudDt9 LHRyYW5zZm9ybTpmdW5jdGlvbihzb3VyY2UsZGVzdCl7dGhpcy5jZW50ZXJMb25M YXQ9bnVsbDt2YXIgbGw9T3BlbkxheWVycy5Qcm9qZWN0aW9uLnRyYW5zZm9ybSh7 J3gnOnRoaXMubGVmdCwneSc6dGhpcy5ib3R0b219LHNvdXJjZSxkZXN0KTt2YXIg bHI9T3BlbkxheWVycy5Qcm9qZWN0aW9uLnRyYW5zZm9ybSh7J3gnOnRoaXMucmln aHQsJ3knOnRoaXMuYm90dG9tfSxzb3VyY2UsZGVzdCk7dmFyIHVsPU9wZW5MYXll cnMuUHJvamVjdGlvbi50cmFuc2Zvcm0oeyd4Jzp0aGlzLmxlZnQsJ3knOnRoaXMu dG9wfSxzb3VyY2UsZGVzdCk7dmFyIHVyPU9wZW5MYXllcnMuUHJvamVjdGlvbi50 cmFuc2Zvcm0oeyd4Jzp0aGlzLnJpZ2h0LCd5Jzp0aGlzLnRvcH0sc291cmNlLGRl c3QpO3RoaXMubGVmdD1NYXRoLm1pbihsbC54LHVsLngpO3RoaXMuYm90dG9tPU1h dGgubWluKGxsLnksbHIueSk7dGhpcy5yaWdodD1NYXRoLm1heChsci54LHVyLngp O3RoaXMudG9wPU1hdGgubWF4KHVsLnksdXIueSk7cmV0dXJuIHRoaXM7fSx3cmFw RGF0ZUxpbmU6ZnVuY3Rpb24obWF4RXh0ZW50LG9wdGlvbnMpe29wdGlvbnM9b3B0 aW9uc3x8e307dmFyIGxlZnRUb2xlcmFuY2U9b3B0aW9ucy5sZWZ0VG9sZXJhbmNl fHwwO3ZhciByaWdodFRvbGVyYW5jZT1vcHRpb25zLnJpZ2h0VG9sZXJhbmNlfHww O3ZhciBuZXdCb3VuZHM9dGhpcy5jbG9uZSgpO2lmKG1heEV4dGVudCl7d2hpbGUo bmV3Qm91bmRzLmxlZnQ8bWF4RXh0ZW50LmxlZnQmJihuZXdCb3VuZHMucmlnaHQt cmlnaHRUb2xlcmFuY2UpPD1tYXhFeHRlbnQubGVmdCl7bmV3Qm91bmRzPW5ld0Jv dW5kcy5hZGQobWF4RXh0ZW50LmdldFdpZHRoKCksMCk7fQp3aGlsZSgobmV3Qm91 bmRzLmxlZnQrbGVmdFRvbGVyYW5jZSk+PW1heEV4dGVudC5yaWdodCYmbmV3Qm91 bmRzLnJpZ2h0Pm1heEV4dGVudC5yaWdodCl7bmV3Qm91bmRzPW5ld0JvdW5kcy5h ZGQoLW1heEV4dGVudC5nZXRXaWR0aCgpLDApO319CnJldHVybiBuZXdCb3VuZHM7 fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkJvdW5kcyJ9KTtPcGVuTGF5ZXJzLkJv dW5kcy5mcm9tU3RyaW5nPWZ1bmN0aW9uKHN0cixyZXZlcnNlQXhpc09yZGVyKXt2 YXIgYm91bmRzPXN0ci5zcGxpdCgiLCIpO3JldHVybiBPcGVuTGF5ZXJzLkJvdW5k cy5mcm9tQXJyYXkoYm91bmRzLHJldmVyc2VBeGlzT3JkZXIpO307T3BlbkxheWVy cy5Cb3VuZHMuZnJvbUFycmF5PWZ1bmN0aW9uKGJib3gscmV2ZXJzZUF4aXNPcmRl cil7cmV0dXJuIHJldmVyc2VBeGlzT3JkZXI9PT10cnVlP25ldyBPcGVuTGF5ZXJz LkJvdW5kcyhwYXJzZUZsb2F0KGJib3hbMV0pLHBhcnNlRmxvYXQoYmJveFswXSks cGFyc2VGbG9hdChiYm94WzNdKSxwYXJzZUZsb2F0KGJib3hbMl0pKTpuZXcgT3Bl bkxheWVycy5Cb3VuZHMocGFyc2VGbG9hdChiYm94WzBdKSxwYXJzZUZsb2F0KGJi b3hbMV0pLHBhcnNlRmxvYXQoYmJveFsyXSkscGFyc2VGbG9hdChiYm94WzNdKSk7 fTtPcGVuTGF5ZXJzLkJvdW5kcy5mcm9tU2l6ZT1mdW5jdGlvbihzaXplKXtyZXR1 cm4gbmV3IE9wZW5MYXllcnMuQm91bmRzKDAsc2l6ZS5oLHNpemUudywwKTt9O09w ZW5MYXllcnMuQm91bmRzLm9wcG9zaXRlUXVhZHJhbnQ9ZnVuY3Rpb24ocXVhZHJh bnQpe3ZhciBvcHA9IiI7b3BwKz0ocXVhZHJhbnQuY2hhckF0KDApPT0ndCcpPydi JzondCc7b3BwKz0ocXVhZHJhbnQuY2hhckF0KDEpPT0nbCcpPydyJzonbCc7cmV0 dXJuIG9wcDt9O09wZW5MYXllcnMuRWxlbWVudD17dmlzaWJsZTpmdW5jdGlvbihl bGVtZW50KXtyZXR1cm4gT3BlbkxheWVycy5VdGlsLmdldEVsZW1lbnQoZWxlbWVu dCkuc3R5bGUuZGlzcGxheSE9J25vbmUnO30sdG9nZ2xlOmZ1bmN0aW9uKCl7Zm9y KHZhciBpPTAsbGVuPWFyZ3VtZW50cy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgZWxl bWVudD1PcGVuTGF5ZXJzLlV0aWwuZ2V0RWxlbWVudChhcmd1bWVudHNbaV0pO3Zh ciBkaXNwbGF5PU9wZW5MYXllcnMuRWxlbWVudC52aXNpYmxlKGVsZW1lbnQpPydo aWRlJzonc2hvdyc7T3BlbkxheWVycy5FbGVtZW50W2Rpc3BsYXldKGVsZW1lbnQp O319LGhpZGU6ZnVuY3Rpb24oKXtPcGVuTGF5ZXJzLkNvbnNvbGUud2FybihPcGVu TGF5ZXJzLmkxOG4oIm1ldGhvZERlcHJlY2F0ZWQiLHtuZXdNZXRob2Q6ImVsZW1l bnQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsifSkpO2Zvcih2YXIgaT0wLGxlbj1h cmd1bWVudHMubGVuZ3RoO2k8bGVuO2krKyl7dmFyIGVsZW1lbnQ9T3BlbkxheWVy cy5VdGlsLmdldEVsZW1lbnQoYXJndW1lbnRzW2ldKTtpZihlbGVtZW50KXtlbGVt ZW50LnN0eWxlLmRpc3BsYXk9J25vbmUnO319fSxzaG93OmZ1bmN0aW9uKCl7T3Bl bkxheWVycy5Db25zb2xlLndhcm4oT3BlbkxheWVycy5pMThuKCJtZXRob2REZXBy ZWNhdGVkIix7bmV3TWV0aG9kOiJlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJzsi fSkpO2Zvcih2YXIgaT0wLGxlbj1hcmd1bWVudHMubGVuZ3RoO2k8bGVuO2krKyl7 dmFyIGVsZW1lbnQ9T3BlbkxheWVycy5VdGlsLmdldEVsZW1lbnQoYXJndW1lbnRz W2ldKTtpZihlbGVtZW50KXtlbGVtZW50LnN0eWxlLmRpc3BsYXk9Jyc7fX19LHJl bW92ZTpmdW5jdGlvbihlbGVtZW50KXtlbGVtZW50PU9wZW5MYXllcnMuVXRpbC5n ZXRFbGVtZW50KGVsZW1lbnQpO2VsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGls ZChlbGVtZW50KTt9LGdldEhlaWdodDpmdW5jdGlvbihlbGVtZW50KXtlbGVtZW50 PU9wZW5MYXllcnMuVXRpbC5nZXRFbGVtZW50KGVsZW1lbnQpO3JldHVybiBlbGVt ZW50Lm9mZnNldEhlaWdodDt9LGdldERpbWVuc2lvbnM6ZnVuY3Rpb24oZWxlbWVu dCl7ZWxlbWVudD1PcGVuTGF5ZXJzLlV0aWwuZ2V0RWxlbWVudChlbGVtZW50KTtp ZihPcGVuTGF5ZXJzLkVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwnZGlzcGxheScp IT0nbm9uZScpe3JldHVybnt3aWR0aDplbGVtZW50Lm9mZnNldFdpZHRoLGhlaWdo dDplbGVtZW50Lm9mZnNldEhlaWdodH07fQp2YXIgZWxzPWVsZW1lbnQuc3R5bGU7 dmFyIG9yaWdpbmFsVmlzaWJpbGl0eT1lbHMudmlzaWJpbGl0eTt2YXIgb3JpZ2lu YWxQb3NpdGlvbj1lbHMucG9zaXRpb247dmFyIG9yaWdpbmFsRGlzcGxheT1lbHMu ZGlzcGxheTtlbHMudmlzaWJpbGl0eT0naGlkZGVuJztlbHMucG9zaXRpb249J2Fi c29sdXRlJztlbHMuZGlzcGxheT0nJzt2YXIgb3JpZ2luYWxXaWR0aD1lbGVtZW50 LmNsaWVudFdpZHRoO3ZhciBvcmlnaW5hbEhlaWdodD1lbGVtZW50LmNsaWVudEhl aWdodDtlbHMuZGlzcGxheT1vcmlnaW5hbERpc3BsYXk7ZWxzLnBvc2l0aW9uPW9y aWdpbmFsUG9zaXRpb247ZWxzLnZpc2liaWxpdHk9b3JpZ2luYWxWaXNpYmlsaXR5 O3JldHVybnt3aWR0aDpvcmlnaW5hbFdpZHRoLGhlaWdodDpvcmlnaW5hbEhlaWdo dH07fSxoYXNDbGFzczpmdW5jdGlvbihlbGVtZW50LG5hbWUpe3ZhciBuYW1lcz1l bGVtZW50LmNsYXNzTmFtZTtyZXR1cm4oISFuYW1lcyYmbmV3IFJlZ0V4cCgiKF58 XFxzKSIrbmFtZSsiKFxcc3wkKSIpLnRlc3QobmFtZXMpKTt9LGFkZENsYXNzOmZ1 bmN0aW9uKGVsZW1lbnQsbmFtZSl7aWYoIU9wZW5MYXllcnMuRWxlbWVudC5oYXND bGFzcyhlbGVtZW50LG5hbWUpKXtlbGVtZW50LmNsYXNzTmFtZSs9KGVsZW1lbnQu Y2xhc3NOYW1lPyIgIjoiIikrbmFtZTt9CnJldHVybiBlbGVtZW50O30scmVtb3Zl Q2xhc3M6ZnVuY3Rpb24oZWxlbWVudCxuYW1lKXt2YXIgbmFtZXM9ZWxlbWVudC5j bGFzc05hbWU7aWYobmFtZXMpe2VsZW1lbnQuY2xhc3NOYW1lPU9wZW5MYXllcnMu U3RyaW5nLnRyaW0obmFtZXMucmVwbGFjZShuZXcgUmVnRXhwKCIoXnxcXHMrKSIr bmFtZSsiKFxccyt8JCkiKSwiICIpKTt9CnJldHVybiBlbGVtZW50O30sdG9nZ2xl Q2xhc3M6ZnVuY3Rpb24oZWxlbWVudCxuYW1lKXtpZihPcGVuTGF5ZXJzLkVsZW1l bnQuaGFzQ2xhc3MoZWxlbWVudCxuYW1lKSl7T3BlbkxheWVycy5FbGVtZW50LnJl bW92ZUNsYXNzKGVsZW1lbnQsbmFtZSk7fWVsc2V7T3BlbkxheWVycy5FbGVtZW50 LmFkZENsYXNzKGVsZW1lbnQsbmFtZSk7fQpyZXR1cm4gZWxlbWVudDt9LGdldFN0 eWxlOmZ1bmN0aW9uKGVsZW1lbnQsc3R5bGUpe2VsZW1lbnQ9T3BlbkxheWVycy5V dGlsLmdldEVsZW1lbnQoZWxlbWVudCk7dmFyIHZhbHVlPW51bGw7aWYoZWxlbWVu dCYmZWxlbWVudC5zdHlsZSl7dmFsdWU9ZWxlbWVudC5zdHlsZVtPcGVuTGF5ZXJz LlN0cmluZy5jYW1lbGl6ZShzdHlsZSldO2lmKCF2YWx1ZSl7aWYoZG9jdW1lbnQu ZGVmYXVsdFZpZXcmJmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5 bGUpe3ZhciBjc3M9ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHls ZShlbGVtZW50LG51bGwpO3ZhbHVlPWNzcz9jc3MuZ2V0UHJvcGVydHlWYWx1ZShz dHlsZSk6bnVsbDt9ZWxzZSBpZihlbGVtZW50LmN1cnJlbnRTdHlsZSl7dmFsdWU9 ZWxlbWVudC5jdXJyZW50U3R5bGVbT3BlbkxheWVycy5TdHJpbmcuY2FtZWxpemUo c3R5bGUpXTt9fQp2YXIgcG9zaXRpb25zPVsnbGVmdCcsJ3RvcCcsJ3JpZ2h0Jywn Ym90dG9tJ107aWYod2luZG93Lm9wZXJhJiYoT3BlbkxheWVycy5VdGlsLmluZGV4 T2YocG9zaXRpb25zLHN0eWxlKSE9LTEpJiYoT3BlbkxheWVycy5FbGVtZW50Lmdl dFN0eWxlKGVsZW1lbnQsJ3Bvc2l0aW9uJyk9PSdzdGF0aWMnKSl7dmFsdWU9J2F1 dG8nO319CnJldHVybiB2YWx1ZT09J2F1dG8nP251bGw6dmFsdWU7fX07T3Blbkxh eWVycy5Mb25MYXQ9T3BlbkxheWVycy5DbGFzcyh7bG9uOjAuMCxsYXQ6MC4wLGlu aXRpYWxpemU6ZnVuY3Rpb24obG9uLGxhdCl7dGhpcy5sb249T3BlbkxheWVycy5V dGlsLnRvRmxvYXQobG9uKTt0aGlzLmxhdD1PcGVuTGF5ZXJzLlV0aWwudG9GbG9h dChsYXQpO30sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4oImxvbj0iK3RoaXMu bG9uKyIsbGF0PSIrdGhpcy5sYXQpO30sdG9TaG9ydFN0cmluZzpmdW5jdGlvbigp e3JldHVybih0aGlzLmxvbisiLCAiK3RoaXMubGF0KTt9LGNsb25lOmZ1bmN0aW9u KCl7cmV0dXJuIG5ldyBPcGVuTGF5ZXJzLkxvbkxhdCh0aGlzLmxvbix0aGlzLmxh dCk7fSxhZGQ6ZnVuY3Rpb24obG9uLGxhdCl7aWYoKGxvbj09bnVsbCl8fChsYXQ9 PW51bGwpKXt2YXIgbXNnPU9wZW5MYXllcnMuaTE4bigibG9ubGF0QWRkRXJyb3Ii KTtPcGVuTGF5ZXJzLkNvbnNvbGUuZXJyb3IobXNnKTtyZXR1cm4gbnVsbDt9CnJl dHVybiBuZXcgT3BlbkxheWVycy5Mb25MYXQodGhpcy5sb24rT3BlbkxheWVycy5V dGlsLnRvRmxvYXQobG9uKSx0aGlzLmxhdCtPcGVuTGF5ZXJzLlV0aWwudG9GbG9h dChsYXQpKTt9LGVxdWFsczpmdW5jdGlvbihsbCl7dmFyIGVxdWFscz1mYWxzZTtp ZihsbCE9bnVsbCl7ZXF1YWxzPSgodGhpcy5sb249PWxsLmxvbiYmdGhpcy5sYXQ9 PWxsLmxhdCl8fChpc05hTih0aGlzLmxvbikmJmlzTmFOKHRoaXMubGF0KSYmaXNO YU4obGwubG9uKSYmaXNOYU4obGwubGF0KSkpO30KcmV0dXJuIGVxdWFsczt9LHRy YW5zZm9ybTpmdW5jdGlvbihzb3VyY2UsZGVzdCl7dmFyIHBvaW50PU9wZW5MYXll cnMuUHJvamVjdGlvbi50cmFuc2Zvcm0oeyd4Jzp0aGlzLmxvbiwneSc6dGhpcy5s YXR9LHNvdXJjZSxkZXN0KTt0aGlzLmxvbj1wb2ludC54O3RoaXMubGF0PXBvaW50 Lnk7cmV0dXJuIHRoaXM7fSx3cmFwRGF0ZUxpbmU6ZnVuY3Rpb24obWF4RXh0ZW50 KXt2YXIgbmV3TG9uTGF0PXRoaXMuY2xvbmUoKTtpZihtYXhFeHRlbnQpe3doaWxl KG5ld0xvbkxhdC5sb248bWF4RXh0ZW50LmxlZnQpe25ld0xvbkxhdC5sb24rPW1h eEV4dGVudC5nZXRXaWR0aCgpO30Kd2hpbGUobmV3TG9uTGF0Lmxvbj5tYXhFeHRl bnQucmlnaHQpe25ld0xvbkxhdC5sb24tPW1heEV4dGVudC5nZXRXaWR0aCgpO319 CnJldHVybiBuZXdMb25MYXQ7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkxvbkxh dCJ9KTtPcGVuTGF5ZXJzLkxvbkxhdC5mcm9tU3RyaW5nPWZ1bmN0aW9uKHN0cil7 dmFyIHBhaXI9c3RyLnNwbGl0KCIsIik7cmV0dXJuIG5ldyBPcGVuTGF5ZXJzLkxv bkxhdChwYWlyWzBdLHBhaXJbMV0pO307T3BlbkxheWVycy5Mb25MYXQuZnJvbUFy cmF5PWZ1bmN0aW9uKGFycil7dmFyIGdvdEFycj1PcGVuTGF5ZXJzLlV0aWwuaXNB cnJheShhcnIpLGxvbj1nb3RBcnImJmFyclswXSxsYXQ9Z290QXJyJiZhcnJbMV07 cmV0dXJuIG5ldyBPcGVuTGF5ZXJzLkxvbkxhdChsb24sbGF0KTt9O09wZW5MYXll cnMuUGl4ZWw9T3BlbkxheWVycy5DbGFzcyh7eDowLjAseTowLjAsaW5pdGlhbGl6 ZTpmdW5jdGlvbih4LHkpe3RoaXMueD1wYXJzZUZsb2F0KHgpO3RoaXMueT1wYXJz ZUZsb2F0KHkpO30sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4oIng9Iit0aGlz LngrIix5PSIrdGhpcy55KTt9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBP cGVuTGF5ZXJzLlBpeGVsKHRoaXMueCx0aGlzLnkpO30sZXF1YWxzOmZ1bmN0aW9u KHB4KXt2YXIgZXF1YWxzPWZhbHNlO2lmKHB4IT1udWxsKXtlcXVhbHM9KCh0aGlz Lng9PXB4LngmJnRoaXMueT09cHgueSl8fChpc05hTih0aGlzLngpJiZpc05hTih0 aGlzLnkpJiZpc05hTihweC54KSYmaXNOYU4ocHgueSkpKTt9CnJldHVybiBlcXVh bHM7fSxkaXN0YW5jZVRvOmZ1bmN0aW9uKHB4KXtyZXR1cm4gTWF0aC5zcXJ0KE1h dGgucG93KHRoaXMueC1weC54LDIpKwpNYXRoLnBvdyh0aGlzLnktcHgueSwyKSk7 fSxhZGQ6ZnVuY3Rpb24oeCx5KXtpZigoeD09bnVsbCl8fCh5PT1udWxsKSl7dmFy IG1zZz1PcGVuTGF5ZXJzLmkxOG4oInBpeGVsQWRkRXJyb3IiKTtPcGVuTGF5ZXJz LkNvbnNvbGUuZXJyb3IobXNnKTtyZXR1cm4gbnVsbDt9CnJldHVybiBuZXcgT3Bl bkxheWVycy5QaXhlbCh0aGlzLngreCx0aGlzLnkreSk7fSxvZmZzZXQ6ZnVuY3Rp b24ocHgpe3ZhciBuZXdQeD10aGlzLmNsb25lKCk7aWYocHgpe25ld1B4PXRoaXMu YWRkKHB4LngscHgueSk7fQpyZXR1cm4gbmV3UHg7fSxDTEFTU19OQU1FOiJPcGVu TGF5ZXJzLlBpeGVsIn0pO09wZW5MYXllcnMuU2l6ZT1PcGVuTGF5ZXJzLkNsYXNz KHt3OjAuMCxoOjAuMCxpbml0aWFsaXplOmZ1bmN0aW9uKHcsaCl7dGhpcy53PXBh cnNlRmxvYXQodyk7dGhpcy5oPXBhcnNlRmxvYXQoaCk7fSx0b1N0cmluZzpmdW5j dGlvbigpe3JldHVybigidz0iK3RoaXMudysiLGg9Iit0aGlzLmgpO30sY2xvbmU6 ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE9wZW5MYXllcnMuU2l6ZSh0aGlzLncsdGhp cy5oKTt9LGVxdWFsczpmdW5jdGlvbihzeil7dmFyIGVxdWFscz1mYWxzZTtpZihz eiE9bnVsbCl7ZXF1YWxzPSgodGhpcy53PT1zei53JiZ0aGlzLmg9PXN6LmgpfHwo aXNOYU4odGhpcy53KSYmaXNOYU4odGhpcy5oKSYmaXNOYU4oc3oudykmJmlzTmFO KHN6LmgpKSk7fQpyZXR1cm4gZXF1YWxzO30sQ0xBU1NfTkFNRToiT3BlbkxheWVy cy5TaXplIn0pO09wZW5MYXllcnMuVXRpbD1PcGVuTGF5ZXJzLlV0aWx8fHt9O09w ZW5MYXllcnMuVXRpbC5nZXRFbGVtZW50PWZ1bmN0aW9uKCl7dmFyIGVsZW1lbnRz PVtdO2Zvcih2YXIgaT0wLGxlbj1hcmd1bWVudHMubGVuZ3RoO2k8bGVuO2krKyl7 dmFyIGVsZW1lbnQ9YXJndW1lbnRzW2ldO2lmKHR5cGVvZiBlbGVtZW50PT0nc3Ry aW5nJyl7ZWxlbWVudD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50KTt9 CmlmKGFyZ3VtZW50cy5sZW5ndGg9PTEpe3JldHVybiBlbGVtZW50O30KZWxlbWVu dHMucHVzaChlbGVtZW50KTt9CnJldHVybiBlbGVtZW50czt9O09wZW5MYXllcnMu VXRpbC5pc0VsZW1lbnQ9ZnVuY3Rpb24obyl7cmV0dXJuISEobyYmby5ub2RlVHlw ZT09PTEpO307T3BlbkxheWVycy5VdGlsLmlzQXJyYXk9ZnVuY3Rpb24oYSl7cmV0 dXJuKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKT09PSdbb2JqZWN0 IEFycmF5XScpO307aWYodHlwZW9mIHdpbmRvdy4kPT09InVuZGVmaW5lZCIpe3dp bmRvdy4kPU9wZW5MYXllcnMuVXRpbC5nZXRFbGVtZW50O30KT3BlbkxheWVycy5V dGlsLnJlbW92ZUl0ZW09ZnVuY3Rpb24oYXJyYXksaXRlbSl7Zm9yKHZhciBpPWFy cmF5Lmxlbmd0aC0xO2k+PTA7aS0tKXtpZihhcnJheVtpXT09aXRlbSl7YXJyYXku c3BsaWNlKGksMSk7fX0KcmV0dXJuIGFycmF5O307T3BlbkxheWVycy5VdGlsLmNs ZWFyQXJyYXk9ZnVuY3Rpb24oYXJyYXkpe09wZW5MYXllcnMuQ29uc29sZS53YXJu KE9wZW5MYXllcnMuaTE4bigibWV0aG9kRGVwcmVjYXRlZCIseyduZXdNZXRob2Qn OidhcnJheSA9IFtdJ30pKTthcnJheS5sZW5ndGg9MDt9O09wZW5MYXllcnMuVXRp bC5pbmRleE9mPWZ1bmN0aW9uKGFycmF5LG9iail7aWYodHlwZW9mIGFycmF5Lmlu ZGV4T2Y9PSJmdW5jdGlvbiIpe3JldHVybiBhcnJheS5pbmRleE9mKG9iaik7fWVs c2V7Zm9yKHZhciBpPTAsbGVuPWFycmF5Lmxlbmd0aDtpPGxlbjtpKyspe2lmKGFy cmF5W2ldPT1vYmope3JldHVybiBpO319CnJldHVybi0xO319O09wZW5MYXllcnMu VXRpbC5tb2RpZnlET01FbGVtZW50PWZ1bmN0aW9uKGVsZW1lbnQsaWQscHgsc3os cG9zaXRpb24sYm9yZGVyLG92ZXJmbG93LG9wYWNpdHkpe2lmKGlkKXtlbGVtZW50 LmlkPWlkO30KaWYocHgpe2VsZW1lbnQuc3R5bGUubGVmdD1weC54KyJweCI7ZWxl bWVudC5zdHlsZS50b3A9cHgueSsicHgiO30KaWYoc3ope2VsZW1lbnQuc3R5bGUu d2lkdGg9c3oudysicHgiO2VsZW1lbnQuc3R5bGUuaGVpZ2h0PXN6LmgrInB4Ijt9 CmlmKHBvc2l0aW9uKXtlbGVtZW50LnN0eWxlLnBvc2l0aW9uPXBvc2l0aW9uO30K aWYoYm9yZGVyKXtlbGVtZW50LnN0eWxlLmJvcmRlcj1ib3JkZXI7fQppZihvdmVy Zmxvdyl7ZWxlbWVudC5zdHlsZS5vdmVyZmxvdz1vdmVyZmxvdzt9CmlmKHBhcnNl RmxvYXQob3BhY2l0eSk+PTAuMCYmcGFyc2VGbG9hdChvcGFjaXR5KTwxLjApe2Vs ZW1lbnQuc3R5bGUuZmlsdGVyPSdhbHBoYShvcGFjaXR5PScrKG9wYWNpdHkqMTAw KSsnKSc7ZWxlbWVudC5zdHlsZS5vcGFjaXR5PW9wYWNpdHk7fWVsc2UgaWYocGFy c2VGbG9hdChvcGFjaXR5KT09MS4wKXtlbGVtZW50LnN0eWxlLmZpbHRlcj0nJztl bGVtZW50LnN0eWxlLm9wYWNpdHk9Jyc7fX07T3BlbkxheWVycy5VdGlsLmNyZWF0 ZURpdj1mdW5jdGlvbihpZCxweCxzeixpbWdVUkwscG9zaXRpb24sYm9yZGVyLG92 ZXJmbG93LG9wYWNpdHkpe3ZhciBkb209ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn ZGl2Jyk7aWYoaW1nVVJMKXtkb20uc3R5bGUuYmFja2dyb3VuZEltYWdlPSd1cmwo JytpbWdVUkwrJyknO30KaWYoIWlkKXtpZD1PcGVuTGF5ZXJzLlV0aWwuY3JlYXRl VW5pcXVlSUQoIk9wZW5MYXllcnNEaXYiKTt9CmlmKCFwb3NpdGlvbil7cG9zaXRp b249ImFic29sdXRlIjt9Ck9wZW5MYXllcnMuVXRpbC5tb2RpZnlET01FbGVtZW50 KGRvbSxpZCxweCxzeixwb3NpdGlvbixib3JkZXIsb3ZlcmZsb3csb3BhY2l0eSk7 cmV0dXJuIGRvbTt9O09wZW5MYXllcnMuVXRpbC5jcmVhdGVJbWFnZT1mdW5jdGlv bihpZCxweCxzeixpbWdVUkwscG9zaXRpb24sYm9yZGVyLG9wYWNpdHksZGVsYXlE aXNwbGF5KXt2YXIgaW1hZ2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7 aWYoIWlkKXtpZD1PcGVuTGF5ZXJzLlV0aWwuY3JlYXRlVW5pcXVlSUQoIk9wZW5M YXllcnNEaXYiKTt9CmlmKCFwb3NpdGlvbil7cG9zaXRpb249InJlbGF0aXZlIjt9 Ck9wZW5MYXllcnMuVXRpbC5tb2RpZnlET01FbGVtZW50KGltYWdlLGlkLHB4LHN6 LHBvc2l0aW9uLGJvcmRlcixudWxsLG9wYWNpdHkpO2lmKGRlbGF5RGlzcGxheSl7 aW1hZ2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7T3BlbkxheWVycy5FdmVudC5vYnNl cnZlKGltYWdlLCJsb2FkIixPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQoT3Blbkxh eWVycy5VdGlsLm9uSW1hZ2VMb2FkLGltYWdlKSk7T3BlbkxheWVycy5FdmVudC5v YnNlcnZlKGltYWdlLCJlcnJvciIsT3BlbkxheWVycy5GdW5jdGlvbi5iaW5kKE9w ZW5MYXllcnMuVXRpbC5vbkltYWdlTG9hZEVycm9yLGltYWdlKSk7fQppbWFnZS5z dHlsZS5hbHQ9aWQ7aW1hZ2UuZ2FsbGVyeUltZz0ibm8iO2lmKGltZ1VSTCl7aW1h Z2Uuc3JjPWltZ1VSTDt9CnJldHVybiBpbWFnZTt9O09wZW5MYXllcnMuVXRpbC5z ZXRPcGFjaXR5PWZ1bmN0aW9uKGVsZW1lbnQsb3BhY2l0eSl7T3BlbkxheWVycy5V dGlsLm1vZGlmeURPTUVsZW1lbnQoZWxlbWVudCxudWxsLG51bGwsbnVsbCxudWxs LG51bGwsbnVsbCxvcGFjaXR5KTt9O09wZW5MYXllcnMuVXRpbC5vbkltYWdlTG9h ZD1mdW5jdGlvbigpe2lmKCF0aGlzLnZpZXdSZXF1ZXN0SUR8fCh0aGlzLm1hcCYm dGhpcy52aWV3UmVxdWVzdElEPT10aGlzLm1hcC52aWV3UmVxdWVzdElEKSl7dGhp cy5zdHlsZS5kaXNwbGF5PSIiO30KT3BlbkxheWVycy5FbGVtZW50LnJlbW92ZUNs YXNzKHRoaXMsIm9sSW1hZ2VMb2FkRXJyb3IiKTt9O09wZW5MYXllcnMuSU1BR0Vf UkVMT0FEX0FUVEVNUFRTPTA7T3BlbkxheWVycy5VdGlsLm9uSW1hZ2VMb2FkRXJy b3I9ZnVuY3Rpb24oKXt0aGlzLl9hdHRlbXB0cz0odGhpcy5fYXR0ZW1wdHMpPyh0 aGlzLl9hdHRlbXB0cysxKToxO2lmKHRoaXMuX2F0dGVtcHRzPD1PcGVuTGF5ZXJz LklNQUdFX1JFTE9BRF9BVFRFTVBUUyl7dmFyIHVybHM9dGhpcy51cmxzO2lmKHVy bHMmJk9wZW5MYXllcnMuVXRpbC5pc0FycmF5KHVybHMpJiZ1cmxzLmxlbmd0aD4x KXt2YXIgc3JjPXRoaXMuc3JjLnRvU3RyaW5nKCk7dmFyIGN1cnJlbnRfdXJsLGs7 Zm9yKGs9MDtjdXJyZW50X3VybD11cmxzW2tdO2srKyl7aWYoc3JjLmluZGV4T2Yo Y3VycmVudF91cmwpIT0tMSl7YnJlYWs7fX0KdmFyIGd1ZXNzPU1hdGguZmxvb3Io dXJscy5sZW5ndGgqTWF0aC5yYW5kb20oKSk7dmFyIG5ld191cmw9dXJsc1tndWVz c107az0wO3doaWxlKG5ld191cmw9PWN1cnJlbnRfdXJsJiZrKys8NCl7Z3Vlc3M9 TWF0aC5mbG9vcih1cmxzLmxlbmd0aCpNYXRoLnJhbmRvbSgpKTtuZXdfdXJsPXVy bHNbZ3Vlc3NdO30KdGhpcy5zcmM9c3JjLnJlcGxhY2UoY3VycmVudF91cmwsbmV3 X3VybCk7fWVsc2V7dGhpcy5zcmM9dGhpcy5zcmM7fX1lbHNle09wZW5MYXllcnMu RWxlbWVudC5hZGRDbGFzcyh0aGlzLCJvbEltYWdlTG9hZEVycm9yIik7fQp0aGlz LnN0eWxlLmRpc3BsYXk9IiI7fTtPcGVuTGF5ZXJzLlV0aWwuYWxwaGFIYWNrTmVl ZGVkPW51bGw7T3BlbkxheWVycy5VdGlsLmFscGhhSGFjaz1mdW5jdGlvbigpe2lm KE9wZW5MYXllcnMuVXRpbC5hbHBoYUhhY2tOZWVkZWQ9PW51bGwpe3ZhciBhclZl cnNpb249bmF2aWdhdG9yLmFwcFZlcnNpb24uc3BsaXQoIk1TSUUiKTt2YXIgdmVy c2lvbj1wYXJzZUZsb2F0KGFyVmVyc2lvblsxXSk7dmFyIGZpbHRlcj1mYWxzZTt0 cnl7ZmlsdGVyPSEhKGRvY3VtZW50LmJvZHkuZmlsdGVycyk7fWNhdGNoKGUpe30K T3BlbkxheWVycy5VdGlsLmFscGhhSGFja05lZWRlZD0oZmlsdGVyJiYodmVyc2lv bj49NS41KSYmKHZlcnNpb248NykpO30KcmV0dXJuIE9wZW5MYXllcnMuVXRpbC5h bHBoYUhhY2tOZWVkZWQ7fTtPcGVuTGF5ZXJzLlV0aWwubW9kaWZ5QWxwaGFJbWFn ZURpdj1mdW5jdGlvbihkaXYsaWQscHgsc3osaW1nVVJMLHBvc2l0aW9uLGJvcmRl cixzaXppbmcsb3BhY2l0eSl7T3BlbkxheWVycy5VdGlsLm1vZGlmeURPTUVsZW1l bnQoZGl2LGlkLHB4LHN6LHBvc2l0aW9uLG51bGwsbnVsbCxvcGFjaXR5KTt2YXIg aW1nPWRpdi5jaGlsZE5vZGVzWzBdO2lmKGltZ1VSTCl7aW1nLnNyYz1pbWdVUkw7 fQpPcGVuTGF5ZXJzLlV0aWwubW9kaWZ5RE9NRWxlbWVudChpbWcsZGl2LmlkKyJf aW5uZXJJbWFnZSIsbnVsbCxzeiwicmVsYXRpdmUiLGJvcmRlcik7aWYoT3Blbkxh eWVycy5VdGlsLmFscGhhSGFjaygpKXtpZihkaXYuc3R5bGUuZGlzcGxheSE9Im5v bmUiKXtkaXYuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjt9CmlmKHNpemlu Zz09bnVsbCl7c2l6aW5nPSJzY2FsZSI7fQpkaXYuc3R5bGUuZmlsdGVyPSJwcm9n aWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQiKyIuQWxwaGFJbWFnZUxvYWRl cihzcmM9JyIraW1nLnNyYysiJywgIisic2l6aW5nTWV0aG9kPSciK3NpemluZysi JykiO2lmKHBhcnNlRmxvYXQoZGl2LnN0eWxlLm9wYWNpdHkpPj0wLjAmJnBhcnNl RmxvYXQoZGl2LnN0eWxlLm9wYWNpdHkpPDEuMCl7ZGl2LnN0eWxlLmZpbHRlcis9 IiBhbHBoYShvcGFjaXR5PSIrZGl2LnN0eWxlLm9wYWNpdHkqMTAwKyIpIjt9Cmlt Zy5zdHlsZS5maWx0ZXI9ImFscGhhKG9wYWNpdHk9MCkiO319O09wZW5MYXllcnMu VXRpbC5jcmVhdGVBbHBoYUltYWdlRGl2PWZ1bmN0aW9uKGlkLHB4LHN6LGltZ1VS TCxwb3NpdGlvbixib3JkZXIsc2l6aW5nLG9wYWNpdHksZGVsYXlEaXNwbGF5KXt2 YXIgZGl2PU9wZW5MYXllcnMuVXRpbC5jcmVhdGVEaXYoKTt2YXIgaW1nPU9wZW5M YXllcnMuVXRpbC5jcmVhdGVJbWFnZShudWxsLG51bGwsbnVsbCxudWxsLG51bGws bnVsbCxudWxsLGZhbHNlKTtkaXYuYXBwZW5kQ2hpbGQoaW1nKTtpZihkZWxheURp c3BsYXkpe2ltZy5zdHlsZS5kaXNwbGF5PSJub25lIjtPcGVuTGF5ZXJzLkV2ZW50 Lm9ic2VydmUoaW1nLCJsb2FkIixPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQoT3Bl bkxheWVycy5VdGlsLm9uSW1hZ2VMb2FkLGRpdikpO09wZW5MYXllcnMuRXZlbnQu b2JzZXJ2ZShpbWcsImVycm9yIixPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQoT3Bl bkxheWVycy5VdGlsLm9uSW1hZ2VMb2FkRXJyb3IsZGl2KSk7fQpPcGVuTGF5ZXJz LlV0aWwubW9kaWZ5QWxwaGFJbWFnZURpdihkaXYsaWQscHgsc3osaW1nVVJMLHBv c2l0aW9uLGJvcmRlcixzaXppbmcsb3BhY2l0eSk7cmV0dXJuIGRpdjt9O09wZW5M YXllcnMuVXRpbC51cHBlckNhc2VPYmplY3Q9ZnVuY3Rpb24ob2JqZWN0KXt2YXIg dU9iamVjdD17fTtmb3IodmFyIGtleSBpbiBvYmplY3Qpe3VPYmplY3Rba2V5LnRv VXBwZXJDYXNlKCldPW9iamVjdFtrZXldO30KcmV0dXJuIHVPYmplY3Q7fTtPcGVu TGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cz1mdW5jdGlvbih0byxmcm9tKXt0bz10 b3x8e307dmFyIGZyb21Jc0V2dD10eXBlb2Ygd2luZG93LkV2ZW50PT0iZnVuY3Rp b24iJiZmcm9tIGluc3RhbmNlb2Ygd2luZG93LkV2ZW50O2Zvcih2YXIga2V5IGlu IGZyb20pe2lmKHRvW2tleV09PT11bmRlZmluZWR8fCghZnJvbUlzRXZ0JiZmcm9t Lmhhc093blByb3BlcnR5JiZmcm9tLmhhc093blByb3BlcnR5KGtleSkmJiF0by5o YXNPd25Qcm9wZXJ0eShrZXkpKSl7dG9ba2V5XT1mcm9tW2tleV07fX0KaWYoIWZy b21Jc0V2dCYmZnJvbSYmZnJvbS5oYXNPd25Qcm9wZXJ0eSYmZnJvbS5oYXNPd25Q cm9wZXJ0eSgndG9TdHJpbmcnKSYmIXRvLmhhc093blByb3BlcnR5KCd0b1N0cmlu ZycpKXt0by50b1N0cmluZz1mcm9tLnRvU3RyaW5nO30KcmV0dXJuIHRvO307T3Bl bkxheWVycy5VdGlsLmdldFBhcmFtZXRlclN0cmluZz1mdW5jdGlvbihwYXJhbXMp e3ZhciBwYXJhbXNBcnJheT1bXTtmb3IodmFyIGtleSBpbiBwYXJhbXMpe3ZhciB2 YWx1ZT1wYXJhbXNba2V5XTtpZigodmFsdWUhPW51bGwpJiYodHlwZW9mIHZhbHVl IT0nZnVuY3Rpb24nKSl7dmFyIGVuY29kZWRWYWx1ZTtpZih0eXBlb2YgdmFsdWU9 PSdvYmplY3QnJiZ2YWx1ZS5jb25zdHJ1Y3Rvcj09QXJyYXkpe3ZhciBlbmNvZGVk SXRlbUFycmF5PVtdO3ZhciBpdGVtO2Zvcih2YXIgaXRlbUluZGV4PTAsbGVuPXZh bHVlLmxlbmd0aDtpdGVtSW5kZXg8bGVuO2l0ZW1JbmRleCsrKXtpdGVtPXZhbHVl W2l0ZW1JbmRleF07ZW5jb2RlZEl0ZW1BcnJheS5wdXNoKGVuY29kZVVSSUNvbXBv bmVudCgoaXRlbT09PW51bGx8fGl0ZW09PT11bmRlZmluZWQpPyIiOml0ZW0pKTt9 CmVuY29kZWRWYWx1ZT1lbmNvZGVkSXRlbUFycmF5LmpvaW4oIiwiKTt9CmVsc2V7 ZW5jb2RlZFZhbHVlPWVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7fQpwYXJhbXNB cnJheS5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpKyI9IitlbmNvZGVkVmFs dWUpO319CnJldHVybiBwYXJhbXNBcnJheS5qb2luKCImIik7fTtPcGVuTGF5ZXJz LlV0aWwudXJsQXBwZW5kPWZ1bmN0aW9uKHVybCxwYXJhbVN0cil7dmFyIG5ld1Vy bD11cmw7aWYocGFyYW1TdHIpe3ZhciBwYXJ0cz0odXJsKyIgIikuc3BsaXQoL1s/ Jl0vKTtuZXdVcmwrPShwYXJ0cy5wb3AoKT09PSIgIj9wYXJhbVN0cjpwYXJ0cy5s ZW5ndGg/IiYiK3BhcmFtU3RyOiI/IitwYXJhbVN0cik7fQpyZXR1cm4gbmV3VXJs O307T3BlbkxheWVycy5JbWdQYXRoPScnO09wZW5MYXllcnMuVXRpbC5nZXRJbWFn ZXNMb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybiBPcGVuTGF5ZXJzLkltZ1BhdGh8 fChPcGVuTGF5ZXJzLl9nZXRTY3JpcHRMb2NhdGlvbigpKyJpbWcvIik7fTtPcGVu TGF5ZXJzLlV0aWwuVHJ5PWZ1bmN0aW9uKCl7dmFyIHJldHVyblZhbHVlPW51bGw7 Zm9yKHZhciBpPTAsbGVuPWFyZ3VtZW50cy5sZW5ndGg7aTxsZW47aSsrKXt2YXIg bGFtYmRhPWFyZ3VtZW50c1tpXTt0cnl7cmV0dXJuVmFsdWU9bGFtYmRhKCk7YnJl YWs7fWNhdGNoKGUpe319CnJldHVybiByZXR1cm5WYWx1ZTt9O09wZW5MYXllcnMu VXRpbC5nZXRYbWxOb2RlVmFsdWU9ZnVuY3Rpb24obm9kZSl7dmFyIHZhbD1udWxs O09wZW5MYXllcnMuVXRpbC5UcnkoZnVuY3Rpb24oKXt2YWw9bm9kZS50ZXh0O2lm KCF2YWwpe3ZhbD1ub2RlLnRleHRDb250ZW50O30KaWYoIXZhbCl7dmFsPW5vZGUu Zmlyc3RDaGlsZC5ub2RlVmFsdWU7fX0sZnVuY3Rpb24oKXt2YWw9bm9kZS50ZXh0 Q29udGVudDt9KTtyZXR1cm4gdmFsO307T3BlbkxheWVycy5VdGlsLm1vdXNlTGVm dD1mdW5jdGlvbihldnQsZGl2KXt2YXIgdGFyZ2V0PShldnQucmVsYXRlZFRhcmdl dCk/ZXZ0LnJlbGF0ZWRUYXJnZXQ6ZXZ0LnRvRWxlbWVudDt3aGlsZSh0YXJnZXQh PWRpdiYmdGFyZ2V0IT1udWxsKXt0YXJnZXQ9dGFyZ2V0LnBhcmVudE5vZGU7fQpy ZXR1cm4odGFyZ2V0IT1kaXYpO307T3BlbkxheWVycy5VdGlsLkRFRkFVTFRfUFJF Q0lTSU9OPTE0O09wZW5MYXllcnMuVXRpbC50b0Zsb2F0PWZ1bmN0aW9uKG51bWJl cixwcmVjaXNpb24pe2lmKHByZWNpc2lvbj09bnVsbCl7cHJlY2lzaW9uPU9wZW5M YXllcnMuVXRpbC5ERUZBVUxUX1BSRUNJU0lPTjt9CmlmKHR5cGVvZiBudW1iZXIh PT0ibnVtYmVyIil7bnVtYmVyPXBhcnNlRmxvYXQobnVtYmVyKTt9CnJldHVybiBw cmVjaXNpb249PT0wP251bWJlcjpwYXJzZUZsb2F0KG51bWJlci50b1ByZWNpc2lv bihwcmVjaXNpb24pKTt9O09wZW5MYXllcnMuVXRpbC5yYWQ9ZnVuY3Rpb24oeCl7 cmV0dXJuIHgqTWF0aC5QSS8xODA7fTtPcGVuTGF5ZXJzLlV0aWwuZGVnPWZ1bmN0 aW9uKHgpe3JldHVybiB4KjE4MC9NYXRoLlBJO307T3BlbkxheWVycy5VdGlsLlZp bmNlbnR5Q29uc3RhbnRzPXthOjYzNzgxMzcsYjo2MzU2NzUyLjMxNDIsZjoxLzI5 OC4yNTcyMjM1NjN9O09wZW5MYXllcnMuVXRpbC5kaXN0VmluY2VudHk9ZnVuY3Rp b24ocDEscDIpe3ZhciBjdD1PcGVuTGF5ZXJzLlV0aWwuVmluY2VudHlDb25zdGFu dHM7dmFyIGE9Y3QuYSxiPWN0LmIsZj1jdC5mO3ZhciBMPU9wZW5MYXllcnMuVXRp bC5yYWQocDIubG9uLXAxLmxvbik7dmFyIFUxPU1hdGguYXRhbigoMS1mKSpNYXRo LnRhbihPcGVuTGF5ZXJzLlV0aWwucmFkKHAxLmxhdCkpKTt2YXIgVTI9TWF0aC5h dGFuKCgxLWYpKk1hdGgudGFuKE9wZW5MYXllcnMuVXRpbC5yYWQocDIubGF0KSkp O3ZhciBzaW5VMT1NYXRoLnNpbihVMSksY29zVTE9TWF0aC5jb3MoVTEpO3ZhciBz aW5VMj1NYXRoLnNpbihVMiksY29zVTI9TWF0aC5jb3MoVTIpO3ZhciBsYW1iZGE9 TCxsYW1iZGFQPTIqTWF0aC5QSTt2YXIgaXRlckxpbWl0PTIwO3doaWxlKE1hdGgu YWJzKGxhbWJkYS1sYW1iZGFQKT4xZS0xMiYmLS1pdGVyTGltaXQ+MCl7dmFyIHNp bkxhbWJkYT1NYXRoLnNpbihsYW1iZGEpLGNvc0xhbWJkYT1NYXRoLmNvcyhsYW1i ZGEpO3ZhciBzaW5TaWdtYT1NYXRoLnNxcnQoKGNvc1UyKnNpbkxhbWJkYSkqKGNv c1UyKnNpbkxhbWJkYSkrCihjb3NVMSpzaW5VMi1zaW5VMSpjb3NVMipjb3NMYW1i ZGEpKihjb3NVMSpzaW5VMi1zaW5VMSpjb3NVMipjb3NMYW1iZGEpKTtpZihzaW5T aWdtYT09MCl7cmV0dXJuIDA7fQp2YXIgY29zU2lnbWE9c2luVTEqc2luVTIrY29z VTEqY29zVTIqY29zTGFtYmRhO3ZhciBzaWdtYT1NYXRoLmF0YW4yKHNpblNpZ21h LGNvc1NpZ21hKTt2YXIgYWxwaGE9TWF0aC5hc2luKGNvc1UxKmNvc1UyKnNpbkxh bWJkYS9zaW5TaWdtYSk7dmFyIGNvc1NxQWxwaGE9TWF0aC5jb3MoYWxwaGEpKk1h dGguY29zKGFscGhhKTt2YXIgY29zMlNpZ21hTT1jb3NTaWdtYS0yKnNpblUxKnNp blUyL2Nvc1NxQWxwaGE7dmFyIEM9Zi8xNipjb3NTcUFscGhhKig0K2YqKDQtMypj b3NTcUFscGhhKSk7bGFtYmRhUD1sYW1iZGE7bGFtYmRhPUwrKDEtQykqZipNYXRo LnNpbihhbHBoYSkqKHNpZ21hK0Mqc2luU2lnbWEqKGNvczJTaWdtYU0rQypjb3NT aWdtYSooLTErMipjb3MyU2lnbWFNKmNvczJTaWdtYU0pKSk7fQppZihpdGVyTGlt aXQ9PTApe3JldHVybiBOYU47fQp2YXIgdVNxPWNvc1NxQWxwaGEqKGEqYS1iKmIp LyhiKmIpO3ZhciBBPTErdVNxLzE2Mzg0Kig0MDk2K3VTcSooLTc2OCt1U3EqKDMy MC0xNzUqdVNxKSkpO3ZhciBCPXVTcS8xMDI0KigyNTYrdVNxKigtMTI4K3VTcSoo NzQtNDcqdVNxKSkpO3ZhciBkZWx0YVNpZ21hPUIqc2luU2lnbWEqKGNvczJTaWdt YU0rQi80Kihjb3NTaWdtYSooLTErMipjb3MyU2lnbWFNKmNvczJTaWdtYU0pLQpC LzYqY29zMlNpZ21hTSooLTMrNCpzaW5TaWdtYSpzaW5TaWdtYSkqKC0zKzQqY29z MlNpZ21hTSpjb3MyU2lnbWFNKSkpO3ZhciBzPWIqQSooc2lnbWEtZGVsdGFTaWdt YSk7dmFyIGQ9cy50b0ZpeGVkKDMpLzEwMDA7cmV0dXJuIGQ7fTtPcGVuTGF5ZXJz LlV0aWwuZGVzdGluYXRpb25WaW5jZW50eT1mdW5jdGlvbihsb25sYXQsYnJuZyxk aXN0KXt2YXIgdT1PcGVuTGF5ZXJzLlV0aWw7dmFyIGN0PXUuVmluY2VudHlDb25z dGFudHM7dmFyIGE9Y3QuYSxiPWN0LmIsZj1jdC5mO3ZhciBsb24xPWxvbmxhdC5s b247dmFyIGxhdDE9bG9ubGF0LmxhdDt2YXIgcz1kaXN0O3ZhciBhbHBoYTE9dS5y YWQoYnJuZyk7dmFyIHNpbkFscGhhMT1NYXRoLnNpbihhbHBoYTEpO3ZhciBjb3NB bHBoYTE9TWF0aC5jb3MoYWxwaGExKTt2YXIgdGFuVTE9KDEtZikqTWF0aC50YW4o dS5yYWQobGF0MSkpO3ZhciBjb3NVMT0xL01hdGguc3FydCgoMSt0YW5VMSp0YW5V MSkpLHNpblUxPXRhblUxKmNvc1UxO3ZhciBzaWdtYTE9TWF0aC5hdGFuMih0YW5V MSxjb3NBbHBoYTEpO3ZhciBzaW5BbHBoYT1jb3NVMSpzaW5BbHBoYTE7dmFyIGNv c1NxQWxwaGE9MS1zaW5BbHBoYSpzaW5BbHBoYTt2YXIgdVNxPWNvc1NxQWxwaGEq KGEqYS1iKmIpLyhiKmIpO3ZhciBBPTErdVNxLzE2Mzg0Kig0MDk2K3VTcSooLTc2 OCt1U3EqKDMyMC0xNzUqdVNxKSkpO3ZhciBCPXVTcS8xMDI0KigyNTYrdVNxKigt MTI4K3VTcSooNzQtNDcqdVNxKSkpO3ZhciBzaWdtYT1zLyhiKkEpLHNpZ21hUD0y Kk1hdGguUEk7d2hpbGUoTWF0aC5hYnMoc2lnbWEtc2lnbWFQKT4xZS0xMil7dmFy IGNvczJTaWdtYU09TWF0aC5jb3MoMipzaWdtYTErc2lnbWEpO3ZhciBzaW5TaWdt YT1NYXRoLnNpbihzaWdtYSk7dmFyIGNvc1NpZ21hPU1hdGguY29zKHNpZ21hKTt2 YXIgZGVsdGFTaWdtYT1CKnNpblNpZ21hKihjb3MyU2lnbWFNK0IvNCooY29zU2ln bWEqKC0xKzIqY29zMlNpZ21hTSpjb3MyU2lnbWFNKS0KQi82KmNvczJTaWdtYU0q KC0zKzQqc2luU2lnbWEqc2luU2lnbWEpKigtMys0KmNvczJTaWdtYU0qY29zMlNp Z21hTSkpKTtzaWdtYVA9c2lnbWE7c2lnbWE9cy8oYipBKStkZWx0YVNpZ21hO30K dmFyIHRtcD1zaW5VMSpzaW5TaWdtYS1jb3NVMSpjb3NTaWdtYSpjb3NBbHBoYTE7 dmFyIGxhdDI9TWF0aC5hdGFuMihzaW5VMSpjb3NTaWdtYStjb3NVMSpzaW5TaWdt YSpjb3NBbHBoYTEsKDEtZikqTWF0aC5zcXJ0KHNpbkFscGhhKnNpbkFscGhhK3Rt cCp0bXApKTt2YXIgbGFtYmRhPU1hdGguYXRhbjIoc2luU2lnbWEqc2luQWxwaGEx LGNvc1UxKmNvc1NpZ21hLXNpblUxKnNpblNpZ21hKmNvc0FscGhhMSk7dmFyIEM9 Zi8xNipjb3NTcUFscGhhKig0K2YqKDQtMypjb3NTcUFscGhhKSk7dmFyIEw9bGFt YmRhLSgxLUMpKmYqc2luQWxwaGEqKHNpZ21hK0Mqc2luU2lnbWEqKGNvczJTaWdt YU0rQypjb3NTaWdtYSooLTErMipjb3MyU2lnbWFNKmNvczJTaWdtYU0pKSk7dmFy IHJldkF6PU1hdGguYXRhbjIoc2luQWxwaGEsLXRtcCk7cmV0dXJuIG5ldyBPcGVu TGF5ZXJzLkxvbkxhdChsb24xK3UuZGVnKEwpLHUuZGVnKGxhdDIpKTt9O09wZW5M YXllcnMuVXRpbC5nZXRQYXJhbWV0ZXJzPWZ1bmN0aW9uKHVybCl7dXJsPSh1cmw9 PT1udWxsfHx1cmw9PT11bmRlZmluZWQpP3dpbmRvdy5sb2NhdGlvbi5ocmVmOnVy bDt2YXIgcGFyYW1zU3RyaW5nPSIiO2lmKE9wZW5MYXllcnMuU3RyaW5nLmNvbnRh aW5zKHVybCwnPycpKXt2YXIgc3RhcnQ9dXJsLmluZGV4T2YoJz8nKSsxO3ZhciBl bmQ9T3BlbkxheWVycy5TdHJpbmcuY29udGFpbnModXJsLCIjIik/dXJsLmluZGV4 T2YoJyMnKTp1cmwubGVuZ3RoO3BhcmFtc1N0cmluZz11cmwuc3Vic3RyaW5nKHN0 YXJ0LGVuZCk7fQp2YXIgcGFyYW1ldGVycz17fTt2YXIgcGFpcnM9cGFyYW1zU3Ry aW5nLnNwbGl0KC9bJjtdLyk7Zm9yKHZhciBpPTAsbGVuPXBhaXJzLmxlbmd0aDtp PGxlbjsrK2kpe3ZhciBrZXlWYWx1ZT1wYWlyc1tpXS5zcGxpdCgnPScpO2lmKGtl eVZhbHVlWzBdKXt2YXIga2V5PWtleVZhbHVlWzBdO3RyeXtrZXk9ZGVjb2RlVVJJ Q29tcG9uZW50KGtleSk7fWNhdGNoKGVycil7a2V5PXVuZXNjYXBlKGtleSk7fQp2 YXIgdmFsdWU9KGtleVZhbHVlWzFdfHwnJykucmVwbGFjZSgvXCsvZywiICIpO3Ry eXt2YWx1ZT1kZWNvZGVVUklDb21wb25lbnQodmFsdWUpO31jYXRjaChlcnIpe3Zh bHVlPXVuZXNjYXBlKHZhbHVlKTt9CnZhbHVlPXZhbHVlLnNwbGl0KCIsIik7aWYo dmFsdWUubGVuZ3RoPT0xKXt2YWx1ZT12YWx1ZVswXTt9CnBhcmFtZXRlcnNba2V5 XT12YWx1ZTt9fQpyZXR1cm4gcGFyYW1ldGVyczt9O09wZW5MYXllcnMuVXRpbC5n ZXRBcmdzPWZ1bmN0aW9uKHVybCl7T3BlbkxheWVycy5Db25zb2xlLndhcm4oT3Bl bkxheWVycy5pMThuKCJtZXRob2REZXByZWNhdGVkIix7J25ld01ldGhvZCc6J09w ZW5MYXllcnMuVXRpbC5nZXRQYXJhbWV0ZXJzJ30pKTtyZXR1cm4gT3BlbkxheWVy cy5VdGlsLmdldFBhcmFtZXRlcnModXJsKTt9O09wZW5MYXllcnMuVXRpbC5sYXN0 U2VxSUQ9MDtPcGVuTGF5ZXJzLlV0aWwuY3JlYXRlVW5pcXVlSUQ9ZnVuY3Rpb24o cHJlZml4KXtpZihwcmVmaXg9PW51bGwpe3ByZWZpeD0iaWRfIjt9Ck9wZW5MYXll cnMuVXRpbC5sYXN0U2VxSUQrPTE7cmV0dXJuIHByZWZpeCtPcGVuTGF5ZXJzLlV0 aWwubGFzdFNlcUlEO307T3BlbkxheWVycy5JTkNIRVNfUEVSX1VOSVQ9eydpbmNo ZXMnOjEuMCwnZnQnOjEyLjAsJ21pJzo2MzM2MC4wLCdtJzozOS4zNzAxLCdrbSc6 MzkzNzAuMSwnZGQnOjQzNzQ3NTQsJ3lkJzozNn07T3BlbkxheWVycy5JTkNIRVNf UEVSX1VOSVRbImluIl09T3BlbkxheWVycy5JTkNIRVNfUEVSX1VOSVQuaW5jaGVz O09wZW5MYXllcnMuSU5DSEVTX1BFUl9VTklUWyJkZWdyZWVzIl09T3BlbkxheWVy cy5JTkNIRVNfUEVSX1VOSVQuZGQ7T3BlbkxheWVycy5JTkNIRVNfUEVSX1VOSVRb Im5taSJdPTE4NTIqT3BlbkxheWVycy5JTkNIRVNfUEVSX1VOSVQubTtPcGVuTGF5 ZXJzLk1FVEVSU19QRVJfSU5DSD0wLjAyNTQwMDA1MDgwMDEwMTYwMDIwO09wZW5M YXllcnMuVXRpbC5leHRlbmQoT3BlbkxheWVycy5JTkNIRVNfUEVSX1VOSVQseyJJ bmNoIjpPcGVuTGF5ZXJzLklOQ0hFU19QRVJfVU5JVC5pbmNoZXMsIk1ldGVyIjox LjAvT3BlbkxheWVycy5NRVRFUlNfUEVSX0lOQ0gsIkZvb3QiOjAuMzA0ODAwNjA5 NjAxMjE5MjAyNDMvT3BlbkxheWVycy5NRVRFUlNfUEVSX0lOQ0gsIklGb290Ijow LjMwNDgwMDAwMDAwMDAwMDAwMDAwL09wZW5MYXllcnMuTUVURVJTX1BFUl9JTkNI LCJDbGFya2VGb290IjowLjMwNDc5NzI2NTExNTEvT3BlbkxheWVycy5NRVRFUlNf UEVSX0lOQ0gsIlNlYXJzRm9vdCI6MC4zMDQ3OTk0NzE1Mzg2NzYyNDYyNC9PcGVu TGF5ZXJzLk1FVEVSU19QRVJfSU5DSCwiR29sZENvYXN0Rm9vdCI6MC4zMDQ3OTk3 MTAxODE1MDg4MTc1OC9PcGVuTGF5ZXJzLk1FVEVSU19QRVJfSU5DSCwiSUluY2gi OjAuMDI1NDAwMDAwMDAwMDAwMDAwMDAvT3BlbkxheWVycy5NRVRFUlNfUEVSX0lO Q0gsIk1pY3JvSW5jaCI6MC4wMDAwMjU0MDAwMDAwMDAwMDAwMC9PcGVuTGF5ZXJz Lk1FVEVSU19QRVJfSU5DSCwiTWlsIjowLjAwMDAwMDAyNTQwMDAwMDAwMDAwL09w ZW5MYXllcnMuTUVURVJTX1BFUl9JTkNILCJDZW50aW1ldGVyIjowLjAxMDAwMDAw MDAwMDAwMDAwMDAwL09wZW5MYXllcnMuTUVURVJTX1BFUl9JTkNILCJLaWxvbWV0 ZXIiOjEwMDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAvT3BlbkxheWVycy5NRVRFUlNf UEVSX0lOQ0gsIllhcmQiOjAuOTE0NDAxODI4ODAzNjU3NjA3MzEvT3BlbkxheWVy cy5NRVRFUlNfUEVSX0lOQ0gsIlNlYXJzWWFyZCI6MC45MTQzOTg0MTQ2MTYwMjkv T3BlbkxheWVycy5NRVRFUlNfUEVSX0lOQ0gsIkluZGlhbllhcmQiOjAuOTE0Mzk4 NTMwNzQ0NDQwNzk5ODMvT3BlbkxheWVycy5NRVRFUlNfUEVSX0lOQ0gsIkluZGlh bllkMzciOjAuOTE0Mzk1MjMvT3BlbkxheWVycy5NRVRFUlNfUEVSX0lOQ0gsIklu ZGlhbllkNjIiOjAuOTE0Mzk4OC9PcGVuTGF5ZXJzLk1FVEVSU19QRVJfSU5DSCwi SW5kaWFuWWQ3NSI6MC45MTQzOTg1L09wZW5MYXllcnMuTUVURVJTX1BFUl9JTkNI LCJJbmRpYW5Gb290IjowLjMwNDc5OTUxL09wZW5MYXllcnMuTUVURVJTX1BFUl9J TkNILCJJbmRpYW5GdDM3IjowLjMwNDc5ODQxL09wZW5MYXllcnMuTUVURVJTX1BF Ul9JTkNILCJJbmRpYW5GdDYyIjowLjMwNDc5OTYvT3BlbkxheWVycy5NRVRFUlNf UEVSX0lOQ0gsIkluZGlhbkZ0NzUiOjAuMzA0Nzk5NS9PcGVuTGF5ZXJzLk1FVEVS U19QRVJfSU5DSCwiTWlsZSI6MTYwOS4zNDcyMTg2OTQ0MzczODg4NzQ3Ny9PcGVu TGF5ZXJzLk1FVEVSU19QRVJfSU5DSCwiSVlhcmQiOjAuOTE0NDAwMDAwMDAwMDAw MDAwMDAvT3BlbkxheWVycy5NRVRFUlNfUEVSX0lOQ0gsIklNaWxlIjoxNjA5LjM0 NDAwMDAwMDAwMDAwMDAwMDAwL09wZW5MYXllcnMuTUVURVJTX1BFUl9JTkNILCJO YXV0TSI6MTg1Mi4wMDAwMDAwMDAwMDAwMDAwMDAwMC9PcGVuTGF5ZXJzLk1FVEVS U19QRVJfSU5DSCwiTGF0LTY2IjoxMTA5NDMuMzE2NDg4OTMyNzMxL09wZW5MYXll cnMuTUVURVJTX1BFUl9JTkNILCJMYXQtODMiOjExMDk0Ni4yNTczNjg3MjIzNDEy NS9PcGVuTGF5ZXJzLk1FVEVSU19QRVJfSU5DSCwiRGVjaW1ldGVyIjowLjEwMDAw MDAwMDAwMDAwMDAwMDAwL09wZW5MYXllcnMuTUVURVJTX1BFUl9JTkNILCJNaWxs aW1ldGVyIjowLjAwMTAwMDAwMDAwMDAwMDAwMDAwL09wZW5MYXllcnMuTUVURVJT X1BFUl9JTkNILCJEZWthbWV0ZXIiOjEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwL09w ZW5MYXllcnMuTUVURVJTX1BFUl9JTkNILCJEZWNhbWV0ZXIiOjEwLjAwMDAwMDAw MDAwMDAwMDAwMDAwL09wZW5MYXllcnMuTUVURVJTX1BFUl9JTkNILCJIZWN0b21l dGVyIjoxMDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAvT3BlbkxheWVycy5NRVRFUlNf UEVSX0lOQ0gsIkdlcm1hbk1ldGVyIjoxLjAwMDAxMzU5NjUvT3BlbkxheWVycy5N RVRFUlNfUEVSX0lOQ0gsIkNhR3JpZCI6MC45OTk3MzgvT3BlbkxheWVycy5NRVRF UlNfUEVSX0lOQ0gsIkNsYXJrZUNoYWluIjoyMC4xMTY2MTk0OTc2L09wZW5MYXll cnMuTUVURVJTX1BFUl9JTkNILCJHdW50ZXJDaGFpbiI6MjAuMTE2ODQwMjMzNjgw NDcvT3BlbkxheWVycy5NRVRFUlNfUEVSX0lOQ0gsIkJlbm9pdENoYWluIjoyMC4x MTY3ODI0OTQzNzU4NzIvT3BlbkxheWVycy5NRVRFUlNfUEVSX0lOQ0gsIlNlYXJz Q2hhaW4iOjIwLjExNjc2NTEyMTU1L09wZW5MYXllcnMuTUVURVJTX1BFUl9JTkNI LCJDbGFya2VMaW5rIjowLjIwMTE2NjE5NDk3Ni9PcGVuTGF5ZXJzLk1FVEVSU19Q RVJfSU5DSCwiR3VudGVyTGluayI6MC4yMDExNjg0MDIzMzY4MDQ3L09wZW5MYXll cnMuTUVURVJTX1BFUl9JTkNILCJCZW5vaXRMaW5rIjowLjIwMTE2NzgyNDk0Mzc1 ODcyL09wZW5MYXllcnMuTUVURVJTX1BFUl9JTkNILCJTZWFyc0xpbmsiOjAuMjAx MTY3NjUxMjE1NS9PcGVuTGF5ZXJzLk1FVEVSU19QRVJfSU5DSCwiUm9kIjo1LjAy OTIxMDA1ODQyMDEyL09wZW5MYXllcnMuTUVURVJTX1BFUl9JTkNILCJJbnRubENo YWluIjoyMC4xMTY4L09wZW5MYXllcnMuTUVURVJTX1BFUl9JTkNILCJJbnRubExp bmsiOjAuMjAxMTY4L09wZW5MYXllcnMuTUVURVJTX1BFUl9JTkNILCJQZXJjaCI6 NS4wMjkyMTAwNTg0MjAxMi9PcGVuTGF5ZXJzLk1FVEVSU19QRVJfSU5DSCwiUG9s ZSI6NS4wMjkyMTAwNTg0MjAxMi9PcGVuTGF5ZXJzLk1FVEVSU19QRVJfSU5DSCwi RnVybG9uZyI6MjAxLjE2ODQwMjMzNjgwNDYvT3BlbkxheWVycy5NRVRFUlNfUEVS X0lOQ0gsIlJvb2QiOjMuNzc4MjY2ODk4L09wZW5MYXllcnMuTUVURVJTX1BFUl9J TkNILCJDYXBlRm9vdCI6MC4zMDQ3OTcyNjE1L09wZW5MYXllcnMuTUVURVJTX1BF Ul9JTkNILCJCcmVhbGV5IjozNzUuMDAwMDAwMDAwMDAwMDAwMDAwMDAvT3Blbkxh eWVycy5NRVRFUlNfUEVSX0lOQ0gsIk1vZEFtRnQiOjAuMzA0ODEyMjUyOTg0NTA1 OTY5MDExOTM4L09wZW5MYXllcnMuTUVURVJTX1BFUl9JTkNILCJGYXRob20iOjEu ODI4OC9PcGVuTGF5ZXJzLk1FVEVSU19QRVJfSU5DSCwiTmF1dE0tVUsiOjE4NTMu MTg0L09wZW5MYXllcnMuTUVURVJTX1BFUl9JTkNILCI1MGtpbG9tZXRlcnMiOjUw MDAwLjAvT3BlbkxheWVycy5NRVRFUlNfUEVSX0lOQ0gsIjE1MGtpbG9tZXRlcnMi OjE1MDAwMC4wL09wZW5MYXllcnMuTUVURVJTX1BFUl9JTkNIfSk7T3BlbkxheWVy cy5VdGlsLmV4dGVuZChPcGVuTGF5ZXJzLklOQ0hFU19QRVJfVU5JVCx7Im1tIjpP cGVuTGF5ZXJzLklOQ0hFU19QRVJfVU5JVFsiTWV0ZXIiXS8xMDAwLjAsImNtIjpP cGVuTGF5ZXJzLklOQ0hFU19QRVJfVU5JVFsiTWV0ZXIiXS8xMDAuMCwiZG0iOk9w ZW5MYXllcnMuSU5DSEVTX1BFUl9VTklUWyJNZXRlciJdKjEwMC4wLCJrbSI6T3Bl bkxheWVycy5JTkNIRVNfUEVSX1VOSVRbIk1ldGVyIl0qMTAwMC4wLCJrbWkiOk9w ZW5MYXllcnMuSU5DSEVTX1BFUl9VTklUWyJubWkiXSwiZmF0aCI6T3BlbkxheWVy cy5JTkNIRVNfUEVSX1VOSVRbIkZhdGhvbSJdLCJjaCI6T3BlbkxheWVycy5JTkNI RVNfUEVSX1VOSVRbIkludG5sQ2hhaW4iXSwibGluayI6T3BlbkxheWVycy5JTkNI RVNfUEVSX1VOSVRbIkludG5sTGluayJdLCJ1cy1pbiI6T3BlbkxheWVycy5JTkNI RVNfUEVSX1VOSVRbImluY2hlcyJdLCJ1cy1mdCI6T3BlbkxheWVycy5JTkNIRVNf UEVSX1VOSVRbIkZvb3QiXSwidXMteWQiOk9wZW5MYXllcnMuSU5DSEVTX1BFUl9V TklUWyJZYXJkIl0sInVzLWNoIjpPcGVuTGF5ZXJzLklOQ0hFU19QRVJfVU5JVFsi R3VudGVyQ2hhaW4iXSwidXMtbWkiOk9wZW5MYXllcnMuSU5DSEVTX1BFUl9VTklU WyJNaWxlIl0sImluZC15ZCI6T3BlbkxheWVycy5JTkNIRVNfUEVSX1VOSVRbIklu ZGlhbllkMzciXSwiaW5kLWZ0IjpPcGVuTGF5ZXJzLklOQ0hFU19QRVJfVU5JVFsi SW5kaWFuRnQzNyJdLCJpbmQtY2giOjIwLjExNjY5NTA2L09wZW5MYXllcnMuTUVU RVJTX1BFUl9JTkNIfSk7T3BlbkxheWVycy5ET1RTX1BFUl9JTkNIPTcyO09wZW5M YXllcnMuVXRpbC5ub3JtYWxpemVTY2FsZT1mdW5jdGlvbihzY2FsZSl7dmFyIG5v cm1TY2FsZT0oc2NhbGU+MS4wKT8oMS4wL3NjYWxlKTpzY2FsZTtyZXR1cm4gbm9y bVNjYWxlO307T3BlbkxheWVycy5VdGlsLmdldFJlc29sdXRpb25Gcm9tU2NhbGU9 ZnVuY3Rpb24oc2NhbGUsdW5pdHMpe3ZhciByZXNvbHV0aW9uO2lmKHNjYWxlKXtp Zih1bml0cz09bnVsbCl7dW5pdHM9ImRlZ3JlZXMiO30KdmFyIG5vcm1TY2FsZT1P cGVuTGF5ZXJzLlV0aWwubm9ybWFsaXplU2NhbGUoc2NhbGUpO3Jlc29sdXRpb249 MS8obm9ybVNjYWxlKk9wZW5MYXllcnMuSU5DSEVTX1BFUl9VTklUW3VuaXRzXSpP cGVuTGF5ZXJzLkRPVFNfUEVSX0lOQ0gpO30KcmV0dXJuIHJlc29sdXRpb247fTtP cGVuTGF5ZXJzLlV0aWwuZ2V0U2NhbGVGcm9tUmVzb2x1dGlvbj1mdW5jdGlvbihy ZXNvbHV0aW9uLHVuaXRzKXtpZih1bml0cz09bnVsbCl7dW5pdHM9ImRlZ3JlZXMi O30KdmFyIHNjYWxlPXJlc29sdXRpb24qT3BlbkxheWVycy5JTkNIRVNfUEVSX1VO SVRbdW5pdHNdKk9wZW5MYXllcnMuRE9UU19QRVJfSU5DSDtyZXR1cm4gc2NhbGU7 fTtPcGVuTGF5ZXJzLlV0aWwuc2FmZVN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihl dnQpe09wZW5MYXllcnMuRXZlbnQuc3RvcChldnQsdHJ1ZSk7fTtPcGVuTGF5ZXJz LlV0aWwucGFnZVBvc2l0aW9uPWZ1bmN0aW9uKGZvckVsZW1lbnQpe3ZhciBwb3M9 WzAsMF07dmFyIHZpZXdwb3J0RWxlbWVudD1PcGVuTGF5ZXJzLlV0aWwuZ2V0Vmll d3BvcnRFbGVtZW50KCk7aWYoIWZvckVsZW1lbnR8fGZvckVsZW1lbnQ9PXdpbmRv d3x8Zm9yRWxlbWVudD09dmlld3BvcnRFbGVtZW50KXtyZXR1cm4gcG9zO30KdmFy IEJVR0dZX0dFQ0tPX0JPWF9PQkpFQ1Q9T3BlbkxheWVycy5JU19HRUNLTyYmZG9j dW1lbnQuZ2V0Qm94T2JqZWN0Rm9yJiZPcGVuTGF5ZXJzLkVsZW1lbnQuZ2V0U3R5 bGUoZm9yRWxlbWVudCwncG9zaXRpb24nKT09J2Fic29sdXRlJyYmKGZvckVsZW1l bnQuc3R5bGUudG9wPT0nJ3x8Zm9yRWxlbWVudC5zdHlsZS5sZWZ0PT0nJyk7dmFy IHBhcmVudD1udWxsO3ZhciBib3g7aWYoZm9yRWxlbWVudC5nZXRCb3VuZGluZ0Ns aWVudFJlY3Qpe2JveD1mb3JFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgp O3ZhciBzY3JvbGxUb3A9dmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcDt2YXIgc2Ny b2xsTGVmdD12aWV3cG9ydEVsZW1lbnQuc2Nyb2xsTGVmdDtwb3NbMF09Ym94Lmxl ZnQrc2Nyb2xsTGVmdDtwb3NbMV09Ym94LnRvcCtzY3JvbGxUb3A7fWVsc2UgaWYo ZG9jdW1lbnQuZ2V0Qm94T2JqZWN0Rm9yJiYhQlVHR1lfR0VDS09fQk9YX09CSkVD VCl7Ym94PWRvY3VtZW50LmdldEJveE9iamVjdEZvcihmb3JFbGVtZW50KTt2YXIg dnBCb3g9ZG9jdW1lbnQuZ2V0Qm94T2JqZWN0Rm9yKHZpZXdwb3J0RWxlbWVudCk7 cG9zWzBdPWJveC5zY3JlZW5YLXZwQm94LnNjcmVlblg7cG9zWzFdPWJveC5zY3Jl ZW5ZLXZwQm94LnNjcmVlblk7fWVsc2V7cG9zWzBdPWZvckVsZW1lbnQub2Zmc2V0 TGVmdDtwb3NbMV09Zm9yRWxlbWVudC5vZmZzZXRUb3A7cGFyZW50PWZvckVsZW1l bnQub2Zmc2V0UGFyZW50O2lmKHBhcmVudCE9Zm9yRWxlbWVudCl7d2hpbGUocGFy ZW50KXtwb3NbMF0rPXBhcmVudC5vZmZzZXRMZWZ0O3Bvc1sxXSs9cGFyZW50Lm9m ZnNldFRvcDtwYXJlbnQ9cGFyZW50Lm9mZnNldFBhcmVudDt9fQp2YXIgYnJvd3Nl cj1PcGVuTGF5ZXJzLkJST1dTRVJfTkFNRTtpZihicm93c2VyPT0ib3BlcmEifHwo YnJvd3Nlcj09InNhZmFyaSImJk9wZW5MYXllcnMuRWxlbWVudC5nZXRTdHlsZShm b3JFbGVtZW50LCdwb3NpdGlvbicpPT0nYWJzb2x1dGUnKSl7cG9zWzFdLT1kb2N1 bWVudC5ib2R5Lm9mZnNldFRvcDt9CnBhcmVudD1mb3JFbGVtZW50Lm9mZnNldFBh cmVudDt3aGlsZShwYXJlbnQmJnBhcmVudCE9ZG9jdW1lbnQuYm9keSl7cG9zWzBd LT1wYXJlbnQuc2Nyb2xsTGVmdDtpZihicm93c2VyIT0ib3BlcmEifHxwYXJlbnQu dGFnTmFtZSE9J1RSJyl7cG9zWzFdLT1wYXJlbnQuc2Nyb2xsVG9wO30KcGFyZW50 PXBhcmVudC5vZmZzZXRQYXJlbnQ7fX0KcmV0dXJuIHBvczt9O09wZW5MYXllcnMu VXRpbC5nZXRWaWV3cG9ydEVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgdmlld3BvcnRF bGVtZW50PWFyZ3VtZW50cy5jYWxsZWUudmlld3BvcnRFbGVtZW50O2lmKHZpZXdw b3J0RWxlbWVudD09dW5kZWZpbmVkKXt2aWV3cG9ydEVsZW1lbnQ9KE9wZW5MYXll cnMuQlJPV1NFUl9OQU1FPT0ibXNpZSImJmRvY3VtZW50LmNvbXBhdE1vZGUhPSdD U1MxQ29tcGF0Jyk/ZG9jdW1lbnQuYm9keTpkb2N1bWVudC5kb2N1bWVudEVsZW1l bnQ7YXJndW1lbnRzLmNhbGxlZS52aWV3cG9ydEVsZW1lbnQ9dmlld3BvcnRFbGVt ZW50O30KcmV0dXJuIHZpZXdwb3J0RWxlbWVudDt9O09wZW5MYXllcnMuVXRpbC5p c0VxdWl2YWxlbnRVcmw9ZnVuY3Rpb24odXJsMSx1cmwyLG9wdGlvbnMpe29wdGlv bnM9b3B0aW9uc3x8e307T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMob3B0 aW9ucyx7aWdub3JlQ2FzZTp0cnVlLGlnbm9yZVBvcnQ4MDp0cnVlLGlnbm9yZUhh c2g6dHJ1ZX0pO3ZhciB1cmxPYmoxPU9wZW5MYXllcnMuVXRpbC5jcmVhdGVVcmxP YmplY3QodXJsMSxvcHRpb25zKTt2YXIgdXJsT2JqMj1PcGVuTGF5ZXJzLlV0aWwu Y3JlYXRlVXJsT2JqZWN0KHVybDIsb3B0aW9ucyk7Zm9yKHZhciBrZXkgaW4gdXJs T2JqMSl7aWYoa2V5IT09ImFyZ3MiKXtpZih1cmxPYmoxW2tleV0hPXVybE9iajJb a2V5XSl7cmV0dXJuIGZhbHNlO319fQpmb3IodmFyIGtleSBpbiB1cmxPYmoxLmFy Z3Mpe2lmKHVybE9iajEuYXJnc1trZXldIT11cmxPYmoyLmFyZ3Nba2V5XSl7cmV0 dXJuIGZhbHNlO30KZGVsZXRlIHVybE9iajIuYXJnc1trZXldO30KZm9yKHZhciBr ZXkgaW4gdXJsT2JqMi5hcmdzKXtyZXR1cm4gZmFsc2U7fQpyZXR1cm4gdHJ1ZTt9 O09wZW5MYXllcnMuVXRpbC5jcmVhdGVVcmxPYmplY3Q9ZnVuY3Rpb24odXJsLG9w dGlvbnMpe29wdGlvbnM9b3B0aW9uc3x8e307aWYoISgvXlx3KzpcL1wvLykudGVz dCh1cmwpKXt2YXIgbG9jPXdpbmRvdy5sb2NhdGlvbjt2YXIgcG9ydD1sb2MucG9y dD8iOiIrbG9jLnBvcnQ6IiI7dmFyIGZ1bGxVcmw9bG9jLnByb3RvY29sKyIvLyIr bG9jLmhvc3Quc3BsaXQoIjoiKS5zaGlmdCgpK3BvcnQ7aWYodXJsLmluZGV4T2Yo Ii8iKT09PTApe3VybD1mdWxsVXJsK3VybDt9ZWxzZXt2YXIgcGFydHM9bG9jLnBh dGhuYW1lLnNwbGl0KCIvIik7cGFydHMucG9wKCk7dXJsPWZ1bGxVcmwrcGFydHMu am9pbigiLyIpKyIvIit1cmw7fX0KaWYob3B0aW9ucy5pZ25vcmVDYXNlKXt1cmw9 dXJsLnRvTG93ZXJDYXNlKCk7fQp2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50 KCdhJyk7YS5ocmVmPXVybDt2YXIgdXJsT2JqZWN0PXt9O3VybE9iamVjdC5ob3N0 PWEuaG9zdC5zcGxpdCgiOiIpLnNoaWZ0KCk7dXJsT2JqZWN0LnByb3RvY29sPWEu cHJvdG9jb2w7aWYob3B0aW9ucy5pZ25vcmVQb3J0ODApe3VybE9iamVjdC5wb3J0 PShhLnBvcnQ9PSI4MCJ8fGEucG9ydD09IjAiKT8iIjphLnBvcnQ7fWVsc2V7dXJs T2JqZWN0LnBvcnQ9KGEucG9ydD09IiJ8fGEucG9ydD09IjAiKT8iODAiOmEucG9y dDt9CnVybE9iamVjdC5oYXNoPShvcHRpb25zLmlnbm9yZUhhc2h8fGEuaGFzaD09 PSIjIik/IiI6YS5oYXNoO3ZhciBxdWVyeVN0cmluZz1hLnNlYXJjaDtpZighcXVl cnlTdHJpbmcpe3ZhciBxTWFyaz11cmwuaW5kZXhPZigiPyIpO3F1ZXJ5U3RyaW5n PShxTWFyayE9LTEpP3VybC5zdWJzdHIocU1hcmspOiIiO30KdXJsT2JqZWN0LmFy Z3M9T3BlbkxheWVycy5VdGlsLmdldFBhcmFtZXRlcnMocXVlcnlTdHJpbmcpO3Vy bE9iamVjdC5wYXRobmFtZT0oYS5wYXRobmFtZS5jaGFyQXQoMCk9PSIvIik/YS5w YXRobmFtZToiLyIrYS5wYXRobmFtZTtyZXR1cm4gdXJsT2JqZWN0O307T3Blbkxh eWVycy5VdGlsLnJlbW92ZVRhaWw9ZnVuY3Rpb24odXJsKXt2YXIgaGVhZD1udWxs O3ZhciBxTWFyaz11cmwuaW5kZXhPZigiPyIpO3ZhciBoYXNoTWFyaz11cmwuaW5k ZXhPZigiIyIpO2lmKHFNYXJrPT0tMSl7aGVhZD0oaGFzaE1hcmshPS0xKT91cmwu c3Vic3RyKDAsaGFzaE1hcmspOnVybDt9ZWxzZXtoZWFkPShoYXNoTWFyayE9LTEp P3VybC5zdWJzdHIoMCxNYXRoLm1pbihxTWFyayxoYXNoTWFyaykpOnVybC5zdWJz dHIoMCxxTWFyayk7fQpyZXR1cm4gaGVhZDt9O09wZW5MYXllcnMuSVNfR0VDS089 KGZ1bmN0aW9uKCl7dmFyIHVhPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNh c2UoKTtyZXR1cm4gdWEuaW5kZXhPZigid2Via2l0Iik9PS0xJiZ1YS5pbmRleE9m KCJnZWNrbyIpIT0tMTt9KSgpO09wZW5MYXllcnMuQlJPV1NFUl9OQU1FPShmdW5j dGlvbigpe3ZhciBuYW1lPSIiO3ZhciB1YT1uYXZpZ2F0b3IudXNlckFnZW50LnRv TG93ZXJDYXNlKCk7aWYodWEuaW5kZXhPZigib3BlcmEiKSE9LTEpe25hbWU9Im9w ZXJhIjt9ZWxzZSBpZih1YS5pbmRleE9mKCJtc2llIikhPS0xKXtuYW1lPSJtc2ll Ijt9ZWxzZSBpZih1YS5pbmRleE9mKCJzYWZhcmkiKSE9LTEpe25hbWU9InNhZmFy aSI7fWVsc2UgaWYodWEuaW5kZXhPZigibW96aWxsYSIpIT0tMSl7aWYodWEuaW5k ZXhPZigiZmlyZWZveCIpIT0tMSl7bmFtZT0iZmlyZWZveCI7fWVsc2V7bmFtZT0i bW96aWxsYSI7fX0KcmV0dXJuIG5hbWU7fSkoKTtPcGVuTGF5ZXJzLlV0aWwuZ2V0 QnJvd3Nlck5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gT3BlbkxheWVycy5CUk9XU0VS X05BTUU7fTtPcGVuTGF5ZXJzLlV0aWwuZ2V0UmVuZGVyZWREaW1lbnNpb25zPWZ1 bmN0aW9uKGNvbnRlbnRIVE1MLHNpemUsb3B0aW9ucyl7dmFyIHcsaDt2YXIgY29u dGFpbmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2NvbnRhaW5lci5z dHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO3ZhciBjb250YWluZXJFbGVtZW50PShv cHRpb25zJiZvcHRpb25zLmNvbnRhaW5lckVsZW1lbnQpP29wdGlvbnMuY29udGFp bmVyRWxlbWVudDpkb2N1bWVudC5ib2R5O2lmKHNpemUpe2lmKHNpemUudyl7dz1z aXplLnc7Y29udGFpbmVyLnN0eWxlLndpZHRoPXcrInB4Ijt9ZWxzZSBpZihzaXpl Lmgpe2g9c2l6ZS5oO2NvbnRhaW5lci5zdHlsZS5oZWlnaHQ9aCsicHgiO319Cmlm KG9wdGlvbnMmJm9wdGlvbnMuZGlzcGxheUNsYXNzKXtjb250YWluZXIuY2xhc3NO YW1lPW9wdGlvbnMuZGlzcGxheUNsYXNzO30KdmFyIGNvbnRlbnQ9ZG9jdW1lbnQu Y3JlYXRlRWxlbWVudCgiZGl2Iik7Y29udGVudC5pbm5lckhUTUw9Y29udGVudEhU TUw7Y29udGVudC5zdHlsZS5vdmVyZmxvdz0idmlzaWJsZSI7aWYoY29udGVudC5j aGlsZE5vZGVzKXtmb3IodmFyIGk9MCxsPWNvbnRlbnQuY2hpbGROb2Rlcy5sZW5n dGg7aTxsO2krKyl7aWYoIWNvbnRlbnQuY2hpbGROb2Rlc1tpXS5zdHlsZSljb250 aW51ZTtjb250ZW50LmNoaWxkTm9kZXNbaV0uc3R5bGUub3ZlcmZsb3c9InZpc2li bGUiO319CmNvbnRhaW5lci5hcHBlbmRDaGlsZChjb250ZW50KTtjb250YWluZXJF bGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7dmFyIHBhcmVudEhhc1Bvc2l0 aW9uQWJzb2x1dGU9ZmFsc2U7dmFyIHBhcmVudD1jb250YWluZXIucGFyZW50Tm9k ZTt3aGlsZShwYXJlbnQmJnBhcmVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkhPSJi b2R5Iil7dmFyIHBhcmVudFBvc2l0aW9uPU9wZW5MYXllcnMuRWxlbWVudC5nZXRT dHlsZShwYXJlbnQsInBvc2l0aW9uIik7aWYocGFyZW50UG9zaXRpb249PSJhYnNv bHV0ZSIpe3BhcmVudEhhc1Bvc2l0aW9uQWJzb2x1dGU9dHJ1ZTticmVhazt9ZWxz ZSBpZihwYXJlbnRQb3NpdGlvbiYmcGFyZW50UG9zaXRpb24hPSJzdGF0aWMiKXti cmVhazt9CnBhcmVudD1wYXJlbnQucGFyZW50Tm9kZTt9CmlmKCFwYXJlbnRIYXNQ b3NpdGlvbkFic29sdXRlKXtjb250YWluZXIuc3R5bGUucG9zaXRpb249ImFic29s dXRlIjt9CmlmKCF3KXt3PXBhcnNlSW50KGNvbnRlbnQuc2Nyb2xsV2lkdGgpO2Nv bnRhaW5lci5zdHlsZS53aWR0aD13KyJweCI7fQppZighaCl7aD1wYXJzZUludChj b250ZW50LnNjcm9sbEhlaWdodCk7fQpjb250YWluZXIucmVtb3ZlQ2hpbGQoY29u dGVudCk7Y29udGFpbmVyRWxlbWVudC5yZW1vdmVDaGlsZChjb250YWluZXIpO3Jl dHVybiBuZXcgT3BlbkxheWVycy5TaXplKHcsaCk7fTtPcGVuTGF5ZXJzLlV0aWwu Z2V0U2Nyb2xsYmFyV2lkdGg9ZnVuY3Rpb24oKXt2YXIgc2Nyb2xsYmFyV2lkdGg9 T3BlbkxheWVycy5VdGlsLl9zY3JvbGxiYXJXaWR0aDtpZihzY3JvbGxiYXJXaWR0 aD09bnVsbCl7dmFyIHNjcj1udWxsO3ZhciBpbm49bnVsbDt2YXIgd05vU2Nyb2xs PTA7dmFyIHdTY3JvbGw9MDtzY3I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2 Jyk7c2NyLnN0eWxlLnBvc2l0aW9uPSdhYnNvbHV0ZSc7c2NyLnN0eWxlLnRvcD0n LTEwMDBweCc7c2NyLnN0eWxlLmxlZnQ9Jy0xMDAwcHgnO3Njci5zdHlsZS53aWR0 aD0nMTAwcHgnO3Njci5zdHlsZS5oZWlnaHQ9JzUwcHgnO3Njci5zdHlsZS5vdmVy Zmxvdz0naGlkZGVuJztpbm49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7 aW5uLnN0eWxlLndpZHRoPScxMDAlJztpbm4uc3R5bGUuaGVpZ2h0PScyMDBweCc7 c2NyLmFwcGVuZENoaWxkKGlubik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChz Y3IpO3dOb1Njcm9sbD1pbm4ub2Zmc2V0V2lkdGg7c2NyLnN0eWxlLm92ZXJmbG93 PSdzY3JvbGwnO3dTY3JvbGw9aW5uLm9mZnNldFdpZHRoO2RvY3VtZW50LmJvZHku cmVtb3ZlQ2hpbGQoZG9jdW1lbnQuYm9keS5sYXN0Q2hpbGQpO09wZW5MYXllcnMu VXRpbC5fc2Nyb2xsYmFyV2lkdGg9KHdOb1Njcm9sbC13U2Nyb2xsKTtzY3JvbGxi YXJXaWR0aD1PcGVuTGF5ZXJzLlV0aWwuX3Njcm9sbGJhcldpZHRoO30KcmV0dXJu IHNjcm9sbGJhcldpZHRoO307T3BlbkxheWVycy5VdGlsLmdldEZvcm1hdHRlZExv bkxhdD1mdW5jdGlvbihjb29yZGluYXRlLGF4aXMsZG1zT3B0aW9uKXtpZighZG1z T3B0aW9uKXtkbXNPcHRpb249J2Rtcyc7fQpjb29yZGluYXRlPShjb29yZGluYXRl KzU0MCklMzYwLTE4MDt2YXIgYWJzY29vcmRpbmF0ZT1NYXRoLmFicyhjb29yZGlu YXRlKTt2YXIgY29vcmRpbmF0ZWRlZ3JlZXM9TWF0aC5mbG9vcihhYnNjb29yZGlu YXRlKTt2YXIgY29vcmRpbmF0ZW1pbnV0ZXM9KGFic2Nvb3JkaW5hdGUtY29vcmRp bmF0ZWRlZ3JlZXMpLygxLzYwKTt2YXIgdGVtcGNvb3JkaW5hdGVtaW51dGVzPWNv b3JkaW5hdGVtaW51dGVzO2Nvb3JkaW5hdGVtaW51dGVzPU1hdGguZmxvb3IoY29v cmRpbmF0ZW1pbnV0ZXMpO3ZhciBjb29yZGluYXRlc2Vjb25kcz0odGVtcGNvb3Jk aW5hdGVtaW51dGVzLWNvb3JkaW5hdGVtaW51dGVzKS8oMS82MCk7Y29vcmRpbmF0 ZXNlY29uZHM9TWF0aC5yb3VuZChjb29yZGluYXRlc2Vjb25kcyoxMCk7Y29vcmRp bmF0ZXNlY29uZHMvPTEwO2lmKGNvb3JkaW5hdGVzZWNvbmRzPj02MCl7Y29vcmRp bmF0ZXNlY29uZHMtPTYwO2Nvb3JkaW5hdGVtaW51dGVzKz0xO2lmKGNvb3JkaW5h dGVtaW51dGVzPj02MCl7Y29vcmRpbmF0ZW1pbnV0ZXMtPTYwO2Nvb3JkaW5hdGVk ZWdyZWVzKz0xO319CmlmKGNvb3JkaW5hdGVkZWdyZWVzPDEwKXtjb29yZGluYXRl ZGVncmVlcz0iMCIrY29vcmRpbmF0ZWRlZ3JlZXM7fQp2YXIgc3RyPWNvb3JkaW5h dGVkZWdyZWVzKyJcdTAwQjAiO2lmKGRtc09wdGlvbi5pbmRleE9mKCdkbScpPj0w KXtpZihjb29yZGluYXRlbWludXRlczwxMCl7Y29vcmRpbmF0ZW1pbnV0ZXM9IjAi K2Nvb3JkaW5hdGVtaW51dGVzO30Kc3RyKz1jb29yZGluYXRlbWludXRlcysiJyI7 aWYoZG1zT3B0aW9uLmluZGV4T2YoJ2RtcycpPj0wKXtpZihjb29yZGluYXRlc2Vj b25kczwxMCl7Y29vcmRpbmF0ZXNlY29uZHM9IjAiK2Nvb3JkaW5hdGVzZWNvbmRz O30Kc3RyKz1jb29yZGluYXRlc2Vjb25kcysnIic7fX0KaWYoYXhpcz09ImxvbiIp e3N0cis9Y29vcmRpbmF0ZTwwP09wZW5MYXllcnMuaTE4bigiVyIpOk9wZW5MYXll cnMuaTE4bigiRSIpO31lbHNle3N0cis9Y29vcmRpbmF0ZTwwP09wZW5MYXllcnMu aTE4bigiUyIpOk9wZW5MYXllcnMuaTE4bigiTiIpO30KcmV0dXJuIHN0cjt9O09w ZW5MYXllcnMuRm9ybWF0PU9wZW5MYXllcnMuQ2xhc3Moe29wdGlvbnM6bnVsbCxl eHRlcm5hbFByb2plY3Rpb246bnVsbCxpbnRlcm5hbFByb2plY3Rpb246bnVsbCxk YXRhOm51bGwsa2VlcERhdGE6ZmFsc2UsaW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRp b25zKXtPcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHRoaXMsb3B0aW9ucyk7dGhpcy5v cHRpb25zPW9wdGlvbnM7fSxkZXN0cm95OmZ1bmN0aW9uKCl7fSxyZWFkOmZ1bmN0 aW9uKGRhdGEpe09wZW5MYXllcnMuQ29uc29sZS51c2VyRXJyb3IoT3BlbkxheWVy cy5pMThuKCJyZWFkTm90SW1wbGVtZW50ZWQiKSk7fSx3cml0ZTpmdW5jdGlvbihv YmplY3Qpe09wZW5MYXllcnMuQ29uc29sZS51c2VyRXJyb3IoT3BlbkxheWVycy5p MThuKCJ3cml0ZU5vdEltcGxlbWVudGVkIikpO30sQ0xBU1NfTkFNRToiT3Blbkxh eWVycy5Gb3JtYXQifSk7T3BlbkxheWVycy5Gb3JtYXQuSlNPTj1PcGVuTGF5ZXJz LkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0LHtpbmRlbnQ6IiAgICAiLHNwYWNlOiIg IixuZXdsaW5lOiJcbiIsbGV2ZWw6MCxwcmV0dHk6ZmFsc2UsbmF0aXZlSlNPTjoo ZnVuY3Rpb24oKXtyZXR1cm4hISh3aW5kb3cuSlNPTiYmdHlwZW9mIEpTT04ucGFy c2U9PSJmdW5jdGlvbiImJnR5cGVvZiBKU09OLnN0cmluZ2lmeT09ImZ1bmN0aW9u Iik7fSkoKSxyZWFkOmZ1bmN0aW9uKGpzb24sZmlsdGVyKXt2YXIgb2JqZWN0O2lm KHRoaXMubmF0aXZlSlNPTil7b2JqZWN0PUpTT04ucGFyc2UoanNvbixmaWx0ZXIp O31lbHNlIHRyeXtpZigvXltcXSw6e31cc10qJC8udGVzdChqc29uLnJlcGxhY2Uo L1xcWyJcXFwvYmZucnR1XS9nLCdAJykucmVwbGFjZSgvIlteIlxcXG5ccl0qInx0 cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/ L2csJ10nKS5yZXBsYWNlKC8oPzpefDp8LCkoPzpccypcWykrL2csJycpKSl7b2Jq ZWN0PWV2YWwoJygnK2pzb24rJyknKTtpZih0eXBlb2YgZmlsdGVyPT09J2Z1bmN0 aW9uJyl7ZnVuY3Rpb24gd2FsayhrLHYpe2lmKHYmJnR5cGVvZiB2PT09J29iamVj dCcpe2Zvcih2YXIgaSBpbiB2KXtpZih2Lmhhc093blByb3BlcnR5KGkpKXt2W2ld PXdhbGsoaSx2W2ldKTt9fX0KcmV0dXJuIGZpbHRlcihrLHYpO30Kb2JqZWN0PXdh bGsoJycsb2JqZWN0KTt9fX1jYXRjaChlKXt9CmlmKHRoaXMua2VlcERhdGEpe3Ro aXMuZGF0YT1vYmplY3Q7fQpyZXR1cm4gb2JqZWN0O30sd3JpdGU6ZnVuY3Rpb24o dmFsdWUscHJldHR5KXt0aGlzLnByZXR0eT0hIXByZXR0eTt2YXIganNvbj1udWxs O3ZhciB0eXBlPXR5cGVvZiB2YWx1ZTtpZih0aGlzLnNlcmlhbGl6ZVt0eXBlXSl7 dHJ5e2pzb249KCF0aGlzLnByZXR0eSYmdGhpcy5uYXRpdmVKU09OKT9KU09OLnN0 cmluZ2lmeSh2YWx1ZSk6dGhpcy5zZXJpYWxpemVbdHlwZV0uYXBwbHkodGhpcyxb dmFsdWVdKTt9Y2F0Y2goZXJyKXtPcGVuTGF5ZXJzLkNvbnNvbGUuZXJyb3IoIlRy b3VibGUgc2VyaWFsaXppbmc6ICIrZXJyKTt9fQpyZXR1cm4ganNvbjt9LHdyaXRl SW5kZW50OmZ1bmN0aW9uKCl7dmFyIHBpZWNlcz1bXTtpZih0aGlzLnByZXR0eSl7 Zm9yKHZhciBpPTA7aTx0aGlzLmxldmVsOysraSl7cGllY2VzLnB1c2godGhpcy5p bmRlbnQpO319CnJldHVybiBwaWVjZXMuam9pbignJyk7fSx3cml0ZU5ld2xpbmU6 ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5wcmV0dHkpP3RoaXMubmV3bGluZTonJzt9 LHdyaXRlU3BhY2U6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5wcmV0dHkpP3RoaXMu c3BhY2U6Jyc7fSxzZXJpYWxpemU6eydvYmplY3QnOmZ1bmN0aW9uKG9iamVjdCl7 aWYob2JqZWN0PT1udWxsKXtyZXR1cm4ibnVsbCI7fQppZihvYmplY3QuY29uc3Ry dWN0b3I9PURhdGUpe3JldHVybiB0aGlzLnNlcmlhbGl6ZS5kYXRlLmFwcGx5KHRo aXMsW29iamVjdF0pO30KaWYob2JqZWN0LmNvbnN0cnVjdG9yPT1BcnJheSl7cmV0 dXJuIHRoaXMuc2VyaWFsaXplLmFycmF5LmFwcGx5KHRoaXMsW29iamVjdF0pO30K dmFyIHBpZWNlcz1bJ3snXTt0aGlzLmxldmVsKz0xO3ZhciBrZXksa2V5SlNPTix2 YWx1ZUpTT047dmFyIGFkZENvbW1hPWZhbHNlO2ZvcihrZXkgaW4gb2JqZWN0KXtp ZihvYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSl7a2V5SlNPTj1PcGVuTGF5ZXJz LkZvcm1hdC5KU09OLnByb3RvdHlwZS53cml0ZS5hcHBseSh0aGlzLFtrZXksdGhp cy5wcmV0dHldKTt2YWx1ZUpTT049T3BlbkxheWVycy5Gb3JtYXQuSlNPTi5wcm90 b3R5cGUud3JpdGUuYXBwbHkodGhpcyxbb2JqZWN0W2tleV0sdGhpcy5wcmV0dHld KTtpZihrZXlKU09OIT1udWxsJiZ2YWx1ZUpTT04hPW51bGwpe2lmKGFkZENvbW1h KXtwaWVjZXMucHVzaCgnLCcpO30KcGllY2VzLnB1c2godGhpcy53cml0ZU5ld2xp bmUoKSx0aGlzLndyaXRlSW5kZW50KCksa2V5SlNPTiwnOicsdGhpcy53cml0ZVNw YWNlKCksdmFsdWVKU09OKTthZGRDb21tYT10cnVlO319fQp0aGlzLmxldmVsLT0x O3BpZWNlcy5wdXNoKHRoaXMud3JpdGVOZXdsaW5lKCksdGhpcy53cml0ZUluZGVu dCgpLCd9Jyk7cmV0dXJuIHBpZWNlcy5qb2luKCcnKTt9LCdhcnJheSc6ZnVuY3Rp b24oYXJyYXkpe3ZhciBqc29uO3ZhciBwaWVjZXM9WydbJ107dGhpcy5sZXZlbCs9 MTtmb3IodmFyIGk9MCxsZW49YXJyYXkubGVuZ3RoO2k8bGVuOysraSl7anNvbj1P cGVuTGF5ZXJzLkZvcm1hdC5KU09OLnByb3RvdHlwZS53cml0ZS5hcHBseSh0aGlz LFthcnJheVtpXSx0aGlzLnByZXR0eV0pO2lmKGpzb24hPW51bGwpe2lmKGk+MCl7 cGllY2VzLnB1c2goJywnKTt9CnBpZWNlcy5wdXNoKHRoaXMud3JpdGVOZXdsaW5l KCksdGhpcy53cml0ZUluZGVudCgpLGpzb24pO319CnRoaXMubGV2ZWwtPTE7cGll Y2VzLnB1c2godGhpcy53cml0ZU5ld2xpbmUoKSx0aGlzLndyaXRlSW5kZW50KCks J10nKTtyZXR1cm4gcGllY2VzLmpvaW4oJycpO30sJ3N0cmluZyc6ZnVuY3Rpb24o c3RyaW5nKXt2YXIgbT17J1xiJzonXFxiJywnXHQnOidcXHQnLCdcbic6J1xcbics J1xmJzonXFxmJywnXHInOidcXHInLCciJzonXFwiJywnXFwnOidcXFxcJ307aWYo L1siXFxceDAwLVx4MWZdLy50ZXN0KHN0cmluZykpe3JldHVybiciJytzdHJpbmcu cmVwbGFjZSgvKFtceDAwLVx4MWZcXCJdKS9nLGZ1bmN0aW9uKGEsYil7dmFyIGM9 bVtiXTtpZihjKXtyZXR1cm4gYzt9CmM9Yi5jaGFyQ29kZUF0KCk7cmV0dXJuJ1xc dTAwJysKTWF0aC5mbG9vcihjLzE2KS50b1N0cmluZygxNikrCihjJTE2KS50b1N0 cmluZygxNik7fSkrJyInO30KcmV0dXJuJyInK3N0cmluZysnIic7fSwnbnVtYmVy JzpmdW5jdGlvbihudW1iZXIpe3JldHVybiBpc0Zpbml0ZShudW1iZXIpP1N0cmlu ZyhudW1iZXIpOiJudWxsIjt9LCdib29sZWFuJzpmdW5jdGlvbihib29sKXtyZXR1 cm4gU3RyaW5nKGJvb2wpO30sJ2RhdGUnOmZ1bmN0aW9uKGRhdGUpe2Z1bmN0aW9u IGZvcm1hdChudW1iZXIpe3JldHVybihudW1iZXI8MTApPycwJytudW1iZXI6bnVt YmVyO30KcmV0dXJuJyInK2RhdGUuZ2V0RnVsbFllYXIoKSsnLScrCmZvcm1hdChk YXRlLmdldE1vbnRoKCkrMSkrJy0nKwpmb3JtYXQoZGF0ZS5nZXREYXRlKCkpKydU JysKZm9ybWF0KGRhdGUuZ2V0SG91cnMoKSkrJzonKwpmb3JtYXQoZGF0ZS5nZXRN aW51dGVzKCkpKyc6JysKZm9ybWF0KGRhdGUuZ2V0U2Vjb25kcygpKSsnIic7fX0s Q0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3JtYXQuSlNPTiJ9KTtPcGVuTGF5ZXJz LkZlYXR1cmU9T3BlbkxheWVycy5DbGFzcyh7bGF5ZXI6bnVsbCxpZDpudWxsLGxv bmxhdDpudWxsLGRhdGE6bnVsbCxtYXJrZXI6bnVsbCxwb3B1cENsYXNzOm51bGws cG9wdXA6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKGxheWVyLGxvbmxhdCxkYXRh KXt0aGlzLmxheWVyPWxheWVyO3RoaXMubG9ubGF0PWxvbmxhdDt0aGlzLmRhdGE9 KGRhdGEhPW51bGwpP2RhdGE6e307dGhpcy5pZD1PcGVuTGF5ZXJzLlV0aWwuY3Jl YXRlVW5pcXVlSUQodGhpcy5DTEFTU19OQU1FKyJfIik7fSxkZXN0cm95OmZ1bmN0 aW9uKCl7aWYoKHRoaXMubGF5ZXIhPW51bGwpJiYodGhpcy5sYXllci5tYXAhPW51 bGwpKXtpZih0aGlzLnBvcHVwIT1udWxsKXt0aGlzLmxheWVyLm1hcC5yZW1vdmVQ b3B1cCh0aGlzLnBvcHVwKTt9fQppZih0aGlzLmxheWVyIT1udWxsJiZ0aGlzLm1h cmtlciE9bnVsbCl7dGhpcy5sYXllci5yZW1vdmVNYXJrZXIodGhpcy5tYXJrZXIp O30KdGhpcy5sYXllcj1udWxsO3RoaXMuaWQ9bnVsbDt0aGlzLmxvbmxhdD1udWxs O3RoaXMuZGF0YT1udWxsO2lmKHRoaXMubWFya2VyIT1udWxsKXt0aGlzLmRlc3Ry b3lNYXJrZXIodGhpcy5tYXJrZXIpO3RoaXMubWFya2VyPW51bGw7fQppZih0aGlz LnBvcHVwIT1udWxsKXt0aGlzLmRlc3Ryb3lQb3B1cCh0aGlzLnBvcHVwKTt0aGlz LnBvcHVwPW51bGw7fX0sb25TY3JlZW46ZnVuY3Rpb24oKXt2YXIgb25TY3JlZW49 ZmFsc2U7aWYoKHRoaXMubGF5ZXIhPW51bGwpJiYodGhpcy5sYXllci5tYXAhPW51 bGwpKXt2YXIgc2NyZWVuQm91bmRzPXRoaXMubGF5ZXIubWFwLmdldEV4dGVudCgp O29uU2NyZWVuPXNjcmVlbkJvdW5kcy5jb250YWluc0xvbkxhdCh0aGlzLmxvbmxh dCk7fQpyZXR1cm4gb25TY3JlZW47fSxjcmVhdGVNYXJrZXI6ZnVuY3Rpb24oKXtp Zih0aGlzLmxvbmxhdCE9bnVsbCl7dGhpcy5tYXJrZXI9bmV3IE9wZW5MYXllcnMu TWFya2VyKHRoaXMubG9ubGF0LHRoaXMuZGF0YS5pY29uKTt9CnJldHVybiB0aGlz Lm1hcmtlcjt9LGRlc3Ryb3lNYXJrZXI6ZnVuY3Rpb24oKXt0aGlzLm1hcmtlci5k ZXN0cm95KCk7fSxjcmVhdGVQb3B1cDpmdW5jdGlvbihjbG9zZUJveCl7aWYodGhp cy5sb25sYXQhPW51bGwpe2lmKCF0aGlzLnBvcHVwKXt2YXIgYW5jaG9yPSh0aGlz Lm1hcmtlcik/dGhpcy5tYXJrZXIuaWNvbjpudWxsO3ZhciBwb3B1cENsYXNzPXRo aXMucG9wdXBDbGFzcz90aGlzLnBvcHVwQ2xhc3M6T3BlbkxheWVycy5Qb3B1cC5B bmNob3JlZEJ1YmJsZTt0aGlzLnBvcHVwPW5ldyBwb3B1cENsYXNzKHRoaXMuaWQr Il9wb3B1cCIsdGhpcy5sb25sYXQsdGhpcy5kYXRhLnBvcHVwU2l6ZSx0aGlzLmRh dGEucG9wdXBDb250ZW50SFRNTCxhbmNob3IsY2xvc2VCb3gpO30KaWYodGhpcy5k YXRhLm92ZXJmbG93IT1udWxsKXt0aGlzLnBvcHVwLmNvbnRlbnREaXYuc3R5bGUu b3ZlcmZsb3c9dGhpcy5kYXRhLm92ZXJmbG93O30KdGhpcy5wb3B1cC5mZWF0dXJl PXRoaXM7fQpyZXR1cm4gdGhpcy5wb3B1cDt9LGRlc3Ryb3lQb3B1cDpmdW5jdGlv bigpe2lmKHRoaXMucG9wdXApe3RoaXMucG9wdXAuZmVhdHVyZT1udWxsO3RoaXMu cG9wdXAuZGVzdHJveSgpO3RoaXMucG9wdXA9bnVsbDt9fSxDTEFTU19OQU1FOiJP cGVuTGF5ZXJzLkZlYXR1cmUifSk7T3BlbkxheWVycy5TdGF0ZT17VU5LTk9XTjon VW5rbm93bicsSU5TRVJUOidJbnNlcnQnLFVQREFURTonVXBkYXRlJyxERUxFVEU6 J0RlbGV0ZSd9O09wZW5MYXllcnMuRmVhdHVyZS5WZWN0b3I9T3BlbkxheWVycy5D bGFzcyhPcGVuTGF5ZXJzLkZlYXR1cmUse2ZpZDpudWxsLGdlb21ldHJ5Om51bGws YXR0cmlidXRlczpudWxsLGJvdW5kczpudWxsLHN0YXRlOm51bGwsc3R5bGU6bnVs bCx1cmw6bnVsbCxyZW5kZXJJbnRlbnQ6ImRlZmF1bHQiLG1vZGlmaWVkOm51bGws aW5pdGlhbGl6ZTpmdW5jdGlvbihnZW9tZXRyeSxhdHRyaWJ1dGVzLHN0eWxlKXtP cGVuTGF5ZXJzLkZlYXR1cmUucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhp cyxbbnVsbCxudWxsLGF0dHJpYnV0ZXNdKTt0aGlzLmxvbmxhdD1udWxsO3RoaXMu Z2VvbWV0cnk9Z2VvbWV0cnk/Z2VvbWV0cnk6bnVsbDt0aGlzLnN0YXRlPW51bGw7 dGhpcy5hdHRyaWJ1dGVzPXt9O2lmKGF0dHJpYnV0ZXMpe3RoaXMuYXR0cmlidXRl cz1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHRoaXMuYXR0cmlidXRlcyxhdHRyaWJ1 dGVzKTt9CnRoaXMuc3R5bGU9c3R5bGU/c3R5bGU6bnVsbDt9LGRlc3Ryb3k6ZnVu Y3Rpb24oKXtpZih0aGlzLmxheWVyKXt0aGlzLmxheWVyLnJlbW92ZUZlYXR1cmVz KHRoaXMpO3RoaXMubGF5ZXI9bnVsbDt9CnRoaXMuZ2VvbWV0cnk9bnVsbDt0aGlz Lm1vZGlmaWVkPW51bGw7T3BlbkxheWVycy5GZWF0dXJlLnByb3RvdHlwZS5kZXN0 cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LGNsb25lOmZ1bmN0aW9uKCl7cmV0 dXJuIG5ldyBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9yKHRoaXMuZ2VvbWV0cnk/ dGhpcy5nZW9tZXRyeS5jbG9uZSgpOm51bGwsdGhpcy5hdHRyaWJ1dGVzLHRoaXMu c3R5bGUpO30sb25TY3JlZW46ZnVuY3Rpb24oYm91bmRzT25seSl7dmFyIG9uU2Ny ZWVuPWZhbHNlO2lmKHRoaXMubGF5ZXImJnRoaXMubGF5ZXIubWFwKXt2YXIgc2Ny ZWVuQm91bmRzPXRoaXMubGF5ZXIubWFwLmdldEV4dGVudCgpO2lmKGJvdW5kc09u bHkpe3ZhciBmZWF0dXJlQm91bmRzPXRoaXMuZ2VvbWV0cnkuZ2V0Qm91bmRzKCk7 b25TY3JlZW49c2NyZWVuQm91bmRzLmludGVyc2VjdHNCb3VuZHMoZmVhdHVyZUJv dW5kcyk7fWVsc2V7dmFyIHNjcmVlblBvbHk9c2NyZWVuQm91bmRzLnRvR2VvbWV0 cnkoKTtvblNjcmVlbj1zY3JlZW5Qb2x5LmludGVyc2VjdHModGhpcy5nZW9tZXRy eSk7fX0KcmV0dXJuIG9uU2NyZWVuO30sZ2V0VmlzaWJpbGl0eTpmdW5jdGlvbigp e3JldHVybiEodGhpcy5zdHlsZSYmdGhpcy5zdHlsZS5kaXNwbGF5PT0nbm9uZSd8 fCF0aGlzLmxheWVyfHx0aGlzLmxheWVyJiZ0aGlzLmxheWVyLnN0eWxlTWFwJiZ0 aGlzLmxheWVyLnN0eWxlTWFwLmNyZWF0ZVN5bWJvbGl6ZXIodGhpcyx0aGlzLnJl bmRlckludGVudCkuZGlzcGxheT09J25vbmUnfHx0aGlzLmxheWVyJiYhdGhpcy5s YXllci5nZXRWaXNpYmlsaXR5KCkpO30sY3JlYXRlTWFya2VyOmZ1bmN0aW9uKCl7 cmV0dXJuIG51bGw7fSxkZXN0cm95TWFya2VyOmZ1bmN0aW9uKCl7fSxjcmVhdGVQ b3B1cDpmdW5jdGlvbigpe3JldHVybiBudWxsO30sYXRQb2ludDpmdW5jdGlvbihs b25sYXQsdG9sZXJhbmNlTG9uLHRvbGVyYW5jZUxhdCl7dmFyIGF0UG9pbnQ9ZmFs c2U7aWYodGhpcy5nZW9tZXRyeSl7YXRQb2ludD10aGlzLmdlb21ldHJ5LmF0UG9p bnQobG9ubGF0LHRvbGVyYW5jZUxvbix0b2xlcmFuY2VMYXQpO30KcmV0dXJuIGF0 UG9pbnQ7fSxkZXN0cm95UG9wdXA6ZnVuY3Rpb24oKXt9LG1vdmU6ZnVuY3Rpb24o bG9jYXRpb24pe2lmKCF0aGlzLmxheWVyfHwhdGhpcy5nZW9tZXRyeS5tb3ZlKXty ZXR1cm4gdW5kZWZpbmVkO30KdmFyIHBpeGVsO2lmKGxvY2F0aW9uLkNMQVNTX05B TUU9PSJPcGVuTGF5ZXJzLkxvbkxhdCIpe3BpeGVsPXRoaXMubGF5ZXIuZ2V0Vmll d1BvcnRQeEZyb21Mb25MYXQobG9jYXRpb24pO31lbHNle3BpeGVsPWxvY2F0aW9u O30KdmFyIGxhc3RQaXhlbD10aGlzLmxheWVyLmdldFZpZXdQb3J0UHhGcm9tTG9u TGF0KHRoaXMuZ2VvbWV0cnkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyTG9uTGF0KCkp O3ZhciByZXM9dGhpcy5sYXllci5tYXAuZ2V0UmVzb2x1dGlvbigpO3RoaXMuZ2Vv bWV0cnkubW92ZShyZXMqKHBpeGVsLngtbGFzdFBpeGVsLngpLHJlcyoobGFzdFBp eGVsLnktcGl4ZWwueSkpO3RoaXMubGF5ZXIuZHJhd0ZlYXR1cmUodGhpcyk7cmV0 dXJuIGxhc3RQaXhlbDt9LHRvU3RhdGU6ZnVuY3Rpb24oc3RhdGUpe2lmKHN0YXRl PT1PcGVuTGF5ZXJzLlN0YXRlLlVQREFURSl7c3dpdGNoKHRoaXMuc3RhdGUpe2Nh c2UgT3BlbkxheWVycy5TdGF0ZS5VTktOT1dOOmNhc2UgT3BlbkxheWVycy5TdGF0 ZS5ERUxFVEU6dGhpcy5zdGF0ZT1zdGF0ZTticmVhaztjYXNlIE9wZW5MYXllcnMu U3RhdGUuVVBEQVRFOmNhc2UgT3BlbkxheWVycy5TdGF0ZS5JTlNFUlQ6YnJlYWs7 fX1lbHNlIGlmKHN0YXRlPT1PcGVuTGF5ZXJzLlN0YXRlLklOU0VSVCl7c3dpdGNo KHRoaXMuc3RhdGUpe2Nhc2UgT3BlbkxheWVycy5TdGF0ZS5VTktOT1dOOmJyZWFr O2RlZmF1bHQ6dGhpcy5zdGF0ZT1zdGF0ZTticmVhazt9fWVsc2UgaWYoc3RhdGU9 PU9wZW5MYXllcnMuU3RhdGUuREVMRVRFKXtzd2l0Y2godGhpcy5zdGF0ZSl7Y2Fz ZSBPcGVuTGF5ZXJzLlN0YXRlLklOU0VSVDpicmVhaztjYXNlIE9wZW5MYXllcnMu U3RhdGUuREVMRVRFOmJyZWFrO2Nhc2UgT3BlbkxheWVycy5TdGF0ZS5VTktOT1dO OmNhc2UgT3BlbkxheWVycy5TdGF0ZS5VUERBVEU6dGhpcy5zdGF0ZT1zdGF0ZTti cmVhazt9fWVsc2UgaWYoc3RhdGU9PU9wZW5MYXllcnMuU3RhdGUuVU5LTk9XTil7 dGhpcy5zdGF0ZT1zdGF0ZTt9fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZlYXR1 cmUuVmVjdG9yIn0pO09wZW5MYXllcnMuRmVhdHVyZS5WZWN0b3Iuc3R5bGU9eydk ZWZhdWx0Jzp7ZmlsbENvbG9yOiIjZWU5OTAwIixmaWxsT3BhY2l0eTowLjQsaG92 ZXJGaWxsQ29sb3I6IndoaXRlIixob3ZlckZpbGxPcGFjaXR5OjAuOCxzdHJva2VD b2xvcjoiI2VlOTkwMCIsc3Ryb2tlT3BhY2l0eToxLHN0cm9rZVdpZHRoOjEsc3Ry b2tlTGluZWNhcDoicm91bmQiLHN0cm9rZURhc2hzdHlsZToic29saWQiLGhvdmVy U3Ryb2tlQ29sb3I6InJlZCIsaG92ZXJTdHJva2VPcGFjaXR5OjEsaG92ZXJTdHJv a2VXaWR0aDowLjIscG9pbnRSYWRpdXM6Nixob3ZlclBvaW50UmFkaXVzOjEsaG92 ZXJQb2ludFVuaXQ6IiUiLHBvaW50ZXJFdmVudHM6InZpc2libGVQYWludGVkIixj dXJzb3I6ImluaGVyaXQifSwnc2VsZWN0Jzp7ZmlsbENvbG9yOiJibHVlIixmaWxs T3BhY2l0eTowLjQsaG92ZXJGaWxsQ29sb3I6IndoaXRlIixob3ZlckZpbGxPcGFj aXR5OjAuOCxzdHJva2VDb2xvcjoiYmx1ZSIsc3Ryb2tlT3BhY2l0eToxLHN0cm9r ZVdpZHRoOjIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZURhc2hzdHlsZToi c29saWQiLGhvdmVyU3Ryb2tlQ29sb3I6InJlZCIsaG92ZXJTdHJva2VPcGFjaXR5 OjEsaG92ZXJTdHJva2VXaWR0aDowLjIscG9pbnRSYWRpdXM6Nixob3ZlclBvaW50 UmFkaXVzOjEsaG92ZXJQb2ludFVuaXQ6IiUiLHBvaW50ZXJFdmVudHM6InZpc2li bGVQYWludGVkIixjdXJzb3I6InBvaW50ZXIifSwndGVtcG9yYXJ5Jzp7ZmlsbENv bG9yOiIjNjZjY2NjIixmaWxsT3BhY2l0eTowLjIsaG92ZXJGaWxsQ29sb3I6Indo aXRlIixob3ZlckZpbGxPcGFjaXR5OjAuOCxzdHJva2VDb2xvcjoiIzY2Y2NjYyIs c3Ryb2tlT3BhY2l0eToxLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VXaWR0 aDoyLHN0cm9rZURhc2hzdHlsZToic29saWQiLGhvdmVyU3Ryb2tlQ29sb3I6InJl ZCIsaG92ZXJTdHJva2VPcGFjaXR5OjEsaG92ZXJTdHJva2VXaWR0aDowLjIscG9p bnRSYWRpdXM6Nixob3ZlclBvaW50UmFkaXVzOjEsaG92ZXJQb2ludFVuaXQ6IiUi LHBvaW50ZXJFdmVudHM6InZpc2libGVQYWludGVkIixjdXJzb3I6ImluaGVyaXQi fSwnZGVsZXRlJzp7ZGlzcGxheToibm9uZSJ9fTtPcGVuTGF5ZXJzLkZvcm1hdC5X S1Q9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkZvcm1hdCx7aW5pdGlhbGl6 ZTpmdW5jdGlvbihvcHRpb25zKXt0aGlzLnJlZ0V4ZXM9eyd0eXBlU3RyJzovXlxz KihcdyspXHMqXChccyooLiopXHMqXClccyokLywnc3BhY2VzJzovXHMrLywncGFy ZW5Db21tYSc6L1wpXHMqLFxzKlwoLywnZG91YmxlUGFyZW5Db21tYSc6L1wpXHMq XClccyosXHMqXChccypcKC8sJ3RyaW1QYXJlbnMnOi9eXHMqXCg/KC4qPylcKT9c cyokL307T3BlbkxheWVycy5Gb3JtYXQucHJvdG90eXBlLmluaXRpYWxpemUuYXBw bHkodGhpcyxbb3B0aW9uc10pO30scmVhZDpmdW5jdGlvbih3a3Qpe3ZhciBmZWF0 dXJlcyx0eXBlLHN0cjt3a3Q9d2t0LnJlcGxhY2UoL1tcblxyXS9nLCIgIik7dmFy IG1hdGNoZXM9dGhpcy5yZWdFeGVzLnR5cGVTdHIuZXhlYyh3a3QpO2lmKG1hdGNo ZXMpe3R5cGU9bWF0Y2hlc1sxXS50b0xvd2VyQ2FzZSgpO3N0cj1tYXRjaGVzWzJd O2lmKHRoaXMucGFyc2VbdHlwZV0pe2ZlYXR1cmVzPXRoaXMucGFyc2VbdHlwZV0u YXBwbHkodGhpcyxbc3RyXSk7fQppZih0aGlzLmludGVybmFsUHJvamVjdGlvbiYm dGhpcy5leHRlcm5hbFByb2plY3Rpb24pe2lmKGZlYXR1cmVzJiZmZWF0dXJlcy5D TEFTU19OQU1FPT0iT3BlbkxheWVycy5GZWF0dXJlLlZlY3RvciIpe2ZlYXR1cmVz Lmdlb21ldHJ5LnRyYW5zZm9ybSh0aGlzLmV4dGVybmFsUHJvamVjdGlvbix0aGlz LmludGVybmFsUHJvamVjdGlvbik7fWVsc2UgaWYoZmVhdHVyZXMmJnR5cGUhPSJn ZW9tZXRyeWNvbGxlY3Rpb24iJiZ0eXBlb2YgZmVhdHVyZXM9PSJvYmplY3QiKXtm b3IodmFyIGk9MCxsZW49ZmVhdHVyZXMubGVuZ3RoO2k8bGVuO2krKyl7dmFyIGNv bXBvbmVudD1mZWF0dXJlc1tpXTtjb21wb25lbnQuZ2VvbWV0cnkudHJhbnNmb3Jt KHRoaXMuZXh0ZXJuYWxQcm9qZWN0aW9uLHRoaXMuaW50ZXJuYWxQcm9qZWN0aW9u KTt9fX19CnJldHVybiBmZWF0dXJlczt9LHdyaXRlOmZ1bmN0aW9uKGZlYXR1cmVz KXt2YXIgY29sbGVjdGlvbixnZW9tZXRyeSx0eXBlLGRhdGEsaXNDb2xsZWN0aW9u O2lmKGZlYXR1cmVzLmNvbnN0cnVjdG9yPT1BcnJheSl7Y29sbGVjdGlvbj1mZWF0 dXJlcztpc0NvbGxlY3Rpb249dHJ1ZTt9ZWxzZXtjb2xsZWN0aW9uPVtmZWF0dXJl c107aXNDb2xsZWN0aW9uPWZhbHNlO30KdmFyIHBpZWNlcz1bXTtpZihpc0NvbGxl Y3Rpb24pe3BpZWNlcy5wdXNoKCdHRU9NRVRSWUNPTExFQ1RJT04oJyk7fQpmb3Io dmFyIGk9MCxsZW49Y29sbGVjdGlvbi5sZW5ndGg7aTxsZW47KytpKXtpZihpc0Nv bGxlY3Rpb24mJmk+MCl7cGllY2VzLnB1c2goJywnKTt9Cmdlb21ldHJ5PWNvbGxl Y3Rpb25baV0uZ2VvbWV0cnk7cGllY2VzLnB1c2godGhpcy5leHRyYWN0R2VvbWV0 cnkoZ2VvbWV0cnkpKTt9CmlmKGlzQ29sbGVjdGlvbil7cGllY2VzLnB1c2goJykn KTt9CnJldHVybiBwaWVjZXMuam9pbignJyk7fSxleHRyYWN0R2VvbWV0cnk6ZnVu Y3Rpb24oZ2VvbWV0cnkpe3ZhciB0eXBlPWdlb21ldHJ5LkNMQVNTX05BTUUuc3Bs aXQoJy4nKVsyXS50b0xvd2VyQ2FzZSgpO2lmKCF0aGlzLmV4dHJhY3RbdHlwZV0p e3JldHVybiBudWxsO30KaWYodGhpcy5pbnRlcm5hbFByb2plY3Rpb24mJnRoaXMu ZXh0ZXJuYWxQcm9qZWN0aW9uKXtnZW9tZXRyeT1nZW9tZXRyeS5jbG9uZSgpO2dl b21ldHJ5LnRyYW5zZm9ybSh0aGlzLmludGVybmFsUHJvamVjdGlvbix0aGlzLmV4 dGVybmFsUHJvamVjdGlvbik7fQp2YXIgd2t0VHlwZT10eXBlPT0nY29sbGVjdGlv bic/J0dFT01FVFJZQ09MTEVDVElPTic6dHlwZS50b1VwcGVyQ2FzZSgpO3ZhciBk YXRhPXdrdFR5cGUrJygnK3RoaXMuZXh0cmFjdFt0eXBlXS5hcHBseSh0aGlzLFtn ZW9tZXRyeV0pKycpJztyZXR1cm4gZGF0YTt9LGV4dHJhY3Q6eydwb2ludCc6ZnVu Y3Rpb24ocG9pbnQpe3JldHVybiBwb2ludC54KycgJytwb2ludC55O30sJ211bHRp cG9pbnQnOmZ1bmN0aW9uKG11bHRpcG9pbnQpe3ZhciBhcnJheT1bXTtmb3IodmFy IGk9MCxsZW49bXVsdGlwb2ludC5jb21wb25lbnRzLmxlbmd0aDtpPGxlbjsrK2kp e2FycmF5LnB1c2goJygnKwp0aGlzLmV4dHJhY3QucG9pbnQuYXBwbHkodGhpcyxb bXVsdGlwb2ludC5jb21wb25lbnRzW2ldXSkrJyknKTt9CnJldHVybiBhcnJheS5q b2luKCcsJyk7fSwnbGluZXN0cmluZyc6ZnVuY3Rpb24obGluZXN0cmluZyl7dmFy IGFycmF5PVtdO2Zvcih2YXIgaT0wLGxlbj1saW5lc3RyaW5nLmNvbXBvbmVudHMu bGVuZ3RoO2k8bGVuOysraSl7YXJyYXkucHVzaCh0aGlzLmV4dHJhY3QucG9pbnQu YXBwbHkodGhpcyxbbGluZXN0cmluZy5jb21wb25lbnRzW2ldXSkpO30KcmV0dXJu IGFycmF5LmpvaW4oJywnKTt9LCdtdWx0aWxpbmVzdHJpbmcnOmZ1bmN0aW9uKG11 bHRpbGluZXN0cmluZyl7dmFyIGFycmF5PVtdO2Zvcih2YXIgaT0wLGxlbj1tdWx0 aWxpbmVzdHJpbmcuY29tcG9uZW50cy5sZW5ndGg7aTxsZW47KytpKXthcnJheS5w dXNoKCcoJysKdGhpcy5leHRyYWN0LmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbbXVs dGlsaW5lc3RyaW5nLmNvbXBvbmVudHNbaV1dKSsnKScpO30KcmV0dXJuIGFycmF5 LmpvaW4oJywnKTt9LCdwb2x5Z29uJzpmdW5jdGlvbihwb2x5Z29uKXt2YXIgYXJy YXk9W107Zm9yKHZhciBpPTAsbGVuPXBvbHlnb24uY29tcG9uZW50cy5sZW5ndGg7 aTxsZW47KytpKXthcnJheS5wdXNoKCcoJysKdGhpcy5leHRyYWN0LmxpbmVzdHJp bmcuYXBwbHkodGhpcyxbcG9seWdvbi5jb21wb25lbnRzW2ldXSkrJyknKTt9CnJl dHVybiBhcnJheS5qb2luKCcsJyk7fSwnbXVsdGlwb2x5Z29uJzpmdW5jdGlvbiht dWx0aXBvbHlnb24pe3ZhciBhcnJheT1bXTtmb3IodmFyIGk9MCxsZW49bXVsdGlw b2x5Z29uLmNvbXBvbmVudHMubGVuZ3RoO2k8bGVuOysraSl7YXJyYXkucHVzaCgn KCcrCnRoaXMuZXh0cmFjdC5wb2x5Z29uLmFwcGx5KHRoaXMsW211bHRpcG9seWdv bi5jb21wb25lbnRzW2ldXSkrJyknKTt9CnJldHVybiBhcnJheS5qb2luKCcsJyk7 fSwnY29sbGVjdGlvbic6ZnVuY3Rpb24oY29sbGVjdGlvbil7dmFyIGFycmF5PVtd O2Zvcih2YXIgaT0wLGxlbj1jb2xsZWN0aW9uLmNvbXBvbmVudHMubGVuZ3RoO2k8 bGVuOysraSl7YXJyYXkucHVzaCh0aGlzLmV4dHJhY3RHZW9tZXRyeS5hcHBseSh0 aGlzLFtjb2xsZWN0aW9uLmNvbXBvbmVudHNbaV1dKSk7fQpyZXR1cm4gYXJyYXku am9pbignLCcpO319LHBhcnNlOnsncG9pbnQnOmZ1bmN0aW9uKHN0cil7dmFyIGNv b3Jkcz1PcGVuTGF5ZXJzLlN0cmluZy50cmltKHN0cikuc3BsaXQodGhpcy5yZWdF eGVzLnNwYWNlcyk7cmV0dXJuIG5ldyBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9y KG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KGNvb3Jkc1swXSxjb29yZHNb MV0pKTt9LCdtdWx0aXBvaW50JzpmdW5jdGlvbihzdHIpe3ZhciBwb2ludDt2YXIg cG9pbnRzPU9wZW5MYXllcnMuU3RyaW5nLnRyaW0oc3RyKS5zcGxpdCgnLCcpO3Zh ciBjb21wb25lbnRzPVtdO2Zvcih2YXIgaT0wLGxlbj1wb2ludHMubGVuZ3RoO2k8 bGVuOysraSl7cG9pbnQ9cG9pbnRzW2ldLnJlcGxhY2UodGhpcy5yZWdFeGVzLnRy aW1QYXJlbnMsJyQxJyk7Y29tcG9uZW50cy5wdXNoKHRoaXMucGFyc2UucG9pbnQu YXBwbHkodGhpcyxbcG9pbnRdKS5nZW9tZXRyeSk7fQpyZXR1cm4gbmV3IE9wZW5M YXllcnMuRmVhdHVyZS5WZWN0b3IobmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuTXVs dGlQb2ludChjb21wb25lbnRzKSk7fSwnbGluZXN0cmluZyc6ZnVuY3Rpb24oc3Ry KXt2YXIgcG9pbnRzPU9wZW5MYXllcnMuU3RyaW5nLnRyaW0oc3RyKS5zcGxpdCgn LCcpO3ZhciBjb21wb25lbnRzPVtdO2Zvcih2YXIgaT0wLGxlbj1wb2ludHMubGVu Z3RoO2k8bGVuOysraSl7Y29tcG9uZW50cy5wdXNoKHRoaXMucGFyc2UucG9pbnQu YXBwbHkodGhpcyxbcG9pbnRzW2ldXSkuZ2VvbWV0cnkpO30KcmV0dXJuIG5ldyBP cGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9yKG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5 LkxpbmVTdHJpbmcoY29tcG9uZW50cykpO30sJ211bHRpbGluZXN0cmluZyc6ZnVu Y3Rpb24oc3RyKXt2YXIgbGluZTt2YXIgbGluZXM9T3BlbkxheWVycy5TdHJpbmcu dHJpbShzdHIpLnNwbGl0KHRoaXMucmVnRXhlcy5wYXJlbkNvbW1hKTt2YXIgY29t cG9uZW50cz1bXTtmb3IodmFyIGk9MCxsZW49bGluZXMubGVuZ3RoO2k8bGVuOysr aSl7bGluZT1saW5lc1tpXS5yZXBsYWNlKHRoaXMucmVnRXhlcy50cmltUGFyZW5z LCckMScpO2NvbXBvbmVudHMucHVzaCh0aGlzLnBhcnNlLmxpbmVzdHJpbmcuYXBw bHkodGhpcyxbbGluZV0pLmdlb21ldHJ5KTt9CnJldHVybiBuZXcgT3BlbkxheWVy cy5GZWF0dXJlLlZlY3RvcihuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5NdWx0aUxp bmVTdHJpbmcoY29tcG9uZW50cykpO30sJ3BvbHlnb24nOmZ1bmN0aW9uKHN0cil7 dmFyIHJpbmcsbGluZXN0cmluZyxsaW5lYXJyaW5nO3ZhciByaW5ncz1PcGVuTGF5 ZXJzLlN0cmluZy50cmltKHN0cikuc3BsaXQodGhpcy5yZWdFeGVzLnBhcmVuQ29t bWEpO3ZhciBjb21wb25lbnRzPVtdO2Zvcih2YXIgaT0wLGxlbj1yaW5ncy5sZW5n dGg7aTxsZW47KytpKXtyaW5nPXJpbmdzW2ldLnJlcGxhY2UodGhpcy5yZWdFeGVz LnRyaW1QYXJlbnMsJyQxJyk7bGluZXN0cmluZz10aGlzLnBhcnNlLmxpbmVzdHJp bmcuYXBwbHkodGhpcyxbcmluZ10pLmdlb21ldHJ5O2xpbmVhcnJpbmc9bmV3IE9w ZW5MYXllcnMuR2VvbWV0cnkuTGluZWFyUmluZyhsaW5lc3RyaW5nLmNvbXBvbmVu dHMpO2NvbXBvbmVudHMucHVzaChsaW5lYXJyaW5nKTt9CnJldHVybiBuZXcgT3Bl bkxheWVycy5GZWF0dXJlLlZlY3RvcihuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Q b2x5Z29uKGNvbXBvbmVudHMpKTt9LCdtdWx0aXBvbHlnb24nOmZ1bmN0aW9uKHN0 cil7dmFyIHBvbHlnb247dmFyIHBvbHlnb25zPU9wZW5MYXllcnMuU3RyaW5nLnRy aW0oc3RyKS5zcGxpdCh0aGlzLnJlZ0V4ZXMuZG91YmxlUGFyZW5Db21tYSk7dmFy IGNvbXBvbmVudHM9W107Zm9yKHZhciBpPTAsbGVuPXBvbHlnb25zLmxlbmd0aDtp PGxlbjsrK2kpe3BvbHlnb249cG9seWdvbnNbaV0ucmVwbGFjZSh0aGlzLnJlZ0V4 ZXMudHJpbVBhcmVucywnJDEnKTtjb21wb25lbnRzLnB1c2godGhpcy5wYXJzZS5w b2x5Z29uLmFwcGx5KHRoaXMsW3BvbHlnb25dKS5nZW9tZXRyeSk7fQpyZXR1cm4g bmV3IE9wZW5MYXllcnMuRmVhdHVyZS5WZWN0b3IobmV3IE9wZW5MYXllcnMuR2Vv bWV0cnkuTXVsdGlQb2x5Z29uKGNvbXBvbmVudHMpKTt9LCdnZW9tZXRyeWNvbGxl Y3Rpb24nOmZ1bmN0aW9uKHN0cil7c3RyPXN0ci5yZXBsYWNlKC8sXHMqKFtBLVph LXpdKS9nLCd8JDEnKTt2YXIgd2t0QXJyYXk9T3BlbkxheWVycy5TdHJpbmcudHJp bShzdHIpLnNwbGl0KCd8Jyk7dmFyIGNvbXBvbmVudHM9W107Zm9yKHZhciBpPTAs bGVuPXdrdEFycmF5Lmxlbmd0aDtpPGxlbjsrK2kpe2NvbXBvbmVudHMucHVzaChP cGVuTGF5ZXJzLkZvcm1hdC5XS1QucHJvdG90eXBlLnJlYWQuYXBwbHkodGhpcyxb d2t0QXJyYXlbaV1dKSk7fQpyZXR1cm4gY29tcG9uZW50czt9fSxDTEFTU19OQU1F OiJPcGVuTGF5ZXJzLkZvcm1hdC5XS1QifSk7T3BlbkxheWVycy5Qcm90b2NvbC5T UUwuR2VhcnM9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLlByb3RvY29sLlNR TCx7RklEX1BSRUZJWDonX19nZWFyc19maWRfXycsTlVMTF9HRU9NRVRSWTonX19n ZWFyc19udWxsX2dlb21ldHJ5X18nLE5VTExfRkVBVFVSRV9TVEFURTonX19nZWFy c19udWxsX2ZlYXR1cmVfc3RhdGVfXycsanNvblBhcnNlcjpudWxsLHdrdFBhcnNl cjpudWxsLGZpZFJlZ0V4cDpudWxsLHNhdmVGZWF0dXJlU3RhdGU6dHJ1ZSx0eXBl T2ZGaWQ6InN0cmluZyIsZGI6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKG9wdGlv bnMpe2lmKCF0aGlzLnN1cHBvcnRlZCgpKXtyZXR1cm47fQpPcGVuTGF5ZXJzLlBy b3RvY29sLlNRTC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRp b25zXSk7dGhpcy5qc29uUGFyc2VyPW5ldyBPcGVuTGF5ZXJzLkZvcm1hdC5KU09O KCk7dGhpcy53a3RQYXJzZXI9bmV3IE9wZW5MYXllcnMuRm9ybWF0LldLVCgpO3Ro aXMuZmlkUmVnRXhwPW5ldyBSZWdFeHAoJ14nK3RoaXMuRklEX1BSRUZJWCk7dGhp cy5pbml0aWFsaXplRGF0YWJhc2UoKTt9LGluaXRpYWxpemVEYXRhYmFzZTpmdW5j dGlvbigpe3RoaXMuZGI9Z29vZ2xlLmdlYXJzLmZhY3RvcnkuY3JlYXRlKCdiZXRh LmRhdGFiYXNlJyk7dGhpcy5kYi5vcGVuKHRoaXMuZGF0YWJhc2VOYW1lKTt0aGlz LmRiLmV4ZWN1dGUoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICIrdGhpcy50 YWJsZU5hbWUrIiAoZmlkIFRFWFQgVU5JUVVFLCBnZW9tZXRyeSBURVhULCBwcm9w ZXJ0aWVzIFRFWFQsIisiICBzdGF0ZSBURVhUKSIpO30sZGVzdHJveTpmdW5jdGlv bigpe3RoaXMuZGIuY2xvc2UoKTt0aGlzLmRiPW51bGw7dGhpcy5qc29uUGFyc2Vy PW51bGw7dGhpcy53a3RQYXJzZXI9bnVsbDtPcGVuTGF5ZXJzLlByb3RvY29sLlNR TC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzKTt9LHN1cHBvcnRlZDpmdW5j dGlvbigpe3JldHVybiEhKHdpbmRvdy5nb29nbGUmJmdvb2dsZS5nZWFycyk7fSxy ZWFkOmZ1bmN0aW9uKG9wdGlvbnMpe09wZW5MYXllcnMuUHJvdG9jb2wucHJvdG90 eXBlLnJlYWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO29wdGlvbnM9T3BlbkxheWVy cy5VdGlsLmFwcGx5RGVmYXVsdHMob3B0aW9ucyx0aGlzLm9wdGlvbnMpO3ZhciBm ZWF0dXJlLGZlYXR1cmVzPVtdO3ZhciBycz10aGlzLmRiLmV4ZWN1dGUoIlNFTEVD VCAqIEZST00gIit0aGlzLnRhYmxlTmFtZSk7d2hpbGUocnMuaXNWYWxpZFJvdygp KXtmZWF0dXJlPXRoaXMudW5mcmVlemVGZWF0dXJlKHJzKTtpZih0aGlzLmV2YWx1 YXRlRmlsdGVyKGZlYXR1cmUsb3B0aW9ucy5maWx0ZXIpKXtpZighb3B0aW9ucy5u b0ZlYXR1cmVTdGF0ZVJlc2V0KXtmZWF0dXJlLnN0YXRlPW51bGw7fQpmZWF0dXJl cy5wdXNoKGZlYXR1cmUpO30KcnMubmV4dCgpO30KcnMuY2xvc2UoKTt2YXIgcmVz cD1uZXcgT3BlbkxheWVycy5Qcm90b2NvbC5SZXNwb25zZSh7Y29kZTpPcGVuTGF5 ZXJzLlByb3RvY29sLlJlc3BvbnNlLlNVQ0NFU1MscmVxdWVzdFR5cGU6InJlYWQi LGZlYXR1cmVzOmZlYXR1cmVzfSk7aWYob3B0aW9ucyYmb3B0aW9ucy5jYWxsYmFj ayl7b3B0aW9ucy5jYWxsYmFjay5jYWxsKG9wdGlvbnMuc2NvcGUscmVzcCk7fQpy ZXR1cm4gcmVzcDt9LHVuZnJlZXplRmVhdHVyZTpmdW5jdGlvbihyb3cpe3ZhciBm ZWF0dXJlO3ZhciB3a3Q9cm93LmZpZWxkQnlOYW1lKCdnZW9tZXRyeScpO2lmKHdr dD09dGhpcy5OVUxMX0dFT01FVFJZKXtmZWF0dXJlPW5ldyBPcGVuTGF5ZXJzLkZl YXR1cmUuVmVjdG9yKCk7fWVsc2V7ZmVhdHVyZT10aGlzLndrdFBhcnNlci5yZWFk KHdrdCk7fQpmZWF0dXJlLmF0dHJpYnV0ZXM9dGhpcy5qc29uUGFyc2VyLnJlYWQo cm93LmZpZWxkQnlOYW1lKCdwcm9wZXJ0aWVzJykpO2ZlYXR1cmUuZmlkPXRoaXMu ZXh0cmFjdEZpZEZyb21GaWVsZChyb3cuZmllbGRCeU5hbWUoJ2ZpZCcpKTt2YXIg c3RhdGU9cm93LmZpZWxkQnlOYW1lKCdzdGF0ZScpO2lmKHN0YXRlPT10aGlzLk5V TExfRkVBVFVSRV9TVEFURSl7c3RhdGU9bnVsbDt9CmZlYXR1cmUuc3RhdGU9c3Rh dGU7cmV0dXJuIGZlYXR1cmU7fSxleHRyYWN0RmlkRnJvbUZpZWxkOmZ1bmN0aW9u KGZpZWxkKXtpZighZmllbGQubWF0Y2godGhpcy5maWRSZWdFeHApJiZ0aGlzLnR5 cGVPZkZpZD09Im51bWJlciIpe2ZpZWxkPXBhcnNlRmxvYXQoZmllbGQpO30KcmV0 dXJuIGZpZWxkO30sY3JlYXRlOmZ1bmN0aW9uKGZlYXR1cmVzLG9wdGlvbnMpe29w dGlvbnM9T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMob3B0aW9ucyx0aGlz Lm9wdGlvbnMpO3ZhciByZXNwPXRoaXMuY3JlYXRlT3JVcGRhdGUoZmVhdHVyZXMp O3Jlc3AucmVxdWVzdFR5cGU9ImNyZWF0ZSI7aWYob3B0aW9ucyYmb3B0aW9ucy5j YWxsYmFjayl7b3B0aW9ucy5jYWxsYmFjay5jYWxsKG9wdGlvbnMuc2NvcGUscmVz cCk7fQpyZXR1cm4gcmVzcDt9LHVwZGF0ZTpmdW5jdGlvbihmZWF0dXJlcyxvcHRp b25zKXtvcHRpb25zPU9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKG9wdGlv bnMsdGhpcy5vcHRpb25zKTt2YXIgcmVzcD10aGlzLmNyZWF0ZU9yVXBkYXRlKGZl YXR1cmVzKTtyZXNwLnJlcXVlc3RUeXBlPSJ1cGRhdGUiO2lmKG9wdGlvbnMmJm9w dGlvbnMuY2FsbGJhY2spe29wdGlvbnMuY2FsbGJhY2suY2FsbChvcHRpb25zLnNj b3BlLHJlc3ApO30KcmV0dXJuIHJlc3A7fSxjcmVhdGVPclVwZGF0ZTpmdW5jdGlv bihmZWF0dXJlcyl7aWYoIShPcGVuTGF5ZXJzLlV0aWwuaXNBcnJheShmZWF0dXJl cykpKXtmZWF0dXJlcz1bZmVhdHVyZXNdO30KdmFyIGksbGVuPWZlYXR1cmVzLmxl bmd0aCxmZWF0dXJlO3ZhciBpbnNlcnRlZEZlYXR1cmVzPW5ldyBBcnJheShsZW4p O2ZvcihpPTA7aTxsZW47aSsrKXtmZWF0dXJlPWZlYXR1cmVzW2ldO3ZhciBwYXJh bXM9dGhpcy5mcmVlemVGZWF0dXJlKGZlYXR1cmUpO3RoaXMuZGIuZXhlY3V0ZSgi UkVQTEFDRSBJTlRPICIrdGhpcy50YWJsZU5hbWUrIiAoZmlkLCBnZW9tZXRyeSwg cHJvcGVydGllcywgc3RhdGUpIisiIFZBTFVFUyAoPywgPywgPywgPykiLHBhcmFt cyk7dmFyIGNsb25lPWZlYXR1cmUuY2xvbmUoKTtjbG9uZS5maWQ9dGhpcy5leHRy YWN0RmlkRnJvbUZpZWxkKHBhcmFtc1swXSk7aW5zZXJ0ZWRGZWF0dXJlc1tpXT1j bG9uZTt9CnJldHVybiBuZXcgT3BlbkxheWVycy5Qcm90b2NvbC5SZXNwb25zZSh7 Y29kZTpPcGVuTGF5ZXJzLlByb3RvY29sLlJlc3BvbnNlLlNVQ0NFU1MsZmVhdHVy ZXM6aW5zZXJ0ZWRGZWF0dXJlcyxyZXFGZWF0dXJlczpmZWF0dXJlc30pO30sZnJl ZXplRmVhdHVyZTpmdW5jdGlvbihmZWF0dXJlKXtmZWF0dXJlLmZpZD1mZWF0dXJl LmZpZCE9bnVsbD8iIitmZWF0dXJlLmZpZDpPcGVuTGF5ZXJzLlV0aWwuY3JlYXRl VW5pcXVlSUQodGhpcy5GSURfUFJFRklYKTt2YXIgZ2VvbWV0cnk9ZmVhdHVyZS5n ZW9tZXRyeSE9bnVsbD9mZWF0dXJlLmdlb21ldHJ5LnRvU3RyaW5nKCk6dGhpcy5O VUxMX0dFT01FVFJZO3ZhciBwcm9wZXJ0aWVzPXRoaXMuanNvblBhcnNlci53cml0 ZShmZWF0dXJlLmF0dHJpYnV0ZXMpO3ZhciBzdGF0ZT10aGlzLmdldEZlYXR1cmVT dGF0ZUZvckZyZWV6ZShmZWF0dXJlKTtyZXR1cm5bZmVhdHVyZS5maWQsZ2VvbWV0 cnkscHJvcGVydGllcyxzdGF0ZV07fSxnZXRGZWF0dXJlU3RhdGVGb3JGcmVlemU6 ZnVuY3Rpb24oZmVhdHVyZSl7dmFyIHN0YXRlO2lmKCF0aGlzLnNhdmVGZWF0dXJl U3RhdGUpe3N0YXRlPXRoaXMuTlVMTF9GRUFUVVJFX1NUQVRFO31lbHNlIGlmKHRo aXMuY3JlYXRlZE9mZmxpbmUoZmVhdHVyZSkpe3N0YXRlPU9wZW5MYXllcnMuU3Rh dGUuSU5TRVJUO31lbHNle3N0YXRlPWZlYXR1cmUuc3RhdGU7fQpyZXR1cm4gc3Rh dGU7fSwiZGVsZXRlIjpmdW5jdGlvbihmZWF0dXJlcyxvcHRpb25zKXtpZighKE9w ZW5MYXllcnMuVXRpbC5pc0FycmF5KGZlYXR1cmVzKSkpe2ZlYXR1cmVzPVtmZWF0 dXJlc107fQpvcHRpb25zPU9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKG9w dGlvbnMsdGhpcy5vcHRpb25zKTt2YXIgaSxsZW4sZmVhdHVyZTtmb3IoaT0wLGxl bj1mZWF0dXJlcy5sZW5ndGg7aTxsZW47aSsrKXtmZWF0dXJlPWZlYXR1cmVzW2ld O2lmKHRoaXMuc2F2ZUZlYXR1cmVTdGF0ZSYmIXRoaXMuY3JlYXRlZE9mZmxpbmUo ZmVhdHVyZSkpe3ZhciB0b0RlbGV0ZT1mZWF0dXJlLmNsb25lKCk7dG9EZWxldGUu ZmlkPWZlYXR1cmUuZmlkO2lmKHRvRGVsZXRlLmdlb21ldHJ5KXt0b0RlbGV0ZS5n ZW9tZXRyeS5kZXN0cm95KCk7dG9EZWxldGUuZ2VvbWV0cnk9bnVsbDt9CnRvRGVs ZXRlLnN0YXRlPWZlYXR1cmUuc3RhdGU7dGhpcy5jcmVhdGVPclVwZGF0ZSh0b0Rl bGV0ZSk7fWVsc2V7dGhpcy5kYi5leGVjdXRlKCJERUxFVEUgRlJPTSAiK3RoaXMu dGFibGVOYW1lKyIgV0hFUkUgZmlkID0gPyIsW2ZlYXR1cmUuZmlkXSk7fX0KdmFy IHJlc3A9bmV3IE9wZW5MYXllcnMuUHJvdG9jb2wuUmVzcG9uc2Uoe2NvZGU6T3Bl bkxheWVycy5Qcm90b2NvbC5SZXNwb25zZS5TVUNDRVNTLHJlcXVlc3RUeXBlOiJk ZWxldGUiLHJlcUZlYXR1cmVzOmZlYXR1cmVzfSk7aWYob3B0aW9ucyYmb3B0aW9u cy5jYWxsYmFjayl7b3B0aW9ucy5jYWxsYmFjay5jYWxsKG9wdGlvbnMuc2NvcGUs cmVzcCk7fQpyZXR1cm4gcmVzcDt9LGNyZWF0ZWRPZmZsaW5lOmZ1bmN0aW9uKGZl YXR1cmUpe3JldHVybih0eXBlb2YgZmVhdHVyZS5maWQ9PSJzdHJpbmciJiYhIShm ZWF0dXJlLmZpZC5tYXRjaCh0aGlzLmZpZFJlZ0V4cCkpKTt9LGNvbW1pdDpmdW5j dGlvbihmZWF0dXJlcyxvcHRpb25zKXt2YXIgb3B0LHJlc3A9W10sblJlcXVlc3Rz PTAsblJlc3BvbnNlcz0wO2Z1bmN0aW9uIGNhbGxiYWNrKHJlc3Ape2lmKCsrblJl c3BvbnNlczxuUmVxdWVzdHMpe3Jlc3AubGFzdD1mYWxzZTt9CnRoaXMuY2FsbFVz ZXJDYWxsYmFjayhvcHRpb25zLHJlc3ApO30KdmFyIGZlYXR1cmUsdG9DcmVhdGU9 W10sdG9VcGRhdGU9W10sdG9EZWxldGU9W107Zm9yKHZhciBpPWZlYXR1cmVzLmxl bmd0aC0xO2k+PTA7aS0tKXtmZWF0dXJlPWZlYXR1cmVzW2ldO3N3aXRjaChmZWF0 dXJlLnN0YXRlKXtjYXNlIE9wZW5MYXllcnMuU3RhdGUuSU5TRVJUOnRvQ3JlYXRl LnB1c2goZmVhdHVyZSk7YnJlYWs7Y2FzZSBPcGVuTGF5ZXJzLlN0YXRlLlVQREFU RTp0b1VwZGF0ZS5wdXNoKGZlYXR1cmUpO2JyZWFrO2Nhc2UgT3BlbkxheWVycy5T dGF0ZS5ERUxFVEU6dG9EZWxldGUucHVzaChmZWF0dXJlKTticmVhazt9fQppZih0 b0NyZWF0ZS5sZW5ndGg+MCl7blJlcXVlc3RzKys7b3B0PU9wZW5MYXllcnMuVXRp bC5hcHBseURlZmF1bHRzKHsiY2FsbGJhY2siOmNhbGxiYWNrLCJzY29wZSI6dGhp c30sb3B0aW9ucy5jcmVhdGUpO3Jlc3AucHVzaCh0aGlzLmNyZWF0ZSh0b0NyZWF0 ZSxvcHQpKTt9CmlmKHRvVXBkYXRlLmxlbmd0aD4wKXtuUmVxdWVzdHMrKztvcHQ9 T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMoeyJjYWxsYmFjayI6Y2FsbGJh Y2ssInNjb3BlIjp0aGlzfSxvcHRpb25zLnVwZGF0ZSk7cmVzcC5wdXNoKHRoaXMu dXBkYXRlKHRvVXBkYXRlLG9wdCkpO30KaWYodG9EZWxldGUubGVuZ3RoPjApe25S ZXF1ZXN0cysrO29wdD1PcGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyh7ImNh bGxiYWNrIjpjYWxsYmFjaywic2NvcGUiOnRoaXN9LG9wdGlvbnNbImRlbGV0ZSJd KTtyZXNwLnB1c2godGhpc1siZGVsZXRlIl0odG9EZWxldGUsb3B0KSk7fQpyZXR1 cm4gcmVzcDt9LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5kYi5leGVjdXRlKCJERUxF VEUgRlJPTSAiK3RoaXMudGFibGVOYW1lKTt9LGNhbGxVc2VyQ2FsbGJhY2s6ZnVu Y3Rpb24ob3B0aW9ucyxyZXNwKXt2YXIgb3B0PW9wdGlvbnNbcmVzcC5yZXF1ZXN0 VHlwZV07aWYob3B0JiZvcHQuY2FsbGJhY2spe29wdC5jYWxsYmFjay5jYWxsKG9w dC5zY29wZSxyZXNwKTt9CmlmKHJlc3AubGFzdCYmb3B0aW9ucy5jYWxsYmFjayl7 b3B0aW9ucy5jYWxsYmFjay5jYWxsKG9wdGlvbnMuc2NvcGUpO319LENMQVNTX05B TUU6Ik9wZW5MYXllcnMuUHJvdG9jb2wuU1FMLkdlYXJzIn0pO09wZW5MYXllcnMu RXZlbnQ9e29ic2VydmVyczpmYWxzZSxLRVlfQkFDS1NQQUNFOjgsS0VZX1RBQjo5 LEtFWV9SRVRVUk46MTMsS0VZX0VTQzoyNyxLRVlfTEVGVDozNyxLRVlfVVA6Mzgs S0VZX1JJR0hUOjM5LEtFWV9ET1dOOjQwLEtFWV9ERUxFVEU6NDYsZWxlbWVudDpm dW5jdGlvbihldmVudCl7cmV0dXJuIGV2ZW50LnRhcmdldHx8ZXZlbnQuc3JjRWxl bWVudDt9LGlzU2luZ2xlVG91Y2g6ZnVuY3Rpb24oZXZlbnQpe3JldHVybiBldmVu dC50b3VjaGVzJiZldmVudC50b3VjaGVzLmxlbmd0aD09MTt9LGlzTXVsdGlUb3Vj aDpmdW5jdGlvbihldmVudCl7cmV0dXJuIGV2ZW50LnRvdWNoZXMmJmV2ZW50LnRv dWNoZXMubGVuZ3RoPjE7fSxpc0xlZnRDbGljazpmdW5jdGlvbihldmVudCl7cmV0 dXJuKCgoZXZlbnQud2hpY2gpJiYoZXZlbnQud2hpY2g9PTEpKXx8KChldmVudC5i dXR0b24pJiYoZXZlbnQuYnV0dG9uPT0xKSkpO30saXNSaWdodENsaWNrOmZ1bmN0 aW9uKGV2ZW50KXtyZXR1cm4oKChldmVudC53aGljaCkmJihldmVudC53aGljaD09 MykpfHwoKGV2ZW50LmJ1dHRvbikmJihldmVudC5idXR0b249PTIpKSk7fSxzdG9w OmZ1bmN0aW9uKGV2ZW50LGFsbG93RGVmYXVsdCl7aWYoIWFsbG93RGVmYXVsdCl7 aWYoZXZlbnQucHJldmVudERlZmF1bHQpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7 fWVsc2V7ZXZlbnQucmV0dXJuVmFsdWU9ZmFsc2U7fX0KaWYoZXZlbnQuc3RvcFBy b3BhZ2F0aW9uKXtldmVudC5zdG9wUHJvcGFnYXRpb24oKTt9ZWxzZXtldmVudC5j YW5jZWxCdWJibGU9dHJ1ZTt9fSxmaW5kRWxlbWVudDpmdW5jdGlvbihldmVudCx0 YWdOYW1lKXt2YXIgZWxlbWVudD1PcGVuTGF5ZXJzLkV2ZW50LmVsZW1lbnQoZXZl bnQpO3doaWxlKGVsZW1lbnQucGFyZW50Tm9kZSYmKCFlbGVtZW50LnRhZ05hbWV8 fChlbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKSE9dGFnTmFtZS50b1VwcGVy Q2FzZSgpKSkpe2VsZW1lbnQ9ZWxlbWVudC5wYXJlbnROb2RlO30KcmV0dXJuIGVs ZW1lbnQ7fSxvYnNlcnZlOmZ1bmN0aW9uKGVsZW1lbnRQYXJhbSxuYW1lLG9ic2Vy dmVyLHVzZUNhcHR1cmUpe3ZhciBlbGVtZW50PU9wZW5MYXllcnMuVXRpbC5nZXRF bGVtZW50KGVsZW1lbnRQYXJhbSk7dXNlQ2FwdHVyZT11c2VDYXB0dXJlfHxmYWxz ZTtpZihuYW1lPT0na2V5cHJlc3MnJiYobmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0 Y2goL0tvbnF1ZXJvcnxTYWZhcml8S0hUTUwvKXx8ZWxlbWVudC5hdHRhY2hFdmVu dCkpe25hbWU9J2tleWRvd24nO30KaWYoIXRoaXMub2JzZXJ2ZXJzKXt0aGlzLm9i c2VydmVycz17fTt9CmlmKCFlbGVtZW50Ll9ldmVudENhY2hlSUQpe3ZhciBpZFBy ZWZpeD0iZXZlbnRDYWNoZUlEXyI7aWYoZWxlbWVudC5pZCl7aWRQcmVmaXg9ZWxl bWVudC5pZCsiXyIraWRQcmVmaXg7fQplbGVtZW50Ll9ldmVudENhY2hlSUQ9T3Bl bkxheWVycy5VdGlsLmNyZWF0ZVVuaXF1ZUlEKGlkUHJlZml4KTt9CnZhciBjYWNo ZUlEPWVsZW1lbnQuX2V2ZW50Q2FjaGVJRDtpZighdGhpcy5vYnNlcnZlcnNbY2Fj aGVJRF0pe3RoaXMub2JzZXJ2ZXJzW2NhY2hlSURdPVtdO30KdGhpcy5vYnNlcnZl cnNbY2FjaGVJRF0ucHVzaCh7J2VsZW1lbnQnOmVsZW1lbnQsJ25hbWUnOm5hbWUs J29ic2VydmVyJzpvYnNlcnZlciwndXNlQ2FwdHVyZSc6dXNlQ2FwdHVyZX0pO2lm KGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcil7ZWxlbWVudC5hZGRFdmVudExpc3Rl bmVyKG5hbWUsb2JzZXJ2ZXIsdXNlQ2FwdHVyZSk7fWVsc2UgaWYoZWxlbWVudC5h dHRhY2hFdmVudCl7ZWxlbWVudC5hdHRhY2hFdmVudCgnb24nK25hbWUsb2JzZXJ2 ZXIpO319LHN0b3BPYnNlcnZpbmdFbGVtZW50OmZ1bmN0aW9uKGVsZW1lbnRQYXJh bSl7dmFyIGVsZW1lbnQ9T3BlbkxheWVycy5VdGlsLmdldEVsZW1lbnQoZWxlbWVu dFBhcmFtKTt2YXIgY2FjaGVJRD1lbGVtZW50Ll9ldmVudENhY2hlSUQ7dGhpcy5f cmVtb3ZlRWxlbWVudE9ic2VydmVycyhPcGVuTGF5ZXJzLkV2ZW50Lm9ic2VydmVy c1tjYWNoZUlEXSk7fSxfcmVtb3ZlRWxlbWVudE9ic2VydmVyczpmdW5jdGlvbihl bGVtZW50T2JzZXJ2ZXJzKXtpZihlbGVtZW50T2JzZXJ2ZXJzKXtmb3IodmFyIGk9 ZWxlbWVudE9ic2VydmVycy5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGVudHJ5PWVs ZW1lbnRPYnNlcnZlcnNbaV07dmFyIGFyZ3M9bmV3IEFycmF5KGVudHJ5LmVsZW1l bnQsZW50cnkubmFtZSxlbnRyeS5vYnNlcnZlcixlbnRyeS51c2VDYXB0dXJlKTt2 YXIgcmVtb3ZlZD1PcGVuTGF5ZXJzLkV2ZW50LnN0b3BPYnNlcnZpbmcuYXBwbHko dGhpcyxhcmdzKTt9fX0sc3RvcE9ic2VydmluZzpmdW5jdGlvbihlbGVtZW50UGFy YW0sbmFtZSxvYnNlcnZlcix1c2VDYXB0dXJlKXt1c2VDYXB0dXJlPXVzZUNhcHR1 cmV8fGZhbHNlO3ZhciBlbGVtZW50PU9wZW5MYXllcnMuVXRpbC5nZXRFbGVtZW50 KGVsZW1lbnRQYXJhbSk7dmFyIGNhY2hlSUQ9ZWxlbWVudC5fZXZlbnRDYWNoZUlE O2lmKG5hbWU9PSdrZXlwcmVzcycpe2lmKG5hdmlnYXRvci5hcHBWZXJzaW9uLm1h dGNoKC9Lb25xdWVyb3J8U2FmYXJpfEtIVE1MLyl8fGVsZW1lbnQuZGV0YWNoRXZl bnQpe25hbWU9J2tleWRvd24nO319CnZhciBmb3VuZEVudHJ5PWZhbHNlO3ZhciBl bGVtZW50T2JzZXJ2ZXJzPU9wZW5MYXllcnMuRXZlbnQub2JzZXJ2ZXJzW2NhY2hl SURdO2lmKGVsZW1lbnRPYnNlcnZlcnMpe3ZhciBpPTA7d2hpbGUoIWZvdW5kRW50 cnkmJmk8ZWxlbWVudE9ic2VydmVycy5sZW5ndGgpe3ZhciBjYWNoZUVudHJ5PWVs ZW1lbnRPYnNlcnZlcnNbaV07aWYoKGNhY2hlRW50cnkubmFtZT09bmFtZSkmJihj YWNoZUVudHJ5Lm9ic2VydmVyPT1vYnNlcnZlcikmJihjYWNoZUVudHJ5LnVzZUNh cHR1cmU9PXVzZUNhcHR1cmUpKXtlbGVtZW50T2JzZXJ2ZXJzLnNwbGljZShpLDEp O2lmKGVsZW1lbnRPYnNlcnZlcnMubGVuZ3RoPT0wKXtkZWxldGUgT3BlbkxheWVy cy5FdmVudC5vYnNlcnZlcnNbY2FjaGVJRF07fQpmb3VuZEVudHJ5PXRydWU7YnJl YWs7fQppKys7fX0KaWYoZm91bmRFbnRyeSl7aWYoZWxlbWVudC5yZW1vdmVFdmVu dExpc3RlbmVyKXtlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSxvYnNl cnZlcix1c2VDYXB0dXJlKTt9ZWxzZSBpZihlbGVtZW50JiZlbGVtZW50LmRldGFj aEV2ZW50KXtlbGVtZW50LmRldGFjaEV2ZW50KCdvbicrbmFtZSxvYnNlcnZlcik7 fX0KcmV0dXJuIGZvdW5kRW50cnk7fSx1bmxvYWRDYWNoZTpmdW5jdGlvbigpe2lm KE9wZW5MYXllcnMuRXZlbnQmJk9wZW5MYXllcnMuRXZlbnQub2JzZXJ2ZXJzKXtm b3IodmFyIGNhY2hlSUQgaW4gT3BlbkxheWVycy5FdmVudC5vYnNlcnZlcnMpe3Zh ciBlbGVtZW50T2JzZXJ2ZXJzPU9wZW5MYXllcnMuRXZlbnQub2JzZXJ2ZXJzW2Nh Y2hlSURdO09wZW5MYXllcnMuRXZlbnQuX3JlbW92ZUVsZW1lbnRPYnNlcnZlcnMu YXBwbHkodGhpcyxbZWxlbWVudE9ic2VydmVyc10pO30KT3BlbkxheWVycy5FdmVu dC5vYnNlcnZlcnM9ZmFsc2U7fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5FdmVu dCJ9O09wZW5MYXllcnMuRXZlbnQub2JzZXJ2ZSh3aW5kb3csJ3VubG9hZCcsT3Bl bkxheWVycy5FdmVudC51bmxvYWRDYWNoZSxmYWxzZSk7aWYod2luZG93LkV2ZW50 KXtPcGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyh3aW5kb3cuRXZlbnQsT3Bl bkxheWVycy5FdmVudCk7fWVsc2V7dmFyIEV2ZW50PU9wZW5MYXllcnMuRXZlbnQ7 fQpPcGVuTGF5ZXJzLkV2ZW50cz1PcGVuTGF5ZXJzLkNsYXNzKHtCUk9XU0VSX0VW RU5UUzpbIm1vdXNlb3ZlciIsIm1vdXNlb3V0IiwibW91c2Vkb3duIiwibW91c2V1 cCIsIm1vdXNlbW92ZSIsImNsaWNrIiwiZGJsY2xpY2siLCJyaWdodGNsaWNrIiwi ZGJscmlnaHRjbGljayIsInJlc2l6ZSIsImZvY3VzIiwiYmx1ciIsInRvdWNoc3Rh cnQiLCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCJdLGxpc3RlbmVyczpudWxsLG9iamVj dDpudWxsLGVsZW1lbnQ6bnVsbCxldmVudFR5cGVzOm51bGwsZXZlbnRIYW5kbGVy Om51bGwsZmFsbFRocm91Z2g6bnVsbCxpbmNsdWRlWFk6ZmFsc2UsY2xlYXJNb3Vz ZUxpc3RlbmVyOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihvYmplY3QsZWxlbWVu dCxldmVudFR5cGVzLGZhbGxUaHJvdWdoLG9wdGlvbnMpe09wZW5MYXllcnMuVXRp bC5leHRlbmQodGhpcyxvcHRpb25zKTt0aGlzLm9iamVjdD1vYmplY3Q7dGhpcy5m YWxsVGhyb3VnaD1mYWxsVGhyb3VnaDt0aGlzLmxpc3RlbmVycz17fTt0aGlzLmV2 ZW50SGFuZGxlcj1PcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmRBc0V2ZW50TGlzdGVu ZXIodGhpcy5oYW5kbGVCcm93c2VyRXZlbnQsdGhpcyk7dGhpcy5jbGVhck1vdXNl TGlzdGVuZXI9T3BlbkxheWVycy5GdW5jdGlvbi5iaW5kKHRoaXMuY2xlYXJNb3Vz ZUNhY2hlLHRoaXMpO3RoaXMuZXZlbnRUeXBlcz1bXTtpZihldmVudFR5cGVzIT1u dWxsKXtmb3IodmFyIGk9MCxsZW49ZXZlbnRUeXBlcy5sZW5ndGg7aTxsZW47aSsr KXt0aGlzLmFkZEV2ZW50VHlwZShldmVudFR5cGVzW2ldKTt9fQppZihlbGVtZW50 IT1udWxsKXt0aGlzLmF0dGFjaFRvRWxlbWVudChlbGVtZW50KTt9fSxkZXN0cm95 OmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtZW50KXtPcGVuTGF5ZXJzLkV2ZW50LnN0 b3BPYnNlcnZpbmdFbGVtZW50KHRoaXMuZWxlbWVudCk7aWYodGhpcy5lbGVtZW50 Lmhhc1Njcm9sbEV2ZW50KXtPcGVuTGF5ZXJzLkV2ZW50LnN0b3BPYnNlcnZpbmco d2luZG93LCJzY3JvbGwiLHRoaXMuY2xlYXJNb3VzZUxpc3RlbmVyKTt9fQp0aGlz LmVsZW1lbnQ9bnVsbDt0aGlzLmxpc3RlbmVycz1udWxsO3RoaXMub2JqZWN0PW51 bGw7dGhpcy5ldmVudFR5cGVzPW51bGw7dGhpcy5mYWxsVGhyb3VnaD1udWxsO3Ro aXMuZXZlbnRIYW5kbGVyPW51bGw7fSxhZGRFdmVudFR5cGU6ZnVuY3Rpb24oZXZl bnROYW1lKXtpZighdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXSl7dGhpcy5ldmVu dFR5cGVzLnB1c2goZXZlbnROYW1lKTt0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVd PVtdO319LGF0dGFjaFRvRWxlbWVudDpmdW5jdGlvbihlbGVtZW50KXtpZih0aGlz LmVsZW1lbnQpe09wZW5MYXllcnMuRXZlbnQuc3RvcE9ic2VydmluZ0VsZW1lbnQo dGhpcy5lbGVtZW50KTt9CnRoaXMuZWxlbWVudD1lbGVtZW50O2Zvcih2YXIgaT0w LGxlbj10aGlzLkJST1dTRVJfRVZFTlRTLmxlbmd0aDtpPGxlbjtpKyspe3ZhciBl dmVudFR5cGU9dGhpcy5CUk9XU0VSX0VWRU5UU1tpXTt0aGlzLmFkZEV2ZW50VHlw ZShldmVudFR5cGUpO09wZW5MYXllcnMuRXZlbnQub2JzZXJ2ZShlbGVtZW50LGV2 ZW50VHlwZSx0aGlzLmV2ZW50SGFuZGxlcik7fQpPcGVuTGF5ZXJzLkV2ZW50Lm9i c2VydmUoZWxlbWVudCwiZHJhZ3N0YXJ0IixPcGVuTGF5ZXJzLkV2ZW50LnN0b3Ap O30sb246ZnVuY3Rpb24ob2JqZWN0KXtmb3IodmFyIHR5cGUgaW4gb2JqZWN0KXtp Zih0eXBlIT0ic2NvcGUiKXt0aGlzLnJlZ2lzdGVyKHR5cGUsb2JqZWN0LnNjb3Bl LG9iamVjdFt0eXBlXSk7fX19LHJlZ2lzdGVyOmZ1bmN0aW9uKHR5cGUsb2JqLGZ1 bmMpe2lmKChmdW5jIT1udWxsKSYmKE9wZW5MYXllcnMuVXRpbC5pbmRleE9mKHRo aXMuZXZlbnRUeXBlcyx0eXBlKSE9LTEpKXtpZihvYmo9PW51bGwpe29iaj10aGlz Lm9iamVjdDt9CnZhciBsaXN0ZW5lcnM9dGhpcy5saXN0ZW5lcnNbdHlwZV07bGlz dGVuZXJzLnB1c2goe29iajpvYmosZnVuYzpmdW5jfSk7fX0scmVnaXN0ZXJQcmlv cml0eTpmdW5jdGlvbih0eXBlLG9iaixmdW5jKXtpZihmdW5jIT1udWxsKXtpZihv Ymo9PW51bGwpe29iaj10aGlzLm9iamVjdDt9CnZhciBsaXN0ZW5lcnM9dGhpcy5s aXN0ZW5lcnNbdHlwZV07aWYobGlzdGVuZXJzIT1udWxsKXtsaXN0ZW5lcnMudW5z aGlmdCh7b2JqOm9iaixmdW5jOmZ1bmN9KTt9fX0sdW46ZnVuY3Rpb24ob2JqZWN0 KXtmb3IodmFyIHR5cGUgaW4gb2JqZWN0KXtpZih0eXBlIT0ic2NvcGUiKXt0aGlz LnVucmVnaXN0ZXIodHlwZSxvYmplY3Quc2NvcGUsb2JqZWN0W3R5cGVdKTt9fX0s dW5yZWdpc3RlcjpmdW5jdGlvbih0eXBlLG9iaixmdW5jKXtpZihvYmo9PW51bGwp e29iaj10aGlzLm9iamVjdDt9CnZhciBsaXN0ZW5lcnM9dGhpcy5saXN0ZW5lcnNb dHlwZV07aWYobGlzdGVuZXJzIT1udWxsKXtmb3IodmFyIGk9MCxsZW49bGlzdGVu ZXJzLmxlbmd0aDtpPGxlbjtpKyspe2lmKGxpc3RlbmVyc1tpXS5vYmo9PW9iaiYm bGlzdGVuZXJzW2ldLmZ1bmM9PWZ1bmMpe2xpc3RlbmVycy5zcGxpY2UoaSwxKTti cmVhazt9fX19LHJlbW92ZTpmdW5jdGlvbih0eXBlKXtpZih0aGlzLmxpc3RlbmVy c1t0eXBlXSE9bnVsbCl7dGhpcy5saXN0ZW5lcnNbdHlwZV09W107fX0sdHJpZ2dl ckV2ZW50OmZ1bmN0aW9uKHR5cGUsZXZ0KXt2YXIgbGlzdGVuZXJzPXRoaXMubGlz dGVuZXJzW3R5cGVdO2lmKCFsaXN0ZW5lcnN8fGxpc3RlbmVycy5sZW5ndGg9PTAp e3JldHVybiB1bmRlZmluZWQ7fQppZihldnQ9PW51bGwpe2V2dD17fTt9CmV2dC5v YmplY3Q9dGhpcy5vYmplY3Q7ZXZ0LmVsZW1lbnQ9dGhpcy5lbGVtZW50O2lmKCFl dnQudHlwZSl7ZXZ0LnR5cGU9dHlwZTt9Cmxpc3RlbmVycz1saXN0ZW5lcnMuc2xp Y2UoKTt2YXIgY29udGludWVDaGFpbjtmb3IodmFyIGk9MCxsZW49bGlzdGVuZXJz Lmxlbmd0aDtpPGxlbjtpKyspe3ZhciBjYWxsYmFjaz1saXN0ZW5lcnNbaV07Y29u dGludWVDaGFpbj1jYWxsYmFjay5mdW5jLmFwcGx5KGNhbGxiYWNrLm9iaixbZXZ0 XSk7aWYoKGNvbnRpbnVlQ2hhaW4hPXVuZGVmaW5lZCkmJihjb250aW51ZUNoYWlu PT1mYWxzZSkpe2JyZWFrO319CmlmKCF0aGlzLmZhbGxUaHJvdWdoKXtPcGVuTGF5 ZXJzLkV2ZW50LnN0b3AoZXZ0LHRydWUpO30KcmV0dXJuIGNvbnRpbnVlQ2hhaW47 fSxoYW5kbGVCcm93c2VyRXZlbnQ6ZnVuY3Rpb24oZXZ0KXt2YXIgdHlwZT1ldnQu dHlwZSxsaXN0ZW5lcnM9dGhpcy5saXN0ZW5lcnNbdHlwZV07aWYoIWxpc3RlbmVy c3x8bGlzdGVuZXJzLmxlbmd0aD09MCl7cmV0dXJuO30KdmFyIHRvdWNoZXM9ZXZ0 LnRvdWNoZXM7aWYodG91Y2hlcyYmdG91Y2hlc1swXSl7dmFyIHg9MDt2YXIgeT0w O3ZhciBudW09dG91Y2hlcy5sZW5ndGg7dmFyIHRvdWNoO2Zvcih2YXIgaT0wO2k8 bnVtOysraSl7dG91Y2g9dG91Y2hlc1tpXTt4Kz10b3VjaC5jbGllbnRYO3krPXRv dWNoLmNsaWVudFk7fQpldnQuY2xpZW50WD14L251bTtldnQuY2xpZW50WT15L251 bTt9CmlmKHRoaXMuaW5jbHVkZVhZKXtldnQueHk9dGhpcy5nZXRNb3VzZVBvc2l0 aW9uKGV2dCk7fQp0aGlzLnRyaWdnZXJFdmVudCh0eXBlLGV2dCk7fSxjbGVhck1v dXNlQ2FjaGU6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuc2Nyb2xscz1udWxsO3Ro aXMuZWxlbWVudC5sZWZ0dG9wPW51bGw7dmFyIGJvZHk9ZG9jdW1lbnQuYm9keTtp Zihib2R5JiYhKChib2R5LnNjcm9sbFRvcCE9MHx8Ym9keS5zY3JvbGxMZWZ0IT0w KSYmbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lL2kpKSl7dGhpcy5l bGVtZW50Lm9mZnNldHM9bnVsbDt9fSxnZXRNb3VzZVBvc2l0aW9uOmZ1bmN0aW9u KGV2dCl7aWYoIXRoaXMuaW5jbHVkZVhZKXt0aGlzLmNsZWFyTW91c2VDYWNoZSgp O31lbHNlIGlmKCF0aGlzLmVsZW1lbnQuaGFzU2Nyb2xsRXZlbnQpe09wZW5MYXll cnMuRXZlbnQub2JzZXJ2ZSh3aW5kb3csInNjcm9sbCIsdGhpcy5jbGVhck1vdXNl TGlzdGVuZXIpO3RoaXMuZWxlbWVudC5oYXNTY3JvbGxFdmVudD10cnVlO30KaWYo IXRoaXMuZWxlbWVudC5zY3JvbGxzKXt2YXIgdmlld3BvcnRFbGVtZW50PU9wZW5M YXllcnMuVXRpbC5nZXRWaWV3cG9ydEVsZW1lbnQoKTt0aGlzLmVsZW1lbnQuc2Ny b2xscz1bdmlld3BvcnRFbGVtZW50LnNjcm9sbExlZnQsdmlld3BvcnRFbGVtZW50 LnNjcm9sbFRvcF07fQppZighdGhpcy5lbGVtZW50LmxlZnR0b3Ape3RoaXMuZWxl bWVudC5sZWZ0dG9wPVsoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudExl ZnR8fDApLChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50VG9wfHwwKV07 fQppZighdGhpcy5lbGVtZW50Lm9mZnNldHMpe3RoaXMuZWxlbWVudC5vZmZzZXRz PU9wZW5MYXllcnMuVXRpbC5wYWdlUG9zaXRpb24odGhpcy5lbGVtZW50KTt9CnJl dHVybiBuZXcgT3BlbkxheWVycy5QaXhlbCgoZXZ0LmNsaWVudFgrdGhpcy5lbGVt ZW50LnNjcm9sbHNbMF0pLXRoaXMuZWxlbWVudC5vZmZzZXRzWzBdCi10aGlzLmVs ZW1lbnQubGVmdHRvcFswXSwoZXZ0LmNsaWVudFkrdGhpcy5lbGVtZW50LnNjcm9s bHNbMV0pLXRoaXMuZWxlbWVudC5vZmZzZXRzWzFdCi10aGlzLmVsZW1lbnQubGVm dHRvcFsxXSk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkV2ZW50cyJ9KTtPcGVu TGF5ZXJzLlR3ZWVuPU9wZW5MYXllcnMuQ2xhc3Moe0lOVEVSVkFMOjEwLGVhc2lu ZzpudWxsLGJlZ2luOm51bGwsZmluaXNoOm51bGwsZHVyYXRpb246bnVsbCxjYWxs YmFja3M6bnVsbCx0aW1lOm51bGwsaW50ZXJ2YWw6bnVsbCxwbGF5aW5nOmZhbHNl LGluaXRpYWxpemU6ZnVuY3Rpb24oZWFzaW5nKXt0aGlzLmVhc2luZz0oZWFzaW5n KT9lYXNpbmc6T3BlbkxheWVycy5FYXNpbmcuRXhwby5lYXNlT3V0O30sc3RhcnQ6 ZnVuY3Rpb24oYmVnaW4sZmluaXNoLGR1cmF0aW9uLG9wdGlvbnMpe3RoaXMucGxh eWluZz10cnVlO3RoaXMuYmVnaW49YmVnaW47dGhpcy5maW5pc2g9ZmluaXNoO3Ro aXMuZHVyYXRpb249ZHVyYXRpb247dGhpcy5jYWxsYmFja3M9b3B0aW9ucy5jYWxs YmFja3M7dGhpcy50aW1lPTA7aWYodGhpcy5pbnRlcnZhbCl7d2luZG93LmNsZWFy SW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7dGhpcy5pbnRlcnZhbD1udWxsO30KaWYo dGhpcy5jYWxsYmFja3MmJnRoaXMuY2FsbGJhY2tzLnN0YXJ0KXt0aGlzLmNhbGxi YWNrcy5zdGFydC5jYWxsKHRoaXMsdGhpcy5iZWdpbik7fQp0aGlzLmludGVydmFs PXdpbmRvdy5zZXRJbnRlcnZhbChPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQodGhp cy5wbGF5LHRoaXMpLHRoaXMuSU5URVJWQUwpO30sc3RvcDpmdW5jdGlvbigpe2lm KCF0aGlzLnBsYXlpbmcpe3JldHVybjt9CmlmKHRoaXMuY2FsbGJhY2tzJiZ0aGlz LmNhbGxiYWNrcy5kb25lKXt0aGlzLmNhbGxiYWNrcy5kb25lLmNhbGwodGhpcyx0 aGlzLmZpbmlzaCk7fQp3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFs KTt0aGlzLmludGVydmFsPW51bGw7dGhpcy5wbGF5aW5nPWZhbHNlO30scGxheTpm dW5jdGlvbigpe3ZhciB2YWx1ZT17fTtmb3IodmFyIGkgaW4gdGhpcy5iZWdpbil7 dmFyIGI9dGhpcy5iZWdpbltpXTt2YXIgZj10aGlzLmZpbmlzaFtpXTtpZihiPT1u dWxsfHxmPT1udWxsfHxpc05hTihiKXx8aXNOYU4oZikpe09wZW5MYXllcnMuQ29u c29sZS5lcnJvcignaW52YWxpZCB2YWx1ZSBmb3IgVHdlZW4nKTt9CnZhciBjPWYt Yjt2YWx1ZVtpXT10aGlzLmVhc2luZy5hcHBseSh0aGlzLFt0aGlzLnRpbWUsYixj LHRoaXMuZHVyYXRpb25dKTt9CnRoaXMudGltZSsrO2lmKHRoaXMuY2FsbGJhY2tz JiZ0aGlzLmNhbGxiYWNrcy5lYWNoU3RlcCl7dGhpcy5jYWxsYmFja3MuZWFjaFN0 ZXAuY2FsbCh0aGlzLHZhbHVlKTt9CmlmKHRoaXMudGltZT50aGlzLmR1cmF0aW9u KXt0aGlzLnN0b3AoKTt9fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLlR3ZWVuIn0p O09wZW5MYXllcnMuRWFzaW5nPXtDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkVhc2lu ZyJ9O09wZW5MYXllcnMuRWFzaW5nLkxpbmVhcj17ZWFzZUluOmZ1bmN0aW9uKHQs YixjLGQpe3JldHVybiBjKnQvZCtiO30sZWFzZU91dDpmdW5jdGlvbih0LGIsYyxk KXtyZXR1cm4gYyp0L2QrYjt9LGVhc2VJbk91dDpmdW5jdGlvbih0LGIsYyxkKXty ZXR1cm4gYyp0L2QrYjt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRWFzaW5nLkxp bmVhciJ9O09wZW5MYXllcnMuRWFzaW5nLkV4cG89e2Vhc2VJbjpmdW5jdGlvbih0 LGIsYyxkKXtyZXR1cm4odD09MCk/YjpjKk1hdGgucG93KDIsMTAqKHQvZC0xKSkr Yjt9LGVhc2VPdXQ6ZnVuY3Rpb24odCxiLGMsZCl7cmV0dXJuKHQ9PWQpP2IrYzpj KigtTWF0aC5wb3coMiwtMTAqdC9kKSsxKStiO30sZWFzZUluT3V0OmZ1bmN0aW9u KHQsYixjLGQpe2lmKHQ9PTApcmV0dXJuIGI7aWYodD09ZClyZXR1cm4gYitjO2lm KCh0Lz1kLzIpPDEpcmV0dXJuIGMvMipNYXRoLnBvdygyLDEwKih0LTEpKStiO3Jl dHVybiBjLzIqKC1NYXRoLnBvdygyLC0xMCotLXQpKzIpK2I7fSxDTEFTU19OQU1F OiJPcGVuTGF5ZXJzLkVhc2luZy5FeHBvIn07T3BlbkxheWVycy5FYXNpbmcuUXVh ZD17ZWFzZUluOmZ1bmN0aW9uKHQsYixjLGQpe3JldHVybiBjKih0Lz1kKSp0K2I7 fSxlYXNlT3V0OmZ1bmN0aW9uKHQsYixjLGQpe3JldHVybi1jKih0Lz1kKSoodC0y KStiO30sZWFzZUluT3V0OmZ1bmN0aW9uKHQsYixjLGQpe2lmKCh0Lz1kLzIpPDEp cmV0dXJuIGMvMip0KnQrYjtyZXR1cm4tYy8yKigoLS10KSoodC0yKS0xKStiO30s Q0xBU1NfTkFNRToiT3BlbkxheWVycy5FYXNpbmcuUXVhZCJ9O09wZW5MYXllcnMu TWFwPU9wZW5MYXllcnMuQ2xhc3Moe1pfSU5ERVhfQkFTRTp7QmFzZUxheWVyOjEw MCxPdmVybGF5OjMyNSxGZWF0dXJlOjcyNSxQb3B1cDo3NTAsQ29udHJvbDoxMDAw fSxFVkVOVF9UWVBFUzpbInByZWFkZGxheWVyIiwiYWRkbGF5ZXIiLCJwcmVyZW1v dmVsYXllciIsInJlbW92ZWxheWVyIiwiY2hhbmdlbGF5ZXIiLCJtb3Zlc3RhcnQi LCJtb3ZlIiwibW92ZWVuZCIsInpvb21lbmQiLCJwb3B1cG9wZW4iLCJwb3B1cGNs b3NlIiwiYWRkbWFya2VyIiwicmVtb3ZlbWFya2VyIiwiY2xlYXJtYXJrZXJzIiwi bW91c2VvdmVyIiwibW91c2VvdXQiLCJtb3VzZW1vdmUiLCJkcmFnc3RhcnQiLCJk cmFnIiwiZHJhZ2VuZCIsImNoYW5nZWJhc2VsYXllciJdLGlkOm51bGwsZnJhY3Rp b25hbFpvb206ZmFsc2UsZXZlbnRzOm51bGwsYWxsT3ZlcmxheXM6ZmFsc2UsZGl2 Om51bGwsZHJhZ2dpbmc6ZmFsc2Usc2l6ZTpudWxsLHZpZXdQb3J0RGl2Om51bGws bGF5ZXJDb250YWluZXJPcmlnaW46bnVsbCxsYXllckNvbnRhaW5lckRpdjpudWxs LGxheWVyczpudWxsLGNvbnRyb2xzOm51bGwscG9wdXBzOm51bGwsYmFzZUxheWVy Om51bGwsY2VudGVyOm51bGwscmVzb2x1dGlvbjpudWxsLHpvb206MCxwYW5SYXRp bzoxLjUsdmlld1JlcXVlc3RJRDowLHRpbGVTaXplOm51bGwscHJvamVjdGlvbjoi RVBTRzo0MzI2Iix1bml0czonZGVncmVlcycscmVzb2x1dGlvbnM6bnVsbCxtYXhS ZXNvbHV0aW9uOjEuNDA2MjUsbWluUmVzb2x1dGlvbjpudWxsLG1heFNjYWxlOm51 bGwsbWluU2NhbGU6bnVsbCxtYXhFeHRlbnQ6bnVsbCxtaW5FeHRlbnQ6bnVsbCxy ZXN0cmljdGVkRXh0ZW50Om51bGwsbnVtWm9vbUxldmVsczoxNix0aGVtZTpudWxs LGRpc3BsYXlQcm9qZWN0aW9uOm51bGwsZmFsbFRocm91Z2g6dHJ1ZSxwYW5Ud2Vl bjpudWxsLGV2ZW50TGlzdGVuZXJzOm51bGwscGFuTWV0aG9kOk9wZW5MYXllcnMu RWFzaW5nLkV4cG8uZWFzZU91dCxwYW5EdXJhdGlvbjo1MCxwYWRkaW5nRm9yUG9w dXBzOm51bGwsbWluUHg6bnVsbCxtYXhQeDpudWxsLGluaXRpYWxpemU6ZnVuY3Rp b24oZGl2LG9wdGlvbnMpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0xJiZ0eXBlb2Yg ZGl2PT09Im9iamVjdCIpe29wdGlvbnM9ZGl2O2Rpdj1vcHRpb25zJiZvcHRpb25z LmRpdjt9CnRoaXMudGlsZVNpemU9bmV3IE9wZW5MYXllcnMuU2l6ZShPcGVuTGF5 ZXJzLk1hcC5USUxFX1dJRFRILE9wZW5MYXllcnMuTWFwLlRJTEVfSEVJR0hUKTt0 aGlzLm1heEV4dGVudD1uZXcgT3BlbkxheWVycy5Cb3VuZHMoLTE4MCwtOTAsMTgw LDkwKTt0aGlzLnBhZGRpbmdGb3JQb3B1cHM9bmV3IE9wZW5MYXllcnMuQm91bmRz KDE1LDE1LDE1LDE1KTt0aGlzLnRoZW1lPU9wZW5MYXllcnMuX2dldFNjcmlwdExv Y2F0aW9uKCkrJ3RoZW1lL2RlZmF1bHQvc3R5bGUuY3NzJztPcGVuTGF5ZXJzLlV0 aWwuZXh0ZW5kKHRoaXMsb3B0aW9ucyk7dGhpcy5sYXllcnM9W107dGhpcy5pZD1P cGVuTGF5ZXJzLlV0aWwuY3JlYXRlVW5pcXVlSUQoIk9wZW5MYXllcnMuTWFwXyIp O3RoaXMuZGl2PU9wZW5MYXllcnMuVXRpbC5nZXRFbGVtZW50KGRpdik7aWYoIXRo aXMuZGl2KXt0aGlzLmRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0 aGlzLmRpdi5zdHlsZS5oZWlnaHQ9IjFweCI7dGhpcy5kaXYuc3R5bGUud2lkdGg9 IjFweCI7fQpPcGVuTGF5ZXJzLkVsZW1lbnQuYWRkQ2xhc3ModGhpcy5kaXYsJ29s TWFwJyk7dmFyIGlkPXRoaXMuaWQrIl9PcGVuTGF5ZXJzX1ZpZXdQb3J0Ijt0aGlz LnZpZXdQb3J0RGl2PU9wZW5MYXllcnMuVXRpbC5jcmVhdGVEaXYoaWQsbnVsbCxu dWxsLG51bGwsInJlbGF0aXZlIixudWxsLCJoaWRkZW4iKTt0aGlzLnZpZXdQb3J0 RGl2LnN0eWxlLndpZHRoPSIxMDAlIjt0aGlzLnZpZXdQb3J0RGl2LnN0eWxlLmhl aWdodD0iMTAwJSI7dGhpcy52aWV3UG9ydERpdi5jbGFzc05hbWU9Im9sTWFwVmll d3BvcnQiO3RoaXMuZGl2LmFwcGVuZENoaWxkKHRoaXMudmlld1BvcnREaXYpO3Zh ciBldmVudHNEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZXZlbnRz RGl2LmlkPXRoaXMuaWQrIl9ldmVudHMiO2V2ZW50c0Rpdi5zdHlsZS5wb3NpdGlv bj0iYWJzb2x1dGUiO2V2ZW50c0Rpdi5zdHlsZS53aWR0aD0iMTAwJSI7ZXZlbnRz RGl2LnN0eWxlLmhlaWdodD0iMTAwJSI7ZXZlbnRzRGl2LnN0eWxlLnpJbmRleD10 aGlzLlpfSU5ERVhfQkFTRS5Db250cm9sLTE7dGhpcy52aWV3UG9ydERpdi5hcHBl bmRDaGlsZChldmVudHNEaXYpO3RoaXMuZXZlbnRzRGl2PWV2ZW50c0Rpdjt0aGlz LmV2ZW50cz1uZXcgT3BlbkxheWVycy5FdmVudHModGhpcyx0aGlzLmV2ZW50c0Rp dix0aGlzLkVWRU5UX1RZUEVTLHRoaXMuZmFsbFRocm91Z2gse2luY2x1ZGVYWTp0 cnVlfSk7aWQ9dGhpcy5pZCsiX09wZW5MYXllcnNfQ29udGFpbmVyIjt0aGlzLmxh eWVyQ29udGFpbmVyRGl2PU9wZW5MYXllcnMuVXRpbC5jcmVhdGVEaXYoaWQpO3Ro aXMubGF5ZXJDb250YWluZXJEaXYuc3R5bGUuekluZGV4PXRoaXMuWl9JTkRFWF9C QVNFWydQb3B1cCddLTE7dGhpcy5ldmVudHNEaXYuYXBwZW5kQ2hpbGQodGhpcy5s YXllckNvbnRhaW5lckRpdik7dGhpcy51cGRhdGVTaXplKCk7aWYodGhpcy5ldmVu dExpc3RlbmVycyBpbnN0YW5jZW9mIE9iamVjdCl7dGhpcy5ldmVudHMub24odGhp cy5ldmVudExpc3RlbmVycyk7fQp0aGlzLmV2ZW50cy5yZWdpc3RlcigibW92ZXN0 YXJ0Iix0aGlzLHRoaXMudXBkYXRlU2l6ZSk7aWYoT3BlbkxheWVycy5TdHJpbmcu Y29udGFpbnMobmF2aWdhdG9yLmFwcE5hbWUsIk1pY3Jvc29mdCIpKXt0aGlzLmV2 ZW50cy5yZWdpc3RlcigicmVzaXplIix0aGlzLHRoaXMudXBkYXRlU2l6ZSk7fWVs c2V7dGhpcy51cGRhdGVTaXplRGVzdHJveT1PcGVuTGF5ZXJzLkZ1bmN0aW9uLmJp bmQodGhpcy51cGRhdGVTaXplLHRoaXMpO09wZW5MYXllcnMuRXZlbnQub2JzZXJ2 ZSh3aW5kb3csJ3Jlc2l6ZScsdGhpcy51cGRhdGVTaXplRGVzdHJveSk7fQppZih0 aGlzLnRoZW1lKXt2YXIgYWRkTm9kZT10cnVlO3ZhciBub2Rlcz1kb2N1bWVudC5n ZXRFbGVtZW50c0J5VGFnTmFtZSgnbGluaycpO2Zvcih2YXIgaT0wLGxlbj1ub2Rl cy5sZW5ndGg7aTxsZW47KytpKXtpZihPcGVuTGF5ZXJzLlV0aWwuaXNFcXVpdmFs ZW50VXJsKG5vZGVzLml0ZW0oaSkuaHJlZix0aGlzLnRoZW1lKSl7YWRkTm9kZT1m YWxzZTticmVhazt9fQppZihhZGROb2RlKXt2YXIgY3NzTm9kZT1kb2N1bWVudC5j cmVhdGVFbGVtZW50KCdsaW5rJyk7Y3NzTm9kZS5zZXRBdHRyaWJ1dGUoJ3JlbCcs J3N0eWxlc2hlZXQnKTtjc3NOb2RlLnNldEF0dHJpYnV0ZSgndHlwZScsJ3RleHQv Y3NzJyk7Y3NzTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLHRoaXMudGhlbWUpO2Rv Y3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hp bGQoY3NzTm9kZSk7fX0KaWYodGhpcy5jb250cm9scz09bnVsbCl7aWYoT3Blbkxh eWVycy5Db250cm9sIT1udWxsKXt0aGlzLmNvbnRyb2xzPVtuZXcgT3BlbkxheWVy cy5Db250cm9sLk5hdmlnYXRpb24oKSxuZXcgT3BlbkxheWVycy5Db250cm9sLlBh blpvb20oKSxuZXcgT3BlbkxheWVycy5Db250cm9sLkFyZ1BhcnNlcigpLG5ldyBP cGVuTGF5ZXJzLkNvbnRyb2wuQXR0cmlidXRpb24oKV07fWVsc2V7dGhpcy5jb250 cm9scz1bXTt9fQpmb3IodmFyIGk9MCxsZW49dGhpcy5jb250cm9scy5sZW5ndGg7 aTxsZW47aSsrKXt0aGlzLmFkZENvbnRyb2xUb01hcCh0aGlzLmNvbnRyb2xzW2ld KTt9CnRoaXMucG9wdXBzPVtdO3RoaXMudW5sb2FkRGVzdHJveT1PcGVuTGF5ZXJz LkZ1bmN0aW9uLmJpbmQodGhpcy5kZXN0cm95LHRoaXMpO09wZW5MYXllcnMuRXZl bnQub2JzZXJ2ZSh3aW5kb3csJ3VubG9hZCcsdGhpcy51bmxvYWREZXN0cm95KTtp ZihvcHRpb25zJiZvcHRpb25zLmxheWVycyl7ZGVsZXRlIHRoaXMuY2VudGVyO3Ro aXMuYWRkTGF5ZXJzKG9wdGlvbnMubGF5ZXJzKTtpZihvcHRpb25zLmNlbnRlcil7 dGhpcy5zZXRDZW50ZXIob3B0aW9ucy5jZW50ZXIsb3B0aW9ucy56b29tKTt9fX0s cmVuZGVyOmZ1bmN0aW9uKGRpdil7dGhpcy5kaXY9T3BlbkxheWVycy5VdGlsLmdl dEVsZW1lbnQoZGl2KTtPcGVuTGF5ZXJzLkVsZW1lbnQuYWRkQ2xhc3ModGhpcy5k aXYsJ29sTWFwJyk7dGhpcy52aWV3UG9ydERpdi5wYXJlbnROb2RlLnJlbW92ZUNo aWxkKHRoaXMudmlld1BvcnREaXYpO3RoaXMuZGl2LmFwcGVuZENoaWxkKHRoaXMu dmlld1BvcnREaXYpO3RoaXMudXBkYXRlU2l6ZSgpO30sdW5sb2FkRGVzdHJveTpu dWxsLHVwZGF0ZVNpemVEZXN0cm95Om51bGwsZGVzdHJveTpmdW5jdGlvbigpe2lm KCF0aGlzLnVubG9hZERlc3Ryb3kpe3JldHVybiBmYWxzZTt9CmlmKHRoaXMucGFu VHdlZW4pe3RoaXMucGFuVHdlZW4uc3RvcCgpO3RoaXMucGFuVHdlZW49bnVsbDt9 Ck9wZW5MYXllcnMuRXZlbnQuc3RvcE9ic2VydmluZyh3aW5kb3csJ3VubG9hZCcs dGhpcy51bmxvYWREZXN0cm95KTt0aGlzLnVubG9hZERlc3Ryb3k9bnVsbDtpZih0 aGlzLnVwZGF0ZVNpemVEZXN0cm95KXtPcGVuTGF5ZXJzLkV2ZW50LnN0b3BPYnNl cnZpbmcod2luZG93LCdyZXNpemUnLHRoaXMudXBkYXRlU2l6ZURlc3Ryb3kpO31l bHNle3RoaXMuZXZlbnRzLnVucmVnaXN0ZXIoInJlc2l6ZSIsdGhpcyx0aGlzLnVw ZGF0ZVNpemUpO30KdGhpcy5wYWRkaW5nRm9yUG9wdXBzPW51bGw7aWYodGhpcy5j b250cm9scyE9bnVsbCl7Zm9yKHZhciBpPXRoaXMuY29udHJvbHMubGVuZ3RoLTE7 aT49MDstLWkpe3RoaXMuY29udHJvbHNbaV0uZGVzdHJveSgpO30KdGhpcy5jb250 cm9scz1udWxsO30KaWYodGhpcy5sYXllcnMhPW51bGwpe2Zvcih2YXIgaT10aGlz LmxheWVycy5sZW5ndGgtMTtpPj0wOy0taSl7dGhpcy5sYXllcnNbaV0uZGVzdHJv eShmYWxzZSk7fQp0aGlzLmxheWVycz1udWxsO30KaWYodGhpcy52aWV3UG9ydERp dil7dGhpcy5kaXYucmVtb3ZlQ2hpbGQodGhpcy52aWV3UG9ydERpdik7fQp0aGlz LnZpZXdQb3J0RGl2PW51bGw7aWYodGhpcy5ldmVudExpc3RlbmVycyl7dGhpcy5l dmVudHMudW4odGhpcy5ldmVudExpc3RlbmVycyk7dGhpcy5ldmVudExpc3RlbmVy cz1udWxsO30KdGhpcy5ldmVudHMuZGVzdHJveSgpO3RoaXMuZXZlbnRzPW51bGw7 fSxzZXRPcHRpb25zOmZ1bmN0aW9uKG9wdGlvbnMpe3ZhciB1cGRhdGVQeEV4dGVu dD10aGlzLm1pblB4JiZvcHRpb25zLnJlc3RyaWN0ZWRFeHRlbnQhPXRoaXMucmVz dHJpY3RlZEV4dGVudDtPcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHRoaXMsb3B0aW9u cyk7dXBkYXRlUHhFeHRlbnQmJnRoaXMubW92ZVRvKHRoaXMuZ2V0Q2FjaGVkQ2Vu dGVyKCksdGhpcy56b29tLHtmb3JjZVpvb21DaGFuZ2U6dHJ1ZX0pO30sZ2V0VGls ZVNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aWxlU2l6ZTt9LGdldEJ5OmZ1 bmN0aW9uKGFycmF5LHByb3BlcnR5LG1hdGNoKXt2YXIgdGVzdD0odHlwZW9mIG1h dGNoLnRlc3Q9PSJmdW5jdGlvbiIpO3ZhciBmb3VuZD1PcGVuTGF5ZXJzLkFycmF5 LmZpbHRlcih0aGlzW2FycmF5XSxmdW5jdGlvbihpdGVtKXtyZXR1cm4gaXRlbVtw cm9wZXJ0eV09PW1hdGNofHwodGVzdCYmbWF0Y2gudGVzdChpdGVtW3Byb3BlcnR5 XSkpO30pO3JldHVybiBmb3VuZDt9LGdldExheWVyc0J5OmZ1bmN0aW9uKHByb3Bl cnR5LG1hdGNoKXtyZXR1cm4gdGhpcy5nZXRCeSgibGF5ZXJzIixwcm9wZXJ0eSxt YXRjaCk7fSxnZXRMYXllcnNCeU5hbWU6ZnVuY3Rpb24obWF0Y2gpe3JldHVybiB0 aGlzLmdldExheWVyc0J5KCJuYW1lIixtYXRjaCk7fSxnZXRMYXllcnNCeUNsYXNz OmZ1bmN0aW9uKG1hdGNoKXtyZXR1cm4gdGhpcy5nZXRMYXllcnNCeSgiQ0xBU1Nf TkFNRSIsbWF0Y2gpO30sZ2V0Q29udHJvbHNCeTpmdW5jdGlvbihwcm9wZXJ0eSxt YXRjaCl7cmV0dXJuIHRoaXMuZ2V0QnkoImNvbnRyb2xzIixwcm9wZXJ0eSxtYXRj aCk7fSxnZXRDb250cm9sc0J5Q2xhc3M6ZnVuY3Rpb24obWF0Y2gpe3JldHVybiB0 aGlzLmdldENvbnRyb2xzQnkoIkNMQVNTX05BTUUiLG1hdGNoKTt9LGdldExheWVy OmZ1bmN0aW9uKGlkKXt2YXIgZm91bmRMYXllcj1udWxsO2Zvcih2YXIgaT0wLGxl bj10aGlzLmxheWVycy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgbGF5ZXI9dGhpcy5s YXllcnNbaV07aWYobGF5ZXIuaWQ9PWlkKXtmb3VuZExheWVyPWxheWVyO2JyZWFr O319CnJldHVybiBmb3VuZExheWVyO30sc2V0TGF5ZXJaSW5kZXg6ZnVuY3Rpb24o bGF5ZXIseklkeCl7bGF5ZXIuc2V0WkluZGV4KHRoaXMuWl9JTkRFWF9CQVNFW2xh eWVyLmlzQmFzZUxheWVyPydCYXNlTGF5ZXInOidPdmVybGF5J10KK3pJZHgqNSk7 fSxyZXNldExheWVyc1pJbmRleDpmdW5jdGlvbigpe2Zvcih2YXIgaT0wLGxlbj10 aGlzLmxheWVycy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgbGF5ZXI9dGhpcy5sYXll cnNbaV07dGhpcy5zZXRMYXllclpJbmRleChsYXllcixpKTt9fSxhZGRMYXllcjpm dW5jdGlvbihsYXllcil7Zm9yKHZhciBpPTAsbGVuPXRoaXMubGF5ZXJzLmxlbmd0 aDtpPGxlbjtpKyspe2lmKHRoaXMubGF5ZXJzW2ldPT1sYXllcil7dmFyIG1zZz1P cGVuTGF5ZXJzLmkxOG4oJ2xheWVyQWxyZWFkeUFkZGVkJyx7J2xheWVyTmFtZSc6 bGF5ZXIubmFtZX0pO09wZW5MYXllcnMuQ29uc29sZS53YXJuKG1zZyk7cmV0dXJu IGZhbHNlO319CmlmKHRoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgicHJlYWRkbGF5 ZXIiLHtsYXllcjpsYXllcn0pPT09ZmFsc2Upe3JldHVybjt9CmlmKHRoaXMuYWxs T3ZlcmxheXMpe2xheWVyLmlzQmFzZUxheWVyPWZhbHNlO30KbGF5ZXIuZGl2LmNs YXNzTmFtZT0ib2xMYXllckRpdiI7bGF5ZXIuZGl2LnN0eWxlLm92ZXJmbG93PSIi O3RoaXMuc2V0TGF5ZXJaSW5kZXgobGF5ZXIsdGhpcy5sYXllcnMubGVuZ3RoKTtp ZihsYXllci5pc0ZpeGVkKXt0aGlzLnZpZXdQb3J0RGl2LmFwcGVuZENoaWxkKGxh eWVyLmRpdik7fWVsc2V7dGhpcy5sYXllckNvbnRhaW5lckRpdi5hcHBlbmRDaGls ZChsYXllci5kaXYpO30KdGhpcy5sYXllcnMucHVzaChsYXllcik7bGF5ZXIuc2V0 TWFwKHRoaXMpO2lmKGxheWVyLmlzQmFzZUxheWVyfHwodGhpcy5hbGxPdmVybGF5 cyYmIXRoaXMuYmFzZUxheWVyKSl7aWYodGhpcy5iYXNlTGF5ZXI9PW51bGwpe3Ro aXMuc2V0QmFzZUxheWVyKGxheWVyKTt9ZWxzZXtsYXllci5zZXRWaXNpYmlsaXR5 KGZhbHNlKTt9fWVsc2V7bGF5ZXIucmVkcmF3KCk7fQp0aGlzLmV2ZW50cy50cmln Z2VyRXZlbnQoImFkZGxheWVyIix7bGF5ZXI6bGF5ZXJ9KTtsYXllci5ldmVudHMu dHJpZ2dlckV2ZW50KCJhZGRlZCIse21hcDp0aGlzLGxheWVyOmxheWVyfSk7bGF5 ZXIuYWZ0ZXJBZGQoKTt9LGFkZExheWVyczpmdW5jdGlvbihsYXllcnMpe2Zvcih2 YXIgaT0wLGxlbj1sYXllcnMubGVuZ3RoO2k8bGVuO2krKyl7dGhpcy5hZGRMYXll cihsYXllcnNbaV0pO319LHJlbW92ZUxheWVyOmZ1bmN0aW9uKGxheWVyLHNldE5l d0Jhc2VMYXllcil7aWYodGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJwcmVyZW1v dmVsYXllciIse2xheWVyOmxheWVyfSk9PT1mYWxzZSl7cmV0dXJuO30KaWYoc2V0 TmV3QmFzZUxheWVyPT1udWxsKXtzZXROZXdCYXNlTGF5ZXI9dHJ1ZTt9CmlmKGxh eWVyLmlzRml4ZWQpe3RoaXMudmlld1BvcnREaXYucmVtb3ZlQ2hpbGQobGF5ZXIu ZGl2KTt9ZWxzZXt0aGlzLmxheWVyQ29udGFpbmVyRGl2LnJlbW92ZUNoaWxkKGxh eWVyLmRpdik7fQpPcGVuTGF5ZXJzLlV0aWwucmVtb3ZlSXRlbSh0aGlzLmxheWVy cyxsYXllcik7bGF5ZXIucmVtb3ZlTWFwKHRoaXMpO2xheWVyLm1hcD1udWxsO2lm KHRoaXMuYmFzZUxheWVyPT1sYXllcil7dGhpcy5iYXNlTGF5ZXI9bnVsbDtpZihz ZXROZXdCYXNlTGF5ZXIpe2Zvcih2YXIgaT0wLGxlbj10aGlzLmxheWVycy5sZW5n dGg7aTxsZW47aSsrKXt2YXIgaUxheWVyPXRoaXMubGF5ZXJzW2ldO2lmKGlMYXll ci5pc0Jhc2VMYXllcnx8dGhpcy5hbGxPdmVybGF5cyl7dGhpcy5zZXRCYXNlTGF5 ZXIoaUxheWVyKTticmVhazt9fX19CnRoaXMucmVzZXRMYXllcnNaSW5kZXgoKTt0 aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQoInJlbW92ZWxheWVyIix7bGF5ZXI6bGF5 ZXJ9KTtsYXllci5ldmVudHMudHJpZ2dlckV2ZW50KCJyZW1vdmVkIix7bWFwOnRo aXMsbGF5ZXI6bGF5ZXJ9KTt9LGdldE51bUxheWVyczpmdW5jdGlvbigpe3JldHVy biB0aGlzLmxheWVycy5sZW5ndGg7fSxnZXRMYXllckluZGV4OmZ1bmN0aW9uKGxh eWVyKXtyZXR1cm4gT3BlbkxheWVycy5VdGlsLmluZGV4T2YodGhpcy5sYXllcnMs bGF5ZXIpO30sc2V0TGF5ZXJJbmRleDpmdW5jdGlvbihsYXllcixpZHgpe3ZhciBi YXNlPXRoaXMuZ2V0TGF5ZXJJbmRleChsYXllcik7aWYoaWR4PDApe2lkeD0wO31l bHNlIGlmKGlkeD50aGlzLmxheWVycy5sZW5ndGgpe2lkeD10aGlzLmxheWVycy5s ZW5ndGg7fQppZihiYXNlIT1pZHgpe3RoaXMubGF5ZXJzLnNwbGljZShiYXNlLDEp O3RoaXMubGF5ZXJzLnNwbGljZShpZHgsMCxsYXllcik7Zm9yKHZhciBpPTAsbGVu PXRoaXMubGF5ZXJzLmxlbmd0aDtpPGxlbjtpKyspe3RoaXMuc2V0TGF5ZXJaSW5k ZXgodGhpcy5sYXllcnNbaV0saSk7fQp0aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQo ImNoYW5nZWxheWVyIix7bGF5ZXI6bGF5ZXIscHJvcGVydHk6Im9yZGVyIn0pO2lm KHRoaXMuYWxsT3ZlcmxheXMpe2lmKGlkeD09PTApe3RoaXMuc2V0QmFzZUxheWVy KGxheWVyKTt9ZWxzZSBpZih0aGlzLmJhc2VMYXllciE9PXRoaXMubGF5ZXJzWzBd KXt0aGlzLnNldEJhc2VMYXllcih0aGlzLmxheWVyc1swXSk7fX19fSxyYWlzZUxh eWVyOmZ1bmN0aW9uKGxheWVyLGRlbHRhKXt2YXIgaWR4PXRoaXMuZ2V0TGF5ZXJJ bmRleChsYXllcikrZGVsdGE7dGhpcy5zZXRMYXllckluZGV4KGxheWVyLGlkeCk7 fSxzZXRCYXNlTGF5ZXI6ZnVuY3Rpb24obmV3QmFzZUxheWVyKXtpZihuZXdCYXNl TGF5ZXIhPXRoaXMuYmFzZUxheWVyKXtpZihPcGVuTGF5ZXJzLlV0aWwuaW5kZXhP Zih0aGlzLmxheWVycyxuZXdCYXNlTGF5ZXIpIT0tMSl7dmFyIGNlbnRlcj10aGlz LmdldENhY2hlZENlbnRlcigpO3ZhciBuZXdSZXNvbHV0aW9uPU9wZW5MYXllcnMu VXRpbC5nZXRSZXNvbHV0aW9uRnJvbVNjYWxlKHRoaXMuZ2V0U2NhbGUoKSxuZXdC YXNlTGF5ZXIudW5pdHMpO2lmKHRoaXMuYmFzZUxheWVyIT1udWxsJiYhdGhpcy5h bGxPdmVybGF5cyl7dGhpcy5iYXNlTGF5ZXIuc2V0VmlzaWJpbGl0eShmYWxzZSk7 fQp0aGlzLmJhc2VMYXllcj1uZXdCYXNlTGF5ZXI7dGhpcy52aWV3UmVxdWVzdElE Kys7aWYoIXRoaXMuYWxsT3ZlcmxheXN8fHRoaXMuYmFzZUxheWVyLnZpc2liaWxp dHkpe3RoaXMuYmFzZUxheWVyLnNldFZpc2liaWxpdHkodHJ1ZSk7fQppZihjZW50 ZXIhPW51bGwpe3ZhciBuZXdab29tPXRoaXMuZ2V0Wm9vbUZvclJlc29sdXRpb24o bmV3UmVzb2x1dGlvbnx8dGhpcy5yZXNvbHV0aW9uLHRydWUpO3RoaXMuc2V0Q2Vu dGVyKGNlbnRlcixuZXdab29tLGZhbHNlLHRydWUpO30KdGhpcy5ldmVudHMudHJp Z2dlckV2ZW50KCJjaGFuZ2ViYXNlbGF5ZXIiLHtsYXllcjp0aGlzLmJhc2VMYXll cn0pO319fSxhZGRDb250cm9sOmZ1bmN0aW9uKGNvbnRyb2wscHgpe3RoaXMuY29u dHJvbHMucHVzaChjb250cm9sKTt0aGlzLmFkZENvbnRyb2xUb01hcChjb250cm9s LHB4KTt9LGFkZENvbnRyb2xzOmZ1bmN0aW9uKGNvbnRyb2xzLHBpeGVscyl7dmFy IHB4cz0oYXJndW1lbnRzLmxlbmd0aD09PTEpP1tdOnBpeGVscztmb3IodmFyIGk9 MCxsZW49Y29udHJvbHMubGVuZ3RoO2k8bGVuO2krKyl7dmFyIGN0cmw9Y29udHJv bHNbaV07dmFyIHB4PShweHNbaV0pP3B4c1tpXTpudWxsO3RoaXMuYWRkQ29udHJv bChjdHJsLHB4KTt9fSxhZGRDb250cm9sVG9NYXA6ZnVuY3Rpb24oY29udHJvbCxw eCl7Y29udHJvbC5vdXRzaWRlVmlld3BvcnQ9KGNvbnRyb2wuZGl2IT1udWxsKTtp Zih0aGlzLmRpc3BsYXlQcm9qZWN0aW9uJiYhY29udHJvbC5kaXNwbGF5UHJvamVj dGlvbil7Y29udHJvbC5kaXNwbGF5UHJvamVjdGlvbj10aGlzLmRpc3BsYXlQcm9q ZWN0aW9uO30KY29udHJvbC5zZXRNYXAodGhpcyk7dmFyIGRpdj1jb250cm9sLmRy YXcocHgpO2lmKGRpdil7aWYoIWNvbnRyb2wub3V0c2lkZVZpZXdwb3J0KXtkaXYu c3R5bGUuekluZGV4PXRoaXMuWl9JTkRFWF9CQVNFWydDb250cm9sJ10rCnRoaXMu Y29udHJvbHMubGVuZ3RoO3RoaXMudmlld1BvcnREaXYuYXBwZW5kQ2hpbGQoZGl2 KTt9fQppZihjb250cm9sLmF1dG9BY3RpdmF0ZSl7Y29udHJvbC5hY3RpdmF0ZSgp O319LGdldENvbnRyb2w6ZnVuY3Rpb24oaWQpe3ZhciByZXR1cm5Db250cm9sPW51 bGw7Zm9yKHZhciBpPTAsbGVuPXRoaXMuY29udHJvbHMubGVuZ3RoO2k8bGVuO2kr Kyl7dmFyIGNvbnRyb2w9dGhpcy5jb250cm9sc1tpXTtpZihjb250cm9sLmlkPT1p ZCl7cmV0dXJuQ29udHJvbD1jb250cm9sO2JyZWFrO319CnJldHVybiByZXR1cm5D b250cm9sO30scmVtb3ZlQ29udHJvbDpmdW5jdGlvbihjb250cm9sKXtpZigoY29u dHJvbCkmJihjb250cm9sPT10aGlzLmdldENvbnRyb2woY29udHJvbC5pZCkpKXtp Zihjb250cm9sLmRpdiYmKGNvbnRyb2wuZGl2LnBhcmVudE5vZGU9PXRoaXMudmll d1BvcnREaXYpKXt0aGlzLnZpZXdQb3J0RGl2LnJlbW92ZUNoaWxkKGNvbnRyb2wu ZGl2KTt9Ck9wZW5MYXllcnMuVXRpbC5yZW1vdmVJdGVtKHRoaXMuY29udHJvbHMs Y29udHJvbCk7fX0sYWRkUG9wdXA6ZnVuY3Rpb24ocG9wdXAsZXhjbHVzaXZlKXtp ZihleGNsdXNpdmUpe2Zvcih2YXIgaT10aGlzLnBvcHVwcy5sZW5ndGgtMTtpPj0w Oy0taSl7dGhpcy5yZW1vdmVQb3B1cCh0aGlzLnBvcHVwc1tpXSk7fX0KcG9wdXAu bWFwPXRoaXM7dGhpcy5wb3B1cHMucHVzaChwb3B1cCk7dmFyIHBvcHVwRGl2PXBv cHVwLmRyYXcoKTtpZihwb3B1cERpdil7cG9wdXBEaXYuc3R5bGUuekluZGV4PXRo aXMuWl9JTkRFWF9CQVNFWydQb3B1cCddKwp0aGlzLnBvcHVwcy5sZW5ndGg7dGhp cy5sYXllckNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChwb3B1cERpdik7fX0scmVt b3ZlUG9wdXA6ZnVuY3Rpb24ocG9wdXApe09wZW5MYXllcnMuVXRpbC5yZW1vdmVJ dGVtKHRoaXMucG9wdXBzLHBvcHVwKTtpZihwb3B1cC5kaXYpe3RyeXt0aGlzLmxh eWVyQ29udGFpbmVyRGl2LnJlbW92ZUNoaWxkKHBvcHVwLmRpdik7fQpjYXRjaChl KXt9fQpwb3B1cC5tYXA9bnVsbDt9LGdldFNpemU6ZnVuY3Rpb24oKXt2YXIgc2l6 ZT1udWxsO2lmKHRoaXMuc2l6ZSE9bnVsbCl7c2l6ZT10aGlzLnNpemUuY2xvbmUo KTt9CnJldHVybiBzaXplO30sdXBkYXRlU2l6ZTpmdW5jdGlvbigpe3ZhciBuZXdT aXplPXRoaXMuZ2V0Q3VycmVudFNpemUoKTtpZihuZXdTaXplJiYhaXNOYU4obmV3 U2l6ZS5oKSYmIWlzTmFOKG5ld1NpemUudykpe3RoaXMuZXZlbnRzLmNsZWFyTW91 c2VDYWNoZSgpO3ZhciBvbGRTaXplPXRoaXMuZ2V0U2l6ZSgpO2lmKG9sZFNpemU9 PW51bGwpe3RoaXMuc2l6ZT1vbGRTaXplPW5ld1NpemU7fQppZighbmV3U2l6ZS5l cXVhbHMob2xkU2l6ZSkpe3RoaXMuc2l6ZT1uZXdTaXplO2Zvcih2YXIgaT0wLGxl bj10aGlzLmxheWVycy5sZW5ndGg7aTxsZW47aSsrKXt0aGlzLmxheWVyc1tpXS5v bk1hcFJlc2l6ZSgpO30KdmFyIGNlbnRlcj10aGlzLmdldENhY2hlZENlbnRlcigp O2lmKHRoaXMuYmFzZUxheWVyIT1udWxsJiZjZW50ZXIhPW51bGwpe3ZhciB6b29t PXRoaXMuZ2V0Wm9vbSgpO3RoaXMuem9vbT1udWxsO3RoaXMuc2V0Q2VudGVyKGNl bnRlcix6b29tKTt9fX19LGdldEN1cnJlbnRTaXplOmZ1bmN0aW9uKCl7dmFyIHNp emU9bmV3IE9wZW5MYXllcnMuU2l6ZSh0aGlzLmRpdi5jbGllbnRXaWR0aCx0aGlz LmRpdi5jbGllbnRIZWlnaHQpO2lmKHNpemUudz09MCYmc2l6ZS5oPT0wfHxpc05h TihzaXplLncpJiZpc05hTihzaXplLmgpKXtzaXplLnc9dGhpcy5kaXYub2Zmc2V0 V2lkdGg7c2l6ZS5oPXRoaXMuZGl2Lm9mZnNldEhlaWdodDt9CmlmKHNpemUudz09 MCYmc2l6ZS5oPT0wfHxpc05hTihzaXplLncpJiZpc05hTihzaXplLmgpKXtzaXpl Lnc9cGFyc2VJbnQodGhpcy5kaXYuc3R5bGUud2lkdGgpO3NpemUuaD1wYXJzZUlu dCh0aGlzLmRpdi5zdHlsZS5oZWlnaHQpO30KcmV0dXJuIHNpemU7fSxjYWxjdWxh dGVCb3VuZHM6ZnVuY3Rpb24oY2VudGVyLHJlc29sdXRpb24pe3ZhciBleHRlbnQ9 bnVsbDtpZihjZW50ZXI9PW51bGwpe2NlbnRlcj10aGlzLmdldENhY2hlZENlbnRl cigpO30KaWYocmVzb2x1dGlvbj09bnVsbCl7cmVzb2x1dGlvbj10aGlzLmdldFJl c29sdXRpb24oKTt9CmlmKChjZW50ZXIhPW51bGwpJiYocmVzb2x1dGlvbiE9bnVs bCkpe3ZhciBzaXplPXRoaXMuZ2V0U2l6ZSgpO3ZhciB3X2RlZz1zaXplLncqcmVz b2x1dGlvbjt2YXIgaF9kZWc9c2l6ZS5oKnJlc29sdXRpb247ZXh0ZW50PW5ldyBP cGVuTGF5ZXJzLkJvdW5kcyhjZW50ZXIubG9uLXdfZGVnLzIsY2VudGVyLmxhdC1o X2RlZy8yLGNlbnRlci5sb24rd19kZWcvMixjZW50ZXIubGF0K2hfZGVnLzIpO30K cmV0dXJuIGV4dGVudDt9LGdldENlbnRlcjpmdW5jdGlvbigpe3ZhciBjZW50ZXI9 bnVsbDt2YXIgY2FjaGVkQ2VudGVyPXRoaXMuZ2V0Q2FjaGVkQ2VudGVyKCk7aWYo Y2FjaGVkQ2VudGVyKXtjZW50ZXI9Y2FjaGVkQ2VudGVyLmNsb25lKCk7fQpyZXR1 cm4gY2VudGVyO30sZ2V0Q2FjaGVkQ2VudGVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMu Y2VudGVyJiZ0aGlzLnNpemUpe3RoaXMuY2VudGVyPXRoaXMuZ2V0TG9uTGF0RnJv bVZpZXdQb3J0UHgobmV3IE9wZW5MYXllcnMuUGl4ZWwodGhpcy5zaXplLncvMix0 aGlzLnNpemUuaC8yKSk7fQpyZXR1cm4gdGhpcy5jZW50ZXI7fSxnZXRab29tOmZ1 bmN0aW9uKCl7cmV0dXJuIHRoaXMuem9vbTt9LHBhbjpmdW5jdGlvbihkeCxkeSxv cHRpb25zKXtvcHRpb25zPU9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKG9w dGlvbnMse2FuaW1hdGU6dHJ1ZSxkcmFnZ2luZzpmYWxzZX0pO2lmKG9wdGlvbnMu ZHJhZ2dpbmcpe2lmKGR4IT0wfHxkeSE9MCl7dGhpcy5tb3ZlQnlQeChkeCxkeSk7 fX1lbHNle3ZhciBjZW50ZXJQeD10aGlzLmdldFZpZXdQb3J0UHhGcm9tTG9uTGF0 KHRoaXMuZ2V0Q2FjaGVkQ2VudGVyKCkpO3ZhciBuZXdDZW50ZXJQeD1jZW50ZXJQ eC5hZGQoZHgsZHkpO2lmKHRoaXMuZHJhZ2dpbmd8fCFuZXdDZW50ZXJQeC5lcXVh bHMoY2VudGVyUHgpKXt2YXIgbmV3Q2VudGVyTG9uTGF0PXRoaXMuZ2V0TG9uTGF0 RnJvbVZpZXdQb3J0UHgobmV3Q2VudGVyUHgpO2lmKG9wdGlvbnMuYW5pbWF0ZSl7 dGhpcy5wYW5UbyhuZXdDZW50ZXJMb25MYXQpO31lbHNle3RoaXMubW92ZVRvKG5l d0NlbnRlckxvbkxhdCk7dGhpcy5kcmFnZ2luZz1mYWxzZTt0aGlzLmV2ZW50cy50 cmlnZ2VyRXZlbnQoIm1vdmVlbmQiKTt9fX19LHBhblRvOmZ1bmN0aW9uKGxvbmxh dCl7aWYodGhpcy5wYW5NZXRob2QmJnRoaXMuZ2V0RXh0ZW50KCkuc2NhbGUodGhp cy5wYW5SYXRpbykuY29udGFpbnNMb25MYXQobG9ubGF0KSl7aWYoIXRoaXMucGFu VHdlZW4pe3RoaXMucGFuVHdlZW49bmV3IE9wZW5MYXllcnMuVHdlZW4odGhpcy5w YW5NZXRob2QpO30KdmFyIGNlbnRlcj10aGlzLmdldENhY2hlZENlbnRlcigpO2lm KGxvbmxhdC5lcXVhbHMoY2VudGVyKSl7cmV0dXJuO30KdmFyIGZyb209dGhpcy5n ZXRQaXhlbEZyb21Mb25MYXQoY2VudGVyKTt2YXIgdG89dGhpcy5nZXRQaXhlbEZy b21Mb25MYXQobG9ubGF0KTt2YXIgdmVjdG9yPXt4OnRvLngtZnJvbS54LHk6dG8u eS1mcm9tLnl9O3ZhciBsYXN0PXt4OjAseTowfTt0aGlzLnBhblR3ZWVuLnN0YXJ0 KHt4OjAseTowfSx2ZWN0b3IsdGhpcy5wYW5EdXJhdGlvbix7Y2FsbGJhY2tzOntl YWNoU3RlcDpPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQoZnVuY3Rpb24ocHgpe3Zh ciB4PXB4LngtbGFzdC54LHk9cHgueS1sYXN0Lnk7dGhpcy5tb3ZlQnlQeCh4LHkp O2xhc3QueD1NYXRoLnJvdW5kKHB4LngpO2xhc3QueT1NYXRoLnJvdW5kKHB4Lnkp O30sdGhpcyksZG9uZTpPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQoZnVuY3Rpb24o cHgpe3RoaXMubW92ZVRvKGxvbmxhdCk7dGhpcy5kcmFnZ2luZz1mYWxzZTt0aGlz LmV2ZW50cy50cmlnZ2VyRXZlbnQoIm1vdmVlbmQiKTt9LHRoaXMpfX0pO31lbHNl e3RoaXMuc2V0Q2VudGVyKGxvbmxhdCk7fX0sc2V0Q2VudGVyOmZ1bmN0aW9uKGxv bmxhdCx6b29tLGRyYWdnaW5nLGZvcmNlWm9vbUNoYW5nZSl7dGhpcy5wYW5Ud2Vl biYmdGhpcy5wYW5Ud2Vlbi5zdG9wKCk7dGhpcy5tb3ZlVG8obG9ubGF0LHpvb20s eydkcmFnZ2luZyc6ZHJhZ2dpbmcsJ2ZvcmNlWm9vbUNoYW5nZSc6Zm9yY2Vab29t Q2hhbmdlfSk7fSxtb3ZlQnlQeDpmdW5jdGlvbihkeCxkeSl7dmFyIGh3PXRoaXMu c2l6ZS53LzI7dmFyIGhoPXRoaXMuc2l6ZS5oLzI7dmFyIHg9aHcrZHg7dmFyIHk9 aGgrZHk7dmFyIHdyYXBEYXRlTGluZT10aGlzLmJhc2VMYXllci53cmFwRGF0ZUxp bmU7dmFyIHhSZXN0cmljdGlvbj0wO3ZhciB5UmVzdHJpY3Rpb249MDtpZih0aGlz LnJlc3RyaWN0ZWRFeHRlbnQpe3hSZXN0cmljdGlvbj1odzt5UmVzdHJpY3Rpb249 aGg7d3JhcERhdGVMaW5lPWZhbHNlO30KZHg9d3JhcERhdGVMaW5lfHx4PD10aGlz Lm1heFB4LngteFJlc3RyaWN0aW9uJiZ4Pj10aGlzLm1pblB4LngreFJlc3RyaWN0 aW9uP01hdGgucm91bmQoZHgpOjA7ZHk9eTw9dGhpcy5tYXhQeC55LXlSZXN0cmlj dGlvbiYmeT49dGhpcy5taW5QeC55K3lSZXN0cmljdGlvbj9NYXRoLnJvdW5kKGR5 KTowO3ZhciBtaW5YPXRoaXMubWluUHgueCxtYXhYPXRoaXMubWF4UHgueDtpZihk eHx8ZHkpe2lmKCF0aGlzLmRyYWdnaW5nKXt0aGlzLmRyYWdnaW5nPXRydWU7dGhp cy5ldmVudHMudHJpZ2dlckV2ZW50KCJtb3Zlc3RhcnQiKTt9CnRoaXMuY2VudGVy PW51bGw7aWYoZHgpe3RoaXMubGF5ZXJDb250YWluZXJEaXYuc3R5bGUubGVmdD1w YXJzZUludCh0aGlzLmxheWVyQ29udGFpbmVyRGl2LnN0eWxlLmxlZnQpLWR4KyJw eCI7dGhpcy5taW5QeC54LT1keDt0aGlzLm1heFB4LngtPWR4O2lmKHdyYXBEYXRl TGluZSl7aWYodGhpcy5tYXhQeC54Pm1heFgpe3RoaXMubWF4UHgueC09KG1heFgt bWluWCk7fQppZih0aGlzLm1pblB4Lng8bWluWCl7dGhpcy5taW5QeC54Kz0obWF4 WC1taW5YKTt9fX0KaWYoZHkpe3RoaXMubGF5ZXJDb250YWluZXJEaXYuc3R5bGUu dG9wPXBhcnNlSW50KHRoaXMubGF5ZXJDb250YWluZXJEaXYuc3R5bGUudG9wKS1k eSsicHgiO3RoaXMubWluUHgueS09ZHk7dGhpcy5tYXhQeC55LT1keTt9CnZhciBs YXllcixpLGxlbjtmb3IoaT0wLGxlbj10aGlzLmxheWVycy5sZW5ndGg7aTxsZW47 KytpKXtsYXllcj10aGlzLmxheWVyc1tpXTtpZihsYXllci52aXNpYmlsaXR5JiYo bGF5ZXI9PT10aGlzLmJhc2VMYXllcnx8bGF5ZXIuaW5SYW5nZSkpe2xheWVyLm1v dmVCeVB4KGR4LGR5KTtsYXllci5ldmVudHMudHJpZ2dlckV2ZW50KCJtb3ZlIik7 fX0KdGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJtb3ZlIik7fX0sbW92ZVRvOmZ1 bmN0aW9uKGxvbmxhdCx6b29tLG9wdGlvbnMpe2lmKCFvcHRpb25zKXtvcHRpb25z PXt9O30KaWYoem9vbSE9bnVsbCl7em9vbT1wYXJzZUZsb2F0KHpvb20pO2lmKCF0 aGlzLmZyYWN0aW9uYWxab29tKXt6b29tPU1hdGgucm91bmQoem9vbSk7fX0KdmFy IGRyYWdnaW5nPW9wdGlvbnMuZHJhZ2dpbmd8fHRoaXMuZHJhZ2dpbmc7dmFyIGZv cmNlWm9vbUNoYW5nZT1vcHRpb25zLmZvcmNlWm9vbUNoYW5nZTtpZighdGhpcy5n ZXRDYWNoZWRDZW50ZXIoKSYmIXRoaXMuaXNWYWxpZExvbkxhdChsb25sYXQpKXts b25sYXQ9dGhpcy5tYXhFeHRlbnQuZ2V0Q2VudGVyTG9uTGF0KCk7dGhpcy5jZW50 ZXI9bG9ubGF0LmNsb25lKCk7fQppZih0aGlzLnJlc3RyaWN0ZWRFeHRlbnQhPW51 bGwpe2lmKGxvbmxhdD09bnVsbCl7bG9ubGF0PXRoaXMuY2VudGVyO30KaWYoem9v bT09bnVsbCl7em9vbT10aGlzLmdldFpvb20oKTt9CnZhciByZXNvbHV0aW9uPXRo aXMuZ2V0UmVzb2x1dGlvbkZvclpvb20oem9vbSk7dmFyIGV4dGVudD10aGlzLmNh bGN1bGF0ZUJvdW5kcyhsb25sYXQscmVzb2x1dGlvbik7aWYoIXRoaXMucmVzdHJp Y3RlZEV4dGVudC5jb250YWluc0JvdW5kcyhleHRlbnQpKXt2YXIgbWF4Q2VudGVy PXRoaXMucmVzdHJpY3RlZEV4dGVudC5nZXRDZW50ZXJMb25MYXQoKTtpZihleHRl bnQuZ2V0V2lkdGgoKT50aGlzLnJlc3RyaWN0ZWRFeHRlbnQuZ2V0V2lkdGgoKSl7 bG9ubGF0PW5ldyBPcGVuTGF5ZXJzLkxvbkxhdChtYXhDZW50ZXIubG9uLGxvbmxh dC5sYXQpO31lbHNlIGlmKGV4dGVudC5sZWZ0PHRoaXMucmVzdHJpY3RlZEV4dGVu dC5sZWZ0KXtsb25sYXQ9bG9ubGF0LmFkZCh0aGlzLnJlc3RyaWN0ZWRFeHRlbnQu bGVmdC0KZXh0ZW50LmxlZnQsMCk7fWVsc2UgaWYoZXh0ZW50LnJpZ2h0PnRoaXMu cmVzdHJpY3RlZEV4dGVudC5yaWdodCl7bG9ubGF0PWxvbmxhdC5hZGQodGhpcy5y ZXN0cmljdGVkRXh0ZW50LnJpZ2h0LQpleHRlbnQucmlnaHQsMCk7fQppZihleHRl bnQuZ2V0SGVpZ2h0KCk+dGhpcy5yZXN0cmljdGVkRXh0ZW50LmdldEhlaWdodCgp KXtsb25sYXQ9bmV3IE9wZW5MYXllcnMuTG9uTGF0KGxvbmxhdC5sb24sbWF4Q2Vu dGVyLmxhdCk7fWVsc2UgaWYoZXh0ZW50LmJvdHRvbTx0aGlzLnJlc3RyaWN0ZWRF eHRlbnQuYm90dG9tKXtsb25sYXQ9bG9ubGF0LmFkZCgwLHRoaXMucmVzdHJpY3Rl ZEV4dGVudC5ib3R0b20tCmV4dGVudC5ib3R0b20pO30KZWxzZSBpZihleHRlbnQu dG9wPnRoaXMucmVzdHJpY3RlZEV4dGVudC50b3Ape2xvbmxhdD1sb25sYXQuYWRk KDAsdGhpcy5yZXN0cmljdGVkRXh0ZW50LnRvcC0KZXh0ZW50LnRvcCk7fX19CnZh ciB6b29tQ2hhbmdlZD1mb3JjZVpvb21DaGFuZ2V8fCgodGhpcy5pc1ZhbGlkWm9v bUxldmVsKHpvb20pKSYmKHpvb20hPXRoaXMuZ2V0Wm9vbSgpKSk7dmFyIGNlbnRl ckNoYW5nZWQ9KHRoaXMuaXNWYWxpZExvbkxhdChsb25sYXQpKSYmKCFsb25sYXQu ZXF1YWxzKHRoaXMuY2VudGVyKSk7aWYoem9vbUNoYW5nZWR8fGNlbnRlckNoYW5n ZWR8fGRyYWdnaW5nKXtkcmFnZ2luZ3x8dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50 KCJtb3Zlc3RhcnQiKTtpZihjZW50ZXJDaGFuZ2VkKXtpZighem9vbUNoYW5nZWQm JnRoaXMuY2VudGVyKXt0aGlzLmNlbnRlckxheWVyQ29udGFpbmVyKGxvbmxhdCk7 fQp0aGlzLmNlbnRlcj1sb25sYXQuY2xvbmUoKTt9CnZhciByZXM9em9vbUNoYW5n ZWQ/dGhpcy5nZXRSZXNvbHV0aW9uRm9yWm9vbSh6b29tKTp0aGlzLmdldFJlc29s dXRpb24oKTtpZih6b29tQ2hhbmdlZHx8dGhpcy5sYXllckNvbnRhaW5lck9yaWdp bj09bnVsbCl7dGhpcy5sYXllckNvbnRhaW5lck9yaWdpbj10aGlzLmdldENhY2hl ZENlbnRlcigpO3RoaXMubGF5ZXJDb250YWluZXJEaXYuc3R5bGUubGVmdD0iMHB4 Ijt0aGlzLmxheWVyQ29udGFpbmVyRGl2LnN0eWxlLnRvcD0iMHB4Ijt2YXIgbWF4 RXh0ZW50PXRoaXMuZ2V0TWF4RXh0ZW50KHtyZXN0cmljdGVkOnRydWV9KTt2YXIg bWF4RXh0ZW50Q2VudGVyPW1heEV4dGVudC5nZXRDZW50ZXJMb25MYXQoKTt2YXIg bG9uRGVsdGE9dGhpcy5jZW50ZXIubG9uLW1heEV4dGVudENlbnRlci5sb247dmFy IGxhdERlbHRhPW1heEV4dGVudENlbnRlci5sYXQtdGhpcy5jZW50ZXIubGF0O3Zh ciBleHRlbnRXaWR0aD1NYXRoLnJvdW5kKG1heEV4dGVudC5nZXRXaWR0aCgpL3Jl cyk7dmFyIGV4dGVudEhlaWdodD1NYXRoLnJvdW5kKG1heEV4dGVudC5nZXRIZWln aHQoKS9yZXMpO3ZhciBsZWZ0PSh0aGlzLnNpemUudy1leHRlbnRXaWR0aCkvMi1s b25EZWx0YS9yZXM7dmFyIHRvcD0odGhpcy5zaXplLmgtZXh0ZW50SGVpZ2h0KS8y LWxhdERlbHRhL3Jlczt0aGlzLm1pblB4PW5ldyBPcGVuTGF5ZXJzLlBpeGVsKGxl ZnQsdG9wKTt0aGlzLm1heFB4PW5ldyBPcGVuTGF5ZXJzLlBpeGVsKGxlZnQrZXh0 ZW50V2lkdGgsdG9wK2V4dGVudEhlaWdodCk7fQppZih6b29tQ2hhbmdlZCl7dGhp cy56b29tPXpvb207dGhpcy5yZXNvbHV0aW9uPXJlczt0aGlzLnZpZXdSZXF1ZXN0 SUQrKzt9CnZhciBib3VuZHM9dGhpcy5nZXRFeHRlbnQoKTtpZih0aGlzLmJhc2VM YXllci52aXNpYmlsaXR5KXt0aGlzLmJhc2VMYXllci5tb3ZlVG8oYm91bmRzLHpv b21DaGFuZ2VkLG9wdGlvbnMuZHJhZ2dpbmcpO29wdGlvbnMuZHJhZ2dpbmd8fHRo aXMuYmFzZUxheWVyLmV2ZW50cy50cmlnZ2VyRXZlbnQoIm1vdmVlbmQiLHt6b29t Q2hhbmdlZDp6b29tQ2hhbmdlZH0pO30KYm91bmRzPXRoaXMuYmFzZUxheWVyLmdl dEV4dGVudCgpO2Zvcih2YXIgaT10aGlzLmxheWVycy5sZW5ndGgtMTtpPj0wOy0t aSl7dmFyIGxheWVyPXRoaXMubGF5ZXJzW2ldO2lmKGxheWVyIT09dGhpcy5iYXNl TGF5ZXImJiFsYXllci5pc0Jhc2VMYXllcil7dmFyIGluUmFuZ2U9bGF5ZXIuY2Fs Y3VsYXRlSW5SYW5nZSgpO2lmKGxheWVyLmluUmFuZ2UhPWluUmFuZ2Upe2xheWVy LmluUmFuZ2U9aW5SYW5nZTtpZighaW5SYW5nZSl7bGF5ZXIuZGlzcGxheShmYWxz ZSk7fQp0aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQoImNoYW5nZWxheWVyIix7bGF5 ZXI6bGF5ZXIscHJvcGVydHk6InZpc2liaWxpdHkifSk7fQppZihpblJhbmdlJiZs YXllci52aXNpYmlsaXR5KXtsYXllci5tb3ZlVG8oYm91bmRzLHpvb21DaGFuZ2Vk LG9wdGlvbnMuZHJhZ2dpbmcpO29wdGlvbnMuZHJhZ2dpbmd8fGxheWVyLmV2ZW50 cy50cmlnZ2VyRXZlbnQoIm1vdmVlbmQiLHt6b29tQ2hhbmdlZDp6b29tQ2hhbmdl ZH0pO319fQp0aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQoIm1vdmUiKTtkcmFnZ2lu Z3x8dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJtb3ZlZW5kIik7aWYoem9vbUNo YW5nZWQpe2Zvcih2YXIgaT0wLGxlbj10aGlzLnBvcHVwcy5sZW5ndGg7aTxsZW47 aSsrKXt0aGlzLnBvcHVwc1tpXS51cGRhdGVQb3NpdGlvbigpO30KdGhpcy5ldmVu dHMudHJpZ2dlckV2ZW50KCJ6b29tZW5kIik7fX19LGNlbnRlckxheWVyQ29udGFp bmVyOmZ1bmN0aW9uKGxvbmxhdCl7dmFyIG9yaWdpblB4PXRoaXMuZ2V0Vmlld1Bv cnRQeEZyb21Mb25MYXQodGhpcy5sYXllckNvbnRhaW5lck9yaWdpbik7dmFyIG5l d1B4PXRoaXMuZ2V0Vmlld1BvcnRQeEZyb21Mb25MYXQobG9ubGF0KTtpZigob3Jp Z2luUHghPW51bGwpJiYobmV3UHghPW51bGwpKXt2YXIgb2xkTGVmdD1wYXJzZUlu dCh0aGlzLmxheWVyQ29udGFpbmVyRGl2LnN0eWxlLmxlZnQpO3ZhciBvbGRUb3A9 cGFyc2VJbnQodGhpcy5sYXllckNvbnRhaW5lckRpdi5zdHlsZS50b3ApO3ZhciBu ZXdMZWZ0PU1hdGgucm91bmQob3JpZ2luUHgueC1uZXdQeC54KTt2YXIgbmV3VG9w PU1hdGgucm91bmQob3JpZ2luUHgueS1uZXdQeC55KTt0aGlzLmxheWVyQ29udGFp bmVyRGl2LnN0eWxlLmxlZnQ9bmV3TGVmdCsicHgiO3RoaXMubGF5ZXJDb250YWlu ZXJEaXYuc3R5bGUudG9wPW5ld1RvcCsicHgiO3ZhciBkeD1vbGRMZWZ0LW5ld0xl ZnQ7dmFyIGR5PW9sZFRvcC1uZXdUb3A7dGhpcy5taW5QeC54LT1keDt0aGlzLm1h eFB4LngtPWR4O3RoaXMubWluUHgueS09ZHk7dGhpcy5tYXhQeC55LT1keTt9fSxp c1ZhbGlkWm9vbUxldmVsOmZ1bmN0aW9uKHpvb21MZXZlbCl7cmV0dXJuKCh6b29t TGV2ZWwhPW51bGwpJiYoem9vbUxldmVsPj0wKSYmKHpvb21MZXZlbDx0aGlzLmdl dE51bVpvb21MZXZlbHMoKSkpO30saXNWYWxpZExvbkxhdDpmdW5jdGlvbihsb25s YXQpe3ZhciB2YWxpZD1mYWxzZTtpZihsb25sYXQhPW51bGwpe3ZhciBtYXhFeHRl bnQ9dGhpcy5nZXRNYXhFeHRlbnQoKTt2YWxpZD1tYXhFeHRlbnQuY29udGFpbnNM b25MYXQobG9ubGF0KTt9CnJldHVybiB2YWxpZDt9LGdldFByb2plY3Rpb246ZnVu Y3Rpb24oKXt2YXIgcHJvamVjdGlvbj10aGlzLmdldFByb2plY3Rpb25PYmplY3Qo KTtyZXR1cm4gcHJvamVjdGlvbj9wcm9qZWN0aW9uLmdldENvZGUoKTpudWxsO30s Z2V0UHJvamVjdGlvbk9iamVjdDpmdW5jdGlvbigpe3ZhciBwcm9qZWN0aW9uPW51 bGw7aWYodGhpcy5iYXNlTGF5ZXIhPW51bGwpe3Byb2plY3Rpb249dGhpcy5iYXNl TGF5ZXIucHJvamVjdGlvbjt9CnJldHVybiBwcm9qZWN0aW9uO30sZ2V0TWF4UmVz b2x1dGlvbjpmdW5jdGlvbigpe3ZhciBtYXhSZXNvbHV0aW9uPW51bGw7aWYodGhp cy5iYXNlTGF5ZXIhPW51bGwpe21heFJlc29sdXRpb249dGhpcy5iYXNlTGF5ZXIu bWF4UmVzb2x1dGlvbjt9CnJldHVybiBtYXhSZXNvbHV0aW9uO30sZ2V0TWF4RXh0 ZW50OmZ1bmN0aW9uKG9wdGlvbnMpe3ZhciBtYXhFeHRlbnQ9bnVsbDtpZihvcHRp b25zJiZvcHRpb25zLnJlc3RyaWN0ZWQmJnRoaXMucmVzdHJpY3RlZEV4dGVudCl7 bWF4RXh0ZW50PXRoaXMucmVzdHJpY3RlZEV4dGVudDt9ZWxzZSBpZih0aGlzLmJh c2VMYXllciE9bnVsbCl7bWF4RXh0ZW50PXRoaXMuYmFzZUxheWVyLm1heEV4dGVu dDt9CnJldHVybiBtYXhFeHRlbnQ7fSxnZXROdW1ab29tTGV2ZWxzOmZ1bmN0aW9u KCl7dmFyIG51bVpvb21MZXZlbHM9bnVsbDtpZih0aGlzLmJhc2VMYXllciE9bnVs bCl7bnVtWm9vbUxldmVscz10aGlzLmJhc2VMYXllci5udW1ab29tTGV2ZWxzO30K cmV0dXJuIG51bVpvb21MZXZlbHM7fSxnZXRFeHRlbnQ6ZnVuY3Rpb24oKXt2YXIg ZXh0ZW50PW51bGw7aWYodGhpcy5iYXNlTGF5ZXIhPW51bGwpe2V4dGVudD10aGlz LmJhc2VMYXllci5nZXRFeHRlbnQoKTt9CnJldHVybiBleHRlbnQ7fSxnZXRSZXNv bHV0aW9uOmZ1bmN0aW9uKCl7dmFyIHJlc29sdXRpb249bnVsbDtpZih0aGlzLmJh c2VMYXllciE9bnVsbCl7cmVzb2x1dGlvbj10aGlzLmJhc2VMYXllci5nZXRSZXNv bHV0aW9uKCk7fWVsc2UgaWYodGhpcy5hbGxPdmVybGF5cz09PXRydWUmJnRoaXMu bGF5ZXJzLmxlbmd0aD4wKXtyZXNvbHV0aW9uPXRoaXMubGF5ZXJzWzBdLmdldFJl c29sdXRpb24oKTt9CnJldHVybiByZXNvbHV0aW9uO30sZ2V0VW5pdHM6ZnVuY3Rp b24oKXt2YXIgdW5pdHM9bnVsbDtpZih0aGlzLmJhc2VMYXllciE9bnVsbCl7dW5p dHM9dGhpcy5iYXNlTGF5ZXIudW5pdHM7fQpyZXR1cm4gdW5pdHM7fSxnZXRTY2Fs ZTpmdW5jdGlvbigpe3ZhciBzY2FsZT1udWxsO2lmKHRoaXMuYmFzZUxheWVyIT1u dWxsKXt2YXIgcmVzPXRoaXMuZ2V0UmVzb2x1dGlvbigpO3ZhciB1bml0cz10aGlz LmJhc2VMYXllci51bml0cztzY2FsZT1PcGVuTGF5ZXJzLlV0aWwuZ2V0U2NhbGVG cm9tUmVzb2x1dGlvbihyZXMsdW5pdHMpO30KcmV0dXJuIHNjYWxlO30sZ2V0Wm9v bUZvckV4dGVudDpmdW5jdGlvbihib3VuZHMsY2xvc2VzdCl7dmFyIHpvb209bnVs bDtpZih0aGlzLmJhc2VMYXllciE9bnVsbCl7em9vbT10aGlzLmJhc2VMYXllci5n ZXRab29tRm9yRXh0ZW50KGJvdW5kcyxjbG9zZXN0KTt9CnJldHVybiB6b29tO30s Z2V0UmVzb2x1dGlvbkZvclpvb206ZnVuY3Rpb24oem9vbSl7dmFyIHJlc29sdXRp b249bnVsbDtpZih0aGlzLmJhc2VMYXllcil7cmVzb2x1dGlvbj10aGlzLmJhc2VM YXllci5nZXRSZXNvbHV0aW9uRm9yWm9vbSh6b29tKTt9CnJldHVybiByZXNvbHV0 aW9uO30sZ2V0Wm9vbUZvclJlc29sdXRpb246ZnVuY3Rpb24ocmVzb2x1dGlvbixj bG9zZXN0KXt2YXIgem9vbT1udWxsO2lmKHRoaXMuYmFzZUxheWVyIT1udWxsKXt6 b29tPXRoaXMuYmFzZUxheWVyLmdldFpvb21Gb3JSZXNvbHV0aW9uKHJlc29sdXRp b24sY2xvc2VzdCk7fQpyZXR1cm4gem9vbTt9LHpvb21UbzpmdW5jdGlvbih6b29t KXtpZih0aGlzLmlzVmFsaWRab29tTGV2ZWwoem9vbSkpe3RoaXMuc2V0Q2VudGVy KG51bGwsem9vbSk7fX0sem9vbUluOmZ1bmN0aW9uKCl7dGhpcy56b29tVG8odGhp cy5nZXRab29tKCkrMSk7fSx6b29tT3V0OmZ1bmN0aW9uKCl7dGhpcy56b29tVG8o dGhpcy5nZXRab29tKCktMSk7fSx6b29tVG9FeHRlbnQ6ZnVuY3Rpb24oYm91bmRz LGNsb3Nlc3Qpe3ZhciBjZW50ZXI9Ym91bmRzLmdldENlbnRlckxvbkxhdCgpO2lm KHRoaXMuYmFzZUxheWVyLndyYXBEYXRlTGluZSl7dmFyIG1heEV4dGVudD10aGlz LmdldE1heEV4dGVudCgpO2JvdW5kcz1ib3VuZHMuY2xvbmUoKTt3aGlsZShib3Vu ZHMucmlnaHQ8Ym91bmRzLmxlZnQpe2JvdW5kcy5yaWdodCs9bWF4RXh0ZW50Lmdl dFdpZHRoKCk7fQpjZW50ZXI9Ym91bmRzLmdldENlbnRlckxvbkxhdCgpLndyYXBE YXRlTGluZShtYXhFeHRlbnQpO30KdGhpcy5zZXRDZW50ZXIoY2VudGVyLHRoaXMu Z2V0Wm9vbUZvckV4dGVudChib3VuZHMsY2xvc2VzdCkpO30sem9vbVRvTWF4RXh0 ZW50OmZ1bmN0aW9uKG9wdGlvbnMpe3ZhciByZXN0cmljdGVkPShvcHRpb25zKT9v cHRpb25zLnJlc3RyaWN0ZWQ6dHJ1ZTt2YXIgbWF4RXh0ZW50PXRoaXMuZ2V0TWF4 RXh0ZW50KHsncmVzdHJpY3RlZCc6cmVzdHJpY3RlZH0pO3RoaXMuem9vbVRvRXh0 ZW50KG1heEV4dGVudCk7fSx6b29tVG9TY2FsZTpmdW5jdGlvbihzY2FsZSxjbG9z ZXN0KXt2YXIgcmVzPU9wZW5MYXllcnMuVXRpbC5nZXRSZXNvbHV0aW9uRnJvbVNj YWxlKHNjYWxlLHRoaXMuYmFzZUxheWVyLnVuaXRzKTt2YXIgc2l6ZT10aGlzLmdl dFNpemUoKTt2YXIgd19kZWc9c2l6ZS53KnJlczt2YXIgaF9kZWc9c2l6ZS5oKnJl czt2YXIgY2VudGVyPXRoaXMuZ2V0Q2FjaGVkQ2VudGVyKCk7dmFyIGV4dGVudD1u ZXcgT3BlbkxheWVycy5Cb3VuZHMoY2VudGVyLmxvbi13X2RlZy8yLGNlbnRlci5s YXQtaF9kZWcvMixjZW50ZXIubG9uK3dfZGVnLzIsY2VudGVyLmxhdCtoX2RlZy8y KTt0aGlzLnpvb21Ub0V4dGVudChleHRlbnQsY2xvc2VzdCk7fSxnZXRMb25MYXRG cm9tVmlld1BvcnRQeDpmdW5jdGlvbih2aWV3UG9ydFB4KXt2YXIgbG9ubGF0PW51 bGw7aWYodGhpcy5iYXNlTGF5ZXIhPW51bGwpe2xvbmxhdD10aGlzLmJhc2VMYXll ci5nZXRMb25MYXRGcm9tVmlld1BvcnRQeCh2aWV3UG9ydFB4KTt9CnJldHVybiBs b25sYXQ7fSxnZXRWaWV3UG9ydFB4RnJvbUxvbkxhdDpmdW5jdGlvbihsb25sYXQp e3ZhciBweD1udWxsO2lmKHRoaXMuYmFzZUxheWVyIT1udWxsKXtweD10aGlzLmJh c2VMYXllci5nZXRWaWV3UG9ydFB4RnJvbUxvbkxhdChsb25sYXQpO30KcmV0dXJu IHB4O30sZ2V0TG9uTGF0RnJvbVBpeGVsOmZ1bmN0aW9uKHB4KXtyZXR1cm4gdGhp cy5nZXRMb25MYXRGcm9tVmlld1BvcnRQeChweCk7fSxnZXRQaXhlbEZyb21Mb25M YXQ6ZnVuY3Rpb24obG9ubGF0KXt2YXIgcHg9dGhpcy5nZXRWaWV3UG9ydFB4RnJv bUxvbkxhdChsb25sYXQpO3B4Lng9TWF0aC5yb3VuZChweC54KTtweC55PU1hdGgu cm91bmQocHgueSk7cmV0dXJuIHB4O30sZ2V0R2VvZGVzaWNQaXhlbFNpemU6ZnVu Y3Rpb24ocHgpe3ZhciBsb25sYXQ9cHg/dGhpcy5nZXRMb25MYXRGcm9tUGl4ZWwo cHgpOih0aGlzLmdldENhY2hlZENlbnRlcigpfHxuZXcgT3BlbkxheWVycy5Mb25M YXQoMCwwKSk7dmFyIHJlcz10aGlzLmdldFJlc29sdXRpb24oKTt2YXIgbGVmdD1s b25sYXQuYWRkKC1yZXMvMiwwKTt2YXIgcmlnaHQ9bG9ubGF0LmFkZChyZXMvMiww KTt2YXIgYm90dG9tPWxvbmxhdC5hZGQoMCwtcmVzLzIpO3ZhciB0b3A9bG9ubGF0 LmFkZCgwLHJlcy8yKTt2YXIgZGVzdD1uZXcgT3BlbkxheWVycy5Qcm9qZWN0aW9u KCJFUFNHOjQzMjYiKTt2YXIgc291cmNlPXRoaXMuZ2V0UHJvamVjdGlvbk9iamVj dCgpfHxkZXN0O2lmKCFzb3VyY2UuZXF1YWxzKGRlc3QpKXtsZWZ0LnRyYW5zZm9y bShzb3VyY2UsZGVzdCk7cmlnaHQudHJhbnNmb3JtKHNvdXJjZSxkZXN0KTtib3R0 b20udHJhbnNmb3JtKHNvdXJjZSxkZXN0KTt0b3AudHJhbnNmb3JtKHNvdXJjZSxk ZXN0KTt9CnJldHVybiBuZXcgT3BlbkxheWVycy5TaXplKE9wZW5MYXllcnMuVXRp bC5kaXN0VmluY2VudHkobGVmdCxyaWdodCksT3BlbkxheWVycy5VdGlsLmRpc3RW aW5jZW50eShib3R0b20sdG9wKSk7fSxnZXRWaWV3UG9ydFB4RnJvbUxheWVyUHg6 ZnVuY3Rpb24obGF5ZXJQeCl7dmFyIHZpZXdQb3J0UHg9bnVsbDtpZihsYXllclB4 IT1udWxsKXt2YXIgZFg9cGFyc2VJbnQodGhpcy5sYXllckNvbnRhaW5lckRpdi5z dHlsZS5sZWZ0KTt2YXIgZFk9cGFyc2VJbnQodGhpcy5sYXllckNvbnRhaW5lckRp di5zdHlsZS50b3ApO3ZpZXdQb3J0UHg9bGF5ZXJQeC5hZGQoZFgsZFkpO30KcmV0 dXJuIHZpZXdQb3J0UHg7fSxnZXRMYXllclB4RnJvbVZpZXdQb3J0UHg6ZnVuY3Rp b24odmlld1BvcnRQeCl7dmFyIGxheWVyUHg9bnVsbDtpZih2aWV3UG9ydFB4IT1u dWxsKXt2YXIgZFg9LXBhcnNlSW50KHRoaXMubGF5ZXJDb250YWluZXJEaXYuc3R5 bGUubGVmdCk7dmFyIGRZPS1wYXJzZUludCh0aGlzLmxheWVyQ29udGFpbmVyRGl2 LnN0eWxlLnRvcCk7bGF5ZXJQeD12aWV3UG9ydFB4LmFkZChkWCxkWSk7aWYoaXNO YU4obGF5ZXJQeC54KXx8aXNOYU4obGF5ZXJQeC55KSl7bGF5ZXJQeD1udWxsO319 CnJldHVybiBsYXllclB4O30sZ2V0TG9uTGF0RnJvbUxheWVyUHg6ZnVuY3Rpb24o cHgpe3B4PXRoaXMuZ2V0Vmlld1BvcnRQeEZyb21MYXllclB4KHB4KTtyZXR1cm4g dGhpcy5nZXRMb25MYXRGcm9tVmlld1BvcnRQeChweCk7fSxnZXRMYXllclB4RnJv bUxvbkxhdDpmdW5jdGlvbihsb25sYXQpe3ZhciBweD10aGlzLmdldFBpeGVsRnJv bUxvbkxhdChsb25sYXQpO3JldHVybiB0aGlzLmdldExheWVyUHhGcm9tVmlld1Bv cnRQeChweCk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLk1hcCJ9KTtPcGVuTGF5 ZXJzLk1hcC5USUxFX1dJRFRIPTI1NjtPcGVuTGF5ZXJzLk1hcC5USUxFX0hFSUdI VD0yNTY7T3BlbkxheWVycy5Qcm9qZWN0aW9uPU9wZW5MYXllcnMuQ2xhc3Moe3By b2o6bnVsbCxwcm9qQ29kZTpudWxsLHRpdGxlUmVnRXg6L1wrdGl0bGU9W15cK10q Lyxpbml0aWFsaXplOmZ1bmN0aW9uKHByb2pDb2RlLG9wdGlvbnMpe09wZW5MYXll cnMuVXRpbC5leHRlbmQodGhpcyxvcHRpb25zKTt0aGlzLnByb2pDb2RlPXByb2pD b2RlO2lmKHdpbmRvdy5Qcm9qNGpzKXt0aGlzLnByb2o9bmV3IFByb2o0anMuUHJv aihwcm9qQ29kZSk7fX0sZ2V0Q29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBy b2o/dGhpcy5wcm9qLnNyc0NvZGU6dGhpcy5wcm9qQ29kZTt9LGdldFVuaXRzOmZ1 bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvaj90aGlzLnByb2oudW5pdHM6bnVsbDt9 LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29kZSgpO30sZXF1 YWxzOmZ1bmN0aW9uKHByb2plY3Rpb24pe3ZhciBwPXByb2plY3Rpb24sZXF1YWxz PWZhbHNlO2lmKHApe2lmKHdpbmRvdy5Qcm9qNGpzJiZ0aGlzLnByb2ouZGVmRGF0 YSYmcC5wcm9qLmRlZkRhdGEpe2VxdWFscz10aGlzLnByb2ouZGVmRGF0YS5yZXBs YWNlKHRoaXMudGl0bGVSZWdFeCwiIik9PXAucHJvai5kZWZEYXRhLnJlcGxhY2Uo dGhpcy50aXRsZVJlZ0V4LCIiKTt9ZWxzZSBpZihwLmdldENvZGUpe3ZhciBzb3Vy Y2U9dGhpcy5nZXRDb2RlKCksdGFyZ2V0PXAuZ2V0Q29kZSgpO2VxdWFscz1zb3Vy Y2U9PXRhcmdldHx8ISFPcGVuTGF5ZXJzLlByb2plY3Rpb24udHJhbnNmb3Jtc1tz b3VyY2VdJiZPcGVuTGF5ZXJzLlByb2plY3Rpb24udHJhbnNmb3Jtc1tzb3VyY2Vd W3RhcmdldF09PT1PcGVuTGF5ZXJzLlByb2plY3Rpb24ubnVsbFRyYW5zZm9ybTt9 fQpyZXR1cm4gZXF1YWxzO30sZGVzdHJveTpmdW5jdGlvbigpe2RlbGV0ZSB0aGlz LnByb2o7ZGVsZXRlIHRoaXMucHJvakNvZGU7fSxDTEFTU19OQU1FOiJPcGVuTGF5 ZXJzLlByb2plY3Rpb24ifSk7T3BlbkxheWVycy5Qcm9qZWN0aW9uLnRyYW5zZm9y bXM9e307T3BlbkxheWVycy5Qcm9qZWN0aW9uLmFkZFRyYW5zZm9ybT1mdW5jdGlv bihmcm9tLHRvLG1ldGhvZCl7aWYoIU9wZW5MYXllcnMuUHJvamVjdGlvbi50cmFu c2Zvcm1zW2Zyb21dKXtPcGVuTGF5ZXJzLlByb2plY3Rpb24udHJhbnNmb3Jtc1tm cm9tXT17fTt9Ck9wZW5MYXllcnMuUHJvamVjdGlvbi50cmFuc2Zvcm1zW2Zyb21d W3RvXT1tZXRob2Q7fTtPcGVuTGF5ZXJzLlByb2plY3Rpb24udHJhbnNmb3JtPWZ1 bmN0aW9uKHBvaW50LHNvdXJjZSxkZXN0KXtpZihzb3VyY2UucHJvaiYmZGVzdC5w cm9qKXtwb2ludD1Qcm9qNGpzLnRyYW5zZm9ybShzb3VyY2UucHJvaixkZXN0LnBy b2oscG9pbnQpO31lbHNlIGlmKHNvdXJjZSYmZGVzdCYmT3BlbkxheWVycy5Qcm9q ZWN0aW9uLnRyYW5zZm9ybXNbc291cmNlLmdldENvZGUoKV0mJk9wZW5MYXllcnMu UHJvamVjdGlvbi50cmFuc2Zvcm1zW3NvdXJjZS5nZXRDb2RlKCldW2Rlc3QuZ2V0 Q29kZSgpXSl7T3BlbkxheWVycy5Qcm9qZWN0aW9uLnRyYW5zZm9ybXNbc291cmNl LmdldENvZGUoKV1bZGVzdC5nZXRDb2RlKCldKHBvaW50KTt9CnJldHVybiBwb2lu dDt9O09wZW5MYXllcnMuUHJvamVjdGlvbi5udWxsVHJhbnNmb3JtPWZ1bmN0aW9u KHBvaW50KXtyZXR1cm4gcG9pbnQ7fTtPcGVuTGF5ZXJzLkxheWVyPU9wZW5MYXll cnMuQ2xhc3Moe2lkOm51bGwsbmFtZTpudWxsLGRpdjpudWxsLG9wYWNpdHk6bnVs bCxhbHdheXNJblJhbmdlOm51bGwsRVZFTlRfVFlQRVM6WyJsb2Fkc3RhcnQiLCJs b2FkZW5kIiwibG9hZGNhbmNlbCIsInZpc2liaWxpdHljaGFuZ2VkIiwibW92ZSIs Im1vdmVlbmQiLCJhZGRlZCIsInJlbW92ZWQiXSxSRVNPTFVUSU9OX1BST1BFUlRJ RVM6WydzY2FsZXMnLCdyZXNvbHV0aW9ucycsJ21heFNjYWxlJywnbWluU2NhbGUn LCdtYXhSZXNvbHV0aW9uJywnbWluUmVzb2x1dGlvbicsJ251bVpvb21MZXZlbHMn LCdtYXhab29tTGV2ZWwnXSxldmVudHM6bnVsbCxtYXA6bnVsbCxpc0Jhc2VMYXll cjpmYWxzZSxhbHBoYTpmYWxzZSxkaXNwbGF5SW5MYXllclN3aXRjaGVyOnRydWUs dmlzaWJpbGl0eTp0cnVlLGF0dHJpYnV0aW9uOm51bGwsaW5SYW5nZTpmYWxzZSxp bWFnZVNpemU6bnVsbCxpbWFnZU9mZnNldDpudWxsLG9wdGlvbnM6bnVsbCxldmVu dExpc3RlbmVyczpudWxsLGd1dHRlcjowLHByb2plY3Rpb246bnVsbCx1bml0czpu dWxsLHNjYWxlczpudWxsLHJlc29sdXRpb25zOm51bGwsbWF4RXh0ZW50Om51bGws bWluRXh0ZW50Om51bGwsbWF4UmVzb2x1dGlvbjpudWxsLG1pblJlc29sdXRpb246 bnVsbCxudW1ab29tTGV2ZWxzOm51bGwsbWluU2NhbGU6bnVsbCxtYXhTY2FsZTpu dWxsLGRpc3BsYXlPdXRzaWRlTWF4RXh0ZW50OmZhbHNlLHdyYXBEYXRlTGluZTpm YWxzZSx0cmFuc2l0aW9uRWZmZWN0Om51bGwsU1VQUE9SVEVEX1RSQU5TSVRJT05T OlsncmVzaXplJ10sbWV0YWRhdGE6e30saW5pdGlhbGl6ZTpmdW5jdGlvbihuYW1l LG9wdGlvbnMpe3RoaXMuYWRkT3B0aW9ucyhvcHRpb25zKTt0aGlzLm5hbWU9bmFt ZTtpZih0aGlzLmlkPT1udWxsKXt0aGlzLmlkPU9wZW5MYXllcnMuVXRpbC5jcmVh dGVVbmlxdWVJRCh0aGlzLkNMQVNTX05BTUUrIl8iKTt0aGlzLmRpdj1PcGVuTGF5 ZXJzLlV0aWwuY3JlYXRlRGl2KHRoaXMuaWQpO3RoaXMuZGl2LnN0eWxlLndpZHRo PSIxMDAlIjt0aGlzLmRpdi5zdHlsZS5oZWlnaHQ9IjEwMCUiO3RoaXMuZGl2LmRp cj0ibHRyIjt0aGlzLmV2ZW50cz1uZXcgT3BlbkxheWVycy5FdmVudHModGhpcyx0 aGlzLmRpdix0aGlzLkVWRU5UX1RZUEVTKTtpZih0aGlzLmV2ZW50TGlzdGVuZXJz IGluc3RhbmNlb2YgT2JqZWN0KXt0aGlzLmV2ZW50cy5vbih0aGlzLmV2ZW50TGlz dGVuZXJzKTt9fQppZih0aGlzLndyYXBEYXRlTGluZSl7dGhpcy5kaXNwbGF5T3V0 c2lkZU1heEV4dGVudD10cnVlO319LGRlc3Ryb3k6ZnVuY3Rpb24oc2V0TmV3QmFz ZUxheWVyKXtpZihzZXROZXdCYXNlTGF5ZXI9PW51bGwpe3NldE5ld0Jhc2VMYXll cj10cnVlO30KaWYodGhpcy5tYXAhPW51bGwpe3RoaXMubWFwLnJlbW92ZUxheWVy KHRoaXMsc2V0TmV3QmFzZUxheWVyKTt9CnRoaXMucHJvamVjdGlvbj1udWxsO3Ro aXMubWFwPW51bGw7dGhpcy5uYW1lPW51bGw7dGhpcy5kaXY9bnVsbDt0aGlzLm9w dGlvbnM9bnVsbDtpZih0aGlzLmV2ZW50cyl7aWYodGhpcy5ldmVudExpc3RlbmVy cyl7dGhpcy5ldmVudHMudW4odGhpcy5ldmVudExpc3RlbmVycyk7fQp0aGlzLmV2 ZW50cy5kZXN0cm95KCk7fQp0aGlzLmV2ZW50TGlzdGVuZXJzPW51bGw7dGhpcy5l dmVudHM9bnVsbDt9LGNsb25lOmZ1bmN0aW9uKG9iail7aWYob2JqPT1udWxsKXtv Ymo9bmV3IE9wZW5MYXllcnMuTGF5ZXIodGhpcy5uYW1lLHRoaXMuZ2V0T3B0aW9u cygpKTt9Ck9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKG9iaix0aGlzKTtv YmoubWFwPW51bGw7cmV0dXJuIG9iajt9LGdldE9wdGlvbnM6ZnVuY3Rpb24oKXt2 YXIgb3B0aW9ucz17fTtmb3IodmFyIG8gaW4gdGhpcy5vcHRpb25zKXtvcHRpb25z W29dPXRoaXNbb107fQpyZXR1cm4gb3B0aW9uczt9LHNldE5hbWU6ZnVuY3Rpb24o bmV3TmFtZSl7aWYobmV3TmFtZSE9dGhpcy5uYW1lKXt0aGlzLm5hbWU9bmV3TmFt ZTtpZih0aGlzLm1hcCE9bnVsbCl7dGhpcy5tYXAuZXZlbnRzLnRyaWdnZXJFdmVu dCgiY2hhbmdlbGF5ZXIiLHtsYXllcjp0aGlzLHByb3BlcnR5OiJuYW1lIn0pO319 fSxhZGRPcHRpb25zOmZ1bmN0aW9uKG5ld09wdGlvbnMscmVpbml0aWFsaXplKXtp Zih0aGlzLm9wdGlvbnM9PW51bGwpe3RoaXMub3B0aW9ucz17fTt9Ck9wZW5MYXll cnMuVXRpbC5leHRlbmQodGhpcy5vcHRpb25zLG5ld09wdGlvbnMpO09wZW5MYXll cnMuVXRpbC5leHRlbmQodGhpcyxuZXdPcHRpb25zKTtpZih0eXBlb2YgdGhpcy5w cm9qZWN0aW9uPT0ic3RyaW5nIil7dGhpcy5wcm9qZWN0aW9uPW5ldyBPcGVuTGF5 ZXJzLlByb2plY3Rpb24odGhpcy5wcm9qZWN0aW9uKTt9CmlmKHRoaXMucHJvamVj dGlvbiYmdGhpcy5wcm9qZWN0aW9uLmdldFVuaXRzKCkpe3RoaXMudW5pdHM9dGhp cy5wcm9qZWN0aW9uLmdldFVuaXRzKCk7fQppZih0aGlzLm1hcCl7dmFyIHJlc29s dXRpb249dGhpcy5tYXAuZ2V0UmVzb2x1dGlvbigpO3ZhciBwcm9wZXJ0aWVzPXRo aXMuUkVTT0xVVElPTl9QUk9QRVJUSUVTLmNvbmNhdChbInByb2plY3Rpb24iLCJ1 bml0cyIsIm1pbkV4dGVudCIsIm1heEV4dGVudCJdKTtmb3IodmFyIG8gaW4gbmV3 T3B0aW9ucyl7aWYobmV3T3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShvKSYmT3Blbkxh eWVycy5VdGlsLmluZGV4T2YocHJvcGVydGllcyxvKT49MCl7dGhpcy5pbml0UmVz b2x1dGlvbnMoKTtpZihyZWluaXRpYWxpemUmJnRoaXMubWFwLmJhc2VMYXllcj09 PXRoaXMpe3RoaXMubWFwLnNldENlbnRlcih0aGlzLm1hcC5nZXRDZW50ZXIoKSx0 aGlzLm1hcC5nZXRab29tRm9yUmVzb2x1dGlvbihyZXNvbHV0aW9uKSxmYWxzZSx0 cnVlKTt0aGlzLm1hcC5ldmVudHMudHJpZ2dlckV2ZW50KCJjaGFuZ2ViYXNlbGF5 ZXIiLHtsYXllcjp0aGlzfSk7fQpicmVhazt9fX19LG9uTWFwUmVzaXplOmZ1bmN0 aW9uKCl7fSxyZWRyYXc6ZnVuY3Rpb24oKXt2YXIgcmVkcmF3bj1mYWxzZTtpZih0 aGlzLm1hcCl7dGhpcy5pblJhbmdlPXRoaXMuY2FsY3VsYXRlSW5SYW5nZSgpO3Zh ciBleHRlbnQ9dGhpcy5nZXRFeHRlbnQoKTtpZihleHRlbnQmJnRoaXMuaW5SYW5n ZSYmdGhpcy52aXNpYmlsaXR5KXt2YXIgem9vbUNoYW5nZWQ9dHJ1ZTt0aGlzLm1v dmVUbyhleHRlbnQsem9vbUNoYW5nZWQsZmFsc2UpO3RoaXMuZXZlbnRzLnRyaWdn ZXJFdmVudCgibW92ZWVuZCIseyJ6b29tQ2hhbmdlZCI6em9vbUNoYW5nZWR9KTty ZWRyYXduPXRydWU7fX0KcmV0dXJuIHJlZHJhd247fSxtb3ZlVG86ZnVuY3Rpb24o Ym91bmRzLHpvb21DaGFuZ2VkLGRyYWdnaW5nKXt2YXIgZGlzcGxheT10aGlzLnZp c2liaWxpdHk7aWYoIXRoaXMuaXNCYXNlTGF5ZXIpe2Rpc3BsYXk9ZGlzcGxheSYm dGhpcy5pblJhbmdlO30KdGhpcy5kaXNwbGF5KGRpc3BsYXkpO30sbW92ZUJ5UHg6 ZnVuY3Rpb24oZHgsZHkpe30sc2V0TWFwOmZ1bmN0aW9uKG1hcCl7aWYodGhpcy5t YXA9PW51bGwpe3RoaXMubWFwPW1hcDt0aGlzLm1heEV4dGVudD10aGlzLm1heEV4 dGVudHx8dGhpcy5tYXAubWF4RXh0ZW50O3RoaXMubWluRXh0ZW50PXRoaXMubWlu RXh0ZW50fHx0aGlzLm1hcC5taW5FeHRlbnQ7dGhpcy5wcm9qZWN0aW9uPXRoaXMu cHJvamVjdGlvbnx8dGhpcy5tYXAucHJvamVjdGlvbjtpZih0eXBlb2YgdGhpcy5w cm9qZWN0aW9uPT0ic3RyaW5nIil7dGhpcy5wcm9qZWN0aW9uPW5ldyBPcGVuTGF5 ZXJzLlByb2plY3Rpb24odGhpcy5wcm9qZWN0aW9uKTt9CnRoaXMudW5pdHM9dGhp cy5wcm9qZWN0aW9uLmdldFVuaXRzKCl8fHRoaXMudW5pdHN8fHRoaXMubWFwLnVu aXRzO3RoaXMuaW5pdFJlc29sdXRpb25zKCk7aWYoIXRoaXMuaXNCYXNlTGF5ZXIp e3RoaXMuaW5SYW5nZT10aGlzLmNhbGN1bGF0ZUluUmFuZ2UoKTt2YXIgc2hvdz0o KHRoaXMudmlzaWJpbGl0eSkmJih0aGlzLmluUmFuZ2UpKTt0aGlzLmRpdi5zdHls ZS5kaXNwbGF5PXNob3c/IiI6Im5vbmUiO30KdGhpcy5zZXRUaWxlU2l6ZSgpO319 LGFmdGVyQWRkOmZ1bmN0aW9uKCl7fSxyZW1vdmVNYXA6ZnVuY3Rpb24obWFwKXt9 LGdldEltYWdlU2l6ZTpmdW5jdGlvbihib3VuZHMpe3JldHVybih0aGlzLmltYWdl U2l6ZXx8dGhpcy50aWxlU2l6ZSk7fSxzZXRUaWxlU2l6ZTpmdW5jdGlvbihzaXpl KXt2YXIgdGlsZVNpemU9KHNpemUpP3NpemU6KCh0aGlzLnRpbGVTaXplKT90aGlz LnRpbGVTaXplOnRoaXMubWFwLmdldFRpbGVTaXplKCkpO3RoaXMudGlsZVNpemU9 dGlsZVNpemU7aWYodGhpcy5ndXR0ZXIpe3RoaXMuaW1hZ2VPZmZzZXQ9bmV3IE9w ZW5MYXllcnMuUGl4ZWwoLXRoaXMuZ3V0dGVyLC10aGlzLmd1dHRlcik7dGhpcy5p bWFnZVNpemU9bmV3IE9wZW5MYXllcnMuU2l6ZSh0aWxlU2l6ZS53KygyKnRoaXMu Z3V0dGVyKSx0aWxlU2l6ZS5oKygyKnRoaXMuZ3V0dGVyKSk7fX0sZ2V0VmlzaWJp bGl0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpc2liaWxpdHk7fSxzZXRWaXNp YmlsaXR5OmZ1bmN0aW9uKHZpc2liaWxpdHkpe2lmKHZpc2liaWxpdHkhPXRoaXMu dmlzaWJpbGl0eSl7dGhpcy52aXNpYmlsaXR5PXZpc2liaWxpdHk7dGhpcy5kaXNw bGF5KHZpc2liaWxpdHkpO3RoaXMucmVkcmF3KCk7aWYodGhpcy5tYXAhPW51bGwp e3RoaXMubWFwLmV2ZW50cy50cmlnZ2VyRXZlbnQoImNoYW5nZWxheWVyIix7bGF5 ZXI6dGhpcyxwcm9wZXJ0eToidmlzaWJpbGl0eSJ9KTt9CnRoaXMuZXZlbnRzLnRy aWdnZXJFdmVudCgidmlzaWJpbGl0eWNoYW5nZWQiKTt9fSxkaXNwbGF5OmZ1bmN0 aW9uKGRpc3BsYXkpe2lmKGRpc3BsYXkhPSh0aGlzLmRpdi5zdHlsZS5kaXNwbGF5 IT0ibm9uZSIpKXt0aGlzLmRpdi5zdHlsZS5kaXNwbGF5PShkaXNwbGF5JiZ0aGlz LmNhbGN1bGF0ZUluUmFuZ2UoKSk/ImJsb2NrIjoibm9uZSI7fX0sY2FsY3VsYXRl SW5SYW5nZTpmdW5jdGlvbigpe3ZhciBpblJhbmdlPWZhbHNlO2lmKHRoaXMuYWx3 YXlzSW5SYW5nZSl7aW5SYW5nZT10cnVlO31lbHNle2lmKHRoaXMubWFwKXt2YXIg cmVzb2x1dGlvbj10aGlzLm1hcC5nZXRSZXNvbHV0aW9uKCk7aW5SYW5nZT0oKHJl c29sdXRpb24+PXRoaXMubWluUmVzb2x1dGlvbikmJihyZXNvbHV0aW9uPD10aGlz Lm1heFJlc29sdXRpb24pKTt9fQpyZXR1cm4gaW5SYW5nZTt9LHNldElzQmFzZUxh eWVyOmZ1bmN0aW9uKGlzQmFzZUxheWVyKXtpZihpc0Jhc2VMYXllciE9dGhpcy5p c0Jhc2VMYXllcil7dGhpcy5pc0Jhc2VMYXllcj1pc0Jhc2VMYXllcjtpZih0aGlz Lm1hcCE9bnVsbCl7dGhpcy5tYXAuZXZlbnRzLnRyaWdnZXJFdmVudCgiY2hhbmdl YmFzZWxheWVyIix7bGF5ZXI6dGhpc30pO319fSxpbml0UmVzb2x1dGlvbnM6ZnVu Y3Rpb24oKXt2YXIgaSxsZW4scDt2YXIgcHJvcHM9e30sYWx3YXlzSW5SYW5nZT10 cnVlO2ZvcihpPTAsbGVuPXRoaXMuUkVTT0xVVElPTl9QUk9QRVJUSUVTLmxlbmd0 aDtpPGxlbjtpKyspe3A9dGhpcy5SRVNPTFVUSU9OX1BST1BFUlRJRVNbaV07cHJv cHNbcF09dGhpcy5vcHRpb25zW3BdO2lmKGFsd2F5c0luUmFuZ2UmJnRoaXMub3B0 aW9uc1twXSl7YWx3YXlzSW5SYW5nZT1mYWxzZTt9fQppZih0aGlzLmFsd2F5c0lu UmFuZ2U9PW51bGwpe3RoaXMuYWx3YXlzSW5SYW5nZT1hbHdheXNJblJhbmdlO30K aWYocHJvcHMucmVzb2x1dGlvbnM9PW51bGwpe3Byb3BzLnJlc29sdXRpb25zPXRo aXMucmVzb2x1dGlvbnNGcm9tU2NhbGVzKHByb3BzLnNjYWxlcyk7fQppZihwcm9w cy5yZXNvbHV0aW9ucz09bnVsbCl7cHJvcHMucmVzb2x1dGlvbnM9dGhpcy5jYWxj dWxhdGVSZXNvbHV0aW9ucyhwcm9wcyk7fQppZihwcm9wcy5yZXNvbHV0aW9ucz09 bnVsbCl7Zm9yKGk9MCxsZW49dGhpcy5SRVNPTFVUSU9OX1BST1BFUlRJRVMubGVu Z3RoO2k8bGVuO2krKyl7cD10aGlzLlJFU09MVVRJT05fUFJPUEVSVElFU1tpXTtw cm9wc1twXT10aGlzLm9wdGlvbnNbcF0hPW51bGw/dGhpcy5vcHRpb25zW3BdOnRo aXMubWFwW3BdO30KaWYocHJvcHMucmVzb2x1dGlvbnM9PW51bGwpe3Byb3BzLnJl c29sdXRpb25zPXRoaXMucmVzb2x1dGlvbnNGcm9tU2NhbGVzKHByb3BzLnNjYWxl cyk7fQppZihwcm9wcy5yZXNvbHV0aW9ucz09bnVsbCl7cHJvcHMucmVzb2x1dGlv bnM9dGhpcy5jYWxjdWxhdGVSZXNvbHV0aW9ucyhwcm9wcyk7fX0KdmFyIG1heFJl c29sdXRpb247aWYodGhpcy5vcHRpb25zLm1heFJlc29sdXRpb24mJnRoaXMub3B0 aW9ucy5tYXhSZXNvbHV0aW9uIT09ImF1dG8iKXttYXhSZXNvbHV0aW9uPXRoaXMu b3B0aW9ucy5tYXhSZXNvbHV0aW9uO30KaWYodGhpcy5vcHRpb25zLm1pblNjYWxl KXttYXhSZXNvbHV0aW9uPU9wZW5MYXllcnMuVXRpbC5nZXRSZXNvbHV0aW9uRnJv bVNjYWxlKHRoaXMub3B0aW9ucy5taW5TY2FsZSx0aGlzLnVuaXRzKTt9CnZhciBt aW5SZXNvbHV0aW9uO2lmKHRoaXMub3B0aW9ucy5taW5SZXNvbHV0aW9uJiZ0aGlz Lm9wdGlvbnMubWluUmVzb2x1dGlvbiE9PSJhdXRvIil7bWluUmVzb2x1dGlvbj10 aGlzLm9wdGlvbnMubWluUmVzb2x1dGlvbjt9CmlmKHRoaXMub3B0aW9ucy5tYXhT Y2FsZSl7bWluUmVzb2x1dGlvbj1PcGVuTGF5ZXJzLlV0aWwuZ2V0UmVzb2x1dGlv bkZyb21TY2FsZSh0aGlzLm9wdGlvbnMubWF4U2NhbGUsdGhpcy51bml0cyk7fQpp Zihwcm9wcy5yZXNvbHV0aW9ucyl7cHJvcHMucmVzb2x1dGlvbnMuc29ydChmdW5j dGlvbihhLGIpe3JldHVybihiLWEpO30pO2lmKCFtYXhSZXNvbHV0aW9uKXttYXhS ZXNvbHV0aW9uPXByb3BzLnJlc29sdXRpb25zWzBdO30KaWYoIW1pblJlc29sdXRp b24pe3ZhciBsYXN0SWR4PXByb3BzLnJlc29sdXRpb25zLmxlbmd0aC0xO21pblJl c29sdXRpb249cHJvcHMucmVzb2x1dGlvbnNbbGFzdElkeF07fX0KdGhpcy5yZXNv bHV0aW9ucz1wcm9wcy5yZXNvbHV0aW9ucztpZih0aGlzLnJlc29sdXRpb25zKXts ZW49dGhpcy5yZXNvbHV0aW9ucy5sZW5ndGg7dGhpcy5zY2FsZXM9bmV3IEFycmF5 KGxlbik7Zm9yKGk9MDtpPGxlbjtpKyspe3RoaXMuc2NhbGVzW2ldPU9wZW5MYXll cnMuVXRpbC5nZXRTY2FsZUZyb21SZXNvbHV0aW9uKHRoaXMucmVzb2x1dGlvbnNb aV0sdGhpcy51bml0cyk7fQp0aGlzLm51bVpvb21MZXZlbHM9bGVuO30KdGhpcy5t aW5SZXNvbHV0aW9uPW1pblJlc29sdXRpb247aWYobWluUmVzb2x1dGlvbil7dGhp cy5tYXhTY2FsZT1PcGVuTGF5ZXJzLlV0aWwuZ2V0U2NhbGVGcm9tUmVzb2x1dGlv bihtaW5SZXNvbHV0aW9uLHRoaXMudW5pdHMpO30KdGhpcy5tYXhSZXNvbHV0aW9u PW1heFJlc29sdXRpb247aWYobWF4UmVzb2x1dGlvbil7dGhpcy5taW5TY2FsZT1P cGVuTGF5ZXJzLlV0aWwuZ2V0U2NhbGVGcm9tUmVzb2x1dGlvbihtYXhSZXNvbHV0 aW9uLHRoaXMudW5pdHMpO319LHJlc29sdXRpb25zRnJvbVNjYWxlczpmdW5jdGlv bihzY2FsZXMpe2lmKHNjYWxlcz09bnVsbCl7cmV0dXJuO30KdmFyIHJlc29sdXRp b25zLGksbGVuO2xlbj1zY2FsZXMubGVuZ3RoO3Jlc29sdXRpb25zPW5ldyBBcnJh eShsZW4pO2ZvcihpPTA7aTxsZW47aSsrKXtyZXNvbHV0aW9uc1tpXT1PcGVuTGF5 ZXJzLlV0aWwuZ2V0UmVzb2x1dGlvbkZyb21TY2FsZShzY2FsZXNbaV0sdGhpcy51 bml0cyk7fQpyZXR1cm4gcmVzb2x1dGlvbnM7fSxjYWxjdWxhdGVSZXNvbHV0aW9u czpmdW5jdGlvbihwcm9wcyl7dmFyIHZpZXdTaXplLHdSZXMsaFJlczt2YXIgbWF4 UmVzb2x1dGlvbj1wcm9wcy5tYXhSZXNvbHV0aW9uO2lmKHByb3BzLm1pblNjYWxl IT1udWxsKXttYXhSZXNvbHV0aW9uPU9wZW5MYXllcnMuVXRpbC5nZXRSZXNvbHV0 aW9uRnJvbVNjYWxlKHByb3BzLm1pblNjYWxlLHRoaXMudW5pdHMpO31lbHNlIGlm KG1heFJlc29sdXRpb249PSJhdXRvIiYmdGhpcy5tYXhFeHRlbnQhPW51bGwpe3Zp ZXdTaXplPXRoaXMubWFwLmdldFNpemUoKTt3UmVzPXRoaXMubWF4RXh0ZW50Lmdl dFdpZHRoKCkvdmlld1NpemUudztoUmVzPXRoaXMubWF4RXh0ZW50LmdldEhlaWdo dCgpL3ZpZXdTaXplLmg7bWF4UmVzb2x1dGlvbj1NYXRoLm1heCh3UmVzLGhSZXMp O30KdmFyIG1pblJlc29sdXRpb249cHJvcHMubWluUmVzb2x1dGlvbjtpZihwcm9w cy5tYXhTY2FsZSE9bnVsbCl7bWluUmVzb2x1dGlvbj1PcGVuTGF5ZXJzLlV0aWwu Z2V0UmVzb2x1dGlvbkZyb21TY2FsZShwcm9wcy5tYXhTY2FsZSx0aGlzLnVuaXRz KTt9ZWxzZSBpZihwcm9wcy5taW5SZXNvbHV0aW9uPT0iYXV0byImJnRoaXMubWlu RXh0ZW50IT1udWxsKXt2aWV3U2l6ZT10aGlzLm1hcC5nZXRTaXplKCk7d1Jlcz10 aGlzLm1pbkV4dGVudC5nZXRXaWR0aCgpL3ZpZXdTaXplLnc7aFJlcz10aGlzLm1p bkV4dGVudC5nZXRIZWlnaHQoKS92aWV3U2l6ZS5oO21pblJlc29sdXRpb249TWF0 aC5tYXgod1JlcyxoUmVzKTt9CnZhciBtYXhab29tTGV2ZWw9cHJvcHMubWF4Wm9v bUxldmVsO3ZhciBudW1ab29tTGV2ZWxzPXByb3BzLm51bVpvb21MZXZlbHM7aWYo dHlwZW9mIG1pblJlc29sdXRpb249PT0ibnVtYmVyIiYmdHlwZW9mIG1heFJlc29s dXRpb249PT0ibnVtYmVyIiYmbnVtWm9vbUxldmVscz09PXVuZGVmaW5lZCl7dmFy IHJhdGlvPW1heFJlc29sdXRpb24vbWluUmVzb2x1dGlvbjtudW1ab29tTGV2ZWxz PU1hdGguZmxvb3IoTWF0aC5sb2cocmF0aW8pL01hdGgubG9nKDIpKSsxO31lbHNl IGlmKG51bVpvb21MZXZlbHM9PT11bmRlZmluZWQmJm1heFpvb21MZXZlbCE9bnVs bCl7bnVtWm9vbUxldmVscz1tYXhab29tTGV2ZWwrMTt9CmlmKHR5cGVvZiBudW1a b29tTGV2ZWxzIT09Im51bWJlciJ8fG51bVpvb21MZXZlbHM8PTB8fCh0eXBlb2Yg bWF4UmVzb2x1dGlvbiE9PSJudW1iZXIiJiZ0eXBlb2YgbWluUmVzb2x1dGlvbiE9 PSJudW1iZXIiKSl7cmV0dXJuO30KdmFyIHJlc29sdXRpb25zPW5ldyBBcnJheShu dW1ab29tTGV2ZWxzKTt2YXIgYmFzZT0yO2lmKHR5cGVvZiBtaW5SZXNvbHV0aW9u PT0ibnVtYmVyIiYmdHlwZW9mIG1heFJlc29sdXRpb249PSJudW1iZXIiKXtiYXNl PU1hdGgucG93KChtYXhSZXNvbHV0aW9uL21pblJlc29sdXRpb24pLCgxLyhudW1a b29tTGV2ZWxzLTEpKSk7fQp2YXIgaTtpZih0eXBlb2YgbWF4UmVzb2x1dGlvbj09 PSJudW1iZXIiKXtmb3IoaT0wO2k8bnVtWm9vbUxldmVscztpKyspe3Jlc29sdXRp b25zW2ldPW1heFJlc29sdXRpb24vTWF0aC5wb3coYmFzZSxpKTt9fWVsc2V7Zm9y KGk9MDtpPG51bVpvb21MZXZlbHM7aSsrKXtyZXNvbHV0aW9uc1tudW1ab29tTGV2 ZWxzLTEtaV09bWluUmVzb2x1dGlvbipNYXRoLnBvdyhiYXNlLGkpO319CnJldHVy biByZXNvbHV0aW9uczt9LGdldFJlc29sdXRpb246ZnVuY3Rpb24oKXt2YXIgem9v bT10aGlzLm1hcC5nZXRab29tKCk7cmV0dXJuIHRoaXMuZ2V0UmVzb2x1dGlvbkZv clpvb20oem9vbSk7fSxnZXRFeHRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5t YXAuY2FsY3VsYXRlQm91bmRzKCk7fSxnZXRab29tRm9yRXh0ZW50OmZ1bmN0aW9u KGV4dGVudCxjbG9zZXN0KXt2YXIgdmlld1NpemU9dGhpcy5tYXAuZ2V0U2l6ZSgp O3ZhciBpZGVhbFJlc29sdXRpb249TWF0aC5tYXgoZXh0ZW50LmdldFdpZHRoKCkv dmlld1NpemUudyxleHRlbnQuZ2V0SGVpZ2h0KCkvdmlld1NpemUuaCk7cmV0dXJu IHRoaXMuZ2V0Wm9vbUZvclJlc29sdXRpb24oaWRlYWxSZXNvbHV0aW9uLGNsb3Nl c3QpO30sZ2V0RGF0YUV4dGVudDpmdW5jdGlvbigpe30sZ2V0UmVzb2x1dGlvbkZv clpvb206ZnVuY3Rpb24oem9vbSl7em9vbT1NYXRoLm1heCgwLE1hdGgubWluKHpv b20sdGhpcy5yZXNvbHV0aW9ucy5sZW5ndGgtMSkpO3ZhciByZXNvbHV0aW9uO2lm KHRoaXMubWFwLmZyYWN0aW9uYWxab29tKXt2YXIgbG93PU1hdGguZmxvb3Ioem9v bSk7dmFyIGhpZ2g9TWF0aC5jZWlsKHpvb20pO3Jlc29sdXRpb249dGhpcy5yZXNv bHV0aW9uc1tsb3ddLQooKHpvb20tbG93KSoodGhpcy5yZXNvbHV0aW9uc1tsb3dd LXRoaXMucmVzb2x1dGlvbnNbaGlnaF0pKTt9ZWxzZXtyZXNvbHV0aW9uPXRoaXMu cmVzb2x1dGlvbnNbTWF0aC5yb3VuZCh6b29tKV07fQpyZXR1cm4gcmVzb2x1dGlv bjt9LGdldFpvb21Gb3JSZXNvbHV0aW9uOmZ1bmN0aW9uKHJlc29sdXRpb24sY2xv c2VzdCl7dmFyIHpvb20saSxsZW47aWYodGhpcy5tYXAuZnJhY3Rpb25hbFpvb20p e3ZhciBsb3dab29tPTA7dmFyIGhpZ2hab29tPXRoaXMucmVzb2x1dGlvbnMubGVu Z3RoLTE7dmFyIGhpZ2hSZXM9dGhpcy5yZXNvbHV0aW9uc1tsb3dab29tXTt2YXIg bG93UmVzPXRoaXMucmVzb2x1dGlvbnNbaGlnaFpvb21dO3ZhciByZXM7Zm9yKGk9 MCxsZW49dGhpcy5yZXNvbHV0aW9ucy5sZW5ndGg7aTxsZW47KytpKXtyZXM9dGhp cy5yZXNvbHV0aW9uc1tpXTtpZihyZXM+PXJlc29sdXRpb24pe2hpZ2hSZXM9cmVz O2xvd1pvb209aTt9CmlmKHJlczw9cmVzb2x1dGlvbil7bG93UmVzPXJlcztoaWdo Wm9vbT1pO2JyZWFrO319CnZhciBkUmVzPWhpZ2hSZXMtbG93UmVzO2lmKGRSZXM+ MCl7em9vbT1sb3dab29tKygoaGlnaFJlcy1yZXNvbHV0aW9uKS9kUmVzKTt9ZWxz ZXt6b29tPWxvd1pvb207fX1lbHNle3ZhciBkaWZmO3ZhciBtaW5EaWZmPU51bWJl ci5QT1NJVElWRV9JTkZJTklUWTtmb3IoaT0wLGxlbj10aGlzLnJlc29sdXRpb25z Lmxlbmd0aDtpPGxlbjtpKyspe2lmKGNsb3Nlc3Qpe2RpZmY9TWF0aC5hYnModGhp cy5yZXNvbHV0aW9uc1tpXS1yZXNvbHV0aW9uKTtpZihkaWZmPm1pbkRpZmYpe2Jy ZWFrO30KbWluRGlmZj1kaWZmO31lbHNle2lmKHRoaXMucmVzb2x1dGlvbnNbaV08 cmVzb2x1dGlvbil7YnJlYWs7fX19Cnpvb209TWF0aC5tYXgoMCxpLTEpO30KcmV0 dXJuIHpvb207fSxnZXRMb25MYXRGcm9tVmlld1BvcnRQeDpmdW5jdGlvbih2aWV3 UG9ydFB4KXt2YXIgbG9ubGF0PW51bGw7dmFyIG1hcD10aGlzLm1hcDtpZih2aWV3 UG9ydFB4IT1udWxsJiZtYXAubWluUHgpe3ZhciByZXM9bWFwLmdldFJlc29sdXRp b24oKTt2YXIgbWF4RXh0ZW50PW1hcC5nZXRNYXhFeHRlbnQoe3Jlc3RyaWN0ZWQ6 dHJ1ZX0pO3ZhciBsb249KHZpZXdQb3J0UHgueC1tYXAubWluUHgueCkqcmVzK21h eEV4dGVudC5sZWZ0O3ZhciBsYXQ9KG1hcC5taW5QeC55LXZpZXdQb3J0UHgueSkq cmVzK21heEV4dGVudC50b3A7bG9ubGF0PW5ldyBPcGVuTGF5ZXJzLkxvbkxhdChs b24sbGF0KTtpZih0aGlzLndyYXBEYXRlTGluZSl7bG9ubGF0PWxvbmxhdC53cmFw RGF0ZUxpbmUodGhpcy5tYXhFeHRlbnQpO319CnJldHVybiBsb25sYXQ7fSxnZXRW aWV3UG9ydFB4RnJvbUxvbkxhdDpmdW5jdGlvbihsb25sYXQpe3ZhciBweD1udWxs O2lmKGxvbmxhdCE9bnVsbCl7dmFyIHJlc29sdXRpb249dGhpcy5tYXAuZ2V0UmVz b2x1dGlvbigpO3ZhciBleHRlbnQ9dGhpcy5tYXAuZ2V0RXh0ZW50KCk7cHg9bmV3 IE9wZW5MYXllcnMuUGl4ZWwoKDEvcmVzb2x1dGlvbioobG9ubGF0Lmxvbi1leHRl bnQubGVmdCkpLCgxL3Jlc29sdXRpb24qKGV4dGVudC50b3AtbG9ubGF0LmxhdCkp KTt9CnJldHVybiBweDt9LHNldE9wYWNpdHk6ZnVuY3Rpb24ob3BhY2l0eSl7aWYo b3BhY2l0eSE9dGhpcy5vcGFjaXR5KXt0aGlzLm9wYWNpdHk9b3BhY2l0eTtmb3Io dmFyIGk9MCxsZW49dGhpcy5kaXYuY2hpbGROb2Rlcy5sZW5ndGg7aTxsZW47Kytp KXt2YXIgZWxlbWVudD10aGlzLmRpdi5jaGlsZE5vZGVzW2ldLmZpcnN0Q2hpbGQ7 T3BlbkxheWVycy5VdGlsLm1vZGlmeURPTUVsZW1lbnQoZWxlbWVudCxudWxsLG51 bGwsbnVsbCxudWxsLG51bGwsbnVsbCxvcGFjaXR5KTt9CmlmKHRoaXMubWFwIT1u dWxsKXt0aGlzLm1hcC5ldmVudHMudHJpZ2dlckV2ZW50KCJjaGFuZ2VsYXllciIs e2xheWVyOnRoaXMscHJvcGVydHk6Im9wYWNpdHkifSk7fX19LGdldFpJbmRleDpm dW5jdGlvbigpe3JldHVybiB0aGlzLmRpdi5zdHlsZS56SW5kZXg7fSxzZXRaSW5k ZXg6ZnVuY3Rpb24oekluZGV4KXt0aGlzLmRpdi5zdHlsZS56SW5kZXg9ekluZGV4 O30sYWRqdXN0Qm91bmRzOmZ1bmN0aW9uKGJvdW5kcyl7aWYodGhpcy5ndXR0ZXIp e3ZhciBtYXBHdXR0ZXI9dGhpcy5ndXR0ZXIqdGhpcy5tYXAuZ2V0UmVzb2x1dGlv bigpO2JvdW5kcz1uZXcgT3BlbkxheWVycy5Cb3VuZHMoYm91bmRzLmxlZnQtbWFw R3V0dGVyLGJvdW5kcy5ib3R0b20tbWFwR3V0dGVyLGJvdW5kcy5yaWdodCttYXBH dXR0ZXIsYm91bmRzLnRvcCttYXBHdXR0ZXIpO30KaWYodGhpcy53cmFwRGF0ZUxp bmUpe3ZhciB3cmFwcGluZ09wdGlvbnM9eydyaWdodFRvbGVyYW5jZSc6dGhpcy5n ZXRSZXNvbHV0aW9uKCksJ2xlZnRUb2xlcmFuY2UnOnRoaXMuZ2V0UmVzb2x1dGlv bigpfTtib3VuZHM9Ym91bmRzLndyYXBEYXRlTGluZSh0aGlzLm1heEV4dGVudCx3 cmFwcGluZ09wdGlvbnMpO30KcmV0dXJuIGJvdW5kczt9LENMQVNTX05BTUU6Ik9w ZW5MYXllcnMuTGF5ZXIifSk7T3BlbkxheWVycy5MYXllci5TcGhlcmljYWxNZXJj YXRvcj17Z2V0RXh0ZW50OmZ1bmN0aW9uKCl7dmFyIGV4dGVudD1udWxsO2lmKHRo aXMuc3BoZXJpY2FsTWVyY2F0b3Ipe2V4dGVudD10aGlzLm1hcC5jYWxjdWxhdGVC b3VuZHMoKTt9ZWxzZXtleHRlbnQ9T3BlbkxheWVycy5MYXllci5GaXhlZFpvb21M ZXZlbHMucHJvdG90eXBlLmdldEV4dGVudC5hcHBseSh0aGlzKTt9CnJldHVybiBl eHRlbnQ7fSxnZXRMb25MYXRGcm9tVmlld1BvcnRQeDpmdW5jdGlvbih2aWV3UG9y dFB4KXtyZXR1cm4gT3BlbkxheWVycy5MYXllci5wcm90b3R5cGUuZ2V0TG9uTGF0 RnJvbVZpZXdQb3J0UHguYXBwbHkodGhpcyxhcmd1bWVudHMpO30sZ2V0Vmlld1Bv cnRQeEZyb21Mb25MYXQ6ZnVuY3Rpb24obG9ubGF0KXtyZXR1cm4gT3BlbkxheWVy cy5MYXllci5wcm90b3R5cGUuZ2V0Vmlld1BvcnRQeEZyb21Mb25MYXQuYXBwbHko dGhpcyxhcmd1bWVudHMpO30saW5pdE1lcmNhdG9yUGFyYW1ldGVyczpmdW5jdGlv bigpe3RoaXMuUkVTT0xVVElPTlM9W107dmFyIG1heFJlc29sdXRpb249MTU2NTQz LjAzMzkwNjI1O2Zvcih2YXIgem9vbT0wO3pvb208PXRoaXMuTUFYX1pPT01fTEVW RUw7Kyt6b29tKXt0aGlzLlJFU09MVVRJT05TW3pvb21dPW1heFJlc29sdXRpb24v TWF0aC5wb3coMix6b29tKTt9CnRoaXMudW5pdHM9Im0iO3RoaXMucHJvamVjdGlv bj10aGlzLnByb2plY3Rpb258fCJFUFNHOjkwMDkxMyI7fSxmb3J3YXJkTWVyY2F0 b3I6ZnVuY3Rpb24obG9uLGxhdCl7dmFyIHg9bG9uKjIwMDM3NTA4LjM0LzE4MDt2 YXIgeT1NYXRoLmxvZyhNYXRoLnRhbigoOTArbGF0KSpNYXRoLlBJLzM2MCkpLyhN YXRoLlBJLzE4MCk7eT15KjIwMDM3NTA4LjM0LzE4MDtyZXR1cm4gbmV3IE9wZW5M YXllcnMuTG9uTGF0KHgseSk7fSxpbnZlcnNlTWVyY2F0b3I6ZnVuY3Rpb24oeCx5 KXt2YXIgbG9uPSh4LzIwMDM3NTA4LjM0KSoxODA7dmFyIGxhdD0oeS8yMDAzNzUw OC4zNCkqMTgwO2xhdD0xODAvTWF0aC5QSSooMipNYXRoLmF0YW4oTWF0aC5leHAo bGF0Kk1hdGguUEkvMTgwKSktTWF0aC5QSS8yKTtyZXR1cm4gbmV3IE9wZW5MYXll cnMuTG9uTGF0KGxvbixsYXQpO30scHJvamVjdEZvcndhcmQ6ZnVuY3Rpb24ocG9p bnQpe3ZhciBsb25sYXQ9T3BlbkxheWVycy5MYXllci5TcGhlcmljYWxNZXJjYXRv ci5mb3J3YXJkTWVyY2F0b3IocG9pbnQueCxwb2ludC55KTtwb2ludC54PWxvbmxh dC5sb247cG9pbnQueT1sb25sYXQubGF0O3JldHVybiBwb2ludDt9LHByb2plY3RJ bnZlcnNlOmZ1bmN0aW9uKHBvaW50KXt2YXIgbG9ubGF0PU9wZW5MYXllcnMuTGF5 ZXIuU3BoZXJpY2FsTWVyY2F0b3IuaW52ZXJzZU1lcmNhdG9yKHBvaW50LngscG9p bnQueSk7cG9pbnQueD1sb25sYXQubG9uO3BvaW50Lnk9bG9ubGF0LmxhdDtyZXR1 cm4gcG9pbnQ7fX07KGZ1bmN0aW9uKCl7dmFyIGNvZGVzPVsiRVBTRzo5MDA5MTMi LCJFUFNHOjM4NTciLCJFUFNHOjEwMjExMyIsIkVQU0c6MTAyMTAwIl07dmFyIGFk ZD1PcGVuTGF5ZXJzLlByb2plY3Rpb24uYWRkVHJhbnNmb3JtO3ZhciBtZXJjPU9w ZW5MYXllcnMuTGF5ZXIuU3BoZXJpY2FsTWVyY2F0b3I7dmFyIHNhbWU9T3Blbkxh eWVycy5Qcm9qZWN0aW9uLm51bGxUcmFuc2Zvcm07dmFyIGksbGVuLGNvZGUsb3Ro ZXIsajtmb3IoaT0wLGxlbj1jb2Rlcy5sZW5ndGg7aTxsZW47KytpKXtjb2RlPWNv ZGVzW2ldO2FkZCgiRVBTRzo0MzI2Iixjb2RlLG1lcmMucHJvamVjdEZvcndhcmQp O2FkZChjb2RlLCJFUFNHOjQzMjYiLG1lcmMucHJvamVjdEludmVyc2UpO2Zvcihq PWkrMTtqPGxlbjsrK2ope290aGVyPWNvZGVzW2pdO2FkZChjb2RlLG90aGVyLHNh bWUpO2FkZChvdGhlcixjb2RlLHNhbWUpO319fSkoKTtPcGVuTGF5ZXJzLkxheWVy LkV2ZW50UGFuZT1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuTGF5ZXIse3Nt b290aERyYWdQYW46dHJ1ZSxpc0Jhc2VMYXllcjp0cnVlLGlzRml4ZWQ6dHJ1ZSxw YW5lOm51bGwsbWFwT2JqZWN0Om51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihuYW1l LG9wdGlvbnMpe09wZW5MYXllcnMuTGF5ZXIucHJvdG90eXBlLmluaXRpYWxpemUu YXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKHRoaXMucGFuZT09bnVsbCl7dGhpcy5w YW5lPU9wZW5MYXllcnMuVXRpbC5jcmVhdGVEaXYodGhpcy5kaXYuaWQrIl9FdmVu dFBhbmUiKTt9fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5tYXBPYmplY3Q9bnVs bDt0aGlzLnBhbmU9bnVsbDtPcGVuTGF5ZXJzLkxheWVyLnByb3RvdHlwZS5kZXN0 cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LHNldE1hcDpmdW5jdGlvbihtYXAp e09wZW5MYXllcnMuTGF5ZXIucHJvdG90eXBlLnNldE1hcC5hcHBseSh0aGlzLGFy Z3VtZW50cyk7dGhpcy5wYW5lLnN0eWxlLnpJbmRleD1wYXJzZUludCh0aGlzLmRp di5zdHlsZS56SW5kZXgpKzE7dGhpcy5wYW5lLnN0eWxlLmRpc3BsYXk9dGhpcy5k aXYuc3R5bGUuZGlzcGxheTt0aGlzLnBhbmUuc3R5bGUud2lkdGg9IjEwMCUiO3Ro aXMucGFuZS5zdHlsZS5oZWlnaHQ9IjEwMCUiO2lmKE9wZW5MYXllcnMuQlJPV1NF Ul9OQU1FPT0ibXNpZSIpe3RoaXMucGFuZS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwo IitPcGVuTGF5ZXJzLlV0aWwuZ2V0SW1hZ2VzTG9jYXRpb24oKSsiYmxhbmsuZ2lm KSI7fQppZih0aGlzLmlzRml4ZWQpe3RoaXMubWFwLmV2ZW50c0Rpdi5hcHBlbmRD aGlsZCh0aGlzLnBhbmUpO31lbHNle3RoaXMubWFwLmxheWVyQ29udGFpbmVyRGl2 LmFwcGVuZENoaWxkKHRoaXMucGFuZSk7fQp0aGlzLmxvYWRNYXBPYmplY3QoKTtp Zih0aGlzLm1hcE9iamVjdD09bnVsbCl7dGhpcy5sb2FkV2FybmluZ01lc3NhZ2Uo KTt9fSxyZW1vdmVNYXA6ZnVuY3Rpb24obWFwKXtpZih0aGlzLnBhbmUmJnRoaXMu cGFuZS5wYXJlbnROb2RlKXt0aGlzLnBhbmUucGFyZW50Tm9kZS5yZW1vdmVDaGls ZCh0aGlzLnBhbmUpO30KT3BlbkxheWVycy5MYXllci5wcm90b3R5cGUucmVtb3Zl TWFwLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LGxvYWRXYXJuaW5nTWVzc2FnZTpm dW5jdGlvbigpe3RoaXMuZGl2LnN0eWxlLmJhY2tncm91bmRDb2xvcj0iZGFya2Js dWUiO3ZhciB2aWV3U2l6ZT10aGlzLm1hcC5nZXRTaXplKCk7dmFyIG1zZ1c9TWF0 aC5taW4odmlld1NpemUudywzMDApO3ZhciBtc2dIPU1hdGgubWluKHZpZXdTaXpl LmgsMjAwKTt2YXIgc2l6ZT1uZXcgT3BlbkxheWVycy5TaXplKG1zZ1csbXNnSCk7 dmFyIGNlbnRlclB4PW5ldyBPcGVuTGF5ZXJzLlBpeGVsKHZpZXdTaXplLncvMix2 aWV3U2l6ZS5oLzIpO3ZhciB0b3BMZWZ0PWNlbnRlclB4LmFkZCgtc2l6ZS53LzIs LXNpemUuaC8yKTt2YXIgZGl2PU9wZW5MYXllcnMuVXRpbC5jcmVhdGVEaXYodGhp cy5uYW1lKyJfd2FybmluZyIsdG9wTGVmdCxzaXplLG51bGwsbnVsbCxudWxsLCJh dXRvIik7ZGl2LnN0eWxlLnBhZGRpbmc9IjdweCI7ZGl2LnN0eWxlLmJhY2tncm91 bmRDb2xvcj0ieWVsbG93IjtkaXYuaW5uZXJIVE1MPXRoaXMuZ2V0V2FybmluZ0hU TUwoKTt0aGlzLmRpdi5hcHBlbmRDaGlsZChkaXYpO30sZ2V0V2FybmluZ0hUTUw6 ZnVuY3Rpb24oKXtyZXR1cm4iIjt9LGRpc3BsYXk6ZnVuY3Rpb24oZGlzcGxheSl7 T3BlbkxheWVycy5MYXllci5wcm90b3R5cGUuZGlzcGxheS5hcHBseSh0aGlzLGFy Z3VtZW50cyk7dGhpcy5wYW5lLnN0eWxlLmRpc3BsYXk9dGhpcy5kaXYuc3R5bGUu ZGlzcGxheTt9LHNldFpJbmRleDpmdW5jdGlvbih6SW5kZXgpe09wZW5MYXllcnMu TGF5ZXIucHJvdG90eXBlLnNldFpJbmRleC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7 dGhpcy5wYW5lLnN0eWxlLnpJbmRleD1wYXJzZUludCh0aGlzLmRpdi5zdHlsZS56 SW5kZXgpKzE7fSxtb3ZlQnlQeDpmdW5jdGlvbihkeCxkeSl7T3BlbkxheWVycy5M YXllci5wcm90b3R5cGUubW92ZUJ5UHguYXBwbHkodGhpcyxhcmd1bWVudHMpO2lm KHRoaXMuZHJhZ1Bhbk1hcE9iamVjdCl7dGhpcy5kcmFnUGFuTWFwT2JqZWN0KGR4 LC1keSk7fWVsc2V7dGhpcy5tb3ZlVG8odGhpcy5tYXAuZ2V0Q2FjaGVkQ2VudGVy KCkpO319LG1vdmVUbzpmdW5jdGlvbihib3VuZHMsem9vbUNoYW5nZWQsZHJhZ2dp bmcpe09wZW5MYXllcnMuTGF5ZXIucHJvdG90eXBlLm1vdmVUby5hcHBseSh0aGlz LGFyZ3VtZW50cyk7aWYodGhpcy5tYXBPYmplY3QhPW51bGwpe3ZhciBuZXdDZW50 ZXI9dGhpcy5tYXAuZ2V0Q2VudGVyKCk7dmFyIG5ld1pvb209dGhpcy5tYXAuZ2V0 Wm9vbSgpO2lmKG5ld0NlbnRlciE9bnVsbCl7dmFyIG1vT2xkQ2VudGVyPXRoaXMu Z2V0TWFwT2JqZWN0Q2VudGVyKCk7dmFyIG9sZENlbnRlcj10aGlzLmdldE9MTG9u TGF0RnJvbU1hcE9iamVjdExvbkxhdChtb09sZENlbnRlcik7dmFyIG1vT2xkWm9v bT10aGlzLmdldE1hcE9iamVjdFpvb20oKTt2YXIgb2xkWm9vbT10aGlzLmdldE9M Wm9vbUZyb21NYXBPYmplY3Rab29tKG1vT2xkWm9vbSk7aWYoIShuZXdDZW50ZXIu ZXF1YWxzKG9sZENlbnRlcikpfHwhKG5ld1pvb209PW9sZFpvb20pKXtpZighem9v bUNoYW5nZWQmJm9sZENlbnRlciYmdGhpcy5kcmFnUGFuTWFwT2JqZWN0JiZ0aGlz LnNtb290aERyYWdQYW4pe3ZhciBvbGRQeD10aGlzLm1hcC5nZXRWaWV3UG9ydFB4 RnJvbUxvbkxhdChvbGRDZW50ZXIpO3ZhciBuZXdQeD10aGlzLm1hcC5nZXRWaWV3 UG9ydFB4RnJvbUxvbkxhdChuZXdDZW50ZXIpO3RoaXMuZHJhZ1Bhbk1hcE9iamVj dChuZXdQeC54LW9sZFB4Lngsb2xkUHgueS1uZXdQeC55KTt9ZWxzZXt2YXIgY2Vu dGVyPXRoaXMuZ2V0TWFwT2JqZWN0TG9uTGF0RnJvbU9MTG9uTGF0KG5ld0NlbnRl cik7dmFyIHpvb209dGhpcy5nZXRNYXBPYmplY3Rab29tRnJvbU9MWm9vbShuZXda b29tKTt0aGlzLnNldE1hcE9iamVjdENlbnRlcihjZW50ZXIsem9vbSxkcmFnZ2lu Zyk7fX19fX0sZ2V0TG9uTGF0RnJvbVZpZXdQb3J0UHg6ZnVuY3Rpb24odmlld1Bv cnRQeCl7dmFyIGxvbmxhdD1udWxsO2lmKCh0aGlzLm1hcE9iamVjdCE9bnVsbCkm Jih0aGlzLmdldE1hcE9iamVjdENlbnRlcigpIT1udWxsKSl7dmFyIG1vUGl4ZWw9 dGhpcy5nZXRNYXBPYmplY3RQaXhlbEZyb21PTFBpeGVsKHZpZXdQb3J0UHgpO3Zh ciBtb0xvbkxhdD10aGlzLmdldE1hcE9iamVjdExvbkxhdEZyb21NYXBPYmplY3RQ aXhlbChtb1BpeGVsKTtsb25sYXQ9dGhpcy5nZXRPTExvbkxhdEZyb21NYXBPYmpl Y3RMb25MYXQobW9Mb25MYXQpO30KcmV0dXJuIGxvbmxhdDt9LGdldFZpZXdQb3J0 UHhGcm9tTG9uTGF0OmZ1bmN0aW9uKGxvbmxhdCl7dmFyIHZpZXdQb3J0UHg9bnVs bDtpZigodGhpcy5tYXBPYmplY3QhPW51bGwpJiYodGhpcy5nZXRNYXBPYmplY3RD ZW50ZXIoKSE9bnVsbCkpe3ZhciBtb0xvbkxhdD10aGlzLmdldE1hcE9iamVjdExv bkxhdEZyb21PTExvbkxhdChsb25sYXQpO3ZhciBtb1BpeGVsPXRoaXMuZ2V0TWFw T2JqZWN0UGl4ZWxGcm9tTWFwT2JqZWN0TG9uTGF0KG1vTG9uTGF0KTt2aWV3UG9y dFB4PXRoaXMuZ2V0T0xQaXhlbEZyb21NYXBPYmplY3RQaXhlbChtb1BpeGVsKTt9 CnJldHVybiB2aWV3UG9ydFB4O30sZ2V0T0xMb25MYXRGcm9tTWFwT2JqZWN0TG9u TGF0OmZ1bmN0aW9uKG1vTG9uTGF0KXt2YXIgb2xMb25MYXQ9bnVsbDtpZihtb0xv bkxhdCE9bnVsbCl7dmFyIGxvbj10aGlzLmdldExvbmdpdHVkZUZyb21NYXBPYmpl Y3RMb25MYXQobW9Mb25MYXQpO3ZhciBsYXQ9dGhpcy5nZXRMYXRpdHVkZUZyb21N YXBPYmplY3RMb25MYXQobW9Mb25MYXQpO29sTG9uTGF0PW5ldyBPcGVuTGF5ZXJz LkxvbkxhdChsb24sbGF0KTt9CnJldHVybiBvbExvbkxhdDt9LGdldE1hcE9iamVj dExvbkxhdEZyb21PTExvbkxhdDpmdW5jdGlvbihvbExvbkxhdCl7dmFyIG1vTGF0 TG5nPW51bGw7aWYob2xMb25MYXQhPW51bGwpe21vTGF0TG5nPXRoaXMuZ2V0TWFw T2JqZWN0TG9uTGF0RnJvbUxvbkxhdChvbExvbkxhdC5sb24sb2xMb25MYXQubGF0 KTt9CnJldHVybiBtb0xhdExuZzt9LGdldE9MUGl4ZWxGcm9tTWFwT2JqZWN0UGl4 ZWw6ZnVuY3Rpb24obW9QaXhlbCl7dmFyIG9sUGl4ZWw9bnVsbDtpZihtb1BpeGVs IT1udWxsKXt2YXIgeD10aGlzLmdldFhGcm9tTWFwT2JqZWN0UGl4ZWwobW9QaXhl bCk7dmFyIHk9dGhpcy5nZXRZRnJvbU1hcE9iamVjdFBpeGVsKG1vUGl4ZWwpO29s UGl4ZWw9bmV3IE9wZW5MYXllcnMuUGl4ZWwoeCx5KTt9CnJldHVybiBvbFBpeGVs O30sZ2V0TWFwT2JqZWN0UGl4ZWxGcm9tT0xQaXhlbDpmdW5jdGlvbihvbFBpeGVs KXt2YXIgbW9QaXhlbD1udWxsO2lmKG9sUGl4ZWwhPW51bGwpe21vUGl4ZWw9dGhp cy5nZXRNYXBPYmplY3RQaXhlbEZyb21YWShvbFBpeGVsLngsb2xQaXhlbC55KTt9 CnJldHVybiBtb1BpeGVsO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5MYXllci5F dmVudFBhbmUifSk7T3BlbkxheWVycy5MYXllci5GaXhlZFpvb21MZXZlbHM9T3Bl bkxheWVycy5DbGFzcyh7aW5pdGlhbGl6ZTpmdW5jdGlvbigpe30saW5pdFJlc29s dXRpb25zOmZ1bmN0aW9uKCl7dmFyIHByb3BzPW5ldyBBcnJheSgnbWluWm9vbUxl dmVsJywnbWF4Wm9vbUxldmVsJywnbnVtWm9vbUxldmVscycpO2Zvcih2YXIgaT0w LGxlbj1wcm9wcy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgcHJvcGVydHk9cHJvcHNb aV07dGhpc1twcm9wZXJ0eV09KHRoaXMub3B0aW9uc1twcm9wZXJ0eV0hPW51bGwp P3RoaXMub3B0aW9uc1twcm9wZXJ0eV06dGhpcy5tYXBbcHJvcGVydHldO30KaWYo KHRoaXMubWluWm9vbUxldmVsPT1udWxsKXx8KHRoaXMubWluWm9vbUxldmVsPHRo aXMuTUlOX1pPT01fTEVWRUwpKXt0aGlzLm1pblpvb21MZXZlbD10aGlzLk1JTl9a T09NX0xFVkVMO30KdmFyIGRlc2lyZWRab29tTGV2ZWxzO3ZhciBsaW1pdFpvb21M ZXZlbHM9dGhpcy5NQVhfWk9PTV9MRVZFTC10aGlzLm1pblpvb21MZXZlbCsxO2lm KCgodGhpcy5vcHRpb25zLm51bVpvb21MZXZlbHM9PW51bGwpJiYodGhpcy5vcHRp b25zLm1heFpvb21MZXZlbCE9bnVsbCkpfHwoKHRoaXMubnVtWm9vbUxldmVscz09 bnVsbCkmJih0aGlzLm1heFpvb21MZXZlbCE9bnVsbCkpKXtkZXNpcmVkWm9vbUxl dmVscz10aGlzLm1heFpvb21MZXZlbC10aGlzLm1pblpvb21MZXZlbCsxO31lbHNl e2Rlc2lyZWRab29tTGV2ZWxzPXRoaXMubnVtWm9vbUxldmVsczt9CmlmKGRlc2ly ZWRab29tTGV2ZWxzIT1udWxsKXt0aGlzLm51bVpvb21MZXZlbHM9TWF0aC5taW4o ZGVzaXJlZFpvb21MZXZlbHMsbGltaXRab29tTGV2ZWxzKTt9ZWxzZXt0aGlzLm51 bVpvb21MZXZlbHM9bGltaXRab29tTGV2ZWxzO30KdGhpcy5tYXhab29tTGV2ZWw9 dGhpcy5taW5ab29tTGV2ZWwrdGhpcy5udW1ab29tTGV2ZWxzLTE7aWYodGhpcy5S RVNPTFVUSU9OUyE9bnVsbCl7dmFyIHJlc29sdXRpb25zSW5kZXg9MDt0aGlzLnJl c29sdXRpb25zPVtdO2Zvcih2YXIgaT10aGlzLm1pblpvb21MZXZlbDtpPD10aGlz Lm1heFpvb21MZXZlbDtpKyspe3RoaXMucmVzb2x1dGlvbnNbcmVzb2x1dGlvbnNJ bmRleCsrXT10aGlzLlJFU09MVVRJT05TW2ldO30KdGhpcy5tYXhSZXNvbHV0aW9u PXRoaXMucmVzb2x1dGlvbnNbMF07dGhpcy5taW5SZXNvbHV0aW9uPXRoaXMucmVz b2x1dGlvbnNbdGhpcy5yZXNvbHV0aW9ucy5sZW5ndGgtMV07fX0sZ2V0UmVzb2x1 dGlvbjpmdW5jdGlvbigpe2lmKHRoaXMucmVzb2x1dGlvbnMhPW51bGwpe3JldHVy biBPcGVuTGF5ZXJzLkxheWVyLnByb3RvdHlwZS5nZXRSZXNvbHV0aW9uLmFwcGx5 KHRoaXMsYXJndW1lbnRzKTt9ZWxzZXt2YXIgcmVzb2x1dGlvbj1udWxsO3ZhciB2 aWV3U2l6ZT10aGlzLm1hcC5nZXRTaXplKCk7dmFyIGV4dGVudD10aGlzLmdldEV4 dGVudCgpO2lmKCh2aWV3U2l6ZSE9bnVsbCkmJihleHRlbnQhPW51bGwpKXtyZXNv bHV0aW9uPU1hdGgubWF4KGV4dGVudC5nZXRXaWR0aCgpL3ZpZXdTaXplLncsZXh0 ZW50LmdldEhlaWdodCgpL3ZpZXdTaXplLmgpO30KcmV0dXJuIHJlc29sdXRpb247 fX0sZ2V0RXh0ZW50OmZ1bmN0aW9uKCl7dmFyIGV4dGVudD1udWxsO3ZhciBzaXpl PXRoaXMubWFwLmdldFNpemUoKTt2YXIgdGxQeD1uZXcgT3BlbkxheWVycy5QaXhl bCgwLDApO3ZhciB0bExMPXRoaXMuZ2V0TG9uTGF0RnJvbVZpZXdQb3J0UHgodGxQ eCk7dmFyIGJyUHg9bmV3IE9wZW5MYXllcnMuUGl4ZWwoc2l6ZS53LHNpemUuaCk7 dmFyIGJyTEw9dGhpcy5nZXRMb25MYXRGcm9tVmlld1BvcnRQeChiclB4KTtpZigo dGxMTCE9bnVsbCkmJihickxMIT1udWxsKSl7ZXh0ZW50PW5ldyBPcGVuTGF5ZXJz LkJvdW5kcyh0bExMLmxvbixickxMLmxhdCxickxMLmxvbix0bExMLmxhdCk7fQpy ZXR1cm4gZXh0ZW50O30sZ2V0Wm9vbUZvclJlc29sdXRpb246ZnVuY3Rpb24ocmVz b2x1dGlvbil7aWYodGhpcy5yZXNvbHV0aW9ucyE9bnVsbCl7cmV0dXJuIE9wZW5M YXllcnMuTGF5ZXIucHJvdG90eXBlLmdldFpvb21Gb3JSZXNvbHV0aW9uLmFwcGx5 KHRoaXMsYXJndW1lbnRzKTt9ZWxzZXt2YXIgZXh0ZW50PU9wZW5MYXllcnMuTGF5 ZXIucHJvdG90eXBlLmdldEV4dGVudC5hcHBseSh0aGlzLFtdKTtyZXR1cm4gdGhp cy5nZXRab29tRm9yRXh0ZW50KGV4dGVudCk7fX0sZ2V0T0xab29tRnJvbU1hcE9i amVjdFpvb206ZnVuY3Rpb24obW9ab29tKXt2YXIgem9vbT1udWxsO2lmKG1vWm9v bSE9bnVsbCl7em9vbT1tb1pvb20tdGhpcy5taW5ab29tTGV2ZWw7aWYodGhpcy5t YXAuYmFzZUxheWVyIT09dGhpcyl7em9vbT10aGlzLm1hcC5iYXNlTGF5ZXIuZ2V0 Wm9vbUZvclJlc29sdXRpb24odGhpcy5nZXRSZXNvbHV0aW9uRm9yWm9vbSh6b29t KSl9fQpyZXR1cm4gem9vbTt9LGdldE1hcE9iamVjdFpvb21Gcm9tT0xab29tOmZ1 bmN0aW9uKG9sWm9vbSl7dmFyIHpvb209bnVsbDtpZihvbFpvb20hPW51bGwpe3pv b209b2xab29tK3RoaXMubWluWm9vbUxldmVsO2lmKHRoaXMubWFwLmJhc2VMYXll ciE9PXRoaXMpe3pvb209dGhpcy5nZXRab29tRm9yUmVzb2x1dGlvbih0aGlzLm1h cC5iYXNlTGF5ZXIuZ2V0UmVzb2x1dGlvbkZvclpvb20oem9vbSkpO319CnJldHVy biB6b29tO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5MYXllci5GaXhlZFpvb21M ZXZlbHMifSk7T3BlbkxheWVycy5MYXllci5WaXJ0dWFsRWFydGg9T3BlbkxheWVy cy5DbGFzcyhPcGVuTGF5ZXJzLkxheWVyLkV2ZW50UGFuZSxPcGVuTGF5ZXJzLkxh eWVyLkZpeGVkWm9vbUxldmVscyx7TUlOX1pPT01fTEVWRUw6MSxNQVhfWk9PTV9M RVZFTDoxOSxSRVNPTFVUSU9OUzpbMS40MDYyNSwwLjcwMzEyNSwwLjM1MTU2MjUs MC4xNzU3ODEyNSwwLjA4Nzg5MDYyNSwwLjA0Mzk0NTMxMjUsMC4wMjE5NzI2NTYy NSwwLjAxMDk4NjMyODEyNSwwLjAwNTQ5MzE2NDA2MjUsMC4wMDI3NDY1ODIwMzEy NSwwLjAwMTM3MzI5MTAxNTYyNSwwLjAwMDY4NjY0NTUwNzgxMjUsMC4wMDAzNDMz MjI3NTM5MDYyNSwwLjAwMDE3MTY2MTM3Njk1MzEyNSwwLjAwMDA4NTgzMDY4ODQ3 NjU2MjUsMC4wMDAwNDI5MTUzNDQyMzgyODEyNSwwLjAwMDAyMTQ1NzY3MjExOTE0 MDYyLDAuMDAwMDEwNzI4ODM2MDU5NTcwMzEsMC4wMDAwMDUzNjQ0MTgwMjk3ODUx NV0sdHlwZTpudWxsLHdyYXBEYXRlTGluZTp0cnVlLHNwaGVyaWNhbE1lcmNhdG9y OmZhbHNlLGFuaW1hdGlvbkVuYWJsZWQ6dHJ1ZSxpbml0aWFsaXplOmZ1bmN0aW9u KG5hbWUsb3B0aW9ucyl7T3BlbkxheWVycy5MYXllci5FdmVudFBhbmUucHJvdG90 eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO09wZW5MYXllcnMu TGF5ZXIuRml4ZWRab29tTGV2ZWxzLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5 KHRoaXMsYXJndW1lbnRzKTtpZih0aGlzLnNwaGVyaWNhbE1lcmNhdG9yKXtPcGVu TGF5ZXJzLlV0aWwuZXh0ZW5kKHRoaXMsT3BlbkxheWVycy5MYXllci5TcGhlcmlj YWxNZXJjYXRvcik7dGhpcy5pbml0TWVyY2F0b3JQYXJhbWV0ZXJzKCk7fX0sbG9h ZE1hcE9iamVjdDpmdW5jdGlvbigpe3ZhciB2ZURpdj1PcGVuTGF5ZXJzLlV0aWwu Y3JlYXRlRGl2KHRoaXMubmFtZSk7dmFyIHN6PXRoaXMubWFwLmdldFNpemUoKTt2 ZURpdi5zdHlsZS53aWR0aD1zei53KyJweCI7dmVEaXYuc3R5bGUuaGVpZ2h0PXN6 LmgrInB4Ijt0aGlzLmRpdi5hcHBlbmRDaGlsZCh2ZURpdik7dHJ5e3RoaXMubWFw T2JqZWN0PW5ldyBWRU1hcCh0aGlzLm5hbWUpO31jYXRjaChlKXt9CmlmKHRoaXMu bWFwT2JqZWN0IT1udWxsKXt0cnl7dGhpcy5tYXBPYmplY3QuTG9hZE1hcChudWxs LG51bGwsdGhpcy50eXBlLHRydWUpO3RoaXMubWFwT2JqZWN0LkF0dGFjaEV2ZW50 KCJvbm1vdXNlZG93biIsT3BlbkxheWVycy5GdW5jdGlvbi5UcnVlKTt9Y2F0Y2go ZSl7fQp0aGlzLm1hcE9iamVjdC5IaWRlRGFzaGJvYXJkKCk7aWYodHlwZW9mIHRo aXMubWFwT2JqZWN0LlNldEFuaW1hdGlvbkVuYWJsZWQ9PSJmdW5jdGlvbiIpe3Ro aXMubWFwT2JqZWN0LlNldEFuaW1hdGlvbkVuYWJsZWQodGhpcy5hbmltYXRpb25F bmFibGVkKTt9fQppZighdGhpcy5tYXBPYmplY3R8fCF0aGlzLm1hcE9iamVjdC52 ZW1hcGNvbnRyb2x8fCF0aGlzLm1hcE9iamVjdC52ZW1hcGNvbnRyb2wuUGFuTWFw fHwodHlwZW9mIHRoaXMubWFwT2JqZWN0LnZlbWFwY29udHJvbC5QYW5NYXAhPSJm dW5jdGlvbiIpKXt0aGlzLmRyYWdQYW5NYXBPYmplY3Q9bnVsbDt9fSxvbk1hcFJl c2l6ZTpmdW5jdGlvbigpe3RoaXMubWFwT2JqZWN0LlJlc2l6ZSh0aGlzLm1hcC5z aXplLncsdGhpcy5tYXAuc2l6ZS5oKTt9LGdldFdhcm5pbmdIVE1MOmZ1bmN0aW9u KCl7cmV0dXJuIE9wZW5MYXllcnMuaTE4bigiZ2V0TGF5ZXJXYXJuaW5nIix7J2xh eWVyVHlwZSc6J1ZFJywnbGF5ZXJMaWInOidWaXJ0dWFsRWFydGgnfSk7fSxzZXRN YXBPYmplY3RDZW50ZXI6ZnVuY3Rpb24oY2VudGVyLHpvb20pe3RoaXMubWFwT2Jq ZWN0LlNldENlbnRlckFuZFpvb20oY2VudGVyLHpvb20pO30sZ2V0TWFwT2JqZWN0 Q2VudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwT2JqZWN0LkdldENlbnRl cigpO30sZHJhZ1Bhbk1hcE9iamVjdDpmdW5jdGlvbihkWCxkWSl7dGhpcy5tYXBP YmplY3QudmVtYXBjb250cm9sLlBhbk1hcChkWCwtZFkpO30sZ2V0TWFwT2JqZWN0 Wm9vbTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcE9iamVjdC5HZXRab29tTGV2 ZWwoKTt9LGdldE1hcE9iamVjdExvbkxhdEZyb21NYXBPYmplY3RQaXhlbDpmdW5j dGlvbihtb1BpeGVsKXtyZXR1cm4odHlwZW9mIFZFUGl4ZWwhPSd1bmRlZmluZWQn KT90aGlzLm1hcE9iamVjdC5QaXhlbFRvTGF0TG9uZyhtb1BpeGVsKTp0aGlzLm1h cE9iamVjdC5QaXhlbFRvTGF0TG9uZyhtb1BpeGVsLngsbW9QaXhlbC55KTt9LGdl dE1hcE9iamVjdFBpeGVsRnJvbU1hcE9iamVjdExvbkxhdDpmdW5jdGlvbihtb0xv bkxhdCl7cmV0dXJuIHRoaXMubWFwT2JqZWN0LkxhdExvbmdUb1BpeGVsKG1vTG9u TGF0KTt9LGdldExvbmdpdHVkZUZyb21NYXBPYmplY3RMb25MYXQ6ZnVuY3Rpb24o bW9Mb25MYXQpe3JldHVybiB0aGlzLnNwaGVyaWNhbE1lcmNhdG9yP3RoaXMuZm9y d2FyZE1lcmNhdG9yKG1vTG9uTGF0LkxvbmdpdHVkZSxtb0xvbkxhdC5MYXRpdHVk ZSkubG9uOm1vTG9uTGF0LkxvbmdpdHVkZTt9LGdldExhdGl0dWRlRnJvbU1hcE9i amVjdExvbkxhdDpmdW5jdGlvbihtb0xvbkxhdCl7cmV0dXJuIHRoaXMuc3BoZXJp Y2FsTWVyY2F0b3I/dGhpcy5mb3J3YXJkTWVyY2F0b3IobW9Mb25MYXQuTG9uZ2l0 dWRlLG1vTG9uTGF0LkxhdGl0dWRlKS5sYXQ6bW9Mb25MYXQuTGF0aXR1ZGU7fSxn ZXRNYXBPYmplY3RMb25MYXRGcm9tTG9uTGF0OmZ1bmN0aW9uKGxvbixsYXQpe3Zh ciB2ZUxhdExvbmc7aWYodGhpcy5zcGhlcmljYWxNZXJjYXRvcil7dmFyIGxvbmxh dD10aGlzLmludmVyc2VNZXJjYXRvcihsb24sbGF0KTt2ZUxhdExvbmc9bmV3IFZF TGF0TG9uZyhsb25sYXQubGF0LGxvbmxhdC5sb24pO31lbHNle3ZlTGF0TG9uZz1u ZXcgVkVMYXRMb25nKGxhdCxsb24pO30KcmV0dXJuIHZlTGF0TG9uZzt9LGdldFhG cm9tTWFwT2JqZWN0UGl4ZWw6ZnVuY3Rpb24obW9QaXhlbCl7cmV0dXJuIG1vUGl4 ZWwueDt9LGdldFlGcm9tTWFwT2JqZWN0UGl4ZWw6ZnVuY3Rpb24obW9QaXhlbCl7 cmV0dXJuIG1vUGl4ZWwueTt9LGdldE1hcE9iamVjdFBpeGVsRnJvbVhZOmZ1bmN0 aW9uKHgseSl7cmV0dXJuKHR5cGVvZiBWRVBpeGVsIT0ndW5kZWZpbmVkJyk/bmV3 IFZFUGl4ZWwoeCx5KTpuZXcgTXNuLlZFLlBpeGVsKHgseSk7fSxDTEFTU19OQU1F OiJPcGVuTGF5ZXJzLkxheWVyLlZpcnR1YWxFYXJ0aCJ9KTtPcGVuTGF5ZXJzLkNv bnRyb2w9T3BlbkxheWVycy5DbGFzcyh7aWQ6bnVsbCxtYXA6bnVsbCxkaXY6bnVs bCx0eXBlOm51bGwsYWxsb3dTZWxlY3Rpb246ZmFsc2UsZGlzcGxheUNsYXNzOiIi LHRpdGxlOiIiLGF1dG9BY3RpdmF0ZTpmYWxzZSxhY3RpdmU6bnVsbCxoYW5kbGVy Om51bGwsZXZlbnRMaXN0ZW5lcnM6bnVsbCxldmVudHM6bnVsbCxFVkVOVF9UWVBF UzpbImFjdGl2YXRlIiwiZGVhY3RpdmF0ZSJdLGluaXRpYWxpemU6ZnVuY3Rpb24o b3B0aW9ucyl7dGhpcy5kaXNwbGF5Q2xhc3M9dGhpcy5DTEFTU19OQU1FLnJlcGxh Y2UoIk9wZW5MYXllcnMuIiwib2wiKS5yZXBsYWNlKC9cLi9nLCIiKTtPcGVuTGF5 ZXJzLlV0aWwuZXh0ZW5kKHRoaXMsb3B0aW9ucyk7dGhpcy5ldmVudHM9bmV3IE9w ZW5MYXllcnMuRXZlbnRzKHRoaXMsbnVsbCx0aGlzLkVWRU5UX1RZUEVTKTtpZih0 aGlzLmV2ZW50TGlzdGVuZXJzIGluc3RhbmNlb2YgT2JqZWN0KXt0aGlzLmV2ZW50 cy5vbih0aGlzLmV2ZW50TGlzdGVuZXJzKTt9CmlmKHRoaXMuaWQ9PW51bGwpe3Ro aXMuaWQ9T3BlbkxheWVycy5VdGlsLmNyZWF0ZVVuaXF1ZUlEKHRoaXMuQ0xBU1Nf TkFNRSsiXyIpO319LGRlc3Ryb3k6ZnVuY3Rpb24oKXtpZih0aGlzLmV2ZW50cyl7 aWYodGhpcy5ldmVudExpc3RlbmVycyl7dGhpcy5ldmVudHMudW4odGhpcy5ldmVu dExpc3RlbmVycyk7fQp0aGlzLmV2ZW50cy5kZXN0cm95KCk7dGhpcy5ldmVudHM9 bnVsbDt9CnRoaXMuZXZlbnRMaXN0ZW5lcnM9bnVsbDtpZih0aGlzLmhhbmRsZXIp e3RoaXMuaGFuZGxlci5kZXN0cm95KCk7dGhpcy5oYW5kbGVyPW51bGw7fQppZih0 aGlzLmhhbmRsZXJzKXtmb3IodmFyIGtleSBpbiB0aGlzLmhhbmRsZXJzKXtpZih0 aGlzLmhhbmRsZXJzLmhhc093blByb3BlcnR5KGtleSkmJnR5cGVvZiB0aGlzLmhh bmRsZXJzW2tleV0uZGVzdHJveT09ImZ1bmN0aW9uIil7dGhpcy5oYW5kbGVyc1tr ZXldLmRlc3Ryb3koKTt9fQp0aGlzLmhhbmRsZXJzPW51bGw7fQppZih0aGlzLm1h cCl7dGhpcy5tYXAucmVtb3ZlQ29udHJvbCh0aGlzKTt0aGlzLm1hcD1udWxsO30K dGhpcy5kaXY9bnVsbDt9LHNldE1hcDpmdW5jdGlvbihtYXApe3RoaXMubWFwPW1h cDtpZih0aGlzLmhhbmRsZXIpe3RoaXMuaGFuZGxlci5zZXRNYXAobWFwKTt9fSxk cmF3OmZ1bmN0aW9uKHB4KXtpZih0aGlzLmRpdj09bnVsbCl7dGhpcy5kaXY9T3Bl bkxheWVycy5VdGlsLmNyZWF0ZURpdih0aGlzLmlkKTt0aGlzLmRpdi5jbGFzc05h bWU9dGhpcy5kaXNwbGF5Q2xhc3M7aWYoIXRoaXMuYWxsb3dTZWxlY3Rpb24pe3Ro aXMuZGl2LmNsYXNzTmFtZSs9IiBvbENvbnRyb2xOb1NlbGVjdCI7dGhpcy5kaXYu c2V0QXR0cmlidXRlKCJ1bnNlbGVjdGFibGUiLCJvbiIsMCk7dGhpcy5kaXYub25z ZWxlY3RzdGFydD1PcGVuTGF5ZXJzLkZ1bmN0aW9uLkZhbHNlO30KaWYodGhpcy50 aXRsZSE9IiIpe3RoaXMuZGl2LnRpdGxlPXRoaXMudGl0bGU7fX0KaWYocHghPW51 bGwpe3RoaXMucG9zaXRpb249cHguY2xvbmUoKTt9CnRoaXMubW92ZVRvKHRoaXMu cG9zaXRpb24pO3JldHVybiB0aGlzLmRpdjt9LG1vdmVUbzpmdW5jdGlvbihweCl7 aWYoKHB4IT1udWxsKSYmKHRoaXMuZGl2IT1udWxsKSl7dGhpcy5kaXYuc3R5bGUu bGVmdD1weC54KyJweCI7dGhpcy5kaXYuc3R5bGUudG9wPXB4LnkrInB4Ijt9fSxh Y3RpdmF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXtyZXR1cm4gZmFsc2U7 fQppZih0aGlzLmhhbmRsZXIpe3RoaXMuaGFuZGxlci5hY3RpdmF0ZSgpO30KdGhp cy5hY3RpdmU9dHJ1ZTtpZih0aGlzLm1hcCl7T3BlbkxheWVycy5FbGVtZW50LmFk ZENsYXNzKHRoaXMubWFwLnZpZXdQb3J0RGl2LHRoaXMuZGlzcGxheUNsYXNzLnJl cGxhY2UoLyAvZywiIikrIkFjdGl2ZSIpO30KdGhpcy5ldmVudHMudHJpZ2dlckV2 ZW50KCJhY3RpdmF0ZSIpO3JldHVybiB0cnVlO30sZGVhY3RpdmF0ZTpmdW5jdGlv bigpe2lmKHRoaXMuYWN0aXZlKXtpZih0aGlzLmhhbmRsZXIpe3RoaXMuaGFuZGxl ci5kZWFjdGl2YXRlKCk7fQp0aGlzLmFjdGl2ZT1mYWxzZTtpZih0aGlzLm1hcCl7 T3BlbkxheWVycy5FbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMubWFwLnZpZXdQb3J0 RGl2LHRoaXMuZGlzcGxheUNsYXNzLnJlcGxhY2UoLyAvZywiIikrIkFjdGl2ZSIp O30KdGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJkZWFjdGl2YXRlIik7cmV0dXJu IHRydWU7fQpyZXR1cm4gZmFsc2U7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkNv bnRyb2wifSk7T3BlbkxheWVycy5Db250cm9sLlRZUEVfQlVUVE9OPTE7T3Blbkxh eWVycy5Db250cm9sLlRZUEVfVE9HR0xFPTI7T3BlbkxheWVycy5Db250cm9sLlRZ UEVfVE9PTD0zO09wZW5MYXllcnMuQ29udHJvbC5PdmVydmlld01hcD1PcGVuTGF5 ZXJzLkNsYXNzKE9wZW5MYXllcnMuQ29udHJvbCx7ZWxlbWVudDpudWxsLG92bWFw Om51bGwsc2l6ZTpuZXcgT3BlbkxheWVycy5TaXplKDE4MCw5MCksbGF5ZXJzOm51 bGwsbWluUmVjdFNpemU6MTUsbWluUmVjdERpc3BsYXlDbGFzczoiUmVjdFJlcGxh Y2VtZW50IixtaW5SYXRpbzo4LG1heFJhdGlvOjMyLG1hcE9wdGlvbnM6bnVsbCxh dXRvUGFuOmZhbHNlLGhhbmRsZXJzOm51bGwscmVzb2x1dGlvbkZhY3RvcjoxLG1h eGltaXplZDpmYWxzZSxpbml0aWFsaXplOmZ1bmN0aW9uKG9wdGlvbnMpe3RoaXMu bGF5ZXJzPVtdO3RoaXMuaGFuZGxlcnM9e307T3BlbkxheWVycy5Db250cm9sLnBy b3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW29wdGlvbnNdKTt9LGRlc3Ry b3k6ZnVuY3Rpb24oKXtpZighdGhpcy5tYXBEaXYpe3JldHVybjt9CmlmKHRoaXMu aGFuZGxlcnMuY2xpY2spe3RoaXMuaGFuZGxlcnMuY2xpY2suZGVzdHJveSgpO30K aWYodGhpcy5oYW5kbGVycy5kcmFnKXt0aGlzLmhhbmRsZXJzLmRyYWcuZGVzdHJv eSgpO30KdGhpcy5vdm1hcCYmdGhpcy5vdm1hcC5ldmVudHNEaXYucmVtb3ZlQ2hp bGQodGhpcy5leHRlbnRSZWN0YW5nbGUpO3RoaXMuZXh0ZW50UmVjdGFuZ2xlPW51 bGw7aWYodGhpcy5yZWN0RXZlbnRzKXt0aGlzLnJlY3RFdmVudHMuZGVzdHJveSgp O3RoaXMucmVjdEV2ZW50cz1udWxsO30KaWYodGhpcy5vdm1hcCl7dGhpcy5vdm1h cC5kZXN0cm95KCk7dGhpcy5vdm1hcD1udWxsO30KdGhpcy5lbGVtZW50LnJlbW92 ZUNoaWxkKHRoaXMubWFwRGl2KTt0aGlzLm1hcERpdj1udWxsO3RoaXMuZGl2LnJl bW92ZUNoaWxkKHRoaXMuZWxlbWVudCk7dGhpcy5lbGVtZW50PW51bGw7aWYodGhp cy5tYXhpbWl6ZURpdil7T3BlbkxheWVycy5FdmVudC5zdG9wT2JzZXJ2aW5nRWxl bWVudCh0aGlzLm1heGltaXplRGl2KTt0aGlzLmRpdi5yZW1vdmVDaGlsZCh0aGlz Lm1heGltaXplRGl2KTt0aGlzLm1heGltaXplRGl2PW51bGw7fQppZih0aGlzLm1p bmltaXplRGl2KXtPcGVuTGF5ZXJzLkV2ZW50LnN0b3BPYnNlcnZpbmdFbGVtZW50 KHRoaXMubWluaW1pemVEaXYpO3RoaXMuZGl2LnJlbW92ZUNoaWxkKHRoaXMubWlu aW1pemVEaXYpO3RoaXMubWluaW1pemVEaXY9bnVsbDt9CnRoaXMubWFwLmV2ZW50 cy51bih7Im1vdmVlbmQiOnRoaXMudXBkYXRlLCJjaGFuZ2ViYXNlbGF5ZXIiOnRo aXMuYmFzZUxheWVyRHJhdyxzY29wZTp0aGlzfSk7T3BlbkxheWVycy5Db250cm9s LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LGRyYXc6 ZnVuY3Rpb24oKXtPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90eXBlLmRyYXcuYXBw bHkodGhpcyxhcmd1bWVudHMpO2lmKCEodGhpcy5sYXllcnMubGVuZ3RoPjApKXtp Zih0aGlzLm1hcC5iYXNlTGF5ZXIpe3ZhciBsYXllcj10aGlzLm1hcC5iYXNlTGF5 ZXIuY2xvbmUoKTt0aGlzLmxheWVycz1bbGF5ZXJdO31lbHNle3RoaXMubWFwLmV2 ZW50cy5yZWdpc3RlcigiY2hhbmdlYmFzZWxheWVyIix0aGlzLHRoaXMuYmFzZUxh eWVyRHJhdyk7cmV0dXJuIHRoaXMuZGl2O319CnRoaXMuZWxlbWVudD1kb2N1bWVu dC5jcmVhdGVFbGVtZW50KCdkaXYnKTt0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPXRo aXMuZGlzcGxheUNsYXNzKydFbGVtZW50Jzt0aGlzLmVsZW1lbnQuc3R5bGUuZGlz cGxheT0nbm9uZSc7dGhpcy5tYXBEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn ZGl2Jyk7dGhpcy5tYXBEaXYuc3R5bGUud2lkdGg9dGhpcy5zaXplLncrJ3B4Jzt0 aGlzLm1hcERpdi5zdHlsZS5oZWlnaHQ9dGhpcy5zaXplLmgrJ3B4Jzt0aGlzLm1h cERpdi5zdHlsZS5wb3NpdGlvbj0ncmVsYXRpdmUnO3RoaXMubWFwRGl2LnN0eWxl Lm92ZXJmbG93PSdoaWRkZW4nO3RoaXMubWFwRGl2LmlkPU9wZW5MYXllcnMuVXRp bC5jcmVhdGVVbmlxdWVJRCgnb3ZlcnZpZXdNYXAnKTt0aGlzLmV4dGVudFJlY3Rh bmdsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTt0aGlzLmV4dGVudFJl Y3RhbmdsZS5zdHlsZS5wb3NpdGlvbj0nYWJzb2x1dGUnO3RoaXMuZXh0ZW50UmVj dGFuZ2xlLnN0eWxlLnpJbmRleD0xMDAwO3RoaXMuZXh0ZW50UmVjdGFuZ2xlLmNs YXNzTmFtZT10aGlzLmRpc3BsYXlDbGFzcysnRXh0ZW50UmVjdGFuZ2xlJzt0aGlz LmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5tYXBEaXYpO3RoaXMuZGl2LmFwcGVu ZENoaWxkKHRoaXMuZWxlbWVudCk7aWYoIXRoaXMub3V0c2lkZVZpZXdwb3J0KXt0 aGlzLmRpdi5jbGFzc05hbWUrPSIgIit0aGlzLmRpc3BsYXlDbGFzcysnQ29udGFp bmVyJzt2YXIgaW1nTG9jYXRpb249T3BlbkxheWVycy5VdGlsLmdldEltYWdlc0xv Y2F0aW9uKCk7dmFyIGltZz1pbWdMb2NhdGlvbisnbGF5ZXItc3dpdGNoZXItbWF4 aW1pemUucG5nJzt0aGlzLm1heGltaXplRGl2PU9wZW5MYXllcnMuVXRpbC5jcmVh dGVBbHBoYUltYWdlRGl2KHRoaXMuZGlzcGxheUNsYXNzKydNYXhpbWl6ZUJ1dHRv bicsbnVsbCxuZXcgT3BlbkxheWVycy5TaXplKDE4LDE4KSxpbWcsJ2Fic29sdXRl Jyk7dGhpcy5tYXhpbWl6ZURpdi5zdHlsZS5kaXNwbGF5PSdub25lJzt0aGlzLm1h eGltaXplRGl2LmNsYXNzTmFtZT10aGlzLmRpc3BsYXlDbGFzcysnTWF4aW1pemVC dXR0b24nO09wZW5MYXllcnMuRXZlbnQub2JzZXJ2ZSh0aGlzLm1heGltaXplRGl2 LCdjbGljaycsT3BlbkxheWVycy5GdW5jdGlvbi5iaW5kQXNFdmVudExpc3RlbmVy KHRoaXMubWF4aW1pemVDb250cm9sLHRoaXMpKTt0aGlzLmRpdi5hcHBlbmRDaGls ZCh0aGlzLm1heGltaXplRGl2KTt2YXIgaW1nPWltZ0xvY2F0aW9uKydsYXllci1z d2l0Y2hlci1taW5pbWl6ZS5wbmcnO3RoaXMubWluaW1pemVEaXY9T3BlbkxheWVy cy5VdGlsLmNyZWF0ZUFscGhhSW1hZ2VEaXYoJ09wZW5MYXllcnNfQ29udHJvbF9t aW5pbWl6ZURpdicsbnVsbCxuZXcgT3BlbkxheWVycy5TaXplKDE4LDE4KSxpbWcs J2Fic29sdXRlJyk7dGhpcy5taW5pbWl6ZURpdi5zdHlsZS5kaXNwbGF5PSdub25l Jzt0aGlzLm1pbmltaXplRGl2LmNsYXNzTmFtZT10aGlzLmRpc3BsYXlDbGFzcysn TWluaW1pemVCdXR0b24nO09wZW5MYXllcnMuRXZlbnQub2JzZXJ2ZSh0aGlzLm1p bmltaXplRGl2LCdjbGljaycsT3BlbkxheWVycy5GdW5jdGlvbi5iaW5kQXNFdmVu dExpc3RlbmVyKHRoaXMubWluaW1pemVDb250cm9sLHRoaXMpKTt0aGlzLmRpdi5h cHBlbmRDaGlsZCh0aGlzLm1pbmltaXplRGl2KTt2YXIgZXZlbnRzVG9TdG9wPVsn ZGJsY2xpY2snLCdtb3VzZWRvd24nXTtmb3IodmFyIGk9MCxsZW49ZXZlbnRzVG9T dG9wLmxlbmd0aDtpPGxlbjtpKyspe09wZW5MYXllcnMuRXZlbnQub2JzZXJ2ZSh0 aGlzLm1heGltaXplRGl2LGV2ZW50c1RvU3RvcFtpXSxPcGVuTGF5ZXJzLkV2ZW50 LnN0b3ApO09wZW5MYXllcnMuRXZlbnQub2JzZXJ2ZSh0aGlzLm1pbmltaXplRGl2 LGV2ZW50c1RvU3RvcFtpXSxPcGVuTGF5ZXJzLkV2ZW50LnN0b3ApO30KdGhpcy5t aW5pbWl6ZUNvbnRyb2woKTt9ZWxzZXt0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxh eT0nJzt9CmlmKHRoaXMubWFwLmdldEV4dGVudCgpKXt0aGlzLnVwZGF0ZSgpO30K dGhpcy5tYXAuZXZlbnRzLnJlZ2lzdGVyKCdtb3ZlZW5kJyx0aGlzLHRoaXMudXBk YXRlKTtpZih0aGlzLm1heGltaXplZCl7dGhpcy5tYXhpbWl6ZUNvbnRyb2woKTt9 CnJldHVybiB0aGlzLmRpdjt9LGJhc2VMYXllckRyYXc6ZnVuY3Rpb24oKXt0aGlz LmRyYXcoKTt0aGlzLm1hcC5ldmVudHMudW5yZWdpc3RlcigiY2hhbmdlYmFzZWxh eWVyIix0aGlzLHRoaXMuYmFzZUxheWVyRHJhdyk7fSxyZWN0RHJhZzpmdW5jdGlv bihweCl7dmFyIGRlbHRhWD10aGlzLmhhbmRsZXJzLmRyYWcubGFzdC54LXB4Lng7 dmFyIGRlbHRhWT10aGlzLmhhbmRsZXJzLmRyYWcubGFzdC55LXB4Lnk7aWYoZGVs dGFYIT0wfHxkZWx0YVkhPTApe3ZhciByZWN0VG9wPXRoaXMucmVjdFB4Qm91bmRz LnRvcDt2YXIgcmVjdExlZnQ9dGhpcy5yZWN0UHhCb3VuZHMubGVmdDt2YXIgcmVj dEhlaWdodD1NYXRoLmFicyh0aGlzLnJlY3RQeEJvdW5kcy5nZXRIZWlnaHQoKSk7 dmFyIHJlY3RXaWR0aD10aGlzLnJlY3RQeEJvdW5kcy5nZXRXaWR0aCgpO3ZhciBu ZXdUb3A9TWF0aC5tYXgoMCwocmVjdFRvcC1kZWx0YVkpKTtuZXdUb3A9TWF0aC5t aW4obmV3VG9wLHRoaXMub3ZtYXAuc2l6ZS5oLXRoaXMuaENvbXAtcmVjdEhlaWdo dCk7dmFyIG5ld0xlZnQ9TWF0aC5tYXgoMCwocmVjdExlZnQtZGVsdGFYKSk7bmV3 TGVmdD1NYXRoLm1pbihuZXdMZWZ0LHRoaXMub3ZtYXAuc2l6ZS53LXRoaXMud0Nv bXAtcmVjdFdpZHRoKTt0aGlzLnNldFJlY3RQeEJvdW5kcyhuZXcgT3BlbkxheWVy cy5Cb3VuZHMobmV3TGVmdCxuZXdUb3ArcmVjdEhlaWdodCxuZXdMZWZ0K3JlY3RX aWR0aCxuZXdUb3ApKTt9fSxtYXBEaXZDbGljazpmdW5jdGlvbihldnQpe3ZhciBw eENlbnRlcj10aGlzLnJlY3RQeEJvdW5kcy5nZXRDZW50ZXJQaXhlbCgpO3ZhciBk ZWx0YVg9ZXZ0Lnh5LngtcHhDZW50ZXIueDt2YXIgZGVsdGFZPWV2dC54eS55LXB4 Q2VudGVyLnk7dmFyIHRvcD10aGlzLnJlY3RQeEJvdW5kcy50b3A7dmFyIGxlZnQ9 dGhpcy5yZWN0UHhCb3VuZHMubGVmdDt2YXIgaGVpZ2h0PU1hdGguYWJzKHRoaXMu cmVjdFB4Qm91bmRzLmdldEhlaWdodCgpKTt2YXIgd2lkdGg9dGhpcy5yZWN0UHhC b3VuZHMuZ2V0V2lkdGgoKTt2YXIgbmV3VG9wPU1hdGgubWF4KDAsKHRvcCtkZWx0 YVkpKTtuZXdUb3A9TWF0aC5taW4obmV3VG9wLHRoaXMub3ZtYXAuc2l6ZS5oLWhl aWdodCk7dmFyIG5ld0xlZnQ9TWF0aC5tYXgoMCwobGVmdCtkZWx0YVgpKTtuZXdM ZWZ0PU1hdGgubWluKG5ld0xlZnQsdGhpcy5vdm1hcC5zaXplLnctd2lkdGgpO3Ro aXMuc2V0UmVjdFB4Qm91bmRzKG5ldyBPcGVuTGF5ZXJzLkJvdW5kcyhuZXdMZWZ0 LG5ld1RvcCtoZWlnaHQsbmV3TGVmdCt3aWR0aCxuZXdUb3ApKTt0aGlzLnVwZGF0 ZU1hcFRvUmVjdCgpO30sbWF4aW1pemVDb250cm9sOmZ1bmN0aW9uKGUpe3RoaXMu ZWxlbWVudC5zdHlsZS5kaXNwbGF5PScnO3RoaXMuc2hvd1RvZ2dsZShmYWxzZSk7 aWYoZSE9bnVsbCl7T3BlbkxheWVycy5FdmVudC5zdG9wKGUpO319LG1pbmltaXpl Q29udHJvbDpmdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheT0n bm9uZSc7dGhpcy5zaG93VG9nZ2xlKHRydWUpO2lmKGUhPW51bGwpe09wZW5MYXll cnMuRXZlbnQuc3RvcChlKTt9fSxzaG93VG9nZ2xlOmZ1bmN0aW9uKG1pbmltaXpl KXt0aGlzLm1heGltaXplRGl2LnN0eWxlLmRpc3BsYXk9bWluaW1pemU/Jyc6J25v bmUnO3RoaXMubWluaW1pemVEaXYuc3R5bGUuZGlzcGxheT1taW5pbWl6ZT8nbm9u ZSc6Jyc7fSx1cGRhdGU6ZnVuY3Rpb24oKXtpZih0aGlzLm92bWFwPT1udWxsKXt0 aGlzLmNyZWF0ZU1hcCgpO30KaWYodGhpcy5hdXRvUGFufHwhdGhpcy5pc1N1aXRh YmxlT3ZlcnZpZXcoKSl7dGhpcy51cGRhdGVPdmVydmlldygpO30KdGhpcy51cGRh dGVSZWN0VG9NYXAoKTt9LGlzU3VpdGFibGVPdmVydmlldzpmdW5jdGlvbigpe3Zh ciBtYXBFeHRlbnQ9dGhpcy5tYXAuZ2V0RXh0ZW50KCk7dmFyIG1heEV4dGVudD10 aGlzLm1hcC5tYXhFeHRlbnQ7dmFyIHRlc3RFeHRlbnQ9bmV3IE9wZW5MYXllcnMu Qm91bmRzKE1hdGgubWF4KG1hcEV4dGVudC5sZWZ0LG1heEV4dGVudC5sZWZ0KSxN YXRoLm1heChtYXBFeHRlbnQuYm90dG9tLG1heEV4dGVudC5ib3R0b20pLE1hdGgu bWluKG1hcEV4dGVudC5yaWdodCxtYXhFeHRlbnQucmlnaHQpLE1hdGgubWluKG1h cEV4dGVudC50b3AsbWF4RXh0ZW50LnRvcCkpO2lmKHRoaXMub3ZtYXAuZ2V0UHJv amVjdGlvbigpIT10aGlzLm1hcC5nZXRQcm9qZWN0aW9uKCkpe3Rlc3RFeHRlbnQ9 dGVzdEV4dGVudC50cmFuc2Zvcm0odGhpcy5tYXAuZ2V0UHJvamVjdGlvbk9iamVj dCgpLHRoaXMub3ZtYXAuZ2V0UHJvamVjdGlvbk9iamVjdCgpKTt9CnZhciByZXNS YXRpbz10aGlzLm92bWFwLmdldFJlc29sdXRpb24oKS90aGlzLm1hcC5nZXRSZXNv bHV0aW9uKCk7cmV0dXJuKChyZXNSYXRpbz50aGlzLm1pblJhdGlvKSYmKHJlc1Jh dGlvPD10aGlzLm1heFJhdGlvKSYmKHRoaXMub3ZtYXAuZ2V0RXh0ZW50KCkuY29u dGFpbnNCb3VuZHModGVzdEV4dGVudCkpKTt9LHVwZGF0ZU92ZXJ2aWV3OmZ1bmN0 aW9uKCl7dmFyIG1hcFJlcz10aGlzLm1hcC5nZXRSZXNvbHV0aW9uKCk7dmFyIHRh cmdldFJlcz10aGlzLm92bWFwLmdldFJlc29sdXRpb24oKTt2YXIgcmVzUmF0aW89 dGFyZ2V0UmVzL21hcFJlcztpZihyZXNSYXRpbz50aGlzLm1heFJhdGlvKXt0YXJn ZXRSZXM9dGhpcy5taW5SYXRpbyptYXBSZXM7fWVsc2UgaWYocmVzUmF0aW88PXRo aXMubWluUmF0aW8pe3RhcmdldFJlcz10aGlzLm1heFJhdGlvKm1hcFJlczt9CnZh ciBjZW50ZXI7aWYodGhpcy5vdm1hcC5nZXRQcm9qZWN0aW9uKCkhPXRoaXMubWFw LmdldFByb2plY3Rpb24oKSl7Y2VudGVyPXRoaXMubWFwLmNlbnRlci5jbG9uZSgp O2NlbnRlci50cmFuc2Zvcm0odGhpcy5tYXAuZ2V0UHJvamVjdGlvbk9iamVjdCgp LHRoaXMub3ZtYXAuZ2V0UHJvamVjdGlvbk9iamVjdCgpKTt9ZWxzZXtjZW50ZXI9 dGhpcy5tYXAuY2VudGVyO30KdGhpcy5vdm1hcC5zZXRDZW50ZXIoY2VudGVyLHRo aXMub3ZtYXAuZ2V0Wm9vbUZvclJlc29sdXRpb24odGFyZ2V0UmVzKnRoaXMucmVz b2x1dGlvbkZhY3RvcikpO3RoaXMudXBkYXRlUmVjdFRvTWFwKCk7fSxjcmVhdGVN YXA6ZnVuY3Rpb24oKXt2YXIgb3B0aW9ucz1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5k KHtjb250cm9sczpbXSxtYXhSZXNvbHV0aW9uOidhdXRvJyxmYWxsVGhyb3VnaDpm YWxzZX0sdGhpcy5tYXBPcHRpb25zKTt0aGlzLm92bWFwPW5ldyBPcGVuTGF5ZXJz Lk1hcCh0aGlzLm1hcERpdixvcHRpb25zKTt0aGlzLm92bWFwLmV2ZW50c0Rpdi5h cHBlbmRDaGlsZCh0aGlzLmV4dGVudFJlY3RhbmdsZSk7T3BlbkxheWVycy5FdmVu dC5zdG9wT2JzZXJ2aW5nKHdpbmRvdywndW5sb2FkJyx0aGlzLm92bWFwLnVubG9h ZERlc3Ryb3kpO3RoaXMub3ZtYXAuYWRkTGF5ZXJzKHRoaXMubGF5ZXJzKTt0aGlz Lm92bWFwLnpvb21Ub01heEV4dGVudCgpO3RoaXMud0NvbXA9cGFyc2VJbnQoT3Bl bkxheWVycy5FbGVtZW50LmdldFN0eWxlKHRoaXMuZXh0ZW50UmVjdGFuZ2xlLCdi b3JkZXItbGVmdC13aWR0aCcpKSsKcGFyc2VJbnQoT3BlbkxheWVycy5FbGVtZW50 LmdldFN0eWxlKHRoaXMuZXh0ZW50UmVjdGFuZ2xlLCdib3JkZXItcmlnaHQtd2lk dGgnKSk7dGhpcy53Q29tcD0odGhpcy53Q29tcCk/dGhpcy53Q29tcDoyO3RoaXMu aENvbXA9cGFyc2VJbnQoT3BlbkxheWVycy5FbGVtZW50LmdldFN0eWxlKHRoaXMu ZXh0ZW50UmVjdGFuZ2xlLCdib3JkZXItdG9wLXdpZHRoJykpKwpwYXJzZUludChP cGVuTGF5ZXJzLkVsZW1lbnQuZ2V0U3R5bGUodGhpcy5leHRlbnRSZWN0YW5nbGUs J2JvcmRlci1ib3R0b20td2lkdGgnKSk7dGhpcy5oQ29tcD0odGhpcy5oQ29tcCk/ dGhpcy5oQ29tcDoyO3RoaXMuaGFuZGxlcnMuZHJhZz1uZXcgT3BlbkxheWVycy5I YW5kbGVyLkRyYWcodGhpcyx7bW92ZTp0aGlzLnJlY3REcmFnLGRvbmU6dGhpcy51 cGRhdGVNYXBUb1JlY3R9LHttYXA6dGhpcy5vdm1hcH0pO3RoaXMuaGFuZGxlcnMu Y2xpY2s9bmV3IE9wZW5MYXllcnMuSGFuZGxlci5DbGljayh0aGlzLHsiY2xpY2si OnRoaXMubWFwRGl2Q2xpY2t9LHsic2luZ2xlIjp0cnVlLCJkb3VibGUiOmZhbHNl LCJzdG9wU2luZ2xlIjp0cnVlLCJzdG9wRG91YmxlIjp0cnVlLCJwaXhlbFRvbGVy YW5jZSI6MSxtYXA6dGhpcy5vdm1hcH0pO3RoaXMuaGFuZGxlcnMuY2xpY2suYWN0 aXZhdGUoKTt0aGlzLnJlY3RFdmVudHM9bmV3IE9wZW5MYXllcnMuRXZlbnRzKHRo aXMsdGhpcy5leHRlbnRSZWN0YW5nbGUsbnVsbCx0cnVlKTt0aGlzLnJlY3RFdmVu dHMucmVnaXN0ZXIoIm1vdXNlb3ZlciIsdGhpcyxmdW5jdGlvbihlKXtpZighdGhp cy5oYW5kbGVycy5kcmFnLmFjdGl2ZSYmIXRoaXMubWFwLmRyYWdnaW5nKXt0aGlz LmhhbmRsZXJzLmRyYWcuYWN0aXZhdGUoKTt9fSk7dGhpcy5yZWN0RXZlbnRzLnJl Z2lzdGVyKCJtb3VzZW91dCIsdGhpcyxmdW5jdGlvbihlKXtpZighdGhpcy5oYW5k bGVycy5kcmFnLmRyYWdnaW5nKXt0aGlzLmhhbmRsZXJzLmRyYWcuZGVhY3RpdmF0 ZSgpO319KTtpZih0aGlzLm92bWFwLmdldFByb2plY3Rpb24oKSE9dGhpcy5tYXAu Z2V0UHJvamVjdGlvbigpKXt2YXIgc291cmNlVW5pdHM9dGhpcy5tYXAuZ2V0UHJv amVjdGlvbk9iamVjdCgpLmdldFVuaXRzKCl8fHRoaXMubWFwLnVuaXRzfHx0aGlz Lm1hcC5iYXNlTGF5ZXIudW5pdHM7dmFyIHRhcmdldFVuaXRzPXRoaXMub3ZtYXAu Z2V0UHJvamVjdGlvbk9iamVjdCgpLmdldFVuaXRzKCl8fHRoaXMub3ZtYXAudW5p dHN8fHRoaXMub3ZtYXAuYmFzZUxheWVyLnVuaXRzO3RoaXMucmVzb2x1dGlvbkZh Y3Rvcj1zb3VyY2VVbml0cyYmdGFyZ2V0VW5pdHM/T3BlbkxheWVycy5JTkNIRVNf UEVSX1VOSVRbc291cmNlVW5pdHNdL09wZW5MYXllcnMuSU5DSEVTX1BFUl9VTklU W3RhcmdldFVuaXRzXToxO319LHVwZGF0ZVJlY3RUb01hcDpmdW5jdGlvbigpe3Zh ciBib3VuZHM7aWYodGhpcy5vdm1hcC5nZXRQcm9qZWN0aW9uKCkhPXRoaXMubWFw LmdldFByb2plY3Rpb24oKSl7Ym91bmRzPXRoaXMubWFwLmdldEV4dGVudCgpLnRy YW5zZm9ybSh0aGlzLm1hcC5nZXRQcm9qZWN0aW9uT2JqZWN0KCksdGhpcy5vdm1h cC5nZXRQcm9qZWN0aW9uT2JqZWN0KCkpO31lbHNle2JvdW5kcz10aGlzLm1hcC5n ZXRFeHRlbnQoKTt9CnZhciBweEJvdW5kcz10aGlzLmdldFJlY3RCb3VuZHNGcm9t TWFwQm91bmRzKGJvdW5kcyk7aWYocHhCb3VuZHMpe3RoaXMuc2V0UmVjdFB4Qm91 bmRzKHB4Qm91bmRzKTt9fSx1cGRhdGVNYXBUb1JlY3Q6ZnVuY3Rpb24oKXt2YXIg bG9uTGF0Qm91bmRzPXRoaXMuZ2V0TWFwQm91bmRzRnJvbVJlY3RCb3VuZHModGhp cy5yZWN0UHhCb3VuZHMpO2lmKHRoaXMub3ZtYXAuZ2V0UHJvamVjdGlvbigpIT10 aGlzLm1hcC5nZXRQcm9qZWN0aW9uKCkpe2xvbkxhdEJvdW5kcz1sb25MYXRCb3Vu ZHMudHJhbnNmb3JtKHRoaXMub3ZtYXAuZ2V0UHJvamVjdGlvbk9iamVjdCgpLHRo aXMubWFwLmdldFByb2plY3Rpb25PYmplY3QoKSk7fQp0aGlzLm1hcC5wYW5Ubyhs b25MYXRCb3VuZHMuZ2V0Q2VudGVyTG9uTGF0KCkpO30sc2V0UmVjdFB4Qm91bmRz OmZ1bmN0aW9uKHB4Qm91bmRzKXt2YXIgdG9wPU1hdGgubWF4KHB4Qm91bmRzLnRv cCwwKTt2YXIgbGVmdD1NYXRoLm1heChweEJvdW5kcy5sZWZ0LDApO3ZhciBib3R0 b209TWF0aC5taW4ocHhCb3VuZHMudG9wK01hdGguYWJzKHB4Qm91bmRzLmdldEhl aWdodCgpKSx0aGlzLm92bWFwLnNpemUuaC10aGlzLmhDb21wKTt2YXIgcmlnaHQ9 TWF0aC5taW4ocHhCb3VuZHMubGVmdCtweEJvdW5kcy5nZXRXaWR0aCgpLHRoaXMu b3ZtYXAuc2l6ZS53LXRoaXMud0NvbXApO3ZhciB3aWR0aD1NYXRoLm1heChyaWdo dC1sZWZ0LDApO3ZhciBoZWlnaHQ9TWF0aC5tYXgoYm90dG9tLXRvcCwwKTtpZih3 aWR0aDx0aGlzLm1pblJlY3RTaXplfHxoZWlnaHQ8dGhpcy5taW5SZWN0U2l6ZSl7 dGhpcy5leHRlbnRSZWN0YW5nbGUuY2xhc3NOYW1lPXRoaXMuZGlzcGxheUNsYXNz Kwp0aGlzLm1pblJlY3REaXNwbGF5Q2xhc3M7dmFyIHJMZWZ0PWxlZnQrKHdpZHRo LzIpLSh0aGlzLm1pblJlY3RTaXplLzIpO3ZhciByVG9wPXRvcCsoaGVpZ2h0LzIp LSh0aGlzLm1pblJlY3RTaXplLzIpO3RoaXMuZXh0ZW50UmVjdGFuZ2xlLnN0eWxl LnRvcD1NYXRoLnJvdW5kKHJUb3ApKydweCc7dGhpcy5leHRlbnRSZWN0YW5nbGUu c3R5bGUubGVmdD1NYXRoLnJvdW5kKHJMZWZ0KSsncHgnO3RoaXMuZXh0ZW50UmVj dGFuZ2xlLnN0eWxlLmhlaWdodD10aGlzLm1pblJlY3RTaXplKydweCc7dGhpcy5l eHRlbnRSZWN0YW5nbGUuc3R5bGUud2lkdGg9dGhpcy5taW5SZWN0U2l6ZSsncHgn O31lbHNle3RoaXMuZXh0ZW50UmVjdGFuZ2xlLmNsYXNzTmFtZT10aGlzLmRpc3Bs YXlDbGFzcysnRXh0ZW50UmVjdGFuZ2xlJzt0aGlzLmV4dGVudFJlY3RhbmdsZS5z dHlsZS50b3A9TWF0aC5yb3VuZCh0b3ApKydweCc7dGhpcy5leHRlbnRSZWN0YW5n bGUuc3R5bGUubGVmdD1NYXRoLnJvdW5kKGxlZnQpKydweCc7dGhpcy5leHRlbnRS ZWN0YW5nbGUuc3R5bGUuaGVpZ2h0PU1hdGgucm91bmQoaGVpZ2h0KSsncHgnO3Ro aXMuZXh0ZW50UmVjdGFuZ2xlLnN0eWxlLndpZHRoPU1hdGgucm91bmQod2lkdGgp KydweCc7fQp0aGlzLnJlY3RQeEJvdW5kcz1uZXcgT3BlbkxheWVycy5Cb3VuZHMo TWF0aC5yb3VuZChsZWZ0KSxNYXRoLnJvdW5kKGJvdHRvbSksTWF0aC5yb3VuZChy aWdodCksTWF0aC5yb3VuZCh0b3ApKTt9LGdldFJlY3RCb3VuZHNGcm9tTWFwQm91 bmRzOmZ1bmN0aW9uKGxvbkxhdEJvdW5kcyl7dmFyIGxlZnRCb3R0b21Mb25MYXQ9 bmV3IE9wZW5MYXllcnMuTG9uTGF0KGxvbkxhdEJvdW5kcy5sZWZ0LGxvbkxhdEJv dW5kcy5ib3R0b20pO3ZhciByaWdodFRvcExvbkxhdD1uZXcgT3BlbkxheWVycy5M b25MYXQobG9uTGF0Qm91bmRzLnJpZ2h0LGxvbkxhdEJvdW5kcy50b3ApO3ZhciBs ZWZ0Qm90dG9tUHg9dGhpcy5nZXRPdmVydmlld1B4RnJvbUxvbkxhdChsZWZ0Qm90 dG9tTG9uTGF0KTt2YXIgcmlnaHRUb3BQeD10aGlzLmdldE92ZXJ2aWV3UHhGcm9t TG9uTGF0KHJpZ2h0VG9wTG9uTGF0KTt2YXIgYm91bmRzPW51bGw7aWYobGVmdEJv dHRvbVB4JiZyaWdodFRvcFB4KXtib3VuZHM9bmV3IE9wZW5MYXllcnMuQm91bmRz KGxlZnRCb3R0b21QeC54LGxlZnRCb3R0b21QeC55LHJpZ2h0VG9wUHgueCxyaWdo dFRvcFB4LnkpO30KcmV0dXJuIGJvdW5kczt9LGdldE1hcEJvdW5kc0Zyb21SZWN0 Qm91bmRzOmZ1bmN0aW9uKHB4Qm91bmRzKXt2YXIgbGVmdEJvdHRvbVB4PW5ldyBP cGVuTGF5ZXJzLlBpeGVsKHB4Qm91bmRzLmxlZnQscHhCb3VuZHMuYm90dG9tKTt2 YXIgcmlnaHRUb3BQeD1uZXcgT3BlbkxheWVycy5QaXhlbChweEJvdW5kcy5yaWdo dCxweEJvdW5kcy50b3ApO3ZhciBsZWZ0Qm90dG9tTG9uTGF0PXRoaXMuZ2V0TG9u TGF0RnJvbU92ZXJ2aWV3UHgobGVmdEJvdHRvbVB4KTt2YXIgcmlnaHRUb3BMb25M YXQ9dGhpcy5nZXRMb25MYXRGcm9tT3ZlcnZpZXdQeChyaWdodFRvcFB4KTtyZXR1 cm4gbmV3IE9wZW5MYXllcnMuQm91bmRzKGxlZnRCb3R0b21Mb25MYXQubG9uLGxl ZnRCb3R0b21Mb25MYXQubGF0LHJpZ2h0VG9wTG9uTGF0LmxvbixyaWdodFRvcExv bkxhdC5sYXQpO30sZ2V0TG9uTGF0RnJvbU92ZXJ2aWV3UHg6ZnVuY3Rpb24ob3Zl cnZpZXdNYXBQeCl7dmFyIHNpemU9dGhpcy5vdm1hcC5zaXplO3ZhciByZXM9dGhp cy5vdm1hcC5nZXRSZXNvbHV0aW9uKCk7dmFyIGNlbnRlcj10aGlzLm92bWFwLmdl dEV4dGVudCgpLmdldENlbnRlckxvbkxhdCgpO3ZhciBkZWx0YV94PW92ZXJ2aWV3 TWFwUHgueC0oc2l6ZS53LzIpO3ZhciBkZWx0YV95PW92ZXJ2aWV3TWFwUHgueS0o c2l6ZS5oLzIpO3JldHVybiBuZXcgT3BlbkxheWVycy5Mb25MYXQoY2VudGVyLmxv bitkZWx0YV94KnJlcyxjZW50ZXIubGF0LWRlbHRhX3kqcmVzKTt9LGdldE92ZXJ2 aWV3UHhGcm9tTG9uTGF0OmZ1bmN0aW9uKGxvbmxhdCl7dmFyIHJlcz10aGlzLm92 bWFwLmdldFJlc29sdXRpb24oKTt2YXIgZXh0ZW50PXRoaXMub3ZtYXAuZ2V0RXh0 ZW50KCk7dmFyIHB4PW51bGw7aWYoZXh0ZW50KXtweD1uZXcgT3BlbkxheWVycy5Q aXhlbChNYXRoLnJvdW5kKDEvcmVzKihsb25sYXQubG9uLWV4dGVudC5sZWZ0KSks TWF0aC5yb3VuZCgxL3JlcyooZXh0ZW50LnRvcC1sb25sYXQubGF0KSkpO30KcmV0 dXJuIHB4O30sQ0xBU1NfTkFNRTonT3BlbkxheWVycy5Db250cm9sLk92ZXJ2aWV3 TWFwJ30pO09wZW5MYXllcnMuTGF5ZXIuR29vZ2xlPU9wZW5MYXllcnMuQ2xhc3Mo T3BlbkxheWVycy5MYXllci5FdmVudFBhbmUsT3BlbkxheWVycy5MYXllci5GaXhl ZFpvb21MZXZlbHMse01JTl9aT09NX0xFVkVMOjAsTUFYX1pPT01fTEVWRUw6MjEs UkVTT0xVVElPTlM6WzEuNDA2MjUsMC43MDMxMjUsMC4zNTE1NjI1LDAuMTc1Nzgx MjUsMC4wODc4OTA2MjUsMC4wNDM5NDUzMTI1LDAuMDIxOTcyNjU2MjUsMC4wMTA5 ODYzMjgxMjUsMC4wMDU0OTMxNjQwNjI1LDAuMDAyNzQ2NTgyMDMxMjUsMC4wMDEz NzMyOTEwMTU2MjUsMC4wMDA2ODY2NDU1MDc4MTI1LDAuMDAwMzQzMzIyNzUzOTA2 MjUsMC4wMDAxNzE2NjEzNzY5NTMxMjUsMC4wMDAwODU4MzA2ODg0NzY1NjI1LDAu MDAwMDQyOTE1MzQ0MjM4MjgxMjUsMC4wMDAwMjE0NTc2NzIxMTkxNDA2MiwwLjAw MDAxMDcyODgzNjA1OTU3MDMxLDAuMDAwMDA1MzY0NDE4MDI5Nzg1MTUsMC4wMDAw MDI2ODIyMDkwMTQ4OTI1NywwLjAwMDAwMTM0MTEwNDUwNzQ0NjI4OTEsMC4wMDAw MDA2NzA1NTIyNTM3MjMxNDQ1M10sdHlwZTpudWxsLHdyYXBEYXRlTGluZTp0cnVl LHNwaGVyaWNhbE1lcmNhdG9yOmZhbHNlLHZlcnNpb246bnVsbCxpbml0aWFsaXpl OmZ1bmN0aW9uKG5hbWUsb3B0aW9ucyl7b3B0aW9ucz1vcHRpb25zfHx7fTtpZigh b3B0aW9ucy52ZXJzaW9uKXtvcHRpb25zLnZlcnNpb249dHlwZW9mIEdNYXAyPT09 ImZ1bmN0aW9uIj8iMiI6IjMiO30KdmFyIG1peGluPU9wZW5MYXllcnMuTGF5ZXIu R29vZ2xlWyJ2IisKb3B0aW9ucy52ZXJzaW9uLnJlcGxhY2UoL1wuL2csIl8iKV07 aWYobWl4aW4pe09wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKG9wdGlvbnMs bWl4aW4pO31lbHNle3Rocm93IlVuc3VwcG9ydGVkIEdvb2dsZSBNYXBzIEFQSSB2 ZXJzaW9uOiAiK29wdGlvbnMudmVyc2lvbjt9Ck9wZW5MYXllcnMuVXRpbC5hcHBs eURlZmF1bHRzKG9wdGlvbnMsbWl4aW4uREVGQVVMVFMpO2lmKG9wdGlvbnMubWF4 RXh0ZW50KXtvcHRpb25zLm1heEV4dGVudD1vcHRpb25zLm1heEV4dGVudC5jbG9u ZSgpO30KT3BlbkxheWVycy5MYXllci5FdmVudFBhbmUucHJvdG90eXBlLmluaXRp YWxpemUuYXBwbHkodGhpcyxbbmFtZSxvcHRpb25zXSk7T3BlbkxheWVycy5MYXll ci5GaXhlZFpvb21MZXZlbHMucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhp cyxbbmFtZSxvcHRpb25zXSk7aWYodGhpcy5zcGhlcmljYWxNZXJjYXRvcil7T3Bl bkxheWVycy5VdGlsLmV4dGVuZCh0aGlzLE9wZW5MYXllcnMuTGF5ZXIuU3BoZXJp Y2FsTWVyY2F0b3IpO3RoaXMuaW5pdE1lcmNhdG9yUGFyYW1ldGVycygpO319LGNs b25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBPcGVuTGF5ZXJzLkxheWVyLkdvb2ds ZSh0aGlzLm5hbWUsdGhpcy5nZXRPcHRpb25zKCkpO30sc2V0VmlzaWJpbGl0eTpm dW5jdGlvbih2aXNpYmxlKXt2YXIgb3BhY2l0eT10aGlzLm9wYWNpdHk9PW51bGw/ MTp0aGlzLm9wYWNpdHk7T3BlbkxheWVycy5MYXllci5FdmVudFBhbmUucHJvdG90 eXBlLnNldFZpc2liaWxpdHkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuc2V0 T3BhY2l0eShvcGFjaXR5KTt9LGRpc3BsYXk6ZnVuY3Rpb24odmlzaWJsZSl7aWYo IXRoaXMuX2RyYWdnaW5nKXt0aGlzLnNldEdNYXBWaXNpYmlsaXR5KHZpc2libGUp O30KT3BlbkxheWVycy5MYXllci5FdmVudFBhbmUucHJvdG90eXBlLmRpc3BsYXku YXBwbHkodGhpcyxhcmd1bWVudHMpO30sbW92ZVRvOmZ1bmN0aW9uKGJvdW5kcyx6 b29tQ2hhbmdlZCxkcmFnZ2luZyl7dGhpcy5fZHJhZ2dpbmc9ZHJhZ2dpbmc7T3Bl bkxheWVycy5MYXllci5FdmVudFBhbmUucHJvdG90eXBlLm1vdmVUby5hcHBseSh0 aGlzLGFyZ3VtZW50cyk7ZGVsZXRlIHRoaXMuX2RyYWdnaW5nO30sc2V0T3BhY2l0 eTpmdW5jdGlvbihvcGFjaXR5KXtpZihvcGFjaXR5IT09dGhpcy5vcGFjaXR5KXtp Zih0aGlzLm1hcCE9bnVsbCl7dGhpcy5tYXAuZXZlbnRzLnRyaWdnZXJFdmVudCgi Y2hhbmdlbGF5ZXIiLHtsYXllcjp0aGlzLHByb3BlcnR5OiJvcGFjaXR5In0pO30K dGhpcy5vcGFjaXR5PW9wYWNpdHk7fQppZih0aGlzLmdldFZpc2liaWxpdHkoKSl7 dmFyIGNvbnRhaW5lcj10aGlzLmdldE1hcENvbnRhaW5lcigpO09wZW5MYXllcnMu VXRpbC5tb2RpZnlET01FbGVtZW50KGNvbnRhaW5lcixudWxsLG51bGwsbnVsbCxu dWxsLG51bGwsbnVsbCxvcGFjaXR5KTt9fSxkZXN0cm95OmZ1bmN0aW9uKCl7aWYo dGhpcy5tYXApe3RoaXMuc2V0R01hcFZpc2liaWxpdHkoZmFsc2UpO3ZhciBjYWNo ZT1PcGVuTGF5ZXJzLkxheWVyLkdvb2dsZS5jYWNoZVt0aGlzLm1hcC5pZF07aWYo Y2FjaGUmJmNhY2hlLmNvdW50PD0xKXt0aGlzLnJlbW92ZUdNYXBFbGVtZW50cygp O319Ck9wZW5MYXllcnMuTGF5ZXIuRXZlbnRQYW5lLnByb3RvdHlwZS5kZXN0cm95 LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LHJlbW92ZUdNYXBFbGVtZW50czpmdW5j dGlvbigpe3ZhciBjYWNoZT1PcGVuTGF5ZXJzLkxheWVyLkdvb2dsZS5jYWNoZVt0 aGlzLm1hcC5pZF07aWYoY2FjaGUpe3ZhciBjb250YWluZXI9dGhpcy5tYXBPYmpl Y3QmJnRoaXMuZ2V0TWFwQ29udGFpbmVyKCk7aWYoY29udGFpbmVyJiZjb250YWlu ZXIucGFyZW50Tm9kZSl7Y29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQo Y29udGFpbmVyKTt9CnZhciB0ZXJtc09mVXNlPWNhY2hlLnRlcm1zT2ZVc2U7aWYo dGVybXNPZlVzZSYmdGVybXNPZlVzZS5wYXJlbnROb2RlKXt0ZXJtc09mVXNlLnBh cmVudE5vZGUucmVtb3ZlQ2hpbGQodGVybXNPZlVzZSk7fQp2YXIgcG93ZXJlZEJ5 PWNhY2hlLnBvd2VyZWRCeTtpZihwb3dlcmVkQnkmJnBvd2VyZWRCeS5wYXJlbnRO b2RlKXtwb3dlcmVkQnkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwb3dlcmVkQnkp O319fSxyZW1vdmVNYXA6ZnVuY3Rpb24obWFwKXtpZih0aGlzLnZpc2liaWxpdHkm JnRoaXMubWFwT2JqZWN0KXt0aGlzLnNldEdNYXBWaXNpYmlsaXR5KGZhbHNlKTt9 CnZhciBjYWNoZT1PcGVuTGF5ZXJzLkxheWVyLkdvb2dsZS5jYWNoZVttYXAuaWRd O2lmKGNhY2hlKXtpZihjYWNoZS5jb3VudDw9MSl7dGhpcy5yZW1vdmVHTWFwRWxl bWVudHMoKTtkZWxldGUgT3BlbkxheWVycy5MYXllci5Hb29nbGUuY2FjaGVbbWFw LmlkXTt9ZWxzZXstLWNhY2hlLmNvdW50O319CmRlbGV0ZSB0aGlzLnRlcm1zT2ZV c2U7ZGVsZXRlIHRoaXMucG93ZXJlZEJ5O2RlbGV0ZSB0aGlzLm1hcE9iamVjdDtk ZWxldGUgdGhpcy5kcmFnT2JqZWN0O09wZW5MYXllcnMuTGF5ZXIuRXZlbnRQYW5l LnByb3RvdHlwZS5yZW1vdmVNYXAuYXBwbHkodGhpcyxhcmd1bWVudHMpO30sZ2V0 T0xCb3VuZHNGcm9tTWFwT2JqZWN0Qm91bmRzOmZ1bmN0aW9uKG1vQm91bmRzKXt2 YXIgb2xCb3VuZHM9bnVsbDtpZihtb0JvdW5kcyE9bnVsbCl7dmFyIHN3PW1vQm91 bmRzLmdldFNvdXRoV2VzdCgpO3ZhciBuZT1tb0JvdW5kcy5nZXROb3J0aEVhc3Qo KTtpZih0aGlzLnNwaGVyaWNhbE1lcmNhdG9yKXtzdz10aGlzLmZvcndhcmRNZXJj YXRvcihzdy5sbmcoKSxzdy5sYXQoKSk7bmU9dGhpcy5mb3J3YXJkTWVyY2F0b3Io bmUubG5nKCksbmUubGF0KCkpO31lbHNle3N3PW5ldyBPcGVuTGF5ZXJzLkxvbkxh dChzdy5sbmcoKSxzdy5sYXQoKSk7bmU9bmV3IE9wZW5MYXllcnMuTG9uTGF0KG5l LmxuZygpLG5lLmxhdCgpKTt9Cm9sQm91bmRzPW5ldyBPcGVuTGF5ZXJzLkJvdW5k cyhzdy5sb24sc3cubGF0LG5lLmxvbixuZS5sYXQpO30KcmV0dXJuIG9sQm91bmRz O30sZ2V0V2FybmluZ0hUTUw6ZnVuY3Rpb24oKXtyZXR1cm4gT3BlbkxheWVycy5p MThuKCJnb29nbGVXYXJuaW5nIik7fSxnZXRNYXBPYmplY3RDZW50ZXI6ZnVuY3Rp b24oKXtyZXR1cm4gdGhpcy5tYXBPYmplY3QuZ2V0Q2VudGVyKCk7fSxnZXRNYXBP YmplY3Rab29tOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwT2JqZWN0LmdldFpv b20oKTt9LGdldExvbmdpdHVkZUZyb21NYXBPYmplY3RMb25MYXQ6ZnVuY3Rpb24o bW9Mb25MYXQpe3JldHVybiB0aGlzLnNwaGVyaWNhbE1lcmNhdG9yP3RoaXMuZm9y d2FyZE1lcmNhdG9yKG1vTG9uTGF0LmxuZygpLG1vTG9uTGF0LmxhdCgpKS5sb246 bW9Mb25MYXQubG5nKCk7fSxnZXRMYXRpdHVkZUZyb21NYXBPYmplY3RMb25MYXQ6 ZnVuY3Rpb24obW9Mb25MYXQpe3ZhciBsYXQ9dGhpcy5zcGhlcmljYWxNZXJjYXRv cj90aGlzLmZvcndhcmRNZXJjYXRvcihtb0xvbkxhdC5sbmcoKSxtb0xvbkxhdC5s YXQoKSkubGF0Om1vTG9uTGF0LmxhdCgpO3JldHVybiBsYXQ7fSxnZXRYRnJvbU1h cE9iamVjdFBpeGVsOmZ1bmN0aW9uKG1vUGl4ZWwpe3JldHVybiBtb1BpeGVsLng7 fSxnZXRZRnJvbU1hcE9iamVjdFBpeGVsOmZ1bmN0aW9uKG1vUGl4ZWwpe3JldHVy biBtb1BpeGVsLnk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkxheWVyLkdvb2ds ZSJ9KTtPcGVuTGF5ZXJzLkxheWVyLkdvb2dsZS5jYWNoZT17fTtPcGVuTGF5ZXJz LkxheWVyLkdvb2dsZS52Mj17dGVybXNPZlVzZTpudWxsLHBvd2VyZWRCeTpudWxs LGRyYWdPYmplY3Q6bnVsbCxsb2FkTWFwT2JqZWN0OmZ1bmN0aW9uKCl7aWYoIXRo aXMudHlwZSl7dGhpcy50eXBlPUdfTk9STUFMX01BUDt9CnZhciBtYXBPYmplY3Qs dGVybXNPZlVzZSxwb3dlcmVkQnk7dmFyIGNhY2hlPU9wZW5MYXllcnMuTGF5ZXIu R29vZ2xlLmNhY2hlW3RoaXMubWFwLmlkXTtpZihjYWNoZSl7bWFwT2JqZWN0PWNh Y2hlLm1hcE9iamVjdDt0ZXJtc09mVXNlPWNhY2hlLnRlcm1zT2ZVc2U7cG93ZXJl ZEJ5PWNhY2hlLnBvd2VyZWRCeTsrK2NhY2hlLmNvdW50O31lbHNle3ZhciBjb250 YWluZXI9dGhpcy5tYXAudmlld1BvcnREaXY7dmFyIGRpdj1kb2N1bWVudC5jcmVh dGVFbGVtZW50KCJkaXYiKTtkaXYuaWQ9dGhpcy5tYXAuaWQrIl9HTWFwMkNvbnRh aW5lciI7ZGl2LnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZGl2LnN0eWxlLndp ZHRoPSIxMDAlIjtkaXYuc3R5bGUuaGVpZ2h0PSIxMDAlIjtjb250YWluZXIuYXBw ZW5kQ2hpbGQoZGl2KTt0cnl7bWFwT2JqZWN0PW5ldyBHTWFwMihkaXYpO3Rlcm1z T2ZVc2U9ZGl2Lmxhc3RDaGlsZDtjb250YWluZXIuYXBwZW5kQ2hpbGQodGVybXNP ZlVzZSk7dGVybXNPZlVzZS5zdHlsZS56SW5kZXg9IjExMDAiO3Rlcm1zT2ZVc2Uu c3R5bGUucmlnaHQ9IiI7dGVybXNPZlVzZS5zdHlsZS5ib3R0b209IiI7dGVybXNP ZlVzZS5jbGFzc05hbWU9Im9sTGF5ZXJHb29nbGVDb3B5cmlnaHQiO3Bvd2VyZWRC eT1kaXYubGFzdENoaWxkO2NvbnRhaW5lci5hcHBlbmRDaGlsZChwb3dlcmVkQnkp O3Bvd2VyZWRCeS5zdHlsZS56SW5kZXg9IjExMDAiO3Bvd2VyZWRCeS5zdHlsZS5y aWdodD0iIjtwb3dlcmVkQnkuc3R5bGUuYm90dG9tPSIiO3Bvd2VyZWRCeS5jbGFz c05hbWU9Im9sTGF5ZXJHb29nbGVQb3dlcmVkQnkgZ21ub3ByaW50Ijt9Y2F0Y2go ZSl7dGhyb3coZSk7fQpPcGVuTGF5ZXJzLkxheWVyLkdvb2dsZS5jYWNoZVt0aGlz Lm1hcC5pZF09e21hcE9iamVjdDptYXBPYmplY3QsdGVybXNPZlVzZTp0ZXJtc09m VXNlLHBvd2VyZWRCeTpwb3dlcmVkQnksY291bnQ6MX07fQp0aGlzLm1hcE9iamVj dD1tYXBPYmplY3Q7dGhpcy50ZXJtc09mVXNlPXRlcm1zT2ZVc2U7dGhpcy5wb3dl cmVkQnk9cG93ZXJlZEJ5O2lmKE9wZW5MYXllcnMuVXRpbC5pbmRleE9mKHRoaXMu bWFwT2JqZWN0LmdldE1hcFR5cGVzKCksdGhpcy50eXBlKT09PS0xKXt0aGlzLm1h cE9iamVjdC5hZGRNYXBUeXBlKHRoaXMudHlwZSk7fQppZih0eXBlb2YgbWFwT2Jq ZWN0LmdldERyYWdPYmplY3Q9PSJmdW5jdGlvbiIpe3RoaXMuZHJhZ09iamVjdD1t YXBPYmplY3QuZ2V0RHJhZ09iamVjdCgpO31lbHNle3RoaXMuZHJhZ1Bhbk1hcE9i amVjdD1udWxsO30KaWYodGhpcy5pc0Jhc2VMYXllcj09PWZhbHNlKXt0aGlzLnNl dEdNYXBWaXNpYmlsaXR5KHRoaXMuZGl2LnN0eWxlLmRpc3BsYXkhPT0ibm9uZSIp O319LG9uTWFwUmVzaXplOmZ1bmN0aW9uKCl7aWYodGhpcy52aXNpYmlsaXR5JiZ0 aGlzLm1hcE9iamVjdC5pc0xvYWRlZCgpKXt0aGlzLm1hcE9iamVjdC5jaGVja1Jl c2l6ZSgpO31lbHNle2lmKCF0aGlzLl9yZXNpemVkKXt2YXIgbGF5ZXI9dGhpczt2 YXIgaGFuZGxlPUdFdmVudC5hZGRMaXN0ZW5lcih0aGlzLm1hcE9iamVjdCwibG9h ZCIsZnVuY3Rpb24oKXtHRXZlbnQucmVtb3ZlTGlzdGVuZXIoaGFuZGxlKTtkZWxl dGUgbGF5ZXIuX3Jlc2l6ZWQ7bGF5ZXIubWFwT2JqZWN0LmNoZWNrUmVzaXplKCk7 bGF5ZXIubW92ZVRvKGxheWVyLm1hcC5nZXRDZW50ZXIoKSxsYXllci5tYXAuZ2V0 Wm9vbSgpKTt9KTt9CnRoaXMuX3Jlc2l6ZWQ9dHJ1ZTt9fSxzZXRHTWFwVmlzaWJp bGl0eTpmdW5jdGlvbih2aXNpYmxlKXt2YXIgY2FjaGU9T3BlbkxheWVycy5MYXll ci5Hb29nbGUuY2FjaGVbdGhpcy5tYXAuaWRdO2lmKGNhY2hlKXt2YXIgY29udGFp bmVyPXRoaXMubWFwT2JqZWN0LmdldENvbnRhaW5lcigpO2lmKHZpc2libGU9PT10 cnVlKXt0aGlzLm1hcE9iamVjdC5zZXRNYXBUeXBlKHRoaXMudHlwZSk7Y29udGFp bmVyLnN0eWxlLmRpc3BsYXk9IiI7dGhpcy50ZXJtc09mVXNlLnN0eWxlLmxlZnQ9 IiI7dGhpcy50ZXJtc09mVXNlLnN0eWxlLmRpc3BsYXk9IiI7dGhpcy5wb3dlcmVk Qnkuc3R5bGUuZGlzcGxheT0iIjtjYWNoZS5kaXNwbGF5ZWQ9dGhpcy5pZDt9ZWxz ZXtpZihjYWNoZS5kaXNwbGF5ZWQ9PT10aGlzLmlkKXtkZWxldGUgY2FjaGUuZGlz cGxheWVkO30KaWYoIWNhY2hlLmRpc3BsYXllZCl7Y29udGFpbmVyLnN0eWxlLmRp c3BsYXk9Im5vbmUiO3RoaXMudGVybXNPZlVzZS5zdHlsZS5kaXNwbGF5PSJub25l Ijt0aGlzLnRlcm1zT2ZVc2Uuc3R5bGUubGVmdD0iLTk5OTlweCI7dGhpcy5wb3dl cmVkQnkuc3R5bGUuZGlzcGxheT0ibm9uZSI7fX19fSxnZXRNYXBDb250YWluZXI6 ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXBPYmplY3QuZ2V0Q29udGFpbmVyKCk7 fSxnZXRNYXBPYmplY3RCb3VuZHNGcm9tT0xCb3VuZHM6ZnVuY3Rpb24ob2xCb3Vu ZHMpe3ZhciBtb0JvdW5kcz1udWxsO2lmKG9sQm91bmRzIT1udWxsKXt2YXIgc3c9 dGhpcy5zcGhlcmljYWxNZXJjYXRvcj90aGlzLmludmVyc2VNZXJjYXRvcihvbEJv dW5kcy5ib3R0b20sb2xCb3VuZHMubGVmdCk6bmV3IE9wZW5MYXllcnMuTG9uTGF0 KG9sQm91bmRzLmJvdHRvbSxvbEJvdW5kcy5sZWZ0KTt2YXIgbmU9dGhpcy5zcGhl cmljYWxNZXJjYXRvcj90aGlzLmludmVyc2VNZXJjYXRvcihvbEJvdW5kcy50b3As b2xCb3VuZHMucmlnaHQpOm5ldyBPcGVuTGF5ZXJzLkxvbkxhdChvbEJvdW5kcy50 b3Asb2xCb3VuZHMucmlnaHQpO21vQm91bmRzPW5ldyBHTGF0TG5nQm91bmRzKG5l dyBHTGF0TG5nKHN3LmxhdCxzdy5sb24pLG5ldyBHTGF0TG5nKG5lLmxhdCxuZS5s b24pKTt9CnJldHVybiBtb0JvdW5kczt9LHNldE1hcE9iamVjdENlbnRlcjpmdW5j dGlvbihjZW50ZXIsem9vbSl7dGhpcy5tYXBPYmplY3Quc2V0Q2VudGVyKGNlbnRl cix6b29tKTt9LGRyYWdQYW5NYXBPYmplY3Q6ZnVuY3Rpb24oZFgsZFkpe3RoaXMu ZHJhZ09iamVjdC5tb3ZlQnkobmV3IEdTaXplKC1kWCxkWSkpO30sZ2V0TWFwT2Jq ZWN0TG9uTGF0RnJvbU1hcE9iamVjdFBpeGVsOmZ1bmN0aW9uKG1vUGl4ZWwpe3Jl dHVybiB0aGlzLm1hcE9iamVjdC5mcm9tQ29udGFpbmVyUGl4ZWxUb0xhdExuZyht b1BpeGVsKTt9LGdldE1hcE9iamVjdFBpeGVsRnJvbU1hcE9iamVjdExvbkxhdDpm dW5jdGlvbihtb0xvbkxhdCl7cmV0dXJuIHRoaXMubWFwT2JqZWN0LmZyb21MYXRM bmdUb0NvbnRhaW5lclBpeGVsKG1vTG9uTGF0KTt9LGdldE1hcE9iamVjdFpvb21G cm9tTWFwT2JqZWN0Qm91bmRzOmZ1bmN0aW9uKG1vQm91bmRzKXtyZXR1cm4gdGhp cy5tYXBPYmplY3QuZ2V0Qm91bmRzWm9vbUxldmVsKG1vQm91bmRzKTt9LGdldE1h cE9iamVjdExvbkxhdEZyb21Mb25MYXQ6ZnVuY3Rpb24obG9uLGxhdCl7dmFyIGdM YXRMbmc7aWYodGhpcy5zcGhlcmljYWxNZXJjYXRvcil7dmFyIGxvbmxhdD10aGlz LmludmVyc2VNZXJjYXRvcihsb24sbGF0KTtnTGF0TG5nPW5ldyBHTGF0TG5nKGxv bmxhdC5sYXQsbG9ubGF0Lmxvbik7fWVsc2V7Z0xhdExuZz1uZXcgR0xhdExuZyhs YXQsbG9uKTt9CnJldHVybiBnTGF0TG5nO30sZ2V0TWFwT2JqZWN0UGl4ZWxGcm9t WFk6ZnVuY3Rpb24oeCx5KXtyZXR1cm4gbmV3IEdQb2ludCh4LHkpO319O09wZW5M YXllcnMuRm9ybWF0LlhNTD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9y bWF0LHtuYW1lc3BhY2VzOm51bGwsbmFtZXNwYWNlQWxpYXM6bnVsbCxkZWZhdWx0 UHJlZml4Om51bGwscmVhZGVyczp7fSx3cml0ZXJzOnt9LHhtbGRvbTpudWxsLGlu aXRpYWxpemU6ZnVuY3Rpb24ob3B0aW9ucyl7aWYod2luZG93LkFjdGl2ZVhPYmpl Y3Qpe3RoaXMueG1sZG9tPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1M RE9NIik7fQpPcGVuTGF5ZXJzLkZvcm1hdC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5h cHBseSh0aGlzLFtvcHRpb25zXSk7dGhpcy5uYW1lc3BhY2VzPU9wZW5MYXllcnMu VXRpbC5leHRlbmQoe30sdGhpcy5uYW1lc3BhY2VzKTt0aGlzLm5hbWVzcGFjZUFs aWFzPXt9O2Zvcih2YXIgYWxpYXMgaW4gdGhpcy5uYW1lc3BhY2VzKXt0aGlzLm5h bWVzcGFjZUFsaWFzW3RoaXMubmFtZXNwYWNlc1thbGlhc11dPWFsaWFzO319LGRl c3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnhtbGRvbT1udWxsO09wZW5MYXllcnMuRm9y bWF0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LHNl dE5hbWVzcGFjZTpmdW5jdGlvbihhbGlhcyx1cmkpe3RoaXMubmFtZXNwYWNlc1th bGlhc109dXJpO3RoaXMubmFtZXNwYWNlQWxpYXNbdXJpXT1hbGlhczt9LHJlYWQ6 ZnVuY3Rpb24odGV4dCl7dmFyIGluZGV4PXRleHQuaW5kZXhPZignPCcpO2lmKGlu ZGV4PjApe3RleHQ9dGV4dC5zdWJzdHJpbmcoaW5kZXgpO30KdmFyIG5vZGU9T3Bl bkxheWVycy5VdGlsLlRyeShPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQoKGZ1bmN0 aW9uKCl7dmFyIHhtbGRvbTtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCYmIXRoaXMu eG1sZG9tKXt4bWxkb209bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxE T00iKTt9ZWxzZXt4bWxkb209dGhpcy54bWxkb207fQp4bWxkb20ubG9hZFhNTCh0 ZXh0KTtyZXR1cm4geG1sZG9tO30pLHRoaXMpLGZ1bmN0aW9uKCl7cmV0dXJuIG5l dyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcodGV4dCwndGV4dC94bWwnKTt9 LGZ1bmN0aW9uKCl7dmFyIHJlcT1uZXcgWE1MSHR0cFJlcXVlc3QoKTtyZXEub3Bl bigiR0VUIiwiZGF0YToiKyJ0ZXh0L3htbCIrIjtjaGFyc2V0PXV0Zi04LCIrZW5j b2RlVVJJQ29tcG9uZW50KHRleHQpLGZhbHNlKTtpZihyZXEub3ZlcnJpZGVNaW1l VHlwZSl7cmVxLm92ZXJyaWRlTWltZVR5cGUoInRleHQveG1sIik7fQpyZXEuc2Vu ZChudWxsKTtyZXR1cm4gcmVxLnJlc3BvbnNlWE1MO30pO2lmKHRoaXMua2VlcERh dGEpe3RoaXMuZGF0YT1ub2RlO30KcmV0dXJuIG5vZGU7fSx3cml0ZTpmdW5jdGlv bihub2RlKXt2YXIgZGF0YTtpZih0aGlzLnhtbGRvbSl7ZGF0YT1ub2RlLnhtbDt9 ZWxzZXt2YXIgc2VyaWFsaXplcj1uZXcgWE1MU2VyaWFsaXplcigpO2lmKG5vZGUu bm9kZVR5cGU9PTEpe3ZhciBkb2M9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3Jl YXRlRG9jdW1lbnQoIiIsIiIsbnVsbCk7aWYoZG9jLmltcG9ydE5vZGUpe25vZGU9 ZG9jLmltcG9ydE5vZGUobm9kZSx0cnVlKTt9CmRvYy5hcHBlbmRDaGlsZChub2Rl KTtkYXRhPXNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcoZG9jKTt9ZWxzZXtk YXRhPXNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcobm9kZSk7fX0KcmV0dXJu IGRhdGE7fSxjcmVhdGVFbGVtZW50TlM6ZnVuY3Rpb24odXJpLG5hbWUpe3ZhciBl bGVtZW50O2lmKHRoaXMueG1sZG9tKXtpZih0eXBlb2YgdXJpPT0ic3RyaW5nIil7 ZWxlbWVudD10aGlzLnhtbGRvbS5jcmVhdGVOb2RlKDEsbmFtZSx1cmkpO31lbHNl e2VsZW1lbnQ9dGhpcy54bWxkb20uY3JlYXRlTm9kZSgxLG5hbWUsIiIpO319ZWxz ZXtlbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksbmFtZSk7fQpy ZXR1cm4gZWxlbWVudDt9LGNyZWF0ZVRleHROb2RlOmZ1bmN0aW9uKHRleHQpe3Zh ciBub2RlO2lmKHR5cGVvZiB0ZXh0IT09InN0cmluZyIpe3RleHQ9U3RyaW5nKHRl eHQpO30KaWYodGhpcy54bWxkb20pe25vZGU9dGhpcy54bWxkb20uY3JlYXRlVGV4 dE5vZGUodGV4dCk7fWVsc2V7bm9kZT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0 ZXh0KTt9CnJldHVybiBub2RlO30sZ2V0RWxlbWVudHNCeVRhZ05hbWVOUzpmdW5j dGlvbihub2RlLHVyaSxuYW1lKXt2YXIgZWxlbWVudHM9W107aWYobm9kZS5nZXRF bGVtZW50c0J5VGFnTmFtZU5TKXtlbGVtZW50cz1ub2RlLmdldEVsZW1lbnRzQnlU YWdOYW1lTlModXJpLG5hbWUpO31lbHNle3ZhciBhbGxOb2Rlcz1ub2RlLmdldEVs ZW1lbnRzQnlUYWdOYW1lKCIqIik7dmFyIHBvdGVudGlhbE5vZGUsZnVsbE5hbWU7 Zm9yKHZhciBpPTAsbGVuPWFsbE5vZGVzLmxlbmd0aDtpPGxlbjsrK2kpe3BvdGVu dGlhbE5vZGU9YWxsTm9kZXNbaV07ZnVsbE5hbWU9KHBvdGVudGlhbE5vZGUucHJl Zml4KT8ocG90ZW50aWFsTm9kZS5wcmVmaXgrIjoiK25hbWUpOm5hbWU7aWYoKG5h bWU9PSIqIil8fChmdWxsTmFtZT09cG90ZW50aWFsTm9kZS5ub2RlTmFtZSkpe2lm KCh1cmk9PSIqIil8fCh1cmk9PXBvdGVudGlhbE5vZGUubmFtZXNwYWNlVVJJKSl7 ZWxlbWVudHMucHVzaChwb3RlbnRpYWxOb2RlKTt9fX19CnJldHVybiBlbGVtZW50 czt9LGdldEF0dHJpYnV0ZU5vZGVOUzpmdW5jdGlvbihub2RlLHVyaSxuYW1lKXt2 YXIgYXR0cmlidXRlTm9kZT1udWxsO2lmKG5vZGUuZ2V0QXR0cmlidXRlTm9kZU5T KXthdHRyaWJ1dGVOb2RlPW5vZGUuZ2V0QXR0cmlidXRlTm9kZU5TKHVyaSxuYW1l KTt9ZWxzZXt2YXIgYXR0cmlidXRlcz1ub2RlLmF0dHJpYnV0ZXM7dmFyIHBvdGVu dGlhbE5vZGUsZnVsbE5hbWU7Zm9yKHZhciBpPTAsbGVuPWF0dHJpYnV0ZXMubGVu Z3RoO2k8bGVuOysraSl7cG90ZW50aWFsTm9kZT1hdHRyaWJ1dGVzW2ldO2lmKHBv dGVudGlhbE5vZGUubmFtZXNwYWNlVVJJPT11cmkpe2Z1bGxOYW1lPShwb3RlbnRp YWxOb2RlLnByZWZpeCk/KHBvdGVudGlhbE5vZGUucHJlZml4KyI6IituYW1lKTpu YW1lO2lmKGZ1bGxOYW1lPT1wb3RlbnRpYWxOb2RlLm5vZGVOYW1lKXthdHRyaWJ1 dGVOb2RlPXBvdGVudGlhbE5vZGU7YnJlYWs7fX19fQpyZXR1cm4gYXR0cmlidXRl Tm9kZTt9LGdldEF0dHJpYnV0ZU5TOmZ1bmN0aW9uKG5vZGUsdXJpLG5hbWUpe3Zh ciBhdHRyaWJ1dGVWYWx1ZT0iIjtpZihub2RlLmdldEF0dHJpYnV0ZU5TKXthdHRy aWJ1dGVWYWx1ZT1ub2RlLmdldEF0dHJpYnV0ZU5TKHVyaSxuYW1lKXx8IiI7fWVs c2V7dmFyIGF0dHJpYnV0ZU5vZGU9dGhpcy5nZXRBdHRyaWJ1dGVOb2RlTlMobm9k ZSx1cmksbmFtZSk7aWYoYXR0cmlidXRlTm9kZSl7YXR0cmlidXRlVmFsdWU9YXR0 cmlidXRlTm9kZS5ub2RlVmFsdWU7fX0KcmV0dXJuIGF0dHJpYnV0ZVZhbHVlO30s Z2V0Q2hpbGRWYWx1ZTpmdW5jdGlvbihub2RlLGRlZil7dmFyIHZhbHVlPWRlZnx8 IiI7aWYobm9kZSl7Zm9yKHZhciBjaGlsZD1ub2RlLmZpcnN0Q2hpbGQ7Y2hpbGQ7 Y2hpbGQ9Y2hpbGQubmV4dFNpYmxpbmcpe3N3aXRjaChjaGlsZC5ub2RlVHlwZSl7 Y2FzZSAzOmNhc2UgNDp2YWx1ZSs9Y2hpbGQubm9kZVZhbHVlO319fQpyZXR1cm4g dmFsdWU7fSxjb25jYXRDaGlsZFZhbHVlczpmdW5jdGlvbihub2RlLGRlZil7dmFy IHZhbHVlPSIiO3ZhciBjaGlsZD1ub2RlLmZpcnN0Q2hpbGQ7dmFyIGNoaWxkVmFs dWU7d2hpbGUoY2hpbGQpe2NoaWxkVmFsdWU9Y2hpbGQubm9kZVZhbHVlO2lmKGNo aWxkVmFsdWUpe3ZhbHVlKz1jaGlsZFZhbHVlO30KY2hpbGQ9Y2hpbGQubmV4dFNp Ymxpbmc7fQppZih2YWx1ZT09IiImJmRlZiE9dW5kZWZpbmVkKXt2YWx1ZT1kZWY7 fQpyZXR1cm4gdmFsdWU7fSxpc1NpbXBsZUNvbnRlbnQ6ZnVuY3Rpb24obm9kZSl7 dmFyIHNpbXBsZT10cnVlO2Zvcih2YXIgY2hpbGQ9bm9kZS5maXJzdENoaWxkO2No aWxkO2NoaWxkPWNoaWxkLm5leHRTaWJsaW5nKXtpZihjaGlsZC5ub2RlVHlwZT09 PTEpe3NpbXBsZT1mYWxzZTticmVhazt9fQpyZXR1cm4gc2ltcGxlO30sY29udGVu dFR5cGU6ZnVuY3Rpb24obm9kZSl7dmFyIHNpbXBsZT1mYWxzZSxjb21wbGV4PWZh bHNlO3ZhciB0eXBlPU9wZW5MYXllcnMuRm9ybWF0LlhNTC5DT05URU5UX1RZUEUu RU1QVFk7Zm9yKHZhciBjaGlsZD1ub2RlLmZpcnN0Q2hpbGQ7Y2hpbGQ7Y2hpbGQ9 Y2hpbGQubmV4dFNpYmxpbmcpe3N3aXRjaChjaGlsZC5ub2RlVHlwZSl7Y2FzZSAx OmNvbXBsZXg9dHJ1ZTticmVhaztjYXNlIDg6YnJlYWs7ZGVmYXVsdDpzaW1wbGU9 dHJ1ZTt9CmlmKGNvbXBsZXgmJnNpbXBsZSl7YnJlYWs7fX0KaWYoY29tcGxleCYm c2ltcGxlKXt0eXBlPU9wZW5MYXllcnMuRm9ybWF0LlhNTC5DT05URU5UX1RZUEUu TUlYRUQ7fWVsc2UgaWYoY29tcGxleCl7cmV0dXJuIE9wZW5MYXllcnMuRm9ybWF0 LlhNTC5DT05URU5UX1RZUEUuQ09NUExFWDt9ZWxzZSBpZihzaW1wbGUpe3JldHVy biBPcGVuTGF5ZXJzLkZvcm1hdC5YTUwuQ09OVEVOVF9UWVBFLlNJTVBMRTt9CnJl dHVybiB0eXBlO30saGFzQXR0cmlidXRlTlM6ZnVuY3Rpb24obm9kZSx1cmksbmFt ZSl7dmFyIGZvdW5kPWZhbHNlO2lmKG5vZGUuaGFzQXR0cmlidXRlTlMpe2ZvdW5k PW5vZGUuaGFzQXR0cmlidXRlTlModXJpLG5hbWUpO31lbHNle2ZvdW5kPSEhdGhp cy5nZXRBdHRyaWJ1dGVOb2RlTlMobm9kZSx1cmksbmFtZSk7fQpyZXR1cm4gZm91 bmQ7fSxzZXRBdHRyaWJ1dGVOUzpmdW5jdGlvbihub2RlLHVyaSxuYW1lLHZhbHVl KXtpZihub2RlLnNldEF0dHJpYnV0ZU5TKXtub2RlLnNldEF0dHJpYnV0ZU5TKHVy aSxuYW1lLHZhbHVlKTt9ZWxzZXtpZih0aGlzLnhtbGRvbSl7aWYodXJpKXt2YXIg YXR0cmlidXRlPW5vZGUub3duZXJEb2N1bWVudC5jcmVhdGVOb2RlKDIsbmFtZSx1 cmkpO2F0dHJpYnV0ZS5ub2RlVmFsdWU9dmFsdWU7bm9kZS5zZXRBdHRyaWJ1dGVO b2RlKGF0dHJpYnV0ZSk7fWVsc2V7bm9kZS5zZXRBdHRyaWJ1dGUobmFtZSx2YWx1 ZSk7fX1lbHNle3Rocm93InNldEF0dHJpYnV0ZU5TIG5vdCBpbXBsZW1lbnRlZCI7 fX19LGNyZWF0ZUVsZW1lbnROU1BsdXM6ZnVuY3Rpb24obmFtZSxvcHRpb25zKXtv cHRpb25zPW9wdGlvbnN8fHt9O3ZhciB1cmk9b3B0aW9ucy51cml8fHRoaXMubmFt ZXNwYWNlc1tvcHRpb25zLnByZWZpeF07aWYoIXVyaSl7dmFyIGxvYz1uYW1lLmlu ZGV4T2YoIjoiKTt1cmk9dGhpcy5uYW1lc3BhY2VzW25hbWUuc3Vic3RyaW5nKDAs bG9jKV07fQppZighdXJpKXt1cmk9dGhpcy5uYW1lc3BhY2VzW3RoaXMuZGVmYXVs dFByZWZpeF07fQp2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROUyh1cmksbmFt ZSk7aWYob3B0aW9ucy5hdHRyaWJ1dGVzKXt0aGlzLnNldEF0dHJpYnV0ZXMobm9k ZSxvcHRpb25zLmF0dHJpYnV0ZXMpO30KdmFyIHZhbHVlPW9wdGlvbnMudmFsdWU7 aWYodmFsdWUhPW51bGwpe25vZGUuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVUZXh0 Tm9kZSh2YWx1ZSkpO30KcmV0dXJuIG5vZGU7fSxzZXRBdHRyaWJ1dGVzOmZ1bmN0 aW9uKG5vZGUsb2JqKXt2YXIgdmFsdWUsdXJpO2Zvcih2YXIgbmFtZSBpbiBvYmop e2lmKG9ialtuYW1lXSE9bnVsbCYmb2JqW25hbWVdLnRvU3RyaW5nKXt2YWx1ZT1v YmpbbmFtZV0udG9TdHJpbmcoKTt1cmk9dGhpcy5uYW1lc3BhY2VzW25hbWUuc3Vi c3RyaW5nKDAsbmFtZS5pbmRleE9mKCI6IikpXXx8bnVsbDt0aGlzLnNldEF0dHJp YnV0ZU5TKG5vZGUsdXJpLG5hbWUsdmFsdWUpO319fSxyZWFkTm9kZTpmdW5jdGlv bihub2RlLG9iail7aWYoIW9iail7b2JqPXt9O30KdmFyIGdyb3VwPXRoaXMucmVh ZGVyc1tub2RlLm5hbWVzcGFjZVVSST90aGlzLm5hbWVzcGFjZUFsaWFzW25vZGUu bmFtZXNwYWNlVVJJXTp0aGlzLmRlZmF1bHRQcmVmaXhdO2lmKGdyb3VwKXt2YXIg bG9jYWw9bm9kZS5sb2NhbE5hbWV8fG5vZGUubm9kZU5hbWUuc3BsaXQoIjoiKS5w b3AoKTt2YXIgcmVhZGVyPWdyb3VwW2xvY2FsXXx8Z3JvdXBbIioiXTtpZihyZWFk ZXIpe3JlYWRlci5hcHBseSh0aGlzLFtub2RlLG9ial0pO319CnJldHVybiBvYmo7 fSxyZWFkQ2hpbGROb2RlczpmdW5jdGlvbihub2RlLG9iail7aWYoIW9iail7b2Jq PXt9O30KdmFyIGNoaWxkcmVuPW5vZGUuY2hpbGROb2Rlczt2YXIgY2hpbGQ7Zm9y KHZhciBpPTAsbGVuPWNoaWxkcmVuLmxlbmd0aDtpPGxlbjsrK2kpe2NoaWxkPWNo aWxkcmVuW2ldO2lmKGNoaWxkLm5vZGVUeXBlPT0xKXt0aGlzLnJlYWROb2RlKGNo aWxkLG9iaik7fX0KcmV0dXJuIG9iajt9LHdyaXRlTm9kZTpmdW5jdGlvbihuYW1l LG9iaixwYXJlbnQpe3ZhciBwcmVmaXgsbG9jYWw7dmFyIHNwbGl0PW5hbWUuaW5k ZXhPZigiOiIpO2lmKHNwbGl0PjApe3ByZWZpeD1uYW1lLnN1YnN0cmluZygwLHNw bGl0KTtsb2NhbD1uYW1lLnN1YnN0cmluZyhzcGxpdCsxKTt9ZWxzZXtpZihwYXJl bnQpe3ByZWZpeD10aGlzLm5hbWVzcGFjZUFsaWFzW3BhcmVudC5uYW1lc3BhY2VV UkldO31lbHNle3ByZWZpeD10aGlzLmRlZmF1bHRQcmVmaXg7fQpsb2NhbD1uYW1l O30KdmFyIGNoaWxkPXRoaXMud3JpdGVyc1twcmVmaXhdW2xvY2FsXS5hcHBseSh0 aGlzLFtvYmpdKTtpZihwYXJlbnQpe3BhcmVudC5hcHBlbmRDaGlsZChjaGlsZCk7 fQpyZXR1cm4gY2hpbGQ7fSxnZXRDaGlsZEVsOmZ1bmN0aW9uKG5vZGUsbmFtZSx1 cmkpe3JldHVybiBub2RlJiZ0aGlzLmdldFRoaXNPck5leHRFbChub2RlLmZpcnN0 Q2hpbGQsbmFtZSx1cmkpO30sZ2V0TmV4dEVsOmZ1bmN0aW9uKG5vZGUsbmFtZSx1 cmkpe3JldHVybiBub2RlJiZ0aGlzLmdldFRoaXNPck5leHRFbChub2RlLm5leHRT aWJsaW5nLG5hbWUsdXJpKTt9LGdldFRoaXNPck5leHRFbDpmdW5jdGlvbihub2Rl LG5hbWUsdXJpKXtvdXRlcjpmb3IodmFyIHNpYmxpbmc9bm9kZTtzaWJsaW5nO3Np Ymxpbmc9c2libGluZy5uZXh0U2libGluZyl7c3dpdGNoKHNpYmxpbmcubm9kZVR5 cGUpe2Nhc2UgMTppZigoIW5hbWV8fG5hbWU9PT0oc2libGluZy5sb2NhbE5hbWV8 fHNpYmxpbmcubm9kZU5hbWUuc3BsaXQoIjoiKS5wb3AoKSkpJiYoIXVyaXx8dXJp PT09c2libGluZy5uYW1lc3BhY2VVUkkpKXticmVhayBvdXRlcjt9CnNpYmxpbmc9 bnVsbDticmVhayBvdXRlcjtjYXNlIDM6aWYoL15ccyokLy50ZXN0KHNpYmxpbmcu bm9kZVZhbHVlKSl7YnJlYWs7fQpjYXNlIDQ6Y2FzZSA2OmNhc2UgMTI6Y2FzZSAx MDpjYXNlIDExOnNpYmxpbmc9bnVsbDticmVhayBvdXRlcjt9fQpyZXR1cm4gc2li bGluZ3x8bnVsbDt9LGxvb2t1cE5hbWVzcGFjZVVSSTpmdW5jdGlvbihub2RlLHBy ZWZpeCl7dmFyIHVyaT1udWxsO2lmKG5vZGUpe2lmKG5vZGUubG9va3VwTmFtZXNw YWNlVVJJKXt1cmk9bm9kZS5sb29rdXBOYW1lc3BhY2VVUkkocHJlZml4KTt9ZWxz ZXtvdXRlcjpzd2l0Y2gobm9kZS5ub2RlVHlwZSl7Y2FzZSAxOmlmKG5vZGUubmFt ZXNwYWNlVVJJIT09bnVsbCYmbm9kZS5wcmVmaXg9PT1wcmVmaXgpe3VyaT1ub2Rl Lm5hbWVzcGFjZVVSSTticmVhayBvdXRlcjt9CnZhciBsZW49bm9kZS5hdHRyaWJ1 dGVzLmxlbmd0aDtpZihsZW4pe3ZhciBhdHRyO2Zvcih2YXIgaT0wO2k8bGVuOysr aSl7YXR0cj1ub2RlLmF0dHJpYnV0ZXNbaV07aWYoYXR0ci5wcmVmaXg9PT0ieG1s bnMiJiZhdHRyLm5hbWU9PT0ieG1sbnM6IitwcmVmaXgpe3VyaT1hdHRyLnZhbHVl fHxudWxsO2JyZWFrIG91dGVyO31lbHNlIGlmKGF0dHIubmFtZT09PSJ4bWxucyIm JnByZWZpeD09PW51bGwpe3VyaT1hdHRyLnZhbHVlfHxudWxsO2JyZWFrIG91dGVy O319fQp1cmk9dGhpcy5sb29rdXBOYW1lc3BhY2VVUkkobm9kZS5wYXJlbnROb2Rl LHByZWZpeCk7YnJlYWsgb3V0ZXI7Y2FzZSAyOnVyaT10aGlzLmxvb2t1cE5hbWVz cGFjZVVSSShub2RlLm93bmVyRWxlbWVudCxwcmVmaXgpO2JyZWFrIG91dGVyO2Nh c2UgOTp1cmk9dGhpcy5sb29rdXBOYW1lc3BhY2VVUkkobm9kZS5kb2N1bWVudEVs ZW1lbnQscHJlZml4KTticmVhayBvdXRlcjtjYXNlIDY6Y2FzZSAxMjpjYXNlIDEw OmNhc2UgMTE6YnJlYWsgb3V0ZXI7ZGVmYXVsdDp1cmk9dGhpcy5sb29rdXBOYW1l c3BhY2VVUkkobm9kZS5wYXJlbnROb2RlLHByZWZpeCk7YnJlYWsgb3V0ZXI7fX19 CnJldHVybiB1cmk7fSxnZXRYTUxEb2M6ZnVuY3Rpb24oKXtpZighT3BlbkxheWVy cy5Gb3JtYXQuWE1MLmRvY3VtZW50JiYhdGhpcy54bWxkb20pe2lmKGRvY3VtZW50 LmltcGxlbWVudGF0aW9uJiZkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVE b2N1bWVudCl7T3BlbkxheWVycy5Gb3JtYXQuWE1MLmRvY3VtZW50PWRvY3VtZW50 LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCIiLCIiLG51bGwpO31lbHNl IGlmKCF0aGlzLnhtbGRvbSYmd2luZG93LkFjdGl2ZVhPYmplY3Qpe3RoaXMueG1s ZG9tPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIik7fX0KcmV0 dXJuIE9wZW5MYXllcnMuRm9ybWF0LlhNTC5kb2N1bWVudHx8dGhpcy54bWxkb207 fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5YTUwifSk7T3BlbkxheWVy cy5Gb3JtYXQuWE1MLkNPTlRFTlRfVFlQRT17RU1QVFk6MCxTSU1QTEU6MSxDT01Q TEVYOjIsTUlYRUQ6M307T3BlbkxheWVycy5Gb3JtYXQuWE1MLmxvb2t1cE5hbWVz cGFjZVVSST1PcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQoT3BlbkxheWVycy5Gb3Jt YXQuWE1MLnByb3RvdHlwZS5sb29rdXBOYW1lc3BhY2VVUkksT3BlbkxheWVycy5G b3JtYXQuWE1MLnByb3RvdHlwZSk7T3BlbkxheWVycy5Gb3JtYXQuWE1MLmRvY3Vt ZW50PW51bGw7T3BlbkxheWVycy5Gb3JtYXQuV0ZTVD1mdW5jdGlvbihvcHRpb25z KXtvcHRpb25zPU9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKG9wdGlvbnMs T3BlbkxheWVycy5Gb3JtYXQuV0ZTVC5ERUZBVUxUUyk7dmFyIGNscz1PcGVuTGF5 ZXJzLkZvcm1hdC5XRlNUWyJ2IitvcHRpb25zLnZlcnNpb24ucmVwbGFjZSgvXC4v ZywiXyIpXTtpZighY2xzKXt0aHJvdyJVbnN1cHBvcnRlZCBXRlNUIHZlcnNpb246 ICIrb3B0aW9ucy52ZXJzaW9uO30KcmV0dXJuIG5ldyBjbHMob3B0aW9ucyk7fTtP cGVuTGF5ZXJzLkZvcm1hdC5XRlNULkRFRkFVTFRTPXsidmVyc2lvbiI6IjEuMC4w In07T3BlbkxheWVycy5Gb3JtYXQuV0ZTVC52MT1PcGVuTGF5ZXJzLkNsYXNzKE9w ZW5MYXllcnMuRm9ybWF0LlhNTCx7bmFtZXNwYWNlczp7eGxpbms6Imh0dHA6Ly93 d3cudzMub3JnLzE5OTkveGxpbmsiLHhzaToiaHR0cDovL3d3dy53My5vcmcvMjAw MS9YTUxTY2hlbWEtaW5zdGFuY2UiLHdmczoiaHR0cDovL3d3dy5vcGVuZ2lzLm5l dC93ZnMiLGdtbDoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiLG9nYzoiaHR0 cDovL3d3dy5vcGVuZ2lzLm5ldC9vZ2MiLG93czoiaHR0cDovL3d3dy5vcGVuZ2lz Lm5ldC9vd3MifSxkZWZhdWx0UHJlZml4OiJ3ZnMiLHZlcnNpb246bnVsbCxzY2hl bWFMb2NhdGlvbnM6bnVsbCxzcnNOYW1lOm51bGwsZXh0cmFjdEF0dHJpYnV0ZXM6 dHJ1ZSx4eTp0cnVlLHN0YXRlTmFtZTpudWxsLGluaXRpYWxpemU6ZnVuY3Rpb24o b3B0aW9ucyl7dGhpcy5zdGF0ZU5hbWU9e307dGhpcy5zdGF0ZU5hbWVbT3Blbkxh eWVycy5TdGF0ZS5JTlNFUlRdPSJ3ZnM6SW5zZXJ0Ijt0aGlzLnN0YXRlTmFtZVtP cGVuTGF5ZXJzLlN0YXRlLlVQREFURV09IndmczpVcGRhdGUiO3RoaXMuc3RhdGVO YW1lW09wZW5MYXllcnMuU3RhdGUuREVMRVRFXT0id2ZzOkRlbGV0ZSI7T3Blbkxh eWVycy5Gb3JtYXQuWE1MLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMs W29wdGlvbnNdKTt9LGdldFNyc05hbWU6ZnVuY3Rpb24oZmVhdHVyZSxvcHRpb25z KXt2YXIgc3JzTmFtZT1vcHRpb25zJiZvcHRpb25zLnNyc05hbWU7aWYoIXNyc05h bWUpe2lmKGZlYXR1cmUmJmZlYXR1cmUubGF5ZXIpe3Nyc05hbWU9ZmVhdHVyZS5s YXllci5wcm9qZWN0aW9uLmdldENvZGUoKTt9ZWxzZXtzcnNOYW1lPXRoaXMuc3Jz TmFtZTt9fQpyZXR1cm4gc3JzTmFtZTt9LHJlYWQ6ZnVuY3Rpb24oZGF0YSxvcHRp b25zKXtvcHRpb25zPW9wdGlvbnN8fHt9O09wZW5MYXllcnMuVXRpbC5hcHBseURl ZmF1bHRzKG9wdGlvbnMse291dHB1dDoiZmVhdHVyZXMifSk7aWYodHlwZW9mIGRh dGE9PSJzdHJpbmciKXtkYXRhPU9wZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5 cGUucmVhZC5hcHBseSh0aGlzLFtkYXRhXSk7fQppZihkYXRhJiZkYXRhLm5vZGVU eXBlPT05KXtkYXRhPWRhdGEuZG9jdW1lbnRFbGVtZW50O30KdmFyIG9iaj17fTtp ZihkYXRhKXt0aGlzLnJlYWROb2RlKGRhdGEsb2JqLHRydWUpO30KaWYob2JqLmZl YXR1cmVzJiZvcHRpb25zLm91dHB1dD09PSJmZWF0dXJlcyIpe29iaj1vYmouZmVh dHVyZXM7fQpyZXR1cm4gb2JqO30scmVhZGVyczp7IndmcyI6eyJGZWF0dXJlQ29s bGVjdGlvbiI6ZnVuY3Rpb24obm9kZSxvYmope29iai5mZWF0dXJlcz1bXTt0aGlz LnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqKTt9fX0sd3JpdGU6ZnVuY3Rpb24oZmVh dHVyZXMsb3B0aW9ucyl7dmFyIG5vZGU9dGhpcy53cml0ZU5vZGUoIndmczpUcmFu c2FjdGlvbiIse2ZlYXR1cmVzOmZlYXR1cmVzLG9wdGlvbnM6b3B0aW9uc30pO3Zh ciB2YWx1ZT10aGlzLnNjaGVtYUxvY2F0aW9uQXR0cigpO2lmKHZhbHVlKXt0aGlz LnNldEF0dHJpYnV0ZU5TKG5vZGUsdGhpcy5uYW1lc3BhY2VzWyJ4c2kiXSwieHNp OnNjaGVtYUxvY2F0aW9uIix2YWx1ZSk7fQpyZXR1cm4gT3BlbkxheWVycy5Gb3Jt YXQuWE1MLnByb3RvdHlwZS53cml0ZS5hcHBseSh0aGlzLFtub2RlXSk7fSx3cml0 ZXJzOnsid2ZzIjp7IkdldEZlYXR1cmUiOmZ1bmN0aW9uKG9wdGlvbnMpe3ZhciBu b2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygid2ZzOkdldEZlYXR1cmUiLHth dHRyaWJ1dGVzOntzZXJ2aWNlOiJXRlMiLHZlcnNpb246dGhpcy52ZXJzaW9uLGhh bmRsZTpvcHRpb25zJiZvcHRpb25zLmhhbmRsZSxvdXRwdXRGb3JtYXQ6b3B0aW9u cyYmb3B0aW9ucy5vdXRwdXRGb3JtYXQsbWF4RmVhdHVyZXM6b3B0aW9ucyYmb3B0 aW9ucy5tYXhGZWF0dXJlcywieHNpOnNjaGVtYUxvY2F0aW9uIjp0aGlzLnNjaGVt YUxvY2F0aW9uQXR0cihvcHRpb25zKX19KTtpZih0eXBlb2YgdGhpcy5mZWF0dXJl VHlwZT09InN0cmluZyIpe3RoaXMud3JpdGVOb2RlKCJRdWVyeSIsb3B0aW9ucyxu b2RlKTt9ZWxzZXtmb3IodmFyIGk9MCxsZW49dGhpcy5mZWF0dXJlVHlwZS5sZW5n dGg7aTxsZW47aSsrKXtvcHRpb25zLmZlYXR1cmVUeXBlPXRoaXMuZmVhdHVyZVR5 cGVbaV07dGhpcy53cml0ZU5vZGUoIlF1ZXJ5IixvcHRpb25zLG5vZGUpO319CnJl dHVybiBub2RlO30sIlRyYW5zYWN0aW9uIjpmdW5jdGlvbihvYmope29iaj1vYmp8 fHt9O3ZhciBvcHRpb25zPW9iai5vcHRpb25zfHx7fTt2YXIgbm9kZT10aGlzLmNy ZWF0ZUVsZW1lbnROU1BsdXMoIndmczpUcmFuc2FjdGlvbiIse2F0dHJpYnV0ZXM6 e3NlcnZpY2U6IldGUyIsdmVyc2lvbjp0aGlzLnZlcnNpb24saGFuZGxlOm9wdGlv bnMuaGFuZGxlfX0pO3ZhciBpLGxlbjt2YXIgZmVhdHVyZXM9b2JqLmZlYXR1cmVz O2lmKGZlYXR1cmVzKXtpZihvcHRpb25zLm11bHRpPT09dHJ1ZSl7T3BlbkxheWVy cy5VdGlsLmV4dGVuZCh0aGlzLmdlb21ldHJ5VHlwZXMseyJPcGVuTGF5ZXJzLkdl b21ldHJ5LlBvaW50IjoiTXVsdGlQb2ludCIsIk9wZW5MYXllcnMuR2VvbWV0cnku TGluZVN0cmluZyI6KHRoaXMubXVsdGlDdXJ2ZT09PXRydWUpPyJNdWx0aUN1cnZl IjoiTXVsdGlMaW5lU3RyaW5nIiwiT3BlbkxheWVycy5HZW9tZXRyeS5Qb2x5Z29u IjoodGhpcy5tdWx0aVN1cmZhY2U9PT10cnVlKT8iTXVsdGlTdXJmYWNlIjoiTXVs dGlQb2x5Z29uIn0pO30KdmFyIG5hbWUsZmVhdHVyZTtmb3IoaT0wLGxlbj1mZWF0 dXJlcy5sZW5ndGg7aTxsZW47KytpKXtmZWF0dXJlPWZlYXR1cmVzW2ldO25hbWU9 dGhpcy5zdGF0ZU5hbWVbZmVhdHVyZS5zdGF0ZV07aWYobmFtZSl7dGhpcy53cml0 ZU5vZGUobmFtZSx7ZmVhdHVyZTpmZWF0dXJlLG9wdGlvbnM6b3B0aW9uc30sbm9k ZSk7fX0KaWYob3B0aW9ucy5tdWx0aT09PXRydWUpe3RoaXMuc2V0R2VvbWV0cnlU eXBlcygpO319CmlmKG9wdGlvbnMubmF0aXZlRWxlbWVudHMpe2ZvcihpPTAsbGVu PW9wdGlvbnMubmF0aXZlRWxlbWVudHMubGVuZ3RoO2k8bGVuOysraSl7dGhpcy53 cml0ZU5vZGUoIndmczpOYXRpdmUiLG9wdGlvbnMubmF0aXZlRWxlbWVudHNbaV0s bm9kZSk7fX0KcmV0dXJuIG5vZGU7fSwiTmF0aXZlIjpmdW5jdGlvbihuYXRpdmVF bGVtZW50KXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIndmczpO YXRpdmUiLHthdHRyaWJ1dGVzOnt2ZW5kb3JJZDpuYXRpdmVFbGVtZW50LnZlbmRv cklkLHNhZmVUb0lnbm9yZTpuYXRpdmVFbGVtZW50LnNhZmVUb0lnbm9yZX0sdmFs dWU6bmF0aXZlRWxlbWVudC52YWx1ZX0pO3JldHVybiBub2RlO30sIkluc2VydCI6 ZnVuY3Rpb24ob2JqKXt2YXIgZmVhdHVyZT1vYmouZmVhdHVyZTt2YXIgb3B0aW9u cz1vYmoub3B0aW9uczt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMo IndmczpJbnNlcnQiLHthdHRyaWJ1dGVzOntoYW5kbGU6b3B0aW9ucyYmb3B0aW9u cy5oYW5kbGV9fSk7dGhpcy5zcnNOYW1lPXRoaXMuZ2V0U3JzTmFtZShmZWF0dXJl KTt0aGlzLndyaXRlTm9kZSgiZmVhdHVyZTpfdHlwZU5hbWUiLGZlYXR1cmUsbm9k ZSk7cmV0dXJuIG5vZGU7fSwiVXBkYXRlIjpmdW5jdGlvbihvYmope3ZhciBmZWF0 dXJlPW9iai5mZWF0dXJlO3ZhciBvcHRpb25zPW9iai5vcHRpb25zO3ZhciBub2Rl PXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygid2ZzOlVwZGF0ZSIse2F0dHJpYnV0 ZXM6e2hhbmRsZTpvcHRpb25zJiZvcHRpb25zLmhhbmRsZSx0eXBlTmFtZToodGhp cy5mZWF0dXJlTlM/dGhpcy5mZWF0dXJlUHJlZml4KyI6IjoiIikrCnRoaXMuZmVh dHVyZVR5cGV9fSk7aWYodGhpcy5mZWF0dXJlTlMpe25vZGUuc2V0QXR0cmlidXRl KCJ4bWxuczoiK3RoaXMuZmVhdHVyZVByZWZpeCx0aGlzLmZlYXR1cmVOUyk7fQp2 YXIgbW9kaWZpZWQ9ZmVhdHVyZS5tb2RpZmllZDtpZih0aGlzLmdlb21ldHJ5TmFt ZSE9PW51bGwmJighbW9kaWZpZWR8fG1vZGlmaWVkLmdlb21ldHJ5IT09dW5kZWZp bmVkKSl7dGhpcy5zcnNOYW1lPXRoaXMuZ2V0U3JzTmFtZShmZWF0dXJlKTt0aGlz LndyaXRlTm9kZSgiUHJvcGVydHkiLHtuYW1lOnRoaXMuZ2VvbWV0cnlOYW1lLHZh bHVlOmZlYXR1cmUuZ2VvbWV0cnl9LG5vZGUpO30KZm9yKHZhciBrZXkgaW4gZmVh dHVyZS5hdHRyaWJ1dGVzKXtpZihmZWF0dXJlLmF0dHJpYnV0ZXNba2V5XSE9PXVu ZGVmaW5lZCYmKCFtb2RpZmllZHx8IW1vZGlmaWVkLmF0dHJpYnV0ZXN8fChtb2Rp ZmllZC5hdHRyaWJ1dGVzJiZtb2RpZmllZC5hdHRyaWJ1dGVzW2tleV0hPT11bmRl ZmluZWQpKSl7dGhpcy53cml0ZU5vZGUoIlByb3BlcnR5Iix7bmFtZTprZXksdmFs dWU6ZmVhdHVyZS5hdHRyaWJ1dGVzW2tleV19LG5vZGUpO319CnRoaXMud3JpdGVO b2RlKCJvZ2M6RmlsdGVyIixuZXcgT3BlbkxheWVycy5GaWx0ZXIuRmVhdHVyZUlk KHtmaWRzOltmZWF0dXJlLmZpZF19KSxub2RlKTtyZXR1cm4gbm9kZTt9LCJQcm9w ZXJ0eSI6ZnVuY3Rpb24ob2JqKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnRO U1BsdXMoIndmczpQcm9wZXJ0eSIpO3RoaXMud3JpdGVOb2RlKCJOYW1lIixvYmou bmFtZSxub2RlKTtpZihvYmoudmFsdWUhPT1udWxsKXt0aGlzLndyaXRlTm9kZSgi VmFsdWUiLG9iai52YWx1ZSxub2RlKTt9CnJldHVybiBub2RlO30sIk5hbWUiOmZ1 bmN0aW9uKG5hbWUpe3JldHVybiB0aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIndm czpOYW1lIix7dmFsdWU6bmFtZX0pO30sIlZhbHVlIjpmdW5jdGlvbihvYmope3Zh ciBub2RlO2lmKG9iaiBpbnN0YW5jZW9mIE9wZW5MYXllcnMuR2VvbWV0cnkpe25v ZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJ3ZnM6VmFsdWUiKTt2YXIgZ2Vv bT10aGlzLndyaXRlTm9kZSgiZmVhdHVyZTpfZ2VvbWV0cnkiLG9iaikuZmlyc3RD aGlsZDtub2RlLmFwcGVuZENoaWxkKGdlb20pO31lbHNle25vZGU9dGhpcy5jcmVh dGVFbGVtZW50TlNQbHVzKCJ3ZnM6VmFsdWUiLHt2YWx1ZTpvYmp9KTt9CnJldHVy biBub2RlO30sIkRlbGV0ZSI6ZnVuY3Rpb24ob2JqKXt2YXIgZmVhdHVyZT1vYmou ZmVhdHVyZTt2YXIgb3B0aW9ucz1vYmoub3B0aW9uczt2YXIgbm9kZT10aGlzLmNy ZWF0ZUVsZW1lbnROU1BsdXMoIndmczpEZWxldGUiLHthdHRyaWJ1dGVzOntoYW5k bGU6b3B0aW9ucyYmb3B0aW9ucy5oYW5kbGUsdHlwZU5hbWU6KHRoaXMuZmVhdHVy ZU5TP3RoaXMuZmVhdHVyZVByZWZpeCsiOiI6IiIpKwp0aGlzLmZlYXR1cmVUeXBl fX0pO2lmKHRoaXMuZmVhdHVyZU5TKXtub2RlLnNldEF0dHJpYnV0ZSgieG1sbnM6 Iit0aGlzLmZlYXR1cmVQcmVmaXgsdGhpcy5mZWF0dXJlTlMpO30KdGhpcy53cml0 ZU5vZGUoIm9nYzpGaWx0ZXIiLG5ldyBPcGVuTGF5ZXJzLkZpbHRlci5GZWF0dXJl SWQoe2ZpZHM6W2ZlYXR1cmUuZmlkXX0pLG5vZGUpO3JldHVybiBub2RlO319fSxz Y2hlbWFMb2NhdGlvbkF0dHI6ZnVuY3Rpb24ob3B0aW9ucyl7b3B0aW9ucz1PcGVu TGF5ZXJzLlV0aWwuZXh0ZW5kKHtmZWF0dXJlUHJlZml4OnRoaXMuZmVhdHVyZVBy ZWZpeCxzY2hlbWE6dGhpcy5zY2hlbWF9LG9wdGlvbnMpO3ZhciBzY2hlbWFMb2Nh dGlvbnM9T3BlbkxheWVycy5VdGlsLmV4dGVuZCh7fSx0aGlzLnNjaGVtYUxvY2F0 aW9ucyk7aWYob3B0aW9ucy5zY2hlbWEpe3NjaGVtYUxvY2F0aW9uc1tvcHRpb25z LmZlYXR1cmVQcmVmaXhdPW9wdGlvbnMuc2NoZW1hO30KdmFyIHBhcnRzPVtdO3Zh ciB1cmk7Zm9yKHZhciBrZXkgaW4gc2NoZW1hTG9jYXRpb25zKXt1cmk9dGhpcy5u YW1lc3BhY2VzW2tleV07aWYodXJpKXtwYXJ0cy5wdXNoKHVyaSsiICIrc2NoZW1h TG9jYXRpb25zW2tleV0pO319CnZhciB2YWx1ZT1wYXJ0cy5qb2luKCIgIil8fHVu ZGVmaW5lZDtyZXR1cm4gdmFsdWU7fSxzZXRGaWx0ZXJQcm9wZXJ0eTpmdW5jdGlv bihmaWx0ZXIpe2lmKGZpbHRlci5maWx0ZXJzKXtmb3IodmFyIGk9MCxsZW49Zmls dGVyLmZpbHRlcnMubGVuZ3RoO2k8bGVuOysraSl7dGhpcy5zZXRGaWx0ZXJQcm9w ZXJ0eShmaWx0ZXIuZmlsdGVyc1tpXSk7fX1lbHNle2lmKGZpbHRlciBpbnN0YW5j ZW9mIE9wZW5MYXllcnMuRmlsdGVyLlNwYXRpYWwpe2ZpbHRlci5wcm9wZXJ0eT10 aGlzLmdlb21ldHJ5TmFtZTt9fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3Jt YXQuV0ZTVC52MSJ9KTtPcGVuTGF5ZXJzLkZvcm1hdC5PR0NFeGNlcHRpb25SZXBv cnQ9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkZvcm1hdC5YTUwse25hbWVz cGFjZXM6e29nYzoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9vZ2MifSxyZWdFeGVz Ont0cmltU3BhY2U6KC9eXHMqfFxzKiQvZykscmVtb3ZlU3BhY2U6KC9ccyovZyks c3BsaXRTcGFjZTooL1xzKy8pLHRyaW1Db21tYTooL1xzKixccyovZyl9LGRlZmF1 bHRQcmVmaXg6Im9nYyIscmVhZDpmdW5jdGlvbihkYXRhKXt2YXIgcmVzdWx0O2lm KHR5cGVvZiBkYXRhPT0ic3RyaW5nIil7ZGF0YT1PcGVuTGF5ZXJzLkZvcm1hdC5Y TUwucHJvdG90eXBlLnJlYWQuYXBwbHkodGhpcyxbZGF0YV0pO30KdmFyIHJvb3Q9 ZGF0YS5kb2N1bWVudEVsZW1lbnQ7dmFyIGV4Y2VwdGlvbkluZm89e2V4Y2VwdGlv blJlcG9ydDpudWxsfTtpZihyb290KXt0aGlzLnJlYWRDaGlsZE5vZGVzKGRhdGEs ZXhjZXB0aW9uSW5mbyk7aWYoZXhjZXB0aW9uSW5mby5leGNlcHRpb25SZXBvcnQ9 PT1udWxsKXtleGNlcHRpb25JbmZvPW5ldyBPcGVuTGF5ZXJzLkZvcm1hdC5PV1ND b21tb24oKS5yZWFkKGRhdGEpO319CnJldHVybiBleGNlcHRpb25JbmZvO30scmVh ZGVyczp7Im9nYyI6eyJTZXJ2aWNlRXhjZXB0aW9uUmVwb3J0IjpmdW5jdGlvbihu b2RlLG9iail7b2JqLmV4Y2VwdGlvblJlcG9ydD17ZXhjZXB0aW9uczpbXX07dGhp cy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iai5leGNlcHRpb25SZXBvcnQpO30sIlNl cnZpY2VFeGNlcHRpb24iOmZ1bmN0aW9uKG5vZGUsZXhjZXB0aW9uUmVwb3J0KXt2 YXIgZXhjZXB0aW9uPXtjb2RlOm5vZGUuZ2V0QXR0cmlidXRlKCJjb2RlIiksbG9j YXRvcjpub2RlLmdldEF0dHJpYnV0ZSgibG9jYXRvciIpLHRleHQ6dGhpcy5nZXRD aGlsZFZhbHVlKG5vZGUpfTtleGNlcHRpb25SZXBvcnQuZXhjZXB0aW9ucy5wdXNo KGV4Y2VwdGlvbik7fX19LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0Lk9H Q0V4Y2VwdGlvblJlcG9ydCJ9KTtPcGVuTGF5ZXJzLkZvcm1hdC5YTUwuVmVyc2lv bmVkT0dDPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Gb3JtYXQuWE1MLHtk ZWZhdWx0VmVyc2lvbjpudWxsLHZlcnNpb246bnVsbCxwcm9maWxlOm51bGwsZXJy b3JQcm9wZXJ0eTpudWxsLG5hbWU6bnVsbCxzdHJpbmdpZnlPdXRwdXQ6ZmFsc2Us cGFyc2VyOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXtPcGVuTGF5 ZXJzLkZvcm1hdC5YTUwucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxb b3B0aW9uc10pO3ZhciBjbGFzc05hbWU9dGhpcy5DTEFTU19OQU1FO3RoaXMubmFt ZT1jbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIp KzEpO30sZ2V0VmVyc2lvbjpmdW5jdGlvbihyb290LG9wdGlvbnMpe3ZhciB2ZXJz aW9uO2lmKHJvb3Qpe3ZlcnNpb249dGhpcy52ZXJzaW9uO2lmKCF2ZXJzaW9uKXt2 ZXJzaW9uPXJvb3QuZ2V0QXR0cmlidXRlKCJ2ZXJzaW9uIik7aWYoIXZlcnNpb24p e3ZlcnNpb249dGhpcy5kZWZhdWx0VmVyc2lvbjt9fX1lbHNle3ZlcnNpb249KG9w dGlvbnMmJm9wdGlvbnMudmVyc2lvbil8fHRoaXMudmVyc2lvbnx8dGhpcy5kZWZh dWx0VmVyc2lvbjt9CnJldHVybiB2ZXJzaW9uO30sZ2V0UGFyc2VyOmZ1bmN0aW9u KHZlcnNpb24pe3ZlcnNpb249dmVyc2lvbnx8dGhpcy5kZWZhdWx0VmVyc2lvbjt2 YXIgcHJvZmlsZT10aGlzLnByb2ZpbGU/Il8iK3RoaXMucHJvZmlsZToiIjtpZigh dGhpcy5wYXJzZXJ8fHRoaXMucGFyc2VyLlZFUlNJT04hPXZlcnNpb24pe3ZhciBm b3JtYXQ9T3BlbkxheWVycy5Gb3JtYXRbdGhpcy5uYW1lXVsidiIrdmVyc2lvbi5y ZXBsYWNlKC9cLi9nLCJfIikrcHJvZmlsZV07aWYoIWZvcm1hdCl7dGhyb3ciQ2Fu J3QgZmluZCBhICIrdGhpcy5uYW1lKyIgcGFyc2VyIGZvciB2ZXJzaW9uICIrCnZl cnNpb24rcHJvZmlsZTt9CnRoaXMucGFyc2VyPW5ldyBmb3JtYXQodGhpcy5vcHRp b25zKTt9CnJldHVybiB0aGlzLnBhcnNlcjt9LHdyaXRlOmZ1bmN0aW9uKG9iaixv cHRpb25zKXt2YXIgdmVyc2lvbj10aGlzLmdldFZlcnNpb24obnVsbCxvcHRpb25z KTt0aGlzLnBhcnNlcj10aGlzLmdldFBhcnNlcih2ZXJzaW9uKTt2YXIgcm9vdD10 aGlzLnBhcnNlci53cml0ZShvYmosb3B0aW9ucyk7aWYodGhpcy5zdHJpbmdpZnlP dXRwdXQ9PT1mYWxzZSl7cmV0dXJuIHJvb3Q7fWVsc2V7cmV0dXJuIE9wZW5MYXll cnMuRm9ybWF0LlhNTC5wcm90b3R5cGUud3JpdGUuYXBwbHkodGhpcyxbcm9vdF0p O319LHJlYWQ6ZnVuY3Rpb24oZGF0YSxvcHRpb25zKXtpZih0eXBlb2YgZGF0YT09 InN0cmluZyIpe2RhdGE9T3BlbkxheWVycy5Gb3JtYXQuWE1MLnByb3RvdHlwZS5y ZWFkLmFwcGx5KHRoaXMsW2RhdGFdKTt9CnZhciByb290PWRhdGEuZG9jdW1lbnRF bGVtZW50O3ZhciB2ZXJzaW9uPXRoaXMuZ2V0VmVyc2lvbihyb290KTt0aGlzLnBh cnNlcj10aGlzLmdldFBhcnNlcih2ZXJzaW9uKTt2YXIgb2JqPXRoaXMucGFyc2Vy LnJlYWQoZGF0YSxvcHRpb25zKTtpZih0aGlzLmVycm9yUHJvcGVydHkhPT1udWxs JiZvYmpbdGhpcy5lcnJvclByb3BlcnR5XT09PXVuZGVmaW5lZCl7dmFyIGZvcm1h dD1uZXcgT3BlbkxheWVycy5Gb3JtYXQuT0dDRXhjZXB0aW9uUmVwb3J0KCk7b2Jq LmVycm9yPWZvcm1hdC5yZWFkKGRhdGEpO30Kb2JqLnZlcnNpb249dmVyc2lvbjty ZXR1cm4gb2JqO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3JtYXQuWE1MLlZl cnNpb25lZE9HQyJ9KTtPcGVuTGF5ZXJzLlN0eWxlPU9wZW5MYXllcnMuQ2xhc3Mo e2lkOm51bGwsbmFtZTpudWxsLHRpdGxlOm51bGwsZGVzY3JpcHRpb246bnVsbCxs YXllck5hbWU6bnVsbCxpc0RlZmF1bHQ6ZmFsc2UscnVsZXM6bnVsbCxjb250ZXh0 Om51bGwsZGVmYXVsdFN0eWxlOm51bGwsZGVmYXVsdHNQZXJTeW1ib2xpemVyOmZh bHNlLHByb3BlcnR5U3R5bGVzOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihzdHls ZSxvcHRpb25zKXtPcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHRoaXMsb3B0aW9ucyk7 dGhpcy5ydWxlcz1bXTtpZihvcHRpb25zJiZvcHRpb25zLnJ1bGVzKXt0aGlzLmFk ZFJ1bGVzKG9wdGlvbnMucnVsZXMpO30KdGhpcy5zZXREZWZhdWx0U3R5bGUoc3R5 bGV8fE9wZW5MYXllcnMuRmVhdHVyZS5WZWN0b3Iuc3R5bGVbImRlZmF1bHQiXSk7 dGhpcy5pZD1PcGVuTGF5ZXJzLlV0aWwuY3JlYXRlVW5pcXVlSUQodGhpcy5DTEFT U19OQU1FKyJfIik7fSxkZXN0cm95OmZ1bmN0aW9uKCl7Zm9yKHZhciBpPTAsbGVu PXRoaXMucnVsZXMubGVuZ3RoO2k8bGVuO2krKyl7dGhpcy5ydWxlc1tpXS5kZXN0 cm95KCk7dGhpcy5ydWxlc1tpXT1udWxsO30KdGhpcy5ydWxlcz1udWxsO3RoaXMu ZGVmYXVsdFN0eWxlPW51bGw7fSxjcmVhdGVTeW1ib2xpemVyOmZ1bmN0aW9uKGZl YXR1cmUpe3ZhciBzdHlsZT10aGlzLmRlZmF1bHRzUGVyU3ltYm9saXplcj97fTp0 aGlzLmNyZWF0ZUxpdGVyYWxzKE9wZW5MYXllcnMuVXRpbC5leHRlbmQoe30sdGhp cy5kZWZhdWx0U3R5bGUpLGZlYXR1cmUpO3ZhciBydWxlcz10aGlzLnJ1bGVzO3Zh ciBydWxlLGNvbnRleHQ7dmFyIGVsc2VSdWxlcz1bXTt2YXIgYXBwbGllZFJ1bGVz PWZhbHNlO2Zvcih2YXIgaT0wLGxlbj1ydWxlcy5sZW5ndGg7aTxsZW47aSsrKXty dWxlPXJ1bGVzW2ldO3ZhciBhcHBsaWVzPXJ1bGUuZXZhbHVhdGUoZmVhdHVyZSk7 aWYoYXBwbGllcyl7aWYocnVsZSBpbnN0YW5jZW9mIE9wZW5MYXllcnMuUnVsZSYm cnVsZS5lbHNlRmlsdGVyKXtlbHNlUnVsZXMucHVzaChydWxlKTt9ZWxzZXthcHBs aWVkUnVsZXM9dHJ1ZTt0aGlzLmFwcGx5U3ltYm9saXplcihydWxlLHN0eWxlLGZl YXR1cmUpO319fQppZihhcHBsaWVkUnVsZXM9PWZhbHNlJiZlbHNlUnVsZXMubGVu Z3RoPjApe2FwcGxpZWRSdWxlcz10cnVlO2Zvcih2YXIgaT0wLGxlbj1lbHNlUnVs ZXMubGVuZ3RoO2k8bGVuO2krKyl7dGhpcy5hcHBseVN5bWJvbGl6ZXIoZWxzZVJ1 bGVzW2ldLHN0eWxlLGZlYXR1cmUpO319CmlmKHJ1bGVzLmxlbmd0aD4wJiZhcHBs aWVkUnVsZXM9PWZhbHNlKXtzdHlsZS5kaXNwbGF5PSJub25lIjt9CmlmKHN0eWxl LmxhYmVsJiZ0eXBlb2Ygc3R5bGUubGFiZWwhPT0ic3RyaW5nIil7c3R5bGUubGFi ZWw9U3RyaW5nKHN0eWxlLmxhYmVsKTt9CnJldHVybiBzdHlsZTt9LGFwcGx5U3lt Ym9saXplcjpmdW5jdGlvbihydWxlLHN0eWxlLGZlYXR1cmUpe3ZhciBzeW1ib2xp emVyUHJlZml4PWZlYXR1cmUuZ2VvbWV0cnk/dGhpcy5nZXRTeW1ib2xpemVyUHJl Zml4KGZlYXR1cmUuZ2VvbWV0cnkpOk9wZW5MYXllcnMuU3R5bGUuU1lNQk9MSVpF Ul9QUkVGSVhFU1swXTt2YXIgc3ltYm9saXplcj1ydWxlLnN5bWJvbGl6ZXJbc3lt Ym9saXplclByZWZpeF18fHJ1bGUuc3ltYm9saXplcjtpZih0aGlzLmRlZmF1bHRz UGVyU3ltYm9saXplcj09PXRydWUpe3ZhciBkZWZhdWx0cz10aGlzLmRlZmF1bHRT dHlsZTtPcGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyhzeW1ib2xpemVyLHtw b2ludFJhZGl1czpkZWZhdWx0cy5wb2ludFJhZGl1c30pO2lmKHN5bWJvbGl6ZXIu c3Ryb2tlPT09dHJ1ZXx8c3ltYm9saXplci5ncmFwaGljPT09dHJ1ZSl7T3Blbkxh eWVycy5VdGlsLmFwcGx5RGVmYXVsdHMoc3ltYm9saXplcix7c3Ryb2tlV2lkdGg6 ZGVmYXVsdHMuc3Ryb2tlV2lkdGgsc3Ryb2tlQ29sb3I6ZGVmYXVsdHMuc3Ryb2tl Q29sb3Isc3Ryb2tlT3BhY2l0eTpkZWZhdWx0cy5zdHJva2VPcGFjaXR5LHN0cm9r ZURhc2hzdHlsZTpkZWZhdWx0cy5zdHJva2VEYXNoc3R5bGUsc3Ryb2tlTGluZWNh cDpkZWZhdWx0cy5zdHJva2VMaW5lY2FwfSk7fQppZihzeW1ib2xpemVyLmZpbGw9 PT10cnVlfHxzeW1ib2xpemVyLmdyYXBoaWM9PT10cnVlKXtPcGVuTGF5ZXJzLlV0 aWwuYXBwbHlEZWZhdWx0cyhzeW1ib2xpemVyLHtmaWxsQ29sb3I6ZGVmYXVsdHMu ZmlsbENvbG9yLGZpbGxPcGFjaXR5OmRlZmF1bHRzLmZpbGxPcGFjaXR5fSk7fQpp ZihzeW1ib2xpemVyLmdyYXBoaWM9PT10cnVlKXtPcGVuTGF5ZXJzLlV0aWwuYXBw bHlEZWZhdWx0cyhzeW1ib2xpemVyLHtwb2ludFJhZGl1czp0aGlzLmRlZmF1bHRT dHlsZS5wb2ludFJhZGl1cyxleHRlcm5hbEdyYXBoaWM6dGhpcy5kZWZhdWx0U3R5 bGUuZXh0ZXJuYWxHcmFwaGljLGdyYXBoaWNOYW1lOnRoaXMuZGVmYXVsdFN0eWxl LmdyYXBoaWNOYW1lLGdyYXBoaWNPcGFjaXR5OnRoaXMuZGVmYXVsdFN0eWxlLmdy YXBoaWNPcGFjaXR5LGdyYXBoaWNXaWR0aDp0aGlzLmRlZmF1bHRTdHlsZS5ncmFw aGljV2lkdGgsZ3JhcGhpY0hlaWdodDp0aGlzLmRlZmF1bHRTdHlsZS5ncmFwaGlj SGVpZ2h0LGdyYXBoaWNYT2Zmc2V0OnRoaXMuZGVmYXVsdFN0eWxlLmdyYXBoaWNY T2Zmc2V0LGdyYXBoaWNZT2Zmc2V0OnRoaXMuZGVmYXVsdFN0eWxlLmdyYXBoaWNZ T2Zmc2V0fSk7fX0KcmV0dXJuIHRoaXMuY3JlYXRlTGl0ZXJhbHMoT3BlbkxheWVy cy5VdGlsLmV4dGVuZChzdHlsZSxzeW1ib2xpemVyKSxmZWF0dXJlKTt9LGNyZWF0 ZUxpdGVyYWxzOmZ1bmN0aW9uKHN0eWxlLGZlYXR1cmUpe3ZhciBjb250ZXh0PU9w ZW5MYXllcnMuVXRpbC5leHRlbmQoe30sZmVhdHVyZS5hdHRyaWJ1dGVzfHxmZWF0 dXJlLmRhdGEpO09wZW5MYXllcnMuVXRpbC5leHRlbmQoY29udGV4dCx0aGlzLmNv bnRleHQpO2Zvcih2YXIgaSBpbiB0aGlzLnByb3BlcnR5U3R5bGVzKXtzdHlsZVtp XT1PcGVuTGF5ZXJzLlN0eWxlLmNyZWF0ZUxpdGVyYWwoc3R5bGVbaV0sY29udGV4 dCxmZWF0dXJlLGkpO30KcmV0dXJuIHN0eWxlO30sZmluZFByb3BlcnR5U3R5bGVz OmZ1bmN0aW9uKCl7dmFyIHByb3BlcnR5U3R5bGVzPXt9O3ZhciBzdHlsZT10aGlz LmRlZmF1bHRTdHlsZTt0aGlzLmFkZFByb3BlcnR5U3R5bGVzKHByb3BlcnR5U3R5 bGVzLHN0eWxlKTt2YXIgcnVsZXM9dGhpcy5ydWxlczt2YXIgc3ltYm9saXplcix2 YWx1ZTtmb3IodmFyIGk9MCxsZW49cnVsZXMubGVuZ3RoO2k8bGVuO2krKyl7c3lt Ym9saXplcj1ydWxlc1tpXS5zeW1ib2xpemVyO2Zvcih2YXIga2V5IGluIHN5bWJv bGl6ZXIpe3ZhbHVlPXN5bWJvbGl6ZXJba2V5XTtpZih0eXBlb2YgdmFsdWU9PSJv YmplY3QiKXt0aGlzLmFkZFByb3BlcnR5U3R5bGVzKHByb3BlcnR5U3R5bGVzLHZh bHVlKTt9ZWxzZXt0aGlzLmFkZFByb3BlcnR5U3R5bGVzKHByb3BlcnR5U3R5bGVz LHN5bWJvbGl6ZXIpO2JyZWFrO319fQpyZXR1cm4gcHJvcGVydHlTdHlsZXM7fSxh ZGRQcm9wZXJ0eVN0eWxlczpmdW5jdGlvbihwcm9wZXJ0eVN0eWxlcyxzeW1ib2xp emVyKXt2YXIgcHJvcGVydHk7Zm9yKHZhciBrZXkgaW4gc3ltYm9saXplcil7cHJv cGVydHk9c3ltYm9saXplcltrZXldO2lmKHR5cGVvZiBwcm9wZXJ0eT09InN0cmlu ZyImJnByb3BlcnR5Lm1hdGNoKC9cJFx7XHcrXH0vKSl7cHJvcGVydHlTdHlsZXNb a2V5XT10cnVlO319CnJldHVybiBwcm9wZXJ0eVN0eWxlczt9LGFkZFJ1bGVzOmZ1 bmN0aW9uKHJ1bGVzKXtBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLnJ1 bGVzLHJ1bGVzKTt0aGlzLnByb3BlcnR5U3R5bGVzPXRoaXMuZmluZFByb3BlcnR5 U3R5bGVzKCk7fSxzZXREZWZhdWx0U3R5bGU6ZnVuY3Rpb24oc3R5bGUpe3RoaXMu ZGVmYXVsdFN0eWxlPXN0eWxlO3RoaXMucHJvcGVydHlTdHlsZXM9dGhpcy5maW5k UHJvcGVydHlTdHlsZXMoKTt9LGdldFN5bWJvbGl6ZXJQcmVmaXg6ZnVuY3Rpb24o Z2VvbWV0cnkpe3ZhciBwcmVmaXhlcz1PcGVuTGF5ZXJzLlN0eWxlLlNZTUJPTEla RVJfUFJFRklYRVM7Zm9yKHZhciBpPTAsbGVuPXByZWZpeGVzLmxlbmd0aDtpPGxl bjtpKyspe2lmKGdlb21ldHJ5LkNMQVNTX05BTUUuaW5kZXhPZihwcmVmaXhlc1tp XSkhPS0xKXtyZXR1cm4gcHJlZml4ZXNbaV07fX19LGNsb25lOmZ1bmN0aW9uKCl7 dmFyIG9wdGlvbnM9T3BlbkxheWVycy5VdGlsLmV4dGVuZCh7fSx0aGlzKTtpZih0 aGlzLnJ1bGVzKXtvcHRpb25zLnJ1bGVzPVtdO2Zvcih2YXIgaT0wLGxlbj10aGlz LnJ1bGVzLmxlbmd0aDtpPGxlbjsrK2kpe29wdGlvbnMucnVsZXMucHVzaCh0aGlz LnJ1bGVzW2ldLmNsb25lKCkpO319Cm9wdGlvbnMuY29udGV4dD10aGlzLmNvbnRl eHQmJk9wZW5MYXllcnMuVXRpbC5leHRlbmQoe30sdGhpcy5jb250ZXh0KTt2YXIg ZGVmYXVsdFN0eWxlPU9wZW5MYXllcnMuVXRpbC5leHRlbmQoe30sdGhpcy5kZWZh dWx0U3R5bGUpO3JldHVybiBuZXcgT3BlbkxheWVycy5TdHlsZShkZWZhdWx0U3R5 bGUsb3B0aW9ucyk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLlN0eWxlIn0pO09w ZW5MYXllcnMuU3R5bGUuY3JlYXRlTGl0ZXJhbD1mdW5jdGlvbih2YWx1ZSxjb250 ZXh0LGZlYXR1cmUscHJvcGVydHkpe2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyIm JnZhbHVlLmluZGV4T2YoIiR7IikhPS0xKXt2YWx1ZT1PcGVuTGF5ZXJzLlN0cmlu Zy5mb3JtYXQodmFsdWUsY29udGV4dCxbZmVhdHVyZSxwcm9wZXJ0eV0pO3ZhbHVl PShpc05hTih2YWx1ZSl8fCF2YWx1ZSk/dmFsdWU6cGFyc2VGbG9hdCh2YWx1ZSk7 fQpyZXR1cm4gdmFsdWU7fTtPcGVuTGF5ZXJzLlN0eWxlLlNZTUJPTElaRVJfUFJF RklYRVM9WydQb2ludCcsJ0xpbmUnLCdQb2x5Z29uJywnVGV4dCcsJ1Jhc3Rlcidd O09wZW5MYXllcnMuRmlsdGVyPU9wZW5MYXllcnMuQ2xhc3Moe2luaXRpYWxpemU6 ZnVuY3Rpb24ob3B0aW9ucyl7T3BlbkxheWVycy5VdGlsLmV4dGVuZCh0aGlzLG9w dGlvbnMpO30sZGVzdHJveTpmdW5jdGlvbigpe30sZXZhbHVhdGU6ZnVuY3Rpb24o Y29udGV4dCl7cmV0dXJuIHRydWU7fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBu dWxsO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5GaWx0ZXIifSk7T3BlbkxheWVy cy5GaWx0ZXIuRmVhdHVyZUlkPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5G aWx0ZXIse2ZpZHM6bnVsbCx0eXBlOiJGSUQiLGluaXRpYWxpemU6ZnVuY3Rpb24o b3B0aW9ucyl7dGhpcy5maWRzPVtdO09wZW5MYXllcnMuRmlsdGVyLnByb3RvdHlw ZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW29wdGlvbnNdKTt9LGV2YWx1YXRlOmZ1 bmN0aW9uKGZlYXR1cmUpe2Zvcih2YXIgaT0wLGxlbj10aGlzLmZpZHMubGVuZ3Ro O2k8bGVuO2krKyl7dmFyIGZpZD1mZWF0dXJlLmZpZHx8ZmVhdHVyZS5pZDtpZihm aWQ9PXRoaXMuZmlkc1tpXSl7cmV0dXJuIHRydWU7fX0KcmV0dXJuIGZhbHNlO30s Y2xvbmU6ZnVuY3Rpb24oKXt2YXIgZmlsdGVyPW5ldyBPcGVuTGF5ZXJzLkZpbHRl ci5GZWF0dXJlSWQoKTtPcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKGZpbHRlcix0aGlz KTtmaWx0ZXIuZmlkcz10aGlzLmZpZHMuc2xpY2UoKTtyZXR1cm4gZmlsdGVyO30s Q0xBU1NfTkFNRToiT3BlbkxheWVycy5GaWx0ZXIuRmVhdHVyZUlkIn0pO09wZW5M YXllcnMuRmlsdGVyLkxvZ2ljYWw9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJz LkZpbHRlcix7ZmlsdGVyczpudWxsLHR5cGU6bnVsbCxpbml0aWFsaXplOmZ1bmN0 aW9uKG9wdGlvbnMpe3RoaXMuZmlsdGVycz1bXTtPcGVuTGF5ZXJzLkZpbHRlci5w cm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7fSxkZXN0 cm95OmZ1bmN0aW9uKCl7dGhpcy5maWx0ZXJzPW51bGw7T3BlbkxheWVycy5GaWx0 ZXIucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyk7fSxldmFsdWF0ZTpmdW5j dGlvbihjb250ZXh0KXt2YXIgaSxsZW47c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSBP cGVuTGF5ZXJzLkZpbHRlci5Mb2dpY2FsLkFORDpmb3IoaT0wLGxlbj10aGlzLmZp bHRlcnMubGVuZ3RoO2k8bGVuO2krKyl7aWYodGhpcy5maWx0ZXJzW2ldLmV2YWx1 YXRlKGNvbnRleHQpPT1mYWxzZSl7cmV0dXJuIGZhbHNlO319CnJldHVybiB0cnVl O2Nhc2UgT3BlbkxheWVycy5GaWx0ZXIuTG9naWNhbC5PUjpmb3IoaT0wLGxlbj10 aGlzLmZpbHRlcnMubGVuZ3RoO2k8bGVuO2krKyl7aWYodGhpcy5maWx0ZXJzW2ld LmV2YWx1YXRlKGNvbnRleHQpPT10cnVlKXtyZXR1cm4gdHJ1ZTt9fQpyZXR1cm4g ZmFsc2U7Y2FzZSBPcGVuTGF5ZXJzLkZpbHRlci5Mb2dpY2FsLk5PVDpyZXR1cm4o IXRoaXMuZmlsdGVyc1swXS5ldmFsdWF0ZShjb250ZXh0KSk7fQpyZXR1cm4gdW5k ZWZpbmVkO30sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgZmlsdGVycz1bXTtmb3IodmFy IGk9MCxsZW49dGhpcy5maWx0ZXJzLmxlbmd0aDtpPGxlbjsrK2kpe2ZpbHRlcnMu cHVzaCh0aGlzLmZpbHRlcnNbaV0uY2xvbmUoKSk7fQpyZXR1cm4gbmV3IE9wZW5M YXllcnMuRmlsdGVyLkxvZ2ljYWwoe3R5cGU6dGhpcy50eXBlLGZpbHRlcnM6Zmls dGVyc30pO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5GaWx0ZXIuTG9naWNhbCJ9 KTtPcGVuTGF5ZXJzLkZpbHRlci5Mb2dpY2FsLkFORD0iJiYiO09wZW5MYXllcnMu RmlsdGVyLkxvZ2ljYWwuT1I9Inx8IjtPcGVuTGF5ZXJzLkZpbHRlci5Mb2dpY2Fs Lk5PVD0iISI7T3BlbkxheWVycy5GaWx0ZXIuQ29tcGFyaXNvbj1PcGVuTGF5ZXJz LkNsYXNzKE9wZW5MYXllcnMuRmlsdGVyLHt0eXBlOm51bGwscHJvcGVydHk6bnVs bCx2YWx1ZTpudWxsLG1hdGNoQ2FzZTp0cnVlLGxvd2VyQm91bmRhcnk6bnVsbCx1 cHBlckJvdW5kYXJ5Om51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXtP cGVuTGF5ZXJzLkZpbHRlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlz LFtvcHRpb25zXSk7aWYodGhpcy50eXBlPT09T3BlbkxheWVycy5GaWx0ZXIuQ29t cGFyaXNvbi5MSUtFJiZvcHRpb25zLm1hdGNoQ2FzZT09PXVuZGVmaW5lZCl7dGhp cy5tYXRjaENhc2U9bnVsbDt9fSxldmFsdWF0ZTpmdW5jdGlvbihjb250ZXh0KXtp Zihjb250ZXh0IGluc3RhbmNlb2YgT3BlbkxheWVycy5GZWF0dXJlLlZlY3Rvcil7 Y29udGV4dD1jb250ZXh0LmF0dHJpYnV0ZXM7fQp2YXIgcmVzdWx0PWZhbHNlO3Zh ciBnb3Q9Y29udGV4dFt0aGlzLnByb3BlcnR5XTt2YXIgZXhwO3N3aXRjaCh0aGlz LnR5cGUpe2Nhc2UgT3BlbkxheWVycy5GaWx0ZXIuQ29tcGFyaXNvbi5FUVVBTF9U TzpleHA9dGhpcy52YWx1ZTtpZighdGhpcy5tYXRjaENhc2UmJnR5cGVvZiBnb3Q9 PSJzdHJpbmciJiZ0eXBlb2YgZXhwPT0ic3RyaW5nIil7cmVzdWx0PShnb3QudG9V cHBlckNhc2UoKT09ZXhwLnRvVXBwZXJDYXNlKCkpO31lbHNle3Jlc3VsdD0oZ290 PT1leHApO30KYnJlYWs7Y2FzZSBPcGVuTGF5ZXJzLkZpbHRlci5Db21wYXJpc29u Lk5PVF9FUVVBTF9UTzpleHA9dGhpcy52YWx1ZTtpZighdGhpcy5tYXRjaENhc2Um JnR5cGVvZiBnb3Q9PSJzdHJpbmciJiZ0eXBlb2YgZXhwPT0ic3RyaW5nIil7cmVz dWx0PShnb3QudG9VcHBlckNhc2UoKSE9ZXhwLnRvVXBwZXJDYXNlKCkpO31lbHNl e3Jlc3VsdD0oZ290IT1leHApO30KYnJlYWs7Y2FzZSBPcGVuTGF5ZXJzLkZpbHRl ci5Db21wYXJpc29uLkxFU1NfVEhBTjpyZXN1bHQ9Z290PHRoaXMudmFsdWU7YnJl YWs7Y2FzZSBPcGVuTGF5ZXJzLkZpbHRlci5Db21wYXJpc29uLkdSRUFURVJfVEhB TjpyZXN1bHQ9Z290PnRoaXMudmFsdWU7YnJlYWs7Y2FzZSBPcGVuTGF5ZXJzLkZp bHRlci5Db21wYXJpc29uLkxFU1NfVEhBTl9PUl9FUVVBTF9UTzpyZXN1bHQ9Z290 PD10aGlzLnZhbHVlO2JyZWFrO2Nhc2UgT3BlbkxheWVycy5GaWx0ZXIuQ29tcGFy aXNvbi5HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE86cmVzdWx0PWdvdD49dGhpcy52 YWx1ZTticmVhaztjYXNlIE9wZW5MYXllcnMuRmlsdGVyLkNvbXBhcmlzb24uQkVU V0VFTjpyZXN1bHQ9KGdvdD49dGhpcy5sb3dlckJvdW5kYXJ5KSYmKGdvdDw9dGhp cy51cHBlckJvdW5kYXJ5KTticmVhaztjYXNlIE9wZW5MYXllcnMuRmlsdGVyLkNv bXBhcmlzb24uTElLRTp2YXIgcmVnZXhwPW5ldyBSZWdFeHAodGhpcy52YWx1ZSwi Z2kiKTtyZXN1bHQ9cmVnZXhwLnRlc3QoZ290KTticmVhazt9CnJldHVybiByZXN1 bHQ7fSx2YWx1ZTJyZWdleDpmdW5jdGlvbih3aWxkQ2FyZCxzaW5nbGVDaGFyLGVz Y2FwZUNoYXIpe2lmKHdpbGRDYXJkPT0iLiIpe3ZhciBtc2c9IicuJyBpcyBhbiB1 bnN1cHBvcnRlZCB3aWxkQ2FyZCBjaGFyYWN0ZXIgZm9yICIrIk9wZW5MYXllcnMu RmlsdGVyLkNvbXBhcmlzb24iO09wZW5MYXllcnMuQ29uc29sZS5lcnJvcihtc2cp O3JldHVybiBudWxsO30Kd2lsZENhcmQ9d2lsZENhcmQ/d2lsZENhcmQ6IioiO3Np bmdsZUNoYXI9c2luZ2xlQ2hhcj9zaW5nbGVDaGFyOiIuIjtlc2NhcGVDaGFyPWVz Y2FwZUNoYXI/ZXNjYXBlQ2hhcjoiISI7dGhpcy52YWx1ZT10aGlzLnZhbHVlLnJl cGxhY2UobmV3IFJlZ0V4cCgiXFwiK2VzY2FwZUNoYXIrIigufCQpIiwiZyIpLCJc XCQxIik7dGhpcy52YWx1ZT10aGlzLnZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cCgi XFwiK3NpbmdsZUNoYXIsImciKSwiLiIpO3RoaXMudmFsdWU9dGhpcy52YWx1ZS5y ZXBsYWNlKG5ldyBSZWdFeHAoIlxcIit3aWxkQ2FyZCwiZyIpLCIuKiIpO3RoaXMu dmFsdWU9dGhpcy52YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoIlxcXFwuXFwqIiwi ZyIpLCJcXCIrd2lsZENhcmQpO3RoaXMudmFsdWU9dGhpcy52YWx1ZS5yZXBsYWNl KG5ldyBSZWdFeHAoIlxcXFxcXC4iLCJnIiksIlxcIitzaW5nbGVDaGFyKTtyZXR1 cm4gdGhpcy52YWx1ZTt9LHJlZ2V4MnZhbHVlOmZ1bmN0aW9uKCl7dmFyIHZhbHVl PXRoaXMudmFsdWU7dmFsdWU9dmFsdWUucmVwbGFjZSgvIS9nLCIhISIpO3ZhbHVl PXZhbHVlLnJlcGxhY2UoLyhcXCk/XFxcLi9nLGZ1bmN0aW9uKCQwLCQxKXtyZXR1 cm4gJDE/JDA6IiEuIjt9KTt2YWx1ZT12YWx1ZS5yZXBsYWNlKC8oXFwpP1xcXCov ZyxmdW5jdGlvbigkMCwkMSl7cmV0dXJuICQxPyQwOiIhKiI7fSk7dmFsdWU9dmFs dWUucmVwbGFjZSgvXFxcXC9nLCJcXCIpO3ZhbHVlPXZhbHVlLnJlcGxhY2UoL1wu XCovZywiKiIpO3JldHVybiB2YWx1ZTt9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJu IE9wZW5MYXllcnMuVXRpbC5leHRlbmQobmV3IE9wZW5MYXllcnMuRmlsdGVyLkNv bXBhcmlzb24oKSx0aGlzKTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRmlsdGVy LkNvbXBhcmlzb24ifSk7T3BlbkxheWVycy5GaWx0ZXIuQ29tcGFyaXNvbi5FUVVB TF9UTz0iPT0iO09wZW5MYXllcnMuRmlsdGVyLkNvbXBhcmlzb24uTk9UX0VRVUFM X1RPPSIhPSI7T3BlbkxheWVycy5GaWx0ZXIuQ29tcGFyaXNvbi5MRVNTX1RIQU49 IjwiO09wZW5MYXllcnMuRmlsdGVyLkNvbXBhcmlzb24uR1JFQVRFUl9USEFOPSI+ IjtPcGVuTGF5ZXJzLkZpbHRlci5Db21wYXJpc29uLkxFU1NfVEhBTl9PUl9FUVVB TF9UTz0iPD0iO09wZW5MYXllcnMuRmlsdGVyLkNvbXBhcmlzb24uR1JFQVRFUl9U SEFOX09SX0VRVUFMX1RPPSI+PSI7T3BlbkxheWVycy5GaWx0ZXIuQ29tcGFyaXNv bi5CRVRXRUVOPSIuLiI7T3BlbkxheWVycy5GaWx0ZXIuQ29tcGFyaXNvbi5MSUtF PSJ+IjtPcGVuTGF5ZXJzLkZvcm1hdC5GaWx0ZXI9T3BlbkxheWVycy5DbGFzcyhP cGVuTGF5ZXJzLkZvcm1hdC5YTUwuVmVyc2lvbmVkT0dDLHtkZWZhdWx0VmVyc2lv bjoiMS4wLjAiLENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0LkZpbHRlciJ9 KTtPcGVuTGF5ZXJzLkZpbHRlci5GdW5jdGlvbj1PcGVuTGF5ZXJzLkNsYXNzKE9w ZW5MYXllcnMuRmlsdGVyLHtuYW1lOm51bGwscGFyYW1zOm51bGwsaW5pdGlhbGl6 ZTpmdW5jdGlvbihvcHRpb25zKXtPcGVuTGF5ZXJzLkZpbHRlci5wcm90b3R5cGUu aW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7fSxDTEFTU19OQU1FOiJP cGVuTGF5ZXJzLkZpbHRlci5GdW5jdGlvbiJ9KTtPcGVuTGF5ZXJzLkZvcm1hdC5G aWx0ZXIudjE9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkZvcm1hdC5YTUws e25hbWVzcGFjZXM6e29nYzoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9vZ2MiLGdt bDoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiLHhsaW5rOiJodHRwOi8vd3d3 LnczLm9yZy8xOTk5L3hsaW5rIix4c2k6Imh0dHA6Ly93d3cudzMub3JnLzIwMDEv WE1MU2NoZW1hLWluc3RhbmNlIn0sZGVmYXVsdFByZWZpeDoib2djIixzY2hlbWFM b2NhdGlvbjpudWxsLGluaXRpYWxpemU6ZnVuY3Rpb24ob3B0aW9ucyl7T3Blbkxh eWVycy5Gb3JtYXQuWE1MLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMs W29wdGlvbnNdKTt9LHJlYWQ6ZnVuY3Rpb24oZGF0YSl7dmFyIG9iaj17fTt0aGlz LnJlYWRlcnMub2djWyJGaWx0ZXIiXS5hcHBseSh0aGlzLFtkYXRhLG9ial0pO3Jl dHVybiBvYmouZmlsdGVyO30scmVhZGVyczp7Im9nYyI6eyJGaWx0ZXIiOmZ1bmN0 aW9uKG5vZGUscGFyZW50KXt2YXIgb2JqPXtmaWRzOltdLGZpbHRlcnM6W119O3Ro aXMucmVhZENoaWxkTm9kZXMobm9kZSxvYmopO2lmKG9iai5maWRzLmxlbmd0aD4w KXtwYXJlbnQuZmlsdGVyPW5ldyBPcGVuTGF5ZXJzLkZpbHRlci5GZWF0dXJlSWQo e2ZpZHM6b2JqLmZpZHN9KTt9ZWxzZSBpZihvYmouZmlsdGVycy5sZW5ndGg+MCl7 cGFyZW50LmZpbHRlcj1vYmouZmlsdGVyc1swXTt9fSwiRmVhdHVyZUlkIjpmdW5j dGlvbihub2RlLG9iail7dmFyIGZpZD1ub2RlLmdldEF0dHJpYnV0ZSgiZmlkIik7 aWYoZmlkKXtvYmouZmlkcy5wdXNoKGZpZCk7fX0sIkFuZCI6ZnVuY3Rpb24obm9k ZSxvYmope3ZhciBmaWx0ZXI9bmV3IE9wZW5MYXllcnMuRmlsdGVyLkxvZ2ljYWwo e3R5cGU6T3BlbkxheWVycy5GaWx0ZXIuTG9naWNhbC5BTkR9KTt0aGlzLnJlYWRD aGlsZE5vZGVzKG5vZGUsZmlsdGVyKTtvYmouZmlsdGVycy5wdXNoKGZpbHRlcik7 fSwiT3IiOmZ1bmN0aW9uKG5vZGUsb2JqKXt2YXIgZmlsdGVyPW5ldyBPcGVuTGF5 ZXJzLkZpbHRlci5Mb2dpY2FsKHt0eXBlOk9wZW5MYXllcnMuRmlsdGVyLkxvZ2lj YWwuT1J9KTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsZmlsdGVyKTtvYmouZmls dGVycy5wdXNoKGZpbHRlcik7fSwiTm90IjpmdW5jdGlvbihub2RlLG9iail7dmFy IGZpbHRlcj1uZXcgT3BlbkxheWVycy5GaWx0ZXIuTG9naWNhbCh7dHlwZTpPcGVu TGF5ZXJzLkZpbHRlci5Mb2dpY2FsLk5PVH0pO3RoaXMucmVhZENoaWxkTm9kZXMo bm9kZSxmaWx0ZXIpO29iai5maWx0ZXJzLnB1c2goZmlsdGVyKTt9LCJQcm9wZXJ0 eUlzTGVzc1RoYW4iOmZ1bmN0aW9uKG5vZGUsb2JqKXt2YXIgZmlsdGVyPW5ldyBP cGVuTGF5ZXJzLkZpbHRlci5Db21wYXJpc29uKHt0eXBlOk9wZW5MYXllcnMuRmls dGVyLkNvbXBhcmlzb24uTEVTU19USEFOfSk7dGhpcy5yZWFkQ2hpbGROb2Rlcyhu b2RlLGZpbHRlcik7b2JqLmZpbHRlcnMucHVzaChmaWx0ZXIpO30sIlByb3BlcnR5 SXNHcmVhdGVyVGhhbiI6ZnVuY3Rpb24obm9kZSxvYmope3ZhciBmaWx0ZXI9bmV3 IE9wZW5MYXllcnMuRmlsdGVyLkNvbXBhcmlzb24oe3R5cGU6T3BlbkxheWVycy5G aWx0ZXIuQ29tcGFyaXNvbi5HUkVBVEVSX1RIQU59KTt0aGlzLnJlYWRDaGlsZE5v ZGVzKG5vZGUsZmlsdGVyKTtvYmouZmlsdGVycy5wdXNoKGZpbHRlcik7fSwiUHJv cGVydHlJc0xlc3NUaGFuT3JFcXVhbFRvIjpmdW5jdGlvbihub2RlLG9iail7dmFy IGZpbHRlcj1uZXcgT3BlbkxheWVycy5GaWx0ZXIuQ29tcGFyaXNvbih7dHlwZTpP cGVuTGF5ZXJzLkZpbHRlci5Db21wYXJpc29uLkxFU1NfVEhBTl9PUl9FUVVBTF9U T30pO3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxmaWx0ZXIpO29iai5maWx0ZXJz LnB1c2goZmlsdGVyKTt9LCJQcm9wZXJ0eUlzR3JlYXRlclRoYW5PckVxdWFsVG8i OmZ1bmN0aW9uKG5vZGUsb2JqKXt2YXIgZmlsdGVyPW5ldyBPcGVuTGF5ZXJzLkZp bHRlci5Db21wYXJpc29uKHt0eXBlOk9wZW5MYXllcnMuRmlsdGVyLkNvbXBhcmlz b24uR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPfSk7dGhpcy5yZWFkQ2hpbGROb2Rl cyhub2RlLGZpbHRlcik7b2JqLmZpbHRlcnMucHVzaChmaWx0ZXIpO30sIlByb3Bl cnR5SXNCZXR3ZWVuIjpmdW5jdGlvbihub2RlLG9iail7dmFyIGZpbHRlcj1uZXcg T3BlbkxheWVycy5GaWx0ZXIuQ29tcGFyaXNvbih7dHlwZTpPcGVuTGF5ZXJzLkZp bHRlci5Db21wYXJpc29uLkJFVFdFRU59KTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5v ZGUsZmlsdGVyKTtvYmouZmlsdGVycy5wdXNoKGZpbHRlcik7fSwiTGl0ZXJhbCI6 ZnVuY3Rpb24obm9kZSxvYmope29iai52YWx1ZT1PcGVuTGF5ZXJzLlN0cmluZy5u dW1lcmljSWYodGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpKTt9LCJQcm9wZXJ0eU5h bWUiOmZ1bmN0aW9uKG5vZGUsZmlsdGVyKXtmaWx0ZXIucHJvcGVydHk9dGhpcy5n ZXRDaGlsZFZhbHVlKG5vZGUpO30sIkxvd2VyQm91bmRhcnkiOmZ1bmN0aW9uKG5v ZGUsZmlsdGVyKXtmaWx0ZXIubG93ZXJCb3VuZGFyeT1PcGVuTGF5ZXJzLlN0cmlu Zy5udW1lcmljSWYodGhpcy5yZWFkT2djRXhwcmVzc2lvbihub2RlKSk7fSwiVXBw ZXJCb3VuZGFyeSI6ZnVuY3Rpb24obm9kZSxmaWx0ZXIpe2ZpbHRlci51cHBlckJv dW5kYXJ5PU9wZW5MYXllcnMuU3RyaW5nLm51bWVyaWNJZih0aGlzLnJlYWRPZ2NF eHByZXNzaW9uKG5vZGUpKTt9LCJJbnRlcnNlY3RzIjpmdW5jdGlvbihub2RlLG9i ail7dGhpcy5yZWFkU3BhdGlhbChub2RlLG9iaixPcGVuTGF5ZXJzLkZpbHRlci5T cGF0aWFsLklOVEVSU0VDVFMpO30sIldpdGhpbiI6ZnVuY3Rpb24obm9kZSxvYmop e3RoaXMucmVhZFNwYXRpYWwobm9kZSxvYmosT3BlbkxheWVycy5GaWx0ZXIuU3Bh dGlhbC5XSVRISU4pO30sIkNvbnRhaW5zIjpmdW5jdGlvbihub2RlLG9iail7dGhp cy5yZWFkU3BhdGlhbChub2RlLG9iaixPcGVuTGF5ZXJzLkZpbHRlci5TcGF0aWFs LkNPTlRBSU5TKTt9LCJEV2l0aGluIjpmdW5jdGlvbihub2RlLG9iail7dGhpcy5y ZWFkU3BhdGlhbChub2RlLG9iaixPcGVuTGF5ZXJzLkZpbHRlci5TcGF0aWFsLkRX SVRISU4pO30sIkRpc3RhbmNlIjpmdW5jdGlvbihub2RlLG9iail7b2JqLmRpc3Rh bmNlPXBhcnNlSW50KHRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKSk7b2JqLmRpc3Rh bmNlVW5pdHM9bm9kZS5nZXRBdHRyaWJ1dGUoInVuaXRzIik7fSwiRnVuY3Rpb24i OmZ1bmN0aW9uKG5vZGUsb2JqKXtyZXR1cm47fX19LHJlYWRTcGF0aWFsOmZ1bmN0 aW9uKG5vZGUsb2JqLHR5cGUpe3ZhciBmaWx0ZXI9bmV3IE9wZW5MYXllcnMuRmls dGVyLlNwYXRpYWwoe3R5cGU6dHlwZX0pO3RoaXMucmVhZENoaWxkTm9kZXMobm9k ZSxmaWx0ZXIpO2ZpbHRlci52YWx1ZT1maWx0ZXIuY29tcG9uZW50c1swXTtkZWxl dGUgZmlsdGVyLmNvbXBvbmVudHM7b2JqLmZpbHRlcnMucHVzaChmaWx0ZXIpO30s cmVhZE9nY0V4cHJlc3Npb246ZnVuY3Rpb24obm9kZSl7dmFyIG9iaj17fTt0aGlz LnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqKTt2YXIgdmFsdWU9b2JqLnZhbHVlO2lm KHZhbHVlPT09dW5kZWZpbmVkKXt2YWx1ZT10aGlzLmdldENoaWxkVmFsdWUobm9k ZSk7fQpyZXR1cm4gdmFsdWU7fSx3cml0ZU9nY0V4cHJlc3Npb246ZnVuY3Rpb24o dmFsdWUsbm9kZSl7aWYodmFsdWUgaW5zdGFuY2VvZiBPcGVuTGF5ZXJzLkZpbHRl ci5GdW5jdGlvbil7dmFyIGNoaWxkPXRoaXMud3JpdGVOb2RlKCJGdW5jdGlvbiIs dmFsdWUsbm9kZSk7bm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7fWVsc2V7dGhpcy53 cml0ZU5vZGUoIkxpdGVyYWwiLHZhbHVlLG5vZGUpO30KcmV0dXJuIG5vZGU7fSx3 cml0ZTpmdW5jdGlvbihmaWx0ZXIpe3JldHVybiB0aGlzLndyaXRlcnMub2djWyJG aWx0ZXIiXS5hcHBseSh0aGlzLFtmaWx0ZXJdKTt9LHdyaXRlRmVhdHVyZUlkTm9k ZXM6ZnVuY3Rpb24oZmlsdGVyLG5vZGUpe2Zvcih2YXIgaT0wLGlpPWZpbHRlci5m aWRzLmxlbmd0aDtpPGlpOysraSl7dGhpcy53cml0ZU5vZGUoIkZlYXR1cmVJZCIs ZmlsdGVyLmZpZHNbaV0sbm9kZSk7fX0sd3JpdGVyczp7Im9nYyI6eyJGaWx0ZXIi OmZ1bmN0aW9uKGZpbHRlcil7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQ bHVzKCJvZ2M6RmlsdGVyIik7aWYoZmlsdGVyLnR5cGU9PT0iRklEIil7dGhpcy53 cml0ZUZlYXR1cmVJZE5vZGVzKGZpbHRlcixub2RlKTt9ZWxzZXt0aGlzLndyaXRl Tm9kZSh0aGlzLmdldEZpbHRlclR5cGUoZmlsdGVyKSxmaWx0ZXIsbm9kZSk7fQpy ZXR1cm4gbm9kZTt9LCJGZWF0dXJlSWQiOmZ1bmN0aW9uKGZpZCl7cmV0dXJuIHRo aXMuY3JlYXRlRWxlbWVudE5TUGx1cygib2djOkZlYXR1cmVJZCIse2F0dHJpYnV0 ZXM6e2ZpZDpmaWR9fSk7fSwiQW5kIjpmdW5jdGlvbihmaWx0ZXIpe3ZhciBub2Rl PXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygib2djOkFuZCIpO3ZhciBjaGlsZEZp bHRlcjtmb3IodmFyIGk9MCxpaT1maWx0ZXIuZmlsdGVycy5sZW5ndGg7aTxpaTsr K2kpe2NoaWxkRmlsdGVyPWZpbHRlci5maWx0ZXJzW2ldO2lmKGNoaWxkRmlsdGVy LnR5cGU9PT0iRklEIil7dGhpcy53cml0ZUZlYXR1cmVJZE5vZGVzKGNoaWxkRmls dGVyLG5vZGUpO31lbHNle3RoaXMud3JpdGVOb2RlKHRoaXMuZ2V0RmlsdGVyVHlw ZShjaGlsZEZpbHRlciksY2hpbGRGaWx0ZXIsbm9kZSk7fX0KcmV0dXJuIG5vZGU7 fSwiT3IiOmZ1bmN0aW9uKGZpbHRlcil7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVt ZW50TlNQbHVzKCJvZ2M6T3IiKTt2YXIgY2hpbGRGaWx0ZXI7Zm9yKHZhciBpPTAs aWk9ZmlsdGVyLmZpbHRlcnMubGVuZ3RoO2k8aWk7KytpKXtjaGlsZEZpbHRlcj1m aWx0ZXIuZmlsdGVyc1tpXTtpZihjaGlsZEZpbHRlci50eXBlPT09IkZJRCIpe3Ro aXMud3JpdGVGZWF0dXJlSWROb2RlcyhjaGlsZEZpbHRlcixub2RlKTt9ZWxzZXt0 aGlzLndyaXRlTm9kZSh0aGlzLmdldEZpbHRlclR5cGUoY2hpbGRGaWx0ZXIpLGNo aWxkRmlsdGVyLG5vZGUpO319CnJldHVybiBub2RlO30sIk5vdCI6ZnVuY3Rpb24o ZmlsdGVyKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIm9nYzpO b3QiKTt2YXIgY2hpbGRGaWx0ZXI9ZmlsdGVyLmZpbHRlcnNbMF07aWYoY2hpbGRG aWx0ZXIudHlwZT09PSJGSUQiKXt0aGlzLndyaXRlRmVhdHVyZUlkTm9kZXMoY2hp bGRGaWx0ZXIsbm9kZSk7fWVsc2V7dGhpcy53cml0ZU5vZGUodGhpcy5nZXRGaWx0 ZXJUeXBlKGNoaWxkRmlsdGVyKSxjaGlsZEZpbHRlcixub2RlKTt9CnJldHVybiBu b2RlO30sIlByb3BlcnR5SXNMZXNzVGhhbiI6ZnVuY3Rpb24oZmlsdGVyKXt2YXIg bm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIm9nYzpQcm9wZXJ0eUlzTGVz c1RoYW4iKTt0aGlzLndyaXRlTm9kZSgiUHJvcGVydHlOYW1lIixmaWx0ZXIsbm9k ZSk7dGhpcy53cml0ZU9nY0V4cHJlc3Npb24oZmlsdGVyLnZhbHVlLG5vZGUpO3Jl dHVybiBub2RlO30sIlByb3BlcnR5SXNHcmVhdGVyVGhhbiI6ZnVuY3Rpb24oZmls dGVyKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIm9nYzpQcm9w ZXJ0eUlzR3JlYXRlclRoYW4iKTt0aGlzLndyaXRlTm9kZSgiUHJvcGVydHlOYW1l IixmaWx0ZXIsbm9kZSk7dGhpcy53cml0ZU9nY0V4cHJlc3Npb24oZmlsdGVyLnZh bHVlLG5vZGUpO3JldHVybiBub2RlO30sIlByb3BlcnR5SXNMZXNzVGhhbk9yRXF1 YWxUbyI6ZnVuY3Rpb24oZmlsdGVyKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1l bnROU1BsdXMoIm9nYzpQcm9wZXJ0eUlzTGVzc1RoYW5PckVxdWFsVG8iKTt0aGlz LndyaXRlTm9kZSgiUHJvcGVydHlOYW1lIixmaWx0ZXIsbm9kZSk7dGhpcy53cml0 ZU9nY0V4cHJlc3Npb24oZmlsdGVyLnZhbHVlLG5vZGUpO3JldHVybiBub2RlO30s IlByb3BlcnR5SXNHcmVhdGVyVGhhbk9yRXF1YWxUbyI6ZnVuY3Rpb24oZmlsdGVy KXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIm9nYzpQcm9wZXJ0 eUlzR3JlYXRlclRoYW5PckVxdWFsVG8iKTt0aGlzLndyaXRlTm9kZSgiUHJvcGVy dHlOYW1lIixmaWx0ZXIsbm9kZSk7dGhpcy53cml0ZU9nY0V4cHJlc3Npb24oZmls dGVyLnZhbHVlLG5vZGUpO3JldHVybiBub2RlO30sIlByb3BlcnR5SXNCZXR3ZWVu IjpmdW5jdGlvbihmaWx0ZXIpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5T UGx1cygib2djOlByb3BlcnR5SXNCZXR3ZWVuIik7dGhpcy53cml0ZU5vZGUoIlBy b3BlcnR5TmFtZSIsZmlsdGVyLG5vZGUpO3RoaXMud3JpdGVOb2RlKCJMb3dlckJv dW5kYXJ5IixmaWx0ZXIsbm9kZSk7dGhpcy53cml0ZU5vZGUoIlVwcGVyQm91bmRh cnkiLGZpbHRlcixub2RlKTtyZXR1cm4gbm9kZTt9LCJQcm9wZXJ0eU5hbWUiOmZ1 bmN0aW9uKGZpbHRlcil7cmV0dXJuIHRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygi b2djOlByb3BlcnR5TmFtZSIse3ZhbHVlOmZpbHRlci5wcm9wZXJ0eX0pO30sIkxp dGVyYWwiOmZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdGhpcy5jcmVhdGVFbGVtZW50 TlNQbHVzKCJvZ2M6TGl0ZXJhbCIse3ZhbHVlOnZhbHVlfSk7fSwiTG93ZXJCb3Vu ZGFyeSI6ZnVuY3Rpb24oZmlsdGVyKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1l bnROU1BsdXMoIm9nYzpMb3dlckJvdW5kYXJ5Iik7dGhpcy53cml0ZU9nY0V4cHJl c3Npb24oZmlsdGVyLmxvd2VyQm91bmRhcnksbm9kZSk7cmV0dXJuIG5vZGU7fSwi VXBwZXJCb3VuZGFyeSI6ZnVuY3Rpb24oZmlsdGVyKXt2YXIgbm9kZT10aGlzLmNy ZWF0ZUVsZW1lbnROU1BsdXMoIm9nYzpVcHBlckJvdW5kYXJ5Iik7dGhpcy53cml0 ZU5vZGUoIkxpdGVyYWwiLGZpbHRlci51cHBlckJvdW5kYXJ5LG5vZGUpO3JldHVy biBub2RlO30sIklOVEVSU0VDVFMiOmZ1bmN0aW9uKGZpbHRlcil7cmV0dXJuIHRo aXMud3JpdGVTcGF0aWFsKGZpbHRlciwiSW50ZXJzZWN0cyIpO30sIldJVEhJTiI6 ZnVuY3Rpb24oZmlsdGVyKXtyZXR1cm4gdGhpcy53cml0ZVNwYXRpYWwoZmlsdGVy LCJXaXRoaW4iKTt9LCJDT05UQUlOUyI6ZnVuY3Rpb24oZmlsdGVyKXtyZXR1cm4g dGhpcy53cml0ZVNwYXRpYWwoZmlsdGVyLCJDb250YWlucyIpO30sIkRXSVRISU4i OmZ1bmN0aW9uKGZpbHRlcil7dmFyIG5vZGU9dGhpcy53cml0ZVNwYXRpYWwoZmls dGVyLCJEV2l0aGluIik7dGhpcy53cml0ZU5vZGUoIkRpc3RhbmNlIixmaWx0ZXIs bm9kZSk7cmV0dXJuIG5vZGU7fSwiRGlzdGFuY2UiOmZ1bmN0aW9uKGZpbHRlcil7 cmV0dXJuIHRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygib2djOkRpc3RhbmNlIix7 YXR0cmlidXRlczp7dW5pdHM6ZmlsdGVyLmRpc3RhbmNlVW5pdHN9LHZhbHVlOmZp bHRlci5kaXN0YW5jZX0pO30sIkZ1bmN0aW9uIjpmdW5jdGlvbihmaWx0ZXIpe3Zh ciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygib2djOkZ1bmN0aW9uIix7 YXR0cmlidXRlczp7bmFtZTpmaWx0ZXIubmFtZX19KTt2YXIgcGFyYW1zPWZpbHRl ci5wYXJhbXM7Zm9yKHZhciBpPTAsbGVuPXBhcmFtcy5sZW5ndGg7aTxsZW47aSsr KXt0aGlzLndyaXRlT2djRXhwcmVzc2lvbihwYXJhbXNbaV0sbm9kZSk7fQpyZXR1 cm4gbm9kZTt9fX0sZ2V0RmlsdGVyVHlwZTpmdW5jdGlvbihmaWx0ZXIpe3ZhciBm aWx0ZXJUeXBlPXRoaXMuZmlsdGVyTWFwW2ZpbHRlci50eXBlXTtpZighZmlsdGVy VHlwZSl7dGhyb3ciRmlsdGVyIHdyaXRpbmcgbm90IHN1cHBvcnRlZCBmb3IgcnVs ZSB0eXBlOiAiK2ZpbHRlci50eXBlO30KcmV0dXJuIGZpbHRlclR5cGU7fSxmaWx0 ZXJNYXA6eyImJiI6IkFuZCIsInx8IjoiT3IiLCIhIjoiTm90IiwiPT0iOiJQcm9w ZXJ0eUlzRXF1YWxUbyIsIiE9IjoiUHJvcGVydHlJc05vdEVxdWFsVG8iLCI8Ijoi UHJvcGVydHlJc0xlc3NUaGFuIiwiPiI6IlByb3BlcnR5SXNHcmVhdGVyVGhhbiIs Ijw9IjoiUHJvcGVydHlJc0xlc3NUaGFuT3JFcXVhbFRvIiwiPj0iOiJQcm9wZXJ0 eUlzR3JlYXRlclRoYW5PckVxdWFsVG8iLCIuLiI6IlByb3BlcnR5SXNCZXR3ZWVu IiwifiI6IlByb3BlcnR5SXNMaWtlIiwiQkJPWCI6IkJCT1giLCJEV0lUSElOIjoi RFdJVEhJTiIsIldJVEhJTiI6IldJVEhJTiIsIkNPTlRBSU5TIjoiQ09OVEFJTlMi LCJJTlRFUlNFQ1RTIjoiSU5URVJTRUNUUyIsIkZJRCI6IkZlYXR1cmVJZCJ9LENM QVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0LkZpbHRlci52MSJ9KTtPcGVuTGF5 ZXJzLkdlb21ldHJ5PU9wZW5MYXllcnMuQ2xhc3Moe2lkOm51bGwscGFyZW50Om51 bGwsYm91bmRzOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMuaWQ9T3Bl bkxheWVycy5VdGlsLmNyZWF0ZVVuaXF1ZUlEKHRoaXMuQ0xBU1NfTkFNRSsiXyIp O30sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuaWQ9bnVsbDt0aGlzLmJvdW5kcz1u dWxsO30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE9wZW5MYXllcnMuR2Vv bWV0cnkoKTt9LHNldEJvdW5kczpmdW5jdGlvbihib3VuZHMpe2lmKGJvdW5kcyl7 dGhpcy5ib3VuZHM9Ym91bmRzLmNsb25lKCk7fX0sY2xlYXJCb3VuZHM6ZnVuY3Rp b24oKXt0aGlzLmJvdW5kcz1udWxsO2lmKHRoaXMucGFyZW50KXt0aGlzLnBhcmVu dC5jbGVhckJvdW5kcygpO319LGV4dGVuZEJvdW5kczpmdW5jdGlvbihuZXdCb3Vu ZHMpe3ZhciBib3VuZHM9dGhpcy5nZXRCb3VuZHMoKTtpZighYm91bmRzKXt0aGlz LnNldEJvdW5kcyhuZXdCb3VuZHMpO31lbHNle3RoaXMuYm91bmRzLmV4dGVuZChu ZXdCb3VuZHMpO319LGdldEJvdW5kczpmdW5jdGlvbigpe2lmKHRoaXMuYm91bmRz PT1udWxsKXt0aGlzLmNhbGN1bGF0ZUJvdW5kcygpO30KcmV0dXJuIHRoaXMuYm91 bmRzO30sY2FsY3VsYXRlQm91bmRzOmZ1bmN0aW9uKCl7fSxkaXN0YW5jZVRvOmZ1 bmN0aW9uKGdlb21ldHJ5LG9wdGlvbnMpe30sZ2V0VmVydGljZXM6ZnVuY3Rpb24o bm9kZXMpe30sYXRQb2ludDpmdW5jdGlvbihsb25sYXQsdG9sZXJhbmNlTG9uLHRv bGVyYW5jZUxhdCl7dmFyIGF0UG9pbnQ9ZmFsc2U7dmFyIGJvdW5kcz10aGlzLmdl dEJvdW5kcygpO2lmKChib3VuZHMhPW51bGwpJiYobG9ubGF0IT1udWxsKSl7dmFy IGRYPSh0b2xlcmFuY2VMb24hPW51bGwpP3RvbGVyYW5jZUxvbjowO3ZhciBkWT0o dG9sZXJhbmNlTGF0IT1udWxsKT90b2xlcmFuY2VMYXQ6MDt2YXIgdG9sZXJhbmNl Qm91bmRzPW5ldyBPcGVuTGF5ZXJzLkJvdW5kcyh0aGlzLmJvdW5kcy5sZWZ0LWRY LHRoaXMuYm91bmRzLmJvdHRvbS1kWSx0aGlzLmJvdW5kcy5yaWdodCtkWCx0aGlz LmJvdW5kcy50b3ArZFkpO2F0UG9pbnQ9dG9sZXJhbmNlQm91bmRzLmNvbnRhaW5z TG9uTGF0KGxvbmxhdCk7fQpyZXR1cm4gYXRQb2ludDt9LGdldExlbmd0aDpmdW5j dGlvbigpe3JldHVybiAwLjA7fSxnZXRBcmVhOmZ1bmN0aW9uKCl7cmV0dXJuIDAu MDt9LGdldENlbnRyb2lkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw7fSx0b1N0cmlu ZzpmdW5jdGlvbigpe3JldHVybiBPcGVuTGF5ZXJzLkZvcm1hdC5XS1QucHJvdG90 eXBlLndyaXRlKG5ldyBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9yKHRoaXMpKTt9 LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuR2VvbWV0cnkifSk7T3BlbkxheWVycy5H ZW9tZXRyeS5mcm9tV0tUPWZ1bmN0aW9uKHdrdCl7dmFyIGZvcm1hdD1hcmd1bWVu dHMuY2FsbGVlLmZvcm1hdDtpZighZm9ybWF0KXtmb3JtYXQ9bmV3IE9wZW5MYXll cnMuRm9ybWF0LldLVCgpO2FyZ3VtZW50cy5jYWxsZWUuZm9ybWF0PWZvcm1hdDt9 CnZhciBnZW9tO3ZhciByZXN1bHQ9Zm9ybWF0LnJlYWQod2t0KTtpZihyZXN1bHQg aW5zdGFuY2VvZiBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9yKXtnZW9tPXJlc3Vs dC5nZW9tZXRyeTt9ZWxzZSBpZihPcGVuTGF5ZXJzLlV0aWwuaXNBcnJheShyZXN1 bHQpKXt2YXIgbGVuPXJlc3VsdC5sZW5ndGg7dmFyIGNvbXBvbmVudHM9bmV3IEFy cmF5KGxlbik7Zm9yKHZhciBpPTA7aTxsZW47KytpKXtjb21wb25lbnRzW2ldPXJl c3VsdFtpXS5nZW9tZXRyeTt9Cmdlb209bmV3IE9wZW5MYXllcnMuR2VvbWV0cnku Q29sbGVjdGlvbihjb21wb25lbnRzKTt9CnJldHVybiBnZW9tO307T3BlbkxheWVy cy5HZW9tZXRyeS5zZWdtZW50c0ludGVyc2VjdD1mdW5jdGlvbihzZWcxLHNlZzIs b3B0aW9ucyl7dmFyIHBvaW50PW9wdGlvbnMmJm9wdGlvbnMucG9pbnQ7dmFyIHRv bGVyYW5jZT1vcHRpb25zJiZvcHRpb25zLnRvbGVyYW5jZTt2YXIgaW50ZXJzZWN0 aW9uPWZhbHNlO3ZhciB4MTFfMjE9c2VnMS54MS1zZWcyLngxO3ZhciB5MTFfMjE9 c2VnMS55MS1zZWcyLnkxO3ZhciB4MTJfMTE9c2VnMS54Mi1zZWcxLngxO3ZhciB5 MTJfMTE9c2VnMS55Mi1zZWcxLnkxO3ZhciB5MjJfMjE9c2VnMi55Mi1zZWcyLnkx O3ZhciB4MjJfMjE9c2VnMi54Mi1zZWcyLngxO3ZhciBkPSh5MjJfMjEqeDEyXzEx KS0oeDIyXzIxKnkxMl8xMSk7dmFyIG4xPSh4MjJfMjEqeTExXzIxKS0oeTIyXzIx KngxMV8yMSk7dmFyIG4yPSh4MTJfMTEqeTExXzIxKS0oeTEyXzExKngxMV8yMSk7 aWYoZD09MCl7aWYobjE9PTAmJm4yPT0wKXtpbnRlcnNlY3Rpb249dHJ1ZTt9fWVs c2V7dmFyIGFsb25nMT1uMS9kO3ZhciBhbG9uZzI9bjIvZDtpZihhbG9uZzE+PTAm JmFsb25nMTw9MSYmYWxvbmcyPj0wJiZhbG9uZzI8PTEpe2lmKCFwb2ludCl7aW50 ZXJzZWN0aW9uPXRydWU7fWVsc2V7dmFyIHg9c2VnMS54MSsoYWxvbmcxKngxMl8x MSk7dmFyIHk9c2VnMS55MSsoYWxvbmcxKnkxMl8xMSk7aW50ZXJzZWN0aW9uPW5l dyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KHgseSk7fX19CmlmKHRvbGVyYW5j ZSl7dmFyIGRpc3Q7aWYoaW50ZXJzZWN0aW9uKXtpZihwb2ludCl7dmFyIHNlZ3M9 W3NlZzEsc2VnMl07dmFyIHNlZyx4LHk7b3V0ZXI6Zm9yKHZhciBpPTA7aTwyOysr aSl7c2VnPXNlZ3NbaV07Zm9yKHZhciBqPTE7ajwzOysrail7eD1zZWdbIngiK2pd O3k9c2VnWyJ5IitqXTtkaXN0PU1hdGguc3FydChNYXRoLnBvdyh4LWludGVyc2Vj dGlvbi54LDIpKwpNYXRoLnBvdyh5LWludGVyc2VjdGlvbi55LDIpKTtpZihkaXN0 PHRvbGVyYW5jZSl7aW50ZXJzZWN0aW9uLng9eDtpbnRlcnNlY3Rpb24ueT15O2Jy ZWFrIG91dGVyO319fX19ZWxzZXt2YXIgc2Vncz1bc2VnMSxzZWcyXTt2YXIgc291 cmNlLHRhcmdldCx4LHkscCxyZXN1bHQ7b3V0ZXI6Zm9yKHZhciBpPTA7aTwyOysr aSl7c291cmNlPXNlZ3NbaV07dGFyZ2V0PXNlZ3NbKGkrMSklMl07Zm9yKHZhciBq PTE7ajwzOysrail7cD17eDpzb3VyY2VbIngiK2pdLHk6c291cmNlWyJ5IitqXX07 cmVzdWx0PU9wZW5MYXllcnMuR2VvbWV0cnkuZGlzdGFuY2VUb1NlZ21lbnQocCx0 YXJnZXQpO2lmKHJlc3VsdC5kaXN0YW5jZTx0b2xlcmFuY2Upe2lmKHBvaW50KXtp bnRlcnNlY3Rpb249bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQocC54LHAu eSk7fWVsc2V7aW50ZXJzZWN0aW9uPXRydWU7fQpicmVhayBvdXRlcjt9fX19fQpy ZXR1cm4gaW50ZXJzZWN0aW9uO307T3BlbkxheWVycy5HZW9tZXRyeS5kaXN0YW5j ZVRvU2VnbWVudD1mdW5jdGlvbihwb2ludCxzZWdtZW50KXt2YXIgeDA9cG9pbnQu eDt2YXIgeTA9cG9pbnQueTt2YXIgeDE9c2VnbWVudC54MTt2YXIgeTE9c2VnbWVu dC55MTt2YXIgeDI9c2VnbWVudC54Mjt2YXIgeTI9c2VnbWVudC55Mjt2YXIgZHg9 eDIteDE7dmFyIGR5PXkyLXkxO3ZhciBhbG9uZz0oKGR4Kih4MC14MSkpKyhkeSoo eTAteTEpKSkvKE1hdGgucG93KGR4LDIpK01hdGgucG93KGR5LDIpKTt2YXIgeCx5 O2lmKGFsb25nPD0wLjApe3g9eDE7eT15MTt9ZWxzZSBpZihhbG9uZz49MS4wKXt4 PXgyO3k9eTI7fWVsc2V7eD14MSthbG9uZypkeDt5PXkxK2Fsb25nKmR5O30KcmV0 dXJue2Rpc3RhbmNlOk1hdGguc3FydChNYXRoLnBvdyh4LXgwLDIpK01hdGgucG93 KHkteTAsMikpLHg6eCx5Onl9O307T3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludD1P cGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuR2VvbWV0cnkse3g6bnVsbCx5Om51 bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbih4LHkpe09wZW5MYXllcnMuR2VvbWV0cnku cHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMu eD1wYXJzZUZsb2F0KHgpO3RoaXMueT1wYXJzZUZsb2F0KHkpO30sY2xvbmU6ZnVu Y3Rpb24ob2JqKXtpZihvYmo9PW51bGwpe29iaj1uZXcgT3BlbkxheWVycy5HZW9t ZXRyeS5Qb2ludCh0aGlzLngsdGhpcy55KTt9Ck9wZW5MYXllcnMuVXRpbC5hcHBs eURlZmF1bHRzKG9iaix0aGlzKTtyZXR1cm4gb2JqO30sY2FsY3VsYXRlQm91bmRz OmZ1bmN0aW9uKCl7dGhpcy5ib3VuZHM9bmV3IE9wZW5MYXllcnMuQm91bmRzKHRo aXMueCx0aGlzLnksdGhpcy54LHRoaXMueSk7fSxkaXN0YW5jZVRvOmZ1bmN0aW9u KGdlb21ldHJ5LG9wdGlvbnMpe3ZhciBlZGdlPSEob3B0aW9ucyYmb3B0aW9ucy5l ZGdlPT09ZmFsc2UpO3ZhciBkZXRhaWxzPWVkZ2UmJm9wdGlvbnMmJm9wdGlvbnMu ZGV0YWlsczt2YXIgZGlzdGFuY2UseDAseTAseDEseTEscmVzdWx0O2lmKGdlb21l dHJ5IGluc3RhbmNlb2YgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCl7eDA9dGhp cy54O3kwPXRoaXMueTt4MT1nZW9tZXRyeS54O3kxPWdlb21ldHJ5Lnk7ZGlzdGFu Y2U9TWF0aC5zcXJ0KE1hdGgucG93KHgwLXgxLDIpK01hdGgucG93KHkwLXkxLDIp KTtyZXN1bHQ9IWRldGFpbHM/ZGlzdGFuY2U6e3gwOngwLHkwOnkwLHgxOngxLHkx OnkxLGRpc3RhbmNlOmRpc3RhbmNlfTt9ZWxzZXtyZXN1bHQ9Z2VvbWV0cnkuZGlz dGFuY2VUbyh0aGlzLG9wdGlvbnMpO2lmKGRldGFpbHMpe3Jlc3VsdD17eDA6cmVz dWx0LngxLHkwOnJlc3VsdC55MSx4MTpyZXN1bHQueDAseTE6cmVzdWx0LnkwLGRp c3RhbmNlOnJlc3VsdC5kaXN0YW5jZX07fX0KcmV0dXJuIHJlc3VsdDt9LGVxdWFs czpmdW5jdGlvbihnZW9tKXt2YXIgZXF1YWxzPWZhbHNlO2lmKGdlb20hPW51bGwp e2VxdWFscz0oKHRoaXMueD09Z2VvbS54JiZ0aGlzLnk9PWdlb20ueSl8fChpc05h Tih0aGlzLngpJiZpc05hTih0aGlzLnkpJiZpc05hTihnZW9tLngpJiZpc05hTihn ZW9tLnkpKSk7fQpyZXR1cm4gZXF1YWxzO30sdG9TaG9ydFN0cmluZzpmdW5jdGlv bigpe3JldHVybih0aGlzLngrIiwgIit0aGlzLnkpO30sbW92ZTpmdW5jdGlvbih4 LHkpe3RoaXMueD10aGlzLngreDt0aGlzLnk9dGhpcy55K3k7dGhpcy5jbGVhckJv dW5kcygpO30scm90YXRlOmZ1bmN0aW9uKGFuZ2xlLG9yaWdpbil7YW5nbGUqPU1h dGguUEkvMTgwO3ZhciByYWRpdXM9dGhpcy5kaXN0YW5jZVRvKG9yaWdpbik7dmFy IHRoZXRhPWFuZ2xlK01hdGguYXRhbjIodGhpcy55LW9yaWdpbi55LHRoaXMueC1v cmlnaW4ueCk7dGhpcy54PW9yaWdpbi54KyhyYWRpdXMqTWF0aC5jb3ModGhldGEp KTt0aGlzLnk9b3JpZ2luLnkrKHJhZGl1cypNYXRoLnNpbih0aGV0YSkpO3RoaXMu Y2xlYXJCb3VuZHMoKTt9LGdldENlbnRyb2lkOmZ1bmN0aW9uKCl7cmV0dXJuIG5l dyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KHRoaXMueCx0aGlzLnkpO30scmVz aXplOmZ1bmN0aW9uKHNjYWxlLG9yaWdpbixyYXRpbyl7cmF0aW89KHJhdGlvPT11 bmRlZmluZWQpPzE6cmF0aW87dGhpcy54PW9yaWdpbi54KyhzY2FsZSpyYXRpbyoo dGhpcy54LW9yaWdpbi54KSk7dGhpcy55PW9yaWdpbi55KyhzY2FsZSoodGhpcy55 LW9yaWdpbi55KSk7dGhpcy5jbGVhckJvdW5kcygpO3JldHVybiB0aGlzO30saW50 ZXJzZWN0czpmdW5jdGlvbihnZW9tZXRyeSl7dmFyIGludGVyc2VjdD1mYWxzZTtp ZihnZW9tZXRyeS5DTEFTU19OQU1FPT0iT3BlbkxheWVycy5HZW9tZXRyeS5Qb2lu dCIpe2ludGVyc2VjdD10aGlzLmVxdWFscyhnZW9tZXRyeSk7fWVsc2V7aW50ZXJz ZWN0PWdlb21ldHJ5LmludGVyc2VjdHModGhpcyk7fQpyZXR1cm4gaW50ZXJzZWN0 O30sdHJhbnNmb3JtOmZ1bmN0aW9uKHNvdXJjZSxkZXN0KXtpZigoc291cmNlJiZk ZXN0KSl7T3BlbkxheWVycy5Qcm9qZWN0aW9uLnRyYW5zZm9ybSh0aGlzLHNvdXJj ZSxkZXN0KTt0aGlzLmJvdW5kcz1udWxsO30KcmV0dXJuIHRoaXM7fSxnZXRWZXJ0 aWNlczpmdW5jdGlvbihub2Rlcyl7cmV0dXJuW3RoaXNdO30sQ0xBU1NfTkFNRToi T3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCJ9KTtPcGVuTGF5ZXJzLkdlb21ldHJ5 LkNvbGxlY3Rpb249T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkdlb21ldHJ5 LHtjb21wb25lbnRzOm51bGwsY29tcG9uZW50VHlwZXM6bnVsbCxpbml0aWFsaXpl OmZ1bmN0aW9uKGNvbXBvbmVudHMpe09wZW5MYXllcnMuR2VvbWV0cnkucHJvdG90 eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuY29tcG9u ZW50cz1bXTtpZihjb21wb25lbnRzIT1udWxsKXt0aGlzLmFkZENvbXBvbmVudHMo Y29tcG9uZW50cyk7fX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuY29tcG9uZW50 cy5sZW5ndGg9MDt0aGlzLmNvbXBvbmVudHM9bnVsbDtPcGVuTGF5ZXJzLkdlb21l dHJ5LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LGNs b25lOmZ1bmN0aW9uKCl7dmFyIGdlb21ldHJ5PWV2YWwoIm5ldyAiK3RoaXMuQ0xB U1NfTkFNRSsiKCkiKTtmb3IodmFyIGk9MCxsZW49dGhpcy5jb21wb25lbnRzLmxl bmd0aDtpPGxlbjtpKyspe2dlb21ldHJ5LmFkZENvbXBvbmVudCh0aGlzLmNvbXBv bmVudHNbaV0uY2xvbmUoKSk7fQpPcGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0 cyhnZW9tZXRyeSx0aGlzKTtyZXR1cm4gZ2VvbWV0cnk7fSxnZXRDb21wb25lbnRz U3RyaW5nOmZ1bmN0aW9uKCl7dmFyIHN0cmluZ3M9W107Zm9yKHZhciBpPTAsbGVu PXRoaXMuY29tcG9uZW50cy5sZW5ndGg7aTxsZW47aSsrKXtzdHJpbmdzLnB1c2go dGhpcy5jb21wb25lbnRzW2ldLnRvU2hvcnRTdHJpbmcoKSk7fQpyZXR1cm4gc3Ry aW5ncy5qb2luKCIsIik7fSxjYWxjdWxhdGVCb3VuZHM6ZnVuY3Rpb24oKXt0aGlz LmJvdW5kcz1udWxsO3ZhciBib3VuZHM9bmV3IE9wZW5MYXllcnMuQm91bmRzKCk7 dmFyIGNvbXBvbmVudHM9dGhpcy5jb21wb25lbnRzO2lmKGNvbXBvbmVudHMpe2Zv cih2YXIgaT0wLGxlbj1jb21wb25lbnRzLmxlbmd0aDtpPGxlbjtpKyspe2JvdW5k cy5leHRlbmQoY29tcG9uZW50c1tpXS5nZXRCb3VuZHMoKSk7fX0KaWYoYm91bmRz LmxlZnQhPW51bGwmJmJvdW5kcy5ib3R0b20hPW51bGwmJmJvdW5kcy5yaWdodCE9 bnVsbCYmYm91bmRzLnRvcCE9bnVsbCl7dGhpcy5zZXRCb3VuZHMoYm91bmRzKTt9 fSxhZGRDb21wb25lbnRzOmZ1bmN0aW9uKGNvbXBvbmVudHMpe2lmKCEoT3Blbkxh eWVycy5VdGlsLmlzQXJyYXkoY29tcG9uZW50cykpKXtjb21wb25lbnRzPVtjb21w b25lbnRzXTt9CmZvcih2YXIgaT0wLGxlbj1jb21wb25lbnRzLmxlbmd0aDtpPGxl bjtpKyspe3RoaXMuYWRkQ29tcG9uZW50KGNvbXBvbmVudHNbaV0pO319LGFkZENv bXBvbmVudDpmdW5jdGlvbihjb21wb25lbnQsaW5kZXgpe3ZhciBhZGRlZD1mYWxz ZTtpZihjb21wb25lbnQpe2lmKHRoaXMuY29tcG9uZW50VHlwZXM9PW51bGx8fChP cGVuTGF5ZXJzLlV0aWwuaW5kZXhPZih0aGlzLmNvbXBvbmVudFR5cGVzLGNvbXBv bmVudC5DTEFTU19OQU1FKT4tMSkpe2lmKGluZGV4IT1udWxsJiYoaW5kZXg8dGhp cy5jb21wb25lbnRzLmxlbmd0aCkpe3ZhciBjb21wb25lbnRzMT10aGlzLmNvbXBv bmVudHMuc2xpY2UoMCxpbmRleCk7dmFyIGNvbXBvbmVudHMyPXRoaXMuY29tcG9u ZW50cy5zbGljZShpbmRleCx0aGlzLmNvbXBvbmVudHMubGVuZ3RoKTtjb21wb25l bnRzMS5wdXNoKGNvbXBvbmVudCk7dGhpcy5jb21wb25lbnRzPWNvbXBvbmVudHMx LmNvbmNhdChjb21wb25lbnRzMik7fWVsc2V7dGhpcy5jb21wb25lbnRzLnB1c2go Y29tcG9uZW50KTt9CmNvbXBvbmVudC5wYXJlbnQ9dGhpczt0aGlzLmNsZWFyQm91 bmRzKCk7YWRkZWQ9dHJ1ZTt9fQpyZXR1cm4gYWRkZWQ7fSxyZW1vdmVDb21wb25l bnRzOmZ1bmN0aW9uKGNvbXBvbmVudHMpe3ZhciByZW1vdmVkPWZhbHNlO2lmKCEo T3BlbkxheWVycy5VdGlsLmlzQXJyYXkoY29tcG9uZW50cykpKXtjb21wb25lbnRz PVtjb21wb25lbnRzXTt9CmZvcih2YXIgaT1jb21wb25lbnRzLmxlbmd0aC0xO2k+ PTA7LS1pKXtyZW1vdmVkPXRoaXMucmVtb3ZlQ29tcG9uZW50KGNvbXBvbmVudHNb aV0pfHxyZW1vdmVkO30KcmV0dXJuIHJlbW92ZWQ7fSxyZW1vdmVDb21wb25lbnQ6 ZnVuY3Rpb24oY29tcG9uZW50KXtPcGVuTGF5ZXJzLlV0aWwucmVtb3ZlSXRlbSh0 aGlzLmNvbXBvbmVudHMsY29tcG9uZW50KTt0aGlzLmNsZWFyQm91bmRzKCk7cmV0 dXJuIHRydWU7fSxnZXRMZW5ndGg6ZnVuY3Rpb24oKXt2YXIgbGVuZ3RoPTAuMDtm b3IodmFyIGk9MCxsZW49dGhpcy5jb21wb25lbnRzLmxlbmd0aDtpPGxlbjtpKysp e2xlbmd0aCs9dGhpcy5jb21wb25lbnRzW2ldLmdldExlbmd0aCgpO30KcmV0dXJu IGxlbmd0aDt9LGdldEFyZWE6ZnVuY3Rpb24oKXt2YXIgYXJlYT0wLjA7Zm9yKHZh ciBpPTAsbGVuPXRoaXMuY29tcG9uZW50cy5sZW5ndGg7aTxsZW47aSsrKXthcmVh Kz10aGlzLmNvbXBvbmVudHNbaV0uZ2V0QXJlYSgpO30KcmV0dXJuIGFyZWE7fSxn ZXRHZW9kZXNpY0FyZWE6ZnVuY3Rpb24ocHJvamVjdGlvbil7dmFyIGFyZWE9MC4w O2Zvcih2YXIgaT0wLGxlbj10aGlzLmNvbXBvbmVudHMubGVuZ3RoO2k8bGVuO2kr Kyl7YXJlYSs9dGhpcy5jb21wb25lbnRzW2ldLmdldEdlb2Rlc2ljQXJlYShwcm9q ZWN0aW9uKTt9CnJldHVybiBhcmVhO30sZ2V0Q2VudHJvaWQ6ZnVuY3Rpb24od2Vp Z2h0ZWQpe2lmKCF3ZWlnaHRlZCl7cmV0dXJuIHRoaXMuY29tcG9uZW50cy5sZW5n dGgmJnRoaXMuY29tcG9uZW50c1swXS5nZXRDZW50cm9pZCgpO30KdmFyIGxlbj10 aGlzLmNvbXBvbmVudHMubGVuZ3RoO2lmKCFsZW4pe3JldHVybiBmYWxzZTt9CnZh ciBhcmVhcz1bXTt2YXIgY2VudHJvaWRzPVtdO3ZhciBhcmVhU3VtPTA7dmFyIG1p bkFyZWE9TnVtYmVyLk1BWF9WQUxVRTt2YXIgY29tcG9uZW50O2Zvcih2YXIgaT0w O2k8bGVuOysraSl7Y29tcG9uZW50PXRoaXMuY29tcG9uZW50c1tpXTt2YXIgYXJl YT1jb21wb25lbnQuZ2V0QXJlYSgpO3ZhciBjZW50cm9pZD1jb21wb25lbnQuZ2V0 Q2VudHJvaWQodHJ1ZSk7aWYoaXNOYU4oYXJlYSl8fGlzTmFOKGNlbnRyb2lkLngp fHxpc05hTihjZW50cm9pZC55KSl7Y29udGludWU7fQphcmVhcy5wdXNoKGFyZWEp O2FyZWFTdW0rPWFyZWE7bWluQXJlYT0oYXJlYTxtaW5BcmVhJiZhcmVhPjApP2Fy ZWE6bWluQXJlYTtjZW50cm9pZHMucHVzaChjZW50cm9pZCk7fQpsZW49YXJlYXMu bGVuZ3RoO2lmKGFyZWFTdW09PT0wKXtmb3IodmFyIGk9MDtpPGxlbjsrK2kpe2Fy ZWFzW2ldPTE7fQphcmVhU3VtPWFyZWFzLmxlbmd0aDt9ZWxzZXtmb3IodmFyIGk9 MDtpPGxlbjsrK2kpe2FyZWFzW2ldLz1taW5BcmVhO30KYXJlYVN1bS89bWluQXJl YTt9CnZhciB4U3VtPTAseVN1bT0wLGNlbnRyb2lkLGFyZWE7Zm9yKHZhciBpPTA7 aTxsZW47KytpKXtjZW50cm9pZD1jZW50cm9pZHNbaV07YXJlYT1hcmVhc1tpXTt4 U3VtKz1jZW50cm9pZC54KmFyZWE7eVN1bSs9Y2VudHJvaWQueSphcmVhO30KcmV0 dXJuIG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KHhTdW0vYXJlYVN1bSx5 U3VtL2FyZWFTdW0pO30sZ2V0R2VvZGVzaWNMZW5ndGg6ZnVuY3Rpb24ocHJvamVj dGlvbil7dmFyIGxlbmd0aD0wLjA7Zm9yKHZhciBpPTAsbGVuPXRoaXMuY29tcG9u ZW50cy5sZW5ndGg7aTxsZW47aSsrKXtsZW5ndGgrPXRoaXMuY29tcG9uZW50c1tp XS5nZXRHZW9kZXNpY0xlbmd0aChwcm9qZWN0aW9uKTt9CnJldHVybiBsZW5ndGg7 fSxtb3ZlOmZ1bmN0aW9uKHgseSl7Zm9yKHZhciBpPTAsbGVuPXRoaXMuY29tcG9u ZW50cy5sZW5ndGg7aTxsZW47aSsrKXt0aGlzLmNvbXBvbmVudHNbaV0ubW92ZSh4 LHkpO319LHJvdGF0ZTpmdW5jdGlvbihhbmdsZSxvcmlnaW4pe2Zvcih2YXIgaT0w LGxlbj10aGlzLmNvbXBvbmVudHMubGVuZ3RoO2k8bGVuOysraSl7dGhpcy5jb21w b25lbnRzW2ldLnJvdGF0ZShhbmdsZSxvcmlnaW4pO319LHJlc2l6ZTpmdW5jdGlv bihzY2FsZSxvcmlnaW4scmF0aW8pe2Zvcih2YXIgaT0wO2k8dGhpcy5jb21wb25l bnRzLmxlbmd0aDsrK2kpe3RoaXMuY29tcG9uZW50c1tpXS5yZXNpemUoc2NhbGUs b3JpZ2luLHJhdGlvKTt9CnJldHVybiB0aGlzO30sZGlzdGFuY2VUbzpmdW5jdGlv bihnZW9tZXRyeSxvcHRpb25zKXt2YXIgZWRnZT0hKG9wdGlvbnMmJm9wdGlvbnMu ZWRnZT09PWZhbHNlKTt2YXIgZGV0YWlscz1lZGdlJiZvcHRpb25zJiZvcHRpb25z LmRldGFpbHM7dmFyIHJlc3VsdCxiZXN0LGRpc3RhbmNlO3ZhciBtaW49TnVtYmVy LlBPU0lUSVZFX0lORklOSVRZO2Zvcih2YXIgaT0wLGxlbj10aGlzLmNvbXBvbmVu dHMubGVuZ3RoO2k8bGVuOysraSl7cmVzdWx0PXRoaXMuY29tcG9uZW50c1tpXS5k aXN0YW5jZVRvKGdlb21ldHJ5LG9wdGlvbnMpO2Rpc3RhbmNlPWRldGFpbHM/cmVz dWx0LmRpc3RhbmNlOnJlc3VsdDtpZihkaXN0YW5jZTxtaW4pe21pbj1kaXN0YW5j ZTtiZXN0PXJlc3VsdDtpZihtaW49PTApe2JyZWFrO319fQpyZXR1cm4gYmVzdDt9 LGVxdWFsczpmdW5jdGlvbihnZW9tZXRyeSl7dmFyIGVxdWl2YWxlbnQ9dHJ1ZTtp ZighZ2VvbWV0cnl8fCFnZW9tZXRyeS5DTEFTU19OQU1FfHwodGhpcy5DTEFTU19O QU1FIT1nZW9tZXRyeS5DTEFTU19OQU1FKSl7ZXF1aXZhbGVudD1mYWxzZTt9ZWxz ZSBpZighKE9wZW5MYXllcnMuVXRpbC5pc0FycmF5KGdlb21ldHJ5LmNvbXBvbmVu dHMpKXx8KGdlb21ldHJ5LmNvbXBvbmVudHMubGVuZ3RoIT10aGlzLmNvbXBvbmVu dHMubGVuZ3RoKSl7ZXF1aXZhbGVudD1mYWxzZTt9ZWxzZXtmb3IodmFyIGk9MCxs ZW49dGhpcy5jb21wb25lbnRzLmxlbmd0aDtpPGxlbjsrK2kpe2lmKCF0aGlzLmNv bXBvbmVudHNbaV0uZXF1YWxzKGdlb21ldHJ5LmNvbXBvbmVudHNbaV0pKXtlcXVp dmFsZW50PWZhbHNlO2JyZWFrO319fQpyZXR1cm4gZXF1aXZhbGVudDt9LHRyYW5z Zm9ybTpmdW5jdGlvbihzb3VyY2UsZGVzdCl7aWYoc291cmNlJiZkZXN0KXtmb3Io dmFyIGk9MCxsZW49dGhpcy5jb21wb25lbnRzLmxlbmd0aDtpPGxlbjtpKyspe3Zh ciBjb21wb25lbnQ9dGhpcy5jb21wb25lbnRzW2ldO2NvbXBvbmVudC50cmFuc2Zv cm0oc291cmNlLGRlc3QpO30KdGhpcy5ib3VuZHM9bnVsbDt9CnJldHVybiB0aGlz O30saW50ZXJzZWN0czpmdW5jdGlvbihnZW9tZXRyeSl7dmFyIGludGVyc2VjdD1m YWxzZTtmb3IodmFyIGk9MCxsZW49dGhpcy5jb21wb25lbnRzLmxlbmd0aDtpPGxl bjsrK2kpe2ludGVyc2VjdD1nZW9tZXRyeS5pbnRlcnNlY3RzKHRoaXMuY29tcG9u ZW50c1tpXSk7aWYoaW50ZXJzZWN0KXticmVhazt9fQpyZXR1cm4gaW50ZXJzZWN0 O30sZ2V0VmVydGljZXM6ZnVuY3Rpb24obm9kZXMpe3ZhciB2ZXJ0aWNlcz1bXTtm b3IodmFyIGk9MCxsZW49dGhpcy5jb21wb25lbnRzLmxlbmd0aDtpPGxlbjsrK2kp e0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHZlcnRpY2VzLHRoaXMuY29tcG9u ZW50c1tpXS5nZXRWZXJ0aWNlcyhub2RlcykpO30KcmV0dXJuIHZlcnRpY2VzO30s Q0xBU1NfTkFNRToiT3BlbkxheWVycy5HZW9tZXRyeS5Db2xsZWN0aW9uIn0pO09w ZW5MYXllcnMuR2VvbWV0cnkuTXVsdGlQb2ludD1PcGVuTGF5ZXJzLkNsYXNzKE9w ZW5MYXllcnMuR2VvbWV0cnkuQ29sbGVjdGlvbix7Y29tcG9uZW50VHlwZXM6WyJP cGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50Il0saW5pdGlhbGl6ZTpmdW5jdGlvbihj b21wb25lbnRzKXtPcGVuTGF5ZXJzLkdlb21ldHJ5LkNvbGxlY3Rpb24ucHJvdG90 eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO30sYWRkUG9pbnQ6 ZnVuY3Rpb24ocG9pbnQsaW5kZXgpe3RoaXMuYWRkQ29tcG9uZW50KHBvaW50LGlu ZGV4KTt9LHJlbW92ZVBvaW50OmZ1bmN0aW9uKHBvaW50KXt0aGlzLnJlbW92ZUNv bXBvbmVudChwb2ludCk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkdlb21ldHJ5 Lk11bHRpUG9pbnQifSk7T3BlbkxheWVycy5HZW9tZXRyeS5DdXJ2ZT1PcGVuTGF5 ZXJzLkNsYXNzKE9wZW5MYXllcnMuR2VvbWV0cnkuTXVsdGlQb2ludCx7Y29tcG9u ZW50VHlwZXM6WyJPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50Il0saW5pdGlhbGl6 ZTpmdW5jdGlvbihwb2ludHMpe09wZW5MYXllcnMuR2VvbWV0cnkuTXVsdGlQb2lu dC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fSxn ZXRMZW5ndGg6ZnVuY3Rpb24oKXt2YXIgbGVuZ3RoPTAuMDtpZih0aGlzLmNvbXBv bmVudHMmJih0aGlzLmNvbXBvbmVudHMubGVuZ3RoPjEpKXtmb3IodmFyIGk9MSxs ZW49dGhpcy5jb21wb25lbnRzLmxlbmd0aDtpPGxlbjtpKyspe2xlbmd0aCs9dGhp cy5jb21wb25lbnRzW2ktMV0uZGlzdGFuY2VUbyh0aGlzLmNvbXBvbmVudHNbaV0p O319CnJldHVybiBsZW5ndGg7fSxnZXRHZW9kZXNpY0xlbmd0aDpmdW5jdGlvbihw cm9qZWN0aW9uKXt2YXIgZ2VvbT10aGlzO2lmKHByb2plY3Rpb24pe3ZhciBnZz1u ZXcgT3BlbkxheWVycy5Qcm9qZWN0aW9uKCJFUFNHOjQzMjYiKTtpZighZ2cuZXF1 YWxzKHByb2plY3Rpb24pKXtnZW9tPXRoaXMuY2xvbmUoKS50cmFuc2Zvcm0ocHJv amVjdGlvbixnZyk7fX0KdmFyIGxlbmd0aD0wLjA7aWYoZ2VvbS5jb21wb25lbnRz JiYoZ2VvbS5jb21wb25lbnRzLmxlbmd0aD4xKSl7dmFyIHAxLHAyO2Zvcih2YXIg aT0xLGxlbj1nZW9tLmNvbXBvbmVudHMubGVuZ3RoO2k8bGVuO2krKyl7cDE9Z2Vv bS5jb21wb25lbnRzW2ktMV07cDI9Z2VvbS5jb21wb25lbnRzW2ldO2xlbmd0aCs9 T3BlbkxheWVycy5VdGlsLmRpc3RWaW5jZW50eSh7bG9uOnAxLngsbGF0OnAxLnl9 LHtsb246cDIueCxsYXQ6cDIueX0pO319CnJldHVybiBsZW5ndGgqMTAwMDt9LENM QVNTX05BTUU6Ik9wZW5MYXllcnMuR2VvbWV0cnkuQ3VydmUifSk7T3BlbkxheWVy cy5HZW9tZXRyeS5MaW5lU3RyaW5nPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVy cy5HZW9tZXRyeS5DdXJ2ZSx7aW5pdGlhbGl6ZTpmdW5jdGlvbihwb2ludHMpe09w ZW5MYXllcnMuR2VvbWV0cnkuQ3VydmUucHJvdG90eXBlLmluaXRpYWxpemUuYXBw bHkodGhpcyxhcmd1bWVudHMpO30scmVtb3ZlQ29tcG9uZW50OmZ1bmN0aW9uKHBv aW50KXt2YXIgcmVtb3ZlZD10aGlzLmNvbXBvbmVudHMmJih0aGlzLmNvbXBvbmVu dHMubGVuZ3RoPjIpO2lmKHJlbW92ZWQpe09wZW5MYXllcnMuR2VvbWV0cnkuQ29s bGVjdGlvbi5wcm90b3R5cGUucmVtb3ZlQ29tcG9uZW50LmFwcGx5KHRoaXMsYXJn dW1lbnRzKTt9CnJldHVybiByZW1vdmVkO30saW50ZXJzZWN0czpmdW5jdGlvbihn ZW9tZXRyeSl7dmFyIGludGVyc2VjdD1mYWxzZTt2YXIgdHlwZT1nZW9tZXRyeS5D TEFTU19OQU1FO2lmKHR5cGU9PSJPcGVuTGF5ZXJzLkdlb21ldHJ5LkxpbmVTdHJp bmcifHx0eXBlPT0iT3BlbkxheWVycy5HZW9tZXRyeS5MaW5lYXJSaW5nInx8dHlw ZT09Ik9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQiKXt2YXIgc2VnczE9dGhpcy5n ZXRTb3J0ZWRTZWdtZW50cygpO3ZhciBzZWdzMjtpZih0eXBlPT0iT3BlbkxheWVy cy5HZW9tZXRyeS5Qb2ludCIpe3NlZ3MyPVt7eDE6Z2VvbWV0cnkueCx5MTpnZW9t ZXRyeS55LHgyOmdlb21ldHJ5LngseTI6Z2VvbWV0cnkueX1dO31lbHNle3NlZ3My PWdlb21ldHJ5LmdldFNvcnRlZFNlZ21lbnRzKCk7fQp2YXIgc2VnMSxzZWcxeDEs c2VnMXgyLHNlZzF5MSxzZWcxeTIsc2VnMixzZWcyeTEsc2VnMnkyO291dGVyOmZv cih2YXIgaT0wLGxlbj1zZWdzMS5sZW5ndGg7aTxsZW47KytpKXtzZWcxPXNlZ3Mx W2ldO3NlZzF4MT1zZWcxLngxO3NlZzF4Mj1zZWcxLngyO3NlZzF5MT1zZWcxLnkx O3NlZzF5Mj1zZWcxLnkyO2lubmVyOmZvcih2YXIgaj0wLGpsZW49c2VnczIubGVu Z3RoO2o8amxlbjsrK2ope3NlZzI9c2VnczJbal07aWYoc2VnMi54MT5zZWcxeDIp e2JyZWFrO30KaWYoc2VnMi54MjxzZWcxeDEpe2NvbnRpbnVlO30Kc2VnMnkxPXNl ZzIueTE7c2VnMnkyPXNlZzIueTI7aWYoTWF0aC5taW4oc2VnMnkxLHNlZzJ5Mik+ TWF0aC5tYXgoc2VnMXkxLHNlZzF5Mikpe2NvbnRpbnVlO30KaWYoTWF0aC5tYXgo c2VnMnkxLHNlZzJ5Mik8TWF0aC5taW4oc2VnMXkxLHNlZzF5Mikpe2NvbnRpbnVl O30KaWYoT3BlbkxheWVycy5HZW9tZXRyeS5zZWdtZW50c0ludGVyc2VjdChzZWcx LHNlZzIpKXtpbnRlcnNlY3Q9dHJ1ZTticmVhayBvdXRlcjt9fX19ZWxzZXtpbnRl cnNlY3Q9Z2VvbWV0cnkuaW50ZXJzZWN0cyh0aGlzKTt9CnJldHVybiBpbnRlcnNl Y3Q7fSxnZXRTb3J0ZWRTZWdtZW50czpmdW5jdGlvbigpe3ZhciBudW1TZWc9dGhp cy5jb21wb25lbnRzLmxlbmd0aC0xO3ZhciBzZWdtZW50cz1uZXcgQXJyYXkobnVt U2VnKSxwb2ludDEscG9pbnQyO2Zvcih2YXIgaT0wO2k8bnVtU2VnOysraSl7cG9p bnQxPXRoaXMuY29tcG9uZW50c1tpXTtwb2ludDI9dGhpcy5jb21wb25lbnRzW2kr MV07aWYocG9pbnQxLng8cG9pbnQyLngpe3NlZ21lbnRzW2ldPXt4MTpwb2ludDEu eCx5MTpwb2ludDEueSx4Mjpwb2ludDIueCx5Mjpwb2ludDIueX07fWVsc2V7c2Vn bWVudHNbaV09e3gxOnBvaW50Mi54LHkxOnBvaW50Mi55LHgyOnBvaW50MS54LHky OnBvaW50MS55fTt9fQpmdW5jdGlvbiBieVgxKHNlZzEsc2VnMil7cmV0dXJuIHNl ZzEueDEtc2VnMi54MTt9CnJldHVybiBzZWdtZW50cy5zb3J0KGJ5WDEpO30sc3Bs aXRXaXRoU2VnbWVudDpmdW5jdGlvbihzZWcsb3B0aW9ucyl7dmFyIGVkZ2U9IShv cHRpb25zJiZvcHRpb25zLmVkZ2U9PT1mYWxzZSk7dmFyIHRvbGVyYW5jZT1vcHRp b25zJiZvcHRpb25zLnRvbGVyYW5jZTt2YXIgbGluZXM9W107dmFyIHZlcnRzPXRo aXMuZ2V0VmVydGljZXMoKTt2YXIgcG9pbnRzPVtdO3ZhciBpbnRlcnNlY3Rpb25z PVtdO3ZhciBzcGxpdD1mYWxzZTt2YXIgdmVydDEsdmVydDIscG9pbnQ7dmFyIG5v ZGUsdmVydGV4LHRhcmdldDt2YXIgaW50ZXJPcHRpb25zPXtwb2ludDp0cnVlLHRv bGVyYW5jZTp0b2xlcmFuY2V9O3ZhciByZXN1bHQ9bnVsbDtmb3IodmFyIGk9MCxz dG9wPXZlcnRzLmxlbmd0aC0yO2k8PXN0b3A7KytpKXt2ZXJ0MT12ZXJ0c1tpXTtw b2ludHMucHVzaCh2ZXJ0MS5jbG9uZSgpKTt2ZXJ0Mj12ZXJ0c1tpKzFdO3Rhcmdl dD17eDE6dmVydDEueCx5MTp2ZXJ0MS55LHgyOnZlcnQyLngseTI6dmVydDIueX07 cG9pbnQ9T3BlbkxheWVycy5HZW9tZXRyeS5zZWdtZW50c0ludGVyc2VjdChzZWcs dGFyZ2V0LGludGVyT3B0aW9ucyk7aWYocG9pbnQgaW5zdGFuY2VvZiBPcGVuTGF5 ZXJzLkdlb21ldHJ5LlBvaW50KXtpZigocG9pbnQueD09PXNlZy54MSYmcG9pbnQu eT09PXNlZy55MSl8fChwb2ludC54PT09c2VnLngyJiZwb2ludC55PT09c2VnLnky KXx8cG9pbnQuZXF1YWxzKHZlcnQxKXx8cG9pbnQuZXF1YWxzKHZlcnQyKSl7dmVy dGV4PXRydWU7fWVsc2V7dmVydGV4PWZhbHNlO30KaWYodmVydGV4fHxlZGdlKXtp ZighcG9pbnQuZXF1YWxzKGludGVyc2VjdGlvbnNbaW50ZXJzZWN0aW9ucy5sZW5n dGgtMV0pKXtpbnRlcnNlY3Rpb25zLnB1c2gocG9pbnQuY2xvbmUoKSk7fQppZihp PT09MCl7aWYocG9pbnQuZXF1YWxzKHZlcnQxKSl7Y29udGludWU7fX0KaWYocG9p bnQuZXF1YWxzKHZlcnQyKSl7Y29udGludWU7fQpzcGxpdD10cnVlO2lmKCFwb2lu dC5lcXVhbHModmVydDEpKXtwb2ludHMucHVzaChwb2ludCk7fQpsaW5lcy5wdXNo KG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LkxpbmVTdHJpbmcocG9pbnRzKSk7cG9p bnRzPVtwb2ludC5jbG9uZSgpXTt9fX0KaWYoc3BsaXQpe3BvaW50cy5wdXNoKHZl cnQyLmNsb25lKCkpO2xpbmVzLnB1c2gobmV3IE9wZW5MYXllcnMuR2VvbWV0cnku TGluZVN0cmluZyhwb2ludHMpKTt9CmlmKGludGVyc2VjdGlvbnMubGVuZ3RoPjAp e3ZhciB4RGlyPXNlZy54MTxzZWcueDI/MTotMTt2YXIgeURpcj1zZWcueTE8c2Vn LnkyPzE6LTE7cmVzdWx0PXtsaW5lczpsaW5lcyxwb2ludHM6aW50ZXJzZWN0aW9u cy5zb3J0KGZ1bmN0aW9uKHAxLHAyKXtyZXR1cm4oeERpcipwMS54LXhEaXIqcDIu eCl8fCh5RGlyKnAxLnkteURpcipwMi55KTt9KX07fQpyZXR1cm4gcmVzdWx0O30s c3BsaXQ6ZnVuY3Rpb24odGFyZ2V0LG9wdGlvbnMpe3ZhciByZXN1bHRzPW51bGw7 dmFyIG11dHVhbD1vcHRpb25zJiZvcHRpb25zLm11dHVhbDt2YXIgc291cmNlU3Bs aXQsdGFyZ2V0U3BsaXQsc291cmNlUGFydHMsdGFyZ2V0UGFydHM7aWYodGFyZ2V0 IGluc3RhbmNlb2YgT3BlbkxheWVycy5HZW9tZXRyeS5MaW5lU3RyaW5nKXt2YXIg dmVydHM9dGhpcy5nZXRWZXJ0aWNlcygpO3ZhciB2ZXJ0MSx2ZXJ0MixzZWcsc3Bs aXRzLGxpbmVzLHBvaW50O3ZhciBwb2ludHM9W107c291cmNlUGFydHM9W107Zm9y KHZhciBpPTAsc3RvcD12ZXJ0cy5sZW5ndGgtMjtpPD1zdG9wOysraSl7dmVydDE9 dmVydHNbaV07dmVydDI9dmVydHNbaSsxXTtzZWc9e3gxOnZlcnQxLngseTE6dmVy dDEueSx4Mjp2ZXJ0Mi54LHkyOnZlcnQyLnl9O3RhcmdldFBhcnRzPXRhcmdldFBh cnRzfHxbdGFyZ2V0XTtpZihtdXR1YWwpe3BvaW50cy5wdXNoKHZlcnQxLmNsb25l KCkpO30KZm9yKHZhciBqPTA7ajx0YXJnZXRQYXJ0cy5sZW5ndGg7KytqKXtzcGxp dHM9dGFyZ2V0UGFydHNbal0uc3BsaXRXaXRoU2VnbWVudChzZWcsb3B0aW9ucyk7 aWYoc3BsaXRzKXtsaW5lcz1zcGxpdHMubGluZXM7aWYobGluZXMubGVuZ3RoPjAp e2xpbmVzLnVuc2hpZnQoaiwxKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5 KHRhcmdldFBhcnRzLGxpbmVzKTtqKz1saW5lcy5sZW5ndGgtMjt9CmlmKG11dHVh bCl7Zm9yKHZhciBrPTAsbGVuPXNwbGl0cy5wb2ludHMubGVuZ3RoO2s8bGVuOysr ayl7cG9pbnQ9c3BsaXRzLnBvaW50c1trXTtpZighcG9pbnQuZXF1YWxzKHZlcnQx KSl7cG9pbnRzLnB1c2gocG9pbnQpO3NvdXJjZVBhcnRzLnB1c2gobmV3IE9wZW5M YXllcnMuR2VvbWV0cnkuTGluZVN0cmluZyhwb2ludHMpKTtpZihwb2ludC5lcXVh bHModmVydDIpKXtwb2ludHM9W107fWVsc2V7cG9pbnRzPVtwb2ludC5jbG9uZSgp XTt9fX19fX19CmlmKG11dHVhbCYmc291cmNlUGFydHMubGVuZ3RoPjAmJnBvaW50 cy5sZW5ndGg+MCl7cG9pbnRzLnB1c2godmVydDIuY2xvbmUoKSk7c291cmNlUGFy dHMucHVzaChuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5MaW5lU3RyaW5nKHBvaW50 cykpO319ZWxzZXtyZXN1bHRzPXRhcmdldC5zcGxpdFdpdGgodGhpcyxvcHRpb25z KTt9CmlmKHRhcmdldFBhcnRzJiZ0YXJnZXRQYXJ0cy5sZW5ndGg+MSl7dGFyZ2V0 U3BsaXQ9dHJ1ZTt9ZWxzZXt0YXJnZXRQYXJ0cz1bXTt9CmlmKHNvdXJjZVBhcnRz JiZzb3VyY2VQYXJ0cy5sZW5ndGg+MSl7c291cmNlU3BsaXQ9dHJ1ZTt9ZWxzZXtz b3VyY2VQYXJ0cz1bXTt9CmlmKHRhcmdldFNwbGl0fHxzb3VyY2VTcGxpdCl7aWYo bXV0dWFsKXtyZXN1bHRzPVtzb3VyY2VQYXJ0cyx0YXJnZXRQYXJ0c107fWVsc2V7 cmVzdWx0cz10YXJnZXRQYXJ0czt9fQpyZXR1cm4gcmVzdWx0czt9LHNwbGl0V2l0 aDpmdW5jdGlvbihnZW9tZXRyeSxvcHRpb25zKXtyZXR1cm4gZ2VvbWV0cnkuc3Bs aXQodGhpcyxvcHRpb25zKTt9LGdldFZlcnRpY2VzOmZ1bmN0aW9uKG5vZGVzKXt2 YXIgdmVydGljZXM7aWYobm9kZXM9PT10cnVlKXt2ZXJ0aWNlcz1bdGhpcy5jb21w b25lbnRzWzBdLHRoaXMuY29tcG9uZW50c1t0aGlzLmNvbXBvbmVudHMubGVuZ3Ro LTFdXTt9ZWxzZSBpZihub2Rlcz09PWZhbHNlKXt2ZXJ0aWNlcz10aGlzLmNvbXBv bmVudHMuc2xpY2UoMSx0aGlzLmNvbXBvbmVudHMubGVuZ3RoLTEpO31lbHNle3Zl cnRpY2VzPXRoaXMuY29tcG9uZW50cy5zbGljZSgpO30KcmV0dXJuIHZlcnRpY2Vz O30sZGlzdGFuY2VUbzpmdW5jdGlvbihnZW9tZXRyeSxvcHRpb25zKXt2YXIgZWRn ZT0hKG9wdGlvbnMmJm9wdGlvbnMuZWRnZT09PWZhbHNlKTt2YXIgZGV0YWlscz1l ZGdlJiZvcHRpb25zJiZvcHRpb25zLmRldGFpbHM7dmFyIHJlc3VsdCxiZXN0PXt9 O3ZhciBtaW49TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO2lmKGdlb21ldHJ5IGlu c3RhbmNlb2YgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCl7dmFyIHNlZ3M9dGhp cy5nZXRTb3J0ZWRTZWdtZW50cygpO3ZhciB4PWdlb21ldHJ5Lng7dmFyIHk9Z2Vv bWV0cnkueTt2YXIgc2VnO2Zvcih2YXIgaT0wLGxlbj1zZWdzLmxlbmd0aDtpPGxl bjsrK2kpe3NlZz1zZWdzW2ldO3Jlc3VsdD1PcGVuTGF5ZXJzLkdlb21ldHJ5LmRp c3RhbmNlVG9TZWdtZW50KGdlb21ldHJ5LHNlZyk7aWYocmVzdWx0LmRpc3RhbmNl PG1pbil7bWluPXJlc3VsdC5kaXN0YW5jZTtiZXN0PXJlc3VsdDtpZihtaW49PT0w KXticmVhazt9fWVsc2V7aWYoc2VnLngyPngmJigoeT5zZWcueTEmJnk8c2VnLnky KXx8KHk8c2VnLnkxJiZ5PnNlZy55MikpKXticmVhazt9fX0KaWYoZGV0YWlscyl7 YmVzdD17ZGlzdGFuY2U6YmVzdC5kaXN0YW5jZSx4MDpiZXN0LngseTA6YmVzdC55 LHgxOngseTE6eX07fWVsc2V7YmVzdD1iZXN0LmRpc3RhbmNlO319ZWxzZSBpZihn ZW9tZXRyeSBpbnN0YW5jZW9mIE9wZW5MYXllcnMuR2VvbWV0cnkuTGluZVN0cmlu Zyl7dmFyIHNlZ3MwPXRoaXMuZ2V0U29ydGVkU2VnbWVudHMoKTt2YXIgc2VnczE9 Z2VvbWV0cnkuZ2V0U29ydGVkU2VnbWVudHMoKTt2YXIgc2VnMCxzZWcxLGludGVy c2VjdGlvbix4MCx5MDt2YXIgbGVuMT1zZWdzMS5sZW5ndGg7dmFyIGludGVyT3B0 aW9ucz17cG9pbnQ6dHJ1ZX07b3V0ZXI6Zm9yKHZhciBpPTAsbGVuPXNlZ3MwLmxl bmd0aDtpPGxlbjsrK2kpe3NlZzA9c2VnczBbaV07eDA9c2VnMC54MTt5MD1zZWcw LnkxO2Zvcih2YXIgaj0wO2o8bGVuMTsrK2ope3NlZzE9c2VnczFbal07aW50ZXJz ZWN0aW9uPU9wZW5MYXllcnMuR2VvbWV0cnkuc2VnbWVudHNJbnRlcnNlY3Qoc2Vn MCxzZWcxLGludGVyT3B0aW9ucyk7aWYoaW50ZXJzZWN0aW9uKXttaW49MDtiZXN0 PXtkaXN0YW5jZTowLHgwOmludGVyc2VjdGlvbi54LHkwOmludGVyc2VjdGlvbi55 LHgxOmludGVyc2VjdGlvbi54LHkxOmludGVyc2VjdGlvbi55fTticmVhayBvdXRl cjt9ZWxzZXtyZXN1bHQ9T3BlbkxheWVycy5HZW9tZXRyeS5kaXN0YW5jZVRvU2Vn bWVudCh7eDp4MCx5OnkwfSxzZWcxKTtpZihyZXN1bHQuZGlzdGFuY2U8bWluKXtt aW49cmVzdWx0LmRpc3RhbmNlO2Jlc3Q9e2Rpc3RhbmNlOm1pbix4MDp4MCx5MDp5 MCx4MTpyZXN1bHQueCx5MTpyZXN1bHQueX07fX19fQppZighZGV0YWlscyl7YmVz dD1iZXN0LmRpc3RhbmNlO30KaWYobWluIT09MCl7aWYoc2VnMCl7cmVzdWx0PWdl b21ldHJ5LmRpc3RhbmNlVG8obmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQo c2VnMC54MixzZWcwLnkyKSxvcHRpb25zKTt2YXIgZGlzdD1kZXRhaWxzP3Jlc3Vs dC5kaXN0YW5jZTpyZXN1bHQ7aWYoZGlzdDxtaW4pe2lmKGRldGFpbHMpe2Jlc3Q9 e2Rpc3RhbmNlOm1pbix4MDpyZXN1bHQueDEseTA6cmVzdWx0LnkxLHgxOnJlc3Vs dC54MCx5MTpyZXN1bHQueTB9O31lbHNle2Jlc3Q9ZGlzdDt9fX19fWVsc2V7YmVz dD1nZW9tZXRyeS5kaXN0YW5jZVRvKHRoaXMsb3B0aW9ucyk7aWYoZGV0YWlscyl7 YmVzdD17ZGlzdGFuY2U6YmVzdC5kaXN0YW5jZSx4MDpiZXN0LngxLHkwOmJlc3Qu eTEseDE6YmVzdC54MCx5MTpiZXN0LnkwfTt9fQpyZXR1cm4gYmVzdDt9LHNpbXBs aWZ5OmZ1bmN0aW9uKHRvbGVyYW5jZSl7aWYodGhpcyYmdGhpcyE9PW51bGwpe3Zh ciBwb2ludHM9dGhpcy5nZXRWZXJ0aWNlcygpO2lmKHBvaW50cy5sZW5ndGg8Myl7 cmV0dXJuIHRoaXM7fQp2YXIgY29tcGFyZU51bWJlcnM9ZnVuY3Rpb24oYSxiKXty ZXR1cm4oYS1iKTt9O3ZhciBkb3VnbGFzUGV1Y2tlclJlZHVjdGlvbj1mdW5jdGlv bihwb2ludHMsZmlyc3RQb2ludCxsYXN0UG9pbnQsdG9sZXJhbmNlKXt2YXIgbWF4 RGlzdGFuY2U9MDt2YXIgaW5kZXhGYXJ0aGVzdD0wO2Zvcih2YXIgaW5kZXg9Zmly c3RQb2ludCxkaXN0YW5jZTtpbmRleDxsYXN0UG9pbnQ7aW5kZXgrKyl7ZGlzdGFu Y2U9cGVycGVuZGljdWxhckRpc3RhbmNlKHBvaW50c1tmaXJzdFBvaW50XSxwb2lu dHNbbGFzdFBvaW50XSxwb2ludHNbaW5kZXhdKTtpZihkaXN0YW5jZT5tYXhEaXN0 YW5jZSl7bWF4RGlzdGFuY2U9ZGlzdGFuY2U7aW5kZXhGYXJ0aGVzdD1pbmRleDt9 fQppZihtYXhEaXN0YW5jZT50b2xlcmFuY2UmJmluZGV4RmFydGhlc3QhPWZpcnN0 UG9pbnQpe3BvaW50SW5kZXhzVG9LZWVwLnB1c2goaW5kZXhGYXJ0aGVzdCk7ZG91 Z2xhc1BldWNrZXJSZWR1Y3Rpb24ocG9pbnRzLGZpcnN0UG9pbnQsaW5kZXhGYXJ0 aGVzdCx0b2xlcmFuY2UpO2RvdWdsYXNQZXVja2VyUmVkdWN0aW9uKHBvaW50cyxp bmRleEZhcnRoZXN0LGxhc3RQb2ludCx0b2xlcmFuY2UpO319O3ZhciBwZXJwZW5k aWN1bGFyRGlzdGFuY2U9ZnVuY3Rpb24ocG9pbnQxLHBvaW50Mixwb2ludCl7dmFy IGFyZWE9TWF0aC5hYnMoMC41Kihwb2ludDEueCpwb2ludDIueStwb2ludDIueCpw b2ludC55K3BvaW50LngqcG9pbnQxLnktcG9pbnQyLngqcG9pbnQxLnktcG9pbnQu eCpwb2ludDIueS1wb2ludDEueCpwb2ludC55KSk7dmFyIGJvdHRvbT1NYXRoLnNx cnQoTWF0aC5wb3cocG9pbnQxLngtcG9pbnQyLngsMikrTWF0aC5wb3cocG9pbnQx LnktcG9pbnQyLnksMikpO3ZhciBoZWlnaHQ9YXJlYS9ib3R0b20qMjtyZXR1cm4g aGVpZ2h0O307dmFyIGZpcnN0UG9pbnQ9MDt2YXIgbGFzdFBvaW50PXBvaW50cy5s ZW5ndGgtMTt2YXIgcG9pbnRJbmRleHNUb0tlZXA9W107cG9pbnRJbmRleHNUb0tl ZXAucHVzaChmaXJzdFBvaW50KTtwb2ludEluZGV4c1RvS2VlcC5wdXNoKGxhc3RQ b2ludCk7d2hpbGUocG9pbnRzW2ZpcnN0UG9pbnRdLmVxdWFscyhwb2ludHNbbGFz dFBvaW50XSkpe2xhc3RQb2ludC0tO3BvaW50SW5kZXhzVG9LZWVwLnB1c2gobGFz dFBvaW50KTt9CmRvdWdsYXNQZXVja2VyUmVkdWN0aW9uKHBvaW50cyxmaXJzdFBv aW50LGxhc3RQb2ludCx0b2xlcmFuY2UpO3ZhciByZXR1cm5Qb2ludHM9W107cG9p bnRJbmRleHNUb0tlZXAuc29ydChjb21wYXJlTnVtYmVycyk7Zm9yKHZhciBpbmRl eD0wO2luZGV4PHBvaW50SW5kZXhzVG9LZWVwLmxlbmd0aDtpbmRleCsrKXtyZXR1 cm5Qb2ludHMucHVzaChwb2ludHNbcG9pbnRJbmRleHNUb0tlZXBbaW5kZXhdXSk7 fQpyZXR1cm4gbmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuTGluZVN0cmluZyhyZXR1 cm5Qb2ludHMpO30KZWxzZXtyZXR1cm4gdGhpczt9fSxDTEFTU19OQU1FOiJPcGVu TGF5ZXJzLkdlb21ldHJ5LkxpbmVTdHJpbmcifSk7T3BlbkxheWVycy5HZW9tZXRy eS5NdWx0aUxpbmVTdHJpbmc9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkdl b21ldHJ5LkNvbGxlY3Rpb24se2NvbXBvbmVudFR5cGVzOlsiT3BlbkxheWVycy5H ZW9tZXRyeS5MaW5lU3RyaW5nIl0saW5pdGlhbGl6ZTpmdW5jdGlvbihjb21wb25l bnRzKXtPcGVuTGF5ZXJzLkdlb21ldHJ5LkNvbGxlY3Rpb24ucHJvdG90eXBlLmlu aXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO30sc3BsaXQ6ZnVuY3Rpb24o Z2VvbWV0cnksb3B0aW9ucyl7dmFyIHJlc3VsdHM9bnVsbDt2YXIgbXV0dWFsPW9w dGlvbnMmJm9wdGlvbnMubXV0dWFsO3ZhciBzcGxpdHMsc291cmNlTGluZSxzb3Vy Y2VMaW5lcyxzb3VyY2VTcGxpdCx0YXJnZXRTcGxpdDt2YXIgc291cmNlUGFydHM9 W107dmFyIHRhcmdldFBhcnRzPVtnZW9tZXRyeV07Zm9yKHZhciBpPTAsbGVuPXRo aXMuY29tcG9uZW50cy5sZW5ndGg7aTxsZW47KytpKXtzb3VyY2VMaW5lPXRoaXMu Y29tcG9uZW50c1tpXTtzb3VyY2VTcGxpdD1mYWxzZTtmb3IodmFyIGo9MDtqPHRh cmdldFBhcnRzLmxlbmd0aDsrK2ope3NwbGl0cz1zb3VyY2VMaW5lLnNwbGl0KHRh cmdldFBhcnRzW2pdLG9wdGlvbnMpO2lmKHNwbGl0cyl7aWYobXV0dWFsKXtzb3Vy Y2VMaW5lcz1zcGxpdHNbMF07Zm9yKHZhciBrPTAsa2xlbj1zb3VyY2VMaW5lcy5s ZW5ndGg7azxrbGVuOysrayl7aWYoaz09PTAmJnNvdXJjZVBhcnRzLmxlbmd0aCl7 c291cmNlUGFydHNbc291cmNlUGFydHMubGVuZ3RoLTFdLmFkZENvbXBvbmVudChz b3VyY2VMaW5lc1trXSk7fWVsc2V7c291cmNlUGFydHMucHVzaChuZXcgT3Blbkxh eWVycy5HZW9tZXRyeS5NdWx0aUxpbmVTdHJpbmcoW3NvdXJjZUxpbmVzW2tdXSkp O319CnNvdXJjZVNwbGl0PXRydWU7c3BsaXRzPXNwbGl0c1sxXTt9CmlmKHNwbGl0 cy5sZW5ndGgpe3NwbGl0cy51bnNoaWZ0KGosMSk7QXJyYXkucHJvdG90eXBlLnNw bGljZS5hcHBseSh0YXJnZXRQYXJ0cyxzcGxpdHMpO2JyZWFrO319fQppZighc291 cmNlU3BsaXQpe2lmKHNvdXJjZVBhcnRzLmxlbmd0aCl7c291cmNlUGFydHNbc291 cmNlUGFydHMubGVuZ3RoLTFdLmFkZENvbXBvbmVudChzb3VyY2VMaW5lLmNsb25l KCkpO31lbHNle3NvdXJjZVBhcnRzPVtuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5N dWx0aUxpbmVTdHJpbmcoc291cmNlTGluZS5jbG9uZSgpKV07fX19CmlmKHNvdXJj ZVBhcnRzJiZzb3VyY2VQYXJ0cy5sZW5ndGg+MSl7c291cmNlU3BsaXQ9dHJ1ZTt9 ZWxzZXtzb3VyY2VQYXJ0cz1bXTt9CmlmKHRhcmdldFBhcnRzJiZ0YXJnZXRQYXJ0 cy5sZW5ndGg+MSl7dGFyZ2V0U3BsaXQ9dHJ1ZTt9ZWxzZXt0YXJnZXRQYXJ0cz1b XTt9CmlmKHNvdXJjZVNwbGl0fHx0YXJnZXRTcGxpdCl7aWYobXV0dWFsKXtyZXN1 bHRzPVtzb3VyY2VQYXJ0cyx0YXJnZXRQYXJ0c107fWVsc2V7cmVzdWx0cz10YXJn ZXRQYXJ0czt9fQpyZXR1cm4gcmVzdWx0czt9LHNwbGl0V2l0aDpmdW5jdGlvbihn ZW9tZXRyeSxvcHRpb25zKXt2YXIgcmVzdWx0cz1udWxsO3ZhciBtdXR1YWw9b3B0 aW9ucyYmb3B0aW9ucy5tdXR1YWw7dmFyIHNwbGl0cyx0YXJnZXRMaW5lLHNvdXJj ZUxpbmVzLHNvdXJjZVNwbGl0LHRhcmdldFNwbGl0LHNvdXJjZVBhcnRzLHRhcmdl dFBhcnRzO2lmKGdlb21ldHJ5IGluc3RhbmNlb2YgT3BlbkxheWVycy5HZW9tZXRy eS5MaW5lU3RyaW5nKXt0YXJnZXRQYXJ0cz1bXTtzb3VyY2VQYXJ0cz1bZ2VvbWV0 cnldO2Zvcih2YXIgaT0wLGxlbj10aGlzLmNvbXBvbmVudHMubGVuZ3RoO2k8bGVu OysraSl7dGFyZ2V0U3BsaXQ9ZmFsc2U7dGFyZ2V0TGluZT10aGlzLmNvbXBvbmVu dHNbaV07Zm9yKHZhciBqPTA7ajxzb3VyY2VQYXJ0cy5sZW5ndGg7KytqKXtzcGxp dHM9c291cmNlUGFydHNbal0uc3BsaXQodGFyZ2V0TGluZSxvcHRpb25zKTtpZihz cGxpdHMpe2lmKG11dHVhbCl7c291cmNlTGluZXM9c3BsaXRzWzBdO2lmKHNvdXJj ZUxpbmVzLmxlbmd0aCl7c291cmNlTGluZXMudW5zaGlmdChqLDEpO0FycmF5LnBy b3RvdHlwZS5zcGxpY2UuYXBwbHkoc291cmNlUGFydHMsc291cmNlTGluZXMpO2or PXNvdXJjZUxpbmVzLmxlbmd0aC0yO30Kc3BsaXRzPXNwbGl0c1sxXTtpZihzcGxp dHMubGVuZ3RoPT09MCl7c3BsaXRzPVt0YXJnZXRMaW5lLmNsb25lKCldO319CmZv cih2YXIgaz0wLGtsZW49c3BsaXRzLmxlbmd0aDtrPGtsZW47KytrKXtpZihrPT09 MCYmdGFyZ2V0UGFydHMubGVuZ3RoKXt0YXJnZXRQYXJ0c1t0YXJnZXRQYXJ0cy5s ZW5ndGgtMV0uYWRkQ29tcG9uZW50KHNwbGl0c1trXSk7fWVsc2V7dGFyZ2V0UGFy dHMucHVzaChuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5NdWx0aUxpbmVTdHJpbmco W3NwbGl0c1trXV0pKTt9fQp0YXJnZXRTcGxpdD10cnVlO319CmlmKCF0YXJnZXRT cGxpdCl7aWYodGFyZ2V0UGFydHMubGVuZ3RoKXt0YXJnZXRQYXJ0c1t0YXJnZXRQ YXJ0cy5sZW5ndGgtMV0uYWRkQ29tcG9uZW50KHRhcmdldExpbmUuY2xvbmUoKSk7 fWVsc2V7dGFyZ2V0UGFydHM9W25ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5Lk11bHRp TGluZVN0cmluZyhbdGFyZ2V0TGluZS5jbG9uZSgpXSldO319fX1lbHNle3Jlc3Vs dHM9Z2VvbWV0cnkuc3BsaXQodGhpcyk7fQppZihzb3VyY2VQYXJ0cyYmc291cmNl UGFydHMubGVuZ3RoPjEpe3NvdXJjZVNwbGl0PXRydWU7fWVsc2V7c291cmNlUGFy dHM9W107fQppZih0YXJnZXRQYXJ0cyYmdGFyZ2V0UGFydHMubGVuZ3RoPjEpe3Rh cmdldFNwbGl0PXRydWU7fWVsc2V7dGFyZ2V0UGFydHM9W107fQppZihzb3VyY2VT cGxpdHx8dGFyZ2V0U3BsaXQpe2lmKG11dHVhbCl7cmVzdWx0cz1bc291cmNlUGFy dHMsdGFyZ2V0UGFydHNdO31lbHNle3Jlc3VsdHM9dGFyZ2V0UGFydHM7fX0KcmV0 dXJuIHJlc3VsdHM7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkdlb21ldHJ5Lk11 bHRpTGluZVN0cmluZyJ9KTtPcGVuTGF5ZXJzLkdlb21ldHJ5LkxpbmVhclJpbmc9 T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkdlb21ldHJ5LkxpbmVTdHJpbmcs e2NvbXBvbmVudFR5cGVzOlsiT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCJdLGlu aXRpYWxpemU6ZnVuY3Rpb24ocG9pbnRzKXtPcGVuTGF5ZXJzLkdlb21ldHJ5Lkxp bmVTdHJpbmcucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVu dHMpO30sYWRkQ29tcG9uZW50OmZ1bmN0aW9uKHBvaW50LGluZGV4KXt2YXIgYWRk ZWQ9ZmFsc2U7dmFyIGxhc3RQb2ludD10aGlzLmNvbXBvbmVudHMucG9wKCk7aWYo aW5kZXghPW51bGx8fCFwb2ludC5lcXVhbHMobGFzdFBvaW50KSl7YWRkZWQ9T3Bl bkxheWVycy5HZW9tZXRyeS5Db2xsZWN0aW9uLnByb3RvdHlwZS5hZGRDb21wb25l bnQuYXBwbHkodGhpcyxhcmd1bWVudHMpO30KdmFyIGZpcnN0UG9pbnQ9dGhpcy5j b21wb25lbnRzWzBdO09wZW5MYXllcnMuR2VvbWV0cnkuQ29sbGVjdGlvbi5wcm90 b3R5cGUuYWRkQ29tcG9uZW50LmFwcGx5KHRoaXMsW2ZpcnN0UG9pbnRdKTtyZXR1 cm4gYWRkZWQ7fSxyZW1vdmVDb21wb25lbnQ6ZnVuY3Rpb24ocG9pbnQpe3ZhciBy ZW1vdmVkPXRoaXMuY29tcG9uZW50cyYmKHRoaXMuY29tcG9uZW50cy5sZW5ndGg+ Myk7aWYocmVtb3ZlZCl7dGhpcy5jb21wb25lbnRzLnBvcCgpO09wZW5MYXllcnMu R2VvbWV0cnkuQ29sbGVjdGlvbi5wcm90b3R5cGUucmVtb3ZlQ29tcG9uZW50LmFw cGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZmlyc3RQb2ludD10aGlzLmNvbXBvbmVu dHNbMF07T3BlbkxheWVycy5HZW9tZXRyeS5Db2xsZWN0aW9uLnByb3RvdHlwZS5h ZGRDb21wb25lbnQuYXBwbHkodGhpcyxbZmlyc3RQb2ludF0pO30KcmV0dXJuIHJl bW92ZWQ7fSxtb3ZlOmZ1bmN0aW9uKHgseSl7Zm9yKHZhciBpPTAsbGVuPXRoaXMu Y29tcG9uZW50cy5sZW5ndGg7aTxsZW4tMTtpKyspe3RoaXMuY29tcG9uZW50c1tp XS5tb3ZlKHgseSk7fX0scm90YXRlOmZ1bmN0aW9uKGFuZ2xlLG9yaWdpbil7Zm9y KHZhciBpPTAsbGVuPXRoaXMuY29tcG9uZW50cy5sZW5ndGg7aTxsZW4tMTsrK2kp e3RoaXMuY29tcG9uZW50c1tpXS5yb3RhdGUoYW5nbGUsb3JpZ2luKTt9fSxyZXNp emU6ZnVuY3Rpb24oc2NhbGUsb3JpZ2luLHJhdGlvKXtmb3IodmFyIGk9MCxsZW49 dGhpcy5jb21wb25lbnRzLmxlbmd0aDtpPGxlbi0xOysraSl7dGhpcy5jb21wb25l bnRzW2ldLnJlc2l6ZShzY2FsZSxvcmlnaW4scmF0aW8pO30KcmV0dXJuIHRoaXM7 fSx0cmFuc2Zvcm06ZnVuY3Rpb24oc291cmNlLGRlc3Qpe2lmKHNvdXJjZSYmZGVz dCl7Zm9yKHZhciBpPTAsbGVuPXRoaXMuY29tcG9uZW50cy5sZW5ndGg7aTxsZW4t MTtpKyspe3ZhciBjb21wb25lbnQ9dGhpcy5jb21wb25lbnRzW2ldO2NvbXBvbmVu dC50cmFuc2Zvcm0oc291cmNlLGRlc3QpO30KdGhpcy5ib3VuZHM9bnVsbDt9CnJl dHVybiB0aGlzO30sZ2V0Q2VudHJvaWQ6ZnVuY3Rpb24oKXtpZih0aGlzLmNvbXBv bmVudHMmJih0aGlzLmNvbXBvbmVudHMubGVuZ3RoPjIpKXt2YXIgc3VtWD0wLjA7 dmFyIHN1bVk9MC4wO2Zvcih2YXIgaT0wO2k8dGhpcy5jb21wb25lbnRzLmxlbmd0 aC0xO2krKyl7dmFyIGI9dGhpcy5jb21wb25lbnRzW2ldO3ZhciBjPXRoaXMuY29t cG9uZW50c1tpKzFdO3N1bVgrPShiLngrYy54KSooYi54KmMueS1jLngqYi55KTtz dW1ZKz0oYi55K2MueSkqKGIueCpjLnktYy54KmIueSk7fQp2YXIgYXJlYT0tMSp0 aGlzLmdldEFyZWEoKTt2YXIgeD1zdW1YLyg2KmFyZWEpO3ZhciB5PXN1bVkvKDYq YXJlYSk7cmV0dXJuIG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KHgseSk7 fWVsc2V7cmV0dXJuIG51bGw7fX0sZ2V0QXJlYTpmdW5jdGlvbigpe3ZhciBhcmVh PTAuMDtpZih0aGlzLmNvbXBvbmVudHMmJih0aGlzLmNvbXBvbmVudHMubGVuZ3Ro PjIpKXt2YXIgc3VtPTAuMDtmb3IodmFyIGk9MCxsZW49dGhpcy5jb21wb25lbnRz Lmxlbmd0aDtpPGxlbi0xO2krKyl7dmFyIGI9dGhpcy5jb21wb25lbnRzW2ldO3Zh ciBjPXRoaXMuY29tcG9uZW50c1tpKzFdO3N1bSs9KGIueCtjLngpKihjLnktYi55 KTt9CmFyZWE9LXN1bS8yLjA7fQpyZXR1cm4gYXJlYTt9LGdldEdlb2Rlc2ljQXJl YTpmdW5jdGlvbihwcm9qZWN0aW9uKXt2YXIgcmluZz10aGlzO2lmKHByb2plY3Rp b24pe3ZhciBnZz1uZXcgT3BlbkxheWVycy5Qcm9qZWN0aW9uKCJFUFNHOjQzMjYi KTtpZighZ2cuZXF1YWxzKHByb2plY3Rpb24pKXtyaW5nPXRoaXMuY2xvbmUoKS50 cmFuc2Zvcm0ocHJvamVjdGlvbixnZyk7fX0KdmFyIGFyZWE9MC4wO3ZhciBsZW49 cmluZy5jb21wb25lbnRzJiZyaW5nLmNvbXBvbmVudHMubGVuZ3RoO2lmKGxlbj4y KXt2YXIgcDEscDI7Zm9yKHZhciBpPTA7aTxsZW4tMTtpKyspe3AxPXJpbmcuY29t cG9uZW50c1tpXTtwMj1yaW5nLmNvbXBvbmVudHNbaSsxXTthcmVhKz1PcGVuTGF5 ZXJzLlV0aWwucmFkKHAyLngtcDEueCkqKDIrTWF0aC5zaW4oT3BlbkxheWVycy5V dGlsLnJhZChwMS55KSkrCk1hdGguc2luKE9wZW5MYXllcnMuVXRpbC5yYWQocDIu eSkpKTt9CmFyZWE9YXJlYSo2Mzc4MTM3LjAqNjM3ODEzNy4wLzIuMDt9CnJldHVy biBhcmVhO30sY29udGFpbnNQb2ludDpmdW5jdGlvbihwb2ludCl7dmFyIGFwcHJv eD1PcGVuTGF5ZXJzLk51bWJlci5saW1pdFNpZ0RpZ3M7dmFyIGRpZ3M9MTQ7dmFy IHB4PWFwcHJveChwb2ludC54LGRpZ3MpO3ZhciBweT1hcHByb3gocG9pbnQueSxk aWdzKTtmdW5jdGlvbiBnZXRYKHkseDEseTEseDIseTIpe3JldHVybigoKHgxLXgy KSp5KSsoKHgyKnkxKS0oeDEqeTIpKSkvKHkxLXkyKTt9CnZhciBudW1TZWc9dGhp cy5jb21wb25lbnRzLmxlbmd0aC0xO3ZhciBzdGFydCxlbmQseDEseTEseDIseTIs Y3gsY3k7dmFyIGNyb3NzZXM9MDtmb3IodmFyIGk9MDtpPG51bVNlZzsrK2kpe3N0 YXJ0PXRoaXMuY29tcG9uZW50c1tpXTt4MT1hcHByb3goc3RhcnQueCxkaWdzKTt5 MT1hcHByb3goc3RhcnQueSxkaWdzKTtlbmQ9dGhpcy5jb21wb25lbnRzW2krMV07 eDI9YXBwcm94KGVuZC54LGRpZ3MpO3kyPWFwcHJveChlbmQueSxkaWdzKTtpZih5 MT09eTIpe2lmKHB5PT15MSl7aWYoeDE8PXgyJiYocHg+PXgxJiZweDw9eDIpfHx4 MT49eDImJihweDw9eDEmJnB4Pj14Mikpe2Nyb3NzZXM9LTE7YnJlYWs7fX0KY29u dGludWU7fQpjeD1hcHByb3goZ2V0WChweSx4MSx5MSx4Mix5MiksZGlncyk7aWYo Y3g9PXB4KXtpZih5MTx5MiYmKHB5Pj15MSYmcHk8PXkyKXx8eTE+eTImJihweTw9 eTEmJnB5Pj15Mikpe2Nyb3NzZXM9LTE7YnJlYWs7fX0KaWYoY3g8PXB4KXtjb250 aW51ZTt9CmlmKHgxIT14MiYmKGN4PE1hdGgubWluKHgxLHgyKXx8Y3g+TWF0aC5t YXgoeDEseDIpKSl7Y29udGludWU7fQppZih5MTx5MiYmKHB5Pj15MSYmcHk8eTIp fHx5MT55MiYmKHB5PHkxJiZweT49eTIpKXsrK2Nyb3NzZXM7fX0KdmFyIGNvbnRh aW5lZD0oY3Jvc3Nlcz09LTEpPzE6ISEoY3Jvc3NlcyYxKTtyZXR1cm4gY29udGFp bmVkO30saW50ZXJzZWN0czpmdW5jdGlvbihnZW9tZXRyeSl7dmFyIGludGVyc2Vj dD1mYWxzZTtpZihnZW9tZXRyeS5DTEFTU19OQU1FPT0iT3BlbkxheWVycy5HZW9t ZXRyeS5Qb2ludCIpe2ludGVyc2VjdD10aGlzLmNvbnRhaW5zUG9pbnQoZ2VvbWV0 cnkpO31lbHNlIGlmKGdlb21ldHJ5LkNMQVNTX05BTUU9PSJPcGVuTGF5ZXJzLkdl b21ldHJ5LkxpbmVTdHJpbmciKXtpbnRlcnNlY3Q9Z2VvbWV0cnkuaW50ZXJzZWN0 cyh0aGlzKTt9ZWxzZSBpZihnZW9tZXRyeS5DTEFTU19OQU1FPT0iT3BlbkxheWVy cy5HZW9tZXRyeS5MaW5lYXJSaW5nIil7aW50ZXJzZWN0PU9wZW5MYXllcnMuR2Vv bWV0cnkuTGluZVN0cmluZy5wcm90b3R5cGUuaW50ZXJzZWN0cy5hcHBseSh0aGlz LFtnZW9tZXRyeV0pO31lbHNle2Zvcih2YXIgaT0wLGxlbj1nZW9tZXRyeS5jb21w b25lbnRzLmxlbmd0aDtpPGxlbjsrK2kpe2ludGVyc2VjdD1nZW9tZXRyeS5jb21w b25lbnRzW2ldLmludGVyc2VjdHModGhpcyk7aWYoaW50ZXJzZWN0KXticmVhazt9 fX0KcmV0dXJuIGludGVyc2VjdDt9LGdldFZlcnRpY2VzOmZ1bmN0aW9uKG5vZGVz KXtyZXR1cm4obm9kZXM9PT10cnVlKT9bXTp0aGlzLmNvbXBvbmVudHMuc2xpY2Uo MCx0aGlzLmNvbXBvbmVudHMubGVuZ3RoLTEpO30sQ0xBU1NfTkFNRToiT3Blbkxh eWVycy5HZW9tZXRyeS5MaW5lYXJSaW5nIn0pO09wZW5MYXllcnMuR2VvbWV0cnku UG9seWdvbj1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuR2VvbWV0cnkuQ29s bGVjdGlvbix7Y29tcG9uZW50VHlwZXM6WyJPcGVuTGF5ZXJzLkdlb21ldHJ5Lkxp bmVhclJpbmciXSxpbml0aWFsaXplOmZ1bmN0aW9uKGNvbXBvbmVudHMpe09wZW5M YXllcnMuR2VvbWV0cnkuQ29sbGVjdGlvbi5wcm90b3R5cGUuaW5pdGlhbGl6ZS5h cHBseSh0aGlzLGFyZ3VtZW50cyk7fSxnZXRBcmVhOmZ1bmN0aW9uKCl7dmFyIGFy ZWE9MC4wO2lmKHRoaXMuY29tcG9uZW50cyYmKHRoaXMuY29tcG9uZW50cy5sZW5n dGg+MCkpe2FyZWErPU1hdGguYWJzKHRoaXMuY29tcG9uZW50c1swXS5nZXRBcmVh KCkpO2Zvcih2YXIgaT0xLGxlbj10aGlzLmNvbXBvbmVudHMubGVuZ3RoO2k8bGVu O2krKyl7YXJlYS09TWF0aC5hYnModGhpcy5jb21wb25lbnRzW2ldLmdldEFyZWEo KSk7fX0KcmV0dXJuIGFyZWE7fSxnZXRHZW9kZXNpY0FyZWE6ZnVuY3Rpb24ocHJv amVjdGlvbil7dmFyIGFyZWE9MC4wO2lmKHRoaXMuY29tcG9uZW50cyYmKHRoaXMu Y29tcG9uZW50cy5sZW5ndGg+MCkpe2FyZWErPU1hdGguYWJzKHRoaXMuY29tcG9u ZW50c1swXS5nZXRHZW9kZXNpY0FyZWEocHJvamVjdGlvbikpO2Zvcih2YXIgaT0x LGxlbj10aGlzLmNvbXBvbmVudHMubGVuZ3RoO2k8bGVuO2krKyl7YXJlYS09TWF0 aC5hYnModGhpcy5jb21wb25lbnRzW2ldLmdldEdlb2Rlc2ljQXJlYShwcm9qZWN0 aW9uKSk7fX0KcmV0dXJuIGFyZWE7fSxjb250YWluc1BvaW50OmZ1bmN0aW9uKHBv aW50KXt2YXIgbnVtUmluZ3M9dGhpcy5jb21wb25lbnRzLmxlbmd0aDt2YXIgY29u dGFpbmVkPWZhbHNlO2lmKG51bVJpbmdzPjApe2NvbnRhaW5lZD10aGlzLmNvbXBv bmVudHNbMF0uY29udGFpbnNQb2ludChwb2ludCk7aWYoY29udGFpbmVkIT09MSl7 aWYoY29udGFpbmVkJiZudW1SaW5ncz4xKXt2YXIgaG9sZTtmb3IodmFyIGk9MTtp PG51bVJpbmdzOysraSl7aG9sZT10aGlzLmNvbXBvbmVudHNbaV0uY29udGFpbnNQ b2ludChwb2ludCk7aWYoaG9sZSl7aWYoaG9sZT09PTEpe2NvbnRhaW5lZD0xO31l bHNle2NvbnRhaW5lZD1mYWxzZTt9CmJyZWFrO319fX19CnJldHVybiBjb250YWlu ZWQ7fSxpbnRlcnNlY3RzOmZ1bmN0aW9uKGdlb21ldHJ5KXt2YXIgaW50ZXJzZWN0 PWZhbHNlO3ZhciBpLGxlbjtpZihnZW9tZXRyeS5DTEFTU19OQU1FPT0iT3Blbkxh eWVycy5HZW9tZXRyeS5Qb2ludCIpe2ludGVyc2VjdD10aGlzLmNvbnRhaW5zUG9p bnQoZ2VvbWV0cnkpO31lbHNlIGlmKGdlb21ldHJ5LkNMQVNTX05BTUU9PSJPcGVu TGF5ZXJzLkdlb21ldHJ5LkxpbmVTdHJpbmcifHxnZW9tZXRyeS5DTEFTU19OQU1F PT0iT3BlbkxheWVycy5HZW9tZXRyeS5MaW5lYXJSaW5nIil7Zm9yKGk9MCxsZW49 dGhpcy5jb21wb25lbnRzLmxlbmd0aDtpPGxlbjsrK2kpe2ludGVyc2VjdD1nZW9t ZXRyeS5pbnRlcnNlY3RzKHRoaXMuY29tcG9uZW50c1tpXSk7aWYoaW50ZXJzZWN0 KXticmVhazt9fQppZighaW50ZXJzZWN0KXtmb3IoaT0wLGxlbj1nZW9tZXRyeS5j b21wb25lbnRzLmxlbmd0aDtpPGxlbjsrK2kpe2ludGVyc2VjdD10aGlzLmNvbnRh aW5zUG9pbnQoZ2VvbWV0cnkuY29tcG9uZW50c1tpXSk7aWYoaW50ZXJzZWN0KXti cmVhazt9fX19ZWxzZXtmb3IoaT0wLGxlbj1nZW9tZXRyeS5jb21wb25lbnRzLmxl bmd0aDtpPGxlbjsrK2kpe2ludGVyc2VjdD10aGlzLmludGVyc2VjdHMoZ2VvbWV0 cnkuY29tcG9uZW50c1tpXSk7aWYoaW50ZXJzZWN0KXticmVhazt9fX0KaWYoIWlu dGVyc2VjdCYmZ2VvbWV0cnkuQ0xBU1NfTkFNRT09Ik9wZW5MYXllcnMuR2VvbWV0 cnkuUG9seWdvbiIpe3ZhciByaW5nPXRoaXMuY29tcG9uZW50c1swXTtmb3IoaT0w LGxlbj1yaW5nLmNvbXBvbmVudHMubGVuZ3RoO2k8bGVuOysraSl7aW50ZXJzZWN0 PWdlb21ldHJ5LmNvbnRhaW5zUG9pbnQocmluZy5jb21wb25lbnRzW2ldKTtpZihp bnRlcnNlY3Qpe2JyZWFrO319fQpyZXR1cm4gaW50ZXJzZWN0O30sZGlzdGFuY2VU bzpmdW5jdGlvbihnZW9tZXRyeSxvcHRpb25zKXt2YXIgZWRnZT0hKG9wdGlvbnMm Jm9wdGlvbnMuZWRnZT09PWZhbHNlKTt2YXIgcmVzdWx0O2lmKCFlZGdlJiZ0aGlz LmludGVyc2VjdHMoZ2VvbWV0cnkpKXtyZXN1bHQ9MDt9ZWxzZXtyZXN1bHQ9T3Bl bkxheWVycy5HZW9tZXRyeS5Db2xsZWN0aW9uLnByb3RvdHlwZS5kaXN0YW5jZVRv LmFwcGx5KHRoaXMsW2dlb21ldHJ5LG9wdGlvbnNdKTt9CnJldHVybiByZXN1bHQ7 fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvbHlnb24ifSk7T3Bl bkxheWVycy5HZW9tZXRyeS5Qb2x5Z29uLmNyZWF0ZVJlZ3VsYXJQb2x5Z29uPWZ1 bmN0aW9uKG9yaWdpbixyYWRpdXMsc2lkZXMscm90YXRpb24pe3ZhciBhbmdsZT1N YXRoLlBJKigoMS9zaWRlcyktKDEvMikpO2lmKHJvdGF0aW9uKXthbmdsZSs9KHJv dGF0aW9uLzE4MCkqTWF0aC5QSTt9CnZhciByb3RhdGVkQW5nbGUseCx5O3ZhciBw b2ludHM9W107Zm9yKHZhciBpPTA7aTxzaWRlczsrK2kpe3JvdGF0ZWRBbmdsZT1h bmdsZSsoaSoyKk1hdGguUEkvc2lkZXMpO3g9b3JpZ2luLngrKHJhZGl1cypNYXRo LmNvcyhyb3RhdGVkQW5nbGUpKTt5PW9yaWdpbi55KyhyYWRpdXMqTWF0aC5zaW4o cm90YXRlZEFuZ2xlKSk7cG9pbnRzLnB1c2gobmV3IE9wZW5MYXllcnMuR2VvbWV0 cnkuUG9pbnQoeCx5KSk7fQp2YXIgcmluZz1uZXcgT3BlbkxheWVycy5HZW9tZXRy eS5MaW5lYXJSaW5nKHBvaW50cyk7cmV0dXJuIG5ldyBPcGVuTGF5ZXJzLkdlb21l dHJ5LlBvbHlnb24oW3JpbmddKTt9O09wZW5MYXllcnMuR2VvbWV0cnkuTXVsdGlQ b2x5Z29uPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5HZW9tZXRyeS5Db2xs ZWN0aW9uLHtjb21wb25lbnRUeXBlczpbIk9wZW5MYXllcnMuR2VvbWV0cnkuUG9s eWdvbiJdLGluaXRpYWxpemU6ZnVuY3Rpb24oY29tcG9uZW50cyl7T3BlbkxheWVy cy5HZW9tZXRyeS5Db2xsZWN0aW9uLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5 KHRoaXMsYXJndW1lbnRzKTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuR2VvbWV0 cnkuTXVsdGlQb2x5Z29uIn0pO09wZW5MYXllcnMuRm9ybWF0LkdNTD1PcGVuTGF5 ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0LlhNTCx7ZmVhdHVyZU5TOiJodHRw Oi8vbWFwc2VydmVyLmdpcy51bW4uZWR1L21hcHNlcnZlciIsZmVhdHVyZVByZWZp eDoiZmVhdHVyZSIsZmVhdHVyZU5hbWU6ImZlYXR1cmVNZW1iZXIiLGxheWVyTmFt ZToiZmVhdHVyZXMiLGdlb21ldHJ5TmFtZToiZ2VvbWV0cnkiLGNvbGxlY3Rpb25O YW1lOiJGZWF0dXJlQ29sbGVjdGlvbiIsZ21sbnM6Imh0dHA6Ly93d3cub3Blbmdp cy5uZXQvZ21sIixleHRyYWN0QXR0cmlidXRlczp0cnVlLHh5OnRydWUsaW5pdGlh bGl6ZTpmdW5jdGlvbihvcHRpb25zKXt0aGlzLnJlZ0V4ZXM9e3RyaW1TcGFjZToo L15ccyp8XHMqJC9nKSxyZW1vdmVTcGFjZTooL1xzKi9nKSxzcGxpdFNwYWNlOigv XHMrLyksdHJpbUNvbW1hOigvXHMqLFxzKi9nKX07T3BlbkxheWVycy5Gb3JtYXQu WE1MLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW29wdGlvbnNdKTt9 LHJlYWQ6ZnVuY3Rpb24oZGF0YSl7aWYodHlwZW9mIGRhdGE9PSJzdHJpbmciKXtk YXRhPU9wZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5cGUucmVhZC5hcHBseSh0 aGlzLFtkYXRhXSk7fQp2YXIgZmVhdHVyZU5vZGVzPXRoaXMuZ2V0RWxlbWVudHNC eVRhZ05hbWVOUyhkYXRhLmRvY3VtZW50RWxlbWVudCx0aGlzLmdtbG5zLHRoaXMu ZmVhdHVyZU5hbWUpO3ZhciBmZWF0dXJlcz1bXTtmb3IodmFyIGk9MDtpPGZlYXR1 cmVOb2Rlcy5sZW5ndGg7aSsrKXt2YXIgZmVhdHVyZT10aGlzLnBhcnNlRmVhdHVy ZShmZWF0dXJlTm9kZXNbaV0pO2lmKGZlYXR1cmUpe2ZlYXR1cmVzLnB1c2goZmVh dHVyZSk7fX0KcmV0dXJuIGZlYXR1cmVzO30scGFyc2VGZWF0dXJlOmZ1bmN0aW9u KG5vZGUpe3ZhciBvcmRlcj1bIk11bHRpUG9seWdvbiIsIlBvbHlnb24iLCJNdWx0 aUxpbmVTdHJpbmciLCJMaW5lU3RyaW5nIiwiTXVsdGlQb2ludCIsIlBvaW50Iiwi RW52ZWxvcGUiXTt2YXIgdHlwZSxub2RlTGlzdCxnZW9tZXRyeSxwYXJzZXI7Zm9y KHZhciBpPTA7aTxvcmRlci5sZW5ndGg7KytpKXt0eXBlPW9yZGVyW2ldO25vZGVM aXN0PXRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhub2RlLHRoaXMuZ21sbnMs dHlwZSk7aWYobm9kZUxpc3QubGVuZ3RoPjApe3BhcnNlcj10aGlzLnBhcnNlR2Vv bWV0cnlbdHlwZS50b0xvd2VyQ2FzZSgpXTtpZihwYXJzZXIpe2dlb21ldHJ5PXBh cnNlci5hcHBseSh0aGlzLFtub2RlTGlzdFswXV0pO2lmKHRoaXMuaW50ZXJuYWxQ cm9qZWN0aW9uJiZ0aGlzLmV4dGVybmFsUHJvamVjdGlvbil7Z2VvbWV0cnkudHJh bnNmb3JtKHRoaXMuZXh0ZXJuYWxQcm9qZWN0aW9uLHRoaXMuaW50ZXJuYWxQcm9q ZWN0aW9uKTt9fWVsc2V7T3BlbkxheWVycy5Db25zb2xlLmVycm9yKE9wZW5MYXll cnMuaTE4bigidW5zdXBwb3J0ZWRHZW9tZXRyeVR5cGUiLHsnZ2VvbVR5cGUnOnR5 cGV9KSk7fQpicmVhazt9fQp2YXIgYm91bmRzO3ZhciBib3hOb2Rlcz10aGlzLmdl dEVsZW1lbnRzQnlUYWdOYW1lTlMobm9kZSx0aGlzLmdtbG5zLCJCb3giKTtmb3Io aT0wO2k8Ym94Tm9kZXMubGVuZ3RoOysraSl7dmFyIGJveE5vZGU9Ym94Tm9kZXNb aV07dmFyIGJveD10aGlzLnBhcnNlR2VvbWV0cnlbImJveCJdLmFwcGx5KHRoaXMs W2JveE5vZGVdKTt2YXIgcGFyZW50Tm9kZT1ib3hOb2RlLnBhcmVudE5vZGU7dmFy IHBhcmVudE5hbWU9cGFyZW50Tm9kZS5sb2NhbE5hbWV8fHBhcmVudE5vZGUubm9k ZU5hbWUuc3BsaXQoIjoiKS5wb3AoKTtpZihwYXJlbnROYW1lPT09ImJvdW5kZWRC eSIpe2JvdW5kcz1ib3g7fWVsc2V7Z2VvbWV0cnk9Ym94LnRvR2VvbWV0cnkoKTt9 fQp2YXIgYXR0cmlidXRlcztpZih0aGlzLmV4dHJhY3RBdHRyaWJ1dGVzKXthdHRy aWJ1dGVzPXRoaXMucGFyc2VBdHRyaWJ1dGVzKG5vZGUpO30KdmFyIGZlYXR1cmU9 bmV3IE9wZW5MYXllcnMuRmVhdHVyZS5WZWN0b3IoZ2VvbWV0cnksYXR0cmlidXRl cyk7ZmVhdHVyZS5ib3VuZHM9Ym91bmRzO2ZlYXR1cmUuZ21sPXtmZWF0dXJlVHlw ZTpub2RlLmZpcnN0Q2hpbGQubm9kZU5hbWUuc3BsaXQoIjoiKVsxXSxmZWF0dXJl TlM6bm9kZS5maXJzdENoaWxkLm5hbWVzcGFjZVVSSSxmZWF0dXJlTlNQcmVmaXg6 bm9kZS5maXJzdENoaWxkLnByZWZpeH07dmFyIGNoaWxkTm9kZT1ub2RlLmZpcnN0 Q2hpbGQ7dmFyIGZpZDt3aGlsZShjaGlsZE5vZGUpe2lmKGNoaWxkTm9kZS5ub2Rl VHlwZT09MSl7ZmlkPWNoaWxkTm9kZS5nZXRBdHRyaWJ1dGUoImZpZCIpfHxjaGls ZE5vZGUuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGZpZCl7YnJlYWs7fX0KY2hpbGRO b2RlPWNoaWxkTm9kZS5uZXh0U2libGluZzt9CmZlYXR1cmUuZmlkPWZpZDtyZXR1 cm4gZmVhdHVyZTt9LHBhcnNlR2VvbWV0cnk6e3BvaW50OmZ1bmN0aW9uKG5vZGUp e3ZhciBub2RlTGlzdCxjb29yZFN0cmluZzt2YXIgY29vcmRzPVtdO3ZhciBub2Rl TGlzdD10aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMobm9kZSx0aGlzLmdtbG5z LCJwb3MiKTtpZihub2RlTGlzdC5sZW5ndGg+MCl7Y29vcmRTdHJpbmc9bm9kZUxp c3RbMF0uZmlyc3RDaGlsZC5ub2RlVmFsdWU7Y29vcmRTdHJpbmc9Y29vcmRTdHJp bmcucmVwbGFjZSh0aGlzLnJlZ0V4ZXMudHJpbVNwYWNlLCIiKTtjb29yZHM9Y29v cmRTdHJpbmcuc3BsaXQodGhpcy5yZWdFeGVzLnNwbGl0U3BhY2UpO30KaWYoY29v cmRzLmxlbmd0aD09MCl7bm9kZUxpc3Q9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFt ZU5TKG5vZGUsdGhpcy5nbWxucywiY29vcmRpbmF0ZXMiKTtpZihub2RlTGlzdC5s ZW5ndGg+MCl7Y29vcmRTdHJpbmc9bm9kZUxpc3RbMF0uZmlyc3RDaGlsZC5ub2Rl VmFsdWU7Y29vcmRTdHJpbmc9Y29vcmRTdHJpbmcucmVwbGFjZSh0aGlzLnJlZ0V4 ZXMucmVtb3ZlU3BhY2UsIiIpO2Nvb3Jkcz1jb29yZFN0cmluZy5zcGxpdCgiLCIp O319CmlmKGNvb3Jkcy5sZW5ndGg9PTApe25vZGVMaXN0PXRoaXMuZ2V0RWxlbWVu dHNCeVRhZ05hbWVOUyhub2RlLHRoaXMuZ21sbnMsImNvb3JkIik7aWYobm9kZUxp c3QubGVuZ3RoPjApe3ZhciB4TGlzdD10aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1l TlMobm9kZUxpc3RbMF0sdGhpcy5nbWxucywiWCIpO3ZhciB5TGlzdD10aGlzLmdl dEVsZW1lbnRzQnlUYWdOYW1lTlMobm9kZUxpc3RbMF0sdGhpcy5nbWxucywiWSIp O2lmKHhMaXN0Lmxlbmd0aD4wJiZ5TGlzdC5sZW5ndGg+MCl7Y29vcmRzPVt4TGlz dFswXS5maXJzdENoaWxkLm5vZGVWYWx1ZSx5TGlzdFswXS5maXJzdENoaWxkLm5v ZGVWYWx1ZV07fX19CmlmKGNvb3Jkcy5sZW5ndGg9PTIpe2Nvb3Jkc1syXT1udWxs O30KaWYodGhpcy54eSl7cmV0dXJuIG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBv aW50KGNvb3Jkc1swXSxjb29yZHNbMV0sY29vcmRzWzJdKTt9CmVsc2V7cmV0dXJu IG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KGNvb3Jkc1sxXSxjb29yZHNb MF0sY29vcmRzWzJdKTt9fSxtdWx0aXBvaW50OmZ1bmN0aW9uKG5vZGUpe3ZhciBu b2RlTGlzdD10aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMobm9kZSx0aGlzLmdt bG5zLCJQb2ludCIpO3ZhciBjb21wb25lbnRzPVtdO2lmKG5vZGVMaXN0Lmxlbmd0 aD4wKXt2YXIgcG9pbnQ7Zm9yKHZhciBpPTA7aTxub2RlTGlzdC5sZW5ndGg7Kytp KXtwb2ludD10aGlzLnBhcnNlR2VvbWV0cnkucG9pbnQuYXBwbHkodGhpcyxbbm9k ZUxpc3RbaV1dKTtpZihwb2ludCl7Y29tcG9uZW50cy5wdXNoKHBvaW50KTt9fX0K cmV0dXJuIG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5Lk11bHRpUG9pbnQoY29tcG9u ZW50cyk7fSxsaW5lc3RyaW5nOmZ1bmN0aW9uKG5vZGUscmluZyl7dmFyIG5vZGVM aXN0LGNvb3JkU3RyaW5nO3ZhciBjb29yZHM9W107dmFyIHBvaW50cz1bXTtub2Rl TGlzdD10aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMobm9kZSx0aGlzLmdtbG5z LCJwb3NMaXN0Iik7aWYobm9kZUxpc3QubGVuZ3RoPjApe2Nvb3JkU3RyaW5nPXRo aXMuZ2V0Q2hpbGRWYWx1ZShub2RlTGlzdFswXSk7Y29vcmRTdHJpbmc9Y29vcmRT dHJpbmcucmVwbGFjZSh0aGlzLnJlZ0V4ZXMudHJpbVNwYWNlLCIiKTtjb29yZHM9 Y29vcmRTdHJpbmcuc3BsaXQodGhpcy5yZWdFeGVzLnNwbGl0U3BhY2UpO3ZhciBk aW09cGFyc2VJbnQobm9kZUxpc3RbMF0uZ2V0QXR0cmlidXRlKCJkaW1lbnNpb24i KSk7dmFyIGoseCx5LHo7Zm9yKHZhciBpPTA7aTxjb29yZHMubGVuZ3RoL2RpbTsr K2kpe2o9aSpkaW07eD1jb29yZHNbal07eT1jb29yZHNbaisxXTt6PShkaW09PTIp P251bGw6Y29vcmRzW2orMl07aWYodGhpcy54eSl7cG9pbnRzLnB1c2gobmV3IE9w ZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQoeCx5LHopKTt9ZWxzZXtwb2ludHMucHVz aChuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCh5LHgseikpO319fQppZihj b29yZHMubGVuZ3RoPT0wKXtub2RlTGlzdD10aGlzLmdldEVsZW1lbnRzQnlUYWdO YW1lTlMobm9kZSx0aGlzLmdtbG5zLCJjb29yZGluYXRlcyIpO2lmKG5vZGVMaXN0 Lmxlbmd0aD4wKXtjb29yZFN0cmluZz10aGlzLmdldENoaWxkVmFsdWUobm9kZUxp c3RbMF0pO2Nvb3JkU3RyaW5nPWNvb3JkU3RyaW5nLnJlcGxhY2UodGhpcy5yZWdF eGVzLnRyaW1TcGFjZSwiIik7Y29vcmRTdHJpbmc9Y29vcmRTdHJpbmcucmVwbGFj ZSh0aGlzLnJlZ0V4ZXMudHJpbUNvbW1hLCIsIik7dmFyIHBvaW50TGlzdD1jb29y ZFN0cmluZy5zcGxpdCh0aGlzLnJlZ0V4ZXMuc3BsaXRTcGFjZSk7Zm9yKHZhciBp PTA7aTxwb2ludExpc3QubGVuZ3RoOysraSl7Y29vcmRzPXBvaW50TGlzdFtpXS5z cGxpdCgiLCIpO2lmKGNvb3Jkcy5sZW5ndGg9PTIpe2Nvb3Jkc1syXT1udWxsO30K aWYodGhpcy54eSl7cG9pbnRzLnB1c2gobmV3IE9wZW5MYXllcnMuR2VvbWV0cnku UG9pbnQoY29vcmRzWzBdLGNvb3Jkc1sxXSxjb29yZHNbMl0pKTt9ZWxzZXtwb2lu dHMucHVzaChuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludChjb29yZHNbMV0s Y29vcmRzWzBdLGNvb3Jkc1syXSkpO319fX0KdmFyIGxpbmU9bnVsbDtpZihwb2lu dHMubGVuZ3RoIT0wKXtpZihyaW5nKXtsaW5lPW5ldyBPcGVuTGF5ZXJzLkdlb21l dHJ5LkxpbmVhclJpbmcocG9pbnRzKTt9ZWxzZXtsaW5lPW5ldyBPcGVuTGF5ZXJz Lkdlb21ldHJ5LkxpbmVTdHJpbmcocG9pbnRzKTt9fQpyZXR1cm4gbGluZTt9LG11 bHRpbGluZXN0cmluZzpmdW5jdGlvbihub2RlKXt2YXIgbm9kZUxpc3Q9dGhpcy5n ZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5vZGUsdGhpcy5nbWxucywiTGluZVN0cmlu ZyIpO3ZhciBjb21wb25lbnRzPVtdO2lmKG5vZGVMaXN0Lmxlbmd0aD4wKXt2YXIg bGluZTtmb3IodmFyIGk9MDtpPG5vZGVMaXN0Lmxlbmd0aDsrK2kpe2xpbmU9dGhp cy5wYXJzZUdlb21ldHJ5LmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbbm9kZUxpc3Rb aV1dKTtpZihsaW5lKXtjb21wb25lbnRzLnB1c2gobGluZSk7fX19CnJldHVybiBu ZXcgT3BlbkxheWVycy5HZW9tZXRyeS5NdWx0aUxpbmVTdHJpbmcoY29tcG9uZW50 cyk7fSxwb2x5Z29uOmZ1bmN0aW9uKG5vZGUpe3ZhciBub2RlTGlzdD10aGlzLmdl dEVsZW1lbnRzQnlUYWdOYW1lTlMobm9kZSx0aGlzLmdtbG5zLCJMaW5lYXJSaW5n Iik7dmFyIGNvbXBvbmVudHM9W107aWYobm9kZUxpc3QubGVuZ3RoPjApe3ZhciBy aW5nO2Zvcih2YXIgaT0wO2k8bm9kZUxpc3QubGVuZ3RoOysraSl7cmluZz10aGlz LnBhcnNlR2VvbWV0cnkubGluZXN0cmluZy5hcHBseSh0aGlzLFtub2RlTGlzdFtp XSx0cnVlXSk7aWYocmluZyl7Y29tcG9uZW50cy5wdXNoKHJpbmcpO319fQpyZXR1 cm4gbmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9seWdvbihjb21wb25lbnRzKTt9 LG11bHRpcG9seWdvbjpmdW5jdGlvbihub2RlKXt2YXIgbm9kZUxpc3Q9dGhpcy5n ZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5vZGUsdGhpcy5nbWxucywiUG9seWdvbiIp O3ZhciBjb21wb25lbnRzPVtdO2lmKG5vZGVMaXN0Lmxlbmd0aD4wKXt2YXIgcG9s eWdvbjtmb3IodmFyIGk9MDtpPG5vZGVMaXN0Lmxlbmd0aDsrK2kpe3BvbHlnb249 dGhpcy5wYXJzZUdlb21ldHJ5LnBvbHlnb24uYXBwbHkodGhpcyxbbm9kZUxpc3Rb aV1dKTtpZihwb2x5Z29uKXtjb21wb25lbnRzLnB1c2gocG9seWdvbik7fX19CnJl dHVybiBuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5NdWx0aVBvbHlnb24oY29tcG9u ZW50cyk7fSxlbnZlbG9wZTpmdW5jdGlvbihub2RlKXt2YXIgY29tcG9uZW50cz1b XTt2YXIgY29vcmRTdHJpbmc7dmFyIGVudmVsb3BlO3ZhciBscG9pbnQ9dGhpcy5n ZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5vZGUsdGhpcy5nbWxucywibG93ZXJDb3Ju ZXIiKTtpZihscG9pbnQubGVuZ3RoPjApe3ZhciBjb29yZHM9W107aWYobHBvaW50 Lmxlbmd0aD4wKXtjb29yZFN0cmluZz1scG9pbnRbMF0uZmlyc3RDaGlsZC5ub2Rl VmFsdWU7Y29vcmRTdHJpbmc9Y29vcmRTdHJpbmcucmVwbGFjZSh0aGlzLnJlZ0V4 ZXMudHJpbVNwYWNlLCIiKTtjb29yZHM9Y29vcmRTdHJpbmcuc3BsaXQodGhpcy5y ZWdFeGVzLnNwbGl0U3BhY2UpO30KaWYoY29vcmRzLmxlbmd0aD09Mil7Y29vcmRz WzJdPW51bGw7fQppZih0aGlzLnh5KXt2YXIgbG93ZXJQb2ludD1uZXcgT3Blbkxh eWVycy5HZW9tZXRyeS5Qb2ludChjb29yZHNbMF0sY29vcmRzWzFdLGNvb3Jkc1sy XSk7fWVsc2V7dmFyIGxvd2VyUG9pbnQ9bmV3IE9wZW5MYXllcnMuR2VvbWV0cnku UG9pbnQoY29vcmRzWzFdLGNvb3Jkc1swXSxjb29yZHNbMl0pO319CnZhciB1cG9p bnQ9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5vZGUsdGhpcy5nbWxucywi dXBwZXJDb3JuZXIiKTtpZih1cG9pbnQubGVuZ3RoPjApe3ZhciBjb29yZHM9W107 aWYodXBvaW50Lmxlbmd0aD4wKXtjb29yZFN0cmluZz11cG9pbnRbMF0uZmlyc3RD aGlsZC5ub2RlVmFsdWU7Y29vcmRTdHJpbmc9Y29vcmRTdHJpbmcucmVwbGFjZSh0 aGlzLnJlZ0V4ZXMudHJpbVNwYWNlLCIiKTtjb29yZHM9Y29vcmRTdHJpbmcuc3Bs aXQodGhpcy5yZWdFeGVzLnNwbGl0U3BhY2UpO30KaWYoY29vcmRzLmxlbmd0aD09 Mil7Y29vcmRzWzJdPW51bGw7fQppZih0aGlzLnh5KXt2YXIgdXBwZXJQb2ludD1u ZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludChjb29yZHNbMF0sY29vcmRzWzFd LGNvb3Jkc1syXSk7fWVsc2V7dmFyIHVwcGVyUG9pbnQ9bmV3IE9wZW5MYXllcnMu R2VvbWV0cnkuUG9pbnQoY29vcmRzWzFdLGNvb3Jkc1swXSxjb29yZHNbMl0pO319 CmlmKGxvd2VyUG9pbnQmJnVwcGVyUG9pbnQpe2NvbXBvbmVudHMucHVzaChuZXcg T3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludChsb3dlclBvaW50LngsbG93ZXJQb2lu dC55KSk7Y29tcG9uZW50cy5wdXNoKG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBv aW50KHVwcGVyUG9pbnQueCxsb3dlclBvaW50LnkpKTtjb21wb25lbnRzLnB1c2go bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQodXBwZXJQb2ludC54LHVwcGVy UG9pbnQueSkpO2NvbXBvbmVudHMucHVzaChuZXcgT3BlbkxheWVycy5HZW9tZXRy eS5Qb2ludChsb3dlclBvaW50LngsdXBwZXJQb2ludC55KSk7Y29tcG9uZW50cy5w dXNoKG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KGxvd2VyUG9pbnQueCxs b3dlclBvaW50LnkpKTt2YXIgcmluZz1uZXcgT3BlbkxheWVycy5HZW9tZXRyeS5M aW5lYXJSaW5nKGNvbXBvbmVudHMpO2VudmVsb3BlPW5ldyBPcGVuTGF5ZXJzLkdl b21ldHJ5LlBvbHlnb24oW3JpbmddKTt9CnJldHVybiBlbnZlbG9wZTt9LGJveDpm dW5jdGlvbihub2RlKXt2YXIgbm9kZUxpc3Q9dGhpcy5nZXRFbGVtZW50c0J5VGFn TmFtZU5TKG5vZGUsdGhpcy5nbWxucywiY29vcmRpbmF0ZXMiKTt2YXIgY29vcmRT dHJpbmc7dmFyIGNvb3JkcyxiZWdpblBvaW50PW51bGwsZW5kUG9pbnQ9bnVsbDtp Zihub2RlTGlzdC5sZW5ndGg+MCl7Y29vcmRTdHJpbmc9bm9kZUxpc3RbMF0uZmly c3RDaGlsZC5ub2RlVmFsdWU7Y29vcmRzPWNvb3JkU3RyaW5nLnNwbGl0KCIgIik7 aWYoY29vcmRzLmxlbmd0aD09Mil7YmVnaW5Qb2ludD1jb29yZHNbMF0uc3BsaXQo IiwiKTtlbmRQb2ludD1jb29yZHNbMV0uc3BsaXQoIiwiKTt9fQppZihiZWdpblBv aW50IT09bnVsbCYmZW5kUG9pbnQhPT1udWxsKXtyZXR1cm4gbmV3IE9wZW5MYXll cnMuQm91bmRzKHBhcnNlRmxvYXQoYmVnaW5Qb2ludFswXSkscGFyc2VGbG9hdChi ZWdpblBvaW50WzFdKSxwYXJzZUZsb2F0KGVuZFBvaW50WzBdKSxwYXJzZUZsb2F0 KGVuZFBvaW50WzFdKSk7fX19LHBhcnNlQXR0cmlidXRlczpmdW5jdGlvbihub2Rl KXt2YXIgYXR0cmlidXRlcz17fTt2YXIgY2hpbGROb2RlPW5vZGUuZmlyc3RDaGls ZDt2YXIgY2hpbGRyZW4saSxjaGlsZCxncmFuZGNoaWxkcmVuLGdyYW5kY2hpbGQs bmFtZSx2YWx1ZTt3aGlsZShjaGlsZE5vZGUpe2lmKGNoaWxkTm9kZS5ub2RlVHlw ZT09MSl7Y2hpbGRyZW49Y2hpbGROb2RlLmNoaWxkTm9kZXM7Zm9yKGk9MDtpPGNo aWxkcmVuLmxlbmd0aDsrK2kpe2NoaWxkPWNoaWxkcmVuW2ldO2lmKGNoaWxkLm5v ZGVUeXBlPT0xKXtncmFuZGNoaWxkcmVuPWNoaWxkLmNoaWxkTm9kZXM7aWYoZ3Jh bmRjaGlsZHJlbi5sZW5ndGg9PTEpe2dyYW5kY2hpbGQ9Z3JhbmRjaGlsZHJlblsw XTtpZihncmFuZGNoaWxkLm5vZGVUeXBlPT0zfHxncmFuZGNoaWxkLm5vZGVUeXBl PT00KXtuYW1lPShjaGlsZC5wcmVmaXgpP2NoaWxkLm5vZGVOYW1lLnNwbGl0KCI6 IilbMV06Y2hpbGQubm9kZU5hbWU7dmFsdWU9Z3JhbmRjaGlsZC5ub2RlVmFsdWUu cmVwbGFjZSh0aGlzLnJlZ0V4ZXMudHJpbVNwYWNlLCIiKTthdHRyaWJ1dGVzW25h bWVdPXZhbHVlO319ZWxzZXthdHRyaWJ1dGVzW2NoaWxkLm5vZGVOYW1lLnNwbGl0 KCI6IikucG9wKCldPW51bGw7fX19CmJyZWFrO30KY2hpbGROb2RlPWNoaWxkTm9k ZS5uZXh0U2libGluZzt9CnJldHVybiBhdHRyaWJ1dGVzO30sd3JpdGU6ZnVuY3Rp b24oZmVhdHVyZXMpe2lmKCEoT3BlbkxheWVycy5VdGlsLmlzQXJyYXkoZmVhdHVy ZXMpKSl7ZmVhdHVyZXM9W2ZlYXR1cmVzXTt9CnZhciBnbWw9dGhpcy5jcmVhdGVF bGVtZW50TlMoImh0dHA6Ly93d3cub3Blbmdpcy5uZXQvd2ZzIiwid2ZzOiIrdGhp cy5jb2xsZWN0aW9uTmFtZSk7Zm9yKHZhciBpPTA7aTxmZWF0dXJlcy5sZW5ndGg7 aSsrKXtnbWwuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVGZWF0dXJlWE1MKGZlYXR1 cmVzW2ldKSk7fQpyZXR1cm4gT3BlbkxheWVycy5Gb3JtYXQuWE1MLnByb3RvdHlw ZS53cml0ZS5hcHBseSh0aGlzLFtnbWxdKTt9LGNyZWF0ZUZlYXR1cmVYTUw6ZnVu Y3Rpb24oZmVhdHVyZSl7dmFyIGdlb21ldHJ5PWZlYXR1cmUuZ2VvbWV0cnk7dmFy IGdlb21ldHJ5Tm9kZT10aGlzLmJ1aWxkR2VvbWV0cnlOb2RlKGdlb21ldHJ5KTt2 YXIgZ2VvbUNvbnRhaW5lcj10aGlzLmNyZWF0ZUVsZW1lbnROUyh0aGlzLmZlYXR1 cmVOUyx0aGlzLmZlYXR1cmVQcmVmaXgrIjoiKwp0aGlzLmdlb21ldHJ5TmFtZSk7 Z2VvbUNvbnRhaW5lci5hcHBlbmRDaGlsZChnZW9tZXRyeU5vZGUpO3ZhciBmZWF0 dXJlTm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROUyh0aGlzLmdtbG5zLCJnbWw6Iit0 aGlzLmZlYXR1cmVOYW1lKTt2YXIgZmVhdHVyZUNvbnRhaW5lcj10aGlzLmNyZWF0 ZUVsZW1lbnROUyh0aGlzLmZlYXR1cmVOUyx0aGlzLmZlYXR1cmVQcmVmaXgrIjoi Kwp0aGlzLmxheWVyTmFtZSk7dmFyIGZpZD1mZWF0dXJlLmZpZHx8ZmVhdHVyZS5p ZDtmZWF0dXJlQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgiZmlkIixmaWQpO2ZlYXR1 cmVDb250YWluZXIuYXBwZW5kQ2hpbGQoZ2VvbUNvbnRhaW5lcik7Zm9yKHZhciBh dHRyIGluIGZlYXR1cmUuYXR0cmlidXRlcyl7dmFyIGF0dHJUZXh0PXRoaXMuY3Jl YXRlVGV4dE5vZGUoZmVhdHVyZS5hdHRyaWJ1dGVzW2F0dHJdKTt2YXIgbm9kZW5h bWU9YXR0ci5zdWJzdHJpbmcoYXR0ci5sYXN0SW5kZXhPZigiOiIpKzEpO3ZhciBh dHRyQ29udGFpbmVyPXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMuZmVhdHVyZU5T LHRoaXMuZmVhdHVyZVByZWZpeCsiOiIrCm5vZGVuYW1lKTthdHRyQ29udGFpbmVy LmFwcGVuZENoaWxkKGF0dHJUZXh0KTtmZWF0dXJlQ29udGFpbmVyLmFwcGVuZENo aWxkKGF0dHJDb250YWluZXIpO30KZmVhdHVyZU5vZGUuYXBwZW5kQ2hpbGQoZmVh dHVyZUNvbnRhaW5lcik7cmV0dXJuIGZlYXR1cmVOb2RlO30sYnVpbGRHZW9tZXRy eU5vZGU6ZnVuY3Rpb24oZ2VvbWV0cnkpe2lmKHRoaXMuZXh0ZXJuYWxQcm9qZWN0 aW9uJiZ0aGlzLmludGVybmFsUHJvamVjdGlvbil7Z2VvbWV0cnk9Z2VvbWV0cnku Y2xvbmUoKTtnZW9tZXRyeS50cmFuc2Zvcm0odGhpcy5pbnRlcm5hbFByb2plY3Rp b24sdGhpcy5leHRlcm5hbFByb2plY3Rpb24pO30KdmFyIGNsYXNzTmFtZT1nZW9t ZXRyeS5DTEFTU19OQU1FO3ZhciB0eXBlPWNsYXNzTmFtZS5zdWJzdHJpbmcoY2xh c3NOYW1lLmxhc3RJbmRleE9mKCIuIikrMSk7dmFyIGJ1aWxkZXI9dGhpcy5idWls ZEdlb21ldHJ5W3R5cGUudG9Mb3dlckNhc2UoKV07cmV0dXJuIGJ1aWxkZXIuYXBw bHkodGhpcyxbZ2VvbWV0cnldKTt9LGJ1aWxkR2VvbWV0cnk6e3BvaW50OmZ1bmN0 aW9uKGdlb21ldHJ5KXt2YXIgZ21sPXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMu Z21sbnMsImdtbDpQb2ludCIpO2dtbC5hcHBlbmRDaGlsZCh0aGlzLmJ1aWxkQ29v cmRpbmF0ZXNOb2RlKGdlb21ldHJ5KSk7cmV0dXJuIGdtbDt9LG11bHRpcG9pbnQ6 ZnVuY3Rpb24oZ2VvbWV0cnkpe3ZhciBnbWw9dGhpcy5jcmVhdGVFbGVtZW50TlMo dGhpcy5nbWxucywiZ21sOk11bHRpUG9pbnQiKTt2YXIgcG9pbnRzPWdlb21ldHJ5 LmNvbXBvbmVudHM7dmFyIHBvaW50TWVtYmVyLHBvaW50R2VvbTtmb3IodmFyIGk9 MDtpPHBvaW50cy5sZW5ndGg7aSsrKXtwb2ludE1lbWJlcj10aGlzLmNyZWF0ZUVs ZW1lbnROUyh0aGlzLmdtbG5zLCJnbWw6cG9pbnRNZW1iZXIiKTtwb2ludEdlb209 dGhpcy5idWlsZEdlb21ldHJ5LnBvaW50LmFwcGx5KHRoaXMsW3BvaW50c1tpXV0p O3BvaW50TWVtYmVyLmFwcGVuZENoaWxkKHBvaW50R2VvbSk7Z21sLmFwcGVuZENo aWxkKHBvaW50TWVtYmVyKTt9CnJldHVybiBnbWw7fSxsaW5lc3RyaW5nOmZ1bmN0 aW9uKGdlb21ldHJ5KXt2YXIgZ21sPXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMu Z21sbnMsImdtbDpMaW5lU3RyaW5nIik7Z21sLmFwcGVuZENoaWxkKHRoaXMuYnVp bGRDb29yZGluYXRlc05vZGUoZ2VvbWV0cnkpKTtyZXR1cm4gZ21sO30sbXVsdGls aW5lc3RyaW5nOmZ1bmN0aW9uKGdlb21ldHJ5KXt2YXIgZ21sPXRoaXMuY3JlYXRl RWxlbWVudE5TKHRoaXMuZ21sbnMsImdtbDpNdWx0aUxpbmVTdHJpbmciKTt2YXIg bGluZXM9Z2VvbWV0cnkuY29tcG9uZW50czt2YXIgbGluZU1lbWJlcixsaW5lR2Vv bTtmb3IodmFyIGk9MDtpPGxpbmVzLmxlbmd0aDsrK2kpe2xpbmVNZW1iZXI9dGhp cy5jcmVhdGVFbGVtZW50TlModGhpcy5nbWxucywiZ21sOmxpbmVTdHJpbmdNZW1i ZXIiKTtsaW5lR2VvbT10aGlzLmJ1aWxkR2VvbWV0cnkubGluZXN0cmluZy5hcHBs eSh0aGlzLFtsaW5lc1tpXV0pO2xpbmVNZW1iZXIuYXBwZW5kQ2hpbGQobGluZUdl b20pO2dtbC5hcHBlbmRDaGlsZChsaW5lTWVtYmVyKTt9CnJldHVybiBnbWw7fSxs aW5lYXJyaW5nOmZ1bmN0aW9uKGdlb21ldHJ5KXt2YXIgZ21sPXRoaXMuY3JlYXRl RWxlbWVudE5TKHRoaXMuZ21sbnMsImdtbDpMaW5lYXJSaW5nIik7Z21sLmFwcGVu ZENoaWxkKHRoaXMuYnVpbGRDb29yZGluYXRlc05vZGUoZ2VvbWV0cnkpKTtyZXR1 cm4gZ21sO30scG9seWdvbjpmdW5jdGlvbihnZW9tZXRyeSl7dmFyIGdtbD10aGlz LmNyZWF0ZUVsZW1lbnROUyh0aGlzLmdtbG5zLCJnbWw6UG9seWdvbiIpO3ZhciBy aW5ncz1nZW9tZXRyeS5jb21wb25lbnRzO3ZhciByaW5nTWVtYmVyLHJpbmdHZW9t LHR5cGU7Zm9yKHZhciBpPTA7aTxyaW5ncy5sZW5ndGg7KytpKXt0eXBlPShpPT0w KT8ib3V0ZXJCb3VuZGFyeUlzIjoiaW5uZXJCb3VuZGFyeUlzIjtyaW5nTWVtYmVy PXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMuZ21sbnMsImdtbDoiK3R5cGUpO3Jp bmdHZW9tPXRoaXMuYnVpbGRHZW9tZXRyeS5saW5lYXJyaW5nLmFwcGx5KHRoaXMs W3JpbmdzW2ldXSk7cmluZ01lbWJlci5hcHBlbmRDaGlsZChyaW5nR2VvbSk7Z21s LmFwcGVuZENoaWxkKHJpbmdNZW1iZXIpO30KcmV0dXJuIGdtbDt9LG11bHRpcG9s eWdvbjpmdW5jdGlvbihnZW9tZXRyeSl7dmFyIGdtbD10aGlzLmNyZWF0ZUVsZW1l bnROUyh0aGlzLmdtbG5zLCJnbWw6TXVsdGlQb2x5Z29uIik7dmFyIHBvbHlzPWdl b21ldHJ5LmNvbXBvbmVudHM7dmFyIHBvbHlNZW1iZXIscG9seUdlb207Zm9yKHZh ciBpPTA7aTxwb2x5cy5sZW5ndGg7KytpKXtwb2x5TWVtYmVyPXRoaXMuY3JlYXRl RWxlbWVudE5TKHRoaXMuZ21sbnMsImdtbDpwb2x5Z29uTWVtYmVyIik7cG9seUdl b209dGhpcy5idWlsZEdlb21ldHJ5LnBvbHlnb24uYXBwbHkodGhpcyxbcG9seXNb aV1dKTtwb2x5TWVtYmVyLmFwcGVuZENoaWxkKHBvbHlHZW9tKTtnbWwuYXBwZW5k Q2hpbGQocG9seU1lbWJlcik7fQpyZXR1cm4gZ21sO30sYm91bmRzOmZ1bmN0aW9u KGJvdW5kcyl7dmFyIGdtbD10aGlzLmNyZWF0ZUVsZW1lbnROUyh0aGlzLmdtbG5z LCJnbWw6Qm94Iik7Z21sLmFwcGVuZENoaWxkKHRoaXMuYnVpbGRDb29yZGluYXRl c05vZGUoYm91bmRzKSk7cmV0dXJuIGdtbDt9fSxidWlsZENvb3JkaW5hdGVzTm9k ZTpmdW5jdGlvbihnZW9tZXRyeSl7dmFyIGNvb3JkaW5hdGVzTm9kZT10aGlzLmNy ZWF0ZUVsZW1lbnROUyh0aGlzLmdtbG5zLCJnbWw6Y29vcmRpbmF0ZXMiKTtjb29y ZGluYXRlc05vZGUuc2V0QXR0cmlidXRlKCJkZWNpbWFsIiwiLiIpO2Nvb3JkaW5h dGVzTm9kZS5zZXRBdHRyaWJ1dGUoImNzIiwiLCIpO2Nvb3JkaW5hdGVzTm9kZS5z ZXRBdHRyaWJ1dGUoInRzIiwiICIpO3ZhciBwYXJ0cz1bXTtpZihnZW9tZXRyeSBp bnN0YW5jZW9mIE9wZW5MYXllcnMuQm91bmRzKXtwYXJ0cy5wdXNoKGdlb21ldHJ5 LmxlZnQrIiwiK2dlb21ldHJ5LmJvdHRvbSk7cGFydHMucHVzaChnZW9tZXRyeS5y aWdodCsiLCIrZ2VvbWV0cnkudG9wKTt9ZWxzZXt2YXIgcG9pbnRzPShnZW9tZXRy eS5jb21wb25lbnRzKT9nZW9tZXRyeS5jb21wb25lbnRzOltnZW9tZXRyeV07Zm9y KHZhciBpPTA7aTxwb2ludHMubGVuZ3RoO2krKyl7cGFydHMucHVzaChwb2ludHNb aV0ueCsiLCIrcG9pbnRzW2ldLnkpO319CnZhciB0eHROb2RlPXRoaXMuY3JlYXRl VGV4dE5vZGUocGFydHMuam9pbigiICIpKTtjb29yZGluYXRlc05vZGUuYXBwZW5k Q2hpbGQodHh0Tm9kZSk7cmV0dXJuIGNvb3JkaW5hdGVzTm9kZTt9LENMQVNTX05B TUU6Ik9wZW5MYXllcnMuRm9ybWF0LkdNTCJ9KTtpZighT3BlbkxheWVycy5Gb3Jt YXQuR01MKXtPcGVuTGF5ZXJzLkZvcm1hdC5HTUw9e307fQpPcGVuTGF5ZXJzLkZv cm1hdC5HTUwuQmFzZT1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0 LlhNTCx7bmFtZXNwYWNlczp7Z21sOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dt bCIseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhzaToiaHR0 cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLHdmczoiaHR0 cDovL3d3dy5vcGVuZ2lzLm5ldC93ZnMifSxkZWZhdWx0UHJlZml4OiJnbWwiLHNj aGVtYUxvY2F0aW9uOm51bGwsZmVhdHVyZVR5cGU6bnVsbCxmZWF0dXJlTlM6bnVs bCxnZW9tZXRyeU5hbWU6Imdlb21ldHJ5IixleHRyYWN0QXR0cmlidXRlczp0cnVl LHNyc05hbWU6bnVsbCx4eTp0cnVlLGdlb21ldHJ5VHlwZXM6bnVsbCxzaW5nbGVG ZWF0dXJlVHlwZTpudWxsLHJlZ0V4ZXM6e3RyaW1TcGFjZTooL15ccyp8XHMqJC9n KSxyZW1vdmVTcGFjZTooL1xzKi9nKSxzcGxpdFNwYWNlOigvXHMrLyksdHJpbUNv bW1hOigvXHMqLFxzKi9nKSxmZWF0dXJlTWVtYmVyOigvXiguKjopP2ZlYXR1cmVN ZW1iZXJzPyQvKX0saW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXtPcGVuTGF5 ZXJzLkZvcm1hdC5YTUwucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxb b3B0aW9uc10pO3RoaXMuc2V0R2VvbWV0cnlUeXBlcygpO2lmKG9wdGlvbnMmJm9w dGlvbnMuZmVhdHVyZU5TKXt0aGlzLnNldE5hbWVzcGFjZSgiZmVhdHVyZSIsb3B0 aW9ucy5mZWF0dXJlTlMpO30KdGhpcy5zaW5nbGVGZWF0dXJlVHlwZT0hb3B0aW9u c3x8KHR5cGVvZiBvcHRpb25zLmZlYXR1cmVUeXBlPT09InN0cmluZyIpO30scmVh ZDpmdW5jdGlvbihkYXRhKXtpZih0eXBlb2YgZGF0YT09InN0cmluZyIpe2RhdGE9 T3BlbkxheWVycy5Gb3JtYXQuWE1MLnByb3RvdHlwZS5yZWFkLmFwcGx5KHRoaXMs W2RhdGFdKTt9CmlmKGRhdGEmJmRhdGEubm9kZVR5cGU9PTkpe2RhdGE9ZGF0YS5k b2N1bWVudEVsZW1lbnQ7fQp2YXIgZmVhdHVyZXM9W107dGhpcy5yZWFkTm9kZShk YXRhLHtmZWF0dXJlczpmZWF0dXJlc30sdHJ1ZSk7aWYoZmVhdHVyZXMubGVuZ3Ro PT0wKXt2YXIgZWxlbWVudHM9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKGRh dGEsdGhpcy5uYW1lc3BhY2VzLmdtbCwiZmVhdHVyZU1lbWJlciIpO2lmKGVsZW1l bnRzLmxlbmd0aCl7Zm9yKHZhciBpPTAsbGVuPWVsZW1lbnRzLmxlbmd0aDtpPGxl bjsrK2kpe3RoaXMucmVhZE5vZGUoZWxlbWVudHNbaV0se2ZlYXR1cmVzOmZlYXR1 cmVzfSx0cnVlKTt9fWVsc2V7dmFyIGVsZW1lbnRzPXRoaXMuZ2V0RWxlbWVudHNC eVRhZ05hbWVOUyhkYXRhLHRoaXMubmFtZXNwYWNlcy5nbWwsImZlYXR1cmVNZW1i ZXJzIik7aWYoZWxlbWVudHMubGVuZ3RoKXt0aGlzLnJlYWROb2RlKGVsZW1lbnRz WzBdLHtmZWF0dXJlczpmZWF0dXJlc30sdHJ1ZSk7fX19CnJldHVybiBmZWF0dXJl czt9LHJlYWROb2RlOmZ1bmN0aW9uKG5vZGUsb2JqLGZpcnN0KXtpZihmaXJzdD09 PXRydWUmJnRoaXMuYXV0b0NvbmZpZz09PXRydWUpe3RoaXMuZmVhdHVyZVR5cGU9 bnVsbDtkZWxldGUgdGhpcy5uYW1lc3BhY2VBbGlhc1t0aGlzLmZlYXR1cmVOU107 ZGVsZXRlIHRoaXMubmFtZXNwYWNlc1siZmVhdHVyZSJdO3RoaXMuZmVhdHVyZU5T PW51bGw7fQppZighdGhpcy5mZWF0dXJlTlMmJighKG5vZGUucHJlZml4IGluIHRo aXMubmFtZXNwYWNlcykmJm5vZGUucGFyZW50Tm9kZS5uYW1lc3BhY2VVUkk9PXRo aXMubmFtZXNwYWNlc1siZ21sIl0mJnRoaXMucmVnRXhlcy5mZWF0dXJlTWVtYmVy LnRlc3Qobm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSkpe3RoaXMuZmVhdHVyZVR5 cGU9bm9kZS5ub2RlTmFtZS5zcGxpdCgiOiIpLnBvcCgpO3RoaXMuc2V0TmFtZXNw YWNlKCJmZWF0dXJlIixub2RlLm5hbWVzcGFjZVVSSSk7dGhpcy5mZWF0dXJlTlM9 bm9kZS5uYW1lc3BhY2VVUkk7dGhpcy5hdXRvQ29uZmlnPXRydWU7fQpyZXR1cm4g T3BlbkxheWVycy5Gb3JtYXQuWE1MLnByb3RvdHlwZS5yZWFkTm9kZS5hcHBseSh0 aGlzLFtub2RlLG9ial0pO30scmVhZGVyczp7ImdtbCI6eyJmZWF0dXJlTWVtYmVy IjpmdW5jdGlvbihub2RlLG9iail7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9i aik7fSwiZmVhdHVyZU1lbWJlcnMiOmZ1bmN0aW9uKG5vZGUsb2JqKXt0aGlzLnJl YWRDaGlsZE5vZGVzKG5vZGUsb2JqKTt9LCJuYW1lIjpmdW5jdGlvbihub2RlLG9i ail7b2JqLm5hbWU9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO30sImJvdW5kZWRC eSI6ZnVuY3Rpb24obm9kZSxvYmope3ZhciBjb250YWluZXI9e307dGhpcy5yZWFk Q2hpbGROb2Rlcyhub2RlLGNvbnRhaW5lcik7aWYoY29udGFpbmVyLmNvbXBvbmVu dHMmJmNvbnRhaW5lci5jb21wb25lbnRzLmxlbmd0aD4wKXtvYmouYm91bmRzPWNv bnRhaW5lci5jb21wb25lbnRzWzBdO319LCJQb2ludCI6ZnVuY3Rpb24obm9kZSxj b250YWluZXIpe3ZhciBvYmo9e3BvaW50czpbXX07dGhpcy5yZWFkQ2hpbGROb2Rl cyhub2RlLG9iaik7aWYoIWNvbnRhaW5lci5jb21wb25lbnRzKXtjb250YWluZXIu Y29tcG9uZW50cz1bXTt9CmNvbnRhaW5lci5jb21wb25lbnRzLnB1c2gob2JqLnBv aW50c1swXSk7fSwiY29vcmRpbmF0ZXMiOmZ1bmN0aW9uKG5vZGUsb2JqKXt2YXIg c3RyPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKS5yZXBsYWNlKHRoaXMucmVnRXhl cy50cmltU3BhY2UsIiIpO3N0cj1zdHIucmVwbGFjZSh0aGlzLnJlZ0V4ZXMudHJp bUNvbW1hLCIsIik7dmFyIHBvaW50TGlzdD1zdHIuc3BsaXQodGhpcy5yZWdFeGVz LnNwbGl0U3BhY2UpO3ZhciBjb29yZHM7dmFyIG51bVBvaW50cz1wb2ludExpc3Qu bGVuZ3RoO3ZhciBwb2ludHM9bmV3IEFycmF5KG51bVBvaW50cyk7Zm9yKHZhciBp PTA7aTxudW1Qb2ludHM7KytpKXtjb29yZHM9cG9pbnRMaXN0W2ldLnNwbGl0KCIs Iik7aWYodGhpcy54eSl7cG9pbnRzW2ldPW5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5 LlBvaW50KGNvb3Jkc1swXSxjb29yZHNbMV0sY29vcmRzWzJdKTt9ZWxzZXtwb2lu dHNbaV09bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQoY29vcmRzWzFdLGNv b3Jkc1swXSxjb29yZHNbMl0pO319Cm9iai5wb2ludHM9cG9pbnRzO30sImNvb3Jk IjpmdW5jdGlvbihub2RlLG9iail7dmFyIGNvb3JkPXt9O3RoaXMucmVhZENoaWxk Tm9kZXMobm9kZSxjb29yZCk7aWYoIW9iai5wb2ludHMpe29iai5wb2ludHM9W107 fQpvYmoucG9pbnRzLnB1c2gobmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQo Y29vcmQueCxjb29yZC55LGNvb3JkLnopKTt9LCJYIjpmdW5jdGlvbihub2RlLGNv b3JkKXtjb29yZC54PXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTt9LCJZIjpmdW5j dGlvbihub2RlLGNvb3JkKXtjb29yZC55PXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2Rl KTt9LCJaIjpmdW5jdGlvbihub2RlLGNvb3JkKXtjb29yZC56PXRoaXMuZ2V0Q2hp bGRWYWx1ZShub2RlKTt9LCJNdWx0aVBvaW50IjpmdW5jdGlvbihub2RlLGNvbnRh aW5lcil7dmFyIG9iaj17Y29tcG9uZW50czpbXX07dGhpcy5yZWFkQ2hpbGROb2Rl cyhub2RlLG9iaik7Y29udGFpbmVyLmNvbXBvbmVudHM9W25ldyBPcGVuTGF5ZXJz Lkdlb21ldHJ5Lk11bHRpUG9pbnQob2JqLmNvbXBvbmVudHMpXTt9LCJwb2ludE1l bWJlciI6ZnVuY3Rpb24obm9kZSxvYmope3RoaXMucmVhZENoaWxkTm9kZXMobm9k ZSxvYmopO30sIkxpbmVTdHJpbmciOmZ1bmN0aW9uKG5vZGUsY29udGFpbmVyKXt2 YXIgb2JqPXt9O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxvYmopO2lmKCFjb250 YWluZXIuY29tcG9uZW50cyl7Y29udGFpbmVyLmNvbXBvbmVudHM9W107fQpjb250 YWluZXIuY29tcG9uZW50cy5wdXNoKG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5Lkxp bmVTdHJpbmcob2JqLnBvaW50cykpO30sIk11bHRpTGluZVN0cmluZyI6ZnVuY3Rp b24obm9kZSxjb250YWluZXIpe3ZhciBvYmo9e2NvbXBvbmVudHM6W119O3RoaXMu cmVhZENoaWxkTm9kZXMobm9kZSxvYmopO2NvbnRhaW5lci5jb21wb25lbnRzPVtu ZXcgT3BlbkxheWVycy5HZW9tZXRyeS5NdWx0aUxpbmVTdHJpbmcob2JqLmNvbXBv bmVudHMpXTt9LCJsaW5lU3RyaW5nTWVtYmVyIjpmdW5jdGlvbihub2RlLG9iail7 dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iaik7fSwiUG9seWdvbiI6ZnVuY3Rp b24obm9kZSxjb250YWluZXIpe3ZhciBvYmo9e291dGVyOm51bGwsaW5uZXI6W119 O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxvYmopO29iai5pbm5lci51bnNoaWZ0 KG9iai5vdXRlcik7aWYoIWNvbnRhaW5lci5jb21wb25lbnRzKXtjb250YWluZXIu Y29tcG9uZW50cz1bXTt9CmNvbnRhaW5lci5jb21wb25lbnRzLnB1c2gobmV3IE9w ZW5MYXllcnMuR2VvbWV0cnkuUG9seWdvbihvYmouaW5uZXIpKTt9LCJMaW5lYXJS aW5nIjpmdW5jdGlvbihub2RlLG9iail7dmFyIGNvbnRhaW5lcj17fTt0aGlzLnJl YWRDaGlsZE5vZGVzKG5vZGUsY29udGFpbmVyKTtvYmouY29tcG9uZW50cz1bbmV3 IE9wZW5MYXllcnMuR2VvbWV0cnkuTGluZWFyUmluZyhjb250YWluZXIucG9pbnRz KV07fSwiTXVsdGlQb2x5Z29uIjpmdW5jdGlvbihub2RlLGNvbnRhaW5lcil7dmFy IG9iaj17Y29tcG9uZW50czpbXX07dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9i aik7Y29udGFpbmVyLmNvbXBvbmVudHM9W25ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5 Lk11bHRpUG9seWdvbihvYmouY29tcG9uZW50cyldO30sInBvbHlnb25NZW1iZXIi OmZ1bmN0aW9uKG5vZGUsb2JqKXt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2Jq KTt9LCJHZW9tZXRyeUNvbGxlY3Rpb24iOmZ1bmN0aW9uKG5vZGUsY29udGFpbmVy KXt2YXIgb2JqPXtjb21wb25lbnRzOltdfTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5v ZGUsb2JqKTtjb250YWluZXIuY29tcG9uZW50cz1bbmV3IE9wZW5MYXllcnMuR2Vv bWV0cnkuQ29sbGVjdGlvbihvYmouY29tcG9uZW50cyldO30sImdlb21ldHJ5TWVt YmVyIjpmdW5jdGlvbihub2RlLG9iail7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2Rl LG9iaik7fX0sImZlYXR1cmUiOnsiKiI6ZnVuY3Rpb24obm9kZSxvYmope3ZhciBu YW1lO3ZhciBsb2NhbD1ub2RlLmxvY2FsTmFtZXx8bm9kZS5ub2RlTmFtZS5zcGxp dCgiOiIpLnBvcCgpO2lmKG9iai5mZWF0dXJlcyl7aWYoIXRoaXMuc2luZ2xlRmVh dHVyZVR5cGUmJihPcGVuTGF5ZXJzLlV0aWwuaW5kZXhPZih0aGlzLmZlYXR1cmVU eXBlLGxvY2FsKSE9PS0xKSl7bmFtZT0iX3R5cGVOYW1lIjt9ZWxzZSBpZihsb2Nh bD09PXRoaXMuZmVhdHVyZVR5cGUpe25hbWU9Il90eXBlTmFtZSI7fX1lbHNle2lm KG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg9PTB8fChub2RlLmNoaWxkTm9kZXMubGVu Z3RoPT0xJiZub2RlLmZpcnN0Q2hpbGQubm9kZVR5cGU9PTMpKXtpZih0aGlzLmV4 dHJhY3RBdHRyaWJ1dGVzKXtuYW1lPSJfYXR0cmlidXRlIjt9fWVsc2V7bmFtZT0i X2dlb21ldHJ5Ijt9fQppZihuYW1lKXt0aGlzLnJlYWRlcnMuZmVhdHVyZVtuYW1l XS5hcHBseSh0aGlzLFtub2RlLG9ial0pO319LCJfdHlwZU5hbWUiOmZ1bmN0aW9u KG5vZGUsb2JqKXt2YXIgY29udGFpbmVyPXtjb21wb25lbnRzOltdLGF0dHJpYnV0 ZXM6e319O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxjb250YWluZXIpO2lmKGNv bnRhaW5lci5uYW1lKXtjb250YWluZXIuYXR0cmlidXRlcy5uYW1lPWNvbnRhaW5l ci5uYW1lO30KdmFyIGZlYXR1cmU9bmV3IE9wZW5MYXllcnMuRmVhdHVyZS5WZWN0 b3IoY29udGFpbmVyLmNvbXBvbmVudHNbMF0sY29udGFpbmVyLmF0dHJpYnV0ZXMp O2lmKCF0aGlzLnNpbmdsZUZlYXR1cmVUeXBlKXtmZWF0dXJlLnR5cGU9bm9kZS5u b2RlTmFtZS5zcGxpdCgiOiIpLnBvcCgpO2ZlYXR1cmUubmFtZXNwYWNlPW5vZGUu bmFtZXNwYWNlVVJJO30KdmFyIGZpZD1ub2RlLmdldEF0dHJpYnV0ZSgiZmlkIil8 fHRoaXMuZ2V0QXR0cmlidXRlTlMobm9kZSx0aGlzLm5hbWVzcGFjZXNbImdtbCJd LCJpZCIpO2lmKGZpZCl7ZmVhdHVyZS5maWQ9ZmlkO30KaWYodGhpcy5pbnRlcm5h bFByb2plY3Rpb24mJnRoaXMuZXh0ZXJuYWxQcm9qZWN0aW9uJiZmZWF0dXJlLmdl b21ldHJ5KXtmZWF0dXJlLmdlb21ldHJ5LnRyYW5zZm9ybSh0aGlzLmV4dGVybmFs UHJvamVjdGlvbix0aGlzLmludGVybmFsUHJvamVjdGlvbik7fQppZihjb250YWlu ZXIuYm91bmRzKXtmZWF0dXJlLmJvdW5kcz1jb250YWluZXIuYm91bmRzO30Kb2Jq LmZlYXR1cmVzLnB1c2goZmVhdHVyZSk7fSwiX2dlb21ldHJ5IjpmdW5jdGlvbihu b2RlLG9iail7aWYoIXRoaXMuZ2VvbWV0cnlOYW1lKXt0aGlzLmdlb21ldHJ5TmFt ZT1ub2RlLm5vZGVOYW1lLnNwbGl0KCI6IikucG9wKCk7fQp0aGlzLnJlYWRDaGls ZE5vZGVzKG5vZGUsb2JqKTt9LCJfYXR0cmlidXRlIjpmdW5jdGlvbihub2RlLG9i ail7dmFyIGxvY2FsPW5vZGUubG9jYWxOYW1lfHxub2RlLm5vZGVOYW1lLnNwbGl0 KCI6IikucG9wKCk7dmFyIHZhbHVlPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTtv YmouYXR0cmlidXRlc1tsb2NhbF09dmFsdWU7fX0sIndmcyI6eyJGZWF0dXJlQ29s bGVjdGlvbiI6ZnVuY3Rpb24obm9kZSxvYmope3RoaXMucmVhZENoaWxkTm9kZXMo bm9kZSxvYmopO319fSx3cml0ZTpmdW5jdGlvbihmZWF0dXJlcyl7dmFyIG5hbWU7 aWYoT3BlbkxheWVycy5VdGlsLmlzQXJyYXkoZmVhdHVyZXMpKXtuYW1lPSJmZWF0 dXJlTWVtYmVycyI7fWVsc2V7bmFtZT0iZmVhdHVyZU1lbWJlciI7fQp2YXIgcm9v dD10aGlzLndyaXRlTm9kZSgiZ21sOiIrbmFtZSxmZWF0dXJlcyk7dGhpcy5zZXRB dHRyaWJ1dGVOUyhyb290LHRoaXMubmFtZXNwYWNlc1sieHNpIl0sInhzaTpzY2hl bWFMb2NhdGlvbiIsdGhpcy5zY2hlbWFMb2NhdGlvbik7cmV0dXJuIE9wZW5MYXll cnMuRm9ybWF0LlhNTC5wcm90b3R5cGUud3JpdGUuYXBwbHkodGhpcyxbcm9vdF0p O30sd3JpdGVyczp7ImdtbCI6eyJmZWF0dXJlTWVtYmVyIjpmdW5jdGlvbihmZWF0 dXJlKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImdtbDpmZWF0 dXJlTWVtYmVyIik7dGhpcy53cml0ZU5vZGUoImZlYXR1cmU6X3R5cGVOYW1lIixm ZWF0dXJlLG5vZGUpO3JldHVybiBub2RlO30sIk11bHRpUG9pbnQiOmZ1bmN0aW9u KGdlb21ldHJ5KXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImdt bDpNdWx0aVBvaW50Iik7dmFyIGNvbXBvbmVudHM9Z2VvbWV0cnkuY29tcG9uZW50 c3x8W2dlb21ldHJ5XTtmb3IodmFyIGk9MCxpaT1jb21wb25lbnRzLmxlbmd0aDtp PGlpOysraSl7dGhpcy53cml0ZU5vZGUoInBvaW50TWVtYmVyIixjb21wb25lbnRz W2ldLG5vZGUpO30KcmV0dXJuIG5vZGU7fSwicG9pbnRNZW1iZXIiOmZ1bmN0aW9u KGdlb21ldHJ5KXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImdt bDpwb2ludE1lbWJlciIpO3RoaXMud3JpdGVOb2RlKCJQb2ludCIsZ2VvbWV0cnks bm9kZSk7cmV0dXJuIG5vZGU7fSwiTXVsdGlMaW5lU3RyaW5nIjpmdW5jdGlvbihn ZW9tZXRyeSl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJnbWw6 TXVsdGlMaW5lU3RyaW5nIik7dmFyIGNvbXBvbmVudHM9Z2VvbWV0cnkuY29tcG9u ZW50c3x8W2dlb21ldHJ5XTtmb3IodmFyIGk9MCxpaT1jb21wb25lbnRzLmxlbmd0 aDtpPGlpOysraSl7dGhpcy53cml0ZU5vZGUoImxpbmVTdHJpbmdNZW1iZXIiLGNv bXBvbmVudHNbaV0sbm9kZSk7fQpyZXR1cm4gbm9kZTt9LCJsaW5lU3RyaW5nTWVt YmVyIjpmdW5jdGlvbihnZW9tZXRyeSl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVt ZW50TlNQbHVzKCJnbWw6bGluZVN0cmluZ01lbWJlciIpO3RoaXMud3JpdGVOb2Rl KCJMaW5lU3RyaW5nIixnZW9tZXRyeSxub2RlKTtyZXR1cm4gbm9kZTt9LCJNdWx0 aVBvbHlnb24iOmZ1bmN0aW9uKGdlb21ldHJ5KXt2YXIgbm9kZT10aGlzLmNyZWF0 ZUVsZW1lbnROU1BsdXMoImdtbDpNdWx0aVBvbHlnb24iKTt2YXIgY29tcG9uZW50 cz1nZW9tZXRyeS5jb21wb25lbnRzfHxbZ2VvbWV0cnldO2Zvcih2YXIgaT0wLGlp PWNvbXBvbmVudHMubGVuZ3RoO2k8aWk7KytpKXt0aGlzLndyaXRlTm9kZSgicG9s eWdvbk1lbWJlciIsY29tcG9uZW50c1tpXSxub2RlKTt9CnJldHVybiBub2RlO30s InBvbHlnb25NZW1iZXIiOmZ1bmN0aW9uKGdlb21ldHJ5KXt2YXIgbm9kZT10aGlz LmNyZWF0ZUVsZW1lbnROU1BsdXMoImdtbDpwb2x5Z29uTWVtYmVyIik7dGhpcy53 cml0ZU5vZGUoIlBvbHlnb24iLGdlb21ldHJ5LG5vZGUpO3JldHVybiBub2RlO30s Ikdlb21ldHJ5Q29sbGVjdGlvbiI6ZnVuY3Rpb24oZ2VvbWV0cnkpe3ZhciBub2Rl PXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygiZ21sOkdlb21ldHJ5Q29sbGVjdGlv biIpO2Zvcih2YXIgaT0wLGxlbj1nZW9tZXRyeS5jb21wb25lbnRzLmxlbmd0aDtp PGxlbjsrK2kpe3RoaXMud3JpdGVOb2RlKCJnZW9tZXRyeU1lbWJlciIsZ2VvbWV0 cnkuY29tcG9uZW50c1tpXSxub2RlKTt9CnJldHVybiBub2RlO30sImdlb21ldHJ5 TWVtYmVyIjpmdW5jdGlvbihnZW9tZXRyeSl7dmFyIG5vZGU9dGhpcy5jcmVhdGVF bGVtZW50TlNQbHVzKCJnbWw6Z2VvbWV0cnlNZW1iZXIiKTt2YXIgY2hpbGQ9dGhp cy53cml0ZU5vZGUoImZlYXR1cmU6X2dlb21ldHJ5IixnZW9tZXRyeSk7bm9kZS5h cHBlbmRDaGlsZChjaGlsZC5maXJzdENoaWxkKTtyZXR1cm4gbm9kZTt9fSwiZmVh dHVyZSI6eyJfdHlwZU5hbWUiOmZ1bmN0aW9uKGZlYXR1cmUpe3ZhciBub2RlPXRo aXMuY3JlYXRlRWxlbWVudE5TUGx1cygiZmVhdHVyZToiK3RoaXMuZmVhdHVyZVR5 cGUse2F0dHJpYnV0ZXM6e2ZpZDpmZWF0dXJlLmZpZH19KTtpZihmZWF0dXJlLmdl b21ldHJ5KXt0aGlzLndyaXRlTm9kZSgiZmVhdHVyZTpfZ2VvbWV0cnkiLGZlYXR1 cmUuZ2VvbWV0cnksbm9kZSk7fQpmb3IodmFyIG5hbWUgaW4gZmVhdHVyZS5hdHRy aWJ1dGVzKXt2YXIgdmFsdWU9ZmVhdHVyZS5hdHRyaWJ1dGVzW25hbWVdO2lmKHZh bHVlIT1udWxsKXt0aGlzLndyaXRlTm9kZSgiZmVhdHVyZTpfYXR0cmlidXRlIix7 bmFtZTpuYW1lLHZhbHVlOnZhbHVlfSxub2RlKTt9fQpyZXR1cm4gbm9kZTt9LCJf Z2VvbWV0cnkiOmZ1bmN0aW9uKGdlb21ldHJ5KXtpZih0aGlzLmV4dGVybmFsUHJv amVjdGlvbiYmdGhpcy5pbnRlcm5hbFByb2plY3Rpb24pe2dlb21ldHJ5PWdlb21l dHJ5LmNsb25lKCkudHJhbnNmb3JtKHRoaXMuaW50ZXJuYWxQcm9qZWN0aW9uLHRo aXMuZXh0ZXJuYWxQcm9qZWN0aW9uKTt9CnZhciBub2RlPXRoaXMuY3JlYXRlRWxl bWVudE5TUGx1cygiZmVhdHVyZToiK3RoaXMuZ2VvbWV0cnlOYW1lKTt2YXIgdHlw ZT10aGlzLmdlb21ldHJ5VHlwZXNbZ2VvbWV0cnkuQ0xBU1NfTkFNRV07dmFyIGNo aWxkPXRoaXMud3JpdGVOb2RlKCJnbWw6Iit0eXBlLGdlb21ldHJ5LG5vZGUpO2lm KHRoaXMuc3JzTmFtZSl7Y2hpbGQuc2V0QXR0cmlidXRlKCJzcnNOYW1lIix0aGlz LnNyc05hbWUpO30KcmV0dXJuIG5vZGU7fSwiX2F0dHJpYnV0ZSI6ZnVuY3Rpb24o b2JqKXtyZXR1cm4gdGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJmZWF0dXJlOiIr b2JqLm5hbWUse3ZhbHVlOm9iai52YWx1ZX0pO319LCJ3ZnMiOnsiRmVhdHVyZUNv bGxlY3Rpb24iOmZ1bmN0aW9uKGZlYXR1cmVzKXt2YXIgbm9kZT10aGlzLmNyZWF0 ZUVsZW1lbnROU1BsdXMoIndmczpGZWF0dXJlQ29sbGVjdGlvbiIpO2Zvcih2YXIg aT0wLGxlbj1mZWF0dXJlcy5sZW5ndGg7aTxsZW47KytpKXt0aGlzLndyaXRlTm9k ZSgiZ21sOmZlYXR1cmVNZW1iZXIiLGZlYXR1cmVzW2ldLG5vZGUpO30KcmV0dXJu IG5vZGU7fX19LHNldEdlb21ldHJ5VHlwZXM6ZnVuY3Rpb24oKXt0aGlzLmdlb21l dHJ5VHlwZXM9eyJPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50IjoiUG9pbnQiLCJP cGVuTGF5ZXJzLkdlb21ldHJ5Lk11bHRpUG9pbnQiOiJNdWx0aVBvaW50IiwiT3Bl bkxheWVycy5HZW9tZXRyeS5MaW5lU3RyaW5nIjoiTGluZVN0cmluZyIsIk9wZW5M YXllcnMuR2VvbWV0cnkuTXVsdGlMaW5lU3RyaW5nIjoiTXVsdGlMaW5lU3RyaW5n IiwiT3BlbkxheWVycy5HZW9tZXRyeS5Qb2x5Z29uIjoiUG9seWdvbiIsIk9wZW5M YXllcnMuR2VvbWV0cnkuTXVsdGlQb2x5Z29uIjoiTXVsdGlQb2x5Z29uIiwiT3Bl bkxheWVycy5HZW9tZXRyeS5Db2xsZWN0aW9uIjoiR2VvbWV0cnlDb2xsZWN0aW9u In07fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5HTUwuQmFzZSJ9KTtP cGVuTGF5ZXJzLkZvcm1hdC5HTUwudjM9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5 ZXJzLkZvcm1hdC5HTUwuQmFzZSx7c2NoZW1hTG9jYXRpb246Imh0dHA6Ly93d3cu b3Blbmdpcy5uZXQvZ21sIGh0dHA6Ly9zY2hlbWFzLm9wZW5naXMubmV0L2dtbC8z LjEuMS9wcm9maWxlcy9nbWxzZlByb2ZpbGUvMS4wLjAvZ21sc2YueHNkIixjdXJ2 ZTpmYWxzZSxtdWx0aUN1cnZlOnRydWUsc3VyZmFjZTpmYWxzZSxtdWx0aVN1cmZh Y2U6dHJ1ZSxpbml0aWFsaXplOmZ1bmN0aW9uKG9wdGlvbnMpe09wZW5MYXllcnMu Rm9ybWF0LkdNTC5CYXNlLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMs W29wdGlvbnNdKTt9LHJlYWRlcnM6eyJnbWwiOk9wZW5MYXllcnMuVXRpbC5hcHBs eURlZmF1bHRzKHsiZmVhdHVyZU1lbWJlcnMiOmZ1bmN0aW9uKG5vZGUsb2JqKXt0 aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqKTt9LCJDdXJ2ZSI6ZnVuY3Rpb24o bm9kZSxjb250YWluZXIpe3ZhciBvYmo9e3BvaW50czpbXX07dGhpcy5yZWFkQ2hp bGROb2Rlcyhub2RlLG9iaik7aWYoIWNvbnRhaW5lci5jb21wb25lbnRzKXtjb250 YWluZXIuY29tcG9uZW50cz1bXTt9CmNvbnRhaW5lci5jb21wb25lbnRzLnB1c2go bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuTGluZVN0cmluZyhvYmoucG9pbnRzKSk7 fSwic2VnbWVudHMiOmZ1bmN0aW9uKG5vZGUsb2JqKXt0aGlzLnJlYWRDaGlsZE5v ZGVzKG5vZGUsb2JqKTt9LCJMaW5lU3RyaW5nU2VnbWVudCI6ZnVuY3Rpb24obm9k ZSxjb250YWluZXIpe3ZhciBvYmo9e307dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2Rl LG9iaik7aWYob2JqLnBvaW50cyl7QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHko Y29udGFpbmVyLnBvaW50cyxvYmoucG9pbnRzKTt9fSwicG9zIjpmdW5jdGlvbihu b2RlLG9iail7dmFyIHN0cj10aGlzLmdldENoaWxkVmFsdWUobm9kZSkucmVwbGFj ZSh0aGlzLnJlZ0V4ZXMudHJpbVNwYWNlLCIiKTt2YXIgY29vcmRzPXN0ci5zcGxp dCh0aGlzLnJlZ0V4ZXMuc3BsaXRTcGFjZSk7dmFyIHBvaW50O2lmKHRoaXMueHkp e3BvaW50PW5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KGNvb3Jkc1swXSxj b29yZHNbMV0sY29vcmRzWzJdKTt9ZWxzZXtwb2ludD1uZXcgT3BlbkxheWVycy5H ZW9tZXRyeS5Qb2ludChjb29yZHNbMV0sY29vcmRzWzBdLGNvb3Jkc1syXSk7fQpv YmoucG9pbnRzPVtwb2ludF07fSwicG9zTGlzdCI6ZnVuY3Rpb24obm9kZSxvYmop e3ZhciBzdHI9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpLnJlcGxhY2UodGhpcy5y ZWdFeGVzLnRyaW1TcGFjZSwiIik7dmFyIGNvb3Jkcz1zdHIuc3BsaXQodGhpcy5y ZWdFeGVzLnNwbGl0U3BhY2UpO3ZhciBkaW09cGFyc2VJbnQobm9kZS5nZXRBdHRy aWJ1dGUoImRpbWVuc2lvbiIpKXx8Mjt2YXIgaix4LHksejt2YXIgbnVtUG9pbnRz PWNvb3Jkcy5sZW5ndGgvZGltO3ZhciBwb2ludHM9bmV3IEFycmF5KG51bVBvaW50 cyk7Zm9yKHZhciBpPTAsbGVuPWNvb3Jkcy5sZW5ndGg7aTxsZW47aSs9ZGltKXt4 PWNvb3Jkc1tpXTt5PWNvb3Jkc1tpKzFdO3o9KGRpbT09Mik/dW5kZWZpbmVkOmNv b3Jkc1tpKzJdO2lmKHRoaXMueHkpe3BvaW50c1tpL2RpbV09bmV3IE9wZW5MYXll cnMuR2VvbWV0cnkuUG9pbnQoeCx5LHopO31lbHNle3BvaW50c1tpL2RpbV09bmV3 IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQoeSx4LHopO319Cm9iai5wb2ludHM9 cG9pbnRzO30sIlN1cmZhY2UiOmZ1bmN0aW9uKG5vZGUsb2JqKXt0aGlzLnJlYWRD aGlsZE5vZGVzKG5vZGUsb2JqKTt9LCJwYXRjaGVzIjpmdW5jdGlvbihub2RlLG9i ail7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iaik7fSwiUG9seWdvblBhdGNo IjpmdW5jdGlvbihub2RlLG9iail7dGhpcy5yZWFkZXJzLmdtbC5Qb2x5Z29uLmFw cGx5KHRoaXMsW25vZGUsb2JqXSk7fSwiZXh0ZXJpb3IiOmZ1bmN0aW9uKG5vZGUs Y29udGFpbmVyKXt2YXIgb2JqPXt9O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxv YmopO2NvbnRhaW5lci5vdXRlcj1vYmouY29tcG9uZW50c1swXTt9LCJpbnRlcmlv ciI6ZnVuY3Rpb24obm9kZSxjb250YWluZXIpe3ZhciBvYmo9e307dGhpcy5yZWFk Q2hpbGROb2Rlcyhub2RlLG9iaik7Y29udGFpbmVyLmlubmVyLnB1c2gob2JqLmNv bXBvbmVudHNbMF0pO30sIk11bHRpQ3VydmUiOmZ1bmN0aW9uKG5vZGUsY29udGFp bmVyKXt2YXIgb2JqPXtjb21wb25lbnRzOltdfTt0aGlzLnJlYWRDaGlsZE5vZGVz KG5vZGUsb2JqKTtpZihvYmouY29tcG9uZW50cy5sZW5ndGg+MCl7Y29udGFpbmVy LmNvbXBvbmVudHM9W25ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5Lk11bHRpTGluZVN0 cmluZyhvYmouY29tcG9uZW50cyldO319LCJjdXJ2ZU1lbWJlciI6ZnVuY3Rpb24o bm9kZSxvYmope3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxvYmopO30sIk11bHRp U3VyZmFjZSI6ZnVuY3Rpb24obm9kZSxjb250YWluZXIpe3ZhciBvYmo9e2NvbXBv bmVudHM6W119O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxvYmopO2lmKG9iai5j b21wb25lbnRzLmxlbmd0aD4wKXtjb250YWluZXIuY29tcG9uZW50cz1bbmV3IE9w ZW5MYXllcnMuR2VvbWV0cnkuTXVsdGlQb2x5Z29uKG9iai5jb21wb25lbnRzKV07 fX0sInN1cmZhY2VNZW1iZXIiOmZ1bmN0aW9uKG5vZGUsb2JqKXt0aGlzLnJlYWRD aGlsZE5vZGVzKG5vZGUsb2JqKTt9LCJzdXJmYWNlTWVtYmVycyI6ZnVuY3Rpb24o bm9kZSxvYmope3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxvYmopO30sInBvaW50 TWVtYmVycyI6ZnVuY3Rpb24obm9kZSxvYmope3RoaXMucmVhZENoaWxkTm9kZXMo bm9kZSxvYmopO30sImxpbmVTdHJpbmdNZW1iZXJzIjpmdW5jdGlvbihub2RlLG9i ail7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iaik7fSwicG9seWdvbk1lbWJl cnMiOmZ1bmN0aW9uKG5vZGUsb2JqKXt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUs b2JqKTt9LCJnZW9tZXRyeU1lbWJlcnMiOmZ1bmN0aW9uKG5vZGUsb2JqKXt0aGlz LnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqKTt9LCJFbnZlbG9wZSI6ZnVuY3Rpb24o bm9kZSxjb250YWluZXIpe3ZhciBvYmo9e3BvaW50czpuZXcgQXJyYXkoMil9O3Ro aXMucmVhZENoaWxkTm9kZXMobm9kZSxvYmopO2lmKCFjb250YWluZXIuY29tcG9u ZW50cyl7Y29udGFpbmVyLmNvbXBvbmVudHM9W107fQp2YXIgbWluPW9iai5wb2lu dHNbMF07dmFyIG1heD1vYmoucG9pbnRzWzFdO2NvbnRhaW5lci5jb21wb25lbnRz LnB1c2gobmV3IE9wZW5MYXllcnMuQm91bmRzKG1pbi54LG1pbi55LG1heC54LG1h eC55KSk7fSwibG93ZXJDb3JuZXIiOmZ1bmN0aW9uKG5vZGUsY29udGFpbmVyKXt2 YXIgb2JqPXt9O3RoaXMucmVhZGVycy5nbWwucG9zLmFwcGx5KHRoaXMsW25vZGUs b2JqXSk7Y29udGFpbmVyLnBvaW50c1swXT1vYmoucG9pbnRzWzBdO30sInVwcGVy Q29ybmVyIjpmdW5jdGlvbihub2RlLGNvbnRhaW5lcil7dmFyIG9iaj17fTt0aGlz LnJlYWRlcnMuZ21sLnBvcy5hcHBseSh0aGlzLFtub2RlLG9ial0pO2NvbnRhaW5l ci5wb2ludHNbMV09b2JqLnBvaW50c1swXTt9fSxPcGVuTGF5ZXJzLkZvcm1hdC5H TUwuQmFzZS5wcm90b3R5cGUucmVhZGVyc1siZ21sIl0pLCJmZWF0dXJlIjpPcGVu TGF5ZXJzLkZvcm1hdC5HTUwuQmFzZS5wcm90b3R5cGUucmVhZGVyc1siZmVhdHVy ZSJdLCJ3ZnMiOk9wZW5MYXllcnMuRm9ybWF0LkdNTC5CYXNlLnByb3RvdHlwZS5y ZWFkZXJzWyJ3ZnMiXX0sd3JpdGU6ZnVuY3Rpb24oZmVhdHVyZXMpe3ZhciBuYW1l O2lmKE9wZW5MYXllcnMuVXRpbC5pc0FycmF5KGZlYXR1cmVzKSl7bmFtZT0iZmVh dHVyZU1lbWJlcnMiO31lbHNle25hbWU9ImZlYXR1cmVNZW1iZXIiO30KdmFyIHJv b3Q9dGhpcy53cml0ZU5vZGUoImdtbDoiK25hbWUsZmVhdHVyZXMpO3RoaXMuc2V0 QXR0cmlidXRlTlMocm9vdCx0aGlzLm5hbWVzcGFjZXNbInhzaSJdLCJ4c2k6c2No ZW1hTG9jYXRpb24iLHRoaXMuc2NoZW1hTG9jYXRpb24pO3JldHVybiBPcGVuTGF5 ZXJzLkZvcm1hdC5YTUwucHJvdG90eXBlLndyaXRlLmFwcGx5KHRoaXMsW3Jvb3Rd KTt9LHdyaXRlcnM6eyJnbWwiOk9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRz KHsiZmVhdHVyZU1lbWJlcnMiOmZ1bmN0aW9uKGZlYXR1cmVzKXt2YXIgbm9kZT10 aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImdtbDpmZWF0dXJlTWVtYmVycyIpO2Zv cih2YXIgaT0wLGxlbj1mZWF0dXJlcy5sZW5ndGg7aTxsZW47KytpKXt0aGlzLndy aXRlTm9kZSgiZmVhdHVyZTpfdHlwZU5hbWUiLGZlYXR1cmVzW2ldLG5vZGUpO30K cmV0dXJuIG5vZGU7fSwiUG9pbnQiOmZ1bmN0aW9uKGdlb21ldHJ5KXt2YXIgbm9k ZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImdtbDpQb2ludCIpO3RoaXMud3Jp dGVOb2RlKCJwb3MiLGdlb21ldHJ5LG5vZGUpO3JldHVybiBub2RlO30sInBvcyI6 ZnVuY3Rpb24ocG9pbnQpe3ZhciBwb3M9KHRoaXMueHkpPyhwb2ludC54KyIgIitw b2ludC55KToocG9pbnQueSsiICIrcG9pbnQueCk7cmV0dXJuIHRoaXMuY3JlYXRl RWxlbWVudE5TUGx1cygiZ21sOnBvcyIse3ZhbHVlOnBvc30pO30sIkxpbmVTdHJp bmciOmZ1bmN0aW9uKGdlb21ldHJ5KXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1l bnROU1BsdXMoImdtbDpMaW5lU3RyaW5nIik7dGhpcy53cml0ZU5vZGUoInBvc0xp c3QiLGdlb21ldHJ5LmNvbXBvbmVudHMsbm9kZSk7cmV0dXJuIG5vZGU7fSwiQ3Vy dmUiOmZ1bmN0aW9uKGdlb21ldHJ5KXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1l bnROU1BsdXMoImdtbDpDdXJ2ZSIpO3RoaXMud3JpdGVOb2RlKCJzZWdtZW50cyIs Z2VvbWV0cnksbm9kZSk7cmV0dXJuIG5vZGU7fSwic2VnbWVudHMiOmZ1bmN0aW9u KGdlb21ldHJ5KXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImdt bDpzZWdtZW50cyIpO3RoaXMud3JpdGVOb2RlKCJMaW5lU3RyaW5nU2VnbWVudCIs Z2VvbWV0cnksbm9kZSk7cmV0dXJuIG5vZGU7fSwiTGluZVN0cmluZ1NlZ21lbnQi OmZ1bmN0aW9uKGdlb21ldHJ5KXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnRO U1BsdXMoImdtbDpMaW5lU3RyaW5nU2VnbWVudCIpO3RoaXMud3JpdGVOb2RlKCJw b3NMaXN0IixnZW9tZXRyeS5jb21wb25lbnRzLG5vZGUpO3JldHVybiBub2RlO30s InBvc0xpc3QiOmZ1bmN0aW9uKHBvaW50cyl7dmFyIGxlbj1wb2ludHMubGVuZ3Ro O3ZhciBwYXJ0cz1uZXcgQXJyYXkobGVuKTt2YXIgcG9pbnQ7Zm9yKHZhciBpPTA7 aTxsZW47KytpKXtwb2ludD1wb2ludHNbaV07aWYodGhpcy54eSl7cGFydHNbaV09 cG9pbnQueCsiICIrcG9pbnQueTt9ZWxzZXtwYXJ0c1tpXT1wb2ludC55KyIgIitw b2ludC54O319CnJldHVybiB0aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImdtbDpw b3NMaXN0Iix7dmFsdWU6cGFydHMuam9pbigiICIpfSk7fSwiU3VyZmFjZSI6ZnVu Y3Rpb24oZ2VvbWV0cnkpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1 cygiZ21sOlN1cmZhY2UiKTt0aGlzLndyaXRlTm9kZSgicGF0Y2hlcyIsZ2VvbWV0 cnksbm9kZSk7cmV0dXJuIG5vZGU7fSwicGF0Y2hlcyI6ZnVuY3Rpb24oZ2VvbWV0 cnkpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygiZ21sOnBhdGNo ZXMiKTt0aGlzLndyaXRlTm9kZSgiUG9seWdvblBhdGNoIixnZW9tZXRyeSxub2Rl KTtyZXR1cm4gbm9kZTt9LCJQb2x5Z29uUGF0Y2giOmZ1bmN0aW9uKGdlb21ldHJ5 KXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImdtbDpQb2x5Z29u UGF0Y2giLHthdHRyaWJ1dGVzOntpbnRlcnBvbGF0aW9uOiJwbGFuYXIifX0pO3Ro aXMud3JpdGVOb2RlKCJleHRlcmlvciIsZ2VvbWV0cnkuY29tcG9uZW50c1swXSxu b2RlKTtmb3IodmFyIGk9MSxsZW49Z2VvbWV0cnkuY29tcG9uZW50cy5sZW5ndGg7 aTxsZW47KytpKXt0aGlzLndyaXRlTm9kZSgiaW50ZXJpb3IiLGdlb21ldHJ5LmNv bXBvbmVudHNbaV0sbm9kZSk7fQpyZXR1cm4gbm9kZTt9LCJQb2x5Z29uIjpmdW5j dGlvbihnZW9tZXRyeSl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVz KCJnbWw6UG9seWdvbiIpO3RoaXMud3JpdGVOb2RlKCJleHRlcmlvciIsZ2VvbWV0 cnkuY29tcG9uZW50c1swXSxub2RlKTtmb3IodmFyIGk9MSxsZW49Z2VvbWV0cnku Y29tcG9uZW50cy5sZW5ndGg7aTxsZW47KytpKXt0aGlzLndyaXRlTm9kZSgiaW50 ZXJpb3IiLGdlb21ldHJ5LmNvbXBvbmVudHNbaV0sbm9kZSk7fQpyZXR1cm4gbm9k ZTt9LCJleHRlcmlvciI6ZnVuY3Rpb24ocmluZyl7dmFyIG5vZGU9dGhpcy5jcmVh dGVFbGVtZW50TlNQbHVzKCJnbWw6ZXh0ZXJpb3IiKTt0aGlzLndyaXRlTm9kZSgi TGluZWFyUmluZyIscmluZyxub2RlKTtyZXR1cm4gbm9kZTt9LCJpbnRlcmlvciI6 ZnVuY3Rpb24ocmluZyl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVz KCJnbWw6aW50ZXJpb3IiKTt0aGlzLndyaXRlTm9kZSgiTGluZWFyUmluZyIscmlu Zyxub2RlKTtyZXR1cm4gbm9kZTt9LCJMaW5lYXJSaW5nIjpmdW5jdGlvbihyaW5n KXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImdtbDpMaW5lYXJS aW5nIik7dGhpcy53cml0ZU5vZGUoInBvc0xpc3QiLHJpbmcuY29tcG9uZW50cyxu b2RlKTtyZXR1cm4gbm9kZTt9LCJNdWx0aUN1cnZlIjpmdW5jdGlvbihnZW9tZXRy eSl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJnbWw6TXVsdGlD dXJ2ZSIpO3ZhciBjb21wb25lbnRzPWdlb21ldHJ5LmNvbXBvbmVudHN8fFtnZW9t ZXRyeV07Zm9yKHZhciBpPTAsbGVuPWNvbXBvbmVudHMubGVuZ3RoO2k8bGVuOysr aSl7dGhpcy53cml0ZU5vZGUoImN1cnZlTWVtYmVyIixjb21wb25lbnRzW2ldLG5v ZGUpO30KcmV0dXJuIG5vZGU7fSwiY3VydmVNZW1iZXIiOmZ1bmN0aW9uKGdlb21l dHJ5KXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImdtbDpjdXJ2 ZU1lbWJlciIpO2lmKHRoaXMuY3VydmUpe3RoaXMud3JpdGVOb2RlKCJDdXJ2ZSIs Z2VvbWV0cnksbm9kZSk7fWVsc2V7dGhpcy53cml0ZU5vZGUoIkxpbmVTdHJpbmci LGdlb21ldHJ5LG5vZGUpO30KcmV0dXJuIG5vZGU7fSwiTXVsdGlTdXJmYWNlIjpm dW5jdGlvbihnZW9tZXRyeSl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQ bHVzKCJnbWw6TXVsdGlTdXJmYWNlIik7dmFyIGNvbXBvbmVudHM9Z2VvbWV0cnku Y29tcG9uZW50c3x8W2dlb21ldHJ5XTtmb3IodmFyIGk9MCxsZW49Y29tcG9uZW50 cy5sZW5ndGg7aTxsZW47KytpKXt0aGlzLndyaXRlTm9kZSgic3VyZmFjZU1lbWJl ciIsY29tcG9uZW50c1tpXSxub2RlKTt9CnJldHVybiBub2RlO30sInN1cmZhY2VN ZW1iZXIiOmZ1bmN0aW9uKHBvbHlnb24pe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxl bWVudE5TUGx1cygiZ21sOnN1cmZhY2VNZW1iZXIiKTtpZih0aGlzLnN1cmZhY2Up e3RoaXMud3JpdGVOb2RlKCJTdXJmYWNlIixwb2x5Z29uLG5vZGUpO31lbHNle3Ro aXMud3JpdGVOb2RlKCJQb2x5Z29uIixwb2x5Z29uLG5vZGUpO30KcmV0dXJuIG5v ZGU7fSwiRW52ZWxvcGUiOmZ1bmN0aW9uKGJvdW5kcyl7dmFyIG5vZGU9dGhpcy5j cmVhdGVFbGVtZW50TlNQbHVzKCJnbWw6RW52ZWxvcGUiKTt0aGlzLndyaXRlTm9k ZSgibG93ZXJDb3JuZXIiLGJvdW5kcyxub2RlKTt0aGlzLndyaXRlTm9kZSgidXBw ZXJDb3JuZXIiLGJvdW5kcyxub2RlKTtpZih0aGlzLnNyc05hbWUpe25vZGUuc2V0 QXR0cmlidXRlKCJzcnNOYW1lIix0aGlzLnNyc05hbWUpO30KcmV0dXJuIG5vZGU7 fSwibG93ZXJDb3JuZXIiOmZ1bmN0aW9uKGJvdW5kcyl7dmFyIHBvcz0odGhpcy54 eSk/KGJvdW5kcy5sZWZ0KyIgIitib3VuZHMuYm90dG9tKTooYm91bmRzLmJvdHRv bSsiICIrYm91bmRzLmxlZnQpO3JldHVybiB0aGlzLmNyZWF0ZUVsZW1lbnROU1Bs dXMoImdtbDpsb3dlckNvcm5lciIse3ZhbHVlOnBvc30pO30sInVwcGVyQ29ybmVy IjpmdW5jdGlvbihib3VuZHMpe3ZhciBwb3M9KHRoaXMueHkpPyhib3VuZHMucmln aHQrIiAiK2JvdW5kcy50b3ApOihib3VuZHMudG9wKyIgIitib3VuZHMucmlnaHQp O3JldHVybiB0aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImdtbDp1cHBlckNvcm5l ciIse3ZhbHVlOnBvc30pO319LE9wZW5MYXllcnMuRm9ybWF0LkdNTC5CYXNlLnBy b3RvdHlwZS53cml0ZXJzWyJnbWwiXSksImZlYXR1cmUiOk9wZW5MYXllcnMuRm9y bWF0LkdNTC5CYXNlLnByb3RvdHlwZS53cml0ZXJzWyJmZWF0dXJlIl0sIndmcyI6 T3BlbkxheWVycy5Gb3JtYXQuR01MLkJhc2UucHJvdG90eXBlLndyaXRlcnNbIndm cyJdfSxzZXRHZW9tZXRyeVR5cGVzOmZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeVR5 cGVzPXsiT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCI6IlBvaW50IiwiT3Blbkxh eWVycy5HZW9tZXRyeS5NdWx0aVBvaW50IjoiTXVsdGlQb2ludCIsIk9wZW5MYXll cnMuR2VvbWV0cnkuTGluZVN0cmluZyI6KHRoaXMuY3VydmU9PT10cnVlKT8iQ3Vy dmUiOiJMaW5lU3RyaW5nIiwiT3BlbkxheWVycy5HZW9tZXRyeS5NdWx0aUxpbmVT dHJpbmciOih0aGlzLm11bHRpQ3VydmU9PT1mYWxzZSk/Ik11bHRpTGluZVN0cmlu ZyI6Ik11bHRpQ3VydmUiLCJPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvbHlnb24iOih0 aGlzLnN1cmZhY2U9PT10cnVlKT8iU3VyZmFjZSI6IlBvbHlnb24iLCJPcGVuTGF5 ZXJzLkdlb21ldHJ5Lk11bHRpUG9seWdvbiI6KHRoaXMubXVsdGlTdXJmYWNlPT09 ZmFsc2UpPyJNdWx0aVBvbHlnb24iOiJNdWx0aVN1cmZhY2UiLCJPcGVuTGF5ZXJz Lkdlb21ldHJ5LkNvbGxlY3Rpb24iOiJHZW9tZXRyeUNvbGxlY3Rpb24ifTt9LENM QVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0LkdNTC52MyJ9KTtPcGVuTGF5ZXJz LkZvcm1hdC5GaWx0ZXIudjFfMV8wPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVy cy5Gb3JtYXQuR01MLnYzLE9wZW5MYXllcnMuRm9ybWF0LkZpbHRlci52MSx7VkVS U0lPTjoiMS4xLjAiLHNjaGVtYUxvY2F0aW9uOiJodHRwOi8vd3d3Lm9wZW5naXMu bmV0L29nYy9maWx0ZXIvMS4xLjAvZmlsdGVyLnhzZCIsaW5pdGlhbGl6ZTpmdW5j dGlvbihvcHRpb25zKXtPcGVuTGF5ZXJzLkZvcm1hdC5HTUwudjMucHJvdG90eXBl LmluaXRpYWxpemUuYXBwbHkodGhpcyxbb3B0aW9uc10pO30scmVhZGVyczp7Im9n YyI6T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMoeyJQcm9wZXJ0eUlzRXF1 YWxUbyI6ZnVuY3Rpb24obm9kZSxvYmope3ZhciBtYXRjaENhc2U9bm9kZS5nZXRB dHRyaWJ1dGUoIm1hdGNoQ2FzZSIpO3ZhciBmaWx0ZXI9bmV3IE9wZW5MYXllcnMu RmlsdGVyLkNvbXBhcmlzb24oe3R5cGU6T3BlbkxheWVycy5GaWx0ZXIuQ29tcGFy aXNvbi5FUVVBTF9UTyxtYXRjaENhc2U6IShtYXRjaENhc2U9PT0iZmFsc2UifHxt YXRjaENhc2U9PT0iMCIpfSk7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLGZpbHRl cik7b2JqLmZpbHRlcnMucHVzaChmaWx0ZXIpO30sIlByb3BlcnR5SXNOb3RFcXVh bFRvIjpmdW5jdGlvbihub2RlLG9iail7dmFyIG1hdGNoQ2FzZT1ub2RlLmdldEF0 dHJpYnV0ZSgibWF0Y2hDYXNlIik7dmFyIGZpbHRlcj1uZXcgT3BlbkxheWVycy5G aWx0ZXIuQ29tcGFyaXNvbih7dHlwZTpPcGVuTGF5ZXJzLkZpbHRlci5Db21wYXJp c29uLk5PVF9FUVVBTF9UTyxtYXRjaENhc2U6IShtYXRjaENhc2U9PT0iZmFsc2Ui fHxtYXRjaENhc2U9PT0iMCIpfSk7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLGZp bHRlcik7b2JqLmZpbHRlcnMucHVzaChmaWx0ZXIpO30sIlByb3BlcnR5SXNMaWtl IjpmdW5jdGlvbihub2RlLG9iail7dmFyIGZpbHRlcj1uZXcgT3BlbkxheWVycy5G aWx0ZXIuQ29tcGFyaXNvbih7dHlwZTpPcGVuTGF5ZXJzLkZpbHRlci5Db21wYXJp c29uLkxJS0V9KTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsZmlsdGVyKTt2YXIg d2lsZENhcmQ9bm9kZS5nZXRBdHRyaWJ1dGUoIndpbGRDYXJkIik7dmFyIHNpbmds ZUNoYXI9bm9kZS5nZXRBdHRyaWJ1dGUoInNpbmdsZUNoYXIiKTt2YXIgZXNjPW5v ZGUuZ2V0QXR0cmlidXRlKCJlc2NhcGVDaGFyIik7ZmlsdGVyLnZhbHVlMnJlZ2V4 KHdpbGRDYXJkLHNpbmdsZUNoYXIsZXNjKTtvYmouZmlsdGVycy5wdXNoKGZpbHRl cik7fX0sT3BlbkxheWVycy5Gb3JtYXQuRmlsdGVyLnYxLnByb3RvdHlwZS5yZWFk ZXJzWyJvZ2MiXSksImdtbCI6T3BlbkxheWVycy5Gb3JtYXQuR01MLnYzLnByb3Rv dHlwZS5yZWFkZXJzWyJnbWwiXSwiZmVhdHVyZSI6T3BlbkxheWVycy5Gb3JtYXQu R01MLnYzLnByb3RvdHlwZS5yZWFkZXJzWyJmZWF0dXJlIl19LHdyaXRlcnM6eyJv Z2MiOk9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKHsiUHJvcGVydHlJc0Vx dWFsVG8iOmZ1bmN0aW9uKGZpbHRlcil7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVt ZW50TlNQbHVzKCJvZ2M6UHJvcGVydHlJc0VxdWFsVG8iLHthdHRyaWJ1dGVzOntt YXRjaENhc2U6ZmlsdGVyLm1hdGNoQ2FzZX19KTt0aGlzLndyaXRlTm9kZSgiUHJv cGVydHlOYW1lIixmaWx0ZXIsbm9kZSk7dGhpcy53cml0ZU9nY0V4cHJlc3Npb24o ZmlsdGVyLnZhbHVlLG5vZGUpO3JldHVybiBub2RlO30sIlByb3BlcnR5SXNOb3RF cXVhbFRvIjpmdW5jdGlvbihmaWx0ZXIpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxl bWVudE5TUGx1cygib2djOlByb3BlcnR5SXNOb3RFcXVhbFRvIix7YXR0cmlidXRl czp7bWF0Y2hDYXNlOmZpbHRlci5tYXRjaENhc2V9fSk7dGhpcy53cml0ZU5vZGUo IlByb3BlcnR5TmFtZSIsZmlsdGVyLG5vZGUpO3RoaXMud3JpdGVPZ2NFeHByZXNz aW9uKGZpbHRlci52YWx1ZSxub2RlKTtyZXR1cm4gbm9kZTt9LCJQcm9wZXJ0eUlz TGlrZSI6ZnVuY3Rpb24oZmlsdGVyKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1l bnROU1BsdXMoIm9nYzpQcm9wZXJ0eUlzTGlrZSIse2F0dHJpYnV0ZXM6e21hdGNo Q2FzZTpmaWx0ZXIubWF0Y2hDYXNlLHdpbGRDYXJkOiIqIixzaW5nbGVDaGFyOiIu Iixlc2NhcGVDaGFyOiIhIn19KTt0aGlzLndyaXRlTm9kZSgiUHJvcGVydHlOYW1l IixmaWx0ZXIsbm9kZSk7dGhpcy53cml0ZU5vZGUoIkxpdGVyYWwiLGZpbHRlci5y ZWdleDJ2YWx1ZSgpLG5vZGUpO3JldHVybiBub2RlO30sIkJCT1giOmZ1bmN0aW9u KGZpbHRlcil7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJvZ2M6 QkJPWCIpO2ZpbHRlci5wcm9wZXJ0eSYmdGhpcy53cml0ZU5vZGUoIlByb3BlcnR5 TmFtZSIsZmlsdGVyLG5vZGUpO3ZhciBib3g9dGhpcy53cml0ZU5vZGUoImdtbDpF bnZlbG9wZSIsZmlsdGVyLnZhbHVlKTtpZihmaWx0ZXIucHJvamVjdGlvbil7Ym94 LnNldEF0dHJpYnV0ZSgic3JzTmFtZSIsZmlsdGVyLnByb2plY3Rpb24pO30Kbm9k ZS5hcHBlbmRDaGlsZChib3gpO3JldHVybiBub2RlO30sIlNvcnRCeSI6ZnVuY3Rp b24oc29ydFByb3BlcnRpZXMpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5T UGx1cygib2djOlNvcnRCeSIpO2Zvcih2YXIgaT0wLGw9c29ydFByb3BlcnRpZXMu bGVuZ3RoO2k8bDtpKyspe3RoaXMud3JpdGVOb2RlKCJvZ2M6U29ydFByb3BlcnR5 Iixzb3J0UHJvcGVydGllc1tpXSxub2RlKTt9CnJldHVybiBub2RlO30sIlNvcnRQ cm9wZXJ0eSI6ZnVuY3Rpb24oc29ydFByb3BlcnR5KXt2YXIgbm9kZT10aGlzLmNy ZWF0ZUVsZW1lbnROU1BsdXMoIm9nYzpTb3J0UHJvcGVydHkiKTt0aGlzLndyaXRl Tm9kZSgib2djOlByb3BlcnR5TmFtZSIsc29ydFByb3BlcnR5LG5vZGUpO3RoaXMu d3JpdGVOb2RlKCJvZ2M6U29ydE9yZGVyIiwoc29ydFByb3BlcnR5Lm9yZGVyPT0n REVTQycpPydERVNDJzonQVNDJyxub2RlKTtyZXR1cm4gbm9kZTt9LCJTb3J0T3Jk ZXIiOmZ1bmN0aW9uKHZhbHVlKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnRO U1BsdXMoIm9nYzpTb3J0T3JkZXIiLHt2YWx1ZTp2YWx1ZX0pO3JldHVybiBub2Rl O319LE9wZW5MYXllcnMuRm9ybWF0LkZpbHRlci52MS5wcm90b3R5cGUud3JpdGVy c1sib2djIl0pLCJnbWwiOk9wZW5MYXllcnMuRm9ybWF0LkdNTC52My5wcm90b3R5 cGUud3JpdGVyc1siZ21sIl0sImZlYXR1cmUiOk9wZW5MYXllcnMuRm9ybWF0LkdN TC52My5wcm90b3R5cGUud3JpdGVyc1siZmVhdHVyZSJdfSx3cml0ZVNwYXRpYWw6 ZnVuY3Rpb24oZmlsdGVyLG5hbWUpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVu dE5TUGx1cygib2djOiIrbmFtZSk7dGhpcy53cml0ZU5vZGUoIlByb3BlcnR5TmFt ZSIsZmlsdGVyLG5vZGUpO2lmKGZpbHRlci52YWx1ZSBpbnN0YW5jZW9mIE9wZW5M YXllcnMuRmlsdGVyLkZ1bmN0aW9uKXt0aGlzLndyaXRlTm9kZSgiRnVuY3Rpb24i LGZpbHRlci52YWx1ZSxub2RlKTt9ZWxzZXt2YXIgY2hpbGQ7aWYoZmlsdGVyLnZh bHVlIGluc3RhbmNlb2YgT3BlbkxheWVycy5HZW9tZXRyeSl7Y2hpbGQ9dGhpcy53 cml0ZU5vZGUoImZlYXR1cmU6X2dlb21ldHJ5IixmaWx0ZXIudmFsdWUpLmZpcnN0 Q2hpbGQ7fWVsc2V7Y2hpbGQ9dGhpcy53cml0ZU5vZGUoImdtbDpFbnZlbG9wZSIs ZmlsdGVyLnZhbHVlKTt9CmlmKGZpbHRlci5wcm9qZWN0aW9uKXtjaGlsZC5zZXRB dHRyaWJ1dGUoInNyc05hbWUiLGZpbHRlci5wcm9qZWN0aW9uKTt9Cm5vZGUuYXBw ZW5kQ2hpbGQoY2hpbGQpO30KcmV0dXJuIG5vZGU7fSxDTEFTU19OQU1FOiJPcGVu TGF5ZXJzLkZvcm1hdC5GaWx0ZXIudjFfMV8wIn0pO09wZW5MYXllcnMuRm9ybWF0 Lk9XU0NvbW1vbj1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0LlhN TC5WZXJzaW9uZWRPR0Mse2RlZmF1bHRWZXJzaW9uOiIxLjAuMCIsZ2V0VmVyc2lv bjpmdW5jdGlvbihyb290LG9wdGlvbnMpe3ZhciB2ZXJzaW9uPXRoaXMudmVyc2lv bjtpZighdmVyc2lvbil7dmFyIHVyaT1yb290LmdldEF0dHJpYnV0ZSgieG1sbnM6 b3dzIik7aWYodXJpJiZ1cmkuc3Vic3RyaW5nKHVyaS5sYXN0SW5kZXhPZigiLyIp KzEpPT09IjEuMSIpe3ZlcnNpb249IjEuMS4wIjt9CmlmKCF2ZXJzaW9uKXt2ZXJz aW9uPXRoaXMuZGVmYXVsdFZlcnNpb247fX0KcmV0dXJuIHZlcnNpb247fSxDTEFT U19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5PV1NDb21tb24ifSk7T3BlbkxheWVy cy5Gb3JtYXQuT1dTQ29tbW9uLnYxPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVy cy5Gb3JtYXQuWE1MLHtyZWdFeGVzOnt0cmltU3BhY2U6KC9eXHMqfFxzKiQvZyks cmVtb3ZlU3BhY2U6KC9ccyovZyksc3BsaXRTcGFjZTooL1xzKy8pLHRyaW1Db21t YTooL1xzKixccyovZyl9LHJlYWQ6ZnVuY3Rpb24oZGF0YSxvcHRpb25zKXtvcHRp b25zPU9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKG9wdGlvbnMsdGhpcy5v cHRpb25zKTt2YXIgb3dzPXt9O3RoaXMucmVhZENoaWxkTm9kZXMoZGF0YSxvd3Mp O3JldHVybiBvd3M7fSxyZWFkZXJzOnsib3dzIjp7IkV4Y2VwdGlvbiI6ZnVuY3Rp b24obm9kZSxleGNlcHRpb25SZXBvcnQpe3ZhciBleGNlcHRpb249e2NvZGU6bm9k ZS5nZXRBdHRyaWJ1dGUoJ2V4Y2VwdGlvbkNvZGUnKSxsb2NhdG9yOm5vZGUuZ2V0 QXR0cmlidXRlKCdsb2NhdG9yJyksdGV4dHM6W119O2V4Y2VwdGlvblJlcG9ydC5l eGNlcHRpb25zLnB1c2goZXhjZXB0aW9uKTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5v ZGUsZXhjZXB0aW9uKTt9LCJFeGNlcHRpb25UZXh0IjpmdW5jdGlvbihub2RlLGV4 Y2VwdGlvbil7dmFyIHRleHQ9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO2V4Y2Vw dGlvbi50ZXh0cy5wdXNoKHRleHQpO30sIlNlcnZpY2VJZGVudGlmaWNhdGlvbiI6 ZnVuY3Rpb24obm9kZSxvYmope29iai5zZXJ2aWNlSWRlbnRpZmljYXRpb249e307 dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iai5zZXJ2aWNlSWRlbnRpZmljYXRp b24pO30sIlRpdGxlIjpmdW5jdGlvbihub2RlLG9iail7b2JqLnRpdGxlPXRoaXMu Z2V0Q2hpbGRWYWx1ZShub2RlKTt9LCJBYnN0cmFjdCI6ZnVuY3Rpb24obm9kZSxz ZXJ2aWNlSWRlbnRpZmljYXRpb24pe3NlcnZpY2VJZGVudGlmaWNhdGlvblsiYWJz dHJhY3QiXT10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7fSwiS2V5d29yZHMiOmZ1 bmN0aW9uKG5vZGUsc2VydmljZUlkZW50aWZpY2F0aW9uKXtzZXJ2aWNlSWRlbnRp ZmljYXRpb24ua2V5d29yZHM9e307dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLHNl cnZpY2VJZGVudGlmaWNhdGlvbi5rZXl3b3Jkcyk7fSwiS2V5d29yZCI6ZnVuY3Rp b24obm9kZSxrZXl3b3Jkcyl7a2V5d29yZHNbdGhpcy5nZXRDaGlsZFZhbHVlKG5v ZGUpXT10cnVlO30sIlNlcnZpY2VUeXBlIjpmdW5jdGlvbihub2RlLHNlcnZpY2VJ ZGVudGlmaWNhdGlvbil7c2VydmljZUlkZW50aWZpY2F0aW9uLnNlcnZpY2VUeXBl PXtjb2RlU3BhY2U6bm9kZS5nZXRBdHRyaWJ1dGUoJ2NvZGVTcGFjZScpLHZhbHVl OnRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKX07fSwiU2VydmljZVR5cGVWZXJzaW9u IjpmdW5jdGlvbihub2RlLHNlcnZpY2VJZGVudGlmaWNhdGlvbil7c2VydmljZUlk ZW50aWZpY2F0aW9uLnNlcnZpY2VUeXBlVmVyc2lvbj10aGlzLmdldENoaWxkVmFs dWUobm9kZSk7fSwiRmVlcyI6ZnVuY3Rpb24obm9kZSxzZXJ2aWNlSWRlbnRpZmlj YXRpb24pe3NlcnZpY2VJZGVudGlmaWNhdGlvbi5mZWVzPXRoaXMuZ2V0Q2hpbGRW YWx1ZShub2RlKTt9LCJBY2Nlc3NDb25zdHJhaW50cyI6ZnVuY3Rpb24obm9kZSxz ZXJ2aWNlSWRlbnRpZmljYXRpb24pe3NlcnZpY2VJZGVudGlmaWNhdGlvbi5hY2Nl c3NDb25zdHJhaW50cz10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7fSwiU2Vydmlj ZVByb3ZpZGVyIjpmdW5jdGlvbihub2RlLG9iail7b2JqLnNlcnZpY2VQcm92aWRl cj17fTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqLnNlcnZpY2VQcm92aWRl cik7fSwiUHJvdmlkZXJOYW1lIjpmdW5jdGlvbihub2RlLHNlcnZpY2VQcm92aWRl cil7c2VydmljZVByb3ZpZGVyLnByb3ZpZGVyTmFtZT10aGlzLmdldENoaWxkVmFs dWUobm9kZSk7fSwiUHJvdmlkZXJTaXRlIjpmdW5jdGlvbihub2RlLHNlcnZpY2VQ cm92aWRlcil7c2VydmljZVByb3ZpZGVyLnByb3ZpZGVyU2l0ZT10aGlzLmdldEF0 dHJpYnV0ZU5TKG5vZGUsdGhpcy5uYW1lc3BhY2VzLnhsaW5rLCJocmVmIik7fSwi U2VydmljZUNvbnRhY3QiOmZ1bmN0aW9uKG5vZGUsc2VydmljZVByb3ZpZGVyKXtz ZXJ2aWNlUHJvdmlkZXIuc2VydmljZUNvbnRhY3Q9e307dGhpcy5yZWFkQ2hpbGRO b2Rlcyhub2RlLHNlcnZpY2VQcm92aWRlci5zZXJ2aWNlQ29udGFjdCk7fSwiSW5k aXZpZHVhbE5hbWUiOmZ1bmN0aW9uKG5vZGUsc2VydmljZUNvbnRhY3Qpe3NlcnZp Y2VDb250YWN0LmluZGl2aWR1YWxOYW1lPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2Rl KTt9LCJQb3NpdGlvbk5hbWUiOmZ1bmN0aW9uKG5vZGUsc2VydmljZUNvbnRhY3Qp e3NlcnZpY2VDb250YWN0LnBvc2l0aW9uTmFtZT10aGlzLmdldENoaWxkVmFsdWUo bm9kZSk7fSwiQ29udGFjdEluZm8iOmZ1bmN0aW9uKG5vZGUsc2VydmljZUNvbnRh Y3Qpe3NlcnZpY2VDb250YWN0LmNvbnRhY3RJbmZvPXt9O3RoaXMucmVhZENoaWxk Tm9kZXMobm9kZSxzZXJ2aWNlQ29udGFjdC5jb250YWN0SW5mbyk7fSwiUGhvbmUi OmZ1bmN0aW9uKG5vZGUsY29udGFjdEluZm8pe2NvbnRhY3RJbmZvLnBob25lPXt9 O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxjb250YWN0SW5mby5waG9uZSk7fSwi Vm9pY2UiOmZ1bmN0aW9uKG5vZGUscGhvbmUpe3Bob25lLnZvaWNlPXRoaXMuZ2V0 Q2hpbGRWYWx1ZShub2RlKTt9LCJBZGRyZXNzIjpmdW5jdGlvbihub2RlLGNvbnRh Y3RJbmZvKXtjb250YWN0SW5mby5hZGRyZXNzPXt9O3RoaXMucmVhZENoaWxkTm9k ZXMobm9kZSxjb250YWN0SW5mby5hZGRyZXNzKTt9LCJEZWxpdmVyeVBvaW50Ijpm dW5jdGlvbihub2RlLGFkZHJlc3Mpe2FkZHJlc3MuZGVsaXZlcnlQb2ludD10aGlz LmdldENoaWxkVmFsdWUobm9kZSk7fSwiQ2l0eSI6ZnVuY3Rpb24obm9kZSxhZGRy ZXNzKXthZGRyZXNzLmNpdHk9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO30sIkFk bWluaXN0cmF0aXZlQXJlYSI6ZnVuY3Rpb24obm9kZSxhZGRyZXNzKXthZGRyZXNz LmFkbWluaXN0cmF0aXZlQXJlYT10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7fSwi UG9zdGFsQ29kZSI6ZnVuY3Rpb24obm9kZSxhZGRyZXNzKXthZGRyZXNzLnBvc3Rh bENvZGU9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO30sIkNvdW50cnkiOmZ1bmN0 aW9uKG5vZGUsYWRkcmVzcyl7YWRkcmVzcy5jb3VudHJ5PXRoaXMuZ2V0Q2hpbGRW YWx1ZShub2RlKTt9LCJFbGVjdHJvbmljTWFpbEFkZHJlc3MiOmZ1bmN0aW9uKG5v ZGUsYWRkcmVzcyl7YWRkcmVzcy5lbGVjdHJvbmljTWFpbEFkZHJlc3M9dGhpcy5n ZXRDaGlsZFZhbHVlKG5vZGUpO30sIlJvbGUiOmZ1bmN0aW9uKG5vZGUsc2Vydmlj ZUNvbnRhY3Qpe3NlcnZpY2VDb250YWN0LnJvbGU9dGhpcy5nZXRDaGlsZFZhbHVl KG5vZGUpO30sIk9wZXJhdGlvbnNNZXRhZGF0YSI6ZnVuY3Rpb24obm9kZSxvYmop e29iai5vcGVyYXRpb25zTWV0YWRhdGE9e307dGhpcy5yZWFkQ2hpbGROb2Rlcyhu b2RlLG9iai5vcGVyYXRpb25zTWV0YWRhdGEpO30sIk9wZXJhdGlvbiI6ZnVuY3Rp b24obm9kZSxvcGVyYXRpb25zTWV0YWRhdGEpe3ZhciBuYW1lPW5vZGUuZ2V0QXR0 cmlidXRlKCJuYW1lIik7b3BlcmF0aW9uc01ldGFkYXRhW25hbWVdPXt9O3RoaXMu cmVhZENoaWxkTm9kZXMobm9kZSxvcGVyYXRpb25zTWV0YWRhdGFbbmFtZV0pO30s IkRDUCI6ZnVuY3Rpb24obm9kZSxvcGVyYXRpb24pe29wZXJhdGlvbi5kY3A9e307 dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9wZXJhdGlvbi5kY3ApO30sIkhUVFAi OmZ1bmN0aW9uKG5vZGUsZGNwKXtkY3AuaHR0cD17fTt0aGlzLnJlYWRDaGlsZE5v ZGVzKG5vZGUsZGNwLmh0dHApO30sIkdldCI6ZnVuY3Rpb24obm9kZSxodHRwKXto dHRwLmdldD10aGlzLmdldEF0dHJpYnV0ZU5TKG5vZGUsdGhpcy5uYW1lc3BhY2Vz LnhsaW5rLCJocmVmIik7fSwiUG9zdCI6ZnVuY3Rpb24obm9kZSxodHRwKXtodHRw LnBvc3Q9dGhpcy5nZXRBdHRyaWJ1dGVOUyhub2RlLHRoaXMubmFtZXNwYWNlcy54 bGluaywiaHJlZiIpO30sIlBhcmFtZXRlciI6ZnVuY3Rpb24obm9kZSxvcGVyYXRp b24pe2lmKCFvcGVyYXRpb24ucGFyYW1ldGVycyl7b3BlcmF0aW9uLnBhcmFtZXRl cnM9e307fQp2YXIgbmFtZT1ub2RlLmdldEF0dHJpYnV0ZSgibmFtZSIpO29wZXJh dGlvbi5wYXJhbWV0ZXJzW25hbWVdPXt9O3RoaXMucmVhZENoaWxkTm9kZXMobm9k ZSxvcGVyYXRpb24ucGFyYW1ldGVyc1tuYW1lXSk7fSwiVmFsdWUiOmZ1bmN0aW9u KG5vZGUsYWxsb3dlZFZhbHVlcyl7YWxsb3dlZFZhbHVlc1t0aGlzLmdldENoaWxk VmFsdWUobm9kZSldPXRydWU7fSwiT3V0cHV0Rm9ybWF0IjpmdW5jdGlvbihub2Rl LG9iail7b2JqLmZvcm1hdHMucHVzaCh7dmFsdWU6dGhpcy5nZXRDaGlsZFZhbHVl KG5vZGUpfSk7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iaik7fSwiV0dTODRC b3VuZGluZ0JveCI6ZnVuY3Rpb24obm9kZSxvYmope3ZhciBib3VuZGluZ0JveD17 fTtib3VuZGluZ0JveC5jcnM9bm9kZS5nZXRBdHRyaWJ1dGUoImNycyIpO2lmKG9i ai5Cb3VuZGluZ0JveCl7b2JqLkJvdW5kaW5nQm94LnB1c2goYm91bmRpbmdCb3gp O31lbHNle29iai5wcm9qZWN0aW9uPWJvdW5kaW5nQm94LmNycztib3VuZGluZ0Jv eD1vYmo7fQp0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsYm91bmRpbmdCb3gpO30s IkJvdW5kaW5nQm94IjpmdW5jdGlvbihub2RlLG9iail7dGhpcy5yZWFkZXJzWydv d3MnXVsnV0dTODRCb3VuZGluZ0JveCddLmFwcGx5KHRoaXMsW25vZGUsb2JqXSk7 fSwiTG93ZXJDb3JuZXIiOmZ1bmN0aW9uKG5vZGUsb2JqKXt2YXIgc3RyPXRoaXMu Z2V0Q2hpbGRWYWx1ZShub2RlKS5yZXBsYWNlKHRoaXMucmVnRXhlcy50cmltU3Bh Y2UsIiIpO3N0cj1zdHIucmVwbGFjZSh0aGlzLnJlZ0V4ZXMudHJpbUNvbW1hLCIs Iik7dmFyIHBvaW50TGlzdD1zdHIuc3BsaXQodGhpcy5yZWdFeGVzLnNwbGl0U3Bh Y2UpO29iai5sZWZ0PXBvaW50TGlzdFswXTtvYmouYm90dG9tPXBvaW50TGlzdFsx XTt9LCJVcHBlckNvcm5lciI6ZnVuY3Rpb24obm9kZSxvYmope3ZhciBzdHI9dGhp cy5nZXRDaGlsZFZhbHVlKG5vZGUpLnJlcGxhY2UodGhpcy5yZWdFeGVzLnRyaW1T cGFjZSwiIik7c3RyPXN0ci5yZXBsYWNlKHRoaXMucmVnRXhlcy50cmltQ29tbWEs IiwiKTt2YXIgcG9pbnRMaXN0PXN0ci5zcGxpdCh0aGlzLnJlZ0V4ZXMuc3BsaXRT cGFjZSk7b2JqLnJpZ2h0PXBvaW50TGlzdFswXTtvYmoudG9wPXBvaW50TGlzdFsx XTtvYmouYm91bmRzPW5ldyBPcGVuTGF5ZXJzLkJvdW5kcyhvYmoubGVmdCxvYmou Ym90dG9tLG9iai5yaWdodCxvYmoudG9wKTtkZWxldGUgb2JqLmxlZnQ7ZGVsZXRl IG9iai5ib3R0b207ZGVsZXRlIG9iai5yaWdodDtkZWxldGUgb2JqLnRvcDt9LCJM YW5ndWFnZSI6ZnVuY3Rpb24obm9kZSxvYmope29iai5sYW5ndWFnZT10aGlzLmdl dENoaWxkVmFsdWUobm9kZSk7fX19LHdyaXRlcnM6eyJvd3MiOnsiQm91bmRpbmdC b3giOmZ1bmN0aW9uKG9wdGlvbnMpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVu dE5TUGx1cygib3dzOkJvdW5kaW5nQm94Iix7YXR0cmlidXRlczp7Y3JzOm9wdGlv bnMucHJvamVjdGlvbn19KTt0aGlzLndyaXRlTm9kZSgib3dzOkxvd2VyQ29ybmVy IixvcHRpb25zLG5vZGUpO3RoaXMud3JpdGVOb2RlKCJvd3M6VXBwZXJDb3JuZXIi LG9wdGlvbnMsbm9kZSk7cmV0dXJuIG5vZGU7fSwiTG93ZXJDb3JuZXIiOmZ1bmN0 aW9uKG9wdGlvbnMpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygi b3dzOkxvd2VyQ29ybmVyIix7dmFsdWU6b3B0aW9ucy5ib3VuZHMubGVmdCsiICIr b3B0aW9ucy5ib3VuZHMuYm90dG9tfSk7cmV0dXJuIG5vZGU7fSwiVXBwZXJDb3Ju ZXIiOmZ1bmN0aW9uKG9wdGlvbnMpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVu dE5TUGx1cygib3dzOlVwcGVyQ29ybmVyIix7dmFsdWU6b3B0aW9ucy5ib3VuZHMu cmlnaHQrIiAiK29wdGlvbnMuYm91bmRzLnRvcH0pO3JldHVybiBub2RlO30sIklk ZW50aWZpZXIiOmZ1bmN0aW9uKGlkZW50aWZpZXIpe3ZhciBub2RlPXRoaXMuY3Jl YXRlRWxlbWVudE5TUGx1cygib3dzOklkZW50aWZpZXIiLHt2YWx1ZTppZGVudGlm aWVyfSk7cmV0dXJuIG5vZGU7fSwiVGl0bGUiOmZ1bmN0aW9uKHRpdGxlKXt2YXIg bm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIm93czpUaXRsZSIse3ZhbHVl OnRpdGxlfSk7cmV0dXJuIG5vZGU7fSwiQWJzdHJhY3QiOmZ1bmN0aW9uKGFic3Ry YWN0VmFsdWUpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygib3dz OkFic3RyYWN0Iix7dmFsdWU6YWJzdHJhY3RWYWx1ZX0pO3JldHVybiBub2RlO30s Ik91dHB1dEZvcm1hdCI6ZnVuY3Rpb24oZm9ybWF0KXt2YXIgbm9kZT10aGlzLmNy ZWF0ZUVsZW1lbnROU1BsdXMoIm93czpPdXRwdXRGb3JtYXQiLHt2YWx1ZTpmb3Jt YXR9KTtyZXR1cm4gbm9kZTt9fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3Jt YXQuT1dTQ29tbW9uLnYxIn0pO09wZW5MYXllcnMuRm9ybWF0Lk9XU0NvbW1vbi52 MV8wXzA9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkZvcm1hdC5PV1NDb21t b24udjEse25hbWVzcGFjZXM6e293czoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9v d3MiLHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIn0scmVhZGVy czp7Im93cyI6T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMoeyJFeGNlcHRp b25SZXBvcnQiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmouc3VjY2Vzcz1mYWxzZTtv YmouZXhjZXB0aW9uUmVwb3J0PXt2ZXJzaW9uOm5vZGUuZ2V0QXR0cmlidXRlKCd2 ZXJzaW9uJyksbGFuZ3VhZ2U6bm9kZS5nZXRBdHRyaWJ1dGUoJ2xhbmd1YWdlJyks ZXhjZXB0aW9uczpbXX07dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iai5leGNl cHRpb25SZXBvcnQpO319LE9wZW5MYXllcnMuRm9ybWF0Lk9XU0NvbW1vbi52MS5w cm90b3R5cGUucmVhZGVycy5vd3MpfSx3cml0ZXJzOnsib3dzIjpPcGVuTGF5ZXJz LkZvcm1hdC5PV1NDb21tb24udjEucHJvdG90eXBlLndyaXRlcnMub3dzfSxDTEFT U19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5PV1NDb21tb24udjFfMF8wIn0pO09w ZW5MYXllcnMuRm9ybWF0LldGU1QudjFfMV8wPU9wZW5MYXllcnMuQ2xhc3MoT3Bl bkxheWVycy5Gb3JtYXQuRmlsdGVyLnYxXzFfMCxPcGVuTGF5ZXJzLkZvcm1hdC5X RlNULnYxLHt2ZXJzaW9uOiIxLjEuMCIsc2NoZW1hTG9jYXRpb25zOnsid2ZzIjoi aHR0cDovL3NjaGVtYXMub3Blbmdpcy5uZXQvd2ZzLzEuMS4wL3dmcy54c2QifSxp bml0aWFsaXplOmZ1bmN0aW9uKG9wdGlvbnMpe09wZW5MYXllcnMuRm9ybWF0LkZp bHRlci52MV8xXzAucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxbb3B0 aW9uc10pO09wZW5MYXllcnMuRm9ybWF0LldGU1QudjEucHJvdG90eXBlLmluaXRp YWxpemUuYXBwbHkodGhpcyxbb3B0aW9uc10pO30scmVhZE5vZGU6ZnVuY3Rpb24o bm9kZSxvYmosZmlyc3Qpe3JldHVybiBPcGVuTGF5ZXJzLkZvcm1hdC5HTUwudjMu cHJvdG90eXBlLnJlYWROb2RlLmFwcGx5KHRoaXMsW25vZGUsb2JqXSk7fSxyZWFk ZXJzOnsid2ZzIjpPcGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyh7IkZlYXR1 cmVDb2xsZWN0aW9uIjpmdW5jdGlvbihub2RlLG9iail7b2JqLm51bWJlck9mRmVh dHVyZXM9cGFyc2VJbnQobm9kZS5nZXRBdHRyaWJ1dGUoIm51bWJlck9mRmVhdHVy ZXMiKSk7T3BlbkxheWVycy5Gb3JtYXQuV0ZTVC52MS5wcm90b3R5cGUucmVhZGVy c1sid2ZzIl1bIkZlYXR1cmVDb2xsZWN0aW9uIl0uYXBwbHkodGhpcyxhcmd1bWVu dHMpO30sIlRyYW5zYWN0aW9uUmVzcG9uc2UiOmZ1bmN0aW9uKG5vZGUsb2JqKXtv YmouaW5zZXJ0SWRzPVtdO29iai5zdWNjZXNzPWZhbHNlO3RoaXMucmVhZENoaWxk Tm9kZXMobm9kZSxvYmopO30sIlRyYW5zYWN0aW9uU3VtbWFyeSI6ZnVuY3Rpb24o bm9kZSxvYmope29iai5zdWNjZXNzPXRydWU7fSwiSW5zZXJ0UmVzdWx0cyI6ZnVu Y3Rpb24obm9kZSxvYmope3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxvYmopO30s IkZlYXR1cmUiOmZ1bmN0aW9uKG5vZGUsY29udGFpbmVyKXt2YXIgb2JqPXtmaWRz OltdfTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqKTtjb250YWluZXIuaW5z ZXJ0SWRzLnB1c2gob2JqLmZpZHNbMF0pO319LE9wZW5MYXllcnMuRm9ybWF0LldG U1QudjEucHJvdG90eXBlLnJlYWRlcnNbIndmcyJdKSwiZ21sIjpPcGVuTGF5ZXJz LkZvcm1hdC5HTUwudjMucHJvdG90eXBlLnJlYWRlcnNbImdtbCJdLCJmZWF0dXJl IjpPcGVuTGF5ZXJzLkZvcm1hdC5HTUwudjMucHJvdG90eXBlLnJlYWRlcnNbImZl YXR1cmUiXSwib2djIjpPcGVuTGF5ZXJzLkZvcm1hdC5GaWx0ZXIudjFfMV8wLnBy b3RvdHlwZS5yZWFkZXJzWyJvZ2MiXSwib3dzIjpPcGVuTGF5ZXJzLkZvcm1hdC5P V1NDb21tb24udjFfMF8wLnByb3RvdHlwZS5yZWFkZXJzWyJvd3MiXX0sd3JpdGVy czp7IndmcyI6T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMoeyJHZXRGZWF0 dXJlIjpmdW5jdGlvbihvcHRpb25zKXt2YXIgbm9kZT1PcGVuTGF5ZXJzLkZvcm1h dC5XRlNULnYxLnByb3RvdHlwZS53cml0ZXJzWyJ3ZnMiXVsiR2V0RmVhdHVyZSJd LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtvcHRpb25zJiZ0aGlzLnNldEF0dHJpYnV0 ZXMobm9kZSx7cmVzdWx0VHlwZTpvcHRpb25zLnJlc3VsdFR5cGUsc3RhcnRJbmRl eDpvcHRpb25zLnN0YXJ0SW5kZXgsY291bnQ6b3B0aW9ucy5jb3VudH0pO3JldHVy biBub2RlO30sIlF1ZXJ5IjpmdW5jdGlvbihvcHRpb25zKXtvcHRpb25zPU9wZW5M YXllcnMuVXRpbC5leHRlbmQoe2ZlYXR1cmVOUzp0aGlzLmZlYXR1cmVOUyxmZWF0 dXJlUHJlZml4OnRoaXMuZmVhdHVyZVByZWZpeCxmZWF0dXJlVHlwZTp0aGlzLmZl YXR1cmVUeXBlLHNyc05hbWU6dGhpcy5zcnNOYW1lfSxvcHRpb25zKTt2YXIgcHJl Zml4PW9wdGlvbnMuZmVhdHVyZVByZWZpeDt2YXIgbm9kZT10aGlzLmNyZWF0ZUVs ZW1lbnROU1BsdXMoIndmczpRdWVyeSIse2F0dHJpYnV0ZXM6e3R5cGVOYW1lOihw cmVmaXg/cHJlZml4KyI6IjoiIikrCm9wdGlvbnMuZmVhdHVyZVR5cGUsc3JzTmFt ZTpvcHRpb25zLnNyc05hbWV9fSk7aWYob3B0aW9ucy5mZWF0dXJlTlMpe25vZGUu c2V0QXR0cmlidXRlKCJ4bWxuczoiK3ByZWZpeCxvcHRpb25zLmZlYXR1cmVOUyk7 fQppZihvcHRpb25zLnByb3BlcnR5TmFtZXMpe2Zvcih2YXIgaT0wLGxlbj1vcHRp b25zLnByb3BlcnR5TmFtZXMubGVuZ3RoO2k8bGVuO2krKyl7dGhpcy53cml0ZU5v ZGUoIndmczpQcm9wZXJ0eU5hbWUiLHtwcm9wZXJ0eTpvcHRpb25zLnByb3BlcnR5 TmFtZXNbaV19LG5vZGUpO319CmlmKG9wdGlvbnMuZmlsdGVyKXt0aGlzLnNldEZp bHRlclByb3BlcnR5KG9wdGlvbnMuZmlsdGVyKTt0aGlzLndyaXRlTm9kZSgib2dj OkZpbHRlciIsb3B0aW9ucy5maWx0ZXIsbm9kZSk7fQpyZXR1cm4gbm9kZTt9LCJQ cm9wZXJ0eU5hbWUiOmZ1bmN0aW9uKG9iail7cmV0dXJuIHRoaXMuY3JlYXRlRWxl bWVudE5TUGx1cygid2ZzOlByb3BlcnR5TmFtZSIse3ZhbHVlOm9iai5wcm9wZXJ0 eX0pO319LE9wZW5MYXllcnMuRm9ybWF0LldGU1QudjEucHJvdG90eXBlLndyaXRl cnNbIndmcyJdKSwiZ21sIjpPcGVuTGF5ZXJzLkZvcm1hdC5HTUwudjMucHJvdG90 eXBlLndyaXRlcnNbImdtbCJdLCJmZWF0dXJlIjpPcGVuTGF5ZXJzLkZvcm1hdC5H TUwudjMucHJvdG90eXBlLndyaXRlcnNbImZlYXR1cmUiXSwib2djIjpPcGVuTGF5 ZXJzLkZvcm1hdC5GaWx0ZXIudjFfMV8wLnByb3RvdHlwZS53cml0ZXJzWyJvZ2Mi XX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3JtYXQuV0ZTVC52MV8xXzAifSk7 T3BlbkxheWVycy5Gb3JtYXQuR2VvSlNPTj1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5M YXllcnMuRm9ybWF0LkpTT04se2lnbm9yZUV4dHJhRGltczpmYWxzZSxyZWFkOmZ1 bmN0aW9uKGpzb24sdHlwZSxmaWx0ZXIpe3R5cGU9KHR5cGUpP3R5cGU6IkZlYXR1 cmVDb2xsZWN0aW9uIjt2YXIgcmVzdWx0cz1udWxsO3ZhciBvYmo9bnVsbDtpZih0 eXBlb2YganNvbj09InN0cmluZyIpe29iaj1PcGVuTGF5ZXJzLkZvcm1hdC5KU09O LnByb3RvdHlwZS5yZWFkLmFwcGx5KHRoaXMsW2pzb24sZmlsdGVyXSk7fWVsc2V7 b2JqPWpzb247fQppZighb2JqKXtPcGVuTGF5ZXJzLkNvbnNvbGUuZXJyb3IoIkJh ZCBKU09OOiAiK2pzb24pO31lbHNlIGlmKHR5cGVvZihvYmoudHlwZSkhPSJzdHJp bmciKXtPcGVuTGF5ZXJzLkNvbnNvbGUuZXJyb3IoIkJhZCBHZW9KU09OIC0gbm8g dHlwZTogIitqc29uKTt9ZWxzZSBpZih0aGlzLmlzVmFsaWRUeXBlKG9iaix0eXBl KSl7c3dpdGNoKHR5cGUpe2Nhc2UiR2VvbWV0cnkiOnRyeXtyZXN1bHRzPXRoaXMu cGFyc2VHZW9tZXRyeShvYmopO31jYXRjaChlcnIpe09wZW5MYXllcnMuQ29uc29s ZS5lcnJvcihlcnIpO30KYnJlYWs7Y2FzZSJGZWF0dXJlIjp0cnl7cmVzdWx0cz10 aGlzLnBhcnNlRmVhdHVyZShvYmopO3Jlc3VsdHMudHlwZT0iRmVhdHVyZSI7fWNh dGNoKGVycil7T3BlbkxheWVycy5Db25zb2xlLmVycm9yKGVycik7fQpicmVhaztj YXNlIkZlYXR1cmVDb2xsZWN0aW9uIjpyZXN1bHRzPVtdO3N3aXRjaChvYmoudHlw ZSl7Y2FzZSJGZWF0dXJlIjp0cnl7cmVzdWx0cy5wdXNoKHRoaXMucGFyc2VGZWF0 dXJlKG9iaikpO31jYXRjaChlcnIpe3Jlc3VsdHM9bnVsbDtPcGVuTGF5ZXJzLkNv bnNvbGUuZXJyb3IoZXJyKTt9CmJyZWFrO2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24i OmZvcih2YXIgaT0wLGxlbj1vYmouZmVhdHVyZXMubGVuZ3RoO2k8bGVuOysraSl7 dHJ5e3Jlc3VsdHMucHVzaCh0aGlzLnBhcnNlRmVhdHVyZShvYmouZmVhdHVyZXNb aV0pKTt9Y2F0Y2goZXJyKXtyZXN1bHRzPW51bGw7T3BlbkxheWVycy5Db25zb2xl LmVycm9yKGVycik7fX0KYnJlYWs7ZGVmYXVsdDp0cnl7dmFyIGdlb209dGhpcy5w YXJzZUdlb21ldHJ5KG9iaik7cmVzdWx0cy5wdXNoKG5ldyBPcGVuTGF5ZXJzLkZl YXR1cmUuVmVjdG9yKGdlb20pKTt9Y2F0Y2goZXJyKXtyZXN1bHRzPW51bGw7T3Bl bkxheWVycy5Db25zb2xlLmVycm9yKGVycik7fX0KYnJlYWs7fX0KcmV0dXJuIHJl c3VsdHM7fSxpc1ZhbGlkVHlwZTpmdW5jdGlvbihvYmosdHlwZSl7dmFyIHZhbGlk PWZhbHNlO3N3aXRjaCh0eXBlKXtjYXNlIkdlb21ldHJ5IjppZihPcGVuTGF5ZXJz LlV0aWwuaW5kZXhPZihbIlBvaW50IiwiTXVsdGlQb2ludCIsIkxpbmVTdHJpbmci LCJNdWx0aUxpbmVTdHJpbmciLCJQb2x5Z29uIiwiTXVsdGlQb2x5Z29uIiwiQm94 IiwiR2VvbWV0cnlDb2xsZWN0aW9uIl0sb2JqLnR5cGUpPT0tMSl7T3BlbkxheWVy cy5Db25zb2xlLmVycm9yKCJVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlOiAiKwpv YmoudHlwZSk7fWVsc2V7dmFsaWQ9dHJ1ZTt9CmJyZWFrO2Nhc2UiRmVhdHVyZUNv bGxlY3Rpb24iOnZhbGlkPXRydWU7YnJlYWs7ZGVmYXVsdDppZihvYmoudHlwZT09 dHlwZSl7dmFsaWQ9dHJ1ZTt9ZWxzZXtPcGVuTGF5ZXJzLkNvbnNvbGUuZXJyb3Io IkNhbm5vdCBjb252ZXJ0IHR5cGVzIGZyb20gIisKb2JqLnR5cGUrIiB0byAiK3R5 cGUpO319CnJldHVybiB2YWxpZDt9LHBhcnNlRmVhdHVyZTpmdW5jdGlvbihvYmop e3ZhciBmZWF0dXJlLGdlb21ldHJ5LGF0dHJpYnV0ZXMsYmJveDthdHRyaWJ1dGVz PShvYmoucHJvcGVydGllcyk/b2JqLnByb3BlcnRpZXM6e307YmJveD0ob2JqLmdl b21ldHJ5JiZvYmouZ2VvbWV0cnkuYmJveCl8fG9iai5iYm94O3RyeXtnZW9tZXRy eT10aGlzLnBhcnNlR2VvbWV0cnkob2JqLmdlb21ldHJ5KTt9Y2F0Y2goZXJyKXt0 aHJvdyBlcnI7fQpmZWF0dXJlPW5ldyBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9y KGdlb21ldHJ5LGF0dHJpYnV0ZXMpO2lmKGJib3gpe2ZlYXR1cmUuYm91bmRzPU9w ZW5MYXllcnMuQm91bmRzLmZyb21BcnJheShiYm94KTt9CmlmKG9iai5pZCl7ZmVh dHVyZS5maWQ9b2JqLmlkO30KcmV0dXJuIGZlYXR1cmU7fSxwYXJzZUdlb21ldHJ5 OmZ1bmN0aW9uKG9iail7aWYob2JqPT1udWxsKXtyZXR1cm4gbnVsbDt9CnZhciBn ZW9tZXRyeSxjb2xsZWN0aW9uPWZhbHNlO2lmKG9iai50eXBlPT0iR2VvbWV0cnlD b2xsZWN0aW9uIil7aWYoIShPcGVuTGF5ZXJzLlV0aWwuaXNBcnJheShvYmouZ2Vv bWV0cmllcykpKXt0aHJvdyJHZW9tZXRyeUNvbGxlY3Rpb24gbXVzdCBoYXZlIGdl b21ldHJpZXMgYXJyYXk6ICIrb2JqO30KdmFyIG51bUdlb209b2JqLmdlb21ldHJp ZXMubGVuZ3RoO3ZhciBjb21wb25lbnRzPW5ldyBBcnJheShudW1HZW9tKTtmb3Io dmFyIGk9MDtpPG51bUdlb207KytpKXtjb21wb25lbnRzW2ldPXRoaXMucGFyc2VH ZW9tZXRyeS5hcHBseSh0aGlzLFtvYmouZ2VvbWV0cmllc1tpXV0pO30KZ2VvbWV0 cnk9bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuQ29sbGVjdGlvbihjb21wb25lbnRz KTtjb2xsZWN0aW9uPXRydWU7fWVsc2V7aWYoIShPcGVuTGF5ZXJzLlV0aWwuaXNB cnJheShvYmouY29vcmRpbmF0ZXMpKSl7dGhyb3ciR2VvbWV0cnkgbXVzdCBoYXZl IGNvb3JkaW5hdGVzIGFycmF5OiAiK29iajt9CmlmKCF0aGlzLnBhcnNlQ29vcmRz W29iai50eXBlLnRvTG93ZXJDYXNlKCldKXt0aHJvdyJVbnN1cHBvcnRlZCBnZW9t ZXRyeSB0eXBlOiAiK29iai50eXBlO30KdHJ5e2dlb21ldHJ5PXRoaXMucGFyc2VD b29yZHNbb2JqLnR5cGUudG9Mb3dlckNhc2UoKV0uYXBwbHkodGhpcyxbb2JqLmNv b3JkaW5hdGVzXSk7fWNhdGNoKGVycil7dGhyb3cgZXJyO319CmlmKHRoaXMuaW50 ZXJuYWxQcm9qZWN0aW9uJiZ0aGlzLmV4dGVybmFsUHJvamVjdGlvbiYmIWNvbGxl Y3Rpb24pe2dlb21ldHJ5LnRyYW5zZm9ybSh0aGlzLmV4dGVybmFsUHJvamVjdGlv bix0aGlzLmludGVybmFsUHJvamVjdGlvbik7fQpyZXR1cm4gZ2VvbWV0cnk7fSxw YXJzZUNvb3Jkczp7InBvaW50IjpmdW5jdGlvbihhcnJheSl7aWYodGhpcy5pZ25v cmVFeHRyYURpbXM9PWZhbHNlJiZhcnJheS5sZW5ndGghPTIpe3Rocm93Ik9ubHkg MkQgcG9pbnRzIGFyZSBzdXBwb3J0ZWQ6ICIrYXJyYXk7fQpyZXR1cm4gbmV3IE9w ZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQoYXJyYXlbMF0sYXJyYXlbMV0pO30sIm11 bHRpcG9pbnQiOmZ1bmN0aW9uKGFycmF5KXt2YXIgcG9pbnRzPVtdO3ZhciBwPW51 bGw7Zm9yKHZhciBpPTAsbGVuPWFycmF5Lmxlbmd0aDtpPGxlbjsrK2kpe3RyeXtw PXRoaXMucGFyc2VDb29yZHNbInBvaW50Il0uYXBwbHkodGhpcyxbYXJyYXlbaV1d KTt9Y2F0Y2goZXJyKXt0aHJvdyBlcnI7fQpwb2ludHMucHVzaChwKTt9CnJldHVy biBuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5NdWx0aVBvaW50KHBvaW50cyk7fSwi bGluZXN0cmluZyI6ZnVuY3Rpb24oYXJyYXkpe3ZhciBwb2ludHM9W107dmFyIHA9 bnVsbDtmb3IodmFyIGk9MCxsZW49YXJyYXkubGVuZ3RoO2k8bGVuOysraSl7dHJ5 e3A9dGhpcy5wYXJzZUNvb3Jkc1sicG9pbnQiXS5hcHBseSh0aGlzLFthcnJheVtp XV0pO31jYXRjaChlcnIpe3Rocm93IGVycjt9CnBvaW50cy5wdXNoKHApO30KcmV0 dXJuIG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LkxpbmVTdHJpbmcocG9pbnRzKTt9 LCJtdWx0aWxpbmVzdHJpbmciOmZ1bmN0aW9uKGFycmF5KXt2YXIgbGluZXM9W107 dmFyIGw9bnVsbDtmb3IodmFyIGk9MCxsZW49YXJyYXkubGVuZ3RoO2k8bGVuOysr aSl7dHJ5e2w9dGhpcy5wYXJzZUNvb3Jkc1sibGluZXN0cmluZyJdLmFwcGx5KHRo aXMsW2FycmF5W2ldXSk7fWNhdGNoKGVycil7dGhyb3cgZXJyO30KbGluZXMucHVz aChsKTt9CnJldHVybiBuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5NdWx0aUxpbmVT dHJpbmcobGluZXMpO30sInBvbHlnb24iOmZ1bmN0aW9uKGFycmF5KXt2YXIgcmlu Z3M9W107dmFyIHIsbDtmb3IodmFyIGk9MCxsZW49YXJyYXkubGVuZ3RoO2k8bGVu OysraSl7dHJ5e2w9dGhpcy5wYXJzZUNvb3Jkc1sibGluZXN0cmluZyJdLmFwcGx5 KHRoaXMsW2FycmF5W2ldXSk7fWNhdGNoKGVycil7dGhyb3cgZXJyO30Kcj1uZXcg T3BlbkxheWVycy5HZW9tZXRyeS5MaW5lYXJSaW5nKGwuY29tcG9uZW50cyk7cmlu Z3MucHVzaChyKTt9CnJldHVybiBuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2x5 Z29uKHJpbmdzKTt9LCJtdWx0aXBvbHlnb24iOmZ1bmN0aW9uKGFycmF5KXt2YXIg cG9seXM9W107dmFyIHA9bnVsbDtmb3IodmFyIGk9MCxsZW49YXJyYXkubGVuZ3Ro O2k8bGVuOysraSl7dHJ5e3A9dGhpcy5wYXJzZUNvb3Jkc1sicG9seWdvbiJdLmFw cGx5KHRoaXMsW2FycmF5W2ldXSk7fWNhdGNoKGVycil7dGhyb3cgZXJyO30KcG9s eXMucHVzaChwKTt9CnJldHVybiBuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5NdWx0 aVBvbHlnb24ocG9seXMpO30sImJveCI6ZnVuY3Rpb24oYXJyYXkpe2lmKGFycmF5 Lmxlbmd0aCE9Mil7dGhyb3ciR2VvSlNPTiBib3ggY29vcmRpbmF0ZXMgbXVzdCBo YXZlIDIgZWxlbWVudHMiO30KcmV0dXJuIG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5 LlBvbHlnb24oW25ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LkxpbmVhclJpbmcoW25l dyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KGFycmF5WzBdWzBdLGFycmF5WzBd WzFdKSxuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludChhcnJheVsxXVswXSxh cnJheVswXVsxXSksbmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQoYXJyYXlb MV1bMF0sYXJyYXlbMV1bMV0pLG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50 KGFycmF5WzBdWzBdLGFycmF5WzFdWzFdKSxuZXcgT3BlbkxheWVycy5HZW9tZXRy eS5Qb2ludChhcnJheVswXVswXSxhcnJheVswXVsxXSldKV0pO319LHdyaXRlOmZ1 bmN0aW9uKG9iaixwcmV0dHkpe3ZhciBnZW9qc29uPXsidHlwZSI6bnVsbH07aWYo T3BlbkxheWVycy5VdGlsLmlzQXJyYXkob2JqKSl7Z2VvanNvbi50eXBlPSJGZWF0 dXJlQ29sbGVjdGlvbiI7dmFyIG51bUZlYXR1cmVzPW9iai5sZW5ndGg7Z2VvanNv bi5mZWF0dXJlcz1uZXcgQXJyYXkobnVtRmVhdHVyZXMpO2Zvcih2YXIgaT0wO2k8 bnVtRmVhdHVyZXM7KytpKXt2YXIgZWxlbWVudD1vYmpbaV07aWYoIWVsZW1lbnQg aW5zdGFuY2VvZiBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9yKXt2YXIgbXNnPSJG ZWF0dXJlQ29sbGVjdGlvbiBvbmx5IHN1cHBvcnRzIGNvbGxlY3Rpb25zICIrIm9m IGZlYXR1cmVzOiAiK2VsZW1lbnQ7dGhyb3cgbXNnO30KZ2VvanNvbi5mZWF0dXJl c1tpXT10aGlzLmV4dHJhY3QuZmVhdHVyZS5hcHBseSh0aGlzLFtlbGVtZW50XSk7 fX1lbHNlIGlmKG9iai5DTEFTU19OQU1FLmluZGV4T2YoIk9wZW5MYXllcnMuR2Vv bWV0cnkiKT09MCl7Z2VvanNvbj10aGlzLmV4dHJhY3QuZ2VvbWV0cnkuYXBwbHko dGhpcyxbb2JqXSk7fWVsc2UgaWYob2JqIGluc3RhbmNlb2YgT3BlbkxheWVycy5G ZWF0dXJlLlZlY3Rvcil7Z2VvanNvbj10aGlzLmV4dHJhY3QuZmVhdHVyZS5hcHBs eSh0aGlzLFtvYmpdKTtpZihvYmoubGF5ZXImJm9iai5sYXllci5wcm9qZWN0aW9u KXtnZW9qc29uLmNycz10aGlzLmNyZWF0ZUNSU09iamVjdChvYmopO319CnJldHVy biBPcGVuTGF5ZXJzLkZvcm1hdC5KU09OLnByb3RvdHlwZS53cml0ZS5hcHBseSh0 aGlzLFtnZW9qc29uLHByZXR0eV0pO30sY3JlYXRlQ1JTT2JqZWN0OmZ1bmN0aW9u KG9iamVjdCl7dmFyIHByb2o9b2JqZWN0LmxheWVyLnByb2plY3Rpb24udG9TdHJp bmcoKTt2YXIgY3JzPXt9O2lmKHByb2oubWF0Y2goL2Vwc2c6L2kpKXt2YXIgY29k ZT1wYXJzZUludChwcm9qLnN1YnN0cmluZyhwcm9qLmluZGV4T2YoIjoiKSsxKSk7 aWYoY29kZT09NDMyNil7Y3JzPXsidHlwZSI6Im5hbWUiLCJwcm9wZXJ0aWVzIjp7 Im5hbWUiOiJ1cm46b2djOmRlZjpjcnM6T0dDOjEuMzpDUlM4NCJ9fTt9ZWxzZXtj cnM9eyJ0eXBlIjoibmFtZSIsInByb3BlcnRpZXMiOnsibmFtZSI6IkVQU0c6Iitj b2RlfX07fX0KcmV0dXJuIGNyczt9LGV4dHJhY3Q6eydmZWF0dXJlJzpmdW5jdGlv bihmZWF0dXJlKXt2YXIgZ2VvbT10aGlzLmV4dHJhY3QuZ2VvbWV0cnkuYXBwbHko dGhpcyxbZmVhdHVyZS5nZW9tZXRyeV0pO3ZhciBqc29uPXsidHlwZSI6IkZlYXR1 cmUiLCJwcm9wZXJ0aWVzIjpmZWF0dXJlLmF0dHJpYnV0ZXMsImdlb21ldHJ5Ijpn ZW9tfTtpZihmZWF0dXJlLmZpZCE9bnVsbCl7anNvbi5pZD1mZWF0dXJlLmZpZDt9 CnJldHVybiBqc29uO30sJ2dlb21ldHJ5JzpmdW5jdGlvbihnZW9tZXRyeSl7aWYo Z2VvbWV0cnk9PW51bGwpe3JldHVybiBudWxsO30KaWYodGhpcy5pbnRlcm5hbFBy b2plY3Rpb24mJnRoaXMuZXh0ZXJuYWxQcm9qZWN0aW9uKXtnZW9tZXRyeT1nZW9t ZXRyeS5jbG9uZSgpO2dlb21ldHJ5LnRyYW5zZm9ybSh0aGlzLmludGVybmFsUHJv amVjdGlvbix0aGlzLmV4dGVybmFsUHJvamVjdGlvbik7fQp2YXIgZ2VvbWV0cnlU eXBlPWdlb21ldHJ5LkNMQVNTX05BTUUuc3BsaXQoJy4nKVsyXTt2YXIgZGF0YT10 aGlzLmV4dHJhY3RbZ2VvbWV0cnlUeXBlLnRvTG93ZXJDYXNlKCldLmFwcGx5KHRo aXMsW2dlb21ldHJ5XSk7dmFyIGpzb247aWYoZ2VvbWV0cnlUeXBlPT0iQ29sbGVj dGlvbiIpe2pzb249eyJ0eXBlIjoiR2VvbWV0cnlDb2xsZWN0aW9uIiwiZ2VvbWV0 cmllcyI6ZGF0YX07fWVsc2V7anNvbj17InR5cGUiOmdlb21ldHJ5VHlwZSwiY29v cmRpbmF0ZXMiOmRhdGF9O30KcmV0dXJuIGpzb247fSwncG9pbnQnOmZ1bmN0aW9u KHBvaW50KXtyZXR1cm5bcG9pbnQueCxwb2ludC55XTt9LCdtdWx0aXBvaW50Jzpm dW5jdGlvbihtdWx0aXBvaW50KXt2YXIgYXJyYXk9W107Zm9yKHZhciBpPTAsbGVu PW11bHRpcG9pbnQuY29tcG9uZW50cy5sZW5ndGg7aTxsZW47KytpKXthcnJheS5w dXNoKHRoaXMuZXh0cmFjdC5wb2ludC5hcHBseSh0aGlzLFttdWx0aXBvaW50LmNv bXBvbmVudHNbaV1dKSk7fQpyZXR1cm4gYXJyYXk7fSwnbGluZXN0cmluZyc6ZnVu Y3Rpb24obGluZXN0cmluZyl7dmFyIGFycmF5PVtdO2Zvcih2YXIgaT0wLGxlbj1s aW5lc3RyaW5nLmNvbXBvbmVudHMubGVuZ3RoO2k8bGVuOysraSl7YXJyYXkucHVz aCh0aGlzLmV4dHJhY3QucG9pbnQuYXBwbHkodGhpcyxbbGluZXN0cmluZy5jb21w b25lbnRzW2ldXSkpO30KcmV0dXJuIGFycmF5O30sJ211bHRpbGluZXN0cmluZyc6 ZnVuY3Rpb24obXVsdGlsaW5lc3RyaW5nKXt2YXIgYXJyYXk9W107Zm9yKHZhciBp PTAsbGVuPW11bHRpbGluZXN0cmluZy5jb21wb25lbnRzLmxlbmd0aDtpPGxlbjsr K2kpe2FycmF5LnB1c2godGhpcy5leHRyYWN0LmxpbmVzdHJpbmcuYXBwbHkodGhp cyxbbXVsdGlsaW5lc3RyaW5nLmNvbXBvbmVudHNbaV1dKSk7fQpyZXR1cm4gYXJy YXk7fSwncG9seWdvbic6ZnVuY3Rpb24ocG9seWdvbil7dmFyIGFycmF5PVtdO2Zv cih2YXIgaT0wLGxlbj1wb2x5Z29uLmNvbXBvbmVudHMubGVuZ3RoO2k8bGVuOysr aSl7YXJyYXkucHVzaCh0aGlzLmV4dHJhY3QubGluZXN0cmluZy5hcHBseSh0aGlz LFtwb2x5Z29uLmNvbXBvbmVudHNbaV1dKSk7fQpyZXR1cm4gYXJyYXk7fSwnbXVs dGlwb2x5Z29uJzpmdW5jdGlvbihtdWx0aXBvbHlnb24pe3ZhciBhcnJheT1bXTtm b3IodmFyIGk9MCxsZW49bXVsdGlwb2x5Z29uLmNvbXBvbmVudHMubGVuZ3RoO2k8 bGVuOysraSl7YXJyYXkucHVzaCh0aGlzLmV4dHJhY3QucG9seWdvbi5hcHBseSh0 aGlzLFttdWx0aXBvbHlnb24uY29tcG9uZW50c1tpXV0pKTt9CnJldHVybiBhcnJh eTt9LCdjb2xsZWN0aW9uJzpmdW5jdGlvbihjb2xsZWN0aW9uKXt2YXIgbGVuPWNv bGxlY3Rpb24uY29tcG9uZW50cy5sZW5ndGg7dmFyIGFycmF5PW5ldyBBcnJheShs ZW4pO2Zvcih2YXIgaT0wO2k8bGVuOysraSl7YXJyYXlbaV09dGhpcy5leHRyYWN0 Lmdlb21ldHJ5LmFwcGx5KHRoaXMsW2NvbGxlY3Rpb24uY29tcG9uZW50c1tpXV0p O30KcmV0dXJuIGFycmF5O319LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0 Lkdlb0pTT04ifSk7T3BlbkxheWVycy5Qcm90b2NvbC5TY3JpcHQ9T3BlbkxheWVy cy5DbGFzcyhPcGVuTGF5ZXJzLlByb3RvY29sLHt1cmw6bnVsbCxwYXJhbXM6bnVs bCxjYWxsYmFjazpudWxsLHNjb3BlOm51bGwsZm9ybWF0Om51bGwsY2FsbGJhY2tL ZXk6ImNhbGxiYWNrIixjYWxsYmFja1ByZWZpeDoiIixwZW5kaW5nUmVxdWVzdHM6 bnVsbCxzcnNJbkJCT1g6ZmFsc2UsaW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25z KXtvcHRpb25zPW9wdGlvbnN8fHt9O3RoaXMucGFyYW1zPXt9O3RoaXMucGVuZGlu Z1JlcXVlc3RzPXt9O09wZW5MYXllcnMuUHJvdG9jb2wucHJvdG90eXBlLmluaXRp YWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmZvcm1hdCl7dGhp cy5mb3JtYXQ9bmV3IE9wZW5MYXllcnMuRm9ybWF0Lkdlb0pTT04oKTt9CmlmKCF0 aGlzLmZpbHRlclRvUGFyYW1zJiZPcGVuTGF5ZXJzLkZvcm1hdC5RdWVyeVN0cmlu Z0ZpbHRlcil7dmFyIGZvcm1hdD1uZXcgT3BlbkxheWVycy5Gb3JtYXQuUXVlcnlT dHJpbmdGaWx0ZXIoe3Nyc0luQkJPWDp0aGlzLnNyc0luQkJPWH0pO3RoaXMuZmls dGVyVG9QYXJhbXM9ZnVuY3Rpb24oZmlsdGVyLHBhcmFtcyl7cmV0dXJuIGZvcm1h dC53cml0ZShmaWx0ZXIscGFyYW1zKTt9fX0scmVhZDpmdW5jdGlvbihvcHRpb25z KXtPcGVuTGF5ZXJzLlByb3RvY29sLnByb3RvdHlwZS5yZWFkLmFwcGx5KHRoaXMs YXJndW1lbnRzKTtvcHRpb25zPU9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRz KG9wdGlvbnMsdGhpcy5vcHRpb25zKTtvcHRpb25zLnBhcmFtcz1PcGVuTGF5ZXJz LlV0aWwuYXBwbHlEZWZhdWx0cyhvcHRpb25zLnBhcmFtcyx0aGlzLm9wdGlvbnMu cGFyYW1zKTtpZihvcHRpb25zLmZpbHRlciYmdGhpcy5maWx0ZXJUb1BhcmFtcyl7 b3B0aW9ucy5wYXJhbXM9dGhpcy5maWx0ZXJUb1BhcmFtcyhvcHRpb25zLmZpbHRl cixvcHRpb25zLnBhcmFtcyk7fQp2YXIgcmVzcG9uc2U9bmV3IE9wZW5MYXllcnMu UHJvdG9jb2wuUmVzcG9uc2Uoe3JlcXVlc3RUeXBlOiJyZWFkIn0pO3ZhciByZXF1 ZXN0PXRoaXMuY3JlYXRlUmVxdWVzdChvcHRpb25zLnVybCxvcHRpb25zLnBhcmFt cyxPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQoZnVuY3Rpb24oZGF0YSl7cmVzcG9u c2UuZGF0YT1kYXRhO3RoaXMuaGFuZGxlUmVhZChyZXNwb25zZSxvcHRpb25zKTt9 LHRoaXMpKTtyZXNwb25zZS5wcml2PXJlcXVlc3Q7cmV0dXJuIHJlc3BvbnNlO30s Y3JlYXRlUmVxdWVzdDpmdW5jdGlvbih1cmwscGFyYW1zLGNhbGxiYWNrKXt2YXIg aWQ9T3BlbkxheWVycy5Qcm90b2NvbC5TY3JpcHQucmVnaXN0ZXIoY2FsbGJhY2sp O3ZhciBuYW1lPSJPcGVuTGF5ZXJzLlByb3RvY29sLlNjcmlwdC5yZWdpc3RyeVsi K2lkKyJdIjtwYXJhbXM9T3BlbkxheWVycy5VdGlsLmV4dGVuZCh7fSxwYXJhbXMp O3BhcmFtc1t0aGlzLmNhbGxiYWNrS2V5XT10aGlzLmNhbGxiYWNrUHJlZml4K25h bWU7dXJsPU9wZW5MYXllcnMuVXRpbC51cmxBcHBlbmQodXJsLE9wZW5MYXllcnMu VXRpbC5nZXRQYXJhbWV0ZXJTdHJpbmcocGFyYW1zKSk7dmFyIHNjcmlwdD1kb2N1 bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtzY3JpcHQudHlwZT0idGV4dC9q YXZhc2NyaXB0IjtzY3JpcHQuc3JjPXVybDtzY3JpcHQuaWQ9Ik9wZW5MYXllcnNf UHJvdG9jb2xfU2NyaXB0XyIraWQ7dGhpcy5wZW5kaW5nUmVxdWVzdHNbc2NyaXB0 LmlkXT1zY3JpcHQ7dmFyIGhlYWQ9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05h bWUoImhlYWQiKVswXTtoZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7cmV0dXJuIHNj cmlwdDt9LGRlc3Ryb3lSZXF1ZXN0OmZ1bmN0aW9uKHNjcmlwdCl7T3BlbkxheWVy cy5Qcm90b2NvbC5TY3JpcHQudW5yZWdpc3RlcihzY3JpcHQuaWQuc3BsaXQoIl8i KS5wb3AoKSk7ZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzW3NjcmlwdC5pZF07 aWYoc2NyaXB0LnBhcmVudE5vZGUpe3NjcmlwdC5wYXJlbnROb2RlLnJlbW92ZUNo aWxkKHNjcmlwdCk7fX0saGFuZGxlUmVhZDpmdW5jdGlvbihyZXNwb25zZSxvcHRp b25zKXt0aGlzLmhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlLG9wdGlvbnMpO30saGFu ZGxlUmVzcG9uc2U6ZnVuY3Rpb24ocmVzcG9uc2Usb3B0aW9ucyl7aWYob3B0aW9u cy5jYWxsYmFjayl7aWYocmVzcG9uc2UuZGF0YSl7cmVzcG9uc2UuZmVhdHVyZXM9 dGhpcy5wYXJzZUZlYXR1cmVzKHJlc3BvbnNlLmRhdGEpO3Jlc3BvbnNlLmNvZGU9 T3BlbkxheWVycy5Qcm90b2NvbC5SZXNwb25zZS5TVUNDRVNTO31lbHNle3Jlc3Bv bnNlLmNvZGU9T3BlbkxheWVycy5Qcm90b2NvbC5SZXNwb25zZS5GQUlMVVJFO30K dGhpcy5kZXN0cm95UmVxdWVzdChyZXNwb25zZS5wcml2KTtvcHRpb25zLmNhbGxi YWNrLmNhbGwob3B0aW9ucy5zY29wZSxyZXNwb25zZSk7fX0scGFyc2VGZWF0dXJl czpmdW5jdGlvbihkYXRhKXtyZXR1cm4gdGhpcy5mb3JtYXQucmVhZChkYXRhKTt9 LGFib3J0OmZ1bmN0aW9uKHJlc3BvbnNlKXtpZihyZXNwb25zZSl7dGhpcy5kZXN0 cm95UmVxdWVzdChyZXNwb25zZS5wcml2KTt9ZWxzZXtmb3IodmFyIGtleSBpbiB0 aGlzLnBlbmRpbmdSZXF1ZXN0cyl7dGhpcy5kZXN0cm95UmVxdWVzdCh0aGlzLnBl bmRpbmdSZXF1ZXN0c1trZXldKTt9fX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMu YWJvcnQoKTtkZWxldGUgdGhpcy5wYXJhbXM7ZGVsZXRlIHRoaXMuZm9ybWF0O09w ZW5MYXllcnMuUHJvdG9jb2wucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyk7 fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLlByb3RvY29sLlNjcmlwdCJ9KTsoZnVu Y3Rpb24oKXt2YXIgbz1PcGVuTGF5ZXJzLlByb3RvY29sLlNjcmlwdDt2YXIgY291 bnRlcj0wO28ucmVnaXN0cnk9W107by5yZWdpc3Rlcj1mdW5jdGlvbihjYWxsYmFj ayl7dmFyIGlkPSsrY291bnRlcjtvLnJlZ2lzdHJ5W2lkXT1mdW5jdGlvbigpe28u dW5yZWdpc3RlcihpZCk7Y2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpO307 cmV0dXJuIGlkO307by51bnJlZ2lzdGVyPWZ1bmN0aW9uKGlkKXtkZWxldGUgby5y ZWdpc3RyeVtpZF07fTt9KSgpO09wZW5MYXllcnMuRm9ybWF0LkNTV0dldFJlY29y ZHM9ZnVuY3Rpb24ob3B0aW9ucyl7b3B0aW9ucz1PcGVuTGF5ZXJzLlV0aWwuYXBw bHlEZWZhdWx0cyhvcHRpb25zLE9wZW5MYXllcnMuRm9ybWF0LkNTV0dldFJlY29y ZHMuREVGQVVMVFMpO3ZhciBjbHM9T3BlbkxheWVycy5Gb3JtYXQuQ1NXR2V0UmVj b3Jkc1sidiIrb3B0aW9ucy52ZXJzaW9uLnJlcGxhY2UoL1wuL2csIl8iKV07aWYo IWNscyl7dGhyb3ciVW5zdXBwb3J0ZWQgQ1NXR2V0UmVjb3JkcyB2ZXJzaW9uOiAi K29wdGlvbnMudmVyc2lvbjt9CnJldHVybiBuZXcgY2xzKG9wdGlvbnMpO307T3Bl bkxheWVycy5Gb3JtYXQuQ1NXR2V0UmVjb3Jkcy5ERUZBVUxUUz17InZlcnNpb24i OiIyLjAuMiJ9O09wZW5MYXllcnMuQ29udHJvbC5QYW5lbD1PcGVuTGF5ZXJzLkNs YXNzKE9wZW5MYXllcnMuQ29udHJvbCx7Y29udHJvbHM6bnVsbCxhdXRvQWN0aXZh dGU6dHJ1ZSxkZWZhdWx0Q29udHJvbDpudWxsLHNhdmVTdGF0ZTpmYWxzZSxhbGxv d0RlcHJlc3M6ZmFsc2UsYWN0aXZlU3RhdGU6bnVsbCxpbml0aWFsaXplOmZ1bmN0 aW9uKG9wdGlvbnMpe09wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUuaW5pdGlh bGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7dGhpcy5jb250cm9scz1bXTt0aGlz LmFjdGl2ZVN0YXRlPXt9O30sZGVzdHJveTpmdW5jdGlvbigpe09wZW5MYXllcnMu Q29udHJvbC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7 Zm9yKHZhciBjdGwsaT10aGlzLmNvbnRyb2xzLmxlbmd0aC0xO2k+PTA7aS0tKXtj dGw9dGhpcy5jb250cm9sc1tpXTtpZihjdGwuZXZlbnRzKXtjdGwuZXZlbnRzLnVu KHthY3RpdmF0ZTp0aGlzLmljb25PbixkZWFjdGl2YXRlOnRoaXMuaWNvbk9mZn0p O30KT3BlbkxheWVycy5FdmVudC5zdG9wT2JzZXJ2aW5nRWxlbWVudChjdGwucGFu ZWxfZGl2KTtjdGwucGFuZWxfZGl2PW51bGw7fQp0aGlzLmFjdGl2ZVN0YXRlPW51 bGw7fSxhY3RpdmF0ZTpmdW5jdGlvbigpe2lmKE9wZW5MYXllcnMuQ29udHJvbC5w cm90b3R5cGUuYWN0aXZhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgY29u dHJvbDtmb3IodmFyIGk9MCxsZW49dGhpcy5jb250cm9scy5sZW5ndGg7aTxsZW47 aSsrKXtjb250cm9sPXRoaXMuY29udHJvbHNbaV07aWYoY29udHJvbD09PXRoaXMu ZGVmYXVsdENvbnRyb2x8fCh0aGlzLnNhdmVTdGF0ZSYmdGhpcy5hY3RpdmVTdGF0 ZVtjb250cm9sLmlkXSkpe2NvbnRyb2wuYWN0aXZhdGUoKTt9fQppZih0aGlzLnNh dmVTdGF0ZT09PXRydWUpe3RoaXMuZGVmYXVsdENvbnRyb2w9bnVsbDt9CnRoaXMu cmVkcmF3KCk7cmV0dXJuIHRydWU7fWVsc2V7cmV0dXJuIGZhbHNlO319LGRlYWN0 aXZhdGU6ZnVuY3Rpb24oKXtpZihPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90eXBl LmRlYWN0aXZhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgY29udHJvbDtm b3IodmFyIGk9MCxsZW49dGhpcy5jb250cm9scy5sZW5ndGg7aTxsZW47aSsrKXtj b250cm9sPXRoaXMuY29udHJvbHNbaV07dGhpcy5hY3RpdmVTdGF0ZVtjb250cm9s LmlkXT1jb250cm9sLmRlYWN0aXZhdGUoKTt9CnRoaXMucmVkcmF3KCk7cmV0dXJu IHRydWU7fWVsc2V7cmV0dXJuIGZhbHNlO319LGRyYXc6ZnVuY3Rpb24oKXtPcGVu TGF5ZXJzLkNvbnRyb2wucHJvdG90eXBlLmRyYXcuYXBwbHkodGhpcyxhcmd1bWVu dHMpO3RoaXMuYWRkQ29udHJvbHNUb01hcCh0aGlzLmNvbnRyb2xzKTtyZXR1cm4g dGhpcy5kaXY7fSxyZWRyYXc6ZnVuY3Rpb24oKXtmb3IodmFyIGw9dGhpcy5kaXYu Y2hpbGROb2Rlcy5sZW5ndGgsaT1sLTE7aT49MDtpLS0pe3RoaXMuZGl2LnJlbW92 ZUNoaWxkKHRoaXMuZGl2LmNoaWxkTm9kZXNbaV0pO30KdGhpcy5kaXYuaW5uZXJI VE1MPSIiO2lmKHRoaXMuYWN0aXZlKXtmb3IodmFyIGk9MCxsZW49dGhpcy5jb250 cm9scy5sZW5ndGg7aTxsZW47aSsrKXt0aGlzLmRpdi5hcHBlbmRDaGlsZCh0aGlz LmNvbnRyb2xzW2ldLnBhbmVsX2Rpdik7fX19LGFjdGl2YXRlQ29udHJvbDpmdW5j dGlvbihjb250cm9sKXtpZighdGhpcy5hY3RpdmUpe3JldHVybiBmYWxzZTt9Cmlm KGNvbnRyb2wudHlwZT09T3BlbkxheWVycy5Db250cm9sLlRZUEVfQlVUVE9OKXtj b250cm9sLnRyaWdnZXIoKTtyZXR1cm47fQppZihjb250cm9sLnR5cGU9PU9wZW5M YXllcnMuQ29udHJvbC5UWVBFX1RPR0dMRSl7aWYoY29udHJvbC5hY3RpdmUpe2Nv bnRyb2wuZGVhY3RpdmF0ZSgpO31lbHNle2NvbnRyb2wuYWN0aXZhdGUoKTt9CnJl dHVybjt9CmlmKHRoaXMuYWxsb3dEZXByZXNzJiZjb250cm9sLmFjdGl2ZSl7Y29u dHJvbC5kZWFjdGl2YXRlKCk7fWVsc2V7dmFyIGM7Zm9yKHZhciBpPTAsbGVuPXRo aXMuY29udHJvbHMubGVuZ3RoO2k8bGVuO2krKyl7Yz10aGlzLmNvbnRyb2xzW2ld O2lmKGMhPWNvbnRyb2wmJihjLnR5cGU9PT1PcGVuTGF5ZXJzLkNvbnRyb2wuVFlQ RV9UT09MfHxjLnR5cGU9PW51bGwpKXtjLmRlYWN0aXZhdGUoKTt9fQpjb250cm9s LmFjdGl2YXRlKCk7fX0sYWRkQ29udHJvbHM6ZnVuY3Rpb24oY29udHJvbHMpe2lm KCEoT3BlbkxheWVycy5VdGlsLmlzQXJyYXkoY29udHJvbHMpKSl7Y29udHJvbHM9 W2NvbnRyb2xzXTt9CnRoaXMuY29udHJvbHM9dGhpcy5jb250cm9scy5jb25jYXQo Y29udHJvbHMpO2Zvcih2YXIgaT0wLGxlbj1jb250cm9scy5sZW5ndGg7aTxsZW47 aSsrKXt2YXIgZWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtl bGVtZW50LmNsYXNzTmFtZT1jb250cm9sc1tpXS5kaXNwbGF5Q2xhc3MrIkl0ZW1J bmFjdGl2ZSI7Y29udHJvbHNbaV0ucGFuZWxfZGl2PWVsZW1lbnQ7aWYoY29udHJv bHNbaV0udGl0bGUhPSIiKXtjb250cm9sc1tpXS5wYW5lbF9kaXYudGl0bGU9Y29u dHJvbHNbaV0udGl0bGU7fQpPcGVuTGF5ZXJzLkV2ZW50Lm9ic2VydmUoY29udHJv bHNbaV0ucGFuZWxfZGl2LCJjbGljayIsT3BlbkxheWVycy5GdW5jdGlvbi5iaW5k KHRoaXMub25DbGljayx0aGlzLGNvbnRyb2xzW2ldKSk7T3BlbkxheWVycy5FdmVu dC5vYnNlcnZlKGNvbnRyb2xzW2ldLnBhbmVsX2RpdiwiZGJsY2xpY2siLE9wZW5M YXllcnMuRnVuY3Rpb24uYmluZCh0aGlzLm9uRG91YmxlQ2xpY2ssdGhpcyxjb250 cm9sc1tpXSkpO09wZW5MYXllcnMuRXZlbnQub2JzZXJ2ZShjb250cm9sc1tpXS5w YW5lbF9kaXYsIm1vdXNlZG93biIsT3BlbkxheWVycy5GdW5jdGlvbi5iaW5kQXNF dmVudExpc3RlbmVyKE9wZW5MYXllcnMuRXZlbnQuc3RvcCkpO30KaWYodGhpcy5t YXApe3RoaXMuYWRkQ29udHJvbHNUb01hcChjb250cm9scyk7dGhpcy5yZWRyYXco KTt9fSxhZGRDb250cm9sc1RvTWFwOmZ1bmN0aW9uKGNvbnRyb2xzKXt2YXIgY29u dHJvbDtmb3IodmFyIGk9MCxsZW49Y29udHJvbHMubGVuZ3RoO2k8bGVuO2krKyl7 Y29udHJvbD1jb250cm9sc1tpXTtpZihjb250cm9sLmF1dG9BY3RpdmF0ZT09PXRy dWUpe2NvbnRyb2wuYXV0b0FjdGl2YXRlPWZhbHNlO3RoaXMubWFwLmFkZENvbnRy b2woY29udHJvbCk7Y29udHJvbC5hdXRvQWN0aXZhdGU9dHJ1ZTt9ZWxzZXt0aGlz Lm1hcC5hZGRDb250cm9sKGNvbnRyb2wpO2NvbnRyb2wuZGVhY3RpdmF0ZSgpO30K Y29udHJvbC5ldmVudHMub24oe2FjdGl2YXRlOnRoaXMuaWNvbk9uLGRlYWN0aXZh dGU6dGhpcy5pY29uT2ZmfSk7fX0saWNvbk9uOmZ1bmN0aW9uKCl7dmFyIGQ9dGhp cy5wYW5lbF9kaXY7ZC5jbGFzc05hbWU9ZC5jbGFzc05hbWUucmVwbGFjZSgvSXRl bUluYWN0aXZlJC8sIkl0ZW1BY3RpdmUiKTt9LGljb25PZmY6ZnVuY3Rpb24oKXt2 YXIgZD10aGlzLnBhbmVsX2RpdjtkLmNsYXNzTmFtZT1kLmNsYXNzTmFtZS5yZXBs YWNlKC9JdGVtQWN0aXZlJC8sIkl0ZW1JbmFjdGl2ZSIpO30sb25DbGljazpmdW5j dGlvbihjdHJsLGV2dCl7T3BlbkxheWVycy5FdmVudC5zdG9wKGV2dD9ldnQ6d2lu ZG93LmV2ZW50KTt0aGlzLmFjdGl2YXRlQ29udHJvbChjdHJsKTt9LG9uRG91Ymxl Q2xpY2s6ZnVuY3Rpb24oY3RybCxldnQpe09wZW5MYXllcnMuRXZlbnQuc3RvcChl dnQ/ZXZ0OndpbmRvdy5ldmVudCk7fSxnZXRDb250cm9sc0J5OmZ1bmN0aW9uKHBy b3BlcnR5LG1hdGNoKXt2YXIgdGVzdD0odHlwZW9mIG1hdGNoLnRlc3Q9PSJmdW5j dGlvbiIpO3ZhciBmb3VuZD1PcGVuTGF5ZXJzLkFycmF5LmZpbHRlcih0aGlzLmNv bnRyb2xzLGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBpdGVtW3Byb3BlcnR5XT09bWF0 Y2h8fCh0ZXN0JiZtYXRjaC50ZXN0KGl0ZW1bcHJvcGVydHldKSk7fSk7cmV0dXJu IGZvdW5kO30sZ2V0Q29udHJvbHNCeU5hbWU6ZnVuY3Rpb24obWF0Y2gpe3JldHVy biB0aGlzLmdldENvbnRyb2xzQnkoIm5hbWUiLG1hdGNoKTt9LGdldENvbnRyb2xz QnlDbGFzczpmdW5jdGlvbihtYXRjaCl7cmV0dXJuIHRoaXMuZ2V0Q29udHJvbHNC eSgiQ0xBU1NfTkFNRSIsbWF0Y2gpO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5D b250cm9sLlBhbmVsIn0pO09wZW5MYXllcnMuQ29udHJvbC5ab29tSW49T3Blbkxh eWVycy5DbGFzcyhPcGVuTGF5ZXJzLkNvbnRyb2wse3R5cGU6T3BlbkxheWVycy5D b250cm9sLlRZUEVfQlVUVE9OLHRyaWdnZXI6ZnVuY3Rpb24oKXt0aGlzLm1hcC56 b29tSW4oKTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuQ29udHJvbC5ab29tSW4i fSk7T3BlbkxheWVycy5Db250cm9sLlpvb21PdXQ9T3BlbkxheWVycy5DbGFzcyhP cGVuTGF5ZXJzLkNvbnRyb2wse3R5cGU6T3BlbkxheWVycy5Db250cm9sLlRZUEVf QlVUVE9OLHRyaWdnZXI6ZnVuY3Rpb24oKXt0aGlzLm1hcC56b29tT3V0KCk7fSxD TEFTU19OQU1FOiJPcGVuTGF5ZXJzLkNvbnRyb2wuWm9vbU91dCJ9KTtPcGVuTGF5 ZXJzLkNvbnRyb2wuWm9vbVRvTWF4RXh0ZW50PU9wZW5MYXllcnMuQ2xhc3MoT3Bl bkxheWVycy5Db250cm9sLHt0eXBlOk9wZW5MYXllcnMuQ29udHJvbC5UWVBFX0JV VFRPTix0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYodGhpcy5tYXApe3RoaXMubWFwLnpv b21Ub01heEV4dGVudCgpO319LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuQ29udHJv bC5ab29tVG9NYXhFeHRlbnQifSk7T3BlbkxheWVycy5Db250cm9sLlpvb21QYW5l bD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuQ29udHJvbC5QYW5lbCx7aW5p dGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXtPcGVuTGF5ZXJzLkNvbnRyb2wuUGFu ZWwucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxbb3B0aW9uc10pO3Ro aXMuYWRkQ29udHJvbHMoW25ldyBPcGVuTGF5ZXJzLkNvbnRyb2wuWm9vbUluKCks bmV3IE9wZW5MYXllcnMuQ29udHJvbC5ab29tVG9NYXhFeHRlbnQoKSxuZXcgT3Bl bkxheWVycy5Db250cm9sLlpvb21PdXQoKV0pO30sQ0xBU1NfTkFNRToiT3Blbkxh eWVycy5Db250cm9sLlpvb21QYW5lbCJ9KTtPcGVuTGF5ZXJzLkxheWVyLkhUVFBS ZXF1ZXN0PU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5MYXllcix7VVJMX0hB U0hfRkFDVE9SOihNYXRoLnNxcnQoNSktMSkvMix1cmw6bnVsbCxwYXJhbXM6bnVs bCxyZXByb2plY3Q6ZmFsc2UsaW5pdGlhbGl6ZTpmdW5jdGlvbihuYW1lLHVybCxw YXJhbXMsb3B0aW9ucyl7T3BlbkxheWVycy5MYXllci5wcm90b3R5cGUuaW5pdGlh bGl6ZS5hcHBseSh0aGlzLFtuYW1lLG9wdGlvbnNdKTt0aGlzLnVybD11cmw7dGhp cy5wYXJhbXM9T3BlbkxheWVycy5VdGlsLmV4dGVuZCh7fSxwYXJhbXMpO30sZGVz dHJveTpmdW5jdGlvbigpe3RoaXMudXJsPW51bGw7dGhpcy5wYXJhbXM9bnVsbDtP cGVuTGF5ZXJzLkxheWVyLnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJn dW1lbnRzKTt9LGNsb25lOmZ1bmN0aW9uKG9iail7aWYob2JqPT1udWxsKXtvYmo9 bmV3IE9wZW5MYXllcnMuTGF5ZXIuSFRUUFJlcXVlc3QodGhpcy5uYW1lLHRoaXMu dXJsLHRoaXMucGFyYW1zLHRoaXMuZ2V0T3B0aW9ucygpKTt9Cm9iaj1PcGVuTGF5 ZXJzLkxheWVyLnByb3RvdHlwZS5jbG9uZS5hcHBseSh0aGlzLFtvYmpdKTtyZXR1 cm4gb2JqO30sc2V0VXJsOmZ1bmN0aW9uKG5ld1VybCl7dGhpcy51cmw9bmV3VXJs O30sbWVyZ2VOZXdQYXJhbXM6ZnVuY3Rpb24obmV3UGFyYW1zKXt0aGlzLnBhcmFt cz1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHRoaXMucGFyYW1zLG5ld1BhcmFtcyk7 dmFyIHJldD10aGlzLnJlZHJhdygpO2lmKHRoaXMubWFwIT1udWxsKXt0aGlzLm1h cC5ldmVudHMudHJpZ2dlckV2ZW50KCJjaGFuZ2VsYXllciIse2xheWVyOnRoaXMs cHJvcGVydHk6InBhcmFtcyJ9KTt9CnJldHVybiByZXQ7fSxyZWRyYXc6ZnVuY3Rp b24oZm9yY2Upe2lmKGZvcmNlKXtyZXR1cm4gdGhpcy5tZXJnZU5ld1BhcmFtcyh7 Il9vbFNhbHQiOk1hdGgucmFuZG9tKCl9KTt9ZWxzZXtyZXR1cm4gT3BlbkxheWVy cy5MYXllci5wcm90b3R5cGUucmVkcmF3LmFwcGx5KHRoaXMsW10pO319LHNlbGVj dFVybDpmdW5jdGlvbihwYXJhbVN0cmluZyx1cmxzKXt2YXIgcHJvZHVjdD0xO2Zv cih2YXIgaT0wLGxlbj1wYXJhbVN0cmluZy5sZW5ndGg7aTxsZW47aSsrKXtwcm9k dWN0Kj1wYXJhbVN0cmluZy5jaGFyQ29kZUF0KGkpKnRoaXMuVVJMX0hBU0hfRkFD VE9SO3Byb2R1Y3QtPU1hdGguZmxvb3IocHJvZHVjdCk7fQpyZXR1cm4gdXJsc1tN YXRoLmZsb29yKHByb2R1Y3QqdXJscy5sZW5ndGgpXTt9LGdldEZ1bGxSZXF1ZXN0 U3RyaW5nOmZ1bmN0aW9uKG5ld1BhcmFtcyxhbHRVcmwpe3ZhciB1cmw9YWx0VXJs fHx0aGlzLnVybDt2YXIgYWxsUGFyYW1zPU9wZW5MYXllcnMuVXRpbC5leHRlbmQo e30sdGhpcy5wYXJhbXMpO2FsbFBhcmFtcz1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5k KGFsbFBhcmFtcyxuZXdQYXJhbXMpO3ZhciBwYXJhbXNTdHJpbmc9T3BlbkxheWVy cy5VdGlsLmdldFBhcmFtZXRlclN0cmluZyhhbGxQYXJhbXMpO2lmKE9wZW5MYXll cnMuVXRpbC5pc0FycmF5KHVybCkpe3VybD10aGlzLnNlbGVjdFVybChwYXJhbXNT dHJpbmcsdXJsKTt9CnZhciB1cmxQYXJhbXM9T3BlbkxheWVycy5VdGlsLnVwcGVy Q2FzZU9iamVjdChPcGVuTGF5ZXJzLlV0aWwuZ2V0UGFyYW1ldGVycyh1cmwpKTtm b3IodmFyIGtleSBpbiBhbGxQYXJhbXMpe2lmKGtleS50b1VwcGVyQ2FzZSgpaW4g dXJsUGFyYW1zKXtkZWxldGUgYWxsUGFyYW1zW2tleV07fX0KcGFyYW1zU3RyaW5n PU9wZW5MYXllcnMuVXRpbC5nZXRQYXJhbWV0ZXJTdHJpbmcoYWxsUGFyYW1zKTty ZXR1cm4gT3BlbkxheWVycy5VdGlsLnVybEFwcGVuZCh1cmwscGFyYW1zU3RyaW5n KTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuTGF5ZXIuSFRUUFJlcXVlc3QifSk7 T3BlbkxheWVycy5MYXllci5HcmlkPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVy cy5MYXllci5IVFRQUmVxdWVzdCx7dGlsZVNpemU6bnVsbCx0aWxlT3JpZ2luQ29y bmVyOiJibCIsdGlsZU9yaWdpbjpudWxsLHRpbGVPcHRpb25zOm51bGwsZ3JpZDpu dWxsLHNpbmdsZVRpbGU6ZmFsc2UscmF0aW86MS41LGJ1ZmZlcjowLG51bUxvYWRp bmdUaWxlczowLHRpbGVMb2FkaW5nRGVsYXk6MTAwLHRpbWVySWQ6bnVsbCxpbml0 aWFsaXplOmZ1bmN0aW9uKG5hbWUsdXJsLHBhcmFtcyxvcHRpb25zKXtPcGVuTGF5 ZXJzLkxheWVyLkhUVFBSZXF1ZXN0LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5 KHRoaXMsYXJndW1lbnRzKTt0aGlzLmV2ZW50cy5hZGRFdmVudFR5cGUoInRpbGVs b2FkZWQiKTt0aGlzLmdyaWQ9W107dGhpcy5fbW92ZUdyaWRkZWRUaWxlcz1PcGVu TGF5ZXJzLkZ1bmN0aW9uLmJpbmQodGhpcy5tb3ZlR3JpZGRlZFRpbGVzLHRoaXMp O30scmVtb3ZlTWFwOmZ1bmN0aW9uKG1hcCl7aWYodGhpcy50aW1lcklkIT1udWxs KXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGltZXJJZCk7dGhpcy50aW1lcklk PW51bGw7fX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuY2xlYXJHcmlkKCk7dGhp cy5ncmlkPW51bGw7dGhpcy50aWxlU2l6ZT1udWxsO09wZW5MYXllcnMuTGF5ZXIu SFRUUFJlcXVlc3QucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVu dHMpO30sY2xlYXJHcmlkOmZ1bmN0aW9uKCl7aWYodGhpcy5ncmlkKXtmb3IodmFy IGlSb3c9MCxsZW49dGhpcy5ncmlkLmxlbmd0aDtpUm93PGxlbjtpUm93Kyspe3Zh ciByb3c9dGhpcy5ncmlkW2lSb3ddO2Zvcih2YXIgaUNvbD0wLGNsZW49cm93Lmxl bmd0aDtpQ29sPGNsZW47aUNvbCsrKXt2YXIgdGlsZT1yb3dbaUNvbF07dGhpcy5y ZW1vdmVUaWxlTW9uaXRvcmluZ0hvb2tzKHRpbGUpO3RpbGUuZGVzdHJveSgpO319 CnRoaXMuZ3JpZD1bXTt9fSxjbG9uZTpmdW5jdGlvbihvYmope2lmKG9iaj09bnVs bCl7b2JqPW5ldyBPcGVuTGF5ZXJzLkxheWVyLkdyaWQodGhpcy5uYW1lLHRoaXMu dXJsLHRoaXMucGFyYW1zLHRoaXMuZ2V0T3B0aW9ucygpKTt9Cm9iaj1PcGVuTGF5 ZXJzLkxheWVyLkhUVFBSZXF1ZXN0LnByb3RvdHlwZS5jbG9uZS5hcHBseSh0aGlz LFtvYmpdKTtpZih0aGlzLnRpbGVTaXplIT1udWxsKXtvYmoudGlsZVNpemU9dGhp cy50aWxlU2l6ZS5jbG9uZSgpO30Kb2JqLmdyaWQ9W107cmV0dXJuIG9iajt9LG1v dmVUbzpmdW5jdGlvbihib3VuZHMsem9vbUNoYW5nZWQsZHJhZ2dpbmcpe09wZW5M YXllcnMuTGF5ZXIuSFRUUFJlcXVlc3QucHJvdG90eXBlLm1vdmVUby5hcHBseSh0 aGlzLGFyZ3VtZW50cyk7Ym91bmRzPWJvdW5kc3x8dGhpcy5tYXAuZ2V0RXh0ZW50 KCk7aWYoYm91bmRzIT1udWxsKXt2YXIgZm9yY2VSZVRpbGU9IXRoaXMuZ3JpZC5s ZW5ndGh8fHpvb21DaGFuZ2VkO3ZhciB0aWxlc0JvdW5kcz10aGlzLmdldFRpbGVz Qm91bmRzKCk7aWYodGhpcy5zaW5nbGVUaWxlKXtpZihmb3JjZVJlVGlsZXx8KCFk cmFnZ2luZyYmIXRpbGVzQm91bmRzLmNvbnRhaW5zQm91bmRzKGJvdW5kcykpKXt0 aGlzLmluaXRTaW5nbGVUaWxlKGJvdW5kcyk7fX1lbHNle2lmKGZvcmNlUmVUaWxl fHwhdGlsZXNCb3VuZHMuY29udGFpbnNCb3VuZHMoYm91bmRzLHRydWUpKXt0aGlz LmluaXRHcmlkZGVkVGlsZXMoYm91bmRzKTt9ZWxzZXt0aGlzLnNjaGVkdWxlTW92 ZUdyaWRkZWRUaWxlcygpO319fX0sbW92ZUJ5UHg6ZnVuY3Rpb24oZHgsZHkpe2lm KCF0aGlzLnNpbmdsZVRpbGUpe3RoaXMuc2NoZWR1bGVNb3ZlR3JpZGRlZFRpbGVz KCk7fX0sc2NoZWR1bGVNb3ZlR3JpZGRlZFRpbGVzOmZ1bmN0aW9uKCl7aWYodGhp cy50aW1lcklkIT1udWxsKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGltZXJJ ZCk7fQp0aGlzLnRpbWVySWQ9d2luZG93LnNldFRpbWVvdXQodGhpcy5fbW92ZUdy aWRkZWRUaWxlcyx0aGlzLnRpbGVMb2FkaW5nRGVsYXkpO30sc2V0VGlsZVNpemU6 ZnVuY3Rpb24oc2l6ZSl7aWYodGhpcy5zaW5nbGVUaWxlKXtzaXplPXRoaXMubWFw LmdldFNpemUoKTtzaXplLmg9cGFyc2VJbnQoc2l6ZS5oKnRoaXMucmF0aW8pO3Np emUudz1wYXJzZUludChzaXplLncqdGhpcy5yYXRpbyk7fQpPcGVuTGF5ZXJzLkxh eWVyLkhUVFBSZXF1ZXN0LnByb3RvdHlwZS5zZXRUaWxlU2l6ZS5hcHBseSh0aGlz LFtzaXplXSk7fSxnZXRHcmlkQm91bmRzOmZ1bmN0aW9uKCl7dmFyIG1zZz0iVGhl IGdldEdyaWRCb3VuZHMoKSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiBJdCB3aWxs IGJlICIrInJlbW92ZWQgaW4gMy4wLiBQbGVhc2UgdXNlIGdldFRpbGVzQm91bmRz KCkgaW5zdGVhZC4iO09wZW5MYXllcnMuQ29uc29sZS53YXJuKG1zZyk7cmV0dXJu IHRoaXMuZ2V0VGlsZXNCb3VuZHMoKTt9LGdldFRpbGVzQm91bmRzOmZ1bmN0aW9u KCl7dmFyIGJvdW5kcz1udWxsO2lmKHRoaXMuZ3JpZC5sZW5ndGgpe3ZhciBib3R0 b209dGhpcy5ncmlkLmxlbmd0aC0xO3ZhciBib3R0b21MZWZ0VGlsZT10aGlzLmdy aWRbYm90dG9tXVswXTt2YXIgcmlnaHQ9dGhpcy5ncmlkWzBdLmxlbmd0aC0xO3Zh ciB0b3BSaWdodFRpbGU9dGhpcy5ncmlkWzBdW3JpZ2h0XTtib3VuZHM9bmV3IE9w ZW5MYXllcnMuQm91bmRzKGJvdHRvbUxlZnRUaWxlLmJvdW5kcy5sZWZ0LGJvdHRv bUxlZnRUaWxlLmJvdW5kcy5ib3R0b20sdG9wUmlnaHRUaWxlLmJvdW5kcy5yaWdo dCx0b3BSaWdodFRpbGUuYm91bmRzLnRvcCk7fQpyZXR1cm4gYm91bmRzO30saW5p dFNpbmdsZVRpbGU6ZnVuY3Rpb24oYm91bmRzKXt2YXIgY2VudGVyPWJvdW5kcy5n ZXRDZW50ZXJMb25MYXQoKTt2YXIgdGlsZVdpZHRoPWJvdW5kcy5nZXRXaWR0aCgp KnRoaXMucmF0aW87dmFyIHRpbGVIZWlnaHQ9Ym91bmRzLmdldEhlaWdodCgpKnRo aXMucmF0aW87dmFyIHRpbGVCb3VuZHM9bmV3IE9wZW5MYXllcnMuQm91bmRzKGNl bnRlci5sb24tKHRpbGVXaWR0aC8yKSxjZW50ZXIubGF0LSh0aWxlSGVpZ2h0LzIp LGNlbnRlci5sb24rKHRpbGVXaWR0aC8yKSxjZW50ZXIubGF0Kyh0aWxlSGVpZ2h0 LzIpKTt2YXIgdWw9bmV3IE9wZW5MYXllcnMuTG9uTGF0KHRpbGVCb3VuZHMubGVm dCx0aWxlQm91bmRzLnRvcCk7dmFyIHB4PXRoaXMubWFwLmdldExheWVyUHhGcm9t TG9uTGF0KHVsKTtpZighdGhpcy5ncmlkLmxlbmd0aCl7dGhpcy5ncmlkWzBdPVtd O30KdmFyIHRpbGU9dGhpcy5ncmlkWzBdWzBdO2lmKCF0aWxlKXt0aWxlPXRoaXMu YWRkVGlsZSh0aWxlQm91bmRzLHB4KTt0aGlzLmFkZFRpbGVNb25pdG9yaW5nSG9v a3ModGlsZSk7dGlsZS5kcmF3KCk7dGhpcy5ncmlkWzBdWzBdPXRpbGU7fWVsc2V7 dGlsZS5tb3ZlVG8odGlsZUJvdW5kcyxweCk7fQp0aGlzLnJlbW92ZUV4Y2Vzc1Rp bGVzKDEsMSk7fSxjYWxjdWxhdGVHcmlkTGF5b3V0OmZ1bmN0aW9uKGJvdW5kcyxv cmlnaW4scmVzb2x1dGlvbil7dmFyIHRpbGVsb249cmVzb2x1dGlvbip0aGlzLnRp bGVTaXplLnc7dmFyIHRpbGVsYXQ9cmVzb2x1dGlvbip0aGlzLnRpbGVTaXplLmg7 dmFyIG9mZnNldGxvbj1ib3VuZHMubGVmdC1vcmlnaW4ubG9uO3ZhciB0aWxlY29s PU1hdGguZmxvb3Iob2Zmc2V0bG9uL3RpbGVsb24pLXRoaXMuYnVmZmVyO3ZhciB0 aWxlY29scmVtYWluPW9mZnNldGxvbi90aWxlbG9uLXRpbGVjb2w7dmFyIHRpbGVv ZmZzZXR4PS10aWxlY29scmVtYWluKnRoaXMudGlsZVNpemUudzt2YXIgdGlsZW9m ZnNldGxvbj1vcmlnaW4ubG9uK3RpbGVjb2wqdGlsZWxvbjt2YXIgb2Zmc2V0bGF0 PWJvdW5kcy50b3AtKG9yaWdpbi5sYXQrdGlsZWxhdCk7dmFyIHRpbGVyb3c9TWF0 aC5jZWlsKG9mZnNldGxhdC90aWxlbGF0KSt0aGlzLmJ1ZmZlcjt2YXIgdGlsZXJv d3JlbWFpbj10aWxlcm93LW9mZnNldGxhdC90aWxlbGF0O3ZhciB0aWxlb2Zmc2V0 eT0tdGlsZXJvd3JlbWFpbip0aGlzLnRpbGVTaXplLmg7dmFyIHRpbGVvZmZzZXRs YXQ9b3JpZ2luLmxhdCt0aWxlcm93KnRpbGVsYXQ7cmV0dXJue3RpbGVsb246dGls ZWxvbix0aWxlbGF0OnRpbGVsYXQsdGlsZW9mZnNldGxvbjp0aWxlb2Zmc2V0bG9u LHRpbGVvZmZzZXRsYXQ6dGlsZW9mZnNldGxhdCx0aWxlb2Zmc2V0eDp0aWxlb2Zm c2V0eCx0aWxlb2Zmc2V0eTp0aWxlb2Zmc2V0eX07fSxnZXRUaWxlT3JpZ2luOmZ1 bmN0aW9uKCl7dmFyIG9yaWdpbj10aGlzLnRpbGVPcmlnaW47aWYoIW9yaWdpbil7 dmFyIGV4dGVudD10aGlzLmdldE1heEV4dGVudCgpO3ZhciBlZGdlcz0oeyJ0bCI6 WyJsZWZ0IiwidG9wIl0sInRyIjpbInJpZ2h0IiwidG9wIl0sImJsIjpbImxlZnQi LCJib3R0b20iXSwiYnIiOlsicmlnaHQiLCJib3R0b20iXX0pW3RoaXMudGlsZU9y aWdpbkNvcm5lcl07b3JpZ2luPW5ldyBPcGVuTGF5ZXJzLkxvbkxhdChleHRlbnRb ZWRnZXNbMF1dLGV4dGVudFtlZGdlc1sxXV0pO30KcmV0dXJuIG9yaWdpbjt9LGlu aXRHcmlkZGVkVGlsZXM6ZnVuY3Rpb24oYm91bmRzKXt2YXIgdmlld1NpemU9dGhp cy5tYXAuZ2V0U2l6ZSgpO3ZhciBtaW5Sb3dzPU1hdGguY2VpbCh2aWV3U2l6ZS5o L3RoaXMudGlsZVNpemUuaCkrCk1hdGgubWF4KDEsMip0aGlzLmJ1ZmZlcik7dmFy IG1pbkNvbHM9TWF0aC5jZWlsKHZpZXdTaXplLncvdGhpcy50aWxlU2l6ZS53KSsK TWF0aC5tYXgoMSwyKnRoaXMuYnVmZmVyKTt2YXIgb3JpZ2luPXRoaXMuZ2V0VGls ZU9yaWdpbigpO3ZhciByZXNvbHV0aW9uPXRoaXMubWFwLmdldFJlc29sdXRpb24o KTt2YXIgdGlsZUxheW91dD10aGlzLmNhbGN1bGF0ZUdyaWRMYXlvdXQoYm91bmRz LG9yaWdpbixyZXNvbHV0aW9uKTt2YXIgdGlsZW9mZnNldHg9TWF0aC5yb3VuZCh0 aWxlTGF5b3V0LnRpbGVvZmZzZXR4KTt2YXIgdGlsZW9mZnNldHk9TWF0aC5yb3Vu ZCh0aWxlTGF5b3V0LnRpbGVvZmZzZXR5KTt2YXIgdGlsZW9mZnNldGxvbj10aWxl TGF5b3V0LnRpbGVvZmZzZXRsb247dmFyIHRpbGVvZmZzZXRsYXQ9dGlsZUxheW91 dC50aWxlb2Zmc2V0bGF0O3ZhciB0aWxlbG9uPXRpbGVMYXlvdXQudGlsZWxvbjt2 YXIgdGlsZWxhdD10aWxlTGF5b3V0LnRpbGVsYXQ7dGhpcy5vcmlnaW49bmV3IE9w ZW5MYXllcnMuUGl4ZWwodGlsZW9mZnNldHgsdGlsZW9mZnNldHkpO3ZhciBzdGFy dFg9dGlsZW9mZnNldHg7dmFyIHN0YXJ0TG9uPXRpbGVvZmZzZXRsb247dmFyIHJv d2lkeD0wO3ZhciBsYXllckNvbnRhaW5lckRpdkxlZnQ9cGFyc2VJbnQodGhpcy5t YXAubGF5ZXJDb250YWluZXJEaXYuc3R5bGUubGVmdCk7dmFyIGxheWVyQ29udGFp bmVyRGl2VG9wPXBhcnNlSW50KHRoaXMubWFwLmxheWVyQ29udGFpbmVyRGl2LnN0 eWxlLnRvcCk7ZG97dmFyIHJvdz10aGlzLmdyaWRbcm93aWR4KytdO2lmKCFyb3cp e3Jvdz1bXTt0aGlzLmdyaWQucHVzaChyb3cpO30KdGlsZW9mZnNldGxvbj1zdGFy dExvbjt0aWxlb2Zmc2V0eD1zdGFydFg7dmFyIGNvbGlkeD0wO2Rve3ZhciB0aWxl Qm91bmRzPW5ldyBPcGVuTGF5ZXJzLkJvdW5kcyh0aWxlb2Zmc2V0bG9uLHRpbGVv ZmZzZXRsYXQsdGlsZW9mZnNldGxvbit0aWxlbG9uLHRpbGVvZmZzZXRsYXQrdGls ZWxhdCk7dmFyIHg9dGlsZW9mZnNldHg7eC09bGF5ZXJDb250YWluZXJEaXZMZWZ0 O3ZhciB5PXRpbGVvZmZzZXR5O3ktPWxheWVyQ29udGFpbmVyRGl2VG9wO3ZhciBw eD1uZXcgT3BlbkxheWVycy5QaXhlbCh4LHkpO3ZhciB0aWxlPXJvd1tjb2xpZHgr K107aWYoIXRpbGUpe3RpbGU9dGhpcy5hZGRUaWxlKHRpbGVCb3VuZHMscHgpO3Ro aXMuYWRkVGlsZU1vbml0b3JpbmdIb29rcyh0aWxlKTtyb3cucHVzaCh0aWxlKTt9 ZWxzZXt0aWxlLm1vdmVUbyh0aWxlQm91bmRzLHB4LGZhbHNlKTt9CnRpbGVvZmZz ZXRsb24rPXRpbGVsb247dGlsZW9mZnNldHgrPXRoaXMudGlsZVNpemUudzt9d2hp bGUoKHRpbGVvZmZzZXRsb248PWJvdW5kcy5yaWdodCt0aWxlbG9uKnRoaXMuYnVm ZmVyKXx8Y29saWR4PG1pbkNvbHMpO3RpbGVvZmZzZXRsYXQtPXRpbGVsYXQ7dGls ZW9mZnNldHkrPXRoaXMudGlsZVNpemUuaDt9d2hpbGUoKHRpbGVvZmZzZXRsYXQ+ PWJvdW5kcy5ib3R0b20tdGlsZWxhdCp0aGlzLmJ1ZmZlcil8fHJvd2lkeDxtaW5S b3dzKTt0aGlzLnJlbW92ZUV4Y2Vzc1RpbGVzKHJvd2lkeCxjb2xpZHgpO3RoaXMu c3BpcmFsVGlsZUxvYWQoKTt9LGdldE1heEV4dGVudDpmdW5jdGlvbigpe3JldHVy biB0aGlzLm1heEV4dGVudDt9LHNwaXJhbFRpbGVMb2FkOmZ1bmN0aW9uKCl7dmFy IHRpbGVRdWV1ZT1bXTt2YXIgZGlyZWN0aW9ucz1bInJpZ2h0IiwiZG93biIsImxl ZnQiLCJ1cCJdO3ZhciBpUm93PTA7dmFyIGlDZWxsPS0xO3ZhciBkaXJlY3Rpb249 T3BlbkxheWVycy5VdGlsLmluZGV4T2YoZGlyZWN0aW9ucywicmlnaHQiKTt2YXIg ZGlyZWN0aW9uc1RyaWVkPTA7d2hpbGUoZGlyZWN0aW9uc1RyaWVkPGRpcmVjdGlv bnMubGVuZ3RoKXt2YXIgdGVzdFJvdz1pUm93O3ZhciB0ZXN0Q2VsbD1pQ2VsbDtz d2l0Y2goZGlyZWN0aW9uc1tkaXJlY3Rpb25dKXtjYXNlInJpZ2h0Ijp0ZXN0Q2Vs bCsrO2JyZWFrO2Nhc2UiZG93biI6dGVzdFJvdysrO2JyZWFrO2Nhc2UibGVmdCI6 dGVzdENlbGwtLTticmVhaztjYXNlInVwIjp0ZXN0Um93LS07YnJlYWs7fQp2YXIg dGlsZT1udWxsO2lmKCh0ZXN0Um93PHRoaXMuZ3JpZC5sZW5ndGgpJiYodGVzdFJv dz49MCkmJih0ZXN0Q2VsbDx0aGlzLmdyaWRbMF0ubGVuZ3RoKSYmKHRlc3RDZWxs Pj0wKSl7dGlsZT10aGlzLmdyaWRbdGVzdFJvd11bdGVzdENlbGxdO30KaWYoKHRp bGUhPW51bGwpJiYoIXRpbGUucXVldWVkKSl7dGlsZVF1ZXVlLnVuc2hpZnQodGls ZSk7dGlsZS5xdWV1ZWQ9dHJ1ZTtkaXJlY3Rpb25zVHJpZWQ9MDtpUm93PXRlc3RS b3c7aUNlbGw9dGVzdENlbGw7fWVsc2V7ZGlyZWN0aW9uPShkaXJlY3Rpb24rMSkl NDtkaXJlY3Rpb25zVHJpZWQrKzt9fQpmb3IodmFyIGk9MCxsZW49dGlsZVF1ZXVl Lmxlbmd0aDtpPGxlbjtpKyspe3ZhciB0aWxlPXRpbGVRdWV1ZVtpXTt0aWxlLmRy YXcoKTt0aWxlLnF1ZXVlZD1mYWxzZTt9fSxhZGRUaWxlOmZ1bmN0aW9uKGJvdW5k cyxwb3NpdGlvbil7cmV0dXJuIG5ldyBPcGVuTGF5ZXJzLlRpbGUuSW1hZ2UodGhp cyxwb3NpdGlvbixib3VuZHMsbnVsbCx0aGlzLnRpbGVTaXplLHRoaXMudGlsZU9w dGlvbnMpO30sYWRkVGlsZU1vbml0b3JpbmdIb29rczpmdW5jdGlvbih0aWxlKXt0 aWxlLm9uTG9hZFN0YXJ0PWZ1bmN0aW9uKCl7aWYodGhpcy5udW1Mb2FkaW5nVGls ZXM9PTApe3RoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgibG9hZHN0YXJ0Iik7fQp0 aGlzLm51bUxvYWRpbmdUaWxlcysrO307dGlsZS5ldmVudHMucmVnaXN0ZXIoImxv YWRzdGFydCIsdGhpcyx0aWxlLm9uTG9hZFN0YXJ0KTt0aWxlLm9uTG9hZEVuZD1m dW5jdGlvbigpe3RoaXMubnVtTG9hZGluZ1RpbGVzLS07dGhpcy5ldmVudHMudHJp Z2dlckV2ZW50KCJ0aWxlbG9hZGVkIik7aWYodGhpcy5udW1Mb2FkaW5nVGlsZXM9 PTApe3RoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgibG9hZGVuZCIpO319O3RpbGUu ZXZlbnRzLnJlZ2lzdGVyKCJsb2FkZW5kIix0aGlzLHRpbGUub25Mb2FkRW5kKTt0 aWxlLmV2ZW50cy5yZWdpc3RlcigidW5sb2FkIix0aGlzLHRpbGUub25Mb2FkRW5k KTt9LHJlbW92ZVRpbGVNb25pdG9yaW5nSG9va3M6ZnVuY3Rpb24odGlsZSl7dGls ZS51bmxvYWQoKTt0aWxlLmV2ZW50cy51bih7ImxvYWRzdGFydCI6dGlsZS5vbkxv YWRTdGFydCwibG9hZGVuZCI6dGlsZS5vbkxvYWRFbmQsInVubG9hZCI6dGlsZS5v bkxvYWRFbmQsc2NvcGU6dGhpc30pO30sbW92ZUdyaWRkZWRUaWxlczpmdW5jdGlv bigpe3ZhciBzaGlmdGVkPXRydWU7dmFyIGJ1ZmZlcj10aGlzLmJ1ZmZlcnx8MTt2 YXIgdGxMYXllcj10aGlzLmdyaWRbMF1bMF0ucG9zaXRpb247dmFyIG9mZnNldFg9 cGFyc2VJbnQodGhpcy5tYXAubGF5ZXJDb250YWluZXJEaXYuc3R5bGUubGVmdCk7 dmFyIG9mZnNldFk9cGFyc2VJbnQodGhpcy5tYXAubGF5ZXJDb250YWluZXJEaXYu c3R5bGUudG9wKTt2YXIgdGxWaWV3UG9ydD10bExheWVyLmFkZChvZmZzZXRYLG9m ZnNldFkpO2lmKHRsVmlld1BvcnQueD4tdGhpcy50aWxlU2l6ZS53KihidWZmZXIt MSkpe3RoaXMuc2hpZnRDb2x1bW4odHJ1ZSk7fWVsc2UgaWYodGxWaWV3UG9ydC54 PC10aGlzLnRpbGVTaXplLncqYnVmZmVyKXt0aGlzLnNoaWZ0Q29sdW1uKGZhbHNl KTt9ZWxzZSBpZih0bFZpZXdQb3J0Lnk+LXRoaXMudGlsZVNpemUuaCooYnVmZmVy LTEpKXt0aGlzLnNoaWZ0Um93KHRydWUpO31lbHNlIGlmKHRsVmlld1BvcnQueTwt dGhpcy50aWxlU2l6ZS5oKmJ1ZmZlcil7dGhpcy5zaGlmdFJvdyhmYWxzZSk7fWVs c2V7c2hpZnRlZD1mYWxzZTt9CmlmKHNoaWZ0ZWQpe3RoaXMudGltZXJJZD13aW5k b3cuc2V0VGltZW91dCh0aGlzLl9tb3ZlR3JpZGRlZFRpbGVzLDApO319LHNoaWZ0 Um93OmZ1bmN0aW9uKHByZXBlbmQpe3ZhciBtb2RlbFJvd0luZGV4PShwcmVwZW5k KT8wOih0aGlzLmdyaWQubGVuZ3RoLTEpO3ZhciBncmlkPXRoaXMuZ3JpZDt2YXIg bW9kZWxSb3c9Z3JpZFttb2RlbFJvd0luZGV4XTt2YXIgcmVzb2x1dGlvbj10aGlz Lm1hcC5nZXRSZXNvbHV0aW9uKCk7dmFyIGRlbHRhWT0ocHJlcGVuZCk/LXRoaXMu dGlsZVNpemUuaDp0aGlzLnRpbGVTaXplLmg7dmFyIGRlbHRhTGF0PXJlc29sdXRp b24qLWRlbHRhWTt2YXIgcm93PShwcmVwZW5kKT9ncmlkLnBvcCgpOmdyaWQuc2hp ZnQoKTtmb3IodmFyIGk9MCxsZW49bW9kZWxSb3cubGVuZ3RoO2k8bGVuO2krKyl7 dmFyIG1vZGVsVGlsZT1tb2RlbFJvd1tpXTt2YXIgYm91bmRzPW1vZGVsVGlsZS5i b3VuZHMuY2xvbmUoKTt2YXIgcG9zaXRpb249bW9kZWxUaWxlLnBvc2l0aW9uLmNs b25lKCk7Ym91bmRzLmJvdHRvbT1ib3VuZHMuYm90dG9tK2RlbHRhTGF0O2JvdW5k cy50b3A9Ym91bmRzLnRvcCtkZWx0YUxhdDtwb3NpdGlvbi55PXBvc2l0aW9uLnkr ZGVsdGFZO3Jvd1tpXS5tb3ZlVG8oYm91bmRzLHBvc2l0aW9uKTt9CmlmKHByZXBl bmQpe2dyaWQudW5zaGlmdChyb3cpO31lbHNle2dyaWQucHVzaChyb3cpO319LHNo aWZ0Q29sdW1uOmZ1bmN0aW9uKHByZXBlbmQpe3ZhciBkZWx0YVg9KHByZXBlbmQp Py10aGlzLnRpbGVTaXplLnc6dGhpcy50aWxlU2l6ZS53O3ZhciByZXNvbHV0aW9u PXRoaXMubWFwLmdldFJlc29sdXRpb24oKTt2YXIgZGVsdGFMb249cmVzb2x1dGlv bipkZWx0YVg7Zm9yKHZhciBpPTAsbGVuPXRoaXMuZ3JpZC5sZW5ndGg7aTxsZW47 aSsrKXt2YXIgcm93PXRoaXMuZ3JpZFtpXTt2YXIgbW9kZWxUaWxlSW5kZXg9KHBy ZXBlbmQpPzA6KHJvdy5sZW5ndGgtMSk7dmFyIG1vZGVsVGlsZT1yb3dbbW9kZWxU aWxlSW5kZXhdO3ZhciBib3VuZHM9bW9kZWxUaWxlLmJvdW5kcy5jbG9uZSgpO3Zh ciBwb3NpdGlvbj1tb2RlbFRpbGUucG9zaXRpb24uY2xvbmUoKTtib3VuZHMubGVm dD1ib3VuZHMubGVmdCtkZWx0YUxvbjtib3VuZHMucmlnaHQ9Ym91bmRzLnJpZ2h0 K2RlbHRhTG9uO3Bvc2l0aW9uLng9cG9zaXRpb24ueCtkZWx0YVg7dmFyIHRpbGU9 cHJlcGVuZD90aGlzLmdyaWRbaV0ucG9wKCk6dGhpcy5ncmlkW2ldLnNoaWZ0KCk7 dGlsZS5tb3ZlVG8oYm91bmRzLHBvc2l0aW9uKTtpZihwcmVwZW5kKXtyb3cudW5z aGlmdCh0aWxlKTt9ZWxzZXtyb3cucHVzaCh0aWxlKTt9fX0scmVtb3ZlRXhjZXNz VGlsZXM6ZnVuY3Rpb24ocm93cyxjb2x1bW5zKXt3aGlsZSh0aGlzLmdyaWQubGVu Z3RoPnJvd3Mpe3ZhciByb3c9dGhpcy5ncmlkLnBvcCgpO2Zvcih2YXIgaT0wLGw9 cm93Lmxlbmd0aDtpPGw7aSsrKXt2YXIgdGlsZT1yb3dbaV07dGhpcy5yZW1vdmVU aWxlTW9uaXRvcmluZ0hvb2tzKHRpbGUpO3RpbGUuZGVzdHJveSgpO319CndoaWxl KHRoaXMuZ3JpZFswXS5sZW5ndGg+Y29sdW1ucyl7Zm9yKHZhciBpPTAsbD10aGlz LmdyaWQubGVuZ3RoO2k8bDtpKyspe3ZhciByb3c9dGhpcy5ncmlkW2ldO3ZhciB0 aWxlPXJvdy5wb3AoKTt0aGlzLnJlbW92ZVRpbGVNb25pdG9yaW5nSG9va3ModGls ZSk7dGlsZS5kZXN0cm95KCk7fX19LG9uTWFwUmVzaXplOmZ1bmN0aW9uKCl7aWYo dGhpcy5zaW5nbGVUaWxlKXt0aGlzLmNsZWFyR3JpZCgpO3RoaXMuc2V0VGlsZVNp emUoKTt9fSxnZXRUaWxlQm91bmRzOmZ1bmN0aW9uKHZpZXdQb3J0UHgpe3ZhciBt YXhFeHRlbnQ9dGhpcy5tYXhFeHRlbnQ7dmFyIHJlc29sdXRpb249dGhpcy5nZXRS ZXNvbHV0aW9uKCk7dmFyIHRpbGVNYXBXaWR0aD1yZXNvbHV0aW9uKnRoaXMudGls ZVNpemUudzt2YXIgdGlsZU1hcEhlaWdodD1yZXNvbHV0aW9uKnRoaXMudGlsZVNp emUuaDt2YXIgbWFwUG9pbnQ9dGhpcy5nZXRMb25MYXRGcm9tVmlld1BvcnRQeCh2 aWV3UG9ydFB4KTt2YXIgdGlsZUxlZnQ9bWF4RXh0ZW50LmxlZnQrKHRpbGVNYXBX aWR0aCpNYXRoLmZsb29yKChtYXBQb2ludC5sb24tCm1heEV4dGVudC5sZWZ0KS90 aWxlTWFwV2lkdGgpKTt2YXIgdGlsZUJvdHRvbT1tYXhFeHRlbnQuYm90dG9tKyh0 aWxlTWFwSGVpZ2h0Kk1hdGguZmxvb3IoKG1hcFBvaW50LmxhdC0KbWF4RXh0ZW50 LmJvdHRvbSkvdGlsZU1hcEhlaWdodCkpO3JldHVybiBuZXcgT3BlbkxheWVycy5C b3VuZHModGlsZUxlZnQsdGlsZUJvdHRvbSx0aWxlTGVmdCt0aWxlTWFwV2lkdGgs dGlsZUJvdHRvbSt0aWxlTWFwSGVpZ2h0KTt9LENMQVNTX05BTUU6Ik9wZW5MYXll cnMuTGF5ZXIuR3JpZCJ9KTtPcGVuTGF5ZXJzLlRpbGU9T3BlbkxheWVycy5DbGFz cyh7RVZFTlRfVFlQRVM6WyJsb2Fkc3RhcnQiLCJsb2FkZW5kIiwicmVsb2FkIiwi dW5sb2FkIl0sZXZlbnRzOm51bGwsaWQ6bnVsbCxsYXllcjpudWxsLHVybDpudWxs LGJvdW5kczpudWxsLHNpemU6bnVsbCxwb3NpdGlvbjpudWxsLGlzTG9hZGluZzpm YWxzZSxpbml0aWFsaXplOmZ1bmN0aW9uKGxheWVyLHBvc2l0aW9uLGJvdW5kcyx1 cmwsc2l6ZSxvcHRpb25zKXt0aGlzLmxheWVyPWxheWVyO3RoaXMucG9zaXRpb249 cG9zaXRpb24uY2xvbmUoKTt0aGlzLmJvdW5kcz1ib3VuZHMuY2xvbmUoKTt0aGlz LnVybD11cmw7aWYoc2l6ZSl7dGhpcy5zaXplPXNpemUuY2xvbmUoKTt9CnRoaXMu aWQ9T3BlbkxheWVycy5VdGlsLmNyZWF0ZVVuaXF1ZUlEKCJUaWxlXyIpO3RoaXMu ZXZlbnRzPW5ldyBPcGVuTGF5ZXJzLkV2ZW50cyh0aGlzLG51bGwsdGhpcy5FVkVO VF9UWVBFUyk7T3BlbkxheWVycy5VdGlsLmV4dGVuZCh0aGlzLG9wdGlvbnMpO30s dW5sb2FkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0xvYWRpbmcpe3RoaXMuaXNMb2Fk aW5nPWZhbHNlO3RoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgidW5sb2FkIik7fX0s ZGVzdHJveTpmdW5jdGlvbigpe3RoaXMubGF5ZXI9bnVsbDt0aGlzLmJvdW5kcz1u dWxsO3RoaXMuc2l6ZT1udWxsO3RoaXMucG9zaXRpb249bnVsbDt0aGlzLmV2ZW50 cy5kZXN0cm95KCk7dGhpcy5ldmVudHM9bnVsbDt9LGNsb25lOmZ1bmN0aW9uKG9i ail7aWYob2JqPT1udWxsKXtvYmo9bmV3IE9wZW5MYXllcnMuVGlsZSh0aGlzLmxh eWVyLHRoaXMucG9zaXRpb24sdGhpcy5ib3VuZHMsdGhpcy51cmwsdGhpcy5zaXpl KTt9Ck9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKG9iaix0aGlzKTtyZXR1 cm4gb2JqO30sZHJhdzpmdW5jdGlvbigpe3ZhciBtYXhFeHRlbnQ9dGhpcy5sYXll ci5tYXhFeHRlbnQ7dmFyIHdpdGhpbk1heEV4dGVudD0obWF4RXh0ZW50JiZ0aGlz LmJvdW5kcy5pbnRlcnNlY3RzQm91bmRzKG1heEV4dGVudCxmYWxzZSkpO3RoaXMu c2hvdWxkRHJhdz0od2l0aGluTWF4RXh0ZW50fHx0aGlzLmxheWVyLmRpc3BsYXlP dXRzaWRlTWF4RXh0ZW50KTt0aGlzLmNsZWFyKCk7cmV0dXJuIHRoaXMuc2hvdWxk RHJhdzt9LG1vdmVUbzpmdW5jdGlvbihib3VuZHMscG9zaXRpb24scmVkcmF3KXtp ZihyZWRyYXc9PW51bGwpe3JlZHJhdz10cnVlO30KdGhpcy5ib3VuZHM9Ym91bmRz LmNsb25lKCk7dGhpcy5wb3NpdGlvbj1wb3NpdGlvbi5jbG9uZSgpO2lmKHJlZHJh dyl7dGhpcy5kcmF3KCk7fX0sY2xlYXI6ZnVuY3Rpb24oKXt9LGdldEJvdW5kc0Zy b21CYXNlTGF5ZXI6ZnVuY3Rpb24ocG9zaXRpb24pe3ZhciBtc2c9T3BlbkxheWVy cy5pMThuKCdyZXByb2plY3REZXByZWNhdGVkJyx7J2xheWVyTmFtZSc6dGhpcy5s YXllci5uYW1lfSk7T3BlbkxheWVycy5Db25zb2xlLndhcm4obXNnKTt2YXIgdG9w TGVmdD10aGlzLmxheWVyLm1hcC5nZXRMb25MYXRGcm9tTGF5ZXJQeChwb3NpdGlv bik7dmFyIGJvdHRvbVJpZ2h0UHg9cG9zaXRpb24uY2xvbmUoKTtib3R0b21SaWdo dFB4LngrPXRoaXMuc2l6ZS53O2JvdHRvbVJpZ2h0UHgueSs9dGhpcy5zaXplLmg7 dmFyIGJvdHRvbVJpZ2h0PXRoaXMubGF5ZXIubWFwLmdldExvbkxhdEZyb21MYXll clB4KGJvdHRvbVJpZ2h0UHgpO2lmKHRvcExlZnQubG9uPmJvdHRvbVJpZ2h0Lmxv bil7aWYodG9wTGVmdC5sb248MCl7dG9wTGVmdC5sb249LTE4MC0odG9wTGVmdC5s b24rMTgwKTt9ZWxzZXtib3R0b21SaWdodC5sb249MTgwK2JvdHRvbVJpZ2h0Lmxv bisxODA7fX0KdmFyIGJvdW5kcz1uZXcgT3BlbkxheWVycy5Cb3VuZHModG9wTGVm dC5sb24sYm90dG9tUmlnaHQubGF0LGJvdHRvbVJpZ2h0Lmxvbix0b3BMZWZ0Lmxh dCk7cmV0dXJuIGJvdW5kczt9LHNob3dUaWxlOmZ1bmN0aW9uKCl7aWYodGhpcy5z aG91bGREcmF3KXt0aGlzLnNob3coKTt9fSxzaG93OmZ1bmN0aW9uKCl7fSxoaWRl OmZ1bmN0aW9uKCl7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLlRpbGUifSk7T3Bl bkxheWVycy5UaWxlLkltYWdlPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5U aWxlLHt1cmw6bnVsbCxpbWdEaXY6bnVsbCxmcmFtZTpudWxsLGxheWVyQWxwaGFI YWNrOm51bGwsaXNCYWNrQnVmZmVyOmZhbHNlLGlzRmlyc3REcmF3OnRydWUsYmFj a0J1ZmZlclRpbGU6bnVsbCxtYXhHZXRVcmxMZW5ndGg6bnVsbCxpbml0aWFsaXpl OmZ1bmN0aW9uKGxheWVyLHBvc2l0aW9uLGJvdW5kcyx1cmwsc2l6ZSxvcHRpb25z KXtPcGVuTGF5ZXJzLlRpbGUucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhp cyxhcmd1bWVudHMpO2lmKHRoaXMubWF4R2V0VXJsTGVuZ3RoIT1udWxsKXtPcGVu TGF5ZXJzLlV0aWwuZXh0ZW5kKHRoaXMsT3BlbkxheWVycy5UaWxlLkltYWdlLklG cmFtZSk7fQp0aGlzLnVybD11cmw7dGhpcy5mcmFtZT1kb2N1bWVudC5jcmVhdGVF bGVtZW50KCdkaXYnKTt0aGlzLmZyYW1lLnN0eWxlLm92ZXJmbG93PSdoaWRkZW4n O3RoaXMuZnJhbWUuc3R5bGUucG9zaXRpb249J2Fic29sdXRlJzt0aGlzLmxheWVy QWxwaGFIYWNrPXRoaXMubGF5ZXIuYWxwaGEmJk9wZW5MYXllcnMuVXRpbC5hbHBo YUhhY2soKTt9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtpZih0aGlzLmltZ0RpdiE9bnVs bCl7dGhpcy5yZW1vdmVJbWdEaXYoKTt9CnRoaXMuaW1nRGl2PW51bGw7aWYoKHRo aXMuZnJhbWUhPW51bGwpJiYodGhpcy5mcmFtZS5wYXJlbnROb2RlPT10aGlzLmxh eWVyLmRpdikpe3RoaXMubGF5ZXIuZGl2LnJlbW92ZUNoaWxkKHRoaXMuZnJhbWUp O30KdGhpcy5mcmFtZT1udWxsO2lmKHRoaXMuYmFja0J1ZmZlclRpbGUpe3RoaXMu YmFja0J1ZmZlclRpbGUuZGVzdHJveSgpO3RoaXMuYmFja0J1ZmZlclRpbGU9bnVs bDt9CnRoaXMubGF5ZXIuZXZlbnRzLnVucmVnaXN0ZXIoImxvYWRlbmQiLHRoaXMs dGhpcy5yZXNldEJhY2tCdWZmZXIpO09wZW5MYXllcnMuVGlsZS5wcm90b3R5cGUu ZGVzdHJveS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fSxjbG9uZTpmdW5jdGlvbihv Ymope2lmKG9iaj09bnVsbCl7b2JqPW5ldyBPcGVuTGF5ZXJzLlRpbGUuSW1hZ2Uo dGhpcy5sYXllcix0aGlzLnBvc2l0aW9uLHRoaXMuYm91bmRzLHRoaXMudXJsLHRo aXMuc2l6ZSk7fQpvYmo9T3BlbkxheWVycy5UaWxlLnByb3RvdHlwZS5jbG9uZS5h cHBseSh0aGlzLFtvYmpdKTtvYmouaW1nRGl2PW51bGw7cmV0dXJuIG9iajt9LGRy YXc6ZnVuY3Rpb24oKXtpZih0aGlzLmxheWVyIT10aGlzLmxheWVyLm1hcC5iYXNl TGF5ZXImJnRoaXMubGF5ZXIucmVwcm9qZWN0KXt0aGlzLmJvdW5kcz10aGlzLmdl dEJvdW5kc0Zyb21CYXNlTGF5ZXIodGhpcy5wb3NpdGlvbik7fQp2YXIgZHJhd1Rp bGU9T3BlbkxheWVycy5UaWxlLnByb3RvdHlwZS5kcmF3LmFwcGx5KHRoaXMsYXJn dW1lbnRzKTtpZigoT3BlbkxheWVycy5VdGlsLmluZGV4T2YodGhpcy5sYXllci5T VVBQT1JURURfVFJBTlNJVElPTlMsdGhpcy5sYXllci50cmFuc2l0aW9uRWZmZWN0 KSE9LTEpfHx0aGlzLmxheWVyLnNpbmdsZVRpbGUpe2lmKGRyYXdUaWxlKXtpZigh dGhpcy5iYWNrQnVmZmVyVGlsZSl7dGhpcy5iYWNrQnVmZmVyVGlsZT10aGlzLmNs b25lKCk7dGhpcy5iYWNrQnVmZmVyVGlsZS5oaWRlKCk7dGhpcy5iYWNrQnVmZmVy VGlsZS5pc0JhY2tCdWZmZXI9dHJ1ZTt0aGlzLmV2ZW50cy5yZWdpc3RlcignbG9h ZGVuZCcsdGhpcyx0aGlzLnJlc2V0QmFja0J1ZmZlcik7dGhpcy5sYXllci5ldmVu dHMucmVnaXN0ZXIoImxvYWRlbmQiLHRoaXMsdGhpcy5yZXNldEJhY2tCdWZmZXIp O30KdGhpcy5zdGFydFRyYW5zaXRpb24oKTt9ZWxzZXtpZih0aGlzLmJhY2tCdWZm ZXJUaWxlKXt0aGlzLmJhY2tCdWZmZXJUaWxlLmNsZWFyKCk7fX19ZWxzZXtpZihk cmF3VGlsZSYmdGhpcy5pc0ZpcnN0RHJhdyl7dGhpcy5ldmVudHMucmVnaXN0ZXIo J2xvYWRlbmQnLHRoaXMsdGhpcy5zaG93VGlsZSk7dGhpcy5pc0ZpcnN0RHJhdz1m YWxzZTt9fQppZighZHJhd1RpbGUpe3JldHVybiBmYWxzZTt9CmlmKHRoaXMuaXNM b2FkaW5nKXt0aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQoInJlbG9hZCIpO31lbHNl e3RoaXMuaXNMb2FkaW5nPXRydWU7dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJs b2Fkc3RhcnQiKTt9CnJldHVybiB0aGlzLnJlbmRlclRpbGUoKTt9LHJlc2V0QmFj a0J1ZmZlcjpmdW5jdGlvbigpe3RoaXMuc2hvd1RpbGUoKTtpZih0aGlzLmJhY2tC dWZmZXJUaWxlJiYodGhpcy5pc0ZpcnN0RHJhd3x8IXRoaXMubGF5ZXIubnVtTG9h ZGluZ1RpbGVzKSl7dGhpcy5pc0ZpcnN0RHJhdz1mYWxzZTt2YXIgbWF4RXh0ZW50 PXRoaXMubGF5ZXIubWF4RXh0ZW50O3ZhciB3aXRoaW5NYXhFeHRlbnQ9KG1heEV4 dGVudCYmdGhpcy5ib3VuZHMuaW50ZXJzZWN0c0JvdW5kcyhtYXhFeHRlbnQsZmFs c2UpKTtpZih3aXRoaW5NYXhFeHRlbnQpe3RoaXMuYmFja0J1ZmZlclRpbGUucG9z aXRpb249dGhpcy5wb3NpdGlvbjt0aGlzLmJhY2tCdWZmZXJUaWxlLmJvdW5kcz10 aGlzLmJvdW5kczt0aGlzLmJhY2tCdWZmZXJUaWxlLnNpemU9dGhpcy5zaXplO3Ro aXMuYmFja0J1ZmZlclRpbGUuaW1hZ2VTaXplPXRoaXMubGF5ZXIuZ2V0SW1hZ2VT aXplKHRoaXMuYm91bmRzKXx8dGhpcy5zaXplO3RoaXMuYmFja0J1ZmZlclRpbGUu aW1hZ2VPZmZzZXQ9dGhpcy5sYXllci5pbWFnZU9mZnNldDt0aGlzLmJhY2tCdWZm ZXJUaWxlLnJlc29sdXRpb249dGhpcy5sYXllci5nZXRSZXNvbHV0aW9uKCk7dGhp cy5iYWNrQnVmZmVyVGlsZS5yZW5kZXJUaWxlKCk7fQp0aGlzLmJhY2tCdWZmZXJU aWxlLmhpZGUoKTt9fSxyZW5kZXJUaWxlOmZ1bmN0aW9uKCl7aWYodGhpcy5sYXll ci5hc3luYyl7dGhpcy5pbml0SW1nRGl2KCk7dGhpcy5sYXllci5nZXRVUkxhc3lu Yyh0aGlzLmJvdW5kcyx0aGlzLCJ1cmwiLHRoaXMucG9zaXRpb25JbWFnZSk7fWVs c2V7dGhpcy51cmw9dGhpcy5sYXllci5nZXRVUkwodGhpcy5ib3VuZHMpO3RoaXMu aW5pdEltZ0RpdigpO3RoaXMucG9zaXRpb25JbWFnZSgpO30KcmV0dXJuIHRydWU7 fSxwb3NpdGlvbkltYWdlOmZ1bmN0aW9uKCl7aWYodGhpcy5sYXllcj09PW51bGwp e3JldHVybjt9Ck9wZW5MYXllcnMuVXRpbC5tb2RpZnlET01FbGVtZW50KHRoaXMu ZnJhbWUsbnVsbCx0aGlzLnBvc2l0aW9uLHRoaXMuc2l6ZSk7dmFyIGltYWdlU2l6 ZT10aGlzLmxheWVyLmdldEltYWdlU2l6ZSh0aGlzLmJvdW5kcyk7aWYodGhpcy5s YXllckFscGhhSGFjayl7T3BlbkxheWVycy5VdGlsLm1vZGlmeUFscGhhSW1hZ2VE aXYodGhpcy5pbWdEaXYsbnVsbCxudWxsLGltYWdlU2l6ZSx0aGlzLnVybCk7fWVs c2V7T3BlbkxheWVycy5VdGlsLm1vZGlmeURPTUVsZW1lbnQodGhpcy5pbWdEaXYs bnVsbCxudWxsLGltYWdlU2l6ZSk7dGhpcy5pbWdEaXYuc3JjPXRoaXMudXJsO319 LGNsZWFyOmZ1bmN0aW9uKCl7aWYodGhpcy5pbWdEaXYpe3RoaXMuaGlkZSgpO2lm KE9wZW5MYXllcnMuVGlsZS5JbWFnZS51c2VCbGFua1RpbGUpe3RoaXMuaW1nRGl2 LnNyYz1PcGVuTGF5ZXJzLlV0aWwuZ2V0SW1hZ2VzTG9jYXRpb24oKSsiYmxhbmsu Z2lmIjt9fX0saW5pdEltZ0RpdjpmdW5jdGlvbigpe2lmKHRoaXMuaW1nRGl2PT1u dWxsKXt2YXIgb2Zmc2V0PXRoaXMubGF5ZXIuaW1hZ2VPZmZzZXQ7dmFyIHNpemU9 dGhpcy5sYXllci5nZXRJbWFnZVNpemUodGhpcy5ib3VuZHMpO2lmKHRoaXMubGF5 ZXJBbHBoYUhhY2spe3RoaXMuaW1nRGl2PU9wZW5MYXllcnMuVXRpbC5jcmVhdGVB bHBoYUltYWdlRGl2KG51bGwsb2Zmc2V0LHNpemUsbnVsbCwicmVsYXRpdmUiLG51 bGwsbnVsbCxudWxsLHRydWUpO31lbHNle3RoaXMuaW1nRGl2PU9wZW5MYXllcnMu VXRpbC5jcmVhdGVJbWFnZShudWxsLG9mZnNldCxzaXplLG51bGwsInJlbGF0aXZl IixudWxsLG51bGwsdHJ1ZSk7fQppZihPcGVuTGF5ZXJzLlV0aWwuaXNBcnJheSh0 aGlzLmxheWVyLnVybCkpe3RoaXMuaW1nRGl2LnVybHM9dGhpcy5sYXllci51cmwu c2xpY2UoKTt9CnRoaXMuaW1nRGl2LmNsYXNzTmFtZT0nb2xUaWxlSW1hZ2UnO3Ro aXMuZnJhbWUuc3R5bGUuekluZGV4PXRoaXMuaXNCYWNrQnVmZmVyPzA6MTt0aGlz LmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuaW1nRGl2KTt0aGlzLmxheWVyLmRpdi5h cHBlbmRDaGlsZCh0aGlzLmZyYW1lKTtpZih0aGlzLmxheWVyLm9wYWNpdHkhPW51 bGwpe09wZW5MYXllcnMuVXRpbC5tb2RpZnlET01FbGVtZW50KHRoaXMuaW1nRGl2 LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLHRoaXMubGF5ZXIub3BhY2l0 eSk7fQp0aGlzLmltZ0Rpdi5tYXA9dGhpcy5sYXllci5tYXA7dmFyIG9ubG9hZD1m dW5jdGlvbigpe2lmKHRoaXMuaXNMb2FkaW5nKXt0aGlzLmlzTG9hZGluZz1mYWxz ZTt0aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQoImxvYWRlbmQiKTt9fTtpZih0aGlz LmxheWVyQWxwaGFIYWNrKXtPcGVuTGF5ZXJzLkV2ZW50Lm9ic2VydmUodGhpcy5p bWdEaXYuY2hpbGROb2Rlc1swXSwnbG9hZCcsT3BlbkxheWVycy5GdW5jdGlvbi5i aW5kKG9ubG9hZCx0aGlzKSk7fWVsc2V7T3BlbkxheWVycy5FdmVudC5vYnNlcnZl KHRoaXMuaW1nRGl2LCdsb2FkJyxPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQob25s b2FkLHRoaXMpKTt9CnZhciBvbmVycm9yPWZ1bmN0aW9uKCl7aWYodGhpcy5pbWdE aXYuX2F0dGVtcHRzPk9wZW5MYXllcnMuSU1BR0VfUkVMT0FEX0FUVEVNUFRTKXtv bmxvYWQuY2FsbCh0aGlzKTt9fTtPcGVuTGF5ZXJzLkV2ZW50Lm9ic2VydmUodGhp cy5pbWdEaXYsImVycm9yIixPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQob25lcnJv cix0aGlzKSk7fQp0aGlzLmltZ0Rpdi52aWV3UmVxdWVzdElEPXRoaXMubGF5ZXIu bWFwLnZpZXdSZXF1ZXN0SUQ7fSxyZW1vdmVJbWdEaXY6ZnVuY3Rpb24oKXtPcGVu TGF5ZXJzLkV2ZW50LnN0b3BPYnNlcnZpbmdFbGVtZW50KHRoaXMuaW1nRGl2KTtp Zih0aGlzLmltZ0Rpdi5wYXJlbnROb2RlPT10aGlzLmZyYW1lKXt0aGlzLmZyYW1l LnJlbW92ZUNoaWxkKHRoaXMuaW1nRGl2KTt0aGlzLmltZ0Rpdi5tYXA9bnVsbDt9 CnRoaXMuaW1nRGl2LnVybHM9bnVsbDt2YXIgY2hpbGQ9dGhpcy5pbWdEaXYuZmly c3RDaGlsZDtpZihjaGlsZCl7T3BlbkxheWVycy5FdmVudC5zdG9wT2JzZXJ2aW5n RWxlbWVudChjaGlsZCk7dGhpcy5pbWdEaXYucmVtb3ZlQ2hpbGQoY2hpbGQpO2Rl bGV0ZSBjaGlsZDt9ZWxzZXt0aGlzLmltZ0Rpdi5zcmM9T3BlbkxheWVycy5VdGls LmdldEltYWdlc0xvY2F0aW9uKCkrImJsYW5rLmdpZiI7fX0sY2hlY2tJbWdVUkw6 ZnVuY3Rpb24oKXtpZih0aGlzLmxheWVyKXt2YXIgbG9hZGVkPXRoaXMubGF5ZXJB bHBoYUhhY2s/dGhpcy5pbWdEaXYuZmlyc3RDaGlsZC5zcmM6dGhpcy5pbWdEaXYu c3JjO2lmKCFPcGVuTGF5ZXJzLlV0aWwuaXNFcXVpdmFsZW50VXJsKGxvYWRlZCx0 aGlzLnVybCkpe3RoaXMuaGlkZSgpO319fSxzdGFydFRyYW5zaXRpb246ZnVuY3Rp b24oKXtpZighdGhpcy5iYWNrQnVmZmVyVGlsZXx8IXRoaXMuYmFja0J1ZmZlclRp bGUuaW1nRGl2KXtyZXR1cm47fQp2YXIgcmF0aW89MTtpZih0aGlzLmJhY2tCdWZm ZXJUaWxlLnJlc29sdXRpb24pe3JhdGlvPXRoaXMuYmFja0J1ZmZlclRpbGUucmVz b2x1dGlvbi90aGlzLmxheWVyLmdldFJlc29sdXRpb24oKTt9CmlmKHJhdGlvIT0x KXtpZih0aGlzLmxheWVyLnRyYW5zaXRpb25FZmZlY3Q9PSdyZXNpemUnKXt2YXIg dXBwZXJMZWZ0PW5ldyBPcGVuTGF5ZXJzLkxvbkxhdCh0aGlzLmJhY2tCdWZmZXJU aWxlLmJvdW5kcy5sZWZ0LHRoaXMuYmFja0J1ZmZlclRpbGUuYm91bmRzLnRvcCk7 dmFyIHNpemU9bmV3IE9wZW5MYXllcnMuU2l6ZSh0aGlzLmJhY2tCdWZmZXJUaWxl LnNpemUudypyYXRpbyx0aGlzLmJhY2tCdWZmZXJUaWxlLnNpemUuaCpyYXRpbyk7 dmFyIHB4PXRoaXMubGF5ZXIubWFwLmdldExheWVyUHhGcm9tTG9uTGF0KHVwcGVy TGVmdCk7T3BlbkxheWVycy5VdGlsLm1vZGlmeURPTUVsZW1lbnQodGhpcy5iYWNr QnVmZmVyVGlsZS5mcmFtZSxudWxsLHB4LHNpemUpO3ZhciBpbWFnZVNpemU9dGhp cy5iYWNrQnVmZmVyVGlsZS5pbWFnZVNpemU7aW1hZ2VTaXplPW5ldyBPcGVuTGF5 ZXJzLlNpemUoaW1hZ2VTaXplLncqcmF0aW8saW1hZ2VTaXplLmgqcmF0aW8pO3Zh ciBpbWFnZU9mZnNldD10aGlzLmJhY2tCdWZmZXJUaWxlLmltYWdlT2Zmc2V0O2lm KGltYWdlT2Zmc2V0KXtpbWFnZU9mZnNldD1uZXcgT3BlbkxheWVycy5QaXhlbChp bWFnZU9mZnNldC54KnJhdGlvLGltYWdlT2Zmc2V0LnkqcmF0aW8pO30KT3Blbkxh eWVycy5VdGlsLm1vZGlmeURPTUVsZW1lbnQodGhpcy5iYWNrQnVmZmVyVGlsZS5p bWdEaXYsbnVsbCxpbWFnZU9mZnNldCxpbWFnZVNpemUpO3RoaXMuYmFja0J1ZmZl clRpbGUuc2hvdygpO319ZWxzZXtpZih0aGlzLmxheWVyLnNpbmdsZVRpbGUpe3Ro aXMuYmFja0J1ZmZlclRpbGUuc2hvdygpO31lbHNle3RoaXMuYmFja0J1ZmZlclRp bGUuaGlkZSgpO319fSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5mcmFtZS5zdHlsZS5k aXNwbGF5PScnO2lmKE9wZW5MYXllcnMuVXRpbC5pbmRleE9mKHRoaXMubGF5ZXIu U1VQUE9SVEVEX1RSQU5TSVRJT05TLHRoaXMubGF5ZXIudHJhbnNpdGlvbkVmZmVj dCkhPS0xKXtpZihPcGVuTGF5ZXJzLklTX0dFQ0tPPT09dHJ1ZSl7dGhpcy5mcmFt ZS5zY3JvbGxMZWZ0PXRoaXMuZnJhbWUuc2Nyb2xsTGVmdDt9fX0saGlkZTpmdW5j dGlvbigpe3RoaXMuZnJhbWUuc3R5bGUuZGlzcGxheT0nbm9uZSc7fSxDTEFTU19O QU1FOiJPcGVuTGF5ZXJzLlRpbGUuSW1hZ2UifSk7T3BlbkxheWVycy5UaWxlLklt YWdlLnVzZUJsYW5rVGlsZT0oT3BlbkxheWVycy5CUk9XU0VSX05BTUU9PSJzYWZh cmkifHxPcGVuTGF5ZXJzLkJST1dTRVJfTkFNRT09Im9wZXJhIik7T3BlbkxheWVy cy5Gb3JtYXQuQXJjWE1MPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Gb3Jt YXQuWE1MLHtmb250U3R5bGVLZXlzOlsnYW50aWFsaWFzaW5nJywnYmxvY2tvdXQn LCdmb250JywnZm9udGNvbG9yJywnZm9udHNpemUnLCdmb250c3R5bGUnLCdnbG93 aW5nJywnaW50ZXJ2YWwnLCdvdXRsaW5lJywncHJpbnRtb2RlJywnc2hhZG93Jywn dHJhbnNwYXJlbmN5J10scmVxdWVzdDpudWxsLHJlc3BvbnNlOm51bGwsaW5pdGlh bGl6ZTpmdW5jdGlvbihvcHRpb25zKXt0aGlzLnJlcXVlc3Q9bmV3IE9wZW5MYXll cnMuRm9ybWF0LkFyY1hNTC5SZXF1ZXN0KCk7dGhpcy5yZXNwb25zZT1uZXcgT3Bl bkxheWVycy5Gb3JtYXQuQXJjWE1MLlJlc3BvbnNlKCk7aWYob3B0aW9ucyl7aWYo b3B0aW9ucy5yZXF1ZXN0dHlwZT09ImZlYXR1cmUiKXt0aGlzLnJlcXVlc3QuZ2V0 X2ltYWdlPW51bGw7dmFyIHFyeT10aGlzLnJlcXVlc3QuZ2V0X2ZlYXR1cmUucXVl cnk7dGhpcy5hZGRDb29yZFN5cyhxcnkuZmVhdHVyZWNvb3Jkc3lzLG9wdGlvbnMu ZmVhdHVyZUNvb3JkU3lzKTt0aGlzLmFkZENvb3JkU3lzKHFyeS5maWx0ZXJjb29y ZHN5cyxvcHRpb25zLmZpbHRlckNvb3JkU3lzKTtpZihvcHRpb25zLnBvbHlnb24p e3FyeS5pc3NwYXRpYWw9dHJ1ZTtxcnkuc3BhdGlhbGZpbHRlci5wb2x5Z29uPW9w dGlvbnMucG9seWdvbjt9ZWxzZSBpZihvcHRpb25zLmVudmVsb3BlKXtxcnkuaXNz cGF0aWFsPXRydWU7cXJ5LnNwYXRpYWxmaWx0ZXIuZW52ZWxvcGU9e21pbng6MCxt aW55OjAsbWF4eDowLG1heHk6MH07dGhpcy5wYXJzZUVudmVsb3BlKHFyeS5zcGF0 aWFsZmlsdGVyLmVudmVsb3BlLG9wdGlvbnMuZW52ZWxvcGUpO319ZWxzZSBpZihv cHRpb25zLnJlcXVlc3R0eXBlPT0iaW1hZ2UiKXt0aGlzLnJlcXVlc3QuZ2V0X2Zl YXR1cmU9bnVsbDt2YXIgcHJvcHM9dGhpcy5yZXF1ZXN0LmdldF9pbWFnZS5wcm9w ZXJ0aWVzO3RoaXMucGFyc2VFbnZlbG9wZShwcm9wcy5lbnZlbG9wZSxvcHRpb25z LmVudmVsb3BlKTt0aGlzLmFkZExheWVycyhwcm9wcy5sYXllcmxpc3Qsb3B0aW9u cy5sYXllcnMpO3RoaXMuYWRkSW1hZ2VTaXplKHByb3BzLmltYWdlc2l6ZSxvcHRp b25zLnRpbGVTaXplKTt0aGlzLmFkZENvb3JkU3lzKHByb3BzLmZlYXR1cmVjb29y ZHN5cyxvcHRpb25zLmZlYXR1cmVDb29yZFN5cyk7dGhpcy5hZGRDb29yZFN5cyhw cm9wcy5maWx0ZXJjb29yZHN5cyxvcHRpb25zLmZpbHRlckNvb3JkU3lzKTt9ZWxz ZXt0aGlzLnJlcXVlc3Q9bnVsbDt9fQpPcGVuTGF5ZXJzLkZvcm1hdC5YTUwucHJv dG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxbb3B0aW9uc10pO30scGFyc2VF bnZlbG9wZTpmdW5jdGlvbihlbnYsYXJyKXtpZihhcnImJmFyci5sZW5ndGg9PTQp e2Vudi5taW54PWFyclswXTtlbnYubWlueT1hcnJbMV07ZW52Lm1heHg9YXJyWzJd O2Vudi5tYXh5PWFyclszXTt9fSxhZGRMYXllcnM6ZnVuY3Rpb24obGwsbHlycyl7 Zm9yKHZhciBsaW5kPTAsbGVuPWx5cnMubGVuZ3RoO2xpbmQ8bGVuO2xpbmQrKyl7 bGwucHVzaChseXJzW2xpbmRdKTt9fSxhZGRJbWFnZVNpemU6ZnVuY3Rpb24oaW1z aXplLG9sc2l6ZSl7aWYob2xzaXplIT09bnVsbCl7aW1zaXplLndpZHRoPW9sc2l6 ZS53O2ltc2l6ZS5oZWlnaHQ9b2xzaXplLmg7aW1zaXplLnByaW50d2lkdGg9b2xz aXplLnc7aW1zaXplLnByaW50aGVpZ2h0PW9sc2l6ZS5oO319LGFkZENvb3JkU3lz OmZ1bmN0aW9uKGZlYXRPckZpbHQsZnN5cyl7aWYodHlwZW9mIGZzeXM9PSJzdHJp bmciKXtmZWF0T3JGaWx0LmlkPXBhcnNlSW50KGZzeXMpO2ZlYXRPckZpbHQuc3Ry aW5nPWZzeXM7fQplbHNlIGlmKHR5cGVvZiBmc3lzPT0ib2JqZWN0IiYmZnN5cy5w cm9qIT09bnVsbCl7ZmVhdE9yRmlsdC5pZD1mc3lzLnByb2ouc3JzUHJvak51bWJl cjtmZWF0T3JGaWx0LnN0cmluZz1mc3lzLnByb2ouc3JzQ29kZTt9ZWxzZXtmZWF0 T3JGaWx0PWZzeXM7fX0saXNlcnJvcjpmdW5jdGlvbihkYXRhKXt2YXIgcmV0PW51 bGw7aWYoIWRhdGEpe3JldD0odGhpcy5yZXNwb25zZS5lcnJvciE9PScnKTt9ZWxz ZXtkYXRhPU9wZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5cGUucmVhZC5hcHBs eSh0aGlzLFtkYXRhXSk7dmFyIGVycm9yTm9kZXM9ZGF0YS5kb2N1bWVudEVsZW1l bnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkVSUk9SIik7cmV0PShlcnJvck5vZGVz IT09bnVsbCYmZXJyb3JOb2Rlcy5sZW5ndGg+MCk7fQpyZXR1cm4gcmV0O30scmVh ZDpmdW5jdGlvbihkYXRhKXtpZih0eXBlb2YgZGF0YT09InN0cmluZyIpe2RhdGE9 T3BlbkxheWVycy5Gb3JtYXQuWE1MLnByb3RvdHlwZS5yZWFkLmFwcGx5KHRoaXMs W2RhdGFdKTt9CnZhciBhcmNOb2RlPW51bGw7aWYoZGF0YSYmZGF0YS5kb2N1bWVu dEVsZW1lbnQpe2lmKGRhdGEuZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lPT0iQVJD WE1MIil7YXJjTm9kZT1kYXRhLmRvY3VtZW50RWxlbWVudDt9ZWxzZXthcmNOb2Rl PWRhdGEuZG9jdW1lbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBUkNY TUwiKVswXTt9fQppZighYXJjTm9kZXx8YXJjTm9kZS5maXJzdENoaWxkLm5vZGVO YW1lPT09J3BhcnNlcmVycm9yJyl7dmFyIGVycm9yLHNvdXJjZTt0cnl7ZXJyb3I9 ZGF0YS5maXJzdENoaWxkLm5vZGVWYWx1ZTtzb3VyY2U9ZGF0YS5maXJzdENoaWxk LmNoaWxkTm9kZXNbMV0uZmlyc3RDaGlsZC5ub2RlVmFsdWU7fWNhdGNoKGVycil7 fQp0aHJvd3ttZXNzYWdlOiJFcnJvciBwYXJzaW5nIHRoZSBBcmNYTUwgcmVxdWVz dCIsZXJyb3I6ZXJyb3Isc291cmNlOnNvdXJjZX07fQp2YXIgcmVzcG9uc2U9dGhp cy5wYXJzZVJlc3BvbnNlKGFyY05vZGUpO3JldHVybiByZXNwb25zZTt9LHdyaXRl OmZ1bmN0aW9uKHJlcXVlc3Qpe2lmKCFyZXF1ZXN0KXtyZXF1ZXN0PXRoaXMucmVx dWVzdDt9CnZhciByb290PXRoaXMuY3JlYXRlRWxlbWVudE5TKCIiLCJBUkNYTUwi KTtyb290LnNldEF0dHJpYnV0ZSgidmVyc2lvbiIsIjEuMSIpO3ZhciByZXFFbGVt PXRoaXMuY3JlYXRlRWxlbWVudE5TKCIiLCJSRVFVRVNUIik7aWYocmVxdWVzdC5n ZXRfaW1hZ2UhPW51bGwpe3ZhciBnZXRFbGVtPXRoaXMuY3JlYXRlRWxlbWVudE5T KCIiLCJHRVRfSU1BR0UiKTtyZXFFbGVtLmFwcGVuZENoaWxkKGdldEVsZW0pO3Zh ciBwcm9wRWxlbT10aGlzLmNyZWF0ZUVsZW1lbnROUygiIiwiUFJPUEVSVElFUyIp O2dldEVsZW0uYXBwZW5kQ2hpbGQocHJvcEVsZW0pO3ZhciBwcm9wcz1yZXF1ZXN0 LmdldF9pbWFnZS5wcm9wZXJ0aWVzO2lmKHByb3BzLmZlYXR1cmVjb29yZHN5cyE9 bnVsbCl7dmFyIGZlYXQ9dGhpcy5jcmVhdGVFbGVtZW50TlMoIiIsIkZFQVRVUkVD T09SRFNZUyIpO3Byb3BFbGVtLmFwcGVuZENoaWxkKGZlYXQpO2lmKHByb3BzLmZl YXR1cmVjb29yZHN5cy5pZD09PTApe2ZlYXQuc2V0QXR0cmlidXRlKCJzdHJpbmci LHByb3BzLmZlYXR1cmVjb29yZHN5c1snc3RyaW5nJ10pO30KZWxzZXtmZWF0LnNl dEF0dHJpYnV0ZSgiaWQiLHByb3BzLmZlYXR1cmVjb29yZHN5cy5pZCk7fX0KaWYo cHJvcHMuZmlsdGVyY29vcmRzeXMhPW51bGwpe3ZhciBmaWx0PXRoaXMuY3JlYXRl RWxlbWVudE5TKCIiLCJGSUxURVJDT09SRFNZUyIpO3Byb3BFbGVtLmFwcGVuZENo aWxkKGZpbHQpO2lmKHByb3BzLmZpbHRlcmNvb3Jkc3lzLmlkPT09MCl7ZmlsdC5z ZXRBdHRyaWJ1dGUoInN0cmluZyIscHJvcHMuZmlsdGVyY29vcmRzeXMuc3RyaW5n KTt9CmVsc2V7ZmlsdC5zZXRBdHRyaWJ1dGUoImlkIixwcm9wcy5maWx0ZXJjb29y ZHN5cy5pZCk7fX0KaWYocHJvcHMuZW52ZWxvcGUhPW51bGwpe3ZhciBlbnY9dGhp cy5jcmVhdGVFbGVtZW50TlMoIiIsIkVOVkVMT1BFIik7cHJvcEVsZW0uYXBwZW5k Q2hpbGQoZW52KTtlbnYuc2V0QXR0cmlidXRlKCJtaW54Iixwcm9wcy5lbnZlbG9w ZS5taW54KTtlbnYuc2V0QXR0cmlidXRlKCJtaW55Iixwcm9wcy5lbnZlbG9wZS5t aW55KTtlbnYuc2V0QXR0cmlidXRlKCJtYXh4Iixwcm9wcy5lbnZlbG9wZS5tYXh4 KTtlbnYuc2V0QXR0cmlidXRlKCJtYXh5Iixwcm9wcy5lbnZlbG9wZS5tYXh5KTt9 CnZhciBpbWFnZXN6PXRoaXMuY3JlYXRlRWxlbWVudE5TKCIiLCJJTUFHRVNJWkUi KTtwcm9wRWxlbS5hcHBlbmRDaGlsZChpbWFnZXN6KTtpbWFnZXN6LnNldEF0dHJp YnV0ZSgiaGVpZ2h0Iixwcm9wcy5pbWFnZXNpemUuaGVpZ2h0KTtpbWFnZXN6LnNl dEF0dHJpYnV0ZSgid2lkdGgiLHByb3BzLmltYWdlc2l6ZS53aWR0aCk7aWYocHJv cHMuaW1hZ2VzaXplLmhlaWdodCE9cHJvcHMuaW1hZ2VzaXplLnByaW50aGVpZ2h0 fHxwcm9wcy5pbWFnZXNpemUud2lkdGghPXByb3BzLmltYWdlc2l6ZS5wcmludHdp ZHRoKXtpbWFnZXN6LnNldEF0dHJpYnV0ZSgicHJpbnRoZWlnaHQiLHByb3BzLmlt YWdlc2l6ZS5wcmludGhlaWdodCk7aW1hZ2Vzei5zZXRBcnJ0aWJ1dGUoInByaW50 d2lkdGgiLHByb3BzLmltYWdlc2l6ZS5wcmludHdpZHRoKTt9CmlmKHByb3BzLmJh Y2tncm91bmQhPW51bGwpe3ZhciBiYWNrZ3JuZD10aGlzLmNyZWF0ZUVsZW1lbnRO UygiIiwiQkFDS0dST1VORCIpO3Byb3BFbGVtLmFwcGVuZENoaWxkKGJhY2tncm5k KTtiYWNrZ3JuZC5zZXRBdHRyaWJ1dGUoImNvbG9yIixwcm9wcy5iYWNrZ3JvdW5k LmNvbG9yLnIrIiwiKwpwcm9wcy5iYWNrZ3JvdW5kLmNvbG9yLmcrIiwiKwpwcm9w cy5iYWNrZ3JvdW5kLmNvbG9yLmIpO2lmKHByb3BzLmJhY2tncm91bmQudHJhbnNj b2xvciE9PW51bGwpe2JhY2tncm5kLnNldEF0dHJpYnV0ZSgidHJhbnNjb2xvciIs cHJvcHMuYmFja2dyb3VuZC50cmFuc2NvbG9yLnIrIiwiKwpwcm9wcy5iYWNrZ3Jv dW5kLnRyYW5zY29sb3IuZysiLCIrCnByb3BzLmJhY2tncm91bmQudHJhbnNjb2xv ci5iKTt9fQppZihwcm9wcy5sYXllcmxpc3QhPW51bGwmJnByb3BzLmxheWVybGlz dC5sZW5ndGg+MCl7dmFyIGxheWVybHN0PXRoaXMuY3JlYXRlRWxlbWVudE5TKCIi LCJMQVlFUkxJU1QiKTtwcm9wRWxlbS5hcHBlbmRDaGlsZChsYXllcmxzdCk7Zm9y KHZhciBsZD0wO2xkPHByb3BzLmxheWVybGlzdC5sZW5ndGg7bGQrKyl7dmFyIGxk ZWY9dGhpcy5jcmVhdGVFbGVtZW50TlMoIiIsIkxBWUVSREVGIik7bGF5ZXJsc3Qu YXBwZW5kQ2hpbGQobGRlZik7bGRlZi5zZXRBdHRyaWJ1dGUoImlkIixwcm9wcy5s YXllcmxpc3RbbGRdLmlkKTtsZGVmLnNldEF0dHJpYnV0ZSgidmlzaWJsZSIscHJv cHMubGF5ZXJsaXN0W2xkXS52aXNpYmxlKTtpZih0eXBlb2YgcHJvcHMubGF5ZXJs aXN0W2xkXS5xdWVyeT09Im9iamVjdCIpe3ZhciBxdWVyeT1wcm9wcy5sYXllcmxp c3RbbGRdLnF1ZXJ5O2lmKHF1ZXJ5LndoZXJlLmxlbmd0aDwwKXtjb250aW51ZTt9 CnZhciBxdWVyeUVsZW09bnVsbDtpZih0eXBlb2YgcXVlcnkuc3BhdGlhbGZpbHRl cj09ImJvb2xlYW4iJiZxdWVyeS5zcGF0aWFsZmlsdGVyKXtxdWVyeUVsZW09dGhp cy5jcmVhdGVFbGVtZW50TlMoIiIsIlNQQVRJQUxRVUVSWSIpO30KZWxzZXtxdWVy eUVsZW09dGhpcy5jcmVhdGVFbGVtZW50TlMoIiIsIlFVRVJZIik7fQpxdWVyeUVs ZW0uc2V0QXR0cmlidXRlKCJ3aGVyZSIscXVlcnkud2hlcmUpO2lmKHR5cGVvZiBx dWVyeS5hY2N1cmFjeT09Im51bWJlciImJnF1ZXJ5LmFjY3VyYWN5PjApe3F1ZXJ5 RWxlbS5zZXRBdHRyaWJ1dGUoImFjY3VyYWN5IixxdWVyeS5hY2N1cmFjeSk7fQpp Zih0eXBlb2YgcXVlcnkuZmVhdHVyZWxpbWl0PT0ibnVtYmVyIiYmcXVlcnkuZmVh dHVyZWxpbWl0PDIwMDApe3F1ZXJ5RWxlbS5zZXRBdHRyaWJ1dGUoImZlYXR1cmVs aW1pdCIscXVlcnkuZmVhdHVyZWxpbWl0KTt9CmlmKHR5cGVvZiBxdWVyeS5zdWJm aWVsZHM9PSJzdHJpbmciJiZxdWVyeS5zdWJmaWVsZHMhPSIjQUxMIyIpe3F1ZXJ5 RWxlbS5zZXRBdHRyaWJ1dGUoInN1YmZpZWxkcyIscXVlcnkuc3ViZmllbGRzKTt9 CmlmKHR5cGVvZiBxdWVyeS5qb2luZXhwcmVzc2lvbj09InN0cmluZyImJnF1ZXJ5 LmpvaW5leHByZXNzaW9uLmxlbmd0aD4wKXtxdWVyeUVsZW0uc2V0QXR0cmlidXRl KCJqb2luZXhwcmVzc2lvbiIscXVlcnkuam9pbmV4cHJlc3Npb24pO30KaWYodHlw ZW9mIHF1ZXJ5LmpvaW50YWJsZXM9PSJzdHJpbmciJiZxdWVyeS5qb2ludGFibGVz Lmxlbmd0aD4wKXtxdWVyeUVsZW0uc2V0QXR0cmlidXRlKCJqb2ludGFibGVzIixx dWVyeS5qb2ludGFibGVzKTt9CmxkZWYuYXBwZW5kQ2hpbGQocXVlcnlFbGVtKTt9 CmlmKHR5cGVvZiBwcm9wcy5sYXllcmxpc3RbbGRdLnJlbmRlcmVyPT0ib2JqZWN0 Iil7dGhpcy5hZGRSZW5kZXJlcihsZGVmLHByb3BzLmxheWVybGlzdFtsZF0ucmVu ZGVyZXIpO319fX1lbHNlIGlmKHJlcXVlc3QuZ2V0X2ZlYXR1cmUhPW51bGwpe3Zh ciBnZXRFbGVtPXRoaXMuY3JlYXRlRWxlbWVudE5TKCIiLCJHRVRfRkVBVFVSRVMi KTtnZXRFbGVtLnNldEF0dHJpYnV0ZSgib3V0cHV0bW9kZSIsIm5ld3htbCIpO2dl dEVsZW0uc2V0QXR0cmlidXRlKCJjaGVja2VzYyIsInRydWUiKTtpZihyZXF1ZXN0 LmdldF9mZWF0dXJlLmdlb21ldHJ5KXtnZXRFbGVtLnNldEF0dHJpYnV0ZSgiZ2Vv bWV0cnkiLHJlcXVlc3QuZ2V0X2ZlYXR1cmUuZ2VvbWV0cnkpO30KZWxzZXtnZXRF bGVtLnNldEF0dHJpYnV0ZSgiZ2VvbWV0cnkiLCJmYWxzZSIpO30KaWYocmVxdWVz dC5nZXRfZmVhdHVyZS5jb21wYWN0KXtnZXRFbGVtLnNldEF0dHJpYnV0ZSgiY29t cGFjdCIscmVxdWVzdC5nZXRfZmVhdHVyZS5jb21wYWN0KTt9CmlmKHJlcXVlc3Qu Z2V0X2ZlYXR1cmUuZmVhdHVyZWxpbWl0PT0ibnVtYmVyIil7Z2V0RWxlbS5zZXRB dHRyaWJ1dGUoImZlYXR1cmVsaW1pdCIscmVxdWVzdC5nZXRfZmVhdHVyZS5mZWF0 dXJlbGltaXQpO30KZ2V0RWxlbS5zZXRBdHRyaWJ1dGUoImdsb2JhbGVudmVsb3Bl IiwidHJ1ZSIpO3JlcUVsZW0uYXBwZW5kQ2hpbGQoZ2V0RWxlbSk7aWYocmVxdWVz dC5nZXRfZmVhdHVyZS5sYXllciE9bnVsbCYmcmVxdWVzdC5nZXRfZmVhdHVyZS5s YXllci5sZW5ndGg+MCl7dmFyIGx5ckVsZW09dGhpcy5jcmVhdGVFbGVtZW50TlMo IiIsIkxBWUVSIik7bHlyRWxlbS5zZXRBdHRyaWJ1dGUoImlkIixyZXF1ZXN0Lmdl dF9mZWF0dXJlLmxheWVyKTtnZXRFbGVtLmFwcGVuZENoaWxkKGx5ckVsZW0pO30K dmFyIGZxdWVyeT1yZXF1ZXN0LmdldF9mZWF0dXJlLnF1ZXJ5O2lmKGZxdWVyeSE9 bnVsbCl7dmFyIHFFbGVtPW51bGw7aWYoZnF1ZXJ5Lmlzc3BhdGlhbCl7cUVsZW09 dGhpcy5jcmVhdGVFbGVtZW50TlMoIiIsIlNQQVRJQUxRVUVSWSIpO31lbHNle3FF bGVtPXRoaXMuY3JlYXRlRWxlbWVudE5TKCIiLCJRVUVSWSIpO30KZ2V0RWxlbS5h cHBlbmRDaGlsZChxRWxlbSk7aWYodHlwZW9mIGZxdWVyeS5hY2N1cmFjeT09Im51 bWJlciIpe3FFbGVtLnNldEF0dHJpYnV0ZSgiYWNjdXJhY3kiLGZxdWVyeS5hY2N1 cmFjeSk7fQppZihmcXVlcnkuZmVhdHVyZWNvb3Jkc3lzIT1udWxsKXt2YXIgZmNz RWxlbTE9dGhpcy5jcmVhdGVFbGVtZW50TlMoIiIsIkZFQVRVUkVDT09SRFNZUyIp O2lmKGZxdWVyeS5mZWF0dXJlY29vcmRzeXMuaWQ9PTApe2Zjc0VsZW0xLnNldEF0 dHJpYnV0ZSgic3RyaW5nIixmcXVlcnkuZmVhdHVyZWNvb3Jkc3lzLnN0cmluZyk7 fWVsc2V7ZmNzRWxlbTEuc2V0QXR0cmlidXRlKCJpZCIsZnF1ZXJ5LmZlYXR1cmVj b29yZHN5cy5pZCk7fQpxRWxlbS5hcHBlbmRDaGlsZChmY3NFbGVtMSk7fQppZihm cXVlcnkuZmlsdGVyY29vcmRzeXMhPW51bGwpe3ZhciBmY3NFbGVtMj10aGlzLmNy ZWF0ZUVsZW1lbnROUygiIiwiRklMVEVSQ09PUkRTWVMiKTtpZihmcXVlcnkuZmls dGVyY29vcmRzeXMuaWQ9PT0wKXtmY3NFbGVtMi5zZXRBdHRyaWJ1dGUoInN0cmlu ZyIsZnF1ZXJ5LmZpbHRlcmNvb3Jkc3lzLnN0cmluZyk7fWVsc2V7ZmNzRWxlbTIu c2V0QXR0cmlidXRlKCJpZCIsZnF1ZXJ5LmZpbHRlcmNvb3Jkc3lzLmlkKTt9CnFF bGVtLmFwcGVuZENoaWxkKGZjc0VsZW0yKTt9CmlmKGZxdWVyeS5idWZmZXI+MCl7 dmFyIGJ1ZkVsZW09dGhpcy5jcmVhdGVFbGVtZW50TlMoIiIsIkJVRkZFUiIpO2J1 ZkVsZW0uc2V0QXR0cmlidXRlKCJkaXN0YW5jZSIsZnF1ZXJ5LmJ1ZmZlcik7cUVs ZW0uYXBwZW5kQ2hpbGQoYnVmRWxlbSk7fQppZihmcXVlcnkuaXNzcGF0aWFsKXt2 YXIgc3BmRWxlbT10aGlzLmNyZWF0ZUVsZW1lbnROUygiIiwiU1BBVElBTEZJTFRF UiIpO3NwZkVsZW0uc2V0QXR0cmlidXRlKCJyZWxhdGlvbiIsZnF1ZXJ5LnNwYXRp YWxmaWx0ZXIucmVsYXRpb24pO3FFbGVtLmFwcGVuZENoaWxkKHNwZkVsZW0pO2lm KGZxdWVyeS5zcGF0aWFsZmlsdGVyLmVudmVsb3BlKXt2YXIgZW52RWxlbT10aGlz LmNyZWF0ZUVsZW1lbnROUygiIiwiRU5WRUxPUEUiKTtlbnZFbGVtLnNldEF0dHJp YnV0ZSgibWlueCIsZnF1ZXJ5LnNwYXRpYWxmaWx0ZXIuZW52ZWxvcGUubWlueCk7 ZW52RWxlbS5zZXRBdHRyaWJ1dGUoIm1pbnkiLGZxdWVyeS5zcGF0aWFsZmlsdGVy LmVudmVsb3BlLm1pbnkpO2VudkVsZW0uc2V0QXR0cmlidXRlKCJtYXh4IixmcXVl cnkuc3BhdGlhbGZpbHRlci5lbnZlbG9wZS5tYXh4KTtlbnZFbGVtLnNldEF0dHJp YnV0ZSgibWF4eSIsZnF1ZXJ5LnNwYXRpYWxmaWx0ZXIuZW52ZWxvcGUubWF4eSk7 c3BmRWxlbS5hcHBlbmRDaGlsZChlbnZFbGVtKTt9ZWxzZSBpZih0eXBlb2YgZnF1 ZXJ5LnNwYXRpYWxmaWx0ZXIucG9seWdvbj09Im9iamVjdCIpe3NwZkVsZW0uYXBw ZW5kQ2hpbGQodGhpcy53cml0ZVBvbHlnb25HZW9tZXRyeShmcXVlcnkuc3BhdGlh bGZpbHRlci5wb2x5Z29uKSk7fX0KaWYoZnF1ZXJ5LndoZXJlIT1udWxsJiZmcXVl cnkud2hlcmUubGVuZ3RoPjApe3FFbGVtLnNldEF0dHJpYnV0ZSgid2hlcmUiLGZx dWVyeS53aGVyZSk7fX19CnJvb3QuYXBwZW5kQ2hpbGQocmVxRWxlbSk7cmV0dXJu IE9wZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5cGUud3JpdGUuYXBwbHkodGhp cyxbcm9vdF0pO30sYWRkR3JvdXBSZW5kZXJlcjpmdW5jdGlvbihsZGVmLHRvcHJl bmRlcmVyKXt2YXIgdG9wUmVsZW09dGhpcy5jcmVhdGVFbGVtZW50TlMoIiIsIkdS T1VQUkVOREVSRVIiKTtsZGVmLmFwcGVuZENoaWxkKHRvcFJlbGVtKTtmb3IodmFy IHJpbmQ9MDtyaW5kPHRvcHJlbmRlcmVyLmxlbmd0aDtyaW5kKyspe3ZhciByZW5k ZXJlcj10b3ByZW5kZXJlcltyaW5kXTt0aGlzLmFkZFJlbmRlcmVyKHRvcFJlbGVt LHJlbmRlcmVyKTt9fSxhZGRSZW5kZXJlcjpmdW5jdGlvbih0b3BSZWxlbSxyZW5k ZXJlcil7aWYoT3BlbkxheWVycy5VdGlsLmlzQXJyYXkocmVuZGVyZXIpKXt0aGlz LmFkZEdyb3VwUmVuZGVyZXIodG9wUmVsZW0scmVuZGVyZXIpO31lbHNle3ZhciBy ZW5kZXJFbGVtPXRoaXMuY3JlYXRlRWxlbWVudE5TKCIiLHJlbmRlcmVyLnR5cGUu dG9VcHBlckNhc2UoKSsiUkVOREVSRVIiKTt0b3BSZWxlbS5hcHBlbmRDaGlsZChy ZW5kZXJFbGVtKTtpZihyZW5kZXJFbGVtLnRhZ05hbWU9PSJWQUxVRU1BUFJFTkRF UkVSIil7dGhpcy5hZGRWYWx1ZU1hcFJlbmRlcmVyKHJlbmRlckVsZW0scmVuZGVy ZXIpO31lbHNlIGlmKHJlbmRlckVsZW0udGFnTmFtZT09IlZBTFVFTUFQTEFCRUxS RU5ERVJFUiIpe3RoaXMuYWRkVmFsdWVNYXBMYWJlbFJlbmRlcmVyKHJlbmRlckVs ZW0scmVuZGVyZXIpO31lbHNlIGlmKHJlbmRlckVsZW0udGFnTmFtZT09IlNJTVBM RUxBQkVMUkVOREVSRVIiKXt0aGlzLmFkZFNpbXBsZUxhYmVsUmVuZGVyZXIocmVu ZGVyRWxlbSxyZW5kZXJlcik7fWVsc2UgaWYocmVuZGVyRWxlbS50YWdOYW1lPT0i U0NBTEVERVBFTkRFTlRSRU5ERVJFUiIpe3RoaXMuYWRkU2NhbGVEZXBlbmRlbnRS ZW5kZXJlcihyZW5kZXJFbGVtLHJlbmRlcmVyKTt9fX0sYWRkU2NhbGVEZXBlbmRl bnRSZW5kZXJlcjpmdW5jdGlvbihyZW5kZXJFbGVtLHJlbmRlcmVyKXtpZih0eXBl b2YgcmVuZGVyZXIubG93ZXI9PSJzdHJpbmcifHx0eXBlb2YgcmVuZGVyZXIubG93 ZXI9PSJudW1iZXIiKXtyZW5kZXJFbGVtLnNldEF0dHJpYnV0ZSgibG93ZXIiLHJl bmRlcmVyLmxvd2VyKTt9CmlmKHR5cGVvZiByZW5kZXJlci51cHBlcj09InN0cmlu ZyJ8fHR5cGVvZiByZW5kZXJlci51cHBlcj09Im51bWJlciIpe3JlbmRlckVsZW0u c2V0QXR0cmlidXRlKCJ1cHBlciIscmVuZGVyZXIudXBwZXIpO30KdGhpcy5hZGRS ZW5kZXJlcihyZW5kZXJFbGVtLHJlbmRlcmVyLnJlbmRlcmVyKTt9LGFkZFZhbHVl TWFwTGFiZWxSZW5kZXJlcjpmdW5jdGlvbihyZW5kZXJFbGVtLHJlbmRlcmVyKXty ZW5kZXJFbGVtLnNldEF0dHJpYnV0ZSgibG9va3VwZmllbGQiLHJlbmRlcmVyLmxv b2t1cGZpZWxkKTtyZW5kZXJFbGVtLnNldEF0dHJpYnV0ZSgibGFiZWxmaWVsZCIs cmVuZGVyZXIubGFiZWxmaWVsZCk7aWYodHlwZW9mIHJlbmRlcmVyLmV4YWN0cz09 Im9iamVjdCIpe2Zvcih2YXIgZXh0PTAsZXh0bGVuPXJlbmRlcmVyLmV4YWN0cy5s ZW5ndGg7ZXh0PGV4dGxlbjtleHQrKyl7dmFyIGV4YWN0PXJlbmRlcmVyLmV4YWN0 c1tleHRdO3ZhciBlZWxlbT10aGlzLmNyZWF0ZUVsZW1lbnROUygiIiwiRVhBQ1Qi KTtpZih0eXBlb2YgZXhhY3QudmFsdWU9PSJzdHJpbmciKXtlZWxlbS5zZXRBdHRy aWJ1dGUoInZhbHVlIixleGFjdC52YWx1ZSk7fQppZih0eXBlb2YgZXhhY3QubGFi ZWw9PSJzdHJpbmciKXtlZWxlbS5zZXRBdHRyaWJ1dGUoImxhYmVsIixleGFjdC5s YWJlbCk7fQppZih0eXBlb2YgZXhhY3QubWV0aG9kPT0ic3RyaW5nIil7ZWVsZW0u c2V0QXR0cmlidXRlKCJtZXRob2QiLGV4YWN0Lm1ldGhvZCk7fQpyZW5kZXJFbGVt LmFwcGVuZENoaWxkKGVlbGVtKTtpZih0eXBlb2YgZXhhY3Quc3ltYm9sPT0ib2Jq ZWN0Iil7dmFyIHNlbGVtPW51bGw7aWYoZXhhY3Quc3ltYm9sLnR5cGU9PSJ0ZXh0 Iil7c2VsZW09dGhpcy5jcmVhdGVFbGVtZW50TlMoIiIsIlRFWFRTWU1CT0wiKTt9 CmlmKHNlbGVtIT1udWxsKXt2YXIga2V5cz10aGlzLmZvbnRTdHlsZUtleXM7Zm9y KHZhciBpPTAsbGVuPWtleXMubGVuZ3RoO2k8bGVuO2krKyl7dmFyIGtleT1rZXlz W2ldO2lmKGV4YWN0LnN5bWJvbFtrZXldKXtzZWxlbS5zZXRBdHRyaWJ1dGUoa2V5 LGV4YWN0LnN5bWJvbFtrZXldKTt9fQplZWxlbS5hcHBlbmRDaGlsZChzZWxlbSk7 fX19fX0sYWRkVmFsdWVNYXBSZW5kZXJlcjpmdW5jdGlvbihyZW5kZXJFbGVtLHJl bmRlcmVyKXtyZW5kZXJFbGVtLnNldEF0dHJpYnV0ZSgibG9va3VwZmllbGQiLHJl bmRlcmVyLmxvb2t1cGZpZWxkKTtpZih0eXBlb2YgcmVuZGVyZXIucmFuZ2VzPT0i b2JqZWN0Iil7Zm9yKHZhciBybmc9MCxybmdsZW49cmVuZGVyZXIucmFuZ2VzLmxl bmd0aDtybmc8cm5nbGVuO3JuZysrKXt2YXIgcmFuZ2U9cmVuZGVyZXIucmFuZ2Vz W3JuZ107dmFyIHJlbGVtPXRoaXMuY3JlYXRlRWxlbWVudE5TKCIiLCJSQU5HRSIp O3JlbGVtLnNldEF0dHJpYnV0ZSgibG93ZXIiLHJhbmdlLmxvd2VyKTtyZWxlbS5z ZXRBdHRyaWJ1dGUoInVwcGVyIixyYW5nZS51cHBlcik7cmVuZGVyRWxlbS5hcHBl bmRDaGlsZChyZWxlbSk7aWYodHlwZW9mIHJhbmdlLnN5bWJvbD09Im9iamVjdCIp e3ZhciBzZWxlbT1udWxsO2lmKHJhbmdlLnN5bWJvbC50eXBlPT0ic2ltcGxlcG9s eWdvbiIpe3NlbGVtPXRoaXMuY3JlYXRlRWxlbWVudE5TKCIiLCJTSU1QTEVQT0xZ R09OU1lNQk9MIik7fQppZihzZWxlbSE9bnVsbCl7aWYodHlwZW9mIHJhbmdlLnN5 bWJvbC5ib3VuZGFyeWNvbG9yPT0ic3RyaW5nIil7c2VsZW0uc2V0QXR0cmlidXRl KCJib3VuZGFyeWNvbG9yIixyYW5nZS5zeW1ib2wuYm91bmRhcnljb2xvcik7fQpp Zih0eXBlb2YgcmFuZ2Uuc3ltYm9sLmZpbGxjb2xvcj09InN0cmluZyIpe3NlbGVt LnNldEF0dHJpYnV0ZSgiZmlsbGNvbG9yIixyYW5nZS5zeW1ib2wuZmlsbGNvbG9y KTt9CmlmKHR5cGVvZiByYW5nZS5zeW1ib2wuZmlsbHRyYW5zcGFyZW5jeT09Im51 bWJlciIpe3NlbGVtLnNldEF0dHJpYnV0ZSgiZmlsbHRyYW5zcGFyZW5jeSIscmFu Z2Uuc3ltYm9sLmZpbGx0cmFuc3BhcmVuY3kpO30KcmVsZW0uYXBwZW5kQ2hpbGQo c2VsZW0pO319fX1lbHNlIGlmKHR5cGVvZiByZW5kZXJlci5leGFjdHM9PSJvYmpl Y3QiKXtmb3IodmFyIGV4dD0wLGV4dGxlbj1yZW5kZXJlci5leGFjdHMubGVuZ3Ro O2V4dDxleHRsZW47ZXh0Kyspe3ZhciBleGFjdD1yZW5kZXJlci5leGFjdHNbZXh0 XTt2YXIgZWVsZW09dGhpcy5jcmVhdGVFbGVtZW50TlMoIiIsIkVYQUNUIik7aWYo dHlwZW9mIGV4YWN0LnZhbHVlPT0ic3RyaW5nIil7ZWVsZW0uc2V0QXR0cmlidXRl KCJ2YWx1ZSIsZXhhY3QudmFsdWUpO30KaWYodHlwZW9mIGV4YWN0LmxhYmVsPT0i c3RyaW5nIil7ZWVsZW0uc2V0QXR0cmlidXRlKCJsYWJlbCIsZXhhY3QubGFiZWwp O30KaWYodHlwZW9mIGV4YWN0Lm1ldGhvZD09InN0cmluZyIpe2VlbGVtLnNldEF0 dHJpYnV0ZSgibWV0aG9kIixleGFjdC5tZXRob2QpO30KcmVuZGVyRWxlbS5hcHBl bmRDaGlsZChlZWxlbSk7aWYodHlwZW9mIGV4YWN0LnN5bWJvbD09Im9iamVjdCIp e3ZhciBzZWxlbT1udWxsO2lmKGV4YWN0LnN5bWJvbC50eXBlPT0ic2ltcGxlbWFy a2VyIil7c2VsZW09dGhpcy5jcmVhdGVFbGVtZW50TlMoIiIsIlNJTVBMRU1BUktF UlNZTUJPTCIpO30KaWYoc2VsZW0hPW51bGwpe2lmKHR5cGVvZiBleGFjdC5zeW1i b2wuYW50aWFsaWFzaW5nPT0ic3RyaW5nIil7c2VsZW0uc2V0QXR0cmlidXRlKCJh bnRpYWxpYXNpbmciLGV4YWN0LnN5bWJvbC5hbnRpYWxpYXNpbmcpO30KaWYodHlw ZW9mIGV4YWN0LnN5bWJvbC5jb2xvcj09InN0cmluZyIpe3NlbGVtLnNldEF0dHJp YnV0ZSgiY29sb3IiLGV4YWN0LnN5bWJvbC5jb2xvcik7fQppZih0eXBlb2YgZXhh Y3Quc3ltYm9sLm91dGxpbmU9PSJzdHJpbmciKXtzZWxlbS5zZXRBdHRyaWJ1dGUo Im91dGxpbmUiLGV4YWN0LnN5bWJvbC5vdXRsaW5lKTt9CmlmKHR5cGVvZiBleGFj dC5zeW1ib2wub3ZlcmxhcD09InN0cmluZyIpe3NlbGVtLnNldEF0dHJpYnV0ZSgi b3ZlcmxhcCIsZXhhY3Quc3ltYm9sLm92ZXJsYXApO30KaWYodHlwZW9mIGV4YWN0 LnN5bWJvbC5zaGFkb3c9PSJzdHJpbmciKXtzZWxlbS5zZXRBdHRyaWJ1dGUoInNo YWRvdyIsZXhhY3Quc3ltYm9sLnNoYWRvdyk7fQppZih0eXBlb2YgZXhhY3Quc3lt Ym9sLnRyYW5zcGFyZW5jeT09Im51bWJlciIpe3NlbGVtLnNldEF0dHJpYnV0ZSgi dHJhbnNwYXJlbmN5IixleGFjdC5zeW1ib2wudHJhbnNwYXJlbmN5KTt9CmlmKHR5 cGVvZiBleGFjdC5zeW1ib2wudXNlY2VudHJvaWQ9PSJzdHJpbmciKXtzZWxlbS5z ZXRBdHRyaWJ1dGUoInVzZWNlbnRyb2lkIixleGFjdC5zeW1ib2wudXNlY2VudHJv aWQpO30KaWYodHlwZW9mIGV4YWN0LnN5bWJvbC53aWR0aD09Im51bWJlciIpe3Nl bGVtLnNldEF0dHJpYnV0ZSgid2lkdGgiLGV4YWN0LnN5bWJvbC53aWR0aCk7fQpl ZWxlbS5hcHBlbmRDaGlsZChzZWxlbSk7fX19fX0sYWRkU2ltcGxlTGFiZWxSZW5k ZXJlcjpmdW5jdGlvbihyZW5kZXJFbGVtLHJlbmRlcmVyKXtyZW5kZXJFbGVtLnNl dEF0dHJpYnV0ZSgiZmllbGQiLHJlbmRlcmVyLmZpZWxkKTt2YXIga2V5cz1bJ2Zl YXR1cmV3ZWlnaHQnLCdob3dtYW55bGFiZWxzJywnbGFiZWxidWZmZXJyYXRpbycs J2xhYmVscHJpb3JpdGllcycsJ2xhYmVsd2VpZ2h0JywnbGluZWxhYmVscG9zaXRp b24nLCdyb3RhdGlvbmFsYW5nbGVzJ107Zm9yKHZhciBpPTAsbGVuPWtleXMubGVu Z3RoO2k8bGVuO2krKyl7dmFyIGtleT1rZXlzW2ldO2lmKHJlbmRlcmVyW2tleV0p e3JlbmRlckVsZW0uc2V0QXR0cmlidXRlKGtleSxyZW5kZXJlcltrZXldKTt9fQpp ZihyZW5kZXJlci5zeW1ib2wudHlwZT09InRleHQiKXt2YXIgc3ltYm9sPXJlbmRl cmVyLnN5bWJvbDt2YXIgc2VsZW09dGhpcy5jcmVhdGVFbGVtZW50TlMoIiIsIlRF WFRTWU1CT0wiKTtyZW5kZXJFbGVtLmFwcGVuZENoaWxkKHNlbGVtKTt2YXIga2V5 cz10aGlzLmZvbnRTdHlsZUtleXM7Zm9yKHZhciBpPTAsbGVuPWtleXMubGVuZ3Ro O2k8bGVuO2krKyl7dmFyIGtleT1rZXlzW2ldO2lmKHN5bWJvbFtrZXldKXtzZWxl bS5zZXRBdHRyaWJ1dGUoa2V5LHJlbmRlcmVyW2tleV0pO319fX0sd3JpdGVQb2x5 Z29uR2VvbWV0cnk6ZnVuY3Rpb24ocG9seWdvbil7aWYoIShwb2x5Z29uIGluc3Rh bmNlb2YgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2x5Z29uKSl7dGhyb3d7bWVzc2Fn ZTonQ2Fubm90IHdyaXRlIHBvbHlnb24gZ2VvbWV0cnkgdG8gQXJjWE1MIHdpdGgg YW4gJysKcG9seWdvbi5DTEFTU19OQU1FKycgb2JqZWN0LicsZ2VvbWV0cnk6cG9s eWdvbn07fQp2YXIgcG9seUVsZW09dGhpcy5jcmVhdGVFbGVtZW50TlMoIiIsIlBP TFlHT04iKTtmb3IodmFyIGxuPTAsbG5sZW49cG9seWdvbi5jb21wb25lbnRzLmxl bmd0aDtsbjxsbmxlbjtsbisrKXt2YXIgcmluZz1wb2x5Z29uLmNvbXBvbmVudHNb bG5dO3ZhciByaW5nRWxlbT10aGlzLmNyZWF0ZUVsZW1lbnROUygiIiwiUklORyIp O2Zvcih2YXIgcm49MCxybmxlbj1yaW5nLmNvbXBvbmVudHMubGVuZ3RoO3JuPHJu bGVuO3JuKyspe3ZhciBwb2ludD1yaW5nLmNvbXBvbmVudHNbcm5dO3ZhciBwb2lu dEVsZW09dGhpcy5jcmVhdGVFbGVtZW50TlMoIiIsIlBPSU5UIik7cG9pbnRFbGVt LnNldEF0dHJpYnV0ZSgieCIscG9pbnQueCk7cG9pbnRFbGVtLnNldEF0dHJpYnV0 ZSgieSIscG9pbnQueSk7cmluZ0VsZW0uYXBwZW5kQ2hpbGQocG9pbnRFbGVtKTt9 CnBvbHlFbGVtLmFwcGVuZENoaWxkKHJpbmdFbGVtKTt9CnJldHVybiBwb2x5RWxl bTt9LHBhcnNlUmVzcG9uc2U6ZnVuY3Rpb24oZGF0YSl7aWYodHlwZW9mIGRhdGE9 PSJzdHJpbmciKXt2YXIgbmV3RGF0YT1uZXcgT3BlbkxheWVycy5Gb3JtYXQuWE1M KCk7ZGF0YT1uZXdEYXRhLnJlYWQoZGF0YSk7fQp2YXIgcmVzcG9uc2U9bmV3IE9w ZW5MYXllcnMuRm9ybWF0LkFyY1hNTC5SZXNwb25zZSgpO3ZhciBlcnJvck5vZGU9 ZGF0YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRVJST1IiKTtpZihlcnJvck5vZGUh PW51bGwmJmVycm9yTm9kZS5sZW5ndGg+MCl7cmVzcG9uc2UuZXJyb3I9dGhpcy5n ZXRDaGlsZFZhbHVlKGVycm9yTm9kZSwiVW5rbm93biBlcnJvci4iKTt9ZWxzZXt2 YXIgcmVzcG9uc2VOb2RlPWRhdGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlJFU1BP TlNFIik7aWYocmVzcG9uc2VOb2RlPT1udWxsfHxyZXNwb25zZU5vZGUubGVuZ3Ro PT0wKXtyZXNwb25zZS5lcnJvcj0iTm8gUkVTUE9OU0UgdGFnIGZvdW5kIGluIEFy Y1hNTCByZXNwb25zZS4iO3JldHVybiByZXNwb25zZTt9CnZhciBydHlwZT1yZXNw b25zZU5vZGVbMF0uZmlyc3RDaGlsZC5ub2RlTmFtZTtpZihydHlwZT09IiN0ZXh0 Iil7cnR5cGU9cmVzcG9uc2VOb2RlWzBdLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmcu bm9kZU5hbWU7fQppZihydHlwZT09IklNQUdFIil7dmFyIGVudmVsb3BlTm9kZT1k YXRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFTlZFTE9QRSIpO3ZhciBvdXRwdXRO b2RlPWRhdGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk9VVFBVVCIpO2lmKGVudmVs b3BlTm9kZT09bnVsbHx8ZW52ZWxvcGVOb2RlLmxlbmd0aD09MCl7cmVzcG9uc2Uu ZXJyb3I9Ik5vIEVOVkVMT1BFIHRhZyBmb3VuZCBpbiBBcmNYTUwgcmVzcG9uc2Uu Ijt9ZWxzZSBpZihvdXRwdXROb2RlPT1udWxsfHxvdXRwdXROb2RlLmxlbmd0aD09 MCl7cmVzcG9uc2UuZXJyb3I9Ik5vIE9VVFBVVCB0YWcgZm91bmQgaW4gQXJjWE1M IHJlc3BvbnNlLiI7fWVsc2V7dmFyIGVudkF0dHI9dGhpcy5wYXJzZUF0dHJpYnV0 ZXMoZW52ZWxvcGVOb2RlWzBdKTt2YXIgb3V0cHV0QXR0cj10aGlzLnBhcnNlQXR0 cmlidXRlcyhvdXRwdXROb2RlWzBdKTtpZih0eXBlb2Ygb3V0cHV0QXR0ci50eXBl PT0ic3RyaW5nIil7cmVzcG9uc2UuaW1hZ2U9e2VudmVsb3BlOmVudkF0dHIsb3V0 cHV0Ont0eXBlOm91dHB1dEF0dHIudHlwZSxkYXRhOnRoaXMuZ2V0Q2hpbGRWYWx1 ZShvdXRwdXROb2RlWzBdKX19O31lbHNle3Jlc3BvbnNlLmltYWdlPXtlbnZlbG9w ZTplbnZBdHRyLG91dHB1dDpvdXRwdXRBdHRyfTt9fX1lbHNlIGlmKHJ0eXBlPT0i RkVBVFVSRVMiKXt2YXIgZmVhdHVyZXM9cmVzcG9uc2VOb2RlWzBdLmdldEVsZW1l bnRzQnlUYWdOYW1lKCJGRUFUVVJFUyIpO3ZhciBmZWF0dXJlQ291bnQ9ZmVhdHVy ZXNbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZFQVRVUkVDT1VOVCIpO3Jlc3Bv bnNlLmZlYXR1cmVzLmZlYXR1cmVjb3VudD1mZWF0dXJlQ291bnRbMF0uZ2V0QXR0 cmlidXRlKCJjb3VudCIpO2lmKHJlc3BvbnNlLmZlYXR1cmVzLmZlYXR1cmVjb3Vu dD4wKXt2YXIgZW52ZWxvcGU9ZmVhdHVyZXNbMF0uZ2V0RWxlbWVudHNCeVRhZ05h bWUoIkVOVkVMT1BFIik7cmVzcG9uc2UuZmVhdHVyZXMuZW52ZWxvcGU9dGhpcy5w YXJzZUF0dHJpYnV0ZXMoZW52ZWxvcGVbMF0sdHlwZW9mKDApKTt2YXIgZmVhdHVy ZUxpc3Q9ZmVhdHVyZXNbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZFQVRVUkUi KTtmb3IodmFyIGZuPTA7Zm48ZmVhdHVyZUxpc3QubGVuZ3RoO2ZuKyspe3ZhciBm ZWF0dXJlPW5ldyBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9yKCk7dmFyIGZpZWxk cz1mZWF0dXJlTGlzdFtmbl0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZJRUxEIik7 Zm9yKHZhciBmZG49MDtmZG48ZmllbGRzLmxlbmd0aDtmZG4rKyl7dmFyIGZpZWxk TmFtZT1maWVsZHNbZmRuXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTt2YXIgZmllbGRW YWx1ZT1maWVsZHNbZmRuXS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7ZmVhdHVyZS5h dHRyaWJ1dGVzW2ZpZWxkTmFtZV09ZmllbGRWYWx1ZTt9CnZhciBnZW9tPWZlYXR1 cmVMaXN0W2ZuXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiUE9MWUdPTiIpO2lmKGdl b20ubGVuZ3RoPjApe3ZhciByaW5nPWdlb21bMF0uZ2V0RWxlbWVudHNCeVRhZ05h bWUoIlJJTkciKTt2YXIgcG9seXM9W107Zm9yKHZhciBybj0wO3JuPHJpbmcubGVu Z3RoO3JuKyspe3ZhciBsaW5lYXJSaW5ncz1bXTtsaW5lYXJSaW5ncy5wdXNoKHRo aXMucGFyc2VQb2ludEdlb21ldHJ5KHJpbmdbcm5dKSk7dmFyIGhvbGVzPXJpbmdb cm5dLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJIT0xFIik7Zm9yKHZhciBobj0wO2hu PGhvbGVzLmxlbmd0aDtobisrKXtsaW5lYXJSaW5ncy5wdXNoKHRoaXMucGFyc2VQ b2ludEdlb21ldHJ5KGhvbGVzW2huXSkpO30KaG9sZXM9bnVsbDtwb2x5cy5wdXNo KG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvbHlnb24obGluZWFyUmluZ3MpKTts aW5lYXJSaW5ncz1udWxsO30KcmluZz1udWxsO2lmKHBvbHlzLmxlbmd0aD09MSl7 ZmVhdHVyZS5nZW9tZXRyeT1wb2x5c1swXTt9ZWxzZQp7ZmVhdHVyZS5nZW9tZXRy eT1uZXcgT3BlbkxheWVycy5HZW9tZXRyeS5NdWx0aVBvbHlnb24ocG9seXMpO319 CnJlc3BvbnNlLmZlYXR1cmVzLmZlYXR1cmUucHVzaChmZWF0dXJlKTt9fX1lbHNl e3Jlc3BvbnNlLmVycm9yPSJVbmlkZW50aWZpZWQgcmVzcG9uc2UgdHlwZS4iO319 CnJldHVybiByZXNwb25zZTt9LHBhcnNlQXR0cmlidXRlczpmdW5jdGlvbihub2Rl LHR5cGUpe3ZhciBhdHRyaWJ1dGVzPXt9O2Zvcih2YXIgYXR0cj0wO2F0dHI8bm9k ZS5hdHRyaWJ1dGVzLmxlbmd0aDthdHRyKyspe2lmKHR5cGU9PSJudW1iZXIiKXth dHRyaWJ1dGVzW25vZGUuYXR0cmlidXRlc1thdHRyXS5ub2RlTmFtZV09cGFyc2VG bG9hdChub2RlLmF0dHJpYnV0ZXNbYXR0cl0ubm9kZVZhbHVlKTt9ZWxzZXthdHRy aWJ1dGVzW25vZGUuYXR0cmlidXRlc1thdHRyXS5ub2RlTmFtZV09bm9kZS5hdHRy aWJ1dGVzW2F0dHJdLm5vZGVWYWx1ZTt9fQpyZXR1cm4gYXR0cmlidXRlczt9LHBh cnNlUG9pbnRHZW9tZXRyeTpmdW5jdGlvbihub2RlKXt2YXIgcmluZ1BvaW50cz1b XTt2YXIgY29vcmRzPW5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNPT1JEUyIp O2lmKGNvb3Jkcy5sZW5ndGg+MCl7dmFyIGNvb3JkQXJyPXRoaXMuZ2V0Q2hpbGRW YWx1ZShjb29yZHNbMF0pO2Nvb3JkQXJyPWNvb3JkQXJyLnNwbGl0KC87Lyk7Zm9y KHZhciBjbj0wO2NuPGNvb3JkQXJyLmxlbmd0aDtjbisrKXt2YXIgY29vcmRJdGVt cz1jb29yZEFycltjbl0uc3BsaXQoLyAvKTtyaW5nUG9pbnRzLnB1c2gobmV3IE9w ZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQocGFyc2VGbG9hdChjb29yZEl0ZW1zWzBd KSxwYXJzZUZsb2F0KGNvb3JkSXRlbXNbMV0pKSk7fQpjb29yZHM9bnVsbDt9ZWxz ZXt2YXIgcG9pbnQ9bm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiUE9JTlQiKTtp Zihwb2ludC5sZW5ndGg+MCl7Zm9yKHZhciBwbj0wO3BuPHBvaW50Lmxlbmd0aDtw bisrKXtyaW5nUG9pbnRzLnB1c2gobmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9p bnQocGFyc2VGbG9hdChwb2ludFtwbl0uZ2V0QXR0cmlidXRlKCJ4IikpLHBhcnNl RmxvYXQocG9pbnRbcG5dLmdldEF0dHJpYnV0ZSgieSIpKSkpO319CnBvaW50PW51 bGw7fQpyZXR1cm4gbmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuTGluZWFyUmluZyhy aW5nUG9pbnRzKTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0LkFyY1hN TCJ9KTtPcGVuTGF5ZXJzLkZvcm1hdC5BcmNYTUwuUmVxdWVzdD1PcGVuTGF5ZXJz LkNsYXNzKHtpbml0aWFsaXplOmZ1bmN0aW9uKHBhcmFtcyl7dmFyIGRlZmF1bHRz PXtnZXRfaW1hZ2U6e3Byb3BlcnRpZXM6e2JhY2tncm91bmQ6bnVsbCxkcmF3OnRy dWUsZW52ZWxvcGU6e21pbng6MCxtaW55OjAsbWF4eDowLG1heHk6MH0sZmVhdHVy ZWNvb3Jkc3lzOntpZDowLHN0cmluZzoiIixkYXR1bXRyYW5zZm9ybWlkOjAsZGF0 dW10cmFuc2Zvcm1zdHJpbmc6IiJ9LGZpbHRlcmNvb3Jkc3lzOntpZDowLHN0cmlu ZzoiIixkYXR1bXRyYW5zZm9ybWlkOjAsZGF0dW10cmFuc2Zvcm1zdHJpbmc6IiJ9 LGltYWdlc2l6ZTp7aGVpZ2h0OjAsd2lkdGg6MCxkcGk6OTYscHJpbnRoZWlnaHQ6 MCxwcmludHdpZHRoOjAsc2NhbGVzeW1ib2xzOmZhbHNlfSxsYXllcmxpc3Q6W10s b3V0cHV0OntiYXNldXJsOiIiLGxlZ2VuZGJhc2V1cmw6IiIsbGVnZW5kbmFtZToi IixsZWdlbmRwYXRoOiIiLGxlZ2VuZHVybDoiIixuYW1lOiIiLHBhdGg6IiIsdHlw ZToianBnIix1cmw6IiJ9fX0sZ2V0X2ZlYXR1cmU6e2xheWVyOiIiLHF1ZXJ5Ontp c3NwYXRpYWw6ZmFsc2UsZmVhdHVyZWNvb3Jkc3lzOntpZDowLHN0cmluZzoiIixk YXR1bXRyYW5zZm9ybWlkOjAsZGF0dW10cmFuc2Zvcm1zdHJpbmc6IiJ9LGZpbHRl cmNvb3Jkc3lzOntpZDowLHN0cmluZzoiIixkYXR1bXRyYW5zZm9ybWlkOjAsZGF0 dW10cmFuc2Zvcm1zdHJpbmc6IiJ9LGJ1ZmZlcjowLHdoZXJlOiIiLHNwYXRpYWxm aWx0ZXI6e3JlbGF0aW9uOiJlbnZlbG9wZV9pbnRlcnNlY3Rpb24iLGVudmVsb3Bl Om51bGx9fX0sZW52aXJvbm1lbnQ6e3NlcGFyYXRvcnM6e2NzOiIgIix0czoiOyJ9 fSxsYXllcjpbXSx3b3Jrc3BhY2VzOltdfTtyZXR1cm4gT3BlbkxheWVycy5VdGls LmV4dGVuZCh0aGlzLGRlZmF1bHRzKTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMu Rm9ybWF0LkFyY1hNTC5SZXF1ZXN0In0pO09wZW5MYXllcnMuRm9ybWF0LkFyY1hN TC5SZXNwb25zZT1PcGVuTGF5ZXJzLkNsYXNzKHtpbml0aWFsaXplOmZ1bmN0aW9u KHBhcmFtcyl7dmFyIGRlZmF1bHRzPXtpbWFnZTp7ZW52ZWxvcGU6bnVsbCxvdXRw dXQ6Jyd9LGZlYXR1cmVzOntmZWF0dXJlY291bnQ6MCxlbnZlbG9wZTpudWxsLGZl YXR1cmU6W119LGVycm9yOicnfTtyZXR1cm4gT3BlbkxheWVycy5VdGlsLmV4dGVu ZCh0aGlzLGRlZmF1bHRzKTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0 LkFyY1hNTC5SZXNwb25zZSJ9KTtPcGVuTGF5ZXJzLlJlcXVlc3Q9e0RFRkFVTFRf Q09ORklHOnttZXRob2Q6IkdFVCIsdXJsOndpbmRvdy5sb2NhdGlvbi5ocmVmLGFz eW5jOnRydWUsdXNlcjp1bmRlZmluZWQscGFzc3dvcmQ6dW5kZWZpbmVkLHBhcmFt czpudWxsLHByb3h5Ok9wZW5MYXllcnMuUHJveHlIb3N0LGhlYWRlcnM6e30sZGF0 YTpudWxsLGNhbGxiYWNrOmZ1bmN0aW9uKCl7fSxzdWNjZXNzOm51bGwsZmFpbHVy ZTpudWxsLHNjb3BlOm51bGx9LFVSTF9TUExJVF9SRUdFWDovKFteOl0qOilcL1wv KFteOl0qOj9bXkBdKkApPyhbXjpcL1w/XSopOj8oW15cL1w/XSopLyxldmVudHM6 bmV3IE9wZW5MYXllcnMuRXZlbnRzKHRoaXMsbnVsbCxbImNvbXBsZXRlIiwic3Vj Y2VzcyIsImZhaWx1cmUiXSksaXNzdWU6ZnVuY3Rpb24oY29uZmlnKXt2YXIgZGVm YXVsdENvbmZpZz1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHRoaXMuREVGQVVMVF9D T05GSUcse3Byb3h5Ok9wZW5MYXllcnMuUHJveHlIb3N0fSk7Y29uZmlnPU9wZW5M YXllcnMuVXRpbC5hcHBseURlZmF1bHRzKGNvbmZpZyxkZWZhdWx0Q29uZmlnKTt2 YXIgcmVxdWVzdD1uZXcgT3BlbkxheWVycy5SZXF1ZXN0LlhNTEh0dHBSZXF1ZXN0 KCk7dmFyIHVybD1PcGVuTGF5ZXJzLlV0aWwudXJsQXBwZW5kKGNvbmZpZy51cmws T3BlbkxheWVycy5VdGlsLmdldFBhcmFtZXRlclN0cmluZyhjb25maWcucGFyYW1z fHx7fSkpO3ZhciBzYW1lT3JpZ2luPSEodXJsLmluZGV4T2YoImh0dHAiKT09MCk7 dmFyIHVybFBhcnRzPSFzYW1lT3JpZ2luJiZ1cmwubWF0Y2godGhpcy5VUkxfU1BM SVRfUkVHRVgpO2lmKHVybFBhcnRzKXt2YXIgbG9jYXRpb249d2luZG93LmxvY2F0 aW9uO3NhbWVPcmlnaW49dXJsUGFydHNbMV09PWxvY2F0aW9uLnByb3RvY29sJiZ1 cmxQYXJ0c1szXT09bG9jYXRpb24uaG9zdG5hbWU7dmFyIHVQb3J0PXVybFBhcnRz WzRdLGxQb3J0PWxvY2F0aW9uLnBvcnQ7aWYodVBvcnQhPTgwJiZ1UG9ydCE9IiJ8 fGxQb3J0IT0iODAiJiZsUG9ydCE9IiIpe3NhbWVPcmlnaW49c2FtZU9yaWdpbiYm dVBvcnQ9PWxQb3J0O319CmlmKCFzYW1lT3JpZ2luKXtpZihjb25maWcucHJveHkp e2lmKHR5cGVvZiBjb25maWcucHJveHk9PSJmdW5jdGlvbiIpe3VybD1jb25maWcu cHJveHkodXJsKTt9ZWxzZXt1cmw9Y29uZmlnLnByb3h5K2VuY29kZVVSSUNvbXBv bmVudCh1cmwpO319ZWxzZXtPcGVuTGF5ZXJzLkNvbnNvbGUud2FybihPcGVuTGF5 ZXJzLmkxOG4oInByb3h5TmVlZGVkIikse3VybDp1cmx9KTt9fQpyZXF1ZXN0Lm9w ZW4oY29uZmlnLm1ldGhvZCx1cmwsY29uZmlnLmFzeW5jLGNvbmZpZy51c2VyLGNv bmZpZy5wYXNzd29yZCk7Zm9yKHZhciBoZWFkZXIgaW4gY29uZmlnLmhlYWRlcnMp e3JlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsY29uZmlnLmhlYWRlcnNb aGVhZGVyXSk7fQp2YXIgZXZlbnRzPXRoaXMuZXZlbnRzO3ZhciBzZWxmPXRoaXM7 cmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZihyZXF1ZXN0 LnJlYWR5U3RhdGU9PU9wZW5MYXllcnMuUmVxdWVzdC5YTUxIdHRwUmVxdWVzdC5E T05FKXt2YXIgcHJvY2VlZD1ldmVudHMudHJpZ2dlckV2ZW50KCJjb21wbGV0ZSIs e3JlcXVlc3Q6cmVxdWVzdCxjb25maWc6Y29uZmlnLHJlcXVlc3RVcmw6dXJsfSk7 aWYocHJvY2VlZCE9PWZhbHNlKXtzZWxmLnJ1bkNhbGxiYWNrcyh7cmVxdWVzdDpy ZXF1ZXN0LGNvbmZpZzpjb25maWcscmVxdWVzdFVybDp1cmx9KTt9fX07aWYoY29u ZmlnLmFzeW5jPT09ZmFsc2Upe3JlcXVlc3Quc2VuZChjb25maWcuZGF0YSk7fWVs c2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihyZXF1ZXN0LnJlYWR5 U3RhdGUhPT0wKXtyZXF1ZXN0LnNlbmQoY29uZmlnLmRhdGEpO319LDApO30KcmV0 dXJuIHJlcXVlc3Q7fSxydW5DYWxsYmFja3M6ZnVuY3Rpb24ob3B0aW9ucyl7dmFy IHJlcXVlc3Q9b3B0aW9ucy5yZXF1ZXN0O3ZhciBjb25maWc9b3B0aW9ucy5jb25m aWc7dmFyIGNvbXBsZXRlPShjb25maWcuc2NvcGUpP09wZW5MYXllcnMuRnVuY3Rp b24uYmluZChjb25maWcuY2FsbGJhY2ssY29uZmlnLnNjb3BlKTpjb25maWcuY2Fs bGJhY2s7dmFyIHN1Y2Nlc3M7aWYoY29uZmlnLnN1Y2Nlc3Mpe3N1Y2Nlc3M9KGNv bmZpZy5zY29wZSk/T3BlbkxheWVycy5GdW5jdGlvbi5iaW5kKGNvbmZpZy5zdWNj ZXNzLGNvbmZpZy5zY29wZSk6Y29uZmlnLnN1Y2Nlc3M7fQp2YXIgZmFpbHVyZTtp Zihjb25maWcuZmFpbHVyZSl7ZmFpbHVyZT0oY29uZmlnLnNjb3BlKT9PcGVuTGF5 ZXJzLkZ1bmN0aW9uLmJpbmQoY29uZmlnLmZhaWx1cmUsY29uZmlnLnNjb3BlKTpj b25maWcuZmFpbHVyZTt9CmlmKE9wZW5MYXllcnMuVXRpbC5jcmVhdGVVcmxPYmpl Y3QoY29uZmlnLnVybCkucHJvdG9jb2w9PSJmaWxlOiImJnJlcXVlc3QucmVzcG9u c2VUZXh0KXtyZXF1ZXN0LnN0YXR1cz0yMDA7fQpjb21wbGV0ZShyZXF1ZXN0KTtp ZighcmVxdWVzdC5zdGF0dXN8fChyZXF1ZXN0LnN0YXR1cz49MjAwJiZyZXF1ZXN0 LnN0YXR1czwzMDApKXt0aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQoInN1Y2Nlc3Mi LG9wdGlvbnMpO2lmKHN1Y2Nlc3Mpe3N1Y2Nlc3MocmVxdWVzdCk7fX0KaWYocmVx dWVzdC5zdGF0dXMmJihyZXF1ZXN0LnN0YXR1czwyMDB8fHJlcXVlc3Quc3RhdHVz Pj0zMDApKXt0aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQoImZhaWx1cmUiLG9wdGlv bnMpO2lmKGZhaWx1cmUpe2ZhaWx1cmUocmVxdWVzdCk7fX19LEdFVDpmdW5jdGlv bihjb25maWcpe2NvbmZpZz1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKGNvbmZpZyx7 bWV0aG9kOiJHRVQifSk7cmV0dXJuIE9wZW5MYXllcnMuUmVxdWVzdC5pc3N1ZShj b25maWcpO30sUE9TVDpmdW5jdGlvbihjb25maWcpe2NvbmZpZz1PcGVuTGF5ZXJz LlV0aWwuZXh0ZW5kKGNvbmZpZyx7bWV0aG9kOiJQT1NUIn0pO2NvbmZpZy5oZWFk ZXJzPWNvbmZpZy5oZWFkZXJzP2NvbmZpZy5oZWFkZXJzOnt9O2lmKCEoIkNPTlRF TlQtVFlQRSJpbiBPcGVuTGF5ZXJzLlV0aWwudXBwZXJDYXNlT2JqZWN0KGNvbmZp Zy5oZWFkZXJzKSkpe2NvbmZpZy5oZWFkZXJzWyJDb250ZW50LVR5cGUiXT0iYXBw bGljYXRpb24veG1sIjt9CnJldHVybiBPcGVuTGF5ZXJzLlJlcXVlc3QuaXNzdWUo Y29uZmlnKTt9LFBVVDpmdW5jdGlvbihjb25maWcpe2NvbmZpZz1PcGVuTGF5ZXJz LlV0aWwuZXh0ZW5kKGNvbmZpZyx7bWV0aG9kOiJQVVQifSk7Y29uZmlnLmhlYWRl cnM9Y29uZmlnLmhlYWRlcnM/Y29uZmlnLmhlYWRlcnM6e307aWYoISgiQ09OVEVO VC1UWVBFImluIE9wZW5MYXllcnMuVXRpbC51cHBlckNhc2VPYmplY3QoY29uZmln LmhlYWRlcnMpKSl7Y29uZmlnLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdPSJhcHBs aWNhdGlvbi94bWwiO30KcmV0dXJuIE9wZW5MYXllcnMuUmVxdWVzdC5pc3N1ZShj b25maWcpO30sREVMRVRFOmZ1bmN0aW9uKGNvbmZpZyl7Y29uZmlnPU9wZW5MYXll cnMuVXRpbC5leHRlbmQoY29uZmlnLHttZXRob2Q6IkRFTEVURSJ9KTtyZXR1cm4g T3BlbkxheWVycy5SZXF1ZXN0Lmlzc3VlKGNvbmZpZyk7fSxIRUFEOmZ1bmN0aW9u KGNvbmZpZyl7Y29uZmlnPU9wZW5MYXllcnMuVXRpbC5leHRlbmQoY29uZmlnLHtt ZXRob2Q6IkhFQUQifSk7cmV0dXJuIE9wZW5MYXllcnMuUmVxdWVzdC5pc3N1ZShj b25maWcpO30sT1BUSU9OUzpmdW5jdGlvbihjb25maWcpe2NvbmZpZz1PcGVuTGF5 ZXJzLlV0aWwuZXh0ZW5kKGNvbmZpZyx7bWV0aG9kOiJPUFRJT05TIn0pO3JldHVy biBPcGVuTGF5ZXJzLlJlcXVlc3QuaXNzdWUoY29uZmlnKTt9fTtPcGVuTGF5ZXJz LkxheWVyLkFyY0lNUz1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuTGF5ZXIu R3JpZCx7REVGQVVMVF9QQVJBTVM6e0NsaWVudFZlcnNpb246IjkuMiIsU2Vydmlj ZU5hbWU6Jyd9LHRpbGVTaXplOm51bGwsZmVhdHVyZUNvb3JkU3lzOiI0MzI2Iixm aWx0ZXJDb29yZFN5czoiNDMyNiIsbGF5ZXJzOm51bGwsYXN5bmM6dHJ1ZSxuYW1l OiJBcmNJTVMiLGlzQmFzZUxheWVyOnRydWUsREVGQVVMVF9PUFRJT05TOnt0aWxl U2l6ZTpuZXcgT3BlbkxheWVycy5TaXplKDUxMiw1MTIpLGZlYXR1cmVDb29yZFN5 czoiNDMyNiIsZmlsdGVyQ29vcmRTeXM6IjQzMjYiLGxheWVyczpudWxsLGlzQmFz ZUxheWVyOnRydWUsYXN5bmM6dHJ1ZSxuYW1lOiJBcmNJTVMifSxpbml0aWFsaXpl OmZ1bmN0aW9uKG5hbWUsdXJsLG9wdGlvbnMpe3RoaXMudGlsZVNpemU9bmV3IE9w ZW5MYXllcnMuU2l6ZSg1MTIsNTEyKTt0aGlzLnBhcmFtcz1PcGVuTGF5ZXJzLlV0 aWwuYXBwbHlEZWZhdWx0cyh7U2VydmljZU5hbWU6b3B0aW9ucy5zZXJ2aWNlTmFt ZX0sdGhpcy5ERUZBVUxUX1BBUkFNUyk7dGhpcy5vcHRpb25zPU9wZW5MYXllcnMu VXRpbC5hcHBseURlZmF1bHRzKG9wdGlvbnMsdGhpcy5ERUZBVUxUX09QVElPTlMp O09wZW5MYXllcnMuTGF5ZXIuR3JpZC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBs eSh0aGlzLFtuYW1lLHVybCx0aGlzLnBhcmFtcyxvcHRpb25zXSk7aWYodGhpcy50 cmFuc3BhcmVudCl7aWYoIXRoaXMuaXNCYXNlTGF5ZXIpe3RoaXMuaXNCYXNlTGF5 ZXI9ZmFsc2U7fQppZih0aGlzLmZvcm1hdD09ImltYWdlL2pwZWciKXt0aGlzLmZv cm1hdD1PcGVuTGF5ZXJzLlV0aWwuYWxwaGFIYWNrKCk/ImltYWdlL2dpZiI6Imlt YWdlL3BuZyI7fX0KaWYodGhpcy5vcHRpb25zLmxheWVycz09PW51bGwpe3RoaXMu b3B0aW9ucy5sYXllcnM9W107fX0sZGVzdHJveTpmdW5jdGlvbigpe09wZW5MYXll cnMuTGF5ZXIuR3JpZC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLGFyZ3Vt ZW50cyk7fSxnZXRVUkw6ZnVuY3Rpb24oYm91bmRzKXt2YXIgdXJsPSIiO2JvdW5k cz10aGlzLmFkanVzdEJvdW5kcyhib3VuZHMpO3ZhciBheGxSZXE9bmV3IE9wZW5M YXllcnMuRm9ybWF0LkFyY1hNTChPcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHRoaXMu b3B0aW9ucyx7cmVxdWVzdHR5cGU6ImltYWdlIixlbnZlbG9wZTpib3VuZHMudG9B cnJheSgpLHRpbGVTaXplOnRoaXMudGlsZVNpemV9KSk7dmFyIHJlcT1uZXcgT3Bl bkxheWVycy5SZXF1ZXN0LlBPU1Qoe3VybDp0aGlzLmdldEZ1bGxSZXF1ZXN0U3Ry aW5nKCksZGF0YTpheGxSZXEud3JpdGUoKSxhc3luYzpmYWxzZX0pO2lmKHJlcSE9 bnVsbCl7dmFyIGRvYz1yZXEucmVzcG9uc2VYTUw7aWYoIWRvY3x8IWRvYy5kb2N1 bWVudEVsZW1lbnQpe2RvYz1yZXEucmVzcG9uc2VUZXh0O30KdmFyIGF4bFJlc3A9 bmV3IE9wZW5MYXllcnMuRm9ybWF0LkFyY1hNTCgpO3ZhciBhcmN4bWw9YXhsUmVz cC5yZWFkKGRvYyk7dXJsPXRoaXMuZ2V0VXJsT3JJbWFnZShhcmN4bWwuaW1hZ2Uu b3V0cHV0KTt9CnJldHVybiB1cmw7fSxnZXRVUkxhc3luYzpmdW5jdGlvbihib3Vu ZHMsc2NvcGUscHJvcCxjYWxsYmFjayl7Ym91bmRzPXRoaXMuYWRqdXN0Qm91bmRz KGJvdW5kcyk7dmFyIGF4bFJlcT1uZXcgT3BlbkxheWVycy5Gb3JtYXQuQXJjWE1M KE9wZW5MYXllcnMuVXRpbC5leHRlbmQodGhpcy5vcHRpb25zLHtyZXF1ZXN0dHlw ZToiaW1hZ2UiLGVudmVsb3BlOmJvdW5kcy50b0FycmF5KCksdGlsZVNpemU6dGhp cy50aWxlU2l6ZX0pKTtPcGVuTGF5ZXJzLlJlcXVlc3QuUE9TVCh7dXJsOnRoaXMu Z2V0RnVsbFJlcXVlc3RTdHJpbmcoKSxhc3luYzp0cnVlLGRhdGE6YXhsUmVxLndy aXRlKCksY2FsbGJhY2s6ZnVuY3Rpb24ocmVxKXt2YXIgZG9jPXJlcS5yZXNwb25z ZVhNTDtpZighZG9jfHwhZG9jLmRvY3VtZW50RWxlbWVudCl7ZG9jPXJlcS5yZXNw b25zZVRleHQ7fQp2YXIgYXhsUmVzcD1uZXcgT3BlbkxheWVycy5Gb3JtYXQuQXJj WE1MKCk7dmFyIGFyY3htbD1heGxSZXNwLnJlYWQoZG9jKTtzY29wZVtwcm9wXT10 aGlzLmdldFVybE9ySW1hZ2UoYXJjeG1sLmltYWdlLm91dHB1dCk7Y2FsbGJhY2su YXBwbHkoc2NvcGUpO30sc2NvcGU6dGhpc30pO30sZ2V0VXJsT3JJbWFnZTpmdW5j dGlvbihvdXRwdXQpe3ZhciByZXQ9IiI7aWYob3V0cHV0LnVybCl7cmV0PW91dHB1 dC51cmw7fWVsc2UgaWYob3V0cHV0LmRhdGEpe3JldD0iZGF0YTppbWFnZS8iK291 dHB1dC50eXBlKyI7YmFzZTY0LCIrb3V0cHV0LmRhdGE7fQpyZXR1cm4gcmV0O30s c2V0TGF5ZXJRdWVyeTpmdW5jdGlvbihpZCxxdWVyeWRlZil7Zm9yKHZhciBseXI9 MDtseXI8dGhpcy5vcHRpb25zLmxheWVycy5sZW5ndGg7bHlyKyspe2lmKGlkPT10 aGlzLm9wdGlvbnMubGF5ZXJzW2x5cl0uaWQpe3RoaXMub3B0aW9ucy5sYXllcnNb bHlyXS5xdWVyeT1xdWVyeWRlZjtyZXR1cm47fX0KdGhpcy5vcHRpb25zLmxheWVy cy5wdXNoKHtpZDppZCx2aXNpYmxlOnRydWUscXVlcnk6cXVlcnlkZWZ9KTt9LGdl dEZlYXR1cmVJbmZvOmZ1bmN0aW9uKGdlb21ldHJ5LGxheWVyLG9wdGlvbnMpe3Zh ciBidWZmZXI9b3B0aW9ucy5idWZmZXJ8fDE7dmFyIGNhbGxiYWNrPW9wdGlvbnMu Y2FsbGJhY2t8fGZ1bmN0aW9uKCl7fTt2YXIgc2NvcGU9b3B0aW9ucy5zY29wZXx8 d2luZG93O3ZhciByZXF1ZXN0T3B0aW9ucz17fTtPcGVuTGF5ZXJzLlV0aWwuZXh0 ZW5kKHJlcXVlc3RPcHRpb25zLHRoaXMub3B0aW9ucyk7cmVxdWVzdE9wdGlvbnMu cmVxdWVzdHR5cGU9ImZlYXR1cmUiO2lmKGdlb21ldHJ5IGluc3RhbmNlb2YgT3Bl bkxheWVycy5Mb25MYXQpe3JlcXVlc3RPcHRpb25zLnBvbHlnb249bnVsbDtyZXF1 ZXN0T3B0aW9ucy5lbnZlbG9wZT1bZ2VvbWV0cnkubG9uLWJ1ZmZlcixnZW9tZXRy eS5sYXQtYnVmZmVyLGdlb21ldHJ5LmxvbitidWZmZXIsZ2VvbWV0cnkubGF0K2J1 ZmZlcl07fWVsc2UgaWYoZ2VvbWV0cnkgaW5zdGFuY2VvZiBPcGVuTGF5ZXJzLkdl b21ldHJ5LlBvbHlnb24pe3JlcXVlc3RPcHRpb25zLmVudmVsb3BlPW51bGw7cmVx dWVzdE9wdGlvbnMucG9seWdvbj1nZW9tZXRyeTt9CnZhciBhcmN4bWw9bmV3IE9w ZW5MYXllcnMuRm9ybWF0LkFyY1hNTChyZXF1ZXN0T3B0aW9ucyk7T3BlbkxheWVy cy5VdGlsLmV4dGVuZChhcmN4bWwucmVxdWVzdC5nZXRfZmVhdHVyZSxvcHRpb25z KTthcmN4bWwucmVxdWVzdC5nZXRfZmVhdHVyZS5sYXllcj1sYXllci5pZDtpZih0 eXBlb2YgbGF5ZXIucXVlcnkuYWNjdXJhY3k9PSJudW1iZXIiKXthcmN4bWwucmVx dWVzdC5nZXRfZmVhdHVyZS5xdWVyeS5hY2N1cmFjeT1sYXllci5xdWVyeS5hY2N1 cmFjeTt9ZWxzZXt2YXIgbWFwQ2VudGVyPXRoaXMubWFwLmdldENlbnRlcigpO3Zh ciB2aWV3UHg9dGhpcy5tYXAuZ2V0Vmlld1BvcnRQeEZyb21Mb25MYXQobWFwQ2Vu dGVyKTt2aWV3UHgueCsrO3ZhciBtYXBPZmZDZW50ZXI9dGhpcy5tYXAuZ2V0TG9u TGF0RnJvbVBpeGVsKHZpZXdQeCk7YXJjeG1sLnJlcXVlc3QuZ2V0X2ZlYXR1cmUu cXVlcnkuYWNjdXJhY3k9bWFwT2ZmQ2VudGVyLmxvbi1tYXBDZW50ZXIubG9uO30K YXJjeG1sLnJlcXVlc3QuZ2V0X2ZlYXR1cmUucXVlcnkud2hlcmU9bGF5ZXIucXVl cnkud2hlcmU7YXJjeG1sLnJlcXVlc3QuZ2V0X2ZlYXR1cmUucXVlcnkuc3BhdGlh bGZpbHRlci5yZWxhdGlvbj0iYXJlYV9pbnRlcnNlY3Rpb24iO09wZW5MYXllcnMu UmVxdWVzdC5QT1NUKHt1cmw6dGhpcy5nZXRGdWxsUmVxdWVzdFN0cmluZyh7J0N1 c3RvbVNlcnZpY2UnOidRdWVyeSd9KSxkYXRhOmFyY3htbC53cml0ZSgpLGNhbGxi YWNrOmZ1bmN0aW9uKHJlcXVlc3Qpe3ZhciByZXNwb25zZT1hcmN4bWwucGFyc2VS ZXNwb25zZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7aWYoIWFyY3htbC5pc2Vycm9y KCkpe2NhbGxiYWNrLmNhbGwoc2NvcGUscmVzcG9uc2UuZmVhdHVyZXMpO31lbHNl e2NhbGxiYWNrLmNhbGwoc2NvcGUsbnVsbCk7fX19KTt9LGNsb25lOmZ1bmN0aW9u KG9iail7aWYob2JqPT1udWxsKXtvYmo9bmV3IE9wZW5MYXllcnMuTGF5ZXIuQXJj SU1TKHRoaXMubmFtZSx0aGlzLnVybCx0aGlzLmdldE9wdGlvbnMoKSk7fQpvYmo9 T3BlbkxheWVycy5MYXllci5HcmlkLnByb3RvdHlwZS5jbG9uZS5hcHBseSh0aGlz LFtvYmpdKTtyZXR1cm4gb2JqO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5MYXll ci5BcmNJTVMifSk7T3BlbkxheWVycy5Gb3JtYXQuT1dTQ29tbW9uLnYxXzFfMD1P cGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0Lk9XU0NvbW1vbi52MSx7 bmFtZXNwYWNlczp7b3dzOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L293cy8xLjEi LHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIn0scmVhZGVyczp7 Im93cyI6T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMoeyJFeGNlcHRpb25S ZXBvcnQiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmouZXhjZXB0aW9uUmVwb3J0PXt2 ZXJzaW9uOm5vZGUuZ2V0QXR0cmlidXRlKCd2ZXJzaW9uJyksbGFuZ3VhZ2U6bm9k ZS5nZXRBdHRyaWJ1dGUoJ3htbDpsYW5nJyksZXhjZXB0aW9uczpbXX07dGhpcy5y ZWFkQ2hpbGROb2Rlcyhub2RlLG9iai5leGNlcHRpb25SZXBvcnQpO30sIkFsbG93 ZWRWYWx1ZXMiOmZ1bmN0aW9uKG5vZGUscGFyYW1ldGVyKXtwYXJhbWV0ZXIuYWxs b3dlZFZhbHVlcz17fTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUscGFyYW1ldGVy LmFsbG93ZWRWYWx1ZXMpO30sIkFueVZhbHVlIjpmdW5jdGlvbihub2RlLHBhcmFt ZXRlcil7cGFyYW1ldGVyLmFueVZhbHVlPXRydWU7fSwiRGF0YVR5cGUiOmZ1bmN0 aW9uKG5vZGUscGFyYW1ldGVyKXtwYXJhbWV0ZXIuZGF0YVR5cGU9dGhpcy5nZXRD aGlsZFZhbHVlKG5vZGUpO30sIlJhbmdlIjpmdW5jdGlvbihub2RlLGFsbG93ZWRW YWx1ZXMpe2FsbG93ZWRWYWx1ZXMucmFuZ2U9e307dGhpcy5yZWFkQ2hpbGROb2Rl cyhub2RlLGFsbG93ZWRWYWx1ZXMucmFuZ2UpO30sIk1pbmltdW1WYWx1ZSI6ZnVu Y3Rpb24obm9kZSxyYW5nZSl7cmFuZ2UubWluVmFsdWU9dGhpcy5nZXRDaGlsZFZh bHVlKG5vZGUpO30sIk1heGltdW1WYWx1ZSI6ZnVuY3Rpb24obm9kZSxyYW5nZSl7 cmFuZ2UubWF4VmFsdWU9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO30sIklkZW50 aWZpZXIiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmouaWRlbnRpZmllcj10aGlzLmdl dENoaWxkVmFsdWUobm9kZSk7fSwiU3VwcG9ydGVkQ1JTIjpmdW5jdGlvbihub2Rl LG9iail7b2JqLnN1cHBvcnRlZENSUz10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7 fX0sT3BlbkxheWVycy5Gb3JtYXQuT1dTQ29tbW9uLnYxLnByb3RvdHlwZS5yZWFk ZXJzWyJvd3MiXSl9LHdyaXRlcnM6eyJvd3MiOk9wZW5MYXllcnMuVXRpbC5hcHBs eURlZmF1bHRzKHsiUmFuZ2UiOmZ1bmN0aW9uKHJhbmdlKXt2YXIgbm9kZT10aGlz LmNyZWF0ZUVsZW1lbnROU1BsdXMoIm93czpSYW5nZSIse2F0dHJpYnV0ZXM6eydv d3M6cmFuZ2VDbG9zdXJlJzpyYW5nZS5jbG9zdXJlfX0pO3RoaXMud3JpdGVOb2Rl KCJvd3M6TWluaW11bVZhbHVlIixyYW5nZS5taW5WYWx1ZSxub2RlKTt0aGlzLndy aXRlTm9kZSgib3dzOk1heGltdW1WYWx1ZSIscmFuZ2UubWF4VmFsdWUsbm9kZSk7 cmV0dXJuIG5vZGU7fSwiTWluaW11bVZhbHVlIjpmdW5jdGlvbihtaW5WYWx1ZSl7 dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJvd3M6TWluaW11bVZh bHVlIix7dmFsdWU6bWluVmFsdWV9KTtyZXR1cm4gbm9kZTt9LCJNYXhpbXVtVmFs dWUiOmZ1bmN0aW9uKG1heFZhbHVlKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1l bnROU1BsdXMoIm93czpNYXhpbXVtVmFsdWUiLHt2YWx1ZTptYXhWYWx1ZX0pO3Jl dHVybiBub2RlO30sIlZhbHVlIjpmdW5jdGlvbih2YWx1ZSl7dmFyIG5vZGU9dGhp cy5jcmVhdGVFbGVtZW50TlNQbHVzKCJvd3M6VmFsdWUiLHt2YWx1ZTp2YWx1ZX0p O3JldHVybiBub2RlO319LE9wZW5MYXllcnMuRm9ybWF0Lk9XU0NvbW1vbi52MS5w cm90b3R5cGUud3JpdGVyc1sib3dzIl0pfSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJz LkZvcm1hdC5PV1NDb21tb24udjFfMV8wIn0pO09wZW5MYXllcnMuRm9ybWF0LldD U0dldENvdmVyYWdlPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Gb3JtYXQu WE1MLHtuYW1lc3BhY2VzOntvd3M6Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvb3dz LzEuMSIsd2NzOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3djcy8xLjEiLHhsaW5r OiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4c2k6Imh0dHA6Ly93d3cu dzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIn0scmVnRXhlczp7dHJpbVNw YWNlOigvXlxzKnxccyokL2cpLHJlbW92ZVNwYWNlOigvXHMqL2cpLHNwbGl0U3Bh Y2U6KC9ccysvKSx0cmltQ29tbWE6KC9ccyosXHMqL2cpfSxWRVJTSU9OOiIxLjEu MiIsc2NoZW1hTG9jYXRpb246Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvd2NzLzEu MSBodHRwOi8vc2NoZW1hcy5vcGVuZ2lzLm5ldC93Y3MvMS4xL3djc0dldENvdmVy YWdlLnhzZCIsd3JpdGU6ZnVuY3Rpb24ob3B0aW9ucyl7dmFyIG5vZGU9dGhpcy53 cml0ZU5vZGUoIndjczpHZXRDb3ZlcmFnZSIsb3B0aW9ucyk7dGhpcy5zZXRBdHRy aWJ1dGVOUyhub2RlLHRoaXMubmFtZXNwYWNlcy54c2ksInhzaTpzY2hlbWFMb2Nh dGlvbiIsdGhpcy5zY2hlbWFMb2NhdGlvbik7cmV0dXJuIE9wZW5MYXllcnMuRm9y bWF0LlhNTC5wcm90b3R5cGUud3JpdGUuYXBwbHkodGhpcyxbbm9kZV0pO30sd3Jp dGVyczp7IndjcyI6eyJHZXRDb3ZlcmFnZSI6ZnVuY3Rpb24ob3B0aW9ucyl7dmFy IG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJ3Y3M6R2V0Q292ZXJhZ2Ui LHthdHRyaWJ1dGVzOnt2ZXJzaW9uOm9wdGlvbnMudmVyc2lvbnx8dGhpcy5WRVJT SU9OLHNlcnZpY2U6J1dDUyd9fSk7dGhpcy53cml0ZU5vZGUoIm93czpJZGVudGlm aWVyIixvcHRpb25zLmlkZW50aWZpZXIsbm9kZSk7dGhpcy53cml0ZU5vZGUoIndj czpEb21haW5TdWJzZXQiLG9wdGlvbnMuZG9tYWluU3Vic2V0LG5vZGUpO3RoaXMu d3JpdGVOb2RlKCJ3Y3M6T3V0cHV0IixvcHRpb25zLm91dHB1dCxub2RlKTtyZXR1 cm4gbm9kZTt9LCJEb21haW5TdWJzZXQiOmZ1bmN0aW9uKGRvbWFpblN1YnNldCl7 dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJ3Y3M6RG9tYWluU3Vi c2V0Iix7fSk7dGhpcy53cml0ZU5vZGUoIm93czpCb3VuZGluZ0JveCIsZG9tYWlu U3Vic2V0LmJvdW5kaW5nQm94LG5vZGUpO2lmKGRvbWFpblN1YnNldC50ZW1wb3Jh bFN1YnNldCl7dGhpcy53cml0ZU5vZGUoIndjczpUZW1wb3JhbFN1YnNldCIsZG9t YWluU3Vic2V0LnRlbXBvcmFsU3Vic2V0LG5vZGUpO30KcmV0dXJuIG5vZGU7fSwi VGVtcG9yYWxTdWJzZXQiOmZ1bmN0aW9uKHRlbXBvcmFsU3Vic2V0KXt2YXIgbm9k ZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIndjczpUZW1wb3JhbFN1YnNldCIs e30pO2Zvcih2YXIgaT0wLGxlbj10ZW1wb3JhbFN1YnNldC50aW1lUGVyaW9kcy5s ZW5ndGg7aTxsZW47KytpKXt0aGlzLndyaXRlTm9kZSgid2NzOlRpbWVQZXJpb2Qi LHRlbXBvcmFsU3Vic2V0LnRpbWVQZXJpb2RzW2ldLG5vZGUpO30KcmV0dXJuIG5v ZGU7fSwiVGltZVBlcmlvZCI6ZnVuY3Rpb24odGltZVBlcmlvZCl7dmFyIG5vZGU9 dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJ3Y3M6VGltZVBlcmlvZCIse30pO3Ro aXMud3JpdGVOb2RlKCJ3Y3M6QmVnaW5Qb3NpdGlvbiIsdGltZVBlcmlvZC5iZWdp bixub2RlKTt0aGlzLndyaXRlTm9kZSgid2NzOkVuZFBvc2l0aW9uIix0aW1lUGVy aW9kLmVuZCxub2RlKTtpZih0aW1lUGVyaW9kLnJlc29sdXRpb24pe3RoaXMud3Jp dGVOb2RlKCJ3Y3M6VGltZVJlc29sdXRpb24iLHRpbWVQZXJpb2QucmVzb2x1dGlv bixub2RlKTt9CnJldHVybiBub2RlO30sIkJlZ2luUG9zaXRpb24iOmZ1bmN0aW9u KGJlZ2luKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIndjczpC ZWdpblBvc2l0aW9uIix7dmFsdWU6YmVnaW59KTtyZXR1cm4gbm9kZTt9LCJFbmRQ b3NpdGlvbiI6ZnVuY3Rpb24oZW5kKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1l bnROU1BsdXMoIndjczpFbmRQb3NpdGlvbiIse3ZhbHVlOmVuZH0pO3JldHVybiBu b2RlO30sIlRpbWVSZXNvbHV0aW9uIjpmdW5jdGlvbihyZXNvbHV0aW9uKXt2YXIg bm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIndjczpUaW1lUmVzb2x1dGlv biIse3ZhbHVlOnJlc29sdXRpb259KTtyZXR1cm4gbm9kZTt9LCJPdXRwdXQiOmZ1 bmN0aW9uKG91dHB1dCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVz KCJ3Y3M6T3V0cHV0Iix7YXR0cmlidXRlczp7Zm9ybWF0Om91dHB1dC5mb3JtYXQs c3RvcmU6b3V0cHV0LnN0b3JlfX0pO2lmKG91dHB1dC5ncmlkQ1JTKXt0aGlzLndy aXRlTm9kZSgid2NzOkdyaWRDUlMiLG91dHB1dC5ncmlkQ1JTLG5vZGUpO30KcmV0 dXJuIG5vZGU7fSwiR3JpZENSUyI6ZnVuY3Rpb24oZ3JpZENSUyl7dmFyIG5vZGU9 dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJ3Y3M6R3JpZENSUyIse30pO3RoaXMu d3JpdGVOb2RlKCJ3Y3M6R3JpZEJhc2VDUlMiLGdyaWRDUlMuYmFzZUNSUyxub2Rl KTtpZihncmlkQ1JTLnR5cGUpe3RoaXMud3JpdGVOb2RlKCJ3Y3M6R3JpZFR5cGUi LGdyaWRDUlMudHlwZSxub2RlKTt9CmlmKGdyaWRDUlMub3JpZ2luKXt0aGlzLndy aXRlTm9kZSgid2NzOkdyaWRPcmlnaW4iLGdyaWRDUlMub3JpZ2luLG5vZGUpO30K dGhpcy53cml0ZU5vZGUoIndjczpHcmlkT2Zmc2V0cyIsZ3JpZENSUy5vZmZzZXRz LG5vZGUpO2lmKGdyaWRDUlMuQ1Mpe3RoaXMud3JpdGVOb2RlKCJ3Y3M6R3JpZENT IixncmlkQ1JTLkNTLG5vZGUpO30KcmV0dXJuIG5vZGU7fSwiR3JpZEJhc2VDUlMi OmZ1bmN0aW9uKGJhc2VDUlMpe3JldHVybiB0aGlzLmNyZWF0ZUVsZW1lbnROU1Bs dXMoIndjczpHcmlkQmFzZUNSUyIse3ZhbHVlOmJhc2VDUlN9KTt9LCJHcmlkT3Jp Z2luIjpmdW5jdGlvbihvcmlnaW4pe3JldHVybiB0aGlzLmNyZWF0ZUVsZW1lbnRO U1BsdXMoIndjczpHcmlkT3JpZ2luIix7dmFsdWU6b3JpZ2lufSk7fSwiR3JpZFR5 cGUiOmZ1bmN0aW9uKHR5cGUpe3JldHVybiB0aGlzLmNyZWF0ZUVsZW1lbnROU1Bs dXMoIndjczpHcmlkVHlwZSIse3ZhbHVlOnR5cGV9KTt9LCJHcmlkT2Zmc2V0cyI6 ZnVuY3Rpb24ob2Zmc2V0cyl7cmV0dXJuIHRoaXMuY3JlYXRlRWxlbWVudE5TUGx1 cygid2NzOkdyaWRPZmZzZXRzIix7dmFsdWU6b2Zmc2V0c30pO30sIkdyaWRDUyI6 ZnVuY3Rpb24oQ1Mpe3JldHVybiB0aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIndj czpHcmlkQ1MiLHt2YWx1ZTpDU30pO319LCJvd3MiOk9wZW5MYXllcnMuRm9ybWF0 Lk9XU0NvbW1vbi52MV8xXzAucHJvdG90eXBlLndyaXRlcnMub3dzfSxDTEFTU19O QU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5XQ1NHZXRDb3ZlcmFnZSJ9KTtPcGVuTGF5 ZXJzLkZvcm1hdC5XUFNFeGVjdXRlPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVy cy5Gb3JtYXQuWE1MLHtuYW1lc3BhY2VzOntvd3M6Imh0dHA6Ly93d3cub3Blbmdp cy5uZXQvb3dzLzEuMSIsZ21sOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCIs d3BzOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3dwcy8xLjAuMCIsd2ZzOiJodHRw Oi8vd3d3Lm9wZW5naXMubmV0L3dmcyIsb2djOiJodHRwOi8vd3d3Lm9wZW5naXMu bmV0L29nYyIsd2NzOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3djcyIseGxpbms6 Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhzaToiaHR0cDovL3d3dy53 My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UifSxyZWdFeGVzOnt0cmltU3Bh Y2U6KC9eXHMqfFxzKiQvZykscmVtb3ZlU3BhY2U6KC9ccyovZyksc3BsaXRTcGFj ZTooL1xzKy8pLHRyaW1Db21tYTooL1xzKixccyovZyl9LFZFUlNJT046IjEuMC4w IixzY2hlbWFMb2NhdGlvbjoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC93cHMvMS4w LjAgaHR0cDovL3NjaGVtYXMub3Blbmdpcy5uZXQvd3BzLzEuMC4wL3dwc0FsbC54 c2QiLHNjaGVtYUxvY2F0aW9uQXR0cjpmdW5jdGlvbihvcHRpb25zKXtyZXR1cm4g dW5kZWZpbmVkO30sd3JpdGU6ZnVuY3Rpb24ob3B0aW9ucyl7dmFyIGRvYztpZih3 aW5kb3cuQWN0aXZlWE9iamVjdCl7ZG9jPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNy b3NvZnQuWE1MRE9NIik7dGhpcy54bWxkb209ZG9jO31lbHNle2RvYz1kb2N1bWVu dC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCgiIiwiIixudWxsKTt9CnZh ciBub2RlPXRoaXMud3JpdGVOb2RlKCJ3cHM6RXhlY3V0ZSIsb3B0aW9ucyxkb2Mp O3RoaXMuc2V0QXR0cmlidXRlTlMobm9kZSx0aGlzLm5hbWVzcGFjZXMueHNpLCJ4 c2k6c2NoZW1hTG9jYXRpb24iLHRoaXMuc2NoZW1hTG9jYXRpb24pO3JldHVybiBP cGVuTGF5ZXJzLkZvcm1hdC5YTUwucHJvdG90eXBlLndyaXRlLmFwcGx5KHRoaXMs W25vZGVdKTt9LHdyaXRlcnM6eyJ3cHMiOnsiRXhlY3V0ZSI6ZnVuY3Rpb24ob3B0 aW9ucyl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJ3cHM6RXhl Y3V0ZSIse2F0dHJpYnV0ZXM6e3ZlcnNpb246dGhpcy5WRVJTSU9OLHNlcnZpY2U6 J1dQUyd9fSk7dGhpcy53cml0ZU5vZGUoIm93czpJZGVudGlmaWVyIixvcHRpb25z LmlkZW50aWZpZXIsbm9kZSk7dGhpcy53cml0ZU5vZGUoIndwczpEYXRhSW5wdXRz IixvcHRpb25zLmRhdGFJbnB1dHMsbm9kZSk7dGhpcy53cml0ZU5vZGUoIndwczpS ZXNwb25zZUZvcm0iLG9wdGlvbnMucmVzcG9uc2VGb3JtLG5vZGUpO3JldHVybiBu b2RlO30sIlJlc3BvbnNlRm9ybSI6ZnVuY3Rpb24ocmVzcG9uc2VGb3JtKXt2YXIg bm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIndwczpSZXNwb25zZUZvcm0i LHt9KTtpZihyZXNwb25zZUZvcm0ucmF3RGF0YU91dHB1dCl7dGhpcy53cml0ZU5v ZGUoIndwczpSYXdEYXRhT3V0cHV0IixyZXNwb25zZUZvcm0ucmF3RGF0YU91dHB1 dCxub2RlKTt9CmlmKHJlc3BvbnNlRm9ybS5yZXNwb25zZURvY3VtZW50KXt0aGlz LndyaXRlTm9kZSgid3BzOlJlc3BvbnNlRG9jdW1lbnQiLHJlc3BvbnNlRm9ybS5y ZXNwb25zZURvY3VtZW50LG5vZGUpO30KcmV0dXJuIG5vZGU7fSwiUmVzcG9uc2VE b2N1bWVudCI6ZnVuY3Rpb24ocmVzcG9uc2VEb2N1bWVudCl7dmFyIG5vZGU9dGhp cy5jcmVhdGVFbGVtZW50TlNQbHVzKCJ3cHM6UmVzcG9uc2VEb2N1bWVudCIse2F0 dHJpYnV0ZXM6e3N0b3JlRXhlY3V0ZVJlc3BvbnNlOnJlc3BvbnNlRG9jdW1lbnQu c3RvcmVFeGVjdXRlUmVzcG9uc2UsbGluZWFnZTpyZXNwb25zZURvY3VtZW50Lmxp bmVhZ2Usc3RhdHVzOnJlc3BvbnNlRG9jdW1lbnQuc3RhdHVzfX0pO2lmKHJlc3Bv bnNlRG9jdW1lbnQub3V0cHV0KXt0aGlzLndyaXRlTm9kZSgid3BzOk91dHB1dCIs cmVzcG9uc2VEb2N1bWVudC5vdXRwdXQsbm9kZSk7fQpyZXR1cm4gbm9kZTt9LCJP dXRwdXQiOmZ1bmN0aW9uKG91dHB1dCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVt ZW50TlNQbHVzKCJ3cHM6T3V0cHV0Iix7YXR0cmlidXRlczp7YXNSZWZlcmVuY2U6 b3V0cHV0LmFzUmVmZXJlbmNlfX0pO3RoaXMud3JpdGVOb2RlKCJvd3M6SWRlbnRp ZmllciIsb3V0cHV0LmlkZW50aWZpZXIsbm9kZSk7dGhpcy53cml0ZU5vZGUoIm93 czpUaXRsZSIsb3V0cHV0LnRpdGxlLG5vZGUpO3RoaXMud3JpdGVOb2RlKCJvd3M6 QWJzdHJhY3QiLG91dHB1dFsiYWJzdHJhY3QiXSxub2RlKTtyZXR1cm4gbm9kZTt9 LCJSYXdEYXRhT3V0cHV0IjpmdW5jdGlvbihyYXdEYXRhT3V0cHV0KXt2YXIgbm9k ZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIndwczpSYXdEYXRhT3V0cHV0Iix7 YXR0cmlidXRlczp7bWltZVR5cGU6cmF3RGF0YU91dHB1dC5taW1lVHlwZX19KTt0 aGlzLndyaXRlTm9kZSgib3dzOklkZW50aWZpZXIiLHJhd0RhdGFPdXRwdXQuaWRl bnRpZmllcixub2RlKTtyZXR1cm4gbm9kZTt9LCJEYXRhSW5wdXRzIjpmdW5jdGlv bihkYXRhSW5wdXRzKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMo IndwczpEYXRhSW5wdXRzIix7fSk7Zm9yKHZhciBpPTAsaWk9ZGF0YUlucHV0cy5s ZW5ndGg7aTxpaTsrK2kpe3RoaXMud3JpdGVOb2RlKCJ3cHM6SW5wdXQiLGRhdGFJ bnB1dHNbaV0sbm9kZSk7fQpyZXR1cm4gbm9kZTt9LCJJbnB1dCI6ZnVuY3Rpb24o aW5wdXQpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygid3BzOklu cHV0Iix7fSk7dGhpcy53cml0ZU5vZGUoIm93czpJZGVudGlmaWVyIixpbnB1dC5p ZGVudGlmaWVyLG5vZGUpO2lmKGlucHV0LnRpdGxlKXt0aGlzLndyaXRlTm9kZSgi b3dzOlRpdGxlIixpbnB1dC50aXRsZSxub2RlKTt9CmlmKGlucHV0LmRhdGEpe3Ro aXMud3JpdGVOb2RlKCJ3cHM6RGF0YSIsaW5wdXQuZGF0YSxub2RlKTt9CmlmKGlu cHV0LnJlZmVyZW5jZSl7dGhpcy53cml0ZU5vZGUoIndwczpSZWZlcmVuY2UiLGlu cHV0LnJlZmVyZW5jZSxub2RlKTt9CnJldHVybiBub2RlO30sIkRhdGEiOmZ1bmN0 aW9uKGRhdGEpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygid3Bz OkRhdGEiLHt9KTtpZihkYXRhLmxpdGVyYWxEYXRhKXt0aGlzLndyaXRlTm9kZSgi d3BzOkxpdGVyYWxEYXRhIixkYXRhLmxpdGVyYWxEYXRhLG5vZGUpO31lbHNlIGlm KGRhdGEuY29tcGxleERhdGEpe3RoaXMud3JpdGVOb2RlKCJ3cHM6Q29tcGxleERh dGEiLGRhdGEuY29tcGxleERhdGEsbm9kZSk7fQpyZXR1cm4gbm9kZTt9LCJMaXRl cmFsRGF0YSI6ZnVuY3Rpb24obGl0ZXJhbERhdGEpe3ZhciBub2RlPXRoaXMuY3Jl YXRlRWxlbWVudE5TUGx1cygid3BzOkxpdGVyYWxEYXRhIix7YXR0cmlidXRlczp7 dW9tOmxpdGVyYWxEYXRhLnVvbX0sdmFsdWU6bGl0ZXJhbERhdGEudmFsdWV9KTty ZXR1cm4gbm9kZTt9LCJDb21wbGV4RGF0YSI6ZnVuY3Rpb24oY29tcGxleERhdGEp e3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygid3BzOkNvbXBsZXhE YXRhIix7YXR0cmlidXRlczp7bWltZVR5cGU6Y29tcGxleERhdGEubWltZVR5cGUs ZW5jb2Rpbmc6Y29tcGxleERhdGEuZW5jb2Rpbmcsc2NoZW1hOmNvbXBsZXhEYXRh LnNjaGVtYX19KTtub2RlLmFwcGVuZENoaWxkKHRoaXMuZ2V0WE1MRG9jKCkuY3Jl YXRlQ0RBVEFTZWN0aW9uKGNvbXBsZXhEYXRhLnZhbHVlKSk7cmV0dXJuIG5vZGU7 fSwiUmVmZXJlbmNlIjpmdW5jdGlvbihyZWZlcmVuY2Upe3ZhciBub2RlPXRoaXMu Y3JlYXRlRWxlbWVudE5TUGx1cygid3BzOlJlZmVyZW5jZSIse2F0dHJpYnV0ZXM6 e21pbWVUeXBlOnJlZmVyZW5jZS5taW1lVHlwZSwieGxpbms6aHJlZiI6cmVmZXJl bmNlLmhyZWYsbWV0aG9kOnJlZmVyZW5jZS5tZXRob2QsZW5jb2Rpbmc6cmVmZXJl bmNlLmVuY29kaW5nLHNjaGVtYTpyZWZlcmVuY2Uuc2NoZW1hfX0pO2lmKHJlZmVy ZW5jZS5ib2R5KXt0aGlzLndyaXRlTm9kZSgid3BzOkJvZHkiLHJlZmVyZW5jZS5i b2R5LG5vZGUpO30KcmV0dXJuIG5vZGU7fSwiQm9keSI6ZnVuY3Rpb24oYm9keSl7 dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJ3cHM6Qm9keSIse30p O2lmKGJvZHkud2NzKXt0aGlzLndyaXRlTm9kZSgid2NzOkdldENvdmVyYWdlIixi b2R5Lndjcyxub2RlKTt9CmVsc2UgaWYoYm9keS53ZnMpe3RoaXMuZmVhdHVyZVR5 cGU9Ym9keS53ZnMuZmVhdHVyZVR5cGU7dGhpcy52ZXJzaW9uPWJvZHkud2ZzLnZl cnNpb247dGhpcy53cml0ZU5vZGUoIndmczpHZXRGZWF0dXJlIixib2R5Lndmcyxu b2RlKTt9ZWxzZXt0aGlzLndyaXRlTm9kZSgid3BzOkV4ZWN1dGUiLGJvZHksbm9k ZSk7fQpyZXR1cm4gbm9kZTt9fSwid2NzIjpPcGVuTGF5ZXJzLkZvcm1hdC5XQ1NH ZXRDb3ZlcmFnZS5wcm90b3R5cGUud3JpdGVycy53Y3MsIndmcyI6T3BlbkxheWVy cy5Gb3JtYXQuV0ZTVC52MV8xXzAucHJvdG90eXBlLndyaXRlcnMud2ZzLCJvd3Mi Ok9wZW5MYXllcnMuRm9ybWF0Lk9XU0NvbW1vbi52MV8xXzAucHJvdG90eXBlLndy aXRlcnMub3dzfSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5XUFNFeGVj dXRlIn0pO09wZW5MYXllcnMuQ29udHJvbC5QYW5ab29tPU9wZW5MYXllcnMuQ2xh c3MoT3BlbkxheWVycy5Db250cm9sLHtzbGlkZUZhY3Rvcjo1MCxzbGlkZVJhdGlv Om51bGwsYnV0dG9uczpudWxsLHBvc2l0aW9uOm51bGwsaW5pdGlhbGl6ZTpmdW5j dGlvbihvcHRpb25zKXt0aGlzLnBvc2l0aW9uPW5ldyBPcGVuTGF5ZXJzLlBpeGVs KE9wZW5MYXllcnMuQ29udHJvbC5QYW5ab29tLlgsT3BlbkxheWVycy5Db250cm9s LlBhblpvb20uWSk7T3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5pbml0aWFs aXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0 aGlzLnJlbW92ZUJ1dHRvbnMoKTt0aGlzLmJ1dHRvbnM9bnVsbDt0aGlzLnBvc2l0 aW9uPW51bGw7T3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5kZXN0cm95LmFw cGx5KHRoaXMsYXJndW1lbnRzKTt9LGRyYXc6ZnVuY3Rpb24ocHgpe09wZW5MYXll cnMuQ29udHJvbC5wcm90b3R5cGUuZHJhdy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7 cHg9dGhpcy5wb3NpdGlvbjt0aGlzLmJ1dHRvbnM9W107dmFyIHN6PW5ldyBPcGVu TGF5ZXJzLlNpemUoMTgsMTgpO3ZhciBjZW50ZXJlZD1uZXcgT3BlbkxheWVycy5Q aXhlbChweC54K3N6LncvMixweC55KTt0aGlzLl9hZGRCdXR0b24oInBhbnVwIiwi bm9ydGgtbWluaS5wbmciLGNlbnRlcmVkLHN6KTtweC55PWNlbnRlcmVkLnkrc3ou aDt0aGlzLl9hZGRCdXR0b24oInBhbmxlZnQiLCJ3ZXN0LW1pbmkucG5nIixweCxz eik7dGhpcy5fYWRkQnV0dG9uKCJwYW5yaWdodCIsImVhc3QtbWluaS5wbmciLHB4 LmFkZChzei53LDApLHN6KTt0aGlzLl9hZGRCdXR0b24oInBhbmRvd24iLCJzb3V0 aC1taW5pLnBuZyIsY2VudGVyZWQuYWRkKDAsc3ouaCoyKSxzeik7dGhpcy5fYWRk QnV0dG9uKCJ6b29taW4iLCJ6b29tLXBsdXMtbWluaS5wbmciLGNlbnRlcmVkLmFk ZCgwLHN6LmgqMys1KSxzeik7dGhpcy5fYWRkQnV0dG9uKCJ6b29td29ybGQiLCJ6 b29tLXdvcmxkLW1pbmkucG5nIixjZW50ZXJlZC5hZGQoMCxzei5oKjQrNSksc3op O3RoaXMuX2FkZEJ1dHRvbigiem9vbW91dCIsInpvb20tbWludXMtbWluaS5wbmci LGNlbnRlcmVkLmFkZCgwLHN6LmgqNSs1KSxzeik7cmV0dXJuIHRoaXMuZGl2O30s X2FkZEJ1dHRvbjpmdW5jdGlvbihpZCxpbWcseHksc3ope3ZhciBpbWdMb2NhdGlv bj1PcGVuTGF5ZXJzLlV0aWwuZ2V0SW1hZ2VzTG9jYXRpb24oKStpbWc7dmFyIGJ0 bj1PcGVuTGF5ZXJzLlV0aWwuY3JlYXRlQWxwaGFJbWFnZURpdih0aGlzLmlkKyJf IitpZCx4eSxzeixpbWdMb2NhdGlvbiwiYWJzb2x1dGUiKTtidG4uc3R5bGUuY3Vy c29yPSJwb2ludGVyIjt0aGlzLmRpdi5hcHBlbmRDaGlsZChidG4pO09wZW5MYXll cnMuRXZlbnQub2JzZXJ2ZShidG4sIm1vdXNlZG93biIsT3BlbkxheWVycy5GdW5j dGlvbi5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMuYnV0dG9uRG93bixidG4pKTtP cGVuTGF5ZXJzLkV2ZW50Lm9ic2VydmUoYnRuLCJkYmxjbGljayIsT3BlbkxheWVy cy5GdW5jdGlvbi5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMuZG91YmxlQ2xpY2ss YnRuKSk7T3BlbkxheWVycy5FdmVudC5vYnNlcnZlKGJ0biwiY2xpY2siLE9wZW5M YXllcnMuRnVuY3Rpb24uYmluZEFzRXZlbnRMaXN0ZW5lcih0aGlzLmRvdWJsZUNs aWNrLGJ0bikpO2J0bi5hY3Rpb249aWQ7YnRuLm1hcD10aGlzLm1hcDtpZighdGhp cy5zbGlkZVJhdGlvKXt2YXIgc2xpZGVGYWN0b3JQaXhlbHM9dGhpcy5zbGlkZUZh Y3Rvcjt2YXIgZ2V0U2xpZGVGYWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gc2xpZGVG YWN0b3JQaXhlbHM7fTt9ZWxzZXt2YXIgc2xpZGVSYXRpbz10aGlzLnNsaWRlUmF0 aW87dmFyIGdldFNsaWRlRmFjdG9yPWZ1bmN0aW9uKGRpbSl7cmV0dXJuIHRoaXMu bWFwLmdldFNpemUoKVtkaW1dKnNsaWRlUmF0aW87fTt9CmJ0bi5nZXRTbGlkZUZh Y3Rvcj1nZXRTbGlkZUZhY3Rvcjt0aGlzLmJ1dHRvbnMucHVzaChidG4pO3JldHVy biBidG47fSxfcmVtb3ZlQnV0dG9uOmZ1bmN0aW9uKGJ0bil7T3BlbkxheWVycy5F dmVudC5zdG9wT2JzZXJ2aW5nRWxlbWVudChidG4pO2J0bi5tYXA9bnVsbDtidG4u Z2V0U2xpZGVGYWN0b3I9bnVsbDt0aGlzLmRpdi5yZW1vdmVDaGlsZChidG4pO09w ZW5MYXllcnMuVXRpbC5yZW1vdmVJdGVtKHRoaXMuYnV0dG9ucyxidG4pO30scmVt b3ZlQnV0dG9uczpmdW5jdGlvbigpe2Zvcih2YXIgaT10aGlzLmJ1dHRvbnMubGVu Z3RoLTE7aT49MDstLWkpe3RoaXMuX3JlbW92ZUJ1dHRvbih0aGlzLmJ1dHRvbnNb aV0pO319LGRvdWJsZUNsaWNrOmZ1bmN0aW9uKGV2dCl7T3BlbkxheWVycy5FdmVu dC5zdG9wKGV2dCk7cmV0dXJuIGZhbHNlO30sYnV0dG9uRG93bjpmdW5jdGlvbihl dnQpe2lmKCFPcGVuTGF5ZXJzLkV2ZW50LmlzTGVmdENsaWNrKGV2dCkpe3JldHVy bjt9CnN3aXRjaCh0aGlzLmFjdGlvbil7Y2FzZSJwYW51cCI6dGhpcy5tYXAucGFu KDAsLXRoaXMuZ2V0U2xpZGVGYWN0b3IoImgiKSk7YnJlYWs7Y2FzZSJwYW5kb3du Ijp0aGlzLm1hcC5wYW4oMCx0aGlzLmdldFNsaWRlRmFjdG9yKCJoIikpO2JyZWFr O2Nhc2UicGFubGVmdCI6dGhpcy5tYXAucGFuKC10aGlzLmdldFNsaWRlRmFjdG9y KCJ3IiksMCk7YnJlYWs7Y2FzZSJwYW5yaWdodCI6dGhpcy5tYXAucGFuKHRoaXMu Z2V0U2xpZGVGYWN0b3IoInciKSwwKTticmVhaztjYXNlInpvb21pbiI6dGhpcy5t YXAuem9vbUluKCk7YnJlYWs7Y2FzZSJ6b29tb3V0Ijp0aGlzLm1hcC56b29tT3V0 KCk7YnJlYWs7Y2FzZSJ6b29td29ybGQiOnRoaXMubWFwLnpvb21Ub01heEV4dGVu dCgpO2JyZWFrO30KT3BlbkxheWVycy5FdmVudC5zdG9wKGV2dCk7fSxDTEFTU19O QU1FOiJPcGVuTGF5ZXJzLkNvbnRyb2wuUGFuWm9vbSJ9KTtPcGVuTGF5ZXJzLkNv bnRyb2wuUGFuWm9vbS5YPTQ7T3BlbkxheWVycy5Db250cm9sLlBhblpvb20uWT00 O09wZW5MYXllcnMuQ29udHJvbC5QYW5ab29tQmFyPU9wZW5MYXllcnMuQ2xhc3Mo T3BlbkxheWVycy5Db250cm9sLlBhblpvb20se3pvb21TdG9wV2lkdGg6MTgsem9v bVN0b3BIZWlnaHQ6MTEsc2xpZGVyOm51bGwsc2xpZGVyRXZlbnRzOm51bGwsem9v bWJhckRpdjpudWxsLGRpdkV2ZW50czpudWxsLHpvb21Xb3JsZEljb246ZmFsc2Us cGFuSWNvbnM6dHJ1ZSxmb3JjZUZpeGVkWm9vbUxldmVsOmZhbHNlLG1vdXNlRHJh Z1N0YXJ0Om51bGwsZGVsdGFZOm51bGwsem9vbVN0YXJ0Om51bGwsZGVzdHJveTpm dW5jdGlvbigpe3RoaXMuX3JlbW92ZVpvb21CYXIoKTt0aGlzLm1hcC5ldmVudHMu dW4oeyJjaGFuZ2ViYXNlbGF5ZXIiOnRoaXMucmVkcmF3LHNjb3BlOnRoaXN9KTtP cGVuTGF5ZXJzLkNvbnRyb2wuUGFuWm9vbS5wcm90b3R5cGUuZGVzdHJveS5hcHBs eSh0aGlzLGFyZ3VtZW50cyk7ZGVsZXRlIHRoaXMubW91c2VEcmFnU3RhcnQ7ZGVs ZXRlIHRoaXMuem9vbVN0YXJ0O30sc2V0TWFwOmZ1bmN0aW9uKG1hcCl7T3Blbkxh eWVycy5Db250cm9sLlBhblpvb20ucHJvdG90eXBlLnNldE1hcC5hcHBseSh0aGlz LGFyZ3VtZW50cyk7dGhpcy5tYXAuZXZlbnRzLnJlZ2lzdGVyKCJjaGFuZ2ViYXNl bGF5ZXIiLHRoaXMsdGhpcy5yZWRyYXcpO30scmVkcmF3OmZ1bmN0aW9uKCl7aWYo dGhpcy5kaXYhPW51bGwpe3RoaXMucmVtb3ZlQnV0dG9ucygpO3RoaXMuX3JlbW92 ZVpvb21CYXIoKTt9CnRoaXMuZHJhdygpO30sZHJhdzpmdW5jdGlvbihweCl7T3Bl bkxheWVycy5Db250cm9sLnByb3RvdHlwZS5kcmF3LmFwcGx5KHRoaXMsYXJndW1l bnRzKTtweD10aGlzLnBvc2l0aW9uLmNsb25lKCk7dGhpcy5idXR0b25zPVtdO3Zh ciBzej1uZXcgT3BlbkxheWVycy5TaXplKDE4LDE4KTtpZih0aGlzLnBhbkljb25z KXt2YXIgY2VudGVyZWQ9bmV3IE9wZW5MYXllcnMuUGl4ZWwocHgueCtzei53LzIs cHgueSk7dmFyIHdwb3NpdGlvbj1zei53O2lmKHRoaXMuem9vbVdvcmxkSWNvbil7 Y2VudGVyZWQ9bmV3IE9wZW5MYXllcnMuUGl4ZWwocHgueCtzei53LHB4LnkpO30K dGhpcy5fYWRkQnV0dG9uKCJwYW51cCIsIm5vcnRoLW1pbmkucG5nIixjZW50ZXJl ZCxzeik7cHgueT1jZW50ZXJlZC55K3N6Lmg7dGhpcy5fYWRkQnV0dG9uKCJwYW5s ZWZ0Iiwid2VzdC1taW5pLnBuZyIscHgsc3opO2lmKHRoaXMuem9vbVdvcmxkSWNv bil7dGhpcy5fYWRkQnV0dG9uKCJ6b29td29ybGQiLCJ6b29tLXdvcmxkLW1pbmku cG5nIixweC5hZGQoc3oudywwKSxzeik7d3Bvc2l0aW9uKj0yO30KdGhpcy5fYWRk QnV0dG9uKCJwYW5yaWdodCIsImVhc3QtbWluaS5wbmciLHB4LmFkZCh3cG9zaXRp b24sMCksc3opO3RoaXMuX2FkZEJ1dHRvbigicGFuZG93biIsInNvdXRoLW1pbmku cG5nIixjZW50ZXJlZC5hZGQoMCxzei5oKjIpLHN6KTt0aGlzLl9hZGRCdXR0b24o Inpvb21pbiIsInpvb20tcGx1cy1taW5pLnBuZyIsY2VudGVyZWQuYWRkKDAsc3ou aCozKzUpLHN6KTtjZW50ZXJlZD10aGlzLl9hZGRab29tQmFyKGNlbnRlcmVkLmFk ZCgwLHN6LmgqNCs1KSk7dGhpcy5fYWRkQnV0dG9uKCJ6b29tb3V0Iiwiem9vbS1t aW51cy1taW5pLnBuZyIsY2VudGVyZWQsc3opO30KZWxzZXt0aGlzLl9hZGRCdXR0 b24oInpvb21pbiIsInpvb20tcGx1cy1taW5pLnBuZyIscHgsc3opO2NlbnRlcmVk PXRoaXMuX2FkZFpvb21CYXIocHguYWRkKDAsc3ouaCkpO3RoaXMuX2FkZEJ1dHRv bigiem9vbW91dCIsInpvb20tbWludXMtbWluaS5wbmciLGNlbnRlcmVkLHN6KTtp Zih0aGlzLnpvb21Xb3JsZEljb24pe2NlbnRlcmVkPWNlbnRlcmVkLmFkZCgwLHN6 LmgrMyk7dGhpcy5fYWRkQnV0dG9uKCJ6b29td29ybGQiLCJ6b29tLXdvcmxkLW1p bmkucG5nIixjZW50ZXJlZCxzeik7fX0KcmV0dXJuIHRoaXMuZGl2O30sX2FkZFpv b21CYXI6ZnVuY3Rpb24oY2VudGVyZWQpe3ZhciBpbWdMb2NhdGlvbj1PcGVuTGF5 ZXJzLlV0aWwuZ2V0SW1hZ2VzTG9jYXRpb24oKTt2YXIgaWQ9dGhpcy5pZCsiXyIr dGhpcy5tYXAuaWQ7dmFyIHpvb21zVG9FbmQ9dGhpcy5tYXAuZ2V0TnVtWm9vbUxl dmVscygpLTEtdGhpcy5tYXAuZ2V0Wm9vbSgpO3ZhciBzbGlkZXI9T3BlbkxheWVy cy5VdGlsLmNyZWF0ZUFscGhhSW1hZ2VEaXYoaWQsY2VudGVyZWQuYWRkKC0xLHpv b21zVG9FbmQqdGhpcy56b29tU3RvcEhlaWdodCksbmV3IE9wZW5MYXllcnMuU2l6 ZSgyMCw5KSxpbWdMb2NhdGlvbisic2xpZGVyLnBuZyIsImFic29sdXRlIik7c2xp ZGVyLnN0eWxlLmN1cnNvcj0ibW92ZSI7dGhpcy5zbGlkZXI9c2xpZGVyO3RoaXMu c2xpZGVyRXZlbnRzPW5ldyBPcGVuTGF5ZXJzLkV2ZW50cyh0aGlzLHNsaWRlcixu dWxsLHRydWUse2luY2x1ZGVYWTp0cnVlfSk7dGhpcy5zbGlkZXJFdmVudHMub24o eyJ0b3VjaHN0YXJ0Ijp0aGlzLnpvb21CYXJEb3duLCJ0b3VjaG1vdmUiOnRoaXMu em9vbUJhckRyYWcsInRvdWNoZW5kIjp0aGlzLnpvb21CYXJVcCwibW91c2Vkb3du Ijp0aGlzLnpvb21CYXJEb3duLCJtb3VzZW1vdmUiOnRoaXMuem9vbUJhckRyYWcs Im1vdXNldXAiOnRoaXMuem9vbUJhclVwLCJkYmxjbGljayI6dGhpcy5kb3VibGVD bGljaywiY2xpY2siOnRoaXMuZG91YmxlQ2xpY2t9KTt2YXIgc3o9bmV3IE9wZW5M YXllcnMuU2l6ZSgpO3N6Lmg9dGhpcy56b29tU3RvcEhlaWdodCp0aGlzLm1hcC5n ZXROdW1ab29tTGV2ZWxzKCk7c3oudz10aGlzLnpvb21TdG9wV2lkdGg7dmFyIGRp dj1udWxsO2lmKE9wZW5MYXllcnMuVXRpbC5hbHBoYUhhY2soKSl7dmFyIGlkPXRo aXMuaWQrIl8iK3RoaXMubWFwLmlkO2Rpdj1PcGVuTGF5ZXJzLlV0aWwuY3JlYXRl QWxwaGFJbWFnZURpdihpZCxjZW50ZXJlZCxuZXcgT3BlbkxheWVycy5TaXplKHN6 LncsdGhpcy56b29tU3RvcEhlaWdodCksaW1nTG9jYXRpb24rInpvb21iYXIucG5n IiwiYWJzb2x1dGUiLG51bGwsImNyb3AiKTtkaXYuc3R5bGUuaGVpZ2h0PXN6Lmgr InB4Ijt9ZWxzZXtkaXY9T3BlbkxheWVycy5VdGlsLmNyZWF0ZURpdignT3Blbkxh eWVyc19Db250cm9sX1Bhblpvb21CYXJfWm9vbWJhcicrdGhpcy5tYXAuaWQsY2Vu dGVyZWQsc3osaW1nTG9jYXRpb24rInpvb21iYXIucG5nIik7fQpkaXYuc3R5bGUu Y3Vyc29yPSJwb2ludGVyIjt0aGlzLnpvb21iYXJEaXY9ZGl2O3RoaXMuZGl2RXZl bnRzPW5ldyBPcGVuTGF5ZXJzLkV2ZW50cyh0aGlzLGRpdixudWxsLHRydWUse2lu Y2x1ZGVYWTp0cnVlfSk7dGhpcy5kaXZFdmVudHMub24oeyJ0b3VjaG1vdmUiOnRo aXMucGFzc0V2ZW50VG9TbGlkZXIsIm1vdXNlZG93biI6dGhpcy5kaXZDbGljaywi bW91c2Vtb3ZlIjp0aGlzLnBhc3NFdmVudFRvU2xpZGVyLCJkYmxjbGljayI6dGhp cy5kb3VibGVDbGljaywiY2xpY2siOnRoaXMuZG91YmxlQ2xpY2t9KTt0aGlzLmRp di5hcHBlbmRDaGlsZChkaXYpO3RoaXMuc3RhcnRUb3A9cGFyc2VJbnQoZGl2LnN0 eWxlLnRvcCk7dGhpcy5kaXYuYXBwZW5kQ2hpbGQoc2xpZGVyKTt0aGlzLm1hcC5l dmVudHMucmVnaXN0ZXIoInpvb21lbmQiLHRoaXMsdGhpcy5tb3ZlWm9vbUJhcik7 Y2VudGVyZWQ9Y2VudGVyZWQuYWRkKDAsdGhpcy56b29tU3RvcEhlaWdodCp0aGlz Lm1hcC5nZXROdW1ab29tTGV2ZWxzKCkpO3JldHVybiBjZW50ZXJlZDt9LF9yZW1v dmVab29tQmFyOmZ1bmN0aW9uKCl7dGhpcy5zbGlkZXJFdmVudHMudW4oeyJ0b3Vj aG1vdmUiOnRoaXMuem9vbUJhckRyYWcsIm1vdXNlZG93biI6dGhpcy56b29tQmFy RG93biwibW91c2Vtb3ZlIjp0aGlzLnpvb21CYXJEcmFnLCJtb3VzZXVwIjp0aGlz Lnpvb21CYXJVcCwiZGJsY2xpY2siOnRoaXMuZG91YmxlQ2xpY2ssImNsaWNrIjp0 aGlzLmRvdWJsZUNsaWNrfSk7dGhpcy5zbGlkZXJFdmVudHMuZGVzdHJveSgpO3Ro aXMuZGl2RXZlbnRzLnVuKHsidG91Y2htb3ZlIjp0aGlzLnBhc3NFdmVudFRvU2xp ZGVyLCJtb3VzZWRvd24iOnRoaXMuZGl2Q2xpY2ssIm1vdXNlbW92ZSI6dGhpcy5w YXNzRXZlbnRUb1NsaWRlciwiZGJsY2xpY2siOnRoaXMuZG91YmxlQ2xpY2ssImNs aWNrIjp0aGlzLmRvdWJsZUNsaWNrfSk7dGhpcy5kaXZFdmVudHMuZGVzdHJveSgp O3RoaXMuZGl2LnJlbW92ZUNoaWxkKHRoaXMuem9vbWJhckRpdik7dGhpcy56b29t YmFyRGl2PW51bGw7dGhpcy5kaXYucmVtb3ZlQ2hpbGQodGhpcy5zbGlkZXIpO3Ro aXMuc2xpZGVyPW51bGw7dGhpcy5tYXAuZXZlbnRzLnVucmVnaXN0ZXIoInpvb21l bmQiLHRoaXMsdGhpcy5tb3ZlWm9vbUJhcik7fSxwYXNzRXZlbnRUb1NsaWRlcjpm dW5jdGlvbihldnQpe3RoaXMuc2xpZGVyRXZlbnRzLmhhbmRsZUJyb3dzZXJFdmVu dChldnQpO30sZGl2Q2xpY2s6ZnVuY3Rpb24oZXZ0KXtpZighT3BlbkxheWVycy5F dmVudC5pc0xlZnRDbGljayhldnQpKXtyZXR1cm47fQp2YXIgbGV2ZWxzPWV2dC54 eS55L3RoaXMuem9vbVN0b3BIZWlnaHQ7aWYodGhpcy5mb3JjZUZpeGVkWm9vbUxl dmVsfHwhdGhpcy5tYXAuZnJhY3Rpb25hbFpvb20pe2xldmVscz1NYXRoLmZsb29y KGxldmVscyk7fQp2YXIgem9vbT0odGhpcy5tYXAuZ2V0TnVtWm9vbUxldmVscygp LTEpLWxldmVsczt6b29tPU1hdGgubWluKE1hdGgubWF4KHpvb20sMCksdGhpcy5t YXAuZ2V0TnVtWm9vbUxldmVscygpLTEpO3RoaXMubWFwLnpvb21Ubyh6b29tKTtP cGVuTGF5ZXJzLkV2ZW50LnN0b3AoZXZ0KTt9LHpvb21CYXJEb3duOmZ1bmN0aW9u KGV2dCl7aWYoIU9wZW5MYXllcnMuRXZlbnQuaXNMZWZ0Q2xpY2soZXZ0KSYmIU9w ZW5MYXllcnMuRXZlbnQuaXNTaW5nbGVUb3VjaChldnQpKXtyZXR1cm47fQp0aGlz Lm1hcC5ldmVudHMub24oeyJ0b3VjaG1vdmUiOnRoaXMucGFzc0V2ZW50VG9TbGlk ZXIsIm1vdXNlbW92ZSI6dGhpcy5wYXNzRXZlbnRUb1NsaWRlciwibW91c2V1cCI6 dGhpcy5wYXNzRXZlbnRUb1NsaWRlcixzY29wZTp0aGlzfSk7dGhpcy5tb3VzZURy YWdTdGFydD1ldnQueHkuY2xvbmUoKTt0aGlzLnpvb21TdGFydD1ldnQueHkuY2xv bmUoKTt0aGlzLmRpdi5zdHlsZS5jdXJzb3I9Im1vdmUiO3RoaXMuem9vbWJhckRp di5vZmZzZXRzPW51bGw7T3BlbkxheWVycy5FdmVudC5zdG9wKGV2dCk7fSx6b29t QmFyRHJhZzpmdW5jdGlvbihldnQpe2lmKHRoaXMubW91c2VEcmFnU3RhcnQhPW51 bGwpe3ZhciBkZWx0YVk9dGhpcy5tb3VzZURyYWdTdGFydC55LWV2dC54eS55O3Zh ciBvZmZzZXRzPU9wZW5MYXllcnMuVXRpbC5wYWdlUG9zaXRpb24odGhpcy56b29t YmFyRGl2KTtpZigoZXZ0LmNsaWVudFktb2Zmc2V0c1sxXSk+MCYmKGV2dC5jbGll bnRZLW9mZnNldHNbMV0pPHBhcnNlSW50KHRoaXMuem9vbWJhckRpdi5zdHlsZS5o ZWlnaHQpLTIpe3ZhciBuZXdUb3A9cGFyc2VJbnQodGhpcy5zbGlkZXIuc3R5bGUu dG9wKS1kZWx0YVk7dGhpcy5zbGlkZXIuc3R5bGUudG9wPW5ld1RvcCsicHgiO3Ro aXMubW91c2VEcmFnU3RhcnQ9ZXZ0Lnh5LmNsb25lKCk7fQp0aGlzLmRlbHRhWT10 aGlzLnpvb21TdGFydC55LWV2dC54eS55O09wZW5MYXllcnMuRXZlbnQuc3RvcChl dnQpO319LHpvb21CYXJVcDpmdW5jdGlvbihldnQpe2lmKCFPcGVuTGF5ZXJzLkV2 ZW50LmlzTGVmdENsaWNrKGV2dCkmJmV2dC50eXBlIT09InRvdWNoZW5kIil7cmV0 dXJuO30KaWYodGhpcy5tb3VzZURyYWdTdGFydCl7dGhpcy5kaXYuc3R5bGUuY3Vy c29yPSIiO3RoaXMubWFwLmV2ZW50cy51bih7InRvdWNobW92ZSI6dGhpcy5wYXNz RXZlbnRUb1NsaWRlciwibW91c2V1cCI6dGhpcy5wYXNzRXZlbnRUb1NsaWRlciwi bW91c2Vtb3ZlIjp0aGlzLnBhc3NFdmVudFRvU2xpZGVyLHNjb3BlOnRoaXN9KTt2 YXIgem9vbUxldmVsPXRoaXMubWFwLnpvb207aWYoIXRoaXMuZm9yY2VGaXhlZFpv b21MZXZlbCYmdGhpcy5tYXAuZnJhY3Rpb25hbFpvb20pe3pvb21MZXZlbCs9dGhp cy5kZWx0YVkvdGhpcy56b29tU3RvcEhlaWdodDt6b29tTGV2ZWw9TWF0aC5taW4o TWF0aC5tYXgoem9vbUxldmVsLDApLHRoaXMubWFwLmdldE51bVpvb21MZXZlbHMo KS0xKTt9ZWxzZXt6b29tTGV2ZWwrPXRoaXMuZGVsdGFZL3RoaXMuem9vbVN0b3BI ZWlnaHQ7em9vbUxldmVsPU1hdGgubWF4KE1hdGgucm91bmQoem9vbUxldmVsKSww KTt9CnRoaXMubWFwLnpvb21Ubyh6b29tTGV2ZWwpO3RoaXMubW91c2VEcmFnU3Rh cnQ9bnVsbDt0aGlzLnpvb21TdGFydD1udWxsO3RoaXMuZGVsdGFZPTA7T3Blbkxh eWVycy5FdmVudC5zdG9wKGV2dCk7fX0sbW92ZVpvb21CYXI6ZnVuY3Rpb24oKXt2 YXIgbmV3VG9wPSgodGhpcy5tYXAuZ2V0TnVtWm9vbUxldmVscygpLTEpLXRoaXMu bWFwLmdldFpvb20oKSkqdGhpcy56b29tU3RvcEhlaWdodCt0aGlzLnN0YXJ0VG9w KzE7dGhpcy5zbGlkZXIuc3R5bGUudG9wPW5ld1RvcCsicHgiO30sQ0xBU1NfTkFN RToiT3BlbkxheWVycy5Db250cm9sLlBhblpvb21CYXIifSk7T3BlbkxheWVycy5M YXllci5JbWFnZT1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuTGF5ZXIse2lz QmFzZUxheWVyOnRydWUsdXJsOm51bGwsZXh0ZW50Om51bGwsc2l6ZTpudWxsLHRp bGU6bnVsbCxhc3BlY3RSYXRpbzpudWxsLGluaXRpYWxpemU6ZnVuY3Rpb24obmFt ZSx1cmwsZXh0ZW50LHNpemUsb3B0aW9ucyl7dGhpcy51cmw9dXJsO3RoaXMuZXh0 ZW50PWV4dGVudDt0aGlzLm1heEV4dGVudD1leHRlbnQ7dGhpcy5zaXplPXNpemU7 T3BlbkxheWVycy5MYXllci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlz LFtuYW1lLG9wdGlvbnNdKTt0aGlzLmFzcGVjdFJhdGlvPSh0aGlzLmV4dGVudC5n ZXRIZWlnaHQoKS90aGlzLnNpemUuaCkvKHRoaXMuZXh0ZW50LmdldFdpZHRoKCkv dGhpcy5zaXplLncpO30sZGVzdHJveTpmdW5jdGlvbigpe2lmKHRoaXMudGlsZSl7 dGhpcy5yZW1vdmVUaWxlTW9uaXRvcmluZ0hvb2tzKHRoaXMudGlsZSk7dGhpcy50 aWxlLmRlc3Ryb3koKTt0aGlzLnRpbGU9bnVsbDt9Ck9wZW5MYXllcnMuTGF5ZXIu cHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpO30sY2xvbmU6 ZnVuY3Rpb24ob2JqKXtpZihvYmo9PW51bGwpe29iaj1uZXcgT3BlbkxheWVycy5M YXllci5JbWFnZSh0aGlzLm5hbWUsdGhpcy51cmwsdGhpcy5leHRlbnQsdGhpcy5z aXplLHRoaXMuZ2V0T3B0aW9ucygpKTt9Cm9iaj1PcGVuTGF5ZXJzLkxheWVyLnBy b3RvdHlwZS5jbG9uZS5hcHBseSh0aGlzLFtvYmpdKTtyZXR1cm4gb2JqO30sc2V0 TWFwOmZ1bmN0aW9uKG1hcCl7aWYodGhpcy5vcHRpb25zLm1heFJlc29sdXRpb249 PW51bGwpe3RoaXMub3B0aW9ucy5tYXhSZXNvbHV0aW9uPXRoaXMuYXNwZWN0UmF0 aW8qdGhpcy5leHRlbnQuZ2V0V2lkdGgoKS90aGlzLnNpemUudzt9Ck9wZW5MYXll cnMuTGF5ZXIucHJvdG90eXBlLnNldE1hcC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7 fSxtb3ZlVG86ZnVuY3Rpb24oYm91bmRzLHpvb21DaGFuZ2VkLGRyYWdnaW5nKXtP cGVuTGF5ZXJzLkxheWVyLnByb3RvdHlwZS5tb3ZlVG8uYXBwbHkodGhpcyxhcmd1 bWVudHMpO3ZhciBmaXJzdFJlbmRlcmluZz0odGhpcy50aWxlPT1udWxsKTtpZih6 b29tQ2hhbmdlZHx8Zmlyc3RSZW5kZXJpbmcpe3RoaXMuc2V0VGlsZVNpemUoKTt2 YXIgdWw9bmV3IE9wZW5MYXllcnMuTG9uTGF0KHRoaXMuZXh0ZW50LmxlZnQsdGhp cy5leHRlbnQudG9wKTt2YXIgdWxQeD10aGlzLm1hcC5nZXRMYXllclB4RnJvbUxv bkxhdCh1bCk7aWYoZmlyc3RSZW5kZXJpbmcpe3RoaXMudGlsZT1uZXcgT3Blbkxh eWVycy5UaWxlLkltYWdlKHRoaXMsdWxQeCx0aGlzLmV4dGVudCxudWxsLHRoaXMu dGlsZVNpemUpO3RoaXMuYWRkVGlsZU1vbml0b3JpbmdIb29rcyh0aGlzLnRpbGUp O31lbHNle3RoaXMudGlsZS5zaXplPXRoaXMudGlsZVNpemUuY2xvbmUoKTt0aGlz LnRpbGUucG9zaXRpb249dWxQeC5jbG9uZSgpO30KdGhpcy50aWxlLmRyYXcoKTt9 fSxzZXRUaWxlU2l6ZTpmdW5jdGlvbigpe3ZhciB0aWxlV2lkdGg9dGhpcy5leHRl bnQuZ2V0V2lkdGgoKS90aGlzLm1hcC5nZXRSZXNvbHV0aW9uKCk7dmFyIHRpbGVI ZWlnaHQ9dGhpcy5leHRlbnQuZ2V0SGVpZ2h0KCkvdGhpcy5tYXAuZ2V0UmVzb2x1 dGlvbigpO3RoaXMudGlsZVNpemU9bmV3IE9wZW5MYXllcnMuU2l6ZSh0aWxlV2lk dGgsdGlsZUhlaWdodCk7fSxhZGRUaWxlTW9uaXRvcmluZ0hvb2tzOmZ1bmN0aW9u KHRpbGUpe3RpbGUub25Mb2FkU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLmV2ZW50cy50 cmlnZ2VyRXZlbnQoImxvYWRzdGFydCIpO307dGlsZS5ldmVudHMucmVnaXN0ZXIo ImxvYWRzdGFydCIsdGhpcyx0aWxlLm9uTG9hZFN0YXJ0KTt0aWxlLm9uTG9hZEVu ZD1mdW5jdGlvbigpe3RoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgibG9hZGVuZCIp O307dGlsZS5ldmVudHMucmVnaXN0ZXIoImxvYWRlbmQiLHRoaXMsdGlsZS5vbkxv YWRFbmQpO3RpbGUuZXZlbnRzLnJlZ2lzdGVyKCJ1bmxvYWQiLHRoaXMsdGlsZS5v bkxvYWRFbmQpO30scmVtb3ZlVGlsZU1vbml0b3JpbmdIb29rczpmdW5jdGlvbih0 aWxlKXt0aWxlLnVubG9hZCgpO3RpbGUuZXZlbnRzLnVuKHsibG9hZHN0YXJ0Ijp0 aWxlLm9uTG9hZFN0YXJ0LCJsb2FkZW5kIjp0aWxlLm9uTG9hZEVuZCwidW5sb2Fk Ijp0aWxlLm9uTG9hZEVuZCxzY29wZTp0aGlzfSk7fSxzZXRVcmw6ZnVuY3Rpb24o bmV3VXJsKXt0aGlzLnVybD1uZXdVcmw7dGhpcy50aWxlLmRyYXcoKTt9LGdldFVS TDpmdW5jdGlvbihib3VuZHMpe3JldHVybiB0aGlzLnVybDt9LENMQVNTX05BTUU6 Ik9wZW5MYXllcnMuTGF5ZXIuSW1hZ2UifSk7T3BlbkxheWVycy5TdHJhdGVneT1P cGVuTGF5ZXJzLkNsYXNzKHtsYXllcjpudWxsLG9wdGlvbnM6bnVsbCxhY3RpdmU6 bnVsbCxhdXRvQWN0aXZhdGU6dHJ1ZSxhdXRvRGVzdHJveTp0cnVlLGluaXRpYWxp emU6ZnVuY3Rpb24ob3B0aW9ucyl7T3BlbkxheWVycy5VdGlsLmV4dGVuZCh0aGlz LG9wdGlvbnMpO3RoaXMub3B0aW9ucz1vcHRpb25zO3RoaXMuYWN0aXZlPWZhbHNl O30sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZGVhY3RpdmF0ZSgpO3RoaXMubGF5 ZXI9bnVsbDt0aGlzLm9wdGlvbnM9bnVsbDt9LHNldExheWVyOmZ1bmN0aW9uKGxh eWVyKXt0aGlzLmxheWVyPWxheWVyO30sYWN0aXZhdGU6ZnVuY3Rpb24oKXtpZigh dGhpcy5hY3RpdmUpe3RoaXMuYWN0aXZlPXRydWU7cmV0dXJuIHRydWU7fQpyZXR1 cm4gZmFsc2U7fSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUp e3RoaXMuYWN0aXZlPWZhbHNlO3JldHVybiB0cnVlO30KcmV0dXJuIGZhbHNlO30s Q0xBU1NfTkFNRToiT3BlbkxheWVycy5TdHJhdGVneSJ9KTtPcGVuTGF5ZXJzLlN0 cmF0ZWd5LlNhdmU9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLlN0cmF0ZWd5 LHtFVkVOVF9UWVBFUzpbInN0YXJ0Iiwic3VjY2VzcyIsImZhaWwiXSxldmVudHM6 bnVsbCxhdXRvOmZhbHNlLHRpbWVyOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihv cHRpb25zKXtPcGVuTGF5ZXJzLlN0cmF0ZWd5LnByb3RvdHlwZS5pbml0aWFsaXpl LmFwcGx5KHRoaXMsW29wdGlvbnNdKTt0aGlzLmV2ZW50cz1uZXcgT3BlbkxheWVy cy5FdmVudHModGhpcyxudWxsLHRoaXMuRVZFTlRfVFlQRVMpO30sYWN0aXZhdGU6 ZnVuY3Rpb24oKXt2YXIgYWN0aXZhdGVkPU9wZW5MYXllcnMuU3RyYXRlZ3kucHJv dG90eXBlLmFjdGl2YXRlLmNhbGwodGhpcyk7aWYoYWN0aXZhdGVkKXtpZih0aGlz LmF1dG8pe2lmKHR5cGVvZiB0aGlzLmF1dG89PT0ibnVtYmVyIil7dGhpcy50aW1l cj13aW5kb3cuc2V0SW50ZXJ2YWwoT3BlbkxheWVycy5GdW5jdGlvbi5iaW5kKHRo aXMuc2F2ZSx0aGlzKSx0aGlzLmF1dG8qMTAwMCk7fWVsc2V7dGhpcy5sYXllci5l dmVudHMub24oeyJmZWF0dXJlYWRkZWQiOnRoaXMudHJpZ2dlclNhdmUsImFmdGVy ZmVhdHVyZW1vZGlmaWVkIjp0aGlzLnRyaWdnZXJTYXZlLHNjb3BlOnRoaXN9KTt9 fX0KcmV0dXJuIGFjdGl2YXRlZDt9LGRlYWN0aXZhdGU6ZnVuY3Rpb24oKXt2YXIg ZGVhY3RpdmF0ZWQ9T3BlbkxheWVycy5TdHJhdGVneS5wcm90b3R5cGUuZGVhY3Rp dmF0ZS5jYWxsKHRoaXMpO2lmKGRlYWN0aXZhdGVkKXtpZih0aGlzLmF1dG8pe2lm KHR5cGVvZiB0aGlzLmF1dG89PT0ibnVtYmVyIil7d2luZG93LmNsZWFySW50ZXJ2 YWwodGhpcy50aW1lcik7fWVsc2V7dGhpcy5sYXllci5ldmVudHMudW4oeyJmZWF0 dXJlYWRkZWQiOnRoaXMudHJpZ2dlclNhdmUsImFmdGVyZmVhdHVyZW1vZGlmaWVk Ijp0aGlzLnRyaWdnZXJTYXZlLHNjb3BlOnRoaXN9KTt9fX0KcmV0dXJuIGRlYWN0 aXZhdGVkO30sdHJpZ2dlclNhdmU6ZnVuY3Rpb24oZXZlbnQpe3ZhciBmZWF0dXJl PWV2ZW50LmZlYXR1cmU7aWYoZmVhdHVyZS5zdGF0ZT09PU9wZW5MYXllcnMuU3Rh dGUuSU5TRVJUfHxmZWF0dXJlLnN0YXRlPT09T3BlbkxheWVycy5TdGF0ZS5VUERB VEV8fGZlYXR1cmUuc3RhdGU9PT1PcGVuTGF5ZXJzLlN0YXRlLkRFTEVURSl7dGhp cy5zYXZlKFtldmVudC5mZWF0dXJlXSk7fX0sc2F2ZTpmdW5jdGlvbihmZWF0dXJl cyl7aWYoIWZlYXR1cmVzKXtmZWF0dXJlcz10aGlzLmxheWVyLmZlYXR1cmVzO30K dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJzdGFydCIse2ZlYXR1cmVzOmZlYXR1 cmVzfSk7dmFyIHJlbW90ZT10aGlzLmxheWVyLnByb2plY3Rpb247dmFyIGxvY2Fs PXRoaXMubGF5ZXIubWFwLmdldFByb2plY3Rpb25PYmplY3QoKTtpZighbG9jYWwu ZXF1YWxzKHJlbW90ZSkpe3ZhciBsZW49ZmVhdHVyZXMubGVuZ3RoO3ZhciBjbG9u ZXM9bmV3IEFycmF5KGxlbik7dmFyIG9yaWcsY2xvbmU7Zm9yKHZhciBpPTA7aTxs ZW47KytpKXtvcmlnPWZlYXR1cmVzW2ldO2Nsb25lPW9yaWcuY2xvbmUoKTtjbG9u ZS5maWQ9b3JpZy5maWQ7Y2xvbmUuc3RhdGU9b3JpZy5zdGF0ZTtpZihvcmlnLnVy bCl7Y2xvbmUudXJsPW9yaWcudXJsO30KY2xvbmUuX29yaWdpbmFsPW9yaWc7Y2xv bmUuZ2VvbWV0cnkudHJhbnNmb3JtKGxvY2FsLHJlbW90ZSk7Y2xvbmVzW2ldPWNs b25lO30KZmVhdHVyZXM9Y2xvbmVzO30KdGhpcy5sYXllci5wcm90b2NvbC5jb21t aXQoZmVhdHVyZXMse2NhbGxiYWNrOnRoaXMub25Db21taXQsc2NvcGU6dGhpc30p O30sb25Db21taXQ6ZnVuY3Rpb24ocmVzcG9uc2Upe3ZhciBldnQ9eyJyZXNwb25z ZSI6cmVzcG9uc2V9O2lmKHJlc3BvbnNlLnN1Y2Nlc3MoKSl7dmFyIGZlYXR1cmVz PXJlc3BvbnNlLnJlcUZlYXR1cmVzO3ZhciBzdGF0ZSxmZWF0dXJlO3ZhciBkZXN0 cm95cz1bXTt2YXIgaW5zZXJ0SWRzPXJlc3BvbnNlLmluc2VydElkc3x8W107dmFy IGo9MDtmb3IodmFyIGk9MCxsZW49ZmVhdHVyZXMubGVuZ3RoO2k8bGVuOysraSl7 ZmVhdHVyZT1mZWF0dXJlc1tpXTtmZWF0dXJlPWZlYXR1cmUuX29yaWdpbmFsfHxm ZWF0dXJlO3N0YXRlPWZlYXR1cmUuc3RhdGU7aWYoc3RhdGUpe2lmKHN0YXRlPT1P cGVuTGF5ZXJzLlN0YXRlLkRFTEVURSl7ZGVzdHJveXMucHVzaChmZWF0dXJlKTt9 ZWxzZSBpZihzdGF0ZT09T3BlbkxheWVycy5TdGF0ZS5JTlNFUlQpe2ZlYXR1cmUu ZmlkPWluc2VydElkc1tqXTsrK2o7fQpmZWF0dXJlLnN0YXRlPW51bGw7fX0KaWYo ZGVzdHJveXMubGVuZ3RoPjApe3RoaXMubGF5ZXIuZGVzdHJveUZlYXR1cmVzKGRl c3Ryb3lzKTt9CnRoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgic3VjY2VzcyIsZXZ0 KTt9ZWxzZXt0aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQoImZhaWwiLGV2dCk7fX0s Q0xBU1NfTkFNRToiT3BlbkxheWVycy5TdHJhdGVneS5TYXZlIn0pO09wZW5MYXll cnMuRm9ybWF0LkdQWD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0 LlhNTCx7ZXh0cmFjdFdheXBvaW50czp0cnVlLGV4dHJhY3RUcmFja3M6dHJ1ZSxl eHRyYWN0Um91dGVzOnRydWUsZXh0cmFjdEF0dHJpYnV0ZXM6dHJ1ZSxpbml0aWFs aXplOmZ1bmN0aW9uKG9wdGlvbnMpe3RoaXMuZXh0ZXJuYWxQcm9qZWN0aW9uPW5l dyBPcGVuTGF5ZXJzLlByb2plY3Rpb24oIkVQU0c6NDMyNiIpO09wZW5MYXllcnMu Rm9ybWF0LlhNTC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRp b25zXSk7fSxyZWFkOmZ1bmN0aW9uKGRvYyl7aWYodHlwZW9mIGRvYz09InN0cmlu ZyIpe2RvYz1PcGVuTGF5ZXJzLkZvcm1hdC5YTUwucHJvdG90eXBlLnJlYWQuYXBw bHkodGhpcyxbZG9jXSk7fQp2YXIgZmVhdHVyZXM9W107aWYodGhpcy5leHRyYWN0 VHJhY2tzKXt2YXIgdHJhY2tzPWRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHJr Iik7Zm9yKHZhciBpPTAsbGVuPXRyYWNrcy5sZW5ndGg7aTxsZW47aSsrKXt2YXIg YXR0cnM9e307aWYodGhpcy5leHRyYWN0QXR0cmlidXRlcyl7YXR0cnM9dGhpcy5w YXJzZUF0dHJpYnV0ZXModHJhY2tzW2ldKTt9CnZhciBzZWdzPXRoaXMuZ2V0RWxl bWVudHNCeVRhZ05hbWVOUyh0cmFja3NbaV0sdHJhY2tzW2ldLm5hbWVzcGFjZVVS SSwidHJrc2VnIik7Zm9yKHZhciBqPTAsc2VnbGVuPXNlZ3MubGVuZ3RoO2o8c2Vn bGVuO2orKyl7dmFyIHRyYWNrPXRoaXMuZXh0cmFjdFNlZ21lbnQoc2Vnc1tqXSwi dHJrcHQiKTtmZWF0dXJlcy5wdXNoKG5ldyBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVj dG9yKHRyYWNrLGF0dHJzKSk7fX19CmlmKHRoaXMuZXh0cmFjdFJvdXRlcyl7dmFy IHJvdXRlcz1kb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInJ0ZSIpO2Zvcih2YXIg az0wLGtsZW49cm91dGVzLmxlbmd0aDtrPGtsZW47aysrKXt2YXIgYXR0cnM9e307 aWYodGhpcy5leHRyYWN0QXR0cmlidXRlcyl7YXR0cnM9dGhpcy5wYXJzZUF0dHJp YnV0ZXMocm91dGVzW2tdKTt9CnZhciByb3V0ZT10aGlzLmV4dHJhY3RTZWdtZW50 KHJvdXRlc1trXSwicnRlcHQiKTtmZWF0dXJlcy5wdXNoKG5ldyBPcGVuTGF5ZXJz LkZlYXR1cmUuVmVjdG9yKHJvdXRlLGF0dHJzKSk7fX0KaWYodGhpcy5leHRyYWN0 V2F5cG9pbnRzKXt2YXIgd2F5cG9pbnRzPWRvYy5nZXRFbGVtZW50c0J5VGFnTmFt ZSgid3B0Iik7Zm9yKHZhciBsPTAsbGVuPXdheXBvaW50cy5sZW5ndGg7bDxsZW47 bCsrKXt2YXIgYXR0cnM9e307aWYodGhpcy5leHRyYWN0QXR0cmlidXRlcyl7YXR0 cnM9dGhpcy5wYXJzZUF0dHJpYnV0ZXMod2F5cG9pbnRzW2xdKTt9CnZhciB3cHQ9 bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQod2F5cG9pbnRzW2xdLmdldEF0 dHJpYnV0ZSgibG9uIiksd2F5cG9pbnRzW2xdLmdldEF0dHJpYnV0ZSgibGF0Iikp O2ZlYXR1cmVzLnB1c2gobmV3IE9wZW5MYXllcnMuRmVhdHVyZS5WZWN0b3Iod3B0 LGF0dHJzKSk7fX0KaWYodGhpcy5pbnRlcm5hbFByb2plY3Rpb24mJnRoaXMuZXh0 ZXJuYWxQcm9qZWN0aW9uKXtmb3IodmFyIGc9MCxmZWF0TGVuZ3RoPWZlYXR1cmVz Lmxlbmd0aDtnPGZlYXRMZW5ndGg7ZysrKXtmZWF0dXJlc1tnXS5nZW9tZXRyeS50 cmFuc2Zvcm0odGhpcy5leHRlcm5hbFByb2plY3Rpb24sdGhpcy5pbnRlcm5hbFBy b2plY3Rpb24pO319CnJldHVybiBmZWF0dXJlczt9LGV4dHJhY3RTZWdtZW50OmZ1 bmN0aW9uKHNlZ21lbnQsc2VnbWVudFR5cGUpe3ZhciBwb2ludHM9dGhpcy5nZXRF bGVtZW50c0J5VGFnTmFtZU5TKHNlZ21lbnQsc2VnbWVudC5uYW1lc3BhY2VVUkks c2VnbWVudFR5cGUpO3ZhciBwb2ludF9mZWF0dXJlcz1bXTtmb3IodmFyIGk9MCxs ZW49cG9pbnRzLmxlbmd0aDtpPGxlbjtpKyspe3BvaW50X2ZlYXR1cmVzLnB1c2go bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQocG9pbnRzW2ldLmdldEF0dHJp YnV0ZSgibG9uIikscG9pbnRzW2ldLmdldEF0dHJpYnV0ZSgibGF0IikpKTt9CnJl dHVybiBuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5MaW5lU3RyaW5nKHBvaW50X2Zl YXR1cmVzKTt9LHBhcnNlQXR0cmlidXRlczpmdW5jdGlvbihub2RlKXt2YXIgYXR0 cmlidXRlcz17fTt2YXIgYXR0ck5vZGU9bm9kZS5maXJzdENoaWxkLHZhbHVlLG5h bWU7d2hpbGUoYXR0ck5vZGUpe2lmKGF0dHJOb2RlLm5vZGVUeXBlPT0xKXt2YWx1 ZT1hdHRyTm9kZS5maXJzdENoaWxkO2lmKHZhbHVlLm5vZGVUeXBlPT0zfHx2YWx1 ZS5ub2RlVHlwZT09NCl7bmFtZT0oYXR0ck5vZGUucHJlZml4KT9hdHRyTm9kZS5u b2RlTmFtZS5zcGxpdCgiOiIpWzFdOmF0dHJOb2RlLm5vZGVOYW1lO2lmKG5hbWUh PSJ0cmtzZWciJiZuYW1lIT0icnRlcHQiKXthdHRyaWJ1dGVzW25hbWVdPXZhbHVl Lm5vZGVWYWx1ZTt9fX0KYXR0ck5vZGU9YXR0ck5vZGUubmV4dFNpYmxpbmc7fQpy ZXR1cm4gYXR0cmlidXRlczt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0 LkdQWCJ9KTtPcGVuTGF5ZXJzLkZvcm1hdC5XTVNEZXNjcmliZUxheWVyPU9wZW5M YXllcnMuQ2xhc3MoT3BlbkxheWVycy5Gb3JtYXQuWE1MLlZlcnNpb25lZE9HQyx7 ZGVmYXVsdFZlcnNpb246IjEuMS4xIixnZXRWZXJzaW9uOmZ1bmN0aW9uKHJvb3Qs b3B0aW9ucyl7dmFyIHZlcnNpb249T3BlbkxheWVycy5Gb3JtYXQuWE1MLlZlcnNp b25lZE9HQy5wcm90b3R5cGUuZ2V0VmVyc2lvbi5hcHBseSh0aGlzLGFyZ3VtZW50 cyk7aWYodmVyc2lvbj09IjEuMS4xInx8dmVyc2lvbj09IjEuMS4wIil7dmVyc2lv bj0iMS4xIjt9CnJldHVybiB2ZXJzaW9uO30sQ0xBU1NfTkFNRToiT3BlbkxheWVy cy5Gb3JtYXQuV01TRGVzY3JpYmVMYXllciJ9KTtPcGVuTGF5ZXJzLkZvcm1hdC5X TVNEZXNjcmliZUxheWVyLnYxXzE9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJz LkZvcm1hdC5XTVNEZXNjcmliZUxheWVyLHtpbml0aWFsaXplOmZ1bmN0aW9uKG9w dGlvbnMpe09wZW5MYXllcnMuRm9ybWF0LldNU0Rlc2NyaWJlTGF5ZXIucHJvdG90 eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxbb3B0aW9uc10pO30scmVhZDpmdW5j dGlvbihkYXRhKXtpZih0eXBlb2YgZGF0YT09InN0cmluZyIpe2RhdGE9T3Blbkxh eWVycy5Gb3JtYXQuWE1MLnByb3RvdHlwZS5yZWFkLmFwcGx5KHRoaXMsW2RhdGFd KTt9CnZhciByb290PWRhdGEuZG9jdW1lbnRFbGVtZW50O3ZhciBjaGlsZHJlbj1y b290LmNoaWxkTm9kZXM7dmFyIGRlc2NyaWJlbGF5ZXI9W107dmFyIGNoaWxkTm9k ZSxub2RlTmFtZTtmb3IodmFyIGk9MDtpPGNoaWxkcmVuLmxlbmd0aDsrK2kpe2No aWxkTm9kZT1jaGlsZHJlbltpXTtub2RlTmFtZT1jaGlsZE5vZGUubm9kZU5hbWU7 aWYobm9kZU5hbWU9PSdMYXllckRlc2NyaXB0aW9uJyl7dmFyIGxheWVyTmFtZT1j aGlsZE5vZGUuZ2V0QXR0cmlidXRlKCduYW1lJyk7dmFyIG93c1R5cGU9Jyc7dmFy IG93c1VSTD0nJzt2YXIgdHlwZU5hbWU9Jyc7aWYoY2hpbGROb2RlLmdldEF0dHJp YnV0ZSgnb3dzVHlwZScpKXtvd3NUeXBlPWNoaWxkTm9kZS5nZXRBdHRyaWJ1dGUo J293c1R5cGUnKTtvd3NVUkw9Y2hpbGROb2RlLmdldEF0dHJpYnV0ZSgnb3dzVVJM Jyk7fWVsc2V7aWYoY2hpbGROb2RlLmdldEF0dHJpYnV0ZSgnd2ZzJykhPScnKXtv d3NUeXBlPSdXRlMnO293c1VSTD1jaGlsZE5vZGUuZ2V0QXR0cmlidXRlKCd3ZnMn KTt9ZWxzZSBpZihjaGlsZE5vZGUuZ2V0QXR0cmlidXRlKCd3Y3MnKSE9Jycpe293 c1R5cGU9J1dDUyc7b3dzVVJMPWNoaWxkTm9kZS5nZXRBdHRyaWJ1dGUoJ3djcycp O319CnZhciBxdWVyeT1jaGlsZE5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ1F1 ZXJ5Jyk7aWYocXVlcnkubGVuZ3RoPjApe3R5cGVOYW1lPXF1ZXJ5WzBdLmdldEF0 dHJpYnV0ZSgndHlwZU5hbWUnKTtpZighdHlwZU5hbWUpe3R5cGVOYW1lPXF1ZXJ5 WzBdLmdldEF0dHJpYnV0ZSgndHlwZW5hbWUnKTt9fQpkZXNjcmliZWxheWVyLnB1 c2goe2xheWVyTmFtZTpsYXllck5hbWUsb3dzVHlwZTpvd3NUeXBlLG93c1VSTDpv d3NVUkwsdHlwZU5hbWU6dHlwZU5hbWV9KTt9fQpyZXR1cm4gZGVzY3JpYmVsYXll cjt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0LldNU0Rlc2NyaWJlTGF5 ZXIudjFfMSJ9KTtPcGVuTGF5ZXJzLkZvcm1hdC5YTFM9T3BlbkxheWVycy5DbGFz cyhPcGVuTGF5ZXJzLkZvcm1hdC5YTUwuVmVyc2lvbmVkT0dDLHtkZWZhdWx0VmVy c2lvbjoiMS4xLjAiLHN0cmluZ2lmeU91dHB1dDp0cnVlLENMQVNTX05BTUU6Ik9w ZW5MYXllcnMuRm9ybWF0LlhMUyJ9KTtPcGVuTGF5ZXJzLkZvcm1hdC5YTFMudjE9 T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkZvcm1hdC5YTUwse25hbWVzcGFj ZXM6e3hsczoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC94bHMiLGdtbDoiaHR0cDov L3d3dy5vcGVuZ2lzLm5ldC9nbWwiLHhzaToiaHR0cDovL3d3dy53My5vcmcvMjAw MS9YTUxTY2hlbWEtaW5zdGFuY2UifSxyZWdFeGVzOnt0cmltU3BhY2U6KC9eXHMq fFxzKiQvZykscmVtb3ZlU3BhY2U6KC9ccyovZyksc3BsaXRTcGFjZTooL1xzKy8p LHRyaW1Db21tYTooL1xzKixccyovZyl9LHh5OnRydWUsZGVmYXVsdFByZWZpeDoi eGxzIixzY2hlbWFMb2NhdGlvbjpudWxsLGluaXRpYWxpemU6ZnVuY3Rpb24ob3B0 aW9ucyl7T3BlbkxheWVycy5Gb3JtYXQuWE1MLnByb3RvdHlwZS5pbml0aWFsaXpl LmFwcGx5KHRoaXMsW29wdGlvbnNdKTt9LHJlYWQ6ZnVuY3Rpb24oZGF0YSxvcHRp b25zKXtvcHRpb25zPU9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKG9wdGlv bnMsdGhpcy5vcHRpb25zKTt2YXIgeGxzPXt9O3RoaXMucmVhZENoaWxkTm9kZXMo ZGF0YSx4bHMpO3JldHVybiB4bHM7fSxyZWFkZXJzOnsieGxzIjp7IlhMUyI6ZnVu Y3Rpb24obm9kZSx4bHMpe3hscy52ZXJzaW9uPW5vZGUuZ2V0QXR0cmlidXRlKCJ2 ZXJzaW9uIik7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLHhscyk7fSwiUmVzcG9u c2UiOmZ1bmN0aW9uKG5vZGUseGxzKXt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUs eGxzKTt9LCJHZW9jb2RlUmVzcG9uc2UiOmZ1bmN0aW9uKG5vZGUseGxzKXt4bHMu cmVzcG9uc2VMaXN0cz1bXTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUseGxzKTt9 LCJHZW9jb2RlUmVzcG9uc2VMaXN0IjpmdW5jdGlvbihub2RlLHhscyl7dmFyIHJl c3BvbnNlTGlzdD17ZmVhdHVyZXM6W10sbnVtYmVyT2ZHZW9jb2RlZEFkZHJlc3Nl czpwYXJzZUludChub2RlLmdldEF0dHJpYnV0ZSgibnVtYmVyT2ZHZW9jb2RlZEFk ZHJlc3NlcyIpKX07eGxzLnJlc3BvbnNlTGlzdHMucHVzaChyZXNwb25zZUxpc3Qp O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxyZXNwb25zZUxpc3QpO30sIkdlb2Nv ZGVkQWRkcmVzcyI6ZnVuY3Rpb24obm9kZSxyZXNwb25zZUxpc3Qpe3ZhciBmZWF0 dXJlPW5ldyBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9yKCk7cmVzcG9uc2VMaXN0 LmZlYXR1cmVzLnB1c2goZmVhdHVyZSk7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2Rl LGZlYXR1cmUpO2ZlYXR1cmUuZ2VvbWV0cnk9ZmVhdHVyZS5jb21wb25lbnRzWzBd O30sIkdlb2NvZGVNYXRjaENvZGUiOmZ1bmN0aW9uKG5vZGUsZmVhdHVyZSl7ZmVh dHVyZS5hdHRyaWJ1dGVzLm1hdGNoQ29kZT17YWNjdXJhY3k6cGFyc2VGbG9hdChu b2RlLmdldEF0dHJpYnV0ZSgiYWNjdXJhY3kiKSksbWF0Y2hUeXBlOm5vZGUuZ2V0 QXR0cmlidXRlKCJtYXRjaFR5cGUiKX07fSwiQWRkcmVzcyI6ZnVuY3Rpb24obm9k ZSxmZWF0dXJlKXt2YXIgYWRkcmVzcz17Y291bnRyeUNvZGU6bm9kZS5nZXRBdHRy aWJ1dGUoImNvdW50cnlDb2RlIiksYWRkcmVzc2VlOm5vZGUuZ2V0QXR0cmlidXRl KCJhZGRyZXNzZWUiKSxzdHJlZXQ6W10scGxhY2U6W119O2ZlYXR1cmUuYXR0cmli dXRlcy5hZGRyZXNzPWFkZHJlc3M7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLGFk ZHJlc3MpO30sImZyZWVGb3JtQWRkcmVzcyI6ZnVuY3Rpb24obm9kZSxhZGRyZXNz KXthZGRyZXNzLmZyZWVGb3JtQWRkcmVzcz10aGlzLmdldENoaWxkVmFsdWUobm9k ZSk7fSwiU3RyZWV0QWRkcmVzcyI6ZnVuY3Rpb24obm9kZSxhZGRyZXNzKXt0aGlz LnJlYWRDaGlsZE5vZGVzKG5vZGUsYWRkcmVzcyk7fSwiQnVpbGRpbmciOmZ1bmN0 aW9uKG5vZGUsYWRkcmVzcyl7YWRkcmVzcy5idWlsZGluZz17J251bWJlcic6bm9k ZS5nZXRBdHRyaWJ1dGUoIm51bWJlciIpLHN1YmRpdmlzaW9uOm5vZGUuZ2V0QXR0 cmlidXRlKCJzdWJkaXZpc2lvbiIpLGJ1aWxkaW5nTmFtZTpub2RlLmdldEF0dHJp YnV0ZSgiYnVpbGRpbmdOYW1lIil9O30sIlN0cmVldCI6ZnVuY3Rpb24obm9kZSxh ZGRyZXNzKXthZGRyZXNzLnN0cmVldC5wdXNoKHRoaXMuZ2V0Q2hpbGRWYWx1ZShu b2RlKSk7fSwiUGxhY2UiOmZ1bmN0aW9uKG5vZGUsYWRkcmVzcyl7YWRkcmVzcy5w bGFjZVtub2RlLmdldEF0dHJpYnV0ZSgidHlwZSIpXT10aGlzLmdldENoaWxkVmFs dWUobm9kZSk7fSwiUG9zdGFsQ29kZSI6ZnVuY3Rpb24obm9kZSxhZGRyZXNzKXth ZGRyZXNzLnBvc3RhbENvZGU9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO319LCJn bWwiOk9wZW5MYXllcnMuRm9ybWF0LkdNTC52My5wcm90b3R5cGUucmVhZGVycy5n bWx9LHdyaXRlOmZ1bmN0aW9uKHJlcXVlc3Qpe3JldHVybiB0aGlzLndyaXRlcnMu eGxzLlhMUy5hcHBseSh0aGlzLFtyZXF1ZXN0XSk7fSx3cml0ZXJzOnsieGxzIjp7 IlhMUyI6ZnVuY3Rpb24ocmVxdWVzdCl7dmFyIHJvb3Q9dGhpcy5jcmVhdGVFbGVt ZW50TlNQbHVzKCJ4bHM6WExTIix7YXR0cmlidXRlczp7InZlcnNpb24iOnRoaXMu VkVSU0lPTiwieHNpOnNjaGVtYUxvY2F0aW9uIjp0aGlzLnNjaGVtYUxvY2F0aW9u fX0pO3RoaXMud3JpdGVOb2RlKCJSZXF1ZXN0SGVhZGVyIixyZXF1ZXN0LmhlYWRl cixyb290KTt0aGlzLndyaXRlTm9kZSgiUmVxdWVzdCIscmVxdWVzdCxyb290KTty ZXR1cm4gcm9vdDt9LCJSZXF1ZXN0SGVhZGVyIjpmdW5jdGlvbihoZWFkZXIpe3Jl dHVybiB0aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoInhsczpSZXF1ZXN0SGVhZGVy Iik7fSwiUmVxdWVzdCI6ZnVuY3Rpb24ocmVxdWVzdCl7dmFyIG5vZGU9dGhpcy5j cmVhdGVFbGVtZW50TlNQbHVzKCJ4bHM6UmVxdWVzdCIse2F0dHJpYnV0ZXM6e21l dGhvZE5hbWU6Ikdlb2NvZGVSZXF1ZXN0IixyZXF1ZXN0SUQ6cmVxdWVzdC5yZXF1 ZXN0SUR8fCIiLHZlcnNpb246dGhpcy5WRVJTSU9OfX0pO3RoaXMud3JpdGVOb2Rl KCJHZW9jb2RlUmVxdWVzdCIscmVxdWVzdC5hZGRyZXNzZXMsbm9kZSk7cmV0dXJu IG5vZGU7fSwiR2VvY29kZVJlcXVlc3QiOmZ1bmN0aW9uKGFkZHJlc3Nlcyl7dmFy IG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJ4bHM6R2VvY29kZVJlcXVl c3QiKTtmb3IodmFyIGk9MCxsZW49YWRkcmVzc2VzLmxlbmd0aDtpPGxlbjtpKysp e3RoaXMud3JpdGVOb2RlKCJBZGRyZXNzIixhZGRyZXNzZXNbaV0sbm9kZSk7fQpy ZXR1cm4gbm9kZTt9LCJBZGRyZXNzIjpmdW5jdGlvbihhZGRyZXNzKXt2YXIgbm9k ZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoInhsczpBZGRyZXNzIix7YXR0cmli dXRlczp7Y291bnRyeUNvZGU6YWRkcmVzcy5jb3VudHJ5Q29kZX19KTtpZihhZGRy ZXNzLmZyZWVGb3JtQWRkcmVzcyl7dGhpcy53cml0ZU5vZGUoImZyZWVGb3JtQWRk ZXNzIixhZGRyZXNzLmZyZWVGb3JtQWRkcmVzcyxub2RlKTt9ZWxzZXtpZihhZGRy ZXNzLnN0cmVldCl7dGhpcy53cml0ZU5vZGUoIlN0cmVldEFkZHJlc3MiLGFkZHJl c3Msbm9kZSk7fQppZihhZGRyZXNzLm11bmljaXBhbGl0eSl7dGhpcy53cml0ZU5v ZGUoIk11bmljaXBhbGl0eSIsYWRkcmVzcy5tdW5pY2lwYWxpdHksbm9kZSk7fQpp ZihhZGRyZXNzLmNvdW50cnlTdWJkaXZpc2lvbil7dGhpcy53cml0ZU5vZGUoIkNv dW50cnlTdWJkaXZpc2lvbiIsYWRkcmVzcy5jb3VudHJ5U3ViZGl2aXNpb24sbm9k ZSk7fQppZihhZGRyZXNzLnBvc3RhbENvZGUpe3RoaXMud3JpdGVOb2RlKCJQb3N0 YWxDb2RlIixhZGRyZXNzLnBvc3RhbENvZGUsbm9kZSk7fX0KcmV0dXJuIG5vZGU7 fSwiZnJlZUZvcm1BZGRyZXNzIjpmdW5jdGlvbihmcmVlRm9ybUFkZHJlc3Mpe3Jl dHVybiB0aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImZyZWVGb3JtQWRkcmVzcyIs e3ZhbHVlOmZyZWVGb3JtQWRkcmVzc30pO30sIlN0cmVldEFkZHJlc3MiOmZ1bmN0 aW9uKGFkZHJlc3Mpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygi eGxzOlN0cmVldEFkZHJlc3MiKTtpZihhZGRyZXNzLmJ1aWxkaW5nKXt0aGlzLndy aXRlTm9kZShub2RlLCJCdWlsZGluZyIsYWRkcmVzcy5idWlsZGluZyk7fQp2YXIg c3RyZWV0PWFkZHJlc3Muc3RyZWV0O2lmKCEoT3BlbkxheWVycy5VdGlsLmlzQXJy YXkoc3RyZWV0KSkpe3N0cmVldD1bc3RyZWV0XTt9CmZvcih2YXIgaT0wLGxlbj1z dHJlZXQubGVuZ3RoO2k8bGVuO2krKyl7dGhpcy53cml0ZU5vZGUoIlN0cmVldCIs c3RyZWV0W2ldLG5vZGUpO30KcmV0dXJuIG5vZGU7fSwiQnVpbGRpbmciOmZ1bmN0 aW9uKGJ1aWxkaW5nKXtyZXR1cm4gdGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJ4 bHM6QnVpbGRpbmciLHthdHRyaWJ1dGVzOnsibnVtYmVyIjpidWlsZGluZ1sibnVt YmVyIl0sInN1YmRpdmlzaW9uIjpidWlsZGluZy5zdWJkaXZpc2lvbiwiYnVpbGRp bmdOYW1lIjpidWlsZGluZy5idWlsZGluZ05hbWV9fSk7fSwiU3RyZWV0IjpmdW5j dGlvbihzdHJlZXQpe3JldHVybiB0aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoInhs czpTdHJlZXQiLHt2YWx1ZTpzdHJlZXR9KTt9LCJNdW5pY2lwYWxpdHkiOmZ1bmN0 aW9uKG11bmljaXBhbGl0eSl7cmV0dXJuIHRoaXMuY3JlYXRlRWxlbWVudE5TUGx1 cygieGxzOlBsYWNlIix7YXR0cmlidXRlczp7dHlwZToiTXVuaWNpcGFsaXR5In0s dmFsdWU6bXVuaWNpcGFsaXR5fSk7fSwiQ291bnRyeVN1YmRpdmlzaW9uIjpmdW5j dGlvbihjb3VudHJ5U3ViZGl2aXNpb24pe3JldHVybiB0aGlzLmNyZWF0ZUVsZW1l bnROU1BsdXMoInhsczpQbGFjZSIse2F0dHJpYnV0ZXM6e3R5cGU6IkNvdW50cnlT dWJkaXZpc2lvbiJ9LHZhbHVlOmNvdW50cnlTdWJkaXZpc2lvbn0pO30sIlBvc3Rh bENvZGUiOmZ1bmN0aW9uKHBvc3RhbENvZGUpe3JldHVybiB0aGlzLmNyZWF0ZUVs ZW1lbnROU1BsdXMoInhsczpQb3N0YWxDb2RlIix7dmFsdWU6cG9zdGFsQ29kZX0p O319fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5YTFMudjEifSk7T3Bl bkxheWVycy5SZW5kZXJlcj1PcGVuTGF5ZXJzLkNsYXNzKHtjb250YWluZXI6bnVs bCxyb290Om51bGwsZXh0ZW50Om51bGwsbG9ja2VkOmZhbHNlLHNpemU6bnVsbCxy ZXNvbHV0aW9uOm51bGwsbWFwOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihjb250 YWluZXJJRCxvcHRpb25zKXt0aGlzLmNvbnRhaW5lcj1PcGVuTGF5ZXJzLlV0aWwu Z2V0RWxlbWVudChjb250YWluZXJJRCk7T3BlbkxheWVycy5VdGlsLmV4dGVuZCh0 aGlzLG9wdGlvbnMpO30sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuY29udGFpbmVy PW51bGw7dGhpcy5leHRlbnQ9bnVsbDt0aGlzLnNpemU9bnVsbDt0aGlzLnJlc29s dXRpb249bnVsbDt0aGlzLm1hcD1udWxsO30sc3VwcG9ydGVkOmZ1bmN0aW9uKCl7 cmV0dXJuIGZhbHNlO30sc2V0RXh0ZW50OmZ1bmN0aW9uKGV4dGVudCxyZXNvbHV0 aW9uQ2hhbmdlZCl7dGhpcy5leHRlbnQ9ZXh0ZW50LmNsb25lKCk7aWYocmVzb2x1 dGlvbkNoYW5nZWQpe3RoaXMucmVzb2x1dGlvbj1udWxsO319LHNldFNpemU6ZnVu Y3Rpb24oc2l6ZSl7dGhpcy5zaXplPXNpemUuY2xvbmUoKTt0aGlzLnJlc29sdXRp b249bnVsbDt9LGdldFJlc29sdXRpb246ZnVuY3Rpb24oKXt0aGlzLnJlc29sdXRp b249dGhpcy5yZXNvbHV0aW9ufHx0aGlzLm1hcC5nZXRSZXNvbHV0aW9uKCk7cmV0 dXJuIHRoaXMucmVzb2x1dGlvbjt9LGRyYXdGZWF0dXJlOmZ1bmN0aW9uKGZlYXR1 cmUsc3R5bGUpe2lmKHN0eWxlPT1udWxsKXtzdHlsZT1mZWF0dXJlLnN0eWxlO30K aWYoZmVhdHVyZS5nZW9tZXRyeSl7dmFyIGJvdW5kcz1mZWF0dXJlLmdlb21ldHJ5 LmdldEJvdW5kcygpO2lmKGJvdW5kcyl7aWYoIWJvdW5kcy5pbnRlcnNlY3RzQm91 bmRzKHRoaXMuZXh0ZW50KSl7c3R5bGU9e2Rpc3BsYXk6Im5vbmUifTt9CnZhciBy ZW5kZXJlZD10aGlzLmRyYXdHZW9tZXRyeShmZWF0dXJlLmdlb21ldHJ5LHN0eWxl LGZlYXR1cmUuaWQpO2lmKHN0eWxlLmRpc3BsYXkhPSJub25lIiYmc3R5bGUubGFi ZWwmJnJlbmRlcmVkIT09ZmFsc2Upe3ZhciBsb2NhdGlvbj1mZWF0dXJlLmdlb21l dHJ5LmdldENlbnRyb2lkKCk7aWYoc3R5bGUubGFiZWxYT2Zmc2V0fHxzdHlsZS5s YWJlbFlPZmZzZXQpe3ZhciB4T2Zmc2V0PWlzTmFOKHN0eWxlLmxhYmVsWE9mZnNl dCk/MDpzdHlsZS5sYWJlbFhPZmZzZXQ7dmFyIHlPZmZzZXQ9aXNOYU4oc3R5bGUu bGFiZWxZT2Zmc2V0KT8wOnN0eWxlLmxhYmVsWU9mZnNldDt2YXIgcmVzPXRoaXMu Z2V0UmVzb2x1dGlvbigpO2xvY2F0aW9uLm1vdmUoeE9mZnNldCpyZXMseU9mZnNl dCpyZXMpO30KdGhpcy5kcmF3VGV4dChmZWF0dXJlLmlkLHN0eWxlLGxvY2F0aW9u KTt9ZWxzZXt0aGlzLnJlbW92ZVRleHQoZmVhdHVyZS5pZCk7fQpyZXR1cm4gcmVu ZGVyZWQ7fX19LGRyYXdHZW9tZXRyeTpmdW5jdGlvbihnZW9tZXRyeSxzdHlsZSxm ZWF0dXJlSWQpe30sZHJhd1RleHQ6ZnVuY3Rpb24oZmVhdHVyZUlkLHN0eWxlLGxv Y2F0aW9uKXt9LHJlbW92ZVRleHQ6ZnVuY3Rpb24oZmVhdHVyZUlkKXt9LGNsZWFy OmZ1bmN0aW9uKCl7fSxnZXRGZWF0dXJlSWRGcm9tRXZlbnQ6ZnVuY3Rpb24oZXZ0 KXt9LGVyYXNlRmVhdHVyZXM6ZnVuY3Rpb24oZmVhdHVyZXMpe2lmKCEoT3Blbkxh eWVycy5VdGlsLmlzQXJyYXkoZmVhdHVyZXMpKSl7ZmVhdHVyZXM9W2ZlYXR1cmVz XTt9CmZvcih2YXIgaT0wLGxlbj1mZWF0dXJlcy5sZW5ndGg7aTxsZW47KytpKXt2 YXIgZmVhdHVyZT1mZWF0dXJlc1tpXTt0aGlzLmVyYXNlR2VvbWV0cnkoZmVhdHVy ZS5nZW9tZXRyeSxmZWF0dXJlLmlkKTt0aGlzLnJlbW92ZVRleHQoZmVhdHVyZS5p ZCk7fX0sZXJhc2VHZW9tZXRyeTpmdW5jdGlvbihnZW9tZXRyeSxmZWF0dXJlSWQp e30sbW92ZVJvb3Q6ZnVuY3Rpb24ocmVuZGVyZXIpe30sZ2V0UmVuZGVyTGF5ZXJJ ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lci5pZDt9LGFwcGx5RGVm YXVsdFN5bWJvbGl6ZXI6ZnVuY3Rpb24oc3ltYm9saXplcil7dmFyIHJlc3VsdD1P cGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHt9LE9wZW5MYXllcnMuUmVuZGVyZXIuZGVm YXVsdFN5bWJvbGl6ZXIpO2lmKHN5bWJvbGl6ZXIuc3Ryb2tlPT09ZmFsc2Upe2Rl bGV0ZSByZXN1bHQuc3Ryb2tlV2lkdGg7ZGVsZXRlIHJlc3VsdC5zdHJva2VDb2xv cjt9CmlmKHN5bWJvbGl6ZXIuZmlsbD09PWZhbHNlKXtkZWxldGUgcmVzdWx0LmZp bGxDb2xvcjt9Ck9wZW5MYXllcnMuVXRpbC5leHRlbmQocmVzdWx0LHN5bWJvbGl6 ZXIpO3JldHVybiByZXN1bHQ7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLlJlbmRl cmVyIn0pO09wZW5MYXllcnMuUmVuZGVyZXIuZGVmYXVsdFN5bWJvbGl6ZXI9e2Zp bGxDb2xvcjoiIzAwMDAwMCIsc3Ryb2tlQ29sb3I6IiMwMDAwMDAiLHN0cm9rZVdp ZHRoOjIsZmlsbE9wYWNpdHk6MSxzdHJva2VPcGFjaXR5OjEscG9pbnRSYWRpdXM6 MH07T3BlbkxheWVycy5SZW5kZXJlci5DYW52YXM9T3BlbkxheWVycy5DbGFzcyhP cGVuTGF5ZXJzLlJlbmRlcmVyLHtoaXREZXRlY3Rpb246dHJ1ZSxoaXRPdmVyZmxv dzowLGNhbnZhczpudWxsLGZlYXR1cmVzOm51bGwscGVuZGluZ1JlZHJhdzpmYWxz ZSxpbml0aWFsaXplOmZ1bmN0aW9uKGNvbnRhaW5lcklELG9wdGlvbnMpe09wZW5M YXllcnMuUmVuZGVyZXIucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxh cmd1bWVudHMpO3RoaXMucm9vdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52 YXMiKTt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnJvb3QpO3RoaXMu Y2FudmFzPXRoaXMucm9vdC5nZXRDb250ZXh0KCIyZCIpO3RoaXMuZmVhdHVyZXM9 e307aWYodGhpcy5oaXREZXRlY3Rpb24pe3RoaXMuaGl0Q2FudmFzPWRvY3VtZW50 LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3RoaXMuaGl0Q29udGV4dD10aGlzLmhp dENhbnZhcy5nZXRDb250ZXh0KCIyZCIpO319LGVyYXNlR2VvbWV0cnk6ZnVuY3Rp b24oZ2VvbWV0cnksZmVhdHVyZUlkKXt0aGlzLmVyYXNlRmVhdHVyZXModGhpcy5m ZWF0dXJlc1tmZWF0dXJlSWRdWzBdKTt9LHN1cHBvcnRlZDpmdW5jdGlvbigpe3Zh ciBjYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7cmV0dXJu ISFjYW52YXMuZ2V0Q29udGV4dDt9LHNldFNpemU6ZnVuY3Rpb24oc2l6ZSl7dGhp cy5zaXplPXNpemUuY2xvbmUoKTt2YXIgcm9vdD10aGlzLnJvb3Q7cm9vdC5zdHls ZS53aWR0aD1zaXplLncrInB4Ijtyb290LnN0eWxlLmhlaWdodD1zaXplLmgrInB4 Ijtyb290LndpZHRoPXNpemUudztyb290LmhlaWdodD1zaXplLmg7dGhpcy5yZXNv bHV0aW9uPW51bGw7aWYodGhpcy5oaXREZXRlY3Rpb24pe3ZhciBoaXRDYW52YXM9 dGhpcy5oaXRDYW52YXM7aGl0Q2FudmFzLnN0eWxlLndpZHRoPXNpemUudysicHgi O2hpdENhbnZhcy5zdHlsZS5oZWlnaHQ9c2l6ZS5oKyJweCI7aGl0Q2FudmFzLndp ZHRoPXNpemUudztoaXRDYW52YXMuaGVpZ2h0PXNpemUuaDt9fSxkcmF3RmVhdHVy ZTpmdW5jdGlvbihmZWF0dXJlLHN0eWxlKXt2YXIgcmVuZGVyZWQ7aWYoZmVhdHVy ZS5nZW9tZXRyeSl7c3R5bGU9dGhpcy5hcHBseURlZmF1bHRTeW1ib2xpemVyKHN0 eWxlfHxmZWF0dXJlLnN0eWxlKTt2YXIgYm91bmRzPWZlYXR1cmUuZ2VvbWV0cnku Z2V0Qm91bmRzKCk7cmVuZGVyZWQ9KHN0eWxlLmRpc3BsYXkhPT0ibm9uZSIpJiYh IWJvdW5kcyYmYm91bmRzLmludGVyc2VjdHNCb3VuZHModGhpcy5leHRlbnQpO2lm KHJlbmRlcmVkKXt0aGlzLmZlYXR1cmVzW2ZlYXR1cmUuaWRdPVtmZWF0dXJlLHN0 eWxlXTt9CmVsc2V7ZGVsZXRlKHRoaXMuZmVhdHVyZXNbZmVhdHVyZS5pZF0pO30K dGhpcy5wZW5kaW5nUmVkcmF3PXRydWU7fQppZih0aGlzLnBlbmRpbmdSZWRyYXcm JiF0aGlzLmxvY2tlZCl7dGhpcy5yZWRyYXcoKTt0aGlzLnBlbmRpbmdSZWRyYXc9 ZmFsc2U7fQpyZXR1cm4gcmVuZGVyZWQ7fSxkcmF3R2VvbWV0cnk6ZnVuY3Rpb24o Z2VvbWV0cnksc3R5bGUsZmVhdHVyZUlkKXt2YXIgY2xhc3NOYW1lPWdlb21ldHJ5 LkNMQVNTX05BTUU7aWYoKGNsYXNzTmFtZT09Ik9wZW5MYXllcnMuR2VvbWV0cnku Q29sbGVjdGlvbiIpfHwoY2xhc3NOYW1lPT0iT3BlbkxheWVycy5HZW9tZXRyeS5N dWx0aVBvaW50Iil8fChjbGFzc05hbWU9PSJPcGVuTGF5ZXJzLkdlb21ldHJ5Lk11 bHRpTGluZVN0cmluZyIpfHwoY2xhc3NOYW1lPT0iT3BlbkxheWVycy5HZW9tZXRy eS5NdWx0aVBvbHlnb24iKSl7Zm9yKHZhciBpPTA7aTxnZW9tZXRyeS5jb21wb25l bnRzLmxlbmd0aDtpKyspe3RoaXMuZHJhd0dlb21ldHJ5KGdlb21ldHJ5LmNvbXBv bmVudHNbaV0sc3R5bGUsZmVhdHVyZUlkKTt9CnJldHVybjt9CnN3aXRjaChnZW9t ZXRyeS5DTEFTU19OQU1FKXtjYXNlIk9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQi OnRoaXMuZHJhd1BvaW50KGdlb21ldHJ5LHN0eWxlLGZlYXR1cmVJZCk7YnJlYWs7 Y2FzZSJPcGVuTGF5ZXJzLkdlb21ldHJ5LkxpbmVTdHJpbmciOnRoaXMuZHJhd0xp bmVTdHJpbmcoZ2VvbWV0cnksc3R5bGUsZmVhdHVyZUlkKTticmVhaztjYXNlIk9w ZW5MYXllcnMuR2VvbWV0cnkuTGluZWFyUmluZyI6dGhpcy5kcmF3TGluZWFyUmlu ZyhnZW9tZXRyeSxzdHlsZSxmZWF0dXJlSWQpO2JyZWFrO2Nhc2UiT3BlbkxheWVy cy5HZW9tZXRyeS5Qb2x5Z29uIjp0aGlzLmRyYXdQb2x5Z29uKGdlb21ldHJ5LHN0 eWxlLGZlYXR1cmVJZCk7YnJlYWs7ZGVmYXVsdDpicmVhazt9fSxkcmF3RXh0ZXJu YWxHcmFwaGljOmZ1bmN0aW9uKGdlb21ldHJ5LHN0eWxlLGZlYXR1cmVJZCl7dmFy IGltZz1uZXcgSW1hZ2UoKTtpZihzdHlsZS5ncmFwaGljVGl0bGUpe2ltZy50aXRs ZT1zdHlsZS5ncmFwaGljVGl0bGU7fQp2YXIgd2lkdGg9c3R5bGUuZ3JhcGhpY1dp ZHRofHxzdHlsZS5ncmFwaGljSGVpZ2h0O3ZhciBoZWlnaHQ9c3R5bGUuZ3JhcGhp Y0hlaWdodHx8c3R5bGUuZ3JhcGhpY1dpZHRoO3dpZHRoPXdpZHRoP3dpZHRoOnN0 eWxlLnBvaW50UmFkaXVzKjI7aGVpZ2h0PWhlaWdodD9oZWlnaHQ6c3R5bGUucG9p bnRSYWRpdXMqMjt2YXIgeE9mZnNldD0oc3R5bGUuZ3JhcGhpY1hPZmZzZXQhPXVu ZGVmaW5lZCk/c3R5bGUuZ3JhcGhpY1hPZmZzZXQ6LSgwLjUqd2lkdGgpO3ZhciB5 T2Zmc2V0PShzdHlsZS5ncmFwaGljWU9mZnNldCE9dW5kZWZpbmVkKT9zdHlsZS5n cmFwaGljWU9mZnNldDotKDAuNSpoZWlnaHQpO3ZhciBvcGFjaXR5PXN0eWxlLmdy YXBoaWNPcGFjaXR5fHxzdHlsZS5maWxsT3BhY2l0eTt2YXIgb25Mb2FkPWZ1bmN0 aW9uKCl7aWYoIXRoaXMuZmVhdHVyZXNbZmVhdHVyZUlkXSl7cmV0dXJuO30KdmFy IHB0PXRoaXMuZ2V0TG9jYWxYWShnZW9tZXRyeSk7dmFyIHAwPXB0WzBdO3ZhciBw MT1wdFsxXTtpZighaXNOYU4ocDApJiYhaXNOYU4ocDEpKXt2YXIgeD0ocDAreE9m ZnNldCl8MDt2YXIgeT0ocDEreU9mZnNldCl8MDt2YXIgY2FudmFzPXRoaXMuY2Fu dmFzO2NhbnZhcy5nbG9iYWxBbHBoYT1vcGFjaXR5O3ZhciBmYWN0b3I9T3Blbkxh eWVycy5SZW5kZXJlci5DYW52YXMuZHJhd0ltYWdlU2NhbGVGYWN0b3J8fChPcGVu TGF5ZXJzLlJlbmRlcmVyLkNhbnZhcy5kcmF3SW1hZ2VTY2FsZUZhY3Rvcj0vYW5k cm9pZCAyLjEvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgp KT8zMjAvd2luZG93LnNjcmVlbi53aWR0aDoxKTtjYW52YXMuZHJhd0ltYWdlKGlt Zyx4KmZhY3Rvcix5KmZhY3Rvcix3aWR0aCpmYWN0b3IsaGVpZ2h0KmZhY3Rvcik7 aWYodGhpcy5oaXREZXRlY3Rpb24pe3RoaXMuc2V0SGl0Q29udGV4dFN0eWxlKCJm aWxsIixmZWF0dXJlSWQpO3RoaXMuaGl0Q29udGV4dC5maWxsUmVjdCh4LHksd2lk dGgsaGVpZ2h0KTt9fX07aW1nLm9ubG9hZD1PcGVuTGF5ZXJzLkZ1bmN0aW9uLmJp bmQob25Mb2FkLHRoaXMpO2ltZy5zcmM9c3R5bGUuZXh0ZXJuYWxHcmFwaGljO30s c2V0Q2FudmFzU3R5bGU6ZnVuY3Rpb24odHlwZSxzdHlsZSl7aWYodHlwZT09PSJm aWxsIil7dGhpcy5jYW52YXMuZ2xvYmFsQWxwaGE9c3R5bGVbJ2ZpbGxPcGFjaXR5 J107dGhpcy5jYW52YXMuZmlsbFN0eWxlPXN0eWxlWydmaWxsQ29sb3InXTt9ZWxz ZSBpZih0eXBlPT09InN0cm9rZSIpe3RoaXMuY2FudmFzLmdsb2JhbEFscGhhPXN0 eWxlWydzdHJva2VPcGFjaXR5J107dGhpcy5jYW52YXMuc3Ryb2tlU3R5bGU9c3R5 bGVbJ3N0cm9rZUNvbG9yJ107dGhpcy5jYW52YXMubGluZVdpZHRoPXN0eWxlWydz dHJva2VXaWR0aCddO31lbHNle3RoaXMuY2FudmFzLmdsb2JhbEFscGhhPTA7dGhp cy5jYW52YXMubGluZVdpZHRoPTE7fX0sZmVhdHVyZUlkVG9IZXg6ZnVuY3Rpb24o ZmVhdHVyZUlkKXt2YXIgaWQ9TnVtYmVyKGZlYXR1cmVJZC5zcGxpdCgiXyIpLnBv cCgpKSsxO2lmKGlkPj0xNjc3NzIxNil7dGhpcy5oaXRPdmVyZmxvdz1pZC0xNjc3 NzIxNTtpZD1pZCUxNjc3NzIxNisxO30KdmFyIGhleD0iMDAwMDAwIitpZC50b1N0 cmluZygxNik7dmFyIGxlbj1oZXgubGVuZ3RoO2hleD0iIyIraGV4LnN1YnN0cmlu ZyhsZW4tNixsZW4pO3JldHVybiBoZXg7fSxzZXRIaXRDb250ZXh0U3R5bGU6ZnVu Y3Rpb24odHlwZSxmZWF0dXJlSWQsc3ltYm9saXplcil7dmFyIGhleD10aGlzLmZl YXR1cmVJZFRvSGV4KGZlYXR1cmVJZCk7aWYodHlwZT09ImZpbGwiKXt0aGlzLmhp dENvbnRleHQuZ2xvYmFsQWxwaGE9MS4wO3RoaXMuaGl0Q29udGV4dC5maWxsU3R5 bGU9aGV4O31lbHNlIGlmKHR5cGU9PSJzdHJva2UiKXt0aGlzLmhpdENvbnRleHQu Z2xvYmFsQWxwaGE9MS4wO3RoaXMuaGl0Q29udGV4dC5zdHJva2VTdHlsZT1oZXg7 dGhpcy5oaXRDb250ZXh0LmxpbmVXaWR0aD1zeW1ib2xpemVyLnN0cm9rZVdpZHRo KzI7fWVsc2V7dGhpcy5oaXRDb250ZXh0Lmdsb2JhbEFscGhhPTA7dGhpcy5oaXRD b250ZXh0LmxpbmVXaWR0aD0xO319LGRyYXdQb2ludDpmdW5jdGlvbihnZW9tZXRy eSxzdHlsZSxmZWF0dXJlSWQpe2lmKHN0eWxlLmdyYXBoaWMhPT1mYWxzZSl7aWYo c3R5bGUuZXh0ZXJuYWxHcmFwaGljKXt0aGlzLmRyYXdFeHRlcm5hbEdyYXBoaWMo Z2VvbWV0cnksc3R5bGUsZmVhdHVyZUlkKTt9ZWxzZXt2YXIgcHQ9dGhpcy5nZXRM b2NhbFhZKGdlb21ldHJ5KTt2YXIgcDA9cHRbMF07dmFyIHAxPXB0WzFdO2lmKCFp c05hTihwMCkmJiFpc05hTihwMSkpe3ZhciB0d29QaT1NYXRoLlBJKjI7dmFyIHJh ZGl1cz1zdHlsZS5wb2ludFJhZGl1cztpZihzdHlsZS5maWxsIT09ZmFsc2Upe3Ro aXMuc2V0Q2FudmFzU3R5bGUoImZpbGwiLHN0eWxlKTt0aGlzLmNhbnZhcy5iZWdp blBhdGgoKTt0aGlzLmNhbnZhcy5hcmMocDAscDEscmFkaXVzLDAsdHdvUGksdHJ1 ZSk7dGhpcy5jYW52YXMuZmlsbCgpO2lmKHRoaXMuaGl0RGV0ZWN0aW9uKXt0aGlz LnNldEhpdENvbnRleHRTdHlsZSgiZmlsbCIsZmVhdHVyZUlkLHN0eWxlKTt0aGlz LmhpdENvbnRleHQuYmVnaW5QYXRoKCk7dGhpcy5oaXRDb250ZXh0LmFyYyhwMCxw MSxyYWRpdXMsMCx0d29QaSx0cnVlKTt0aGlzLmhpdENvbnRleHQuZmlsbCgpO319 CmlmKHN0eWxlLnN0cm9rZSE9PWZhbHNlKXt0aGlzLnNldENhbnZhc1N0eWxlKCJz dHJva2UiLHN0eWxlKTt0aGlzLmNhbnZhcy5iZWdpblBhdGgoKTt0aGlzLmNhbnZh cy5hcmMocDAscDEscmFkaXVzLDAsdHdvUGksdHJ1ZSk7dGhpcy5jYW52YXMuc3Ry b2tlKCk7aWYodGhpcy5oaXREZXRlY3Rpb24pe3RoaXMuc2V0SGl0Q29udGV4dFN0 eWxlKCJzdHJva2UiLGZlYXR1cmVJZCxzdHlsZSk7dGhpcy5oaXRDb250ZXh0LmJl Z2luUGF0aCgpO3RoaXMuaGl0Q29udGV4dC5hcmMocDAscDEscmFkaXVzLDAsdHdv UGksdHJ1ZSk7dGhpcy5oaXRDb250ZXh0LnN0cm9rZSgpO30KdGhpcy5zZXRDYW52 YXNTdHlsZSgicmVzZXQiKTt9fX19fSxkcmF3TGluZVN0cmluZzpmdW5jdGlvbihn ZW9tZXRyeSxzdHlsZSxmZWF0dXJlSWQpe3N0eWxlPU9wZW5MYXllcnMuVXRpbC5h cHBseURlZmF1bHRzKHtmaWxsOmZhbHNlfSxzdHlsZSk7dGhpcy5kcmF3TGluZWFy UmluZyhnZW9tZXRyeSxzdHlsZSxmZWF0dXJlSWQpO30sZHJhd0xpbmVhclJpbmc6 ZnVuY3Rpb24oZ2VvbWV0cnksc3R5bGUsZmVhdHVyZUlkKXtpZihzdHlsZS5maWxs IT09ZmFsc2Upe3RoaXMuc2V0Q2FudmFzU3R5bGUoImZpbGwiLHN0eWxlKTt0aGlz LnJlbmRlclBhdGgodGhpcy5jYW52YXMsZ2VvbWV0cnksc3R5bGUsZmVhdHVyZUlk LCJmaWxsIik7aWYodGhpcy5oaXREZXRlY3Rpb24pe3RoaXMuc2V0SGl0Q29udGV4 dFN0eWxlKCJmaWxsIixmZWF0dXJlSWQsc3R5bGUpO3RoaXMucmVuZGVyUGF0aCh0 aGlzLmhpdENvbnRleHQsZ2VvbWV0cnksc3R5bGUsZmVhdHVyZUlkLCJmaWxsIik7 fX0KaWYoc3R5bGUuc3Ryb2tlIT09ZmFsc2Upe3RoaXMuc2V0Q2FudmFzU3R5bGUo InN0cm9rZSIsc3R5bGUpO3RoaXMucmVuZGVyUGF0aCh0aGlzLmNhbnZhcyxnZW9t ZXRyeSxzdHlsZSxmZWF0dXJlSWQsInN0cm9rZSIpO2lmKHRoaXMuaGl0RGV0ZWN0 aW9uKXt0aGlzLnNldEhpdENvbnRleHRTdHlsZSgic3Ryb2tlIixmZWF0dXJlSWQs c3R5bGUpO3RoaXMucmVuZGVyUGF0aCh0aGlzLmhpdENvbnRleHQsZ2VvbWV0cnks c3R5bGUsZmVhdHVyZUlkLCJzdHJva2UiKTt9fQp0aGlzLnNldENhbnZhc1N0eWxl KCJyZXNldCIpO30scmVuZGVyUGF0aDpmdW5jdGlvbihjb250ZXh0LGdlb21ldHJ5 LHN0eWxlLGZlYXR1cmVJZCx0eXBlKXt2YXIgY29tcG9uZW50cz1nZW9tZXRyeS5j b21wb25lbnRzO3ZhciBsZW49Y29tcG9uZW50cy5sZW5ndGg7Y29udGV4dC5iZWdp blBhdGgoKTt2YXIgc3RhcnQ9dGhpcy5nZXRMb2NhbFhZKGNvbXBvbmVudHNbMF0p O3ZhciB4PXN0YXJ0WzBdO3ZhciB5PXN0YXJ0WzFdO2lmKCFpc05hTih4KSYmIWlz TmFOKHkpKXtjb250ZXh0Lm1vdmVUbyhzdGFydFswXSxzdGFydFsxXSk7Zm9yKHZh ciBpPTE7aTxsZW47KytpKXt2YXIgcHQ9dGhpcy5nZXRMb2NhbFhZKGNvbXBvbmVu dHNbaV0pO2NvbnRleHQubGluZVRvKHB0WzBdLHB0WzFdKTt9CmlmKHR5cGU9PT0i ZmlsbCIpe2NvbnRleHQuZmlsbCgpO31lbHNle2NvbnRleHQuc3Ryb2tlKCk7fX19 LGRyYXdQb2x5Z29uOmZ1bmN0aW9uKGdlb21ldHJ5LHN0eWxlLGZlYXR1cmVJZCl7 dmFyIGNvbXBvbmVudHM9Z2VvbWV0cnkuY29tcG9uZW50czt2YXIgbGVuPWNvbXBv bmVudHMubGVuZ3RoO3RoaXMuZHJhd0xpbmVhclJpbmcoY29tcG9uZW50c1swXSxz dHlsZSxmZWF0dXJlSWQpO2Zvcih2YXIgaT0xO2k8bGVuOysraSl7dGhpcy5jYW52 YXMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdXQiO2lm KHRoaXMuaGl0RGV0ZWN0aW9uKXt0aGlzLmhpdENvbnRleHQuZ2xvYmFsQ29tcG9z aXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdXQiO30KdGhpcy5kcmF3TGluZWFy UmluZyhjb21wb25lbnRzW2ldLE9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRz KHtzdHJva2U6ZmFsc2UsZmlsbE9wYWNpdHk6MS4wfSxzdHlsZSksZmVhdHVyZUlk KTt0aGlzLmNhbnZhcy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249InNvdXJjZS1v dmVyIjtpZih0aGlzLmhpdERldGVjdGlvbil7dGhpcy5oaXRDb250ZXh0Lmdsb2Jh bENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLW92ZXIiO30KdGhpcy5kcmF3TGlu ZWFyUmluZyhjb21wb25lbnRzW2ldLE9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1 bHRzKHtmaWxsOmZhbHNlfSxzdHlsZSksZmVhdHVyZUlkKTt9fSxkcmF3VGV4dDpm dW5jdGlvbihsb2NhdGlvbixzdHlsZSl7c3R5bGU9T3BlbkxheWVycy5VdGlsLmV4 dGVuZCh7Zm9udENvbG9yOiIjMDAwMDAwIixsYWJlbEFsaWduOiJjbSJ9LHN0eWxl KTt2YXIgcHQ9dGhpcy5nZXRMb2NhbFhZKGxvY2F0aW9uKTt0aGlzLnNldENhbnZh c1N0eWxlKCJyZXNldCIpO3RoaXMuY2FudmFzLmZpbGxTdHlsZT1zdHlsZS5mb250 Q29sb3I7dGhpcy5jYW52YXMuZ2xvYmFsQWxwaGE9c3R5bGUuZm9udE9wYWNpdHl8 fDEuMDt2YXIgZm9udFN0eWxlPVtzdHlsZS5mb250U3R5bGU/c3R5bGUuZm9udFN0 eWxlOiJub3JtYWwiLCJub3JtYWwiLHN0eWxlLmZvbnRXZWlnaHQ/c3R5bGUuZm9u dFdlaWdodDoibm9ybWFsIixzdHlsZS5mb250U2l6ZT9zdHlsZS5mb250U2l6ZToi MWVtIixzdHlsZS5mb250RmFtaWx5P3N0eWxlLmZvbnRGYW1pbHk6InNhbnMtc2Vy aWYiXS5qb2luKCIgIik7dmFyIGxhYmVsUm93cz1zdHlsZS5sYWJlbC5zcGxpdCgn XG4nKTt2YXIgbnVtUm93cz1sYWJlbFJvd3MubGVuZ3RoO2lmKHRoaXMuY2FudmFz LmZpbGxUZXh0KXt0aGlzLmNhbnZhcy5mb250PWZvbnRTdHlsZTt0aGlzLmNhbnZh cy50ZXh0QWxpZ249T3BlbkxheWVycy5SZW5kZXJlci5DYW52YXMuTEFCRUxfQUxJ R05bc3R5bGUubGFiZWxBbGlnblswXV18fCJjZW50ZXIiO3RoaXMuY2FudmFzLnRl eHRCYXNlbGluZT1PcGVuTGF5ZXJzLlJlbmRlcmVyLkNhbnZhcy5MQUJFTF9BTElH TltzdHlsZS5sYWJlbEFsaWduWzFdXXx8Im1pZGRsZSI7dmFyIHZmYWN0b3I9T3Bl bkxheWVycy5SZW5kZXJlci5DYW52YXMuTEFCRUxfRkFDVE9SW3N0eWxlLmxhYmVs QWxpZ25bMV1dO2lmKHZmYWN0b3I9PW51bGwpe3ZmYWN0b3I9LS41O30KdmFyIGxp bmVIZWlnaHQ9dGhpcy5jYW52YXMubWVhc3VyZVRleHQoJ01nJykuaGVpZ2h0fHx0 aGlzLmNhbnZhcy5tZWFzdXJlVGV4dCgneHgnKS53aWR0aDtwdFsxXSs9bGluZUhl aWdodCp2ZmFjdG9yKihudW1Sb3dzLTEpO2Zvcih2YXIgaT0wO2k8bnVtUm93cztp Kyspe3RoaXMuY2FudmFzLmZpbGxUZXh0KGxhYmVsUm93c1tpXSxwdFswXSxwdFsx XSsobGluZUhlaWdodCppKSk7fX1lbHNlIGlmKHRoaXMuY2FudmFzLm1vekRyYXdU ZXh0KXt0aGlzLmNhbnZhcy5tb3pUZXh0U3R5bGU9Zm9udFN0eWxlO3ZhciBoZmFj dG9yPU9wZW5MYXllcnMuUmVuZGVyZXIuQ2FudmFzLkxBQkVMX0ZBQ1RPUltzdHls ZS5sYWJlbEFsaWduWzBdXTtpZihoZmFjdG9yPT1udWxsKXtoZmFjdG9yPS0uNTt9 CnZhciB2ZmFjdG9yPU9wZW5MYXllcnMuUmVuZGVyZXIuQ2FudmFzLkxBQkVMX0ZB Q1RPUltzdHlsZS5sYWJlbEFsaWduWzFdXTtpZih2ZmFjdG9yPT1udWxsKXt2ZmFj dG9yPS0uNTt9CnZhciBsaW5lSGVpZ2h0PXRoaXMuY2FudmFzLm1vek1lYXN1cmVU ZXh0KCd4eCcpO3B0WzFdKz1saW5lSGVpZ2h0KigxKyh2ZmFjdG9yKm51bVJvd3Mp KTtmb3IodmFyIGk9MDtpPG51bVJvd3M7aSsrKXt2YXIgeD1wdFswXSsoaGZhY3Rv cip0aGlzLmNhbnZhcy5tb3pNZWFzdXJlVGV4dChsYWJlbFJvd3NbaV0pKTt2YXIg eT1wdFsxXSsoaSpsaW5lSGVpZ2h0KTt0aGlzLmNhbnZhcy50cmFuc2xhdGUoeCx5 KTt0aGlzLmNhbnZhcy5tb3pEcmF3VGV4dChsYWJlbFJvd3NbaV0pO3RoaXMuY2Fu dmFzLnRyYW5zbGF0ZSgteCwteSk7fX0KdGhpcy5zZXRDYW52YXNTdHlsZSgicmVz ZXQiKTt9LGdldExvY2FsWFk6ZnVuY3Rpb24ocG9pbnQpe3ZhciByZXNvbHV0aW9u PXRoaXMuZ2V0UmVzb2x1dGlvbigpO3ZhciBleHRlbnQ9dGhpcy5leHRlbnQ7dmFy IHg9KHBvaW50LngvcmVzb2x1dGlvbisoLWV4dGVudC5sZWZ0L3Jlc29sdXRpb24p KTt2YXIgeT0oKGV4dGVudC50b3AvcmVzb2x1dGlvbiktcG9pbnQueS9yZXNvbHV0 aW9uKTtyZXR1cm5beCx5XTt9LGNsZWFyOmZ1bmN0aW9uKCl7dmFyIGhlaWdodD10 aGlzLnJvb3QuaGVpZ2h0O3ZhciB3aWR0aD10aGlzLnJvb3Qud2lkdGg7dGhpcy5j YW52YXMuY2xlYXJSZWN0KDAsMCx3aWR0aCxoZWlnaHQpO3RoaXMuZmVhdHVyZXM9 e307aWYodGhpcy5oaXREZXRlY3Rpb24pe3RoaXMuaGl0Q29udGV4dC5jbGVhclJl Y3QoMCwwLHdpZHRoLGhlaWdodCk7fX0sZ2V0RmVhdHVyZUlkRnJvbUV2ZW50OmZ1 bmN0aW9uKGV2dCl7dmFyIGZlYXR1cmU9bnVsbDtpZih0aGlzLmhpdERldGVjdGlv bil7aWYoIXRoaXMubWFwLmRyYWdnaW5nKXt2YXIgeHk9ZXZ0Lnh5O3ZhciB4PXh5 Lnh8MDt2YXIgeT14eS55fDA7dmFyIGRhdGE9dGhpcy5oaXRDb250ZXh0LmdldElt YWdlRGF0YSh4LHksMSwxKS5kYXRhO2lmKGRhdGFbM109PT0yNTUpe3ZhciBpZD1k YXRhWzJdKygyNTYqKGRhdGFbMV0rKDI1NipkYXRhWzBdKSkpO2lmKGlkKXtmZWF0 dXJlPXRoaXMuZmVhdHVyZXNbIk9wZW5MYXllcnMuRmVhdHVyZS5WZWN0b3JfIiso aWQtMSt0aGlzLmhpdE92ZXJmbG93KV1bMF07fX19fQpyZXR1cm4gZmVhdHVyZTt9 LGVyYXNlRmVhdHVyZXM6ZnVuY3Rpb24oZmVhdHVyZXMpe2lmKCEoT3BlbkxheWVy cy5VdGlsLmlzQXJyYXkoZmVhdHVyZXMpKSl7ZmVhdHVyZXM9W2ZlYXR1cmVzXTt9 CmZvcih2YXIgaT0wO2k8ZmVhdHVyZXMubGVuZ3RoOysraSl7ZGVsZXRlIHRoaXMu ZmVhdHVyZXNbZmVhdHVyZXNbaV0uaWRdO30KdGhpcy5yZWRyYXcoKTt9LHJlZHJh dzpmdW5jdGlvbigpe2lmKCF0aGlzLmxvY2tlZCl7dmFyIGhlaWdodD10aGlzLnJv b3QuaGVpZ2h0O3ZhciB3aWR0aD10aGlzLnJvb3Qud2lkdGg7dGhpcy5jYW52YXMu Y2xlYXJSZWN0KDAsMCx3aWR0aCxoZWlnaHQpO2lmKHRoaXMuaGl0RGV0ZWN0aW9u KXt0aGlzLmhpdENvbnRleHQuY2xlYXJSZWN0KDAsMCx3aWR0aCxoZWlnaHQpO30K dmFyIGxhYmVsTWFwPVtdO3ZhciBmZWF0dXJlLHN0eWxlO2Zvcih2YXIgaWQgaW4g dGhpcy5mZWF0dXJlcyl7aWYoIXRoaXMuZmVhdHVyZXMuaGFzT3duUHJvcGVydHko aWQpKXtjb250aW51ZTt9CmZlYXR1cmU9dGhpcy5mZWF0dXJlc1tpZF1bMF07c3R5 bGU9dGhpcy5mZWF0dXJlc1tpZF1bMV07dGhpcy5kcmF3R2VvbWV0cnkoZmVhdHVy ZS5nZW9tZXRyeSxzdHlsZSxmZWF0dXJlLmlkKTtpZihzdHlsZS5sYWJlbCl7bGFi ZWxNYXAucHVzaChbZmVhdHVyZSxzdHlsZV0pO319CnZhciBpdGVtO2Zvcih2YXIg aT0wLGxlbj1sYWJlbE1hcC5sZW5ndGg7aTxsZW47KytpKXtpdGVtPWxhYmVsTWFw W2ldO3RoaXMuZHJhd1RleHQoaXRlbVswXS5nZW9tZXRyeS5nZXRDZW50cm9pZCgp LGl0ZW1bMV0pO319fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLlJlbmRlcmVyLkNh bnZhcyJ9KTtPcGVuTGF5ZXJzLlJlbmRlcmVyLkNhbnZhcy5MQUJFTF9BTElHTj17 ImwiOiJsZWZ0IiwiciI6InJpZ2h0IiwidCI6InRvcCIsImIiOiJib3R0b20ifTtP cGVuTGF5ZXJzLlJlbmRlcmVyLkNhbnZhcy5MQUJFTF9GQUNUT1I9eyJsIjowLCJy IjotMSwidCI6MCwiYiI6LTF9O09wZW5MYXllcnMuUmVuZGVyZXIuQ2FudmFzLmRy YXdJbWFnZVNjYWxlRmFjdG9yPW51bGw7T3BlbkxheWVycy5Gb3JtYXQuT1NNPU9w ZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Gb3JtYXQuWE1MLHtjaGVja1RhZ3M6 ZmFsc2UsaW50ZXJlc3RpbmdUYWdzRXhjbHVkZTpudWxsLGFyZWFUYWdzOm51bGws aW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXt2YXIgbGF5ZXJfZGVmYXVsdHM9 eydpbnRlcmVzdGluZ1RhZ3NFeGNsdWRlJzpbJ3NvdXJjZScsJ3NvdXJjZV9yZWYn LCdzb3VyY2U6cmVmJywnaGlzdG9yeScsJ2F0dHJpYnV0aW9uJywnY3JlYXRlZF9i eSddLCdhcmVhVGFncyc6WydhcmVhJywnYnVpbGRpbmcnLCdsZWlzdXJlJywndG91 cmlzbScsJ3J1aW5zJywnaGlzdG9yaWMnLCdsYW5kdXNlJywnbWlsaXRhcnknLCdu YXR1cmFsJywnc3BvcnQnXX07bGF5ZXJfZGVmYXVsdHM9T3BlbkxheWVycy5VdGls LmV4dGVuZChsYXllcl9kZWZhdWx0cyxvcHRpb25zKTt2YXIgaW50ZXJlc3Rpbmc9 e307Zm9yKHZhciBpPTA7aTxsYXllcl9kZWZhdWx0cy5pbnRlcmVzdGluZ1RhZ3NF eGNsdWRlLmxlbmd0aDtpKyspe2ludGVyZXN0aW5nW2xheWVyX2RlZmF1bHRzLmlu dGVyZXN0aW5nVGFnc0V4Y2x1ZGVbaV1dPXRydWU7fQpsYXllcl9kZWZhdWx0cy5p bnRlcmVzdGluZ1RhZ3NFeGNsdWRlPWludGVyZXN0aW5nO3ZhciBhcmVhPXt9O2Zv cih2YXIgaT0wO2k8bGF5ZXJfZGVmYXVsdHMuYXJlYVRhZ3MubGVuZ3RoO2krKyl7 YXJlYVtsYXllcl9kZWZhdWx0cy5hcmVhVGFnc1tpXV09dHJ1ZTt9CmxheWVyX2Rl ZmF1bHRzLmFyZWFUYWdzPWFyZWE7dGhpcy5leHRlcm5hbFByb2plY3Rpb249bmV3 IE9wZW5MYXllcnMuUHJvamVjdGlvbigiRVBTRzo0MzI2Iik7T3BlbkxheWVycy5G b3JtYXQuWE1MLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW2xheWVy X2RlZmF1bHRzXSk7fSxyZWFkOmZ1bmN0aW9uKGRvYyl7aWYodHlwZW9mIGRvYz09 InN0cmluZyIpe2RvYz1PcGVuTGF5ZXJzLkZvcm1hdC5YTUwucHJvdG90eXBlLnJl YWQuYXBwbHkodGhpcyxbZG9jXSk7fQp2YXIgbm9kZXM9dGhpcy5nZXROb2Rlcyhk b2MpO3ZhciB3YXlzPXRoaXMuZ2V0V2F5cyhkb2MpO3ZhciBmZWF0X2xpc3Q9bmV3 IEFycmF5KHdheXMubGVuZ3RoKTtmb3IodmFyIGk9MDtpPHdheXMubGVuZ3RoO2kr Kyl7dmFyIHBvaW50X2xpc3Q9bmV3IEFycmF5KHdheXNbaV0ubm9kZXMubGVuZ3Ro KTt2YXIgcG9seT10aGlzLmlzV2F5QXJlYSh3YXlzW2ldKT8xOjA7Zm9yKHZhciBq PTA7ajx3YXlzW2ldLm5vZGVzLmxlbmd0aDtqKyspe3ZhciBub2RlPW5vZGVzW3dh eXNbaV0ubm9kZXNbal1dO3ZhciBwb2ludD1uZXcgT3BlbkxheWVycy5HZW9tZXRy eS5Qb2ludChub2RlLmxvbixub2RlLmxhdCk7cG9pbnQub3NtX2lkPXBhcnNlSW50 KHdheXNbaV0ubm9kZXNbal0pO3BvaW50X2xpc3Rbal09cG9pbnQ7bm9kZS51c2Vk PXRydWU7fQp2YXIgZ2VvbWV0cnk9bnVsbDtpZihwb2x5KXtnZW9tZXRyeT1uZXcg T3BlbkxheWVycy5HZW9tZXRyeS5Qb2x5Z29uKG5ldyBPcGVuTGF5ZXJzLkdlb21l dHJ5LkxpbmVhclJpbmcocG9pbnRfbGlzdCkpO31lbHNle2dlb21ldHJ5PW5ldyBP cGVuTGF5ZXJzLkdlb21ldHJ5LkxpbmVTdHJpbmcocG9pbnRfbGlzdCk7fQppZih0 aGlzLmludGVybmFsUHJvamVjdGlvbiYmdGhpcy5leHRlcm5hbFByb2plY3Rpb24p e2dlb21ldHJ5LnRyYW5zZm9ybSh0aGlzLmV4dGVybmFsUHJvamVjdGlvbix0aGlz LmludGVybmFsUHJvamVjdGlvbik7fQp2YXIgZmVhdD1uZXcgT3BlbkxheWVycy5G ZWF0dXJlLlZlY3RvcihnZW9tZXRyeSx3YXlzW2ldLnRhZ3MpO2ZlYXQub3NtX2lk PXBhcnNlSW50KHdheXNbaV0uaWQpO2ZlYXQuZmlkPSJ3YXkuIitmZWF0Lm9zbV9p ZDtmZWF0X2xpc3RbaV09ZmVhdDt9CmZvcih2YXIgbm9kZV9pZCBpbiBub2Rlcyl7 dmFyIG5vZGU9bm9kZXNbbm9kZV9pZF07aWYoIW5vZGUudXNlZHx8dGhpcy5jaGVj a1RhZ3Mpe3ZhciB0YWdzPW51bGw7aWYodGhpcy5jaGVja1RhZ3Mpe3ZhciByZXN1 bHQ9dGhpcy5nZXRUYWdzKG5vZGUubm9kZSx0cnVlKTtpZihub2RlLnVzZWQmJiFy ZXN1bHRbMV0pe2NvbnRpbnVlO30KdGFncz1yZXN1bHRbMF07fWVsc2V7dGFncz10 aGlzLmdldFRhZ3Mobm9kZS5ub2RlKTt9CnZhciBmZWF0PW5ldyBPcGVuTGF5ZXJz LkZlYXR1cmUuVmVjdG9yKG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KG5v ZGVbJ2xvbiddLG5vZGVbJ2xhdCddKSx0YWdzKTtpZih0aGlzLmludGVybmFsUHJv amVjdGlvbiYmdGhpcy5leHRlcm5hbFByb2plY3Rpb24pe2ZlYXQuZ2VvbWV0cnku dHJhbnNmb3JtKHRoaXMuZXh0ZXJuYWxQcm9qZWN0aW9uLHRoaXMuaW50ZXJuYWxQ cm9qZWN0aW9uKTt9CmZlYXQub3NtX2lkPXBhcnNlSW50KG5vZGVfaWQpO2ZlYXQu ZmlkPSJub2RlLiIrZmVhdC5vc21faWQ7ZmVhdF9saXN0LnB1c2goZmVhdCk7fQpu b2RlLm5vZGU9bnVsbDt9CnJldHVybiBmZWF0X2xpc3Q7fSxnZXROb2RlczpmdW5j dGlvbihkb2Mpe3ZhciBub2RlX2xpc3Q9ZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1l KCJub2RlIik7dmFyIG5vZGVzPXt9O2Zvcih2YXIgaT0wO2k8bm9kZV9saXN0Lmxl bmd0aDtpKyspe3ZhciBub2RlPW5vZGVfbGlzdFtpXTt2YXIgaWQ9bm9kZS5nZXRB dHRyaWJ1dGUoImlkIik7bm9kZXNbaWRdPXsnbGF0Jzpub2RlLmdldEF0dHJpYnV0 ZSgibGF0IiksJ2xvbic6bm9kZS5nZXRBdHRyaWJ1dGUoImxvbiIpLCdub2RlJzpu b2RlfTt9CnJldHVybiBub2Rlczt9LGdldFdheXM6ZnVuY3Rpb24oZG9jKXt2YXIg d2F5X2xpc3Q9ZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ3YXkiKTt2YXIgcmV0 dXJuX3dheXM9W107Zm9yKHZhciBpPTA7aTx3YXlfbGlzdC5sZW5ndGg7aSsrKXt2 YXIgd2F5PXdheV9saXN0W2ldO3ZhciB3YXlfb2JqZWN0PXtpZDp3YXkuZ2V0QXR0 cmlidXRlKCJpZCIpfTt3YXlfb2JqZWN0LnRhZ3M9dGhpcy5nZXRUYWdzKHdheSk7 dmFyIG5vZGVfbGlzdD13YXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm5kIik7d2F5 X29iamVjdC5ub2Rlcz1uZXcgQXJyYXkobm9kZV9saXN0Lmxlbmd0aCk7Zm9yKHZh ciBqPTA7ajxub2RlX2xpc3QubGVuZ3RoO2orKyl7d2F5X29iamVjdC5ub2Rlc1tq XT1ub2RlX2xpc3Rbal0uZ2V0QXR0cmlidXRlKCJyZWYiKTt9CnJldHVybl93YXlz LnB1c2god2F5X29iamVjdCk7fQpyZXR1cm4gcmV0dXJuX3dheXM7fSxnZXRUYWdz OmZ1bmN0aW9uKGRvbV9ub2RlLGludGVyZXN0aW5nX3RhZ3Mpe3ZhciB0YWdfbGlz dD1kb21fbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGFnIik7dmFyIHRhZ3M9 e307dmFyIGludGVyZXN0aW5nPWZhbHNlO2Zvcih2YXIgaj0wO2o8dGFnX2xpc3Qu bGVuZ3RoO2orKyl7dmFyIGtleT10YWdfbGlzdFtqXS5nZXRBdHRyaWJ1dGUoImsi KTt0YWdzW2tleV09dGFnX2xpc3Rbal0uZ2V0QXR0cmlidXRlKCJ2Iik7aWYoaW50 ZXJlc3RpbmdfdGFncyl7aWYoIXRoaXMuaW50ZXJlc3RpbmdUYWdzRXhjbHVkZVtr ZXldKXtpbnRlcmVzdGluZz10cnVlO319fQpyZXR1cm4gaW50ZXJlc3RpbmdfdGFn cz9bdGFncyxpbnRlcmVzdGluZ106dGFnczt9LGlzV2F5QXJlYTpmdW5jdGlvbih3 YXkpe3ZhciBwb2x5X3NoYXBlZD1mYWxzZTt2YXIgcG9seV90YWdzPWZhbHNlO2lm KHdheS5ub2Rlc1swXT09d2F5Lm5vZGVzW3dheS5ub2Rlcy5sZW5ndGgtMV0pe3Bv bHlfc2hhcGVkPXRydWU7fQppZih0aGlzLmNoZWNrVGFncyl7Zm9yKHZhciBrZXkg aW4gd2F5LnRhZ3Mpe2lmKHRoaXMuYXJlYVRhZ3Nba2V5XSl7cG9seV90YWdzPXRy dWU7YnJlYWs7fX19CnJldHVybiBwb2x5X3NoYXBlZCYmKHRoaXMuY2hlY2tUYWdz P3BvbHlfdGFnczp0cnVlKTt9LHdyaXRlOmZ1bmN0aW9uKGZlYXR1cmVzKXtpZigh KE9wZW5MYXllcnMuVXRpbC5pc0FycmF5KGZlYXR1cmVzKSkpe2ZlYXR1cmVzPVtm ZWF0dXJlc107fQp0aGlzLm9zbV9pZD0xO3RoaXMuY3JlYXRlZF9ub2Rlcz17fTt2 YXIgcm9vdF9ub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TKG51bGwsIm9zbSIpO3Jv b3Rfbm9kZS5zZXRBdHRyaWJ1dGUoInZlcnNpb24iLCIwLjUiKTtyb290X25vZGUu c2V0QXR0cmlidXRlKCJnZW5lcmF0b3IiLCJPcGVuTGF5ZXJzICIrT3BlbkxheWVy cy5WRVJTSU9OX05VTUJFUik7Zm9yKHZhciBpPWZlYXR1cmVzLmxlbmd0aC0xO2k+ PTA7aS0tKXt2YXIgbm9kZXM9dGhpcy5jcmVhdGVGZWF0dXJlTm9kZXMoZmVhdHVy ZXNbaV0pO2Zvcih2YXIgaj0wO2o8bm9kZXMubGVuZ3RoO2orKyl7cm9vdF9ub2Rl LmFwcGVuZENoaWxkKG5vZGVzW2pdKTt9fQpyZXR1cm4gT3BlbkxheWVycy5Gb3Jt YXQuWE1MLnByb3RvdHlwZS53cml0ZS5hcHBseSh0aGlzLFtyb290X25vZGVdKTt9 LGNyZWF0ZUZlYXR1cmVOb2RlczpmdW5jdGlvbihmZWF0dXJlKXt2YXIgbm9kZXM9 W107dmFyIGNsYXNzTmFtZT1mZWF0dXJlLmdlb21ldHJ5LkNMQVNTX05BTUU7dmFy IHR5cGU9Y2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2Yo Ii4iKSsxKTt0eXBlPXR5cGUudG9Mb3dlckNhc2UoKTt2YXIgYnVpbGRlcj10aGlz LmNyZWF0ZVhNTFt0eXBlXTtpZihidWlsZGVyKXtub2Rlcz1idWlsZGVyLmFwcGx5 KHRoaXMsW2ZlYXR1cmVdKTt9CnJldHVybiBub2Rlczt9LGNyZWF0ZVhNTDp7J3Bv aW50JzpmdW5jdGlvbihwb2ludCl7dmFyIGlkPW51bGw7dmFyIGdlb21ldHJ5PXBv aW50Lmdlb21ldHJ5P3BvaW50Lmdlb21ldHJ5OnBvaW50O2lmKHRoaXMuaW50ZXJu YWxQcm9qZWN0aW9uJiZ0aGlzLmV4dGVybmFsUHJvamVjdGlvbil7Z2VvbWV0cnk9 Z2VvbWV0cnkuY2xvbmUoKTtnZW9tZXRyeS50cmFuc2Zvcm0odGhpcy5pbnRlcm5h bFByb2plY3Rpb24sdGhpcy5leHRlcm5hbFByb2plY3Rpb24pO30KdmFyIGFscmVh ZHlfZXhpc3RzPWZhbHNlO2lmKHBvaW50Lm9zbV9pZCl7aWQ9cG9pbnQub3NtX2lk O2lmKHRoaXMuY3JlYXRlZF9ub2Rlc1tpZF0pe2FscmVhZHlfZXhpc3RzPXRydWU7 fX1lbHNle2lkPS10aGlzLm9zbV9pZDt0aGlzLm9zbV9pZCsrO30KaWYoYWxyZWFk eV9leGlzdHMpe25vZGU9dGhpcy5jcmVhdGVkX25vZGVzW2lkXTt9ZWxzZXt2YXIg bm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROUyhudWxsLCJub2RlIik7fQp0aGlzLmNy ZWF0ZWRfbm9kZXNbaWRdPW5vZGU7bm9kZS5zZXRBdHRyaWJ1dGUoImlkIixpZCk7 bm9kZS5zZXRBdHRyaWJ1dGUoImxvbiIsZ2VvbWV0cnkueCk7bm9kZS5zZXRBdHRy aWJ1dGUoImxhdCIsZ2VvbWV0cnkueSk7aWYocG9pbnQuYXR0cmlidXRlcyl7dGhp cy5zZXJpYWxpemVUYWdzKHBvaW50LG5vZGUpO30KdGhpcy5zZXRTdGF0ZShwb2lu dCxub2RlKTtyZXR1cm4gYWxyZWFkeV9leGlzdHM/W106W25vZGVdO30sbGluZXN0 cmluZzpmdW5jdGlvbihmZWF0dXJlKXt2YXIgaWQ7dmFyIG5vZGVzPVtdO3ZhciBn ZW9tZXRyeT1mZWF0dXJlLmdlb21ldHJ5O2lmKGZlYXR1cmUub3NtX2lkKXtpZD1m ZWF0dXJlLm9zbV9pZDt9ZWxzZXtpZD0tdGhpcy5vc21faWQ7dGhpcy5vc21faWQr Kzt9CnZhciB3YXk9dGhpcy5jcmVhdGVFbGVtZW50TlMobnVsbCwid2F5Iik7d2F5 LnNldEF0dHJpYnV0ZSgiaWQiLGlkKTtmb3IodmFyIGk9MDtpPGdlb21ldHJ5LmNv bXBvbmVudHMubGVuZ3RoO2krKyl7dmFyIG5vZGU9dGhpcy5jcmVhdGVYTUxbJ3Bv aW50J10uYXBwbHkodGhpcyxbZ2VvbWV0cnkuY29tcG9uZW50c1tpXV0pO2lmKG5v ZGUubGVuZ3RoKXtub2RlPW5vZGVbMF07dmFyIG5vZGVfcmVmPW5vZGUuZ2V0QXR0 cmlidXRlKCJpZCIpO25vZGVzLnB1c2gobm9kZSk7fWVsc2V7bm9kZV9yZWY9Z2Vv bWV0cnkuY29tcG9uZW50c1tpXS5vc21faWQ7bm9kZT10aGlzLmNyZWF0ZWRfbm9k ZXNbbm9kZV9yZWZdO30KdGhpcy5zZXRTdGF0ZShmZWF0dXJlLG5vZGUpO3ZhciBu ZF9kb209dGhpcy5jcmVhdGVFbGVtZW50TlMobnVsbCwibmQiKTtuZF9kb20uc2V0 QXR0cmlidXRlKCJyZWYiLG5vZGVfcmVmKTt3YXkuYXBwZW5kQ2hpbGQobmRfZG9t KTt9CnRoaXMuc2VyaWFsaXplVGFncyhmZWF0dXJlLHdheSk7bm9kZXMucHVzaCh3 YXkpO3JldHVybiBub2Rlczt9LHBvbHlnb246ZnVuY3Rpb24oZmVhdHVyZSl7dmFy IGF0dHJzPU9wZW5MYXllcnMuVXRpbC5leHRlbmQoeydhcmVhJzoneWVzJ30sZmVh dHVyZS5hdHRyaWJ1dGVzKTt2YXIgZmVhdD1uZXcgT3BlbkxheWVycy5GZWF0dXJl LlZlY3RvcihmZWF0dXJlLmdlb21ldHJ5LmNvbXBvbmVudHNbMF0sYXR0cnMpO2Zl YXQub3NtX2lkPWZlYXR1cmUub3NtX2lkO3JldHVybiB0aGlzLmNyZWF0ZVhNTFsn bGluZXN0cmluZyddLmFwcGx5KHRoaXMsW2ZlYXRdKTt9fSxzZXJpYWxpemVUYWdz OmZ1bmN0aW9uKGZlYXR1cmUsbm9kZSl7Zm9yKHZhciBrZXkgaW4gZmVhdHVyZS5h dHRyaWJ1dGVzKXt2YXIgdGFnPXRoaXMuY3JlYXRlRWxlbWVudE5TKG51bGwsInRh ZyIpO3RhZy5zZXRBdHRyaWJ1dGUoImsiLGtleSk7dGFnLnNldEF0dHJpYnV0ZSgi diIsZmVhdHVyZS5hdHRyaWJ1dGVzW2tleV0pO25vZGUuYXBwZW5kQ2hpbGQodGFn KTt9fSxzZXRTdGF0ZTpmdW5jdGlvbihmZWF0dXJlLG5vZGUpe2lmKGZlYXR1cmUu c3RhdGUpe3ZhciBzdGF0ZT1udWxsO3N3aXRjaChmZWF0dXJlLnN0YXRlKXtjYXNl IE9wZW5MYXllcnMuU3RhdGUuVVBEQVRFOnN0YXRlPSJtb2RpZnkiO2Nhc2UgT3Bl bkxheWVycy5TdGF0ZS5ERUxFVEU6c3RhdGU9ImRlbGV0ZSI7fQppZihzdGF0ZSl7 bm9kZS5zZXRBdHRyaWJ1dGUoImFjdGlvbiIsc3RhdGUpO319fSxDTEFTU19OQU1F OiJPcGVuTGF5ZXJzLkZvcm1hdC5PU00ifSk7T3BlbkxheWVycy5IYW5kbGVyPU9w ZW5MYXllcnMuQ2xhc3Moe2lkOm51bGwsY29udHJvbDpudWxsLG1hcDpudWxsLGtl eU1hc2s6bnVsbCxhY3RpdmU6ZmFsc2UsZXZ0Om51bGwsaW5pdGlhbGl6ZTpmdW5j dGlvbihjb250cm9sLGNhbGxiYWNrcyxvcHRpb25zKXtPcGVuTGF5ZXJzLlV0aWwu ZXh0ZW5kKHRoaXMsb3B0aW9ucyk7dGhpcy5jb250cm9sPWNvbnRyb2w7dGhpcy5j YWxsYmFja3M9Y2FsbGJhY2tzO3ZhciBtYXA9dGhpcy5tYXB8fGNvbnRyb2wubWFw O2lmKG1hcCl7dGhpcy5zZXRNYXAobWFwKTt9CnRoaXMuaWQ9T3BlbkxheWVycy5V dGlsLmNyZWF0ZVVuaXF1ZUlEKHRoaXMuQ0xBU1NfTkFNRSsiXyIpO30sc2V0TWFw OmZ1bmN0aW9uKG1hcCl7dGhpcy5tYXA9bWFwO30sY2hlY2tNb2RpZmllcnM6ZnVu Y3Rpb24oZXZ0KXtpZih0aGlzLmtleU1hc2s9PW51bGwpe3JldHVybiB0cnVlO30K dmFyIGtleU1vZGlmaWVycz0oZXZ0LnNoaWZ0S2V5P09wZW5MYXllcnMuSGFuZGxl ci5NT0RfU0hJRlQ6MCl8KGV2dC5jdHJsS2V5P09wZW5MYXllcnMuSGFuZGxlci5N T0RfQ1RSTDowKXwoZXZ0LmFsdEtleT9PcGVuTGF5ZXJzLkhhbmRsZXIuTU9EX0FM VDowKTtyZXR1cm4oa2V5TW9kaWZpZXJzPT10aGlzLmtleU1hc2spO30sYWN0aXZh dGU6ZnVuY3Rpb24oKXtpZih0aGlzLmFjdGl2ZSl7cmV0dXJuIGZhbHNlO30KdmFy IGV2ZW50cz1PcGVuTGF5ZXJzLkV2ZW50cy5wcm90b3R5cGUuQlJPV1NFUl9FVkVO VFM7Zm9yKHZhciBpPTAsbGVuPWV2ZW50cy5sZW5ndGg7aTxsZW47aSsrKXtpZih0 aGlzW2V2ZW50c1tpXV0pe3RoaXMucmVnaXN0ZXIoZXZlbnRzW2ldLHRoaXNbZXZl bnRzW2ldXSk7fX0KdGhpcy5hY3RpdmU9dHJ1ZTtyZXR1cm4gdHJ1ZTt9LGRlYWN0 aXZhdGU6ZnVuY3Rpb24oKXtpZighdGhpcy5hY3RpdmUpe3JldHVybiBmYWxzZTt9 CnZhciBldmVudHM9T3BlbkxheWVycy5FdmVudHMucHJvdG90eXBlLkJST1dTRVJf RVZFTlRTO2Zvcih2YXIgaT0wLGxlbj1ldmVudHMubGVuZ3RoO2k8bGVuO2krKyl7 aWYodGhpc1tldmVudHNbaV1dKXt0aGlzLnVucmVnaXN0ZXIoZXZlbnRzW2ldLHRo aXNbZXZlbnRzW2ldXSk7fX0KdGhpcy5hY3RpdmU9ZmFsc2U7cmV0dXJuIHRydWU7 fSxjYWxsYmFjazpmdW5jdGlvbihuYW1lLGFyZ3Mpe2lmKG5hbWUmJnRoaXMuY2Fs bGJhY2tzW25hbWVdKXt0aGlzLmNhbGxiYWNrc1tuYW1lXS5hcHBseSh0aGlzLmNv bnRyb2wsYXJncyk7fX0scmVnaXN0ZXI6ZnVuY3Rpb24obmFtZSxtZXRob2Qpe3Ro aXMubWFwLmV2ZW50cy5yZWdpc3RlclByaW9yaXR5KG5hbWUsdGhpcyxtZXRob2Qp O3RoaXMubWFwLmV2ZW50cy5yZWdpc3RlclByaW9yaXR5KG5hbWUsdGhpcyx0aGlz LnNldEV2ZW50KTt9LHVucmVnaXN0ZXI6ZnVuY3Rpb24obmFtZSxtZXRob2Qpe3Ro aXMubWFwLmV2ZW50cy51bnJlZ2lzdGVyKG5hbWUsdGhpcyxtZXRob2QpO3RoaXMu bWFwLmV2ZW50cy51bnJlZ2lzdGVyKG5hbWUsdGhpcyx0aGlzLnNldEV2ZW50KTt9 LHNldEV2ZW50OmZ1bmN0aW9uKGV2dCl7dGhpcy5ldnQ9ZXZ0O3JldHVybiB0cnVl O30sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZGVhY3RpdmF0ZSgpO3RoaXMuY29u dHJvbD10aGlzLm1hcD1udWxsO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5IYW5k bGVyIn0pO09wZW5MYXllcnMuSGFuZGxlci5NT0RfTk9ORT0wO09wZW5MYXllcnMu SGFuZGxlci5NT0RfU0hJRlQ9MTtPcGVuTGF5ZXJzLkhhbmRsZXIuTU9EX0NUUkw9 MjtPcGVuTGF5ZXJzLkhhbmRsZXIuTU9EX0FMVD00O09wZW5MYXllcnMuSGFuZGxl ci5EcmFnPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5IYW5kbGVyLHtzdGFy dGVkOmZhbHNlLHN0b3BEb3duOnRydWUsZHJhZ2dpbmc6ZmFsc2UsdG91Y2g6ZmFs c2UsbGFzdDpudWxsLHN0YXJ0Om51bGwsbGFzdE1vdmVFdnQ6bnVsbCxvbGRPbnNl bGVjdHN0YXJ0Om51bGwsaW50ZXJ2YWw6MCx0aW1lb3V0SWQ6bnVsbCxkb2N1bWVu dERyYWc6ZmFsc2UsZG9jdW1lbnRFdmVudHM6bnVsbCxpbml0aWFsaXplOmZ1bmN0 aW9uKGNvbnRyb2wsY2FsbGJhY2tzLG9wdGlvbnMpe09wZW5MYXllcnMuSGFuZGxl ci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYo dGhpcy5kb2N1bWVudERyYWc9PT10cnVlKXt2YXIgbWU9dGhpczt0aGlzLl9kb2NN b3ZlPWZ1bmN0aW9uKGV2dCl7bWUubW91c2Vtb3ZlKHt4eTp7eDpldnQuY2xpZW50 WCx5OmV2dC5jbGllbnRZfSxlbGVtZW50OmRvY3VtZW50fSk7fTt0aGlzLl9kb2NV cD1mdW5jdGlvbihldnQpe21lLm1vdXNldXAoe3h5Ont4OmV2dC5jbGllbnRYLHk6 ZXZ0LmNsaWVudFl9fSk7fTt9fSxkcmFnc3RhcnQ6ZnVuY3Rpb24oZXZ0KXt2YXIg cHJvcGFnYXRlPXRydWU7dGhpcy5kcmFnZ2luZz1mYWxzZTtpZih0aGlzLmNoZWNr TW9kaWZpZXJzKGV2dCkmJihPcGVuTGF5ZXJzLkV2ZW50LmlzTGVmdENsaWNrKGV2 dCl8fE9wZW5MYXllcnMuRXZlbnQuaXNTaW5nbGVUb3VjaChldnQpKSl7dGhpcy5z dGFydGVkPXRydWU7dGhpcy5zdGFydD1ldnQueHk7dGhpcy5sYXN0PWV2dC54eTtP cGVuTGF5ZXJzLkVsZW1lbnQuYWRkQ2xhc3ModGhpcy5tYXAudmlld1BvcnREaXYs Im9sRHJhZ0Rvd24iKTt0aGlzLmRvd24oZXZ0KTt0aGlzLmNhbGxiYWNrKCJkb3du IixbZXZ0Lnh5XSk7T3BlbkxheWVycy5FdmVudC5zdG9wKGV2dCk7aWYoIXRoaXMu b2xkT25zZWxlY3RzdGFydCl7dGhpcy5vbGRPbnNlbGVjdHN0YXJ0PWRvY3VtZW50 Lm9uc2VsZWN0c3RhcnQ/ZG9jdW1lbnQub25zZWxlY3RzdGFydDpPcGVuTGF5ZXJz LkZ1bmN0aW9uLlRydWU7fQpkb2N1bWVudC5vbnNlbGVjdHN0YXJ0PU9wZW5MYXll cnMuRnVuY3Rpb24uRmFsc2U7cHJvcGFnYXRlPSF0aGlzLnN0b3BEb3duO31lbHNl e3RoaXMuc3RhcnRlZD1mYWxzZTt0aGlzLnN0YXJ0PW51bGw7dGhpcy5sYXN0PW51 bGw7fQpyZXR1cm4gcHJvcGFnYXRlO30sZHJhZ21vdmU6ZnVuY3Rpb24oZXZ0KXt0 aGlzLmxhc3RNb3ZlRXZ0PWV2dDtpZih0aGlzLnN0YXJ0ZWQmJiF0aGlzLnRpbWVv dXRJZCYmKGV2dC54eS54IT10aGlzLmxhc3QueHx8ZXZ0Lnh5LnkhPXRoaXMubGFz dC55KSl7aWYodGhpcy5kb2N1bWVudERyYWc9PT10cnVlJiZ0aGlzLmRvY3VtZW50 RXZlbnRzKXtpZihldnQuZWxlbWVudD09PWRvY3VtZW50KXt0aGlzLmFkanVzdFhZ KGV2dCk7dGhpcy5zZXRFdmVudChldnQpO31lbHNle3RoaXMucmVtb3ZlRG9jdW1l bnRFdmVudHMoKTt9fQppZih0aGlzLmludGVydmFsPjApe3RoaXMudGltZW91dElk PXNldFRpbWVvdXQoT3BlbkxheWVycy5GdW5jdGlvbi5iaW5kKHRoaXMucmVtb3Zl VGltZW91dCx0aGlzKSx0aGlzLmludGVydmFsKTt9CnRoaXMuZHJhZ2dpbmc9dHJ1 ZTt0aGlzLm1vdmUoZXZ0KTt0aGlzLmNhbGxiYWNrKCJtb3ZlIixbZXZ0Lnh5XSk7 aWYoIXRoaXMub2xkT25zZWxlY3RzdGFydCl7dGhpcy5vbGRPbnNlbGVjdHN0YXJ0 PWRvY3VtZW50Lm9uc2VsZWN0c3RhcnQ7ZG9jdW1lbnQub25zZWxlY3RzdGFydD1P cGVuTGF5ZXJzLkZ1bmN0aW9uLkZhbHNlO30KdGhpcy5sYXN0PWV2dC54eTt9CnJl dHVybiB0cnVlO30sZHJhZ2VuZDpmdW5jdGlvbihldnQpe2lmKHRoaXMuc3RhcnRl ZCl7aWYodGhpcy5kb2N1bWVudERyYWc9PT10cnVlJiZ0aGlzLmRvY3VtZW50RXZl bnRzKXt0aGlzLmFkanVzdFhZKGV2dCk7dGhpcy5yZW1vdmVEb2N1bWVudEV2ZW50 cygpO30KdmFyIGRyYWdnZWQ9KHRoaXMuc3RhcnQhPXRoaXMubGFzdCk7dGhpcy5z dGFydGVkPWZhbHNlO3RoaXMuZHJhZ2dpbmc9ZmFsc2U7T3BlbkxheWVycy5FbGVt ZW50LnJlbW92ZUNsYXNzKHRoaXMubWFwLnZpZXdQb3J0RGl2LCJvbERyYWdEb3du Iik7dGhpcy51cChldnQpO3RoaXMuY2FsbGJhY2soInVwIixbZXZ0Lnh5XSk7aWYo ZHJhZ2dlZCl7dGhpcy5jYWxsYmFjaygiZG9uZSIsW2V2dC54eV0pO30KZG9jdW1l bnQub25zZWxlY3RzdGFydD10aGlzLm9sZE9uc2VsZWN0c3RhcnQ7fQpyZXR1cm4g dHJ1ZTt9LGRvd246ZnVuY3Rpb24oZXZ0KXt9LG1vdmU6ZnVuY3Rpb24oZXZ0KXt9 LHVwOmZ1bmN0aW9uKGV2dCl7fSxvdXQ6ZnVuY3Rpb24oZXZ0KXt9LG1vdXNlZG93 bjpmdW5jdGlvbihldnQpe3JldHVybiB0aGlzLmRyYWdzdGFydChldnQpO30sdG91 Y2hzdGFydDpmdW5jdGlvbihldnQpe2lmKCF0aGlzLnRvdWNoKXt0aGlzLnRvdWNo PXRydWU7dGhpcy5tYXAuZXZlbnRzLnVuKHttb3VzZWRvd246dGhpcy5tb3VzZWRv d24sbW91c2V1cDp0aGlzLm1vdXNldXAsbW91c2Vtb3ZlOnRoaXMubW91c2Vtb3Zl LGNsaWNrOnRoaXMuY2xpY2ssc2NvcGU6dGhpc30pO30KcmV0dXJuIHRoaXMuZHJh Z3N0YXJ0KGV2dCk7fSxtb3VzZW1vdmU6ZnVuY3Rpb24oZXZ0KXtyZXR1cm4gdGhp cy5kcmFnbW92ZShldnQpO30sdG91Y2htb3ZlOmZ1bmN0aW9uKGV2dCl7cmV0dXJu IHRoaXMuZHJhZ21vdmUoZXZ0KTt9LHJlbW92ZVRpbWVvdXQ6ZnVuY3Rpb24oKXt0 aGlzLnRpbWVvdXRJZD1udWxsO2lmKHRoaXMuZHJhZ2dpbmcpe3RoaXMubW91c2Vt b3ZlKHRoaXMubGFzdE1vdmVFdnQpO319LG1vdXNldXA6ZnVuY3Rpb24oZXZ0KXty ZXR1cm4gdGhpcy5kcmFnZW5kKGV2dCk7fSx0b3VjaGVuZDpmdW5jdGlvbihldnQp e2V2dC54eT10aGlzLmxhc3Q7cmV0dXJuIHRoaXMuZHJhZ2VuZChldnQpO30sbW91 c2VvdXQ6ZnVuY3Rpb24oZXZ0KXtpZih0aGlzLnN0YXJ0ZWQmJk9wZW5MYXllcnMu VXRpbC5tb3VzZUxlZnQoZXZ0LHRoaXMubWFwLmV2ZW50c0Rpdikpe2lmKHRoaXMu ZG9jdW1lbnREcmFnPT09dHJ1ZSl7dGhpcy5hZGREb2N1bWVudEV2ZW50cygpO31l bHNle3ZhciBkcmFnZ2VkPSh0aGlzLnN0YXJ0IT10aGlzLmxhc3QpO3RoaXMuc3Rh cnRlZD1mYWxzZTt0aGlzLmRyYWdnaW5nPWZhbHNlO09wZW5MYXllcnMuRWxlbWVu dC5yZW1vdmVDbGFzcyh0aGlzLm1hcC52aWV3UG9ydERpdiwib2xEcmFnRG93biIp O3RoaXMub3V0KGV2dCk7dGhpcy5jYWxsYmFjaygib3V0IixbXSk7aWYoZHJhZ2dl ZCl7dGhpcy5jYWxsYmFjaygiZG9uZSIsW2V2dC54eV0pO30KaWYoZG9jdW1lbnQu b25zZWxlY3RzdGFydCl7ZG9jdW1lbnQub25zZWxlY3RzdGFydD10aGlzLm9sZE9u c2VsZWN0c3RhcnQ7fX19CnJldHVybiB0cnVlO30sY2xpY2s6ZnVuY3Rpb24oZXZ0 KXtyZXR1cm4odGhpcy5zdGFydD09dGhpcy5sYXN0KTt9LGFjdGl2YXRlOmZ1bmN0 aW9uKCl7dmFyIGFjdGl2YXRlZD1mYWxzZTtpZihPcGVuTGF5ZXJzLkhhbmRsZXIu cHJvdG90eXBlLmFjdGl2YXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dGhpcy5k cmFnZ2luZz1mYWxzZTthY3RpdmF0ZWQ9dHJ1ZTt9CnJldHVybiBhY3RpdmF0ZWQ7 fSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7dmFyIGRlYWN0aXZhdGVkPWZhbHNlO2lm KE9wZW5MYXllcnMuSGFuZGxlci5wcm90b3R5cGUuZGVhY3RpdmF0ZS5hcHBseSh0 aGlzLGFyZ3VtZW50cykpe3RoaXMudG91Y2g9ZmFsc2U7dGhpcy5zdGFydGVkPWZh bHNlO3RoaXMuZHJhZ2dpbmc9ZmFsc2U7dGhpcy5zdGFydD1udWxsO3RoaXMubGFz dD1udWxsO2RlYWN0aXZhdGVkPXRydWU7T3BlbkxheWVycy5FbGVtZW50LnJlbW92 ZUNsYXNzKHRoaXMubWFwLnZpZXdQb3J0RGl2LCJvbERyYWdEb3duIik7fQpyZXR1 cm4gZGVhY3RpdmF0ZWQ7fSxhZGp1c3RYWTpmdW5jdGlvbihldnQpe3ZhciBwb3M9 T3BlbkxheWVycy5VdGlsLnBhZ2VQb3NpdGlvbih0aGlzLm1hcC52aWV3UG9ydERp dik7ZXZ0Lnh5LngtPXBvc1swXTtldnQueHkueS09cG9zWzFdO30sYWRkRG9jdW1l bnRFdmVudHM6ZnVuY3Rpb24oKXtPcGVuTGF5ZXJzLkVsZW1lbnQuYWRkQ2xhc3Mo ZG9jdW1lbnQuYm9keSwib2xEcmFnRG93biIpO3RoaXMuZG9jdW1lbnRFdmVudHM9 dHJ1ZTtPcGVuTGF5ZXJzLkV2ZW50Lm9ic2VydmUoZG9jdW1lbnQsIm1vdXNlbW92 ZSIsdGhpcy5fZG9jTW92ZSk7T3BlbkxheWVycy5FdmVudC5vYnNlcnZlKGRvY3Vt ZW50LCJtb3VzZXVwIix0aGlzLl9kb2NVcCk7fSxyZW1vdmVEb2N1bWVudEV2ZW50 czpmdW5jdGlvbigpe09wZW5MYXllcnMuRWxlbWVudC5yZW1vdmVDbGFzcyhkb2N1 bWVudC5ib2R5LCJvbERyYWdEb3duIik7dGhpcy5kb2N1bWVudEV2ZW50cz1mYWxz ZTtPcGVuTGF5ZXJzLkV2ZW50LnN0b3BPYnNlcnZpbmcoZG9jdW1lbnQsIm1vdXNl bW92ZSIsdGhpcy5fZG9jTW92ZSk7T3BlbkxheWVycy5FdmVudC5zdG9wT2JzZXJ2 aW5nKGRvY3VtZW50LCJtb3VzZXVwIix0aGlzLl9kb2NVcCk7fSxDTEFTU19OQU1F OiJPcGVuTGF5ZXJzLkhhbmRsZXIuRHJhZyJ9KTtPcGVuTGF5ZXJzLkhhbmRsZXIu RmVhdHVyZT1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuSGFuZGxlcix7RVZF TlRNQVA6eydjbGljayc6eydpbic6J2NsaWNrJywnb3V0JzonY2xpY2tvdXQnfSwn bW91c2Vtb3ZlJzp7J2luJzonb3ZlcicsJ291dCc6J291dCd9LCdkYmxjbGljayc6 eydpbic6J2RibGNsaWNrJywnb3V0JzpudWxsfSwnbW91c2Vkb3duJzp7J2luJzpu dWxsLCdvdXQnOm51bGx9LCdtb3VzZXVwJzp7J2luJzpudWxsLCdvdXQnOm51bGx9 LCd0b3VjaHN0YXJ0Jzp7J2luJzonY2xpY2snLCdvdXQnOidjbGlja291dCd9fSxm ZWF0dXJlOm51bGwsbGFzdEZlYXR1cmU6bnVsbCxkb3duOm51bGwsdXA6bnVsbCx0 b3VjaDpmYWxzZSxjbGlja1RvbGVyYW5jZTo0LGdlb21ldHJ5VHlwZXM6bnVsbCxz dG9wQ2xpY2s6dHJ1ZSxzdG9wRG93bjp0cnVlLHN0b3BVcDpmYWxzZSxpbml0aWFs aXplOmZ1bmN0aW9uKGNvbnRyb2wsbGF5ZXIsY2FsbGJhY2tzLG9wdGlvbnMpe09w ZW5MYXllcnMuSGFuZGxlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlz LFtjb250cm9sLGNhbGxiYWNrcyxvcHRpb25zXSk7dGhpcy5sYXllcj1sYXllcjt9 LHRvdWNoc3RhcnQ6ZnVuY3Rpb24oZXZ0KXtpZighdGhpcy50b3VjaCl7dGhpcy50 b3VjaD10cnVlO3RoaXMubWFwLmV2ZW50cy51bih7bW91c2Vkb3duOnRoaXMubW91 c2Vkb3duLG1vdXNldXA6dGhpcy5tb3VzZXVwLG1vdXNlbW92ZTp0aGlzLm1vdXNl bW92ZSxjbGljazp0aGlzLmNsaWNrLGRibGNsaWNrOnRoaXMuZGJsY2xpY2ssc2Nv cGU6dGhpc30pO30KcmV0dXJuIE9wZW5MYXllcnMuRXZlbnQuaXNNdWx0aVRvdWNo KGV2dCk/dHJ1ZTp0aGlzLm1vdXNlZG93bihldnQpO30sdG91Y2htb3ZlOmZ1bmN0 aW9uKGV2dCl7T3BlbkxheWVycy5FdmVudC5zdG9wKGV2dCk7fSxtb3VzZWRvd246 ZnVuY3Rpb24oZXZ0KXt0aGlzLmRvd249ZXZ0Lnh5O3JldHVybiB0aGlzLmhhbmRs ZShldnQpPyF0aGlzLnN0b3BEb3duOnRydWU7fSxtb3VzZXVwOmZ1bmN0aW9uKGV2 dCl7dGhpcy51cD1ldnQueHk7cmV0dXJuIHRoaXMuaGFuZGxlKGV2dCk/IXRoaXMu c3RvcFVwOnRydWU7fSxjbGljazpmdW5jdGlvbihldnQpe3JldHVybiB0aGlzLmhh bmRsZShldnQpPyF0aGlzLnN0b3BDbGljazp0cnVlO30sbW91c2Vtb3ZlOmZ1bmN0 aW9uKGV2dCl7aWYoIXRoaXMuY2FsbGJhY2tzWydvdmVyJ10mJiF0aGlzLmNhbGxi YWNrc1snb3V0J10pe3JldHVybiB0cnVlO30KdGhpcy5oYW5kbGUoZXZ0KTtyZXR1 cm4gdHJ1ZTt9LGRibGNsaWNrOmZ1bmN0aW9uKGV2dCl7cmV0dXJuIXRoaXMuaGFu ZGxlKGV2dCk7fSxnZW9tZXRyeVR5cGVNYXRjaGVzOmZ1bmN0aW9uKGZlYXR1cmUp e3JldHVybiB0aGlzLmdlb21ldHJ5VHlwZXM9PW51bGx8fE9wZW5MYXllcnMuVXRp bC5pbmRleE9mKHRoaXMuZ2VvbWV0cnlUeXBlcyxmZWF0dXJlLmdlb21ldHJ5LkNM QVNTX05BTUUpPi0xO30saGFuZGxlOmZ1bmN0aW9uKGV2dCl7aWYodGhpcy5mZWF0 dXJlJiYhdGhpcy5mZWF0dXJlLmxheWVyKXt0aGlzLmZlYXR1cmU9bnVsbDt9CnZh ciB0eXBlPWV2dC50eXBlO3ZhciBoYW5kbGVkPWZhbHNlO3ZhciBwcmV2aW91c2x5 SW49ISEodGhpcy5mZWF0dXJlKTt2YXIgY2xpY2s9KHR5cGU9PSJjbGljayJ8fHR5 cGU9PSJkYmxjbGljayJ8fHR5cGU9PSJ0b3VjaHN0YXJ0Iik7dGhpcy5mZWF0dXJl PXRoaXMubGF5ZXIuZ2V0RmVhdHVyZUZyb21FdmVudChldnQpO2lmKHRoaXMuZmVh dHVyZSYmIXRoaXMuZmVhdHVyZS5sYXllcil7dGhpcy5mZWF0dXJlPW51bGw7fQpp Zih0aGlzLmxhc3RGZWF0dXJlJiYhdGhpcy5sYXN0RmVhdHVyZS5sYXllcil7dGhp cy5sYXN0RmVhdHVyZT1udWxsO30KaWYodGhpcy5mZWF0dXJlKXtpZih0eXBlPT09 InRvdWNoc3RhcnQiKXtPcGVuTGF5ZXJzLkV2ZW50LnN0b3AoZXZ0KTt9CnZhciBp bk5ldz0odGhpcy5mZWF0dXJlIT10aGlzLmxhc3RGZWF0dXJlKTtpZih0aGlzLmdl b21ldHJ5VHlwZU1hdGNoZXModGhpcy5mZWF0dXJlKSl7aWYocHJldmlvdXNseUlu JiZpbk5ldyl7aWYodGhpcy5sYXN0RmVhdHVyZSl7dGhpcy50cmlnZ2VyQ2FsbGJh Y2sodHlwZSwnb3V0JyxbdGhpcy5sYXN0RmVhdHVyZV0pO30KdGhpcy50cmlnZ2Vy Q2FsbGJhY2sodHlwZSwnaW4nLFt0aGlzLmZlYXR1cmVdKTt9ZWxzZSBpZighcHJl dmlvdXNseUlufHxjbGljayl7dGhpcy50cmlnZ2VyQ2FsbGJhY2sodHlwZSwnaW4n LFt0aGlzLmZlYXR1cmVdKTt9CnRoaXMubGFzdEZlYXR1cmU9dGhpcy5mZWF0dXJl O2hhbmRsZWQ9dHJ1ZTt9ZWxzZXtpZih0aGlzLmxhc3RGZWF0dXJlJiYocHJldmlv dXNseUluJiZpbk5ld3x8Y2xpY2spKXt0aGlzLnRyaWdnZXJDYWxsYmFjayh0eXBl LCdvdXQnLFt0aGlzLmxhc3RGZWF0dXJlXSk7fQp0aGlzLmZlYXR1cmU9bnVsbDt9 fWVsc2V7aWYodGhpcy5sYXN0RmVhdHVyZSYmKHByZXZpb3VzbHlJbnx8Y2xpY2sp KXt0aGlzLnRyaWdnZXJDYWxsYmFjayh0eXBlLCdvdXQnLFt0aGlzLmxhc3RGZWF0 dXJlXSk7fX0KcmV0dXJuIGhhbmRsZWQ7fSx0cmlnZ2VyQ2FsbGJhY2s6ZnVuY3Rp b24odHlwZSxtb2RlLGFyZ3Mpe3ZhciBrZXk9dGhpcy5FVkVOVE1BUFt0eXBlXVtt b2RlXTtpZihrZXkpe2lmKHR5cGU9PSdjbGljaycmJnRoaXMudXAmJnRoaXMuZG93 bil7dmFyIGRweD1NYXRoLnNxcnQoTWF0aC5wb3codGhpcy51cC54LXRoaXMuZG93 bi54LDIpKwpNYXRoLnBvdyh0aGlzLnVwLnktdGhpcy5kb3duLnksMikpO2lmKGRw eDw9dGhpcy5jbGlja1RvbGVyYW5jZSl7dGhpcy5jYWxsYmFjayhrZXksYXJncyk7 fX1lbHNle3RoaXMuY2FsbGJhY2soa2V5LGFyZ3MpO319fSxhY3RpdmF0ZTpmdW5j dGlvbigpe3ZhciBhY3RpdmF0ZWQ9ZmFsc2U7aWYoT3BlbkxheWVycy5IYW5kbGVy LnByb3RvdHlwZS5hY3RpdmF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3RoaXMu bW92ZUxheWVyVG9Ub3AoKTt0aGlzLm1hcC5ldmVudHMub24oeyJyZW1vdmVsYXll ciI6dGhpcy5oYW5kbGVNYXBFdmVudHMsImNoYW5nZWxheWVyIjp0aGlzLmhhbmRs ZU1hcEV2ZW50cyxzY29wZTp0aGlzfSk7YWN0aXZhdGVkPXRydWU7fQpyZXR1cm4g YWN0aXZhdGVkO30sZGVhY3RpdmF0ZTpmdW5jdGlvbigpe3ZhciBkZWFjdGl2YXRl ZD1mYWxzZTtpZihPcGVuTGF5ZXJzLkhhbmRsZXIucHJvdG90eXBlLmRlYWN0aXZh dGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt0aGlzLm1vdmVMYXllckJhY2soKTt0 aGlzLmZlYXR1cmU9bnVsbDt0aGlzLmxhc3RGZWF0dXJlPW51bGw7dGhpcy5kb3du PW51bGw7dGhpcy51cD1udWxsO3RoaXMudG91Y2g9ZmFsc2U7dGhpcy5tYXAuZXZl bnRzLnVuKHsicmVtb3ZlbGF5ZXIiOnRoaXMuaGFuZGxlTWFwRXZlbnRzLCJjaGFu Z2VsYXllciI6dGhpcy5oYW5kbGVNYXBFdmVudHMsc2NvcGU6dGhpc30pO2RlYWN0 aXZhdGVkPXRydWU7fQpyZXR1cm4gZGVhY3RpdmF0ZWQ7fSxoYW5kbGVNYXBFdmVu dHM6ZnVuY3Rpb24oZXZ0KXtpZihldnQudHlwZT09InJlbW92ZWxheWVyInx8ZXZ0 LnByb3BlcnR5PT0ib3JkZXIiKXt0aGlzLm1vdmVMYXllclRvVG9wKCk7fX0sbW92 ZUxheWVyVG9Ub3A6ZnVuY3Rpb24oKXt2YXIgaW5kZXg9TWF0aC5tYXgodGhpcy5t YXAuWl9JTkRFWF9CQVNFWydGZWF0dXJlJ10tMSx0aGlzLmxheWVyLmdldFpJbmRl eCgpKSsxO3RoaXMubGF5ZXIuc2V0WkluZGV4KGluZGV4KTt9LG1vdmVMYXllckJh Y2s6ZnVuY3Rpb24oKXt2YXIgaW5kZXg9dGhpcy5sYXllci5nZXRaSW5kZXgoKS0x O2lmKGluZGV4Pj10aGlzLm1hcC5aX0lOREVYX0JBU0VbJ0ZlYXR1cmUnXSl7dGhp cy5sYXllci5zZXRaSW5kZXgoaW5kZXgpO31lbHNle3RoaXMubWFwLnNldExheWVy WkluZGV4KHRoaXMubGF5ZXIsdGhpcy5tYXAuZ2V0TGF5ZXJJbmRleCh0aGlzLmxh eWVyKSk7fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5IYW5kbGVyLkZlYXR1cmUi fSk7T3BlbkxheWVycy5Db250cm9sLkRyYWdGZWF0dXJlPU9wZW5MYXllcnMuQ2xh c3MoT3BlbkxheWVycy5Db250cm9sLHtnZW9tZXRyeVR5cGVzOm51bGwsb25TdGFy dDpmdW5jdGlvbihmZWF0dXJlLHBpeGVsKXt9LG9uRHJhZzpmdW5jdGlvbihmZWF0 dXJlLHBpeGVsKXt9LG9uQ29tcGxldGU6ZnVuY3Rpb24oZmVhdHVyZSxwaXhlbCl7 fSxvbkVudGVyOmZ1bmN0aW9uKGZlYXR1cmUpe30sb25MZWF2ZTpmdW5jdGlvbihm ZWF0dXJlKXt9LGRvY3VtZW50RHJhZzpmYWxzZSxsYXllcjpudWxsLGZlYXR1cmU6 bnVsbCxkcmFnQ2FsbGJhY2tzOnt9LGZlYXR1cmVDYWxsYmFja3M6e30sbGFzdFBp eGVsOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihsYXllcixvcHRpb25zKXtPcGVu TGF5ZXJzLkNvbnRyb2wucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxb b3B0aW9uc10pO3RoaXMubGF5ZXI9bGF5ZXI7dGhpcy5oYW5kbGVycz17ZHJhZzpu ZXcgT3BlbkxheWVycy5IYW5kbGVyLkRyYWcodGhpcyxPcGVuTGF5ZXJzLlV0aWwu ZXh0ZW5kKHtkb3duOnRoaXMuZG93bkZlYXR1cmUsbW92ZTp0aGlzLm1vdmVGZWF0 dXJlLHVwOnRoaXMudXBGZWF0dXJlLG91dDp0aGlzLmNhbmNlbCxkb25lOnRoaXMu ZG9uZURyYWdnaW5nfSx0aGlzLmRyYWdDYWxsYmFja3MpLHtkb2N1bWVudERyYWc6 dGhpcy5kb2N1bWVudERyYWd9KSxmZWF0dXJlOm5ldyBPcGVuTGF5ZXJzLkhhbmRs ZXIuRmVhdHVyZSh0aGlzLHRoaXMubGF5ZXIsT3BlbkxheWVycy5VdGlsLmV4dGVu ZCh7Y2xpY2s6dGhpcy5jbGlja0ZlYXR1cmUsY2xpY2tvdXQ6dGhpcy5jbGlja291 dEZlYXR1cmUsb3Zlcjp0aGlzLm92ZXJGZWF0dXJlLG91dDp0aGlzLm91dEZlYXR1 cmV9LHRoaXMuZmVhdHVyZUNhbGxiYWNrcykse2dlb21ldHJ5VHlwZXM6dGhpcy5n ZW9tZXRyeVR5cGVzfSl9O30sY2xpY2tGZWF0dXJlOmZ1bmN0aW9uKGZlYXR1cmUp e2lmKHRoaXMuaGFuZGxlcnMuZmVhdHVyZS50b3VjaCYmIXRoaXMub3ZlciYmdGhp cy5vdmVyRmVhdHVyZShmZWF0dXJlKSl7dGhpcy5oYW5kbGVycy5kcmFnLmRyYWdz dGFydCh0aGlzLmhhbmRsZXJzLmZlYXR1cmUuZXZ0KTt0aGlzLmhhbmRsZXJzLmRy YWcuc3RvcERvd249ZmFsc2U7fX0sY2xpY2tvdXRGZWF0dXJlOmZ1bmN0aW9uKGZl YXR1cmUpe2lmKHRoaXMuaGFuZGxlcnMuZmVhdHVyZS50b3VjaCYmdGhpcy5vdmVy KXt0aGlzLm91dEZlYXR1cmUoZmVhdHVyZSk7dGhpcy5oYW5kbGVycy5kcmFnLnN0 b3BEb3duPXRydWU7fX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMubGF5ZXI9bnVs bDtPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhp cyxbXSk7fSxhY3RpdmF0ZTpmdW5jdGlvbigpe3JldHVybih0aGlzLmhhbmRsZXJz LmZlYXR1cmUuYWN0aXZhdGUoKSYmT3BlbkxheWVycy5Db250cm9sLnByb3RvdHlw ZS5hY3RpdmF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpO30sZGVhY3RpdmF0ZTpm dW5jdGlvbigpe3RoaXMuaGFuZGxlcnMuZHJhZy5kZWFjdGl2YXRlKCk7dGhpcy5o YW5kbGVycy5mZWF0dXJlLmRlYWN0aXZhdGUoKTt0aGlzLmZlYXR1cmU9bnVsbDt0 aGlzLmRyYWdnaW5nPWZhbHNlO3RoaXMubGFzdFBpeGVsPW51bGw7T3BlbkxheWVy cy5FbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMubWFwLnZpZXdQb3J0RGl2LHRoaXMu ZGlzcGxheUNsYXNzKyJPdmVyIik7cmV0dXJuIE9wZW5MYXllcnMuQ29udHJvbC5w cm90b3R5cGUuZGVhY3RpdmF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fSxvdmVy RmVhdHVyZTpmdW5jdGlvbihmZWF0dXJlKXt2YXIgYWN0aXZhdGVkPWZhbHNlO2lm KCF0aGlzLmhhbmRsZXJzLmRyYWcuZHJhZ2dpbmcpe3RoaXMuZmVhdHVyZT1mZWF0 dXJlO3RoaXMuaGFuZGxlcnMuZHJhZy5hY3RpdmF0ZSgpO2FjdGl2YXRlZD10cnVl O3RoaXMub3Zlcj10cnVlO09wZW5MYXllcnMuRWxlbWVudC5hZGRDbGFzcyh0aGlz Lm1hcC52aWV3UG9ydERpdix0aGlzLmRpc3BsYXlDbGFzcysiT3ZlciIpO3RoaXMu b25FbnRlcihmZWF0dXJlKTt9ZWxzZXtpZih0aGlzLmZlYXR1cmUuaWQ9PWZlYXR1 cmUuaWQpe3RoaXMub3Zlcj10cnVlO31lbHNle3RoaXMub3Zlcj1mYWxzZTt9fQpy ZXR1cm4gYWN0aXZhdGVkO30sZG93bkZlYXR1cmU6ZnVuY3Rpb24ocGl4ZWwpe3Ro aXMubGFzdFBpeGVsPXBpeGVsO3RoaXMub25TdGFydCh0aGlzLmZlYXR1cmUscGl4 ZWwpO30sbW92ZUZlYXR1cmU6ZnVuY3Rpb24ocGl4ZWwpe3ZhciByZXM9dGhpcy5t YXAuZ2V0UmVzb2x1dGlvbigpO3RoaXMuZmVhdHVyZS5nZW9tZXRyeS5tb3ZlKHJl cyoocGl4ZWwueC10aGlzLmxhc3RQaXhlbC54KSxyZXMqKHRoaXMubGFzdFBpeGVs LnktcGl4ZWwueSkpO3RoaXMubGF5ZXIuZHJhd0ZlYXR1cmUodGhpcy5mZWF0dXJl KTt0aGlzLmxhc3RQaXhlbD1waXhlbDt0aGlzLm9uRHJhZyh0aGlzLmZlYXR1cmUs cGl4ZWwpO30sdXBGZWF0dXJlOmZ1bmN0aW9uKHBpeGVsKXtpZighdGhpcy5vdmVy KXt0aGlzLmhhbmRsZXJzLmRyYWcuZGVhY3RpdmF0ZSgpO319LGRvbmVEcmFnZ2lu ZzpmdW5jdGlvbihwaXhlbCl7dGhpcy5vbkNvbXBsZXRlKHRoaXMuZmVhdHVyZSxw aXhlbCk7fSxvdXRGZWF0dXJlOmZ1bmN0aW9uKGZlYXR1cmUpe2lmKCF0aGlzLmhh bmRsZXJzLmRyYWcuZHJhZ2dpbmcpe3RoaXMub3Zlcj1mYWxzZTt0aGlzLmhhbmRs ZXJzLmRyYWcuZGVhY3RpdmF0ZSgpO09wZW5MYXllcnMuRWxlbWVudC5yZW1vdmVD bGFzcyh0aGlzLm1hcC52aWV3UG9ydERpdix0aGlzLmRpc3BsYXlDbGFzcysiT3Zl ciIpO3RoaXMub25MZWF2ZShmZWF0dXJlKTt0aGlzLmZlYXR1cmU9bnVsbDt9ZWxz ZXtpZih0aGlzLmZlYXR1cmUuaWQ9PWZlYXR1cmUuaWQpe3RoaXMub3Zlcj1mYWxz ZTt9fX0sY2FuY2VsOmZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVycy5kcmFnLmRlYWN0 aXZhdGUoKTt0aGlzLm92ZXI9ZmFsc2U7fSxzZXRNYXA6ZnVuY3Rpb24obWFwKXt0 aGlzLmhhbmRsZXJzLmRyYWcuc2V0TWFwKG1hcCk7dGhpcy5oYW5kbGVycy5mZWF0 dXJlLnNldE1hcChtYXApO09wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUuc2V0 TWFwLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LENMQVNTX05BTUU6Ik9wZW5MYXll cnMuQ29udHJvbC5EcmFnRmVhdHVyZSJ9KTtPcGVuTGF5ZXJzLlN0eWxlTWFwPU9w ZW5MYXllcnMuQ2xhc3Moe3N0eWxlczpudWxsLGV4dGVuZERlZmF1bHQ6dHJ1ZSxp bml0aWFsaXplOmZ1bmN0aW9uKHN0eWxlLG9wdGlvbnMpe3RoaXMuc3R5bGVzPXsi ZGVmYXVsdCI6bmV3IE9wZW5MYXllcnMuU3R5bGUoT3BlbkxheWVycy5GZWF0dXJl LlZlY3Rvci5zdHlsZVsiZGVmYXVsdCJdKSwic2VsZWN0IjpuZXcgT3BlbkxheWVy cy5TdHlsZShPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9yLnN0eWxlWyJzZWxlY3Qi XSksInRlbXBvcmFyeSI6bmV3IE9wZW5MYXllcnMuU3R5bGUoT3BlbkxheWVycy5G ZWF0dXJlLlZlY3Rvci5zdHlsZVsidGVtcG9yYXJ5Il0pLCJkZWxldGUiOm5ldyBP cGVuTGF5ZXJzLlN0eWxlKE9wZW5MYXllcnMuRmVhdHVyZS5WZWN0b3Iuc3R5bGVb ImRlbGV0ZSJdKX07aWYoc3R5bGUgaW5zdGFuY2VvZiBPcGVuTGF5ZXJzLlN0eWxl KXt0aGlzLnN0eWxlc1siZGVmYXVsdCJdPXN0eWxlO3RoaXMuc3R5bGVzWyJzZWxl Y3QiXT1zdHlsZTt0aGlzLnN0eWxlc1sidGVtcG9yYXJ5Il09c3R5bGU7dGhpcy5z dHlsZXNbImRlbGV0ZSJdPXN0eWxlO31lbHNlIGlmKHR5cGVvZiBzdHlsZT09Im9i amVjdCIpe2Zvcih2YXIga2V5IGluIHN0eWxlKXtpZihzdHlsZVtrZXldaW5zdGFu Y2VvZiBPcGVuTGF5ZXJzLlN0eWxlKXt0aGlzLnN0eWxlc1trZXldPXN0eWxlW2tl eV07fWVsc2UgaWYodHlwZW9mIHN0eWxlW2tleV09PSJvYmplY3QiKXt0aGlzLnN0 eWxlc1trZXldPW5ldyBPcGVuTGF5ZXJzLlN0eWxlKHN0eWxlW2tleV0pO31lbHNl e3RoaXMuc3R5bGVzWyJkZWZhdWx0Il09bmV3IE9wZW5MYXllcnMuU3R5bGUoc3R5 bGUpO3RoaXMuc3R5bGVzWyJzZWxlY3QiXT1uZXcgT3BlbkxheWVycy5TdHlsZShz dHlsZSk7dGhpcy5zdHlsZXNbInRlbXBvcmFyeSJdPW5ldyBPcGVuTGF5ZXJzLlN0 eWxlKHN0eWxlKTt0aGlzLnN0eWxlc1siZGVsZXRlIl09bmV3IE9wZW5MYXllcnMu U3R5bGUoc3R5bGUpO2JyZWFrO319fQpPcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHRo aXMsb3B0aW9ucyk7fSxkZXN0cm95OmZ1bmN0aW9uKCl7Zm9yKHZhciBrZXkgaW4g dGhpcy5zdHlsZXMpe3RoaXMuc3R5bGVzW2tleV0uZGVzdHJveSgpO30KdGhpcy5z dHlsZXM9bnVsbDt9LGNyZWF0ZVN5bWJvbGl6ZXI6ZnVuY3Rpb24oZmVhdHVyZSxp bnRlbnQpe2lmKCFmZWF0dXJlKXtmZWF0dXJlPW5ldyBPcGVuTGF5ZXJzLkZlYXR1 cmUuVmVjdG9yKCk7fQppZighdGhpcy5zdHlsZXNbaW50ZW50XSl7aW50ZW50PSJk ZWZhdWx0Ijt9CmZlYXR1cmUucmVuZGVySW50ZW50PWludGVudDt2YXIgZGVmYXVs dFN5bWJvbGl6ZXI9e307aWYodGhpcy5leHRlbmREZWZhdWx0JiZpbnRlbnQhPSJk ZWZhdWx0Iil7ZGVmYXVsdFN5bWJvbGl6ZXI9dGhpcy5zdHlsZXNbImRlZmF1bHQi XS5jcmVhdGVTeW1ib2xpemVyKGZlYXR1cmUpO30KcmV0dXJuIE9wZW5MYXllcnMu VXRpbC5leHRlbmQoZGVmYXVsdFN5bWJvbGl6ZXIsdGhpcy5zdHlsZXNbaW50ZW50 XS5jcmVhdGVTeW1ib2xpemVyKGZlYXR1cmUpKTt9LGFkZFVuaXF1ZVZhbHVlUnVs ZXM6ZnVuY3Rpb24ocmVuZGVySW50ZW50LHByb3BlcnR5LHN5bWJvbGl6ZXJzLGNv bnRleHQpe3ZhciBydWxlcz1bXTtmb3IodmFyIHZhbHVlIGluIHN5bWJvbGl6ZXJz KXtydWxlcy5wdXNoKG5ldyBPcGVuTGF5ZXJzLlJ1bGUoe3N5bWJvbGl6ZXI6c3lt Ym9saXplcnNbdmFsdWVdLGNvbnRleHQ6Y29udGV4dCxmaWx0ZXI6bmV3IE9wZW5M YXllcnMuRmlsdGVyLkNvbXBhcmlzb24oe3R5cGU6T3BlbkxheWVycy5GaWx0ZXIu Q29tcGFyaXNvbi5FUVVBTF9UTyxwcm9wZXJ0eTpwcm9wZXJ0eSx2YWx1ZTp2YWx1 ZX0pfSkpO30KdGhpcy5zdHlsZXNbcmVuZGVySW50ZW50XS5hZGRSdWxlcyhydWxl cyk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLlN0eWxlTWFwIn0pO09wZW5MYXll cnMuTGF5ZXIuVmVjdG9yPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5MYXll cix7RVZFTlRfVFlQRVM6WyJiZWZvcmVmZWF0dXJlYWRkZWQiLCJiZWZvcmVmZWF0 dXJlc2FkZGVkIiwiZmVhdHVyZWFkZGVkIiwiZmVhdHVyZXNhZGRlZCIsImJlZm9y ZWZlYXR1cmVyZW1vdmVkIiwiYmVmb3JlZmVhdHVyZXNyZW1vdmVkIiwiZmVhdHVy ZXJlbW92ZWQiLCJmZWF0dXJlc3JlbW92ZWQiLCJiZWZvcmVmZWF0dXJlc2VsZWN0 ZWQiLCJmZWF0dXJlc2VsZWN0ZWQiLCJmZWF0dXJldW5zZWxlY3RlZCIsImJlZm9y ZWZlYXR1cmVtb2RpZmllZCIsImZlYXR1cmVtb2RpZmllZCIsImFmdGVyZmVhdHVy ZW1vZGlmaWVkIiwidmVydGV4bW9kaWZpZWQiLCJ2ZXJ0ZXhyZW1vdmVkIiwic2tl dGNoc3RhcnRlZCIsInNrZXRjaG1vZGlmaWVkIiwic2tldGNoY29tcGxldGUiLCJy ZWZyZXNoIl0saXNCYXNlTGF5ZXI6ZmFsc2UsaXNGaXhlZDpmYWxzZSxmZWF0dXJl czpudWxsLGZpbHRlcjpudWxsLHNlbGVjdGVkRmVhdHVyZXM6bnVsbCx1bnJlbmRl cmVkRmVhdHVyZXM6bnVsbCxyZXBvcnRFcnJvcjp0cnVlLHN0eWxlOm51bGwsc3R5 bGVNYXA6bnVsbCxzdHJhdGVnaWVzOm51bGwscHJvdG9jb2w6bnVsbCxyZW5kZXJl cnM6WydTVkcnLCdWTUwnLCdDYW52YXMnXSxyZW5kZXJlcjpudWxsLHJlbmRlcmVy T3B0aW9uczpudWxsLGdlb21ldHJ5VHlwZTpudWxsLGRyYXduOmZhbHNlLGluaXRp YWxpemU6ZnVuY3Rpb24obmFtZSxvcHRpb25zKXt0aGlzLkVWRU5UX1RZUEVTPU9w ZW5MYXllcnMuTGF5ZXIuVmVjdG9yLnByb3RvdHlwZS5FVkVOVF9UWVBFUy5jb25j YXQoT3BlbkxheWVycy5MYXllci5wcm90b3R5cGUuRVZFTlRfVFlQRVMpO09wZW5M YXllcnMuTGF5ZXIucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1 bWVudHMpO2lmKCF0aGlzLnJlbmRlcmVyfHwhdGhpcy5yZW5kZXJlci5zdXBwb3J0 ZWQoKSl7dGhpcy5hc3NpZ25SZW5kZXJlcigpO30KaWYoIXRoaXMucmVuZGVyZXJ8 fCF0aGlzLnJlbmRlcmVyLnN1cHBvcnRlZCgpKXt0aGlzLnJlbmRlcmVyPW51bGw7 dGhpcy5kaXNwbGF5RXJyb3IoKTt9CmlmKCF0aGlzLnN0eWxlTWFwKXt0aGlzLnN0 eWxlTWFwPW5ldyBPcGVuTGF5ZXJzLlN0eWxlTWFwKCk7fQp0aGlzLmZlYXR1cmVz PVtdO3RoaXMuc2VsZWN0ZWRGZWF0dXJlcz1bXTt0aGlzLnVucmVuZGVyZWRGZWF0 dXJlcz17fTtpZih0aGlzLnN0cmF0ZWdpZXMpe2Zvcih2YXIgaT0wLGxlbj10aGlz LnN0cmF0ZWdpZXMubGVuZ3RoO2k8bGVuO2krKyl7dGhpcy5zdHJhdGVnaWVzW2ld LnNldExheWVyKHRoaXMpO319fSxkZXN0cm95OmZ1bmN0aW9uKCl7aWYodGhpcy5z dHJhdGVnaWVzKXt2YXIgc3RyYXRlZ3ksaSxsZW47Zm9yKGk9MCxsZW49dGhpcy5z dHJhdGVnaWVzLmxlbmd0aDtpPGxlbjtpKyspe3N0cmF0ZWd5PXRoaXMuc3RyYXRl Z2llc1tpXTtpZihzdHJhdGVneS5hdXRvRGVzdHJveSl7c3RyYXRlZ3kuZGVzdHJv eSgpO319CnRoaXMuc3RyYXRlZ2llcz1udWxsO30KaWYodGhpcy5wcm90b2NvbCl7 aWYodGhpcy5wcm90b2NvbC5hdXRvRGVzdHJveSl7dGhpcy5wcm90b2NvbC5kZXN0 cm95KCk7fQp0aGlzLnByb3RvY29sPW51bGw7fQp0aGlzLmRlc3Ryb3lGZWF0dXJl cygpO3RoaXMuZmVhdHVyZXM9bnVsbDt0aGlzLnNlbGVjdGVkRmVhdHVyZXM9bnVs bDt0aGlzLnVucmVuZGVyZWRGZWF0dXJlcz1udWxsO2lmKHRoaXMucmVuZGVyZXIp e3RoaXMucmVuZGVyZXIuZGVzdHJveSgpO30KdGhpcy5yZW5kZXJlcj1udWxsO3Ro aXMuZ2VvbWV0cnlUeXBlPW51bGw7dGhpcy5kcmF3bj1udWxsO09wZW5MYXllcnMu TGF5ZXIucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpO30s Y2xvbmU6ZnVuY3Rpb24ob2JqKXtpZihvYmo9PW51bGwpe29iaj1uZXcgT3Blbkxh eWVycy5MYXllci5WZWN0b3IodGhpcy5uYW1lLHRoaXMuZ2V0T3B0aW9ucygpKTt9 Cm9iaj1PcGVuTGF5ZXJzLkxheWVyLnByb3RvdHlwZS5jbG9uZS5hcHBseSh0aGlz LFtvYmpdKTt2YXIgZmVhdHVyZXM9dGhpcy5mZWF0dXJlczt2YXIgbGVuPWZlYXR1 cmVzLmxlbmd0aDt2YXIgY2xvbmVkRmVhdHVyZXM9bmV3IEFycmF5KGxlbik7Zm9y KHZhciBpPTA7aTxsZW47KytpKXtjbG9uZWRGZWF0dXJlc1tpXT1mZWF0dXJlc1tp XS5jbG9uZSgpO30Kb2JqLmZlYXR1cmVzPWNsb25lZEZlYXR1cmVzO3JldHVybiBv Ymo7fSxyZWZyZXNoOmZ1bmN0aW9uKG9iail7aWYodGhpcy5jYWxjdWxhdGVJblJh bmdlKCkmJnRoaXMudmlzaWJpbGl0eSl7dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50 KCJyZWZyZXNoIixvYmopO319LGFzc2lnblJlbmRlcmVyOmZ1bmN0aW9uKCl7Zm9y KHZhciBpPTAsbGVuPXRoaXMucmVuZGVyZXJzLmxlbmd0aDtpPGxlbjtpKyspe3Zh ciByZW5kZXJlckNsYXNzPXRoaXMucmVuZGVyZXJzW2ldO3ZhciByZW5kZXJlcj0o dHlwZW9mIHJlbmRlcmVyQ2xhc3M9PSJmdW5jdGlvbiIpP3JlbmRlcmVyQ2xhc3M6 T3BlbkxheWVycy5SZW5kZXJlcltyZW5kZXJlckNsYXNzXTtpZihyZW5kZXJlciYm cmVuZGVyZXIucHJvdG90eXBlLnN1cHBvcnRlZCgpKXt0aGlzLnJlbmRlcmVyPW5l dyByZW5kZXJlcih0aGlzLmRpdix0aGlzLnJlbmRlcmVyT3B0aW9ucyk7YnJlYWs7 fX19LGRpc3BsYXlFcnJvcjpmdW5jdGlvbigpe2lmKHRoaXMucmVwb3J0RXJyb3Ip e09wZW5MYXllcnMuQ29uc29sZS51c2VyRXJyb3IoT3BlbkxheWVycy5pMThuKCJi cm93c2VyTm90U3VwcG9ydGVkIix7J3JlbmRlcmVycyc6dGhpcy5yZW5kZXJlcnMu am9pbigiXG4iKX0pKTt9fSxzZXRNYXA6ZnVuY3Rpb24obWFwKXtPcGVuTGF5ZXJz LkxheWVyLnByb3RvdHlwZS5zZXRNYXAuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lm KCF0aGlzLnJlbmRlcmVyKXt0aGlzLm1hcC5yZW1vdmVMYXllcih0aGlzKTt9ZWxz ZXt0aGlzLnJlbmRlcmVyLm1hcD10aGlzLm1hcDt0aGlzLnJlbmRlcmVyLnNldFNp emUodGhpcy5tYXAuZ2V0U2l6ZSgpKTt9fSxhZnRlckFkZDpmdW5jdGlvbigpe2lm KHRoaXMuc3RyYXRlZ2llcyl7dmFyIHN0cmF0ZWd5LGksbGVuO2ZvcihpPTAsbGVu PXRoaXMuc3RyYXRlZ2llcy5sZW5ndGg7aTxsZW47aSsrKXtzdHJhdGVneT10aGlz LnN0cmF0ZWdpZXNbaV07aWYoc3RyYXRlZ3kuYXV0b0FjdGl2YXRlKXtzdHJhdGVn eS5hY3RpdmF0ZSgpO319fX0scmVtb3ZlTWFwOmZ1bmN0aW9uKG1hcCl7dGhpcy5k cmF3bj1mYWxzZTtpZih0aGlzLnN0cmF0ZWdpZXMpe3ZhciBzdHJhdGVneSxpLGxl bjtmb3IoaT0wLGxlbj10aGlzLnN0cmF0ZWdpZXMubGVuZ3RoO2k8bGVuO2krKyl7 c3RyYXRlZ3k9dGhpcy5zdHJhdGVnaWVzW2ldO2lmKHN0cmF0ZWd5LmF1dG9BY3Rp dmF0ZSl7c3RyYXRlZ3kuZGVhY3RpdmF0ZSgpO319fX0sb25NYXBSZXNpemU6ZnVu Y3Rpb24oKXtPcGVuTGF5ZXJzLkxheWVyLnByb3RvdHlwZS5vbk1hcFJlc2l6ZS5h cHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5yZW5kZXJlci5zZXRTaXplKHRoaXMu bWFwLmdldFNpemUoKSk7fSxtb3ZlVG86ZnVuY3Rpb24oYm91bmRzLHpvb21DaGFu Z2VkLGRyYWdnaW5nKXtPcGVuTGF5ZXJzLkxheWVyLnByb3RvdHlwZS5tb3ZlVG8u YXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBuZz0oT3BlbkxheWVycy5SZW5kZXJl ci5ORyYmdGhpcy5yZW5kZXJlciBpbnN0YW5jZW9mIE9wZW5MYXllcnMuUmVuZGVy ZXIuTkcpO2lmKG5nKXtkcmFnZ2luZ3x8dGhpcy5yZW5kZXJlci51cGRhdGVEaW1l bnNpb25zKHpvb21DaGFuZ2VkKTt9ZWxzZXt2YXIgY29vcmRTeXNVbmNoYW5nZWQ9 dHJ1ZTtpZighZHJhZ2dpbmcpe3RoaXMucmVuZGVyZXIucm9vdC5zdHlsZS52aXNp YmlsaXR5PSJoaWRkZW4iO3RoaXMuZGl2LnN0eWxlLmxlZnQ9LXBhcnNlSW50KHRo aXMubWFwLmxheWVyQ29udGFpbmVyRGl2LnN0eWxlLmxlZnQpKyJweCI7dGhpcy5k aXYuc3R5bGUudG9wPS1wYXJzZUludCh0aGlzLm1hcC5sYXllckNvbnRhaW5lckRp di5zdHlsZS50b3ApKyJweCI7dmFyIGV4dGVudD10aGlzLm1hcC5nZXRFeHRlbnQo KTtjb29yZFN5c1VuY2hhbmdlZD10aGlzLnJlbmRlcmVyLnNldEV4dGVudChleHRl bnQsem9vbUNoYW5nZWQpO3RoaXMucmVuZGVyZXIucm9vdC5zdHlsZS52aXNpYmls aXR5PSJ2aXNpYmxlIjtpZihPcGVuTGF5ZXJzLklTX0dFQ0tPPT09dHJ1ZSl7dGhp cy5kaXYuc2Nyb2xsTGVmdD10aGlzLmRpdi5zY3JvbGxMZWZ0O30KaWYoIXpvb21D aGFuZ2VkJiZjb29yZFN5c1VuY2hhbmdlZCl7Zm9yKHZhciBpIGluIHRoaXMudW5y ZW5kZXJlZEZlYXR1cmVzKXt2YXIgZmVhdHVyZT10aGlzLnVucmVuZGVyZWRGZWF0 dXJlc1tpXTt0aGlzLmRyYXdGZWF0dXJlKGZlYXR1cmUpO319fX0KaWYoIXRoaXMu ZHJhd258fCghbmcmJih6b29tQ2hhbmdlZHx8IWNvb3JkU3lzVW5jaGFuZ2VkKSkp e3RoaXMuZHJhd249dHJ1ZTt2YXIgZmVhdHVyZTtmb3IodmFyIGk9MCxsZW49dGhp cy5mZWF0dXJlcy5sZW5ndGg7aTxsZW47aSsrKXt0aGlzLnJlbmRlcmVyLmxvY2tl ZD0oaSE9PShsZW4tMSkpO2ZlYXR1cmU9dGhpcy5mZWF0dXJlc1tpXTt0aGlzLmRy YXdGZWF0dXJlKGZlYXR1cmUpO319fSxyZWRyYXc6ZnVuY3Rpb24oKXtpZihPcGVu TGF5ZXJzLlJlbmRlcmVyLk5HJiZ0aGlzLnJlbmRlcmVyIGluc3RhbmNlb2YgT3Bl bkxheWVycy5SZW5kZXJlci5ORyl7dGhpcy5kcmF3bj1mYWxzZTt9CnJldHVybiBP cGVuTGF5ZXJzLkxheWVyLnByb3RvdHlwZS5yZWRyYXcuYXBwbHkodGhpcyxhcmd1 bWVudHMpO30sZGlzcGxheTpmdW5jdGlvbihkaXNwbGF5KXtPcGVuTGF5ZXJzLkxh eWVyLnByb3RvdHlwZS5kaXNwbGF5LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIg Y3VycmVudERpc3BsYXk9dGhpcy5kaXYuc3R5bGUuZGlzcGxheTtpZihjdXJyZW50 RGlzcGxheSE9dGhpcy5yZW5kZXJlci5yb290LnN0eWxlLmRpc3BsYXkpe3RoaXMu cmVuZGVyZXIucm9vdC5zdHlsZS5kaXNwbGF5PWN1cnJlbnREaXNwbGF5O319LGFk ZEZlYXR1cmVzOmZ1bmN0aW9uKGZlYXR1cmVzLG9wdGlvbnMpe2lmKCEoT3Blbkxh eWVycy5VdGlsLmlzQXJyYXkoZmVhdHVyZXMpKSl7ZmVhdHVyZXM9W2ZlYXR1cmVz XTt9CnZhciBub3RpZnk9IW9wdGlvbnN8fCFvcHRpb25zLnNpbGVudDtpZihub3Rp Znkpe3ZhciBldmVudD17ZmVhdHVyZXM6ZmVhdHVyZXN9O3ZhciByZXQ9dGhpcy5l dmVudHMudHJpZ2dlckV2ZW50KCJiZWZvcmVmZWF0dXJlc2FkZGVkIixldmVudCk7 aWYocmV0PT09ZmFsc2Upe3JldHVybjt9CmZlYXR1cmVzPWV2ZW50LmZlYXR1cmVz O30KdmFyIGZlYXR1cmVzQWRkZWQ9W107Zm9yKHZhciBpPTAsbGVuPWZlYXR1cmVz Lmxlbmd0aDtpPGxlbjtpKyspe2lmKGkhPShmZWF0dXJlcy5sZW5ndGgtMSkpe3Ro aXMucmVuZGVyZXIubG9ja2VkPXRydWU7fWVsc2V7dGhpcy5yZW5kZXJlci5sb2Nr ZWQ9ZmFsc2U7fQp2YXIgZmVhdHVyZT1mZWF0dXJlc1tpXTtpZih0aGlzLmdlb21l dHJ5VHlwZSYmIShmZWF0dXJlLmdlb21ldHJ5IGluc3RhbmNlb2YgdGhpcy5nZW9t ZXRyeVR5cGUpKXt2YXIgdGhyb3dTdHI9T3BlbkxheWVycy5pMThuKCdjb21wb25l bnRTaG91bGRCZScseydnZW9tVHlwZSc6dGhpcy5nZW9tZXRyeVR5cGUucHJvdG90 eXBlLkNMQVNTX05BTUV9KTt0aHJvdyB0aHJvd1N0cjt9CmZlYXR1cmUubGF5ZXI9 dGhpcztpZighZmVhdHVyZS5zdHlsZSYmdGhpcy5zdHlsZSl7ZmVhdHVyZS5zdHls ZT1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHt9LHRoaXMuc3R5bGUpO30KaWYobm90 aWZ5KXtpZih0aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQoImJlZm9yZWZlYXR1cmVh ZGRlZCIse2ZlYXR1cmU6ZmVhdHVyZX0pPT09ZmFsc2Upe2NvbnRpbnVlO30KdGhp cy5wcmVGZWF0dXJlSW5zZXJ0KGZlYXR1cmUpO30KZmVhdHVyZXNBZGRlZC5wdXNo KGZlYXR1cmUpO3RoaXMuZmVhdHVyZXMucHVzaChmZWF0dXJlKTt0aGlzLmRyYXdG ZWF0dXJlKGZlYXR1cmUpO2lmKG5vdGlmeSl7dGhpcy5ldmVudHMudHJpZ2dlckV2 ZW50KCJmZWF0dXJlYWRkZWQiLHtmZWF0dXJlOmZlYXR1cmV9KTt0aGlzLm9uRmVh dHVyZUluc2VydChmZWF0dXJlKTt9fQppZihub3RpZnkpe3RoaXMuZXZlbnRzLnRy aWdnZXJFdmVudCgiZmVhdHVyZXNhZGRlZCIse2ZlYXR1cmVzOmZlYXR1cmVzQWRk ZWR9KTt9fSxyZW1vdmVGZWF0dXJlczpmdW5jdGlvbihmZWF0dXJlcyxvcHRpb25z KXtpZighZmVhdHVyZXN8fGZlYXR1cmVzLmxlbmd0aD09PTApe3JldHVybjt9Cmlm KGZlYXR1cmVzPT09dGhpcy5mZWF0dXJlcyl7cmV0dXJuIHRoaXMucmVtb3ZlQWxs RmVhdHVyZXMob3B0aW9ucyk7fQppZighKE9wZW5MYXllcnMuVXRpbC5pc0FycmF5 KGZlYXR1cmVzKSkpe2ZlYXR1cmVzPVtmZWF0dXJlc107fQppZihmZWF0dXJlcz09 PXRoaXMuc2VsZWN0ZWRGZWF0dXJlcyl7ZmVhdHVyZXM9ZmVhdHVyZXMuc2xpY2Uo KTt9CnZhciBub3RpZnk9IW9wdGlvbnN8fCFvcHRpb25zLnNpbGVudDtpZihub3Rp Znkpe3RoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgiYmVmb3JlZmVhdHVyZXNyZW1v dmVkIix7ZmVhdHVyZXM6ZmVhdHVyZXN9KTt9CmZvcih2YXIgaT1mZWF0dXJlcy5s ZW5ndGgtMTtpPj0wO2ktLSl7aWYoaSE9MCYmZmVhdHVyZXNbaS0xXS5nZW9tZXRy eSl7dGhpcy5yZW5kZXJlci5sb2NrZWQ9dHJ1ZTt9ZWxzZXt0aGlzLnJlbmRlcmVy LmxvY2tlZD1mYWxzZTt9CnZhciBmZWF0dXJlPWZlYXR1cmVzW2ldO2RlbGV0ZSB0 aGlzLnVucmVuZGVyZWRGZWF0dXJlc1tmZWF0dXJlLmlkXTtpZihub3RpZnkpe3Ro aXMuZXZlbnRzLnRyaWdnZXJFdmVudCgiYmVmb3JlZmVhdHVyZXJlbW92ZWQiLHtm ZWF0dXJlOmZlYXR1cmV9KTt9CnRoaXMuZmVhdHVyZXM9T3BlbkxheWVycy5VdGls LnJlbW92ZUl0ZW0odGhpcy5mZWF0dXJlcyxmZWF0dXJlKTtmZWF0dXJlLmxheWVy PW51bGw7aWYoZmVhdHVyZS5nZW9tZXRyeSl7dGhpcy5yZW5kZXJlci5lcmFzZUZl YXR1cmVzKGZlYXR1cmUpO30KaWYoT3BlbkxheWVycy5VdGlsLmluZGV4T2YodGhp cy5zZWxlY3RlZEZlYXR1cmVzLGZlYXR1cmUpIT0tMSl7T3BlbkxheWVycy5VdGls LnJlbW92ZUl0ZW0odGhpcy5zZWxlY3RlZEZlYXR1cmVzLGZlYXR1cmUpO30KaWYo bm90aWZ5KXt0aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQoImZlYXR1cmVyZW1vdmVk Iix7ZmVhdHVyZTpmZWF0dXJlfSk7fX0KaWYobm90aWZ5KXt0aGlzLmV2ZW50cy50 cmlnZ2VyRXZlbnQoImZlYXR1cmVzcmVtb3ZlZCIse2ZlYXR1cmVzOmZlYXR1cmVz fSk7fX0scmVtb3ZlQWxsRmVhdHVyZXM6ZnVuY3Rpb24ob3B0aW9ucyl7dmFyIG5v dGlmeT0hb3B0aW9uc3x8IW9wdGlvbnMuc2lsZW50O3ZhciBmZWF0dXJlcz10aGlz LmZlYXR1cmVzO2lmKG5vdGlmeSl7dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJi ZWZvcmVmZWF0dXJlc3JlbW92ZWQiLHtmZWF0dXJlczpmZWF0dXJlc30pO30KdmFy IGZlYXR1cmU7Zm9yKHZhciBpPWZlYXR1cmVzLmxlbmd0aC0xO2k+PTA7aS0tKXtm ZWF0dXJlPWZlYXR1cmVzW2ldO2lmKG5vdGlmeSl7dGhpcy5ldmVudHMudHJpZ2dl ckV2ZW50KCJiZWZvcmVmZWF0dXJlcmVtb3ZlZCIse2ZlYXR1cmU6ZmVhdHVyZX0p O30KZmVhdHVyZS5sYXllcj1udWxsO2lmKG5vdGlmeSl7dGhpcy5ldmVudHMudHJp Z2dlckV2ZW50KCJmZWF0dXJlcmVtb3ZlZCIse2ZlYXR1cmU6ZmVhdHVyZX0pO319 CnRoaXMucmVuZGVyZXIuY2xlYXIoKTt0aGlzLmZlYXR1cmVzPVtdO3RoaXMudW5y ZW5kZXJlZEZlYXR1cmVzPXt9O3RoaXMuc2VsZWN0ZWRGZWF0dXJlcz1bXTtpZihu b3RpZnkpe3RoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgiZmVhdHVyZXNyZW1vdmVk Iix7ZmVhdHVyZXM6ZmVhdHVyZXN9KTt9fSxkZXN0cm95RmVhdHVyZXM6ZnVuY3Rp b24oZmVhdHVyZXMsb3B0aW9ucyl7dmFyIGFsbD0oZmVhdHVyZXM9PXVuZGVmaW5l ZCk7aWYoYWxsKXtmZWF0dXJlcz10aGlzLmZlYXR1cmVzO30KaWYoZmVhdHVyZXMp e3RoaXMucmVtb3ZlRmVhdHVyZXMoZmVhdHVyZXMsb3B0aW9ucyk7Zm9yKHZhciBp PWZlYXR1cmVzLmxlbmd0aC0xO2k+PTA7aS0tKXtmZWF0dXJlc1tpXS5kZXN0cm95 KCk7fX19LGRyYXdGZWF0dXJlOmZ1bmN0aW9uKGZlYXR1cmUsc3R5bGUpe2lmKCF0 aGlzLmRyYXduKXtyZXR1cm47fQppZih0eXBlb2Ygc3R5bGUhPSJvYmplY3QiKXtp Zighc3R5bGUmJmZlYXR1cmUuc3RhdGU9PT1PcGVuTGF5ZXJzLlN0YXRlLkRFTEVU RSl7c3R5bGU9ImRlbGV0ZSI7fQp2YXIgcmVuZGVySW50ZW50PXN0eWxlfHxmZWF0 dXJlLnJlbmRlckludGVudDtzdHlsZT1mZWF0dXJlLnN0eWxlfHx0aGlzLnN0eWxl O2lmKCFzdHlsZSl7c3R5bGU9dGhpcy5zdHlsZU1hcC5jcmVhdGVTeW1ib2xpemVy KGZlYXR1cmUscmVuZGVySW50ZW50KTt9fQp2YXIgZHJhd249dGhpcy5yZW5kZXJl ci5kcmF3RmVhdHVyZShmZWF0dXJlLHN0eWxlKTtpZihkcmF3bj09PWZhbHNlfHxk cmF3bj09PW51bGwpe3RoaXMudW5yZW5kZXJlZEZlYXR1cmVzW2ZlYXR1cmUuaWRd PWZlYXR1cmU7fWVsc2V7ZGVsZXRlIHRoaXMudW5yZW5kZXJlZEZlYXR1cmVzW2Zl YXR1cmUuaWRdO319LGVyYXNlRmVhdHVyZXM6ZnVuY3Rpb24oZmVhdHVyZXMpe3Ro aXMucmVuZGVyZXIuZXJhc2VGZWF0dXJlcyhmZWF0dXJlcyk7fSxnZXRGZWF0dXJl RnJvbUV2ZW50OmZ1bmN0aW9uKGV2dCl7aWYoIXRoaXMucmVuZGVyZXIpe09wZW5M YXllcnMuQ29uc29sZS5lcnJvcihPcGVuTGF5ZXJzLmkxOG4oImdldEZlYXR1cmVF cnJvciIpKTtyZXR1cm4gbnVsbDt9CnZhciBmZWF0dXJlPW51bGw7dmFyIGZlYXR1 cmVJZD10aGlzLnJlbmRlcmVyLmdldEZlYXR1cmVJZEZyb21FdmVudChldnQpO2lm KGZlYXR1cmVJZCl7aWYodHlwZW9mIGZlYXR1cmVJZD09PSJzdHJpbmciKXtmZWF0 dXJlPXRoaXMuZ2V0RmVhdHVyZUJ5SWQoZmVhdHVyZUlkKTt9ZWxzZXtmZWF0dXJl PWZlYXR1cmVJZDt9fQpyZXR1cm4gZmVhdHVyZTt9LGdldEZlYXR1cmVCeTpmdW5j dGlvbihwcm9wZXJ0eSx2YWx1ZSl7dmFyIGZlYXR1cmU9bnVsbDtmb3IodmFyIGk9 MCxsZW49dGhpcy5mZWF0dXJlcy5sZW5ndGg7aTxsZW47KytpKXtpZih0aGlzLmZl YXR1cmVzW2ldW3Byb3BlcnR5XT09dmFsdWUpe2ZlYXR1cmU9dGhpcy5mZWF0dXJl c1tpXTticmVhazt9fQpyZXR1cm4gZmVhdHVyZTt9LGdldEZlYXR1cmVCeUlkOmZ1 bmN0aW9uKGZlYXR1cmVJZCl7cmV0dXJuIHRoaXMuZ2V0RmVhdHVyZUJ5KCdpZCcs ZmVhdHVyZUlkKTt9LGdldEZlYXR1cmVCeUZpZDpmdW5jdGlvbihmZWF0dXJlRmlk KXtyZXR1cm4gdGhpcy5nZXRGZWF0dXJlQnkoJ2ZpZCcsZmVhdHVyZUZpZCk7fSxn ZXRGZWF0dXJlc0J5QXR0cmlidXRlOmZ1bmN0aW9uKGF0dHJOYW1lLGF0dHJWYWx1 ZSl7dmFyIGksZmVhdHVyZSxsZW49dGhpcy5mZWF0dXJlcy5sZW5ndGgsZm91bmRG ZWF0dXJlcz1bXTtmb3IoaT0wO2k8bGVuO2krKyl7ZmVhdHVyZT10aGlzLmZlYXR1 cmVzW2ldO2lmKGZlYXR1cmUmJmZlYXR1cmUuYXR0cmlidXRlcyl7aWYoZmVhdHVy ZS5hdHRyaWJ1dGVzW2F0dHJOYW1lXT09PWF0dHJWYWx1ZSl7Zm91bmRGZWF0dXJl cy5wdXNoKGZlYXR1cmUpO319fQpyZXR1cm4gZm91bmRGZWF0dXJlczt9LG9uRmVh dHVyZUluc2VydDpmdW5jdGlvbihmZWF0dXJlKXt9LHByZUZlYXR1cmVJbnNlcnQ6 ZnVuY3Rpb24oZmVhdHVyZSl7fSxnZXREYXRhRXh0ZW50OmZ1bmN0aW9uKCl7dmFy IG1heEV4dGVudD1udWxsO3ZhciBmZWF0dXJlcz10aGlzLmZlYXR1cmVzO2lmKGZl YXR1cmVzJiYoZmVhdHVyZXMubGVuZ3RoPjApKXt2YXIgZ2VvbWV0cnk9bnVsbDtm b3IodmFyIGk9MCxsZW49ZmVhdHVyZXMubGVuZ3RoO2k8bGVuO2krKyl7Z2VvbWV0 cnk9ZmVhdHVyZXNbaV0uZ2VvbWV0cnk7aWYoZ2VvbWV0cnkpe2lmKG1heEV4dGVu dD09PW51bGwpe21heEV4dGVudD1uZXcgT3BlbkxheWVycy5Cb3VuZHMoKTt9Cm1h eEV4dGVudC5leHRlbmQoZ2VvbWV0cnkuZ2V0Qm91bmRzKCkpO319fQpyZXR1cm4g bWF4RXh0ZW50O30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5MYXllci5WZWN0b3Ii fSk7T3BlbkxheWVycy5MYXllci5WZWN0b3IuUm9vdENvbnRhaW5lcj1PcGVuTGF5 ZXJzLkNsYXNzKE9wZW5MYXllcnMuTGF5ZXIuVmVjdG9yLHtkaXNwbGF5SW5MYXll clN3aXRjaGVyOmZhbHNlLGxheWVyczpudWxsLGluaXRpYWxpemU6ZnVuY3Rpb24o bmFtZSxvcHRpb25zKXtPcGVuTGF5ZXJzLkxheWVyLlZlY3Rvci5wcm90b3R5cGUu aW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fSxkaXNwbGF5OmZ1bmN0 aW9uKCl7fSxnZXRGZWF0dXJlRnJvbUV2ZW50OmZ1bmN0aW9uKGV2dCl7dmFyIGxh eWVycz10aGlzLmxheWVyczt2YXIgZmVhdHVyZTtmb3IodmFyIGk9MDtpPGxheWVy cy5sZW5ndGg7aSsrKXtmZWF0dXJlPWxheWVyc1tpXS5nZXRGZWF0dXJlRnJvbUV2 ZW50KGV2dCk7aWYoZmVhdHVyZSl7cmV0dXJuIGZlYXR1cmU7fX19LHNldE1hcDpm dW5jdGlvbihtYXApe09wZW5MYXllcnMuTGF5ZXIuVmVjdG9yLnByb3RvdHlwZS5z ZXRNYXAuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuY29sbGVjdFJvb3RzKCk7 bWFwLmV2ZW50cy5yZWdpc3RlcigiY2hhbmdlbGF5ZXIiLHRoaXMsdGhpcy5oYW5k bGVDaGFuZ2VMYXllcik7fSxyZW1vdmVNYXA6ZnVuY3Rpb24obWFwKXttYXAuZXZl bnRzLnVucmVnaXN0ZXIoImNoYW5nZWxheWVyIix0aGlzLHRoaXMuaGFuZGxlQ2hh bmdlTGF5ZXIpO3RoaXMucmVzZXRSb290cygpO09wZW5MYXllcnMuTGF5ZXIuVmVj dG9yLnByb3RvdHlwZS5yZW1vdmVNYXAuYXBwbHkodGhpcyxhcmd1bWVudHMpO30s Y29sbGVjdFJvb3RzOmZ1bmN0aW9uKCl7dmFyIGxheWVyO2Zvcih2YXIgaT0wO2k8 dGhpcy5tYXAubGF5ZXJzLmxlbmd0aDsrK2kpe2xheWVyPXRoaXMubWFwLmxheWVy c1tpXTtpZihPcGVuTGF5ZXJzLlV0aWwuaW5kZXhPZih0aGlzLmxheWVycyxsYXll cikhPS0xKXtsYXllci5yZW5kZXJlci5tb3ZlUm9vdCh0aGlzLnJlbmRlcmVyKTt9 fX0scmVzZXRSb290czpmdW5jdGlvbigpe3ZhciBsYXllcjtmb3IodmFyIGk9MDtp PHRoaXMubGF5ZXJzLmxlbmd0aDsrK2kpe2xheWVyPXRoaXMubGF5ZXJzW2ldO2lm KHRoaXMucmVuZGVyZXImJmxheWVyLnJlbmRlcmVyLmdldFJlbmRlckxheWVySWQo KT09dGhpcy5pZCl7dGhpcy5yZW5kZXJlci5tb3ZlUm9vdChsYXllci5yZW5kZXJl cik7fX19LGhhbmRsZUNoYW5nZUxheWVyOmZ1bmN0aW9uKGV2dCl7dmFyIGxheWVy PWV2dC5sYXllcjtpZihldnQucHJvcGVydHk9PSJvcmRlciImJk9wZW5MYXllcnMu VXRpbC5pbmRleE9mKHRoaXMubGF5ZXJzLGxheWVyKSE9LTEpe3RoaXMucmVzZXRS b290cygpO3RoaXMuY29sbGVjdFJvb3RzKCk7fX0sQ0xBU1NfTkFNRToiT3Blbkxh eWVycy5MYXllci5WZWN0b3IuUm9vdENvbnRhaW5lciJ9KTtPcGVuTGF5ZXJzLkNv bnRyb2wuU2VsZWN0RmVhdHVyZT1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMu Q29udHJvbCx7RVZFTlRfVFlQRVM6WyJiZWZvcmVmZWF0dXJlaGlnaGxpZ2h0ZWQi LCJmZWF0dXJlaGlnaGxpZ2h0ZWQiLCJmZWF0dXJldW5oaWdobGlnaHRlZCJdLG11 bHRpcGxlS2V5Om51bGwsdG9nZ2xlS2V5Om51bGwsbXVsdGlwbGU6ZmFsc2UsY2xp Y2tvdXQ6dHJ1ZSx0b2dnbGU6ZmFsc2UsaG92ZXI6ZmFsc2UsaGlnaGxpZ2h0T25s eTpmYWxzZSxib3g6ZmFsc2Usb25CZWZvcmVTZWxlY3Q6ZnVuY3Rpb24oKXt9LG9u U2VsZWN0OmZ1bmN0aW9uKCl7fSxvblVuc2VsZWN0OmZ1bmN0aW9uKCl7fSxzY29w ZTpudWxsLGdlb21ldHJ5VHlwZXM6bnVsbCxsYXllcjpudWxsLGxheWVyczpudWxs LGNhbGxiYWNrczpudWxsLHNlbGVjdFN0eWxlOm51bGwscmVuZGVySW50ZW50OiJz ZWxlY3QiLGhhbmRsZXJzOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihsYXllcnMs b3B0aW9ucyl7dGhpcy5FVkVOVF9UWVBFUz1PcGVuTGF5ZXJzLkNvbnRyb2wuU2Vs ZWN0RmVhdHVyZS5wcm90b3R5cGUuRVZFTlRfVFlQRVMuY29uY2F0KE9wZW5MYXll cnMuQ29udHJvbC5wcm90b3R5cGUuRVZFTlRfVFlQRVMpO09wZW5MYXllcnMuQ29u dHJvbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7 aWYodGhpcy5zY29wZT09PW51bGwpe3RoaXMuc2NvcGU9dGhpczt9CnRoaXMuaW5p dExheWVyKGxheWVycyk7dmFyIGNhbGxiYWNrcz17Y2xpY2s6dGhpcy5jbGlja0Zl YXR1cmUsY2xpY2tvdXQ6dGhpcy5jbGlja291dEZlYXR1cmV9O2lmKHRoaXMuaG92 ZXIpe2NhbGxiYWNrcy5vdmVyPXRoaXMub3ZlckZlYXR1cmU7Y2FsbGJhY2tzLm91 dD10aGlzLm91dEZlYXR1cmU7fQp0aGlzLmNhbGxiYWNrcz1PcGVuTGF5ZXJzLlV0 aWwuZXh0ZW5kKGNhbGxiYWNrcyx0aGlzLmNhbGxiYWNrcyk7dGhpcy5oYW5kbGVy cz17ZmVhdHVyZTpuZXcgT3BlbkxheWVycy5IYW5kbGVyLkZlYXR1cmUodGhpcyx0 aGlzLmxheWVyLHRoaXMuY2FsbGJhY2tzLHtnZW9tZXRyeVR5cGVzOnRoaXMuZ2Vv bWV0cnlUeXBlc30pfTtpZih0aGlzLmJveCl7dGhpcy5oYW5kbGVycy5ib3g9bmV3 IE9wZW5MYXllcnMuSGFuZGxlci5Cb3godGhpcyx7ZG9uZTp0aGlzLnNlbGVjdEJv eH0se2JveERpdkNsYXNzTmFtZToib2xIYW5kbGVyQm94U2VsZWN0RmVhdHVyZSJ9 KTt9fSxpbml0TGF5ZXI6ZnVuY3Rpb24obGF5ZXJzKXtpZihPcGVuTGF5ZXJzLlV0 aWwuaXNBcnJheShsYXllcnMpKXt0aGlzLmxheWVycz1sYXllcnM7dGhpcy5sYXll cj1uZXcgT3BlbkxheWVycy5MYXllci5WZWN0b3IuUm9vdENvbnRhaW5lcih0aGlz LmlkKyJfY29udGFpbmVyIix7bGF5ZXJzOmxheWVyc30pO31lbHNle3RoaXMubGF5 ZXI9bGF5ZXJzO319LGRlc3Ryb3k6ZnVuY3Rpb24oKXtpZih0aGlzLmFjdGl2ZSYm dGhpcy5sYXllcnMpe3RoaXMubWFwLnJlbW92ZUxheWVyKHRoaXMubGF5ZXIpO30K T3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMs YXJndW1lbnRzKTtpZih0aGlzLmxheWVycyl7dGhpcy5sYXllci5kZXN0cm95KCk7 fX0sYWN0aXZhdGU6ZnVuY3Rpb24oKXtpZighdGhpcy5hY3RpdmUpe2lmKHRoaXMu bGF5ZXJzKXt0aGlzLm1hcC5hZGRMYXllcih0aGlzLmxheWVyKTt9CnRoaXMuaGFu ZGxlcnMuZmVhdHVyZS5hY3RpdmF0ZSgpO2lmKHRoaXMuYm94JiZ0aGlzLmhhbmRs ZXJzLmJveCl7dGhpcy5oYW5kbGVycy5ib3guYWN0aXZhdGUoKTt9fQpyZXR1cm4g T3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5hY3RpdmF0ZS5hcHBseSh0aGlz LGFyZ3VtZW50cyk7fSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7aWYodGhpcy5hY3Rp dmUpe3RoaXMuaGFuZGxlcnMuZmVhdHVyZS5kZWFjdGl2YXRlKCk7aWYodGhpcy5o YW5kbGVycy5ib3gpe3RoaXMuaGFuZGxlcnMuYm94LmRlYWN0aXZhdGUoKTt9Cmlm KHRoaXMubGF5ZXJzKXt0aGlzLm1hcC5yZW1vdmVMYXllcih0aGlzLmxheWVyKTt9 fQpyZXR1cm4gT3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5kZWFjdGl2YXRl LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LHVuc2VsZWN0QWxsOmZ1bmN0aW9uKG9w dGlvbnMpe3ZhciBsYXllcnM9dGhpcy5sYXllcnN8fFt0aGlzLmxheWVyXTt2YXIg bGF5ZXIsZmVhdHVyZTtmb3IodmFyIGw9MDtsPGxheWVycy5sZW5ndGg7KytsKXts YXllcj1sYXllcnNbbF07Zm9yKHZhciBpPWxheWVyLnNlbGVjdGVkRmVhdHVyZXMu bGVuZ3RoLTE7aT49MDstLWkpe2ZlYXR1cmU9bGF5ZXIuc2VsZWN0ZWRGZWF0dXJl c1tpXTtpZighb3B0aW9uc3x8b3B0aW9ucy5leGNlcHQhPWZlYXR1cmUpe3RoaXMu dW5zZWxlY3QoZmVhdHVyZSk7fX19fSxjbGlja0ZlYXR1cmU6ZnVuY3Rpb24oZmVh dHVyZSl7aWYoIXRoaXMuaG92ZXIpe3ZhciBzZWxlY3RlZD0oT3BlbkxheWVycy5V dGlsLmluZGV4T2YoZmVhdHVyZS5sYXllci5zZWxlY3RlZEZlYXR1cmVzLGZlYXR1 cmUpPi0xKTtpZihzZWxlY3RlZCl7aWYodGhpcy50b2dnbGVTZWxlY3QoKSl7dGhp cy51bnNlbGVjdChmZWF0dXJlKTt9ZWxzZSBpZighdGhpcy5tdWx0aXBsZVNlbGVj dCgpKXt0aGlzLnVuc2VsZWN0QWxsKHtleGNlcHQ6ZmVhdHVyZX0pO319ZWxzZXtp ZighdGhpcy5tdWx0aXBsZVNlbGVjdCgpKXt0aGlzLnVuc2VsZWN0QWxsKHtleGNl cHQ6ZmVhdHVyZX0pO30KdGhpcy5zZWxlY3QoZmVhdHVyZSk7fX19LG11bHRpcGxl U2VsZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsdGlwbGV8fCh0aGlzLmhh bmRsZXJzLmZlYXR1cmUuZXZ0JiZ0aGlzLmhhbmRsZXJzLmZlYXR1cmUuZXZ0W3Ro aXMubXVsdGlwbGVLZXldKTt9LHRvZ2dsZVNlbGVjdDpmdW5jdGlvbigpe3JldHVy biB0aGlzLnRvZ2dsZXx8KHRoaXMuaGFuZGxlcnMuZmVhdHVyZS5ldnQmJnRoaXMu aGFuZGxlcnMuZmVhdHVyZS5ldnRbdGhpcy50b2dnbGVLZXldKTt9LGNsaWNrb3V0 RmVhdHVyZTpmdW5jdGlvbihmZWF0dXJlKXtpZighdGhpcy5ob3ZlciYmdGhpcy5j bGlja291dCl7dGhpcy51bnNlbGVjdEFsbCgpO319LG92ZXJGZWF0dXJlOmZ1bmN0 aW9uKGZlYXR1cmUpe3ZhciBsYXllcj1mZWF0dXJlLmxheWVyO2lmKHRoaXMuaG92 ZXIpe2lmKHRoaXMuaGlnaGxpZ2h0T25seSl7dGhpcy5oaWdobGlnaHQoZmVhdHVy ZSk7fWVsc2UgaWYoT3BlbkxheWVycy5VdGlsLmluZGV4T2YobGF5ZXIuc2VsZWN0 ZWRGZWF0dXJlcyxmZWF0dXJlKT09LTEpe3RoaXMuc2VsZWN0KGZlYXR1cmUpO319 fSxvdXRGZWF0dXJlOmZ1bmN0aW9uKGZlYXR1cmUpe2lmKHRoaXMuaG92ZXIpe2lm KHRoaXMuaGlnaGxpZ2h0T25seSl7aWYoZmVhdHVyZS5fbGFzdEhpZ2hsaWdodGVy PT10aGlzLmlkKXtpZihmZWF0dXJlLl9wcmV2SGlnaGxpZ2h0ZXImJmZlYXR1cmUu X3ByZXZIaWdobGlnaHRlciE9dGhpcy5pZCl7ZGVsZXRlIGZlYXR1cmUuX2xhc3RI aWdobGlnaHRlcjt2YXIgY29udHJvbD10aGlzLm1hcC5nZXRDb250cm9sKGZlYXR1 cmUuX3ByZXZIaWdobGlnaHRlcik7aWYoY29udHJvbCl7Y29udHJvbC5oaWdobGln aHQoZmVhdHVyZSk7fX1lbHNle3RoaXMudW5oaWdobGlnaHQoZmVhdHVyZSk7fX19 ZWxzZXt0aGlzLnVuc2VsZWN0KGZlYXR1cmUpO319fSxoaWdobGlnaHQ6ZnVuY3Rp b24oZmVhdHVyZSl7dmFyIGxheWVyPWZlYXR1cmUubGF5ZXI7dmFyIGNvbnQ9dGhp cy5ldmVudHMudHJpZ2dlckV2ZW50KCJiZWZvcmVmZWF0dXJlaGlnaGxpZ2h0ZWQi LHtmZWF0dXJlOmZlYXR1cmV9KTtpZihjb250IT09ZmFsc2Upe2ZlYXR1cmUuX3By ZXZIaWdobGlnaHRlcj1mZWF0dXJlLl9sYXN0SGlnaGxpZ2h0ZXI7ZmVhdHVyZS5f bGFzdEhpZ2hsaWdodGVyPXRoaXMuaWQ7dmFyIHN0eWxlPXRoaXMuc2VsZWN0U3R5 bGV8fHRoaXMucmVuZGVySW50ZW50O2xheWVyLmRyYXdGZWF0dXJlKGZlYXR1cmUs c3R5bGUpO3RoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgiZmVhdHVyZWhpZ2hsaWdo dGVkIix7ZmVhdHVyZTpmZWF0dXJlfSk7fX0sdW5oaWdobGlnaHQ6ZnVuY3Rpb24o ZmVhdHVyZSl7dmFyIGxheWVyPWZlYXR1cmUubGF5ZXI7aWYoZmVhdHVyZS5fcHJl dkhpZ2hsaWdodGVyPT11bmRlZmluZWQpe2RlbGV0ZSBmZWF0dXJlLl9sYXN0SGln aGxpZ2h0ZXI7fWVsc2UgaWYoZmVhdHVyZS5fcHJldkhpZ2hsaWdodGVyPT10aGlz LmlkKXtkZWxldGUgZmVhdHVyZS5fcHJldkhpZ2hsaWdodGVyO31lbHNle2ZlYXR1 cmUuX2xhc3RIaWdobGlnaHRlcj1mZWF0dXJlLl9wcmV2SGlnaGxpZ2h0ZXI7ZGVs ZXRlIGZlYXR1cmUuX3ByZXZIaWdobGlnaHRlcjt9CmxheWVyLmRyYXdGZWF0dXJl KGZlYXR1cmUsZmVhdHVyZS5zdHlsZXx8ZmVhdHVyZS5sYXllci5zdHlsZXx8ImRl ZmF1bHQiKTt0aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQoImZlYXR1cmV1bmhpZ2hs aWdodGVkIix7ZmVhdHVyZTpmZWF0dXJlfSk7fSxzZWxlY3Q6ZnVuY3Rpb24oZmVh dHVyZSl7dmFyIGNvbnQ9dGhpcy5vbkJlZm9yZVNlbGVjdC5jYWxsKHRoaXMuc2Nv cGUsZmVhdHVyZSk7dmFyIGxheWVyPWZlYXR1cmUubGF5ZXI7aWYoY29udCE9PWZh bHNlKXtjb250PWxheWVyLmV2ZW50cy50cmlnZ2VyRXZlbnQoImJlZm9yZWZlYXR1 cmVzZWxlY3RlZCIse2ZlYXR1cmU6ZmVhdHVyZX0pO2lmKGNvbnQhPT1mYWxzZSl7 bGF5ZXIuc2VsZWN0ZWRGZWF0dXJlcy5wdXNoKGZlYXR1cmUpO3RoaXMuaGlnaGxp Z2h0KGZlYXR1cmUpO2lmKCF0aGlzLmhhbmRsZXJzLmZlYXR1cmUubGFzdEZlYXR1 cmUpe3RoaXMuaGFuZGxlcnMuZmVhdHVyZS5sYXN0RmVhdHVyZT1sYXllci5zZWxl Y3RlZEZlYXR1cmVzWzBdO30KbGF5ZXIuZXZlbnRzLnRyaWdnZXJFdmVudCgiZmVh dHVyZXNlbGVjdGVkIix7ZmVhdHVyZTpmZWF0dXJlfSk7dGhpcy5vblNlbGVjdC5j YWxsKHRoaXMuc2NvcGUsZmVhdHVyZSk7fX19LHVuc2VsZWN0OmZ1bmN0aW9uKGZl YXR1cmUpe3ZhciBsYXllcj1mZWF0dXJlLmxheWVyO3RoaXMudW5oaWdobGlnaHQo ZmVhdHVyZSk7T3BlbkxheWVycy5VdGlsLnJlbW92ZUl0ZW0obGF5ZXIuc2VsZWN0 ZWRGZWF0dXJlcyxmZWF0dXJlKTtsYXllci5ldmVudHMudHJpZ2dlckV2ZW50KCJm ZWF0dXJldW5zZWxlY3RlZCIse2ZlYXR1cmU6ZmVhdHVyZX0pO3RoaXMub25VbnNl bGVjdC5jYWxsKHRoaXMuc2NvcGUsZmVhdHVyZSk7fSxzZWxlY3RCb3g6ZnVuY3Rp b24ocG9zaXRpb24pe2lmKHBvc2l0aW9uIGluc3RhbmNlb2YgT3BlbkxheWVycy5C b3VuZHMpe3ZhciBtaW5YWT10aGlzLm1hcC5nZXRMb25MYXRGcm9tUGl4ZWwobmV3 IE9wZW5MYXllcnMuUGl4ZWwocG9zaXRpb24ubGVmdCxwb3NpdGlvbi5ib3R0b20p KTt2YXIgbWF4WFk9dGhpcy5tYXAuZ2V0TG9uTGF0RnJvbVBpeGVsKG5ldyBPcGVu TGF5ZXJzLlBpeGVsKHBvc2l0aW9uLnJpZ2h0LHBvc2l0aW9uLnRvcCkpO3ZhciBi b3VuZHM9bmV3IE9wZW5MYXllcnMuQm91bmRzKG1pblhZLmxvbixtaW5YWS5sYXQs bWF4WFkubG9uLG1heFhZLmxhdCk7aWYoIXRoaXMubXVsdGlwbGVTZWxlY3QoKSl7 dGhpcy51bnNlbGVjdEFsbCgpO30KdmFyIHByZXZNdWx0aXBsZT10aGlzLm11bHRp cGxlO3RoaXMubXVsdGlwbGU9dHJ1ZTt2YXIgbGF5ZXJzPXRoaXMubGF5ZXJzfHxb dGhpcy5sYXllcl07dmFyIGxheWVyO2Zvcih2YXIgbD0wO2w8bGF5ZXJzLmxlbmd0 aDsrK2wpe2xheWVyPWxheWVyc1tsXTtmb3IodmFyIGk9MCxsZW49bGF5ZXIuZmVh dHVyZXMubGVuZ3RoO2k8bGVuOysraSl7dmFyIGZlYXR1cmU9bGF5ZXIuZmVhdHVy ZXNbaV07aWYoIWZlYXR1cmUuZ2V0VmlzaWJpbGl0eSgpKXtjb250aW51ZTt9Cmlm KHRoaXMuZ2VvbWV0cnlUeXBlcz09bnVsbHx8T3BlbkxheWVycy5VdGlsLmluZGV4 T2YodGhpcy5nZW9tZXRyeVR5cGVzLGZlYXR1cmUuZ2VvbWV0cnkuQ0xBU1NfTkFN RSk+LTEpe2lmKGJvdW5kcy50b0dlb21ldHJ5KCkuaW50ZXJzZWN0cyhmZWF0dXJl Lmdlb21ldHJ5KSl7aWYoT3BlbkxheWVycy5VdGlsLmluZGV4T2YobGF5ZXIuc2Vs ZWN0ZWRGZWF0dXJlcyxmZWF0dXJlKT09LTEpe3RoaXMuc2VsZWN0KGZlYXR1cmUp O319fX19CnRoaXMubXVsdGlwbGU9cHJldk11bHRpcGxlO319LHNldE1hcDpmdW5j dGlvbihtYXApe3RoaXMuaGFuZGxlcnMuZmVhdHVyZS5zZXRNYXAobWFwKTtpZih0 aGlzLmJveCl7dGhpcy5oYW5kbGVycy5ib3guc2V0TWFwKG1hcCk7fQpPcGVuTGF5 ZXJzLkNvbnRyb2wucHJvdG90eXBlLnNldE1hcC5hcHBseSh0aGlzLGFyZ3VtZW50 cyk7fSxzZXRMYXllcjpmdW5jdGlvbihsYXllcnMpe3ZhciBpc0FjdGl2ZT10aGlz LmFjdGl2ZTt0aGlzLnVuc2VsZWN0QWxsKCk7dGhpcy5kZWFjdGl2YXRlKCk7aWYo dGhpcy5sYXllcnMpe3RoaXMubGF5ZXIuZGVzdHJveSgpO3RoaXMubGF5ZXJzPW51 bGw7fQp0aGlzLmluaXRMYXllcihsYXllcnMpO3RoaXMuaGFuZGxlcnMuZmVhdHVy ZS5sYXllcj10aGlzLmxheWVyO2lmKGlzQWN0aXZlKXt0aGlzLmFjdGl2YXRlKCk7 fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Db250cm9sLlNlbGVjdEZlYXR1cmUi fSk7T3BlbkxheWVycy5IYW5kbGVyLktleWJvYXJkPU9wZW5MYXllcnMuQ2xhc3Mo T3BlbkxheWVycy5IYW5kbGVyLHtLRVlfRVZFTlRTOlsia2V5ZG93biIsImtleXVw Il0sZXZlbnRMaXN0ZW5lcjpudWxsLGluaXRpYWxpemU6ZnVuY3Rpb24oY29udHJv bCxjYWxsYmFja3Msb3B0aW9ucyl7T3BlbkxheWVycy5IYW5kbGVyLnByb3RvdHlw ZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmV2ZW50TGlz dGVuZXI9T3BlbkxheWVycy5GdW5jdGlvbi5iaW5kQXNFdmVudExpc3RlbmVyKHRo aXMuaGFuZGxlS2V5RXZlbnQsdGhpcyk7fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhp cy5kZWFjdGl2YXRlKCk7dGhpcy5ldmVudExpc3RlbmVyPW51bGw7T3BlbkxheWVy cy5IYW5kbGVyLnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRz KTt9LGFjdGl2YXRlOmZ1bmN0aW9uKCl7aWYoT3BlbkxheWVycy5IYW5kbGVyLnBy b3RvdHlwZS5hY3RpdmF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpe2Zvcih2YXIg aT0wLGxlbj10aGlzLktFWV9FVkVOVFMubGVuZ3RoO2k8bGVuO2krKyl7T3Blbkxh eWVycy5FdmVudC5vYnNlcnZlKGRvY3VtZW50LHRoaXMuS0VZX0VWRU5UU1tpXSx0 aGlzLmV2ZW50TGlzdGVuZXIpO30KcmV0dXJuIHRydWU7fWVsc2V7cmV0dXJuIGZh bHNlO319LGRlYWN0aXZhdGU6ZnVuY3Rpb24oKXt2YXIgZGVhY3RpdmF0ZWQ9ZmFs c2U7aWYoT3BlbkxheWVycy5IYW5kbGVyLnByb3RvdHlwZS5kZWFjdGl2YXRlLmFw cGx5KHRoaXMsYXJndW1lbnRzKSl7Zm9yKHZhciBpPTAsbGVuPXRoaXMuS0VZX0VW RU5UUy5sZW5ndGg7aTxsZW47aSsrKXtPcGVuTGF5ZXJzLkV2ZW50LnN0b3BPYnNl cnZpbmcoZG9jdW1lbnQsdGhpcy5LRVlfRVZFTlRTW2ldLHRoaXMuZXZlbnRMaXN0 ZW5lcik7fQpkZWFjdGl2YXRlZD10cnVlO30KcmV0dXJuIGRlYWN0aXZhdGVkO30s aGFuZGxlS2V5RXZlbnQ6ZnVuY3Rpb24oZXZ0KXtpZih0aGlzLmNoZWNrTW9kaWZp ZXJzKGV2dCkpe3RoaXMuY2FsbGJhY2soZXZ0LnR5cGUsW2V2dF0pO319LENMQVNT X05BTUU6Ik9wZW5MYXllcnMuSGFuZGxlci5LZXlib2FyZCJ9KTtPcGVuTGF5ZXJz LkNvbnRyb2wuTW9kaWZ5RmVhdHVyZT1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXll cnMuQ29udHJvbCx7Z2VvbWV0cnlUeXBlczpudWxsLGNsaWNrb3V0OnRydWUsdG9n Z2xlOnRydWUsc3RhbmRhbG9uZTpmYWxzZSxsYXllcjpudWxsLGZlYXR1cmU6bnVs bCx2ZXJ0aWNlczpudWxsLHZpcnR1YWxWZXJ0aWNlczpudWxsLHNlbGVjdENvbnRy b2w6bnVsbCxkcmFnQ29udHJvbDpudWxsLGhhbmRsZXJzOm51bGwsZGVsZXRlQ29k ZXM6bnVsbCx2aXJ0dWFsU3R5bGU6bnVsbCx2ZXJ0ZXhSZW5kZXJJbnRlbnQ6bnVs bCxtb2RlOm51bGwsbW9kaWZpZWQ6ZmFsc2UscmFkaXVzSGFuZGxlOm51bGwsZHJh Z0hhbmRsZTpudWxsLG9uTW9kaWZpY2F0aW9uU3RhcnQ6ZnVuY3Rpb24oKXt9LG9u TW9kaWZpY2F0aW9uOmZ1bmN0aW9uKCl7fSxvbk1vZGlmaWNhdGlvbkVuZDpmdW5j dGlvbigpe30saW5pdGlhbGl6ZTpmdW5jdGlvbihsYXllcixvcHRpb25zKXtvcHRp b25zPW9wdGlvbnN8fHt9O3RoaXMubGF5ZXI9bGF5ZXI7dGhpcy52ZXJ0aWNlcz1b XTt0aGlzLnZpcnR1YWxWZXJ0aWNlcz1bXTt0aGlzLnZpcnR1YWxTdHlsZT1PcGVu TGF5ZXJzLlV0aWwuZXh0ZW5kKHt9LHRoaXMubGF5ZXIuc3R5bGV8fHRoaXMubGF5 ZXIuc3R5bGVNYXAuY3JlYXRlU3ltYm9saXplcihudWxsLG9wdGlvbnMudmVydGV4 UmVuZGVySW50ZW50KSk7dGhpcy52aXJ0dWFsU3R5bGUuZmlsbE9wYWNpdHk9MC4z O3RoaXMudmlydHVhbFN0eWxlLnN0cm9rZU9wYWNpdHk9MC4zO3RoaXMuZGVsZXRl Q29kZXM9WzQ2LDY4XTt0aGlzLm1vZGU9T3BlbkxheWVycy5Db250cm9sLk1vZGlm eUZlYXR1cmUuUkVTSEFQRTtPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90eXBlLmlu aXRpYWxpemUuYXBwbHkodGhpcyxbb3B0aW9uc10pO2lmKCEoT3BlbkxheWVycy5V dGlsLmlzQXJyYXkodGhpcy5kZWxldGVDb2RlcykpKXt0aGlzLmRlbGV0ZUNvZGVz PVt0aGlzLmRlbGV0ZUNvZGVzXTt9CnZhciBjb250cm9sPXRoaXM7dmFyIHNlbGVj dE9wdGlvbnM9e2dlb21ldHJ5VHlwZXM6dGhpcy5nZW9tZXRyeVR5cGVzLGNsaWNr b3V0OnRoaXMuY2xpY2tvdXQsdG9nZ2xlOnRoaXMudG9nZ2xlLG9uQmVmb3JlU2Vs ZWN0OnRoaXMuYmVmb3JlU2VsZWN0RmVhdHVyZSxvblNlbGVjdDp0aGlzLnNlbGVj dEZlYXR1cmUsb25VbnNlbGVjdDp0aGlzLnVuc2VsZWN0RmVhdHVyZSxzY29wZTp0 aGlzfTtpZih0aGlzLnN0YW5kYWxvbmU9PT1mYWxzZSl7dGhpcy5zZWxlY3RDb250 cm9sPW5ldyBPcGVuTGF5ZXJzLkNvbnRyb2wuU2VsZWN0RmVhdHVyZShsYXllcixz ZWxlY3RPcHRpb25zKTt9CnZhciBkcmFnT3B0aW9ucz17Z2VvbWV0cnlUeXBlczpb Ik9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQiXSxzbmFwcGluZ09wdGlvbnM6dGhp cy5zbmFwcGluZ09wdGlvbnMsb25TdGFydDpmdW5jdGlvbihmZWF0dXJlLHBpeGVs KXtjb250cm9sLmRyYWdTdGFydC5hcHBseShjb250cm9sLFtmZWF0dXJlLHBpeGVs XSk7fSxvbkRyYWc6ZnVuY3Rpb24oZmVhdHVyZSxwaXhlbCl7Y29udHJvbC5kcmFn VmVydGV4LmFwcGx5KGNvbnRyb2wsW2ZlYXR1cmUscGl4ZWxdKTt9LG9uQ29tcGxl dGU6ZnVuY3Rpb24oZmVhdHVyZSl7Y29udHJvbC5kcmFnQ29tcGxldGUuYXBwbHko Y29udHJvbCxbZmVhdHVyZV0pO30sZmVhdHVyZUNhbGxiYWNrczp7b3ZlcjpmdW5j dGlvbihmZWF0dXJlKXtpZihjb250cm9sLnN0YW5kYWxvbmUhPT10cnVlfHxmZWF0 dXJlLl9za2V0Y2h8fGNvbnRyb2wuZmVhdHVyZT09PWZlYXR1cmUpe2NvbnRyb2wu ZHJhZ0NvbnRyb2wub3ZlckZlYXR1cmUuYXBwbHkoY29udHJvbC5kcmFnQ29udHJv bCxbZmVhdHVyZV0pO319fX07dGhpcy5kcmFnQ29udHJvbD1uZXcgT3BlbkxheWVy cy5Db250cm9sLkRyYWdGZWF0dXJlKGxheWVyLGRyYWdPcHRpb25zKTt2YXIga2V5 Ym9hcmRPcHRpb25zPXtrZXlkb3duOnRoaXMuaGFuZGxlS2V5cHJlc3N9O3RoaXMu aGFuZGxlcnM9e2tleWJvYXJkOm5ldyBPcGVuTGF5ZXJzLkhhbmRsZXIuS2V5Ym9h cmQodGhpcyxrZXlib2FyZE9wdGlvbnMpfTt9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0 aGlzLmxheWVyPW51bGw7dGhpcy5zdGFuZGFsb25lfHx0aGlzLnNlbGVjdENvbnRy b2wuZGVzdHJveSgpO3RoaXMuZHJhZ0NvbnRyb2wuZGVzdHJveSgpO09wZW5MYXll cnMuQ29udHJvbC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLFtdKTt9LGFj dGl2YXRlOmZ1bmN0aW9uKCl7cmV0dXJuKCh0aGlzLnN0YW5kYWxvbmV8fHRoaXMu c2VsZWN0Q29udHJvbC5hY3RpdmF0ZSgpKSYmdGhpcy5oYW5kbGVycy5rZXlib2Fy ZC5hY3RpdmF0ZSgpJiZPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90eXBlLmFjdGl2 YXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7fSxkZWFjdGl2YXRlOmZ1bmN0aW9u KCl7dmFyIGRlYWN0aXZhdGVkPWZhbHNlO2lmKE9wZW5MYXllcnMuQ29udHJvbC5w cm90b3R5cGUuZGVhY3RpdmF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3RoaXMu bGF5ZXIucmVtb3ZlRmVhdHVyZXModGhpcy52ZXJ0aWNlcyx7c2lsZW50OnRydWV9 KTt0aGlzLmxheWVyLnJlbW92ZUZlYXR1cmVzKHRoaXMudmlydHVhbFZlcnRpY2Vz LHtzaWxlbnQ6dHJ1ZX0pO3RoaXMudmVydGljZXM9W107dGhpcy5kcmFnQ29udHJv bC5kZWFjdGl2YXRlKCk7dmFyIGZlYXR1cmU9dGhpcy5mZWF0dXJlO3ZhciB2YWxp ZD1mZWF0dXJlJiZmZWF0dXJlLmdlb21ldHJ5JiZmZWF0dXJlLmxheWVyO2lmKHRo aXMuc3RhbmRhbG9uZT09PWZhbHNlKXtpZih2YWxpZCl7dGhpcy5zZWxlY3RDb250 cm9sLnVuc2VsZWN0LmFwcGx5KHRoaXMuc2VsZWN0Q29udHJvbCxbZmVhdHVyZV0p O30KdGhpcy5zZWxlY3RDb250cm9sLmRlYWN0aXZhdGUoKTt9ZWxzZXtpZih2YWxp ZCl7dGhpcy51bnNlbGVjdEZlYXR1cmUoZmVhdHVyZSk7fX0KdGhpcy5oYW5kbGVy cy5rZXlib2FyZC5kZWFjdGl2YXRlKCk7ZGVhY3RpdmF0ZWQ9dHJ1ZTt9CnJldHVy biBkZWFjdGl2YXRlZDt9LGJlZm9yZVNlbGVjdEZlYXR1cmU6ZnVuY3Rpb24oZmVh dHVyZSl7cmV0dXJuIHRoaXMubGF5ZXIuZXZlbnRzLnRyaWdnZXJFdmVudCgiYmVm b3JlZmVhdHVyZW1vZGlmaWVkIix7ZmVhdHVyZTpmZWF0dXJlfSk7fSxzZWxlY3RG ZWF0dXJlOmZ1bmN0aW9uKGZlYXR1cmUpe2lmKCF0aGlzLnN0YW5kYWxvbmV8fHRo aXMuYmVmb3JlU2VsZWN0RmVhdHVyZShmZWF0dXJlKSE9PWZhbHNlKXt0aGlzLmZl YXR1cmU9ZmVhdHVyZTt0aGlzLm1vZGlmaWVkPWZhbHNlO3RoaXMucmVzZXRWZXJ0 aWNlcygpO3RoaXMuZHJhZ0NvbnRyb2wuYWN0aXZhdGUoKTt0aGlzLm9uTW9kaWZp Y2F0aW9uU3RhcnQodGhpcy5mZWF0dXJlKTt9CnZhciBtb2RpZmllZD1mZWF0dXJl Lm1vZGlmaWVkO2lmKGZlYXR1cmUuZ2VvbWV0cnkmJiEobW9kaWZpZWQmJm1vZGlm aWVkLmdlb21ldHJ5KSl7dGhpcy5fb3JpZ2luYWxHZW9tZXRyeT1mZWF0dXJlLmdl b21ldHJ5LmNsb25lKCk7fX0sdW5zZWxlY3RGZWF0dXJlOmZ1bmN0aW9uKGZlYXR1 cmUpe3RoaXMubGF5ZXIucmVtb3ZlRmVhdHVyZXModGhpcy52ZXJ0aWNlcyx7c2ls ZW50OnRydWV9KTt0aGlzLnZlcnRpY2VzPVtdO3RoaXMubGF5ZXIuZGVzdHJveUZl YXR1cmVzKHRoaXMudmlydHVhbFZlcnRpY2VzLHtzaWxlbnQ6dHJ1ZX0pO3RoaXMu dmlydHVhbFZlcnRpY2VzPVtdO2lmKHRoaXMuZHJhZ0hhbmRsZSl7dGhpcy5sYXll ci5kZXN0cm95RmVhdHVyZXMoW3RoaXMuZHJhZ0hhbmRsZV0se3NpbGVudDp0cnVl fSk7ZGVsZXRlIHRoaXMuZHJhZ0hhbmRsZTt9CmlmKHRoaXMucmFkaXVzSGFuZGxl KXt0aGlzLmxheWVyLmRlc3Ryb3lGZWF0dXJlcyhbdGhpcy5yYWRpdXNIYW5kbGVd LHtzaWxlbnQ6dHJ1ZX0pO2RlbGV0ZSB0aGlzLnJhZGl1c0hhbmRsZTt9CnRoaXMu ZmVhdHVyZT1udWxsO3RoaXMuZHJhZ0NvbnRyb2wuZGVhY3RpdmF0ZSgpO3RoaXMu b25Nb2RpZmljYXRpb25FbmQoZmVhdHVyZSk7dGhpcy5sYXllci5ldmVudHMudHJp Z2dlckV2ZW50KCJhZnRlcmZlYXR1cmVtb2RpZmllZCIse2ZlYXR1cmU6ZmVhdHVy ZSxtb2RpZmllZDp0aGlzLm1vZGlmaWVkfSk7dGhpcy5tb2RpZmllZD1mYWxzZTt9 LGRyYWdTdGFydDpmdW5jdGlvbihmZWF0dXJlLHBpeGVsKXtpZihmZWF0dXJlIT10 aGlzLmZlYXR1cmUmJiFmZWF0dXJlLmdlb21ldHJ5LnBhcmVudCYmZmVhdHVyZSE9 dGhpcy5kcmFnSGFuZGxlJiZmZWF0dXJlIT10aGlzLnJhZGl1c0hhbmRsZSl7aWYo dGhpcy5zdGFuZGFsb25lPT09ZmFsc2UmJnRoaXMuZmVhdHVyZSl7dGhpcy5zZWxl Y3RDb250cm9sLmNsaWNrRmVhdHVyZS5hcHBseSh0aGlzLnNlbGVjdENvbnRyb2ws W3RoaXMuZmVhdHVyZV0pO30KaWYodGhpcy5nZW9tZXRyeVR5cGVzPT1udWxsfHxP cGVuTGF5ZXJzLlV0aWwuaW5kZXhPZih0aGlzLmdlb21ldHJ5VHlwZXMsZmVhdHVy ZS5nZW9tZXRyeS5DTEFTU19OQU1FKSE9LTEpe3RoaXMuc3RhbmRhbG9uZXx8dGhp cy5zZWxlY3RDb250cm9sLmNsaWNrRmVhdHVyZS5hcHBseSh0aGlzLnNlbGVjdENv bnRyb2wsW2ZlYXR1cmVdKTt0aGlzLmRyYWdDb250cm9sLm92ZXJGZWF0dXJlLmFw cGx5KHRoaXMuZHJhZ0NvbnRyb2wsW2ZlYXR1cmVdKTt0aGlzLmRyYWdDb250cm9s Lmxhc3RQaXhlbD1waXhlbDt0aGlzLmRyYWdDb250cm9sLmhhbmRsZXJzLmRyYWcu c3RhcnRlZD10cnVlO3RoaXMuZHJhZ0NvbnRyb2wuaGFuZGxlcnMuZHJhZy5zdGFy dD1waXhlbDt0aGlzLmRyYWdDb250cm9sLmhhbmRsZXJzLmRyYWcubGFzdD1waXhl bDt9fX0sZHJhZ1ZlcnRleDpmdW5jdGlvbih2ZXJ0ZXgscGl4ZWwpe3RoaXMubW9k aWZpZWQ9dHJ1ZTtpZih0aGlzLmZlYXR1cmUuZ2VvbWV0cnkuQ0xBU1NfTkFNRT09 Ik9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQiKXtpZih0aGlzLmZlYXR1cmUhPXZl cnRleCl7dGhpcy5mZWF0dXJlPXZlcnRleDt9CnRoaXMubGF5ZXIuZXZlbnRzLnRy aWdnZXJFdmVudCgidmVydGV4bW9kaWZpZWQiLHt2ZXJ0ZXg6dmVydGV4Lmdlb21l dHJ5LGZlYXR1cmU6dGhpcy5mZWF0dXJlLHBpeGVsOnBpeGVsfSk7fWVsc2V7aWYo dmVydGV4Ll9pbmRleCl7dmVydGV4Lmdlb21ldHJ5LnBhcmVudC5hZGRDb21wb25l bnQodmVydGV4Lmdlb21ldHJ5LHZlcnRleC5faW5kZXgpO2RlbGV0ZSB2ZXJ0ZXgu X2luZGV4O09wZW5MYXllcnMuVXRpbC5yZW1vdmVJdGVtKHRoaXMudmlydHVhbFZl cnRpY2VzLHZlcnRleCk7dGhpcy52ZXJ0aWNlcy5wdXNoKHZlcnRleCk7fWVsc2Ug aWYodmVydGV4PT10aGlzLmRyYWdIYW5kbGUpe3RoaXMubGF5ZXIucmVtb3ZlRmVh dHVyZXModGhpcy52ZXJ0aWNlcyx7c2lsZW50OnRydWV9KTt0aGlzLnZlcnRpY2Vz PVtdO2lmKHRoaXMucmFkaXVzSGFuZGxlKXt0aGlzLmxheWVyLmRlc3Ryb3lGZWF0 dXJlcyhbdGhpcy5yYWRpdXNIYW5kbGVdLHtzaWxlbnQ6dHJ1ZX0pO3RoaXMucmFk aXVzSGFuZGxlPW51bGw7fX1lbHNlIGlmKHZlcnRleCE9PXRoaXMucmFkaXVzSGFu ZGxlKXt0aGlzLmxheWVyLmV2ZW50cy50cmlnZ2VyRXZlbnQoInZlcnRleG1vZGlm aWVkIix7dmVydGV4OnZlcnRleC5nZW9tZXRyeSxmZWF0dXJlOnRoaXMuZmVhdHVy ZSxwaXhlbDpwaXhlbH0pO30KaWYodGhpcy52aXJ0dWFsVmVydGljZXMubGVuZ3Ro PjApe3RoaXMubGF5ZXIuZGVzdHJveUZlYXR1cmVzKHRoaXMudmlydHVhbFZlcnRp Y2VzLHtzaWxlbnQ6dHJ1ZX0pO3RoaXMudmlydHVhbFZlcnRpY2VzPVtdO30KdGhp cy5sYXllci5kcmF3RmVhdHVyZSh0aGlzLmZlYXR1cmUsdGhpcy5zdGFuZGFsb25l P3VuZGVmaW5lZDp0aGlzLnNlbGVjdENvbnRyb2wucmVuZGVySW50ZW50KTt9CnRo aXMubGF5ZXIuZHJhd0ZlYXR1cmUodmVydGV4KTt9LGRyYWdDb21wbGV0ZTpmdW5j dGlvbih2ZXJ0ZXgpe3RoaXMucmVzZXRWZXJ0aWNlcygpO3RoaXMuc2V0RmVhdHVy ZVN0YXRlKCk7dGhpcy5vbk1vZGlmaWNhdGlvbih0aGlzLmZlYXR1cmUpO3RoaXMu bGF5ZXIuZXZlbnRzLnRyaWdnZXJFdmVudCgiZmVhdHVyZW1vZGlmaWVkIix7ZmVh dHVyZTp0aGlzLmZlYXR1cmV9KTt9LHNldEZlYXR1cmVTdGF0ZTpmdW5jdGlvbigp e2lmKHRoaXMuZmVhdHVyZS5zdGF0ZSE9T3BlbkxheWVycy5TdGF0ZS5JTlNFUlQm JnRoaXMuZmVhdHVyZS5zdGF0ZSE9T3BlbkxheWVycy5TdGF0ZS5ERUxFVEUpe3Ro aXMuZmVhdHVyZS5zdGF0ZT1PcGVuTGF5ZXJzLlN0YXRlLlVQREFURTtpZih0aGlz Lm1vZGlmaWVkJiZ0aGlzLl9vcmlnaW5hbEdlb21ldHJ5KXt2YXIgZmVhdHVyZT10 aGlzLmZlYXR1cmU7ZmVhdHVyZS5tb2RpZmllZD1PcGVuTGF5ZXJzLlV0aWwuZXh0 ZW5kKGZlYXR1cmUubW9kaWZpZWQse2dlb21ldHJ5OnRoaXMuX29yaWdpbmFsR2Vv bWV0cnl9KTtkZWxldGUgdGhpcy5fb3JpZ2luYWxHZW9tZXRyeTt9fX0scmVzZXRW ZXJ0aWNlczpmdW5jdGlvbigpe2lmKHRoaXMuZHJhZ0NvbnRyb2wuZmVhdHVyZSl7 dGhpcy5kcmFnQ29udHJvbC5vdXRGZWF0dXJlKHRoaXMuZHJhZ0NvbnRyb2wuZmVh dHVyZSk7fQppZih0aGlzLnZlcnRpY2VzLmxlbmd0aD4wKXt0aGlzLmxheWVyLnJl bW92ZUZlYXR1cmVzKHRoaXMudmVydGljZXMse3NpbGVudDp0cnVlfSk7dGhpcy52 ZXJ0aWNlcz1bXTt9CmlmKHRoaXMudmlydHVhbFZlcnRpY2VzLmxlbmd0aD4wKXt0 aGlzLmxheWVyLnJlbW92ZUZlYXR1cmVzKHRoaXMudmlydHVhbFZlcnRpY2VzLHtz aWxlbnQ6dHJ1ZX0pO3RoaXMudmlydHVhbFZlcnRpY2VzPVtdO30KaWYodGhpcy5k cmFnSGFuZGxlKXt0aGlzLmxheWVyLmRlc3Ryb3lGZWF0dXJlcyhbdGhpcy5kcmFn SGFuZGxlXSx7c2lsZW50OnRydWV9KTt0aGlzLmRyYWdIYW5kbGU9bnVsbDt9Cmlm KHRoaXMucmFkaXVzSGFuZGxlKXt0aGlzLmxheWVyLmRlc3Ryb3lGZWF0dXJlcyhb dGhpcy5yYWRpdXNIYW5kbGVdLHtzaWxlbnQ6dHJ1ZX0pO3RoaXMucmFkaXVzSGFu ZGxlPW51bGw7fQppZih0aGlzLmZlYXR1cmUmJnRoaXMuZmVhdHVyZS5nZW9tZXRy eS5DTEFTU19OQU1FIT0iT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCIpe2lmKCh0 aGlzLm1vZGUmT3BlbkxheWVycy5Db250cm9sLk1vZGlmeUZlYXR1cmUuRFJBRykp e3RoaXMuY29sbGVjdERyYWdIYW5kbGUoKTt9CmlmKCh0aGlzLm1vZGUmKE9wZW5M YXllcnMuQ29udHJvbC5Nb2RpZnlGZWF0dXJlLlJPVEFURXxPcGVuTGF5ZXJzLkNv bnRyb2wuTW9kaWZ5RmVhdHVyZS5SRVNJWkUpKSl7dGhpcy5jb2xsZWN0UmFkaXVz SGFuZGxlKCk7fQppZih0aGlzLm1vZGUmT3BlbkxheWVycy5Db250cm9sLk1vZGlm eUZlYXR1cmUuUkVTSEFQRSl7aWYoISh0aGlzLm1vZGUmT3BlbkxheWVycy5Db250 cm9sLk1vZGlmeUZlYXR1cmUuUkVTSVpFKSl7dGhpcy5jb2xsZWN0VmVydGljZXMo KTt9fX19LGhhbmRsZUtleXByZXNzOmZ1bmN0aW9uKGV2dCl7dmFyIGNvZGU9ZXZ0 LmtleUNvZGU7aWYodGhpcy5mZWF0dXJlJiZPcGVuTGF5ZXJzLlV0aWwuaW5kZXhP Zih0aGlzLmRlbGV0ZUNvZGVzLGNvZGUpIT0tMSl7dmFyIHZlcnRleD10aGlzLmRy YWdDb250cm9sLmZlYXR1cmU7aWYodmVydGV4JiZPcGVuTGF5ZXJzLlV0aWwuaW5k ZXhPZih0aGlzLnZlcnRpY2VzLHZlcnRleCkhPS0xJiYhdGhpcy5kcmFnQ29udHJv bC5oYW5kbGVycy5kcmFnLmRyYWdnaW5nJiZ2ZXJ0ZXguZ2VvbWV0cnkucGFyZW50 KXt2ZXJ0ZXguZ2VvbWV0cnkucGFyZW50LnJlbW92ZUNvbXBvbmVudCh2ZXJ0ZXgu Z2VvbWV0cnkpO3RoaXMubGF5ZXIuZXZlbnRzLnRyaWdnZXJFdmVudCgidmVydGV4 cmVtb3ZlZCIse3ZlcnRleDp2ZXJ0ZXguZ2VvbWV0cnksZmVhdHVyZTp0aGlzLmZl YXR1cmUscGl4ZWw6ZXZ0Lnh5fSk7dGhpcy5sYXllci5kcmF3RmVhdHVyZSh0aGlz LmZlYXR1cmUsdGhpcy5zdGFuZGFsb25lP3VuZGVmaW5lZDp0aGlzLnNlbGVjdENv bnRyb2wucmVuZGVySW50ZW50KTt0aGlzLm1vZGlmaWVkPXRydWU7dGhpcy5yZXNl dFZlcnRpY2VzKCk7dGhpcy5zZXRGZWF0dXJlU3RhdGUoKTt0aGlzLm9uTW9kaWZp Y2F0aW9uKHRoaXMuZmVhdHVyZSk7dGhpcy5sYXllci5ldmVudHMudHJpZ2dlckV2 ZW50KCJmZWF0dXJlbW9kaWZpZWQiLHtmZWF0dXJlOnRoaXMuZmVhdHVyZX0pO319 fSxjb2xsZWN0VmVydGljZXM6ZnVuY3Rpb24oKXt0aGlzLnZlcnRpY2VzPVtdO3Ro aXMudmlydHVhbFZlcnRpY2VzPVtdO3ZhciBjb250cm9sPXRoaXM7ZnVuY3Rpb24g Y29sbGVjdENvbXBvbmVudFZlcnRpY2VzKGdlb21ldHJ5KXt2YXIgaSx2ZXJ0ZXgs Y29tcG9uZW50LGxlbjtpZihnZW9tZXRyeS5DTEFTU19OQU1FPT0iT3BlbkxheWVy cy5HZW9tZXRyeS5Qb2ludCIpe3ZlcnRleD1uZXcgT3BlbkxheWVycy5GZWF0dXJl LlZlY3RvcihnZW9tZXRyeSk7dmVydGV4Ll9za2V0Y2g9dHJ1ZTt2ZXJ0ZXgucmVu ZGVySW50ZW50PWNvbnRyb2wudmVydGV4UmVuZGVySW50ZW50O2NvbnRyb2wudmVy dGljZXMucHVzaCh2ZXJ0ZXgpO31lbHNle3ZhciBudW1WZXJ0PWdlb21ldHJ5LmNv bXBvbmVudHMubGVuZ3RoO2lmKGdlb21ldHJ5LkNMQVNTX05BTUU9PSJPcGVuTGF5 ZXJzLkdlb21ldHJ5LkxpbmVhclJpbmciKXtudW1WZXJ0LT0xO30KZm9yKGk9MDtp PG51bVZlcnQ7KytpKXtjb21wb25lbnQ9Z2VvbWV0cnkuY29tcG9uZW50c1tpXTtp Zihjb21wb25lbnQuQ0xBU1NfTkFNRT09Ik9wZW5MYXllcnMuR2VvbWV0cnkuUG9p bnQiKXt2ZXJ0ZXg9bmV3IE9wZW5MYXllcnMuRmVhdHVyZS5WZWN0b3IoY29tcG9u ZW50KTt2ZXJ0ZXguX3NrZXRjaD10cnVlO3ZlcnRleC5yZW5kZXJJbnRlbnQ9Y29u dHJvbC52ZXJ0ZXhSZW5kZXJJbnRlbnQ7Y29udHJvbC52ZXJ0aWNlcy5wdXNoKHZl cnRleCk7fWVsc2V7Y29sbGVjdENvbXBvbmVudFZlcnRpY2VzKGNvbXBvbmVudCk7 fX0KaWYoZ2VvbWV0cnkuQ0xBU1NfTkFNRSE9Ik9wZW5MYXllcnMuR2VvbWV0cnku TXVsdGlQb2ludCIpe2ZvcihpPTAsbGVuPWdlb21ldHJ5LmNvbXBvbmVudHMubGVu Z3RoO2k8bGVuLTE7KytpKXt2YXIgcHJldlZlcnRleD1nZW9tZXRyeS5jb21wb25l bnRzW2ldO3ZhciBuZXh0VmVydGV4PWdlb21ldHJ5LmNvbXBvbmVudHNbaSsxXTtp ZihwcmV2VmVydGV4LkNMQVNTX05BTUU9PSJPcGVuTGF5ZXJzLkdlb21ldHJ5LlBv aW50IiYmbmV4dFZlcnRleC5DTEFTU19OQU1FPT0iT3BlbkxheWVycy5HZW9tZXRy eS5Qb2ludCIpe3ZhciB4PShwcmV2VmVydGV4LngrbmV4dFZlcnRleC54KS8yO3Zh ciB5PShwcmV2VmVydGV4LnkrbmV4dFZlcnRleC55KS8yO3ZhciBwb2ludD1uZXcg T3BlbkxheWVycy5GZWF0dXJlLlZlY3RvcihuZXcgT3BlbkxheWVycy5HZW9tZXRy eS5Qb2ludCh4LHkpLG51bGwsY29udHJvbC52aXJ0dWFsU3R5bGUpO3BvaW50Lmdl b21ldHJ5LnBhcmVudD1nZW9tZXRyeTtwb2ludC5faW5kZXg9aSsxO3BvaW50Ll9z a2V0Y2g9dHJ1ZTtjb250cm9sLnZpcnR1YWxWZXJ0aWNlcy5wdXNoKHBvaW50KTt9 fX19fQpjb2xsZWN0Q29tcG9uZW50VmVydGljZXMuY2FsbCh0aGlzLHRoaXMuZmVh dHVyZS5nZW9tZXRyeSk7dGhpcy5sYXllci5hZGRGZWF0dXJlcyh0aGlzLnZpcnR1 YWxWZXJ0aWNlcyx7c2lsZW50OnRydWV9KTt0aGlzLmxheWVyLmFkZEZlYXR1cmVz KHRoaXMudmVydGljZXMse3NpbGVudDp0cnVlfSk7fSxjb2xsZWN0RHJhZ0hhbmRs ZTpmdW5jdGlvbigpe3ZhciBnZW9tZXRyeT10aGlzLmZlYXR1cmUuZ2VvbWV0cnk7 dmFyIGNlbnRlcj1nZW9tZXRyeS5nZXRCb3VuZHMoKS5nZXRDZW50ZXJMb25MYXQo KTt2YXIgb3JpZ2luR2VvbWV0cnk9bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9p bnQoY2VudGVyLmxvbixjZW50ZXIubGF0KTt2YXIgb3JpZ2luPW5ldyBPcGVuTGF5 ZXJzLkZlYXR1cmUuVmVjdG9yKG9yaWdpbkdlb21ldHJ5KTtvcmlnaW5HZW9tZXRy eS5tb3ZlPWZ1bmN0aW9uKHgseSl7T3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludC5w cm90b3R5cGUubW92ZS5jYWxsKHRoaXMseCx5KTtnZW9tZXRyeS5tb3ZlKHgseSk7 fTtvcmlnaW4uX3NrZXRjaD10cnVlO3RoaXMuZHJhZ0hhbmRsZT1vcmlnaW47dGhp cy5sYXllci5hZGRGZWF0dXJlcyhbdGhpcy5kcmFnSGFuZGxlXSx7c2lsZW50OnRy dWV9KTt9LGNvbGxlY3RSYWRpdXNIYW5kbGU6ZnVuY3Rpb24oKXt2YXIgZ2VvbWV0 cnk9dGhpcy5mZWF0dXJlLmdlb21ldHJ5O3ZhciBib3VuZHM9Z2VvbWV0cnkuZ2V0 Qm91bmRzKCk7dmFyIGNlbnRlcj1ib3VuZHMuZ2V0Q2VudGVyTG9uTGF0KCk7dmFy IG9yaWdpbkdlb21ldHJ5PW5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KGNl bnRlci5sb24sY2VudGVyLmxhdCk7dmFyIHJhZGl1c0dlb21ldHJ5PW5ldyBPcGVu TGF5ZXJzLkdlb21ldHJ5LlBvaW50KGJvdW5kcy5yaWdodCxib3VuZHMuYm90dG9t KTt2YXIgcmFkaXVzPW5ldyBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9yKHJhZGl1 c0dlb21ldHJ5KTt2YXIgcmVzaXplPSh0aGlzLm1vZGUmT3BlbkxheWVycy5Db250 cm9sLk1vZGlmeUZlYXR1cmUuUkVTSVpFKTt2YXIgcmVzaGFwZT0odGhpcy5tb2Rl Jk9wZW5MYXllcnMuQ29udHJvbC5Nb2RpZnlGZWF0dXJlLlJFU0hBUEUpO3ZhciBy b3RhdGU9KHRoaXMubW9kZSZPcGVuTGF5ZXJzLkNvbnRyb2wuTW9kaWZ5RmVhdHVy ZS5ST1RBVEUpO3JhZGl1c0dlb21ldHJ5Lm1vdmU9ZnVuY3Rpb24oeCx5KXtPcGVu TGF5ZXJzLkdlb21ldHJ5LlBvaW50LnByb3RvdHlwZS5tb3ZlLmNhbGwodGhpcyx4 LHkpO3ZhciBkeDE9dGhpcy54LW9yaWdpbkdlb21ldHJ5Lng7dmFyIGR5MT10aGlz Lnktb3JpZ2luR2VvbWV0cnkueTt2YXIgZHgwPWR4MS14O3ZhciBkeTA9ZHkxLXk7 aWYocm90YXRlKXt2YXIgYTA9TWF0aC5hdGFuMihkeTAsZHgwKTt2YXIgYTE9TWF0 aC5hdGFuMihkeTEsZHgxKTt2YXIgYW5nbGU9YTEtYTA7YW5nbGUqPTE4MC9NYXRo LlBJO2dlb21ldHJ5LnJvdGF0ZShhbmdsZSxvcmlnaW5HZW9tZXRyeSk7fQppZihy ZXNpemUpe3ZhciBzY2FsZSxyYXRpbztpZihyZXNoYXBlKXtzY2FsZT1keTEvZHkw O3JhdGlvPShkeDEvZHgwKS9zY2FsZTt9ZWxzZXt2YXIgbDA9TWF0aC5zcXJ0KChk eDAqZHgwKSsoZHkwKmR5MCkpO3ZhciBsMT1NYXRoLnNxcnQoKGR4MSpkeDEpKyhk eTEqZHkxKSk7c2NhbGU9bDEvbDA7fQpnZW9tZXRyeS5yZXNpemUoc2NhbGUsb3Jp Z2luR2VvbWV0cnkscmF0aW8pO319O3JhZGl1cy5fc2tldGNoPXRydWU7dGhpcy5y YWRpdXNIYW5kbGU9cmFkaXVzO3RoaXMubGF5ZXIuYWRkRmVhdHVyZXMoW3RoaXMu cmFkaXVzSGFuZGxlXSx7c2lsZW50OnRydWV9KTt9LHNldE1hcDpmdW5jdGlvbiht YXApe3RoaXMuc3RhbmRhbG9uZXx8dGhpcy5zZWxlY3RDb250cm9sLnNldE1hcCht YXApO3RoaXMuZHJhZ0NvbnRyb2wuc2V0TWFwKG1hcCk7T3BlbkxheWVycy5Db250 cm9sLnByb3RvdHlwZS5zZXRNYXAuYXBwbHkodGhpcyxhcmd1bWVudHMpO30sQ0xB U1NfTkFNRToiT3BlbkxheWVycy5Db250cm9sLk1vZGlmeUZlYXR1cmUifSk7T3Bl bkxheWVycy5Db250cm9sLk1vZGlmeUZlYXR1cmUuUkVTSEFQRT0xO09wZW5MYXll cnMuQ29udHJvbC5Nb2RpZnlGZWF0dXJlLlJFU0laRT0yO09wZW5MYXllcnMuQ29u dHJvbC5Nb2RpZnlGZWF0dXJlLlJPVEFURT00O09wZW5MYXllcnMuQ29udHJvbC5N b2RpZnlGZWF0dXJlLkRSQUc9ODtPcGVuTGF5ZXJzLkxheWVyLlhZWj1PcGVuTGF5 ZXJzLkNsYXNzKE9wZW5MYXllcnMuTGF5ZXIuR3JpZCx7aXNCYXNlTGF5ZXI6dHJ1 ZSxzcGhlcmljYWxNZXJjYXRvcjpmYWxzZSx6b29tT2Zmc2V0OjAsc2VydmVyUmVz b2x1dGlvbnM6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKG5hbWUsdXJsLG9wdGlv bnMpe2lmKG9wdGlvbnMmJm9wdGlvbnMuc3BoZXJpY2FsTWVyY2F0b3J8fHRoaXMu c3BoZXJpY2FsTWVyY2F0b3Ipe29wdGlvbnM9T3BlbkxheWVycy5VdGlsLmV4dGVu ZCh7bWF4RXh0ZW50Om5ldyBPcGVuTGF5ZXJzLkJvdW5kcygtMTI4KjE1NjU0My4w MzM5MDYyNSwtMTI4KjE1NjU0My4wMzM5MDYyNSwxMjgqMTU2NTQzLjAzMzkwNjI1 LDEyOCoxNTY1NDMuMDMzOTA2MjUpLG1heFJlc29sdXRpb246MTU2NTQzLjAzMzkw NjI1LG51bVpvb21MZXZlbHM6MTksdW5pdHM6Im0iLHByb2plY3Rpb246IkVQU0c6 OTAwOTEzIn0sb3B0aW9ucyk7fQp1cmw9dXJsfHx0aGlzLnVybDtuYW1lPW5hbWV8 fHRoaXMubmFtZTt2YXIgbmV3QXJndW1lbnRzPVtuYW1lLHVybCx7fSxvcHRpb25z XTtPcGVuTGF5ZXJzLkxheWVyLkdyaWQucHJvdG90eXBlLmluaXRpYWxpemUuYXBw bHkodGhpcyxuZXdBcmd1bWVudHMpO30sY2xvbmU6ZnVuY3Rpb24ob2JqKXtpZihv Ymo9PW51bGwpe29iaj1uZXcgT3BlbkxheWVycy5MYXllci5YWVoodGhpcy5uYW1l LHRoaXMudXJsLHRoaXMuZ2V0T3B0aW9ucygpKTt9Cm9iaj1PcGVuTGF5ZXJzLkxh eWVyLkdyaWQucHJvdG90eXBlLmNsb25lLmFwcGx5KHRoaXMsW29ial0pO3JldHVy biBvYmo7fSxnZXRVUkw6ZnVuY3Rpb24oYm91bmRzKXt2YXIgeHl6PXRoaXMuZ2V0 WFlaKGJvdW5kcyk7dmFyIHVybD10aGlzLnVybDtpZihPcGVuTGF5ZXJzLlV0aWwu aXNBcnJheSh1cmwpKXt2YXIgcz0nJyt4eXoueCt4eXoueSt4eXouejt1cmw9dGhp cy5zZWxlY3RVcmwocyx1cmwpO30KcmV0dXJuIE9wZW5MYXllcnMuU3RyaW5nLmZv cm1hdCh1cmwseHl6KTt9LGdldFhZWjpmdW5jdGlvbihib3VuZHMpe3ZhciByZXM9 dGhpcy5tYXAuZ2V0UmVzb2x1dGlvbigpO3ZhciB4PU1hdGgucm91bmQoKGJvdW5k cy5sZWZ0LXRoaXMubWF4RXh0ZW50LmxlZnQpLyhyZXMqdGhpcy50aWxlU2l6ZS53 KSk7dmFyIHk9TWF0aC5yb3VuZCgodGhpcy5tYXhFeHRlbnQudG9wLWJvdW5kcy50 b3ApLyhyZXMqdGhpcy50aWxlU2l6ZS5oKSk7dmFyIHo9dGhpcy5zZXJ2ZXJSZXNv bHV0aW9ucyE9bnVsbD9PcGVuTGF5ZXJzLlV0aWwuaW5kZXhPZih0aGlzLnNlcnZl clJlc29sdXRpb25zLHJlcyk6dGhpcy5tYXAuZ2V0Wm9vbSgpK3RoaXMuem9vbU9m ZnNldDt2YXIgbGltaXQ9TWF0aC5wb3coMix6KTtpZih0aGlzLndyYXBEYXRlTGlu ZSkKe3g9KCh4JWxpbWl0KStsaW1pdCklbGltaXQ7fQpyZXR1cm57J3gnOngsJ3kn OnksJ3onOnp9O30sc2V0TWFwOmZ1bmN0aW9uKG1hcCl7T3BlbkxheWVycy5MYXll ci5HcmlkLnByb3RvdHlwZS5zZXRNYXAuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lm KCF0aGlzLnRpbGVPcmlnaW4pe3RoaXMudGlsZU9yaWdpbj1uZXcgT3BlbkxheWVy cy5Mb25MYXQodGhpcy5tYXhFeHRlbnQubGVmdCx0aGlzLm1heEV4dGVudC5ib3R0 b20pO319LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuTGF5ZXIuWFlaIn0pO09wZW5M YXllcnMuTGF5ZXIuT1NNPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5MYXll ci5YWVose25hbWU6Ik9wZW5TdHJlZXRNYXAiLGF0dHJpYnV0aW9uOiJEYXRhIEND LUJ5LVNBIGJ5IDxhIGhyZWY9J2h0dHA6Ly9vcGVuc3RyZWV0bWFwLm9yZy8nPk9w ZW5TdHJlZXRNYXA8L2E+IixzcGhlcmljYWxNZXJjYXRvcjp0cnVlLHVybDonaHR0 cDovL3RpbGUub3BlbnN0cmVldG1hcC5vcmcvJHt6fS8ke3h9LyR7eX0ucG5nJyxj bG9uZTpmdW5jdGlvbihvYmope2lmKG9iaj09bnVsbCl7b2JqPW5ldyBPcGVuTGF5 ZXJzLkxheWVyLk9TTSh0aGlzLm5hbWUsdGhpcy51cmwsdGhpcy5nZXRPcHRpb25z KCkpO30Kb2JqPU9wZW5MYXllcnMuTGF5ZXIuWFlaLnByb3RvdHlwZS5jbG9uZS5h cHBseSh0aGlzLFtvYmpdKTtyZXR1cm4gb2JqO30sd3JhcERhdGVMaW5lOnRydWUs Q0xBU1NfTkFNRToiT3BlbkxheWVycy5MYXllci5PU00ifSk7T3BlbkxheWVycy5M YXllci5CaW5nPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5MYXllci5YWVos e3NlcnZlclJlc29sdXRpb25zOlsxNTY1NDMuMDMzOTA2MjUsNzgyNzEuNTE2OTUz MTI1LDM5MTM1Ljc1ODQ3NjU2MjUsMTk1NjcuODc5MjM4MjgxMjUsOTc4My45Mzk2 MTkxNDA2MjUsNDg5MS45Njk4MDk1NzAzMTI1LDI0NDUuOTg0OTA0Nzg1MTU2Miwx MjIyLjk5MjQ1MjM5MjU3ODEsNjExLjQ5NjIyNjE5NjI4OTEsMzA1Ljc0ODExMzA5 ODE0NDUzLDE1Mi44NzQwNTY1NDkwNzIyNiw3Ni40MzcwMjgyNzQ1MzYxMywzOC4y MTg1MTQxMzcyNjgwNjYsMTkuMTA5MjU3MDY4NjM0MDMzLDkuNTU0NjI4NTM0MzE3 MDE3LDQuNzc3MzE0MjY3MTU4NTA4LDIuMzg4NjU3MTMzNTc5MjU0LDEuMTk0MzI4 NTY2Nzg5NjI3LDAuNTk3MTY0MjgzMzk0ODEzNSwwLjI5ODU4MjE0MTY5NzQwNjc3 LDAuMTQ5MjkxMDcwODQ4NzAzMzgsMC4wNzQ2NDU1MzU0MjQzNTE2OV0sYXR0cmli dXRpb25UZW1wbGF0ZTonPHNwYW4gY2xhc3M9Im9sQmluZ0F0dHJpYnV0aW9uICR7 dHlwZX0iPicrJzxkaXY+PGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93 d3cuYmluZy5jb20vbWFwcy8iPicrJzxpbWcgc3JjPSIke2xvZ299IiAvPjwvYT48 L2Rpdj4ke2NvcHlyaWdodHN9JysnPGEgc3R5bGU9IndoaXRlLXNwYWNlOiBub3dy YXAiIHRhcmdldD0iX2JsYW5rIiAnKydocmVmPSJodHRwOi8vd3d3Lm1pY3Jvc29m dC5jb20vbWFwcy9wcm9kdWN0L3Rlcm1zLmh0bWwiPicrJ1Rlcm1zIG9mIFVzZTwv YT48L3NwYW4+JyxtZXRhZGF0YTpudWxsLHR5cGU6IlJvYWQiLG1ldGFkYXRhUGFy YW1zOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXtvcHRpb25zPU9w ZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKHtzcGhlcmljYWxNZXJjYXRvcjp0 cnVlfSxvcHRpb25zKTt2YXIgbmFtZT1vcHRpb25zLm5hbWV8fCJCaW5nICIrKG9w dGlvbnMudHlwZXx8dGhpcy50eXBlKTt2YXIgbmV3QXJncz1bbmFtZSxudWxsLG9w dGlvbnNdO09wZW5MYXllcnMuTGF5ZXIuWFlaLnByb3RvdHlwZS5pbml0aWFsaXpl LmFwcGx5KHRoaXMsbmV3QXJncyk7dGhpcy5sb2FkTWV0YWRhdGEoKTt9LGxvYWRN ZXRhZGF0YTpmdW5jdGlvbigpe3RoaXMuX2NhbGxiYWNrSWQ9Il9jYWxsYmFja18i K3RoaXMuaWQucmVwbGFjZSgvXC4vZywiXyIpO3dpbmRvd1t0aGlzLl9jYWxsYmFj a0lkXT1PcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQoT3BlbkxheWVycy5MYXllci5C aW5nLnByb2Nlc3NNZXRhZGF0YSx0aGlzKTt2YXIgcGFyYW1zPU9wZW5MYXllcnMu VXRpbC5hcHBseURlZmF1bHRzKHtrZXk6dGhpcy5rZXksanNvbnA6dGhpcy5fY2Fs bGJhY2tJZCxpbmNsdWRlOiJJbWFnZXJ5UHJvdmlkZXJzIn0sdGhpcy5tZXRhZGF0 YVBhcmFtcyk7dmFyIHVybD0iaHR0cDovL2Rldi52aXJ0dWFsZWFydGgubmV0L1JF U1QvdjEvSW1hZ2VyeS9NZXRhZGF0YS8iKwp0aGlzLnR5cGUrIj8iK09wZW5MYXll cnMuVXRpbC5nZXRQYXJhbWV0ZXJTdHJpbmcocGFyYW1zKTt2YXIgc2NyaXB0PWRv Y3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3NjcmlwdC50eXBlPSJ0ZXh0 L2phdmFzY3JpcHQiO3NjcmlwdC5zcmM9dXJsO3NjcmlwdC5pZD10aGlzLl9jYWxs YmFja0lkO2RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0u YXBwZW5kQ2hpbGQoc2NyaXB0KTt9LGluaXRMYXllcjpmdW5jdGlvbigpe3ZhciBy ZXM9dGhpcy5tZXRhZGF0YS5yZXNvdXJjZVNldHNbMF0ucmVzb3VyY2VzWzBdO3Zh ciB1cmw9cmVzLmltYWdlVXJsLnJlcGxhY2UoIntxdWFka2V5fSIsIiR7cXVhZGtl eX0iKTt0aGlzLnVybD1bXTtmb3IodmFyIGk9MDtpPHJlcy5pbWFnZVVybFN1YmRv bWFpbnMubGVuZ3RoOysraSl7dGhpcy51cmwucHVzaCh1cmwucmVwbGFjZSgie3N1 YmRvbWFpbn0iLHJlcy5pbWFnZVVybFN1YmRvbWFpbnNbaV0pKTt9O3RoaXMuYWRk T3B0aW9ucyh7bWF4UmVzb2x1dGlvbjpNYXRoLm1pbih0aGlzLnNlcnZlclJlc29s dXRpb25zW3Jlcy56b29tTWluXSx0aGlzLm1heFJlc29sdXRpb24pLHpvb21PZmZz ZXQ6cmVzLnpvb21NaW4sbnVtWm9vbUxldmVsczpNYXRoLm1pbihyZXMuem9vbU1h eCsxLXJlcy56b29tTWluLHRoaXMubnVtWm9vbUxldmVscyl9LHRydWUpO30sZ2V0 VVJMOmZ1bmN0aW9uKGJvdW5kcyl7aWYoIXRoaXMudXJsKXtyZXR1cm4gT3Blbkxh eWVycy5VdGlsLmdldEltYWdlc0xvY2F0aW9uKCkrImJsYW5rLmdpZiI7fQp2YXIg eHl6PXRoaXMuZ2V0WFlaKGJvdW5kcykseD14eXoueCx5PXh5ei55LHo9eHl6Lno7 dmFyIHF1YWREaWdpdHM9W107Zm9yKHZhciBpPXo7aT4wOy0taSl7dmFyIGRpZ2l0 PScwJzt2YXIgbWFzaz0xPDwoaS0xKTtpZigoeCZtYXNrKSE9MCl7ZGlnaXQrKzt9 CmlmKCh5Jm1hc2spIT0wKXtkaWdpdCsrO2RpZ2l0Kys7fQpxdWFkRGlnaXRzLnB1 c2goZGlnaXQpO30KdmFyIHF1YWRLZXk9cXVhZERpZ2l0cy5qb2luKCIiKTt2YXIg dXJsPXRoaXMuc2VsZWN0VXJsKCcnK3greSt6LHRoaXMudXJsKTtyZXR1cm4gT3Bl bkxheWVycy5TdHJpbmcuZm9ybWF0KHVybCx7J3F1YWRrZXknOnF1YWRLZXl9KTt9 LHVwZGF0ZUF0dHJpYnV0aW9uOmZ1bmN0aW9uKCl7dmFyIG1ldGFkYXRhPXRoaXMu bWV0YWRhdGE7aWYoIW1ldGFkYXRhfHwhdGhpcy5tYXB8fCF0aGlzLm1hcC5jZW50 ZXIpe3JldHVybjt9CnZhciByZXM9bWV0YWRhdGEucmVzb3VyY2VTZXRzWzBdLnJl c291cmNlc1swXTt2YXIgZXh0ZW50PXRoaXMubWFwLmdldEV4dGVudCgpLnRyYW5z Zm9ybSh0aGlzLm1hcC5nZXRQcm9qZWN0aW9uT2JqZWN0KCksbmV3IE9wZW5MYXll cnMuUHJvamVjdGlvbigiRVBTRzo0MzI2IikpO3ZhciBwcm92aWRlcnM9cmVzLmlt YWdlcnlQcm92aWRlcnMsem9vbT10aGlzLm1hcC5nZXRab29tKCkrMSxjb3B5cmln aHRzPSIiLHByb3ZpZGVyLGksaWksaixqaixiYm94LGNvdmVyYWdlO2ZvcihpPTAs aWk9cHJvdmlkZXJzLmxlbmd0aDtpPGlpOysraSl7cHJvdmlkZXI9cHJvdmlkZXJz W2ldO2ZvcihqPTAsamo9cHJvdmlkZXIuY292ZXJhZ2VBcmVhcy5sZW5ndGg7ajxq ajsrK2ope2NvdmVyYWdlPXByb3ZpZGVyLmNvdmVyYWdlQXJlYXNbal07YmJveD1P cGVuTGF5ZXJzLkJvdW5kcy5mcm9tQXJyYXkoY292ZXJhZ2UuYmJveCk7aWYoZXh0 ZW50LmludGVyc2VjdHNCb3VuZHMoYmJveCkmJnpvb208PWNvdmVyYWdlLnpvb21N YXgmJnpvb20+PWNvdmVyYWdlLnpvb21NaW4pe2NvcHlyaWdodHMrPXByb3ZpZGVy LmF0dHJpYnV0aW9uKyIgIjt9fX0KdGhpcy5hdHRyaWJ1dGlvbj1PcGVuTGF5ZXJz LlN0cmluZy5mb3JtYXQodGhpcy5hdHRyaWJ1dGlvblRlbXBsYXRlLHt0eXBlOnRo aXMudHlwZS50b0xvd2VyQ2FzZSgpLGxvZ286bWV0YWRhdGEuYnJhbmRMb2dvVXJp LGNvcHlyaWdodHM6Y29weXJpZ2h0c30pO3RoaXMubWFwJiZ0aGlzLm1hcC5ldmVu dHMudHJpZ2dlckV2ZW50KCJjaGFuZ2VsYXllciIse2xheWVyOnRoaXMscHJvcGVy dHk6ImF0dHJpYnV0aW9uIn0pO30sc2V0TWFwOmZ1bmN0aW9uKCl7T3BlbkxheWVy cy5MYXllci5YWVoucHJvdG90eXBlLnNldE1hcC5hcHBseSh0aGlzLGFyZ3VtZW50 cyk7dGhpcy51cGRhdGVBdHRyaWJ1dGlvbigpO3RoaXMubWFwLmV2ZW50cy5yZWdp c3RlcigibW92ZWVuZCIsdGhpcyx0aGlzLnVwZGF0ZUF0dHJpYnV0aW9uKTt9LGNs b25lOmZ1bmN0aW9uKG9iail7aWYob2JqPT1udWxsKXtvYmo9bmV3IE9wZW5MYXll cnMuTGF5ZXIuQmluZyh0aGlzLm9wdGlvbnMpO30Kb2JqPU9wZW5MYXllcnMuTGF5 ZXIuWFlaLnByb3RvdHlwZS5jbG9uZS5hcHBseSh0aGlzLFtvYmpdKTtyZXR1cm4g b2JqO30sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMubWFwJiZ0aGlzLm1hcC5ldmVu dHMudW5yZWdpc3RlcigibW92ZWVuZCIsdGhpcyx0aGlzLnVwZGF0ZUF0dHJpYnV0 aW9uKTtPcGVuTGF5ZXJzLkxheWVyLlhZWi5wcm90b3R5cGUuZGVzdHJveS5hcHBs eSh0aGlzLGFyZ3VtZW50cyk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkxheWVy LkJpbmcifSk7T3BlbkxheWVycy5MYXllci5CaW5nLnByb2Nlc3NNZXRhZGF0YT1m dW5jdGlvbihtZXRhZGF0YSl7dGhpcy5tZXRhZGF0YT1tZXRhZGF0YTt0aGlzLmlu aXRMYXllcigpO3ZhciBzY3JpcHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhp cy5fY2FsbGJhY2tJZCk7c2NyaXB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2Ny aXB0KTt3aW5kb3dbdGhpcy5fY2FsbGJhY2tJZF09dW5kZWZpbmVkO2RlbGV0ZSB0 aGlzLl9jYWxsYmFja0lkO307T3BlbkxheWVycy5MYXllci5Qb2ludEdyaWQ9T3Bl bkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkxheWVyLlZlY3Rvcix7ZHg6bnVsbCxk eTpudWxsLHJhdGlvOjEuNSxtYXhGZWF0dXJlczoyNTAscm90YXRpb246MCxvcmln aW46bnVsbCxncmlkQm91bmRzOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihjb25m aWcpe2NvbmZpZz1jb25maWd8fHt9O09wZW5MYXllcnMuTGF5ZXIuVmVjdG9yLnBy b3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW2NvbmZpZy5uYW1lLGNvbmZp Z10pO30sc2V0TWFwOmZ1bmN0aW9uKG1hcCl7T3BlbkxheWVycy5MYXllci5WZWN0 b3IucHJvdG90eXBlLnNldE1hcC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bWFwLmV2 ZW50cy5yZWdpc3RlcigibW92ZWVuZCIsdGhpcyx0aGlzLm9uTW92ZUVuZCk7fSxy ZW1vdmVNYXA6ZnVuY3Rpb24obWFwKXttYXAuZXZlbnRzLnVucmVnaXN0ZXIoIm1v dmVlbmQiLHRoaXMsdGhpcy5vbk1vdmVFbmQpO09wZW5MYXllcnMuTGF5ZXIuVmVj dG9yLnByb3RvdHlwZS5yZW1vdmVNYXAuYXBwbHkodGhpcyxhcmd1bWVudHMpO30s c2V0UmF0aW86ZnVuY3Rpb24ocmF0aW8pe3RoaXMucmF0aW89cmF0aW87dGhpcy51 cGRhdGVHcmlkKHRydWUpO30sc2V0TWF4RmVhdHVyZXM6ZnVuY3Rpb24obWF4RmVh dHVyZXMpe3RoaXMubWF4RmVhdHVyZXM9bWF4RmVhdHVyZXM7dGhpcy51cGRhdGVH cmlkKHRydWUpO30sc2V0U3BhY2luZzpmdW5jdGlvbihkeCxkeSl7dGhpcy5keD1k eDt0aGlzLmR5PWR5fHxkeDt0aGlzLnVwZGF0ZUdyaWQodHJ1ZSk7fSxzZXRPcmln aW46ZnVuY3Rpb24ob3JpZ2luKXt0aGlzLm9yaWdpbj1vcmlnaW47dGhpcy51cGRh dGVHcmlkKHRydWUpO30sZ2V0T3JpZ2luOmZ1bmN0aW9uKCl7aWYoIXRoaXMub3Jp Z2luKXt0aGlzLm9yaWdpbj10aGlzLm1hcC5nZXRFeHRlbnQoKS5nZXRDZW50ZXJM b25MYXQoKTt9CnJldHVybiB0aGlzLm9yaWdpbjt9LHNldFJvdGF0aW9uOmZ1bmN0 aW9uKHJvdGF0aW9uKXt0aGlzLnJvdGF0aW9uPXJvdGF0aW9uO3RoaXMudXBkYXRl R3JpZCh0cnVlKTt9LG9uTW92ZUVuZDpmdW5jdGlvbigpe3RoaXMudXBkYXRlR3Jp ZCgpO30sZ2V0Vmlld0JvdW5kczpmdW5jdGlvbigpe3ZhciBib3VuZHM9dGhpcy5t YXAuZ2V0RXh0ZW50KCk7aWYodGhpcy5yb3RhdGlvbil7dmFyIG9yaWdpbj10aGlz LmdldE9yaWdpbigpO3ZhciByb3RhdGlvbk9yaWdpbj1uZXcgT3BlbkxheWVycy5H ZW9tZXRyeS5Qb2ludChvcmlnaW4ubG9uLG9yaWdpbi5sYXQpO3ZhciByZWN0PWJv dW5kcy50b0dlb21ldHJ5KCk7cmVjdC5yb3RhdGUoLXRoaXMucm90YXRpb24scm90 YXRpb25PcmlnaW4pO2JvdW5kcz1yZWN0LmdldEJvdW5kcygpO30KcmV0dXJuIGJv dW5kczt9LHVwZGF0ZUdyaWQ6ZnVuY3Rpb24oZm9yY2Upe2lmKGZvcmNlfHx0aGlz LmludmFsaWRCb3VuZHMoKSl7dmFyIHZpZXdCb3VuZHM9dGhpcy5nZXRWaWV3Qm91 bmRzKCk7dmFyIG9yaWdpbj10aGlzLmdldE9yaWdpbigpO3ZhciByb3RhdGlvbk9y aWdpbj1uZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludChvcmlnaW4ubG9uLG9y aWdpbi5sYXQpO3ZhciB2aWV3Qm91bmRzV2lkdGg9dmlld0JvdW5kcy5nZXRXaWR0 aCgpO3ZhciB2aWV3Qm91bmRzSGVpZ2h0PXZpZXdCb3VuZHMuZ2V0SGVpZ2h0KCk7 dmFyIGFzcGVjdFJhdGlvPXZpZXdCb3VuZHNXaWR0aC92aWV3Qm91bmRzSGVpZ2h0 O3ZhciBtYXhIZWlnaHQ9TWF0aC5zcXJ0KHRoaXMuZHgqdGhpcy5keSp0aGlzLm1h eEZlYXR1cmVzL2FzcGVjdFJhdGlvKTt2YXIgbWF4V2lkdGg9bWF4SGVpZ2h0KmFz cGVjdFJhdGlvO3ZhciBncmlkV2lkdGg9TWF0aC5taW4odmlld0JvdW5kc1dpZHRo KnRoaXMucmF0aW8sbWF4V2lkdGgpO3ZhciBncmlkSGVpZ2h0PU1hdGgubWluKHZp ZXdCb3VuZHNIZWlnaHQqdGhpcy5yYXRpbyxtYXhIZWlnaHQpO3ZhciBjZW50ZXI9 dmlld0JvdW5kcy5nZXRDZW50ZXJMb25MYXQoKTt0aGlzLmdyaWRCb3VuZHM9bmV3 IE9wZW5MYXllcnMuQm91bmRzKGNlbnRlci5sb24tKGdyaWRXaWR0aC8yKSxjZW50 ZXIubGF0LShncmlkSGVpZ2h0LzIpLGNlbnRlci5sb24rKGdyaWRXaWR0aC8yKSxj ZW50ZXIubGF0KyhncmlkSGVpZ2h0LzIpKTt2YXIgcm93cz1NYXRoLmZsb29yKGdy aWRIZWlnaHQvdGhpcy5keSk7dmFyIGNvbHM9TWF0aC5mbG9vcihncmlkV2lkdGgv dGhpcy5keCk7dmFyIGdyaWRMZWZ0PW9yaWdpbi5sb24rKHRoaXMuZHgqTWF0aC5j ZWlsKCh0aGlzLmdyaWRCb3VuZHMubGVmdC1vcmlnaW4ubG9uKS90aGlzLmR4KSk7 dmFyIGdyaWRCb3R0b209b3JpZ2luLmxhdCsodGhpcy5keSpNYXRoLmNlaWwoKHRo aXMuZ3JpZEJvdW5kcy5ib3R0b20tb3JpZ2luLmxhdCkvdGhpcy5keSkpO3ZhciBm ZWF0dXJlcz1uZXcgQXJyYXkocm93cypjb2xzKTt2YXIgeCx5LHBvaW50O2Zvcih2 YXIgaT0wO2k8Y29sczsrK2kpe3g9Z3JpZExlZnQrKGkqdGhpcy5keCk7Zm9yKHZh ciBqPTA7ajxyb3dzOysrail7eT1ncmlkQm90dG9tKyhqKnRoaXMuZHkpO3BvaW50 PW5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KHgseSk7aWYodGhpcy5yb3Rh dGlvbil7cG9pbnQucm90YXRlKHRoaXMucm90YXRpb24scm90YXRpb25PcmlnaW4p O30KZmVhdHVyZXNbKGkqcm93cykral09bmV3IE9wZW5MYXllcnMuRmVhdHVyZS5W ZWN0b3IocG9pbnQpO319CnRoaXMuZGVzdHJveUZlYXR1cmVzKHRoaXMuZmVhdHVy ZXMse3NpbGVudDp0cnVlfSk7dGhpcy5hZGRGZWF0dXJlcyhmZWF0dXJlcyx7c2ls ZW50OnRydWV9KTt9fSxpbnZhbGlkQm91bmRzOmZ1bmN0aW9uKCl7cmV0dXJuIXRo aXMuZ3JpZEJvdW5kc3x8IXRoaXMuZ3JpZEJvdW5kcy5jb250YWluc0JvdW5kcyh0 aGlzLmdldFZpZXdCb3VuZHMoKSk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkxh eWVyLlBvaW50R3JpZCJ9KTtPcGVuTGF5ZXJzLkhhbmRsZXIuTW91c2VXaGVlbD1P cGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuSGFuZGxlcix7d2hlZWxMaXN0ZW5l cjpudWxsLG1vdXNlUG9zaXRpb246bnVsbCxpbnRlcnZhbDowLGRlbHRhOjAsY3Vt dWxhdGl2ZTp0cnVlLGluaXRpYWxpemU6ZnVuY3Rpb24oY29udHJvbCxjYWxsYmFj a3Msb3B0aW9ucyl7T3BlbkxheWVycy5IYW5kbGVyLnByb3RvdHlwZS5pbml0aWFs aXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLndoZWVsTGlzdGVuZXI9T3Bl bkxheWVycy5GdW5jdGlvbi5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMub25XaGVl bEV2ZW50LHRoaXMpO30sZGVzdHJveTpmdW5jdGlvbigpe09wZW5MYXllcnMuSGFu ZGxlci5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhp cy53aGVlbExpc3RlbmVyPW51bGw7fSxvbldoZWVsRXZlbnQ6ZnVuY3Rpb24oZSl7 aWYoIXRoaXMubWFwfHwhdGhpcy5jaGVja01vZGlmaWVycyhlKSl7cmV0dXJuO30K dmFyIG92ZXJTY3JvbGxhYmxlRGl2PWZhbHNlO3ZhciBvdmVyTGF5ZXJEaXY9ZmFs c2U7dmFyIG92ZXJNYXBEaXY9ZmFsc2U7dmFyIGVsZW09T3BlbkxheWVycy5FdmVu dC5lbGVtZW50KGUpO3doaWxlKChlbGVtIT1udWxsKSYmIW92ZXJNYXBEaXYmJiFv dmVyU2Nyb2xsYWJsZURpdil7aWYoIW92ZXJTY3JvbGxhYmxlRGl2KXt0cnl7aWYo ZWxlbS5jdXJyZW50U3R5bGUpe292ZXJmbG93PWVsZW0uY3VycmVudFN0eWxlWyJv dmVyZmxvdyJdO31lbHNle3ZhciBzdHlsZT1kb2N1bWVudC5kZWZhdWx0Vmlldy5n ZXRDb21wdXRlZFN0eWxlKGVsZW0sbnVsbCk7dmFyIG92ZXJmbG93PXN0eWxlLmdl dFByb3BlcnR5VmFsdWUoIm92ZXJmbG93Iik7fQpvdmVyU2Nyb2xsYWJsZURpdj0o b3ZlcmZsb3cmJihvdmVyZmxvdz09ImF1dG8iKXx8KG92ZXJmbG93PT0ic2Nyb2xs IikpO31jYXRjaChlcnIpe319CmlmKCFvdmVyTGF5ZXJEaXYpe2Zvcih2YXIgaT0w LGxlbj10aGlzLm1hcC5sYXllcnMubGVuZ3RoO2k8bGVuO2krKyl7aWYoZWxlbT09 dGhpcy5tYXAubGF5ZXJzW2ldLmRpdnx8ZWxlbT09dGhpcy5tYXAubGF5ZXJzW2ld LnBhbmUpe292ZXJMYXllckRpdj10cnVlO2JyZWFrO319fQpvdmVyTWFwRGl2PShl bGVtPT10aGlzLm1hcC5kaXYpO2VsZW09ZWxlbS5wYXJlbnROb2RlO30KaWYoIW92 ZXJTY3JvbGxhYmxlRGl2JiZvdmVyTWFwRGl2KXtpZihvdmVyTGF5ZXJEaXYpe3Zh ciBkZWx0YT0wO2lmKCFlKXtlPXdpbmRvdy5ldmVudDt9CmlmKGUud2hlZWxEZWx0 YSl7ZGVsdGE9ZS53aGVlbERlbHRhLzEyMDtpZih3aW5kb3cub3BlcmEmJndpbmRv dy5vcGVyYS52ZXJzaW9uKCk8OS4yKXtkZWx0YT0tZGVsdGE7fX1lbHNlIGlmKGUu ZGV0YWlsKXtkZWx0YT0tZS5kZXRhaWwvMzt9CnRoaXMuZGVsdGE9dGhpcy5kZWx0 YStkZWx0YTtpZih0aGlzLmludGVydmFsKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRo aXMuX3RpbWVvdXRJZCk7dGhpcy5fdGltZW91dElkPXdpbmRvdy5zZXRUaW1lb3V0 KE9wZW5MYXllcnMuRnVuY3Rpb24uYmluZChmdW5jdGlvbigpe3RoaXMud2hlZWxa b29tKGUpO30sdGhpcyksdGhpcy5pbnRlcnZhbCk7fWVsc2V7dGhpcy53aGVlbFpv b20oZSk7fX0KT3BlbkxheWVycy5FdmVudC5zdG9wKGUpO319LHdoZWVsWm9vbTpm dW5jdGlvbihlKXt2YXIgZGVsdGE9dGhpcy5kZWx0YTt0aGlzLmRlbHRhPTA7aWYo ZGVsdGEpe2lmKHRoaXMubW91c2VQb3NpdGlvbil7ZS54eT10aGlzLm1vdXNlUG9z aXRpb247fQppZighZS54eSl7ZS54eT10aGlzLm1hcC5nZXRQaXhlbEZyb21Mb25M YXQodGhpcy5tYXAuZ2V0Q2VudGVyKCkpO30KaWYoZGVsdGE8MCl7dGhpcy5jYWxs YmFjaygiZG93biIsW2UsdGhpcy5jdW11bGF0aXZlP2RlbHRhOi0xXSk7fWVsc2V7 dGhpcy5jYWxsYmFjaygidXAiLFtlLHRoaXMuY3VtdWxhdGl2ZT9kZWx0YToxXSk7 fX19LG1vdXNlbW92ZTpmdW5jdGlvbihldnQpe3RoaXMubW91c2VQb3NpdGlvbj1l dnQueHk7fSxhY3RpdmF0ZTpmdW5jdGlvbihldnQpe2lmKE9wZW5MYXllcnMuSGFu ZGxlci5wcm90b3R5cGUuYWN0aXZhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2 YXIgd2hlZWxMaXN0ZW5lcj10aGlzLndoZWVsTGlzdGVuZXI7T3BlbkxheWVycy5F dmVudC5vYnNlcnZlKHdpbmRvdywiRE9NTW91c2VTY3JvbGwiLHdoZWVsTGlzdGVu ZXIpO09wZW5MYXllcnMuRXZlbnQub2JzZXJ2ZSh3aW5kb3csIm1vdXNld2hlZWwi LHdoZWVsTGlzdGVuZXIpO09wZW5MYXllcnMuRXZlbnQub2JzZXJ2ZShkb2N1bWVu dCwibW91c2V3aGVlbCIsd2hlZWxMaXN0ZW5lcik7cmV0dXJuIHRydWU7fWVsc2V7 cmV0dXJuIGZhbHNlO319LGRlYWN0aXZhdGU6ZnVuY3Rpb24oZXZ0KXtpZihPcGVu TGF5ZXJzLkhhbmRsZXIucHJvdG90eXBlLmRlYWN0aXZhdGUuYXBwbHkodGhpcyxh cmd1bWVudHMpKXt2YXIgd2hlZWxMaXN0ZW5lcj10aGlzLndoZWVsTGlzdGVuZXI7 T3BlbkxheWVycy5FdmVudC5zdG9wT2JzZXJ2aW5nKHdpbmRvdywiRE9NTW91c2VT Y3JvbGwiLHdoZWVsTGlzdGVuZXIpO09wZW5MYXllcnMuRXZlbnQuc3RvcE9ic2Vy dmluZyh3aW5kb3csIm1vdXNld2hlZWwiLHdoZWVsTGlzdGVuZXIpO09wZW5MYXll cnMuRXZlbnQuc3RvcE9ic2VydmluZyhkb2N1bWVudCwibW91c2V3aGVlbCIsd2hl ZWxMaXN0ZW5lcik7cmV0dXJuIHRydWU7fWVsc2V7cmV0dXJuIGZhbHNlO319LENM QVNTX05BTUU6Ik9wZW5MYXllcnMuSGFuZGxlci5Nb3VzZVdoZWVsIn0pO09wZW5M YXllcnMuU3ltYm9saXplcj1PcGVuTGF5ZXJzLkNsYXNzKHt6SW5kZXg6MCxpbml0 aWFsaXplOmZ1bmN0aW9uKGNvbmZpZyl7T3BlbkxheWVycy5VdGlsLmV4dGVuZCh0 aGlzLGNvbmZpZyk7fSxjbG9uZTpmdW5jdGlvbigpe3ZhciBUeXBlPWV2YWwodGhp cy5DTEFTU19OQU1FKTtyZXR1cm4gbmV3IFR5cGUoT3BlbkxheWVycy5VdGlsLmV4 dGVuZCh7fSx0aGlzKSk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLlN5bWJvbGl6 ZXIifSk7T3BlbkxheWVycy5TeW1ib2xpemVyLlJhc3Rlcj1PcGVuTGF5ZXJzLkNs YXNzKE9wZW5MYXllcnMuU3ltYm9saXplcix7aW5pdGlhbGl6ZTpmdW5jdGlvbihj b25maWcpe09wZW5MYXllcnMuU3ltYm9saXplci5wcm90b3R5cGUuaW5pdGlhbGl6 ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJz LlN5bWJvbGl6ZXIuUmFzdGVyIn0pO09wZW5MYXllcnMuU3ltYm9saXplci5Qb2lu dD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuU3ltYm9saXplcix7aW5pdGlh bGl6ZTpmdW5jdGlvbihjb25maWcpe09wZW5MYXllcnMuU3ltYm9saXplci5wcm90 b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fSxDTEFTU19O QU1FOiJPcGVuTGF5ZXJzLlN5bWJvbGl6ZXIuUG9pbnQifSk7T3BlbkxheWVycy5T eW1ib2xpemVyLkxpbmU9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLlN5bWJv bGl6ZXIse2luaXRpYWxpemU6ZnVuY3Rpb24oY29uZmlnKXtPcGVuTGF5ZXJzLlN5 bWJvbGl6ZXIucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVu dHMpO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5TeW1ib2xpemVyLkxpbmUifSk7 T3BlbkxheWVycy5TeW1ib2xpemVyLlBvbHlnb249T3BlbkxheWVycy5DbGFzcyhP cGVuTGF5ZXJzLlN5bWJvbGl6ZXIse2luaXRpYWxpemU6ZnVuY3Rpb24oY29uZmln KXtPcGVuTGF5ZXJzLlN5bWJvbGl6ZXIucHJvdG90eXBlLmluaXRpYWxpemUuYXBw bHkodGhpcyxhcmd1bWVudHMpO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5TeW1i b2xpemVyLlBvbHlnb24ifSk7T3BlbkxheWVycy5TeW1ib2xpemVyLlRleHQ9T3Bl bkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLlN5bWJvbGl6ZXIse2luaXRpYWxpemU6 ZnVuY3Rpb24oY29uZmlnKXtPcGVuTGF5ZXJzLlN5bWJvbGl6ZXIucHJvdG90eXBl LmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO30sQ0xBU1NfTkFNRToi T3BlbkxheWVycy5TeW1ib2xpemVyLlRleHQifSk7T3BlbkxheWVycy5SdWxlPU9w ZW5MYXllcnMuQ2xhc3Moe2lkOm51bGwsbmFtZTpudWxsLHRpdGxlOm51bGwsZGVz Y3JpcHRpb246bnVsbCxjb250ZXh0Om51bGwsZmlsdGVyOm51bGwsZWxzZUZpbHRl cjpmYWxzZSxzeW1ib2xpemVyOm51bGwsc3ltYm9saXplcnM6bnVsbCxtaW5TY2Fs ZURlbm9taW5hdG9yOm51bGwsbWF4U2NhbGVEZW5vbWluYXRvcjpudWxsLGluaXRp YWxpemU6ZnVuY3Rpb24ob3B0aW9ucyl7dGhpcy5zeW1ib2xpemVyPXt9O09wZW5M YXllcnMuVXRpbC5leHRlbmQodGhpcyxvcHRpb25zKTtpZih0aGlzLnN5bWJvbGl6 ZXJzKXtkZWxldGUgdGhpcy5zeW1ib2xpemVyO30KdGhpcy5pZD1PcGVuTGF5ZXJz LlV0aWwuY3JlYXRlVW5pcXVlSUQodGhpcy5DTEFTU19OQU1FKyJfIik7fSxkZXN0 cm95OmZ1bmN0aW9uKCl7Zm9yKHZhciBpIGluIHRoaXMuc3ltYm9saXplcil7dGhp cy5zeW1ib2xpemVyW2ldPW51bGw7fQp0aGlzLnN5bWJvbGl6ZXI9bnVsbDtkZWxl dGUgdGhpcy5zeW1ib2xpemVyczt9LGV2YWx1YXRlOmZ1bmN0aW9uKGZlYXR1cmUp e3ZhciBjb250ZXh0PXRoaXMuZ2V0Q29udGV4dChmZWF0dXJlKTt2YXIgYXBwbGll cz10cnVlO2lmKHRoaXMubWluU2NhbGVEZW5vbWluYXRvcnx8dGhpcy5tYXhTY2Fs ZURlbm9taW5hdG9yKXt2YXIgc2NhbGU9ZmVhdHVyZS5sYXllci5tYXAuZ2V0U2Nh bGUoKTt9CmlmKHRoaXMubWluU2NhbGVEZW5vbWluYXRvcil7YXBwbGllcz1zY2Fs ZT49T3BlbkxheWVycy5TdHlsZS5jcmVhdGVMaXRlcmFsKHRoaXMubWluU2NhbGVE ZW5vbWluYXRvcixjb250ZXh0KTt9CmlmKGFwcGxpZXMmJnRoaXMubWF4U2NhbGVE ZW5vbWluYXRvcil7YXBwbGllcz1zY2FsZTxPcGVuTGF5ZXJzLlN0eWxlLmNyZWF0 ZUxpdGVyYWwodGhpcy5tYXhTY2FsZURlbm9taW5hdG9yLGNvbnRleHQpO30KaWYo YXBwbGllcyYmdGhpcy5maWx0ZXIpe2lmKHRoaXMuZmlsdGVyLkNMQVNTX05BTUU9 PSJPcGVuTGF5ZXJzLkZpbHRlci5GZWF0dXJlSWQiKXthcHBsaWVzPXRoaXMuZmls dGVyLmV2YWx1YXRlKGZlYXR1cmUpO31lbHNle2FwcGxpZXM9dGhpcy5maWx0ZXIu ZXZhbHVhdGUoY29udGV4dCk7fX0KcmV0dXJuIGFwcGxpZXM7fSxnZXRDb250ZXh0 OmZ1bmN0aW9uKGZlYXR1cmUpe3ZhciBjb250ZXh0PXRoaXMuY29udGV4dDtpZigh Y29udGV4dCl7Y29udGV4dD1mZWF0dXJlLmF0dHJpYnV0ZXN8fGZlYXR1cmUuZGF0 YTt9CmlmKHR5cGVvZiB0aGlzLmNvbnRleHQ9PSJmdW5jdGlvbiIpe2NvbnRleHQ9 dGhpcy5jb250ZXh0KGZlYXR1cmUpO30KcmV0dXJuIGNvbnRleHQ7fSxjbG9uZTpm dW5jdGlvbigpe3ZhciBvcHRpb25zPU9wZW5MYXllcnMuVXRpbC5leHRlbmQoe30s dGhpcyk7aWYodGhpcy5zeW1ib2xpemVycyl7dmFyIGxlbj10aGlzLnN5bWJvbGl6 ZXJzLmxlbmd0aDtvcHRpb25zLnN5bWJvbGl6ZXJzPW5ldyBBcnJheShsZW4pO2Zv cih2YXIgaT0wO2k8bGVuOysraSl7b3B0aW9ucy5zeW1ib2xpemVyc1tpXT10aGlz LnN5bWJvbGl6ZXJzW2ldLmNsb25lKCk7fX1lbHNle29wdGlvbnMuc3ltYm9saXpl cj17fTt2YXIgdmFsdWUsdHlwZTtmb3IodmFyIGtleSBpbiB0aGlzLnN5bWJvbGl6 ZXIpe3ZhbHVlPXRoaXMuc3ltYm9saXplcltrZXldO3R5cGU9dHlwZW9mIHZhbHVl O2lmKHR5cGU9PT0ib2JqZWN0Iil7b3B0aW9ucy5zeW1ib2xpemVyW2tleV09T3Bl bkxheWVycy5VdGlsLmV4dGVuZCh7fSx2YWx1ZSk7fWVsc2UgaWYodHlwZT09PSJz dHJpbmciKXtvcHRpb25zLnN5bWJvbGl6ZXJba2V5XT12YWx1ZTt9fX0Kb3B0aW9u cy5maWx0ZXI9dGhpcy5maWx0ZXImJnRoaXMuZmlsdGVyLmNsb25lKCk7b3B0aW9u cy5jb250ZXh0PXRoaXMuY29udGV4dCYmT3BlbkxheWVycy5VdGlsLmV4dGVuZCh7 fSx0aGlzLmNvbnRleHQpO3JldHVybiBuZXcgT3BlbkxheWVycy5SdWxlKG9wdGlv bnMpO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5SdWxlIn0pO09wZW5MYXllcnMu RmlsdGVyLlNwYXRpYWw9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkZpbHRl cix7dHlwZTpudWxsLHByb3BlcnR5Om51bGwsdmFsdWU6bnVsbCxkaXN0YW5jZTpu dWxsLGRpc3RhbmNlVW5pdHM6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKG9wdGlv bnMpe09wZW5MYXllcnMuRmlsdGVyLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5 KHRoaXMsW29wdGlvbnNdKTt9LGV2YWx1YXRlOmZ1bmN0aW9uKGZlYXR1cmUpe3Zh ciBpbnRlcnNlY3Q9ZmFsc2U7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSBPcGVuTGF5 ZXJzLkZpbHRlci5TcGF0aWFsLkJCT1g6Y2FzZSBPcGVuTGF5ZXJzLkZpbHRlci5T cGF0aWFsLklOVEVSU0VDVFM6aWYoZmVhdHVyZS5nZW9tZXRyeSl7dmFyIGdlb209 dGhpcy52YWx1ZTtpZih0aGlzLnZhbHVlLkNMQVNTX05BTUU9PSJPcGVuTGF5ZXJz LkJvdW5kcyIpe2dlb209dGhpcy52YWx1ZS50b0dlb21ldHJ5KCk7fQppZihmZWF0 dXJlLmdlb21ldHJ5LmludGVyc2VjdHMoZ2VvbSkpe2ludGVyc2VjdD10cnVlO319 CmJyZWFrO2RlZmF1bHQ6T3BlbkxheWVycy5Db25zb2xlLmVycm9yKE9wZW5MYXll cnMuaTE4bigiZmlsdGVyRXZhbHVhdGVOb3RJbXBsZW1lbnRlZCIpKTticmVhazt9 CnJldHVybiBpbnRlcnNlY3Q7fSxjbG9uZTpmdW5jdGlvbigpe3ZhciBvcHRpb25z PU9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKHt2YWx1ZTp0aGlzLnZhbHVl JiZ0aGlzLnZhbHVlLmNsb25lJiZ0aGlzLnZhbHVlLmNsb25lKCl9LHRoaXMpO3Jl dHVybiBuZXcgT3BlbkxheWVycy5GaWx0ZXIuU3BhdGlhbChvcHRpb25zKTt9LENM QVNTX05BTUU6Ik9wZW5MYXllcnMuRmlsdGVyLlNwYXRpYWwifSk7T3BlbkxheWVy cy5GaWx0ZXIuU3BhdGlhbC5CQk9YPSJCQk9YIjtPcGVuTGF5ZXJzLkZpbHRlci5T cGF0aWFsLklOVEVSU0VDVFM9IklOVEVSU0VDVFMiO09wZW5MYXllcnMuRmlsdGVy LlNwYXRpYWwuRFdJVEhJTj0iRFdJVEhJTiI7T3BlbkxheWVycy5GaWx0ZXIuU3Bh dGlhbC5XSVRISU49IldJVEhJTiI7T3BlbkxheWVycy5GaWx0ZXIuU3BhdGlhbC5D T05UQUlOUz0iQ09OVEFJTlMiO09wZW5MYXllcnMuRm9ybWF0LlNMRD1PcGVuTGF5 ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0LlhNTC5WZXJzaW9uZWRPR0Mse2Rl ZmF1bHRWZXJzaW9uOiIxLjAuMCIsc3RyaW5naWZ5T3V0cHV0OnRydWUsbmFtZWRM YXllcnNBc0FycmF5OmZhbHNlLENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0 LlNMRCJ9KTtPcGVuTGF5ZXJzLkZvcm1hdC5HTUwudjI9T3BlbkxheWVycy5DbGFz cyhPcGVuTGF5ZXJzLkZvcm1hdC5HTUwuQmFzZSx7c2NoZW1hTG9jYXRpb246Imh0 dHA6Ly93d3cub3Blbmdpcy5uZXQvZ21sIGh0dHA6Ly9zY2hlbWFzLm9wZW5naXMu bmV0L2dtbC8yLjEuMi9mZWF0dXJlLnhzZCIsaW5pdGlhbGl6ZTpmdW5jdGlvbihv cHRpb25zKXtPcGVuTGF5ZXJzLkZvcm1hdC5HTUwuQmFzZS5wcm90b3R5cGUuaW5p dGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7fSxyZWFkZXJzOnsiZ21sIjpP cGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyh7Im91dGVyQm91bmRhcnlJcyI6 ZnVuY3Rpb24obm9kZSxjb250YWluZXIpe3ZhciBvYmo9e307dGhpcy5yZWFkQ2hp bGROb2Rlcyhub2RlLG9iaik7Y29udGFpbmVyLm91dGVyPW9iai5jb21wb25lbnRz WzBdO30sImlubmVyQm91bmRhcnlJcyI6ZnVuY3Rpb24obm9kZSxjb250YWluZXIp e3ZhciBvYmo9e307dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iaik7Y29udGFp bmVyLmlubmVyLnB1c2gob2JqLmNvbXBvbmVudHNbMF0pO30sIkJveCI6ZnVuY3Rp b24obm9kZSxjb250YWluZXIpe3ZhciBvYmo9e307dGhpcy5yZWFkQ2hpbGROb2Rl cyhub2RlLG9iaik7aWYoIWNvbnRhaW5lci5jb21wb25lbnRzKXtjb250YWluZXIu Y29tcG9uZW50cz1bXTt9CnZhciBtaW49b2JqLnBvaW50c1swXTt2YXIgbWF4PW9i ai5wb2ludHNbMV07Y29udGFpbmVyLmNvbXBvbmVudHMucHVzaChuZXcgT3Blbkxh eWVycy5Cb3VuZHMobWluLngsbWluLnksbWF4LngsbWF4LnkpKTt9fSxPcGVuTGF5 ZXJzLkZvcm1hdC5HTUwuQmFzZS5wcm90b3R5cGUucmVhZGVyc1siZ21sIl0pLCJm ZWF0dXJlIjpPcGVuTGF5ZXJzLkZvcm1hdC5HTUwuQmFzZS5wcm90b3R5cGUucmVh ZGVyc1siZmVhdHVyZSJdLCJ3ZnMiOk9wZW5MYXllcnMuRm9ybWF0LkdNTC5CYXNl LnByb3RvdHlwZS5yZWFkZXJzWyJ3ZnMiXX0sd3JpdGU6ZnVuY3Rpb24oZmVhdHVy ZXMpe3ZhciBuYW1lO2lmKE9wZW5MYXllcnMuVXRpbC5pc0FycmF5KGZlYXR1cmVz KSl7bmFtZT0id2ZzOkZlYXR1cmVDb2xsZWN0aW9uIjt9ZWxzZXtuYW1lPSJnbWw6 ZmVhdHVyZU1lbWJlciI7fQp2YXIgcm9vdD10aGlzLndyaXRlTm9kZShuYW1lLGZl YXR1cmVzKTt0aGlzLnNldEF0dHJpYnV0ZU5TKHJvb3QsdGhpcy5uYW1lc3BhY2Vz WyJ4c2kiXSwieHNpOnNjaGVtYUxvY2F0aW9uIix0aGlzLnNjaGVtYUxvY2F0aW9u KTtyZXR1cm4gT3BlbkxheWVycy5Gb3JtYXQuWE1MLnByb3RvdHlwZS53cml0ZS5h cHBseSh0aGlzLFtyb290XSk7fSx3cml0ZXJzOnsiZ21sIjpPcGVuTGF5ZXJzLlV0 aWwuYXBwbHlEZWZhdWx0cyh7IlBvaW50IjpmdW5jdGlvbihnZW9tZXRyeSl7dmFy IG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJnbWw6UG9pbnQiKTt0aGlz LndyaXRlTm9kZSgiY29vcmRpbmF0ZXMiLFtnZW9tZXRyeV0sbm9kZSk7cmV0dXJu IG5vZGU7fSwiY29vcmRpbmF0ZXMiOmZ1bmN0aW9uKHBvaW50cyl7dmFyIG51bVBv aW50cz1wb2ludHMubGVuZ3RoO3ZhciBwYXJ0cz1uZXcgQXJyYXkobnVtUG9pbnRz KTt2YXIgcG9pbnQ7Zm9yKHZhciBpPTA7aTxudW1Qb2ludHM7KytpKXtwb2ludD1w b2ludHNbaV07aWYodGhpcy54eSl7cGFydHNbaV09cG9pbnQueCsiLCIrcG9pbnQu eTt9ZWxzZXtwYXJ0c1tpXT1wb2ludC55KyIsIitwb2ludC54O30KaWYocG9pbnQu eiE9dW5kZWZpbmVkKXtwYXJ0c1tpXSs9IiwiK3BvaW50Lno7fX0KcmV0dXJuIHRo aXMuY3JlYXRlRWxlbWVudE5TUGx1cygiZ21sOmNvb3JkaW5hdGVzIix7YXR0cmli dXRlczp7ZGVjaW1hbDoiLiIsY3M6IiwiLHRzOiIgIn0sdmFsdWU6KG51bVBvaW50 cz09MSk/cGFydHNbMF06cGFydHMuam9pbigiICIpfSk7fSwiTGluZVN0cmluZyI6 ZnVuY3Rpb24oZ2VvbWV0cnkpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5T UGx1cygiZ21sOkxpbmVTdHJpbmciKTt0aGlzLndyaXRlTm9kZSgiY29vcmRpbmF0 ZXMiLGdlb21ldHJ5LmNvbXBvbmVudHMsbm9kZSk7cmV0dXJuIG5vZGU7fSwiUG9s eWdvbiI6ZnVuY3Rpb24oZ2VvbWV0cnkpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxl bWVudE5TUGx1cygiZ21sOlBvbHlnb24iKTt0aGlzLndyaXRlTm9kZSgib3V0ZXJC b3VuZGFyeUlzIixnZW9tZXRyeS5jb21wb25lbnRzWzBdLG5vZGUpO2Zvcih2YXIg aT0xO2k8Z2VvbWV0cnkuY29tcG9uZW50cy5sZW5ndGg7KytpKXt0aGlzLndyaXRl Tm9kZSgiaW5uZXJCb3VuZGFyeUlzIixnZW9tZXRyeS5jb21wb25lbnRzW2ldLG5v ZGUpO30KcmV0dXJuIG5vZGU7fSwib3V0ZXJCb3VuZGFyeUlzIjpmdW5jdGlvbihy aW5nKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImdtbDpvdXRl ckJvdW5kYXJ5SXMiKTt0aGlzLndyaXRlTm9kZSgiTGluZWFyUmluZyIscmluZyxu b2RlKTtyZXR1cm4gbm9kZTt9LCJpbm5lckJvdW5kYXJ5SXMiOmZ1bmN0aW9uKHJp bmcpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygiZ21sOmlubmVy Qm91bmRhcnlJcyIpO3RoaXMud3JpdGVOb2RlKCJMaW5lYXJSaW5nIixyaW5nLG5v ZGUpO3JldHVybiBub2RlO30sIkxpbmVhclJpbmciOmZ1bmN0aW9uKHJpbmcpe3Zh ciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygiZ21sOkxpbmVhclJpbmci KTt0aGlzLndyaXRlTm9kZSgiY29vcmRpbmF0ZXMiLHJpbmcuY29tcG9uZW50cyxu b2RlKTtyZXR1cm4gbm9kZTt9LCJCb3giOmZ1bmN0aW9uKGJvdW5kcyl7dmFyIG5v ZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJnbWw6Qm94Iik7dGhpcy53cml0 ZU5vZGUoImNvb3JkaW5hdGVzIixbe3g6Ym91bmRzLmxlZnQseTpib3VuZHMuYm90 dG9tfSx7eDpib3VuZHMucmlnaHQseTpib3VuZHMudG9wfV0sbm9kZSk7aWYodGhp cy5zcnNOYW1lKXtub2RlLnNldEF0dHJpYnV0ZSgic3JzTmFtZSIsdGhpcy5zcnNO YW1lKTt9CnJldHVybiBub2RlO319LE9wZW5MYXllcnMuRm9ybWF0LkdNTC5CYXNl LnByb3RvdHlwZS53cml0ZXJzWyJnbWwiXSksImZlYXR1cmUiOk9wZW5MYXllcnMu Rm9ybWF0LkdNTC5CYXNlLnByb3RvdHlwZS53cml0ZXJzWyJmZWF0dXJlIl0sIndm cyI6T3BlbkxheWVycy5Gb3JtYXQuR01MLkJhc2UucHJvdG90eXBlLndyaXRlcnNb IndmcyJdfSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5HTUwudjIifSk7 T3BlbkxheWVycy5Gb3JtYXQuRmlsdGVyLnYxXzBfMD1PcGVuTGF5ZXJzLkNsYXNz KE9wZW5MYXllcnMuRm9ybWF0LkdNTC52MixPcGVuTGF5ZXJzLkZvcm1hdC5GaWx0 ZXIudjEse1ZFUlNJT046IjEuMC4wIixzY2hlbWFMb2NhdGlvbjoiaHR0cDovL3d3 dy5vcGVuZ2lzLm5ldC9vZ2MvZmlsdGVyLzEuMC4wL2ZpbHRlci54c2QiLGluaXRp YWxpemU6ZnVuY3Rpb24ob3B0aW9ucyl7T3BlbkxheWVycy5Gb3JtYXQuR01MLnYy LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW29wdGlvbnNdKTt9LHJl YWRlcnM6eyJvZ2MiOk9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKHsiUHJv cGVydHlJc0VxdWFsVG8iOmZ1bmN0aW9uKG5vZGUsb2JqKXt2YXIgZmlsdGVyPW5l dyBPcGVuTGF5ZXJzLkZpbHRlci5Db21wYXJpc29uKHt0eXBlOk9wZW5MYXllcnMu RmlsdGVyLkNvbXBhcmlzb24uRVFVQUxfVE99KTt0aGlzLnJlYWRDaGlsZE5vZGVz KG5vZGUsZmlsdGVyKTtvYmouZmlsdGVycy5wdXNoKGZpbHRlcik7fSwiUHJvcGVy dHlJc05vdEVxdWFsVG8iOmZ1bmN0aW9uKG5vZGUsb2JqKXt2YXIgZmlsdGVyPW5l dyBPcGVuTGF5ZXJzLkZpbHRlci5Db21wYXJpc29uKHt0eXBlOk9wZW5MYXllcnMu RmlsdGVyLkNvbXBhcmlzb24uTk9UX0VRVUFMX1RPfSk7dGhpcy5yZWFkQ2hpbGRO b2Rlcyhub2RlLGZpbHRlcik7b2JqLmZpbHRlcnMucHVzaChmaWx0ZXIpO30sIlBy b3BlcnR5SXNMaWtlIjpmdW5jdGlvbihub2RlLG9iail7dmFyIGZpbHRlcj1uZXcg T3BlbkxheWVycy5GaWx0ZXIuQ29tcGFyaXNvbih7dHlwZTpPcGVuTGF5ZXJzLkZp bHRlci5Db21wYXJpc29uLkxJS0V9KTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUs ZmlsdGVyKTt2YXIgd2lsZENhcmQ9bm9kZS5nZXRBdHRyaWJ1dGUoIndpbGRDYXJk Iik7dmFyIHNpbmdsZUNoYXI9bm9kZS5nZXRBdHRyaWJ1dGUoInNpbmdsZUNoYXIi KTt2YXIgZXNjPW5vZGUuZ2V0QXR0cmlidXRlKCJlc2NhcGUiKTtmaWx0ZXIudmFs dWUycmVnZXgod2lsZENhcmQsc2luZ2xlQ2hhcixlc2MpO29iai5maWx0ZXJzLnB1 c2goZmlsdGVyKTt9fSxPcGVuTGF5ZXJzLkZvcm1hdC5GaWx0ZXIudjEucHJvdG90 eXBlLnJlYWRlcnNbIm9nYyJdKSwiZ21sIjpPcGVuTGF5ZXJzLkZvcm1hdC5HTUwu djIucHJvdG90eXBlLnJlYWRlcnNbImdtbCJdLCJmZWF0dXJlIjpPcGVuTGF5ZXJz LkZvcm1hdC5HTUwudjIucHJvdG90eXBlLnJlYWRlcnNbImZlYXR1cmUiXX0sd3Jp dGVyczp7Im9nYyI6T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMoeyJQcm9w ZXJ0eUlzRXF1YWxUbyI6ZnVuY3Rpb24oZmlsdGVyKXt2YXIgbm9kZT10aGlzLmNy ZWF0ZUVsZW1lbnROU1BsdXMoIm9nYzpQcm9wZXJ0eUlzRXF1YWxUbyIpO3RoaXMu d3JpdGVOb2RlKCJQcm9wZXJ0eU5hbWUiLGZpbHRlcixub2RlKTt0aGlzLndyaXRl T2djRXhwcmVzc2lvbihmaWx0ZXIudmFsdWUsbm9kZSk7cmV0dXJuIG5vZGU7fSwi UHJvcGVydHlJc05vdEVxdWFsVG8iOmZ1bmN0aW9uKGZpbHRlcil7dmFyIG5vZGU9 dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJvZ2M6UHJvcGVydHlJc05vdEVxdWFs VG8iKTt0aGlzLndyaXRlTm9kZSgiUHJvcGVydHlOYW1lIixmaWx0ZXIsbm9kZSk7 dGhpcy53cml0ZU9nY0V4cHJlc3Npb24oZmlsdGVyLnZhbHVlLG5vZGUpO3JldHVy biBub2RlO30sIlByb3BlcnR5SXNMaWtlIjpmdW5jdGlvbihmaWx0ZXIpe3ZhciBu b2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygib2djOlByb3BlcnR5SXNMaWtl Iix7YXR0cmlidXRlczp7d2lsZENhcmQ6IioiLHNpbmdsZUNoYXI6Ii4iLGVzY2Fw ZToiISJ9fSk7dGhpcy53cml0ZU5vZGUoIlByb3BlcnR5TmFtZSIsZmlsdGVyLG5v ZGUpO3RoaXMud3JpdGVOb2RlKCJMaXRlcmFsIixmaWx0ZXIucmVnZXgydmFsdWUo KSxub2RlKTtyZXR1cm4gbm9kZTt9LCJCQk9YIjpmdW5jdGlvbihmaWx0ZXIpe3Zh ciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygib2djOkJCT1giKTtmaWx0 ZXIucHJvcGVydHkmJnRoaXMud3JpdGVOb2RlKCJQcm9wZXJ0eU5hbWUiLGZpbHRl cixub2RlKTt2YXIgYm94PXRoaXMud3JpdGVOb2RlKCJnbWw6Qm94IixmaWx0ZXIu dmFsdWUsbm9kZSk7aWYoZmlsdGVyLnByb2plY3Rpb24pe2JveC5zZXRBdHRyaWJ1 dGUoInNyc05hbWUiLGZpbHRlci5wcm9qZWN0aW9uKTt9CnJldHVybiBub2RlO319 LE9wZW5MYXllcnMuRm9ybWF0LkZpbHRlci52MS5wcm90b3R5cGUud3JpdGVyc1si b2djIl0pLCJnbWwiOk9wZW5MYXllcnMuRm9ybWF0LkdNTC52Mi5wcm90b3R5cGUu d3JpdGVyc1siZ21sIl0sImZlYXR1cmUiOk9wZW5MYXllcnMuRm9ybWF0LkdNTC52 Mi5wcm90b3R5cGUud3JpdGVyc1siZmVhdHVyZSJdfSx3cml0ZVNwYXRpYWw6ZnVu Y3Rpb24oZmlsdGVyLG5hbWUpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5T UGx1cygib2djOiIrbmFtZSk7dGhpcy53cml0ZU5vZGUoIlByb3BlcnR5TmFtZSIs ZmlsdGVyLG5vZGUpO2lmKGZpbHRlci52YWx1ZSBpbnN0YW5jZW9mIE9wZW5MYXll cnMuRmlsdGVyLkZ1bmN0aW9uKXt0aGlzLndyaXRlTm9kZSgiRnVuY3Rpb24iLGZp bHRlci52YWx1ZSxub2RlKTt9ZWxzZXt2YXIgY2hpbGQ7aWYoZmlsdGVyLnZhbHVl IGluc3RhbmNlb2YgT3BlbkxheWVycy5HZW9tZXRyeSl7Y2hpbGQ9dGhpcy53cml0 ZU5vZGUoImZlYXR1cmU6X2dlb21ldHJ5IixmaWx0ZXIudmFsdWUpLmZpcnN0Q2hp bGQ7fWVsc2V7Y2hpbGQ9dGhpcy53cml0ZU5vZGUoImdtbDpCb3giLGZpbHRlci52 YWx1ZSk7fQppZihmaWx0ZXIucHJvamVjdGlvbil7Y2hpbGQuc2V0QXR0cmlidXRl KCJzcnNOYW1lIixmaWx0ZXIucHJvamVjdGlvbik7fQpub2RlLmFwcGVuZENoaWxk KGNoaWxkKTt9CnJldHVybiBub2RlO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5G b3JtYXQuRmlsdGVyLnYxXzBfMCJ9KTtPcGVuTGF5ZXJzLkZvcm1hdC5XRlNULnYx XzBfMD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0LkZpbHRlci52 MV8wXzAsT3BlbkxheWVycy5Gb3JtYXQuV0ZTVC52MSx7dmVyc2lvbjoiMS4wLjAi LHNyc05hbWVJblF1ZXJ5OmZhbHNlLHNjaGVtYUxvY2F0aW9uczp7IndmcyI6Imh0 dHA6Ly9zY2hlbWFzLm9wZW5naXMubmV0L3dmcy8xLjAuMC9XRlMtdHJhbnNhY3Rp b24ueHNkIn0saW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXtPcGVuTGF5ZXJz LkZvcm1hdC5GaWx0ZXIudjFfMF8wLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5 KHRoaXMsW29wdGlvbnNdKTtPcGVuTGF5ZXJzLkZvcm1hdC5XRlNULnYxLnByb3Rv dHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW29wdGlvbnNdKTt9LHJlYWROb2Rl OmZ1bmN0aW9uKG5vZGUsb2JqLGZpcnN0KXtyZXR1cm4gT3BlbkxheWVycy5Gb3Jt YXQuR01MLnYyLnByb3RvdHlwZS5yZWFkTm9kZS5hcHBseSh0aGlzLFtub2RlLG9i al0pO30scmVhZGVyczp7IndmcyI6T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVs dHMoeyJXRlNfVHJhbnNhY3Rpb25SZXNwb25zZSI6ZnVuY3Rpb24obm9kZSxvYmop e29iai5pbnNlcnRJZHM9W107b2JqLnN1Y2Nlc3M9ZmFsc2U7dGhpcy5yZWFkQ2hp bGROb2Rlcyhub2RlLG9iaik7fSwiSW5zZXJ0UmVzdWx0IjpmdW5jdGlvbihub2Rl LGNvbnRhaW5lcil7dmFyIG9iaj17ZmlkczpbXX07dGhpcy5yZWFkQ2hpbGROb2Rl cyhub2RlLG9iaik7Y29udGFpbmVyLmluc2VydElkcy5wdXNoKG9iai5maWRzWzBd KTt9LCJUcmFuc2FjdGlvblJlc3VsdCI6ZnVuY3Rpb24obm9kZSxvYmope3RoaXMu cmVhZENoaWxkTm9kZXMobm9kZSxvYmopO30sIlN0YXR1cyI6ZnVuY3Rpb24obm9k ZSxvYmope3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxvYmopO30sIlNVQ0NFU1Mi OmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmouc3VjY2Vzcz10cnVlO319LE9wZW5MYXll cnMuRm9ybWF0LldGU1QudjEucHJvdG90eXBlLnJlYWRlcnNbIndmcyJdKSwiZ21s IjpPcGVuTGF5ZXJzLkZvcm1hdC5HTUwudjIucHJvdG90eXBlLnJlYWRlcnNbImdt bCJdLCJmZWF0dXJlIjpPcGVuTGF5ZXJzLkZvcm1hdC5HTUwudjIucHJvdG90eXBl LnJlYWRlcnNbImZlYXR1cmUiXSwib2djIjpPcGVuTGF5ZXJzLkZvcm1hdC5GaWx0 ZXIudjFfMF8wLnByb3RvdHlwZS5yZWFkZXJzWyJvZ2MiXX0sd3JpdGVyczp7Indm cyI6T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMoeyJRdWVyeSI6ZnVuY3Rp b24ob3B0aW9ucyl7b3B0aW9ucz1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHtmZWF0 dXJlTlM6dGhpcy5mZWF0dXJlTlMsZmVhdHVyZVByZWZpeDp0aGlzLmZlYXR1cmVQ cmVmaXgsZmVhdHVyZVR5cGU6dGhpcy5mZWF0dXJlVHlwZSxzcnNOYW1lOnRoaXMu c3JzTmFtZSxzcnNOYW1lSW5RdWVyeTp0aGlzLnNyc05hbWVJblF1ZXJ5fSxvcHRp b25zKTt2YXIgcHJlZml4PW9wdGlvbnMuZmVhdHVyZVByZWZpeDt2YXIgbm9kZT10 aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIndmczpRdWVyeSIse2F0dHJpYnV0ZXM6 e3R5cGVOYW1lOihwcmVmaXg/cHJlZml4KyI6IjoiIikrCm9wdGlvbnMuZmVhdHVy ZVR5cGV9fSk7aWYob3B0aW9ucy5zcnNOYW1lSW5RdWVyeSYmb3B0aW9ucy5zcnNO YW1lKXtub2RlLnNldEF0dHJpYnV0ZSgic3JzTmFtZSIsb3B0aW9ucy5zcnNOYW1l KTt9CmlmKG9wdGlvbnMuZmVhdHVyZU5TKXtub2RlLnNldEF0dHJpYnV0ZSgieG1s bnM6IitwcmVmaXgsb3B0aW9ucy5mZWF0dXJlTlMpO30KaWYob3B0aW9ucy5wcm9w ZXJ0eU5hbWVzKXtmb3IodmFyIGk9MCxsZW49b3B0aW9ucy5wcm9wZXJ0eU5hbWVz Lmxlbmd0aDtpPGxlbjtpKyspe3RoaXMud3JpdGVOb2RlKCJvZ2M6UHJvcGVydHlO YW1lIix7cHJvcGVydHk6b3B0aW9ucy5wcm9wZXJ0eU5hbWVzW2ldfSxub2RlKTt9 fQppZihvcHRpb25zLmZpbHRlcil7dGhpcy5zZXRGaWx0ZXJQcm9wZXJ0eShvcHRp b25zLmZpbHRlcik7dGhpcy53cml0ZU5vZGUoIm9nYzpGaWx0ZXIiLG9wdGlvbnMu ZmlsdGVyLG5vZGUpO30KcmV0dXJuIG5vZGU7fX0sT3BlbkxheWVycy5Gb3JtYXQu V0ZTVC52MS5wcm90b3R5cGUud3JpdGVyc1sid2ZzIl0pLCJnbWwiOk9wZW5MYXll cnMuRm9ybWF0LkdNTC52Mi5wcm90b3R5cGUud3JpdGVyc1siZ21sIl0sImZlYXR1 cmUiOk9wZW5MYXllcnMuRm9ybWF0LkdNTC52Mi5wcm90b3R5cGUud3JpdGVyc1si ZmVhdHVyZSJdLCJvZ2MiOk9wZW5MYXllcnMuRm9ybWF0LkZpbHRlci52MV8wXzAu cHJvdG90eXBlLndyaXRlcnNbIm9nYyJdfSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJz LkZvcm1hdC5XRlNULnYxXzBfMCJ9KTtPcGVuTGF5ZXJzLkVsZW1lbnRzSW5kZXhl cj1PcGVuTGF5ZXJzLkNsYXNzKHttYXhaSW5kZXg6bnVsbCxvcmRlcjpudWxsLGlu ZGljZXM6bnVsbCxjb21wYXJlOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbih5T3Jk ZXJpbmcpe3RoaXMuY29tcGFyZT15T3JkZXJpbmc/T3BlbkxheWVycy5FbGVtZW50 c0luZGV4ZXIuSW5kZXhpbmdNZXRob2RzLlpfT1JERVJfWV9PUkRFUjpPcGVuTGF5 ZXJzLkVsZW1lbnRzSW5kZXhlci5JbmRleGluZ01ldGhvZHMuWl9PUkRFUl9EUkFX SU5HX09SREVSO3RoaXMuY2xlYXIoKTt9LGluc2VydDpmdW5jdGlvbihuZXdOb2Rl KXtpZih0aGlzLmV4aXN0cyhuZXdOb2RlKSl7dGhpcy5yZW1vdmUobmV3Tm9kZSk7 fQp2YXIgbm9kZUlkPW5ld05vZGUuaWQ7dGhpcy5kZXRlcm1pbmVaSW5kZXgobmV3 Tm9kZSk7dmFyIGxlZnRJbmRleD0tMTt2YXIgcmlnaHRJbmRleD10aGlzLm9yZGVy Lmxlbmd0aDt2YXIgbWlkZGxlO3doaWxlKHJpZ2h0SW5kZXgtbGVmdEluZGV4PjEp e21pZGRsZT1wYXJzZUludCgobGVmdEluZGV4K3JpZ2h0SW5kZXgpLzIpO3ZhciBw bGFjZW1lbnQ9dGhpcy5jb21wYXJlKHRoaXMsbmV3Tm9kZSxPcGVuTGF5ZXJzLlV0 aWwuZ2V0RWxlbWVudCh0aGlzLm9yZGVyW21pZGRsZV0pKTtpZihwbGFjZW1lbnQ+ MCl7bGVmdEluZGV4PW1pZGRsZTt9ZWxzZXtyaWdodEluZGV4PW1pZGRsZTt9fQp0 aGlzLm9yZGVyLnNwbGljZShyaWdodEluZGV4LDAsbm9kZUlkKTt0aGlzLmluZGlj ZXNbbm9kZUlkXT10aGlzLmdldFpJbmRleChuZXdOb2RlKTtyZXR1cm4gdGhpcy5n ZXROZXh0RWxlbWVudChyaWdodEluZGV4KTt9LHJlbW92ZTpmdW5jdGlvbihub2Rl KXt2YXIgbm9kZUlkPW5vZGUuaWQ7dmFyIGFycmF5SW5kZXg9T3BlbkxheWVycy5V dGlsLmluZGV4T2YodGhpcy5vcmRlcixub2RlSWQpO2lmKGFycmF5SW5kZXg+PTAp e3RoaXMub3JkZXIuc3BsaWNlKGFycmF5SW5kZXgsMSk7ZGVsZXRlIHRoaXMuaW5k aWNlc1tub2RlSWRdO2lmKHRoaXMub3JkZXIubGVuZ3RoPjApe3ZhciBsYXN0SWQ9 dGhpcy5vcmRlclt0aGlzLm9yZGVyLmxlbmd0aC0xXTt0aGlzLm1heFpJbmRleD10 aGlzLmluZGljZXNbbGFzdElkXTt9ZWxzZXt0aGlzLm1heFpJbmRleD0wO319fSxj bGVhcjpmdW5jdGlvbigpe3RoaXMub3JkZXI9W107dGhpcy5pbmRpY2VzPXt9O3Ro aXMubWF4WkluZGV4PTA7fSxleGlzdHM6ZnVuY3Rpb24obm9kZSl7cmV0dXJuKHRo aXMuaW5kaWNlc1tub2RlLmlkXSE9bnVsbCk7fSxnZXRaSW5kZXg6ZnVuY3Rpb24o bm9kZSl7cmV0dXJuIG5vZGUuX3N0eWxlLmdyYXBoaWNaSW5kZXg7fSxkZXRlcm1p bmVaSW5kZXg6ZnVuY3Rpb24obm9kZSl7dmFyIHpJbmRleD1ub2RlLl9zdHlsZS5n cmFwaGljWkluZGV4O2lmKHpJbmRleD09bnVsbCl7ekluZGV4PXRoaXMubWF4Wklu ZGV4O25vZGUuX3N0eWxlLmdyYXBoaWNaSW5kZXg9ekluZGV4O31lbHNlIGlmKHpJ bmRleD50aGlzLm1heFpJbmRleCl7dGhpcy5tYXhaSW5kZXg9ekluZGV4O319LGdl dE5leHRFbGVtZW50OmZ1bmN0aW9uKGluZGV4KXt2YXIgbmV4dEluZGV4PWluZGV4 KzE7aWYobmV4dEluZGV4PHRoaXMub3JkZXIubGVuZ3RoKXt2YXIgbmV4dEVsZW1l bnQ9T3BlbkxheWVycy5VdGlsLmdldEVsZW1lbnQodGhpcy5vcmRlcltuZXh0SW5k ZXhdKTtpZihuZXh0RWxlbWVudD09dW5kZWZpbmVkKXtuZXh0RWxlbWVudD10aGlz LmdldE5leHRFbGVtZW50KG5leHRJbmRleCk7fQpyZXR1cm4gbmV4dEVsZW1lbnQ7 fWVsc2V7cmV0dXJuIG51bGw7fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5FbGVt ZW50c0luZGV4ZXIifSk7T3BlbkxheWVycy5FbGVtZW50c0luZGV4ZXIuSW5kZXhp bmdNZXRob2RzPXtaX09SREVSOmZ1bmN0aW9uKGluZGV4ZXIsbmV3Tm9kZSxuZXh0 Tm9kZSl7dmFyIG5ld1pJbmRleD1pbmRleGVyLmdldFpJbmRleChuZXdOb2RlKTt2 YXIgcmV0dXJuVmFsPTA7aWYobmV4dE5vZGUpe3ZhciBuZXh0WkluZGV4PWluZGV4 ZXIuZ2V0WkluZGV4KG5leHROb2RlKTtyZXR1cm5WYWw9bmV3WkluZGV4LW5leHRa SW5kZXg7fQpyZXR1cm4gcmV0dXJuVmFsO30sWl9PUkRFUl9EUkFXSU5HX09SREVS OmZ1bmN0aW9uKGluZGV4ZXIsbmV3Tm9kZSxuZXh0Tm9kZSl7dmFyIHJldHVyblZh bD1PcGVuTGF5ZXJzLkVsZW1lbnRzSW5kZXhlci5JbmRleGluZ01ldGhvZHMuWl9P UkRFUihpbmRleGVyLG5ld05vZGUsbmV4dE5vZGUpO2lmKG5leHROb2RlJiZyZXR1 cm5WYWw9PTApe3JldHVyblZhbD0xO30KcmV0dXJuIHJldHVyblZhbDt9LFpfT1JE RVJfWV9PUkRFUjpmdW5jdGlvbihpbmRleGVyLG5ld05vZGUsbmV4dE5vZGUpe3Zh ciByZXR1cm5WYWw9T3BlbkxheWVycy5FbGVtZW50c0luZGV4ZXIuSW5kZXhpbmdN ZXRob2RzLlpfT1JERVIoaW5kZXhlcixuZXdOb2RlLG5leHROb2RlKTtpZihuZXh0 Tm9kZSYmcmV0dXJuVmFsPT09MCl7dmFyIHJlc3VsdD1uZXh0Tm9kZS5fYm91bmRz Qm90dG9tLW5ld05vZGUuX2JvdW5kc0JvdHRvbTtyZXR1cm5WYWw9KHJlc3VsdD09 PTApPzE6cmVzdWx0O30KcmV0dXJuIHJldHVyblZhbDt9fTtPcGVuTGF5ZXJzLlJl bmRlcmVyLkVsZW1lbnRzPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5SZW5k ZXJlcix7cmVuZGVyZXJSb290Om51bGwscm9vdDpudWxsLHZlY3RvclJvb3Q6bnVs bCx0ZXh0Um9vdDpudWxsLHhtbG5zOm51bGwsaW5kZXhlcjpudWxsLEJBQ0tHUk9V TkRfSURfU1VGRklYOiJfYmFja2dyb3VuZCIsTEFCRUxfSURfU1VGRklYOiJfbGFi ZWwiLGluaXRpYWxpemU6ZnVuY3Rpb24oY29udGFpbmVySUQsb3B0aW9ucyl7T3Bl bkxheWVycy5SZW5kZXJlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlz LGFyZ3VtZW50cyk7dGhpcy5yZW5kZXJlclJvb3Q9dGhpcy5jcmVhdGVSZW5kZXJS b290KCk7dGhpcy5yb290PXRoaXMuY3JlYXRlUm9vdCgiX3Jvb3QiKTt0aGlzLnZl Y3RvclJvb3Q9dGhpcy5jcmVhdGVSb290KCJfdnJvb3QiKTt0aGlzLnRleHRSb290 PXRoaXMuY3JlYXRlUm9vdCgiX3Ryb290Iik7dGhpcy5yb290LmFwcGVuZENoaWxk KHRoaXMudmVjdG9yUm9vdCk7dGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMudGV4 dFJvb3QpO3RoaXMucmVuZGVyZXJSb290LmFwcGVuZENoaWxkKHRoaXMucm9vdCk7 dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJlclJvb3QpO2lm KG9wdGlvbnMmJihvcHRpb25zLnpJbmRleGluZ3x8b3B0aW9ucy55T3JkZXJpbmcp KXt0aGlzLmluZGV4ZXI9bmV3IE9wZW5MYXllcnMuRWxlbWVudHNJbmRleGVyKG9w dGlvbnMueU9yZGVyaW5nKTt9fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5jbGVh cigpO3RoaXMucmVuZGVyZXJSb290PW51bGw7dGhpcy5yb290PW51bGw7dGhpcy54 bWxucz1udWxsO09wZW5MYXllcnMuUmVuZGVyZXIucHJvdG90eXBlLmRlc3Ryb3ku YXBwbHkodGhpcyxhcmd1bWVudHMpO30sY2xlYXI6ZnVuY3Rpb24oKXt2YXIgY2hp bGQ7dmFyIHJvb3Q9dGhpcy52ZWN0b3JSb290O2lmKHJvb3Qpe3doaWxlKGNoaWxk PXJvb3QuZmlyc3RDaGlsZCl7cm9vdC5yZW1vdmVDaGlsZChjaGlsZCk7fX0Kcm9v dD10aGlzLnRleHRSb290O2lmKHJvb3Qpe3doaWxlKGNoaWxkPXJvb3QuZmlyc3RD aGlsZCl7cm9vdC5yZW1vdmVDaGlsZChjaGlsZCk7fX0KaWYodGhpcy5pbmRleGVy KXt0aGlzLmluZGV4ZXIuY2xlYXIoKTt9fSxnZXROb2RlVHlwZTpmdW5jdGlvbihn ZW9tZXRyeSxzdHlsZSl7fSxkcmF3R2VvbWV0cnk6ZnVuY3Rpb24oZ2VvbWV0cnks c3R5bGUsZmVhdHVyZUlkKXt2YXIgY2xhc3NOYW1lPWdlb21ldHJ5LkNMQVNTX05B TUU7dmFyIHJlbmRlcmVkPXRydWU7aWYoKGNsYXNzTmFtZT09Ik9wZW5MYXllcnMu R2VvbWV0cnkuQ29sbGVjdGlvbiIpfHwoY2xhc3NOYW1lPT0iT3BlbkxheWVycy5H ZW9tZXRyeS5NdWx0aVBvaW50Iil8fChjbGFzc05hbWU9PSJPcGVuTGF5ZXJzLkdl b21ldHJ5Lk11bHRpTGluZVN0cmluZyIpfHwoY2xhc3NOYW1lPT0iT3BlbkxheWVy cy5HZW9tZXRyeS5NdWx0aVBvbHlnb24iKSl7Zm9yKHZhciBpPTAsbGVuPWdlb21l dHJ5LmNvbXBvbmVudHMubGVuZ3RoO2k8bGVuO2krKyl7cmVuZGVyZWQ9dGhpcy5k cmF3R2VvbWV0cnkoZ2VvbWV0cnkuY29tcG9uZW50c1tpXSxzdHlsZSxmZWF0dXJl SWQpJiZyZW5kZXJlZDt9CnJldHVybiByZW5kZXJlZDt9O3JlbmRlcmVkPWZhbHNl O3ZhciByZW1vdmVCYWNrZ3JvdW5kPWZhbHNlO2lmKHN0eWxlLmRpc3BsYXkhPSJu b25lIil7aWYoc3R5bGUuYmFja2dyb3VuZEdyYXBoaWMpe3RoaXMucmVkcmF3QmFj a2dyb3VuZE5vZGUoZ2VvbWV0cnkuaWQsZ2VvbWV0cnksc3R5bGUsZmVhdHVyZUlk KTt9ZWxzZXtyZW1vdmVCYWNrZ3JvdW5kPXRydWU7fQpyZW5kZXJlZD10aGlzLnJl ZHJhd05vZGUoZ2VvbWV0cnkuaWQsZ2VvbWV0cnksc3R5bGUsZmVhdHVyZUlkKTt9 CmlmKHJlbmRlcmVkPT1mYWxzZSl7dmFyIG5vZGU9ZG9jdW1lbnQuZ2V0RWxlbWVu dEJ5SWQoZ2VvbWV0cnkuaWQpO2lmKG5vZGUpe2lmKG5vZGUuX3N0eWxlLmJhY2tn cm91bmRHcmFwaGljKXtyZW1vdmVCYWNrZ3JvdW5kPXRydWU7fQpub2RlLnBhcmVu dE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7fX0KaWYocmVtb3ZlQmFja2dyb3VuZCl7 dmFyIG5vZGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2VvbWV0cnkuaWQrdGhp cy5CQUNLR1JPVU5EX0lEX1NVRkZJWCk7aWYobm9kZSl7bm9kZS5wYXJlbnROb2Rl LnJlbW92ZUNoaWxkKG5vZGUpO319CnJldHVybiByZW5kZXJlZDt9LHJlZHJhd05v ZGU6ZnVuY3Rpb24oaWQsZ2VvbWV0cnksc3R5bGUsZmVhdHVyZUlkKXtzdHlsZT10 aGlzLmFwcGx5RGVmYXVsdFN5bWJvbGl6ZXIoc3R5bGUpO3ZhciBub2RlPXRoaXMu bm9kZUZhY3RvcnkoaWQsdGhpcy5nZXROb2RlVHlwZShnZW9tZXRyeSxzdHlsZSkp O25vZGUuX2ZlYXR1cmVJZD1mZWF0dXJlSWQ7bm9kZS5fYm91bmRzQm90dG9tPWdl b21ldHJ5LmdldEJvdW5kcygpLmJvdHRvbTtub2RlLl9nZW9tZXRyeUNsYXNzPWdl b21ldHJ5LkNMQVNTX05BTUU7bm9kZS5fc3R5bGU9c3R5bGU7dmFyIGRyYXdSZXN1 bHQ9dGhpcy5kcmF3R2VvbWV0cnlOb2RlKG5vZGUsZ2VvbWV0cnksc3R5bGUpO2lm KGRyYXdSZXN1bHQ9PT1mYWxzZSl7cmV0dXJuIGZhbHNlO30Kbm9kZT1kcmF3UmVz dWx0Lm5vZGU7aWYodGhpcy5pbmRleGVyKXt2YXIgaW5zZXJ0PXRoaXMuaW5kZXhl ci5pbnNlcnQobm9kZSk7aWYoaW5zZXJ0KXt0aGlzLnZlY3RvclJvb3QuaW5zZXJ0 QmVmb3JlKG5vZGUsaW5zZXJ0KTt9ZWxzZXt0aGlzLnZlY3RvclJvb3QuYXBwZW5k Q2hpbGQobm9kZSk7fX1lbHNle2lmKG5vZGUucGFyZW50Tm9kZSE9PXRoaXMudmVj dG9yUm9vdCl7dGhpcy52ZWN0b3JSb290LmFwcGVuZENoaWxkKG5vZGUpO319CnRo aXMucG9zdERyYXcobm9kZSk7cmV0dXJuIGRyYXdSZXN1bHQuY29tcGxldGU7fSxy ZWRyYXdCYWNrZ3JvdW5kTm9kZTpmdW5jdGlvbihpZCxnZW9tZXRyeSxzdHlsZSxm ZWF0dXJlSWQpe3ZhciBiYWNrZ3JvdW5kU3R5bGU9T3BlbkxheWVycy5VdGlsLmV4 dGVuZCh7fSxzdHlsZSk7YmFja2dyb3VuZFN0eWxlLmV4dGVybmFsR3JhcGhpYz1i YWNrZ3JvdW5kU3R5bGUuYmFja2dyb3VuZEdyYXBoaWM7YmFja2dyb3VuZFN0eWxl LmdyYXBoaWNYT2Zmc2V0PWJhY2tncm91bmRTdHlsZS5iYWNrZ3JvdW5kWE9mZnNl dDtiYWNrZ3JvdW5kU3R5bGUuZ3JhcGhpY1lPZmZzZXQ9YmFja2dyb3VuZFN0eWxl LmJhY2tncm91bmRZT2Zmc2V0O2JhY2tncm91bmRTdHlsZS5ncmFwaGljWkluZGV4 PWJhY2tncm91bmRTdHlsZS5iYWNrZ3JvdW5kR3JhcGhpY1pJbmRleDtiYWNrZ3Jv dW5kU3R5bGUuZ3JhcGhpY1dpZHRoPWJhY2tncm91bmRTdHlsZS5iYWNrZ3JvdW5k V2lkdGh8fGJhY2tncm91bmRTdHlsZS5ncmFwaGljV2lkdGg7YmFja2dyb3VuZFN0 eWxlLmdyYXBoaWNIZWlnaHQ9YmFja2dyb3VuZFN0eWxlLmJhY2tncm91bmRIZWln aHR8fGJhY2tncm91bmRTdHlsZS5ncmFwaGljSGVpZ2h0O2JhY2tncm91bmRTdHls ZS5iYWNrZ3JvdW5kR3JhcGhpYz1udWxsO2JhY2tncm91bmRTdHlsZS5iYWNrZ3Jv dW5kWE9mZnNldD1udWxsO2JhY2tncm91bmRTdHlsZS5iYWNrZ3JvdW5kWU9mZnNl dD1udWxsO2JhY2tncm91bmRTdHlsZS5iYWNrZ3JvdW5kR3JhcGhpY1pJbmRleD1u dWxsO3JldHVybiB0aGlzLnJlZHJhd05vZGUoaWQrdGhpcy5CQUNLR1JPVU5EX0lE X1NVRkZJWCxnZW9tZXRyeSxiYWNrZ3JvdW5kU3R5bGUsbnVsbCk7fSxkcmF3R2Vv bWV0cnlOb2RlOmZ1bmN0aW9uKG5vZGUsZ2VvbWV0cnksc3R5bGUpe3N0eWxlPXN0 eWxlfHxub2RlLl9zdHlsZTt2YXIgb3B0aW9ucz17J2lzRmlsbGVkJzpzdHlsZS5m aWxsPT09dW5kZWZpbmVkP3RydWU6c3R5bGUuZmlsbCwnaXNTdHJva2VkJzpzdHls ZS5zdHJva2U9PT11bmRlZmluZWQ/ISFzdHlsZS5zdHJva2VXaWR0aDpzdHlsZS5z dHJva2V9O3ZhciBkcmF3bjtzd2l0Y2goZ2VvbWV0cnkuQ0xBU1NfTkFNRSl7Y2Fz ZSJPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50IjppZihzdHlsZS5ncmFwaGljPT09 ZmFsc2Upe29wdGlvbnMuaXNGaWxsZWQ9ZmFsc2U7b3B0aW9ucy5pc1N0cm9rZWQ9 ZmFsc2U7fQpkcmF3bj10aGlzLmRyYXdQb2ludChub2RlLGdlb21ldHJ5KTticmVh aztjYXNlIk9wZW5MYXllcnMuR2VvbWV0cnkuTGluZVN0cmluZyI6b3B0aW9ucy5p c0ZpbGxlZD1mYWxzZTtkcmF3bj10aGlzLmRyYXdMaW5lU3RyaW5nKG5vZGUsZ2Vv bWV0cnkpO2JyZWFrO2Nhc2UiT3BlbkxheWVycy5HZW9tZXRyeS5MaW5lYXJSaW5n IjpkcmF3bj10aGlzLmRyYXdMaW5lYXJSaW5nKG5vZGUsZ2VvbWV0cnkpO2JyZWFr O2Nhc2UiT3BlbkxheWVycy5HZW9tZXRyeS5Qb2x5Z29uIjpkcmF3bj10aGlzLmRy YXdQb2x5Z29uKG5vZGUsZ2VvbWV0cnkpO2JyZWFrO2Nhc2UiT3BlbkxheWVycy5H ZW9tZXRyeS5TdXJmYWNlIjpkcmF3bj10aGlzLmRyYXdTdXJmYWNlKG5vZGUsZ2Vv bWV0cnkpO2JyZWFrO2Nhc2UiT3BlbkxheWVycy5HZW9tZXRyeS5SZWN0YW5nbGUi OmRyYXduPXRoaXMuZHJhd1JlY3RhbmdsZShub2RlLGdlb21ldHJ5KTticmVhaztk ZWZhdWx0OmJyZWFrO30Kbm9kZS5fb3B0aW9ucz1vcHRpb25zO2lmKGRyYXduIT1m YWxzZSl7cmV0dXJue25vZGU6dGhpcy5zZXRTdHlsZShub2RlLHN0eWxlLG9wdGlv bnMsZ2VvbWV0cnkpLGNvbXBsZXRlOmRyYXdufTt9ZWxzZXtyZXR1cm4gZmFsc2U7 fX0scG9zdERyYXc6ZnVuY3Rpb24obm9kZSl7fSxkcmF3UG9pbnQ6ZnVuY3Rpb24o bm9kZSxnZW9tZXRyeSl7fSxkcmF3TGluZVN0cmluZzpmdW5jdGlvbihub2RlLGdl b21ldHJ5KXt9LGRyYXdMaW5lYXJSaW5nOmZ1bmN0aW9uKG5vZGUsZ2VvbWV0cnkp e30sZHJhd1BvbHlnb246ZnVuY3Rpb24obm9kZSxnZW9tZXRyeSl7fSxkcmF3UmVj dGFuZ2xlOmZ1bmN0aW9uKG5vZGUsZ2VvbWV0cnkpe30sZHJhd0NpcmNsZTpmdW5j dGlvbihub2RlLGdlb21ldHJ5KXt9LGRyYXdTdXJmYWNlOmZ1bmN0aW9uKG5vZGUs Z2VvbWV0cnkpe30scmVtb3ZlVGV4dDpmdW5jdGlvbihmZWF0dXJlSWQpe3ZhciBs YWJlbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChmZWF0dXJlSWQrdGhpcy5MQUJF TF9JRF9TVUZGSVgpO2lmKGxhYmVsKXt0aGlzLnRleHRSb290LnJlbW92ZUNoaWxk KGxhYmVsKTt9fSxnZXRGZWF0dXJlSWRGcm9tRXZlbnQ6ZnVuY3Rpb24oZXZ0KXt2 YXIgdGFyZ2V0PWV2dC50YXJnZXQ7dmFyIHVzZUVsZW1lbnQ9dGFyZ2V0JiZ0YXJn ZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQ7dmFyIG5vZGU9dXNlRWxlbWVudD91 c2VFbGVtZW50Oih0YXJnZXR8fGV2dC5zcmNFbGVtZW50KTt2YXIgZmVhdHVyZUlk PW5vZGUuX2ZlYXR1cmVJZDtyZXR1cm4gZmVhdHVyZUlkO30sZXJhc2VHZW9tZXRy eTpmdW5jdGlvbihnZW9tZXRyeSxmZWF0dXJlSWQpe2lmKChnZW9tZXRyeS5DTEFT U19OQU1FPT0iT3BlbkxheWVycy5HZW9tZXRyeS5NdWx0aVBvaW50Iil8fChnZW9t ZXRyeS5DTEFTU19OQU1FPT0iT3BlbkxheWVycy5HZW9tZXRyeS5NdWx0aUxpbmVT dHJpbmciKXx8KGdlb21ldHJ5LkNMQVNTX05BTUU9PSJPcGVuTGF5ZXJzLkdlb21l dHJ5Lk11bHRpUG9seWdvbiIpfHwoZ2VvbWV0cnkuQ0xBU1NfTkFNRT09Ik9wZW5M YXllcnMuR2VvbWV0cnkuQ29sbGVjdGlvbiIpKXtmb3IodmFyIGk9MCxsZW49Z2Vv bWV0cnkuY29tcG9uZW50cy5sZW5ndGg7aTxsZW47aSsrKXt0aGlzLmVyYXNlR2Vv bWV0cnkoZ2VvbWV0cnkuY29tcG9uZW50c1tpXSxmZWF0dXJlSWQpO319ZWxzZXt2 YXIgZWxlbWVudD1PcGVuTGF5ZXJzLlV0aWwuZ2V0RWxlbWVudChnZW9tZXRyeS5p ZCk7aWYoZWxlbWVudCYmZWxlbWVudC5wYXJlbnROb2RlKXtpZihlbGVtZW50Lmdl b21ldHJ5KXtlbGVtZW50Lmdlb21ldHJ5LmRlc3Ryb3koKTtlbGVtZW50Lmdlb21l dHJ5PW51bGw7fQplbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVu dCk7aWYodGhpcy5pbmRleGVyKXt0aGlzLmluZGV4ZXIucmVtb3ZlKGVsZW1lbnQp O30KaWYoZWxlbWVudC5fc3R5bGUuYmFja2dyb3VuZEdyYXBoaWMpe3ZhciBiYWNr Z3JvdW5kSWQ9Z2VvbWV0cnkuaWQrdGhpcy5CQUNLR1JPVU5EX0lEX1NVRkZJWDt2 YXIgYkVsZW09T3BlbkxheWVycy5VdGlsLmdldEVsZW1lbnQoYmFja2dyb3VuZElk KTtpZihiRWxlbSYmYkVsZW0ucGFyZW50Tm9kZSl7YkVsZW0ucGFyZW50Tm9kZS5y ZW1vdmVDaGlsZChiRWxlbSk7fX19fX0sbm9kZUZhY3Rvcnk6ZnVuY3Rpb24oaWQs dHlwZSl7dmFyIG5vZGU9T3BlbkxheWVycy5VdGlsLmdldEVsZW1lbnQoaWQpO2lm KG5vZGUpe2lmKCF0aGlzLm5vZGVUeXBlQ29tcGFyZShub2RlLHR5cGUpKXtub2Rl LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7bm9kZT10aGlzLm5vZGVGYWN0 b3J5KGlkLHR5cGUpO319ZWxzZXtub2RlPXRoaXMuY3JlYXRlTm9kZSh0eXBlLGlk KTt9CnJldHVybiBub2RlO30sbm9kZVR5cGVDb21wYXJlOmZ1bmN0aW9uKG5vZGUs dHlwZSl7fSxjcmVhdGVOb2RlOmZ1bmN0aW9uKHR5cGUsaWQpe30sbW92ZVJvb3Q6 ZnVuY3Rpb24ocmVuZGVyZXIpe3ZhciByb290PXRoaXMucm9vdDtpZihyZW5kZXJl ci5yb290LnBhcmVudE5vZGU9PXRoaXMucmVuZGVyZXJSb290KXtyb290PXJlbmRl cmVyLnJvb3Q7fQpyb290LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocm9vdCk7cmVu ZGVyZXIucmVuZGVyZXJSb290LmFwcGVuZENoaWxkKHJvb3QpO30sZ2V0UmVuZGVy TGF5ZXJJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJvb3QucGFyZW50Tm9kZS5w YXJlbnROb2RlLmlkO30saXNDb21wbGV4U3ltYm9sOmZ1bmN0aW9uKGdyYXBoaWNO YW1lKXtyZXR1cm4oZ3JhcGhpY05hbWUhPSJjaXJjbGUiKSYmISFncmFwaGljTmFt ZTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuUmVuZGVyZXIuRWxlbWVudHMifSk7 T3BlbkxheWVycy5SZW5kZXJlci5zeW1ib2w9eyJzdGFyIjpbMzUwLDc1LDM3OSwx NjEsNDY5LDE2MSwzOTcsMjE1LDQyMywzMDEsMzUwLDI1MCwyNzcsMzAxLDMwMywy MTUsMjMxLDE2MSwzMjEsMTYxLDM1MCw3NV0sImNyb3NzIjpbNCwwLDYsMCw2LDQs MTAsNCwxMCw2LDYsNiw2LDEwLDQsMTAsNCw2LDAsNiwwLDQsNCw0LDQsMF0sIngi OlswLDAsMjUsMCw1MCwzNSw3NSwwLDEwMCwwLDY1LDUwLDEwMCwxMDAsNzUsMTAw LDUwLDY1LDI1LDEwMCwwLDEwMCwzNSw1MCwwLDBdLCJzcXVhcmUiOlswLDAsMCwx LDEsMSwxLDAsMCwwXSwidHJpYW5nbGUiOlswLDEwLDEwLDEwLDUsMCwwLDEwXX07 T3BlbkxheWVycy5Db250cm9sLkFyZ1BhcnNlcj1PcGVuTGF5ZXJzLkNsYXNzKE9w ZW5MYXllcnMuQ29udHJvbCx7Y2VudGVyOm51bGwsem9vbTpudWxsLGxheWVyczpu dWxsLGRpc3BsYXlQcm9qZWN0aW9uOm51bGwsZ2V0UGFyYW1ldGVyczpmdW5jdGlv bih1cmwpe3VybD11cmx8fHdpbmRvdy5sb2NhdGlvbi5ocmVmO3ZhciBwYXJhbWV0 ZXJzPU9wZW5MYXllcnMuVXRpbC5nZXRQYXJhbWV0ZXJzKHVybCk7dmFyIGluZGV4 PXVybC5pbmRleE9mKCcjJyk7aWYoaW5kZXg+MCl7dXJsPSc/Jyt1cmwuc3Vic3Ry aW5nKGluZGV4KzEsdXJsLmxlbmd0aCk7T3BlbkxheWVycy5VdGlsLmV4dGVuZChw YXJhbWV0ZXJzLE9wZW5MYXllcnMuVXRpbC5nZXRQYXJhbWV0ZXJzKHVybCkpO30K cmV0dXJuIHBhcmFtZXRlcnM7fSxzZXRNYXA6ZnVuY3Rpb24obWFwKXtPcGVuTGF5 ZXJzLkNvbnRyb2wucHJvdG90eXBlLnNldE1hcC5hcHBseSh0aGlzLGFyZ3VtZW50 cyk7Zm9yKHZhciBpPTAsbGVuPXRoaXMubWFwLmNvbnRyb2xzLmxlbmd0aDtpPGxl bjtpKyspe3ZhciBjb250cm9sPXRoaXMubWFwLmNvbnRyb2xzW2ldO2lmKChjb250 cm9sIT10aGlzKSYmKGNvbnRyb2wuQ0xBU1NfTkFNRT09Ik9wZW5MYXllcnMuQ29u dHJvbC5BcmdQYXJzZXIiKSl7aWYoY29udHJvbC5kaXNwbGF5UHJvamVjdGlvbiE9 dGhpcy5kaXNwbGF5UHJvamVjdGlvbil7dGhpcy5kaXNwbGF5UHJvamVjdGlvbj1j b250cm9sLmRpc3BsYXlQcm9qZWN0aW9uO30KYnJlYWs7fX0KaWYoaT09dGhpcy5t YXAuY29udHJvbHMubGVuZ3RoKXt2YXIgYXJncz10aGlzLmdldFBhcmFtZXRlcnMo KTtpZihhcmdzLmxheWVycyl7dGhpcy5sYXllcnM9YXJncy5sYXllcnM7dGhpcy5t YXAuZXZlbnRzLnJlZ2lzdGVyKCdhZGRsYXllcicsdGhpcyx0aGlzLmNvbmZpZ3Vy ZUxheWVycyk7dGhpcy5jb25maWd1cmVMYXllcnMoKTt9CmlmKGFyZ3MubGF0JiZh cmdzLmxvbil7dGhpcy5jZW50ZXI9bmV3IE9wZW5MYXllcnMuTG9uTGF0KHBhcnNl RmxvYXQoYXJncy5sb24pLHBhcnNlRmxvYXQoYXJncy5sYXQpKTtpZihhcmdzLnpv b20pe3RoaXMuem9vbT1wYXJzZUludChhcmdzLnpvb20pO30KdGhpcy5tYXAuZXZl bnRzLnJlZ2lzdGVyKCdjaGFuZ2ViYXNlbGF5ZXInLHRoaXMsdGhpcy5zZXRDZW50 ZXIpO3RoaXMuc2V0Q2VudGVyKCk7fX19LHNldENlbnRlcjpmdW5jdGlvbigpe2lm KHRoaXMubWFwLmJhc2VMYXllcil7dGhpcy5tYXAuZXZlbnRzLnVucmVnaXN0ZXIo J2NoYW5nZWJhc2VsYXllcicsdGhpcyx0aGlzLnNldENlbnRlcik7aWYodGhpcy5k aXNwbGF5UHJvamVjdGlvbil7dGhpcy5jZW50ZXIudHJhbnNmb3JtKHRoaXMuZGlz cGxheVByb2plY3Rpb24sdGhpcy5tYXAuZ2V0UHJvamVjdGlvbk9iamVjdCgpKTt9 CnRoaXMubWFwLnNldENlbnRlcih0aGlzLmNlbnRlcix0aGlzLnpvb20pO319LGNv bmZpZ3VyZUxheWVyczpmdW5jdGlvbigpe2lmKHRoaXMubGF5ZXJzLmxlbmd0aD09 dGhpcy5tYXAubGF5ZXJzLmxlbmd0aCl7dGhpcy5tYXAuZXZlbnRzLnVucmVnaXN0 ZXIoJ2FkZGxheWVyJyx0aGlzLHRoaXMuY29uZmlndXJlTGF5ZXJzKTtmb3IodmFy IGk9MCxsZW49dGhpcy5sYXllcnMubGVuZ3RoO2k8bGVuO2krKyl7dmFyIGxheWVy PXRoaXMubWFwLmxheWVyc1tpXTt2YXIgYz10aGlzLmxheWVycy5jaGFyQXQoaSk7 aWYoYz09IkIiKXt0aGlzLm1hcC5zZXRCYXNlTGF5ZXIobGF5ZXIpO31lbHNlIGlm KChjPT0iVCIpfHwoYz09IkYiKSl7bGF5ZXIuc2V0VmlzaWJpbGl0eShjPT0iVCIp O319fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Db250cm9sLkFyZ1BhcnNlciJ9 KTtPcGVuTGF5ZXJzLkNvbnRyb2wuUGVybWFsaW5rPU9wZW5MYXllcnMuQ2xhc3Mo T3BlbkxheWVycy5Db250cm9sLHthcmdQYXJzZXJDbGFzczpPcGVuTGF5ZXJzLkNv bnRyb2wuQXJnUGFyc2VyLGVsZW1lbnQ6bnVsbCxhbmNob3I6ZmFsc2UsYmFzZTon JyxkaXNwbGF5UHJvamVjdGlvbjpudWxsLGluaXRpYWxpemU6ZnVuY3Rpb24oZWxl bWVudCxiYXNlLG9wdGlvbnMpe2lmKGVsZW1lbnQhPT1udWxsJiZ0eXBlb2YgZWxl bWVudD09J29iamVjdCcmJiFPcGVuTGF5ZXJzLlV0aWwuaXNFbGVtZW50KGVsZW1l bnQpKXtvcHRpb25zPWVsZW1lbnQ7dGhpcy5iYXNlPWRvY3VtZW50LmxvY2F0aW9u LmhyZWY7T3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5pbml0aWFsaXplLmFw cGx5KHRoaXMsW29wdGlvbnNdKTtpZih0aGlzLmVsZW1lbnQhPW51bGwpe3RoaXMu ZWxlbWVudD1PcGVuTGF5ZXJzLlV0aWwuZ2V0RWxlbWVudCh0aGlzLmVsZW1lbnQp O319CmVsc2V7T3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5pbml0aWFsaXpl LmFwcGx5KHRoaXMsW29wdGlvbnNdKTt0aGlzLmVsZW1lbnQ9T3BlbkxheWVycy5V dGlsLmdldEVsZW1lbnQoZWxlbWVudCk7dGhpcy5iYXNlPWJhc2V8fGRvY3VtZW50 LmxvY2F0aW9uLmhyZWY7fX0sZGVzdHJveTpmdW5jdGlvbigpe2lmKHRoaXMuZWxl bWVudC5wYXJlbnROb2RlPT10aGlzLmRpdil7dGhpcy5kaXYucmVtb3ZlQ2hpbGQo dGhpcy5lbGVtZW50KTt9CnRoaXMuZWxlbWVudD1udWxsO3RoaXMubWFwLmV2ZW50 cy51bnJlZ2lzdGVyKCdtb3ZlZW5kJyx0aGlzLHRoaXMudXBkYXRlTGluayk7T3Bl bkxheWVycy5Db250cm9sLnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJn dW1lbnRzKTt9LHNldE1hcDpmdW5jdGlvbihtYXApe09wZW5MYXllcnMuQ29udHJv bC5wcm90b3R5cGUuc2V0TWFwLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtmb3IodmFy IGk9MCxsZW49dGhpcy5tYXAuY29udHJvbHMubGVuZ3RoO2k8bGVuO2krKyl7dmFy IGNvbnRyb2w9dGhpcy5tYXAuY29udHJvbHNbaV07aWYoY29udHJvbC5DTEFTU19O QU1FPT10aGlzLmFyZ1BhcnNlckNsYXNzLkNMQVNTX05BTUUpe2lmKGNvbnRyb2wu ZGlzcGxheVByb2plY3Rpb24hPXRoaXMuZGlzcGxheVByb2plY3Rpb24pe3RoaXMu ZGlzcGxheVByb2plY3Rpb249Y29udHJvbC5kaXNwbGF5UHJvamVjdGlvbjt9CmJy ZWFrO319CmlmKGk9PXRoaXMubWFwLmNvbnRyb2xzLmxlbmd0aCl7dGhpcy5tYXAu YWRkQ29udHJvbChuZXcgdGhpcy5hcmdQYXJzZXJDbGFzcyh7J2Rpc3BsYXlQcm9q ZWN0aW9uJzp0aGlzLmRpc3BsYXlQcm9qZWN0aW9ufSkpO319LGRyYXc6ZnVuY3Rp b24oKXtPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90eXBlLmRyYXcuYXBwbHkodGhp cyxhcmd1bWVudHMpO2lmKCF0aGlzLmVsZW1lbnQmJiF0aGlzLmFuY2hvcil7dGhp cy5lbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTt0aGlzLmVsZW1l bnQuaW5uZXJIVE1MPU9wZW5MYXllcnMuaTE4bigiUGVybWFsaW5rIik7dGhpcy5l bGVtZW50LmhyZWY9IiI7dGhpcy5kaXYuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50 KTt9CnRoaXMubWFwLmV2ZW50cy5vbih7J21vdmVlbmQnOnRoaXMudXBkYXRlTGlu aywnY2hhbmdlbGF5ZXInOnRoaXMudXBkYXRlTGluaywnY2hhbmdlYmFzZWxheWVy Jzp0aGlzLnVwZGF0ZUxpbmssc2NvcGU6dGhpc30pO3RoaXMudXBkYXRlTGluaygp O3JldHVybiB0aGlzLmRpdjt9LHVwZGF0ZUxpbms6ZnVuY3Rpb24oKXt2YXIgc2Vw YXJhdG9yPXRoaXMuYW5jaG9yPycjJzonPyc7dmFyIGhyZWY9dGhpcy5iYXNlO2lm KGhyZWYuaW5kZXhPZihzZXBhcmF0b3IpIT0tMSl7aHJlZj1ocmVmLnN1YnN0cmlu ZygwLGhyZWYuaW5kZXhPZihzZXBhcmF0b3IpKTt9CmhyZWYrPXNlcGFyYXRvcitP cGVuTGF5ZXJzLlV0aWwuZ2V0UGFyYW1ldGVyU3RyaW5nKHRoaXMuY3JlYXRlUGFy YW1zKCkpO2lmKHRoaXMuYW5jaG9yJiYhdGhpcy5lbGVtZW50KXt3aW5kb3cubG9j YXRpb24uaHJlZj1ocmVmO30KZWxzZXt0aGlzLmVsZW1lbnQuaHJlZj1ocmVmO319 LGNyZWF0ZVBhcmFtczpmdW5jdGlvbihjZW50ZXIsem9vbSxsYXllcnMpe2NlbnRl cj1jZW50ZXJ8fHRoaXMubWFwLmdldENlbnRlcigpO3ZhciBwYXJhbXM9T3Blbkxh eWVycy5VdGlsLmdldFBhcmFtZXRlcnModGhpcy5iYXNlKTtpZihjZW50ZXIpe3Bh cmFtcy56b29tPXpvb218fHRoaXMubWFwLmdldFpvb20oKTt2YXIgbGF0PWNlbnRl ci5sYXQ7dmFyIGxvbj1jZW50ZXIubG9uO2lmKHRoaXMuZGlzcGxheVByb2plY3Rp b24pe3ZhciBtYXBQb3NpdGlvbj1PcGVuTGF5ZXJzLlByb2plY3Rpb24udHJhbnNm b3JtKHt4Omxvbix5OmxhdH0sdGhpcy5tYXAuZ2V0UHJvamVjdGlvbk9iamVjdCgp LHRoaXMuZGlzcGxheVByb2plY3Rpb24pO2xvbj1tYXBQb3NpdGlvbi54O2xhdD1t YXBQb3NpdGlvbi55O30KcGFyYW1zLmxhdD1NYXRoLnJvdW5kKGxhdCoxMDAwMDAp LzEwMDAwMDtwYXJhbXMubG9uPU1hdGgucm91bmQobG9uKjEwMDAwMCkvMTAwMDAw O2xheWVycz1sYXllcnN8fHRoaXMubWFwLmxheWVycztwYXJhbXMubGF5ZXJzPScn O2Zvcih2YXIgaT0wLGxlbj1sYXllcnMubGVuZ3RoO2k8bGVuO2krKyl7dmFyIGxh eWVyPWxheWVyc1tpXTtpZihsYXllci5pc0Jhc2VMYXllcil7cGFyYW1zLmxheWVy cys9KGxheWVyPT10aGlzLm1hcC5iYXNlTGF5ZXIpPyJCIjoiMCI7fWVsc2V7cGFy YW1zLmxheWVycys9KGxheWVyLmdldFZpc2liaWxpdHkoKSk/IlQiOiJGIjt9fX0K cmV0dXJuIHBhcmFtczt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuQ29udHJvbC5Q ZXJtYWxpbmsifSk7T3BlbkxheWVycy5MYXllci5UTVM9T3BlbkxheWVycy5DbGFz cyhPcGVuTGF5ZXJzLkxheWVyLkdyaWQse3NlcnZpY2VWZXJzaW9uOiIxLjAuMCIs bGF5ZXJuYW1lOm51bGwsdHlwZTpudWxsLGlzQmFzZUxheWVyOnRydWUsdGlsZU9y aWdpbjpudWxsLHNlcnZlclJlc29sdXRpb25zOm51bGwsem9vbU9mZnNldDowLGlu aXRpYWxpemU6ZnVuY3Rpb24obmFtZSx1cmwsb3B0aW9ucyl7dmFyIG5ld0FyZ3Vt ZW50cz1bXTtuZXdBcmd1bWVudHMucHVzaChuYW1lLHVybCx7fSxvcHRpb25zKTtP cGVuTGF5ZXJzLkxheWVyLkdyaWQucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHko dGhpcyxuZXdBcmd1bWVudHMpO30sZGVzdHJveTpmdW5jdGlvbigpe09wZW5MYXll cnMuTGF5ZXIuR3JpZC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLGFyZ3Vt ZW50cyk7fSxjbG9uZTpmdW5jdGlvbihvYmope2lmKG9iaj09bnVsbCl7b2JqPW5l dyBPcGVuTGF5ZXJzLkxheWVyLlRNUyh0aGlzLm5hbWUsdGhpcy51cmwsdGhpcy5n ZXRPcHRpb25zKCkpO30Kb2JqPU9wZW5MYXllcnMuTGF5ZXIuR3JpZC5wcm90b3R5 cGUuY2xvbmUuYXBwbHkodGhpcyxbb2JqXSk7cmV0dXJuIG9iajt9LGdldFVSTDpm dW5jdGlvbihib3VuZHMpe2JvdW5kcz10aGlzLmFkanVzdEJvdW5kcyhib3VuZHMp O3ZhciByZXM9dGhpcy5tYXAuZ2V0UmVzb2x1dGlvbigpO3ZhciB4PU1hdGgucm91 bmQoKGJvdW5kcy5sZWZ0LXRoaXMudGlsZU9yaWdpbi5sb24pLyhyZXMqdGhpcy50 aWxlU2l6ZS53KSk7dmFyIHk9TWF0aC5yb3VuZCgoYm91bmRzLmJvdHRvbS10aGlz LnRpbGVPcmlnaW4ubGF0KS8ocmVzKnRoaXMudGlsZVNpemUuaCkpO3ZhciB6PXRo aXMuc2VydmVyUmVzb2x1dGlvbnMhPW51bGw/T3BlbkxheWVycy5VdGlsLmluZGV4 T2YodGhpcy5zZXJ2ZXJSZXNvbHV0aW9ucyxyZXMpOnRoaXMubWFwLmdldFpvb20o KSt0aGlzLnpvb21PZmZzZXQ7dmFyIHBhdGg9dGhpcy5zZXJ2aWNlVmVyc2lvbisi LyIrdGhpcy5sYXllcm5hbWUrIi8iK3orIi8iK3grIi8iK3krIi4iK3RoaXMudHlw ZTt2YXIgdXJsPXRoaXMudXJsO2lmKE9wZW5MYXllcnMuVXRpbC5pc0FycmF5KHVy bCkpe3VybD10aGlzLnNlbGVjdFVybChwYXRoLHVybCk7fQpyZXR1cm4gdXJsK3Bh dGg7fSxzZXRNYXA6ZnVuY3Rpb24obWFwKXtPcGVuTGF5ZXJzLkxheWVyLkdyaWQu cHJvdG90eXBlLnNldE1hcC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMu dGlsZU9yaWdpbil7dGhpcy50aWxlT3JpZ2luPW5ldyBPcGVuTGF5ZXJzLkxvbkxh dCh0aGlzLm1hcC5tYXhFeHRlbnQubGVmdCx0aGlzLm1hcC5tYXhFeHRlbnQuYm90 dG9tKTt9fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkxheWVyLlRNUyJ9KTtPcGVu TGF5ZXJzLlN0cmF0ZWd5LkZpeGVkPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVy cy5TdHJhdGVneSx7cHJlbG9hZDpmYWxzZSxhY3RpdmF0ZTpmdW5jdGlvbigpe2lm KE9wZW5MYXllcnMuU3RyYXRlZ3kucHJvdG90eXBlLmFjdGl2YXRlLmFwcGx5KHRo aXMsYXJndW1lbnRzKSl7dGhpcy5sYXllci5ldmVudHMub24oeyJyZWZyZXNoIjp0 aGlzLmxvYWQsc2NvcGU6dGhpc30pO2lmKHRoaXMubGF5ZXIudmlzaWJpbGl0eT09 dHJ1ZXx8dGhpcy5wcmVsb2FkKXt0aGlzLmxvYWQoKTt9ZWxzZXt0aGlzLmxheWVy LmV2ZW50cy5vbih7InZpc2liaWxpdHljaGFuZ2VkIjp0aGlzLmxvYWQsc2NvcGU6 dGhpc30pO30KcmV0dXJuIHRydWU7fQpyZXR1cm4gZmFsc2U7fSxkZWFjdGl2YXRl OmZ1bmN0aW9uKCl7dmFyIGRlYWN0aXZhdGVkPU9wZW5MYXllcnMuU3RyYXRlZ3ku cHJvdG90eXBlLmRlYWN0aXZhdGUuY2FsbCh0aGlzKTtpZihkZWFjdGl2YXRlZCl7 dGhpcy5sYXllci5ldmVudHMudW4oeyJyZWZyZXNoIjp0aGlzLmxvYWQsInZpc2li aWxpdHljaGFuZ2VkIjp0aGlzLmxvYWQsc2NvcGU6dGhpc30pO30KcmV0dXJuIGRl YWN0aXZhdGVkO30sbG9hZDpmdW5jdGlvbihvcHRpb25zKXt2YXIgbGF5ZXI9dGhp cy5sYXllcjtsYXllci5ldmVudHMudHJpZ2dlckV2ZW50KCJsb2Fkc3RhcnQiKTts YXllci5wcm90b2NvbC5yZWFkKE9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRz KHtjYWxsYmFjazpPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQodGhpcy5tZXJnZSx0 aGlzLGxheWVyLm1hcC5nZXRQcm9qZWN0aW9uT2JqZWN0KCkpLGZpbHRlcjpsYXll ci5maWx0ZXJ9LG9wdGlvbnMpKTtsYXllci5ldmVudHMudW4oeyJ2aXNpYmlsaXR5 Y2hhbmdlZCI6dGhpcy5sb2FkLHNjb3BlOnRoaXN9KTt9LG1lcmdlOmZ1bmN0aW9u KG1hcFByb2plY3Rpb24scmVzcCl7dmFyIGxheWVyPXRoaXMubGF5ZXI7bGF5ZXIu ZGVzdHJveUZlYXR1cmVzKCk7dmFyIGZlYXR1cmVzPXJlc3AuZmVhdHVyZXM7aWYo ZmVhdHVyZXMmJmZlYXR1cmVzLmxlbmd0aD4wKXtpZighbWFwUHJvamVjdGlvbi5l cXVhbHMobGF5ZXIucHJvamVjdGlvbikpe3ZhciBnZW9tO2Zvcih2YXIgaT0wLGxl bj1mZWF0dXJlcy5sZW5ndGg7aTxsZW47KytpKXtnZW9tPWZlYXR1cmVzW2ldLmdl b21ldHJ5O2lmKGdlb20pe2dlb20udHJhbnNmb3JtKGxheWVyLnByb2plY3Rpb24s bWFwUHJvamVjdGlvbik7fX19CmxheWVyLmFkZEZlYXR1cmVzKGZlYXR1cmVzKTt9 CmxheWVyLmV2ZW50cy50cmlnZ2VyRXZlbnQoImxvYWRlbmQiKTt9LENMQVNTX05B TUU6Ik9wZW5MYXllcnMuU3RyYXRlZ3kuRml4ZWQifSk7T3BlbkxheWVycy5Gb3Jt YXQuV0ZTQ2FwYWJpbGl0aWVzPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5G b3JtYXQuWE1MLlZlcnNpb25lZE9HQyx7ZGVmYXVsdFZlcnNpb246IjEuMS4wIixl cnJvclByb3BlcnR5OiJzZXJ2aWNlIixDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZv cm1hdC5XRlNDYXBhYmlsaXRpZXMifSk7T3BlbkxheWVycy5Gb3JtYXQuV0ZTQ2Fw YWJpbGl0aWVzLnYxPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Gb3JtYXQu V0ZTQ2FwYWJpbGl0aWVzLHtpbml0aWFsaXplOmZ1bmN0aW9uKG9wdGlvbnMpe09w ZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0 aGlzLFtvcHRpb25zXSk7dGhpcy5vcHRpb25zPW9wdGlvbnM7fSxyZWFkOmZ1bmN0 aW9uKGRhdGEpe2lmKHR5cGVvZiBkYXRhPT0ic3RyaW5nIil7ZGF0YT1PcGVuTGF5 ZXJzLkZvcm1hdC5YTUwucHJvdG90eXBlLnJlYWQuYXBwbHkodGhpcyxbZGF0YV0p O30KdmFyIGNhcGFiaWxpdGllcz17fTt2YXIgcm9vdD1kYXRhLmRvY3VtZW50RWxl bWVudDt0aGlzLnJ1bkNoaWxkTm9kZXMoY2FwYWJpbGl0aWVzLHJvb3QpO3JldHVy biBjYXBhYmlsaXRpZXM7fSxydW5DaGlsZE5vZGVzOmZ1bmN0aW9uKG9iaixub2Rl KXt2YXIgY2hpbGRyZW49bm9kZS5jaGlsZE5vZGVzO3ZhciBjaGlsZE5vZGUscHJv Y2Vzc29yO2Zvcih2YXIgaT0wO2k8Y2hpbGRyZW4ubGVuZ3RoOysraSl7Y2hpbGRO b2RlPWNoaWxkcmVuW2ldO2lmKGNoaWxkTm9kZS5ub2RlVHlwZT09MSl7cHJvY2Vz c29yPXRoaXNbInJlYWRfY2FwXyIrY2hpbGROb2RlLm5vZGVOYW1lXTtpZihwcm9j ZXNzb3Ipe3Byb2Nlc3Nvci5hcHBseSh0aGlzLFtvYmosY2hpbGROb2RlXSk7fX19 fSxyZWFkX2NhcF9GZWF0dXJlVHlwZUxpc3Q6ZnVuY3Rpb24ocmVxdWVzdCxub2Rl KXt2YXIgZmVhdHVyZVR5cGVMaXN0PXtmZWF0dXJlVHlwZXM6W119O3RoaXMucnVu Q2hpbGROb2RlcyhmZWF0dXJlVHlwZUxpc3Qsbm9kZSk7cmVxdWVzdC5mZWF0dXJl VHlwZUxpc3Q9ZmVhdHVyZVR5cGVMaXN0O30scmVhZF9jYXBfRmVhdHVyZVR5cGU6 ZnVuY3Rpb24oZmVhdHVyZVR5cGVMaXN0LG5vZGUscGFyZW50TGF5ZXIpe3ZhciBm ZWF0dXJlVHlwZT17fTt0aGlzLnJ1bkNoaWxkTm9kZXMoZmVhdHVyZVR5cGUsbm9k ZSk7ZmVhdHVyZVR5cGVMaXN0LmZlYXR1cmVUeXBlcy5wdXNoKGZlYXR1cmVUeXBl KTt9LHJlYWRfY2FwX05hbWU6ZnVuY3Rpb24ob2JqLG5vZGUpe3ZhciBuYW1lPXRo aXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTtpZihuYW1lKXt2YXIgcGFydHM9bmFtZS5z cGxpdCgiOiIpO29iai5uYW1lPXBhcnRzLnBvcCgpO2lmKHBhcnRzLmxlbmd0aD4w KXtvYmouZmVhdHVyZU5TPXRoaXMubG9va3VwTmFtZXNwYWNlVVJJKG5vZGUscGFy dHNbMF0pO319fSxyZWFkX2NhcF9UaXRsZTpmdW5jdGlvbihvYmosbm9kZSl7dmFy IHRpdGxlPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTtpZih0aXRsZSl7b2JqLnRp dGxlPXRpdGxlO319LHJlYWRfY2FwX0Fic3RyYWN0OmZ1bmN0aW9uKG9iaixub2Rl KXt2YXIgYWJzdD10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7aWYoYWJzdCl7b2Jq WyJhYnN0cmFjdCJdPWFic3Q7fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3Jt YXQuV0ZTQ2FwYWJpbGl0aWVzLnYxIn0pO09wZW5MYXllcnMuRm9ybWF0LldGU0Nh cGFiaWxpdGllcy52MV8xXzA9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkZv cm1hdC5XRlNDYXBhYmlsaXRpZXMudjEse2luaXRpYWxpemU6ZnVuY3Rpb24ob3B0 aW9ucyl7T3BlbkxheWVycy5Gb3JtYXQuV0ZTQ2FwYWJpbGl0aWVzLnYxLnByb3Rv dHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW29wdGlvbnNdKTt9LHJlYWRfY2Fw X0RlZmF1bHRTUlM6ZnVuY3Rpb24ob2JqLG5vZGUpe3ZhciBkZWZhdWx0U1JTPXRo aXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTtpZihkZWZhdWx0U1JTKXtvYmouc3JzPWRl ZmF1bHRTUlM7fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3JtYXQuV0ZTQ2Fw YWJpbGl0aWVzLnYxXzFfMCJ9KTtPcGVuTGF5ZXJzLkxheWVyLlBvaW50VHJhY2s9 T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkxheWVyLlZlY3Rvcix7ZGF0YUZy b206bnVsbCxzdHlsZUZyb206bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKG5hbWUs b3B0aW9ucyl7T3BlbkxheWVycy5MYXllci5WZWN0b3IucHJvdG90eXBlLmluaXRp YWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO30sYWRkTm9kZXM6ZnVuY3Rpb24o cG9pbnRGZWF0dXJlcyxvcHRpb25zKXtpZihwb2ludEZlYXR1cmVzLmxlbmd0aDwy KXtPcGVuTGF5ZXJzLkNvbnNvbGUuZXJyb3IoIkF0IGxlYXN0IHR3byBwb2ludCBm ZWF0dXJlcyBoYXZlIHRvIGJlIGFkZGVkIHRvIGNyZWF0ZSIrImEgbGluZSBmcm9t Iik7cmV0dXJuO30KdmFyIGxpbmVzPW5ldyBBcnJheShwb2ludEZlYXR1cmVzLmxl bmd0aC0xKTt2YXIgcG9pbnRGZWF0dXJlLHN0YXJ0UG9pbnQsZW5kUG9pbnQ7Zm9y KHZhciBpPTAsbGVuPXBvaW50RmVhdHVyZXMubGVuZ3RoO2k8bGVuO2krKyl7cG9p bnRGZWF0dXJlPXBvaW50RmVhdHVyZXNbaV07ZW5kUG9pbnQ9cG9pbnRGZWF0dXJl Lmdlb21ldHJ5O2lmKCFlbmRQb2ludCl7dmFyIGxvbmxhdD1wb2ludEZlYXR1cmUu bG9ubGF0O2VuZFBvaW50PW5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KGxv bmxhdC5sb24sbG9ubGF0LmxhdCk7fWVsc2UgaWYoZW5kUG9pbnQuQ0xBU1NfTkFN RSE9Ik9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQiKXtPcGVuTGF5ZXJzLkNvbnNv bGUuZXJyb3IoIk9ubHkgZmVhdHVyZXMgd2l0aCBwb2ludCBnZW9tZXRyaWVzIGFy ZSBzdXBwb3J0ZWQuIik7cmV0dXJuO30KaWYoaT4wKXt2YXIgYXR0cmlidXRlcz0o dGhpcy5kYXRhRnJvbSE9bnVsbCk/KHBvaW50RmVhdHVyZXNbaSt0aGlzLmRhdGFG cm9tXS5kYXRhfHxwb2ludEZlYXR1cmVzW2krdGhpcy5kYXRhRnJvbV0uYXR0cmli dXRlcyk6bnVsbDt2YXIgc3R5bGU9KHRoaXMuc3R5bGVGcm9tIT1udWxsKT8ocG9p bnRGZWF0dXJlc1tpK3RoaXMuc3R5bGVGcm9tXS5zdHlsZSk6bnVsbDt2YXIgbGlu ZT1uZXcgT3BlbkxheWVycy5HZW9tZXRyeS5MaW5lU3RyaW5nKFtzdGFydFBvaW50 LGVuZFBvaW50XSk7bGluZXNbaS0xXT1uZXcgT3BlbkxheWVycy5GZWF0dXJlLlZl Y3RvcihsaW5lLGF0dHJpYnV0ZXMsc3R5bGUpO30Kc3RhcnRQb2ludD1lbmRQb2lu dDt9CnRoaXMuYWRkRmVhdHVyZXMobGluZXMsb3B0aW9ucyk7fSxDTEFTU19OQU1F OiJPcGVuTGF5ZXJzLkxheWVyLlBvaW50VHJhY2sifSk7T3BlbkxheWVycy5MYXll ci5Qb2ludFRyYWNrLlNPVVJDRV9OT0RFPS0xO09wZW5MYXllcnMuTGF5ZXIuUG9p bnRUcmFjay5UQVJHRVRfTk9ERT0wO09wZW5MYXllcnMuTGF5ZXIuUG9pbnRUcmFj ay5kYXRhRnJvbT17J1NPVVJDRV9OT0RFJzotMSwnVEFSR0VUX05PREUnOjB9O09w ZW5MYXllcnMuUHJvdG9jb2wuV0ZTPWZ1bmN0aW9uKG9wdGlvbnMpe29wdGlvbnM9 T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMob3B0aW9ucyxPcGVuTGF5ZXJz LlByb3RvY29sLldGUy5ERUZBVUxUUyk7dmFyIGNscz1PcGVuTGF5ZXJzLlByb3Rv Y29sLldGU1sidiIrb3B0aW9ucy52ZXJzaW9uLnJlcGxhY2UoL1wuL2csIl8iKV07 aWYoIWNscyl7dGhyb3ciVW5zdXBwb3J0ZWQgV0ZTIHZlcnNpb246ICIrb3B0aW9u cy52ZXJzaW9uO30KcmV0dXJuIG5ldyBjbHMob3B0aW9ucyk7fTtPcGVuTGF5ZXJz LlByb3RvY29sLldGUy5mcm9tV01TTGF5ZXI9ZnVuY3Rpb24obGF5ZXIsb3B0aW9u cyl7dmFyIHR5cGVOYW1lLGZlYXR1cmVQcmVmaXg7dmFyIHBhcmFtPWxheWVyLnBh cmFtc1siTEFZRVJTIl07dmFyIHBhcnRzPShPcGVuTGF5ZXJzLlV0aWwuaXNBcnJh eShwYXJhbSk/cGFyYW1bMF06cGFyYW0pLnNwbGl0KCI6Iik7aWYocGFydHMubGVu Z3RoPjEpe2ZlYXR1cmVQcmVmaXg9cGFydHNbMF07fQp0eXBlTmFtZT1wYXJ0cy5w b3AoKTt2YXIgcHJvdG9jb2xPcHRpb25zPXt1cmw6bGF5ZXIudXJsLGZlYXR1cmVU eXBlOnR5cGVOYW1lLGZlYXR1cmVQcmVmaXg6ZmVhdHVyZVByZWZpeCxzcnNOYW1l OmxheWVyLnByb2plY3Rpb24mJmxheWVyLnByb2plY3Rpb24uZ2V0Q29kZSgpfHxs YXllci5tYXAmJmxheWVyLm1hcC5nZXRQcm9qZWN0aW9uT2JqZWN0KCkuZ2V0Q29k ZSgpLHZlcnNpb246IjEuMS4wIn07cmV0dXJuIG5ldyBPcGVuTGF5ZXJzLlByb3Rv Y29sLldGUyhPcGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyhvcHRpb25zLHBy b3RvY29sT3B0aW9ucykpO307T3BlbkxheWVycy5Qcm90b2NvbC5XRlMuREVGQVVM VFM9eyJ2ZXJzaW9uIjoiMS4wLjAifTtPcGVuTGF5ZXJzLkxheWVyLk1hcmtlcnM9 T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkxheWVyLHtpc0Jhc2VMYXllcjpm YWxzZSxtYXJrZXJzOm51bGwsZHJhd246ZmFsc2UsaW5pdGlhbGl6ZTpmdW5jdGlv bihuYW1lLG9wdGlvbnMpe09wZW5MYXllcnMuTGF5ZXIucHJvdG90eXBlLmluaXRp YWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubWFya2Vycz1bXTt9LGRl c3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmNsZWFyTWFya2VycygpO3RoaXMubWFya2Vy cz1udWxsO09wZW5MYXllcnMuTGF5ZXIucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHko dGhpcyxhcmd1bWVudHMpO30sc2V0T3BhY2l0eTpmdW5jdGlvbihvcGFjaXR5KXtp ZihvcGFjaXR5IT10aGlzLm9wYWNpdHkpe3RoaXMub3BhY2l0eT1vcGFjaXR5O2Zv cih2YXIgaT0wLGxlbj10aGlzLm1hcmtlcnMubGVuZ3RoO2k8bGVuO2krKyl7dGhp cy5tYXJrZXJzW2ldLnNldE9wYWNpdHkodGhpcy5vcGFjaXR5KTt9fX0sbW92ZVRv OmZ1bmN0aW9uKGJvdW5kcyx6b29tQ2hhbmdlZCxkcmFnZ2luZyl7T3BlbkxheWVy cy5MYXllci5wcm90b3R5cGUubW92ZVRvLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtp Zih6b29tQ2hhbmdlZHx8IXRoaXMuZHJhd24pe2Zvcih2YXIgaT0wLGxlbj10aGlz Lm1hcmtlcnMubGVuZ3RoO2k8bGVuO2krKyl7dGhpcy5kcmF3TWFya2VyKHRoaXMu bWFya2Vyc1tpXSk7fQp0aGlzLmRyYXduPXRydWU7fX0sYWRkTWFya2VyOmZ1bmN0 aW9uKG1hcmtlcil7dGhpcy5tYXJrZXJzLnB1c2gobWFya2VyKTtpZih0aGlzLm9w YWNpdHkhPW51bGwpe21hcmtlci5zZXRPcGFjaXR5KHRoaXMub3BhY2l0eSk7fQpp Zih0aGlzLm1hcCYmdGhpcy5tYXAuZ2V0RXh0ZW50KCkpe21hcmtlci5tYXA9dGhp cy5tYXA7dGhpcy5kcmF3TWFya2VyKG1hcmtlcik7fX0scmVtb3ZlTWFya2VyOmZ1 bmN0aW9uKG1hcmtlcil7aWYodGhpcy5tYXJrZXJzJiZ0aGlzLm1hcmtlcnMubGVu Z3RoKXtPcGVuTGF5ZXJzLlV0aWwucmVtb3ZlSXRlbSh0aGlzLm1hcmtlcnMsbWFy a2VyKTttYXJrZXIuZXJhc2UoKTt9fSxjbGVhck1hcmtlcnM6ZnVuY3Rpb24oKXtp Zih0aGlzLm1hcmtlcnMhPW51bGwpe3doaWxlKHRoaXMubWFya2Vycy5sZW5ndGg+ MCl7dGhpcy5yZW1vdmVNYXJrZXIodGhpcy5tYXJrZXJzWzBdKTt9fX0sZHJhd01h cmtlcjpmdW5jdGlvbihtYXJrZXIpe3ZhciBweD10aGlzLm1hcC5nZXRMYXllclB4 RnJvbUxvbkxhdChtYXJrZXIubG9ubGF0KTtpZihweD09bnVsbCl7bWFya2VyLmRp c3BsYXkoZmFsc2UpO31lbHNle2lmKCFtYXJrZXIuaXNEcmF3bigpKXt2YXIgbWFy a2VySW1nPW1hcmtlci5kcmF3KHB4KTt0aGlzLmRpdi5hcHBlbmRDaGlsZChtYXJr ZXJJbWcpO31lbHNlIGlmKG1hcmtlci5pY29uKXttYXJrZXIuaWNvbi5tb3ZlVG8o cHgpO319fSxnZXREYXRhRXh0ZW50OmZ1bmN0aW9uKCl7dmFyIG1heEV4dGVudD1u dWxsO2lmKHRoaXMubWFya2VycyYmKHRoaXMubWFya2Vycy5sZW5ndGg+MCkpe3Zh ciBtYXhFeHRlbnQ9bmV3IE9wZW5MYXllcnMuQm91bmRzKCk7Zm9yKHZhciBpPTAs bGVuPXRoaXMubWFya2Vycy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgbWFya2VyPXRo aXMubWFya2Vyc1tpXTttYXhFeHRlbnQuZXh0ZW5kKG1hcmtlci5sb25sYXQpO319 CnJldHVybiBtYXhFeHRlbnQ7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkxheWVy Lk1hcmtlcnMifSk7T3BlbkxheWVycy5Db250cm9sLlBhbj1PcGVuTGF5ZXJzLkNs YXNzKE9wZW5MYXllcnMuQ29udHJvbCx7c2xpZGVGYWN0b3I6NTAsc2xpZGVSYXRp bzpudWxsLGRpcmVjdGlvbjpudWxsLHR5cGU6T3BlbkxheWVycy5Db250cm9sLlRZ UEVfQlVUVE9OLGluaXRpYWxpemU6ZnVuY3Rpb24oZGlyZWN0aW9uLG9wdGlvbnMp e3RoaXMuZGlyZWN0aW9uPWRpcmVjdGlvbjt0aGlzLkNMQVNTX05BTUUrPXRoaXMu ZGlyZWN0aW9uO09wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUuaW5pdGlhbGl6 ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7fSx0cmlnZ2VyOmZ1bmN0aW9uKCl7dmFy IGdldFNsaWRlRmFjdG9yPU9wZW5MYXllcnMuRnVuY3Rpb24uYmluZChmdW5jdGlv bihkaW0pe3JldHVybiB0aGlzLnNsaWRlUmF0aW8/dGhpcy5tYXAuZ2V0U2l6ZSgp W2RpbV0qdGhpcy5zbGlkZVJhdGlvOnRoaXMuc2xpZGVGYWN0b3I7fSx0aGlzKTtz d2l0Y2godGhpcy5kaXJlY3Rpb24pe2Nhc2UgT3BlbkxheWVycy5Db250cm9sLlBh bi5OT1JUSDp0aGlzLm1hcC5wYW4oMCwtZ2V0U2xpZGVGYWN0b3IoImgiKSk7YnJl YWs7Y2FzZSBPcGVuTGF5ZXJzLkNvbnRyb2wuUGFuLlNPVVRIOnRoaXMubWFwLnBh bigwLGdldFNsaWRlRmFjdG9yKCJoIikpO2JyZWFrO2Nhc2UgT3BlbkxheWVycy5D b250cm9sLlBhbi5XRVNUOnRoaXMubWFwLnBhbigtZ2V0U2xpZGVGYWN0b3IoInci KSwwKTticmVhaztjYXNlIE9wZW5MYXllcnMuQ29udHJvbC5QYW4uRUFTVDp0aGlz Lm1hcC5wYW4oZ2V0U2xpZGVGYWN0b3IoInciKSwwKTticmVhazt9fSxDTEFTU19O QU1FOiJPcGVuTGF5ZXJzLkNvbnRyb2wuUGFuIn0pO09wZW5MYXllcnMuQ29udHJv bC5QYW4uTk9SVEg9Ik5vcnRoIjtPcGVuTGF5ZXJzLkNvbnRyb2wuUGFuLlNPVVRI PSJTb3V0aCI7T3BlbkxheWVycy5Db250cm9sLlBhbi5FQVNUPSJFYXN0IjtPcGVu TGF5ZXJzLkNvbnRyb2wuUGFuLldFU1Q9Ildlc3QiO09wZW5MYXllcnMuTGF5ZXIu V01TPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5MYXllci5HcmlkLHtERUZB VUxUX1BBUkFNUzp7c2VydmljZToiV01TIix2ZXJzaW9uOiIxLjEuMSIscmVxdWVz dDoiR2V0TWFwIixzdHlsZXM6IiIsZm9ybWF0OiJpbWFnZS9qcGVnIn0scmVwcm9q ZWN0OmZhbHNlLGlzQmFzZUxheWVyOnRydWUsZW5jb2RlQkJPWDpmYWxzZSxub01h Z2ljOmZhbHNlLHl4OnsnRVBTRzo0MzI2Jzp0cnVlfSxpbml0aWFsaXplOmZ1bmN0 aW9uKG5hbWUsdXJsLHBhcmFtcyxvcHRpb25zKXt2YXIgbmV3QXJndW1lbnRzPVtd O3BhcmFtcz1PcGVuTGF5ZXJzLlV0aWwudXBwZXJDYXNlT2JqZWN0KHBhcmFtcyk7 aWYocGFyc2VGbG9hdChwYXJhbXMuVkVSU0lPTik+PTEuMyYmIXBhcmFtcy5FWENF UFRJT05TKXtwYXJhbXMuRVhDRVBUSU9OUz0iSU5JTUFHRSI7fQpuZXdBcmd1bWVu dHMucHVzaChuYW1lLHVybCxwYXJhbXMsb3B0aW9ucyk7T3BlbkxheWVycy5MYXll ci5HcmlkLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsbmV3QXJndW1l bnRzKTtPcGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyh0aGlzLnBhcmFtcyxP cGVuTGF5ZXJzLlV0aWwudXBwZXJDYXNlT2JqZWN0KHRoaXMuREVGQVVMVF9QQVJB TVMpKTtpZighdGhpcy5ub01hZ2ljJiZ0aGlzLnBhcmFtcy5UUkFOU1BBUkVOVCYm dGhpcy5wYXJhbXMuVFJBTlNQQVJFTlQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgp PT0idHJ1ZSIpe2lmKChvcHRpb25zPT1udWxsKXx8KCFvcHRpb25zLmlzQmFzZUxh eWVyKSl7dGhpcy5pc0Jhc2VMYXllcj1mYWxzZTt9CmlmKHRoaXMucGFyYW1zLkZP Uk1BVD09ImltYWdlL2pwZWciKXt0aGlzLnBhcmFtcy5GT1JNQVQ9T3BlbkxheWVy cy5VdGlsLmFscGhhSGFjaygpPyJpbWFnZS9naWYiOiJpbWFnZS9wbmciO319fSxk ZXN0cm95OmZ1bmN0aW9uKCl7T3BlbkxheWVycy5MYXllci5HcmlkLnByb3RvdHlw ZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LGNsb25lOmZ1bmN0aW9u KG9iail7aWYob2JqPT1udWxsKXtvYmo9bmV3IE9wZW5MYXllcnMuTGF5ZXIuV01T KHRoaXMubmFtZSx0aGlzLnVybCx0aGlzLnBhcmFtcyx0aGlzLmdldE9wdGlvbnMo KSk7fQpvYmo9T3BlbkxheWVycy5MYXllci5HcmlkLnByb3RvdHlwZS5jbG9uZS5h cHBseSh0aGlzLFtvYmpdKTtyZXR1cm4gb2JqO30scmV2ZXJzZUF4aXNPcmRlcjpm dW5jdGlvbigpe3JldHVybihwYXJzZUZsb2F0KHRoaXMucGFyYW1zLlZFUlNJT04p Pj0xLjMmJiEhdGhpcy55eFt0aGlzLm1hcC5nZXRQcm9qZWN0aW9uT2JqZWN0KCku Z2V0Q29kZSgpXSk7fSxnZXRVUkw6ZnVuY3Rpb24oYm91bmRzKXtib3VuZHM9dGhp cy5hZGp1c3RCb3VuZHMoYm91bmRzKTt2YXIgaW1hZ2VTaXplPXRoaXMuZ2V0SW1h Z2VTaXplKCk7dmFyIG5ld1BhcmFtcz17fTt2YXIgcmV2ZXJzZUF4aXNPcmRlcj10 aGlzLnJldmVyc2VBeGlzT3JkZXIoKTtuZXdQYXJhbXMuQkJPWD10aGlzLmVuY29k ZUJCT1g/Ym91bmRzLnRvQkJPWChudWxsLHJldmVyc2VBeGlzT3JkZXIpOmJvdW5k cy50b0FycmF5KHJldmVyc2VBeGlzT3JkZXIpO25ld1BhcmFtcy5XSURUSD1pbWFn ZVNpemUudztuZXdQYXJhbXMuSEVJR0hUPWltYWdlU2l6ZS5oO3ZhciByZXF1ZXN0 U3RyaW5nPXRoaXMuZ2V0RnVsbFJlcXVlc3RTdHJpbmcobmV3UGFyYW1zKTtyZXR1 cm4gcmVxdWVzdFN0cmluZzt9LG1lcmdlTmV3UGFyYW1zOmZ1bmN0aW9uKG5ld1Bh cmFtcyl7dmFyIHVwcGVyUGFyYW1zPU9wZW5MYXllcnMuVXRpbC51cHBlckNhc2VP YmplY3QobmV3UGFyYW1zKTt2YXIgbmV3QXJndW1lbnRzPVt1cHBlclBhcmFtc107 cmV0dXJuIE9wZW5MYXllcnMuTGF5ZXIuR3JpZC5wcm90b3R5cGUubWVyZ2VOZXdQ YXJhbXMuYXBwbHkodGhpcyxuZXdBcmd1bWVudHMpO30sZ2V0RnVsbFJlcXVlc3RT dHJpbmc6ZnVuY3Rpb24obmV3UGFyYW1zLGFsdFVybCl7dmFyIG1hcFByb2plY3Rp b249dGhpcy5tYXAuZ2V0UHJvamVjdGlvbk9iamVjdCgpO3ZhciBwcm9qZWN0aW9u Q29kZT10aGlzLnByb2plY3Rpb24mJnRoaXMucHJvamVjdGlvbi5lcXVhbHMobWFw UHJvamVjdGlvbik/dGhpcy5wcm9qZWN0aW9uLmdldENvZGUoKTptYXBQcm9qZWN0 aW9uLmdldENvZGUoKTt2YXIgdmFsdWU9KHByb2plY3Rpb25Db2RlPT0ibm9uZSIp P251bGw6cHJvamVjdGlvbkNvZGU7aWYocGFyc2VGbG9hdCh0aGlzLnBhcmFtcy5W RVJTSU9OKT49MS4zKXt0aGlzLnBhcmFtcy5DUlM9dmFsdWU7fWVsc2V7dGhpcy5w YXJhbXMuU1JTPXZhbHVlO30KaWYodHlwZW9mIHRoaXMucGFyYW1zLlRSQU5TUEFS RU5UPT0iYm9vbGVhbiIpe25ld1BhcmFtcy5UUkFOU1BBUkVOVD10aGlzLnBhcmFt cy5UUkFOU1BBUkVOVD8iVFJVRSI6IkZBTFNFIjt9CnJldHVybiBPcGVuTGF5ZXJz LkxheWVyLkdyaWQucHJvdG90eXBlLmdldEZ1bGxSZXF1ZXN0U3RyaW5nLmFwcGx5 KHRoaXMsYXJndW1lbnRzKTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuTGF5ZXIu V01TIn0pO09wZW5MYXllcnMuTGF5ZXIuV01TLlVudGlsZWQ9T3BlbkxheWVycy5D bGFzcyhPcGVuTGF5ZXJzLkxheWVyLldNUyx7c2luZ2xlVGlsZTp0cnVlLGluaXRp YWxpemU6ZnVuY3Rpb24obmFtZSx1cmwscGFyYW1zLG9wdGlvbnMpe09wZW5MYXll cnMuTGF5ZXIuV01TLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJn dW1lbnRzKTt2YXIgbXNnPSJUaGUgT3BlbkxheWVycy5MYXllci5XTVMuVW50aWxl ZCBjbGFzcyBpcyBkZXByZWNhdGVkIGFuZCAiKyJ3aWxsIGJlIHJlbW92ZWQgaW4g My4wLiBJbnN0ZWFkLCB5b3Ugc2hvdWxkIHVzZSB0aGUgIisibm9ybWFsIE9wZW5M YXllcnMuTGF5ZXIuV01TIGNsYXNzLCBwYXNzaW5nIGl0IHRoZSBvcHRpb24gIisi J3NpbmdsZVRpbGUnIGFzIHRydWUuIjtPcGVuTGF5ZXJzLkNvbnNvbGUud2Fybiht c2cpO30sY2xvbmU6ZnVuY3Rpb24ob2JqKXtpZihvYmo9PW51bGwpe29iaj1uZXcg T3BlbkxheWVycy5MYXllci5XTVMuVW50aWxlZCh0aGlzLm5hbWUsdGhpcy51cmws dGhpcy5wYXJhbXMsdGhpcy5nZXRPcHRpb25zKCkpO30Kb2JqPU9wZW5MYXllcnMu TGF5ZXIuV01TLnByb3RvdHlwZS5jbG9uZS5hcHBseSh0aGlzLFtvYmpdKTtyZXR1 cm4gb2JqO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5MYXllci5XTVMuVW50aWxl ZCJ9KTtPcGVuTGF5ZXJzLkdlb21ldHJ5LlN1cmZhY2U9T3BlbkxheWVycy5DbGFz cyhPcGVuTGF5ZXJzLkdlb21ldHJ5LHtpbml0aWFsaXplOmZ1bmN0aW9uKCl7T3Bl bkxheWVycy5HZW9tZXRyeS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlz LGFyZ3VtZW50cyk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkdlb21ldHJ5LlN1 cmZhY2UifSk7T3BlbkxheWVycy5Gb3JtYXQuQXJjWE1MLkZlYXR1cmVzPU9wZW5M YXllcnMuQ2xhc3MoT3BlbkxheWVycy5Gb3JtYXQuWE1MLHtpbml0aWFsaXplOmZ1 bmN0aW9uKG9wdGlvbnMpe09wZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5cGUu aW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7fSxyZWFkOmZ1bmN0aW9u KGRhdGEpe3ZhciBheGw9bmV3IE9wZW5MYXllcnMuRm9ybWF0LkFyY1hNTCgpO3Zh ciBwYXJzZWQ9YXhsLnJlYWQoZGF0YSk7cmV0dXJuIHBhcnNlZC5mZWF0dXJlcy5m ZWF0dXJlO319KTtPcGVuTGF5ZXJzLkNvbnRyb2wuU25hcHBpbmc9T3BlbkxheWVy cy5DbGFzcyhPcGVuTGF5ZXJzLkNvbnRyb2wse0VWRU5UX1RZUEVTOlsiYmVmb3Jl c25hcCIsInNuYXAiLCJ1bnNuYXAiXSxERUZBVUxUUzp7dG9sZXJhbmNlOjEwLG5v ZGU6dHJ1ZSxlZGdlOnRydWUsdmVydGV4OnRydWV9LGdyZWVkeTp0cnVlLHByZWNl ZGVuY2U6WyJub2RlIiwidmVydGV4IiwiZWRnZSJdLHJlc29sdXRpb246bnVsbCxn ZW9Ub2xlcmFuY2VDYWNoZTpudWxsLGxheWVyOm51bGwsZmVhdHVyZTpudWxsLHBv aW50Om51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXtBcnJheS5wcm90 b3R5cGUucHVzaC5hcHBseSh0aGlzLkVWRU5UX1RZUEVTLE9wZW5MYXllcnMuQ29u dHJvbC5wcm90b3R5cGUuRVZFTlRfVFlQRVMpO09wZW5MYXllcnMuQ29udHJvbC5w cm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7dGhpcy5v cHRpb25zPW9wdGlvbnN8fHt9O2lmKHRoaXMub3B0aW9ucy5sYXllcil7dGhpcy5z ZXRMYXllcih0aGlzLm9wdGlvbnMubGF5ZXIpO30KdmFyIGRlZmF1bHRzPU9wZW5M YXllcnMuVXRpbC5leHRlbmQoe30sdGhpcy5vcHRpb25zLmRlZmF1bHRzKTt0aGlz LmRlZmF1bHRzPU9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKGRlZmF1bHRz LHRoaXMuREVGQVVMVFMpO3RoaXMuc2V0VGFyZ2V0cyh0aGlzLm9wdGlvbnMudGFy Z2V0cyk7aWYodGhpcy50YXJnZXRzLmxlbmd0aD09PTAmJnRoaXMubGF5ZXIpe3Ro aXMuYWRkVGFyZ2V0TGF5ZXIodGhpcy5sYXllcik7fQp0aGlzLmdlb1RvbGVyYW5j ZUNhY2hlPXt9O30sc2V0TGF5ZXI6ZnVuY3Rpb24obGF5ZXIpe2lmKHRoaXMuYWN0 aXZlKXt0aGlzLmRlYWN0aXZhdGUoKTt0aGlzLmxheWVyPWxheWVyO3RoaXMuYWN0 aXZhdGUoKTt9ZWxzZXt0aGlzLmxheWVyPWxheWVyO319LHNldFRhcmdldHM6ZnVu Y3Rpb24odGFyZ2V0cyl7dGhpcy50YXJnZXRzPVtdO2lmKHRhcmdldHMmJnRhcmdl dHMubGVuZ3RoKXt2YXIgdGFyZ2V0O2Zvcih2YXIgaT0wLGxlbj10YXJnZXRzLmxl bmd0aDtpPGxlbjsrK2kpe3RhcmdldD10YXJnZXRzW2ldO2lmKHRhcmdldCBpbnN0 YW5jZW9mIE9wZW5MYXllcnMuTGF5ZXIuVmVjdG9yKXt0aGlzLmFkZFRhcmdldExh eWVyKHRhcmdldCk7fWVsc2V7dGhpcy5hZGRUYXJnZXQodGFyZ2V0KTt9fX19LGFk ZFRhcmdldExheWVyOmZ1bmN0aW9uKGxheWVyKXt0aGlzLmFkZFRhcmdldCh7bGF5 ZXI6bGF5ZXJ9KTt9LGFkZFRhcmdldDpmdW5jdGlvbih0YXJnZXQpe3RhcmdldD1P cGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyh0YXJnZXQsdGhpcy5kZWZhdWx0 cyk7dGFyZ2V0Lm5vZGVUb2xlcmFuY2U9dGFyZ2V0Lm5vZGVUb2xlcmFuY2V8fHRh cmdldC50b2xlcmFuY2U7dGFyZ2V0LnZlcnRleFRvbGVyYW5jZT10YXJnZXQudmVy dGV4VG9sZXJhbmNlfHx0YXJnZXQudG9sZXJhbmNlO3RhcmdldC5lZGdlVG9sZXJh bmNlPXRhcmdldC5lZGdlVG9sZXJhbmNlfHx0YXJnZXQudG9sZXJhbmNlO3RoaXMu dGFyZ2V0cy5wdXNoKHRhcmdldCk7fSxyZW1vdmVUYXJnZXRMYXllcjpmdW5jdGlv bihsYXllcil7dmFyIHRhcmdldDtmb3IodmFyIGk9dGhpcy50YXJnZXRzLmxlbmd0 aC0xO2k+PTA7LS1pKXt0YXJnZXQ9dGhpcy50YXJnZXRzW2ldO2lmKHRhcmdldC5s YXllcj09PWxheWVyKXt0aGlzLnJlbW92ZVRhcmdldCh0YXJnZXQpO319fSxyZW1v dmVUYXJnZXQ6ZnVuY3Rpb24odGFyZ2V0KXtyZXR1cm4gT3BlbkxheWVycy5VdGls LnJlbW92ZUl0ZW0odGhpcy50YXJnZXRzLHRhcmdldCk7fSxhY3RpdmF0ZTpmdW5j dGlvbigpe3ZhciBhY3RpdmF0ZWQ9T3BlbkxheWVycy5Db250cm9sLnByb3RvdHlw ZS5hY3RpdmF0ZS5jYWxsKHRoaXMpO2lmKGFjdGl2YXRlZCl7aWYodGhpcy5sYXll ciYmdGhpcy5sYXllci5ldmVudHMpe3RoaXMubGF5ZXIuZXZlbnRzLm9uKHtza2V0 Y2hzdGFydGVkOnRoaXMub25Ta2V0Y2hNb2RpZmllZCxza2V0Y2htb2RpZmllZDp0 aGlzLm9uU2tldGNoTW9kaWZpZWQsdmVydGV4bW9kaWZpZWQ6dGhpcy5vblZlcnRl eE1vZGlmaWVkLHNjb3BlOnRoaXN9KTt9fQpyZXR1cm4gYWN0aXZhdGVkO30sZGVh Y3RpdmF0ZTpmdW5jdGlvbigpe3ZhciBkZWFjdGl2YXRlZD1PcGVuTGF5ZXJzLkNv bnRyb2wucHJvdG90eXBlLmRlYWN0aXZhdGUuY2FsbCh0aGlzKTtpZihkZWFjdGl2 YXRlZCl7aWYodGhpcy5sYXllciYmdGhpcy5sYXllci5ldmVudHMpe3RoaXMubGF5 ZXIuZXZlbnRzLnVuKHtza2V0Y2hzdGFydGVkOnRoaXMub25Ta2V0Y2hNb2RpZmll ZCxza2V0Y2htb2RpZmllZDp0aGlzLm9uU2tldGNoTW9kaWZpZWQsdmVydGV4bW9k aWZpZWQ6dGhpcy5vblZlcnRleE1vZGlmaWVkLHNjb3BlOnRoaXN9KTt9fQp0aGlz LmZlYXR1cmU9bnVsbDt0aGlzLnBvaW50PW51bGw7cmV0dXJuIGRlYWN0aXZhdGVk O30sb25Ta2V0Y2hNb2RpZmllZDpmdW5jdGlvbihldmVudCl7dGhpcy5mZWF0dXJl PWV2ZW50LmZlYXR1cmU7dGhpcy5jb25zaWRlclNuYXBwaW5nKGV2ZW50LnZlcnRl eCxldmVudC52ZXJ0ZXgpO30sb25WZXJ0ZXhNb2RpZmllZDpmdW5jdGlvbihldmVu dCl7dGhpcy5mZWF0dXJlPWV2ZW50LmZlYXR1cmU7dmFyIGxvYz10aGlzLmxheWVy Lm1hcC5nZXRMb25MYXRGcm9tVmlld1BvcnRQeChldmVudC5waXhlbCk7dGhpcy5j b25zaWRlclNuYXBwaW5nKGV2ZW50LnZlcnRleCxuZXcgT3BlbkxheWVycy5HZW9t ZXRyeS5Qb2ludChsb2MubG9uLGxvYy5sYXQpKTt9LGNvbnNpZGVyU25hcHBpbmc6 ZnVuY3Rpb24ocG9pbnQsbG9jKXt2YXIgYmVzdD17cmFuazpOdW1iZXIuUE9TSVRJ VkVfSU5GSU5JVFksZGlzdDpOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkseDpudWxs LHk6bnVsbH07dmFyIHNuYXBwZWQ9ZmFsc2U7dmFyIHJlc3VsdCx0YXJnZXQ7Zm9y KHZhciBpPTAsbGVuPXRoaXMudGFyZ2V0cy5sZW5ndGg7aTxsZW47KytpKXt0YXJn ZXQ9dGhpcy50YXJnZXRzW2ldO3Jlc3VsdD10aGlzLnRlc3RUYXJnZXQodGFyZ2V0 LGxvYyk7aWYocmVzdWx0KXtpZih0aGlzLmdyZWVkeSl7YmVzdD1yZXN1bHQ7YmVz dC50YXJnZXQ9dGFyZ2V0O3NuYXBwZWQ9dHJ1ZTticmVhazt9ZWxzZXtpZigocmVz dWx0LnJhbms8YmVzdC5yYW5rKXx8KHJlc3VsdC5yYW5rPT09YmVzdC5yYW5rJiZy ZXN1bHQuZGlzdDxiZXN0LmRpc3QpKXtiZXN0PXJlc3VsdDtiZXN0LnRhcmdldD10 YXJnZXQ7c25hcHBlZD10cnVlO319fX0KaWYoc25hcHBlZCl7dmFyIHByb2NlZWQ9 dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJiZWZvcmVzbmFwIix7cG9pbnQ6cG9p bnQseDpiZXN0LngseTpiZXN0LnksZGlzdGFuY2U6YmVzdC5kaXN0LGxheWVyOmJl c3QudGFyZ2V0LmxheWVyLHNuYXBUeXBlOnRoaXMucHJlY2VkZW5jZVtiZXN0LnJh bmtdfSk7aWYocHJvY2VlZCE9PWZhbHNlKXtwb2ludC54PWJlc3QueDtwb2ludC55 PWJlc3QueTt0aGlzLnBvaW50PXBvaW50O3RoaXMuZXZlbnRzLnRyaWdnZXJFdmVu dCgic25hcCIse3BvaW50OnBvaW50LHNuYXBUeXBlOnRoaXMucHJlY2VkZW5jZVti ZXN0LnJhbmtdLGxheWVyOmJlc3QudGFyZ2V0LmxheWVyLGRpc3RhbmNlOmJlc3Qu ZGlzdH0pO31lbHNle3NuYXBwZWQ9ZmFsc2U7fX0KaWYodGhpcy5wb2ludCYmIXNu YXBwZWQpe3BvaW50Lng9bG9jLng7cG9pbnQueT1sb2MueTt0aGlzLnBvaW50PW51 bGw7dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJ1bnNuYXAiLHtwb2ludDpwb2lu dH0pO319LHRlc3RUYXJnZXQ6ZnVuY3Rpb24odGFyZ2V0LGxvYyl7dmFyIHJlc29s dXRpb249dGhpcy5sYXllci5tYXAuZ2V0UmVzb2x1dGlvbigpO2lmKCJtaW5SZXNv bHV0aW9uImluIHRhcmdldCl7aWYocmVzb2x1dGlvbjx0YXJnZXQubWluUmVzb2x1 dGlvbil7cmV0dXJuIG51bGw7fX0KaWYoIm1heFJlc29sdXRpb24iaW4gdGFyZ2V0 KXtpZihyZXNvbHV0aW9uPj10YXJnZXQubWF4UmVzb2x1dGlvbil7cmV0dXJuIG51 bGw7fX0KdmFyIHRvbGVyYW5jZT17bm9kZTp0aGlzLmdldEdlb1RvbGVyYW5jZSh0 YXJnZXQubm9kZVRvbGVyYW5jZSxyZXNvbHV0aW9uKSx2ZXJ0ZXg6dGhpcy5nZXRH ZW9Ub2xlcmFuY2UodGFyZ2V0LnZlcnRleFRvbGVyYW5jZSxyZXNvbHV0aW9uKSxl ZGdlOnRoaXMuZ2V0R2VvVG9sZXJhbmNlKHRhcmdldC5lZGdlVG9sZXJhbmNlLHJl c29sdXRpb24pfTt2YXIgbWF4VG9sZXJhbmNlPU1hdGgubWF4KHRvbGVyYW5jZS5u b2RlLHRvbGVyYW5jZS52ZXJ0ZXgsdG9sZXJhbmNlLmVkZ2UpO3ZhciByZXN1bHQ9 e3Jhbms6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGRpc3Q6TnVtYmVyLlBPU0lU SVZFX0lORklOSVRZfTt2YXIgZWxpZ2libGU9ZmFsc2U7dmFyIGZlYXR1cmVzPXRh cmdldC5sYXllci5mZWF0dXJlczt2YXIgZmVhdHVyZSx0eXBlLHZlcnRpY2VzLHZl cnRleCxjbG9zZXN0LGRpc3QsZm91bmQ7dmFyIG51bVR5cGVzPXRoaXMucHJlY2Vk ZW5jZS5sZW5ndGg7dmFyIGxsPW5ldyBPcGVuTGF5ZXJzLkxvbkxhdChsb2MueCxs b2MueSk7Zm9yKHZhciBpPTAsbGVuPWZlYXR1cmVzLmxlbmd0aDtpPGxlbjsrK2kp e2ZlYXR1cmU9ZmVhdHVyZXNbaV07aWYoZmVhdHVyZSE9PXRoaXMuZmVhdHVyZSYm IWZlYXR1cmUuX3NrZXRjaCYmZmVhdHVyZS5zdGF0ZSE9PU9wZW5MYXllcnMuU3Rh dGUuREVMRVRFJiYoIXRhcmdldC5maWx0ZXJ8fHRhcmdldC5maWx0ZXIuZXZhbHVh dGUoZmVhdHVyZS5hdHRyaWJ1dGVzKSkpe2lmKGZlYXR1cmUuYXRQb2ludChsbCxt YXhUb2xlcmFuY2UsbWF4VG9sZXJhbmNlKSl7Zm9yKHZhciBqPTAsc3RvcD1NYXRo Lm1pbihyZXN1bHQucmFuaysxLG51bVR5cGVzKTtqPHN0b3A7KytqKXt0eXBlPXRo aXMucHJlY2VkZW5jZVtqXTtpZih0YXJnZXRbdHlwZV0pe2lmKHR5cGU9PT0iZWRn ZSIpe2Nsb3Nlc3Q9ZmVhdHVyZS5nZW9tZXRyeS5kaXN0YW5jZVRvKGxvYyx7ZGV0 YWlsczp0cnVlfSk7ZGlzdD1jbG9zZXN0LmRpc3RhbmNlO2lmKGRpc3Q8PXRvbGVy YW5jZVt0eXBlXSYmZGlzdDxyZXN1bHQuZGlzdCl7cmVzdWx0PXtyYW5rOmosZGlz dDpkaXN0LHg6Y2xvc2VzdC54MCx5OmNsb3Nlc3QueTB9O2VsaWdpYmxlPXRydWU7 YnJlYWs7fX1lbHNle3ZlcnRpY2VzPWZlYXR1cmUuZ2VvbWV0cnkuZ2V0VmVydGlj ZXModHlwZT09PSJub2RlIik7Zm91bmQ9ZmFsc2U7Zm9yKHZhciBrPTAsa2xlbj12 ZXJ0aWNlcy5sZW5ndGg7azxrbGVuOysrayl7dmVydGV4PXZlcnRpY2VzW2tdO2Rp c3Q9dmVydGV4LmRpc3RhbmNlVG8obG9jKTtpZihkaXN0PD10b2xlcmFuY2VbdHlw ZV0mJihqPHJlc3VsdC5yYW5rfHwoaj09PXJlc3VsdC5yYW5rJiZkaXN0PHJlc3Vs dC5kaXN0KSkpe3Jlc3VsdD17cmFuazpqLGRpc3Q6ZGlzdCx4OnZlcnRleC54LHk6 dmVydGV4Lnl9O2VsaWdpYmxlPXRydWU7Zm91bmQ9dHJ1ZTt9fQppZihmb3VuZCl7 YnJlYWs7fX19fX19fQpyZXR1cm4gZWxpZ2libGU/cmVzdWx0Om51bGw7fSxnZXRH ZW9Ub2xlcmFuY2U6ZnVuY3Rpb24odG9sZXJhbmNlLHJlc29sdXRpb24pe2lmKHJl c29sdXRpb24hPT10aGlzLnJlc29sdXRpb24pe3RoaXMucmVzb2x1dGlvbj1yZXNv bHV0aW9uO3RoaXMuZ2VvVG9sZXJhbmNlQ2FjaGU9e307fQp2YXIgZ2VvVG9sZXJh bmNlPXRoaXMuZ2VvVG9sZXJhbmNlQ2FjaGVbdG9sZXJhbmNlXTtpZihnZW9Ub2xl cmFuY2U9PT11bmRlZmluZWQpe2dlb1RvbGVyYW5jZT10b2xlcmFuY2UqcmVzb2x1 dGlvbjt0aGlzLmdlb1RvbGVyYW5jZUNhY2hlW3RvbGVyYW5jZV09Z2VvVG9sZXJh bmNlO30KcmV0dXJuIGdlb1RvbGVyYW5jZTt9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtp Zih0aGlzLmFjdGl2ZSl7dGhpcy5kZWFjdGl2YXRlKCk7fQpkZWxldGUgdGhpcy5s YXllcjtkZWxldGUgdGhpcy50YXJnZXRzO09wZW5MYXllcnMuQ29udHJvbC5wcm90 b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO30sQ0xBU1NfTkFNRToiT3BlbkxheWVy cy5Db250cm9sLlNuYXBwaW5nIn0pO09wZW5MYXllcnMuRGF0ZT17dG9JU09TdHJp bmc6KGZ1bmN0aW9uKCl7aWYoInRvSVNPU3RyaW5nImluIERhdGUucHJvdG90eXBl KXtyZXR1cm4gZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGRhdGUudG9JU09TdHJpbmco KTt9O31lbHNle2Z1bmN0aW9uIHBhZChudW0sbGVuKXt2YXIgc3RyPW51bSsiIjt3 aGlsZShzdHIubGVuZ3RoPGxlbil7c3RyPSIwIitzdHI7fQpyZXR1cm4gc3RyO30K cmV0dXJuIGZ1bmN0aW9uKGRhdGUpe3ZhciBzdHI7aWYoaXNOYU4oZGF0ZS5nZXRU aW1lKCkpKXtzdHI9IkludmFsaWQgRGF0ZSI7fWVsc2V7c3RyPWRhdGUuZ2V0VVRD RnVsbFllYXIoKSsiLSIrCnBhZChkYXRlLmdldFVUQ01vbnRoKCkrMSwyKSsiLSIr CnBhZChkYXRlLmdldFVUQ0RhdGUoKSwyKSsiVCIrCnBhZChkYXRlLmdldFVUQ0hv dXJzKCksMikrIjoiKwpwYWQoZGF0ZS5nZXRVVENNaW51dGVzKCksMikrIjoiKwpw YWQoZGF0ZS5nZXRVVENTZWNvbmRzKCksMikrIi4iKwpwYWQoZGF0ZS5nZXRVVENN aWxsaXNlY29uZHMoKSwzKSsiWiI7fQpyZXR1cm4gc3RyO307fX0pKCkscGFyc2U6 ZnVuY3Rpb24oc3RyKXt2YXIgZGF0ZTt2YXIgbWF0Y2g9c3RyLm1hdGNoKC9eKD86 KFxkezR9KSg/Oi0oXGR7Mn0pKD86LShcZHsyfSkpPyk/KT8oPzpUKFxkezEsMn0p OihcZHsyfSk6KFxkezJ9KD86XC5cZCspPykoWnwoPzpbKy1dXGR7MSwyfSg/Ojoo XGR7Mn0pKT8pKSk/JC8pO2lmKG1hdGNoJiYobWF0Y2hbMV18fG1hdGNoWzddKSl7 dmFyIHllYXI9cGFyc2VJbnQobWF0Y2hbMV0sMTApfHwwO3ZhciBtb250aD0ocGFy c2VJbnQobWF0Y2hbMl0sMTApLTEpfHwwO3ZhciBkYXk9cGFyc2VJbnQobWF0Y2hb M10sMTApfHwxO2RhdGU9bmV3IERhdGUoRGF0ZS5VVEMoeWVhcixtb250aCxkYXkp KTt2YXIgdHlwZT1tYXRjaFs3XTtpZih0eXBlKXt2YXIgaG91cnM9cGFyc2VJbnQo bWF0Y2hbNF0sMTApO3ZhciBtaW51dGVzPXBhcnNlSW50KG1hdGNoWzVdLDEwKTt2 YXIgc2VjRnJhYz1wYXJzZUZsb2F0KG1hdGNoWzZdKTt2YXIgc2Vjb25kcz1zZWNG cmFjfDA7dmFyIG1pbGxpc2Vjb25kcz1NYXRoLnJvdW5kKDEwMDAqKHNlY0ZyYWMt c2Vjb25kcykpO2RhdGUuc2V0VVRDSG91cnMoaG91cnMsbWludXRlcyxzZWNvbmRz LG1pbGxpc2Vjb25kcyk7aWYodHlwZSE9PSJaIil7dmFyIGhvdXJzT2Zmc2V0PXBh cnNlSW50KHR5cGUsMTApO3ZhciBtaW51dGVzT2Zmc2V0PXBhcnNlSW50KG1hdGNo WzhdLDEwKXx8MDt2YXIgb2Zmc2V0PS0xMDAwKig2MCooaG91cnNPZmZzZXQqNjAp K21pbnV0ZXNPZmZzZXQqNjApO2RhdGU9bmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkr b2Zmc2V0KTt9fX1lbHNle2RhdGU9bmV3IERhdGUoImludmFsaWQiKTt9CnJldHVy biBkYXRlO319OyhmdW5jdGlvbigpe3ZhciBvWE1MSHR0cFJlcXVlc3Q9d2luZG93 LlhNTEh0dHBSZXF1ZXN0O3ZhciBiR2Vja289ISF3aW5kb3cuY29udHJvbGxlcnMs YklFPXdpbmRvdy5kb2N1bWVudC5hbGwmJiF3aW5kb3cub3BlcmEsYklFNz1iSUUm JndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9NU0lFIDcuMC8pO2Z1 bmN0aW9uIGZYTUxIdHRwUmVxdWVzdCgpe3RoaXMuX29iamVjdD1vWE1MSHR0cFJl cXVlc3QmJiFiSUU3P25ldyBvWE1MSHR0cFJlcXVlc3Q6bmV3IHdpbmRvdy5BY3Rp dmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpO3RoaXMuX2xpc3RlbmVycz1b XTt9O2Z1bmN0aW9uIGNYTUxIdHRwUmVxdWVzdCgpe3JldHVybiBuZXcgZlhNTEh0 dHBSZXF1ZXN0O307Y1hNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZT1mWE1MSHR0cFJl cXVlc3QucHJvdG90eXBlO2lmKGJHZWNrbyYmb1hNTEh0dHBSZXF1ZXN0LndyYXBw ZWQpCmNYTUxIdHRwUmVxdWVzdC53cmFwcGVkPW9YTUxIdHRwUmVxdWVzdC53cmFw cGVkO2NYTUxIdHRwUmVxdWVzdC5VTlNFTlQ9MDtjWE1MSHR0cFJlcXVlc3QuT1BF TkVEPTE7Y1hNTEh0dHBSZXF1ZXN0LkhFQURFUlNfUkVDRUlWRUQ9MjtjWE1MSHR0 cFJlcXVlc3QuTE9BRElORz0zO2NYTUxIdHRwUmVxdWVzdC5ET05FPTQ7Y1hNTEh0 dHBSZXF1ZXN0LnByb3RvdHlwZS5yZWFkeVN0YXRlPWNYTUxIdHRwUmVxdWVzdC5V TlNFTlQ7Y1hNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5yZXNwb25zZVRleHQ9Jyc7 Y1hNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5yZXNwb25zZVhNTD1udWxsO2NYTUxI dHRwUmVxdWVzdC5wcm90b3R5cGUuc3RhdHVzPTA7Y1hNTEh0dHBSZXF1ZXN0LnBy b3RvdHlwZS5zdGF0dXNUZXh0PScnO2NYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUu cHJpb3JpdHk9Ik5PUk1BTCI7Y1hNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vbnJl YWR5c3RhdGVjaGFuZ2U9bnVsbDtjWE1MSHR0cFJlcXVlc3Qub25yZWFkeXN0YXRl Y2hhbmdlPW51bGw7Y1hNTEh0dHBSZXF1ZXN0Lm9ub3Blbj1udWxsO2NYTUxIdHRw UmVxdWVzdC5vbnNlbmQ9bnVsbDtjWE1MSHR0cFJlcXVlc3Qub25hYm9ydD1udWxs O2NYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3Blbj1mdW5jdGlvbihzTWV0aG9k LHNVcmwsYkFzeW5jLHNVc2VyLHNQYXNzd29yZCl7ZGVsZXRlIHRoaXMuX2hlYWRl cnM7aWYoYXJndW1lbnRzLmxlbmd0aDwzKQpiQXN5bmM9dHJ1ZTt0aGlzLl9hc3lu Yz1iQXN5bmM7dmFyIG9SZXF1ZXN0PXRoaXMsblN0YXRlPXRoaXMucmVhZHlTdGF0 ZSxmT25VbmxvYWQ7aWYoYklFJiZiQXN5bmMpe2ZPblVubG9hZD1mdW5jdGlvbigp e2lmKG5TdGF0ZSE9Y1hNTEh0dHBSZXF1ZXN0LkRPTkUpe2ZDbGVhblRyYW5zcG9y dChvUmVxdWVzdCk7b1JlcXVlc3QuYWJvcnQoKTt9fTt3aW5kb3cuYXR0YWNoRXZl bnQoIm9udW5sb2FkIixmT25VbmxvYWQpO30KaWYoY1hNTEh0dHBSZXF1ZXN0Lm9u b3BlbikKY1hNTEh0dHBSZXF1ZXN0Lm9ub3Blbi5hcHBseSh0aGlzLGFyZ3VtZW50 cyk7aWYoYXJndW1lbnRzLmxlbmd0aD40KQp0aGlzLl9vYmplY3Qub3BlbihzTWV0 aG9kLHNVcmwsYkFzeW5jLHNVc2VyLHNQYXNzd29yZCk7ZWxzZQppZihhcmd1bWVu dHMubGVuZ3RoPjMpCnRoaXMuX29iamVjdC5vcGVuKHNNZXRob2Qsc1VybCxiQXN5 bmMsc1VzZXIpO2Vsc2UKdGhpcy5fb2JqZWN0Lm9wZW4oc01ldGhvZCxzVXJsLGJB c3luYyk7dGhpcy5yZWFkeVN0YXRlPWNYTUxIdHRwUmVxdWVzdC5PUEVORUQ7ZlJl YWR5U3RhdGVDaGFuZ2UodGhpcyk7dGhpcy5fb2JqZWN0Lm9ucmVhZHlzdGF0ZWNo YW5nZT1mdW5jdGlvbigpe2lmKGJHZWNrbyYmIWJBc3luYykKcmV0dXJuO29SZXF1 ZXN0LnJlYWR5U3RhdGU9b1JlcXVlc3QuX29iamVjdC5yZWFkeVN0YXRlO2ZTeW5j aHJvbml6ZVZhbHVlcyhvUmVxdWVzdCk7aWYob1JlcXVlc3QuX2Fib3J0ZWQpe29S ZXF1ZXN0LnJlYWR5U3RhdGU9Y1hNTEh0dHBSZXF1ZXN0LlVOU0VOVDtyZXR1cm47 fQppZihvUmVxdWVzdC5yZWFkeVN0YXRlPT1jWE1MSHR0cFJlcXVlc3QuRE9ORSl7 ZGVsZXRlIG9SZXF1ZXN0Ll9kYXRhO2ZDbGVhblRyYW5zcG9ydChvUmVxdWVzdCk7 aWYoYklFJiZiQXN5bmMpCndpbmRvdy5kZXRhY2hFdmVudCgib251bmxvYWQiLGZP blVubG9hZCk7fQppZihuU3RhdGUhPW9SZXF1ZXN0LnJlYWR5U3RhdGUpCmZSZWFk eVN0YXRlQ2hhbmdlKG9SZXF1ZXN0KTtuU3RhdGU9b1JlcXVlc3QucmVhZHlTdGF0 ZTt9fTtmdW5jdGlvbiBmWE1MSHR0cFJlcXVlc3Rfc2VuZChvUmVxdWVzdCl7b1Jl cXVlc3QuX29iamVjdC5zZW5kKG9SZXF1ZXN0Ll9kYXRhKTtpZihiR2Vja28mJiFv UmVxdWVzdC5fYXN5bmMpe29SZXF1ZXN0LnJlYWR5U3RhdGU9Y1hNTEh0dHBSZXF1 ZXN0Lk9QRU5FRDtmU3luY2hyb25pemVWYWx1ZXMob1JlcXVlc3QpO3doaWxlKG9S ZXF1ZXN0LnJlYWR5U3RhdGU8Y1hNTEh0dHBSZXF1ZXN0LkRPTkUpe29SZXF1ZXN0 LnJlYWR5U3RhdGUrKztmUmVhZHlTdGF0ZUNoYW5nZShvUmVxdWVzdCk7aWYob1Jl cXVlc3QuX2Fib3J0ZWQpCnJldHVybjt9fX07Y1hNTEh0dHBSZXF1ZXN0LnByb3Rv dHlwZS5zZW5kPWZ1bmN0aW9uKHZEYXRhKXtpZihjWE1MSHR0cFJlcXVlc3Qub25z ZW5kKQpjWE1MSHR0cFJlcXVlc3Qub25zZW5kLmFwcGx5KHRoaXMsYXJndW1lbnRz KTtpZighYXJndW1lbnRzLmxlbmd0aCkKdkRhdGE9bnVsbDtpZih2RGF0YSYmdkRh dGEubm9kZVR5cGUpe3ZEYXRhPXdpbmRvdy5YTUxTZXJpYWxpemVyP25ldyB3aW5k b3cuWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHZEYXRhKTp2RGF0 YS54bWw7aWYoIW9SZXF1ZXN0Ll9oZWFkZXJzWyJDb250ZW50LVR5cGUiXSkKb1Jl cXVlc3QuX29iamVjdC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJh cHBsaWNhdGlvbi94bWwiKTt9CnRoaXMuX2RhdGE9dkRhdGE7ZlhNTEh0dHBSZXF1 ZXN0X3NlbmQodGhpcyk7fTtjWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLmFib3J0 PWZ1bmN0aW9uKCl7aWYoY1hNTEh0dHBSZXF1ZXN0Lm9uYWJvcnQpCmNYTUxIdHRw UmVxdWVzdC5vbmFib3J0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZih0aGlzLnJl YWR5U3RhdGU+Y1hNTEh0dHBSZXF1ZXN0LlVOU0VOVCkKdGhpcy5fYWJvcnRlZD10 cnVlO3RoaXMuX29iamVjdC5hYm9ydCgpO2ZDbGVhblRyYW5zcG9ydCh0aGlzKTt0 aGlzLnJlYWR5U3RhdGU9Y1hNTEh0dHBSZXF1ZXN0LlVOU0VOVDtkZWxldGUgdGhp cy5fZGF0YTt9O2NYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUuZ2V0QWxsUmVzcG9u c2VIZWFkZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29iamVjdC5nZXRBbGxS ZXNwb25zZUhlYWRlcnMoKTt9O2NYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUuZ2V0 UmVzcG9uc2VIZWFkZXI9ZnVuY3Rpb24oc05hbWUpe3JldHVybiB0aGlzLl9vYmpl Y3QuZ2V0UmVzcG9uc2VIZWFkZXIoc05hbWUpO307Y1hNTEh0dHBSZXF1ZXN0LnBy b3RvdHlwZS5zZXRSZXF1ZXN0SGVhZGVyPWZ1bmN0aW9uKHNOYW1lLHNWYWx1ZSl7 aWYoIXRoaXMuX2hlYWRlcnMpCnRoaXMuX2hlYWRlcnM9e307dGhpcy5faGVhZGVy c1tzTmFtZV09c1ZhbHVlO3JldHVybiB0aGlzLl9vYmplY3Quc2V0UmVxdWVzdEhl YWRlcihzTmFtZSxzVmFsdWUpO307Y1hNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5h ZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHNOYW1lLGZIYW5kbGVyLGJVc2VDYXB0 dXJlKXtmb3IodmFyIG5JbmRleD0wLG9MaXN0ZW5lcjtvTGlzdGVuZXI9dGhpcy5f bGlzdGVuZXJzW25JbmRleF07bkluZGV4KyspCmlmKG9MaXN0ZW5lclswXT09c05h bWUmJm9MaXN0ZW5lclsxXT09ZkhhbmRsZXImJm9MaXN0ZW5lclsyXT09YlVzZUNh cHR1cmUpCnJldHVybjt0aGlzLl9saXN0ZW5lcnMucHVzaChbc05hbWUsZkhhbmRs ZXIsYlVzZUNhcHR1cmVdKTt9O2NYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUucmVt b3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihzTmFtZSxmSGFuZGxlcixiVXNlQ2Fw dHVyZSl7Zm9yKHZhciBuSW5kZXg9MCxvTGlzdGVuZXI7b0xpc3RlbmVyPXRoaXMu X2xpc3RlbmVyc1tuSW5kZXhdO25JbmRleCsrKQppZihvTGlzdGVuZXJbMF09PXNO YW1lJiZvTGlzdGVuZXJbMV09PWZIYW5kbGVyJiZvTGlzdGVuZXJbMl09PWJVc2VD YXB0dXJlKQpicmVhaztpZihvTGlzdGVuZXIpCnRoaXMuX2xpc3RlbmVycy5zcGxp Y2UobkluZGV4LDEpO307Y1hNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5kaXNwYXRj aEV2ZW50PWZ1bmN0aW9uKG9FdmVudCl7dmFyIG9FdmVudFBzZXVkbz17J3R5cGUn Om9FdmVudC50eXBlLCd0YXJnZXQnOnRoaXMsJ2N1cnJlbnRUYXJnZXQnOnRoaXMs J2V2ZW50UGhhc2UnOjIsJ2J1YmJsZXMnOm9FdmVudC5idWJibGVzLCdjYW5jZWxh YmxlJzpvRXZlbnQuY2FuY2VsYWJsZSwndGltZVN0YW1wJzpvRXZlbnQudGltZVN0 YW1wLCdzdG9wUHJvcGFnYXRpb24nOmZ1bmN0aW9uKCl7fSwncHJldmVudERlZmF1 bHQnOmZ1bmN0aW9uKCl7fSwnaW5pdEV2ZW50JzpmdW5jdGlvbigpe319O2lmKG9F dmVudFBzZXVkby50eXBlPT0icmVhZHlzdGF0ZWNoYW5nZSImJnRoaXMub25yZWFk eXN0YXRlY2hhbmdlKQoodGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UuaGFuZGxlRXZl bnR8fHRoaXMub25yZWFkeXN0YXRlY2hhbmdlKS5hcHBseSh0aGlzLFtvRXZlbnRQ c2V1ZG9dKTtmb3IodmFyIG5JbmRleD0wLG9MaXN0ZW5lcjtvTGlzdGVuZXI9dGhp cy5fbGlzdGVuZXJzW25JbmRleF07bkluZGV4KyspCmlmKG9MaXN0ZW5lclswXT09 b0V2ZW50UHNldWRvLnR5cGUmJiFvTGlzdGVuZXJbMl0pCihvTGlzdGVuZXJbMV0u aGFuZGxlRXZlbnR8fG9MaXN0ZW5lclsxXSkuYXBwbHkodGhpcyxbb0V2ZW50UHNl dWRvXSk7fTtjWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0 aW9uKCl7cmV0dXJuJ1snKyJvYmplY3QiKycgJysiWE1MSHR0cFJlcXVlc3QiKydd Jzt9O2NYTUxIdHRwUmVxdWVzdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybidb JysiWE1MSHR0cFJlcXVlc3QiKyddJzt9O2Z1bmN0aW9uIGZSZWFkeVN0YXRlQ2hh bmdlKG9SZXF1ZXN0KXtpZihjWE1MSHR0cFJlcXVlc3Qub25yZWFkeXN0YXRlY2hh bmdlKQpjWE1MSHR0cFJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlLmFwcGx5KG9S ZXF1ZXN0KTtvUmVxdWVzdC5kaXNwYXRjaEV2ZW50KHsndHlwZSc6InJlYWR5c3Rh dGVjaGFuZ2UiLCdidWJibGVzJzpmYWxzZSwnY2FuY2VsYWJsZSc6ZmFsc2UsJ3Rp bWVTdGFtcCc6bmV3IERhdGUrMH0pO307ZnVuY3Rpb24gZkdldERvY3VtZW50KG9S ZXF1ZXN0KXt2YXIgb0RvY3VtZW50PW9SZXF1ZXN0LnJlc3BvbnNlWE1MLHNSZXNw b25zZT1vUmVxdWVzdC5yZXNwb25zZVRleHQ7aWYoYklFJiZzUmVzcG9uc2UmJm9E b2N1bWVudCYmIW9Eb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJm9SZXF1ZXN0Lmdl dFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKS5tYXRjaCgvW15cL10rXC9b XlwrXStcK3htbC8pKXtvRG9jdW1lbnQ9bmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0 KCJNaWNyb3NvZnQuWE1MRE9NIik7b0RvY3VtZW50LmFzeW5jPWZhbHNlO29Eb2N1 bWVudC52YWxpZGF0ZU9uUGFyc2U9ZmFsc2U7b0RvY3VtZW50LmxvYWRYTUwoc1Jl c3BvbnNlKTt9CmlmKG9Eb2N1bWVudCkKaWYoKGJJRSYmb0RvY3VtZW50LnBhcnNl RXJyb3IhPTApfHwhb0RvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8KG9Eb2N1bWVu dC5kb2N1bWVudEVsZW1lbnQmJm9Eb2N1bWVudC5kb2N1bWVudEVsZW1lbnQudGFn TmFtZT09InBhcnNlcmVycm9yIikpCnJldHVybiBudWxsO3JldHVybiBvRG9jdW1l bnQ7fTtmdW5jdGlvbiBmU3luY2hyb25pemVWYWx1ZXMob1JlcXVlc3Qpe3RyeXtv UmVxdWVzdC5yZXNwb25zZVRleHQ9b1JlcXVlc3QuX29iamVjdC5yZXNwb25zZVRl eHQ7fWNhdGNoKGUpe30KdHJ5e29SZXF1ZXN0LnJlc3BvbnNlWE1MPWZHZXREb2N1 bWVudChvUmVxdWVzdC5fb2JqZWN0KTt9Y2F0Y2goZSl7fQp0cnl7b1JlcXVlc3Qu c3RhdHVzPW9SZXF1ZXN0Ll9vYmplY3Quc3RhdHVzO31jYXRjaChlKXt9CnRyeXtv UmVxdWVzdC5zdGF0dXNUZXh0PW9SZXF1ZXN0Ll9vYmplY3Quc3RhdHVzVGV4dDt9 Y2F0Y2goZSl7fX07ZnVuY3Rpb24gZkNsZWFuVHJhbnNwb3J0KG9SZXF1ZXN0KXtv UmVxdWVzdC5fb2JqZWN0Lm9ucmVhZHlzdGF0ZWNoYW5nZT1uZXcgd2luZG93LkZ1 bmN0aW9uO307aWYoIXdpbmRvdy5GdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkpe3dp bmRvdy5GdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24ob1JlcXVlc3Qs b0FyZ3VtZW50cyl7aWYoIW9Bcmd1bWVudHMpCm9Bcmd1bWVudHM9W107b1JlcXVl c3QuX19mdW5jPXRoaXM7b1JlcXVlc3QuX19mdW5jKG9Bcmd1bWVudHNbMF0sb0Fy Z3VtZW50c1sxXSxvQXJndW1lbnRzWzJdLG9Bcmd1bWVudHNbM10sb0FyZ3VtZW50 c1s0XSk7ZGVsZXRlIG9SZXF1ZXN0Ll9fZnVuYzt9O307T3BlbkxheWVycy5SZXF1 ZXN0LlhNTEh0dHBSZXF1ZXN0PWNYTUxIdHRwUmVxdWVzdDt9KSgpO09wZW5MYXll cnMuRm9ybWF0LktNTD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0 LlhNTCx7bmFtZXNwYWNlczp7a21sOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2tt bC8yLjIiLGd4OiJodHRwOi8vd3d3Lmdvb2dsZS5jb20va21sL2V4dC8yLjIifSxr bWxuczoiaHR0cDovL2VhcnRoLmdvb2dsZS5jb20va21sLzIuMCIscGxhY2VtYXJr c0Rlc2M6Ik5vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZSIsZm9sZGVyc05hbWU6Ik9w ZW5MYXllcnMgZXhwb3J0Iixmb2xkZXJzRGVzYzoiRXhwb3J0ZWQgb24gIituZXcg RGF0ZSgpLGV4dHJhY3RBdHRyaWJ1dGVzOnRydWUsZXh0cmFjdFN0eWxlczpmYWxz ZSxleHRyYWN0VHJhY2tzOmZhbHNlLHRyYWNrQXR0cmlidXRlczpudWxsLGludGVy bmFsbnM6bnVsbCxmZWF0dXJlczpudWxsLHN0eWxlczpudWxsLHN0eWxlQmFzZVVy bDoiIixmZXRjaGVkOm51bGwsbWF4RGVwdGg6MCxpbml0aWFsaXplOmZ1bmN0aW9u KG9wdGlvbnMpe3RoaXMucmVnRXhlcz17dHJpbVNwYWNlOigvXlxzKnxccyokL2cp LHJlbW92ZVNwYWNlOigvXHMqL2cpLHNwbGl0U3BhY2U6KC9ccysvKSx0cmltQ29t bWE6KC9ccyosXHMqL2cpLGttbENvbG9yOigvKFx3ezJ9KShcd3syfSkoXHd7Mn0p KFx3ezJ9KS8pLGttbEljb25QYWxldHRlOigvcm9vdDpcL1wvaWNvbnNcL3BhbGV0 dGUtKFxkKykoXC5cdyspLyksc3RyYWlnaHRCcmFja2V0OigvXCRcWyguKj8pXF0v Zyl9O3RoaXMuZXh0ZXJuYWxQcm9qZWN0aW9uPW5ldyBPcGVuTGF5ZXJzLlByb2pl Y3Rpb24oIkVQU0c6NDMyNiIpO09wZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5 cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7fSxyZWFkOmZ1bmN0 aW9uKGRhdGEpe3RoaXMuZmVhdHVyZXM9W107dGhpcy5zdHlsZXM9e307dGhpcy5m ZXRjaGVkPXt9O3ZhciBvcHRpb25zPXtkZXB0aDowLHN0eWxlQmFzZVVybDp0aGlz LnN0eWxlQmFzZVVybH07cmV0dXJuIHRoaXMucGFyc2VEYXRhKGRhdGEsb3B0aW9u cyk7fSxwYXJzZURhdGE6ZnVuY3Rpb24oZGF0YSxvcHRpb25zKXtpZih0eXBlb2Yg ZGF0YT09InN0cmluZyIpe2RhdGE9T3BlbkxheWVycy5Gb3JtYXQuWE1MLnByb3Rv dHlwZS5yZWFkLmFwcGx5KHRoaXMsW2RhdGFdKTt9CnZhciB0eXBlcz1bIkxpbmsi LCJOZXR3b3JrTGluayIsIlN0eWxlIiwiU3R5bGVNYXAiLCJQbGFjZW1hcmsiXTtm b3IodmFyIGk9MCxsZW49dHlwZXMubGVuZ3RoO2k8bGVuOysraSl7dmFyIHR5cGU9 dHlwZXNbaV07dmFyIG5vZGVzPXRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhk YXRhLCIqIix0eXBlKTtpZihub2Rlcy5sZW5ndGg9PTApe2NvbnRpbnVlO30Kc3dp dGNoKHR5cGUudG9Mb3dlckNhc2UoKSl7Y2FzZSJsaW5rIjpjYXNlIm5ldHdvcmts aW5rIjp0aGlzLnBhcnNlTGlua3Mobm9kZXMsb3B0aW9ucyk7YnJlYWs7Y2FzZSJz dHlsZSI6aWYodGhpcy5leHRyYWN0U3R5bGVzKXt0aGlzLnBhcnNlU3R5bGVzKG5v ZGVzLG9wdGlvbnMpO30KYnJlYWs7Y2FzZSJzdHlsZW1hcCI6aWYodGhpcy5leHRy YWN0U3R5bGVzKXt0aGlzLnBhcnNlU3R5bGVNYXBzKG5vZGVzLG9wdGlvbnMpO30K YnJlYWs7Y2FzZSJwbGFjZW1hcmsiOnRoaXMucGFyc2VGZWF0dXJlcyhub2Rlcyxv cHRpb25zKTticmVhazt9fQpyZXR1cm4gdGhpcy5mZWF0dXJlczt9LHBhcnNlTGlu a3M6ZnVuY3Rpb24obm9kZXMsb3B0aW9ucyl7aWYob3B0aW9ucy5kZXB0aD49dGhp cy5tYXhEZXB0aCl7cmV0dXJuIGZhbHNlO30KdmFyIG5ld09wdGlvbnM9T3Blbkxh eWVycy5VdGlsLmV4dGVuZCh7fSxvcHRpb25zKTtuZXdPcHRpb25zLmRlcHRoKys7 Zm9yKHZhciBpPTAsbGVuPW5vZGVzLmxlbmd0aDtpPGxlbjtpKyspe3ZhciBocmVm PXRoaXMucGFyc2VQcm9wZXJ0eShub2Rlc1tpXSwiKiIsImhyZWYiKTtpZihocmVm JiYhdGhpcy5mZXRjaGVkW2hyZWZdKXt0aGlzLmZldGNoZWRbaHJlZl09dHJ1ZTt2 YXIgZGF0YT10aGlzLmZldGNoTGluayhocmVmKTtpZihkYXRhKXt0aGlzLnBhcnNl RGF0YShkYXRhLG5ld09wdGlvbnMpO319fX0sZmV0Y2hMaW5rOmZ1bmN0aW9uKGhy ZWYpe3ZhciByZXF1ZXN0PU9wZW5MYXllcnMuUmVxdWVzdC5HRVQoe3VybDpocmVm LGFzeW5jOmZhbHNlfSk7aWYocmVxdWVzdCl7cmV0dXJuIHJlcXVlc3QucmVzcG9u c2VUZXh0O319LHBhcnNlU3R5bGVzOmZ1bmN0aW9uKG5vZGVzLG9wdGlvbnMpe2Zv cih2YXIgaT0wLGxlbj1ub2Rlcy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgc3R5bGU9 dGhpcy5wYXJzZVN0eWxlKG5vZGVzW2ldKTtpZihzdHlsZSl7dmFyIHN0eWxlTmFt ZT0ob3B0aW9ucy5zdHlsZUJhc2VVcmx8fCIiKSsiIyIrc3R5bGUuaWQ7dGhpcy5z dHlsZXNbc3R5bGVOYW1lXT1zdHlsZTt9fX0scGFyc2VLbWxDb2xvcjpmdW5jdGlv bihrbWxDb2xvcil7dmFyIGNvbG9yPW51bGw7aWYoa21sQ29sb3Ipe3ZhciBtYXRj aGVzPWttbENvbG9yLm1hdGNoKHRoaXMucmVnRXhlcy5rbWxDb2xvcik7aWYobWF0 Y2hlcyl7Y29sb3I9e2NvbG9yOicjJyttYXRjaGVzWzRdK21hdGNoZXNbM10rbWF0 Y2hlc1syXSxvcGFjaXR5OnBhcnNlSW50KG1hdGNoZXNbMV0sMTYpLzI1NX07fX0K cmV0dXJuIGNvbG9yO30scGFyc2VTdHlsZTpmdW5jdGlvbihub2RlKXt2YXIgc3R5 bGU9e307dmFyIHR5cGVzPVsiTGluZVN0eWxlIiwiUG9seVN0eWxlIiwiSWNvblN0 eWxlIiwiQmFsbG9vblN0eWxlIiwiTGFiZWxTdHlsZSJdO3ZhciB0eXBlLHN0eWxl VHlwZU5vZGUsbm9kZUxpc3QsZ2VvbWV0cnkscGFyc2VyO2Zvcih2YXIgaT0wLGxl bj10eXBlcy5sZW5ndGg7aTxsZW47KytpKXt0eXBlPXR5cGVzW2ldO3N0eWxlVHlw ZU5vZGU9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5vZGUsIioiLHR5cGUp WzBdO2lmKCFzdHlsZVR5cGVOb2RlKXtjb250aW51ZTt9CnN3aXRjaCh0eXBlLnRv TG93ZXJDYXNlKCkpe2Nhc2UibGluZXN0eWxlIjp2YXIga21sQ29sb3I9dGhpcy5w YXJzZVByb3BlcnR5KHN0eWxlVHlwZU5vZGUsIioiLCJjb2xvciIpO3ZhciBjb2xv cj10aGlzLnBhcnNlS21sQ29sb3Ioa21sQ29sb3IpO2lmKGNvbG9yKXtzdHlsZVsi c3Ryb2tlQ29sb3IiXT1jb2xvci5jb2xvcjtzdHlsZVsic3Ryb2tlT3BhY2l0eSJd PWNvbG9yLm9wYWNpdHk7fQp2YXIgd2lkdGg9dGhpcy5wYXJzZVByb3BlcnR5KHN0 eWxlVHlwZU5vZGUsIioiLCJ3aWR0aCIpO2lmKHdpZHRoKXtzdHlsZVsic3Ryb2tl V2lkdGgiXT13aWR0aDt9CmJyZWFrO2Nhc2UicG9seXN0eWxlIjp2YXIga21sQ29s b3I9dGhpcy5wYXJzZVByb3BlcnR5KHN0eWxlVHlwZU5vZGUsIioiLCJjb2xvciIp O3ZhciBjb2xvcj10aGlzLnBhcnNlS21sQ29sb3Ioa21sQ29sb3IpO2lmKGNvbG9y KXtzdHlsZVsiZmlsbE9wYWNpdHkiXT1jb2xvci5vcGFjaXR5O3N0eWxlWyJmaWxs Q29sb3IiXT1jb2xvci5jb2xvcjt9CnZhciBmaWxsPXRoaXMucGFyc2VQcm9wZXJ0 eShzdHlsZVR5cGVOb2RlLCIqIiwiZmlsbCIpO2lmKGZpbGw9PSIwIil7c3R5bGVb ImZpbGxDb2xvciJdPSJub25lIjt9CnZhciBvdXRsaW5lPXRoaXMucGFyc2VQcm9w ZXJ0eShzdHlsZVR5cGVOb2RlLCIqIiwib3V0bGluZSIpO2lmKG91dGxpbmU9PSIw Iil7c3R5bGVbInN0cm9rZVdpZHRoIl09IjAiO30KYnJlYWs7Y2FzZSJpY29uc3R5 bGUiOnZhciBzY2FsZT1wYXJzZUZsb2F0KHRoaXMucGFyc2VQcm9wZXJ0eShzdHls ZVR5cGVOb2RlLCIqIiwic2NhbGUiKXx8MSk7dmFyIHdpZHRoPTMyKnNjYWxlO3Zh ciBoZWlnaHQ9MzIqc2NhbGU7dmFyIGljb25Ob2RlPXRoaXMuZ2V0RWxlbWVudHNC eVRhZ05hbWVOUyhzdHlsZVR5cGVOb2RlLCIqIiwiSWNvbiIpWzBdO2lmKGljb25O b2RlKXt2YXIgaHJlZj10aGlzLnBhcnNlUHJvcGVydHkoaWNvbk5vZGUsIioiLCJo cmVmIik7aWYoaHJlZil7dmFyIHc9dGhpcy5wYXJzZVByb3BlcnR5KGljb25Ob2Rl LCIqIiwidyIpO3ZhciBoPXRoaXMucGFyc2VQcm9wZXJ0eShpY29uTm9kZSwiKiIs ImgiKTt2YXIgZ29vZ2xlPSJodHRwOi8vbWFwcy5nb29nbGUuY29tL21hcGZpbGVz L2ttbCI7aWYoT3BlbkxheWVycy5TdHJpbmcuc3RhcnRzV2l0aChocmVmLGdvb2ds ZSkmJiF3JiYhaCl7dz02NDtoPTY0O3NjYWxlPXNjYWxlLzI7fQp3PXd8fGg7aD1o fHx3O2lmKHcpe3dpZHRoPXBhcnNlSW50KHcpKnNjYWxlO30KaWYoaCl7aGVpZ2h0 PXBhcnNlSW50KGgpKnNjYWxlO30KdmFyIG1hdGNoZXM9aHJlZi5tYXRjaCh0aGlz LnJlZ0V4ZXMua21sSWNvblBhbGV0dGUpO2lmKG1hdGNoZXMpe3ZhciBwYWxldHRl PW1hdGNoZXNbMV07dmFyIGZpbGVfZXh0ZW5zaW9uPW1hdGNoZXNbMl07dmFyIHg9 dGhpcy5wYXJzZVByb3BlcnR5KGljb25Ob2RlLCIqIiwieCIpO3ZhciB5PXRoaXMu cGFyc2VQcm9wZXJ0eShpY29uTm9kZSwiKiIsInkiKTt2YXIgcG9zWD14P3gvMzI6 MDt2YXIgcG9zWT15Pyg3LXkvMzIpOjc7dmFyIHBvcz1wb3NZKjgrcG9zWDtocmVm PSJodHRwOi8vbWFwcy5nb29nbGUuY29tL21hcGZpbGVzL2ttbC9wYWwiCitwYWxl dHRlKyIvaWNvbiIrcG9zK2ZpbGVfZXh0ZW5zaW9uO30Kc3R5bGVbImdyYXBoaWNP cGFjaXR5Il09MTtzdHlsZVsiZXh0ZXJuYWxHcmFwaGljIl09aHJlZjt9fQp2YXIg aG90U3BvdE5vZGU9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKHN0eWxlVHlw ZU5vZGUsIioiLCJob3RTcG90IilbMF07aWYoaG90U3BvdE5vZGUpe3ZhciB4PXBh cnNlRmxvYXQoaG90U3BvdE5vZGUuZ2V0QXR0cmlidXRlKCJ4IikpO3ZhciB5PXBh cnNlRmxvYXQoaG90U3BvdE5vZGUuZ2V0QXR0cmlidXRlKCJ5IikpO3ZhciB4VW5p dHM9aG90U3BvdE5vZGUuZ2V0QXR0cmlidXRlKCJ4dW5pdHMiKTtpZih4VW5pdHM9 PSJwaXhlbHMiKXtzdHlsZVsiZ3JhcGhpY1hPZmZzZXQiXT0teCpzY2FsZTt9CmVs c2UgaWYoeFVuaXRzPT0iaW5zZXRQaXhlbHMiKXtzdHlsZVsiZ3JhcGhpY1hPZmZz ZXQiXT0td2lkdGgrKHgqc2NhbGUpO30KZWxzZSBpZih4VW5pdHM9PSJmcmFjdGlv biIpe3N0eWxlWyJncmFwaGljWE9mZnNldCJdPS13aWR0aCp4O30KdmFyIHlVbml0 cz1ob3RTcG90Tm9kZS5nZXRBdHRyaWJ1dGUoInl1bml0cyIpO2lmKHlVbml0cz09 InBpeGVscyIpe3N0eWxlWyJncmFwaGljWU9mZnNldCJdPS1oZWlnaHQrKHkqc2Nh bGUpKzE7fQplbHNlIGlmKHlVbml0cz09Imluc2V0UGl4ZWxzIil7c3R5bGVbImdy YXBoaWNZT2Zmc2V0Il09LSh5KnNjYWxlKSsxO30KZWxzZSBpZih5VW5pdHM9PSJm cmFjdGlvbiIpe3N0eWxlWyJncmFwaGljWU9mZnNldCJdPS1oZWlnaHQqKDEteSkr MTt9fQpzdHlsZVsiZ3JhcGhpY1dpZHRoIl09d2lkdGg7c3R5bGVbImdyYXBoaWNI ZWlnaHQiXT1oZWlnaHQ7YnJlYWs7Y2FzZSJiYWxsb29uc3R5bGUiOnZhciBiYWxs b29uU3R5bGU9T3BlbkxheWVycy5VdGlsLmdldFhtbE5vZGVWYWx1ZShzdHlsZVR5 cGVOb2RlKTtpZihiYWxsb29uU3R5bGUpe3N0eWxlWyJiYWxsb29uU3R5bGUiXT1i YWxsb29uU3R5bGUucmVwbGFjZSh0aGlzLnJlZ0V4ZXMuc3RyYWlnaHRCcmFja2V0 LCIkeyQxfSIpO30KYnJlYWs7Y2FzZSJsYWJlbHN0eWxlIjp2YXIga21sQ29sb3I9 dGhpcy5wYXJzZVByb3BlcnR5KHN0eWxlVHlwZU5vZGUsIioiLCJjb2xvciIpO3Zh ciBjb2xvcj10aGlzLnBhcnNlS21sQ29sb3Ioa21sQ29sb3IpO2lmKGNvbG9yKXtz dHlsZVsiZm9udENvbG9yIl09Y29sb3IuY29sb3I7c3R5bGVbImZvbnRPcGFjaXR5 Il09Y29sb3Iub3BhY2l0eTt9CmJyZWFrO2RlZmF1bHQ6fX0KaWYoIXN0eWxlWyJz dHJva2VDb2xvciJdJiZzdHlsZVsiZmlsbENvbG9yIl0pe3N0eWxlWyJzdHJva2VD b2xvciJdPXN0eWxlWyJmaWxsQ29sb3IiXTt9CnZhciBpZD1ub2RlLmdldEF0dHJp YnV0ZSgiaWQiKTtpZihpZCYmc3R5bGUpe3N0eWxlLmlkPWlkO30KcmV0dXJuIHN0 eWxlO30scGFyc2VTdHlsZU1hcHM6ZnVuY3Rpb24obm9kZXMsb3B0aW9ucyl7Zm9y KHZhciBpPTAsbGVuPW5vZGVzLmxlbmd0aDtpPGxlbjtpKyspe3ZhciBub2RlPW5v ZGVzW2ldO3ZhciBwYWlycz10aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMobm9k ZSwiKiIsIlBhaXIiKTt2YXIgaWQ9bm9kZS5nZXRBdHRyaWJ1dGUoImlkIik7Zm9y KHZhciBqPTAsamxlbj1wYWlycy5sZW5ndGg7ajxqbGVuO2orKyl7dmFyIHBhaXI9 cGFpcnNbal07dmFyIGtleT10aGlzLnBhcnNlUHJvcGVydHkocGFpciwiKiIsImtl eSIpO3ZhciBzdHlsZVVybD10aGlzLnBhcnNlUHJvcGVydHkocGFpciwiKiIsInN0 eWxlVXJsIik7aWYoc3R5bGVVcmwmJmtleT09Im5vcm1hbCIpe3RoaXMuc3R5bGVz WyhvcHRpb25zLnN0eWxlQmFzZVVybHx8IiIpKyIjIitpZF09dGhpcy5zdHlsZXNb KG9wdGlvbnMuc3R5bGVCYXNlVXJsfHwiIikrc3R5bGVVcmxdO30KaWYoc3R5bGVV cmwmJmtleT09ImhpZ2hsaWdodCIpe319fX0scGFyc2VGZWF0dXJlczpmdW5jdGlv bihub2RlcyxvcHRpb25zKXt2YXIgZmVhdHVyZXM9W107Zm9yKHZhciBpPTAsbGVu PW5vZGVzLmxlbmd0aDtpPGxlbjtpKyspe3ZhciBmZWF0dXJlTm9kZT1ub2Rlc1tp XTt2YXIgZmVhdHVyZT10aGlzLnBhcnNlRmVhdHVyZS5hcHBseSh0aGlzLFtmZWF0 dXJlTm9kZV0pO2lmKGZlYXR1cmUpe2lmKHRoaXMuZXh0cmFjdFN0eWxlcyYmZmVh dHVyZS5hdHRyaWJ1dGVzJiZmZWF0dXJlLmF0dHJpYnV0ZXMuc3R5bGVVcmwpe2Zl YXR1cmUuc3R5bGU9dGhpcy5nZXRTdHlsZShmZWF0dXJlLmF0dHJpYnV0ZXMuc3R5 bGVVcmwsb3B0aW9ucyk7fQppZih0aGlzLmV4dHJhY3RTdHlsZXMpe3ZhciBpbmxp bmVTdHlsZU5vZGU9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKGZlYXR1cmVO b2RlLCIqIiwiU3R5bGUiKVswXTtpZihpbmxpbmVTdHlsZU5vZGUpe3ZhciBpbmxp bmVTdHlsZT10aGlzLnBhcnNlU3R5bGUoaW5saW5lU3R5bGVOb2RlKTtpZihpbmxp bmVTdHlsZSl7ZmVhdHVyZS5zdHlsZT1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKGZl YXR1cmUuc3R5bGUsaW5saW5lU3R5bGUpO319fQppZih0aGlzLmV4dHJhY3RUcmFj a3Mpe3ZhciB0cmFja3M9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKGZlYXR1 cmVOb2RlLHRoaXMubmFtZXNwYWNlcy5neCwiVHJhY2siKTtpZih0cmFja3MmJnRy YWNrcy5sZW5ndGg+MCl7dmFyIHRyYWNrPXRyYWNrc1swXTt2YXIgY29udGFpbmVy PXtmZWF0dXJlczpbXSxmZWF0dXJlOmZlYXR1cmV9O3RoaXMucmVhZE5vZGUodHJh Y2ssY29udGFpbmVyKTtpZihjb250YWluZXIuZmVhdHVyZXMubGVuZ3RoPjApe2Zl YXR1cmVzLnB1c2guYXBwbHkoZmVhdHVyZXMsY29udGFpbmVyLmZlYXR1cmVzKTt9 fX1lbHNle2ZlYXR1cmVzLnB1c2goZmVhdHVyZSk7fX1lbHNle3Rocm93IkJhZCBQ bGFjZW1hcms6ICIraTt9fQp0aGlzLmZlYXR1cmVzPXRoaXMuZmVhdHVyZXMuY29u Y2F0KGZlYXR1cmVzKTt9LHJlYWRlcnM6eyJrbWwiOnsid2hlbiI6ZnVuY3Rpb24o bm9kZSxjb250YWluZXIpe2NvbnRhaW5lci53aGVucy5wdXNoKE9wZW5MYXllcnMu RGF0ZS5wYXJzZSh0aGlzLmdldENoaWxkVmFsdWUobm9kZSkpKTt9LCJfdHJhY2tQ b2ludEF0dHJpYnV0ZSI6ZnVuY3Rpb24obm9kZSxjb250YWluZXIpe3ZhciBuYW1l PW5vZGUubm9kZU5hbWUuc3BsaXQoIjoiKS5wb3AoKTtjb250YWluZXIuYXR0cmli dXRlc1tuYW1lXS5wdXNoKHRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKSk7fX0sImd4 Ijp7IlRyYWNrIjpmdW5jdGlvbihub2RlLGNvbnRhaW5lcil7dmFyIG9iaj17d2hl bnM6W10scG9pbnRzOltdLGFuZ2xlczpbXX07aWYodGhpcy50cmFja0F0dHJpYnV0 ZXMpe3ZhciBuYW1lO29iai5hdHRyaWJ1dGVzPXt9O2Zvcih2YXIgaT0wLGlpPXRo aXMudHJhY2tBdHRyaWJ1dGVzLmxlbmd0aDtpPGlpOysraSl7bmFtZT10aGlzLnRy YWNrQXR0cmlidXRlc1tpXTtvYmouYXR0cmlidXRlc1tuYW1lXT1bXTtpZighKG5h bWUgaW4gdGhpcy5yZWFkZXJzLmttbCkpe3RoaXMucmVhZGVycy5rbWxbbmFtZV09 dGhpcy5yZWFkZXJzLmttbC5fdHJhY2tQb2ludEF0dHJpYnV0ZTt9fX0KdGhpcy5y ZWFkQ2hpbGROb2Rlcyhub2RlLG9iaik7aWYob2JqLndoZW5zLmxlbmd0aCE9PW9i ai5wb2ludHMubGVuZ3RoKXt0aHJvdyBuZXcgRXJyb3IoImd4OlRyYWNrIHdpdGgg dW5lcXVhbCBudW1iZXIgb2Ygd2hlbiAoIitvYmoud2hlbnMubGVuZ3RoKyIpIGFu ZCBneDpjb29yZCAoIitvYmoucG9pbnRzLmxlbmd0aCsiKSBlbGVtZW50cy4iKTt9 CnZhciBoYXNBbmdsZXM9b2JqLmFuZ2xlcy5sZW5ndGg+MDtpZihoYXNBbmdsZXMm Jm9iai53aGVucy5sZW5ndGghPT1vYmouYW5nbGVzLmxlbmd0aCl7dGhyb3cgbmV3 IEVycm9yKCJneDpUcmFjayB3aXRoIHVuZXF1YWwgbnVtYmVyIG9mIHdoZW4gKCIr b2JqLndoZW5zLmxlbmd0aCsiKSBhbmQgZ3g6YW5nbGVzICgiK29iai5hbmdsZXMu bGVuZ3RoKyIpIGVsZW1lbnRzLiIpO30KdmFyIGZlYXR1cmUscG9pbnQsYW5nbGVz O2Zvcih2YXIgaT0wLGlpPW9iai53aGVucy5sZW5ndGg7aTxpaTsrK2kpe2ZlYXR1 cmU9Y29udGFpbmVyLmZlYXR1cmUuY2xvbmUoKTtmZWF0dXJlLmZpZD1jb250YWlu ZXIuZmVhdHVyZS5maWR8fGNvbnRhaW5lci5mZWF0dXJlLmlkO3BvaW50PW9iai5w b2ludHNbaV07ZmVhdHVyZS5nZW9tZXRyeT1wb2ludDtpZigieiJpbiBwb2ludCl7 ZmVhdHVyZS5hdHRyaWJ1dGVzLmFsdGl0dWRlPXBvaW50Lno7fQppZih0aGlzLmlu dGVybmFsUHJvamVjdGlvbiYmdGhpcy5leHRlcm5hbFByb2plY3Rpb24pe2ZlYXR1 cmUuZ2VvbWV0cnkudHJhbnNmb3JtKHRoaXMuZXh0ZXJuYWxQcm9qZWN0aW9uLHRo aXMuaW50ZXJuYWxQcm9qZWN0aW9uKTt9CmlmKHRoaXMudHJhY2tBdHRyaWJ1dGVz KXtmb3IodmFyIGo9MCxqaj10aGlzLnRyYWNrQXR0cmlidXRlcy5sZW5ndGg7ajxq ajsrK2ope2ZlYXR1cmUuYXR0cmlidXRlc1tuYW1lXT1vYmouYXR0cmlidXRlc1t0 aGlzLnRyYWNrQXR0cmlidXRlc1tqXV1baV07fX0KZmVhdHVyZS5hdHRyaWJ1dGVz LndoZW49b2JqLndoZW5zW2ldO2ZlYXR1cmUuYXR0cmlidXRlcy50cmFja0lkPWNv bnRhaW5lci5mZWF0dXJlLmlkO2lmKGhhc0FuZ2xlcyl7YW5nbGVzPW9iai5hbmds ZXNbaV07ZmVhdHVyZS5hdHRyaWJ1dGVzLmhlYWRpbmc9cGFyc2VGbG9hdChhbmds ZXNbMF0pO2ZlYXR1cmUuYXR0cmlidXRlcy50aWx0PXBhcnNlRmxvYXQoYW5nbGVz WzFdKTtmZWF0dXJlLmF0dHJpYnV0ZXMucm9sbD1wYXJzZUZsb2F0KGFuZ2xlc1sy XSk7fQpjb250YWluZXIuZmVhdHVyZXMucHVzaChmZWF0dXJlKTt9fSwiY29vcmQi OmZ1bmN0aW9uKG5vZGUsY29udGFpbmVyKXt2YXIgc3RyPXRoaXMuZ2V0Q2hpbGRW YWx1ZShub2RlKTt2YXIgY29vcmRzPXN0ci5yZXBsYWNlKHRoaXMucmVnRXhlcy50 cmltU3BhY2UsIiIpLnNwbGl0KC9ccysvKTt2YXIgcG9pbnQ9bmV3IE9wZW5MYXll cnMuR2VvbWV0cnkuUG9pbnQoY29vcmRzWzBdLGNvb3Jkc1sxXSk7aWYoY29vcmRz Lmxlbmd0aD4yKXtwb2ludC56PXBhcnNlRmxvYXQoY29vcmRzWzJdKTt9CmNvbnRh aW5lci5wb2ludHMucHVzaChwb2ludCk7fSwiYW5nbGVzIjpmdW5jdGlvbihub2Rl LGNvbnRhaW5lcil7dmFyIHN0cj10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7dmFy IHBhcnRzPXN0ci5yZXBsYWNlKHRoaXMucmVnRXhlcy50cmltU3BhY2UsIiIpLnNw bGl0KC9ccysvKTtjb250YWluZXIuYW5nbGVzLnB1c2gocGFydHMpO319fSxwYXJz ZUZlYXR1cmU6ZnVuY3Rpb24obm9kZSl7dmFyIG9yZGVyPVsiTXVsdGlHZW9tZXRy eSIsIlBvbHlnb24iLCJMaW5lU3RyaW5nIiwiUG9pbnQiXTt2YXIgdHlwZSxub2Rl TGlzdCxnZW9tZXRyeSxwYXJzZXI7Zm9yKHZhciBpPTAsbGVuPW9yZGVyLmxlbmd0 aDtpPGxlbjsrK2kpe3R5cGU9b3JkZXJbaV07dGhpcy5pbnRlcm5hbG5zPW5vZGUu bmFtZXNwYWNlVVJJP25vZGUubmFtZXNwYWNlVVJJOnRoaXMua21sbnM7bm9kZUxp c3Q9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5vZGUsdGhpcy5pbnRlcm5h bG5zLHR5cGUpO2lmKG5vZGVMaXN0Lmxlbmd0aD4wKXt2YXIgcGFyc2VyPXRoaXMu cGFyc2VHZW9tZXRyeVt0eXBlLnRvTG93ZXJDYXNlKCldO2lmKHBhcnNlcil7Z2Vv bWV0cnk9cGFyc2VyLmFwcGx5KHRoaXMsW25vZGVMaXN0WzBdXSk7aWYodGhpcy5p bnRlcm5hbFByb2plY3Rpb24mJnRoaXMuZXh0ZXJuYWxQcm9qZWN0aW9uKXtnZW9t ZXRyeS50cmFuc2Zvcm0odGhpcy5leHRlcm5hbFByb2plY3Rpb24sdGhpcy5pbnRl cm5hbFByb2plY3Rpb24pO319ZWxzZXtPcGVuTGF5ZXJzLkNvbnNvbGUuZXJyb3Io T3BlbkxheWVycy5pMThuKCJ1bnN1cHBvcnRlZEdlb21ldHJ5VHlwZSIseydnZW9t VHlwZSc6dHlwZX0pKTt9CmJyZWFrO319CnZhciBhdHRyaWJ1dGVzO2lmKHRoaXMu ZXh0cmFjdEF0dHJpYnV0ZXMpe2F0dHJpYnV0ZXM9dGhpcy5wYXJzZUF0dHJpYnV0 ZXMobm9kZSk7fQp2YXIgZmVhdHVyZT1uZXcgT3BlbkxheWVycy5GZWF0dXJlLlZl Y3RvcihnZW9tZXRyeSxhdHRyaWJ1dGVzKTt2YXIgZmlkPW5vZGUuZ2V0QXR0cmli dXRlKCJpZCIpfHxub2RlLmdldEF0dHJpYnV0ZSgibmFtZSIpO2lmKGZpZCE9bnVs bCl7ZmVhdHVyZS5maWQ9ZmlkO30KcmV0dXJuIGZlYXR1cmU7fSxnZXRTdHlsZTpm dW5jdGlvbihzdHlsZVVybCxvcHRpb25zKXt2YXIgc3R5bGVCYXNlVXJsPU9wZW5M YXllcnMuVXRpbC5yZW1vdmVUYWlsKHN0eWxlVXJsKTt2YXIgbmV3T3B0aW9ucz1P cGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHt9LG9wdGlvbnMpO25ld09wdGlvbnMuZGVw dGgrKztuZXdPcHRpb25zLnN0eWxlQmFzZVVybD1zdHlsZUJhc2VVcmw7aWYoIXRo aXMuc3R5bGVzW3N0eWxlVXJsXSYmIU9wZW5MYXllcnMuU3RyaW5nLnN0YXJ0c1dp dGgoc3R5bGVVcmwsIiMiKSYmbmV3T3B0aW9ucy5kZXB0aDw9dGhpcy5tYXhEZXB0 aCYmIXRoaXMuZmV0Y2hlZFtzdHlsZUJhc2VVcmxdKXt2YXIgZGF0YT10aGlzLmZl dGNoTGluayhzdHlsZUJhc2VVcmwpO2lmKGRhdGEpe3RoaXMucGFyc2VEYXRhKGRh dGEsbmV3T3B0aW9ucyk7fX0KdmFyIHN0eWxlPU9wZW5MYXllcnMuVXRpbC5leHRl bmQoe30sdGhpcy5zdHlsZXNbc3R5bGVVcmxdKTtyZXR1cm4gc3R5bGU7fSxwYXJz ZUdlb21ldHJ5Ontwb2ludDpmdW5jdGlvbihub2RlKXt2YXIgbm9kZUxpc3Q9dGhp cy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5vZGUsdGhpcy5pbnRlcm5hbG5zLCJj b29yZGluYXRlcyIpO3ZhciBjb29yZHM9W107aWYobm9kZUxpc3QubGVuZ3RoPjAp e3ZhciBjb29yZFN0cmluZz1ub2RlTGlzdFswXS5maXJzdENoaWxkLm5vZGVWYWx1 ZTtjb29yZFN0cmluZz1jb29yZFN0cmluZy5yZXBsYWNlKHRoaXMucmVnRXhlcy5y ZW1vdmVTcGFjZSwiIik7Y29vcmRzPWNvb3JkU3RyaW5nLnNwbGl0KCIsIik7fQp2 YXIgcG9pbnQ9bnVsbDtpZihjb29yZHMubGVuZ3RoPjEpe2lmKGNvb3Jkcy5sZW5n dGg9PTIpe2Nvb3Jkc1syXT1udWxsO30KcG9pbnQ9bmV3IE9wZW5MYXllcnMuR2Vv bWV0cnkuUG9pbnQoY29vcmRzWzBdLGNvb3Jkc1sxXSxjb29yZHNbMl0pO31lbHNl e3Rocm93IkJhZCBjb29yZGluYXRlIHN0cmluZzogIitjb29yZFN0cmluZzt9CnJl dHVybiBwb2ludDt9LGxpbmVzdHJpbmc6ZnVuY3Rpb24obm9kZSxyaW5nKXt2YXIg bm9kZUxpc3Q9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5vZGUsdGhpcy5p bnRlcm5hbG5zLCJjb29yZGluYXRlcyIpO3ZhciBsaW5lPW51bGw7aWYobm9kZUxp c3QubGVuZ3RoPjApe3ZhciBjb29yZFN0cmluZz10aGlzLmdldENoaWxkVmFsdWUo bm9kZUxpc3RbMF0pO2Nvb3JkU3RyaW5nPWNvb3JkU3RyaW5nLnJlcGxhY2UodGhp cy5yZWdFeGVzLnRyaW1TcGFjZSwiIik7Y29vcmRTdHJpbmc9Y29vcmRTdHJpbmcu cmVwbGFjZSh0aGlzLnJlZ0V4ZXMudHJpbUNvbW1hLCIsIik7dmFyIHBvaW50TGlz dD1jb29yZFN0cmluZy5zcGxpdCh0aGlzLnJlZ0V4ZXMuc3BsaXRTcGFjZSk7dmFy IG51bVBvaW50cz1wb2ludExpc3QubGVuZ3RoO3ZhciBwb2ludHM9bmV3IEFycmF5 KG51bVBvaW50cyk7dmFyIGNvb3JkcyxudW1Db29yZHM7Zm9yKHZhciBpPTA7aTxu dW1Qb2ludHM7KytpKXtjb29yZHM9cG9pbnRMaXN0W2ldLnNwbGl0KCIsIik7bnVt Q29vcmRzPWNvb3Jkcy5sZW5ndGg7aWYobnVtQ29vcmRzPjEpe2lmKGNvb3Jkcy5s ZW5ndGg9PTIpe2Nvb3Jkc1syXT1udWxsO30KcG9pbnRzW2ldPW5ldyBPcGVuTGF5 ZXJzLkdlb21ldHJ5LlBvaW50KGNvb3Jkc1swXSxjb29yZHNbMV0sY29vcmRzWzJd KTt9ZWxzZXt0aHJvdyJCYWQgTGluZVN0cmluZyBwb2ludCBjb29yZGluYXRlczog IisKcG9pbnRMaXN0W2ldO319CmlmKG51bVBvaW50cyl7aWYocmluZyl7bGluZT1u ZXcgT3BlbkxheWVycy5HZW9tZXRyeS5MaW5lYXJSaW5nKHBvaW50cyk7fWVsc2V7 bGluZT1uZXcgT3BlbkxheWVycy5HZW9tZXRyeS5MaW5lU3RyaW5nKHBvaW50cyk7 fX1lbHNle3Rocm93IkJhZCBMaW5lU3RyaW5nIGNvb3JkaW5hdGVzOiAiK2Nvb3Jk U3RyaW5nO319CnJldHVybiBsaW5lO30scG9seWdvbjpmdW5jdGlvbihub2RlKXt2 YXIgbm9kZUxpc3Q9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5vZGUsdGhp cy5pbnRlcm5hbG5zLCJMaW5lYXJSaW5nIik7dmFyIG51bVJpbmdzPW5vZGVMaXN0 Lmxlbmd0aDt2YXIgY29tcG9uZW50cz1uZXcgQXJyYXkobnVtUmluZ3MpO2lmKG51 bVJpbmdzPjApe3ZhciByaW5nO2Zvcih2YXIgaT0wLGxlbj1ub2RlTGlzdC5sZW5n dGg7aTxsZW47KytpKXtyaW5nPXRoaXMucGFyc2VHZW9tZXRyeS5saW5lc3RyaW5n LmFwcGx5KHRoaXMsW25vZGVMaXN0W2ldLHRydWVdKTtpZihyaW5nKXtjb21wb25l bnRzW2ldPXJpbmc7fWVsc2V7dGhyb3ciQmFkIExpbmVhclJpbmcgZ2VvbWV0cnk6 ICIraTt9fX0KcmV0dXJuIG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvbHlnb24o Y29tcG9uZW50cyk7fSxtdWx0aWdlb21ldHJ5OmZ1bmN0aW9uKG5vZGUpe3ZhciBj aGlsZCxwYXJzZXI7dmFyIHBhcnRzPVtdO3ZhciBjaGlsZHJlbj1ub2RlLmNoaWxk Tm9kZXM7Zm9yKHZhciBpPTAsbGVuPWNoaWxkcmVuLmxlbmd0aDtpPGxlbjsrK2kp e2NoaWxkPWNoaWxkcmVuW2ldO2lmKGNoaWxkLm5vZGVUeXBlPT0xKXt2YXIgdHlw ZT0oY2hpbGQucHJlZml4KT9jaGlsZC5ub2RlTmFtZS5zcGxpdCgiOiIpWzFdOmNo aWxkLm5vZGVOYW1lO3ZhciBwYXJzZXI9dGhpcy5wYXJzZUdlb21ldHJ5W3R5cGUu dG9Mb3dlckNhc2UoKV07aWYocGFyc2VyKXtwYXJ0cy5wdXNoKHBhcnNlci5hcHBs eSh0aGlzLFtjaGlsZF0pKTt9fX0KcmV0dXJuIG5ldyBPcGVuTGF5ZXJzLkdlb21l dHJ5LkNvbGxlY3Rpb24ocGFydHMpO319LHBhcnNlQXR0cmlidXRlczpmdW5jdGlv bihub2RlKXt2YXIgYXR0cmlidXRlcz17fTt2YXIgZWROb2Rlcz1ub2RlLmdldEVs ZW1lbnRzQnlUYWdOYW1lKCJFeHRlbmRlZERhdGEiKTtpZihlZE5vZGVzLmxlbmd0 aCl7YXR0cmlidXRlcz10aGlzLnBhcnNlRXh0ZW5kZWREYXRhKGVkTm9kZXNbMF0p O30KdmFyIGNoaWxkLGdyYW5kY2hpbGRyZW4sZ3JhbmRjaGlsZDt2YXIgY2hpbGRy ZW49bm9kZS5jaGlsZE5vZGVzO2Zvcih2YXIgaT0wLGxlbj1jaGlsZHJlbi5sZW5n dGg7aTxsZW47KytpKXtjaGlsZD1jaGlsZHJlbltpXTtpZihjaGlsZC5ub2RlVHlw ZT09MSl7Z3JhbmRjaGlsZHJlbj1jaGlsZC5jaGlsZE5vZGVzO2lmKGdyYW5kY2hp bGRyZW4ubGVuZ3RoPj0xJiZncmFuZGNoaWxkcmVuLmxlbmd0aDw9Myl7dmFyIGdy YW5kY2hpbGQ7c3dpdGNoKGdyYW5kY2hpbGRyZW4ubGVuZ3RoKXtjYXNlIDE6Z3Jh bmRjaGlsZD1ncmFuZGNoaWxkcmVuWzBdO2JyZWFrO2Nhc2UgMjp2YXIgYzE9Z3Jh bmRjaGlsZHJlblswXTt2YXIgYzI9Z3JhbmRjaGlsZHJlblsxXTtncmFuZGNoaWxk PShjMS5ub2RlVHlwZT09M3x8YzEubm9kZVR5cGU9PTQpP2MxOmMyO2JyZWFrO2Nh c2UgMzpkZWZhdWx0OmdyYW5kY2hpbGQ9Z3JhbmRjaGlsZHJlblsxXTticmVhazt9 CmlmKGdyYW5kY2hpbGQubm9kZVR5cGU9PTN8fGdyYW5kY2hpbGQubm9kZVR5cGU9 PTQpe3ZhciBuYW1lPShjaGlsZC5wcmVmaXgpP2NoaWxkLm5vZGVOYW1lLnNwbGl0 KCI6IilbMV06Y2hpbGQubm9kZU5hbWU7dmFyIHZhbHVlPU9wZW5MYXllcnMuVXRp bC5nZXRYbWxOb2RlVmFsdWUoZ3JhbmRjaGlsZCk7aWYodmFsdWUpe3ZhbHVlPXZh bHVlLnJlcGxhY2UodGhpcy5yZWdFeGVzLnRyaW1TcGFjZSwiIik7YXR0cmlidXRl c1tuYW1lXT12YWx1ZTt9fX19fQpyZXR1cm4gYXR0cmlidXRlczt9LHBhcnNlRXh0 ZW5kZWREYXRhOmZ1bmN0aW9uKG5vZGUpe3ZhciBhdHRyaWJ1dGVzPXt9O3ZhciBp LGxlbixkYXRhLGtleTt2YXIgZGF0YU5vZGVzPW5vZGUuZ2V0RWxlbWVudHNCeVRh Z05hbWUoIkRhdGEiKTtmb3IoaT0wLGxlbj1kYXRhTm9kZXMubGVuZ3RoO2k8bGVu O2krKyl7ZGF0YT1kYXRhTm9kZXNbaV07a2V5PWRhdGEuZ2V0QXR0cmlidXRlKCJu YW1lIik7dmFyIGVkPXt9O3ZhciB2YWx1ZU5vZGU9ZGF0YS5nZXRFbGVtZW50c0J5 VGFnTmFtZSgidmFsdWUiKTtpZih2YWx1ZU5vZGUubGVuZ3RoKXtlZFsndmFsdWUn XT10aGlzLmdldENoaWxkVmFsdWUodmFsdWVOb2RlWzBdKTt9CnZhciBuYW1lTm9k ZT1kYXRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXNwbGF5TmFtZSIpO2lmKG5h bWVOb2RlLmxlbmd0aCl7ZWRbJ2Rpc3BsYXlOYW1lJ109dGhpcy5nZXRDaGlsZFZh bHVlKG5hbWVOb2RlWzBdKTt9CmF0dHJpYnV0ZXNba2V5XT1lZDt9CnZhciBzaW1w bGVEYXRhTm9kZXM9bm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiU2ltcGxlRGF0 YSIpO2ZvcihpPTAsbGVuPXNpbXBsZURhdGFOb2Rlcy5sZW5ndGg7aTxsZW47aSsr KXt2YXIgZWQ9e307ZGF0YT1zaW1wbGVEYXRhTm9kZXNbaV07a2V5PWRhdGEuZ2V0 QXR0cmlidXRlKCJuYW1lIik7ZWRbJ3ZhbHVlJ109dGhpcy5nZXRDaGlsZFZhbHVl KGRhdGEpO2VkWydkaXNwbGF5TmFtZSddPWtleTthdHRyaWJ1dGVzW2tleV09ZWQ7 fQpyZXR1cm4gYXR0cmlidXRlczt9LHBhcnNlUHJvcGVydHk6ZnVuY3Rpb24oeG1s Tm9kZSxuYW1lc3BhY2UsdGFnTmFtZSl7dmFyIHZhbHVlO3ZhciBub2RlTGlzdD10 aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoeG1sTm9kZSxuYW1lc3BhY2UsdGFn TmFtZSk7dHJ5e3ZhbHVlPU9wZW5MYXllcnMuVXRpbC5nZXRYbWxOb2RlVmFsdWUo bm9kZUxpc3RbMF0pO31jYXRjaChlKXt2YWx1ZT1udWxsO30KcmV0dXJuIHZhbHVl O30sd3JpdGU6ZnVuY3Rpb24oZmVhdHVyZXMpe2lmKCEoT3BlbkxheWVycy5VdGls LmlzQXJyYXkoZmVhdHVyZXMpKSl7ZmVhdHVyZXM9W2ZlYXR1cmVzXTt9CnZhciBr bWw9dGhpcy5jcmVhdGVFbGVtZW50TlModGhpcy5rbWxucywia21sIik7dmFyIGZv bGRlcj10aGlzLmNyZWF0ZUZvbGRlclhNTCgpO2Zvcih2YXIgaT0wLGxlbj1mZWF0 dXJlcy5sZW5ndGg7aTxsZW47KytpKXtmb2xkZXIuYXBwZW5kQ2hpbGQodGhpcy5j cmVhdGVQbGFjZW1hcmtYTUwoZmVhdHVyZXNbaV0pKTt9CmttbC5hcHBlbmRDaGls ZChmb2xkZXIpO3JldHVybiBPcGVuTGF5ZXJzLkZvcm1hdC5YTUwucHJvdG90eXBl LndyaXRlLmFwcGx5KHRoaXMsW2ttbF0pO30sY3JlYXRlRm9sZGVyWE1MOmZ1bmN0 aW9uKCl7dmFyIGZvbGRlcj10aGlzLmNyZWF0ZUVsZW1lbnROUyh0aGlzLmttbG5z LCJGb2xkZXIiKTtpZih0aGlzLmZvbGRlcnNOYW1lKXt2YXIgZm9sZGVyTmFtZT10 aGlzLmNyZWF0ZUVsZW1lbnROUyh0aGlzLmttbG5zLCJuYW1lIik7dmFyIGZvbGRl ck5hbWVUZXh0PXRoaXMuY3JlYXRlVGV4dE5vZGUodGhpcy5mb2xkZXJzTmFtZSk7 Zm9sZGVyTmFtZS5hcHBlbmRDaGlsZChmb2xkZXJOYW1lVGV4dCk7Zm9sZGVyLmFw cGVuZENoaWxkKGZvbGRlck5hbWUpO30KaWYodGhpcy5mb2xkZXJzRGVzYyl7dmFy IGZvbGRlckRlc2M9dGhpcy5jcmVhdGVFbGVtZW50TlModGhpcy5rbWxucywiZGVz Y3JpcHRpb24iKTt2YXIgZm9sZGVyRGVzY1RleHQ9dGhpcy5jcmVhdGVUZXh0Tm9k ZSh0aGlzLmZvbGRlcnNEZXNjKTtmb2xkZXJEZXNjLmFwcGVuZENoaWxkKGZvbGRl ckRlc2NUZXh0KTtmb2xkZXIuYXBwZW5kQ2hpbGQoZm9sZGVyRGVzYyk7fQpyZXR1 cm4gZm9sZGVyO30sY3JlYXRlUGxhY2VtYXJrWE1MOmZ1bmN0aW9uKGZlYXR1cmUp e3ZhciBwbGFjZW1hcmtOYW1lPXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMua21s bnMsIm5hbWUiKTt2YXIgbmFtZT1mZWF0dXJlLnN0eWxlJiZmZWF0dXJlLnN0eWxl LmxhYmVsP2ZlYXR1cmUuc3R5bGUubGFiZWw6ZmVhdHVyZS5hdHRyaWJ1dGVzLm5h bWV8fGZlYXR1cmUuaWQ7cGxhY2VtYXJrTmFtZS5hcHBlbmRDaGlsZCh0aGlzLmNy ZWF0ZVRleHROb2RlKG5hbWUpKTt2YXIgcGxhY2VtYXJrRGVzYz10aGlzLmNyZWF0 ZUVsZW1lbnROUyh0aGlzLmttbG5zLCJkZXNjcmlwdGlvbiIpO3ZhciBkZXNjPWZl YXR1cmUuYXR0cmlidXRlcy5kZXNjcmlwdGlvbnx8dGhpcy5wbGFjZW1hcmtzRGVz YztwbGFjZW1hcmtEZXNjLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlVGV4dE5vZGUo ZGVzYykpO3ZhciBwbGFjZW1hcmtOb2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TKHRo aXMua21sbnMsIlBsYWNlbWFyayIpO2lmKGZlYXR1cmUuZmlkIT1udWxsKXtwbGFj ZW1hcmtOb2RlLnNldEF0dHJpYnV0ZSgiaWQiLGZlYXR1cmUuZmlkKTt9CnBsYWNl bWFya05vZGUuYXBwZW5kQ2hpbGQocGxhY2VtYXJrTmFtZSk7cGxhY2VtYXJrTm9k ZS5hcHBlbmRDaGlsZChwbGFjZW1hcmtEZXNjKTt2YXIgZ2VvbWV0cnlOb2RlPXRo aXMuYnVpbGRHZW9tZXRyeU5vZGUoZmVhdHVyZS5nZW9tZXRyeSk7cGxhY2VtYXJr Tm9kZS5hcHBlbmRDaGlsZChnZW9tZXRyeU5vZGUpO3JldHVybiBwbGFjZW1hcmtO b2RlO30sYnVpbGRHZW9tZXRyeU5vZGU6ZnVuY3Rpb24oZ2VvbWV0cnkpe3ZhciBj bGFzc05hbWU9Z2VvbWV0cnkuQ0xBU1NfTkFNRTt2YXIgdHlwZT1jbGFzc05hbWUu c3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpKzEpO3ZhciBidWls ZGVyPXRoaXMuYnVpbGRHZW9tZXRyeVt0eXBlLnRvTG93ZXJDYXNlKCldO3ZhciBu b2RlPW51bGw7aWYoYnVpbGRlcil7bm9kZT1idWlsZGVyLmFwcGx5KHRoaXMsW2dl b21ldHJ5XSk7fQpyZXR1cm4gbm9kZTt9LGJ1aWxkR2VvbWV0cnk6e3BvaW50OmZ1 bmN0aW9uKGdlb21ldHJ5KXt2YXIga21sPXRoaXMuY3JlYXRlRWxlbWVudE5TKHRo aXMua21sbnMsIlBvaW50Iik7a21sLmFwcGVuZENoaWxkKHRoaXMuYnVpbGRDb29y ZGluYXRlc05vZGUoZ2VvbWV0cnkpKTtyZXR1cm4ga21sO30sbXVsdGlwb2ludDpm dW5jdGlvbihnZW9tZXRyeSl7cmV0dXJuIHRoaXMuYnVpbGRHZW9tZXRyeS5jb2xs ZWN0aW9uLmFwcGx5KHRoaXMsW2dlb21ldHJ5XSk7fSxsaW5lc3RyaW5nOmZ1bmN0 aW9uKGdlb21ldHJ5KXt2YXIga21sPXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMu a21sbnMsIkxpbmVTdHJpbmciKTtrbWwuYXBwZW5kQ2hpbGQodGhpcy5idWlsZENv b3JkaW5hdGVzTm9kZShnZW9tZXRyeSkpO3JldHVybiBrbWw7fSxtdWx0aWxpbmVz dHJpbmc6ZnVuY3Rpb24oZ2VvbWV0cnkpe3JldHVybiB0aGlzLmJ1aWxkR2VvbWV0 cnkuY29sbGVjdGlvbi5hcHBseSh0aGlzLFtnZW9tZXRyeV0pO30sbGluZWFycmlu ZzpmdW5jdGlvbihnZW9tZXRyeSl7dmFyIGttbD10aGlzLmNyZWF0ZUVsZW1lbnRO Uyh0aGlzLmttbG5zLCJMaW5lYXJSaW5nIik7a21sLmFwcGVuZENoaWxkKHRoaXMu YnVpbGRDb29yZGluYXRlc05vZGUoZ2VvbWV0cnkpKTtyZXR1cm4ga21sO30scG9s eWdvbjpmdW5jdGlvbihnZW9tZXRyeSl7dmFyIGttbD10aGlzLmNyZWF0ZUVsZW1l bnROUyh0aGlzLmttbG5zLCJQb2x5Z29uIik7dmFyIHJpbmdzPWdlb21ldHJ5LmNv bXBvbmVudHM7dmFyIHJpbmdNZW1iZXIscmluZ0dlb20sdHlwZTtmb3IodmFyIGk9 MCxsZW49cmluZ3MubGVuZ3RoO2k8bGVuOysraSl7dHlwZT0oaT09MCk/Im91dGVy Qm91bmRhcnlJcyI6ImlubmVyQm91bmRhcnlJcyI7cmluZ01lbWJlcj10aGlzLmNy ZWF0ZUVsZW1lbnROUyh0aGlzLmttbG5zLHR5cGUpO3JpbmdHZW9tPXRoaXMuYnVp bGRHZW9tZXRyeS5saW5lYXJyaW5nLmFwcGx5KHRoaXMsW3JpbmdzW2ldXSk7cmlu Z01lbWJlci5hcHBlbmRDaGlsZChyaW5nR2VvbSk7a21sLmFwcGVuZENoaWxkKHJp bmdNZW1iZXIpO30KcmV0dXJuIGttbDt9LG11bHRpcG9seWdvbjpmdW5jdGlvbihn ZW9tZXRyeSl7cmV0dXJuIHRoaXMuYnVpbGRHZW9tZXRyeS5jb2xsZWN0aW9uLmFw cGx5KHRoaXMsW2dlb21ldHJ5XSk7fSxjb2xsZWN0aW9uOmZ1bmN0aW9uKGdlb21l dHJ5KXt2YXIga21sPXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMua21sbnMsIk11 bHRpR2VvbWV0cnkiKTt2YXIgY2hpbGQ7Zm9yKHZhciBpPTAsbGVuPWdlb21ldHJ5 LmNvbXBvbmVudHMubGVuZ3RoO2k8bGVuOysraSl7Y2hpbGQ9dGhpcy5idWlsZEdl b21ldHJ5Tm9kZS5hcHBseSh0aGlzLFtnZW9tZXRyeS5jb21wb25lbnRzW2ldXSk7 aWYoY2hpbGQpe2ttbC5hcHBlbmRDaGlsZChjaGlsZCk7fX0KcmV0dXJuIGttbDt9 fSxidWlsZENvb3JkaW5hdGVzTm9kZTpmdW5jdGlvbihnZW9tZXRyeSl7dmFyIGNv b3JkaW5hdGVzTm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROUyh0aGlzLmttbG5zLCJj b29yZGluYXRlcyIpO3ZhciBwYXRoO3ZhciBwb2ludHM9Z2VvbWV0cnkuY29tcG9u ZW50cztpZihwb2ludHMpe3ZhciBwb2ludDt2YXIgbnVtUG9pbnRzPXBvaW50cy5s ZW5ndGg7dmFyIHBhcnRzPW5ldyBBcnJheShudW1Qb2ludHMpO2Zvcih2YXIgaT0w O2k8bnVtUG9pbnRzOysraSl7cG9pbnQ9cG9pbnRzW2ldO3BhcnRzW2ldPXRoaXMu YnVpbGRDb29yZGluYXRlcyhwb2ludCk7fQpwYXRoPXBhcnRzLmpvaW4oIiAiKTt9 ZWxzZXtwYXRoPXRoaXMuYnVpbGRDb29yZGluYXRlcyhnZW9tZXRyeSk7fQp2YXIg dHh0Tm9kZT10aGlzLmNyZWF0ZVRleHROb2RlKHBhdGgpO2Nvb3JkaW5hdGVzTm9k ZS5hcHBlbmRDaGlsZCh0eHROb2RlKTtyZXR1cm4gY29vcmRpbmF0ZXNOb2RlO30s YnVpbGRDb29yZGluYXRlczpmdW5jdGlvbihwb2ludCl7aWYodGhpcy5pbnRlcm5h bFByb2plY3Rpb24mJnRoaXMuZXh0ZXJuYWxQcm9qZWN0aW9uKXtwb2ludD1wb2lu dC5jbG9uZSgpO3BvaW50LnRyYW5zZm9ybSh0aGlzLmludGVybmFsUHJvamVjdGlv bix0aGlzLmV4dGVybmFsUHJvamVjdGlvbik7fQpyZXR1cm4gcG9pbnQueCsiLCIr cG9pbnQueTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0LktNTCJ9KTtP cGVuTGF5ZXJzLlBvcHVwPU9wZW5MYXllcnMuQ2xhc3Moe2V2ZW50czpudWxsLGlk OiIiLGxvbmxhdDpudWxsLGRpdjpudWxsLGNvbnRlbnRTaXplOm51bGwsc2l6ZTpu dWxsLGNvbnRlbnRIVE1MOm51bGwsYmFja2dyb3VuZENvbG9yOiIiLG9wYWNpdHk6 IiIsYm9yZGVyOiIiLGNvbnRlbnREaXY6bnVsbCxncm91cERpdjpudWxsLGNsb3Nl RGl2Om51bGwsYXV0b1NpemU6ZmFsc2UsbWluU2l6ZTpudWxsLG1heFNpemU6bnVs bCxkaXNwbGF5Q2xhc3M6Im9sUG9wdXAiLGNvbnRlbnREaXNwbGF5Q2xhc3M6Im9s UG9wdXBDb250ZW50IixwYWRkaW5nOjAsZGlzYWJsZUZpcmVmb3hPdmVyZmxvd0hh Y2s6ZmFsc2UsZml4UGFkZGluZzpmdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLnBh ZGRpbmc9PSJudW1iZXIiKXt0aGlzLnBhZGRpbmc9bmV3IE9wZW5MYXllcnMuQm91 bmRzKHRoaXMucGFkZGluZyx0aGlzLnBhZGRpbmcsdGhpcy5wYWRkaW5nLHRoaXMu cGFkZGluZyk7fX0scGFuTWFwSWZPdXRPZlZpZXc6ZmFsc2Usa2VlcEluTWFwOmZh bHNlLGNsb3NlT25Nb3ZlOmZhbHNlLG1hcDpudWxsLGluaXRpYWxpemU6ZnVuY3Rp b24oaWQsbG9ubGF0LGNvbnRlbnRTaXplLGNvbnRlbnRIVE1MLGNsb3NlQm94LGNs b3NlQm94Q2FsbGJhY2spe2lmKGlkPT1udWxsKXtpZD1PcGVuTGF5ZXJzLlV0aWwu Y3JlYXRlVW5pcXVlSUQodGhpcy5DTEFTU19OQU1FKyJfIik7fQp0aGlzLmlkPWlk O3RoaXMubG9ubGF0PWxvbmxhdDt0aGlzLmNvbnRlbnRTaXplPShjb250ZW50U2l6 ZSE9bnVsbCk/Y29udGVudFNpemU6bmV3IE9wZW5MYXllcnMuU2l6ZShPcGVuTGF5 ZXJzLlBvcHVwLldJRFRILE9wZW5MYXllcnMuUG9wdXAuSEVJR0hUKTtpZihjb250 ZW50SFRNTCE9bnVsbCl7dGhpcy5jb250ZW50SFRNTD1jb250ZW50SFRNTDt9CnRo aXMuYmFja2dyb3VuZENvbG9yPU9wZW5MYXllcnMuUG9wdXAuQ09MT1I7dGhpcy5v cGFjaXR5PU9wZW5MYXllcnMuUG9wdXAuT1BBQ0lUWTt0aGlzLmJvcmRlcj1PcGVu TGF5ZXJzLlBvcHVwLkJPUkRFUjt0aGlzLmRpdj1PcGVuTGF5ZXJzLlV0aWwuY3Jl YXRlRGl2KHRoaXMuaWQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCJoaWRkZW4i KTt0aGlzLmRpdi5jbGFzc05hbWU9dGhpcy5kaXNwbGF5Q2xhc3M7dmFyIGdyb3Vw RGl2SWQ9dGhpcy5pZCsiX0dyb3VwRGl2Ijt0aGlzLmdyb3VwRGl2PU9wZW5MYXll cnMuVXRpbC5jcmVhdGVEaXYoZ3JvdXBEaXZJZCxudWxsLG51bGwsbnVsbCwicmVs YXRpdmUiLG51bGwsImhpZGRlbiIpO3ZhciBpZD10aGlzLmRpdi5pZCsiX2NvbnRl bnREaXYiO3RoaXMuY29udGVudERpdj1PcGVuTGF5ZXJzLlV0aWwuY3JlYXRlRGl2 KGlkLG51bGwsdGhpcy5jb250ZW50U2l6ZS5jbG9uZSgpLG51bGwsInJlbGF0aXZl Iik7dGhpcy5jb250ZW50RGl2LmNsYXNzTmFtZT10aGlzLmNvbnRlbnREaXNwbGF5 Q2xhc3M7dGhpcy5ncm91cERpdi5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnREaXYp O3RoaXMuZGl2LmFwcGVuZENoaWxkKHRoaXMuZ3JvdXBEaXYpO2lmKGNsb3NlQm94 KXt0aGlzLmFkZENsb3NlQm94KGNsb3NlQm94Q2FsbGJhY2spO30KdGhpcy5yZWdp c3RlckV2ZW50cygpO30sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuaWQ9bnVsbDt0 aGlzLmxvbmxhdD1udWxsO3RoaXMuc2l6ZT1udWxsO3RoaXMuY29udGVudEhUTUw9 bnVsbDt0aGlzLmJhY2tncm91bmRDb2xvcj1udWxsO3RoaXMub3BhY2l0eT1udWxs O3RoaXMuYm9yZGVyPW51bGw7aWYodGhpcy5jbG9zZU9uTW92ZSYmdGhpcy5tYXAp e3RoaXMubWFwLmV2ZW50cy51bnJlZ2lzdGVyKCJtb3Zlc3RhcnQiLHRoaXMsdGhp cy5oaWRlKTt9CnRoaXMuZXZlbnRzLmRlc3Ryb3koKTt0aGlzLmV2ZW50cz1udWxs O2lmKHRoaXMuY2xvc2VEaXYpe09wZW5MYXllcnMuRXZlbnQuc3RvcE9ic2Vydmlu Z0VsZW1lbnQodGhpcy5jbG9zZURpdik7dGhpcy5ncm91cERpdi5yZW1vdmVDaGls ZCh0aGlzLmNsb3NlRGl2KTt9CnRoaXMuY2xvc2VEaXY9bnVsbDt0aGlzLmRpdi5y ZW1vdmVDaGlsZCh0aGlzLmdyb3VwRGl2KTt0aGlzLmdyb3VwRGl2PW51bGw7aWYo dGhpcy5tYXAhPW51bGwpe3RoaXMubWFwLnJlbW92ZVBvcHVwKHRoaXMpO30KdGhp cy5tYXA9bnVsbDt0aGlzLmRpdj1udWxsO3RoaXMuYXV0b1NpemU9bnVsbDt0aGlz Lm1pblNpemU9bnVsbDt0aGlzLm1heFNpemU9bnVsbDt0aGlzLnBhZGRpbmc9bnVs bDt0aGlzLnBhbk1hcElmT3V0T2ZWaWV3PW51bGw7fSxkcmF3OmZ1bmN0aW9uKHB4 KXtpZihweD09bnVsbCl7aWYoKHRoaXMubG9ubGF0IT1udWxsKSYmKHRoaXMubWFw IT1udWxsKSl7cHg9dGhpcy5tYXAuZ2V0TGF5ZXJQeEZyb21Mb25MYXQodGhpcy5s b25sYXQpO319CmlmKHRoaXMuY2xvc2VPbk1vdmUpe3RoaXMubWFwLmV2ZW50cy5y ZWdpc3RlcigibW92ZXN0YXJ0Iix0aGlzLHRoaXMuaGlkZSk7fQppZighdGhpcy5k aXNhYmxlRmlyZWZveE92ZXJmbG93SGFjayYmT3BlbkxheWVycy5CUk9XU0VSX05B TUU9PSdmaXJlZm94Jyl7dGhpcy5tYXAuZXZlbnRzLnJlZ2lzdGVyKCJtb3Zlc3Rh cnQiLHRoaXMsZnVuY3Rpb24oKXt2YXIgc3R5bGU9ZG9jdW1lbnQuZGVmYXVsdFZp ZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmNvbnRlbnREaXYsbnVsbCk7dmFyIGN1 cnJlbnRPdmVyZmxvdz1zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCJvdmVyZmxvdyIp O2lmKGN1cnJlbnRPdmVyZmxvdyE9ImhpZGRlbiIpe3RoaXMuY29udGVudERpdi5f b2xkT3ZlcmZsb3c9Y3VycmVudE92ZXJmbG93O3RoaXMuY29udGVudERpdi5zdHls ZS5vdmVyZmxvdz0iaGlkZGVuIjt9fSk7dGhpcy5tYXAuZXZlbnRzLnJlZ2lzdGVy KCJtb3ZlZW5kIix0aGlzLGZ1bmN0aW9uKCl7dmFyIG9sZE92ZXJmbG93PXRoaXMu Y29udGVudERpdi5fb2xkT3ZlcmZsb3c7aWYob2xkT3ZlcmZsb3cpe3RoaXMuY29u dGVudERpdi5zdHlsZS5vdmVyZmxvdz1vbGRPdmVyZmxvdzt0aGlzLmNvbnRlbnRE aXYuX29sZE92ZXJmbG93PW51bGw7fX0pO30KdGhpcy5tb3ZlVG8ocHgpO2lmKCF0 aGlzLmF1dG9TaXplJiYhdGhpcy5zaXplKXt0aGlzLnNldFNpemUodGhpcy5jb250 ZW50U2l6ZSk7fQp0aGlzLnNldEJhY2tncm91bmRDb2xvcigpO3RoaXMuc2V0T3Bh Y2l0eSgpO3RoaXMuc2V0Qm9yZGVyKCk7dGhpcy5zZXRDb250ZW50SFRNTCgpO2lm KHRoaXMucGFuTWFwSWZPdXRPZlZpZXcpe3RoaXMucGFuSW50b1ZpZXcoKTt9CnJl dHVybiB0aGlzLmRpdjt9LHVwZGF0ZVBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoKHRo aXMubG9ubGF0KSYmKHRoaXMubWFwKSl7dmFyIHB4PXRoaXMubWFwLmdldExheWVy UHhGcm9tTG9uTGF0KHRoaXMubG9ubGF0KTtpZihweCl7dGhpcy5tb3ZlVG8ocHgp O319fSxtb3ZlVG86ZnVuY3Rpb24ocHgpe2lmKChweCE9bnVsbCkmJih0aGlzLmRp diE9bnVsbCkpe3RoaXMuZGl2LnN0eWxlLmxlZnQ9cHgueCsicHgiO3RoaXMuZGl2 LnN0eWxlLnRvcD1weC55KyJweCI7fX0sdmlzaWJsZTpmdW5jdGlvbigpe3JldHVy biBPcGVuTGF5ZXJzLkVsZW1lbnQudmlzaWJsZSh0aGlzLmRpdik7fSx0b2dnbGU6 ZnVuY3Rpb24oKXtpZih0aGlzLnZpc2libGUoKSl7dGhpcy5oaWRlKCk7fWVsc2V7 dGhpcy5zaG93KCk7fX0sc2hvdzpmdW5jdGlvbigpe3RoaXMuZGl2LnN0eWxlLmRp c3BsYXk9Jyc7aWYodGhpcy5wYW5NYXBJZk91dE9mVmlldyl7dGhpcy5wYW5JbnRv VmlldygpO319LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLmRpdi5zdHlsZS5kaXNwbGF5 PSdub25lJzt9LHNldFNpemU6ZnVuY3Rpb24oY29udGVudFNpemUpe3RoaXMuc2l6 ZT1jb250ZW50U2l6ZS5jbG9uZSgpO3ZhciBjb250ZW50RGl2UGFkZGluZz10aGlz LmdldENvbnRlbnREaXZQYWRkaW5nKCk7dmFyIHdQYWRkaW5nPWNvbnRlbnREaXZQ YWRkaW5nLmxlZnQrY29udGVudERpdlBhZGRpbmcucmlnaHQ7dmFyIGhQYWRkaW5n PWNvbnRlbnREaXZQYWRkaW5nLnRvcCtjb250ZW50RGl2UGFkZGluZy5ib3R0b207 dGhpcy5maXhQYWRkaW5nKCk7d1BhZGRpbmcrPXRoaXMucGFkZGluZy5sZWZ0K3Ro aXMucGFkZGluZy5yaWdodDtoUGFkZGluZys9dGhpcy5wYWRkaW5nLnRvcCt0aGlz LnBhZGRpbmcuYm90dG9tO2lmKHRoaXMuY2xvc2VEaXYpe3ZhciBjbG9zZURpdldp ZHRoPXBhcnNlSW50KHRoaXMuY2xvc2VEaXYuc3R5bGUud2lkdGgpO3dQYWRkaW5n Kz1jbG9zZURpdldpZHRoK2NvbnRlbnREaXZQYWRkaW5nLnJpZ2h0O30KdGhpcy5z aXplLncrPXdQYWRkaW5nO3RoaXMuc2l6ZS5oKz1oUGFkZGluZztpZihPcGVuTGF5 ZXJzLkJST1dTRVJfTkFNRT09Im1zaWUiKXt0aGlzLmNvbnRlbnRTaXplLncrPWNv bnRlbnREaXZQYWRkaW5nLmxlZnQrY29udGVudERpdlBhZGRpbmcucmlnaHQ7dGhp cy5jb250ZW50U2l6ZS5oKz1jb250ZW50RGl2UGFkZGluZy5ib3R0b20rY29udGVu dERpdlBhZGRpbmcudG9wO30KaWYodGhpcy5kaXYhPW51bGwpe3RoaXMuZGl2LnN0 eWxlLndpZHRoPXRoaXMuc2l6ZS53KyJweCI7dGhpcy5kaXYuc3R5bGUuaGVpZ2h0 PXRoaXMuc2l6ZS5oKyJweCI7fQppZih0aGlzLmNvbnRlbnREaXYhPW51bGwpe3Ro aXMuY29udGVudERpdi5zdHlsZS53aWR0aD1jb250ZW50U2l6ZS53KyJweCI7dGhp cy5jb250ZW50RGl2LnN0eWxlLmhlaWdodD1jb250ZW50U2l6ZS5oKyJweCI7fX0s dXBkYXRlU2l6ZTpmdW5jdGlvbigpe3ZhciBwcmVwYXJlZEhUTUw9IjxkaXYgY2xh c3M9JyIrdGhpcy5jb250ZW50RGlzcGxheUNsYXNzKyInPiIrCnRoaXMuY29udGVu dERpdi5pbm5lckhUTUwrIjwvZGl2PiI7dmFyIGNvbnRhaW5lckVsZW1lbnQ9KHRo aXMubWFwKT90aGlzLm1hcC5sYXllckNvbnRhaW5lckRpdjpkb2N1bWVudC5ib2R5 O3ZhciByZWFsU2l6ZT1PcGVuTGF5ZXJzLlV0aWwuZ2V0UmVuZGVyZWREaW1lbnNp b25zKHByZXBhcmVkSFRNTCxudWxsLHtkaXNwbGF5Q2xhc3M6dGhpcy5kaXNwbGF5 Q2xhc3MsY29udGFpbmVyRWxlbWVudDpjb250YWluZXJFbGVtZW50fSk7dmFyIHNh ZmVTaXplPXRoaXMuZ2V0U2FmZUNvbnRlbnRTaXplKHJlYWxTaXplKTt2YXIgbmV3 U2l6ZT1udWxsO2lmKHNhZmVTaXplLmVxdWFscyhyZWFsU2l6ZSkpe25ld1NpemU9 cmVhbFNpemU7fWVsc2V7dmFyIGZpeGVkU2l6ZT1uZXcgT3BlbkxheWVycy5TaXpl KCk7Zml4ZWRTaXplLnc9KHNhZmVTaXplLnc8cmVhbFNpemUudyk/c2FmZVNpemUu dzpudWxsO2ZpeGVkU2l6ZS5oPShzYWZlU2l6ZS5oPHJlYWxTaXplLmgpP3NhZmVT aXplLmg6bnVsbDtpZihmaXhlZFNpemUudyYmZml4ZWRTaXplLmgpe25ld1NpemU9 c2FmZVNpemU7fWVsc2V7dmFyIGNsaXBwZWRTaXplPU9wZW5MYXllcnMuVXRpbC5n ZXRSZW5kZXJlZERpbWVuc2lvbnMocHJlcGFyZWRIVE1MLGZpeGVkU2l6ZSx7ZGlz cGxheUNsYXNzOnRoaXMuY29udGVudERpc3BsYXlDbGFzcyxjb250YWluZXJFbGVt ZW50OmNvbnRhaW5lckVsZW1lbnR9KTt2YXIgY3VycmVudE92ZXJmbG93PU9wZW5M YXllcnMuRWxlbWVudC5nZXRTdHlsZSh0aGlzLmNvbnRlbnREaXYsIm92ZXJmbG93 Iik7aWYoKGN1cnJlbnRPdmVyZmxvdyE9ImhpZGRlbiIpJiYoY2xpcHBlZFNpemUu ZXF1YWxzKHNhZmVTaXplKSkpe3ZhciBzY3JvbGxCYXI9T3BlbkxheWVycy5VdGls LmdldFNjcm9sbGJhcldpZHRoKCk7aWYoZml4ZWRTaXplLncpe2NsaXBwZWRTaXpl LmgrPXNjcm9sbEJhcjt9ZWxzZXtjbGlwcGVkU2l6ZS53Kz1zY3JvbGxCYXI7fX0K bmV3U2l6ZT10aGlzLmdldFNhZmVDb250ZW50U2l6ZShjbGlwcGVkU2l6ZSk7fX0K dGhpcy5zZXRTaXplKG5ld1NpemUpO30sc2V0QmFja2dyb3VuZENvbG9yOmZ1bmN0 aW9uKGNvbG9yKXtpZihjb2xvciE9dW5kZWZpbmVkKXt0aGlzLmJhY2tncm91bmRD b2xvcj1jb2xvcjt9CmlmKHRoaXMuZGl2IT1udWxsKXt0aGlzLmRpdi5zdHlsZS5i YWNrZ3JvdW5kQ29sb3I9dGhpcy5iYWNrZ3JvdW5kQ29sb3I7fX0sc2V0T3BhY2l0 eTpmdW5jdGlvbihvcGFjaXR5KXtpZihvcGFjaXR5IT11bmRlZmluZWQpe3RoaXMu b3BhY2l0eT1vcGFjaXR5O30KaWYodGhpcy5kaXYhPW51bGwpe3RoaXMuZGl2LnN0 eWxlLm9wYWNpdHk9dGhpcy5vcGFjaXR5O3RoaXMuZGl2LnN0eWxlLmZpbHRlcj0n YWxwaGEob3BhY2l0eT0nK3RoaXMub3BhY2l0eSoxMDArJyknO319LHNldEJvcmRl cjpmdW5jdGlvbihib3JkZXIpe2lmKGJvcmRlciE9dW5kZWZpbmVkKXt0aGlzLmJv cmRlcj1ib3JkZXI7fQppZih0aGlzLmRpdiE9bnVsbCl7dGhpcy5kaXYuc3R5bGUu Ym9yZGVyPXRoaXMuYm9yZGVyO319LHNldENvbnRlbnRIVE1MOmZ1bmN0aW9uKGNv bnRlbnRIVE1MKXtpZihjb250ZW50SFRNTCE9bnVsbCl7dGhpcy5jb250ZW50SFRN TD1jb250ZW50SFRNTDt9CmlmKCh0aGlzLmNvbnRlbnREaXYhPW51bGwpJiYodGhp cy5jb250ZW50SFRNTCE9bnVsbCkmJih0aGlzLmNvbnRlbnRIVE1MIT10aGlzLmNv bnRlbnREaXYuaW5uZXJIVE1MKSl7dGhpcy5jb250ZW50RGl2LmlubmVySFRNTD10 aGlzLmNvbnRlbnRIVE1MO2lmKHRoaXMuYXV0b1NpemUpe3RoaXMucmVnaXN0ZXJJ bWFnZUxpc3RlbmVycygpO3RoaXMudXBkYXRlU2l6ZSgpO319fSxyZWdpc3Rlcklt YWdlTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dmFyIG9uSW1nTG9hZD1mdW5jdGlvbigp e3RoaXMucG9wdXAudXBkYXRlU2l6ZSgpO2lmKHRoaXMucG9wdXAudmlzaWJsZSgp JiZ0aGlzLnBvcHVwLnBhbk1hcElmT3V0T2ZWaWV3KXt0aGlzLnBvcHVwLnBhbklu dG9WaWV3KCk7fQpPcGVuTGF5ZXJzLkV2ZW50LnN0b3BPYnNlcnZpbmcodGhpcy5p bWcsImxvYWQiLHRoaXMuaW1nLl9vbkltYWdlTG9hZCk7fTt2YXIgaW1hZ2VzPXRo aXMuY29udGVudERpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW1nIik7Zm9yKHZh ciBpPTAsbGVuPWltYWdlcy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgaW1nPWltYWdl c1tpXTtpZihpbWcud2lkdGg9PTB8fGltZy5oZWlnaHQ9PTApe3ZhciBjb250ZXh0 PXsncG9wdXAnOnRoaXMsJ2ltZyc6aW1nfTtpbWcuX29uSW1nTG9hZD1PcGVuTGF5 ZXJzLkZ1bmN0aW9uLmJpbmQob25JbWdMb2FkLGNvbnRleHQpO09wZW5MYXllcnMu RXZlbnQub2JzZXJ2ZShpbWcsJ2xvYWQnLGltZy5fb25JbWdMb2FkKTt9fX0sZ2V0 U2FmZUNvbnRlbnRTaXplOmZ1bmN0aW9uKHNpemUpe3ZhciBzYWZlQ29udGVudFNp emU9c2l6ZS5jbG9uZSgpO3ZhciBjb250ZW50RGl2UGFkZGluZz10aGlzLmdldENv bnRlbnREaXZQYWRkaW5nKCk7dmFyIHdQYWRkaW5nPWNvbnRlbnREaXZQYWRkaW5n LmxlZnQrY29udGVudERpdlBhZGRpbmcucmlnaHQ7dmFyIGhQYWRkaW5nPWNvbnRl bnREaXZQYWRkaW5nLnRvcCtjb250ZW50RGl2UGFkZGluZy5ib3R0b207dGhpcy5m aXhQYWRkaW5nKCk7d1BhZGRpbmcrPXRoaXMucGFkZGluZy5sZWZ0K3RoaXMucGFk ZGluZy5yaWdodDtoUGFkZGluZys9dGhpcy5wYWRkaW5nLnRvcCt0aGlzLnBhZGRp bmcuYm90dG9tO2lmKHRoaXMuY2xvc2VEaXYpe3ZhciBjbG9zZURpdldpZHRoPXBh cnNlSW50KHRoaXMuY2xvc2VEaXYuc3R5bGUud2lkdGgpO3dQYWRkaW5nKz1jbG9z ZURpdldpZHRoK2NvbnRlbnREaXZQYWRkaW5nLnJpZ2h0O30KaWYodGhpcy5taW5T aXplKXtzYWZlQ29udGVudFNpemUudz1NYXRoLm1heChzYWZlQ29udGVudFNpemUu dywodGhpcy5taW5TaXplLnctd1BhZGRpbmcpKTtzYWZlQ29udGVudFNpemUuaD1N YXRoLm1heChzYWZlQ29udGVudFNpemUuaCwodGhpcy5taW5TaXplLmgtaFBhZGRp bmcpKTt9CmlmKHRoaXMubWF4U2l6ZSl7c2FmZUNvbnRlbnRTaXplLnc9TWF0aC5t aW4oc2FmZUNvbnRlbnRTaXplLncsKHRoaXMubWF4U2l6ZS53LXdQYWRkaW5nKSk7 c2FmZUNvbnRlbnRTaXplLmg9TWF0aC5taW4oc2FmZUNvbnRlbnRTaXplLmgsKHRo aXMubWF4U2l6ZS5oLWhQYWRkaW5nKSk7fQppZih0aGlzLm1hcCYmdGhpcy5tYXAu c2l6ZSl7dmFyIGV4dHJhWD0wLGV4dHJhWT0wO2lmKHRoaXMua2VlcEluTWFwJiYh dGhpcy5wYW5NYXBJZk91dE9mVmlldyl7dmFyIHB4PXRoaXMubWFwLmdldFBpeGVs RnJvbUxvbkxhdCh0aGlzLmxvbmxhdCk7c3dpdGNoKHRoaXMucmVsYXRpdmVQb3Np dGlvbil7Y2FzZSJ0ciI6ZXh0cmFYPXB4Lng7ZXh0cmFZPXRoaXMubWFwLnNpemUu aC1weC55O2JyZWFrO2Nhc2UidGwiOmV4dHJhWD10aGlzLm1hcC5zaXplLnctcHgu eDtleHRyYVk9dGhpcy5tYXAuc2l6ZS5oLXB4Lnk7YnJlYWs7Y2FzZSJibCI6ZXh0 cmFYPXRoaXMubWFwLnNpemUudy1weC54O2V4dHJhWT1weC55O2JyZWFrO2Nhc2Ui YnIiOmV4dHJhWD1weC54O2V4dHJhWT1weC55O2JyZWFrO2RlZmF1bHQ6ZXh0cmFY PXB4Lng7ZXh0cmFZPXRoaXMubWFwLnNpemUuaC1weC55O2JyZWFrO319CnZhciBt YXhZPXRoaXMubWFwLnNpemUuaC0KdGhpcy5tYXAucGFkZGluZ0ZvclBvcHVwcy50 b3AtCnRoaXMubWFwLnBhZGRpbmdGb3JQb3B1cHMuYm90dG9tLQpoUGFkZGluZy1l eHRyYVk7dmFyIG1heFg9dGhpcy5tYXAuc2l6ZS53LQp0aGlzLm1hcC5wYWRkaW5n Rm9yUG9wdXBzLmxlZnQtCnRoaXMubWFwLnBhZGRpbmdGb3JQb3B1cHMucmlnaHQt CndQYWRkaW5nLWV4dHJhWDtzYWZlQ29udGVudFNpemUudz1NYXRoLm1pbihzYWZl Q29udGVudFNpemUudyxtYXhYKTtzYWZlQ29udGVudFNpemUuaD1NYXRoLm1pbihz YWZlQ29udGVudFNpemUuaCxtYXhZKTt9CnJldHVybiBzYWZlQ29udGVudFNpemU7 fSxnZXRDb250ZW50RGl2UGFkZGluZzpmdW5jdGlvbigpe3ZhciBjb250ZW50RGl2 UGFkZGluZz10aGlzLl9jb250ZW50RGl2UGFkZGluZztpZighY29udGVudERpdlBh ZGRpbmcpe2lmKHRoaXMuZGl2LnBhcmVudE5vZGU9PW51bGwpe3RoaXMuZGl2LnN0 eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhp cy5kaXYpO30KY29udGVudERpdlBhZGRpbmc9bmV3IE9wZW5MYXllcnMuQm91bmRz KE9wZW5MYXllcnMuRWxlbWVudC5nZXRTdHlsZSh0aGlzLmNvbnRlbnREaXYsInBh ZGRpbmctbGVmdCIpLE9wZW5MYXllcnMuRWxlbWVudC5nZXRTdHlsZSh0aGlzLmNv bnRlbnREaXYsInBhZGRpbmctYm90dG9tIiksT3BlbkxheWVycy5FbGVtZW50Lmdl dFN0eWxlKHRoaXMuY29udGVudERpdiwicGFkZGluZy1yaWdodCIpLE9wZW5MYXll cnMuRWxlbWVudC5nZXRTdHlsZSh0aGlzLmNvbnRlbnREaXYsInBhZGRpbmctdG9w IikpO3RoaXMuX2NvbnRlbnREaXZQYWRkaW5nPWNvbnRlbnREaXZQYWRkaW5nO2lm KHRoaXMuZGl2LnBhcmVudE5vZGU9PWRvY3VtZW50LmJvZHkpe2RvY3VtZW50LmJv ZHkucmVtb3ZlQ2hpbGQodGhpcy5kaXYpO3RoaXMuZGl2LnN0eWxlLmRpc3BsYXk9 IiI7fX0KcmV0dXJuIGNvbnRlbnREaXZQYWRkaW5nO30sYWRkQ2xvc2VCb3g6ZnVu Y3Rpb24oY2FsbGJhY2spe3RoaXMuY2xvc2VEaXY9T3BlbkxheWVycy5VdGlsLmNy ZWF0ZURpdih0aGlzLmlkKyJfY2xvc2UiLG51bGwsbmV3IE9wZW5MYXllcnMuU2l6 ZSgxNywxNykpO3RoaXMuY2xvc2VEaXYuY2xhc3NOYW1lPSJvbFBvcHVwQ2xvc2VC b3giO3ZhciBjb250ZW50RGl2UGFkZGluZz10aGlzLmdldENvbnRlbnREaXZQYWRk aW5nKCk7dGhpcy5jbG9zZURpdi5zdHlsZS5yaWdodD1jb250ZW50RGl2UGFkZGlu Zy5yaWdodCsicHgiO3RoaXMuY2xvc2VEaXYuc3R5bGUudG9wPWNvbnRlbnREaXZQ YWRkaW5nLnRvcCsicHgiO3RoaXMuZ3JvdXBEaXYuYXBwZW5kQ2hpbGQodGhpcy5j bG9zZURpdik7dmFyIGNsb3NlUG9wdXA9Y2FsbGJhY2t8fGZ1bmN0aW9uKGUpe3Ro aXMuaGlkZSgpO09wZW5MYXllcnMuRXZlbnQuc3RvcChlKTt9O09wZW5MYXllcnMu RXZlbnQub2JzZXJ2ZSh0aGlzLmNsb3NlRGl2LCJ0b3VjaGVuZCIsT3BlbkxheWVy cy5GdW5jdGlvbi5iaW5kQXNFdmVudExpc3RlbmVyKGNsb3NlUG9wdXAsdGhpcykp O09wZW5MYXllcnMuRXZlbnQub2JzZXJ2ZSh0aGlzLmNsb3NlRGl2LCJjbGljayIs T3BlbkxheWVycy5GdW5jdGlvbi5iaW5kQXNFdmVudExpc3RlbmVyKGNsb3NlUG9w dXAsdGhpcykpO30scGFuSW50b1ZpZXc6ZnVuY3Rpb24oKXt2YXIgbWFwU2l6ZT10 aGlzLm1hcC5nZXRTaXplKCk7dmFyIG9yaWdUTD10aGlzLm1hcC5nZXRWaWV3UG9y dFB4RnJvbUxheWVyUHgobmV3IE9wZW5MYXllcnMuUGl4ZWwocGFyc2VJbnQodGhp cy5kaXYuc3R5bGUubGVmdCkscGFyc2VJbnQodGhpcy5kaXYuc3R5bGUudG9wKSkp O3ZhciBuZXdUTD1vcmlnVEwuY2xvbmUoKTtpZihvcmlnVEwueDx0aGlzLm1hcC5w YWRkaW5nRm9yUG9wdXBzLmxlZnQpe25ld1RMLng9dGhpcy5tYXAucGFkZGluZ0Zv clBvcHVwcy5sZWZ0O31lbHNlCmlmKChvcmlnVEwueCt0aGlzLnNpemUudyk+KG1h cFNpemUudy10aGlzLm1hcC5wYWRkaW5nRm9yUG9wdXBzLnJpZ2h0KSl7bmV3VEwu eD1tYXBTaXplLnctdGhpcy5tYXAucGFkZGluZ0ZvclBvcHVwcy5yaWdodC10aGlz LnNpemUudzt9CmlmKG9yaWdUTC55PHRoaXMubWFwLnBhZGRpbmdGb3JQb3B1cHMu dG9wKXtuZXdUTC55PXRoaXMubWFwLnBhZGRpbmdGb3JQb3B1cHMudG9wO31lbHNl CmlmKChvcmlnVEwueSt0aGlzLnNpemUuaCk+KG1hcFNpemUuaC10aGlzLm1hcC5w YWRkaW5nRm9yUG9wdXBzLmJvdHRvbSkpe25ld1RMLnk9bWFwU2l6ZS5oLXRoaXMu bWFwLnBhZGRpbmdGb3JQb3B1cHMuYm90dG9tLXRoaXMuc2l6ZS5oO30KdmFyIGR4 PW9yaWdUTC54LW5ld1RMLng7dmFyIGR5PW9yaWdUTC55LW5ld1RMLnk7dGhpcy5t YXAucGFuKGR4LGR5KTt9LHJlZ2lzdGVyRXZlbnRzOmZ1bmN0aW9uKCl7dGhpcy5l dmVudHM9bmV3IE9wZW5MYXllcnMuRXZlbnRzKHRoaXMsdGhpcy5kaXYsbnVsbCx0 cnVlKTtmdW5jdGlvbiBvblRvdWNoc3RhcnQoZXZ0KXtPcGVuTGF5ZXJzLkV2ZW50 LnN0b3AoZXZ0LHRydWUpO30KdGhpcy5ldmVudHMub24oeyJtb3VzZWRvd24iOnRo aXMub25tb3VzZWRvd24sIm1vdXNlbW92ZSI6dGhpcy5vbm1vdXNlbW92ZSwibW91 c2V1cCI6dGhpcy5vbm1vdXNldXAsImNsaWNrIjp0aGlzLm9uY2xpY2ssIm1vdXNl b3V0Ijp0aGlzLm9ubW91c2VvdXQsImRibGNsaWNrIjp0aGlzLm9uZGJsY2xpY2ss InRvdWNoc3RhcnQiOm9uVG91Y2hzdGFydCxzY29wZTp0aGlzfSk7fSxvbm1vdXNl ZG93bjpmdW5jdGlvbihldnQpe3RoaXMubW91c2Vkb3duPXRydWU7T3BlbkxheWVy cy5FdmVudC5zdG9wKGV2dCx0cnVlKTt9LG9ubW91c2Vtb3ZlOmZ1bmN0aW9uKGV2 dCl7aWYodGhpcy5tb3VzZWRvd24pe09wZW5MYXllcnMuRXZlbnQuc3RvcChldnQs dHJ1ZSk7fX0sb25tb3VzZXVwOmZ1bmN0aW9uKGV2dCl7aWYodGhpcy5tb3VzZWRv d24pe3RoaXMubW91c2Vkb3duPWZhbHNlO09wZW5MYXllcnMuRXZlbnQuc3RvcChl dnQsdHJ1ZSk7fX0sb25jbGljazpmdW5jdGlvbihldnQpe09wZW5MYXllcnMuRXZl bnQuc3RvcChldnQsdHJ1ZSk7fSxvbm1vdXNlb3V0OmZ1bmN0aW9uKGV2dCl7dGhp cy5tb3VzZWRvd249ZmFsc2U7fSxvbmRibGNsaWNrOmZ1bmN0aW9uKGV2dCl7T3Bl bkxheWVycy5FdmVudC5zdG9wKGV2dCx0cnVlKTt9LENMQVNTX05BTUU6Ik9wZW5M YXllcnMuUG9wdXAifSk7T3BlbkxheWVycy5Qb3B1cC5XSURUSD0yMDA7T3Blbkxh eWVycy5Qb3B1cC5IRUlHSFQ9MjAwO09wZW5MYXllcnMuUG9wdXAuQ09MT1I9Indo aXRlIjtPcGVuTGF5ZXJzLlBvcHVwLk9QQUNJVFk9MTtPcGVuTGF5ZXJzLlBvcHVw LkJPUkRFUj0iMHB4IjtPcGVuTGF5ZXJzLlBvcHVwLkFuY2hvcmVkPU9wZW5MYXll cnMuQ2xhc3MoT3BlbkxheWVycy5Qb3B1cCx7cmVsYXRpdmVQb3NpdGlvbjpudWxs LGtlZXBJbk1hcDp0cnVlLGFuY2hvcjpudWxsLGluaXRpYWxpemU6ZnVuY3Rpb24o aWQsbG9ubGF0LGNvbnRlbnRTaXplLGNvbnRlbnRIVE1MLGFuY2hvcixjbG9zZUJv eCxjbG9zZUJveENhbGxiYWNrKXt2YXIgbmV3QXJndW1lbnRzPVtpZCxsb25sYXQs Y29udGVudFNpemUsY29udGVudEhUTUwsY2xvc2VCb3gsY2xvc2VCb3hDYWxsYmFj a107T3BlbkxheWVycy5Qb3B1cC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0 aGlzLG5ld0FyZ3VtZW50cyk7dGhpcy5hbmNob3I9KGFuY2hvciE9bnVsbCk/YW5j aG9yOntzaXplOm5ldyBPcGVuTGF5ZXJzLlNpemUoMCwwKSxvZmZzZXQ6bmV3IE9w ZW5MYXllcnMuUGl4ZWwoMCwwKX07fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5h bmNob3I9bnVsbDt0aGlzLnJlbGF0aXZlUG9zaXRpb249bnVsbDtPcGVuTGF5ZXJz LlBvcHVwLnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9 LHNob3c6ZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7T3BlbkxheWVy cy5Qb3B1cC5wcm90b3R5cGUuc2hvdy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fSxt b3ZlVG86ZnVuY3Rpb24ocHgpe3ZhciBvbGRSZWxhdGl2ZVBvc2l0aW9uPXRoaXMu cmVsYXRpdmVQb3NpdGlvbjt0aGlzLnJlbGF0aXZlUG9zaXRpb249dGhpcy5jYWxj dWxhdGVSZWxhdGl2ZVBvc2l0aW9uKHB4KTt2YXIgbmV3UHg9dGhpcy5jYWxjdWxh dGVOZXdQeChweCk7dmFyIG5ld0FyZ3VtZW50cz1uZXcgQXJyYXkobmV3UHgpO09w ZW5MYXllcnMuUG9wdXAucHJvdG90eXBlLm1vdmVUby5hcHBseSh0aGlzLG5ld0Fy Z3VtZW50cyk7aWYodGhpcy5yZWxhdGl2ZVBvc2l0aW9uIT1vbGRSZWxhdGl2ZVBv c2l0aW9uKXt0aGlzLnVwZGF0ZVJlbGF0aXZlUG9zaXRpb24oKTt9fSxzZXRTaXpl OmZ1bmN0aW9uKGNvbnRlbnRTaXplKXtPcGVuTGF5ZXJzLlBvcHVwLnByb3RvdHlw ZS5zZXRTaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZigodGhpcy5sb25sYXQp JiYodGhpcy5tYXApKXt2YXIgcHg9dGhpcy5tYXAuZ2V0TGF5ZXJQeEZyb21Mb25M YXQodGhpcy5sb25sYXQpO3RoaXMubW92ZVRvKHB4KTt9fSxjYWxjdWxhdGVSZWxh dGl2ZVBvc2l0aW9uOmZ1bmN0aW9uKHB4KXt2YXIgbG9ubGF0PXRoaXMubWFwLmdl dExvbkxhdEZyb21MYXllclB4KHB4KTt2YXIgZXh0ZW50PXRoaXMubWFwLmdldEV4 dGVudCgpO3ZhciBxdWFkcmFudD1leHRlbnQuZGV0ZXJtaW5lUXVhZHJhbnQobG9u bGF0KTtyZXR1cm4gT3BlbkxheWVycy5Cb3VuZHMub3Bwb3NpdGVRdWFkcmFudChx dWFkcmFudCk7fSx1cGRhdGVSZWxhdGl2ZVBvc2l0aW9uOmZ1bmN0aW9uKCl7fSxj YWxjdWxhdGVOZXdQeDpmdW5jdGlvbihweCl7dmFyIG5ld1B4PXB4Lm9mZnNldCh0 aGlzLmFuY2hvci5vZmZzZXQpO3ZhciBzaXplPXRoaXMuc2l6ZXx8dGhpcy5jb250 ZW50U2l6ZTt2YXIgdG9wPSh0aGlzLnJlbGF0aXZlUG9zaXRpb24uY2hhckF0KDAp PT0ndCcpO25ld1B4LnkrPSh0b3ApPy1zaXplLmg6dGhpcy5hbmNob3Iuc2l6ZS5o O3ZhciBsZWZ0PSh0aGlzLnJlbGF0aXZlUG9zaXRpb24uY2hhckF0KDEpPT0nbCcp O25ld1B4LngrPShsZWZ0KT8tc2l6ZS53OnRoaXMuYW5jaG9yLnNpemUudztyZXR1 cm4gbmV3UHg7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLlBvcHVwLkFuY2hvcmVk In0pO09wZW5MYXllcnMuUmljbz1PcGVuTGF5ZXJzLlJpY298fHt9O09wZW5MYXll cnMuUmljby5Db2xvcj1PcGVuTGF5ZXJzLkNsYXNzKHtpbml0aWFsaXplOmZ1bmN0 aW9uKHJlZCxncmVlbixibHVlKXt0aGlzLnJnYj17cjpyZWQsZzpncmVlbixiOmJs dWV9O30sc2V0UmVkOmZ1bmN0aW9uKHIpe3RoaXMucmdiLnI9cjt9LHNldEdyZWVu OmZ1bmN0aW9uKGcpe3RoaXMucmdiLmc9Zzt9LHNldEJsdWU6ZnVuY3Rpb24oYil7 dGhpcy5yZ2IuYj1iO30sc2V0SHVlOmZ1bmN0aW9uKGgpe3ZhciBoc2I9dGhpcy5h c0hTQigpO2hzYi5oPWg7dGhpcy5yZ2I9T3BlbkxheWVycy5SaWNvLkNvbG9yLkhT QnRvUkdCKGhzYi5oLGhzYi5zLGhzYi5iKTt9LHNldFNhdHVyYXRpb246ZnVuY3Rp b24ocyl7dmFyIGhzYj10aGlzLmFzSFNCKCk7aHNiLnM9czt0aGlzLnJnYj1PcGVu TGF5ZXJzLlJpY28uQ29sb3IuSFNCdG9SR0IoaHNiLmgsaHNiLnMsaHNiLmIpO30s c2V0QnJpZ2h0bmVzczpmdW5jdGlvbihiKXt2YXIgaHNiPXRoaXMuYXNIU0IoKTto c2IuYj1iO3RoaXMucmdiPU9wZW5MYXllcnMuUmljby5Db2xvci5IU0J0b1JHQiho c2IuaCxoc2Iucyxoc2IuYik7fSxkYXJrZW46ZnVuY3Rpb24ocGVyY2VudCl7dmFy IGhzYj10aGlzLmFzSFNCKCk7dGhpcy5yZ2I9T3BlbkxheWVycy5SaWNvLkNvbG9y LkhTQnRvUkdCKGhzYi5oLGhzYi5zLE1hdGgubWF4KGhzYi5iLXBlcmNlbnQsMCkp O30sYnJpZ2h0ZW46ZnVuY3Rpb24ocGVyY2VudCl7dmFyIGhzYj10aGlzLmFzSFNC KCk7dGhpcy5yZ2I9T3BlbkxheWVycy5SaWNvLkNvbG9yLkhTQnRvUkdCKGhzYi5o LGhzYi5zLE1hdGgubWluKGhzYi5iK3BlcmNlbnQsMSkpO30sYmxlbmQ6ZnVuY3Rp b24ob3RoZXIpe3RoaXMucmdiLnI9TWF0aC5mbG9vcigodGhpcy5yZ2IucitvdGhl ci5yZ2IucikvMik7dGhpcy5yZ2IuZz1NYXRoLmZsb29yKCh0aGlzLnJnYi5nK290 aGVyLnJnYi5nKS8yKTt0aGlzLnJnYi5iPU1hdGguZmxvb3IoKHRoaXMucmdiLmIr b3RoZXIucmdiLmIpLzIpO30saXNCcmlnaHQ6ZnVuY3Rpb24oKXt2YXIgaHNiPXRo aXMuYXNIU0IoKTtyZXR1cm4gdGhpcy5hc0hTQigpLmI+MC41O30saXNEYXJrOmZ1 bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNCcmlnaHQoKTt9LGFzUkdCOmZ1bmN0aW9u KCl7cmV0dXJuInJnYigiK3RoaXMucmdiLnIrIiwiK3RoaXMucmdiLmcrIiwiK3Ro aXMucmdiLmIrIikiO30sYXNIZXg6ZnVuY3Rpb24oKXtyZXR1cm4iIyIrdGhpcy5y Z2Iuci50b0NvbG9yUGFydCgpK3RoaXMucmdiLmcudG9Db2xvclBhcnQoKSt0aGlz LnJnYi5iLnRvQ29sb3JQYXJ0KCk7fSxhc0hTQjpmdW5jdGlvbigpe3JldHVybiBP cGVuTGF5ZXJzLlJpY28uQ29sb3IuUkdCdG9IU0IodGhpcy5yZ2Iucix0aGlzLnJn Yi5nLHRoaXMucmdiLmIpO30sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp cy5hc0hleCgpO319KTtPcGVuTGF5ZXJzLlJpY28uQ29sb3IuY3JlYXRlRnJvbUhl eD1mdW5jdGlvbihoZXhDb2RlKXtpZihoZXhDb2RlLmxlbmd0aD09NCl7dmFyIHNo b3J0SGV4Q29kZT1oZXhDb2RlO3ZhciBoZXhDb2RlPScjJztmb3IodmFyIGk9MTtp PDQ7aSsrKXtoZXhDb2RlKz0oc2hvcnRIZXhDb2RlLmNoYXJBdChpKSsKc2hvcnRI ZXhDb2RlLmNoYXJBdChpKSk7fX0KaWYoaGV4Q29kZS5pbmRleE9mKCcjJyk9PTAp e2hleENvZGU9aGV4Q29kZS5zdWJzdHJpbmcoMSk7fQp2YXIgcmVkPWhleENvZGUu c3Vic3RyaW5nKDAsMik7dmFyIGdyZWVuPWhleENvZGUuc3Vic3RyaW5nKDIsNCk7 dmFyIGJsdWU9aGV4Q29kZS5zdWJzdHJpbmcoNCw2KTtyZXR1cm4gbmV3IE9wZW5M YXllcnMuUmljby5Db2xvcihwYXJzZUludChyZWQsMTYpLHBhcnNlSW50KGdyZWVu LDE2KSxwYXJzZUludChibHVlLDE2KSk7fTtPcGVuTGF5ZXJzLlJpY28uQ29sb3Iu Y3JlYXRlQ29sb3JGcm9tQmFja2dyb3VuZD1mdW5jdGlvbihlbGVtKXt2YXIgYWN0 dWFsQ29sb3I9T3BlbkxheWVycy5FbGVtZW50LmdldFN0eWxlKE9wZW5MYXllcnMu VXRpbC5nZXRFbGVtZW50KGVsZW0pLCJiYWNrZ3JvdW5kQ29sb3IiKTtpZihhY3R1 YWxDb2xvcj09InRyYW5zcGFyZW50IiYmZWxlbS5wYXJlbnROb2RlKXtyZXR1cm4g T3BlbkxheWVycy5SaWNvLkNvbG9yLmNyZWF0ZUNvbG9yRnJvbUJhY2tncm91bmQo ZWxlbS5wYXJlbnROb2RlKTt9CmlmKGFjdHVhbENvbG9yPT1udWxsKXtyZXR1cm4g bmV3IE9wZW5MYXllcnMuUmljby5Db2xvcigyNTUsMjU1LDI1NSk7fQppZihhY3R1 YWxDb2xvci5pbmRleE9mKCJyZ2IoIik9PTApe3ZhciBjb2xvcnM9YWN0dWFsQ29s b3Iuc3Vic3RyaW5nKDQsYWN0dWFsQ29sb3IubGVuZ3RoLTEpO3ZhciBjb2xvckFy cmF5PWNvbG9ycy5zcGxpdCgiLCIpO3JldHVybiBuZXcgT3BlbkxheWVycy5SaWNv LkNvbG9yKHBhcnNlSW50KGNvbG9yQXJyYXlbMF0pLHBhcnNlSW50KGNvbG9yQXJy YXlbMV0pLHBhcnNlSW50KGNvbG9yQXJyYXlbMl0pKTt9CmVsc2UgaWYoYWN0dWFs Q29sb3IuaW5kZXhPZigiIyIpPT0wKXtyZXR1cm4gT3BlbkxheWVycy5SaWNvLkNv bG9yLmNyZWF0ZUZyb21IZXgoYWN0dWFsQ29sb3IpO30KZWxzZXtyZXR1cm4gbmV3 IE9wZW5MYXllcnMuUmljby5Db2xvcigyNTUsMjU1LDI1NSk7fX07T3BlbkxheWVy cy5SaWNvLkNvbG9yLkhTQnRvUkdCPWZ1bmN0aW9uKGh1ZSxzYXR1cmF0aW9uLGJy aWdodG5lc3Mpe3ZhciByZWQ9MDt2YXIgZ3JlZW49MDt2YXIgYmx1ZT0wO2lmKHNh dHVyYXRpb249PTApe3JlZD1wYXJzZUludChicmlnaHRuZXNzKjI1NS4wKzAuNSk7 Z3JlZW49cmVkO2JsdWU9cmVkO30KZWxzZXt2YXIgaD0oaHVlLU1hdGguZmxvb3Io aHVlKSkqNi4wO3ZhciBmPWgtTWF0aC5mbG9vcihoKTt2YXIgcD1icmlnaHRuZXNz KigxLjAtc2F0dXJhdGlvbik7dmFyIHE9YnJpZ2h0bmVzcyooMS4wLXNhdHVyYXRp b24qZik7dmFyIHQ9YnJpZ2h0bmVzcyooMS4wLShzYXR1cmF0aW9uKigxLjAtZikp KTtzd2l0Y2gocGFyc2VJbnQoaCkpe2Nhc2UgMDpyZWQ9KGJyaWdodG5lc3MqMjU1 LjArMC41KTtncmVlbj0odCoyNTUuMCswLjUpO2JsdWU9KHAqMjU1LjArMC41KTti cmVhaztjYXNlIDE6cmVkPShxKjI1NS4wKzAuNSk7Z3JlZW49KGJyaWdodG5lc3Mq MjU1LjArMC41KTtibHVlPShwKjI1NS4wKzAuNSk7YnJlYWs7Y2FzZSAyOnJlZD0o cCoyNTUuMCswLjUpO2dyZWVuPShicmlnaHRuZXNzKjI1NS4wKzAuNSk7Ymx1ZT0o dCoyNTUuMCswLjUpO2JyZWFrO2Nhc2UgMzpyZWQ9KHAqMjU1LjArMC41KTtncmVl bj0ocSoyNTUuMCswLjUpO2JsdWU9KGJyaWdodG5lc3MqMjU1LjArMC41KTticmVh aztjYXNlIDQ6cmVkPSh0KjI1NS4wKzAuNSk7Z3JlZW49KHAqMjU1LjArMC41KTti bHVlPShicmlnaHRuZXNzKjI1NS4wKzAuNSk7YnJlYWs7Y2FzZSA1OnJlZD0oYnJp Z2h0bmVzcyoyNTUuMCswLjUpO2dyZWVuPShwKjI1NS4wKzAuNSk7Ymx1ZT0ocSoy NTUuMCswLjUpO2JyZWFrO319CnJldHVybntyOnBhcnNlSW50KHJlZCksZzpwYXJz ZUludChncmVlbiksYjpwYXJzZUludChibHVlKX07fTtPcGVuTGF5ZXJzLlJpY28u Q29sb3IuUkdCdG9IU0I9ZnVuY3Rpb24ocixnLGIpe3ZhciBodWU7dmFyIHNhdHVy YXRpb247dmFyIGJyaWdodG5lc3M7dmFyIGNtYXg9KHI+Zyk/cjpnO2lmKGI+Y21h eCl7Y21heD1iO30KdmFyIGNtaW49KHI8Zyk/cjpnO2lmKGI8Y21pbil7Y21pbj1i O30KYnJpZ2h0bmVzcz1jbWF4LzI1NS4wO2lmKGNtYXghPTApe3NhdHVyYXRpb249 KGNtYXgtY21pbikvY21heDt9ZWxzZXtzYXR1cmF0aW9uPTA7fQppZihzYXR1cmF0 aW9uPT0wKXtodWU9MDt9ZWxzZXt2YXIgcmVkYz0oY21heC1yKS8oY21heC1jbWlu KTt2YXIgZ3JlZW5jPShjbWF4LWcpLyhjbWF4LWNtaW4pO3ZhciBibHVlYz0oY21h eC1iKS8oY21heC1jbWluKTtpZihyPT1jbWF4KXtodWU9Ymx1ZWMtZ3JlZW5jO31l bHNlIGlmKGc9PWNtYXgpe2h1ZT0yLjArcmVkYy1ibHVlYzt9ZWxzZXtodWU9NC4w K2dyZWVuYy1yZWRjO30KaHVlPWh1ZS82LjA7aWYoaHVlPDApe2h1ZT1odWUrMS4w O319CnJldHVybntoOmh1ZSxzOnNhdHVyYXRpb24sYjpicmlnaHRuZXNzfTt9O09w ZW5MYXllcnMuUmljbz1PcGVuTGF5ZXJzLlJpY298fHt9O09wZW5MYXllcnMuUmlj by5Db3JuZXI9e3JvdW5kOmZ1bmN0aW9uKGUsb3B0aW9ucyl7ZT1PcGVuTGF5ZXJz LlV0aWwuZ2V0RWxlbWVudChlKTt0aGlzLl9zZXRPcHRpb25zKG9wdGlvbnMpO3Zh ciBjb2xvcj10aGlzLm9wdGlvbnMuY29sb3I7aWYodGhpcy5vcHRpb25zLmNvbG9y PT0iZnJvbUVsZW1lbnQiKXtjb2xvcj10aGlzLl9iYWNrZ3JvdW5kKGUpO30KdmFy IGJnQ29sb3I9dGhpcy5vcHRpb25zLmJnQ29sb3I7aWYodGhpcy5vcHRpb25zLmJn Q29sb3I9PSJmcm9tUGFyZW50Iil7YmdDb2xvcj10aGlzLl9iYWNrZ3JvdW5kKGUu b2Zmc2V0UGFyZW50KTt9CnRoaXMuX3JvdW5kQ29ybmVyc0ltcGwoZSxjb2xvcixi Z0NvbG9yKTt9LGNoYW5nZUNvbG9yOmZ1bmN0aW9uKHRoZURpdixuZXdDb2xvcil7 dGhlRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvcj1uZXdDb2xvcjt2YXIgc3BhbkVs ZW1lbnRzPXRoZURpdi5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJz cGFuIik7Zm9yKHZhciBjdXJySWR4PTA7Y3VycklkeDxzcGFuRWxlbWVudHMubGVu Z3RoO2N1cnJJZHgrKyl7c3BhbkVsZW1lbnRzW2N1cnJJZHhdLnN0eWxlLmJhY2tn cm91bmRDb2xvcj1uZXdDb2xvcjt9fSxjaGFuZ2VPcGFjaXR5OmZ1bmN0aW9uKHRo ZURpdixuZXdPcGFjaXR5KXt2YXIgbW96aWxsYU9wYWNpdHk9bmV3T3BhY2l0eTt2 YXIgaWVPcGFjaXR5PSdhbHBoYShvcGFjaXR5PScrbmV3T3BhY2l0eSoxMDArJykn O3RoZURpdi5zdHlsZS5vcGFjaXR5PW1vemlsbGFPcGFjaXR5O3RoZURpdi5zdHls ZS5maWx0ZXI9aWVPcGFjaXR5O3ZhciBzcGFuRWxlbWVudHM9dGhlRGl2LnBhcmVu dE5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKTtmb3IodmFyIGN1cnJJ ZHg9MDtjdXJySWR4PHNwYW5FbGVtZW50cy5sZW5ndGg7Y3VycklkeCsrKXtzcGFu RWxlbWVudHNbY3VycklkeF0uc3R5bGUub3BhY2l0eT1tb3ppbGxhT3BhY2l0eTtz cGFuRWxlbWVudHNbY3VycklkeF0uc3R5bGUuZmlsdGVyPWllT3BhY2l0eTt9fSxy ZVJvdW5kOmZ1bmN0aW9uKHRoZURpdixvcHRpb25zKXt2YXIgdG9wUmljbz10aGVE aXYucGFyZW50Tm9kZS5jaGlsZE5vZGVzWzBdO3ZhciBib3R0b21SaWNvPXRoZURp di5wYXJlbnROb2RlLmNoaWxkTm9kZXNbMl07dGhlRGl2LnBhcmVudE5vZGUucmVt b3ZlQ2hpbGQodG9wUmljbyk7dGhlRGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQo Ym90dG9tUmljbyk7dGhpcy5yb3VuZCh0aGVEaXYucGFyZW50Tm9kZSxvcHRpb25z KTt9LF9yb3VuZENvcm5lcnNJbXBsOmZ1bmN0aW9uKGUsY29sb3IsYmdDb2xvcil7 aWYodGhpcy5vcHRpb25zLmJvcmRlcil7dGhpcy5fcmVuZGVyQm9yZGVyKGUsYmdD b2xvcik7fQppZih0aGlzLl9pc1RvcFJvdW5kZWQoKSl7dGhpcy5fcm91bmRUb3BD b3JuZXJzKGUsY29sb3IsYmdDb2xvcik7fQppZih0aGlzLl9pc0JvdHRvbVJvdW5k ZWQoKSl7dGhpcy5fcm91bmRCb3R0b21Db3JuZXJzKGUsY29sb3IsYmdDb2xvcik7 fX0sX3JlbmRlckJvcmRlcjpmdW5jdGlvbihlbCxiZ0NvbG9yKXt2YXIgYm9yZGVy VmFsdWU9IjFweCBzb2xpZCAiK3RoaXMuX2JvcmRlckNvbG9yKGJnQ29sb3IpO3Zh ciBib3JkZXJMPSJib3JkZXItbGVmdDogIitib3JkZXJWYWx1ZTt2YXIgYm9yZGVy Uj0iYm9yZGVyLXJpZ2h0OiAiK2JvcmRlclZhbHVlO3ZhciBzdHlsZT0ic3R5bGU9 JyIrYm9yZGVyTCsiOyIrYm9yZGVyUisiJyI7ZWwuaW5uZXJIVE1MPSI8ZGl2ICIr c3R5bGUrIj4iK2VsLmlubmVySFRNTCsiPC9kaXY+Ijt9LF9yb3VuZFRvcENvcm5l cnM6ZnVuY3Rpb24oZWwsY29sb3IsYmdDb2xvcil7dmFyIGNvcm5lcj10aGlzLl9j cmVhdGVDb3JuZXIoYmdDb2xvcik7Zm9yKHZhciBpPTA7aTx0aGlzLm9wdGlvbnMu bnVtU2xpY2VzO2krKyl7Y29ybmVyLmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZUNv cm5lclNsaWNlKGNvbG9yLGJnQ29sb3IsaSwidG9wIikpO30KZWwuc3R5bGUucGFk ZGluZ1RvcD0wO2VsLmluc2VydEJlZm9yZShjb3JuZXIsZWwuZmlyc3RDaGlsZCk7 fSxfcm91bmRCb3R0b21Db3JuZXJzOmZ1bmN0aW9uKGVsLGNvbG9yLGJnQ29sb3Ip e3ZhciBjb3JuZXI9dGhpcy5fY3JlYXRlQ29ybmVyKGJnQ29sb3IpO2Zvcih2YXIg aT0odGhpcy5vcHRpb25zLm51bVNsaWNlcy0xKTtpPj0wO2ktLSl7Y29ybmVyLmFw cGVuZENoaWxkKHRoaXMuX2NyZWF0ZUNvcm5lclNsaWNlKGNvbG9yLGJnQ29sb3Is aSwiYm90dG9tIikpO30KZWwuc3R5bGUucGFkZGluZ0JvdHRvbT0wO2VsLmFwcGVu ZENoaWxkKGNvcm5lcik7fSxfY3JlYXRlQ29ybmVyOmZ1bmN0aW9uKGJnQ29sb3Ip e3ZhciBjb3JuZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Y29ybmVy LnN0eWxlLmJhY2tncm91bmRDb2xvcj0odGhpcy5faXNUcmFuc3BhcmVudCgpPyJ0 cmFuc3BhcmVudCI6YmdDb2xvcik7cmV0dXJuIGNvcm5lcjt9LF9jcmVhdGVDb3Ju ZXJTbGljZTpmdW5jdGlvbihjb2xvcixiZ0NvbG9yLG4scG9zaXRpb24pe3ZhciBz bGljZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7dmFyIGluU3R5bGU9 c2xpY2Uuc3R5bGU7aW5TdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Y29sb3I7aW5TdHls ZS5kaXNwbGF5PSJibG9jayI7aW5TdHlsZS5oZWlnaHQ9IjFweCI7aW5TdHlsZS5v dmVyZmxvdz0iaGlkZGVuIjtpblN0eWxlLmZvbnRTaXplPSIxcHgiO3ZhciBib3Jk ZXJDb2xvcj10aGlzLl9ib3JkZXJDb2xvcihjb2xvcixiZ0NvbG9yKTtpZih0aGlz Lm9wdGlvbnMuYm9yZGVyJiZuPT0wKXtpblN0eWxlLmJvcmRlclRvcFN0eWxlPSJz b2xpZCI7aW5TdHlsZS5ib3JkZXJUb3BXaWR0aD0iMXB4IjtpblN0eWxlLmJvcmRl ckxlZnRXaWR0aD0iMHB4IjtpblN0eWxlLmJvcmRlclJpZ2h0V2lkdGg9IjBweCI7 aW5TdHlsZS5ib3JkZXJCb3R0b21XaWR0aD0iMHB4IjtpblN0eWxlLmhlaWdodD0i MHB4IjtpblN0eWxlLmJvcmRlckNvbG9yPWJvcmRlckNvbG9yO30KZWxzZSBpZihi b3JkZXJDb2xvcil7aW5TdHlsZS5ib3JkZXJDb2xvcj1ib3JkZXJDb2xvcjtpblN0 eWxlLmJvcmRlclN0eWxlPSJzb2xpZCI7aW5TdHlsZS5ib3JkZXJXaWR0aD0iMHB4 IDFweCI7fQppZighdGhpcy5vcHRpb25zLmNvbXBhY3QmJihuPT0odGhpcy5vcHRp b25zLm51bVNsaWNlcy0xKSkpe2luU3R5bGUuaGVpZ2h0PSIycHgiO30KdGhpcy5f c2V0TWFyZ2luKHNsaWNlLG4scG9zaXRpb24pO3RoaXMuX3NldEJvcmRlcihzbGlj ZSxuLHBvc2l0aW9uKTtyZXR1cm4gc2xpY2U7fSxfc2V0T3B0aW9uczpmdW5jdGlv bihvcHRpb25zKXt0aGlzLm9wdGlvbnM9e2Nvcm5lcnM6ImFsbCIsY29sb3I6ImZy b21FbGVtZW50IixiZ0NvbG9yOiJmcm9tUGFyZW50IixibGVuZDp0cnVlLGJvcmRl cjpmYWxzZSxjb21wYWN0OmZhbHNlfTtPcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHRo aXMub3B0aW9ucyxvcHRpb25zfHx7fSk7dGhpcy5vcHRpb25zLm51bVNsaWNlcz10 aGlzLm9wdGlvbnMuY29tcGFjdD8yOjQ7aWYodGhpcy5faXNUcmFuc3BhcmVudCgp KXt0aGlzLm9wdGlvbnMuYmxlbmQ9ZmFsc2U7fX0sX3doaWNoU2lkZVRvcDpmdW5j dGlvbigpe2lmKHRoaXMuX2hhc1N0cmluZyh0aGlzLm9wdGlvbnMuY29ybmVycywi YWxsIiwidG9wIikpe3JldHVybiIiO30KaWYodGhpcy5vcHRpb25zLmNvcm5lcnMu aW5kZXhPZigidGwiKT49MCYmdGhpcy5vcHRpb25zLmNvcm5lcnMuaW5kZXhPZigi dHIiKT49MCl7cmV0dXJuIiI7fQppZih0aGlzLm9wdGlvbnMuY29ybmVycy5pbmRl eE9mKCJ0bCIpPj0wKXtyZXR1cm4ibGVmdCI7fWVsc2UgaWYodGhpcy5vcHRpb25z LmNvcm5lcnMuaW5kZXhPZigidHIiKT49MCl7cmV0dXJuInJpZ2h0Ijt9CnJldHVy biIiO30sX3doaWNoU2lkZUJvdHRvbTpmdW5jdGlvbigpe2lmKHRoaXMuX2hhc1N0 cmluZyh0aGlzLm9wdGlvbnMuY29ybmVycywiYWxsIiwiYm90dG9tIikpe3JldHVy biIiO30KaWYodGhpcy5vcHRpb25zLmNvcm5lcnMuaW5kZXhPZigiYmwiKT49MCYm dGhpcy5vcHRpb25zLmNvcm5lcnMuaW5kZXhPZigiYnIiKT49MCl7cmV0dXJuIiI7 fQppZih0aGlzLm9wdGlvbnMuY29ybmVycy5pbmRleE9mKCJibCIpPj0wKXtyZXR1 cm4ibGVmdCI7fWVsc2UgaWYodGhpcy5vcHRpb25zLmNvcm5lcnMuaW5kZXhPZigi YnIiKT49MCl7cmV0dXJuInJpZ2h0Ijt9CnJldHVybiIiO30sX2JvcmRlckNvbG9y OmZ1bmN0aW9uKGNvbG9yLGJnQ29sb3Ipe2lmKGNvbG9yPT0idHJhbnNwYXJlbnQi KXtyZXR1cm4gYmdDb2xvcjt9ZWxzZSBpZih0aGlzLm9wdGlvbnMuYm9yZGVyKXty ZXR1cm4gdGhpcy5vcHRpb25zLmJvcmRlcjt9ZWxzZSBpZih0aGlzLm9wdGlvbnMu YmxlbmQpe3JldHVybiB0aGlzLl9ibGVuZChiZ0NvbG9yLGNvbG9yKTt9ZWxzZXty ZXR1cm4iIjt9fSxfc2V0TWFyZ2luOmZ1bmN0aW9uKGVsLG4sY29ybmVycyl7dmFy IG1hcmdpblNpemU9dGhpcy5fbWFyZ2luU2l6ZShuKTt2YXIgd2hpY2hTaWRlPWNv cm5lcnM9PSJ0b3AiP3RoaXMuX3doaWNoU2lkZVRvcCgpOnRoaXMuX3doaWNoU2lk ZUJvdHRvbSgpO2lmKHdoaWNoU2lkZT09ImxlZnQiKXtlbC5zdHlsZS5tYXJnaW5M ZWZ0PW1hcmdpblNpemUrInB4IjtlbC5zdHlsZS5tYXJnaW5SaWdodD0iMHB4Ijt9 CmVsc2UgaWYod2hpY2hTaWRlPT0icmlnaHQiKXtlbC5zdHlsZS5tYXJnaW5SaWdo dD1tYXJnaW5TaXplKyJweCI7ZWwuc3R5bGUubWFyZ2luTGVmdD0iMHB4Ijt9CmVs c2V7ZWwuc3R5bGUubWFyZ2luTGVmdD1tYXJnaW5TaXplKyJweCI7ZWwuc3R5bGUu bWFyZ2luUmlnaHQ9bWFyZ2luU2l6ZSsicHgiO319LF9zZXRCb3JkZXI6ZnVuY3Rp b24oZWwsbixjb3JuZXJzKXt2YXIgYm9yZGVyU2l6ZT10aGlzLl9ib3JkZXJTaXpl KG4pO3ZhciB3aGljaFNpZGU9Y29ybmVycz09InRvcCI/dGhpcy5fd2hpY2hTaWRl VG9wKCk6dGhpcy5fd2hpY2hTaWRlQm90dG9tKCk7aWYod2hpY2hTaWRlPT0ibGVm dCIpe2VsLnN0eWxlLmJvcmRlckxlZnRXaWR0aD1ib3JkZXJTaXplKyJweCI7ZWwu c3R5bGUuYm9yZGVyUmlnaHRXaWR0aD0iMHB4Ijt9CmVsc2UgaWYod2hpY2hTaWRl PT0icmlnaHQiKXtlbC5zdHlsZS5ib3JkZXJSaWdodFdpZHRoPWJvcmRlclNpemUr InB4IjtlbC5zdHlsZS5ib3JkZXJMZWZ0V2lkdGg9IjBweCI7fQplbHNle2VsLnN0 eWxlLmJvcmRlckxlZnRXaWR0aD1ib3JkZXJTaXplKyJweCI7ZWwuc3R5bGUuYm9y ZGVyUmlnaHRXaWR0aD1ib3JkZXJTaXplKyJweCI7fQppZih0aGlzLm9wdGlvbnMu Ym9yZGVyIT1mYWxzZSl7ZWwuc3R5bGUuYm9yZGVyTGVmdFdpZHRoPWJvcmRlclNp emUrInB4IjtlbC5zdHlsZS5ib3JkZXJSaWdodFdpZHRoPWJvcmRlclNpemUrInB4 Ijt9fSxfbWFyZ2luU2l6ZTpmdW5jdGlvbihuKXtpZih0aGlzLl9pc1RyYW5zcGFy ZW50KCkpe3JldHVybiAwO30KdmFyIG1hcmdpblNpemVzPVs1LDMsMiwxXTt2YXIg YmxlbmRlZE1hcmdpblNpemVzPVszLDIsMSwwXTt2YXIgY29tcGFjdE1hcmdpblNp emVzPVsyLDFdO3ZhciBzbUJsZW5kZWRNYXJnaW5TaXplcz1bMSwwXTtpZih0aGlz Lm9wdGlvbnMuY29tcGFjdCYmdGhpcy5vcHRpb25zLmJsZW5kKXtyZXR1cm4gc21C bGVuZGVkTWFyZ2luU2l6ZXNbbl07fWVsc2UgaWYodGhpcy5vcHRpb25zLmNvbXBh Y3Qpe3JldHVybiBjb21wYWN0TWFyZ2luU2l6ZXNbbl07fWVsc2UgaWYodGhpcy5v cHRpb25zLmJsZW5kKXtyZXR1cm4gYmxlbmRlZE1hcmdpblNpemVzW25dO31lbHNl e3JldHVybiBtYXJnaW5TaXplc1tuXTt9fSxfYm9yZGVyU2l6ZTpmdW5jdGlvbihu KXt2YXIgdHJhbnNwYXJlbnRCb3JkZXJTaXplcz1bNSwzLDIsMV07dmFyIGJsZW5k ZWRCb3JkZXJTaXplcz1bMiwxLDEsMV07dmFyIGNvbXBhY3RCb3JkZXJTaXplcz1b MSwwXTt2YXIgYWN0dWFsQm9yZGVyU2l6ZXM9WzAsMiwwLDBdO2lmKHRoaXMub3B0 aW9ucy5jb21wYWN0JiYodGhpcy5vcHRpb25zLmJsZW5kfHx0aGlzLl9pc1RyYW5z cGFyZW50KCkpKXtyZXR1cm4gMTt9ZWxzZSBpZih0aGlzLm9wdGlvbnMuY29tcGFj dCl7cmV0dXJuIGNvbXBhY3RCb3JkZXJTaXplc1tuXTt9ZWxzZSBpZih0aGlzLm9w dGlvbnMuYmxlbmQpe3JldHVybiBibGVuZGVkQm9yZGVyU2l6ZXNbbl07fWVsc2Ug aWYodGhpcy5vcHRpb25zLmJvcmRlcil7cmV0dXJuIGFjdHVhbEJvcmRlclNpemVz W25dO31lbHNlIGlmKHRoaXMuX2lzVHJhbnNwYXJlbnQoKSl7cmV0dXJuIHRyYW5z cGFyZW50Qm9yZGVyU2l6ZXNbbl07fQpyZXR1cm4gMDt9LF9oYXNTdHJpbmc6ZnVu Y3Rpb24oc3RyKXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKWlm KHN0ci5pbmRleE9mKGFyZ3VtZW50c1tpXSk+PTApe3JldHVybiB0cnVlO31yZXR1 cm4gZmFsc2U7fSxfYmxlbmQ6ZnVuY3Rpb24oYzEsYzIpe3ZhciBjYzE9T3Blbkxh eWVycy5SaWNvLkNvbG9yLmNyZWF0ZUZyb21IZXgoYzEpO2NjMS5ibGVuZChPcGVu TGF5ZXJzLlJpY28uQ29sb3IuY3JlYXRlRnJvbUhleChjMikpO3JldHVybiBjYzE7 fSxfYmFja2dyb3VuZDpmdW5jdGlvbihlbCl7dHJ5e3JldHVybiBPcGVuTGF5ZXJz LlJpY28uQ29sb3IuY3JlYXRlQ29sb3JGcm9tQmFja2dyb3VuZChlbCkuYXNIZXgo KTt9Y2F0Y2goZXJyKXtyZXR1cm4iI2ZmZmZmZiI7fX0sX2lzVHJhbnNwYXJlbnQ6 ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmNvbG9yPT0idHJhbnNwYXJl bnQiO30sX2lzVG9wUm91bmRlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNT dHJpbmcodGhpcy5vcHRpb25zLmNvcm5lcnMsImFsbCIsInRvcCIsInRsIiwidHIi KTt9LF9pc0JvdHRvbVJvdW5kZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFz U3RyaW5nKHRoaXMub3B0aW9ucy5jb3JuZXJzLCJhbGwiLCJib3R0b20iLCJibCIs ImJyIik7fSxfaGFzU2luZ2xlVGV4dENoaWxkOmZ1bmN0aW9uKGVsKXtyZXR1cm4g ZWwuY2hpbGROb2Rlcy5sZW5ndGg9PTEmJmVsLmNoaWxkTm9kZXNbMF0ubm9kZVR5 cGU9PTM7fX07T3BlbkxheWVycy5Qb3B1cC5BbmNob3JlZEJ1YmJsZT1PcGVuTGF5 ZXJzLkNsYXNzKE9wZW5MYXllcnMuUG9wdXAuQW5jaG9yZWQse3JvdW5kZWQ6ZmFs c2UsaW5pdGlhbGl6ZTpmdW5jdGlvbihpZCxsb25sYXQsY29udGVudFNpemUsY29u dGVudEhUTUwsYW5jaG9yLGNsb3NlQm94LGNsb3NlQm94Q2FsbGJhY2spe3RoaXMu cGFkZGluZz1uZXcgT3BlbkxheWVycy5Cb3VuZHMoMCxPcGVuTGF5ZXJzLlBvcHVw LkFuY2hvcmVkQnViYmxlLkNPUk5FUl9TSVpFLDAsT3BlbkxheWVycy5Qb3B1cC5B bmNob3JlZEJ1YmJsZS5DT1JORVJfU0laRSk7T3BlbkxheWVycy5Qb3B1cC5BbmNo b3JlZC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7 fSxkcmF3OmZ1bmN0aW9uKHB4KXtPcGVuTGF5ZXJzLlBvcHVwLkFuY2hvcmVkLnBy b3RvdHlwZS5kcmF3LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnNldENvbnRl bnRIVE1MKCk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoKTt0aGlzLnNldE9wYWNp dHkoKTtyZXR1cm4gdGhpcy5kaXY7fSx1cGRhdGVSZWxhdGl2ZVBvc2l0aW9uOmZ1 bmN0aW9uKCl7dGhpcy5zZXRSaWNvQ29ybmVycygpO30sc2V0U2l6ZTpmdW5jdGlv bihjb250ZW50U2l6ZSl7T3BlbkxheWVycy5Qb3B1cC5BbmNob3JlZC5wcm90b3R5 cGUuc2V0U2l6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5zZXRSaWNvQ29y bmVycygpO30sc2V0QmFja2dyb3VuZENvbG9yOmZ1bmN0aW9uKGNvbG9yKXtpZihj b2xvciE9dW5kZWZpbmVkKXt0aGlzLmJhY2tncm91bmRDb2xvcj1jb2xvcjt9Cmlm KHRoaXMuZGl2IT1udWxsKXtpZih0aGlzLmNvbnRlbnREaXYhPW51bGwpe3RoaXMu ZGl2LnN0eWxlLmJhY2tncm91bmQ9InRyYW5zcGFyZW50IjtPcGVuTGF5ZXJzLlJp Y28uQ29ybmVyLmNoYW5nZUNvbG9yKHRoaXMuZ3JvdXBEaXYsdGhpcy5iYWNrZ3Jv dW5kQ29sb3IpO319fSxzZXRPcGFjaXR5OmZ1bmN0aW9uKG9wYWNpdHkpe09wZW5M YXllcnMuUG9wdXAuQW5jaG9yZWQucHJvdG90eXBlLnNldE9wYWNpdHkuY2FsbCh0 aGlzLG9wYWNpdHkpO2lmKHRoaXMuZGl2IT1udWxsKXtpZih0aGlzLmdyb3VwRGl2 IT1udWxsKXtPcGVuTGF5ZXJzLlJpY28uQ29ybmVyLmNoYW5nZU9wYWNpdHkodGhp cy5ncm91cERpdix0aGlzLm9wYWNpdHkpO319fSxzZXRCb3JkZXI6ZnVuY3Rpb24o Ym9yZGVyKXt0aGlzLmJvcmRlcj0wO30sc2V0Umljb0Nvcm5lcnM6ZnVuY3Rpb24o KXt2YXIgY29ybmVycz10aGlzLmdldENvcm5lcnNUb1JvdW5kKHRoaXMucmVsYXRp dmVQb3NpdGlvbik7dmFyIG9wdGlvbnM9e2Nvcm5lcnM6Y29ybmVycyxjb2xvcjp0 aGlzLmJhY2tncm91bmRDb2xvcixiZ0NvbG9yOiJ0cmFuc3BhcmVudCIsYmxlbmQ6 ZmFsc2V9O2lmKCF0aGlzLnJvdW5kZWQpe09wZW5MYXllcnMuUmljby5Db3JuZXIu cm91bmQodGhpcy5kaXYsb3B0aW9ucyk7dGhpcy5yb3VuZGVkPXRydWU7fWVsc2V7 T3BlbkxheWVycy5SaWNvLkNvcm5lci5yZVJvdW5kKHRoaXMuZ3JvdXBEaXYsb3B0 aW9ucyk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoKTt0aGlzLnNldE9wYWNpdHko KTt9fSxnZXRDb3JuZXJzVG9Sb3VuZDpmdW5jdGlvbigpe3ZhciBjb3JuZXJzPVsn dGwnLCd0cicsJ2JsJywnYnInXTt2YXIgY29ybmVyPU9wZW5MYXllcnMuQm91bmRz Lm9wcG9zaXRlUXVhZHJhbnQodGhpcy5yZWxhdGl2ZVBvc2l0aW9uKTtPcGVuTGF5 ZXJzLlV0aWwucmVtb3ZlSXRlbShjb3JuZXJzLGNvcm5lcik7cmV0dXJuIGNvcm5l cnMuam9pbigiICIpO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Qb3B1cC5BbmNo b3JlZEJ1YmJsZSJ9KTtPcGVuTGF5ZXJzLlBvcHVwLkFuY2hvcmVkQnViYmxlLkNP Uk5FUl9TSVpFPTU7T3BlbkxheWVycy5Qcm90b2NvbC5XRlMudjE9T3BlbkxheWVy cy5DbGFzcyhPcGVuTGF5ZXJzLlByb3RvY29sLHt2ZXJzaW9uOm51bGwsc3JzTmFt ZToiRVBTRzo0MzI2IixmZWF0dXJlVHlwZTpudWxsLGZlYXR1cmVOUzpudWxsLGdl b21ldHJ5TmFtZToidGhlX2dlb20iLHNjaGVtYTpudWxsLGZlYXR1cmVQcmVmaXg6 ImZlYXR1cmUiLGZvcm1hdE9wdGlvbnM6bnVsbCxyZWFkRm9ybWF0Om51bGwscmVh ZE9wdGlvbnM6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKG9wdGlvbnMpe09wZW5M YXllcnMuUHJvdG9jb2wucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxb b3B0aW9uc10pO2lmKCFvcHRpb25zLmZvcm1hdCl7dGhpcy5mb3JtYXQ9T3Blbkxh eWVycy5Gb3JtYXQuV0ZTVChPcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHt2ZXJzaW9u OnRoaXMudmVyc2lvbixmZWF0dXJlVHlwZTp0aGlzLmZlYXR1cmVUeXBlLGZlYXR1 cmVOUzp0aGlzLmZlYXR1cmVOUyxmZWF0dXJlUHJlZml4OnRoaXMuZmVhdHVyZVBy ZWZpeCxnZW9tZXRyeU5hbWU6dGhpcy5nZW9tZXRyeU5hbWUsc3JzTmFtZTp0aGlz LnNyc05hbWUsc2NoZW1hOnRoaXMuc2NoZW1hfSx0aGlzLmZvcm1hdE9wdGlvbnMp KTt9CmlmKCFvcHRpb25zLmdlb21ldHJ5TmFtZSYmcGFyc2VGbG9hdCh0aGlzLmZv cm1hdC52ZXJzaW9uKT4xLjApe3RoaXMuc2V0R2VvbWV0cnlOYW1lKG51bGwpO319 LGRlc3Ryb3k6ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMmJiF0aGlzLm9wdGlv bnMuZm9ybWF0KXt0aGlzLmZvcm1hdC5kZXN0cm95KCk7fQp0aGlzLmZvcm1hdD1u dWxsO09wZW5MYXllcnMuUHJvdG9jb2wucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHko dGhpcyk7fSxyZWFkOmZ1bmN0aW9uKG9wdGlvbnMpe09wZW5MYXllcnMuUHJvdG9j b2wucHJvdG90eXBlLnJlYWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO29wdGlvbnM9 T3BlbkxheWVycy5VdGlsLmV4dGVuZCh7fSxvcHRpb25zKTtPcGVuTGF5ZXJzLlV0 aWwuYXBwbHlEZWZhdWx0cyhvcHRpb25zLHRoaXMub3B0aW9uc3x8e30pO3ZhciBy ZXNwb25zZT1uZXcgT3BlbkxheWVycy5Qcm90b2NvbC5SZXNwb25zZSh7cmVxdWVz dFR5cGU6InJlYWQifSk7dmFyIGRhdGE9T3BlbkxheWVycy5Gb3JtYXQuWE1MLnBy b3RvdHlwZS53cml0ZS5hcHBseSh0aGlzLmZvcm1hdCxbdGhpcy5mb3JtYXQud3Jp dGVOb2RlKCJ3ZnM6R2V0RmVhdHVyZSIsb3B0aW9ucyldKTtyZXNwb25zZS5wcml2 PU9wZW5MYXllcnMuUmVxdWVzdC5QT1NUKHt1cmw6b3B0aW9ucy51cmwsY2FsbGJh Y2s6dGhpcy5jcmVhdGVDYWxsYmFjayh0aGlzLmhhbmRsZVJlYWQscmVzcG9uc2Us b3B0aW9ucykscGFyYW1zOm9wdGlvbnMucGFyYW1zLGhlYWRlcnM6b3B0aW9ucy5o ZWFkZXJzLGRhdGE6ZGF0YX0pO3JldHVybiByZXNwb25zZTt9LHNldEZlYXR1cmVU eXBlOmZ1bmN0aW9uKGZlYXR1cmVUeXBlKXt0aGlzLmZlYXR1cmVUeXBlPWZlYXR1 cmVUeXBlO3RoaXMuZm9ybWF0LmZlYXR1cmVUeXBlPWZlYXR1cmVUeXBlO30sc2V0 R2VvbWV0cnlOYW1lOmZ1bmN0aW9uKGdlb21ldHJ5TmFtZSl7dGhpcy5nZW9tZXRy eU5hbWU9Z2VvbWV0cnlOYW1lO3RoaXMuZm9ybWF0Lmdlb21ldHJ5TmFtZT1nZW9t ZXRyeU5hbWU7fSxoYW5kbGVSZWFkOmZ1bmN0aW9uKHJlc3BvbnNlLG9wdGlvbnMp e29wdGlvbnM9T3BlbkxheWVycy5VdGlsLmV4dGVuZCh7fSxvcHRpb25zKTtPcGVu TGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyhvcHRpb25zLHRoaXMub3B0aW9ucyk7 aWYob3B0aW9ucy5jYWxsYmFjayl7dmFyIHJlcXVlc3Q9cmVzcG9uc2UucHJpdjtp ZihyZXF1ZXN0LnN0YXR1cz49MjAwJiZyZXF1ZXN0LnN0YXR1czwzMDApe3ZhciBy ZXN1bHQ9dGhpcy5wYXJzZVJlc3BvbnNlKHJlcXVlc3Qsb3B0aW9ucy5yZWFkT3B0 aW9ucyk7aWYocmVzdWx0JiZyZXN1bHQuc3VjY2VzcyE9PWZhbHNlKXtpZihvcHRp b25zLnJlYWRPcHRpb25zJiZvcHRpb25zLnJlYWRPcHRpb25zLm91dHB1dD09Im9i amVjdCIpe09wZW5MYXllcnMuVXRpbC5leHRlbmQocmVzcG9uc2UscmVzdWx0KTt9 ZWxzZXtyZXNwb25zZS5mZWF0dXJlcz1yZXN1bHQ7fQpyZXNwb25zZS5jb2RlPU9w ZW5MYXllcnMuUHJvdG9jb2wuUmVzcG9uc2UuU1VDQ0VTUzt9ZWxzZXtyZXNwb25z ZS5jb2RlPU9wZW5MYXllcnMuUHJvdG9jb2wuUmVzcG9uc2UuRkFJTFVSRTtyZXNw b25zZS5lcnJvcj1yZXN1bHQ7fX1lbHNle3Jlc3BvbnNlLmNvZGU9T3BlbkxheWVy cy5Qcm90b2NvbC5SZXNwb25zZS5GQUlMVVJFO30Kb3B0aW9ucy5jYWxsYmFjay5j YWxsKG9wdGlvbnMuc2NvcGUscmVzcG9uc2UpO319LHBhcnNlUmVzcG9uc2U6ZnVu Y3Rpb24ocmVxdWVzdCxvcHRpb25zKXt2YXIgZG9jPXJlcXVlc3QucmVzcG9uc2VY TUw7aWYoIWRvY3x8IWRvYy5kb2N1bWVudEVsZW1lbnQpe2RvYz1yZXF1ZXN0LnJl c3BvbnNlVGV4dDt9CmlmKCFkb2N8fGRvYy5sZW5ndGg8PTApe3JldHVybiBudWxs O30KdmFyIHJlc3VsdD0odGhpcy5yZWFkRm9ybWF0IT09bnVsbCk/dGhpcy5yZWFk Rm9ybWF0LnJlYWQoZG9jKTp0aGlzLmZvcm1hdC5yZWFkKGRvYyxvcHRpb25zKTtp ZighdGhpcy5mZWF0dXJlTlMpe3ZhciBmb3JtYXQ9dGhpcy5yZWFkRm9ybWF0fHx0 aGlzLmZvcm1hdDt0aGlzLmZlYXR1cmVOUz1mb3JtYXQuZmVhdHVyZU5TO2Zvcm1h dC5hdXRvQ29uZmlnPWZhbHNlO2lmKCF0aGlzLmdlb21ldHJ5TmFtZSl7dGhpcy5z ZXRHZW9tZXRyeU5hbWUoZm9ybWF0Lmdlb21ldHJ5TmFtZSk7fX0KcmV0dXJuIHJl c3VsdDt9LGNvbW1pdDpmdW5jdGlvbihmZWF0dXJlcyxvcHRpb25zKXtvcHRpb25z PU9wZW5MYXllcnMuVXRpbC5leHRlbmQoe30sb3B0aW9ucyk7T3BlbkxheWVycy5V dGlsLmFwcGx5RGVmYXVsdHMob3B0aW9ucyx0aGlzLm9wdGlvbnMpO3ZhciByZXNw b25zZT1uZXcgT3BlbkxheWVycy5Qcm90b2NvbC5SZXNwb25zZSh7cmVxdWVzdFR5 cGU6ImNvbW1pdCIscmVxRmVhdHVyZXM6ZmVhdHVyZXN9KTtyZXNwb25zZS5wcml2 PU9wZW5MYXllcnMuUmVxdWVzdC5QT1NUKHt1cmw6b3B0aW9ucy51cmwsaGVhZGVy czpvcHRpb25zLmhlYWRlcnMsZGF0YTp0aGlzLmZvcm1hdC53cml0ZShmZWF0dXJl cyxvcHRpb25zKSxjYWxsYmFjazp0aGlzLmNyZWF0ZUNhbGxiYWNrKHRoaXMuaGFu ZGxlQ29tbWl0LHJlc3BvbnNlLG9wdGlvbnMpfSk7cmV0dXJuIHJlc3BvbnNlO30s aGFuZGxlQ29tbWl0OmZ1bmN0aW9uKHJlc3BvbnNlLG9wdGlvbnMpe2lmKG9wdGlv bnMuY2FsbGJhY2spe3ZhciByZXF1ZXN0PXJlc3BvbnNlLnByaXY7dmFyIGRhdGE9 cmVxdWVzdC5yZXNwb25zZVhNTDtpZighZGF0YXx8IWRhdGEuZG9jdW1lbnRFbGVt ZW50KXtkYXRhPXJlcXVlc3QucmVzcG9uc2VUZXh0O30KdmFyIG9iaj10aGlzLmZv cm1hdC5yZWFkKGRhdGEpfHx7fTtyZXNwb25zZS5pbnNlcnRJZHM9b2JqLmluc2Vy dElkc3x8W107aWYob2JqLnN1Y2Nlc3Mpe3Jlc3BvbnNlLmNvZGU9T3BlbkxheWVy cy5Qcm90b2NvbC5SZXNwb25zZS5TVUNDRVNTO31lbHNle3Jlc3BvbnNlLmNvZGU9 T3BlbkxheWVycy5Qcm90b2NvbC5SZXNwb25zZS5GQUlMVVJFO3Jlc3BvbnNlLmVy cm9yPW9iajt9Cm9wdGlvbnMuY2FsbGJhY2suY2FsbChvcHRpb25zLnNjb3BlLHJl c3BvbnNlKTt9fSxmaWx0ZXJEZWxldGU6ZnVuY3Rpb24oZmlsdGVyLG9wdGlvbnMp e29wdGlvbnM9T3BlbkxheWVycy5VdGlsLmV4dGVuZCh7fSxvcHRpb25zKTtPcGVu TGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyhvcHRpb25zLHRoaXMub3B0aW9ucyk7 dmFyIHJlc3BvbnNlPW5ldyBPcGVuTGF5ZXJzLlByb3RvY29sLlJlc3BvbnNlKHty ZXF1ZXN0VHlwZToiY29tbWl0In0pO3ZhciByb290PXRoaXMuZm9ybWF0LmNyZWF0 ZUVsZW1lbnROU1BsdXMoIndmczpUcmFuc2FjdGlvbiIse2F0dHJpYnV0ZXM6e3Nl cnZpY2U6IldGUyIsdmVyc2lvbjp0aGlzLnZlcnNpb259fSk7dmFyIGRlbGV0ZU5v ZGU9dGhpcy5mb3JtYXQuY3JlYXRlRWxlbWVudE5TUGx1cygid2ZzOkRlbGV0ZSIs e2F0dHJpYnV0ZXM6e3R5cGVOYW1lOihvcHRpb25zLmZlYXR1cmVOUz90aGlzLmZl YXR1cmVQcmVmaXgrIjoiOiIiKSsKb3B0aW9ucy5mZWF0dXJlVHlwZX19KTtpZihv cHRpb25zLmZlYXR1cmVOUyl7ZGVsZXRlTm9kZS5zZXRBdHRyaWJ1dGUoInhtbG5z OiIrdGhpcy5mZWF0dXJlUHJlZml4LG9wdGlvbnMuZmVhdHVyZU5TKTt9CnZhciBm aWx0ZXJOb2RlPXRoaXMuZm9ybWF0LndyaXRlTm9kZSgib2djOkZpbHRlciIsZmls dGVyKTtkZWxldGVOb2RlLmFwcGVuZENoaWxkKGZpbHRlck5vZGUpO3Jvb3QuYXBw ZW5kQ2hpbGQoZGVsZXRlTm9kZSk7dmFyIGRhdGE9T3BlbkxheWVycy5Gb3JtYXQu WE1MLnByb3RvdHlwZS53cml0ZS5hcHBseSh0aGlzLmZvcm1hdCxbcm9vdF0pO3Jl dHVybiBPcGVuTGF5ZXJzLlJlcXVlc3QuUE9TVCh7dXJsOnRoaXMudXJsLGNhbGxi YWNrOm9wdGlvbnMuY2FsbGJhY2t8fGZ1bmN0aW9uKCl7fSxkYXRhOmRhdGF9KTt9 LGFib3J0OmZ1bmN0aW9uKHJlc3BvbnNlKXtpZihyZXNwb25zZSl7cmVzcG9uc2Uu cHJpdi5hYm9ydCgpO319LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuUHJvdG9jb2wu V0ZTLnYxIn0pO09wZW5MYXllcnMuSGFuZGxlci5Qb2ludD1PcGVuTGF5ZXJzLkNs YXNzKE9wZW5MYXllcnMuSGFuZGxlcix7cG9pbnQ6bnVsbCxsYXllcjpudWxsLG11 bHRpOmZhbHNlLG1vdXNlRG93bjpmYWxzZSxzdG9wcGVkRG93bjpudWxsLGxhc3RE b3duOm51bGwsbGFzdFVwOm51bGwscGVyc2lzdDpmYWxzZSxzdG9wRG93bjpmYWxz ZSxzdG9wVXA6ZmFsc2UsbGF5ZXJPcHRpb25zOm51bGwscGl4ZWxUb2xlcmFuY2U6 NSx0b3VjaDpmYWxzZSxsYXN0VG91Y2hQeDpudWxsLGluaXRpYWxpemU6ZnVuY3Rp b24oY29udHJvbCxjYWxsYmFja3Msb3B0aW9ucyl7aWYoIShvcHRpb25zJiZvcHRp b25zLmxheWVyT3B0aW9ucyYmb3B0aW9ucy5sYXllck9wdGlvbnMuc3R5bGVNYXAp KXt0aGlzLnN0eWxlPU9wZW5MYXllcnMuVXRpbC5leHRlbmQoT3BlbkxheWVycy5G ZWF0dXJlLlZlY3Rvci5zdHlsZVsnZGVmYXVsdCddLHt9KTt9Ck9wZW5MYXllcnMu SGFuZGxlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50 cyk7fSxhY3RpdmF0ZTpmdW5jdGlvbigpe2lmKCFPcGVuTGF5ZXJzLkhhbmRsZXIu cHJvdG90eXBlLmFjdGl2YXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7cmV0dXJu IGZhbHNlO30KdmFyIG9wdGlvbnM9T3BlbkxheWVycy5VdGlsLmV4dGVuZCh7ZGlz cGxheUluTGF5ZXJTd2l0Y2hlcjpmYWxzZSxjYWxjdWxhdGVJblJhbmdlOk9wZW5M YXllcnMuRnVuY3Rpb24uVHJ1ZX0sdGhpcy5sYXllck9wdGlvbnMpO3RoaXMubGF5 ZXI9bmV3IE9wZW5MYXllcnMuTGF5ZXIuVmVjdG9yKHRoaXMuQ0xBU1NfTkFNRSxv cHRpb25zKTt0aGlzLm1hcC5hZGRMYXllcih0aGlzLmxheWVyKTtyZXR1cm4gdHJ1 ZTt9LGNyZWF0ZUZlYXR1cmU6ZnVuY3Rpb24ocGl4ZWwpe3ZhciBsb25sYXQ9dGhp cy5tYXAuZ2V0TG9uTGF0RnJvbVBpeGVsKHBpeGVsKTt2YXIgZ2VvbWV0cnk9bmV3 IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQobG9ubGF0Lmxvbixsb25sYXQubGF0 KTt0aGlzLnBvaW50PW5ldyBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9yKGdlb21l dHJ5KTt0aGlzLmNhbGxiYWNrKCJjcmVhdGUiLFt0aGlzLnBvaW50Lmdlb21ldHJ5 LHRoaXMucG9pbnRdKTt0aGlzLnBvaW50Lmdlb21ldHJ5LmNsZWFyQm91bmRzKCk7 dGhpcy5sYXllci5hZGRGZWF0dXJlcyhbdGhpcy5wb2ludF0se3NpbGVudDp0cnVl fSk7fSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7aWYoIU9wZW5MYXllcnMuSGFuZGxl ci5wcm90b3R5cGUuZGVhY3RpdmF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3Jl dHVybiBmYWxzZTt9CnRoaXMuY2FuY2VsKCk7aWYodGhpcy5sYXllci5tYXAhPW51 bGwpe3RoaXMuZGVzdHJveUZlYXR1cmUodHJ1ZSk7dGhpcy5sYXllci5kZXN0cm95 KGZhbHNlKTt9CnRoaXMubGF5ZXI9bnVsbDt0aGlzLnRvdWNoPWZhbHNlO3JldHVy biB0cnVlO30sZGVzdHJveUZlYXR1cmU6ZnVuY3Rpb24oZm9yY2Upe2lmKHRoaXMu bGF5ZXImJihmb3JjZXx8IXRoaXMucGVyc2lzdCkpe3RoaXMubGF5ZXIuZGVzdHJv eUZlYXR1cmVzKCk7fQp0aGlzLnBvaW50PW51bGw7fSxkZXN0cm95UGVyc2lzdGVk RmVhdHVyZTpmdW5jdGlvbigpe3ZhciBsYXllcj10aGlzLmxheWVyO2lmKGxheWVy JiZsYXllci5mZWF0dXJlcy5sZW5ndGg+MSl7dGhpcy5sYXllci5mZWF0dXJlc1sw XS5kZXN0cm95KCk7fX0sZmluYWxpemU6ZnVuY3Rpb24oY2FuY2VsKXt2YXIga2V5 PWNhbmNlbD8iY2FuY2VsIjoiZG9uZSI7dGhpcy5tb3VzZURvd249ZmFsc2U7dGhp cy5sYXN0RG93bj1udWxsO3RoaXMubGFzdFVwPW51bGw7dGhpcy5sYXN0VG91Y2hQ eD1udWxsO3RoaXMuY2FsbGJhY2soa2V5LFt0aGlzLmdlb21ldHJ5Q2xvbmUoKV0p O3RoaXMuZGVzdHJveUZlYXR1cmUoY2FuY2VsKTt9LGNhbmNlbDpmdW5jdGlvbigp e3RoaXMuZmluYWxpemUodHJ1ZSk7fSxjbGljazpmdW5jdGlvbihldnQpe09wZW5M YXllcnMuRXZlbnQuc3RvcChldnQpO3JldHVybiBmYWxzZTt9LGRibGNsaWNrOmZ1 bmN0aW9uKGV2dCl7T3BlbkxheWVycy5FdmVudC5zdG9wKGV2dCk7cmV0dXJuIGZh bHNlO30sbW9kaWZ5RmVhdHVyZTpmdW5jdGlvbihwaXhlbCl7aWYoIXRoaXMucG9p bnQpe3RoaXMuY3JlYXRlRmVhdHVyZShwaXhlbCk7fQp2YXIgbG9ubGF0PXRoaXMu bWFwLmdldExvbkxhdEZyb21QaXhlbChwaXhlbCk7dGhpcy5wb2ludC5nZW9tZXRy eS54PWxvbmxhdC5sb247dGhpcy5wb2ludC5nZW9tZXRyeS55PWxvbmxhdC5sYXQ7 dGhpcy5jYWxsYmFjaygibW9kaWZ5IixbdGhpcy5wb2ludC5nZW9tZXRyeSx0aGlz LnBvaW50LGZhbHNlXSk7dGhpcy5wb2ludC5nZW9tZXRyeS5jbGVhckJvdW5kcygp O3RoaXMuZHJhd0ZlYXR1cmUoKTt9LGRyYXdGZWF0dXJlOmZ1bmN0aW9uKCl7dGhp cy5sYXllci5kcmF3RmVhdHVyZSh0aGlzLnBvaW50LHRoaXMuc3R5bGUpO30sZ2V0 R2VvbWV0cnk6ZnVuY3Rpb24oKXt2YXIgZ2VvbWV0cnk9dGhpcy5wb2ludCYmdGhp cy5wb2ludC5nZW9tZXRyeTtpZihnZW9tZXRyeSYmdGhpcy5tdWx0aSl7Z2VvbWV0 cnk9bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuTXVsdGlQb2ludChbZ2VvbWV0cnld KTt9CnJldHVybiBnZW9tZXRyeTt9LGdlb21ldHJ5Q2xvbmU6ZnVuY3Rpb24oKXt2 YXIgZ2VvbT10aGlzLmdldEdlb21ldHJ5KCk7cmV0dXJuIGdlb20mJmdlb20uY2xv bmUoKTt9LG1vdXNlZG93bjpmdW5jdGlvbihldnQpe3JldHVybiB0aGlzLmRvd24o ZXZ0KTt9LHRvdWNoc3RhcnQ6ZnVuY3Rpb24oZXZ0KXtpZighdGhpcy50b3VjaCl7 dGhpcy50b3VjaD10cnVlO3RoaXMubWFwLmV2ZW50cy51bih7bW91c2Vkb3duOnRo aXMubW91c2Vkb3duLG1vdXNldXA6dGhpcy5tb3VzZXVwLG1vdXNlbW92ZTp0aGlz Lm1vdXNlbW92ZSxjbGljazp0aGlzLmNsaWNrLGRibGNsaWNrOnRoaXMuZGJsY2xp Y2ssc2NvcGU6dGhpc30pO30KdGhpcy5sYXN0VG91Y2hQeD1ldnQueHk7cmV0dXJu IHRoaXMuZG93bihldnQpO30sbW91c2Vtb3ZlOmZ1bmN0aW9uKGV2dCl7cmV0dXJu IHRoaXMubW92ZShldnQpO30sdG91Y2htb3ZlOmZ1bmN0aW9uKGV2dCl7dGhpcy5s YXN0VG91Y2hQeD1ldnQueHk7cmV0dXJuIHRoaXMubW92ZShldnQpO30sbW91c2V1 cDpmdW5jdGlvbihldnQpe3JldHVybiB0aGlzLnVwKGV2dCk7fSx0b3VjaGVuZDpm dW5jdGlvbihldnQpe2V2dC54eT10aGlzLmxhc3RUb3VjaFB4O3JldHVybiB0aGlz LnVwKGV2dCk7fSxkb3duOmZ1bmN0aW9uKGV2dCl7dGhpcy5tb3VzZURvd249dHJ1 ZTt0aGlzLmxhc3REb3duPWV2dC54eTtpZighdGhpcy50b3VjaCl7dGhpcy5tb2Rp ZnlGZWF0dXJlKGV2dC54eSk7fQp0aGlzLnN0b3BwZWREb3duPXRoaXMuc3RvcERv d247cmV0dXJuIXRoaXMuc3RvcERvd247fSxtb3ZlOmZ1bmN0aW9uKGV2dCl7aWYo IXRoaXMudG91Y2gmJighdGhpcy5tb3VzZURvd258fHRoaXMuc3RvcHBlZERvd24p KXt0aGlzLm1vZGlmeUZlYXR1cmUoZXZ0Lnh5KTt9CnJldHVybiB0cnVlO30sdXA6 ZnVuY3Rpb24oZXZ0KXt0aGlzLm1vdXNlRG93bj1mYWxzZTt0aGlzLnN0b3BwZWRE b3duPXRoaXMuc3RvcERvd247aWYoIXRoaXMuY2hlY2tNb2RpZmllcnMoZXZ0KSl7 cmV0dXJuIHRydWU7fQppZih0aGlzLmxhc3RVcCYmdGhpcy5sYXN0VXAuZXF1YWxz KGV2dC54eSkpe3JldHVybiB0cnVlO30KaWYodGhpcy5sYXN0RG93biYmdGhpcy5w YXNzZXNUb2xlcmFuY2UodGhpcy5sYXN0RG93bixldnQueHksdGhpcy5waXhlbFRv bGVyYW5jZSkpe2lmKHRoaXMudG91Y2gpe3RoaXMubW9kaWZ5RmVhdHVyZShldnQu eHkpO30KaWYodGhpcy5wZXJzaXN0KXt0aGlzLmRlc3Ryb3lQZXJzaXN0ZWRGZWF0 dXJlKCk7fQp0aGlzLmxhc3RVcD1ldnQueHk7dGhpcy5maW5hbGl6ZSgpO3JldHVy biF0aGlzLnN0b3BVcDt9ZWxzZXtyZXR1cm4gdHJ1ZTt9fSxtb3VzZW91dDpmdW5j dGlvbihldnQpe2lmKE9wZW5MYXllcnMuVXRpbC5tb3VzZUxlZnQoZXZ0LHRoaXMu bWFwLmV2ZW50c0Rpdikpe3RoaXMuc3RvcHBlZERvd249dGhpcy5zdG9wRG93bjt0 aGlzLm1vdXNlRG93bj1mYWxzZTt9fSxwYXNzZXNUb2xlcmFuY2U6ZnVuY3Rpb24o cGl4ZWwxLHBpeGVsMix0b2xlcmFuY2Upe3ZhciBwYXNzZXM9dHJ1ZTtpZih0b2xl cmFuY2UhPW51bGwmJnBpeGVsMSYmcGl4ZWwyKXt2YXIgZGlzdD1waXhlbDEuZGlz dGFuY2VUbyhwaXhlbDIpO2lmKGRpc3Q+dG9sZXJhbmNlKXtwYXNzZXM9ZmFsc2U7 fX0KcmV0dXJuIHBhc3Nlczt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuSGFuZGxl ci5Qb2ludCJ9KTtPcGVuTGF5ZXJzLkhhbmRsZXIuUGF0aD1PcGVuTGF5ZXJzLkNs YXNzKE9wZW5MYXllcnMuSGFuZGxlci5Qb2ludCx7bGluZTpudWxsLG1heFZlcnRp Y2VzOm51bGwsZG91YmxlVG91Y2hUb2xlcmFuY2U6MjAsZnJlZWhhbmQ6ZmFsc2Us ZnJlZWhhbmRUb2dnbGU6J3NoaWZ0S2V5Jyx0aW1lcklkOm51bGwscmVkb1N0YWNr Om51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihjb250cm9sLGNhbGxiYWNrcyxvcHRp b25zKXtPcGVuTGF5ZXJzLkhhbmRsZXIuUG9pbnQucHJvdG90eXBlLmluaXRpYWxp emUuYXBwbHkodGhpcyxhcmd1bWVudHMpO30sY3JlYXRlRmVhdHVyZTpmdW5jdGlv bihwaXhlbCl7dmFyIGxvbmxhdD10aGlzLm1hcC5nZXRMb25MYXRGcm9tUGl4ZWwo cGl4ZWwpO3ZhciBnZW9tZXRyeT1uZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2lu dChsb25sYXQubG9uLGxvbmxhdC5sYXQpO3RoaXMucG9pbnQ9bmV3IE9wZW5MYXll cnMuRmVhdHVyZS5WZWN0b3IoZ2VvbWV0cnkpO3RoaXMubGluZT1uZXcgT3Blbkxh eWVycy5GZWF0dXJlLlZlY3RvcihuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5MaW5l U3RyaW5nKFt0aGlzLnBvaW50Lmdlb21ldHJ5XSkpO3RoaXMuY2FsbGJhY2soImNy ZWF0ZSIsW3RoaXMucG9pbnQuZ2VvbWV0cnksdGhpcy5nZXRTa2V0Y2goKV0pO3Ro aXMucG9pbnQuZ2VvbWV0cnkuY2xlYXJCb3VuZHMoKTt0aGlzLmxheWVyLmFkZEZl YXR1cmVzKFt0aGlzLmxpbmUsdGhpcy5wb2ludF0se3NpbGVudDp0cnVlfSk7fSxk ZXN0cm95RmVhdHVyZTpmdW5jdGlvbihmb3JjZSl7T3BlbkxheWVycy5IYW5kbGVy LlBvaW50LnByb3RvdHlwZS5kZXN0cm95RmVhdHVyZS5jYWxsKHRoaXMsZm9yY2Up O3RoaXMubGluZT1udWxsO30sZGVzdHJveVBlcnNpc3RlZEZlYXR1cmU6ZnVuY3Rp b24oKXt2YXIgbGF5ZXI9dGhpcy5sYXllcjtpZihsYXllciYmbGF5ZXIuZmVhdHVy ZXMubGVuZ3RoPjIpe3RoaXMubGF5ZXIuZmVhdHVyZXNbMF0uZGVzdHJveSgpO319 LHJlbW92ZVBvaW50OmZ1bmN0aW9uKCl7aWYodGhpcy5wb2ludCl7dGhpcy5sYXll ci5yZW1vdmVGZWF0dXJlcyhbdGhpcy5wb2ludF0pO319LGFkZFBvaW50OmZ1bmN0 aW9uKHBpeGVsKXt0aGlzLmxheWVyLnJlbW92ZUZlYXR1cmVzKFt0aGlzLnBvaW50 XSk7dmFyIGxvbmxhdD10aGlzLmNvbnRyb2wubWFwLmdldExvbkxhdEZyb21QaXhl bChwaXhlbCk7dGhpcy5wb2ludD1uZXcgT3BlbkxheWVycy5GZWF0dXJlLlZlY3Rv cihuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludChsb25sYXQubG9uLGxvbmxh dC5sYXQpKTt0aGlzLmxpbmUuZ2VvbWV0cnkuYWRkQ29tcG9uZW50KHRoaXMucG9p bnQuZ2VvbWV0cnksdGhpcy5saW5lLmdlb21ldHJ5LmNvbXBvbmVudHMubGVuZ3Ro KTt0aGlzLmxheWVyLmFkZEZlYXR1cmVzKFt0aGlzLnBvaW50XSk7dGhpcy5jYWxs YmFjaygicG9pbnQiLFt0aGlzLnBvaW50Lmdlb21ldHJ5LHRoaXMuZ2V0R2VvbWV0 cnkoKV0pO3RoaXMuY2FsbGJhY2soIm1vZGlmeSIsW3RoaXMucG9pbnQuZ2VvbWV0 cnksdGhpcy5nZXRTa2V0Y2goKV0pO3RoaXMuZHJhd0ZlYXR1cmUoKTtkZWxldGUg dGhpcy5yZWRvU3RhY2s7fSxpbnNlcnRYWTpmdW5jdGlvbih4LHkpe3RoaXMubGlu ZS5nZW9tZXRyeS5hZGRDb21wb25lbnQobmV3IE9wZW5MYXllcnMuR2VvbWV0cnku UG9pbnQoeCx5KSx0aGlzLmdldEN1cnJlbnRQb2ludEluZGV4KCkpO3RoaXMuZHJh d0ZlYXR1cmUoKTtkZWxldGUgdGhpcy5yZWRvU3RhY2s7fSxpbnNlcnREZWx0YVhZ OmZ1bmN0aW9uKGR4LGR5KXt2YXIgcHJldmlvdXNJbmRleD10aGlzLmdldEN1cnJl bnRQb2ludEluZGV4KCktMTt2YXIgcDA9dGhpcy5saW5lLmdlb21ldHJ5LmNvbXBv bmVudHNbcHJldmlvdXNJbmRleF07aWYocDAmJiFpc05hTihwMC54KSYmIWlzTmFO KHAwLnkpKXt0aGlzLmluc2VydFhZKHAwLngrZHgscDAueStkeSk7fX0saW5zZXJ0 RGlyZWN0aW9uTGVuZ3RoOmZ1bmN0aW9uKGRpcmVjdGlvbixsZW5ndGgpe2RpcmVj dGlvbio9TWF0aC5QSS8xODA7dmFyIGR4PWxlbmd0aCpNYXRoLmNvcyhkaXJlY3Rp b24pO3ZhciBkeT1sZW5ndGgqTWF0aC5zaW4oZGlyZWN0aW9uKTt0aGlzLmluc2Vy dERlbHRhWFkoZHgsZHkpO30saW5zZXJ0RGVmbGVjdGlvbkxlbmd0aDpmdW5jdGlv bihkZWZsZWN0aW9uLGxlbmd0aCl7dmFyIHByZXZpb3VzSW5kZXg9dGhpcy5nZXRD dXJyZW50UG9pbnRJbmRleCgpLTE7aWYocHJldmlvdXNJbmRleD4wKXt2YXIgcDE9 dGhpcy5saW5lLmdlb21ldHJ5LmNvbXBvbmVudHNbcHJldmlvdXNJbmRleF07dmFy IHAwPXRoaXMubGluZS5nZW9tZXRyeS5jb21wb25lbnRzW3ByZXZpb3VzSW5kZXgt MV07dmFyIHRoZXRhPU1hdGguYXRhbjIocDEueS1wMC55LHAxLngtcDAueCk7dGhp cy5pbnNlcnREaXJlY3Rpb25MZW5ndGgoKHRoZXRhKjE4MC9NYXRoLlBJKStkZWZs ZWN0aW9uLGxlbmd0aCk7fX0sZ2V0Q3VycmVudFBvaW50SW5kZXg6ZnVuY3Rpb24o KXtyZXR1cm4gdGhpcy5saW5lLmdlb21ldHJ5LmNvbXBvbmVudHMubGVuZ3RoLTE7 fSx1bmRvOmZ1bmN0aW9uKCl7dmFyIGdlb21ldHJ5PXRoaXMubGluZS5nZW9tZXRy eTt2YXIgY29tcG9uZW50cz1nZW9tZXRyeS5jb21wb25lbnRzO3ZhciBpbmRleD10 aGlzLmdldEN1cnJlbnRQb2ludEluZGV4KCktMTt2YXIgdGFyZ2V0PWNvbXBvbmVu dHNbaW5kZXhdO3ZhciB1bmRvbmU9Z2VvbWV0cnkucmVtb3ZlQ29tcG9uZW50KHRh cmdldCk7aWYodW5kb25lKXtpZighdGhpcy5yZWRvU3RhY2spe3RoaXMucmVkb1N0 YWNrPVtdO30KdGhpcy5yZWRvU3RhY2sucHVzaCh0YXJnZXQpO3RoaXMuZHJhd0Zl YXR1cmUoKTt9CnJldHVybiB1bmRvbmU7fSxyZWRvOmZ1bmN0aW9uKCl7dmFyIHRh cmdldD10aGlzLnJlZG9TdGFjayYmdGhpcy5yZWRvU3RhY2sucG9wKCk7aWYodGFy Z2V0KXt0aGlzLmxpbmUuZ2VvbWV0cnkuYWRkQ29tcG9uZW50KHRhcmdldCx0aGlz LmdldEN1cnJlbnRQb2ludEluZGV4KCkpO3RoaXMuZHJhd0ZlYXR1cmUoKTt9CnJl dHVybiEhdGFyZ2V0O30sZnJlZWhhbmRNb2RlOmZ1bmN0aW9uKGV2dCl7cmV0dXJu KHRoaXMuZnJlZWhhbmRUb2dnbGUmJmV2dFt0aGlzLmZyZWVoYW5kVG9nZ2xlXSk/ IXRoaXMuZnJlZWhhbmQ6dGhpcy5mcmVlaGFuZDt9LG1vZGlmeUZlYXR1cmU6ZnVu Y3Rpb24ocGl4ZWwsZHJhd2luZyl7aWYoIXRoaXMubGluZSl7dGhpcy5jcmVhdGVG ZWF0dXJlKHBpeGVsKTt9CnZhciBsb25sYXQ9dGhpcy5jb250cm9sLm1hcC5nZXRM b25MYXRGcm9tUGl4ZWwocGl4ZWwpO3RoaXMucG9pbnQuZ2VvbWV0cnkueD1sb25s YXQubG9uO3RoaXMucG9pbnQuZ2VvbWV0cnkueT1sb25sYXQubGF0O3RoaXMuY2Fs bGJhY2soIm1vZGlmeSIsW3RoaXMucG9pbnQuZ2VvbWV0cnksdGhpcy5nZXRTa2V0 Y2goKSxkcmF3aW5nXSk7dGhpcy5wb2ludC5nZW9tZXRyeS5jbGVhckJvdW5kcygp O3RoaXMuZHJhd0ZlYXR1cmUoKTt9LGRyYXdGZWF0dXJlOmZ1bmN0aW9uKCl7dGhp cy5sYXllci5kcmF3RmVhdHVyZSh0aGlzLmxpbmUsdGhpcy5zdHlsZSk7dGhpcy5s YXllci5kcmF3RmVhdHVyZSh0aGlzLnBvaW50LHRoaXMuc3R5bGUpO30sZ2V0U2tl dGNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGluZTt9LGdldEdlb21ldHJ5OmZ1 bmN0aW9uKCl7dmFyIGdlb21ldHJ5PXRoaXMubGluZSYmdGhpcy5saW5lLmdlb21l dHJ5O2lmKGdlb21ldHJ5JiZ0aGlzLm11bHRpKXtnZW9tZXRyeT1uZXcgT3Blbkxh eWVycy5HZW9tZXRyeS5NdWx0aUxpbmVTdHJpbmcoW2dlb21ldHJ5XSk7fQpyZXR1 cm4gZ2VvbWV0cnk7fSx0b3VjaHN0YXJ0OmZ1bmN0aW9uKGV2dCl7aWYodGhpcy50 aW1lcklkJiZ0aGlzLnBhc3Nlc1RvbGVyYW5jZSh0aGlzLmxhc3RUb3VjaFB4LGV2 dC54eSx0aGlzLmRvdWJsZVRvdWNoVG9sZXJhbmNlKSl7dGhpcy5maW5pc2hHZW9t ZXRyeSgpO3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50aW1lcklkKTt0aGlzLnRp bWVySWQ9bnVsbDtyZXR1cm4gZmFsc2U7fWVsc2V7aWYodGhpcy50aW1lcklkKXt3 aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGltZXJJZCk7dGhpcy50aW1lcklkPW51 bGw7fQp0aGlzLnRpbWVySWQ9d2luZG93LnNldFRpbWVvdXQoT3BlbkxheWVycy5G dW5jdGlvbi5iaW5kKGZ1bmN0aW9uKCl7dGhpcy50aW1lcklkPW51bGw7fSx0aGlz KSwzMDApO3JldHVybiBPcGVuTGF5ZXJzLkhhbmRsZXIuUG9pbnQucHJvdG90eXBl LnRvdWNoc3RhcnQuY2FsbCh0aGlzLGV2dCk7fX0sZG93bjpmdW5jdGlvbihldnQp e3ZhciBzdG9wRG93bj10aGlzLnN0b3BEb3duO2lmKHRoaXMuZnJlZWhhbmRNb2Rl KGV2dCkpe3N0b3BEb3duPXRydWU7fQppZighdGhpcy50b3VjaCYmKCF0aGlzLmxh c3REb3dufHwhdGhpcy5wYXNzZXNUb2xlcmFuY2UodGhpcy5sYXN0RG93bixldnQu eHksdGhpcy5waXhlbFRvbGVyYW5jZSkpKXt0aGlzLm1vZGlmeUZlYXR1cmUoZXZ0 Lnh5LCEhdGhpcy5sYXN0VXApO30KdGhpcy5tb3VzZURvd249dHJ1ZTt0aGlzLmxh c3REb3duPWV2dC54eTt0aGlzLnN0b3BwZWREb3duPXN0b3BEb3duO3JldHVybiFz dG9wRG93bjt9LG1vdmU6ZnVuY3Rpb24oZXZ0KXtpZih0aGlzLnN0b3BwZWREb3du JiZ0aGlzLmZyZWVoYW5kTW9kZShldnQpKXtpZih0aGlzLnBlcnNpc3Qpe3RoaXMu ZGVzdHJveVBlcnNpc3RlZEZlYXR1cmUoKTt9CnRoaXMuYWRkUG9pbnQoZXZ0Lnh5 KTtyZXR1cm4gZmFsc2U7fQppZighdGhpcy50b3VjaCYmKCF0aGlzLm1vdXNlRG93 bnx8dGhpcy5zdG9wcGVkRG93bikpe3RoaXMubW9kaWZ5RmVhdHVyZShldnQueHks ISF0aGlzLmxhc3RVcCk7fQpyZXR1cm4gdHJ1ZTt9LHVwOmZ1bmN0aW9uKGV2dCl7 aWYodGhpcy5tb3VzZURvd24mJighdGhpcy5sYXN0VXB8fCF0aGlzLmxhc3RVcC5l cXVhbHMoZXZ0Lnh5KSkpe2lmKHRoaXMuc3RvcHBlZERvd24mJnRoaXMuZnJlZWhh bmRNb2RlKGV2dCkpe2lmKHRoaXMucGVyc2lzdCl7dGhpcy5kZXN0cm95UGVyc2lz dGVkRmVhdHVyZSgpO30KdGhpcy5yZW1vdmVQb2ludCgpO3RoaXMuZmluYWxpemUo KTt9ZWxzZXtpZih0aGlzLnBhc3Nlc1RvbGVyYW5jZSh0aGlzLmxhc3REb3duLGV2 dC54eSx0aGlzLnBpeGVsVG9sZXJhbmNlKSl7aWYodGhpcy50b3VjaCl7dGhpcy5t b2RpZnlGZWF0dXJlKGV2dC54eSk7fQppZih0aGlzLmxhc3RVcD09bnVsbCYmdGhp cy5wZXJzaXN0KXt0aGlzLmRlc3Ryb3lQZXJzaXN0ZWRGZWF0dXJlKCk7fQp0aGlz LmFkZFBvaW50KGV2dC54eSk7dGhpcy5sYXN0VXA9ZXZ0Lnh5O2lmKHRoaXMubGlu ZS5nZW9tZXRyeS5jb21wb25lbnRzLmxlbmd0aD09PXRoaXMubWF4VmVydGljZXMr MSl7dGhpcy5maW5pc2hHZW9tZXRyeSgpO319fX0KdGhpcy5zdG9wcGVkRG93bj10 aGlzLnN0b3BEb3duO3RoaXMubW91c2VEb3duPWZhbHNlO3JldHVybiF0aGlzLnN0 b3BVcDt9LGZpbmlzaEdlb21ldHJ5OmZ1bmN0aW9uKCl7dmFyIGluZGV4PXRoaXMu bGluZS5nZW9tZXRyeS5jb21wb25lbnRzLmxlbmd0aC0xO3RoaXMubGluZS5nZW9t ZXRyeS5yZW1vdmVDb21wb25lbnQodGhpcy5saW5lLmdlb21ldHJ5LmNvbXBvbmVu dHNbaW5kZXhdKTt0aGlzLnJlbW92ZVBvaW50KCk7dGhpcy5maW5hbGl6ZSgpO30s ZGJsY2xpY2s6ZnVuY3Rpb24oZXZ0KXtpZighdGhpcy5mcmVlaGFuZE1vZGUoZXZ0 KSl7dGhpcy5maW5pc2hHZW9tZXRyeSgpO30KcmV0dXJuIGZhbHNlO30sQ0xBU1Nf TkFNRToiT3BlbkxheWVycy5IYW5kbGVyLlBhdGgifSk7T3BlbkxheWVycy5MYXll ci5HTUw9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkxheWVyLlZlY3Rvcix7 bG9hZGVkOmZhbHNlLGZvcm1hdDpudWxsLGZvcm1hdE9wdGlvbnM6bnVsbCxpbml0 aWFsaXplOmZ1bmN0aW9uKG5hbWUsdXJsLG9wdGlvbnMpe3ZhciBuZXdBcmd1bWVu dHM9W107bmV3QXJndW1lbnRzLnB1c2gobmFtZSxvcHRpb25zKTtPcGVuTGF5ZXJz LkxheWVyLlZlY3Rvci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLG5l d0FyZ3VtZW50cyk7dGhpcy51cmw9dXJsO30sc2V0VmlzaWJpbGl0eTpmdW5jdGlv bih2aXNpYmlsaXR5LG5vRXZlbnQpe09wZW5MYXllcnMuTGF5ZXIuVmVjdG9yLnBy b3RvdHlwZS5zZXRWaXNpYmlsaXR5LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZih0 aGlzLnZpc2liaWxpdHkmJiF0aGlzLmxvYWRlZCl7dGhpcy5sb2FkR01MKCk7fX0s bW92ZVRvOmZ1bmN0aW9uKGJvdW5kcyx6b29tQ2hhbmdlZCxtaW5vcil7T3Blbkxh eWVycy5MYXllci5WZWN0b3IucHJvdG90eXBlLm1vdmVUby5hcHBseSh0aGlzLGFy Z3VtZW50cyk7aWYodGhpcy52aXNpYmlsaXR5JiYhdGhpcy5sb2FkZWQpe3RoaXMu bG9hZEdNTCgpO319LGxvYWRHTUw6ZnVuY3Rpb24oKXtpZighdGhpcy5sb2FkZWQp e3RoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgibG9hZHN0YXJ0Iik7T3BlbkxheWVy cy5SZXF1ZXN0LkdFVCh7dXJsOnRoaXMudXJsLHN1Y2Nlc3M6dGhpcy5yZXF1ZXN0 U3VjY2VzcyxmYWlsdXJlOnRoaXMucmVxdWVzdEZhaWx1cmUsc2NvcGU6dGhpc30p O3RoaXMubG9hZGVkPXRydWU7fX0sc2V0VXJsOmZ1bmN0aW9uKHVybCl7dGhpcy51 cmw9dXJsO3RoaXMuZGVzdHJveUZlYXR1cmVzKCk7dGhpcy5sb2FkZWQ9ZmFsc2U7 dGhpcy5sb2FkR01MKCk7fSxyZXF1ZXN0U3VjY2VzczpmdW5jdGlvbihyZXF1ZXN0 KXt2YXIgZG9jPXJlcXVlc3QucmVzcG9uc2VYTUw7aWYoIWRvY3x8IWRvYy5kb2N1 bWVudEVsZW1lbnQpe2RvYz1yZXF1ZXN0LnJlc3BvbnNlVGV4dDt9CnZhciBvcHRp b25zPXt9O09wZW5MYXllcnMuVXRpbC5leHRlbmQob3B0aW9ucyx0aGlzLmZvcm1h dE9wdGlvbnMpO2lmKHRoaXMubWFwJiYhdGhpcy5wcm9qZWN0aW9uLmVxdWFscyh0 aGlzLm1hcC5nZXRQcm9qZWN0aW9uT2JqZWN0KCkpKXtvcHRpb25zLmV4dGVybmFs UHJvamVjdGlvbj10aGlzLnByb2plY3Rpb247b3B0aW9ucy5pbnRlcm5hbFByb2pl Y3Rpb249dGhpcy5tYXAuZ2V0UHJvamVjdGlvbk9iamVjdCgpO30KdmFyIGdtbD10 aGlzLmZvcm1hdD9uZXcgdGhpcy5mb3JtYXQob3B0aW9ucyk6bmV3IE9wZW5MYXll cnMuRm9ybWF0LkdNTChvcHRpb25zKTt0aGlzLmFkZEZlYXR1cmVzKGdtbC5yZWFk KGRvYykpO3RoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgibG9hZGVuZCIpO30scmVx dWVzdEZhaWx1cmU6ZnVuY3Rpb24ocmVxdWVzdCl7T3BlbkxheWVycy5Db25zb2xl LnVzZXJFcnJvcihPcGVuTGF5ZXJzLmkxOG4oImVycm9yTG9hZGluZ0dNTCIseyd1 cmwnOnRoaXMudXJsfSkpO3RoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgibG9hZGVu ZCIpO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5MYXllci5HTUwifSk7T3Blbkxh eWVycy5Gb3JtYXQuQ29udGV4dD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMu Rm9ybWF0LlhNTC5WZXJzaW9uZWRPR0Mse2xheWVyT3B0aW9uczpudWxsLGxheWVy UGFyYW1zOm51bGwscmVhZDpmdW5jdGlvbihkYXRhLG9wdGlvbnMpe3ZhciBjb250 ZXh0PU9wZW5MYXllcnMuRm9ybWF0LlhNTC5WZXJzaW9uZWRPR0MucHJvdG90eXBl LnJlYWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBtYXA7aWYob3B0aW9ucyYm b3B0aW9ucy5tYXApe3RoaXMuY29udGV4dD1jb250ZXh0O2lmKG9wdGlvbnMubWFw IGluc3RhbmNlb2YgT3BlbkxheWVycy5NYXApe21hcD10aGlzLm1lcmdlQ29udGV4 dFRvTWFwKGNvbnRleHQsb3B0aW9ucy5tYXApO31lbHNle3ZhciBtYXBPcHRpb25z PW9wdGlvbnMubWFwO2lmKE9wZW5MYXllcnMuVXRpbC5pc0VsZW1lbnQobWFwT3B0 aW9ucyl8fHR5cGVvZiBtYXBPcHRpb25zPT0ic3RyaW5nIil7bWFwT3B0aW9ucz17 ZGl2Om1hcE9wdGlvbnN9O30KbWFwPXRoaXMuY29udGV4dFRvTWFwKGNvbnRleHQs bWFwT3B0aW9ucyk7fX1lbHNle21hcD1jb250ZXh0O30KcmV0dXJuIG1hcDt9LGdl dExheWVyRnJvbUNvbnRleHQ6ZnVuY3Rpb24obGF5ZXJDb250ZXh0KXt2YXIgaSxs ZW47dmFyIG9wdGlvbnM9e3F1ZXJ5YWJsZTpsYXllckNvbnRleHQucXVlcnlhYmxl LHZpc2liaWxpdHk6bGF5ZXJDb250ZXh0LnZpc2liaWxpdHksbWF4RXh0ZW50Omxh eWVyQ29udGV4dC5tYXhFeHRlbnQsbWV0YWRhdGE6T3BlbkxheWVycy5VdGlsLmFw cGx5RGVmYXVsdHMobGF5ZXJDb250ZXh0Lm1ldGFkYXRhLHtzdHlsZXM6bGF5ZXJD b250ZXh0LnN0eWxlcyxmb3JtYXRzOmxheWVyQ29udGV4dC5mb3JtYXRzLCJhYnN0 cmFjdCI6bGF5ZXJDb250ZXh0WyJhYnN0cmFjdCJdLGRhdGFVUkw6bGF5ZXJDb250 ZXh0LmRhdGFVUkx9KSxudW1ab29tTGV2ZWxzOmxheWVyQ29udGV4dC5udW1ab29t TGV2ZWxzLHVuaXRzOmxheWVyQ29udGV4dC51bml0cyxpc0Jhc2VMYXllcjpsYXll ckNvbnRleHQuaXNCYXNlTGF5ZXIsb3BhY2l0eTpsYXllckNvbnRleHQub3BhY2l0 eSxkaXNwbGF5SW5MYXllclN3aXRjaGVyOmxheWVyQ29udGV4dC5kaXNwbGF5SW5M YXllclN3aXRjaGVyLHNpbmdsZVRpbGU6bGF5ZXJDb250ZXh0LnNpbmdsZVRpbGUs dGlsZVNpemU6KGxheWVyQ29udGV4dC50aWxlU2l6ZSk/bmV3IE9wZW5MYXllcnMu U2l6ZShsYXllckNvbnRleHQudGlsZVNpemUud2lkdGgsbGF5ZXJDb250ZXh0LnRp bGVTaXplLmhlaWdodCk6dW5kZWZpbmVkLG1pblNjYWxlOmxheWVyQ29udGV4dC5t aW5TY2FsZXx8bGF5ZXJDb250ZXh0Lm1heFNjYWxlRGVub21pbmF0b3IsbWF4U2Nh bGU6bGF5ZXJDb250ZXh0Lm1heFNjYWxlfHxsYXllckNvbnRleHQubWluU2NhbGVE ZW5vbWluYXRvcixzcnM6bGF5ZXJDb250ZXh0LnNycyxkaW1lbnNpb25zOmxheWVy Q29udGV4dC5kaW1lbnNpb25zLG1ldGFkYXRhVVJMOmxheWVyQ29udGV4dC5tZXRh ZGF0YVVSTH07aWYodGhpcy5sYXllck9wdGlvbnMpe09wZW5MYXllcnMuVXRpbC5h cHBseURlZmF1bHRzKG9wdGlvbnMsdGhpcy5sYXllck9wdGlvbnMpO30KdmFyIHBh cmFtcz17bGF5ZXJzOmxheWVyQ29udGV4dC5uYW1lLHRyYW5zcGFyZW50OmxheWVy Q29udGV4dC50cmFuc3BhcmVudCx2ZXJzaW9uOmxheWVyQ29udGV4dC52ZXJzaW9u fTtpZihsYXllckNvbnRleHQuZm9ybWF0cyYmbGF5ZXJDb250ZXh0LmZvcm1hdHMu bGVuZ3RoPjApe3BhcmFtcy5mb3JtYXQ9bGF5ZXJDb250ZXh0LmZvcm1hdHNbMF0u dmFsdWU7Zm9yKGk9MCxsZW49bGF5ZXJDb250ZXh0LmZvcm1hdHMubGVuZ3RoO2k8 bGVuO2krKyl7dmFyIGZvcm1hdD1sYXllckNvbnRleHQuZm9ybWF0c1tpXTtpZihm b3JtYXQuY3VycmVudD09dHJ1ZSl7cGFyYW1zLmZvcm1hdD1mb3JtYXQudmFsdWU7 YnJlYWs7fX19CmlmKGxheWVyQ29udGV4dC5zdHlsZXMmJmxheWVyQ29udGV4dC5z dHlsZXMubGVuZ3RoPjApe2ZvcihpPTAsbGVuPWxheWVyQ29udGV4dC5zdHlsZXMu bGVuZ3RoO2k8bGVuO2krKyl7dmFyIHN0eWxlPWxheWVyQ29udGV4dC5zdHlsZXNb aV07aWYoc3R5bGUuY3VycmVudD09dHJ1ZSl7aWYoc3R5bGUuaHJlZil7cGFyYW1z LnNsZD1zdHlsZS5ocmVmO31lbHNlIGlmKHN0eWxlLmJvZHkpe3BhcmFtcy5zbGRf Ym9keT1zdHlsZS5ib2R5O31lbHNle3BhcmFtcy5zdHlsZXM9c3R5bGUubmFtZTt9 CmJyZWFrO319fQppZih0aGlzLmxheWVyUGFyYW1zKXtPcGVuTGF5ZXJzLlV0aWwu YXBwbHlEZWZhdWx0cyhwYXJhbXMsdGhpcy5sYXllclBhcmFtcyk7fQp2YXIgbGF5 ZXI9bnVsbDt2YXIgc2VydmljZT1sYXllckNvbnRleHQuc2VydmljZTtpZihzZXJ2 aWNlPT1PcGVuTGF5ZXJzLkZvcm1hdC5Db250ZXh0LnNlcnZpY2VUeXBlcy5XRlMp e29wdGlvbnMuc3RyYXRlZ2llcz1bbmV3IE9wZW5MYXllcnMuU3RyYXRlZ3kuQkJP WCgpXTtvcHRpb25zLnByb3RvY29sPW5ldyBPcGVuTGF5ZXJzLlByb3RvY29sLldG Uyh7dXJsOmxheWVyQ29udGV4dC51cmwsZmVhdHVyZVByZWZpeDpsYXllckNvbnRl eHQubmFtZS5zcGxpdCgiOiIpWzBdLGZlYXR1cmVUeXBlOmxheWVyQ29udGV4dC5u YW1lLnNwbGl0KCI6IikucG9wKCl9KTtsYXllcj1uZXcgT3BlbkxheWVycy5MYXll ci5WZWN0b3IobGF5ZXJDb250ZXh0LnRpdGxlfHxsYXllckNvbnRleHQubmFtZSxv cHRpb25zKTt9ZWxzZSBpZihzZXJ2aWNlPT1PcGVuTGF5ZXJzLkZvcm1hdC5Db250 ZXh0LnNlcnZpY2VUeXBlcy5LTUwpe29wdGlvbnMuc3RyYXRlZ2llcz1bbmV3IE9w ZW5MYXllcnMuU3RyYXRlZ3kuRml4ZWQoKV07b3B0aW9ucy5wcm90b2NvbD1uZXcg T3BlbkxheWVycy5Qcm90b2NvbC5IVFRQKHt1cmw6bGF5ZXJDb250ZXh0LnVybCxm b3JtYXQ6bmV3IE9wZW5MYXllcnMuRm9ybWF0LktNTCgpfSk7bGF5ZXI9bmV3IE9w ZW5MYXllcnMuTGF5ZXIuVmVjdG9yKGxheWVyQ29udGV4dC50aXRsZXx8bGF5ZXJD b250ZXh0Lm5hbWUsb3B0aW9ucyk7fWVsc2UgaWYoc2VydmljZT09T3BlbkxheWVy cy5Gb3JtYXQuQ29udGV4dC5zZXJ2aWNlVHlwZXMuR01MKXtvcHRpb25zLnN0cmF0 ZWdpZXM9W25ldyBPcGVuTGF5ZXJzLlN0cmF0ZWd5LkZpeGVkKCldO29wdGlvbnMu cHJvdG9jb2w9bmV3IE9wZW5MYXllcnMuUHJvdG9jb2wuSFRUUCh7dXJsOmxheWVy Q29udGV4dC51cmwsZm9ybWF0Om5ldyBPcGVuTGF5ZXJzLkZvcm1hdC5HTUwoKX0p O2xheWVyPW5ldyBPcGVuTGF5ZXJzLkxheWVyLlZlY3RvcihsYXllckNvbnRleHQu dGl0bGV8fGxheWVyQ29udGV4dC5uYW1lLG9wdGlvbnMpO31lbHNlIGlmKGxheWVy Q29udGV4dC5mZWF0dXJlcyl7bGF5ZXI9bmV3IE9wZW5MYXllcnMuTGF5ZXIuVmVj dG9yKGxheWVyQ29udGV4dC50aXRsZXx8bGF5ZXJDb250ZXh0Lm5hbWUsb3B0aW9u cyk7bGF5ZXIuYWRkRmVhdHVyZXMobGF5ZXJDb250ZXh0LmZlYXR1cmVzKTt9ZWxz ZSBpZihsYXllckNvbnRleHQuY2F0ZWdvcnlMYXllciE9PXRydWUpe2xheWVyPW5l dyBPcGVuTGF5ZXJzLkxheWVyLldNUyhsYXllckNvbnRleHQudGl0bGV8fGxheWVy Q29udGV4dC5uYW1lLGxheWVyQ29udGV4dC51cmwscGFyYW1zLG9wdGlvbnMpO30K cmV0dXJuIGxheWVyO30sZ2V0TGF5ZXJzRnJvbUNvbnRleHQ6ZnVuY3Rpb24obGF5 ZXJzQ29udGV4dCl7dmFyIGxheWVycz1bXTtmb3IodmFyIGk9MCxsZW49bGF5ZXJz Q29udGV4dC5sZW5ndGg7aTxsZW47aSsrKXt2YXIgbGF5ZXI9dGhpcy5nZXRMYXll ckZyb21Db250ZXh0KGxheWVyc0NvbnRleHRbaV0pO2lmKGxheWVyIT09bnVsbCl7 bGF5ZXJzLnB1c2gobGF5ZXIpO319CnJldHVybiBsYXllcnM7fSxjb250ZXh0VG9N YXA6ZnVuY3Rpb24oY29udGV4dCxvcHRpb25zKXtvcHRpb25zPU9wZW5MYXllcnMu VXRpbC5hcHBseURlZmF1bHRzKHttYXhFeHRlbnQ6Y29udGV4dC5tYXhFeHRlbnQs cHJvamVjdGlvbjpjb250ZXh0LnByb2plY3Rpb24sdW5pdHM6Y29udGV4dC51bml0 c30sb3B0aW9ucyk7aWYob3B0aW9ucy5tYXhFeHRlbnQpe29wdGlvbnMubWF4UmVz b2x1dGlvbj1vcHRpb25zLm1heEV4dGVudC5nZXRXaWR0aCgpL09wZW5MYXllcnMu TWFwLlRJTEVfV0lEVEg7fQp2YXIgbWV0YWRhdGE9e2NvbnRhY3RJbmZvcm1hdGlv bjpjb250ZXh0LmNvbnRhY3RJbmZvcm1hdGlvbiwiYWJzdHJhY3QiOmNvbnRleHRb ImFic3RyYWN0Il0sa2V5d29yZHM6Y29udGV4dC5rZXl3b3Jkcyxsb2dvOmNvbnRl eHQubG9nbyxkZXNjcmlwdGlvblVSTDpjb250ZXh0LmRlc2NyaXB0aW9uVVJMfQpv cHRpb25zLm1ldGFkYXRhPW1ldGFkYXRhO3ZhciBtYXA9bmV3IE9wZW5MYXllcnMu TWFwKG9wdGlvbnMpO21hcC5hZGRMYXllcnModGhpcy5nZXRMYXllcnNGcm9tQ29u dGV4dChjb250ZXh0LmxheWVyc0NvbnRleHQpKTttYXAuc2V0Q2VudGVyKGNvbnRl eHQuYm91bmRzLmdldENlbnRlckxvbkxhdCgpLG1hcC5nZXRab29tRm9yRXh0ZW50 KGNvbnRleHQuYm91bmRzLHRydWUpKTtyZXR1cm4gbWFwO30sbWVyZ2VDb250ZXh0 VG9NYXA6ZnVuY3Rpb24oY29udGV4dCxtYXApe21hcC5hZGRMYXllcnModGhpcy5n ZXRMYXllcnNGcm9tQ29udGV4dChjb250ZXh0LmxheWVyc0NvbnRleHQpKTtyZXR1 cm4gbWFwO30sd3JpdGU6ZnVuY3Rpb24ob2JqLG9wdGlvbnMpe29iaj10aGlzLnRv Q29udGV4dChvYmopO3JldHVybiBPcGVuTGF5ZXJzLkZvcm1hdC5YTUwuVmVyc2lv bmVkT0dDLnByb3RvdHlwZS53cml0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fSxD TEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5Db250ZXh0In0pO09wZW5MYXll cnMuRm9ybWF0LkNvbnRleHQuc2VydmljZVR5cGVzPXsiV01TIjoidXJuOm9nYzpz ZXJ2aWNlVHlwZTpXTVMiLCJXRlMiOiJ1cm46b2djOnNlcnZpY2VUeXBlOldGUyIs IldDUyI6InVybjpvZ2M6c2VydmljZVR5cGU6V0NTIiwiR01MIjoidXJuOm9nYzpz ZXJ2aWNlVHlwZTpHTUwiLCJTTEQiOiJ1cm46b2djOnNlcnZpY2VUeXBlOlNMRCIs IkZFUyI6InVybjpvZ2M6c2VydmljZVR5cGU6RkVTIiwiS01MIjoidXJuOm9nYzpz ZXJ2aWNlVHlwZTpLTUwifTtPcGVuTGF5ZXJzLkZvcm1hdC5XTUM9T3BlbkxheWVy cy5DbGFzcyhPcGVuTGF5ZXJzLkZvcm1hdC5Db250ZXh0LHtkZWZhdWx0VmVyc2lv bjoiMS4xLjAiLGxheWVyVG9Db250ZXh0OmZ1bmN0aW9uKGxheWVyKXt2YXIgcGFy c2VyPXRoaXMuZ2V0UGFyc2VyKCk7dmFyIGxheWVyQ29udGV4dD17cXVlcnlhYmxl OmxheWVyLnF1ZXJ5YWJsZSx2aXNpYmlsaXR5OmxheWVyLnZpc2liaWxpdHksbmFt ZTpsYXllci5wYXJhbXNbIkxBWUVSUyJdLHRpdGxlOmxheWVyLm5hbWUsImFic3Ry YWN0IjpsYXllci5tZXRhZGF0YVsiYWJzdHJhY3QiXSxkYXRhVVJMOmxheWVyLm1l dGFkYXRhLmRhdGFVUkwsbWV0YWRhdGFVUkw6bGF5ZXIubWV0YWRhdGFVUkwsc2Vy dmVyOnt2ZXJzaW9uOmxheWVyLnBhcmFtc1siVkVSU0lPTiJdLHVybDpsYXllci51 cmx9LG1heEV4dGVudDpsYXllci5tYXhFeHRlbnQsdHJhbnNwYXJlbnQ6bGF5ZXIu cGFyYW1zWyJUUkFOU1BBUkVOVCJdLG51bVpvb21MZXZlbHM6bGF5ZXIubnVtWm9v bUxldmVscyx1bml0czpsYXllci51bml0cyxpc0Jhc2VMYXllcjpsYXllci5pc0Jh c2VMYXllcixvcGFjaXR5OmxheWVyLm9wYWNpdHksZGlzcGxheUluTGF5ZXJTd2l0 Y2hlcjpsYXllci5kaXNwbGF5SW5MYXllclN3aXRjaGVyLHNpbmdsZVRpbGU6bGF5 ZXIuc2luZ2xlVGlsZSx0aWxlU2l6ZToobGF5ZXIuc2luZ2xlVGlsZXx8IWxheWVy LnRpbGVTaXplKT91bmRlZmluZWQ6e3dpZHRoOmxheWVyLnRpbGVTaXplLncsaGVp Z2h0OmxheWVyLnRpbGVTaXplLmh9LG1pblNjYWxlOihsYXllci5vcHRpb25zLnJl c29sdXRpb25zfHxsYXllci5vcHRpb25zLnNjYWxlc3x8bGF5ZXIub3B0aW9ucy5t YXhSZXNvbHV0aW9ufHxsYXllci5vcHRpb25zLm1pblNjYWxlKT9sYXllci5taW5T Y2FsZTp1bmRlZmluZWQsbWF4U2NhbGU6KGxheWVyLm9wdGlvbnMucmVzb2x1dGlv bnN8fGxheWVyLm9wdGlvbnMuc2NhbGVzfHxsYXllci5vcHRpb25zLm1pblJlc29s dXRpb258fGxheWVyLm9wdGlvbnMubWF4U2NhbGUpP2xheWVyLm1heFNjYWxlOnVu ZGVmaW5lZCxmb3JtYXRzOltdLHN0eWxlczpbXSxzcnM6bGF5ZXIuc3JzLGRpbWVu c2lvbnM6bGF5ZXIuZGltZW5zaW9uc307aWYobGF5ZXIubWV0YWRhdGEuc2VydmVy dGl0bGUpe2xheWVyQ29udGV4dC5zZXJ2ZXIudGl0bGU9bGF5ZXIubWV0YWRhdGEu c2VydmVydGl0bGU7fQppZihsYXllci5tZXRhZGF0YS5mb3JtYXRzJiZsYXllci5t ZXRhZGF0YS5mb3JtYXRzLmxlbmd0aD4wKXtmb3IodmFyIGk9MCxsZW49bGF5ZXIu bWV0YWRhdGEuZm9ybWF0cy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgZm9ybWF0PWxh eWVyLm1ldGFkYXRhLmZvcm1hdHNbaV07bGF5ZXJDb250ZXh0LmZvcm1hdHMucHVz aCh7dmFsdWU6Zm9ybWF0LnZhbHVlLGN1cnJlbnQ6KGZvcm1hdC52YWx1ZT09bGF5 ZXIucGFyYW1zWyJGT1JNQVQiXSl9KTt9fWVsc2V7bGF5ZXJDb250ZXh0LmZvcm1h dHMucHVzaCh7dmFsdWU6bGF5ZXIucGFyYW1zWyJGT1JNQVQiXSxjdXJyZW50OnRy dWV9KTt9CmlmKGxheWVyLm1ldGFkYXRhLnN0eWxlcyYmbGF5ZXIubWV0YWRhdGEu c3R5bGVzLmxlbmd0aD4wKXtmb3IodmFyIGk9MCxsZW49bGF5ZXIubWV0YWRhdGEu c3R5bGVzLmxlbmd0aDtpPGxlbjtpKyspe3ZhciBzdHlsZT1sYXllci5tZXRhZGF0 YS5zdHlsZXNbaV07aWYoKHN0eWxlLmhyZWY9PWxheWVyLnBhcmFtc1siU0xEIl0p fHwoc3R5bGUuYm9keT09bGF5ZXIucGFyYW1zWyJTTERfQk9EWSJdKXx8KHN0eWxl Lm5hbWU9PWxheWVyLnBhcmFtc1siU1RZTEVTIl0pKXtzdHlsZS5jdXJyZW50PXRy dWU7fWVsc2V7c3R5bGUuY3VycmVudD1mYWxzZTt9CmxheWVyQ29udGV4dC5zdHls ZXMucHVzaChzdHlsZSk7fX1lbHNle2xheWVyQ29udGV4dC5zdHlsZXMucHVzaCh7 aHJlZjpsYXllci5wYXJhbXNbIlNMRCJdLGJvZHk6bGF5ZXIucGFyYW1zWyJTTERf Qk9EWSJdLG5hbWU6bGF5ZXIucGFyYW1zWyJTVFlMRVMiXXx8cGFyc2VyLmRlZmF1 bHRTdHlsZU5hbWUsdGl0bGU6cGFyc2VyLmRlZmF1bHRTdHlsZVRpdGxlLGN1cnJl bnQ6dHJ1ZX0pO30KcmV0dXJuIGxheWVyQ29udGV4dDt9LHRvQ29udGV4dDpmdW5j dGlvbihvYmope3ZhciBjb250ZXh0PXt9O3ZhciBsYXllcnM9b2JqLmxheWVycztp ZihvYmouQ0xBU1NfTkFNRT09Ik9wZW5MYXllcnMuTWFwIil7dmFyIG1ldGFkYXRh PW9iai5tZXRhZGF0YXx8e307Y29udGV4dC5zaXplPW9iai5nZXRTaXplKCk7Y29u dGV4dC5ib3VuZHM9b2JqLmdldEV4dGVudCgpO2NvbnRleHQucHJvamVjdGlvbj1v YmoucHJvamVjdGlvbjtjb250ZXh0LnRpdGxlPW9iai50aXRsZTtjb250ZXh0Lmtl eXdvcmRzPW1ldGFkYXRhLmtleXdvcmRzO2NvbnRleHRbImFic3RyYWN0Il09bWV0 YWRhdGFbImFic3RyYWN0Il07Y29udGV4dC5sb2dvPW1ldGFkYXRhLmxvZ287Y29u dGV4dC5kZXNjcmlwdGlvblVSTD1tZXRhZGF0YS5kZXNjcmlwdGlvblVSTDtjb250 ZXh0LmNvbnRhY3RJbmZvcm1hdGlvbj1tZXRhZGF0YS5jb250YWN0SW5mb3JtYXRp b247Y29udGV4dC5tYXhFeHRlbnQ9b2JqLm1heEV4dGVudDt9ZWxzZXtPcGVuTGF5 ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyhjb250ZXh0LG9iaik7aWYoY29udGV4dC5s YXllcnMhPXVuZGVmaW5lZCl7ZGVsZXRlKGNvbnRleHQubGF5ZXJzKTt9fQppZihj b250ZXh0LmxheWVyc0NvbnRleHQ9PXVuZGVmaW5lZCl7Y29udGV4dC5sYXllcnND b250ZXh0PVtdO30KaWYobGF5ZXJzIT11bmRlZmluZWQmJk9wZW5MYXllcnMuVXRp bC5pc0FycmF5KGxheWVycykpe2Zvcih2YXIgaT0wLGxlbj1sYXllcnMubGVuZ3Ro O2k8bGVuO2krKyl7dmFyIGxheWVyPWxheWVyc1tpXTtpZihsYXllciBpbnN0YW5j ZW9mIE9wZW5MYXllcnMuTGF5ZXIuV01TKXtjb250ZXh0LmxheWVyc0NvbnRleHQu cHVzaCh0aGlzLmxheWVyVG9Db250ZXh0KGxheWVyKSk7fX19CnJldHVybiBjb250 ZXh0O30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3JtYXQuV01DIn0pO09wZW5M YXllcnMuRm9ybWF0LldNQy52MT1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMu Rm9ybWF0LlhNTCx7bmFtZXNwYWNlczp7b2w6Imh0dHA6Ly9vcGVubGF5ZXJzLm9y Zy9jb250ZXh0Iix3bWM6Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvY29udGV4dCIs c2xkOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3NsZCIseGxpbms6Imh0dHA6Ly93 d3cudzMub3JnLzE5OTkveGxpbmsiLHhzaToiaHR0cDovL3d3dy53My5vcmcvMjAw MS9YTUxTY2hlbWEtaW5zdGFuY2UifSxzY2hlbWFMb2NhdGlvbjoiIixnZXROYW1l c3BhY2VQcmVmaXg6ZnVuY3Rpb24odXJpKXt2YXIgcHJlZml4PW51bGw7aWYodXJp PT1udWxsKXtwcmVmaXg9dGhpcy5uYW1lc3BhY2VzW3RoaXMuZGVmYXVsdFByZWZp eF07fWVsc2V7Zm9yKHByZWZpeCBpbiB0aGlzLm5hbWVzcGFjZXMpe2lmKHRoaXMu bmFtZXNwYWNlc1twcmVmaXhdPT11cmkpe2JyZWFrO319fQpyZXR1cm4gcHJlZml4 O30sZGVmYXVsdFByZWZpeDoid21jIixyb290UHJlZml4Om51bGwsZGVmYXVsdFN0 eWxlTmFtZToiIixkZWZhdWx0U3R5bGVUaXRsZToiRGVmYXVsdCIsaW5pdGlhbGl6 ZTpmdW5jdGlvbihvcHRpb25zKXtPcGVuTGF5ZXJzLkZvcm1hdC5YTUwucHJvdG90 eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxbb3B0aW9uc10pO30scmVhZDpmdW5j dGlvbihkYXRhKXtpZih0eXBlb2YgZGF0YT09InN0cmluZyIpe2RhdGE9T3Blbkxh eWVycy5Gb3JtYXQuWE1MLnByb3RvdHlwZS5yZWFkLmFwcGx5KHRoaXMsW2RhdGFd KTt9CnZhciByb290PWRhdGEuZG9jdW1lbnRFbGVtZW50O3RoaXMucm9vdFByZWZp eD1yb290LnByZWZpeDt2YXIgY29udGV4dD17dmVyc2lvbjpyb290LmdldEF0dHJp YnV0ZSgidmVyc2lvbiIpfTt0aGlzLnJ1bkNoaWxkTm9kZXMoY29udGV4dCxyb290 KTtyZXR1cm4gY29udGV4dDt9LHJ1bkNoaWxkTm9kZXM6ZnVuY3Rpb24ob2JqLG5v ZGUpe3ZhciBjaGlsZHJlbj1ub2RlLmNoaWxkTm9kZXM7dmFyIGNoaWxkTm9kZSxw cm9jZXNzb3IscHJlZml4LGxvY2FsO2Zvcih2YXIgaT0wLGxlbj1jaGlsZHJlbi5s ZW5ndGg7aTxsZW47KytpKXtjaGlsZE5vZGU9Y2hpbGRyZW5baV07aWYoY2hpbGRO b2RlLm5vZGVUeXBlPT0xKXtwcmVmaXg9dGhpcy5nZXROYW1lc3BhY2VQcmVmaXgo Y2hpbGROb2RlLm5hbWVzcGFjZVVSSSk7bG9jYWw9Y2hpbGROb2RlLm5vZGVOYW1l LnNwbGl0KCI6IikucG9wKCk7cHJvY2Vzc29yPXRoaXNbInJlYWRfIitwcmVmaXgr Il8iK2xvY2FsXTtpZihwcm9jZXNzb3Ipe3Byb2Nlc3Nvci5hcHBseSh0aGlzLFtv YmosY2hpbGROb2RlXSk7fX19fSxyZWFkX3dtY19HZW5lcmFsOmZ1bmN0aW9uKGNv bnRleHQsbm9kZSl7dGhpcy5ydW5DaGlsZE5vZGVzKGNvbnRleHQsbm9kZSk7fSxy ZWFkX3dtY19Cb3VuZGluZ0JveDpmdW5jdGlvbihjb250ZXh0LG5vZGUpe2NvbnRl eHQucHJvamVjdGlvbj1ub2RlLmdldEF0dHJpYnV0ZSgiU1JTIik7Y29udGV4dC5i b3VuZHM9bmV3IE9wZW5MYXllcnMuQm91bmRzKHBhcnNlRmxvYXQobm9kZS5nZXRB dHRyaWJ1dGUoIm1pbngiKSkscGFyc2VGbG9hdChub2RlLmdldEF0dHJpYnV0ZSgi bWlueSIpKSxwYXJzZUZsb2F0KG5vZGUuZ2V0QXR0cmlidXRlKCJtYXh4IikpLHBh cnNlRmxvYXQobm9kZS5nZXRBdHRyaWJ1dGUoIm1heHkiKSkpO30scmVhZF93bWNf TGF5ZXJMaXN0OmZ1bmN0aW9uKGNvbnRleHQsbm9kZSl7Y29udGV4dC5sYXllcnND b250ZXh0PVtdO3RoaXMucnVuQ2hpbGROb2Rlcyhjb250ZXh0LG5vZGUpO30scmVh ZF93bWNfTGF5ZXI6ZnVuY3Rpb24oY29udGV4dCxub2RlKXt2YXIgbGF5ZXJDb250 ZXh0PXt2aXNpYmlsaXR5Oihub2RlLmdldEF0dHJpYnV0ZSgiaGlkZGVuIikhPSIx IikscXVlcnlhYmxlOihub2RlLmdldEF0dHJpYnV0ZSgicXVlcnlhYmxlIik9PSIx IiksZm9ybWF0czpbXSxzdHlsZXM6W10sbWV0YWRhdGE6e319O3RoaXMucnVuQ2hp bGROb2RlcyhsYXllckNvbnRleHQsbm9kZSk7Y29udGV4dC5sYXllcnNDb250ZXh0 LnB1c2gobGF5ZXJDb250ZXh0KTt9LHJlYWRfd21jX0V4dGVuc2lvbjpmdW5jdGlv bihvYmosbm9kZSl7dGhpcy5ydW5DaGlsZE5vZGVzKG9iaixub2RlKTt9LHJlYWRf b2xfdW5pdHM6ZnVuY3Rpb24obGF5ZXJDb250ZXh0LG5vZGUpe2xheWVyQ29udGV4 dC51bml0cz10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7fSxyZWFkX29sX21heEV4 dGVudDpmdW5jdGlvbihvYmosbm9kZSl7dmFyIGJvdW5kcz1uZXcgT3BlbkxheWVy cy5Cb3VuZHMobm9kZS5nZXRBdHRyaWJ1dGUoIm1pbngiKSxub2RlLmdldEF0dHJp YnV0ZSgibWlueSIpLG5vZGUuZ2V0QXR0cmlidXRlKCJtYXh4Iiksbm9kZS5nZXRB dHRyaWJ1dGUoIm1heHkiKSk7b2JqLm1heEV4dGVudD1ib3VuZHM7fSxyZWFkX29s X3RyYW5zcGFyZW50OmZ1bmN0aW9uKGxheWVyQ29udGV4dCxub2RlKXtsYXllckNv bnRleHQudHJhbnNwYXJlbnQ9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO30scmVh ZF9vbF9udW1ab29tTGV2ZWxzOmZ1bmN0aW9uKGxheWVyQ29udGV4dCxub2RlKXts YXllckNvbnRleHQubnVtWm9vbUxldmVscz1wYXJzZUludCh0aGlzLmdldENoaWxk VmFsdWUobm9kZSkpO30scmVhZF9vbF9vcGFjaXR5OmZ1bmN0aW9uKGxheWVyQ29u dGV4dCxub2RlKXtsYXllckNvbnRleHQub3BhY2l0eT1wYXJzZUZsb2F0KHRoaXMu Z2V0Q2hpbGRWYWx1ZShub2RlKSk7fSxyZWFkX29sX3NpbmdsZVRpbGU6ZnVuY3Rp b24obGF5ZXJDb250ZXh0LG5vZGUpe2xheWVyQ29udGV4dC5zaW5nbGVUaWxlPSh0 aGlzLmdldENoaWxkVmFsdWUobm9kZSk9PSJ0cnVlIik7fSxyZWFkX29sX3RpbGVT aXplOmZ1bmN0aW9uKGxheWVyQ29udGV4dCxub2RlKXt2YXIgb2JqPXsid2lkdGgi Om5vZGUuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLCJoZWlnaHQiOm5vZGUuZ2V0QXR0 cmlidXRlKCJoZWlnaHQiKX07bGF5ZXJDb250ZXh0LnRpbGVTaXplPW9iajt9LHJl YWRfb2xfaXNCYXNlTGF5ZXI6ZnVuY3Rpb24obGF5ZXJDb250ZXh0LG5vZGUpe2xh eWVyQ29udGV4dC5pc0Jhc2VMYXllcj0odGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUp PT0idHJ1ZSIpO30scmVhZF9vbF9kaXNwbGF5SW5MYXllclN3aXRjaGVyOmZ1bmN0 aW9uKGxheWVyQ29udGV4dCxub2RlKXtsYXllckNvbnRleHQuZGlzcGxheUluTGF5 ZXJTd2l0Y2hlcj0odGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpPT0idHJ1ZSIpO30s cmVhZF93bWNfU2VydmVyOmZ1bmN0aW9uKGxheWVyQ29udGV4dCxub2RlKXtsYXll ckNvbnRleHQudmVyc2lvbj1ub2RlLmdldEF0dHJpYnV0ZSgidmVyc2lvbiIpO2xh eWVyQ29udGV4dC51cmw9dGhpcy5nZXRPbmxpbmVSZXNvdXJjZV9ocmVmKG5vZGUp O2xheWVyQ29udGV4dC5tZXRhZGF0YS5zZXJ2ZXJ0aXRsZT1ub2RlLmdldEF0dHJp YnV0ZSgidGl0bGUiKTt9LHJlYWRfd21jX0Zvcm1hdExpc3Q6ZnVuY3Rpb24obGF5 ZXJDb250ZXh0LG5vZGUpe3RoaXMucnVuQ2hpbGROb2RlcyhsYXllckNvbnRleHQs bm9kZSk7fSxyZWFkX3dtY19Gb3JtYXQ6ZnVuY3Rpb24obGF5ZXJDb250ZXh0LG5v ZGUpe3ZhciBmb3JtYXQ9e3ZhbHVlOnRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKX07 aWYobm9kZS5nZXRBdHRyaWJ1dGUoImN1cnJlbnQiKT09IjEiKXtmb3JtYXQuY3Vy cmVudD10cnVlO30KbGF5ZXJDb250ZXh0LmZvcm1hdHMucHVzaChmb3JtYXQpO30s cmVhZF93bWNfU3R5bGVMaXN0OmZ1bmN0aW9uKGxheWVyQ29udGV4dCxub2RlKXt0 aGlzLnJ1bkNoaWxkTm9kZXMobGF5ZXJDb250ZXh0LG5vZGUpO30scmVhZF93bWNf U3R5bGU6ZnVuY3Rpb24obGF5ZXJDb250ZXh0LG5vZGUpe3ZhciBzdHlsZT17fTt0 aGlzLnJ1bkNoaWxkTm9kZXMoc3R5bGUsbm9kZSk7aWYobm9kZS5nZXRBdHRyaWJ1 dGUoImN1cnJlbnQiKT09IjEiKXtzdHlsZS5jdXJyZW50PXRydWU7fQpsYXllckNv bnRleHQuc3R5bGVzLnB1c2goc3R5bGUpO30scmVhZF93bWNfU0xEOmZ1bmN0aW9u KHN0eWxlLG5vZGUpe3RoaXMucnVuQ2hpbGROb2RlcyhzdHlsZSxub2RlKTt9LHJl YWRfc2xkX1N0eWxlZExheWVyRGVzY3JpcHRvcjpmdW5jdGlvbihzbGQsbm9kZSl7 dmFyIHhtbD1PcGVuTGF5ZXJzLkZvcm1hdC5YTUwucHJvdG90eXBlLndyaXRlLmFw cGx5KHRoaXMsW25vZGVdKTtzbGQuYm9keT14bWw7fSxyZWFkX3NsZF9GZWF0dXJl VHlwZVN0eWxlOmZ1bmN0aW9uKHNsZCxub2RlKXt2YXIgeG1sPU9wZW5MYXllcnMu Rm9ybWF0LlhNTC5wcm90b3R5cGUud3JpdGUuYXBwbHkodGhpcyxbbm9kZV0pO3Ns ZC5ib2R5PXhtbDt9LHJlYWRfd21jX09ubGluZVJlc291cmNlOmZ1bmN0aW9uKG9i aixub2RlKXtvYmouaHJlZj10aGlzLmdldEF0dHJpYnV0ZU5TKG5vZGUsdGhpcy5u YW1lc3BhY2VzLnhsaW5rLCJocmVmIik7fSxyZWFkX3dtY19OYW1lOmZ1bmN0aW9u KG9iaixub2RlKXt2YXIgbmFtZT10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7aWYo bmFtZSl7b2JqLm5hbWU9bmFtZTt9fSxyZWFkX3dtY19UaXRsZTpmdW5jdGlvbihv Ymosbm9kZSl7dmFyIHRpdGxlPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTtpZih0 aXRsZSl7b2JqLnRpdGxlPXRpdGxlO319LHJlYWRfd21jX01ldGFkYXRhVVJMOmZ1 bmN0aW9uKGxheWVyQ29udGV4dCxub2RlKXtsYXllckNvbnRleHQubWV0YWRhdGFV Ukw9dGhpcy5nZXRPbmxpbmVSZXNvdXJjZV9ocmVmKG5vZGUpO30scmVhZF93bWNf S2V5d29yZExpc3Q6ZnVuY3Rpb24oY29udGV4dCxub2RlKXtjb250ZXh0LmtleXdv cmRzPVtdO3RoaXMucnVuQ2hpbGROb2Rlcyhjb250ZXh0LmtleXdvcmRzLG5vZGUp O30scmVhZF93bWNfS2V5d29yZDpmdW5jdGlvbihrZXl3b3Jkcyxub2RlKXtrZXl3 b3Jkcy5wdXNoKHRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKSk7fSxyZWFkX3dtY19B YnN0cmFjdDpmdW5jdGlvbihvYmosbm9kZSl7dmFyIGFic3Q9dGhpcy5nZXRDaGls ZFZhbHVlKG5vZGUpO2lmKGFic3Qpe29ialsiYWJzdHJhY3QiXT1hYnN0O319LHJl YWRfd21jX0xvZ29VUkw6ZnVuY3Rpb24oY29udGV4dCxub2RlKXtjb250ZXh0Lmxv Z289e3dpZHRoOm5vZGUuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDpub2Rl LmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksZm9ybWF0Om5vZGUuZ2V0QXR0cmlidXRl KCJmb3JtYXQiKSxocmVmOnRoaXMuZ2V0T25saW5lUmVzb3VyY2VfaHJlZihub2Rl KX07fSxyZWFkX3dtY19EZXNjcmlwdGlvblVSTDpmdW5jdGlvbihjb250ZXh0LG5v ZGUpe2NvbnRleHQuZGVzY3JpcHRpb25VUkw9dGhpcy5nZXRPbmxpbmVSZXNvdXJj ZV9ocmVmKG5vZGUpO30scmVhZF93bWNfQ29udGFjdEluZm9ybWF0aW9uOmZ1bmN0 aW9uKG9iaixub2RlKXt2YXIgY29udGFjdD17fTt0aGlzLnJ1bkNoaWxkTm9kZXMo Y29udGFjdCxub2RlKTtvYmouY29udGFjdEluZm9ybWF0aW9uPWNvbnRhY3Q7fSxy ZWFkX3dtY19Db250YWN0UGVyc29uUHJpbWFyeTpmdW5jdGlvbihjb250YWN0LG5v ZGUpe3ZhciBwZXJzb25QcmltYXJ5PXt9O3RoaXMucnVuQ2hpbGROb2RlcyhwZXJz b25QcmltYXJ5LG5vZGUpO2NvbnRhY3QucGVyc29uUHJpbWFyeT1wZXJzb25Qcmlt YXJ5O30scmVhZF93bWNfQ29udGFjdFBlcnNvbjpmdW5jdGlvbihwcmltYXJ5UGVy c29uLG5vZGUpe3ZhciBwZXJzb249dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO2lm KHBlcnNvbil7cHJpbWFyeVBlcnNvbi5wZXJzb249cGVyc29uO319LHJlYWRfd21j X0NvbnRhY3RPcmdhbml6YXRpb246ZnVuY3Rpb24ocHJpbWFyeVBlcnNvbixub2Rl KXt2YXIgb3JnYW5pemF0aW9uPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTtpZihv cmdhbml6YXRpb24pe3ByaW1hcnlQZXJzb24ub3JnYW5pemF0aW9uPW9yZ2FuaXph dGlvbjt9fSxyZWFkX3dtY19Db250YWN0UG9zaXRpb246ZnVuY3Rpb24oY29udGFj dCxub2RlKXt2YXIgcG9zaXRpb249dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO2lm KHBvc2l0aW9uKXtjb250YWN0LnBvc2l0aW9uPXBvc2l0aW9uO319LHJlYWRfd21j X0NvbnRhY3RBZGRyZXNzOmZ1bmN0aW9uKGNvbnRhY3Qsbm9kZSl7dmFyIGNvbnRh Y3RBZGRyZXNzPXt9O3RoaXMucnVuQ2hpbGROb2Rlcyhjb250YWN0QWRkcmVzcyxu b2RlKTtjb250YWN0LmNvbnRhY3RBZGRyZXNzPWNvbnRhY3RBZGRyZXNzO30scmVh ZF93bWNfQWRkcmVzc1R5cGU6ZnVuY3Rpb24oY29udGFjdEFkZHJlc3Msbm9kZSl7 dmFyIHR5cGU9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO2lmKHR5cGUpe2NvbnRh Y3RBZGRyZXNzLnR5cGU9dHlwZTt9fSxyZWFkX3dtY19BZGRyZXNzOmZ1bmN0aW9u KGNvbnRhY3RBZGRyZXNzLG5vZGUpe3ZhciBhZGRyZXNzPXRoaXMuZ2V0Q2hpbGRW YWx1ZShub2RlKTtpZihhZGRyZXNzKXtjb250YWN0QWRkcmVzcy5hZGRyZXNzPWFk ZHJlc3M7fX0scmVhZF93bWNfQ2l0eTpmdW5jdGlvbihjb250YWN0QWRkcmVzcyxu b2RlKXt2YXIgY2l0eT10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7aWYoY2l0eSl7 Y29udGFjdEFkZHJlc3MuY2l0eT1jaXR5O319LHJlYWRfd21jX1N0YXRlT3JQcm92 aW5jZTpmdW5jdGlvbihjb250YWN0QWRkcmVzcyxub2RlKXt2YXIgc3RhdGVPclBy b3ZpbmNlPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTtpZihzdGF0ZU9yUHJvdmlu Y2Upe2NvbnRhY3RBZGRyZXNzLnN0YXRlT3JQcm92aW5jZT1zdGF0ZU9yUHJvdmlu Y2U7fX0scmVhZF93bWNfUG9zdENvZGU6ZnVuY3Rpb24oY29udGFjdEFkZHJlc3Ms bm9kZSl7dmFyIHBvc3Rjb2RlPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTtpZihw b3N0Y29kZSl7Y29udGFjdEFkZHJlc3MucG9zdGNvZGU9cG9zdGNvZGU7fX0scmVh ZF93bWNfQ291bnRyeTpmdW5jdGlvbihjb250YWN0QWRkcmVzcyxub2RlKXt2YXIg Y291bnRyeT10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7aWYoY291bnRyeSl7Y29u dGFjdEFkZHJlc3MuY291bnRyeT1jb3VudHJ5O319LHJlYWRfd21jX0NvbnRhY3RW b2ljZVRlbGVwaG9uZTpmdW5jdGlvbihjb250YWN0LG5vZGUpe3ZhciBwaG9uZT10 aGlzLmdldENoaWxkVmFsdWUobm9kZSk7aWYocGhvbmUpe2NvbnRhY3QucGhvbmU9 cGhvbmU7fX0scmVhZF93bWNfQ29udGFjdEZhY3NpbWlsZVRlbGVwaG9uZTpmdW5j dGlvbihjb250YWN0LG5vZGUpe3ZhciBmYXg9dGhpcy5nZXRDaGlsZFZhbHVlKG5v ZGUpO2lmKGZheCl7Y29udGFjdC5mYXg9ZmF4O319LHJlYWRfd21jX0NvbnRhY3RF bGVjdHJvbmljTWFpbEFkZHJlc3M6ZnVuY3Rpb24oY29udGFjdCxub2RlKXt2YXIg ZW1haWw9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO2lmKGVtYWlsKXtjb250YWN0 LmVtYWlsPWVtYWlsO319LHJlYWRfd21jX0RhdGFVUkw6ZnVuY3Rpb24obGF5ZXJD b250ZXh0LG5vZGUpe2xheWVyQ29udGV4dC5kYXRhVVJMPXRoaXMuZ2V0T25saW5l UmVzb3VyY2VfaHJlZihub2RlKTt9LHJlYWRfd21jX0xlZ2VuZFVSTDpmdW5jdGlv bihzdHlsZSxub2RlKXt2YXIgbGVnZW5kPXt3aWR0aDpub2RlLmdldEF0dHJpYnV0 ZSgnd2lkdGgnKSxoZWlnaHQ6bm9kZS5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpLGZv cm1hdDpub2RlLmdldEF0dHJpYnV0ZSgnZm9ybWF0JyksaHJlZjp0aGlzLmdldE9u bGluZVJlc291cmNlX2hyZWYobm9kZSl9O3N0eWxlLmxlZ2VuZD1sZWdlbmQ7fSxy ZWFkX3dtY19EaW1lbnNpb25MaXN0OmZ1bmN0aW9uKGxheWVyQ29udGV4dCxub2Rl KXtsYXllckNvbnRleHQuZGltZW5zaW9ucz17fTt0aGlzLnJ1bkNoaWxkTm9kZXMo bGF5ZXJDb250ZXh0LmRpbWVuc2lvbnMsbm9kZSk7fSxyZWFkX3dtY19EaW1lbnNp b246ZnVuY3Rpb24oZGltZW5zaW9ucyxub2RlKXt2YXIgbmFtZT1ub2RlLmdldEF0 dHJpYnV0ZSgibmFtZSIpLnRvTG93ZXJDYXNlKCk7dmFyIGRpbT17bmFtZTpuYW1l LHVuaXRzOm5vZGUuZ2V0QXR0cmlidXRlKCJ1bml0cyIpfHwiIix1bml0U3ltYm9s Om5vZGUuZ2V0QXR0cmlidXRlKCJ1bml0U3ltYm9sIil8fCIiLHVzZXJWYWx1ZTpu b2RlLmdldEF0dHJpYnV0ZSgidXNlclZhbHVlIil8fCIiLG5lYXJlc3RWYWx1ZTpu b2RlLmdldEF0dHJpYnV0ZSgibmVhcmVzdFZhbHVlIik9PT0iMSIsbXVsdGlwbGVW YWx1ZXM6bm9kZS5nZXRBdHRyaWJ1dGUoIm11bHRpcGxlVmFsdWVzIik9PT0iMSIs Y3VycmVudDpub2RlLmdldEF0dHJpYnV0ZSgiY3VycmVudCIpPT09IjEiLCJkZWZh dWx0Ijpub2RlLmdldEF0dHJpYnV0ZSgiZGVmYXVsdCIpfHwiIn07dmFyIHZhbHVl cz10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7ZGltLnZhbHVlcz12YWx1ZXMuc3Bs aXQoIiwiKTtkaW1lbnNpb25zW2RpbS5uYW1lXT1kaW07fSx3cml0ZTpmdW5jdGlv bihjb250ZXh0LG9wdGlvbnMpe3ZhciByb290PXRoaXMuY3JlYXRlRWxlbWVudERl ZmF1bHROUygiVmlld0NvbnRleHQiKTt0aGlzLnNldEF0dHJpYnV0ZXMocm9vdCx7 dmVyc2lvbjp0aGlzLlZFUlNJT04saWQ6KG9wdGlvbnMmJnR5cGVvZiBvcHRpb25z LmlkPT0ic3RyaW5nIik/b3B0aW9ucy5pZDpPcGVuTGF5ZXJzLlV0aWwuY3JlYXRl VW5pcXVlSUQoIk9wZW5MYXllcnNfQ29udGV4dF8iKX0pO3RoaXMuc2V0QXR0cmli dXRlTlMocm9vdCx0aGlzLm5hbWVzcGFjZXMueHNpLCJ4c2k6c2NoZW1hTG9jYXRp b24iLHRoaXMuc2NoZW1hTG9jYXRpb24pO3Jvb3QuYXBwZW5kQ2hpbGQodGhpcy53 cml0ZV93bWNfR2VuZXJhbChjb250ZXh0KSk7cm9vdC5hcHBlbmRDaGlsZCh0aGlz LndyaXRlX3dtY19MYXllckxpc3QoY29udGV4dCkpO3JldHVybiBPcGVuTGF5ZXJz LkZvcm1hdC5YTUwucHJvdG90eXBlLndyaXRlLmFwcGx5KHRoaXMsW3Jvb3RdKTt9 LGNyZWF0ZUVsZW1lbnREZWZhdWx0TlM6ZnVuY3Rpb24obmFtZSxjaGlsZFZhbHVl LGF0dHJpYnV0ZXMpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMu bmFtZXNwYWNlc1t0aGlzLmRlZmF1bHRQcmVmaXhdLG5hbWUpO2lmKGNoaWxkVmFs dWUpe25vZGUuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVUZXh0Tm9kZShjaGlsZFZh bHVlKSk7fQppZihhdHRyaWJ1dGVzKXt0aGlzLnNldEF0dHJpYnV0ZXMobm9kZSxh dHRyaWJ1dGVzKTt9CnJldHVybiBub2RlO30sc2V0QXR0cmlidXRlczpmdW5jdGlv bihub2RlLG9iail7dmFyIHZhbHVlO2Zvcih2YXIgbmFtZSBpbiBvYmope3ZhbHVl PW9ialtuYW1lXS50b1N0cmluZygpO2lmKHZhbHVlLm1hdGNoKC9bQS1aXS8pKXt0 aGlzLnNldEF0dHJpYnV0ZU5TKG5vZGUsbnVsbCxuYW1lLHZhbHVlKTt9ZWxzZXtu b2RlLnNldEF0dHJpYnV0ZShuYW1lLHZhbHVlKTt9fX0sd3JpdGVfd21jX0dlbmVy YWw6ZnVuY3Rpb24oY29udGV4dCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50 RGVmYXVsdE5TKCJHZW5lcmFsIik7aWYoY29udGV4dC5zaXplKXtub2RlLmFwcGVu ZENoaWxkKHRoaXMuY3JlYXRlRWxlbWVudERlZmF1bHROUygiV2luZG93IixudWxs LHt3aWR0aDpjb250ZXh0LnNpemUudyxoZWlnaHQ6Y29udGV4dC5zaXplLmh9KSk7 fQp2YXIgYm91bmRzPWNvbnRleHQuYm91bmRzO25vZGUuYXBwZW5kQ2hpbGQodGhp cy5jcmVhdGVFbGVtZW50RGVmYXVsdE5TKCJCb3VuZGluZ0JveCIsbnVsbCx7bWlu eDpib3VuZHMubGVmdC50b1ByZWNpc2lvbigxOCksbWlueTpib3VuZHMuYm90dG9t LnRvUHJlY2lzaW9uKDE4KSxtYXh4OmJvdW5kcy5yaWdodC50b1ByZWNpc2lvbigx OCksbWF4eTpib3VuZHMudG9wLnRvUHJlY2lzaW9uKDE4KSxTUlM6Y29udGV4dC5w cm9qZWN0aW9ufSkpO25vZGUuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVFbGVtZW50 RGVmYXVsdE5TKCJUaXRsZSIsY29udGV4dC50aXRsZSkpO2lmKGNvbnRleHQua2V5 d29yZHMpe25vZGUuYXBwZW5kQ2hpbGQodGhpcy53cml0ZV93bWNfS2V5d29yZExp c3QoY29udGV4dC5rZXl3b3JkcykpO30KaWYoY29udGV4dFsiYWJzdHJhY3QiXSl7 bm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUVsZW1lbnREZWZhdWx0TlMoIkFi c3RyYWN0Iixjb250ZXh0WyJhYnN0cmFjdCJdKSk7fQppZihjb250ZXh0LmxvZ28p e25vZGUuYXBwZW5kQ2hpbGQodGhpcy53cml0ZV93bWNfVVJMVHlwZSgiTG9nb1VS TCIsY29udGV4dC5sb2dvLmhyZWYsY29udGV4dC5sb2dvKSk7fQppZihjb250ZXh0 LmRlc2NyaXB0aW9uVVJMKXtub2RlLmFwcGVuZENoaWxkKHRoaXMud3JpdGVfd21j X1VSTFR5cGUoIkRlc2NyaXB0aW9uVVJMIixjb250ZXh0LmRlc2NyaXB0aW9uVVJM KSk7fQppZihjb250ZXh0LmNvbnRhY3RJbmZvcm1hdGlvbil7bm9kZS5hcHBlbmRD aGlsZCh0aGlzLndyaXRlX3dtY19Db250YWN0SW5mb3JtYXRpb24oY29udGV4dC5j b250YWN0SW5mb3JtYXRpb24pKTt9Cm5vZGUuYXBwZW5kQ2hpbGQodGhpcy53cml0 ZV9vbF9NYXBFeHRlbnNpb24oY29udGV4dCkpO3JldHVybiBub2RlO30sd3JpdGVf d21jX0tleXdvcmRMaXN0OmZ1bmN0aW9uKGtleXdvcmRzKXt2YXIgbm9kZT10aGlz LmNyZWF0ZUVsZW1lbnREZWZhdWx0TlMoIktleXdvcmRMaXN0Iik7Zm9yKHZhciBp PTAsbGVuPWtleXdvcmRzLmxlbmd0aDtpPGxlbjtpKyspe25vZGUuYXBwZW5kQ2hp bGQodGhpcy5jcmVhdGVFbGVtZW50RGVmYXVsdE5TKCJLZXl3b3JkIixrZXl3b3Jk c1tpXSkpO30KcmV0dXJuIG5vZGU7fSx3cml0ZV93bWNfQ29udGFjdEluZm9ybWF0 aW9uOmZ1bmN0aW9uKGNvbnRhY3Qpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVu dERlZmF1bHROUygiQ29udGFjdEluZm9ybWF0aW9uIik7aWYoY29udGFjdC5wZXJz b25QcmltYXJ5KXtub2RlLmFwcGVuZENoaWxkKHRoaXMud3JpdGVfd21jX0NvbnRh Y3RQZXJzb25QcmltYXJ5KGNvbnRhY3QucGVyc29uUHJpbWFyeSkpO30KaWYoY29u dGFjdC5wb3NpdGlvbil7bm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUVsZW1l bnREZWZhdWx0TlMoIkNvbnRhY3RQb3NpdGlvbiIsY29udGFjdC5wb3NpdGlvbikp O30KaWYoY29udGFjdC5jb250YWN0QWRkcmVzcyl7bm9kZS5hcHBlbmRDaGlsZCh0 aGlzLndyaXRlX3dtY19Db250YWN0QWRkcmVzcyhjb250YWN0LmNvbnRhY3RBZGRy ZXNzKSk7fQppZihjb250YWN0LnBob25lKXtub2RlLmFwcGVuZENoaWxkKHRoaXMu Y3JlYXRlRWxlbWVudERlZmF1bHROUygiQ29udGFjdFZvaWNlVGVsZXBob25lIixj b250YWN0LnBob25lKSk7fQppZihjb250YWN0LmZheCl7bm9kZS5hcHBlbmRDaGls ZCh0aGlzLmNyZWF0ZUVsZW1lbnREZWZhdWx0TlMoIkNvbnRhY3RGYWNzaW1pbGVU ZWxlcGhvbmUiLGNvbnRhY3QuZmF4KSk7fQppZihjb250YWN0LmVtYWlsKXtub2Rl LmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRWxlbWVudERlZmF1bHROUygiQ29udGFj dEVsZWN0cm9uaWNNYWlsQWRkcmVzcyIsY29udGFjdC5lbWFpbCkpO30KcmV0dXJu IG5vZGU7fSx3cml0ZV93bWNfQ29udGFjdFBlcnNvblByaW1hcnk6ZnVuY3Rpb24o cGVyc29uUHJpbWFyeSl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50RGVmYXVs dE5TKCJDb250YWN0UGVyc29uUHJpbWFyeSIpO2lmKHBlcnNvblByaW1hcnkucGVy c29uKXtub2RlLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRWxlbWVudERlZmF1bHRO UygiQ29udGFjdFBlcnNvbiIscGVyc29uUHJpbWFyeS5wZXJzb24pKTt9CmlmKHBl cnNvblByaW1hcnkub3JnYW5pemF0aW9uKXtub2RlLmFwcGVuZENoaWxkKHRoaXMu Y3JlYXRlRWxlbWVudERlZmF1bHROUygiQ29udGFjdE9yZ2FuaXphdGlvbiIscGVy c29uUHJpbWFyeS5vcmdhbml6YXRpb24pKTt9CnJldHVybiBub2RlO30sd3JpdGVf d21jX0NvbnRhY3RBZGRyZXNzOmZ1bmN0aW9uKGNvbnRhY3RBZGRyZXNzKXt2YXIg bm9kZT10aGlzLmNyZWF0ZUVsZW1lbnREZWZhdWx0TlMoIkNvbnRhY3RBZGRyZXNz Iik7aWYoY29udGFjdEFkZHJlc3MudHlwZSl7bm9kZS5hcHBlbmRDaGlsZCh0aGlz LmNyZWF0ZUVsZW1lbnREZWZhdWx0TlMoIkFkZHJlc3NUeXBlIixjb250YWN0QWRk cmVzcy50eXBlKSk7fQppZihjb250YWN0QWRkcmVzcy5hZGRyZXNzKXtub2RlLmFw cGVuZENoaWxkKHRoaXMuY3JlYXRlRWxlbWVudERlZmF1bHROUygiQWRkcmVzcyIs Y29udGFjdEFkZHJlc3MuYWRkcmVzcykpO30KaWYoY29udGFjdEFkZHJlc3MuY2l0 eSl7bm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUVsZW1lbnREZWZhdWx0TlMo IkNpdHkiLGNvbnRhY3RBZGRyZXNzLmNpdHkpKTt9CmlmKGNvbnRhY3RBZGRyZXNz LnN0YXRlT3JQcm92aW5jZSl7bm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUVs ZW1lbnREZWZhdWx0TlMoIlN0YXRlT3JQcm92aW5jZSIsY29udGFjdEFkZHJlc3Mu c3RhdGVPclByb3ZpbmNlKSk7fQppZihjb250YWN0QWRkcmVzcy5wb3N0Y29kZSl7 bm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUVsZW1lbnREZWZhdWx0TlMoIlBv c3RDb2RlIixjb250YWN0QWRkcmVzcy5wb3N0Y29kZSkpO30KaWYoY29udGFjdEFk ZHJlc3MuY291bnRyeSl7bm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUVsZW1l bnREZWZhdWx0TlMoIkNvdW50cnkiLGNvbnRhY3RBZGRyZXNzLmNvdW50cnkpKTt9 CnJldHVybiBub2RlO30sd3JpdGVfb2xfTWFwRXh0ZW5zaW9uOmZ1bmN0aW9uKGNv bnRleHQpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudERlZmF1bHROUygiRXh0 ZW5zaW9uIik7dmFyIGJvdW5kcz1jb250ZXh0Lm1heEV4dGVudDtpZihib3VuZHMp e3ZhciBtYXhFeHRlbnQ9dGhpcy5jcmVhdGVFbGVtZW50TlModGhpcy5uYW1lc3Bh Y2VzLm9sLCJvbDptYXhFeHRlbnQiKTt0aGlzLnNldEF0dHJpYnV0ZXMobWF4RXh0 ZW50LHttaW54OmJvdW5kcy5sZWZ0LnRvUHJlY2lzaW9uKDE4KSxtaW55OmJvdW5k cy5ib3R0b20udG9QcmVjaXNpb24oMTgpLG1heHg6Ym91bmRzLnJpZ2h0LnRvUHJl Y2lzaW9uKDE4KSxtYXh5OmJvdW5kcy50b3AudG9QcmVjaXNpb24oMTgpfSk7bm9k ZS5hcHBlbmRDaGlsZChtYXhFeHRlbnQpO30KcmV0dXJuIG5vZGU7fSx3cml0ZV93 bWNfTGF5ZXJMaXN0OmZ1bmN0aW9uKGNvbnRleHQpe3ZhciBsaXN0PXRoaXMuY3Jl YXRlRWxlbWVudERlZmF1bHROUygiTGF5ZXJMaXN0Iik7Zm9yKHZhciBpPTAsbGVu PWNvbnRleHQubGF5ZXJzQ29udGV4dC5sZW5ndGg7aTxsZW47KytpKXtsaXN0LmFw cGVuZENoaWxkKHRoaXMud3JpdGVfd21jX0xheWVyKGNvbnRleHQubGF5ZXJzQ29u dGV4dFtpXSkpO30KcmV0dXJuIGxpc3Q7fSx3cml0ZV93bWNfTGF5ZXI6ZnVuY3Rp b24oY29udGV4dCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50RGVmYXVsdE5T KCJMYXllciIsbnVsbCx7cXVlcnlhYmxlOmNvbnRleHQucXVlcnlhYmxlPyIxIjoi MCIsaGlkZGVuOmNvbnRleHQudmlzaWJpbGl0eT8iMCI6IjEifSk7bm9kZS5hcHBl bmRDaGlsZCh0aGlzLndyaXRlX3dtY19TZXJ2ZXIoY29udGV4dCkpO25vZGUuYXBw ZW5kQ2hpbGQodGhpcy5jcmVhdGVFbGVtZW50RGVmYXVsdE5TKCJOYW1lIixjb250 ZXh0Lm5hbWUpKTtub2RlLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRWxlbWVudERl ZmF1bHROUygiVGl0bGUiLGNvbnRleHQudGl0bGUpKTtpZihjb250ZXh0WyJhYnN0 cmFjdCJdKXtub2RlLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRWxlbWVudERlZmF1 bHROUygiQWJzdHJhY3QiLGNvbnRleHRbImFic3RyYWN0Il0pKTt9CmlmKGNvbnRl eHQuZGF0YVVSTCl7bm9kZS5hcHBlbmRDaGlsZCh0aGlzLndyaXRlX3dtY19VUkxU eXBlKCJEYXRhVVJMIixjb250ZXh0LmRhdGFVUkwpKTt9CmlmKGNvbnRleHQubWV0 YWRhdGFVUkwpe25vZGUuYXBwZW5kQ2hpbGQodGhpcy53cml0ZV93bWNfVVJMVHlw ZSgiTWV0YWRhdGFVUkwiLGNvbnRleHQubWV0YWRhdGFVUkwpKTt9CnJldHVybiBu b2RlO30sd3JpdGVfd21jX0xheWVyRXh0ZW5zaW9uOmZ1bmN0aW9uKGNvbnRleHQp e3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudERlZmF1bHROUygiRXh0ZW5zaW9u Iik7dmFyIGJvdW5kcz1jb250ZXh0Lm1heEV4dGVudDt2YXIgbWF4RXh0ZW50PXRo aXMuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlcy5vbCwib2w6bWF4RXh0 ZW50Iik7dGhpcy5zZXRBdHRyaWJ1dGVzKG1heEV4dGVudCx7bWlueDpib3VuZHMu bGVmdC50b1ByZWNpc2lvbigxOCksbWlueTpib3VuZHMuYm90dG9tLnRvUHJlY2lz aW9uKDE4KSxtYXh4OmJvdW5kcy5yaWdodC50b1ByZWNpc2lvbigxOCksbWF4eTpi b3VuZHMudG9wLnRvUHJlY2lzaW9uKDE4KX0pO25vZGUuYXBwZW5kQ2hpbGQobWF4 RXh0ZW50KTtpZihjb250ZXh0LnRpbGVTaXplJiYhY29udGV4dC5zaW5nbGVUaWxl KXt2YXIgc2l6ZT10aGlzLmNyZWF0ZUVsZW1lbnROUyh0aGlzLm5hbWVzcGFjZXMu b2wsIm9sOnRpbGVTaXplIik7dGhpcy5zZXRBdHRyaWJ1dGVzKHNpemUsY29udGV4 dC50aWxlU2l6ZSk7bm9kZS5hcHBlbmRDaGlsZChzaXplKTt9CnZhciBwcm9wZXJ0 aWVzPVsidHJhbnNwYXJlbnQiLCJudW1ab29tTGV2ZWxzIiwidW5pdHMiLCJpc0Jh c2VMYXllciIsIm9wYWNpdHkiLCJkaXNwbGF5SW5MYXllclN3aXRjaGVyIiwic2lu Z2xlVGlsZSJdO3ZhciBjaGlsZDtmb3IodmFyIGk9MCxsZW49cHJvcGVydGllcy5s ZW5ndGg7aTxsZW47KytpKXtjaGlsZD10aGlzLmNyZWF0ZU9MUHJvcGVydHlOb2Rl KGNvbnRleHQscHJvcGVydGllc1tpXSk7aWYoY2hpbGQpe25vZGUuYXBwZW5kQ2hp bGQoY2hpbGQpO319CnJldHVybiBub2RlO30sY3JlYXRlT0xQcm9wZXJ0eU5vZGU6 ZnVuY3Rpb24ob2JqLHByb3Ape3ZhciBub2RlPW51bGw7aWYob2JqW3Byb3BdIT1u dWxsKXtub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlcy5v bCwib2w6Iitwcm9wKTtub2RlLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlVGV4dE5v ZGUob2JqW3Byb3BdLnRvU3RyaW5nKCkpKTt9CnJldHVybiBub2RlO30sd3JpdGVf d21jX1NlcnZlcjpmdW5jdGlvbihjb250ZXh0KXt2YXIgc2VydmVyPWNvbnRleHQu c2VydmVyO3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudERlZmF1bHROUygiU2Vy dmVyIik7dmFyIGF0dHJpYnV0ZXM9e3NlcnZpY2U6Ik9HQzpXTVMiLHZlcnNpb246 c2VydmVyLnZlcnNpb259O2lmKHNlcnZlci50aXRsZSl7YXR0cmlidXRlcy50aXRs ZT1zZXJ2ZXIudGl0bGV9CnRoaXMuc2V0QXR0cmlidXRlcyhub2RlLGF0dHJpYnV0 ZXMpO25vZGUuYXBwZW5kQ2hpbGQodGhpcy53cml0ZV93bWNfT25saW5lUmVzb3Vy Y2Uoc2VydmVyLnVybCkpO3JldHVybiBub2RlO30sd3JpdGVfd21jX1VSTFR5cGU6 ZnVuY3Rpb24oZWxOYW1lLHVybCxhdHRyKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVs ZW1lbnREZWZhdWx0TlMoZWxOYW1lKTtub2RlLmFwcGVuZENoaWxkKHRoaXMud3Jp dGVfd21jX09ubGluZVJlc291cmNlKHVybCkpO2lmKGF0dHIpe3ZhciBvcHRpb25h bEF0dHJpYnV0ZXM9WyJ3aWR0aCIsImhlaWdodCIsImZvcm1hdCJdO2Zvcih2YXIg aT0wO2k8b3B0aW9uYWxBdHRyaWJ1dGVzLmxlbmd0aDtpKyspe2lmKG9wdGlvbmFs QXR0cmlidXRlc1tpXWluIGF0dHIpe25vZGUuc2V0QXR0cmlidXRlKG9wdGlvbmFs QXR0cmlidXRlc1tpXSxhdHRyW29wdGlvbmFsQXR0cmlidXRlc1tpXV0pO319fQpy ZXR1cm4gbm9kZTt9LHdyaXRlX3dtY19EaW1lbnNpb25MaXN0OmZ1bmN0aW9uKGNv bnRleHQpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudERlZmF1bHROUygiRGlt ZW5zaW9uTGlzdCIpO3ZhciByZXF1aXJlZF9hdHRyaWJ1dGVzPXtuYW1lOnRydWUs dW5pdHM6dHJ1ZSx1bml0U3ltYm9sOnRydWUsdXNlclZhbHVlOnRydWV9O2Zvcih2 YXIgZGltIGluIGNvbnRleHQuZGltZW5zaW9ucyl7dmFyIGF0dHJpYnV0ZXM9e307 dmFyIGRpbWVuc2lvbj1jb250ZXh0LmRpbWVuc2lvbnNbZGltXTtmb3IodmFyIG5h bWUgaW4gZGltZW5zaW9uKXtpZih0eXBlb2YgZGltZW5zaW9uW25hbWVdPT0iYm9v bGVhbiIpe2F0dHJpYnV0ZXNbbmFtZV09TnVtYmVyKGRpbWVuc2lvbltuYW1lXSk7 fWVsc2V7YXR0cmlidXRlc1tuYW1lXT1kaW1lbnNpb25bbmFtZV07fX0KdmFyIHZh bHVlcz0iIjtpZihhdHRyaWJ1dGVzLnZhbHVlcyl7dmFsdWVzPWF0dHJpYnV0ZXMu dmFsdWVzLmpvaW4oIiwiKTtkZWxldGUgYXR0cmlidXRlcy52YWx1ZXM7fQpub2Rl LmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRWxlbWVudERlZmF1bHROUygiRGltZW5z aW9uIix2YWx1ZXMsYXR0cmlidXRlcykpO30KcmV0dXJuIG5vZGU7fSx3cml0ZV93 bWNfRm9ybWF0TGlzdDpmdW5jdGlvbihjb250ZXh0KXt2YXIgbm9kZT10aGlzLmNy ZWF0ZUVsZW1lbnREZWZhdWx0TlMoIkZvcm1hdExpc3QiKTtmb3IodmFyIGk9MCxs ZW49Y29udGV4dC5mb3JtYXRzLmxlbmd0aDtpPGxlbjtpKyspe3ZhciBmb3JtYXQ9 Y29udGV4dC5mb3JtYXRzW2ldO25vZGUuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVF bGVtZW50RGVmYXVsdE5TKCJGb3JtYXQiLGZvcm1hdC52YWx1ZSwoZm9ybWF0LmN1 cnJlbnQmJmZvcm1hdC5jdXJyZW50PT10cnVlKT97Y3VycmVudDoiMSJ9Om51bGwp KTt9CnJldHVybiBub2RlO30sd3JpdGVfd21jX1N0eWxlTGlzdDpmdW5jdGlvbihs YXllcil7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50RGVmYXVsdE5TKCJTdHls ZUxpc3QiKTt2YXIgc3R5bGVzPWxheWVyLnN0eWxlcztpZihzdHlsZXMmJk9wZW5M YXllcnMuVXRpbC5pc0FycmF5KHN0eWxlcykpe3ZhciBzbGQ7Zm9yKHZhciBpPTAs bGVuPXN0eWxlcy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgcz1zdHlsZXNbaV07dmFy IHN0eWxlPXRoaXMuY3JlYXRlRWxlbWVudERlZmF1bHROUygiU3R5bGUiLG51bGws KHMuY3VycmVudCYmcy5jdXJyZW50PT10cnVlKT97Y3VycmVudDoiMSJ9Om51bGwp O2lmKHMuaHJlZil7c2xkPXRoaXMuY3JlYXRlRWxlbWVudERlZmF1bHROUygiU0xE Iik7aWYocy5uYW1lKXtzbGQuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVFbGVtZW50 RGVmYXVsdE5TKCJOYW1lIixzLm5hbWUpKTt9CmlmKHMudGl0bGUpe3NsZC5hcHBl bmRDaGlsZCh0aGlzLmNyZWF0ZUVsZW1lbnREZWZhdWx0TlMoIlRpdGxlIixzLnRp dGxlKSk7fQppZihzLmxlZ2VuZCl7c2xkLmFwcGVuZENoaWxkKHRoaXMud3JpdGVf d21jX1VSTFR5cGUoIkxlZ2VuZFVSTCIscy5sZWdlbmQuaHJlZixzLmxlZ2VuZCkp O30KdmFyIGxpbms9dGhpcy53cml0ZV93bWNfT25saW5lUmVzb3VyY2Uocy5ocmVm KTtzbGQuYXBwZW5kQ2hpbGQobGluayk7c3R5bGUuYXBwZW5kQ2hpbGQoc2xkKTt9 ZWxzZSBpZihzLmJvZHkpe3NsZD10aGlzLmNyZWF0ZUVsZW1lbnREZWZhdWx0TlMo IlNMRCIpO2lmKHMubmFtZSl7c2xkLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRWxl bWVudERlZmF1bHROUygiTmFtZSIscy5uYW1lKSk7fQppZihzLnRpdGxlKXtzbGQu YXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVFbGVtZW50RGVmYXVsdE5TKCJUaXRsZSIs cy50aXRsZSkpO30KaWYocy5sZWdlbmQpe3NsZC5hcHBlbmRDaGlsZCh0aGlzLndy aXRlX3dtY19VUkxUeXBlKCJMZWdlbmRVUkwiLHMubGVnZW5kLmhyZWYscy5sZWdl bmQpKTt9CnZhciBkb2M9T3BlbkxheWVycy5Gb3JtYXQuWE1MLnByb3RvdHlwZS5y ZWFkLmFwcGx5KHRoaXMsW3MuYm9keV0pO3ZhciBpbXBvcnRlZD1kb2MuZG9jdW1l bnRFbGVtZW50O2lmKHNsZC5vd25lckRvY3VtZW50JiZzbGQub3duZXJEb2N1bWVu dC5pbXBvcnROb2RlKXtpbXBvcnRlZD1zbGQub3duZXJEb2N1bWVudC5pbXBvcnRO b2RlKGltcG9ydGVkLHRydWUpO30Kc2xkLmFwcGVuZENoaWxkKGltcG9ydGVkKTtz dHlsZS5hcHBlbmRDaGlsZChzbGQpO31lbHNle3N0eWxlLmFwcGVuZENoaWxkKHRo aXMuY3JlYXRlRWxlbWVudERlZmF1bHROUygiTmFtZSIscy5uYW1lKSk7c3R5bGUu YXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVFbGVtZW50RGVmYXVsdE5TKCJUaXRsZSIs cy50aXRsZSkpO2lmKHNbJ2Fic3RyYWN0J10pe3N0eWxlLmFwcGVuZENoaWxkKHRo aXMuY3JlYXRlRWxlbWVudERlZmF1bHROUygiQWJzdHJhY3QiLHNbJ2Fic3RyYWN0 J10pKTt9CmlmKHMubGVnZW5kKXtzdHlsZS5hcHBlbmRDaGlsZCh0aGlzLndyaXRl X3dtY19VUkxUeXBlKCJMZWdlbmRVUkwiLHMubGVnZW5kLmhyZWYscy5sZWdlbmQp KTt9fQpub2RlLmFwcGVuZENoaWxkKHN0eWxlKTt9fQpyZXR1cm4gbm9kZTt9LHdy aXRlX3dtY19PbmxpbmVSZXNvdXJjZTpmdW5jdGlvbihocmVmKXt2YXIgbm9kZT10 aGlzLmNyZWF0ZUVsZW1lbnREZWZhdWx0TlMoIk9ubGluZVJlc291cmNlIik7dGhp cy5zZXRBdHRyaWJ1dGVOUyhub2RlLHRoaXMubmFtZXNwYWNlcy54bGluaywieGxp bms6dHlwZSIsInNpbXBsZSIpO3RoaXMuc2V0QXR0cmlidXRlTlMobm9kZSx0aGlz Lm5hbWVzcGFjZXMueGxpbmssInhsaW5rOmhyZWYiLGhyZWYpO3JldHVybiBub2Rl O30sZ2V0T25saW5lUmVzb3VyY2VfaHJlZjpmdW5jdGlvbihub2RlKXt2YXIgb2Jq ZWN0PXt9O3ZhciBsaW5rcz1ub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJPbmxp bmVSZXNvdXJjZSIpO2lmKGxpbmtzLmxlbmd0aD4wKXt0aGlzLnJlYWRfd21jX09u bGluZVJlc291cmNlKG9iamVjdCxsaW5rc1swXSk7fQpyZXR1cm4gb2JqZWN0Lmhy ZWY7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5XTUMudjEifSk7T3Bl bkxheWVycy5Db250cm9sLlBhblBhbmVsPU9wZW5MYXllcnMuQ2xhc3MoT3Blbkxh eWVycy5Db250cm9sLlBhbmVsLHtzbGlkZUZhY3Rvcjo1MCxzbGlkZVJhdGlvOm51 bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXtPcGVuTGF5ZXJzLkNvbnRy b2wuUGFuZWwucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxbb3B0aW9u c10pO3ZhciBvcHRpb25zPXtzbGlkZUZhY3Rvcjp0aGlzLnNsaWRlRmFjdG9yLHNs aWRlUmF0aW86dGhpcy5zbGlkZVJhdGlvfTt0aGlzLmFkZENvbnRyb2xzKFtuZXcg T3BlbkxheWVycy5Db250cm9sLlBhbihPcGVuTGF5ZXJzLkNvbnRyb2wuUGFuLk5P UlRILG9wdGlvbnMpLG5ldyBPcGVuTGF5ZXJzLkNvbnRyb2wuUGFuKE9wZW5MYXll cnMuQ29udHJvbC5QYW4uU09VVEgsb3B0aW9ucyksbmV3IE9wZW5MYXllcnMuQ29u dHJvbC5QYW4oT3BlbkxheWVycy5Db250cm9sLlBhbi5FQVNULG9wdGlvbnMpLG5l dyBPcGVuTGF5ZXJzLkNvbnRyb2wuUGFuKE9wZW5MYXllcnMuQ29udHJvbC5QYW4u V0VTVCxvcHRpb25zKV0pO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Db250cm9s LlBhblBhbmVsIn0pO09wZW5MYXllcnMuQ29udHJvbC5BdHRyaWJ1dGlvbj1PcGVu TGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuQ29udHJvbCx7c2VwYXJhdG9yOiIsICIs ZGVzdHJveTpmdW5jdGlvbigpe3RoaXMubWFwLmV2ZW50cy51bih7InJlbW92ZWxh eWVyIjp0aGlzLnVwZGF0ZUF0dHJpYnV0aW9uLCJhZGRsYXllciI6dGhpcy51cGRh dGVBdHRyaWJ1dGlvbiwiY2hhbmdlbGF5ZXIiOnRoaXMudXBkYXRlQXR0cmlidXRp b24sImNoYW5nZWJhc2VsYXllciI6dGhpcy51cGRhdGVBdHRyaWJ1dGlvbixzY29w ZTp0aGlzfSk7T3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5kZXN0cm95LmFw cGx5KHRoaXMsYXJndW1lbnRzKTt9LGRyYXc6ZnVuY3Rpb24oKXtPcGVuTGF5ZXJz LkNvbnRyb2wucHJvdG90eXBlLmRyYXcuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Ro aXMubWFwLmV2ZW50cy5vbih7J2NoYW5nZWJhc2VsYXllcic6dGhpcy51cGRhdGVB dHRyaWJ1dGlvbiwnY2hhbmdlbGF5ZXInOnRoaXMudXBkYXRlQXR0cmlidXRpb24s J2FkZGxheWVyJzp0aGlzLnVwZGF0ZUF0dHJpYnV0aW9uLCdyZW1vdmVsYXllcic6 dGhpcy51cGRhdGVBdHRyaWJ1dGlvbixzY29wZTp0aGlzfSk7dGhpcy51cGRhdGVB dHRyaWJ1dGlvbigpO3JldHVybiB0aGlzLmRpdjt9LHVwZGF0ZUF0dHJpYnV0aW9u OmZ1bmN0aW9uKCl7dmFyIGF0dHJpYnV0aW9ucz1bXTtpZih0aGlzLm1hcCYmdGhp cy5tYXAubGF5ZXJzKXtmb3IodmFyIGk9MCxsZW49dGhpcy5tYXAubGF5ZXJzLmxl bmd0aDtpPGxlbjtpKyspe3ZhciBsYXllcj10aGlzLm1hcC5sYXllcnNbaV07aWYo bGF5ZXIuYXR0cmlidXRpb24mJmxheWVyLmdldFZpc2liaWxpdHkoKSl7aWYoT3Bl bkxheWVycy5VdGlsLmluZGV4T2YoYXR0cmlidXRpb25zLGxheWVyLmF0dHJpYnV0 aW9uKT09PS0xKXthdHRyaWJ1dGlvbnMucHVzaChsYXllci5hdHRyaWJ1dGlvbik7 fX19CnRoaXMuZGl2LmlubmVySFRNTD1hdHRyaWJ1dGlvbnMuam9pbih0aGlzLnNl cGFyYXRvcik7fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Db250cm9sLkF0dHJp YnV0aW9uIn0pO09wZW5MYXllcnMuUmVuZGVyZXIuTkc9T3BlbkxheWVycy5DbGFz cyhPcGVuTGF5ZXJzLlJlbmRlcmVyLkVsZW1lbnRzLHtsYWJlbE5vZGVUeXBlOm51 bGwsdXBkYXRlRGltZW5zaW9uczpmdW5jdGlvbih6b29tQ2hhbmdlZCl7dmFyIG1h cEV4dGVudD10aGlzLm1hcC5nZXRFeHRlbnQoKTt2YXIgcmVuZGVyRXh0ZW50PW1h cEV4dGVudC5zY2FsZSgzKTt0aGlzLnNldEV4dGVudChyZW5kZXJFeHRlbnQsdHJ1 ZSk7dmFyIHJlcz10aGlzLmdldFJlc29sdXRpb24oKTt2YXIgZGl2PXRoaXMucmVu ZGVyZXJSb290LnBhcmVudE5vZGU7dmFyIGxheWVyTGVmdD1wYXJzZUZsb2F0KGRp di5wYXJlbnROb2RlLnN0eWxlLmxlZnQpO3ZhciBsYXllclRvcD1wYXJzZUZsb2F0 KGRpdi5wYXJlbnROb2RlLnN0eWxlLnRvcCk7ZGl2LnN0eWxlLmxlZnQ9KChyZW5k ZXJFeHRlbnQubGVmdC1tYXBFeHRlbnQubGVmdCkvcmVzLWxheWVyTGVmdCkrInB4 IjtkaXYuc3R5bGUudG9wPSgobWFwRXh0ZW50LnRvcC1yZW5kZXJFeHRlbnQudG9w KS9yZXMtbGF5ZXJUb3ApKyJweCI7fSxzZXRTaXplOmZ1bmN0aW9uKCl7dGhpcy5t YXAuZ2V0RXh0ZW50KCkmJnRoaXMudXBkYXRlRGltZW5zaW9ucygpO30sZHJhd0Zl YXR1cmU6ZnVuY3Rpb24oZmVhdHVyZSxzdHlsZSl7aWYoc3R5bGU9PW51bGwpe3N0 eWxlPWZlYXR1cmUuc3R5bGU7fQppZihmZWF0dXJlLmdlb21ldHJ5KXt2YXIgcmVu ZGVyZWQ9dGhpcy5kcmF3R2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSxzdHlsZSxm ZWF0dXJlLmlkKTtpZihyZW5kZXJlZCE9PWZhbHNlJiZzdHlsZS5sYWJlbCl7dmFy IGxvY2F0aW9uPWZlYXR1cmUuZ2VvbWV0cnkuZ2V0Q2VudHJvaWQoKTt0aGlzLmRy YXdUZXh0KGZlYXR1cmUuaWQsc3R5bGUsbG9jYXRpb24pO31lbHNle3RoaXMucmVt b3ZlVGV4dChmZWF0dXJlLmlkKTt9CnJldHVybiByZW5kZXJlZDt9fSxkcmF3VGV4 dDpmdW5jdGlvbihmZWF0dXJlSWQsc3R5bGUsbG9jYXRpb24pe3ZhciBsYWJlbDtp Zih0eXBlb2YgZmVhdHVyZUlkIT09InN0cmluZyIpe2xhYmVsPWZlYXR1cmVJZDt9 ZWxzZXtsYWJlbD10aGlzLm5vZGVGYWN0b3J5KGZlYXR1cmVJZCt0aGlzLkxBQkVM X0lEX1NVRkZJWCx0aGlzLmxhYmVsTm9kZVR5cGUpO2xhYmVsLl9mZWF0dXJlSWQ9 ZmVhdHVyZUlkO30KbGFiZWwuX3N0eWxlPXN0eWxlO2xhYmVsLl94PWxvY2F0aW9u Lng7bGFiZWwuX3k9bG9jYXRpb24ueTtpZihzdHlsZS5sYWJlbFhPZmZzZXR8fHN0 eWxlLmxhYmVsWU9mZnNldCl7dmFyIHhPZmZzZXQ9aXNOYU4oc3R5bGUubGFiZWxY T2Zmc2V0KT8wOnN0eWxlLmxhYmVsWE9mZnNldDt2YXIgeU9mZnNldD1pc05hTihz dHlsZS5sYWJlbFlPZmZzZXQpPzA6c3R5bGUubGFiZWxZT2Zmc2V0O3ZhciByZXM9 dGhpcy5nZXRSZXNvbHV0aW9uKCk7bG9jYXRpb24ubW92ZSh4T2Zmc2V0KnJlcyx5 T2Zmc2V0KnJlcyk7fQppZihsYWJlbC5wYXJlbnROb2RlIT09dGhpcy50ZXh0Um9v dCl7dGhpcy50ZXh0Um9vdC5hcHBlbmRDaGlsZChsYWJlbCk7fQpyZXR1cm4gbGFi ZWw7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLlJlbmRlcmVyLk5HIn0pO09wZW5M YXllcnMuUmVuZGVyZXIuU1ZHMj1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMu UmVuZGVyZXIuTkcse3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIs eGxpbmtuczoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsc3ltYm9sTWV0 cmljczpudWxsLGxhYmVsTm9kZVR5cGU6ImciLGluaXRpYWxpemU6ZnVuY3Rpb24o Y29udGFpbmVySUQpe2lmKCF0aGlzLnN1cHBvcnRlZCgpKXtyZXR1cm47fQpPcGVu TGF5ZXJzLlJlbmRlcmVyLkVsZW1lbnRzLnByb3RvdHlwZS5pbml0aWFsaXplLmFw cGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnN5bWJvbE1ldHJpY3M9e307fSxzdXBw b3J0ZWQ6ZnVuY3Rpb24oKXt2YXIgc3ZnRmVhdHVyZT0iaHR0cDovL3d3dy53My5v cmcvVFIvU1ZHMTEvZmVhdHVyZSMiO3JldHVybihkb2N1bWVudC5pbXBsZW1lbnRh dGlvbiYmKGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoIm9yZy53 M2Muc3ZnIiwiMS4wIil8fGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1 cmUoc3ZnRmVhdHVyZSsiU1ZHIiwiMS4xIil8fGRvY3VtZW50LmltcGxlbWVudGF0 aW9uLmhhc0ZlYXR1cmUoc3ZnRmVhdHVyZSsiQmFzaWNTdHJ1Y3R1cmUiLCIxLjEi KSkpO30sdXBkYXRlRGltZW5zaW9uczpmdW5jdGlvbih6b29tQ2hhbmdlZCl7T3Bl bkxheWVycy5SZW5kZXJlci5ORy5wcm90b3R5cGUudXBkYXRlRGltZW5zaW9ucy5h cHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIHJlcz10aGlzLmdldFJlc29sdXRpb24o KTt2YXIgd2lkdGg9dGhpcy5leHRlbnQuZ2V0V2lkdGgoKTt2YXIgaGVpZ2h0PXRo aXMuZXh0ZW50LmdldEhlaWdodCgpO3ZhciBleHRlbnRTdHJpbmc9W3RoaXMuZXh0 ZW50LmxlZnQsLXRoaXMuZXh0ZW50LnRvcCx3aWR0aCxoZWlnaHRdLmpvaW4oIiAi KTt0aGlzLnJlbmRlcmVyUm9vdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ2aWV3Qm94 IixleHRlbnRTdHJpbmcpO3RoaXMucmVuZGVyZXJSb290LnNldEF0dHJpYnV0ZU5T KG51bGwsIndpZHRoIix3aWR0aC9yZXMpO3RoaXMucmVuZGVyZXJSb290LnNldEF0 dHJpYnV0ZU5TKG51bGwsImhlaWdodCIsaGVpZ2h0L3Jlcyk7aWYoem9vbUNoYW5n ZWQ9PT10cnVlKXt2YXIgaSxsZW47dmFyIG5vZGVzPXRoaXMudmVjdG9yUm9vdC5j aGlsZE5vZGVzO2ZvcihpPTAsbGVuPW5vZGVzLmxlbmd0aDtpPGxlbjsrK2kpe3Ro aXMuc2V0U3R5bGUobm9kZXNbaV0pO30KdmFyIHRleHROb2Rlcz10aGlzLnRleHRS b290LmNoaWxkTm9kZXM7dmFyIGxhYmVsO2ZvcihpPTAsbGVuPXRleHROb2Rlcy5s ZW5ndGg7aTxsZW47KytpKXtsYWJlbD10ZXh0Tm9kZXNbaV07dGhpcy5kcmF3VGV4 dChsYWJlbCxsYWJlbC5fc3R5bGUsbmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9p bnQobGFiZWwuX3gsbGFiZWwuX3kpKTt9fX0sZ2V0Tm9kZVR5cGU6ZnVuY3Rpb24o Z2VvbWV0cnksc3R5bGUpe3ZhciBub2RlVHlwZT1udWxsO3N3aXRjaChnZW9tZXRy eS5DTEFTU19OQU1FKXtjYXNlIk9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQiOmlm KHN0eWxlLmV4dGVybmFsR3JhcGhpYyl7bm9kZVR5cGU9ImltYWdlIjt9ZWxzZSBp Zih0aGlzLmlzQ29tcGxleFN5bWJvbChzdHlsZS5ncmFwaGljTmFtZSkpe25vZGVU eXBlPSJzdmciO31lbHNle25vZGVUeXBlPSJjaXJjbGUiO30KYnJlYWs7Y2FzZSJP cGVuTGF5ZXJzLkdlb21ldHJ5LlJlY3RhbmdsZSI6bm9kZVR5cGU9InJlY3QiO2Jy ZWFrO2Nhc2UiT3BlbkxheWVycy5HZW9tZXRyeS5MaW5lU3RyaW5nIjpub2RlVHlw ZT0icG9seWxpbmUiO2JyZWFrO2Nhc2UiT3BlbkxheWVycy5HZW9tZXRyeS5MaW5l YXJSaW5nIjpub2RlVHlwZT0icG9seWdvbiI7YnJlYWs7Y2FzZSJPcGVuTGF5ZXJz Lkdlb21ldHJ5LlBvbHlnb24iOmNhc2UiT3BlbkxheWVycy5HZW9tZXRyeS5DdXJ2 ZSI6Y2FzZSJPcGVuTGF5ZXJzLkdlb21ldHJ5LlN1cmZhY2UiOm5vZGVUeXBlPSJw YXRoIjticmVhaztkZWZhdWx0OmJyZWFrO30KcmV0dXJuIG5vZGVUeXBlO30sc2V0 U3R5bGU6ZnVuY3Rpb24obm9kZSxzdHlsZSxvcHRpb25zKXtzdHlsZT1zdHlsZXx8 bm9kZS5fc3R5bGU7b3B0aW9ucz1vcHRpb25zfHxub2RlLl9vcHRpb25zO3ZhciBy ZXNvbHV0aW9uPXRoaXMuZ2V0UmVzb2x1dGlvbigpO3ZhciByPW5vZGUuX3JhZGl1 czt2YXIgd2lkdGhGYWN0b3I9cmVzb2x1dGlvbjtpZihub2RlLl9nZW9tZXRyeUNs YXNzPT0iT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCImJnIpe25vZGUuc3R5bGUu dmlzaWJpbGl0eT0iIjtpZihzdHlsZS5ncmFwaGljPT09ZmFsc2Upe25vZGUuc3R5 bGUudmlzaWJpbGl0eT0iaGlkZGVuIjt9ZWxzZSBpZihzdHlsZS5leHRlcm5hbEdy YXBoaWMpe2lmKHN0eWxlLmdyYXBoaWNUaXRsZSl7bm9kZS5zZXRBdHRyaWJ1dGVO UyhudWxsLCJ0aXRsZSIsc3R5bGUuZ3JhcGhpY1RpdGxlKTt2YXIgbGFiZWw9dGhp cy5ub2RlRmFjdG9yeShudWxsLCJ0aXRsZSIpO2xhYmVsLnRleHRDb250ZW50PXN0 eWxlLmdyYXBoaWNUaXRsZTtub2RlLmFwcGVuZENoaWxkKGxhYmVsKTt9CmlmKHN0 eWxlLmdyYXBoaWNXaWR0aCYmc3R5bGUuZ3JhcGhpY0hlaWdodCl7bm9kZS5zZXRB dHRyaWJ1dGVOUyhudWxsLCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwibm9uZSIpO30K dmFyIHdpZHRoPXN0eWxlLmdyYXBoaWNXaWR0aHx8c3R5bGUuZ3JhcGhpY0hlaWdo dDt2YXIgaGVpZ2h0PXN0eWxlLmdyYXBoaWNIZWlnaHR8fHN0eWxlLmdyYXBoaWNX aWR0aDt3aWR0aD13aWR0aD93aWR0aDpzdHlsZS5wb2ludFJhZGl1cyoyO2hlaWdo dD1oZWlnaHQ/aGVpZ2h0OnN0eWxlLnBvaW50UmFkaXVzKjI7d2lkdGgqPXJlc29s dXRpb247aGVpZ2h0Kj1yZXNvbHV0aW9uO3ZhciB4T2Zmc2V0PShzdHlsZS5ncmFw aGljWE9mZnNldCE9dW5kZWZpbmVkKT9zdHlsZS5ncmFwaGljWE9mZnNldCpyZXNv bHV0aW9uOi0oMC41KndpZHRoKTt2YXIgeU9mZnNldD0oc3R5bGUuZ3JhcGhpY1lP ZmZzZXQhPXVuZGVmaW5lZCk/c3R5bGUuZ3JhcGhpY1lPZmZzZXQqcmVzb2x1dGlv bjotKDAuNSpoZWlnaHQpO3ZhciBvcGFjaXR5PXN0eWxlLmdyYXBoaWNPcGFjaXR5 fHxzdHlsZS5maWxsT3BhY2l0eTtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsIngi LG5vZGUuX3greE9mZnNldCk7bm9kZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5Iixu b2RlLl95K3lPZmZzZXQpO25vZGUuc2V0QXR0cmlidXRlTlMobnVsbCwid2lkdGgi LHdpZHRoKTtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsImhlaWdodCIsaGVpZ2h0 KTtub2RlLnNldEF0dHJpYnV0ZU5TKHRoaXMueGxpbmtucywiaHJlZiIsc3R5bGUu ZXh0ZXJuYWxHcmFwaGljKTtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsInN0eWxl Iiwib3BhY2l0eTogIitvcGFjaXR5KTtub2RlLm9uY2xpY2s9T3BlbkxheWVycy5S ZW5kZXJlci5TVkcyLnByZXZlbnREZWZhdWx0O31lbHNlIGlmKHRoaXMuaXNDb21w bGV4U3ltYm9sKHN0eWxlLmdyYXBoaWNOYW1lKSl7dmFyIG9mZnNldD1zdHlsZS5w b2ludFJhZGl1cyozKnJlc29sdXRpb247dmFyIHNpemU9b2Zmc2V0KjI7dmFyIHNy Yz10aGlzLmltcG9ydFN5bWJvbChzdHlsZS5ncmFwaGljTmFtZSk7d2lkdGhGYWN0 b3I9dGhpcy5zeW1ib2xNZXRyaWNzW3NyYy5pZF0uc2l6ZSozL3NpemUqcmVzb2x1 dGlvbjt2YXIgcGFyZW50PW5vZGUucGFyZW50Tm9kZTt2YXIgbmV4dFNpYmxpbmc9 bm9kZS5uZXh0U2libGluZztpZihwYXJlbnQpe3BhcmVudC5yZW1vdmVDaGlsZChu b2RlKTt9Cm5vZGUuZmlyc3RDaGlsZCYmbm9kZS5yZW1vdmVDaGlsZChub2RlLmZp cnN0Q2hpbGQpO25vZGUuYXBwZW5kQ2hpbGQoc3JjLmZpcnN0Q2hpbGQuY2xvbmVO b2RlKHRydWUpKTtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsInZpZXdCb3giLHNy Yy5nZXRBdHRyaWJ1dGVOUyhudWxsLCJ2aWV3Qm94IikpO25vZGUuc2V0QXR0cmli dXRlTlMobnVsbCwid2lkdGgiLHNpemUpO25vZGUuc2V0QXR0cmlidXRlTlMobnVs bCwiaGVpZ2h0IixzaXplKTtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsIngiLG5v ZGUuX3gtb2Zmc2V0KTtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLG5vZGUu X3ktb2Zmc2V0KTtpZihuZXh0U2libGluZyl7cGFyZW50Lmluc2VydEJlZm9yZShu b2RlLG5leHRTaWJsaW5nKTt9ZWxzZSBpZihwYXJlbnQpe3BhcmVudC5hcHBlbmRD aGlsZChub2RlKTt9fWVsc2V7bm9kZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJyIixz dHlsZS5wb2ludFJhZGl1cypyZXNvbHV0aW9uKTt9CnZhciByb3RhdGlvbj1zdHls ZS5yb3RhdGlvbjtpZihyb3RhdGlvbiE9PXVuZGVmaW5lZHx8bm9kZS5fcm90YXRp b24hPT11bmRlZmluZWQpe25vZGUuX3JvdGF0aW9uPXJvdGF0aW9uO3JvdGF0aW9u fD0wO2lmKG5vZGUubm9kZU5hbWUhPT0ic3ZnIil7bm9kZS5zZXRBdHRyaWJ1dGVO UyhudWxsLCJ0cmFuc2Zvcm0iLFsicm90YXRlKCIscm90YXRpb24sbm9kZS5feCxu b2RlLl95LCIpIl0uam9pbigiICIpKTt9ZWxzZXt2YXIgbWV0cmljcz10aGlzLnN5 bWJvbE1ldHJpY3Nbc3JjLmlkXTtub2RlLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRl TlMobnVsbCwidHJhbnNmb3JtIixbInJvdGF0ZSgiLHJvdGF0aW9uLG1ldHJpY3Mu eCxtZXRyaWNzLnksIikiXS5qb2luKCIgIikpO319fQppZihvcHRpb25zLmlzRmls bGVkKXtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsImZpbGwiLHN0eWxlLmZpbGxD b2xvcik7bm9kZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsLW9wYWNpdHkiLHN0 eWxlLmZpbGxPcGFjaXR5KTt9ZWxzZXtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGws ImZpbGwiLCJub25lIik7fQppZihvcHRpb25zLmlzU3Ryb2tlZCl7bm9kZS5zZXRB dHRyaWJ1dGVOUyhudWxsLCJzdHJva2UiLHN0eWxlLnN0cm9rZUNvbG9yKTtub2Rl LnNldEF0dHJpYnV0ZU5TKG51bGwsInN0cm9rZS1vcGFjaXR5IixzdHlsZS5zdHJv a2VPcGFjaXR5KTtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsInN0cm9rZS13aWR0 aCIsc3R5bGUuc3Ryb2tlV2lkdGgqd2lkdGhGYWN0b3IpO25vZGUuc2V0QXR0cmli dXRlTlMobnVsbCwic3Ryb2tlLWxpbmVjYXAiLHN0eWxlLnN0cm9rZUxpbmVjYXB8 fCJyb3VuZCIpO25vZGUuc2V0QXR0cmlidXRlTlMobnVsbCwic3Ryb2tlLWxpbmVq b2luIiwicm91bmQiKTtzdHlsZS5zdHJva2VEYXNoc3R5bGUmJm5vZGUuc2V0QXR0 cmlidXRlTlMobnVsbCwic3Ryb2tlLWRhc2hhcnJheSIsdGhpcy5kYXNoU3R5bGUo c3R5bGUsd2lkdGhGYWN0b3IpKTt9ZWxzZXtub2RlLnNldEF0dHJpYnV0ZU5TKG51 bGwsInN0cm9rZSIsIm5vbmUiKTt9CmlmKHN0eWxlLnBvaW50ZXJFdmVudHMpe25v ZGUuc2V0QXR0cmlidXRlTlMobnVsbCwicG9pbnRlci1ldmVudHMiLHN0eWxlLnBv aW50ZXJFdmVudHMpO30KaWYoc3R5bGUuY3Vyc29yIT1udWxsKXtub2RlLnNldEF0 dHJpYnV0ZU5TKG51bGwsImN1cnNvciIsc3R5bGUuY3Vyc29yKTt9CnJldHVybiBu b2RlO30sZGFzaFN0eWxlOmZ1bmN0aW9uKHN0eWxlLHdpZHRoRmFjdG9yKXt2YXIg dz1zdHlsZS5zdHJva2VXaWR0aCp3aWR0aEZhY3Rvcjt2YXIgc3RyPXN0eWxlLnN0 cm9rZURhc2hzdHlsZTtzd2l0Y2goc3RyKXtjYXNlJ3NvbGlkJzpyZXR1cm4nbm9u ZSc7Y2FzZSdkb3QnOnJldHVyblt3aWR0aEZhY3Rvciw0KnddLmpvaW4oKTtjYXNl J2Rhc2gnOnJldHVybls0KncsNCp3XS5qb2luKCk7Y2FzZSdkYXNoZG90JzpyZXR1 cm5bNCp3LDQqdyx3aWR0aEZhY3Rvciw0KnddLmpvaW4oKTtjYXNlJ2xvbmdkYXNo JzpyZXR1cm5bOCp3LDQqd10uam9pbigpO2Nhc2UnbG9uZ2Rhc2hkb3QnOnJldHVy bls4KncsNCp3LHdpZHRoRmFjdG9yLDQqd10uam9pbigpO2RlZmF1bHQ6dmFyIHBh cnRzPU9wZW5MYXllcnMuU3RyaW5nLnRyaW0oc3RyKS5zcGxpdCgvXHMrL2cpO2Zv cih2YXIgaT0wLGlpPXBhcnRzLmxlbmd0aDtpPGlpO2krKyl7cGFydHNbaV09cGFy dHNbaV0qd2lkdGhGYWN0b3I7fQpyZXR1cm4gcGFydHMuam9pbigpO319LGNyZWF0 ZU5vZGU6ZnVuY3Rpb24odHlwZSxpZCl7dmFyIG5vZGU9ZG9jdW1lbnQuY3JlYXRl RWxlbWVudE5TKHRoaXMueG1sbnMsdHlwZSk7aWYoaWQpe25vZGUuc2V0QXR0cmli dXRlTlMobnVsbCwiaWQiLGlkKTt9CnJldHVybiBub2RlO30sbm9kZVR5cGVDb21w YXJlOmZ1bmN0aW9uKG5vZGUsdHlwZSl7cmV0dXJuKHR5cGU9PW5vZGUubm9kZU5h bWUpO30sY3JlYXRlUmVuZGVyUm9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5v ZGVGYWN0b3J5KHRoaXMuY29udGFpbmVyLmlkKyJfc3ZnUm9vdCIsInN2ZyIpO30s Y3JlYXRlUm9vdDpmdW5jdGlvbihzdWZmaXgpe3JldHVybiB0aGlzLm5vZGVGYWN0 b3J5KHRoaXMuY29udGFpbmVyLmlkK3N1ZmZpeCwiZyIpO30sY3JlYXRlRGVmczpm dW5jdGlvbigpe3ZhciBkZWZzPXRoaXMubm9kZUZhY3RvcnkodGhpcy5jb250YWlu ZXIuaWQrIl9kZWZzIiwiZGVmcyIpO3RoaXMucmVuZGVyZXJSb290LmFwcGVuZENo aWxkKGRlZnMpO3JldHVybiBkZWZzO30sZHJhd1BvaW50OmZ1bmN0aW9uKG5vZGUs Z2VvbWV0cnkpe3JldHVybiB0aGlzLmRyYXdDaXJjbGUobm9kZSxnZW9tZXRyeSwx KTt9LGRyYXdDaXJjbGU6ZnVuY3Rpb24obm9kZSxnZW9tZXRyeSxyYWRpdXMpe3Zh ciB4PWdlb21ldHJ5Lng7dmFyIHk9LWdlb21ldHJ5Lnk7bm9kZS5zZXRBdHRyaWJ1 dGVOUyhudWxsLCJjeCIseCk7bm9kZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjeSIs eSk7bm9kZS5feD14O25vZGUuX3k9eTtub2RlLl9yYWRpdXM9cmFkaXVzO3JldHVy biBub2RlO30sZHJhd0xpbmVTdHJpbmc6ZnVuY3Rpb24obm9kZSxnZW9tZXRyeSl7 dmFyIHBhdGg9dGhpcy5nZXRDb21wb25lbnRzU3RyaW5nKGdlb21ldHJ5LmNvbXBv bmVudHMpO25vZGUuc2V0QXR0cmlidXRlTlMobnVsbCwicG9pbnRzIixwYXRoKTty ZXR1cm4gbm9kZTt9LGRyYXdMaW5lYXJSaW5nOmZ1bmN0aW9uKG5vZGUsZ2VvbWV0 cnkpe3ZhciBwYXRoPXRoaXMuZ2V0Q29tcG9uZW50c1N0cmluZyhnZW9tZXRyeS5j b21wb25lbnRzKTtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsInBvaW50cyIscGF0 aCk7cmV0dXJuIG5vZGU7fSxkcmF3UG9seWdvbjpmdW5jdGlvbihub2RlLGdlb21l dHJ5KXt2YXIgZD1bXTt2YXIgZHJhdz10cnVlO3ZhciBjb21wbGV0ZT10cnVlO3Zh ciBsaW5lYXJSaW5nUmVzdWx0LHBhdGg7Zm9yKHZhciBqPTAsbGVuPWdlb21ldHJ5 LmNvbXBvbmVudHMubGVuZ3RoO2o8bGVuO2orKyl7ZC5wdXNoKCJNIik7cGF0aD10 aGlzLmdldENvbXBvbmVudHNTdHJpbmcoZ2VvbWV0cnkuY29tcG9uZW50c1tqXS5j b21wb25lbnRzLCIgIik7ZC5wdXNoKHBhdGgpO30KZC5wdXNoKCJ6Iik7bm9kZS5z ZXRBdHRyaWJ1dGVOUyhudWxsLCJkIixkLmpvaW4oIiAiKSk7bm9kZS5zZXRBdHRy aWJ1dGVOUyhudWxsLCJmaWxsLXJ1bGUiLCJldmVub2RkIik7cmV0dXJuIG5vZGU7 fSxkcmF3UmVjdGFuZ2xlOmZ1bmN0aW9uKG5vZGUsZ2VvbWV0cnkpe25vZGUuc2V0 QXR0cmlidXRlTlMobnVsbCwieCIsZ2VvbWV0cnkueCk7bm9kZS5zZXRBdHRyaWJ1 dGVOUyhudWxsLCJ5IiwtZ2VvbWV0cnkueSk7bm9kZS5zZXRBdHRyaWJ1dGVOUyhu dWxsLCJ3aWR0aCIsZ2VvbWV0cnkud2lkdGgpO25vZGUuc2V0QXR0cmlidXRlTlMo bnVsbCwiaGVpZ2h0IixnZW9tZXRyeS5oZWlnaHQpO3JldHVybiBub2RlO30sZHJh d1N1cmZhY2U6ZnVuY3Rpb24obm9kZSxnZW9tZXRyeSl7dmFyIGQ9W107dmFyIGRy YXc9dHJ1ZTtmb3IodmFyIGk9MCxsZW49Z2VvbWV0cnkuY29tcG9uZW50cy5sZW5n dGg7aTxsZW47aSsrKXtpZigoaSUzKT09MCYmKGkvMyk9PTApe3ZhciBjb21wb25l bnQ9dGhpcy5nZXRTaG9ydFN0cmluZyhnZW9tZXRyeS5jb21wb25lbnRzW2ldKTtk LnB1c2goIk0iLGNvbXBvbmVudCk7fWVsc2UgaWYoKGklMyk9PTEpe3ZhciBjb21w b25lbnQ9dGhpcy5nZXRTaG9ydFN0cmluZyhnZW9tZXRyeS5jb21wb25lbnRzW2ld KTtkLnB1c2goIkMiLGNvbXBvbmVudCk7fWVsc2V7dmFyIGNvbXBvbmVudD10aGlz LmdldFNob3J0U3RyaW5nKGdlb21ldHJ5LmNvbXBvbmVudHNbaV0pO2QucHVzaChj b21wb25lbnQpO319CmQucHVzaCgiWiIpO25vZGUuc2V0QXR0cmlidXRlTlMobnVs bCwiZCIsZC5qb2luKCIgIikpO3JldHVybiBub2RlO30sZHJhd1RleHQ6ZnVuY3Rp b24oZmVhdHVyZUlkLHN0eWxlLGxvY2F0aW9uKXt2YXIgZz1PcGVuTGF5ZXJzLlJl bmRlcmVyLk5HLnByb3RvdHlwZS5kcmF3VGV4dC5hcHBseSh0aGlzLGFyZ3VtZW50 cyk7dmFyIHRleHQ9Zy5maXJzdENoaWxkfHx0aGlzLm5vZGVGYWN0b3J5KGZlYXR1 cmVJZCt0aGlzLkxBQkVMX0lEX1NVRkZJWCsiX3RleHQiLCJ0ZXh0Iik7dmFyIHJl cz10aGlzLmdldFJlc29sdXRpb24oKTt0ZXh0LnNldEF0dHJpYnV0ZU5TKG51bGws IngiLGxvY2F0aW9uLngvcmVzKTt0ZXh0LnNldEF0dHJpYnV0ZU5TKG51bGwsInki LC1sb2NhdGlvbi55L3Jlcyk7Zy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ0cmFuc2Zv cm0iLCJzY2FsZSgiK3JlcysiKSIpO2lmKHN0eWxlLmZvbnRDb2xvcil7dGV4dC5z ZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsIixzdHlsZS5mb250Q29sb3IpO30KaWYo c3R5bGUuZm9udE9wYWNpdHkpe3RleHQuc2V0QXR0cmlidXRlTlMobnVsbCwib3Bh Y2l0eSIsc3R5bGUuZm9udE9wYWNpdHkpO30KaWYoc3R5bGUuZm9udEZhbWlseSl7 dGV4dC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmb250LWZhbWlseSIsc3R5bGUuZm9u dEZhbWlseSk7fQppZihzdHlsZS5mb250U2l6ZSl7dGV4dC5zZXRBdHRyaWJ1dGVO UyhudWxsLCJmb250LXNpemUiLHN0eWxlLmZvbnRTaXplKTt9CmlmKHN0eWxlLmZv bnRXZWlnaHQpe3RleHQuc2V0QXR0cmlidXRlTlMobnVsbCwiZm9udC13ZWlnaHQi LHN0eWxlLmZvbnRXZWlnaHQpO30KaWYoc3R5bGUuZm9udFN0eWxlKXt0ZXh0LnNl dEF0dHJpYnV0ZU5TKG51bGwsImZvbnQtc3R5bGUiLHN0eWxlLmZvbnRTdHlsZSk7 fQppZihzdHlsZS5sYWJlbFNlbGVjdD09PXRydWUpe3RleHQuc2V0QXR0cmlidXRl TlMobnVsbCwicG9pbnRlci1ldmVudHMiLCJ2aXNpYmxlIik7dGV4dC5fZmVhdHVy ZUlkPWZlYXR1cmVJZDt9ZWxzZXt0ZXh0LnNldEF0dHJpYnV0ZU5TKG51bGwsInBv aW50ZXItZXZlbnRzIiwibm9uZSIpO30KdmFyIGFsaWduPXN0eWxlLmxhYmVsQWxp Z258fCJjbSI7dGV4dC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ0ZXh0LWFuY2hvciIs T3BlbkxheWVycy5SZW5kZXJlci5TVkcyLkxBQkVMX0FMSUdOW2FsaWduWzBdXXx8 Im1pZGRsZSIpO2lmKE9wZW5MYXllcnMuSVNfR0VDS089PT10cnVlKXt0ZXh0LnNl dEF0dHJpYnV0ZU5TKG51bGwsImRvbWluYW50LWJhc2VsaW5lIixPcGVuTGF5ZXJz LlJlbmRlcmVyLlNWRzIuTEFCRUxfQUxJR05bYWxpZ25bMV1dfHwiY2VudHJhbCIp O30KdmFyIGxhYmVsUm93cz1zdHlsZS5sYWJlbC5zcGxpdCgnXG4nKTt2YXIgbnVt Um93cz1sYWJlbFJvd3MubGVuZ3RoO3doaWxlKHRleHQuY2hpbGROb2Rlcy5sZW5n dGg+bnVtUm93cyl7dGV4dC5yZW1vdmVDaGlsZCh0ZXh0Lmxhc3RDaGlsZCk7fQpm b3IodmFyIGk9MDtpPG51bVJvd3M7aSsrKXt2YXIgdHNwYW49dGV4dC5jaGlsZE5v ZGVzW2ldfHx0aGlzLm5vZGVGYWN0b3J5KGZlYXR1cmVJZCt0aGlzLkxBQkVMX0lE X1NVRkZJWCsiX3RzcGFuXyIraSwidHNwYW4iKTtpZihzdHlsZS5sYWJlbFNlbGVj dD09PXRydWUpe3RzcGFuLl9mZWF0dXJlSWQ9ZmVhdHVyZUlkO30KaWYoT3Blbkxh eWVycy5JU19HRUNLTz09PWZhbHNlKXt0c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxs LCJiYXNlbGluZS1zaGlmdCIsT3BlbkxheWVycy5SZW5kZXJlci5TVkcyLkxBQkVM X1ZTSElGVFthbGlnblsxXV18fCItMzUlIik7fQp0c3Bhbi5zZXRBdHRyaWJ1dGUo IngiLGxvY2F0aW9uLngvcmVzKTtpZihpPT0wKXt2YXIgdmZhY3Rvcj1PcGVuTGF5 ZXJzLlJlbmRlcmVyLlNWRzIuTEFCRUxfVkZBQ1RPUlthbGlnblsxXV07aWYodmZh Y3Rvcj09bnVsbCl7dmZhY3Rvcj0tLjU7fQp0c3Bhbi5zZXRBdHRyaWJ1dGUoImR5 IiwodmZhY3RvcioobnVtUm93cy0xKSkrImVtIik7fWVsc2V7dHNwYW4uc2V0QXR0 cmlidXRlKCJkeSIsIjFlbSIpO30KdHNwYW4udGV4dENvbnRlbnQ9KGxhYmVsUm93 c1tpXT09PScnKT8nICc6bGFiZWxSb3dzW2ldO2lmKCF0c3Bhbi5wYXJlbnROb2Rl KXt0ZXh0LmFwcGVuZENoaWxkKHRzcGFuKTt9fQppZighdGV4dC5wYXJlbnROb2Rl KXtnLmFwcGVuZENoaWxkKHRleHQpO30KcmV0dXJuIGc7fSxnZXRDb21wb25lbnRz U3RyaW5nOmZ1bmN0aW9uKGNvbXBvbmVudHMsc2VwYXJhdG9yKXt2YXIgbGVuPWNv bXBvbmVudHMubGVuZ3RoO3ZhciBzdHJpbmdzPW5ldyBBcnJheShsZW4pO2Zvcih2 YXIgaT0wO2k8bGVuO2krKyl7c3RyaW5nc1tpXT10aGlzLmdldFNob3J0U3RyaW5n KGNvbXBvbmVudHNbaV0pO30KcmV0dXJuIHN0cmluZ3Muam9pbihzZXBhcmF0b3J8 fCIsIik7fSxnZXRTaG9ydFN0cmluZzpmdW5jdGlvbihwb2ludCl7cmV0dXJuIHBv aW50LngrIiwiKygtcG9pbnQueSk7fSxpbXBvcnRTeW1ib2w6ZnVuY3Rpb24oZ3Jh cGhpY05hbWUpe2lmKCF0aGlzLmRlZnMpe3RoaXMuZGVmcz10aGlzLmNyZWF0ZURl ZnMoKTt9CnZhciBpZD10aGlzLmNvbnRhaW5lci5pZCsiLSIrZ3JhcGhpY05hbWU7 dmFyIGV4aXN0aW5nPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtpZihleGlz dGluZyE9bnVsbCl7cmV0dXJuIGV4aXN0aW5nO30KdmFyIHN5bWJvbD1PcGVuTGF5 ZXJzLlJlbmRlcmVyLnN5bWJvbFtncmFwaGljTmFtZV07aWYoIXN5bWJvbCl7dGhy b3cgbmV3IEVycm9yKGdyYXBoaWNOYW1lKycgaXMgbm90IGEgdmFsaWQgc3ltYm9s IG5hbWUnKTt9CnZhciBzeW1ib2xOb2RlPXRoaXMubm9kZUZhY3RvcnkoaWQsInN5 bWJvbCIpO3ZhciBub2RlPXRoaXMubm9kZUZhY3RvcnkobnVsbCwicG9seWdvbiIp O3N5bWJvbE5vZGUuYXBwZW5kQ2hpbGQobm9kZSk7dmFyIHN5bWJvbEV4dGVudD1u ZXcgT3BlbkxheWVycy5Cb3VuZHMoTnVtYmVyLk1BWF9WQUxVRSxOdW1iZXIuTUFY X1ZBTFVFLDAsMCk7dmFyIHBvaW50cz1bXTt2YXIgeCx5O2Zvcih2YXIgaT0wLGxl bj1zeW1ib2wubGVuZ3RoO2k8bGVuO2k9aSsyKXt4PXN5bWJvbFtpXTt5PXN5bWJv bFtpKzFdO3N5bWJvbEV4dGVudC5sZWZ0PU1hdGgubWluKHN5bWJvbEV4dGVudC5s ZWZ0LHgpO3N5bWJvbEV4dGVudC5ib3R0b209TWF0aC5taW4oc3ltYm9sRXh0ZW50 LmJvdHRvbSx5KTtzeW1ib2xFeHRlbnQucmlnaHQ9TWF0aC5tYXgoc3ltYm9sRXh0 ZW50LnJpZ2h0LHgpO3N5bWJvbEV4dGVudC50b3A9TWF0aC5tYXgoc3ltYm9sRXh0 ZW50LnRvcCx5KTtwb2ludHMucHVzaCh4LCIsIix5KTt9Cm5vZGUuc2V0QXR0cmli dXRlTlMobnVsbCwicG9pbnRzIixwb2ludHMuam9pbigiICIpKTt2YXIgd2lkdGg9 c3ltYm9sRXh0ZW50LmdldFdpZHRoKCk7dmFyIGhlaWdodD1zeW1ib2xFeHRlbnQu Z2V0SGVpZ2h0KCk7dmFyIHZpZXdCb3g9W3N5bWJvbEV4dGVudC5sZWZ0LXdpZHRo LHN5bWJvbEV4dGVudC5ib3R0b20taGVpZ2h0LHdpZHRoKjMsaGVpZ2h0KjNdO3N5 bWJvbE5vZGUuc2V0QXR0cmlidXRlTlMobnVsbCwidmlld0JveCIsdmlld0JveC5q b2luKCIgIikpO3RoaXMuc3ltYm9sTWV0cmljc1tpZF09e3NpemU6TWF0aC5tYXgo d2lkdGgsaGVpZ2h0KSx4OnN5bWJvbEV4dGVudC5nZXRDZW50ZXJMb25MYXQoKS5s b24seTpzeW1ib2xFeHRlbnQuZ2V0Q2VudGVyTG9uTGF0KCkubGF0fTt0aGlzLmRl ZnMuYXBwZW5kQ2hpbGQoc3ltYm9sTm9kZSk7cmV0dXJuIHN5bWJvbE5vZGU7fSxn ZXRGZWF0dXJlSWRGcm9tRXZlbnQ6ZnVuY3Rpb24oZXZ0KXt2YXIgZmVhdHVyZUlk PU9wZW5MYXllcnMuUmVuZGVyZXIuRWxlbWVudHMucHJvdG90eXBlLmdldEZlYXR1 cmVJZEZyb21FdmVudC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIWZlYXR1cmVJ ZCl7dmFyIHRhcmdldD1ldnQudGFyZ2V0O2ZlYXR1cmVJZD10YXJnZXQucGFyZW50 Tm9kZSYmdGFyZ2V0IT10aGlzLnJlbmRlcmVyUm9vdCYmdGFyZ2V0LnBhcmVudE5v ZGUuX2ZlYXR1cmVJZDt9CnJldHVybiBmZWF0dXJlSWQ7fSxDTEFTU19OQU1FOiJP cGVuTGF5ZXJzLlJlbmRlcmVyLlNWRzIifSk7T3BlbkxheWVycy5SZW5kZXJlci5T VkcyLkxBQkVMX0FMSUdOPXsibCI6InN0YXJ0IiwiciI6ImVuZCIsImIiOiJib3R0 b20iLCJ0IjoiaGFuZ2luZyJ9O09wZW5MYXllcnMuUmVuZGVyZXIuU1ZHMi5MQUJF TF9WU0hJRlQ9eyJ0IjoiLTcwJSIsImIiOiIwIn07T3BlbkxheWVycy5SZW5kZXJl ci5TVkcyLkxBQkVMX1ZGQUNUT1I9eyJ0IjowLCJiIjotMX07T3BlbkxheWVycy5S ZW5kZXJlci5TVkcyLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKGUpe2UucHJldmVu dERlZmF1bHQmJmUucHJldmVudERlZmF1bHQoKTt9O09wZW5MYXllcnMuS2luZXRp Yz1PcGVuTGF5ZXJzLkNsYXNzKHt0aHJlc2hvbGQ6MCxpbnRlcnZhbDoxMCxkZWNl bGVyYXRpb246MC4wMDM1LG5iUG9pbnRzOjEwMCxkZWxheToyMDAscG9pbnRzOnVu ZGVmaW5lZCx0aW1lcklkOnVuZGVmaW5lZCxpbml0aWFsaXplOmZ1bmN0aW9uKG9w dGlvbnMpe09wZW5MYXllcnMuVXRpbC5leHRlbmQodGhpcyxvcHRpb25zKTt9LGJl Z2luOmZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVySWQpO3RoaXMu dGltZXJJZD11bmRlZmluZWQ7dGhpcy5wb2ludHM9W107fSx1cGRhdGU6ZnVuY3Rp b24oeHkpe3RoaXMucG9pbnRzLnVuc2hpZnQoe3h5Onh5LHRpY2s6bmV3IERhdGUo KS5nZXRUaW1lKCl9KTtpZih0aGlzLnBvaW50cy5sZW5ndGg+dGhpcy5uYlBvaW50 cyl7dGhpcy5wb2ludHMucG9wKCk7fX0sZW5kOmZ1bmN0aW9uKHh5KXt2YXIgbGFz dCxub3c9bmV3IERhdGUoKS5nZXRUaW1lKCk7Zm9yKHZhciBpPTAsbD10aGlzLnBv aW50cy5sZW5ndGgscG9pbnQ7aTxsO2krKyl7cG9pbnQ9dGhpcy5wb2ludHNbaV07 aWYobm93LXBvaW50LnRpY2s+dGhpcy5kZWxheSl7YnJlYWs7fQpsYXN0PXBvaW50 O30KaWYoIWxhc3Qpe3JldHVybjt9CnZhciB0aW1lPW5ldyBEYXRlKCkuZ2V0VGlt ZSgpLWxhc3QudGljazt2YXIgZGlzdD1NYXRoLnNxcnQoTWF0aC5wb3coeHkueC1s YXN0Lnh5LngsMikrCk1hdGgucG93KHh5LnktbGFzdC54eS55LDIpKTt2YXIgc3Bl ZWQ9ZGlzdC90aW1lO2lmKHNwZWVkPT0wfHxzcGVlZDx0aGlzLnRocmVzaG9sZCl7 cmV0dXJuO30KdmFyIHRoZXRhPU1hdGguYXNpbigoeHkueS1sYXN0Lnh5LnkpL2Rp c3QpO2lmKGxhc3QueHkueDw9eHkueCl7dGhldGE9TWF0aC5QSS10aGV0YTt9CnJl dHVybntzcGVlZDpzcGVlZCx0aGV0YTp0aGV0YX07fSxtb3ZlOmZ1bmN0aW9uKGlu Zm8sY2FsbGJhY2spe3ZhciB2MD1pbmZvLnNwZWVkO3ZhciBmeD1NYXRoLmNvcyhp bmZvLnRoZXRhKTt2YXIgZnk9LU1hdGguc2luKGluZm8udGhldGEpO3ZhciB0aW1l PTA7dmFyIGluaXRpYWxUaW1lPW5ldyBEYXRlKCkuZ2V0VGltZSgpO3ZhciBsYXN0 WD0wO3ZhciBsYXN0WT0wO3ZhciB0aW1lckNhbGxiYWNrPWZ1bmN0aW9uKCl7aWYo dGhpcy50aW1lcklkPT1udWxsKXtyZXR1cm47fQp0aW1lKz10aGlzLmludGVydmFs O3ZhciByZWFsVGltZT1uZXcgRGF0ZSgpLmdldFRpbWUoKS1pbml0aWFsVGltZTt2 YXIgdD0odGltZStyZWFsVGltZSkvMi4wO3ZhciBwPSgtdGhpcy5kZWNlbGVyYXRp b24qTWF0aC5wb3codCwyKSkvMi4wK3YwKnQ7dmFyIHg9cCpmeDt2YXIgeT1wKmZ5 O3ZhciBhcmdzPXt9O2FyZ3MuZW5kPWZhbHNlO3ZhciB2PS10aGlzLmRlY2VsZXJh dGlvbip0K3YwO2lmKHY8PTApe2NsZWFySW50ZXJ2YWwodGhpcy50aW1lcklkKTt0 aGlzLnRpbWVySWQ9bnVsbDthcmdzLmVuZD10cnVlO30KYXJncy54PXgtbGFzdFg7 YXJncy55PXktbGFzdFk7bGFzdFg9eDtsYXN0WT15O2NhbGxiYWNrKGFyZ3MueCxh cmdzLnksYXJncy5lbmQpO307dGhpcy50aW1lcklkPXdpbmRvdy5zZXRJbnRlcnZh bChPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQodGltZXJDYWxsYmFjayx0aGlzKSx0 aGlzLmludGVydmFsKTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuS2luZXRpYyJ9 KTtPcGVuTGF5ZXJzLlByb3h5SG9zdD0iIjtPcGVuTGF5ZXJzLm51bGxIYW5kbGVy PWZ1bmN0aW9uKHJlcXVlc3Qpe09wZW5MYXllcnMuQ29uc29sZS51c2VyRXJyb3Io T3BlbkxheWVycy5pMThuKCJ1bmhhbmRsZWRSZXF1ZXN0Iix7J3N0YXR1c1RleHQn OnJlcXVlc3Quc3RhdHVzVGV4dH0pKTt9O09wZW5MYXllcnMubG9hZFVSTD1mdW5j dGlvbih1cmkscGFyYW1zLGNhbGxlcixvbkNvbXBsZXRlLG9uRmFpbHVyZSl7aWYo dHlwZW9mIHBhcmFtcz09J3N0cmluZycpe3BhcmFtcz1PcGVuTGF5ZXJzLlV0aWwu Z2V0UGFyYW1ldGVycyhwYXJhbXMpO30KdmFyIHN1Y2Nlc3M9KG9uQ29tcGxldGUp P29uQ29tcGxldGU6T3BlbkxheWVycy5udWxsSGFuZGxlcjt2YXIgZmFpbHVyZT0o b25GYWlsdXJlKT9vbkZhaWx1cmU6T3BlbkxheWVycy5udWxsSGFuZGxlcjtyZXR1 cm4gT3BlbkxheWVycy5SZXF1ZXN0LkdFVCh7dXJsOnVyaSxwYXJhbXM6cGFyYW1z LHN1Y2Nlc3M6c3VjY2VzcyxmYWlsdXJlOmZhaWx1cmUsc2NvcGU6Y2FsbGVyfSk7 fTtPcGVuTGF5ZXJzLnBhcnNlWE1MU3RyaW5nPWZ1bmN0aW9uKHRleHQpe3ZhciBp bmRleD10ZXh0LmluZGV4T2YoJzwnKTtpZihpbmRleD4wKXt0ZXh0PXRleHQuc3Vi c3RyaW5nKGluZGV4KTt9CnZhciBhamF4UmVzcG9uc2U9T3BlbkxheWVycy5VdGls LlRyeShmdW5jdGlvbigpe3ZhciB4bWxkb209bmV3IEFjdGl2ZVhPYmplY3QoJ01p Y3Jvc29mdC5YTUxET00nKTt4bWxkb20ubG9hZFhNTCh0ZXh0KTtyZXR1cm4geG1s ZG9tO30sZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJv bVN0cmluZyh0ZXh0LCd0ZXh0L3htbCcpO30sZnVuY3Rpb24oKXt2YXIgcmVxPW5l dyBYTUxIdHRwUmVxdWVzdCgpO3JlcS5vcGVuKCJHRVQiLCJkYXRhOiIrInRleHQv eG1sIisiO2NoYXJzZXQ9dXRmLTgsIitlbmNvZGVVUklDb21wb25lbnQodGV4dCks ZmFsc2UpO2lmKHJlcS5vdmVycmlkZU1pbWVUeXBlKXtyZXEub3ZlcnJpZGVNaW1l VHlwZSgidGV4dC94bWwiKTt9CnJlcS5zZW5kKG51bGwpO3JldHVybiByZXEucmVz cG9uc2VYTUw7fSk7cmV0dXJuIGFqYXhSZXNwb25zZTt9O09wZW5MYXllcnMuQWph eD17ZW1wdHlGdW5jdGlvbjpmdW5jdGlvbigpe30sZ2V0VHJhbnNwb3J0OmZ1bmN0 aW9uKCl7cmV0dXJuIE9wZW5MYXllcnMuVXRpbC5UcnkoZnVuY3Rpb24oKXtyZXR1 cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7fSxmdW5jdGlvbigpe3JldHVybiBuZXcg QWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAnKTt9LGZ1bmN0aW9uKCl7cmV0 dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpO30pfHxm YWxzZTt9LGFjdGl2ZVJlcXVlc3RDb3VudDowfTtPcGVuTGF5ZXJzLkFqYXguUmVz cG9uZGVycz17cmVzcG9uZGVyczpbXSxyZWdpc3RlcjpmdW5jdGlvbihyZXNwb25k ZXJUb0FkZCl7Zm9yKHZhciBpPTA7aTx0aGlzLnJlc3BvbmRlcnMubGVuZ3RoO2kr Kyl7aWYocmVzcG9uZGVyVG9BZGQ9PXRoaXMucmVzcG9uZGVyc1tpXSl7cmV0dXJu O319CnRoaXMucmVzcG9uZGVycy5wdXNoKHJlc3BvbmRlclRvQWRkKTt9LHVucmVn aXN0ZXI6ZnVuY3Rpb24ocmVzcG9uZGVyVG9SZW1vdmUpe09wZW5MYXllcnMuVXRp bC5yZW1vdmVJdGVtKHRoaXMucmVwb25kZXJzLHJlc3BvbmRlclRvUmVtb3ZlKTt9 LGRpc3BhdGNoOmZ1bmN0aW9uKGNhbGxiYWNrLHJlcXVlc3QsdHJhbnNwb3J0KXt2 YXIgcmVzcG9uZGVyO2Zvcih2YXIgaT0wO2k8dGhpcy5yZXNwb25kZXJzLmxlbmd0 aDtpKyspe3Jlc3BvbmRlcj10aGlzLnJlc3BvbmRlcnNbaV07aWYocmVzcG9uZGVy W2NhbGxiYWNrXSYmdHlwZW9mIHJlc3BvbmRlcltjYWxsYmFja109PSdmdW5jdGlv bicpe3RyeXtyZXNwb25kZXJbY2FsbGJhY2tdLmFwcGx5KHJlc3BvbmRlcixbcmVx dWVzdCx0cmFuc3BvcnRdKTt9Y2F0Y2goZSl7fX19fX07T3BlbkxheWVycy5BamF4 LlJlc3BvbmRlcnMucmVnaXN0ZXIoe29uQ3JlYXRlOmZ1bmN0aW9uKCl7T3Blbkxh eWVycy5BamF4LmFjdGl2ZVJlcXVlc3RDb3VudCsrO30sb25Db21wbGV0ZTpmdW5j dGlvbigpe09wZW5MYXllcnMuQWpheC5hY3RpdmVSZXF1ZXN0Q291bnQtLTt9fSk7 T3BlbkxheWVycy5BamF4LkJhc2U9T3BlbkxheWVycy5DbGFzcyh7aW5pdGlhbGl6 ZTpmdW5jdGlvbihvcHRpb25zKXt0aGlzLm9wdGlvbnM9e21ldGhvZDoncG9zdCcs YXN5bmNocm9ub3VzOnRydWUsY29udGVudFR5cGU6J2FwcGxpY2F0aW9uL3htbCcs cGFyYW1ldGVyczonJ307T3BlbkxheWVycy5VdGlsLmV4dGVuZCh0aGlzLm9wdGlv bnMsb3B0aW9uc3x8e30pO3RoaXMub3B0aW9ucy5tZXRob2Q9dGhpcy5vcHRpb25z Lm1ldGhvZC50b0xvd2VyQ2FzZSgpO2lmKHR5cGVvZiB0aGlzLm9wdGlvbnMucGFy YW1ldGVycz09J3N0cmluZycpe3RoaXMub3B0aW9ucy5wYXJhbWV0ZXJzPU9wZW5M YXllcnMuVXRpbC5nZXRQYXJhbWV0ZXJzKHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJz KTt9fX0pO09wZW5MYXllcnMuQWpheC5SZXF1ZXN0PU9wZW5MYXllcnMuQ2xhc3Mo T3BlbkxheWVycy5BamF4LkJhc2Use19jb21wbGV0ZTpmYWxzZSxpbml0aWFsaXpl OmZ1bmN0aW9uKHVybCxvcHRpb25zKXtPcGVuTGF5ZXJzLkFqYXguQmFzZS5wcm90 b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7aWYoT3Blbkxh eWVycy5Qcm94eUhvc3QmJk9wZW5MYXllcnMuU3RyaW5nLnN0YXJ0c1dpdGgodXJs LCJodHRwIikpe3VybD1PcGVuTGF5ZXJzLlByb3h5SG9zdCtlbmNvZGVVUklDb21w b25lbnQodXJsKTt9CnRoaXMudHJhbnNwb3J0PU9wZW5MYXllcnMuQWpheC5nZXRU cmFuc3BvcnQoKTt0aGlzLnJlcXVlc3QodXJsKTt9LHJlcXVlc3Q6ZnVuY3Rpb24o dXJsKXt0aGlzLnVybD11cmw7dGhpcy5tZXRob2Q9dGhpcy5vcHRpb25zLm1ldGhv ZDt2YXIgcGFyYW1zPU9wZW5MYXllcnMuVXRpbC5leHRlbmQoe30sdGhpcy5vcHRp b25zLnBhcmFtZXRlcnMpO2lmKHRoaXMubWV0aG9kIT0nZ2V0JyYmdGhpcy5tZXRo b2QhPSdwb3N0Jyl7cGFyYW1zWydfbWV0aG9kJ109dGhpcy5tZXRob2Q7dGhpcy5t ZXRob2Q9J3Bvc3QnO30KdGhpcy5wYXJhbWV0ZXJzPXBhcmFtcztpZihwYXJhbXM9 T3BlbkxheWVycy5VdGlsLmdldFBhcmFtZXRlclN0cmluZyhwYXJhbXMpKXtpZih0 aGlzLm1ldGhvZD09J2dldCcpe3RoaXMudXJsKz0oKHRoaXMudXJsLmluZGV4T2Yo Jz8nKT4tMSk/JyYnOic/JykrcGFyYW1zO31lbHNlIGlmKC9Lb25xdWVyb3J8U2Fm YXJpfEtIVE1MLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKXtwYXJhbXMrPScm Xz0nO319CnRyeXt2YXIgcmVzcG9uc2U9bmV3IE9wZW5MYXllcnMuQWpheC5SZXNw b25zZSh0aGlzKTtpZih0aGlzLm9wdGlvbnMub25DcmVhdGUpe3RoaXMub3B0aW9u cy5vbkNyZWF0ZShyZXNwb25zZSk7fQpPcGVuTGF5ZXJzLkFqYXguUmVzcG9uZGVy cy5kaXNwYXRjaCgnb25DcmVhdGUnLHRoaXMscmVzcG9uc2UpO3RoaXMudHJhbnNw b3J0Lm9wZW4odGhpcy5tZXRob2QudG9VcHBlckNhc2UoKSx0aGlzLnVybCx0aGlz Lm9wdGlvbnMuYXN5bmNocm9ub3VzKTtpZih0aGlzLm9wdGlvbnMuYXN5bmNocm9u b3VzKXt3aW5kb3cuc2V0VGltZW91dChPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQo dGhpcy5yZXNwb25kVG9SZWFkeVN0YXRlLHRoaXMsMSksMTApO30KdGhpcy50cmFu c3BvcnQub25yZWFkeXN0YXRlY2hhbmdlPU9wZW5MYXllcnMuRnVuY3Rpb24uYmlu ZCh0aGlzLm9uU3RhdGVDaGFuZ2UsdGhpcyk7dGhpcy5zZXRSZXF1ZXN0SGVhZGVy cygpO3RoaXMuYm9keT10aGlzLm1ldGhvZD09J3Bvc3QnPyh0aGlzLm9wdGlvbnMu cG9zdEJvZHl8fHBhcmFtcyk6bnVsbDt0aGlzLnRyYW5zcG9ydC5zZW5kKHRoaXMu Ym9keSk7aWYoIXRoaXMub3B0aW9ucy5hc3luY2hyb25vdXMmJnRoaXMudHJhbnNw b3J0Lm92ZXJyaWRlTWltZVR5cGUpe3RoaXMub25TdGF0ZUNoYW5nZSgpO319Y2F0 Y2goZSl7dGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTt9fSxvblN0YXRlQ2hhbmdl OmZ1bmN0aW9uKCl7dmFyIHJlYWR5U3RhdGU9dGhpcy50cmFuc3BvcnQucmVhZHlT dGF0ZTtpZihyZWFkeVN0YXRlPjEmJiEoKHJlYWR5U3RhdGU9PTQpJiZ0aGlzLl9j b21wbGV0ZSkpe3RoaXMucmVzcG9uZFRvUmVhZHlTdGF0ZSh0aGlzLnRyYW5zcG9y dC5yZWFkeVN0YXRlKTt9fSxzZXRSZXF1ZXN0SGVhZGVyczpmdW5jdGlvbigpe3Zh ciBoZWFkZXJzPXsnWC1SZXF1ZXN0ZWQtV2l0aCc6J1hNTEh0dHBSZXF1ZXN0Jywn QWNjZXB0JzondGV4dC9qYXZhc2NyaXB0LCB0ZXh0L2h0bWwsIGFwcGxpY2F0aW9u L3htbCwgdGV4dC94bWwsICovKicsJ09wZW5MYXllcnMnOnRydWV9O2lmKHRoaXMu bWV0aG9kPT0ncG9zdCcpe2hlYWRlcnNbJ0NvbnRlbnQtdHlwZSddPXRoaXMub3B0 aW9ucy5jb250ZW50VHlwZSsKKHRoaXMub3B0aW9ucy5lbmNvZGluZz8nOyBjaGFy c2V0PScrdGhpcy5vcHRpb25zLmVuY29kaW5nOicnKTtpZih0aGlzLnRyYW5zcG9y dC5vdmVycmlkZU1pbWVUeXBlJiYobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgv R2Vja29cLyhcZHs0fSkvKXx8WzAsMjAwNV0pWzFdPDIwMDUpe2hlYWRlcnNbJ0Nv bm5lY3Rpb24nXT0nY2xvc2UnO319CmlmKHR5cGVvZiB0aGlzLm9wdGlvbnMucmVx dWVzdEhlYWRlcnM9PSdvYmplY3QnKXt2YXIgZXh0cmFzPXRoaXMub3B0aW9ucy5y ZXF1ZXN0SGVhZGVycztpZih0eXBlb2YgZXh0cmFzLnB1c2g9PSdmdW5jdGlvbicp e2Zvcih2YXIgaT0wLGxlbmd0aD1leHRyYXMubGVuZ3RoO2k8bGVuZ3RoO2krPTIp e2hlYWRlcnNbZXh0cmFzW2ldXT1leHRyYXNbaSsxXTt9fWVsc2V7Zm9yKHZhciBp IGluIGV4dHJhcyl7aGVhZGVyc1tpXT1leHRyYXNbaV07fX19CmZvcih2YXIgbmFt ZSBpbiBoZWFkZXJzKXt0aGlzLnRyYW5zcG9ydC5zZXRSZXF1ZXN0SGVhZGVyKG5h bWUsaGVhZGVyc1tuYW1lXSk7fX0sc3VjY2VzczpmdW5jdGlvbigpe3ZhciBzdGF0 dXM9dGhpcy5nZXRTdGF0dXMoKTtyZXR1cm4hc3RhdHVzfHwoc3RhdHVzPj0yMDAm JnN0YXR1czwzMDApO30sZ2V0U3RhdHVzOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiB0 aGlzLnRyYW5zcG9ydC5zdGF0dXN8fDA7fWNhdGNoKGUpe3JldHVybiAwO319LHJl c3BvbmRUb1JlYWR5U3RhdGU6ZnVuY3Rpb24ocmVhZHlTdGF0ZSl7dmFyIHN0YXRl PU9wZW5MYXllcnMuQWpheC5SZXF1ZXN0LkV2ZW50c1tyZWFkeVN0YXRlXTt2YXIg cmVzcG9uc2U9bmV3IE9wZW5MYXllcnMuQWpheC5SZXNwb25zZSh0aGlzKTtpZihz dGF0ZT09J0NvbXBsZXRlJyl7dHJ5e3RoaXMuX2NvbXBsZXRlPXRydWU7KHRoaXMu b3B0aW9uc1snb24nK3Jlc3BvbnNlLnN0YXR1c118fHRoaXMub3B0aW9uc1snb24n Kyh0aGlzLnN1Y2Nlc3MoKT8nU3VjY2Vzcyc6J0ZhaWx1cmUnKV18fE9wZW5MYXll cnMuQWpheC5lbXB0eUZ1bmN0aW9uKShyZXNwb25zZSk7fWNhdGNoKGUpe3RoaXMu ZGlzcGF0Y2hFeGNlcHRpb24oZSk7fQp2YXIgY29udGVudFR5cGU9cmVzcG9uc2Uu Z2V0SGVhZGVyKCdDb250ZW50LXR5cGUnKTt9CnRyeXsodGhpcy5vcHRpb25zWydv bicrc3RhdGVdfHxPcGVuTGF5ZXJzLkFqYXguZW1wdHlGdW5jdGlvbikocmVzcG9u c2UpO09wZW5MYXllcnMuQWpheC5SZXNwb25kZXJzLmRpc3BhdGNoKCdvbicrc3Rh dGUsdGhpcyxyZXNwb25zZSk7fWNhdGNoKGUpe3RoaXMuZGlzcGF0Y2hFeGNlcHRp b24oZSk7fQppZihzdGF0ZT09J0NvbXBsZXRlJyl7dGhpcy50cmFuc3BvcnQub25y ZWFkeXN0YXRlY2hhbmdlPU9wZW5MYXllcnMuQWpheC5lbXB0eUZ1bmN0aW9uO319 LGdldEhlYWRlcjpmdW5jdGlvbihuYW1lKXt0cnl7cmV0dXJuIHRoaXMudHJhbnNw b3J0LmdldFJlc3BvbnNlSGVhZGVyKG5hbWUpO31jYXRjaChlKXtyZXR1cm4gbnVs bDt9fSxkaXNwYXRjaEV4Y2VwdGlvbjpmdW5jdGlvbihleGNlcHRpb24pe3ZhciBo YW5kbGVyPXRoaXMub3B0aW9ucy5vbkV4Y2VwdGlvbjtpZihoYW5kbGVyKXtoYW5k bGVyKHRoaXMsZXhjZXB0aW9uKTtPcGVuTGF5ZXJzLkFqYXguUmVzcG9uZGVycy5k aXNwYXRjaCgnb25FeGNlcHRpb24nLHRoaXMsZXhjZXB0aW9uKTt9ZWxzZXt2YXIg bGlzdGVuZXI9ZmFsc2U7dmFyIHJlc3BvbmRlcnM9T3BlbkxheWVycy5BamF4LlJl c3BvbmRlcnMucmVzcG9uZGVycztmb3IodmFyIGk9MDtpPHJlc3BvbmRlcnMubGVu Z3RoO2krKyl7aWYocmVzcG9uZGVyc1tpXS5vbkV4Y2VwdGlvbil7bGlzdGVuZXI9 dHJ1ZTticmVhazt9fQppZihsaXN0ZW5lcil7T3BlbkxheWVycy5BamF4LlJlc3Bv bmRlcnMuZGlzcGF0Y2goJ29uRXhjZXB0aW9uJyx0aGlzLGV4Y2VwdGlvbik7fWVs c2V7dGhyb3cgZXhjZXB0aW9uO319fX0pO09wZW5MYXllcnMuQWpheC5SZXF1ZXN0 LkV2ZW50cz1bJ1VuaW5pdGlhbGl6ZWQnLCdMb2FkaW5nJywnTG9hZGVkJywnSW50 ZXJhY3RpdmUnLCdDb21wbGV0ZSddO09wZW5MYXllcnMuQWpheC5SZXNwb25zZT1P cGVuTGF5ZXJzLkNsYXNzKHtzdGF0dXM6MCxzdGF0dXNUZXh0OicnLGluaXRpYWxp emU6ZnVuY3Rpb24ocmVxdWVzdCl7dGhpcy5yZXF1ZXN0PXJlcXVlc3Q7dmFyIHRy YW5zcG9ydD10aGlzLnRyYW5zcG9ydD1yZXF1ZXN0LnRyYW5zcG9ydCxyZWFkeVN0 YXRlPXRoaXMucmVhZHlTdGF0ZT10cmFuc3BvcnQucmVhZHlTdGF0ZTtpZigocmVh ZHlTdGF0ZT4yJiYhKCEhKHdpbmRvdy5hdHRhY2hFdmVudCYmIXdpbmRvdy5vcGVy YSkpKXx8cmVhZHlTdGF0ZT09NCl7dGhpcy5zdGF0dXM9dGhpcy5nZXRTdGF0dXMo KTt0aGlzLnN0YXR1c1RleHQ9dGhpcy5nZXRTdGF0dXNUZXh0KCk7dGhpcy5yZXNw b25zZVRleHQ9dHJhbnNwb3J0LnJlc3BvbnNlVGV4dD09bnVsbD8nJzpTdHJpbmco dHJhbnNwb3J0LnJlc3BvbnNlVGV4dCk7fQppZihyZWFkeVN0YXRlPT00KXt2YXIg eG1sPXRyYW5zcG9ydC5yZXNwb25zZVhNTDt0aGlzLnJlc3BvbnNlWE1MPXhtbD09 PXVuZGVmaW5lZD9udWxsOnhtbDt9fSxnZXRTdGF0dXM6T3BlbkxheWVycy5BamF4 LlJlcXVlc3QucHJvdG90eXBlLmdldFN0YXR1cyxnZXRTdGF0dXNUZXh0OmZ1bmN0 aW9uKCl7dHJ5e3JldHVybiB0aGlzLnRyYW5zcG9ydC5zdGF0dXNUZXh0fHwnJzt9 Y2F0Y2goZSl7cmV0dXJuJyc7fX0sZ2V0SGVhZGVyOk9wZW5MYXllcnMuQWpheC5S ZXF1ZXN0LnByb3RvdHlwZS5nZXRIZWFkZXIsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVu Y3Rpb24obmFtZSl7cmV0dXJuIHRoaXMudHJhbnNwb3J0LmdldFJlc3BvbnNlSGVh ZGVyKG5hbWUpO319KTtPcGVuTGF5ZXJzLkFqYXguZ2V0RWxlbWVudHNCeVRhZ05h bWVOUz1mdW5jdGlvbihwYXJlbnRub2RlLG5zdXJpLG5zcHJlZml4LHRhZ25hbWUp e3ZhciBlbGVtPW51bGw7aWYocGFyZW50bm9kZS5nZXRFbGVtZW50c0J5VGFnTmFt ZU5TKXtlbGVtPXBhcmVudG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhuc3Vy aSx0YWduYW1lKTt9ZWxzZXtlbGVtPXBhcmVudG5vZGUuZ2V0RWxlbWVudHNCeVRh Z05hbWUobnNwcmVmaXgrJzonK3RhZ25hbWUpO30KcmV0dXJuIGVsZW07fTtPcGVu TGF5ZXJzLkFqYXguc2VyaWFsaXplWE1MVG9TdHJpbmc9ZnVuY3Rpb24oeG1sZG9t KXt2YXIgc2VyaWFsaXplcj1uZXcgWE1MU2VyaWFsaXplcigpO3ZhciBkYXRhPXNl cmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcoeG1sZG9tKTtyZXR1cm4gZGF0YTt9 O09wZW5MYXllcnMuTGF5ZXIuR2VvUlNTPU9wZW5MYXllcnMuQ2xhc3MoT3Blbkxh eWVycy5MYXllci5NYXJrZXJzLHtsb2NhdGlvbjpudWxsLGZlYXR1cmVzOm51bGws Zm9ybWF0T3B0aW9uczpudWxsLHNlbGVjdGVkRmVhdHVyZTpudWxsLGljb246bnVs bCxwb3B1cFNpemU6bnVsbCx1c2VGZWVkVGl0bGU6dHJ1ZSxpbml0aWFsaXplOmZ1 bmN0aW9uKG5hbWUsbG9jYXRpb24sb3B0aW9ucyl7T3BlbkxheWVycy5MYXllci5N YXJrZXJzLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW25hbWUsb3B0 aW9uc10pO3RoaXMubG9jYXRpb249bG9jYXRpb247dGhpcy5mZWF0dXJlcz1bXTt9 LGRlc3Ryb3k6ZnVuY3Rpb24oKXtPcGVuTGF5ZXJzLkxheWVyLk1hcmtlcnMucHJv dG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuY2xlYXJG ZWF0dXJlcygpO3RoaXMuZmVhdHVyZXM9bnVsbDt9LGxvYWRSU1M6ZnVuY3Rpb24o KXtpZighdGhpcy5sb2FkZWQpe3RoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgibG9h ZHN0YXJ0Iik7T3BlbkxheWVycy5SZXF1ZXN0LkdFVCh7dXJsOnRoaXMubG9jYXRp b24sc3VjY2Vzczp0aGlzLnBhcnNlRGF0YSxzY29wZTp0aGlzfSk7dGhpcy5sb2Fk ZWQ9dHJ1ZTt9fSxtb3ZlVG86ZnVuY3Rpb24oYm91bmRzLHpvb21DaGFuZ2VkLG1p bm9yKXtPcGVuTGF5ZXJzLkxheWVyLk1hcmtlcnMucHJvdG90eXBlLm1vdmVUby5h cHBseSh0aGlzLGFyZ3VtZW50cyk7aWYodGhpcy52aXNpYmlsaXR5JiYhdGhpcy5s b2FkZWQpe3RoaXMubG9hZFJTUygpO319LHBhcnNlRGF0YTpmdW5jdGlvbihhamF4 UmVxdWVzdCl7dmFyIGRvYz1hamF4UmVxdWVzdC5yZXNwb25zZVhNTDtpZighZG9j fHwhZG9jLmRvY3VtZW50RWxlbWVudCl7ZG9jPU9wZW5MYXllcnMuRm9ybWF0LlhN TC5wcm90b3R5cGUucmVhZChhamF4UmVxdWVzdC5yZXNwb25zZVRleHQpO30KaWYo dGhpcy51c2VGZWVkVGl0bGUpe3ZhciBuYW1lPW51bGw7dHJ5e25hbWU9ZG9jLmdl dEVsZW1lbnRzQnlUYWdOYW1lTlMoJyonLCd0aXRsZScpWzBdLmZpcnN0Q2hpbGQu bm9kZVZhbHVlO30KY2F0Y2goZSl7bmFtZT1kb2MuZ2V0RWxlbWVudHNCeVRhZ05h bWUoJ3RpdGxlJylbMF0uZmlyc3RDaGlsZC5ub2RlVmFsdWU7fQppZihuYW1lKXt0 aGlzLnNldE5hbWUobmFtZSk7fX0KdmFyIG9wdGlvbnM9e307T3BlbkxheWVycy5V dGlsLmV4dGVuZChvcHRpb25zLHRoaXMuZm9ybWF0T3B0aW9ucyk7aWYodGhpcy5t YXAmJiF0aGlzLnByb2plY3Rpb24uZXF1YWxzKHRoaXMubWFwLmdldFByb2plY3Rp b25PYmplY3QoKSkpe29wdGlvbnMuZXh0ZXJuYWxQcm9qZWN0aW9uPXRoaXMucHJv amVjdGlvbjtvcHRpb25zLmludGVybmFsUHJvamVjdGlvbj10aGlzLm1hcC5nZXRQ cm9qZWN0aW9uT2JqZWN0KCk7fQp2YXIgZm9ybWF0PW5ldyBPcGVuTGF5ZXJzLkZv cm1hdC5HZW9SU1Mob3B0aW9ucyk7dmFyIGZlYXR1cmVzPWZvcm1hdC5yZWFkKGRv Yyk7Zm9yKHZhciBpPTAsbGVuPWZlYXR1cmVzLmxlbmd0aDtpPGxlbjtpKyspe3Zh ciBkYXRhPXt9O3ZhciBmZWF0dXJlPWZlYXR1cmVzW2ldO2lmKCFmZWF0dXJlLmdl b21ldHJ5KXtjb250aW51ZTt9CnZhciB0aXRsZT1mZWF0dXJlLmF0dHJpYnV0ZXMu dGl0bGU/ZmVhdHVyZS5hdHRyaWJ1dGVzLnRpdGxlOiJVbnRpdGxlZCI7dmFyIGRl c2NyaXB0aW9uPWZlYXR1cmUuYXR0cmlidXRlcy5kZXNjcmlwdGlvbj9mZWF0dXJl LmF0dHJpYnV0ZXMuZGVzY3JpcHRpb246Ik5vIGRlc2NyaXB0aW9uLiI7dmFyIGxp bms9ZmVhdHVyZS5hdHRyaWJ1dGVzLmxpbms/ZmVhdHVyZS5hdHRyaWJ1dGVzLmxp bms6IiI7dmFyIGxvY2F0aW9uPWZlYXR1cmUuZ2VvbWV0cnkuZ2V0Qm91bmRzKCku Z2V0Q2VudGVyTG9uTGF0KCk7ZGF0YS5pY29uPXRoaXMuaWNvbj09bnVsbD9PcGVu TGF5ZXJzLk1hcmtlci5kZWZhdWx0SWNvbigpOnRoaXMuaWNvbi5jbG9uZSgpO2Rh dGEucG9wdXBTaXplPXRoaXMucG9wdXBTaXplP3RoaXMucG9wdXBTaXplLmNsb25l KCk6bmV3IE9wZW5MYXllcnMuU2l6ZSgyNTAsMTIwKTtpZih0aXRsZXx8ZGVzY3Jp cHRpb24pe2RhdGEudGl0bGU9dGl0bGU7ZGF0YS5kZXNjcmlwdGlvbj1kZXNjcmlw dGlvbjt2YXIgY29udGVudEhUTUw9JzxkaXYgY2xhc3M9Im9sTGF5ZXJHZW9SU1ND bG9zZSI+W3hdPC9kaXY+Jztjb250ZW50SFRNTCs9JzxkaXYgY2xhc3M9Im9sTGF5 ZXJHZW9SU1NUaXRsZSI+JztpZihsaW5rKXtjb250ZW50SFRNTCs9JzxhIGNsYXNz PSJsaW5rIiBocmVmPSInK2xpbmsrJyIgdGFyZ2V0PSJfYmxhbmsiPic7fQpjb250 ZW50SFRNTCs9dGl0bGU7aWYobGluayl7Y29udGVudEhUTUwrPSc8L2E+Jzt9CmNv bnRlbnRIVE1MKz0nPC9kaXY+Jztjb250ZW50SFRNTCs9JzxkaXYgc3R5bGU9IiIg Y2xhc3M9Im9sTGF5ZXJHZW9SU1NEZXNjcmlwdGlvbiI+Jztjb250ZW50SFRNTCs9 ZGVzY3JpcHRpb247Y29udGVudEhUTUwrPSc8L2Rpdj4nO2RhdGFbJ3BvcHVwQ29u dGVudEhUTUwnXT1jb250ZW50SFRNTDt9CnZhciBmZWF0dXJlPW5ldyBPcGVuTGF5 ZXJzLkZlYXR1cmUodGhpcyxsb2NhdGlvbixkYXRhKTt0aGlzLmZlYXR1cmVzLnB1 c2goZmVhdHVyZSk7dmFyIG1hcmtlcj1mZWF0dXJlLmNyZWF0ZU1hcmtlcigpO21h cmtlci5ldmVudHMucmVnaXN0ZXIoJ2NsaWNrJyxmZWF0dXJlLHRoaXMubWFya2Vy Q2xpY2spO3RoaXMuYWRkTWFya2VyKG1hcmtlcik7fQp0aGlzLmV2ZW50cy50cmln Z2VyRXZlbnQoImxvYWRlbmQiKTt9LG1hcmtlckNsaWNrOmZ1bmN0aW9uKGV2dCl7 dmFyIHNhbWVNYXJrZXJDbGlja2VkPSh0aGlzPT10aGlzLmxheWVyLnNlbGVjdGVk RmVhdHVyZSk7dGhpcy5sYXllci5zZWxlY3RlZEZlYXR1cmU9KCFzYW1lTWFya2Vy Q2xpY2tlZCk/dGhpczpudWxsO2Zvcih2YXIgaT0wLGxlbj10aGlzLmxheWVyLm1h cC5wb3B1cHMubGVuZ3RoO2k8bGVuO2krKyl7dGhpcy5sYXllci5tYXAucmVtb3Zl UG9wdXAodGhpcy5sYXllci5tYXAucG9wdXBzW2ldKTt9CmlmKCFzYW1lTWFya2Vy Q2xpY2tlZCl7dmFyIHBvcHVwPXRoaXMuY3JlYXRlUG9wdXAoKTtPcGVuTGF5ZXJz LkV2ZW50Lm9ic2VydmUocG9wdXAuZGl2LCJjbGljayIsT3BlbkxheWVycy5GdW5j dGlvbi5iaW5kKGZ1bmN0aW9uKCl7Zm9yKHZhciBpPTAsbGVuPXRoaXMubGF5ZXIu bWFwLnBvcHVwcy5sZW5ndGg7aTxsZW47aSsrKXt0aGlzLmxheWVyLm1hcC5yZW1v dmVQb3B1cCh0aGlzLmxheWVyLm1hcC5wb3B1cHNbaV0pO319LHRoaXMpKTt0aGlz LmxheWVyLm1hcC5hZGRQb3B1cChwb3B1cCk7fQpPcGVuTGF5ZXJzLkV2ZW50LnN0 b3AoZXZ0KTt9LGNsZWFyRmVhdHVyZXM6ZnVuY3Rpb24oKXtpZih0aGlzLmZlYXR1 cmVzIT1udWxsKXt3aGlsZSh0aGlzLmZlYXR1cmVzLmxlbmd0aD4wKXt2YXIgZmVh dHVyZT10aGlzLmZlYXR1cmVzWzBdO09wZW5MYXllcnMuVXRpbC5yZW1vdmVJdGVt KHRoaXMuZmVhdHVyZXMsZmVhdHVyZSk7ZmVhdHVyZS5kZXN0cm95KCk7fX19LENM QVNTX05BTUU6Ik9wZW5MYXllcnMuTGF5ZXIuR2VvUlNTIn0pO09wZW5MYXllcnMu Rm9ybWF0LlNMRC52MT1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0 LkZpbHRlci52MV8wXzAse25hbWVzcGFjZXM6e3NsZDoiaHR0cDovL3d3dy5vcGVu Z2lzLm5ldC9zbGQiLG9nYzoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9vZ2MiLGdt bDoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiLHhsaW5rOiJodHRwOi8vd3d3 LnczLm9yZy8xOTk5L3hsaW5rIix4c2k6Imh0dHA6Ly93d3cudzMub3JnLzIwMDEv WE1MU2NoZW1hLWluc3RhbmNlIn0sZGVmYXVsdFByZWZpeDoic2xkIixzY2hlbWFM b2NhdGlvbjpudWxsLG11bHRpcGxlU3ltYm9saXplcnM6ZmFsc2UsZmVhdHVyZVR5 cGVDb3VudGVyOm51bGwsZGVmYXVsdFN5bWJvbGl6ZXI6e2ZpbGxDb2xvcjoiIzgw ODA4MCIsZmlsbE9wYWNpdHk6MSxzdHJva2VDb2xvcjoiIzAwMDAwMCIsc3Ryb2tl T3BhY2l0eToxLHN0cm9rZVdpZHRoOjEsc3Ryb2tlRGFzaHN0eWxlOiJzb2xpZCIs cG9pbnRSYWRpdXM6MyxncmFwaGljTmFtZToic3F1YXJlIn0saW5pdGlhbGl6ZTpm dW5jdGlvbihvcHRpb25zKXtPcGVuTGF5ZXJzLkZvcm1hdC5GaWx0ZXIudjFfMF8w LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW29wdGlvbnNdKTt9LHJl YWQ6ZnVuY3Rpb24oZGF0YSxvcHRpb25zKXtvcHRpb25zPU9wZW5MYXllcnMuVXRp bC5hcHBseURlZmF1bHRzKG9wdGlvbnMsdGhpcy5vcHRpb25zKTt2YXIgc2xkPXtu YW1lZExheWVyczpvcHRpb25zLm5hbWVkTGF5ZXJzQXNBcnJheT09PXRydWU/W106 e319O3RoaXMucmVhZENoaWxkTm9kZXMoZGF0YSxzbGQpO3JldHVybiBzbGQ7fSxy ZWFkZXJzOk9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKHsic2xkIjp7IlN0 eWxlZExheWVyRGVzY3JpcHRvciI6ZnVuY3Rpb24obm9kZSxzbGQpe3NsZC52ZXJz aW9uPW5vZGUuZ2V0QXR0cmlidXRlKCJ2ZXJzaW9uIik7dGhpcy5yZWFkQ2hpbGRO b2Rlcyhub2RlLHNsZCk7fSwiTmFtZSI6ZnVuY3Rpb24obm9kZSxvYmope29iai5u YW1lPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTt9LCJUaXRsZSI6ZnVuY3Rpb24o bm9kZSxvYmope29iai50aXRsZT10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7fSwi QWJzdHJhY3QiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmouZGVzY3JpcHRpb249dGhp cy5nZXRDaGlsZFZhbHVlKG5vZGUpO30sIk5hbWVkTGF5ZXIiOmZ1bmN0aW9uKG5v ZGUsc2xkKXt2YXIgbGF5ZXI9e3VzZXJTdHlsZXM6W10sbmFtZWRTdHlsZXM6W119 O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxsYXllcik7Zm9yKHZhciBpPTAsbGVu PWxheWVyLnVzZXJTdHlsZXMubGVuZ3RoO2k8bGVuOysraSl7bGF5ZXIudXNlclN0 eWxlc1tpXS5sYXllck5hbWU9bGF5ZXIubmFtZTt9CmlmKE9wZW5MYXllcnMuVXRp bC5pc0FycmF5KHNsZC5uYW1lZExheWVycykpe3NsZC5uYW1lZExheWVycy5wdXNo KGxheWVyKTt9ZWxzZXtzbGQubmFtZWRMYXllcnNbbGF5ZXIubmFtZV09bGF5ZXI7 fX0sIk5hbWVkU3R5bGUiOmZ1bmN0aW9uKG5vZGUsbGF5ZXIpe2xheWVyLm5hbWVk U3R5bGVzLnB1c2godGhpcy5nZXRDaGlsZE5hbWUobm9kZS5maXJzdENoaWxkKSk7 fSwiVXNlclN0eWxlIjpmdW5jdGlvbihub2RlLGxheWVyKXt2YXIgb2JqPXtkZWZh dWx0c1BlclN5bWJvbGl6ZXI6dHJ1ZSxydWxlczpbXX07dGhpcy5mZWF0dXJlVHlw ZUNvdW50ZXI9LTE7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iaik7dmFyIHN0 eWxlO2lmKHRoaXMubXVsdGlwbGVTeW1ib2xpemVycyl7ZGVsZXRlIG9iai5kZWZh dWx0c1BlclN5bWJvbGl6ZXI7c3R5bGU9bmV3IE9wZW5MYXllcnMuU3R5bGUyKG9i aik7fWVsc2V7c3R5bGU9bmV3IE9wZW5MYXllcnMuU3R5bGUodGhpcy5kZWZhdWx0 U3ltYm9saXplcixvYmopO30KbGF5ZXIudXNlclN0eWxlcy5wdXNoKHN0eWxlKTt9 LCJJc0RlZmF1bHQiOmZ1bmN0aW9uKG5vZGUsc3R5bGUpe2lmKHRoaXMuZ2V0Q2hp bGRWYWx1ZShub2RlKT09IjEiKXtzdHlsZS5pc0RlZmF1bHQ9dHJ1ZTt9fSwiRmVh dHVyZVR5cGVTdHlsZSI6ZnVuY3Rpb24obm9kZSxzdHlsZSl7Kyt0aGlzLmZlYXR1 cmVUeXBlQ291bnRlcjt2YXIgb2JqPXtydWxlczp0aGlzLm11bHRpcGxlU3ltYm9s aXplcnM/c3R5bGUucnVsZXM6W119O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxv YmopO2lmKCF0aGlzLm11bHRpcGxlU3ltYm9saXplcnMpe3N0eWxlLnJ1bGVzPW9i ai5ydWxlczt9fSwiUnVsZSI6ZnVuY3Rpb24obm9kZSxvYmope3ZhciBjb25maWc7 aWYodGhpcy5tdWx0aXBsZVN5bWJvbGl6ZXJzKXtjb25maWc9e3N5bWJvbGl6ZXJz OltdfTt9CnZhciBydWxlPW5ldyBPcGVuTGF5ZXJzLlJ1bGUoY29uZmlnKTt0aGlz LnJlYWRDaGlsZE5vZGVzKG5vZGUscnVsZSk7b2JqLnJ1bGVzLnB1c2gocnVsZSk7 fSwiRWxzZUZpbHRlciI6ZnVuY3Rpb24obm9kZSxydWxlKXtydWxlLmVsc2VGaWx0 ZXI9dHJ1ZTt9LCJNaW5TY2FsZURlbm9taW5hdG9yIjpmdW5jdGlvbihub2RlLHJ1 bGUpe3J1bGUubWluU2NhbGVEZW5vbWluYXRvcj1wYXJzZUZsb2F0KHRoaXMuZ2V0 Q2hpbGRWYWx1ZShub2RlKSk7fSwiTWF4U2NhbGVEZW5vbWluYXRvciI6ZnVuY3Rp b24obm9kZSxydWxlKXtydWxlLm1heFNjYWxlRGVub21pbmF0b3I9cGFyc2VGbG9h dCh0aGlzLmdldENoaWxkVmFsdWUobm9kZSkpO30sIlRleHRTeW1ib2xpemVyIjpm dW5jdGlvbihub2RlLHJ1bGUpe3ZhciBjb25maWc9e307dGhpcy5yZWFkQ2hpbGRO b2Rlcyhub2RlLGNvbmZpZyk7aWYodGhpcy5tdWx0aXBsZVN5bWJvbGl6ZXJzKXtj b25maWcuekluZGV4PXRoaXMuZmVhdHVyZVR5cGVDb3VudGVyO3J1bGUuc3ltYm9s aXplcnMucHVzaChuZXcgT3BlbkxheWVycy5TeW1ib2xpemVyLlRleHQoY29uZmln KSk7fWVsc2V7cnVsZS5zeW1ib2xpemVyWyJUZXh0Il09T3BlbkxheWVycy5VdGls LmFwcGx5RGVmYXVsdHMoY29uZmlnLHJ1bGUuc3ltYm9saXplclsiVGV4dCJdKTt9 fSwiTGFiZWwiOmZ1bmN0aW9uKG5vZGUsc3ltYm9saXplcil7dmFyIG9iaj17fTt0 aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqKTtpZihvYmoucHJvcGVydHkpe3N5 bWJvbGl6ZXIubGFiZWw9IiR7IitvYmoucHJvcGVydHkrIn0iO31lbHNle3ZhciB2 YWx1ZT10aGlzLnJlYWRPZ2NFeHByZXNzaW9uKG5vZGUpO2lmKHZhbHVlKXtzeW1i b2xpemVyLmxhYmVsPXZhbHVlO319fSwiRm9udCI6ZnVuY3Rpb24obm9kZSxzeW1i b2xpemVyKXt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsc3ltYm9saXplcik7fSwi SGFsbyI6ZnVuY3Rpb24obm9kZSxzeW1ib2xpemVyKXt2YXIgb2JqPXt9O3RoaXMu cmVhZENoaWxkTm9kZXMobm9kZSxvYmopO3N5bWJvbGl6ZXIuaGFsb1JhZGl1cz1v YmouaGFsb1JhZGl1cztzeW1ib2xpemVyLmhhbG9Db2xvcj1vYmouZmlsbENvbG9y O3N5bWJvbGl6ZXIuaGFsb09wYWNpdHk9b2JqLmZpbGxPcGFjaXR5O30sIlJhZGl1 cyI6ZnVuY3Rpb24obm9kZSxzeW1ib2xpemVyKXt2YXIgcmFkaXVzPXRoaXMucmVh ZE9nY0V4cHJlc3Npb24obm9kZSk7aWYocmFkaXVzIT1udWxsKXtzeW1ib2xpemVy LmhhbG9SYWRpdXM9cmFkaXVzO319LCJSYXN0ZXJTeW1ib2xpemVyIjpmdW5jdGlv bihub2RlLHJ1bGUpe3ZhciBjb25maWc9e307dGhpcy5yZWFkQ2hpbGROb2Rlcyhu b2RlLGNvbmZpZyk7aWYodGhpcy5tdWx0aXBsZVN5bWJvbGl6ZXJzKXtjb25maWcu ekluZGV4PXRoaXMuZmVhdHVyZVR5cGVDb3VudGVyO3J1bGUuc3ltYm9saXplcnMu cHVzaChuZXcgT3BlbkxheWVycy5TeW1ib2xpemVyLlJhc3Rlcihjb25maWcpKTt9 ZWxzZXtydWxlLnN5bWJvbGl6ZXJbIlJhc3RlciJdPU9wZW5MYXllcnMuVXRpbC5h cHBseURlZmF1bHRzKGNvbmZpZyxydWxlLnN5bWJvbGl6ZXJbIlJhc3RlciJdKTt9 fSwiR2VvbWV0cnkiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmouZ2VvbWV0cnk9e307 dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iai5nZW9tZXRyeSk7fSwiQ29sb3JN YXAiOmZ1bmN0aW9uKG5vZGUsc3ltYm9saXplcil7c3ltYm9saXplci5jb2xvck1h cD1bXTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsc3ltYm9saXplci5jb2xvck1h cCk7fSwiQ29sb3JNYXBFbnRyeSI6ZnVuY3Rpb24obm9kZSxjb2xvck1hcCl7dmFy IHE9bm9kZS5nZXRBdHRyaWJ1dGUoInF1YW50aXR5Iik7dmFyIG89bm9kZS5nZXRB dHRyaWJ1dGUoIm9wYWNpdHkiKTtjb2xvck1hcC5wdXNoKHtjb2xvcjpub2RlLmdl dEF0dHJpYnV0ZSgiY29sb3IiKSxxdWFudGl0eTpxIT09bnVsbD9wYXJzZUZsb2F0 KHEpOnVuZGVmaW5lZCxsYWJlbDpub2RlLmdldEF0dHJpYnV0ZSgibGFiZWwiKXx8 dW5kZWZpbmVkLG9wYWNpdHk6byE9PW51bGw/cGFyc2VGbG9hdChvKTp1bmRlZmlu ZWR9KTt9LCJMaW5lU3ltYm9saXplciI6ZnVuY3Rpb24obm9kZSxydWxlKXt2YXIg Y29uZmlnPXt9O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxjb25maWcpO2lmKHRo aXMubXVsdGlwbGVTeW1ib2xpemVycyl7Y29uZmlnLnpJbmRleD10aGlzLmZlYXR1 cmVUeXBlQ291bnRlcjtydWxlLnN5bWJvbGl6ZXJzLnB1c2gobmV3IE9wZW5MYXll cnMuU3ltYm9saXplci5MaW5lKGNvbmZpZykpO31lbHNle3J1bGUuc3ltYm9saXpl clsiTGluZSJdPU9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKGNvbmZpZyxy dWxlLnN5bWJvbGl6ZXJbIkxpbmUiXSk7fX0sIlBvbHlnb25TeW1ib2xpemVyIjpm dW5jdGlvbihub2RlLHJ1bGUpe3ZhciBjb25maWc9e2ZpbGw6ZmFsc2Usc3Ryb2tl OmZhbHNlfTtpZighdGhpcy5tdWx0aXBsZVN5bWJvbGl6ZXJzKXtjb25maWc9cnVs ZS5zeW1ib2xpemVyWyJQb2x5Z29uIl18fGNvbmZpZzt9CnRoaXMucmVhZENoaWxk Tm9kZXMobm9kZSxjb25maWcpO2lmKHRoaXMubXVsdGlwbGVTeW1ib2xpemVycyl7 Y29uZmlnLnpJbmRleD10aGlzLmZlYXR1cmVUeXBlQ291bnRlcjtydWxlLnN5bWJv bGl6ZXJzLnB1c2gobmV3IE9wZW5MYXllcnMuU3ltYm9saXplci5Qb2x5Z29uKGNv bmZpZykpO31lbHNle3J1bGUuc3ltYm9saXplclsiUG9seWdvbiJdPWNvbmZpZzt9 fSwiUG9pbnRTeW1ib2xpemVyIjpmdW5jdGlvbihub2RlLHJ1bGUpe3ZhciBjb25m aWc9e2ZpbGw6ZmFsc2Usc3Ryb2tlOmZhbHNlLGdyYXBoaWM6ZmFsc2V9O2lmKCF0 aGlzLm11bHRpcGxlU3ltYm9saXplcnMpe2NvbmZpZz1ydWxlLnN5bWJvbGl6ZXJb IlBvaW50Il18fGNvbmZpZzt9CnRoaXMucmVhZENoaWxkTm9kZXMobm9kZSxjb25m aWcpO2lmKHRoaXMubXVsdGlwbGVTeW1ib2xpemVycyl7Y29uZmlnLnpJbmRleD10 aGlzLmZlYXR1cmVUeXBlQ291bnRlcjtydWxlLnN5bWJvbGl6ZXJzLnB1c2gobmV3 IE9wZW5MYXllcnMuU3ltYm9saXplci5Qb2ludChjb25maWcpKTt9ZWxzZXtydWxl LnN5bWJvbGl6ZXJbIlBvaW50Il09Y29uZmlnO319LCJTdHJva2UiOmZ1bmN0aW9u KG5vZGUsc3ltYm9saXplcil7c3ltYm9saXplci5zdHJva2U9dHJ1ZTt0aGlzLnJl YWRDaGlsZE5vZGVzKG5vZGUsc3ltYm9saXplcik7fSwiRmlsbCI6ZnVuY3Rpb24o bm9kZSxzeW1ib2xpemVyKXtzeW1ib2xpemVyLmZpbGw9dHJ1ZTt0aGlzLnJlYWRD aGlsZE5vZGVzKG5vZGUsc3ltYm9saXplcik7fSwiQ3NzUGFyYW1ldGVyIjpmdW5j dGlvbihub2RlLHN5bWJvbGl6ZXIpe3ZhciBjc3NQcm9wZXJ0eT1ub2RlLmdldEF0 dHJpYnV0ZSgibmFtZSIpO3ZhciBzeW1Qcm9wZXJ0eT10aGlzLmNzc01hcFtjc3NQ cm9wZXJ0eV07aWYoc3ltUHJvcGVydHkpe3ZhciB2YWx1ZT10aGlzLnJlYWRPZ2NF eHByZXNzaW9uKG5vZGUpO2lmKHZhbHVlKXtzeW1ib2xpemVyW3N5bVByb3BlcnR5 XT12YWx1ZTt9fX0sIkdyYXBoaWMiOmZ1bmN0aW9uKG5vZGUsc3ltYm9saXplcil7 c3ltYm9saXplci5ncmFwaGljPXRydWU7dmFyIGdyYXBoaWM9e307dGhpcy5yZWFk Q2hpbGROb2Rlcyhub2RlLGdyYXBoaWMpO3ZhciBwcm9wZXJ0aWVzPVsic3Ryb2tl Iiwic3Ryb2tlQ29sb3IiLCJzdHJva2VXaWR0aCIsInN0cm9rZU9wYWNpdHkiLCJz dHJva2VMaW5lY2FwIiwiZmlsbCIsImZpbGxDb2xvciIsImZpbGxPcGFjaXR5Iiwi Z3JhcGhpY05hbWUiLCJyb3RhdGlvbiIsImdyYXBoaWNGb3JtYXQiXTt2YXIgcHJv cCx2YWx1ZTtmb3IodmFyIGk9MCxsZW49cHJvcGVydGllcy5sZW5ndGg7aTxsZW47 KytpKXtwcm9wPXByb3BlcnRpZXNbaV07dmFsdWU9Z3JhcGhpY1twcm9wXTtpZih2 YWx1ZSE9dW5kZWZpbmVkKXtzeW1ib2xpemVyW3Byb3BdPXZhbHVlO319CmlmKGdy YXBoaWMub3BhY2l0eSE9dW5kZWZpbmVkKXtzeW1ib2xpemVyLmdyYXBoaWNPcGFj aXR5PWdyYXBoaWMub3BhY2l0eTt9CmlmKGdyYXBoaWMuc2l6ZSE9dW5kZWZpbmVk KXtzeW1ib2xpemVyLnBvaW50UmFkaXVzPWdyYXBoaWMuc2l6ZS8yO30KaWYoZ3Jh cGhpYy5ocmVmIT11bmRlZmluZWQpe3N5bWJvbGl6ZXIuZXh0ZXJuYWxHcmFwaGlj PWdyYXBoaWMuaHJlZjt9CmlmKGdyYXBoaWMucm90YXRpb24hPXVuZGVmaW5lZCl7 c3ltYm9saXplci5yb3RhdGlvbj1ncmFwaGljLnJvdGF0aW9uO319LCJFeHRlcm5h bEdyYXBoaWMiOmZ1bmN0aW9uKG5vZGUsZ3JhcGhpYyl7dGhpcy5yZWFkQ2hpbGRO b2Rlcyhub2RlLGdyYXBoaWMpO30sIk1hcmsiOmZ1bmN0aW9uKG5vZGUsZ3JhcGhp Yyl7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLGdyYXBoaWMpO30sIldlbGxLbm93 bk5hbWUiOmZ1bmN0aW9uKG5vZGUsZ3JhcGhpYyl7Z3JhcGhpYy5ncmFwaGljTmFt ZT10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7fSwiT3BhY2l0eSI6ZnVuY3Rpb24o bm9kZSxvYmope3ZhciBvcGFjaXR5PXRoaXMucmVhZE9nY0V4cHJlc3Npb24obm9k ZSk7aWYob3BhY2l0eSl7b2JqLm9wYWNpdHk9b3BhY2l0eTt9fSwiU2l6ZSI6ZnVu Y3Rpb24obm9kZSxvYmope3ZhciBzaXplPXRoaXMucmVhZE9nY0V4cHJlc3Npb24o bm9kZSk7aWYoc2l6ZSl7b2JqLnNpemU9c2l6ZTt9fSwiUm90YXRpb24iOmZ1bmN0 aW9uKG5vZGUsb2JqKXt2YXIgcm90YXRpb249dGhpcy5yZWFkT2djRXhwcmVzc2lv bihub2RlKTtpZihyb3RhdGlvbil7b2JqLnJvdGF0aW9uPXJvdGF0aW9uO319LCJP bmxpbmVSZXNvdXJjZSI6ZnVuY3Rpb24obm9kZSxvYmope29iai5ocmVmPXRoaXMu Z2V0QXR0cmlidXRlTlMobm9kZSx0aGlzLm5hbWVzcGFjZXMueGxpbmssImhyZWYi KTt9LCJGb3JtYXQiOmZ1bmN0aW9uKG5vZGUsZ3JhcGhpYyl7Z3JhcGhpYy5ncmFw aGljRm9ybWF0PXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTt9fX0sT3BlbkxheWVy cy5Gb3JtYXQuRmlsdGVyLnYxXzBfMC5wcm90b3R5cGUucmVhZGVycyksY3NzTWFw Onsic3Ryb2tlIjoic3Ryb2tlQ29sb3IiLCJzdHJva2Utb3BhY2l0eSI6InN0cm9r ZU9wYWNpdHkiLCJzdHJva2Utd2lkdGgiOiJzdHJva2VXaWR0aCIsInN0cm9rZS1s aW5lY2FwIjoic3Ryb2tlTGluZWNhcCIsInN0cm9rZS1kYXNoYXJyYXkiOiJzdHJv a2VEYXNoc3R5bGUiLCJmaWxsIjoiZmlsbENvbG9yIiwiZmlsbC1vcGFjaXR5Ijoi ZmlsbE9wYWNpdHkiLCJmb250LWZhbWlseSI6ImZvbnRGYW1pbHkiLCJmb250LXNp emUiOiJmb250U2l6ZSIsImZvbnQtd2VpZ2h0IjoiZm9udFdlaWdodCIsImZvbnQt c3R5bGUiOiJmb250U3R5bGUifSxnZXRDc3NQcm9wZXJ0eTpmdW5jdGlvbihzeW0p e3ZhciBjc3M9bnVsbDtmb3IodmFyIHByb3AgaW4gdGhpcy5jc3NNYXApe2lmKHRo aXMuY3NzTWFwW3Byb3BdPT1zeW0pe2Nzcz1wcm9wO2JyZWFrO319CnJldHVybiBj c3M7fSxnZXRHcmFwaGljRm9ybWF0OmZ1bmN0aW9uKGhyZWYpe3ZhciBmb3JtYXQs cmVnZXg7Zm9yKHZhciBrZXkgaW4gdGhpcy5ncmFwaGljRm9ybWF0cyl7aWYodGhp cy5ncmFwaGljRm9ybWF0c1trZXldLnRlc3QoaHJlZikpe2Zvcm1hdD1rZXk7YnJl YWs7fX0KcmV0dXJuIGZvcm1hdHx8dGhpcy5kZWZhdXRsR3JhcGhpY0Zvcm1hdDt9 LGRlZmF1bHRHcmFwaGljRm9ybWF0OiJpbWFnZS9wbmciLGdyYXBoaWNGb3JtYXRz OnsiaW1hZ2UvanBlZyI6L1wuanBlP2ckL2ksImltYWdlL2dpZiI6L1wuZ2lmJC9p LCJpbWFnZS9wbmciOi9cLnBuZyQvaX0sd3JpdGU6ZnVuY3Rpb24oc2xkKXtyZXR1 cm4gdGhpcy53cml0ZXJzLnNsZC5TdHlsZWRMYXllckRlc2NyaXB0b3IuYXBwbHko dGhpcyxbc2xkXSk7fSx3cml0ZXJzOk9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1 bHRzKHsic2xkIjp7IlN0eWxlZExheWVyRGVzY3JpcHRvciI6ZnVuY3Rpb24oc2xk KXt2YXIgcm9vdD10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoInNsZDpTdHlsZWRM YXllckRlc2NyaXB0b3IiLHthdHRyaWJ1dGVzOnsidmVyc2lvbiI6dGhpcy5WRVJT SU9OLCJ4c2k6c2NoZW1hTG9jYXRpb24iOnRoaXMuc2NoZW1hTG9jYXRpb259fSk7 cm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOm9nYyIsdGhpcy5uYW1lc3BhY2VzLm9n Yyk7cm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOmdtbCIsdGhpcy5uYW1lc3BhY2Vz LmdtbCk7aWYoc2xkLm5hbWUpe3RoaXMud3JpdGVOb2RlKCJOYW1lIixzbGQubmFt ZSxyb290KTt9CmlmKHNsZC50aXRsZSl7dGhpcy53cml0ZU5vZGUoIlRpdGxlIixz bGQudGl0bGUscm9vdCk7fQppZihzbGQuZGVzY3JpcHRpb24pe3RoaXMud3JpdGVO b2RlKCJBYnN0cmFjdCIsc2xkLmRlc2NyaXB0aW9uLHJvb3QpO30KaWYoT3Blbkxh eWVycy5VdGlsLmlzQXJyYXkoc2xkLm5hbWVkTGF5ZXJzKSl7Zm9yKHZhciBpPTAs bGVuPXNsZC5uYW1lZExheWVycy5sZW5ndGg7aTxsZW47KytpKXt0aGlzLndyaXRl Tm9kZSgiTmFtZWRMYXllciIsc2xkLm5hbWVkTGF5ZXJzW2ldLHJvb3QpO319ZWxz ZXtmb3IodmFyIG5hbWUgaW4gc2xkLm5hbWVkTGF5ZXJzKXt0aGlzLndyaXRlTm9k ZSgiTmFtZWRMYXllciIsc2xkLm5hbWVkTGF5ZXJzW25hbWVdLHJvb3QpO319CnJl dHVybiByb290O30sIk5hbWUiOmZ1bmN0aW9uKG5hbWUpe3JldHVybiB0aGlzLmNy ZWF0ZUVsZW1lbnROU1BsdXMoInNsZDpOYW1lIix7dmFsdWU6bmFtZX0pO30sIlRp dGxlIjpmdW5jdGlvbih0aXRsZSl7cmV0dXJuIHRoaXMuY3JlYXRlRWxlbWVudE5T UGx1cygic2xkOlRpdGxlIix7dmFsdWU6dGl0bGV9KTt9LCJBYnN0cmFjdCI6ZnVu Y3Rpb24oZGVzY3JpcHRpb24pe3JldHVybiB0aGlzLmNyZWF0ZUVsZW1lbnROU1Bs dXMoInNsZDpBYnN0cmFjdCIse3ZhbHVlOmRlc2NyaXB0aW9ufSk7fSwiTmFtZWRM YXllciI6ZnVuY3Rpb24obGF5ZXIpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVu dE5TUGx1cygic2xkOk5hbWVkTGF5ZXIiKTt0aGlzLndyaXRlTm9kZSgiTmFtZSIs bGF5ZXIubmFtZSxub2RlKTtpZihsYXllci5uYW1lZFN0eWxlcyl7Zm9yKHZhciBp PTAsbGVuPWxheWVyLm5hbWVkU3R5bGVzLmxlbmd0aDtpPGxlbjsrK2kpe3RoaXMu d3JpdGVOb2RlKCJOYW1lZFN0eWxlIixsYXllci5uYW1lZFN0eWxlc1tpXSxub2Rl KTt9fQppZihsYXllci51c2VyU3R5bGVzKXtmb3IodmFyIGk9MCxsZW49bGF5ZXIu dXNlclN0eWxlcy5sZW5ndGg7aTxsZW47KytpKXt0aGlzLndyaXRlTm9kZSgiVXNl clN0eWxlIixsYXllci51c2VyU3R5bGVzW2ldLG5vZGUpO319CnJldHVybiBub2Rl O30sIk5hbWVkU3R5bGUiOmZ1bmN0aW9uKG5hbWUpe3ZhciBub2RlPXRoaXMuY3Jl YXRlRWxlbWVudE5TUGx1cygic2xkOk5hbWVkU3R5bGUiKTt0aGlzLndyaXRlTm9k ZSgiTmFtZSIsbmFtZSxub2RlKTtyZXR1cm4gbm9kZTt9LCJVc2VyU3R5bGUiOmZ1 bmN0aW9uKHN0eWxlKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMo InNsZDpVc2VyU3R5bGUiKTtpZihzdHlsZS5uYW1lKXt0aGlzLndyaXRlTm9kZSgi TmFtZSIsc3R5bGUubmFtZSxub2RlKTt9CmlmKHN0eWxlLnRpdGxlKXt0aGlzLndy aXRlTm9kZSgiVGl0bGUiLHN0eWxlLnRpdGxlLG5vZGUpO30KaWYoc3R5bGUuZGVz Y3JpcHRpb24pe3RoaXMud3JpdGVOb2RlKCJBYnN0cmFjdCIsc3R5bGUuZGVzY3Jp cHRpb24sbm9kZSk7fQppZihzdHlsZS5pc0RlZmF1bHQpe3RoaXMud3JpdGVOb2Rl KCJJc0RlZmF1bHQiLHN0eWxlLmlzRGVmYXVsdCxub2RlKTt9CmlmKHRoaXMubXVs dGlwbGVTeW1ib2xpemVycyYmc3R5bGUucnVsZXMpe3ZhciBydWxlc0J5Wj17MDpb XX07dmFyIHpWYWx1ZXM9WzBdO3ZhciBydWxlLHJ1bGVNYXAsc3ltYm9saXplcix6 SW5kZXgsY2xvbmU7Zm9yKHZhciBpPTAsaWk9c3R5bGUucnVsZXMubGVuZ3RoO2k8 aWk7KytpKXtydWxlPXN0eWxlLnJ1bGVzW2ldO2lmKHJ1bGUuc3ltYm9saXplcnMp e3J1bGVNYXA9e307Zm9yKHZhciBqPTAsamo9cnVsZS5zeW1ib2xpemVycy5sZW5n dGg7ajxqajsrK2ope3N5bWJvbGl6ZXI9cnVsZS5zeW1ib2xpemVyc1tqXTt6SW5k ZXg9c3ltYm9saXplci56SW5kZXg7aWYoISh6SW5kZXggaW4gcnVsZU1hcCkpe2Ns b25lPXJ1bGUuY2xvbmUoKTtjbG9uZS5zeW1ib2xpemVycz1bXTtydWxlTWFwW3pJ bmRleF09Y2xvbmU7fQpydWxlTWFwW3pJbmRleF0uc3ltYm9saXplcnMucHVzaChz eW1ib2xpemVyLmNsb25lKCkpO30KZm9yKHpJbmRleCBpbiBydWxlTWFwKXtpZigh KHpJbmRleCBpbiBydWxlc0J5Wikpe3pWYWx1ZXMucHVzaCh6SW5kZXgpO3J1bGVz QnlaW3pJbmRleF09W107fQpydWxlc0J5Wlt6SW5kZXhdLnB1c2gocnVsZU1hcFt6 SW5kZXhdKTt9fWVsc2V7cnVsZXNCeVpbMF0ucHVzaChydWxlLmNsb25lKCkpO319 CnpWYWx1ZXMuc29ydCgpO3ZhciBydWxlcztmb3IodmFyIGk9MCxpaT16VmFsdWVz Lmxlbmd0aDtpPGlpOysraSl7cnVsZXM9cnVsZXNCeVpbelZhbHVlc1tpXV07aWYo cnVsZXMubGVuZ3RoPjApe2Nsb25lPXN0eWxlLmNsb25lKCk7Y2xvbmUucnVsZXM9 cnVsZXNCeVpbelZhbHVlc1tpXV07dGhpcy53cml0ZU5vZGUoIkZlYXR1cmVUeXBl U3R5bGUiLGNsb25lLG5vZGUpO319fWVsc2V7dGhpcy53cml0ZU5vZGUoIkZlYXR1 cmVUeXBlU3R5bGUiLHN0eWxlLG5vZGUpO30KcmV0dXJuIG5vZGU7fSwiSXNEZWZh dWx0IjpmdW5jdGlvbihib29sKXtyZXR1cm4gdGhpcy5jcmVhdGVFbGVtZW50TlNQ bHVzKCJzbGQ6SXNEZWZhdWx0Iix7dmFsdWU6KGJvb2wpPyIxIjoiMCJ9KTt9LCJG ZWF0dXJlVHlwZVN0eWxlIjpmdW5jdGlvbihzdHlsZSl7dmFyIG5vZGU9dGhpcy5j cmVhdGVFbGVtZW50TlNQbHVzKCJzbGQ6RmVhdHVyZVR5cGVTdHlsZSIpO2Zvcih2 YXIgaT0wLGxlbj1zdHlsZS5ydWxlcy5sZW5ndGg7aTxsZW47KytpKXt0aGlzLndy aXRlTm9kZSgiUnVsZSIsc3R5bGUucnVsZXNbaV0sbm9kZSk7fQpyZXR1cm4gbm9k ZTt9LCJSdWxlIjpmdW5jdGlvbihydWxlKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVs ZW1lbnROU1BsdXMoInNsZDpSdWxlIik7aWYocnVsZS5uYW1lKXt0aGlzLndyaXRl Tm9kZSgiTmFtZSIscnVsZS5uYW1lLG5vZGUpO30KaWYocnVsZS50aXRsZSl7dGhp cy53cml0ZU5vZGUoIlRpdGxlIixydWxlLnRpdGxlLG5vZGUpO30KaWYocnVsZS5k ZXNjcmlwdGlvbil7dGhpcy53cml0ZU5vZGUoIkFic3RyYWN0IixydWxlLmRlc2Ny aXB0aW9uLG5vZGUpO30KaWYocnVsZS5lbHNlRmlsdGVyKXt0aGlzLndyaXRlTm9k ZSgiRWxzZUZpbHRlciIsbnVsbCxub2RlKTt9ZWxzZSBpZihydWxlLmZpbHRlcil7 dGhpcy53cml0ZU5vZGUoIm9nYzpGaWx0ZXIiLHJ1bGUuZmlsdGVyLG5vZGUpO30K aWYocnVsZS5taW5TY2FsZURlbm9taW5hdG9yIT11bmRlZmluZWQpe3RoaXMud3Jp dGVOb2RlKCJNaW5TY2FsZURlbm9taW5hdG9yIixydWxlLm1pblNjYWxlRGVub21p bmF0b3Isbm9kZSk7fQppZihydWxlLm1heFNjYWxlRGVub21pbmF0b3IhPXVuZGVm aW5lZCl7dGhpcy53cml0ZU5vZGUoIk1heFNjYWxlRGVub21pbmF0b3IiLHJ1bGUu bWF4U2NhbGVEZW5vbWluYXRvcixub2RlKTt9CnZhciB0eXBlLHN5bWJvbGl6ZXI7 aWYodGhpcy5tdWx0aXBsZVN5bWJvbGl6ZXJzJiZydWxlLnN5bWJvbGl6ZXJzKXt2 YXIgc3ltYm9saXplcjtmb3IodmFyIGk9MCxpaT1ydWxlLnN5bWJvbGl6ZXJzLmxl bmd0aDtpPGlpOysraSl7c3ltYm9saXplcj1ydWxlLnN5bWJvbGl6ZXJzW2ldO3R5 cGU9c3ltYm9saXplci5DTEFTU19OQU1FLnNwbGl0KCIuIikucG9wKCk7dGhpcy53 cml0ZU5vZGUodHlwZSsiU3ltYm9saXplciIsc3ltYm9saXplcixub2RlKTt9fWVs c2V7dmFyIHR5cGVzPU9wZW5MYXllcnMuU3R5bGUuU1lNQk9MSVpFUl9QUkVGSVhF Uztmb3IodmFyIGk9MCxsZW49dHlwZXMubGVuZ3RoO2k8bGVuOysraSl7dHlwZT10 eXBlc1tpXTtzeW1ib2xpemVyPXJ1bGUuc3ltYm9saXplclt0eXBlXTtpZihzeW1i b2xpemVyKXt0aGlzLndyaXRlTm9kZSh0eXBlKyJTeW1ib2xpemVyIixzeW1ib2xp emVyLG5vZGUpO319fQpyZXR1cm4gbm9kZTt9LCJFbHNlRmlsdGVyIjpmdW5jdGlv bigpe3JldHVybiB0aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoInNsZDpFbHNlRmls dGVyIik7fSwiTWluU2NhbGVEZW5vbWluYXRvciI6ZnVuY3Rpb24oc2NhbGUpe3Jl dHVybiB0aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoInNsZDpNaW5TY2FsZURlbm9t aW5hdG9yIix7dmFsdWU6c2NhbGV9KTt9LCJNYXhTY2FsZURlbm9taW5hdG9yIjpm dW5jdGlvbihzY2FsZSl7cmV0dXJuIHRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygi c2xkOk1heFNjYWxlRGVub21pbmF0b3IiLHt2YWx1ZTpzY2FsZX0pO30sIkxpbmVT eW1ib2xpemVyIjpmdW5jdGlvbihzeW1ib2xpemVyKXt2YXIgbm9kZT10aGlzLmNy ZWF0ZUVsZW1lbnROU1BsdXMoInNsZDpMaW5lU3ltYm9saXplciIpO3RoaXMud3Jp dGVOb2RlKCJTdHJva2UiLHN5bWJvbGl6ZXIsbm9kZSk7cmV0dXJuIG5vZGU7fSwi U3Ryb2tlIjpmdW5jdGlvbihzeW1ib2xpemVyKXt2YXIgbm9kZT10aGlzLmNyZWF0 ZUVsZW1lbnROU1BsdXMoInNsZDpTdHJva2UiKTtpZihzeW1ib2xpemVyLnN0cm9r ZUNvbG9yIT11bmRlZmluZWQpe3RoaXMud3JpdGVOb2RlKCJDc3NQYXJhbWV0ZXIi LHtzeW1ib2xpemVyOnN5bWJvbGl6ZXIsa2V5OiJzdHJva2VDb2xvciJ9LG5vZGUp O30KaWYoc3ltYm9saXplci5zdHJva2VPcGFjaXR5IT11bmRlZmluZWQpe3RoaXMu d3JpdGVOb2RlKCJDc3NQYXJhbWV0ZXIiLHtzeW1ib2xpemVyOnN5bWJvbGl6ZXIs a2V5OiJzdHJva2VPcGFjaXR5In0sbm9kZSk7fQppZihzeW1ib2xpemVyLnN0cm9r ZVdpZHRoIT11bmRlZmluZWQpe3RoaXMud3JpdGVOb2RlKCJDc3NQYXJhbWV0ZXIi LHtzeW1ib2xpemVyOnN5bWJvbGl6ZXIsa2V5OiJzdHJva2VXaWR0aCJ9LG5vZGUp O30KaWYoc3ltYm9saXplci5zdHJva2VEYXNoc3R5bGUhPXVuZGVmaW5lZCYmc3lt Ym9saXplci5zdHJva2VEYXNoc3R5bGUhPT0ic29saWQiKXt0aGlzLndyaXRlTm9k ZSgiQ3NzUGFyYW1ldGVyIix7c3ltYm9saXplcjpzeW1ib2xpemVyLGtleToic3Ry b2tlRGFzaHN0eWxlIn0sbm9kZSk7fQppZihzeW1ib2xpemVyLnN0cm9rZUxpbmVj YXAhPXVuZGVmaW5lZCl7dGhpcy53cml0ZU5vZGUoIkNzc1BhcmFtZXRlciIse3N5 bWJvbGl6ZXI6c3ltYm9saXplcixrZXk6InN0cm9rZUxpbmVjYXAifSxub2RlKTt9 CnJldHVybiBub2RlO30sIkNzc1BhcmFtZXRlciI6ZnVuY3Rpb24ob2JqKXtyZXR1 cm4gdGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJzbGQ6Q3NzUGFyYW1ldGVyIix7 YXR0cmlidXRlczp7bmFtZTp0aGlzLmdldENzc1Byb3BlcnR5KG9iai5rZXkpfSx2 YWx1ZTpvYmouc3ltYm9saXplcltvYmoua2V5XX0pO30sIlRleHRTeW1ib2xpemVy IjpmdW5jdGlvbihzeW1ib2xpemVyKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1l bnROU1BsdXMoInNsZDpUZXh0U3ltYm9saXplciIpO2lmKHN5bWJvbGl6ZXIubGFi ZWwhPW51bGwpe3RoaXMud3JpdGVOb2RlKCJMYWJlbCIsc3ltYm9saXplci5sYWJl bCxub2RlKTt9CmlmKHN5bWJvbGl6ZXIuZm9udEZhbWlseSE9bnVsbHx8c3ltYm9s aXplci5mb250U2l6ZSE9bnVsbHx8c3ltYm9saXplci5mb250V2VpZ2h0IT1udWxs fHxzeW1ib2xpemVyLmZvbnRTdHlsZSE9bnVsbCl7dGhpcy53cml0ZU5vZGUoIkZv bnQiLHN5bWJvbGl6ZXIsbm9kZSk7fQppZihzeW1ib2xpemVyLmhhbG9SYWRpdXMh PW51bGx8fHN5bWJvbGl6ZXIuaGFsb0NvbG9yIT1udWxsfHxzeW1ib2xpemVyLmhh bG9PcGFjaXR5IT1udWxsKXt0aGlzLndyaXRlTm9kZSgiSGFsbyIsc3ltYm9saXpl cixub2RlKTt9CmlmKHN5bWJvbGl6ZXIuZmlsbENvbG9yIT1udWxsfHxzeW1ib2xp emVyLmZpbGxPcGFjaXR5IT1udWxsKXt0aGlzLndyaXRlTm9kZSgiRmlsbCIsc3lt Ym9saXplcixub2RlKTt9CnJldHVybiBub2RlO30sIkZvbnQiOmZ1bmN0aW9uKHN5 bWJvbGl6ZXIpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygic2xk OkZvbnQiKTtpZihzeW1ib2xpemVyLmZvbnRGYW1pbHkpe3RoaXMud3JpdGVOb2Rl KCJDc3NQYXJhbWV0ZXIiLHtzeW1ib2xpemVyOnN5bWJvbGl6ZXIsa2V5OiJmb250 RmFtaWx5In0sbm9kZSk7fQppZihzeW1ib2xpemVyLmZvbnRTaXplKXt0aGlzLndy aXRlTm9kZSgiQ3NzUGFyYW1ldGVyIix7c3ltYm9saXplcjpzeW1ib2xpemVyLGtl eToiZm9udFNpemUifSxub2RlKTt9CmlmKHN5bWJvbGl6ZXIuZm9udFdlaWdodCl7 dGhpcy53cml0ZU5vZGUoIkNzc1BhcmFtZXRlciIse3N5bWJvbGl6ZXI6c3ltYm9s aXplcixrZXk6ImZvbnRXZWlnaHQifSxub2RlKTt9CmlmKHN5bWJvbGl6ZXIuZm9u dFN0eWxlKXt0aGlzLndyaXRlTm9kZSgiQ3NzUGFyYW1ldGVyIix7c3ltYm9saXpl cjpzeW1ib2xpemVyLGtleToiZm9udFN0eWxlIn0sbm9kZSk7fQpyZXR1cm4gbm9k ZTt9LCJMYWJlbCI6ZnVuY3Rpb24obGFiZWwpe3ZhciBub2RlPXRoaXMuY3JlYXRl RWxlbWVudE5TUGx1cygic2xkOkxhYmVsIik7dmFyIHRva2Vucz1sYWJlbC5zcGxp dCgiJHsiKTtub2RlLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlVGV4dE5vZGUodG9r ZW5zWzBdKSk7dmFyIGl0ZW0sbGFzdDtmb3IodmFyIGk9MSxsZW49dG9rZW5zLmxl bmd0aDtpPGxlbjtpKyspe2l0ZW09dG9rZW5zW2ldO2xhc3Q9aXRlbS5pbmRleE9m KCJ9Iik7aWYobGFzdD4wKXt0aGlzLndyaXRlTm9kZSgib2djOlByb3BlcnR5TmFt ZSIse3Byb3BlcnR5Oml0ZW0uc3Vic3RyaW5nKDAsbGFzdCl9LG5vZGUpO25vZGUu YXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVUZXh0Tm9kZShpdGVtLnN1YnN0cmluZygr K2xhc3QpKSk7fWVsc2V7bm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZVRleHRO b2RlKCIkeyIraXRlbSkpO319CnJldHVybiBub2RlO30sIkhhbG8iOmZ1bmN0aW9u KHN5bWJvbGl6ZXIpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygi c2xkOkhhbG8iKTtpZihzeW1ib2xpemVyLmhhbG9SYWRpdXMpe3RoaXMud3JpdGVO b2RlKCJSYWRpdXMiLHN5bWJvbGl6ZXIuaGFsb1JhZGl1cyxub2RlKTt9CmlmKHN5 bWJvbGl6ZXIuaGFsb0NvbG9yfHxzeW1ib2xpemVyLmhhbG9PcGFjaXR5KXt0aGlz LndyaXRlTm9kZSgiRmlsbCIse2ZpbGxDb2xvcjpzeW1ib2xpemVyLmhhbG9Db2xv cixmaWxsT3BhY2l0eTpzeW1ib2xpemVyLmhhbG9PcGFjaXR5fSxub2RlKTt9CnJl dHVybiBub2RlO30sIlJhZGl1cyI6ZnVuY3Rpb24odmFsdWUpe3JldHVybiB0aGlz LmNyZWF0ZUVsZW1lbnROU1BsdXMoInNsZDpSYWRpdXMiLHt2YWx1ZTp2YWx1ZX0p O30sIlJhc3RlclN5bWJvbGl6ZXIiOmZ1bmN0aW9uKHN5bWJvbGl6ZXIpe3ZhciBu b2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygic2xkOlJhc3RlclN5bWJvbGl6 ZXIiKTtpZihzeW1ib2xpemVyLmdlb21ldHJ5KXt0aGlzLndyaXRlTm9kZSgiR2Vv bWV0cnkiLHN5bWJvbGl6ZXIuZ2VvbWV0cnksbm9kZSk7fQppZihzeW1ib2xpemVy Lm9wYWNpdHkpe3RoaXMud3JpdGVOb2RlKCJPcGFjaXR5IixzeW1ib2xpemVyLm9w YWNpdHksbm9kZSk7fQppZihzeW1ib2xpemVyLmNvbG9yTWFwKXt0aGlzLndyaXRl Tm9kZSgiQ29sb3JNYXAiLHN5bWJvbGl6ZXIuY29sb3JNYXAsbm9kZSk7fQpyZXR1 cm4gbm9kZTt9LCJHZW9tZXRyeSI6ZnVuY3Rpb24oZ2VvbWV0cnkpe3ZhciBub2Rl PXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygic2xkOkdlb21ldHJ5Iik7aWYoZ2Vv bWV0cnkucHJvcGVydHkpe3RoaXMud3JpdGVOb2RlKCJvZ2M6UHJvcGVydHlOYW1l IixnZW9tZXRyeSxub2RlKTt9CnJldHVybiBub2RlO30sIkNvbG9yTWFwIjpmdW5j dGlvbihjb2xvck1hcCl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVz KCJzbGQ6Q29sb3JNYXAiKTtmb3IodmFyIGk9MCxsZW49Y29sb3JNYXAubGVuZ3Ro O2k8bGVuOysraSl7dGhpcy53cml0ZU5vZGUoIkNvbG9yTWFwRW50cnkiLGNvbG9y TWFwW2ldLG5vZGUpO30KcmV0dXJuIG5vZGU7fSwiQ29sb3JNYXBFbnRyeSI6ZnVu Y3Rpb24oY29sb3JNYXBFbnRyeSl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50 TlNQbHVzKCJzbGQ6Q29sb3JNYXBFbnRyeSIpO3ZhciBhPWNvbG9yTWFwRW50cnk7 bm9kZS5zZXRBdHRyaWJ1dGUoImNvbG9yIixhLmNvbG9yKTthLm9wYWNpdHkhPT11 bmRlZmluZWQmJm5vZGUuc2V0QXR0cmlidXRlKCJvcGFjaXR5IixwYXJzZUZsb2F0 KGEub3BhY2l0eSkpO2EucXVhbnRpdHkhPT11bmRlZmluZWQmJm5vZGUuc2V0QXR0 cmlidXRlKCJxdWFudGl0eSIscGFyc2VGbG9hdChhLnF1YW50aXR5KSk7YS5sYWJl bCE9PXVuZGVmaW5lZCYmbm9kZS5zZXRBdHRyaWJ1dGUoImxhYmVsIixhLmxhYmVs KTtyZXR1cm4gbm9kZTt9LCJQb2x5Z29uU3ltYm9saXplciI6ZnVuY3Rpb24oc3lt Ym9saXplcil7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJzbGQ6 UG9seWdvblN5bWJvbGl6ZXIiKTtpZihzeW1ib2xpemVyLmZpbGwhPT1mYWxzZSl7 dGhpcy53cml0ZU5vZGUoIkZpbGwiLHN5bWJvbGl6ZXIsbm9kZSk7fQppZihzeW1i b2xpemVyLnN0cm9rZSE9PWZhbHNlKXt0aGlzLndyaXRlTm9kZSgiU3Ryb2tlIixz eW1ib2xpemVyLG5vZGUpO30KcmV0dXJuIG5vZGU7fSwiRmlsbCI6ZnVuY3Rpb24o c3ltYm9saXplcil7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJz bGQ6RmlsbCIpO2lmKHN5bWJvbGl6ZXIuZmlsbENvbG9yKXt0aGlzLndyaXRlTm9k ZSgiQ3NzUGFyYW1ldGVyIix7c3ltYm9saXplcjpzeW1ib2xpemVyLGtleToiZmls bENvbG9yIn0sbm9kZSk7fQppZihzeW1ib2xpemVyLmZpbGxPcGFjaXR5IT1udWxs KXt0aGlzLndyaXRlTm9kZSgiQ3NzUGFyYW1ldGVyIix7c3ltYm9saXplcjpzeW1i b2xpemVyLGtleToiZmlsbE9wYWNpdHkifSxub2RlKTt9CnJldHVybiBub2RlO30s IlBvaW50U3ltYm9saXplciI6ZnVuY3Rpb24oc3ltYm9saXplcil7dmFyIG5vZGU9 dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJzbGQ6UG9pbnRTeW1ib2xpemVyIik7 dGhpcy53cml0ZU5vZGUoIkdyYXBoaWMiLHN5bWJvbGl6ZXIsbm9kZSk7cmV0dXJu IG5vZGU7fSwiR3JhcGhpYyI6ZnVuY3Rpb24oc3ltYm9saXplcil7dmFyIG5vZGU9 dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJzbGQ6R3JhcGhpYyIpO2lmKHN5bWJv bGl6ZXIuZXh0ZXJuYWxHcmFwaGljIT11bmRlZmluZWQpe3RoaXMud3JpdGVOb2Rl KCJFeHRlcm5hbEdyYXBoaWMiLHN5bWJvbGl6ZXIsbm9kZSk7fWVsc2V7dGhpcy53 cml0ZU5vZGUoIk1hcmsiLHN5bWJvbGl6ZXIsbm9kZSk7fQppZihzeW1ib2xpemVy LmdyYXBoaWNPcGFjaXR5IT11bmRlZmluZWQpe3RoaXMud3JpdGVOb2RlKCJPcGFj aXR5IixzeW1ib2xpemVyLmdyYXBoaWNPcGFjaXR5LG5vZGUpO30KaWYoc3ltYm9s aXplci5wb2ludFJhZGl1cyE9dW5kZWZpbmVkKXt0aGlzLndyaXRlTm9kZSgiU2l6 ZSIsc3ltYm9saXplci5wb2ludFJhZGl1cyoyLG5vZGUpO30KaWYoc3ltYm9saXpl ci5yb3RhdGlvbiE9dW5kZWZpbmVkKXt0aGlzLndyaXRlTm9kZSgiUm90YXRpb24i LHN5bWJvbGl6ZXIucm90YXRpb24sbm9kZSk7fQpyZXR1cm4gbm9kZTt9LCJFeHRl cm5hbEdyYXBoaWMiOmZ1bmN0aW9uKHN5bWJvbGl6ZXIpe3ZhciBub2RlPXRoaXMu Y3JlYXRlRWxlbWVudE5TUGx1cygic2xkOkV4dGVybmFsR3JhcGhpYyIpO3RoaXMu d3JpdGVOb2RlKCJPbmxpbmVSZXNvdXJjZSIsc3ltYm9saXplci5leHRlcm5hbEdy YXBoaWMsbm9kZSk7dmFyIGZvcm1hdD1zeW1ib2xpemVyLmdyYXBoaWNGb3JtYXR8 fHRoaXMuZ2V0R3JhcGhpY0Zvcm1hdChzeW1ib2xpemVyLmV4dGVybmFsR3JhcGhp Yyk7dGhpcy53cml0ZU5vZGUoIkZvcm1hdCIsZm9ybWF0LG5vZGUpO3JldHVybiBu b2RlO30sIk1hcmsiOmZ1bmN0aW9uKHN5bWJvbGl6ZXIpe3ZhciBub2RlPXRoaXMu Y3JlYXRlRWxlbWVudE5TUGx1cygic2xkOk1hcmsiKTtpZihzeW1ib2xpemVyLmdy YXBoaWNOYW1lKXt0aGlzLndyaXRlTm9kZSgiV2VsbEtub3duTmFtZSIsc3ltYm9s aXplci5ncmFwaGljTmFtZSxub2RlKTt9CmlmKHN5bWJvbGl6ZXIuZmlsbCE9PWZh bHNlKXt0aGlzLndyaXRlTm9kZSgiRmlsbCIsc3ltYm9saXplcixub2RlKTt9Cmlm KHN5bWJvbGl6ZXIuc3Ryb2tlIT09ZmFsc2Upe3RoaXMud3JpdGVOb2RlKCJTdHJv a2UiLHN5bWJvbGl6ZXIsbm9kZSk7fQpyZXR1cm4gbm9kZTt9LCJXZWxsS25vd25O YW1lIjpmdW5jdGlvbihuYW1lKXtyZXR1cm4gdGhpcy5jcmVhdGVFbGVtZW50TlNQ bHVzKCJzbGQ6V2VsbEtub3duTmFtZSIse3ZhbHVlOm5hbWV9KTt9LCJPcGFjaXR5 IjpmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIHRoaXMuY3JlYXRlRWxlbWVudE5TUGx1 cygic2xkOk9wYWNpdHkiLHt2YWx1ZTp2YWx1ZX0pO30sIlNpemUiOmZ1bmN0aW9u KHZhbHVlKXtyZXR1cm4gdGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJzbGQ6U2l6 ZSIse3ZhbHVlOnZhbHVlfSk7fSwiUm90YXRpb24iOmZ1bmN0aW9uKHZhbHVlKXty ZXR1cm4gdGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJzbGQ6Um90YXRpb24iLHt2 YWx1ZTp2YWx1ZX0pO30sIk9ubGluZVJlc291cmNlIjpmdW5jdGlvbihocmVmKXty ZXR1cm4gdGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJzbGQ6T25saW5lUmVzb3Vy Y2UiLHthdHRyaWJ1dGVzOnsieGxpbms6dHlwZSI6InNpbXBsZSIsInhsaW5rOmhy ZWYiOmhyZWZ9fSk7fSwiRm9ybWF0IjpmdW5jdGlvbihmb3JtYXQpe3JldHVybiB0 aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoInNsZDpGb3JtYXQiLHt2YWx1ZTpmb3Jt YXR9KTt9fX0sT3BlbkxheWVycy5Gb3JtYXQuRmlsdGVyLnYxXzBfMC5wcm90b3R5 cGUud3JpdGVycyksQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3JtYXQuU0xELnYx In0pO09wZW5MYXllcnMuRm9ybWF0LldNQy52MV8xXzA9T3BlbkxheWVycy5DbGFz cyhPcGVuTGF5ZXJzLkZvcm1hdC5XTUMudjEse1ZFUlNJT046IjEuMS4wIixzY2hl bWFMb2NhdGlvbjoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9jb250ZXh0IGh0dHA6 Ly9zY2hlbWFzLm9wZW5naXMubmV0L2NvbnRleHQvMS4xLjAvY29udGV4dC54c2Qi LGluaXRpYWxpemU6ZnVuY3Rpb24ob3B0aW9ucyl7T3BlbkxheWVycy5Gb3JtYXQu V01DLnYxLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW29wdGlvbnNd KTt9LHJlYWRfc2xkX01pblNjYWxlRGVub21pbmF0b3I6ZnVuY3Rpb24obGF5ZXJD b250ZXh0LG5vZGUpe3ZhciBtaW5TY2FsZURlbm9taW5hdG9yPXBhcnNlRmxvYXQo dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpKTtpZihtaW5TY2FsZURlbm9taW5hdG9y PjApe2xheWVyQ29udGV4dC5tYXhTY2FsZT1taW5TY2FsZURlbm9taW5hdG9yO319 LHJlYWRfc2xkX01heFNjYWxlRGVub21pbmF0b3I6ZnVuY3Rpb24obGF5ZXJDb250 ZXh0LG5vZGUpe2xheWVyQ29udGV4dC5taW5TY2FsZT1wYXJzZUZsb2F0KHRoaXMu Z2V0Q2hpbGRWYWx1ZShub2RlKSk7fSxyZWFkX3dtY19TUlM6ZnVuY3Rpb24obGF5 ZXJDb250ZXh0LG5vZGUpe2lmKCEoInNycyJpbiBsYXllckNvbnRleHQpKXtsYXll ckNvbnRleHQuc3JzPXt9O30KbGF5ZXJDb250ZXh0LnNyc1t0aGlzLmdldENoaWxk VmFsdWUobm9kZSldPXRydWU7fSx3cml0ZV93bWNfTGF5ZXI6ZnVuY3Rpb24oY29u dGV4dCl7dmFyIG5vZGU9T3BlbkxheWVycy5Gb3JtYXQuV01DLnYxLnByb3RvdHlw ZS53cml0ZV93bWNfTGF5ZXIuYXBwbHkodGhpcyxbY29udGV4dF0pO2lmKGNvbnRl eHQubWF4U2NhbGUpe3ZhciBtaW5TRD10aGlzLmNyZWF0ZUVsZW1lbnROUyh0aGlz Lm5hbWVzcGFjZXMuc2xkLCJzbGQ6TWluU2NhbGVEZW5vbWluYXRvciIpO21pblNE LmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlVGV4dE5vZGUoY29udGV4dC5tYXhTY2Fs ZS50b1ByZWNpc2lvbigxNikpKTtub2RlLmFwcGVuZENoaWxkKG1pblNEKTt9Cmlm KGNvbnRleHQubWluU2NhbGUpe3ZhciBtYXhTRD10aGlzLmNyZWF0ZUVsZW1lbnRO Uyh0aGlzLm5hbWVzcGFjZXMuc2xkLCJzbGQ6TWF4U2NhbGVEZW5vbWluYXRvciIp O21heFNELmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlVGV4dE5vZGUoY29udGV4dC5t aW5TY2FsZS50b1ByZWNpc2lvbigxNikpKTtub2RlLmFwcGVuZENoaWxkKG1heFNE KTt9CmlmKGNvbnRleHQuc3JzKXtmb3IodmFyIG5hbWUgaW4gY29udGV4dC5zcnMp e25vZGUuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVFbGVtZW50RGVmYXVsdE5TKCJT UlMiLG5hbWUpKTt9fQpub2RlLmFwcGVuZENoaWxkKHRoaXMud3JpdGVfd21jX0Zv cm1hdExpc3QoY29udGV4dCkpO25vZGUuYXBwZW5kQ2hpbGQodGhpcy53cml0ZV93 bWNfU3R5bGVMaXN0KGNvbnRleHQpKTtpZihjb250ZXh0LmRpbWVuc2lvbnMpe25v ZGUuYXBwZW5kQ2hpbGQodGhpcy53cml0ZV93bWNfRGltZW5zaW9uTGlzdChjb250 ZXh0KSk7fQpub2RlLmFwcGVuZENoaWxkKHRoaXMud3JpdGVfd21jX0xheWVyRXh0 ZW5zaW9uKGNvbnRleHQpKTtyZXR1cm4gbm9kZTt9LENMQVNTX05BTUU6Ik9wZW5M YXllcnMuRm9ybWF0LldNQy52MV8xXzAifSk7T3BlbkxheWVycy5Gb3JtYXQuWExT LnYxXzFfMD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0LlhMUy52 MSx7VkVSU0lPTjoiMS4xIixzY2hlbWFMb2NhdGlvbjoiaHR0cDovL3d3dy5vcGVu Z2lzLm5ldC94bHMgaHR0cDovL3NjaGVtYXMub3Blbmdpcy5uZXQvb2xzLzEuMS4w L0xvY2F0aW9uVXRpbGl0eVNlcnZpY2UueHNkIixpbml0aWFsaXplOmZ1bmN0aW9u KG9wdGlvbnMpe09wZW5MYXllcnMuRm9ybWF0LlhMUy52MS5wcm90b3R5cGUuaW5p dGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7fSxDTEFTU19OQU1FOiJPcGVu TGF5ZXJzLkZvcm1hdC5YTFMudjFfMV8wIn0pO09wZW5MYXllcnMuRm9ybWF0LlhM Uy52MV8xPU9wZW5MYXllcnMuRm9ybWF0LlhMUy52MV8xXzA7T3BlbkxheWVycy5S ZW5kZXJlci5TVkc9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLlJlbmRlcmVy LkVsZW1lbnRzLHt4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhs aW5rbnM6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLE1BWF9QSVhFTDox NTAwMCx0cmFuc2xhdGlvblBhcmFtZXRlcnM6bnVsbCxzeW1ib2xNZXRyaWNzOm51 bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihjb250YWluZXJJRCl7aWYoIXRoaXMuc3Vw cG9ydGVkKCkpe3JldHVybjt9Ck9wZW5MYXllcnMuUmVuZGVyZXIuRWxlbWVudHMu cHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMu dHJhbnNsYXRpb25QYXJhbWV0ZXJzPXt4OjAseTowfTt0aGlzLnN5bWJvbE1ldHJp Y3M9e307fSxzdXBwb3J0ZWQ6ZnVuY3Rpb24oKXt2YXIgc3ZnRmVhdHVyZT0iaHR0 cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSMiO3JldHVybihkb2N1bWVu dC5pbXBsZW1lbnRhdGlvbiYmKGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0Zl YXR1cmUoIm9yZy53M2Muc3ZnIiwiMS4wIil8fGRvY3VtZW50LmltcGxlbWVudGF0 aW9uLmhhc0ZlYXR1cmUoc3ZnRmVhdHVyZSsiU1ZHIiwiMS4xIil8fGRvY3VtZW50 LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoc3ZnRmVhdHVyZSsiQmFzaWNTdHJ1 Y3R1cmUiLCIxLjEiKSkpO30saW5WYWxpZFJhbmdlOmZ1bmN0aW9uKHgseSx4eU9u bHkpe3ZhciBsZWZ0PXgrKHh5T25seT8wOnRoaXMudHJhbnNsYXRpb25QYXJhbWV0 ZXJzLngpO3ZhciB0b3A9eSsoeHlPbmx5PzA6dGhpcy50cmFuc2xhdGlvblBhcmFt ZXRlcnMueSk7cmV0dXJuKGxlZnQ+PS10aGlzLk1BWF9QSVhFTCYmbGVmdDw9dGhp cy5NQVhfUElYRUwmJnRvcD49LXRoaXMuTUFYX1BJWEVMJiZ0b3A8PXRoaXMuTUFY X1BJWEVMKTt9LHNldEV4dGVudDpmdW5jdGlvbihleHRlbnQscmVzb2x1dGlvbkNo YW5nZWQpe09wZW5MYXllcnMuUmVuZGVyZXIuRWxlbWVudHMucHJvdG90eXBlLnNl dEV4dGVudC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIHJlc29sdXRpb249dGhp cy5nZXRSZXNvbHV0aW9uKCk7dmFyIGxlZnQ9LWV4dGVudC5sZWZ0L3Jlc29sdXRp b247dmFyIHRvcD1leHRlbnQudG9wL3Jlc29sdXRpb247aWYocmVzb2x1dGlvbkNo YW5nZWQpe3RoaXMubGVmdD1sZWZ0O3RoaXMudG9wPXRvcDt2YXIgZXh0ZW50U3Ry aW5nPSIwIDAgIit0aGlzLnNpemUudysiICIrdGhpcy5zaXplLmg7dGhpcy5yZW5k ZXJlclJvb3Quc2V0QXR0cmlidXRlTlMobnVsbCwidmlld0JveCIsZXh0ZW50U3Ry aW5nKTt0aGlzLnRyYW5zbGF0ZSgwLDApO3JldHVybiB0cnVlO31lbHNle3ZhciBp blJhbmdlPXRoaXMudHJhbnNsYXRlKGxlZnQtdGhpcy5sZWZ0LHRvcC10aGlzLnRv cCk7aWYoIWluUmFuZ2Upe3RoaXMuc2V0RXh0ZW50KGV4dGVudCx0cnVlKTt9CnJl dHVybiBpblJhbmdlO319LHRyYW5zbGF0ZTpmdW5jdGlvbih4LHkpe2lmKCF0aGlz LmluVmFsaWRSYW5nZSh4LHksdHJ1ZSkpe3JldHVybiBmYWxzZTt9ZWxzZXt2YXIg dHJhbnNmb3JtU3RyaW5nPSIiO2lmKHh8fHkpe3RyYW5zZm9ybVN0cmluZz0idHJh bnNsYXRlKCIreCsiLCIreSsiKSI7fQp0aGlzLnJvb3Quc2V0QXR0cmlidXRlTlMo bnVsbCwidHJhbnNmb3JtIix0cmFuc2Zvcm1TdHJpbmcpO3RoaXMudHJhbnNsYXRp b25QYXJhbWV0ZXJzPXt4OngseTp5fTtyZXR1cm4gdHJ1ZTt9fSxzZXRTaXplOmZ1 bmN0aW9uKHNpemUpe09wZW5MYXllcnMuUmVuZGVyZXIucHJvdG90eXBlLnNldFNp emUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMucmVuZGVyZXJSb290LnNldEF0 dHJpYnV0ZU5TKG51bGwsIndpZHRoIix0aGlzLnNpemUudyk7dGhpcy5yZW5kZXJl clJvb3Quc2V0QXR0cmlidXRlTlMobnVsbCwiaGVpZ2h0Iix0aGlzLnNpemUuaCk7 fSxnZXROb2RlVHlwZTpmdW5jdGlvbihnZW9tZXRyeSxzdHlsZSl7dmFyIG5vZGVU eXBlPW51bGw7c3dpdGNoKGdlb21ldHJ5LkNMQVNTX05BTUUpe2Nhc2UiT3Blbkxh eWVycy5HZW9tZXRyeS5Qb2ludCI6aWYoc3R5bGUuZXh0ZXJuYWxHcmFwaGljKXtu b2RlVHlwZT0iaW1hZ2UiO31lbHNlIGlmKHRoaXMuaXNDb21wbGV4U3ltYm9sKHN0 eWxlLmdyYXBoaWNOYW1lKSl7bm9kZVR5cGU9InN2ZyI7fWVsc2V7bm9kZVR5cGU9 ImNpcmNsZSI7fQpicmVhaztjYXNlIk9wZW5MYXllcnMuR2VvbWV0cnkuUmVjdGFu Z2xlIjpub2RlVHlwZT0icmVjdCI7YnJlYWs7Y2FzZSJPcGVuTGF5ZXJzLkdlb21l dHJ5LkxpbmVTdHJpbmciOm5vZGVUeXBlPSJwb2x5bGluZSI7YnJlYWs7Y2FzZSJP cGVuTGF5ZXJzLkdlb21ldHJ5LkxpbmVhclJpbmciOm5vZGVUeXBlPSJwb2x5Z29u IjticmVhaztjYXNlIk9wZW5MYXllcnMuR2VvbWV0cnkuUG9seWdvbiI6Y2FzZSJP cGVuTGF5ZXJzLkdlb21ldHJ5LkN1cnZlIjpjYXNlIk9wZW5MYXllcnMuR2VvbWV0 cnkuU3VyZmFjZSI6bm9kZVR5cGU9InBhdGgiO2JyZWFrO2RlZmF1bHQ6YnJlYWs7 fQpyZXR1cm4gbm9kZVR5cGU7fSxzZXRTdHlsZTpmdW5jdGlvbihub2RlLHN0eWxl LG9wdGlvbnMpe3N0eWxlPXN0eWxlfHxub2RlLl9zdHlsZTtvcHRpb25zPW9wdGlv bnN8fG5vZGUuX29wdGlvbnM7dmFyIHI9cGFyc2VGbG9hdChub2RlLmdldEF0dHJp YnV0ZU5TKG51bGwsInIiKSk7dmFyIHdpZHRoRmFjdG9yPTE7dmFyIHBvcztpZihu b2RlLl9nZW9tZXRyeUNsYXNzPT0iT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCIm JnIpe25vZGUuc3R5bGUudmlzaWJpbGl0eT0iIjtpZihzdHlsZS5ncmFwaGljPT09 ZmFsc2Upe25vZGUuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIjt9ZWxzZSBpZihz dHlsZS5leHRlcm5hbEdyYXBoaWMpe3Bvcz10aGlzLmdldFBvc2l0aW9uKG5vZGUp O2lmKHN0eWxlLmdyYXBoaWNUaXRsZSl7bm9kZS5zZXRBdHRyaWJ1dGVOUyhudWxs LCJ0aXRsZSIsc3R5bGUuZ3JhcGhpY1RpdGxlKTt2YXIgbGFiZWw9dGhpcy5ub2Rl RmFjdG9yeShudWxsLCJ0aXRsZSIpO2xhYmVsLnRleHRDb250ZW50PXN0eWxlLmdy YXBoaWNUaXRsZTtub2RlLmFwcGVuZENoaWxkKGxhYmVsKTt9CmlmKHN0eWxlLmdy YXBoaWNXaWR0aCYmc3R5bGUuZ3JhcGhpY0hlaWdodCl7bm9kZS5zZXRBdHRyaWJ1 dGVOUyhudWxsLCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwibm9uZSIpO30KdmFyIHdp ZHRoPXN0eWxlLmdyYXBoaWNXaWR0aHx8c3R5bGUuZ3JhcGhpY0hlaWdodDt2YXIg aGVpZ2h0PXN0eWxlLmdyYXBoaWNIZWlnaHR8fHN0eWxlLmdyYXBoaWNXaWR0aDt3 aWR0aD13aWR0aD93aWR0aDpzdHlsZS5wb2ludFJhZGl1cyoyO2hlaWdodD1oZWln aHQ/aGVpZ2h0OnN0eWxlLnBvaW50UmFkaXVzKjI7dmFyIHhPZmZzZXQ9KHN0eWxl LmdyYXBoaWNYT2Zmc2V0IT11bmRlZmluZWQpP3N0eWxlLmdyYXBoaWNYT2Zmc2V0 Oi0oMC41KndpZHRoKTt2YXIgeU9mZnNldD0oc3R5bGUuZ3JhcGhpY1lPZmZzZXQh PXVuZGVmaW5lZCk/c3R5bGUuZ3JhcGhpY1lPZmZzZXQ6LSgwLjUqaGVpZ2h0KTt2 YXIgb3BhY2l0eT1zdHlsZS5ncmFwaGljT3BhY2l0eXx8c3R5bGUuZmlsbE9wYWNp dHk7bm9kZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ4IiwocG9zLngreE9mZnNldCku dG9GaXhlZCgpKTtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLChwb3MueSt5 T2Zmc2V0KS50b0ZpeGVkKCkpO25vZGUuc2V0QXR0cmlidXRlTlMobnVsbCwid2lk dGgiLHdpZHRoKTtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsImhlaWdodCIsaGVp Z2h0KTtub2RlLnNldEF0dHJpYnV0ZU5TKHRoaXMueGxpbmtucywiaHJlZiIsc3R5 bGUuZXh0ZXJuYWxHcmFwaGljKTtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsInN0 eWxlIiwib3BhY2l0eTogIitvcGFjaXR5KTtub2RlLm9uY2xpY2s9T3BlbkxheWVy cy5SZW5kZXJlci5TVkcucHJldmVudERlZmF1bHQ7fWVsc2UgaWYodGhpcy5pc0Nv bXBsZXhTeW1ib2woc3R5bGUuZ3JhcGhpY05hbWUpKXt2YXIgb2Zmc2V0PXN0eWxl LnBvaW50UmFkaXVzKjM7dmFyIHNpemU9b2Zmc2V0KjI7dmFyIHNyYz10aGlzLmlt cG9ydFN5bWJvbChzdHlsZS5ncmFwaGljTmFtZSk7cG9zPXRoaXMuZ2V0UG9zaXRp b24obm9kZSk7d2lkdGhGYWN0b3I9dGhpcy5zeW1ib2xNZXRyaWNzW3NyYy5pZF1b MF0qMy9zaXplO3ZhciBwYXJlbnQ9bm9kZS5wYXJlbnROb2RlO3ZhciBuZXh0U2li bGluZz1ub2RlLm5leHRTaWJsaW5nO2lmKHBhcmVudCl7cGFyZW50LnJlbW92ZUNo aWxkKG5vZGUpO30Kbm9kZS5maXJzdENoaWxkJiZub2RlLnJlbW92ZUNoaWxkKG5v ZGUuZmlyc3RDaGlsZCk7bm9kZS5hcHBlbmRDaGlsZChzcmMuZmlyc3RDaGlsZC5j bG9uZU5vZGUodHJ1ZSkpO25vZGUuc2V0QXR0cmlidXRlTlMobnVsbCwidmlld0Jv eCIsc3JjLmdldEF0dHJpYnV0ZU5TKG51bGwsInZpZXdCb3giKSk7bm9kZS5zZXRB dHRyaWJ1dGVOUyhudWxsLCJ3aWR0aCIsc2l6ZSk7bm9kZS5zZXRBdHRyaWJ1dGVO UyhudWxsLCJoZWlnaHQiLHNpemUpO25vZGUuc2V0QXR0cmlidXRlTlMobnVsbCwi eCIscG9zLngtb2Zmc2V0KTtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLHBv cy55LW9mZnNldCk7aWYobmV4dFNpYmxpbmcpe3BhcmVudC5pbnNlcnRCZWZvcmUo bm9kZSxuZXh0U2libGluZyk7fWVsc2UgaWYocGFyZW50KXtwYXJlbnQuYXBwZW5k Q2hpbGQobm9kZSk7fX1lbHNle25vZGUuc2V0QXR0cmlidXRlTlMobnVsbCwiciIs c3R5bGUucG9pbnRSYWRpdXMpO30KdmFyIHJvdGF0aW9uPXN0eWxlLnJvdGF0aW9u O2lmKChyb3RhdGlvbiE9PXVuZGVmaW5lZHx8bm9kZS5fcm90YXRpb24hPT11bmRl ZmluZWQpJiZwb3Mpe25vZGUuX3JvdGF0aW9uPXJvdGF0aW9uO3JvdGF0aW9ufD0w O2lmKG5vZGUubm9kZU5hbWUhPT0ic3ZnIil7bm9kZS5zZXRBdHRyaWJ1dGVOUyhu dWxsLCJ0cmFuc2Zvcm0iLCJyb3RhdGUoIityb3RhdGlvbisiICIrcG9zLngrIiAi Kwpwb3MueSsiKSIpO31lbHNle3ZhciBtZXRyaWNzPXRoaXMuc3ltYm9sTWV0cmlj c1tzcmMuaWRdO25vZGUuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ0 cmFuc2Zvcm0iLCJyb3RhdGUoIgorcm90YXRpb24rIiAiCittZXRyaWNzWzFdKyIg IgorbWV0cmljc1syXSsiKSIpO319fQppZihvcHRpb25zLmlzRmlsbGVkKXtub2Rl LnNldEF0dHJpYnV0ZU5TKG51bGwsImZpbGwiLHN0eWxlLmZpbGxDb2xvcik7bm9k ZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsLW9wYWNpdHkiLHN0eWxlLmZpbGxP cGFjaXR5KTt9ZWxzZXtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsImZpbGwiLCJu b25lIik7fQppZihvcHRpb25zLmlzU3Ryb2tlZCl7bm9kZS5zZXRBdHRyaWJ1dGVO UyhudWxsLCJzdHJva2UiLHN0eWxlLnN0cm9rZUNvbG9yKTtub2RlLnNldEF0dHJp YnV0ZU5TKG51bGwsInN0cm9rZS1vcGFjaXR5IixzdHlsZS5zdHJva2VPcGFjaXR5 KTtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsInN0cm9rZS13aWR0aCIsc3R5bGUu c3Ryb2tlV2lkdGgqd2lkdGhGYWN0b3IpO25vZGUuc2V0QXR0cmlidXRlTlMobnVs bCwic3Ryb2tlLWxpbmVjYXAiLHN0eWxlLnN0cm9rZUxpbmVjYXB8fCJyb3VuZCIp O25vZGUuc2V0QXR0cmlidXRlTlMobnVsbCwic3Ryb2tlLWxpbmVqb2luIiwicm91 bmQiKTtzdHlsZS5zdHJva2VEYXNoc3R5bGUmJm5vZGUuc2V0QXR0cmlidXRlTlMo bnVsbCwic3Ryb2tlLWRhc2hhcnJheSIsdGhpcy5kYXNoU3R5bGUoc3R5bGUsd2lk dGhGYWN0b3IpKTt9ZWxzZXtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsInN0cm9r ZSIsIm5vbmUiKTt9CmlmKHN0eWxlLnBvaW50ZXJFdmVudHMpe25vZGUuc2V0QXR0 cmlidXRlTlMobnVsbCwicG9pbnRlci1ldmVudHMiLHN0eWxlLnBvaW50ZXJFdmVu dHMpO30KaWYoc3R5bGUuY3Vyc29yIT1udWxsKXtub2RlLnNldEF0dHJpYnV0ZU5T KG51bGwsImN1cnNvciIsc3R5bGUuY3Vyc29yKTt9CnJldHVybiBub2RlO30sZGFz aFN0eWxlOmZ1bmN0aW9uKHN0eWxlLHdpZHRoRmFjdG9yKXt2YXIgdz1zdHlsZS5z dHJva2VXaWR0aCp3aWR0aEZhY3Rvcjt2YXIgc3RyPXN0eWxlLnN0cm9rZURhc2hz dHlsZTtzd2l0Y2goc3RyKXtjYXNlJ3NvbGlkJzpyZXR1cm4nbm9uZSc7Y2FzZSdk b3QnOnJldHVyblsxLDQqd10uam9pbigpO2Nhc2UnZGFzaCc6cmV0dXJuWzQqdyw0 KnddLmpvaW4oKTtjYXNlJ2Rhc2hkb3QnOnJldHVybls0KncsNCp3LDEsNCp3XS5q b2luKCk7Y2FzZSdsb25nZGFzaCc6cmV0dXJuWzgqdyw0KnddLmpvaW4oKTtjYXNl J2xvbmdkYXNoZG90JzpyZXR1cm5bOCp3LDQqdywxLDQqd10uam9pbigpO2RlZmF1 bHQ6cmV0dXJuIE9wZW5MYXllcnMuU3RyaW5nLnRyaW0oc3RyKS5yZXBsYWNlKC9c cysvZywiLCIpO319LGNyZWF0ZU5vZGU6ZnVuY3Rpb24odHlwZSxpZCl7dmFyIG5v ZGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMueG1sbnMsdHlwZSk7aWYo aWQpe25vZGUuc2V0QXR0cmlidXRlTlMobnVsbCwiaWQiLGlkKTt9CnJldHVybiBu b2RlO30sbm9kZVR5cGVDb21wYXJlOmZ1bmN0aW9uKG5vZGUsdHlwZSl7cmV0dXJu KHR5cGU9PW5vZGUubm9kZU5hbWUpO30sY3JlYXRlUmVuZGVyUm9vdDpmdW5jdGlv bigpe3JldHVybiB0aGlzLm5vZGVGYWN0b3J5KHRoaXMuY29udGFpbmVyLmlkKyJf c3ZnUm9vdCIsInN2ZyIpO30sY3JlYXRlUm9vdDpmdW5jdGlvbihzdWZmaXgpe3Jl dHVybiB0aGlzLm5vZGVGYWN0b3J5KHRoaXMuY29udGFpbmVyLmlkK3N1ZmZpeCwi ZyIpO30sY3JlYXRlRGVmczpmdW5jdGlvbigpe3ZhciBkZWZzPXRoaXMubm9kZUZh Y3RvcnkodGhpcy5jb250YWluZXIuaWQrIl9kZWZzIiwiZGVmcyIpO3RoaXMucmVu ZGVyZXJSb290LmFwcGVuZENoaWxkKGRlZnMpO3JldHVybiBkZWZzO30sZHJhd1Bv aW50OmZ1bmN0aW9uKG5vZGUsZ2VvbWV0cnkpe3JldHVybiB0aGlzLmRyYXdDaXJj bGUobm9kZSxnZW9tZXRyeSwxKTt9LGRyYXdDaXJjbGU6ZnVuY3Rpb24obm9kZSxn ZW9tZXRyeSxyYWRpdXMpe3ZhciByZXNvbHV0aW9uPXRoaXMuZ2V0UmVzb2x1dGlv bigpO3ZhciB4PShnZW9tZXRyeS54L3Jlc29sdXRpb24rdGhpcy5sZWZ0KTt2YXIg eT0odGhpcy50b3AtZ2VvbWV0cnkueS9yZXNvbHV0aW9uKTtpZih0aGlzLmluVmFs aWRSYW5nZSh4LHkpKXtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsImN4Iix4KTtu b2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsImN5Iix5KTtub2RlLnNldEF0dHJpYnV0 ZU5TKG51bGwsInIiLHJhZGl1cyk7cmV0dXJuIG5vZGU7fWVsc2V7cmV0dXJuIGZh bHNlO319LGRyYXdMaW5lU3RyaW5nOmZ1bmN0aW9uKG5vZGUsZ2VvbWV0cnkpe3Zh ciBjb21wb25lbnRzUmVzdWx0PXRoaXMuZ2V0Q29tcG9uZW50c1N0cmluZyhnZW9t ZXRyeS5jb21wb25lbnRzKTtpZihjb21wb25lbnRzUmVzdWx0LnBhdGgpe25vZGUu c2V0QXR0cmlidXRlTlMobnVsbCwicG9pbnRzIixjb21wb25lbnRzUmVzdWx0LnBh dGgpO3JldHVybihjb21wb25lbnRzUmVzdWx0LmNvbXBsZXRlP25vZGU6bnVsbCk7 fWVsc2V7cmV0dXJuIGZhbHNlO319LGRyYXdMaW5lYXJSaW5nOmZ1bmN0aW9uKG5v ZGUsZ2VvbWV0cnkpe3ZhciBjb21wb25lbnRzUmVzdWx0PXRoaXMuZ2V0Q29tcG9u ZW50c1N0cmluZyhnZW9tZXRyeS5jb21wb25lbnRzKTtpZihjb21wb25lbnRzUmVz dWx0LnBhdGgpe25vZGUuc2V0QXR0cmlidXRlTlMobnVsbCwicG9pbnRzIixjb21w b25lbnRzUmVzdWx0LnBhdGgpO3JldHVybihjb21wb25lbnRzUmVzdWx0LmNvbXBs ZXRlP25vZGU6bnVsbCk7fWVsc2V7cmV0dXJuIGZhbHNlO319LGRyYXdQb2x5Z29u OmZ1bmN0aW9uKG5vZGUsZ2VvbWV0cnkpe3ZhciBkPSIiO3ZhciBkcmF3PXRydWU7 dmFyIGNvbXBsZXRlPXRydWU7dmFyIGxpbmVhclJpbmdSZXN1bHQscGF0aDtmb3Io dmFyIGo9MCxsZW49Z2VvbWV0cnkuY29tcG9uZW50cy5sZW5ndGg7ajxsZW47aisr KXtkKz0iIE0iO2xpbmVhclJpbmdSZXN1bHQ9dGhpcy5nZXRDb21wb25lbnRzU3Ry aW5nKGdlb21ldHJ5LmNvbXBvbmVudHNbal0uY29tcG9uZW50cywiICIpO3BhdGg9 bGluZWFyUmluZ1Jlc3VsdC5wYXRoO2lmKHBhdGgpe2QrPSIgIitwYXRoO2NvbXBs ZXRlPWxpbmVhclJpbmdSZXN1bHQuY29tcGxldGUmJmNvbXBsZXRlO31lbHNle2Ry YXc9ZmFsc2U7fX0KZCs9IiB6IjtpZihkcmF3KXtub2RlLnNldEF0dHJpYnV0ZU5T KG51bGwsImQiLGQpO25vZGUuc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbC1ydWxl IiwiZXZlbm9kZCIpO3JldHVybiBjb21wbGV0ZT9ub2RlOm51bGw7fWVsc2V7cmV0 dXJuIGZhbHNlO319LGRyYXdSZWN0YW5nbGU6ZnVuY3Rpb24obm9kZSxnZW9tZXRy eSl7dmFyIHJlc29sdXRpb249dGhpcy5nZXRSZXNvbHV0aW9uKCk7dmFyIHg9KGdl b21ldHJ5LngvcmVzb2x1dGlvbit0aGlzLmxlZnQpO3ZhciB5PSh0aGlzLnRvcC1n ZW9tZXRyeS55L3Jlc29sdXRpb24pO2lmKHRoaXMuaW5WYWxpZFJhbmdlKHgseSkp e25vZGUuc2V0QXR0cmlidXRlTlMobnVsbCwieCIseCk7bm9kZS5zZXRBdHRyaWJ1 dGVOUyhudWxsLCJ5Iix5KTtub2RlLnNldEF0dHJpYnV0ZU5TKG51bGwsIndpZHRo IixnZW9tZXRyeS53aWR0aC9yZXNvbHV0aW9uKTtub2RlLnNldEF0dHJpYnV0ZU5T KG51bGwsImhlaWdodCIsZ2VvbWV0cnkuaGVpZ2h0L3Jlc29sdXRpb24pO3JldHVy biBub2RlO31lbHNle3JldHVybiBmYWxzZTt9fSxkcmF3U3VyZmFjZTpmdW5jdGlv bihub2RlLGdlb21ldHJ5KXt2YXIgZD1udWxsO3ZhciBkcmF3PXRydWU7Zm9yKHZh ciBpPTAsbGVuPWdlb21ldHJ5LmNvbXBvbmVudHMubGVuZ3RoO2k8bGVuO2krKyl7 aWYoKGklMyk9PTAmJihpLzMpPT0wKXt2YXIgY29tcG9uZW50PXRoaXMuZ2V0U2hv cnRTdHJpbmcoZ2VvbWV0cnkuY29tcG9uZW50c1tpXSk7aWYoIWNvbXBvbmVudCl7 ZHJhdz1mYWxzZTt9CmQ9Ik0gIitjb21wb25lbnQ7fWVsc2UgaWYoKGklMyk9PTEp e3ZhciBjb21wb25lbnQ9dGhpcy5nZXRTaG9ydFN0cmluZyhnZW9tZXRyeS5jb21w b25lbnRzW2ldKTtpZighY29tcG9uZW50KXtkcmF3PWZhbHNlO30KZCs9IiBDICIr Y29tcG9uZW50O31lbHNle3ZhciBjb21wb25lbnQ9dGhpcy5nZXRTaG9ydFN0cmlu ZyhnZW9tZXRyeS5jb21wb25lbnRzW2ldKTtpZighY29tcG9uZW50KXtkcmF3PWZh bHNlO30KZCs9IiAiK2NvbXBvbmVudDt9fQpkKz0iIFoiO2lmKGRyYXcpe25vZGUu c2V0QXR0cmlidXRlTlMobnVsbCwiZCIsZCk7cmV0dXJuIG5vZGU7fWVsc2V7cmV0 dXJuIGZhbHNlO319LGRyYXdUZXh0OmZ1bmN0aW9uKGZlYXR1cmVJZCxzdHlsZSxs b2NhdGlvbil7dmFyIHJlc29sdXRpb249dGhpcy5nZXRSZXNvbHV0aW9uKCk7dmFy IHg9KGxvY2F0aW9uLngvcmVzb2x1dGlvbit0aGlzLmxlZnQpO3ZhciB5PShsb2Nh dGlvbi55L3Jlc29sdXRpb24tdGhpcy50b3ApO3ZhciBsYWJlbD10aGlzLm5vZGVG YWN0b3J5KGZlYXR1cmVJZCt0aGlzLkxBQkVMX0lEX1NVRkZJWCwidGV4dCIpO2xh YmVsLnNldEF0dHJpYnV0ZU5TKG51bGwsIngiLHgpO2xhYmVsLnNldEF0dHJpYnV0 ZU5TKG51bGwsInkiLC15KTtpZihzdHlsZS5mb250Q29sb3Ipe2xhYmVsLnNldEF0 dHJpYnV0ZU5TKG51bGwsImZpbGwiLHN0eWxlLmZvbnRDb2xvcik7fQppZihzdHls ZS5mb250T3BhY2l0eSl7bGFiZWwuc2V0QXR0cmlidXRlTlMobnVsbCwib3BhY2l0 eSIsc3R5bGUuZm9udE9wYWNpdHkpO30KaWYoc3R5bGUuZm9udEZhbWlseSl7bGFi ZWwuc2V0QXR0cmlidXRlTlMobnVsbCwiZm9udC1mYW1pbHkiLHN0eWxlLmZvbnRG YW1pbHkpO30KaWYoc3R5bGUuZm9udFNpemUpe2xhYmVsLnNldEF0dHJpYnV0ZU5T KG51bGwsImZvbnQtc2l6ZSIsc3R5bGUuZm9udFNpemUpO30KaWYoc3R5bGUuZm9u dFdlaWdodCl7bGFiZWwuc2V0QXR0cmlidXRlTlMobnVsbCwiZm9udC13ZWlnaHQi LHN0eWxlLmZvbnRXZWlnaHQpO30KaWYoc3R5bGUuZm9udFN0eWxlKXtsYWJlbC5z ZXRBdHRyaWJ1dGVOUyhudWxsLCJmb250LXN0eWxlIixzdHlsZS5mb250U3R5bGUp O30KaWYoc3R5bGUubGFiZWxTZWxlY3Q9PT10cnVlKXtsYWJlbC5zZXRBdHRyaWJ1 dGVOUyhudWxsLCJwb2ludGVyLWV2ZW50cyIsInZpc2libGUiKTtsYWJlbC5fZmVh dHVyZUlkPWZlYXR1cmVJZDt9ZWxzZXtsYWJlbC5zZXRBdHRyaWJ1dGVOUyhudWxs LCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKTt9CnZhciBhbGlnbj1zdHlsZS5sYWJl bEFsaWdufHwiY20iO2xhYmVsLnNldEF0dHJpYnV0ZU5TKG51bGwsInRleHQtYW5j aG9yIixPcGVuTGF5ZXJzLlJlbmRlcmVyLlNWRy5MQUJFTF9BTElHTlthbGlnblsw XV18fCJtaWRkbGUiKTtpZihPcGVuTGF5ZXJzLklTX0dFQ0tPPT09dHJ1ZSl7bGFi ZWwuc2V0QXR0cmlidXRlTlMobnVsbCwiZG9taW5hbnQtYmFzZWxpbmUiLE9wZW5M YXllcnMuUmVuZGVyZXIuU1ZHLkxBQkVMX0FMSUdOW2FsaWduWzFdXXx8ImNlbnRy YWwiKTt9CnZhciBsYWJlbFJvd3M9c3R5bGUubGFiZWwuc3BsaXQoJ1xuJyk7dmFy IG51bVJvd3M9bGFiZWxSb3dzLmxlbmd0aDt3aGlsZShsYWJlbC5jaGlsZE5vZGVz Lmxlbmd0aD5udW1Sb3dzKXtsYWJlbC5yZW1vdmVDaGlsZChsYWJlbC5sYXN0Q2hp bGQpO30KZm9yKHZhciBpPTA7aTxudW1Sb3dzO2krKyl7dmFyIHRzcGFuPXRoaXMu bm9kZUZhY3RvcnkoZmVhdHVyZUlkK3RoaXMuTEFCRUxfSURfU1VGRklYKyJfdHNw YW5fIitpLCJ0c3BhbiIpO2lmKHN0eWxlLmxhYmVsU2VsZWN0PT09dHJ1ZSl7dHNw YW4uX2ZlYXR1cmVJZD1mZWF0dXJlSWQ7dHNwYW4uX2dlb21ldHJ5PWxvY2F0aW9u O3RzcGFuLl9nZW9tZXRyeUNsYXNzPWxvY2F0aW9uLkNMQVNTX05BTUU7fQppZihP cGVuTGF5ZXJzLklTX0dFQ0tPPT09ZmFsc2Upe3RzcGFuLnNldEF0dHJpYnV0ZU5T KG51bGwsImJhc2VsaW5lLXNoaWZ0IixPcGVuTGF5ZXJzLlJlbmRlcmVyLlNWRy5M QUJFTF9WU0hJRlRbYWxpZ25bMV1dfHwiLTM1JSIpO30KdHNwYW4uc2V0QXR0cmli dXRlKCJ4Iix4KTtpZihpPT0wKXt2YXIgdmZhY3Rvcj1PcGVuTGF5ZXJzLlJlbmRl cmVyLlNWRy5MQUJFTF9WRkFDVE9SW2FsaWduWzFdXTtpZih2ZmFjdG9yPT1udWxs KXt2ZmFjdG9yPS0uNTt9CnRzcGFuLnNldEF0dHJpYnV0ZSgiZHkiLCh2ZmFjdG9y KihudW1Sb3dzLTEpKSsiZW0iKTt9ZWxzZXt0c3Bhbi5zZXRBdHRyaWJ1dGUoImR5 IiwiMWVtIik7fQp0c3Bhbi50ZXh0Q29udGVudD0obGFiZWxSb3dzW2ldPT09Jycp PycgJzpsYWJlbFJvd3NbaV07aWYoIXRzcGFuLnBhcmVudE5vZGUpe2xhYmVsLmFw cGVuZENoaWxkKHRzcGFuKTt9fQppZighbGFiZWwucGFyZW50Tm9kZSl7dGhpcy50 ZXh0Um9vdC5hcHBlbmRDaGlsZChsYWJlbCk7fX0sZ2V0Q29tcG9uZW50c1N0cmlu ZzpmdW5jdGlvbihjb21wb25lbnRzLHNlcGFyYXRvcil7dmFyIHJlbmRlckNtcD1b XTt2YXIgY29tcGxldGU9dHJ1ZTt2YXIgbGVuPWNvbXBvbmVudHMubGVuZ3RoO3Zh ciBzdHJpbmdzPVtdO3ZhciBzdHIsY29tcG9uZW50O2Zvcih2YXIgaT0wO2k8bGVu O2krKyl7Y29tcG9uZW50PWNvbXBvbmVudHNbaV07cmVuZGVyQ21wLnB1c2goY29t cG9uZW50KTtzdHI9dGhpcy5nZXRTaG9ydFN0cmluZyhjb21wb25lbnQpO2lmKHN0 cil7c3RyaW5ncy5wdXNoKHN0cik7fWVsc2V7aWYoaT4wKXtpZih0aGlzLmdldFNo b3J0U3RyaW5nKGNvbXBvbmVudHNbaS0xXSkpe3N0cmluZ3MucHVzaCh0aGlzLmNs aXBMaW5lKGNvbXBvbmVudHNbaV0sY29tcG9uZW50c1tpLTFdKSk7fX0KaWYoaTxs ZW4tMSl7aWYodGhpcy5nZXRTaG9ydFN0cmluZyhjb21wb25lbnRzW2krMV0pKXtz dHJpbmdzLnB1c2godGhpcy5jbGlwTGluZShjb21wb25lbnRzW2ldLGNvbXBvbmVu dHNbaSsxXSkpO319CmNvbXBsZXRlPWZhbHNlO319CnJldHVybntwYXRoOnN0cmlu Z3Muam9pbihzZXBhcmF0b3J8fCIsIiksY29tcGxldGU6Y29tcGxldGV9O30sY2xp cExpbmU6ZnVuY3Rpb24oYmFkQ29tcG9uZW50LGdvb2RDb21wb25lbnQpe2lmKGdv b2RDb21wb25lbnQuZXF1YWxzKGJhZENvbXBvbmVudCkpe3JldHVybiIiO30KdmFy IHJlc29sdXRpb249dGhpcy5nZXRSZXNvbHV0aW9uKCk7dmFyIG1heFg9dGhpcy5N QVhfUElYRUwtdGhpcy50cmFuc2xhdGlvblBhcmFtZXRlcnMueDt2YXIgbWF4WT10 aGlzLk1BWF9QSVhFTC10aGlzLnRyYW5zbGF0aW9uUGFyYW1ldGVycy55O3ZhciB4 MT1nb29kQ29tcG9uZW50LngvcmVzb2x1dGlvbit0aGlzLmxlZnQ7dmFyIHkxPXRo aXMudG9wLWdvb2RDb21wb25lbnQueS9yZXNvbHV0aW9uO3ZhciB4Mj1iYWRDb21w b25lbnQueC9yZXNvbHV0aW9uK3RoaXMubGVmdDt2YXIgeTI9dGhpcy50b3AtYmFk Q29tcG9uZW50LnkvcmVzb2x1dGlvbjt2YXIgaztpZih4MjwtbWF4WHx8eDI+bWF4 WCl7az0oeTIteTEpLyh4Mi14MSk7eDI9eDI8MD8tbWF4WDptYXhYO3kyPXkxKyh4 Mi14MSkqazt9CmlmKHkyPC1tYXhZfHx5Mj5tYXhZKXtrPSh4Mi14MSkvKHkyLXkx KTt5Mj15MjwwPy1tYXhZOm1heFk7eDI9eDErKHkyLXkxKSprO30KcmV0dXJuIHgy KyIsIit5Mjt9LGdldFNob3J0U3RyaW5nOmZ1bmN0aW9uKHBvaW50KXt2YXIgcmVz b2x1dGlvbj10aGlzLmdldFJlc29sdXRpb24oKTt2YXIgeD0ocG9pbnQueC9yZXNv bHV0aW9uK3RoaXMubGVmdCk7dmFyIHk9KHRoaXMudG9wLXBvaW50LnkvcmVzb2x1 dGlvbik7aWYodGhpcy5pblZhbGlkUmFuZ2UoeCx5KSl7cmV0dXJuIHgrIiwiK3k7 fWVsc2V7cmV0dXJuIGZhbHNlO319LGdldFBvc2l0aW9uOmZ1bmN0aW9uKG5vZGUp e3JldHVybih7eDpwYXJzZUZsb2F0KG5vZGUuZ2V0QXR0cmlidXRlTlMobnVsbCwi Y3giKSkseTpwYXJzZUZsb2F0KG5vZGUuZ2V0QXR0cmlidXRlTlMobnVsbCwiY3ki KSl9KTt9LGltcG9ydFN5bWJvbDpmdW5jdGlvbihncmFwaGljTmFtZSl7aWYoIXRo aXMuZGVmcyl7dGhpcy5kZWZzPXRoaXMuY3JlYXRlRGVmcygpO30KdmFyIGlkPXRo aXMuY29udGFpbmVyLmlkKyItIitncmFwaGljTmFtZTt2YXIgZXhpc3Rpbmc9ZG9j dW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpCmlmKGV4aXN0aW5nIT1udWxsKXtyZXR1 cm4gZXhpc3Rpbmc7fQp2YXIgc3ltYm9sPU9wZW5MYXllcnMuUmVuZGVyZXIuc3lt Ym9sW2dyYXBoaWNOYW1lXTtpZighc3ltYm9sKXt0aHJvdyBuZXcgRXJyb3IoZ3Jh cGhpY05hbWUrJyBpcyBub3QgYSB2YWxpZCBzeW1ib2wgbmFtZScpO30KdmFyIHN5 bWJvbE5vZGU9dGhpcy5ub2RlRmFjdG9yeShpZCwic3ltYm9sIik7dmFyIG5vZGU9 dGhpcy5ub2RlRmFjdG9yeShudWxsLCJwb2x5Z29uIik7c3ltYm9sTm9kZS5hcHBl bmRDaGlsZChub2RlKTt2YXIgc3ltYm9sRXh0ZW50PW5ldyBPcGVuTGF5ZXJzLkJv dW5kcyhOdW1iZXIuTUFYX1ZBTFVFLE51bWJlci5NQVhfVkFMVUUsMCwwKTt2YXIg cG9pbnRzPVtdO3ZhciB4LHk7Zm9yKHZhciBpPTA7aTxzeW1ib2wubGVuZ3RoO2k9 aSsyKXt4PXN5bWJvbFtpXTt5PXN5bWJvbFtpKzFdO3N5bWJvbEV4dGVudC5sZWZ0 PU1hdGgubWluKHN5bWJvbEV4dGVudC5sZWZ0LHgpO3N5bWJvbEV4dGVudC5ib3R0 b209TWF0aC5taW4oc3ltYm9sRXh0ZW50LmJvdHRvbSx5KTtzeW1ib2xFeHRlbnQu cmlnaHQ9TWF0aC5tYXgoc3ltYm9sRXh0ZW50LnJpZ2h0LHgpO3N5bWJvbEV4dGVu dC50b3A9TWF0aC5tYXgoc3ltYm9sRXh0ZW50LnRvcCx5KTtwb2ludHMucHVzaCh4 LCIsIix5KTt9Cm5vZGUuc2V0QXR0cmlidXRlTlMobnVsbCwicG9pbnRzIixwb2lu dHMuam9pbigiICIpKTt2YXIgd2lkdGg9c3ltYm9sRXh0ZW50LmdldFdpZHRoKCk7 dmFyIGhlaWdodD1zeW1ib2xFeHRlbnQuZ2V0SGVpZ2h0KCk7dmFyIHZpZXdCb3g9 W3N5bWJvbEV4dGVudC5sZWZ0LXdpZHRoLHN5bWJvbEV4dGVudC5ib3R0b20taGVp Z2h0LHdpZHRoKjMsaGVpZ2h0KjNdO3N5bWJvbE5vZGUuc2V0QXR0cmlidXRlTlMo bnVsbCwidmlld0JveCIsdmlld0JveC5qb2luKCIgIikpO3RoaXMuc3ltYm9sTWV0 cmljc1tpZF09W01hdGgubWF4KHdpZHRoLGhlaWdodCksc3ltYm9sRXh0ZW50Lmdl dENlbnRlckxvbkxhdCgpLmxvbixzeW1ib2xFeHRlbnQuZ2V0Q2VudGVyTG9uTGF0 KCkubGF0XTt0aGlzLmRlZnMuYXBwZW5kQ2hpbGQoc3ltYm9sTm9kZSk7cmV0dXJu IHN5bWJvbE5vZGU7fSxnZXRGZWF0dXJlSWRGcm9tRXZlbnQ6ZnVuY3Rpb24oZXZ0 KXt2YXIgZmVhdHVyZUlkPU9wZW5MYXllcnMuUmVuZGVyZXIuRWxlbWVudHMucHJv dG90eXBlLmdldEZlYXR1cmVJZEZyb21FdmVudC5hcHBseSh0aGlzLGFyZ3VtZW50 cyk7aWYoIWZlYXR1cmVJZCl7dmFyIHRhcmdldD1ldnQudGFyZ2V0O2ZlYXR1cmVJ ZD10YXJnZXQucGFyZW50Tm9kZSYmdGFyZ2V0IT10aGlzLnJlbmRlcmVyUm9vdCYm dGFyZ2V0LnBhcmVudE5vZGUuX2ZlYXR1cmVJZDt9CnJldHVybiBmZWF0dXJlSWQ7 fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLlJlbmRlcmVyLlNWRyJ9KTtPcGVuTGF5 ZXJzLlJlbmRlcmVyLlNWRy5MQUJFTF9BTElHTj17ImwiOiJzdGFydCIsInIiOiJl bmQiLCJiIjoiYm90dG9tIiwidCI6ImhhbmdpbmcifTtPcGVuTGF5ZXJzLlJlbmRl cmVyLlNWRy5MQUJFTF9WU0hJRlQ9eyJ0IjoiLTcwJSIsImIiOiIwIn07T3Blbkxh eWVycy5SZW5kZXJlci5TVkcuTEFCRUxfVkZBQ1RPUj17InQiOjAsImIiOi0xfTtP cGVuTGF5ZXJzLlJlbmRlcmVyLlNWRy5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbihl KXtlLnByZXZlbnREZWZhdWx0JiZlLnByZXZlbnREZWZhdWx0KCk7fTtPcGVuTGF5 ZXJzLkZvcm1hdC5TTEQudjFfMF8wPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVy cy5Gb3JtYXQuU0xELnYxLHtWRVJTSU9OOiIxLjAuMCIsc2NoZW1hTG9jYXRpb246 Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvc2xkIGh0dHA6Ly9zY2hlbWFzLm9wZW5n aXMubmV0L3NsZC8xLjAuMC9TdHlsZWRMYXllckRlc2NyaXB0b3IueHNkIixpbml0 aWFsaXplOmZ1bmN0aW9uKG9wdGlvbnMpe09wZW5MYXllcnMuRm9ybWF0LlNMRC52 MS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7fSxD TEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5TTEQudjFfMF8wIn0pO09wZW5M YXllcnMuRm9ybWF0Lk9XU0NvbnRleHQ9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5 ZXJzLkZvcm1hdC5Db250ZXh0LHtkZWZhdWx0VmVyc2lvbjoiMC4zLjEiLGdldFZl cnNpb246ZnVuY3Rpb24ocm9vdCxvcHRpb25zKXt2YXIgdmVyc2lvbj1PcGVuTGF5 ZXJzLkZvcm1hdC5YTUwuVmVyc2lvbmVkT0dDLnByb3RvdHlwZS5nZXRWZXJzaW9u LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZih2ZXJzaW9uPT09IjAuMy4wIil7dmVy c2lvbj10aGlzLmRlZmF1bHRWZXJzaW9uO30KcmV0dXJuIHZlcnNpb247fSx0b0Nv bnRleHQ6ZnVuY3Rpb24ob2JqKXt2YXIgY29udGV4dD17fTtpZihvYmouQ0xBU1Nf TkFNRT09Ik9wZW5MYXllcnMuTWFwIil7Y29udGV4dC5ib3VuZHM9b2JqLmdldEV4 dGVudCgpO2NvbnRleHQubWF4RXh0ZW50PW9iai5tYXhFeHRlbnQ7Y29udGV4dC5w cm9qZWN0aW9uPW9iai5wcm9qZWN0aW9uO2NvbnRleHQuc2l6ZT1vYmouZ2V0U2l6 ZSgpO2NvbnRleHQubGF5ZXJzPW9iai5sYXllcnM7fQpyZXR1cm4gY29udGV4dDt9 LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0Lk9XU0NvbnRleHQifSk7T3Bl bkxheWVycy5Gb3JtYXQuT1dTQ29udGV4dC52MF8zXzE9T3BlbkxheWVycy5DbGFz cyhPcGVuTGF5ZXJzLkZvcm1hdC5YTUwse25hbWVzcGFjZXM6e293YzoiaHR0cDov L3d3dy5vcGVuZ2lzLm5ldC9vd3MtY29udGV4dCIsZ21sOiJodHRwOi8vd3d3Lm9w ZW5naXMubmV0L2dtbCIsa21sOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2ttbC8y LjIiLG9nYzoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9vZ2MiLG93czoiaHR0cDov L3d3dy5vcGVuZ2lzLm5ldC9vd3MiLHNsZDoiaHR0cDovL3d3dy5vcGVuZ2lzLm5l dC9zbGQiLHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4c2k6 Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIn0sVkVS U0lPTjoiMC4zLjEiLHNjaGVtYUxvY2F0aW9uOiJodHRwOi8vd3d3Lm9wZW5naXMu bmV0L293cy1jb250ZXh0IGh0dHA6Ly93d3cub2djbmV0d29yay5uZXQvc2NoZW1h cy9vd2MvMC4zLjEvb3dzQ29udGV4dC54c2QiLGRlZmF1bHRQcmVmaXg6Im93YyIs ZXh0cmFjdEF0dHJpYnV0ZXM6dHJ1ZSx4eTp0cnVlLHJlZ0V4ZXM6e3RyaW1TcGFj ZTooL15ccyp8XHMqJC9nKSxyZW1vdmVTcGFjZTooL1xzKi9nKSxzcGxpdFNwYWNl OigvXHMrLyksdHJpbUNvbW1hOigvXHMqLFxzKi9nKX0sZmVhdHVyZU5TOiJodHRw Oi8vbWFwc2VydmVyLmdpcy51bW4uZWR1L21hcHNlcnZlciIsZmVhdHVyZVR5cGU6 J3ZlY3RvcicsZ2VvbWV0cnlOYW1lOidnZW9tZXRyeScsbmVzdGluZ0xheWVyTG9v a3VwOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXtPcGVuTGF5ZXJz LkZvcm1hdC5YTUwucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxbb3B0 aW9uc10pO09wZW5MYXllcnMuRm9ybWF0LkdNTC52Mi5wcm90b3R5cGUuc2V0R2Vv bWV0cnlUeXBlcy5jYWxsKHRoaXMpO30sc2V0TmVzdGluZ1BhdGg6ZnVuY3Rpb24o bCl7aWYobC5sYXllcnNDb250ZXh0KXtmb3IodmFyIGk9MCxsZW49bC5sYXllcnND b250ZXh0Lmxlbmd0aDtpPGxlbjtpKyspe3ZhciBsYXllckNvbnRleHQ9bC5sYXll cnNDb250ZXh0W2ldO3ZhciBuUGF0aD1bXTt2YXIgblRpdGxlPWwudGl0bGV8fCIi O2lmKGwubWV0YWRhdGEmJmwubWV0YWRhdGEubmVzdGluZ1BhdGgpe25QYXRoPWwu bWV0YWRhdGEubmVzdGluZ1BhdGguc2xpY2UoKTt9CmlmKG5UaXRsZSE9IiIpe25Q YXRoLnB1c2goblRpdGxlKTt9CmxheWVyQ29udGV4dC5tZXRhZGF0YS5uZXN0aW5n UGF0aD1uUGF0aDtpZihsYXllckNvbnRleHQubGF5ZXJzQ29udGV4dCl7dGhpcy5z ZXROZXN0aW5nUGF0aChsYXllckNvbnRleHQpO319fX0sZGVjb21wb3NlTmVzdGlu Z1BhdGg6ZnVuY3Rpb24oblBhdGgpe3ZhciBhPVtdO2lmKE9wZW5MYXllcnMuVXRp bC5pc0FycmF5KG5QYXRoKSl7dmFyIHBhdGg9blBhdGguc2xpY2UoKTt3aGlsZShw YXRoLmxlbmd0aD4wKXthLnB1c2gocGF0aC5zbGljZSgpKTtwYXRoLnBvcCgpO30K YS5yZXZlcnNlKCk7fQpyZXR1cm4gYTt9LHJlYWQ6ZnVuY3Rpb24oZGF0YSl7aWYo dHlwZW9mIGRhdGE9PSJzdHJpbmciKXtkYXRhPU9wZW5MYXllcnMuRm9ybWF0LlhN TC5wcm90b3R5cGUucmVhZC5hcHBseSh0aGlzLFtkYXRhXSk7fQppZihkYXRhJiZk YXRhLm5vZGVUeXBlPT05KXtkYXRhPWRhdGEuZG9jdW1lbnRFbGVtZW50O30KdmFy IGNvbnRleHQ9e307dGhpcy5yZWFkTm9kZShkYXRhLGNvbnRleHQpO3RoaXMuc2V0 TmVzdGluZ1BhdGgoe2xheWVyc0NvbnRleHQ6Y29udGV4dC5sYXllcnNDb250ZXh0 fSk7dmFyIGxheWVycz1bXTt0aGlzLnByb2Nlc3NMYXllcihsYXllcnMsY29udGV4 dCk7ZGVsZXRlIGNvbnRleHQubGF5ZXJzQ29udGV4dDtjb250ZXh0LmxheWVyc0Nv bnRleHQ9bGF5ZXJzO3JldHVybiBjb250ZXh0O30scHJvY2Vzc0xheWVyOmZ1bmN0 aW9uKGxheWVyQXJyYXksbGF5ZXIpe2lmKGxheWVyLmxheWVyc0NvbnRleHQpe2Zv cih2YXIgaT0wLGxlbj1sYXllci5sYXllcnNDb250ZXh0Lmxlbmd0aDtpPGxlbjtp Kyspe3ZhciBsPWxheWVyLmxheWVyc0NvbnRleHRbaV07bGF5ZXJBcnJheS5wdXNo KGwpO2lmKGwubGF5ZXJzQ29udGV4dCl7dGhpcy5wcm9jZXNzTGF5ZXIobGF5ZXJB cnJheSxsKTt9fX19LHdyaXRlOmZ1bmN0aW9uKGNvbnRleHQsb3B0aW9ucyl7dmFy IG5hbWU9Ik9XU0NvbnRleHQiO3RoaXMubmVzdGluZ0xheWVyTG9va3VwPXt9O29w dGlvbnM9b3B0aW9uc3x8e307T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMo b3B0aW9ucyxjb250ZXh0KTt2YXIgcm9vdD10aGlzLndyaXRlTm9kZShuYW1lLG9w dGlvbnMpO3RoaXMubmVzdGluZ0xheWVyTG9va3VwPW51bGw7dGhpcy5zZXRBdHRy aWJ1dGVOUyhyb290LHRoaXMubmFtZXNwYWNlc1sieHNpIl0sInhzaTpzY2hlbWFM b2NhdGlvbiIsdGhpcy5zY2hlbWFMb2NhdGlvbik7cmV0dXJuIE9wZW5MYXllcnMu Rm9ybWF0LlhNTC5wcm90b3R5cGUud3JpdGUuYXBwbHkodGhpcyxbcm9vdF0pO30s cmVhZGVyczp7ImttbCI6eyJEb2N1bWVudCI6ZnVuY3Rpb24obm9kZSxvYmope29i ai5mZWF0dXJlcz1uZXcgT3BlbkxheWVycy5Gb3JtYXQuS01MKHtrbWxuczp0aGlz Lm5hbWVzcGFjZXMua21sLGV4dHJhY3RTdHlsZXM6dHJ1ZX0pLnJlYWQobm9kZSk7 fX0sIm93YyI6eyJPV1NDb250ZXh0IjpmdW5jdGlvbihub2RlLG9iail7dGhpcy5y ZWFkQ2hpbGROb2Rlcyhub2RlLG9iaik7fSwiR2VuZXJhbCI6ZnVuY3Rpb24obm9k ZSxvYmope3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxvYmopO30sIlJlc291cmNl TGlzdCI6ZnVuY3Rpb24obm9kZSxvYmope3RoaXMucmVhZENoaWxkTm9kZXMobm9k ZSxvYmopO30sIkxheWVyIjpmdW5jdGlvbihub2RlLG9iail7dmFyIGxheWVyQ29u dGV4dD17bWV0YWRhdGE6e30sdmlzaWJpbGl0eToobm9kZS5nZXRBdHRyaWJ1dGUo ImhpZGRlbiIpIT0iMSIpLHF1ZXJ5YWJsZToobm9kZS5nZXRBdHRyaWJ1dGUoInF1 ZXJ5YWJsZSIpPT0iMSIpLG9wYWNpdHk6KChub2RlLmdldEF0dHJpYnV0ZSgib3Bh Y2l0eSIpIT1udWxsKT9wYXJzZUZsb2F0KG5vZGUuZ2V0QXR0cmlidXRlKCJvcGFj aXR5IikpOm51bGwpLG5hbWU6bm9kZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSxjYXRl Z29yeUxheWVyOihub2RlLmdldEF0dHJpYnV0ZSgibmFtZSIpPT1udWxsKSxmb3Jt YXRzOltdLHN0eWxlczpbXX07aWYoIW9iai5sYXllcnNDb250ZXh0KXtvYmoubGF5 ZXJzQ29udGV4dD1bXTt9Cm9iai5sYXllcnNDb250ZXh0LnB1c2gobGF5ZXJDb250 ZXh0KTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsbGF5ZXJDb250ZXh0KTt9LCJJ bmxpbmVHZW9tZXRyeSI6ZnVuY3Rpb24obm9kZSxvYmope29iai5mZWF0dXJlcz1b XTt2YXIgZWxlbWVudHM9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5vZGUs dGhpcy5uYW1lc3BhY2VzLmdtbCwiZmVhdHVyZU1lbWJlciIpO3ZhciBlbDtpZihl bGVtZW50cy5sZW5ndGg+PTEpe2VsPWVsZW1lbnRzWzBdO30KaWYoZWwmJmVsLmZp cnN0Q2hpbGQpe3ZhciBmZWF0dXJlbm9kZT0oZWwuZmlyc3RDaGlsZC5uZXh0U2li bGluZyk/ZWwuZmlyc3RDaGlsZC5uZXh0U2libGluZzplbC5maXJzdENoaWxkO3Ro aXMuc2V0TmFtZXNwYWNlKCJmZWF0dXJlIixmZWF0dXJlbm9kZS5uYW1lc3BhY2VV UkkpO3RoaXMuZmVhdHVyZVR5cGU9ZmVhdHVyZW5vZGUubG9jYWxOYW1lfHxmZWF0 dXJlbm9kZS5ub2RlTmFtZS5zcGxpdCgiOiIpLnBvcCgpO3RoaXMucmVhZENoaWxk Tm9kZXMobm9kZSxvYmopO319LCJTZXJ2ZXIiOmZ1bmN0aW9uKG5vZGUsb2JqKXtp ZigoIW9iai5zZXJ2aWNlJiYhb2JqLnZlcnNpb24pfHwob2JqLnNlcnZpY2UhPU9w ZW5MYXllcnMuRm9ybWF0LkNvbnRleHQuc2VydmljZVR5cGVzLldNUykpe29iai5z ZXJ2aWNlPW5vZGUuZ2V0QXR0cmlidXRlKCJzZXJ2aWNlIik7b2JqLnZlcnNpb249 bm9kZS5nZXRBdHRyaWJ1dGUoInZlcnNpb24iKTt0aGlzLnJlYWRDaGlsZE5vZGVz KG5vZGUsb2JqKTt9fSwiTmFtZSI6ZnVuY3Rpb24obm9kZSxvYmope29iai5uYW1l PXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5v ZGUsb2JqKTt9LCJUaXRsZSI6ZnVuY3Rpb24obm9kZSxvYmope29iai50aXRsZT10 aGlzLmdldENoaWxkVmFsdWUobm9kZSk7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2Rl LG9iaik7fSwiU3R5bGVMaXN0IjpmdW5jdGlvbihub2RlLG9iail7dGhpcy5yZWFk Q2hpbGROb2Rlcyhub2RlLG9iai5zdHlsZXMpO30sIlN0eWxlIjpmdW5jdGlvbihu b2RlLG9iail7dmFyIHN0eWxlPXt9O29iai5wdXNoKHN0eWxlKTt0aGlzLnJlYWRD aGlsZE5vZGVzKG5vZGUsc3R5bGUpO30sIkxlZ2VuZFVSTCI6ZnVuY3Rpb24obm9k ZSxvYmope3ZhciBsZWdlbmQ9e307b2JqLmxlZ2VuZD1sZWdlbmQ7dGhpcy5yZWFk Q2hpbGROb2Rlcyhub2RlLGxlZ2VuZCk7fSwiT25saW5lUmVzb3VyY2UiOmZ1bmN0 aW9uKG5vZGUsb2JqKXtvYmoudXJsPXRoaXMuZ2V0QXR0cmlidXRlTlMobm9kZSx0 aGlzLm5hbWVzcGFjZXMueGxpbmssImhyZWYiKTt0aGlzLnJlYWRDaGlsZE5vZGVz KG5vZGUsb2JqKTt9fSwib3dzIjpPcGVuTGF5ZXJzLkZvcm1hdC5PV1NDb21tb24u djFfMF8wLnByb3RvdHlwZS5yZWFkZXJzLm93cywiZ21sIjpPcGVuTGF5ZXJzLkZv cm1hdC5HTUwudjIucHJvdG90eXBlLnJlYWRlcnMuZ21sLCJzbGQiOk9wZW5MYXll cnMuRm9ybWF0LlNMRC52MV8wXzAucHJvdG90eXBlLnJlYWRlcnMuc2xkLCJmZWF0 dXJlIjpPcGVuTGF5ZXJzLkZvcm1hdC5HTUwudjIucHJvdG90eXBlLnJlYWRlcnMu ZmVhdHVyZX0sd3JpdGVyczp7Im93YyI6eyJPV1NDb250ZXh0IjpmdW5jdGlvbihv cHRpb25zKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIk9XU0Nv bnRleHQiLHthdHRyaWJ1dGVzOnt2ZXJzaW9uOnRoaXMuVkVSU0lPTixpZDpvcHRp b25zLmlkfHxPcGVuTGF5ZXJzLlV0aWwuY3JlYXRlVW5pcXVlSUQoIk9wZW5MYXll cnNfT1dTQ29udGV4dF8iKX19KTt0aGlzLndyaXRlTm9kZSgiR2VuZXJhbCIsb3B0 aW9ucyxub2RlKTt0aGlzLndyaXRlTm9kZSgiUmVzb3VyY2VMaXN0IixvcHRpb25z LG5vZGUpO3JldHVybiBub2RlO30sIkdlbmVyYWwiOmZ1bmN0aW9uKG9wdGlvbnMp e3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygiR2VuZXJhbCIpO3Ro aXMud3JpdGVOb2RlKCJvd3M6Qm91bmRpbmdCb3giLG9wdGlvbnMsbm9kZSk7dGhp cy53cml0ZU5vZGUoIm93czpUaXRsZSIsb3B0aW9ucy50aXRsZXx8J09wZW5MYXll cnMgT1dTQ29udGV4dCcsbm9kZSk7cmV0dXJuIG5vZGU7fSwiUmVzb3VyY2VMaXN0 IjpmdW5jdGlvbihvcHRpb25zKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnRO U1BsdXMoIlJlc291cmNlTGlzdCIpO2Zvcih2YXIgaT0wLGxlbj1vcHRpb25zLmxh eWVycy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgbGF5ZXI9b3B0aW9ucy5sYXllcnNb aV07dmFyIGRlY29tcG9zZWRQYXRoPXRoaXMuZGVjb21wb3NlTmVzdGluZ1BhdGgo bGF5ZXIubWV0YWRhdGEubmVzdGluZ1BhdGgpO3RoaXMud3JpdGVOb2RlKCJfTGF5 ZXIiLHtsYXllcjpsYXllcixzdWJQYXRoczpkZWNvbXBvc2VkUGF0aH0sbm9kZSk7 fQpyZXR1cm4gbm9kZTt9LCJTZXJ2ZXIiOmZ1bmN0aW9uKG9wdGlvbnMpe3ZhciBu b2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygiU2VydmVyIix7YXR0cmlidXRl czp7dmVyc2lvbjpvcHRpb25zLnZlcnNpb24sc2VydmljZTpvcHRpb25zLnNlcnZp Y2V9fSk7dGhpcy53cml0ZU5vZGUoIk9ubGluZVJlc291cmNlIixvcHRpb25zLG5v ZGUpO3JldHVybiBub2RlO30sIk9ubGluZVJlc291cmNlIjpmdW5jdGlvbihvcHRp b25zKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIk9ubGluZVJl c291cmNlIix7YXR0cmlidXRlczp7InhsaW5rOmhyZWYiOm9wdGlvbnMudXJsfX0p O3JldHVybiBub2RlO30sIklubGluZUdlb21ldHJ5IjpmdW5jdGlvbihsYXllcil7 dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJJbmxpbmVHZW9tZXRy eSIpO3RoaXMud3JpdGVOb2RlKCJnbWw6Ym91bmRlZEJ5IixsYXllci5nZXREYXRh RXh0ZW50KCksbm9kZSk7Zm9yKHZhciBpPTAsbGVuPWxheWVyLmZlYXR1cmVzLmxl bmd0aDtpPGxlbjtpKyspe3RoaXMud3JpdGVOb2RlKCJnbWw6ZmVhdHVyZU1lbWJl ciIsbGF5ZXIuZmVhdHVyZXNbaV0sbm9kZSk7fQpyZXR1cm4gbm9kZTt9LCJTdHls ZUxpc3QiOmZ1bmN0aW9uKHN0eWxlcyl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVt ZW50TlNQbHVzKCJTdHlsZUxpc3QiKTtmb3IodmFyIGk9MCxsZW49c3R5bGVzLmxl bmd0aDtpPGxlbjtpKyspe3RoaXMud3JpdGVOb2RlKCJTdHlsZSIsc3R5bGVzW2ld LG5vZGUpO30KcmV0dXJuIG5vZGU7fSwiU3R5bGUiOmZ1bmN0aW9uKHN0eWxlKXt2 YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIlN0eWxlIik7dGhpcy53 cml0ZU5vZGUoIk5hbWUiLHN0eWxlLG5vZGUpO3RoaXMud3JpdGVOb2RlKCJUaXRs ZSIsc3R5bGUsbm9kZSk7aWYoc3R5bGUubGVnZW5kKXt0aGlzLndyaXRlTm9kZSgi TGVnZW5kVVJMIixzdHlsZSxub2RlKTt9CnJldHVybiBub2RlO30sIk5hbWUiOmZ1 bmN0aW9uKG9iail7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJO YW1lIix7dmFsdWU6b2JqLm5hbWV9KTtyZXR1cm4gbm9kZTt9LCJUaXRsZSI6ZnVu Y3Rpb24ob2JqKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIlRp dGxlIix7dmFsdWU6b2JqLnRpdGxlfSk7cmV0dXJuIG5vZGU7fSwiTGVnZW5kVVJM IjpmdW5jdGlvbihzdHlsZSl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQ bHVzKCJMZWdlbmRVUkwiKTt0aGlzLndyaXRlTm9kZSgiT25saW5lUmVzb3VyY2Ui LHN0eWxlLmxlZ2VuZCxub2RlKTtyZXR1cm4gbm9kZTt9LCJfV01TIjpmdW5jdGlv bihsYXllcil7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJMYXll ciIse2F0dHJpYnV0ZXM6e25hbWU6bGF5ZXIucGFyYW1zLkxBWUVSUyxxdWVyeWFi bGU6bGF5ZXIucXVlcnlhYmxlPyIxIjoiMCIsaGlkZGVuOmxheWVyLnZpc2liaWxp dHk/IjAiOiIxIixvcGFjaXR5OmxheWVyLm9wYWNpdHk/bGF5ZXIub3BhY2l0eTpu dWxsfX0pO3RoaXMud3JpdGVOb2RlKCJvd3M6VGl0bGUiLGxheWVyLm5hbWUsbm9k ZSk7dGhpcy53cml0ZU5vZGUoIm93czpPdXRwdXRGb3JtYXQiLGxheWVyLnBhcmFt cy5GT1JNQVQsbm9kZSk7dGhpcy53cml0ZU5vZGUoIlNlcnZlciIse3NlcnZpY2U6 T3BlbkxheWVycy5Gb3JtYXQuQ29udGV4dC5zZXJ2aWNlVHlwZXMuV01TLHZlcnNp b246bGF5ZXIucGFyYW1zLlZFUlNJT04sdXJsOmxheWVyLnVybH0sbm9kZSk7aWYo bGF5ZXIubWV0YWRhdGEuc3R5bGVzJiZsYXllci5tZXRhZGF0YS5zdHlsZXMubGVu Z3RoPjApe3RoaXMud3JpdGVOb2RlKCJTdHlsZUxpc3QiLGxheWVyLm1ldGFkYXRh LnN0eWxlcyxub2RlKTt9CnJldHVybiBub2RlO30sIl9MYXllciI6ZnVuY3Rpb24o b3B0aW9ucyl7dmFyIGxheWVyLHN1YlBhdGhzLG5vZGUsdGl0bGU7bGF5ZXI9b3B0 aW9ucy5sYXllcjtzdWJQYXRocz1vcHRpb25zLnN1YlBhdGhzO25vZGU9bnVsbDt0 aXRsZT1udWxsO2lmKHN1YlBhdGhzLmxlbmd0aD4wKXt2YXIgcGF0aD1zdWJQYXRo c1swXS5qb2luKCIvIik7dmFyIGluZGV4PXBhdGgubGFzdEluZGV4T2YoIi8iKTtu b2RlPXRoaXMubmVzdGluZ0xheWVyTG9va3VwW3BhdGhdO3RpdGxlPShpbmRleD4w KT9wYXRoLnN1YnN0cmluZyhpbmRleCsxLHBhdGgubGVuZ3RoKTpwYXRoO2lmKCFu b2RlKXtub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygiTGF5ZXIiKTt0aGlz LndyaXRlTm9kZSgib3dzOlRpdGxlIix0aXRsZSxub2RlKTt0aGlzLm5lc3RpbmdM YXllckxvb2t1cFtwYXRoXT1ub2RlO30Kb3B0aW9ucy5zdWJQYXRocy5zaGlmdCgp O3RoaXMud3JpdGVOb2RlKCJfTGF5ZXIiLG9wdGlvbnMsbm9kZSk7cmV0dXJuIG5v ZGU7fWVsc2V7aWYobGF5ZXIgaW5zdGFuY2VvZiBPcGVuTGF5ZXJzLkxheWVyLldN Uyl7bm9kZT10aGlzLndyaXRlTm9kZSgiX1dNUyIsbGF5ZXIpO31lbHNlIGlmKGxh eWVyIGluc3RhbmNlb2YgT3BlbkxheWVycy5MYXllci5WZWN0b3Ipe2lmKGxheWVy LnByb3RvY29sIGluc3RhbmNlb2YgT3BlbkxheWVycy5Qcm90b2NvbC5XRlMudjEp e25vZGU9dGhpcy53cml0ZU5vZGUoIl9XRlMiLGxheWVyKTt9ZWxzZSBpZihsYXll ci5wcm90b2NvbCBpbnN0YW5jZW9mIE9wZW5MYXllcnMuUHJvdG9jb2wuSFRUUCl7 aWYobGF5ZXIucHJvdG9jb2wuZm9ybWF0IGluc3RhbmNlb2YgT3BlbkxheWVycy5G b3JtYXQuR01MKXtsYXllci5wcm90b2NvbC5mb3JtYXQudmVyc2lvbj0iMi4xLjIi O25vZGU9dGhpcy53cml0ZU5vZGUoIl9HTUwiLGxheWVyKTt9ZWxzZSBpZihsYXll ci5wcm90b2NvbC5mb3JtYXQgaW5zdGFuY2VvZiBPcGVuTGF5ZXJzLkZvcm1hdC5L TUwpe2xheWVyLnByb3RvY29sLmZvcm1hdC52ZXJzaW9uPSIyLjIiO25vZGU9dGhp cy53cml0ZU5vZGUoIl9LTUwiLGxheWVyKTt9fWVsc2V7dGhpcy5zZXROYW1lc3Bh Y2UoImZlYXR1cmUiLHRoaXMuZmVhdHVyZU5TKTtub2RlPXRoaXMud3JpdGVOb2Rl KCJfSW5saW5lR2VvbWV0cnkiLGxheWVyKTt9fQppZihsYXllci5vcHRpb25zLm1h eFNjYWxlKXt0aGlzLndyaXRlTm9kZSgic2xkOk1pblNjYWxlRGVub21pbmF0b3Ii LGxheWVyLm9wdGlvbnMubWF4U2NhbGUsbm9kZSk7fQppZihsYXllci5vcHRpb25z Lm1pblNjYWxlKXt0aGlzLndyaXRlTm9kZSgic2xkOk1heFNjYWxlRGVub21pbmF0 b3IiLGxheWVyLm9wdGlvbnMubWluU2NhbGUsbm9kZSk7fQp0aGlzLm5lc3RpbmdM YXllckxvb2t1cFtsYXllci5uYW1lXT1ub2RlO3JldHVybiBub2RlO319LCJfV0ZT IjpmdW5jdGlvbihsYXllcil7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQ bHVzKCJMYXllciIse2F0dHJpYnV0ZXM6e25hbWU6bGF5ZXIucHJvdG9jb2wuZmVh dHVyZVByZWZpeCsiOiIrbGF5ZXIucHJvdG9jb2wuZmVhdHVyZVR5cGUsaGlkZGVu OmxheWVyLnZpc2liaWxpdHk/IjAiOiIxIn19KTt0aGlzLndyaXRlTm9kZSgib3dz OlRpdGxlIixsYXllci5uYW1lLG5vZGUpO3RoaXMud3JpdGVOb2RlKCJTZXJ2ZXIi LHtzZXJ2aWNlOk9wZW5MYXllcnMuRm9ybWF0LkNvbnRleHQuc2VydmljZVR5cGVz LldGUyx2ZXJzaW9uOmxheWVyLnByb3RvY29sLnZlcnNpb24sdXJsOmxheWVyLnBy b3RvY29sLnVybH0sbm9kZSk7cmV0dXJuIG5vZGU7fSwiX0lubGluZUdlb21ldHJ5 IjpmdW5jdGlvbihsYXllcil7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQ bHVzKCJMYXllciIse2F0dHJpYnV0ZXM6e25hbWU6dGhpcy5mZWF0dXJlVHlwZSxo aWRkZW46bGF5ZXIudmlzaWJpbGl0eT8iMCI6IjEifX0pO3RoaXMud3JpdGVOb2Rl KCJvd3M6VGl0bGUiLGxheWVyLm5hbWUsbm9kZSk7dGhpcy53cml0ZU5vZGUoIklu bGluZUdlb21ldHJ5IixsYXllcixub2RlKTtyZXR1cm4gbm9kZTt9LCJfR01MIjpm dW5jdGlvbihsYXllcil7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVz KCJMYXllciIpO3RoaXMud3JpdGVOb2RlKCJvd3M6VGl0bGUiLGxheWVyLm5hbWUs bm9kZSk7dGhpcy53cml0ZU5vZGUoIlNlcnZlciIse3NlcnZpY2U6T3BlbkxheWVy cy5Gb3JtYXQuQ29udGV4dC5zZXJ2aWNlVHlwZXMuR01MLHVybDpsYXllci5wcm90 b2NvbC51cmwsdmVyc2lvbjpsYXllci5wcm90b2NvbC5mb3JtYXQudmVyc2lvbn0s bm9kZSk7cmV0dXJuIG5vZGU7fSwiX0tNTCI6ZnVuY3Rpb24obGF5ZXIpe3ZhciBu b2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygiTGF5ZXIiKTt0aGlzLndyaXRl Tm9kZSgib3dzOlRpdGxlIixsYXllci5uYW1lLG5vZGUpO3RoaXMud3JpdGVOb2Rl KCJTZXJ2ZXIiLHtzZXJ2aWNlOk9wZW5MYXllcnMuRm9ybWF0LkNvbnRleHQuc2Vy dmljZVR5cGVzLktNTCx2ZXJzaW9uOmxheWVyLnByb3RvY29sLmZvcm1hdC52ZXJz aW9uLHVybDpsYXllci5wcm90b2NvbC51cmx9LG5vZGUpO3JldHVybiBub2RlO319 LCJnbWwiOk9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKHsiYm91bmRlZEJ5 IjpmdW5jdGlvbihib3VuZHMpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5T UGx1cygiZ21sOmJvdW5kZWRCeSIpO3RoaXMud3JpdGVOb2RlKCJnbWw6Qm94Iixi b3VuZHMsbm9kZSk7cmV0dXJuIG5vZGU7fX0sT3BlbkxheWVycy5Gb3JtYXQuR01M LnYyLnByb3RvdHlwZS53cml0ZXJzLmdtbCksIm93cyI6T3BlbkxheWVycy5Gb3Jt YXQuT1dTQ29tbW9uLnYxXzBfMC5wcm90b3R5cGUud3JpdGVycy5vd3MsInNsZCI6 T3BlbkxheWVycy5Gb3JtYXQuU0xELnYxXzBfMC5wcm90b3R5cGUud3JpdGVycy5z bGQsImZlYXR1cmUiOk9wZW5MYXllcnMuRm9ybWF0LkdNTC52Mi5wcm90b3R5cGUu d3JpdGVycy5mZWF0dXJlfSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5P V1NDb250ZXh0LnYwXzNfMSJ9KTtPcGVuTGF5ZXJzLkNvbnRyb2wuU2NhbGVMaW5l PU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Db250cm9sLHttYXhXaWR0aDox MDAsdG9wT3V0VW5pdHM6ImttIix0b3BJblVuaXRzOiJtIixib3R0b21PdXRVbml0 czoibWkiLGJvdHRvbUluVW5pdHM6ImZ0IixlVG9wOm51bGwsZUJvdHRvbTpudWxs LGdlb2Rlc2ljOmZhbHNlLGRyYXc6ZnVuY3Rpb24oKXtPcGVuTGF5ZXJzLkNvbnRy b2wucHJvdG90eXBlLmRyYXcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlz LmVUb3Ape3RoaXMuZVRvcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0 aGlzLmVUb3AuY2xhc3NOYW1lPXRoaXMuZGlzcGxheUNsYXNzKyJUb3AiO3ZhciB0 aGVMZW49dGhpcy50b3BJblVuaXRzLmxlbmd0aDt0aGlzLmRpdi5hcHBlbmRDaGls ZCh0aGlzLmVUb3ApO2lmKCh0aGlzLnRvcE91dFVuaXRzPT0iIil8fCh0aGlzLnRv cEluVW5pdHM9PSIiKSl7dGhpcy5lVG9wLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRl biI7fWVsc2V7dGhpcy5lVG9wLnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiO30K dGhpcy5lQm90dG9tPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMu ZUJvdHRvbS5jbGFzc05hbWU9dGhpcy5kaXNwbGF5Q2xhc3MrIkJvdHRvbSI7dGhp cy5kaXYuYXBwZW5kQ2hpbGQodGhpcy5lQm90dG9tKTtpZigodGhpcy5ib3R0b21P dXRVbml0cz09IiIpfHwodGhpcy5ib3R0b21JblVuaXRzPT0iIikpe3RoaXMuZUJv dHRvbS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO31lbHNle3RoaXMuZUJvdHRv bS5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIjt9fQp0aGlzLm1hcC5ldmVudHMu cmVnaXN0ZXIoJ21vdmVlbmQnLHRoaXMsdGhpcy51cGRhdGUpO3RoaXMudXBkYXRl KCk7cmV0dXJuIHRoaXMuZGl2O30sZ2V0QmFyTGVuOmZ1bmN0aW9uKG1heExlbil7 dmFyIGRpZ2l0cz1wYXJzZUludChNYXRoLmxvZyhtYXhMZW4pL01hdGgubG9nKDEw KSk7dmFyIHBvdzEwPU1hdGgucG93KDEwLGRpZ2l0cyk7dmFyIGZpcnN0Q2hhcj1w YXJzZUludChtYXhMZW4vcG93MTApO3ZhciBiYXJMZW47aWYoZmlyc3RDaGFyPjUp e2Jhckxlbj01O31lbHNlIGlmKGZpcnN0Q2hhcj4yKXtiYXJMZW49Mjt9ZWxzZXti YXJMZW49MTt9CnJldHVybiBiYXJMZW4qcG93MTA7fSx1cGRhdGU6ZnVuY3Rpb24o KXt2YXIgcmVzPXRoaXMubWFwLmdldFJlc29sdXRpb24oKTtpZighcmVzKXtyZXR1 cm47fQp2YXIgY3VyTWFwVW5pdHM9dGhpcy5tYXAuZ2V0VW5pdHMoKTt2YXIgaW5j aGVzPU9wZW5MYXllcnMuSU5DSEVTX1BFUl9VTklUO3ZhciBtYXhTaXplRGF0YT10 aGlzLm1heFdpZHRoKnJlcyppbmNoZXNbY3VyTWFwVW5pdHNdO3ZhciBnZW9kZXNp Y1JhdGlvPTE7aWYodGhpcy5nZW9kZXNpYz09PXRydWUpe3ZhciBtYXhTaXplR2Vv ZGVzaWM9KHRoaXMubWFwLmdldEdlb2Rlc2ljUGl4ZWxTaXplKCkud3x8MC4wMDAw MDEpKnRoaXMubWF4V2lkdGg7dmFyIG1heFNpemVLaWxvbWV0ZXJzPW1heFNpemVE YXRhL2luY2hlc1sia20iXTtnZW9kZXNpY1JhdGlvPW1heFNpemVHZW9kZXNpYy9t YXhTaXplS2lsb21ldGVyczttYXhTaXplRGF0YSo9Z2VvZGVzaWNSYXRpbzt9CnZh ciB0b3BVbml0czt2YXIgYm90dG9tVW5pdHM7aWYobWF4U2l6ZURhdGE+MTAwMDAw KXt0b3BVbml0cz10aGlzLnRvcE91dFVuaXRzO2JvdHRvbVVuaXRzPXRoaXMuYm90 dG9tT3V0VW5pdHM7fWVsc2V7dG9wVW5pdHM9dGhpcy50b3BJblVuaXRzO2JvdHRv bVVuaXRzPXRoaXMuYm90dG9tSW5Vbml0czt9CnZhciB0b3BNYXg9bWF4U2l6ZURh dGEvaW5jaGVzW3RvcFVuaXRzXTt2YXIgYm90dG9tTWF4PW1heFNpemVEYXRhL2lu Y2hlc1tib3R0b21Vbml0c107dmFyIHRvcFJvdW5kZWQ9dGhpcy5nZXRCYXJMZW4o dG9wTWF4KTt2YXIgYm90dG9tUm91bmRlZD10aGlzLmdldEJhckxlbihib3R0b21N YXgpO3RvcE1heD10b3BSb3VuZGVkL2luY2hlc1tjdXJNYXBVbml0c10qaW5jaGVz W3RvcFVuaXRzXTtib3R0b21NYXg9Ym90dG9tUm91bmRlZC9pbmNoZXNbY3VyTWFw VW5pdHNdKmluY2hlc1tib3R0b21Vbml0c107dmFyIHRvcFB4PXRvcE1heC9yZXMv Z2VvZGVzaWNSYXRpbzt2YXIgYm90dG9tUHg9Ym90dG9tTWF4L3Jlcy9nZW9kZXNp Y1JhdGlvO2lmKHRoaXMuZUJvdHRvbS5zdHlsZS52aXNpYmlsaXR5PT0idmlzaWJs ZSIpe3RoaXMuZUJvdHRvbS5zdHlsZS53aWR0aD1NYXRoLnJvdW5kKGJvdHRvbVB4 KSsicHgiO3RoaXMuZUJvdHRvbS5pbm5lckhUTUw9Ym90dG9tUm91bmRlZCsiICIr Ym90dG9tVW5pdHM7fQppZih0aGlzLmVUb3Auc3R5bGUudmlzaWJpbGl0eT09InZp c2libGUiKXt0aGlzLmVUb3Auc3R5bGUud2lkdGg9TWF0aC5yb3VuZCh0b3BQeCkr InB4Ijt0aGlzLmVUb3AuaW5uZXJIVE1MPXRvcFJvdW5kZWQrIiAiK3RvcFVuaXRz O319LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuQ29udHJvbC5TY2FsZUxpbmUifSk7 T3BlbkxheWVycy5JY29uPU9wZW5MYXllcnMuQ2xhc3Moe3VybDpudWxsLHNpemU6 bnVsbCxvZmZzZXQ6bnVsbCxjYWxjdWxhdGVPZmZzZXQ6bnVsbCxpbWFnZURpdjpu dWxsLHB4Om51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbih1cmwsc2l6ZSxvZmZzZXQs Y2FsY3VsYXRlT2Zmc2V0KXt0aGlzLnVybD11cmw7dGhpcy5zaXplPShzaXplKT9z aXplOm5ldyBPcGVuTGF5ZXJzLlNpemUoMjAsMjApO3RoaXMub2Zmc2V0PW9mZnNl dD9vZmZzZXQ6bmV3IE9wZW5MYXllcnMuUGl4ZWwoLSh0aGlzLnNpemUudy8yKSwt KHRoaXMuc2l6ZS5oLzIpKTt0aGlzLmNhbGN1bGF0ZU9mZnNldD1jYWxjdWxhdGVP ZmZzZXQ7dmFyIGlkPU9wZW5MYXllcnMuVXRpbC5jcmVhdGVVbmlxdWVJRCgiT0xf SWNvbl8iKTt0aGlzLmltYWdlRGl2PU9wZW5MYXllcnMuVXRpbC5jcmVhdGVBbHBo YUltYWdlRGl2KGlkKTt9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVyYXNlKCk7 T3BlbkxheWVycy5FdmVudC5zdG9wT2JzZXJ2aW5nRWxlbWVudCh0aGlzLmltYWdl RGl2LmZpcnN0Q2hpbGQpO3RoaXMuaW1hZ2VEaXYuaW5uZXJIVE1MPSIiO3RoaXMu aW1hZ2VEaXY9bnVsbDt9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBPcGVu TGF5ZXJzLkljb24odGhpcy51cmwsdGhpcy5zaXplLHRoaXMub2Zmc2V0LHRoaXMu Y2FsY3VsYXRlT2Zmc2V0KTt9LHNldFNpemU6ZnVuY3Rpb24oc2l6ZSl7aWYoc2l6 ZSE9bnVsbCl7dGhpcy5zaXplPXNpemU7fQp0aGlzLmRyYXcoKTt9LHNldFVybDpm dW5jdGlvbih1cmwpe2lmKHVybCE9bnVsbCl7dGhpcy51cmw9dXJsO30KdGhpcy5k cmF3KCk7fSxkcmF3OmZ1bmN0aW9uKHB4KXtPcGVuTGF5ZXJzLlV0aWwubW9kaWZ5 QWxwaGFJbWFnZURpdih0aGlzLmltYWdlRGl2LG51bGwsbnVsbCx0aGlzLnNpemUs dGhpcy51cmwsImFic29sdXRlIik7dGhpcy5tb3ZlVG8ocHgpO3JldHVybiB0aGlz LmltYWdlRGl2O30sZXJhc2U6ZnVuY3Rpb24oKXtpZih0aGlzLmltYWdlRGl2IT1u dWxsJiZ0aGlzLmltYWdlRGl2LnBhcmVudE5vZGUhPW51bGwpe09wZW5MYXllcnMu RWxlbWVudC5yZW1vdmUodGhpcy5pbWFnZURpdik7fX0sc2V0T3BhY2l0eTpmdW5j dGlvbihvcGFjaXR5KXtPcGVuTGF5ZXJzLlV0aWwubW9kaWZ5QWxwaGFJbWFnZURp dih0aGlzLmltYWdlRGl2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51 bGwsb3BhY2l0eSk7fSxtb3ZlVG86ZnVuY3Rpb24ocHgpe2lmKHB4IT1udWxsKXt0 aGlzLnB4PXB4O30KaWYodGhpcy5pbWFnZURpdiE9bnVsbCl7aWYodGhpcy5weD09 bnVsbCl7dGhpcy5kaXNwbGF5KGZhbHNlKTt9ZWxzZXtpZih0aGlzLmNhbGN1bGF0 ZU9mZnNldCl7dGhpcy5vZmZzZXQ9dGhpcy5jYWxjdWxhdGVPZmZzZXQodGhpcy5z aXplKTt9CnZhciBvZmZzZXRQeD10aGlzLnB4Lm9mZnNldCh0aGlzLm9mZnNldCk7 T3BlbkxheWVycy5VdGlsLm1vZGlmeUFscGhhSW1hZ2VEaXYodGhpcy5pbWFnZURp dixudWxsLG9mZnNldFB4KTt9fX0sZGlzcGxheTpmdW5jdGlvbihkaXNwbGF5KXt0 aGlzLmltYWdlRGl2LnN0eWxlLmRpc3BsYXk9KGRpc3BsYXkpPyIiOiJub25lIjt9 LGlzRHJhd246ZnVuY3Rpb24oKXt2YXIgaXNEcmF3bj0odGhpcy5pbWFnZURpdiYm dGhpcy5pbWFnZURpdi5wYXJlbnROb2RlJiYodGhpcy5pbWFnZURpdi5wYXJlbnRO b2RlLm5vZGVUeXBlIT0xMSkpO3JldHVybiBpc0RyYXduO30sQ0xBU1NfTkFNRToi T3BlbkxheWVycy5JY29uIn0pO09wZW5MYXllcnMuTWFya2VyPU9wZW5MYXllcnMu Q2xhc3Moe2ljb246bnVsbCxsb25sYXQ6bnVsbCxldmVudHM6bnVsbCxtYXA6bnVs bCxpbml0aWFsaXplOmZ1bmN0aW9uKGxvbmxhdCxpY29uKXt0aGlzLmxvbmxhdD1s b25sYXQ7dmFyIG5ld0ljb249KGljb24pP2ljb246T3BlbkxheWVycy5NYXJrZXIu ZGVmYXVsdEljb24oKTtpZih0aGlzLmljb249PW51bGwpe3RoaXMuaWNvbj1uZXdJ Y29uO31lbHNle3RoaXMuaWNvbi51cmw9bmV3SWNvbi51cmw7dGhpcy5pY29uLnNp emU9bmV3SWNvbi5zaXplO3RoaXMuaWNvbi5vZmZzZXQ9bmV3SWNvbi5vZmZzZXQ7 dGhpcy5pY29uLmNhbGN1bGF0ZU9mZnNldD1uZXdJY29uLmNhbGN1bGF0ZU9mZnNl dDt9CnRoaXMuZXZlbnRzPW5ldyBPcGVuTGF5ZXJzLkV2ZW50cyh0aGlzLHRoaXMu aWNvbi5pbWFnZURpdixudWxsKTt9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVy YXNlKCk7dGhpcy5tYXA9bnVsbDt0aGlzLmV2ZW50cy5kZXN0cm95KCk7dGhpcy5l dmVudHM9bnVsbDtpZih0aGlzLmljb24hPW51bGwpe3RoaXMuaWNvbi5kZXN0cm95 KCk7dGhpcy5pY29uPW51bGw7fX0sZHJhdzpmdW5jdGlvbihweCl7cmV0dXJuIHRo aXMuaWNvbi5kcmF3KHB4KTt9LGVyYXNlOmZ1bmN0aW9uKCl7aWYodGhpcy5pY29u IT1udWxsKXt0aGlzLmljb24uZXJhc2UoKTt9fSxtb3ZlVG86ZnVuY3Rpb24ocHgp e2lmKChweCE9bnVsbCkmJih0aGlzLmljb24hPW51bGwpKXt0aGlzLmljb24ubW92 ZVRvKHB4KTt9CnRoaXMubG9ubGF0PXRoaXMubWFwLmdldExvbkxhdEZyb21MYXll clB4KHB4KTt9LGlzRHJhd246ZnVuY3Rpb24oKXt2YXIgaXNEcmF3bj0odGhpcy5p Y29uJiZ0aGlzLmljb24uaXNEcmF3bigpKTtyZXR1cm4gaXNEcmF3bjt9LG9uU2Ny ZWVuOmZ1bmN0aW9uKCl7dmFyIG9uU2NyZWVuPWZhbHNlO2lmKHRoaXMubWFwKXt2 YXIgc2NyZWVuQm91bmRzPXRoaXMubWFwLmdldEV4dGVudCgpO29uU2NyZWVuPXNj cmVlbkJvdW5kcy5jb250YWluc0xvbkxhdCh0aGlzLmxvbmxhdCk7fQpyZXR1cm4g b25TY3JlZW47fSxpbmZsYXRlOmZ1bmN0aW9uKGluZmxhdGUpe2lmKHRoaXMuaWNv bil7dmFyIG5ld1NpemU9bmV3IE9wZW5MYXllcnMuU2l6ZSh0aGlzLmljb24uc2l6 ZS53KmluZmxhdGUsdGhpcy5pY29uLnNpemUuaCppbmZsYXRlKTt0aGlzLmljb24u c2V0U2l6ZShuZXdTaXplKTt9fSxzZXRPcGFjaXR5OmZ1bmN0aW9uKG9wYWNpdHkp e3RoaXMuaWNvbi5zZXRPcGFjaXR5KG9wYWNpdHkpO30sc2V0VXJsOmZ1bmN0aW9u KHVybCl7dGhpcy5pY29uLnNldFVybCh1cmwpO30sZGlzcGxheTpmdW5jdGlvbihk aXNwbGF5KXt0aGlzLmljb24uZGlzcGxheShkaXNwbGF5KTt9LENMQVNTX05BTUU6 Ik9wZW5MYXllcnMuTWFya2VyIn0pO09wZW5MYXllcnMuTWFya2VyLmRlZmF1bHRJ Y29uPWZ1bmN0aW9uKCl7dmFyIHVybD1PcGVuTGF5ZXJzLlV0aWwuZ2V0SW1hZ2Vz TG9jYXRpb24oKSsibWFya2VyLnBuZyI7dmFyIHNpemU9bmV3IE9wZW5MYXllcnMu U2l6ZSgyMSwyNSk7dmFyIGNhbGN1bGF0ZU9mZnNldD1mdW5jdGlvbihzaXplKXty ZXR1cm4gbmV3IE9wZW5MYXllcnMuUGl4ZWwoLShzaXplLncvMiksLXNpemUuaCk7 fTtyZXR1cm4gbmV3IE9wZW5MYXllcnMuSWNvbih1cmwsc2l6ZSxudWxsLGNhbGN1 bGF0ZU9mZnNldCk7fTtPcGVuTGF5ZXJzLkxheWVyLlRpbGVDYWNoZT1PcGVuTGF5 ZXJzLkNsYXNzKE9wZW5MYXllcnMuTGF5ZXIuR3JpZCx7aXNCYXNlTGF5ZXI6dHJ1 ZSxmb3JtYXQ6J2ltYWdlL3BuZycsc2VydmVyUmVzb2x1dGlvbnM6bnVsbCxpbml0 aWFsaXplOmZ1bmN0aW9uKG5hbWUsdXJsLGxheWVybmFtZSxvcHRpb25zKXt0aGlz LmxheWVybmFtZT1sYXllcm5hbWU7T3BlbkxheWVycy5MYXllci5HcmlkLnByb3Rv dHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW25hbWUsdXJsLHt9LG9wdGlvbnNd KTt0aGlzLmV4dGVuc2lvbj10aGlzLmZvcm1hdC5zcGxpdCgnLycpWzFdLnRvTG93 ZXJDYXNlKCk7dGhpcy5leHRlbnNpb249KHRoaXMuZXh0ZW5zaW9uPT0nanBnJyk/ J2pwZWcnOnRoaXMuZXh0ZW5zaW9uO30sY2xvbmU6ZnVuY3Rpb24ob2JqKXtpZihv Ymo9PW51bGwpe29iaj1uZXcgT3BlbkxheWVycy5MYXllci5UaWxlQ2FjaGUodGhp cy5uYW1lLHRoaXMudXJsLHRoaXMubGF5ZXJuYW1lLHRoaXMuZ2V0T3B0aW9ucygp KTt9Cm9iaj1PcGVuTGF5ZXJzLkxheWVyLkdyaWQucHJvdG90eXBlLmNsb25lLmFw cGx5KHRoaXMsW29ial0pO3JldHVybiBvYmo7fSxnZXRVUkw6ZnVuY3Rpb24oYm91 bmRzKXt2YXIgcmVzPXRoaXMubWFwLmdldFJlc29sdXRpb24oKTt2YXIgYmJveD10 aGlzLm1heEV4dGVudDt2YXIgc2l6ZT10aGlzLnRpbGVTaXplO3ZhciB0aWxlWD1N YXRoLnJvdW5kKChib3VuZHMubGVmdC1iYm94LmxlZnQpLyhyZXMqc2l6ZS53KSk7 dmFyIHRpbGVZPU1hdGgucm91bmQoKGJvdW5kcy5ib3R0b20tYmJveC5ib3R0b20p LyhyZXMqc2l6ZS5oKSk7dmFyIHRpbGVaPXRoaXMuc2VydmVyUmVzb2x1dGlvbnMh PW51bGw/T3BlbkxheWVycy5VdGlsLmluZGV4T2YodGhpcy5zZXJ2ZXJSZXNvbHV0 aW9ucyxyZXMpOnRoaXMubWFwLmdldFpvb20oKTtmdW5jdGlvbiB6ZXJvUGFkKG51 bWJlcixsZW5ndGgpe251bWJlcj1TdHJpbmcobnVtYmVyKTt2YXIgemVyb3M9W107 Zm9yKHZhciBpPTA7aTxsZW5ndGg7KytpKXt6ZXJvcy5wdXNoKCcwJyk7fQpyZXR1 cm4gemVyb3Muam9pbignJykuc3Vic3RyaW5nKDAsbGVuZ3RoLW51bWJlci5sZW5n dGgpK251bWJlcjt9CnZhciBjb21wb25lbnRzPVt0aGlzLmxheWVybmFtZSx6ZXJv UGFkKHRpbGVaLDIpLHplcm9QYWQocGFyc2VJbnQodGlsZVgvMTAwMDAwMCksMyks emVyb1BhZCgocGFyc2VJbnQodGlsZVgvMTAwMCklMTAwMCksMyksemVyb1BhZCgo cGFyc2VJbnQodGlsZVgpJTEwMDApLDMpLHplcm9QYWQocGFyc2VJbnQodGlsZVkv MTAwMDAwMCksMyksemVyb1BhZCgocGFyc2VJbnQodGlsZVkvMTAwMCklMTAwMCks MyksemVyb1BhZCgocGFyc2VJbnQodGlsZVkpJTEwMDApLDMpKycuJyt0aGlzLmV4 dGVuc2lvbl07dmFyIHBhdGg9Y29tcG9uZW50cy5qb2luKCcvJyk7dmFyIHVybD10 aGlzLnVybDtpZihPcGVuTGF5ZXJzLlV0aWwuaXNBcnJheSh1cmwpKXt1cmw9dGhp cy5zZWxlY3RVcmwocGF0aCx1cmwpO30KdXJsPSh1cmwuY2hhckF0KHVybC5sZW5n dGgtMSk9PScvJyk/dXJsOnVybCsnLyc7cmV0dXJuIHVybCtwYXRoO30sQ0xBU1Nf TkFNRToiT3BlbkxheWVycy5MYXllci5UaWxlQ2FjaGUifSk7T3BlbkxheWVycy5T dHJhdGVneS5QYWdpbmc9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLlN0cmF0 ZWd5LHtmZWF0dXJlczpudWxsLGxlbmd0aDoxMCxudW06bnVsbCxwYWdpbmc6ZmFs c2UsYWN0aXZhdGU6ZnVuY3Rpb24oKXt2YXIgYWN0aXZhdGVkPU9wZW5MYXllcnMu U3RyYXRlZ3kucHJvdG90eXBlLmFjdGl2YXRlLmNhbGwodGhpcyk7aWYoYWN0aXZh dGVkKXt0aGlzLmxheWVyLmV2ZW50cy5vbih7ImJlZm9yZWZlYXR1cmVzYWRkZWQi OnRoaXMuY2FjaGVGZWF0dXJlcyxzY29wZTp0aGlzfSk7fQpyZXR1cm4gYWN0aXZh dGVkO30sZGVhY3RpdmF0ZTpmdW5jdGlvbigpe3ZhciBkZWFjdGl2YXRlZD1PcGVu TGF5ZXJzLlN0cmF0ZWd5LnByb3RvdHlwZS5kZWFjdGl2YXRlLmNhbGwodGhpcyk7 aWYoZGVhY3RpdmF0ZWQpe3RoaXMuY2xlYXJDYWNoZSgpO3RoaXMubGF5ZXIuZXZl bnRzLnVuKHsiYmVmb3JlZmVhdHVyZXNhZGRlZCI6dGhpcy5jYWNoZUZlYXR1cmVz LHNjb3BlOnRoaXN9KTt9CnJldHVybiBkZWFjdGl2YXRlZDt9LGNhY2hlRmVhdHVy ZXM6ZnVuY3Rpb24oZXZlbnQpe2lmKCF0aGlzLnBhZ2luZyl7dGhpcy5jbGVhckNh Y2hlKCk7dGhpcy5mZWF0dXJlcz1ldmVudC5mZWF0dXJlczt0aGlzLnBhZ2VOZXh0 KGV2ZW50KTt9fSxjbGVhckNhY2hlOmZ1bmN0aW9uKCl7aWYodGhpcy5mZWF0dXJl cyl7Zm9yKHZhciBpPTA7aTx0aGlzLmZlYXR1cmVzLmxlbmd0aDsrK2kpe3RoaXMu ZmVhdHVyZXNbaV0uZGVzdHJveSgpO319CnRoaXMuZmVhdHVyZXM9bnVsbDt0aGlz Lm51bT1udWxsO30scGFnZUNvdW50OmZ1bmN0aW9uKCl7dmFyIG51bUZlYXR1cmVz PXRoaXMuZmVhdHVyZXM/dGhpcy5mZWF0dXJlcy5sZW5ndGg6MDtyZXR1cm4gTWF0 aC5jZWlsKG51bUZlYXR1cmVzL3RoaXMubGVuZ3RoKTt9LHBhZ2VOdW06ZnVuY3Rp b24oKXtyZXR1cm4gdGhpcy5udW07fSxwYWdlTGVuZ3RoOmZ1bmN0aW9uKG5ld0xl bmd0aCl7aWYobmV3TGVuZ3RoJiZuZXdMZW5ndGg+MCl7dGhpcy5sZW5ndGg9bmV3 TGVuZ3RoO30KcmV0dXJuIHRoaXMubGVuZ3RoO30scGFnZU5leHQ6ZnVuY3Rpb24o ZXZlbnQpe3ZhciBjaGFuZ2VkPWZhbHNlO2lmKHRoaXMuZmVhdHVyZXMpe2lmKHRo aXMubnVtPT09bnVsbCl7dGhpcy5udW09LTE7fQp2YXIgc3RhcnQ9KHRoaXMubnVt KzEpKnRoaXMubGVuZ3RoO2NoYW5nZWQ9dGhpcy5wYWdlKHN0YXJ0LGV2ZW50KTt9 CnJldHVybiBjaGFuZ2VkO30scGFnZVByZXZpb3VzOmZ1bmN0aW9uKCl7dmFyIGNo YW5nZWQ9ZmFsc2U7aWYodGhpcy5mZWF0dXJlcyl7aWYodGhpcy5udW09PT1udWxs KXt0aGlzLm51bT10aGlzLnBhZ2VDb3VudCgpO30KdmFyIHN0YXJ0PSh0aGlzLm51 bS0xKSp0aGlzLmxlbmd0aDtjaGFuZ2VkPXRoaXMucGFnZShzdGFydCk7fQpyZXR1 cm4gY2hhbmdlZDt9LHBhZ2U6ZnVuY3Rpb24oc3RhcnQsZXZlbnQpe3ZhciBjaGFu Z2VkPWZhbHNlO2lmKHRoaXMuZmVhdHVyZXMpe2lmKHN0YXJ0Pj0wJiZzdGFydDx0 aGlzLmZlYXR1cmVzLmxlbmd0aCl7dmFyIG51bT1NYXRoLmZsb29yKHN0YXJ0L3Ro aXMubGVuZ3RoKTtpZihudW0hPXRoaXMubnVtKXt0aGlzLnBhZ2luZz10cnVlO3Zh ciBmZWF0dXJlcz10aGlzLmZlYXR1cmVzLnNsaWNlKHN0YXJ0LHN0YXJ0K3RoaXMu bGVuZ3RoKTt0aGlzLmxheWVyLnJlbW92ZUZlYXR1cmVzKHRoaXMubGF5ZXIuZmVh dHVyZXMpO3RoaXMubnVtPW51bTtpZihldmVudCYmZXZlbnQuZmVhdHVyZXMpe2V2 ZW50LmZlYXR1cmVzPWZlYXR1cmVzO31lbHNle3RoaXMubGF5ZXIuYWRkRmVhdHVy ZXMoZmVhdHVyZXMpO30KdGhpcy5wYWdpbmc9ZmFsc2U7Y2hhbmdlZD10cnVlO319 fQpyZXR1cm4gY2hhbmdlZDt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuU3RyYXRl Z3kuUGFnaW5nIn0pO09wZW5MYXllcnMuQ29udHJvbC5UcmFuc2Zvcm1GZWF0dXJl PU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Db250cm9sLHtFVkVOVF9UWVBF UzpbImJlZm9yZXNldGZlYXR1cmUiLCJzZXRmZWF0dXJlIiwiYmVmb3JldHJhbnNm b3JtIiwidHJhbnNmb3JtIiwidHJhbnNmb3JtY29tcGxldGUiXSxnZW9tZXRyeVR5 cGVzOm51bGwsbGF5ZXI6bnVsbCxwcmVzZXJ2ZUFzcGVjdFJhdGlvOmZhbHNlLHJv dGF0ZTp0cnVlLGZlYXR1cmU6bnVsbCxyZW5kZXJJbnRlbnQ6InRlbXBvcmFyeSIs cm90YXRpb25IYW5kbGVTeW1ib2xpemVyOm51bGwsYm94Om51bGwsY2VudGVyOm51 bGwsc2NhbGU6MSxyYXRpbzoxLHJvdGF0aW9uOjAsaGFuZGxlczpudWxsLHJvdGF0 aW9uSGFuZGxlczpudWxsLGRyYWdDb250cm9sOm51bGwsaW5pdGlhbGl6ZTpmdW5j dGlvbihsYXllcixvcHRpb25zKXt0aGlzLkVWRU5UX1RZUEVTPU9wZW5MYXllcnMu Q29udHJvbC5UcmFuc2Zvcm1GZWF0dXJlLnByb3RvdHlwZS5FVkVOVF9UWVBFUy5j b25jYXQoT3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5FVkVOVF9UWVBFUyk7 T3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRo aXMsW29wdGlvbnNdKTt0aGlzLmxheWVyPWxheWVyO2lmKCF0aGlzLnJvdGF0aW9u SGFuZGxlU3ltYm9saXplcil7dGhpcy5yb3RhdGlvbkhhbmRsZVN5bWJvbGl6ZXI9 e3N0cm9rZTpmYWxzZSxwb2ludFJhZGl1czoxMCxmaWxsT3BhY2l0eTowLGN1cnNv cjoicG9pbnRlciJ9O30KdGhpcy5jcmVhdGVCb3goKTt0aGlzLmNyZWF0ZUNvbnRy b2woKTt9LGFjdGl2YXRlOmZ1bmN0aW9uKCl7dmFyIGFjdGl2YXRlZD1mYWxzZTtp ZihPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90eXBlLmFjdGl2YXRlLmFwcGx5KHRo aXMsYXJndW1lbnRzKSl7dGhpcy5kcmFnQ29udHJvbC5hY3RpdmF0ZSgpO3RoaXMu bGF5ZXIuYWRkRmVhdHVyZXMoW3RoaXMuYm94XSk7dGhpcy5yb3RhdGUmJnRoaXMu bGF5ZXIuYWRkRmVhdHVyZXModGhpcy5yb3RhdGlvbkhhbmRsZXMpO3RoaXMubGF5 ZXIuYWRkRmVhdHVyZXModGhpcy5oYW5kbGVzKTthY3RpdmF0ZWQ9dHJ1ZTt9CnJl dHVybiBhY3RpdmF0ZWQ7fSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7dmFyIGRlYWN0 aXZhdGVkPWZhbHNlO2lmKE9wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUuZGVh Y3RpdmF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3RoaXMubGF5ZXIucmVtb3Zl RmVhdHVyZXModGhpcy5oYW5kbGVzKTt0aGlzLnJvdGF0ZSYmdGhpcy5sYXllci5y ZW1vdmVGZWF0dXJlcyh0aGlzLnJvdGF0aW9uSGFuZGxlcyk7dGhpcy5sYXllci5y ZW1vdmVGZWF0dXJlcyhbdGhpcy5ib3hdKTt0aGlzLmRyYWdDb250cm9sLmRlYWN0 aXZhdGUoKTtkZWFjdGl2YXRlZD10cnVlO30KaWYoZGVhY3RpdmF0ZWQpe3RoaXMu dW5zZXRGZWF0dXJlKCk7fQpyZXR1cm4gZGVhY3RpdmF0ZWQ7fSxzZXRNYXA6ZnVu Y3Rpb24obWFwKXt0aGlzLmRyYWdDb250cm9sLnNldE1hcChtYXApO09wZW5MYXll cnMuQ29udHJvbC5wcm90b3R5cGUuc2V0TWFwLmFwcGx5KHRoaXMsYXJndW1lbnRz KTt9LHNldEZlYXR1cmU6ZnVuY3Rpb24oZmVhdHVyZSxpbml0aWFsUGFyYW1zKXtp bml0aWFsUGFyYW1zPU9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKGluaXRp YWxQYXJhbXMse3JvdGF0aW9uOjAsc2NhbGU6MSxyYXRpbzoxfSk7dmFyIG9sZFJv dGF0aW9uPXRoaXMucm90YXRpb247dmFyIG9sZENlbnRlcj10aGlzLmNlbnRlcjtP cGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHRoaXMsaW5pdGlhbFBhcmFtcyk7dmFyIGNv bnQ9dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJiZWZvcmVzZXRmZWF0dXJlIix7 ZmVhdHVyZTpmZWF0dXJlfSk7aWYoY29udD09PWZhbHNlKXtyZXR1cm47fQp0aGlz LmZlYXR1cmU9ZmVhdHVyZTt0aGlzLmFjdGl2YXRlKCk7dGhpcy5fc2V0ZmVhdHVy ZT10cnVlO3ZhciBmZWF0dXJlQm91bmRzPXRoaXMuZmVhdHVyZS5nZW9tZXRyeS5n ZXRCb3VuZHMoKTt0aGlzLmJveC5tb3ZlKGZlYXR1cmVCb3VuZHMuZ2V0Q2VudGVy TG9uTGF0KCkpO3RoaXMuYm94Lmdlb21ldHJ5LnJvdGF0ZSgtb2xkUm90YXRpb24s b2xkQ2VudGVyKTt0aGlzLl9hbmdsZT0wO3ZhciBsbDtpZih0aGlzLnJvdGF0aW9u KXt2YXIgZ2VvbT1mZWF0dXJlLmdlb21ldHJ5LmNsb25lKCk7Z2VvbS5yb3RhdGUo LXRoaXMucm90YXRpb24sdGhpcy5jZW50ZXIpO3ZhciBib3g9bmV3IE9wZW5MYXll cnMuRmVhdHVyZS5WZWN0b3IoZ2VvbS5nZXRCb3VuZHMoKS50b0dlb21ldHJ5KCkp O2JveC5nZW9tZXRyeS5yb3RhdGUodGhpcy5yb3RhdGlvbix0aGlzLmNlbnRlcik7 dGhpcy5ib3guZ2VvbWV0cnkucm90YXRlKHRoaXMucm90YXRpb24sdGhpcy5jZW50 ZXIpO3RoaXMuYm94Lm1vdmUoYm94Lmdlb21ldHJ5LmdldEJvdW5kcygpLmdldENl bnRlckxvbkxhdCgpKTt2YXIgbGxHZW9tPWJveC5nZW9tZXRyeS5jb21wb25lbnRz WzBdLmNvbXBvbmVudHNbMF07bGw9bGxHZW9tLmdldEJvdW5kcygpLmdldENlbnRl ckxvbkxhdCgpO31lbHNle2xsPW5ldyBPcGVuTGF5ZXJzLkxvbkxhdChmZWF0dXJl Qm91bmRzLmxlZnQsZmVhdHVyZUJvdW5kcy5ib3R0b20pO30KdGhpcy5oYW5kbGVz WzBdLm1vdmUobGwpO2RlbGV0ZSB0aGlzLl9zZXRmZWF0dXJlO3RoaXMuZXZlbnRz LnRyaWdnZXJFdmVudCgic2V0ZmVhdHVyZSIse2ZlYXR1cmU6ZmVhdHVyZX0pO30s dW5zZXRGZWF0dXJlOmZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3RoaXMuZGVh Y3RpdmF0ZSgpO31lbHNle3RoaXMuZmVhdHVyZT1udWxsO3RoaXMucm90YXRpb249 MDt0aGlzLnNjYWxlPTE7dGhpcy5yYXRpbz0xO319LGNyZWF0ZUJveDpmdW5jdGlv bigpe3ZhciBjb250cm9sPXRoaXM7dGhpcy5jZW50ZXI9bmV3IE9wZW5MYXllcnMu R2VvbWV0cnkuUG9pbnQoMCwwKTt2YXIgYm94PW5ldyBPcGVuTGF5ZXJzLkZlYXR1 cmUuVmVjdG9yKG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LkxpbmVTdHJpbmcoW25l dyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KC0xLC0xKSxuZXcgT3BlbkxheWVy cy5HZW9tZXRyeS5Qb2ludCgwLC0xKSxuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Q b2ludCgxLC0xKSxuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCgxLDApLG5l dyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KDEsMSksbmV3IE9wZW5MYXllcnMu R2VvbWV0cnkuUG9pbnQoMCwxKSxuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2lu dCgtMSwxKSxuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCgtMSwwKSxuZXcg T3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCgtMSwtMSldKSxudWxsLHR5cGVvZiB0 aGlzLnJlbmRlckludGVudD09InN0cmluZyI/bnVsbDp0aGlzLnJlbmRlckludGVu dCk7Ym94Lmdlb21ldHJ5Lm1vdmU9ZnVuY3Rpb24oeCx5KXtjb250cm9sLl9tb3Zp bmc9dHJ1ZTtPcGVuTGF5ZXJzLkdlb21ldHJ5LkxpbmVTdHJpbmcucHJvdG90eXBl Lm1vdmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2NvbnRyb2wuY2VudGVyLm1vdmUo eCx5KTtkZWxldGUgY29udHJvbC5fbW92aW5nO307dmFyIHZlcnRleE1vdmVGbj1m dW5jdGlvbih4LHkpe09wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQucHJvdG90eXBl Lm1vdmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuX3JvdGF0aW9uSGFuZGxl JiZ0aGlzLl9yb3RhdGlvbkhhbmRsZS5nZW9tZXRyeS5tb3ZlKHgseSk7dGhpcy5f aGFuZGxlLmdlb21ldHJ5Lm1vdmUoeCx5KTt9O3ZhciB2ZXJ0ZXhSZXNpemVGbj1m dW5jdGlvbihzY2FsZSxjZW50ZXIscmF0aW8pe09wZW5MYXllcnMuR2VvbWV0cnku UG9pbnQucHJvdG90eXBlLnJlc2l6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhp cy5fcm90YXRpb25IYW5kbGUmJnRoaXMuX3JvdGF0aW9uSGFuZGxlLmdlb21ldHJ5 LnJlc2l6ZShzY2FsZSxjZW50ZXIscmF0aW8pO3RoaXMuX2hhbmRsZS5nZW9tZXRy eS5yZXNpemUoc2NhbGUsY2VudGVyLHJhdGlvKTt9O3ZhciB2ZXJ0ZXhSb3RhdGVG bj1mdW5jdGlvbihhbmdsZSxjZW50ZXIpe09wZW5MYXllcnMuR2VvbWV0cnkuUG9p bnQucHJvdG90eXBlLnJvdGF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5f cm90YXRpb25IYW5kbGUmJnRoaXMuX3JvdGF0aW9uSGFuZGxlLmdlb21ldHJ5LnJv dGF0ZShhbmdsZSxjZW50ZXIpO3RoaXMuX2hhbmRsZS5nZW9tZXRyeS5yb3RhdGUo YW5nbGUsY2VudGVyKTt9O3ZhciBoYW5kbGVNb3ZlRm49ZnVuY3Rpb24oeCx5KXt2 YXIgb2xkWD10aGlzLngsb2xkWT10aGlzLnk7T3BlbkxheWVycy5HZW9tZXRyeS5Q b2ludC5wcm90b3R5cGUubW92ZS5jYWxsKHRoaXMseCx5KTtpZihjb250cm9sLl9t b3Zpbmcpe3JldHVybjt9CnZhciBldnQ9Y29udHJvbC5kcmFnQ29udHJvbC5oYW5k bGVycy5kcmFnLmV2dDt2YXIgcHJlc2VydmVBc3BlY3RSYXRpbz0hY29udHJvbC5f c2V0ZmVhdHVyZSYmY29udHJvbC5wcmVzZXJ2ZUFzcGVjdFJhdGlvO3ZhciByZXNo YXBlPSFwcmVzZXJ2ZUFzcGVjdFJhdGlvJiYhKGV2dCYmZXZ0LnNoaWZ0S2V5KTt2 YXIgb2xkR2VvbT1uZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludChvbGRYLG9s ZFkpO3ZhciBjZW50ZXJHZW9tZXRyeT1jb250cm9sLmNlbnRlcjt0aGlzLnJvdGF0 ZSgtY29udHJvbC5yb3RhdGlvbixjZW50ZXJHZW9tZXRyeSk7b2xkR2VvbS5yb3Rh dGUoLWNvbnRyb2wucm90YXRpb24sY2VudGVyR2VvbWV0cnkpO3ZhciBkeDE9dGhp cy54LWNlbnRlckdlb21ldHJ5Lng7dmFyIGR5MT10aGlzLnktY2VudGVyR2VvbWV0 cnkueTt2YXIgZHgwPWR4MS0odGhpcy54LW9sZEdlb20ueCk7dmFyIGR5MD1keTEt KHRoaXMueS1vbGRHZW9tLnkpO3RoaXMueD1vbGRYO3RoaXMueT1vbGRZO3ZhciBz Y2FsZSxyYXRpbz0xO2lmKHJlc2hhcGUpe3NjYWxlPU1hdGguYWJzKGR5MCk8MC4w MDAwMT8xOmR5MS9keTA7cmF0aW89KE1hdGguYWJzKGR4MCk8MC4wMDAwMT8xOihk eDEvZHgwKSkvc2NhbGU7fWVsc2V7dmFyIGwwPU1hdGguc3FydCgoZHgwKmR4MCkr KGR5MCpkeTApKTt2YXIgbDE9TWF0aC5zcXJ0KChkeDEqZHgxKSsoZHkxKmR5MSkp O3NjYWxlPWwxL2wwO30KY29udHJvbC5fbW92aW5nPXRydWU7Y29udHJvbC5ib3gu Z2VvbWV0cnkucm90YXRlKC1jb250cm9sLnJvdGF0aW9uLGNlbnRlckdlb21ldHJ5 KTtkZWxldGUgY29udHJvbC5fbW92aW5nO2NvbnRyb2wuYm94Lmdlb21ldHJ5LnJl c2l6ZShzY2FsZSxjZW50ZXJHZW9tZXRyeSxyYXRpbyk7Y29udHJvbC5ib3guZ2Vv bWV0cnkucm90YXRlKGNvbnRyb2wucm90YXRpb24sY2VudGVyR2VvbWV0cnkpO2Nv bnRyb2wudHJhbnNmb3JtRmVhdHVyZSh7c2NhbGU6c2NhbGUscmF0aW86cmF0aW99 KTt9O3ZhciByb3RhdGlvbkhhbmRsZU1vdmVGbj1mdW5jdGlvbih4LHkpe3ZhciBv bGRYPXRoaXMueCxvbGRZPXRoaXMueTtPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50 LnByb3RvdHlwZS5tb3ZlLmNhbGwodGhpcyx4LHkpO2lmKGNvbnRyb2wuX21vdmlu Zyl7cmV0dXJuO30KdmFyIGV2dD1jb250cm9sLmRyYWdDb250cm9sLmhhbmRsZXJz LmRyYWcuZXZ0O3ZhciBjb25zdHJhaW49KGV2dCYmZXZ0LnNoaWZ0S2V5KT80NTox O3ZhciBjZW50ZXJHZW9tZXRyeT1jb250cm9sLmNlbnRlcjt2YXIgZHgxPXRoaXMu eC1jZW50ZXJHZW9tZXRyeS54O3ZhciBkeTE9dGhpcy55LWNlbnRlckdlb21ldHJ5 Lnk7dmFyIGR4MD1keDEteDt2YXIgZHkwPWR5MS15O3RoaXMueD1vbGRYO3RoaXMu eT1vbGRZO3ZhciBhMD1NYXRoLmF0YW4yKGR5MCxkeDApO3ZhciBhMT1NYXRoLmF0 YW4yKGR5MSxkeDEpO3ZhciBhbmdsZT1hMS1hMDthbmdsZSo9MTgwL01hdGguUEk7 Y29udHJvbC5fYW5nbGU9KGNvbnRyb2wuX2FuZ2xlK2FuZ2xlKSUzNjA7dmFyIGRp ZmY9Y29udHJvbC5yb3RhdGlvbiVjb25zdHJhaW47aWYoTWF0aC5hYnMoY29udHJv bC5fYW5nbGUpPj1jb25zdHJhaW58fGRpZmYhPT0wKXthbmdsZT1NYXRoLnJvdW5k KGNvbnRyb2wuX2FuZ2xlL2NvbnN0cmFpbikqY29uc3RyYWluLQpkaWZmO2NvbnRy b2wuX2FuZ2xlPTA7Y29udHJvbC5ib3guZ2VvbWV0cnkucm90YXRlKGFuZ2xlLGNl bnRlckdlb21ldHJ5KTtjb250cm9sLnRyYW5zZm9ybUZlYXR1cmUoe3JvdGF0aW9u OmFuZ2xlfSk7fX07dmFyIGhhbmRsZXM9bmV3IEFycmF5KDgpO3ZhciByb3RhdGlv bkhhbmRsZXM9bmV3IEFycmF5KDQpO3ZhciBnZW9tLGhhbmRsZSxyb3RhdGlvbkhh bmRsZTtmb3IodmFyIGk9MDtpPDg7KytpKXtnZW9tPWJveC5nZW9tZXRyeS5jb21w b25lbnRzW2ldO2hhbmRsZT1uZXcgT3BlbkxheWVycy5GZWF0dXJlLlZlY3Rvcihn ZW9tLmNsb25lKCksbnVsbCx0eXBlb2YgdGhpcy5yZW5kZXJJbnRlbnQ9PSJzdHJp bmciP251bGw6dGhpcy5yZW5kZXJJbnRlbnQpO2lmKGklMj09MCl7cm90YXRpb25I YW5kbGU9bmV3IE9wZW5MYXllcnMuRmVhdHVyZS5WZWN0b3IoZ2VvbS5jbG9uZSgp LG51bGwsdHlwZW9mIHRoaXMucm90YXRpb25IYW5kbGVTeW1ib2xpemVyPT0ic3Ry aW5nIj9udWxsOnRoaXMucm90YXRpb25IYW5kbGVTeW1ib2xpemVyKTtyb3RhdGlv bkhhbmRsZS5nZW9tZXRyeS5tb3ZlPXJvdGF0aW9uSGFuZGxlTW92ZUZuO2dlb20u X3JvdGF0aW9uSGFuZGxlPXJvdGF0aW9uSGFuZGxlO3JvdGF0aW9uSGFuZGxlc1tp LzJdPXJvdGF0aW9uSGFuZGxlO30KZ2VvbS5tb3ZlPXZlcnRleE1vdmVGbjtnZW9t LnJlc2l6ZT12ZXJ0ZXhSZXNpemVGbjtnZW9tLnJvdGF0ZT12ZXJ0ZXhSb3RhdGVG bjtoYW5kbGUuZ2VvbWV0cnkubW92ZT1oYW5kbGVNb3ZlRm47Z2VvbS5faGFuZGxl PWhhbmRsZTtoYW5kbGVzW2ldPWhhbmRsZTt9CnRoaXMuYm94PWJveDt0aGlzLnJv dGF0aW9uSGFuZGxlcz1yb3RhdGlvbkhhbmRsZXM7dGhpcy5oYW5kbGVzPWhhbmRs ZXM7fSxjcmVhdGVDb250cm9sOmZ1bmN0aW9uKCl7dmFyIGNvbnRyb2w9dGhpczt0 aGlzLmRyYWdDb250cm9sPW5ldyBPcGVuTGF5ZXJzLkNvbnRyb2wuRHJhZ0ZlYXR1 cmUodGhpcy5sYXllcix7ZG9jdW1lbnREcmFnOnRydWUsbW92ZUZlYXR1cmU6ZnVu Y3Rpb24ocGl4ZWwpe2lmKHRoaXMuZmVhdHVyZT09PWNvbnRyb2wuZmVhdHVyZSl7 dGhpcy5mZWF0dXJlPWNvbnRyb2wuYm94O30KT3BlbkxheWVycy5Db250cm9sLkRy YWdGZWF0dXJlLnByb3RvdHlwZS5tb3ZlRmVhdHVyZS5hcHBseSh0aGlzLGFyZ3Vt ZW50cyk7fSxvbkRyYWc6ZnVuY3Rpb24oZmVhdHVyZSxwaXhlbCl7aWYoZmVhdHVy ZT09PWNvbnRyb2wuYm94KXtjb250cm9sLnRyYW5zZm9ybUZlYXR1cmUoe2NlbnRl cjpjb250cm9sLmNlbnRlcn0pO2NvbnRyb2wuZHJhd0hhbmRsZXMoKTt9fSxvblN0 YXJ0OmZ1bmN0aW9uKGZlYXR1cmUscGl4ZWwpe3ZhciBlbGlnaWJsZT0hY29udHJv bC5nZW9tZXRyeVR5cGVzfHxPcGVuTGF5ZXJzLlV0aWwuaW5kZXhPZihjb250cm9s Lmdlb21ldHJ5VHlwZXMsZmVhdHVyZS5nZW9tZXRyeS5DTEFTU19OQU1FKSE9PS0x O3ZhciBpPU9wZW5MYXllcnMuVXRpbC5pbmRleE9mKGNvbnRyb2wuaGFuZGxlcyxm ZWF0dXJlKTtpKz1PcGVuTGF5ZXJzLlV0aWwuaW5kZXhPZihjb250cm9sLnJvdGF0 aW9uSGFuZGxlcyxmZWF0dXJlKTtpZihmZWF0dXJlIT09Y29udHJvbC5mZWF0dXJl JiZmZWF0dXJlIT09Y29udHJvbC5ib3gmJmk9PS0yJiZlbGlnaWJsZSl7Y29udHJv bC5zZXRGZWF0dXJlKGZlYXR1cmUpO319LG9uQ29tcGxldGU6ZnVuY3Rpb24oZmVh dHVyZSxwaXhlbCl7Y29udHJvbC5ldmVudHMudHJpZ2dlckV2ZW50KCJ0cmFuc2Zv cm1jb21wbGV0ZSIse2ZlYXR1cmU6Y29udHJvbC5mZWF0dXJlfSk7fX0pO30sZHJh d0hhbmRsZXM6ZnVuY3Rpb24oKXt2YXIgbGF5ZXI9dGhpcy5sYXllcjtmb3IodmFy IGk9MDtpPDg7KytpKXtpZih0aGlzLnJvdGF0ZSYmaSUyPT09MCl7bGF5ZXIuZHJh d0ZlYXR1cmUodGhpcy5yb3RhdGlvbkhhbmRsZXNbaS8yXSx0aGlzLnJvdGF0aW9u SGFuZGxlU3ltYm9saXplcik7fQpsYXllci5kcmF3RmVhdHVyZSh0aGlzLmhhbmRs ZXNbaV0sdGhpcy5yZW5kZXJJbnRlbnQpO319LHRyYW5zZm9ybUZlYXR1cmU6ZnVu Y3Rpb24obW9kcyl7aWYoIXRoaXMuX3NldGZlYXR1cmUpe3RoaXMuc2NhbGUqPSht b2RzLnNjYWxlfHwxKTt0aGlzLnJhdGlvKj0obW9kcy5yYXRpb3x8MSk7dmFyIG9s ZFJvdGF0aW9uPXRoaXMucm90YXRpb247dGhpcy5yb3RhdGlvbj0odGhpcy5yb3Rh dGlvbisobW9kcy5yb3RhdGlvbnx8MCkpJTM2MDtpZih0aGlzLmV2ZW50cy50cmln Z2VyRXZlbnQoImJlZm9yZXRyYW5zZm9ybSIsbW9kcykhPT1mYWxzZSl7dmFyIGZl YXR1cmU9dGhpcy5mZWF0dXJlO3ZhciBnZW9tPWZlYXR1cmUuZ2VvbWV0cnk7dmFy IGNlbnRlcj10aGlzLmNlbnRlcjtnZW9tLnJvdGF0ZSgtb2xkUm90YXRpb24sY2Vu dGVyKTtpZihtb2RzLnNjYWxlfHxtb2RzLnJhdGlvKXtnZW9tLnJlc2l6ZShtb2Rz LnNjYWxlLGNlbnRlcixtb2RzLnJhdGlvKTt9ZWxzZSBpZihtb2RzLmNlbnRlcil7 ZmVhdHVyZS5tb3ZlKG1vZHMuY2VudGVyLmdldEJvdW5kcygpLmdldENlbnRlckxv bkxhdCgpKTt9Cmdlb20ucm90YXRlKHRoaXMucm90YXRpb24sY2VudGVyKTt0aGlz LmxheWVyLmRyYXdGZWF0dXJlKGZlYXR1cmUpO2ZlYXR1cmUudG9TdGF0ZShPcGVu TGF5ZXJzLlN0YXRlLlVQREFURSk7dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJ0 cmFuc2Zvcm0iLG1vZHMpO319CnRoaXMubGF5ZXIuZHJhd0ZlYXR1cmUodGhpcy5i b3gsdGhpcy5yZW5kZXJJbnRlbnQpO3RoaXMuZHJhd0hhbmRsZXMoKTt9LGRlc3Ry b3k6ZnVuY3Rpb24oKXt2YXIgZ2VvbTtmb3IodmFyIGk9MDtpPDg7KytpKXtnZW9t PXRoaXMuYm94Lmdlb21ldHJ5LmNvbXBvbmVudHNbaV07Z2VvbS5faGFuZGxlLmRl c3Ryb3koKTtnZW9tLl9oYW5kbGU9bnVsbDtnZW9tLl9yb3RhdGlvbkhhbmRsZSYm Z2VvbS5fcm90YXRpb25IYW5kbGUuZGVzdHJveSgpO2dlb20uX3JvdGF0aW9uSGFu ZGxlPW51bGw7fQp0aGlzLmJveC5kZXN0cm95KCk7dGhpcy5ib3g9bnVsbDt0aGlz LmxheWVyPW51bGw7dGhpcy5kcmFnQ29udHJvbC5kZXN0cm95KCk7T3BlbkxheWVy cy5Db250cm9sLnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRz KTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuQ29udHJvbC5UcmFuc2Zvcm1GZWF0 dXJlIn0pO09wZW5MYXllcnMuTGF5ZXIuWFlaPU9wZW5MYXllcnMuQ2xhc3MoT3Bl bkxheWVycy5MYXllci5HcmlkLHtpc0Jhc2VMYXllcjp0cnVlLHNwaGVyaWNhbE1l cmNhdG9yOmZhbHNlLHpvb21PZmZzZXQ6MCxzZXJ2ZXJSZXNvbHV0aW9uczpudWxs LGluaXRpYWxpemU6ZnVuY3Rpb24obmFtZSx1cmwsb3B0aW9ucyl7aWYob3B0aW9u cyYmb3B0aW9ucy5zcGhlcmljYWxNZXJjYXRvcnx8dGhpcy5zcGhlcmljYWxNZXJj YXRvcil7b3B0aW9ucz1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHttYXhFeHRlbnQ6 bmV3IE9wZW5MYXllcnMuQm91bmRzKC0xMjgqMTU2NTQzLjAzMzkwNjI1LC0xMjgq MTU2NTQzLjAzMzkwNjI1LDEyOCoxNTY1NDMuMDMzOTA2MjUsMTI4KjE1NjU0My4w MzM5MDYyNSksbWF4UmVzb2x1dGlvbjoxNTY1NDMuMDMzOTA2MjUsbnVtWm9vbUxl dmVsczoxOSx1bml0czoibSIscHJvamVjdGlvbjoiRVBTRzo5MDA5MTMifSxvcHRp b25zKTt9CnVybD11cmx8fHRoaXMudXJsO25hbWU9bmFtZXx8dGhpcy5uYW1lO3Zh ciBuZXdBcmd1bWVudHM9W25hbWUsdXJsLHt9LG9wdGlvbnNdO09wZW5MYXllcnMu TGF5ZXIuR3JpZC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLG5ld0Fy Z3VtZW50cyk7fSxjbG9uZTpmdW5jdGlvbihvYmope2lmKG9iaj09bnVsbCl7b2Jq PW5ldyBPcGVuTGF5ZXJzLkxheWVyLlhZWih0aGlzLm5hbWUsdGhpcy51cmwsdGhp cy5nZXRPcHRpb25zKCkpO30Kb2JqPU9wZW5MYXllcnMuTGF5ZXIuR3JpZC5wcm90 b3R5cGUuY2xvbmUuYXBwbHkodGhpcyxbb2JqXSk7cmV0dXJuIG9iajt9LGdldFVS TDpmdW5jdGlvbihib3VuZHMpe3ZhciB4eXo9dGhpcy5nZXRYWVooYm91bmRzKTt2 YXIgdXJsPXRoaXMudXJsO2lmKE9wZW5MYXllcnMuVXRpbC5pc0FycmF5KHVybCkp e3ZhciBzPScnK3h5ei54K3h5ei55K3h5ei56O3VybD10aGlzLnNlbGVjdFVybChz LHVybCk7fQpyZXR1cm4gT3BlbkxheWVycy5TdHJpbmcuZm9ybWF0KHVybCx4eXop O30sZ2V0WFlaOmZ1bmN0aW9uKGJvdW5kcyl7dmFyIHJlcz10aGlzLm1hcC5nZXRS ZXNvbHV0aW9uKCk7dmFyIHg9TWF0aC5yb3VuZCgoYm91bmRzLmxlZnQtdGhpcy5t YXhFeHRlbnQubGVmdCkvKHJlcyp0aGlzLnRpbGVTaXplLncpKTt2YXIgeT1NYXRo LnJvdW5kKCh0aGlzLm1heEV4dGVudC50b3AtYm91bmRzLnRvcCkvKHJlcyp0aGlz LnRpbGVTaXplLmgpKTt2YXIgej10aGlzLnNlcnZlclJlc29sdXRpb25zIT1udWxs P09wZW5MYXllcnMuVXRpbC5pbmRleE9mKHRoaXMuc2VydmVyUmVzb2x1dGlvbnMs cmVzKTp0aGlzLm1hcC5nZXRab29tKCkrdGhpcy56b29tT2Zmc2V0O3ZhciBsaW1p dD1NYXRoLnBvdygyLHopO2lmKHRoaXMud3JhcERhdGVMaW5lKQp7eD0oKHglbGlt aXQpK2xpbWl0KSVsaW1pdDt9CnJldHVybnsneCc6eCwneSc6eSwneic6en07fSxz ZXRNYXA6ZnVuY3Rpb24obWFwKXtPcGVuTGF5ZXJzLkxheWVyLkdyaWQucHJvdG90 eXBlLnNldE1hcC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMudGlsZU9y aWdpbil7dGhpcy50aWxlT3JpZ2luPW5ldyBPcGVuTGF5ZXJzLkxvbkxhdCh0aGlz Lm1heEV4dGVudC5sZWZ0LHRoaXMubWF4RXh0ZW50LmJvdHRvbSk7fX0sQ0xBU1Nf TkFNRToiT3BlbkxheWVycy5MYXllci5YWVoifSk7T3BlbkxheWVycy5MYXllci5P U009T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkxheWVyLlhZWix7bmFtZToi T3BlblN0cmVldE1hcCIsYXR0cmlidXRpb246IkRhdGEgQ0MtQnktU0EgYnkgPGEg aHJlZj0naHR0cDovL29wZW5zdHJlZXRtYXAub3JnLyc+T3BlblN0cmVldE1hcDwv YT4iLHNwaGVyaWNhbE1lcmNhdG9yOnRydWUsdXJsOidodHRwOi8vdGlsZS5vcGVu c3RyZWV0bWFwLm9yZy8ke3p9LyR7eH0vJHt5fS5wbmcnLGNsb25lOmZ1bmN0aW9u KG9iail7aWYob2JqPT1udWxsKXtvYmo9bmV3IE9wZW5MYXllcnMuTGF5ZXIuT1NN KHRoaXMubmFtZSx0aGlzLnVybCx0aGlzLmdldE9wdGlvbnMoKSk7fQpvYmo9T3Bl bkxheWVycy5MYXllci5YWVoucHJvdG90eXBlLmNsb25lLmFwcGx5KHRoaXMsW29i al0pO3JldHVybiBvYmo7fSx3cmFwRGF0ZUxpbmU6dHJ1ZSxDTEFTU19OQU1FOiJP cGVuTGF5ZXJzLkxheWVyLk9TTSJ9KTtPcGVuTGF5ZXJzLkhhbmRsZXIuQm94PU9w ZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5IYW5kbGVyLHtkcmFnSGFuZGxlcjpu dWxsLGJveERpdkNsYXNzTmFtZTonb2xIYW5kbGVyQm94Wm9vbUJveCcsYm94T2Zm c2V0czpudWxsLGluaXRpYWxpemU6ZnVuY3Rpb24oY29udHJvbCxjYWxsYmFja3Ms b3B0aW9ucyl7T3BlbkxheWVycy5IYW5kbGVyLnByb3RvdHlwZS5pbml0aWFsaXpl LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmRyYWdIYW5kbGVyPW5ldyBPcGVu TGF5ZXJzLkhhbmRsZXIuRHJhZyh0aGlzLHtkb3duOnRoaXMuc3RhcnRCb3gsbW92 ZTp0aGlzLm1vdmVCb3gsb3V0OnRoaXMucmVtb3ZlQm94LHVwOnRoaXMuZW5kQm94 fSx7a2V5TWFzazp0aGlzLmtleU1hc2t9KTt9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtP cGVuTGF5ZXJzLkhhbmRsZXIucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyxh cmd1bWVudHMpO2lmKHRoaXMuZHJhZ0hhbmRsZXIpe3RoaXMuZHJhZ0hhbmRsZXIu ZGVzdHJveSgpO3RoaXMuZHJhZ0hhbmRsZXI9bnVsbDt9fSxzZXRNYXA6ZnVuY3Rp b24obWFwKXtPcGVuTGF5ZXJzLkhhbmRsZXIucHJvdG90eXBlLnNldE1hcC5hcHBs eSh0aGlzLGFyZ3VtZW50cyk7aWYodGhpcy5kcmFnSGFuZGxlcil7dGhpcy5kcmFn SGFuZGxlci5zZXRNYXAobWFwKTt9fSxzdGFydEJveDpmdW5jdGlvbih4eSl7dGhp cy5jYWxsYmFjaygic3RhcnQiLFtdKTt0aGlzLnpvb21Cb3g9T3BlbkxheWVycy5V dGlsLmNyZWF0ZURpdignem9vbUJveCcsbmV3IE9wZW5MYXllcnMuUGl4ZWwoLTk5 OTksLTk5OTkpKTt0aGlzLnpvb21Cb3guY2xhc3NOYW1lPXRoaXMuYm94RGl2Q2xh c3NOYW1lO3RoaXMuem9vbUJveC5zdHlsZS56SW5kZXg9dGhpcy5tYXAuWl9JTkRF WF9CQVNFWyJQb3B1cCJdLTE7dGhpcy5tYXAuZXZlbnRzRGl2LmFwcGVuZENoaWxk KHRoaXMuem9vbUJveCk7T3BlbkxheWVycy5FbGVtZW50LmFkZENsYXNzKHRoaXMu bWFwLmV2ZW50c0Rpdiwib2xEcmF3Qm94Iik7fSxtb3ZlQm94OmZ1bmN0aW9uKHh5 KXt2YXIgc3RhcnRYPXRoaXMuZHJhZ0hhbmRsZXIuc3RhcnQueDt2YXIgc3RhcnRZ PXRoaXMuZHJhZ0hhbmRsZXIuc3RhcnQueTt2YXIgZGVsdGFYPU1hdGguYWJzKHN0 YXJ0WC14eS54KTt2YXIgZGVsdGFZPU1hdGguYWJzKHN0YXJ0WS14eS55KTt2YXIg b2Zmc2V0PXRoaXMuZ2V0Qm94T2Zmc2V0cygpO3RoaXMuem9vbUJveC5zdHlsZS53 aWR0aD0oZGVsdGFYK29mZnNldC53aWR0aCsxKSsicHgiO3RoaXMuem9vbUJveC5z dHlsZS5oZWlnaHQ9KGRlbHRhWStvZmZzZXQuaGVpZ2h0KzEpKyJweCI7dGhpcy56 b29tQm94LnN0eWxlLmxlZnQ9KHh5Lng8c3RhcnRYP3N0YXJ0WC1kZWx0YVgtb2Zm c2V0LmxlZnQ6c3RhcnRYLW9mZnNldC5sZWZ0KSsicHgiO3RoaXMuem9vbUJveC5z dHlsZS50b3A9KHh5Lnk8c3RhcnRZP3N0YXJ0WS1kZWx0YVktb2Zmc2V0LnRvcDpz dGFydFktb2Zmc2V0LnRvcCkrInB4Ijt9LGVuZEJveDpmdW5jdGlvbihlbmQpe3Zh ciByZXN1bHQ7aWYoTWF0aC5hYnModGhpcy5kcmFnSGFuZGxlci5zdGFydC54LWVu ZC54KT41fHxNYXRoLmFicyh0aGlzLmRyYWdIYW5kbGVyLnN0YXJ0LnktZW5kLnkp PjUpe3ZhciBzdGFydD10aGlzLmRyYWdIYW5kbGVyLnN0YXJ0O3ZhciB0b3A9TWF0 aC5taW4oc3RhcnQueSxlbmQueSk7dmFyIGJvdHRvbT1NYXRoLm1heChzdGFydC55 LGVuZC55KTt2YXIgbGVmdD1NYXRoLm1pbihzdGFydC54LGVuZC54KTt2YXIgcmln aHQ9TWF0aC5tYXgoc3RhcnQueCxlbmQueCk7cmVzdWx0PW5ldyBPcGVuTGF5ZXJz LkJvdW5kcyhsZWZ0LGJvdHRvbSxyaWdodCx0b3ApO31lbHNle3Jlc3VsdD10aGlz LmRyYWdIYW5kbGVyLnN0YXJ0LmNsb25lKCk7fQp0aGlzLnJlbW92ZUJveCgpO3Ro aXMuY2FsbGJhY2soImRvbmUiLFtyZXN1bHRdKTt9LHJlbW92ZUJveDpmdW5jdGlv bigpe3RoaXMubWFwLmV2ZW50c0Rpdi5yZW1vdmVDaGlsZCh0aGlzLnpvb21Cb3gp O3RoaXMuem9vbUJveD1udWxsO3RoaXMuYm94T2Zmc2V0cz1udWxsO09wZW5MYXll cnMuRWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm1hcC5ldmVudHNEaXYsIm9sRHJh d0JveCIpO30sYWN0aXZhdGU6ZnVuY3Rpb24oKXtpZihPcGVuTGF5ZXJzLkhhbmRs ZXIucHJvdG90eXBlLmFjdGl2YXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dGhp cy5kcmFnSGFuZGxlci5hY3RpdmF0ZSgpO3JldHVybiB0cnVlO31lbHNle3JldHVy biBmYWxzZTt9fSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7aWYoT3BlbkxheWVycy5I YW5kbGVyLnByb3RvdHlwZS5kZWFjdGl2YXRlLmFwcGx5KHRoaXMsYXJndW1lbnRz KSl7aWYodGhpcy5kcmFnSGFuZGxlci5kZWFjdGl2YXRlKCkpe2lmKHRoaXMuem9v bUJveCl7dGhpcy5yZW1vdmVCb3goKTt9fQpyZXR1cm4gdHJ1ZTt9ZWxzZXtyZXR1 cm4gZmFsc2U7fX0sZ2V0Qm94T2Zmc2V0czpmdW5jdGlvbigpe2lmKCF0aGlzLmJv eE9mZnNldHMpe3ZhciB0ZXN0RGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRp diIpO3Rlc3REaXYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0ZXN0RGl2LnN0 eWxlLmJvcmRlcj0iMXB4IHNvbGlkIGJsYWNrIjt0ZXN0RGl2LnN0eWxlLndpZHRo PSIzcHgiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVzdERpdik7dmFyIHcz Y0JveE1vZGVsPXRlc3REaXYuY2xpZW50V2lkdGg9PTM7ZG9jdW1lbnQuYm9keS5y ZW1vdmVDaGlsZCh0ZXN0RGl2KTt2YXIgbGVmdD1wYXJzZUludChPcGVuTGF5ZXJz LkVsZW1lbnQuZ2V0U3R5bGUodGhpcy56b29tQm94LCJib3JkZXItbGVmdC13aWR0 aCIpKTt2YXIgcmlnaHQ9cGFyc2VJbnQoT3BlbkxheWVycy5FbGVtZW50LmdldFN0 eWxlKHRoaXMuem9vbUJveCwiYm9yZGVyLXJpZ2h0LXdpZHRoIikpO3ZhciB0b3A9 cGFyc2VJbnQoT3BlbkxheWVycy5FbGVtZW50LmdldFN0eWxlKHRoaXMuem9vbUJv eCwiYm9yZGVyLXRvcC13aWR0aCIpKTt2YXIgYm90dG9tPXBhcnNlSW50KE9wZW5M YXllcnMuRWxlbWVudC5nZXRTdHlsZSh0aGlzLnpvb21Cb3gsImJvcmRlci1ib3R0 b20td2lkdGgiKSk7dGhpcy5ib3hPZmZzZXRzPXtsZWZ0OmxlZnQscmlnaHQ6cmln aHQsdG9wOnRvcCxib3R0b206Ym90dG9tLHdpZHRoOnczY0JveE1vZGVsPT09ZmFs c2U/bGVmdCtyaWdodDowLGhlaWdodDp3M2NCb3hNb2RlbD09PWZhbHNlP3RvcCti b3R0b206MH07fQpyZXR1cm4gdGhpcy5ib3hPZmZzZXRzO30sQ0xBU1NfTkFNRToi T3BlbkxheWVycy5IYW5kbGVyLkJveCJ9KTtPcGVuTGF5ZXJzLkNvbnRyb2wuWm9v bUJveD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuQ29udHJvbCx7dHlwZTpP cGVuTGF5ZXJzLkNvbnRyb2wuVFlQRV9UT09MLG91dDpmYWxzZSxhbHdheXNab29t OmZhbHNlLGRyYXc6ZnVuY3Rpb24oKXt0aGlzLmhhbmRsZXI9bmV3IE9wZW5MYXll cnMuSGFuZGxlci5Cb3godGhpcyx7ZG9uZTp0aGlzLnpvb21Cb3h9LHtrZXlNYXNr OnRoaXMua2V5TWFza30pO30sem9vbUJveDpmdW5jdGlvbihwb3NpdGlvbil7aWYo cG9zaXRpb24gaW5zdGFuY2VvZiBPcGVuTGF5ZXJzLkJvdW5kcyl7dmFyIGJvdW5k cztpZighdGhpcy5vdXQpe3ZhciBtaW5YWT10aGlzLm1hcC5nZXRMb25MYXRGcm9t UGl4ZWwobmV3IE9wZW5MYXllcnMuUGl4ZWwocG9zaXRpb24ubGVmdCxwb3NpdGlv bi5ib3R0b20pKTt2YXIgbWF4WFk9dGhpcy5tYXAuZ2V0TG9uTGF0RnJvbVBpeGVs KG5ldyBPcGVuTGF5ZXJzLlBpeGVsKHBvc2l0aW9uLnJpZ2h0LHBvc2l0aW9uLnRv cCkpO2JvdW5kcz1uZXcgT3BlbkxheWVycy5Cb3VuZHMobWluWFkubG9uLG1pblhZ LmxhdCxtYXhYWS5sb24sbWF4WFkubGF0KTt9ZWxzZXt2YXIgcGl4V2lkdGg9TWF0 aC5hYnMocG9zaXRpb24ucmlnaHQtcG9zaXRpb24ubGVmdCk7dmFyIHBpeEhlaWdo dD1NYXRoLmFicyhwb3NpdGlvbi50b3AtcG9zaXRpb24uYm90dG9tKTt2YXIgem9v bUZhY3Rvcj1NYXRoLm1pbigodGhpcy5tYXAuc2l6ZS5oL3BpeEhlaWdodCksKHRo aXMubWFwLnNpemUudy9waXhXaWR0aCkpO3ZhciBleHRlbnQ9dGhpcy5tYXAuZ2V0 RXh0ZW50KCk7dmFyIGNlbnRlcj10aGlzLm1hcC5nZXRMb25MYXRGcm9tUGl4ZWwo cG9zaXRpb24uZ2V0Q2VudGVyUGl4ZWwoKSk7dmFyIHhtaW49Y2VudGVyLmxvbi0o ZXh0ZW50LmdldFdpZHRoKCkvMikqem9vbUZhY3Rvcjt2YXIgeG1heD1jZW50ZXIu bG9uKyhleHRlbnQuZ2V0V2lkdGgoKS8yKSp6b29tRmFjdG9yO3ZhciB5bWluPWNl bnRlci5sYXQtKGV4dGVudC5nZXRIZWlnaHQoKS8yKSp6b29tRmFjdG9yO3ZhciB5 bWF4PWNlbnRlci5sYXQrKGV4dGVudC5nZXRIZWlnaHQoKS8yKSp6b29tRmFjdG9y O2JvdW5kcz1uZXcgT3BlbkxheWVycy5Cb3VuZHMoeG1pbix5bWluLHhtYXgseW1h eCk7fQp2YXIgbGFzdFpvb209dGhpcy5tYXAuZ2V0Wm9vbSgpO3RoaXMubWFwLnpv b21Ub0V4dGVudChib3VuZHMpO2lmKGxhc3Rab29tPT10aGlzLm1hcC5nZXRab29t KCkmJnRoaXMuYWx3YXlzWm9vbT09dHJ1ZSl7dGhpcy5tYXAuem9vbVRvKGxhc3Ra b29tKyh0aGlzLm91dD8tMToxKSk7fX1lbHNle2lmKCF0aGlzLm91dCl7dGhpcy5t YXAuc2V0Q2VudGVyKHRoaXMubWFwLmdldExvbkxhdEZyb21QaXhlbChwb3NpdGlv biksdGhpcy5tYXAuZ2V0Wm9vbSgpKzEpO31lbHNle3RoaXMubWFwLnNldENlbnRl cih0aGlzLm1hcC5nZXRMb25MYXRGcm9tUGl4ZWwocG9zaXRpb24pLHRoaXMubWFw LmdldFpvb20oKS0xKTt9fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Db250cm9s Llpvb21Cb3gifSk7T3BlbkxheWVycy5Db250cm9sLkRyYWdQYW49T3BlbkxheWVy cy5DbGFzcyhPcGVuTGF5ZXJzLkNvbnRyb2wse3R5cGU6T3BlbkxheWVycy5Db250 cm9sLlRZUEVfVE9PTCxwYW5uZWQ6ZmFsc2UsaW50ZXJ2YWw6MSxkb2N1bWVudERy YWc6ZmFsc2Usa2luZXRpYzpudWxsLGVuYWJsZUtpbmV0aWM6ZmFsc2Usa2luZXRp Y0ludGVydmFsOjEwLGRyYXc6ZnVuY3Rpb24oKXtpZih0aGlzLmVuYWJsZUtpbmV0 aWMpe3ZhciBjb25maWc9e2ludGVydmFsOnRoaXMua2luZXRpY0ludGVydmFsfTtp Zih0eXBlb2YgdGhpcy5lbmFibGVLaW5ldGljPT09Im9iamVjdCIpe2NvbmZpZz1P cGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKGNvbmZpZyx0aGlzLmVuYWJsZUtpbmV0aWMp O30KdGhpcy5raW5ldGljPW5ldyBPcGVuTGF5ZXJzLktpbmV0aWMoY29uZmlnKTt9 CnRoaXMuaGFuZGxlcj1uZXcgT3BlbkxheWVycy5IYW5kbGVyLkRyYWcodGhpcyx7 Im1vdmUiOnRoaXMucGFuTWFwLCJkb25lIjp0aGlzLnBhbk1hcERvbmUsImRvd24i OnRoaXMucGFuTWFwU3RhcnR9LHtpbnRlcnZhbDp0aGlzLmludGVydmFsLGRvY3Vt ZW50RHJhZzp0aGlzLmRvY3VtZW50RHJhZ30pO30scGFuTWFwU3RhcnQ6ZnVuY3Rp b24oKXtpZih0aGlzLmtpbmV0aWMpe3RoaXMua2luZXRpYy5iZWdpbigpO319LHBh bk1hcDpmdW5jdGlvbih4eSl7aWYodGhpcy5raW5ldGljKXt0aGlzLmtpbmV0aWMu dXBkYXRlKHh5KTt9CnRoaXMucGFubmVkPXRydWU7dGhpcy5tYXAucGFuKHRoaXMu aGFuZGxlci5sYXN0LngteHkueCx0aGlzLmhhbmRsZXIubGFzdC55LXh5Lnkse2Ry YWdnaW5nOnRydWUsYW5pbWF0ZTpmYWxzZX0pO30scGFuTWFwRG9uZTpmdW5jdGlv bih4eSl7aWYodGhpcy5wYW5uZWQpe3ZhciByZXM9bnVsbDtpZih0aGlzLmtpbmV0 aWMpe3Jlcz10aGlzLmtpbmV0aWMuZW5kKHh5KTt9CnRoaXMubWFwLnBhbih0aGlz LmhhbmRsZXIubGFzdC54LXh5LngsdGhpcy5oYW5kbGVyLmxhc3QueS14eS55LHtk cmFnZ2luZzohIXJlcyxhbmltYXRlOmZhbHNlfSk7aWYocmVzKXt2YXIgc2VsZj10 aGlzO3RoaXMua2luZXRpYy5tb3ZlKHJlcyxmdW5jdGlvbih4LHksZW5kKXtzZWxm Lm1hcC5wYW4oeCx5LHtkcmFnZ2luZzohZW5kLGFuaW1hdGU6ZmFsc2V9KTt9KTt9 CnRoaXMucGFubmVkPWZhbHNlO319LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuQ29u dHJvbC5EcmFnUGFuIn0pO09wZW5MYXllcnMuSGFuZGxlci5DbGljaz1PcGVuTGF5 ZXJzLkNsYXNzKE9wZW5MYXllcnMuSGFuZGxlcix7ZGVsYXk6MzAwLHNpbmdsZTp0 cnVlLCdkb3VibGUnOmZhbHNlLHBpeGVsVG9sZXJhbmNlOjAsZGJsY2xpY2tUb2xl cmFuY2U6MTMsc3RvcFNpbmdsZTpmYWxzZSxzdG9wRG91YmxlOmZhbHNlLHRpbWVy SWQ6bnVsbCx0b3VjaDpmYWxzZSxkb3duOm51bGwsbGFzdDpudWxsLGZpcnN0Om51 bGwscmlnaHRjbGlja1RpbWVySWQ6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKGNv bnRyb2wsY2FsbGJhY2tzLG9wdGlvbnMpe09wZW5MYXllcnMuSGFuZGxlci5wcm90 b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fSx0b3VjaHN0 YXJ0OmZ1bmN0aW9uKGV2dCl7aWYoIXRoaXMudG91Y2gpe3RoaXMudW5yZWdpc3Rl ck1vdXNlTGlzdGVuZXJzKCk7dGhpcy50b3VjaD10cnVlO30KdGhpcy5kb3duPXRo aXMuZ2V0RXZlbnRJbmZvKGV2dCk7dGhpcy5sYXN0PXRoaXMuZ2V0RXZlbnRJbmZv KGV2dCk7cmV0dXJuIHRydWU7fSx0b3VjaG1vdmU6ZnVuY3Rpb24oZXZ0KXt0aGlz Lmxhc3Q9dGhpcy5nZXRFdmVudEluZm8oZXZ0KTtyZXR1cm4gdHJ1ZTt9LHRvdWNo ZW5kOmZ1bmN0aW9uKGV2dCl7aWYodGhpcy5kb3duKXtldnQueHk9dGhpcy5sYXN0 Lnh5O2V2dC5sYXN0VG91Y2hlcz10aGlzLmxhc3QudG91Y2hlczt0aGlzLmhhbmRs ZVNpbmdsZShldnQpO3RoaXMuZG93bj1udWxsO30KcmV0dXJuIHRydWU7fSx1bnJl Z2lzdGVyTW91c2VMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLm1hcC5ldmVudHMu dW4oe21vdXNlZG93bjp0aGlzLm1vdXNlZG93bixtb3VzZXVwOnRoaXMubW91c2V1 cCxjbGljazp0aGlzLmNsaWNrLGRibGNsaWNrOnRoaXMuZGJsY2xpY2ssc2NvcGU6 dGhpc30pO30sbW91c2Vkb3duOmZ1bmN0aW9uKGV2dCl7dGhpcy5kb3duPXRoaXMu Z2V0RXZlbnRJbmZvKGV2dCk7dGhpcy5sYXN0PXRoaXMuZ2V0RXZlbnRJbmZvKGV2 dCk7cmV0dXJuIHRydWU7fSxtb3VzZXVwOmZ1bmN0aW9uKGV2dCl7dmFyIHByb3Bh Z2F0ZT10cnVlO2lmKHRoaXMuY2hlY2tNb2RpZmllcnMoZXZ0KSYmdGhpcy5jb250 cm9sLmhhbmRsZVJpZ2h0Q2xpY2tzJiZPcGVuTGF5ZXJzLkV2ZW50LmlzUmlnaHRD bGljayhldnQpKXtwcm9wYWdhdGU9dGhpcy5yaWdodGNsaWNrKGV2dCk7fQpyZXR1 cm4gcHJvcGFnYXRlO30scmlnaHRjbGljazpmdW5jdGlvbihldnQpe2lmKHRoaXMu cGFzc2VzVG9sZXJhbmNlKGV2dCkpe2lmKHRoaXMucmlnaHRjbGlja1RpbWVySWQh PW51bGwpe3RoaXMuY2xlYXJUaW1lcigpO3RoaXMuY2FsbGJhY2soJ2RibHJpZ2h0 Y2xpY2snLFtldnRdKTtyZXR1cm4hdGhpcy5zdG9wRG91YmxlO31lbHNle3ZhciBj bGlja0V2ZW50PXRoaXNbJ2RvdWJsZSddP09wZW5MYXllcnMuVXRpbC5leHRlbmQo e30sZXZ0KTp0aGlzLmNhbGxiYWNrKCdyaWdodGNsaWNrJyxbZXZ0XSk7dmFyIGRl bGF5ZWRSaWdodENhbGw9T3BlbkxheWVycy5GdW5jdGlvbi5iaW5kKHRoaXMuZGVs YXllZFJpZ2h0Q2FsbCx0aGlzLGNsaWNrRXZlbnQpO3RoaXMucmlnaHRjbGlja1Rp bWVySWQ9d2luZG93LnNldFRpbWVvdXQoZGVsYXllZFJpZ2h0Q2FsbCx0aGlzLmRl bGF5KTt9fQpyZXR1cm4hdGhpcy5zdG9wU2luZ2xlO30sZGVsYXllZFJpZ2h0Q2Fs bDpmdW5jdGlvbihldnQpe3RoaXMucmlnaHRjbGlja1RpbWVySWQ9bnVsbDtpZihl dnQpe3RoaXMuY2FsbGJhY2soJ3JpZ2h0Y2xpY2snLFtldnRdKTt9fSxjbGljazpm dW5jdGlvbihldnQpe2lmKCF0aGlzLmxhc3Qpe3RoaXMubGFzdD10aGlzLmdldEV2 ZW50SW5mbyhldnQpO30KdGhpcy5oYW5kbGVTaW5nbGUoZXZ0KTtyZXR1cm4hdGhp cy5zdG9wU2luZ2xlO30sZGJsY2xpY2s6ZnVuY3Rpb24oZXZ0KXt0aGlzLmhhbmRs ZURvdWJsZShldnQpO3JldHVybiF0aGlzLnN0b3BEb3VibGU7fSxoYW5kbGVEb3Vi bGU6ZnVuY3Rpb24oZXZ0KXtpZih0aGlzWyJkb3VibGUiXSYmdGhpcy5wYXNzZXNE YmxjbGlja1RvbGVyYW5jZShldnQpKXt0aGlzLmNhbGxiYWNrKCJkYmxjbGljayIs W2V2dF0pO319LGhhbmRsZVNpbmdsZTpmdW5jdGlvbihldnQpe2lmKHRoaXMucGFz c2VzVG9sZXJhbmNlKGV2dCkpe2lmKHRoaXMudGltZXJJZCE9bnVsbCl7aWYodGhp cy5sYXN0LnRvdWNoZXMmJnRoaXMubGFzdC50b3VjaGVzLmxlbmd0aD09PTEpe2lm KHRoaXNbImRvdWJsZSJdKXtPcGVuTGF5ZXJzLkV2ZW50LnN0b3AoZXZ0KTt9CnRo aXMuaGFuZGxlRG91YmxlKGV2dCk7fQppZighdGhpcy5sYXN0LnRvdWNoZXN8fHRo aXMubGFzdC50b3VjaGVzLmxlbmd0aCE9PTIpe3RoaXMuY2xlYXJUaW1lcigpO319 ZWxzZXt0aGlzLmZpcnN0PXRoaXMuZ2V0RXZlbnRJbmZvKGV2dCk7dmFyIGNsaWNr RXZlbnQ9dGhpcy5zaW5nbGU/T3BlbkxheWVycy5VdGlsLmV4dGVuZCh7fSxldnQp Om51bGw7dGhpcy5xdWV1ZVBvdGVudGlhbENsaWNrKGNsaWNrRXZlbnQpO319fSxx dWV1ZVBvdGVudGlhbENsaWNrOmZ1bmN0aW9uKGV2dCl7dGhpcy50aW1lcklkPXdp bmRvdy5zZXRUaW1lb3V0KE9wZW5MYXllcnMuRnVuY3Rpb24uYmluZCh0aGlzLmRl bGF5ZWRDYWxsLHRoaXMsZXZ0KSx0aGlzLmRlbGF5KTt9LHBhc3Nlc1RvbGVyYW5j ZTpmdW5jdGlvbihldnQpe3ZhciBwYXNzZXM9dHJ1ZTtpZih0aGlzLnBpeGVsVG9s ZXJhbmNlIT1udWxsJiZ0aGlzLmRvd24mJnRoaXMuZG93bi54eSl7cGFzc2VzPXRo aXMucGl4ZWxUb2xlcmFuY2U+PXRoaXMuZG93bi54eS5kaXN0YW5jZVRvKGV2dC54 eSk7aWYocGFzc2VzJiZ0aGlzLnRvdWNoJiZ0aGlzLmRvd24udG91Y2hlcy5sZW5n dGg9PT10aGlzLmxhc3QudG91Y2hlcy5sZW5ndGgpe2Zvcih2YXIgaT0wLGlpPXRo aXMuZG93bi50b3VjaGVzLmxlbmd0aDtpPGlpOysraSl7aWYodGhpcy5nZXRUb3Vj aERpc3RhbmNlKHRoaXMuZG93bi50b3VjaGVzW2ldLHRoaXMubGFzdC50b3VjaGVz W2ldKT50aGlzLnBpeGVsVG9sZXJhbmNlKXtwYXNzZXM9ZmFsc2U7YnJlYWs7fX19 fQpyZXR1cm4gcGFzc2VzO30sZ2V0VG91Y2hEaXN0YW5jZTpmdW5jdGlvbihmcm9t LHRvKXtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KGZyb20uY2xpZW50WC10by5j bGllbnRYLDIpKwpNYXRoLnBvdyhmcm9tLmNsaWVudFktdG8uY2xpZW50WSwyKSk7 fSxwYXNzZXNEYmxjbGlja1RvbGVyYW5jZTpmdW5jdGlvbihldnQpe3ZhciBwYXNz ZXM9dHJ1ZTtpZih0aGlzLmRvd24mJnRoaXMuZmlyc3Qpe3Bhc3Nlcz10aGlzLmRv d24ueHkuZGlzdGFuY2VUbyh0aGlzLmZpcnN0Lnh5KTw9dGhpcy5kYmxjbGlja1Rv bGVyYW5jZTt9CnJldHVybiBwYXNzZXM7fSxjbGVhclRpbWVyOmZ1bmN0aW9uKCl7 aWYodGhpcy50aW1lcklkIT1udWxsKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMu dGltZXJJZCk7dGhpcy50aW1lcklkPW51bGw7fQppZih0aGlzLnJpZ2h0Y2xpY2tU aW1lcklkIT1udWxsKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMucmlnaHRjbGlj a1RpbWVySWQpO3RoaXMucmlnaHRjbGlja1RpbWVySWQ9bnVsbDt9fSxkZWxheWVk Q2FsbDpmdW5jdGlvbihldnQpe3RoaXMudGltZXJJZD1udWxsO2lmKGV2dCl7dGhp cy5jYWxsYmFjaygiY2xpY2siLFtldnRdKTt9fSxnZXRFdmVudEluZm86ZnVuY3Rp b24oZXZ0KXt2YXIgdG91Y2hlcztpZihldnQudG91Y2hlcyl7dmFyIGxlbj1ldnQu dG91Y2hlcy5sZW5ndGg7dG91Y2hlcz1uZXcgQXJyYXkobGVuKTt2YXIgdG91Y2g7 Zm9yKHZhciBpPTA7aTxsZW47aSsrKXt0b3VjaD1ldnQudG91Y2hlc1tpXTt0b3Vj aGVzW2ldPXtjbGllbnRYOnRvdWNoLmNsaWVudFgsY2xpZW50WTp0b3VjaC5jbGll bnRZfTt9fQpyZXR1cm57eHk6ZXZ0Lnh5LHRvdWNoZXM6dG91Y2hlc307fSxkZWFj dGl2YXRlOmZ1bmN0aW9uKCl7dmFyIGRlYWN0aXZhdGVkPWZhbHNlO2lmKE9wZW5M YXllcnMuSGFuZGxlci5wcm90b3R5cGUuZGVhY3RpdmF0ZS5hcHBseSh0aGlzLGFy Z3VtZW50cykpe3RoaXMuY2xlYXJUaW1lcigpO3RoaXMuZG93bj1udWxsO3RoaXMu Zmlyc3Q9bnVsbDt0aGlzLmxhc3Q9bnVsbDt0aGlzLnRvdWNoPWZhbHNlO2RlYWN0 aXZhdGVkPXRydWU7fQpyZXR1cm4gZGVhY3RpdmF0ZWQ7fSxDTEFTU19OQU1FOiJP cGVuTGF5ZXJzLkhhbmRsZXIuQ2xpY2sifSk7T3BlbkxheWVycy5Db250cm9sLk5h dmlnYXRpb249T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkNvbnRyb2wse2Ry YWdQYW46bnVsbCxkcmFnUGFuT3B0aW9uczpudWxsLHBpbmNoWm9vbTpudWxsLHBp bmNoWm9vbU9wdGlvbnM6bnVsbCxkb2N1bWVudERyYWc6ZmFsc2Usem9vbUJveDpu dWxsLHpvb21Cb3hFbmFibGVkOnRydWUsem9vbVdoZWVsRW5hYmxlZDp0cnVlLG1v dXNlV2hlZWxPcHRpb25zOm51bGwsaGFuZGxlUmlnaHRDbGlja3M6ZmFsc2Usem9v bUJveEtleU1hc2s6T3BlbkxheWVycy5IYW5kbGVyLk1PRF9TSElGVCxhdXRvQWN0 aXZhdGU6dHJ1ZSxpbml0aWFsaXplOmZ1bmN0aW9uKG9wdGlvbnMpe3RoaXMuaGFu ZGxlcnM9e307T3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5pbml0aWFsaXpl LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlz LmRlYWN0aXZhdGUoKTtpZih0aGlzLmRyYWdQYW4pe3RoaXMuZHJhZ1Bhbi5kZXN0 cm95KCk7fQp0aGlzLmRyYWdQYW49bnVsbDtpZih0aGlzLnpvb21Cb3gpe3RoaXMu em9vbUJveC5kZXN0cm95KCk7fQp0aGlzLnpvb21Cb3g9bnVsbDtpZih0aGlzLnBp bmNoWm9vbSl7dGhpcy5waW5jaFpvb20uZGVzdHJveSgpO30KdGhpcy5waW5jaFpv b209bnVsbDtPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90eXBlLmRlc3Ryb3kuYXBw bHkodGhpcyxhcmd1bWVudHMpO30sYWN0aXZhdGU6ZnVuY3Rpb24oKXt0aGlzLmRy YWdQYW4uYWN0aXZhdGUoKTtpZih0aGlzLnpvb21XaGVlbEVuYWJsZWQpe3RoaXMu aGFuZGxlcnMud2hlZWwuYWN0aXZhdGUoKTt9CnRoaXMuaGFuZGxlcnMuY2xpY2su YWN0aXZhdGUoKTtpZih0aGlzLnpvb21Cb3hFbmFibGVkKXt0aGlzLnpvb21Cb3gu YWN0aXZhdGUoKTt9CmlmKHRoaXMucGluY2hab29tKXt0aGlzLnBpbmNoWm9vbS5h Y3RpdmF0ZSgpO30KcmV0dXJuIE9wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUu YWN0aXZhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO30sZGVhY3RpdmF0ZTpmdW5j dGlvbigpe2lmKHRoaXMucGluY2hab29tKXt0aGlzLnBpbmNoWm9vbS5kZWFjdGl2 YXRlKCk7fQp0aGlzLnpvb21Cb3guZGVhY3RpdmF0ZSgpO3RoaXMuZHJhZ1Bhbi5k ZWFjdGl2YXRlKCk7dGhpcy5oYW5kbGVycy5jbGljay5kZWFjdGl2YXRlKCk7dGhp cy5oYW5kbGVycy53aGVlbC5kZWFjdGl2YXRlKCk7cmV0dXJuIE9wZW5MYXllcnMu Q29udHJvbC5wcm90b3R5cGUuZGVhY3RpdmF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50 cyk7fSxkcmF3OmZ1bmN0aW9uKCl7aWYodGhpcy5oYW5kbGVSaWdodENsaWNrcyl7 dGhpcy5tYXAudmlld1BvcnREaXYub25jb250ZXh0bWVudT1PcGVuTGF5ZXJzLkZ1 bmN0aW9uLkZhbHNlO30KdmFyIGNsaWNrQ2FsbGJhY2tzPXsnY2xpY2snOnRoaXMu ZGVmYXVsdENsaWNrLCdkYmxjbGljayc6dGhpcy5kZWZhdWx0RGJsQ2xpY2ssJ2Ri bHJpZ2h0Y2xpY2snOnRoaXMuZGVmYXVsdERibFJpZ2h0Q2xpY2t9O3ZhciBjbGlj a09wdGlvbnM9eydkb3VibGUnOnRydWUsJ3N0b3BEb3VibGUnOnRydWV9O3RoaXMu aGFuZGxlcnMuY2xpY2s9bmV3IE9wZW5MYXllcnMuSGFuZGxlci5DbGljayh0aGlz LGNsaWNrQ2FsbGJhY2tzLGNsaWNrT3B0aW9ucyk7dGhpcy5kcmFnUGFuPW5ldyBP cGVuTGF5ZXJzLkNvbnRyb2wuRHJhZ1BhbihPcGVuTGF5ZXJzLlV0aWwuZXh0ZW5k KHttYXA6dGhpcy5tYXAsZG9jdW1lbnREcmFnOnRoaXMuZG9jdW1lbnREcmFnfSx0 aGlzLmRyYWdQYW5PcHRpb25zKSk7dGhpcy56b29tQm94PW5ldyBPcGVuTGF5ZXJz LkNvbnRyb2wuWm9vbUJveCh7bWFwOnRoaXMubWFwLGtleU1hc2s6dGhpcy56b29t Qm94S2V5TWFza30pO3RoaXMuZHJhZ1Bhbi5kcmF3KCk7dGhpcy56b29tQm94LmRy YXcoKTt0aGlzLmhhbmRsZXJzLndoZWVsPW5ldyBPcGVuTGF5ZXJzLkhhbmRsZXIu TW91c2VXaGVlbCh0aGlzLHsidXAiOnRoaXMud2hlZWxVcCwiZG93biI6dGhpcy53 aGVlbERvd259LHRoaXMubW91c2VXaGVlbE9wdGlvbnMpO2lmKE9wZW5MYXllcnMu Q29udHJvbC5QaW5jaFpvb20pe3RoaXMucGluY2hab29tPW5ldyBPcGVuTGF5ZXJz LkNvbnRyb2wuUGluY2hab29tKE9wZW5MYXllcnMuVXRpbC5leHRlbmQoe21hcDp0 aGlzLm1hcH0sdGhpcy5waW5jaFpvb21PcHRpb25zKSk7fX0sZGVmYXVsdENsaWNr OmZ1bmN0aW9uKGV2dCl7aWYoZXZ0Lmxhc3RUb3VjaGVzJiZldnQubGFzdFRvdWNo ZXMubGVuZ3RoPT0yKXt0aGlzLm1hcC56b29tT3V0KCk7fX0sZGVmYXVsdERibENs aWNrOmZ1bmN0aW9uKGV2dCl7dmFyIG5ld0NlbnRlcj10aGlzLm1hcC5nZXRMb25M YXRGcm9tVmlld1BvcnRQeChldnQueHkpO3RoaXMubWFwLnNldENlbnRlcihuZXdD ZW50ZXIsdGhpcy5tYXAuem9vbSsxKTt9LGRlZmF1bHREYmxSaWdodENsaWNrOmZ1 bmN0aW9uKGV2dCl7dmFyIG5ld0NlbnRlcj10aGlzLm1hcC5nZXRMb25MYXRGcm9t Vmlld1BvcnRQeChldnQueHkpO3RoaXMubWFwLnNldENlbnRlcihuZXdDZW50ZXIs dGhpcy5tYXAuem9vbS0xKTt9LHdoZWVsQ2hhbmdlOmZ1bmN0aW9uKGV2dCxkZWx0 YVope3ZhciBjdXJyZW50Wm9vbT10aGlzLm1hcC5nZXRab29tKCk7dmFyIG5ld1pv b209dGhpcy5tYXAuZ2V0Wm9vbSgpK01hdGgucm91bmQoZGVsdGFaKTtuZXdab29t PU1hdGgubWF4KG5ld1pvb20sMCk7bmV3Wm9vbT1NYXRoLm1pbihuZXdab29tLHRo aXMubWFwLmdldE51bVpvb21MZXZlbHMoKSk7aWYobmV3Wm9vbT09PWN1cnJlbnRa b29tKXtyZXR1cm47fQp2YXIgc2l6ZT10aGlzLm1hcC5nZXRTaXplKCk7dmFyIGRl bHRhWD1zaXplLncvMi1ldnQueHkueDt2YXIgZGVsdGFZPWV2dC54eS55LXNpemUu aC8yO3ZhciBuZXdSZXM9dGhpcy5tYXAuYmFzZUxheWVyLmdldFJlc29sdXRpb25G b3Jab29tKG5ld1pvb20pO3ZhciB6b29tUG9pbnQ9dGhpcy5tYXAuZ2V0TG9uTGF0 RnJvbVBpeGVsKGV2dC54eSk7dmFyIG5ld0NlbnRlcj1uZXcgT3BlbkxheWVycy5M b25MYXQoem9vbVBvaW50LmxvbitkZWx0YVgqbmV3UmVzLHpvb21Qb2ludC5sYXQr ZGVsdGFZKm5ld1Jlcyk7dGhpcy5tYXAuc2V0Q2VudGVyKG5ld0NlbnRlcixuZXda b29tKTt9LHdoZWVsVXA6ZnVuY3Rpb24oZXZ0LGRlbHRhKXt0aGlzLndoZWVsQ2hh bmdlKGV2dCxkZWx0YXx8MSk7fSx3aGVlbERvd246ZnVuY3Rpb24oZXZ0LGRlbHRh KXt0aGlzLndoZWVsQ2hhbmdlKGV2dCxkZWx0YXx8LTEpO30sZGlzYWJsZVpvb21C b3g6ZnVuY3Rpb24oKXt0aGlzLnpvb21Cb3hFbmFibGVkPWZhbHNlO3RoaXMuem9v bUJveC5kZWFjdGl2YXRlKCk7fSxlbmFibGVab29tQm94OmZ1bmN0aW9uKCl7dGhp cy56b29tQm94RW5hYmxlZD10cnVlO2lmKHRoaXMuYWN0aXZlKXt0aGlzLnpvb21C b3guYWN0aXZhdGUoKTt9fSxkaXNhYmxlWm9vbVdoZWVsOmZ1bmN0aW9uKCl7dGhp cy56b29tV2hlZWxFbmFibGVkPWZhbHNlO3RoaXMuaGFuZGxlcnMud2hlZWwuZGVh Y3RpdmF0ZSgpO30sZW5hYmxlWm9vbVdoZWVsOmZ1bmN0aW9uKCl7dGhpcy56b29t V2hlZWxFbmFibGVkPXRydWU7aWYodGhpcy5hY3RpdmUpe3RoaXMuaGFuZGxlcnMu d2hlZWwuYWN0aXZhdGUoKTt9fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkNvbnRy b2wuTmF2aWdhdGlvbiJ9KTtPcGVuTGF5ZXJzLkNvbnRyb2wuRHJhd0ZlYXR1cmU9 T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkNvbnRyb2wse2xheWVyOm51bGws Y2FsbGJhY2tzOm51bGwsRVZFTlRfVFlQRVM6WyJmZWF0dXJlYWRkZWQiXSxtdWx0 aTpmYWxzZSxmZWF0dXJlQWRkZWQ6ZnVuY3Rpb24oKXt9LGhhbmRsZXJPcHRpb25z Om51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihsYXllcixoYW5kbGVyLG9wdGlvbnMp e3RoaXMuRVZFTlRfVFlQRVM9T3BlbkxheWVycy5Db250cm9sLkRyYXdGZWF0dXJl LnByb3RvdHlwZS5FVkVOVF9UWVBFUy5jb25jYXQoT3BlbkxheWVycy5Db250cm9s LnByb3RvdHlwZS5FVkVOVF9UWVBFUyk7T3BlbkxheWVycy5Db250cm9sLnByb3Rv dHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW29wdGlvbnNdKTt0aGlzLmNhbGxi YWNrcz1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHtkb25lOnRoaXMuZHJhd0ZlYXR1 cmUsbW9kaWZ5OmZ1bmN0aW9uKHZlcnRleCxmZWF0dXJlKXt0aGlzLmxheWVyLmV2 ZW50cy50cmlnZ2VyRXZlbnQoInNrZXRjaG1vZGlmaWVkIix7dmVydGV4OnZlcnRl eCxmZWF0dXJlOmZlYXR1cmV9KTt9LGNyZWF0ZTpmdW5jdGlvbih2ZXJ0ZXgsZmVh dHVyZSl7dGhpcy5sYXllci5ldmVudHMudHJpZ2dlckV2ZW50KCJza2V0Y2hzdGFy dGVkIix7dmVydGV4OnZlcnRleCxmZWF0dXJlOmZlYXR1cmV9KTt9fSx0aGlzLmNh bGxiYWNrcyk7dGhpcy5sYXllcj1sYXllcjt0aGlzLmhhbmRsZXJPcHRpb25zPXRo aXMuaGFuZGxlck9wdGlvbnN8fHt9O2lmKCEoIm11bHRpImluIHRoaXMuaGFuZGxl ck9wdGlvbnMpKXt0aGlzLmhhbmRsZXJPcHRpb25zLm11bHRpPXRoaXMubXVsdGk7 fQp2YXIgc2tldGNoU3R5bGU9dGhpcy5sYXllci5zdHlsZU1hcCYmdGhpcy5sYXll ci5zdHlsZU1hcC5zdHlsZXMudGVtcG9yYXJ5O2lmKHNrZXRjaFN0eWxlKXt0aGlz LmhhbmRsZXJPcHRpb25zLmxheWVyT3B0aW9ucz1PcGVuTGF5ZXJzLlV0aWwuYXBw bHlEZWZhdWx0cyh0aGlzLmhhbmRsZXJPcHRpb25zLmxheWVyT3B0aW9ucyx7c3R5 bGVNYXA6bmV3IE9wZW5MYXllcnMuU3R5bGVNYXAoeyJkZWZhdWx0Ijpza2V0Y2hT dHlsZX0pfSk7fQp0aGlzLmhhbmRsZXI9bmV3IGhhbmRsZXIodGhpcyx0aGlzLmNh bGxiYWNrcyx0aGlzLmhhbmRsZXJPcHRpb25zKTt9LGRyYXdGZWF0dXJlOmZ1bmN0 aW9uKGdlb21ldHJ5KXt2YXIgZmVhdHVyZT1uZXcgT3BlbkxheWVycy5GZWF0dXJl LlZlY3RvcihnZW9tZXRyeSk7dmFyIHByb2NlZWQ9dGhpcy5sYXllci5ldmVudHMu dHJpZ2dlckV2ZW50KCJza2V0Y2hjb21wbGV0ZSIse2ZlYXR1cmU6ZmVhdHVyZX0p O2lmKHByb2NlZWQhPT1mYWxzZSl7ZmVhdHVyZS5zdGF0ZT1PcGVuTGF5ZXJzLlN0 YXRlLklOU0VSVDt0aGlzLmxheWVyLmFkZEZlYXR1cmVzKFtmZWF0dXJlXSk7dGhp cy5mZWF0dXJlQWRkZWQoZmVhdHVyZSk7dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50 KCJmZWF0dXJlYWRkZWQiLHtmZWF0dXJlOmZlYXR1cmV9KTt9fSxpbnNlcnRYWTpm dW5jdGlvbih4LHkpe2lmKHRoaXMuaGFuZGxlciYmdGhpcy5oYW5kbGVyLmxpbmUp e3RoaXMuaGFuZGxlci5pbnNlcnRYWSh4LHkpO319LGluc2VydERlbHRhWFk6ZnVu Y3Rpb24oZHgsZHkpe2lmKHRoaXMuaGFuZGxlciYmdGhpcy5oYW5kbGVyLmxpbmUp e3RoaXMuaGFuZGxlci5pbnNlcnREZWx0YVhZKGR4LGR5KTt9fSxpbnNlcnREaXJl Y3Rpb25MZW5ndGg6ZnVuY3Rpb24oZGlyZWN0aW9uLGxlbmd0aCl7aWYodGhpcy5o YW5kbGVyJiZ0aGlzLmhhbmRsZXIubGluZSl7dGhpcy5oYW5kbGVyLmluc2VydERp cmVjdGlvbkxlbmd0aChkaXJlY3Rpb24sbGVuZ3RoKTt9fSxpbnNlcnREZWZsZWN0 aW9uTGVuZ3RoOmZ1bmN0aW9uKGRlZmxlY3Rpb24sbGVuZ3RoKXtpZih0aGlzLmhh bmRsZXImJnRoaXMuaGFuZGxlci5saW5lKXt0aGlzLmhhbmRsZXIuaW5zZXJ0RGVm bGVjdGlvbkxlbmd0aChkZWZsZWN0aW9uLGxlbmd0aCk7fX0sdW5kbzpmdW5jdGlv bigpe3JldHVybiB0aGlzLmhhbmRsZXIudW5kbyYmdGhpcy5oYW5kbGVyLnVuZG8o KTt9LHJlZG86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYW5kbGVyLnJlZG8mJnRo aXMuaGFuZGxlci5yZWRvKCk7fSxmaW5pc2hTa2V0Y2g6ZnVuY3Rpb24oKXt0aGlz LmhhbmRsZXIuZmluaXNoR2VvbWV0cnkoKTt9LGNhbmNlbDpmdW5jdGlvbigpe3Ro aXMuaGFuZGxlci5jYW5jZWwoKTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuQ29u dHJvbC5EcmF3RmVhdHVyZSJ9KTtPcGVuTGF5ZXJzLkhhbmRsZXIuUG9seWdvbj1P cGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuSGFuZGxlci5QYXRoLHtob2xlTW9k aWZpZXI6bnVsbCxkcmF3aW5nSG9sZTpmYWxzZSxwb2x5Z29uOm51bGwsaW5pdGlh bGl6ZTpmdW5jdGlvbihjb250cm9sLGNhbGxiYWNrcyxvcHRpb25zKXtPcGVuTGF5 ZXJzLkhhbmRsZXIuUGF0aC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlz LGFyZ3VtZW50cyk7fSxjcmVhdGVGZWF0dXJlOmZ1bmN0aW9uKHBpeGVsKXt2YXIg bG9ubGF0PXRoaXMubWFwLmdldExvbkxhdEZyb21QaXhlbChwaXhlbCk7dmFyIGdl b21ldHJ5PW5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KGxvbmxhdC5sb24s bG9ubGF0LmxhdCk7dGhpcy5wb2ludD1uZXcgT3BlbkxheWVycy5GZWF0dXJlLlZl Y3RvcihnZW9tZXRyeSk7dGhpcy5saW5lPW5ldyBPcGVuTGF5ZXJzLkZlYXR1cmUu VmVjdG9yKG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LkxpbmVhclJpbmcoW3RoaXMu cG9pbnQuZ2VvbWV0cnldKSk7dGhpcy5wb2x5Z29uPW5ldyBPcGVuTGF5ZXJzLkZl YXR1cmUuVmVjdG9yKG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvbHlnb24oW3Ro aXMubGluZS5nZW9tZXRyeV0pKTt0aGlzLmNhbGxiYWNrKCJjcmVhdGUiLFt0aGlz LnBvaW50Lmdlb21ldHJ5LHRoaXMuZ2V0U2tldGNoKCldKTt0aGlzLnBvaW50Lmdl b21ldHJ5LmNsZWFyQm91bmRzKCk7dGhpcy5sYXllci5hZGRGZWF0dXJlcyhbdGhp cy5wb2x5Z29uLHRoaXMucG9pbnRdLHtzaWxlbnQ6dHJ1ZX0pO30sYWRkUG9pbnQ6 ZnVuY3Rpb24ocGl4ZWwpe2lmKCF0aGlzLmRyYXdpbmdIb2xlJiZ0aGlzLmhvbGVN b2RpZmllciYmdGhpcy5ldnQmJnRoaXMuZXZ0W3RoaXMuaG9sZU1vZGlmaWVyXSl7 dmFyIGdlb21ldHJ5PXRoaXMucG9pbnQuZ2VvbWV0cnk7dmFyIGZlYXR1cmVzPXRo aXMuY29udHJvbC5sYXllci5mZWF0dXJlczt2YXIgY2FuZGlkYXRlLHBvbHlnb247 Zm9yKHZhciBpPWZlYXR1cmVzLmxlbmd0aC0xO2k+PTA7LS1pKXtjYW5kaWRhdGU9 ZmVhdHVyZXNbaV0uZ2VvbWV0cnk7aWYoKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIE9w ZW5MYXllcnMuR2VvbWV0cnkuUG9seWdvbnx8Y2FuZGlkYXRlIGluc3RhbmNlb2Yg T3BlbkxheWVycy5HZW9tZXRyeS5NdWx0aVBvbHlnb24pJiZjYW5kaWRhdGUuaW50 ZXJzZWN0cyhnZW9tZXRyeSkpe3BvbHlnb249ZmVhdHVyZXNbaV07dGhpcy5jb250 cm9sLmxheWVyLnJlbW92ZUZlYXR1cmVzKFtwb2x5Z29uXSx7c2lsZW50OnRydWV9 KTt0aGlzLmNvbnRyb2wubGF5ZXIuZXZlbnRzLnJlZ2lzdGVyUHJpb3JpdHkoInNr ZXRjaGNvbXBsZXRlIix0aGlzLHRoaXMuZmluYWxpemVJbnRlcmlvclJpbmcpO3Ro aXMuY29udHJvbC5sYXllci5ldmVudHMucmVnaXN0ZXJQcmlvcml0eSgic2tldGNo bW9kaWZpZWQiLHRoaXMsdGhpcy5lbmZvcmNlVG9wb2xvZ3kpO3BvbHlnb24uZ2Vv bWV0cnkuYWRkQ29tcG9uZW50KHRoaXMubGluZS5nZW9tZXRyeSk7dGhpcy5wb2x5 Z29uPXBvbHlnb247dGhpcy5kcmF3aW5nSG9sZT10cnVlO2JyZWFrO319fQpPcGVu TGF5ZXJzLkhhbmRsZXIuUGF0aC5wcm90b3R5cGUuYWRkUG9pbnQuYXBwbHkodGhp cyxhcmd1bWVudHMpO30sZ2V0Q3VycmVudFBvaW50SW5kZXg6ZnVuY3Rpb24oKXty ZXR1cm4gdGhpcy5saW5lLmdlb21ldHJ5LmNvbXBvbmVudHMubGVuZ3RoLTI7fSxl bmZvcmNlVG9wb2xvZ3k6ZnVuY3Rpb24oZXZlbnQpe3ZhciBwb2ludD1ldmVudC52 ZXJ0ZXg7dmFyIGNvbXBvbmVudHM9dGhpcy5saW5lLmdlb21ldHJ5LmNvbXBvbmVu dHM7aWYoIXRoaXMucG9seWdvbi5nZW9tZXRyeS5pbnRlcnNlY3RzKHBvaW50KSl7 dmFyIGxhc3Q9Y29tcG9uZW50c1tjb21wb25lbnRzLmxlbmd0aC0zXTtwb2ludC54 PWxhc3QueDtwb2ludC55PWxhc3QueTt9fSxmaW5pc2hHZW9tZXRyeTpmdW5jdGlv bigpe3ZhciBpbmRleD10aGlzLmxpbmUuZ2VvbWV0cnkuY29tcG9uZW50cy5sZW5n dGgtMjt0aGlzLmxpbmUuZ2VvbWV0cnkucmVtb3ZlQ29tcG9uZW50KHRoaXMubGlu ZS5nZW9tZXRyeS5jb21wb25lbnRzW2luZGV4XSk7dGhpcy5yZW1vdmVQb2ludCgp O3RoaXMuZmluYWxpemUoKTt9LGZpbmFsaXplSW50ZXJpb3JSaW5nOmZ1bmN0aW9u KCl7dmFyIHJpbmc9dGhpcy5saW5lLmdlb21ldHJ5O3ZhciBtb2RpZmllZD0ocmlu Zy5nZXRBcmVhKCkhPT0wKTtpZihtb2RpZmllZCl7dmFyIHJpbmdzPXRoaXMucG9s eWdvbi5nZW9tZXRyeS5jb21wb25lbnRzO2Zvcih2YXIgaT1yaW5ncy5sZW5ndGgt MjtpPj0wOy0taSl7aWYocmluZy5pbnRlcnNlY3RzKHJpbmdzW2ldKSl7bW9kaWZp ZWQ9ZmFsc2U7YnJlYWs7fX0KaWYobW9kaWZpZWQpe3ZhciB0YXJnZXQ7b3V0ZXI6 Zm9yKHZhciBpPXJpbmdzLmxlbmd0aC0yO2k+MDstLWkpe3ZhciBwb2ludHM9cmlu Z3NbaV0uY29tcG9uZW50cztmb3IodmFyIGo9MCxqaj1wb2ludHMubGVuZ3RoO2o8 amo7KytqKXtpZihyaW5nLmNvbnRhaW5zUG9pbnQocG9pbnRzW2pdKSl7bW9kaWZp ZWQ9ZmFsc2U7YnJlYWsgb3V0ZXI7fX19fX0KaWYobW9kaWZpZWQpe2lmKHRoaXMu cG9seWdvbi5zdGF0ZSE9PU9wZW5MYXllcnMuU3RhdGUuSU5TRVJUKXt0aGlzLnBv bHlnb24uc3RhdGU9T3BlbkxheWVycy5TdGF0ZS5VUERBVEU7fX1lbHNle3RoaXMu cG9seWdvbi5nZW9tZXRyeS5yZW1vdmVDb21wb25lbnQocmluZyk7fQp0aGlzLnJl c3RvcmVGZWF0dXJlKCk7cmV0dXJuIGZhbHNlO30sY2FuY2VsOmZ1bmN0aW9uKCl7 aWYodGhpcy5kcmF3aW5nSG9sZSl7dGhpcy5wb2x5Z29uLmdlb21ldHJ5LnJlbW92 ZUNvbXBvbmVudCh0aGlzLmxpbmUuZ2VvbWV0cnkpO3RoaXMucmVzdG9yZUZlYXR1 cmUodHJ1ZSk7fQpyZXR1cm4gT3BlbkxheWVycy5IYW5kbGVyLlBhdGgucHJvdG90 eXBlLmNhbmNlbC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fSxyZXN0b3JlRmVhdHVy ZTpmdW5jdGlvbihjYW5jZWwpe3RoaXMuY29udHJvbC5sYXllci5ldmVudHMudW5y ZWdpc3Rlcigic2tldGNoY29tcGxldGUiLHRoaXMsdGhpcy5maW5hbGl6ZUludGVy aW9yUmluZyk7dGhpcy5jb250cm9sLmxheWVyLmV2ZW50cy51bnJlZ2lzdGVyKCJz a2V0Y2htb2RpZmllZCIsdGhpcyx0aGlzLmVuZm9yY2VUb3BvbG9neSk7dGhpcy5s YXllci5yZW1vdmVGZWF0dXJlcyhbdGhpcy5wb2x5Z29uXSx7c2lsZW50OnRydWV9 KTt0aGlzLmNvbnRyb2wubGF5ZXIuYWRkRmVhdHVyZXMoW3RoaXMucG9seWdvbl0s e3NpbGVudDp0cnVlfSk7dGhpcy5kcmF3aW5nSG9sZT1mYWxzZTtpZighY2FuY2Vs KXt0aGlzLmNvbnRyb2wubGF5ZXIuZXZlbnRzLnRyaWdnZXJFdmVudCgic2tldGNo Y29tcGxldGUiLHtmZWF0dXJlOnRoaXMucG9seWdvbn0pO319LGRlc3Ryb3lGZWF0 dXJlOmZ1bmN0aW9uKGZvcmNlKXtPcGVuTGF5ZXJzLkhhbmRsZXIuUGF0aC5wcm90 b3R5cGUuZGVzdHJveUZlYXR1cmUuY2FsbCh0aGlzLGZvcmNlKTt0aGlzLnBvbHln b249bnVsbDt9LGRyYXdGZWF0dXJlOmZ1bmN0aW9uKCl7dGhpcy5sYXllci5kcmF3 RmVhdHVyZSh0aGlzLnBvbHlnb24sdGhpcy5zdHlsZSk7dGhpcy5sYXllci5kcmF3 RmVhdHVyZSh0aGlzLnBvaW50LHRoaXMuc3R5bGUpO30sZ2V0U2tldGNoOmZ1bmN0 aW9uKCl7cmV0dXJuIHRoaXMucG9seWdvbjt9LGdldEdlb21ldHJ5OmZ1bmN0aW9u KCl7dmFyIGdlb21ldHJ5PXRoaXMucG9seWdvbiYmdGhpcy5wb2x5Z29uLmdlb21l dHJ5O2lmKGdlb21ldHJ5JiZ0aGlzLm11bHRpKXtnZW9tZXRyeT1uZXcgT3Blbkxh eWVycy5HZW9tZXRyeS5NdWx0aVBvbHlnb24oW2dlb21ldHJ5XSk7fQpyZXR1cm4g Z2VvbWV0cnk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkhhbmRsZXIuUG9seWdv biJ9KTtPcGVuTGF5ZXJzLkNvbnRyb2wuRWRpdGluZ1Rvb2xiYXI9T3BlbkxheWVy cy5DbGFzcyhPcGVuTGF5ZXJzLkNvbnRyb2wuUGFuZWwse2luaXRpYWxpemU6ZnVu Y3Rpb24obGF5ZXIsb3B0aW9ucyl7T3BlbkxheWVycy5Db250cm9sLlBhbmVsLnBy b3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW29wdGlvbnNdKTt0aGlzLmFk ZENvbnRyb2xzKFtuZXcgT3BlbkxheWVycy5Db250cm9sLk5hdmlnYXRpb24oKV0p O3ZhciBjb250cm9scz1bbmV3IE9wZW5MYXllcnMuQ29udHJvbC5EcmF3RmVhdHVy ZShsYXllcixPcGVuTGF5ZXJzLkhhbmRsZXIuUG9pbnQseydkaXNwbGF5Q2xhc3Mn OidvbENvbnRyb2xEcmF3RmVhdHVyZVBvaW50J30pLG5ldyBPcGVuTGF5ZXJzLkNv bnRyb2wuRHJhd0ZlYXR1cmUobGF5ZXIsT3BlbkxheWVycy5IYW5kbGVyLlBhdGgs eydkaXNwbGF5Q2xhc3MnOidvbENvbnRyb2xEcmF3RmVhdHVyZVBhdGgnfSksbmV3 IE9wZW5MYXllcnMuQ29udHJvbC5EcmF3RmVhdHVyZShsYXllcixPcGVuTGF5ZXJz LkhhbmRsZXIuUG9seWdvbix7J2Rpc3BsYXlDbGFzcyc6J29sQ29udHJvbERyYXdG ZWF0dXJlUG9seWdvbid9KV07dGhpcy5hZGRDb250cm9scyhjb250cm9scyk7fSxk cmF3OmZ1bmN0aW9uKCl7dmFyIGRpdj1PcGVuTGF5ZXJzLkNvbnRyb2wuUGFuZWwu cHJvdG90eXBlLmRyYXcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKHRoaXMuZGVm YXVsdENvbnRyb2w9PT1udWxsKXt0aGlzLmRlZmF1bHRDb250cm9sPXRoaXMuY29u dHJvbHNbMF07fQpyZXR1cm4gZGl2O30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5D b250cm9sLkVkaXRpbmdUb29sYmFyIn0pO09wZW5MYXllcnMuU3RyYXRlZ3kuQkJP WD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuU3RyYXRlZ3kse2JvdW5kczpu dWxsLHJlc29sdXRpb246bnVsbCxyYXRpbzoyLHJlc0ZhY3RvcjpudWxsLHJlc3Bv bnNlOm51bGwsYWN0aXZhdGU6ZnVuY3Rpb24oKXt2YXIgYWN0aXZhdGVkPU9wZW5M YXllcnMuU3RyYXRlZ3kucHJvdG90eXBlLmFjdGl2YXRlLmNhbGwodGhpcyk7aWYo YWN0aXZhdGVkKXt0aGlzLmxheWVyLmV2ZW50cy5vbih7Im1vdmVlbmQiOnRoaXMu dXBkYXRlLHNjb3BlOnRoaXN9KTt0aGlzLmxheWVyLmV2ZW50cy5vbih7InJlZnJl c2giOnRoaXMudXBkYXRlLHNjb3BlOnRoaXN9KTtpZih0aGlzLmxheWVyLnZpc2li aWxpdHk9PT10cnVlJiZ0aGlzLmxheWVyLmluUmFuZ2U9PT10cnVlKXt0aGlzLnVw ZGF0ZSgpO31lbHNle3RoaXMubGF5ZXIuZXZlbnRzLm9uKHsidmlzaWJpbGl0eWNo YW5nZWQiOnRoaXMudXBkYXRlLHNjb3BlOnRoaXN9KTt9fQpyZXR1cm4gYWN0aXZh dGVkO30sZGVhY3RpdmF0ZTpmdW5jdGlvbigpe3ZhciBkZWFjdGl2YXRlZD1PcGVu TGF5ZXJzLlN0cmF0ZWd5LnByb3RvdHlwZS5kZWFjdGl2YXRlLmNhbGwodGhpcyk7 aWYoZGVhY3RpdmF0ZWQpe3RoaXMubGF5ZXIuZXZlbnRzLnVuKHsibW92ZWVuZCI6 dGhpcy51cGRhdGUsInJlZnJlc2giOnRoaXMudXBkYXRlLCJ2aXNpYmlsaXR5Y2hh bmdlZCI6dGhpcy51cGRhdGUsc2NvcGU6dGhpc30pO30KcmV0dXJuIGRlYWN0aXZh dGVkO30sdXBkYXRlOmZ1bmN0aW9uKG9wdGlvbnMpe3ZhciBtYXBCb3VuZHM9dGhp cy5nZXRNYXBCb3VuZHMoKTtpZihtYXBCb3VuZHMhPT1udWxsJiYoKG9wdGlvbnMm Jm9wdGlvbnMuZm9yY2UpfHx0aGlzLmludmFsaWRCb3VuZHMobWFwQm91bmRzKSkp e3RoaXMuY2FsY3VsYXRlQm91bmRzKG1hcEJvdW5kcyk7dGhpcy5yZXNvbHV0aW9u PXRoaXMubGF5ZXIubWFwLmdldFJlc29sdXRpb24oKTt0aGlzLnRyaWdnZXJSZWFk KG9wdGlvbnMpO319LGdldE1hcEJvdW5kczpmdW5jdGlvbigpe2lmKHRoaXMubGF5 ZXIubWFwPT09bnVsbCl7cmV0dXJuIG51bGw7fQp2YXIgYm91bmRzPXRoaXMubGF5 ZXIubWFwLmdldEV4dGVudCgpO2lmKGJvdW5kcyYmIXRoaXMubGF5ZXIucHJvamVj dGlvbi5lcXVhbHModGhpcy5sYXllci5tYXAuZ2V0UHJvamVjdGlvbk9iamVjdCgp KSl7Ym91bmRzPWJvdW5kcy5jbG9uZSgpLnRyYW5zZm9ybSh0aGlzLmxheWVyLm1h cC5nZXRQcm9qZWN0aW9uT2JqZWN0KCksdGhpcy5sYXllci5wcm9qZWN0aW9uKTt9 CnJldHVybiBib3VuZHM7fSxpbnZhbGlkQm91bmRzOmZ1bmN0aW9uKG1hcEJvdW5k cyl7aWYoIW1hcEJvdW5kcyl7bWFwQm91bmRzPXRoaXMuZ2V0TWFwQm91bmRzKCk7 fQp2YXIgaW52YWxpZD0hdGhpcy5ib3VuZHN8fCF0aGlzLmJvdW5kcy5jb250YWlu c0JvdW5kcyhtYXBCb3VuZHMpO2lmKCFpbnZhbGlkJiZ0aGlzLnJlc0ZhY3Rvcil7 dmFyIHJhdGlvPXRoaXMucmVzb2x1dGlvbi90aGlzLmxheWVyLm1hcC5nZXRSZXNv bHV0aW9uKCk7aW52YWxpZD0ocmF0aW8+PXRoaXMucmVzRmFjdG9yfHxyYXRpbzw9 KDEvdGhpcy5yZXNGYWN0b3IpKTt9CnJldHVybiBpbnZhbGlkO30sY2FsY3VsYXRl Qm91bmRzOmZ1bmN0aW9uKG1hcEJvdW5kcyl7aWYoIW1hcEJvdW5kcyl7bWFwQm91 bmRzPXRoaXMuZ2V0TWFwQm91bmRzKCk7fQp2YXIgY2VudGVyPW1hcEJvdW5kcy5n ZXRDZW50ZXJMb25MYXQoKTt2YXIgZGF0YVdpZHRoPW1hcEJvdW5kcy5nZXRXaWR0 aCgpKnRoaXMucmF0aW87dmFyIGRhdGFIZWlnaHQ9bWFwQm91bmRzLmdldEhlaWdo dCgpKnRoaXMucmF0aW87dGhpcy5ib3VuZHM9bmV3IE9wZW5MYXllcnMuQm91bmRz KGNlbnRlci5sb24tKGRhdGFXaWR0aC8yKSxjZW50ZXIubGF0LShkYXRhSGVpZ2h0 LzIpLGNlbnRlci5sb24rKGRhdGFXaWR0aC8yKSxjZW50ZXIubGF0KyhkYXRhSGVp Z2h0LzIpKTt9LHRyaWdnZXJSZWFkOmZ1bmN0aW9uKG9wdGlvbnMpe2lmKHRoaXMu cmVzcG9uc2Upe3RoaXMubGF5ZXIucHJvdG9jb2wuYWJvcnQodGhpcy5yZXNwb25z ZSk7dGhpcy5sYXllci5ldmVudHMudHJpZ2dlckV2ZW50KCJsb2FkZW5kIik7fQp0 aGlzLmxheWVyLmV2ZW50cy50cmlnZ2VyRXZlbnQoImxvYWRzdGFydCIpO3RoaXMu cmVzcG9uc2U9dGhpcy5sYXllci5wcm90b2NvbC5yZWFkKE9wZW5MYXllcnMuVXRp bC5hcHBseURlZmF1bHRzKHtmaWx0ZXI6dGhpcy5jcmVhdGVGaWx0ZXIoKSxjYWxs YmFjazp0aGlzLm1lcmdlLHNjb3BlOnRoaXN9LG9wdGlvbnMpKTt9LGNyZWF0ZUZp bHRlcjpmdW5jdGlvbigpe3ZhciBmaWx0ZXI9bmV3IE9wZW5MYXllcnMuRmlsdGVy LlNwYXRpYWwoe3R5cGU6T3BlbkxheWVycy5GaWx0ZXIuU3BhdGlhbC5CQk9YLHZh bHVlOnRoaXMuYm91bmRzLHByb2plY3Rpb246dGhpcy5sYXllci5wcm9qZWN0aW9u fSk7aWYodGhpcy5sYXllci5maWx0ZXIpe2ZpbHRlcj1uZXcgT3BlbkxheWVycy5G aWx0ZXIuTG9naWNhbCh7dHlwZTpPcGVuTGF5ZXJzLkZpbHRlci5Mb2dpY2FsLkFO RCxmaWx0ZXJzOlt0aGlzLmxheWVyLmZpbHRlcixmaWx0ZXJdfSk7fQpyZXR1cm4g ZmlsdGVyO30sbWVyZ2U6ZnVuY3Rpb24ocmVzcCl7dGhpcy5sYXllci5kZXN0cm95 RmVhdHVyZXMoKTt2YXIgZmVhdHVyZXM9cmVzcC5mZWF0dXJlcztpZihmZWF0dXJl cyYmZmVhdHVyZXMubGVuZ3RoPjApe3ZhciByZW1vdGU9dGhpcy5sYXllci5wcm9q ZWN0aW9uO3ZhciBsb2NhbD10aGlzLmxheWVyLm1hcC5nZXRQcm9qZWN0aW9uT2Jq ZWN0KCk7aWYoIWxvY2FsLmVxdWFscyhyZW1vdGUpKXt2YXIgZ2VvbTtmb3IodmFy IGk9MCxsZW49ZmVhdHVyZXMubGVuZ3RoO2k8bGVuOysraSl7Z2VvbT1mZWF0dXJl c1tpXS5nZW9tZXRyeTtpZihnZW9tKXtnZW9tLnRyYW5zZm9ybShyZW1vdGUsbG9j YWwpO319fQp0aGlzLmxheWVyLmFkZEZlYXR1cmVzKGZlYXR1cmVzKTt9CnRoaXMu cmVzcG9uc2U9bnVsbDt0aGlzLmxheWVyLmV2ZW50cy50cmlnZ2VyRXZlbnQoImxv YWRlbmQiKTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuU3RyYXRlZ3kuQkJPWCJ9 KTtPcGVuTGF5ZXJzLkxheWVyLldvcmxkV2luZD1PcGVuTGF5ZXJzLkNsYXNzKE9w ZW5MYXllcnMuTGF5ZXIuR3JpZCx7REVGQVVMVF9QQVJBTVM6e30saXNCYXNlTGF5 ZXI6dHJ1ZSxsemQ6bnVsbCx6b29tTGV2ZWxzOm51bGwsaW5pdGlhbGl6ZTpmdW5j dGlvbihuYW1lLHVybCxsemQsem9vbUxldmVscyxwYXJhbXMsb3B0aW9ucyl7dGhp cy5semQ9bHpkO3RoaXMuem9vbUxldmVscz16b29tTGV2ZWxzO3ZhciBuZXdBcmd1 bWVudHM9W107bmV3QXJndW1lbnRzLnB1c2gobmFtZSx1cmwscGFyYW1zLG9wdGlv bnMpO09wZW5MYXllcnMuTGF5ZXIuR3JpZC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5h cHBseSh0aGlzLG5ld0FyZ3VtZW50cyk7dGhpcy5wYXJhbXM9T3BlbkxheWVycy5V dGlsLmFwcGx5RGVmYXVsdHModGhpcy5wYXJhbXMsdGhpcy5ERUZBVUxUX1BBUkFN Uyk7fSxnZXRab29tOmZ1bmN0aW9uKCl7dmFyIHpvb209dGhpcy5tYXAuZ2V0Wm9v bSgpO3ZhciBleHRlbnQ9dGhpcy5tYXAuZ2V0TWF4RXh0ZW50KCk7em9vbT16b29t LU1hdGgubG9nKHRoaXMubWF4UmVzb2x1dGlvbi8odGhpcy5semQvNTEyKSkvTWF0 aC5sb2coMik7cmV0dXJuIHpvb207fSxnZXRVUkw6ZnVuY3Rpb24oYm91bmRzKXti b3VuZHM9dGhpcy5hZGp1c3RCb3VuZHMoYm91bmRzKTt2YXIgem9vbT10aGlzLmdl dFpvb20oKTt2YXIgZXh0ZW50PXRoaXMubWFwLmdldE1heEV4dGVudCgpO3ZhciBk ZWc9dGhpcy5semQvTWF0aC5wb3coMix0aGlzLmdldFpvb20oKSk7dmFyIHg9TWF0 aC5mbG9vcigoYm91bmRzLmxlZnQtZXh0ZW50LmxlZnQpL2RlZyk7dmFyIHk9TWF0 aC5mbG9vcigoYm91bmRzLmJvdHRvbS1leHRlbnQuYm90dG9tKS9kZWcpO2lmKHRo aXMubWFwLmdldFJlc29sdXRpb24oKTw9KHRoaXMubHpkLzUxMikmJnRoaXMuZ2V0 Wm9vbSgpPD10aGlzLnpvb21MZXZlbHMpe3JldHVybiB0aGlzLmdldEZ1bGxSZXF1 ZXN0U3RyaW5nKHtMOnpvb20sWDp4LFk6eX0pO31lbHNle3JldHVybiBPcGVuTGF5 ZXJzLlV0aWwuZ2V0SW1hZ2VzTG9jYXRpb24oKSsiYmxhbmsuZ2lmIjt9fSxDTEFT U19OQU1FOiJPcGVuTGF5ZXJzLkxheWVyLldvcmxkV2luZCJ9KTtPcGVuTGF5ZXJz LkZvcm1hdC5XTVRTQ2FwYWJpbGl0aWVzPU9wZW5MYXllcnMuQ2xhc3MoT3Blbkxh eWVycy5Gb3JtYXQuWE1MLlZlcnNpb25lZE9HQyx7ZGVmYXVsdFZlcnNpb246IjEu MC4wIix5eDp7InVybjpvZ2M6ZGVmOmNyczpFUFNHOjo0MzI2Ijp0cnVlfSxjcmVh dGVMYXllcjpmdW5jdGlvbihjYXBhYmlsaXRpZXMsY29uZmlnKXt2YXIgbGF5ZXI7 dmFyIHJlcXVpcmVkPXtsYXllcjp0cnVlLG1hdHJpeFNldDp0cnVlfTtmb3IodmFy IHByb3AgaW4gcmVxdWlyZWQpe2lmKCEocHJvcCBpbiBjb25maWcpKXt0aHJvdyBu ZXcgRXJyb3IoIk1pc3NpbmcgcHJvcGVydHkgJyIrcHJvcCsiJyBpbiBsYXllciBj b25maWd1cmF0aW9uLiIpO319CnZhciBjb250ZW50cz1jYXBhYmlsaXRpZXMuY29u dGVudHM7dmFyIG1hdHJpeFNldD1jb250ZW50cy50aWxlTWF0cml4U2V0c1tjb25m aWcubWF0cml4U2V0XTt2YXIgbGF5ZXJzPWNvbnRlbnRzLmxheWVyczt2YXIgbGF5 ZXJEZWY7Zm9yKHZhciBpPTAsaWk9Y29udGVudHMubGF5ZXJzLmxlbmd0aDtpPGlp OysraSl7aWYoY29udGVudHMubGF5ZXJzW2ldLmlkZW50aWZpZXI9PT1jb25maWcu bGF5ZXIpe2xheWVyRGVmPWNvbnRlbnRzLmxheWVyc1tpXTticmVhazt9fQppZihs YXllckRlZiYmbWF0cml4U2V0KXt2YXIgc3R5bGU7Zm9yKHZhciBpPTAsaWk9bGF5 ZXJEZWYuc3R5bGVzLmxlbmd0aDtpPGlpOysraSl7c3R5bGU9bGF5ZXJEZWYuc3R5 bGVzW2ldO2lmKHN0eWxlLmlzRGVmYXVsdCl7YnJlYWs7fX0KbGF5ZXI9bmV3IE9w ZW5MYXllcnMuTGF5ZXIuV01UUyhPcGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0 cyhjb25maWcse3VybDpjYXBhYmlsaXRpZXMub3BlcmF0aW9uc01ldGFkYXRhLkdl dFRpbGUuZGNwLmh0dHAuZ2V0LG5hbWU6bGF5ZXJEZWYudGl0bGUsc3R5bGU6c3R5 bGUuaWRlbnRpZmllcixtYXRyaXhJZHM6bWF0cml4U2V0Lm1hdHJpeElkc30pKTt9 CnJldHVybiBsYXllcjt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0LldN VFNDYXBhYmlsaXRpZXMifSk7T3BlbkxheWVycy5MYXllci5Hb29nbGUudjM9e0RF RkFVTFRTOnttYXhFeHRlbnQ6bmV3IE9wZW5MYXllcnMuQm91bmRzKC0xMjgqMTU2 NTQzLjAzMzkwNjI1LC0xMjgqMTU2NTQzLjAzMzkwNjI1LDEyOCoxNTY1NDMuMDMz OTA2MjUsMTI4KjE1NjU0My4wMzM5MDYyNSksc3BoZXJpY2FsTWVyY2F0b3I6dHJ1 ZSxtYXhSZXNvbHV0aW9uOjE1NjU0My4wMzM5MDYyNSx1bml0czoibSIscHJvamVj dGlvbjoiRVBTRzo5MDA5MTMifSxhbmltYXRpb25FbmFibGVkOnRydWUsbG9hZE1h cE9iamVjdDpmdW5jdGlvbigpe2lmKCF0aGlzLnR5cGUpe3RoaXMudHlwZT1nb29n bGUubWFwcy5NYXBUeXBlSWQuUk9BRE1BUDt9CnZhciBtYXBPYmplY3Q7dmFyIGNh Y2hlPU9wZW5MYXllcnMuTGF5ZXIuR29vZ2xlLmNhY2hlW3RoaXMubWFwLmlkXTtp ZihjYWNoZSl7bWFwT2JqZWN0PWNhY2hlLm1hcE9iamVjdDsrK2NhY2hlLmNvdW50 O31lbHNle3ZhciBjb250YWluZXI9dGhpcy5tYXAudmlld1BvcnREaXY7dmFyIGRp dj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkaXYuaWQ9dGhpcy5tYXAu aWQrIl9HTWFwQ29udGFpbmVyIjtkaXYuc3R5bGUucG9zaXRpb249ImFic29sdXRl IjtkaXYuc3R5bGUud2lkdGg9IjEwMCUiO2Rpdi5zdHlsZS5oZWlnaHQ9IjEwMCUi O2NvbnRhaW5lci5hcHBlbmRDaGlsZChkaXYpO3ZhciBjZW50ZXI9dGhpcy5tYXAu Z2V0Q2VudGVyKCk7bWFwT2JqZWN0PW5ldyBnb29nbGUubWFwcy5NYXAoZGl2LHtj ZW50ZXI6Y2VudGVyP25ldyBnb29nbGUubWFwcy5MYXRMbmcoY2VudGVyLmxhdCxj ZW50ZXIubG9uKTpuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKDAsMCksem9vbTp0aGlz Lm1hcC5nZXRab29tKCl8fDAsbWFwVHlwZUlkOnRoaXMudHlwZSxkaXNhYmxlRGVm YXVsdFVJOnRydWUsa2V5Ym9hcmRTaG9ydGN1dHM6ZmFsc2UsZHJhZ2dhYmxlOmZh bHNlLGRpc2FibGVEb3VibGVDbGlja1pvb206dHJ1ZSxzY3JvbGx3aGVlbDpmYWxz ZSxzdHJlZXRWaWV3Q29udHJvbDpmYWxzZX0pO2NhY2hlPXttYXBPYmplY3Q6bWFw T2JqZWN0LGNvdW50OjF9O09wZW5MYXllcnMuTGF5ZXIuR29vZ2xlLmNhY2hlW3Ro aXMubWFwLmlkXT1jYWNoZTt0aGlzLnJlcG9zaXRpb25MaXN0ZW5lcj1nb29nbGUu bWFwcy5ldmVudC5hZGRMaXN0ZW5lck9uY2UobWFwT2JqZWN0LCJjZW50ZXJfY2hh bmdlZCIsT3BlbkxheWVycy5GdW5jdGlvbi5iaW5kKHRoaXMucmVwb3NpdGlvbk1h cEVsZW1lbnRzLHRoaXMpKTt9CnRoaXMubWFwT2JqZWN0PW1hcE9iamVjdDt0aGlz LnNldEdNYXBWaXNpYmlsaXR5KHRoaXMudmlzaWJpbGl0eSk7fSxyZXBvc2l0aW9u TWFwRWxlbWVudHM6ZnVuY3Rpb24oKXtnb29nbGUubWFwcy5ldmVudC50cmlnZ2Vy KHRoaXMubWFwT2JqZWN0LCJyZXNpemUiKTt2YXIgZGl2PXRoaXMubWFwT2JqZWN0 LmdldERpdigpLmZpcnN0Q2hpbGQ7aWYoIWRpdnx8ZGl2LmNoaWxkTm9kZXMubGVu Z3RoPDMpe3RoaXMucmVwb3NpdGlvblRpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KE9w ZW5MYXllcnMuRnVuY3Rpb24uYmluZCh0aGlzLnJlcG9zaXRpb25NYXBFbGVtZW50 cyx0aGlzKSwyNTApO3JldHVybiBmYWxzZTt9CnZhciBjYWNoZT1PcGVuTGF5ZXJz LkxheWVyLkdvb2dsZS5jYWNoZVt0aGlzLm1hcC5pZF07dmFyIGNvbnRhaW5lcj10 aGlzLm1hcC52aWV3UG9ydERpdjt3aGlsZShkaXYubGFzdENoaWxkLnN0eWxlLmRp c3BsYXk9PSJub25lIil7Y29udGFpbmVyLmFwcGVuZENoaWxkKGRpdi5sYXN0Q2hp bGQpO30KdmFyIHRlcm1zT2ZVc2U9ZGl2Lmxhc3RDaGlsZDtjb250YWluZXIuYXBw ZW5kQ2hpbGQodGVybXNPZlVzZSk7dGVybXNPZlVzZS5zdHlsZS56SW5kZXg9IjEx MDAiO3Rlcm1zT2ZVc2Uuc3R5bGUuYm90dG9tPSIiO3Rlcm1zT2ZVc2UuY2xhc3NO YW1lPSJvbExheWVyR29vZ2xlQ29weXJpZ2h0IG9sTGF5ZXJHb29nbGVWMyI7dGVy bXNPZlVzZS5zdHlsZS5kaXNwbGF5PSIiO2NhY2hlLnRlcm1zT2ZVc2U9dGVybXNP ZlVzZTt2YXIgcG93ZXJlZEJ5PWRpdi5sYXN0Q2hpbGQ7Y29udGFpbmVyLmFwcGVu ZENoaWxkKHBvd2VyZWRCeSk7cG93ZXJlZEJ5LnN0eWxlLnpJbmRleD0iMTEwMCI7 cG93ZXJlZEJ5LnN0eWxlLmJvdHRvbT0iIjtwb3dlcmVkQnkuY2xhc3NOYW1lPSJv bExheWVyR29vZ2xlUG93ZXJlZEJ5IG9sTGF5ZXJHb29nbGVWMyBnbW5vcHJpbnQi O3Bvd2VyZWRCeS5zdHlsZS5kaXNwbGF5PSIiO2NhY2hlLnBvd2VyZWRCeT1wb3dl cmVkQnk7dGhpcy5zZXRHTWFwVmlzaWJpbGl0eSh0aGlzLnZpc2liaWxpdHkpO30s b25NYXBSZXNpemU6ZnVuY3Rpb24oKXtpZih0aGlzLnZpc2liaWxpdHkpe2dvb2ds ZS5tYXBzLmV2ZW50LnRyaWdnZXIodGhpcy5tYXBPYmplY3QsInJlc2l6ZSIpO31l bHNle3ZhciBjYWNoZT1PcGVuTGF5ZXJzLkxheWVyLkdvb2dsZS5jYWNoZVt0aGlz Lm1hcC5pZF07aWYoIWNhY2hlLnJlc2l6ZWQpe3ZhciBsYXllcj10aGlzO2dvb2ds ZS5tYXBzLmV2ZW50LmFkZExpc3RlbmVyT25jZSh0aGlzLm1hcE9iamVjdCwidGls ZXNsb2FkZWQiLGZ1bmN0aW9uKCl7Z29vZ2xlLm1hcHMuZXZlbnQudHJpZ2dlcihs YXllci5tYXBPYmplY3QsInJlc2l6ZSIpO2xheWVyLm1vdmVUbyhsYXllci5tYXAu Z2V0Q2VudGVyKCksbGF5ZXIubWFwLmdldFpvb20oKSk7ZGVsZXRlIGNhY2hlLnJl c2l6ZWQ7fSk7fQpjYWNoZS5yZXNpemVkPXRydWU7fX0sc2V0R01hcFZpc2liaWxp dHk6ZnVuY3Rpb24odmlzaWJsZSl7dmFyIGNhY2hlPU9wZW5MYXllcnMuTGF5ZXIu R29vZ2xlLmNhY2hlW3RoaXMubWFwLmlkXTtpZihjYWNoZSl7dmFyIHR5cGU9dGhp cy50eXBlO3ZhciBsYXllcnM9dGhpcy5tYXAubGF5ZXJzO3ZhciBsYXllcjtmb3Io dmFyIGk9bGF5ZXJzLmxlbmd0aC0xO2k+PTA7LS1pKXtsYXllcj1sYXllcnNbaV07 aWYobGF5ZXIgaW5zdGFuY2VvZiBPcGVuTGF5ZXJzLkxheWVyLkdvb2dsZSYmbGF5 ZXIudmlzaWJpbGl0eT09PXRydWUmJmxheWVyLmluUmFuZ2U9PT10cnVlKXt0eXBl PWxheWVyLnR5cGU7dmlzaWJsZT10cnVlO2JyZWFrO319CnZhciBjb250YWluZXI9 dGhpcy5tYXBPYmplY3QuZ2V0RGl2KCk7aWYodmlzaWJsZT09PXRydWUpe3RoaXMu bWFwT2JqZWN0LnNldE1hcFR5cGVJZCh0eXBlKTtjb250YWluZXIuc3R5bGUubGVm dD0iIjtpZihjYWNoZS50ZXJtc09mVXNlJiZjYWNoZS50ZXJtc09mVXNlLnN0eWxl KXtjYWNoZS50ZXJtc09mVXNlLnN0eWxlLmxlZnQ9IiI7Y2FjaGUudGVybXNPZlVz ZS5zdHlsZS5kaXNwbGF5PSIiO2NhY2hlLnBvd2VyZWRCeS5zdHlsZS5kaXNwbGF5 PSIiO30KY2FjaGUuZGlzcGxheWVkPXRoaXMuaWQ7fWVsc2V7ZGVsZXRlIGNhY2hl LmRpc3BsYXllZDtjb250YWluZXIuc3R5bGUubGVmdD0iLTk5OTlweCI7aWYoY2Fj aGUudGVybXNPZlVzZSYmY2FjaGUudGVybXNPZlVzZS5zdHlsZSl7Y2FjaGUudGVy bXNPZlVzZS5zdHlsZS5kaXNwbGF5PSJub25lIjtjYWNoZS50ZXJtc09mVXNlLnN0 eWxlLmxlZnQ9Ii05OTk5cHgiO2NhY2hlLnBvd2VyZWRCeS5zdHlsZS5kaXNwbGF5 PSJub25lIjt9fX19LGdldE1hcENvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiB0 aGlzLm1hcE9iamVjdC5nZXREaXYoKTt9LGdldE1hcE9iamVjdEJvdW5kc0Zyb21P TEJvdW5kczpmdW5jdGlvbihvbEJvdW5kcyl7dmFyIG1vQm91bmRzPW51bGw7aWYo b2xCb3VuZHMhPW51bGwpe3ZhciBzdz10aGlzLnNwaGVyaWNhbE1lcmNhdG9yP3Ro aXMuaW52ZXJzZU1lcmNhdG9yKG9sQm91bmRzLmJvdHRvbSxvbEJvdW5kcy5sZWZ0 KTpuZXcgT3BlbkxheWVycy5Mb25MYXQob2xCb3VuZHMuYm90dG9tLG9sQm91bmRz LmxlZnQpO3ZhciBuZT10aGlzLnNwaGVyaWNhbE1lcmNhdG9yP3RoaXMuaW52ZXJz ZU1lcmNhdG9yKG9sQm91bmRzLnRvcCxvbEJvdW5kcy5yaWdodCk6bmV3IE9wZW5M YXllcnMuTG9uTGF0KG9sQm91bmRzLnRvcCxvbEJvdW5kcy5yaWdodCk7bW9Cb3Vu ZHM9bmV3IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kcyhuZXcgZ29vZ2xlLm1hcHMu TGF0TG5nKHN3LmxhdCxzdy5sb24pLG5ldyBnb29nbGUubWFwcy5MYXRMbmcobmUu bGF0LG5lLmxvbikpO30KcmV0dXJuIG1vQm91bmRzO30sZ2V0TWFwT2JqZWN0TG9u TGF0RnJvbU1hcE9iamVjdFBpeGVsOmZ1bmN0aW9uKG1vUGl4ZWwpe3ZhciBzaXpl PXRoaXMubWFwLmdldFNpemUoKTt2YXIgbG9uPXRoaXMuZ2V0TG9uZ2l0dWRlRnJv bU1hcE9iamVjdExvbkxhdCh0aGlzLm1hcE9iamVjdC5jZW50ZXIpO3ZhciBsYXQ9 dGhpcy5nZXRMYXRpdHVkZUZyb21NYXBPYmplY3RMb25MYXQodGhpcy5tYXBPYmpl Y3QuY2VudGVyKTt2YXIgcmVzPXRoaXMubWFwLmdldFJlc29sdXRpb24oKTt2YXIg ZGVsdGFfeD1tb1BpeGVsLngtKHNpemUudy8yKTt2YXIgZGVsdGFfeT1tb1BpeGVs LnktKHNpemUuaC8yKTt2YXIgbG9ubGF0PW5ldyBPcGVuTGF5ZXJzLkxvbkxhdChs b24rZGVsdGFfeCpyZXMsbGF0LWRlbHRhX3kqcmVzKTtpZih0aGlzLndyYXBEYXRl TGluZSl7bG9ubGF0PWxvbmxhdC53cmFwRGF0ZUxpbmUodGhpcy5tYXhFeHRlbnQp O30KcmV0dXJuIHRoaXMuZ2V0TWFwT2JqZWN0TG9uTGF0RnJvbUxvbkxhdChsb25s YXQubG9uLGxvbmxhdC5sYXQpO30sZ2V0TWFwT2JqZWN0UGl4ZWxGcm9tTWFwT2Jq ZWN0TG9uTGF0OmZ1bmN0aW9uKG1vTG9uTGF0KXt2YXIgbG9uPXRoaXMuZ2V0TG9u Z2l0dWRlRnJvbU1hcE9iamVjdExvbkxhdChtb0xvbkxhdCk7dmFyIGxhdD10aGlz LmdldExhdGl0dWRlRnJvbU1hcE9iamVjdExvbkxhdChtb0xvbkxhdCk7dmFyIHJl cz10aGlzLm1hcC5nZXRSZXNvbHV0aW9uKCk7dmFyIGV4dGVudD10aGlzLm1hcC5n ZXRFeHRlbnQoKTt2YXIgcHg9bmV3IE9wZW5MYXllcnMuUGl4ZWwoKDEvcmVzKihs b24tZXh0ZW50LmxlZnQpKSwoMS9yZXMqKGV4dGVudC50b3AtbGF0KSkpO3JldHVy biB0aGlzLmdldE1hcE9iamVjdFBpeGVsRnJvbVhZKHB4LngscHgueSk7fSxzZXRN YXBPYmplY3RDZW50ZXI6ZnVuY3Rpb24oY2VudGVyLHpvb20pe2lmKHRoaXMuYW5p bWF0aW9uRW5hYmxlZD09PWZhbHNlJiZ6b29tIT10aGlzLm1hcE9iamVjdC56b29t KXt2YXIgbWFwQ29udGFpbmVyPXRoaXMuZ2V0TWFwQ29udGFpbmVyKCk7Z29vZ2xl Lm1hcHMuZXZlbnQuYWRkTGlzdGVuZXJPbmNlKHRoaXMubWFwT2JqZWN0LCJpZGxl IixmdW5jdGlvbigpe21hcENvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5PSIiO30p O21hcENvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO30KdGhpcy5t YXBPYmplY3Quc2V0T3B0aW9ucyh7Y2VudGVyOmNlbnRlcix6b29tOnpvb219KTt9 LGdldE1hcE9iamVjdFpvb21Gcm9tTWFwT2JqZWN0Qm91bmRzOmZ1bmN0aW9uKG1v Qm91bmRzKXtyZXR1cm4gdGhpcy5tYXBPYmplY3QuZ2V0Qm91bmRzWm9vbUxldmVs KG1vQm91bmRzKTt9LGdldE1hcE9iamVjdExvbkxhdEZyb21Mb25MYXQ6ZnVuY3Rp b24obG9uLGxhdCl7dmFyIGdMYXRMbmc7aWYodGhpcy5zcGhlcmljYWxNZXJjYXRv cil7dmFyIGxvbmxhdD10aGlzLmludmVyc2VNZXJjYXRvcihsb24sbGF0KTtnTGF0 TG5nPW5ldyBnb29nbGUubWFwcy5MYXRMbmcobG9ubGF0LmxhdCxsb25sYXQubG9u KTt9ZWxzZXtnTGF0TG5nPW5ldyBnb29nbGUubWFwcy5MYXRMbmcobGF0LGxvbik7 fQpyZXR1cm4gZ0xhdExuZzt9LGdldE1hcE9iamVjdFBpeGVsRnJvbVhZOmZ1bmN0 aW9uKHgseSl7cmV0dXJuIG5ldyBnb29nbGUubWFwcy5Qb2ludCh4LHkpO30sZGVz dHJveTpmdW5jdGlvbigpe2lmKHRoaXMucmVwb3NpdGlvbkxpc3RlbmVyKXtnb29n bGUubWFwcy5ldmVudC5yZW1vdmVMaXN0ZW5lcih0aGlzLnJlcG9zaXRpb25MaXN0 ZW5lcik7fQppZih0aGlzLnJlcG9zaXRpb25UaW1lcil7d2luZG93LmNsZWFyVGlt ZW91dCh0aGlzLnJlcG9zaXRpb25UaW1lcik7fQpPcGVuTGF5ZXJzLkxheWVyLkdv b2dsZS5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fX07 T3BlbkxheWVycy5Gb3JtYXQuV1BTRGVzY3JpYmVQcm9jZXNzPU9wZW5MYXllcnMu Q2xhc3MoT3BlbkxheWVycy5Gb3JtYXQuWE1MLHtWRVJTSU9OOiIxLjAuMCIsbmFt ZXNwYWNlczp7d3BzOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3dwcy8xLjAuMCIs b3dzOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L293cy8xLjEiLHhzaToiaHR0cDov L3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UifSxzY2hlbWFMb2Nh dGlvbjoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC93cHMvMS4wLjAgaHR0cDovL3Nj aGVtYXMub3Blbmdpcy5uZXQvd3BzLzEuMC4wL3dwc0FsbC54c2QiLGRlZmF1bHRQ cmVmaXg6IndwcyIscmVnRXhlczp7dHJpbVNwYWNlOigvXlxzKnxccyokL2cpLHJl bW92ZVNwYWNlOigvXHMqL2cpLHNwbGl0U3BhY2U6KC9ccysvKSx0cmltQ29tbWE6 KC9ccyosXHMqL2cpfSxyZWFkOmZ1bmN0aW9uKGRhdGEpe2lmKHR5cGVvZiBkYXRh PT0ic3RyaW5nIil7ZGF0YT1PcGVuTGF5ZXJzLkZvcm1hdC5YTUwucHJvdG90eXBl LnJlYWQuYXBwbHkodGhpcyxbZGF0YV0pO30KaWYoZGF0YSYmZGF0YS5ub2RlVHlw ZT09OSl7ZGF0YT1kYXRhLmRvY3VtZW50RWxlbWVudDt9CnZhciBpbmZvPXt9O3Ro aXMucmVhZE5vZGUoZGF0YSxpbmZvKTtyZXR1cm4gaW5mbzt9LHJlYWRlcnM6eyJ3 cHMiOnsiUHJvY2Vzc0Rlc2NyaXB0aW9ucyI6ZnVuY3Rpb24obm9kZSxvYmope29i ai5wcm9jZXNzRGVzY3JpcHRpb25zPXt9O3RoaXMucmVhZENoaWxkTm9kZXMobm9k ZSxvYmoucHJvY2Vzc0Rlc2NyaXB0aW9ucyk7fSwiUHJvY2Vzc0Rlc2NyaXB0aW9u IjpmdW5jdGlvbihub2RlLHByb2Nlc3NEZXNjcmlwdGlvbnMpe3ZhciBwcm9jZXNz VmVyc2lvbj10aGlzLmdldEF0dHJpYnV0ZU5TKG5vZGUsdGhpcy5uYW1lc3BhY2Vz LndwcywicHJvY2Vzc1ZlcnNpb24iKTt2YXIgcHJvY2Vzc0Rlc2NyaXB0aW9uPXtw cm9jZXNzVmVyc2lvbjpwcm9jZXNzVmVyc2lvbixzdGF0dXNTdXBwb3J0ZWQ6KG5v ZGUuZ2V0QXR0cmlidXRlKCJzdGF0dXNTdXBwb3J0ZWQiKT09PSJ0cnVlIiksc3Rv cmVTdXBwb3J0ZWQ6KG5vZGUuZ2V0QXR0cmlidXRlKCJzdG9yZVN1cHBvcnRlZCIp PT09InRydWUiKX07dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLHByb2Nlc3NEZXNj cmlwdGlvbik7cHJvY2Vzc0Rlc2NyaXB0aW9uc1twcm9jZXNzRGVzY3JpcHRpb24u aWRlbnRpZmllcl09cHJvY2Vzc0Rlc2NyaXB0aW9uO30sIkRhdGFJbnB1dHMiOmZ1 bmN0aW9uKG5vZGUscHJvY2Vzc0Rlc2NyaXB0aW9uKXtwcm9jZXNzRGVzY3JpcHRp b24uZGF0YUlucHV0cz1bXTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUscHJvY2Vz c0Rlc2NyaXB0aW9uLmRhdGFJbnB1dHMpO30sIlByb2Nlc3NPdXRwdXRzIjpmdW5j dGlvbihub2RlLHByb2Nlc3NEZXNjcmlwdGlvbil7cHJvY2Vzc0Rlc2NyaXB0aW9u LnByb2Nlc3NPdXRwdXRzPVtdO3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxwcm9j ZXNzRGVzY3JpcHRpb24ucHJvY2Vzc091dHB1dHMpO30sIk91dHB1dCI6ZnVuY3Rp b24obm9kZSxwcm9jZXNzT3V0cHV0cyl7dmFyIG91dHB1dD17fTt0aGlzLnJlYWRD aGlsZE5vZGVzKG5vZGUsb3V0cHV0KTtwcm9jZXNzT3V0cHV0cy5wdXNoKG91dHB1 dCk7fSwiQ29tcGxleE91dHB1dCI6ZnVuY3Rpb24obm9kZSxvdXRwdXQpe291dHB1 dC5jb21wbGV4T3V0cHV0PXt9O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxvdXRw dXQuY29tcGxleE91dHB1dCk7fSwiSW5wdXQiOmZ1bmN0aW9uKG5vZGUsZGF0YUlu cHV0cyl7dmFyIGlucHV0PXttYXhPY2N1cnM6cGFyc2VJbnQobm9kZS5nZXRBdHRy aWJ1dGUoIm1heE9jY3VycyIpKSxtaW5PY2N1cnM6cGFyc2VJbnQobm9kZS5nZXRB dHRyaWJ1dGUoIm1pbk9jY3VycyIpKX07dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2Rl LGlucHV0KTtkYXRhSW5wdXRzLnB1c2goaW5wdXQpO30sIkJvdW5kaW5nQm94RGF0 YSI6ZnVuY3Rpb24obm9kZSxpbnB1dCl7aW5wdXQuYm91bmRpbmdCb3hEYXRhPXt9 O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxpbnB1dC5ib3VuZGluZ0JveERhdGEp O30sIkNSUyI6ZnVuY3Rpb24obm9kZSxvYmope2lmKCFvYmouQ1JTcyl7b2JqLkNS U3M9e307fQpvYmouQ1JTc1t0aGlzLmdldENoaWxkVmFsdWUobm9kZSldPXRydWU7 fSwiTGl0ZXJhbERhdGEiOmZ1bmN0aW9uKG5vZGUsaW5wdXQpe2lucHV0LmxpdGVy YWxEYXRhPXt9O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxpbnB1dC5saXRlcmFs RGF0YSk7fSwiQ29tcGxleERhdGEiOmZ1bmN0aW9uKG5vZGUsaW5wdXQpe2lucHV0 LmNvbXBsZXhEYXRhPXt9O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxpbnB1dC5j b21wbGV4RGF0YSk7fSwiRGVmYXVsdCI6ZnVuY3Rpb24obm9kZSxjb21wbGV4RGF0 YSl7Y29tcGxleERhdGFbImRlZmF1bHQiXT17fTt0aGlzLnJlYWRDaGlsZE5vZGVz KG5vZGUsY29tcGxleERhdGFbImRlZmF1bHQiXSk7fSwiU3VwcG9ydGVkIjpmdW5j dGlvbihub2RlLGNvbXBsZXhEYXRhKXtjb21wbGV4RGF0YVsic3VwcG9ydGVkIl09 e307dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLGNvbXBsZXhEYXRhWyJzdXBwb3J0 ZWQiXSk7fSwiRm9ybWF0IjpmdW5jdGlvbihub2RlLG9iail7dmFyIGZvcm1hdD17 fTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsZm9ybWF0KTtpZighb2JqLmZvcm1h dHMpe29iai5mb3JtYXRzPXt9O30Kb2JqLmZvcm1hdHNbZm9ybWF0Lm1pbWVUeXBl XT10cnVlO30sIk1pbWVUeXBlIjpmdW5jdGlvbihub2RlLGZvcm1hdCl7Zm9ybWF0 Lm1pbWVUeXBlPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTt9fSwib3dzIjpPcGVu TGF5ZXJzLkZvcm1hdC5PV1NDb21tb24udjFfMV8wLnByb3RvdHlwZS5yZWFkZXJz WyJvd3MiXX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3JtYXQuV1BTRGVzY3Jp YmVQcm9jZXNzIn0pO09wZW5MYXllcnMuQ29udHJvbC5OYXZUb29sYmFyPU9wZW5M YXllcnMuQ2xhc3MoT3BlbkxheWVycy5Db250cm9sLlBhbmVsLHtpbml0aWFsaXpl OmZ1bmN0aW9uKG9wdGlvbnMpe09wZW5MYXllcnMuQ29udHJvbC5QYW5lbC5wcm90 b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7dGhpcy5hZGRD b250cm9scyhbbmV3IE9wZW5MYXllcnMuQ29udHJvbC5OYXZpZ2F0aW9uKCksbmV3 IE9wZW5MYXllcnMuQ29udHJvbC5ab29tQm94KCldKTt9LGRyYXc6ZnVuY3Rpb24o KXt2YXIgZGl2PU9wZW5MYXllcnMuQ29udHJvbC5QYW5lbC5wcm90b3R5cGUuZHJh dy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYodGhpcy5kZWZhdWx0Q29udHJvbD09 PW51bGwpe3RoaXMuZGVmYXVsdENvbnRyb2w9dGhpcy5jb250cm9sc1swXTt9CnJl dHVybiBkaXY7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkNvbnRyb2wuTmF2VG9v bGJhciJ9KTtPcGVuTGF5ZXJzLkZvcm1hdC5DU1dHZXRSZWNvcmRzLnYyXzBfMj1P cGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0LlhNTCx7bmFtZXNwYWNl czp7Y3N3OiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2NhdC9jc3cvMi4wLjIiLGRj OiJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIsZGN0OiJodHRwOi8v cHVybC5vcmcvZGMvdGVybXMvIixnZW9uZXQ6Imh0dHA6Ly93d3cuZmFvLm9yZy9n ZW9uZXR3b3JrIixvZ2M6Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvb2djIixvd3M6 Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvb3dzIix4bGluazoiaHR0cDovL3d3dy53 My5vcmcvMTk5OS94bGluayIseHNpOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hN TFNjaGVtYS1pbnN0YW5jZSJ9LGRlZmF1bHRQcmVmaXg6ImNzdyIsdmVyc2lvbjoi Mi4wLjIiLHNjaGVtYUxvY2F0aW9uOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2Nh dC9jc3cvMi4wLjIgaHR0cDovL3NjaGVtYXMub3Blbmdpcy5uZXQvY3N3LzIuMC4y L0NTVy1kaXNjb3ZlcnkueHNkIixyZXF1ZXN0SWQ6bnVsbCxyZXN1bHRUeXBlOm51 bGwsb3V0cHV0Rm9ybWF0Om51bGwsb3V0cHV0U2NoZW1hOm51bGwsc3RhcnRQb3Np dGlvbjpudWxsLG1heFJlY29yZHM6bnVsbCxEaXN0cmlidXRlZFNlYXJjaDpudWxs LFJlc3BvbnNlSGFuZGxlcjpudWxsLFF1ZXJ5Om51bGwscmVnRXhlczp7dHJpbVNw YWNlOigvXlxzKnxccyokL2cpLHJlbW92ZVNwYWNlOigvXHMqL2cpLHNwbGl0U3Bh Y2U6KC9ccysvKSx0cmltQ29tbWE6KC9ccyosXHMqL2cpfSxpbml0aWFsaXplOmZ1 bmN0aW9uKG9wdGlvbnMpe09wZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5cGUu aW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7fSxyZWFkOmZ1bmN0aW9u KGRhdGEpe2lmKHR5cGVvZiBkYXRhPT0ic3RyaW5nIil7ZGF0YT1PcGVuTGF5ZXJz LkZvcm1hdC5YTUwucHJvdG90eXBlLnJlYWQuYXBwbHkodGhpcyxbZGF0YV0pO30K aWYoZGF0YSYmZGF0YS5ub2RlVHlwZT09OSl7ZGF0YT1kYXRhLmRvY3VtZW50RWxl bWVudDt9CnZhciBvYmo9e307dGhpcy5yZWFkTm9kZShkYXRhLG9iaik7cmV0dXJu IG9iajt9LHJlYWRlcnM6eyJjc3ciOnsiR2V0UmVjb3Jkc1Jlc3BvbnNlIjpmdW5j dGlvbihub2RlLG9iail7b2JqLnJlY29yZHM9W107dGhpcy5yZWFkQ2hpbGROb2Rl cyhub2RlLG9iaik7dmFyIHZlcnNpb249dGhpcy5nZXRBdHRyaWJ1dGVOUyhub2Rl LCIiLCd2ZXJzaW9uJyk7aWYodmVyc2lvbiE9IiIpe29iai52ZXJzaW9uPXZlcnNp b247fX0sIlJlcXVlc3RJZCI6ZnVuY3Rpb24obm9kZSxvYmope29iai5SZXF1ZXN0 SWQ9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO30sIlNlYXJjaFN0YXR1cyI6ZnVu Y3Rpb24obm9kZSxvYmope29iai5TZWFyY2hTdGF0dXM9e307dmFyIHRpbWVzdGFt cD10aGlzLmdldEF0dHJpYnV0ZU5TKG5vZGUsIiIsJ3RpbWVzdGFtcCcpO2lmKHRp bWVzdGFtcCE9IiIpe29iai5TZWFyY2hTdGF0dXMudGltZXN0YW1wPXRpbWVzdGFt cDt9fSwiU2VhcmNoUmVzdWx0cyI6ZnVuY3Rpb24obm9kZSxvYmope3RoaXMucmVh ZENoaWxkTm9kZXMobm9kZSxvYmopO3ZhciBhdHRycz1ub2RlLmF0dHJpYnV0ZXM7 dmFyIFNlYXJjaFJlc3VsdHM9e307Zm9yKHZhciBpPTAsbGVuPWF0dHJzLmxlbmd0 aDtpPGxlbjsrK2kpe2lmKChhdHRyc1tpXS5uYW1lPT0ibnVtYmVyT2ZSZWNvcmRz TWF0Y2hlZCIpfHwoYXR0cnNbaV0ubmFtZT09Im51bWJlck9mUmVjb3Jkc1JldHVy bmVkIil8fChhdHRyc1tpXS5uYW1lPT0ibmV4dFJlY29yZCIpKXtTZWFyY2hSZXN1 bHRzW2F0dHJzW2ldLm5hbWVdPXBhcnNlSW50KGF0dHJzW2ldLm5vZGVWYWx1ZSk7 fWVsc2V7U2VhcmNoUmVzdWx0c1thdHRyc1tpXS5uYW1lXT1hdHRyc1tpXS5ub2Rl VmFsdWU7fX0Kb2JqLlNlYXJjaFJlc3VsdHM9U2VhcmNoUmVzdWx0czt9LCJTdW1t YXJ5UmVjb3JkIjpmdW5jdGlvbihub2RlLG9iail7dmFyIHJlY29yZD17dHlwZToi U3VtbWFyeVJlY29yZCJ9O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxyZWNvcmQp O29iai5yZWNvcmRzLnB1c2gocmVjb3JkKTt9LCJCcmllZlJlY29yZCI6ZnVuY3Rp b24obm9kZSxvYmope3ZhciByZWNvcmQ9e3R5cGU6IkJyaWVmUmVjb3JkIn07dGhp cy5yZWFkQ2hpbGROb2Rlcyhub2RlLHJlY29yZCk7b2JqLnJlY29yZHMucHVzaChy ZWNvcmQpO30sIkRDTUlSZWNvcmQiOmZ1bmN0aW9uKG5vZGUsb2JqKXt2YXIgcmVj b3JkPXt0eXBlOiJEQ01JUmVjb3JkIn07dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2Rl LHJlY29yZCk7b2JqLnJlY29yZHMucHVzaChyZWNvcmQpO30sIlJlY29yZCI6ZnVu Y3Rpb24obm9kZSxvYmope3ZhciByZWNvcmQ9e3R5cGU6IlJlY29yZCJ9O3RoaXMu cmVhZENoaWxkTm9kZXMobm9kZSxyZWNvcmQpO29iai5yZWNvcmRzLnB1c2gocmVj b3JkKTt9LCIqIjpmdW5jdGlvbihub2RlLG9iail7dmFyIG5hbWU9bm9kZS5sb2Nh bE5hbWV8fG5vZGUubm9kZU5hbWUuc3BsaXQoIjoiKS5wb3AoKTtvYmpbbmFtZV09 dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO319LCJnZW9uZXQiOnsiaW5mbyI6ZnVu Y3Rpb24obm9kZSxvYmope3ZhciBnbmluZm89e307dGhpcy5yZWFkQ2hpbGROb2Rl cyhub2RlLGduaW5mbyk7b2JqLmduaW5mbz1nbmluZm87fX0sImRjIjp7IioiOmZ1 bmN0aW9uKG5vZGUsb2JqKXt2YXIgbmFtZT1ub2RlLmxvY2FsTmFtZXx8bm9kZS5u b2RlTmFtZS5zcGxpdCgiOiIpLnBvcCgpO2lmKCEoT3BlbkxheWVycy5VdGlsLmlz QXJyYXkob2JqW25hbWVdKSkpe29ialtuYW1lXT1uZXcgQXJyYXkoKTt9CnZhciBk Y19lbGVtZW50PXt9O3ZhciBhdHRycz1ub2RlLmF0dHJpYnV0ZXM7Zm9yKHZhciBp PTAsbGVuPWF0dHJzLmxlbmd0aDtpPGxlbjsrK2kpe2RjX2VsZW1lbnRbYXR0cnNb aV0ubmFtZV09YXR0cnNbaV0ubm9kZVZhbHVlO30KZGNfZWxlbWVudC52YWx1ZT10 aGlzLmdldENoaWxkVmFsdWUobm9kZSk7b2JqW25hbWVdLnB1c2goZGNfZWxlbWVu dCk7fX0sImRjdCI6eyIqIjpmdW5jdGlvbihub2RlLG9iail7dmFyIG5hbWU9bm9k ZS5sb2NhbE5hbWV8fG5vZGUubm9kZU5hbWUuc3BsaXQoIjoiKS5wb3AoKTtpZigh KE9wZW5MYXllcnMuVXRpbC5pc0FycmF5KG9ialtuYW1lXSkpKXtvYmpbbmFtZV09 bmV3IEFycmF5KCk7fQpvYmpbbmFtZV0ucHVzaCh0aGlzLmdldENoaWxkVmFsdWUo bm9kZSkpO319LCJvd3MiOk9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKHsi Qm91bmRpbmdCb3giOmZ1bmN0aW9uKG5vZGUsb2JqKXtpZihvYmouYm91bmRzKXtv YmouQm91bmRpbmdCb3g9W3tjcnM6b2JqLnByb2plY3Rpb24sdmFsdWU6W29iai5i b3VuZHMubGVmdCxvYmouYm91bmRzLmJvdHRvbSxvYmouYm91bmRzLnJpZ2h0LG9i ai5ib3VuZHMudG9wXX1dO2RlbGV0ZSBvYmoucHJvamVjdGlvbjtkZWxldGUgb2Jq LmJvdW5kczt9Ck9wZW5MYXllcnMuRm9ybWF0Lk9XU0NvbW1vbi52MV8wXzAucHJv dG90eXBlLnJlYWRlcnNbIm93cyJdWyJCb3VuZGluZ0JveCJdLmFwcGx5KHRoaXMs YXJndW1lbnRzKTt9fSxPcGVuTGF5ZXJzLkZvcm1hdC5PV1NDb21tb24udjFfMF8w LnByb3RvdHlwZS5yZWFkZXJzWyJvd3MiXSl9LHdyaXRlOmZ1bmN0aW9uKG9wdGlv bnMpe3ZhciBub2RlPXRoaXMud3JpdGVOb2RlKCJjc3c6R2V0UmVjb3JkcyIsb3B0 aW9ucyk7cmV0dXJuIE9wZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5cGUud3Jp dGUuYXBwbHkodGhpcyxbbm9kZV0pO30sd3JpdGVyczp7ImNzdyI6eyJHZXRSZWNv cmRzIjpmdW5jdGlvbihvcHRpb25zKXtpZighb3B0aW9ucyl7b3B0aW9ucz17fTt9 CnZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygiY3N3OkdldFJlY29y ZHMiLHthdHRyaWJ1dGVzOntzZXJ2aWNlOiJDU1ciLHZlcnNpb246dGhpcy52ZXJz aW9uLHJlcXVlc3RJZDpvcHRpb25zLnJlcXVlc3RJZHx8dGhpcy5yZXF1ZXN0SWQs cmVzdWx0VHlwZTpvcHRpb25zLnJlc3VsdFR5cGV8fHRoaXMucmVzdWx0VHlwZSxv dXRwdXRGb3JtYXQ6b3B0aW9ucy5vdXRwdXRGb3JtYXR8fHRoaXMub3V0cHV0Rm9y bWF0LG91dHB1dFNjaGVtYTpvcHRpb25zLm91dHB1dFNjaGVtYXx8dGhpcy5vdXRw dXRTY2hlbWEsc3RhcnRQb3NpdGlvbjpvcHRpb25zLnN0YXJ0UG9zaXRpb258fHRo aXMuc3RhcnRQb3NpdGlvbixtYXhSZWNvcmRzOm9wdGlvbnMubWF4UmVjb3Jkc3x8 dGhpcy5tYXhSZWNvcmRzfX0pO2lmKG9wdGlvbnMuRGlzdHJpYnV0ZWRTZWFyY2h8 fHRoaXMuRGlzdHJpYnV0ZWRTZWFyY2gpe3RoaXMud3JpdGVOb2RlKCJjc3c6RGlz dHJpYnV0ZWRTZWFyY2giLG9wdGlvbnMuRGlzdHJpYnV0ZWRTZWFyY2h8fHRoaXMu RGlzdHJpYnV0ZWRTZWFyY2gsbm9kZSk7fQp2YXIgUmVzcG9uc2VIYW5kbGVyPW9w dGlvbnMuUmVzcG9uc2VIYW5kbGVyfHx0aGlzLlJlc3BvbnNlSGFuZGxlcjtpZihP cGVuTGF5ZXJzLlV0aWwuaXNBcnJheShSZXNwb25zZUhhbmRsZXIpJiZSZXNwb25z ZUhhbmRsZXIubGVuZ3RoPjApe2Zvcih2YXIgaT0wLGxlbj1SZXNwb25zZUhhbmRs ZXIubGVuZ3RoO2k8bGVuO2krKyl7dGhpcy53cml0ZU5vZGUoImNzdzpSZXNwb25z ZUhhbmRsZXIiLFJlc3BvbnNlSGFuZGxlcltpXSxub2RlKTt9fQp0aGlzLndyaXRl Tm9kZSgiUXVlcnkiLG9wdGlvbnMuUXVlcnl8fHRoaXMuUXVlcnksbm9kZSk7cmV0 dXJuIG5vZGU7fSwiRGlzdHJpYnV0ZWRTZWFyY2giOmZ1bmN0aW9uKG9wdGlvbnMp e3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygiY3N3OkRpc3RyaWJ1 dGVkU2VhcmNoIix7YXR0cmlidXRlczp7aG9wQ291bnQ6b3B0aW9ucy5ob3BDb3Vu dH19KTtyZXR1cm4gbm9kZTt9LCJSZXNwb25zZUhhbmRsZXIiOmZ1bmN0aW9uKG9w dGlvbnMpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygiY3N3OlJl c3BvbnNlSGFuZGxlciIse3ZhbHVlOm9wdGlvbnMudmFsdWV9KTtyZXR1cm4gbm9k ZTt9LCJRdWVyeSI6ZnVuY3Rpb24ob3B0aW9ucyl7aWYoIW9wdGlvbnMpe29wdGlv bnM9e307fQp2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImNzdzpR dWVyeSIse2F0dHJpYnV0ZXM6e3R5cGVOYW1lczpvcHRpb25zLnR5cGVOYW1lc3x8 ImNzdzpSZWNvcmQifX0pO3ZhciBFbGVtZW50TmFtZT1vcHRpb25zLkVsZW1lbnRO YW1lO2lmKE9wZW5MYXllcnMuVXRpbC5pc0FycmF5KEVsZW1lbnROYW1lKSYmRWxl bWVudE5hbWUubGVuZ3RoPjApe2Zvcih2YXIgaT0wLGxlbj1FbGVtZW50TmFtZS5s ZW5ndGg7aTxsZW47aSsrKXt0aGlzLndyaXRlTm9kZSgiY3N3OkVsZW1lbnROYW1l IixFbGVtZW50TmFtZVtpXSxub2RlKTt9fWVsc2V7dGhpcy53cml0ZU5vZGUoImNz dzpFbGVtZW50U2V0TmFtZSIsb3B0aW9ucy5FbGVtZW50U2V0TmFtZXx8e3ZhbHVl OidzdW1tYXJ5J30sbm9kZSk7fQppZihvcHRpb25zLkNvbnN0cmFpbnQpe3RoaXMu d3JpdGVOb2RlKCJjc3c6Q29uc3RyYWludCIsb3B0aW9ucy5Db25zdHJhaW50LG5v ZGUpO30KaWYob3B0aW9ucy5Tb3J0Qnkpe3RoaXMud3JpdGVOb2RlKCJvZ2M6U29y dEJ5IixvcHRpb25zLlNvcnRCeSxub2RlKTt9CnJldHVybiBub2RlO30sIkVsZW1l bnROYW1lIjpmdW5jdGlvbihvcHRpb25zKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVs ZW1lbnROU1BsdXMoImNzdzpFbGVtZW50TmFtZSIse3ZhbHVlOm9wdGlvbnMudmFs dWV9KTtyZXR1cm4gbm9kZTt9LCJFbGVtZW50U2V0TmFtZSI6ZnVuY3Rpb24ob3B0 aW9ucyl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJjc3c6RWxl bWVudFNldE5hbWUiLHthdHRyaWJ1dGVzOnt0eXBlTmFtZXM6b3B0aW9ucy50eXBl TmFtZXN9LHZhbHVlOm9wdGlvbnMudmFsdWV9KTtyZXR1cm4gbm9kZTt9LCJDb25z dHJhaW50IjpmdW5jdGlvbihvcHRpb25zKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVs ZW1lbnROU1BsdXMoImNzdzpDb25zdHJhaW50Iix7YXR0cmlidXRlczp7dmVyc2lv bjpvcHRpb25zLnZlcnNpb259fSk7aWYob3B0aW9ucy5GaWx0ZXIpe3ZhciBmb3Jt YXQ9bmV3IE9wZW5MYXllcnMuRm9ybWF0LkZpbHRlcih7dmVyc2lvbjpvcHRpb25z LnZlcnNpb259KTtub2RlLmFwcGVuZENoaWxkKGZvcm1hdC53cml0ZShvcHRpb25z LkZpbHRlcikpO31lbHNlIGlmKG9wdGlvbnMuQ3FsVGV4dCl7dmFyIGNoaWxkPXRo aXMuY3JlYXRlRWxlbWVudE5TUGx1cygiQ3FsVGV4dCIse3ZhbHVlOm9wdGlvbnMu Q3FsVGV4dC52YWx1ZX0pO25vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpO30KcmV0dXJu IG5vZGU7fX0sIm9nYyI6T3BlbkxheWVycy5Gb3JtYXQuRmlsdGVyLnYxXzFfMC5w cm90b3R5cGUud3JpdGVyc1sib2djIl19LENMQVNTX05BTUU6Ik9wZW5MYXllcnMu Rm9ybWF0LkNTV0dldFJlY29yZHMudjJfMF8yIn0pO09wZW5MYXllcnMuTWFya2Vy LkJveD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuTWFya2VyLHtib3VuZHM6 bnVsbCxkaXY6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKGJvdW5kcyxib3JkZXJD b2xvcixib3JkZXJXaWR0aCl7dGhpcy5ib3VuZHM9Ym91bmRzO3RoaXMuZGl2PU9w ZW5MYXllcnMuVXRpbC5jcmVhdGVEaXYoKTt0aGlzLmRpdi5zdHlsZS5vdmVyZmxv dz0naGlkZGVuJzt0aGlzLmV2ZW50cz1uZXcgT3BlbkxheWVycy5FdmVudHModGhp cyx0aGlzLmRpdixudWxsKTt0aGlzLnNldEJvcmRlcihib3JkZXJDb2xvcixib3Jk ZXJXaWR0aCk7fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5ib3VuZHM9bnVsbDt0 aGlzLmRpdj1udWxsO09wZW5MYXllcnMuTWFya2VyLnByb3RvdHlwZS5kZXN0cm95 LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LHNldEJvcmRlcjpmdW5jdGlvbihjb2xv cix3aWR0aCl7aWYoIWNvbG9yKXtjb2xvcj0icmVkIjt9CmlmKCF3aWR0aCl7d2lk dGg9Mjt9CnRoaXMuZGl2LnN0eWxlLmJvcmRlcj13aWR0aCsicHggc29saWQgIitj b2xvcjt9LGRyYXc6ZnVuY3Rpb24ocHgsc3ope09wZW5MYXllcnMuVXRpbC5tb2Rp ZnlET01FbGVtZW50KHRoaXMuZGl2LG51bGwscHgsc3opO3JldHVybiB0aGlzLmRp djt9LG9uU2NyZWVuOmZ1bmN0aW9uKCl7dmFyIG9uU2NyZWVuPWZhbHNlO2lmKHRo aXMubWFwKXt2YXIgc2NyZWVuQm91bmRzPXRoaXMubWFwLmdldEV4dGVudCgpO29u U2NyZWVuPXNjcmVlbkJvdW5kcy5jb250YWluc0JvdW5kcyh0aGlzLmJvdW5kcyx0 cnVlLHRydWUpO30KcmV0dXJuIG9uU2NyZWVuO30sZGlzcGxheTpmdW5jdGlvbihk aXNwbGF5KXt0aGlzLmRpdi5zdHlsZS5kaXNwbGF5PShkaXNwbGF5KT8iIjoibm9u ZSI7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLk1hcmtlci5Cb3gifSk7T3Blbkxh eWVycy5Gb3JtYXQuVGV4dD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9y bWF0LHtkZWZhdWx0U3R5bGU6bnVsbCxleHRyYWN0U3R5bGVzOnRydWUsaW5pdGlh bGl6ZTpmdW5jdGlvbihvcHRpb25zKXtvcHRpb25zPW9wdGlvbnN8fHt9O2lmKG9w dGlvbnMuZXh0cmFjdFN0eWxlcyE9PWZhbHNlKXtvcHRpb25zLmRlZmF1bHRTdHls ZT17J2V4dGVybmFsR3JhcGhpYyc6T3BlbkxheWVycy5VdGlsLmdldEltYWdlc0xv Y2F0aW9uKCkrIm1hcmtlci5wbmciLCdncmFwaGljV2lkdGgnOjIxLCdncmFwaGlj SGVpZ2h0JzoyNSwnZ3JhcGhpY1hPZmZzZXQnOi0xMC41LCdncmFwaGljWU9mZnNl dCc6LTEyLjV9O30KT3BlbkxheWVycy5Gb3JtYXQucHJvdG90eXBlLmluaXRpYWxp emUuYXBwbHkodGhpcyxbb3B0aW9uc10pO30scmVhZDpmdW5jdGlvbih0ZXh0KXt2 YXIgbGluZXM9dGV4dC5zcGxpdCgnXG4nKTt2YXIgY29sdW1uczt2YXIgZmVhdHVy ZXM9W107Zm9yKHZhciBsY3Y9MDtsY3Y8KGxpbmVzLmxlbmd0aC0xKTtsY3YrKyl7 dmFyIGN1cnJMaW5lPWxpbmVzW2xjdl0ucmVwbGFjZSgvXlxzKi8sJycpLnJlcGxh Y2UoL1xzKiQvLCcnKTtpZihjdXJyTGluZS5jaGFyQXQoMCkhPScjJyl7aWYoIWNv bHVtbnMpe2NvbHVtbnM9Y3VyckxpbmUuc3BsaXQoJ1x0Jyk7fWVsc2V7dmFyIHZh bHM9Y3VyckxpbmUuc3BsaXQoJ1x0Jyk7dmFyIGdlb21ldHJ5PW5ldyBPcGVuTGF5 ZXJzLkdlb21ldHJ5LlBvaW50KDAsMCk7dmFyIGF0dHJpYnV0ZXM9e307dmFyIHN0 eWxlPXRoaXMuZGVmYXVsdFN0eWxlP09wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1 bHRzKHt9LHRoaXMuZGVmYXVsdFN0eWxlKTpudWxsO3ZhciBpY29uLGljb25TaXpl LGljb25PZmZzZXQsb3ZlcmZsb3c7dmFyIHNldD1mYWxzZTtmb3IodmFyIHZhbElu ZGV4PTA7dmFsSW5kZXg8dmFscy5sZW5ndGg7dmFsSW5kZXgrKyl7aWYodmFsc1t2 YWxJbmRleF0pe2lmKGNvbHVtbnNbdmFsSW5kZXhdPT0ncG9pbnQnKXt2YXIgY29v cmRzPXZhbHNbdmFsSW5kZXhdLnNwbGl0KCcsJyk7Z2VvbWV0cnkueT1wYXJzZUZs b2F0KGNvb3Jkc1swXSk7Z2VvbWV0cnkueD1wYXJzZUZsb2F0KGNvb3Jkc1sxXSk7 c2V0PXRydWU7fWVsc2UgaWYoY29sdW1uc1t2YWxJbmRleF09PSdsYXQnKXtnZW9t ZXRyeS55PXBhcnNlRmxvYXQodmFsc1t2YWxJbmRleF0pO3NldD10cnVlO31lbHNl IGlmKGNvbHVtbnNbdmFsSW5kZXhdPT0nbG9uJyl7Z2VvbWV0cnkueD1wYXJzZUZs b2F0KHZhbHNbdmFsSW5kZXhdKTtzZXQ9dHJ1ZTt9ZWxzZSBpZihjb2x1bW5zW3Zh bEluZGV4XT09J3RpdGxlJykKYXR0cmlidXRlc1sndGl0bGUnXT12YWxzW3ZhbElu ZGV4XTtlbHNlIGlmKGNvbHVtbnNbdmFsSW5kZXhdPT0naW1hZ2UnfHxjb2x1bW5z W3ZhbEluZGV4XT09J2ljb24nJiZzdHlsZSl7c3R5bGVbJ2V4dGVybmFsR3JhcGhp YyddPXZhbHNbdmFsSW5kZXhdO31lbHNlIGlmKGNvbHVtbnNbdmFsSW5kZXhdPT0n aWNvblNpemUnJiZzdHlsZSl7dmFyIHNpemU9dmFsc1t2YWxJbmRleF0uc3BsaXQo JywnKTtzdHlsZVsnZ3JhcGhpY1dpZHRoJ109cGFyc2VGbG9hdChzaXplWzBdKTtz dHlsZVsnZ3JhcGhpY0hlaWdodCddPXBhcnNlRmxvYXQoc2l6ZVsxXSk7fWVsc2Ug aWYoY29sdW1uc1t2YWxJbmRleF09PSdpY29uT2Zmc2V0JyYmc3R5bGUpe3ZhciBv ZmZzZXQ9dmFsc1t2YWxJbmRleF0uc3BsaXQoJywnKTtzdHlsZVsnZ3JhcGhpY1hP ZmZzZXQnXT1wYXJzZUZsb2F0KG9mZnNldFswXSk7c3R5bGVbJ2dyYXBoaWNZT2Zm c2V0J109cGFyc2VGbG9hdChvZmZzZXRbMV0pO31lbHNlIGlmKGNvbHVtbnNbdmFs SW5kZXhdPT0nZGVzY3JpcHRpb24nKXthdHRyaWJ1dGVzWydkZXNjcmlwdGlvbidd PXZhbHNbdmFsSW5kZXhdO31lbHNlIGlmKGNvbHVtbnNbdmFsSW5kZXhdPT0nb3Zl cmZsb3cnKXthdHRyaWJ1dGVzWydvdmVyZmxvdyddPXZhbHNbdmFsSW5kZXhdO31l bHNle2F0dHJpYnV0ZXNbY29sdW1uc1t2YWxJbmRleF1dPXZhbHNbdmFsSW5kZXhd O319fQppZihzZXQpe2lmKHRoaXMuaW50ZXJuYWxQcm9qZWN0aW9uJiZ0aGlzLmV4 dGVybmFsUHJvamVjdGlvbil7Z2VvbWV0cnkudHJhbnNmb3JtKHRoaXMuZXh0ZXJu YWxQcm9qZWN0aW9uLHRoaXMuaW50ZXJuYWxQcm9qZWN0aW9uKTt9CnZhciBmZWF0 dXJlPW5ldyBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9yKGdlb21ldHJ5LGF0dHJp YnV0ZXMsc3R5bGUpO2ZlYXR1cmVzLnB1c2goZmVhdHVyZSk7fX19fQpyZXR1cm4g ZmVhdHVyZXM7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5UZXh0In0p O09wZW5MYXllcnMuTGF5ZXIuVGV4dD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXll cnMuTGF5ZXIuTWFya2Vycyx7bG9jYXRpb246bnVsbCxmZWF0dXJlczpudWxsLGZv cm1hdE9wdGlvbnM6bnVsbCxzZWxlY3RlZEZlYXR1cmU6bnVsbCxpbml0aWFsaXpl OmZ1bmN0aW9uKG5hbWUsb3B0aW9ucyl7T3BlbkxheWVycy5MYXllci5NYXJrZXJz LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlz LmZlYXR1cmVzPW5ldyBBcnJheSgpO30sZGVzdHJveTpmdW5jdGlvbigpe09wZW5M YXllcnMuTGF5ZXIuTWFya2Vycy5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlz LGFyZ3VtZW50cyk7dGhpcy5jbGVhckZlYXR1cmVzKCk7dGhpcy5mZWF0dXJlcz1u dWxsO30sbG9hZFRleHQ6ZnVuY3Rpb24oKXtpZighdGhpcy5sb2FkZWQpe2lmKHRo aXMubG9jYXRpb24hPW51bGwpe3ZhciBvbkZhaWw9ZnVuY3Rpb24oZSl7dGhpcy5l dmVudHMudHJpZ2dlckV2ZW50KCJsb2FkZW5kIik7fTt0aGlzLmV2ZW50cy50cmln Z2VyRXZlbnQoImxvYWRzdGFydCIpO09wZW5MYXllcnMuUmVxdWVzdC5HRVQoe3Vy bDp0aGlzLmxvY2F0aW9uLHN1Y2Nlc3M6dGhpcy5wYXJzZURhdGEsZmFpbHVyZTpv bkZhaWwsc2NvcGU6dGhpc30pO3RoaXMubG9hZGVkPXRydWU7fX19LG1vdmVUbzpm dW5jdGlvbihib3VuZHMsem9vbUNoYW5nZWQsbWlub3Ipe09wZW5MYXllcnMuTGF5 ZXIuTWFya2Vycy5wcm90b3R5cGUubW92ZVRvLmFwcGx5KHRoaXMsYXJndW1lbnRz KTtpZih0aGlzLnZpc2liaWxpdHkmJiF0aGlzLmxvYWRlZCl7dGhpcy5sb2FkVGV4 dCgpO319LHBhcnNlRGF0YTpmdW5jdGlvbihhamF4UmVxdWVzdCl7dmFyIHRleHQ9 YWpheFJlcXVlc3QucmVzcG9uc2VUZXh0O3ZhciBvcHRpb25zPXt9O09wZW5MYXll cnMuVXRpbC5leHRlbmQob3B0aW9ucyx0aGlzLmZvcm1hdE9wdGlvbnMpO2lmKHRo aXMubWFwJiYhdGhpcy5wcm9qZWN0aW9uLmVxdWFscyh0aGlzLm1hcC5nZXRQcm9q ZWN0aW9uT2JqZWN0KCkpKXtvcHRpb25zLmV4dGVybmFsUHJvamVjdGlvbj10aGlz LnByb2plY3Rpb247b3B0aW9ucy5pbnRlcm5hbFByb2plY3Rpb249dGhpcy5tYXAu Z2V0UHJvamVjdGlvbk9iamVjdCgpO30KdmFyIHBhcnNlcj1uZXcgT3BlbkxheWVy cy5Gb3JtYXQuVGV4dChvcHRpb25zKTt2YXIgZmVhdHVyZXM9cGFyc2VyLnJlYWQo dGV4dCk7Zm9yKHZhciBpPTAsbGVuPWZlYXR1cmVzLmxlbmd0aDtpPGxlbjtpKysp e3ZhciBkYXRhPXt9O3ZhciBmZWF0dXJlPWZlYXR1cmVzW2ldO3ZhciBsb2NhdGlv bjt2YXIgaWNvblNpemUsaWNvbk9mZnNldDtsb2NhdGlvbj1uZXcgT3BlbkxheWVy cy5Mb25MYXQoZmVhdHVyZS5nZW9tZXRyeS54LGZlYXR1cmUuZ2VvbWV0cnkueSk7 aWYoZmVhdHVyZS5zdHlsZS5ncmFwaGljV2lkdGgmJmZlYXR1cmUuc3R5bGUuZ3Jh cGhpY0hlaWdodCl7aWNvblNpemU9bmV3IE9wZW5MYXllcnMuU2l6ZShmZWF0dXJl LnN0eWxlLmdyYXBoaWNXaWR0aCxmZWF0dXJlLnN0eWxlLmdyYXBoaWNIZWlnaHQp O30KaWYoZmVhdHVyZS5zdHlsZS5ncmFwaGljWE9mZnNldCE9PXVuZGVmaW5lZCYm ZmVhdHVyZS5zdHlsZS5ncmFwaGljWU9mZnNldCE9PXVuZGVmaW5lZCl7aWNvbk9m ZnNldD1uZXcgT3BlbkxheWVycy5QaXhlbChmZWF0dXJlLnN0eWxlLmdyYXBoaWNY T2Zmc2V0LGZlYXR1cmUuc3R5bGUuZ3JhcGhpY1lPZmZzZXQpO30KaWYoZmVhdHVy ZS5zdHlsZS5leHRlcm5hbEdyYXBoaWMhPW51bGwpe2RhdGEuaWNvbj1uZXcgT3Bl bkxheWVycy5JY29uKGZlYXR1cmUuc3R5bGUuZXh0ZXJuYWxHcmFwaGljLGljb25T aXplLGljb25PZmZzZXQpO31lbHNle2RhdGEuaWNvbj1PcGVuTGF5ZXJzLk1hcmtl ci5kZWZhdWx0SWNvbigpO2lmKGljb25TaXplIT1udWxsKXtkYXRhLmljb24uc2V0 U2l6ZShpY29uU2l6ZSk7fX0KaWYoKGZlYXR1cmUuYXR0cmlidXRlcy50aXRsZSE9 bnVsbCkmJihmZWF0dXJlLmF0dHJpYnV0ZXMuZGVzY3JpcHRpb24hPW51bGwpKXtk YXRhWydwb3B1cENvbnRlbnRIVE1MJ109JzxoMj4nK2ZlYXR1cmUuYXR0cmlidXRl cy50aXRsZSsnPC9oMj4nKyc8cD4nK2ZlYXR1cmUuYXR0cmlidXRlcy5kZXNjcmlw dGlvbisnPC9wPic7fQpkYXRhWydvdmVyZmxvdyddPWZlYXR1cmUuYXR0cmlidXRl cy5vdmVyZmxvd3x8ImF1dG8iO3ZhciBtYXJrZXJGZWF0dXJlPW5ldyBPcGVuTGF5 ZXJzLkZlYXR1cmUodGhpcyxsb2NhdGlvbixkYXRhKTt0aGlzLmZlYXR1cmVzLnB1 c2gobWFya2VyRmVhdHVyZSk7dmFyIG1hcmtlcj1tYXJrZXJGZWF0dXJlLmNyZWF0 ZU1hcmtlcigpO2lmKChmZWF0dXJlLmF0dHJpYnV0ZXMudGl0bGUhPW51bGwpJiYo ZmVhdHVyZS5hdHRyaWJ1dGVzLmRlc2NyaXB0aW9uIT1udWxsKSl7bWFya2VyLmV2 ZW50cy5yZWdpc3RlcignY2xpY2snLG1hcmtlckZlYXR1cmUsdGhpcy5tYXJrZXJD bGljayk7fQp0aGlzLmFkZE1hcmtlcihtYXJrZXIpO30KdGhpcy5ldmVudHMudHJp Z2dlckV2ZW50KCJsb2FkZW5kIik7fSxtYXJrZXJDbGljazpmdW5jdGlvbihldnQp e3ZhciBzYW1lTWFya2VyQ2xpY2tlZD0odGhpcz09dGhpcy5sYXllci5zZWxlY3Rl ZEZlYXR1cmUpO3RoaXMubGF5ZXIuc2VsZWN0ZWRGZWF0dXJlPSghc2FtZU1hcmtl ckNsaWNrZWQpP3RoaXM6bnVsbDtmb3IodmFyIGk9MCxsZW49dGhpcy5sYXllci5t YXAucG9wdXBzLmxlbmd0aDtpPGxlbjtpKyspe3RoaXMubGF5ZXIubWFwLnJlbW92 ZVBvcHVwKHRoaXMubGF5ZXIubWFwLnBvcHVwc1tpXSk7fQppZighc2FtZU1hcmtl ckNsaWNrZWQpe3RoaXMubGF5ZXIubWFwLmFkZFBvcHVwKHRoaXMuY3JlYXRlUG9w dXAoKSk7fQpPcGVuTGF5ZXJzLkV2ZW50LnN0b3AoZXZ0KTt9LGNsZWFyRmVhdHVy ZXM6ZnVuY3Rpb24oKXtpZih0aGlzLmZlYXR1cmVzIT1udWxsKXt3aGlsZSh0aGlz LmZlYXR1cmVzLmxlbmd0aD4wKXt2YXIgZmVhdHVyZT10aGlzLmZlYXR1cmVzWzBd O09wZW5MYXllcnMuVXRpbC5yZW1vdmVJdGVtKHRoaXMuZmVhdHVyZXMsZmVhdHVy ZSk7ZmVhdHVyZS5kZXN0cm95KCk7fX19LENMQVNTX05BTUU6Ik9wZW5MYXllcnMu TGF5ZXIuVGV4dCJ9KTtPcGVuTGF5ZXJzLkhhbmRsZXIuUmVndWxhclBvbHlnb249 T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkhhbmRsZXIuRHJhZyx7c2lkZXM6 NCxyYWRpdXM6bnVsbCxzbmFwQW5nbGU6bnVsbCxzbmFwVG9nZ2xlOidzaGlmdEtl eScsbGF5ZXJPcHRpb25zOm51bGwscGVyc2lzdDpmYWxzZSxpcnJlZ3VsYXI6ZmFs c2UsYW5nbGU6bnVsbCxmaXhlZFJhZGl1czpmYWxzZSxmZWF0dXJlOm51bGwsbGF5 ZXI6bnVsbCxvcmlnaW46bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKGNvbnRyb2ws Y2FsbGJhY2tzLG9wdGlvbnMpe2lmKCEob3B0aW9ucyYmb3B0aW9ucy5sYXllck9w dGlvbnMmJm9wdGlvbnMubGF5ZXJPcHRpb25zLnN0eWxlTWFwKSl7dGhpcy5zdHls ZT1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKE9wZW5MYXllcnMuRmVhdHVyZS5WZWN0 b3Iuc3R5bGVbJ2RlZmF1bHQnXSx7fSk7fQpPcGVuTGF5ZXJzLkhhbmRsZXIuRHJh Zy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtjb250cm9sLGNhbGxi YWNrcyxvcHRpb25zXSk7dGhpcy5vcHRpb25zPShvcHRpb25zKT9vcHRpb25zOnt9 O30sc2V0T3B0aW9uczpmdW5jdGlvbihuZXdPcHRpb25zKXtPcGVuTGF5ZXJzLlV0 aWwuZXh0ZW5kKHRoaXMub3B0aW9ucyxuZXdPcHRpb25zKTtPcGVuTGF5ZXJzLlV0 aWwuZXh0ZW5kKHRoaXMsbmV3T3B0aW9ucyk7fSxhY3RpdmF0ZTpmdW5jdGlvbigp e3ZhciBhY3RpdmF0ZWQ9ZmFsc2U7aWYoT3BlbkxheWVycy5IYW5kbGVyLkRyYWcu cHJvdG90eXBlLmFjdGl2YXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG9w dGlvbnM9T3BlbkxheWVycy5VdGlsLmV4dGVuZCh7ZGlzcGxheUluTGF5ZXJTd2l0 Y2hlcjpmYWxzZSxjYWxjdWxhdGVJblJhbmdlOk9wZW5MYXllcnMuRnVuY3Rpb24u VHJ1ZX0sdGhpcy5sYXllck9wdGlvbnMpO3RoaXMubGF5ZXI9bmV3IE9wZW5MYXll cnMuTGF5ZXIuVmVjdG9yKHRoaXMuQ0xBU1NfTkFNRSxvcHRpb25zKTt0aGlzLm1h cC5hZGRMYXllcih0aGlzLmxheWVyKTthY3RpdmF0ZWQ9dHJ1ZTt9CnJldHVybiBh Y3RpdmF0ZWQ7fSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7dmFyIGRlYWN0aXZhdGVk PWZhbHNlO2lmKE9wZW5MYXllcnMuSGFuZGxlci5EcmFnLnByb3RvdHlwZS5kZWFj dGl2YXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7aWYodGhpcy5kcmFnZ2luZyl7 dGhpcy5jYW5jZWwoKTt9CmlmKHRoaXMubGF5ZXIubWFwIT1udWxsKXt0aGlzLmxh eWVyLmRlc3Ryb3koZmFsc2UpO2lmKHRoaXMuZmVhdHVyZSl7dGhpcy5mZWF0dXJl LmRlc3Ryb3koKTt9fQp0aGlzLmxheWVyPW51bGw7dGhpcy5mZWF0dXJlPW51bGw7 ZGVhY3RpdmF0ZWQ9dHJ1ZTt9CnJldHVybiBkZWFjdGl2YXRlZDt9LGRvd246ZnVu Y3Rpb24oZXZ0KXt0aGlzLmZpeGVkUmFkaXVzPSEhKHRoaXMucmFkaXVzKTt2YXIg bWFwbG9jPXRoaXMubWFwLmdldExvbkxhdEZyb21QaXhlbChldnQueHkpO3RoaXMu b3JpZ2luPW5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KG1hcGxvYy5sb24s bWFwbG9jLmxhdCk7aWYoIXRoaXMuZml4ZWRSYWRpdXN8fHRoaXMuaXJyZWd1bGFy KXt0aGlzLnJhZGl1cz10aGlzLm1hcC5nZXRSZXNvbHV0aW9uKCk7fQppZih0aGlz LnBlcnNpc3Qpe3RoaXMuY2xlYXIoKTt9CnRoaXMuZmVhdHVyZT1uZXcgT3Blbkxh eWVycy5GZWF0dXJlLlZlY3RvcigpO3RoaXMuY3JlYXRlR2VvbWV0cnkoKTt0aGlz LmNhbGxiYWNrKCJjcmVhdGUiLFt0aGlzLm9yaWdpbix0aGlzLmZlYXR1cmVdKTt0 aGlzLmxheWVyLmFkZEZlYXR1cmVzKFt0aGlzLmZlYXR1cmVdLHtzaWxlbnQ6dHJ1 ZX0pO3RoaXMubGF5ZXIuZHJhd0ZlYXR1cmUodGhpcy5mZWF0dXJlLHRoaXMuc3R5 bGUpO30sbW92ZTpmdW5jdGlvbihldnQpe3ZhciBtYXBsb2M9dGhpcy5tYXAuZ2V0 TG9uTGF0RnJvbVBpeGVsKGV2dC54eSk7dmFyIHBvaW50PW5ldyBPcGVuTGF5ZXJz Lkdlb21ldHJ5LlBvaW50KG1hcGxvYy5sb24sbWFwbG9jLmxhdCk7aWYodGhpcy5p cnJlZ3VsYXIpe3ZhciByeT1NYXRoLnNxcnQoMikqTWF0aC5hYnMocG9pbnQueS10 aGlzLm9yaWdpbi55KS8yO3RoaXMucmFkaXVzPU1hdGgubWF4KHRoaXMubWFwLmdl dFJlc29sdXRpb24oKS8yLHJ5KTt9ZWxzZSBpZih0aGlzLmZpeGVkUmFkaXVzKXt0 aGlzLm9yaWdpbj1wb2ludDt9ZWxzZXt0aGlzLmNhbGN1bGF0ZUFuZ2xlKHBvaW50 LGV2dCk7dGhpcy5yYWRpdXM9TWF0aC5tYXgodGhpcy5tYXAuZ2V0UmVzb2x1dGlv bigpLzIscG9pbnQuZGlzdGFuY2VUbyh0aGlzLm9yaWdpbikpO30KdGhpcy5tb2Rp ZnlHZW9tZXRyeSgpO2lmKHRoaXMuaXJyZWd1bGFyKXt2YXIgZHg9cG9pbnQueC10 aGlzLm9yaWdpbi54O3ZhciBkeT1wb2ludC55LXRoaXMub3JpZ2luLnk7dmFyIHJh dGlvO2lmKGR5PT0wKXtyYXRpbz1keC8odGhpcy5yYWRpdXMqTWF0aC5zcXJ0KDIp KTt9ZWxzZXtyYXRpbz1keC9keTt9CnRoaXMuZmVhdHVyZS5nZW9tZXRyeS5yZXNp emUoMSx0aGlzLm9yaWdpbixyYXRpbyk7dGhpcy5mZWF0dXJlLmdlb21ldHJ5Lm1v dmUoZHgvMixkeS8yKTt9CnRoaXMubGF5ZXIuZHJhd0ZlYXR1cmUodGhpcy5mZWF0 dXJlLHRoaXMuc3R5bGUpO30sdXA6ZnVuY3Rpb24oZXZ0KXt0aGlzLmZpbmFsaXpl KCk7aWYodGhpcy5zdGFydD09dGhpcy5sYXN0KXt0aGlzLmNhbGxiYWNrKCJkb25l IixbZXZ0Lnh5XSk7fX0sb3V0OmZ1bmN0aW9uKGV2dCl7dGhpcy5maW5hbGl6ZSgp O30sY3JlYXRlR2VvbWV0cnk6ZnVuY3Rpb24oKXt0aGlzLmFuZ2xlPU1hdGguUEkq KCgxL3RoaXMuc2lkZXMpLSgxLzIpKTtpZih0aGlzLnNuYXBBbmdsZSl7dGhpcy5h bmdsZSs9dGhpcy5zbmFwQW5nbGUqKE1hdGguUEkvMTgwKTt9CnRoaXMuZmVhdHVy ZS5nZW9tZXRyeT1PcGVuTGF5ZXJzLkdlb21ldHJ5LlBvbHlnb24uY3JlYXRlUmVn dWxhclBvbHlnb24odGhpcy5vcmlnaW4sdGhpcy5yYWRpdXMsdGhpcy5zaWRlcyx0 aGlzLnNuYXBBbmdsZSk7fSxtb2RpZnlHZW9tZXRyeTpmdW5jdGlvbigpe3ZhciBh bmdsZSxwb2ludDt2YXIgcmluZz10aGlzLmZlYXR1cmUuZ2VvbWV0cnkuY29tcG9u ZW50c1swXTtpZihyaW5nLmNvbXBvbmVudHMubGVuZ3RoIT0odGhpcy5zaWRlcysx KSl7dGhpcy5jcmVhdGVHZW9tZXRyeSgpO3Jpbmc9dGhpcy5mZWF0dXJlLmdlb21l dHJ5LmNvbXBvbmVudHNbMF07fQpmb3IodmFyIGk9MDtpPHRoaXMuc2lkZXM7Kytp KXtwb2ludD1yaW5nLmNvbXBvbmVudHNbaV07YW5nbGU9dGhpcy5hbmdsZSsoaSoy Kk1hdGguUEkvdGhpcy5zaWRlcyk7cG9pbnQueD10aGlzLm9yaWdpbi54Kyh0aGlz LnJhZGl1cypNYXRoLmNvcyhhbmdsZSkpO3BvaW50Lnk9dGhpcy5vcmlnaW4ueSso dGhpcy5yYWRpdXMqTWF0aC5zaW4oYW5nbGUpKTtwb2ludC5jbGVhckJvdW5kcygp O319LGNhbGN1bGF0ZUFuZ2xlOmZ1bmN0aW9uKHBvaW50LGV2dCl7dmFyIGFscGhh PU1hdGguYXRhbjIocG9pbnQueS10aGlzLm9yaWdpbi55LHBvaW50LngtdGhpcy5v cmlnaW4ueCk7aWYodGhpcy5zbmFwQW5nbGUmJih0aGlzLnNuYXBUb2dnbGUmJiFl dnRbdGhpcy5zbmFwVG9nZ2xlXSkpe3ZhciBzbmFwQW5nbGVSYWQ9KE1hdGguUEkv MTgwKSp0aGlzLnNuYXBBbmdsZTt0aGlzLmFuZ2xlPU1hdGgucm91bmQoYWxwaGEv c25hcEFuZ2xlUmFkKSpzbmFwQW5nbGVSYWQ7fWVsc2V7dGhpcy5hbmdsZT1hbHBo YTt9fSxjYW5jZWw6ZnVuY3Rpb24oKXt0aGlzLmNhbGxiYWNrKCJjYW5jZWwiLG51 bGwpO3RoaXMuZmluYWxpemUoKTt9LGZpbmFsaXplOmZ1bmN0aW9uKCl7dGhpcy5v cmlnaW49bnVsbDt0aGlzLnJhZGl1cz10aGlzLm9wdGlvbnMucmFkaXVzO30sY2xl YXI6ZnVuY3Rpb24oKXtpZih0aGlzLmxheWVyKXt0aGlzLmxheWVyLnJlbmRlcmVy LmNsZWFyKCk7dGhpcy5sYXllci5kZXN0cm95RmVhdHVyZXMoKTt9fSxjYWxsYmFj azpmdW5jdGlvbihuYW1lLGFyZ3Mpe2lmKHRoaXMuY2FsbGJhY2tzW25hbWVdKXt0 aGlzLmNhbGxiYWNrc1tuYW1lXS5hcHBseSh0aGlzLmNvbnRyb2wsW3RoaXMuZmVh dHVyZS5nZW9tZXRyeS5jbG9uZSgpXSk7fQppZighdGhpcy5wZXJzaXN0JiYobmFt ZT09ImRvbmUifHxuYW1lPT0iY2FuY2VsIikpe3RoaXMuY2xlYXIoKTt9fSxDTEFT U19OQU1FOiJPcGVuTGF5ZXJzLkhhbmRsZXIuUmVndWxhclBvbHlnb24ifSk7T3Bl bkxheWVycy5Db250cm9sLlNMRFNlbGVjdD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5M YXllcnMuQ29udHJvbCx7RVZFTlRfVFlQRVM6WyJzZWxlY3RlZCJdLGNsZWFyT25E ZWFjdGl2YXRlOmZhbHNlLGxheWVyczpudWxsLGNhbGxiYWNrczpudWxsLHNlbGVj dGlvblN5bWJvbGl6ZXI6eydQb2x5Z29uJzp7ZmlsbENvbG9yOicjRkYwMDAwJyxz dHJva2U6ZmFsc2V9LCdMaW5lJzp7c3Ryb2tlQ29sb3I6JyNGRjAwMDAnLHN0cm9r ZVdpZHRoOjJ9LCdQb2ludCc6e2dyYXBoaWNOYW1lOidzcXVhcmUnLGZpbGxDb2xv cjonI0ZGMDAwMCcscG9pbnRSYWRpdXM6NX19LGxheWVyT3B0aW9uczpudWxsLGhh bmRsZXJPcHRpb25zOm51bGwsc2tldGNoU3R5bGU6bnVsbCx3ZnNDYWNoZTp7fSxs YXllckNhY2hlOnt9LGluaXRpYWxpemU6ZnVuY3Rpb24oaGFuZGxlcixvcHRpb25z KXt0aGlzLkVWRU5UX1RZUEVTPU9wZW5MYXllcnMuQ29udHJvbC5TTERTZWxlY3Qu cHJvdG90eXBlLkVWRU5UX1RZUEVTLmNvbmNhdChPcGVuTGF5ZXJzLkNvbnRyb2wu cHJvdG90eXBlLkVWRU5UX1RZUEVTKTtPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90 eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxbb3B0aW9uc10pO3RoaXMuY2FsbGJh Y2tzPU9wZW5MYXllcnMuVXRpbC5leHRlbmQoe2RvbmU6dGhpcy5zZWxlY3QsY2xp Y2s6dGhpcy5zZWxlY3R9LHRoaXMuY2FsbGJhY2tzKTt0aGlzLmhhbmRsZXJPcHRp b25zPXRoaXMuaGFuZGxlck9wdGlvbnN8fHt9O3RoaXMubGF5ZXJPcHRpb25zPU9w ZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKHRoaXMubGF5ZXJPcHRpb25zLHtk aXNwbGF5SW5MYXllclN3aXRjaGVyOmZhbHNlLHRpbGVPcHRpb25zOnttYXhHZXRV cmxMZW5ndGg6MjA0OH19KTtpZih0aGlzLnNrZXRjaFN0eWxlKXt0aGlzLmhhbmRs ZXJPcHRpb25zLmxheWVyT3B0aW9ucz1PcGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZh dWx0cyh0aGlzLmhhbmRsZXJPcHRpb25zLmxheWVyT3B0aW9ucyx7c3R5bGVNYXA6 bmV3IE9wZW5MYXllcnMuU3R5bGVNYXAoeyJkZWZhdWx0Ijp0aGlzLnNrZXRjaFN0 eWxlfSl9KTt9CnRoaXMuaGFuZGxlcj1uZXcgaGFuZGxlcih0aGlzLHRoaXMuY2Fs bGJhY2tzLHRoaXMuaGFuZGxlck9wdGlvbnMpO30sZGVzdHJveTpmdW5jdGlvbigp e2Zvcih2YXIga2V5IGluIHRoaXMubGF5ZXJDYWNoZSl7ZGVsZXRlIHRoaXMubGF5 ZXJDYWNoZVtrZXldO30KZm9yKHZhciBrZXkgaW4gdGhpcy53ZnNDYWNoZSl7ZGVs ZXRlIHRoaXMud2ZzQ2FjaGVba2V5XTt9Ck9wZW5MYXllcnMuQ29udHJvbC5wcm90 b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fSxjb3VwbGVMYXll clZpc2libGl0eTpmdW5jdGlvbihldnQpe3RoaXMuc2V0VmlzaWJpbGl0eShldnQu b2JqZWN0LmdldFZpc2liaWxpdHkoKSk7fSxjcmVhdGVTZWxlY3Rpb25MYXllcjpm dW5jdGlvbihzb3VyY2Upe3ZhciBzZWxlY3Rpb25MYXllcjtpZighdGhpcy5sYXll ckNhY2hlW3NvdXJjZS5pZF0pe3NlbGVjdGlvbkxheWVyPW5ldyBPcGVuTGF5ZXJz LkxheWVyLldNUyhzb3VyY2UubmFtZSxzb3VyY2UudXJsLHNvdXJjZS5wYXJhbXMs T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHModGhpcy5sYXllck9wdGlvbnMs c291cmNlLmdldE9wdGlvbnMoKSkpO3RoaXMubGF5ZXJDYWNoZVtzb3VyY2UuaWRd PXNlbGVjdGlvbkxheWVyO2lmKHRoaXMubGF5ZXJPcHRpb25zLmRpc3BsYXlJbkxh eWVyU3dpdGNoZXI9PT1mYWxzZSl7c291cmNlLmV2ZW50cy5vbih7InZpc2liaWxp dHljaGFuZ2VkIjp0aGlzLmNvdXBsZUxheWVyVmlzaWJsaXR5LHNjb3BlOnNlbGVj dGlvbkxheWVyfSk7fQp0aGlzLm1hcC5hZGRMYXllcihzZWxlY3Rpb25MYXllcik7 fWVsc2V7c2VsZWN0aW9uTGF5ZXI9dGhpcy5sYXllckNhY2hlW3NvdXJjZS5pZF07 fQpyZXR1cm4gc2VsZWN0aW9uTGF5ZXI7fSxjcmVhdGVTTEQ6ZnVuY3Rpb24obGF5 ZXIsZmlsdGVycyxnZW9tZXRyeUF0dHJpYnV0ZXMpe3ZhciBzbGQ9e3ZlcnNpb246 IjEuMC4wIixuYW1lZExheWVyczp7fX07dmFyIGxheWVyTmFtZXM9W2xheWVyLnBh cmFtcy5MQVlFUlNdLmpvaW4oIiwiKS5zcGxpdCgiLCIpO2Zvcih2YXIgaT0wLGxl bj1sYXllck5hbWVzLmxlbmd0aDtpPGxlbjtpKyspe3ZhciBuYW1lPWxheWVyTmFt ZXNbaV07c2xkLm5hbWVkTGF5ZXJzW25hbWVdPXtuYW1lOm5hbWUsdXNlclN0eWxl czpbXX07dmFyIHN5bWJvbGl6ZXI9dGhpcy5zZWxlY3Rpb25TeW1ib2xpemVyO3Zh ciBnZW9tZXRyeUF0dHJpYnV0ZT1nZW9tZXRyeUF0dHJpYnV0ZXNbaV07aWYoZ2Vv bWV0cnlBdHRyaWJ1dGUudHlwZS5pbmRleE9mKCdQb2x5Z29uJyk+PTApe3N5bWJv bGl6ZXI9e1BvbHlnb246dGhpcy5zZWxlY3Rpb25TeW1ib2xpemVyWydQb2x5Z29u J119O31lbHNlIGlmKGdlb21ldHJ5QXR0cmlidXRlLnR5cGUuaW5kZXhPZignTGlu ZVN0cmluZycpPj0wKXtzeW1ib2xpemVyPXtMaW5lOnRoaXMuc2VsZWN0aW9uU3lt Ym9saXplclsnTGluZSddfTt9ZWxzZSBpZihnZW9tZXRyeUF0dHJpYnV0ZS50eXBl LmluZGV4T2YoJ1BvaW50Jyk+PTApe3N5bWJvbGl6ZXI9e1BvaW50OnRoaXMuc2Vs ZWN0aW9uU3ltYm9saXplclsnUG9pbnQnXX07fQp2YXIgZmlsdGVyPWZpbHRlcnNb aV07c2xkLm5hbWVkTGF5ZXJzW25hbWVdLnVzZXJTdHlsZXMucHVzaCh7bmFtZTon ZGVmYXVsdCcscnVsZXM6W25ldyBPcGVuTGF5ZXJzLlJ1bGUoe3N5bWJvbGl6ZXI6 c3ltYm9saXplcixmaWx0ZXI6ZmlsdGVyLG1heFNjYWxlRGVub21pbmF0b3I6bGF5 ZXIub3B0aW9ucy5taW5TY2FsZX0pXX0pO30KcmV0dXJuIG5ldyBPcGVuTGF5ZXJz LkZvcm1hdC5TTEQoe3Nyc05hbWU6dGhpcy5tYXAuZ2V0UHJvamVjdGlvbigpfSku d3JpdGUoc2xkKTt9LHBhcnNlRGVzY3JpYmVMYXllcjpmdW5jdGlvbihyZXF1ZXN0 KXt2YXIgZm9ybWF0PW5ldyBPcGVuTGF5ZXJzLkZvcm1hdC5XTVNEZXNjcmliZUxh eWVyKCk7dmFyIGRvYz1yZXF1ZXN0LnJlc3BvbnNlWE1MO2lmKCFkb2N8fCFkb2Mu ZG9jdW1lbnRFbGVtZW50KXtkb2M9cmVxdWVzdC5yZXNwb25zZVRleHQ7fQp2YXIg ZGVzY3JpYmVMYXllcj1mb3JtYXQucmVhZChkb2MpO3ZhciB0eXBlTmFtZXM9W107 dmFyIHVybD1udWxsO2Zvcih2YXIgaT0wLGxlbj1kZXNjcmliZUxheWVyLmxlbmd0 aDtpPGxlbjtpKyspe2lmKGRlc2NyaWJlTGF5ZXJbaV0ub3dzVHlwZT09IldGUyIp e3R5cGVOYW1lcy5wdXNoKGRlc2NyaWJlTGF5ZXJbaV0udHlwZU5hbWUpO3VybD1k ZXNjcmliZUxheWVyW2ldLm93c1VSTDt9fQp2YXIgb3B0aW9ucz17dXJsOnVybCxw YXJhbXM6e1NFUlZJQ0U6IldGUyIsVFlQRU5BTUU6dHlwZU5hbWVzLnRvU3RyaW5n KCksUkVRVUVTVDoiRGVzY3JpYmVGZWF0dXJlVHlwZSIsVkVSU0lPTjoiMS4wLjAi fSxjYWxsYmFjazpmdW5jdGlvbihyZXF1ZXN0KXt2YXIgZm9ybWF0PW5ldyBPcGVu TGF5ZXJzLkZvcm1hdC5XRlNEZXNjcmliZUZlYXR1cmVUeXBlKCk7dmFyIGRvYz1y ZXF1ZXN0LnJlc3BvbnNlWE1MO2lmKCFkb2N8fCFkb2MuZG9jdW1lbnRFbGVtZW50 KXtkb2M9cmVxdWVzdC5yZXNwb25zZVRleHQ7fQp2YXIgZGVzY3JpYmVGZWF0dXJl VHlwZT1mb3JtYXQucmVhZChkb2MpO3RoaXMuY29udHJvbC53ZnNDYWNoZVt0aGlz LmxheWVyLmlkXT1kZXNjcmliZUZlYXR1cmVUeXBlO3RoaXMuY29udHJvbC5fcXVl dWUmJnRoaXMuY29udHJvbC5hcHBseVNlbGVjdGlvbigpO30sc2NvcGU6dGhpc307 T3BlbkxheWVycy5SZXF1ZXN0LkdFVChvcHRpb25zKTt9LGdldEdlb21ldHJ5QXR0 cmlidXRlczpmdW5jdGlvbihsYXllcil7dmFyIHJlc3VsdD1bXTt2YXIgY2FjaGU9 dGhpcy53ZnNDYWNoZVtsYXllci5pZF07Zm9yKHZhciBpPTAsbGVuPWNhY2hlLmZl YXR1cmVUeXBlcy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgdHlwZU5hbWU9Y2FjaGUu ZmVhdHVyZVR5cGVzW2ldO3ZhciBwcm9wZXJ0aWVzPXR5cGVOYW1lLnByb3BlcnRp ZXM7Zm9yKHZhciBqPTAsbGVuaj1wcm9wZXJ0aWVzLmxlbmd0aDtqPGxlbmo7aisr KXt2YXIgcHJvcGVydHk9cHJvcGVydGllc1tqXTt2YXIgdHlwZT1wcm9wZXJ0eS50 eXBlO2lmKCh0eXBlLmluZGV4T2YoJ0xpbmVTdHJpbmcnKT49MCl8fCh0eXBlLmlu ZGV4T2YoJ0dlb21ldHJ5QXNzb2NpYXRpb25UeXBlJyk+PTApfHwodHlwZS5pbmRl eE9mKCdHZW9tZXRyeVByb3BlcnR5VHlwZScpPj0wKXx8KHR5cGUuaW5kZXhPZign UG9pbnQnKT49MCl8fCh0eXBlLmluZGV4T2YoJ1BvbHlnb24nKT49MCkpe3Jlc3Vs dC5wdXNoKHByb3BlcnR5KTt9fX0KcmV0dXJuIHJlc3VsdDt9LGFjdGl2YXRlOmZ1 bmN0aW9uKCl7dmFyIGFjdGl2YXRlZD1PcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90 eXBlLmFjdGl2YXRlLmNhbGwodGhpcyk7aWYoYWN0aXZhdGVkKXtmb3IodmFyIGk9 MCxsZW49dGhpcy5sYXllcnMubGVuZ3RoO2k8bGVuO2krKyl7dmFyIGxheWVyPXRo aXMubGF5ZXJzW2ldO2lmKGxheWVyJiYhdGhpcy53ZnNDYWNoZVtsYXllci5pZF0p e3ZhciBvcHRpb25zPXt1cmw6bGF5ZXIudXJsLHBhcmFtczp7U0VSVklDRToiV01T IixWRVJTSU9OOmxheWVyLnBhcmFtcy5WRVJTSU9OLExBWUVSUzpsYXllci5wYXJh bXMuTEFZRVJTLFJFUVVFU1Q6IkRlc2NyaWJlTGF5ZXIifSxjYWxsYmFjazp0aGlz LnBhcnNlRGVzY3JpYmVMYXllcixzY29wZTp7bGF5ZXI6bGF5ZXIsY29udHJvbDp0 aGlzfX07T3BlbkxheWVycy5SZXF1ZXN0LkdFVChvcHRpb25zKTt9fX0KcmV0dXJu IGFjdGl2YXRlZDt9LGRlYWN0aXZhdGU6ZnVuY3Rpb24oKXt2YXIgZGVhY3RpdmF0 ZWQ9T3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5kZWFjdGl2YXRlLmNhbGwo dGhpcyk7aWYoZGVhY3RpdmF0ZWQpe2Zvcih2YXIgaT0wLGxlbj10aGlzLmxheWVy cy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgbGF5ZXI9dGhpcy5sYXllcnNbaV07aWYo bGF5ZXImJnRoaXMuY2xlYXJPbkRlYWN0aXZhdGU9PT10cnVlKXt2YXIgbGF5ZXJD YWNoZT10aGlzLmxheWVyQ2FjaGU7dmFyIHNlbGVjdGlvbkxheWVyPWxheWVyQ2Fj aGVbbGF5ZXIuaWRdO2lmKHNlbGVjdGlvbkxheWVyKXtsYXllci5ldmVudHMudW4o eyJ2aXNpYmlsaXR5Y2hhbmdlZCI6dGhpcy5jb3VwbGVMYXllclZpc2libGl0eSxz Y29wZTpzZWxlY3Rpb25MYXllcn0pO3NlbGVjdGlvbkxheWVyLmRlc3Ryb3koKTtk ZWxldGUgbGF5ZXJDYWNoZVtsYXllci5pZF07fX19fQpyZXR1cm4gZGVhY3RpdmF0 ZWQ7fSxzZXRMYXllcnM6ZnVuY3Rpb24obGF5ZXJzKXtpZih0aGlzLmFjdGl2ZSl7 dGhpcy5kZWFjdGl2YXRlKCk7dGhpcy5sYXllcnM9bGF5ZXJzO3RoaXMuYWN0aXZh dGUoKTt9ZWxzZXt0aGlzLmxheWVycz1sYXllcnM7fX0sY3JlYXRlRmlsdGVyOmZ1 bmN0aW9uKGdlb21ldHJ5QXR0cmlidXRlLGdlb21ldHJ5KXt2YXIgZmlsdGVyPW51 bGw7aWYodGhpcy5oYW5kbGVyIGluc3RhbmNlb2YgT3BlbkxheWVycy5IYW5kbGVy LlJlZ3VsYXJQb2x5Z29uKXtpZih0aGlzLmhhbmRsZXIuaXJyZWd1bGFyPT09dHJ1 ZSl7ZmlsdGVyPW5ldyBPcGVuTGF5ZXJzLkZpbHRlci5TcGF0aWFsKHt0eXBlOk9w ZW5MYXllcnMuRmlsdGVyLlNwYXRpYWwuQkJPWCxwcm9wZXJ0eTpnZW9tZXRyeUF0 dHJpYnV0ZS5uYW1lLHZhbHVlOmdlb21ldHJ5LmdldEJvdW5kcygpfSk7fWVsc2V7 ZmlsdGVyPW5ldyBPcGVuTGF5ZXJzLkZpbHRlci5TcGF0aWFsKHt0eXBlOk9wZW5M YXllcnMuRmlsdGVyLlNwYXRpYWwuSU5URVJTRUNUUyxwcm9wZXJ0eTpnZW9tZXRy eUF0dHJpYnV0ZS5uYW1lLHZhbHVlOmdlb21ldHJ5fSk7fX1lbHNlIGlmKHRoaXMu aGFuZGxlciBpbnN0YW5jZW9mIE9wZW5MYXllcnMuSGFuZGxlci5Qb2x5Z29uKXtm aWx0ZXI9bmV3IE9wZW5MYXllcnMuRmlsdGVyLlNwYXRpYWwoe3R5cGU6T3Blbkxh eWVycy5GaWx0ZXIuU3BhdGlhbC5JTlRFUlNFQ1RTLHByb3BlcnR5Omdlb21ldHJ5 QXR0cmlidXRlLm5hbWUsdmFsdWU6Z2VvbWV0cnl9KTt9ZWxzZSBpZih0aGlzLmhh bmRsZXIgaW5zdGFuY2VvZiBPcGVuTGF5ZXJzLkhhbmRsZXIuUGF0aCl7aWYoZ2Vv bWV0cnlBdHRyaWJ1dGUudHlwZS5pbmRleE9mKCdQb2ludCcpPj0wKXtmaWx0ZXI9 bmV3IE9wZW5MYXllcnMuRmlsdGVyLlNwYXRpYWwoe3R5cGU6T3BlbkxheWVycy5G aWx0ZXIuU3BhdGlhbC5EV0lUSElOLHByb3BlcnR5Omdlb21ldHJ5QXR0cmlidXRl Lm5hbWUsZGlzdGFuY2U6dGhpcy5tYXAuZ2V0RXh0ZW50KCkuZ2V0V2lkdGgoKSow LjAxLGRpc3RhbmNlVW5pdHM6dGhpcy5tYXAuZ2V0VW5pdHMoKSx2YWx1ZTpnZW9t ZXRyeX0pO31lbHNle2ZpbHRlcj1uZXcgT3BlbkxheWVycy5GaWx0ZXIuU3BhdGlh bCh7dHlwZTpPcGVuTGF5ZXJzLkZpbHRlci5TcGF0aWFsLklOVEVSU0VDVFMscHJv cGVydHk6Z2VvbWV0cnlBdHRyaWJ1dGUubmFtZSx2YWx1ZTpnZW9tZXRyeX0pO319 ZWxzZSBpZih0aGlzLmhhbmRsZXIgaW5zdGFuY2VvZiBPcGVuTGF5ZXJzLkhhbmRs ZXIuQ2xpY2spe2lmKGdlb21ldHJ5QXR0cmlidXRlLnR5cGUuaW5kZXhPZignUG9s eWdvbicpPj0wKXtmaWx0ZXI9bmV3IE9wZW5MYXllcnMuRmlsdGVyLlNwYXRpYWwo e3R5cGU6T3BlbkxheWVycy5GaWx0ZXIuU3BhdGlhbC5JTlRFUlNFQ1RTLHByb3Bl cnR5Omdlb21ldHJ5QXR0cmlidXRlLm5hbWUsdmFsdWU6Z2VvbWV0cnl9KTt9ZWxz ZXtmaWx0ZXI9bmV3IE9wZW5MYXllcnMuRmlsdGVyLlNwYXRpYWwoe3R5cGU6T3Bl bkxheWVycy5GaWx0ZXIuU3BhdGlhbC5EV0lUSElOLHByb3BlcnR5Omdlb21ldHJ5 QXR0cmlidXRlLm5hbWUsZGlzdGFuY2U6dGhpcy5tYXAuZ2V0RXh0ZW50KCkuZ2V0 V2lkdGgoKSowLjAxLGRpc3RhbmNlVW5pdHM6dGhpcy5tYXAuZ2V0VW5pdHMoKSx2 YWx1ZTpnZW9tZXRyeX0pO319CnJldHVybiBmaWx0ZXI7fSxzZWxlY3Q6ZnVuY3Rp b24oZ2VvbWV0cnkpe3RoaXMuX3F1ZXVlPWZ1bmN0aW9uKCl7Zm9yKHZhciBpPTAs bGVuPXRoaXMubGF5ZXJzLmxlbmd0aDtpPGxlbjtpKyspe3ZhciBsYXllcj10aGlz LmxheWVyc1tpXTt2YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzPXRoaXMuZ2V0R2VvbWV0 cnlBdHRyaWJ1dGVzKGxheWVyKTt2YXIgZmlsdGVycz1bXTtmb3IodmFyIGo9MCxs ZW5qPWdlb21ldHJ5QXR0cmlidXRlcy5sZW5ndGg7ajxsZW5qO2orKyl7dmFyIGdl b21ldHJ5QXR0cmlidXRlPWdlb21ldHJ5QXR0cmlidXRlc1tqXTtpZihnZW9tZXRy eUF0dHJpYnV0ZSE9PW51bGwpe2lmKCEoZ2VvbWV0cnkgaW5zdGFuY2VvZiBPcGVu TGF5ZXJzLkdlb21ldHJ5KSl7dmFyIHBvaW50PXRoaXMubWFwLmdldExvbkxhdEZy b21QaXhlbChnZW9tZXRyeS54eSk7Z2VvbWV0cnk9bmV3IE9wZW5MYXllcnMuR2Vv bWV0cnkuUG9pbnQocG9pbnQubG9uLHBvaW50LmxhdCk7fQp2YXIgZmlsdGVyPXRo aXMuY3JlYXRlRmlsdGVyKGdlb21ldHJ5QXR0cmlidXRlLGdlb21ldHJ5KTtpZihm aWx0ZXIhPT1udWxsKXtmaWx0ZXJzLnB1c2goZmlsdGVyKTt9fX0KdmFyIHNlbGVj dGlvbkxheWVyPXRoaXMuY3JlYXRlU2VsZWN0aW9uTGF5ZXIobGF5ZXIpO3ZhciBz bGQ9dGhpcy5jcmVhdGVTTEQobGF5ZXIsZmlsdGVycyxnZW9tZXRyeUF0dHJpYnV0 ZXMpO3RoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgic2VsZWN0ZWQiLHtsYXllcjps YXllcixmaWx0ZXJzOmZpbHRlcnN9KTtzZWxlY3Rpb25MYXllci5tZXJnZU5ld1Bh cmFtcyh7U0xEX0JPRFk6c2xkfSk7ZGVsZXRlIHRoaXMuX3F1ZXVlO319O3RoaXMu YXBwbHlTZWxlY3Rpb24oKTt9LGFwcGx5U2VsZWN0aW9uOmZ1bmN0aW9uKCl7dmFy IGNhbkFwcGx5PXRydWU7Zm9yKHZhciBpPTAsbGVuPXRoaXMubGF5ZXJzLmxlbmd0 aDtpPGxlbjtpKyspe2lmKCF0aGlzLndmc0NhY2hlW3RoaXMubGF5ZXJzW2ldLmlk XSl7Y2FuQXBwbHk9ZmFsc2U7YnJlYWs7fX0KY2FuQXBwbHkmJnRoaXMuX3F1ZXVl LmNhbGwodGhpcyk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkNvbnRyb2wuU0xE U2VsZWN0In0pO09wZW5MYXllcnMuQ29udHJvbC5TY2FsZT1PcGVuTGF5ZXJzLkNs YXNzKE9wZW5MYXllcnMuQ29udHJvbCx7ZWxlbWVudDpudWxsLGdlb2Rlc2ljOmZh bHNlLGluaXRpYWxpemU6ZnVuY3Rpb24oZWxlbWVudCxvcHRpb25zKXtPcGVuTGF5 ZXJzLkNvbnRyb2wucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxbb3B0 aW9uc10pO3RoaXMuZWxlbWVudD1PcGVuTGF5ZXJzLlV0aWwuZ2V0RWxlbWVudChl bGVtZW50KTt9LGRyYXc6ZnVuY3Rpb24oKXtPcGVuTGF5ZXJzLkNvbnRyb2wucHJv dG90eXBlLmRyYXcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmVsZW1l bnQpe3RoaXMuZWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0 aGlzLmRpdi5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO30KdGhpcy5tYXAuZXZl bnRzLnJlZ2lzdGVyKCdtb3ZlZW5kJyx0aGlzLHRoaXMudXBkYXRlU2NhbGUpO3Ro aXMudXBkYXRlU2NhbGUoKTtyZXR1cm4gdGhpcy5kaXY7fSx1cGRhdGVTY2FsZTpm dW5jdGlvbigpe3ZhciBzY2FsZTtpZih0aGlzLmdlb2Rlc2ljPT09dHJ1ZSl7dmFy IHVuaXRzPXRoaXMubWFwLmdldFVuaXRzKCk7aWYoIXVuaXRzKXtyZXR1cm47fQp2 YXIgaW5jaGVzPU9wZW5MYXllcnMuSU5DSEVTX1BFUl9VTklUO3NjYWxlPSh0aGlz Lm1hcC5nZXRHZW9kZXNpY1BpeGVsU2l6ZSgpLnd8fDAuMDAwMDAxKSppbmNoZXNb ImttIl0qT3BlbkxheWVycy5ET1RTX1BFUl9JTkNIO31lbHNle3NjYWxlPXRoaXMu bWFwLmdldFNjYWxlKCk7fQppZighc2NhbGUpe3JldHVybjt9CmlmKHNjYWxlPj05 NTAwJiZzY2FsZTw9OTUwMDAwKXtzY2FsZT1NYXRoLnJvdW5kKHNjYWxlLzEwMDAp KyJLIjt9ZWxzZSBpZihzY2FsZT49OTUwMDAwKXtzY2FsZT1NYXRoLnJvdW5kKHNj YWxlLzEwMDAwMDApKyJNIjt9ZWxzZXtzY2FsZT1NYXRoLnJvdW5kKHNjYWxlKTt9 CnRoaXMuZWxlbWVudC5pbm5lckhUTUw9T3BlbkxheWVycy5pMThuKCJTY2FsZSA9 IDEgOiAke3NjYWxlRGVub219Iix7J3NjYWxlRGVub20nOnNjYWxlfSk7fSxDTEFT U19OQU1FOiJPcGVuTGF5ZXJzLkNvbnRyb2wuU2NhbGUifSk7T3BlbkxheWVycy5D b250cm9sLkJ1dHRvbj1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuQ29udHJv bCx7dHlwZTpPcGVuTGF5ZXJzLkNvbnRyb2wuVFlQRV9CVVRUT04sdHJpZ2dlcjpm dW5jdGlvbigpe30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Db250cm9sLkJ1dHRv biJ9KTtPcGVuTGF5ZXJzLkxheWVyLk1hcEd1aWRlPU9wZW5MYXllcnMuQ2xhc3Mo T3BlbkxheWVycy5MYXllci5HcmlkLHtpc0Jhc2VMYXllcjp0cnVlLHVzZUh0dHBU aWxlOmZhbHNlLHNpbmdsZVRpbGU6ZmFsc2UsdXNlT3ZlcmxheTpmYWxzZSx1c2VB c3luY092ZXJsYXk6dHJ1ZSxUSUxFX1BBUkFNUzp7b3BlcmF0aW9uOidHRVRUSUxF SU1BR0UnLHZlcnNpb246JzEuMi4wJ30sU0lOR0xFX1RJTEVfUEFSQU1TOntvcGVy YXRpb246J0dFVE1BUElNQUdFJyxmb3JtYXQ6J1BORycsbG9jYWxlOidlbicsY2xp cDonMScsdmVyc2lvbjonMS4wLjAnfSxPVkVSTEFZX1BBUkFNUzp7b3BlcmF0aW9u OidHRVREWU5BTUlDTUFQT1ZFUkxBWUlNQUdFJyxmb3JtYXQ6J1BORycsbG9jYWxl OidlbicsY2xpcDonMScsdmVyc2lvbjonMi4wLjAnfSxGT0xERVJfUEFSQU1TOnt0 aWxlQ29sdW1uc1BlckZvbGRlcjozMCx0aWxlUm93c1BlckZvbGRlcjozMCxmb3Jt YXQ6J3BuZycscXVlcnlzdHJpbmc6bnVsbH0sZGVmYXVsdFNpemU6bmV3IE9wZW5M YXllcnMuU2l6ZSgzMDAsMzAwKSx0aWxlT3JpZ2luQ29ybmVyOiJ0bCIsaW5pdGlh bGl6ZTpmdW5jdGlvbihuYW1lLHVybCxwYXJhbXMsb3B0aW9ucyl7T3BlbkxheWVy cy5MYXllci5HcmlkLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJn dW1lbnRzKTtpZihvcHRpb25zPT1udWxsfHxvcHRpb25zLmlzQmFzZUxheWVyPT1u dWxsKXt0aGlzLmlzQmFzZUxheWVyPSgodGhpcy50cmFuc3BhcmVudCE9InRydWUi KSYmKHRoaXMudHJhbnNwYXJlbnQhPXRydWUpKTt9CmlmKG9wdGlvbnMmJm9wdGlv bnMudXNlT3ZlcmxheSE9bnVsbCl7dGhpcy51c2VPdmVybGF5PW9wdGlvbnMudXNl T3ZlcmxheTt9CmlmKHRoaXMuc2luZ2xlVGlsZSl7aWYodGhpcy51c2VPdmVybGF5 KXtPcGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyh0aGlzLnBhcmFtcyx0aGlz Lk9WRVJMQVlfUEFSQU1TKTtpZighdGhpcy51c2VBc3luY092ZXJsYXkpe3RoaXMu cGFyYW1zLnZlcnNpb249IjEuMC4wIjt9fWVsc2V7T3BlbkxheWVycy5VdGlsLmFw cGx5RGVmYXVsdHModGhpcy5wYXJhbXMsdGhpcy5TSU5HTEVfVElMRV9QQVJBTVMp O319ZWxzZXtpZih0aGlzLnVzZUh0dHBUaWxlKXtPcGVuTGF5ZXJzLlV0aWwuYXBw bHlEZWZhdWx0cyh0aGlzLnBhcmFtcyx0aGlzLkZPTERFUl9QQVJBTVMpO31lbHNl e09wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKHRoaXMucGFyYW1zLHRoaXMu VElMRV9QQVJBTVMpO30KdGhpcy5zZXRUaWxlU2l6ZSh0aGlzLmRlZmF1bHRTaXpl KTt9fSxjbG9uZTpmdW5jdGlvbihvYmope2lmKG9iaj09bnVsbCl7b2JqPW5ldyBP cGVuTGF5ZXJzLkxheWVyLk1hcEd1aWRlKHRoaXMubmFtZSx0aGlzLnVybCx0aGlz LnBhcmFtcyx0aGlzLmdldE9wdGlvbnMoKSk7fQpvYmo9T3BlbkxheWVycy5MYXll ci5HcmlkLnByb3RvdHlwZS5jbG9uZS5hcHBseSh0aGlzLFtvYmpdKTtyZXR1cm4g b2JqO30sZ2V0VVJMOmZ1bmN0aW9uKGJvdW5kcyl7dmFyIHVybDt2YXIgY2VudGVy PWJvdW5kcy5nZXRDZW50ZXJMb25MYXQoKTt2YXIgbWFwU2l6ZT10aGlzLm1hcC5n ZXRTaXplKCk7aWYodGhpcy5zaW5nbGVUaWxlKXt2YXIgcGFyYW1zPXtzZXRkaXNw bGF5ZHBpOk9wZW5MYXllcnMuRE9UU19QRVJfSU5DSCxzZXRkaXNwbGF5aGVpZ2h0 Om1hcFNpemUuaCp0aGlzLnJhdGlvLHNldGRpc3BsYXl3aWR0aDptYXBTaXplLncq dGhpcy5yYXRpbyxzZXR2aWV3Y2VudGVyeDpjZW50ZXIubG9uLHNldHZpZXdjZW50 ZXJ5OmNlbnRlci5sYXQsc2V0dmlld3NjYWxlOnRoaXMubWFwLmdldFNjYWxlKCl9 O2lmKHRoaXMudXNlT3ZlcmxheSYmIXRoaXMudXNlQXN5bmNPdmVybGF5KXt2YXIg Z2V0VmlzUGFyYW1zPXt9O2dldFZpc1BhcmFtcz1PcGVuTGF5ZXJzLlV0aWwuZXh0 ZW5kKGdldFZpc1BhcmFtcyxwYXJhbXMpO2dldFZpc1BhcmFtcy5vcGVyYXRpb249 IkdFVFZJU0lCTEVNQVBFWFRFTlQiO2dldFZpc1BhcmFtcy52ZXJzaW9uPSIxLjAu MCI7Z2V0VmlzUGFyYW1zLnNlc3Npb249dGhpcy5wYXJhbXMuc2Vzc2lvbjtnZXRW aXNQYXJhbXMubWFwTmFtZT10aGlzLnBhcmFtcy5tYXBOYW1lO2dldFZpc1BhcmFt cy5mb3JtYXQ9J3RleHQveG1sJzt1cmw9dGhpcy5nZXRGdWxsUmVxdWVzdFN0cmlu ZyhnZXRWaXNQYXJhbXMpO09wZW5MYXllcnMuUmVxdWVzdC5HRVQoe3VybDp1cmws YXN5bmM6ZmFsc2V9KTt9CnVybD10aGlzLmdldEZ1bGxSZXF1ZXN0U3RyaW5nKHBh cmFtcyk7fWVsc2V7dmFyIGN1cnJlbnRSZXM9dGhpcy5tYXAuZ2V0UmVzb2x1dGlv bigpO3ZhciBjb2xpZHg9TWF0aC5mbG9vcigoYm91bmRzLmxlZnQtdGhpcy5tYXhF eHRlbnQubGVmdCkvY3VycmVudFJlcyk7Y29saWR4PU1hdGgucm91bmQoY29saWR4 L3RoaXMudGlsZVNpemUudyk7dmFyIHJvd2lkeD1NYXRoLmZsb29yKCh0aGlzLm1h eEV4dGVudC50b3AtYm91bmRzLnRvcCkvY3VycmVudFJlcyk7cm93aWR4PU1hdGgu cm91bmQocm93aWR4L3RoaXMudGlsZVNpemUuaCk7aWYodGhpcy51c2VIdHRwVGls ZSl7dXJsPXRoaXMuZ2V0SW1hZ2VGaWxlUGF0aCh7dGlsZWNvbDpjb2xpZHgsdGls ZXJvdzpyb3dpZHgsc2NhbGVpbmRleDp0aGlzLnJlc29sdXRpb25zLmxlbmd0aC10 aGlzLm1hcC56b29tLTF9KTt9ZWxzZXt1cmw9dGhpcy5nZXRGdWxsUmVxdWVzdFN0 cmluZyh7dGlsZWNvbDpjb2xpZHgsdGlsZXJvdzpyb3dpZHgsc2NhbGVpbmRleDp0 aGlzLnJlc29sdXRpb25zLmxlbmd0aC10aGlzLm1hcC56b29tLTF9KTt9fQpyZXR1 cm4gdXJsO30sZ2V0RnVsbFJlcXVlc3RTdHJpbmc6ZnVuY3Rpb24obmV3UGFyYW1z LGFsdFVybCl7dmFyIHVybD0oYWx0VXJsPT1udWxsKT90aGlzLnVybDphbHRVcmw7 aWYodHlwZW9mIHVybD09Im9iamVjdCIpe3VybD11cmxbTWF0aC5mbG9vcihNYXRo LnJhbmRvbSgpKnVybC5sZW5ndGgpXTt9CnZhciByZXF1ZXN0U3RyaW5nPXVybDt2 YXIgYWxsUGFyYW1zPU9wZW5MYXllcnMuVXRpbC5leHRlbmQoe30sdGhpcy5wYXJh bXMpO2FsbFBhcmFtcz1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKGFsbFBhcmFtcyxu ZXdQYXJhbXMpO3ZhciB1cmxQYXJhbXM9T3BlbkxheWVycy5VdGlsLnVwcGVyQ2Fz ZU9iamVjdChPcGVuTGF5ZXJzLlV0aWwuZ2V0UGFyYW1ldGVycyh1cmwpKTtmb3Io dmFyIGtleSBpbiBhbGxQYXJhbXMpe2lmKGtleS50b1VwcGVyQ2FzZSgpaW4gdXJs UGFyYW1zKXtkZWxldGUgYWxsUGFyYW1zW2tleV07fX0KdmFyIHBhcmFtc1N0cmlu Zz1PcGVuTGF5ZXJzLlV0aWwuZ2V0UGFyYW1ldGVyU3RyaW5nKGFsbFBhcmFtcyk7 cGFyYW1zU3RyaW5nPXBhcmFtc1N0cmluZy5yZXBsYWNlKC8sL2csIisiKTtpZihw YXJhbXNTdHJpbmchPSIiKXt2YXIgbGFzdFNlcnZlckNoYXI9dXJsLmNoYXJBdCh1 cmwubGVuZ3RoLTEpO2lmKChsYXN0U2VydmVyQ2hhcj09IiYiKXx8KGxhc3RTZXJ2 ZXJDaGFyPT0iPyIpKXtyZXF1ZXN0U3RyaW5nKz1wYXJhbXNTdHJpbmc7fWVsc2V7 aWYodXJsLmluZGV4T2YoJz8nKT09LTEpe3JlcXVlc3RTdHJpbmcrPSc/JytwYXJh bXNTdHJpbmc7fWVsc2V7cmVxdWVzdFN0cmluZys9JyYnK3BhcmFtc1N0cmluZzt9 fX0KcmV0dXJuIHJlcXVlc3RTdHJpbmc7fSxnZXRJbWFnZUZpbGVQYXRoOmZ1bmN0 aW9uKG5ld1BhcmFtcyxhbHRVcmwpe3ZhciB1cmw9KGFsdFVybD09bnVsbCk/dGhp cy51cmw6YWx0VXJsO2lmKHR5cGVvZiB1cmw9PSJvYmplY3QiKXt1cmw9dXJsW01h dGguZmxvb3IoTWF0aC5yYW5kb20oKSp1cmwubGVuZ3RoKV07fQp2YXIgcmVxdWVz dFN0cmluZz11cmw7dmFyIHRpbGVSb3dHcm91cD0iIjt2YXIgdGlsZUNvbEdyb3Vw PSIiO2lmKG5ld1BhcmFtcy50aWxlcm93PDApe3RpbGVSb3dHcm91cD0nLSc7fQpp ZihuZXdQYXJhbXMudGlsZXJvdz09MCl7dGlsZVJvd0dyb3VwKz0nMCc7fWVsc2V7 dGlsZVJvd0dyb3VwKz1NYXRoLmZsb29yKE1hdGguYWJzKG5ld1BhcmFtcy50aWxl cm93L3RoaXMucGFyYW1zLnRpbGVSb3dzUGVyRm9sZGVyKSkqdGhpcy5wYXJhbXMu dGlsZVJvd3NQZXJGb2xkZXI7fQppZihuZXdQYXJhbXMudGlsZWNvbDwwKXt0aWxl Q29sR3JvdXA9Jy0nO30KaWYobmV3UGFyYW1zLnRpbGVjb2w9PTApe3RpbGVDb2xH cm91cCs9JzAnO31lbHNle3RpbGVDb2xHcm91cCs9TWF0aC5mbG9vcihNYXRoLmFi cyhuZXdQYXJhbXMudGlsZWNvbC90aGlzLnBhcmFtcy50aWxlQ29sdW1uc1BlckZv bGRlcikpKnRoaXMucGFyYW1zLnRpbGVDb2x1bW5zUGVyRm9sZGVyO30KdmFyIHRp bGVQYXRoPScvUycrTWF0aC5mbG9vcihuZXdQYXJhbXMuc2NhbGVpbmRleCkKKycv Jyt0aGlzLnBhcmFtcy5iYXNlbWFwbGF5ZXJncm91cG5hbWUKKycvUicrdGlsZVJv d0dyb3VwCisnL0MnK3RpbGVDb2xHcm91cAorJy8nKyhuZXdQYXJhbXMudGlsZXJv dyV0aGlzLnBhcmFtcy50aWxlUm93c1BlckZvbGRlcikKKydfJysobmV3UGFyYW1z LnRpbGVjb2wldGhpcy5wYXJhbXMudGlsZUNvbHVtbnNQZXJGb2xkZXIpCisnLicr dGhpcy5wYXJhbXMuZm9ybWF0O2lmKHRoaXMucGFyYW1zLnF1ZXJ5c3RyaW5nKXt0 aWxlUGF0aCs9Ij8iK3RoaXMucGFyYW1zLnF1ZXJ5c3RyaW5nO30KcmVxdWVzdFN0 cmluZys9dGlsZVBhdGg7cmV0dXJuIHJlcXVlc3RTdHJpbmc7fSxjYWxjdWxhdGVH cmlkTGF5b3V0OmZ1bmN0aW9uKGJvdW5kcyxvcmlnaW4scmVzb2x1dGlvbil7dmFy IHRpbGVsb249cmVzb2x1dGlvbip0aGlzLnRpbGVTaXplLnc7dmFyIHRpbGVsYXQ9 cmVzb2x1dGlvbip0aGlzLnRpbGVTaXplLmg7dmFyIG9mZnNldGxvbj1ib3VuZHMu bGVmdC1vcmlnaW4ubG9uO3ZhciB0aWxlY29sPU1hdGguZmxvb3Iob2Zmc2V0bG9u L3RpbGVsb24pLXRoaXMuYnVmZmVyO3ZhciB0aWxlY29scmVtYWluPW9mZnNldGxv bi90aWxlbG9uLXRpbGVjb2w7dmFyIHRpbGVvZmZzZXR4PS10aWxlY29scmVtYWlu KnRoaXMudGlsZVNpemUudzt2YXIgdGlsZW9mZnNldGxvbj1vcmlnaW4ubG9uK3Rp bGVjb2wqdGlsZWxvbjt2YXIgb2Zmc2V0bGF0PW9yaWdpbi5sYXQtYm91bmRzLnRv cCt0aWxlbGF0O3ZhciB0aWxlcm93PU1hdGguZmxvb3Iob2Zmc2V0bGF0L3RpbGVs YXQpLXRoaXMuYnVmZmVyO3ZhciB0aWxlcm93cmVtYWluPXRpbGVyb3ctb2Zmc2V0 bGF0L3RpbGVsYXQ7dmFyIHRpbGVvZmZzZXR5PXRpbGVyb3dyZW1haW4qdGhpcy50 aWxlU2l6ZS5oO3ZhciB0aWxlb2Zmc2V0bGF0PW9yaWdpbi5sYXQtdGlsZWxhdCp0 aWxlcm93O3JldHVybnt0aWxlbG9uOnRpbGVsb24sdGlsZWxhdDp0aWxlbGF0LHRp bGVvZmZzZXRsb246dGlsZW9mZnNldGxvbix0aWxlb2Zmc2V0bGF0OnRpbGVvZmZz ZXRsYXQsdGlsZW9mZnNldHg6dGlsZW9mZnNldHgsdGlsZW9mZnNldHk6dGlsZW9m ZnNldHl9O30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5MYXllci5NYXBHdWlkZSJ9 KTtPcGVuTGF5ZXJzLkNvbnRyb2wuTWVhc3VyZT1PcGVuTGF5ZXJzLkNsYXNzKE9w ZW5MYXllcnMuQ29udHJvbCx7RVZFTlRfVFlQRVM6WydtZWFzdXJlJywnbWVhc3Vy ZXBhcnRpYWwnXSxoYW5kbGVyT3B0aW9uczpudWxsLGNhbGxiYWNrczpudWxsLGRp c3BsYXlTeXN0ZW06J21ldHJpYycsZ2VvZGVzaWM6ZmFsc2UsZGlzcGxheVN5c3Rl bVVuaXRzOntnZW9ncmFwaGljOlsnZGQnXSxlbmdsaXNoOlsnbWknLCdmdCcsJ2lu J10sbWV0cmljOlsna20nLCdtJ119LHBhcnRpYWxEZWxheTozMDAsZGVsYXllZFRy aWdnZXI6bnVsbCxwZXJzaXN0OmZhbHNlLGltbWVkaWF0ZTpmYWxzZSxpbml0aWFs aXplOmZ1bmN0aW9uKGhhbmRsZXIsb3B0aW9ucyl7dGhpcy5FVkVOVF9UWVBFUz1P cGVuTGF5ZXJzLkNvbnRyb2wuTWVhc3VyZS5wcm90b3R5cGUuRVZFTlRfVFlQRVMu Y29uY2F0KE9wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUuRVZFTlRfVFlQRVMp O09wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0 aGlzLFtvcHRpb25zXSk7dmFyIGNhbGxiYWNrcz17ZG9uZTp0aGlzLm1lYXN1cmVD b21wbGV0ZSxwb2ludDp0aGlzLm1lYXN1cmVQYXJ0aWFsfTtpZih0aGlzLmltbWVk aWF0ZSl7Y2FsbGJhY2tzLm1vZGlmeT10aGlzLm1lYXN1cmVJbW1lZGlhdGU7fQp0 aGlzLmNhbGxiYWNrcz1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKGNhbGxiYWNrcyx0 aGlzLmNhbGxiYWNrcyk7dGhpcy5oYW5kbGVyT3B0aW9ucz1PcGVuTGF5ZXJzLlV0 aWwuZXh0ZW5kKHtwZXJzaXN0OnRoaXMucGVyc2lzdH0sdGhpcy5oYW5kbGVyT3B0 aW9ucyk7dGhpcy5oYW5kbGVyPW5ldyBoYW5kbGVyKHRoaXMsdGhpcy5jYWxsYmFj a3MsdGhpcy5oYW5kbGVyT3B0aW9ucyk7fSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7 dGhpcy5jYW5jZWxEZWxheSgpO3JldHVybiBPcGVuTGF5ZXJzLkNvbnRyb2wucHJv dG90eXBlLmRlYWN0aXZhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO30sY2FuY2Vs OmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxEZWxheSgpO3RoaXMuaGFuZGxlci5jYW5j ZWwoKTt9LHNldEltbWVkaWF0ZTpmdW5jdGlvbihpbW1lZGlhdGUpe3RoaXMuaW1t ZWRpYXRlPWltbWVkaWF0ZTtpZih0aGlzLmltbWVkaWF0ZSl7dGhpcy5jYWxsYmFj a3MubW9kaWZ5PXRoaXMubWVhc3VyZUltbWVkaWF0ZTt9ZWxzZXtkZWxldGUgdGhp cy5jYWxsYmFja3MubW9kaWZ5O319LHVwZGF0ZUhhbmRsZXI6ZnVuY3Rpb24oaGFu ZGxlcixvcHRpb25zKXt2YXIgYWN0aXZlPXRoaXMuYWN0aXZlO2lmKGFjdGl2ZSl7 dGhpcy5kZWFjdGl2YXRlKCk7fQp0aGlzLmhhbmRsZXI9bmV3IGhhbmRsZXIodGhp cyx0aGlzLmNhbGxiYWNrcyxvcHRpb25zKTtpZihhY3RpdmUpe3RoaXMuYWN0aXZh dGUoKTt9fSxtZWFzdXJlQ29tcGxldGU6ZnVuY3Rpb24oZ2VvbWV0cnkpe3RoaXMu Y2FuY2VsRGVsYXkoKTt0aGlzLm1lYXN1cmUoZ2VvbWV0cnksIm1lYXN1cmUiKTt9 LG1lYXN1cmVQYXJ0aWFsOmZ1bmN0aW9uKHBvaW50LGdlb21ldHJ5KXt0aGlzLmNh bmNlbERlbGF5KCk7Z2VvbWV0cnk9Z2VvbWV0cnkuY2xvbmUoKTtpZih0aGlzLmhh bmRsZXIuZnJlZWhhbmRNb2RlKHRoaXMuaGFuZGxlci5ldnQpKXt0aGlzLm1lYXN1 cmUoZ2VvbWV0cnksIm1lYXN1cmVwYXJ0aWFsIik7fWVsc2V7dGhpcy5kZWxheWVk VHJpZ2dlcj13aW5kb3cuc2V0VGltZW91dChPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJp bmQoZnVuY3Rpb24oKXt0aGlzLmRlbGF5ZWRUcmlnZ2VyPW51bGw7dGhpcy5tZWFz dXJlKGdlb21ldHJ5LCJtZWFzdXJlcGFydGlhbCIpO30sdGhpcyksdGhpcy5wYXJ0 aWFsRGVsYXkpO319LG1lYXN1cmVJbW1lZGlhdGU6ZnVuY3Rpb24ocG9pbnQsZmVh dHVyZSxkcmF3aW5nKXtpZihkcmF3aW5nJiZ0aGlzLmRlbGF5ZWRUcmlnZ2VyPT09 bnVsbCYmIXRoaXMuaGFuZGxlci5mcmVlaGFuZE1vZGUodGhpcy5oYW5kbGVyLmV2 dCkpe3RoaXMubWVhc3VyZShmZWF0dXJlLmdlb21ldHJ5LCJtZWFzdXJlcGFydGlh bCIpO319LGNhbmNlbERlbGF5OmZ1bmN0aW9uKCl7aWYodGhpcy5kZWxheWVkVHJp Z2dlciE9PW51bGwpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5kZWxheWVkVHJp Z2dlcik7dGhpcy5kZWxheWVkVHJpZ2dlcj1udWxsO319LG1lYXN1cmU6ZnVuY3Rp b24oZ2VvbWV0cnksZXZlbnRUeXBlKXt2YXIgc3RhdCxvcmRlcjtpZihnZW9tZXRy eS5DTEFTU19OQU1FLmluZGV4T2YoJ0xpbmVTdHJpbmcnKT4tMSl7c3RhdD10aGlz LmdldEJlc3RMZW5ndGgoZ2VvbWV0cnkpO29yZGVyPTE7fWVsc2V7c3RhdD10aGlz LmdldEJlc3RBcmVhKGdlb21ldHJ5KTtvcmRlcj0yO30KdGhpcy5ldmVudHMudHJp Z2dlckV2ZW50KGV2ZW50VHlwZSx7bWVhc3VyZTpzdGF0WzBdLHVuaXRzOnN0YXRb MV0sb3JkZXI6b3JkZXIsZ2VvbWV0cnk6Z2VvbWV0cnl9KTt9LGdldEJlc3RBcmVh OmZ1bmN0aW9uKGdlb21ldHJ5KXt2YXIgdW5pdHM9dGhpcy5kaXNwbGF5U3lzdGVt VW5pdHNbdGhpcy5kaXNwbGF5U3lzdGVtXTt2YXIgdW5pdCxhcmVhO2Zvcih2YXIg aT0wLGxlbj11bml0cy5sZW5ndGg7aTxsZW47KytpKXt1bml0PXVuaXRzW2ldO2Fy ZWE9dGhpcy5nZXRBcmVhKGdlb21ldHJ5LHVuaXQpO2lmKGFyZWE+MSl7YnJlYWs7 fX0KcmV0dXJuW2FyZWEsdW5pdF07fSxnZXRBcmVhOmZ1bmN0aW9uKGdlb21ldHJ5 LHVuaXRzKXt2YXIgYXJlYSxnZW9tVW5pdHM7aWYodGhpcy5nZW9kZXNpYyl7YXJl YT1nZW9tZXRyeS5nZXRHZW9kZXNpY0FyZWEodGhpcy5tYXAuZ2V0UHJvamVjdGlv bk9iamVjdCgpKTtnZW9tVW5pdHM9Im0iO31lbHNle2FyZWE9Z2VvbWV0cnkuZ2V0 QXJlYSgpO2dlb21Vbml0cz10aGlzLm1hcC5nZXRVbml0cygpO30KdmFyIGluUGVy RGlzcGxheVVuaXQ9T3BlbkxheWVycy5JTkNIRVNfUEVSX1VOSVRbdW5pdHNdO2lm KGluUGVyRGlzcGxheVVuaXQpe3ZhciBpblBlck1hcFVuaXQ9T3BlbkxheWVycy5J TkNIRVNfUEVSX1VOSVRbZ2VvbVVuaXRzXTthcmVhKj1NYXRoLnBvdygoaW5QZXJN YXBVbml0L2luUGVyRGlzcGxheVVuaXQpLDIpO30KcmV0dXJuIGFyZWE7fSxnZXRC ZXN0TGVuZ3RoOmZ1bmN0aW9uKGdlb21ldHJ5KXt2YXIgdW5pdHM9dGhpcy5kaXNw bGF5U3lzdGVtVW5pdHNbdGhpcy5kaXNwbGF5U3lzdGVtXTt2YXIgdW5pdCxsZW5n dGg7Zm9yKHZhciBpPTAsbGVuPXVuaXRzLmxlbmd0aDtpPGxlbjsrK2kpe3VuaXQ9 dW5pdHNbaV07bGVuZ3RoPXRoaXMuZ2V0TGVuZ3RoKGdlb21ldHJ5LHVuaXQpO2lm KGxlbmd0aD4xKXticmVhazt9fQpyZXR1cm5bbGVuZ3RoLHVuaXRdO30sZ2V0TGVu Z3RoOmZ1bmN0aW9uKGdlb21ldHJ5LHVuaXRzKXt2YXIgbGVuZ3RoLGdlb21Vbml0 cztpZih0aGlzLmdlb2Rlc2ljKXtsZW5ndGg9Z2VvbWV0cnkuZ2V0R2VvZGVzaWNM ZW5ndGgodGhpcy5tYXAuZ2V0UHJvamVjdGlvbk9iamVjdCgpKTtnZW9tVW5pdHM9 Im0iO31lbHNle2xlbmd0aD1nZW9tZXRyeS5nZXRMZW5ndGgoKTtnZW9tVW5pdHM9 dGhpcy5tYXAuZ2V0VW5pdHMoKTt9CnZhciBpblBlckRpc3BsYXlVbml0PU9wZW5M YXllcnMuSU5DSEVTX1BFUl9VTklUW3VuaXRzXTtpZihpblBlckRpc3BsYXlVbml0 KXt2YXIgaW5QZXJNYXBVbml0PU9wZW5MYXllcnMuSU5DSEVTX1BFUl9VTklUW2dl b21Vbml0c107bGVuZ3RoKj0oaW5QZXJNYXBVbml0L2luUGVyRGlzcGxheVVuaXQp O30KcmV0dXJuIGxlbmd0aDt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuQ29udHJv bC5NZWFzdXJlIn0pO09wZW5MYXllcnMuTGF5ZXIuS2FNYXA9T3BlbkxheWVycy5D bGFzcyhPcGVuTGF5ZXJzLkxheWVyLkdyaWQse2lzQmFzZUxheWVyOnRydWUsdW5p dHM6bnVsbCxyZXNvbHV0aW9uOk9wZW5MYXllcnMuRE9UU19QRVJfSU5DSCxERUZB VUxUX1BBUkFNUzp7aTonanBlZycsbWFwOicnfSxpbml0aWFsaXplOmZ1bmN0aW9u KG5hbWUsdXJsLHBhcmFtcyxvcHRpb25zKXt2YXIgbmV3QXJndW1lbnRzPVtdO25l d0FyZ3VtZW50cy5wdXNoKG5hbWUsdXJsLHBhcmFtcyxvcHRpb25zKTtPcGVuTGF5 ZXJzLkxheWVyLkdyaWQucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxu ZXdBcmd1bWVudHMpO3RoaXMucGFyYW1zPU9wZW5MYXllcnMuVXRpbC5hcHBseURl ZmF1bHRzKHRoaXMucGFyYW1zLHRoaXMuREVGQVVMVF9QQVJBTVMpO30sZ2V0VVJM OmZ1bmN0aW9uKGJvdW5kcyl7Ym91bmRzPXRoaXMuYWRqdXN0Qm91bmRzKGJvdW5k cyk7dmFyIG1hcFJlcz10aGlzLm1hcC5nZXRSZXNvbHV0aW9uKCk7dmFyIHNjYWxl PU1hdGgucm91bmQoKHRoaXMubWFwLmdldFNjYWxlKCkqMTAwMDApKS8xMDAwMDt2 YXIgcFg9TWF0aC5yb3VuZChib3VuZHMubGVmdC9tYXBSZXMpO3ZhciBwWT0tTWF0 aC5yb3VuZChib3VuZHMudG9wL21hcFJlcyk7cmV0dXJuIHRoaXMuZ2V0RnVsbFJl cXVlc3RTdHJpbmcoe3Q6cFksbDpwWCxzOnNjYWxlfSk7fSxjYWxjdWxhdGVHcmlk TGF5b3V0OmZ1bmN0aW9uKGJvdW5kcyxvcmlnaW4scmVzb2x1dGlvbil7dmFyIHRp bGVsb249cmVzb2x1dGlvbip0aGlzLnRpbGVTaXplLnc7dmFyIHRpbGVsYXQ9cmVz b2x1dGlvbip0aGlzLnRpbGVTaXplLmg7dmFyIG9mZnNldGxvbj1ib3VuZHMubGVm dDt2YXIgdGlsZWNvbD1NYXRoLmZsb29yKG9mZnNldGxvbi90aWxlbG9uKS10aGlz LmJ1ZmZlcjt2YXIgdGlsZWNvbHJlbWFpbj1vZmZzZXRsb24vdGlsZWxvbi10aWxl Y29sO3ZhciB0aWxlb2Zmc2V0eD0tdGlsZWNvbHJlbWFpbip0aGlzLnRpbGVTaXpl Lnc7dmFyIHRpbGVvZmZzZXRsb249dGlsZWNvbCp0aWxlbG9uO3ZhciBvZmZzZXRs YXQ9Ym91bmRzLnRvcDt2YXIgdGlsZXJvdz1NYXRoLmNlaWwob2Zmc2V0bGF0L3Rp bGVsYXQpK3RoaXMuYnVmZmVyO3ZhciB0aWxlcm93cmVtYWluPXRpbGVyb3ctb2Zm c2V0bGF0L3RpbGVsYXQ7dmFyIHRpbGVvZmZzZXR5PS0odGlsZXJvd3JlbWFpbisx KSp0aGlzLnRpbGVTaXplLmg7dmFyIHRpbGVvZmZzZXRsYXQ9dGlsZXJvdyp0aWxl bGF0O3JldHVybnt0aWxlbG9uOnRpbGVsb24sdGlsZWxhdDp0aWxlbGF0LHRpbGVv ZmZzZXRsb246dGlsZW9mZnNldGxvbix0aWxlb2Zmc2V0bGF0OnRpbGVvZmZzZXRs YXQsdGlsZW9mZnNldHg6dGlsZW9mZnNldHgsdGlsZW9mZnNldHk6dGlsZW9mZnNl dHl9O30sY2xvbmU6ZnVuY3Rpb24ob2JqKXtpZihvYmo9PW51bGwpe29iaj1uZXcg T3BlbkxheWVycy5MYXllci5LYU1hcCh0aGlzLm5hbWUsdGhpcy51cmwsdGhpcy5w YXJhbXMsdGhpcy5nZXRPcHRpb25zKCkpO30Kb2JqPU9wZW5MYXllcnMuTGF5ZXIu R3JpZC5wcm90b3R5cGUuY2xvbmUuYXBwbHkodGhpcyxbb2JqXSk7aWYodGhpcy50 aWxlU2l6ZSE9bnVsbCl7b2JqLnRpbGVTaXplPXRoaXMudGlsZVNpemUuY2xvbmUo KTt9Cm9iai5ncmlkPVtdO3JldHVybiBvYmo7fSxnZXRUaWxlQm91bmRzOmZ1bmN0 aW9uKHZpZXdQb3J0UHgpe3ZhciByZXNvbHV0aW9uPXRoaXMuZ2V0UmVzb2x1dGlv bigpO3ZhciB0aWxlTWFwV2lkdGg9cmVzb2x1dGlvbip0aGlzLnRpbGVTaXplLnc7 dmFyIHRpbGVNYXBIZWlnaHQ9cmVzb2x1dGlvbip0aGlzLnRpbGVTaXplLmg7dmFy IG1hcFBvaW50PXRoaXMuZ2V0TG9uTGF0RnJvbVZpZXdQb3J0UHgodmlld1BvcnRQ eCk7dmFyIHRpbGVMZWZ0PXRpbGVNYXBXaWR0aCpNYXRoLmZsb29yKG1hcFBvaW50 Lmxvbi90aWxlTWFwV2lkdGgpO3ZhciB0aWxlQm90dG9tPXRpbGVNYXBIZWlnaHQq TWF0aC5mbG9vcihtYXBQb2ludC5sYXQvdGlsZU1hcEhlaWdodCk7cmV0dXJuIG5l dyBPcGVuTGF5ZXJzLkJvdW5kcyh0aWxlTGVmdCx0aWxlQm90dG9tLHRpbGVMZWZ0 K3RpbGVNYXBXaWR0aCx0aWxlQm90dG9tK3RpbGVNYXBIZWlnaHQpO30sQ0xBU1Nf TkFNRToiT3BlbkxheWVycy5MYXllci5LYU1hcCJ9KTtPcGVuTGF5ZXJzLlBvcHVw LkZyYW1lZD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuUG9wdXAuQW5jaG9y ZWQse2ltYWdlU3JjOm51bGwsaW1hZ2VTaXplOm51bGwsaXNBbHBoYUltYWdlOmZh bHNlLHBvc2l0aW9uQmxvY2tzOm51bGwsYmxvY2tzOm51bGwsZml4ZWRSZWxhdGl2 ZVBvc2l0aW9uOmZhbHNlLGluaXRpYWxpemU6ZnVuY3Rpb24oaWQsbG9ubGF0LGNv bnRlbnRTaXplLGNvbnRlbnRIVE1MLGFuY2hvcixjbG9zZUJveCxjbG9zZUJveENh bGxiYWNrKXtPcGVuTGF5ZXJzLlBvcHVwLkFuY2hvcmVkLnByb3RvdHlwZS5pbml0 aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZih0aGlzLmZpeGVkUmVsYXRp dmVQb3NpdGlvbil7dGhpcy51cGRhdGVSZWxhdGl2ZVBvc2l0aW9uKCk7dGhpcy5j YWxjdWxhdGVSZWxhdGl2ZVBvc2l0aW9uPWZ1bmN0aW9uKHB4KXtyZXR1cm4gdGhp cy5yZWxhdGl2ZVBvc2l0aW9uO307fQp0aGlzLmNvbnRlbnREaXYuc3R5bGUucG9z aXRpb249ImFic29sdXRlIjt0aGlzLmNvbnRlbnREaXYuc3R5bGUuekluZGV4PTE7 aWYoY2xvc2VCb3gpe3RoaXMuY2xvc2VEaXYuc3R5bGUuekluZGV4PTE7fQp0aGlz Lmdyb3VwRGl2LnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5ncm91cERp di5zdHlsZS50b3A9IjBweCI7dGhpcy5ncm91cERpdi5zdHlsZS5sZWZ0PSIwcHgi O3RoaXMuZ3JvdXBEaXYuc3R5bGUuaGVpZ2h0PSIxMDAlIjt0aGlzLmdyb3VwRGl2 LnN0eWxlLndpZHRoPSIxMDAlIjt9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmlt YWdlU3JjPW51bGw7dGhpcy5pbWFnZVNpemU9bnVsbDt0aGlzLmlzQWxwaGFJbWFn ZT1udWxsO3RoaXMuZml4ZWRSZWxhdGl2ZVBvc2l0aW9uPWZhbHNlO3RoaXMucG9z aXRpb25CbG9ja3M9bnVsbDtmb3IodmFyIGk9MDtpPHRoaXMuYmxvY2tzLmxlbmd0 aDtpKyspe3ZhciBibG9jaz10aGlzLmJsb2Nrc1tpXTtpZihibG9jay5pbWFnZSl7 YmxvY2suZGl2LnJlbW92ZUNoaWxkKGJsb2NrLmltYWdlKTt9CmJsb2NrLmltYWdl PW51bGw7aWYoYmxvY2suZGl2KXt0aGlzLmdyb3VwRGl2LnJlbW92ZUNoaWxkKGJs b2NrLmRpdik7fQpibG9jay5kaXY9bnVsbDt9CnRoaXMuYmxvY2tzPW51bGw7T3Bl bkxheWVycy5Qb3B1cC5BbmNob3JlZC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0 aGlzLGFyZ3VtZW50cyk7fSxzZXRCYWNrZ3JvdW5kQ29sb3I6ZnVuY3Rpb24oY29s b3Ipe30sc2V0Qm9yZGVyOmZ1bmN0aW9uKCl7fSxzZXRPcGFjaXR5OmZ1bmN0aW9u KG9wYWNpdHkpe30sc2V0U2l6ZTpmdW5jdGlvbihjb250ZW50U2l6ZSl7T3Blbkxh eWVycy5Qb3B1cC5BbmNob3JlZC5wcm90b3R5cGUuc2V0U2l6ZS5hcHBseSh0aGlz LGFyZ3VtZW50cyk7dGhpcy51cGRhdGVCbG9ja3MoKTt9LHVwZGF0ZVJlbGF0aXZl UG9zaXRpb246ZnVuY3Rpb24oKXt0aGlzLnBhZGRpbmc9dGhpcy5wb3NpdGlvbkJs b2Nrc1t0aGlzLnJlbGF0aXZlUG9zaXRpb25dLnBhZGRpbmc7aWYodGhpcy5jbG9z ZURpdil7dmFyIGNvbnRlbnREaXZQYWRkaW5nPXRoaXMuZ2V0Q29udGVudERpdlBh ZGRpbmcoKTt0aGlzLmNsb3NlRGl2LnN0eWxlLnJpZ2h0PWNvbnRlbnREaXZQYWRk aW5nLnJpZ2h0Kwp0aGlzLnBhZGRpbmcucmlnaHQrInB4Ijt0aGlzLmNsb3NlRGl2 LnN0eWxlLnRvcD1jb250ZW50RGl2UGFkZGluZy50b3ArCnRoaXMucGFkZGluZy50 b3ArInB4Ijt9CnRoaXMudXBkYXRlQmxvY2tzKCk7fSxjYWxjdWxhdGVOZXdQeDpm dW5jdGlvbihweCl7dmFyIG5ld1B4PU9wZW5MYXllcnMuUG9wdXAuQW5jaG9yZWQu cHJvdG90eXBlLmNhbGN1bGF0ZU5ld1B4LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtu ZXdQeD1uZXdQeC5vZmZzZXQodGhpcy5wb3NpdGlvbkJsb2Nrc1t0aGlzLnJlbGF0 aXZlUG9zaXRpb25dLm9mZnNldCk7cmV0dXJuIG5ld1B4O30sY3JlYXRlQmxvY2tz OmZ1bmN0aW9uKCl7dGhpcy5ibG9ja3M9W107dmFyIGZpcnN0UG9zaXRpb249bnVs bDtmb3IodmFyIGtleSBpbiB0aGlzLnBvc2l0aW9uQmxvY2tzKXtmaXJzdFBvc2l0 aW9uPWtleTticmVhazt9CnZhciBwb3NpdGlvbj10aGlzLnBvc2l0aW9uQmxvY2tz W2ZpcnN0UG9zaXRpb25dO2Zvcih2YXIgaT0wO2k8cG9zaXRpb24uYmxvY2tzLmxl bmd0aDtpKyspe3ZhciBibG9jaz17fTt0aGlzLmJsb2Nrcy5wdXNoKGJsb2NrKTt2 YXIgZGl2SWQ9dGhpcy5pZCsnX0ZyYW1lRGVjb3JhdGlvbkRpdl8nK2k7YmxvY2su ZGl2PU9wZW5MYXllcnMuVXRpbC5jcmVhdGVEaXYoZGl2SWQsbnVsbCxudWxsLG51 bGwsImFic29sdXRlIixudWxsLCJoaWRkZW4iLG51bGwpO3ZhciBpbWdJZD10aGlz LmlkKydfRnJhbWVEZWNvcmF0aW9uSW1nXycraTt2YXIgaW1hZ2VDcmVhdG9yPSh0 aGlzLmlzQWxwaGFJbWFnZSk/T3BlbkxheWVycy5VdGlsLmNyZWF0ZUFscGhhSW1h Z2VEaXY6T3BlbkxheWVycy5VdGlsLmNyZWF0ZUltYWdlO2Jsb2NrLmltYWdlPWlt YWdlQ3JlYXRvcihpbWdJZCxudWxsLHRoaXMuaW1hZ2VTaXplLHRoaXMuaW1hZ2VT cmMsImFic29sdXRlIixudWxsLG51bGwsbnVsbCk7YmxvY2suZGl2LmFwcGVuZENo aWxkKGJsb2NrLmltYWdlKTt0aGlzLmdyb3VwRGl2LmFwcGVuZENoaWxkKGJsb2Nr LmRpdik7fX0sdXBkYXRlQmxvY2tzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmxvY2tz KXt0aGlzLmNyZWF0ZUJsb2NrcygpO30KaWYodGhpcy5zaXplJiZ0aGlzLnJlbGF0 aXZlUG9zaXRpb24pe3ZhciBwb3NpdGlvbj10aGlzLnBvc2l0aW9uQmxvY2tzW3Ro aXMucmVsYXRpdmVQb3NpdGlvbl07Zm9yKHZhciBpPTA7aTxwb3NpdGlvbi5ibG9j a3MubGVuZ3RoO2krKyl7dmFyIHBvc2l0aW9uQmxvY2s9cG9zaXRpb24uYmxvY2tz W2ldO3ZhciBibG9jaz10aGlzLmJsb2Nrc1tpXTt2YXIgbD1wb3NpdGlvbkJsb2Nr LmFuY2hvci5sZWZ0O3ZhciBiPXBvc2l0aW9uQmxvY2suYW5jaG9yLmJvdHRvbTt2 YXIgcj1wb3NpdGlvbkJsb2NrLmFuY2hvci5yaWdodDt2YXIgdD1wb3NpdGlvbkJs b2NrLmFuY2hvci50b3A7dmFyIHc9KGlzTmFOKHBvc2l0aW9uQmxvY2suc2l6ZS53 KSk/dGhpcy5zaXplLnctKHIrbCk6cG9zaXRpb25CbG9jay5zaXplLnc7dmFyIGg9 KGlzTmFOKHBvc2l0aW9uQmxvY2suc2l6ZS5oKSk/dGhpcy5zaXplLmgtKGIrdCk6 cG9zaXRpb25CbG9jay5zaXplLmg7YmxvY2suZGl2LnN0eWxlLndpZHRoPSh3PDA/ MDp3KSsncHgnO2Jsb2NrLmRpdi5zdHlsZS5oZWlnaHQ9KGg8MD8wOmgpKydweCc7 YmxvY2suZGl2LnN0eWxlLmxlZnQ9KGwhPW51bGwpP2wrJ3B4JzonJztibG9jay5k aXYuc3R5bGUuYm90dG9tPShiIT1udWxsKT9iKydweCc6Jyc7YmxvY2suZGl2LnN0 eWxlLnJpZ2h0PShyIT1udWxsKT9yKydweCc6Jyc7YmxvY2suZGl2LnN0eWxlLnRv cD0odCE9bnVsbCk/dCsncHgnOicnO2Jsb2NrLmltYWdlLnN0eWxlLmxlZnQ9cG9z aXRpb25CbG9jay5wb3NpdGlvbi54KydweCc7YmxvY2suaW1hZ2Uuc3R5bGUudG9w PXBvc2l0aW9uQmxvY2sucG9zaXRpb24ueSsncHgnO30KdGhpcy5jb250ZW50RGl2 LnN0eWxlLmxlZnQ9dGhpcy5wYWRkaW5nLmxlZnQrInB4Ijt0aGlzLmNvbnRlbnRE aXYuc3R5bGUudG9wPXRoaXMucGFkZGluZy50b3ArInB4Ijt9fSxDTEFTU19OQU1F OiJPcGVuTGF5ZXJzLlBvcHVwLkZyYW1lZCJ9KTtPcGVuTGF5ZXJzLlBvcHVwLkZy YW1lZENsb3VkPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Qb3B1cC5GcmFt ZWQse2NvbnRlbnREaXNwbGF5Q2xhc3M6Im9sRnJhbWVkQ2xvdWRQb3B1cENvbnRl bnQiLGF1dG9TaXplOnRydWUscGFuTWFwSWZPdXRPZlZpZXc6dHJ1ZSxpbWFnZVNp emU6bmV3IE9wZW5MYXllcnMuU2l6ZSgxMjc2LDczNiksaXNBbHBoYUltYWdlOmZh bHNlLGZpeGVkUmVsYXRpdmVQb3NpdGlvbjpmYWxzZSxwb3NpdGlvbkJsb2Nrczp7 InRsIjp7J29mZnNldCc6bmV3IE9wZW5MYXllcnMuUGl4ZWwoNDQsMCksJ3BhZGRp bmcnOm5ldyBPcGVuTGF5ZXJzLkJvdW5kcyg4LDQwLDgsOSksJ2Jsb2Nrcyc6W3tz aXplOm5ldyBPcGVuTGF5ZXJzLlNpemUoJ2F1dG8nLCdhdXRvJyksYW5jaG9yOm5l dyBPcGVuTGF5ZXJzLkJvdW5kcygwLDUxLDIyLDApLHBvc2l0aW9uOm5ldyBPcGVu TGF5ZXJzLlBpeGVsKDAsMCl9LHtzaXplOm5ldyBPcGVuTGF5ZXJzLlNpemUoMjIs J2F1dG8nKSxhbmNob3I6bmV3IE9wZW5MYXllcnMuQm91bmRzKG51bGwsNTAsMCww KSxwb3NpdGlvbjpuZXcgT3BlbkxheWVycy5QaXhlbCgtMTIzOCwwKX0se3NpemU6 bmV3IE9wZW5MYXllcnMuU2l6ZSgnYXV0bycsMTkpLGFuY2hvcjpuZXcgT3Blbkxh eWVycy5Cb3VuZHMoMCwzMiwyMixudWxsKSxwb3NpdGlvbjpuZXcgT3BlbkxheWVy cy5QaXhlbCgwLC02MzEpfSx7c2l6ZTpuZXcgT3BlbkxheWVycy5TaXplKDIyLDE4 KSxhbmNob3I6bmV3IE9wZW5MYXllcnMuQm91bmRzKG51bGwsMzIsMCxudWxsKSxw b3NpdGlvbjpuZXcgT3BlbkxheWVycy5QaXhlbCgtMTIzOCwtNjMyKX0se3NpemU6 bmV3IE9wZW5MYXllcnMuU2l6ZSg4MSwzNSksYW5jaG9yOm5ldyBPcGVuTGF5ZXJz LkJvdW5kcyhudWxsLDAsMCxudWxsKSxwb3NpdGlvbjpuZXcgT3BlbkxheWVycy5Q aXhlbCgwLC02ODgpfV19LCJ0ciI6eydvZmZzZXQnOm5ldyBPcGVuTGF5ZXJzLlBp eGVsKC00NSwwKSwncGFkZGluZyc6bmV3IE9wZW5MYXllcnMuQm91bmRzKDgsNDAs OCw5KSwnYmxvY2tzJzpbe3NpemU6bmV3IE9wZW5MYXllcnMuU2l6ZSgnYXV0bycs J2F1dG8nKSxhbmNob3I6bmV3IE9wZW5MYXllcnMuQm91bmRzKDAsNTEsMjIsMCks cG9zaXRpb246bmV3IE9wZW5MYXllcnMuUGl4ZWwoMCwwKX0se3NpemU6bmV3IE9w ZW5MYXllcnMuU2l6ZSgyMiwnYXV0bycpLGFuY2hvcjpuZXcgT3BlbkxheWVycy5C b3VuZHMobnVsbCw1MCwwLDApLHBvc2l0aW9uOm5ldyBPcGVuTGF5ZXJzLlBpeGVs KC0xMjM4LDApfSx7c2l6ZTpuZXcgT3BlbkxheWVycy5TaXplKCdhdXRvJywxOSks YW5jaG9yOm5ldyBPcGVuTGF5ZXJzLkJvdW5kcygwLDMyLDIyLG51bGwpLHBvc2l0 aW9uOm5ldyBPcGVuTGF5ZXJzLlBpeGVsKDAsLTYzMSl9LHtzaXplOm5ldyBPcGVu TGF5ZXJzLlNpemUoMjIsMTkpLGFuY2hvcjpuZXcgT3BlbkxheWVycy5Cb3VuZHMo bnVsbCwzMiwwLG51bGwpLHBvc2l0aW9uOm5ldyBPcGVuTGF5ZXJzLlBpeGVsKC0x MjM4LC02MzEpfSx7c2l6ZTpuZXcgT3BlbkxheWVycy5TaXplKDgxLDM1KSxhbmNo b3I6bmV3IE9wZW5MYXllcnMuQm91bmRzKDAsMCxudWxsLG51bGwpLHBvc2l0aW9u Om5ldyBPcGVuTGF5ZXJzLlBpeGVsKC0yMTUsLTY4Nyl9XX0sImJsIjp7J29mZnNl dCc6bmV3IE9wZW5MYXllcnMuUGl4ZWwoNDUsMCksJ3BhZGRpbmcnOm5ldyBPcGVu TGF5ZXJzLkJvdW5kcyg4LDksOCw0MCksJ2Jsb2Nrcyc6W3tzaXplOm5ldyBPcGVu TGF5ZXJzLlNpemUoJ2F1dG8nLCdhdXRvJyksYW5jaG9yOm5ldyBPcGVuTGF5ZXJz LkJvdW5kcygwLDIxLDIyLDMyKSxwb3NpdGlvbjpuZXcgT3BlbkxheWVycy5QaXhl bCgwLDApfSx7c2l6ZTpuZXcgT3BlbkxheWVycy5TaXplKDIyLCdhdXRvJyksYW5j aG9yOm5ldyBPcGVuTGF5ZXJzLkJvdW5kcyhudWxsLDIxLDAsMzIpLHBvc2l0aW9u Om5ldyBPcGVuTGF5ZXJzLlBpeGVsKC0xMjM4LDApfSx7c2l6ZTpuZXcgT3Blbkxh eWVycy5TaXplKCdhdXRvJywyMSksYW5jaG9yOm5ldyBPcGVuTGF5ZXJzLkJvdW5k cygwLDAsMjIsbnVsbCkscG9zaXRpb246bmV3IE9wZW5MYXllcnMuUGl4ZWwoMCwt NjI5KX0se3NpemU6bmV3IE9wZW5MYXllcnMuU2l6ZSgyMiwyMSksYW5jaG9yOm5l dyBPcGVuTGF5ZXJzLkJvdW5kcyhudWxsLDAsMCxudWxsKSxwb3NpdGlvbjpuZXcg T3BlbkxheWVycy5QaXhlbCgtMTIzOCwtNjI5KX0se3NpemU6bmV3IE9wZW5MYXll cnMuU2l6ZSg4MSwzMyksYW5jaG9yOm5ldyBPcGVuTGF5ZXJzLkJvdW5kcyhudWxs LG51bGwsMCwwKSxwb3NpdGlvbjpuZXcgT3BlbkxheWVycy5QaXhlbCgtMTAxLC02 NzQpfV19LCJiciI6eydvZmZzZXQnOm5ldyBPcGVuTGF5ZXJzLlBpeGVsKC00NCww KSwncGFkZGluZyc6bmV3IE9wZW5MYXllcnMuQm91bmRzKDgsOSw4LDQwKSwnYmxv Y2tzJzpbe3NpemU6bmV3IE9wZW5MYXllcnMuU2l6ZSgnYXV0bycsJ2F1dG8nKSxh bmNob3I6bmV3IE9wZW5MYXllcnMuQm91bmRzKDAsMjEsMjIsMzIpLHBvc2l0aW9u Om5ldyBPcGVuTGF5ZXJzLlBpeGVsKDAsMCl9LHtzaXplOm5ldyBPcGVuTGF5ZXJz LlNpemUoMjIsJ2F1dG8nKSxhbmNob3I6bmV3IE9wZW5MYXllcnMuQm91bmRzKG51 bGwsMjEsMCwzMikscG9zaXRpb246bmV3IE9wZW5MYXllcnMuUGl4ZWwoLTEyMzgs MCl9LHtzaXplOm5ldyBPcGVuTGF5ZXJzLlNpemUoJ2F1dG8nLDIxKSxhbmNob3I6 bmV3IE9wZW5MYXllcnMuQm91bmRzKDAsMCwyMixudWxsKSxwb3NpdGlvbjpuZXcg T3BlbkxheWVycy5QaXhlbCgwLC02MjkpfSx7c2l6ZTpuZXcgT3BlbkxheWVycy5T aXplKDIyLDIxKSxhbmNob3I6bmV3IE9wZW5MYXllcnMuQm91bmRzKG51bGwsMCww LG51bGwpLHBvc2l0aW9uOm5ldyBPcGVuTGF5ZXJzLlBpeGVsKC0xMjM4LC02Mjkp fSx7c2l6ZTpuZXcgT3BlbkxheWVycy5TaXplKDgxLDMzKSxhbmNob3I6bmV3IE9w ZW5MYXllcnMuQm91bmRzKDAsbnVsbCxudWxsLDApLHBvc2l0aW9uOm5ldyBPcGVu TGF5ZXJzLlBpeGVsKC0zMTEsLTY3NCl9XX19LG1pblNpemU6bmV3IE9wZW5MYXll cnMuU2l6ZSgxMDUsMTApLG1heFNpemU6bmV3IE9wZW5MYXllcnMuU2l6ZSgxMjAw LDY2MCksaW5pdGlhbGl6ZTpmdW5jdGlvbihpZCxsb25sYXQsY29udGVudFNpemUs Y29udGVudEhUTUwsYW5jaG9yLGNsb3NlQm94LGNsb3NlQm94Q2FsbGJhY2spe3Ro aXMuaW1hZ2VTcmM9T3BlbkxheWVycy5VdGlsLmdldEltYWdlc0xvY2F0aW9uKCkr J2Nsb3VkLXBvcHVwLXJlbGF0aXZlLnBuZyc7T3BlbkxheWVycy5Qb3B1cC5GcmFt ZWQucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Ro aXMuY29udGVudERpdi5jbGFzc05hbWU9dGhpcy5jb250ZW50RGlzcGxheUNsYXNz O30sZGVzdHJveTpmdW5jdGlvbigpe09wZW5MYXllcnMuUG9wdXAuRnJhbWVkLnBy b3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LENMQVNTX05B TUU6Ik9wZW5MYXllcnMuUG9wdXAuRnJhbWVkQ2xvdWQifSk7T3BlbkxheWVycy5U aWxlLkltYWdlLklGcmFtZT17dXNlSUZyYW1lOm51bGwsY2xlYXI6ZnVuY3Rpb24o KXtpZih0aGlzLnVzZUlGcmFtZSl7aWYodGhpcy5pbWdEaXYpe3ZhciBpRnJhbWU9 dGhpcy5pbWdEaXYuZmlyc3RDaGlsZDtPcGVuTGF5ZXJzLkV2ZW50LnN0b3BPYnNl cnZpbmdFbGVtZW50KGlGcmFtZSk7dGhpcy5pbWdEaXYucmVtb3ZlQ2hpbGQoaUZy YW1lKTtkZWxldGUgaUZyYW1lO319ZWxzZXtPcGVuTGF5ZXJzLlRpbGUuSW1hZ2Uu cHJvdG90eXBlLmNsZWFyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9fSxyZW5kZXJU aWxlOmZ1bmN0aW9uKCl7aWYoT3BlbkxheWVycy5UaWxlLkltYWdlLnByb3RvdHlw ZS5yZW5kZXJUaWxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSYmdGhpcy51c2VJRnJh bWUpe3ZhciBmb3JtPXRoaXMuY3JlYXRlUmVxdWVzdEZvcm0oKTt0aGlzLmltZ0Rp di5hcHBlbmRDaGlsZChmb3JtKTtmb3JtLnN1Ym1pdCgpO3RoaXMuaW1nRGl2LnJl bW92ZUNoaWxkKGZvcm0pO2RlbGV0ZSBmb3JtO30KcmV0dXJuIHRydWU7fSxpbml0 SW1nRGl2OmZ1bmN0aW9uKCl7dGhpcy51c2VJRnJhbWU9dGhpcy5tYXhHZXRVcmxM ZW5ndGghPT1udWxsJiYhdGhpcy5sYXllci5hc3luYyYmdGhpcy51cmwubGVuZ3Ro PnRoaXMubWF4R2V0VXJsTGVuZ3RoO2lmKHRoaXMuaW1nRGl2IT1udWxsKXt2YXIg bm9kZU5hbWU9dGhpcy5pbWdEaXYubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigo dGhpcy51c2VJRnJhbWUmJm5vZGVOYW1lPT0iaW1nIil8fCghdGhpcy51c2VJRnJh bWUmJm5vZGVOYW1lPT0iZGl2Iikpe3RoaXMucmVtb3ZlSW1nRGl2KCk7dGhpcy5p bWdEaXY9bnVsbDt9fQppZih0aGlzLnVzZUlGcmFtZSl7aWYodGhpcy5pbWdEaXY9 PW51bGwpe3ZhciBldmVudFBhbmU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2 Iik7aWYoT3BlbkxheWVycy5CUk9XU0VSX05BTUU9PSJtc2llIil7ZXZlbnRQYW5l LnN0eWxlLmJhY2tncm91bmRDb2xvcj0nI0ZGRkZGRic7ZXZlbnRQYW5lLnN0eWxl LmZpbHRlcj0nY2hyb21hKGNvbG9yPSNGRkZGRkYpJzt9Ck9wZW5MYXllcnMuVXRp bC5tb2RpZnlET01FbGVtZW50KGV2ZW50UGFuZSxudWxsLG5ldyBPcGVuTGF5ZXJz LlBpeGVsKDAsMCksdGhpcy5sYXllci5nZXRJbWFnZVNpemUoKSwiYWJzb2x1dGUi KTt0aGlzLmltZ0Rpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlz LmltZ0Rpdi5hcHBlbmRDaGlsZChldmVudFBhbmUpO09wZW5MYXllcnMuVXRpbC5t b2RpZnlET01FbGVtZW50KHRoaXMuaW1nRGl2LHRoaXMuaWQsbnVsbCx0aGlzLmxh eWVyLmdldEltYWdlU2l6ZSgpLCJyZWxhdGl2ZSIpO3RoaXMuaW1nRGl2LmNsYXNz TmFtZT0nb2xUaWxlSW1hZ2UnO3RoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5p bWdEaXYpO3RoaXMubGF5ZXIuZGl2LmFwcGVuZENoaWxkKHRoaXMuZnJhbWUpO2lm KHRoaXMubGF5ZXIub3BhY2l0eSE9bnVsbCl7T3BlbkxheWVycy5VdGlsLm1vZGlm eURPTUVsZW1lbnQodGhpcy5pbWdEaXYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxs LG51bGwsdGhpcy5sYXllci5vcGFjaXR5KTt9CnRoaXMuaW1nRGl2Lm1hcD10aGlz LmxheWVyLm1hcDt9CnRoaXMuaW1nRGl2LnZpZXdSZXF1ZXN0SUQ9dGhpcy5sYXll ci5tYXAudmlld1JlcXVlc3RJRDt9ZWxzZXtPcGVuTGF5ZXJzLlRpbGUuSW1hZ2Uu cHJvdG90eXBlLmluaXRJbWdEaXYuYXBwbHkodGhpcyxhcmd1bWVudHMpO319LGNy ZWF0ZUlGcmFtZTpmdW5jdGlvbigpe3ZhciBpZD10aGlzLmlkKydfaUZyYW1lJzt2 YXIgaWZyYW1lO2lmKE9wZW5MYXllcnMuQlJPV1NFUl9OQU1FPT0ibXNpZSIpe2lm cmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCc8aWZyYW1lIG5hbWU9IicraWQr JyI+Jyk7aWZyYW1lLnN0eWxlLmJhY2tncm91bmRDb2xvcj0nI0ZGRkZGRic7aWZy YW1lLnN0eWxlLmZpbHRlcj0nY2hyb21hKGNvbG9yPSNGRkZGRkYpJzt9CmVsc2V7 aWZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO2lmcmFtZS5z dHlsZS5iYWNrZ3JvdW5kQ29sb3I9J3RyYW5zcGFyZW50JztpZnJhbWUubmFtZT1p ZDt9CmlmcmFtZS5pZD1pZDtpZnJhbWUuc2Nyb2xsaW5nPSdubyc7aWZyYW1lLm1h cmdpbldpZHRoPScwcHgnO2lmcmFtZS5tYXJnaW5IZWlnaHQ9JzBweCc7aWZyYW1l LmZyYW1lQm9yZGVyPScwJztPcGVuTGF5ZXJzLlV0aWwubW9kaWZ5RE9NRWxlbWVu dChpZnJhbWUsaWQsbmV3IE9wZW5MYXllcnMuUGl4ZWwoMCwwKSx0aGlzLmxheWVy LmdldEltYWdlU2l6ZSgpLCJhYnNvbHV0ZSIpO3ZhciBvbmxvYWQ9ZnVuY3Rpb24o KXtpZih0aGlzLmlzTG9hZGluZyl7dGhpcy5pc0xvYWRpbmc9ZmFsc2U7dGhpcy5l dmVudHMudHJpZ2dlckV2ZW50KCJsb2FkZW5kIik7fX07T3BlbkxheWVycy5FdmVu dC5vYnNlcnZlKGlmcmFtZSwnbG9hZCcsT3BlbkxheWVycy5GdW5jdGlvbi5iaW5k KG9ubG9hZCx0aGlzKSk7cmV0dXJuIGlmcmFtZTt9LGNyZWF0ZVJlcXVlc3RGb3Jt OmZ1bmN0aW9uKCl7dmFyIGZvcm09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9y bScpO2Zvcm0ubWV0aG9kPSdQT1NUJzt2YXIgY2FjaGVJZD10aGlzLmxheWVyLnBh cmFtc1siX09MU0FMVCJdO2NhY2hlSWQ9KGNhY2hlSWQ/Y2FjaGVJZCsiXyI6IiIp K3RoaXMuYm91bmRzLnRvQkJPWCgpO2Zvcm0uYWN0aW9uPU9wZW5MYXllcnMuVXRp bC51cmxBcHBlbmQodGhpcy5sYXllci51cmwsY2FjaGVJZCk7dGhpcy5pbWdEaXYu aW5zZXJ0QmVmb3JlKHRoaXMuY3JlYXRlSUZyYW1lKCksdGhpcy5pbWdEaXYuZmly c3RDaGlsZCk7Zm9ybS50YXJnZXQ9dGhpcy5pZCsnX2lGcmFtZSc7dmFyIGltYWdl U2l6ZT10aGlzLmxheWVyLmdldEltYWdlU2l6ZSgpO3ZhciBwYXJhbXM9T3Blbkxh eWVycy5VdGlsLmdldFBhcmFtZXRlcnModGhpcy51cmwpO2Zvcih2YXIgcGFyIGlu IHBhcmFtcyl7dmFyIGZpZWxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0 Jyk7ZmllbGQudHlwZT0naGlkZGVuJztmaWVsZC5uYW1lPXBhcjtmaWVsZC52YWx1 ZT1wYXJhbXNbcGFyXTtmb3JtLmFwcGVuZENoaWxkKGZpZWxkKTt9CnJldHVybiBm b3JtO319O09wZW5MYXllcnMuR2VvbWV0cnkuUmVjdGFuZ2xlPU9wZW5MYXllcnMu Q2xhc3MoT3BlbkxheWVycy5HZW9tZXRyeSx7eDpudWxsLHk6bnVsbCx3aWR0aDpu dWxsLGhlaWdodDpudWxsLGluaXRpYWxpemU6ZnVuY3Rpb24oeCx5LHdpZHRoLGhl aWdodCl7T3BlbkxheWVycy5HZW9tZXRyeS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5h cHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy54PXg7dGhpcy55PXk7dGhpcy53aWR0 aD13aWR0aDt0aGlzLmhlaWdodD1oZWlnaHQ7fSxjYWxjdWxhdGVCb3VuZHM6ZnVu Y3Rpb24oKXt0aGlzLmJvdW5kcz1uZXcgT3BlbkxheWVycy5Cb3VuZHModGhpcy54 LHRoaXMueSx0aGlzLngrdGhpcy53aWR0aCx0aGlzLnkrdGhpcy5oZWlnaHQpO30s Z2V0TGVuZ3RoOmZ1bmN0aW9uKCl7dmFyIGxlbmd0aD0oMip0aGlzLndpZHRoKSso Mip0aGlzLmhlaWdodCk7cmV0dXJuIGxlbmd0aDt9LGdldEFyZWE6ZnVuY3Rpb24o KXt2YXIgYXJlYT10aGlzLndpZHRoKnRoaXMuaGVpZ2h0O3JldHVybiBhcmVhO30s Q0xBU1NfTkFNRToiT3BlbkxheWVycy5HZW9tZXRyeS5SZWN0YW5nbGUifSk7T3Bl bkxheWVycy5UaWxlLldGUz1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuVGls ZSx7ZmVhdHVyZXM6bnVsbCx1cmw6bnVsbCxyZXF1ZXN0Om51bGwsaW5pdGlhbGl6 ZTpmdW5jdGlvbihsYXllcixwb3NpdGlvbixib3VuZHMsdXJsLHNpemUpe09wZW5M YXllcnMuVGlsZS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3Vt ZW50cyk7dGhpcy51cmw9dXJsO3RoaXMuZmVhdHVyZXM9W107fSxkZXN0cm95OmZ1 bmN0aW9uKCl7T3BlbkxheWVycy5UaWxlLnByb3RvdHlwZS5kZXN0cm95LmFwcGx5 KHRoaXMsYXJndW1lbnRzKTt0aGlzLmRlc3Ryb3lBbGxGZWF0dXJlcygpO3RoaXMu ZmVhdHVyZXM9bnVsbDt0aGlzLnVybD1udWxsO2lmKHRoaXMucmVxdWVzdCl7dGhp cy5yZXF1ZXN0LmFib3J0KCk7dGhpcy5yZXF1ZXN0PW51bGw7fX0sY2xlYXI6ZnVu Y3Rpb24oKXt0aGlzLmRlc3Ryb3lBbGxGZWF0dXJlcygpO30sZHJhdzpmdW5jdGlv bigpe2lmKE9wZW5MYXllcnMuVGlsZS5wcm90b3R5cGUuZHJhdy5hcHBseSh0aGlz LGFyZ3VtZW50cykpe2lmKHRoaXMuaXNMb2FkaW5nKXt0aGlzLmV2ZW50cy50cmln Z2VyRXZlbnQoInJlbG9hZCIpO31lbHNle3RoaXMuaXNMb2FkaW5nPXRydWU7dGhp cy5ldmVudHMudHJpZ2dlckV2ZW50KCJsb2Fkc3RhcnQiKTt9CnRoaXMubG9hZEZl YXR1cmVzRm9yUmVnaW9uKHRoaXMucmVxdWVzdFN1Y2Nlc3MpO319LGxvYWRGZWF0 dXJlc0ZvclJlZ2lvbjpmdW5jdGlvbihzdWNjZXNzLGZhaWx1cmUpe2lmKHRoaXMu cmVxdWVzdCl7dGhpcy5yZXF1ZXN0LmFib3J0KCk7fQp0aGlzLnJlcXVlc3Q9T3Bl bkxheWVycy5SZXF1ZXN0LkdFVCh7dXJsOnRoaXMudXJsLHN1Y2Nlc3M6c3VjY2Vz cyxmYWlsdXJlOmZhaWx1cmUsc2NvcGU6dGhpc30pO30scmVxdWVzdFN1Y2Nlc3M6 ZnVuY3Rpb24ocmVxdWVzdCl7aWYodGhpcy5mZWF0dXJlcyl7dmFyIGRvYz1yZXF1 ZXN0LnJlc3BvbnNlWE1MO2lmKCFkb2N8fCFkb2MuZG9jdW1lbnRFbGVtZW50KXtk b2M9cmVxdWVzdC5yZXNwb25zZVRleHQ7fQppZih0aGlzLmxheWVyLnZlY3Rvck1v ZGUpe3RoaXMubGF5ZXIuYWRkRmVhdHVyZXModGhpcy5sYXllci5mb3JtYXRPYmpl Y3QucmVhZChkb2MpKTt9ZWxzZXt2YXIgeG1sPW5ldyBPcGVuTGF5ZXJzLkZvcm1h dC5YTUwoKTtpZih0eXBlb2YgZG9jPT0ic3RyaW5nIil7ZG9jPXhtbC5yZWFkKGRv Yyk7fQp2YXIgcmVzdWx0RmVhdHVyZXM9eG1sLmdldEVsZW1lbnRzQnlUYWdOYW1l TlMoZG9jLCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCIsImZlYXR1cmVNZW1i ZXIiKTt0aGlzLmFkZFJlc3VsdHMocmVzdWx0RmVhdHVyZXMpO319CmlmKHRoaXMu ZXZlbnRzKXt0aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQoImxvYWRlbmQiKTt9CnRo aXMucmVxdWVzdD1udWxsO30sYWRkUmVzdWx0czpmdW5jdGlvbihyZXN1bHRzKXtm b3IodmFyIGk9MDtpPHJlc3VsdHMubGVuZ3RoO2krKyl7dmFyIGZlYXR1cmU9bmV3 IHRoaXMubGF5ZXIuZmVhdHVyZUNsYXNzKHRoaXMubGF5ZXIscmVzdWx0c1tpXSk7 dGhpcy5mZWF0dXJlcy5wdXNoKGZlYXR1cmUpO319LGRlc3Ryb3lBbGxGZWF0dXJl czpmdW5jdGlvbigpe3doaWxlKHRoaXMuZmVhdHVyZXMubGVuZ3RoPjApe3ZhciBm ZWF0dXJlPXRoaXMuZmVhdHVyZXMuc2hpZnQoKTtmZWF0dXJlLmRlc3Ryb3koKTt9 fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLlRpbGUuV0ZTIn0pO09wZW5MYXllcnMu Rm9ybWF0LlNPU0NhcGFiaWxpdGllcz1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXll cnMuRm9ybWF0LlhNTC5WZXJzaW9uZWRPR0Mse2RlZmF1bHRWZXJzaW9uOiIxLjAu MCIsQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3JtYXQuU09TQ2FwYWJpbGl0aWVz In0pO09wZW5MYXllcnMuRm9ybWF0LlNPU0NhcGFiaWxpdGllcy52MV8wXzA9T3Bl bkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkZvcm1hdC5TT1NDYXBhYmlsaXRpZXMs e25hbWVzcGFjZXM6e293czoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9vd3MvMS4x Iixzb3M6Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvc29zLzEuMCIsZ21sOiJodHRw Oi8vd3d3Lm9wZW5naXMubmV0L2dtbCIseGxpbms6Imh0dHA6Ly93d3cudzMub3Jn LzE5OTkveGxpbmsifSxyZWdFeGVzOnt0cmltU3BhY2U6KC9eXHMqfFxzKiQvZyks cmVtb3ZlU3BhY2U6KC9ccyovZyksc3BsaXRTcGFjZTooL1xzKy8pLHRyaW1Db21t YTooL1xzKixccyovZyl9LGluaXRpYWxpemU6ZnVuY3Rpb24ob3B0aW9ucyl7T3Bl bkxheWVycy5Gb3JtYXQuWE1MLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRo aXMsW29wdGlvbnNdKTt0aGlzLm9wdGlvbnM9b3B0aW9uczt9LHJlYWQ6ZnVuY3Rp b24oZGF0YSl7aWYodHlwZW9mIGRhdGE9PSJzdHJpbmciKXtkYXRhPU9wZW5MYXll cnMuRm9ybWF0LlhNTC5wcm90b3R5cGUucmVhZC5hcHBseSh0aGlzLFtkYXRhXSk7 fQppZihkYXRhJiZkYXRhLm5vZGVUeXBlPT05KXtkYXRhPWRhdGEuZG9jdW1lbnRF bGVtZW50O30KdmFyIGNhcGFiaWxpdGllcz17fTt0aGlzLnJlYWROb2RlKGRhdGEs Y2FwYWJpbGl0aWVzKTtyZXR1cm4gY2FwYWJpbGl0aWVzO30scmVhZGVyczp7Imdt bCI6T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMoeyJuYW1lIjpmdW5jdGlv bihub2RlLG9iail7b2JqLm5hbWU9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO30s IlRpbWVQZXJpb2QiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmoudGltZVBlcmlvZD17 fTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqLnRpbWVQZXJpb2QpO30sImJl Z2luUG9zaXRpb24iOmZ1bmN0aW9uKG5vZGUsdGltZVBlcmlvZCl7dGltZVBlcmlv ZC5iZWdpblBvc2l0aW9uPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTt9LCJlbmRQ b3NpdGlvbiI6ZnVuY3Rpb24obm9kZSx0aW1lUGVyaW9kKXt0aW1lUGVyaW9kLmVu ZFBvc2l0aW9uPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTt9fSxPcGVuTGF5ZXJz LkZvcm1hdC5HTUwudjMucHJvdG90eXBlLnJlYWRlcnNbImdtbCJdKSwic29zIjp7 IkNhcGFiaWxpdGllcyI6ZnVuY3Rpb24obm9kZSxvYmope3RoaXMucmVhZENoaWxk Tm9kZXMobm9kZSxvYmopO30sIkNvbnRlbnRzIjpmdW5jdGlvbihub2RlLG9iail7 b2JqLmNvbnRlbnRzPXt9O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxvYmouY29u dGVudHMpO30sIk9ic2VydmF0aW9uT2ZmZXJpbmdMaXN0IjpmdW5jdGlvbihub2Rl LGNvbnRlbnRzKXtjb250ZW50cy5vZmZlcmluZ0xpc3Q9e307dGhpcy5yZWFkQ2hp bGROb2Rlcyhub2RlLGNvbnRlbnRzLm9mZmVyaW5nTGlzdCk7fSwiT2JzZXJ2YXRp b25PZmZlcmluZyI6ZnVuY3Rpb24obm9kZSxvZmZlcmluZ0xpc3Qpe3ZhciBpZD10 aGlzLmdldEF0dHJpYnV0ZU5TKG5vZGUsdGhpcy5uYW1lc3BhY2VzLmdtbCwiaWQi KTtvZmZlcmluZ0xpc3RbaWRdPXtwcm9jZWR1cmVzOltdLG9ic2VydmVkUHJvcGVy dGllczpbXSxmZWF0dXJlT2ZJbnRlcmVzdElkczpbXSxyZXNwb25zZUZvcm1hdHM6 W10scmVzdWx0TW9kZWxzOltdLHJlc3BvbnNlTW9kZXM6W119O3RoaXMucmVhZENo aWxkTm9kZXMobm9kZSxvZmZlcmluZ0xpc3RbaWRdKTt9LCJ0aW1lIjpmdW5jdGlv bihub2RlLG9mZmVyaW5nKXtvZmZlcmluZy50aW1lPXt9O3RoaXMucmVhZENoaWxk Tm9kZXMobm9kZSxvZmZlcmluZy50aW1lKTt9LCJwcm9jZWR1cmUiOmZ1bmN0aW9u KG5vZGUsb2ZmZXJpbmcpe29mZmVyaW5nLnByb2NlZHVyZXMucHVzaCh0aGlzLmdl dEF0dHJpYnV0ZU5TKG5vZGUsdGhpcy5uYW1lc3BhY2VzLnhsaW5rLCJocmVmIikp O30sIm9ic2VydmVkUHJvcGVydHkiOmZ1bmN0aW9uKG5vZGUsb2ZmZXJpbmcpe29m ZmVyaW5nLm9ic2VydmVkUHJvcGVydGllcy5wdXNoKHRoaXMuZ2V0QXR0cmlidXRl TlMobm9kZSx0aGlzLm5hbWVzcGFjZXMueGxpbmssImhyZWYiKSk7fSwiZmVhdHVy ZU9mSW50ZXJlc3QiOmZ1bmN0aW9uKG5vZGUsb2ZmZXJpbmcpe29mZmVyaW5nLmZl YXR1cmVPZkludGVyZXN0SWRzLnB1c2godGhpcy5nZXRBdHRyaWJ1dGVOUyhub2Rl LHRoaXMubmFtZXNwYWNlcy54bGluaywiaHJlZiIpKTt9LCJyZXNwb25zZUZvcm1h dCI6ZnVuY3Rpb24obm9kZSxvZmZlcmluZyl7b2ZmZXJpbmcucmVzcG9uc2VGb3Jt YXRzLnB1c2godGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpKTt9LCJyZXN1bHRNb2Rl bCI6ZnVuY3Rpb24obm9kZSxvZmZlcmluZyl7b2ZmZXJpbmcucmVzdWx0TW9kZWxz LnB1c2godGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpKTt9LCJyZXNwb25zZU1vZGUi OmZ1bmN0aW9uKG5vZGUsb2ZmZXJpbmcpe29mZmVyaW5nLnJlc3BvbnNlTW9kZXMu cHVzaCh0aGlzLmdldENoaWxkVmFsdWUobm9kZSkpOzt9fSwib3dzIjpPcGVuTGF5 ZXJzLkZvcm1hdC5PV1NDb21tb24udjFfMV8wLnByb3RvdHlwZS5yZWFkZXJzWyJv d3MiXX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3JtYXQuU09TQ2FwYWJpbGl0 aWVzLnYxXzBfMCJ9KTtPcGVuTGF5ZXJzLkhhbmRsZXIuUGluY2g9T3BlbkxheWVy cy5DbGFzcyhPcGVuTGF5ZXJzLkhhbmRsZXIse3N0YXJ0ZWQ6ZmFsc2Usc3RvcERv d246ZmFsc2UscGluY2hpbmc6ZmFsc2UsbGFzdDpudWxsLHN0YXJ0Om51bGwsaW5p dGlhbGl6ZTpmdW5jdGlvbihjb250cm9sLGNhbGxiYWNrcyxvcHRpb25zKXtPcGVu TGF5ZXJzLkhhbmRsZXIucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxh cmd1bWVudHMpO30sdG91Y2hzdGFydDpmdW5jdGlvbihldnQpe3ZhciBwcm9wYWdh dGU9dHJ1ZTt0aGlzLnBpbmNoaW5nPWZhbHNlO2lmKE9wZW5MYXllcnMuRXZlbnQu aXNNdWx0aVRvdWNoKGV2dCkpe3RoaXMuc3RhcnRlZD10cnVlO3RoaXMubGFzdD10 aGlzLnN0YXJ0PXtkaXN0YW5jZTp0aGlzLmdldERpc3RhbmNlKGV2dC50b3VjaGVz KSxkZWx0YTowLHNjYWxlOjF9O3RoaXMuY2FsbGJhY2soInN0YXJ0IixbZXZ0LHRo aXMuc3RhcnRdKTtwcm9wYWdhdGU9IXRoaXMuc3RvcERvd247fWVsc2V7dGhpcy5z dGFydGVkPWZhbHNlO3RoaXMuc3RhcnQ9bnVsbDt0aGlzLmxhc3Q9bnVsbDt9Ck9w ZW5MYXllcnMuRXZlbnQuc3RvcChldnQpO3JldHVybiBwcm9wYWdhdGU7fSx0b3Vj aG1vdmU6ZnVuY3Rpb24oZXZ0KXtpZih0aGlzLnN0YXJ0ZWQmJk9wZW5MYXllcnMu RXZlbnQuaXNNdWx0aVRvdWNoKGV2dCkpe3RoaXMucGluY2hpbmc9dHJ1ZTt2YXIg Y3VycmVudD10aGlzLmdldFBpbmNoRGF0YShldnQpO3RoaXMuY2FsbGJhY2soIm1v dmUiLFtldnQsY3VycmVudF0pO3RoaXMubGFzdD1jdXJyZW50O09wZW5MYXllcnMu RXZlbnQuc3RvcChldnQpO30KcmV0dXJuIHRydWU7fSx0b3VjaGVuZDpmdW5jdGlv bihldnQpe2lmKHRoaXMuc3RhcnRlZCl7dGhpcy5zdGFydGVkPWZhbHNlO3RoaXMu cGluY2hpbmc9ZmFsc2U7dGhpcy5jYWxsYmFjaygiZG9uZSIsW2V2dCx0aGlzLnN0 YXJ0LHRoaXMubGFzdF0pO3RoaXMuc3RhcnQ9bnVsbDt0aGlzLmxhc3Q9bnVsbDt9 CnJldHVybiB0cnVlO30sYWN0aXZhdGU6ZnVuY3Rpb24oKXt2YXIgYWN0aXZhdGVk PWZhbHNlO2lmKE9wZW5MYXllcnMuSGFuZGxlci5wcm90b3R5cGUuYWN0aXZhdGUu YXBwbHkodGhpcyxhcmd1bWVudHMpKXt0aGlzLnBpbmNoaW5nPWZhbHNlO2FjdGl2 YXRlZD10cnVlO30KcmV0dXJuIGFjdGl2YXRlZDt9LGRlYWN0aXZhdGU6ZnVuY3Rp b24oKXt2YXIgZGVhY3RpdmF0ZWQ9ZmFsc2U7aWYoT3BlbkxheWVycy5IYW5kbGVy LnByb3RvdHlwZS5kZWFjdGl2YXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dGhp cy5zdGFydGVkPWZhbHNlO3RoaXMucGluY2hpbmc9ZmFsc2U7dGhpcy5zdGFydD1u dWxsO3RoaXMubGFzdD1udWxsO2RlYWN0aXZhdGVkPXRydWU7fQpyZXR1cm4gZGVh Y3RpdmF0ZWQ7fSxnZXREaXN0YW5jZTpmdW5jdGlvbih0b3VjaGVzKXt2YXIgdDA9 dG91Y2hlc1swXTt2YXIgdDE9dG91Y2hlc1sxXTtyZXR1cm4gTWF0aC5zcXJ0KE1h dGgucG93KHQwLmNsaWVudFgtdDEuY2xpZW50WCwyKSsKTWF0aC5wb3codDAuY2xp ZW50WS10MS5jbGllbnRZLDIpKTt9LGdldFBpbmNoRGF0YTpmdW5jdGlvbihldnQp e3ZhciBkaXN0YW5jZT10aGlzLmdldERpc3RhbmNlKGV2dC50b3VjaGVzKTt2YXIg c2NhbGU9ZGlzdGFuY2UvdGhpcy5zdGFydC5kaXN0YW5jZTtyZXR1cm57ZGlzdGFu Y2U6ZGlzdGFuY2UsZGVsdGE6dGhpcy5sYXN0LmRpc3RhbmNlLWRpc3RhbmNlLHNj YWxlOnNjYWxlfTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuSGFuZGxlci5QaW5j aCJ9KTtPcGVuTGF5ZXJzLkNvbnRyb2wuTW91c2VEZWZhdWx0cz1PcGVuTGF5ZXJz LkNsYXNzKE9wZW5MYXllcnMuQ29udHJvbCx7cGVyZm9ybWVkRHJhZzpmYWxzZSx3 aGVlbE9ic2VydmVyOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbigpe09wZW5MYXll cnMuQ29udHJvbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3Vt ZW50cyk7fSxkZXN0cm95OmZ1bmN0aW9uKCl7aWYodGhpcy5oYW5kbGVyKXt0aGlz LmhhbmRsZXIuZGVzdHJveSgpO30KdGhpcy5oYW5kbGVyPW51bGw7dGhpcy5tYXAu ZXZlbnRzLnVuKHsiY2xpY2siOnRoaXMuZGVmYXVsdENsaWNrLCJkYmxjbGljayI6 dGhpcy5kZWZhdWx0RGJsQ2xpY2ssIm1vdXNlZG93biI6dGhpcy5kZWZhdWx0TW91 c2VEb3duLCJtb3VzZXVwIjp0aGlzLmRlZmF1bHRNb3VzZVVwLCJtb3VzZW1vdmUi OnRoaXMuZGVmYXVsdE1vdXNlTW92ZSwibW91c2VvdXQiOnRoaXMuZGVmYXVsdE1v dXNlT3V0LHNjb3BlOnRoaXN9KTtPcGVuTGF5ZXJzLkV2ZW50LnN0b3BPYnNlcnZp bmcod2luZG93LCJET01Nb3VzZVNjcm9sbCIsdGhpcy53aGVlbE9ic2VydmVyKTtP cGVuTGF5ZXJzLkV2ZW50LnN0b3BPYnNlcnZpbmcod2luZG93LCJtb3VzZXdoZWVs Iix0aGlzLndoZWVsT2JzZXJ2ZXIpO09wZW5MYXllcnMuRXZlbnQuc3RvcE9ic2Vy dmluZyhkb2N1bWVudCwibW91c2V3aGVlbCIsdGhpcy53aGVlbE9ic2VydmVyKTt0 aGlzLndoZWVsT2JzZXJ2ZXI9bnVsbDtPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90 eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpO30sZHJhdzpmdW5jdGlv bigpe3RoaXMubWFwLmV2ZW50cy5vbih7ImNsaWNrIjp0aGlzLmRlZmF1bHRDbGlj aywiZGJsY2xpY2siOnRoaXMuZGVmYXVsdERibENsaWNrLCJtb3VzZWRvd24iOnRo aXMuZGVmYXVsdE1vdXNlRG93biwibW91c2V1cCI6dGhpcy5kZWZhdWx0TW91c2VV cCwibW91c2Vtb3ZlIjp0aGlzLmRlZmF1bHRNb3VzZU1vdmUsIm1vdXNlb3V0Ijp0 aGlzLmRlZmF1bHRNb3VzZU91dCxzY29wZTp0aGlzfSk7dGhpcy5yZWdpc3Rlcldo ZWVsRXZlbnRzKCk7fSxyZWdpc3RlcldoZWVsRXZlbnRzOmZ1bmN0aW9uKCl7dGhp cy53aGVlbE9ic2VydmVyPU9wZW5MYXllcnMuRnVuY3Rpb24uYmluZEFzRXZlbnRM aXN0ZW5lcih0aGlzLm9uV2hlZWxFdmVudCx0aGlzKTtPcGVuTGF5ZXJzLkV2ZW50 Lm9ic2VydmUod2luZG93LCJET01Nb3VzZVNjcm9sbCIsdGhpcy53aGVlbE9ic2Vy dmVyKTtPcGVuTGF5ZXJzLkV2ZW50Lm9ic2VydmUod2luZG93LCJtb3VzZXdoZWVs Iix0aGlzLndoZWVsT2JzZXJ2ZXIpO09wZW5MYXllcnMuRXZlbnQub2JzZXJ2ZShk b2N1bWVudCwibW91c2V3aGVlbCIsdGhpcy53aGVlbE9ic2VydmVyKTt9LGRlZmF1 bHRDbGljazpmdW5jdGlvbihldnQpe2lmKCFPcGVuTGF5ZXJzLkV2ZW50LmlzTGVm dENsaWNrKGV2dCkpe3JldHVybjt9CnZhciBub3RBZnRlckRyYWc9IXRoaXMucGVy Zm9ybWVkRHJhZzt0aGlzLnBlcmZvcm1lZERyYWc9ZmFsc2U7cmV0dXJuIG5vdEFm dGVyRHJhZzt9LGRlZmF1bHREYmxDbGljazpmdW5jdGlvbihldnQpe3ZhciBuZXdD ZW50ZXI9dGhpcy5tYXAuZ2V0TG9uTGF0RnJvbVZpZXdQb3J0UHgoZXZ0Lnh5KTt0 aGlzLm1hcC5zZXRDZW50ZXIobmV3Q2VudGVyLHRoaXMubWFwLnpvb20rMSk7T3Bl bkxheWVycy5FdmVudC5zdG9wKGV2dCk7cmV0dXJuIGZhbHNlO30sZGVmYXVsdE1v dXNlRG93bjpmdW5jdGlvbihldnQpe2lmKCFPcGVuTGF5ZXJzLkV2ZW50LmlzTGVm dENsaWNrKGV2dCkpe3JldHVybjt9CnRoaXMubW91c2VEcmFnU3RhcnQ9ZXZ0Lnh5 LmNsb25lKCk7dGhpcy5wZXJmb3JtZWREcmFnPWZhbHNlO2lmKGV2dC5zaGlmdEtl eSl7dGhpcy5tYXAuZGl2LnN0eWxlLmN1cnNvcj0iY3Jvc3NoYWlyIjt0aGlzLnpv b21Cb3g9T3BlbkxheWVycy5VdGlsLmNyZWF0ZURpdignem9vbUJveCcsdGhpcy5t b3VzZURyYWdTdGFydCxudWxsLG51bGwsImFic29sdXRlIiwiMnB4IHNvbGlkIHJl ZCIpO3RoaXMuem9vbUJveC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IndoaXRlIjt0 aGlzLnpvb21Cb3guc3R5bGUuZmlsdGVyPSJhbHBoYShvcGFjaXR5PTUwKSI7dGhp cy56b29tQm94LnN0eWxlLm9wYWNpdHk9IjAuNTAiO3RoaXMuem9vbUJveC5zdHls ZS5mb250U2l6ZT0iMXB4Ijt0aGlzLnpvb21Cb3guc3R5bGUuekluZGV4PXRoaXMu bWFwLlpfSU5ERVhfQkFTRVsiUG9wdXAiXS0xO3RoaXMubWFwLmV2ZW50c0Rpdi5h cHBlbmRDaGlsZCh0aGlzLnpvb21Cb3gpO30KZG9jdW1lbnQub25zZWxlY3RzdGFy dD1PcGVuTGF5ZXJzLkZ1bmN0aW9uLkZhbHNlO09wZW5MYXllcnMuRXZlbnQuc3Rv cChldnQpO30sZGVmYXVsdE1vdXNlTW92ZTpmdW5jdGlvbihldnQpe3RoaXMubW91 c2VQb3NpdGlvbj1ldnQueHkuY2xvbmUoKTtpZih0aGlzLm1vdXNlRHJhZ1N0YXJ0 IT1udWxsKXtpZih0aGlzLnpvb21Cb3gpe3ZhciBkZWx0YVg9TWF0aC5hYnModGhp cy5tb3VzZURyYWdTdGFydC54LWV2dC54eS54KTt2YXIgZGVsdGFZPU1hdGguYWJz KHRoaXMubW91c2VEcmFnU3RhcnQueS1ldnQueHkueSk7dGhpcy56b29tQm94LnN0 eWxlLndpZHRoPU1hdGgubWF4KDEsZGVsdGFYKSsicHgiO3RoaXMuem9vbUJveC5z dHlsZS5oZWlnaHQ9TWF0aC5tYXgoMSxkZWx0YVkpKyJweCI7aWYoZXZ0Lnh5Lng8 dGhpcy5tb3VzZURyYWdTdGFydC54KXt0aGlzLnpvb21Cb3guc3R5bGUubGVmdD1l dnQueHkueCsicHgiO30KaWYoZXZ0Lnh5Lnk8dGhpcy5tb3VzZURyYWdTdGFydC55 KXt0aGlzLnpvb21Cb3guc3R5bGUudG9wPWV2dC54eS55KyJweCI7fX1lbHNle3Zh ciBkZWx0YVg9dGhpcy5tb3VzZURyYWdTdGFydC54LWV2dC54eS54O3ZhciBkZWx0 YVk9dGhpcy5tb3VzZURyYWdTdGFydC55LWV2dC54eS55O3ZhciBzaXplPXRoaXMu bWFwLmdldFNpemUoKTt2YXIgbmV3WFk9bmV3IE9wZW5MYXllcnMuUGl4ZWwoc2l6 ZS53LzIrZGVsdGFYLHNpemUuaC8yK2RlbHRhWSk7dmFyIG5ld0NlbnRlcj10aGlz Lm1hcC5nZXRMb25MYXRGcm9tVmlld1BvcnRQeChuZXdYWSk7dGhpcy5tYXAuc2V0 Q2VudGVyKG5ld0NlbnRlcixudWxsLHRydWUpO3RoaXMubW91c2VEcmFnU3RhcnQ9 ZXZ0Lnh5LmNsb25lKCk7dGhpcy5tYXAuZGl2LnN0eWxlLmN1cnNvcj0ibW92ZSI7 fQp0aGlzLnBlcmZvcm1lZERyYWc9dHJ1ZTt9fSxkZWZhdWx0TW91c2VVcDpmdW5j dGlvbihldnQpe2lmKCFPcGVuTGF5ZXJzLkV2ZW50LmlzTGVmdENsaWNrKGV2dCkp e3JldHVybjt9CmlmKHRoaXMuem9vbUJveCl7dGhpcy56b29tQm94RW5kKGV2dCk7 fWVsc2V7aWYodGhpcy5wZXJmb3JtZWREcmFnKXt0aGlzLm1hcC5zZXRDZW50ZXIo dGhpcy5tYXAuY2VudGVyKTt9fQpkb2N1bWVudC5vbnNlbGVjdHN0YXJ0PW51bGw7 dGhpcy5tb3VzZURyYWdTdGFydD1udWxsO3RoaXMubWFwLmRpdi5zdHlsZS5jdXJz b3I9IiI7fSxkZWZhdWx0TW91c2VPdXQ6ZnVuY3Rpb24oZXZ0KXtpZih0aGlzLm1v dXNlRHJhZ1N0YXJ0IT1udWxsJiZPcGVuTGF5ZXJzLlV0aWwubW91c2VMZWZ0KGV2 dCx0aGlzLm1hcC5ldmVudHNEaXYpKXtpZih0aGlzLnpvb21Cb3gpe3RoaXMucmVt b3ZlWm9vbUJveCgpO30KdGhpcy5tb3VzZURyYWdTdGFydD1udWxsO319LGRlZmF1 bHRXaGVlbFVwOmZ1bmN0aW9uKGV2dCl7aWYodGhpcy5tYXAuZ2V0Wm9vbSgpPD10 aGlzLm1hcC5nZXROdW1ab29tTGV2ZWxzKCkpe3RoaXMubWFwLnNldENlbnRlcih0 aGlzLm1hcC5nZXRMb25MYXRGcm9tUGl4ZWwoZXZ0Lnh5KSx0aGlzLm1hcC5nZXRa b29tKCkrMSk7fX0sZGVmYXVsdFdoZWVsRG93bjpmdW5jdGlvbihldnQpe2lmKHRo aXMubWFwLmdldFpvb20oKT4wKXt0aGlzLm1hcC5zZXRDZW50ZXIodGhpcy5tYXAu Z2V0TG9uTGF0RnJvbVBpeGVsKGV2dC54eSksdGhpcy5tYXAuZ2V0Wm9vbSgpLTEp O319LHpvb21Cb3hFbmQ6ZnVuY3Rpb24oZXZ0KXtpZih0aGlzLm1vdXNlRHJhZ1N0 YXJ0IT1udWxsKXtpZihNYXRoLmFicyh0aGlzLm1vdXNlRHJhZ1N0YXJ0LngtZXZ0 Lnh5LngpPjV8fE1hdGguYWJzKHRoaXMubW91c2VEcmFnU3RhcnQueS1ldnQueHku eSk+NSl7dmFyIHN0YXJ0PXRoaXMubWFwLmdldExvbkxhdEZyb21WaWV3UG9ydFB4 KHRoaXMubW91c2VEcmFnU3RhcnQpO3ZhciBlbmQ9dGhpcy5tYXAuZ2V0TG9uTGF0 RnJvbVZpZXdQb3J0UHgoZXZ0Lnh5KTt2YXIgdG9wPU1hdGgubWF4KHN0YXJ0Lmxh dCxlbmQubGF0KTt2YXIgYm90dG9tPU1hdGgubWluKHN0YXJ0LmxhdCxlbmQubGF0 KTt2YXIgbGVmdD1NYXRoLm1pbihzdGFydC5sb24sZW5kLmxvbik7dmFyIHJpZ2h0 PU1hdGgubWF4KHN0YXJ0LmxvbixlbmQubG9uKTt2YXIgYm91bmRzPW5ldyBPcGVu TGF5ZXJzLkJvdW5kcyhsZWZ0LGJvdHRvbSxyaWdodCx0b3ApO3RoaXMubWFwLnpv b21Ub0V4dGVudChib3VuZHMpO31lbHNle3ZhciBlbmQ9dGhpcy5tYXAuZ2V0TG9u TGF0RnJvbVZpZXdQb3J0UHgoZXZ0Lnh5KTt0aGlzLm1hcC5zZXRDZW50ZXIobmV3 IE9wZW5MYXllcnMuTG9uTGF0KChlbmQubG9uKSwoZW5kLmxhdCkpLHRoaXMubWFw LmdldFpvb20oKSsxKTt9CnRoaXMucmVtb3ZlWm9vbUJveCgpO319LHJlbW92ZVpv b21Cb3g6ZnVuY3Rpb24oKXt0aGlzLm1hcC5ldmVudHNEaXYucmVtb3ZlQ2hpbGQo dGhpcy56b29tQm94KTt0aGlzLnpvb21Cb3g9bnVsbDt9LG9uV2hlZWxFdmVudDpm dW5jdGlvbihlKXt2YXIgaW5NYXA9ZmFsc2U7dmFyIGVsZW09T3BlbkxheWVycy5F dmVudC5lbGVtZW50KGUpO3doaWxlKGVsZW0hPW51bGwpe2lmKHRoaXMubWFwJiZl bGVtPT10aGlzLm1hcC5kaXYpe2luTWFwPXRydWU7YnJlYWs7fQplbGVtPWVsZW0u cGFyZW50Tm9kZTt9CmlmKGluTWFwKXt2YXIgZGVsdGE9MDtpZighZSl7ZT13aW5k b3cuZXZlbnQ7fQppZihlLndoZWVsRGVsdGEpe2RlbHRhPWUud2hlZWxEZWx0YS8x MjA7aWYod2luZG93Lm9wZXJhJiZ3aW5kb3cub3BlcmEudmVyc2lvbigpPDkuMil7 ZGVsdGE9LWRlbHRhO319ZWxzZSBpZihlLmRldGFpbCl7ZGVsdGE9LWUuZGV0YWls LzM7fQppZihkZWx0YSl7ZS54eT10aGlzLm1vdXNlUG9zaXRpb247aWYoZGVsdGE8 MCl7dGhpcy5kZWZhdWx0V2hlZWxEb3duKGUpO31lbHNle3RoaXMuZGVmYXVsdFdo ZWVsVXAoZSk7fX0KT3BlbkxheWVycy5FdmVudC5zdG9wKGUpO319LENMQVNTX05B TUU6Ik9wZW5MYXllcnMuQ29udHJvbC5Nb3VzZURlZmF1bHRzIn0pO09wZW5MYXll cnMuRm9ybWF0LldGU0Rlc2NyaWJlRmVhdHVyZVR5cGU9T3BlbkxheWVycy5DbGFz cyhPcGVuTGF5ZXJzLkZvcm1hdC5YTUwse25hbWVzcGFjZXM6e3hzZDoiaHR0cDov L3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEifSxyZWFkZXJzOnsieHNkIjp7InNj aGVtYSI6ZnVuY3Rpb24obm9kZSxvYmope3ZhciBjb21wbGV4VHlwZXM9W107dmFy IGN1c3RvbVR5cGVzPXt9O3ZhciBzY2hlbWE9e2NvbXBsZXhUeXBlczpjb21wbGV4 VHlwZXMsY3VzdG9tVHlwZXM6Y3VzdG9tVHlwZXN9O3RoaXMucmVhZENoaWxkTm9k ZXMobm9kZSxzY2hlbWEpO3ZhciBhdHRyaWJ1dGVzPW5vZGUuYXR0cmlidXRlczt2 YXIgYXR0cixuYW1lO2Zvcih2YXIgaT0wLGxlbj1hdHRyaWJ1dGVzLmxlbmd0aDtp PGxlbjsrK2kpe2F0dHI9YXR0cmlidXRlc1tpXTtuYW1lPWF0dHIubmFtZTtpZihu YW1lLmluZGV4T2YoInhtbG5zIik9PTApe3RoaXMuc2V0TmFtZXNwYWNlKG5hbWUu c3BsaXQoIjoiKVsxXXx8IiIsYXR0ci52YWx1ZSk7fWVsc2V7b2JqW25hbWVdPWF0 dHIudmFsdWU7fX0Kb2JqLmZlYXR1cmVUeXBlcz1jb21wbGV4VHlwZXM7b2JqLnRh cmdldFByZWZpeD10aGlzLm5hbWVzcGFjZUFsaWFzW29iai50YXJnZXROYW1lc3Bh Y2VdO3ZhciBjb21wbGV4VHlwZSxjdXN0b21UeXBlO2Zvcih2YXIgaT0wLGxlbj1j b21wbGV4VHlwZXMubGVuZ3RoO2k8bGVuOysraSl7Y29tcGxleFR5cGU9Y29tcGxl eFR5cGVzW2ldO2N1c3RvbVR5cGU9Y3VzdG9tVHlwZXNbY29tcGxleFR5cGUudHlw ZU5hbWVdO2lmKGN1c3RvbVR5cGVzW2NvbXBsZXhUeXBlLnR5cGVOYW1lXSl7Y29t cGxleFR5cGUudHlwZU5hbWU9Y3VzdG9tVHlwZS5uYW1lO319fSwiY29tcGxleFR5 cGUiOmZ1bmN0aW9uKG5vZGUsb2JqKXt2YXIgY29tcGxleFR5cGU9eyJ0eXBlTmFt ZSI6bm9kZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKX07dGhpcy5yZWFkQ2hpbGROb2Rl cyhub2RlLGNvbXBsZXhUeXBlKTtvYmouY29tcGxleFR5cGVzLnB1c2goY29tcGxl eFR5cGUpO30sImNvbXBsZXhDb250ZW50IjpmdW5jdGlvbihub2RlLG9iail7dGhp cy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iaik7fSwiZXh0ZW5zaW9uIjpmdW5jdGlv bihub2RlLG9iail7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iaik7fSwic2Vx dWVuY2UiOmZ1bmN0aW9uKG5vZGUsb2JqKXt2YXIgc2VxdWVuY2U9e2VsZW1lbnRz OltdfTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsc2VxdWVuY2UpO29iai5wcm9w ZXJ0aWVzPXNlcXVlbmNlLmVsZW1lbnRzO30sImVsZW1lbnQiOmZ1bmN0aW9uKG5v ZGUsb2JqKXtpZihvYmouZWxlbWVudHMpe3ZhciBlbGVtZW50PXt9O3ZhciBhdHRy aWJ1dGVzPW5vZGUuYXR0cmlidXRlczt2YXIgYXR0cjtmb3IodmFyIGk9MCxsZW49 YXR0cmlidXRlcy5sZW5ndGg7aTxsZW47KytpKXthdHRyPWF0dHJpYnV0ZXNbaV07 ZWxlbWVudFthdHRyLm5hbWVdPWF0dHIudmFsdWU7fQp2YXIgdHlwZT1lbGVtZW50 LnR5cGU7aWYoIXR5cGUpe3R5cGU9e307dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2Rl LHR5cGUpO2VsZW1lbnQucmVzdHJpY3Rpb249dHlwZTtlbGVtZW50LnR5cGU9dHlw ZS5iYXNlO30KdmFyIGZ1bGxUeXBlPXR5cGUuYmFzZXx8dHlwZTtlbGVtZW50Lmxv Y2FsVHlwZT1mdWxsVHlwZS5zcGxpdCgiOiIpLnBvcCgpO29iai5lbGVtZW50cy5w dXNoKGVsZW1lbnQpO30KaWYob2JqLmNvbXBsZXhUeXBlcyl7dmFyIHR5cGU9bm9k ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKTt2YXIgbG9jYWxUeXBlPXR5cGUuc3BsaXQo IjoiKS5wb3AoKTtvYmouY3VzdG9tVHlwZXNbbG9jYWxUeXBlXT17Im5hbWUiOm5v ZGUuZ2V0QXR0cmlidXRlKCJuYW1lIiksInR5cGUiOnR5cGV9O319LCJzaW1wbGVU eXBlIjpmdW5jdGlvbihub2RlLG9iail7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2Rl LG9iaik7fSwicmVzdHJpY3Rpb24iOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmouYmFz ZT1ub2RlLmdldEF0dHJpYnV0ZSgiYmFzZSIpO3RoaXMucmVhZFJlc3RyaWN0aW9u KG5vZGUsb2JqKTt9fX0scmVhZFJlc3RyaWN0aW9uOmZ1bmN0aW9uKG5vZGUsb2Jq KXt2YXIgY2hpbGRyZW49bm9kZS5jaGlsZE5vZGVzO3ZhciBjaGlsZCxub2RlTmFt ZSx2YWx1ZTtmb3IodmFyIGk9MCxsZW49Y2hpbGRyZW4ubGVuZ3RoO2k8bGVuOysr aSl7Y2hpbGQ9Y2hpbGRyZW5baV07aWYoY2hpbGQubm9kZVR5cGU9PTEpe25vZGVO YW1lPWNoaWxkLm5vZGVOYW1lLnNwbGl0KCI6IikucG9wKCk7dmFsdWU9Y2hpbGQu Z2V0QXR0cmlidXRlKCJ2YWx1ZSIpO2lmKCFvYmpbbm9kZU5hbWVdKXtvYmpbbm9k ZU5hbWVdPXZhbHVlO31lbHNle2lmKHR5cGVvZiBvYmpbbm9kZU5hbWVdPT0ic3Ry aW5nIil7b2JqW25vZGVOYW1lXT1bb2JqW25vZGVOYW1lXV07fQpvYmpbbm9kZU5h bWVdLnB1c2godmFsdWUpO319fX0scmVhZDpmdW5jdGlvbihkYXRhKXtpZih0eXBl b2YgZGF0YT09InN0cmluZyIpe2RhdGE9T3BlbkxheWVycy5Gb3JtYXQuWE1MLnBy b3RvdHlwZS5yZWFkLmFwcGx5KHRoaXMsW2RhdGFdKTt9CmlmKGRhdGEmJmRhdGEu bm9kZVR5cGU9PTkpe2RhdGE9ZGF0YS5kb2N1bWVudEVsZW1lbnQ7fQp2YXIgc2No ZW1hPXt9O3RoaXMucmVhZE5vZGUoZGF0YSxzY2hlbWEpO3JldHVybiBzY2hlbWE7 fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5XRlNEZXNjcmliZUZlYXR1 cmVUeXBlIn0pO09wZW5MYXllcnMuU3RyYXRlZ3kuUmVmcmVzaD1PcGVuTGF5ZXJz LkNsYXNzKE9wZW5MYXllcnMuU3RyYXRlZ3kse2ZvcmNlOmZhbHNlLGludGVydmFs OjAsdGltZXI6bnVsbCxhY3RpdmF0ZTpmdW5jdGlvbigpe3ZhciBhY3RpdmF0ZWQ9 T3BlbkxheWVycy5TdHJhdGVneS5wcm90b3R5cGUuYWN0aXZhdGUuY2FsbCh0aGlz KTtpZihhY3RpdmF0ZWQpe2lmKHRoaXMubGF5ZXIudmlzaWJpbGl0eT09PXRydWUp e3RoaXMuc3RhcnQoKTt9CnRoaXMubGF5ZXIuZXZlbnRzLm9uKHsidmlzaWJpbGl0 eWNoYW5nZWQiOnRoaXMucmVzZXQsc2NvcGU6dGhpc30pO30KcmV0dXJuIGFjdGl2 YXRlZDt9LGRlYWN0aXZhdGU6ZnVuY3Rpb24oKXt2YXIgZGVhY3RpdmF0ZWQ9T3Bl bkxheWVycy5TdHJhdGVneS5wcm90b3R5cGUuZGVhY3RpdmF0ZS5jYWxsKHRoaXMp O2lmKGRlYWN0aXZhdGVkKXt0aGlzLnN0b3AoKTt9CnJldHVybiBkZWFjdGl2YXRl ZDt9LHJlc2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5sYXllci52aXNpYmlsaXR5PT09 dHJ1ZSl7dGhpcy5zdGFydCgpO31lbHNle3RoaXMuc3RvcCgpO319LHN0YXJ0OmZ1 bmN0aW9uKCl7aWYodGhpcy5pbnRlcnZhbCYmdHlwZW9mIHRoaXMuaW50ZXJ2YWw9 PT0ibnVtYmVyIiYmdGhpcy5pbnRlcnZhbD4wKXt0aGlzLnRpbWVyPXdpbmRvdy5z ZXRJbnRlcnZhbChPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQodGhpcy5yZWZyZXNo LHRoaXMpLHRoaXMuaW50ZXJ2YWwpO319LHJlZnJlc2g6ZnVuY3Rpb24oKXtpZih0 aGlzLmxheWVyJiZ0aGlzLmxheWVyLnJlZnJlc2gmJnR5cGVvZiB0aGlzLmxheWVy LnJlZnJlc2g9PSJmdW5jdGlvbiIpe3RoaXMubGF5ZXIucmVmcmVzaCh7Zm9yY2U6 dGhpcy5mb3JjZX0pO319LHN0b3A6ZnVuY3Rpb24oKXtpZih0aGlzLnRpbWVyIT09 bnVsbCl7d2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7dGhpcy50aW1l cj1udWxsO319LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuU3RyYXRlZ3kuUmVmcmVz aCJ9KTtPcGVuTGF5ZXJzLkxheWVyLkFyY0dJUzkzUmVzdD1PcGVuTGF5ZXJzLkNs YXNzKE9wZW5MYXllcnMuTGF5ZXIuR3JpZCx7REVGQVVMVF9QQVJBTVM6e2Zvcm1h dDoicG5nIn0saXNCYXNlTGF5ZXI6dHJ1ZSxpbml0aWFsaXplOmZ1bmN0aW9uKG5h bWUsdXJsLHBhcmFtcyxvcHRpb25zKXt2YXIgbmV3QXJndW1lbnRzPVtdO3BhcmFt cz1PcGVuTGF5ZXJzLlV0aWwudXBwZXJDYXNlT2JqZWN0KHBhcmFtcyk7bmV3QXJn dW1lbnRzLnB1c2gobmFtZSx1cmwscGFyYW1zLG9wdGlvbnMpO09wZW5MYXllcnMu TGF5ZXIuR3JpZC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLG5ld0Fy Z3VtZW50cyk7T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHModGhpcy5wYXJh bXMsT3BlbkxheWVycy5VdGlsLnVwcGVyQ2FzZU9iamVjdCh0aGlzLkRFRkFVTFRf UEFSQU1TKSk7aWYodGhpcy5wYXJhbXMuVFJBTlNQQVJFTlQmJnRoaXMucGFyYW1z LlRSQU5TUEFSRU5ULnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKT09InRydWUiKXtp Zigob3B0aW9ucz09bnVsbCl8fCghb3B0aW9ucy5pc0Jhc2VMYXllcikpe3RoaXMu aXNCYXNlTGF5ZXI9ZmFsc2U7fQppZih0aGlzLnBhcmFtcy5GT1JNQVQ9PSJqcGci KXt0aGlzLnBhcmFtcy5GT1JNQVQ9T3BlbkxheWVycy5VdGlsLmFscGhhSGFjaygp PyJnaWYiOiJwbmciO319fSxkZXN0cm95OmZ1bmN0aW9uKCl7T3BlbkxheWVycy5M YXllci5HcmlkLnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRz KTt9LGNsb25lOmZ1bmN0aW9uKG9iail7aWYob2JqPT1udWxsKXtvYmo9bmV3IE9w ZW5MYXllcnMuTGF5ZXIuQXJjR0lTOTNSZXN0KHRoaXMubmFtZSx0aGlzLnVybCx0 aGlzLnBhcmFtcyx0aGlzLmdldE9wdGlvbnMoKSk7fQpvYmo9T3BlbkxheWVycy5M YXllci5HcmlkLnByb3RvdHlwZS5jbG9uZS5hcHBseSh0aGlzLFtvYmpdKTtyZXR1 cm4gb2JqO30sZ2V0VVJMOmZ1bmN0aW9uKGJvdW5kcyl7Ym91bmRzPXRoaXMuYWRq dXN0Qm91bmRzKGJvdW5kcyk7dmFyIHByb2pXb3Jkcz10aGlzLnByb2plY3Rpb24u Z2V0Q29kZSgpLnNwbGl0KCI6Iik7dmFyIHNyaWQ9cHJvaldvcmRzW3Byb2pXb3Jk cy5sZW5ndGgtMV07dmFyIGltYWdlU2l6ZT10aGlzLmdldEltYWdlU2l6ZSgpO3Zh ciBuZXdQYXJhbXM9eydCQk9YJzpib3VuZHMudG9CQk9YKCksJ1NJWkUnOmltYWdl U2l6ZS53KyIsIitpbWFnZVNpemUuaCwnRic6ImltYWdlIiwnQkJPWFNSJzpzcmlk LCdJTUFHRVNSJzpzcmlkfTtpZih0aGlzLmxheWVyRGVmcyl7dmFyIGxheWVyRGVm U3RyTGlzdD1bXTt2YXIgbGF5ZXJJRDtmb3IobGF5ZXJJRCBpbiB0aGlzLmxheWVy RGVmcyl7aWYodGhpcy5sYXllckRlZnMuaGFzT3duUHJvcGVydHkobGF5ZXJJRCkp e2lmKHRoaXMubGF5ZXJEZWZzW2xheWVySURdKXtsYXllckRlZlN0ckxpc3QucHVz aChsYXllcklEKTtsYXllckRlZlN0ckxpc3QucHVzaCgiOiIpO2xheWVyRGVmU3Ry TGlzdC5wdXNoKHRoaXMubGF5ZXJEZWZzW2xheWVySURdKTtsYXllckRlZlN0ckxp c3QucHVzaCgiOyIpO319fQppZihsYXllckRlZlN0ckxpc3QubGVuZ3RoPjApe25l d1BhcmFtc1snTEFZRVJERUZTJ109bGF5ZXJEZWZTdHJMaXN0LmpvaW4oIiIpO319 CnZhciByZXF1ZXN0U3RyaW5nPXRoaXMuZ2V0RnVsbFJlcXVlc3RTdHJpbmcobmV3 UGFyYW1zKTtyZXR1cm4gcmVxdWVzdFN0cmluZzt9LHNldExheWVyRmlsdGVyOmZ1 bmN0aW9uKGlkLHF1ZXJ5RGVmKXtpZighdGhpcy5sYXllckRlZnMpe3RoaXMubGF5 ZXJEZWZzPXt9O30KaWYocXVlcnlEZWYpe3RoaXMubGF5ZXJEZWZzW2lkXT1xdWVy eURlZjt9ZWxzZXtkZWxldGUgdGhpcy5sYXllckRlZnNbaWRdO319LGNsZWFyTGF5 ZXJGaWx0ZXI6ZnVuY3Rpb24oaWQpe2lmKGlkKXtkZWxldGUgdGhpcy5sYXllckRl ZnNbaWRdO31lbHNle2RlbGV0ZSB0aGlzLmxheWVyRGVmczt9fSxtZXJnZU5ld1Bh cmFtczpmdW5jdGlvbihuZXdQYXJhbXMpe3ZhciB1cHBlclBhcmFtcz1PcGVuTGF5 ZXJzLlV0aWwudXBwZXJDYXNlT2JqZWN0KG5ld1BhcmFtcyk7dmFyIG5ld0FyZ3Vt ZW50cz1bdXBwZXJQYXJhbXNdO3JldHVybiBPcGVuTGF5ZXJzLkxheWVyLkdyaWQu cHJvdG90eXBlLm1lcmdlTmV3UGFyYW1zLmFwcGx5KHRoaXMsbmV3QXJndW1lbnRz KTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuTGF5ZXIuQXJjR0lTOTNSZXN0In0p O09wZW5MYXllcnMuTGF5ZXIuTWFwU2VydmVyPU9wZW5MYXllcnMuQ2xhc3MoT3Bl bkxheWVycy5MYXllci5HcmlkLHtERUZBVUxUX1BBUkFNUzp7bW9kZToibWFwIixt YXBfaW1hZ2V0eXBlOiJwbmcifSxpbml0aWFsaXplOmZ1bmN0aW9uKG5hbWUsdXJs LHBhcmFtcyxvcHRpb25zKXt2YXIgbmV3QXJndW1lbnRzPVtdO25ld0FyZ3VtZW50 cy5wdXNoKG5hbWUsdXJsLHBhcmFtcyxvcHRpb25zKTtPcGVuTGF5ZXJzLkxheWVy LkdyaWQucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxuZXdBcmd1bWVu dHMpO3RoaXMucGFyYW1zPU9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKHRo aXMucGFyYW1zLHRoaXMuREVGQVVMVF9QQVJBTVMpO2lmKG9wdGlvbnM9PW51bGx8 fG9wdGlvbnMuaXNCYXNlTGF5ZXI9PW51bGwpe3RoaXMuaXNCYXNlTGF5ZXI9KCh0 aGlzLnBhcmFtcy50cmFuc3BhcmVudCE9InRydWUiKSYmKHRoaXMucGFyYW1zLnRy YW5zcGFyZW50IT10cnVlKSk7fX0sY2xvbmU6ZnVuY3Rpb24ob2JqKXtpZihvYmo9 PW51bGwpe29iaj1uZXcgT3BlbkxheWVycy5MYXllci5NYXBTZXJ2ZXIodGhpcy5u YW1lLHRoaXMudXJsLHRoaXMucGFyYW1zLHRoaXMuZ2V0T3B0aW9ucygpKTt9Cm9i aj1PcGVuTGF5ZXJzLkxheWVyLkdyaWQucHJvdG90eXBlLmNsb25lLmFwcGx5KHRo aXMsW29ial0pO3JldHVybiBvYmo7fSxnZXRVUkw6ZnVuY3Rpb24oYm91bmRzKXti b3VuZHM9dGhpcy5hZGp1c3RCb3VuZHMoYm91bmRzKTt2YXIgZXh0ZW50PVtib3Vu ZHMubGVmdCxib3VuZHMuYm90dG9tLGJvdW5kcy5yaWdodCxib3VuZHMudG9wXTt2 YXIgaW1hZ2VTaXplPXRoaXMuZ2V0SW1hZ2VTaXplKCk7dmFyIHVybD10aGlzLmdl dEZ1bGxSZXF1ZXN0U3RyaW5nKHttYXBleHQ6ZXh0ZW50LGltZ2V4dDpleHRlbnQs bWFwX3NpemU6W2ltYWdlU2l6ZS53LGltYWdlU2l6ZS5oXSxpbWd4OmltYWdlU2l6 ZS53LzIsaW1neTppbWFnZVNpemUuaC8yLGltZ3h5OltpbWFnZVNpemUudyxpbWFn ZVNpemUuaF19KTtyZXR1cm4gdXJsO30sZ2V0RnVsbFJlcXVlc3RTdHJpbmc6ZnVu Y3Rpb24obmV3UGFyYW1zLGFsdFVybCl7dmFyIHVybD0oYWx0VXJsPT1udWxsKT90 aGlzLnVybDphbHRVcmw7dmFyIGFsbFBhcmFtcz1PcGVuTGF5ZXJzLlV0aWwuZXh0 ZW5kKHt9LHRoaXMucGFyYW1zKTthbGxQYXJhbXM9T3BlbkxheWVycy5VdGlsLmV4 dGVuZChhbGxQYXJhbXMsbmV3UGFyYW1zKTt2YXIgcGFyYW1zU3RyaW5nPU9wZW5M YXllcnMuVXRpbC5nZXRQYXJhbWV0ZXJTdHJpbmcoYWxsUGFyYW1zKTtpZihPcGVu TGF5ZXJzLlV0aWwuaXNBcnJheSh1cmwpKXt1cmw9dGhpcy5zZWxlY3RVcmwocGFy YW1zU3RyaW5nLHVybCk7fQp2YXIgdXJsUGFyYW1zPU9wZW5MYXllcnMuVXRpbC51 cHBlckNhc2VPYmplY3QoT3BlbkxheWVycy5VdGlsLmdldFBhcmFtZXRlcnModXJs KSk7Zm9yKHZhciBrZXkgaW4gYWxsUGFyYW1zKXtpZihrZXkudG9VcHBlckNhc2Uo KWluIHVybFBhcmFtcyl7ZGVsZXRlIGFsbFBhcmFtc1trZXldO319CnBhcmFtc1N0 cmluZz1PcGVuTGF5ZXJzLlV0aWwuZ2V0UGFyYW1ldGVyU3RyaW5nKGFsbFBhcmFt cyk7dmFyIHJlcXVlc3RTdHJpbmc9dXJsO3BhcmFtc1N0cmluZz1wYXJhbXNTdHJp bmcucmVwbGFjZSgvLC9nLCIrIik7aWYocGFyYW1zU3RyaW5nIT0iIil7dmFyIGxh c3RTZXJ2ZXJDaGFyPXVybC5jaGFyQXQodXJsLmxlbmd0aC0xKTtpZigobGFzdFNl cnZlckNoYXI9PSImIil8fChsYXN0U2VydmVyQ2hhcj09Ij8iKSl7cmVxdWVzdFN0 cmluZys9cGFyYW1zU3RyaW5nO31lbHNle2lmKHVybC5pbmRleE9mKCc/Jyk9PS0x KXtyZXF1ZXN0U3RyaW5nKz0nPycrcGFyYW1zU3RyaW5nO31lbHNle3JlcXVlc3RT dHJpbmcrPScmJytwYXJhbXNTdHJpbmc7fX19CnJldHVybiByZXF1ZXN0U3RyaW5n O30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5MYXllci5NYXBTZXJ2ZXIifSk7T3Bl bkxheWVycy5MYXllci5NYXBTZXJ2ZXIuVW50aWxlZD1PcGVuTGF5ZXJzLkNsYXNz KE9wZW5MYXllcnMuTGF5ZXIuTWFwU2VydmVyLHtzaW5nbGVUaWxlOnRydWUsaW5p dGlhbGl6ZTpmdW5jdGlvbihuYW1lLHVybCxwYXJhbXMsb3B0aW9ucyl7T3Blbkxh eWVycy5MYXllci5NYXBTZXJ2ZXIucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHko dGhpcyxhcmd1bWVudHMpO3ZhciBtc2c9IlRoZSBPcGVuTGF5ZXJzLkxheWVyLk1h cFNlcnZlci5VbnRpbGVkIGNsYXNzIGlzIGRlcHJlY2F0ZWQgYW5kICIrIndpbGwg YmUgcmVtb3ZlZCBpbiAzLjAuIEluc3RlYWQsIHlvdSBzaG91bGQgdXNlIHRoZSAi KyJub3JtYWwgT3BlbkxheWVycy5MYXllci5NYXBTZXJ2ZXIgY2xhc3MsIHBhc3Np bmcgaXQgdGhlIG9wdGlvbiAiKyInc2luZ2xlVGlsZScgYXMgdHJ1ZS4iO09wZW5M YXllcnMuQ29uc29sZS53YXJuKG1zZyk7fSxjbG9uZTpmdW5jdGlvbihvYmope2lm KG9iaj09bnVsbCl7b2JqPW5ldyBPcGVuTGF5ZXJzLkxheWVyLk1hcFNlcnZlci5V bnRpbGVkKHRoaXMubmFtZSx0aGlzLnVybCx0aGlzLnBhcmFtcyx0aGlzLmdldE9w dGlvbnMoKSk7fQpvYmo9T3BlbkxheWVycy5MYXllci5NYXBTZXJ2ZXIucHJvdG90 eXBlLmNsb25lLmFwcGx5KHRoaXMsW29ial0pO3JldHVybiBvYmo7fSxDTEFTU19O QU1FOiJPcGVuTGF5ZXJzLkxheWVyLk1hcFNlcnZlci5VbnRpbGVkIn0pO09wZW5M YXllcnMuSGFuZGxlci5Ib3Zlcj1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMu SGFuZGxlcix7ZGVsYXk6NTAwLHBpeGVsVG9sZXJhbmNlOm51bGwsc3RvcE1vdmU6 ZmFsc2UscHg6bnVsbCx0aW1lcklkOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihj b250cm9sLGNhbGxiYWNrcyxvcHRpb25zKXtPcGVuTGF5ZXJzLkhhbmRsZXIucHJv dG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO30sbW91c2Vt b3ZlOmZ1bmN0aW9uKGV2dCl7aWYodGhpcy5wYXNzZXNUb2xlcmFuY2UoZXZ0Lnh5 KSl7dGhpcy5jbGVhclRpbWVyKCk7dGhpcy5jYWxsYmFjaygnbW92ZScsW2V2dF0p O3RoaXMucHg9ZXZ0Lnh5O2V2dD1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHt9LGV2 dCk7dGhpcy50aW1lcklkPXdpbmRvdy5zZXRUaW1lb3V0KE9wZW5MYXllcnMuRnVu Y3Rpb24uYmluZCh0aGlzLmRlbGF5ZWRDYWxsLHRoaXMsZXZ0KSx0aGlzLmRlbGF5 KTt9CnJldHVybiF0aGlzLnN0b3BNb3ZlO30sbW91c2VvdXQ6ZnVuY3Rpb24oZXZ0 KXtpZihPcGVuTGF5ZXJzLlV0aWwubW91c2VMZWZ0KGV2dCx0aGlzLm1hcC5ldmVu dHNEaXYpKXt0aGlzLmNsZWFyVGltZXIoKTt0aGlzLmNhbGxiYWNrKCdtb3ZlJyxb ZXZ0XSk7fQpyZXR1cm4gdHJ1ZTt9LHBhc3Nlc1RvbGVyYW5jZTpmdW5jdGlvbihw eCl7dmFyIHBhc3Nlcz10cnVlO2lmKHRoaXMucGl4ZWxUb2xlcmFuY2UmJnRoaXMu cHgpe3ZhciBkcHg9TWF0aC5zcXJ0KE1hdGgucG93KHRoaXMucHgueC1weC54LDIp KwpNYXRoLnBvdyh0aGlzLnB4LnktcHgueSwyKSk7aWYoZHB4PHRoaXMucGl4ZWxU b2xlcmFuY2Upe3Bhc3Nlcz1mYWxzZTt9fQpyZXR1cm4gcGFzc2VzO30sY2xlYXJU aW1lcjpmdW5jdGlvbigpe2lmKHRoaXMudGltZXJJZCE9bnVsbCl7d2luZG93LmNs ZWFyVGltZW91dCh0aGlzLnRpbWVySWQpO3RoaXMudGltZXJJZD1udWxsO319LGRl bGF5ZWRDYWxsOmZ1bmN0aW9uKGV2dCl7dGhpcy5jYWxsYmFjaygncGF1c2UnLFtl dnRdKTt9LGRlYWN0aXZhdGU6ZnVuY3Rpb24oKXt2YXIgZGVhY3RpdmF0ZWQ9ZmFs c2U7aWYoT3BlbkxheWVycy5IYW5kbGVyLnByb3RvdHlwZS5kZWFjdGl2YXRlLmFw cGx5KHRoaXMsYXJndW1lbnRzKSl7dGhpcy5jbGVhclRpbWVyKCk7ZGVhY3RpdmF0 ZWQ9dHJ1ZTt9CnJldHVybiBkZWFjdGl2YXRlZDt9LENMQVNTX05BTUU6Ik9wZW5M YXllcnMuSGFuZGxlci5Ib3ZlciJ9KTtPcGVuTGF5ZXJzLkNvbnRyb2wuR2V0RmVh dHVyZT1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuQ29udHJvbCx7cHJvdG9j b2w6bnVsbCxtdWx0aXBsZUtleTpudWxsLHRvZ2dsZUtleTpudWxsLG1vZGlmaWVy czpudWxsLG11bHRpcGxlOmZhbHNlLGNsaWNrOnRydWUsc2luZ2xlOnRydWUsY2xp Y2tvdXQ6dHJ1ZSx0b2dnbGU6ZmFsc2UsY2xpY2tUb2xlcmFuY2U6NSxob3Zlcjpm YWxzZSxib3g6ZmFsc2UsbWF4RmVhdHVyZXM6MTAsZmVhdHVyZXM6bnVsbCxob3Zl ckZlYXR1cmU6bnVsbCxoYW5kbGVyT3B0aW9uczpudWxsLGhhbmRsZXJzOm51bGws aG92ZXJSZXNwb25zZTpudWxsLGZpbHRlclR5cGU6T3BlbkxheWVycy5GaWx0ZXIu U3BhdGlhbC5CQk9YLEVWRU5UX1RZUEVTOlsiZmVhdHVyZXNlbGVjdGVkIiwiZmVh dHVyZXNzZWxlY3RlZCIsImZlYXR1cmV1bnNlbGVjdGVkIiwiY2xpY2tvdXQiLCJi ZWZvcmVmZWF0dXJlc2VsZWN0ZWQiLCJiZWZvcmVmZWF0dXJlc3NlbGVjdGVkIiwi aG92ZXJmZWF0dXJlIiwib3V0ZmVhdHVyZSJdLGluaXRpYWxpemU6ZnVuY3Rpb24o b3B0aW9ucyl7dGhpcy5FVkVOVF9UWVBFUz1PcGVuTGF5ZXJzLkNvbnRyb2wuR2V0 RmVhdHVyZS5wcm90b3R5cGUuRVZFTlRfVFlQRVMuY29uY2F0KE9wZW5MYXllcnMu Q29udHJvbC5wcm90b3R5cGUuRVZFTlRfVFlQRVMpO29wdGlvbnMuaGFuZGxlck9w dGlvbnM9b3B0aW9ucy5oYW5kbGVyT3B0aW9uc3x8e307T3BlbkxheWVycy5Db250 cm9sLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW29wdGlvbnNdKTt0 aGlzLmZlYXR1cmVzPXt9O3RoaXMuaGFuZGxlcnM9e307aWYodGhpcy5jbGljayl7 dGhpcy5oYW5kbGVycy5jbGljaz1uZXcgT3BlbkxheWVycy5IYW5kbGVyLkNsaWNr KHRoaXMse2NsaWNrOnRoaXMuc2VsZWN0Q2xpY2t9LHRoaXMuaGFuZGxlck9wdGlv bnMuY2xpY2t8fHt9KTt9CmlmKHRoaXMuYm94KXt0aGlzLmhhbmRsZXJzLmJveD1u ZXcgT3BlbkxheWVycy5IYW5kbGVyLkJveCh0aGlzLHtkb25lOnRoaXMuc2VsZWN0 Qm94fSxPcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHRoaXMuaGFuZGxlck9wdGlvbnMu Ym94LHtib3hEaXZDbGFzc05hbWU6Im9sSGFuZGxlckJveFNlbGVjdEZlYXR1cmUi fSkpO30KaWYodGhpcy5ob3Zlcil7dGhpcy5oYW5kbGVycy5ob3Zlcj1uZXcgT3Bl bkxheWVycy5IYW5kbGVyLkhvdmVyKHRoaXMseydtb3ZlJzp0aGlzLmNhbmNlbEhv dmVyLCdwYXVzZSc6dGhpcy5zZWxlY3RIb3Zlcn0sT3BlbkxheWVycy5VdGlsLmV4 dGVuZCh0aGlzLmhhbmRsZXJPcHRpb25zLmhvdmVyLHsnZGVsYXknOjI1MH0pKTt9 fSxhY3RpdmF0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLmFjdGl2ZSl7Zm9yKHZhciBp IGluIHRoaXMuaGFuZGxlcnMpe3RoaXMuaGFuZGxlcnNbaV0uYWN0aXZhdGUoKTt9 fQpyZXR1cm4gT3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5hY3RpdmF0ZS5h cHBseSh0aGlzLGFyZ3VtZW50cyk7fSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7aWYo dGhpcy5hY3RpdmUpe2Zvcih2YXIgaSBpbiB0aGlzLmhhbmRsZXJzKXt0aGlzLmhh bmRsZXJzW2ldLmRlYWN0aXZhdGUoKTt9fQpyZXR1cm4gT3BlbkxheWVycy5Db250 cm9sLnByb3RvdHlwZS5kZWFjdGl2YXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9 LHNlbGVjdENsaWNrOmZ1bmN0aW9uKGV2dCl7dmFyIGJvdW5kcz10aGlzLnBpeGVs VG9Cb3VuZHMoZXZ0Lnh5KTt0aGlzLnNldE1vZGlmaWVycyhldnQpO3RoaXMucmVx dWVzdChib3VuZHMse3NpbmdsZTp0aGlzLnNpbmdsZX0pO30sc2VsZWN0Qm94OmZ1 bmN0aW9uKHBvc2l0aW9uKXt2YXIgYm91bmRzO2lmKHBvc2l0aW9uIGluc3RhbmNl b2YgT3BlbkxheWVycy5Cb3VuZHMpe3ZhciBtaW5YWT10aGlzLm1hcC5nZXRMb25M YXRGcm9tUGl4ZWwobmV3IE9wZW5MYXllcnMuUGl4ZWwocG9zaXRpb24ubGVmdCxw b3NpdGlvbi5ib3R0b20pKTt2YXIgbWF4WFk9dGhpcy5tYXAuZ2V0TG9uTGF0RnJv bVBpeGVsKG5ldyBPcGVuTGF5ZXJzLlBpeGVsKHBvc2l0aW9uLnJpZ2h0LHBvc2l0 aW9uLnRvcCkpO2JvdW5kcz1uZXcgT3BlbkxheWVycy5Cb3VuZHMobWluWFkubG9u LG1pblhZLmxhdCxtYXhYWS5sb24sbWF4WFkubGF0KTt9ZWxzZXtpZih0aGlzLmNs aWNrKXtyZXR1cm47fQpib3VuZHM9dGhpcy5waXhlbFRvQm91bmRzKHBvc2l0aW9u KTt9CnRoaXMuc2V0TW9kaWZpZXJzKHRoaXMuaGFuZGxlcnMuYm94LmRyYWdIYW5k bGVyLmV2dCk7dGhpcy5yZXF1ZXN0KGJvdW5kcyk7fSxzZWxlY3RIb3ZlcjpmdW5j dGlvbihldnQpe3ZhciBib3VuZHM9dGhpcy5waXhlbFRvQm91bmRzKGV2dC54eSk7 dGhpcy5yZXF1ZXN0KGJvdW5kcyx7c2luZ2xlOnRydWUsaG92ZXI6dHJ1ZX0pO30s Y2FuY2VsSG92ZXI6ZnVuY3Rpb24oKXtpZih0aGlzLmhvdmVyUmVzcG9uc2Upe3Ro aXMucHJvdG9jb2wuYWJvcnQodGhpcy5ob3ZlclJlc3BvbnNlKTt0aGlzLmhvdmVy UmVzcG9uc2U9bnVsbDtPcGVuTGF5ZXJzLkVsZW1lbnQucmVtb3ZlQ2xhc3ModGhp cy5tYXAudmlld1BvcnREaXYsIm9sQ3Vyc29yV2FpdCIpO319LHJlcXVlc3Q6ZnVu Y3Rpb24oYm91bmRzLG9wdGlvbnMpe29wdGlvbnM9b3B0aW9uc3x8e307dmFyIGZp bHRlcj1uZXcgT3BlbkxheWVycy5GaWx0ZXIuU3BhdGlhbCh7dHlwZTp0aGlzLmZp bHRlclR5cGUsdmFsdWU6Ym91bmRzfSk7T3BlbkxheWVycy5FbGVtZW50LmFkZENs YXNzKHRoaXMubWFwLnZpZXdQb3J0RGl2LCJvbEN1cnNvcldhaXQiKTt2YXIgcmVz cG9uc2U9dGhpcy5wcm90b2NvbC5yZWFkKHttYXhGZWF0dXJlczpvcHRpb25zLnNp bmdsZT09dHJ1ZT90aGlzLm1heEZlYXR1cmVzOnVuZGVmaW5lZCxmaWx0ZXI6Zmls dGVyLGNhbGxiYWNrOmZ1bmN0aW9uKHJlc3VsdCl7aWYocmVzdWx0LnN1Y2Nlc3Mo KSl7aWYocmVzdWx0LmZlYXR1cmVzLmxlbmd0aCl7aWYob3B0aW9ucy5zaW5nbGU9 PXRydWUpe3RoaXMuc2VsZWN0QmVzdEZlYXR1cmUocmVzdWx0LmZlYXR1cmVzLGJv dW5kcy5nZXRDZW50ZXJMb25MYXQoKSxvcHRpb25zKTt9ZWxzZXt0aGlzLnNlbGVj dChyZXN1bHQuZmVhdHVyZXMpO319ZWxzZSBpZihvcHRpb25zLmhvdmVyKXt0aGlz LmhvdmVyU2VsZWN0KCk7fWVsc2V7dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJj bGlja291dCIpO2lmKHRoaXMuY2xpY2tvdXQpe3RoaXMudW5zZWxlY3RBbGwoKTt9 fX0KT3BlbkxheWVycy5FbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMubWFwLnZpZXdQ b3J0RGl2LCJvbEN1cnNvcldhaXQiKTt9LHNjb3BlOnRoaXN9KTtpZihvcHRpb25z LmhvdmVyPT10cnVlKXt0aGlzLmhvdmVyUmVzcG9uc2U9cmVzcG9uc2U7fX0sc2Vs ZWN0QmVzdEZlYXR1cmU6ZnVuY3Rpb24oZmVhdHVyZXMsY2xpY2tQb3NpdGlvbixv cHRpb25zKXtvcHRpb25zPW9wdGlvbnN8fHt9O2lmKGZlYXR1cmVzLmxlbmd0aCl7 dmFyIHBvaW50PW5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KGNsaWNrUG9z aXRpb24ubG9uLGNsaWNrUG9zaXRpb24ubGF0KTt2YXIgZmVhdHVyZSxyZXN1bHRG ZWF0dXJlLGRpc3Q7dmFyIG1pbkRpc3Q9TnVtYmVyLk1BWF9WQUxVRTtmb3IodmFy IGk9MDtpPGZlYXR1cmVzLmxlbmd0aDsrK2kpe2ZlYXR1cmU9ZmVhdHVyZXNbaV07 aWYoZmVhdHVyZS5nZW9tZXRyeSl7ZGlzdD1wb2ludC5kaXN0YW5jZVRvKGZlYXR1 cmUuZ2VvbWV0cnkse2VkZ2U6ZmFsc2V9KTtpZihkaXN0PG1pbkRpc3Qpe21pbkRp c3Q9ZGlzdDtyZXN1bHRGZWF0dXJlPWZlYXR1cmU7aWYobWluRGlzdD09MCl7YnJl YWs7fX19fQppZihvcHRpb25zLmhvdmVyPT10cnVlKXt0aGlzLmhvdmVyU2VsZWN0 KHJlc3VsdEZlYXR1cmUpO31lbHNle3RoaXMuc2VsZWN0KHJlc3VsdEZlYXR1cmV8 fGZlYXR1cmVzKTt9fX0sc2V0TW9kaWZpZXJzOmZ1bmN0aW9uKGV2dCl7dGhpcy5t b2RpZmllcnM9e211bHRpcGxlOnRoaXMubXVsdGlwbGV8fCh0aGlzLm11bHRpcGxl S2V5JiZldnRbdGhpcy5tdWx0aXBsZUtleV0pLHRvZ2dsZTp0aGlzLnRvZ2dsZXx8 KHRoaXMudG9nZ2xlS2V5JiZldnRbdGhpcy50b2dnbGVLZXldKX07fSxzZWxlY3Q6 ZnVuY3Rpb24oZmVhdHVyZXMpe2lmKCF0aGlzLm1vZGlmaWVycy5tdWx0aXBsZSYm IXRoaXMubW9kaWZpZXJzLnRvZ2dsZSl7dGhpcy51bnNlbGVjdEFsbCgpO30KaWYo IShPcGVuTGF5ZXJzLlV0aWwuaXNBcnJheShmZWF0dXJlcykpKXtmZWF0dXJlcz1b ZmVhdHVyZXNdO30KdmFyIGNvbnQ9dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJi ZWZvcmVmZWF0dXJlc3NlbGVjdGVkIix7ZmVhdHVyZXM6ZmVhdHVyZXN9KTtpZihj b250IT09ZmFsc2Upe3ZhciBzZWxlY3RlZEZlYXR1cmVzPVtdO3ZhciBmZWF0dXJl O2Zvcih2YXIgaT0wLGxlbj1mZWF0dXJlcy5sZW5ndGg7aTxsZW47KytpKXtmZWF0 dXJlPWZlYXR1cmVzW2ldO2lmKHRoaXMuZmVhdHVyZXNbZmVhdHVyZS5maWR8fGZl YXR1cmUuaWRdKXtpZih0aGlzLm1vZGlmaWVycy50b2dnbGUpe3RoaXMudW5zZWxl Y3QodGhpcy5mZWF0dXJlc1tmZWF0dXJlLmZpZHx8ZmVhdHVyZS5pZF0pO319ZWxz ZXtjb250PXRoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgiYmVmb3JlZmVhdHVyZXNl bGVjdGVkIix7ZmVhdHVyZTpmZWF0dXJlfSk7aWYoY29udCE9PWZhbHNlKXt0aGlz LmZlYXR1cmVzW2ZlYXR1cmUuZmlkfHxmZWF0dXJlLmlkXT1mZWF0dXJlO3NlbGVj dGVkRmVhdHVyZXMucHVzaChmZWF0dXJlKTt0aGlzLmV2ZW50cy50cmlnZ2VyRXZl bnQoImZlYXR1cmVzZWxlY3RlZCIse2ZlYXR1cmU6ZmVhdHVyZX0pO319fQp0aGlz LmV2ZW50cy50cmlnZ2VyRXZlbnQoImZlYXR1cmVzc2VsZWN0ZWQiLHtmZWF0dXJl czpzZWxlY3RlZEZlYXR1cmVzfSk7fX0saG92ZXJTZWxlY3Q6ZnVuY3Rpb24oZmVh dHVyZSl7dmFyIGZpZD1mZWF0dXJlP2ZlYXR1cmUuZmlkfHxmZWF0dXJlLmlkOm51 bGw7dmFyIGhmaWQ9dGhpcy5ob3ZlckZlYXR1cmU/dGhpcy5ob3ZlckZlYXR1cmUu ZmlkfHx0aGlzLmhvdmVyRmVhdHVyZS5pZDpudWxsO2lmKGhmaWQmJmhmaWQhPWZp ZCl7dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJvdXRmZWF0dXJlIix7ZmVhdHVy ZTp0aGlzLmhvdmVyRmVhdHVyZX0pO3RoaXMuaG92ZXJGZWF0dXJlPW51bGw7fQpp ZihmaWQmJmZpZCE9aGZpZCl7dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJob3Zl cmZlYXR1cmUiLHtmZWF0dXJlOmZlYXR1cmV9KTt0aGlzLmhvdmVyRmVhdHVyZT1m ZWF0dXJlO319LHVuc2VsZWN0OmZ1bmN0aW9uKGZlYXR1cmUpe2RlbGV0ZSB0aGlz LmZlYXR1cmVzW2ZlYXR1cmUuZmlkfHxmZWF0dXJlLmlkXTt0aGlzLmV2ZW50cy50 cmlnZ2VyRXZlbnQoImZlYXR1cmV1bnNlbGVjdGVkIix7ZmVhdHVyZTpmZWF0dXJl fSk7fSx1bnNlbGVjdEFsbDpmdW5jdGlvbigpe2Zvcih2YXIgZmlkIGluIHRoaXMu ZmVhdHVyZXMpe3RoaXMudW5zZWxlY3QodGhpcy5mZWF0dXJlc1tmaWRdKTt9fSxz ZXRNYXA6ZnVuY3Rpb24obWFwKXtmb3IodmFyIGkgaW4gdGhpcy5oYW5kbGVycyl7 dGhpcy5oYW5kbGVyc1tpXS5zZXRNYXAobWFwKTt9Ck9wZW5MYXllcnMuQ29udHJv bC5wcm90b3R5cGUuc2V0TWFwLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LHBpeGVs VG9Cb3VuZHM6ZnVuY3Rpb24ocGl4ZWwpe3ZhciBsbFB4PXBpeGVsLmFkZCgtdGhp cy5jbGlja1RvbGVyYW5jZS8yLHRoaXMuY2xpY2tUb2xlcmFuY2UvMik7dmFyIHVy UHg9cGl4ZWwuYWRkKHRoaXMuY2xpY2tUb2xlcmFuY2UvMiwtdGhpcy5jbGlja1Rv bGVyYW5jZS8yKTt2YXIgbGw9dGhpcy5tYXAuZ2V0TG9uTGF0RnJvbVBpeGVsKGxs UHgpO3ZhciB1cj10aGlzLm1hcC5nZXRMb25MYXRGcm9tUGl4ZWwodXJQeCk7cmV0 dXJuIG5ldyBPcGVuTGF5ZXJzLkJvdW5kcyhsbC5sb24sbGwubGF0LHVyLmxvbix1 ci5sYXQpO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Db250cm9sLkdldEZlYXR1 cmUifSk7T3BlbkxheWVycy5Gb3JtYXQuUXVlcnlTdHJpbmdGaWx0ZXI9KGZ1bmN0 aW9uKCl7dmFyIGNtcFRvU3RyPXt9O2NtcFRvU3RyW09wZW5MYXllcnMuRmlsdGVy LkNvbXBhcmlzb24uRVFVQUxfVE9dPSJlcSI7Y21wVG9TdHJbT3BlbkxheWVycy5G aWx0ZXIuQ29tcGFyaXNvbi5OT1RfRVFVQUxfVE9dPSJuZSI7Y21wVG9TdHJbT3Bl bkxheWVycy5GaWx0ZXIuQ29tcGFyaXNvbi5MRVNTX1RIQU5dPSJsdCI7Y21wVG9T dHJbT3BlbkxheWVycy5GaWx0ZXIuQ29tcGFyaXNvbi5MRVNTX1RIQU5fT1JfRVFV QUxfVE9dPSJsdGUiO2NtcFRvU3RyW09wZW5MYXllcnMuRmlsdGVyLkNvbXBhcmlz b24uR1JFQVRFUl9USEFOXT0iZ3QiO2NtcFRvU3RyW09wZW5MYXllcnMuRmlsdGVy LkNvbXBhcmlzb24uR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPXT0iZ3RlIjtjbXBU b1N0cltPcGVuTGF5ZXJzLkZpbHRlci5Db21wYXJpc29uLkxJS0VdPSJpbGlrZSI7 ZnVuY3Rpb24gcmVnZXgydmFsdWUodmFsdWUpe3ZhbHVlPXZhbHVlLnJlcGxhY2Uo LyUvZywiXFwlIik7dmFsdWU9dmFsdWUucmVwbGFjZSgvXFxcXFwuKFwqKT8vZyxm dW5jdGlvbigkMCwkMSl7cmV0dXJuICQxPyQwOiJcXFxcXyI7fSk7dmFsdWU9dmFs dWUucmVwbGFjZSgvXFxcXFwuXCovZywiXFxcXCUiKTt2YWx1ZT12YWx1ZS5yZXBs YWNlKC8oXFwpP1wuKFwqKT8vZyxmdW5jdGlvbigkMCwkMSwkMil7cmV0dXJuICQx fHwkMj8kMDoiXyI7fSk7dmFsdWU9dmFsdWUucmVwbGFjZSgvKFxcKT9cLlwqL2cs ZnVuY3Rpb24oJDAsJDEpe3JldHVybiAkMT8kMDoiJSI7fSk7dmFsdWU9dmFsdWUu cmVwbGFjZSgvXFxcLi9nLCIuIik7dmFsdWU9dmFsdWUucmVwbGFjZSgvKFxcKT9c XFwqL2csZnVuY3Rpb24oJDAsJDEpe3JldHVybiAkMT8kMDoiKiI7fSk7cmV0dXJu IHZhbHVlO30KcmV0dXJuIE9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Gb3Jt YXQse3dpbGRjYXJkZWQ6ZmFsc2Usc3JzSW5CQk9YOmZhbHNlLHdyaXRlOmZ1bmN0 aW9uKGZpbHRlcixwYXJhbXMpe3BhcmFtcz1wYXJhbXN8fHt9O3ZhciBjbGFzc05h bWU9ZmlsdGVyLkNMQVNTX05BTUU7dmFyIGZpbHRlclR5cGU9Y2xhc3NOYW1lLnN1 YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSsxKTtzd2l0Y2goZmls dGVyVHlwZSl7Y2FzZSJTcGF0aWFsIjpzd2l0Y2goZmlsdGVyLnR5cGUpe2Nhc2Ug T3BlbkxheWVycy5GaWx0ZXIuU3BhdGlhbC5CQk9YOnBhcmFtcy5iYm94PWZpbHRl ci52YWx1ZS50b0FycmF5KCk7aWYodGhpcy5zcnNJbkJCT1gmJmZpbHRlci5wcm9q ZWN0aW9uKXtwYXJhbXMuYmJveC5wdXNoKGZpbHRlci5wcm9qZWN0aW9uLmdldENv ZGUoKSk7fQpicmVhaztjYXNlIE9wZW5MYXllcnMuRmlsdGVyLlNwYXRpYWwuRFdJ VEhJTjpwYXJhbXMudG9sZXJhbmNlPWZpbHRlci5kaXN0YW5jZTtjYXNlIE9wZW5M YXllcnMuRmlsdGVyLlNwYXRpYWwuV0lUSElOOnBhcmFtcy5sb249ZmlsdGVyLnZh bHVlLng7cGFyYW1zLmxhdD1maWx0ZXIudmFsdWUueTticmVhaztkZWZhdWx0Ok9w ZW5MYXllcnMuQ29uc29sZS53YXJuKCJVbmtub3duIHNwYXRpYWwgZmlsdGVyIHR5 cGUgIitmaWx0ZXIudHlwZSk7fQpicmVhaztjYXNlIkNvbXBhcmlzb24iOnZhciBv cD1jbXBUb1N0cltmaWx0ZXIudHlwZV07aWYob3AhPT11bmRlZmluZWQpe3ZhciB2 YWx1ZT1maWx0ZXIudmFsdWU7aWYoZmlsdGVyLnR5cGU9PU9wZW5MYXllcnMuRmls dGVyLkNvbXBhcmlzb24uTElLRSl7dmFsdWU9cmVnZXgydmFsdWUodmFsdWUpO2lm KHRoaXMud2lsZGNhcmRlZCl7dmFsdWU9IiUiK3ZhbHVlKyIlIjt9fQpwYXJhbXNb ZmlsdGVyLnByb3BlcnR5KyJfXyIrb3BdPXZhbHVlO3BhcmFtcy5xdWVyeWFibGU9 cGFyYW1zLnF1ZXJ5YWJsZXx8W107cGFyYW1zLnF1ZXJ5YWJsZS5wdXNoKGZpbHRl ci5wcm9wZXJ0eSk7fWVsc2V7T3BlbkxheWVycy5Db25zb2xlLndhcm4oIlVua25v d24gY29tcGFyaXNvbiBmaWx0ZXIgdHlwZSAiK2ZpbHRlci50eXBlKTt9CmJyZWFr O2Nhc2UiTG9naWNhbCI6aWYoZmlsdGVyLnR5cGU9PT1PcGVuTGF5ZXJzLkZpbHRl ci5Mb2dpY2FsLkFORCl7Zm9yKHZhciBpPTAsbGVuPWZpbHRlci5maWx0ZXJzLmxl bmd0aDtpPGxlbjtpKyspe3BhcmFtcz10aGlzLndyaXRlKGZpbHRlci5maWx0ZXJz W2ldLHBhcmFtcyk7fX1lbHNle09wZW5MYXllcnMuQ29uc29sZS53YXJuKCJVbnN1 cHBvcnRlZCBsb2dpY2FsIGZpbHRlciB0eXBlICIrZmlsdGVyLnR5cGUpO30KYnJl YWs7ZGVmYXVsdDpPcGVuTGF5ZXJzLkNvbnNvbGUud2FybigiVW5rbm93biBmaWx0 ZXIgdHlwZSAiK2ZpbHRlclR5cGUpO30KcmV0dXJuIHBhcmFtczt9LENMQVNTX05B TUU6Ik9wZW5MYXllcnMuRm9ybWF0LlF1ZXJ5U3RyaW5nRmlsdGVyIn0pO30pKCk7 T3BlbkxheWVycy5Gb3JtYXQuU09TR2V0RmVhdHVyZU9mSW50ZXJlc3Q9T3Blbkxh eWVycy5DbGFzcyhPcGVuTGF5ZXJzLkZvcm1hdC5YTUwse1ZFUlNJT046IjEuMC4w IixuYW1lc3BhY2VzOntzb3M6Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvc29zLzEu MCIsZ21sOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCIsc2E6Imh0dHA6Ly93 d3cub3Blbmdpcy5uZXQvc2FtcGxpbmcvMS4wIix4c2k6Imh0dHA6Ly93d3cudzMu b3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIn0sc2NoZW1hTG9jYXRpb246Imh0 dHA6Ly93d3cub3Blbmdpcy5uZXQvc29zLzEuMCBodHRwOi8vc2NoZW1hcy5vcGVu Z2lzLm5ldC9zb3MvMS4wLjAvc29zQWxsLnhzZCIsZGVmYXVsdFByZWZpeDoic29z IixyZWdFeGVzOnt0cmltU3BhY2U6KC9eXHMqfFxzKiQvZykscmVtb3ZlU3BhY2U6 KC9ccyovZyksc3BsaXRTcGFjZTooL1xzKy8pLHRyaW1Db21tYTooL1xzKixccyov Zyl9LHJlYWQ6ZnVuY3Rpb24oZGF0YSl7aWYodHlwZW9mIGRhdGE9PSJzdHJpbmci KXtkYXRhPU9wZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5cGUucmVhZC5hcHBs eSh0aGlzLFtkYXRhXSk7fQppZihkYXRhJiZkYXRhLm5vZGVUeXBlPT05KXtkYXRh PWRhdGEuZG9jdW1lbnRFbGVtZW50O30KdmFyIGluZm89e2ZlYXR1cmVzOltdfTt0 aGlzLnJlYWROb2RlKGRhdGEsaW5mbyk7dmFyIGZlYXR1cmVzPVtdO2Zvcih2YXIg aT0wLGxlbj1pbmZvLmZlYXR1cmVzLmxlbmd0aDtpPGxlbjtpKyspe3ZhciBjb250 YWluZXI9aW5mby5mZWF0dXJlc1tpXTtpZih0aGlzLmludGVybmFsUHJvamVjdGlv biYmdGhpcy5leHRlcm5hbFByb2plY3Rpb24mJmNvbnRhaW5lci5jb21wb25lbnRz WzBdKXtjb250YWluZXIuY29tcG9uZW50c1swXS50cmFuc2Zvcm0odGhpcy5leHRl cm5hbFByb2plY3Rpb24sdGhpcy5pbnRlcm5hbFByb2plY3Rpb24pO30KdmFyIGZl YXR1cmU9bmV3IE9wZW5MYXllcnMuRmVhdHVyZS5WZWN0b3IoY29udGFpbmVyLmNv bXBvbmVudHNbMF0sY29udGFpbmVyLmF0dHJpYnV0ZXMpO2ZlYXR1cmVzLnB1c2go ZmVhdHVyZSk7fQpyZXR1cm4gZmVhdHVyZXM7fSxyZWFkZXJzOnsic2EiOnsiU2Ft cGxpbmdQb2ludCI6ZnVuY3Rpb24obm9kZSxvYmope2lmKCFvYmouYXR0cmlidXRl cyl7dmFyIGZlYXR1cmU9e2F0dHJpYnV0ZXM6e319O29iai5mZWF0dXJlcy5wdXNo KGZlYXR1cmUpO29iaj1mZWF0dXJlO30Kb2JqLmF0dHJpYnV0ZXMuaWQ9dGhpcy5n ZXRBdHRyaWJ1dGVOUyhub2RlLHRoaXMubmFtZXNwYWNlcy5nbWwsImlkIik7dGhp cy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iaik7fSwicG9zaXRpb24iOmZ1bmN0aW9u KG5vZGUsb2JqKXt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqKTt9fSwiZ21s IjpPcGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyh7IkZlYXR1cmVDb2xsZWN0 aW9uIjpmdW5jdGlvbihub2RlLG9iail7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2Rl LG9iaik7fSwiZmVhdHVyZU1lbWJlciI6ZnVuY3Rpb24obm9kZSxvYmope3ZhciBm ZWF0dXJlPXthdHRyaWJ1dGVzOnt9fTtvYmouZmVhdHVyZXMucHVzaChmZWF0dXJl KTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsZmVhdHVyZSk7fSwibmFtZSI6ZnVu Y3Rpb24obm9kZSxvYmope29iai5hdHRyaWJ1dGVzLm5hbWU9dGhpcy5nZXRDaGls ZFZhbHVlKG5vZGUpO30sInBvcyI6ZnVuY3Rpb24obm9kZSxvYmope2lmKCF0aGlz LmV4dGVybmFsUHJvamVjdGlvbil7dGhpcy5leHRlcm5hbFByb2plY3Rpb249bmV3 IE9wZW5MYXllcnMuUHJvamVjdGlvbihub2RlLmdldEF0dHJpYnV0ZSgic3JzTmFt ZSIpKTt9Ck9wZW5MYXllcnMuRm9ybWF0LkdNTC52My5wcm90b3R5cGUucmVhZGVy cy5nbWwucG9zLmFwcGx5KHRoaXMsW25vZGUsb2JqXSk7fX0sT3BlbkxheWVycy5G b3JtYXQuR01MLnYzLnByb3RvdHlwZS5yZWFkZXJzLmdtbCl9LHdyaXRlcnM6eyJz b3MiOnsiR2V0RmVhdHVyZU9mSW50ZXJlc3QiOmZ1bmN0aW9uKG9wdGlvbnMpe3Zh ciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygiR2V0RmVhdHVyZU9mSW50 ZXJlc3QiLHthdHRyaWJ1dGVzOnt2ZXJzaW9uOnRoaXMuVkVSU0lPTixzZXJ2aWNl OidTT1MnLCJ4c2k6c2NoZW1hTG9jYXRpb24iOnRoaXMuc2NoZW1hTG9jYXRpb259 fSk7Zm9yKHZhciBpPTAsbGVuPW9wdGlvbnMuZm9pcy5sZW5ndGg7aTxsZW47aSsr KXt0aGlzLndyaXRlTm9kZSgiRmVhdHVyZU9mSW50ZXJlc3RJZCIse2ZvaTpvcHRp b25zLmZvaXNbaV19LG5vZGUpO30KcmV0dXJuIG5vZGU7fSwiRmVhdHVyZU9mSW50 ZXJlc3RJZCI6ZnVuY3Rpb24ob3B0aW9ucyl7dmFyIG5vZGU9dGhpcy5jcmVhdGVF bGVtZW50TlNQbHVzKCJGZWF0dXJlT2ZJbnRlcmVzdElkIix7dmFsdWU6b3B0aW9u cy5mb2l9KTtyZXR1cm4gbm9kZTt9fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5G b3JtYXQuU09TR2V0RmVhdHVyZU9mSW50ZXJlc3QifSk7T3BlbkxheWVycy5Gb3Jt YXQuU09TR2V0T2JzZXJ2YXRpb249T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJz LkZvcm1hdC5YTUwse25hbWVzcGFjZXM6e293czoiaHR0cDovL3d3dy5vcGVuZ2lz Lm5ldC9vd3MiLGdtbDoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9nbWwiLHNvczoi aHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9zb3MvMS4wIixvZ2M6Imh0dHA6Ly93d3cu b3Blbmdpcy5uZXQvb2djIixvbToiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9vbS8x LjAiLHNhOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3NhbXBsaW5nLzEuMCIseGxp bms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhzaToiaHR0cDovL3d3 dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UifSxyZWdFeGVzOnt0cmlt U3BhY2U6KC9eXHMqfFxzKiQvZykscmVtb3ZlU3BhY2U6KC9ccyovZyksc3BsaXRT cGFjZTooL1xzKy8pLHRyaW1Db21tYTooL1xzKixccyovZyl9LFZFUlNJT046IjEu MC4wIixzY2hlbWFMb2NhdGlvbjoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9zb3Mv MS4wIGh0dHA6Ly9zY2hlbWFzLm9wZW5naXMubmV0L3Nvcy8xLjAuMC9zb3NHZXRP YnNlcnZhdGlvbi54c2QiLGRlZmF1bHRQcmVmaXg6InNvcyIscmVhZDpmdW5jdGlv bihkYXRhKXtpZih0eXBlb2YgZGF0YT09InN0cmluZyIpe2RhdGE9T3BlbkxheWVy cy5Gb3JtYXQuWE1MLnByb3RvdHlwZS5yZWFkLmFwcGx5KHRoaXMsW2RhdGFdKTt9 CmlmKGRhdGEmJmRhdGEubm9kZVR5cGU9PTkpe2RhdGE9ZGF0YS5kb2N1bWVudEVs ZW1lbnQ7fQp2YXIgaW5mbz17bWVhc3VyZW1lbnRzOltdLG9ic2VydmF0aW9uczpb XX07dGhpcy5yZWFkTm9kZShkYXRhLGluZm8pO3JldHVybiBpbmZvO30sd3JpdGU6 ZnVuY3Rpb24ob3B0aW9ucyl7dmFyIG5vZGU9dGhpcy53cml0ZU5vZGUoInNvczpH ZXRPYnNlcnZhdGlvbiIsb3B0aW9ucyk7bm9kZS5zZXRBdHRyaWJ1dGUoInhtbG5z Om9tIix0aGlzLm5hbWVzcGFjZXMub20pO25vZGUuc2V0QXR0cmlidXRlKCJ4bWxu czpvZ2MiLHRoaXMubmFtZXNwYWNlcy5vZ2MpO3RoaXMuc2V0QXR0cmlidXRlTlMo bm9kZSx0aGlzLm5hbWVzcGFjZXMueHNpLCJ4c2k6c2NoZW1hTG9jYXRpb24iLHRo aXMuc2NoZW1hTG9jYXRpb24pO3JldHVybiBPcGVuTGF5ZXJzLkZvcm1hdC5YTUwu cHJvdG90eXBlLndyaXRlLmFwcGx5KHRoaXMsW25vZGVdKTt9LHJlYWRlcnM6eyJv bSI6eyJPYnNlcnZhdGlvbkNvbGxlY3Rpb24iOmZ1bmN0aW9uKG5vZGUsb2JqKXtv YmouaWQ9dGhpcy5nZXRBdHRyaWJ1dGVOUyhub2RlLHRoaXMubmFtZXNwYWNlcy5n bWwsImlkIik7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iaik7fSwibWVtYmVy IjpmdW5jdGlvbihub2RlLG9ic2VydmF0aW9uQ29sbGVjdGlvbil7dGhpcy5yZWFk Q2hpbGROb2Rlcyhub2RlLG9ic2VydmF0aW9uQ29sbGVjdGlvbik7fSwiTWVhc3Vy ZW1lbnQiOmZ1bmN0aW9uKG5vZGUsb2JzZXJ2YXRpb25Db2xsZWN0aW9uKXt2YXIg bWVhc3VyZW1lbnQ9e307b2JzZXJ2YXRpb25Db2xsZWN0aW9uLm1lYXN1cmVtZW50 cy5wdXNoKG1lYXN1cmVtZW50KTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsbWVh c3VyZW1lbnQpO30sIk9ic2VydmF0aW9uIjpmdW5jdGlvbihub2RlLG9ic2VydmF0 aW9uQ29sbGVjdGlvbil7dmFyIG9ic2VydmF0aW9uPXt9O29ic2VydmF0aW9uQ29s bGVjdGlvbi5vYnNlcnZhdGlvbnMucHVzaChvYnNlcnZhdGlvbik7dGhpcy5yZWFk Q2hpbGROb2Rlcyhub2RlLG9ic2VydmF0aW9uKTt9LCJzYW1wbGluZ1RpbWUiOmZ1 bmN0aW9uKG5vZGUsbWVhc3VyZW1lbnQpe3ZhciBzYW1wbGluZ1RpbWU9e307bWVh c3VyZW1lbnQuc2FtcGxpbmdUaW1lPXNhbXBsaW5nVGltZTt0aGlzLnJlYWRDaGls ZE5vZGVzKG5vZGUsc2FtcGxpbmdUaW1lKTt9LCJvYnNlcnZlZFByb3BlcnR5Ijpm dW5jdGlvbihub2RlLG1lYXN1cmVtZW50KXttZWFzdXJlbWVudC5vYnNlcnZlZFBy b3BlcnR5PXRoaXMuZ2V0QXR0cmlidXRlTlMobm9kZSx0aGlzLm5hbWVzcGFjZXMu eGxpbmssImhyZWYiKTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsbWVhc3VyZW1l bnQpO30sInByb2NlZHVyZSI6ZnVuY3Rpb24obm9kZSxtZWFzdXJlbWVudCl7bWVh c3VyZW1lbnQucHJvY2VkdXJlPXRoaXMuZ2V0QXR0cmlidXRlTlMobm9kZSx0aGlz Lm5hbWVzcGFjZXMueGxpbmssImhyZWYiKTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5v ZGUsbWVhc3VyZW1lbnQpO30sImZlYXR1cmVPZkludGVyZXN0IjpmdW5jdGlvbihu b2RlLG9ic2VydmF0aW9uKXt2YXIgZm9pPXtmZWF0dXJlczpbXX07b2JzZXJ2YXRp b24uZm9pcz1bXTtvYnNlcnZhdGlvbi5mb2lzLnB1c2goZm9pKTt0aGlzLnJlYWRD aGlsZE5vZGVzKG5vZGUsZm9pKTt2YXIgZmVhdHVyZXM9W107Zm9yKHZhciBpPTAs bGVuPWZvaS5mZWF0dXJlcy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgZmVhdHVyZT1m b2kuZmVhdHVyZXNbaV07ZmVhdHVyZXMucHVzaChuZXcgT3BlbkxheWVycy5GZWF0 dXJlLlZlY3RvcihmZWF0dXJlLmNvbXBvbmVudHNbMF0sZmVhdHVyZS5hdHRyaWJ1 dGVzKSk7fQpmb2kuZmVhdHVyZXM9ZmVhdHVyZXM7fSwicmVzdWx0IjpmdW5jdGlv bihub2RlLG1lYXN1cmVtZW50KXt2YXIgcmVzdWx0PXt9O21lYXN1cmVtZW50LnJl c3VsdD1yZXN1bHQ7aWYodGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpIT09Jycpe3Jl c3VsdC52YWx1ZT10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7cmVzdWx0LnVvbT1u b2RlLmdldEF0dHJpYnV0ZSgidW9tIik7fWVsc2V7dGhpcy5yZWFkQ2hpbGROb2Rl cyhub2RlLHJlc3VsdCk7fX19LCJzYSI6T3BlbkxheWVycy5Gb3JtYXQuU09TR2V0 RmVhdHVyZU9mSW50ZXJlc3QucHJvdG90eXBlLnJlYWRlcnMuc2EsImdtbCI6T3Bl bkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMoeyJUaW1lSW5zdGFudCI6ZnVuY3Rp b24obm9kZSxzYW1wbGluZ1RpbWUpe3ZhciB0aW1lSW5zdGFudD17fTtzYW1wbGlu Z1RpbWUudGltZUluc3RhbnQ9dGltZUluc3RhbnQ7dGhpcy5yZWFkQ2hpbGROb2Rl cyhub2RlLHRpbWVJbnN0YW50KTt9LCJ0aW1lUG9zaXRpb24iOmZ1bmN0aW9uKG5v ZGUsdGltZUluc3RhbnQpe3RpbWVJbnN0YW50LnRpbWVQb3NpdGlvbj10aGlzLmdl dENoaWxkVmFsdWUobm9kZSk7fX0sT3BlbkxheWVycy5Gb3JtYXQuU09TR2V0RmVh dHVyZU9mSW50ZXJlc3QucHJvdG90eXBlLnJlYWRlcnMuZ21sKX0sd3JpdGVyczp7 InNvcyI6eyJHZXRPYnNlcnZhdGlvbiI6ZnVuY3Rpb24ob3B0aW9ucyl7dmFyIG5v ZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJHZXRPYnNlcnZhdGlvbiIse2F0 dHJpYnV0ZXM6e3ZlcnNpb246dGhpcy5WRVJTSU9OLHNlcnZpY2U6J1NPUyd9fSk7 dGhpcy53cml0ZU5vZGUoIm9mZmVyaW5nIixvcHRpb25zLG5vZGUpO2lmKG9wdGlv bnMuZXZlbnRUaW1lKXt0aGlzLndyaXRlTm9kZSgiZXZlbnRUaW1lIixvcHRpb25z LG5vZGUpO30KZm9yKHZhciBwcm9jZWR1cmUgaW4gb3B0aW9ucy5wcm9jZWR1cmVz KXt0aGlzLndyaXRlTm9kZSgicHJvY2VkdXJlIixvcHRpb25zLnByb2NlZHVyZXNb cHJvY2VkdXJlXSxub2RlKTt9CmZvcih2YXIgb2JzZXJ2ZWRQcm9wZXJ0eSBpbiBv cHRpb25zLm9ic2VydmVkUHJvcGVydGllcyl7dGhpcy53cml0ZU5vZGUoIm9ic2Vy dmVkUHJvcGVydHkiLG9wdGlvbnMub2JzZXJ2ZWRQcm9wZXJ0aWVzW29ic2VydmVk UHJvcGVydHldLG5vZGUpO30KaWYob3B0aW9ucy5mb2kpe3RoaXMud3JpdGVOb2Rl KCJmZWF0dXJlT2ZJbnRlcmVzdCIsb3B0aW9ucy5mb2ksbm9kZSk7fQp0aGlzLndy aXRlTm9kZSgicmVzcG9uc2VGb3JtYXQiLG9wdGlvbnMsbm9kZSk7aWYob3B0aW9u cy5yZXN1bHRNb2RlbCl7dGhpcy53cml0ZU5vZGUoInJlc3VsdE1vZGVsIixvcHRp b25zLG5vZGUpO30KaWYob3B0aW9ucy5yZXNwb25zZU1vZGUpe3RoaXMud3JpdGVO b2RlKCJyZXNwb25zZU1vZGUiLG9wdGlvbnMsbm9kZSk7fQpyZXR1cm4gbm9kZTt9 LCJmZWF0dXJlT2ZJbnRlcmVzdCI6ZnVuY3Rpb24oZm9pKXt2YXIgbm9kZT10aGlz LmNyZWF0ZUVsZW1lbnROU1BsdXMoImZlYXR1cmVPZkludGVyZXN0Iik7dGhpcy53 cml0ZU5vZGUoIk9iamVjdElEIixmb2kub2JqZWN0SWQsbm9kZSk7cmV0dXJuIG5v ZGU7fSwiT2JqZWN0SUQiOmZ1bmN0aW9uKG9wdGlvbnMpe3JldHVybiB0aGlzLmNy ZWF0ZUVsZW1lbnROU1BsdXMoIk9iamVjdElEIix7dmFsdWU6b3B0aW9uc30pO30s InJlc3BvbnNlRm9ybWF0IjpmdW5jdGlvbihvcHRpb25zKXtyZXR1cm4gdGhpcy5j cmVhdGVFbGVtZW50TlNQbHVzKCJyZXNwb25zZUZvcm1hdCIse3ZhbHVlOm9wdGlv bnMucmVzcG9uc2VGb3JtYXR9KTt9LCJwcm9jZWR1cmUiOmZ1bmN0aW9uKHByb2Nl ZHVyZSl7cmV0dXJuIHRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygicHJvY2VkdXJl Iix7dmFsdWU6cHJvY2VkdXJlfSk7fSwib2ZmZXJpbmciOmZ1bmN0aW9uKG9wdGlv bnMpe3JldHVybiB0aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoIm9mZmVyaW5nIix7 dmFsdWU6b3B0aW9ucy5vZmZlcmluZ30pO30sIm9ic2VydmVkUHJvcGVydHkiOmZ1 bmN0aW9uKG9ic2VydmVkUHJvcGVydHkpe3JldHVybiB0aGlzLmNyZWF0ZUVsZW1l bnROU1BsdXMoIm9ic2VydmVkUHJvcGVydHkiLHt2YWx1ZTpvYnNlcnZlZFByb3Bl cnR5fSk7fSwiZXZlbnRUaW1lIjpmdW5jdGlvbihvcHRpb25zKXt2YXIgbm9kZT10 aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImV2ZW50VGltZSIpO2lmKG9wdGlvbnMu ZXZlbnRUaW1lPT09J2xhdGVzdCcpe3RoaXMud3JpdGVOb2RlKCJvZ2M6VE1fRXF1 YWxzIixvcHRpb25zLG5vZGUpO30KcmV0dXJuIG5vZGU7fSwicmVzdWx0TW9kZWwi OmZ1bmN0aW9uKG9wdGlvbnMpe3JldHVybiB0aGlzLmNyZWF0ZUVsZW1lbnROU1Bs dXMoInJlc3VsdE1vZGVsIix7dmFsdWU6b3B0aW9ucy5yZXN1bHRNb2RlbH0pO30s InJlc3BvbnNlTW9kZSI6ZnVuY3Rpb24ob3B0aW9ucyl7cmV0dXJuIHRoaXMuY3Jl YXRlRWxlbWVudE5TUGx1cygicmVzcG9uc2VNb2RlIix7dmFsdWU6b3B0aW9ucy5y ZXNwb25zZU1vZGV9KTt9fSwib2djIjp7IlRNX0VxdWFscyI6ZnVuY3Rpb24ob3B0 aW9ucyl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJvZ2M6VE1f RXF1YWxzIik7dGhpcy53cml0ZU5vZGUoIm9nYzpQcm9wZXJ0eU5hbWUiLHtwcm9w ZXJ0eToidXJuOm9nYzpkYXRhOnRpbWU6aXNvODYwMSJ9LG5vZGUpO2lmKG9wdGlv bnMuZXZlbnRUaW1lPT09J2xhdGVzdCcpe3RoaXMud3JpdGVOb2RlKCJnbWw6VGlt ZUluc3RhbnQiLHt2YWx1ZTonbGF0ZXN0J30sbm9kZSk7fQpyZXR1cm4gbm9kZTt9 LCJQcm9wZXJ0eU5hbWUiOmZ1bmN0aW9uKG9wdGlvbnMpe3JldHVybiB0aGlzLmNy ZWF0ZUVsZW1lbnROU1BsdXMoIm9nYzpQcm9wZXJ0eU5hbWUiLHt2YWx1ZTpvcHRp b25zLnByb3BlcnR5fSk7fX0sImdtbCI6eyJUaW1lSW5zdGFudCI6ZnVuY3Rpb24o b3B0aW9ucyl7dmFyIG5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJnbWw6 VGltZUluc3RhbnQiKTt0aGlzLndyaXRlTm9kZSgiZ21sOnRpbWVQb3NpdGlvbiIs b3B0aW9ucyxub2RlKTtyZXR1cm4gbm9kZTt9LCJ0aW1lUG9zaXRpb24iOmZ1bmN0 aW9uKG9wdGlvbnMpe3ZhciBub2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygi Z21sOnRpbWVQb3NpdGlvbiIse3ZhbHVlOm9wdGlvbnMudmFsdWV9KTtyZXR1cm4g bm9kZTt9fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3JtYXQuU09TR2V0T2Jz ZXJ2YXRpb24ifSk7T3BlbkxheWVycy5Db250cm9sLk1vdXNlUG9zaXRpb249T3Bl bkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkNvbnRyb2wse2F1dG9BY3RpdmF0ZTp0 cnVlLGVsZW1lbnQ6bnVsbCxwcmVmaXg6Jycsc2VwYXJhdG9yOicsICcsc3VmZml4 OicnLG51bURpZ2l0czo1LGdyYW51bGFyaXR5OjEwLGVtcHR5U3RyaW5nOm51bGws bGFzdFh5Om51bGwsZGlzcGxheVByb2plY3Rpb246bnVsbCxkZXN0cm95OmZ1bmN0 aW9uKCl7dGhpcy5kZWFjdGl2YXRlKCk7T3BlbkxheWVycy5Db250cm9sLnByb3Rv dHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LGFjdGl2YXRlOmZ1 bmN0aW9uKCl7aWYoT3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5hY3RpdmF0 ZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3RoaXMubWFwLmV2ZW50cy5yZWdpc3Rl cignbW91c2Vtb3ZlJyx0aGlzLHRoaXMucmVkcmF3KTt0aGlzLm1hcC5ldmVudHMu cmVnaXN0ZXIoJ21vdXNlb3V0Jyx0aGlzLHRoaXMucmVzZXQpO3RoaXMucmVkcmF3 KCk7cmV0dXJuIHRydWU7fWVsc2V7cmV0dXJuIGZhbHNlO319LGRlYWN0aXZhdGU6 ZnVuY3Rpb24oKXtpZihPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90eXBlLmRlYWN0 aXZhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt0aGlzLm1hcC5ldmVudHMudW5y ZWdpc3RlcignbW91c2Vtb3ZlJyx0aGlzLHRoaXMucmVkcmF3KTt0aGlzLm1hcC5l dmVudHMudW5yZWdpc3RlcignbW91c2VvdXQnLHRoaXMsdGhpcy5yZXNldCk7dGhp cy5lbGVtZW50LmlubmVySFRNTD0iIjtyZXR1cm4gdHJ1ZTt9ZWxzZXtyZXR1cm4g ZmFsc2U7fX0sZHJhdzpmdW5jdGlvbigpe09wZW5MYXllcnMuQ29udHJvbC5wcm90 b3R5cGUuZHJhdy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMuZWxlbWVu dCl7dGhpcy5kaXYubGVmdD0iIjt0aGlzLmRpdi50b3A9IiI7dGhpcy5lbGVtZW50 PXRoaXMuZGl2O30KcmV0dXJuIHRoaXMuZGl2O30scmVkcmF3OmZ1bmN0aW9uKGV2 dCl7dmFyIGxvbkxhdDtpZihldnQ9PW51bGwpe3RoaXMucmVzZXQoKTtyZXR1cm47 fWVsc2V7aWYodGhpcy5sYXN0WHk9PW51bGx8fE1hdGguYWJzKGV2dC54eS54LXRo aXMubGFzdFh5LngpPnRoaXMuZ3JhbnVsYXJpdHl8fE1hdGguYWJzKGV2dC54eS55 LXRoaXMubGFzdFh5LnkpPnRoaXMuZ3JhbnVsYXJpdHkpCnt0aGlzLmxhc3RYeT1l dnQueHk7cmV0dXJuO30KbG9uTGF0PXRoaXMubWFwLmdldExvbkxhdEZyb21QaXhl bChldnQueHkpO2lmKCFsb25MYXQpe3JldHVybjt9CmlmKHRoaXMuZGlzcGxheVBy b2plY3Rpb24pe2xvbkxhdC50cmFuc2Zvcm0odGhpcy5tYXAuZ2V0UHJvamVjdGlv bk9iamVjdCgpLHRoaXMuZGlzcGxheVByb2plY3Rpb24pO30KdGhpcy5sYXN0WHk9 ZXZ0Lnh5O30KdmFyIG5ld0h0bWw9dGhpcy5mb3JtYXRPdXRwdXQobG9uTGF0KTtp ZihuZXdIdG1sIT10aGlzLmVsZW1lbnQuaW5uZXJIVE1MKXt0aGlzLmVsZW1lbnQu aW5uZXJIVE1MPW5ld0h0bWw7fX0scmVzZXQ6ZnVuY3Rpb24oZXZ0KXtpZih0aGlz LmVtcHR5U3RyaW5nIT1udWxsKXt0aGlzLmVsZW1lbnQuaW5uZXJIVE1MPXRoaXMu ZW1wdHlTdHJpbmc7fX0sZm9ybWF0T3V0cHV0OmZ1bmN0aW9uKGxvbkxhdCl7dmFy IGRpZ2l0cz1wYXJzZUludCh0aGlzLm51bURpZ2l0cyk7dmFyIG5ld0h0bWw9dGhp cy5wcmVmaXgrCmxvbkxhdC5sb24udG9GaXhlZChkaWdpdHMpKwp0aGlzLnNlcGFy YXRvcisKbG9uTGF0LmxhdC50b0ZpeGVkKGRpZ2l0cykrCnRoaXMuc3VmZml4O3Jl dHVybiBuZXdIdG1sO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Db250cm9sLk1v dXNlUG9zaXRpb24ifSk7T3BlbkxheWVycy5Db250cm9sLkdlb2xvY2F0ZT1PcGVu TGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuQ29udHJvbCx7RVZFTlRfVFlQRVM6WyJs b2NhdGlvbnVwZGF0ZWQiLCJsb2NhdGlvbmZhaWxlZCIsImxvY2F0aW9udW5jYXBh YmxlIl0sZ2VvbG9jYXRpb246bmF2aWdhdG9yLmdlb2xvY2F0aW9uLGJpbmQ6dHJ1 ZSx3YXRjaDpmYWxzZSxnZW9sb2NhdGlvbk9wdGlvbnM6bnVsbCxpbml0aWFsaXpl OmZ1bmN0aW9uKG9wdGlvbnMpe3RoaXMuRVZFTlRfVFlQRVM9T3BlbkxheWVycy5D b250cm9sLkdlb2xvY2F0ZS5wcm90b3R5cGUuRVZFTlRfVFlQRVMuY29uY2F0KE9w ZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUuRVZFTlRfVFlQRVMpO3RoaXMuZ2Vv bG9jYXRpb25PcHRpb25zPXt9O09wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUu aW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7fSxkZXN0cm95OmZ1bmN0 aW9uKCl7dGhpcy5kZWFjdGl2YXRlKCk7T3BlbkxheWVycy5Db250cm9sLnByb3Rv dHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LGFjdGl2YXRlOmZ1 bmN0aW9uKCl7aWYoIXRoaXMuZ2VvbG9jYXRpb24pe3RoaXMuZXZlbnRzLnRyaWdn ZXJFdmVudCgibG9jYXRpb251bmNhcGFibGUiKTtyZXR1cm4gZmFsc2U7fQppZihP cGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90eXBlLmFjdGl2YXRlLmFwcGx5KHRoaXMs YXJndW1lbnRzKSl7aWYodGhpcy53YXRjaCl7dGhpcy53YXRjaElkPXRoaXMuZ2Vv bG9jYXRpb24ud2F0Y2hQb3NpdGlvbihPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQo dGhpcy5nZW9sb2NhdGUsdGhpcyksT3BlbkxheWVycy5GdW5jdGlvbi5iaW5kKHRo aXMuZmFpbHVyZSx0aGlzKSx0aGlzLmdlb2xvY2F0aW9uT3B0aW9ucyk7fWVsc2V7 dGhpcy5nZXRDdXJyZW50TG9jYXRpb24oKTt9CnJldHVybiB0cnVlO30KcmV0dXJu IGZhbHNlO30sZGVhY3RpdmF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlJiZ0 aGlzLndhdGNoSWQhPT1udWxsKXt0aGlzLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2go dGhpcy53YXRjaElkKTt9CnJldHVybiBPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90 eXBlLmRlYWN0aXZhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO30sZ2VvbG9jYXRl OmZ1bmN0aW9uKHBvc2l0aW9uKXt2YXIgY2VudGVyPW5ldyBPcGVuTGF5ZXJzLkxv bkxhdChwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlLHBvc2l0aW9uLmNvb3Jkcy5s YXRpdHVkZSkudHJhbnNmb3JtKG5ldyBPcGVuTGF5ZXJzLlByb2plY3Rpb24oIkVQ U0c6NDMyNiIpLHRoaXMubWFwLmdldFByb2plY3Rpb25PYmplY3QoKSk7aWYodGhp cy5iaW5kKXt0aGlzLm1hcC5zZXRDZW50ZXIoY2VudGVyKTt9CnRoaXMuZXZlbnRz LnRyaWdnZXJFdmVudCgibG9jYXRpb251cGRhdGVkIix7cG9zaXRpb246cG9zaXRp b24scG9pbnQ6bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQoY2VudGVyLmxv bixjZW50ZXIubGF0KX0pO30sZ2V0Q3VycmVudExvY2F0aW9uOmZ1bmN0aW9uKCl7 aWYoIXRoaXMuYWN0aXZlfHx0aGlzLndhdGNoKXtyZXR1cm4gZmFsc2U7fQp0aGlz Lmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihPcGVuTGF5ZXJzLkZ1bmN0 aW9uLmJpbmQodGhpcy5nZW9sb2NhdGUsdGhpcyksT3BlbkxheWVycy5GdW5jdGlv bi5iaW5kKHRoaXMuZmFpbHVyZSx0aGlzKSx0aGlzLmdlb2xvY2F0aW9uT3B0aW9u cyk7cmV0dXJuIHRydWU7fSxmYWlsdXJlOmZ1bmN0aW9uKGVycm9yKXt0aGlzLmV2 ZW50cy50cmlnZ2VyRXZlbnQoImxvY2F0aW9uZmFpbGVkIix7ZXJyb3I6ZXJyb3J9 KTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuQ29udHJvbC5HZW9sb2NhdGUifSk7 T3BlbkxheWVycy5Db250cm9sLk5hdmlnYXRpb25IaXN0b3J5PU9wZW5MYXllcnMu Q2xhc3MoT3BlbkxheWVycy5Db250cm9sLHt0eXBlOk9wZW5MYXllcnMuQ29udHJv bC5UWVBFX1RPR0dMRSxwcmV2aW91czpudWxsLHByZXZpb3VzT3B0aW9uczpudWxs LG5leHQ6bnVsbCxuZXh0T3B0aW9uczpudWxsLGxpbWl0OjUwLGF1dG9BY3RpdmF0 ZTp0cnVlLGNsZWFyT25EZWFjdGl2YXRlOmZhbHNlLHJlZ2lzdHJ5Om51bGwsbmV4 dFN0YWNrOm51bGwscHJldmlvdXNTdGFjazpudWxsLGxpc3RlbmVyczpudWxsLHJl c3RvcmluZzpmYWxzZSxpbml0aWFsaXplOmZ1bmN0aW9uKG9wdGlvbnMpe09wZW5M YXllcnMuQ29udHJvbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtv cHRpb25zXSk7dGhpcy5yZWdpc3RyeT1PcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHsi bW92ZWVuZCI6dGhpcy5nZXRTdGF0ZX0sdGhpcy5yZWdpc3RyeSk7dmFyIHByZXZp b3VzT3B0aW9ucz17dHJpZ2dlcjpPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmQodGhp cy5wcmV2aW91c1RyaWdnZXIsdGhpcyksZGlzcGxheUNsYXNzOnRoaXMuZGlzcGxh eUNsYXNzKyIgIit0aGlzLmRpc3BsYXlDbGFzcysiUHJldmlvdXMifTtPcGVuTGF5 ZXJzLlV0aWwuZXh0ZW5kKHByZXZpb3VzT3B0aW9ucyx0aGlzLnByZXZpb3VzT3B0 aW9ucyk7dGhpcy5wcmV2aW91cz1uZXcgT3BlbkxheWVycy5Db250cm9sLkJ1dHRv bihwcmV2aW91c09wdGlvbnMpO3ZhciBuZXh0T3B0aW9ucz17dHJpZ2dlcjpPcGVu TGF5ZXJzLkZ1bmN0aW9uLmJpbmQodGhpcy5uZXh0VHJpZ2dlcix0aGlzKSxkaXNw bGF5Q2xhc3M6dGhpcy5kaXNwbGF5Q2xhc3MrIiAiK3RoaXMuZGlzcGxheUNsYXNz KyJOZXh0In07T3BlbkxheWVycy5VdGlsLmV4dGVuZChuZXh0T3B0aW9ucyx0aGlz Lm5leHRPcHRpb25zKTt0aGlzLm5leHQ9bmV3IE9wZW5MYXllcnMuQ29udHJvbC5C dXR0b24obmV4dE9wdGlvbnMpO3RoaXMuY2xlYXIoKTt9LG9uUHJldmlvdXNDaGFu Z2U6ZnVuY3Rpb24oc3RhdGUsbGVuZ3RoKXtpZihzdGF0ZSYmIXRoaXMucHJldmlv dXMuYWN0aXZlKXt0aGlzLnByZXZpb3VzLmFjdGl2YXRlKCk7fWVsc2UgaWYoIXN0 YXRlJiZ0aGlzLnByZXZpb3VzLmFjdGl2ZSl7dGhpcy5wcmV2aW91cy5kZWFjdGl2 YXRlKCk7fX0sb25OZXh0Q2hhbmdlOmZ1bmN0aW9uKHN0YXRlLGxlbmd0aCl7aWYo c3RhdGUmJiF0aGlzLm5leHQuYWN0aXZlKXt0aGlzLm5leHQuYWN0aXZhdGUoKTt9 ZWxzZSBpZighc3RhdGUmJnRoaXMubmV4dC5hY3RpdmUpe3RoaXMubmV4dC5kZWFj dGl2YXRlKCk7fX0sZGVzdHJveTpmdW5jdGlvbigpe09wZW5MYXllcnMuQ29udHJv bC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzKTt0aGlzLnByZXZpb3VzLmRl c3Ryb3koKTt0aGlzLm5leHQuZGVzdHJveSgpO3RoaXMuZGVhY3RpdmF0ZSgpO2Zv cih2YXIgcHJvcCBpbiB0aGlzKXt0aGlzW3Byb3BdPW51bGw7fX0sc2V0TWFwOmZ1 bmN0aW9uKG1hcCl7dGhpcy5tYXA9bWFwO3RoaXMubmV4dC5zZXRNYXAobWFwKTt0 aGlzLnByZXZpb3VzLnNldE1hcChtYXApO30sZHJhdzpmdW5jdGlvbigpe09wZW5M YXllcnMuQ29udHJvbC5wcm90b3R5cGUuZHJhdy5hcHBseSh0aGlzLGFyZ3VtZW50 cyk7dGhpcy5uZXh0LmRyYXcoKTt0aGlzLnByZXZpb3VzLmRyYXcoKTt9LHByZXZp b3VzVHJpZ2dlcjpmdW5jdGlvbigpe3ZhciBjdXJyZW50PXRoaXMucHJldmlvdXNT dGFjay5zaGlmdCgpO3ZhciBzdGF0ZT10aGlzLnByZXZpb3VzU3RhY2suc2hpZnQo KTtpZihzdGF0ZSE9dW5kZWZpbmVkKXt0aGlzLm5leHRTdGFjay51bnNoaWZ0KGN1 cnJlbnQpO3RoaXMucHJldmlvdXNTdGFjay51bnNoaWZ0KHN0YXRlKTt0aGlzLnJl c3RvcmluZz10cnVlO3RoaXMucmVzdG9yZShzdGF0ZSk7dGhpcy5yZXN0b3Jpbmc9 ZmFsc2U7dGhpcy5vbk5leHRDaGFuZ2UodGhpcy5uZXh0U3RhY2tbMF0sdGhpcy5u ZXh0U3RhY2subGVuZ3RoKTt0aGlzLm9uUHJldmlvdXNDaGFuZ2UodGhpcy5wcmV2 aW91c1N0YWNrWzFdLHRoaXMucHJldmlvdXNTdGFjay5sZW5ndGgtMSk7fWVsc2V7 dGhpcy5wcmV2aW91c1N0YWNrLnVuc2hpZnQoY3VycmVudCk7fQpyZXR1cm4gc3Rh dGU7fSxuZXh0VHJpZ2dlcjpmdW5jdGlvbigpe3ZhciBzdGF0ZT10aGlzLm5leHRT dGFjay5zaGlmdCgpO2lmKHN0YXRlIT11bmRlZmluZWQpe3RoaXMucHJldmlvdXNT dGFjay51bnNoaWZ0KHN0YXRlKTt0aGlzLnJlc3RvcmluZz10cnVlO3RoaXMucmVz dG9yZShzdGF0ZSk7dGhpcy5yZXN0b3Jpbmc9ZmFsc2U7dGhpcy5vbk5leHRDaGFu Z2UodGhpcy5uZXh0U3RhY2tbMF0sdGhpcy5uZXh0U3RhY2subGVuZ3RoKTt0aGlz Lm9uUHJldmlvdXNDaGFuZ2UodGhpcy5wcmV2aW91c1N0YWNrWzFdLHRoaXMucHJl dmlvdXNTdGFjay5sZW5ndGgtMSk7fQpyZXR1cm4gc3RhdGU7fSxjbGVhcjpmdW5j dGlvbigpe3RoaXMucHJldmlvdXNTdGFjaz1bXTt0aGlzLnByZXZpb3VzLmRlYWN0 aXZhdGUoKTt0aGlzLm5leHRTdGFjaz1bXTt0aGlzLm5leHQuZGVhY3RpdmF0ZSgp O30sZ2V0U3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm57Y2VudGVyOnRoaXMubWFwLmdl dENlbnRlcigpLHJlc29sdXRpb246dGhpcy5tYXAuZ2V0UmVzb2x1dGlvbigpLHBy b2plY3Rpb246dGhpcy5tYXAuZ2V0UHJvamVjdGlvbk9iamVjdCgpLHVuaXRzOnRo aXMubWFwLmdldFByb2plY3Rpb25PYmplY3QoKS5nZXRVbml0cygpfHx0aGlzLm1h cC51bml0c3x8dGhpcy5tYXAuYmFzZUxheWVyLnVuaXRzfTt9LHJlc3RvcmU6ZnVu Y3Rpb24oc3RhdGUpe3ZhciBjZW50ZXIsem9vbTtpZih0aGlzLm1hcC5nZXRQcm9q ZWN0aW9uT2JqZWN0KCk9PXN0YXRlLnByb2plY3Rpb24pe3pvb209dGhpcy5tYXAu Z2V0Wm9vbUZvclJlc29sdXRpb24oc3RhdGUucmVzb2x1dGlvbik7Y2VudGVyPXN0 YXRlLmNlbnRlcjt9ZWxzZXtjZW50ZXI9c3RhdGUuY2VudGVyLmNsb25lKCk7Y2Vu dGVyLnRyYW5zZm9ybShzdGF0ZS5wcm9qZWN0aW9uLHRoaXMubWFwLmdldFByb2pl Y3Rpb25PYmplY3QoKSk7dmFyIHNvdXJjZVVuaXRzPXN0YXRlLnVuaXRzO3ZhciB0 YXJnZXRVbml0cz10aGlzLm1hcC5nZXRQcm9qZWN0aW9uT2JqZWN0KCkuZ2V0VW5p dHMoKXx8dGhpcy5tYXAudW5pdHN8fHRoaXMubWFwLmJhc2VMYXllci51bml0czt2 YXIgcmVzb2x1dGlvbkZhY3Rvcj1zb3VyY2VVbml0cyYmdGFyZ2V0VW5pdHM/T3Bl bkxheWVycy5JTkNIRVNfUEVSX1VOSVRbc291cmNlVW5pdHNdL09wZW5MYXllcnMu SU5DSEVTX1BFUl9VTklUW3RhcmdldFVuaXRzXToxO3pvb209dGhpcy5tYXAuZ2V0 Wm9vbUZvclJlc29sdXRpb24ocmVzb2x1dGlvbkZhY3RvcipzdGF0ZS5yZXNvbHV0 aW9uKTt9CnRoaXMubWFwLnNldENlbnRlcihjZW50ZXIsem9vbSk7fSxzZXRMaXN0 ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLmxpc3RlbmVycz17fTtmb3IodmFyIHR5cGUg aW4gdGhpcy5yZWdpc3RyeSl7dGhpcy5saXN0ZW5lcnNbdHlwZV09T3BlbkxheWVy cy5GdW5jdGlvbi5iaW5kKGZ1bmN0aW9uKCl7aWYoIXRoaXMucmVzdG9yaW5nKXt2 YXIgc3RhdGU9dGhpcy5yZWdpc3RyeVt0eXBlXS5hcHBseSh0aGlzLGFyZ3VtZW50 cyk7dGhpcy5wcmV2aW91c1N0YWNrLnVuc2hpZnQoc3RhdGUpO2lmKHRoaXMucHJl dmlvdXNTdGFjay5sZW5ndGg+MSl7dGhpcy5vblByZXZpb3VzQ2hhbmdlKHRoaXMu cHJldmlvdXNTdGFja1sxXSx0aGlzLnByZXZpb3VzU3RhY2subGVuZ3RoLTEpO30K aWYodGhpcy5wcmV2aW91c1N0YWNrLmxlbmd0aD4odGhpcy5saW1pdCsxKSl7dGhp cy5wcmV2aW91c1N0YWNrLnBvcCgpO30KaWYodGhpcy5uZXh0U3RhY2subGVuZ3Ro PjApe3RoaXMubmV4dFN0YWNrPVtdO3RoaXMub25OZXh0Q2hhbmdlKG51bGwsMCk7 fX0KcmV0dXJuIHRydWU7fSx0aGlzKTt9fSxhY3RpdmF0ZTpmdW5jdGlvbigpe3Zh ciBhY3RpdmF0ZWQ9ZmFsc2U7aWYodGhpcy5tYXApe2lmKE9wZW5MYXllcnMuQ29u dHJvbC5wcm90b3R5cGUuYWN0aXZhdGUuYXBwbHkodGhpcykpe2lmKHRoaXMubGlz dGVuZXJzPT1udWxsKXt0aGlzLnNldExpc3RlbmVycygpO30KZm9yKHZhciB0eXBl IGluIHRoaXMubGlzdGVuZXJzKXt0aGlzLm1hcC5ldmVudHMucmVnaXN0ZXIodHlw ZSx0aGlzLHRoaXMubGlzdGVuZXJzW3R5cGVdKTt9CmFjdGl2YXRlZD10cnVlO2lm KHRoaXMucHJldmlvdXNTdGFjay5sZW5ndGg9PTApe3RoaXMuaW5pdFN0YWNrKCk7 fX19CnJldHVybiBhY3RpdmF0ZWQ7fSxpbml0U3RhY2s6ZnVuY3Rpb24oKXtpZih0 aGlzLm1hcC5nZXRDZW50ZXIoKSl7dGhpcy5saXN0ZW5lcnMubW92ZWVuZCgpO319 LGRlYWN0aXZhdGU6ZnVuY3Rpb24oKXt2YXIgZGVhY3RpdmF0ZWQ9ZmFsc2U7aWYo dGhpcy5tYXApe2lmKE9wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUuZGVhY3Rp dmF0ZS5hcHBseSh0aGlzKSl7Zm9yKHZhciB0eXBlIGluIHRoaXMubGlzdGVuZXJz KXt0aGlzLm1hcC5ldmVudHMudW5yZWdpc3Rlcih0eXBlLHRoaXMsdGhpcy5saXN0 ZW5lcnNbdHlwZV0pO30KaWYodGhpcy5jbGVhck9uRGVhY3RpdmF0ZSl7dGhpcy5j bGVhcigpO30KZGVhY3RpdmF0ZWQ9dHJ1ZTt9fQpyZXR1cm4gZGVhY3RpdmF0ZWQ7 fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkNvbnRyb2wuTmF2aWdhdGlvbkhpc3Rv cnkifSk7T3BlbkxheWVycy5Qcm90b2NvbC5IVFRQPU9wZW5MYXllcnMuQ2xhc3Mo T3BlbkxheWVycy5Qcm90b2NvbCx7dXJsOm51bGwsaGVhZGVyczpudWxsLHBhcmFt czpudWxsLGNhbGxiYWNrOm51bGwsc2NvcGU6bnVsbCxyZWFkV2l0aFBPU1Q6ZmFs c2Usd2lsZGNhcmRlZDpmYWxzZSxzcnNJbkJCT1g6ZmFsc2UsaW5pdGlhbGl6ZTpm dW5jdGlvbihvcHRpb25zKXtvcHRpb25zPW9wdGlvbnN8fHt9O3RoaXMucGFyYW1z PXt9O3RoaXMuaGVhZGVycz17fTtPcGVuTGF5ZXJzLlByb3RvY29sLnByb3RvdHlw ZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighdGhpcy5maWx0 ZXJUb1BhcmFtcyYmT3BlbkxheWVycy5Gb3JtYXQuUXVlcnlTdHJpbmdGaWx0ZXIp e3ZhciBmb3JtYXQ9bmV3IE9wZW5MYXllcnMuRm9ybWF0LlF1ZXJ5U3RyaW5nRmls dGVyKHt3aWxkY2FyZGVkOnRoaXMud2lsZGNhcmRlZCxzcnNJbkJCT1g6dGhpcy5z cnNJbkJCT1h9KTt0aGlzLmZpbHRlclRvUGFyYW1zPWZ1bmN0aW9uKGZpbHRlcixw YXJhbXMpe3JldHVybiBmb3JtYXQud3JpdGUoZmlsdGVyLHBhcmFtcyk7fX19LGRl c3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnBhcmFtcz1udWxsO3RoaXMuaGVhZGVycz1u dWxsO09wZW5MYXllcnMuUHJvdG9jb2wucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHko dGhpcyk7fSxyZWFkOmZ1bmN0aW9uKG9wdGlvbnMpe09wZW5MYXllcnMuUHJvdG9j b2wucHJvdG90eXBlLnJlYWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO29wdGlvbnM9 b3B0aW9uc3x8e307b3B0aW9ucy5wYXJhbXM9T3BlbkxheWVycy5VdGlsLmFwcGx5 RGVmYXVsdHMob3B0aW9ucy5wYXJhbXMsdGhpcy5vcHRpb25zLnBhcmFtcyk7b3B0 aW9ucz1PcGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyhvcHRpb25zLHRoaXMu b3B0aW9ucyk7aWYob3B0aW9ucy5maWx0ZXImJnRoaXMuZmlsdGVyVG9QYXJhbXMp e29wdGlvbnMucGFyYW1zPXRoaXMuZmlsdGVyVG9QYXJhbXMob3B0aW9ucy5maWx0 ZXIsb3B0aW9ucy5wYXJhbXMpO30KdmFyIHJlYWRXaXRoUE9TVD0ob3B0aW9ucy5y ZWFkV2l0aFBPU1QhPT11bmRlZmluZWQpP29wdGlvbnMucmVhZFdpdGhQT1NUOnRo aXMucmVhZFdpdGhQT1NUO3ZhciByZXNwPW5ldyBPcGVuTGF5ZXJzLlByb3RvY29s LlJlc3BvbnNlKHtyZXF1ZXN0VHlwZToicmVhZCJ9KTtpZihyZWFkV2l0aFBPU1Qp e3Jlc3AucHJpdj1PcGVuTGF5ZXJzLlJlcXVlc3QuUE9TVCh7dXJsOm9wdGlvbnMu dXJsLGNhbGxiYWNrOnRoaXMuY3JlYXRlQ2FsbGJhY2sodGhpcy5oYW5kbGVSZWFk LHJlc3Asb3B0aW9ucyksZGF0YTpPcGVuTGF5ZXJzLlV0aWwuZ2V0UGFyYW1ldGVy U3RyaW5nKG9wdGlvbnMucGFyYW1zKSxoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoi YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn19KTt9ZWxzZXtyZXNw LnByaXY9T3BlbkxheWVycy5SZXF1ZXN0LkdFVCh7dXJsOm9wdGlvbnMudXJsLGNh bGxiYWNrOnRoaXMuY3JlYXRlQ2FsbGJhY2sodGhpcy5oYW5kbGVSZWFkLHJlc3As b3B0aW9ucykscGFyYW1zOm9wdGlvbnMucGFyYW1zLGhlYWRlcnM6b3B0aW9ucy5o ZWFkZXJzfSk7fQpyZXR1cm4gcmVzcDt9LGhhbmRsZVJlYWQ6ZnVuY3Rpb24ocmVz cCxvcHRpb25zKXt0aGlzLmhhbmRsZVJlc3BvbnNlKHJlc3Asb3B0aW9ucyk7fSxj cmVhdGU6ZnVuY3Rpb24oZmVhdHVyZXMsb3B0aW9ucyl7b3B0aW9ucz1PcGVuTGF5 ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyhvcHRpb25zLHRoaXMub3B0aW9ucyk7dmFy IHJlc3A9bmV3IE9wZW5MYXllcnMuUHJvdG9jb2wuUmVzcG9uc2Uoe3JlcUZlYXR1 cmVzOmZlYXR1cmVzLHJlcXVlc3RUeXBlOiJjcmVhdGUifSk7cmVzcC5wcml2PU9w ZW5MYXllcnMuUmVxdWVzdC5QT1NUKHt1cmw6b3B0aW9ucy51cmwsY2FsbGJhY2s6 dGhpcy5jcmVhdGVDYWxsYmFjayh0aGlzLmhhbmRsZUNyZWF0ZSxyZXNwLG9wdGlv bnMpLGhlYWRlcnM6b3B0aW9ucy5oZWFkZXJzLGRhdGE6dGhpcy5mb3JtYXQud3Jp dGUoZmVhdHVyZXMpfSk7cmV0dXJuIHJlc3A7fSxoYW5kbGVDcmVhdGU6ZnVuY3Rp b24ocmVzcCxvcHRpb25zKXt0aGlzLmhhbmRsZVJlc3BvbnNlKHJlc3Asb3B0aW9u cyk7fSx1cGRhdGU6ZnVuY3Rpb24oZmVhdHVyZSxvcHRpb25zKXtvcHRpb25zPW9w dGlvbnN8fHt9O3ZhciB1cmw9b3B0aW9ucy51cmx8fGZlYXR1cmUudXJsfHx0aGlz Lm9wdGlvbnMudXJsKyIvIitmZWF0dXJlLmZpZDtvcHRpb25zPU9wZW5MYXllcnMu VXRpbC5hcHBseURlZmF1bHRzKG9wdGlvbnMsdGhpcy5vcHRpb25zKTt2YXIgcmVz cD1uZXcgT3BlbkxheWVycy5Qcm90b2NvbC5SZXNwb25zZSh7cmVxRmVhdHVyZXM6 ZmVhdHVyZSxyZXF1ZXN0VHlwZToidXBkYXRlIn0pO3Jlc3AucHJpdj1PcGVuTGF5 ZXJzLlJlcXVlc3QuUFVUKHt1cmw6dXJsLGNhbGxiYWNrOnRoaXMuY3JlYXRlQ2Fs bGJhY2sodGhpcy5oYW5kbGVVcGRhdGUscmVzcCxvcHRpb25zKSxoZWFkZXJzOm9w dGlvbnMuaGVhZGVycyxkYXRhOnRoaXMuZm9ybWF0LndyaXRlKGZlYXR1cmUpfSk7 cmV0dXJuIHJlc3A7fSxoYW5kbGVVcGRhdGU6ZnVuY3Rpb24ocmVzcCxvcHRpb25z KXt0aGlzLmhhbmRsZVJlc3BvbnNlKHJlc3Asb3B0aW9ucyk7fSwiZGVsZXRlIjpm dW5jdGlvbihmZWF0dXJlLG9wdGlvbnMpe29wdGlvbnM9b3B0aW9uc3x8e307dmFy IHVybD1vcHRpb25zLnVybHx8ZmVhdHVyZS51cmx8fHRoaXMub3B0aW9ucy51cmwr Ii8iK2ZlYXR1cmUuZmlkO29wdGlvbnM9T3BlbkxheWVycy5VdGlsLmFwcGx5RGVm YXVsdHMob3B0aW9ucyx0aGlzLm9wdGlvbnMpO3ZhciByZXNwPW5ldyBPcGVuTGF5 ZXJzLlByb3RvY29sLlJlc3BvbnNlKHtyZXFGZWF0dXJlczpmZWF0dXJlLHJlcXVl c3RUeXBlOiJkZWxldGUifSk7cmVzcC5wcml2PU9wZW5MYXllcnMuUmVxdWVzdC5E RUxFVEUoe3VybDp1cmwsY2FsbGJhY2s6dGhpcy5jcmVhdGVDYWxsYmFjayh0aGlz LmhhbmRsZURlbGV0ZSxyZXNwLG9wdGlvbnMpLGhlYWRlcnM6b3B0aW9ucy5oZWFk ZXJzfSk7cmV0dXJuIHJlc3A7fSxoYW5kbGVEZWxldGU6ZnVuY3Rpb24ocmVzcCxv cHRpb25zKXt0aGlzLmhhbmRsZVJlc3BvbnNlKHJlc3Asb3B0aW9ucyk7fSxoYW5k bGVSZXNwb25zZTpmdW5jdGlvbihyZXNwLG9wdGlvbnMpe3ZhciByZXF1ZXN0PXJl c3AucHJpdjtpZihvcHRpb25zLmNhbGxiYWNrKXtpZihyZXF1ZXN0LnN0YXR1cz49 MjAwJiZyZXF1ZXN0LnN0YXR1czwzMDApe2lmKHJlc3AucmVxdWVzdFR5cGUhPSJk ZWxldGUiKXtyZXNwLmZlYXR1cmVzPXRoaXMucGFyc2VGZWF0dXJlcyhyZXF1ZXN0 KTt9CnJlc3AuY29kZT1PcGVuTGF5ZXJzLlByb3RvY29sLlJlc3BvbnNlLlNVQ0NF U1M7fWVsc2V7cmVzcC5jb2RlPU9wZW5MYXllcnMuUHJvdG9jb2wuUmVzcG9uc2Uu RkFJTFVSRTt9Cm9wdGlvbnMuY2FsbGJhY2suY2FsbChvcHRpb25zLnNjb3BlLHJl c3ApO319LHBhcnNlRmVhdHVyZXM6ZnVuY3Rpb24ocmVxdWVzdCl7dmFyIGRvYz1y ZXF1ZXN0LnJlc3BvbnNlWE1MO2lmKCFkb2N8fCFkb2MuZG9jdW1lbnRFbGVtZW50 KXtkb2M9cmVxdWVzdC5yZXNwb25zZVRleHQ7fQppZighZG9jfHxkb2MubGVuZ3Ro PD0wKXtyZXR1cm4gbnVsbDt9CnJldHVybiB0aGlzLmZvcm1hdC5yZWFkKGRvYyk7 fSxjb21taXQ6ZnVuY3Rpb24oZmVhdHVyZXMsb3B0aW9ucyl7b3B0aW9ucz1PcGVu TGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyhvcHRpb25zLHRoaXMub3B0aW9ucyk7 dmFyIHJlc3A9W10sblJlc3BvbnNlcz0wO3ZhciB0eXBlcz17fTt0eXBlc1tPcGVu TGF5ZXJzLlN0YXRlLklOU0VSVF09W107dHlwZXNbT3BlbkxheWVycy5TdGF0ZS5V UERBVEVdPVtdO3R5cGVzW09wZW5MYXllcnMuU3RhdGUuREVMRVRFXT1bXTt2YXIg ZmVhdHVyZSxsaXN0LHJlcXVlc3RGZWF0dXJlcz1bXTtmb3IodmFyIGk9MCxsZW49 ZmVhdHVyZXMubGVuZ3RoO2k8bGVuOysraSl7ZmVhdHVyZT1mZWF0dXJlc1tpXTts aXN0PXR5cGVzW2ZlYXR1cmUuc3RhdGVdO2lmKGxpc3Qpe2xpc3QucHVzaChmZWF0 dXJlKTtyZXF1ZXN0RmVhdHVyZXMucHVzaChmZWF0dXJlKTt9fQp2YXIgblJlcXVl c3RzPSh0eXBlc1tPcGVuTGF5ZXJzLlN0YXRlLklOU0VSVF0ubGVuZ3RoPjA/MTow KSsKdHlwZXNbT3BlbkxheWVycy5TdGF0ZS5VUERBVEVdLmxlbmd0aCsKdHlwZXNb T3BlbkxheWVycy5TdGF0ZS5ERUxFVEVdLmxlbmd0aDt2YXIgc3VjY2Vzcz10cnVl O3ZhciBmaW5hbFJlc3BvbnNlPW5ldyBPcGVuTGF5ZXJzLlByb3RvY29sLlJlc3Bv bnNlKHtyZXFGZWF0dXJlczpyZXF1ZXN0RmVhdHVyZXN9KTtmdW5jdGlvbiBpbnNl cnRDYWxsYmFjayhyZXNwb25zZSl7dmFyIGxlbj1yZXNwb25zZS5mZWF0dXJlcz9y ZXNwb25zZS5mZWF0dXJlcy5sZW5ndGg6MDt2YXIgZmlkcz1uZXcgQXJyYXkobGVu KTtmb3IodmFyIGk9MDtpPGxlbjsrK2kpe2ZpZHNbaV09cmVzcG9uc2UuZmVhdHVy ZXNbaV0uZmlkO30KZmluYWxSZXNwb25zZS5pbnNlcnRJZHM9ZmlkcztjYWxsYmFj ay5hcHBseSh0aGlzLFtyZXNwb25zZV0pO30KZnVuY3Rpb24gY2FsbGJhY2socmVz cG9uc2Upe3RoaXMuY2FsbFVzZXJDYWxsYmFjayhyZXNwb25zZSxvcHRpb25zKTtz dWNjZXNzPXN1Y2Nlc3MmJnJlc3BvbnNlLnN1Y2Nlc3MoKTtuUmVzcG9uc2VzKys7 aWYoblJlc3BvbnNlcz49blJlcXVlc3RzKXtpZihvcHRpb25zLmNhbGxiYWNrKXtm aW5hbFJlc3BvbnNlLmNvZGU9c3VjY2Vzcz9PcGVuTGF5ZXJzLlByb3RvY29sLlJl c3BvbnNlLlNVQ0NFU1M6T3BlbkxheWVycy5Qcm90b2NvbC5SZXNwb25zZS5GQUlM VVJFO29wdGlvbnMuY2FsbGJhY2suYXBwbHkob3B0aW9ucy5zY29wZSxbZmluYWxS ZXNwb25zZV0pO319fQp2YXIgcXVldWU9dHlwZXNbT3BlbkxheWVycy5TdGF0ZS5J TlNFUlRdO2lmKHF1ZXVlLmxlbmd0aD4wKXtyZXNwLnB1c2godGhpcy5jcmVhdGUo cXVldWUsT3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMoe2NhbGxiYWNrOmlu c2VydENhbGxiYWNrLHNjb3BlOnRoaXN9LG9wdGlvbnMuY3JlYXRlKSkpO30KcXVl dWU9dHlwZXNbT3BlbkxheWVycy5TdGF0ZS5VUERBVEVdO2Zvcih2YXIgaT1xdWV1 ZS5sZW5ndGgtMTtpPj0wOy0taSl7cmVzcC5wdXNoKHRoaXMudXBkYXRlKHF1ZXVl W2ldLE9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKHtjYWxsYmFjazpjYWxs YmFjayxzY29wZTp0aGlzfSxvcHRpb25zLnVwZGF0ZSkpKTt9CnF1ZXVlPXR5cGVz W09wZW5MYXllcnMuU3RhdGUuREVMRVRFXTtmb3IodmFyIGk9cXVldWUubGVuZ3Ro LTE7aT49MDstLWkpe3Jlc3AucHVzaCh0aGlzWyJkZWxldGUiXShxdWV1ZVtpXSxP cGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyh7Y2FsbGJhY2s6Y2FsbGJhY2ss c2NvcGU6dGhpc30sb3B0aW9uc1siZGVsZXRlIl0pKSk7fQpyZXR1cm4gcmVzcDt9 LGFib3J0OmZ1bmN0aW9uKHJlc3BvbnNlKXtpZihyZXNwb25zZSl7cmVzcG9uc2Uu cHJpdi5hYm9ydCgpO319LGNhbGxVc2VyQ2FsbGJhY2s6ZnVuY3Rpb24ocmVzcCxv cHRpb25zKXt2YXIgb3B0PW9wdGlvbnNbcmVzcC5yZXF1ZXN0VHlwZV07aWYob3B0 JiZvcHQuY2FsbGJhY2spe29wdC5jYWxsYmFjay5jYWxsKG9wdC5zY29wZSxyZXNw KTt9fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLlByb3RvY29sLkhUVFAifSk7T3Bl bkxheWVycy5Gb3JtYXQuQ1NXR2V0RG9tYWluPWZ1bmN0aW9uKG9wdGlvbnMpe29w dGlvbnM9T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMob3B0aW9ucyxPcGVu TGF5ZXJzLkZvcm1hdC5DU1dHZXREb21haW4uREVGQVVMVFMpO3ZhciBjbHM9T3Bl bkxheWVycy5Gb3JtYXQuQ1NXR2V0RG9tYWluWyJ2IitvcHRpb25zLnZlcnNpb24u cmVwbGFjZSgvXC4vZywiXyIpXTtpZighY2xzKXt0aHJvdyJVbnN1cHBvcnRlZCBD U1dHZXREb21haW4gdmVyc2lvbjogIitvcHRpb25zLnZlcnNpb247fQpyZXR1cm4g bmV3IGNscyhvcHRpb25zKTt9O09wZW5MYXllcnMuRm9ybWF0LkNTV0dldERvbWFp bi5ERUZBVUxUUz17InZlcnNpb24iOiIyLjAuMiJ9O09wZW5MYXllcnMuRm9ybWF0 LkNTV0dldERvbWFpbi52Ml8wXzI9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJz LkZvcm1hdC5YTUwse25hbWVzcGFjZXM6e3hsaW5rOiJodHRwOi8vd3d3LnczLm9y Zy8xOTk5L3hsaW5rIix4c2k6Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2No ZW1hLWluc3RhbmNlIixjc3c6Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvY2F0L2Nz dy8yLjAuMiJ9LGRlZmF1bHRQcmVmaXg6ImNzdyIsdmVyc2lvbjoiMi4wLjIiLHNj aGVtYUxvY2F0aW9uOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2NhdC9jc3cvMi4w LjIgaHR0cDovL3NjaGVtYXMub3Blbmdpcy5uZXQvY3N3LzIuMC4yL0NTVy1kaXNj b3ZlcnkueHNkIixQcm9wZXJ0eU5hbWU6bnVsbCxQYXJhbWV0ZXJOYW1lOm51bGws aW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXtPcGVuTGF5ZXJzLkZvcm1hdC5Y TUwucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxbb3B0aW9uc10pO30s cmVhZDpmdW5jdGlvbihkYXRhKXtpZih0eXBlb2YgZGF0YT09InN0cmluZyIpe2Rh dGE9T3BlbkxheWVycy5Gb3JtYXQuWE1MLnByb3RvdHlwZS5yZWFkLmFwcGx5KHRo aXMsW2RhdGFdKTt9CmlmKGRhdGEmJmRhdGEubm9kZVR5cGU9PTkpe2RhdGE9ZGF0 YS5kb2N1bWVudEVsZW1lbnQ7fQp2YXIgb2JqPXt9O3RoaXMucmVhZE5vZGUoZGF0 YSxvYmopO3JldHVybiBvYmo7fSxyZWFkZXJzOnsiY3N3Ijp7IkdldERvbWFpblJl c3BvbnNlIjpmdW5jdGlvbihub2RlLG9iail7dGhpcy5yZWFkQ2hpbGROb2Rlcyhu b2RlLG9iaik7fSwiRG9tYWluVmFsdWVzIjpmdW5jdGlvbihub2RlLG9iail7aWYo IShPcGVuTGF5ZXJzLlV0aWwuaXNBcnJheShvYmouRG9tYWluVmFsdWVzKSkpe29i ai5Eb21haW5WYWx1ZXM9W107fQp2YXIgYXR0cnM9bm9kZS5hdHRyaWJ1dGVzO3Zh ciBkb21haW5WYWx1ZT17fTtmb3IodmFyIGk9MCxsZW49YXR0cnMubGVuZ3RoO2k8 bGVuOysraSl7ZG9tYWluVmFsdWVbYXR0cnNbaV0ubmFtZV09YXR0cnNbaV0ubm9k ZVZhbHVlO30KdGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLGRvbWFpblZhbHVlKTtv YmouRG9tYWluVmFsdWVzLnB1c2goZG9tYWluVmFsdWUpO30sIlByb3BlcnR5TmFt ZSI6ZnVuY3Rpb24obm9kZSxvYmope29iai5Qcm9wZXJ0eU5hbWU9dGhpcy5nZXRD aGlsZFZhbHVlKG5vZGUpO30sIlBhcmFtZXRlck5hbWUiOmZ1bmN0aW9uKG5vZGUs b2JqKXtvYmouUGFyYW1ldGVyTmFtZT10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7 fSwiTGlzdE9mVmFsdWVzIjpmdW5jdGlvbihub2RlLG9iail7aWYoIShPcGVuTGF5 ZXJzLlV0aWwuaXNBcnJheShvYmouTGlzdE9mVmFsdWVzKSkpe29iai5MaXN0T2ZW YWx1ZXM9W107fQp0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqLkxpc3RPZlZh bHVlcyk7fSwiVmFsdWUiOmZ1bmN0aW9uKG5vZGUsb2JqKXt2YXIgYXR0cnM9bm9k ZS5hdHRyaWJ1dGVzO3ZhciB2YWx1ZT17fTtmb3IodmFyIGk9MCxsZW49YXR0cnMu bGVuZ3RoO2k8bGVuOysraSl7dmFsdWVbYXR0cnNbaV0ubmFtZV09YXR0cnNbaV0u bm9kZVZhbHVlO30KdmFsdWUudmFsdWU9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUp O29iai5wdXNoKHtWYWx1ZTp2YWx1ZX0pO30sIkNvbmNlcHR1YWxTY2hlbWUiOmZ1 bmN0aW9uKG5vZGUsb2JqKXtvYmouQ29uY2VwdHVhbFNjaGVtZT17fTt0aGlzLnJl YWRDaGlsZE5vZGVzKG5vZGUsb2JqLkNvbmNlcHR1YWxTY2hlbWUpO30sIk5hbWUi OmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmouTmFtZT10aGlzLmdldENoaWxkVmFsdWUo bm9kZSk7fSwiRG9jdW1lbnQiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmouRG9jdW1l bnQ9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO30sIkF1dGhvcml0eSI6ZnVuY3Rp b24obm9kZSxvYmope29iai5BdXRob3JpdHk9dGhpcy5nZXRDaGlsZFZhbHVlKG5v ZGUpO30sIlJhbmdlT2ZWYWx1ZXMiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmouUmFu Z2VPZlZhbHVlcz17fTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqLlJhbmdl T2ZWYWx1ZXMpO30sIk1pblZhbHVlIjpmdW5jdGlvbihub2RlLG9iail7dmFyIGF0 dHJzPW5vZGUuYXR0cmlidXRlczt2YXIgdmFsdWU9e307Zm9yKHZhciBpPTAsbGVu PWF0dHJzLmxlbmd0aDtpPGxlbjsrK2kpe3ZhbHVlW2F0dHJzW2ldLm5hbWVdPWF0 dHJzW2ldLm5vZGVWYWx1ZTt9CnZhbHVlLnZhbHVlPXRoaXMuZ2V0Q2hpbGRWYWx1 ZShub2RlKTtvYmouTWluVmFsdWU9dmFsdWU7fSwiTWF4VmFsdWUiOmZ1bmN0aW9u KG5vZGUsb2JqKXt2YXIgYXR0cnM9bm9kZS5hdHRyaWJ1dGVzO3ZhciB2YWx1ZT17 fTtmb3IodmFyIGk9MCxsZW49YXR0cnMubGVuZ3RoO2k8bGVuOysraSl7dmFsdWVb YXR0cnNbaV0ubmFtZV09YXR0cnNbaV0ubm9kZVZhbHVlO30KdmFsdWUudmFsdWU9 dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO29iai5NYXhWYWx1ZT12YWx1ZTt9fX0s d3JpdGU6ZnVuY3Rpb24ob3B0aW9ucyl7dmFyIG5vZGU9dGhpcy53cml0ZU5vZGUo ImNzdzpHZXREb21haW4iLG9wdGlvbnMpO3JldHVybiBPcGVuTGF5ZXJzLkZvcm1h dC5YTUwucHJvdG90eXBlLndyaXRlLmFwcGx5KHRoaXMsW25vZGVdKTt9LHdyaXRl cnM6eyJjc3ciOnsiR2V0RG9tYWluIjpmdW5jdGlvbihvcHRpb25zKXt2YXIgbm9k ZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImNzdzpHZXREb21haW4iLHthdHRy aWJ1dGVzOntzZXJ2aWNlOiJDU1ciLHZlcnNpb246dGhpcy52ZXJzaW9ufX0pO2lm KG9wdGlvbnMuUHJvcGVydHlOYW1lfHx0aGlzLlByb3BlcnR5TmFtZSl7dGhpcy53 cml0ZU5vZGUoImNzdzpQcm9wZXJ0eU5hbWUiLG9wdGlvbnMuUHJvcGVydHlOYW1l fHx0aGlzLlByb3BlcnR5TmFtZSxub2RlKTt9ZWxzZSBpZihvcHRpb25zLlBhcmFt ZXRlck5hbWV8fHRoaXMuUGFyYW1ldGVyTmFtZSl7dGhpcy53cml0ZU5vZGUoImNz dzpQYXJhbWV0ZXJOYW1lIixvcHRpb25zLlBhcmFtZXRlck5hbWV8fHRoaXMuUGFy YW1ldGVyTmFtZSxub2RlKTt9CnRoaXMucmVhZENoaWxkTm9kZXMobm9kZSxvcHRp b25zKTtyZXR1cm4gbm9kZTt9LCJQcm9wZXJ0eU5hbWUiOmZ1bmN0aW9uKHZhbHVl KXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImNzdzpQcm9wZXJ0 eU5hbWUiLHt2YWx1ZTp2YWx1ZX0pO3JldHVybiBub2RlO30sIlBhcmFtZXRlck5h bWUiOmZ1bmN0aW9uKHZhbHVlKXt2YXIgbm9kZT10aGlzLmNyZWF0ZUVsZW1lbnRO U1BsdXMoImNzdzpQYXJhbWV0ZXJOYW1lIix7dmFsdWU6dmFsdWV9KTtyZXR1cm4g bm9kZTt9fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3JtYXQuQ1NXR2V0RG9t YWluLnYyXzBfMiJ9KTtPcGVuTGF5ZXJzLlN0cmF0ZWd5LkNsdXN0ZXI9T3Blbkxh eWVycy5DbGFzcyhPcGVuTGF5ZXJzLlN0cmF0ZWd5LHtkaXN0YW5jZToyMCx0aHJl c2hvbGQ6bnVsbCxmZWF0dXJlczpudWxsLGNsdXN0ZXJzOm51bGwsY2x1c3Rlcmlu ZzpmYWxzZSxyZXNvbHV0aW9uOm51bGwsYWN0aXZhdGU6ZnVuY3Rpb24oKXt2YXIg YWN0aXZhdGVkPU9wZW5MYXllcnMuU3RyYXRlZ3kucHJvdG90eXBlLmFjdGl2YXRl LmNhbGwodGhpcyk7aWYoYWN0aXZhdGVkKXt0aGlzLmxheWVyLmV2ZW50cy5vbih7 ImJlZm9yZWZlYXR1cmVzYWRkZWQiOnRoaXMuY2FjaGVGZWF0dXJlcywibW92ZWVu ZCI6dGhpcy5jbHVzdGVyLHNjb3BlOnRoaXN9KTt9CnJldHVybiBhY3RpdmF0ZWQ7 fSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7dmFyIGRlYWN0aXZhdGVkPU9wZW5MYXll cnMuU3RyYXRlZ3kucHJvdG90eXBlLmRlYWN0aXZhdGUuY2FsbCh0aGlzKTtpZihk ZWFjdGl2YXRlZCl7dGhpcy5jbGVhckNhY2hlKCk7dGhpcy5sYXllci5ldmVudHMu dW4oeyJiZWZvcmVmZWF0dXJlc2FkZGVkIjp0aGlzLmNhY2hlRmVhdHVyZXMsIm1v dmVlbmQiOnRoaXMuY2x1c3RlcixzY29wZTp0aGlzfSk7fQpyZXR1cm4gZGVhY3Rp dmF0ZWQ7fSxjYWNoZUZlYXR1cmVzOmZ1bmN0aW9uKGV2ZW50KXt2YXIgcHJvcGFn YXRlPXRydWU7aWYoIXRoaXMuY2x1c3RlcmluZyl7dGhpcy5jbGVhckNhY2hlKCk7 dGhpcy5mZWF0dXJlcz1ldmVudC5mZWF0dXJlczt0aGlzLmNsdXN0ZXIoKTtwcm9w YWdhdGU9ZmFsc2U7fQpyZXR1cm4gcHJvcGFnYXRlO30sY2xlYXJDYWNoZTpmdW5j dGlvbigpe3RoaXMuZmVhdHVyZXM9bnVsbDt9LGNsdXN0ZXI6ZnVuY3Rpb24oZXZl bnQpe2lmKCghZXZlbnR8fGV2ZW50Lnpvb21DaGFuZ2VkKSYmdGhpcy5mZWF0dXJl cyl7dmFyIHJlc29sdXRpb249dGhpcy5sYXllci5tYXAuZ2V0UmVzb2x1dGlvbigp O2lmKHJlc29sdXRpb24hPXRoaXMucmVzb2x1dGlvbnx8IXRoaXMuY2x1c3RlcnNF eGlzdCgpKXt0aGlzLnJlc29sdXRpb249cmVzb2x1dGlvbjt2YXIgY2x1c3RlcnM9 W107dmFyIGZlYXR1cmUsY2x1c3RlcmVkLGNsdXN0ZXI7Zm9yKHZhciBpPTA7aTx0 aGlzLmZlYXR1cmVzLmxlbmd0aDsrK2kpe2ZlYXR1cmU9dGhpcy5mZWF0dXJlc1tp XTtpZihmZWF0dXJlLmdlb21ldHJ5KXtjbHVzdGVyZWQ9ZmFsc2U7Zm9yKHZhciBq PWNsdXN0ZXJzLmxlbmd0aC0xO2o+PTA7LS1qKXtjbHVzdGVyPWNsdXN0ZXJzW2pd O2lmKHRoaXMuc2hvdWxkQ2x1c3RlcihjbHVzdGVyLGZlYXR1cmUpKXt0aGlzLmFk ZFRvQ2x1c3RlcihjbHVzdGVyLGZlYXR1cmUpO2NsdXN0ZXJlZD10cnVlO2JyZWFr O319CmlmKCFjbHVzdGVyZWQpe2NsdXN0ZXJzLnB1c2godGhpcy5jcmVhdGVDbHVz dGVyKHRoaXMuZmVhdHVyZXNbaV0pKTt9fX0KdGhpcy5sYXllci5yZW1vdmVBbGxG ZWF0dXJlcygpO2lmKGNsdXN0ZXJzLmxlbmd0aD4wKXtpZih0aGlzLnRocmVzaG9s ZD4xKXt2YXIgY2xvbmU9Y2x1c3RlcnMuc2xpY2UoKTtjbHVzdGVycz1bXTt2YXIg Y2FuZGlkYXRlO2Zvcih2YXIgaT0wLGxlbj1jbG9uZS5sZW5ndGg7aTxsZW47Kytp KXtjYW5kaWRhdGU9Y2xvbmVbaV07aWYoY2FuZGlkYXRlLmF0dHJpYnV0ZXMuY291 bnQ8dGhpcy50aHJlc2hvbGQpe0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGNs dXN0ZXJzLGNhbmRpZGF0ZS5jbHVzdGVyKTt9ZWxzZXtjbHVzdGVycy5wdXNoKGNh bmRpZGF0ZSk7fX19CnRoaXMuY2x1c3RlcmluZz10cnVlO3RoaXMubGF5ZXIuYWRk RmVhdHVyZXMoY2x1c3RlcnMpO3RoaXMuY2x1c3RlcmluZz1mYWxzZTt9CnRoaXMu Y2x1c3RlcnM9Y2x1c3RlcnM7fX19LGNsdXN0ZXJzRXhpc3Q6ZnVuY3Rpb24oKXt2 YXIgZXhpc3Q9ZmFsc2U7aWYodGhpcy5jbHVzdGVycyYmdGhpcy5jbHVzdGVycy5s ZW5ndGg+MCYmdGhpcy5jbHVzdGVycy5sZW5ndGg9PXRoaXMubGF5ZXIuZmVhdHVy ZXMubGVuZ3RoKXtleGlzdD10cnVlO2Zvcih2YXIgaT0wO2k8dGhpcy5jbHVzdGVy cy5sZW5ndGg7KytpKXtpZih0aGlzLmNsdXN0ZXJzW2ldIT10aGlzLmxheWVyLmZl YXR1cmVzW2ldKXtleGlzdD1mYWxzZTticmVhazt9fX0KcmV0dXJuIGV4aXN0O30s c2hvdWxkQ2x1c3RlcjpmdW5jdGlvbihjbHVzdGVyLGZlYXR1cmUpe3ZhciBjYz1j bHVzdGVyLmdlb21ldHJ5LmdldEJvdW5kcygpLmdldENlbnRlckxvbkxhdCgpO3Zh ciBmYz1mZWF0dXJlLmdlb21ldHJ5LmdldEJvdW5kcygpLmdldENlbnRlckxvbkxh dCgpO3ZhciBkaXN0YW5jZT0oTWF0aC5zcXJ0KE1hdGgucG93KChjYy5sb24tZmMu bG9uKSwyKStNYXRoLnBvdygoY2MubGF0LWZjLmxhdCksMikpL3RoaXMucmVzb2x1 dGlvbik7cmV0dXJuKGRpc3RhbmNlPD10aGlzLmRpc3RhbmNlKTt9LGFkZFRvQ2x1 c3RlcjpmdW5jdGlvbihjbHVzdGVyLGZlYXR1cmUpe2NsdXN0ZXIuY2x1c3Rlci5w dXNoKGZlYXR1cmUpO2NsdXN0ZXIuYXR0cmlidXRlcy5jb3VudCs9MTt9LGNyZWF0 ZUNsdXN0ZXI6ZnVuY3Rpb24oZmVhdHVyZSl7dmFyIGNlbnRlcj1mZWF0dXJlLmdl b21ldHJ5LmdldEJvdW5kcygpLmdldENlbnRlckxvbkxhdCgpO3ZhciBjbHVzdGVy PW5ldyBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9yKG5ldyBPcGVuTGF5ZXJzLkdl b21ldHJ5LlBvaW50KGNlbnRlci5sb24sY2VudGVyLmxhdCkse2NvdW50OjF9KTtj bHVzdGVyLmNsdXN0ZXI9W2ZlYXR1cmVdO3JldHVybiBjbHVzdGVyO30sQ0xBU1Nf TkFNRToiT3BlbkxheWVycy5TdHJhdGVneS5DbHVzdGVyIn0pO09wZW5MYXllcnMu U3RyYXRlZ3kuRmlsdGVyPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5TdHJh dGVneSx7ZmlsdGVyOm51bGwsY2FjaGU6bnVsbCxjYWNoaW5nOmZhbHNlLGFjdGl2 YXRlOmZ1bmN0aW9uKCl7dmFyIGFjdGl2YXRlZD1PcGVuTGF5ZXJzLlN0cmF0ZWd5 LnByb3RvdHlwZS5hY3RpdmF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoYWN0 aXZhdGVkKXt0aGlzLmNhY2hlPVtdO3RoaXMubGF5ZXIuZXZlbnRzLm9uKHsiYmVm b3JlZmVhdHVyZXNhZGRlZCI6dGhpcy5oYW5kbGVBZGQsImJlZm9yZWZlYXR1cmVz cmVtb3ZlZCI6dGhpcy5oYW5kbGVSZW1vdmUsc2NvcGU6dGhpc30pO30KcmV0dXJu IGFjdGl2YXRlZDt9LGRlYWN0aXZhdGU6ZnVuY3Rpb24oKXt0aGlzLmNhY2hlPW51 bGw7aWYodGhpcy5sYXllciYmdGhpcy5sYXllci5ldmVudHMpe3RoaXMubGF5ZXIu ZXZlbnRzLnVuKHsiYmVmb3JlZmVhdHVyZXNhZGRlZCI6dGhpcy5oYW5kbGVBZGQs ImJlZm9yZWZlYXR1cmVzcmVtb3ZlZCI6dGhpcy5oYW5kbGVSZW1vdmUsc2NvcGU6 dGhpc30pO30KcmV0dXJuIE9wZW5MYXllcnMuU3RyYXRlZ3kucHJvdG90eXBlLmRl YWN0aXZhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO30saGFuZGxlQWRkOmZ1bmN0 aW9uKGV2ZW50KXtpZighdGhpcy5jYWNoaW5nJiZ0aGlzLmZpbHRlcil7dmFyIGZl YXR1cmVzPWV2ZW50LmZlYXR1cmVzO2V2ZW50LmZlYXR1cmVzPVtdO3ZhciBmZWF0 dXJlO2Zvcih2YXIgaT0wLGlpPWZlYXR1cmVzLmxlbmd0aDtpPGlpOysraSl7ZmVh dHVyZT1mZWF0dXJlc1tpXTtpZih0aGlzLmZpbHRlci5ldmFsdWF0ZShmZWF0dXJl KSl7ZXZlbnQuZmVhdHVyZXMucHVzaChmZWF0dXJlKTt9ZWxzZXt0aGlzLmNhY2hl LnB1c2goZmVhdHVyZSk7fX19fSxoYW5kbGVSZW1vdmU6ZnVuY3Rpb24oZXZlbnQp e2lmKCF0aGlzLmNhY2hpbmcpe3RoaXMuY2FjaGU9W107fX0sc2V0RmlsdGVyOmZ1 bmN0aW9uKGZpbHRlcil7dGhpcy5maWx0ZXI9ZmlsdGVyO3ZhciBwcmV2aW91c0Nh Y2hlPXRoaXMuY2FjaGU7dGhpcy5jYWNoZT1bXTt0aGlzLmhhbmRsZUFkZCh7ZmVh dHVyZXM6dGhpcy5sYXllci5mZWF0dXJlc30pO2lmKHRoaXMuY2FjaGUubGVuZ3Ro PjApe3RoaXMuY2FjaGluZz10cnVlO3RoaXMubGF5ZXIucmVtb3ZlRmVhdHVyZXMo dGhpcy5jYWNoZS5zbGljZSgpKTt0aGlzLmNhY2hpbmc9ZmFsc2U7fQppZihwcmV2 aW91c0NhY2hlLmxlbmd0aD4wKXt2YXIgZXZlbnQ9e2ZlYXR1cmVzOnByZXZpb3Vz Q2FjaGV9O3RoaXMuaGFuZGxlQWRkKGV2ZW50KTtpZihldmVudC5mZWF0dXJlcy5s ZW5ndGg+MCl7dGhpcy5jYWNoaW5nPXRydWU7dGhpcy5sYXllci5hZGRGZWF0dXJl cyhldmVudC5mZWF0dXJlcyk7dGhpcy5jYWNoaW5nPWZhbHNlO319fSxDTEFTU19O QU1FOiJPcGVuTGF5ZXJzLlN0cmF0ZWd5LkZpbHRlciJ9KTtPcGVuTGF5ZXJzLlBy b3RvY29sLlNPUz1mdW5jdGlvbihvcHRpb25zKXtvcHRpb25zPU9wZW5MYXllcnMu VXRpbC5hcHBseURlZmF1bHRzKG9wdGlvbnMsT3BlbkxheWVycy5Qcm90b2NvbC5T T1MuREVGQVVMVFMpO3ZhciBjbHM9T3BlbkxheWVycy5Qcm90b2NvbC5TT1NbInYi K29wdGlvbnMudmVyc2lvbi5yZXBsYWNlKC9cLi9nLCJfIildO2lmKCFjbHMpe3Ro cm93IlVuc3VwcG9ydGVkIFNPUyB2ZXJzaW9uOiAiK29wdGlvbnMudmVyc2lvbjt9 CnJldHVybiBuZXcgY2xzKG9wdGlvbnMpO307T3BlbkxheWVycy5Qcm90b2NvbC5T T1MuREVGQVVMVFM9eyJ2ZXJzaW9uIjoiMS4wLjAifTtPcGVuTGF5ZXJzLkZvcm1h dC5HZW9SU1M9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkZvcm1hdC5YTUws e3Jzc25zOiJodHRwOi8vYmFja2VuZC51c2VybGFuZC5jb20vcnNzMiIsZmVhdHVy ZU5TOiJodHRwOi8vbWFwc2VydmVyLmdpcy51bW4uZWR1L21hcHNlcnZlciIsZ2Vv cnNzbnM6Imh0dHA6Ly93d3cuZ2VvcnNzLm9yZy9nZW9yc3MiLGdlb25zOiJodHRw Oi8vd3d3LnczLm9yZy8yMDAzLzAxL2dlby93Z3M4NF9wb3MjIixmZWF0dXJlVGl0 bGU6IlVudGl0bGVkIixmZWF0dXJlRGVzY3JpcHRpb246Ik5vIERlc2NyaXB0aW9u IixnbWxQYXJzZXI6bnVsbCx4eTpmYWxzZSxjcmVhdGVHZW9tZXRyeUZyb21JdGVt OmZ1bmN0aW9uKGl0ZW0pe3ZhciBwb2ludD10aGlzLmdldEVsZW1lbnRzQnlUYWdO YW1lTlMoaXRlbSx0aGlzLmdlb3Jzc25zLCJwb2ludCIpO3ZhciBsYXQ9dGhpcy5n ZXRFbGVtZW50c0J5VGFnTmFtZU5TKGl0ZW0sdGhpcy5nZW9ucywnbGF0Jyk7dmFy IGxvbj10aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoaXRlbSx0aGlzLmdlb25z LCdsb25nJyk7dmFyIGxpbmU9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKGl0 ZW0sdGhpcy5nZW9yc3NucywibGluZSIpO3ZhciBwb2x5Z29uPXRoaXMuZ2V0RWxl bWVudHNCeVRhZ05hbWVOUyhpdGVtLHRoaXMuZ2VvcnNzbnMsInBvbHlnb24iKTt2 YXIgd2hlcmU9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKGl0ZW0sdGhpcy5n ZW9yc3Nucywid2hlcmUiKTt2YXIgYm94PXRoaXMuZ2V0RWxlbWVudHNCeVRhZ05h bWVOUyhpdGVtLHRoaXMuZ2VvcnNzbnMsImJveCIpO2lmKHBvaW50Lmxlbmd0aD4w fHwobGF0Lmxlbmd0aD4wJiZsb24ubGVuZ3RoPjApKXt2YXIgbG9jYXRpb247aWYo cG9pbnQubGVuZ3RoPjApe2xvY2F0aW9uPU9wZW5MYXllcnMuU3RyaW5nLnRyaW0o cG9pbnRbMF0uZmlyc3RDaGlsZC5ub2RlVmFsdWUpLnNwbGl0KC9ccysvKTtpZihs b2NhdGlvbi5sZW5ndGghPTIpe2xvY2F0aW9uPU9wZW5MYXllcnMuU3RyaW5nLnRy aW0ocG9pbnRbMF0uZmlyc3RDaGlsZC5ub2RlVmFsdWUpLnNwbGl0KC9ccyosXHMq Lyk7fX1lbHNle2xvY2F0aW9uPVtwYXJzZUZsb2F0KGxhdFswXS5maXJzdENoaWxk Lm5vZGVWYWx1ZSkscGFyc2VGbG9hdChsb25bMF0uZmlyc3RDaGlsZC5ub2RlVmFs dWUpXTt9CnZhciBnZW9tZXRyeT1uZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2lu dChwYXJzZUZsb2F0KGxvY2F0aW9uWzFdKSxwYXJzZUZsb2F0KGxvY2F0aW9uWzBd KSk7fWVsc2UgaWYobGluZS5sZW5ndGg+MCl7dmFyIGNvb3Jkcz1PcGVuTGF5ZXJz LlN0cmluZy50cmltKHRoaXMuY29uY2F0Q2hpbGRWYWx1ZXMobGluZVswXSkpLnNw bGl0KC9ccysvKTt2YXIgY29tcG9uZW50cz1bXTt2YXIgcG9pbnQ7Zm9yKHZhciBp PTAsbGVuPWNvb3Jkcy5sZW5ndGg7aTxsZW47aSs9Mil7cG9pbnQ9bmV3IE9wZW5M YXllcnMuR2VvbWV0cnkuUG9pbnQocGFyc2VGbG9hdChjb29yZHNbaSsxXSkscGFy c2VGbG9hdChjb29yZHNbaV0pKTtjb21wb25lbnRzLnB1c2gocG9pbnQpO30KZ2Vv bWV0cnk9bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuTGluZVN0cmluZyhjb21wb25l bnRzKTt9ZWxzZSBpZihwb2x5Z29uLmxlbmd0aD4wKXt2YXIgY29vcmRzPU9wZW5M YXllcnMuU3RyaW5nLnRyaW0odGhpcy5jb25jYXRDaGlsZFZhbHVlcyhwb2x5Z29u WzBdKSkuc3BsaXQoL1xzKy8pO3ZhciBjb21wb25lbnRzPVtdO3ZhciBwb2ludDtm b3IodmFyIGk9MCxsZW49Y29vcmRzLmxlbmd0aDtpPGxlbjtpKz0yKXtwb2ludD1u ZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludChwYXJzZUZsb2F0KGNvb3Jkc1tp KzFdKSxwYXJzZUZsb2F0KGNvb3Jkc1tpXSkpO2NvbXBvbmVudHMucHVzaChwb2lu dCk7fQpnZW9tZXRyeT1uZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2x5Z29uKFtu ZXcgT3BlbkxheWVycy5HZW9tZXRyeS5MaW5lYXJSaW5nKGNvbXBvbmVudHMpXSk7 fWVsc2UgaWYod2hlcmUubGVuZ3RoPjApe2lmKCF0aGlzLmdtbFBhcnNlcil7dGhp cy5nbWxQYXJzZXI9bmV3IE9wZW5MYXllcnMuRm9ybWF0LkdNTCh7J3h5Jzp0aGlz Lnh5fSk7fQp2YXIgZmVhdHVyZT10aGlzLmdtbFBhcnNlci5wYXJzZUZlYXR1cmUo d2hlcmVbMF0pO2dlb21ldHJ5PWZlYXR1cmUuZ2VvbWV0cnk7fWVsc2UgaWYoYm94 Lmxlbmd0aD4wKXt2YXIgY29vcmRzPU9wZW5MYXllcnMuU3RyaW5nLnRyaW0oYm94 WzBdLmZpcnN0Q2hpbGQubm9kZVZhbHVlKS5zcGxpdCgvXHMrLyk7dmFyIGNvbXBv bmVudHM9W107dmFyIHBvaW50O2lmKGNvb3Jkcy5sZW5ndGg+Myl7cG9pbnQ9bmV3 IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQocGFyc2VGbG9hdChjb29yZHNbMV0p LHBhcnNlRmxvYXQoY29vcmRzWzBdKSk7Y29tcG9uZW50cy5wdXNoKHBvaW50KTtw b2ludD1uZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludChwYXJzZUZsb2F0KGNv b3Jkc1sxXSkscGFyc2VGbG9hdChjb29yZHNbMl0pKTtjb21wb25lbnRzLnB1c2go cG9pbnQpO3BvaW50PW5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KHBhcnNl RmxvYXQoY29vcmRzWzNdKSxwYXJzZUZsb2F0KGNvb3Jkc1syXSkpO2NvbXBvbmVu dHMucHVzaChwb2ludCk7cG9pbnQ9bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9p bnQocGFyc2VGbG9hdChjb29yZHNbM10pLHBhcnNlRmxvYXQoY29vcmRzWzBdKSk7 Y29tcG9uZW50cy5wdXNoKHBvaW50KTtwb2ludD1uZXcgT3BlbkxheWVycy5HZW9t ZXRyeS5Qb2ludChwYXJzZUZsb2F0KGNvb3Jkc1sxXSkscGFyc2VGbG9hdChjb29y ZHNbMF0pKTtjb21wb25lbnRzLnB1c2gocG9pbnQpO30KZ2VvbWV0cnk9bmV3IE9w ZW5MYXllcnMuR2VvbWV0cnkuUG9seWdvbihbbmV3IE9wZW5MYXllcnMuR2VvbWV0 cnkuTGluZWFyUmluZyhjb21wb25lbnRzKV0pO30KaWYoZ2VvbWV0cnkmJnRoaXMu aW50ZXJuYWxQcm9qZWN0aW9uJiZ0aGlzLmV4dGVybmFsUHJvamVjdGlvbil7Z2Vv bWV0cnkudHJhbnNmb3JtKHRoaXMuZXh0ZXJuYWxQcm9qZWN0aW9uLHRoaXMuaW50 ZXJuYWxQcm9qZWN0aW9uKTt9CnJldHVybiBnZW9tZXRyeTt9LGNyZWF0ZUZlYXR1 cmVGcm9tSXRlbTpmdW5jdGlvbihpdGVtKXt2YXIgZ2VvbWV0cnk9dGhpcy5jcmVh dGVHZW9tZXRyeUZyb21JdGVtKGl0ZW0pO3ZhciB0aXRsZT10aGlzLmdldENoaWxk VmFsdWUoaXRlbSwiKiIsInRpdGxlIix0aGlzLmZlYXR1cmVUaXRsZSk7dmFyIGRl c2NyaXB0aW9uPXRoaXMuZ2V0Q2hpbGRWYWx1ZShpdGVtLCIqIiwiZGVzY3JpcHRp b24iLHRoaXMuZ2V0Q2hpbGRWYWx1ZShpdGVtLCIqIiwiY29udGVudCIsdGhpcy5n ZXRDaGlsZFZhbHVlKGl0ZW0sIioiLCJzdW1tYXJ5Iix0aGlzLmZlYXR1cmVEZXNj cmlwdGlvbikpKTt2YXIgbGluaz10aGlzLmdldENoaWxkVmFsdWUoaXRlbSwiKiIs ImxpbmsiKTtpZighbGluayl7dHJ5e2xpbms9dGhpcy5nZXRFbGVtZW50c0J5VGFn TmFtZU5TKGl0ZW0sIioiLCJsaW5rIilbMF0uZ2V0QXR0cmlidXRlKCJocmVmIik7 fWNhdGNoKGUpe2xpbms9bnVsbDt9fQp2YXIgaWQ9dGhpcy5nZXRDaGlsZFZhbHVl KGl0ZW0sIioiLCJpZCIsbnVsbCk7dmFyIGRhdGE9eyJ0aXRsZSI6dGl0bGUsImRl c2NyaXB0aW9uIjpkZXNjcmlwdGlvbiwibGluayI6bGlua307dmFyIGZlYXR1cmU9 bmV3IE9wZW5MYXllcnMuRmVhdHVyZS5WZWN0b3IoZ2VvbWV0cnksZGF0YSk7ZmVh dHVyZS5maWQ9aWQ7cmV0dXJuIGZlYXR1cmU7fSxnZXRDaGlsZFZhbHVlOmZ1bmN0 aW9uKG5vZGUsbnN1cmksbmFtZSxkZWYpe3ZhciB2YWx1ZTt2YXIgZWxlcz10aGlz LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMobm9kZSxuc3VyaSxuYW1lKTtpZihlbGVz JiZlbGVzWzBdJiZlbGVzWzBdLmZpcnN0Q2hpbGQmJmVsZXNbMF0uZmlyc3RDaGls ZC5ub2RlVmFsdWUpe3ZhbHVlPU9wZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5 cGUuZ2V0Q2hpbGRWYWx1ZShlbGVzWzBdKTt9ZWxzZXt2YWx1ZT0oZGVmPT11bmRl ZmluZWQpPyIiOmRlZjt9CnJldHVybiB2YWx1ZTt9LHJlYWQ6ZnVuY3Rpb24oZG9j KXtpZih0eXBlb2YgZG9jPT0ic3RyaW5nIil7ZG9jPU9wZW5MYXllcnMuRm9ybWF0 LlhNTC5wcm90b3R5cGUucmVhZC5hcHBseSh0aGlzLFtkb2NdKTt9CnZhciBpdGVt bGlzdD1udWxsO2l0ZW1saXN0PXRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhk b2MsJyonLCdpdGVtJyk7aWYoaXRlbWxpc3QubGVuZ3RoPT0wKXtpdGVtbGlzdD10 aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoZG9jLCcqJywnZW50cnknKTt9CnZh ciBudW1JdGVtcz1pdGVtbGlzdC5sZW5ndGg7dmFyIGZlYXR1cmVzPW5ldyBBcnJh eShudW1JdGVtcyk7Zm9yKHZhciBpPTA7aTxudW1JdGVtcztpKyspe2ZlYXR1cmVz W2ldPXRoaXMuY3JlYXRlRmVhdHVyZUZyb21JdGVtKGl0ZW1saXN0W2ldKTt9CnJl dHVybiBmZWF0dXJlczt9LHdyaXRlOmZ1bmN0aW9uKGZlYXR1cmVzKXt2YXIgZ2Vv cnNzO2lmKE9wZW5MYXllcnMuVXRpbC5pc0FycmF5KGZlYXR1cmVzKSl7Z2VvcnNz PXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMucnNzbnMsInJzcyIpO2Zvcih2YXIg aT0wLGxlbj1mZWF0dXJlcy5sZW5ndGg7aTxsZW47aSsrKXtnZW9yc3MuYXBwZW5k Q2hpbGQodGhpcy5jcmVhdGVGZWF0dXJlWE1MKGZlYXR1cmVzW2ldKSk7fX1lbHNl e2dlb3Jzcz10aGlzLmNyZWF0ZUZlYXR1cmVYTUwoZmVhdHVyZXMpO30KcmV0dXJu IE9wZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5cGUud3JpdGUuYXBwbHkodGhp cyxbZ2VvcnNzXSk7fSxjcmVhdGVGZWF0dXJlWE1MOmZ1bmN0aW9uKGZlYXR1cmUp e3ZhciBnZW9tZXRyeU5vZGU9dGhpcy5idWlsZEdlb21ldHJ5Tm9kZShmZWF0dXJl Lmdlb21ldHJ5KTt2YXIgZmVhdHVyZU5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlMo dGhpcy5yc3NucywiaXRlbSIpO3ZhciB0aXRsZU5vZGU9dGhpcy5jcmVhdGVFbGVt ZW50TlModGhpcy5yc3NucywidGl0bGUiKTt0aXRsZU5vZGUuYXBwZW5kQ2hpbGQo dGhpcy5jcmVhdGVUZXh0Tm9kZShmZWF0dXJlLmF0dHJpYnV0ZXMudGl0bGU/ZmVh dHVyZS5hdHRyaWJ1dGVzLnRpdGxlOiIiKSk7dmFyIGRlc2NOb2RlPXRoaXMuY3Jl YXRlRWxlbWVudE5TKHRoaXMucnNzbnMsImRlc2NyaXB0aW9uIik7ZGVzY05vZGUu YXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVUZXh0Tm9kZShmZWF0dXJlLmF0dHJpYnV0 ZXMuZGVzY3JpcHRpb24/ZmVhdHVyZS5hdHRyaWJ1dGVzLmRlc2NyaXB0aW9uOiIi KSk7ZmVhdHVyZU5vZGUuYXBwZW5kQ2hpbGQodGl0bGVOb2RlKTtmZWF0dXJlTm9k ZS5hcHBlbmRDaGlsZChkZXNjTm9kZSk7aWYoZmVhdHVyZS5hdHRyaWJ1dGVzLmxp bmspe3ZhciBsaW5rTm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROUyh0aGlzLnJzc25z LCJsaW5rIik7bGlua05vZGUuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVUZXh0Tm9k ZShmZWF0dXJlLmF0dHJpYnV0ZXMubGluaykpO2ZlYXR1cmVOb2RlLmFwcGVuZENo aWxkKGxpbmtOb2RlKTt9CmZvcih2YXIgYXR0ciBpbiBmZWF0dXJlLmF0dHJpYnV0 ZXMpe2lmKGF0dHI9PSJsaW5rInx8YXR0cj09InRpdGxlInx8YXR0cj09ImRlc2Ny aXB0aW9uIil7Y29udGludWU7fQp2YXIgYXR0clRleHQ9dGhpcy5jcmVhdGVUZXh0 Tm9kZShmZWF0dXJlLmF0dHJpYnV0ZXNbYXR0cl0pO3ZhciBub2RlbmFtZT1hdHRy O2lmKGF0dHIuc2VhcmNoKCI6IikhPS0xKXtub2RlbmFtZT1hdHRyLnNwbGl0KCI6 IilbMV07fQp2YXIgYXR0ckNvbnRhaW5lcj10aGlzLmNyZWF0ZUVsZW1lbnROUyh0 aGlzLmZlYXR1cmVOUywiZmVhdHVyZToiK25vZGVuYW1lKTthdHRyQ29udGFpbmVy LmFwcGVuZENoaWxkKGF0dHJUZXh0KTtmZWF0dXJlTm9kZS5hcHBlbmRDaGlsZChh dHRyQ29udGFpbmVyKTt9CmZlYXR1cmVOb2RlLmFwcGVuZENoaWxkKGdlb21ldHJ5 Tm9kZSk7cmV0dXJuIGZlYXR1cmVOb2RlO30sYnVpbGRHZW9tZXRyeU5vZGU6ZnVu Y3Rpb24oZ2VvbWV0cnkpe2lmKHRoaXMuaW50ZXJuYWxQcm9qZWN0aW9uJiZ0aGlz LmV4dGVybmFsUHJvamVjdGlvbil7Z2VvbWV0cnk9Z2VvbWV0cnkuY2xvbmUoKTtn ZW9tZXRyeS50cmFuc2Zvcm0odGhpcy5pbnRlcm5hbFByb2plY3Rpb24sdGhpcy5l eHRlcm5hbFByb2plY3Rpb24pO30KdmFyIG5vZGU7aWYoZ2VvbWV0cnkuQ0xBU1Nf TkFNRT09Ik9wZW5MYXllcnMuR2VvbWV0cnkuUG9seWdvbiIpe25vZGU9dGhpcy5j cmVhdGVFbGVtZW50TlModGhpcy5nZW9yc3NucywnZ2VvcnNzOnBvbHlnb24nKTtu b2RlLmFwcGVuZENoaWxkKHRoaXMuYnVpbGRDb29yZGluYXRlc05vZGUoZ2VvbWV0 cnkuY29tcG9uZW50c1swXSkpO30KZWxzZSBpZihnZW9tZXRyeS5DTEFTU19OQU1F PT0iT3BlbkxheWVycy5HZW9tZXRyeS5MaW5lU3RyaW5nIil7bm9kZT10aGlzLmNy ZWF0ZUVsZW1lbnROUyh0aGlzLmdlb3Jzc25zLCdnZW9yc3M6bGluZScpO25vZGUu YXBwZW5kQ2hpbGQodGhpcy5idWlsZENvb3JkaW5hdGVzTm9kZShnZW9tZXRyeSkp O30KZWxzZSBpZihnZW9tZXRyeS5DTEFTU19OQU1FPT0iT3BlbkxheWVycy5HZW9t ZXRyeS5Qb2ludCIpe25vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlModGhpcy5nZW9y c3NucywnZ2VvcnNzOnBvaW50Jyk7bm9kZS5hcHBlbmRDaGlsZCh0aGlzLmJ1aWxk Q29vcmRpbmF0ZXNOb2RlKGdlb21ldHJ5KSk7fWVsc2V7dGhyb3ciQ291bGRuJ3Qg cGFyc2UgIitnZW9tZXRyeS5DTEFTU19OQU1FO30KcmV0dXJuIG5vZGU7fSxidWls ZENvb3JkaW5hdGVzTm9kZTpmdW5jdGlvbihnZW9tZXRyeSl7dmFyIHBvaW50cz1u dWxsO2lmKGdlb21ldHJ5LmNvbXBvbmVudHMpe3BvaW50cz1nZW9tZXRyeS5jb21w b25lbnRzO30KdmFyIHBhdGg7aWYocG9pbnRzKXt2YXIgbnVtUG9pbnRzPXBvaW50 cy5sZW5ndGg7dmFyIHBhcnRzPW5ldyBBcnJheShudW1Qb2ludHMpO2Zvcih2YXIg aT0wO2k8bnVtUG9pbnRzO2krKyl7cGFydHNbaV09cG9pbnRzW2ldLnkrIiAiK3Bv aW50c1tpXS54O30KcGF0aD1wYXJ0cy5qb2luKCIgIik7fWVsc2V7cGF0aD1nZW9t ZXRyeS55KyIgIitnZW9tZXRyeS54O30KcmV0dXJuIHRoaXMuY3JlYXRlVGV4dE5v ZGUocGF0aCk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5HZW9SU1Mi fSk7T3BlbkxheWVycy5Gb3JtYXQuV1BTQ2FwYWJpbGl0aWVzPU9wZW5MYXllcnMu Q2xhc3MoT3BlbkxheWVycy5Gb3JtYXQuWE1MLlZlcnNpb25lZE9HQyx7ZGVmYXVs dFZlcnNpb246IjEuMC4wIixDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5X UFNDYXBhYmlsaXRpZXMifSk7T3BlbkxheWVycy5Gb3JtYXQuV1BTQ2FwYWJpbGl0 aWVzLnYxXzBfMD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0LlhN TCx7bmFtZXNwYWNlczp7b3dzOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L293cy8x LjEiLHdwczoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC93cHMvMS4wLjAiLHhsaW5r OiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIn0scmVnRXhlczp7dHJpbVNw YWNlOigvXlxzKnxccyokL2cpLHJlbW92ZVNwYWNlOigvXHMqL2cpLHNwbGl0U3Bh Y2U6KC9ccysvKSx0cmltQ29tbWE6KC9ccyosXHMqL2cpfSxpbml0aWFsaXplOmZ1 bmN0aW9uKG9wdGlvbnMpe09wZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5cGUu aW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7fSxyZWFkOmZ1bmN0aW9u KGRhdGEpe2lmKHR5cGVvZiBkYXRhPT0ic3RyaW5nIil7ZGF0YT1PcGVuTGF5ZXJz LkZvcm1hdC5YTUwucHJvdG90eXBlLnJlYWQuYXBwbHkodGhpcyxbZGF0YV0pO30K aWYoZGF0YSYmZGF0YS5ub2RlVHlwZT09OSl7ZGF0YT1kYXRhLmRvY3VtZW50RWxl bWVudDt9CnZhciBjYXBhYmlsaXRpZXM9e307dGhpcy5yZWFkTm9kZShkYXRhLGNh cGFiaWxpdGllcyk7cmV0dXJuIGNhcGFiaWxpdGllczt9LHJlYWRlcnM6eyJ3cHMi OnsiQ2FwYWJpbGl0aWVzIjpmdW5jdGlvbihub2RlLG9iail7dGhpcy5yZWFkQ2hp bGROb2Rlcyhub2RlLG9iaik7fSwiUHJvY2Vzc09mZmVyaW5ncyI6ZnVuY3Rpb24o bm9kZSxvYmope29iai5wcm9jZXNzT2ZmZXJpbmdzPXt9O3RoaXMucmVhZENoaWxk Tm9kZXMobm9kZSxvYmoucHJvY2Vzc09mZmVyaW5ncyk7fSwiUHJvY2VzcyI6ZnVu Y3Rpb24obm9kZSxwcm9jZXNzT2ZmZXJpbmdzKXt2YXIgcHJvY2Vzc1ZlcnNpb249 dGhpcy5nZXRBdHRyaWJ1dGVOUyhub2RlLHRoaXMubmFtZXNwYWNlcy53cHMsInBy b2Nlc3NWZXJzaW9uIik7dmFyIHByb2Nlc3M9e3Byb2Nlc3NWZXJzaW9uOnByb2Nl c3NWZXJzaW9ufTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUscHJvY2Vzcyk7cHJv Y2Vzc09mZmVyaW5nc1twcm9jZXNzLmlkZW50aWZpZXJdPXByb2Nlc3M7fSwiTGFu Z3VhZ2VzIjpmdW5jdGlvbihub2RlLG9iail7b2JqLmxhbmd1YWdlcz1bXTt0aGlz LnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqLmxhbmd1YWdlcyk7fSwiRGVmYXVsdCI6 ZnVuY3Rpb24obm9kZSxsYW5ndWFnZXMpe3ZhciBsYW5ndWFnZT17aXNEZWZhdWx0 OnRydWV9O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxsYW5ndWFnZSk7bGFuZ3Vh Z2VzLnB1c2gobGFuZ3VhZ2UpO30sIlN1cHBvcnRlZCI6ZnVuY3Rpb24obm9kZSxs YW5ndWFnZXMpe3ZhciBsYW5ndWFnZT17fTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5v ZGUsbGFuZ3VhZ2UpO2xhbmd1YWdlcy5wdXNoKGxhbmd1YWdlKTt9fSwib3dzIjpP cGVuTGF5ZXJzLkZvcm1hdC5PV1NDb21tb24udjFfMV8wLnByb3RvdHlwZS5yZWFk ZXJzWyJvd3MiXX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3JtYXQuV1BTQ2Fw YWJpbGl0aWVzLnYxXzBfMCJ9KTtPcGVuTGF5ZXJzLkNvbnRyb2wuUGluY2hab29t PU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Db250cm9sLHt0eXBlOk9wZW5M YXllcnMuQ29udHJvbC5UWVBFX1RPT0wsY29udGFpbmVyT3JpZ2luOm51bGwscGlu Y2hPcmlnaW46bnVsbCxjdXJyZW50Q2VudGVyOm51bGwsYXV0b0FjdGl2YXRlOnRy dWUsaW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXtPcGVuTGF5ZXJzLkNvbnRy b2wucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Ro aXMuaGFuZGxlcj1uZXcgT3BlbkxheWVycy5IYW5kbGVyLlBpbmNoKHRoaXMse3N0 YXJ0OnRoaXMucGluY2hTdGFydCxtb3ZlOnRoaXMucGluY2hNb3ZlLGRvbmU6dGhp cy5waW5jaERvbmV9LHRoaXMuaGFuZGxlck9wdGlvbnMpO30sYWN0aXZhdGU6ZnVu Y3Rpb24oKXt2YXIgYWN0aXZhdGVkPU9wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5 cGUuYWN0aXZhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKGFjdGl2YXRlZCl7 dGhpcy5tYXAuZXZlbnRzLm9uKHttb3ZlZW5kOnRoaXMudXBkYXRlQ29udGFpbmVy T3JpZ2luLHNjb3BlOnRoaXN9KTt0aGlzLnVwZGF0ZUNvbnRhaW5lck9yaWdpbigp O30KcmV0dXJuIGFjdGl2YXRlZDt9LGRlYWN0aXZhdGU6ZnVuY3Rpb24oKXt2YXIg ZGVhY3RpdmF0ZWQ9T3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5kZWFjdGl2 YXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZih0aGlzLm1hcCYmdGhpcy5tYXAu ZXZlbnRzKXt0aGlzLm1hcC5ldmVudHMudW4oe21vdmVlbmQ6dGhpcy51cGRhdGVD b250YWluZXJPcmlnaW4sc2NvcGU6dGhpc30pO30KcmV0dXJuIGRlYWN0aXZhdGVk O30sdXBkYXRlQ29udGFpbmVyT3JpZ2luOmZ1bmN0aW9uKCl7dmFyIGNvbnRhaW5l cj10aGlzLm1hcC5sYXllckNvbnRhaW5lckRpdjt0aGlzLmNvbnRhaW5lck9yaWdp bj17eDpwYXJzZUludChjb250YWluZXIuc3R5bGUubGVmdCwxMCkseTpwYXJzZUlu dChjb250YWluZXIuc3R5bGUudG9wLDEwKX07fSxwaW5jaFN0YXJ0OmZ1bmN0aW9u KGV2dCxwaW5jaERhdGEpe3RoaXMucGluY2hPcmlnaW49ZXZ0Lnh5O3RoaXMuY3Vy cmVudENlbnRlcj1ldnQueHk7fSxwaW5jaE1vdmU6ZnVuY3Rpb24oZXZ0LHBpbmNo RGF0YSl7dmFyIHNjYWxlPXBpbmNoRGF0YS5zY2FsZTt2YXIgY29udGFpbmVyT3Jp Z2luPXRoaXMuY29udGFpbmVyT3JpZ2luO3ZhciBwaW5jaE9yaWdpbj10aGlzLnBp bmNoT3JpZ2luO3ZhciBjdXJyZW50PWV2dC54eTt2YXIgZHg9TWF0aC5yb3VuZCgo Y3VycmVudC54LXBpbmNoT3JpZ2luLngpKyhzY2FsZS0xKSooY29udGFpbmVyT3Jp Z2luLngtcGluY2hPcmlnaW4ueCkpO3ZhciBkeT1NYXRoLnJvdW5kKChjdXJyZW50 LnktcGluY2hPcmlnaW4ueSkrKHNjYWxlLTEpKihjb250YWluZXJPcmlnaW4ueS1w aW5jaE9yaWdpbi55KSk7dGhpcy5hcHBseVRyYW5zZm9ybSgidHJhbnNsYXRlKCIr ZHgrInB4LCAiK2R5KyJweCkgc2NhbGUoIitzY2FsZSsiKSIpO3RoaXMuY3VycmVu dENlbnRlcj1jdXJyZW50O30sYXBwbHlUcmFuc2Zvcm06ZnVuY3Rpb24odHJhbnNm b3JtKXt2YXIgc3R5bGU9dGhpcy5tYXAubGF5ZXJDb250YWluZXJEaXYuc3R5bGU7 c3R5bGVbJy13ZWJraXQtdHJhbnNmb3JtJ109dHJhbnNmb3JtO3N0eWxlWyctbW96 LXRyYW5zZm9ybSddPXRyYW5zZm9ybTt9LHBpbmNoRG9uZTpmdW5jdGlvbihldnQs c3RhcnQsbGFzdCl7dGhpcy5hcHBseVRyYW5zZm9ybSgiIik7dmFyIHpvb209dGhp cy5tYXAuZ2V0Wm9vbUZvclJlc29sdXRpb24odGhpcy5tYXAuZ2V0UmVzb2x1dGlv bigpL2xhc3Quc2NhbGUsdHJ1ZSk7aWYoem9vbSE9PXRoaXMubWFwLmdldFpvb20o KXx8IXRoaXMuY3VycmVudENlbnRlci5lcXVhbHModGhpcy5waW5jaE9yaWdpbikp e3ZhciByZXNvbHV0aW9uPXRoaXMubWFwLmdldFJlc29sdXRpb25Gb3Jab29tKHpv b20pO3ZhciBsb2NhdGlvbj10aGlzLm1hcC5nZXRMb25MYXRGcm9tUGl4ZWwodGhp cy5waW5jaE9yaWdpbik7dmFyIHpvb21QaXhlbD10aGlzLmN1cnJlbnRDZW50ZXI7 dmFyIHNpemU9dGhpcy5tYXAuZ2V0U2l6ZSgpO2xvY2F0aW9uLmxvbis9cmVzb2x1 dGlvbiooKHNpemUudy8yKS16b29tUGl4ZWwueCk7bG9jYXRpb24ubGF0LT1yZXNv bHV0aW9uKigoc2l6ZS5oLzIpLXpvb21QaXhlbC55KTt0aGlzLm1hcC5zZXRDZW50 ZXIobG9jYXRpb24sem9vbSk7fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Db250 cm9sLlBpbmNoWm9vbSJ9KTtPcGVuTGF5ZXJzLkNvbnRyb2wuVG91Y2hOYXZpZ2F0 aW9uPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Db250cm9sLHtkcmFnUGFu Om51bGwsZHJhZ1Bhbk9wdGlvbnM6bnVsbCxwaW5jaFpvb206bnVsbCxwaW5jaFpv b21PcHRpb25zOm51bGwsY2xpY2tIYW5kbGVyT3B0aW9uczpudWxsLGRvY3VtZW50 RHJhZzpmYWxzZSxhdXRvQWN0aXZhdGU6dHJ1ZSxpbml0aWFsaXplOmZ1bmN0aW9u KG9wdGlvbnMpe3RoaXMuaGFuZGxlcnM9e307T3BlbkxheWVycy5Db250cm9sLnBy b3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LGRlc3Ry b3k6ZnVuY3Rpb24oKXt0aGlzLmRlYWN0aXZhdGUoKTtpZih0aGlzLmRyYWdQYW4p e3RoaXMuZHJhZ1Bhbi5kZXN0cm95KCk7fQp0aGlzLmRyYWdQYW49bnVsbDtpZih0 aGlzLnBpbmNoWm9vbSl7dGhpcy5waW5jaFpvb20uZGVzdHJveSgpO2RlbGV0ZSB0 aGlzLnBpbmNoWm9vbTt9Ck9wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUuZGVz dHJveS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fSxhY3RpdmF0ZTpmdW5jdGlvbigp e2lmKE9wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUuYWN0aXZhdGUuYXBwbHko dGhpcyxhcmd1bWVudHMpKXt0aGlzLmRyYWdQYW4uYWN0aXZhdGUoKTt0aGlzLmhh bmRsZXJzLmNsaWNrLmFjdGl2YXRlKCk7dGhpcy5waW5jaFpvb20uYWN0aXZhdGUo KTtyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9LGRlYWN0aXZhdGU6ZnVuY3Rp b24oKXtpZihPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90eXBlLmRlYWN0aXZhdGUu YXBwbHkodGhpcyxhcmd1bWVudHMpKXt0aGlzLmRyYWdQYW4uZGVhY3RpdmF0ZSgp O3RoaXMuaGFuZGxlcnMuY2xpY2suZGVhY3RpdmF0ZSgpO3RoaXMucGluY2hab29t LmRlYWN0aXZhdGUoKTtyZXR1cm4gdHJ1ZTt9CnJldHVybiBmYWxzZTt9LGRyYXc6 ZnVuY3Rpb24oKXt2YXIgY2xpY2tDYWxsYmFja3M9e2NsaWNrOnRoaXMuZGVmYXVs dENsaWNrLGRibGNsaWNrOnRoaXMuZGVmYXVsdERibENsaWNrfTt2YXIgY2xpY2tP cHRpb25zPU9wZW5MYXllcnMuVXRpbC5leHRlbmQoeyJkb3VibGUiOnRydWUsc3Rv cERvdWJsZTp0cnVlLHBpeGVsVG9sZXJhbmNlOjJ9LHRoaXMuY2xpY2tIYW5kbGVy T3B0aW9ucyk7dGhpcy5oYW5kbGVycy5jbGljaz1uZXcgT3BlbkxheWVycy5IYW5k bGVyLkNsaWNrKHRoaXMsY2xpY2tDYWxsYmFja3MsY2xpY2tPcHRpb25zKTt0aGlz LmRyYWdQYW49bmV3IE9wZW5MYXllcnMuQ29udHJvbC5EcmFnUGFuKE9wZW5MYXll cnMuVXRpbC5leHRlbmQoe21hcDp0aGlzLm1hcCxkb2N1bWVudERyYWc6dGhpcy5k b2N1bWVudERyYWd9LHRoaXMuZHJhZ1Bhbk9wdGlvbnMpKTt0aGlzLmRyYWdQYW4u ZHJhdygpO3RoaXMucGluY2hab29tPW5ldyBPcGVuTGF5ZXJzLkNvbnRyb2wuUGlu Y2hab29tKE9wZW5MYXllcnMuVXRpbC5leHRlbmQoe21hcDp0aGlzLm1hcH0sdGhp cy5waW5jaFpvb21PcHRpb25zKSk7fSxkZWZhdWx0Q2xpY2s6ZnVuY3Rpb24oZXZ0 KXtpZihldnQubGFzdFRvdWNoZXMmJmV2dC5sYXN0VG91Y2hlcy5sZW5ndGg9PTIp e3RoaXMubWFwLnpvb21PdXQoKTt9fSxkZWZhdWx0RGJsQ2xpY2s6ZnVuY3Rpb24o ZXZ0KXt2YXIgbmV3Q2VudGVyPXRoaXMubWFwLmdldExvbkxhdEZyb21WaWV3UG9y dFB4KGV2dC54eSk7dGhpcy5tYXAuc2V0Q2VudGVyKG5ld0NlbnRlcix0aGlzLm1h cC56b29tKzEpO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Db250cm9sLlRvdWNo TmF2aWdhdGlvbiJ9KTtPcGVuTGF5ZXJzLlN0eWxlMj1PcGVuTGF5ZXJzLkNsYXNz KHtpZDpudWxsLG5hbWU6bnVsbCx0aXRsZTpudWxsLGRlc2NyaXB0aW9uOm51bGws bGF5ZXJOYW1lOm51bGwsaXNEZWZhdWx0OmZhbHNlLHJ1bGVzOm51bGwsaW5pdGlh bGl6ZTpmdW5jdGlvbihjb25maWcpe09wZW5MYXllcnMuVXRpbC5leHRlbmQodGhp cyxjb25maWcpO3RoaXMuaWQ9T3BlbkxheWVycy5VdGlsLmNyZWF0ZVVuaXF1ZUlE KHRoaXMuQ0xBU1NfTkFNRSsiXyIpO30sZGVzdHJveTpmdW5jdGlvbigpe2Zvcih2 YXIgaT0wLGxlbj10aGlzLnJ1bGVzLmxlbmd0aDtpPGxlbjtpKyspe3RoaXMucnVs ZXNbaV0uZGVzdHJveSgpO30KZGVsZXRlIHRoaXMucnVsZXM7fSxjbG9uZTpmdW5j dGlvbigpe3ZhciBjb25maWc9T3BlbkxheWVycy5VdGlsLmV4dGVuZCh7fSx0aGlz KTtpZih0aGlzLnJ1bGVzKXtjb25maWcucnVsZXM9W107Zm9yKHZhciBpPTAsbGVu PXRoaXMucnVsZXMubGVuZ3RoO2k8bGVuOysraSl7Y29uZmlnLnJ1bGVzLnB1c2go dGhpcy5ydWxlc1tpXS5jbG9uZSgpKTt9fQpyZXR1cm4gbmV3IE9wZW5MYXllcnMu U3R5bGUyKGNvbmZpZyk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLlN0eWxlMiJ9 KTtPcGVuTGF5ZXJzLkxheWVyLkJveGVzPU9wZW5MYXllcnMuQ2xhc3MoT3Blbkxh eWVycy5MYXllci5NYXJrZXJzLHtpbml0aWFsaXplOmZ1bmN0aW9uKG5hbWUsb3B0 aW9ucyl7T3BlbkxheWVycy5MYXllci5NYXJrZXJzLnByb3RvdHlwZS5pbml0aWFs aXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LGRyYXdNYXJrZXI6ZnVuY3Rpb24o bWFya2VyKXt2YXIgYm91bmRzPW1hcmtlci5ib3VuZHM7dmFyIHRvcGxlZnQ9dGhp cy5tYXAuZ2V0TGF5ZXJQeEZyb21Mb25MYXQobmV3IE9wZW5MYXllcnMuTG9uTGF0 KGJvdW5kcy5sZWZ0LGJvdW5kcy50b3ApKTt2YXIgYm90cmlnaHQ9dGhpcy5tYXAu Z2V0TGF5ZXJQeEZyb21Mb25MYXQobmV3IE9wZW5MYXllcnMuTG9uTGF0KGJvdW5k cy5yaWdodCxib3VuZHMuYm90dG9tKSk7aWYoYm90cmlnaHQ9PW51bGx8fHRvcGxl ZnQ9PW51bGwpe21hcmtlci5kaXNwbGF5KGZhbHNlKTt9ZWxzZXt2YXIgc3o9bmV3 IE9wZW5MYXllcnMuU2l6ZShNYXRoLm1heCgxLGJvdHJpZ2h0LngtdG9wbGVmdC54 KSxNYXRoLm1heCgxLGJvdHJpZ2h0LnktdG9wbGVmdC55KSk7dmFyIG1hcmtlckRp dj1tYXJrZXIuZHJhdyh0b3BsZWZ0LHN6KTtpZighbWFya2VyLmRyYXduKXt0aGlz LmRpdi5hcHBlbmRDaGlsZChtYXJrZXJEaXYpO21hcmtlci5kcmF3bj10cnVlO319 fSxyZW1vdmVNYXJrZXI6ZnVuY3Rpb24obWFya2VyKXtPcGVuTGF5ZXJzLlV0aWwu cmVtb3ZlSXRlbSh0aGlzLm1hcmtlcnMsbWFya2VyKTtpZigobWFya2VyLmRpdiE9 bnVsbCkmJihtYXJrZXIuZGl2LnBhcmVudE5vZGU9PXRoaXMuZGl2KSl7dGhpcy5k aXYucmVtb3ZlQ2hpbGQobWFya2VyLmRpdik7fX0sQ0xBU1NfTkFNRToiT3Blbkxh eWVycy5MYXllci5Cb3hlcyJ9KTtPcGVuTGF5ZXJzLkZvcm1hdC5XRlNDYXBhYmls aXRpZXMudjFfMF8wPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Gb3JtYXQu V0ZTQ2FwYWJpbGl0aWVzLnYxLHtpbml0aWFsaXplOmZ1bmN0aW9uKG9wdGlvbnMp e09wZW5MYXllcnMuRm9ybWF0LldGU0NhcGFiaWxpdGllcy52MS5wcm90b3R5cGUu aW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7fSxyZWFkX2NhcF9TZXJ2 aWNlOmZ1bmN0aW9uKGNhcGFiaWxpdGllcyxub2RlKXt2YXIgc2VydmljZT17fTt0 aGlzLnJ1bkNoaWxkTm9kZXMoc2VydmljZSxub2RlKTtjYXBhYmlsaXRpZXMuc2Vy dmljZT1zZXJ2aWNlO30scmVhZF9jYXBfRmVlczpmdW5jdGlvbihzZXJ2aWNlLG5v ZGUpe3ZhciBmZWVzPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTtpZihmZWVzJiZm ZWVzLnRvTG93ZXJDYXNlKCkhPSJub25lIil7c2VydmljZS5mZWVzPWZlZXM7fX0s cmVhZF9jYXBfQWNjZXNzQ29uc3RyYWludHM6ZnVuY3Rpb24oc2VydmljZSxub2Rl KXt2YXIgY29uc3RyYWludHM9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO2lmKGNv bnN0cmFpbnRzJiZjb25zdHJhaW50cy50b0xvd2VyQ2FzZSgpIT0ibm9uZSIpe3Nl cnZpY2UuYWNjZXNzQ29uc3RyYWludHM9Y29uc3RyYWludHM7fX0scmVhZF9jYXBf T25saW5lUmVzb3VyY2U6ZnVuY3Rpb24oc2VydmljZSxub2RlKXt2YXIgb25saW5l UmVzb3VyY2U9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO2lmKG9ubGluZVJlc291 cmNlJiZvbmxpbmVSZXNvdXJjZS50b0xvd2VyQ2FzZSgpIT0ibm9uZSIpe3NlcnZp Y2Uub25saW5lUmVzb3VyY2U9b25saW5lUmVzb3VyY2U7fX0scmVhZF9jYXBfS2V5 d29yZHM6ZnVuY3Rpb24oc2VydmljZSxub2RlKXt2YXIga2V5d29yZHM9dGhpcy5n ZXRDaGlsZFZhbHVlKG5vZGUpO2lmKGtleXdvcmRzJiZrZXl3b3Jkcy50b0xvd2Vy Q2FzZSgpIT0ibm9uZSIpe3NlcnZpY2Uua2V5d29yZHM9a2V5d29yZHMuc3BsaXQo JywgJyk7fX0scmVhZF9jYXBfQ2FwYWJpbGl0eTpmdW5jdGlvbihjYXBhYmlsaXRp ZXMsbm9kZSl7dmFyIGNhcGFiaWxpdHk9e307dGhpcy5ydW5DaGlsZE5vZGVzKGNh cGFiaWxpdHksbm9kZSk7Y2FwYWJpbGl0aWVzLmNhcGFiaWxpdHk9Y2FwYWJpbGl0 eTt9LHJlYWRfY2FwX1JlcXVlc3Q6ZnVuY3Rpb24ob2JqLG5vZGUpe3ZhciByZXF1 ZXN0PXt9O3RoaXMucnVuQ2hpbGROb2RlcyhyZXF1ZXN0LG5vZGUpO29iai5yZXF1 ZXN0PXJlcXVlc3Q7fSxyZWFkX2NhcF9HZXRGZWF0dXJlOmZ1bmN0aW9uKHJlcXVl c3Qsbm9kZSl7dmFyIGdldGZlYXR1cmU9e2hyZWY6e30sZm9ybWF0czpbXX07dGhp cy5ydW5DaGlsZE5vZGVzKGdldGZlYXR1cmUsbm9kZSk7cmVxdWVzdC5nZXRmZWF0 dXJlPWdldGZlYXR1cmU7fSxyZWFkX2NhcF9SZXN1bHRGb3JtYXQ6ZnVuY3Rpb24o b2JqLG5vZGUpe3ZhciBjaGlsZHJlbj1ub2RlLmNoaWxkTm9kZXM7dmFyIGNoaWxk Tm9kZTtmb3IodmFyIGk9MDtpPGNoaWxkcmVuLmxlbmd0aDtpKyspe2NoaWxkTm9k ZT1jaGlsZHJlbltpXTtpZihjaGlsZE5vZGUubm9kZVR5cGU9PTEpe29iai5mb3Jt YXRzLnB1c2goY2hpbGROb2RlLm5vZGVOYW1lKTt9fX0scmVhZF9jYXBfRENQVHlw ZTpmdW5jdGlvbihvYmosbm9kZSl7dGhpcy5ydW5DaGlsZE5vZGVzKG9iaixub2Rl KTt9LHJlYWRfY2FwX0hUVFA6ZnVuY3Rpb24ob2JqLG5vZGUpe3RoaXMucnVuQ2hp bGROb2RlcyhvYmouaHJlZixub2RlKTt9LHJlYWRfY2FwX0dldDpmdW5jdGlvbihv Ymosbm9kZSl7b2JqLmdldD1ub2RlLmdldEF0dHJpYnV0ZSgib25saW5lUmVzb3Vy Y2UiKTt9LHJlYWRfY2FwX1Bvc3Q6ZnVuY3Rpb24ob2JqLG5vZGUpe29iai5wb3N0 PW5vZGUuZ2V0QXR0cmlidXRlKCJvbmxpbmVSZXNvdXJjZSIpO30scmVhZF9jYXBf U1JTOmZ1bmN0aW9uKG9iaixub2RlKXt2YXIgc3JzPXRoaXMuZ2V0Q2hpbGRWYWx1 ZShub2RlKTtpZihzcnMpe29iai5zcnM9c3JzO319LENMQVNTX05BTUU6Ik9wZW5M YXllcnMuRm9ybWF0LldGU0NhcGFiaWxpdGllcy52MV8wXzAifSk7T3BlbkxheWVy cy5Gb3JtYXQuV01TQ2FwYWJpbGl0aWVzPU9wZW5MYXllcnMuQ2xhc3MoT3Blbkxh eWVycy5Gb3JtYXQuWE1MLlZlcnNpb25lZE9HQyx7ZGVmYXVsdFZlcnNpb246IjEu MS4xIixwcm9maWxlOm51bGwsQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3JtYXQu V01TQ2FwYWJpbGl0aWVzIn0pO09wZW5MYXllcnMuRm9ybWF0LldNU0NhcGFiaWxp dGllcy52MT1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0LlhNTCx7 bmFtZXNwYWNlczp7d21zOiJodHRwOi8vd3d3Lm9wZW5naXMubmV0L3dtcyIseGxp bms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhzaToiaHR0cDovL3d3 dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UifSxkZWZhdWx0UHJlZml4 OiJ3bXMiLGluaXRpYWxpemU6ZnVuY3Rpb24ob3B0aW9ucyl7T3BlbkxheWVycy5G b3JtYXQuWE1MLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW29wdGlv bnNdKTt9LHJlYWQ6ZnVuY3Rpb24oZGF0YSl7aWYodHlwZW9mIGRhdGE9PSJzdHJp bmciKXtkYXRhPU9wZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5cGUucmVhZC5h cHBseSh0aGlzLFtkYXRhXSk7fQp2YXIgcmF3PWRhdGE7aWYoZGF0YSYmZGF0YS5u b2RlVHlwZT09OSl7ZGF0YT1kYXRhLmRvY3VtZW50RWxlbWVudDt9CnZhciBjYXBh YmlsaXRpZXM9e307dGhpcy5yZWFkTm9kZShkYXRhLGNhcGFiaWxpdGllcyk7aWYo Y2FwYWJpbGl0aWVzLnNlcnZpY2U9PT11bmRlZmluZWQpe3ZhciBwYXJzZXI9bmV3 IE9wZW5MYXllcnMuRm9ybWF0Lk9HQ0V4Y2VwdGlvblJlcG9ydCgpO2NhcGFiaWxp dGllcy5lcnJvcj1wYXJzZXIucmVhZChyYXcpO31lbHNle3RoaXMucG9zdFByb2Nl c3NMYXllcnMoY2FwYWJpbGl0aWVzKTt9CnJldHVybiBjYXBhYmlsaXRpZXM7fSxw b3N0UHJvY2Vzc0xheWVyczpmdW5jdGlvbihjYXBhYmlsaXRpZXMpe2lmKGNhcGFi aWxpdGllcy5jYXBhYmlsaXR5KXtjYXBhYmlsaXRpZXMuY2FwYWJpbGl0eS5sYXll cnM9W107dmFyIGxheWVycz1jYXBhYmlsaXRpZXMuY2FwYWJpbGl0eS5uZXN0ZWRM YXllcnM7Zm9yKHZhciBpPTAsbGVuPWxheWVycy5sZW5ndGg7aTxsZW47KytpKXt2 YXIgbGF5ZXI9bGF5ZXJzW2ldO3RoaXMucHJvY2Vzc0xheWVyKGNhcGFiaWxpdGll cy5jYXBhYmlsaXR5LGxheWVyKTt9fX0scHJvY2Vzc0xheWVyOmZ1bmN0aW9uKGNh cGFiaWxpdHksbGF5ZXIscGFyZW50TGF5ZXIpe2lmKGxheWVyLmZvcm1hdHM9PT11 bmRlZmluZWQpe2xheWVyLmZvcm1hdHM9Y2FwYWJpbGl0eS5yZXF1ZXN0LmdldG1h cC5mb3JtYXRzO30KdmFyIGksbGVuO2lmKHBhcmVudExheWVyKXtsYXllci5zdHls ZXM9bGF5ZXIuc3R5bGVzLmNvbmNhdChwYXJlbnRMYXllci5zdHlsZXMpO3ZhciBh dHRyaWJ1dGVzPVsicXVlcnlhYmxlIiwiY2FzY2FkZWQiLCJmaXhlZFdpZHRoIiwi Zml4ZWRIZWlnaHQiLCJvcGFxdWUiLCJub1N1YnNldHMiLCJsbGJib3giLCJtaW5T Y2FsZSIsIm1heFNjYWxlIiwiYXR0cmlidXRpb24iXTt2YXIgY29tcGxleEF0dHI9 WyJzcnMiLCJiYm94IiwiZGltZW5zaW9ucyIsImF1dGhvcml0eVVSTHMiXTt2YXIg a2V5O2ZvcihpPTAsbGVuPWF0dHJpYnV0ZXMubGVuZ3RoO2k8bGVuO2krKyl7a2V5 PWF0dHJpYnV0ZXNbaV07aWYoa2V5IGluIHBhcmVudExheWVyKXtpZihsYXllcltr ZXldPT1udWxsKXtsYXllcltrZXldPXBhcmVudExheWVyW2tleV07fQppZihsYXll cltrZXldPT1udWxsKXt2YXIgaW50QXR0cj1bImNhc2NhZGVkIiwiZml4ZWRXaWR0 aCIsImZpeGVkSGVpZ2h0Il07dmFyIGJvb2xBdHRyPVsicXVlcnlhYmxlIiwib3Bh cXVlIiwibm9TdWJzZXRzIl07aWYoT3BlbkxheWVycy5VdGlsLmluZGV4T2YoaW50 QXR0cixrZXkpIT0tMSl7bGF5ZXJba2V5XT0wO30KaWYoT3BlbkxheWVycy5VdGls LmluZGV4T2YoYm9vbEF0dHIsa2V5KSE9LTEpe2xheWVyW2tleV09ZmFsc2U7fX19 fQpmb3IoaT0wLGxlbj1jb21wbGV4QXR0ci5sZW5ndGg7aTxsZW47aSsrKXtrZXk9 Y29tcGxleEF0dHJbaV07bGF5ZXJba2V5XT1PcGVuTGF5ZXJzLlV0aWwuYXBwbHlE ZWZhdWx0cyhsYXllcltrZXldLHBhcmVudExheWVyW2tleV0pO319CmZvcihpPTAs bGVuPWxheWVyLm5lc3RlZExheWVycy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgY2hp bGRMYXllcj1sYXllci5uZXN0ZWRMYXllcnNbaV07dGhpcy5wcm9jZXNzTGF5ZXIo Y2FwYWJpbGl0eSxjaGlsZExheWVyLGxheWVyKTt9CmlmKGxheWVyLm5hbWUpe2Nh cGFiaWxpdHkubGF5ZXJzLnB1c2gobGF5ZXIpO319LHJlYWRlcnM6eyJ3bXMiOnsi U2VydmljZSI6ZnVuY3Rpb24obm9kZSxvYmope29iai5zZXJ2aWNlPXt9O3RoaXMu cmVhZENoaWxkTm9kZXMobm9kZSxvYmouc2VydmljZSk7fSwiTmFtZSI6ZnVuY3Rp b24obm9kZSxvYmope29iai5uYW1lPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTt9 LCJUaXRsZSI6ZnVuY3Rpb24obm9kZSxvYmope29iai50aXRsZT10aGlzLmdldENo aWxkVmFsdWUobm9kZSk7fSwiQWJzdHJhY3QiOmZ1bmN0aW9uKG5vZGUsb2JqKXtv YmpbImFic3RyYWN0Il09dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO30sIkJvdW5k aW5nQm94IjpmdW5jdGlvbihub2RlLG9iail7dmFyIGJib3g9e307YmJveC5iYm94 PVtwYXJzZUZsb2F0KG5vZGUuZ2V0QXR0cmlidXRlKCJtaW54IikpLHBhcnNlRmxv YXQobm9kZS5nZXRBdHRyaWJ1dGUoIm1pbnkiKSkscGFyc2VGbG9hdChub2RlLmdl dEF0dHJpYnV0ZSgibWF4eCIpKSxwYXJzZUZsb2F0KG5vZGUuZ2V0QXR0cmlidXRl KCJtYXh5IikpXTt2YXIgcmVzPXt4OnBhcnNlRmxvYXQobm9kZS5nZXRBdHRyaWJ1 dGUoInJlc3giKSkseTpwYXJzZUZsb2F0KG5vZGUuZ2V0QXR0cmlidXRlKCJyZXN5 IikpfTtpZighKGlzTmFOKHJlcy54KSYmaXNOYU4ocmVzLnkpKSl7YmJveC5yZXM9 cmVzO30KcmV0dXJuIGJib3g7fSwiT25saW5lUmVzb3VyY2UiOmZ1bmN0aW9uKG5v ZGUsb2JqKXtvYmouaHJlZj10aGlzLmdldEF0dHJpYnV0ZU5TKG5vZGUsdGhpcy5u YW1lc3BhY2VzLnhsaW5rLCJocmVmIik7fSwiQ29udGFjdEluZm9ybWF0aW9uIjpm dW5jdGlvbihub2RlLG9iail7b2JqLmNvbnRhY3RJbmZvcm1hdGlvbj17fTt0aGlz LnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqLmNvbnRhY3RJbmZvcm1hdGlvbik7fSwi Q29udGFjdFBlcnNvblByaW1hcnkiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmoucGVy c29uUHJpbWFyeT17fTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqLnBlcnNv blByaW1hcnkpO30sIkNvbnRhY3RQZXJzb24iOmZ1bmN0aW9uKG5vZGUsb2JqKXtv YmoucGVyc29uPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTt9LCJDb250YWN0T3Jn YW5pemF0aW9uIjpmdW5jdGlvbihub2RlLG9iail7b2JqLm9yZ2FuaXphdGlvbj10 aGlzLmdldENoaWxkVmFsdWUobm9kZSk7fSwiQ29udGFjdFBvc2l0aW9uIjpmdW5j dGlvbihub2RlLG9iail7b2JqLnBvc2l0aW9uPXRoaXMuZ2V0Q2hpbGRWYWx1ZShu b2RlKTt9LCJDb250YWN0QWRkcmVzcyI6ZnVuY3Rpb24obm9kZSxvYmope29iai5j b250YWN0QWRkcmVzcz17fTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqLmNv bnRhY3RBZGRyZXNzKTt9LCJBZGRyZXNzVHlwZSI6ZnVuY3Rpb24obm9kZSxvYmop e29iai50eXBlPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTt9LCJBZGRyZXNzIjpm dW5jdGlvbihub2RlLG9iail7b2JqLmFkZHJlc3M9dGhpcy5nZXRDaGlsZFZhbHVl KG5vZGUpO30sIkNpdHkiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmouY2l0eT10aGlz LmdldENoaWxkVmFsdWUobm9kZSk7fSwiU3RhdGVPclByb3ZpbmNlIjpmdW5jdGlv bihub2RlLG9iail7b2JqLnN0YXRlT3JQcm92aW5jZT10aGlzLmdldENoaWxkVmFs dWUobm9kZSk7fSwiUG9zdENvZGUiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmoucG9z dGNvZGU9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO30sIkNvdW50cnkiOmZ1bmN0 aW9uKG5vZGUsb2JqKXtvYmouY291bnRyeT10aGlzLmdldENoaWxkVmFsdWUobm9k ZSk7fSwiQ29udGFjdFZvaWNlVGVsZXBob25lIjpmdW5jdGlvbihub2RlLG9iail7 b2JqLnBob25lPXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTt9LCJDb250YWN0RmFj c2ltaWxlVGVsZXBob25lIjpmdW5jdGlvbihub2RlLG9iail7b2JqLmZheD10aGlz LmdldENoaWxkVmFsdWUobm9kZSk7fSwiQ29udGFjdEVsZWN0cm9uaWNNYWlsQWRk cmVzcyI6ZnVuY3Rpb24obm9kZSxvYmope29iai5lbWFpbD10aGlzLmdldENoaWxk VmFsdWUobm9kZSk7fSwiRmVlcyI6ZnVuY3Rpb24obm9kZSxvYmope3ZhciBmZWVz PXRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTtpZihmZWVzJiZmZWVzLnRvTG93ZXJD YXNlKCkhPSJub25lIil7b2JqLmZlZXM9ZmVlczt9fSwiQWNjZXNzQ29uc3RyYWlu dHMiOmZ1bmN0aW9uKG5vZGUsb2JqKXt2YXIgY29uc3RyYWludHM9dGhpcy5nZXRD aGlsZFZhbHVlKG5vZGUpO2lmKGNvbnN0cmFpbnRzJiZjb25zdHJhaW50cy50b0xv d2VyQ2FzZSgpIT0ibm9uZSIpe29iai5hY2Nlc3NDb25zdHJhaW50cz1jb25zdHJh aW50czt9fSwiQ2FwYWJpbGl0eSI6ZnVuY3Rpb24obm9kZSxvYmope29iai5jYXBh YmlsaXR5PXtuZXN0ZWRMYXllcnM6W119O3RoaXMucmVhZENoaWxkTm9kZXMobm9k ZSxvYmouY2FwYWJpbGl0eSk7fSwiUmVxdWVzdCI6ZnVuY3Rpb24obm9kZSxvYmop e29iai5yZXF1ZXN0PXt9O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxvYmoucmVx dWVzdCk7fSwiR2V0Q2FwYWJpbGl0aWVzIjpmdW5jdGlvbihub2RlLG9iail7b2Jq LmdldGNhcGFiaWxpdGllcz17Zm9ybWF0czpbXX07dGhpcy5yZWFkQ2hpbGROb2Rl cyhub2RlLG9iai5nZXRjYXBhYmlsaXRpZXMpO30sIkZvcm1hdCI6ZnVuY3Rpb24o bm9kZSxvYmope2lmKE9wZW5MYXllcnMuVXRpbC5pc0FycmF5KG9iai5mb3JtYXRz KSl7b2JqLmZvcm1hdHMucHVzaCh0aGlzLmdldENoaWxkVmFsdWUobm9kZSkpO31l bHNle29iai5mb3JtYXQ9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO319LCJEQ1BU eXBlIjpmdW5jdGlvbihub2RlLG9iail7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2Rl LG9iaik7fSwiSFRUUCI6ZnVuY3Rpb24obm9kZSxvYmope3RoaXMucmVhZENoaWxk Tm9kZXMobm9kZSxvYmopO30sIkdldCI6ZnVuY3Rpb24obm9kZSxvYmope29iai5n ZXQ9e307dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iai5nZXQpO2lmKCFvYmou aHJlZil7b2JqLmhyZWY9b2JqLmdldC5ocmVmO319LCJQb3N0IjpmdW5jdGlvbihu b2RlLG9iail7b2JqLnBvc3Q9e307dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9i ai5wb3N0KTtpZighb2JqLmhyZWYpe29iai5ocmVmPW9iai5nZXQuaHJlZjt9fSwi R2V0TWFwIjpmdW5jdGlvbihub2RlLG9iail7b2JqLmdldG1hcD17Zm9ybWF0czpb XX07dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iai5nZXRtYXApO30sIkdldEZl YXR1cmVJbmZvIjpmdW5jdGlvbihub2RlLG9iail7b2JqLmdldGZlYXR1cmVpbmZv PXtmb3JtYXRzOltdfTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqLmdldGZl YXR1cmVpbmZvKTt9LCJFeGNlcHRpb24iOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmou ZXhjZXB0aW9uPXtmb3JtYXRzOltdfTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUs b2JqLmV4Y2VwdGlvbik7fSwiTGF5ZXIiOmZ1bmN0aW9uKG5vZGUsb2JqKXt2YXIg YXR0ck5vZGU9bm9kZS5nZXRBdHRyaWJ1dGVOb2RlKCJxdWVyeWFibGUiKTt2YXIg cXVlcnlhYmxlPShhdHRyTm9kZSYmYXR0ck5vZGUuc3BlY2lmaWVkKT9ub2RlLmdl dEF0dHJpYnV0ZSgicXVlcnlhYmxlIik6bnVsbDthdHRyTm9kZT1ub2RlLmdldEF0 dHJpYnV0ZU5vZGUoImNhc2NhZGVkIik7dmFyIGNhc2NhZGVkPShhdHRyTm9kZSYm YXR0ck5vZGUuc3BlY2lmaWVkKT9ub2RlLmdldEF0dHJpYnV0ZSgiY2FzY2FkZWQi KTpudWxsO2F0dHJOb2RlPW5vZGUuZ2V0QXR0cmlidXRlTm9kZSgib3BhcXVlIik7 dmFyIG9wYXF1ZT0oYXR0ck5vZGUmJmF0dHJOb2RlLnNwZWNpZmllZCk/bm9kZS5n ZXRBdHRyaWJ1dGUoJ29wYXF1ZScpOm51bGw7dmFyIG5vU3Vic2V0cz1ub2RlLmdl dEF0dHJpYnV0ZSgnbm9TdWJzZXRzJyk7dmFyIGZpeGVkV2lkdGg9bm9kZS5nZXRB dHRyaWJ1dGUoJ2ZpeGVkV2lkdGgnKTt2YXIgZml4ZWRIZWlnaHQ9bm9kZS5nZXRB dHRyaWJ1dGUoJ2ZpeGVkSGVpZ2h0Jyk7dmFyIGxheWVyPXtuZXN0ZWRMYXllcnM6 W10sc3R5bGVzOltdLHNyczp7fSxtZXRhZGF0YVVSTHM6W10sYmJveDp7fSxkaW1l bnNpb25zOnt9LGF1dGhvcml0eVVSTHM6e30saWRlbnRpZmllcnM6e30sa2V5d29y ZHM6W10scXVlcnlhYmxlOihxdWVyeWFibGUmJnF1ZXJ5YWJsZSE9PSIiKT8ocXVl cnlhYmxlPT09IjEifHxxdWVyeWFibGU9PT0idHJ1ZSIpOm51bGwsY2FzY2FkZWQ6 KGNhc2NhZGVkIT09bnVsbCk/cGFyc2VJbnQoY2FzY2FkZWQpOm51bGwsb3BhcXVl Om9wYXF1ZT8ob3BhcXVlPT09IjEifHxvcGFxdWU9PT0idHJ1ZSIpOm51bGwsbm9T dWJzZXRzOihub1N1YnNldHMhPT1udWxsKT8obm9TdWJzZXRzPT09IjEifHxub1N1 YnNldHM9PT0idHJ1ZSIpOm51bGwsZml4ZWRXaWR0aDooZml4ZWRXaWR0aCE9bnVs bCk/cGFyc2VJbnQoZml4ZWRXaWR0aCk6bnVsbCxmaXhlZEhlaWdodDooZml4ZWRI ZWlnaHQhPW51bGwpP3BhcnNlSW50KGZpeGVkSGVpZ2h0KTpudWxsfTtvYmoubmVz dGVkTGF5ZXJzLnB1c2gobGF5ZXIpO3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxs YXllcik7aWYobGF5ZXIubmFtZSl7dmFyIHBhcnRzPWxheWVyLm5hbWUuc3BsaXQo IjoiKTtpZihwYXJ0cy5sZW5ndGg+MCl7bGF5ZXIucHJlZml4PXBhcnRzWzBdO319 fSwiQXR0cmlidXRpb24iOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmouYXR0cmlidXRp b249e307dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLG9iai5hdHRyaWJ1dGlvbik7 fSwiTG9nb1VSTCI6ZnVuY3Rpb24obm9kZSxvYmope29iai5sb2dvPXt3aWR0aDpu b2RlLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6bm9kZS5nZXRBdHRyaWJ1 dGUoImhlaWdodCIpfTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqLmxvZ28p O30sIlN0eWxlIjpmdW5jdGlvbihub2RlLG9iail7dmFyIHN0eWxlPXt9O29iai5z dHlsZXMucHVzaChzdHlsZSk7dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2RlLHN0eWxl KTt9LCJMZWdlbmRVUkwiOmZ1bmN0aW9uKG5vZGUsb2JqKXt2YXIgbGVnZW5kPXt3 aWR0aDpub2RlLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6bm9kZS5nZXRB dHRyaWJ1dGUoImhlaWdodCIpfTtvYmoubGVnZW5kPWxlZ2VuZDt0aGlzLnJlYWRD aGlsZE5vZGVzKG5vZGUsbGVnZW5kKTt9LCJNZXRhZGF0YVVSTCI6ZnVuY3Rpb24o bm9kZSxvYmope3ZhciBtZXRhZGF0YVVSTD17dHlwZTpub2RlLmdldEF0dHJpYnV0 ZSgidHlwZSIpfTtvYmoubWV0YWRhdGFVUkxzLnB1c2gobWV0YWRhdGFVUkwpO3Ro aXMucmVhZENoaWxkTm9kZXMobm9kZSxtZXRhZGF0YVVSTCk7fSwiRGF0YVVSTCI6 ZnVuY3Rpb24obm9kZSxvYmope29iai5kYXRhVVJMPXt9O3RoaXMucmVhZENoaWxk Tm9kZXMobm9kZSxvYmouZGF0YVVSTCk7fSwiRmVhdHVyZUxpc3RVUkwiOmZ1bmN0 aW9uKG5vZGUsb2JqKXtvYmouZmVhdHVyZUxpc3RVUkw9e307dGhpcy5yZWFkQ2hp bGROb2Rlcyhub2RlLG9iai5mZWF0dXJlTGlzdFVSTCk7fSwiQXV0aG9yaXR5VVJM IjpmdW5jdGlvbihub2RlLG9iail7dmFyIG5hbWU9bm9kZS5nZXRBdHRyaWJ1dGUo Im5hbWUiKTt2YXIgYXV0aG9yaXR5PXt9O3RoaXMucmVhZENoaWxkTm9kZXMobm9k ZSxhdXRob3JpdHkpO29iai5hdXRob3JpdHlVUkxzW25hbWVdPWF1dGhvcml0eS5o cmVmO30sIklkZW50aWZpZXIiOmZ1bmN0aW9uKG5vZGUsb2JqKXt2YXIgYXV0aG9y aXR5PW5vZGUuZ2V0QXR0cmlidXRlKCJhdXRob3JpdHkiKTtvYmouaWRlbnRpZmll cnNbYXV0aG9yaXR5XT10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7fSwiS2V5d29y ZExpc3QiOmZ1bmN0aW9uKG5vZGUsb2JqKXt0aGlzLnJlYWRDaGlsZE5vZGVzKG5v ZGUsb2JqKTt9LCJTUlMiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmouc3JzW3RoaXMu Z2V0Q2hpbGRWYWx1ZShub2RlKV09dHJ1ZTt9fX0sQ0xBU1NfTkFNRToiT3Blbkxh eWVycy5Gb3JtYXQuV01TQ2FwYWJpbGl0aWVzLnYxIn0pO09wZW5MYXllcnMuRm9y bWF0LldNU0NhcGFiaWxpdGllcy52MV8zPU9wZW5MYXllcnMuQ2xhc3MoT3Blbkxh eWVycy5Gb3JtYXQuV01TQ2FwYWJpbGl0aWVzLnYxLHtyZWFkZXJzOnsid21zIjpP cGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyh7IldNU19DYXBhYmlsaXRpZXMi OmZ1bmN0aW9uKG5vZGUsb2JqKXt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2Jq KTt9LCJMYXllckxpbWl0IjpmdW5jdGlvbihub2RlLG9iail7b2JqLmxheWVyTGlt aXQ9cGFyc2VJbnQodGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpKTt9LCJNYXhXaWR0 aCI6ZnVuY3Rpb24obm9kZSxvYmope29iai5tYXhXaWR0aD1wYXJzZUludCh0aGlz LmdldENoaWxkVmFsdWUobm9kZSkpO30sIk1heEhlaWdodCI6ZnVuY3Rpb24obm9k ZSxvYmope29iai5tYXhIZWlnaHQ9cGFyc2VJbnQodGhpcy5nZXRDaGlsZFZhbHVl KG5vZGUpKTt9LCJCb3VuZGluZ0JveCI6ZnVuY3Rpb24obm9kZSxvYmope3ZhciBi Ym94PU9wZW5MYXllcnMuRm9ybWF0LldNU0NhcGFiaWxpdGllcy52MS5wcm90b3R5 cGUucmVhZGVyc1sid21zIl0uQm91bmRpbmdCb3guYXBwbHkodGhpcyxbbm9kZSxv YmpdKTtiYm94LnNycz1ub2RlLmdldEF0dHJpYnV0ZSgiQ1JTIik7b2JqLmJib3hb YmJveC5zcnNdPWJib3g7fSwiQ1JTIjpmdW5jdGlvbihub2RlLG9iail7dGhpcy5y ZWFkZXJzLndtcy5TUlMuYXBwbHkodGhpcyxbbm9kZSxvYmpdKTt9LCJFWF9HZW9n cmFwaGljQm91bmRpbmdCb3giOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmoubGxiYm94 PVtdO3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxvYmoubGxiYm94KTt9LCJ3ZXN0 Qm91bmRMb25naXR1ZGUiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmpbMF09dGhpcy5n ZXRDaGlsZFZhbHVlKG5vZGUpO30sImVhc3RCb3VuZExvbmdpdHVkZSI6ZnVuY3Rp b24obm9kZSxvYmope29ialsyXT10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7fSwi c291dGhCb3VuZExhdGl0dWRlIjpmdW5jdGlvbihub2RlLG9iail7b2JqWzFdPXRo aXMuZ2V0Q2hpbGRWYWx1ZShub2RlKTt9LCJub3J0aEJvdW5kTGF0aXR1ZGUiOmZ1 bmN0aW9uKG5vZGUsb2JqKXtvYmpbM109dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUp O30sIk1pblNjYWxlRGVub21pbmF0b3IiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmou bWF4U2NhbGU9cGFyc2VGbG9hdCh0aGlzLmdldENoaWxkVmFsdWUobm9kZSkpLnRv UHJlY2lzaW9uKDE2KTt9LCJNYXhTY2FsZURlbm9taW5hdG9yIjpmdW5jdGlvbihu b2RlLG9iail7b2JqLm1pblNjYWxlPXBhcnNlRmxvYXQodGhpcy5nZXRDaGlsZFZh bHVlKG5vZGUpKS50b1ByZWNpc2lvbigxNik7fSwiRGltZW5zaW9uIjpmdW5jdGlv bihub2RlLG9iail7dmFyIG5hbWU9bm9kZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKS50 b0xvd2VyQ2FzZSgpO3ZhciBkaW09e25hbWU6bmFtZSx1bml0czpub2RlLmdldEF0 dHJpYnV0ZSgidW5pdHMiKSx1bml0c3ltYm9sOm5vZGUuZ2V0QXR0cmlidXRlKCJ1 bml0U3ltYm9sIiksbmVhcmVzdFZhbDpub2RlLmdldEF0dHJpYnV0ZSgibmVhcmVz dFZhbHVlIik9PT0iMSIsbXVsdGlwbGVWYWw6bm9kZS5nZXRBdHRyaWJ1dGUoIm11 bHRpcGxlVmFsdWVzIik9PT0iMSIsImRlZmF1bHQiOm5vZGUuZ2V0QXR0cmlidXRl KCJkZWZhdWx0Iil8fCIiLGN1cnJlbnQ6bm9kZS5nZXRBdHRyaWJ1dGUoImN1cnJl bnQiKT09PSIxIix2YWx1ZXM6dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpLnNwbGl0 KCIsIil9O29iai5kaW1lbnNpb25zW2RpbS5uYW1lXT1kaW07fSwiS2V5d29yZCI6 ZnVuY3Rpb24obm9kZSxvYmope3ZhciBrZXl3b3JkPXt2YWx1ZTp0aGlzLmdldENo aWxkVmFsdWUobm9kZSksdm9jYWJ1bGFyeTpub2RlLmdldEF0dHJpYnV0ZSgidm9j YWJ1bGFyeSIpfTtpZihvYmoua2V5d29yZHMpe29iai5rZXl3b3Jkcy5wdXNoKGtl eXdvcmQpO319fSxPcGVuTGF5ZXJzLkZvcm1hdC5XTVNDYXBhYmlsaXRpZXMudjEu cHJvdG90eXBlLnJlYWRlcnNbIndtcyJdKSwic2xkIjp7IlVzZXJEZWZpbmVkU3lt Ym9saXphdGlvbiI6ZnVuY3Rpb24obm9kZSxvYmope3RoaXMucmVhZGVycy53bXMu VXNlckRlZmluZWRTeW1ib2xpemF0aW9uLmFwcGx5KHRoaXMsW25vZGUsb2JqXSk7 b2JqLnVzZXJTeW1ib2xzLmlubGluZUZlYXR1cmU9cGFyc2VJbnQobm9kZS5nZXRB dHRyaWJ1dGUoIklubGluZUZlYXR1cmUiKSk9PTE7b2JqLnVzZXJTeW1ib2xzLnJl bW90ZVdDUz1wYXJzZUludChub2RlLmdldEF0dHJpYnV0ZSgiUmVtb3RlV0NTIikp PT0xO30sIkRlc2NyaWJlTGF5ZXIiOmZ1bmN0aW9uKG5vZGUsb2JqKXt0aGlzLnJl YWRlcnMud21zLkRlc2NyaWJlTGF5ZXIuYXBwbHkodGhpcyxbbm9kZSxvYmpdKTt9 LCJHZXRMZWdlbmRHcmFwaGljIjpmdW5jdGlvbihub2RlLG9iail7dGhpcy5yZWFk ZXJzLndtcy5HZXRMZWdlbmRHcmFwaGljLmFwcGx5KHRoaXMsW25vZGUsb2JqXSk7 fX19LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0LldNU0NhcGFiaWxpdGll cy52MV8zIn0pO09wZW5MYXllcnMuTGF5ZXIuWWFob289T3BlbkxheWVycy5DbGFz cyhPcGVuTGF5ZXJzLkxheWVyLkV2ZW50UGFuZSxPcGVuTGF5ZXJzLkxheWVyLkZp eGVkWm9vbUxldmVscyx7TUlOX1pPT01fTEVWRUw6MCxNQVhfWk9PTV9MRVZFTDox NyxSRVNPTFVUSU9OUzpbMS40MDYyNSwwLjcwMzEyNSwwLjM1MTU2MjUsMC4xNzU3 ODEyNSwwLjA4Nzg5MDYyNSwwLjA0Mzk0NTMxMjUsMC4wMjE5NzI2NTYyNSwwLjAx MDk4NjMyODEyNSwwLjAwNTQ5MzE2NDA2MjUsMC4wMDI3NDY1ODIwMzEyNSwwLjAw MTM3MzI5MTAxNTYyNSwwLjAwMDY4NjY0NTUwNzgxMjUsMC4wMDAzNDMzMjI3NTM5 MDYyNSwwLjAwMDE3MTY2MTM3Njk1MzEyNSwwLjAwMDA4NTgzMDY4ODQ3NjU2MjUs MC4wMDAwNDI5MTUzNDQyMzgyODEyNSwwLjAwMDAyMTQ1NzY3MjExOTE0MDYyLDAu MDAwMDEwNzI4ODM2MDU5NTcwMzFdLHR5cGU6bnVsbCx3cmFwRGF0ZUxpbmU6dHJ1 ZSxzcGhlcmljYWxNZXJjYXRvcjpmYWxzZSxpbml0aWFsaXplOmZ1bmN0aW9uKG5h bWUsb3B0aW9ucyl7T3BlbkxheWVycy5MYXllci5FdmVudFBhbmUucHJvdG90eXBl LmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO09wZW5MYXllcnMuTGF5 ZXIuRml4ZWRab29tTGV2ZWxzLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRo aXMsYXJndW1lbnRzKTtpZih0aGlzLnNwaGVyaWNhbE1lcmNhdG9yKXtPcGVuTGF5 ZXJzLlV0aWwuZXh0ZW5kKHRoaXMsT3BlbkxheWVycy5MYXllci5TcGhlcmljYWxN ZXJjYXRvcik7dGhpcy5pbml0TWVyY2F0b3JQYXJhbWV0ZXJzKCk7fX0sbG9hZE1h cE9iamVjdDpmdW5jdGlvbigpe3RyeXt2YXIgc2l6ZT10aGlzLmdldE1hcE9iamVj dFNpemVGcm9tT0xTaXplKHRoaXMubWFwLmdldFNpemUoKSk7dGhpcy5tYXBPYmpl Y3Q9bmV3IFlNYXAodGhpcy5kaXYsdGhpcy50eXBlLHNpemUpO3RoaXMubWFwT2Jq ZWN0LmRpc2FibGVLZXlDb250cm9scygpO3RoaXMubWFwT2JqZWN0LmRpc2FibGVE cmFnTWFwKCk7aWYoIXRoaXMubWFwT2JqZWN0Lm1vdmVCeVhZfHwodHlwZW9mIHRo aXMubWFwT2JqZWN0Lm1vdmVCeVhZIT0iZnVuY3Rpb24iKSl7dGhpcy5kcmFnUGFu TWFwT2JqZWN0PW51bGw7fX1jYXRjaChlKXt9fSxvbk1hcFJlc2l6ZTpmdW5jdGlv bigpe3RyeXt2YXIgc2l6ZT10aGlzLmdldE1hcE9iamVjdFNpemVGcm9tT0xTaXpl KHRoaXMubWFwLmdldFNpemUoKSk7dGhpcy5tYXBPYmplY3QucmVzaXplVG8oc2l6 ZSk7fWNhdGNoKGUpe319LHNldE1hcDpmdW5jdGlvbihtYXApe09wZW5MYXllcnMu TGF5ZXIuRXZlbnRQYW5lLnByb3RvdHlwZS5zZXRNYXAuYXBwbHkodGhpcyxhcmd1 bWVudHMpO3RoaXMubWFwLmV2ZW50cy5yZWdpc3RlcigibW92ZWVuZCIsdGhpcyx0 aGlzLmZpeFlhaG9vRXZlbnRQYW5lKTt9LGZpeFlhaG9vRXZlbnRQYW5lOmZ1bmN0 aW9uKCl7dmFyIHlhaG9vRXZlbnRQYW5lPU9wZW5MYXllcnMuVXRpbC5nZXRFbGVt ZW50KCJ5Z2RkZmRpdiIpO2lmKHlhaG9vRXZlbnRQYW5lIT1udWxsKXtpZih5YWhv b0V2ZW50UGFuZS5wYXJlbnROb2RlIT1udWxsKXt5YWhvb0V2ZW50UGFuZS5wYXJl bnROb2RlLnJlbW92ZUNoaWxkKHlhaG9vRXZlbnRQYW5lKTt9CnRoaXMubWFwLmV2 ZW50cy51bnJlZ2lzdGVyKCJtb3ZlZW5kIix0aGlzLHRoaXMuZml4WWFob29FdmVu dFBhbmUpO319LGdldFdhcm5pbmdIVE1MOmZ1bmN0aW9uKCl7cmV0dXJuIE9wZW5M YXllcnMuaTE4bigiZ2V0TGF5ZXJXYXJuaW5nIix7J2xheWVyVHlwZSc6J1lhaG9v JywnbGF5ZXJMaWInOidZYWhvbyd9KTt9LGdldE9MWm9vbUZyb21NYXBPYmplY3Ra b29tOmZ1bmN0aW9uKG1vWm9vbSl7dmFyIHpvb209bnVsbDtpZihtb1pvb20hPW51 bGwpe3pvb209T3BlbkxheWVycy5MYXllci5GaXhlZFpvb21MZXZlbHMucHJvdG90 eXBlLmdldE9MWm9vbUZyb21NYXBPYmplY3Rab29tLmFwcGx5KHRoaXMsW21vWm9v bV0pO3pvb209MTgtem9vbTt9CnJldHVybiB6b29tO30sZ2V0TWFwT2JqZWN0Wm9v bUZyb21PTFpvb206ZnVuY3Rpb24ob2xab29tKXt2YXIgem9vbT1udWxsO2lmKG9s Wm9vbSE9bnVsbCl7em9vbT1PcGVuTGF5ZXJzLkxheWVyLkZpeGVkWm9vbUxldmVs cy5wcm90b3R5cGUuZ2V0TWFwT2JqZWN0Wm9vbUZyb21PTFpvb20uYXBwbHkodGhp cyxbb2xab29tXSk7em9vbT0xOC16b29tO30KcmV0dXJuIHpvb207fSxzZXRNYXBP YmplY3RDZW50ZXI6ZnVuY3Rpb24oY2VudGVyLHpvb20pe3RoaXMubWFwT2JqZWN0 LmRyYXdab29tQW5kQ2VudGVyKGNlbnRlcix6b29tKTt9LGdldE1hcE9iamVjdENl bnRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcE9iamVjdC5nZXRDZW50ZXJM YXRMb24oKTt9LGRyYWdQYW5NYXBPYmplY3Q6ZnVuY3Rpb24oZFgsZFkpe3RoaXMu bWFwT2JqZWN0Lm1vdmVCeVhZKHsneCc6LWRYLCd5JzpkWX0pO30sZ2V0TWFwT2Jq ZWN0Wm9vbTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcE9iamVjdC5nZXRab29t TGV2ZWwoKTt9LGdldE1hcE9iamVjdExvbkxhdEZyb21NYXBPYmplY3RQaXhlbDpm dW5jdGlvbihtb1BpeGVsKXtyZXR1cm4gdGhpcy5tYXBPYmplY3QuY29udmVydFhZ TGF0TG9uKG1vUGl4ZWwpO30sZ2V0TWFwT2JqZWN0UGl4ZWxGcm9tTWFwT2JqZWN0 TG9uTGF0OmZ1bmN0aW9uKG1vTG9uTGF0KXtyZXR1cm4gdGhpcy5tYXBPYmplY3Qu Y29udmVydExhdExvblhZKG1vTG9uTGF0KTt9LGdldExvbmdpdHVkZUZyb21NYXBP YmplY3RMb25MYXQ6ZnVuY3Rpb24obW9Mb25MYXQpe3JldHVybiB0aGlzLnNwaGVy aWNhbE1lcmNhdG9yP3RoaXMuZm9yd2FyZE1lcmNhdG9yKG1vTG9uTGF0Lkxvbixt b0xvbkxhdC5MYXQpLmxvbjptb0xvbkxhdC5Mb247fSxnZXRMYXRpdHVkZUZyb21N YXBPYmplY3RMb25MYXQ6ZnVuY3Rpb24obW9Mb25MYXQpe3JldHVybiB0aGlzLnNw aGVyaWNhbE1lcmNhdG9yP3RoaXMuZm9yd2FyZE1lcmNhdG9yKG1vTG9uTGF0Lkxv bixtb0xvbkxhdC5MYXQpLmxhdDptb0xvbkxhdC5MYXQ7fSxnZXRNYXBPYmplY3RM b25MYXRGcm9tTG9uTGF0OmZ1bmN0aW9uKGxvbixsYXQpe3ZhciB5TGF0TG9uZztp Zih0aGlzLnNwaGVyaWNhbE1lcmNhdG9yKXt2YXIgbG9ubGF0PXRoaXMuaW52ZXJz ZU1lcmNhdG9yKGxvbixsYXQpO3lMYXRMb25nPW5ldyBZR2VvUG9pbnQobG9ubGF0 LmxhdCxsb25sYXQubG9uKTt9ZWxzZXt5TGF0TG9uZz1uZXcgWUdlb1BvaW50KGxh dCxsb24pO30KcmV0dXJuIHlMYXRMb25nO30sZ2V0WEZyb21NYXBPYmplY3RQaXhl bDpmdW5jdGlvbihtb1BpeGVsKXtyZXR1cm4gbW9QaXhlbC54O30sZ2V0WUZyb21N YXBPYmplY3RQaXhlbDpmdW5jdGlvbihtb1BpeGVsKXtyZXR1cm4gbW9QaXhlbC55 O30sZ2V0TWFwT2JqZWN0UGl4ZWxGcm9tWFk6ZnVuY3Rpb24oeCx5KXtyZXR1cm4g bmV3IFlDb29yZFBvaW50KHgseSk7fSxnZXRNYXBPYmplY3RTaXplRnJvbU9MU2l6 ZTpmdW5jdGlvbihvbFNpemUpe3JldHVybiBuZXcgWVNpemUob2xTaXplLncsb2xT aXplLmgpO30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5MYXllci5ZYWhvbyJ9KTtP cGVuTGF5ZXJzLkxheWVyLlpvb21pZnk9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5 ZXJzLkxheWVyLkdyaWQse3VybDpudWxsLHNpemU6bnVsbCxpc0Jhc2VMYXllcjp0 cnVlLHN0YW5kYXJkVGlsZVNpemU6MjU2LHRpbGVPcmlnaW5Db3JuZXI6InRsIixu dW1iZXJPZlRpZXJzOjAsdGlsZUNvdW50VXBUb1RpZXI6bmV3IEFycmF5KCksdGll clNpemVJblRpbGVzOm5ldyBBcnJheSgpLHRpZXJJbWFnZVNpemU6bmV3IEFycmF5 KCksaW5pdGlhbGl6ZTpmdW5jdGlvbihuYW1lLHVybCxzaXplLG9wdGlvbnMpe3Ro aXMuaW5pdGlhbGl6ZVpvb21pZnkoc2l6ZSk7dmFyIG5ld0FyZ3VtZW50cz1bXTtu ZXdBcmd1bWVudHMucHVzaChuYW1lLHVybCxzaXplLHt9LG9wdGlvbnMpO09wZW5M YXllcnMuTGF5ZXIuR3JpZC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlz LG5ld0FyZ3VtZW50cyk7fSxpbml0aWFsaXplWm9vbWlmeTpmdW5jdGlvbihzaXpl KXt2YXIgaW1hZ2VTaXplPXNpemUuY2xvbmUoKTt2YXIgdGlsZXM9bmV3IE9wZW5M YXllcnMuU2l6ZShNYXRoLmNlaWwoaW1hZ2VTaXplLncvdGhpcy5zdGFuZGFyZFRp bGVTaXplKSxNYXRoLmNlaWwoaW1hZ2VTaXplLmgvdGhpcy5zdGFuZGFyZFRpbGVT aXplKSk7dGhpcy50aWVyU2l6ZUluVGlsZXMucHVzaCh0aWxlcyk7dGhpcy50aWVy SW1hZ2VTaXplLnB1c2goaW1hZ2VTaXplKTt3aGlsZShpbWFnZVNpemUudz50aGlz LnN0YW5kYXJkVGlsZVNpemV8fGltYWdlU2l6ZS5oPnRoaXMuc3RhbmRhcmRUaWxl U2l6ZSl7aW1hZ2VTaXplPW5ldyBPcGVuTGF5ZXJzLlNpemUoTWF0aC5mbG9vcihp bWFnZVNpemUudy8yKSxNYXRoLmZsb29yKGltYWdlU2l6ZS5oLzIpKTt0aWxlcz1u ZXcgT3BlbkxheWVycy5TaXplKE1hdGguY2VpbChpbWFnZVNpemUudy90aGlzLnN0 YW5kYXJkVGlsZVNpemUpLE1hdGguY2VpbChpbWFnZVNpemUuaC90aGlzLnN0YW5k YXJkVGlsZVNpemUpKTt0aGlzLnRpZXJTaXplSW5UaWxlcy5wdXNoKHRpbGVzKTt0 aGlzLnRpZXJJbWFnZVNpemUucHVzaChpbWFnZVNpemUpO30KdGhpcy50aWVyU2l6 ZUluVGlsZXMucmV2ZXJzZSgpO3RoaXMudGllckltYWdlU2l6ZS5yZXZlcnNlKCk7 dGhpcy5udW1iZXJPZlRpZXJzPXRoaXMudGllclNpemVJblRpbGVzLmxlbmd0aDt0 aGlzLnRpbGVDb3VudFVwVG9UaWVyWzBdPTA7Zm9yKHZhciBpPTE7aTx0aGlzLm51 bWJlck9mVGllcnM7aSsrKXt0aGlzLnRpbGVDb3VudFVwVG9UaWVyLnB1c2godGhp cy50aWVyU2l6ZUluVGlsZXNbaS0xXS53KnRoaXMudGllclNpemVJblRpbGVzW2kt MV0uaCsKdGhpcy50aWxlQ291bnRVcFRvVGllcltpLTFdKTt9fSxkZXN0cm95OmZ1 bmN0aW9uKCl7T3BlbkxheWVycy5MYXllci5HcmlkLnByb3RvdHlwZS5kZXN0cm95 LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRpbGVDb3VudFVwVG9UaWVyLmxl bmd0aD0wO3RoaXMudGllclNpemVJblRpbGVzLmxlbmd0aD0wO3RoaXMudGllcklt YWdlU2l6ZS5sZW5ndGg9MDt9LGNsb25lOmZ1bmN0aW9uKG9iail7aWYob2JqPT1u dWxsKXtvYmo9bmV3IE9wZW5MYXllcnMuTGF5ZXIuWm9vbWlmeSh0aGlzLm5hbWUs dGhpcy51cmwsdGhpcy5zaXplLHRoaXMub3B0aW9ucyk7fQpvYmo9T3BlbkxheWVy cy5MYXllci5HcmlkLnByb3RvdHlwZS5jbG9uZS5hcHBseSh0aGlzLFtvYmpdKTty ZXR1cm4gb2JqO30sZ2V0VVJMOmZ1bmN0aW9uKGJvdW5kcyl7Ym91bmRzPXRoaXMu YWRqdXN0Qm91bmRzKGJvdW5kcyk7dmFyIHJlcz10aGlzLm1hcC5nZXRSZXNvbHV0 aW9uKCk7dmFyIHg9TWF0aC5yb3VuZCgoYm91bmRzLmxlZnQtdGhpcy50aWxlT3Jp Z2luLmxvbikvKHJlcyp0aGlzLnRpbGVTaXplLncpKTt2YXIgeT1NYXRoLnJvdW5k KCh0aGlzLnRpbGVPcmlnaW4ubGF0LWJvdW5kcy50b3ApLyhyZXMqdGhpcy50aWxl U2l6ZS5oKSk7dmFyIHo9dGhpcy5tYXAuZ2V0Wm9vbSgpO3ZhciB0aWxlSW5kZXg9 eCt5KnRoaXMudGllclNpemVJblRpbGVzW3pdLncrdGhpcy50aWxlQ291bnRVcFRv VGllclt6XTt2YXIgcGF0aD0iVGlsZUdyb3VwIitNYXRoLmZsb29yKCh0aWxlSW5k ZXgpLzI1NikrIi8iK3orIi0iK3grIi0iK3krIi5qcGciO3ZhciB1cmw9dGhpcy51 cmw7aWYoT3BlbkxheWVycy5VdGlsLmlzQXJyYXkodXJsKSl7dXJsPXRoaXMuc2Vs ZWN0VXJsKHBhdGgsdXJsKTt9CnJldHVybiB1cmwrcGF0aDt9LGdldEltYWdlU2l6 ZTpmdW5jdGlvbigpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MCl7dmFyIGJvdW5kcz10 aGlzLmFkanVzdEJvdW5kcyhhcmd1bWVudHNbMF0pO3ZhciByZXM9dGhpcy5tYXAu Z2V0UmVzb2x1dGlvbigpO3ZhciB4PU1hdGgucm91bmQoKGJvdW5kcy5sZWZ0LXRo aXMudGlsZU9yaWdpbi5sb24pLyhyZXMqdGhpcy50aWxlU2l6ZS53KSk7dmFyIHk9 TWF0aC5yb3VuZCgodGhpcy50aWxlT3JpZ2luLmxhdC1ib3VuZHMudG9wKS8ocmVz KnRoaXMudGlsZVNpemUuaCkpO3ZhciB6PXRoaXMubWFwLmdldFpvb20oKTt2YXIg dz10aGlzLnN0YW5kYXJkVGlsZVNpemU7dmFyIGg9dGhpcy5zdGFuZGFyZFRpbGVT aXplO2lmKHg9PXRoaXMudGllclNpemVJblRpbGVzW3pdLnctMSl7dmFyIHc9dGhp cy50aWVySW1hZ2VTaXplW3pdLncldGhpcy5zdGFuZGFyZFRpbGVTaXplO307aWYo eT09dGhpcy50aWVyU2l6ZUluVGlsZXNbel0uaC0xKXt2YXIgaD10aGlzLnRpZXJJ bWFnZVNpemVbel0uaCV0aGlzLnN0YW5kYXJkVGlsZVNpemU7fTtyZXR1cm4obmV3 IE9wZW5MYXllcnMuU2l6ZSh3LGgpKTt9ZWxzZXtyZXR1cm4gdGhpcy50aWxlU2l6 ZTt9fSxzZXRNYXA6ZnVuY3Rpb24obWFwKXtPcGVuTGF5ZXJzLkxheWVyLkdyaWQu cHJvdG90eXBlLnNldE1hcC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50aWxl T3JpZ2luPW5ldyBPcGVuTGF5ZXJzLkxvbkxhdCh0aGlzLm1hcC5tYXhFeHRlbnQu bGVmdCx0aGlzLm1hcC5tYXhFeHRlbnQudG9wKTt9LGNhbGN1bGF0ZUdyaWRMYXlv dXQ6ZnVuY3Rpb24oYm91bmRzLG9yaWdpbixyZXNvbHV0aW9uKXt2YXIgdGlsZWxv bj1yZXNvbHV0aW9uKnRoaXMudGlsZVNpemUudzt2YXIgdGlsZWxhdD1yZXNvbHV0 aW9uKnRoaXMudGlsZVNpemUuaDt2YXIgb2Zmc2V0bG9uPWJvdW5kcy5sZWZ0LW9y aWdpbi5sb247dmFyIHRpbGVjb2w9TWF0aC5mbG9vcihvZmZzZXRsb24vdGlsZWxv biktdGhpcy5idWZmZXI7dmFyIHRpbGVjb2xyZW1haW49b2Zmc2V0bG9uL3RpbGVs b24tdGlsZWNvbDt2YXIgdGlsZW9mZnNldHg9LXRpbGVjb2xyZW1haW4qdGhpcy50 aWxlU2l6ZS53O3ZhciB0aWxlb2Zmc2V0bG9uPW9yaWdpbi5sb24rdGlsZWNvbCp0 aWxlbG9uO3ZhciBvZmZzZXRsYXQ9b3JpZ2luLmxhdC1ib3VuZHMudG9wK3RpbGVs YXQ7dmFyIHRpbGVyb3c9TWF0aC5mbG9vcihvZmZzZXRsYXQvdGlsZWxhdCktdGhp cy5idWZmZXI7dmFyIHRpbGVyb3dyZW1haW49dGlsZXJvdy1vZmZzZXRsYXQvdGls ZWxhdDt2YXIgdGlsZW9mZnNldHk9dGlsZXJvd3JlbWFpbip0aGlzLnRpbGVTaXpl Lmg7dmFyIHRpbGVvZmZzZXRsYXQ9b3JpZ2luLmxhdC10aWxlbGF0KnRpbGVyb3c7 cmV0dXJue3RpbGVsb246dGlsZWxvbix0aWxlbGF0OnRpbGVsYXQsdGlsZW9mZnNl dGxvbjp0aWxlb2Zmc2V0bG9uLHRpbGVvZmZzZXRsYXQ6dGlsZW9mZnNldGxhdCx0 aWxlb2Zmc2V0eDp0aWxlb2Zmc2V0eCx0aWxlb2Zmc2V0eTp0aWxlb2Zmc2V0eX07 fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkxheWVyLlpvb21pZnkifSk7T3Blbkxh eWVycy5SZW5kZXJlci5WTUw9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLlJl bmRlcmVyLkVsZW1lbnRzLHt4bWxuczoidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNv bTp2bWwiLHN5bWJvbENhY2hlOnt9LG9mZnNldDpudWxsLGluaXRpYWxpemU6ZnVu Y3Rpb24oY29udGFpbmVySUQpe2lmKCF0aGlzLnN1cHBvcnRlZCgpKXtyZXR1cm47 fQppZighZG9jdW1lbnQubmFtZXNwYWNlcy5vbHYpe2RvY3VtZW50Lm5hbWVzcGFj ZXMuYWRkKCJvbHYiLHRoaXMueG1sbnMpO3ZhciBzdHlsZT1kb2N1bWVudC5jcmVh dGVTdHlsZVNoZWV0KCk7dmFyIHNoYXBlcz1bJ3NoYXBlJywncmVjdCcsJ292YWwn LCdmaWxsJywnc3Ryb2tlJywnaW1hZ2VkYXRhJywnZ3JvdXAnLCd0ZXh0Ym94J107 Zm9yKHZhciBpPTAsbGVuPXNoYXBlcy5sZW5ndGg7aTxsZW47aSsrKXtzdHlsZS5h ZGRSdWxlKCdvbHZcXDonK3NoYXBlc1tpXSwiYmVoYXZpb3I6IHVybCgjZGVmYXVs dCNWTUwpOyAiKyJwb3NpdGlvbjogYWJzb2x1dGU7IGRpc3BsYXk6IGlubGluZS1i bG9jazsiKTt9fQpPcGVuTGF5ZXJzLlJlbmRlcmVyLkVsZW1lbnRzLnByb3RvdHlw ZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LHN1cHBvcnRlZDpm dW5jdGlvbigpe3JldHVybiEhKGRvY3VtZW50Lm5hbWVzcGFjZXMpO30sc2V0RXh0 ZW50OmZ1bmN0aW9uKGV4dGVudCxyZXNvbHV0aW9uQ2hhbmdlZCl7T3BlbkxheWVy cy5SZW5kZXJlci5FbGVtZW50cy5wcm90b3R5cGUuc2V0RXh0ZW50LmFwcGx5KHRo aXMsYXJndW1lbnRzKTt2YXIgcmVzb2x1dGlvbj10aGlzLmdldFJlc29sdXRpb24o KTt2YXIgbGVmdD0oZXh0ZW50LmxlZnQvcmVzb2x1dGlvbil8MDt2YXIgdG9wPShl eHRlbnQudG9wL3Jlc29sdXRpb24tdGhpcy5zaXplLmgpfDA7aWYocmVzb2x1dGlv bkNoYW5nZWR8fCF0aGlzLm9mZnNldCl7dGhpcy5vZmZzZXQ9e3g6bGVmdCx5OnRv cH07bGVmdD0wO3RvcD0wO31lbHNle2xlZnQ9bGVmdC10aGlzLm9mZnNldC54O3Rv cD10b3AtdGhpcy5vZmZzZXQueTt9CnZhciBvcmc9bGVmdCsiICIrdG9wO3RoaXMu cm9vdC5jb29yZG9yaWdpbj1vcmc7dmFyIHJvb3RzPVt0aGlzLnJvb3QsdGhpcy52 ZWN0b3JSb290LHRoaXMudGV4dFJvb3RdO3ZhciByb290O2Zvcih2YXIgaT0wLGxl bj1yb290cy5sZW5ndGg7aTxsZW47KytpKXtyb290PXJvb3RzW2ldO3ZhciBzaXpl PXRoaXMuc2l6ZS53KyIgIit0aGlzLnNpemUuaDtyb290LmNvb3Jkc2l6ZT1zaXpl O30KdGhpcy5yb290LnN0eWxlLmZsaXA9InkiO3JldHVybiB0cnVlO30sc2V0U2l6 ZTpmdW5jdGlvbihzaXplKXtPcGVuTGF5ZXJzLlJlbmRlcmVyLnByb3RvdHlwZS5z ZXRTaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgcm9vdHM9W3RoaXMucmVu ZGVyZXJSb290LHRoaXMucm9vdCx0aGlzLnZlY3RvclJvb3QsdGhpcy50ZXh0Um9v dF07dmFyIHc9dGhpcy5zaXplLncrInB4Ijt2YXIgaD10aGlzLnNpemUuaCsicHgi O3ZhciByb290O2Zvcih2YXIgaT0wLGxlbj1yb290cy5sZW5ndGg7aTxsZW47Kytp KXtyb290PXJvb3RzW2ldO3Jvb3Quc3R5bGUud2lkdGg9dztyb290LnN0eWxlLmhl aWdodD1oO319LGdldE5vZGVUeXBlOmZ1bmN0aW9uKGdlb21ldHJ5LHN0eWxlKXt2 YXIgbm9kZVR5cGU9bnVsbDtzd2l0Y2goZ2VvbWV0cnkuQ0xBU1NfTkFNRSl7Y2Fz ZSJPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50IjppZihzdHlsZS5leHRlcm5hbEdy YXBoaWMpe25vZGVUeXBlPSJvbHY6cmVjdCI7fWVsc2UgaWYodGhpcy5pc0NvbXBs ZXhTeW1ib2woc3R5bGUuZ3JhcGhpY05hbWUpKXtub2RlVHlwZT0ib2x2OnNoYXBl Ijt9ZWxzZXtub2RlVHlwZT0ib2x2Om92YWwiO30KYnJlYWs7Y2FzZSJPcGVuTGF5 ZXJzLkdlb21ldHJ5LlJlY3RhbmdsZSI6bm9kZVR5cGU9Im9sdjpyZWN0IjticmVh aztjYXNlIk9wZW5MYXllcnMuR2VvbWV0cnkuTGluZVN0cmluZyI6Y2FzZSJPcGVu TGF5ZXJzLkdlb21ldHJ5LkxpbmVhclJpbmciOmNhc2UiT3BlbkxheWVycy5HZW9t ZXRyeS5Qb2x5Z29uIjpjYXNlIk9wZW5MYXllcnMuR2VvbWV0cnkuQ3VydmUiOmNh c2UiT3BlbkxheWVycy5HZW9tZXRyeS5TdXJmYWNlIjpub2RlVHlwZT0ib2x2OnNo YXBlIjticmVhaztkZWZhdWx0OmJyZWFrO30KcmV0dXJuIG5vZGVUeXBlO30sc2V0 U3R5bGU6ZnVuY3Rpb24obm9kZSxzdHlsZSxvcHRpb25zLGdlb21ldHJ5KXtzdHls ZT1zdHlsZXx8bm9kZS5fc3R5bGU7b3B0aW9ucz1vcHRpb25zfHxub2RlLl9vcHRp b25zO3ZhciBmaWxsQ29sb3I9c3R5bGUuZmlsbENvbG9yO2lmKG5vZGUuX2dlb21l dHJ5Q2xhc3M9PT0iT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCIpe2lmKHN0eWxl LmV4dGVybmFsR3JhcGhpYyl7b3B0aW9ucy5pc0ZpbGxlZD10cnVlO2lmKHN0eWxl LmdyYXBoaWNUaXRsZSl7bm9kZS50aXRsZT1zdHlsZS5ncmFwaGljVGl0bGU7fQp2 YXIgd2lkdGg9c3R5bGUuZ3JhcGhpY1dpZHRofHxzdHlsZS5ncmFwaGljSGVpZ2h0 O3ZhciBoZWlnaHQ9c3R5bGUuZ3JhcGhpY0hlaWdodHx8c3R5bGUuZ3JhcGhpY1dp ZHRoO3dpZHRoPXdpZHRoP3dpZHRoOnN0eWxlLnBvaW50UmFkaXVzKjI7aGVpZ2h0 PWhlaWdodD9oZWlnaHQ6c3R5bGUucG9pbnRSYWRpdXMqMjt2YXIgcmVzb2x1dGlv bj10aGlzLmdldFJlc29sdXRpb24oKTt2YXIgeE9mZnNldD0oc3R5bGUuZ3JhcGhp Y1hPZmZzZXQhPXVuZGVmaW5lZCk/c3R5bGUuZ3JhcGhpY1hPZmZzZXQ6LSgwLjUq d2lkdGgpO3ZhciB5T2Zmc2V0PShzdHlsZS5ncmFwaGljWU9mZnNldCE9dW5kZWZp bmVkKT9zdHlsZS5ncmFwaGljWU9mZnNldDotKDAuNSpoZWlnaHQpO25vZGUuc3R5 bGUubGVmdD0oKChnZW9tZXRyeS54L3Jlc29sdXRpb24tdGhpcy5vZmZzZXQueCkr eE9mZnNldCl8MCkrInB4Ijtub2RlLnN0eWxlLnRvcD0oKChnZW9tZXRyeS55L3Jl c29sdXRpb24tdGhpcy5vZmZzZXQueSktKHlPZmZzZXQraGVpZ2h0KSl8MCkrInB4 Ijtub2RlLnN0eWxlLndpZHRoPXdpZHRoKyJweCI7bm9kZS5zdHlsZS5oZWlnaHQ9 aGVpZ2h0KyJweCI7bm9kZS5zdHlsZS5mbGlwPSJ5IjtmaWxsQ29sb3I9Im5vbmUi O29wdGlvbnMuaXNTdHJva2VkPWZhbHNlO31lbHNlIGlmKHRoaXMuaXNDb21wbGV4 U3ltYm9sKHN0eWxlLmdyYXBoaWNOYW1lKSl7dmFyIGNhY2hlPXRoaXMuaW1wb3J0 U3ltYm9sKHN0eWxlLmdyYXBoaWNOYW1lKTtub2RlLnBhdGg9Y2FjaGUucGF0aDtu b2RlLmNvb3Jkb3JpZ2luPWNhY2hlLmxlZnQrIiwiK2NhY2hlLmJvdHRvbTt2YXIg c2l6ZT1jYWNoZS5zaXplO25vZGUuY29vcmRzaXplPXNpemUrIiwiK3NpemU7dGhp cy5kcmF3Q2lyY2xlKG5vZGUsZ2VvbWV0cnksc3R5bGUucG9pbnRSYWRpdXMpO25v ZGUuc3R5bGUuZmxpcD0ieSI7fWVsc2V7dGhpcy5kcmF3Q2lyY2xlKG5vZGUsZ2Vv bWV0cnksc3R5bGUucG9pbnRSYWRpdXMpO319CmlmKG9wdGlvbnMuaXNGaWxsZWQp e25vZGUuZmlsbGNvbG9yPWZpbGxDb2xvcjt9ZWxzZXtub2RlLmZpbGxlZD0iZmFs c2UiO30KdmFyIGZpbGxzPW5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZpbGwi KTt2YXIgZmlsbD0oZmlsbHMubGVuZ3RoPT0wKT9udWxsOmZpbGxzWzBdO2lmKCFv cHRpb25zLmlzRmlsbGVkKXtpZihmaWxsKXtub2RlLnJlbW92ZUNoaWxkKGZpbGwp O319ZWxzZXtpZighZmlsbCl7ZmlsbD10aGlzLmNyZWF0ZU5vZGUoJ29sdjpmaWxs Jyxub2RlLmlkKyJfZmlsbCIpO30KZmlsbC5vcGFjaXR5PXN0eWxlLmZpbGxPcGFj aXR5O2lmKG5vZGUuX2dlb21ldHJ5Q2xhc3M9PT0iT3BlbkxheWVycy5HZW9tZXRy eS5Qb2ludCImJnN0eWxlLmV4dGVybmFsR3JhcGhpYyl7aWYoc3R5bGUuZ3JhcGhp Y09wYWNpdHkpe2ZpbGwub3BhY2l0eT1zdHlsZS5ncmFwaGljT3BhY2l0eTt9CmZp bGwuc3JjPXN0eWxlLmV4dGVybmFsR3JhcGhpYztmaWxsLnR5cGU9ImZyYW1lIjtp ZighKHN0eWxlLmdyYXBoaWNXaWR0aCYmc3R5bGUuZ3JhcGhpY0hlaWdodCkpe2Zp bGwuYXNwZWN0PSJhdG1vc3QiO319CmlmKGZpbGwucGFyZW50Tm9kZSE9bm9kZSl7 bm9kZS5hcHBlbmRDaGlsZChmaWxsKTt9fQp2YXIgcm90YXRpb249c3R5bGUucm90 YXRpb247aWYoKHJvdGF0aW9uIT09dW5kZWZpbmVkfHxub2RlLl9yb3RhdGlvbiE9 PXVuZGVmaW5lZCkpe25vZGUuX3JvdGF0aW9uPXJvdGF0aW9uO2lmKHN0eWxlLmV4 dGVybmFsR3JhcGhpYyl7dGhpcy5ncmFwaGljUm90YXRlKG5vZGUseE9mZnNldCx5 T2Zmc2V0LHN0eWxlKTtmaWxsLm9wYWNpdHk9MDt9ZWxzZSBpZihub2RlLl9nZW9t ZXRyeUNsYXNzPT09Ik9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQiKXtub2RlLnN0 eWxlLnJvdGF0aW9uPXJvdGF0aW9ufHwwO319CnZhciBzdHJva2VzPW5vZGUuZ2V0 RWxlbWVudHNCeVRhZ05hbWUoInN0cm9rZSIpO3ZhciBzdHJva2U9KHN0cm9rZXMu bGVuZ3RoPT0wKT9udWxsOnN0cm9rZXNbMF07aWYoIW9wdGlvbnMuaXNTdHJva2Vk KXtub2RlLnN0cm9rZWQ9ZmFsc2U7aWYoc3Ryb2tlKXtzdHJva2Uub249ZmFsc2U7 fX1lbHNle2lmKCFzdHJva2Upe3N0cm9rZT10aGlzLmNyZWF0ZU5vZGUoJ29sdjpz dHJva2UnLG5vZGUuaWQrIl9zdHJva2UiKTtub2RlLmFwcGVuZENoaWxkKHN0cm9r ZSk7fQpzdHJva2Uub249dHJ1ZTtzdHJva2UuY29sb3I9c3R5bGUuc3Ryb2tlQ29s b3I7c3Ryb2tlLndlaWdodD1zdHlsZS5zdHJva2VXaWR0aCsicHgiO3N0cm9rZS5v cGFjaXR5PXN0eWxlLnN0cm9rZU9wYWNpdHk7c3Ryb2tlLmVuZGNhcD1zdHlsZS5z dHJva2VMaW5lY2FwPT0nYnV0dCc/J2ZsYXQnOihzdHlsZS5zdHJva2VMaW5lY2Fw fHwncm91bmQnKTtpZihzdHlsZS5zdHJva2VEYXNoc3R5bGUpe3N0cm9rZS5kYXNo c3R5bGU9dGhpcy5kYXNoU3R5bGUoc3R5bGUpO319CmlmKHN0eWxlLmN1cnNvciE9 ImluaGVyaXQiJiZzdHlsZS5jdXJzb3IhPW51bGwpe25vZGUuc3R5bGUuY3Vyc29y PXN0eWxlLmN1cnNvcjt9CnJldHVybiBub2RlO30sZ3JhcGhpY1JvdGF0ZTpmdW5j dGlvbihub2RlLHhPZmZzZXQseU9mZnNldCxzdHlsZSl7dmFyIHN0eWxlPXN0eWxl fHxub2RlLl9zdHlsZTt2YXIgcm90YXRpb249c3R5bGUucm90YXRpb258fDA7dmFy IGFzcGVjdFJhdGlvLHNpemU7aWYoIShzdHlsZS5ncmFwaGljV2lkdGgmJnN0eWxl LmdyYXBoaWNIZWlnaHQpKXt2YXIgaW1nPW5ldyBJbWFnZSgpO2ltZy5vbnJlYWR5 c3RhdGVjaGFuZ2U9T3BlbkxheWVycy5GdW5jdGlvbi5iaW5kKGZ1bmN0aW9uKCl7 aWYoaW1nLnJlYWR5U3RhdGU9PSJjb21wbGV0ZSJ8fGltZy5yZWFkeVN0YXRlPT0i aW50ZXJhY3RpdmUiKXthc3BlY3RSYXRpbz1pbWcud2lkdGgvaW1nLmhlaWdodDtz aXplPU1hdGgubWF4KHN0eWxlLnBvaW50UmFkaXVzKjIsc3R5bGUuZ3JhcGhpY1dp ZHRofHwwLHN0eWxlLmdyYXBoaWNIZWlnaHR8fDApO3hPZmZzZXQ9eE9mZnNldCph c3BlY3RSYXRpbztzdHlsZS5ncmFwaGljV2lkdGg9c2l6ZSphc3BlY3RSYXRpbztz dHlsZS5ncmFwaGljSGVpZ2h0PXNpemU7dGhpcy5ncmFwaGljUm90YXRlKG5vZGUs eE9mZnNldCx5T2Zmc2V0LHN0eWxlKTt9fSx0aGlzKTtpbWcuc3JjPXN0eWxlLmV4 dGVybmFsR3JhcGhpYztyZXR1cm47fWVsc2V7c2l6ZT1NYXRoLm1heChzdHlsZS5n cmFwaGljV2lkdGgsc3R5bGUuZ3JhcGhpY0hlaWdodCk7YXNwZWN0UmF0aW89c3R5 bGUuZ3JhcGhpY1dpZHRoL3N0eWxlLmdyYXBoaWNIZWlnaHQ7fQp2YXIgd2lkdGg9 TWF0aC5yb3VuZChzdHlsZS5ncmFwaGljV2lkdGh8fHNpemUqYXNwZWN0UmF0aW8p O3ZhciBoZWlnaHQ9TWF0aC5yb3VuZChzdHlsZS5ncmFwaGljSGVpZ2h0fHxzaXpl KTtub2RlLnN0eWxlLndpZHRoPXdpZHRoKyJweCI7bm9kZS5zdHlsZS5oZWlnaHQ9 aGVpZ2h0KyJweCI7dmFyIGltYWdlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG5v ZGUuaWQrIl9pbWFnZSIpO2lmKCFpbWFnZSl7aW1hZ2U9dGhpcy5jcmVhdGVOb2Rl KCJvbHY6aW1hZ2VkYXRhIixub2RlLmlkKyJfaW1hZ2UiKTtub2RlLmFwcGVuZENo aWxkKGltYWdlKTt9CmltYWdlLnN0eWxlLndpZHRoPXdpZHRoKyJweCI7aW1hZ2Uu c3R5bGUuaGVpZ2h0PWhlaWdodCsicHgiO2ltYWdlLnNyYz1zdHlsZS5leHRlcm5h bEdyYXBoaWM7aW1hZ2Uuc3R5bGUuZmlsdGVyPSJwcm9naWQ6RFhJbWFnZVRyYW5z Zm9ybS5NaWNyb3NvZnQuQWxwaGFJbWFnZUxvYWRlcigiKyJzcmM9JycsIHNpemlu Z01ldGhvZD0nc2NhbGUnKSI7dmFyIHJvdD1yb3RhdGlvbipNYXRoLlBJLzE4MDt2 YXIgc2ludGhldGE9TWF0aC5zaW4ocm90KTt2YXIgY29zdGhldGE9TWF0aC5jb3Mo cm90KTt2YXIgZmlsdGVyPSJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3Nv ZnQuTWF0cml4KE0xMT0iK2Nvc3RoZXRhKyIsTTEyPSIrKC1zaW50aGV0YSkrIixN MjE9IitzaW50aGV0YSsiLE0yMj0iK2Nvc3RoZXRhKyIsU2l6aW5nTWV0aG9kPSdh dXRvIGV4cGFuZCcpXG4iO3ZhciBvcGFjaXR5PXN0eWxlLmdyYXBoaWNPcGFjaXR5 fHxzdHlsZS5maWxsT3BhY2l0eTtpZihvcGFjaXR5JiZvcGFjaXR5IT0xKXtmaWx0 ZXIrPSJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFn ZShvcGFjaXR5PSIrCm9wYWNpdHkrIilcbiI7fQpub2RlLnN0eWxlLmZpbHRlcj1m aWx0ZXI7dmFyIGNlbnRlclBvaW50PW5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBv aW50KC14T2Zmc2V0LC15T2Zmc2V0KTt2YXIgaW1nQm94PW5ldyBPcGVuTGF5ZXJz LkJvdW5kcygwLDAsd2lkdGgsaGVpZ2h0KS50b0dlb21ldHJ5KCk7aW1nQm94LnJv dGF0ZShzdHlsZS5yb3RhdGlvbixjZW50ZXJQb2ludCk7dmFyIGltZ0JvdW5kcz1p bWdCb3guZ2V0Qm91bmRzKCk7bm9kZS5zdHlsZS5sZWZ0PU1hdGgucm91bmQocGFy c2VJbnQobm9kZS5zdHlsZS5sZWZ0KStpbWdCb3VuZHMubGVmdCkrInB4Ijtub2Rl LnN0eWxlLnRvcD1NYXRoLnJvdW5kKHBhcnNlSW50KG5vZGUuc3R5bGUudG9wKS1p bWdCb3VuZHMuYm90dG9tKSsicHgiO30scG9zdERyYXc6ZnVuY3Rpb24obm9kZSl7 bm9kZS5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIjt2YXIgZmlsbENvbG9yPW5v ZGUuX3N0eWxlLmZpbGxDb2xvcjt2YXIgc3Ryb2tlQ29sb3I9bm9kZS5fc3R5bGUu c3Ryb2tlQ29sb3I7aWYoZmlsbENvbG9yPT0ibm9uZSImJm5vZGUuZmlsbGNvbG9y IT1maWxsQ29sb3Ipe25vZGUuZmlsbGNvbG9yPWZpbGxDb2xvcjt9CmlmKHN0cm9r ZUNvbG9yPT0ibm9uZSImJm5vZGUuc3Ryb2tlY29sb3IhPXN0cm9rZUNvbG9yKXtu b2RlLnN0cm9rZWNvbG9yPXN0cm9rZUNvbG9yO319LHNldE5vZGVEaW1lbnNpb246 ZnVuY3Rpb24obm9kZSxnZW9tZXRyeSl7dmFyIGJib3g9Z2VvbWV0cnkuZ2V0Qm91 bmRzKCk7aWYoYmJveCl7dmFyIHJlc29sdXRpb249dGhpcy5nZXRSZXNvbHV0aW9u KCk7dmFyIHNjYWxlZEJveD1uZXcgT3BlbkxheWVycy5Cb3VuZHMoKGJib3gubGVm dC9yZXNvbHV0aW9uLXRoaXMub2Zmc2V0LngpfDAsKGJib3guYm90dG9tL3Jlc29s dXRpb24tdGhpcy5vZmZzZXQueSl8MCwoYmJveC5yaWdodC9yZXNvbHV0aW9uLXRo aXMub2Zmc2V0LngpfDAsKGJib3gudG9wL3Jlc29sdXRpb24tdGhpcy5vZmZzZXQu eSl8MCk7bm9kZS5zdHlsZS5sZWZ0PXNjYWxlZEJveC5sZWZ0KyJweCI7bm9kZS5z dHlsZS50b3A9c2NhbGVkQm94LnRvcCsicHgiO25vZGUuc3R5bGUud2lkdGg9c2Nh bGVkQm94LmdldFdpZHRoKCkrInB4Ijtub2RlLnN0eWxlLmhlaWdodD1zY2FsZWRC b3guZ2V0SGVpZ2h0KCkrInB4Ijtub2RlLmNvb3Jkb3JpZ2luPXNjYWxlZEJveC5s ZWZ0KyIgIitzY2FsZWRCb3gudG9wO25vZGUuY29vcmRzaXplPXNjYWxlZEJveC5n ZXRXaWR0aCgpKyIgIitzY2FsZWRCb3guZ2V0SGVpZ2h0KCk7fX0sZGFzaFN0eWxl OmZ1bmN0aW9uKHN0eWxlKXt2YXIgZGFzaD1zdHlsZS5zdHJva2VEYXNoc3R5bGU7 c3dpdGNoKGRhc2gpe2Nhc2Unc29saWQnOmNhc2UnZG90JzpjYXNlJ2Rhc2gnOmNh c2UnZGFzaGRvdCc6Y2FzZSdsb25nZGFzaCc6Y2FzZSdsb25nZGFzaGRvdCc6cmV0 dXJuIGRhc2g7ZGVmYXVsdDp2YXIgcGFydHM9ZGFzaC5zcGxpdCgvWyAsXS8pO2lm KHBhcnRzLmxlbmd0aD09Mil7aWYoMSpwYXJ0c1swXT49MipwYXJ0c1sxXSl7cmV0 dXJuImxvbmdkYXNoIjt9CnJldHVybihwYXJ0c1swXT09MXx8cGFydHNbMV09PTEp PyJkb3QiOiJkYXNoIjt9ZWxzZSBpZihwYXJ0cy5sZW5ndGg9PTQpe3JldHVybigx KnBhcnRzWzBdPj0yKnBhcnRzWzFdKT8ibG9uZ2Rhc2hkb3QiOiJkYXNoZG90Ijt9 CnJldHVybiJzb2xpZCI7fX0sY3JlYXRlTm9kZTpmdW5jdGlvbih0eXBlLGlkKXt2 YXIgbm9kZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpO2lmKGlkKXtub2Rl LmlkPWlkO30Kbm9kZS51bnNlbGVjdGFibGU9J29uJztub2RlLm9uc2VsZWN0c3Rh cnQ9T3BlbkxheWVycy5GdW5jdGlvbi5GYWxzZTtyZXR1cm4gbm9kZTt9LG5vZGVU eXBlQ29tcGFyZTpmdW5jdGlvbihub2RlLHR5cGUpe3ZhciBzdWJUeXBlPXR5cGU7 dmFyIHNwbGl0SW5kZXg9c3ViVHlwZS5pbmRleE9mKCI6Iik7aWYoc3BsaXRJbmRl eCE9LTEpe3N1YlR5cGU9c3ViVHlwZS5zdWJzdHIoc3BsaXRJbmRleCsxKTt9CnZh ciBub2RlTmFtZT1ub2RlLm5vZGVOYW1lO3NwbGl0SW5kZXg9bm9kZU5hbWUuaW5k ZXhPZigiOiIpO2lmKHNwbGl0SW5kZXghPS0xKXtub2RlTmFtZT1ub2RlTmFtZS5z dWJzdHIoc3BsaXRJbmRleCsxKTt9CnJldHVybihzdWJUeXBlPT1ub2RlTmFtZSk7 fSxjcmVhdGVSZW5kZXJSb290OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZUZh Y3RvcnkodGhpcy5jb250YWluZXIuaWQrIl92bWxSb290IiwiZGl2Iik7fSxjcmVh dGVSb290OmZ1bmN0aW9uKHN1ZmZpeCl7cmV0dXJuIHRoaXMubm9kZUZhY3Rvcnko dGhpcy5jb250YWluZXIuaWQrc3VmZml4LCJvbHY6Z3JvdXAiKTt9LGRyYXdQb2lu dDpmdW5jdGlvbihub2RlLGdlb21ldHJ5KXtyZXR1cm4gdGhpcy5kcmF3Q2lyY2xl KG5vZGUsZ2VvbWV0cnksMSk7fSxkcmF3Q2lyY2xlOmZ1bmN0aW9uKG5vZGUsZ2Vv bWV0cnkscmFkaXVzKXtpZighaXNOYU4oZ2VvbWV0cnkueCkmJiFpc05hTihnZW9t ZXRyeS55KSl7dmFyIHJlc29sdXRpb249dGhpcy5nZXRSZXNvbHV0aW9uKCk7bm9k ZS5zdHlsZS5sZWZ0PSgoKGdlb21ldHJ5LngvcmVzb2x1dGlvbi10aGlzLm9mZnNl dC54KXwwKS1yYWRpdXMpKyJweCI7bm9kZS5zdHlsZS50b3A9KCgoZ2VvbWV0cnku eS9yZXNvbHV0aW9uLXRoaXMub2Zmc2V0LnkpfDApLXJhZGl1cykrInB4Ijt2YXIg ZGlhbWV0ZXI9cmFkaXVzKjI7bm9kZS5zdHlsZS53aWR0aD1kaWFtZXRlcisicHgi O25vZGUuc3R5bGUuaGVpZ2h0PWRpYW1ldGVyKyJweCI7cmV0dXJuIG5vZGU7fQpy ZXR1cm4gZmFsc2U7fSxkcmF3TGluZVN0cmluZzpmdW5jdGlvbihub2RlLGdlb21l dHJ5KXtyZXR1cm4gdGhpcy5kcmF3TGluZShub2RlLGdlb21ldHJ5LGZhbHNlKTt9 LGRyYXdMaW5lYXJSaW5nOmZ1bmN0aW9uKG5vZGUsZ2VvbWV0cnkpe3JldHVybiB0 aGlzLmRyYXdMaW5lKG5vZGUsZ2VvbWV0cnksdHJ1ZSk7fSxkcmF3TGluZTpmdW5j dGlvbihub2RlLGdlb21ldHJ5LGNsb3NlTGluZSl7dGhpcy5zZXROb2RlRGltZW5z aW9uKG5vZGUsZ2VvbWV0cnkpO3ZhciByZXNvbHV0aW9uPXRoaXMuZ2V0UmVzb2x1 dGlvbigpO3ZhciBudW1Db21wb25lbnRzPWdlb21ldHJ5LmNvbXBvbmVudHMubGVu Z3RoO3ZhciBwYXJ0cz1uZXcgQXJyYXkobnVtQ29tcG9uZW50cyk7dmFyIGNvbXAs eCx5O2Zvcih2YXIgaT0wO2k8bnVtQ29tcG9uZW50cztpKyspe2NvbXA9Z2VvbWV0 cnkuY29tcG9uZW50c1tpXTt4PShjb21wLngvcmVzb2x1dGlvbi10aGlzLm9mZnNl dC54KXwwO3k9KGNvbXAueS9yZXNvbHV0aW9uLXRoaXMub2Zmc2V0LnkpfDA7cGFy dHNbaV09IiAiK3grIiwiK3krIiBsICI7fQp2YXIgZW5kPShjbG9zZUxpbmUpPyIg eCBlIjoiIGUiO25vZGUucGF0aD0ibSIrcGFydHMuam9pbigiIikrZW5kO3JldHVy biBub2RlO30sZHJhd1BvbHlnb246ZnVuY3Rpb24obm9kZSxnZW9tZXRyeSl7dGhp cy5zZXROb2RlRGltZW5zaW9uKG5vZGUsZ2VvbWV0cnkpO3ZhciByZXNvbHV0aW9u PXRoaXMuZ2V0UmVzb2x1dGlvbigpO3ZhciBwYXRoPVtdO3ZhciBqLGpqLHBvaW50 cyxhcmVhLGZpcnN0LHNlY29uZCxpLGlpLGNvbXAscGF0aENvbXAseCx5O2Zvcihq PTAsamo9Z2VvbWV0cnkuY29tcG9uZW50cy5sZW5ndGg7ajxqajtqKyspe3BhdGgu cHVzaCgibSIpO3BvaW50cz1nZW9tZXRyeS5jb21wb25lbnRzW2pdLmNvbXBvbmVu dHM7YXJlYT0oaj09PTApO2ZpcnN0PW51bGw7c2Vjb25kPW51bGw7Zm9yKGk9MCxp aT1wb2ludHMubGVuZ3RoO2k8aWk7aSsrKXtjb21wPXBvaW50c1tpXTt4PShjb21w LngvcmVzb2x1dGlvbi10aGlzLm9mZnNldC54KXwwO3k9KGNvbXAueS9yZXNvbHV0 aW9uLXRoaXMub2Zmc2V0LnkpfDA7cGF0aENvbXA9IiAiK3grIiwiK3k7cGF0aC5w dXNoKHBhdGhDb21wKTtpZihpPT0wKXtwYXRoLnB1c2goIiBsIik7fQppZighYXJl YSl7aWYoIWZpcnN0KXtmaXJzdD1wYXRoQ29tcDt9ZWxzZSBpZihmaXJzdCE9cGF0 aENvbXApe2lmKCFzZWNvbmQpe3NlY29uZD1wYXRoQ29tcDt9ZWxzZSBpZihzZWNv bmQhPXBhdGhDb21wKXthcmVhPXRydWU7fX19fQpwYXRoLnB1c2goYXJlYT8iIHgg IjoiICIpO30KcGF0aC5wdXNoKCJlIik7bm9kZS5wYXRoPXBhdGguam9pbigiIik7 cmV0dXJuIG5vZGU7fSxkcmF3UmVjdGFuZ2xlOmZ1bmN0aW9uKG5vZGUsZ2VvbWV0 cnkpe3ZhciByZXNvbHV0aW9uPXRoaXMuZ2V0UmVzb2x1dGlvbigpO25vZGUuc3R5 bGUubGVmdD0oKGdlb21ldHJ5LngvcmVzb2x1dGlvbi10aGlzLm9mZnNldC54KXww KSsicHgiO25vZGUuc3R5bGUudG9wPSgoZ2VvbWV0cnkueS9yZXNvbHV0aW9uLXRo aXMub2Zmc2V0LnkpfDApKyJweCI7bm9kZS5zdHlsZS53aWR0aD0oKGdlb21ldHJ5 LndpZHRoL3Jlc29sdXRpb24pfDApKyJweCI7bm9kZS5zdHlsZS5oZWlnaHQ9KChn ZW9tZXRyeS5oZWlnaHQvcmVzb2x1dGlvbil8MCkrInB4IjtyZXR1cm4gbm9kZTt9 LGRyYXdUZXh0OmZ1bmN0aW9uKGZlYXR1cmVJZCxzdHlsZSxsb2NhdGlvbil7dmFy IGxhYmVsPXRoaXMubm9kZUZhY3RvcnkoZmVhdHVyZUlkK3RoaXMuTEFCRUxfSURf U1VGRklYLCJvbHY6cmVjdCIpO3ZhciB0ZXh0Ym94PXRoaXMubm9kZUZhY3Rvcnko ZmVhdHVyZUlkK3RoaXMuTEFCRUxfSURfU1VGRklYKyJfdGV4dGJveCIsIm9sdjp0 ZXh0Ym94Iik7dmFyIHJlc29sdXRpb249dGhpcy5nZXRSZXNvbHV0aW9uKCk7bGFi ZWwuc3R5bGUubGVmdD0oKGxvY2F0aW9uLngvcmVzb2x1dGlvbi10aGlzLm9mZnNl dC54KXwwKSsicHgiO2xhYmVsLnN0eWxlLnRvcD0oKGxvY2F0aW9uLnkvcmVzb2x1 dGlvbi10aGlzLm9mZnNldC55KXwwKSsicHgiO2xhYmVsLnN0eWxlLmZsaXA9Inki O3RleHRib3guaW5uZXJUZXh0PXN0eWxlLmxhYmVsO2lmKHN0eWxlLmN1cnNvciE9 ImluaGVyaXQiJiZzdHlsZS5jdXJzb3IhPW51bGwpe3RleHRib3guc3R5bGUuY3Vy c29yPXN0eWxlLmN1cnNvcjt9CmlmKHN0eWxlLmZvbnRDb2xvcil7dGV4dGJveC5z dHlsZS5jb2xvcj1zdHlsZS5mb250Q29sb3I7fQppZihzdHlsZS5mb250T3BhY2l0 eSl7dGV4dGJveC5zdHlsZS5maWx0ZXI9J2FscGhhKG9wYWNpdHk9Jysoc3R5bGUu Zm9udE9wYWNpdHkqMTAwKSsnKSc7fQppZihzdHlsZS5mb250RmFtaWx5KXt0ZXh0 Ym94LnN0eWxlLmZvbnRGYW1pbHk9c3R5bGUuZm9udEZhbWlseTt9CmlmKHN0eWxl LmZvbnRTaXplKXt0ZXh0Ym94LnN0eWxlLmZvbnRTaXplPXN0eWxlLmZvbnRTaXpl O30KaWYoc3R5bGUuZm9udFdlaWdodCl7dGV4dGJveC5zdHlsZS5mb250V2VpZ2h0 PXN0eWxlLmZvbnRXZWlnaHQ7fQppZihzdHlsZS5mb250U3R5bGUpe3RleHRib3gu c3R5bGUuZm9udFN0eWxlPXN0eWxlLmZvbnRTdHlsZTt9CmlmKHN0eWxlLmxhYmVs U2VsZWN0PT09dHJ1ZSl7bGFiZWwuX2ZlYXR1cmVJZD1mZWF0dXJlSWQ7dGV4dGJv eC5fZmVhdHVyZUlkPWZlYXR1cmVJZDt0ZXh0Ym94Ll9nZW9tZXRyeT1sb2NhdGlv bjt0ZXh0Ym94Ll9nZW9tZXRyeUNsYXNzPWxvY2F0aW9uLkNMQVNTX05BTUU7fQp0 ZXh0Ym94LnN0eWxlLndoaXRlU3BhY2U9Im5vd3JhcCI7dGV4dGJveC5pbnNldD0i MXB4LDBweCwwcHgsMHB4IjtpZighbGFiZWwucGFyZW50Tm9kZSl7bGFiZWwuYXBw ZW5kQ2hpbGQodGV4dGJveCk7dGhpcy50ZXh0Um9vdC5hcHBlbmRDaGlsZChsYWJl bCk7fQp2YXIgYWxpZ249c3R5bGUubGFiZWxBbGlnbnx8ImNtIjtpZihhbGlnbi5s ZW5ndGg9PTEpe2FsaWduKz0ibSI7fQp2YXIgeHNoaWZ0PXRleHRib3guY2xpZW50 V2lkdGgqKE9wZW5MYXllcnMuUmVuZGVyZXIuVk1MLkxBQkVMX1NISUZUW2FsaWdu LnN1YnN0cigwLDEpXSk7dmFyIHlzaGlmdD10ZXh0Ym94LmNsaWVudEhlaWdodCoo T3BlbkxheWVycy5SZW5kZXJlci5WTUwuTEFCRUxfU0hJRlRbYWxpZ24uc3Vic3Ry KDEsMSldKTtsYWJlbC5zdHlsZS5sZWZ0PXBhcnNlSW50KGxhYmVsLnN0eWxlLmxl ZnQpLXhzaGlmdC0xKyJweCI7bGFiZWwuc3R5bGUudG9wPXBhcnNlSW50KGxhYmVs LnN0eWxlLnRvcCkreXNoaWZ0KyJweCI7fSxkcmF3U3VyZmFjZTpmdW5jdGlvbihu b2RlLGdlb21ldHJ5KXt0aGlzLnNldE5vZGVEaW1lbnNpb24obm9kZSxnZW9tZXRy eSk7dmFyIHJlc29sdXRpb249dGhpcy5nZXRSZXNvbHV0aW9uKCk7dmFyIHBhdGg9 W107dmFyIGNvbXAseCx5O2Zvcih2YXIgaT0wLGxlbj1nZW9tZXRyeS5jb21wb25l bnRzLmxlbmd0aDtpPGxlbjtpKyspe2NvbXA9Z2VvbWV0cnkuY29tcG9uZW50c1tp XTt4PShjb21wLngvcmVzb2x1dGlvbi10aGlzLm9mZnNldC54KXwwO3k9KGNvbXAu eS9yZXNvbHV0aW9uLXRoaXMub2Zmc2V0LnkpfDA7aWYoKGklMyk9PTAmJihpLzMp PT0wKXtwYXRoLnB1c2goIm0iKTt9ZWxzZSBpZigoaSUzKT09MSl7cGF0aC5wdXNo KCIgYyIpO30KcGF0aC5wdXNoKCIgIit4KyIsIit5KTt9CnBhdGgucHVzaCgiIHgg ZSIpO25vZGUucGF0aD1wYXRoLmpvaW4oIiIpO3JldHVybiBub2RlO30sbW92ZVJv b3Q6ZnVuY3Rpb24ocmVuZGVyZXIpe3ZhciBsYXllcj10aGlzLm1hcC5nZXRMYXll cihyZW5kZXJlci5jb250YWluZXIuaWQpO2lmKGxheWVyIGluc3RhbmNlb2YgT3Bl bkxheWVycy5MYXllci5WZWN0b3IuUm9vdENvbnRhaW5lcil7bGF5ZXI9dGhpcy5t YXAuZ2V0TGF5ZXIodGhpcy5jb250YWluZXIuaWQpO30KbGF5ZXImJmxheWVyLnJl bmRlcmVyLmNsZWFyKCk7T3BlbkxheWVycy5SZW5kZXJlci5FbGVtZW50cy5wcm90 b3R5cGUubW92ZVJvb3QuYXBwbHkodGhpcyxhcmd1bWVudHMpO2xheWVyJiZsYXll ci5yZWRyYXcoKTt9LGltcG9ydFN5bWJvbDpmdW5jdGlvbihncmFwaGljTmFtZSl7 dmFyIGlkPXRoaXMuY29udGFpbmVyLmlkKyItIitncmFwaGljTmFtZTt2YXIgY2Fj aGU9dGhpcy5zeW1ib2xDYWNoZVtpZF07aWYoY2FjaGUpe3JldHVybiBjYWNoZTt9 CnZhciBzeW1ib2w9T3BlbkxheWVycy5SZW5kZXJlci5zeW1ib2xbZ3JhcGhpY05h bWVdO2lmKCFzeW1ib2wpe3Rocm93IG5ldyBFcnJvcihncmFwaGljTmFtZSsnIGlz IG5vdCBhIHZhbGlkIHN5bWJvbCBuYW1lJyk7fQp2YXIgc3ltYm9sRXh0ZW50PW5l dyBPcGVuTGF5ZXJzLkJvdW5kcyhOdW1iZXIuTUFYX1ZBTFVFLE51bWJlci5NQVhf VkFMVUUsMCwwKTt2YXIgcGF0aGl0ZW1zPVsibSJdO2Zvcih2YXIgaT0wO2k8c3lt Ym9sLmxlbmd0aDtpPWkrMil7dmFyIHg9c3ltYm9sW2ldO3ZhciB5PXN5bWJvbFtp KzFdO3N5bWJvbEV4dGVudC5sZWZ0PU1hdGgubWluKHN5bWJvbEV4dGVudC5sZWZ0 LHgpO3N5bWJvbEV4dGVudC5ib3R0b209TWF0aC5taW4oc3ltYm9sRXh0ZW50LmJv dHRvbSx5KTtzeW1ib2xFeHRlbnQucmlnaHQ9TWF0aC5tYXgoc3ltYm9sRXh0ZW50 LnJpZ2h0LHgpO3N5bWJvbEV4dGVudC50b3A9TWF0aC5tYXgoc3ltYm9sRXh0ZW50 LnRvcCx5KTtwYXRoaXRlbXMucHVzaCh4KTtwYXRoaXRlbXMucHVzaCh5KTtpZihp PT0wKXtwYXRoaXRlbXMucHVzaCgibCIpO319CnBhdGhpdGVtcy5wdXNoKCJ4IGUi KTt2YXIgcGF0aD1wYXRoaXRlbXMuam9pbigiICIpO3ZhciBkaWZmPShzeW1ib2xF eHRlbnQuZ2V0V2lkdGgoKS1zeW1ib2xFeHRlbnQuZ2V0SGVpZ2h0KCkpLzI7aWYo ZGlmZj4wKXtzeW1ib2xFeHRlbnQuYm90dG9tPXN5bWJvbEV4dGVudC5ib3R0b20t ZGlmZjtzeW1ib2xFeHRlbnQudG9wPXN5bWJvbEV4dGVudC50b3ArZGlmZjt9ZWxz ZXtzeW1ib2xFeHRlbnQubGVmdD1zeW1ib2xFeHRlbnQubGVmdCtkaWZmO3N5bWJv bEV4dGVudC5yaWdodD1zeW1ib2xFeHRlbnQucmlnaHQtZGlmZjt9CmNhY2hlPXtw YXRoOnBhdGgsc2l6ZTpzeW1ib2xFeHRlbnQuZ2V0V2lkdGgoKSxsZWZ0OnN5bWJv bEV4dGVudC5sZWZ0LGJvdHRvbTpzeW1ib2xFeHRlbnQuYm90dG9tfTt0aGlzLnN5 bWJvbENhY2hlW2lkXT1jYWNoZTtyZXR1cm4gY2FjaGU7fSxDTEFTU19OQU1FOiJP cGVuTGF5ZXJzLlJlbmRlcmVyLlZNTCJ9KTtPcGVuTGF5ZXJzLlJlbmRlcmVyLlZN TC5MQUJFTF9TSElGVD17ImwiOjAsImMiOi41LCJyIjoxLCJ0IjowLCJtIjouNSwi YiI6MX07T3BlbkxheWVycy5MYXllci5NdWx0aU1hcD1PcGVuTGF5ZXJzLkNsYXNz KE9wZW5MYXllcnMuTGF5ZXIuRXZlbnRQYW5lLE9wZW5MYXllcnMuTGF5ZXIuRml4 ZWRab29tTGV2ZWxzLHtNSU5fWk9PTV9MRVZFTDoxLE1BWF9aT09NX0xFVkVMOjE3 LFJFU09MVVRJT05TOls5LDEuNDA2MjUsMC43MDMxMjUsMC4zNTE1NjI1LDAuMTc1 NzgxMjUsMC4wODc4OTA2MjUsMC4wNDM5NDUzMTI1LDAuMDIxOTcyNjU2MjUsMC4w MTA5ODYzMjgxMjUsMC4wMDU0OTMxNjQwNjI1LDAuMDAyNzQ2NTgyMDMxMjUsMC4w MDEzNzMyOTEwMTU2MjUsMC4wMDA2ODY2NDU1MDc4MTI1LDAuMDAwMzQzMzIyNzUz OTA2MjUsMC4wMDAxNzE2NjEzNzY5NTMxMjUsMC4wMDAwODU4MzA2ODg0NzY1NjI1 LDAuMDAwMDQyOTE1MzQ0MjM4MjgxMjVdLHR5cGU6bnVsbCxpbml0aWFsaXplOmZ1 bmN0aW9uKG5hbWUsb3B0aW9ucyl7T3BlbkxheWVycy5MYXllci5FdmVudFBhbmUu cHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO09wZW5M YXllcnMuTGF5ZXIuRml4ZWRab29tTGV2ZWxzLnByb3RvdHlwZS5pbml0aWFsaXpl LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZih0aGlzLnNwaGVyaWNhbE1lcmNhdG9y KXtPcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHRoaXMsT3BlbkxheWVycy5MYXllci5T cGhlcmljYWxNZXJjYXRvcik7dGhpcy5pbml0TWVyY2F0b3JQYXJhbWV0ZXJzKCk7 dGhpcy5SRVNPTFVUSU9OUy51bnNoaWZ0KDEwKTt9fSxsb2FkTWFwT2JqZWN0OmZ1 bmN0aW9uKCl7dHJ5e3RoaXMubWFwT2JqZWN0PW5ldyBNdWx0aW1hcFZpZXdlcih0 aGlzLmRpdik7fWNhdGNoKGUpe319LGdldFdhcm5pbmdIVE1MOmZ1bmN0aW9uKCl7 cmV0dXJuIE9wZW5MYXllcnMuaTE4bigiZ2V0TGF5ZXJXYXJuaW5nIix7J2xheWVy VHlwZSc6Ik1NIiwnbGF5ZXJMaWInOiJNdWx0aU1hcCJ9KTt9LHNldE1hcE9iamVj dENlbnRlcjpmdW5jdGlvbihjZW50ZXIsem9vbSl7dGhpcy5tYXBPYmplY3QuZ29U b1Bvc2l0aW9uKGNlbnRlcix6b29tKTt9LGdldE1hcE9iamVjdENlbnRlcjpmdW5j dGlvbigpe3JldHVybiB0aGlzLm1hcE9iamVjdC5nZXRDdXJyZW50UG9zaXRpb24o KTt9LGdldE1hcE9iamVjdFpvb206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXBP YmplY3QuZ2V0Wm9vbUZhY3RvcigpO30sZ2V0TWFwT2JqZWN0TG9uTGF0RnJvbU1h cE9iamVjdFBpeGVsOmZ1bmN0aW9uKG1vUGl4ZWwpe21vUGl4ZWwueD1tb1BpeGVs LngtKHRoaXMubWFwLmdldFNpemUoKS53LzIpO21vUGl4ZWwueT1tb1BpeGVsLnkt KHRoaXMubWFwLmdldFNpemUoKS5oLzIpO3JldHVybiB0aGlzLm1hcE9iamVjdC5n ZXRNYXBQb3NpdGlvbkF0KG1vUGl4ZWwpO30sZ2V0TWFwT2JqZWN0UGl4ZWxGcm9t TWFwT2JqZWN0TG9uTGF0OmZ1bmN0aW9uKG1vTG9uTGF0KXtyZXR1cm4gdGhpcy5t YXBPYmplY3QuZ2VvUG9zVG9Db250YWluZXJQaXhlbHMobW9Mb25MYXQpO30sZ2V0 TG9uZ2l0dWRlRnJvbU1hcE9iamVjdExvbkxhdDpmdW5jdGlvbihtb0xvbkxhdCl7 cmV0dXJuIHRoaXMuc3BoZXJpY2FsTWVyY2F0b3I/dGhpcy5mb3J3YXJkTWVyY2F0 b3IobW9Mb25MYXQubG9uLG1vTG9uTGF0LmxhdCkubG9uOm1vTG9uTGF0Lmxvbjt9 LGdldExhdGl0dWRlRnJvbU1hcE9iamVjdExvbkxhdDpmdW5jdGlvbihtb0xvbkxh dCl7cmV0dXJuIHRoaXMuc3BoZXJpY2FsTWVyY2F0b3I/dGhpcy5mb3J3YXJkTWVy Y2F0b3IobW9Mb25MYXQubG9uLG1vTG9uTGF0LmxhdCkubGF0Om1vTG9uTGF0Lmxh dDt9LGdldE1hcE9iamVjdExvbkxhdEZyb21Mb25MYXQ6ZnVuY3Rpb24obG9uLGxh dCl7dmFyIG1tTGF0TG9uO2lmKHRoaXMuc3BoZXJpY2FsTWVyY2F0b3Ipe3ZhciBs b25sYXQ9dGhpcy5pbnZlcnNlTWVyY2F0b3IobG9uLGxhdCk7bW1MYXRMb249bmV3 IE1NTGF0TG9uKGxvbmxhdC5sYXQsbG9ubGF0Lmxvbik7fWVsc2V7bW1MYXRMb249 bmV3IE1NTGF0TG9uKGxhdCxsb24pO30KcmV0dXJuIG1tTGF0TG9uO30sZ2V0WEZy b21NYXBPYmplY3RQaXhlbDpmdW5jdGlvbihtb1BpeGVsKXtyZXR1cm4gbW9QaXhl bC54O30sZ2V0WUZyb21NYXBPYmplY3RQaXhlbDpmdW5jdGlvbihtb1BpeGVsKXty ZXR1cm4gbW9QaXhlbC55O30sZ2V0TWFwT2JqZWN0UGl4ZWxGcm9tWFk6ZnVuY3Rp b24oeCx5KXtyZXR1cm4gbmV3IE1NUG9pbnQoeCx5KTt9LENMQVNTX05BTUU6Ik9w ZW5MYXllcnMuTGF5ZXIuTXVsdGlNYXAifSk7T3BlbkxheWVycy5Db250cm9sLk1v dXNlVG9vbGJhcj1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuQ29udHJvbC5N b3VzZURlZmF1bHRzLHttb2RlOm51bGwsYnV0dG9uczpudWxsLGRpcmVjdGlvbjoi dmVydGljYWwiLGJ1dHRvbkNsaWNrZWQ6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9u KHBvc2l0aW9uLGRpcmVjdGlvbil7T3BlbkxheWVycy5Db250cm9sLnByb3RvdHlw ZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnBvc2l0aW9u PW5ldyBPcGVuTGF5ZXJzLlBpeGVsKE9wZW5MYXllcnMuQ29udHJvbC5Nb3VzZVRv b2xiYXIuWCxPcGVuTGF5ZXJzLkNvbnRyb2wuTW91c2VUb29sYmFyLlkpO2lmKHBv c2l0aW9uKXt0aGlzLnBvc2l0aW9uPXBvc2l0aW9uO30KaWYoZGlyZWN0aW9uKXt0 aGlzLmRpcmVjdGlvbj1kaXJlY3Rpb247fQp0aGlzLm1lYXN1cmVEaXZzPVtdO30s ZGVzdHJveTpmdW5jdGlvbigpe2Zvcih2YXIgYnRuSWQgaW4gdGhpcy5idXR0b25z KXt2YXIgYnRuPXRoaXMuYnV0dG9uc1tidG5JZF07YnRuLm1hcD1udWxsO2J0bi5l dmVudHMuZGVzdHJveSgpO30KT3BlbkxheWVycy5Db250cm9sLk1vdXNlRGVmYXVs dHMucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpO30sZHJh dzpmdW5jdGlvbigpe09wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUuZHJhdy5h cHBseSh0aGlzLGFyZ3VtZW50cyk7T3BlbkxheWVycy5Db250cm9sLk1vdXNlRGVm YXVsdHMucHJvdG90eXBlLmRyYXcuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMu YnV0dG9ucz17fTt2YXIgc3o9bmV3IE9wZW5MYXllcnMuU2l6ZSgyOCwyOCk7dmFy IGNlbnRlcmVkPW5ldyBPcGVuTGF5ZXJzLlBpeGVsKE9wZW5MYXllcnMuQ29udHJv bC5Nb3VzZVRvb2xiYXIuWCwwKTt0aGlzLl9hZGRCdXR0b24oInpvb21ib3giLCJk cmFnLXJlY3RhbmdsZS1vZmYucG5nIiwiZHJhZy1yZWN0YW5nbGUtb24ucG5nIixj ZW50ZXJlZCxzeiwiU2hpZnQtPkRyYWcgdG8gem9vbSB0byBhcmVhIik7Y2VudGVy ZWQ9Y2VudGVyZWQuYWRkKCh0aGlzLmRpcmVjdGlvbj09InZlcnRpY2FsIj8wOnN6 LncpLCh0aGlzLmRpcmVjdGlvbj09InZlcnRpY2FsIj9zei5oOjApKTt0aGlzLl9h ZGRCdXR0b24oInBhbiIsInBhbm5pbmctaGFuZC1vZmYucG5nIiwicGFubmluZy1o YW5kLW9uLnBuZyIsY2VudGVyZWQsc3osIkRyYWcgdGhlIG1hcCB0byBwYW4uIik7 Y2VudGVyZWQ9Y2VudGVyZWQuYWRkKCh0aGlzLmRpcmVjdGlvbj09InZlcnRpY2Fs Ij8wOnN6LncpLCh0aGlzLmRpcmVjdGlvbj09InZlcnRpY2FsIj9zei5oOjApKTt0 aGlzLnN3aXRjaE1vZGVUbygicGFuIik7cmV0dXJuIHRoaXMuZGl2O30sX2FkZEJ1 dHRvbjpmdW5jdGlvbihpZCxpbWcsYWN0aXZlSW1nLHh5LHN6LHRpdGxlKXt2YXIg aW1nTG9jYXRpb249T3BlbkxheWVycy5VdGlsLmdldEltYWdlc0xvY2F0aW9uKCkr aW1nO3ZhciBhY3RpdmVJbWdMb2NhdGlvbj1PcGVuTGF5ZXJzLlV0aWwuZ2V0SW1h Z2VzTG9jYXRpb24oKSthY3RpdmVJbWc7dmFyIGJ0bj1PcGVuTGF5ZXJzLlV0aWwu Y3JlYXRlQWxwaGFJbWFnZURpdigiT3BlbkxheWVyc19Db250cm9sX01vdXNlVG9v bGJhcl8iK2lkLHh5LHN6LGltZ0xvY2F0aW9uLCJhYnNvbHV0ZSIpO3RoaXMuZGl2 LmFwcGVuZENoaWxkKGJ0bik7YnRuLmltZ0xvY2F0aW9uPWltZ0xvY2F0aW9uO2J0 bi5hY3RpdmVJbWdMb2NhdGlvbj1hY3RpdmVJbWdMb2NhdGlvbjtidG4uZXZlbnRz PW5ldyBPcGVuTGF5ZXJzLkV2ZW50cyh0aGlzLGJ0bixudWxsLHRydWUpO2J0bi5l dmVudHMub24oeyJtb3VzZWRvd24iOnRoaXMuYnV0dG9uRG93biwibW91c2V1cCI6 dGhpcy5idXR0b25VcCwiZGJsY2xpY2siOk9wZW5MYXllcnMuRXZlbnQuc3RvcCxz Y29wZTp0aGlzfSk7YnRuLmFjdGlvbj1pZDtidG4udGl0bGU9dGl0bGU7YnRuLmFs dD10aXRsZTtidG4ubWFwPXRoaXMubWFwO3RoaXMuYnV0dG9uc1tpZF09YnRuO3Jl dHVybiBidG47fSxidXR0b25Eb3duOmZ1bmN0aW9uKGV2dCl7aWYoIU9wZW5MYXll cnMuRXZlbnQuaXNMZWZ0Q2xpY2soZXZ0KSl7cmV0dXJuO30KdGhpcy5idXR0b25D bGlja2VkPWV2dC5lbGVtZW50LmFjdGlvbjtPcGVuTGF5ZXJzLkV2ZW50LnN0b3Ao ZXZ0KTt9LGJ1dHRvblVwOmZ1bmN0aW9uKGV2dCl7aWYoIU9wZW5MYXllcnMuRXZl bnQuaXNMZWZ0Q2xpY2soZXZ0KSl7cmV0dXJuO30KaWYodGhpcy5idXR0b25DbGlj a2VkIT1udWxsKXtpZih0aGlzLmJ1dHRvbkNsaWNrZWQ9PWV2dC5lbGVtZW50LmFj dGlvbil7dGhpcy5zd2l0Y2hNb2RlVG8oZXZ0LmVsZW1lbnQuYWN0aW9uKTt9Ck9w ZW5MYXllcnMuRXZlbnQuc3RvcChldnQpO3RoaXMuYnV0dG9uQ2xpY2tlZD1udWxs O319LGRlZmF1bHREYmxDbGljazpmdW5jdGlvbihldnQpe3RoaXMuc3dpdGNoTW9k ZVRvKCJwYW4iKTt0aGlzLnBlcmZvcm1lZERyYWc9ZmFsc2U7dmFyIG5ld0NlbnRl cj10aGlzLm1hcC5nZXRMb25MYXRGcm9tVmlld1BvcnRQeChldnQueHkpO3RoaXMu bWFwLnNldENlbnRlcihuZXdDZW50ZXIsdGhpcy5tYXAuem9vbSsxKTtPcGVuTGF5 ZXJzLkV2ZW50LnN0b3AoZXZ0KTtyZXR1cm4gZmFsc2U7fSxkZWZhdWx0TW91c2VE b3duOmZ1bmN0aW9uKGV2dCl7aWYoIU9wZW5MYXllcnMuRXZlbnQuaXNMZWZ0Q2xp Y2soZXZ0KSl7cmV0dXJuO30KdGhpcy5tb3VzZURyYWdTdGFydD1ldnQueHkuY2xv bmUoKTt0aGlzLnBlcmZvcm1lZERyYWc9ZmFsc2U7dGhpcy5zdGFydFZpYUtleWJv YXJkPWZhbHNlO2lmKGV2dC5zaGlmdEtleSYmdGhpcy5tb2RlIT0iem9vbWJveCIp e3RoaXMuc3dpdGNoTW9kZVRvKCJ6b29tYm94Iik7dGhpcy5zdGFydFZpYUtleWJv YXJkPXRydWU7fWVsc2UgaWYoZXZ0LmFsdEtleSYmdGhpcy5tb2RlIT0ibWVhc3Vy ZSIpe3RoaXMuc3dpdGNoTW9kZVRvKCJtZWFzdXJlIik7fWVsc2UgaWYoIXRoaXMu bW9kZSl7dGhpcy5zd2l0Y2hNb2RlVG8oInBhbiIpO30Kc3dpdGNoKHRoaXMubW9k ZSl7Y2FzZSJ6b29tYm94Ijp0aGlzLm1hcC5kaXYuc3R5bGUuY3Vyc29yPSJjcm9z c2hhaXIiO3RoaXMuem9vbUJveD1PcGVuTGF5ZXJzLlV0aWwuY3JlYXRlRGl2KCd6 b29tQm94Jyx0aGlzLm1vdXNlRHJhZ1N0YXJ0LG51bGwsbnVsbCwiYWJzb2x1dGUi LCIycHggc29saWQgcmVkIik7dGhpcy56b29tQm94LnN0eWxlLmJhY2tncm91bmRD b2xvcj0id2hpdGUiO3RoaXMuem9vbUJveC5zdHlsZS5maWx0ZXI9ImFscGhhKG9w YWNpdHk9NTApIjt0aGlzLnpvb21Cb3guc3R5bGUub3BhY2l0eT0iMC41MCI7dGhp cy56b29tQm94LnN0eWxlLmZvbnRTaXplPSIxcHgiO3RoaXMuem9vbUJveC5zdHls ZS56SW5kZXg9dGhpcy5tYXAuWl9JTkRFWF9CQVNFWyJQb3B1cCJdLTE7dGhpcy5t YXAuZXZlbnRzRGl2LmFwcGVuZENoaWxkKHRoaXMuem9vbUJveCk7dGhpcy5wZXJm b3JtZWREcmFnPXRydWU7YnJlYWs7Y2FzZSJtZWFzdXJlIjp2YXIgZGlzdGFuY2U9 IiI7aWYodGhpcy5tZWFzdXJlU3RhcnQpe3ZhciBtZWFzdXJlRW5kPXRoaXMubWFw LmdldExvbkxhdEZyb21WaWV3UG9ydFB4KHRoaXMubW91c2VEcmFnU3RhcnQpO2Rp c3RhbmNlPU9wZW5MYXllcnMuVXRpbC5kaXN0VmluY2VudHkodGhpcy5tZWFzdXJl U3RhcnQsbWVhc3VyZUVuZCk7ZGlzdGFuY2U9TWF0aC5yb3VuZChkaXN0YW5jZSox MDApLzEwMDtkaXN0YW5jZT1kaXN0YW5jZSsia20iO3RoaXMubWVhc3VyZVN0YXJ0 Qm94PXRoaXMubWVhc3VyZUJveDt9CnRoaXMubWVhc3VyZVN0YXJ0PXRoaXMubWFw LmdldExvbkxhdEZyb21WaWV3UG9ydFB4KHRoaXMubW91c2VEcmFnU3RhcnQpOzt0 aGlzLm1lYXN1cmVCb3g9T3BlbkxheWVycy5VdGlsLmNyZWF0ZURpdihudWxsLHRo aXMubW91c2VEcmFnU3RhcnQuYWRkKC0yLXBhcnNlSW50KHRoaXMubWFwLmxheWVy Q29udGFpbmVyRGl2LnN0eWxlLmxlZnQpLC0yLXBhcnNlSW50KHRoaXMubWFwLmxh eWVyQ29udGFpbmVyRGl2LnN0eWxlLnRvcCkpLG51bGwsbnVsbCwiYWJzb2x1dGUi KTt0aGlzLm1lYXN1cmVCb3guc3R5bGUud2lkdGg9IjRweCI7dGhpcy5tZWFzdXJl Qm94LnN0eWxlLmhlaWdodD0iNHB4Ijt0aGlzLm1lYXN1cmVCb3guc3R5bGUuZm9u dFNpemU9IjFweCI7dGhpcy5tZWFzdXJlQm94LnN0eWxlLmJhY2tncm91bmRDb2xv cj0icmVkIjt0aGlzLm1lYXN1cmVCb3guc3R5bGUuekluZGV4PXRoaXMubWFwLlpf SU5ERVhfQkFTRVsiUG9wdXAiXS0xO3RoaXMubWFwLmxheWVyQ29udGFpbmVyRGl2 LmFwcGVuZENoaWxkKHRoaXMubWVhc3VyZUJveCk7aWYoZGlzdGFuY2Upe3RoaXMu bWVhc3VyZUJveERpc3RhbmNlPU9wZW5MYXllcnMuVXRpbC5jcmVhdGVEaXYobnVs bCx0aGlzLm1vdXNlRHJhZ1N0YXJ0LmFkZCgtMi1wYXJzZUludCh0aGlzLm1hcC5s YXllckNvbnRhaW5lckRpdi5zdHlsZS5sZWZ0KSwyLXBhcnNlSW50KHRoaXMubWFw LmxheWVyQ29udGFpbmVyRGl2LnN0eWxlLnRvcCkpLG51bGwsbnVsbCwiYWJzb2x1 dGUiKTt0aGlzLm1lYXN1cmVCb3hEaXN0YW5jZS5pbm5lckhUTUw9ZGlzdGFuY2U7 dGhpcy5tZWFzdXJlQm94RGlzdGFuY2Uuc3R5bGUuekluZGV4PXRoaXMubWFwLlpf SU5ERVhfQkFTRVsiUG9wdXAiXS0xO3RoaXMubWFwLmxheWVyQ29udGFpbmVyRGl2 LmFwcGVuZENoaWxkKHRoaXMubWVhc3VyZUJveERpc3RhbmNlKTt0aGlzLm1lYXN1 cmVEaXZzLnB1c2godGhpcy5tZWFzdXJlQm94RGlzdGFuY2UpO30KdGhpcy5tZWFz dXJlQm94LnN0eWxlLnpJbmRleD10aGlzLm1hcC5aX0lOREVYX0JBU0VbIlBvcHVw Il0tMTt0aGlzLm1hcC5sYXllckNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlz Lm1lYXN1cmVCb3gpO3RoaXMubWVhc3VyZURpdnMucHVzaCh0aGlzLm1lYXN1cmVC b3gpO2JyZWFrO2RlZmF1bHQ6dGhpcy5tYXAuZGl2LnN0eWxlLmN1cnNvcj0ibW92 ZSI7YnJlYWs7fQpkb2N1bWVudC5vbnNlbGVjdHN0YXJ0PU9wZW5MYXllcnMuRnVu Y3Rpb24uRmFsc2U7T3BlbkxheWVycy5FdmVudC5zdG9wKGV2dCk7fSxzd2l0Y2hN b2RlVG86ZnVuY3Rpb24obW9kZSl7aWYobW9kZSE9dGhpcy5tb2RlKXtpZih0aGlz Lm1vZGUmJnRoaXMuYnV0dG9uc1t0aGlzLm1vZGVdKXtPcGVuTGF5ZXJzLlV0aWwu bW9kaWZ5QWxwaGFJbWFnZURpdih0aGlzLmJ1dHRvbnNbdGhpcy5tb2RlXSxudWxs LG51bGwsbnVsbCx0aGlzLmJ1dHRvbnNbdGhpcy5tb2RlXS5pbWdMb2NhdGlvbik7 fQppZih0aGlzLm1vZGU9PSJtZWFzdXJlIiYmbW9kZSE9Im1lYXN1cmUiKXtmb3Io dmFyIGk9MCxsZW49dGhpcy5tZWFzdXJlRGl2cy5sZW5ndGg7aTxsZW47aSsrKXtp Zih0aGlzLm1lYXN1cmVEaXZzW2ldKXt0aGlzLm1hcC5sYXllckNvbnRhaW5lckRp di5yZW1vdmVDaGlsZCh0aGlzLm1lYXN1cmVEaXZzW2ldKTt9fQp0aGlzLm1lYXN1 cmVEaXZzPVtdO3RoaXMubWVhc3VyZVN0YXJ0PW51bGw7fQp0aGlzLm1vZGU9bW9k ZTtpZih0aGlzLmJ1dHRvbnNbbW9kZV0pe09wZW5MYXllcnMuVXRpbC5tb2RpZnlB bHBoYUltYWdlRGl2KHRoaXMuYnV0dG9uc1ttb2RlXSxudWxsLG51bGwsbnVsbCx0 aGlzLmJ1dHRvbnNbbW9kZV0uYWN0aXZlSW1nTG9jYXRpb24pO30Kc3dpdGNoKHRo aXMubW9kZSl7Y2FzZSJ6b29tYm94Ijp0aGlzLm1hcC5kaXYuc3R5bGUuY3Vyc29y PSJjcm9zc2hhaXIiO2JyZWFrO2RlZmF1bHQ6dGhpcy5tYXAuZGl2LnN0eWxlLmN1 cnNvcj0iIjticmVhazt9fX0sbGVhdmVNb2RlOmZ1bmN0aW9uKCl7dGhpcy5zd2l0 Y2hNb2RlVG8oInBhbiIpO30sZGVmYXVsdE1vdXNlTW92ZTpmdW5jdGlvbihldnQp e2lmKHRoaXMubW91c2VEcmFnU3RhcnQhPW51bGwpe3N3aXRjaCh0aGlzLm1vZGUp e2Nhc2Uiem9vbWJveCI6dmFyIGRlbHRhWD1NYXRoLmFicyh0aGlzLm1vdXNlRHJh Z1N0YXJ0LngtZXZ0Lnh5LngpO3ZhciBkZWx0YVk9TWF0aC5hYnModGhpcy5tb3Vz ZURyYWdTdGFydC55LWV2dC54eS55KTt0aGlzLnpvb21Cb3guc3R5bGUud2lkdGg9 TWF0aC5tYXgoMSxkZWx0YVgpKyJweCI7dGhpcy56b29tQm94LnN0eWxlLmhlaWdo dD1NYXRoLm1heCgxLGRlbHRhWSkrInB4IjtpZihldnQueHkueDx0aGlzLm1vdXNl RHJhZ1N0YXJ0Lngpe3RoaXMuem9vbUJveC5zdHlsZS5sZWZ0PWV2dC54eS54KyJw eCI7fQppZihldnQueHkueTx0aGlzLm1vdXNlRHJhZ1N0YXJ0Lnkpe3RoaXMuem9v bUJveC5zdHlsZS50b3A9ZXZ0Lnh5LnkrInB4Ijt9CmJyZWFrO2RlZmF1bHQ6dmFy IGRlbHRhWD10aGlzLm1vdXNlRHJhZ1N0YXJ0LngtZXZ0Lnh5Lng7dmFyIGRlbHRh WT10aGlzLm1vdXNlRHJhZ1N0YXJ0LnktZXZ0Lnh5Lnk7dmFyIHNpemU9dGhpcy5t YXAuZ2V0U2l6ZSgpO3ZhciBuZXdYWT1uZXcgT3BlbkxheWVycy5QaXhlbChzaXpl LncvMitkZWx0YVgsc2l6ZS5oLzIrZGVsdGFZKTt2YXIgbmV3Q2VudGVyPXRoaXMu bWFwLmdldExvbkxhdEZyb21WaWV3UG9ydFB4KG5ld1hZKTt0aGlzLm1hcC5zZXRD ZW50ZXIobmV3Q2VudGVyLG51bGwsdHJ1ZSk7dGhpcy5tb3VzZURyYWdTdGFydD1l dnQueHkuY2xvbmUoKTt9CnRoaXMucGVyZm9ybWVkRHJhZz10cnVlO319LGRlZmF1 bHRNb3VzZVVwOmZ1bmN0aW9uKGV2dCl7aWYoIU9wZW5MYXllcnMuRXZlbnQuaXNM ZWZ0Q2xpY2soZXZ0KSl7cmV0dXJuO30Kc3dpdGNoKHRoaXMubW9kZSl7Y2FzZSJ6 b29tYm94Ijp0aGlzLnpvb21Cb3hFbmQoZXZ0KTtpZih0aGlzLnN0YXJ0VmlhS2V5 Ym9hcmQpe3RoaXMubGVhdmVNb2RlKCk7fQpicmVhaztjYXNlInBhbiI6aWYodGhp cy5wZXJmb3JtZWREcmFnKXt0aGlzLm1hcC5zZXRDZW50ZXIodGhpcy5tYXAuY2Vu dGVyKTt9fQpkb2N1bWVudC5vbnNlbGVjdHN0YXJ0PW51bGw7dGhpcy5tb3VzZURy YWdTdGFydD1udWxsO3RoaXMubWFwLmRpdi5zdHlsZS5jdXJzb3I9ImRlZmF1bHQi O30sZGVmYXVsdE1vdXNlT3V0OmZ1bmN0aW9uKGV2dCl7aWYodGhpcy5tb3VzZURy YWdTdGFydCE9bnVsbCYmT3BlbkxheWVycy5VdGlsLm1vdXNlTGVmdChldnQsdGhp cy5tYXAuZXZlbnRzRGl2KSl7aWYodGhpcy56b29tQm94KXt0aGlzLnJlbW92ZVpv b21Cb3goKTtpZih0aGlzLnN0YXJ0VmlhS2V5Ym9hcmQpe3RoaXMubGVhdmVNb2Rl KCk7fX0KdGhpcy5tb3VzZURyYWdTdGFydD1udWxsO3RoaXMubWFwLmRpdi5zdHls ZS5jdXJzb3I9ImRlZmF1bHQiO319LGRlZmF1bHRDbGljazpmdW5jdGlvbihldnQp e2lmKHRoaXMucGVyZm9ybWVkRHJhZyl7dGhpcy5wZXJmb3JtZWREcmFnPWZhbHNl O3JldHVybiBmYWxzZTt9fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkNvbnRyb2wu TW91c2VUb29sYmFyIn0pO09wZW5MYXllcnMuQ29udHJvbC5Nb3VzZVRvb2xiYXIu WD02O09wZW5MYXllcnMuQ29udHJvbC5Nb3VzZVRvb2xiYXIuWT0zMDA7T3Blbkxh eWVycy5Qcm90b2NvbC5XRlMudjFfMF8wPU9wZW5MYXllcnMuQ2xhc3MoT3Blbkxh eWVycy5Qcm90b2NvbC5XRlMudjEse3ZlcnNpb246IjEuMC4wIixDTEFTU19OQU1F OiJPcGVuTGF5ZXJzLlByb3RvY29sLldGUy52MV8wXzAifSk7T3BlbkxheWVycy5G b3JtYXQuV01TR2V0RmVhdHVyZUluZm89T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5 ZXJzLkZvcm1hdC5YTUwse2xheWVySWRlbnRpZmllcjonX2xheWVyJyxmZWF0dXJl SWRlbnRpZmllcjonX2ZlYXR1cmUnLHJlZ0V4ZXM6e3RyaW1TcGFjZTooL15ccyp8 XHMqJC9nKSxyZW1vdmVTcGFjZTooL1xzKi9nKSxzcGxpdFNwYWNlOigvXHMrLyks dHJpbUNvbW1hOigvXHMqLFxzKi9nKX0sZ21sRm9ybWF0Om51bGwscmVhZDpmdW5j dGlvbihkYXRhKXt2YXIgcmVzdWx0O2lmKHR5cGVvZiBkYXRhPT0ic3RyaW5nIil7 ZGF0YT1PcGVuTGF5ZXJzLkZvcm1hdC5YTUwucHJvdG90eXBlLnJlYWQuYXBwbHko dGhpcyxbZGF0YV0pO30KdmFyIHJvb3Q9ZGF0YS5kb2N1bWVudEVsZW1lbnQ7aWYo cm9vdCl7dmFyIHNjb3BlPXRoaXM7dmFyIHJlYWQ9dGhpc1sicmVhZF8iK3Jvb3Qu bm9kZU5hbWVdO2lmKHJlYWQpe3Jlc3VsdD1yZWFkLmNhbGwodGhpcyxyb290KTt9 ZWxzZXtyZXN1bHQ9bmV3IE9wZW5MYXllcnMuRm9ybWF0LkdNTCgodGhpcy5vcHRp b25zP3RoaXMub3B0aW9uczp7fSkpLnJlYWQoZGF0YSk7fX1lbHNle3Jlc3VsdD1k YXRhO30KcmV0dXJuIHJlc3VsdDt9LHJlYWRfbXNHTUxPdXRwdXQ6ZnVuY3Rpb24o ZGF0YSl7dmFyIHJlc3BvbnNlPVtdO3ZhciBsYXllck5vZGVzPXRoaXMuZ2V0U2li bGluZ05vZGVzQnlUYWdDcml0ZXJpYShkYXRhLHRoaXMubGF5ZXJJZGVudGlmaWVy KTtpZihsYXllck5vZGVzKXtmb3IodmFyIGk9MCxsZW49bGF5ZXJOb2Rlcy5sZW5n dGg7aTxsZW47KytpKXt2YXIgbm9kZT1sYXllck5vZGVzW2ldO3ZhciBsYXllck5h bWU9bm9kZS5ub2RlTmFtZTtpZihub2RlLnByZWZpeCl7bGF5ZXJOYW1lPWxheWVy TmFtZS5zcGxpdCgnOicpWzFdO30KdmFyIGxheWVyTmFtZT1sYXllck5hbWUucmVw bGFjZSh0aGlzLmxheWVySWRlbnRpZmllciwnJyk7dmFyIGZlYXR1cmVOb2Rlcz10 aGlzLmdldFNpYmxpbmdOb2Rlc0J5VGFnQ3JpdGVyaWEobm9kZSx0aGlzLmZlYXR1 cmVJZGVudGlmaWVyKTtpZihmZWF0dXJlTm9kZXMpe2Zvcih2YXIgaj0wO2o8ZmVh dHVyZU5vZGVzLmxlbmd0aDtqKyspe3ZhciBmZWF0dXJlTm9kZT1mZWF0dXJlTm9k ZXNbal07dmFyIGdlb21JbmZvPXRoaXMucGFyc2VHZW9tZXRyeShmZWF0dXJlTm9k ZSk7dmFyIGF0dHJpYnV0ZXM9dGhpcy5wYXJzZUF0dHJpYnV0ZXMoZmVhdHVyZU5v ZGUpO3ZhciBmZWF0dXJlPW5ldyBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9yKGdl b21JbmZvLmdlb21ldHJ5LGF0dHJpYnV0ZXMsbnVsbCk7ZmVhdHVyZS5ib3VuZHM9 Z2VvbUluZm8uYm91bmRzO2ZlYXR1cmUudHlwZT1sYXllck5hbWU7cmVzcG9uc2Uu cHVzaChmZWF0dXJlKTt9fX19CnJldHVybiByZXNwb25zZTt9LHJlYWRfRmVhdHVy ZUluZm9SZXNwb25zZTpmdW5jdGlvbihkYXRhKXt2YXIgcmVzcG9uc2U9W107dmFy IGZlYXR1cmVOb2Rlcz10aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoZGF0YSwn KicsJ0ZJRUxEUycpO2Zvcih2YXIgaT0wLGxlbj1mZWF0dXJlTm9kZXMubGVuZ3Ro O2k8bGVuO2krKyl7dmFyIGZlYXR1cmVOb2RlPWZlYXR1cmVOb2Rlc1tpXTt2YXIg Z2VvbT1udWxsO3ZhciBhdHRyaWJ1dGVzPXt9O3ZhciBqO3ZhciBqbGVuPWZlYXR1 cmVOb2RlLmF0dHJpYnV0ZXMubGVuZ3RoO2lmKGpsZW4+MCl7Zm9yKGo9MDtqPGps ZW47aisrKXt2YXIgYXR0cmlidXRlPWZlYXR1cmVOb2RlLmF0dHJpYnV0ZXNbal07 YXR0cmlidXRlc1thdHRyaWJ1dGUubm9kZU5hbWVdPWF0dHJpYnV0ZS5ub2RlVmFs dWU7fX1lbHNle3ZhciBub2Rlcz1mZWF0dXJlTm9kZS5jaGlsZE5vZGVzO2Zvcihq PTAsamxlbj1ub2Rlcy5sZW5ndGg7ajxqbGVuOysrail7dmFyIG5vZGU9bm9kZXNb al07aWYobm9kZS5ub2RlVHlwZSE9Myl7YXR0cmlidXRlc1tub2RlLmdldEF0dHJp YnV0ZSgibmFtZSIpXT1ub2RlLmdldEF0dHJpYnV0ZSgidmFsdWUiKTt9fX0KcmVz cG9uc2UucHVzaChuZXcgT3BlbkxheWVycy5GZWF0dXJlLlZlY3RvcihnZW9tLGF0 dHJpYnV0ZXMsbnVsbCkpO30KcmV0dXJuIHJlc3BvbnNlO30sZ2V0U2libGluZ05v ZGVzQnlUYWdDcml0ZXJpYTpmdW5jdGlvbihub2RlLGNyaXRlcmlhKXt2YXIgbm9k ZXM9W107dmFyIGNoaWxkcmVuLHRhZ05hbWUsbixtYXRjaE5vZGVzLGNoaWxkO2lm KG5vZGUmJm5vZGUuaGFzQ2hpbGROb2RlcygpKXtjaGlsZHJlbj1ub2RlLmNoaWxk Tm9kZXM7bj1jaGlsZHJlbi5sZW5ndGg7Zm9yKHZhciBrPTA7azxuO2srKyl7Y2hp bGQ9Y2hpbGRyZW5ba107d2hpbGUoY2hpbGQmJmNoaWxkLm5vZGVUeXBlIT0xKXtj aGlsZD1jaGlsZC5uZXh0U2libGluZztrKys7fQp0YWdOYW1lPShjaGlsZD9jaGls ZC5ub2RlTmFtZTonJyk7aWYodGFnTmFtZS5sZW5ndGg+MCYmdGFnTmFtZS5pbmRl eE9mKGNyaXRlcmlhKT4tMSl7bm9kZXMucHVzaChjaGlsZCk7fWVsc2V7bWF0Y2hO b2Rlcz10aGlzLmdldFNpYmxpbmdOb2Rlc0J5VGFnQ3JpdGVyaWEoY2hpbGQsY3Jp dGVyaWEpO2lmKG1hdGNoTm9kZXMubGVuZ3RoPjApeyhub2Rlcy5sZW5ndGg9PTAp P25vZGVzPW1hdGNoTm9kZXM6bm9kZXMucHVzaChtYXRjaE5vZGVzKTt9fX19CnJl dHVybiBub2Rlczt9LHBhcnNlQXR0cmlidXRlczpmdW5jdGlvbihub2RlKXt2YXIg YXR0cmlidXRlcz17fTtpZihub2RlLm5vZGVUeXBlPT0xKXt2YXIgY2hpbGRyZW49 bm9kZS5jaGlsZE5vZGVzO3ZhciBuPWNoaWxkcmVuLmxlbmd0aDtmb3IodmFyIGk9 MDtpPG47KytpKXt2YXIgY2hpbGQ9Y2hpbGRyZW5baV07aWYoY2hpbGQubm9kZVR5 cGU9PTEpe3ZhciBncmFuZGNoaWxkcmVuPWNoaWxkLmNoaWxkTm9kZXM7dmFyIG5h bWU9KGNoaWxkLnByZWZpeCk/Y2hpbGQubm9kZU5hbWUuc3BsaXQoIjoiKVsxXTpj aGlsZC5ub2RlTmFtZTtpZihncmFuZGNoaWxkcmVuLmxlbmd0aD09MCl7YXR0cmli dXRlc1tuYW1lXT1udWxsfWVsc2UgaWYoZ3JhbmRjaGlsZHJlbi5sZW5ndGg9PTEp e3ZhciBncmFuZGNoaWxkPWdyYW5kY2hpbGRyZW5bMF07aWYoZ3JhbmRjaGlsZC5u b2RlVHlwZT09M3x8Z3JhbmRjaGlsZC5ub2RlVHlwZT09NCl7dmFyIHZhbHVlPWdy YW5kY2hpbGQubm9kZVZhbHVlLnJlcGxhY2UodGhpcy5yZWdFeGVzLnRyaW1TcGFj ZSwiIik7YXR0cmlidXRlc1tuYW1lXT12YWx1ZTt9fX19fQpyZXR1cm4gYXR0cmli dXRlczt9LHBhcnNlR2VvbWV0cnk6ZnVuY3Rpb24obm9kZSl7aWYoIXRoaXMuZ21s Rm9ybWF0KXt0aGlzLmdtbEZvcm1hdD1uZXcgT3BlbkxheWVycy5Gb3JtYXQuR01M KCk7fQp2YXIgZmVhdHVyZT10aGlzLmdtbEZvcm1hdC5wYXJzZUZlYXR1cmUobm9k ZSk7dmFyIGdlb21ldHJ5LGJvdW5kcz1udWxsO2lmKGZlYXR1cmUpe2dlb21ldHJ5 PWZlYXR1cmUuZ2VvbWV0cnkmJmZlYXR1cmUuZ2VvbWV0cnkuY2xvbmUoKTtib3Vu ZHM9ZmVhdHVyZS5ib3VuZHMmJmZlYXR1cmUuYm91bmRzLmNsb25lKCk7ZmVhdHVy ZS5kZXN0cm95KCk7fQpyZXR1cm57Z2VvbWV0cnk6Z2VvbWV0cnksYm91bmRzOmJv dW5kc307fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5XTVNHZXRGZWF0 dXJlSW5mbyJ9KTtPcGVuTGF5ZXJzLkNvbnRyb2wuV01UU0dldEZlYXR1cmVJbmZv PU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Db250cm9sLHtob3ZlcjpmYWxz ZSxyZXF1ZXN0RW5jb2Rpbmc6IktWUCIsZHJpbGxEb3duOmZhbHNlLG1heEZlYXR1 cmVzOjEwLGNsaWNrQ2FsbGJhY2s6ImNsaWNrIixsYXllcnM6bnVsbCxxdWVyeVZp c2libGU6dHJ1ZSxpbmZvRm9ybWF0Oid0ZXh0L2h0bWwnLHZlbmRvclBhcmFtczp7 fSxmb3JtYXQ6bnVsbCxmb3JtYXRPcHRpb25zOm51bGwsaGFuZGxlck9wdGlvbnM6 bnVsbCxoYW5kbGVyOm51bGwsaG92ZXJSZXF1ZXN0Om51bGwsRVZFTlRfVFlQRVM6 WyJiZWZvcmVnZXRmZWF0dXJlaW5mbyIsImdldGZlYXR1cmVpbmZvIiwiZXhjZXB0 aW9uIl0scGVuZGluZzowLGluaXRpYWxpemU6ZnVuY3Rpb24ob3B0aW9ucyl7dGhp cy5FVkVOVF9UWVBFUz1PcGVuTGF5ZXJzLkNvbnRyb2wuV01UU0dldEZlYXR1cmVJ bmZvLnByb3RvdHlwZS5FVkVOVF9UWVBFUy5jb25jYXQoT3BlbkxheWVycy5Db250 cm9sLnByb3RvdHlwZS5FVkVOVF9UWVBFUyk7b3B0aW9ucz1vcHRpb25zfHx7fTtv cHRpb25zLmhhbmRsZXJPcHRpb25zPW9wdGlvbnMuaGFuZGxlck9wdGlvbnN8fHt9 O09wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0 aGlzLFtvcHRpb25zXSk7aWYoIXRoaXMuZm9ybWF0KXt0aGlzLmZvcm1hdD1uZXcg T3BlbkxheWVycy5Gb3JtYXQuV01TR2V0RmVhdHVyZUluZm8ob3B0aW9ucy5mb3Jt YXRPcHRpb25zKTt9CmlmKHRoaXMuZHJpbGxEb3duPT09dHJ1ZSl7dGhpcy5ob3Zl cj1mYWxzZTt9CmlmKHRoaXMuaG92ZXIpe3RoaXMuaGFuZGxlcj1uZXcgT3Blbkxh eWVycy5IYW5kbGVyLkhvdmVyKHRoaXMse21vdmU6dGhpcy5jYW5jZWxIb3Zlcixw YXVzZTp0aGlzLmdldEluZm9Gb3JIb3Zlcn0sT3BlbkxheWVycy5VdGlsLmV4dGVu ZCh0aGlzLmhhbmRsZXJPcHRpb25zLmhvdmVyfHx7fSx7ZGVsYXk6MjUwfSkpO31l bHNle3ZhciBjYWxsYmFja3M9e307Y2FsbGJhY2tzW3RoaXMuY2xpY2tDYWxsYmFj a109dGhpcy5nZXRJbmZvRm9yQ2xpY2s7dGhpcy5oYW5kbGVyPW5ldyBPcGVuTGF5 ZXJzLkhhbmRsZXIuQ2xpY2sodGhpcyxjYWxsYmFja3MsdGhpcy5oYW5kbGVyT3B0 aW9ucy5jbGlja3x8e30pO319LGdldEluZm9Gb3JDbGljazpmdW5jdGlvbihldnQp e3RoaXMucmVxdWVzdChldnQueHkse30pO30sZ2V0SW5mb0ZvckhvdmVyOmZ1bmN0 aW9uKGV2dCl7dGhpcy5yZXF1ZXN0KGV2dC54eSx7aG92ZXI6dHJ1ZX0pO30sY2Fu Y2VsSG92ZXI6ZnVuY3Rpb24oKXtpZih0aGlzLmhvdmVyUmVxdWVzdCl7LS10aGlz LnBlbmRpbmc7aWYodGhpcy5wZW5kaW5nPD0wKXtPcGVuTGF5ZXJzLkVsZW1lbnQu cmVtb3ZlQ2xhc3ModGhpcy5tYXAudmlld1BvcnREaXYsIm9sQ3Vyc29yV2FpdCIp O3RoaXMucGVuZGluZz0wO30KdGhpcy5ob3ZlclJlcXVlc3QuYWJvcnQoKTt0aGlz LmhvdmVyUmVxdWVzdD1udWxsO319LGZpbmRMYXllcnM6ZnVuY3Rpb24oKXt2YXIg Y2FuZGlkYXRlcz10aGlzLmxheWVyc3x8dGhpcy5tYXAubGF5ZXJzO3ZhciBsYXll cnM9W107dmFyIGxheWVyO2Zvcih2YXIgaT1jYW5kaWRhdGVzLmxlbmd0aC0xO2k+ PTA7LS1pKXtsYXllcj1jYW5kaWRhdGVzW2ldO2lmKGxheWVyIGluc3RhbmNlb2Yg T3BlbkxheWVycy5MYXllci5XTVRTJiZsYXllci5yZXF1ZXN0RW5jb2Rpbmc9PT10 aGlzLnJlcXVlc3RFbmNvZGluZyYmKCF0aGlzLnF1ZXJ5VmlzaWJsZXx8bGF5ZXIu Z2V0VmlzaWJpbGl0eSgpKSl7bGF5ZXJzLnB1c2gobGF5ZXIpO2lmKCF0aGlzLmRy aWxsRG93bnx8dGhpcy5ob3Zlcil7YnJlYWs7fX19CnJldHVybiBsYXllcnM7fSxi dWlsZFJlcXVlc3RPcHRpb25zOmZ1bmN0aW9uKGxheWVyLHh5KXt2YXIgbG9jPXRo aXMubWFwLmdldExvbkxhdEZyb21QaXhlbCh4eSk7dmFyIGdldFRpbGVVcmw9bGF5 ZXIuZ2V0VVJMKG5ldyBPcGVuTGF5ZXJzLkJvdW5kcyhsb2MubG9uLGxvYy5sYXQs bG9jLmxvbixsb2MubGF0KSk7dmFyIHBhcmFtcz1PcGVuTGF5ZXJzLlV0aWwuZ2V0 UGFyYW1ldGVycyhnZXRUaWxlVXJsKTt2YXIgdGlsZUluZm89bGF5ZXIuZ2V0VGls ZUluZm8obG9jKTtPcGVuTGF5ZXJzLlV0aWwuZXh0ZW5kKHBhcmFtcyx7c2Vydmlj ZToiV01UUyIsdmVyc2lvbjpsYXllci52ZXJzaW9uLHJlcXVlc3Q6IkdldEZlYXR1 cmVJbmZvIixpbmZvRm9ybWF0OnRoaXMuaW5mb0Zvcm1hdCxpOnRpbGVJbmZvLmks ajp0aWxlSW5mby5qfSk7T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMocGFy YW1zLHRoaXMudmVuZG9yUGFyYW1zKTtyZXR1cm57dXJsOk9wZW5MYXllcnMuVXRp bC5pc0FycmF5KGxheWVyLnVybCk/bGF5ZXIudXJsWzBdOmxheWVyLnVybCxwYXJh bXM6T3BlbkxheWVycy5VdGlsLnVwcGVyQ2FzZU9iamVjdChwYXJhbXMpLGNhbGxi YWNrOmZ1bmN0aW9uKHJlcXVlc3Qpe3RoaXMuaGFuZGxlUmVzcG9uc2UoeHkscmVx dWVzdCxsYXllcik7fSxzY29wZTp0aGlzfTt9LHJlcXVlc3Q6ZnVuY3Rpb24oeHks b3B0aW9ucyl7b3B0aW9ucz1vcHRpb25zfHx7fTt2YXIgbGF5ZXJzPXRoaXMuZmlu ZExheWVycygpO2lmKGxheWVycy5sZW5ndGg+MCl7dmFyIGlzc3VlLGxheWVyO2Zv cih2YXIgaT0wLGxlbj1sYXllcnMubGVuZ3RoO2k8bGVuO2krKyl7bGF5ZXI9bGF5 ZXJzW2ldO2lzc3VlPXRoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgiYmVmb3JlZ2V0 ZmVhdHVyZWluZm8iLHt4eTp4eSxsYXllcjpsYXllcn0pO2lmKGlzc3VlIT09ZmFs c2UpeysrdGhpcy5wZW5kaW5nO3ZhciByZXF1ZXN0T3B0aW9ucz10aGlzLmJ1aWxk UmVxdWVzdE9wdGlvbnMobGF5ZXIseHkpO3ZhciByZXF1ZXN0PU9wZW5MYXllcnMu UmVxdWVzdC5HRVQocmVxdWVzdE9wdGlvbnMpO2lmKG9wdGlvbnMuaG92ZXI9PT10 cnVlKXt0aGlzLmhvdmVyUmVxdWVzdD1yZXF1ZXN0O319fQppZih0aGlzLnBlbmRp bmc+MCl7T3BlbkxheWVycy5FbGVtZW50LmFkZENsYXNzKHRoaXMubWFwLnZpZXdQ b3J0RGl2LCJvbEN1cnNvcldhaXQiKTt9fX0saGFuZGxlUmVzcG9uc2U6ZnVuY3Rp b24oeHkscmVxdWVzdCxsYXllcil7LS10aGlzLnBlbmRpbmc7aWYodGhpcy5wZW5k aW5nPD0wKXtPcGVuTGF5ZXJzLkVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5tYXAu dmlld1BvcnREaXYsIm9sQ3Vyc29yV2FpdCIpO3RoaXMucGVuZGluZz0wO30KaWYo cmVxdWVzdC5zdGF0dXMmJihyZXF1ZXN0LnN0YXR1czwyMDB8fHJlcXVlc3Quc3Rh dHVzPj0zMDApKXt0aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQoImV4Y2VwdGlvbiIs e3h5Onh5LHJlcXVlc3Q6cmVxdWVzdCxsYXllcjpsYXllcn0pO31lbHNle3ZhciBk b2M9cmVxdWVzdC5yZXNwb25zZVhNTDtpZighZG9jfHwhZG9jLmRvY3VtZW50RWxl bWVudCl7ZG9jPXJlcXVlc3QucmVzcG9uc2VUZXh0O30KdmFyIGZlYXR1cmVzLGV4 Y2VwdDt0cnl7ZmVhdHVyZXM9dGhpcy5mb3JtYXQucmVhZChkb2MpO31jYXRjaChl cnJvcil7ZXhjZXB0PXRydWU7dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50KCJleGNl cHRpb24iLHt4eTp4eSxyZXF1ZXN0OnJlcXVlc3QsZXJyb3I6ZXJyb3IsbGF5ZXI6 bGF5ZXJ9KTt9CmlmKCFleGNlcHQpe3RoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgi Z2V0ZmVhdHVyZWluZm8iLHt0ZXh0OnJlcXVlc3QucmVzcG9uc2VUZXh0LGZlYXR1 cmVzOmZlYXR1cmVzLHJlcXVlc3Q6cmVxdWVzdCx4eTp4eSxsYXllcjpsYXllcn0p O319fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkNvbnRyb2wuV01UU0dldEZlYXR1 cmVJbmZvIn0pO09wZW5MYXllcnMuRm9ybWF0LldNU0NhcGFiaWxpdGllcy52MV8x PU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Gb3JtYXQuV01TQ2FwYWJpbGl0 aWVzLnYxLHtyZWFkZXJzOnsid21zIjpPcGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZh dWx0cyh7IldNVF9NU19DYXBhYmlsaXRpZXMiOmZ1bmN0aW9uKG5vZGUsb2JqKXt0 aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqKTt9LCJLZXl3b3JkIjpmdW5jdGlv bihub2RlLG9iail7aWYob2JqLmtleXdvcmRzKXtvYmoua2V5d29yZHMucHVzaCh0 aGlzLmdldENoaWxkVmFsdWUobm9kZSkpO319LCJEZXNjcmliZUxheWVyIjpmdW5j dGlvbihub2RlLG9iail7b2JqLmRlc2NyaWJlbGF5ZXI9e2Zvcm1hdHM6W119O3Ro aXMucmVhZENoaWxkTm9kZXMobm9kZSxvYmouZGVzY3JpYmVsYXllcik7fSwiR2V0 TGVnZW5kR3JhcGhpYyI6ZnVuY3Rpb24obm9kZSxvYmope29iai5nZXRsZWdlbmRn cmFwaGljPXtmb3JtYXRzOltdfTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2Jq LmdldGxlZ2VuZGdyYXBoaWMpO30sIkdldFN0eWxlcyI6ZnVuY3Rpb24obm9kZSxv Ymope29iai5nZXRzdHlsZXM9e2Zvcm1hdHM6W119O3RoaXMucmVhZENoaWxkTm9k ZXMobm9kZSxvYmouZ2V0c3R5bGVzKTt9LCJQdXRTdHlsZXMiOmZ1bmN0aW9uKG5v ZGUsb2JqKXtvYmoucHV0c3R5bGVzPXtmb3JtYXRzOltdfTt0aGlzLnJlYWRDaGls ZE5vZGVzKG5vZGUsb2JqLnB1dHN0eWxlcyk7fSwiVXNlckRlZmluZWRTeW1ib2xp emF0aW9uIjpmdW5jdGlvbihub2RlLG9iail7dmFyIHVzZXJTeW1ib2xzPXtzdXBw b3J0U0xEOnBhcnNlSW50KG5vZGUuZ2V0QXR0cmlidXRlKCJTdXBwb3J0U0xEIikp PT0xLHVzZXJMYXllcjpwYXJzZUludChub2RlLmdldEF0dHJpYnV0ZSgiVXNlckxh eWVyIikpPT0xLHVzZXJTdHlsZTpwYXJzZUludChub2RlLmdldEF0dHJpYnV0ZSgi VXNlclN0eWxlIikpPT0xLHJlbW90ZVdGUzpwYXJzZUludChub2RlLmdldEF0dHJp YnV0ZSgiUmVtb3RlV0ZTIikpPT0xfTtvYmoudXNlclN5bWJvbHM9dXNlclN5bWJv bHM7fSwiTGF0TG9uQm91bmRpbmdCb3giOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmou bGxiYm94PVtwYXJzZUZsb2F0KG5vZGUuZ2V0QXR0cmlidXRlKCJtaW54IikpLHBh cnNlRmxvYXQobm9kZS5nZXRBdHRyaWJ1dGUoIm1pbnkiKSkscGFyc2VGbG9hdChu b2RlLmdldEF0dHJpYnV0ZSgibWF4eCIpKSxwYXJzZUZsb2F0KG5vZGUuZ2V0QXR0 cmlidXRlKCJtYXh5IikpXTt9LCJCb3VuZGluZ0JveCI6ZnVuY3Rpb24obm9kZSxv Ymope3ZhciBiYm94PU9wZW5MYXllcnMuRm9ybWF0LldNU0NhcGFiaWxpdGllcy52 MS5wcm90b3R5cGUucmVhZGVyc1sid21zIl0uQm91bmRpbmdCb3guYXBwbHkodGhp cyxbbm9kZSxvYmpdKTtiYm94LnNycz1ub2RlLmdldEF0dHJpYnV0ZSgiU1JTIik7 b2JqLmJib3hbYmJveC5zcnNdPWJib3g7fSwiU2NhbGVIaW50IjpmdW5jdGlvbihu b2RlLG9iail7dmFyIG1pbj1ub2RlLmdldEF0dHJpYnV0ZSgibWluIik7dmFyIG1h eD1ub2RlLmdldEF0dHJpYnV0ZSgibWF4Iik7dmFyIHJhZDI9TWF0aC5wb3coMiww LjUpO3ZhciBpcG09T3BlbkxheWVycy5JTkNIRVNfUEVSX1VOSVRbIm0iXTtvYmou bWF4U2NhbGU9cGFyc2VGbG9hdCgoKG1pbi9yYWQyKSppcG0qT3BlbkxheWVycy5E T1RTX1BFUl9JTkNIKS50b1ByZWNpc2lvbigxMykpO29iai5taW5TY2FsZT1wYXJz ZUZsb2F0KCgobWF4L3JhZDIpKmlwbSpPcGVuTGF5ZXJzLkRPVFNfUEVSX0lOQ0gp LnRvUHJlY2lzaW9uKDEzKSk7fSwiRGltZW5zaW9uIjpmdW5jdGlvbihub2RlLG9i ail7dmFyIG5hbWU9bm9kZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKS50b0xvd2VyQ2Fz ZSgpO3ZhciBkaW09e25hbWU6bmFtZSx1bml0czpub2RlLmdldEF0dHJpYnV0ZSgi dW5pdHMiKSx1bml0c3ltYm9sOm5vZGUuZ2V0QXR0cmlidXRlKCJ1bml0U3ltYm9s Iil9O29iai5kaW1lbnNpb25zW2RpbS5uYW1lXT1kaW07fSwiRXh0ZW50IjpmdW5j dGlvbihub2RlLG9iail7dmFyIG5hbWU9bm9kZS5nZXRBdHRyaWJ1dGUoIm5hbWUi KS50b0xvd2VyQ2FzZSgpO2lmKG5hbWUgaW4gb2JqWyJkaW1lbnNpb25zIl0pe3Zh ciBleHRlbnQ9b2JqLmRpbWVuc2lvbnNbbmFtZV07ZXh0ZW50Lm5lYXJlc3RWYWw9 bm9kZS5nZXRBdHRyaWJ1dGUoIm5lYXJlc3RWYWx1ZSIpPT09IjEiO2V4dGVudC5t dWx0aXBsZVZhbD1ub2RlLmdldEF0dHJpYnV0ZSgibXVsdGlwbGVWYWx1ZXMiKT09 PSIxIjtleHRlbnQuY3VycmVudD1ub2RlLmdldEF0dHJpYnV0ZSgiY3VycmVudCIp PT09IjEiO2V4dGVudFsiZGVmYXVsdCJdPW5vZGUuZ2V0QXR0cmlidXRlKCJkZWZh dWx0Iil8fCIiO3ZhciB2YWx1ZXM9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpO2V4 dGVudC52YWx1ZXM9dmFsdWVzLnNwbGl0KCIsIik7fX19LE9wZW5MYXllcnMuRm9y bWF0LldNU0NhcGFiaWxpdGllcy52MS5wcm90b3R5cGUucmVhZGVyc1sid21zIl0p fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5XTVNDYXBhYmlsaXRpZXMu djFfMSJ9KTtPcGVuTGF5ZXJzLkNvbnRyb2wuR3JhdGljdWxlPU9wZW5MYXllcnMu Q2xhc3MoT3BlbkxheWVycy5Db250cm9sLHthdXRvQWN0aXZhdGU6dHJ1ZSxpbnRl cnZhbHM6WzQ1LDMwLDIwLDEwLDUsMiwxLDAuNSwwLjIsMC4xLDAuMDUsMC4wMSww LjAwNSwwLjAwMiwwLjAwMV0sZGlzcGxheUluTGF5ZXJTd2l0Y2hlcjp0cnVlLHZp c2libGU6dHJ1ZSxudW1Qb2ludHM6NTAsdGFyZ2V0U2l6ZToyMDAsbGF5ZXJOYW1l Om51bGwsbGFiZWxsZWQ6dHJ1ZSxsYWJlbEZvcm1hdDonZG0nLGxpbmVTeW1ib2xp emVyOntzdHJva2VDb2xvcjoiIzMzMyIsc3Ryb2tlV2lkdGg6MSxzdHJva2VPcGFj aXR5OjAuNX0sbGFiZWxTeW1ib2xpemVyOnt9LGdyYXRMYXllcjpudWxsLGluaXRp YWxpemU6ZnVuY3Rpb24ob3B0aW9ucyl7b3B0aW9ucz1vcHRpb25zfHx7fTtvcHRp b25zLmxheWVyTmFtZT1vcHRpb25zLmxheWVyTmFtZXx8T3BlbkxheWVycy5pMThu KCJHcmF0aWN1bGUiKTtPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90eXBlLmluaXRp YWxpemUuYXBwbHkodGhpcyxbb3B0aW9uc10pO3RoaXMubGFiZWxTeW1ib2xpemVy LnN0cm9rZT1mYWxzZTt0aGlzLmxhYmVsU3ltYm9saXplci5maWxsPWZhbHNlO3Ro aXMubGFiZWxTeW1ib2xpemVyLmxhYmVsPSIke2xhYmVsfSI7dGhpcy5sYWJlbFN5 bWJvbGl6ZXIubGFiZWxBbGlnbj0iJHtsYWJlbEFsaWdufSI7dGhpcy5sYWJlbFN5 bWJvbGl6ZXIubGFiZWxYT2Zmc2V0PSIke3hPZmZzZXR9Ijt0aGlzLmxhYmVsU3lt Ym9saXplci5sYWJlbFlPZmZzZXQ9IiR7eU9mZnNldH0iO30sZGVzdHJveTpmdW5j dGlvbigpe3RoaXMuZGVhY3RpdmF0ZSgpO09wZW5MYXllcnMuQ29udHJvbC5wcm90 b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYodGhpcy5ncmF0 TGF5ZXIpe3RoaXMuZ3JhdExheWVyLmRlc3Ryb3koKTt0aGlzLmdyYXRMYXllcj1u dWxsO319LGRyYXc6ZnVuY3Rpb24oKXtPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90 eXBlLmRyYXcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmdyYXRMYXll cil7dmFyIGdyYXRTdHlsZT1uZXcgT3BlbkxheWVycy5TdHlsZSh7fSx7cnVsZXM6 W25ldyBPcGVuTGF5ZXJzLlJ1bGUoeydzeW1ib2xpemVyJzp7IlBvaW50Ijp0aGlz LmxhYmVsU3ltYm9saXplciwiTGluZSI6dGhpcy5saW5lU3ltYm9saXplcn19KV19 KTt0aGlzLmdyYXRMYXllcj1uZXcgT3BlbkxheWVycy5MYXllci5WZWN0b3IodGhp cy5sYXllck5hbWUse3N0eWxlTWFwOm5ldyBPcGVuTGF5ZXJzLlN0eWxlTWFwKHsn ZGVmYXVsdCc6Z3JhdFN0eWxlfSksdmlzaWJpbGl0eTp0aGlzLnZpc2libGUsZGlz cGxheUluTGF5ZXJTd2l0Y2hlcjp0aGlzLmRpc3BsYXlJbkxheWVyU3dpdGNoZXJ9 KTt9CnJldHVybiB0aGlzLmRpdjt9LGFjdGl2YXRlOmZ1bmN0aW9uKCl7aWYoT3Bl bkxheWVycy5Db250cm9sLnByb3RvdHlwZS5hY3RpdmF0ZS5hcHBseSh0aGlzLGFy Z3VtZW50cykpe3RoaXMubWFwLmFkZExheWVyKHRoaXMuZ3JhdExheWVyKTt0aGlz Lm1hcC5ldmVudHMucmVnaXN0ZXIoJ21vdmVlbmQnLHRoaXMsdGhpcy51cGRhdGUp O3RoaXMudXBkYXRlKCk7cmV0dXJuIHRydWU7fWVsc2V7cmV0dXJuIGZhbHNlO319 LGRlYWN0aXZhdGU6ZnVuY3Rpb24oKXtpZihPcGVuTGF5ZXJzLkNvbnRyb2wucHJv dG90eXBlLmRlYWN0aXZhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt0aGlzLm1h cC5ldmVudHMudW5yZWdpc3RlcignbW92ZWVuZCcsdGhpcyx0aGlzLnVwZGF0ZSk7 dGhpcy5tYXAucmVtb3ZlTGF5ZXIodGhpcy5ncmF0TGF5ZXIpO3JldHVybiB0cnVl O31lbHNle3JldHVybiBmYWxzZTt9fSx1cGRhdGU6ZnVuY3Rpb24oKXt2YXIgbWFw Qm91bmRzPXRoaXMubWFwLmdldEV4dGVudCgpO2lmKCFtYXBCb3VuZHMpe3JldHVy bjt9CnRoaXMuZ3JhdExheWVyLmRlc3Ryb3lGZWF0dXJlcygpO3ZhciBsbFByb2o9 bmV3IE9wZW5MYXllcnMuUHJvamVjdGlvbigiRVBTRzo0MzI2Iik7dmFyIG1hcFBy b2o9dGhpcy5tYXAuZ2V0UHJvamVjdGlvbk9iamVjdCgpO3ZhciBtYXBSZXM9dGhp cy5tYXAuZ2V0UmVzb2x1dGlvbigpO2lmKG1hcFByb2oucHJvaiYmbWFwUHJvai5w cm9qLnByb2pOYW1lPT0ibG9uZ2xhdCIpe3RoaXMubnVtUG9pbnRzPTE7fQp2YXIg bWFwQ2VudGVyPXRoaXMubWFwLmdldENlbnRlcigpO3ZhciBtYXBDZW50ZXJMTD1u ZXcgT3BlbkxheWVycy5QaXhlbChtYXBDZW50ZXIubG9uLG1hcENlbnRlci5sYXQp O09wZW5MYXllcnMuUHJvamVjdGlvbi50cmFuc2Zvcm0obWFwQ2VudGVyTEwsbWFw UHJvaixsbFByb2opO3ZhciB0ZXN0U3E9dGhpcy50YXJnZXRTaXplKm1hcFJlczt0 ZXN0U3EqPXRlc3RTcTt2YXIgbGxJbnRlcnZhbDtmb3IodmFyIGk9MDtpPHRoaXMu aW50ZXJ2YWxzLmxlbmd0aDsrK2kpe2xsSW50ZXJ2YWw9dGhpcy5pbnRlcnZhbHNb aV07dmFyIGRlbHRhPWxsSW50ZXJ2YWwvMjt2YXIgcDE9bWFwQ2VudGVyTEwub2Zm c2V0KG5ldyBPcGVuTGF5ZXJzLlBpeGVsKC1kZWx0YSwtZGVsdGEpKTt2YXIgcDI9 bWFwQ2VudGVyTEwub2Zmc2V0KG5ldyBPcGVuTGF5ZXJzLlBpeGVsKGRlbHRhLGRl bHRhKSk7T3BlbkxheWVycy5Qcm9qZWN0aW9uLnRyYW5zZm9ybShwMSxsbFByb2os bWFwUHJvaik7T3BlbkxheWVycy5Qcm9qZWN0aW9uLnRyYW5zZm9ybShwMixsbFBy b2osbWFwUHJvaik7dmFyIGRpc3RTcT0ocDEueC1wMi54KSoocDEueC1wMi54KSso cDEueS1wMi55KSoocDEueS1wMi55KTtpZihkaXN0U3E8PXRlc3RTcSl7YnJlYWs7 fX0KbWFwQ2VudGVyTEwueD1NYXRoLmZsb29yKG1hcENlbnRlckxMLngvbGxJbnRl cnZhbCkqbGxJbnRlcnZhbDttYXBDZW50ZXJMTC55PU1hdGguZmxvb3IobWFwQ2Vu dGVyTEwueS9sbEludGVydmFsKSpsbEludGVydmFsO3ZhciBpdGVyPTA7dmFyIGNl bnRlckxvblBvaW50cz1bbWFwQ2VudGVyTEwuY2xvbmUoKV07dmFyIG5ld1BvaW50 PW1hcENlbnRlckxMLmNsb25lKCk7dmFyIG1hcFhZO2Rve25ld1BvaW50PW5ld1Bv aW50Lm9mZnNldChuZXcgT3BlbkxheWVycy5QaXhlbCgwLGxsSW50ZXJ2YWwpKTtt YXBYWT1PcGVuTGF5ZXJzLlByb2plY3Rpb24udHJhbnNmb3JtKG5ld1BvaW50LmNs b25lKCksbGxQcm9qLG1hcFByb2opO2NlbnRlckxvblBvaW50cy51bnNoaWZ0KG5l d1BvaW50KTt9d2hpbGUobWFwQm91bmRzLmNvbnRhaW5zUGl4ZWwobWFwWFkpJiYr K2l0ZXI8MTAwMCk7bmV3UG9pbnQ9bWFwQ2VudGVyTEwuY2xvbmUoKTtkb3tuZXdQ b2ludD1uZXdQb2ludC5vZmZzZXQobmV3IE9wZW5MYXllcnMuUGl4ZWwoMCwtbGxJ bnRlcnZhbCkpO21hcFhZPU9wZW5MYXllcnMuUHJvamVjdGlvbi50cmFuc2Zvcm0o bmV3UG9pbnQuY2xvbmUoKSxsbFByb2osbWFwUHJvaik7Y2VudGVyTG9uUG9pbnRz LnB1c2gobmV3UG9pbnQpO313aGlsZShtYXBCb3VuZHMuY29udGFpbnNQaXhlbCht YXBYWSkmJisraXRlcjwxMDAwKTtpdGVyPTA7dmFyIGNlbnRlckxhdFBvaW50cz1b bWFwQ2VudGVyTEwuY2xvbmUoKV07bmV3UG9pbnQ9bWFwQ2VudGVyTEwuY2xvbmUo KTtkb3tuZXdQb2ludD1uZXdQb2ludC5vZmZzZXQobmV3IE9wZW5MYXllcnMuUGl4 ZWwoLWxsSW50ZXJ2YWwsMCkpO21hcFhZPU9wZW5MYXllcnMuUHJvamVjdGlvbi50 cmFuc2Zvcm0obmV3UG9pbnQuY2xvbmUoKSxsbFByb2osbWFwUHJvaik7Y2VudGVy TGF0UG9pbnRzLnVuc2hpZnQobmV3UG9pbnQpO313aGlsZShtYXBCb3VuZHMuY29u dGFpbnNQaXhlbChtYXBYWSkmJisraXRlcjwxMDAwKTtuZXdQb2ludD1tYXBDZW50 ZXJMTC5jbG9uZSgpO2Rve25ld1BvaW50PW5ld1BvaW50Lm9mZnNldChuZXcgT3Bl bkxheWVycy5QaXhlbChsbEludGVydmFsLDApKTttYXBYWT1PcGVuTGF5ZXJzLlBy b2plY3Rpb24udHJhbnNmb3JtKG5ld1BvaW50LmNsb25lKCksbGxQcm9qLG1hcFBy b2opO2NlbnRlckxhdFBvaW50cy5wdXNoKG5ld1BvaW50KTt9d2hpbGUobWFwQm91 bmRzLmNvbnRhaW5zUGl4ZWwobWFwWFkpJiYrK2l0ZXI8MTAwMCk7dmFyIGxpbmVz PVtdO2Zvcih2YXIgaT0wO2k8Y2VudGVyTGF0UG9pbnRzLmxlbmd0aDsrK2kpe3Zh ciBsb249Y2VudGVyTGF0UG9pbnRzW2ldLng7dmFyIHBvaW50TGlzdD1bXTt2YXIg bGFiZWxQb2ludD1udWxsO3ZhciBsYXRFbmQ9TWF0aC5taW4oY2VudGVyTG9uUG9p bnRzWzBdLnksOTApO3ZhciBsYXRTdGFydD1NYXRoLm1heChjZW50ZXJMb25Qb2lu dHNbY2VudGVyTG9uUG9pbnRzLmxlbmd0aC0xXS55LC05MCk7dmFyIGxhdERlbHRh PShsYXRFbmQtbGF0U3RhcnQpL3RoaXMubnVtUG9pbnRzO3ZhciBsYXQ9bGF0U3Rh cnQ7Zm9yKHZhciBqPTA7ajw9dGhpcy5udW1Qb2ludHM7KytqKXt2YXIgZ3JpZFBv aW50PW5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KGxvbixsYXQpO2dyaWRQ b2ludC50cmFuc2Zvcm0obGxQcm9qLG1hcFByb2opO3BvaW50TGlzdC5wdXNoKGdy aWRQb2ludCk7bGF0Kz1sYXREZWx0YTtpZihncmlkUG9pbnQueT49bWFwQm91bmRz LmJvdHRvbSYmIWxhYmVsUG9pbnQpe2xhYmVsUG9pbnQ9Z3JpZFBvaW50O319Cmlm KHRoaXMubGFiZWxsZWQpe3ZhciBsYWJlbFBvcz1uZXcgT3BlbkxheWVycy5HZW9t ZXRyeS5Qb2ludChsYWJlbFBvaW50LngsbWFwQm91bmRzLmJvdHRvbSk7dmFyIGxh YmVsQXR0cnM9e3ZhbHVlOmxvbixsYWJlbDp0aGlzLmxhYmVsbGVkP09wZW5MYXll cnMuVXRpbC5nZXRGb3JtYXR0ZWRMb25MYXQobG9uLCJsb24iLHRoaXMubGFiZWxG b3JtYXQpOiIiLGxhYmVsQWxpZ246ImNiIix4T2Zmc2V0OjAseU9mZnNldDoyfTt0 aGlzLmdyYXRMYXllci5hZGRGZWF0dXJlcyhuZXcgT3BlbkxheWVycy5GZWF0dXJl LlZlY3RvcihsYWJlbFBvcyxsYWJlbEF0dHJzKSk7fQp2YXIgZ2VvbT1uZXcgT3Bl bkxheWVycy5HZW9tZXRyeS5MaW5lU3RyaW5nKHBvaW50TGlzdCk7bGluZXMucHVz aChuZXcgT3BlbkxheWVycy5GZWF0dXJlLlZlY3RvcihnZW9tKSk7fQpmb3IodmFy IGo9MDtqPGNlbnRlckxvblBvaW50cy5sZW5ndGg7KytqKXtsYXQ9Y2VudGVyTG9u UG9pbnRzW2pdLnk7aWYobGF0PC05MHx8bGF0PjkwKXtjb250aW51ZTt9CnZhciBw b2ludExpc3Q9W107dmFyIGxvblN0YXJ0PWNlbnRlckxhdFBvaW50c1swXS54O3Zh ciBsb25FbmQ9Y2VudGVyTGF0UG9pbnRzW2NlbnRlckxhdFBvaW50cy5sZW5ndGgt MV0ueDt2YXIgbG9uRGVsdGE9KGxvbkVuZC1sb25TdGFydCkvdGhpcy5udW1Qb2lu dHM7dmFyIGxvbj1sb25TdGFydDt2YXIgbGFiZWxQb2ludD1udWxsO2Zvcih2YXIg aT0wO2k8PXRoaXMubnVtUG9pbnRzOysraSl7dmFyIGdyaWRQb2ludD1uZXcgT3Bl bkxheWVycy5HZW9tZXRyeS5Qb2ludChsb24sbGF0KTtncmlkUG9pbnQudHJhbnNm b3JtKGxsUHJvaixtYXBQcm9qKTtwb2ludExpc3QucHVzaChncmlkUG9pbnQpO2xv bis9bG9uRGVsdGE7aWYoZ3JpZFBvaW50Lng8bWFwQm91bmRzLnJpZ2h0KXtsYWJl bFBvaW50PWdyaWRQb2ludDt9fQppZih0aGlzLmxhYmVsbGVkKXt2YXIgbGFiZWxQ b3M9bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQobWFwQm91bmRzLnJpZ2h0 LGxhYmVsUG9pbnQueSk7dmFyIGxhYmVsQXR0cnM9e3ZhbHVlOmxhdCxsYWJlbDp0 aGlzLmxhYmVsbGVkP09wZW5MYXllcnMuVXRpbC5nZXRGb3JtYXR0ZWRMb25MYXQo bGF0LCJsYXQiLHRoaXMubGFiZWxGb3JtYXQpOiIiLGxhYmVsQWxpZ246InJiIix4 T2Zmc2V0Oi0yLHlPZmZzZXQ6Mn07dGhpcy5ncmF0TGF5ZXIuYWRkRmVhdHVyZXMo bmV3IE9wZW5MYXllcnMuRmVhdHVyZS5WZWN0b3IobGFiZWxQb3MsbGFiZWxBdHRy cykpO30KdmFyIGdlb209bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuTGluZVN0cmlu Zyhwb2ludExpc3QpO2xpbmVzLnB1c2gobmV3IE9wZW5MYXllcnMuRmVhdHVyZS5W ZWN0b3IoZ2VvbSkpO30KdGhpcy5ncmF0TGF5ZXIuYWRkRmVhdHVyZXMobGluZXMp O30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5Db250cm9sLkdyYXRpY3VsZSJ9KTtP cGVuTGF5ZXJzLkxheWVyLldNUy5Qb3N0PU9wZW5MYXllcnMuQ2xhc3MoT3Blbkxh eWVycy5MYXllci5XTVMse3Vuc3VwcG9ydGVkQnJvd3NlcnM6WyJtb3ppbGxhIiwi ZmlyZWZveCIsIm9wZXJhIl0sU1VQUE9SVEVEX1RSQU5TSVRJT05TOltdLHVzZVBv c3Q6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKG5hbWUsdXJsLHBhcmFtcyxvcHRp b25zKXt2YXIgbmV3QXJndW1lbnRzPVtdO25ld0FyZ3VtZW50cy5wdXNoKG5hbWUs dXJsLHBhcmFtcyxvcHRpb25zKTtPcGVuTGF5ZXJzLkxheWVyLldNUy5wcm90b3R5 cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLG5ld0FyZ3VtZW50cyk7dGhpcy51c2VQ b3N0PU9wZW5MYXllcnMuVXRpbC5pbmRleE9mKHRoaXMudW5zdXBwb3J0ZWRCcm93 c2VycyxPcGVuTGF5ZXJzLkJST1dTRVJfTkFNRSk9PS0xO30sYWRkVGlsZTpmdW5j dGlvbihib3VuZHMscG9zaXRpb24pe3JldHVybiBuZXcgT3BlbkxheWVycy5UaWxl LkltYWdlKHRoaXMscG9zaXRpb24sYm91bmRzLG51bGwsdGhpcy50aWxlU2l6ZSx7 bWF4R2V0VXJsTGVuZ3RoOnRoaXMudXNlUG9zdD8wOm51bGx9KTt9LENMQVNTX05B TUU6J09wZW5MYXllcnMuTGF5ZXIuV01TLlBvc3QnfSk7T3BlbkxheWVycy5MYXll ci5BcmNHSVNDYWNoZT1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuTGF5ZXIu WFlaLHt1cmw6bnVsbCx0aWxlT3JpZ2luOm51bGwsdGlsZVNpemU6bmV3IE9wZW5M YXllcnMuU2l6ZSgyNTYsMjU2KSx1c2VBcmNHSVNTZXJ2ZXI6dHJ1ZSx0eXBlOidw bmcnLHVzZVNjYWxlczpmYWxzZSxvdmVycmlkZURQSTpmYWxzZSxpbml0aWFsaXpl OmZ1bmN0aW9uKG5hbWUsdXJsLG9wdGlvbnMpe09wZW5MYXllcnMuTGF5ZXIuWFla LnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZih0 aGlzLnJlc29sdXRpb25zKXt0aGlzLnNlcnZlclJlc29sdXRpb25zPXRoaXMucmVz b2x1dGlvbnM7dGhpcy5tYXhFeHRlbnQ9dGhpcy5nZXRNYXhFeHRlbnRGb3JSZXNv bHV0aW9uKHRoaXMucmVzb2x1dGlvbnNbMF0pO30KaWYodGhpcy5sYXllckluZm8p e3ZhciBpbmZvPXRoaXMubGF5ZXJJbmZvO3ZhciBzdGFydGluZ1RpbGVFeHRlbnQ9 bmV3IE9wZW5MYXllcnMuQm91bmRzKGluZm8uZnVsbEV4dGVudC54bWluLGluZm8u ZnVsbEV4dGVudC55bWluLGluZm8uZnVsbEV4dGVudC54bWF4LGluZm8uZnVsbEV4 dGVudC55bWF4KTt0aGlzLnByb2plY3Rpb249J0VQU0c6JytpbmZvLnNwYXRpYWxS ZWZlcmVuY2Uud2tpZDt0aGlzLnNwaGVyaWNhbE1lcmNhdG9yPShpbmZvLnNwYXRp YWxSZWZlcmVuY2Uud2tpZD09MTAyMTAwKTt0aGlzLnVuaXRzPShpbmZvLnVuaXRz PT0iZXNyaUZlZXQiKT8nZnQnOidtJztpZighIWluZm8udGlsZUluZm8pe3RoaXMu dGlsZVNpemU9bmV3IE9wZW5MYXllcnMuU2l6ZShpbmZvLnRpbGVJbmZvLndpZHRo fHxpbmZvLnRpbGVJbmZvLmNvbHMsaW5mby50aWxlSW5mby5oZWlnaHR8fGluZm8u dGlsZUluZm8ucm93cyk7dGhpcy50aWxlT3JpZ2luPW5ldyBPcGVuTGF5ZXJzLkxv bkxhdChpbmZvLnRpbGVJbmZvLm9yaWdpbi54LGluZm8udGlsZUluZm8ub3JpZ2lu LnkpO3ZhciB1cHBlckxlZnQ9bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQo c3RhcnRpbmdUaWxlRXh0ZW50LmxlZnQsc3RhcnRpbmdUaWxlRXh0ZW50LnRvcCk7 dmFyIGJvdHRvbVJpZ2h0PW5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KHN0 YXJ0aW5nVGlsZUV4dGVudC5yaWdodCxzdGFydGluZ1RpbGVFeHRlbnQuYm90dG9t KTtpZih0aGlzLnVzZVNjYWxlcyl7dGhpcy5zY2FsZXM9W107fWVsc2V7dGhpcy5y ZXNvbHV0aW9ucz1bXTt9CnRoaXMubG9kcz1bXTtmb3IodmFyIGtleSBpbiBpbmZv LnRpbGVJbmZvLmxvZHMpe2lmKGluZm8udGlsZUluZm8ubG9kcy5oYXNPd25Qcm9w ZXJ0eShrZXkpKXt2YXIgbG9kPWluZm8udGlsZUluZm8ubG9kc1trZXldO2lmKHRo aXMudXNlU2NhbGVzKXt0aGlzLnNjYWxlcy5wdXNoKGxvZC5zY2FsZSk7fWVsc2V7 dGhpcy5yZXNvbHV0aW9ucy5wdXNoKGxvZC5yZXNvbHV0aW9uKTt9CnZhciBzdGFy dD10aGlzLmdldENvbnRhaW5pbmdUaWxlQ29vcmRzKHVwcGVyTGVmdCxsb2QucmVz b2x1dGlvbik7bG9kLnN0YXJ0VGlsZUNvbD1zdGFydC54O2xvZC5zdGFydFRpbGVS b3c9c3RhcnQueTt2YXIgZW5kPXRoaXMuZ2V0Q29udGFpbmluZ1RpbGVDb29yZHMo Ym90dG9tUmlnaHQsbG9kLnJlc29sdXRpb24pO2xvZC5lbmRUaWxlQ29sPWVuZC54 O2xvZC5lbmRUaWxlUm93PWVuZC55O3RoaXMubG9kcy5wdXNoKGxvZCk7fX0KdGhp cy5tYXhFeHRlbnQ9dGhpcy5jYWxjdWxhdGVNYXhFeHRlbnRXaXRoTE9EKHRoaXMu bG9kc1swXSk7dGhpcy5zZXJ2ZXJSZXNvbHV0aW9ucz10aGlzLnJlc29sdXRpb25z O2lmKHRoaXMub3ZlcnJpZGVEUEkmJmluZm8udGlsZUluZm8uZHBpKXtPcGVuTGF5 ZXJzLkRPVFNfUEVSX0lOQ0g9aW5mby50aWxlSW5mby5kcGk7fX19fSxnZXRDb250 YWluaW5nVGlsZUNvb3JkczpmdW5jdGlvbihwb2ludCxyZXMpe3JldHVybiBuZXcg T3BlbkxheWVycy5QaXhlbChNYXRoLm1heChNYXRoLmZsb29yKChwb2ludC54LXRo aXMudGlsZU9yaWdpbi5sb24pLyh0aGlzLnRpbGVTaXplLncqcmVzKSksMCksTWF0 aC5tYXgoTWF0aC5mbG9vcigodGhpcy50aWxlT3JpZ2luLmxhdC1wb2ludC55KS8o dGhpcy50aWxlU2l6ZS5oKnJlcykpLDApKTt9LGNhbGN1bGF0ZU1heEV4dGVudFdp dGhMT0Q6ZnVuY3Rpb24obG9kKXt2YXIgbnVtVGlsZUNvbHM9KGxvZC5lbmRUaWxl Q29sLWxvZC5zdGFydFRpbGVDb2wpKzE7dmFyIG51bVRpbGVSb3dzPShsb2QuZW5k VGlsZVJvdy1sb2Quc3RhcnRUaWxlUm93KSsxO3ZhciBtaW5YPXRoaXMudGlsZU9y aWdpbi5sb24rKGxvZC5zdGFydFRpbGVDb2wqdGhpcy50aWxlU2l6ZS53KmxvZC5y ZXNvbHV0aW9uKTt2YXIgbWF4WD1taW5YKyhudW1UaWxlQ29scyp0aGlzLnRpbGVT aXplLncqbG9kLnJlc29sdXRpb24pO3ZhciBtYXhZPXRoaXMudGlsZU9yaWdpbi5s YXQtKGxvZC5zdGFydFRpbGVSb3cqdGhpcy50aWxlU2l6ZS5oKmxvZC5yZXNvbHV0 aW9uKTt2YXIgbWluWT1tYXhZLShudW1UaWxlUm93cyp0aGlzLnRpbGVTaXplLmgq bG9kLnJlc29sdXRpb24pO3JldHVybiBuZXcgT3BlbkxheWVycy5Cb3VuZHMobWlu WCxtaW5ZLG1heFgsbWF4WSk7fSxjYWxjdWxhdGVNYXhFeHRlbnRXaXRoRXh0ZW50 OmZ1bmN0aW9uKGV4dGVudCxyZXMpe3ZhciB1cHBlckxlZnQ9bmV3IE9wZW5MYXll cnMuR2VvbWV0cnkuUG9pbnQoZXh0ZW50LmxlZnQsZXh0ZW50LnRvcCk7dmFyIGJv dHRvbVJpZ2h0PW5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KGV4dGVudC5y aWdodCxleHRlbnQuYm90dG9tKTt2YXIgc3RhcnQ9dGhpcy5nZXRDb250YWluaW5n VGlsZUNvb3Jkcyh1cHBlckxlZnQscmVzKTt2YXIgZW5kPXRoaXMuZ2V0Q29udGFp bmluZ1RpbGVDb29yZHMoYm90dG9tUmlnaHQscmVzKTt2YXIgbG9kPXtyZXNvbHV0 aW9uOnJlcyxzdGFydFRpbGVDb2w6c3RhcnQueCxzdGFydFRpbGVSb3c6c3RhcnQu eSxlbmRUaWxlQ29sOmVuZC54LGVuZFRpbGVSb3c6ZW5kLnl9O3JldHVybiB0aGlz LmNhbGN1bGF0ZU1heEV4dGVudFdpdGhMT0QobG9kKTt9LGdldFVwcGVyTGVmdFRp bGVDb29yZDpmdW5jdGlvbihyZXMpe3ZhciB1cHBlckxlZnQ9bmV3IE9wZW5MYXll cnMuR2VvbWV0cnkuUG9pbnQodGhpcy5tYXhFeHRlbnQubGVmdCx0aGlzLm1heEV4 dGVudC50b3ApO3JldHVybiB0aGlzLmdldENvbnRhaW5pbmdUaWxlQ29vcmRzKHVw cGVyTGVmdCxyZXMpO30sZ2V0TG93ZXJSaWdodFRpbGVDb29yZDpmdW5jdGlvbihy ZXMpe3ZhciBib3R0b21SaWdodD1uZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2lu dCh0aGlzLm1heEV4dGVudC5yaWdodCx0aGlzLm1heEV4dGVudC5ib3R0b20pO3Jl dHVybiB0aGlzLmdldENvbnRhaW5pbmdUaWxlQ29vcmRzKGJvdHRvbVJpZ2h0LHJl cyk7fSxnZXRNYXhFeHRlbnRGb3JSZXNvbHV0aW9uOmZ1bmN0aW9uKHJlcyl7dmFy IHN0YXJ0PXRoaXMuZ2V0VXBwZXJMZWZ0VGlsZUNvb3JkKHJlcyk7dmFyIGVuZD10 aGlzLmdldExvd2VyUmlnaHRUaWxlQ29vcmQocmVzKTt2YXIgbnVtVGlsZUNvbHM9 KGVuZC54LXN0YXJ0LngpKzE7dmFyIG51bVRpbGVSb3dzPShlbmQueS1zdGFydC55 KSsxO3ZhciBtaW5YPXRoaXMudGlsZU9yaWdpbi5sb24rKHN0YXJ0LngqdGhpcy50 aWxlU2l6ZS53KnJlcyk7dmFyIG1heFg9bWluWCsobnVtVGlsZUNvbHMqdGhpcy50 aWxlU2l6ZS53KnJlcyk7dmFyIG1heFk9dGhpcy50aWxlT3JpZ2luLmxhdC0oc3Rh cnQueSp0aGlzLnRpbGVTaXplLmgqcmVzKTt2YXIgbWluWT1tYXhZLShudW1UaWxl Um93cyp0aGlzLnRpbGVTaXplLmgqcmVzKTtyZXR1cm4gbmV3IE9wZW5MYXllcnMu Qm91bmRzKG1pblgsbWluWSxtYXhYLG1heFkpO30sY2xvbmU6ZnVuY3Rpb24ob2Jq KXtpZihvYmo9PW51bGwpe29iaj1uZXcgT3BlbkxheWVycy5MYXllci5BcmNHSVND YWNoZSh0aGlzLm5hbWUsdGhpcy51cmwsdGhpcy5vcHRpb25zKTt9CnJldHVybiBP cGVuTGF5ZXJzLkxheWVyLlhZWi5wcm90b3R5cGUuY2xvbmUuYXBwbHkodGhpcyxb b2JqXSk7fSxnZXRNYXhFeHRlbnQ6ZnVuY3Rpb24oKXt2YXIgcmVzb2x1dGlvbj10 aGlzLm1hcC5nZXRSZXNvbHV0aW9uKCk7cmV0dXJuIHRoaXMubWF4RXh0ZW50PXRo aXMuZ2V0TWF4RXh0ZW50Rm9yUmVzb2x1dGlvbihyZXNvbHV0aW9uKTt9LGdldFRp bGVPcmlnaW46ZnVuY3Rpb24oKXt2YXIgZXh0ZW50PXRoaXMuZ2V0TWF4RXh0ZW50 KCk7cmV0dXJuIG5ldyBPcGVuTGF5ZXJzLkxvbkxhdChleHRlbnQubGVmdCxleHRl bnQuYm90dG9tKTt9LGdldFVSTDpmdW5jdGlvbihib3VuZHMpe3ZhciByZXM9dGhp cy5nZXRSZXNvbHV0aW9uKCk7dmFyIG9yaWdpblRpbGVYPSh0aGlzLnRpbGVPcmln aW4ubG9uKyhyZXMqdGhpcy50aWxlU2l6ZS53LzIpKTt2YXIgb3JpZ2luVGlsZVk9 KHRoaXMudGlsZU9yaWdpbi5sYXQtKHJlcyp0aGlzLnRpbGVTaXplLmgvMikpO3Zh ciBjZW50ZXI9Ym91bmRzLmdldENlbnRlckxvbkxhdCgpO3ZhciBwb2ludD17eDpj ZW50ZXIubG9uLHk6Y2VudGVyLmxhdH07dmFyIHg9KE1hdGgucm91bmQoTWF0aC5h YnMoKGNlbnRlci5sb24tb3JpZ2luVGlsZVgpLyhyZXMqdGhpcy50aWxlU2l6ZS53 KSkpKTt2YXIgeT0oTWF0aC5yb3VuZChNYXRoLmFicygob3JpZ2luVGlsZVktY2Vu dGVyLmxhdCkvKHJlcyp0aGlzLnRpbGVTaXplLmgpKSkpO3ZhciB6PXRoaXMubWFw LmdldFpvb20oKTtpZih0aGlzLmxvZHMpe3ZhciBsb2Q9dGhpcy5sb2RzW3RoaXMu bWFwLmdldFpvb20oKV07aWYoKHg8bG9kLnN0YXJ0VGlsZUNvbHx8eD5sb2QuZW5k VGlsZUNvbCl8fCh5PGxvZC5zdGFydFRpbGVSb3d8fHk+bG9kLmVuZFRpbGVSb3cp KXtyZXR1cm4gbnVsbDt9fQplbHNle3ZhciBzdGFydD10aGlzLmdldFVwcGVyTGVm dFRpbGVDb29yZChyZXMpO3ZhciBlbmQ9dGhpcy5nZXRMb3dlclJpZ2h0VGlsZUNv b3JkKHJlcyk7aWYoKHg8c3RhcnQueHx8eD49ZW5kLngpfHwoeTxzdGFydC55fHx5 Pj1lbmQueSkpe3JldHVybiBudWxsO319CnZhciB1cmw9dGhpcy51cmw7dmFyIHM9 JycreCt5K3o7aWYoT3BlbkxheWVycy5VdGlsLmlzQXJyYXkodXJsKSl7dXJsPXRo aXMuc2VsZWN0VXJsKHMsdXJsKTt9CmlmKHRoaXMudXNlQXJjR0lTU2VydmVyKXt1 cmw9dXJsKycvdGlsZS8ke3p9LyR7eX0vJHt4fSc7fWVsc2V7eD0nQycrdGhpcy56 ZXJvUGFkKHgsOCwxNik7eT0nUicrdGhpcy56ZXJvUGFkKHksOCwxNik7ej0nTCcr dGhpcy56ZXJvUGFkKHosMiwxNik7dXJsPXVybCsnLyR7en0vJHt5fS8ke3h9Licr dGhpcy50eXBlO30KdXJsPU9wZW5MYXllcnMuU3RyaW5nLmZvcm1hdCh1cmwseyd4 Jzp4LCd5Jzp5LCd6Jzp6fSk7cmV0dXJuIHVybDt9LHplcm9QYWQ6ZnVuY3Rpb24o bnVtLGxlbixyYWRpeCl7dmFyIHN0cj1udW0udG9TdHJpbmcocmFkaXh8fDEwKTt3 aGlsZShzdHIubGVuZ3RoPGxlbil7c3RyPSIwIitzdHI7fQpyZXR1cm4gc3RyO30s Q0xBU1NfTkFNRTonT3BlbkxheWVycy5MYXllci5BcmNHSVNDYWNoZSd9KTtPcGVu TGF5ZXJzLkNvbnRyb2wuV01TR2V0RmVhdHVyZUluZm89T3BlbkxheWVycy5DbGFz cyhPcGVuTGF5ZXJzLkNvbnRyb2wse2hvdmVyOmZhbHNlLGRyaWxsRG93bjpmYWxz ZSxtYXhGZWF0dXJlczoxMCxjbGlja0NhbGxiYWNrOiJjbGljayIsb3V0cHV0OiJm ZWF0dXJlcyIsbGF5ZXJzOm51bGwscXVlcnlWaXNpYmxlOmZhbHNlLHVybDpudWxs LGxheWVyVXJsczpudWxsLGluZm9Gb3JtYXQ6J3RleHQvaHRtbCcsdmVuZG9yUGFy YW1zOnt9LGZvcm1hdDpudWxsLGZvcm1hdE9wdGlvbnM6bnVsbCxoYW5kbGVyT3B0 aW9uczpudWxsLGhhbmRsZXI6bnVsbCxob3ZlclJlcXVlc3Q6bnVsbCxFVkVOVF9U WVBFUzpbImJlZm9yZWdldGZlYXR1cmVpbmZvIiwibm9nZXRmZWF0dXJlaW5mbyIs ImdldGZlYXR1cmVpbmZvIl0saW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXt0 aGlzLkVWRU5UX1RZUEVTPU9wZW5MYXllcnMuQ29udHJvbC5XTVNHZXRGZWF0dXJl SW5mby5wcm90b3R5cGUuRVZFTlRfVFlQRVMuY29uY2F0KE9wZW5MYXllcnMuQ29u dHJvbC5wcm90b3R5cGUuRVZFTlRfVFlQRVMpO29wdGlvbnM9b3B0aW9uc3x8e307 b3B0aW9ucy5oYW5kbGVyT3B0aW9ucz1vcHRpb25zLmhhbmRsZXJPcHRpb25zfHx7 fTtPcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHko dGhpcyxbb3B0aW9uc10pO2lmKCF0aGlzLmZvcm1hdCl7dGhpcy5mb3JtYXQ9bmV3 IE9wZW5MYXllcnMuRm9ybWF0LldNU0dldEZlYXR1cmVJbmZvKG9wdGlvbnMuZm9y bWF0T3B0aW9ucyk7fQppZih0aGlzLmRyaWxsRG93bj09PXRydWUpe3RoaXMuaG92 ZXI9ZmFsc2U7fQppZih0aGlzLmhvdmVyKXt0aGlzLmhhbmRsZXI9bmV3IE9wZW5M YXllcnMuSGFuZGxlci5Ib3Zlcih0aGlzLHsnbW92ZSc6dGhpcy5jYW5jZWxIb3Zl ciwncGF1c2UnOnRoaXMuZ2V0SW5mb0ZvckhvdmVyfSxPcGVuTGF5ZXJzLlV0aWwu ZXh0ZW5kKHRoaXMuaGFuZGxlck9wdGlvbnMuaG92ZXJ8fHt9LHsnZGVsYXknOjI1 MH0pKTt9ZWxzZXt2YXIgY2FsbGJhY2tzPXt9O2NhbGxiYWNrc1t0aGlzLmNsaWNr Q2FsbGJhY2tdPXRoaXMuZ2V0SW5mb0ZvckNsaWNrO3RoaXMuaGFuZGxlcj1uZXcg T3BlbkxheWVycy5IYW5kbGVyLkNsaWNrKHRoaXMsY2FsbGJhY2tzLHRoaXMuaGFu ZGxlck9wdGlvbnMuY2xpY2t8fHt9KTt9fSxhY3RpdmF0ZTpmdW5jdGlvbigpe2lm KCF0aGlzLmFjdGl2ZSl7dGhpcy5oYW5kbGVyLmFjdGl2YXRlKCk7fQpyZXR1cm4g T3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5hY3RpdmF0ZS5hcHBseSh0aGlz LGFyZ3VtZW50cyk7fSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIE9wZW5M YXllcnMuQ29udHJvbC5wcm90b3R5cGUuZGVhY3RpdmF0ZS5hcHBseSh0aGlzLGFy Z3VtZW50cyk7fSxnZXRJbmZvRm9yQ2xpY2s6ZnVuY3Rpb24oZXZ0KXt0aGlzLmV2 ZW50cy50cmlnZ2VyRXZlbnQoImJlZm9yZWdldGZlYXR1cmVpbmZvIix7eHk6ZXZ0 Lnh5fSk7T3BlbkxheWVycy5FbGVtZW50LmFkZENsYXNzKHRoaXMubWFwLnZpZXdQ b3J0RGl2LCJvbEN1cnNvcldhaXQiKTt0aGlzLnJlcXVlc3QoZXZ0Lnh5LHt9KTt9 LGdldEluZm9Gb3JIb3ZlcjpmdW5jdGlvbihldnQpe3RoaXMuZXZlbnRzLnRyaWdn ZXJFdmVudCgiYmVmb3JlZ2V0ZmVhdHVyZWluZm8iLHt4eTpldnQueHl9KTt0aGlz LnJlcXVlc3QoZXZ0Lnh5LHtob3Zlcjp0cnVlfSk7fSxjYW5jZWxIb3ZlcjpmdW5j dGlvbigpe2lmKHRoaXMuaG92ZXJSZXF1ZXN0KXt0aGlzLmhvdmVyUmVxdWVzdC5h Ym9ydCgpO3RoaXMuaG92ZXJSZXF1ZXN0PW51bGw7fX0sZmluZExheWVyczpmdW5j dGlvbigpe3ZhciBjYW5kaWRhdGVzPXRoaXMubGF5ZXJzfHx0aGlzLm1hcC5sYXll cnM7dmFyIGxheWVycz1bXTt2YXIgbGF5ZXIsdXJsO2Zvcih2YXIgaT0wLGxlbj1j YW5kaWRhdGVzLmxlbmd0aDtpPGxlbjsrK2kpe2xheWVyPWNhbmRpZGF0ZXNbaV07 aWYobGF5ZXIgaW5zdGFuY2VvZiBPcGVuTGF5ZXJzLkxheWVyLldNUyYmKCF0aGlz LnF1ZXJ5VmlzaWJsZXx8bGF5ZXIuZ2V0VmlzaWJpbGl0eSgpKSl7dXJsPU9wZW5M YXllcnMuVXRpbC5pc0FycmF5KGxheWVyLnVybCk/bGF5ZXIudXJsWzBdOmxheWVy LnVybDtpZih0aGlzLmRyaWxsRG93bj09PWZhbHNlJiYhdGhpcy51cmwpe3RoaXMu dXJsPXVybDt9CmlmKHRoaXMuZHJpbGxEb3duPT09dHJ1ZXx8dGhpcy51cmxNYXRj aGVzKHVybCkpe2xheWVycy5wdXNoKGxheWVyKTt9fX0KcmV0dXJuIGxheWVyczt9 LHVybE1hdGNoZXM6ZnVuY3Rpb24odXJsKXt2YXIgbWF0Y2hlcz1PcGVuTGF5ZXJz LlV0aWwuaXNFcXVpdmFsZW50VXJsKHRoaXMudXJsLHVybCk7aWYoIW1hdGNoZXMm JnRoaXMubGF5ZXJVcmxzKXtmb3IodmFyIGk9MCxsZW49dGhpcy5sYXllclVybHMu bGVuZ3RoO2k8bGVuOysraSl7aWYoT3BlbkxheWVycy5VdGlsLmlzRXF1aXZhbGVu dFVybCh0aGlzLmxheWVyVXJsc1tpXSx1cmwpKXttYXRjaGVzPXRydWU7YnJlYWs7 fX19CnJldHVybiBtYXRjaGVzO30sYnVpbGRXTVNPcHRpb25zOmZ1bmN0aW9uKHVy bCxsYXllcnMsY2xpY2tQb3NpdGlvbixmb3JtYXQpe3ZhciBsYXllck5hbWVzPVtd LHN0eWxlTmFtZXM9W107Zm9yKHZhciBpPTAsbGVuPWxheWVycy5sZW5ndGg7aTxs ZW47aSsrKXtsYXllck5hbWVzPWxheWVyTmFtZXMuY29uY2F0KGxheWVyc1tpXS5w YXJhbXMuTEFZRVJTKTtzdHlsZU5hbWVzPXN0eWxlTmFtZXMuY29uY2F0KHRoaXMu Z2V0U3R5bGVOYW1lcyhsYXllcnNbaV0pKTt9CnZhciBmaXJzdExheWVyPWxheWVy c1swXTt2YXIgcHJvamVjdGlvbj10aGlzLm1hcC5nZXRQcm9qZWN0aW9uKCk7dmFy IGxheWVyUHJvaj1maXJzdExheWVyLnByb2plY3Rpb247aWYobGF5ZXJQcm9qJiZs YXllclByb2ouZXF1YWxzKHRoaXMubWFwLmdldFByb2plY3Rpb25PYmplY3QoKSkp e3Byb2plY3Rpb249bGF5ZXJQcm9qLmdldENvZGUoKTt9CnZhciBwYXJhbXM9T3Bl bkxheWVycy5VdGlsLmV4dGVuZCh7c2VydmljZToiV01TIix2ZXJzaW9uOmZpcnN0 TGF5ZXIucGFyYW1zLlZFUlNJT04scmVxdWVzdDoiR2V0RmVhdHVyZUluZm8iLGxh eWVyczpsYXllck5hbWVzLHF1ZXJ5X2xheWVyczpsYXllck5hbWVzLHN0eWxlczpz dHlsZU5hbWVzLGJib3g6dGhpcy5tYXAuZ2V0RXh0ZW50KCkudG9CQk9YKG51bGws Zmlyc3RMYXllci5yZXZlcnNlQXhpc09yZGVyKCkpLGZlYXR1cmVfY291bnQ6dGhp cy5tYXhGZWF0dXJlcyxoZWlnaHQ6dGhpcy5tYXAuZ2V0U2l6ZSgpLmgsd2lkdGg6 dGhpcy5tYXAuZ2V0U2l6ZSgpLncsZm9ybWF0OmZvcm1hdCxpbmZvX2Zvcm1hdDpm aXJzdExheWVyLnBhcmFtcy5JTkZPX0ZPUk1BVHx8dGhpcy5pbmZvRm9ybWF0fSwo cGFyc2VGbG9hdChmaXJzdExheWVyLnBhcmFtcy5WRVJTSU9OKT49MS4zKT97Y3Jz OnByb2plY3Rpb24saTpwYXJzZUludChjbGlja1Bvc2l0aW9uLngpLGo6cGFyc2VJ bnQoY2xpY2tQb3NpdGlvbi55KX06e3Nyczpwcm9qZWN0aW9uLHg6cGFyc2VJbnQo Y2xpY2tQb3NpdGlvbi54KSx5OnBhcnNlSW50KGNsaWNrUG9zaXRpb24ueSl9KTtP cGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0cyhwYXJhbXMsdGhpcy52ZW5kb3JQ YXJhbXMpO3JldHVybnt1cmw6dXJsLHBhcmFtczpPcGVuTGF5ZXJzLlV0aWwudXBw ZXJDYXNlT2JqZWN0KHBhcmFtcyksY2FsbGJhY2s6ZnVuY3Rpb24ocmVxdWVzdCl7 dGhpcy5oYW5kbGVSZXNwb25zZShjbGlja1Bvc2l0aW9uLHJlcXVlc3QsdXJsKTt9 LHNjb3BlOnRoaXN9O30sZ2V0U3R5bGVOYW1lczpmdW5jdGlvbihsYXllcil7dmFy IHN0eWxlTmFtZXM7aWYobGF5ZXIucGFyYW1zLlNUWUxFUyl7c3R5bGVOYW1lcz1s YXllci5wYXJhbXMuU1RZTEVTO31lbHNle2lmKE9wZW5MYXllcnMuVXRpbC5pc0Fy cmF5KGxheWVyLnBhcmFtcy5MQVlFUlMpKXtzdHlsZU5hbWVzPW5ldyBBcnJheShs YXllci5wYXJhbXMuTEFZRVJTLmxlbmd0aCk7fWVsc2V7c3R5bGVOYW1lcz1sYXll ci5wYXJhbXMuTEFZRVJTLnJlcGxhY2UoL1teLF0vZywiIik7fX0KcmV0dXJuIHN0 eWxlTmFtZXM7fSxyZXF1ZXN0OmZ1bmN0aW9uKGNsaWNrUG9zaXRpb24sb3B0aW9u cyl7dmFyIGxheWVycz10aGlzLmZpbmRMYXllcnMoKTtpZihsYXllcnMubGVuZ3Ro PT0wKXt0aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQoIm5vZ2V0ZmVhdHVyZWluZm8i KTtPcGVuTGF5ZXJzLkVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5tYXAudmlld1Bv cnREaXYsIm9sQ3Vyc29yV2FpdCIpO3JldHVybjt9Cm9wdGlvbnM9b3B0aW9uc3x8 e307aWYodGhpcy5kcmlsbERvd249PT1mYWxzZSl7dmFyIHdtc09wdGlvbnM9dGhp cy5idWlsZFdNU09wdGlvbnModGhpcy51cmwsbGF5ZXJzLGNsaWNrUG9zaXRpb24s bGF5ZXJzWzBdLnBhcmFtcy5GT1JNQVQpO3ZhciByZXF1ZXN0PU9wZW5MYXllcnMu UmVxdWVzdC5HRVQod21zT3B0aW9ucyk7aWYob3B0aW9ucy5ob3Zlcj09PXRydWUp e3RoaXMuaG92ZXJSZXF1ZXN0PXJlcXVlc3Q7fX1lbHNle3RoaXMuX3JlcXVlc3RD b3VudD0wO3RoaXMuX251bVJlcXVlc3RzPTA7dGhpcy5mZWF0dXJlcz1bXTt2YXIg c2VydmljZXM9e30sdXJsO2Zvcih2YXIgaT0wLGxlbj1sYXllcnMubGVuZ3RoO2k8 bGVuO2krKyl7dmFyIGxheWVyPWxheWVyc1tpXTt2YXIgc2VydmljZSxmb3VuZD1m YWxzZTt1cmw9T3BlbkxheWVycy5VdGlsLmlzQXJyYXkobGF5ZXIudXJsKT9sYXll ci51cmxbMF06bGF5ZXIudXJsO2lmKHVybCBpbiBzZXJ2aWNlcyl7c2VydmljZXNb dXJsXS5wdXNoKGxheWVyKTt9ZWxzZXt0aGlzLl9udW1SZXF1ZXN0cysrO3NlcnZp Y2VzW3VybF09W2xheWVyXTt9fQp2YXIgbGF5ZXJzO2Zvcih2YXIgdXJsIGluIHNl cnZpY2VzKXtsYXllcnM9c2VydmljZXNbdXJsXTt2YXIgd21zT3B0aW9ucz10aGlz LmJ1aWxkV01TT3B0aW9ucyh1cmwsbGF5ZXJzLGNsaWNrUG9zaXRpb24sbGF5ZXJz WzBdLnBhcmFtcy5GT1JNQVQpO09wZW5MYXllcnMuUmVxdWVzdC5HRVQod21zT3B0 aW9ucyk7fX19LHRyaWdnZXJHZXRGZWF0dXJlSW5mbzpmdW5jdGlvbihyZXF1ZXN0 LHh5LGZlYXR1cmVzKXt0aGlzLmV2ZW50cy50cmlnZ2VyRXZlbnQoImdldGZlYXR1 cmVpbmZvIix7dGV4dDpyZXF1ZXN0LnJlc3BvbnNlVGV4dCxmZWF0dXJlczpmZWF0 dXJlcyxyZXF1ZXN0OnJlcXVlc3QseHk6eHl9KTtPcGVuTGF5ZXJzLkVsZW1lbnQu cmVtb3ZlQ2xhc3ModGhpcy5tYXAudmlld1BvcnREaXYsIm9sQ3Vyc29yV2FpdCIp O30saGFuZGxlUmVzcG9uc2U6ZnVuY3Rpb24oeHkscmVxdWVzdCx1cmwpe3ZhciBk b2M9cmVxdWVzdC5yZXNwb25zZVhNTDtpZighZG9jfHwhZG9jLmRvY3VtZW50RWxl bWVudCl7ZG9jPXJlcXVlc3QucmVzcG9uc2VUZXh0O30KdmFyIGZlYXR1cmVzPXRo aXMuZm9ybWF0LnJlYWQoZG9jKTtpZih0aGlzLmRyaWxsRG93bj09PWZhbHNlKXt0 aGlzLnRyaWdnZXJHZXRGZWF0dXJlSW5mbyhyZXF1ZXN0LHh5LGZlYXR1cmVzKTt9 ZWxzZXt0aGlzLl9yZXF1ZXN0Q291bnQrKztpZih0aGlzLm91dHB1dD09PSJvYmpl Y3QiKXt0aGlzLl9mZWF0dXJlcz0odGhpcy5fZmVhdHVyZXN8fFtdKS5jb25jYXQo e3VybDp1cmwsZmVhdHVyZXM6ZmVhdHVyZXN9KTt9ZWxzZXt0aGlzLl9mZWF0dXJl cz0odGhpcy5fZmVhdHVyZXN8fFtdKS5jb25jYXQoZmVhdHVyZXMpO30KaWYodGhp cy5fcmVxdWVzdENvdW50PT09dGhpcy5fbnVtUmVxdWVzdHMpe3RoaXMudHJpZ2dl ckdldEZlYXR1cmVJbmZvKHJlcXVlc3QseHksdGhpcy5fZmVhdHVyZXMuY29uY2F0 KCkpO2RlbGV0ZSB0aGlzLl9mZWF0dXJlcztkZWxldGUgdGhpcy5fcmVxdWVzdENv dW50O2RlbGV0ZSB0aGlzLl9udW1SZXF1ZXN0czt9fX0sQ0xBU1NfTkFNRToiT3Bl bkxheWVycy5Db250cm9sLldNU0dldEZlYXR1cmVJbmZvIn0pO09wZW5MYXllcnMu Rm9ybWF0LldNU0NhcGFiaWxpdGllcy52MV8zXzA9T3BlbkxheWVycy5DbGFzcyhP cGVuTGF5ZXJzLkZvcm1hdC5XTVNDYXBhYmlsaXRpZXMudjFfMyx7dmVyc2lvbjoi MS4zLjAiLENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0LldNU0NhcGFiaWxp dGllcy52MV8zXzAifSk7T3BlbkxheWVycy5Gb3JtYXQuQ1FMPShmdW5jdGlvbigp e3ZhciB0b2tlbnM9WyJQUk9QRVJUWSIsIkNPTVBBUklTT04iLCJWQUxVRSIsIkxP R0lDQUwiXSxwYXR0ZXJucz17UFJPUEVSVFk6L15bX2EtekEtWl1cdyovLENPTVBB UklTT046L14oPXw8Pnw8PXw8fD49fD58TElLRSkvaSxDT01NQTovXiwvLExPR0lD QUw6L14oQU5EfE9SKS9pLFZBTFVFOi9eKCdcdysnfFxkKyhcLlxkKik/fFwuXGQr KS8sTFBBUkVOOi9eXCgvLFJQQVJFTjovXlwpLyxTUEFUSUFMOi9eKEJCT1h8SU5U RVJTRUNUU3xEV0lUSElOfFdJVEhJTnxDT05UQUlOUykvaSxOT1Q6L15OT1QvaSxC RVRXRUVOOi9eQkVUV0VFTi9pLEdFT01FVFJZOmZ1bmN0aW9uKHRleHQpe3ZhciB0 eXBlPS9eKFBPSU5UfExJTkVTVFJJTkd8UE9MWUdPTnxNVUxUSVBPSU5UfE1VTFRJ TElORVNUUklOR3xNVUxUSVBPTFlHT058R0VPTUVUUllDT0xMRUNUSU9OKS8uZXhl Yyh0ZXh0KTtpZih0eXBlKXt2YXIgbGVuPXRleHQubGVuZ3RoO3ZhciBpZHg9dGV4 dC5pbmRleE9mKCIoIix0eXBlWzBdLmxlbmd0aCk7aWYoaWR4Pi0xKXt2YXIgZGVw dGg9MTt3aGlsZShpZHg8bGVuJiZkZXB0aD4wKXtpZHgrKztzd2l0Y2godGV4dC5j aGFyQXQoaWR4KSl7Y2FzZScoJzpkZXB0aCsrO2JyZWFrO2Nhc2UnKSc6ZGVwdGgt LTticmVhaztkZWZhdWx0On19fQpyZXR1cm5bdGV4dC5zdWJzdHIoMCxpZHgrMSld O319LEVORDovXiQvfSxmb2xsb3dzPXtMUEFSRU46WydHRU9NRVRSWScsJ1NQQVRJ QUwnLCdQUk9QRVJUWScsJ1ZBTFVFJywnTFBBUkVOJ10sUlBBUkVOOlsnTk9UJywn TE9HSUNBTCcsJ0VORCcsJ1JQQVJFTiddLFBST1BFUlRZOlsnQ09NUEFSSVNPTics J0JFVFdFRU4nLCdDT01NQSddLEJFVFdFRU46WydWQUxVRSddLENPTVBBUklTT046 WydWQUxVRSddLENPTU1BOlsnR0VPTUVUUlknLCdWQUxVRScsJ1BST1BFUlRZJ10s VkFMVUU6WydMT0dJQ0FMJywnQ09NTUEnLCdSUEFSRU4nLCdFTkQnXSxTUEFUSUFM OlsnTFBBUkVOJ10sTE9HSUNBTDpbJ05PVCcsJ1ZBTFVFJywnU1BBVElBTCcsJ1BS T1BFUlRZJywnTFBBUkVOJ10sTk9UOlsnUFJPUEVSVFknLCdMUEFSRU4nXSxHRU9N RVRSWTpbJ0NPTU1BJywnUlBBUkVOJ119LG9wZXJhdG9ycz17Jz0nOk9wZW5MYXll cnMuRmlsdGVyLkNvbXBhcmlzb24uRVFVQUxfVE8sJzw+JzpPcGVuTGF5ZXJzLkZp bHRlci5Db21wYXJpc29uLk5PVF9FUVVBTF9UTywnPCc6T3BlbkxheWVycy5GaWx0 ZXIuQ29tcGFyaXNvbi5MRVNTX1RIQU4sJzw9JzpPcGVuTGF5ZXJzLkZpbHRlci5D b21wYXJpc29uLkxFU1NfVEhBTl9PUl9FUVVBTF9UTywnPic6T3BlbkxheWVycy5G aWx0ZXIuQ29tcGFyaXNvbi5HUkVBVEVSX1RIQU4sJz49JzpPcGVuTGF5ZXJzLkZp bHRlci5Db21wYXJpc29uLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UTywnTElLRSc6 T3BlbkxheWVycy5GaWx0ZXIuQ29tcGFyaXNvbi5MSUtFLCdCRVRXRUVOJzpPcGVu TGF5ZXJzLkZpbHRlci5Db21wYXJpc29uLkJFVFdFRU59LG9wZXJhdG9yUmV2ZXJz ZT17fSxsb2dpY2Fscz17J0FORCc6T3BlbkxheWVycy5GaWx0ZXIuTG9naWNhbC5B TkQsJ09SJzpPcGVuTGF5ZXJzLkZpbHRlci5Mb2dpY2FsLk9SfSxsb2dpY2FsUmV2 ZXJzZT17fSxwcmVjZWRlbmNlPXsnUlBBUkVOJzozLCdMT0dJQ0FMJzoyLCdDT01Q QVJJU09OJzoxfTt2YXIgaTtmb3IoaSBpbiBvcGVyYXRvcnMpe2lmKG9wZXJhdG9y cy5oYXNPd25Qcm9wZXJ0eShpKSl7b3BlcmF0b3JSZXZlcnNlW29wZXJhdG9yc1tp XV09aTt9fQpmb3IoaSBpbiBsb2dpY2Fscyl7aWYobG9naWNhbHMuaGFzT3duUHJv cGVydHkoaSkpe2xvZ2ljYWxSZXZlcnNlW2xvZ2ljYWxzW2ldXT1pO319CmZ1bmN0 aW9uIHRyeVRva2VuKHRleHQscGF0dGVybil7aWYocGF0dGVybiBpbnN0YW5jZW9m IFJlZ0V4cCl7cmV0dXJuIHBhdHRlcm4uZXhlYyh0ZXh0KTt9ZWxzZXtyZXR1cm4g cGF0dGVybih0ZXh0KTt9fQpmdW5jdGlvbiBuZXh0VG9rZW4odGV4dCx0b2tlbnMp e3ZhciBpLHRva2VuLGxlbj10b2tlbnMubGVuZ3RoO2ZvcihpPTA7aTxsZW47aSsr KXt0b2tlbj10b2tlbnNbaV07dmFyIHBhdD1wYXR0ZXJuc1t0b2tlbl07dmFyIG1h dGNoZXM9dHJ5VG9rZW4odGV4dCxwYXQpO2lmKG1hdGNoZXMpe3ZhciBtYXRjaD1t YXRjaGVzWzBdO3ZhciByZW1haW5kZXI9dGV4dC5zdWJzdHIobWF0Y2gubGVuZ3Ro KS5yZXBsYWNlKC9eXHMqLywiIik7cmV0dXJue3R5cGU6dG9rZW4sdGV4dDptYXRj aCxyZW1haW5kZXI6cmVtYWluZGVyfTt9fQp2YXIgbXNnPSJFUlJPUjogSW4gcGFy c2luZzogWyIrdGV4dCsiXSwgZXhwZWN0ZWQgb25lIG9mOiAiO2ZvcihpPTA7aTxs ZW47aSsrKXt0b2tlbj10b2tlbnNbaV07bXNnKz0iXG4gICAgIit0b2tlbisiOiAi K3BhdHRlcm5zW3Rva2VuXTt9CnRocm93IG5ldyBFcnJvcihtc2cpO30KZnVuY3Rp b24gdG9rZW5pemUodGV4dCl7dmFyIHJlc3VsdHM9W107dmFyIHRva2VuLGV4cGVj dD1bIk5PVCIsIkdFT01FVFJZIiwiU1BBVElBTCIsIlBST1BFUlRZIiwiTFBBUkVO Il07ZG97dG9rZW49bmV4dFRva2VuKHRleHQsZXhwZWN0KTt0ZXh0PXRva2VuLnJl bWFpbmRlcjtleHBlY3Q9Zm9sbG93c1t0b2tlbi50eXBlXTtpZih0b2tlbi50eXBl IT0iRU5EIiYmIWV4cGVjdCl7dGhyb3cgbmV3IEVycm9yKCJObyBmb2xsb3dzIGxp c3QgZm9yICIrdG9rZW4udHlwZSk7fQpyZXN1bHRzLnB1c2godG9rZW4pO313aGls ZSh0b2tlbi50eXBlIT0iRU5EIik7cmV0dXJuIHJlc3VsdHM7fQpmdW5jdGlvbiBi dWlsZEFzdCh0b2tlbnMpe3ZhciBvcGVyYXRvclN0YWNrPVtdLHBvc3RmaXg9W107 d2hpbGUodG9rZW5zLmxlbmd0aCl7dmFyIHRvaz10b2tlbnMuc2hpZnQoKTtzd2l0 Y2godG9rLnR5cGUpe2Nhc2UiUFJPUEVSVFkiOmNhc2UiR0VPTUVUUlkiOmNhc2Ui VkFMVUUiOnBvc3RmaXgucHVzaCh0b2spO2JyZWFrO2Nhc2UiQ09NUEFSSVNPTiI6 Y2FzZSJCRVRXRUVOIjpjYXNlIkxPR0lDQUwiOnZhciBwPXByZWNlZGVuY2VbdG9r LnR5cGVdO3doaWxlKG9wZXJhdG9yU3RhY2subGVuZ3RoPjAmJihwcmVjZWRlbmNl W29wZXJhdG9yU3RhY2tbb3BlcmF0b3JTdGFjay5sZW5ndGgtMV0udHlwZV08PXAp KXtwb3N0Zml4LnB1c2gob3BlcmF0b3JTdGFjay5wb3AoKSk7fQpvcGVyYXRvclN0 YWNrLnB1c2godG9rKTticmVhaztjYXNlIlNQQVRJQUwiOmNhc2UiTk9UIjpjYXNl IkxQQVJFTiI6b3BlcmF0b3JTdGFjay5wdXNoKHRvayk7YnJlYWs7Y2FzZSJSUEFS RU4iOndoaWxlKG9wZXJhdG9yU3RhY2subGVuZ3RoPjAmJihvcGVyYXRvclN0YWNr W29wZXJhdG9yU3RhY2subGVuZ3RoLTFdLnR5cGUhPSJMUEFSRU4iKSl7cG9zdGZp eC5wdXNoKG9wZXJhdG9yU3RhY2sucG9wKCkpO30Kb3BlcmF0b3JTdGFjay5wb3Ao KTtpZihvcGVyYXRvclN0YWNrLmxlbmd0aD4wJiZvcGVyYXRvclN0YWNrW29wZXJh dG9yU3RhY2subGVuZ3RoLTFdLnR5cGU9PSJTUEFUSUFMIil7cG9zdGZpeC5wdXNo KG9wZXJhdG9yU3RhY2sucG9wKCkpO30KY2FzZSJDT01NQSI6Y2FzZSJFTkQiOmJy ZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHRva2VuIHR5cGUg Iit0b2sudHlwZSk7fX0Kd2hpbGUob3BlcmF0b3JTdGFjay5sZW5ndGg+MCl7cG9z dGZpeC5wdXNoKG9wZXJhdG9yU3RhY2sucG9wKCkpO30KZnVuY3Rpb24gYnVpbGRU cmVlKCl7dmFyIHRvaz1wb3N0Zml4LnBvcCgpO3N3aXRjaCh0b2sudHlwZSl7Y2Fz ZSJMT0dJQ0FMIjp2YXIgcmhzPWJ1aWxkVHJlZSgpLGxocz1idWlsZFRyZWUoKTty ZXR1cm4gbmV3IE9wZW5MYXllcnMuRmlsdGVyLkxvZ2ljYWwoe2ZpbHRlcnM6W2xo cyxyaHNdLHR5cGU6bG9naWNhbHNbdG9rLnRleHQudG9VcHBlckNhc2UoKV19KTtj YXNlIk5PVCI6dmFyIG9wZXJhbmQ9YnVpbGRUcmVlKCk7cmV0dXJuIG5ldyBPcGVu TGF5ZXJzLkZpbHRlci5Mb2dpY2FsKHtmaWx0ZXJzOltvcGVyYW5kXSx0eXBlOk9w ZW5MYXllcnMuRmlsdGVyLkxvZ2ljYWwuTk9UfSk7Y2FzZSJCRVRXRUVOIjp2YXIg bWluLG1heCxwcm9wZXJ0eTtwb3N0Zml4LnBvcCgpO21heD1idWlsZFRyZWUoKTtt aW49YnVpbGRUcmVlKCk7cHJvcGVydHk9YnVpbGRUcmVlKCk7cmV0dXJuIG5ldyBP cGVuTGF5ZXJzLkZpbHRlci5Db21wYXJpc29uKHtwcm9wZXJ0eTpwcm9wZXJ0eSxs b3dlckJvdW5kYXJ5Om1pbix1cHBlckJvdW5kYXJ5Om1heCx0eXBlOk9wZW5MYXll cnMuRmlsdGVyLkNvbXBhcmlzb24uQkVUV0VFTn0pO2Nhc2UiQ09NUEFSSVNPTiI6 dmFyIHZhbHVlPWJ1aWxkVHJlZSgpLHByb3BlcnR5PWJ1aWxkVHJlZSgpO3JldHVy biBuZXcgT3BlbkxheWVycy5GaWx0ZXIuQ29tcGFyaXNvbih7cHJvcGVydHk6cHJv cGVydHksdmFsdWU6dmFsdWUsdHlwZTpvcGVyYXRvcnNbdG9rLnRleHQudG9VcHBl ckNhc2UoKV19KTtjYXNlIlZBTFVFIjppZigoL14nLionJC8pLnRlc3QodG9rLnRl eHQpKXtyZXR1cm4gdG9rLnRleHQuc3Vic3RyKDEsdG9rLnRleHQubGVuZ3RoLTIp O31lbHNle3JldHVybiBOdW1iZXIodG9rLnRleHQpO30KY2FzZSJTUEFUSUFMIjpz d2l0Y2godG9rLnRleHQudG9VcHBlckNhc2UoKSl7Y2FzZSJCQk9YIjp2YXIgbWF4 eT1idWlsZFRyZWUoKSxtYXh4PWJ1aWxkVHJlZSgpLG1pbnk9YnVpbGRUcmVlKCks bWlueD1idWlsZFRyZWUoKSxwcm9wPWJ1aWxkVHJlZSgpO3JldHVybiBuZXcgT3Bl bkxheWVycy5GaWx0ZXIuU3BhdGlhbCh7dHlwZTpPcGVuTGF5ZXJzLkZpbHRlci5T cGF0aWFsLkJCT1gscHJvcGVydHk6cHJvcCx2YWx1ZTpPcGVuTGF5ZXJzLkJvdW5k cy5mcm9tQXJyYXkoW21pbngsbWlueSxtYXh4LG1heHldKX0pO2Nhc2UiSU5URVJT RUNUUyI6dmFyIHZhbHVlPWJ1aWxkVHJlZSgpLHByb3BlcnR5PWJ1aWxkVHJlZSgp O3JldHVybiBuZXcgT3BlbkxheWVycy5GaWx0ZXIuU3BhdGlhbCh7dHlwZTpPcGVu TGF5ZXJzLkZpbHRlci5TcGF0aWFsLklOVEVSU0VDVFMscHJvcGVydHk6cHJvcGVy dHksdmFsdWU6dmFsdWV9KTtjYXNlIldJVEhJTiI6dmFyIHZhbHVlPWJ1aWxkVHJl ZSgpLHByb3BlcnR5PWJ1aWxkVHJlZSgpO3JldHVybiBuZXcgT3BlbkxheWVycy5G aWx0ZXIuU3BhdGlhbCh7dHlwZTpPcGVuTGF5ZXJzLkZpbHRlci5TcGF0aWFsLldJ VEhJTixwcm9wZXJ0eTpwcm9wZXJ0eSx2YWx1ZTp2YWx1ZX0pO2Nhc2UiQ09OVEFJ TlMiOnZhciB2YWx1ZT1idWlsZFRyZWUoKSxwcm9wZXJ0eT1idWlsZFRyZWUoKTty ZXR1cm4gbmV3IE9wZW5MYXllcnMuRmlsdGVyLlNwYXRpYWwoe3R5cGU6T3Blbkxh eWVycy5GaWx0ZXIuU3BhdGlhbC5DT05UQUlOUyxwcm9wZXJ0eTpwcm9wZXJ0eSx2 YWx1ZTp2YWx1ZX0pO2Nhc2UiRFdJVEhJTiI6dmFyIGRpc3RhbmNlPWJ1aWxkVHJl ZSgpLHZhbHVlPWJ1aWxkVHJlZSgpLHByb3BlcnR5PWJ1aWxkVHJlZSgpO3JldHVy biBuZXcgT3BlbkxheWVycy5GaWx0ZXIuU3BhdGlhbCh7dHlwZTpPcGVuTGF5ZXJz LkZpbHRlci5TcGF0aWFsLkRXSVRISU4sdmFsdWU6dmFsdWUscHJvcGVydHk6cHJv cGVydHksZGlzdGFuY2U6TnVtYmVyKGRpc3RhbmNlKX0pO30KY2FzZSJHRU9NRVRS WSI6cmV0dXJuIE9wZW5MYXllcnMuR2VvbWV0cnkuZnJvbVdLVCh0b2sudGV4dCk7 ZGVmYXVsdDpyZXR1cm4gdG9rLnRleHQ7fX0KdmFyIHJlc3VsdD1idWlsZFRyZWUo KTtpZihwb3N0Zml4Lmxlbmd0aD4wKXt2YXIgbXNnPSJSZW1haW5pbmcgdG9rZW5z IGFmdGVyIGJ1aWxkaW5nIEFTVDogXG4iO2Zvcih2YXIgaT1wb3N0Zml4Lmxlbmd0 aC0xO2k+PTA7aS0tKXttc2crPXBvc3RmaXhbaV0udHlwZSsiOiAiK3Bvc3RmaXhb aV0udGV4dCsiXG4iO30KdGhyb3cgbmV3IEVycm9yKG1zZyk7fQpyZXR1cm4gcmVz dWx0O30KcmV0dXJuIE9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Gb3JtYXQs e3JlYWQ6ZnVuY3Rpb24odGV4dCl7dmFyIHJlc3VsdD1idWlsZEFzdCh0b2tlbml6 ZSh0ZXh0KSk7aWYodGhpcy5rZWVwRGF0YSl7dGhpcy5kYXRhPXJlc3VsdDt9O3Jl dHVybiByZXN1bHQ7fSx3cml0ZTpmdW5jdGlvbihmaWx0ZXIpe2lmKGZpbHRlciBp bnN0YW5jZW9mIE9wZW5MYXllcnMuR2VvbWV0cnkpe3JldHVybiBmaWx0ZXIudG9T dHJpbmcoKTt9CnN3aXRjaChmaWx0ZXIuQ0xBU1NfTkFNRSl7Y2FzZSJPcGVuTGF5 ZXJzLkZpbHRlci5TcGF0aWFsIjpzd2l0Y2goZmlsdGVyLnR5cGUpe2Nhc2UgT3Bl bkxheWVycy5GaWx0ZXIuU3BhdGlhbC5CQk9YOnJldHVybiJCQk9YKCIrCmZpbHRl ci5wcm9wZXJ0eSsiLCIrCmZpbHRlci52YWx1ZS50b0JCT1goKSsiKSI7Y2FzZSBP cGVuTGF5ZXJzLkZpbHRlci5TcGF0aWFsLkRXSVRISU46cmV0dXJuIkRXSVRISU4o IisKZmlsdGVyLnByb3BlcnR5KyIsICIrCnRoaXMud3JpdGUoZmlsdGVyLnZhbHVl KSsiLCAiKwpmaWx0ZXIuZGlzdGFuY2UrIikiO2Nhc2UgT3BlbkxheWVycy5GaWx0 ZXIuU3BhdGlhbC5XSVRISU46cmV0dXJuIldJVEhJTigiKwpmaWx0ZXIucHJvcGVy dHkrIiwgIisKdGhpcy53cml0ZShmaWx0ZXIudmFsdWUpKyIpIjtjYXNlIE9wZW5M YXllcnMuRmlsdGVyLlNwYXRpYWwuSU5URVJTRUNUUzpyZXR1cm4iSU5URVJTRUNU UygiKwpmaWx0ZXIucHJvcGVydHkrIiwgIisKdGhpcy53cml0ZShmaWx0ZXIudmFs dWUpKyIpIjtjYXNlIE9wZW5MYXllcnMuRmlsdGVyLlNwYXRpYWwuQ09OVEFJTlM6 cmV0dXJuIkNPTlRBSU5TKCIrCmZpbHRlci5wcm9wZXJ0eSsiLCAiKwp0aGlzLndy aXRlKGZpbHRlci52YWx1ZSkrIikiO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJV bmtub3duIHNwYXRpYWwgZmlsdGVyIHR5cGU6ICIrZmlsdGVyLnR5cGUpO30KY2Fz ZSJPcGVuTGF5ZXJzLkZpbHRlci5Mb2dpY2FsIjppZihmaWx0ZXIudHlwZT09T3Bl bkxheWVycy5GaWx0ZXIuTG9naWNhbC5OT1Qpe3JldHVybiJOT1QgKCIrdGhpcy53 cml0ZShmaWx0ZXIuZmlsdGVyc1swXSkrIikiO31lbHNle3ZhciByZXM9IigiO3Zh ciBmaXJzdD10cnVlO2Zvcih2YXIgaT0wO2k8ZmlsdGVyLmZpbHRlcnMubGVuZ3Ro O2krKyl7aWYoZmlyc3Qpe2ZpcnN0PWZhbHNlO31lbHNle3Jlcys9IikgIitsb2dp Y2FsUmV2ZXJzZVtmaWx0ZXIudHlwZV0rIiAoIjt9CnJlcys9dGhpcy53cml0ZShm aWx0ZXIuZmlsdGVyc1tpXSk7fQpyZXR1cm4gcmVzKyIpIjt9CmNhc2UiT3Blbkxh eWVycy5GaWx0ZXIuQ29tcGFyaXNvbiI6aWYoZmlsdGVyLnR5cGU9PU9wZW5MYXll cnMuRmlsdGVyLkNvbXBhcmlzb24uQkVUV0VFTil7cmV0dXJuIGZpbHRlci5wcm9w ZXJ0eSsiIEJFVFdFRU4gIisKdGhpcy53cml0ZShmaWx0ZXIubG93ZXJCb3VuZGFy eSkrIiBBTkQgIisKdGhpcy53cml0ZShmaWx0ZXIudXBwZXJCb3VuZGFyeSk7fWVs c2V7cmV0dXJuIGZpbHRlci5wcm9wZXJ0eSsiICIrb3BlcmF0b3JSZXZlcnNlW2Zp bHRlci50eXBlXSsiICIrCnRoaXMud3JpdGUoZmlsdGVyLnZhbHVlKTt9CmNhc2Ug dW5kZWZpbmVkOmlmKHR5cGVvZiBmaWx0ZXI9PT0ic3RyaW5nIil7cmV0dXJuIici K2ZpbHRlcisiJyI7fWVsc2UgaWYodHlwZW9mIGZpbHRlcj09PSJudW1iZXIiKXty ZXR1cm4gU3RyaW5nKGZpbHRlcik7fQpkZWZhdWx0OnRocm93IG5ldyBFcnJvcigi Q2FuJ3QgZW5jb2RlOiAiK2ZpbHRlci5DTEFTU19OQU1FKyIgIitmaWx0ZXIpO319 LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRm9ybWF0LkNRTCJ9KTt9KSgpO09wZW5M YXllcnMuQ29udHJvbC5TcGxpdD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMu Q29udHJvbCx7RVZFTlRfVFlQRVM6WyJiZWZvcmVzcGxpdCIsInNwbGl0IiwiYWZ0 ZXJzcGxpdCJdLGxheWVyOm51bGwsc291cmNlOm51bGwsc291cmNlT3B0aW9uczpu dWxsLHRvbGVyYW5jZTpudWxsLGVkZ2U6dHJ1ZSxkZWZlckRlbGV0ZTpmYWxzZSxt dXR1YWw6dHJ1ZSx0YXJnZXRGaWx0ZXI6bnVsbCxzb3VyY2VGaWx0ZXI6bnVsbCxo YW5kbGVyOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXtBcnJheS5w cm90b3R5cGUucHVzaC5hcHBseSh0aGlzLkVWRU5UX1RZUEVTLE9wZW5MYXllcnMu Q29udHJvbC5wcm90b3R5cGUuRVZFTlRfVFlQRVMpO09wZW5MYXllcnMuQ29udHJv bC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7dGhp cy5vcHRpb25zPW9wdGlvbnN8fHt9O2lmKHRoaXMub3B0aW9ucy5zb3VyY2Upe3Ro aXMuc2V0U291cmNlKHRoaXMub3B0aW9ucy5zb3VyY2UpO319LHNldFNvdXJjZTpm dW5jdGlvbihsYXllcil7aWYodGhpcy5hY3RpdmUpe3RoaXMuZGVhY3RpdmF0ZSgp O2lmKHRoaXMuaGFuZGxlcil7dGhpcy5oYW5kbGVyLmRlc3Ryb3koKTtkZWxldGUg dGhpcy5oYW5kbGVyO30KdGhpcy5zb3VyY2U9bGF5ZXI7dGhpcy5hY3RpdmF0ZSgp O31lbHNle3RoaXMuc291cmNlPWxheWVyO319LGFjdGl2YXRlOmZ1bmN0aW9uKCl7 dmFyIGFjdGl2YXRlZD1PcGVuTGF5ZXJzLkNvbnRyb2wucHJvdG90eXBlLmFjdGl2 YXRlLmNhbGwodGhpcyk7aWYoYWN0aXZhdGVkKXtpZighdGhpcy5zb3VyY2Upe2lm KCF0aGlzLmhhbmRsZXIpe3RoaXMuaGFuZGxlcj1uZXcgT3BlbkxheWVycy5IYW5k bGVyLlBhdGgodGhpcyx7ZG9uZTpmdW5jdGlvbihnZW9tZXRyeSl7dGhpcy5vblNr ZXRjaENvbXBsZXRlKHtmZWF0dXJlOm5ldyBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVj dG9yKGdlb21ldHJ5KX0pO319LHtsYXllck9wdGlvbnM6dGhpcy5zb3VyY2VPcHRp b25zfSk7fQp0aGlzLmhhbmRsZXIuYWN0aXZhdGUoKTt9ZWxzZSBpZih0aGlzLnNv dXJjZS5ldmVudHMpe3RoaXMuc291cmNlLmV2ZW50cy5vbih7c2tldGNoY29tcGxl dGU6dGhpcy5vblNrZXRjaENvbXBsZXRlLGFmdGVyZmVhdHVyZW1vZGlmaWVkOnRo aXMuYWZ0ZXJGZWF0dXJlTW9kaWZpZWQsc2NvcGU6dGhpc30pO319CnJldHVybiBh Y3RpdmF0ZWQ7fSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7dmFyIGRlYWN0aXZhdGVk PU9wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUuZGVhY3RpdmF0ZS5jYWxsKHRo aXMpO2lmKGRlYWN0aXZhdGVkKXtpZih0aGlzLnNvdXJjZSYmdGhpcy5zb3VyY2Uu ZXZlbnRzKXt0aGlzLmxheWVyLmV2ZW50cy51bih7c2tldGNoY29tcGxldGU6dGhp cy5vblNrZXRjaENvbXBsZXRlLGFmdGVyZmVhdHVyZW1vZGlmaWVkOnRoaXMuYWZ0 ZXJGZWF0dXJlTW9kaWZpZWQsc2NvcGU6dGhpc30pO319CnJldHVybiBkZWFjdGl2 YXRlZDt9LG9uU2tldGNoQ29tcGxldGU6ZnVuY3Rpb24oZXZlbnQpe3RoaXMuZmVh dHVyZT1udWxsO3JldHVybiF0aGlzLmNvbnNpZGVyU3BsaXQoZXZlbnQuZmVhdHVy ZSk7fSxhZnRlckZlYXR1cmVNb2RpZmllZDpmdW5jdGlvbihldmVudCl7aWYoZXZl bnQubW9kaWZpZWQpe3ZhciBmZWF0dXJlPWV2ZW50LmZlYXR1cmU7aWYoZmVhdHVy ZS5nZW9tZXRyeSBpbnN0YW5jZW9mIE9wZW5MYXllcnMuR2VvbWV0cnkuTGluZVN0 cmluZ3x8ZmVhdHVyZS5nZW9tZXRyeSBpbnN0YW5jZW9mIE9wZW5MYXllcnMuR2Vv bWV0cnkuTXVsdGlMaW5lU3RyaW5nKXt0aGlzLmZlYXR1cmU9ZXZlbnQuZmVhdHVy ZTt0aGlzLmNvbnNpZGVyU3BsaXQoZXZlbnQuZmVhdHVyZSk7fX19LHJlbW92ZUJ5 R2VvbWV0cnk6ZnVuY3Rpb24oZmVhdHVyZXMsZ2VvbWV0cnkpe2Zvcih2YXIgaT0w LGxlbj1mZWF0dXJlcy5sZW5ndGg7aTxsZW47KytpKXtpZihmZWF0dXJlc1tpXS5n ZW9tZXRyeT09PWdlb21ldHJ5KXtmZWF0dXJlcy5zcGxpY2UoaSwxKTticmVhazt9 fX0saXNFbGlnaWJsZTpmdW5jdGlvbih0YXJnZXQpe3JldHVybih0YXJnZXQuc3Rh dGUhPT1PcGVuTGF5ZXJzLlN0YXRlLkRFTEVURSkmJih0YXJnZXQuZ2VvbWV0cnkg aW5zdGFuY2VvZiBPcGVuTGF5ZXJzLkdlb21ldHJ5LkxpbmVTdHJpbmd8fHRhcmdl dC5nZW9tZXRyeSBpbnN0YW5jZW9mIE9wZW5MYXllcnMuR2VvbWV0cnkuTXVsdGlM aW5lU3RyaW5nKSYmKHRoaXMuZmVhdHVyZSE9PXRhcmdldCkmJighdGhpcy50YXJn ZXRGaWx0ZXJ8fHRoaXMudGFyZ2V0RmlsdGVyLmV2YWx1YXRlKHRhcmdldC5hdHRy aWJ1dGVzKSk7fSxjb25zaWRlclNwbGl0OmZ1bmN0aW9uKGZlYXR1cmUpe3ZhciBz b3VyY2VTcGxpdD1mYWxzZTt2YXIgdGFyZ2V0U3BsaXQ9ZmFsc2U7aWYoIXRoaXMu c291cmNlRmlsdGVyfHx0aGlzLnNvdXJjZUZpbHRlci5ldmFsdWF0ZShmZWF0dXJl LmF0dHJpYnV0ZXMpKXt2YXIgZmVhdHVyZXM9dGhpcy5sYXllciYmdGhpcy5sYXll ci5mZWF0dXJlc3x8W107dmFyIHRhcmdldCxyZXN1bHRzLHByb2NlZWQ7dmFyIGFk ZGl0aW9ucz1bXSxyZW1vdmFscz1bXTt2YXIgbXV0dWFsPSh0aGlzLmxheWVyPT09 dGhpcy5zb3VyY2UpJiZ0aGlzLm11dHVhbDt2YXIgb3B0aW9ucz17ZWRnZTp0aGlz LmVkZ2UsdG9sZXJhbmNlOnRoaXMudG9sZXJhbmNlLG11dHVhbDptdXR1YWx9O3Zh ciBzb3VyY2VQYXJ0cz1bZmVhdHVyZS5nZW9tZXRyeV07dmFyIHRhcmdldEZlYXR1 cmUsdGFyZ2V0UGFydHM7dmFyIHNvdXJjZSxwYXJ0cztmb3IodmFyIGk9MCxsZW49 ZmVhdHVyZXMubGVuZ3RoO2k8bGVuOysraSl7dGFyZ2V0RmVhdHVyZT1mZWF0dXJl c1tpXTtpZih0aGlzLmlzRWxpZ2libGUodGFyZ2V0RmVhdHVyZSkpe3RhcmdldFBh cnRzPVt0YXJnZXRGZWF0dXJlLmdlb21ldHJ5XTtmb3IodmFyIGo9MDtqPHNvdXJj ZVBhcnRzLmxlbmd0aDsrK2ope3NvdXJjZT1zb3VyY2VQYXJ0c1tqXTtmb3IodmFy IGs9MDtrPHRhcmdldFBhcnRzLmxlbmd0aDsrK2spe3RhcmdldD10YXJnZXRQYXJ0 c1trXTtpZihzb3VyY2UuZ2V0Qm91bmRzKCkuaW50ZXJzZWN0c0JvdW5kcyh0YXJn ZXQuZ2V0Qm91bmRzKCkpKXtyZXN1bHRzPXNvdXJjZS5zcGxpdCh0YXJnZXQsb3B0 aW9ucyk7aWYocmVzdWx0cyl7cHJvY2VlZD10aGlzLmV2ZW50cy50cmlnZ2VyRXZl bnQoImJlZm9yZXNwbGl0Iix7c291cmNlOmZlYXR1cmUsdGFyZ2V0OnRhcmdldEZl YXR1cmV9KTtpZihwcm9jZWVkIT09ZmFsc2Upe2lmKG11dHVhbCl7cGFydHM9cmVz dWx0c1swXTtpZihwYXJ0cy5sZW5ndGg+MSl7cGFydHMudW5zaGlmdChqLDEpO0Fy cmF5LnByb3RvdHlwZS5zcGxpY2UuYXBwbHkoc291cmNlUGFydHMscGFydHMpO2or PXBhcnRzLmxlbmd0aC0zO30KcmVzdWx0cz1yZXN1bHRzWzFdO30KaWYocmVzdWx0 cy5sZW5ndGg+MSl7cmVzdWx0cy51bnNoaWZ0KGssMSk7QXJyYXkucHJvdG90eXBl LnNwbGljZS5hcHBseSh0YXJnZXRQYXJ0cyxyZXN1bHRzKTtrKz1yZXN1bHRzLmxl bmd0aC0zO319fX19fQppZih0YXJnZXRQYXJ0cyYmdGFyZ2V0UGFydHMubGVuZ3Ro PjEpe3RoaXMuZ2VvbXNUb0ZlYXR1cmVzKHRhcmdldEZlYXR1cmUsdGFyZ2V0UGFy dHMpO3RoaXMuZXZlbnRzLnRyaWdnZXJFdmVudCgic3BsaXQiLHtvcmlnaW5hbDp0 YXJnZXRGZWF0dXJlLGZlYXR1cmVzOnRhcmdldFBhcnRzfSk7QXJyYXkucHJvdG90 eXBlLnB1c2guYXBwbHkoYWRkaXRpb25zLHRhcmdldFBhcnRzKTtyZW1vdmFscy5w dXNoKHRhcmdldEZlYXR1cmUpO3RhcmdldFNwbGl0PXRydWU7fX19CmlmKHNvdXJj ZVBhcnRzJiZzb3VyY2VQYXJ0cy5sZW5ndGg+MSl7dGhpcy5nZW9tc1RvRmVhdHVy ZXMoZmVhdHVyZSxzb3VyY2VQYXJ0cyk7dGhpcy5ldmVudHMudHJpZ2dlckV2ZW50 KCJzcGxpdCIse29yaWdpbmFsOmZlYXR1cmUsZmVhdHVyZXM6c291cmNlUGFydHN9 KTtBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShhZGRpdGlvbnMsc291cmNlUGFy dHMpO3JlbW92YWxzLnB1c2goZmVhdHVyZSk7c291cmNlU3BsaXQ9dHJ1ZTt9Cmlm KHNvdXJjZVNwbGl0fHx0YXJnZXRTcGxpdCl7aWYodGhpcy5kZWZlckRlbGV0ZSl7 dmFyIGZlYXQsZGVzdHJveXM9W107Zm9yKHZhciBpPTAsbGVuPXJlbW92YWxzLmxl bmd0aDtpPGxlbjsrK2kpe2ZlYXQ9cmVtb3ZhbHNbaV07aWYoZmVhdC5zdGF0ZT09 PU9wZW5MYXllcnMuU3RhdGUuSU5TRVJUKXtkZXN0cm95cy5wdXNoKGZlYXQpO31l bHNle2ZlYXQuc3RhdGU9T3BlbkxheWVycy5TdGF0ZS5ERUxFVEU7dGhpcy5sYXll ci5kcmF3RmVhdHVyZShmZWF0KTt9fQp0aGlzLmxheWVyLmRlc3Ryb3lGZWF0dXJl cyhkZXN0cm95cyx7c2lsZW50OnRydWV9KTtmb3IodmFyIGk9MCxsZW49YWRkaXRp b25zLmxlbmd0aDtpPGxlbjsrK2kpe2FkZGl0aW9uc1tpXS5zdGF0ZT1PcGVuTGF5 ZXJzLlN0YXRlLklOU0VSVDt9fWVsc2V7dGhpcy5sYXllci5kZXN0cm95RmVhdHVy ZXMocmVtb3ZhbHMse3NpbGVudDp0cnVlfSk7fQp0aGlzLmxheWVyLmFkZEZlYXR1 cmVzKGFkZGl0aW9ucyx7c2lsZW50OnRydWV9KTt0aGlzLmV2ZW50cy50cmlnZ2Vy RXZlbnQoImFmdGVyc3BsaXQiLHtzb3VyY2U6ZmVhdHVyZSxmZWF0dXJlczphZGRp dGlvbnN9KTt9fQpyZXR1cm4gc291cmNlU3BsaXQ7fSxnZW9tc1RvRmVhdHVyZXM6 ZnVuY3Rpb24oZmVhdHVyZSxnZW9tcyl7dmFyIGNsb25lPWZlYXR1cmUuY2xvbmUo KTtkZWxldGUgY2xvbmUuZ2VvbWV0cnk7dmFyIG5ld0ZlYXR1cmU7Zm9yKHZhciBp PTAsbGVuPWdlb21zLmxlbmd0aDtpPGxlbjsrK2kpe25ld0ZlYXR1cmU9Y2xvbmUu Y2xvbmUoKTtuZXdGZWF0dXJlLmdlb21ldHJ5PWdlb21zW2ldO25ld0ZlYXR1cmUu c3RhdGU9T3BlbkxheWVycy5TdGF0ZS5JTlNFUlQ7Z2VvbXNbaV09bmV3RmVhdHVy ZTt9fSxkZXN0cm95OmZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3RoaXMuZGVh Y3RpdmF0ZSgpO30KT3BlbkxheWVycy5Db250cm9sLnByb3RvdHlwZS5kZXN0cm95 LmNhbGwodGhpcyk7fSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkNvbnRyb2wuU3Bs aXQifSk7T3BlbkxheWVycy5MYXllci5XTVRTPU9wZW5MYXllcnMuQ2xhc3MoT3Bl bkxheWVycy5MYXllci5HcmlkLHtpc0Jhc2VMYXllcjp0cnVlLHZlcnNpb246IjEu MC4wIixyZXF1ZXN0RW5jb2Rpbmc6IktWUCIsdXJsOm51bGwsbGF5ZXI6bnVsbCxt YXRyaXhTZXQ6bnVsbCxzdHlsZTpudWxsLGZvcm1hdDoiaW1hZ2UvanBlZyIsdGls ZU9yaWdpbjpudWxsLHRpbGVGdWxsRXh0ZW50Om51bGwsZm9ybWF0U3VmZml4Om51 bGwsbWF0cml4SWRzOm51bGwsZGltZW5zaW9uczpudWxsLHBhcmFtczpudWxsLHpv b21PZmZzZXQ6MCxmb3JtYXRTdWZmaXhNYXA6eyJpbWFnZS9wbmciOiJwbmciLCJp bWFnZS9wbmc4IjoicG5nIiwiaW1hZ2UvcG5nMjQiOiJwbmciLCJpbWFnZS9wbmcz MiI6InBuZyIsInBuZyI6InBuZyIsImltYWdlL2pwZWciOiJqcGciLCJpbWFnZS9q cGciOiJqcGciLCJqcGVnIjoianBnIiwianBnIjoianBnIn0sbWF0cml4Om51bGws aW5pdGlhbGl6ZTpmdW5jdGlvbihjb25maWcpe3ZhciByZXF1aXJlZD17dXJsOnRy dWUsbGF5ZXI6dHJ1ZSxzdHlsZTp0cnVlLG1hdHJpeFNldDp0cnVlfTtmb3IodmFy IHByb3AgaW4gcmVxdWlyZWQpe2lmKCEocHJvcCBpbiBjb25maWcpKXt0aHJvdyBu ZXcgRXJyb3IoIk1pc3NpbmcgcHJvcGVydHkgJyIrcHJvcCsiJyBpbiBsYXllciBj b25maWd1cmF0aW9uLiIpO319CmNvbmZpZy5wYXJhbXM9T3BlbkxheWVycy5VdGls LnVwcGVyQ2FzZU9iamVjdChjb25maWcucGFyYW1zKTt2YXIgYXJncz1bY29uZmln Lm5hbWUsY29uZmlnLnVybCxjb25maWcucGFyYW1zLGNvbmZpZ107T3BlbkxheWVy cy5MYXllci5HcmlkLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJn cyk7aWYoIXRoaXMuZm9ybWF0U3VmZml4KXt0aGlzLmZvcm1hdFN1ZmZpeD10aGlz LmZvcm1hdFN1ZmZpeE1hcFt0aGlzLmZvcm1hdF18fHRoaXMuZm9ybWF0LnNwbGl0 KCIvIikucG9wKCk7fQppZih0aGlzLm1hdHJpeElkcyl7dmFyIGxlbj10aGlzLm1h dHJpeElkcy5sZW5ndGg7aWYobGVuJiZ0eXBlb2YgdGhpcy5tYXRyaXhJZHNbMF09 PT0ic3RyaW5nIil7dmFyIGlkcz10aGlzLm1hdHJpeElkczt0aGlzLm1hdHJpeElk cz1uZXcgQXJyYXkobGVuKTtmb3IodmFyIGk9MDtpPGxlbjsrK2kpe3RoaXMubWF0 cml4SWRzW2ldPXtpZGVudGlmaWVyOmlkc1tpXX07fX19fSxzZXRNYXA6ZnVuY3Rp b24oKXtPcGVuTGF5ZXJzLkxheWVyLkdyaWQucHJvdG90eXBlLnNldE1hcC5hcHBs eSh0aGlzLGFyZ3VtZW50cyk7dGhpcy51cGRhdGVNYXRyaXhQcm9wZXJ0aWVzKCk7 fSx1cGRhdGVNYXRyaXhQcm9wZXJ0aWVzOmZ1bmN0aW9uKCl7dGhpcy5tYXRyaXg9 dGhpcy5nZXRNYXRyaXgoKTtpZih0aGlzLm1hdHJpeCl7aWYodGhpcy5tYXRyaXgu dG9wTGVmdENvcm5lcil7dGhpcy50aWxlT3JpZ2luPXRoaXMubWF0cml4LnRvcExl ZnRDb3JuZXI7fQppZih0aGlzLm1hdHJpeC50aWxlV2lkdGgmJnRoaXMubWF0cml4 LnRpbGVIZWlnaHQpe3RoaXMudGlsZVNpemU9bmV3IE9wZW5MYXllcnMuU2l6ZSh0 aGlzLm1hdHJpeC50aWxlV2lkdGgsdGhpcy5tYXRyaXgudGlsZUhlaWdodCk7fQpp ZighdGhpcy50aWxlT3JpZ2luKXt0aGlzLnRpbGVPcmlnaW49bmV3IE9wZW5MYXll cnMuTG9uTGF0KHRoaXMubWF4RXh0ZW50LmxlZnQsdGhpcy5tYXhFeHRlbnQudG9w KTt9CmlmKCF0aGlzLnRpbGVGdWxsRXh0ZW50KXt0aGlzLnRpbGVGdWxsRXh0ZW50 PXRoaXMubWF4RXh0ZW50O319fSxtb3ZlVG86ZnVuY3Rpb24oYm91bmRzLHpvb21D aGFuZ2VkLGRyYWdnaW5nKXtpZih6b29tQ2hhbmdlZHx8IXRoaXMubWF0cml4KXt0 aGlzLnVwZGF0ZU1hdHJpeFByb3BlcnRpZXMoKTt9CnJldHVybiBPcGVuTGF5ZXJz LkxheWVyLkdyaWQucHJvdG90eXBlLm1vdmVUby5hcHBseSh0aGlzLGFyZ3VtZW50 cyk7fSxjbG9uZTpmdW5jdGlvbihvYmope2lmKG9iaj09bnVsbCl7b2JqPW5ldyBP cGVuTGF5ZXJzLkxheWVyLldNVFModGhpcy5vcHRpb25zKTt9Cm9iaj1PcGVuTGF5 ZXJzLkxheWVyLkdyaWQucHJvdG90eXBlLmNsb25lLmFwcGx5KHRoaXMsW29ial0p O3JldHVybiBvYmo7fSxnZXRNYXRyaXg6ZnVuY3Rpb24oKXt2YXIgbWF0cml4O2lm KCF0aGlzLm1hdHJpeElkc3x8dGhpcy5tYXRyaXhJZHMubGVuZ3RoPT09MCl7bWF0 cml4PXtpZGVudGlmaWVyOnRoaXMubWFwLmdldFpvb20oKSt0aGlzLnpvb21PZmZz ZXR9O31lbHNle2lmKCJzY2FsZURlbm9taW5hdG9yImluIHRoaXMubWF0cml4SWRz WzBdKXt2YXIgZGVub209T3BlbkxheWVycy5NRVRFUlNfUEVSX0lOQ0gqT3Blbkxh eWVycy5JTkNIRVNfUEVSX1VOSVRbdGhpcy51bml0c10qdGhpcy5tYXAuZ2V0UmVz b2x1dGlvbigpLzAuMjhFLTM7dmFyIGRpZmY9TnVtYmVyLlBPU0lUSVZFX0lORklO SVRZO3ZhciBkZWx0YTtmb3IodmFyIGk9MCxpaT10aGlzLm1hdHJpeElkcy5sZW5n dGg7aTxpaTsrK2kpe2RlbHRhPU1hdGguYWJzKDEtKHRoaXMubWF0cml4SWRzW2ld LnNjYWxlRGVub21pbmF0b3IvZGVub20pKTtpZihkZWx0YTxkaWZmKXtkaWZmPWRl bHRhO21hdHJpeD10aGlzLm1hdHJpeElkc1tpXTt9fX1lbHNle21hdHJpeD10aGlz Lm1hdHJpeElkc1t0aGlzLm1hcC5nZXRab29tKCkrdGhpcy56b29tT2Zmc2V0XTt9 fQpyZXR1cm4gbWF0cml4O30sZ2V0VGlsZUluZm86ZnVuY3Rpb24obG9jKXt2YXIg cmVzPXRoaXMubWFwLmdldFJlc29sdXRpb24oKTt2YXIgZng9KGxvYy5sb24tdGhp cy50aWxlT3JpZ2luLmxvbikvKHJlcyp0aGlzLnRpbGVTaXplLncpO3ZhciBmeT0o dGhpcy50aWxlT3JpZ2luLmxhdC1sb2MubGF0KS8ocmVzKnRoaXMudGlsZVNpemUu aCk7dmFyIGNvbD1NYXRoLmZsb29yKGZ4KTt2YXIgcm93PU1hdGguZmxvb3IoZnkp O3JldHVybntjb2w6Y29sLHJvdzpyb3csaTpNYXRoLmZsb29yKChmeC1jb2wpKnRo aXMudGlsZVNpemUudyksajpNYXRoLmZsb29yKChmeS1yb3cpKnRoaXMudGlsZVNp emUuaCl9O30sZ2V0VVJMOmZ1bmN0aW9uKGJvdW5kcyl7Ym91bmRzPXRoaXMuYWRq dXN0Qm91bmRzKGJvdW5kcyk7dmFyIHVybD0iIjtpZighdGhpcy50aWxlRnVsbEV4 dGVudHx8dGhpcy50aWxlRnVsbEV4dGVudC5pbnRlcnNlY3RzQm91bmRzKGJvdW5k cykpe3ZhciBjZW50ZXI9Ym91bmRzLmdldENlbnRlckxvbkxhdCgpO3ZhciBpbmZv PXRoaXMuZ2V0VGlsZUluZm8oY2VudGVyKTt2YXIgbWF0cml4SWQ9dGhpcy5tYXRy aXguaWRlbnRpZmllcjtpZih0aGlzLnJlcXVlc3RFbmNvZGluZy50b1VwcGVyQ2Fz ZSgpPT09IlJFU1QiKXt2YXIgcGF0aD10aGlzLnZlcnNpb24rIi8iK3RoaXMubGF5 ZXIrIi8iK3RoaXMuc3R5bGUrIi8iO2lmKHRoaXMuZGltZW5zaW9ucyl7Zm9yKHZh ciBpPTA7aTx0aGlzLmRpbWVuc2lvbnMubGVuZ3RoO2krKyl7aWYodGhpcy5wYXJh bXNbdGhpcy5kaW1lbnNpb25zW2ldXSl7cGF0aD1wYXRoK3RoaXMucGFyYW1zW3Ro aXMuZGltZW5zaW9uc1tpXV0rIi8iO319fQpwYXRoPXBhdGgrdGhpcy5tYXRyaXhT ZXQrIi8iK3RoaXMubWF0cml4LmlkZW50aWZpZXIrIi8iK2luZm8ucm93KyIvIitp bmZvLmNvbCsiLiIrdGhpcy5mb3JtYXRTdWZmaXg7aWYoT3BlbkxheWVycy5VdGls LmlzQXJyYXkodGhpcy51cmwpKXt1cmw9dGhpcy5zZWxlY3RVcmwocGF0aCx0aGlz LnVybCk7fWVsc2V7dXJsPXRoaXMudXJsO30KaWYoIXVybC5tYXRjaCgvXC8kLykp e3VybD11cmwrIi8iO30KdXJsPXVybCtwYXRoO31lbHNlIGlmKHRoaXMucmVxdWVz dEVuY29kaW5nLnRvVXBwZXJDYXNlKCk9PT0iS1ZQIil7dmFyIHBhcmFtcz17U0VS VklDRToiV01UUyIsUkVRVUVTVDoiR2V0VGlsZSIsVkVSU0lPTjp0aGlzLnZlcnNp b24sTEFZRVI6dGhpcy5sYXllcixTVFlMRTp0aGlzLnN0eWxlLFRJTEVNQVRSSVhT RVQ6dGhpcy5tYXRyaXhTZXQsVElMRU1BVFJJWDp0aGlzLm1hdHJpeC5pZGVudGlm aWVyLFRJTEVST1c6aW5mby5yb3csVElMRUNPTDppbmZvLmNvbCxGT1JNQVQ6dGhp cy5mb3JtYXR9O3VybD1PcGVuTGF5ZXJzLkxheWVyLkdyaWQucHJvdG90eXBlLmdl dEZ1bGxSZXF1ZXN0U3RyaW5nLmFwcGx5KHRoaXMsW3BhcmFtc10pO319CnJldHVy biB1cmw7fSxtZXJnZU5ld1BhcmFtczpmdW5jdGlvbihuZXdQYXJhbXMpe2lmKHRo aXMucmVxdWVzdEVuY29kaW5nLnRvVXBwZXJDYXNlKCk9PT0iS1ZQIil7cmV0dXJu IE9wZW5MYXllcnMuTGF5ZXIuR3JpZC5wcm90b3R5cGUubWVyZ2VOZXdQYXJhbXMu YXBwbHkodGhpcyxbT3BlbkxheWVycy5VdGlsLnVwcGVyQ2FzZU9iamVjdChuZXdQ YXJhbXMpXSk7fX0sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5MYXllci5XTVRTIn0p O09wZW5MYXllcnMuUHJvdG9jb2wuU09TLnYxXzBfMD1PcGVuTGF5ZXJzLkNsYXNz KE9wZW5MYXllcnMuUHJvdG9jb2wse2ZvaXM6bnVsbCxmb3JtYXRPcHRpb25zOm51 bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXtPcGVuTGF5ZXJzLlByb3Rv Y29sLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW29wdGlvbnNdKTtp Zighb3B0aW9ucy5mb3JtYXQpe3RoaXMuZm9ybWF0PW5ldyBPcGVuTGF5ZXJzLkZv cm1hdC5TT1NHZXRGZWF0dXJlT2ZJbnRlcmVzdCh0aGlzLmZvcm1hdE9wdGlvbnMp O319LGRlc3Ryb3k6ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMmJiF0aGlzLm9w dGlvbnMuZm9ybWF0KXt0aGlzLmZvcm1hdC5kZXN0cm95KCk7fQp0aGlzLmZvcm1h dD1udWxsO09wZW5MYXllcnMuUHJvdG9jb2wucHJvdG90eXBlLmRlc3Ryb3kuYXBw bHkodGhpcyk7fSxyZWFkOmZ1bmN0aW9uKG9wdGlvbnMpe29wdGlvbnM9T3Blbkxh eWVycy5VdGlsLmV4dGVuZCh7fSxvcHRpb25zKTtPcGVuTGF5ZXJzLlV0aWwuYXBw bHlEZWZhdWx0cyhvcHRpb25zLHRoaXMub3B0aW9uc3x8e30pO3ZhciByZXNwb25z ZT1uZXcgT3BlbkxheWVycy5Qcm90b2NvbC5SZXNwb25zZSh7cmVxdWVzdFR5cGU6 InJlYWQifSk7dmFyIGZvcm1hdD10aGlzLmZvcm1hdDt2YXIgZGF0YT1PcGVuTGF5 ZXJzLkZvcm1hdC5YTUwucHJvdG90eXBlLndyaXRlLmFwcGx5KGZvcm1hdCxbZm9y bWF0LndyaXRlTm9kZSgic29zOkdldEZlYXR1cmVPZkludGVyZXN0Iix7Zm9pczp0 aGlzLmZvaXN9KV0pO3Jlc3BvbnNlLnByaXY9T3BlbkxheWVycy5SZXF1ZXN0LlBP U1Qoe3VybDpvcHRpb25zLnVybCxjYWxsYmFjazp0aGlzLmNyZWF0ZUNhbGxiYWNr KHRoaXMuaGFuZGxlUmVhZCxyZXNwb25zZSxvcHRpb25zKSxkYXRhOmRhdGF9KTty ZXR1cm4gcmVzcG9uc2U7fSxoYW5kbGVSZWFkOmZ1bmN0aW9uKHJlc3BvbnNlLG9w dGlvbnMpe2lmKG9wdGlvbnMuY2FsbGJhY2spe3ZhciByZXF1ZXN0PXJlc3BvbnNl LnByaXY7aWYocmVxdWVzdC5zdGF0dXM+PTIwMCYmcmVxdWVzdC5zdGF0dXM8MzAw KXtyZXNwb25zZS5mZWF0dXJlcz10aGlzLnBhcnNlRmVhdHVyZXMocmVxdWVzdCk7 cmVzcG9uc2UuY29kZT1PcGVuTGF5ZXJzLlByb3RvY29sLlJlc3BvbnNlLlNVQ0NF U1M7fWVsc2V7cmVzcG9uc2UuY29kZT1PcGVuTGF5ZXJzLlByb3RvY29sLlJlc3Bv bnNlLkZBSUxVUkU7fQpvcHRpb25zLmNhbGxiYWNrLmNhbGwob3B0aW9ucy5zY29w ZSxyZXNwb25zZSk7fX0scGFyc2VGZWF0dXJlczpmdW5jdGlvbihyZXF1ZXN0KXt2 YXIgZG9jPXJlcXVlc3QucmVzcG9uc2VYTUw7aWYoIWRvY3x8IWRvYy5kb2N1bWVu dEVsZW1lbnQpe2RvYz1yZXF1ZXN0LnJlc3BvbnNlVGV4dDt9CmlmKCFkb2N8fGRv Yy5sZW5ndGg8PTApe3JldHVybiBudWxsO30KcmV0dXJuIHRoaXMuZm9ybWF0LnJl YWQoZG9jKTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuUHJvdG9jb2wuU09TLnYx XzBfMCJ9KTtPcGVuTGF5ZXJzLkxheWVyLkthTWFwQ2FjaGU9T3BlbkxheWVycy5D bGFzcyhPcGVuTGF5ZXJzLkxheWVyLkthTWFwLHtJTUFHRV9FWFRFTlNJT05TOnsn anBlZyc6J2pwZycsJ2dpZic6J2dpZicsJ3BuZyc6J3BuZycsJ3BuZzgnOidwbmcn LCdwbmcyNCc6J3BuZycsJ2RpdGhlcmVkJzoncG5nJ30sREVGQVVMVF9GT1JNQVQ6 J2pwZWcnLGluaXRpYWxpemU6ZnVuY3Rpb24obmFtZSx1cmwscGFyYW1zLG9wdGlv bnMpe09wZW5MYXllcnMuTGF5ZXIuS2FNYXAucHJvdG90eXBlLmluaXRpYWxpemUu YXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuZXh0ZW5zaW9uPXRoaXMuSU1BR0Vf RVhURU5TSU9OU1t0aGlzLnBhcmFtcy5pLnRvTG93ZXJDYXNlKCl8fERFRkFVTFRf Rk9STUFUXTt9LGdldFVSTDpmdW5jdGlvbihib3VuZHMpe2JvdW5kcz10aGlzLmFk anVzdEJvdW5kcyhib3VuZHMpO3ZhciBtYXBSZXM9dGhpcy5tYXAuZ2V0UmVzb2x1 dGlvbigpO3ZhciBzY2FsZT1NYXRoLnJvdW5kKCh0aGlzLm1hcC5nZXRTY2FsZSgp KjEwMDAwKSkvMTAwMDA7dmFyIHBYPU1hdGgucm91bmQoYm91bmRzLmxlZnQvbWFw UmVzKTt2YXIgcFk9LU1hdGgucm91bmQoYm91bmRzLnRvcC9tYXBSZXMpO3ZhciBt ZXRhWD1NYXRoLmZsb29yKHBYL3RoaXMudGlsZVNpemUudy90aGlzLnBhcmFtcy5t ZXRhVGlsZVNpemUudykqdGhpcy50aWxlU2l6ZS53KnRoaXMucGFyYW1zLm1ldGFU aWxlU2l6ZS53O3ZhciBtZXRhWT1NYXRoLmZsb29yKHBZL3RoaXMudGlsZVNpemUu aC90aGlzLnBhcmFtcy5tZXRhVGlsZVNpemUuaCkqdGhpcy50aWxlU2l6ZS5oKnRo aXMucGFyYW1zLm1ldGFUaWxlU2l6ZS5oO3ZhciB1cmw9dGhpcy51cmw7aWYoT3Bl bkxheWVycy5VdGlsLmlzQXJyYXkodXJsKSl7dXJsPXRoaXMuc2VsZWN0VXJsKHBh cmFtc1N0cmluZyx1cmwpO30KdmFyIGNvbXBvbmVudHM9W3VybCwiLyIsdGhpcy5w YXJhbXMubWFwLCIvIixzY2FsZSwiLyIsdGhpcy5wYXJhbXMuZy5yZXBsYWNlKC9c cy9nLCdfJyksIi9kZWYvdCIsbWV0YVksIi9sIixtZXRhWCwiL3QiLHBZLCJsIixw WCwiLiIsdGhpcy5leHRlbnNpb25dO3JldHVybiBjb21wb25lbnRzLmpvaW4oIiIp O30sQ0xBU1NfTkFNRToiT3BlbkxheWVycy5MYXllci5LYU1hcENhY2hlIn0pO09w ZW5MYXllcnMuUHJvdG9jb2wuV0ZTLnYxXzFfMD1PcGVuTGF5ZXJzLkNsYXNzKE9w ZW5MYXllcnMuUHJvdG9jb2wuV0ZTLnYxLHt2ZXJzaW9uOiIxLjEuMCIsaW5pdGlh bGl6ZTpmdW5jdGlvbihvcHRpb25zKXtPcGVuTGF5ZXJzLlByb3RvY29sLldGUy52 MS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYo dGhpcy5vdXRwdXRGb3JtYXQmJiF0aGlzLnJlYWRGb3JtYXQpe2lmKHRoaXMub3V0 cHV0Rm9ybWF0LnRvTG93ZXJDYXNlKCk9PSJnbWwyIil7dGhpcy5yZWFkRm9ybWF0 PW5ldyBPcGVuTGF5ZXJzLkZvcm1hdC5HTUwudjIoe2ZlYXR1cmVUeXBlOnRoaXMu ZmVhdHVyZVR5cGUsZmVhdHVyZU5TOnRoaXMuZmVhdHVyZU5TLGdlb21ldHJ5TmFt ZTp0aGlzLmdlb21ldHJ5TmFtZX0pO31lbHNlIGlmKHRoaXMub3V0cHV0Rm9ybWF0 LnRvTG93ZXJDYXNlKCk9PSJqc29uIil7dGhpcy5yZWFkRm9ybWF0PW5ldyBPcGVu TGF5ZXJzLkZvcm1hdC5HZW9KU09OKCk7fX19LENMQVNTX05BTUU6Ik9wZW5MYXll cnMuUHJvdG9jb2wuV0ZTLnYxXzFfMCJ9KTtPcGVuTGF5ZXJzLkZvcm1hdC5XTVND YXBhYmlsaXRpZXMudjFfMV8xPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5G b3JtYXQuV01TQ2FwYWJpbGl0aWVzLnYxXzEse3ZlcnNpb246IjEuMS4xIixpbml0 aWFsaXplOmZ1bmN0aW9uKG9wdGlvbnMpe09wZW5MYXllcnMuRm9ybWF0LldNU0Nh cGFiaWxpdGllcy52MV8xLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMs W29wdGlvbnNdKTt9LHJlYWRlcnM6eyJ3bXMiOk9wZW5MYXllcnMuVXRpbC5hcHBs eURlZmF1bHRzKHsiU1JTIjpmdW5jdGlvbihub2RlLG9iail7b2JqLnNyc1t0aGlz LmdldENoaWxkVmFsdWUobm9kZSldPXRydWU7fX0sT3BlbkxheWVycy5Gb3JtYXQu V01TQ2FwYWJpbGl0aWVzLnYxXzEucHJvdG90eXBlLnJlYWRlcnNbIndtcyJdKX0s Q0xBU1NfTkFNRToiT3BlbkxheWVycy5Gb3JtYXQuV01TQ2FwYWJpbGl0aWVzLnYx XzFfMSJ9KTtPcGVuTGF5ZXJzLkZvcm1hdC5XTVNDYXBhYmlsaXRpZXMudjFfMV8x X1dNU0M9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkZvcm1hdC5XTVNDYXBh YmlsaXRpZXMudjFfMV8xLHt2ZXJzaW9uOiIxLjEuMSIscHJvZmlsZToiV01TQyIs aW5pdGlhbGl6ZTpmdW5jdGlvbihvcHRpb25zKXtPcGVuTGF5ZXJzLkZvcm1hdC5X TVNDYXBhYmlsaXRpZXMudjFfMV8xLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5 KHRoaXMsW29wdGlvbnNdKTt9LHJlYWRlcnM6eyJ3bXMiOk9wZW5MYXllcnMuVXRp bC5hcHBseURlZmF1bHRzKHsiVmVuZG9yU3BlY2lmaWNDYXBhYmlsaXRpZXMiOmZ1 bmN0aW9uKG5vZGUsb2JqKXtvYmoudmVuZG9yU3BlY2lmaWM9e3RpbGVTZXRzOltd fTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsb2JqLnZlbmRvclNwZWNpZmljKTt9 LCJUaWxlU2V0IjpmdW5jdGlvbihub2RlLHZlbmRvclNwZWNpZmljKXt2YXIgdGls ZXNldD17c3JzOnt9LGJib3g6e30scmVzb2x1dGlvbnM6W119O3RoaXMucmVhZENo aWxkTm9kZXMobm9kZSx0aWxlc2V0KTt2ZW5kb3JTcGVjaWZpYy50aWxlU2V0cy5w dXNoKHRpbGVzZXQpO30sIlJlc29sdXRpb25zIjpmdW5jdGlvbihub2RlLHRpbGVz ZXQpe3ZhciByZXM9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpLnNwbGl0KCIgIik7 Zm9yKHZhciBpPTAsbGVuPXJlcy5sZW5ndGg7aTxsZW47aSsrKXtpZihyZXNbaV0h PSIiKXt0aWxlc2V0LnJlc29sdXRpb25zLnB1c2gocGFyc2VGbG9hdChyZXNbaV0p KTt9fX0sIldpZHRoIjpmdW5jdGlvbihub2RlLHRpbGVzZXQpe3RpbGVzZXQud2lk dGg9cGFyc2VJbnQodGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpKTt9LCJIZWlnaHQi OmZ1bmN0aW9uKG5vZGUsdGlsZXNldCl7dGlsZXNldC5oZWlnaHQ9cGFyc2VJbnQo dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpKTt9LCJMYXllcnMiOmZ1bmN0aW9uKG5v ZGUsdGlsZXNldCl7dGlsZXNldC5sYXllcnM9dGhpcy5nZXRDaGlsZFZhbHVlKG5v ZGUpO30sIlN0eWxlcyI6ZnVuY3Rpb24obm9kZSx0aWxlc2V0KXt0aWxlc2V0LnN0 eWxlcz10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7fX0sT3BlbkxheWVycy5Gb3Jt YXQuV01TQ2FwYWJpbGl0aWVzLnYxXzFfMS5wcm90b3R5cGUucmVhZGVyc1sid21z Il0pfSxDTEFTU19OQU1FOiJPcGVuTGF5ZXJzLkZvcm1hdC5XTVNDYXBhYmlsaXRp ZXMudjFfMV8xX1dNU0MifSk7T3BlbkxheWVycy5Gb3JtYXQuV01TQ2FwYWJpbGl0 aWVzLnYxXzFfMD1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0LldN U0NhcGFiaWxpdGllcy52MV8xLHt2ZXJzaW9uOiIxLjEuMCIsaW5pdGlhbGl6ZTpm dW5jdGlvbihvcHRpb25zKXtPcGVuTGF5ZXJzLkZvcm1hdC5XTVNDYXBhYmlsaXRp ZXMudjFfMS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25z XSk7fSxyZWFkZXJzOnsid21zIjpPcGVuTGF5ZXJzLlV0aWwuYXBwbHlEZWZhdWx0 cyh7IlNSUyI6ZnVuY3Rpb24obm9kZSxvYmope3ZhciBzcnM9dGhpcy5nZXRDaGls ZFZhbHVlKG5vZGUpO3ZhciB2YWx1ZXM9c3JzLnNwbGl0KC8gKy8pO2Zvcih2YXIg aT0wLGxlbj12YWx1ZXMubGVuZ3RoO2k8bGVuO2krKyl7b2JqLnNyc1t2YWx1ZXNb aV1dPXRydWU7fX19LE9wZW5MYXllcnMuRm9ybWF0LldNU0NhcGFiaWxpdGllcy52 MV8xLnByb3RvdHlwZS5yZWFkZXJzWyJ3bXMiXSl9LENMQVNTX05BTUU6Ik9wZW5M YXllcnMuRm9ybWF0LldNU0NhcGFiaWxpdGllcy52MV8xXzAifSk7T3BlbkxheWVy cy5MYXllci5XRlM9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkxheWVyLlZl Y3RvcixPcGVuTGF5ZXJzLkxheWVyLk1hcmtlcnMse2lzQmFzZUxheWVyOmZhbHNl LHRpbGU6bnVsbCxyYXRpbzoyLERFRkFVTFRfUEFSQU1TOntzZXJ2aWNlOiJXRlMi LHZlcnNpb246IjEuMC4wIixyZXF1ZXN0OiJHZXRGZWF0dXJlIn0sZmVhdHVyZUNs YXNzOm51bGwsZm9ybWF0Om51bGwsZm9ybWF0T2JqZWN0Om51bGwsZm9ybWF0T3B0 aW9uczpudWxsLHZlY3Rvck1vZGU6dHJ1ZSxlbmNvZGVCQk9YOmZhbHNlLGV4dHJh Y3RBdHRyaWJ1dGVzOmZhbHNlLGluaXRpYWxpemU6ZnVuY3Rpb24obmFtZSx1cmws cGFyYW1zLG9wdGlvbnMpe2lmKG9wdGlvbnM9PXVuZGVmaW5lZCl7b3B0aW9ucz17 fTt9CmlmKG9wdGlvbnMuZmVhdHVyZUNsYXNzfHwhT3BlbkxheWVycy5MYXllci5W ZWN0b3J8fCFPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9yKXt0aGlzLnZlY3Rvck1v ZGU9ZmFsc2U7fQpwYXJhbXM9T3BlbkxheWVycy5VdGlsLnVwcGVyQ2FzZU9iamVj dChwYXJhbXMpO09wZW5MYXllcnMuVXRpbC5leHRlbmQob3B0aW9ucyx7J3JlcG9y dEVycm9yJzpmYWxzZX0pO3ZhciBuZXdBcmd1bWVudHM9W107bmV3QXJndW1lbnRz LnB1c2gobmFtZSxvcHRpb25zKTtPcGVuTGF5ZXJzLkxheWVyLlZlY3Rvci5wcm90 b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLG5ld0FyZ3VtZW50cyk7aWYoIXRo aXMucmVuZGVyZXJ8fCF0aGlzLnZlY3Rvck1vZGUpe3RoaXMudmVjdG9yTW9kZT1m YWxzZTtpZighb3B0aW9ucy5mZWF0dXJlQ2xhc3Mpe29wdGlvbnMuZmVhdHVyZUNs YXNzPU9wZW5MYXllcnMuRmVhdHVyZS5XRlM7fQpPcGVuTGF5ZXJzLkxheWVyLk1h cmtlcnMucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyxuZXdBcmd1bWVu dHMpO30KaWYodGhpcy5wYXJhbXMmJnRoaXMucGFyYW1zLnR5cGVuYW1lJiYhdGhp cy5vcHRpb25zLnR5cGVuYW1lKXt0aGlzLm9wdGlvbnMudHlwZW5hbWU9dGhpcy5w YXJhbXMudHlwZW5hbWU7fQppZighdGhpcy5vcHRpb25zLmdlb21ldHJ5X2NvbHVt bil7dGhpcy5vcHRpb25zLmdlb21ldHJ5X2NvbHVtbj0idGhlX2dlb20iO30KdGhp cy5wYXJhbXM9T3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMocGFyYW1zLE9w ZW5MYXllcnMuVXRpbC51cHBlckNhc2VPYmplY3QodGhpcy5ERUZBVUxUX1BBUkFN UykpO3RoaXMudXJsPXVybDt9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtpZih0aGlzLnZl Y3Rvck1vZGUpe09wZW5MYXllcnMuTGF5ZXIuVmVjdG9yLnByb3RvdHlwZS5kZXN0 cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9ZWxzZXtPcGVuTGF5ZXJzLkxheWVy Lk1hcmtlcnMucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMp O30KaWYodGhpcy50aWxlKXt0aGlzLnRpbGUuZGVzdHJveSgpO30KdGhpcy50aWxl PW51bGw7dGhpcy5yYXRpbz1udWxsO3RoaXMuZmVhdHVyZUNsYXNzPW51bGw7dGhp cy5mb3JtYXQ9bnVsbDtpZih0aGlzLmZvcm1hdE9iamVjdCYmdGhpcy5mb3JtYXRP YmplY3QuZGVzdHJveSl7dGhpcy5mb3JtYXRPYmplY3QuZGVzdHJveSgpO30KdGhp cy5mb3JtYXRPYmplY3Q9bnVsbDt0aGlzLmZvcm1hdE9wdGlvbnM9bnVsbDt0aGlz LnZlY3Rvck1vZGU9bnVsbDt0aGlzLmVuY29kZUJCT1g9bnVsbDt0aGlzLmV4dHJh Y3RBdHRyaWJ1dGVzPW51bGw7fSxzZXRNYXA6ZnVuY3Rpb24obWFwKXtpZih0aGlz LnZlY3Rvck1vZGUpe09wZW5MYXllcnMuTGF5ZXIuVmVjdG9yLnByb3RvdHlwZS5z ZXRNYXAuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBvcHRpb25zPXsnZXh0cmFj dEF0dHJpYnV0ZXMnOnRoaXMuZXh0cmFjdEF0dHJpYnV0ZXN9O09wZW5MYXllcnMu VXRpbC5leHRlbmQob3B0aW9ucyx0aGlzLmZvcm1hdE9wdGlvbnMpO2lmKHRoaXMu bWFwJiYhdGhpcy5wcm9qZWN0aW9uLmVxdWFscyh0aGlzLm1hcC5nZXRQcm9qZWN0 aW9uT2JqZWN0KCkpKXtvcHRpb25zLmV4dGVybmFsUHJvamVjdGlvbj10aGlzLnBy b2plY3Rpb247b3B0aW9ucy5pbnRlcm5hbFByb2plY3Rpb249dGhpcy5tYXAuZ2V0 UHJvamVjdGlvbk9iamVjdCgpO30KdGhpcy5mb3JtYXRPYmplY3Q9dGhpcy5mb3Jt YXQ/bmV3IHRoaXMuZm9ybWF0KG9wdGlvbnMpOm5ldyBPcGVuTGF5ZXJzLkZvcm1h dC5HTUwob3B0aW9ucyk7fWVsc2V7T3BlbkxheWVycy5MYXllci5NYXJrZXJzLnBy b3RvdHlwZS5zZXRNYXAuYXBwbHkodGhpcyxhcmd1bWVudHMpO319LG1vdmVUbzpm dW5jdGlvbihib3VuZHMsem9vbUNoYW5nZWQsZHJhZ2dpbmcpe2lmKHRoaXMudmVj dG9yTW9kZSl7T3BlbkxheWVycy5MYXllci5WZWN0b3IucHJvdG90eXBlLm1vdmVU by5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fWVsc2V7T3BlbkxheWVycy5MYXllci5N YXJrZXJzLnByb3RvdHlwZS5tb3ZlVG8uYXBwbHkodGhpcyxhcmd1bWVudHMpO30K aWYoZHJhZ2dpbmcpe3JldHVybiBmYWxzZTt9CmlmKHpvb21DaGFuZ2VkKXtpZih0 aGlzLnZlY3Rvck1vZGUpe3RoaXMucmVuZGVyZXIuY2xlYXIoKTt9fQppZih0aGlz Lm9wdGlvbnMubWluWm9vbUxldmVsKXtPcGVuTGF5ZXJzLkNvbnNvbGUud2FybihP cGVuTGF5ZXJzLmkxOG4oJ21pblpvb21MZXZlbEVycm9yJykpO2lmKHRoaXMubWFw LmdldFpvb20oKTx0aGlzLm9wdGlvbnMubWluWm9vbUxldmVsKXtyZXR1cm4gbnVs bDt9fQppZihib3VuZHM9PW51bGwpe2JvdW5kcz10aGlzLm1hcC5nZXRFeHRlbnQo KTt9CnZhciBmaXJzdFJlbmRlcmluZz0odGhpcy50aWxlPT1udWxsKTt2YXIgb3V0 T2ZCb3VuZHM9KCFmaXJzdFJlbmRlcmluZyYmIXRoaXMudGlsZS5ib3VuZHMuY29u dGFpbnNCb3VuZHMoYm91bmRzKSk7aWYoem9vbUNoYW5nZWR8fGZpcnN0UmVuZGVy aW5nfHwoIWRyYWdnaW5nJiZvdXRPZkJvdW5kcykpe3ZhciBjZW50ZXI9Ym91bmRz LmdldENlbnRlckxvbkxhdCgpO3ZhciB0aWxlV2lkdGg9Ym91bmRzLmdldFdpZHRo KCkqdGhpcy5yYXRpbzt2YXIgdGlsZUhlaWdodD1ib3VuZHMuZ2V0SGVpZ2h0KCkq dGhpcy5yYXRpbzt2YXIgdGlsZUJvdW5kcz1uZXcgT3BlbkxheWVycy5Cb3VuZHMo Y2VudGVyLmxvbi0odGlsZVdpZHRoLzIpLGNlbnRlci5sYXQtKHRpbGVIZWlnaHQv MiksY2VudGVyLmxvbisodGlsZVdpZHRoLzIpLGNlbnRlci5sYXQrKHRpbGVIZWln aHQvMikpO3ZhciB0aWxlU2l6ZT10aGlzLm1hcC5nZXRTaXplKCk7dGlsZVNpemUu dz10aWxlU2l6ZS53KnRoaXMucmF0aW87dGlsZVNpemUuaD10aWxlU2l6ZS5oKnRo aXMucmF0aW87dmFyIHVsPW5ldyBPcGVuTGF5ZXJzLkxvbkxhdCh0aWxlQm91bmRz LmxlZnQsdGlsZUJvdW5kcy50b3ApO3ZhciBwb3M9dGhpcy5tYXAuZ2V0TGF5ZXJQ eEZyb21Mb25MYXQodWwpO3ZhciB1cmw9dGhpcy5nZXRGdWxsUmVxdWVzdFN0cmlu ZygpO3ZhciBwYXJhbXM9bnVsbDt2YXIgZmlsdGVyPXRoaXMucGFyYW1zLmZpbHRl cnx8dGhpcy5wYXJhbXMuRklMVEVSO2lmKGZpbHRlcil7cGFyYW1zPXtGSUxURVI6 ZmlsdGVyfTt9CmVsc2V7cGFyYW1zPXtCQk9YOnRoaXMuZW5jb2RlQkJPWD90aWxl Qm91bmRzLnRvQkJPWCgpOnRpbGVCb3VuZHMudG9BcnJheSgpfTt9CmlmKHRoaXMu bWFwJiYhdGhpcy5wcm9qZWN0aW9uLmVxdWFscyh0aGlzLm1hcC5nZXRQcm9qZWN0 aW9uT2JqZWN0KCkpKXt2YXIgcHJvamVjdGVkQm91bmRzPXRpbGVCb3VuZHMuY2xv bmUoKTtwcm9qZWN0ZWRCb3VuZHMudHJhbnNmb3JtKHRoaXMubWFwLmdldFByb2pl Y3Rpb25PYmplY3QoKSx0aGlzLnByb2plY3Rpb24pO2lmKCFmaWx0ZXIpe3BhcmFt cy5CQk9YPXRoaXMuZW5jb2RlQkJPWD9wcm9qZWN0ZWRCb3VuZHMudG9CQk9YKCk6 cHJvamVjdGVkQm91bmRzLnRvQXJyYXkoKTt9fQp1cmwrPSImIitPcGVuTGF5ZXJz LlV0aWwuZ2V0UGFyYW1ldGVyU3RyaW5nKHBhcmFtcyk7aWYoIXRoaXMudGlsZSl7 dGhpcy50aWxlPW5ldyBPcGVuTGF5ZXJzLlRpbGUuV0ZTKHRoaXMscG9zLHRpbGVC b3VuZHMsdXJsLHRpbGVTaXplKTt0aGlzLmFkZFRpbGVNb25pdG9yaW5nSG9va3Mo dGhpcy50aWxlKTt0aGlzLnRpbGUuZHJhdygpO31lbHNle2lmKHRoaXMudmVjdG9y TW9kZSl7dGhpcy5kZXN0cm95RmVhdHVyZXMoKTt0aGlzLnJlbmRlcmVyLmNsZWFy KCk7fWVsc2V7dGhpcy5jbGVhck1hcmtlcnMoKTt9CnRoaXMucmVtb3ZlVGlsZU1v bml0b3JpbmdIb29rcyh0aGlzLnRpbGUpO3RoaXMudGlsZS5kZXN0cm95KCk7dGhp cy50aWxlPW51bGw7dGhpcy50aWxlPW5ldyBPcGVuTGF5ZXJzLlRpbGUuV0ZTKHRo aXMscG9zLHRpbGVCb3VuZHMsdXJsLHRpbGVTaXplKTt0aGlzLmFkZFRpbGVNb25p dG9yaW5nSG9va3ModGhpcy50aWxlKTt0aGlzLnRpbGUuZHJhdygpO319fSxhZGRU aWxlTW9uaXRvcmluZ0hvb2tzOmZ1bmN0aW9uKHRpbGUpe3RpbGUub25Mb2FkU3Rh cnQ9ZnVuY3Rpb24oKXtpZih0aGlzPT10aGlzLmxheWVyLnRpbGUpe3RoaXMubGF5 ZXIuZXZlbnRzLnRyaWdnZXJFdmVudCgibG9hZHN0YXJ0Iik7fX07dGlsZS5ldmVu dHMucmVnaXN0ZXIoImxvYWRzdGFydCIsdGlsZSx0aWxlLm9uTG9hZFN0YXJ0KTt0 aWxlLm9uTG9hZEVuZD1mdW5jdGlvbigpe2lmKHRoaXM9PXRoaXMubGF5ZXIudGls ZSl7dGhpcy5sYXllci5ldmVudHMudHJpZ2dlckV2ZW50KCJ0aWxlbG9hZGVkIik7 dGhpcy5sYXllci5ldmVudHMudHJpZ2dlckV2ZW50KCJsb2FkZW5kIik7fX07dGls ZS5ldmVudHMucmVnaXN0ZXIoImxvYWRlbmQiLHRpbGUsdGlsZS5vbkxvYWRFbmQp O3RpbGUuZXZlbnRzLnJlZ2lzdGVyKCJ1bmxvYWQiLHRpbGUsdGlsZS5vbkxvYWRF bmQpO30scmVtb3ZlVGlsZU1vbml0b3JpbmdIb29rczpmdW5jdGlvbih0aWxlKXt0 aWxlLnVubG9hZCgpO3RpbGUuZXZlbnRzLnVuKHsibG9hZHN0YXJ0Ijp0aWxlLm9u TG9hZFN0YXJ0LCJsb2FkZW5kIjp0aWxlLm9uTG9hZEVuZCwidW5sb2FkIjp0aWxl Lm9uTG9hZEVuZCxzY29wZTp0aWxlfSk7fSxvbk1hcFJlc2l6ZTpmdW5jdGlvbigp e2lmKHRoaXMudmVjdG9yTW9kZSl7T3BlbkxheWVycy5MYXllci5WZWN0b3IucHJv dG90eXBlLm9uTWFwUmVzaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9ZWxzZXtP cGVuTGF5ZXJzLkxheWVyLk1hcmtlcnMucHJvdG90eXBlLm9uTWFwUmVzaXplLmFw cGx5KHRoaXMsYXJndW1lbnRzKTt9fSxkaXNwbGF5OmZ1bmN0aW9uKCl7aWYodGhp cy52ZWN0b3JNb2RlKXtPcGVuTGF5ZXJzLkxheWVyLlZlY3Rvci5wcm90b3R5cGUu ZGlzcGxheS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fWVsc2V7T3BlbkxheWVycy5M YXllci5NYXJrZXJzLnByb3RvdHlwZS5kaXNwbGF5LmFwcGx5KHRoaXMsYXJndW1l bnRzKTt9fSxtZXJnZU5ld1BhcmFtczpmdW5jdGlvbihuZXdQYXJhbXMpe3ZhciB1 cHBlclBhcmFtcz1PcGVuTGF5ZXJzLlV0aWwudXBwZXJDYXNlT2JqZWN0KG5ld1Bh cmFtcyk7dmFyIG5ld0FyZ3VtZW50cz1bdXBwZXJQYXJhbXNdO3JldHVybiBPcGVu TGF5ZXJzLkxheWVyLkhUVFBSZXF1ZXN0LnByb3RvdHlwZS5tZXJnZU5ld1BhcmFt cy5hcHBseSh0aGlzLG5ld0FyZ3VtZW50cyk7fSxjbG9uZTpmdW5jdGlvbihvYmop e2lmKG9iaj09bnVsbCl7b2JqPW5ldyBPcGVuTGF5ZXJzLkxheWVyLldGUyh0aGlz Lm5hbWUsdGhpcy51cmwsdGhpcy5wYXJhbXMsdGhpcy5nZXRPcHRpb25zKCkpO30K aWYodGhpcy52ZWN0b3JNb2RlKXtvYmo9T3BlbkxheWVycy5MYXllci5WZWN0b3Iu cHJvdG90eXBlLmNsb25lLmFwcGx5KHRoaXMsW29ial0pO31lbHNle29iaj1PcGVu TGF5ZXJzLkxheWVyLk1hcmtlcnMucHJvdG90eXBlLmNsb25lLmFwcGx5KHRoaXMs W29ial0pO30KcmV0dXJuIG9iajt9LGdldEZ1bGxSZXF1ZXN0U3RyaW5nOmZ1bmN0 aW9uKG5ld1BhcmFtcyxhbHRVcmwpe3ZhciBwcm9qZWN0aW9uQ29kZT10aGlzLnBy b2plY3Rpb24uZ2V0Q29kZSgpfHx0aGlzLm1hcC5nZXRQcm9qZWN0aW9uKCk7dGhp cy5wYXJhbXMuU1JTPShwcm9qZWN0aW9uQ29kZT09Im5vbmUiKT9udWxsOnByb2pl Y3Rpb25Db2RlO3JldHVybiBPcGVuTGF5ZXJzLkxheWVyLkdyaWQucHJvdG90eXBl LmdldEZ1bGxSZXF1ZXN0U3RyaW5nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LGNv bW1pdDpmdW5jdGlvbigpe2lmKCF0aGlzLndyaXRlcil7dmFyIG9wdGlvbnM9e307 aWYodGhpcy5tYXAmJiF0aGlzLnByb2plY3Rpb24uZXF1YWxzKHRoaXMubWFwLmdl dFByb2plY3Rpb25PYmplY3QoKSkpe29wdGlvbnMuZXh0ZXJuYWxQcm9qZWN0aW9u PXRoaXMucHJvamVjdGlvbjtvcHRpb25zLmludGVybmFsUHJvamVjdGlvbj10aGlz Lm1hcC5nZXRQcm9qZWN0aW9uT2JqZWN0KCk7fQp0aGlzLndyaXRlcj1uZXcgT3Bl bkxheWVycy5Gb3JtYXQuV0ZTKG9wdGlvbnMsdGhpcyk7fQp2YXIgZGF0YT10aGlz LndyaXRlci53cml0ZSh0aGlzLmZlYXR1cmVzKTtPcGVuTGF5ZXJzLlJlcXVlc3Qu UE9TVCh7dXJsOnRoaXMudXJsLGRhdGE6ZGF0YSxzdWNjZXNzOnRoaXMuY29tbWl0 U3VjY2VzcyxmYWlsdXJlOnRoaXMuY29tbWl0RmFpbHVyZSxzY29wZTp0aGlzfSk7 fSxjb21taXRTdWNjZXNzOmZ1bmN0aW9uKHJlcXVlc3Qpe3ZhciByZXNwb25zZT1y ZXF1ZXN0LnJlc3BvbnNlVGV4dDtpZihyZXNwb25zZS5pbmRleE9mKCdTVUNDRVNT JykhPS0xKXt0aGlzLmNvbW1pdFJlcG9ydChPcGVuTGF5ZXJzLmkxOG4oImNvbW1p dFN1Y2Nlc3MiLHsncmVzcG9uc2UnOnJlc3BvbnNlfSkpO2Zvcih2YXIgaT0wO2k8 dGhpcy5mZWF0dXJlcy5sZW5ndGg7aSsrKXt0aGlzLmZlYXR1cmVzW2ldLnN0YXRl PW51bGw7fX1lbHNlIGlmKHJlc3BvbnNlLmluZGV4T2YoJ0ZBSUxFRCcpIT0tMXx8 cmVzcG9uc2UuaW5kZXhPZignRXhjZXB0aW9uJykhPS0xKXt0aGlzLmNvbW1pdFJl cG9ydChPcGVuTGF5ZXJzLmkxOG4oImNvbW1pdEZhaWxlZCIseydyZXNwb25zZSc6 cmVzcG9uc2V9KSk7fX0sY29tbWl0RmFpbHVyZTpmdW5jdGlvbihyZXF1ZXN0KXt9 LGNvbW1pdFJlcG9ydDpmdW5jdGlvbihzdHJpbmcscmVzcG9uc2Upe09wZW5MYXll cnMuQ29uc29sZS51c2VyRXJyb3Ioc3RyaW5nKTt9LHJlZnJlc2g6ZnVuY3Rpb24o KXtpZih0aGlzLnRpbGUpe2lmKHRoaXMudmVjdG9yTW9kZSl7dGhpcy5yZW5kZXJl ci5jbGVhcigpO3RoaXMuZmVhdHVyZXMubGVuZ3RoPTA7fWVsc2V7dGhpcy5jbGVh ck1hcmtlcnMoKTt0aGlzLm1hcmtlcnMubGVuZ3RoPTA7fQp0aGlzLnRpbGUuZHJh dygpO319LGdldERhdGFFeHRlbnQ6ZnVuY3Rpb24oKXt2YXIgZXh0ZW50O2lmKHRo aXMudmVjdG9yTW9kZSl7ZXh0ZW50PU9wZW5MYXllcnMuTGF5ZXIuVmVjdG9yLnBy b3RvdHlwZS5nZXREYXRhRXh0ZW50LmFwcGx5KHRoaXMpO31lbHNle2V4dGVudD1P cGVuTGF5ZXJzLkxheWVyLk1hcmtlcnMucHJvdG90eXBlLmdldERhdGFFeHRlbnQu YXBwbHkodGhpcyk7fQpyZXR1cm4gZXh0ZW50O30sc2V0T3BhY2l0eTpmdW5jdGlv bihvcGFjaXR5KXtpZih0aGlzLnZlY3Rvck1vZGUpe09wZW5MYXllcnMuTGF5ZXIu VmVjdG9yLnByb3RvdHlwZS5zZXRPcGFjaXR5LmFwcGx5KHRoaXMsW29wYWNpdHld KTt9ZWxzZXtPcGVuTGF5ZXJzLkxheWVyLk1hcmtlcnMucHJvdG90eXBlLnNldE9w YWNpdHkuYXBwbHkodGhpcyxbb3BhY2l0eV0pO319LENMQVNTX05BTUU6Ik9wZW5M YXllcnMuTGF5ZXIuV0ZTIn0pO09wZW5MYXllcnMuQ29udHJvbC5MYXllclN3aXRj aGVyPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5Db250cm9sLHtyb3VuZGVk Q29ybmVyOnRydWUscm91bmRlZENvcm5lckNvbG9yOiJkYXJrYmx1ZSIsbGF5ZXJT dGF0ZXM6bnVsbCxsYXllcnNEaXY6bnVsbCxiYXNlTGF5ZXJzRGl2Om51bGwsYmFz ZUxheWVyczpudWxsLGRhdGFMYmw6bnVsbCxkYXRhTGF5ZXJzRGl2Om51bGwsZGF0 YUxheWVyczpudWxsLG1pbmltaXplRGl2Om51bGwsbWF4aW1pemVEaXY6bnVsbCxh c2NlbmRpbmc6dHJ1ZSxpbml0aWFsaXplOmZ1bmN0aW9uKG9wdGlvbnMpe09wZW5M YXllcnMuQ29udHJvbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFy Z3VtZW50cyk7dGhpcy5sYXllclN0YXRlcz1bXTt9LGRlc3Ryb3k6ZnVuY3Rpb24o KXtPcGVuTGF5ZXJzLkV2ZW50LnN0b3BPYnNlcnZpbmdFbGVtZW50KHRoaXMuZGl2 KTtPcGVuTGF5ZXJzLkV2ZW50LnN0b3BPYnNlcnZpbmdFbGVtZW50KHRoaXMubWlu aW1pemVEaXYpO09wZW5MYXllcnMuRXZlbnQuc3RvcE9ic2VydmluZ0VsZW1lbnQo dGhpcy5tYXhpbWl6ZURpdik7dGhpcy5jbGVhckxheWVyc0FycmF5KCJiYXNlIik7 dGhpcy5jbGVhckxheWVyc0FycmF5KCJkYXRhIik7dGhpcy5tYXAuZXZlbnRzLnVu KHsiYWRkbGF5ZXIiOnRoaXMucmVkcmF3LCJjaGFuZ2VsYXllciI6dGhpcy5yZWRy YXcsInJlbW92ZWxheWVyIjp0aGlzLnJlZHJhdywiY2hhbmdlYmFzZWxheWVyIjp0 aGlzLnJlZHJhdyxzY29wZTp0aGlzfSk7T3BlbkxheWVycy5Db250cm9sLnByb3Rv dHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LHNldE1hcDpmdW5j dGlvbihtYXApe09wZW5MYXllcnMuQ29udHJvbC5wcm90b3R5cGUuc2V0TWFwLmFw cGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm1hcC5ldmVudHMub24oeyJhZGRsYXll ciI6dGhpcy5yZWRyYXcsImNoYW5nZWxheWVyIjp0aGlzLnJlZHJhdywicmVtb3Zl bGF5ZXIiOnRoaXMucmVkcmF3LCJjaGFuZ2ViYXNlbGF5ZXIiOnRoaXMucmVkcmF3 LHNjb3BlOnRoaXN9KTt9LGRyYXc6ZnVuY3Rpb24oKXtPcGVuTGF5ZXJzLkNvbnRy b2wucHJvdG90eXBlLmRyYXcuYXBwbHkodGhpcyk7dGhpcy5sb2FkQ29udGVudHMo KTtpZighdGhpcy5vdXRzaWRlVmlld3BvcnQpe3RoaXMubWluaW1pemVDb250cm9s KCk7fQp0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzLmRpdjt9LGNsZWFyTGF5ZXJz QXJyYXk6ZnVuY3Rpb24obGF5ZXJzVHlwZSl7dmFyIGxheWVycz10aGlzW2xheWVy c1R5cGUrIkxheWVycyJdO2lmKGxheWVycyl7Zm9yKHZhciBpPTAsbGVuPWxheWVy cy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgbGF5ZXI9bGF5ZXJzW2ldO09wZW5MYXll cnMuRXZlbnQuc3RvcE9ic2VydmluZ0VsZW1lbnQobGF5ZXIuaW5wdXRFbGVtKTtP cGVuTGF5ZXJzLkV2ZW50LnN0b3BPYnNlcnZpbmdFbGVtZW50KGxheWVyLmxhYmVs U3Bhbik7fX0KdGhpc1tsYXllcnNUeXBlKyJMYXllcnNEaXYiXS5pbm5lckhUTUw9 IiI7dGhpc1tsYXllcnNUeXBlKyJMYXllcnMiXT1bXTt9LGNoZWNrUmVkcmF3OmZ1 bmN0aW9uKCl7dmFyIHJlZHJhdz1mYWxzZTtpZighdGhpcy5sYXllclN0YXRlcy5s ZW5ndGh8fCh0aGlzLm1hcC5sYXllcnMubGVuZ3RoIT10aGlzLmxheWVyU3RhdGVz Lmxlbmd0aCkpe3JlZHJhdz10cnVlO31lbHNle2Zvcih2YXIgaT0wLGxlbj10aGlz LmxheWVyU3RhdGVzLmxlbmd0aDtpPGxlbjtpKyspe3ZhciBsYXllclN0YXRlPXRo aXMubGF5ZXJTdGF0ZXNbaV07dmFyIGxheWVyPXRoaXMubWFwLmxheWVyc1tpXTtp ZigobGF5ZXJTdGF0ZS5uYW1lIT1sYXllci5uYW1lKXx8KGxheWVyU3RhdGUuaW5S YW5nZSE9bGF5ZXIuaW5SYW5nZSl8fChsYXllclN0YXRlLmlkIT1sYXllci5pZCl8 fChsYXllclN0YXRlLnZpc2liaWxpdHkhPWxheWVyLnZpc2liaWxpdHkpKXtyZWRy YXc9dHJ1ZTticmVhazt9fX0KcmV0dXJuIHJlZHJhdzt9LHJlZHJhdzpmdW5jdGlv bigpe2lmKCF0aGlzLmNoZWNrUmVkcmF3KCkpe3JldHVybiB0aGlzLmRpdjt9CnRo aXMuY2xlYXJMYXllcnNBcnJheSgiYmFzZSIpO3RoaXMuY2xlYXJMYXllcnNBcnJh eSgiZGF0YSIpO3ZhciBjb250YWluc092ZXJsYXlzPWZhbHNlO3ZhciBjb250YWlu c0Jhc2VMYXllcnM9ZmFsc2U7dmFyIGxlbj10aGlzLm1hcC5sYXllcnMubGVuZ3Ro O3RoaXMubGF5ZXJTdGF0ZXM9bmV3IEFycmF5KGxlbik7Zm9yKHZhciBpPTA7aTxs ZW47aSsrKXt2YXIgbGF5ZXI9dGhpcy5tYXAubGF5ZXJzW2ldO3RoaXMubGF5ZXJT dGF0ZXNbaV09eyduYW1lJzpsYXllci5uYW1lLCd2aXNpYmlsaXR5JzpsYXllci52 aXNpYmlsaXR5LCdpblJhbmdlJzpsYXllci5pblJhbmdlLCdpZCc6bGF5ZXIuaWR9 O30KdmFyIGxheWVycz10aGlzLm1hcC5sYXllcnMuc2xpY2UoKTtpZighdGhpcy5h c2NlbmRpbmcpe2xheWVycy5yZXZlcnNlKCk7fQpmb3IodmFyIGk9MCxsZW49bGF5 ZXJzLmxlbmd0aDtpPGxlbjtpKyspe3ZhciBsYXllcj1sYXllcnNbaV07dmFyIGJh c2VMYXllcj1sYXllci5pc0Jhc2VMYXllcjtpZihsYXllci5kaXNwbGF5SW5MYXll clN3aXRjaGVyKXtpZihiYXNlTGF5ZXIpe2NvbnRhaW5zQmFzZUxheWVycz10cnVl O31lbHNle2NvbnRhaW5zT3ZlcmxheXM9dHJ1ZTt9CnZhciBjaGVja2VkPShiYXNl TGF5ZXIpPyhsYXllcj09dGhpcy5tYXAuYmFzZUxheWVyKTpsYXllci5nZXRWaXNp YmlsaXR5KCk7dmFyIGlucHV0RWxlbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJp bnB1dCIpO2lucHV0RWxlbS5pZD10aGlzLmlkKyJfaW5wdXRfIitsYXllci5uYW1l O2lucHV0RWxlbS5uYW1lPShiYXNlTGF5ZXIpP3RoaXMuaWQrIl9iYXNlTGF5ZXJz IjpsYXllci5uYW1lO2lucHV0RWxlbS50eXBlPShiYXNlTGF5ZXIpPyJyYWRpbyI6 ImNoZWNrYm94IjtpbnB1dEVsZW0udmFsdWU9bGF5ZXIubmFtZTtpbnB1dEVsZW0u Y2hlY2tlZD1jaGVja2VkO2lucHV0RWxlbS5kZWZhdWx0Q2hlY2tlZD1jaGVja2Vk O2lmKCFiYXNlTGF5ZXImJiFsYXllci5pblJhbmdlKXtpbnB1dEVsZW0uZGlzYWJs ZWQ9dHJ1ZTt9CnZhciBjb250ZXh0PXsnaW5wdXRFbGVtJzppbnB1dEVsZW0sJ2xh eWVyJzpsYXllciwnbGF5ZXJTd2l0Y2hlcic6dGhpc307T3BlbkxheWVycy5FdmVu dC5vYnNlcnZlKGlucHV0RWxlbSwibW91c2V1cCIsT3BlbkxheWVycy5GdW5jdGlv bi5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMub25JbnB1dENsaWNrLGNvbnRleHQp KTt2YXIgbGFiZWxTcGFuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtP cGVuTGF5ZXJzLkVsZW1lbnQuYWRkQ2xhc3MobGFiZWxTcGFuLCJsYWJlbFNwYW4i KTtpZighYmFzZUxheWVyJiYhbGF5ZXIuaW5SYW5nZSl7bGFiZWxTcGFuLnN0eWxl LmNvbG9yPSJncmF5Ijt9CmxhYmVsU3Bhbi5pbm5lckhUTUw9bGF5ZXIubmFtZTts YWJlbFNwYW4uc3R5bGUudmVydGljYWxBbGlnbj0oYmFzZUxheWVyKT8iYm90dG9t IjoiYmFzZWxpbmUiO09wZW5MYXllcnMuRXZlbnQub2JzZXJ2ZShsYWJlbFNwYW4s ImNsaWNrIixPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmRBc0V2ZW50TGlzdGVuZXIo dGhpcy5vbklucHV0Q2xpY2ssY29udGV4dCkpO3ZhciBicj1kb2N1bWVudC5jcmVh dGVFbGVtZW50KCJiciIpO3ZhciBncm91cEFycmF5PShiYXNlTGF5ZXIpP3RoaXMu YmFzZUxheWVyczp0aGlzLmRhdGFMYXllcnM7Z3JvdXBBcnJheS5wdXNoKHsnbGF5 ZXInOmxheWVyLCdpbnB1dEVsZW0nOmlucHV0RWxlbSwnbGFiZWxTcGFuJzpsYWJl bFNwYW59KTt2YXIgZ3JvdXBEaXY9KGJhc2VMYXllcik/dGhpcy5iYXNlTGF5ZXJz RGl2OnRoaXMuZGF0YUxheWVyc0Rpdjtncm91cERpdi5hcHBlbmRDaGlsZChpbnB1 dEVsZW0pO2dyb3VwRGl2LmFwcGVuZENoaWxkKGxhYmVsU3Bhbik7Z3JvdXBEaXYu YXBwZW5kQ2hpbGQoYnIpO319CnRoaXMuZGF0YUxibC5zdHlsZS5kaXNwbGF5PShj b250YWluc092ZXJsYXlzKT8iIjoibm9uZSI7dGhpcy5iYXNlTGJsLnN0eWxlLmRp c3BsYXk9KGNvbnRhaW5zQmFzZUxheWVycyk/IiI6Im5vbmUiO3JldHVybiB0aGlz LmRpdjt9LG9uSW5wdXRDbGljazpmdW5jdGlvbihlKXtpZighdGhpcy5pbnB1dEVs ZW0uZGlzYWJsZWQpe2lmKHRoaXMuaW5wdXRFbGVtLnR5cGU9PSJyYWRpbyIpe3Ro aXMuaW5wdXRFbGVtLmNoZWNrZWQ9dHJ1ZTt0aGlzLmxheWVyLm1hcC5zZXRCYXNl TGF5ZXIodGhpcy5sYXllcik7fWVsc2V7dGhpcy5pbnB1dEVsZW0uY2hlY2tlZD0h dGhpcy5pbnB1dEVsZW0uY2hlY2tlZDt0aGlzLmxheWVyU3dpdGNoZXIudXBkYXRl TWFwKCk7fX0KT3BlbkxheWVycy5FdmVudC5zdG9wKGUpO30sb25MYXllckNsaWNr OmZ1bmN0aW9uKGUpe3RoaXMudXBkYXRlTWFwKCk7fSx1cGRhdGVNYXA6ZnVuY3Rp b24oKXtmb3IodmFyIGk9MCxsZW49dGhpcy5iYXNlTGF5ZXJzLmxlbmd0aDtpPGxl bjtpKyspe3ZhciBsYXllckVudHJ5PXRoaXMuYmFzZUxheWVyc1tpXTtpZihsYXll ckVudHJ5LmlucHV0RWxlbS5jaGVja2VkKXt0aGlzLm1hcC5zZXRCYXNlTGF5ZXIo bGF5ZXJFbnRyeS5sYXllcixmYWxzZSk7fX0KZm9yKHZhciBpPTAsbGVuPXRoaXMu ZGF0YUxheWVycy5sZW5ndGg7aTxsZW47aSsrKXt2YXIgbGF5ZXJFbnRyeT10aGlz LmRhdGFMYXllcnNbaV07bGF5ZXJFbnRyeS5sYXllci5zZXRWaXNpYmlsaXR5KGxh eWVyRW50cnkuaW5wdXRFbGVtLmNoZWNrZWQpO319LG1heGltaXplQ29udHJvbDpm dW5jdGlvbihlKXt0aGlzLmRpdi5zdHlsZS53aWR0aD0iIjt0aGlzLmRpdi5zdHls ZS5oZWlnaHQ9IiI7dGhpcy5zaG93Q29udHJvbHMoZmFsc2UpO2lmKGUhPW51bGwp e09wZW5MYXllcnMuRXZlbnQuc3RvcChlKTt9fSxtaW5pbWl6ZUNvbnRyb2w6ZnVu Y3Rpb24oZSl7dGhpcy5kaXYuc3R5bGUud2lkdGg9IjBweCI7dGhpcy5kaXYuc3R5 bGUuaGVpZ2h0PSIwcHgiO3RoaXMuc2hvd0NvbnRyb2xzKHRydWUpO2lmKGUhPW51 bGwpe09wZW5MYXllcnMuRXZlbnQuc3RvcChlKTt9fSxzaG93Q29udHJvbHM6ZnVu Y3Rpb24obWluaW1pemUpe3RoaXMubWF4aW1pemVEaXYuc3R5bGUuZGlzcGxheT1t aW5pbWl6ZT8iIjoibm9uZSI7dGhpcy5taW5pbWl6ZURpdi5zdHlsZS5kaXNwbGF5 PW1pbmltaXplPyJub25lIjoiIjt0aGlzLmxheWVyc0Rpdi5zdHlsZS5kaXNwbGF5 PW1pbmltaXplPyJub25lIjoiIjt9LGxvYWRDb250ZW50czpmdW5jdGlvbigpe09w ZW5MYXllcnMuRXZlbnQub2JzZXJ2ZSh0aGlzLmRpdiwibW91c2V1cCIsT3Blbkxh eWVycy5GdW5jdGlvbi5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMubW91c2VVcCx0 aGlzKSk7T3BlbkxheWVycy5FdmVudC5vYnNlcnZlKHRoaXMuZGl2LCJjbGljayIs dGhpcy5pZ25vcmVFdmVudCk7T3BlbkxheWVycy5FdmVudC5vYnNlcnZlKHRoaXMu ZGl2LCJtb3VzZWRvd24iLE9wZW5MYXllcnMuRnVuY3Rpb24uYmluZEFzRXZlbnRM aXN0ZW5lcih0aGlzLm1vdXNlRG93bix0aGlzKSk7T3BlbkxheWVycy5FdmVudC5v YnNlcnZlKHRoaXMuZGl2LCJkYmxjbGljayIsdGhpcy5pZ25vcmVFdmVudCk7dGhp cy5sYXllcnNEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5s YXllcnNEaXYuaWQ9dGhpcy5pZCsiX2xheWVyc0RpdiI7T3BlbkxheWVycy5FbGVt ZW50LmFkZENsYXNzKHRoaXMubGF5ZXJzRGl2LCJsYXllcnNEaXYiKTt0aGlzLmJh c2VMYmw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5iYXNlTGJs LmlubmVySFRNTD1PcGVuTGF5ZXJzLmkxOG4oIkJhc2UgTGF5ZXIiKTtPcGVuTGF5 ZXJzLkVsZW1lbnQuYWRkQ2xhc3ModGhpcy5iYXNlTGJsLCJiYXNlTGJsIik7dGhp cy5iYXNlTGF5ZXJzRGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO09w ZW5MYXllcnMuRWxlbWVudC5hZGRDbGFzcyh0aGlzLmJhc2VMYXllcnNEaXYsImJh c2VMYXllcnNEaXYiKTt0aGlzLmRhdGFMYmw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVu dCgiZGl2Iik7dGhpcy5kYXRhTGJsLmlubmVySFRNTD1PcGVuTGF5ZXJzLmkxOG4o Ik92ZXJsYXlzIik7T3BlbkxheWVycy5FbGVtZW50LmFkZENsYXNzKHRoaXMuZGF0 YUxibCwiZGF0YUxibCIpO3RoaXMuZGF0YUxheWVyc0Rpdj1kb2N1bWVudC5jcmVh dGVFbGVtZW50KCJkaXYiKTtPcGVuTGF5ZXJzLkVsZW1lbnQuYWRkQ2xhc3ModGhp cy5kYXRhTGF5ZXJzRGl2LCJkYXRhTGF5ZXJzRGl2Iik7aWYodGhpcy5hc2NlbmRp bmcpe3RoaXMubGF5ZXJzRGl2LmFwcGVuZENoaWxkKHRoaXMuYmFzZUxibCk7dGhp cy5sYXllcnNEaXYuYXBwZW5kQ2hpbGQodGhpcy5iYXNlTGF5ZXJzRGl2KTt0aGlz LmxheWVyc0Rpdi5hcHBlbmRDaGlsZCh0aGlzLmRhdGFMYmwpO3RoaXMubGF5ZXJz RGl2LmFwcGVuZENoaWxkKHRoaXMuZGF0YUxheWVyc0Rpdik7fWVsc2V7dGhpcy5s YXllcnNEaXYuYXBwZW5kQ2hpbGQodGhpcy5kYXRhTGJsKTt0aGlzLmxheWVyc0Rp di5hcHBlbmRDaGlsZCh0aGlzLmRhdGFMYXllcnNEaXYpO3RoaXMubGF5ZXJzRGl2 LmFwcGVuZENoaWxkKHRoaXMuYmFzZUxibCk7dGhpcy5sYXllcnNEaXYuYXBwZW5k Q2hpbGQodGhpcy5iYXNlTGF5ZXJzRGl2KTt9CnRoaXMuZGl2LmFwcGVuZENoaWxk KHRoaXMubGF5ZXJzRGl2KTtpZih0aGlzLnJvdW5kZWRDb3JuZXIpe09wZW5MYXll cnMuUmljby5Db3JuZXIucm91bmQodGhpcy5kaXYse2Nvcm5lcnM6InRsIGJsIixi Z0NvbG9yOiJ0cmFuc3BhcmVudCIsY29sb3I6dGhpcy5yb3VuZGVkQ29ybmVyQ29s b3IsYmxlbmQ6ZmFsc2V9KTtPcGVuTGF5ZXJzLlJpY28uQ29ybmVyLmNoYW5nZU9w YWNpdHkodGhpcy5sYXllcnNEaXYsMC43NSk7fQp2YXIgaW1nTG9jYXRpb249T3Bl bkxheWVycy5VdGlsLmdldEltYWdlc0xvY2F0aW9uKCk7dmFyIHN6PW5ldyBPcGVu TGF5ZXJzLlNpemUoMTgsMTgpO3ZhciBpbWc9aW1nTG9jYXRpb24rJ2xheWVyLXN3 aXRjaGVyLW1heGltaXplLnBuZyc7dGhpcy5tYXhpbWl6ZURpdj1PcGVuTGF5ZXJz LlV0aWwuY3JlYXRlQWxwaGFJbWFnZURpdigiT3BlbkxheWVyc19Db250cm9sX01h eGltaXplRGl2IixudWxsLHN6LGltZywiYWJzb2x1dGUiKTtPcGVuTGF5ZXJzLkVs ZW1lbnQuYWRkQ2xhc3ModGhpcy5tYXhpbWl6ZURpdiwibWF4aW1pemVEaXYiKTt0 aGlzLm1heGltaXplRGl2LnN0eWxlLmRpc3BsYXk9Im5vbmUiO09wZW5MYXllcnMu RXZlbnQub2JzZXJ2ZSh0aGlzLm1heGltaXplRGl2LCJjbGljayIsT3BlbkxheWVy cy5GdW5jdGlvbi5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMubWF4aW1pemVDb250 cm9sLHRoaXMpKTt0aGlzLmRpdi5hcHBlbmRDaGlsZCh0aGlzLm1heGltaXplRGl2 KTt2YXIgaW1nPWltZ0xvY2F0aW9uKydsYXllci1zd2l0Y2hlci1taW5pbWl6ZS5w bmcnO3ZhciBzej1uZXcgT3BlbkxheWVycy5TaXplKDE4LDE4KTt0aGlzLm1pbmlt aXplRGl2PU9wZW5MYXllcnMuVXRpbC5jcmVhdGVBbHBoYUltYWdlRGl2KCJPcGVu TGF5ZXJzX0NvbnRyb2xfTWluaW1pemVEaXYiLG51bGwsc3osaW1nLCJhYnNvbHV0 ZSIpO09wZW5MYXllcnMuRWxlbWVudC5hZGRDbGFzcyh0aGlzLm1pbmltaXplRGl2 LCJtaW5pbWl6ZURpdiIpO3RoaXMubWluaW1pemVEaXYuc3R5bGUuZGlzcGxheT0i bm9uZSI7T3BlbkxheWVycy5FdmVudC5vYnNlcnZlKHRoaXMubWluaW1pemVEaXYs ImNsaWNrIixPcGVuTGF5ZXJzLkZ1bmN0aW9uLmJpbmRBc0V2ZW50TGlzdGVuZXIo dGhpcy5taW5pbWl6ZUNvbnRyb2wsdGhpcykpO3RoaXMuZGl2LmFwcGVuZENoaWxk KHRoaXMubWluaW1pemVEaXYpO30saWdub3JlRXZlbnQ6ZnVuY3Rpb24oZXZ0KXtP cGVuTGF5ZXJzLkV2ZW50LnN0b3AoZXZ0KTt9LG1vdXNlRG93bjpmdW5jdGlvbihl dnQpe3RoaXMuaXNNb3VzZURvd249dHJ1ZTt0aGlzLmlnbm9yZUV2ZW50KGV2dCk7 fSxtb3VzZVVwOmZ1bmN0aW9uKGV2dCl7aWYodGhpcy5pc01vdXNlRG93bil7dGhp cy5pc01vdXNlRG93bj1mYWxzZTt0aGlzLmlnbm9yZUV2ZW50KGV2dCk7fX0sQ0xB U1NfTkFNRToiT3BlbkxheWVycy5Db250cm9sLkxheWVyU3dpdGNoZXIifSk7T3Bl bkxheWVycy5Gb3JtYXQuV0ZTPU9wZW5MYXllcnMuQ2xhc3MoT3BlbkxheWVycy5G b3JtYXQuR01MLHtsYXllcjpudWxsLHdmc25zOiJodHRwOi8vd3d3Lm9wZW5naXMu bmV0L3dmcyIsb2djbnM6Imh0dHA6Ly93d3cub3Blbmdpcy5uZXQvb2djIixpbml0 aWFsaXplOmZ1bmN0aW9uKG9wdGlvbnMsbGF5ZXIpe09wZW5MYXllcnMuRm9ybWF0 LkdNTC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7 dGhpcy5sYXllcj1sYXllcjtpZih0aGlzLmxheWVyLmZlYXR1cmVOUyl7dGhpcy5m ZWF0dXJlTlM9dGhpcy5sYXllci5mZWF0dXJlTlM7fQppZih0aGlzLmxheWVyLm9w dGlvbnMuZ2VvbWV0cnlfY29sdW1uKXt0aGlzLmdlb21ldHJ5TmFtZT10aGlzLmxh eWVyLm9wdGlvbnMuZ2VvbWV0cnlfY29sdW1uO30KaWYodGhpcy5sYXllci5vcHRp b25zLnR5cGVuYW1lKXt0aGlzLmZlYXR1cmVOYW1lPXRoaXMubGF5ZXIub3B0aW9u cy50eXBlbmFtZTt9fSx3cml0ZTpmdW5jdGlvbihmZWF0dXJlcyl7dmFyIHRyYW5z YWN0aW9uPXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMud2ZzbnMsJ3dmczpUcmFu c2FjdGlvbicpO3RyYW5zYWN0aW9uLnNldEF0dHJpYnV0ZSgidmVyc2lvbiIsIjEu MC4wIik7dHJhbnNhY3Rpb24uc2V0QXR0cmlidXRlKCJzZXJ2aWNlIiwiV0ZTIik7 Zm9yKHZhciBpPTA7aTxmZWF0dXJlcy5sZW5ndGg7aSsrKXtzd2l0Y2goZmVhdHVy ZXNbaV0uc3RhdGUpe2Nhc2UgT3BlbkxheWVycy5TdGF0ZS5JTlNFUlQ6dHJhbnNh Y3Rpb24uYXBwZW5kQ2hpbGQodGhpcy5pbnNlcnQoZmVhdHVyZXNbaV0pKTticmVh aztjYXNlIE9wZW5MYXllcnMuU3RhdGUuVVBEQVRFOnRyYW5zYWN0aW9uLmFwcGVu ZENoaWxkKHRoaXMudXBkYXRlKGZlYXR1cmVzW2ldKSk7YnJlYWs7Y2FzZSBPcGVu TGF5ZXJzLlN0YXRlLkRFTEVURTp0cmFuc2FjdGlvbi5hcHBlbmRDaGlsZCh0aGlz LnJlbW92ZShmZWF0dXJlc1tpXSkpO2JyZWFrO319CnJldHVybiBPcGVuTGF5ZXJz LkZvcm1hdC5YTUwucHJvdG90eXBlLndyaXRlLmFwcGx5KHRoaXMsW3RyYW5zYWN0 aW9uXSk7fSxjcmVhdGVGZWF0dXJlWE1MOmZ1bmN0aW9uKGZlYXR1cmUpe3ZhciBn ZW9tZXRyeU5vZGU9dGhpcy5idWlsZEdlb21ldHJ5Tm9kZShmZWF0dXJlLmdlb21l dHJ5KTt2YXIgZ2VvbUNvbnRhaW5lcj10aGlzLmNyZWF0ZUVsZW1lbnROUyh0aGlz LmZlYXR1cmVOUywiZmVhdHVyZToiK3RoaXMuZ2VvbWV0cnlOYW1lKTtnZW9tQ29u dGFpbmVyLmFwcGVuZENoaWxkKGdlb21ldHJ5Tm9kZSk7dmFyIGZlYXR1cmVDb250 YWluZXI9dGhpcy5jcmVhdGVFbGVtZW50TlModGhpcy5mZWF0dXJlTlMsImZlYXR1 cmU6Iit0aGlzLmZlYXR1cmVOYW1lKTtmZWF0dXJlQ29udGFpbmVyLmFwcGVuZENo aWxkKGdlb21Db250YWluZXIpO2Zvcih2YXIgYXR0ciBpbiBmZWF0dXJlLmF0dHJp YnV0ZXMpe3ZhciBhdHRyVGV4dD10aGlzLmNyZWF0ZVRleHROb2RlKGZlYXR1cmUu YXR0cmlidXRlc1thdHRyXSk7dmFyIG5vZGVuYW1lPWF0dHI7aWYoYXR0ci5zZWFy Y2goIjoiKSE9LTEpe25vZGVuYW1lPWF0dHIuc3BsaXQoIjoiKVsxXTt9CnZhciBh dHRyQ29udGFpbmVyPXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMuZmVhdHVyZU5T LCJmZWF0dXJlOiIrbm9kZW5hbWUpO2F0dHJDb250YWluZXIuYXBwZW5kQ2hpbGQo YXR0clRleHQpO2ZlYXR1cmVDb250YWluZXIuYXBwZW5kQ2hpbGQoYXR0ckNvbnRh aW5lcik7fQpyZXR1cm4gZmVhdHVyZUNvbnRhaW5lcjt9LGluc2VydDpmdW5jdGlv bihmZWF0dXJlKXt2YXIgaW5zZXJ0Tm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROUyh0 aGlzLndmc25zLCd3ZnM6SW5zZXJ0Jyk7aW5zZXJ0Tm9kZS5hcHBlbmRDaGlsZCh0 aGlzLmNyZWF0ZUZlYXR1cmVYTUwoZmVhdHVyZSkpO3JldHVybiBpbnNlcnROb2Rl O30sdXBkYXRlOmZ1bmN0aW9uKGZlYXR1cmUpe2lmKCFmZWF0dXJlLmZpZCl7T3Bl bkxheWVycy5Db25zb2xlLnVzZXJFcnJvcihPcGVuTGF5ZXJzLmkxOG4oIm5vRklE IikpO30KdmFyIHVwZGF0ZU5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlModGhpcy53 ZnNucywnd2ZzOlVwZGF0ZScpO3VwZGF0ZU5vZGUuc2V0QXR0cmlidXRlKCJ0eXBl TmFtZSIsdGhpcy5mZWF0dXJlUHJlZml4Kyc6Jyt0aGlzLmZlYXR1cmVOYW1lKTt1 cGRhdGVOb2RlLnNldEF0dHJpYnV0ZSgieG1sbnM6Iit0aGlzLmZlYXR1cmVQcmVm aXgsdGhpcy5mZWF0dXJlTlMpO3ZhciBwcm9wZXJ0eU5vZGU9dGhpcy5jcmVhdGVF bGVtZW50TlModGhpcy53ZnNucywnd2ZzOlByb3BlcnR5Jyk7dmFyIG5hbWVOb2Rl PXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMud2ZzbnMsJ3dmczpOYW1lJyk7dmFy IHR4dE5vZGU9dGhpcy5jcmVhdGVUZXh0Tm9kZSh0aGlzLmdlb21ldHJ5TmFtZSk7 bmFtZU5vZGUuYXBwZW5kQ2hpbGQodHh0Tm9kZSk7cHJvcGVydHlOb2RlLmFwcGVu ZENoaWxkKG5hbWVOb2RlKTt2YXIgdmFsdWVOb2RlPXRoaXMuY3JlYXRlRWxlbWVu dE5TKHRoaXMud2ZzbnMsJ3dmczpWYWx1ZScpO3ZhciBnZW9tZXRyeU5vZGU9dGhp cy5idWlsZEdlb21ldHJ5Tm9kZShmZWF0dXJlLmdlb21ldHJ5KTtpZihmZWF0dXJl LmxheWVyKXtnZW9tZXRyeU5vZGUuc2V0QXR0cmlidXRlKCJzcnNOYW1lIixmZWF0 dXJlLmxheWVyLnByb2plY3Rpb24uZ2V0Q29kZSgpKTt9CnZhbHVlTm9kZS5hcHBl bmRDaGlsZChnZW9tZXRyeU5vZGUpO3Byb3BlcnR5Tm9kZS5hcHBlbmRDaGlsZCh2 YWx1ZU5vZGUpO3VwZGF0ZU5vZGUuYXBwZW5kQ2hpbGQocHJvcGVydHlOb2RlKTtm b3IodmFyIHByb3BOYW1lIGluIGZlYXR1cmUuYXR0cmlidXRlcyl7cHJvcGVydHlO b2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMud2ZzbnMsJ3dmczpQcm9wZXJ0 eScpO25hbWVOb2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMud2ZzbnMsJ3dm czpOYW1lJyk7bmFtZU5vZGUuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVUZXh0Tm9k ZShwcm9wTmFtZSkpO3Byb3BlcnR5Tm9kZS5hcHBlbmRDaGlsZChuYW1lTm9kZSk7 dmFsdWVOb2RlPXRoaXMuY3JlYXRlRWxlbWVudE5TKHRoaXMud2ZzbnMsJ3dmczpW YWx1ZScpO3ZhbHVlTm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZVRleHROb2Rl KGZlYXR1cmUuYXR0cmlidXRlc1twcm9wTmFtZV0pKTtwcm9wZXJ0eU5vZGUuYXBw ZW5kQ2hpbGQodmFsdWVOb2RlKTt1cGRhdGVOb2RlLmFwcGVuZENoaWxkKHByb3Bl cnR5Tm9kZSk7fQp2YXIgZmlsdGVyTm9kZT10aGlzLmNyZWF0ZUVsZW1lbnROUyh0 aGlzLm9nY25zLCdvZ2M6RmlsdGVyJyk7dmFyIGZpbHRlcklkTm9kZT10aGlzLmNy ZWF0ZUVsZW1lbnROUyh0aGlzLm9nY25zLCdvZ2M6RmVhdHVyZUlkJyk7ZmlsdGVy SWROb2RlLnNldEF0dHJpYnV0ZSgiZmlkIixmZWF0dXJlLmZpZCk7ZmlsdGVyTm9k ZS5hcHBlbmRDaGlsZChmaWx0ZXJJZE5vZGUpO3VwZGF0ZU5vZGUuYXBwZW5kQ2hp bGQoZmlsdGVyTm9kZSk7cmV0dXJuIHVwZGF0ZU5vZGU7fSxyZW1vdmU6ZnVuY3Rp b24oZmVhdHVyZSl7aWYoIWZlYXR1cmUuZmlkKXtPcGVuTGF5ZXJzLkNvbnNvbGUu dXNlckVycm9yKE9wZW5MYXllcnMuaTE4bigibm9GSUQiKSk7cmV0dXJuIGZhbHNl O30KdmFyIGRlbGV0ZU5vZGU9dGhpcy5jcmVhdGVFbGVtZW50TlModGhpcy53ZnNu cywnd2ZzOkRlbGV0ZScpO2RlbGV0ZU5vZGUuc2V0QXR0cmlidXRlKCJ0eXBlTmFt ZSIsdGhpcy5mZWF0dXJlUHJlZml4Kyc6Jyt0aGlzLmZlYXR1cmVOYW1lKTtkZWxl dGVOb2RlLnNldEF0dHJpYnV0ZSgieG1sbnM6Iit0aGlzLmZlYXR1cmVQcmVmaXgs dGhpcy5mZWF0dXJlTlMpO3ZhciBmaWx0ZXJOb2RlPXRoaXMuY3JlYXRlRWxlbWVu dE5TKHRoaXMub2djbnMsJ29nYzpGaWx0ZXInKTt2YXIgZmlsdGVySWROb2RlPXRo aXMuY3JlYXRlRWxlbWVudE5TKHRoaXMub2djbnMsJ29nYzpGZWF0dXJlSWQnKTtm aWx0ZXJJZE5vZGUuc2V0QXR0cmlidXRlKCJmaWQiLGZlYXR1cmUuZmlkKTtmaWx0 ZXJOb2RlLmFwcGVuZENoaWxkKGZpbHRlcklkTm9kZSk7ZGVsZXRlTm9kZS5hcHBl bmRDaGlsZChmaWx0ZXJOb2RlKTtyZXR1cm4gZGVsZXRlTm9kZTt9LGRlc3Ryb3k6 ZnVuY3Rpb24oKXt0aGlzLmxheWVyPW51bGw7fSxDTEFTU19OQU1FOiJPcGVuTGF5 ZXJzLkZvcm1hdC5XRlMifSk7T3BlbkxheWVycy5Gb3JtYXQuQXRvbT1PcGVuTGF5 ZXJzLkNsYXNzKE9wZW5MYXllcnMuRm9ybWF0LlhNTCx7bmFtZXNwYWNlczp7YXRv bToiaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIixnZW9yc3M6Imh0dHA6Ly93 d3cuZ2VvcnNzLm9yZy9nZW9yc3MifSxmZWVkVGl0bGU6InVudGl0bGVkIixkZWZh dWx0RW50cnlUaXRsZToidW50aXRsZWQiLGdtbFBhcnNlcjpudWxsLHh5OmZhbHNl LHJlYWQ6ZnVuY3Rpb24oZG9jKXtpZih0eXBlb2YgZG9jPT0ic3RyaW5nIil7ZG9j PU9wZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5cGUucmVhZC5hcHBseSh0aGlz LFtkb2NdKTt9CnJldHVybiB0aGlzLnBhcnNlRmVhdHVyZXMoZG9jKTt9LHdyaXRl OmZ1bmN0aW9uKGZlYXR1cmVzKXt2YXIgZG9jO2lmKE9wZW5MYXllcnMuVXRpbC5p c0FycmF5KGZlYXR1cmVzKSl7ZG9jPXRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygi YXRvbTpmZWVkIik7ZG9jLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRWxlbWVudE5T UGx1cygiYXRvbTp0aXRsZSIse3ZhbHVlOnRoaXMuZmVlZFRpdGxlfSkpO2Zvcih2 YXIgaT0wLGlpPWZlYXR1cmVzLmxlbmd0aDtpPGlpO2krKyl7ZG9jLmFwcGVuZENo aWxkKHRoaXMuYnVpbGRFbnRyeU5vZGUoZmVhdHVyZXNbaV0pKTt9fQplbHNle2Rv Yz10aGlzLmJ1aWxkRW50cnlOb2RlKGZlYXR1cmVzKTt9CnJldHVybiBPcGVuTGF5 ZXJzLkZvcm1hdC5YTUwucHJvdG90eXBlLndyaXRlLmFwcGx5KHRoaXMsW2RvY10p O30sYnVpbGRDb250ZW50Tm9kZTpmdW5jdGlvbihjb250ZW50KXt2YXIgbm9kZT10 aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImF0b206Y29udGVudCIse2F0dHJpYnV0 ZXM6e3R5cGU6Y29udGVudC50eXBlfHxudWxsfX0pO2lmKGNvbnRlbnQuc3JjKXtu b2RlLnNldEF0dHJpYnV0ZSgic3JjIixjb250ZW50LnNyYyk7fWVsc2V7aWYoY29u dGVudC50eXBlPT0idGV4dCJ8fGNvbnRlbnQudHlwZT09bnVsbCl7bm9kZS5hcHBl bmRDaGlsZCh0aGlzLmNyZWF0ZVRleHROb2RlKGNvbnRlbnQudmFsdWUpKTt9ZWxz ZSBpZihjb250ZW50LnR5cGU9PSJodG1sIil7aWYodHlwZW9mIGNvbnRlbnQudmFs dWUhPSJzdHJpbmciKXt0aHJvdyJIVE1MIGNvbnRlbnQgbXVzdCBiZSBpbiBmb3Jt IG9mIGFuIGVzY2FwZWQgc3RyaW5nIjt9Cm5vZGUuYXBwZW5kQ2hpbGQodGhpcy5j cmVhdGVUZXh0Tm9kZShjb250ZW50LnZhbHVlKSk7fWVsc2UgaWYoY29udGVudC50 eXBlPT0ieGh0bWwiKXtub2RlLmFwcGVuZENoaWxkKGNvbnRlbnQudmFsdWUpO31l bHNlIGlmKGNvbnRlbnQudHlwZT09InhodG1sInx8Y29udGVudC50eXBlLm1hdGNo KC8oXCt8XC8peG1sJC8pKXtub2RlLmFwcGVuZENoaWxkKGNvbnRlbnQudmFsdWUp O30KZWxzZXtub2RlLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlVGV4dE5vZGUoY29u dGVudC52YWx1ZSkpO319CnJldHVybiBub2RlO30sYnVpbGRFbnRyeU5vZGU6ZnVu Y3Rpb24oZmVhdHVyZSl7dmFyIGF0dHJpYj1mZWF0dXJlLmF0dHJpYnV0ZXM7dmFy IGF0b21BdHRyaWI9YXR0cmliLmF0b218fHt9O3ZhciBlbnRyeU5vZGU9dGhpcy5j cmVhdGVFbGVtZW50TlNQbHVzKCJhdG9tOmVudHJ5Iik7aWYoYXRvbUF0dHJpYi5h dXRob3JzKXt2YXIgYXV0aG9ycz1PcGVuTGF5ZXJzLlV0aWwuaXNBcnJheShhdG9t QXR0cmliLmF1dGhvcnMpP2F0b21BdHRyaWIuYXV0aG9yczpbYXRvbUF0dHJpYi5h dXRob3JzXTtmb3IodmFyIGk9MCxpaT1hdXRob3JzLmxlbmd0aDtpPGlpO2krKyl7 ZW50cnlOb2RlLmFwcGVuZENoaWxkKHRoaXMuYnVpbGRQZXJzb25Db25zdHJ1Y3RO b2RlKCJhdXRob3IiLGF1dGhvcnNbaV0pKTt9fQppZihhdG9tQXR0cmliLmNhdGVn b3JpZXMpe3ZhciBjYXRlZ29yaWVzPU9wZW5MYXllcnMuVXRpbC5pc0FycmF5KGF0 b21BdHRyaWIuY2F0ZWdvcmllcyk/YXRvbUF0dHJpYi5jYXRlZ29yaWVzOlthdG9t QXR0cmliLmNhdGVnb3JpZXNdO3ZhciBjYXRlZ29yeTtmb3IodmFyIGk9MCxpaT1j YXRlZ29yaWVzLmxlbmd0aDtpPGlpO2krKyl7Y2F0ZWdvcnk9Y2F0ZWdvcmllc1tp XTtlbnRyeU5vZGUuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVFbGVtZW50TlNQbHVz KCJhdG9tOmNhdGVnb3J5Iix7YXR0cmlidXRlczp7dGVybTpjYXRlZ29yeS50ZXJt LHNjaGVtZTpjYXRlZ29yeS5zY2hlbWV8fG51bGwsbGFiZWw6Y2F0ZWdvcnkubGFi ZWx8fG51bGx9fSkpO319CmlmKGF0b21BdHRyaWIuY29udGVudCl7ZW50cnlOb2Rl LmFwcGVuZENoaWxkKHRoaXMuYnVpbGRDb250ZW50Tm9kZShhdG9tQXR0cmliLmNv bnRlbnQpKTt9CmlmKGF0b21BdHRyaWIuY29udHJpYnV0b3JzKXt2YXIgY29udHJp YnV0b3JzPU9wZW5MYXllcnMuVXRpbC5pc0FycmF5KGF0b21BdHRyaWIuY29udHJp YnV0b3JzKT9hdG9tQXR0cmliLmNvbnRyaWJ1dG9yczpbYXRvbUF0dHJpYi5jb250 cmlidXRvcnNdO2Zvcih2YXIgaT0wLGlpPWNvbnRyaWJ1dG9ycy5sZW5ndGg7aTxp aTtpKyspe2VudHJ5Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLmJ1aWxkUGVyc29uQ29u c3RydWN0Tm9kZSgiY29udHJpYnV0b3IiLGNvbnRyaWJ1dG9yc1tpXSkpO319Cmlm KGZlYXR1cmUuZmlkKXtlbnRyeU5vZGUuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVF bGVtZW50TlNQbHVzKCJhdG9tOmlkIix7dmFsdWU6ZmVhdHVyZS5maWR9KSk7fQpp ZihhdG9tQXR0cmliLmxpbmtzKXt2YXIgbGlua3M9T3BlbkxheWVycy5VdGlsLmlz QXJyYXkoYXRvbUF0dHJpYi5saW5rcyk/YXRvbUF0dHJpYi5saW5rczpbYXRvbUF0 dHJpYi5saW5rc107dmFyIGxpbms7Zm9yKHZhciBpPTAsaWk9bGlua3MubGVuZ3Ro O2k8aWk7aSsrKXtsaW5rPWxpbmtzW2ldO2VudHJ5Tm9kZS5hcHBlbmRDaGlsZCh0 aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImF0b206bGluayIse2F0dHJpYnV0ZXM6 e2hyZWY6bGluay5ocmVmLHJlbDpsaW5rLnJlbHx8bnVsbCx0eXBlOmxpbmsudHlw ZXx8bnVsbCxocmVmbGFuZzpsaW5rLmhyZWZsYW5nfHxudWxsLHRpdGxlOmxpbmsu dGl0bGV8fG51bGwsbGVuZ3RoOmxpbmsubGVuZ3RofHxudWxsfX0pKTt9fQppZihh dG9tQXR0cmliLnB1Ymxpc2hlZCl7ZW50cnlOb2RlLmFwcGVuZENoaWxkKHRoaXMu Y3JlYXRlRWxlbWVudE5TUGx1cygiYXRvbTpwdWJsaXNoZWQiLHt2YWx1ZTphdG9t QXR0cmliLnB1Ymxpc2hlZH0pKTt9CmlmKGF0b21BdHRyaWIucmlnaHRzKXtlbnRy eU5vZGUuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVFbGVtZW50TlNQbHVzKCJhdG9t OnJpZ2h0cyIse3ZhbHVlOmF0b21BdHRyaWIucmlnaHRzfSkpO30KaWYoYXRvbUF0 dHJpYi5zdW1tYXJ5fHxhdHRyaWIuZGVzY3JpcHRpb24pe2VudHJ5Tm9kZS5hcHBl bmRDaGlsZCh0aGlzLmNyZWF0ZUVsZW1lbnROU1BsdXMoImF0b206c3VtbWFyeSIs e3ZhbHVlOmF0b21BdHRyaWIuc3VtbWFyeXx8YXR0cmliLmRlc2NyaXB0aW9ufSkp O30KZW50cnlOb2RlLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRWxlbWVudE5TUGx1 cygiYXRvbTp0aXRsZSIse3ZhbHVlOmF0b21BdHRyaWIudGl0bGV8fGF0dHJpYi50 aXRsZXx8dGhpcy5kZWZhdWx0RW50cnlUaXRsZX0pKTtpZihhdG9tQXR0cmliLnVw ZGF0ZWQpe2VudHJ5Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUVsZW1lbnRO U1BsdXMoImF0b206dXBkYXRlZCIse3ZhbHVlOmF0b21BdHRyaWIudXBkYXRlZH0p KTt9CmlmKGZlYXR1cmUuZ2VvbWV0cnkpe3ZhciB3aGVyZU5vZGU9dGhpcy5jcmVh dGVFbGVtZW50TlNQbHVzKCJnZW9yc3M6d2hlcmUiKTt3aGVyZU5vZGUuYXBwZW5k Q2hpbGQodGhpcy5idWlsZEdlb21ldHJ5Tm9kZShmZWF0dXJlLmdlb21ldHJ5KSk7 ZW50cnlOb2RlLmFwcGVuZENoaWxkKHdoZXJlTm9kZSk7fQpyZXR1cm4gZW50cnlO b2RlO30saW5pdEdtbFBhcnNlcjpmdW5jdGlvbigpe3RoaXMuZ21sUGFyc2VyPW5l dyBPcGVuTGF5ZXJzLkZvcm1hdC5HTUwudjMoe3h5OnRoaXMueHksZmVhdHVyZU5T OiJodHRwOi8vZXhhbXBsZS5jb20jZmVhdHVyZSIsaW50ZXJuYWxQcm9qZWN0aW9u OnRoaXMuaW50ZXJuYWxQcm9qZWN0aW9uLGV4dGVybmFsUHJvamVjdGlvbjp0aGlz LmV4dGVybmFsUHJvamVjdGlvbn0pO30sYnVpbGRHZW9tZXRyeU5vZGU6ZnVuY3Rp b24oZ2VvbWV0cnkpe2lmKCF0aGlzLmdtbFBhcnNlcil7dGhpcy5pbml0R21sUGFy c2VyKCk7fQp2YXIgbm9kZT10aGlzLmdtbFBhcnNlci53cml0ZU5vZGUoImZlYXR1 cmU6X2dlb21ldHJ5IixnZW9tZXRyeSk7cmV0dXJuIG5vZGUuZmlyc3RDaGlsZDt9 LGJ1aWxkUGVyc29uQ29uc3RydWN0Tm9kZTpmdW5jdGlvbihuYW1lLHZhbHVlKXt2 YXIgb05hbWVzPVsidXJpIiwiZW1haWwiXTt2YXIgcGVyc29uTm9kZT10aGlzLmNy ZWF0ZUVsZW1lbnROU1BsdXMoImF0b206IituYW1lKTtwZXJzb25Ob2RlLmFwcGVu ZENoaWxkKHRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygiYXRvbTpuYW1lIix7dmFs dWU6dmFsdWUubmFtZX0pKTtmb3IodmFyIGk9MCxpaT1vTmFtZXMubGVuZ3RoO2k8 aWk7aSsrKXtpZih2YWx1ZVtvTmFtZXNbaV1dKXtwZXJzb25Ob2RlLmFwcGVuZENo aWxkKHRoaXMuY3JlYXRlRWxlbWVudE5TUGx1cygiYXRvbToiK29OYW1lc1tpXSx7 dmFsdWU6dmFsdWVbb05hbWVzW2ldXX0pKTt9fQpyZXR1cm4gcGVyc29uTm9kZTt9 LGdldEZpcnN0Q2hpbGRWYWx1ZTpmdW5jdGlvbihub2RlLG5zdXJpLG5hbWUsZGVm KXt2YXIgdmFsdWU7dmFyIG5vZGVzPXRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWVO Uyhub2RlLG5zdXJpLG5hbWUpO2lmKG5vZGVzJiZub2Rlcy5sZW5ndGg+MCl7dmFs dWU9dGhpcy5nZXRDaGlsZFZhbHVlKG5vZGVzWzBdLGRlZik7fWVsc2V7dmFsdWU9 ZGVmO30KcmV0dXJuIHZhbHVlO30scGFyc2VGZWF0dXJlOmZ1bmN0aW9uKG5vZGUp e3ZhciBhdG9tQXR0cmliPXt9O3ZhciB2YWx1ZT1udWxsO3ZhciBub2Rlcz1udWxs O3ZhciBhdHR2YWw9bnVsbDt2YXIgYXRvbW5zPXRoaXMubmFtZXNwYWNlcy5hdG9t O3RoaXMucGFyc2VQZXJzb25Db25zdHJ1Y3RzKG5vZGUsImF1dGhvciIsYXRvbUF0 dHJpYik7bm9kZXM9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5vZGUsYXRv bW5zLCJjYXRlZ29yeSIpO2lmKG5vZGVzLmxlbmd0aD4wKXthdG9tQXR0cmliLmNh dGVnb3JpZXM9W107fQpmb3IodmFyIGk9MCxpaT1ub2Rlcy5sZW5ndGg7aTxpaTtp Kyspe3ZhbHVlPXt9O3ZhbHVlLnRlcm09bm9kZXNbaV0uZ2V0QXR0cmlidXRlKCJ0 ZXJtIik7YXR0dmFsPW5vZGVzW2ldLmdldEF0dHJpYnV0ZSgic2NoZW1lIik7aWYo YXR0dmFsKXt2YWx1ZS5zY2hlbWU9YXR0dmFsO30KYXR0dmFsPW5vZGVzW2ldLmdl dEF0dHJpYnV0ZSgibGFiZWwiKTtpZihhdHR2YWwpe3ZhbHVlLmxhYmVsPWF0dHZh bDt9CmF0b21BdHRyaWIuY2F0ZWdvcmllcy5wdXNoKHZhbHVlKTt9Cm5vZGVzPXRo aXMuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhub2RlLGF0b21ucywiY29udGVudCIp O2lmKG5vZGVzLmxlbmd0aD4wKXt2YWx1ZT17fTthdHR2YWw9bm9kZXNbMF0uZ2V0 QXR0cmlidXRlKCJ0eXBlIik7aWYoYXR0dmFsKXt2YWx1ZS50eXBlPWF0dHZhbDt9 CmF0dHZhbD1ub2Rlc1swXS5nZXRBdHRyaWJ1dGUoInNyYyIpO2lmKGF0dHZhbCl7 dmFsdWUuc3JjPWF0dHZhbDt9ZWxzZXtpZih2YWx1ZS50eXBlPT0idGV4dCJ8fHZh bHVlLnR5cGU9PSJodG1sInx8dmFsdWUudHlwZT09bnVsbCl7dmFsdWUudmFsdWU9 dGhpcy5nZXRGaXJzdENoaWxkVmFsdWUobm9kZSxhdG9tbnMsImNvbnRlbnQiLG51 bGwpO31lbHNlIGlmKHZhbHVlLnR5cGU9PSJ4aHRtbCJ8fHZhbHVlLnR5cGUubWF0 Y2goLyhcK3xcLyl4bWwkLykpe3ZhbHVlLnZhbHVlPXRoaXMuZ2V0Q2hpbGRFbChu b2Rlc1swXSk7fWVsc2V7dmFsdWUudmFsdWU9dGhpcy5nZXRGaXJzdENoaWxkVmFs dWUobm9kZSxhdG9tbnMsImNvbnRlbnQiLG51bGwpO30KYXRvbUF0dHJpYi5jb250 ZW50PXZhbHVlO319CnRoaXMucGFyc2VQZXJzb25Db25zdHJ1Y3RzKG5vZGUsImNv bnRyaWJ1dG9yIixhdG9tQXR0cmliKTthdG9tQXR0cmliLmlkPXRoaXMuZ2V0Rmly c3RDaGlsZFZhbHVlKG5vZGUsYXRvbW5zLCJpZCIsbnVsbCk7bm9kZXM9dGhpcy5n ZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5vZGUsYXRvbW5zLCJsaW5rIik7aWYobm9k ZXMubGVuZ3RoPjApe2F0b21BdHRyaWIubGlua3M9bmV3IEFycmF5KG5vZGVzLmxl bmd0aCk7fQp2YXIgb0F0dHM9WyJyZWwiLCJ0eXBlIiwiaHJlZmxhbmciLCJ0aXRs ZSIsImxlbmd0aCJdO2Zvcih2YXIgaT0wLGlpPW5vZGVzLmxlbmd0aDtpPGlpO2kr Kyl7dmFsdWU9e307dmFsdWUuaHJlZj1ub2Rlc1tpXS5nZXRBdHRyaWJ1dGUoImhy ZWYiKTtmb3IodmFyIGo9MCxqaj1vQXR0cy5sZW5ndGg7ajxqajtqKyspe2F0dHZh bD1ub2Rlc1tpXS5nZXRBdHRyaWJ1dGUob0F0dHNbal0pO2lmKGF0dHZhbCl7dmFs dWVbb0F0dHNbal1dPWF0dHZhbDt9fQphdG9tQXR0cmliLmxpbmtzW2ldPXZhbHVl O30KdmFsdWU9dGhpcy5nZXRGaXJzdENoaWxkVmFsdWUobm9kZSxhdG9tbnMsInB1 Ymxpc2hlZCIsbnVsbCk7aWYodmFsdWUpe2F0b21BdHRyaWIucHVibGlzaGVkPXZh bHVlO30KdmFsdWU9dGhpcy5nZXRGaXJzdENoaWxkVmFsdWUobm9kZSxhdG9tbnMs InJpZ2h0cyIsbnVsbCk7aWYodmFsdWUpe2F0b21BdHRyaWIucmlnaHRzPXZhbHVl O30KdmFsdWU9dGhpcy5nZXRGaXJzdENoaWxkVmFsdWUobm9kZSxhdG9tbnMsInN1 bW1hcnkiLG51bGwpO2lmKHZhbHVlKXthdG9tQXR0cmliLnN1bW1hcnk9dmFsdWU7 fQphdG9tQXR0cmliLnRpdGxlPXRoaXMuZ2V0Rmlyc3RDaGlsZFZhbHVlKG5vZGUs YXRvbW5zLCJ0aXRsZSIsbnVsbCk7YXRvbUF0dHJpYi51cGRhdGVkPXRoaXMuZ2V0 Rmlyc3RDaGlsZFZhbHVlKG5vZGUsYXRvbW5zLCJ1cGRhdGVkIixudWxsKTt2YXIg ZmVhdHVyZUF0dHJpYj17dGl0bGU6YXRvbUF0dHJpYi50aXRsZSxkZXNjcmlwdGlv bjphdG9tQXR0cmliLnN1bW1hcnksYXRvbTphdG9tQXR0cmlifTt2YXIgZ2VvbWV0 cnk9dGhpcy5wYXJzZUxvY2F0aW9ucyhub2RlKVswXTt2YXIgZmVhdHVyZT1uZXcg T3BlbkxheWVycy5GZWF0dXJlLlZlY3RvcihnZW9tZXRyeSxmZWF0dXJlQXR0cmli KTtmZWF0dXJlLmZpZD1hdG9tQXR0cmliLmlkO3JldHVybiBmZWF0dXJlO30scGFy c2VGZWF0dXJlczpmdW5jdGlvbihub2RlKXt2YXIgZmVhdHVyZXM9W107dmFyIGVu dHJpZXM9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5vZGUsdGhpcy5uYW1l c3BhY2VzLmF0b20sImVudHJ5Iik7aWYoZW50cmllcy5sZW5ndGg9PTApe2VudHJp ZXM9W25vZGVdO30KZm9yKHZhciBpPTAsaWk9ZW50cmllcy5sZW5ndGg7aTxpaTtp Kyspe2ZlYXR1cmVzLnB1c2godGhpcy5wYXJzZUZlYXR1cmUoZW50cmllc1tpXSkp O30KcmV0dXJuIGZlYXR1cmVzO30scGFyc2VMb2NhdGlvbnM6ZnVuY3Rpb24obm9k ZSl7dmFyIGdlb3Jzc25zPXRoaXMubmFtZXNwYWNlcy5nZW9yc3M7dmFyIGxvY2F0 aW9ucz17Y29tcG9uZW50czpbXX07dmFyIHdoZXJlPXRoaXMuZ2V0RWxlbWVudHNC eVRhZ05hbWVOUyhub2RlLGdlb3Jzc25zLCJ3aGVyZSIpO2lmKHdoZXJlJiZ3aGVy ZS5sZW5ndGg+MCl7aWYoIXRoaXMuZ21sUGFyc2VyKXt0aGlzLmluaXRHbWxQYXJz ZXIoKTt9CmZvcih2YXIgaT0wLGlpPXdoZXJlLmxlbmd0aDtpPGlpO2krKyl7dGhp cy5nbWxQYXJzZXIucmVhZENoaWxkTm9kZXMod2hlcmVbaV0sbG9jYXRpb25zKTt9 fQp2YXIgY29tcG9uZW50cz1sb2NhdGlvbnMuY29tcG9uZW50czt2YXIgcG9pbnQ9 dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5vZGUsZ2VvcnNzbnMsInBvaW50 Iik7aWYocG9pbnQmJnBvaW50Lmxlbmd0aD4wKXtmb3IodmFyIGk9MCxpaT1wb2lu dC5sZW5ndGg7aTxpaTtpKyspe3ZhciB4eT1PcGVuTGF5ZXJzLlN0cmluZy50cmlt KHBvaW50W2ldLmZpcnN0Q2hpbGQubm9kZVZhbHVlKS5zcGxpdCgvXHMrLyk7aWYo eHkubGVuZ3RoIT0yKXt4eT1PcGVuTGF5ZXJzLlN0cmluZy50cmltKHBvaW50W2ld LmZpcnN0Q2hpbGQubm9kZVZhbHVlKS5zcGxpdCgvXHMqLFxzKi8pO30KY29tcG9u ZW50cy5wdXNoKG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KHBhcnNlRmxv YXQoeHlbMV0pLHBhcnNlRmxvYXQoeHlbMF0pKSk7fX0KdmFyIGxpbmU9dGhpcy5n ZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5vZGUsZ2VvcnNzbnMsImxpbmUiKTtpZihs aW5lJiZsaW5lLmxlbmd0aD4wKXt2YXIgY29vcmRzO3ZhciBwO3ZhciBwb2ludHM7 Zm9yKHZhciBpPTAsaWk9bGluZS5sZW5ndGg7aTxpaTtpKyspe2Nvb3Jkcz1PcGVu TGF5ZXJzLlN0cmluZy50cmltKGxpbmVbaV0uZmlyc3RDaGlsZC5ub2RlVmFsdWUp LnNwbGl0KC9ccysvKTtwb2ludHM9W107Zm9yKHZhciBqPTAsamo9Y29vcmRzLmxl bmd0aDtqPGpqO2orPTIpe3A9bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQo cGFyc2VGbG9hdChjb29yZHNbaisxXSkscGFyc2VGbG9hdChjb29yZHNbal0pKTtw b2ludHMucHVzaChwKTt9CmNvbXBvbmVudHMucHVzaChuZXcgT3BlbkxheWVycy5H ZW9tZXRyeS5MaW5lU3RyaW5nKHBvaW50cykpO319CnZhciBwb2x5Z29uPXRoaXMu Z2V0RWxlbWVudHNCeVRhZ05hbWVOUyhub2RlLGdlb3Jzc25zLCJwb2x5Z29uIik7 aWYocG9seWdvbiYmcG9seWdvbi5sZW5ndGg+MCl7dmFyIGNvb3Jkczt2YXIgcDt2 YXIgcG9pbnRzO2Zvcih2YXIgaT0wLGlpPXBvbHlnb24ubGVuZ3RoO2k8aWk7aSsr KXtjb29yZHM9T3BlbkxheWVycy5TdHJpbmcudHJpbShwb2x5Z29uW2ldLmZpcnN0 Q2hpbGQubm9kZVZhbHVlKS5zcGxpdCgvXHMrLyk7cG9pbnRzPVtdO2Zvcih2YXIg aj0wLGpqPWNvb3Jkcy5sZW5ndGg7ajxqajtqKz0yKXtwPW5ldyBPcGVuTGF5ZXJz Lkdlb21ldHJ5LlBvaW50KHBhcnNlRmxvYXQoY29vcmRzW2orMV0pLHBhcnNlRmxv YXQoY29vcmRzW2pdKSk7cG9pbnRzLnB1c2gocCk7fQpjb21wb25lbnRzLnB1c2go bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9seWdvbihbbmV3IE9wZW5MYXllcnMu R2VvbWV0cnkuTGluZWFyUmluZyhjb21wb25lbnRzKV0pKTt9fQppZih0aGlzLmlu dGVybmFsUHJvamVjdGlvbiYmdGhpcy5leHRlcm5hbFByb2plY3Rpb24pe2Zvcih2 YXIgaT0wLGlpPWNvbXBvbmVudHMubGVuZ3RoO2k8aWk7aSsrKXtpZihjb21wb25l bnRzW2ldKXtjb21wb25lbnRzW2ldLnRyYW5zZm9ybSh0aGlzLmV4dGVybmFsUHJv amVjdGlvbix0aGlzLmludGVybmFsUHJvamVjdGlvbik7fX19CnJldHVybiBjb21w b25lbnRzO30scGFyc2VQZXJzb25Db25zdHJ1Y3RzOmZ1bmN0aW9uKG5vZGUsbmFt ZSxkYXRhKXt2YXIgcGVyc29ucz1bXTt2YXIgYXRvbW5zPXRoaXMubmFtZXNwYWNl cy5hdG9tO3ZhciBub2Rlcz10aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMobm9k ZSxhdG9tbnMsbmFtZSk7dmFyIG9BdHRzPVsidXJpIiwiZW1haWwiXTtmb3IodmFy IGk9MCxpaT1ub2Rlcy5sZW5ndGg7aTxpaTtpKyspe3ZhciB2YWx1ZT17fTt2YWx1 ZS5uYW1lPXRoaXMuZ2V0Rmlyc3RDaGlsZFZhbHVlKG5vZGVzW2ldLGF0b21ucywi bmFtZSIsbnVsbCk7Zm9yKHZhciBqPTAsamo9b0F0dHMubGVuZ3RoO2o8amo7aisr KXt2YXIgYXR0dmFsPXRoaXMuZ2V0Rmlyc3RDaGlsZFZhbHVlKG5vZGVzW2ldLGF0 b21ucyxvQXR0c1tqXSxudWxsKTtpZihhdHR2YWwpe3ZhbHVlW29BdHRzW2pdXT1h dHR2YWw7fX0KcGVyc29ucy5wdXNoKHZhbHVlKTt9CmlmKHBlcnNvbnMubGVuZ3Ro PjApe2RhdGFbbmFtZSsicyJdPXBlcnNvbnM7fX0sQ0xBU1NfTkFNRToiT3Blbkxh eWVycy5Gb3JtYXQuQXRvbSJ9KTtPcGVuTGF5ZXJzLkNvbnRyb2wuS2V5Ym9hcmRE ZWZhdWx0cz1PcGVuTGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuQ29udHJvbCx7YXV0 b0FjdGl2YXRlOnRydWUsc2xpZGVGYWN0b3I6NzUsZHJhdzpmdW5jdGlvbigpe3Ro aXMuaGFuZGxlcj1uZXcgT3BlbkxheWVycy5IYW5kbGVyLktleWJvYXJkKHRoaXMs eyJrZXlkb3duIjp0aGlzLmRlZmF1bHRLZXlQcmVzc30pO30sZGVmYXVsdEtleVBy ZXNzOmZ1bmN0aW9uKGV2dCl7c3dpdGNoKGV2dC5rZXlDb2RlKXtjYXNlIE9wZW5M YXllcnMuRXZlbnQuS0VZX0xFRlQ6dGhpcy5tYXAucGFuKC10aGlzLnNsaWRlRmFj dG9yLDApO2JyZWFrO2Nhc2UgT3BlbkxheWVycy5FdmVudC5LRVlfUklHSFQ6dGhp cy5tYXAucGFuKHRoaXMuc2xpZGVGYWN0b3IsMCk7YnJlYWs7Y2FzZSBPcGVuTGF5 ZXJzLkV2ZW50LktFWV9VUDp0aGlzLm1hcC5wYW4oMCwtdGhpcy5zbGlkZUZhY3Rv cik7YnJlYWs7Y2FzZSBPcGVuTGF5ZXJzLkV2ZW50LktFWV9ET1dOOnRoaXMubWFw LnBhbigwLHRoaXMuc2xpZGVGYWN0b3IpO2JyZWFrO2Nhc2UgMzM6dmFyIHNpemU9 dGhpcy5tYXAuZ2V0U2l6ZSgpO3RoaXMubWFwLnBhbigwLC0wLjc1KnNpemUuaCk7 YnJlYWs7Y2FzZSAzNDp2YXIgc2l6ZT10aGlzLm1hcC5nZXRTaXplKCk7dGhpcy5t YXAucGFuKDAsMC43NSpzaXplLmgpO2JyZWFrO2Nhc2UgMzU6dmFyIHNpemU9dGhp cy5tYXAuZ2V0U2l6ZSgpO3RoaXMubWFwLnBhbigwLjc1KnNpemUudywwKTticmVh aztjYXNlIDM2OnZhciBzaXplPXRoaXMubWFwLmdldFNpemUoKTt0aGlzLm1hcC5w YW4oLTAuNzUqc2l6ZS53LDApO2JyZWFrO2Nhc2UgNDM6Y2FzZSA2MTpjYXNlIDE4 NzpjYXNlIDEwNzp0aGlzLm1hcC56b29tSW4oKTticmVhaztjYXNlIDQ1OmNhc2Ug MTA5OmNhc2UgMTg5OmNhc2UgOTU6dGhpcy5tYXAuem9vbU91dCgpO2JyZWFrO319 LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuQ29udHJvbC5LZXlib2FyZERlZmF1bHRz In0pO09wZW5MYXllcnMuRm9ybWF0LldNQy52MV8wXzA9T3BlbkxheWVycy5DbGFz cyhPcGVuTGF5ZXJzLkZvcm1hdC5XTUMudjEse1ZFUlNJT046IjEuMC4wIixzY2hl bWFMb2NhdGlvbjoiaHR0cDovL3d3dy5vcGVuZ2lzLm5ldC9jb250ZXh0IGh0dHA6 Ly9zY2hlbWFzLm9wZW5naXMubmV0L2NvbnRleHQvMS4wLjAvY29udGV4dC54c2Qi LGluaXRpYWxpemU6ZnVuY3Rpb24ob3B0aW9ucyl7T3BlbkxheWVycy5Gb3JtYXQu V01DLnYxLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsW29wdGlvbnNd KTt9LHJlYWRfd21jX1NSUzpmdW5jdGlvbihsYXllckNvbnRleHQsbm9kZSl7dmFy IHNycz10aGlzLmdldENoaWxkVmFsdWUobm9kZSk7aWYodHlwZW9mIGxheWVyQ29u dGV4dC5wcm9qZWN0aW9ucyE9Im9iamVjdCIpe2xheWVyQ29udGV4dC5wcm9qZWN0 aW9ucz17fTt9CnZhciB2YWx1ZXM9c3JzLnNwbGl0KC8gKy8pO2Zvcih2YXIgaT0w LGxlbj12YWx1ZXMubGVuZ3RoO2k8bGVuO2krKyl7bGF5ZXJDb250ZXh0LnByb2pl Y3Rpb25zW3ZhbHVlc1tpXV09dHJ1ZTt9fSx3cml0ZV93bWNfTGF5ZXI6ZnVuY3Rp b24oY29udGV4dCl7dmFyIG5vZGU9T3BlbkxheWVycy5Gb3JtYXQuV01DLnYxLnBy b3RvdHlwZS53cml0ZV93bWNfTGF5ZXIuYXBwbHkodGhpcyxbY29udGV4dF0pO2lm KGNvbnRleHQuc3JzKXt2YXIgcHJvamVjdGlvbnM9W107Zm9yKHZhciBuYW1lIGlu IGNvbnRleHQuc3JzKXtwcm9qZWN0aW9ucy5wdXNoKG5hbWUpO30Kbm9kZS5hcHBl bmRDaGlsZCh0aGlzLmNyZWF0ZUVsZW1lbnREZWZhdWx0TlMoIlNSUyIscHJvamVj dGlvbnMuam9pbigiICIpKSk7fQpub2RlLmFwcGVuZENoaWxkKHRoaXMud3JpdGVf d21jX0Zvcm1hdExpc3QoY29udGV4dCkpO25vZGUuYXBwZW5kQ2hpbGQodGhpcy53 cml0ZV93bWNfU3R5bGVMaXN0KGNvbnRleHQpKTtpZihjb250ZXh0LmRpbWVuc2lv bnMpe25vZGUuYXBwZW5kQ2hpbGQodGhpcy53cml0ZV93bWNfRGltZW5zaW9uTGlz dChjb250ZXh0KSk7fQpub2RlLmFwcGVuZENoaWxkKHRoaXMud3JpdGVfd21jX0xh eWVyRXh0ZW5zaW9uKGNvbnRleHQpKTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMu Rm9ybWF0LldNQy52MV8wXzAifSk7T3BlbkxheWVycy5GZWF0dXJlLldGUz1PcGVu TGF5ZXJzLkNsYXNzKE9wZW5MYXllcnMuRmVhdHVyZSx7aW5pdGlhbGl6ZTpmdW5j dGlvbihsYXllcix4bWxOb2RlKXt2YXIgbmV3QXJndW1lbnRzPWFyZ3VtZW50czt2 YXIgZGF0YT10aGlzLnByb2Nlc3NYTUxOb2RlKHhtbE5vZGUpO25ld0FyZ3VtZW50 cz1uZXcgQXJyYXkobGF5ZXIsZGF0YS5sb25sYXQsZGF0YSk7T3BlbkxheWVycy5G ZWF0dXJlLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMsbmV3QXJndW1l bnRzKTt0aGlzLmNyZWF0ZU1hcmtlcigpO3RoaXMubGF5ZXIuYWRkTWFya2VyKHRo aXMubWFya2VyKTt9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtpZih0aGlzLm1hcmtlciE9 bnVsbCl7dGhpcy5sYXllci5yZW1vdmVNYXJrZXIodGhpcy5tYXJrZXIpO30KT3Bl bkxheWVycy5GZWF0dXJlLnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsYXJn dW1lbnRzKTt9LHByb2Nlc3NYTUxOb2RlOmZ1bmN0aW9uKHhtbE5vZGUpe3ZhciBw b2ludD1PcGVuTGF5ZXJzLkFqYXguZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyh4bWxO b2RlLCJodHRwOi8vd3d3Lm9wZW5naXMubmV0L2dtbCIsImdtbCIsIlBvaW50Iik7 dmFyIHRleHQ9T3BlbkxheWVycy5VdGlsLmdldFhtbE5vZGVWYWx1ZShPcGVuTGF5 ZXJzLkFqYXguZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhwb2ludFswXSwiaHR0cDov L3d3dy5vcGVuZ2lzLm5ldC9nbWwiLCJnbWwiLCJjb29yZGluYXRlcyIpWzBdKTt2 YXIgZmxvYXRzPXRleHQuc3BsaXQoIiwiKTtyZXR1cm57bG9ubGF0Om5ldyBPcGVu TGF5ZXJzLkxvbkxhdChwYXJzZUZsb2F0KGZsb2F0c1swXSkscGFyc2VGbG9hdChm bG9hdHNbMV0pKSxpZDpudWxsfTt9LENMQVNTX05BTUU6Ik9wZW5MYXllcnMuRmVh dHVyZS5XRlMifSk7T3BlbkxheWVycy5Gb3JtYXQuV01UU0NhcGFiaWxpdGllcy52 MV8wXzA9T3BlbkxheWVycy5DbGFzcyhPcGVuTGF5ZXJzLkZvcm1hdC5PV1NDb21t b24udjFfMV8wLHt2ZXJzaW9uOiIxLjAuMCIsbmFtZXNwYWNlczp7b3dzOiJodHRw Oi8vd3d3Lm9wZW5naXMubmV0L293cy8xLjEiLHdtdHM6Imh0dHA6Ly93d3cub3Bl bmdpcy5uZXQvd210cy8xLjAiLHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5 L3hsaW5rIn0seXg6bnVsbCxkZWZhdWx0UHJlZml4OiJ3bXRzIixpbml0aWFsaXpl OmZ1bmN0aW9uKG9wdGlvbnMpe09wZW5MYXllcnMuRm9ybWF0LlhNTC5wcm90b3R5 cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLFtvcHRpb25zXSk7dGhpcy5vcHRpb25z PW9wdGlvbnM7dmFyIHl4PU9wZW5MYXllcnMuVXRpbC5leHRlbmQoe30sT3Blbkxh eWVycy5Gb3JtYXQuV01UU0NhcGFiaWxpdGllcy5wcm90b3R5cGUueXgpO3RoaXMu eXg9T3BlbkxheWVycy5VdGlsLmV4dGVuZCh5eCx0aGlzLnl4KTt9LHJlYWQ6ZnVu Y3Rpb24oZGF0YSl7aWYodHlwZW9mIGRhdGE9PSJzdHJpbmciKXtkYXRhPU9wZW5M YXllcnMuRm9ybWF0LlhNTC5wcm90b3R5cGUucmVhZC5hcHBseSh0aGlzLFtkYXRh XSk7fQppZihkYXRhJiZkYXRhLm5vZGVUeXBlPT05KXtkYXRhPWRhdGEuZG9jdW1l bnRFbGVtZW50O30KdmFyIGNhcGFiaWxpdGllcz17fTt0aGlzLnJlYWROb2RlKGRh dGEsY2FwYWJpbGl0aWVzKTtjYXBhYmlsaXRpZXMudmVyc2lvbj10aGlzLnZlcnNp b247cmV0dXJuIGNhcGFiaWxpdGllczt9LHJlYWRlcnM6eyJ3bXRzIjp7IkNhcGFi aWxpdGllcyI6ZnVuY3Rpb24obm9kZSxvYmope3RoaXMucmVhZENoaWxkTm9kZXMo bm9kZSxvYmopO30sIkNvbnRlbnRzIjpmdW5jdGlvbihub2RlLG9iail7b2JqLmNv bnRlbnRzPXt9O29iai5jb250ZW50cy5sYXllcnM9W107b2JqLmNvbnRlbnRzLnRp bGVNYXRyaXhTZXRzPXt9O3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxvYmouY29u dGVudHMpO30sIkxheWVyIjpmdW5jdGlvbihub2RlLG9iail7dmFyIGxheWVyPXtz dHlsZXM6W10sZm9ybWF0czpbXSx0aWxlTWF0cml4U2V0TGlua3M6W119O2xheWVy LmxheWVycz1bXTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsbGF5ZXIpO29iai5s YXllcnMucHVzaChsYXllcik7fSwiU3R5bGUiOmZ1bmN0aW9uKG5vZGUsb2JqKXt2 YXIgc3R5bGU9e307c3R5bGUuaXNEZWZhdWx0PShub2RlLmdldEF0dHJpYnV0ZSgi aXNEZWZhdWx0Iik9PT0idHJ1ZSIpO3RoaXMucmVhZENoaWxkTm9kZXMobm9kZSxz dHlsZSk7b2JqLnN0eWxlcy5wdXNoKHN0eWxlKTt9LCJGb3JtYXQiOmZ1bmN0aW9u KG5vZGUsb2JqKXtvYmouZm9ybWF0cy5wdXNoKHRoaXMuZ2V0Q2hpbGRWYWx1ZShu b2RlKSk7fSwiVGlsZU1hdHJpeFNldExpbmsiOmZ1bmN0aW9uKG5vZGUsb2JqKXt2 YXIgdGlsZU1hdHJpeFNldExpbms9e307dGhpcy5yZWFkQ2hpbGROb2Rlcyhub2Rl LHRpbGVNYXRyaXhTZXRMaW5rKTtvYmoudGlsZU1hdHJpeFNldExpbmtzLnB1c2go dGlsZU1hdHJpeFNldExpbmspO30sIlRpbGVNYXRyaXhTZXQiOmZ1bmN0aW9uKG5v ZGUsb2JqKXtpZihvYmoubGF5ZXJzKXt2YXIgdGlsZU1hdHJpeFNldD17bWF0cml4 SWRzOltdfTt0aGlzLnJlYWRDaGlsZE5vZGVzKG5vZGUsdGlsZU1hdHJpeFNldCk7 b2JqLnRpbGVNYXRyaXhTZXRzW3RpbGVNYXRyaXhTZXQuaWRlbnRpZmllcl09dGls ZU1hdHJpeFNldDt9ZWxzZXtvYmoudGlsZU1hdHJpeFNldD10aGlzLmdldENoaWxk VmFsdWUobm9kZSk7fX0sIlRpbGVNYXRyaXgiOmZ1bmN0aW9uKG5vZGUsb2JqKXt2 YXIgdGlsZU1hdHJpeD17c3VwcG9ydGVkQ1JTOm9iai5zdXBwb3J0ZWRDUlN9O3Ro aXMucmVhZENoaWxkTm9kZXMobm9kZSx0aWxlTWF0cml4KTtvYmoubWF0cml4SWRz LnB1c2godGlsZU1hdHJpeCk7fSwiU2NhbGVEZW5vbWluYXRvciI6ZnVuY3Rpb24o bm9kZSxvYmope29iai5zY2FsZURlbm9taW5hdG9yPXBhcnNlRmxvYXQodGhpcy5n ZXRDaGlsZFZhbHVlKG5vZGUpKTt9LCJUb3BMZWZ0Q29ybmVyIjpmdW5jdGlvbihu b2RlLG9iail7dmFyIHRvcExlZnRDb3JuZXI9dGhpcy5nZXRDaGlsZFZhbHVlKG5v ZGUpO3ZhciBjb29yZHM9dG9wTGVmdENvcm5lci5zcGxpdCgiICIpO3ZhciB5eDtp ZihvYmouc3VwcG9ydGVkQ1JTKXt2YXIgY3JzPW9iai5zdXBwb3J0ZWRDUlMucmVw bGFjZSgvdXJuOm9nYzpkZWY6Y3JzOihcdyspOi4rOihcdyspJC8sInVybjpvZ2M6 ZGVmOmNyczokMTo6JDIiKTt5eD0hIXRoaXMueXhbY3JzXTt9CmlmKHl4KXtvYmou dG9wTGVmdENvcm5lcj1uZXcgT3BlbkxheWVycy5Mb25MYXQoY29vcmRzWzFdLGNv b3Jkc1swXSk7fWVsc2V7b2JqLnRvcExlZnRDb3JuZXI9bmV3IE9wZW5MYXllcnMu TG9uTGF0KGNvb3Jkc1swXSxjb29yZHNbMV0pO319LCJUaWxlV2lkdGgiOmZ1bmN0 aW9uKG5vZGUsb2JqKXtvYmoudGlsZVdpZHRoPXBhcnNlSW50KHRoaXMuZ2V0Q2hp bGRWYWx1ZShub2RlKSk7fSwiVGlsZUhlaWdodCI6ZnVuY3Rpb24obm9kZSxvYmop e29iai50aWxlSGVpZ2h0PXBhcnNlSW50KHRoaXMuZ2V0Q2hpbGRWYWx1ZShub2Rl KSk7fSwiTWF0cml4V2lkdGgiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmoubWF0cml4 V2lkdGg9cGFyc2VJbnQodGhpcy5nZXRDaGlsZFZhbHVlKG5vZGUpKTt9LCJNYXRy aXhIZWlnaHQiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmoubWF0cml4SGVpZ2h0PXBh cnNlSW50KHRoaXMuZ2V0Q2hpbGRWYWx1ZShub2RlKSk7fSwiUmVzb3VyY2VVUkwi OmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmoucmVzb3VyY2VVcmw9b2JqLnJlc291cmNl VXJsfHx7fTtvYmoucmVzb3VyY2VVcmxbbm9kZS5nZXRBdHRyaWJ1dGUoInJlc291 cmNlVHlwZSIpXT17Zm9ybWF0Om5vZGUuZ2V0QXR0cmlidXRlKCJmb3JtYXQiKSx0 ZW1wbGF0ZTpub2RlLmdldEF0dHJpYnV0ZSgidGVtcGxhdGUiKX07fSwiV1NETCI6 ZnVuY3Rpb24obm9kZSxvYmope29iai53c2RsPXt9O29iai53c2RsLmhyZWY9bm9k ZS5nZXRBdHRyaWJ1dGUoInhsaW5rOmhyZWYiKTt9LCJTZXJ2aWNlTWV0YWRhdGFV UkwiOmZ1bmN0aW9uKG5vZGUsb2JqKXtvYmouc2VydmljZU1ldGFkYXRhVXJsPXt9 O29iai5zZXJ2aWNlTWV0YWRhdGFVcmwuaHJlZj1ub2RlLmdldEF0dHJpYnV0ZSgi eGxpbms6aHJlZiIpO319LCJvd3MiOk9wZW5MYXllcnMuRm9ybWF0Lk9XU0NvbW1v bi52MV8xXzAucHJvdG90eXBlLnJlYWRlcnNbIm93cyJdfSxDTEFTU19OQU1FOiJP cGVuTGF5ZXJzLkZvcm1hdC5XTVRTQ2FwYWJpbGl0aWVzLnYxXzBfMCJ9KTs= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=GeoExt.js Content-Type: application/javascript; charset=utf-8; name=GeoExt.js Content-Location: http://www.icc.cat/vissir3/lib/geoext/script/GeoExt.js Content-Transfer-Encoding: Base64 LyoKCkNvcHlyaWdodCAoYykgMjAwOC0yMDEwLCBUaGUgT3BlbiBTb3VyY2UgR2Vv c3BhdGlhbCBGb3VuZGF0aW9uCkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpSZWRpc3Ry aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo IG9yIHdpdGhvdXQKbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CgogICAgKiBS ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi b3ZlIGNvcHlyaWdodCBub3RpY2UsCiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRp b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAqIFJlZGlzdHJp YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg Y29weXJpZ2h0CiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICAgICAgZG9jdW1l bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl IGRpc3RyaWJ1dGlvbi4KICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgT3Bl biBTb3VyY2UgR2Vvc3BhdGlhbCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMKICAg ICAgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAogICAgICBmcm9tIHRoaXMgc29mdHdh cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpU SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS UyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKQU5EIEFOWSBFWFBSRVNTIE9SIElN UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s IFRIRQpJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQpBUkUgRElTQ0xBSU1FRC4g SU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklC VVRPUlMgQkUKTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgpDT05TRVFVRU5USUFMIERBTUFH RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP RgpTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKSU5URVJSVVBUSU9OKSBIT1dFVkVS IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg SU4KQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKQVJJU0lORyBJTiBBTlkgV0FZIE9V VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP RiBUSEUKUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgoqLwoKRXh0Lm5hbWVz cGFjZSgnR2VvRXh0Jyk7R2VvRXh0LkxheWVyTGVnZW5kPUV4dC5leHRlbmQoRXh0 LkNvbnRhaW5lcix7bGF5ZXJSZWNvcmQ6bnVsbCxzaG93VGl0bGU6dHJ1ZSxsZWdl bmRUaXRsZTpudWxsLGxhYmVsQ2xzOm51bGwsbGF5ZXJTdG9yZTpudWxsLGluaXRD b21wb25lbnQ6ZnVuY3Rpb24oKXtHZW9FeHQuTGF5ZXJMZWdlbmQuc3VwZXJjbGFz cy5pbml0Q29tcG9uZW50LmNhbGwodGhpcyk7dGhpcy5hdXRvRWw9e307dGhpcy5h ZGQoe3h0eXBlOiJsYWJlbCIsdGV4dDp0aGlzLmdldExheWVyVGl0bGUodGhpcy5s YXllclJlY29yZCksY2xzOid4LWZvcm0taXRlbSB4LWZvcm0taXRlbS1sYWJlbCcr Cih0aGlzLmxhYmVsQ2xzPycgJyt0aGlzLmxhYmVsQ2xzOicnKX0pO2lmKHRoaXMu bGF5ZXJSZWNvcmQmJnRoaXMubGF5ZXJSZWNvcmQuc3RvcmUpe3RoaXMubGF5ZXJT dG9yZT10aGlzLmxheWVyUmVjb3JkLnN0b3JlO3RoaXMubGF5ZXJTdG9yZS5vbigi dXBkYXRlIix0aGlzLm9uU3RvcmVVcGRhdGUsdGhpcyk7fX0sb25TdG9yZVVwZGF0 ZTpmdW5jdGlvbihzdG9yZSxyZWNvcmQsb3BlcmF0aW9uKXtpZihyZWNvcmQ9PT10 aGlzLmxheWVyUmVjb3JkJiZ0aGlzLml0ZW1zLmdldENvdW50KCk+MCl7dmFyIGxh eWVyPXJlY29yZC5nZXRMYXllcigpO3RoaXMuc2V0VmlzaWJsZShsYXllci5nZXRW aXNpYmlsaXR5KCkmJmxheWVyLmNhbGN1bGF0ZUluUmFuZ2UoKSYmbGF5ZXIuZGlz cGxheUluTGF5ZXJTd2l0Y2hlciYmIXJlY29yZC5nZXQoJ2hpZGVJbkxlZ2VuZCcp KTt0aGlzLnVwZGF0ZSgpO319LHVwZGF0ZTpmdW5jdGlvbigpe3ZhciB0aXRsZT10 aGlzLmdldExheWVyVGl0bGUodGhpcy5sYXllclJlY29yZCk7aWYodGhpcy5pdGVt cy5nZXQoMCkudGV4dCE9PXRpdGxlKXt0aGlzLml0ZW1zLmdldCgwKS5zZXRUZXh0 KHRpdGxlKTt9fSxnZXRMYXllclRpdGxlOmZ1bmN0aW9uKHJlY29yZCl7dmFyIHRp dGxlPXRoaXMubGVnZW5kVGl0bGV8fCIiO2lmKHRoaXMuc2hvd1RpdGxlJiYhdGl0 bGUpe2lmKHJlY29yZCYmIXJlY29yZC5nZXQoImhpZGVUaXRsZSIpKXt0aXRsZT1y ZWNvcmQuZ2V0KCJ0aXRsZSIpfHxyZWNvcmQuZ2V0KCJuYW1lIil8fHJlY29yZC5n ZXRMYXllcigpLm5hbWV8fCIiO319CnJldHVybiB0aXRsZTt9LGJlZm9yZURlc3Ry b3k6ZnVuY3Rpb24oKXt0aGlzLmxheWVyU3RvcmUmJnRoaXMubGF5ZXJTdG9yZS51 bigidXBkYXRlIix0aGlzLm9uU3RvcmVVcGRhdGUsdGhpcyk7R2VvRXh0LkxheWVy TGVnZW5kLnN1cGVyY2xhc3MuYmVmb3JlRGVzdHJveS5hcHBseSh0aGlzLGFyZ3Vt ZW50cyk7fX0pO0dlb0V4dC5MYXllckxlZ2VuZC5nZXRUeXBlcz1mdW5jdGlvbihs YXllclJlY29yZCxwcmVmZXJyZWRUeXBlcyl7dmFyIHR5cGVzPShwcmVmZXJyZWRU eXBlc3x8W10pLmNvbmNhdCgpO3ZhciBnb29kVHlwZXM9W107Zm9yKHZhciB0eXBl IGluIEdlb0V4dC5MYXllckxlZ2VuZC50eXBlcyl7aWYoR2VvRXh0LkxheWVyTGVn ZW5kLnR5cGVzW3R5cGVdLnN1cHBvcnRzKGxheWVyUmVjb3JkKSl7dHlwZXMuaW5k ZXhPZih0eXBlKT09LTEmJmdvb2RUeXBlcy5wdXNoKHR5cGUpO31lbHNle3R5cGVz LnJlbW92ZSh0eXBlKTt9fQpyZXR1cm4gdHlwZXMuY29uY2F0KGdvb2RUeXBlcyk7 fTtHZW9FeHQuTGF5ZXJMZWdlbmQuc3VwcG9ydHM9ZnVuY3Rpb24obGF5ZXJSZWNv cmQpe307R2VvRXh0LkxheWVyTGVnZW5kLnR5cGVzPXt9O0V4dC5uYW1lc3BhY2Uo J0dlb0V4dCcpO0dlb0V4dC5WZWN0b3JMZWdlbmQ9RXh0LmV4dGVuZChHZW9FeHQu TGF5ZXJMZWdlbmQse2xheWVyUmVjb3JkOm51bGwsbGF5ZXI6bnVsbCxydWxlczpu dWxsLHN5bWJvbFR5cGU6bnVsbCx1bnRpdGxlZFByZWZpeDoiVW50aXRsZWQgIixj bGlja2FibGVTeW1ib2w6ZmFsc2UsY2xpY2thYmxlVGl0bGU6ZmFsc2Usc2VsZWN0 T25DbGljazpmYWxzZSxlbmFibGVERDpmYWxzZSxib2R5Qm9yZGVyOmZhbHNlLGZl YXR1cmU6bnVsbCxzZWxlY3RlZFJ1bGU6bnVsbCxjdXJyZW50U2NhbGVEZW5vbWlu YXRvcjpudWxsLGluaXRDb21wb25lbnQ6ZnVuY3Rpb24oKXtHZW9FeHQuVmVjdG9y TGVnZW5kLnN1cGVyY2xhc3MuaW5pdENvbXBvbmVudC5jYWxsKHRoaXMpO2lmKHRo aXMubGF5ZXJSZWNvcmQpe3RoaXMubGF5ZXI9dGhpcy5sYXllclJlY29yZC5nZXRM YXllcigpO2lmKHRoaXMubGF5ZXIubWFwKXt0aGlzLmN1cnJlbnRTY2FsZURlbm9t aW5hdG9yPXRoaXMubGF5ZXIubWFwLmdldFNjYWxlKCk7dGhpcy5sYXllci5tYXAu ZXZlbnRzLm9uKHsiem9vbWVuZCI6dGhpcy5vbk1hcFpvb20sc2NvcGU6dGhpc30p O319CmlmKCF0aGlzLnN5bWJvbFR5cGUpe2lmKHRoaXMuZmVhdHVyZSl7dGhpcy5z eW1ib2xUeXBlPXRoaXMuc3ltYm9sVHlwZUZyb21GZWF0dXJlKHRoaXMuZmVhdHVy ZSk7fWVsc2UgaWYodGhpcy5sYXllcil7aWYodGhpcy5sYXllci5mZWF0dXJlcy5s ZW5ndGg+MCl7dmFyIGZlYXR1cmU9dGhpcy5sYXllci5mZWF0dXJlc1swXS5jbG9u ZSgpO2ZlYXR1cmUuYXR0cmlidXRlcz17fTt0aGlzLmZlYXR1cmU9ZmVhdHVyZTt0 aGlzLnN5bWJvbFR5cGU9dGhpcy5zeW1ib2xUeXBlRnJvbUZlYXR1cmUodGhpcy5m ZWF0dXJlKTt9ZWxzZXt0aGlzLmxheWVyLmV2ZW50cy5vbih7ZmVhdHVyZXNhZGRl ZDp0aGlzLm9uRmVhdHVyZXNBZGRlZCxzY29wZTp0aGlzfSk7fX19CmlmKHRoaXMu bGF5ZXImJnRoaXMuZmVhdHVyZSYmIXRoaXMucnVsZXMpe3RoaXMuc2V0UnVsZXMo KTt9CnRoaXMucnVsZXNDb250YWluZXI9bmV3IEV4dC5Db250YWluZXIoe2F1dG9F bDp7fX0pO3RoaXMuYWRkKHRoaXMucnVsZXNDb250YWluZXIpO3RoaXMuYWRkRXZl bnRzKCJ0aXRsZWNsaWNrIiwic3ltYm9sY2xpY2siLCJydWxlY2xpY2siLCJydWxl c2VsZWN0ZWQiLCJydWxldW5zZWxlY3RlZCIsInJ1bGVtb3ZlZCIpO3RoaXMudXBk YXRlKCk7fSxvbk1hcFpvb206ZnVuY3Rpb24oKXt0aGlzLnNldEN1cnJlbnRTY2Fs ZURlbm9taW5hdG9yKHRoaXMubGF5ZXIubWFwLmdldFNjYWxlKCkpO30sc3ltYm9s VHlwZUZyb21GZWF0dXJlOmZ1bmN0aW9uKGZlYXR1cmUpe3ZhciBtYXRjaD1mZWF0 dXJlLmdlb21ldHJ5LkNMQVNTX05BTUUubWF0Y2goL1BvaW50fExpbmV8UG9seWdv bi8pO3JldHVybihtYXRjaCYmbWF0Y2hbMF0pfHwiUG9pbnQiO30sb25GZWF0dXJl c0FkZGVkOmZ1bmN0aW9uKCl7dGhpcy5sYXllci5ldmVudHMudW4oe2ZlYXR1cmVz YWRkZWQ6dGhpcy5vbkZlYXR1cmVzQWRkZWQsc2NvcGU6dGhpc30pO3ZhciBmZWF0 dXJlPXRoaXMubGF5ZXIuZmVhdHVyZXNbMF0uY2xvbmUoKTtmZWF0dXJlLmF0dHJp YnV0ZXM9e307dGhpcy5mZWF0dXJlPWZlYXR1cmU7dGhpcy5zeW1ib2xUeXBlPXRo aXMuc3ltYm9sVHlwZUZyb21GZWF0dXJlKHRoaXMuZmVhdHVyZSk7aWYoIXRoaXMu cnVsZXMpe3RoaXMuc2V0UnVsZXMoKTt9CnRoaXMudXBkYXRlKCk7fSxzZXRSdWxl czpmdW5jdGlvbigpe3ZhciBzdHlsZT10aGlzLmxheWVyLnN0eWxlTWFwJiZ0aGlz LmxheWVyLnN0eWxlTWFwLnN0eWxlc1siZGVmYXVsdCJdO2lmKCFzdHlsZSl7c3R5 bGU9bmV3IE9wZW5MYXllcnMuU3R5bGUoKTt9CmlmKHN0eWxlLnJ1bGVzLmxlbmd0 aD09PTApe3RoaXMucnVsZXM9W25ldyBPcGVuTGF5ZXJzLlJ1bGUoe3N5bWJvbGl6 ZXI6c3R5bGUuY3JlYXRlU3ltYm9saXplcih0aGlzLmZlYXR1cmUpfSldO31lbHNl e3RoaXMucnVsZXM9c3R5bGUucnVsZXM7fX0sc2V0Q3VycmVudFNjYWxlRGVub21p bmF0b3I6ZnVuY3Rpb24oc2NhbGUpe2lmKHNjYWxlIT09dGhpcy5jdXJyZW50U2Nh bGVEZW5vbWluYXRvcil7dGhpcy5jdXJyZW50U2NhbGVEZW5vbWluYXRvcj1zY2Fs ZTt0aGlzLnVwZGF0ZSgpO319LGdldFJ1bGVFbnRyeTpmdW5jdGlvbihydWxlKXty ZXR1cm4gdGhpcy5ydWxlc0NvbnRhaW5lci5pdGVtcy5nZXQodGhpcy5ydWxlcy5p bmRleE9mKHJ1bGUpKTt9LGFkZFJ1bGVFbnRyeTpmdW5jdGlvbihydWxlLG5vRG9M YXlvdXQpe3RoaXMucnVsZXNDb250YWluZXIuYWRkKHRoaXMuY3JlYXRlUnVsZUVu dHJ5KHJ1bGUpKTtpZighbm9Eb0xheW91dCl7dGhpcy5kb0xheW91dCgpO319LHJl bW92ZVJ1bGVFbnRyeTpmdW5jdGlvbihydWxlLG5vRG9MYXlvdXQpe3ZhciBydWxl RW50cnk9dGhpcy5nZXRSdWxlRW50cnkocnVsZSk7aWYocnVsZUVudHJ5KXt0aGlz LnJ1bGVzQ29udGFpbmVyLnJlbW92ZShydWxlRW50cnkpO2lmKCFub0RvTGF5b3V0 KXt0aGlzLmRvTGF5b3V0KCk7fX19LHNlbGVjdFJ1bGVFbnRyeTpmdW5jdGlvbihy dWxlKXt2YXIgbmV3U2VsZWN0aW9uPXJ1bGUhPXRoaXMuc2VsZWN0ZWRSdWxlO2lm KHRoaXMuc2VsZWN0ZWRSdWxlKXt0aGlzLnVuc2VsZWN0KCk7fQppZihuZXdTZWxl Y3Rpb24pe3ZhciBydWxlRW50cnk9dGhpcy5nZXRSdWxlRW50cnkocnVsZSk7cnVs ZUVudHJ5LmJvZHkuYWRkQ2xhc3MoIngtZ3JpZDMtcm93LXNlbGVjdGVkIik7dGhp cy5zZWxlY3RlZFJ1bGU9cnVsZTt0aGlzLmZpcmVFdmVudCgicnVsZXNlbGVjdGVk Iix0aGlzLHJ1bGUpO319LHVuc2VsZWN0OmZ1bmN0aW9uKCl7dGhpcy5ydWxlc0Nv bnRhaW5lci5pdGVtcy5lYWNoKGZ1bmN0aW9uKGl0ZW0saSl7aWYodGhpcy5ydWxl c1tpXT09dGhpcy5zZWxlY3RlZFJ1bGUpe2l0ZW0uYm9keS5yZW1vdmVDbGFzcygi eC1ncmlkMy1yb3ctc2VsZWN0ZWQiKTt0aGlzLnNlbGVjdGVkUnVsZT1udWxsO3Ro aXMuZmlyZUV2ZW50KCJydWxldW5zZWxlY3RlZCIsdGhpcyx0aGlzLnJ1bGVzW2ld KTt9fSx0aGlzKTt9LGNyZWF0ZVJ1bGVFbnRyeTpmdW5jdGlvbihydWxlKXt2YXIg YXBwbGllcz10cnVlO2lmKHRoaXMuY3VycmVudFNjYWxlRGVub21pbmF0b3IhPW51 bGwpe2lmKHJ1bGUubWluU2NhbGVEZW5vbWluYXRvcil7YXBwbGllcz1hcHBsaWVz JiYodGhpcy5jdXJyZW50U2NhbGVEZW5vbWluYXRvcj49cnVsZS5taW5TY2FsZURl bm9taW5hdG9yKTt9CmlmKHJ1bGUubWF4U2NhbGVEZW5vbWluYXRvcil7YXBwbGll cz1hcHBsaWVzJiYodGhpcy5jdXJyZW50U2NhbGVEZW5vbWluYXRvcjxydWxlLm1h eFNjYWxlRGVub21pbmF0b3IpO319CnJldHVybnt4dHlwZToicGFuZWwiLGxheW91 dDoiY29sdW1uIixib3JkZXI6ZmFsc2UsaGlkZGVuOiFhcHBsaWVzLGJvZHlTdHls ZTp0aGlzLnNlbGVjdE9uQ2xpY2s/e2N1cnNvcjoicG9pbnRlciJ9OnVuZGVmaW5l ZCxkZWZhdWx0czp7Ym9yZGVyOmZhbHNlfSxpdGVtczpbdGhpcy5jcmVhdGVSdWxl UmVuZGVyZXIocnVsZSksdGhpcy5jcmVhdGVSdWxlVGl0bGUocnVsZSldLGxpc3Rl bmVyczp7cmVuZGVyOmZ1bmN0aW9uKGNvbXApe3RoaXMuc2VsZWN0T25DbGljayYm Y29tcC5nZXRFbCgpLm9uKHtjbGljazpmdW5jdGlvbihjb21wKXt0aGlzLnNlbGVj dFJ1bGVFbnRyeShydWxlKTt9LHNjb3BlOnRoaXN9KTtpZih0aGlzLmVuYWJsZURE PT10cnVlKXt0aGlzLmFkZEREKGNvbXApO319LHNjb3BlOnRoaXN9fTt9LGNyZWF0 ZVJ1bGVSZW5kZXJlcjpmdW5jdGlvbihydWxlKXt2YXIgdHlwZXM9W3RoaXMuc3lt Ym9sVHlwZSwiUG9pbnQiLCJMaW5lIiwiUG9seWdvbiJdO3ZhciB0eXBlLGhhdmVU eXBlO3ZhciBzeW1ib2xpemVycz1ydWxlLnN5bWJvbGl6ZXJzO2lmKCFzeW1ib2xp emVycyl7dmFyIHN5bWJvbGl6ZXI9cnVsZS5zeW1ib2xpemVyO2Zvcih2YXIgaT0w LGxlbj10eXBlcy5sZW5ndGg7aTxsZW47KytpKXt0eXBlPXR5cGVzW2ldO2lmKHN5 bWJvbGl6ZXJbdHlwZV0pe3N5bWJvbGl6ZXI9c3ltYm9saXplclt0eXBlXTtoYXZl VHlwZT10cnVlO2JyZWFrO319CnN5bWJvbGl6ZXJzPVtzeW1ib2xpemVyXTt9ZWxz ZXt2YXIgVHlwZTtvdXRlcjpmb3IodmFyIGk9MCxpaT10eXBlcy5sZW5ndGg7aTxp aTsrK2kpe3R5cGU9dHlwZXNbaV07VHlwZT1PcGVuTGF5ZXJzLlN5bWJvbGl6ZXJb dHlwZV07aWYoVHlwZSl7Zm9yKHZhciBqPTAsamo9c3ltYm9saXplcnMubGVuZ3Ro O2o8amo7KytqKXtpZihzeW1ib2xpemVyc1tqXWluc3RhbmNlb2YgVHlwZSl7aGF2 ZVR5cGU9dHJ1ZTticmVhayBvdXRlcjt9fX19fQpyZXR1cm57eHR5cGU6Imd4X3Jl bmRlcmVyIixzeW1ib2xUeXBlOmhhdmVUeXBlP3R5cGU6dGhpcy5zeW1ib2xUeXBl LHN5bWJvbGl6ZXJzOnN5bWJvbGl6ZXJzLHN0eWxlOnRoaXMuY2xpY2thYmxlU3lt Ym9sP3tjdXJzb3I6InBvaW50ZXIifTp1bmRlZmluZWQsbGlzdGVuZXJzOntjbGlj azpmdW5jdGlvbigpe2lmKHRoaXMuY2xpY2thYmxlU3ltYm9sKXt0aGlzLmZpcmVF dmVudCgic3ltYm9sY2xpY2siLHRoaXMscnVsZSk7dGhpcy5maXJlRXZlbnQoInJ1 bGVjbGljayIsdGhpcyxydWxlKTt9fSxzY29wZTp0aGlzfX07fSxjcmVhdGVSdWxl VGl0bGU6ZnVuY3Rpb24ocnVsZSl7cmV0dXJue2NsczoieC1mb3JtLWl0ZW0iLHN0 eWxlOiJwYWRkaW5nOiAwLjJlbSAwLjVlbSAwOyIsYm9keVN0eWxlOkV4dC5hcHBs eUlmKHtiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCJ9LHRoaXMuY2xpY2thYmxlVGl0 bGU/e2N1cnNvcjoicG9pbnRlciJ9OnVuZGVmaW5lZCksaHRtbDp0aGlzLmdldFJ1 bGVUaXRsZShydWxlKSxsaXN0ZW5lcnM6e3JlbmRlcjpmdW5jdGlvbihjb21wKXt0 aGlzLmNsaWNrYWJsZVRpdGxlJiZjb21wLmdldEVsKCkub24oe2NsaWNrOmZ1bmN0 aW9uKCl7dGhpcy5maXJlRXZlbnQoInRpdGxlY2xpY2siLHRoaXMscnVsZSk7dGhp cy5maXJlRXZlbnQoInJ1bGVjbGljayIsdGhpcyxydWxlKTt9LHNjb3BlOnRoaXN9 KTt9LHNjb3BlOnRoaXN9fTt9LGFkZEREOmZ1bmN0aW9uKGNvbXBvbmVudCl7dmFy IGN0PWNvbXBvbmVudC5vd25lckN0O3ZhciBwYW5lbD10aGlzO25ldyBFeHQuZGQu RHJhZ1NvdXJjZShjb21wb25lbnQuZ2V0RWwoKSx7ZGRHcm91cDpjdC5pZCxvbkRy YWdPdXQ6ZnVuY3Rpb24oZSx0YXJnZXRJZCl7dmFyIHRhcmdldD1FeHQuZ2V0Q21w KHRhcmdldElkKTt0YXJnZXQucmVtb3ZlQ2xhc3MoImd4LXJ1bGVkcmFnLWluc2Vy dC1hYm92ZSIpO3RhcmdldC5yZW1vdmVDbGFzcygiZ3gtcnVsZWRyYWctaW5zZXJ0 LWJlbG93Iik7cmV0dXJuIEV4dC5kZC5EcmFnWm9uZS5wcm90b3R5cGUub25EcmFn T3V0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LG9uRHJhZ0VudGVyOmZ1bmN0aW9u KGUsdGFyZ2V0SWQpe3ZhciB0YXJnZXQ9RXh0LmdldENtcCh0YXJnZXRJZCk7dmFy IGNsczt2YXIgc291cmNlUG9zPWN0Lml0ZW1zLmluZGV4T2YoY29tcG9uZW50KTt2 YXIgdGFyZ2V0UG9zPWN0Lml0ZW1zLmluZGV4T2YodGFyZ2V0KTtpZihzb3VyY2VQ b3M+dGFyZ2V0UG9zKXtjbHM9Imd4LXJ1bGVkcmFnLWluc2VydC1hYm92ZSI7fWVs c2UgaWYoc291cmNlUG9zPHRhcmdldFBvcyl7Y2xzPSJneC1ydWxlZHJhZy1pbnNl cnQtYmVsb3ciO30KY2xzJiZ0YXJnZXQuYWRkQ2xhc3MoY2xzKTtyZXR1cm4gRXh0 LmRkLkRyYWdab25lLnByb3RvdHlwZS5vbkRyYWdFbnRlci5hcHBseSh0aGlzLGFy Z3VtZW50cyk7fSxvbkRyYWdEcm9wOmZ1bmN0aW9uKGUsdGFyZ2V0SWQpe3BhbmVs Lm1vdmVSdWxlKGN0Lml0ZW1zLmluZGV4T2YoY29tcG9uZW50KSxjdC5pdGVtcy5p bmRleE9mKEV4dC5nZXRDbXAodGFyZ2V0SWQpKSk7cmV0dXJuIEV4dC5kZC5EcmFn Wm9uZS5wcm90b3R5cGUub25EcmFnRHJvcC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7 fSxnZXREcmFnRGF0YTpmdW5jdGlvbihlKXt2YXIgc291cmNlRWw9ZS5nZXRUYXJn ZXQoIi54LWNvbHVtbi1pbm5lciIpO2lmKHNvdXJjZUVsKXt2YXIgZD1zb3VyY2VF bC5jbG9uZU5vZGUodHJ1ZSk7ZC5pZD1FeHQuaWQoKTtyZXR1cm57c291cmNlRWw6 c291cmNlRWwscmVwYWlyWFk6RXh0LmZseShzb3VyY2VFbCkuZ2V0WFkoKSxkZGVs OmR9fX19KTtuZXcgRXh0LmRkLkRyb3BUYXJnZXQoY29tcG9uZW50LmdldEVsKCks e2RkR3JvdXA6Y3QuaWQsbm90aWZ5RHJvcDpmdW5jdGlvbigpe3JldHVybiB0cnVl O319KTt9LHVwZGF0ZTpmdW5jdGlvbigpe0dlb0V4dC5WZWN0b3JMZWdlbmQuc3Vw ZXJjbGFzcy51cGRhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKHRoaXMuc3lt Ym9sVHlwZSYmdGhpcy5ydWxlcyl7aWYodGhpcy5ydWxlc0NvbnRhaW5lci5pdGVt cyl7dmFyIGNvbXA7Zm9yKHZhciBpPXRoaXMucnVsZXNDb250YWluZXIuaXRlbXMu bGVuZ3RoLTE7aT49MDstLWkpe2NvbXA9dGhpcy5ydWxlc0NvbnRhaW5lci5nZXRD b21wb25lbnQoaSk7dGhpcy5ydWxlc0NvbnRhaW5lci5yZW1vdmUoY29tcCx0cnVl KTt9fQpmb3IodmFyIGk9MCxpaT10aGlzLnJ1bGVzLmxlbmd0aDtpPGlpOysraSl7 dGhpcy5hZGRSdWxlRW50cnkodGhpcy5ydWxlc1tpXSx0cnVlKTt9CnRoaXMuZG9M YXlvdXQoKTtpZih0aGlzLnNlbGVjdGVkUnVsZSl7dGhpcy5nZXRSdWxlRW50cnko dGhpcy5zZWxlY3RlZFJ1bGUpLmJvZHkuYWRkQ2xhc3MoIngtZ3JpZDMtcm93LXNl bGVjdGVkIik7fX19LHVwZGF0ZVJ1bGVFbnRyeTpmdW5jdGlvbihydWxlKXt2YXIg cnVsZUVudHJ5PXRoaXMuZ2V0UnVsZUVudHJ5KHJ1bGUpO2lmKHJ1bGVFbnRyeSl7 cnVsZUVudHJ5LnJlbW92ZUFsbCgpO3J1bGVFbnRyeS5hZGQodGhpcy5jcmVhdGVS dWxlUmVuZGVyZXIocnVsZSkpO3J1bGVFbnRyeS5hZGQodGhpcy5jcmVhdGVSdWxl VGl0bGUocnVsZSkpO3J1bGVFbnRyeS5kb0xheW91dCgpO319LG1vdmVSdWxlOmZ1 bmN0aW9uKHNvdXJjZVBvcyx0YXJnZXRQb3Mpe3ZhciBzcmNSdWxlPXRoaXMucnVs ZXNbc291cmNlUG9zXTt0aGlzLnJ1bGVzLnNwbGljZShzb3VyY2VQb3MsMSk7dGhp cy5ydWxlcy5zcGxpY2UodGFyZ2V0UG9zLDAsc3JjUnVsZSk7dGhpcy51cGRhdGUo KTt0aGlzLmZpcmVFdmVudCgicnVsZW1vdmVkIix0aGlzLHNyY1J1bGUpO30sZ2V0 UnVsZVRpdGxlOmZ1bmN0aW9uKHJ1bGUpe3ZhciB0aXRsZT1ydWxlLnRpdGxlfHxy dWxlLm5hbWV8fCIiO2lmKCF0aXRsZSYmdGhpcy51bnRpdGxlZFByZWZpeCl7dGl0 bGU9dGhpcy51bnRpdGxlZFByZWZpeCsodGhpcy5ydWxlcy5pbmRleE9mKHJ1bGUp KzEpO30KcmV0dXJuIHRpdGxlO30sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe2lm KHRoaXMubGF5ZXIpe2lmKHRoaXMubGF5ZXIuZXZlbnRzKXt0aGlzLmxheWVyLmV2 ZW50cy51bih7ZmVhdHVyZXNhZGRlZDp0aGlzLm9uRmVhdHVyZXNBZGRlZCxzY29w ZTp0aGlzfSk7fQppZih0aGlzLmxheWVyLm1hcCYmdGhpcy5sYXllci5tYXAuZXZl bnRzKXt0aGlzLmxheWVyLm1hcC5ldmVudHMudW4oeyJ6b29tZW5kIjp0aGlzLm9u TWFwWm9vbSxzY29wZTp0aGlzfSk7fX0KZGVsZXRlIHRoaXMubGF5ZXI7ZGVsZXRl IHRoaXMucnVsZXM7R2VvRXh0LlZlY3RvckxlZ2VuZC5zdXBlcmNsYXNzLmJlZm9y ZURlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpO319KTtHZW9FeHQuVmVjdG9y TGVnZW5kLnN1cHBvcnRzPWZ1bmN0aW9uKGxheWVyUmVjb3JkKXtyZXR1cm4gbGF5 ZXJSZWNvcmQuZ2V0TGF5ZXIoKWluc3RhbmNlb2YgT3BlbkxheWVycy5MYXllci5W ZWN0b3I7fTtHZW9FeHQuTGF5ZXJMZWdlbmQudHlwZXNbImd4X3ZlY3RvcmxlZ2Vu ZCJdPUdlb0V4dC5WZWN0b3JMZWdlbmQ7RXh0LnJlZygiZ3hfdmVjdG9ybGVnZW5k IixHZW9FeHQuVmVjdG9yTGVnZW5kKTtFeHQubmFtZXNwYWNlKCJHZW9FeHQudHJl ZSIpO0dlb0V4dC50cmVlLkxheWVyQ29udGFpbmVyPUV4dC5leHRlbmQoRXh0LnRy ZWUuQXN5bmNUcmVlTm9kZSx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oY29uZmlnKXtj b25maWc9RXh0LmFwcGx5SWYoY29uZmlnfHx7fSx7dGV4dDoiTGF5ZXJzIn0pO3Ro aXMubG9hZGVyPWNvbmZpZy5sb2FkZXIgaW5zdGFuY2VvZiBHZW9FeHQudHJlZS5M YXllckxvYWRlcj9jb25maWcubG9hZGVyOm5ldyBHZW9FeHQudHJlZS5MYXllckxv YWRlcihFeHQuYXBwbHlJZihjb25maWcubG9hZGVyfHx7fSx7c3RvcmU6Y29uZmln LmxheWVyU3RvcmV9KSk7R2VvRXh0LnRyZWUuTGF5ZXJDb250YWluZXIuc3VwZXJj bGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsY29uZmlnKTt9LHJlY29yZEluZGV4 VG9Ob2RlSW5kZXg6ZnVuY3Rpb24oaW5kZXgpe3ZhciBzdG9yZT10aGlzLmxvYWRl ci5zdG9yZTt2YXIgY291bnQ9c3RvcmUuZ2V0Q291bnQoKTt2YXIgbm9kZUNvdW50 PXRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7dmFyIG5vZGVJbmRleD0tMTtmb3IodmFy IGk9Y291bnQtMTtpPj0wOy0taSl7aWYodGhpcy5sb2FkZXIuZmlsdGVyKHN0b3Jl LmdldEF0KGkpKT09PXRydWUpeysrbm9kZUluZGV4O2lmKGluZGV4PT09aXx8bm9k ZUluZGV4Pm5vZGVDb3VudC0xKXticmVhazt9fX0KcmV0dXJuIG5vZGVJbmRleDt9 LGRlc3Ryb3k6ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5sYXllclN0b3JlO0dlb0V4 dC50cmVlLkxheWVyQ29udGFpbmVyLnN1cGVyY2xhc3MuZGVzdHJveS5hcHBseSh0 aGlzLGFyZ3VtZW50cyk7fX0pO0V4dC50cmVlLlRyZWVQYW5lbC5ub2RlVHlwZXMu Z3hfbGF5ZXJjb250YWluZXI9R2VvRXh0LnRyZWUuTGF5ZXJDb250YWluZXI7RXh0 Lm5hbWVzcGFjZSgiR2VvRXh0LnRyZWUiKTtHZW9FeHQudHJlZS5CYXNlTGF5ZXJD b250YWluZXI9RXh0LmV4dGVuZChHZW9FeHQudHJlZS5MYXllckNvbnRhaW5lcix7 Y29uc3RydWN0b3I6ZnVuY3Rpb24oY29uZmlnKXtjb25maWc9RXh0LmFwcGx5SWYo Y29uZmlnfHx7fSx7dGV4dDoiQmFzZSBMYXllciIsbG9hZGVyOnt9fSk7Y29uZmln LmxvYWRlcj1FeHQuYXBwbHlJZihjb25maWcubG9hZGVyLHtiYXNlQXR0cnM6RXh0 LmFwcGx5SWYoY29uZmlnLmxvYWRlci5iYXNlQXR0cnN8fHt9LHtpY29uQ2xzOidn eC10cmVlLWJhc2VsYXllci1pY29uJyxjaGVja2VkR3JvdXA6J2Jhc2VsYXllcid9 KSxmaWx0ZXI6ZnVuY3Rpb24ocmVjb3JkKXt2YXIgbGF5ZXI9cmVjb3JkLmdldExh eWVyKCk7cmV0dXJuIGxheWVyLmRpc3BsYXlJbkxheWVyU3dpdGNoZXI9PT10cnVl JiZsYXllci5pc0Jhc2VMYXllcj09PXRydWU7fX0pO0dlb0V4dC50cmVlLkJhc2VM YXllckNvbnRhaW5lci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxj b25maWcpO319KTtFeHQudHJlZS5UcmVlUGFuZWwubm9kZVR5cGVzLmd4X2Jhc2Vs YXllcmNvbnRhaW5lcj1HZW9FeHQudHJlZS5CYXNlTGF5ZXJDb250YWluZXI7RXh0 Lm5hbWVzcGFjZSgiR2VvRXh0LnBsdWdpbnMiKTtHZW9FeHQucGx1Z2lucy5Qcmlu dEV4dGVudD1FeHQuZXh0ZW5kKEV4dC51dGlsLk9ic2VydmFibGUse2luaXRpYWxD b25maWc6bnVsbCxwcmludFByb3ZpZGVyOm51bGwsbWFwOm51bGwsbGF5ZXI6bnVs bCxjb250cm9sOm51bGwscGFnZXM6bnVsbCxwYWdlOm51bGwsY29uc3RydWN0b3I6 ZnVuY3Rpb24oY29uZmlnKXtjb25maWc9Y29uZmlnfHx7fTtFeHQuYXBwbHkodGhp cyxjb25maWcpO3RoaXMuaW5pdGlhbENvbmZpZz1jb25maWc7aWYoIXRoaXMucHJp bnRQcm92aWRlcil7dGhpcy5wcmludFByb3ZpZGVyPXRoaXMucGFnZXNbMF0ucHJp bnRQcm92aWRlcjt9CmlmKCF0aGlzLnBhZ2VzKXt0aGlzLnBhZ2VzPVtdO30KdGhp cy5hZGRFdmVudHMoInNlbGVjdHBhZ2UiKTtHZW9FeHQucGx1Z2lucy5QcmludEV4 dGVudC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRz KTt9LHByaW50OmZ1bmN0aW9uKG9wdGlvbnMpe3RoaXMucHJpbnRQcm92aWRlci5w cmludCh0aGlzLm1hcCx0aGlzLnBhZ2VzLG9wdGlvbnMpO30saW5pdDpmdW5jdGlv bihtYXBQYW5lbCl7dGhpcy5tYXA9bWFwUGFuZWwubWFwO21hcFBhbmVsLm9uKCJk ZXN0cm95Iix0aGlzLm9uTWFwUGFuZWxEZXN0cm95LHRoaXMpO2lmKCF0aGlzLmxh eWVyKXt0aGlzLmxheWVyPW5ldyBPcGVuTGF5ZXJzLkxheWVyLlZlY3RvcihudWxs LHtkaXNwbGF5SW5MYXllclN3aXRjaGVyOmZhbHNlfSk7fQp0aGlzLmNyZWF0ZUNv bnRyb2woKTtmb3IodmFyIGk9MCxsZW49dGhpcy5wYWdlcy5sZW5ndGg7aTxsZW47 KytpKXt0aGlzLmFkZFBhZ2UodGhpcy5wYWdlc1tpXSk7fQp0aGlzLnNob3coKTt9 LGFkZFBhZ2U6ZnVuY3Rpb24ocGFnZSl7cGFnZT1wYWdlfHxuZXcgR2VvRXh0LmRh dGEuUHJpbnRQYWdlKHtwcmludFByb3ZpZGVyOnRoaXMucHJpbnRQcm92aWRlcn0p O2lmKHRoaXMucGFnZXMuaW5kZXhPZihwYWdlKT09PS0xKXt0aGlzLnBhZ2VzLnB1 c2gocGFnZSk7fQp0aGlzLmxheWVyLmFkZEZlYXR1cmVzKFtwYWdlLmZlYXR1cmVd KTtwYWdlLm9uKCJjaGFuZ2UiLHRoaXMub25QYWdlQ2hhbmdlLHRoaXMpO3RoaXMu cGFnZT1wYWdlO3ZhciBtYXA9dGhpcy5tYXA7aWYobWFwLmdldENlbnRlcigpKXt0 aGlzLmZpdFBhZ2UoKTt9ZWxzZXttYXAuZXZlbnRzLnJlZ2lzdGVyKCJtb3ZlZW5k Iix0aGlzLGZ1bmN0aW9uKCl7bWFwLmV2ZW50cy51bnJlZ2lzdGVyKCJtb3ZlZW5k Iix0aGlzLGFyZ3VtZW50cy5jYWxsZWUpO3RoaXMuZml0UGFnZSgpO30pO30KcmV0 dXJuIHBhZ2U7fSxyZW1vdmVQYWdlOmZ1bmN0aW9uKHBhZ2Upe3RoaXMucGFnZXMu cmVtb3ZlKHBhZ2UpO2lmKHBhZ2UuZmVhdHVyZS5sYXllcil7dGhpcy5sYXllci5y ZW1vdmVGZWF0dXJlcyhbcGFnZS5mZWF0dXJlXSk7fQpwYWdlLnVuKCJjaGFuZ2Ui LHRoaXMub25QYWdlQ2hhbmdlLHRoaXMpO30sc2VsZWN0UGFnZTpmdW5jdGlvbihw YWdlKXt0aGlzLmNvbnRyb2wuYWN0aXZlJiZ0aGlzLmNvbnRyb2wuc2V0RmVhdHVy ZShwYWdlLmZlYXR1cmUpO30sc2hvdzpmdW5jdGlvbigpe3RoaXMubWFwLmFkZExh eWVyKHRoaXMubGF5ZXIpO3RoaXMubWFwLmFkZENvbnRyb2wodGhpcy5jb250cm9s KTt0aGlzLmNvbnRyb2wuYWN0aXZhdGUoKTtpZih0aGlzLnBhZ2UmJnRoaXMubWFw LmdldENlbnRlcigpKXt0aGlzLnVwZGF0ZUJveCgpO319LGhpZGU6ZnVuY3Rpb24o KXt2YXIgbWFwPXRoaXMubWFwO3ZhciBjb250cm9sPXRoaXMuY29udHJvbDtpZihj b250cm9sJiZjb250cm9sLmV2ZW50cyl7Y29udHJvbC5kZWFjdGl2YXRlKCk7aWYo bWFwJiZtYXAuZXZlbnRzJiZjb250cm9sLm1hcCl7bWFwLnJlbW92ZUNvbnRyb2wo Y29udHJvbCk7fX0KdmFyIGxheWVyPXRoaXMubGF5ZXI7aWYoIXRoaXMuaW5pdGlh bENvbmZpZy5sYXllciYmbWFwJiZtYXAuZXZlbnRzJiZsYXllciYmbGF5ZXIubWFw KXttYXAucmVtb3ZlTGF5ZXIobGF5ZXIpO319LG9uTWFwUGFuZWxEZXN0cm95OmZ1 bmN0aW9uKCl7dmFyIG1hcD10aGlzLm1hcDtmb3IodmFyIGxlbj10aGlzLnBhZ2Vz Lmxlbmd0aC0xLGk9bGVuO2k+PTA7aS0tKXt0aGlzLnJlbW92ZVBhZ2UodGhpcy5w YWdlc1tpXSk7fQp0aGlzLmhpZGUoKTt2YXIgY29udHJvbD10aGlzLmNvbnRyb2w7 aWYobWFwJiZtYXAuZXZlbnRzJiZjb250cm9sJiZjb250cm9sLmV2ZW50cyl7Y29u dHJvbC5kZXN0cm95KCk7fQp2YXIgbGF5ZXI9dGhpcy5sYXllcjtpZighdGhpcy5p bml0aWFsQ29uZmlnLmxheWVyJiZtYXAmJm1hcC5ldmVudHMmJmxheWVyJiZsYXll ci5ldmVudHMpe2xheWVyLmRlc3Ryb3koKTt9CmRlbGV0ZSB0aGlzLmxheWVyO2Rl bGV0ZSB0aGlzLmNvbnRyb2w7ZGVsZXRlIHRoaXMucGFnZTt0aGlzLm1hcD1udWxs O30sY3JlYXRlQ29udHJvbDpmdW5jdGlvbigpe3RoaXMuY29udHJvbD1uZXcgT3Bl bkxheWVycy5Db250cm9sLlRyYW5zZm9ybUZlYXR1cmUodGhpcy5sYXllcix7cHJl c2VydmVBc3BlY3RSYXRpbzp0cnVlLGV2ZW50TGlzdGVuZXJzOnsiYmVmb3Jlc2V0 ZmVhdHVyZSI6ZnVuY3Rpb24oZSl7Zm9yKHZhciBpPTAsbGVuPXRoaXMucGFnZXMu bGVuZ3RoO2k8bGVuOysraSl7aWYodGhpcy5wYWdlc1tpXS5mZWF0dXJlPT09ZS5m ZWF0dXJlKXt0aGlzLnBhZ2U9dGhpcy5wYWdlc1tpXTtlLm9iamVjdC5yb3RhdGlv bj0tdGhpcy5wYWdlc1tpXS5yb3RhdGlvbjticmVhazt9fX0sInNldGZlYXR1cmUi OmZ1bmN0aW9uKGUpe2Zvcih2YXIgaT0wLGxlbj10aGlzLnBhZ2VzLmxlbmd0aDtp PGxlbjsrK2kpe2lmKHRoaXMucGFnZXNbaV0uZmVhdHVyZT09PWUuZmVhdHVyZSl7 dGhpcy5maXJlRXZlbnQoInNlbGVjdHBhZ2UiLHRoaXMucGFnZXNbaV0pO2JyZWFr O319fSwiYmVmb3JldHJhbnNmb3JtIjpmdW5jdGlvbihlKXt0aGlzLl91cGRhdGlu Zz10cnVlO3ZhciBwYWdlPXRoaXMucGFnZTtpZihlLnJvdGF0aW9uKXtpZih0aGlz LnByaW50UHJvdmlkZXIubGF5b3V0LmdldCgicm90YXRpb24iKSl7cGFnZS5zZXRS b3RhdGlvbigtZS5vYmplY3Qucm90YXRpb24pO31lbHNle2Uub2JqZWN0LnNldEZl YXR1cmUocGFnZS5mZWF0dXJlKTt9fWVsc2UgaWYoZS5jZW50ZXIpe3BhZ2Uuc2V0 Q2VudGVyKE9wZW5MYXllcnMuTG9uTGF0LmZyb21TdHJpbmcoZS5jZW50ZXIudG9T aG9ydFN0cmluZygpKSk7fWVsc2V7cGFnZS5maXQoZS5vYmplY3QuYm94LHttb2Rl OiJjbG9zZXN0In0pO3ZhciBtaW5TY2FsZT10aGlzLnByaW50UHJvdmlkZXIuc2Nh bGVzLmdldEF0KDApO3ZhciBtYXhTY2FsZT10aGlzLnByaW50UHJvdmlkZXIuc2Nh bGVzLmdldEF0KHRoaXMucHJpbnRQcm92aWRlci5zY2FsZXMuZ2V0Q291bnQoKS0x KTt2YXIgYm94Qm91bmRzPWUub2JqZWN0LmJveC5nZW9tZXRyeS5nZXRCb3VuZHMo KTt2YXIgcGFnZUJvdW5kcz1wYWdlLmZlYXR1cmUuZ2VvbWV0cnkuZ2V0Qm91bmRz KCk7dmFyIHRvb0xhcmdlPXBhZ2Uuc2NhbGU9PT1taW5TY2FsZSYmYm94Qm91bmRz LmNvbnRhaW5zQm91bmRzKHBhZ2VCb3VuZHMpO3ZhciB0b29TbWFsbD1wYWdlLnNj YWxlPT09bWF4U2NhbGUmJnBhZ2VCb3VuZHMuY29udGFpbnNCb3VuZHMoYm94Qm91 bmRzKTtpZih0b29MYXJnZT09PXRydWV8fHRvb1NtYWxsPT09dHJ1ZSl7dGhpcy51 cGRhdGVCb3goKTt9fQpkZWxldGUgdGhpcy5fdXBkYXRpbmc7cmV0dXJuIGZhbHNl O30sInRyYW5zZm9ybWNvbXBsZXRlIjp0aGlzLnVwZGF0ZUJveCxzY29wZTp0aGlz fX0pO30sZml0UGFnZTpmdW5jdGlvbigpe2lmKHRoaXMucGFnZSl7dGhpcy5wYWdl LmZpdCh0aGlzLm1hcCx7bW9kZToic2NyZWVuIn0pO319LHVwZGF0ZUJveDpmdW5j dGlvbigpe3ZhciBwYWdlPXRoaXMucGFnZTt0aGlzLmNvbnRyb2wuYWN0aXZlJiZ0 aGlzLmNvbnRyb2wuc2V0RmVhdHVyZShwYWdlLmZlYXR1cmUse3JvdGF0aW9uOi1w YWdlLnJvdGF0aW9ufSk7fSxvblBhZ2VDaGFuZ2U6ZnVuY3Rpb24ocGFnZSxtb2Rz KXtpZighdGhpcy5fdXBkYXRpbmcpe3RoaXMuY29udHJvbC5hY3RpdmUmJnRoaXMu Y29udHJvbC5zZXRGZWF0dXJlKHBhZ2UuZmVhdHVyZSx7cm90YXRpb246LXBhZ2Uu cm90YXRpb259KTt9fX0pO0V4dC5wcmVnKCJneF9wcmludGV4dGVudCIsR2VvRXh0 LnBsdWdpbnMuUHJpbnRFeHRlbnQpO0V4dC5uYW1lc3BhY2UoIkdlb0V4dCIpO0dl b0V4dC5TbGlkZXJUaXA9RXh0LmV4dGVuZChFeHQuc2xpZGVyLlRpcCx7aG92ZXI6 dHJ1ZSxtaW5XaWR0aDoxMCxvZmZzZXRzOlswLC0xMF0sZHJhZ2dpbmc6ZmFsc2Us aW5pdDpmdW5jdGlvbihzbGlkZXIpe0dlb0V4dC5TbGlkZXJUaXAuc3VwZXJjbGFz cy5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZih0aGlzLmhvdmVyKXtzbGlk ZXIub24oInJlbmRlciIsdGhpcy5yZWdpc3RlclRodW1iTGlzdGVuZXJzLHRoaXMp O30KdGhpcy5zbGlkZXI9c2xpZGVyO30scmVnaXN0ZXJUaHVtYkxpc3RlbmVyczpm dW5jdGlvbigpe3ZhciB0aHVtYixlbDtmb3IodmFyIGk9MCxpaT10aGlzLnNsaWRl ci50aHVtYnMubGVuZ3RoO2k8aWk7KytpKXt0aHVtYj10aGlzLnNsaWRlci50aHVt YnNbaV07ZWw9dGh1bWIudHJhY2tlci5lbDsoZnVuY3Rpb24odGh1bWIsZWwpe2Vs Lm9uKHttb3VzZW92ZXI6ZnVuY3Rpb24oZSl7dGhpcy5vblNsaWRlKHRoaXMuc2xp ZGVyLGUsdGh1bWIpO3RoaXMuZHJhZ2dpbmc9ZmFsc2U7fSxtb3VzZW91dDpmdW5j dGlvbigpe2lmKCF0aGlzLmRyYWdnaW5nKXt0aGlzLmhpZGUuYXBwbHkodGhpcyxh cmd1bWVudHMpO319LHNjb3BlOnRoaXN9KX0pLmFwcGx5KHRoaXMsW3RodW1iLGVs XSk7fX0sb25TbGlkZTpmdW5jdGlvbihzbGlkZXIsZSx0aHVtYil7dGhpcy5kcmFn Z2luZz10cnVlO3JldHVybiBHZW9FeHQuU2xpZGVyVGlwLnN1cGVyY2xhc3Mub25T bGlkZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fX0pO0V4dC5uYW1lc3BhY2UoIkdl b0V4dCIpO0dlb0V4dC5ab29tU2xpZGVyPUV4dC5leHRlbmQoRXh0LlNsaWRlcix7 bWFwOm51bGwsYmFzZUNsczoiZ3gtem9vbXNsaWRlciIsYWdncmVzc2l2ZTpmYWxz ZSx1cGRhdGluZzpmYWxzZSxpbml0Q29tcG9uZW50OmZ1bmN0aW9uKCl7R2VvRXh0 Llpvb21TbGlkZXIuc3VwZXJjbGFzcy5pbml0Q29tcG9uZW50LmNhbGwodGhpcyk7 aWYodGhpcy5tYXApe2lmKHRoaXMubWFwIGluc3RhbmNlb2YgR2VvRXh0Lk1hcFBh bmVsKXt0aGlzLm1hcD10aGlzLm1hcC5tYXA7fQp0aGlzLmJpbmQodGhpcy5tYXAp O30KaWYodGhpcy5hZ2dyZXNzaXZlPT09dHJ1ZSl7dGhpcy5vbignY2hhbmdlJyx0 aGlzLmNoYW5nZUhhbmRsZXIsdGhpcyk7fWVsc2V7dGhpcy5vbignY2hhbmdlY29t cGxldGUnLHRoaXMuY2hhbmdlSGFuZGxlcix0aGlzKTt9CnRoaXMub24oImJlZm9y ZWRlc3Ryb3kiLHRoaXMudW5iaW5kLHRoaXMpO30sb25SZW5kZXI6ZnVuY3Rpb24o KXtHZW9FeHQuWm9vbVNsaWRlci5zdXBlcmNsYXNzLm9uUmVuZGVyLmFwcGx5KHRo aXMsYXJndW1lbnRzKTt0aGlzLmVsLmFkZENsYXNzKHRoaXMuYmFzZUNscyk7fSxh ZnRlclJlbmRlcjpmdW5jdGlvbigpe0V4dC5TbGlkZXIuc3VwZXJjbGFzcy5hZnRl clJlbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy51cGRhdGUoKTt9LGFk ZFRvTWFwUGFuZWw6ZnVuY3Rpb24ocGFuZWwpe3RoaXMub24oe3JlbmRlcjpmdW5j dGlvbigpe3ZhciBlbD10aGlzLmdldEVsKCk7ZWwuc2V0U3R5bGUoe3Bvc2l0aW9u OiJhYnNvbHV0ZSIsekluZGV4OnBhbmVsLm1hcC5aX0lOREVYX0JBU0UuQ29udHJv bH0pO2VsLm9uKHttb3VzZWRvd246dGhpcy5zdG9wTW91c2VFdmVudHMsY2xpY2s6 dGhpcy5zdG9wTW91c2VFdmVudHN9KTt9LGFmdGVycmVuZGVyOmZ1bmN0aW9uKCl7 dGhpcy5iaW5kKHBhbmVsLm1hcCk7fSxzY29wZTp0aGlzfSk7fSxzdG9wTW91c2VF dmVudHM6ZnVuY3Rpb24oZSl7ZS5zdG9wRXZlbnQoKTt9LHJlbW92ZUZyb21NYXBQ YW5lbDpmdW5jdGlvbihwYW5lbCl7dmFyIGVsPXRoaXMuZ2V0RWwoKTtlbC51bigi bW91c2Vkb3duIix0aGlzLnN0b3BNb3VzZUV2ZW50cyx0aGlzKTtlbC51bigiY2xp Y2siLHRoaXMuc3RvcE1vdXNlRXZlbnRzLHRoaXMpO3RoaXMudW5iaW5kKCk7fSxi aW5kOmZ1bmN0aW9uKG1hcCl7dGhpcy5tYXA9bWFwO3RoaXMubWFwLmV2ZW50cy5v bih7em9vbWVuZDp0aGlzLnVwZGF0ZSxjaGFuZ2ViYXNlbGF5ZXI6dGhpcy5pbml0 Wm9vbVZhbHVlcyxzY29wZTp0aGlzfSk7aWYodGhpcy5tYXAuYmFzZUxheWVyKXt0 aGlzLmluaXRab29tVmFsdWVzKCk7dGhpcy51cGRhdGUoKTt9fSx1bmJpbmQ6ZnVu Y3Rpb24oKXtpZih0aGlzLm1hcCl7dGhpcy5tYXAuZXZlbnRzLnVuKHt6b29tZW5k OnRoaXMudXBkYXRlLGNoYW5nZWJhc2VsYXllcjp0aGlzLmluaXRab29tVmFsdWVz LHNjb3BlOnRoaXN9KTt9fSxpbml0Wm9vbVZhbHVlczpmdW5jdGlvbigpe3ZhciBs YXllcj10aGlzLm1hcC5iYXNlTGF5ZXI7aWYodGhpcy5pbml0aWFsQ29uZmlnLm1p blZhbHVlPT09dW5kZWZpbmVkKXt0aGlzLm1pblZhbHVlPWxheWVyLm1pblpvb21M ZXZlbHx8MDt9CmlmKHRoaXMuaW5pdGlhbENvbmZpZy5tYXhWYWx1ZT09PXVuZGVm aW5lZCl7dGhpcy5tYXhWYWx1ZT1sYXllci5taW5ab29tTGV2ZWw9PW51bGw/bGF5 ZXIubnVtWm9vbUxldmVscy0xOmxheWVyLm1heFpvb21MZXZlbDt9fSxnZXRab29t OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VmFsdWUoKTt9LGdldFNjYWxlOmZ1 bmN0aW9uKCl7cmV0dXJuIE9wZW5MYXllcnMuVXRpbC5nZXRTY2FsZUZyb21SZXNv bHV0aW9uKHRoaXMubWFwLmdldFJlc29sdXRpb25Gb3Jab29tKHRoaXMuZ2V0VmFs dWUoKSksdGhpcy5tYXAuZ2V0VW5pdHMoKSk7fSxnZXRSZXNvbHV0aW9uOmZ1bmN0 aW9uKCl7cmV0dXJuIHRoaXMubWFwLmdldFJlc29sdXRpb25Gb3Jab29tKHRoaXMu Z2V0VmFsdWUoKSk7fSxjaGFuZ2VIYW5kbGVyOmZ1bmN0aW9uKCl7aWYodGhpcy5t YXAmJiF0aGlzLnVwZGF0aW5nKXt0aGlzLm1hcC56b29tVG8odGhpcy5nZXRWYWx1 ZSgpKTt9fSx1cGRhdGU6ZnVuY3Rpb24oKXtpZih0aGlzLnJlbmRlcmVkJiZ0aGlz Lm1hcCl7dGhpcy51cGRhdGluZz10cnVlO3RoaXMuc2V0VmFsdWUodGhpcy5tYXAu Z2V0Wm9vbSgpKTt0aGlzLnVwZGF0aW5nPWZhbHNlO319fSk7RXh0LnJlZygnZ3hf em9vbXNsaWRlcicsR2VvRXh0Llpvb21TbGlkZXIpO0V4dC5uYW1lc3BhY2UoIkdl b0V4dC50cmVlIik7R2VvRXh0LnRyZWUuV01TQ2FwYWJpbGl0aWVzTG9hZGVyPWZ1 bmN0aW9uKGNvbmZpZyl7RXh0LmFwcGx5KHRoaXMsY29uZmlnKTtHZW9FeHQudHJl ZS5XTVNDYXBhYmlsaXRpZXNMb2FkZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5j YWxsKHRoaXMpO307RXh0LmV4dGVuZChHZW9FeHQudHJlZS5XTVNDYXBhYmlsaXRp ZXNMb2FkZXIsRXh0LnRyZWUuVHJlZUxvYWRlcix7dXJsOm51bGwsbGF5ZXJPcHRp b25zOm51bGwsbGF5ZXJQYXJhbXM6bnVsbCxyZXF1ZXN0TWV0aG9kOidHRVQnLGdl dFBhcmFtczpmdW5jdGlvbihub2RlKXtyZXR1cm57J3NlcnZpY2UnOidXTVMnLCdy ZXF1ZXN0JzonR2V0Q2FwYWJpbGl0aWVzJ307fSxwcm9jZXNzUmVzcG9uc2U6ZnVu Y3Rpb24ocmVzcG9uc2Usbm9kZSxjYWxsYmFjayxzY29wZSl7dmFyIGNhcGFiaWxp dGllcz1uZXcgT3BlbkxheWVycy5Gb3JtYXQuV01TQ2FwYWJpbGl0aWVzKCkucmVh ZChyZXNwb25zZS5yZXNwb25zZVhNTHx8cmVzcG9uc2UucmVzcG9uc2VUZXh0KTt0 aGlzLnByb2Nlc3NMYXllcihjYXBhYmlsaXRpZXMuY2FwYWJpbGl0eSxjYXBhYmls aXRpZXMuY2FwYWJpbGl0eS5yZXF1ZXN0LmdldG1hcC5ocmVmLG5vZGUpO2lmKHR5 cGVvZiBjYWxsYmFjaz09ImZ1bmN0aW9uIil7Y2FsbGJhY2suYXBwbHkoc2NvcGV8 fG5vZGUsW25vZGVdKTt9fSxjcmVhdGVXTVNMYXllcjpmdW5jdGlvbihsYXllcix1 cmwpe2lmKGxheWVyLm5hbWUpe3JldHVybiBuZXcgT3BlbkxheWVycy5MYXllci5X TVMobGF5ZXIudGl0bGUsdXJsLE9wZW5MYXllcnMuVXRpbC5leHRlbmQoe2Zvcm1h dHM6bGF5ZXIuZm9ybWF0c1swXSxsYXllcnM6bGF5ZXIubmFtZX0sdGhpcy5sYXll clBhcmFtcyksT3BlbkxheWVycy5VdGlsLmV4dGVuZCh7bWluU2NhbGU6bGF5ZXIu bWluU2NhbGUscXVlcnlhYmxlOmxheWVyLnF1ZXJ5YWJsZSxtYXhTY2FsZTpsYXll ci5tYXhTY2FsZSxtZXRhZGF0YTpsYXllcn0sdGhpcy5sYXllck9wdGlvbnMpKTt9 ZWxzZXtyZXR1cm4gbnVsbDt9fSxwcm9jZXNzTGF5ZXI6ZnVuY3Rpb24obGF5ZXIs dXJsLG5vZGUpe0V4dC5lYWNoKGxheWVyLm5lc3RlZExheWVycyxmdW5jdGlvbihl bCl7dmFyIG49dGhpcy5jcmVhdGVOb2RlKHt0ZXh0OmVsLnRpdGxlfHxlbC5uYW1l LG5vZGVUeXBlOidub2RlJyxsYXllcjp0aGlzLmNyZWF0ZVdNU0xheWVyKGVsLHVy bCksbGVhZjooZWwubmVzdGVkTGF5ZXJzLmxlbmd0aD09PTApfSk7aWYobil7bm9k ZS5hcHBlbmRDaGlsZChuKTt9CmlmKGVsLm5lc3RlZExheWVycyl7dGhpcy5wcm9j ZXNzTGF5ZXIoZWwsdXJsLG4pO319LHRoaXMpO319KTtFeHQubmFtZXNwYWNlKCJH ZW9FeHQuZGF0YSIpO0dlb0V4dC5kYXRhLldNU0NhcGFiaWxpdGllc1JlYWRlcj1m dW5jdGlvbihtZXRhLHJlY29yZFR5cGUpe21ldGE9bWV0YXx8e307aWYoIW1ldGEu Zm9ybWF0KXttZXRhLmZvcm1hdD1uZXcgT3BlbkxheWVycy5Gb3JtYXQuV01TQ2Fw YWJpbGl0aWVzKCk7fQppZih0eXBlb2YgcmVjb3JkVHlwZSE9PSJmdW5jdGlvbiIp e3JlY29yZFR5cGU9R2VvRXh0LmRhdGEuTGF5ZXJSZWNvcmQuY3JlYXRlKHJlY29y ZFR5cGV8fG1ldGEuZmllbGRzfHxbe25hbWU6Im5hbWUiLHR5cGU6InN0cmluZyJ9 LHtuYW1lOiJ0aXRsZSIsdHlwZToic3RyaW5nIn0se25hbWU6ImFic3RyYWN0Iix0 eXBlOiJzdHJpbmcifSx7bmFtZToicXVlcnlhYmxlIix0eXBlOiJib29sZWFuIn0s e25hbWU6Im9wYXF1ZSIsdHlwZToiYm9vbGVhbiJ9LHtuYW1lOiJub1N1YnNldHMi LHR5cGU6ImJvb2xlYW4ifSx7bmFtZToiY2FzY2FkZWQiLHR5cGU6ImludCJ9LHtu YW1lOiJmaXhlZFdpZHRoIix0eXBlOiJpbnQifSx7bmFtZToiZml4ZWRIZWlnaHQi LHR5cGU6ImludCJ9LHtuYW1lOiJtaW5TY2FsZSIsdHlwZToiZmxvYXQifSx7bmFt ZToibWF4U2NhbGUiLHR5cGU6ImZsb2F0In0se25hbWU6InByZWZpeCIsdHlwZToi c3RyaW5nIn0se25hbWU6ImZvcm1hdHMifSx7bmFtZToic3R5bGVzIn0se25hbWU6 InNycyJ9LHtuYW1lOiJkaW1lbnNpb25zIn0se25hbWU6ImJib3gifSx7bmFtZToi bGxiYm94In0se25hbWU6ImF0dHJpYnV0aW9uIn0se25hbWU6ImtleXdvcmRzIn0s e25hbWU6ImlkZW50aWZpZXJzIn0se25hbWU6ImF1dGhvcml0eVVSTHMifSx7bmFt ZToibWV0YWRhdGFVUkxzIn1dKTt9Ckdlb0V4dC5kYXRhLldNU0NhcGFiaWxpdGll c1JlYWRlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxtZXRhLHJl Y29yZFR5cGUpO307RXh0LmV4dGVuZChHZW9FeHQuZGF0YS5XTVNDYXBhYmlsaXRp ZXNSZWFkZXIsRXh0LmRhdGEuRGF0YVJlYWRlcix7YXR0cmlidXRpb25DbHM6Imd4 LWF0dHJpYnV0aW9uIixyZWFkOmZ1bmN0aW9uKHJlcXVlc3Qpe3ZhciBkYXRhPXJl cXVlc3QucmVzcG9uc2VYTUw7aWYoIWRhdGF8fCFkYXRhLmRvY3VtZW50RWxlbWVu dCl7ZGF0YT1yZXF1ZXN0LnJlc3BvbnNlVGV4dDt9CnJldHVybiB0aGlzLnJlYWRS ZWNvcmRzKGRhdGEpO30sc2VydmljZUV4Y2VwdGlvbkZvcm1hdDpmdW5jdGlvbihm b3JtYXRzKXtpZihPcGVuTGF5ZXJzLlV0aWwuaW5kZXhPZihmb3JtYXRzLCJhcHBs aWNhdGlvbi92bmQub2djLnNlX2luaW1hZ2UiKT4tMSl7cmV0dXJuImFwcGxpY2F0 aW9uL3ZuZC5vZ2Muc2VfaW5pbWFnZSI7fQppZihPcGVuTGF5ZXJzLlV0aWwuaW5k ZXhPZihmb3JtYXRzLCJhcHBsaWNhdGlvbi92bmQub2djLnNlX3htbCIpPi0xKXty ZXR1cm4iYXBwbGljYXRpb24vdm5kLm9nYy5zZV94bWwiO30KcmV0dXJuIGZvcm1h dHNbMF07fSxpbWFnZUZvcm1hdDpmdW5jdGlvbihsYXllcil7dmFyIGZvcm1hdHM9 bGF5ZXIuZm9ybWF0cztpZihsYXllci5vcGFxdWUmJk9wZW5MYXllcnMuVXRpbC5p bmRleE9mKGZvcm1hdHMsImltYWdlL2pwZWciKT4tMSl7cmV0dXJuImltYWdlL2pw ZWciO30KaWYoT3BlbkxheWVycy5VdGlsLmluZGV4T2YoZm9ybWF0cywiaW1hZ2Uv cG5nIik+LTEpe3JldHVybiJpbWFnZS9wbmciO30KaWYoT3BlbkxheWVycy5VdGls LmluZGV4T2YoZm9ybWF0cywiaW1hZ2UvcG5nOyBtb2RlPTI0Yml0Iik+LTEpe3Jl dHVybiJpbWFnZS9wbmc7IG1vZGU9MjRiaXQiO30KaWYoT3BlbkxheWVycy5VdGls LmluZGV4T2YoZm9ybWF0cywiaW1hZ2UvZ2lmIik+LTEpe3JldHVybiJpbWFnZS9n aWYiO30KcmV0dXJuIGZvcm1hdHNbMF07fSxpbWFnZVRyYW5zcGFyZW50OmZ1bmN0 aW9uKGxheWVyKXtyZXR1cm4gbGF5ZXIub3BhcXVlPT11bmRlZmluZWR8fCFsYXll ci5vcGFxdWU7fSxyZWFkUmVjb3JkczpmdW5jdGlvbihkYXRhKXtpZih0eXBlb2Yg ZGF0YT09PSJzdHJpbmcifHxkYXRhLm5vZGVUeXBlKXtkYXRhPXRoaXMubWV0YS5m b3JtYXQucmVhZChkYXRhKTt9CnZhciB2ZXJzaW9uPWRhdGEudmVyc2lvbjt2YXIg Y2FwYWJpbGl0eT1kYXRhLmNhcGFiaWxpdHl8fHt9O3ZhciB1cmw9Y2FwYWJpbGl0 eS5yZXF1ZXN0JiZjYXBhYmlsaXR5LnJlcXVlc3QuZ2V0bWFwJiZjYXBhYmlsaXR5 LnJlcXVlc3QuZ2V0bWFwLmhyZWY7dmFyIGxheWVycz1jYXBhYmlsaXR5LmxheWVy czt2YXIgZm9ybWF0cz1jYXBhYmlsaXR5LmV4Y2VwdGlvbj9jYXBhYmlsaXR5LmV4 Y2VwdGlvbi5mb3JtYXRzOltdO3ZhciBleGNlcHRpb25zPXRoaXMuc2VydmljZUV4 Y2VwdGlvbkZvcm1hdChmb3JtYXRzKTt2YXIgcmVjb3Jkcz1bXTtpZih1cmwmJmxh eWVycyl7dmFyIGZpZWxkcz10aGlzLnJlY29yZFR5cGUucHJvdG90eXBlLmZpZWxk czt2YXIgbGF5ZXIsdmFsdWVzLG9wdGlvbnMscGFyYW1zLGZpZWxkLHY7Zm9yKHZh ciBpPTAsbGVuST1sYXllcnMubGVuZ3RoO2k8bGVuSTtpKyspe2xheWVyPWxheWVy c1tpXTtpZihsYXllci5uYW1lKXt2YWx1ZXM9e307Zm9yKHZhciBqPTAsbGVuSj1m aWVsZHMubGVuZ3RoO2o8bGVuSjtqKyspe2ZpZWxkPWZpZWxkcy5pdGVtc1tqXTt2 PWxheWVyW2ZpZWxkLm1hcHBpbmd8fGZpZWxkLm5hbWVdfHxmaWVsZC5kZWZhdWx0 VmFsdWU7dj1maWVsZC5jb252ZXJ0KHYpO3ZhbHVlc1tmaWVsZC5uYW1lXT12O30K b3B0aW9ucz17YXR0cmlidXRpb246bGF5ZXIuYXR0cmlidXRpb24/dGhpcy5hdHRy aWJ1dGlvbk1hcmt1cChsYXllci5hdHRyaWJ1dGlvbik6dW5kZWZpbmVkLG1pblNj YWxlOmxheWVyLm1pblNjYWxlLG1heFNjYWxlOmxheWVyLm1heFNjYWxlfTtpZih0 aGlzLm1ldGEubGF5ZXJPcHRpb25zKXtFeHQuYXBwbHkob3B0aW9ucyx0aGlzLm1l dGEubGF5ZXJPcHRpb25zKTt9CnBhcmFtcz17bGF5ZXJzOmxheWVyLm5hbWUsZXhj ZXB0aW9uczpleGNlcHRpb25zLGZvcm1hdDp0aGlzLmltYWdlRm9ybWF0KGxheWVy KSx0cmFuc3BhcmVudDp0aGlzLmltYWdlVHJhbnNwYXJlbnQobGF5ZXIpLHZlcnNp b246dmVyc2lvbn07aWYodGhpcy5tZXRhLmxheWVyUGFyYW1zKXtFeHQuYXBwbHko cGFyYW1zLHRoaXMubWV0YS5sYXllclBhcmFtcyk7fQp2YWx1ZXMubGF5ZXI9bmV3 IE9wZW5MYXllcnMuTGF5ZXIuV01TKGxheWVyLnRpdGxlfHxsYXllci5uYW1lLHVy bCxwYXJhbXMsb3B0aW9ucyk7cmVjb3Jkcy5wdXNoKG5ldyB0aGlzLnJlY29yZFR5 cGUodmFsdWVzLHZhbHVlcy5sYXllci5pZCkpO319fQpyZXR1cm57dG90YWxSZWNv cmRzOnJlY29yZHMubGVuZ3RoLHN1Y2Nlc3M6dHJ1ZSxyZWNvcmRzOnJlY29yZHN9 O30sYXR0cmlidXRpb25NYXJrdXA6ZnVuY3Rpb24oYXR0cmlidXRpb24pe3ZhciBt YXJrdXA9W107aWYoYXR0cmlidXRpb24ubG9nbyl7bWFya3VwLnB1c2goIjxpbWcg Y2xhc3M9JyIrdGhpcy5hdHRyaWJ1dGlvbkNscysiLWltYWdlJyAiCisic3JjPSci K2F0dHJpYnV0aW9uLmxvZ28uaHJlZisiJyAvPiIpO30KaWYoYXR0cmlidXRpb24u dGl0bGUpe21hcmt1cC5wdXNoKCI8c3BhbiBjbGFzcz0nIit0aGlzLmF0dHJpYnV0 aW9uQ2xzKyItdGl0bGUnPiIKK2F0dHJpYnV0aW9uLnRpdGxlCisiPC9zcGFuPiIp O30KaWYoYXR0cmlidXRpb24uaHJlZil7Zm9yKHZhciBpPTA7aTxtYXJrdXAubGVu Z3RoO2krKyl7bWFya3VwW2ldPSI8YSBjbGFzcz0nIgordGhpcy5hdHRyaWJ1dGlv bkNscysiLWxpbmsnICIKKyJocmVmPSIKK2F0dHJpYnV0aW9uLmhyZWYKKyI+Igor bWFya3VwW2ldCisiPC9hPiI7fX0KcmV0dXJuIG1hcmt1cC5qb2luKCIgIik7fX0p O0V4dC5uYW1lc3BhY2UoIkdlb0V4dC5kYXRhIik7R2VvRXh0LmRhdGEuTGF5ZXJT dG9yZU1peGluPWZ1bmN0aW9uKCl7cmV0dXJue21hcDpudWxsLHJlYWRlcjpudWxs LGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGNvbmZpZyl7Y29uZmlnPWNvbmZpZ3x8e307 Y29uZmlnLnJlYWRlcj1jb25maWcucmVhZGVyfHxuZXcgR2VvRXh0LmRhdGEuTGF5 ZXJSZWFkZXIoe30sY29uZmlnLmZpZWxkcyk7ZGVsZXRlIGNvbmZpZy5maWVsZHM7 dmFyIG1hcD1jb25maWcubWFwIGluc3RhbmNlb2YgR2VvRXh0Lk1hcFBhbmVsP2Nv bmZpZy5tYXAubWFwOmNvbmZpZy5tYXA7ZGVsZXRlIGNvbmZpZy5tYXA7aWYoY29u ZmlnLmxheWVycyl7Y29uZmlnLmRhdGE9Y29uZmlnLmxheWVyczt9CmRlbGV0ZSBj b25maWcubGF5ZXJzO3ZhciBvcHRpb25zPXtpbml0RGlyOmNvbmZpZy5pbml0RGly fTtkZWxldGUgY29uZmlnLmluaXREaXI7YXJndW1lbnRzLmNhbGxlZS5zdXBlcmNs YXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjb25maWcpO2lmKG1hcCl7dGhpcy5i aW5kKG1hcCxvcHRpb25zKTt9fSxiaW5kOmZ1bmN0aW9uKG1hcCxvcHRpb25zKXtp Zih0aGlzLm1hcCl7cmV0dXJuO30KdGhpcy5tYXA9bWFwO29wdGlvbnM9b3B0aW9u c3x8e307dmFyIGluaXREaXI9b3B0aW9ucy5pbml0RGlyO2lmKG9wdGlvbnMuaW5p dERpcj09dW5kZWZpbmVkKXtpbml0RGlyPUdlb0V4dC5kYXRhLkxheWVyU3RvcmUu TUFQX1RPX1NUT1JFfEdlb0V4dC5kYXRhLkxheWVyU3RvcmUuU1RPUkVfVE9fTUFQ O30KdmFyIGxheWVycz1tYXAubGF5ZXJzLnNsaWNlKDApO2lmKGluaXREaXImR2Vv RXh0LmRhdGEuTGF5ZXJTdG9yZS5TVE9SRV9UT19NQVApe3RoaXMuZWFjaChmdW5j dGlvbihyZWNvcmQpe3RoaXMubWFwLmFkZExheWVyKHJlY29yZC5nZXRMYXllcigp KTt9LHRoaXMpO30KaWYoaW5pdERpciZHZW9FeHQuZGF0YS5MYXllclN0b3JlLk1B UF9UT19TVE9SRSl7dGhpcy5sb2FkRGF0YShsYXllcnMsdHJ1ZSk7fQptYXAuZXZl bnRzLm9uKHsiY2hhbmdlbGF5ZXIiOnRoaXMub25DaGFuZ2VMYXllciwiYWRkbGF5 ZXIiOnRoaXMub25BZGRMYXllciwicmVtb3ZlbGF5ZXIiOnRoaXMub25SZW1vdmVM YXllcixzY29wZTp0aGlzfSk7dGhpcy5vbih7ImxvYWQiOnRoaXMub25Mb2FkLCJj bGVhciI6dGhpcy5vbkNsZWFyLCJhZGQiOnRoaXMub25BZGQsInJlbW92ZSI6dGhp cy5vblJlbW92ZSwidXBkYXRlIjp0aGlzLm9uVXBkYXRlLHNjb3BlOnRoaXN9KTt0 aGlzLmRhdGEub24oeyJyZXBsYWNlIjp0aGlzLm9uUmVwbGFjZSxzY29wZTp0aGlz fSk7fSx1bmJpbmQ6ZnVuY3Rpb24oKXtpZih0aGlzLm1hcCl7dGhpcy5tYXAuZXZl bnRzLnVuKHsiY2hhbmdlbGF5ZXIiOnRoaXMub25DaGFuZ2VMYXllciwiYWRkbGF5 ZXIiOnRoaXMub25BZGRMYXllciwicmVtb3ZlbGF5ZXIiOnRoaXMub25SZW1vdmVM YXllcixzY29wZTp0aGlzfSk7dGhpcy51bigibG9hZCIsdGhpcy5vbkxvYWQsdGhp cyk7dGhpcy51bigiY2xlYXIiLHRoaXMub25DbGVhcix0aGlzKTt0aGlzLnVuKCJh ZGQiLHRoaXMub25BZGQsdGhpcyk7dGhpcy51bigicmVtb3ZlIix0aGlzLm9uUmVt b3ZlLHRoaXMpO3RoaXMuZGF0YS51bigicmVwbGFjZSIsdGhpcy5vblJlcGxhY2Us dGhpcyk7dGhpcy5tYXA9bnVsbDt9fSxvbkNoYW5nZUxheWVyOmZ1bmN0aW9uKGV2 dCl7dmFyIGxheWVyPWV2dC5sYXllcjt2YXIgcmVjb3JkSW5kZXg9dGhpcy5maW5k QnkoZnVuY3Rpb24ocmVjLGlkKXtyZXR1cm4gcmVjLmdldExheWVyKCk9PT1sYXll cjt9KTtpZihyZWNvcmRJbmRleD4tMSl7dmFyIHJlY29yZD10aGlzLmdldEF0KHJl Y29yZEluZGV4KTtpZihldnQucHJvcGVydHk9PT0ib3JkZXIiKXtpZighdGhpcy5f YWRkaW5nJiYhdGhpcy5fcmVtb3Zpbmcpe3ZhciBsYXllckluZGV4PXRoaXMubWFw LmdldExheWVySW5kZXgobGF5ZXIpO2lmKGxheWVySW5kZXghPT1yZWNvcmRJbmRl eCl7dGhpcy5fcmVtb3Zpbmc9dHJ1ZTt0aGlzLnJlbW92ZShyZWNvcmQpO2RlbGV0 ZSB0aGlzLl9yZW1vdmluZzt0aGlzLl9hZGRpbmc9dHJ1ZTt0aGlzLmluc2VydChs YXllckluZGV4LFtyZWNvcmRdKTtkZWxldGUgdGhpcy5fYWRkaW5nO319fWVsc2Ug aWYoZXZ0LnByb3BlcnR5PT09Im5hbWUiKXtyZWNvcmQuc2V0KCJ0aXRsZSIsbGF5 ZXIubmFtZSk7fWVsc2V7dGhpcy5maXJlRXZlbnQoInVwZGF0ZSIsdGhpcyxyZWNv cmQsRXh0LmRhdGEuUmVjb3JkLkVESVQpO319fSxvbkFkZExheWVyOmZ1bmN0aW9u KGV2dCl7aWYoIXRoaXMuX2FkZGluZyl7dmFyIGxheWVyPWV2dC5sYXllcjt0aGlz Ll9hZGRpbmc9dHJ1ZTt0aGlzLmxvYWREYXRhKFtsYXllcl0sdHJ1ZSk7ZGVsZXRl IHRoaXMuX2FkZGluZzt9fSxvblJlbW92ZUxheWVyOmZ1bmN0aW9uKGV2dCl7aWYo dGhpcy5tYXAudW5sb2FkRGVzdHJveSl7aWYoIXRoaXMuX3JlbW92aW5nKXt2YXIg bGF5ZXI9ZXZ0LmxheWVyO3RoaXMuX3JlbW92aW5nPXRydWU7dGhpcy5yZW1vdmUo dGhpcy5nZXRCeUlkKGxheWVyLmlkKSk7ZGVsZXRlIHRoaXMuX3JlbW92aW5nO319 ZWxzZXt0aGlzLnVuYmluZCgpO319LG9uTG9hZDpmdW5jdGlvbihzdG9yZSxyZWNv cmRzLG9wdGlvbnMpe2lmKCFFeHQuaXNBcnJheShyZWNvcmRzKSl7cmVjb3Jkcz1b cmVjb3Jkc107fQppZihvcHRpb25zJiYhb3B0aW9ucy5hZGQpe3RoaXMuX3JlbW92 aW5nPXRydWU7Zm9yKHZhciBpPXRoaXMubWFwLmxheWVycy5sZW5ndGgtMTtpPj0w O2ktLSl7dGhpcy5tYXAucmVtb3ZlTGF5ZXIodGhpcy5tYXAubGF5ZXJzW2ldKTt9 CmRlbGV0ZSB0aGlzLl9yZW1vdmluZzt2YXIgbGVuPXJlY29yZHMubGVuZ3RoO2lm KGxlbj4wKXt2YXIgbGF5ZXJzPW5ldyBBcnJheShsZW4pO2Zvcih2YXIgaj0wO2o8 bGVuO2orKyl7bGF5ZXJzW2pdPXJlY29yZHNbal0uZ2V0TGF5ZXIoKTt9CnRoaXMu X2FkZGluZz10cnVlO3RoaXMubWFwLmFkZExheWVycyhsYXllcnMpO2RlbGV0ZSB0 aGlzLl9hZGRpbmc7fX19LG9uQ2xlYXI6ZnVuY3Rpb24oc3RvcmUpe3RoaXMuX3Jl bW92aW5nPXRydWU7Zm9yKHZhciBpPXRoaXMubWFwLmxheWVycy5sZW5ndGgtMTtp Pj0wO2ktLSl7dGhpcy5tYXAucmVtb3ZlTGF5ZXIodGhpcy5tYXAubGF5ZXJzW2ld KTt9CmRlbGV0ZSB0aGlzLl9yZW1vdmluZzt9LG9uQWRkOmZ1bmN0aW9uKHN0b3Jl LHJlY29yZHMsaW5kZXgpe2lmKCF0aGlzLl9hZGRpbmcpe3RoaXMuX2FkZGluZz10 cnVlO3ZhciBsYXllcjtmb3IodmFyIGk9cmVjb3Jkcy5sZW5ndGgtMTtpPj0wOy0t aSl7bGF5ZXI9cmVjb3Jkc1tpXS5nZXRMYXllcigpO3RoaXMubWFwLmFkZExheWVy KGxheWVyKTtpZihpbmRleCE9PXRoaXMubWFwLmxheWVycy5sZW5ndGgtMSl7dGhp cy5tYXAuc2V0TGF5ZXJJbmRleChsYXllcixpbmRleCk7fX0KZGVsZXRlIHRoaXMu X2FkZGluZzt9fSxvblJlbW92ZTpmdW5jdGlvbihzdG9yZSxyZWNvcmQsaW5kZXgp e2lmKCF0aGlzLl9yZW1vdmluZyl7dmFyIGxheWVyPXJlY29yZC5nZXRMYXllcigp O2lmKHRoaXMubWFwLmdldExheWVyKGxheWVyLmlkKSE9bnVsbCl7dGhpcy5fcmVt b3Zpbmc9dHJ1ZTt0aGlzLnJlbW92ZU1hcExheWVyKHJlY29yZCk7ZGVsZXRlIHRo aXMuX3JlbW92aW5nO319fSxvblVwZGF0ZTpmdW5jdGlvbihzdG9yZSxyZWNvcmQs b3BlcmF0aW9uKXtpZihvcGVyYXRpb249PT1FeHQuZGF0YS5SZWNvcmQuRURJVCl7 aWYocmVjb3JkLm1vZGlmaWVkJiZyZWNvcmQubW9kaWZpZWQudGl0bGUpe3ZhciBs YXllcj1yZWNvcmQuZ2V0TGF5ZXIoKTt2YXIgdGl0bGU9cmVjb3JkLmdldCgidGl0 bGUiKTtpZih0aXRsZSE9PWxheWVyLm5hbWUpe2xheWVyLnNldE5hbWUodGl0bGUp O319fX0scmVtb3ZlTWFwTGF5ZXI6ZnVuY3Rpb24ocmVjb3JkKXt0aGlzLm1hcC5y ZW1vdmVMYXllcihyZWNvcmQuZ2V0TGF5ZXIoKSk7fSxvblJlcGxhY2U6ZnVuY3Rp b24oa2V5LG9sZFJlY29yZCxuZXdSZWNvcmQpe3RoaXMucmVtb3ZlTWFwTGF5ZXIo b2xkUmVjb3JkKTt9LGdldEJ5TGF5ZXI6ZnVuY3Rpb24obGF5ZXIpe3ZhciBpbmRl eD10aGlzLmZpbmRCeShmdW5jdGlvbihyKXtyZXR1cm4gci5nZXRMYXllcigpPT09 bGF5ZXI7fSk7aWYoaW5kZXg+LTEpe3JldHVybiB0aGlzLmdldEF0KGluZGV4KTt9 fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy51bmJpbmQoKTtHZW9FeHQuZGF0YS5M YXllclN0b3JlLnN1cGVyY2xhc3MuZGVzdHJveS5jYWxsKHRoaXMpO319O307R2Vv RXh0LmRhdGEuTGF5ZXJTdG9yZT1FeHQuZXh0ZW5kKEV4dC5kYXRhLlN0b3JlLG5l dyBHZW9FeHQuZGF0YS5MYXllclN0b3JlTWl4aW4pO0dlb0V4dC5kYXRhLkxheWVy U3RvcmUuTUFQX1RPX1NUT1JFPTE7R2VvRXh0LmRhdGEuTGF5ZXJTdG9yZS5TVE9S RV9UT19NQVA9MjtFeHQubmFtZXNwYWNlKCJHZW9FeHQudHJlZSIpO0dlb0V4dC50 cmVlLkxheWVyTG9hZGVyPWZ1bmN0aW9uKGNvbmZpZyl7RXh0LmFwcGx5KHRoaXMs Y29uZmlnKTt0aGlzLmFkZEV2ZW50cygiYmVmb3JlbG9hZCIsImxvYWQiKTtHZW9F eHQudHJlZS5MYXllckxvYWRlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwo dGhpcyk7fTtFeHQuZXh0ZW5kKEdlb0V4dC50cmVlLkxheWVyTG9hZGVyLEV4dC51 dGlsLk9ic2VydmFibGUse3N0b3JlOm51bGwsZmlsdGVyOmZ1bmN0aW9uKHJlY29y ZCl7cmV0dXJuIHJlY29yZC5nZXRMYXllcigpLmRpc3BsYXlJbkxheWVyU3dpdGNo ZXI9PXRydWU7fSxiYXNlQXR0cnM6bnVsbCx1aVByb3ZpZGVyczpudWxsLGxvYWQ6 ZnVuY3Rpb24obm9kZSxjYWxsYmFjayl7aWYodGhpcy5maXJlRXZlbnQoImJlZm9y ZWxvYWQiLHRoaXMsbm9kZSkpe3RoaXMucmVtb3ZlU3RvcmVIYW5kbGVycygpO3do aWxlKG5vZGUuZmlyc3RDaGlsZCl7bm9kZS5yZW1vdmVDaGlsZChub2RlLmZpcnN0 Q2hpbGQpO30KaWYoIXRoaXMudWlQcm92aWRlcnMpe3RoaXMudWlQcm92aWRlcnM9 bm9kZS5nZXRPd25lclRyZWUoKS5nZXRMb2FkZXIoKS51aVByb3ZpZGVyczt9Cmlm KCF0aGlzLnN0b3JlKXt0aGlzLnN0b3JlPUdlb0V4dC5NYXBQYW5lbC5ndWVzcygp LmxheWVyczt9CnRoaXMuc3RvcmUuZWFjaChmdW5jdGlvbihyZWNvcmQpe3RoaXMu YWRkTGF5ZXJOb2RlKG5vZGUscmVjb3JkKTt9LHRoaXMpO3RoaXMuYWRkU3RvcmVI YW5kbGVycyhub2RlKTtpZih0eXBlb2YgY2FsbGJhY2s9PSJmdW5jdGlvbiIpe2Nh bGxiYWNrKCk7fQp0aGlzLmZpcmVFdmVudCgibG9hZCIsdGhpcyxub2RlKTt9fSxv blN0b3JlQWRkOmZ1bmN0aW9uKHN0b3JlLHJlY29yZHMsaW5kZXgsbm9kZSl7aWYo IXRoaXMuX3Jlb3JkZXJpbmcpe3ZhciBub2RlSW5kZXg9bm9kZS5yZWNvcmRJbmRl eFRvTm9kZUluZGV4KGluZGV4K3JlY29yZHMubGVuZ3RoLTEpO2Zvcih2YXIgaT0w O2k8cmVjb3Jkcy5sZW5ndGg7KytpKXt0aGlzLmFkZExheWVyTm9kZShub2RlLHJl Y29yZHNbaV0sbm9kZUluZGV4KTt9fX0sb25TdG9yZVJlbW92ZTpmdW5jdGlvbihz dG9yZSxyZWNvcmQsaW5kZXgsbm9kZSl7aWYoIXRoaXMuX3Jlb3JkZXJpbmcpe3Ro aXMucmVtb3ZlTGF5ZXJOb2RlKG5vZGUscmVjb3JkKTt9fSxhZGRMYXllck5vZGU6 ZnVuY3Rpb24obm9kZSxsYXllclJlY29yZCxpbmRleCl7aW5kZXg9aW5kZXh8fDA7 aWYodGhpcy5maWx0ZXIobGF5ZXJSZWNvcmQpPT09dHJ1ZSl7dmFyIGNoaWxkPXRo aXMuY3JlYXRlTm9kZSh7bm9kZVR5cGU6J2d4X2xheWVyJyxsYXllcjpsYXllclJl Y29yZC5nZXRMYXllcigpLGxheWVyU3RvcmU6dGhpcy5zdG9yZX0pO3ZhciBzaWJs aW5nPW5vZGUuaXRlbShpbmRleCk7aWYoc2libGluZyl7bm9kZS5pbnNlcnRCZWZv cmUoY2hpbGQsc2libGluZyk7fWVsc2V7bm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7 fQpjaGlsZC5vbigibW92ZSIsdGhpcy5vbkNoaWxkTW92ZSx0aGlzKTt9fSxyZW1v dmVMYXllck5vZGU6ZnVuY3Rpb24obm9kZSxsYXllclJlY29yZCl7aWYodGhpcy5m aWx0ZXIobGF5ZXJSZWNvcmQpPT09dHJ1ZSl7dmFyIGNoaWxkPW5vZGUuZmluZENo aWxkQnkoZnVuY3Rpb24obm9kZSl7cmV0dXJuIG5vZGUubGF5ZXI9PWxheWVyUmVj b3JkLmdldExheWVyKCk7fSk7aWYoY2hpbGQpe2NoaWxkLnVuKCJtb3ZlIix0aGlz Lm9uQ2hpbGRNb3ZlLHRoaXMpO2NoaWxkLnJlbW92ZSgpO25vZGUucmVsb2FkKCk7 fX19LG9uQ2hpbGRNb3ZlOmZ1bmN0aW9uKHRyZWUsbm9kZSxvbGRQYXJlbnQsbmV3 UGFyZW50LGluZGV4KXt0aGlzLl9yZW9yZGVyaW5nPXRydWU7dmFyIHJlY29yZD10 aGlzLnN0b3JlLmdldEJ5TGF5ZXIobm9kZS5sYXllcik7aWYobmV3UGFyZW50IGlu c3RhbmNlb2YgR2VvRXh0LnRyZWUuTGF5ZXJDb250YWluZXImJnRoaXMuc3RvcmU9 PT1uZXdQYXJlbnQubG9hZGVyLnN0b3JlKXtuZXdQYXJlbnQubG9hZGVyLl9yZW9y ZGVyaW5nPXRydWU7dGhpcy5zdG9yZS5yZW1vdmUocmVjb3JkKTt2YXIgbmV3UmVj b3JkSW5kZXg7aWYobmV3UGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoPjEpe3ZhciBz ZWFyY2hJbmRleD0oaW5kZXg9PT0wKT9pbmRleCsxOmluZGV4LTE7bmV3UmVjb3Jk SW5kZXg9dGhpcy5zdG9yZS5maW5kQnkoZnVuY3Rpb24ocil7cmV0dXJuIG5ld1Bh cmVudC5jaGlsZE5vZGVzW3NlYXJjaEluZGV4XS5sYXllcj09PXIuZ2V0TGF5ZXIo KTt9KTtpbmRleD09PTAmJm5ld1JlY29yZEluZGV4Kys7fWVsc2UgaWYob2xkUGFy ZW50LnBhcmVudE5vZGU9PT1uZXdQYXJlbnQucGFyZW50Tm9kZSl7dmFyIHByZXY9 bmV3UGFyZW50O2Rve3ByZXY9cHJldi5wcmV2aW91c1NpYmxpbmc7fXdoaWxlKHBy ZXYmJiEocHJldiBpbnN0YW5jZW9mIEdlb0V4dC50cmVlLkxheWVyQ29udGFpbmVy JiZwcmV2Lmxhc3RDaGlsZCkpO2lmKHByZXYpe25ld1JlY29yZEluZGV4PXRoaXMu c3RvcmUuZmluZEJ5KGZ1bmN0aW9uKHIpe3JldHVybiBwcmV2Lmxhc3RDaGlsZC5s YXllcj09PXIuZ2V0TGF5ZXIoKTt9KTt9ZWxzZXt2YXIgbmV4dD1uZXdQYXJlbnQ7 ZG97bmV4dD1uZXh0Lm5leHRTaWJsaW5nO313aGlsZShuZXh0JiYhKG5leHQgaW5z dGFuY2VvZiBHZW9FeHQudHJlZS5MYXllckNvbnRhaW5lciYmbmV4dC5maXJzdENo aWxkKSk7aWYobmV4dCl7bmV3UmVjb3JkSW5kZXg9dGhpcy5zdG9yZS5maW5kQnko ZnVuY3Rpb24ocil7cmV0dXJuIG5leHQuZmlyc3RDaGlsZC5sYXllcj09PXIuZ2V0 TGF5ZXIoKTt9KTt9Cm5ld1JlY29yZEluZGV4Kys7fX0KaWYobmV3UmVjb3JkSW5k ZXghPT11bmRlZmluZWQpe3RoaXMuc3RvcmUuaW5zZXJ0KG5ld1JlY29yZEluZGV4 LFtyZWNvcmRdKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe25ld1BhcmVu dC5yZWxvYWQoKTtvbGRQYXJlbnQucmVsb2FkKCk7fSk7fWVsc2V7dGhpcy5zdG9y ZS5pbnNlcnQob2xkUmVjb3JkSW5kZXgsW3JlY29yZF0pO30KZGVsZXRlIG5ld1Bh cmVudC5sb2FkZXIuX3Jlb3JkZXJpbmc7fQpkZWxldGUgdGhpcy5fcmVvcmRlcmlu Zzt9LGFkZFN0b3JlSGFuZGxlcnM6ZnVuY3Rpb24obm9kZSl7aWYoIXRoaXMuX3N0 b3JlSGFuZGxlcnMpe3RoaXMuX3N0b3JlSGFuZGxlcnM9eyJhZGQiOnRoaXMub25T dG9yZUFkZC5jcmVhdGVEZWxlZ2F0ZSh0aGlzLFtub2RlXSx0cnVlKSwicmVtb3Zl Ijp0aGlzLm9uU3RvcmVSZW1vdmUuY3JlYXRlRGVsZWdhdGUodGhpcyxbbm9kZV0s dHJ1ZSl9O2Zvcih2YXIgZXZ0IGluIHRoaXMuX3N0b3JlSGFuZGxlcnMpe3RoaXMu c3RvcmUub24oZXZ0LHRoaXMuX3N0b3JlSGFuZGxlcnNbZXZ0XSx0aGlzKTt9fX0s cmVtb3ZlU3RvcmVIYW5kbGVyczpmdW5jdGlvbigpe2lmKHRoaXMuX3N0b3JlSGFu ZGxlcnMpe2Zvcih2YXIgZXZ0IGluIHRoaXMuX3N0b3JlSGFuZGxlcnMpe3RoaXMu c3RvcmUudW4oZXZ0LHRoaXMuX3N0b3JlSGFuZGxlcnNbZXZ0XSx0aGlzKTt9CmRl bGV0ZSB0aGlzLl9zdG9yZUhhbmRsZXJzO319LGNyZWF0ZU5vZGU6ZnVuY3Rpb24o YXR0cil7aWYodGhpcy5iYXNlQXR0cnMpe0V4dC5hcHBseShhdHRyLHRoaXMuYmFz ZUF0dHJzKTt9CmlmKHR5cGVvZiBhdHRyLnVpUHJvdmlkZXI9PSdzdHJpbmcnKXth dHRyLnVpUHJvdmlkZXI9dGhpcy51aVByb3ZpZGVyc1thdHRyLnVpUHJvdmlkZXJd fHxldmFsKGF0dHIudWlQcm92aWRlcik7fQphdHRyLm5vZGVUeXBlPWF0dHIubm9k ZVR5cGV8fCJneF9sYXllciI7cmV0dXJuIG5ldyBFeHQudHJlZS5UcmVlUGFuZWwu bm9kZVR5cGVzW2F0dHIubm9kZVR5cGVdKGF0dHIpO30sZGVzdHJveTpmdW5jdGlv bigpe3RoaXMucmVtb3ZlU3RvcmVIYW5kbGVycygpO319KTtFeHQubmFtZXNwYWNl KCJHZW9FeHQucGx1Z2lucyIpO0dlb0V4dC5wbHVnaW5zLlByaW50UHJvdmlkZXJG aWVsZD1FeHQuZXh0ZW5kKEV4dC51dGlsLk9ic2VydmFibGUse3RhcmdldDpudWxs LGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGNvbmZpZyl7dGhpcy5pbml0aWFsQ29uZmln PWNvbmZpZztFeHQuYXBwbHkodGhpcyxjb25maWcpO0dlb0V4dC5wbHVnaW5zLlBy aW50UHJvdmlkZXJGaWVsZC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRo aXMsYXJndW1lbnRzKTt9LGluaXQ6ZnVuY3Rpb24odGFyZ2V0KXt0aGlzLnRhcmdl dD10YXJnZXQ7dmFyIG9uQ2ZnPXtzY29wZTp0aGlzLCJyZW5kZXIiOnRoaXMub25S ZW5kZXIsImJlZm9yZWRlc3Ryb3kiOnRoaXMub25CZWZvcmVEZXN0cm95fTtvbkNm Z1t0YXJnZXQgaW5zdGFuY2VvZiBFeHQuZm9ybS5Db21ib0JveD8ic2VsZWN0Ijoi dmFsaWQiXT10aGlzLm9uRmllbGRDaGFuZ2U7dGFyZ2V0Lm9uKG9uQ2ZnKTt9LG9u UmVuZGVyOmZ1bmN0aW9uKGZpZWxkKXt2YXIgcHJpbnRQcm92aWRlcj10aGlzLnBy aW50UHJvdmlkZXJ8fGZpZWxkLm93bmVyQ3QucHJpbnRQcm92aWRlcjtpZihmaWVs ZC5zdG9yZT09PXByaW50UHJvdmlkZXIubGF5b3V0cyl7ZmllbGQuc2V0VmFsdWUo cHJpbnRQcm92aWRlci5sYXlvdXQuZ2V0KGZpZWxkLmRpc3BsYXlGaWVsZCkpO3By aW50UHJvdmlkZXIub24oeyJsYXlvdXRjaGFuZ2UiOnRoaXMub25Qcm92aWRlckNo YW5nZSxzY29wZTp0aGlzfSk7fWVsc2UgaWYoZmllbGQuc3RvcmU9PT1wcmludFBy b3ZpZGVyLmRwaXMpe2ZpZWxkLnNldFZhbHVlKHByaW50UHJvdmlkZXIuZHBpLmdl dChmaWVsZC5kaXNwbGF5RmllbGQpKTtwcmludFByb3ZpZGVyLm9uKHsiZHBpY2hh bmdlIjp0aGlzLm9uUHJvdmlkZXJDaGFuZ2Usc2NvcGU6dGhpc30pO31lbHNlIGlm KGZpZWxkLmluaXRpYWxDb25maWcudmFsdWU9PT11bmRlZmluZWQpe2ZpZWxkLnNl dFZhbHVlKHByaW50UHJvdmlkZXIuY3VzdG9tUGFyYW1zW2ZpZWxkLm5hbWVdKTt9 fSxvbkZpZWxkQ2hhbmdlOmZ1bmN0aW9uKGZpZWxkLHJlY29yZCl7dmFyIHByaW50 UHJvdmlkZXI9dGhpcy5wcmludFByb3ZpZGVyfHxmaWVsZC5vd25lckN0LnByaW50 UHJvdmlkZXI7dmFyIHZhbHVlPWZpZWxkLmdldFZhbHVlKCk7dGhpcy5fdXBkYXRp bmc9dHJ1ZTtpZihyZWNvcmQpe3N3aXRjaChmaWVsZC5zdG9yZSl7Y2FzZSBwcmlu dFByb3ZpZGVyLmxheW91dHM6cHJpbnRQcm92aWRlci5zZXRMYXlvdXQocmVjb3Jk KTticmVhaztjYXNlIHByaW50UHJvdmlkZXIuZHBpczpwcmludFByb3ZpZGVyLnNl dERwaShyZWNvcmQpO319ZWxzZXtwcmludFByb3ZpZGVyLmN1c3RvbVBhcmFtc1tm aWVsZC5uYW1lXT12YWx1ZTt9CmRlbGV0ZSB0aGlzLl91cGRhdGluZzt9LG9uUHJv dmlkZXJDaGFuZ2U6ZnVuY3Rpb24ocHJpbnRQcm92aWRlcixyZWMpe2lmKCF0aGlz Ll91cGRhdGluZyl7dGhpcy50YXJnZXQuc2V0VmFsdWUocmVjLmdldCh0aGlzLnRh cmdldC5kaXNwbGF5RmllbGQpKTt9fSxvbkJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24o KXt0aGlzLnRhcmdldC51bigiYmVmb3JlZGVzdHJveSIsdGhpcy5vbkJlZm9yZURl c3Ryb3ksdGhpcyk7dGhpcy50YXJnZXQudW4oInJlbmRlciIsdGhpcy5vblJlbmRl cix0aGlzKTt0aGlzLnRhcmdldC51bigic2VsZWN0Iix0aGlzLm9uRmllbGRDaGFu Z2UsdGhpcyk7dGhpcy50YXJnZXQudW4oInZhbGlkIix0aGlzLm9uRmllbGRDaGFu Z2UsdGhpcyk7dGhpcy5wcmludFByb3ZpZGVyLnVuKCJsYXlvdXRjaGFuZ2UiLHRo aXMub25Qcm92aWRlckNoYW5nZSx0aGlzKTt0aGlzLnByaW50UHJvdmlkZXIudW4o ImRwaWNoYW5nZSIsdGhpcy5vblByb3ZpZGVyQ2hhbmdlLHRoaXMpO319KTtFeHQu cHJlZygiZ3hfcHJpbnRwcm92aWRlcmZpZWxkIixHZW9FeHQucGx1Z2lucy5Qcmlu dFByb3ZpZGVyRmllbGQpO0V4dC5uYW1lc3BhY2UoIkdlb0V4dCIsIkdlb0V4dC5k YXRhIik7R2VvRXh0LmRhdGEuTGF5ZXJSZWFkZXI9ZnVuY3Rpb24obWV0YSxyZWNv cmRUeXBlKXttZXRhPW1ldGF8fHt9O2lmKCEocmVjb3JkVHlwZSBpbnN0YW5jZW9m IEZ1bmN0aW9uKSl7cmVjb3JkVHlwZT1HZW9FeHQuZGF0YS5MYXllclJlY29yZC5j cmVhdGUocmVjb3JkVHlwZXx8bWV0YS5maWVsZHN8fHt9KTt9Ckdlb0V4dC5kYXRh LkxheWVyUmVhZGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLG1l dGEscmVjb3JkVHlwZSk7fTtFeHQuZXh0ZW5kKEdlb0V4dC5kYXRhLkxheWVyUmVh ZGVyLEV4dC5kYXRhLkRhdGFSZWFkZXIse3RvdGFsUmVjb3JkczpudWxsLHJlYWRS ZWNvcmRzOmZ1bmN0aW9uKGxheWVycyl7dmFyIHJlY29yZHM9W107aWYobGF5ZXJz KXt2YXIgcmVjb3JkVHlwZT10aGlzLnJlY29yZFR5cGUsZmllbGRzPXJlY29yZFR5 cGUucHJvdG90eXBlLmZpZWxkczt2YXIgaSxsZW5JLGosbGVuSixsYXllcix2YWx1 ZXMsZmllbGQsdjtmb3IoaT0wLGxlbkk9bGF5ZXJzLmxlbmd0aDtpPGxlbkk7aSsr KXtsYXllcj1sYXllcnNbaV07dmFsdWVzPXt9O2ZvcihqPTAsbGVuSj1maWVsZHMu bGVuZ3RoO2o8bGVuSjtqKyspe2ZpZWxkPWZpZWxkcy5pdGVtc1tqXTt2PWxheWVy W2ZpZWxkLm1hcHBpbmd8fGZpZWxkLm5hbWVdfHxmaWVsZC5kZWZhdWx0VmFsdWU7 dj1maWVsZC5jb252ZXJ0KHYpO3ZhbHVlc1tmaWVsZC5uYW1lXT12O30KdmFsdWVz LmxheWVyPWxheWVyO3JlY29yZHNbcmVjb3Jkcy5sZW5ndGhdPW5ldyByZWNvcmRU eXBlKHZhbHVlcyxsYXllci5pZCk7fX0KcmV0dXJue3JlY29yZHM6cmVjb3Jkcyx0 b3RhbFJlY29yZHM6dGhpcy50b3RhbFJlY29yZHMhPW51bGw/dGhpcy50b3RhbFJl Y29yZHM6cmVjb3Jkcy5sZW5ndGh9O319KTtFeHQubmFtZXNwYWNlKCJHZW9FeHQu ZGF0YSIpO0dlb0V4dC5kYXRhLldNU0Rlc2NyaWJlTGF5ZXJTdG9yZT1mdW5jdGlv bihjKXtjPWN8fHt9O0dlb0V4dC5kYXRhLldNU0Rlc2NyaWJlTGF5ZXJTdG9yZS5z dXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxFeHQuYXBwbHkoYyx7cHJv eHk6Yy5wcm94eXx8KCFjLmRhdGE/bmV3IEV4dC5kYXRhLkh0dHBQcm94eSh7dXJs OmMudXJsLGRpc2FibGVDYWNoaW5nOmZhbHNlLG1ldGhvZDoiR0VUIn0pOnVuZGVm aW5lZCkscmVhZGVyOm5ldyBHZW9FeHQuZGF0YS5XTVNEZXNjcmliZUxheWVyUmVh ZGVyKGMsYy5maWVsZHMpfSkpO307RXh0LmV4dGVuZChHZW9FeHQuZGF0YS5XTVNE ZXNjcmliZUxheWVyU3RvcmUsRXh0LmRhdGEuU3RvcmUpO0V4dC5uYW1lc3BhY2Uo Ikdlb0V4dC5mb3JtIik7R2VvRXh0LmZvcm0uQmFzaWNGb3JtPUV4dC5leHRlbmQo RXh0LmZvcm0uQmFzaWNGb3JtLHtwcm90b2NvbDpudWxsLHByZXZSZXNwb25zZTpu dWxsLGF1dG9BYm9ydDp0cnVlLGRvQWN0aW9uOmZ1bmN0aW9uKGFjdGlvbixvcHRp b25zKXtpZihhY3Rpb249PSJzZWFyY2giKXtvcHRpb25zPUV4dC5hcHBseUlmKG9w dGlvbnN8fHt9LHtwcm90b2NvbDp0aGlzLnByb3RvY29sLGFib3J0UHJldmlvdXM6 dGhpcy5hdXRvQWJvcnR9KTthY3Rpb249bmV3IEdlb0V4dC5mb3JtLlNlYXJjaEFj dGlvbih0aGlzLG9wdGlvbnMpO30KcmV0dXJuIEdlb0V4dC5mb3JtLkJhc2ljRm9y bS5zdXBlcmNsYXNzLmRvQWN0aW9uLmNhbGwodGhpcyxhY3Rpb24sb3B0aW9ucyk7 fSxzZWFyY2g6ZnVuY3Rpb24ob3B0aW9ucyl7cmV0dXJuIHRoaXMuZG9BY3Rpb24o InNlYXJjaCIsb3B0aW9ucyk7fX0pO0V4dC5uYW1lc3BhY2UoIkdlb0V4dC50cmVl Iik7R2VvRXh0LnRyZWUuTGF5ZXJQYXJhbUxvYWRlcj1mdW5jdGlvbihjb25maWcp e0V4dC5hcHBseSh0aGlzLGNvbmZpZyk7dGhpcy5hZGRFdmVudHMoImJlZm9yZWxv YWQiLCJsb2FkIik7R2VvRXh0LnRyZWUuTGF5ZXJQYXJhbUxvYWRlci5zdXBlcmNs YXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7fTtFeHQuZXh0ZW5kKEdlb0V4dC50 cmVlLkxheWVyUGFyYW1Mb2FkZXIsRXh0LnV0aWwuT2JzZXJ2YWJsZSx7cGFyYW06 bnVsbCxkZWxpbWl0ZXI6IiwiLGxvYWQ6ZnVuY3Rpb24obm9kZSxjYWxsYmFjayl7 aWYodGhpcy5maXJlRXZlbnQoImJlZm9yZWxvYWQiLHRoaXMsbm9kZSkpe3doaWxl KG5vZGUuZmlyc3RDaGlsZCl7bm9kZS5yZW1vdmVDaGlsZChub2RlLmZpcnN0Q2hp bGQpO30KdmFyIHBhcmFtVmFsdWU9KG5vZGUubGF5ZXIgaW5zdGFuY2VvZiBPcGVu TGF5ZXJzLkxheWVyLkhUVFBSZXF1ZXN0KSYmbm9kZS5sYXllci5wYXJhbXNbdGhp cy5wYXJhbV07aWYocGFyYW1WYWx1ZSl7dmFyIGl0ZW1zPShwYXJhbVZhbHVlIGlu c3RhbmNlb2YgQXJyYXkpP3BhcmFtVmFsdWUuc2xpY2UoKTpwYXJhbVZhbHVlLnNw bGl0KHRoaXMuZGVsaW1pdGVyKTtFeHQuZWFjaChpdGVtcyxmdW5jdGlvbihpdGVt LGluZGV4LGFsbEl0ZW1zKXt0aGlzLmFkZFBhcmFtTm9kZShpdGVtLGFsbEl0ZW1z LG5vZGUpO30sdGhpcyk7fQppZih0eXBlb2YgY2FsbGJhY2s9PSJmdW5jdGlvbiIp e2NhbGxiYWNrKCk7fQp0aGlzLmZpcmVFdmVudCgibG9hZCIsdGhpcyxub2RlKTt9 fSxhZGRQYXJhbU5vZGU6ZnVuY3Rpb24ocGFyYW1JdGVtLGFsbFBhcmFtSXRlbXMs bm9kZSl7dmFyIGNoaWxkPXRoaXMuY3JlYXRlTm9kZSh7bGF5ZXI6bm9kZS5sYXll cixwYXJhbTp0aGlzLnBhcmFtLGl0ZW06cGFyYW1JdGVtLGFsbEl0ZW1zOmFsbFBh cmFtSXRlbXMsZGVsaW1pdGVyOnRoaXMuZGVsaW1pdGVyfSk7dmFyIHNpYmxpbmc9 bm9kZS5pdGVtKDApO2lmKHNpYmxpbmcpe25vZGUuaW5zZXJ0QmVmb3JlKGNoaWxk LHNpYmxpbmcpO31lbHNle25vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpO319LGNyZWF0 ZU5vZGU6ZnVuY3Rpb24oYXR0cil7aWYodGhpcy5iYXNlQXR0cnMpe0V4dC5hcHBs eShhdHRyLHRoaXMuYmFzZUF0dHJzKTt9CmlmKHR5cGVvZiBhdHRyLnVpUHJvdmlk ZXI9PSdzdHJpbmcnKXthdHRyLnVpUHJvdmlkZXI9dGhpcy51aVByb3ZpZGVyc1th dHRyLnVpUHJvdmlkZXJdfHxldmFsKGF0dHIudWlQcm92aWRlcik7fQphdHRyLm5v ZGVUeXBlPWF0dHIubm9kZVR5cGV8fCJneF9sYXllcnBhcmFtIjtyZXR1cm4gbmV3 IEV4dC50cmVlLlRyZWVQYW5lbC5ub2RlVHlwZXNbYXR0ci5ub2RlVHlwZV0oYXR0 cik7fX0pO0V4dC5uYW1lc3BhY2UoJ0dlb0V4dC5ncmlkJyk7R2VvRXh0LmdyaWQu RmVhdHVyZVNlbGVjdGlvbk1vZGVsTWl4aW49ZnVuY3Rpb24oKXtyZXR1cm57YXV0 b0FjdGl2YXRlQ29udHJvbDp0cnVlLGxheWVyRnJvbVN0b3JlOnRydWUsc2VsZWN0 Q29udHJvbDpudWxsLGJvdW5kOmZhbHNlLHN1cGVyY2xhc3M6bnVsbCxjb25zdHJ1 Y3RvcjpmdW5jdGlvbihjb25maWcpe2NvbmZpZz1jb25maWd8fHt9O2lmKGNvbmZp Zy5zZWxlY3RDb250cm9sIGluc3RhbmNlb2YgT3BlbkxheWVycy5Db250cm9sLlNl bGVjdEZlYXR1cmUpe2lmKCFjb25maWcuc2luZ2xlU2VsZWN0KXt2YXIgY3RybD1j b25maWcuc2VsZWN0Q29udHJvbDtjb25maWcuc2luZ2xlU2VsZWN0PSEoY3RybC5t dWx0aXBsZXx8ISFjdHJsLm11bHRpcGxlS2V5KTt9fWVsc2UgaWYoY29uZmlnLmxh eWVyIGluc3RhbmNlb2YgT3BlbkxheWVycy5MYXllci5WZWN0b3Ipe3RoaXMuc2Vs ZWN0Q29udHJvbD10aGlzLmNyZWF0ZVNlbGVjdENvbnRyb2woY29uZmlnLmxheWVy LGNvbmZpZy5zZWxlY3RDb250cm9sKTtkZWxldGUgY29uZmlnLmxheWVyO2RlbGV0 ZSBjb25maWcuc2VsZWN0Q29udHJvbDt9CnRoaXMuc3VwZXJjbGFzcz1hcmd1bWVu dHMuY2FsbGVlLnN1cGVyY2xhc3M7dGhpcy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9y LmNhbGwodGhpcyxjb25maWcpO30saW5pdEV2ZW50czpmdW5jdGlvbigpe3RoaXMu c3VwZXJjbGFzcy5pbml0RXZlbnRzLmNhbGwodGhpcyk7aWYodGhpcy5sYXllckZy b21TdG9yZSl7dmFyIGxheWVyPXRoaXMuZ3JpZC5nZXRTdG9yZSgpJiZ0aGlzLmdy aWQuZ2V0U3RvcmUoKS5sYXllcjtpZihsYXllciYmISh0aGlzLnNlbGVjdENvbnRy b2wgaW5zdGFuY2VvZiBPcGVuTGF5ZXJzLkNvbnRyb2wuU2VsZWN0RmVhdHVyZSkp e3RoaXMuc2VsZWN0Q29udHJvbD10aGlzLmNyZWF0ZVNlbGVjdENvbnRyb2wobGF5 ZXIsdGhpcy5zZWxlY3RDb250cm9sKTt9fQppZih0aGlzLnNlbGVjdENvbnRyb2wp e3RoaXMuYmluZCh0aGlzLnNlbGVjdENvbnRyb2wpO319LGNyZWF0ZVNlbGVjdENv bnRyb2w6ZnVuY3Rpb24obGF5ZXIsY29uZmlnKXtjb25maWc9Y29uZmlnfHx7fTt2 YXIgc2luZ2xlU2VsZWN0PWNvbmZpZy5zaW5nbGVTZWxlY3QhPT11bmRlZmluZWQ/ Y29uZmlnLnNpbmdsZVNlbGVjdDp0aGlzLnNpbmdsZVNlbGVjdDtjb25maWc9T3Bl bkxheWVycy5VdGlsLmV4dGVuZCh7dG9nZ2xlOnRydWUsbXVsdGlwbGVLZXk6c2lu Z2xlU2VsZWN0P251bGw6KEV4dC5pc01hYz8ibWV0YUtleSI6ImN0cmxLZXkiKX0s Y29uZmlnKTt2YXIgc2VsZWN0Q29udHJvbD1uZXcgT3BlbkxheWVycy5Db250cm9s LlNlbGVjdEZlYXR1cmUobGF5ZXIsY29uZmlnKTtsYXllci5tYXAuYWRkQ29udHJv bChzZWxlY3RDb250cm9sKTtyZXR1cm4gc2VsZWN0Q29udHJvbDt9LGJpbmQ6ZnVu Y3Rpb24ob2JqLG9wdGlvbnMpe2lmKCF0aGlzLmJvdW5kKXtvcHRpb25zPW9wdGlv bnN8fHt9O3RoaXMuc2VsZWN0Q29udHJvbD1vYmo7aWYob2JqIGluc3RhbmNlb2Yg T3BlbkxheWVycy5MYXllci5WZWN0b3Ipe3RoaXMuc2VsZWN0Q29udHJvbD10aGlz LmNyZWF0ZVNlbGVjdENvbnRyb2wob2JqLG9wdGlvbnMuY29udHJvbENvbmZpZyk7 fQppZih0aGlzLmF1dG9BY3RpdmF0ZUNvbnRyb2wpe3RoaXMuc2VsZWN0Q29udHJv bC5hY3RpdmF0ZSgpO30KdmFyIGxheWVycz10aGlzLmdldExheWVycygpO2Zvcih2 YXIgaT0wLGxlbj1sYXllcnMubGVuZ3RoO2k8bGVuO2krKyl7bGF5ZXJzW2ldLmV2 ZW50cy5vbih7ZmVhdHVyZXNlbGVjdGVkOnRoaXMuZmVhdHVyZVNlbGVjdGVkLGZl YXR1cmV1bnNlbGVjdGVkOnRoaXMuZmVhdHVyZVVuc2VsZWN0ZWQsc2NvcGU6dGhp c30pO30KdGhpcy5vbigicm93c2VsZWN0Iix0aGlzLnJvd1NlbGVjdGVkLHRoaXMp O3RoaXMub24oInJvd2Rlc2VsZWN0Iix0aGlzLnJvd0Rlc2VsZWN0ZWQsdGhpcyk7 dGhpcy5ib3VuZD10cnVlO30KcmV0dXJuIHRoaXMuc2VsZWN0Q29udHJvbDt9LHVu YmluZDpmdW5jdGlvbigpe3ZhciBzZWxlY3RDb250cm9sPXRoaXMuc2VsZWN0Q29u dHJvbDtpZih0aGlzLmJvdW5kKXt2YXIgbGF5ZXJzPXRoaXMuZ2V0TGF5ZXJzKCk7 Zm9yKHZhciBpPTAsbGVuPWxheWVycy5sZW5ndGg7aTxsZW47aSsrKXtsYXllcnNb aV0uZXZlbnRzLnVuKHtmZWF0dXJlc2VsZWN0ZWQ6dGhpcy5mZWF0dXJlU2VsZWN0 ZWQsZmVhdHVyZXVuc2VsZWN0ZWQ6dGhpcy5mZWF0dXJlVW5zZWxlY3RlZCxzY29w ZTp0aGlzfSk7fQp0aGlzLnVuKCJyb3dzZWxlY3QiLHRoaXMucm93U2VsZWN0ZWQs dGhpcyk7dGhpcy51bigicm93ZGVzZWxlY3QiLHRoaXMucm93RGVzZWxlY3RlZCx0 aGlzKTtpZih0aGlzLmF1dG9BY3RpdmF0ZUNvbnRyb2wpe3NlbGVjdENvbnRyb2wu ZGVhY3RpdmF0ZSgpO30KdGhpcy5zZWxlY3RDb250cm9sPW51bGw7dGhpcy5ib3Vu ZD1mYWxzZTt9CnJldHVybiBzZWxlY3RDb250cm9sO30sZmVhdHVyZVNlbGVjdGVk OmZ1bmN0aW9uKGV2dCl7aWYoIXRoaXMuX3NlbGVjdGluZyl7dmFyIHN0b3JlPXRo aXMuZ3JpZC5zdG9yZTt2YXIgcm93PXN0b3JlLmZpbmRCeShmdW5jdGlvbihyZWNv cmQsaWQpe3JldHVybiByZWNvcmQuZ2V0RmVhdHVyZSgpPT1ldnQuZmVhdHVyZTt9 KTtpZihyb3chPS0xJiYhdGhpcy5pc1NlbGVjdGVkKHJvdykpe3RoaXMuX3NlbGVj dGluZz10cnVlO3RoaXMuc2VsZWN0Um93KHJvdywhdGhpcy5zaW5nbGVTZWxlY3Qp O3RoaXMuX3NlbGVjdGluZz1mYWxzZTt0aGlzLmdyaWQuZ2V0VmlldygpLmZvY3Vz Um93KHJvdyk7fX19LGZlYXR1cmVVbnNlbGVjdGVkOmZ1bmN0aW9uKGV2dCl7aWYo IXRoaXMuX3NlbGVjdGluZyl7dmFyIHN0b3JlPXRoaXMuZ3JpZC5zdG9yZTt2YXIg cm93PXN0b3JlLmZpbmRCeShmdW5jdGlvbihyZWNvcmQsaWQpe3JldHVybiByZWNv cmQuZ2V0RmVhdHVyZSgpPT1ldnQuZmVhdHVyZTt9KTtpZihyb3chPS0xJiZ0aGlz LmlzU2VsZWN0ZWQocm93KSl7dGhpcy5fc2VsZWN0aW5nPXRydWU7dGhpcy5kZXNl bGVjdFJvdyhyb3cpO3RoaXMuX3NlbGVjdGluZz1mYWxzZTt0aGlzLmdyaWQuZ2V0 VmlldygpLmZvY3VzUm93KHJvdyk7fX19LHJvd1NlbGVjdGVkOmZ1bmN0aW9uKG1v ZGVsLHJvdyxyZWNvcmQpe3ZhciBmZWF0dXJlPXJlY29yZC5nZXRGZWF0dXJlKCk7 aWYoIXRoaXMuX3NlbGVjdGluZyYmZmVhdHVyZSl7dmFyIGxheWVycz10aGlzLmdl dExheWVycygpO2Zvcih2YXIgaT0wLGxlbj1sYXllcnMubGVuZ3RoO2k8bGVuO2kr Kyl7aWYobGF5ZXJzW2ldLnNlbGVjdGVkRmVhdHVyZXMuaW5kZXhPZihmZWF0dXJl KT09LTEpe3RoaXMuX3NlbGVjdGluZz10cnVlO3RoaXMuc2VsZWN0Q29udHJvbC5z ZWxlY3QoZmVhdHVyZSk7dGhpcy5fc2VsZWN0aW5nPWZhbHNlO2JyZWFrO319fX0s cm93RGVzZWxlY3RlZDpmdW5jdGlvbihtb2RlbCxyb3cscmVjb3JkKXt2YXIgZmVh dHVyZT1yZWNvcmQuZ2V0RmVhdHVyZSgpO2lmKCF0aGlzLl9zZWxlY3RpbmcmJmZl YXR1cmUpe3ZhciBsYXllcnM9dGhpcy5nZXRMYXllcnMoKTtmb3IodmFyIGk9MCxs ZW49bGF5ZXJzLmxlbmd0aDtpPGxlbjtpKyspe2lmKGxheWVyc1tpXS5zZWxlY3Rl ZEZlYXR1cmVzLmluZGV4T2YoZmVhdHVyZSkhPS0xKXt0aGlzLl9zZWxlY3Rpbmc9 dHJ1ZTt0aGlzLnNlbGVjdENvbnRyb2wudW5zZWxlY3QoZmVhdHVyZSk7dGhpcy5f c2VsZWN0aW5nPWZhbHNlO2JyZWFrO319fX0sZ2V0TGF5ZXJzOmZ1bmN0aW9uKCl7 cmV0dXJuIHRoaXMuc2VsZWN0Q29udHJvbC5sYXllcnN8fFt0aGlzLnNlbGVjdENv bnRyb2wubGF5ZXJdO319O307R2VvRXh0LmdyaWQuRmVhdHVyZVNlbGVjdGlvbk1v ZGVsPUV4dC5leHRlbmQoRXh0LmdyaWQuUm93U2VsZWN0aW9uTW9kZWwsbmV3IEdl b0V4dC5ncmlkLkZlYXR1cmVTZWxlY3Rpb25Nb2RlbE1peGluKTtFeHQubmFtZXNw YWNlKCdHZW9FeHQnLCdHZW9FeHQuZGF0YScpO0dlb0V4dC5kYXRhLkZlYXR1cmVS ZWFkZXI9ZnVuY3Rpb24obWV0YSxyZWNvcmRUeXBlKXttZXRhPW1ldGF8fHt9O2lm KCEocmVjb3JkVHlwZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl7cmVjb3JkVHlwZT1H ZW9FeHQuZGF0YS5GZWF0dXJlUmVjb3JkLmNyZWF0ZShyZWNvcmRUeXBlfHxtZXRh LmZpZWxkc3x8e30pO30KR2VvRXh0LmRhdGEuRmVhdHVyZVJlYWRlci5zdXBlcmNs YXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxtZXRhLHJlY29yZFR5cGUpO307RXh0 LmV4dGVuZChHZW9FeHQuZGF0YS5GZWF0dXJlUmVhZGVyLEV4dC5kYXRhLkRhdGFS ZWFkZXIse3RvdGFsUmVjb3JkczpudWxsLHJlYWQ6ZnVuY3Rpb24ocmVzcG9uc2Up e3JldHVybiB0aGlzLnJlYWRSZWNvcmRzKHJlc3BvbnNlLmZlYXR1cmVzKTt9LHJl YWRSZWNvcmRzOmZ1bmN0aW9uKGZlYXR1cmVzKXt2YXIgcmVjb3Jkcz1bXTtpZihm ZWF0dXJlcyl7dmFyIHJlY29yZFR5cGU9dGhpcy5yZWNvcmRUeXBlLGZpZWxkcz1y ZWNvcmRUeXBlLnByb3RvdHlwZS5maWVsZHM7dmFyIGksbGVuSSxqLGxlbkosZmVh dHVyZSx2YWx1ZXMsZmllbGQsdjtmb3IoaT0wLGxlbkk9ZmVhdHVyZXMubGVuZ3Ro O2k8bGVuSTtpKyspe2ZlYXR1cmU9ZmVhdHVyZXNbaV07dmFsdWVzPXt9O2lmKGZl YXR1cmUuYXR0cmlidXRlcyl7Zm9yKGo9MCxsZW5KPWZpZWxkcy5sZW5ndGg7ajxs ZW5KO2orKyl7ZmllbGQ9ZmllbGRzLml0ZW1zW2pdO2lmKC9bXFtcLl0vLnRlc3Qo ZmllbGQubWFwcGluZykpe3RyeXt2PW5ldyBGdW5jdGlvbigib2JqIiwicmV0dXJu IG9iai4iK2ZpZWxkLm1hcHBpbmcpKGZlYXR1cmUuYXR0cmlidXRlcyk7fWNhdGNo KGUpe3Y9ZmllbGQuZGVmYXVsdFZhbHVlO319CmVsc2V7dj1mZWF0dXJlLmF0dHJp YnV0ZXNbZmllbGQubWFwcGluZ3x8ZmllbGQubmFtZV18fGZpZWxkLmRlZmF1bHRW YWx1ZTt9CmlmKGZpZWxkLmNvbnZlcnQpe3Y9ZmllbGQuY29udmVydCh2KTt9CnZh bHVlc1tmaWVsZC5uYW1lXT12O319CnZhbHVlcy5mZWF0dXJlPWZlYXR1cmU7dmFs dWVzLnN0YXRlPWZlYXR1cmUuc3RhdGU7dmFsdWVzLmZpZD1mZWF0dXJlLmZpZDt2 YXIgaWQ9KGZlYXR1cmUuc3RhdGU9PT1PcGVuTGF5ZXJzLlN0YXRlLklOU0VSVCk/ dW5kZWZpbmVkOmZlYXR1cmUuaWQ7cmVjb3Jkc1tyZWNvcmRzLmxlbmd0aF09bmV3 IHJlY29yZFR5cGUodmFsdWVzLGlkKTt9fQpyZXR1cm57cmVjb3JkczpyZWNvcmRz LHRvdGFsUmVjb3Jkczp0aGlzLnRvdGFsUmVjb3JkcyE9bnVsbD90aGlzLnRvdGFs UmVjb3JkczpyZWNvcmRzLmxlbmd0aH07fX0pO0V4dC5uYW1lc3BhY2UoJ0dlb0V4 dCcpO0dlb0V4dC5XTVNMZWdlbmQ9RXh0LmV4dGVuZChHZW9FeHQuTGF5ZXJMZWdl bmQse2RlZmF1bHRTdHlsZUlzRmlyc3Q6dHJ1ZSx1c2VTY2FsZVBhcmFtZXRlcjp0 cnVlLGJhc2VQYXJhbXM6bnVsbCxpbml0Q29tcG9uZW50OmZ1bmN0aW9uKCl7R2Vv RXh0LldNU0xlZ2VuZC5zdXBlcmNsYXNzLmluaXRDb21wb25lbnQuY2FsbCh0aGlz KTt2YXIgbGF5ZXI9dGhpcy5sYXllclJlY29yZC5nZXRMYXllcigpO3RoaXMuX25v TWFwPSFsYXllci5tYXA7bGF5ZXIuZXZlbnRzLnJlZ2lzdGVyKCJtb3ZlZW5kIix0 aGlzLHRoaXMub25MYXllck1vdmVlbmQpO3RoaXMudXBkYXRlKCk7fSxvbkxheWVy TW92ZWVuZDpmdW5jdGlvbihlKXtpZigoZS56b29tQ2hhbmdlZD09PXRydWUmJnRo aXMudXNlU2NhbGVQYXJhbWV0ZXI9PT10cnVlKXx8dGhpcy5fbm9NYXApe2RlbGV0 ZSB0aGlzLl9ub01hcDt0aGlzLnVwZGF0ZSgpO319LGdldExlZ2VuZFVybDpmdW5j dGlvbihsYXllck5hbWUsbGF5ZXJOYW1lcyl7dmFyIHJlYz10aGlzLmxheWVyUmVj b3JkO3ZhciB1cmw7dmFyIHN0eWxlcz1yZWMmJnJlYy5nZXQoInN0eWxlcyIpO3Zh ciBsYXllcj1yZWMuZ2V0TGF5ZXIoKTtsYXllck5hbWVzPWxheWVyTmFtZXN8fFts YXllci5wYXJhbXMuTEFZRVJTXS5qb2luKCIsIikuc3BsaXQoIiwiKTt2YXIgc3R5 bGVOYW1lcz1sYXllci5wYXJhbXMuU1RZTEVTJiZbbGF5ZXIucGFyYW1zLlNUWUxF U10uam9pbigiLCIpLnNwbGl0KCIsIik7dmFyIGlkeD1sYXllck5hbWVzLmluZGV4 T2YobGF5ZXJOYW1lKTt2YXIgc3R5bGVOYW1lPXN0eWxlTmFtZXMmJnN0eWxlTmFt ZXNbaWR4XTtpZihzdHlsZXMmJnN0eWxlcy5sZW5ndGg+MCl7aWYoc3R5bGVOYW1l KXtFeHQuZWFjaChzdHlsZXMsZnVuY3Rpb24ocyl7dXJsPShzLm5hbWU9PXN0eWxl TmFtZSYmcy5sZWdlbmQpJiZzLmxlZ2VuZC5ocmVmO3JldHVybiF1cmw7fSk7fWVs c2UgaWYodGhpcy5kZWZhdWx0U3R5bGVJc0ZpcnN0PT09dHJ1ZSYmIXN0eWxlTmFt ZXMmJiFsYXllci5wYXJhbXMuU0xEJiYhbGF5ZXIucGFyYW1zLlNMRF9CT0RZKXt1 cmw9c3R5bGVzWzBdLmxlZ2VuZCYmc3R5bGVzWzBdLmxlZ2VuZC5ocmVmO319Cmlm KCF1cmwpe3VybD1sYXllci5nZXRGdWxsUmVxdWVzdFN0cmluZyh7UkVRVUVTVDoi R2V0TGVnZW5kR3JhcGhpYyIsV0lEVEg6bnVsbCxIRUlHSFQ6bnVsbCxFWENFUFRJ T05TOiJhcHBsaWNhdGlvbi92bmQub2djLnNlX3htbCIsTEFZRVI6bGF5ZXJOYW1l LExBWUVSUzpudWxsLFNUWUxFOihzdHlsZU5hbWUhPT0nJyk/c3R5bGVOYW1lOm51 bGwsU1RZTEVTOm51bGwsU1JTOm51bGwsRk9STUFUOm51bGx9KTt9CmlmKHRoaXMu dXNlU2NhbGVQYXJhbWV0ZXI9PT10cnVlJiZ1cmwudG9Mb3dlckNhc2UoKS5pbmRl eE9mKCJyZXF1ZXN0PWdldGxlZ2VuZGdyYXBoaWMiKSE9LTEpe3ZhciBzY2FsZT1s YXllci5tYXAuZ2V0U2NhbGUoKTt1cmw9RXh0LnVybEFwcGVuZCh1cmwsIlNDQUxF PSIrc2NhbGUpO30KdmFyIHBhcmFtcz10aGlzLmJhc2VQYXJhbXN8fHt9O0V4dC5h cHBseUlmKHBhcmFtcyx7Rk9STUFUOidpbWFnZS9naWYnfSk7aWYodXJsLmluZGV4 T2YoJz8nKT4wKXt1cmw9RXh0LnVybEVuY29kZShwYXJhbXMsdXJsKTt9CnJldHVy biB1cmw7fSx1cGRhdGU6ZnVuY3Rpb24oKXt2YXIgbGF5ZXI9dGhpcy5sYXllclJl Y29yZC5nZXRMYXllcigpO2lmKCEobGF5ZXImJmxheWVyLm1hcCkpe3JldHVybjt9 Ckdlb0V4dC5XTVNMZWdlbmQuc3VwZXJjbGFzcy51cGRhdGUuYXBwbHkodGhpcyxh cmd1bWVudHMpO3ZhciBsYXllck5hbWVzLGxheWVyTmFtZSxpLGxlbjtsYXllck5h bWVzPVtsYXllci5wYXJhbXMuTEFZRVJTXS5qb2luKCIsIikuc3BsaXQoIiwiKTt2 YXIgZGVzdHJveUxpc3Q9W107dmFyIHRleHRDbXA9dGhpcy5pdGVtcy5nZXQoMCk7 dGhpcy5pdGVtcy5lYWNoKGZ1bmN0aW9uKGNtcCl7aT1sYXllck5hbWVzLmluZGV4 T2YoY21wLml0ZW1JZCk7aWYoaTwwJiZjbXAhPXRleHRDbXApe2Rlc3Ryb3lMaXN0 LnB1c2goY21wKTt9ZWxzZSBpZihjbXAhPT10ZXh0Q21wKXtsYXllck5hbWU9bGF5 ZXJOYW1lc1tpXTt2YXIgbmV3VXJsPXRoaXMuZ2V0TGVnZW5kVXJsKGxheWVyTmFt ZSxsYXllck5hbWVzKTtpZighT3BlbkxheWVycy5VdGlsLmlzRXF1aXZhbGVudFVy bChuZXdVcmwsY21wLnVybCkpe2NtcC5zZXRVcmwobmV3VXJsKTt9fX0sdGhpcyk7 Zm9yKGk9MCxsZW49ZGVzdHJveUxpc3QubGVuZ3RoO2k8bGVuO2krKyl7dmFyIGNt cD1kZXN0cm95TGlzdFtpXTt0aGlzLnJlbW92ZShjbXApO2NtcC5kZXN0cm95KCk7 fQpmb3IoaT0wLGxlbj1sYXllck5hbWVzLmxlbmd0aDtpPGxlbjtpKyspe2xheWVy TmFtZT1sYXllck5hbWVzW2ldO2lmKCF0aGlzLml0ZW1zfHwhdGhpcy5nZXRDb21w b25lbnQobGF5ZXJOYW1lKSl7dGhpcy5hZGQoe3h0eXBlOiJneF9sZWdlbmRpbWFn ZSIsdXJsOnRoaXMuZ2V0TGVnZW5kVXJsKGxheWVyTmFtZSxsYXllck5hbWVzKSxp dGVtSWQ6bGF5ZXJOYW1lfSk7fX0KdGhpcy5kb0xheW91dCgpO30sYmVmb3JlRGVz dHJveTpmdW5jdGlvbigpe2lmKHRoaXMudXNlU2NhbGVQYXJhbWV0ZXI9PT10cnVl KXt2YXIgbGF5ZXI9dGhpcy5sYXllclJlY29yZC5nZXRMYXllcigpCmxheWVyJiZs YXllci5ldmVudHMmJmxheWVyLmV2ZW50cy51bnJlZ2lzdGVyKCJtb3ZlZW5kIix0 aGlzLHRoaXMub25MYXllck1vdmVlbmQpO30KR2VvRXh0LldNU0xlZ2VuZC5zdXBl cmNsYXNzLmJlZm9yZURlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpO319KTtH ZW9FeHQuV01TTGVnZW5kLnN1cHBvcnRzPWZ1bmN0aW9uKGxheWVyUmVjb3JkKXty ZXR1cm4gbGF5ZXJSZWNvcmQuZ2V0TGF5ZXIoKWluc3RhbmNlb2YgT3BlbkxheWVy cy5MYXllci5XTVM7fTtHZW9FeHQuTGF5ZXJMZWdlbmQudHlwZXNbImd4X3dtc2xl Z2VuZCJdPUdlb0V4dC5XTVNMZWdlbmQ7RXh0LnJlZygnZ3hfd21zbGVnZW5kJyxH ZW9FeHQuV01TTGVnZW5kKTtFeHQubmFtZXNwYWNlKCJHZW9FeHQuZGF0YSIpO0dl b0V4dC5kYXRhLldNU0Rlc2NyaWJlTGF5ZXJSZWFkZXI9ZnVuY3Rpb24obWV0YSxy ZWNvcmRUeXBlKXttZXRhPW1ldGF8fHt9O2lmKCFtZXRhLmZvcm1hdCl7bWV0YS5m b3JtYXQ9bmV3IE9wZW5MYXllcnMuRm9ybWF0LldNU0Rlc2NyaWJlTGF5ZXIoKTt9 CmlmKCEodHlwZW9mIHJlY29yZFR5cGU9PT0iZnVuY3Rpb24iKSl7cmVjb3JkVHlw ZT1FeHQuZGF0YS5SZWNvcmQuY3JlYXRlKHJlY29yZFR5cGV8fG1ldGEuZmllbGRz fHxbe25hbWU6Im93c1R5cGUiLHR5cGU6InN0cmluZyJ9LHtuYW1lOiJvd3NVUkwi LHR5cGU6InN0cmluZyJ9LHtuYW1lOiJ0eXBlTmFtZSIsdHlwZToic3RyaW5nIn1d KTt9Ckdlb0V4dC5kYXRhLldNU0Rlc2NyaWJlTGF5ZXJSZWFkZXIuc3VwZXJjbGFz cy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsbWV0YSxyZWNvcmRUeXBlKTt9O0V4dC5l eHRlbmQoR2VvRXh0LmRhdGEuV01TRGVzY3JpYmVMYXllclJlYWRlcixFeHQuZGF0 YS5EYXRhUmVhZGVyLHtyZWFkOmZ1bmN0aW9uKHJlcXVlc3Qpe3ZhciBkYXRhPXJl cXVlc3QucmVzcG9uc2VYTUw7aWYoIWRhdGF8fCFkYXRhLmRvY3VtZW50RWxlbWVu dCl7ZGF0YT1yZXF1ZXN0LnJlc3BvbnNlVGV4dDt9CnJldHVybiB0aGlzLnJlYWRS ZWNvcmRzKGRhdGEpO30scmVhZFJlY29yZHM6ZnVuY3Rpb24oZGF0YSl7aWYodHlw ZW9mIGRhdGE9PT0ic3RyaW5nInx8ZGF0YS5ub2RlVHlwZSl7ZGF0YT10aGlzLm1l dGEuZm9ybWF0LnJlYWQoZGF0YSk7fQp2YXIgcmVjb3Jkcz1bXSxkZXNjcmlwdGlv bjtmb3IodmFyIGk9MCxsZW49ZGF0YS5sZW5ndGg7aTxsZW47aSsrKXtkZXNjcmlw dGlvbj1kYXRhW2ldO2lmKGRlc2NyaXB0aW9uKXtyZWNvcmRzLnB1c2gobmV3IHRo aXMucmVjb3JkVHlwZShkZXNjcmlwdGlvbikpO319CnJldHVybnt0b3RhbFJlY29y ZHM6cmVjb3Jkcy5sZW5ndGgsc3VjY2Vzczp0cnVlLHJlY29yZHM6cmVjb3Jkc307 fX0pO0V4dC5uYW1lc3BhY2UoIkdlb0V4dC5mb3JtIik7R2VvRXh0LmZvcm0uU2Vh cmNoQWN0aW9uPUV4dC5leHRlbmQoRXh0LmZvcm0uQWN0aW9uLHt0eXBlOiJzZWFy Y2giLHJlc3BvbnNlOm51bGwsY29uc3RydWN0b3I6ZnVuY3Rpb24oZm9ybSxvcHRp b25zKXtHZW9FeHQuZm9ybS5TZWFyY2hBY3Rpb24uc3VwZXJjbGFzcy5jb25zdHJ1 Y3Rvci5jYWxsKHRoaXMsZm9ybSxvcHRpb25zKTt9LHJ1bjpmdW5jdGlvbigpe3Zh ciBvPXRoaXMub3B0aW9uczt2YXIgZj1HZW9FeHQuZm9ybS50b0ZpbHRlcih0aGlz LmZvcm0sby5sb2dpY2FsT3Asby53aWxkY2FyZCk7aWYoby5jbGllbnRWYWxpZGF0 aW9uPT09ZmFsc2V8fHRoaXMuZm9ybS5pc1ZhbGlkKCkpe2lmKG8uYWJvcnRQcmV2 aW91cyYmdGhpcy5mb3JtLnByZXZSZXNwb25zZSl7by5wcm90b2NvbC5hYm9ydCh0 aGlzLmZvcm0ucHJldlJlc3BvbnNlKTt9CnRoaXMuZm9ybS5wcmV2UmVzcG9uc2U9 by5wcm90b2NvbC5yZWFkKEV4dC5hcHBseUlmKHtmaWx0ZXI6ZixjYWxsYmFjazp0 aGlzLmhhbmRsZVJlc3BvbnNlLHNjb3BlOnRoaXN9LG8pKTt9ZWxzZSBpZihvLmNs aWVudFZhbGlkYXRpb24hPT1mYWxzZSl7dGhpcy5mYWlsdXJlVHlwZT1FeHQuZm9y bS5BY3Rpb24uQ0xJRU5UX0lOVkFMSUQ7dGhpcy5mb3JtLmFmdGVyQWN0aW9uKHRo aXMsZmFsc2UpO319LGhhbmRsZVJlc3BvbnNlOmZ1bmN0aW9uKHJlc3BvbnNlKXt0 aGlzLmZvcm0ucHJldlJlc3BvbnNlPW51bGw7dGhpcy5yZXNwb25zZT1yZXNwb25z ZTtpZihyZXNwb25zZS5zdWNjZXNzKCkpe3RoaXMuZm9ybS5hZnRlckFjdGlvbih0 aGlzLHRydWUpO31lbHNle3RoaXMuZm9ybS5hZnRlckFjdGlvbih0aGlzLGZhbHNl KTt9CnZhciBvPXRoaXMub3B0aW9ucztpZihvLmNhbGxiYWNrKXtvLmNhbGxiYWNr LmNhbGwoby5zY29wZSxyZXNwb25zZSk7fX19KTtFeHQubmFtZXNwYWNlKCJHZW9F eHQuZGF0YSIpO0dlb0V4dC5kYXRhLkZlYXR1cmVSZWNvcmQ9RXh0LmRhdGEuUmVj b3JkLmNyZWF0ZShbe25hbWU6ImZlYXR1cmUifSx7bmFtZToic3RhdGUifSx7bmFt ZToiZmlkIn1dKTtHZW9FeHQuZGF0YS5GZWF0dXJlUmVjb3JkLnByb3RvdHlwZS5n ZXRGZWF0dXJlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KCJmZWF0dXJlIik7 fTtHZW9FeHQuZGF0YS5GZWF0dXJlUmVjb3JkLnByb3RvdHlwZS5zZXRGZWF0dXJl PWZ1bmN0aW9uKGZlYXR1cmUpe2lmKGZlYXR1cmUhPT10aGlzLmRhdGEuZmVhdHVy ZSl7dGhpcy5kaXJ0eT10cnVlO2lmKCF0aGlzLm1vZGlmaWVkKXt0aGlzLm1vZGlm aWVkPXt9O30KaWYodGhpcy5tb2RpZmllZC5mZWF0dXJlPT09dW5kZWZpbmVkKXt0 aGlzLm1vZGlmaWVkLmZlYXR1cmU9dGhpcy5kYXRhLmZlYXR1cmU7fQp0aGlzLmRh dGEuZmVhdHVyZT1mZWF0dXJlO2lmKCF0aGlzLmVkaXRpbmcpe3RoaXMuYWZ0ZXJF ZGl0KCk7fX19O0dlb0V4dC5kYXRhLkZlYXR1cmVSZWNvcmQuY3JlYXRlPWZ1bmN0 aW9uKG8pe3ZhciBmPUV4dC5leHRlbmQoR2VvRXh0LmRhdGEuRmVhdHVyZVJlY29y ZCx7fSk7dmFyIHA9Zi5wcm90b3R5cGU7cC5maWVsZHM9bmV3IEV4dC51dGlsLk1p eGVkQ29sbGVjdGlvbihmYWxzZSxmdW5jdGlvbihmaWVsZCl7cmV0dXJuIGZpZWxk Lm5hbWU7fSk7R2VvRXh0LmRhdGEuRmVhdHVyZVJlY29yZC5wcm90b3R5cGUuZmll bGRzLmVhY2goZnVuY3Rpb24oZil7cC5maWVsZHMuYWRkKGYpO30pO2lmKG8pe2Zv cih2YXIgaT0wLGxlbj1vLmxlbmd0aDtpPGxlbjtpKyspe3AuZmllbGRzLmFkZChu ZXcgRXh0LmRhdGEuRmllbGQob1tpXSkpO319CmYuZ2V0RmllbGQ9ZnVuY3Rpb24o bmFtZSl7cmV0dXJuIHAuZmllbGRzLmdldChuYW1lKTt9O3JldHVybiBmO307RXh0 Lm5hbWVzcGFjZSgiR2VvRXh0LmRhdGEiKTtHZW9FeHQuZGF0YS5QcmludFBhZ2U9 RXh0LmV4dGVuZChFeHQudXRpbC5PYnNlcnZhYmxlLHtwcmludFByb3ZpZGVyOm51 bGwsZmVhdHVyZTpudWxsLGNlbnRlcjpudWxsLHNjYWxlOm51bGwscm90YXRpb246 MCxjdXN0b21QYXJhbXM6bnVsbCxjb25zdHJ1Y3RvcjpmdW5jdGlvbihjb25maWcp e3RoaXMuaW5pdGlhbENvbmZpZz1jb25maWc7RXh0LmFwcGx5KHRoaXMsY29uZmln KTtpZighdGhpcy5jdXN0b21QYXJhbXMpe3RoaXMuY3VzdG9tUGFyYW1zPXt9O30K dGhpcy5hZGRFdmVudHMoImNoYW5nZSIpO0dlb0V4dC5kYXRhLlByaW50UGFnZS5z dXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlz LmZlYXR1cmU9bmV3IE9wZW5MYXllcnMuRmVhdHVyZS5WZWN0b3IoT3BlbkxheWVy cy5HZW9tZXRyeS5mcm9tV0tUKCJQT0xZR09OKCgtMSAtMSwxIC0xLDEgMSwtMSAx LC0xIC0xKSkiKSk7aWYodGhpcy5wcmludFByb3ZpZGVyLmNhcGFiaWxpdGllcyl7 dGhpcy5zZXRTY2FsZSh0aGlzLnByaW50UHJvdmlkZXIuc2NhbGVzLmdldEF0KDAp KTt9ZWxzZXt0aGlzLnByaW50UHJvdmlkZXIub24oeyJsb2FkY2FwYWJpbGl0aWVz IjpmdW5jdGlvbigpe3RoaXMuc2V0U2NhbGUodGhpcy5wcmludFByb3ZpZGVyLnNj YWxlcy5nZXRBdCgwKSk7fSxzY29wZTp0aGlzLHNpbmdsZTp0cnVlfSk7fQp0aGlz LnByaW50UHJvdmlkZXIub24oeyJsYXlvdXRjaGFuZ2UiOnRoaXMub25MYXlvdXRD aGFuZ2Usc2NvcGU6dGhpc30pO30sZ2V0UHJpbnRFeHRlbnQ6ZnVuY3Rpb24obWFw KXttYXA9bWFwIGluc3RhbmNlb2YgR2VvRXh0Lk1hcFBhbmVsP21hcC5tYXA6bWFw O3JldHVybiB0aGlzLmNhbGN1bGF0ZVBhZ2VCb3VuZHModGhpcy5zY2FsZSxtYXAu Z2V0VW5pdHMoKSk7fSxzZXRTY2FsZTpmdW5jdGlvbihzY2FsZSx1bml0cyl7dmFy IGJvdW5kcz10aGlzLmNhbGN1bGF0ZVBhZ2VCb3VuZHMoc2NhbGUsdW5pdHMpO3Zh ciBnZW9tPWJvdW5kcy50b0dlb21ldHJ5KCk7dmFyIHJvdGF0aW9uPXRoaXMucm90 YXRpb247aWYocm90YXRpb24hPTApe2dlb20ucm90YXRlKC1yb3RhdGlvbixnZW9t LmdldENlbnRyb2lkKCkpO30KdGhpcy51cGRhdGVGZWF0dXJlKGdlb20se3NjYWxl OnNjYWxlfSk7fSxzZXRDZW50ZXI6ZnVuY3Rpb24oY2VudGVyKXt2YXIgZ2VvbT10 aGlzLmZlYXR1cmUuZ2VvbWV0cnk7dmFyIG9sZENlbnRlcj1nZW9tLmdldEJvdW5k cygpLmdldENlbnRlckxvbkxhdCgpO3ZhciBkeD1jZW50ZXIubG9uLW9sZENlbnRl ci5sb247dmFyIGR5PWNlbnRlci5sYXQtb2xkQ2VudGVyLmxhdDtnZW9tLm1vdmUo ZHgsZHkpO3RoaXMudXBkYXRlRmVhdHVyZShnZW9tLHtjZW50ZXI6Y2VudGVyfSk7 fSxzZXRSb3RhdGlvbjpmdW5jdGlvbihyb3RhdGlvbixmb3JjZSl7aWYoZm9yY2V8 fHRoaXMucHJpbnRQcm92aWRlci5sYXlvdXQuZ2V0KCJyb3RhdGlvbiIpPT09dHJ1 ZSl7dmFyIGdlb209dGhpcy5mZWF0dXJlLmdlb21ldHJ5O2dlb20ucm90YXRlKHRo aXMucm90YXRpb24tcm90YXRpb24sZ2VvbS5nZXRDZW50cm9pZCgpKTt0aGlzLnVw ZGF0ZUZlYXR1cmUoZ2VvbSx7cm90YXRpb246cm90YXRpb259KTt9fSxmaXQ6ZnVu Y3Rpb24oZml0VG8sb3B0aW9ucyl7b3B0aW9ucz1vcHRpb25zfHx7fTt2YXIgbWFw PWZpdFRvLGV4dGVudDtpZihmaXRUbyBpbnN0YW5jZW9mIEdlb0V4dC5NYXBQYW5l bCl7bWFwPWZpdFRvLm1hcDt9ZWxzZSBpZihmaXRUbyBpbnN0YW5jZW9mIE9wZW5M YXllcnMuRmVhdHVyZS5WZWN0b3Ipe21hcD1maXRUby5sYXllci5tYXA7ZXh0ZW50 PWZpdFRvLmdlb21ldHJ5LmdldEJvdW5kcygpO30KaWYoIWV4dGVudCl7ZXh0ZW50 PW1hcC5nZXRFeHRlbnQoKTtpZighZXh0ZW50KXtyZXR1cm47fX0KdGhpcy5fdXBk YXRpbmc9dHJ1ZTt2YXIgY2VudGVyPWV4dGVudC5nZXRDZW50ZXJMb25MYXQoKTt0 aGlzLnNldENlbnRlcihjZW50ZXIpO3ZhciB1bml0cz1tYXAuZ2V0VW5pdHMoKTt2 YXIgc2NhbGU9dGhpcy5wcmludFByb3ZpZGVyLnNjYWxlcy5nZXRBdCgwKTt2YXIg Y2xvc2VzdD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7dmFyIG1hcFdpZHRoPWV4 dGVudC5nZXRXaWR0aCgpO3ZhciBtYXBIZWlnaHQ9ZXh0ZW50LmdldEhlaWdodCgp O3RoaXMucHJpbnRQcm92aWRlci5zY2FsZXMuZWFjaChmdW5jdGlvbihyZWMpe3Zh ciBib3VuZHM9dGhpcy5jYWxjdWxhdGVQYWdlQm91bmRzKHJlYyx1bml0cyk7aWYo b3B0aW9ucy5tb2RlPT0iY2xvc2VzdCIpe3ZhciBkaWZmPU1hdGguYWJzKGJvdW5k cy5nZXRXaWR0aCgpLW1hcFdpZHRoKSsKTWF0aC5hYnMoYm91bmRzLmdldEhlaWdo dCgpLW1hcEhlaWdodCk7aWYoZGlmZjxjbG9zZXN0KXtjbG9zZXN0PWRpZmY7c2Nh bGU9cmVjO319ZWxzZXt2YXIgY29udGFpbnM9b3B0aW9ucy5tb2RlPT0ic2NyZWVu Ij8hZXh0ZW50LmNvbnRhaW5zQm91bmRzKGJvdW5kcyk6Ym91bmRzLmNvbnRhaW5z Qm91bmRzKGV4dGVudCk7aWYoY29udGFpbnN8fChvcHRpb25zLm1vZGU9PSJzY3Jl ZW4iJiYhY29udGFpbnMpKXtzY2FsZT1yZWM7fQpyZXR1cm4gY29udGFpbnM7fX0s dGhpcyk7dGhpcy5zZXRTY2FsZShzY2FsZSx1bml0cyk7ZGVsZXRlIHRoaXMuX3Vw ZGF0aW5nO3RoaXMudXBkYXRlRmVhdHVyZSh0aGlzLmZlYXR1cmUuZ2VvbWV0cnks e2NlbnRlcjpjZW50ZXIsc2NhbGU6c2NhbGV9KTt9LHVwZGF0ZUZlYXR1cmU6ZnVu Y3Rpb24oZ2VvbWV0cnksbW9kcyl7dmFyIGY9dGhpcy5mZWF0dXJlO3ZhciBtb2Rp ZmllZD1mLmdlb21ldHJ5IT09Z2VvbWV0cnk7Z2VvbWV0cnkuaWQ9Zi5nZW9tZXRy eS5pZDtmLmdlb21ldHJ5PWdlb21ldHJ5O2lmKCF0aGlzLl91cGRhdGluZyl7Zm9y KHZhciBwcm9wZXJ0eSBpbiBtb2RzKXtpZihtb2RzW3Byb3BlcnR5XT09PXRoaXNb cHJvcGVydHldKXtkZWxldGUgbW9kc1twcm9wZXJ0eV07fWVsc2V7dGhpc1twcm9w ZXJ0eV09bW9kc1twcm9wZXJ0eV07bW9kaWZpZWQ9dHJ1ZTt9fQpFeHQuYXBwbHko dGhpcyxtb2RzKTtmLmxheWVyJiZmLmxheWVyLmRyYXdGZWF0dXJlKGYpO21vZGlm aWVkJiZ0aGlzLmZpcmVFdmVudCgiY2hhbmdlIix0aGlzLG1vZHMpO319LGNhbGN1 bGF0ZVBhZ2VCb3VuZHM6ZnVuY3Rpb24oc2NhbGUsdW5pdHMpe3ZhciBzPXNjYWxl LmdldCgidmFsdWUiKTt2YXIgZj10aGlzLmZlYXR1cmU7dmFyIGdlb209dGhpcy5m ZWF0dXJlLmdlb21ldHJ5O3ZhciBjZW50ZXI9Z2VvbS5nZXRCb3VuZHMoKS5nZXRD ZW50ZXJMb25MYXQoKTt2YXIgc2l6ZT10aGlzLnByaW50UHJvdmlkZXIubGF5b3V0 LmdldCgic2l6ZSIpO3ZhciB1bml0cz11bml0c3x8KGYubGF5ZXImJmYubGF5ZXIu bWFwJiZmLmxheWVyLm1hcC5nZXRVbml0cygpKXx8ImRkIjt2YXIgdW5pdHNSYXRp bz1PcGVuTGF5ZXJzLklOQ0hFU19QRVJfVU5JVFt1bml0c107dmFyIHc9c2l6ZS53 aWR0aC83Mi91bml0c1JhdGlvKnMvMjt2YXIgaD1zaXplLmhlaWdodC83Mi91bml0 c1JhdGlvKnMvMjtyZXR1cm4gbmV3IE9wZW5MYXllcnMuQm91bmRzKGNlbnRlci5s b24tdyxjZW50ZXIubGF0LWgsY2VudGVyLmxvbit3LGNlbnRlci5sYXQraCk7fSxv bkxheW91dENoYW5nZTpmdW5jdGlvbigpe2lmKHRoaXMucHJpbnRQcm92aWRlci5s YXlvdXQuZ2V0KCJyb3RhdGlvbiIpPT09ZmFsc2Upe3RoaXMuc2V0Um90YXRpb24o MCx0cnVlKTt9CnRoaXMuc2NhbGUmJnRoaXMuc2V0U2NhbGUodGhpcy5zY2FsZSk7 fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5wcmludFByb3ZpZGVyLnVuKCJsYXlv dXRjaGFuZ2UiLHRoaXMub25MYXlvdXRDaGFuZ2UsdGhpcyk7fX0pO0V4dC5uYW1l c3BhY2UoIkdlb0V4dC5kYXRhIik7R2VvRXh0LmRhdGEuTGF5ZXJSZWNvcmQ9RXh0 LmRhdGEuUmVjb3JkLmNyZWF0ZShbe25hbWU6ImxheWVyIn0se25hbWU6InRpdGxl Iix0eXBlOiJzdHJpbmciLG1hcHBpbmc6Im5hbWUifV0pO0dlb0V4dC5kYXRhLkxh eWVyUmVjb3JkLnByb3RvdHlwZS5nZXRMYXllcj1mdW5jdGlvbigpe3JldHVybiB0 aGlzLmdldCgibGF5ZXIiKTt9O0dlb0V4dC5kYXRhLkxheWVyUmVjb3JkLnByb3Rv dHlwZS5zZXRMYXllcj1mdW5jdGlvbihsYXllcil7aWYobGF5ZXIhPT10aGlzLmRh dGEubGF5ZXIpe3RoaXMuZGlydHk9dHJ1ZTtpZighdGhpcy5tb2RpZmllZCl7dGhp cy5tb2RpZmllZD17fTt9CmlmKHRoaXMubW9kaWZpZWQubGF5ZXI9PT11bmRlZmlu ZWQpe3RoaXMubW9kaWZpZWQubGF5ZXI9dGhpcy5kYXRhLmxheWVyO30KdGhpcy5k YXRhLmxheWVyPWxheWVyO2lmKCF0aGlzLmVkaXRpbmcpe3RoaXMuYWZ0ZXJFZGl0 KCk7fX19O0dlb0V4dC5kYXRhLkxheWVyUmVjb3JkLnByb3RvdHlwZS5jbG9uZT1m dW5jdGlvbihpZCl7dmFyIGxheWVyPXRoaXMuZ2V0TGF5ZXIoKSYmdGhpcy5nZXRM YXllcigpLmNsb25lKCk7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKEV4dC5h cHBseUlmKHtsYXllcjpsYXllcn0sdGhpcy5kYXRhKSxpZHx8bGF5ZXIuaWQpO307 R2VvRXh0LmRhdGEuTGF5ZXJSZWNvcmQuY3JlYXRlPWZ1bmN0aW9uKG8pe3ZhciBm PUV4dC5leHRlbmQoR2VvRXh0LmRhdGEuTGF5ZXJSZWNvcmQse30pO3ZhciBwPWYu cHJvdG90eXBlO3AuZmllbGRzPW5ldyBFeHQudXRpbC5NaXhlZENvbGxlY3Rpb24o ZmFsc2UsZnVuY3Rpb24oZmllbGQpe3JldHVybiBmaWVsZC5uYW1lO30pO0dlb0V4 dC5kYXRhLkxheWVyUmVjb3JkLnByb3RvdHlwZS5maWVsZHMuZWFjaChmdW5jdGlv bihmKXtwLmZpZWxkcy5hZGQoZik7fSk7aWYobyl7Zm9yKHZhciBpPTAsbGVuPW8u bGVuZ3RoO2k8bGVuO2krKyl7cC5maWVsZHMuYWRkKG5ldyBFeHQuZGF0YS5GaWVs ZChvW2ldKSk7fX0KZi5nZXRGaWVsZD1mdW5jdGlvbihuYW1lKXtyZXR1cm4gcC5m aWVsZHMuZ2V0KG5hbWUpO307cmV0dXJuIGY7fTtFeHQubmFtZXNwYWNlKCdHZW9F eHQnKTtHZW9FeHQuRmVhdHVyZVJlbmRlcmVyPUV4dC5leHRlbmQoRXh0LkJveENv bXBvbmVudCx7ZmVhdHVyZTp1bmRlZmluZWQsc3ltYm9saXplcnM6W09wZW5MYXll cnMuRmVhdHVyZS5WZWN0b3Iuc3R5bGVbImRlZmF1bHQiXV0sc3ltYm9sVHlwZToi UG9seWdvbiIscmVzb2x1dGlvbjoxLG1pbldpZHRoOjIwLG1pbkhlaWdodDoyMCxy ZW5kZXJlcnM6WyJTVkciLCJWTUwiLCJDYW52YXMiXSxyZW5kZXJlck9wdGlvbnM6 bnVsbCxwb2ludEZlYXR1cmU6dW5kZWZpbmVkLGxpbmVGZWF0dXJlOnVuZGVmaW5l ZCxwb2x5Z29uRmVhdHVyZTp1bmRlZmluZWQscmVuZGVyZXI6bnVsbCxpbml0Q29t cG9uZW50OmZ1bmN0aW9uKCl7R2VvRXh0LkZlYXR1cmVSZW5kZXJlci5zdXBlcmNs YXNzLmluaXRDb21wb25lbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpO0V4dC5hcHBs eUlmKHRoaXMse3BvaW50RmVhdHVyZTpuZXcgT3BlbkxheWVycy5GZWF0dXJlLlZl Y3RvcihuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCgwLDApKSxsaW5lRmVh dHVyZTpuZXcgT3BlbkxheWVycy5GZWF0dXJlLlZlY3RvcihuZXcgT3BlbkxheWVy cy5HZW9tZXRyeS5MaW5lU3RyaW5nKFtuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Q b2ludCgtOCwtMyksbmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQoLTMsMyks bmV3IE9wZW5MYXllcnMuR2VvbWV0cnkuUG9pbnQoMywtMyksbmV3IE9wZW5MYXll cnMuR2VvbWV0cnkuUG9pbnQoOCwzKV0pKSxwb2x5Z29uRmVhdHVyZTpuZXcgT3Bl bkxheWVycy5GZWF0dXJlLlZlY3RvcihuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Q b2x5Z29uKFtuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5MaW5lYXJSaW5nKFtuZXcg T3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCgtOCwtNCksbmV3IE9wZW5MYXllcnMu R2VvbWV0cnkuUG9pbnQoLTYsLTYpLG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBv aW50KDYsLTYpLG5ldyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KDgsLTQpLG5l dyBPcGVuTGF5ZXJzLkdlb21ldHJ5LlBvaW50KDgsNCksbmV3IE9wZW5MYXllcnMu R2VvbWV0cnkuUG9pbnQoNiw2KSxuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2lu dCgtNiw2KSxuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludCgtOCw0KV0pXSkp fSk7aWYoIXRoaXMuZmVhdHVyZSl7dGhpcy5zZXRGZWF0dXJlKG51bGwse2RyYXc6 ZmFsc2V9KTt9CnRoaXMuYWRkRXZlbnRzKCJjbGljayIpO30saW5pdEN1c3RvbUV2 ZW50czpmdW5jdGlvbigpe3RoaXMuY2xlYXJDdXN0b21FdmVudHMoKTt0aGlzLmVs Lm9uKCJjbGljayIsdGhpcy5vbkNsaWNrLHRoaXMpO30sY2xlYXJDdXN0b21FdmVu dHM6ZnVuY3Rpb24oKXtpZih0aGlzLmVsJiZ0aGlzLmVsLnJlbW92ZUFsbExpc3Rl bmVycyl7dGhpcy5lbC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTt9fSxvbkNsaWNrOmZ1 bmN0aW9uKCl7dGhpcy5maXJlRXZlbnQoImNsaWNrIix0aGlzKTt9LG9uUmVuZGVy OmZ1bmN0aW9uKGN0LHBvc2l0aW9uKXtpZighdGhpcy5lbCl7dGhpcy5lbD1kb2N1 bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmVsLmlkPXRoaXMuZ2V0SWQo KTt9CmlmKCF0aGlzLnJlbmRlcmVyfHwhdGhpcy5yZW5kZXJlci5zdXBwb3J0ZWQo KSl7dGhpcy5hc3NpZ25SZW5kZXJlcigpO30KdGhpcy5yZW5kZXJlci5tYXA9e2dl dFJlc29sdXRpb246KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzb2x1dGlvbjt9 KS5jcmVhdGVEZWxlZ2F0ZSh0aGlzKX07R2VvRXh0LkZlYXR1cmVSZW5kZXJlci5z dXBlcmNsYXNzLm9uUmVuZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmRy YXdGZWF0dXJlKCk7fSxhZnRlclJlbmRlcjpmdW5jdGlvbigpe0dlb0V4dC5GZWF0 dXJlUmVuZGVyZXIuc3VwZXJjbGFzcy5hZnRlclJlbmRlci5hcHBseSh0aGlzLGFy Z3VtZW50cyk7dGhpcy5pbml0Q3VzdG9tRXZlbnRzKCk7fSxvblJlc2l6ZTpmdW5j dGlvbih3LGgpe3RoaXMuc2V0UmVuZGVyZXJEaW1lbnNpb25zKCk7R2VvRXh0LkZl YXR1cmVSZW5kZXJlci5zdXBlcmNsYXNzLm9uUmVzaXplLmFwcGx5KHRoaXMsYXJn dW1lbnRzKTt9LHNldFJlbmRlcmVyRGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciBn Yj10aGlzLmZlYXR1cmUuZ2VvbWV0cnkuZ2V0Qm91bmRzKCk7dmFyIGd3PWdiLmdl dFdpZHRoKCk7dmFyIGdoPWdiLmdldEhlaWdodCgpO3ZhciByZXNvbHV0aW9uPXRo aXMuaW5pdGlhbENvbmZpZy5yZXNvbHV0aW9uO2lmKCFyZXNvbHV0aW9uKXtyZXNv bHV0aW9uPU1hdGgubWF4KGd3L3RoaXMud2lkdGh8fDAsZ2gvdGhpcy5oZWlnaHR8 fDApfHwxO30KdGhpcy5yZXNvbHV0aW9uPXJlc29sdXRpb247dmFyIHdpZHRoPU1h dGgubWF4KHRoaXMud2lkdGh8fHRoaXMubWluV2lkdGgsZ3cvcmVzb2x1dGlvbik7 dmFyIGhlaWdodD1NYXRoLm1heCh0aGlzLmhlaWdodHx8dGhpcy5taW5IZWlnaHQs Z2gvcmVzb2x1dGlvbik7dmFyIGNlbnRlcj1nYi5nZXRDZW50ZXJQaXhlbCgpO3Zh ciBiaGFsZnc9d2lkdGgqcmVzb2x1dGlvbi8yO3ZhciBiaGFsZmg9aGVpZ2h0KnJl c29sdXRpb24vMjt2YXIgYm91bmRzPW5ldyBPcGVuTGF5ZXJzLkJvdW5kcyhjZW50 ZXIueC1iaGFsZncsY2VudGVyLnktYmhhbGZoLGNlbnRlci54K2JoYWxmdyxjZW50 ZXIueStiaGFsZmgpO3RoaXMucmVuZGVyZXIuc2V0U2l6ZShuZXcgT3BlbkxheWVy cy5TaXplKE1hdGgucm91bmQod2lkdGgpLE1hdGgucm91bmQoaGVpZ2h0KSkpO3Ro aXMucmVuZGVyZXIuc2V0RXh0ZW50KGJvdW5kcyx0cnVlKTt9LGFzc2lnblJlbmRl cmVyOmZ1bmN0aW9uKCl7Zm9yKHZhciBpPTAsbGVuPXRoaXMucmVuZGVyZXJzLmxl bmd0aDtpPGxlbjsrK2kpe3ZhciBSZW5kZXJlcj1PcGVuTGF5ZXJzLlJlbmRlcmVy W3RoaXMucmVuZGVyZXJzW2ldXTtpZihSZW5kZXJlciYmUmVuZGVyZXIucHJvdG90 eXBlLnN1cHBvcnRlZCgpKXt0aGlzLnJlbmRlcmVyPW5ldyBSZW5kZXJlcih0aGlz LmVsLHRoaXMucmVuZGVyZXJPcHRpb25zKTticmVhazt9fX0sc2V0U3ltYm9saXpl cnM6ZnVuY3Rpb24oc3ltYm9saXplcnMsb3B0aW9ucyl7dGhpcy5zeW1ib2xpemVy cz1zeW1ib2xpemVycztpZighb3B0aW9uc3x8b3B0aW9ucy5kcmF3KXt0aGlzLmRy YXdGZWF0dXJlKCk7fX0sc2V0U3ltYm9sVHlwZTpmdW5jdGlvbih0eXBlLG9wdGlv bnMpe3RoaXMuc3ltYm9sVHlwZT10eXBlO3RoaXMuc2V0RmVhdHVyZShudWxsLG9w dGlvbnMpO30sc2V0RmVhdHVyZTpmdW5jdGlvbihmZWF0dXJlLG9wdGlvbnMpe3Ro aXMuZmVhdHVyZT1mZWF0dXJlfHx0aGlzW3RoaXMuc3ltYm9sVHlwZS50b0xvd2Vy Q2FzZSgpKyJGZWF0dXJlIl07aWYoIW9wdGlvbnN8fG9wdGlvbnMuZHJhdyl7dGhp cy5kcmF3RmVhdHVyZSgpO319LGRyYXdGZWF0dXJlOmZ1bmN0aW9uKCl7dGhpcy5y ZW5kZXJlci5jbGVhcigpO3RoaXMuc2V0UmVuZGVyZXJEaW1lbnNpb25zKCk7dmFy IFN5bWJvbGl6ZXI9T3BlbkxheWVycy5TeW1ib2xpemVyO3ZhciBUZXh0PVN5bWJv bGl6ZXImJlN5bWJvbGl6ZXIuVGV4dDt2YXIgc3ltYm9saXplcixmZWF0dXJlLGdl b21UeXBlO2Zvcih2YXIgaT0wLGxlbj10aGlzLnN5bWJvbGl6ZXJzLmxlbmd0aDtp PGxlbjsrK2kpe3N5bWJvbGl6ZXI9dGhpcy5zeW1ib2xpemVyc1tpXTtmZWF0dXJl PXRoaXMuZmVhdHVyZTtpZighVGV4dHx8IShzeW1ib2xpemVyIGluc3RhbmNlb2Yg VGV4dCkpe2lmKFN5bWJvbGl6ZXImJihzeW1ib2xpemVyIGluc3RhbmNlb2YgU3lt Ym9saXplcikpe3N5bWJvbGl6ZXI9c3ltYm9saXplci5jbG9uZSgpO2lmKCF0aGlz LmluaXRpYWxDb25maWcuZmVhdHVyZSl7Z2VvbVR5cGU9c3ltYm9saXplci5DTEFT U19OQU1FLnNwbGl0KCIuIikucG9wKCkudG9Mb3dlckNhc2UoKTtmZWF0dXJlPXRo aXNbZ2VvbVR5cGUrIkZlYXR1cmUiXTt9fWVsc2V7c3ltYm9saXplcj1FeHQuYXBw bHkoe30sc3ltYm9saXplcik7fQp0aGlzLnJlbmRlcmVyLmRyYXdGZWF0dXJlKGZl YXR1cmUuY2xvbmUoKSxzeW1ib2xpemVyKTt9fX0sdXBkYXRlOmZ1bmN0aW9uKG9w dGlvbnMpe29wdGlvbnM9b3B0aW9uc3x8e307aWYob3B0aW9ucy5mZWF0dXJlKXt0 aGlzLnNldEZlYXR1cmUob3B0aW9ucy5mZWF0dXJlLHtkcmF3OmZhbHNlfSk7fWVs c2UgaWYob3B0aW9ucy5zeW1ib2xUeXBlKXt0aGlzLnNldFN5bWJvbFR5cGUob3B0 aW9ucy5zeW1ib2xUeXBlLHtkcmF3OmZhbHNlfSk7fQppZihvcHRpb25zLnN5bWJv bGl6ZXJzKXt0aGlzLnNldFN5bWJvbGl6ZXJzKG9wdGlvbnMuc3ltYm9saXplcnMs e2RyYXc6ZmFsc2V9KTt9CnRoaXMuZHJhd0ZlYXR1cmUoKTt9LGJlZm9yZURlc3Ry b3k6ZnVuY3Rpb24oKXt0aGlzLmNsZWFyQ3VzdG9tRXZlbnRzKCk7aWYodGhpcy5y ZW5kZXJlcil7dGhpcy5yZW5kZXJlci5kZXN0cm95KCk7fX19KTtFeHQucmVnKCdn eF9yZW5kZXJlcicsR2VvRXh0LkZlYXR1cmVSZW5kZXJlcik7RXh0Lm5hbWVzcGFj ZSgiR2VvRXh0Iik7R2VvRXh0LlBvcHVwPUV4dC5leHRlbmQoRXh0LldpbmRvdyx7 YW5jaG9yZWQ6dHJ1ZSxtYXA6bnVsbCxwYW5Jbjp0cnVlLHVucGlubmFibGU6dHJ1 ZSxsb2NhdGlvbjpudWxsLGFuaW1Db2xsYXBzZTpmYWxzZSxkcmFnZ2FibGU6ZmFs c2Usc2hhZG93OmZhbHNlLHBvcHVwQ2xzOiJneC1wb3B1cCIsYW5jQ2xzOm51bGws aW5pdENvbXBvbmVudDpmdW5jdGlvbigpe2lmKHRoaXMubWFwIGluc3RhbmNlb2Yg R2VvRXh0Lk1hcFBhbmVsKXt0aGlzLm1hcD10aGlzLm1hcC5tYXA7fQppZighdGhp cy5tYXAmJnRoaXMubG9jYXRpb24gaW5zdGFuY2VvZiBPcGVuTGF5ZXJzLkZlYXR1 cmUuVmVjdG9yJiZ0aGlzLmxvY2F0aW9uLmxheWVyKXt0aGlzLm1hcD10aGlzLmxv Y2F0aW9uLmxheWVyLm1hcDt9CmlmKHRoaXMubG9jYXRpb24gaW5zdGFuY2VvZiBP cGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9yKXt0aGlzLmxvY2F0aW9uPXRoaXMubG9j YXRpb24uZ2VvbWV0cnk7fQppZih0aGlzLmxvY2F0aW9uIGluc3RhbmNlb2YgT3Bl bkxheWVycy5HZW9tZXRyeSl7aWYodHlwZW9mIHRoaXMubG9jYXRpb24uZ2V0Q2Vu dHJvaWQ9PSJmdW5jdGlvbiIpe3RoaXMubG9jYXRpb249dGhpcy5sb2NhdGlvbi5n ZXRDZW50cm9pZCgpO30KdGhpcy5sb2NhdGlvbj10aGlzLmxvY2F0aW9uLmdldEJv dW5kcygpLmdldENlbnRlckxvbkxhdCgpO31lbHNlIGlmKHRoaXMubG9jYXRpb24g aW5zdGFuY2VvZiBPcGVuTGF5ZXJzLlBpeGVsKXt0aGlzLmxvY2F0aW9uPXRoaXMu bWFwLmdldExvbkxhdEZyb21WaWV3UG9ydFB4KHRoaXMubG9jYXRpb24pO30KaWYo dGhpcy5hbmNob3JlZCl7dGhpcy5hZGRBbmNob3JFdmVudHMoKTt9CnRoaXMuYmFz ZUNscz10aGlzLnBvcHVwQ2xzKyIgIit0aGlzLmJhc2VDbHM7dGhpcy5lbGVtZW50 cys9JyxhbmMnO0dlb0V4dC5Qb3B1cC5zdXBlcmNsYXNzLmluaXRDb21wb25lbnQu Y2FsbCh0aGlzKTt9LG9uUmVuZGVyOmZ1bmN0aW9uKGN0LHBvc2l0aW9uKXtHZW9F eHQuUG9wdXAuc3VwZXJjbGFzcy5vblJlbmRlci5jYWxsKHRoaXMsY3QscG9zaXRp b24pO3RoaXMuYW5jQ2xzPXRoaXMucG9wdXBDbHMrIi1hbmMiO3RoaXMuY3JlYXRl RWxlbWVudCgiYW5jIix0aGlzLmVsLmRvbSk7fSxpbml0VG9vbHM6ZnVuY3Rpb24o KXtpZih0aGlzLnVucGlubmFibGUpe3RoaXMuYWRkVG9vbCh7aWQ6J3VucGluJyxo YW5kbGVyOnRoaXMudW5hbmNob3JQb3B1cC5jcmVhdGVEZWxlZ2F0ZSh0aGlzLFtd KX0pO30KR2VvRXh0LlBvcHVwLnN1cGVyY2xhc3MuaW5pdFRvb2xzLmNhbGwodGhp cyk7fSxzaG93OmZ1bmN0aW9uKCl7R2VvRXh0LlBvcHVwLnN1cGVyY2xhc3Muc2hv dy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYodGhpcy5hbmNob3JlZCl7dGhpcy5w b3NpdGlvbigpO2lmKHRoaXMucGFuSW4mJiF0aGlzLl9tYXBNb3ZlKXt0aGlzLnBh bkludG9WaWV3KCk7fX19LG1heGltaXplOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWF4 aW1pemVkJiZ0aGlzLmFuYyl7dGhpcy51bmFuY2hvclBvcHVwKCk7fQpHZW9FeHQu UG9wdXAuc3VwZXJjbGFzcy5tYXhpbWl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7 fSxzZXRTaXplOmZ1bmN0aW9uKHcsaCl7aWYodGhpcy5hbmMpe3ZhciBhbmNTaXpl PXRoaXMuYW5jLmdldFNpemUoKTtpZih0eXBlb2Ygdz09J29iamVjdCcpe2g9dy5o ZWlnaHQtYW5jU2l6ZS5oZWlnaHQ7dz13LndpZHRoO31lbHNlIGlmKCFpc05hTiho KSl7aD1oLWFuY1NpemUuaGVpZ2h0O319Ckdlb0V4dC5Qb3B1cC5zdXBlcmNsYXNz LnNldFNpemUuY2FsbCh0aGlzLHcsaCk7fSxwb3NpdGlvbjpmdW5jdGlvbigpe2lm KHRoaXMuX21hcE1vdmU9PT10cnVlKXt2YXIgdmlzaWJsZT10aGlzLm1hcC5nZXRF eHRlbnQoKS5jb250YWluc0xvbkxhdCh0aGlzLmxvY2F0aW9uKTtpZih2aXNpYmxl IT09dGhpcy5pc1Zpc2libGUoKSl7dGhpcy5zZXRWaXNpYmxlKHZpc2libGUpO319 CmlmKHRoaXMuaXNWaXNpYmxlKCkpe3ZhciBjZW50ZXJQeD10aGlzLm1hcC5nZXRW aWV3UG9ydFB4RnJvbUxvbkxhdCh0aGlzLmxvY2F0aW9uKTt2YXIgbWFwQm94PUV4 dC5mbHkodGhpcy5tYXAuZGl2KS5nZXRCb3goKTt2YXIgYW5jPXRoaXMuYW5jO3Zh ciBkeD1hbmMuZ2V0TGVmdCh0cnVlKSthbmMuZ2V0V2lkdGgoKS8yO3ZhciBkeT10 aGlzLmVsLmdldEhlaWdodCgpO3RoaXMuc2V0UG9zaXRpb24oY2VudGVyUHgueCtt YXBCb3gueC1keCxjZW50ZXJQeC55K21hcEJveC55LWR5KTt9fSx1bmFuY2hvclBv cHVwOmZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBbmNob3JFdmVudHMoKTt0aGlzLmRy YWdnYWJsZT10cnVlO3RoaXMuaGVhZGVyLmFkZENsYXNzKCJ4LXdpbmRvdy1kcmFn Z2FibGUiKTt0aGlzLmRkPW5ldyBFeHQuV2luZG93LkREKHRoaXMpO3RoaXMuYW5j LnJlbW92ZSgpO3RoaXMuYW5jPW51bGw7dGhpcy50b29scy51bnBpbi5oaWRlKCk7 fSxwYW5JbnRvVmlldzpmdW5jdGlvbigpe3ZhciBtYXBCb3g9RXh0LmZseSh0aGlz Lm1hcC5kaXYpLmdldEJveCgpO3ZhciBwb3B1cFBvcz10aGlzLmdldFBvc2l0aW9u KHRydWUpO3BvcHVwUG9zWzBdLT1tYXBCb3gueDtwb3B1cFBvc1sxXS09bWFwQm94 Lnk7dmFyIHBhbmVsU2l6ZT1bbWFwQm94LndpZHRoLG1hcEJveC5oZWlnaHRdO3Zh ciBwb3B1cFNpemU9dGhpcy5nZXRTaXplKCk7dmFyIG5ld1Bvcz1bcG9wdXBQb3Nb MF0scG9wdXBQb3NbMV1dO3ZhciBwYWRkaW5nPXRoaXMubWFwLnBhZGRpbmdGb3JQ b3B1cHM7aWYocG9wdXBQb3NbMF08cGFkZGluZy5sZWZ0KXtuZXdQb3NbMF09cGFk ZGluZy5sZWZ0O31lbHNlIGlmKHBvcHVwUG9zWzBdK3BvcHVwU2l6ZS53aWR0aD5w YW5lbFNpemVbMF0tcGFkZGluZy5yaWdodCl7bmV3UG9zWzBdPXBhbmVsU2l6ZVsw XS1wYWRkaW5nLnJpZ2h0LXBvcHVwU2l6ZS53aWR0aDt9CmlmKHBvcHVwUG9zWzFd PHBhZGRpbmcudG9wKXtuZXdQb3NbMV09cGFkZGluZy50b3A7fWVsc2UgaWYocG9w dXBQb3NbMV0rcG9wdXBTaXplLmhlaWdodD5wYW5lbFNpemVbMV0tcGFkZGluZy5i b3R0b20pe25ld1Bvc1sxXT1wYW5lbFNpemVbMV0tcGFkZGluZy5ib3R0b20tcG9w dXBTaXplLmhlaWdodDt9CnZhciBkeD1wb3B1cFBvc1swXS1uZXdQb3NbMF07dmFy IGR5PXBvcHVwUG9zWzFdLW5ld1Bvc1sxXTt0aGlzLm1hcC5wYW4oZHgsZHkpO30s b25NYXBNb3ZlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwTW92ZT10cnVlO3RoaXMucG9z aXRpb24oKTtkZWxldGUgdGhpcy5fbWFwTW92ZTt9LGFkZEFuY2hvckV2ZW50czpm dW5jdGlvbigpe3RoaXMubWFwLmV2ZW50cy5vbih7Im1vdmUiOnRoaXMub25NYXBN b3ZlLHNjb3BlOnRoaXN9KTt0aGlzLm9uKHsicmVzaXplIjp0aGlzLnBvc2l0aW9u LCJjb2xsYXBzZSI6dGhpcy5wb3NpdGlvbiwiZXhwYW5kIjp0aGlzLnBvc2l0aW9u LHNjb3BlOnRoaXN9KTt9LHJlbW92ZUFuY2hvckV2ZW50czpmdW5jdGlvbigpe3Ro aXMubWFwLmV2ZW50cy51bih7Im1vdmUiOnRoaXMub25NYXBNb3ZlLHNjb3BlOnRo aXN9KTt0aGlzLnVuKCJyZXNpemUiLHRoaXMucG9zaXRpb24sdGhpcyk7dGhpcy51 bigiY29sbGFwc2UiLHRoaXMucG9zaXRpb24sdGhpcyk7dGhpcy51bigiZXhwYW5k Iix0aGlzLnBvc2l0aW9uLHRoaXMpO30sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigp e2lmKHRoaXMuYW5jaG9yZWQpe3RoaXMucmVtb3ZlQW5jaG9yRXZlbnRzKCk7fQpH ZW9FeHQuUG9wdXAuc3VwZXJjbGFzcy5iZWZvcmVEZXN0cm95LmNhbGwodGhpcyk7 fX0pO0V4dC5yZWcoJ2d4X3BvcHVwJyxHZW9FeHQuUG9wdXApO0V4dC5uYW1lc3Bh Y2UoIkdlb0V4dC5kYXRhIik7R2VvRXh0LmRhdGEuQXR0cmlidXRlU3RvcmVNaXhp bj1mdW5jdGlvbigpe3JldHVybntjb25zdHJ1Y3RvcjpmdW5jdGlvbihjKXtjPWN8 fHt9O2FyZ3VtZW50cy5jYWxsZWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxs KHRoaXMsRXh0LmFwcGx5KGMse3Byb3h5OmMucHJveHl8fCghYy5kYXRhP25ldyBF eHQuZGF0YS5IdHRwUHJveHkoe3VybDpjLnVybCxkaXNhYmxlQ2FjaGluZzpmYWxz ZSxtZXRob2Q6IkdFVCJ9KTp1bmRlZmluZWQpLHJlYWRlcjpuZXcgR2VvRXh0LmRh dGEuQXR0cmlidXRlUmVhZGVyKGMsYy5maWVsZHN8fFsibmFtZSIsInR5cGUiLCJy ZXN0cmljdGlvbiJdKX0pKTtpZih0aGlzLmZlYXR1cmUpe3RoaXMuYmluZCgpO319 LGJpbmQ6ZnVuY3Rpb24oKXt0aGlzLm9uKHsidXBkYXRlIjp0aGlzLm9uVXBkYXRl LCJsb2FkIjp0aGlzLm9uTG9hZCwiYWRkIjp0aGlzLm9uQWRkLHNjb3BlOnRoaXN9 KTt2YXIgcmVjb3Jkcz1bXTt0aGlzLmVhY2goZnVuY3Rpb24ocmVjb3JkKXtyZWNv cmRzLnB1c2gocmVjb3JkKTt9KTt0aGlzLnVwZGF0ZUZlYXR1cmUocmVjb3Jkcyk7 fSxvblVwZGF0ZTpmdW5jdGlvbihzdG9yZSxyZWNvcmQsb3BlcmF0aW9uKXt0aGlz LnVwZGF0ZUZlYXR1cmUoW3JlY29yZF0pO30sb25Mb2FkOmZ1bmN0aW9uKHN0b3Jl LHJlY29yZHMsb3B0aW9ucyl7aWYoIW9wdGlvbnN8fG9wdGlvbnMuYWRkIT09dHJ1 ZSl7dGhpcy51cGRhdGVGZWF0dXJlKHJlY29yZHMpO319LG9uQWRkOmZ1bmN0aW9u KHN0b3JlLHJlY29yZHMsaW5kZXgpe3RoaXMudXBkYXRlRmVhdHVyZShyZWNvcmRz KTt9LHVwZGF0ZUZlYXR1cmU6ZnVuY3Rpb24ocmVjb3Jkcyl7dmFyIGZlYXR1cmU9 dGhpcy5mZWF0dXJlLGxheWVyPWZlYXR1cmUubGF5ZXI7dmFyIGksbGVuLHJlY29y ZCxuYW1lLHZhbHVlLG9sZFZhbHVlLGRpcnR5O2ZvcihpPTAsbGVuPXJlY29yZHMu bGVuZ3RoO2k8bGVuO2krKyl7cmVjb3JkPXJlY29yZHNbaV07bmFtZT1yZWNvcmQu Z2V0KCJuYW1lIik7dmFsdWU9cmVjb3JkLmdldCgidmFsdWUiKTtvbGRWYWx1ZT1m ZWF0dXJlLmF0dHJpYnV0ZXNbbmFtZV07aWYob2xkVmFsdWUhPT12YWx1ZSl7ZGly dHk9dHJ1ZTt9fQppZihkaXJ0eSYmbGF5ZXImJmxheWVyLmV2ZW50cyYmbGF5ZXIu ZXZlbnRzLnRyaWdnZXJFdmVudCgiYmVmb3JlZmVhdHVyZW1vZGlmaWVkIix7ZmVh dHVyZTpmZWF0dXJlfSkhPT1mYWxzZSl7Zm9yKGk9MCxsZW49cmVjb3Jkcy5sZW5n dGg7aTxsZW47aSsrKXtyZWNvcmQ9cmVjb3Jkc1tpXTtuYW1lPXJlY29yZC5nZXQo Im5hbWUiKTt2YWx1ZT1yZWNvcmQuZ2V0KCJ2YWx1ZSIpO2ZlYXR1cmUuYXR0cmli dXRlc1tuYW1lXT12YWx1ZTt9CmxheWVyLmV2ZW50cy50cmlnZ2VyRXZlbnQoImZl YXR1cmVtb2RpZmllZCIse2ZlYXR1cmU6ZmVhdHVyZX0pO2xheWVyLmRyYXdGZWF0 dXJlKGZlYXR1cmUpO319fTt9O0dlb0V4dC5kYXRhLkF0dHJpYnV0ZVN0b3JlPUV4 dC5leHRlbmQoRXh0LmRhdGEuU3RvcmUsR2VvRXh0LmRhdGEuQXR0cmlidXRlU3Rv cmVNaXhpbigpKTtFeHQubmFtZXNwYWNlKCJHZW9FeHQuZm9ybSIpO0dlb0V4dC5m b3JtLkZvcm1QYW5lbD1FeHQuZXh0ZW5kKEV4dC5mb3JtLkZvcm1QYW5lbCx7cHJv dG9jb2w6bnVsbCxjcmVhdGVGb3JtOmZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMuaW5p dGlhbENvbmZpZy5saXN0ZW5lcnM7cmV0dXJuIG5ldyBHZW9FeHQuZm9ybS5CYXNp Y0Zvcm0obnVsbCx0aGlzLmluaXRpYWxDb25maWcpO30sc2VhcmNoOmZ1bmN0aW9u KG9wdGlvbnMpe3RoaXMuZ2V0Rm9ybSgpLnNlYXJjaChvcHRpb25zKTt9fSk7RXh0 LnJlZygiZ3hfZm9ybXBhbmVsIixHZW9FeHQuZm9ybS5Gb3JtUGFuZWwpO0V4dC5u YW1lc3BhY2UoIkdlb0V4dC5kYXRhIik7R2VvRXh0LmRhdGEuV01DUmVhZGVyPWZ1 bmN0aW9uKG1ldGEscmVjb3JkVHlwZSl7bWV0YT1tZXRhfHx7fTtpZighbWV0YS5m b3JtYXQpe21ldGEuZm9ybWF0PW5ldyBPcGVuTGF5ZXJzLkZvcm1hdC5XTUMoKTt9 CmlmKCEodHlwZW9mIHJlY29yZFR5cGU9PT0iZnVuY3Rpb24iKSl7cmVjb3JkVHlw ZT1HZW9FeHQuZGF0YS5MYXllclJlY29yZC5jcmVhdGUocmVjb3JkVHlwZXx8bWV0 YS5maWVsZHN8fFt7bmFtZToiYWJzdHJhY3QiLHR5cGU6InN0cmluZyJ9LHtuYW1l OiJtZXRhZGF0YVVSTCIsdHlwZToic3RyaW5nIn0se25hbWU6InF1ZXJ5YWJsZSIs dHlwZToiYm9vbGVhbiJ9LHtuYW1lOiJmb3JtYXRzIn0se25hbWU6InN0eWxlcyJ9 XSk7fQpHZW9FeHQuZGF0YS5XTUNSZWFkZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rv ci5jYWxsKHRoaXMsbWV0YSxyZWNvcmRUeXBlKTt9O0V4dC5leHRlbmQoR2VvRXh0 LmRhdGEuV01DUmVhZGVyLEV4dC5kYXRhLkRhdGFSZWFkZXIse3JlYWQ6ZnVuY3Rp b24ocmVxdWVzdCl7dmFyIGRhdGE9cmVxdWVzdC5yZXNwb25zZVhNTDtpZighZGF0 YXx8IWRhdGEuZG9jdW1lbnRFbGVtZW50KXtkYXRhPXJlcXVlc3QucmVzcG9uc2VU ZXh0O30KcmV0dXJuIHRoaXMucmVhZFJlY29yZHMoZGF0YSk7fSxyZWFkUmVjb3Jk czpmdW5jdGlvbihkYXRhKXt2YXIgZm9ybWF0PXRoaXMubWV0YS5mb3JtYXQ7aWYo dHlwZW9mIGRhdGE9PT0ic3RyaW5nInx8ZGF0YS5ub2RlVHlwZSl7ZGF0YT1mb3Jt YXQucmVhZChkYXRhKTt9CnZhciBsYXllcnNDb250ZXh0PWRhdGE/ZGF0YS5sYXll cnNDb250ZXh0OnVuZGVmaW5lZDt2YXIgcmVjb3Jkcz1bXTtpZihsYXllcnNDb250 ZXh0KXt2YXIgcmVjb3JkVHlwZT10aGlzLnJlY29yZFR5cGUsZmllbGRzPXJlY29y ZFR5cGUucHJvdG90eXBlLmZpZWxkczt2YXIgaSxsZW5JLGosbGVuSixsYXllckNv bnRleHQsdmFsdWVzLGZpZWxkLHY7Zm9yKGk9MCxsZW5JPWxheWVyc0NvbnRleHQu bGVuZ3RoO2k8bGVuSTtpKyspe2xheWVyQ29udGV4dD1sYXllcnNDb250ZXh0W2ld O3ZhbHVlcz17fTtmb3Ioaj0wLGxlbko9ZmllbGRzLmxlbmd0aDtqPGxlbko7aisr KXtmaWVsZD1maWVsZHMuaXRlbXNbal07dj1sYXllckNvbnRleHRbZmllbGQubWFw cGluZ3x8ZmllbGQubmFtZV18fGZpZWxkLmRlZmF1bHRWYWx1ZTt2PWZpZWxkLmNv bnZlcnQodik7dmFsdWVzW2ZpZWxkLm5hbWVdPXY7fQp2YWx1ZXMubGF5ZXI9Zm9y bWF0LmdldExheWVyRnJvbUNvbnRleHQobGF5ZXJDb250ZXh0KTtyZWNvcmRzLnB1 c2gobmV3IHRoaXMucmVjb3JkVHlwZSh2YWx1ZXMsdmFsdWVzLmxheWVyLmlkKSk7 fX0KcmV0dXJue3RvdGFsUmVjb3JkczpyZWNvcmRzLmxlbmd0aCxzdWNjZXNzOnRy dWUscmVjb3JkczpyZWNvcmRzfTt9fSk7RXh0Lm5hbWVzcGFjZSgiR2VvRXh0LnRy ZWUiKTtHZW9FeHQudHJlZS5PdmVybGF5TGF5ZXJDb250YWluZXI9RXh0LmV4dGVu ZChHZW9FeHQudHJlZS5MYXllckNvbnRhaW5lcix7Y29uc3RydWN0b3I6ZnVuY3Rp b24oY29uZmlnKXtjb25maWc9RXh0LmFwcGx5SWYoY29uZmlnfHx7fSx7dGV4dDoi T3ZlcmxheXMifSk7Y29uZmlnLmxvYWRlcj1FeHQuYXBwbHlJZihjb25maWcubG9h ZGVyfHx7fSx7ZmlsdGVyOmZ1bmN0aW9uKHJlY29yZCl7dmFyIGxheWVyPXJlY29y ZC5nZXRMYXllcigpO3JldHVybiBsYXllci5kaXNwbGF5SW5MYXllclN3aXRjaGVy PT09dHJ1ZSYmbGF5ZXIuaXNCYXNlTGF5ZXI9PT1mYWxzZTt9fSk7R2VvRXh0LnRy ZWUuT3ZlcmxheUxheWVyQ29udGFpbmVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3Iu Y2FsbCh0aGlzLGNvbmZpZyk7fX0pO0V4dC50cmVlLlRyZWVQYW5lbC5ub2RlVHlw ZXMuZ3hfb3ZlcmxheWxheWVyY29udGFpbmVyPUdlb0V4dC50cmVlLk92ZXJsYXlM YXllckNvbnRhaW5lcjtFeHQubmFtZXNwYWNlKCJHZW9FeHQuZGF0YSIpO0dlb0V4 dC5kYXRhLldGU0NhcGFiaWxpdGllc1JlYWRlcj1mdW5jdGlvbihtZXRhLHJlY29y ZFR5cGUpe21ldGE9bWV0YXx8e307aWYoIW1ldGEuZm9ybWF0KXttZXRhLmZvcm1h dD1uZXcgT3BlbkxheWVycy5Gb3JtYXQuV0ZTQ2FwYWJpbGl0aWVzKCk7fQppZigh KHR5cGVvZiByZWNvcmRUeXBlPT09ImZ1bmN0aW9uIikpe3JlY29yZFR5cGU9R2Vv RXh0LmRhdGEuTGF5ZXJSZWNvcmQuY3JlYXRlKHJlY29yZFR5cGV8fG1ldGEuZmll bGRzfHxbe25hbWU6Im5hbWUiLHR5cGU6InN0cmluZyJ9LHtuYW1lOiJ0aXRsZSIs dHlwZToic3RyaW5nIn0se25hbWU6Im5hbWVzcGFjZSIsdHlwZToic3RyaW5nIixt YXBwaW5nOiJmZWF0dXJlTlMifSx7bmFtZToiYWJzdHJhY3QiLHR5cGU6InN0cmlu ZyJ9XSk7fQpHZW9FeHQuZGF0YS5XRlNDYXBhYmlsaXRpZXNSZWFkZXIuc3VwZXJj bGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsbWV0YSxyZWNvcmRUeXBlKTt9O0V4 dC5leHRlbmQoR2VvRXh0LmRhdGEuV0ZTQ2FwYWJpbGl0aWVzUmVhZGVyLEV4dC5k YXRhLkRhdGFSZWFkZXIse3JlYWQ6ZnVuY3Rpb24ocmVxdWVzdCl7dmFyIGRhdGE9 cmVxdWVzdC5yZXNwb25zZVhNTDtpZighZGF0YXx8IWRhdGEuZG9jdW1lbnRFbGVt ZW50KXtkYXRhPXJlcXVlc3QucmVzcG9uc2VUZXh0O30KcmV0dXJuIHRoaXMucmVh ZFJlY29yZHMoZGF0YSk7fSxyZWFkUmVjb3JkczpmdW5jdGlvbihkYXRhKXtpZih0 eXBlb2YgZGF0YT09PSJzdHJpbmcifHxkYXRhLm5vZGVUeXBlKXtkYXRhPXRoaXMu bWV0YS5mb3JtYXQucmVhZChkYXRhKTt9CnZhciBmZWF0dXJlVHlwZXM9ZGF0YS5m ZWF0dXJlVHlwZUxpc3QuZmVhdHVyZVR5cGVzO3ZhciBmaWVsZHM9dGhpcy5yZWNv cmRUeXBlLnByb3RvdHlwZS5maWVsZHM7dmFyIGZlYXR1cmVUeXBlLHZhbHVlcyxm aWVsZCx2LHBhcnRzLGxheWVyLHZhbHVlczt2YXIgbGF5ZXJPcHRpb25zLHByb3Rv Y29sT3B0aW9uczt2YXIgcHJvdG9jb2xEZWZhdWx0cz17dXJsOmRhdGEuY2FwYWJp bGl0eS5yZXF1ZXN0LmdldGZlYXR1cmUuaHJlZi5wb3N0fTt2YXIgcmVjb3Jkcz1b XTtmb3IodmFyIGk9MCxsZW5JPWZlYXR1cmVUeXBlcy5sZW5ndGg7aTxsZW5JO2kr Kyl7ZmVhdHVyZVR5cGU9ZmVhdHVyZVR5cGVzW2ldO2lmKGZlYXR1cmVUeXBlLm5h bWUpe3ZhbHVlcz17fTtmb3IodmFyIGo9MCxsZW5KPWZpZWxkcy5sZW5ndGg7ajxs ZW5KO2orKyl7ZmllbGQ9ZmllbGRzLml0ZW1zW2pdO3Y9ZmVhdHVyZVR5cGVbZmll bGQubWFwcGluZ3x8ZmllbGQubmFtZV18fGZpZWxkLmRlZmF1bHRWYWx1ZTt2PWZp ZWxkLmNvbnZlcnQodik7dmFsdWVzW2ZpZWxkLm5hbWVdPXY7fQpwcm90b2NvbE9w dGlvbnM9e2ZlYXR1cmVUeXBlOmZlYXR1cmVUeXBlLm5hbWUsZmVhdHVyZU5TOmZl YXR1cmVUeXBlLmZlYXR1cmVOU307aWYodGhpcy5tZXRhLnByb3RvY29sT3B0aW9u cyl7RXh0LmFwcGx5KHByb3RvY29sT3B0aW9ucyx0aGlzLm1ldGEucHJvdG9jb2xP cHRpb25zLHByb3RvY29sRGVmYXVsdHMpO31lbHNle0V4dC5hcHBseShwcm90b2Nv bE9wdGlvbnMse30scHJvdG9jb2xEZWZhdWx0cyk7fQpsYXllck9wdGlvbnM9e3By b3RvY29sOm5ldyBPcGVuTGF5ZXJzLlByb3RvY29sLldGUyhwcm90b2NvbE9wdGlv bnMpLHN0cmF0ZWdpZXM6W25ldyBPcGVuTGF5ZXJzLlN0cmF0ZWd5LkZpeGVkKCld fTtpZih0aGlzLm1ldGEubGF5ZXJPcHRpb25zKXtFeHQuYXBwbHkobGF5ZXJPcHRp b25zLHRoaXMubWV0YS5sYXllck9wdGlvbnMpO30KdmFsdWVzLmxheWVyPW5ldyBP cGVuTGF5ZXJzLkxheWVyLlZlY3RvcihmZWF0dXJlVHlwZS50aXRsZXx8ZmVhdHVy ZVR5cGUubmFtZSxsYXllck9wdGlvbnMpO3JlY29yZHMucHVzaChuZXcgdGhpcy5y ZWNvcmRUeXBlKHZhbHVlcyx2YWx1ZXMubGF5ZXIuaWQpKTt9fQpyZXR1cm57dG90 YWxSZWNvcmRzOnJlY29yZHMubGVuZ3RoLHN1Y2Nlc3M6dHJ1ZSxyZWNvcmRzOnJl Y29yZHN9O319KTtFeHQubmFtZXNwYWNlKCdHZW9FeHQnKTtHZW9FeHQuTGVnZW5k UGFuZWw9RXh0LmV4dGVuZChFeHQuUGFuZWwse2R5bmFtaWM6dHJ1ZSxsYXllclN0 b3JlOm51bGwscHJlZmVycmVkVHlwZXM6bnVsbCxmaWx0ZXI6ZnVuY3Rpb24ocmVj b3JkKXtyZXR1cm4gdHJ1ZTt9LGluaXRDb21wb25lbnQ6ZnVuY3Rpb24oKXtHZW9F eHQuTGVnZW5kUGFuZWwuc3VwZXJjbGFzcy5pbml0Q29tcG9uZW50LmNhbGwodGhp cyk7fSxvblJlbmRlcjpmdW5jdGlvbigpe0dlb0V4dC5MZWdlbmRQYW5lbC5zdXBl cmNsYXNzLm9uUmVuZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighdGhpcy5s YXllclN0b3JlKXt0aGlzLmxheWVyU3RvcmU9R2VvRXh0Lk1hcFBhbmVsLmd1ZXNz KCkubGF5ZXJzO30KdGhpcy5sYXllclN0b3JlLmVhY2goZnVuY3Rpb24ocmVjb3Jk KXt0aGlzLmFkZExlZ2VuZChyZWNvcmQpO30sdGhpcyk7aWYodGhpcy5keW5hbWlj KXt0aGlzLmxheWVyU3RvcmUub24oeyJhZGQiOnRoaXMub25TdG9yZUFkZCwicmVt b3ZlIjp0aGlzLm9uU3RvcmVSZW1vdmUsImNsZWFyIjp0aGlzLm9uU3RvcmVDbGVh cixzY29wZTp0aGlzfSk7fX0scmVjb3JkSW5kZXhUb1BhbmVsSW5kZXg6ZnVuY3Rp b24oaW5kZXgpe3ZhciBzdG9yZT10aGlzLmxheWVyU3RvcmU7dmFyIGNvdW50PXN0 b3JlLmdldENvdW50KCk7dmFyIHBhbmVsSW5kZXg9LTE7dmFyIGxlZ2VuZENvdW50 PXRoaXMuaXRlbXM/dGhpcy5pdGVtcy5sZW5ndGg6MDt2YXIgcmVjb3JkLGxheWVy O2Zvcih2YXIgaT1jb3VudC0xO2k+PTA7LS1pKXtyZWNvcmQ9c3RvcmUuZ2V0QXQo aSk7bGF5ZXI9cmVjb3JkLmdldExheWVyKCk7dmFyIHR5cGVzPUdlb0V4dC5MYXll ckxlZ2VuZC5nZXRUeXBlcyhyZWNvcmQpO2lmKGxheWVyLmRpc3BsYXlJbkxheWVy U3dpdGNoZXImJnR5cGVzLmxlbmd0aD4wJiYoc3RvcmUuZ2V0QXQoaSkuZ2V0KCJo aWRlSW5MZWdlbmQiKSE9PXRydWUpKXsrK3BhbmVsSW5kZXg7aWYoaW5kZXg9PT1p fHxwYW5lbEluZGV4PmxlZ2VuZENvdW50LTEpe2JyZWFrO319fQpyZXR1cm4gcGFu ZWxJbmRleDt9LGdldElkRm9yTGF5ZXI6ZnVuY3Rpb24obGF5ZXIpe3JldHVybiB0 aGlzLmlkKyItIitsYXllci5pZDt9LG9uU3RvcmVBZGQ6ZnVuY3Rpb24oc3RvcmUs cmVjb3JkcyxpbmRleCl7dmFyIHBhbmVsSW5kZXg9dGhpcy5yZWNvcmRJbmRleFRv UGFuZWxJbmRleChpbmRleCtyZWNvcmRzLmxlbmd0aC0xKTtmb3IodmFyIGk9MCxs ZW49cmVjb3Jkcy5sZW5ndGg7aTxsZW47aSsrKXt0aGlzLmFkZExlZ2VuZChyZWNv cmRzW2ldLHBhbmVsSW5kZXgpO30KdGhpcy5kb0xheW91dCgpO30sb25TdG9yZVJl bW92ZTpmdW5jdGlvbihzdG9yZSxyZWNvcmQsaW5kZXgpe3RoaXMucmVtb3ZlTGVn ZW5kKHJlY29yZCk7fSxyZW1vdmVMZWdlbmQ6ZnVuY3Rpb24ocmVjb3JkKXtpZih0 aGlzLml0ZW1zKXt2YXIgbGVnZW5kPXRoaXMuZ2V0Q29tcG9uZW50KHRoaXMuZ2V0 SWRGb3JMYXllcihyZWNvcmQuZ2V0TGF5ZXIoKSkpO2lmKGxlZ2VuZCl7dGhpcy5y ZW1vdmUobGVnZW5kLHRydWUpO3RoaXMuZG9MYXlvdXQoKTt9fX0sb25TdG9yZUNs ZWFyOmZ1bmN0aW9uKHN0b3JlKXt0aGlzLnJlbW92ZUFsbExlZ2VuZHMoKTt9LHJl bW92ZUFsbExlZ2VuZHM6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUFsbCh0cnVlKTt0 aGlzLmRvTGF5b3V0KCk7fSxhZGRMZWdlbmQ6ZnVuY3Rpb24ocmVjb3JkLGluZGV4 KXtpZih0aGlzLmZpbHRlcihyZWNvcmQpPT09dHJ1ZSl7dmFyIGxheWVyPXJlY29y ZC5nZXRMYXllcigpO2luZGV4PWluZGV4fHwwO3ZhciBsZWdlbmQ7dmFyIHR5cGVz PUdlb0V4dC5MYXllckxlZ2VuZC5nZXRUeXBlcyhyZWNvcmQsdGhpcy5wcmVmZXJy ZWRUeXBlcyk7aWYobGF5ZXIuZGlzcGxheUluTGF5ZXJTd2l0Y2hlciYmIXJlY29y ZC5nZXQoJ2hpZGVJbkxlZ2VuZCcpJiZ0eXBlcy5sZW5ndGg+MCl7dGhpcy5pbnNl cnQoaW5kZXgse3h0eXBlOnR5cGVzWzBdLGlkOnRoaXMuZ2V0SWRGb3JMYXllcihs YXllciksbGF5ZXJSZWNvcmQ6cmVjb3JkLGhpZGRlbjohKCghbGF5ZXIubWFwJiZs YXllci52aXNpYmlsaXR5KXx8KGxheWVyLmdldFZpc2liaWxpdHkoKSYmbGF5ZXIu Y2FsY3VsYXRlSW5SYW5nZSgpKSl9KTt9fX0sb25EZXN0cm95OmZ1bmN0aW9uKCl7 aWYodGhpcy5sYXllclN0b3JlKXt0aGlzLmxheWVyU3RvcmUudW4oImFkZCIsdGhp cy5vblN0b3JlQWRkLHRoaXMpO3RoaXMubGF5ZXJTdG9yZS51bigicmVtb3ZlIix0 aGlzLm9uU3RvcmVSZW1vdmUsdGhpcyk7dGhpcy5sYXllclN0b3JlLnVuKCJjbGVh ciIsdGhpcy5vblN0b3JlQ2xlYXIsdGhpcyk7fQpHZW9FeHQuTGVnZW5kUGFuZWwu c3VwZXJjbGFzcy5vbkRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpO319KTtF eHQucmVnKCdneF9sZWdlbmRwYW5lbCcsR2VvRXh0LkxlZ2VuZFBhbmVsKTtFeHQu bmFtZXNwYWNlKCJHZW9FeHQuZm9ybSIpO0dlb0V4dC5mb3JtLnRvRmlsdGVyPWZ1 bmN0aW9uKGZvcm0sbG9naWNhbE9wLHdpbGRjYXJkKXtpZihmb3JtIGluc3RhbmNl b2YgRXh0LmZvcm0uRm9ybVBhbmVsKXtmb3JtPWZvcm0uZ2V0Rm9ybSgpO30KdmFy IGZpbHRlcnM9W10sdmFsdWVzPWZvcm0uZ2V0VmFsdWVzKGZhbHNlKTtmb3IodmFy IHByb3AgaW4gdmFsdWVzKXt2YXIgcz1wcm9wLnNwbGl0KCJfXyIpO3ZhciB2YWx1 ZT12YWx1ZXNbcHJvcF0sdHlwZTtpZihzLmxlbmd0aD4xJiYodHlwZT1HZW9FeHQu Zm9ybS50b0ZpbHRlci5GSUxURVJfTUFQW3NbMV1dKSE9PXVuZGVmaW5lZCl7cHJv cD1zWzBdO31lbHNle3R5cGU9T3BlbkxheWVycy5GaWx0ZXIuQ29tcGFyaXNvbi5F UVVBTF9UTzt9CmlmKHR5cGU9PT1PcGVuTGF5ZXJzLkZpbHRlci5Db21wYXJpc29u LkxJS0Upe3N3aXRjaCh3aWxkY2FyZCl7Y2FzZSBHZW9FeHQuZm9ybS5FTkRTX1dJ VEg6dmFsdWU9Jy4qJyt2YWx1ZTticmVhaztjYXNlIEdlb0V4dC5mb3JtLlNUQVJU U19XSVRIOnZhbHVlKz0nLionO2JyZWFrO2Nhc2UgR2VvRXh0LmZvcm0uQ09OVEFJ TlM6dmFsdWU9Jy4qJyt2YWx1ZSsnLionO2JyZWFrO2RlZmF1bHQ6YnJlYWs7fX0K ZmlsdGVycy5wdXNoKG5ldyBPcGVuTGF5ZXJzLkZpbHRlci5Db21wYXJpc29uKHt0 eXBlOnR5cGUsdmFsdWU6dmFsdWUscHJvcGVydHk6cHJvcH0pKTt9CnJldHVybiBu ZXcgT3BlbkxheWVycy5GaWx0ZXIuTG9naWNhbCh7dHlwZTpsb2dpY2FsT3B8fE9w ZW5MYXllcnMuRmlsdGVyLkxvZ2ljYWwuQU5ELGZpbHRlcnM6ZmlsdGVyc30pO307 R2VvRXh0LmZvcm0udG9GaWx0ZXIuRklMVEVSX01BUD17ImVxIjpPcGVuTGF5ZXJz LkZpbHRlci5Db21wYXJpc29uLkVRVUFMX1RPLCJuZSI6T3BlbkxheWVycy5GaWx0 ZXIuQ29tcGFyaXNvbi5OT1RfRVFVQUxfVE8sImx0IjpPcGVuTGF5ZXJzLkZpbHRl ci5Db21wYXJpc29uLkxFU1NfVEhBTiwibGUiOk9wZW5MYXllcnMuRmlsdGVyLkNv bXBhcmlzb24uTEVTU19USEFOX09SX0VRVUFMX1RPLCJndCI6T3BlbkxheWVycy5G aWx0ZXIuQ29tcGFyaXNvbi5HUkVBVEVSX1RIQU4sImdlIjpPcGVuTGF5ZXJzLkZp bHRlci5Db21wYXJpc29uLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UTywibGlrZSI6 T3BlbkxheWVycy5GaWx0ZXIuQ29tcGFyaXNvbi5MSUtFfTtHZW9FeHQuZm9ybS5F TkRTX1dJVEg9MTtHZW9FeHQuZm9ybS5TVEFSVFNfV0lUSD0yO0dlb0V4dC5mb3Jt LkNPTlRBSU5TPTM7R2VvRXh0LmZvcm0ucmVjb3JkVG9GaWVsZD1mdW5jdGlvbihy ZWNvcmQpe3ZhciB0eXBlPXJlY29yZC5nZXQoInR5cGUiKTtpZih0eXBlb2YgdHlw ZT09PSJvYmplY3QiJiZ0eXBlLnh0eXBlKXtyZXR1cm4gdHlwZTt9CnZhciBmaWVs ZDt2YXIgbmFtZT1yZWNvcmQuZ2V0KCJuYW1lIik7dmFyIGxhYmVsPXJlY29yZC5n ZXQoImxhYmVsIik7dmFyIHJlc3RyaWN0aW9uPXJlY29yZC5nZXQoInJlc3RyaWN0 aW9uIil8fHt9O2lmKGxhYmVsPT1udWxsKXtsYWJlbD1uYW1lO30KdHlwZT10eXBl LnNwbGl0KCI6IikucG9wKCk7dmFyIHI9R2VvRXh0LmZvcm0ucmVjb3JkVG9GaWVs ZC5SRUdFWEVTO2lmKHR5cGUubWF0Y2goclsidGV4dCJdKSl7dmFyIG1heExlbmd0 aD1yZXN0cmljdGlvblsibWF4TGVuZ3RoIl0hPT11bmRlZmluZWQ/cGFyc2VGbG9h dChyZXN0cmljdGlvblsibWF4TGVuZ3RoIl0pOnVuZGVmaW5lZDt2YXIgbWluTGVu Z3RoPXJlc3RyaWN0aW9uWyJtaW5MZW5ndGgiXSE9PXVuZGVmaW5lZD9wYXJzZUZs b2F0KHJlc3RyaWN0aW9uWyJtaW5MZW5ndGgiXSk6dW5kZWZpbmVkO2ZpZWxkPXt4 dHlwZToidGV4dGZpZWxkIixuYW1lOm5hbWUsZmllbGRMYWJlbDpsYWJlbCxtYXhM ZW5ndGg6bWF4TGVuZ3RoLG1pbkxlbmd0aDptaW5MZW5ndGh9O31lbHNlIGlmKHR5 cGUubWF0Y2goclsibnVtYmVyIl0pKXt2YXIgbWF4VmFsdWU9cmVzdHJpY3Rpb25b Im1heEluY2x1c2l2ZSJdIT09dW5kZWZpbmVkP3BhcnNlRmxvYXQocmVzdHJpY3Rp b25bIm1heEluY2x1c2l2ZSJdKTp1bmRlZmluZWQ7dmFyIG1pblZhbHVlPXJlc3Ry aWN0aW9uWyJtaW5JbmNsdXNpdmUiXSE9PXVuZGVmaW5lZD9wYXJzZUZsb2F0KHJl c3RyaWN0aW9uWyJtaW5JbmNsdXNpdmUiXSk6dW5kZWZpbmVkO2ZpZWxkPXt4dHlw ZToibnVtYmVyZmllbGQiLG5hbWU6bmFtZSxmaWVsZExhYmVsOmxhYmVsLG1heFZh bHVlOm1heFZhbHVlLG1pblZhbHVlOm1pblZhbHVlfTt9ZWxzZSBpZih0eXBlLm1h dGNoKHJbImJvb2xlYW4iXSkpe2ZpZWxkPXt4dHlwZToiY2hlY2tib3giLG5hbWU6 bmFtZSxib3hMYWJlbDpsYWJlbH07fWVsc2UgaWYodHlwZS5tYXRjaChyWyJkYXRl Il0pKXtmaWVsZD17eHR5cGU6ImRhdGVmaWVsZCIsZmllbGRMYWJlbDpsYWJlbCxu YW1lOm5hbWV9O30KcmV0dXJuIGZpZWxkO30KR2VvRXh0LmZvcm0ucmVjb3JkVG9G aWVsZC5SRUdFWEVTPXsidGV4dCI6bmV3IFJlZ0V4cCgiXih0ZXh0fHN0cmluZykk IiwiaSIpLCJudW1iZXIiOm5ldyBSZWdFeHAoIl4obnVtYmVyfGZsb2F0fGRlY2lt YWx8ZG91YmxlfGludHxsb25nfGludGVnZXJ8c2hvcnQpJCIsImkiKSwiYm9vbGVh biI6bmV3IFJlZ0V4cCgiXihib29sZWFuKSQiLCJpIiksImRhdGUiOm5ldyBSZWdF eHAoIl4oZGF0ZVRpbWUpJCIsImkiKX07RXh0Lm5hbWVzcGFjZSgiR2VvRXh0LnBs dWdpbnMiKTtHZW9FeHQucGx1Z2lucy5QcmludFBhZ2VGaWVsZD1FeHQuZXh0ZW5k KEV4dC51dGlsLk9ic2VydmFibGUse3ByaW50UGFnZTpudWxsLHRhcmdldDpudWxs LGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGNvbmZpZyl7dGhpcy5pbml0aWFsQ29uZmln PWNvbmZpZztFeHQuYXBwbHkodGhpcyxjb25maWcpO0dlb0V4dC5wbHVnaW5zLlBy aW50UGFnZUZpZWxkLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcyxh cmd1bWVudHMpO30saW5pdDpmdW5jdGlvbih0YXJnZXQpe3RoaXMudGFyZ2V0PXRh cmdldDt2YXIgb25DZmc9eyJiZWZvcmVkZXN0cm95Ijp0aGlzLm9uQmVmb3JlRGVz dHJveSxzY29wZTp0aGlzfTt2YXIgZXZlbnROYW1lPXRhcmdldCBpbnN0YW5jZW9m IEV4dC5mb3JtLkNvbWJvQm94PyJzZWxlY3QiOnRhcmdldCBpbnN0YW5jZW9mIEV4 dC5mb3JtLkNoZWNrYm94PyJjaGVjayI6InZhbGlkIjtvbkNmZ1tldmVudE5hbWVd PXRoaXMub25GaWVsZENoYW5nZTt0YXJnZXQub24ob25DZmcpO3RoaXMucHJpbnRQ YWdlLm9uKHsiY2hhbmdlIjp0aGlzLm9uUGFnZUNoYW5nZSxzY29wZTp0aGlzfSk7 dGhpcy5wcmludFBhZ2UucHJpbnRQcm92aWRlci5vbih7ImxheW91dGNoYW5nZSI6 dGhpcy5vbkxheW91dENoYW5nZSxzY29wZTp0aGlzfSk7dGhpcy5zZXRWYWx1ZSh0 aGlzLnByaW50UGFnZSk7fSxvbkZpZWxkQ2hhbmdlOmZ1bmN0aW9uKGZpZWxkLHJl Y29yZCl7dmFyIHByaW50UHJvdmlkZXI9dGhpcy5wcmludFBhZ2UucHJpbnRQcm92 aWRlcjt2YXIgdmFsdWU9ZmllbGQuZ2V0VmFsdWUoKTt0aGlzLl91cGRhdGluZz10 cnVlO2lmKGZpZWxkLnN0b3JlPT09cHJpbnRQcm92aWRlci5zY2FsZXN8fGZpZWxk Lm5hbWU9PT0ic2NhbGUiKXt0aGlzLnByaW50UGFnZS5zZXRTY2FsZShyZWNvcmQp O31lbHNlIGlmKGZpZWxkLm5hbWU9PSJyb3RhdGlvbiIpeyFpc05hTih2YWx1ZSkm JnRoaXMucHJpbnRQYWdlLnNldFJvdGF0aW9uKHZhbHVlKTt9ZWxzZXt0aGlzLnBy aW50UGFnZS5jdXN0b21QYXJhbXNbZmllbGQubmFtZV09dmFsdWU7fQpkZWxldGUg dGhpcy5fdXBkYXRpbmc7fSxvblBhZ2VDaGFuZ2U6ZnVuY3Rpb24ocHJpbnRQYWdl KXtpZighdGhpcy5fdXBkYXRpbmcpe3RoaXMuc2V0VmFsdWUocHJpbnRQYWdlKTt9 fSxvbkxheW91dENoYW5nZTpmdW5jdGlvbihwcmludFByb3ZpZGVyLGxheW91dCl7 dmFyIHQ9dGhpcy50YXJnZXQ7dC5uYW1lPT0icm90YXRpb24iJiZ0LnNldERpc2Fi bGVkKCFsYXlvdXQuZ2V0KCJyb3RhdGlvbiIpKTt9LHNldFZhbHVlOmZ1bmN0aW9u KHByaW50UGFnZSl7dmFyIHQ9dGhpcy50YXJnZXQ7dC5zdXNwZW5kRXZlbnRzKCk7 aWYodC5zdG9yZT09PXByaW50UGFnZS5wcmludFByb3ZpZGVyLnNjYWxlc3x8dC5u YW1lPT09InNjYWxlIil7aWYocHJpbnRQYWdlLnNjYWxlKXt0LnNldFZhbHVlKHBy aW50UGFnZS5zY2FsZS5nZXQodC5kaXNwbGF5RmllbGQpKTt9fWVsc2UgaWYodC5u YW1lPT0icm90YXRpb24iKXt0LnNldFZhbHVlKHByaW50UGFnZS5yb3RhdGlvbik7 fQp0LnJlc3VtZUV2ZW50cygpO30sb25CZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7 dGhpcy50YXJnZXQudW4oImJlZm9yZWRlc3Ryb3kiLHRoaXMub25CZWZvcmVEZXN0 cm95LHRoaXMpO3RoaXMudGFyZ2V0LnVuKCJzZWxlY3QiLHRoaXMub25GaWVsZENo YW5nZSx0aGlzKTt0aGlzLnRhcmdldC51bigidmFsaWQiLHRoaXMub25GaWVsZENo YW5nZSx0aGlzKTt0aGlzLnByaW50UGFnZS51bigiY2hhbmdlIix0aGlzLm9uUGFn ZUNoYW5nZSx0aGlzKTt0aGlzLnByaW50UGFnZS5wcmludFByb3ZpZGVyLnVuKCJs YXlvdXRjaGFuZ2UiLHRoaXMub25MYXlvdXRDaGFuZ2UsdGhpcyk7fX0pO0V4dC5w cmVnKCJneF9wcmludHBhZ2VmaWVsZCIsR2VvRXh0LnBsdWdpbnMuUHJpbnRQYWdl RmllbGQpO0V4dC5uYW1lc3BhY2UoIkdlb0V4dC50cmVlIik7R2VvRXh0LnRyZWUu TGF5ZXJOb2RlVUk9RXh0LmV4dGVuZChFeHQudHJlZS5UcmVlTm9kZVVJLHtjb25z dHJ1Y3RvcjpmdW5jdGlvbihjb25maWcpe0dlb0V4dC50cmVlLkxheWVyTm9kZVVJ LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpO30s cmVuZGVyOmZ1bmN0aW9uKGJ1bGtSZW5kZXIpe3ZhciBhPXRoaXMubm9kZS5hdHRy aWJ1dGVzO2lmKGEuY2hlY2tlZD09PXVuZGVmaW5lZCl7YS5jaGVja2VkPXRoaXMu bm9kZS5sYXllci5nZXRWaXNpYmlsaXR5KCk7fQpHZW9FeHQudHJlZS5MYXllck5v ZGVVSS5zdXBlcmNsYXNzLnJlbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFy IGNiPXRoaXMuY2hlY2tib3g7aWYoYS5jaGVja2VkR3JvdXApe3ZhciByYWRpbz1F eHQuRG9tSGVscGVyLmluc2VydEFmdGVyKGNiLFsnPGlucHV0IHR5cGU9InJhZGlv IiBuYW1lPSInLGEuY2hlY2tlZEdyb3VwLCdfY2hlY2tib3giIGNsYXNzPSInLGNi LmNsYXNzTmFtZSxjYi5jaGVja2VkPyciIGNoZWNrZWQ9ImNoZWNrZWQiJzonJywn Ij48L2lucHV0PiddLmpvaW4oIiIpKTtyYWRpby5kZWZhdWx0Q2hlY2tlZD1jYi5k ZWZhdWx0Q2hlY2tlZDtFeHQuZ2V0KGNiKS5yZW1vdmUoKTt0aGlzLmNoZWNrYm94 PXJhZGlvO30KdGhpcy5lbmZvcmNlT25lVmlzaWJsZSgpO30sb25DbGljazpmdW5j dGlvbihlKXtpZihlLmdldFRhcmdldCgnLngtdHJlZS1ub2RlLWNiJywxKSl7dGhp cy50b2dnbGVDaGVjayh0aGlzLmlzQ2hlY2tlZCgpKTt9ZWxzZXtHZW9FeHQudHJl ZS5MYXllck5vZGVVSS5zdXBlcmNsYXNzLm9uQ2xpY2suYXBwbHkodGhpcyxhcmd1 bWVudHMpO319LHRvZ2dsZUNoZWNrOmZ1bmN0aW9uKHZhbHVlKXt2YWx1ZT0odmFs dWU9PT11bmRlZmluZWQ/IXRoaXMuaXNDaGVja2VkKCk6dmFsdWUpO0dlb0V4dC50 cmVlLkxheWVyTm9kZVVJLnN1cGVyY2xhc3MudG9nZ2xlQ2hlY2suY2FsbCh0aGlz LHZhbHVlKTt0aGlzLmVuZm9yY2VPbmVWaXNpYmxlKCk7fSxlbmZvcmNlT25lVmlz aWJsZTpmdW5jdGlvbigpe3ZhciBhdHRyaWJ1dGVzPXRoaXMubm9kZS5hdHRyaWJ1 dGVzO3ZhciBncm91cD1hdHRyaWJ1dGVzLmNoZWNrZWRHcm91cDtpZihncm91cCYm Z3JvdXAhPT0iZ3hfYmFzZWxheWVyIil7dmFyIGxheWVyPXRoaXMubm9kZS5sYXll cjt2YXIgY2hlY2tlZE5vZGVzPXRoaXMubm9kZS5nZXRPd25lclRyZWUoKS5nZXRD aGVja2VkKCk7dmFyIGNoZWNrZWRDb3VudD0wO0V4dC5lYWNoKGNoZWNrZWROb2Rl cyxmdW5jdGlvbihuKXt2YXIgbD1uLmxheWVyCmlmKCFuLmhpZGRlbiYmbi5hdHRy aWJ1dGVzLmNoZWNrZWRHcm91cD09PWdyb3VwKXtjaGVja2VkQ291bnQrKztpZihs IT1sYXllciYmYXR0cmlidXRlcy5jaGVja2VkKXtsLnNldFZpc2liaWxpdHkoZmFs c2UpO319fSk7aWYoY2hlY2tlZENvdW50PT09MCYmYXR0cmlidXRlcy5jaGVja2Vk PT1mYWxzZSl7bGF5ZXIuc2V0VmlzaWJpbGl0eSh0cnVlKTt9fX0sYXBwZW5kRERH aG9zdDpmdW5jdGlvbihnaG9zdE5vZGUpe3ZhciBuPXRoaXMuZWxOb2RlLmNsb25l Tm9kZSh0cnVlKTt2YXIgcmFkaW89RXh0LkRvbVF1ZXJ5LnNlbGVjdCgiaW5wdXRb dHlwZT0ncmFkaW8nXSIsbik7RXh0LmVhY2gocmFkaW8sZnVuY3Rpb24ocil7ci5u YW1lPXIubmFtZSsiX2Nsb25lIjt9KTtnaG9zdE5vZGUuYXBwZW5kQ2hpbGQobik7 fX0pO0dlb0V4dC50cmVlLkxheWVyTm9kZT1FeHQuZXh0ZW5kKEV4dC50cmVlLkFz eW5jVHJlZU5vZGUse2xheWVyOm51bGwsbGF5ZXJTdG9yZTpudWxsLGNvbnN0cnVj dG9yOmZ1bmN0aW9uKGNvbmZpZyl7Y29uZmlnLmxlYWY9Y29uZmlnLmxlYWZ8fCEo Y29uZmlnLmNoaWxkcmVufHxjb25maWcubG9hZGVyKTtpZighY29uZmlnLmljb25D bHMmJiFjb25maWcuY2hpbGRyZW4pe2NvbmZpZy5pY29uQ2xzPSJneC10cmVlLWxh eWVyLWljb24iO30KaWYoY29uZmlnLmxvYWRlciYmIShjb25maWcubG9hZGVyIGlu c3RhbmNlb2YgRXh0LnRyZWUuVHJlZUxvYWRlcikpe2NvbmZpZy5sb2FkZXI9bmV3 IEdlb0V4dC50cmVlLkxheWVyUGFyYW1Mb2FkZXIoY29uZmlnLmxvYWRlcik7fQp0 aGlzLmRlZmF1bHRVST10aGlzLmRlZmF1bHRVSXx8R2VvRXh0LnRyZWUuTGF5ZXJO b2RlVUk7RXh0LmFwcGx5KHRoaXMse2xheWVyOmNvbmZpZy5sYXllcixsYXllclN0 b3JlOmNvbmZpZy5sYXllclN0b3JlfSk7aWYoY29uZmlnLnRleHQpe3RoaXMuZml4 ZWRUZXh0PXRydWU7fQpHZW9FeHQudHJlZS5MYXllck5vZGUuc3VwZXJjbGFzcy5j b25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fSxyZW5kZXI6ZnVuY3Rp b24oYnVsa1JlbmRlcil7dmFyIGxheWVyPXRoaXMubGF5ZXIgaW5zdGFuY2VvZiBP cGVuTGF5ZXJzLkxheWVyJiZ0aGlzLmxheWVyO2lmKCFsYXllcil7aWYoIXRoaXMu bGF5ZXJTdG9yZXx8dGhpcy5sYXllclN0b3JlPT0iYXV0byIpe3RoaXMubGF5ZXJT dG9yZT1HZW9FeHQuTWFwUGFuZWwuZ3Vlc3MoKS5sYXllcnM7fQp2YXIgaT10aGlz LmxheWVyU3RvcmUuZmluZEJ5KGZ1bmN0aW9uKG8pe3JldHVybiBvLmdldCgidGl0 bGUiKT09dGhpcy5sYXllcjt9LHRoaXMpO2lmKGkhPS0xKXtsYXllcj10aGlzLmxh eWVyU3RvcmUuZ2V0QXQoaSkuZ2V0TGF5ZXIoKTt9fQppZighdGhpcy5yZW5kZXJl ZHx8IWxheWVyKXt2YXIgdWk9dGhpcy5nZXRVSSgpO2lmKGxheWVyKXt0aGlzLmxh eWVyPWxheWVyO2lmKGxheWVyLmlzQmFzZUxheWVyKXt0aGlzLmRyYWdnYWJsZT1m YWxzZTtFeHQuYXBwbHlJZih0aGlzLmF0dHJpYnV0ZXMse2NoZWNrZWRHcm91cDoi Z3hfYmFzZWxheWVyIn0pO30KaWYoIXRoaXMudGV4dCl7dGhpcy50ZXh0PWxheWVy Lm5hbWU7fQp1aS5zaG93KCk7dGhpcy5hZGRWaXNpYmlsaXR5RXZlbnRIYW5kbGVy cygpO31lbHNle3VpLmhpZGUoKTt9CmlmKHRoaXMubGF5ZXJTdG9yZSBpbnN0YW5j ZW9mIEdlb0V4dC5kYXRhLkxheWVyU3RvcmUpe3RoaXMuYWRkU3RvcmVFdmVudEhh bmRsZXJzKGxheWVyKTt9fQpHZW9FeHQudHJlZS5MYXllck5vZGUuc3VwZXJjbGFz cy5yZW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO30sYWRkVmlzaWJpbGl0eUV2 ZW50SGFuZGxlcnM6ZnVuY3Rpb24oKXt0aGlzLmxheWVyLmV2ZW50cy5vbih7InZp c2liaWxpdHljaGFuZ2VkIjp0aGlzLm9uTGF5ZXJWaXNpYmlsaXR5Q2hhbmdlZCxz Y29wZTp0aGlzfSk7dGhpcy5vbih7ImNoZWNrY2hhbmdlIjp0aGlzLm9uQ2hlY2tD aGFuZ2Usc2NvcGU6dGhpc30pO30sb25MYXllclZpc2liaWxpdHlDaGFuZ2VkOmZ1 bmN0aW9uKCl7aWYoIXRoaXMuX3Zpc2liaWxpdHlDaGFuZ2luZyl7dGhpcy5nZXRV SSgpLnRvZ2dsZUNoZWNrKHRoaXMubGF5ZXIuZ2V0VmlzaWJpbGl0eSgpKTt9fSxv bkNoZWNrQ2hhbmdlOmZ1bmN0aW9uKG5vZGUsY2hlY2tlZCl7aWYoY2hlY2tlZCE9 dGhpcy5sYXllci5nZXRWaXNpYmlsaXR5KCkpe3RoaXMuX3Zpc2liaWxpdHlDaGFu Z2luZz10cnVlO3ZhciBsYXllcj10aGlzLmxheWVyO2lmKGNoZWNrZWQmJmxheWVy LmlzQmFzZUxheWVyJiZsYXllci5tYXApe2xheWVyLm1hcC5zZXRCYXNlTGF5ZXIo bGF5ZXIpO31lbHNle2xheWVyLnNldFZpc2liaWxpdHkoY2hlY2tlZCk7fQpkZWxl dGUgdGhpcy5fdmlzaWJpbGl0eUNoYW5naW5nO319LGFkZFN0b3JlRXZlbnRIYW5k bGVyczpmdW5jdGlvbigpe3RoaXMubGF5ZXJTdG9yZS5vbih7ImFkZCI6dGhpcy5v blN0b3JlQWRkLCJyZW1vdmUiOnRoaXMub25TdG9yZVJlbW92ZSwidXBkYXRlIjp0 aGlzLm9uU3RvcmVVcGRhdGUsc2NvcGU6dGhpc30pO30sb25TdG9yZUFkZDpmdW5j dGlvbihzdG9yZSxyZWNvcmRzLGluZGV4KXt2YXIgbDtmb3IodmFyIGk9MDtpPHJl Y29yZHMubGVuZ3RoOysraSl7bD1yZWNvcmRzW2ldLmdldExheWVyKCk7aWYodGhp cy5sYXllcj09bCl7dGhpcy5nZXRVSSgpLnNob3coKTticmVhazt9ZWxzZSBpZih0 aGlzLmxheWVyPT1sLm5hbWUpe3RoaXMucmVuZGVyKCk7YnJlYWs7fX19LG9uU3Rv cmVSZW1vdmU6ZnVuY3Rpb24oc3RvcmUscmVjb3JkLGluZGV4KXtpZih0aGlzLmxh eWVyPT1yZWNvcmQuZ2V0TGF5ZXIoKSl7dGhpcy5nZXRVSSgpLmhpZGUoKTt9fSxv blN0b3JlVXBkYXRlOmZ1bmN0aW9uKHN0b3JlLHJlY29yZCxvcGVyYXRpb24pe3Zh ciBsYXllcj1yZWNvcmQuZ2V0TGF5ZXIoKTtpZighdGhpcy5maXhlZFRleHQmJih0 aGlzLmxheWVyPT1sYXllciYmdGhpcy50ZXh0IT09bGF5ZXIubmFtZSkpe3RoaXMu c2V0VGV4dChsYXllci5uYW1lKTt9fSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGxh eWVyPXRoaXMubGF5ZXI7aWYobGF5ZXIgaW5zdGFuY2VvZiBPcGVuTGF5ZXJzLkxh eWVyKXtsYXllci5ldmVudHMudW4oeyJ2aXNpYmlsaXR5Y2hhbmdlZCI6dGhpcy5v bkxheWVyVmlzaWJpbGl0eUNoYW5nZWQsc2NvcGU6dGhpc30pO30KZGVsZXRlIHRo aXMubGF5ZXI7dmFyIGxheWVyU3RvcmU9dGhpcy5sYXllclN0b3JlO2lmKGxheWVy U3RvcmUpe2xheWVyU3RvcmUudW4oImFkZCIsdGhpcy5vblN0b3JlQWRkLHRoaXMp O2xheWVyU3RvcmUudW4oInJlbW92ZSIsdGhpcy5vblN0b3JlUmVtb3ZlLHRoaXMp O2xheWVyU3RvcmUudW4oInVwZGF0ZSIsdGhpcy5vblN0b3JlVXBkYXRlLHRoaXMp O30KZGVsZXRlIHRoaXMubGF5ZXJTdG9yZTt0aGlzLnVuKCJjaGVja2NoYW5nZSIs dGhpcy5vbkNoZWNrQ2hhbmdlLHRoaXMpO0dlb0V4dC50cmVlLkxheWVyTm9kZS5z dXBlcmNsYXNzLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpO319KTtFeHQu dHJlZS5UcmVlUGFuZWwubm9kZVR5cGVzLmd4X2xheWVyPUdlb0V4dC50cmVlLkxh eWVyTm9kZTtFeHQubmFtZXNwYWNlKCJHZW9FeHQudHJlZSIpO0dlb0V4dC50cmVl LkxheWVyUGFyYW1Ob2RlPUV4dC5leHRlbmQoRXh0LnRyZWUuVHJlZU5vZGUse2xh eWVyOm51bGwscGFyYW06bnVsbCxpdGVtOm51bGwsZGVsaW1pdGVyOm51bGwsYWxs SXRlbXM6bnVsbCxjb25zdHJ1Y3RvcjpmdW5jdGlvbihhdHRyaWJ1dGVzKXt2YXIg Y29uZmlnPWF0dHJpYnV0ZXN8fHt9O2NvbmZpZy5pY29uQ2xzPWNvbmZpZy5pY29u Q2xzfHwiZ3gtdHJlZS1sYXllcnBhcmFtLWljb24iO2NvbmZpZy50ZXh0PWNvbmZp Zy50ZXh0fHxjb25maWcuaXRlbTt0aGlzLnBhcmFtPWNvbmZpZy5wYXJhbTt0aGlz Lml0ZW09Y29uZmlnLml0ZW07dGhpcy5kZWxpbWl0ZXI9Y29uZmlnLmRlbGltaXRl cnx8IiwiO3RoaXMuYWxsSXRlbXM9Y29uZmlnLmFsbEl0ZW1zO0dlb0V4dC50cmVl LkxheWVyUGFyYW1Ob2RlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhp cyxhcmd1bWVudHMpO3RoaXMuZ2V0TGF5ZXIoKTtpZih0aGlzLmxheWVyKXtpZigh dGhpcy5hbGxJdGVtcyl7dGhpcy5hbGxJdGVtcz10aGlzLmdldEl0ZW1zRnJvbUxh eWVyKCk7fQppZih0aGlzLmF0dHJpYnV0ZXMuY2hlY2tlZD09bnVsbCl7dGhpcy5h dHRyaWJ1dGVzLmNoZWNrZWQ9dGhpcy5sYXllci5nZXRWaXNpYmlsaXR5KCkmJnRo aXMuZ2V0SXRlbXNGcm9tTGF5ZXIoKS5pbmRleE9mKHRoaXMuaXRlbSk+PTA7fWVs c2V7dGhpcy5vbkNoZWNrQ2hhbmdlKHRoaXMsdGhpcy5hdHRyaWJ1dGVzLmNoZWNr ZWQpO30KdGhpcy5sYXllci5ldmVudHMub24oeyJ2aXNpYmlsaXR5Y2hhbmdlZCI6 dGhpcy5vbkxheWVyVmlzaWJpbGl0eUNoYW5nZWQsc2NvcGU6dGhpc30pO3RoaXMu b24oeyJjaGVja2NoYW5nZSI6dGhpcy5vbkNoZWNrQ2hhbmdlLHNjb3BlOnRoaXN9 KTt9fSxnZXRMYXllcjpmdW5jdGlvbigpe2lmKCF0aGlzLmxheWVyKXt2YXIgbGF5 ZXI9dGhpcy5hdHRyaWJ1dGVzLmxheWVyO2lmKHR5cGVvZiBsYXllcj09InN0cmlu ZyIpe3ZhciBzdG9yZT10aGlzLmF0dHJpYnV0ZXMubGF5ZXJTdG9yZXx8R2VvRXh0 Lk1hcFBhbmVsLmd1ZXNzKCkubGF5ZXJzO3ZhciBpPXN0b3JlLmZpbmRCeShmdW5j dGlvbihvKXtyZXR1cm4gby5nZXQoInRpdGxlIik9PWxheWVyO30pO2xheWVyPWkh PS0xP3N0b3JlLmdldEF0KGkpLmdldExheWVyKCk6bnVsbDt9CnRoaXMubGF5ZXI9 bGF5ZXI7fQpyZXR1cm4gdGhpcy5sYXllcjt9LGdldEl0ZW1zRnJvbUxheWVyOmZ1 bmN0aW9uKCl7dmFyIHBhcmFtVmFsdWU9dGhpcy5sYXllci5wYXJhbXNbdGhpcy5w YXJhbV07cmV0dXJuIHBhcmFtVmFsdWUgaW5zdGFuY2VvZiBBcnJheT9wYXJhbVZh bHVlOihwYXJhbVZhbHVlP3BhcmFtVmFsdWUuc3BsaXQodGhpcy5kZWxpbWl0ZXIp OltdKTt9LGNyZWF0ZVBhcmFtczpmdW5jdGlvbihpdGVtcyl7dmFyIHBhcmFtcz17 fTtwYXJhbXNbdGhpcy5wYXJhbV09dGhpcy5sYXllci5wYXJhbXNbdGhpcy5wYXJh bV1pbnN0YW5jZW9mIEFycmF5P2l0ZW1zOml0ZW1zLmpvaW4odGhpcy5kZWxpbWl0 ZXIpO3JldHVybiBwYXJhbXM7fSxvbkxheWVyVmlzaWJpbGl0eUNoYW5nZWQ6ZnVu Y3Rpb24oKXtpZih0aGlzLmdldEl0ZW1zRnJvbUxheWVyKCkubGVuZ3RoPT09MCl7 dGhpcy5sYXllci5tZXJnZU5ld1BhcmFtcyh0aGlzLmNyZWF0ZVBhcmFtcyh0aGlz LmFsbEl0ZW1zKSk7fQp2YXIgdmlzaWJsZT10aGlzLmxheWVyLmdldFZpc2liaWxp dHkoKTtpZih2aXNpYmxlJiZ0aGlzLmdldEl0ZW1zRnJvbUxheWVyKCkuaW5kZXhP Zih0aGlzLml0ZW0pIT09LTEpe3RoaXMuZ2V0VUkoKS50b2dnbGVDaGVjayh0cnVl KTt9CmlmKCF2aXNpYmxlKXt0aGlzLmxheWVyLm1lcmdlTmV3UGFyYW1zKHRoaXMu Y3JlYXRlUGFyYW1zKFtdKSk7dGhpcy5nZXRVSSgpLnRvZ2dsZUNoZWNrKGZhbHNl KTt9fSxvbkNoZWNrQ2hhbmdlOmZ1bmN0aW9uKG5vZGUsY2hlY2tlZCl7dmFyIGxh eWVyPXRoaXMubGF5ZXI7dmFyIG5ld0l0ZW1zPVtdO3ZhciBjdXJJdGVtcz10aGlz LmdldEl0ZW1zRnJvbUxheWVyKCk7aWYoY2hlY2tlZD09PXRydWUmJmxheWVyLmdl dFZpc2liaWxpdHkoKT09PWZhbHNlJiZjdXJJdGVtcy5sZW5ndGg9PT10aGlzLmFs bEl0ZW1zLmxlbmd0aCl7Y3VySXRlbXM9W107fQpFeHQuZWFjaCh0aGlzLmFsbEl0 ZW1zLGZ1bmN0aW9uKGl0ZW0pe2lmKChpdGVtIT09dGhpcy5pdGVtJiZjdXJJdGVt cy5pbmRleE9mKGl0ZW0pIT09LTEpfHwoY2hlY2tlZD09PXRydWUmJml0ZW09PT10 aGlzLml0ZW0pKXtuZXdJdGVtcy5wdXNoKGl0ZW0pO319LHRoaXMpO3ZhciB2aXNp YmxlPShuZXdJdGVtcy5sZW5ndGg+MCk7dmlzaWJsZSYmbGF5ZXIubWVyZ2VOZXdQ YXJhbXModGhpcy5jcmVhdGVQYXJhbXMobmV3SXRlbXMpKTtpZih2aXNpYmxlIT09 bGF5ZXIuZ2V0VmlzaWJpbGl0eSgpKXtsYXllci5zZXRWaXNpYmlsaXR5KHZpc2li bGUpO30KKCF2aXNpYmxlKSYmbGF5ZXIubWVyZ2VOZXdQYXJhbXModGhpcy5jcmVh dGVQYXJhbXMoW10pKTt9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgbGF5ZXI9dGhp cy5sYXllcjtpZihsYXllciBpbnN0YW5jZW9mIE9wZW5MYXllcnMuTGF5ZXIpe2xh eWVyLmV2ZW50cy51bih7InZpc2liaWxpdHljaGFuZ2VkIjp0aGlzLm9uTGF5ZXJW aXNpYmlsaXR5Q2hhbmdlZCxzY29wZTp0aGlzfSk7fQpkZWxldGUgdGhpcy5sYXll cjt0aGlzLnVuKCJjaGVja2NoYW5nZSIsdGhpcy5vbkNoZWNrQ2hhbmdlLHRoaXMp O0dlb0V4dC50cmVlLkxheWVyUGFyYW1Ob2RlLnN1cGVyY2xhc3MuZGVzdHJveS5h cHBseSh0aGlzLGFyZ3VtZW50cyk7fX0pO0V4dC50cmVlLlRyZWVQYW5lbC5ub2Rl VHlwZXMuZ3hfbGF5ZXJwYXJhbT1HZW9FeHQudHJlZS5MYXllclBhcmFtTm9kZTtF eHQubmFtZXNwYWNlKCdHZW9FeHQnKTtHZW9FeHQuVXJsTGVnZW5kPUV4dC5leHRl bmQoR2VvRXh0LkxheWVyTGVnZW5kLHtpbml0Q29tcG9uZW50OmZ1bmN0aW9uKCl7 R2VvRXh0LlVybExlZ2VuZC5zdXBlcmNsYXNzLmluaXRDb21wb25lbnQuY2FsbCh0 aGlzKTt0aGlzLmFkZChuZXcgR2VvRXh0LkxlZ2VuZEltYWdlKHt1cmw6dGhpcy5s YXllclJlY29yZC5nZXQoImxlZ2VuZFVSTCIpfSkpO30sdXBkYXRlOmZ1bmN0aW9u KCl7R2VvRXh0LlVybExlZ2VuZC5zdXBlcmNsYXNzLnVwZGF0ZS5hcHBseSh0aGlz LGFyZ3VtZW50cyk7dGhpcy5pdGVtcy5nZXQoMSkuc2V0VXJsKHRoaXMubGF5ZXJS ZWNvcmQuZ2V0KCJsZWdlbmRVUkwiKSk7fX0pO0dlb0V4dC5VcmxMZWdlbmQuc3Vw cG9ydHM9ZnVuY3Rpb24obGF5ZXJSZWNvcmQpe3JldHVybiBsYXllclJlY29yZC5n ZXQoImxlZ2VuZFVSTCIpIT1udWxsO307R2VvRXh0LkxheWVyTGVnZW5kLnR5cGVz WyJneF91cmxsZWdlbmQiXT1HZW9FeHQuVXJsTGVnZW5kO0V4dC5yZWcoJ2d4X3Vy bGxlZ2VuZCcsR2VvRXh0LlVybExlZ2VuZCk7RXh0Lm5hbWVzcGFjZSgiR2VvRXh0 LnN0YXRlIik7R2VvRXh0LnN0YXRlLlBlcm1hbGlua1Byb3ZpZGVyPWZ1bmN0aW9u KGNvbmZpZyl7R2VvRXh0LnN0YXRlLlBlcm1hbGlua1Byb3ZpZGVyLnN1cGVyY2xh c3MuY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpO2NvbmZpZz1jb25m aWd8fHt9O3ZhciB1cmw9Y29uZmlnLnVybDtkZWxldGUgY29uZmlnLnVybDtFeHQu YXBwbHkodGhpcyxjb25maWcpO3RoaXMuc3RhdGU9dGhpcy5yZWFkVVJMKHVybCk7 fTtFeHQuZXh0ZW5kKEdlb0V4dC5zdGF0ZS5QZXJtYWxpbmtQcm92aWRlcixFeHQu c3RhdGUuUHJvdmlkZXIse2VuY29kZVR5cGU6dHJ1ZSxyZWFkVVJMOmZ1bmN0aW9u KHVybCl7dmFyIHN0YXRlPXt9O3ZhciBwYXJhbXM9T3BlbkxheWVycy5VdGlsLmdl dFBhcmFtZXRlcnModXJsKTt2YXIgayxzcGxpdCxzdGF0ZUlkO2ZvcihrIGluIHBh cmFtcyl7aWYocGFyYW1zLmhhc093blByb3BlcnR5KGspKXtzcGxpdD1rLnNwbGl0 KCJfIik7aWYoc3BsaXQubGVuZ3RoPjEpe3N0YXRlSWQ9c3BsaXRbMF07c3RhdGVb c3RhdGVJZF09c3RhdGVbc3RhdGVJZF18fHt9O3N0YXRlW3N0YXRlSWRdW3NwbGl0 LnNsaWNlKDEpLmpvaW4oIl8iKV09dGhpcy5lbmNvZGVUeXBlP3RoaXMuZGVjb2Rl VmFsdWUocGFyYW1zW2tdKTpwYXJhbXNba107fX19CnJldHVybiBzdGF0ZTt9LGdl dExpbms6ZnVuY3Rpb24oYmFzZSl7YmFzZT1iYXNlfHxkb2N1bWVudC5sb2NhdGlv bi5ocmVmO3ZhciBwYXJhbXM9e307dmFyIGlkLGssc3RhdGU9dGhpcy5zdGF0ZTtm b3IoaWQgaW4gc3RhdGUpe2lmKHN0YXRlLmhhc093blByb3BlcnR5KGlkKSl7Zm9y KGsgaW4gc3RhdGVbaWRdKXtwYXJhbXNbaWQrIl8iK2tdPXRoaXMuZW5jb2RlVHlw ZT91bmVzY2FwZSh0aGlzLmVuY29kZVZhbHVlKHN0YXRlW2lkXVtrXSkpOnN0YXRl W2lkXVtrXTt9fX0KT3BlbkxheWVycy5VdGlsLmFwcGx5RGVmYXVsdHMocGFyYW1z LE9wZW5MYXllcnMuVXRpbC5nZXRQYXJhbWV0ZXJzKGJhc2UpKTt2YXIgcGFyYW1z U3RyPU9wZW5MYXllcnMuVXRpbC5nZXRQYXJhbWV0ZXJTdHJpbmcocGFyYW1zKTt2 YXIgcU1hcms9YmFzZS5pbmRleE9mKCI/Iik7aWYocU1hcms+MCl7YmFzZT1iYXNl LnN1YnN0cmluZygwLHFNYXJrKTt9CnJldHVybiBFeHQudXJsQXBwZW5kKGJhc2Us cGFyYW1zU3RyKTt9fSk7RXh0Lm5hbWVzcGFjZSgnR2VvRXh0Jyk7R2VvRXh0Lkxl Z2VuZEltYWdlPUV4dC5leHRlbmQoRXh0LkJveENvbXBvbmVudCx7dXJsOm51bGws ZGVmYXVsdEltZ1NyYzpudWxsLGltZ0NsczpudWxsLGluaXRDb21wb25lbnQ6ZnVu Y3Rpb24oKXtHZW9FeHQuTGVnZW5kSW1hZ2Uuc3VwZXJjbGFzcy5pbml0Q29tcG9u ZW50LmNhbGwodGhpcyk7aWYodGhpcy5kZWZhdWx0SW1nU3JjPT09bnVsbCl7dGhp cy5kZWZhdWx0SW1nU3JjPUV4dC5CTEFOS19JTUFHRV9VUkw7fQp0aGlzLmF1dG9F bD17dGFnOiJpbWciLCJjbGFzcyI6KHRoaXMuaW1nQ2xzP3RoaXMuaW1nQ2xzOiIi KSxzcmM6dGhpcy5kZWZhdWx0SW1nU3JjfTt9LHNldFVybDpmdW5jdGlvbih1cmwp e3RoaXMudXJsPXVybDt2YXIgZWw9dGhpcy5nZXRFbCgpO2lmKGVsKXtlbC51bigi ZXJyb3IiLHRoaXMub25JbWFnZUxvYWRFcnJvcix0aGlzKTtlbC5vbigiZXJyb3Ii LHRoaXMub25JbWFnZUxvYWRFcnJvcix0aGlzLHtzaW5nbGU6dHJ1ZX0pO2VsLmRv bS5zcmM9dXJsO319LG9uUmVuZGVyOmZ1bmN0aW9uKGN0LHBvc2l0aW9uKXtHZW9F eHQuTGVnZW5kSW1hZ2Uuc3VwZXJjbGFzcy5vblJlbmRlci5jYWxsKHRoaXMsY3Qs cG9zaXRpb24pO2lmKHRoaXMudXJsKXt0aGlzLnNldFVybCh0aGlzLnVybCk7fX0s b25EZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGVsPXRoaXMuZ2V0RWwoKTtpZihlbCl7 ZWwudW4oImVycm9yIix0aGlzLm9uSW1hZ2VMb2FkRXJyb3IsdGhpcyk7fQpHZW9F eHQuTGVnZW5kSW1hZ2Uuc3VwZXJjbGFzcy5vbkRlc3Ryb3kuYXBwbHkodGhpcyxh cmd1bWVudHMpO30sb25JbWFnZUxvYWRFcnJvcjpmdW5jdGlvbigpe3RoaXMuZ2V0 RWwoKS5kb20uc3JjPXRoaXMuZGVmYXVsdEltZ1NyYzt9fSk7RXh0LnJlZygnZ3hf bGVnZW5kaW1hZ2UnLEdlb0V4dC5MZWdlbmRJbWFnZSk7RXh0Lm5hbWVzcGFjZSgi R2VvRXh0Iik7R2VvRXh0LkxheWVyT3BhY2l0eVNsaWRlcj1FeHQuZXh0ZW5kKEV4 dC5TbGlkZXIse2xheWVyOm51bGwsY29tcGxlbWVudGFyeUxheWVyOm51bGwsZGVs YXk6NSxjaGFuZ2VWaXNpYmlsaXR5RGVsYXk6NSxhZ2dyZXNzaXZlOmZhbHNlLGNo YW5nZVZpc2liaWxpdHk6ZmFsc2UsdmFsdWU6bnVsbCxpbnZlcnNlOmZhbHNlLGNv bnN0cnVjdG9yOmZ1bmN0aW9uKGNvbmZpZyl7aWYoY29uZmlnLmxheWVyKXt0aGlz LmxheWVyPXRoaXMuZ2V0TGF5ZXIoY29uZmlnLmxheWVyKTt0aGlzLmJpbmQoKTt0 aGlzLmNvbXBsZW1lbnRhcnlMYXllcj10aGlzLmdldExheWVyKGNvbmZpZy5jb21w bGVtZW50YXJ5TGF5ZXIpO2lmKGNvbmZpZy5pbnZlcnNlIT09dW5kZWZpbmVkKXt0 aGlzLmludmVyc2U9Y29uZmlnLmludmVyc2U7fQpjb25maWcudmFsdWU9KGNvbmZp Zy52YWx1ZSE9PXVuZGVmaW5lZCk/Y29uZmlnLnZhbHVlOnRoaXMuZ2V0T3BhY2l0 eVZhbHVlKHRoaXMubGF5ZXIpO2RlbGV0ZSBjb25maWcubGF5ZXI7ZGVsZXRlIGNv bmZpZy5jb21wbGVtZW50YXJ5TGF5ZXI7fQpHZW9FeHQuTGF5ZXJPcGFjaXR5U2xp ZGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGNvbmZpZyk7fSxi aW5kOmZ1bmN0aW9uKCl7aWYodGhpcy5sYXllciYmdGhpcy5sYXllci5tYXApe3Ro aXMubGF5ZXIubWFwLmV2ZW50cy5vbih7Y2hhbmdlbGF5ZXI6dGhpcy51cGRhdGUs c2NvcGU6dGhpc30pO319LHVuYmluZDpmdW5jdGlvbigpe2lmKHRoaXMubGF5ZXIm JnRoaXMubGF5ZXIubWFwKXt0aGlzLmxheWVyLm1hcC5ldmVudHMudW4oe2NoYW5n ZWxheWVyOnRoaXMudXBkYXRlLHNjb3BlOnRoaXN9KTt9fSx1cGRhdGU6ZnVuY3Rp b24oZXZ0KXtpZihldnQucHJvcGVydHk9PT0ib3BhY2l0eSImJmV2dC5sYXllcj09 dGhpcy5sYXllcil7dGhpcy5zZXRWYWx1ZSh0aGlzLmdldE9wYWNpdHlWYWx1ZSh0 aGlzLmxheWVyKSk7fX0sc2V0TGF5ZXI6ZnVuY3Rpb24obGF5ZXIpe3RoaXMudW5i aW5kKCk7dGhpcy5sYXllcj10aGlzLmdldExheWVyKGxheWVyKTt0aGlzLnNldFZh bHVlKHRoaXMuZ2V0T3BhY2l0eVZhbHVlKGxheWVyKSk7dGhpcy5iaW5kKCk7fSxn ZXRPcGFjaXR5VmFsdWU6ZnVuY3Rpb24obGF5ZXIpe3ZhciB2YWx1ZTtpZihsYXll ciYmbGF5ZXIub3BhY2l0eSE9PW51bGwpe3ZhbHVlPXBhcnNlSW50KGxheWVyLm9w YWNpdHkqKHRoaXMubWF4VmFsdWUtdGhpcy5taW5WYWx1ZSkpO31lbHNle3ZhbHVl PXRoaXMubWF4VmFsdWU7fQppZih0aGlzLmludmVyc2U9PT10cnVlKXt2YWx1ZT0o dGhpcy5tYXhWYWx1ZS10aGlzLm1pblZhbHVlKS12YWx1ZTt9CnJldHVybiB2YWx1 ZTt9LGdldExheWVyOmZ1bmN0aW9uKGxheWVyKXtpZihsYXllciBpbnN0YW5jZW9m IE9wZW5MYXllcnMuTGF5ZXIpe3JldHVybiBsYXllcjt9ZWxzZSBpZihsYXllciBp bnN0YW5jZW9mIEdlb0V4dC5kYXRhLkxheWVyUmVjb3JkKXtyZXR1cm4gbGF5ZXIu Z2V0TGF5ZXIoKTt9fSxpbml0Q29tcG9uZW50OmZ1bmN0aW9uKCl7R2VvRXh0Lkxh eWVyT3BhY2l0eVNsaWRlci5zdXBlcmNsYXNzLmluaXRDb21wb25lbnQuY2FsbCh0 aGlzKTtpZih0aGlzLmNoYW5nZVZpc2liaWxpdHkmJnRoaXMubGF5ZXImJih0aGlz LmxheWVyLm9wYWNpdHk9PTB8fCh0aGlzLmludmVyc2U9PT1mYWxzZSYmdGhpcy52 YWx1ZT09dGhpcy5taW5WYWx1ZSl8fCh0aGlzLmludmVyc2U9PT10cnVlJiZ0aGlz LnZhbHVlPT10aGlzLm1heFZhbHVlKSkpe3RoaXMubGF5ZXIuc2V0VmlzaWJpbGl0 eShmYWxzZSk7fQppZih0aGlzLmNvbXBsZW1lbnRhcnlMYXllciYmKCh0aGlzLmxh eWVyJiZ0aGlzLmxheWVyLm9wYWNpdHk9PTEpfHwodGhpcy5pbnZlcnNlPT09ZmFs c2UmJnRoaXMudmFsdWU9PXRoaXMubWF4VmFsdWUpfHwodGhpcy5pbnZlcnNlPT09 dHJ1ZSYmdGhpcy52YWx1ZT09dGhpcy5taW5WYWx1ZSkpKXt0aGlzLmNvbXBsZW1l bnRhcnlMYXllci5zZXRWaXNpYmlsaXR5KGZhbHNlKTt9CmlmKHRoaXMuYWdncmVz c2l2ZT09PXRydWUpe3RoaXMub24oJ2NoYW5nZScsdGhpcy5jaGFuZ2VMYXllck9w YWNpdHksdGhpcyx7YnVmZmVyOnRoaXMuZGVsYXl9KTt9ZWxzZXt0aGlzLm9uKCdj aGFuZ2Vjb21wbGV0ZScsdGhpcy5jaGFuZ2VMYXllck9wYWNpdHksdGhpcyk7fQpp Zih0aGlzLmNoYW5nZVZpc2liaWxpdHk9PT10cnVlKXt0aGlzLm9uKCdjaGFuZ2Un LHRoaXMuY2hhbmdlTGF5ZXJWaXNpYmlsaXR5LHRoaXMse2J1ZmZlcjp0aGlzLmNo YW5nZVZpc2liaWxpdHlEZWxheX0pO30KaWYodGhpcy5jb21wbGVtZW50YXJ5TGF5 ZXIpe3RoaXMub24oJ2NoYW5nZScsdGhpcy5jaGFuZ2VDb21wbGVtZW50YXJ5TGF5 ZXJWaXNpYmlsaXR5LHRoaXMse2J1ZmZlcjp0aGlzLmNoYW5nZVZpc2liaWxpdHlE ZWxheX0pO30KdGhpcy5vbigiYmVmb3JlZGVzdHJveSIsdGhpcy51bmJpbmQsdGhp cyk7fSxjaGFuZ2VMYXllck9wYWNpdHk6ZnVuY3Rpb24oc2xpZGVyLHZhbHVlKXtp Zih0aGlzLmxheWVyKXt2YWx1ZT12YWx1ZS8odGhpcy5tYXhWYWx1ZS10aGlzLm1p blZhbHVlKTtpZih0aGlzLmludmVyc2U9PT10cnVlKXt2YWx1ZT0xLXZhbHVlO30K dGhpcy5sYXllci5zZXRPcGFjaXR5KHZhbHVlKTt9fSxjaGFuZ2VMYXllclZpc2li aWxpdHk6ZnVuY3Rpb24oc2xpZGVyLHZhbHVlKXt2YXIgY3VycmVudFZpc2liaWxp dHk9dGhpcy5sYXllci5nZXRWaXNpYmlsaXR5KCk7aWYoKHRoaXMuaW52ZXJzZT09 PWZhbHNlJiZ2YWx1ZT09dGhpcy5taW5WYWx1ZSl8fCh0aGlzLmludmVyc2U9PT10 cnVlJiZ2YWx1ZT09dGhpcy5tYXhWYWx1ZSkmJmN1cnJlbnRWaXNpYmlsaXR5PT09 dHJ1ZSl7dGhpcy5sYXllci5zZXRWaXNpYmlsaXR5KGZhbHNlKTt9ZWxzZSBpZigo dGhpcy5pbnZlcnNlPT09ZmFsc2UmJnZhbHVlPnRoaXMubWluVmFsdWUpfHwodGhp cy5pbnZlcnNlPT09dHJ1ZSYmdmFsdWU8dGhpcy5tYXhWYWx1ZSkmJmN1cnJlbnRW aXNpYmlsaXR5PT1mYWxzZSl7dGhpcy5sYXllci5zZXRWaXNpYmlsaXR5KHRydWUp O319LGNoYW5nZUNvbXBsZW1lbnRhcnlMYXllclZpc2liaWxpdHk6ZnVuY3Rpb24o c2xpZGVyLHZhbHVlKXt2YXIgY3VycmVudFZpc2liaWxpdHk9dGhpcy5jb21wbGVt ZW50YXJ5TGF5ZXIuZ2V0VmlzaWJpbGl0eSgpO2lmKCh0aGlzLmludmVyc2U9PT1m YWxzZSYmdmFsdWU9PXRoaXMubWF4VmFsdWUpfHwodGhpcy5pbnZlcnNlPT09dHJ1 ZSYmdmFsdWU9PXRoaXMubWluVmFsdWUpJiZjdXJyZW50VmlzaWJpbGl0eT09PXRy dWUpe3RoaXMuY29tcGxlbWVudGFyeUxheWVyLnNldFZpc2liaWxpdHkoZmFsc2Up O31lbHNlIGlmKCh0aGlzLmludmVyc2U9PT1mYWxzZSYmdmFsdWU8dGhpcy5tYXhW YWx1ZSl8fCh0aGlzLmludmVyc2U9PT10cnVlJiZ2YWx1ZT50aGlzLm1pblZhbHVl KSYmY3VycmVudFZpc2liaWxpdHk9PWZhbHNlKXt0aGlzLmNvbXBsZW1lbnRhcnlM YXllci5zZXRWaXNpYmlsaXR5KHRydWUpO319LGFkZFRvTWFwUGFuZWw6ZnVuY3Rp b24ocGFuZWwpe3RoaXMub24oe3JlbmRlcjpmdW5jdGlvbigpe3ZhciBlbD10aGlz LmdldEVsKCk7ZWwuc2V0U3R5bGUoe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsekluZGV4 OnBhbmVsLm1hcC5aX0lOREVYX0JBU0UuQ29udHJvbH0pO2VsLm9uKHttb3VzZWRv d246dGhpcy5zdG9wTW91c2VFdmVudHMsY2xpY2s6dGhpcy5zdG9wTW91c2VFdmVu dHN9KTt9LHNjb3BlOnRoaXN9KTt9LHJlbW92ZUZyb21NYXBQYW5lbDpmdW5jdGlv bihwYW5lbCl7dmFyIGVsPXRoaXMuZ2V0RWwoKTtlbC51bih7bW91c2Vkb3duOnRo aXMuc3RvcE1vdXNlRXZlbnRzLGNsaWNrOnRoaXMuc3RvcE1vdXNlRXZlbnRzLHNj b3BlOnRoaXN9KTt0aGlzLnVuYmluZCgpO30sc3RvcE1vdXNlRXZlbnRzOmZ1bmN0 aW9uKGUpe2Uuc3RvcEV2ZW50KCk7fX0pO0V4dC5yZWcoJ2d4X29wYWNpdHlzbGlk ZXInLEdlb0V4dC5MYXllck9wYWNpdHlTbGlkZXIpO0V4dC5uYW1lc3BhY2UoIkdl b0V4dC5kYXRhIik7R2VvRXh0LmRhdGEuQXR0cmlidXRlUmVhZGVyPWZ1bmN0aW9u KG1ldGEscmVjb3JkVHlwZSl7bWV0YT1tZXRhfHx7fTtpZighbWV0YS5mb3JtYXQp e21ldGEuZm9ybWF0PW5ldyBPcGVuTGF5ZXJzLkZvcm1hdC5XRlNEZXNjcmliZUZl YXR1cmVUeXBlKCk7fQpHZW9FeHQuZGF0YS5BdHRyaWJ1dGVSZWFkZXIuc3VwZXJj bGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsbWV0YSxyZWNvcmRUeXBlfHxtZXRh LmZpZWxkcyk7aWYobWV0YS5mZWF0dXJlKXt0aGlzLnJlY29yZFR5cGUucHJvdG90 eXBlLmZpZWxkcy5hZGQobmV3IEV4dC5kYXRhLkZpZWxkKCJ2YWx1ZSIpKTt9fTtF eHQuZXh0ZW5kKEdlb0V4dC5kYXRhLkF0dHJpYnV0ZVJlYWRlcixFeHQuZGF0YS5E YXRhUmVhZGVyLHtyZWFkOmZ1bmN0aW9uKHJlcXVlc3Qpe3ZhciBkYXRhPXJlcXVl c3QucmVzcG9uc2VYTUw7aWYoIWRhdGF8fCFkYXRhLmRvY3VtZW50RWxlbWVudCl7 ZGF0YT1yZXF1ZXN0LnJlc3BvbnNlVGV4dDt9CnJldHVybiB0aGlzLnJlYWRSZWNv cmRzKGRhdGEpO30scmVhZFJlY29yZHM6ZnVuY3Rpb24oZGF0YSl7dmFyIGF0dHJp YnV0ZXM7aWYoZGF0YSBpbnN0YW5jZW9mIEFycmF5KXthdHRyaWJ1dGVzPWRhdGE7 fWVsc2V7YXR0cmlidXRlcz10aGlzLm1ldGEuZm9ybWF0LnJlYWQoZGF0YSkuZmVh dHVyZVR5cGVzWzBdLnByb3BlcnRpZXM7fQp2YXIgZmVhdHVyZT10aGlzLm1ldGEu ZmVhdHVyZTt2YXIgcmVjb3JkVHlwZT10aGlzLnJlY29yZFR5cGU7dmFyIGZpZWxk cz1yZWNvcmRUeXBlLnByb3RvdHlwZS5maWVsZHM7dmFyIG51bUZpZWxkcz1maWVs ZHMubGVuZ3RoO3ZhciBhdHRyLHZhbHVlcyxuYW1lLHJlY29yZCxpZ25vcmUsdmFs dWUscmVjb3Jkcz1bXTtmb3IodmFyIGk9MCxsZW49YXR0cmlidXRlcy5sZW5ndGg7 aTxsZW47KytpKXtpZ25vcmU9ZmFsc2U7YXR0cj1hdHRyaWJ1dGVzW2ldO3ZhbHVl cz17fTtmb3IodmFyIGo9MDtqPG51bUZpZWxkczsrK2ope25hbWU9ZmllbGRzLml0 ZW1zW2pdLm5hbWU7dmFsdWU9YXR0cltuYW1lXTtpZih0aGlzLmlnbm9yZUF0dHJp YnV0ZShuYW1lLHZhbHVlKSl7aWdub3JlPXRydWU7YnJlYWs7fQp2YWx1ZXNbbmFt ZV09dmFsdWU7fQppZihmZWF0dXJlKXt2YWx1ZT1mZWF0dXJlLmF0dHJpYnV0ZXNb dmFsdWVzWyJuYW1lIl1dO2lmKHZhbHVlIT09dW5kZWZpbmVkKXtpZih0aGlzLmln bm9yZUF0dHJpYnV0ZSgidmFsdWUiLHZhbHVlKSl7aWdub3JlPXRydWU7fWVsc2V7 dmFsdWVzWyJ2YWx1ZSJdPXZhbHVlO319fQppZighaWdub3JlKXtyZWNvcmRzW3Jl Y29yZHMubGVuZ3RoXT1uZXcgcmVjb3JkVHlwZSh2YWx1ZXMpO319CnJldHVybntz dWNjZXNzOnRydWUscmVjb3JkczpyZWNvcmRzLHRvdGFsUmVjb3JkczpyZWNvcmRz Lmxlbmd0aH07fSxpZ25vcmVBdHRyaWJ1dGU6ZnVuY3Rpb24obmFtZSx2YWx1ZSl7 dmFyIGlnbm9yZT1mYWxzZTtpZih0aGlzLm1ldGEuaWdub3JlJiZ0aGlzLm1ldGEu aWdub3JlW25hbWVdKXt2YXIgbWF0Y2hlcz10aGlzLm1ldGEuaWdub3JlW25hbWVd O2lmKHR5cGVvZiBtYXRjaGVzPT0ic3RyaW5nIil7aWdub3JlPShtYXRjaGVzPT09 dmFsdWUpO31lbHNlIGlmKG1hdGNoZXMgaW5zdGFuY2VvZiBBcnJheSl7aWdub3Jl PShtYXRjaGVzLmluZGV4T2YodmFsdWUpPi0xKTt9ZWxzZSBpZihtYXRjaGVzIGlu c3RhbmNlb2YgUmVnRXhwKXtpZ25vcmU9KG1hdGNoZXMudGVzdCh2YWx1ZSkpO319 CnJldHVybiBpZ25vcmU7fX0pO0V4dC5uYW1lc3BhY2UoIkdlb0V4dC5wbHVnaW5z Iik7R2VvRXh0LnBsdWdpbnMuVHJlZU5vZGVDb21wb25lbnQ9RXh0LmV4dGVuZChF eHQudXRpbC5PYnNlcnZhYmxlLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihjb25maWcp e0V4dC5hcHBseSh0aGlzLmluaXRpYWxDb25maWcsRXh0LmFwcGx5KHt9LGNvbmZp ZykpO0V4dC5hcHBseSh0aGlzLGNvbmZpZyk7R2VvRXh0LnBsdWdpbnMuVHJlZU5v ZGVDb21wb25lbnQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFy Z3VtZW50cyk7fSxpbml0OmZ1bmN0aW9uKHRyZWUpe3RyZWUub24oeyJyZW5kZXJu b2RlIjp0aGlzLm9uUmVuZGVyTm9kZSxzY29wZTp0aGlzfSk7fSxvblJlbmRlck5v ZGU6ZnVuY3Rpb24obm9kZSl7dmFyIHJlbmRlcmVkPW5vZGUucmVuZGVyZWQ7dmFy IGF0dHI9bm9kZS5hdHRyaWJ1dGVzO3ZhciBjb21wb25lbnQ9YXR0ci5jb21wb25l bnR8fHRoaXMuY29tcG9uZW50O2lmKCFyZW5kZXJlZCYmY29tcG9uZW50KXt2YXIg ZWx0PUV4dC5Eb21IZWxwZXIuYXBwZW5kKG5vZGUudWkuZWxOb2RlLFt7InRhZyI6 ImRpdiJ9XSk7aWYodHlwZW9mIGNvbXBvbmVudD09ImZ1bmN0aW9uIil7Y29tcG9u ZW50PWNvbXBvbmVudChub2RlLGVsdCk7fWVsc2UgaWYodHlwZW9mIGNvbXBvbmVu dD09Im9iamVjdCImJnR5cGVvZiBjb21wb25lbnQuZm49PSJmdW5jdGlvbiIpe2Nv bXBvbmVudD1jb21wb25lbnQuZm4uYXBwbHkoY29tcG9uZW50LnNjb3BlLFtub2Rl LGVsdF0pO30KaWYodHlwZW9mIGNvbXBvbmVudD09Im9iamVjdCImJnR5cGVvZiBj b21wb25lbnQueHR5cGU9PSJzdHJpbmciKXtjb21wb25lbnQ9RXh0LkNvbXBvbmVu dE1nci5jcmVhdGUoY29tcG9uZW50KTt9CmlmKGNvbXBvbmVudCBpbnN0YW5jZW9m IEV4dC5Db21wb25lbnQpe2NvbXBvbmVudC5yZW5kZXIoZWx0KTtub2RlLmNvbXBv bmVudD1jb21wb25lbnQ7fX19LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0cmVlLnVuKCJy ZW5kZXJub2RlIix0aGlzLm9uUmVuZGVyTm9kZSx0aGlzKTt9fSk7RXh0LnByZWcm JkV4dC5wcmVnKCJneF90cmVlbm9kZWNvbXBvbmVudCIsR2VvRXh0LnBsdWdpbnMu VHJlZU5vZGVDb21wb25lbnQpO0V4dC5uYW1lc3BhY2UoIkdlb0V4dCIpO0dlb0V4 dC5ab29tU2xpZGVyVGlwPUV4dC5leHRlbmQoR2VvRXh0LlNsaWRlclRpcCx7dGVt cGxhdGU6JzxkaXY+Wm9vbSBMZXZlbDoge3pvb219PC9kaXY+JysnPGRpdj5SZXNv bHV0aW9uOiB7cmVzb2x1dGlvbn08L2Rpdj4nKyc8ZGl2PlNjYWxlOiAxIDoge3Nj YWxlfTwvZGl2PicsY29tcGlsZWRUZW1wbGF0ZTpudWxsLGluaXQ6ZnVuY3Rpb24o c2xpZGVyKXt0aGlzLmNvbXBpbGVkVGVtcGxhdGU9bmV3IEV4dC5UZW1wbGF0ZSh0 aGlzLnRlbXBsYXRlKTtHZW9FeHQuWm9vbVNsaWRlclRpcC5zdXBlcmNsYXNzLmlu aXQuY2FsbCh0aGlzLHNsaWRlcik7fSxnZXRUZXh0OmZ1bmN0aW9uKHRodW1iKXt2 YXIgZGF0YT17em9vbTp0aHVtYi52YWx1ZSxyZXNvbHV0aW9uOnRoaXMuc2xpZGVy LmdldFJlc29sdXRpb24oKSxzY2FsZTpNYXRoLnJvdW5kKHRoaXMuc2xpZGVyLmdl dFNjYWxlKCkpfTtyZXR1cm4gdGhpcy5jb21waWxlZFRlbXBsYXRlLmFwcGx5KGRh dGEpO319KTtFeHQubmFtZXNwYWNlKCJHZW9FeHQuZGF0YSIpO0dlb0V4dC5kYXRh LlByaW50UHJvdmlkZXI9RXh0LmV4dGVuZChFeHQudXRpbC5PYnNlcnZhYmxlLHt1 cmw6bnVsbCxjYXBhYmlsaXRpZXM6bnVsbCxtZXRob2Q6IlBPU1QiLGN1c3RvbVBh cmFtczpudWxsLHNjYWxlczpudWxsLGRwaXM6bnVsbCxsYXlvdXRzOm51bGwsZHBp Om51bGwsbGF5b3V0Om51bGwsY29uc3RydWN0b3I6ZnVuY3Rpb24oY29uZmlnKXt0 aGlzLmluaXRpYWxDb25maWc9Y29uZmlnO0V4dC5hcHBseSh0aGlzLGNvbmZpZyk7 aWYoIXRoaXMuY3VzdG9tUGFyYW1zKXt0aGlzLmN1c3RvbVBhcmFtcz17fTt9CnRo aXMuYWRkRXZlbnRzKCJsb2FkY2FwYWJpbGl0aWVzIiwibGF5b3V0Y2hhbmdlIiwi ZHBpY2hhbmdlIiwiYmVmb3JlcHJpbnQiLCJwcmludCIsInByaW50ZXhjZXB0aW9u IiwiYmVmb3JlZW5jb2RlbGF5ZXIiLCJlbmNvZGVsYXllciIpO0dlb0V4dC5kYXRh LlByaW50UHJvdmlkZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlz LGFyZ3VtZW50cyk7dGhpcy5zY2FsZXM9bmV3IEV4dC5kYXRhLkpzb25TdG9yZSh7 cm9vdDoic2NhbGVzIixzb3J0SW5mbzp7ZmllbGQ6InZhbHVlIixkaXJlY3Rpb246 IkRFU0MifSxmaWVsZHM6WyJuYW1lIix7bmFtZToidmFsdWUiLHR5cGU6ImZsb2F0 In1dfSk7dGhpcy5kcGlzPW5ldyBFeHQuZGF0YS5Kc29uU3RvcmUoe3Jvb3Q6ImRw aXMiLGZpZWxkczpbIm5hbWUiLHtuYW1lOiJ2YWx1ZSIsdHlwZToiZmxvYXQifV19 KTt0aGlzLmxheW91dHM9bmV3IEV4dC5kYXRhLkpzb25TdG9yZSh7cm9vdDoibGF5 b3V0cyIsZmllbGRzOlsibmFtZSIse25hbWU6InNpemUiLG1hcHBpbmc6Im1hcCJ9 LHtuYW1lOiJyb3RhdGlvbiIsdHlwZToiYm9vbGVhbiJ9XX0pO2lmKGNvbmZpZy5j YXBhYmlsaXRpZXMpe3RoaXMubG9hZFN0b3JlcygpO31lbHNle2lmKHRoaXMudXJs LnNwbGl0KCIvIikucG9wKCkpe3RoaXMudXJsKz0iLyI7fQp0aGlzLmluaXRpYWxD b25maWcuYXV0b0xvYWQmJnRoaXMubG9hZENhcGFiaWxpdGllcygpO319LHNldExh eW91dDpmdW5jdGlvbihsYXlvdXQpe3RoaXMubGF5b3V0PWxheW91dDt0aGlzLmZp cmVFdmVudCgibGF5b3V0Y2hhbmdlIix0aGlzLGxheW91dCk7fSxzZXREcGk6ZnVu Y3Rpb24oZHBpKXt0aGlzLmRwaT1kcGk7dGhpcy5maXJlRXZlbnQoImRwaWNoYW5n ZSIsdGhpcyxkcGkpO30scHJpbnQ6ZnVuY3Rpb24obWFwLHBhZ2VzLG9wdGlvbnMp e2lmKG1hcCBpbnN0YW5jZW9mIEdlb0V4dC5NYXBQYW5lbCl7bWFwPW1hcC5tYXA7 fQpwYWdlcz1wYWdlcyBpbnN0YW5jZW9mIEFycmF5P3BhZ2VzOltwYWdlc107b3B0 aW9ucz1vcHRpb25zfHx7fTtpZih0aGlzLmZpcmVFdmVudCgiYmVmb3JlcHJpbnQi LHRoaXMsbWFwLHBhZ2VzLG9wdGlvbnMpPT09ZmFsc2Upe3JldHVybjt9CnZhciBq c29uRGF0YT1FeHQuYXBwbHkoe3VuaXRzOm1hcC5nZXRVbml0cygpLHNyczptYXAu YmFzZUxheWVyLnByb2plY3Rpb24uZ2V0Q29kZSgpLGxheW91dDp0aGlzLmxheW91 dC5nZXQoIm5hbWUiKSxkcGk6dGhpcy5kcGkuZ2V0KCJ2YWx1ZSIpfSx0aGlzLmN1 c3RvbVBhcmFtcyk7dmFyIHBhZ2VzTGF5ZXI9cGFnZXNbMF0uZmVhdHVyZS5sYXll cjt2YXIgZW5jb2RlZExheWVycz1bXTtFeHQuZWFjaChtYXAubGF5ZXJzLGZ1bmN0 aW9uKGxheWVyKXtpZihsYXllciE9PXBhZ2VzTGF5ZXImJmxheWVyLmdldFZpc2li aWxpdHkoKT09PXRydWUpe3ZhciBlbmM9dGhpcy5lbmNvZGVMYXllcihsYXllcik7 ZW5jJiZlbmNvZGVkTGF5ZXJzLnB1c2goZW5jKTt9fSx0aGlzKTtqc29uRGF0YS5s YXllcnM9ZW5jb2RlZExheWVyczt2YXIgZW5jb2RlZFBhZ2VzPVtdO0V4dC5lYWNo KHBhZ2VzLGZ1bmN0aW9uKHBhZ2Upe2VuY29kZWRQYWdlcy5wdXNoKEV4dC5hcHBs eSh7Y2VudGVyOltwYWdlLmNlbnRlci5sb24scGFnZS5jZW50ZXIubGF0XSxzY2Fs ZTpwYWdlLnNjYWxlLmdldCgidmFsdWUiKSxyb3RhdGlvbjpwYWdlLnJvdGF0aW9u fSxwYWdlLmN1c3RvbVBhcmFtcykpO30sdGhpcyk7anNvbkRhdGEucGFnZXM9ZW5j b2RlZFBhZ2VzO2lmKG9wdGlvbnMub3ZlcnZpZXcpe3ZhciBlbmNvZGVkT3ZlcnZp ZXdMYXllcnM9W107RXh0LmVhY2gob3B0aW9ucy5vdmVydmlldy5sYXllcnMsZnVu Y3Rpb24obGF5ZXIpe3ZhciBlbmM9dGhpcy5lbmNvZGVMYXllcihsYXllcik7ZW5j JiZlbmNvZGVkT3ZlcnZpZXdMYXllcnMucHVzaChlbmMpO30sdGhpcyk7anNvbkRh dGEub3ZlcnZpZXdMYXllcnM9ZW5jb2RlZE92ZXJ2aWV3TGF5ZXJzO30KaWYob3B0 aW9ucy5sZWdlbmQpe3ZhciBsZWdlbmQ9b3B0aW9ucy5sZWdlbmQ7dmFyIHJlbmRl cmVkPWxlZ2VuZC5yZW5kZXJlZDtpZighcmVuZGVyZWQpe2xlZ2VuZD1sZWdlbmQu Y2xvbmVDb25maWcoe3JlbmRlclRvOmRvY3VtZW50LmJvZHksaGlkZGVuOnRydWV9 KTt9CnZhciBlbmNvZGVkTGVnZW5kcz1bXTtsZWdlbmQuaXRlbXMuZWFjaChmdW5j dGlvbihjbXApe2lmKCFjbXAuaGlkZGVuKXt2YXIgZW5jRm49dGhpcy5lbmNvZGVy cy5sZWdlbmRzW2NtcC5nZXRYVHlwZSgpXTtlbmNvZGVkTGVnZW5kcz1lbmNvZGVk TGVnZW5kcy5jb25jYXQoZW5jRm4uY2FsbCh0aGlzLGNtcCkpO319LHRoaXMpO2lm KCFyZW5kZXJlZCl7bGVnZW5kLmRlc3Ryb3koKTt9Cmpzb25EYXRhLmxlZ2VuZHM9 ZW5jb2RlZExlZ2VuZHM7fQppZih0aGlzLm1ldGhvZD09PSJHRVQiKXt2YXIgdXJs PUV4dC51cmxBcHBlbmQodGhpcy5jYXBhYmlsaXRpZXMucHJpbnRVUkwsInNwZWM9 IitlbmNvZGVVUklDb21wb25lbnQoRXh0LmVuY29kZShqc29uRGF0YSkpKTt3aW5k b3cub3Blbih1cmwpO3RoaXMuZmlyZUV2ZW50KCJwcmludCIsdGhpcyx1cmwpO31l bHNle0V4dC5BamF4LnJlcXVlc3Qoe3VybDp0aGlzLmNhcGFiaWxpdGllcy5jcmVh dGVVUkwsanNvbkRhdGE6anNvbkRhdGEsc3VjY2VzczpmdW5jdGlvbihyZXNwb25z ZSl7dmFyIHVybD1FeHQuZGVjb2RlKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCkuZ2V0 VVJMKwooRXh0LmlzSUU/Ij9pbmxpbmU9dHJ1ZSI6IiIpO2lmKEV4dC5pc09wZXJh fHxFeHQuaXNJRSl7d2luZG93Lm9wZW4odXJsKTt9ZWxzZXt3aW5kb3cubG9jYXRp b24uaHJlZj11cmw7fQp0aGlzLmZpcmVFdmVudCgicHJpbnQiLHRoaXMsdXJsKTt9 LGZhaWx1cmU6ZnVuY3Rpb24ocmVzcG9uc2Upe3RoaXMuZmlyZUV2ZW50KCJwcmlu dGV4Y2VwdGlvbiIsdGhpcyxyZXNwb25zZSk7fSxwYXJhbXM6dGhpcy5pbml0aWFs Q29uZmlnLmJhc2VQYXJhbXMsc2NvcGU6dGhpc30pO319LGxvYWRDYXBhYmlsaXRp ZXM6ZnVuY3Rpb24oKXtpZighdGhpcy51cmwpe3JldHVybjt9CnZhciB1cmw9dGhp cy51cmwrImluZm8uanNvbiI7RXh0LkFqYXgucmVxdWVzdCh7dXJsOnVybCxtZXRo b2Q6IkdFVCIsZGlzYWJsZUNhY2hpbmc6ZmFsc2Usc3VjY2VzczpmdW5jdGlvbihy ZXNwb25zZSl7dGhpcy5jYXBhYmlsaXRpZXM9RXh0LmRlY29kZShyZXNwb25zZS5y ZXNwb25zZVRleHQpO3RoaXMubG9hZFN0b3JlcygpO30scGFyYW1zOnRoaXMuaW5p dGlhbENvbmZpZy5iYXNlUGFyYW1zLHNjb3BlOnRoaXN9KTt9LGxvYWRTdG9yZXM6 ZnVuY3Rpb24oKXt0aGlzLnNjYWxlcy5sb2FkRGF0YSh0aGlzLmNhcGFiaWxpdGll cyk7dGhpcy5kcGlzLmxvYWREYXRhKHRoaXMuY2FwYWJpbGl0aWVzKTt0aGlzLmxh eW91dHMubG9hZERhdGEodGhpcy5jYXBhYmlsaXRpZXMpO3RoaXMuc2V0TGF5b3V0 KHRoaXMubGF5b3V0cy5nZXRBdCgwKSk7dGhpcy5zZXREcGkodGhpcy5kcGlzLmdl dEF0KDApKTt0aGlzLmZpcmVFdmVudCgibG9hZGNhcGFiaWxpdGllcyIsdGhpcyx0 aGlzLmNhcGFiaWxpdGllcyk7fSxlbmNvZGVMYXllcjpmdW5jdGlvbihsYXllcil7 dmFyIGVuY0xheWVyO2Zvcih2YXIgYyBpbiB0aGlzLmVuY29kZXJzLmxheWVycyl7 aWYoT3BlbkxheWVycy5MYXllcltjXSYmbGF5ZXIgaW5zdGFuY2VvZiBPcGVuTGF5 ZXJzLkxheWVyW2NdKXtpZih0aGlzLmZpcmVFdmVudCgiYmVmb3JlZW5jb2RlbGF5 ZXIiLHRoaXMsbGF5ZXIpPT09ZmFsc2Upe3JldHVybjt9CmVuY0xheWVyPXRoaXMu ZW5jb2RlcnMubGF5ZXJzW2NdLmNhbGwodGhpcyxsYXllcik7dGhpcy5maXJlRXZl bnQoImVuY29kZWxheWVyIix0aGlzLGxheWVyLGVuY0xheWVyKTticmVhazt9fQpy ZXR1cm4oZW5jTGF5ZXImJmVuY0xheWVyLnR5cGUpP2VuY0xheWVyOm51bGw7fSxn ZXRBYnNvbHV0ZVVybDpmdW5jdGlvbih1cmwpe3ZhciBhO2lmKEV4dC5pc0lFKXth PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIjxhIGhyZWY9JyIrdXJsKyInLz4iKTth LnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQo YSk7YS5ocmVmPWEuaHJlZjtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO31l bHNle2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO2EuaHJlZj11cmw7fQpy ZXR1cm4gYS5ocmVmO30sZW5jb2RlcnM6eyJsYXllcnMiOnsiV01TIjpmdW5jdGlv bihsYXllcil7dmFyIGVuYz10aGlzLmVuY29kZXJzLmxheWVycy5IVFRQUmVxdWVz dC5jYWxsKHRoaXMsbGF5ZXIpO0V4dC5hcHBseShlbmMse3R5cGU6J1dNUycsbGF5 ZXJzOltsYXllci5wYXJhbXMuTEFZRVJTXS5qb2luKCIsIikuc3BsaXQoIiwiKSxm b3JtYXQ6bGF5ZXIucGFyYW1zLkZPUk1BVCxzdHlsZXM6W2xheWVyLnBhcmFtcy5T VFlMRVNdLmpvaW4oIiwiKS5zcGxpdCgiLCIpfSk7dmFyIHBhcmFtO2Zvcih2YXIg cCBpbiBsYXllci5wYXJhbXMpe3BhcmFtPXAudG9Mb3dlckNhc2UoKTtpZighbGF5 ZXIuREVGQVVMVF9QQVJBTVNbcGFyYW1dJiYibGF5ZXJzLHN0eWxlcyx3aWR0aCxo ZWlnaHQsc3JzIi5pbmRleE9mKHBhcmFtKT09LTEpe2lmKCFlbmMuY3VzdG9tUGFy YW1zKXtlbmMuY3VzdG9tUGFyYW1zPXt9O30KZW5jLmN1c3RvbVBhcmFtc1twXT1s YXllci5wYXJhbXNbcF07fX0KcmV0dXJuIGVuYzt9LCJPU00iOmZ1bmN0aW9uKGxh eWVyKXt2YXIgZW5jPXRoaXMuZW5jb2RlcnMubGF5ZXJzLlRpbGVDYWNoZS5jYWxs KHRoaXMsbGF5ZXIpO3JldHVybiBFeHQuYXBwbHkoZW5jLHt0eXBlOidPU00nLGJh c2VVUkw6ZW5jLmJhc2VVUkwuc3Vic3RyKDAsZW5jLmJhc2VVUkwuaW5kZXhPZigi JCIpKSxleHRlbnNpb246InBuZyJ9KTt9LCJUTVMiOmZ1bmN0aW9uKGxheWVyKXt2 YXIgZW5jPXRoaXMuZW5jb2RlcnMubGF5ZXJzLlRpbGVDYWNoZS5jYWxsKHRoaXMs bGF5ZXIpO3JldHVybiBFeHQuYXBwbHkoZW5jLHt0eXBlOidUTVMnLGZvcm1hdDps YXllci50eXBlfSk7fSwiVGlsZUNhY2hlIjpmdW5jdGlvbihsYXllcil7dmFyIGVu Yz10aGlzLmVuY29kZXJzLmxheWVycy5IVFRQUmVxdWVzdC5jYWxsKHRoaXMsbGF5 ZXIpO3JldHVybiBFeHQuYXBwbHkoZW5jLHt0eXBlOidUaWxlQ2FjaGUnLGxheWVy OmxheWVyLmxheWVybmFtZSxtYXhFeHRlbnQ6bGF5ZXIubWF4RXh0ZW50LnRvQXJy YXkoKSx0aWxlU2l6ZTpbbGF5ZXIudGlsZVNpemUudyxsYXllci50aWxlU2l6ZS5o XSxleHRlbnNpb246bGF5ZXIuZXh0ZW5zaW9uLHJlc29sdXRpb25zOmxheWVyLnNl cnZlclJlc29sdXRpb25zfHxsYXllci5yZXNvbHV0aW9uc30pO30sIkthTWFwQ2Fj aGUiOmZ1bmN0aW9uKGxheWVyKXt2YXIgZW5jPXRoaXMuZW5jb2RlcnMubGF5ZXJz LkthTWFwLmNhbGwodGhpcyxsYXllcik7cmV0dXJuIEV4dC5hcHBseShlbmMse3R5 cGU6J0thTWFwQ2FjaGUnLGdyb3VwOmxheWVyLnBhcmFtc1snZyddLG1ldGFUaWxl V2lkdGg6bGF5ZXIucGFyYW1zWydtZXRhVGlsZVNpemUnXVsndyddLG1ldGFUaWxl SGVpZ2h0OmxheWVyLnBhcmFtc1snbWV0YVRpbGVTaXplJ11bJ2gnXX0pO30sIkth TWFwIjpmdW5jdGlvbihsYXllcil7dmFyIGVuYz10aGlzLmVuY29kZXJzLmxheWVy cy5IVFRQUmVxdWVzdC5jYWxsKHRoaXMsbGF5ZXIpO3JldHVybiBFeHQuYXBwbHko ZW5jLHt0eXBlOidLYU1hcCcsbWFwOmxheWVyLnBhcmFtc1snbWFwJ10sZXh0ZW5z aW9uOmxheWVyLnBhcmFtc1snaSddLGdyb3VwOmxheWVyLnBhcmFtc1snZyddfHwi IixtYXhFeHRlbnQ6bGF5ZXIubWF4RXh0ZW50LnRvQXJyYXkoKSx0aWxlU2l6ZTpb bGF5ZXIudGlsZVNpemUudyxsYXllci50aWxlU2l6ZS5oXSxyZXNvbHV0aW9uczps YXllci5zZXJ2ZXJSZXNvbHV0aW9uc3x8bGF5ZXIucmVzb2x1dGlvbnN9KTt9LCJI VFRQUmVxdWVzdCI6ZnVuY3Rpb24obGF5ZXIpe3JldHVybntiYXNlVVJMOnRoaXMu Z2V0QWJzb2x1dGVVcmwobGF5ZXIudXJsIGluc3RhbmNlb2YgQXJyYXk/bGF5ZXIu dXJsWzBdOmxheWVyLnVybCksb3BhY2l0eToobGF5ZXIub3BhY2l0eSE9bnVsbCk/ bGF5ZXIub3BhY2l0eToxLjAsc2luZ2xlVGlsZTpsYXllci5zaW5nbGVUaWxlfTt9 LCJJbWFnZSI6ZnVuY3Rpb24obGF5ZXIpe3JldHVybnt0eXBlOidJbWFnZScsYmFz ZVVSTDp0aGlzLmdldEFic29sdXRlVXJsKGxheWVyLmdldFVSTChsYXllci5leHRl bnQpKSxvcGFjaXR5OihsYXllci5vcGFjaXR5IT1udWxsKT9sYXllci5vcGFjaXR5 OjEuMCxleHRlbnQ6bGF5ZXIuZXh0ZW50LnRvQXJyYXkoKSxwaXhlbFNpemU6W2xh eWVyLnNpemUudyxsYXllci5zaXplLmhdLG5hbWU6bGF5ZXIubmFtZX07fSwiVmVj dG9yIjpmdW5jdGlvbihsYXllcil7aWYoIWxheWVyLmZlYXR1cmVzLmxlbmd0aCl7 cmV0dXJuO30KdmFyIGVuY0ZlYXR1cmVzPVtdO3ZhciBlbmNTdHlsZXM9e307dmFy IGZlYXR1cmVzPWxheWVyLmZlYXR1cmVzO3ZhciBmZWF0dXJlRm9ybWF0PW5ldyBP cGVuTGF5ZXJzLkZvcm1hdC5HZW9KU09OKCk7dmFyIHN0eWxlRm9ybWF0PW5ldyBP cGVuTGF5ZXJzLkZvcm1hdC5KU09OKCk7dmFyIG5leHRJZD0xO3ZhciBzdHlsZURp Y3Q9e307dmFyIGZlYXR1cmUsc3R5bGUsZGljdEtleSxkaWN0SXRlbSxzdHlsZU5h bWU7Zm9yKHZhciBpPTAsbGVuPWZlYXR1cmVzLmxlbmd0aDtpPGxlbjsrK2kpe2Zl YXR1cmU9ZmVhdHVyZXNbaV07c3R5bGU9ZmVhdHVyZS5zdHlsZXx8bGF5ZXIuc3R5 bGV8fGxheWVyLnN0eWxlTWFwLmNyZWF0ZVN5bWJvbGl6ZXIoZmVhdHVyZSxmZWF0 dXJlLnJlbmRlckludGVudCk7ZGljdEtleT1zdHlsZUZvcm1hdC53cml0ZShzdHls ZSk7ZGljdEl0ZW09c3R5bGVEaWN0W2RpY3RLZXldO2lmKGRpY3RJdGVtKXtzdHls ZU5hbWU9ZGljdEl0ZW07fWVsc2V7c3R5bGVEaWN0W2RpY3RLZXldPXN0eWxlTmFt ZT1uZXh0SWQrKztpZihzdHlsZS5leHRlcm5hbEdyYXBoaWMpe2VuY1N0eWxlc1tz dHlsZU5hbWVdPUV4dC5hcHBseUlmKHtleHRlcm5hbEdyYXBoaWM6dGhpcy5nZXRB YnNvbHV0ZVVybChzdHlsZS5leHRlcm5hbEdyYXBoaWMpfSxzdHlsZSk7fWVsc2V7 ZW5jU3R5bGVzW3N0eWxlTmFtZV09c3R5bGU7fX0KdmFyIGZlYXR1cmVHZW9Kc29u PWZlYXR1cmVGb3JtYXQuZXh0cmFjdC5mZWF0dXJlLmNhbGwoZmVhdHVyZUZvcm1h dCxmZWF0dXJlKTtmZWF0dXJlR2VvSnNvbi5wcm9wZXJ0aWVzPU9wZW5MYXllcnMu VXRpbC5leHRlbmQoe19neF9zdHlsZTpzdHlsZU5hbWV9LGZlYXR1cmVHZW9Kc29u LnByb3BlcnRpZXMpO2VuY0ZlYXR1cmVzLnB1c2goZmVhdHVyZUdlb0pzb24pO30K cmV0dXJue3R5cGU6J1ZlY3Rvcicsc3R5bGVzOmVuY1N0eWxlcyxzdHlsZVByb3Bl cnR5OidfZ3hfc3R5bGUnLGdlb0pzb246e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9u IixmZWF0dXJlczplbmNGZWF0dXJlc30sbmFtZTpsYXllci5uYW1lLG9wYWNpdHk6 KGxheWVyLm9wYWNpdHkhPW51bGwpP2xheWVyLm9wYWNpdHk6MS4wfTt9fSwibGVn ZW5kcyI6eyJneF93bXNsZWdlbmQiOmZ1bmN0aW9uKGxlZ2VuZCl7dmFyIGVuYz10 aGlzLmVuY29kZXJzLmxlZ2VuZHMuYmFzZS5jYWxsKHRoaXMsbGVnZW5kKTt2YXIg aWNvbnM9W107Zm9yKHZhciBpPTEsbGVuPWxlZ2VuZC5pdGVtcy5nZXRDb3VudCgp O2k8bGVuOysraSl7aWNvbnMucHVzaCh0aGlzLmdldEFic29sdXRlVXJsKGxlZ2Vu ZC5pdGVtcy5nZXQoaSkudXJsKSk7fQplbmNbMF0uY2xhc3Nlc1swXT17bmFtZToi IixpY29uczppY29uc307cmV0dXJuIGVuYzt9LCJneF91cmxsZWdlbmQiOmZ1bmN0 aW9uKGxlZ2VuZCl7dmFyIGVuYz10aGlzLmVuY29kZXJzLmxlZ2VuZHMuYmFzZS5j YWxsKHRoaXMsbGVnZW5kKTtlbmNbMF0uY2xhc3Nlcy5wdXNoKHtuYW1lOiIiLGlj b246dGhpcy5nZXRBYnNvbHV0ZVVybChsZWdlbmQuaXRlbXMuZ2V0KDEpLnVybCl9 KTtyZXR1cm4gZW5jO30sImJhc2UiOmZ1bmN0aW9uKGxlZ2VuZCl7cmV0dXJuW3tu YW1lOmxlZ2VuZC5pdGVtcy5nZXQoMCkudGV4dCxjbGFzc2VzOltdfV07fX19fSk7 RXh0Lm5hbWVzcGFjZSgiR2VvRXh0Iik7R2VvRXh0Lk1hcFBhbmVsPUV4dC5leHRl bmQoRXh0LlBhbmVsLHttYXA6bnVsbCxsYXllcnM6bnVsbCxjZW50ZXI6bnVsbCx6 b29tOm51bGwscHJldHR5U3RhdGVLZXlzOmZhbHNlLGV4dGVudDpudWxsLHN0YXRl RXZlbnRzOlsiYWZ0ZXJtYXBtb3ZlIiwiYWZ0ZXJsYXllcnZpc2liaWxpdHljaGFu Z2UiLCJhZnRlcmxheWVyb3BhY2l0eWNoYW5nZSJdLGluaXRDb21wb25lbnQ6ZnVu Y3Rpb24oKXtpZighKHRoaXMubWFwIGluc3RhbmNlb2YgT3BlbkxheWVycy5NYXAp KXt0aGlzLm1hcD1uZXcgT3BlbkxheWVycy5NYXAoRXh0LmFwcGx5SWYodGhpcy5t YXB8fHt9LHthbGxPdmVybGF5czp0cnVlfSkpO30KdmFyIGxheWVycz10aGlzLmxh eWVycztpZighbGF5ZXJzfHxsYXllcnMgaW5zdGFuY2VvZiBBcnJheSl7dGhpcy5s YXllcnM9bmV3IEdlb0V4dC5kYXRhLkxheWVyU3RvcmUoe2xheWVyczpsYXllcnMs bWFwOnRoaXMubWFwLmxheWVycy5sZW5ndGg+MD90aGlzLm1hcDpudWxsfSk7fQpp Zih0eXBlb2YgdGhpcy5jZW50ZXI9PSJzdHJpbmciKXt0aGlzLmNlbnRlcj1PcGVu TGF5ZXJzLkxvbkxhdC5mcm9tU3RyaW5nKHRoaXMuY2VudGVyKTt9ZWxzZSBpZih0 aGlzLmNlbnRlciBpbnN0YW5jZW9mIEFycmF5KXt0aGlzLmNlbnRlcj1uZXcgT3Bl bkxheWVycy5Mb25MYXQodGhpcy5jZW50ZXJbMF0sdGhpcy5jZW50ZXJbMV0pO30K aWYodHlwZW9mIHRoaXMuZXh0ZW50PT0ic3RyaW5nIil7dGhpcy5leHRlbnQ9T3Bl bkxheWVycy5Cb3VuZHMuZnJvbVN0cmluZyh0aGlzLmV4dGVudCk7fWVsc2UgaWYo dGhpcy5leHRlbnQgaW5zdGFuY2VvZiBBcnJheSl7dGhpcy5leHRlbnQ9T3Blbkxh eWVycy5Cb3VuZHMuZnJvbUFycmF5KHRoaXMuZXh0ZW50KTt9Ckdlb0V4dC5NYXBQ YW5lbC5zdXBlcmNsYXNzLmluaXRDb21wb25lbnQuY2FsbCh0aGlzKTt0aGlzLmFk ZEV2ZW50cygiYWZ0ZXJtYXBtb3ZlIiwiYWZ0ZXJsYXllcnZpc2liaWxpdHljaGFu Z2UiLCJhZnRlcmxheWVyb3BhY2l0eWNoYW5nZSIpO3RoaXMubWFwLmV2ZW50cy5v bih7Im1vdmVlbmQiOnRoaXMub25Nb3ZlZW5kLCJjaGFuZ2VsYXllciI6dGhpcy5v bkxheWVyY2hhbmdlLHNjb3BlOnRoaXN9KTt9LG9uTW92ZWVuZDpmdW5jdGlvbigp e3RoaXMuZmlyZUV2ZW50KCJhZnRlcm1hcG1vdmUiKTt9LG9uTGF5ZXJjaGFuZ2U6 ZnVuY3Rpb24oZSl7aWYoZS5wcm9wZXJ0eSl7aWYoZS5wcm9wZXJ0eT09PSJ2aXNp YmlsaXR5Iil7dGhpcy5maXJlRXZlbnQoImFmdGVybGF5ZXJ2aXNpYmlsaXR5Y2hh bmdlIik7fWVsc2UgaWYoZS5wcm9wZXJ0eT09PSJvcGFjaXR5Iil7dGhpcy5maXJl RXZlbnQoImFmdGVybGF5ZXJvcGFjaXR5Y2hhbmdlIik7fX19LGFwcGx5U3RhdGU6 ZnVuY3Rpb24oc3RhdGUpe3RoaXMuY2VudGVyPW5ldyBPcGVuTGF5ZXJzLkxvbkxh dChzdGF0ZS54LHN0YXRlLnkpO3RoaXMuem9vbT1zdGF0ZS56b29tO3ZhciBpLGws bGF5ZXIsbGF5ZXJJZCx2aXNpYmlsaXR5LG9wYWNpdHk7dmFyIGxheWVycz10aGlz Lm1hcC5sYXllcnM7Zm9yKGk9MCxsPWxheWVycy5sZW5ndGg7aTxsO2krKyl7bGF5 ZXI9bGF5ZXJzW2ldO2xheWVySWQ9dGhpcy5wcmV0dHlTdGF0ZUtleXM/bGF5ZXIu bmFtZTpsYXllci5pZDt2aXNpYmlsaXR5PXN0YXRlWyJ2aXNpYmlsaXR5XyIrbGF5 ZXJJZF07aWYodmlzaWJpbGl0eSE9PXVuZGVmaW5lZCl7dmlzaWJpbGl0eT0oL150 cnVlJC9pKS50ZXN0KHZpc2liaWxpdHkpO2lmKGxheWVyLmlzQmFzZUxheWVyKXtp Zih2aXNpYmlsaXR5KXt0aGlzLm1hcC5zZXRCYXNlTGF5ZXIobGF5ZXIpO319ZWxz ZXtsYXllci5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpO319Cm9wYWNpdHk9c3Rh dGVbIm9wYWNpdHlfIitsYXllcklkXTtpZihvcGFjaXR5IT09dW5kZWZpbmVkKXts YXllci5zZXRPcGFjaXR5KG9wYWNpdHkpO319fSxnZXRTdGF0ZTpmdW5jdGlvbigp e3ZhciBzdGF0ZTtpZighdGhpcy5tYXApe3JldHVybjt9CnZhciBjZW50ZXI9dGhp cy5tYXAuZ2V0Q2VudGVyKCk7c3RhdGU9e3g6Y2VudGVyLmxvbix5OmNlbnRlci5s YXQsem9vbTp0aGlzLm1hcC5nZXRab29tKCl9O3ZhciBpLGwsbGF5ZXIsbGF5ZXJJ ZCxsYXllcnM9dGhpcy5tYXAubGF5ZXJzO2ZvcihpPTAsbD1sYXllcnMubGVuZ3Ro O2k8bDtpKyspe2xheWVyPWxheWVyc1tpXTtsYXllcklkPXRoaXMucHJldHR5U3Rh dGVLZXlzP2xheWVyLm5hbWU6bGF5ZXIuaWQ7c3RhdGVbInZpc2liaWxpdHlfIits YXllcklkXT1sYXllci5nZXRWaXNpYmlsaXR5KCk7c3RhdGVbIm9wYWNpdHlfIits YXllcklkXT1sYXllci5vcGFjaXR5PT1udWxsPzE6bGF5ZXIub3BhY2l0eTt9CnJl dHVybiBzdGF0ZTt9LHVwZGF0ZU1hcFNpemU6ZnVuY3Rpb24oKXtpZih0aGlzLm1h cCl7dGhpcy5tYXAudXBkYXRlU2l6ZSgpO319LHJlbmRlck1hcDpmdW5jdGlvbigp e3ZhciBtYXA9dGhpcy5tYXA7bWFwLnJlbmRlcih0aGlzLmJvZHkuZG9tKTt0aGlz LmxheWVycy5iaW5kKG1hcCk7aWYobWFwLmxheWVycy5sZW5ndGg+MCl7aWYodGhp cy5jZW50ZXJ8fHRoaXMuem9vbSE9bnVsbCl7bWFwLnNldENlbnRlcih0aGlzLmNl bnRlcix0aGlzLnpvb20pO31lbHNlIGlmKHRoaXMuZXh0ZW50KXttYXAuem9vbVRv RXh0ZW50KHRoaXMuZXh0ZW50KTt9ZWxzZXttYXAuem9vbVRvTWF4RXh0ZW50KCk7 fX19LGFmdGVyUmVuZGVyOmZ1bmN0aW9uKCl7R2VvRXh0Lk1hcFBhbmVsLnN1cGVy Y2xhc3MuYWZ0ZXJSZW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlz Lm93bmVyQ3Qpe3RoaXMucmVuZGVyTWFwKCk7fWVsc2V7dGhpcy5vd25lckN0Lm9u KCJtb3ZlIix0aGlzLnVwZGF0ZU1hcFNpemUsdGhpcyk7dGhpcy5vd25lckN0Lm9u KHsiYWZ0ZXJsYXlvdXQiOntmbjp0aGlzLnJlbmRlck1hcCxzY29wZTp0aGlzLHNp bmdsZTp0cnVlfX0pO319LG9uUmVzaXplOmZ1bmN0aW9uKCl7R2VvRXh0Lk1hcFBh bmVsLnN1cGVyY2xhc3Mub25SZXNpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Ro aXMudXBkYXRlTWFwU2l6ZSgpO30sb25CZWZvcmVBZGQ6ZnVuY3Rpb24oaXRlbSl7 aWYodHlwZW9mIGl0ZW0uYWRkVG9NYXBQYW5lbD09PSJmdW5jdGlvbiIpe2l0ZW0u YWRkVG9NYXBQYW5lbCh0aGlzKTt9Ckdlb0V4dC5NYXBQYW5lbC5zdXBlcmNsYXNz Lm9uQmVmb3JlQWRkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LHJlbW92ZTpmdW5j dGlvbihpdGVtLGF1dG9EZXN0cm95KXtpZih0eXBlb2YgaXRlbS5yZW1vdmVGcm9t TWFwUGFuZWw9PT0iZnVuY3Rpb24iKXtpdGVtLnJlbW92ZUZyb21NYXBQYW5lbCh0 aGlzKTt9Ckdlb0V4dC5NYXBQYW5lbC5zdXBlcmNsYXNzLnJlbW92ZS5hcHBseSh0 aGlzLGFyZ3VtZW50cyk7fSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7aWYodGhp cy5vd25lckN0KXt0aGlzLm93bmVyQ3QudW4oIm1vdmUiLHRoaXMudXBkYXRlTWFw U2l6ZSx0aGlzKTt9CmlmKHRoaXMubWFwJiZ0aGlzLm1hcC5ldmVudHMpe3RoaXMu bWFwLmV2ZW50cy51bih7Im1vdmVlbmQiOnRoaXMub25Nb3ZlZW5kLCJjaGFuZ2Vs YXllciI6dGhpcy5vbkxheWVyY2hhbmdlLHNjb3BlOnRoaXN9KTt9CmlmKCF0aGlz LmluaXRpYWxDb25maWcubWFwfHwhKHRoaXMuaW5pdGlhbENvbmZpZy5tYXAgaW5z dGFuY2VvZiBPcGVuTGF5ZXJzLk1hcCkpe2lmKHRoaXMubWFwJiZ0aGlzLm1hcC5k ZXN0cm95KXt0aGlzLm1hcC5kZXN0cm95KCk7fX0KZGVsZXRlIHRoaXMubWFwO0dl b0V4dC5NYXBQYW5lbC5zdXBlcmNsYXNzLmJlZm9yZURlc3Ryb3kuYXBwbHkodGhp cyxhcmd1bWVudHMpO319KTtHZW9FeHQuTWFwUGFuZWwuZ3Vlc3M9ZnVuY3Rpb24o KXtyZXR1cm4gRXh0LkNvbXBvbmVudE1nci5hbGwuZmluZChmdW5jdGlvbihvKXty ZXR1cm4gbyBpbnN0YW5jZW9mIEdlb0V4dC5NYXBQYW5lbDt9KTt9O0V4dC5yZWco J2d4X21hcHBhbmVsJyxHZW9FeHQuTWFwUGFuZWwpO0V4dC5uYW1lc3BhY2UoIkdl b0V4dCIpO0dlb0V4dC5QcmludE1hcFBhbmVsPUV4dC5leHRlbmQoR2VvRXh0Lk1h cFBhbmVsLHtzb3VyY2VNYXA6bnVsbCxwcmludFByb3ZpZGVyOm51bGwscHJpbnRQ YWdlOm51bGwscHJldmlld1NjYWxlczpudWxsLGNlbnRlcjpudWxsLHpvb206bnVs bCxleHRlbnQ6bnVsbCxjdXJyZW50Wm9vbTpudWxsLGluaXRDb21wb25lbnQ6ZnVu Y3Rpb24oKXtpZih0aGlzLnNvdXJjZU1hcCBpbnN0YW5jZW9mIEdlb0V4dC5NYXBQ YW5lbCl7dGhpcy5zb3VyY2VNYXA9dGhpcy5zb3VyY2VNYXAubWFwO30KaWYoIXRo aXMubWFwKXt0aGlzLm1hcD17fTt9CkV4dC5hcHBseUlmKHRoaXMubWFwLHtwcm9q ZWN0aW9uOnRoaXMuc291cmNlTWFwLmdldFByb2plY3Rpb24oKSxtYXhFeHRlbnQ6 dGhpcy5zb3VyY2VNYXAuZ2V0TWF4RXh0ZW50KCksbWF4UmVzb2x1dGlvbjp0aGlz LnNvdXJjZU1hcC5nZXRNYXhSZXNvbHV0aW9uKCksdW5pdHM6dGhpcy5zb3VyY2VN YXAuZ2V0VW5pdHMoKX0pO2lmKCEodGhpcy5wcmludFByb3ZpZGVyIGluc3RhbmNl b2YgR2VvRXh0LmRhdGEuUHJpbnRQcm92aWRlcikpe3RoaXMucHJpbnRQcm92aWRl cj1uZXcgR2VvRXh0LmRhdGEuUHJpbnRQcm92aWRlcih0aGlzLnByaW50UHJvdmlk ZXIpO30KdGhpcy5wcmludFBhZ2U9bmV3IEdlb0V4dC5kYXRhLlByaW50UGFnZSh7 cHJpbnRQcm92aWRlcjp0aGlzLnByaW50UHJvdmlkZXJ9KTt0aGlzLnByZXZpZXdT Y2FsZXM9bmV3IEV4dC5kYXRhLlN0b3JlKCk7dGhpcy5wcmV2aWV3U2NhbGVzLmFk ZCh0aGlzLnByaW50UHJvdmlkZXIuc2NhbGVzLmdldFJhbmdlKCkpO3RoaXMubGF5 ZXJzPVtdO3ZhciBsYXllcjtFeHQuZWFjaCh0aGlzLnNvdXJjZU1hcC5sYXllcnMs ZnVuY3Rpb24obGF5ZXIpe3ZhciBjbG9uZT1sYXllci5jbG9uZSgpO2xheWVyLmdl dFZpc2liaWxpdHkoKT09PXRydWUmJnRoaXMubGF5ZXJzLnB1c2goY2xvbmUpO30s dGhpcyk7dGhpcy5leHRlbnQ9dGhpcy5zb3VyY2VNYXAuZ2V0RXh0ZW50KCk7R2Vv RXh0LlByaW50TWFwUGFuZWwuc3VwZXJjbGFzcy5pbml0Q29tcG9uZW50LmNhbGwo dGhpcyk7dGhpcy5wcmludFByb3ZpZGVyLm9uKCJsYXlvdXRjaGFuZ2UiLHRoaXMu c3luY1NpemUsdGhpcyk7dGhpcy5wcmludFBhZ2Uub24oImNoYW5nZSIsdGhpcy5m aXRab29tLHRoaXMpO3RoaXMubWFwLmV2ZW50cy5yZWdpc3RlcigibW92ZWVuZCIs dGhpcyx0aGlzLnVwZGF0ZVBhZ2UpO30sYWZ0ZXJSZW5kZXI6ZnVuY3Rpb24oKXtH ZW9FeHQuUHJpbnRNYXBQYW5lbC5zdXBlcmNsYXNzLmFmdGVyUmVuZGVyLmFwcGx5 KHRoaXMsYXJndW1lbnRzKTt0aGlzLnN5bmNTaXplKCk7aWYodGhpcy5pbml0aWFs Q29uZmlnLmxpbWl0U2NhbGVzPT09dHJ1ZSl7aWYoIXRoaXMub3duZXJDdCl7dGhp cy5jYWxjdWxhdGVQcmV2aWV3U2NhbGVzKCk7fWVsc2V7dGhpcy5vd25lckN0Lm9u KHsiYWZ0ZXJsYXlvdXQiOntmbjp0aGlzLmNhbGN1bGF0ZVByZXZpZXdTY2FsZXMs c2NvcGU6dGhpcyxzaW5nbGU6dHJ1ZX19KTt9CnRoaXMub24oInJlc2l6ZSIsdGhp cy5jYWxjdWxhdGVQcmV2aWV3U2NhbGVzLHRoaXMpO319LGFkanVzdFNpemU6ZnVu Y3Rpb24od2lkdGgsaGVpZ2h0KXt2YXIgcHJpbnRTaXplPXRoaXMucHJpbnRQcm92 aWRlci5sYXlvdXQuZ2V0KCJzaXplIik7dmFyIHJhdGlvPXByaW50U2l6ZS53aWR0 aC9wcmludFNpemUuaGVpZ2h0O3ZhciBvd25lckN0PXRoaXMub3duZXJDdDt2YXIg dGFyZ2V0V2lkdGg9KG93bmVyQ3QmJm93bmVyQ3QuYXV0b1dpZHRoKT8wOih3aWR0 aHx8dGhpcy5pbml0aWFsQ29uZmlnLndpZHRoKTt2YXIgdGFyZ2V0SGVpZ2h0PShv d25lckN0JiZvd25lckN0LmF1dG9IZWlnaHQpPzA6KGhlaWdodHx8dGhpcy5pbml0 aWFsQ29uZmlnLmhlaWdodCk7aWYodGFyZ2V0V2lkdGgpe2hlaWdodD10YXJnZXRX aWR0aC9yYXRpbztpZih0YXJnZXRIZWlnaHQmJmhlaWdodD50YXJnZXRIZWlnaHQp e2hlaWdodD10YXJnZXRIZWlnaHQ7d2lkdGg9aGVpZ2h0KnJhdGlvO31lbHNle3dp ZHRoPXRhcmdldFdpZHRoO319ZWxzZSBpZih0YXJnZXRIZWlnaHQpe3dpZHRoPXRh cmdldEhlaWdodCpyYXRpbztoZWlnaHQ9dGFyZ2V0SGVpZ2h0O30KcmV0dXJue3dp ZHRoOndpZHRoLGhlaWdodDpoZWlnaHR9O30sZml0Wm9vbTpmdW5jdGlvbigpe2lm KCF0aGlzLl91cGRhdGluZyYmdGhpcy5wcmludFBhZ2Uuc2NhbGUpe3RoaXMuX3Vw ZGF0aW5nPXRydWU7dmFyIHByaW50Qm91bmRzPXRoaXMucHJpbnRQYWdlLmdldFBy aW50RXh0ZW50KHRoaXMubWFwKTt0aGlzLmN1cnJlbnRab29tPXRoaXMubWFwLmdl dFpvb21Gb3JFeHRlbnQocHJpbnRCb3VuZHMpO3RoaXMubWFwLnpvb21Ub0V4dGVu dChwcmludEJvdW5kcyk7ZGVsZXRlIHRoaXMuX3VwZGF0aW5nO319LHVwZGF0ZVBh Z2U6ZnVuY3Rpb24oKXtpZighdGhpcy5fdXBkYXRpbmcpe3ZhciB6b29tPXRoaXMu bWFwLmdldFpvb20oKTt0aGlzLl91cGRhdGluZz10cnVlO2lmKHpvb209PT10aGlz LmN1cnJlbnRab29tKXt0aGlzLnByaW50UGFnZS5zZXRDZW50ZXIodGhpcy5tYXAu Z2V0Q2VudGVyKCkpO31lbHNle3RoaXMucHJpbnRQYWdlLmZpdCh0aGlzLm1hcCk7 fQpkZWxldGUgdGhpcy5fdXBkYXRpbmc7dGhpcy5jdXJyZW50Wm9vbT16b29tO319 LGNhbGN1bGF0ZVByZXZpZXdTY2FsZXM6ZnVuY3Rpb24oKXt0aGlzLnByZXZpZXdT Y2FsZXMucmVtb3ZlQWxsKCk7dGhpcy5wcmludFBhZ2Uuc3VzcGVuZEV2ZW50cygp O3ZhciBzY2FsZT10aGlzLnByaW50UGFnZS5zY2FsZTt2YXIgdmlld1NpemU9dGhp cy5tYXAuZ2V0U2l6ZSgpO3ZhciBzY2FsZXNCeVpvb209e307dmFyIHpvb21zPVtd O3RoaXMucHJpbnRQcm92aWRlci5zY2FsZXMuZWFjaChmdW5jdGlvbihyZWMpe3Ro aXMucHJpbnRQYWdlLnNldFNjYWxlKHJlYyk7dmFyIGV4dGVudD10aGlzLnByaW50 UGFnZS5nZXRQcmludEV4dGVudCh0aGlzLm1hcCk7dmFyIHpvb209dGhpcy5tYXAu Z2V0Wm9vbUZvckV4dGVudChleHRlbnQpO3ZhciBpZGVhbFJlc29sdXRpb249TWF0 aC5tYXgoZXh0ZW50LmdldFdpZHRoKCkvdmlld1NpemUudyxleHRlbnQuZ2V0SGVp Z2h0KCkvdmlld1NpemUuaCk7dmFyIHJlc29sdXRpb249dGhpcy5tYXAuZ2V0UmVz b2x1dGlvbkZvclpvb20oem9vbSk7dmFyIGRpZmY9TWF0aC5hYnMoaWRlYWxSZXNv bHV0aW9uLXJlc29sdXRpb24pO2lmKCEoem9vbSBpbiBzY2FsZXNCeVpvb20pfHxz Y2FsZXNCeVpvb21bem9vbV0uZGlmZj5kaWZmKXtzY2FsZXNCeVpvb21bem9vbV09 e3JlYzpyZWMsZGlmZjpkaWZmfTt6b29tcy5pbmRleE9mKHpvb20pPT0tMSYmem9v bXMucHVzaCh6b29tKTt9fSx0aGlzKTtmb3IodmFyIGk9MCxpaT16b29tcy5sZW5n dGg7aTxpaTsrK2kpe3RoaXMucHJldmlld1NjYWxlcy5hZGQoc2NhbGVzQnlab29t W3pvb21zW2ldXS5yZWMpO30Kc2NhbGUmJnRoaXMucHJpbnRQYWdlLnNldFNjYWxl KHNjYWxlKTt0aGlzLnByaW50UGFnZS5yZXN1bWVFdmVudHMoKTtpZihzY2FsZSYm dGhpcy5wcmV2aWV3U2NhbGVzLmdldENvdW50KCk+MCl7dmFyIG1heFNjYWxlPXRo aXMucHJldmlld1NjYWxlcy5nZXRBdCgwKTt2YXIgbWluU2NhbGU9dGhpcy5wcmV2 aWV3U2NhbGVzLmdldEF0KHRoaXMucHJldmlld1NjYWxlcy5nZXRDb3VudCgpLTEp O2lmKHNjYWxlLmdldCgidmFsdWUiKTxtaW5TY2FsZS5nZXQoInZhbHVlIikpe3Ro aXMucHJpbnRQYWdlLnNldFNjYWxlKG1pblNjYWxlKTt9ZWxzZSBpZihzY2FsZS5n ZXQoInZhbHVlIik+bWF4U2NhbGUuZ2V0KCJ2YWx1ZSIpKXt0aGlzLnByaW50UGFn ZS5zZXRTY2FsZShtYXhTY2FsZSk7fX0KdGhpcy5maXRab29tKCk7fSxwcmludDpm dW5jdGlvbihvcHRpb25zKXt0aGlzLnByaW50UHJvdmlkZXIucHJpbnQodGhpcy5t YXAsW3RoaXMucHJpbnRQYWdlXSxvcHRpb25zKTt9LGJlZm9yZURlc3Ryb3k6ZnVu Y3Rpb24oKXt0aGlzLm1hcC5ldmVudHMudW5yZWdpc3RlcigibW92ZWVuZCIsdGhp cyx0aGlzLnVwZGF0ZVBhZ2UpO3RoaXMucHJpbnRQYWdlLnVuKCJjaGFuZ2UiLHRo aXMuZml0Wm9vbSx0aGlzKTt0aGlzLnByaW50UHJvdmlkZXIudW4oImxheW91dGNo YW5nZSIsdGhpcy5zeW5jU2l6ZSx0aGlzKTtHZW9FeHQuUHJpbnRNYXBQYW5lbC5z dXBlcmNsYXNzLmJlZm9yZURlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpO319 KTtFeHQucmVnKCdneF9wcmludG1hcHBhbmVsJyxHZW9FeHQuUHJpbnRNYXBQYW5l bCk7RXh0Lm5hbWVzcGFjZSgiR2VvRXh0LmRhdGEiKTtHZW9FeHQuZGF0YS5TY2Fs ZVN0b3JlPUV4dC5leHRlbmQoRXh0LmRhdGEuU3RvcmUse21hcDpudWxsLGNvbnN0 cnVjdG9yOmZ1bmN0aW9uKGNvbmZpZyl7dmFyIG1hcD0oY29uZmlnLm1hcCBpbnN0 YW5jZW9mIEdlb0V4dC5NYXBQYW5lbD9jb25maWcubWFwLm1hcDpjb25maWcubWFw KTtkZWxldGUgY29uZmlnLm1hcDtjb25maWc9RXh0LmFwcGx5SWYoY29uZmlnLHty ZWFkZXI6bmV3IEV4dC5kYXRhLkpzb25SZWFkZXIoe30sWyJsZXZlbCIsInJlc29s dXRpb24iLCJzY2FsZSJdKX0pO0dlb0V4dC5kYXRhLlNjYWxlU3RvcmUuc3VwZXJj bGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsY29uZmlnKTtpZihtYXApe3RoaXMu YmluZChtYXApO319LGJpbmQ6ZnVuY3Rpb24obWFwLG9wdGlvbnMpe3RoaXMubWFw PShtYXAgaW5zdGFuY2VvZiBHZW9FeHQuTWFwUGFuZWw/bWFwLm1hcDptYXApO3Ro aXMubWFwLmV2ZW50cy5yZWdpc3RlcignY2hhbmdlYmFzZWxheWVyJyx0aGlzLHRo aXMucG9wdWxhdGVGcm9tTWFwKTtpZih0aGlzLm1hcC5iYXNlTGF5ZXIpe3RoaXMu cG9wdWxhdGVGcm9tTWFwKCk7fWVsc2V7dGhpcy5tYXAuZXZlbnRzLnJlZ2lzdGVy KCdhZGRsYXllcicsdGhpcyx0aGlzLnBvcHVsYXRlT25BZGQpO319LHVuYmluZDpm dW5jdGlvbigpe2lmKHRoaXMubWFwKXt0aGlzLm1hcC5ldmVudHMudW5yZWdpc3Rl cignYWRkbGF5ZXInLHRoaXMsdGhpcy5wb3B1bGF0ZU9uQWRkKTt0aGlzLm1hcC5l dmVudHMudW5yZWdpc3RlcignY2hhbmdlYmFzZWxheWVyJyx0aGlzLHRoaXMucG9w dWxhdGVGcm9tTWFwKTtkZWxldGUgdGhpcy5tYXA7fX0scG9wdWxhdGVPbkFkZDpm dW5jdGlvbihldnQpe2lmKGV2dC5sYXllci5pc0Jhc2VMYXllcil7dGhpcy5wb3B1 bGF0ZUZyb21NYXAoKTt0aGlzLm1hcC5ldmVudHMudW5yZWdpc3RlcignYWRkbGF5 ZXInLHRoaXMsdGhpcy5wb3B1bGF0ZU9uQWRkKTt9fSxwb3B1bGF0ZUZyb21NYXA6 ZnVuY3Rpb24oKXt2YXIgem9vbXM9W107dmFyIHJlc29sdXRpb25zPXRoaXMubWFw LmJhc2VMYXllci5yZXNvbHV0aW9uczt2YXIgdW5pdHM9dGhpcy5tYXAuYmFzZUxh eWVyLnVuaXRzO2Zvcih2YXIgaT1yZXNvbHV0aW9ucy5sZW5ndGgtMTtpPj0wO2kt LSl7dmFyIHJlcz1yZXNvbHV0aW9uc1tpXTt6b29tcy5wdXNoKHtsZXZlbDppLHJl c29sdXRpb246cmVzLHNjYWxlOk9wZW5MYXllcnMuVXRpbC5nZXRTY2FsZUZyb21S ZXNvbHV0aW9uKHJlcyx1bml0cyl9KTt9CnRoaXMubG9hZERhdGEoem9vbXMpO30s ZGVzdHJveTpmdW5jdGlvbigpe3RoaXMudW5iaW5kKCk7R2VvRXh0LmRhdGEuU2Nh bGVTdG9yZS5zdXBlcmNsYXNzLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMp O319KTtFeHQubmFtZXNwYWNlKCJHZW9FeHQuZGF0YSIpO0dlb0V4dC5kYXRhLkZl YXR1cmVTdG9yZU1peGluPWZ1bmN0aW9uKCl7cmV0dXJue2xheWVyOm51bGwscmVh ZGVyOm51bGwsZmVhdHVyZUZpbHRlcjpudWxsLGNvbnN0cnVjdG9yOmZ1bmN0aW9u KGNvbmZpZyl7Y29uZmlnPWNvbmZpZ3x8e307Y29uZmlnLnJlYWRlcj1jb25maWcu cmVhZGVyfHxuZXcgR2VvRXh0LmRhdGEuRmVhdHVyZVJlYWRlcih7fSxjb25maWcu ZmllbGRzKTt2YXIgbGF5ZXI9Y29uZmlnLmxheWVyO2RlbGV0ZSBjb25maWcubGF5 ZXI7aWYoY29uZmlnLmZlYXR1cmVzKXtjb25maWcuZGF0YT1jb25maWcuZmVhdHVy ZXM7fQpkZWxldGUgY29uZmlnLmZlYXR1cmVzO3ZhciBvcHRpb25zPXtpbml0RGly OmNvbmZpZy5pbml0RGlyfTtkZWxldGUgY29uZmlnLmluaXREaXI7YXJndW1lbnRz LmNhbGxlZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjb25maWcp O2lmKGxheWVyKXt0aGlzLmJpbmQobGF5ZXIsb3B0aW9ucyk7fX0sYmluZDpmdW5j dGlvbihsYXllcixvcHRpb25zKXtpZih0aGlzLmxheWVyKXtyZXR1cm47fQp0aGlz LmxheWVyPWxheWVyO29wdGlvbnM9b3B0aW9uc3x8e307dmFyIGluaXREaXI9b3B0 aW9ucy5pbml0RGlyO2lmKG9wdGlvbnMuaW5pdERpcj09dW5kZWZpbmVkKXtpbml0 RGlyPUdlb0V4dC5kYXRhLkZlYXR1cmVTdG9yZS5MQVlFUl9UT19TVE9SRXxHZW9F eHQuZGF0YS5GZWF0dXJlU3RvcmUuU1RPUkVfVE9fTEFZRVI7fQp2YXIgZmVhdHVy ZXM9bGF5ZXIuZmVhdHVyZXMuc2xpY2UoMCk7aWYoaW5pdERpciZHZW9FeHQuZGF0 YS5GZWF0dXJlU3RvcmUuU1RPUkVfVE9fTEFZRVIpe3ZhciByZWNvcmRzPXRoaXMu Z2V0UmFuZ2UoKTtmb3IodmFyIGk9cmVjb3Jkcy5sZW5ndGgtMTtpPj0wO2ktLSl7 dGhpcy5sYXllci5hZGRGZWF0dXJlcyhbcmVjb3Jkc1tpXS5nZXRGZWF0dXJlKCld KTt9fQppZihpbml0RGlyJkdlb0V4dC5kYXRhLkZlYXR1cmVTdG9yZS5MQVlFUl9U T19TVE9SRSl7dGhpcy5sb2FkRGF0YShmZWF0dXJlcyx0cnVlKTt9CmxheWVyLmV2 ZW50cy5vbih7ImZlYXR1cmVzYWRkZWQiOnRoaXMub25GZWF0dXJlc0FkZGVkLCJm ZWF0dXJlc3JlbW92ZWQiOnRoaXMub25GZWF0dXJlc1JlbW92ZWQsImZlYXR1cmVt b2RpZmllZCI6dGhpcy5vbkZlYXR1cmVNb2RpZmllZCxzY29wZTp0aGlzfSk7dGhp cy5vbih7ImxvYWQiOnRoaXMub25Mb2FkLCJjbGVhciI6dGhpcy5vbkNsZWFyLCJh ZGQiOnRoaXMub25BZGQsInJlbW92ZSI6dGhpcy5vblJlbW92ZSwidXBkYXRlIjp0 aGlzLm9uVXBkYXRlLHNjb3BlOnRoaXN9KTt9LHVuYmluZDpmdW5jdGlvbigpe2lm KHRoaXMubGF5ZXIpe3RoaXMubGF5ZXIuZXZlbnRzLnVuKHsiZmVhdHVyZXNhZGRl ZCI6dGhpcy5vbkZlYXR1cmVzQWRkZWQsImZlYXR1cmVzcmVtb3ZlZCI6dGhpcy5v bkZlYXR1cmVzUmVtb3ZlZCwiZmVhdHVyZW1vZGlmaWVkIjp0aGlzLm9uRmVhdHVy ZU1vZGlmaWVkLHNjb3BlOnRoaXN9KTt0aGlzLnVuKCJsb2FkIix0aGlzLm9uTG9h ZCx0aGlzKTt0aGlzLnVuKCJjbGVhciIsdGhpcy5vbkNsZWFyLHRoaXMpO3RoaXMu dW4oImFkZCIsdGhpcy5vbkFkZCx0aGlzKTt0aGlzLnVuKCJyZW1vdmUiLHRoaXMu b25SZW1vdmUsdGhpcyk7dGhpcy51bigidXBkYXRlIix0aGlzLm9uVXBkYXRlLHRo aXMpO3RoaXMubGF5ZXI9bnVsbDt9fSxnZXRSZWNvcmRGcm9tRmVhdHVyZTpmdW5j dGlvbihmZWF0dXJlKXt2YXIgcmVjb3JkPW51bGw7aWYoZmVhdHVyZS5zdGF0ZSE9 PU9wZW5MYXllcnMuU3RhdGUuSU5TRVJUKXtyZWNvcmQ9dGhpcy5nZXRCeUlkKGZl YXR1cmUuaWQpO31lbHNle3ZhciBpbmRleD10aGlzLmZpbmRCeShmdW5jdGlvbihy KXtyZXR1cm4gci5nZXRGZWF0dXJlKCk9PT1mZWF0dXJlO30pO2lmKGluZGV4Pi0x KXtyZWNvcmQ9dGhpcy5nZXRBdChpbmRleCk7fX0KcmV0dXJuIHJlY29yZDt9LG9u RmVhdHVyZXNBZGRlZDpmdW5jdGlvbihldnQpe2lmKCF0aGlzLl9hZGRpbmcpe3Zh ciBmZWF0dXJlcz1ldnQuZmVhdHVyZXMsdG9BZGQ9ZmVhdHVyZXM7aWYodGhpcy5m ZWF0dXJlRmlsdGVyKXt0b0FkZD1bXTt2YXIgaSxsZW4sZmVhdHVyZTtmb3IodmFy IGk9MCxsZW49ZmVhdHVyZXMubGVuZ3RoO2k8bGVuO2krKyl7ZmVhdHVyZT1mZWF0 dXJlc1tpXTtpZih0aGlzLmZlYXR1cmVGaWx0ZXIuZXZhbHVhdGUoZmVhdHVyZSkh PT1mYWxzZSl7dG9BZGQucHVzaChmZWF0dXJlKTt9fX0KdGhpcy5fYWRkaW5nPXRy dWU7dGhpcy5sb2FkRGF0YSh0b0FkZCx0cnVlKTtkZWxldGUgdGhpcy5fYWRkaW5n O319LG9uRmVhdHVyZXNSZW1vdmVkOmZ1bmN0aW9uKGV2dCl7aWYoIXRoaXMuX3Jl bW92aW5nKXt2YXIgZmVhdHVyZXM9ZXZ0LmZlYXR1cmVzLGZlYXR1cmUscmVjb3Jk LGk7Zm9yKGk9ZmVhdHVyZXMubGVuZ3RoLTE7aT49MDtpLS0pe2ZlYXR1cmU9ZmVh dHVyZXNbaV07cmVjb3JkPXRoaXMuZ2V0UmVjb3JkRnJvbUZlYXR1cmUoZmVhdHVy ZSk7aWYocmVjb3JkIT09dW5kZWZpbmVkKXt0aGlzLl9yZW1vdmluZz10cnVlO3Ro aXMucmVtb3ZlKHJlY29yZCk7ZGVsZXRlIHRoaXMuX3JlbW92aW5nO319fX0sb25G ZWF0dXJlTW9kaWZpZWQ6ZnVuY3Rpb24oZXZ0KXtpZighdGhpcy5fdXBkYXRpbmcp e3ZhciBmZWF0dXJlPWV2dC5mZWF0dXJlO3ZhciByZWNvcmQ9dGhpcy5nZXRSZWNv cmRGcm9tRmVhdHVyZShmZWF0dXJlKTtpZihyZWNvcmQhPT11bmRlZmluZWQpe3Jl Y29yZC5iZWdpbkVkaXQoKTt2YXIgYXR0cmlidXRlcz1mZWF0dXJlLmF0dHJpYnV0 ZXM7aWYoYXR0cmlidXRlcyl7dmFyIGZpZWxkcz10aGlzLnJlY29yZFR5cGUucHJv dG90eXBlLmZpZWxkcztmb3IodmFyIGk9MCxsZW49ZmllbGRzLmxlbmd0aDtpPGxl bjtpKyspe3ZhciBmaWVsZD1maWVsZHMuaXRlbXNbaV07dmFyIGtleT1maWVsZC5t YXBwaW5nfHxmaWVsZC5uYW1lO2lmKGtleSBpbiBhdHRyaWJ1dGVzKXtyZWNvcmQu c2V0KGZpZWxkLm5hbWUsZmllbGQuY29udmVydChhdHRyaWJ1dGVzW2tleV0pKTt9 fX0KcmVjb3JkLnNldCgic3RhdGUiLGZlYXR1cmUuc3RhdGUpO3JlY29yZC5zZXQo ImZpZCIsZmVhdHVyZS5maWQpO3JlY29yZC5zZXRGZWF0dXJlKGZlYXR1cmUpO3Ro aXMuX3VwZGF0aW5nPXRydWU7cmVjb3JkLmVuZEVkaXQoKTtkZWxldGUgdGhpcy5f dXBkYXRpbmc7fX19LGFkZEZlYXR1cmVzVG9MYXllcjpmdW5jdGlvbihyZWNvcmRz KXt2YXIgaSxsZW4sZmVhdHVyZXM7ZmVhdHVyZXM9bmV3IEFycmF5KChsZW49cmVj b3Jkcy5sZW5ndGgpKTtmb3IoaT0wO2k8bGVuO2krKyl7ZmVhdHVyZXNbaV09cmVj b3Jkc1tpXS5nZXRGZWF0dXJlKCk7fQppZihmZWF0dXJlcy5sZW5ndGg+MCl7dGhp cy5fYWRkaW5nPXRydWU7dGhpcy5sYXllci5hZGRGZWF0dXJlcyhmZWF0dXJlcyk7 ZGVsZXRlIHRoaXMuX2FkZGluZzt9fSxvbkxvYWQ6ZnVuY3Rpb24oc3RvcmUscmVj b3JkcyxvcHRpb25zKXtpZighb3B0aW9uc3x8b3B0aW9ucy5hZGQhPT10cnVlKXt0 aGlzLl9yZW1vdmluZz10cnVlO3RoaXMubGF5ZXIucmVtb3ZlRmVhdHVyZXModGhp cy5sYXllci5mZWF0dXJlcyk7ZGVsZXRlIHRoaXMuX3JlbW92aW5nO3RoaXMuYWRk RmVhdHVyZXNUb0xheWVyKHJlY29yZHMpO319LG9uQ2xlYXI6ZnVuY3Rpb24oc3Rv cmUpe3RoaXMuX3JlbW92aW5nPXRydWU7dGhpcy5sYXllci5yZW1vdmVGZWF0dXJl cyh0aGlzLmxheWVyLmZlYXR1cmVzKTtkZWxldGUgdGhpcy5fcmVtb3Zpbmc7fSxv bkFkZDpmdW5jdGlvbihzdG9yZSxyZWNvcmRzLGluZGV4KXtpZighdGhpcy5fYWRk aW5nKXt0aGlzLmFkZEZlYXR1cmVzVG9MYXllcihyZWNvcmRzKTt9fSxvblJlbW92 ZTpmdW5jdGlvbihzdG9yZSxyZWNvcmQsaW5kZXgpe2lmKCF0aGlzLl9yZW1vdmlu Zyl7dmFyIGZlYXR1cmU9cmVjb3JkLmdldEZlYXR1cmUoKTtpZih0aGlzLmxheWVy LmdldEZlYXR1cmVCeUlkKGZlYXR1cmUuaWQpIT1udWxsKXt0aGlzLl9yZW1vdmlu Zz10cnVlO3RoaXMubGF5ZXIucmVtb3ZlRmVhdHVyZXMoW3JlY29yZC5nZXRGZWF0 dXJlKCldKTtkZWxldGUgdGhpcy5fcmVtb3Zpbmc7fX19LG9uVXBkYXRlOmZ1bmN0 aW9uKHN0b3JlLHJlY29yZCxvcGVyYXRpb24pe2lmKCF0aGlzLl91cGRhdGluZyl7 dmFyIGRlZmF1bHRGaWVsZHM9bmV3IEdlb0V4dC5kYXRhLkZlYXR1cmVSZWNvcmQo KS5maWVsZHM7dmFyIGZlYXR1cmU9cmVjb3JkLmdldEZlYXR1cmUoKTtpZihyZWNv cmQuZmllbGRzKXt2YXIgY29udD10aGlzLmxheWVyLmV2ZW50cy50cmlnZ2VyRXZl bnQoImJlZm9yZWZlYXR1cmVtb2RpZmllZCIse2ZlYXR1cmU6ZmVhdHVyZX0pO2lm KGNvbnQhPT1mYWxzZSl7dmFyIGF0dHJpYnV0ZXM9ZmVhdHVyZS5hdHRyaWJ1dGVz O3JlY29yZC5maWVsZHMuZWFjaChmdW5jdGlvbihmaWVsZCl7dmFyIGtleT1maWVs ZC5tYXBwaW5nfHxmaWVsZC5uYW1lO2lmKCFkZWZhdWx0RmllbGRzLmNvbnRhaW5z S2V5KGtleSkpe2F0dHJpYnV0ZXNba2V5XT1yZWNvcmQuZ2V0KGZpZWxkLm5hbWUp O319KTt0aGlzLl91cGRhdGluZz10cnVlO3RoaXMubGF5ZXIuZXZlbnRzLnRyaWdn ZXJFdmVudCgiZmVhdHVyZW1vZGlmaWVkIix7ZmVhdHVyZTpmZWF0dXJlfSk7ZGVs ZXRlIHRoaXMuX3VwZGF0aW5nO2lmKHRoaXMubGF5ZXIuZ2V0RmVhdHVyZUJ5SWQo ZmVhdHVyZS5pZCkhPW51bGwpe3RoaXMubGF5ZXIuZHJhd0ZlYXR1cmUoZmVhdHVy ZSk7fX19fX19O307R2VvRXh0LmRhdGEuRmVhdHVyZVN0b3JlPUV4dC5leHRlbmQo RXh0LmRhdGEuU3RvcmUsbmV3IEdlb0V4dC5kYXRhLkZlYXR1cmVTdG9yZU1peGlu KTtHZW9FeHQuZGF0YS5GZWF0dXJlU3RvcmUuTEFZRVJfVE9fU1RPUkU9MTtHZW9F eHQuZGF0YS5GZWF0dXJlU3RvcmUuU1RPUkVfVE9fTEFZRVI9MjtFeHQubmFtZXNw YWNlKCJHZW9FeHQuZGF0YSIpO0dlb0V4dC5kYXRhLldGU0NhcGFiaWxpdGllc1N0 b3JlPWZ1bmN0aW9uKGMpe2M9Y3x8e307R2VvRXh0LmRhdGEuV0ZTQ2FwYWJpbGl0 aWVzU3RvcmUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsRXh0LmFw cGx5KGMse3Byb3h5OmMucHJveHl8fCghYy5kYXRhP25ldyBFeHQuZGF0YS5IdHRw UHJveHkoe3VybDpjLnVybCxkaXNhYmxlQ2FjaGluZzpmYWxzZSxtZXRob2Q6IkdF VCJ9KTp1bmRlZmluZWQpLHJlYWRlcjpuZXcgR2VvRXh0LmRhdGEuV0ZTQ2FwYWJp bGl0aWVzUmVhZGVyKGMsYy5maWVsZHMpfSkpO307RXh0LmV4dGVuZChHZW9FeHQu ZGF0YS5XRlNDYXBhYmlsaXRpZXNTdG9yZSxFeHQuZGF0YS5TdG9yZSk7RXh0Lm5h bWVzcGFjZSgiR2VvRXh0LnBsdWdpbnMiKTtHZW9FeHQucGx1Z2lucy5BdHRyaWJ1 dGVGb3JtPWZ1bmN0aW9uKGNvbmZpZyl7RXh0LmFwcGx5KHRoaXMsY29uZmlnKTt9 O0dlb0V4dC5wbHVnaW5zLkF0dHJpYnV0ZUZvcm0ucHJvdG90eXBlPXthdHRyaWJ1 dGVTdG9yZTpudWxsLGZvcm1QYW5lbDpudWxsLGluaXQ6ZnVuY3Rpb24oZm9ybVBh bmVsKXt0aGlzLmZvcm1QYW5lbD1mb3JtUGFuZWw7aWYodGhpcy5hdHRyaWJ1dGVT dG9yZSBpbnN0YW5jZW9mIEV4dC5kYXRhLlN0b3JlKXt0aGlzLmZpbGxGb3JtKCk7 dGhpcy5iaW5kKHRoaXMuYXR0cmlidXRlU3RvcmUpO30KZm9ybVBhbmVsLm9uKCJk ZXN0cm95Iix0aGlzLm9uRm9ybURlc3Ryb3ksdGhpcyk7fSxiaW5kOmZ1bmN0aW9u KHN0b3JlKXt0aGlzLnVuYmluZCgpO3N0b3JlLm9uKHsibG9hZCI6dGhpcy5vbkxv YWQsc2NvcGU6dGhpc30pO3RoaXMuYXR0cmlidXRlU3RvcmU9c3RvcmU7fSx1bmJp bmQ6ZnVuY3Rpb24oKXtpZih0aGlzLmF0dHJpYnV0ZVN0b3JlKXt0aGlzLmF0dHJp YnV0ZVN0b3JlLnVuKCJsb2FkIix0aGlzLm9uTG9hZCx0aGlzKTt9fSxvbkxvYWQ6 ZnVuY3Rpb24oKXtpZih0aGlzLmZvcm1QYW5lbC5pdGVtcyl7dGhpcy5mb3JtUGFu ZWwucmVtb3ZlQWxsKCk7fQp0aGlzLmZpbGxGb3JtKCk7fSxmaWxsRm9ybTpmdW5j dGlvbigpe3RoaXMuYXR0cmlidXRlU3RvcmUuZWFjaChmdW5jdGlvbihyZWNvcmQp e3ZhciBmaWVsZD1HZW9FeHQuZm9ybS5yZWNvcmRUb0ZpZWxkKHJlY29yZCk7aWYo ZmllbGQpe3RoaXMuZm9ybVBhbmVsLmFkZChmaWVsZCk7fX0sdGhpcyk7dGhpcy5m b3JtUGFuZWwuZG9MYXlvdXQoKTt9LG9uRm9ybURlc3Ryb3k6ZnVuY3Rpb24oKXt0 aGlzLnVuYmluZCgpO319O0V4dC5wcmVnKCJneF9hdHRyaWJ1dGVmb3JtIixHZW9F eHQucGx1Z2lucy5BdHRyaWJ1dGVGb3JtKTtFeHQubmFtZXNwYWNlKCdHZW9FeHQn LCdHZW9FeHQuZGF0YScpO0dlb0V4dC5kYXRhLlByb3RvY29sUHJveHk9ZnVuY3Rp b24oY29uZmlnKXtFeHQuYXBwbHkodGhpcyxjb25maWcpO0dlb0V4dC5kYXRhLlBy b3RvY29sUHJveHkuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFy Z3VtZW50cyk7fTtFeHQuZXh0ZW5kKEdlb0V4dC5kYXRhLlByb3RvY29sUHJveHks RXh0LmRhdGEuRGF0YVByb3h5LHtwcm90b2NvbDpudWxsLGFib3J0UHJldmlvdXM6 dHJ1ZSxzZXRQYXJhbXNBc09wdGlvbnM6ZmFsc2UscmVzcG9uc2U6bnVsbCxsb2Fk OmZ1bmN0aW9uKHBhcmFtcyxyZWFkZXIsY2FsbGJhY2ssc2NvcGUsYXJnKXtpZih0 aGlzLmZpcmVFdmVudCgiYmVmb3JlbG9hZCIsdGhpcyxwYXJhbXMpIT09ZmFsc2Up e3ZhciBvPXtwYXJhbXM6cGFyYW1zfHx7fSxyZXF1ZXN0OntjYWxsYmFjazpjYWxs YmFjayxzY29wZTpzY29wZSxhcmc6YXJnfSxyZWFkZXI6cmVhZGVyfTt2YXIgY2I9 T3BlbkxheWVycy5GdW5jdGlvbi5iaW5kKHRoaXMubG9hZFJlc3BvbnNlLHRoaXMs byk7aWYodGhpcy5hYm9ydFByZXZpb3VzKXt0aGlzLmFib3J0UmVxdWVzdCgpO30K dmFyIG9wdGlvbnM9e3BhcmFtczpwYXJhbXMsY2FsbGJhY2s6Y2Isc2NvcGU6dGhp c307RXh0LmFwcGx5SWYob3B0aW9ucyxhcmcpO2lmKHRoaXMuc2V0UGFyYW1zQXNP cHRpb25zPT09dHJ1ZSl7RXh0LmFwcGx5SWYob3B0aW9ucyxvcHRpb25zLnBhcmFt cyk7ZGVsZXRlIG9wdGlvbnMucGFyYW1zO30KdGhpcy5yZXNwb25zZT10aGlzLnBy b3RvY29sLnJlYWQob3B0aW9ucyk7fWVsc2V7Y2FsbGJhY2suY2FsbChzY29wZXx8 dGhpcyxudWxsLGFyZyxmYWxzZSk7fX0sYWJvcnRSZXF1ZXN0OmZ1bmN0aW9uKCl7 aWYodGhpcy5yZXNwb25zZSl7dGhpcy5wcm90b2NvbC5hYm9ydCh0aGlzLnJlc3Bv bnNlKTt0aGlzLnJlc3BvbnNlPW51bGw7fX0sbG9hZFJlc3BvbnNlOmZ1bmN0aW9u KG8scmVzcG9uc2Upe2lmKHJlc3BvbnNlLnN1Y2Nlc3MoKSl7dmFyIHJlc3VsdD1v LnJlYWRlci5yZWFkKHJlc3BvbnNlKTt0aGlzLmZpcmVFdmVudCgibG9hZCIsdGhp cyxvLG8ucmVxdWVzdC5hcmcpO28ucmVxdWVzdC5jYWxsYmFjay5jYWxsKG8ucmVx dWVzdC5zY29wZSxyZXN1bHQsby5yZXF1ZXN0LmFyZyx0cnVlKTt9ZWxzZXt0aGlz LmZpcmVFdmVudCgibG9hZGV4Y2VwdGlvbiIsdGhpcyxvLHJlc3BvbnNlKTtvLnJl cXVlc3QuY2FsbGJhY2suY2FsbChvLnJlcXVlc3Quc2NvcGUsbnVsbCxvLnJlcXVl c3QuYXJnLGZhbHNlKTt9fX0pO0V4dC5uYW1lc3BhY2UoIkdlb0V4dCIpO0dlb0V4 dC5BY3Rpb249RXh0LmV4dGVuZChFeHQuQWN0aW9uLHtjb250cm9sOm51bGwsbWFw Om51bGwsdVNjb3BlOm51bGwsdUhhbmRsZXI6bnVsbCx1VG9nZ2xlSGFuZGxlcjpu dWxsLHVDaGVja0hhbmRsZXI6bnVsbCxjb25zdHJ1Y3RvcjpmdW5jdGlvbihjb25m aWcpe3RoaXMudVNjb3BlPWNvbmZpZy5zY29wZTt0aGlzLnVIYW5kbGVyPWNvbmZp Zy5oYW5kbGVyO3RoaXMudVRvZ2dsZUhhbmRsZXI9Y29uZmlnLnRvZ2dsZUhhbmRs ZXI7dGhpcy51Q2hlY2tIYW5kbGVyPWNvbmZpZy5jaGVja0hhbmRsZXI7Y29uZmln LnNjb3BlPXRoaXM7Y29uZmlnLmhhbmRsZXI9dGhpcy5wSGFuZGxlcjtjb25maWcu dG9nZ2xlSGFuZGxlcj10aGlzLnBUb2dnbGVIYW5kbGVyO2NvbmZpZy5jaGVja0hh bmRsZXI9dGhpcy5wQ2hlY2tIYW5kbGVyO3ZhciBjdHJsPXRoaXMuY29udHJvbD1j b25maWcuY29udHJvbDtkZWxldGUgY29uZmlnLmNvbnRyb2w7aWYoY3RybCl7aWYo Y29uZmlnLm1hcCl7Y29uZmlnLm1hcC5hZGRDb250cm9sKGN0cmwpO2RlbGV0ZSBj b25maWcubWFwO30KaWYoKGNvbmZpZy5wcmVzc2VkfHxjb25maWcuY2hlY2tlZCkm JmN0cmwubWFwKXtjdHJsLmFjdGl2YXRlKCk7fQpjdHJsLmV2ZW50cy5vbih7YWN0 aXZhdGU6dGhpcy5vbkN0cmxBY3RpdmF0ZSxkZWFjdGl2YXRlOnRoaXMub25DdHJs RGVhY3RpdmF0ZSxzY29wZTp0aGlzfSk7fQphcmd1bWVudHMuY2FsbGVlLnN1cGVy Y2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGNvbmZpZyk7fSxwSGFuZGxlcjpm dW5jdGlvbihjbXApe3ZhciBjdHJsPXRoaXMuY29udHJvbDtpZihjdHJsJiZjdHJs LnR5cGU9PU9wZW5MYXllcnMuQ29udHJvbC5UWVBFX0JVVFRPTil7Y3RybC50cmln Z2VyKCk7fQppZih0aGlzLnVIYW5kbGVyKXt0aGlzLnVIYW5kbGVyLmFwcGx5KHRo aXMudVNjb3BlLGFyZ3VtZW50cyk7fX0scFRvZ2dsZUhhbmRsZXI6ZnVuY3Rpb24o Y21wLHN0YXRlKXt0aGlzLmNoYW5nZUNvbnRyb2xTdGF0ZShzdGF0ZSk7aWYodGhp cy51VG9nZ2xlSGFuZGxlcil7dGhpcy51VG9nZ2xlSGFuZGxlci5hcHBseSh0aGlz LnVTY29wZSxhcmd1bWVudHMpO319LHBDaGVja0hhbmRsZXI6ZnVuY3Rpb24oY21w LHN0YXRlKXt0aGlzLmNoYW5nZUNvbnRyb2xTdGF0ZShzdGF0ZSk7aWYodGhpcy51 Q2hlY2tIYW5kbGVyKXt0aGlzLnVDaGVja0hhbmRsZXIuYXBwbHkodGhpcy51U2Nv cGUsYXJndW1lbnRzKTt9fSxjaGFuZ2VDb250cm9sU3RhdGU6ZnVuY3Rpb24oc3Rh dGUpe2lmKHN0YXRlKXtpZighdGhpcy5fYWN0aXZhdGluZyl7dGhpcy5fYWN0aXZh dGluZz10cnVlO3RoaXMuY29udHJvbC5hY3RpdmF0ZSgpO3RoaXMuX2FjdGl2YXRp bmc9ZmFsc2U7fX1lbHNle2lmKCF0aGlzLl9kZWFjdGl2YXRpbmcpe3RoaXMuX2Rl YWN0aXZhdGluZz10cnVlO3RoaXMuY29udHJvbC5kZWFjdGl2YXRlKCk7dGhpcy5f ZGVhY3RpdmF0aW5nPWZhbHNlO319fSxvbkN0cmxBY3RpdmF0ZTpmdW5jdGlvbigp e3ZhciBjdHJsPXRoaXMuY29udHJvbDtpZihjdHJsLnR5cGU9PU9wZW5MYXllcnMu Q29udHJvbC5UWVBFX0JVVFRPTil7dGhpcy5lbmFibGUoKTt9ZWxzZXt0aGlzLnNh ZmVDYWxsRWFjaCgidG9nZ2xlIixbdHJ1ZV0pO3RoaXMuc2FmZUNhbGxFYWNoKCJz ZXRDaGVja2VkIixbdHJ1ZV0pO319LG9uQ3RybERlYWN0aXZhdGU6ZnVuY3Rpb24o KXt2YXIgY3RybD10aGlzLmNvbnRyb2w7aWYoY3RybC50eXBlPT1PcGVuTGF5ZXJz LkNvbnRyb2wuVFlQRV9CVVRUT04pe3RoaXMuZGlzYWJsZSgpO31lbHNle3RoaXMu c2FmZUNhbGxFYWNoKCJ0b2dnbGUiLFtmYWxzZV0pO3RoaXMuc2FmZUNhbGxFYWNo KCJzZXRDaGVja2VkIixbZmFsc2VdKTt9fSxzYWZlQ2FsbEVhY2g6ZnVuY3Rpb24o Zm5OYW1lLGFyZ3Mpe3ZhciBjcz10aGlzLml0ZW1zO2Zvcih2YXIgaT0wLGxlbj1j cy5sZW5ndGg7aTxsZW47aSsrKXtpZihjc1tpXVtmbk5hbWVdKXtjc1tpXS5yZW5k ZXJlZD9jc1tpXVtmbk5hbWVdLmFwcGx5KGNzW2ldLGFyZ3MpOmNzW2ldLm9uKHsi cmVuZGVyIjpjc1tpXVtmbk5hbWVdLmNyZWF0ZURlbGVnYXRlKGNzW2ldLGFyZ3Mp LHNpbmdsZTp0cnVlfSk7fX19fSk7RXh0Lm5hbWVzcGFjZSgiR2VvRXh0LnRyZWUi KTtHZW9FeHQudHJlZS5UcmVlTm9kZVVJRXZlbnRNaXhpbj1mdW5jdGlvbigpe3Jl dHVybntjb25zdHJ1Y3RvcjpmdW5jdGlvbihub2RlKXtub2RlLmFkZEV2ZW50cygi cmVuZGVybm9kZSIsInJhd2NsaWNrbm9kZSIpO3RoaXMuc3VwZXJjbGFzcz1hcmd1 bWVudHMuY2FsbGVlLnN1cGVyY2xhc3M7dGhpcy5zdXBlcmNsYXNzLmNvbnN0cnVj dG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9LHJlbmRlcjpmdW5jdGlvbihidWxr UmVuZGVyKXtpZighdGhpcy5yZW5kZXJlZCl7dGhpcy5zdXBlcmNsYXNzLnJlbmRl ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5maXJlRXZlbnQoInJlbmRlcm5v ZGUiLHRoaXMubm9kZSk7fX0sb25DbGljazpmdW5jdGlvbihlKXtpZih0aGlzLmZp cmVFdmVudCgicmF3Y2xpY2tub2RlIix0aGlzLm5vZGUsZSkhPT1mYWxzZSl7dGhp cy5zdXBlcmNsYXNzLm9uQ2xpY2suYXBwbHkodGhpcyxhcmd1bWVudHMpO319fX07 RXh0Lm5hbWVzcGFjZSgiR2VvRXh0LnBsdWdpbnMiKTtHZW9FeHQucGx1Z2lucy5U cmVlTm9kZVJhZGlvQnV0dG9uPUV4dC5leHRlbmQoRXh0LnV0aWwuT2JzZXJ2YWJs ZSx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oY29uZmlnKXtFeHQuYXBwbHkodGhpcy5p bml0aWFsQ29uZmlnLEV4dC5hcHBseSh7fSxjb25maWcpKTtFeHQuYXBwbHkodGhp cyxjb25maWcpO3RoaXMuYWRkRXZlbnRzKCJyYWRpb2NoYW5nZSIpO0dlb0V4dC5w bHVnaW5zLlRyZWVOb2RlUmFkaW9CdXR0b24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rv ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fSxpbml0OmZ1bmN0aW9uKHRyZWUpe3Ry ZWUub24oeyJyZW5kZXJub2RlIjp0aGlzLm9uUmVuZGVyTm9kZSwicmF3Y2xpY2tu b2RlIjp0aGlzLm9uUmF3Q2xpY2tOb2RlLCJiZWZvcmVkZXN0cm95Ijp0aGlzLm9u QmVmb3JlRGVzdHJveSxzY29wZTp0aGlzfSk7fSxvblJlbmRlck5vZGU6ZnVuY3Rp b24obm9kZSl7dmFyIGE9bm9kZS5hdHRyaWJ1dGVzO2lmKGEucmFkaW9Hcm91cCYm IWEucmFkaW8pe2EucmFkaW89RXh0LkRvbUhlbHBlci5pbnNlcnRCZWZvcmUobm9k ZS51aS5hbmNob3IsWyc8aW5wdXQgdHlwZT0icmFkaW8iIGNsYXNzPSJneC10cmVl LXJhZGlvIiBuYW1lPSInLGEucmFkaW9Hcm91cCwnX3JhZGlvIj48L2lucHV0Pidd LmpvaW4oIiIpKTt9fSxvblJhd0NsaWNrTm9kZTpmdW5jdGlvbihub2RlLGUpe3Zh ciBlbD1lLmdldFRhcmdldCgnLmd4LXRyZWUtcmFkaW8nLDEpO2lmKGVsKXtlbC5k ZWZhdWx0Q2hlY2tlZD1lbC5jaGVja2VkO3RoaXMuZmlyZUV2ZW50KCJyYWRpb2No YW5nZSIsbm9kZSk7cmV0dXJuIGZhbHNlO319LG9uQmVmb3JlRGVzdHJveTpmdW5j dGlvbih0cmVlKXt0cmVlLnVuKCJyZW5kZXJub2RlIix0aGlzLm9uUmVuZGVyTm9k ZSx0aGlzKTt0cmVlLnVuKCJyYXdjbGlja25vZGUiLHRoaXMub25SZW5kZXJOb2Rl LHRoaXMpO3RyZWUudW4oImJlZm9yZWRlc3Ryb3kiLHRoaXMub25CZWZvcmVEZXN0 cm95LHRoaXMpO319KTtFeHQucHJlZygiZ3hfdHJlZW5vZGVyYWRpb2J1dHRvbiIs R2VvRXh0LnBsdWdpbnMuVHJlZU5vZGVSYWRpb0J1dHRvbik7RXh0Lm5hbWVzcGFj ZSgiR2VvRXh0LmRhdGEiKTtHZW9FeHQuZGF0YS5XTVNDYXBhYmlsaXRpZXNTdG9y ZT1mdW5jdGlvbihjKXtjPWN8fHt9O0dlb0V4dC5kYXRhLldNU0NhcGFiaWxpdGll c1N0b3JlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLEV4dC5hcHBs eShjLHtwcm94eTpjLnByb3h5fHwoIWMuZGF0YT9uZXcgRXh0LmRhdGEuSHR0cFBy b3h5KHt1cmw6Yy51cmwsZGlzYWJsZUNhY2hpbmc6ZmFsc2UsbWV0aG9kOiJHRVQi fSk6dW5kZWZpbmVkKSxyZWFkZXI6bmV3IEdlb0V4dC5kYXRhLldNU0NhcGFiaWxp dGllc1JlYWRlcihjLGMuZmllbGRzKX0pKTt9O0V4dC5leHRlbmQoR2VvRXh0LmRh dGEuV01TQ2FwYWJpbGl0aWVzU3RvcmUsRXh0LmRhdGEuU3RvcmUpO0V4dC5uYW1l c3BhY2UoIkdlb0V4dCIpO0dlb0V4dC5MYXllck9wYWNpdHlTbGlkZXJUaXA9RXh0 LmV4dGVuZChHZW9FeHQuU2xpZGVyVGlwLHt0ZW1wbGF0ZTonPGRpdj57b3BhY2l0 eX0lPC9kaXY+Jyxjb21waWxlZFRlbXBsYXRlOm51bGwsaW5pdDpmdW5jdGlvbihz bGlkZXIpe3RoaXMuY29tcGlsZWRUZW1wbGF0ZT1uZXcgRXh0LlRlbXBsYXRlKHRo aXMudGVtcGxhdGUpO0dlb0V4dC5MYXllck9wYWNpdHlTbGlkZXJUaXAuc3VwZXJj bGFzcy5pbml0LmNhbGwodGhpcyxzbGlkZXIpO30sZ2V0VGV4dDpmdW5jdGlvbih0 aHVtYil7dmFyIGRhdGE9e29wYWNpdHk6dGh1bWIudmFsdWV9O3JldHVybiB0aGlz LmNvbXBpbGVkVGVtcGxhdGUuYXBwbHkoZGF0YSk7fX0pO0dlb0V4dC52ZXJzaW9u PScxLjAnOwo= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=override-ext-ajax.js Content-Type: application/javascript; charset=utf-8; name=override-ext-ajax.js Content-Location: http://www.icc.cat/vissir3/lib/geoext/lib/overrides/override-ext-ajax.js Content-Transfer-Encoding: Base64 LyoqCiAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEwIFRoZSBPcGVuIFNvdXJjZSBH ZW9zcGF0aWFsIEZvdW5kYXRpb24KICogCiAqIFB1Ymxpc2hlZCB1bmRlciB0aGUg QlNEIGxpY2Vuc2UuCiAqIFNlZSBodHRwOi8vc3ZuLmdlb2V4dC5vcmcvY29yZS90 cnVuay9nZW9leHQvbGljZW5zZS50eHQgZm9yIHRoZSBmdWxsIHRleHQKICogb2Yg dGhlIGxpY2Vuc2UuCiAqLwoKLyoqIGFwaTogb3ZlcnJpZGUgPSBFeHQuQWpheCAq LwooZnVuY3Rpb24oKSB7CgogICAgLyoqIHByaXZhdGU6IGZ1bmN0aW9uW2NyZWF0 ZUNvbXBsZXRlXQogICAgICogIGBgRnVuY3Rpb25gYAogICAgICovCiAgICB2YXIg Y3JlYXRlQ29tcGxldGUgPSBmdW5jdGlvbihmbiwgY2IpIHsKICAgICAgICByZXR1 cm4gZnVuY3Rpb24ocmVxdWVzdCkgewogICAgICAgICAgICBpZihjYiAmJiBjYltm bl0pIHsKICAgICAgICAgICAgICAgIGNiW2ZuXS5jYWxsKGNiLnNjb3BlIHx8IHdp bmRvdywgewogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVGV4dDogcmVxdWVz dC5yZXNwb25zZVRleHQsCiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VYTUw6 IHJlcXVlc3QucmVzcG9uc2VYTUwsCiAgICAgICAgICAgICAgICAgICAgYXJndW1l bnQ6IGNiLmFyZ3VtZW50CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAg fQogICAgICAgIH07CiAgICB9OwoKICAgIEV4dC5hcHBseShFeHQubGliLkFqYXgs IHsKICAgICAgICAvKiogcHJpdmF0ZTogbWV0aG9kW3JlcXVlc3RdCiAgICAgICAg ICovCiAgICAgICAgcmVxdWVzdDogZnVuY3Rpb24obWV0aG9kLCB1cmksIGNiLCBk YXRhLCBvcHRpb25zKSB7CiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8 IHt9OwogICAgICAgICAgICBtZXRob2QgPSBtZXRob2QgfHwgb3B0aW9ucy5tZXRo b2Q7CiAgICAgICAgICAgIHZhciBocyA9IG9wdGlvbnMuaGVhZGVyczsKICAgICAg ICAgICAgaWYob3B0aW9ucy54bWxEYXRhKSB7CiAgICAgICAgICAgICAgICBpZigh aHMgfHwgIWhzWyJDb250ZW50LVR5cGUiXSkgewogICAgICAgICAgICAgICAgICAg IGhzID0gaHMgfHwge307CiAgICAgICAgICAgICAgICAgICAgaHNbIkNvbnRlbnQt VHlwZSJdID0gInRleHQveG1sIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAg ICAgICAgIG1ldGhvZCA9IG1ldGhvZCB8fCAiUE9TVCI7CiAgICAgICAgICAgICAg ICBkYXRhID0gb3B0aW9ucy54bWxEYXRhOwogICAgICAgICAgICB9IGVsc2UgaWYo b3B0aW9ucy5qc29uRGF0YSkgewogICAgICAgICAgICAgICAgaWYoIWhzIHx8ICFo c1siQ29udGVudC1UeXBlIl0pIHsKICAgICAgICAgICAgICAgICAgICBocyA9IGhz IHx8IHt9OwogICAgICAgICAgICAgICAgICAgIGhzWyJDb250ZW50LVR5cGUiXSA9 ICJhcHBsaWNhdGlvbi9qc29uIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAg ICAgICAgIG1ldGhvZCA9IG1ldGhvZCB8fCAiUE9TVCI7CiAgICAgICAgICAgICAg ICBkYXRhID0gdHlwZW9mIG9wdGlvbnMuanNvbkRhdGEgPT0gIm9iamVjdCIgPwog ICAgICAgICAgICAgICAgICAgICAgIEV4dC5lbmNvZGUob3B0aW9ucy5qc29uRGF0 YSkgOiBvcHRpb25zLmpzb25EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAg IC8vIGlmIFBPU1QgbWV0aG9kLCBvcHRpb25zLmZvcm0gb3Igb3B0aW9ucy5wYXJh bXMgbWVhbnMKICAgICAgICAgICAgLy8gZm9ybS1lbmNvZGVkIGRhdGEsIHNvIGNo YW5nZSBjb250ZW50LXR5cGUKICAgICAgICAgICAgaWYgKChtZXRob2QgJiYgbWV0 aG9kLnRvTG93ZXJDYXNlKCkgPT0gInBvc3QiKSAmJgogICAgICAgICAgICAgICAo b3B0aW9ucy5mb3JtIHx8IG9wdGlvbnMucGFyYW1zKSAmJgogICAgICAgICAgICAg ICAoIWhzIHx8ICFoc1siQ29udGVudC1UeXBlIl0pKSB7CiAgICAgICAgICAgICAg ICBocyA9IGhzIHx8IHt9OwogICAgICAgICAgICAgICAgaHNbIkNvbnRlbnQtVHlw ZSJdID0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCI7CiAgICAg ICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIE9wZW5MYXllcnMuUmVxdWVzdC5p c3N1ZSh7CiAgICAgICAgICAgICAgICBzdWNjZXNzOiBjcmVhdGVDb21wbGV0ZSgi c3VjY2VzcyIsIGNiKSwKICAgICAgICAgICAgICAgIGZhaWx1cmU6IGNyZWF0ZUNv bXBsZXRlKCJmYWlsdXJlIiwgY2IpLAogICAgICAgICAgICAgICAgbWV0aG9kOiBt ZXRob2QsCiAgICAgICAgICAgICAgICBoZWFkZXJzOiBocywKICAgICAgICAgICAg ICAgIGRhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICB1cmw6IHVyaQogICAgICAg ICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICAvKiogcHJpdmF0ZTogbWV0aG9k W2lzQ2FsbEluUHJvZ3Jlc3NdCiAgICAgICAgICogIDpwYXJhbXMgcmVxdWVzdDog YGBPYmplY3RgYCBUaGUgWEhSIG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICBp c0NhbGxJblByb2dyZXNzOiBmdW5jdGlvbihyZXF1ZXN0KSB7CiAgICAgICAgICAg IC8vIGRvIG5vdCBwcmV2ZW50IG91ciBjYWxsZXIgZnJvbSBjYWxsaW5nIGFib3J0 KCkKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSwKCiAgICAgICAg LyoqIHByaXZhdGU6IG1ldGhvZFthYm9ydF0KICAgICAgICAgKiAgOnBhcmFtcyBy ZXF1ZXN0OiBgYE9iamVjdGBgIFRoZSBYSFIgb2JqZWN0LgogICAgICAgICAqLwog ICAgICAgIGFib3J0OiBmdW5jdGlvbihyZXF1ZXN0KSB7CiAgICAgICAgICAgIHJl cXVlc3QuYWJvcnQoKTsKICAgICAgICB9CiAgICB9KTsKfSkoKTsK ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=icc.jpg Content-Type: image/jpeg; name=icc.jpg Content-Location: http://www.icc.cat/vissir3/img/icc.jpg Content-Transfer-Encoding: Base64 /9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAUAAA/+4ADkFkb2Jl AGTAAAAAAf/bAIQAAgICAgICAgICAgMCAgIDBAMCAgMEBQQEBAQEBQYFBQUFBQUG BgcHCAcHBgkJCgoJCQwMDAwMDAwMDAwMDAwMDAEDAwMFBAUJBgYJDQsJCw0PDg4O Dg8PDAwMDAwPDwwMDAwMDA8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AA EQgAPACSAwERAAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkK CwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMB AgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PC NUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE1OT0ZXWFlaW1xdXl 9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZqbnJ 2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNh IgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZ JjZFGidkdFU38qOzwygp0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2 R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6 ytrq+v/aAAwDAQACEQMRAD8A9g3V1dfWrofWZf76T/djfzH3z4xzZsgyS9R5nqe9 9lhCPCNgofWbr/lqm/5GN/XKvHyfzj8yy4Y9yJs7m6+t23+ky/3q/tt4/PE58n84 /MrwR7mdevP/AL/kP+zP9ch42T+cfmV4I9wa9ef/AH/J/wAGf64+Nk/nH5leCPcH pn5Ryyv51s1eV3X6rc/CzEj7Pgc7/wD4GWScu24AyJ9E+vkHQe0sYjRHbqPvfWmf S75u7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq/L25/3quf+M0n/ABI58WZ/7yXvP3vs 8fpCjlLJEWn+9dr/AMZV/XhQzvIpbxV6Z+UP/Kb2n/MLc/8AERnoH/Aw/wCNyH9S f3Og9pv8SPvH3vrjPpp81dirsVdirsVdirsVdirsVdirsVdirsVfmLc2d39auT9W koZZKfCf5jnxZn/vJe8/e+zw+kKX1S6/5ZpP+BOUpRNlY3j3toiWsru0yBVCEkkn oMsxY5ZZiEAZSkaAG5JPQIlIRBlI0BzL0b9B61/1abv/AJEt/TNt/oZ7V/5Rcv8A pJfqcT+UtL/qsPmHfoPWv+rTd/8AIlv6Y/6Ge1f+UXL/AKSX6l/lLS/6rD5h6P8A lTpepWvnK0mudPuLeFba4DSyRsqglRQVIzuP+B12Jr9L2zDJmwZIR4J7yiQNxtuQ 6P2h1uDLozGE4k2NgQUr/wCcvv8AnJ69/wCcYPL35f65ZeT4fODedvMqaBJbzXbW Yt1eF5fWDLHLyI4UpQfPPod4AC0l/wCcmf8AnMCH8kvMnlH8rPIPkO8/Nv8AO7z3 EJ9B8jWEvpJBbsWCzXUoV2AYo3FQPsqzMyqKlUB5n5B/5za/MfRPza8pfk7/AM5T fkc35L61+Ysot/InmS0v1vtNurl2CR28jgutXdlTkkjcWKhlAauKeHuZN+eX/OZ3 mDyv+bH/ACoD/nH/APKi4/O383bS2W78x2q3ItNN0qN1VwlxNTdgrqXJZFTkqliz cQoAX/kJ/wA5leYvOX5tXP8Azj5+fX5Uzfkv+cRs31DQdP8ArQu7DVII0aRxbyU+ 1wRnUqzqwVviDLTFSH31ih2KuxV2KuxV2KuxV2KvgCf+/n/4yP8ArOfFOb+8l7z9 77ND6R7lLK2aa6F/x2tJ/wCYuH/iQzeezH/Gtpf+Gw/3QcLtL/Fcv9Q/c+kM+wbf ItmsVT/y3/x0v+eTfwyMlD82/wDn7N/ygP5C/wDmxof+oSXAziker6xpX5a/8/Wv 8Q/mPdRaPofn7yLBZfl9rmoMIrVLh7O3tgizPRVLS208fUfFIB+1ivR9d/nz/wA5 E/k95H/Mz8mfyy1zyXB+bHn/AM9azHB5Z0yxhsL640VpZYUS+l+stWBWY8gU+Kkb N0WuKKfIf/OKutaR+XX/ADnz/wA5h+UfzCvoNG84eetSOoeSrnUWWH65YveTXiQ2 7yEci8FxCyqD8QjNPsYpO4fXut/85DflBc/85U+TPyO07yPF57/M+XTJrufz3YQW Fynl2GOOeV4Z7pz68R4CpWPp6ig7tih9i4odirsVdirsVdirsVdir4An/wB6J/aR /wDiRz4pzf3kvefvfZ4fSPcpZWyTTQv+O1pP/MXF/wASGbz2Y/41tL/w2H+6Dhdp f4rl/qH7n0h3OfYL5C6mKaT/AMtf8dL/AJ5P/DIlQ8z/AD5/LX8lvzi1T8ufy9/N zTLrVbo3WoeY/J0ME9xaxpNpEUS3Eks0DoAFS6Wgc0P0YGQRn50/kz+RH/OQPlU6 b+ammaVr+k+XppFtdeW8W3uNLn+FZBHexOrRE7BkZuJ25KaDFQaeI/lH/wA42/8A OJ3/ADjZ5yv77yHolzrf5l2Wix6vb3N5cy6zqkOmXspthJZBiI1DkEEoOfDvxO6p Ns3/ADW/ID/nGj/nLSS6l83aXb695g8m38+gSeZNKuZLHVLWe1+OW0M0ZBkVeXIB gyjcr3xWyF/5CfkL/wA41f8AOO/mbU/J/wCVmnQW35gatpC6lquoX1zJf6rPpnrm JR9YkqFj9VDVI+NSOTA0BxUkl6p5o/O3yr5X1bW9JOk+YfMTeU4Y5/Od9oOmTX9t o8csYnX628dDz9EiUxxB5AhDFQGWqh6PZ+YtB1D9Giy1izuX1i0S/wBKhSdPUuLW RQ6zRx15MhUg1AxVLbjzz5StfMej+UZdesx5j1+G5n0nSlkDSSpZrE0x+GoWizoQ DQkHatDiqdQazpN1FeT22qWdxBpzOmoTxTxukDRirrKysQhUbkNSmKtLrWjvapfJ qtm9jIoaO8W4jMTKaUIcNxINR374qwnVfzW8oaFonn/X9ZupdNsfy1eZfMqyKrS8 Y4VnR4Ejd/UEquAg2JaqkBgRiqd6R500nU9Km1i8Sfy3aW80dvKda9O0pJJDFMoD eo0bCkoWqsQWBArTFWU+vF/vxfsep9ofZ/m+Xvir5Om/KXzu80rrY2xV3ZlP1lOh NRnzPk/4GfbkpyIxw3J/jD6TD2k0QAHEfkVP/lUfnn/lhtv+kmPIf8mx7d/1OH+n DL/RLov5x/0pR+l/lV50tdT0+5nsrdYbe4jklIuEJCqwJoBmz7E/4HfbOl1+DNkh HhhkjI+scgbO3Vxdb7Q6PLgnCMjZiQNj1D2b/Duq/wC+k/5GDPom3z1v/Duq/wC+ o/8AkYMbSm2i6RfWV6J7hFWP02WoYHc0wK8S/wCchfyx83fmHLat5YtLe6WLyH58 0GT17hYP9N16ytILFBy/ZZ4WDN+z3xW2BedPyDvF1jXJvLnkSE+WXTyZdabpmgXO m2Nwmo6KNYjurtbTUIZLC6ZI7qBSl2OMi7hg8aYrbBpv+cffzGuNJlZ/Ifl221/V /wAv08ufXdONlZfUZ7PzFJqEEMipsplspED/AFdjEsisqgR8MU2zzTfyp86eSfPU 3m3Qfy5s7+3038y9e8xi30u60+0n1PTdf0iS0jmX1WhUPazNR0lYEhi0ZboVUV+S X5OebfJHnTyf5o8z+TdJhvW8l6lo+t6xaXFtPNp99Lrt1qMcfqFUllSSC4CB06Uo wApirNF0z81/y617804PJvki287WP5h6w/mPyzrsmp29mmnX91ZW1nNBqkU5ErQx vbCRHt1kYofT4AqCVDyjWPyo/Nu9/MvQPMl55VsdRutB85+XdWuvN2lHSbKG/wBN stPis7uVjPz1ETCRpf8AR1kjgEQHHm5IZShLD/nGbWdE8r/k/ZaD5R0bRvN2l+Sv M/l/zX5ttmtxeabrOt2EEdrqn1gr6s/oyxOtUYuoYcBxrRW0k8z/AJX6zpekR+ab n8u9C/Kbyl5S0by7p3m3yhLf2zWHmqSx1m0uWiu5LJJo0t0SN0jnulDMZT66pEHO K2qfld+W8H5heerjzraeRPL9t5G0j8w9c1e20iGaG70tZn8taVZW00Xor9XuCt5A 5cwho0lBKszLyxW0iP8Azj1+Z+t6b5qs9V/LvTrKXzJ+W+reX9QszLoqaa2vy6ja 38EkEdsGnkhLJKY57uSScMauEJJZW3rN/wDk55m0nzhd+Yn/AC303z/5Pg81a/eW H5eCexij9DUtH0eysL+OC8KWtbc2M8BRyGSOUsgP2SoT7/lUnmL/AMtT5M/8lr/h 7/jt6r/ff9WD7P8AvH/xd1/yMU2+tsUOxV2KuxV2KuxV4x5685eb4fPvlf8AL3yd NomkXuraJqnmK+1zX4ZriBoNMmtYPqlvDBPbku7XQZ3L/u0FeLFhRV8i+QP+civz NtPIPlVNP0STzbJ5W8paDrXmnUJ4Jb8as+sS3DOqarJeW6WqJHERHNLHKHfYhQpq sqfTf5pTPrX5m/lP+Xer6zfaH5M81WevX+oJYXk2nS6rqWmrafU9Ma6t3jmVTFPP cFI3Uv6W9VVgVi861fz7N+XUGreS/wAsPOsnnG/07V9Ykl03W7a+8wXmlwabY2lz Pp9tN61sJoYJbqP1Jrm7/c+p6VXYBVVY/on52fmHdX/mbzfca5otppXmDyH+XGpe T/J89neXQtdX82PcKY4RayNLcu7BgEVV9QiIF4wruVNMfm/P/wA+JeXHmjUIo4tT 8haX5802+0N1lsrK+m0nU/LkUF1dWK3Vz6UiRXrjj6zlDy+IcioVp7N5p/OPzoPz Qu/yy8pw6BDP/iXR9Aj1jUUnuPq0eoeX9T1maWSCGWLnIjWSKiclBViScVY5af8A OQvnWLS7SHU9D0e48xeZoNQ0XyM1t60dtf8AmjSPMM2g3cDI8jMsTK0F2qhuSxia rHhyxWk68p/nZ5n1781dA8q3EWmat5J85yeZrbRtVsrC6t41Pl6RY6xXl1N/pnP4 ll4WyRo2ySSAVZV9VRxRwokUMaxRRjjHGihQoHYAbAYoVMVdirsVdirsVdirsVdi rsVeW/mj/wAqf+o6N/yt3/Dn1H64f0D/AIg9Cn1ngefoerv9ivOm3H7Xw4qxC/8A +hZfX/L76/8A4C9T6rB/yriv1Hh9T9b/AEb6nT4fR9b+6p8HqfY+LFL0D8zP+VZf 4Yf/AJWx+gv8K/WYuP8AiD0fq/1vf0fS9b/dvXjw+LrTFDzy/wD+hYf8MeR/0h/g H/CX1m4/wH6n1H6n63/H39X/AGev9/Xav97viqnef9Cv/oO3+vf4D/Qn+Grb6n6n 1Lj/AIf+tj6p6X7X1f6zT0OO3P8Au98U7ozQP+ha/qGuf4d/wJ+i/qWof4h+q/Uf q/1T6vafpL6xT4OHo/VvrHL/ACPU3piqP8if9C/cdN/5V7/g/n+kIv0f+ivqvr/p H6ncel9n956/1T1qcvj9Pl+zXFWKaz/gj/la/wCT1fq3+Fv0jr/+Bf0d9R/R/wDj P0r7696vH9/6/wBW+ufZ+H1OfP4+OKp55e/6Fv8A8dL/AIZ/wV/ysP8AS996H1D6 p+kv0j6M31/0vT+Plw9T1uG1eXP4sUPfMVdirsVdir//2Q== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=loader.gif Content-Type: image/gif; name=loader.gif Content-Location: http://www.icc.cat/vissir3/img/loader.gif Content-Transfer-Encoding: Base64 R0lGODlhHgAeAPcvAP39/fr6+vv7+/z8/Ojo6PLy8vj4+PX19fb29uHh4fPz8/T0 9Pf399PT09ra2uvr6+7u7vDw8NjY2Orq6tnZ2ePj49LS0uDg4Ofn5+Tk5Ozs7O3t 7e/v79zc3NXV1eXl5dfX1+bm5t7e3t3d3d/f39bW1tHR0dDQ0M/Pz9TU1Nvb2+Li 4unp6fHx8fn5+f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAvACwAAAAAHgAe AAAI/wBfCBxIsKDBgwgPAjiwAEDChwIBOBQ4oEULAQMlToT4AoALARMrtggQsQAB BhwpunAxUYBFki8CECCgIGXHACsduhzZUQMLFhs5enQx4MVOkgxmHniocSIAATlF gmRB4IHTBQeCDmXpcCjIFhEGLJhJEgADDAkuwIwIdSVIozldGACggUCEpw9WJEiQ IWjHAStXDgAwmOAABQBa7E2wgoPfjG2JImRwYcUKDWsTAsD5mOIHAgYQNh3N1IAB BKhRtwzMuvNABg4cqJitwkGGpThZC36ogALt2Q5ItPg7oPhgiUwXtODAIYLzAJ0J v1V44UNm0YB3H2xhooGHB0UVbm4ODB15RokXLDRoIOFuwaetCX9syjmxg/UWSGgN XNjrUPgs9eRBAyeglNEA0wEoUU5DFRZTCAS4FpFbHeX0QnYSGjRegP9V6AJ0NmUX XocehscRYCB66BRUJkKkUUYWRmSeTQSNlyGNHRF2o0ABAQAh+QQJCgAvACwAAAAA HgAeAAAI/wBfCBxIsKDBgwgPAhgQAEDChwIBOIzowsXEFxIvQgTgQsBEjhYjMojg AuLAARU/phQoIEIEBiYjBlgJ0iGABS1aaNxYUQDGlQFcGngoccBHASlrAsip4KMB BhpBWrTZs+bICD4BBNhAAEMAggCQVn0hNiOAAxEOSIxAoO2DnQsrVjRqFKzFAyza sliwc2BYuQMQGiDAgkWLwBuR9o2oAYJPhWbNEhUQYKZciWTlal480ECCzytWfMaA 4IVlzS4QI2TwufXnDwowLhxAOyNRAwgO6NaN2eBCjwgBfGDxdSPKuQgRgHCgQoPq ghJPN+wd8fAEB9hHRIB7eirK6RIvnGHIAIDBCuwUKkQFTNVFw5QfLFgoDaDACAcS YPqtHbFszQEpNKDCRxBswBlFHf0U0gbycRCTTDTRBEIDHhwIHXIKTqSAfBM8yFFD CH5EwgkdxmRbiH4hYOFkIT240UIrChQQACH5BAkKAC8ALAAAAAAeAB4AAAj/AF8I HEiwoMGDCA8CGBAAQMKHLwBIHAjAhQuHAiVihBjRhQCMFS9mHOBiAEeBJEV2VBnS 5EkAASw6DDlTgMyTGS2apPki5UaEC0H6pBmyYcYARilabDjT4keZPiMOWNAiwk8A Npc6zCpxwEKPEg+0GFvgp1SLOoMSDOpi7FgDZilmLYlQQISxB+IaxKpyb4EFLvdq HKyX4sIBiAd83Iq2cWGBAQiwmDyZAAQXL+Y2DnzQBQHJn1kQ0MBAauLBD2EaYMCa 9cS9DAsDeADhMcWUdA8iIJFgRQvZMNEyvZpXQ4LjHxCY5YvWIUmvBxYA+CDhAQAD H44nIHAVrdeVDC1YbGAwwQEFzAAWVEhwIcBaxRu5GmjQALADBxlAQuBgu+WLA/RF 8EIEFFCwAE4RxWQUAvS1ENEIDoxgG0EpuQRgAwoIpECBAr7kQlIMNuBgRBVIwAFO Gg2EgAUNFECRAhMmBIAKIHCGoEII/HZSQAAh+QQJCgAvACwAAAAAHgAeAAAI/wBf CBxIsKDBgwgPAhgQAEDChwIBOIzowsXEFxIvQgTgQsBEjhYHCggJUeCAih9RUuxY MmIAlSAdAnhJsiXIARhhVsSZUOKAjyMtxpypEmNGgiCF5uwY8yRJojUxBmX6IqjP hSwBTI2K0WlFjz+R/vTqIqzCqRqRVqS6cWTagTM9IsxIV+JDnwPy5rW7de1bggJa CB7cQkGAFzTX7nwoIAJhwQVcGNX7025PAQICaNZsueBCuQo5tOB51+vfFy4wEGCh 4LTExB4jHIZ7AIACArhZMEgLFSUADSdAADjQAsADEhtmblhNILnanQ4FNGgwIoAK Cgw4JEggGQCDBwQwzGyOOAA0gAoNLBgA4MBBgfMJQnxcUPshAgsNKrwY4EAFhxcL XJDAAi1FpMJ0h/HnH0YZJFDBaQZFYIEFLJjUXwQCGSAghi0VYIIEEynIIQATXMBh SQAYIIBIFDhwYooQbpQBCaQV2NMBHMQ4UEAAIfkECQoALwAsAAAAAB4AHgAACP8A XwgcSLCgwYMIDwIYEABAwocCATiM6MLFxBcSL0IE4KIhRYsDBbgYAHEgx5EfJ54U UDJigIoOT8Z8CbIlxookZd5EmTCjygEwZQKgqTIjwZMWY1YUIBNozaEwjzp1wfSF yKQDFlKVOLWmya5ZJUrVWnGkxqNXeRpE6nGjyLMmA7Rd69Pnw7p1rZbdC/foXr4v aP4l2fNv2Zh4xfZMrLjgAAIqXCAEcOBA34IANpRocOIDwgERWrQwcBnAAgcWGlgY IeBAgKOkGYgO7TVihtQWQCgAoEBCB44LALTAEGHhgtARdhMcYMFCigcxVThIIGAF CQMLCBCQvLBACw4sTbZhCPFa4AMKFEgnSBB8AgHoKR8GcOAAg8T1Cl4Y0H7AJsYK 9LE0AH4YaUAAC5cZhAB6Ggg0YAL5BaZdATYx4NtED0YIQAQYRFgSAAIQ9sIAF1zg IYgJbjTBByL6N5kLypUUEAAh+QQJCgAvACwAAAAAHgAeAAAI/wBfCBxIsKDBgwgP AhgQAEDChwIBOIzowsXEFxIvQgTgQsBEjhYHCnAxAOJAkB8rpuxoMmIAlRhhAngZ smVMkjcdgiyZUOKAjyMtopwJE2NGgiAb6qzoUeWAogCCaoxasaNDqQsXWtVaVSPG p1V//kQqtipJryeD4lRY1aNJrWgpNkQ4M4DdAALm9szId+IHCw0CBzYR4SFIsy7m ijBhoXHjEywMIw6LUYFlywsOxD3pc4DnowYBcPgggO7ntwpEOJDwgG7XzS8QrHBA O8EAAzwjelQrtCCAB7QdjGgB4MCFDFQBIIjAQCJNqwQFUHCg4kFJACsSYBjAAoMA AxEiXF8/PLUFCxcDOSS4YJEAAYstWiz4+BP2CwEJEjyQ6N7ACxfhoWcTACzkVxoA /WFUQHz2EcTABRdwEFGC94XnX0sMkFDBRxQCsABzA671wgAUYuSWTb5tsB+KG7kw X0sBAQAh+QQJCgAvACwAAAAAHgAeAAAI/wBfCBxIsKDBgwgPAhgQAEDChwIBOIzo wsXEFxIvQgTgQsBEjhYHCggJkSJJkB8rCigZMUBFhygxuiTJEuTKmCAHPASAQINO jANeogQw82NGggAaWJAQAaZKlEFPFkUqwkKDBiMOvIgqccDCjl0rviwIYIMHqw0q HB248KtYiQgDYEjRwAQBhCDBlmSQoAQCvAEa4jWAoDACAwZ+4s3IGO4DByoiR6YQ YafYy4I/UJA8WYPly2J1AmjBIQIHDi0UaDSYcYBrr3BZR2ChmKwAjyUBHMiQ4AIE vKFXEzSAIYFxDAw1Zhz5djUADsYTZFBNfMJCjyNhz3ThFanxFRxEs1ggoGF0BNdj Jb5FqmBDgIEKCBBo2KJFw6cRYT8cIJ+DxPrvccVSRBzIJxqAGK3HUgDyFRARggly N6ALBLDwEYQAZDdghheNZh9bsQ2I1AIFCCeibQaYaFBAACH5BAkKAC8ALAAAAAAe AB4AAAj/AF8IHEiwoMGDCA8CGCAAQMKHAhsOBODChUOBADJCHOjCgoOLFC0OFCBy 4wsFJiw8wFgRZEUBJl8AUNGgAcyQDgEEaBnzBQMLFjLI5BlywEOKLYzKrADUAE6d PGVmvIjRAQURBRwKqCkC54CoAEiWxPiBggMHFRC80HCiQcYBC10EeFsx6sQWHcw6 YDHgwQGCCzPWdSHxYN+zElYqrFv4oQAMKtQqDNC44NsBmBlSVTi1s8YIFxKIHq3g 6OC6c188CD06AQkOpk9XNAqAgW0GCBg4PXoZ81SFCDgoNRi2MkIABh4QwFDgeF24 xwdAIEBdQ2DAGcW23CxTAXUCExDoX4yQdSpJuFBfbgZAnUVWmS1aKMApNmfIsTIZ FIApkEGECHBtpx5G6B0V3wIZ7eTQV/hBBMACLUSQE1F1cZeQAP8xMGFJRcWEYQsu cXheTL+xNFaJPU1EkoUpYgfdRgEBACH5BAkKAC8ALAAAAAAeAB4AAAj/AF8IHEiw oMGDCA8CYJEAQMKHAgE4FBjAggkFAyVCJOhCRYaJARpYwChQgIsBGwUWoECBZMiR EV24EJDyBYARDjo4fIkRQACZE1MeYLnhxcsCNmXSTAhAAIKJAD44UDFAgMgFTYFG lBjUZoILIQzsZEmg4okDALTaNOmiK4AQFxIkeBDgxQQJKgBsCJE1gMQBMtVmbLFC boIIAB4cIAhggMTAbbsSHLBB7gWSBtMqlXwwAIsVBhCmFcB564DTjh0/5Mpa4wsF BFjIlk3AxWrIgUm/0ECgt28MC27jlokSAAMEDJIzaLu6NWuFLtCKPl26YFMFLSIw EB3Y9cEBCyJkYlfAlbFEtkAlAzDQInsLv6NZm3Ssmbhb8S2e2vxJGihbh48JZpMB +pWU3oEzQUWdcDRp5hBgzNWUFXMOJuWCXxIqFVOEmqGUEmAYWgjVTx5uVN6GQZ1Y E2M/VbdiRo25SFBAACH5BAkKAC8ALAAAAAAeAB4AAAj/AF8IHEiwoMGDCA8C0JAB QMKHAgE4FCiAgoMWAwEImAjxhYsELCYOcKAiwkAMJkx2fKHgwoUDAkeWFOjCgoUM K18AyJBghUOZHHSOaNAgQM4XCBIkMAn0xQKbBB5qRDARAIueAGS2ACChQYmqEjnq ZEFAgwuHAZRqCOCAwgENNlVqdHGWIIANBFiwiCDgBYQLPjlMANDBhAqJA+jSFatz Adm8CwBwMEDQRYgAABS72IhwQAu9GGAqVMwZYgAIE/qOLm0Q8YDXWRkXDEtbokAG EVro3m00YWbNdDkr2L07AmXfwBUP0BmguXPWCmvTjo4ZYdYBslv/drF89OLsEQMo W8ZsO6NEAZrLZ0SvGPFm2uixAxAfXOx27DrpYl7M3qHE9nYNwFp/v/33XkSwSRVc fnUlVldOc9VVIIPVrfRbdxMy2F1HiVWY4XzcQahehjqpd1R4D55oXWwrBQQAIfkE CQoALwAsAAAAAB4AHgAACP8AXwgcSLCgwYMIDwKAwAJAwocCATgUKODCBQYDAQyY CPGFAAIQJgpIkACjQA0UWnQUyIAAAZMjSwp0QYECi5UvADxg0dAjSYwAKjhwIADn CxcuFfiUeaDmhocSA0wEwMGlRpIGAIhwMGKqghYcc7aIoGDjiwEuIwxIcMEFh5oL cjIYYcGEyYgKIrRoccBhAQwTAOQFkEHCCo0fGjSw4KEoQQAu9u7NqiAAQQEaBHBI YUHxB8cGATDYG8EFwgMmFpO4m3DAghYDEA6QQGFB2IwSc+eGulG3RIouggt3cbsg gADDg0t9gTy5i9gJITt/nlNi793RrW+8rvB48YgCzEJs1CgcemjhvxEeFy41fUSJ Aoa7By9fogsBuuP3bn4/rPTnDq2HX3AAxEdcdeg9NgB+AxloH3HSMZhTb1AFV5R0 Dg1AoFEFbohhTsp9p1Bw0H0IInUrQbbciVMhZ9547plYnYgdrUejUe+JB1FAACH5 BAUKAC8ALAAAAAAeAB4AAAj/AF8IHEiwoMGDCA8CUBABQMKHAgE4FBiAAAEXAwEM gEhQQAQEE12wuBiRwwUEHAUaiBBBgECRJF+4uJCAQ8oXAFrodAjTAM4QCVZMTOmC JUaYGA8kSFDgoUSJEQ/sFDDSBYAMCT5MBLDgwFCcLlwEgDqAJQMBFgNESHCBgcoM DigEIAggQFgXAhwiiNACwIEFADCQmKCRhYPDIzbSHXDXxQAADBRThDCghYrDDiZI LghAwN3NBBGAOJzBJ8TOVhEK6JAApcKnsL8aBCA2gF2xEz03Diu7IIMGwINbSHBA 5u6woAu2OGGheXMTICDgjP3UKUMO2LHnfb1dYd7esxkjZUdIGzf4iLfNf32qm7ds 1HclMv4u0e7j8sjXf3ZYfixv3fzht94A3b0AYHkShdVdZ1AlVJ5LCL4g3nkK3cYf b2DhdpN4ikUo4XgpMTZWRBjiZN9N1ZGYWkQN3kSXXRS6yOJjKQUEADs= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=proj4js.js Content-Type: application/javascript; charset=utf-8; name=proj4js.js Content-Location: http://www.icc.cat/vissir3/lib/proj4js/proj4js.js Content-Transfer-Encoding: Base64 LyoNCkF1dGhvcjogICAgICAgTWlrZSBBZGFpciBtYWRhaXJBVGRtc29sdXRpb25z LmNhDQogICAgICAgICAgICAgIFJpY2hhcmQgR3JlZW53b29kIHJpY2hAZ3JlZW53 b29kbWFwLmNvbQ0KTGljZW5zZTogICAgICBMR1BMIGFzIHBlcjogaHR0cDovL3d3 dy5nbnUub3JnL2NvcHlsZWZ0L2xlc3Nlci5odG1sDQoNCiRJZDogcHJvajRqcy5q cyx2IDEuMSAyMDExLzA3LzI3IDA3OjU5OjU0IGF2aWRhbCBFeHAgJA0KKi8NCg0K LyoqDQogKiBOYW1lc3BhY2U6IFByb2o0anMNCiAqDQogKiBQcm9qNGpzIGlzIGEg SmF2YVNjcmlwdCBsaWJyYXJ5IHRvIHRyYW5zZm9ybSBwb2ludCBjb29yZGluYXRl cyBmcm9tIG9uZSANCiAqIGNvb3JkaW5hdGUgc3lzdGVtIHRvIGFub3RoZXIsIGlu Y2x1ZGluZyBkYXR1bSB0cmFuc2Zvcm1hdGlvbnMuDQogKg0KICogVGhpcyBsaWJy YXJ5IGlzIGEgcG9ydCBvZiBib3RoIHRoZSBQcm9qLjQgYW5kIEdDVENQIEMgbGli cmFyaWVzIHRvIEphdmFTY3JpcHQuIA0KICogRW5hYmxpbmcgdGhlc2UgdHJhbnNm b3JtYXRpb25zIGluIHRoZSBicm93c2VyIGFsbG93cyBnZW9ncmFwaGljIGRhdGEg c3RvcmVkIA0KICogaW4gZGlmZmVyZW50IHByb2plY3Rpb25zIHRvIGJlIGNvbWJp bmVkIGluIGJyb3dzZXItYmFzZWQgd2ViIG1hcHBpbmcgDQogKiBhcHBsaWNhdGlv bnMuDQogKiANCiAqIFByb2o0anMgbXVzdCBoYXZlIGFjY2VzcyB0byBjb29yZGlu YXRlIHN5c3RlbSBpbml0aWFsaXphdGlvbiBzdHJpbmdzICh3aGljaA0KICogYXJl IHRoZSBzYW1lIGFzIGZvciBQUk9KLjQgY29tbWFuZCBsaW5lKS4gIFRoZXMgY2Fu IGJlIGluY2x1ZGVkIGluIHlvdXIgDQogKiBhcHBsaWNhdGlvbiB1c2luZyBhIDxz Y3JpcHQ+IHRhZyBvciBQcm9qNGpzIGNhbiBsb2FkIENTIGluaXRpYWxpemF0aW9u IA0KICogc3RyaW5ncyBmcm9tIGEgbG9jYWwgZGlyZWN0b3J5IG9yIGEgd2ViIHNl cnZpY2Ugc3VjaCBhcyBzcGF0aWFscmVmZXJlbmNlLm9yZy4NCiAqDQogKiBTaW1p bGFybHksIFByb2o0anMgbXVzdCBoYXZlIGFjY2VzcyB0byBwcm9qZWN0aW9uIHRy YW5zZm9ybSBjb2RlLiAgVGhlc2UgY2FuDQogKiBiZSBpbmNsdWRlZCBpbmRpdmlk dWFsbHkgdXNpbmcgYSA8c2NyaXB0PiB0YWcgaW4geW91ciBwYWdlLCBidWlsdCBp bnRvIGEgDQogKiBjdXN0b20gYnVpbGQgb2YgUHJvajRqcyBvciBsb2FkZWQgZHlu YW1pY2FsbHkgYXQgcnVuLXRpbWUuICBVc2luZyB0aGUNCiAqIC1jb21iaW5lZCBh bmQgLWNvbXByZXNzZWQgdmVyc2lvbnMgb2YgUHJvajRqcyBpbmNsdWRlcyBhbGwg cHJvamVjdGlvbiBjbGFzcw0KICogY29kZSBieSBkZWZhdWx0Lg0KICoNCiAqIE5v dGUgdGhhdCBkeW5hbWljIGxvYWRpbmcgb2YgZGVmcyBhbmQgY29kZSBoYXBwZW5z IGFzY3luY2hyb3VzbHksIGNoZWNrIHRoZQ0KICogUHJvai5yZWFkeVRvVXNlIGZs YWcgYmVmb3JlIHVzaW5nIHRoZSBQcm9qIG9iamVjdC4gIElmIHRoZSBkZWZzIGFu ZCBjb2RlDQogKiByZXF1aXJlZCBieSB5b3VyIGFwcGxpY2F0aW9uIGFyZSBsb2Fk ZWQgdGhyb3VnaCBzY3JpcHQgdGFncywgZHluYW1pYyBsb2FkaW5nDQogKiBpcyBu b3QgcmVxdWlyZWQgYW5kIHRoZSBQcm9qIG9iamVjdCB3aWxsIGJlIHJlYWR5VG9V c2Ugb24gcmV0dXJuIGZyb20gdGhlIA0KICogY29uc3RydWN0b3IuDQogKiANCiAq IEFsbCBjb29yZGluYXRlcyBhcmUgaGFuZGxlZCBhcyBwb2ludHMgd2hpY2ggaGF2 ZSBhIC54IGFuZCBhIC55IHByb3BlcnR5DQogKiB3aGljaCB3aWxsIGJlIG1vZGlm aWVkIGluIHBsYWNlLg0KICoNCiAqIE92ZXJyaWRlIFByb2o0anMucmVwb3J0RXJy b3IgZm9yIG91dHB1dCBvZiBhbGVydHMgYW5kIHdhcm5pbmdzLg0KICoNCiAqIFNl ZSBodHRwOi8vdHJhYy5vc2dlby5vcmcvcHJvajRqcy93aWtpL1VzZXJHdWlkZSBm b3IgZnVsbCBkZXRhaWxzLg0KKi8NCg0KLyoqDQogKiBHbG9iYWwgbmFtZXNwYWNl IG9iamVjdCBmb3IgUHJvajRqcyBsaWJyYXJ5DQogKi8NClByb2o0anMgPSB7DQoN CiAgICAvKioNCiAgICAgKiBQcm9wZXJ0eTogZGVmYXVsdERhdHVtDQogICAgICog VGhlIGRhdHVtIHRvIHVzZSB3aGVuIG5vIG90aGVycyBhIHNwZWNpZmllZA0KICAg ICAqLw0KICAgIGRlZmF1bHREYXR1bTogJ1dHUzg0JywgICAgICAgICAgICAgICAg ICAvL2RlZmF1bHQgZGF0dW0NCg0KICAgIC8qKiANCiAgICAqIE1ldGhvZDogdHJh bnNmb3JtKHNvdXJjZSwgZGVzdCwgcG9pbnQpDQogICAgKiBUcmFuc2Zvcm0gYSBw b2ludCBjb29yZGluYXRlIGZyb20gb25lIG1hcCBwcm9qZWN0aW9uIHRvIGFub3Ro ZXIuICBUaGlzIGlzDQogICAgKiByZWFsbHkgdGhlIG9ubHkgcHVibGljIG1ldGhv ZCB5b3Ugc2hvdWxkIG5lZWQgdG8gdXNlLg0KICAgICoNCiAgICAqIFBhcmFtZXRl cnM6DQogICAgKiBzb3VyY2UgLSB7UHJvajRqcy5Qcm9qfSBzb3VyY2UgbWFwIHBy b2plY3Rpb24gZm9yIHRoZSB0cmFuc2Zvcm1hdGlvbg0KICAgICogZGVzdCAtIHtQ cm9qNGpzLlByb2p9IGRlc3RpbmF0aW9uIG1hcCBwcm9qZWN0aW9uIGZvciB0aGUg dHJhbnNmb3JtYXRpb24NCiAgICAqIHBvaW50IC0ge09iamVjdH0gcG9pbnQgdG8g dHJhbnNmb3JtLCBtYXkgYmUgZ2VvZGV0aWMgKGxvbmcsIGxhdCkgb3INCiAgICAq ICAgICBwcm9qZWN0ZWQgQ2FydGVzaWFuICh4LHkpLCBidXQgc2hvdWxkIGFsd2F5 cyBoYXZlIHgseSBwcm9wZXJ0aWVzLg0KICAgICovDQogICAgdHJhbnNmb3JtOiBm dW5jdGlvbihzb3VyY2UsIGRlc3QsIHBvaW50KSB7DQogICAgICAgIGlmICghc291 cmNlLnJlYWR5VG9Vc2UgfHwgIWRlc3QucmVhZHlUb1VzZSkgew0KICAgICAgICAg ICAgdGhpcy5yZXBvcnRFcnJvcigiUHJvajRqcyBpbml0aWFsaXphdGlvbiBmb3Ig Iitzb3VyY2Uuc3JzQ29kZSsiIG5vdCB5ZXQgY29tcGxldGUiKTsNCiAgICAgICAg ICAgIHJldHVybiBwb2ludDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAg Ly8gV29ya2Fyb3VuZCBmb3IgU3BoZXJpY2FsIE1lcmNhdG9yDQogICAgICAgIGlm ICgoc291cmNlLnNyc1Byb2pOdW1iZXIgPT0iOTAwOTEzIiAmJiBkZXN0LmRhdHVt Q29kZSAhPSAiV0dTODQiKSB8fA0KICAgICAgICAgICAgKGRlc3Quc3JzUHJvak51 bWJlciA9PSAiOTAwOTEzIiAmJiBzb3VyY2UuZGF0dW1Db2RlICE9ICJXR1M4NCIp KSB7DQogICAgICAgICAgICB2YXIgd2dzODQgPSBQcm9qNGpzLldHUzg0Ow0KICAg ICAgICAgICAgdGhpcy50cmFuc2Zvcm0oc291cmNlLCB3Z3M4NCwgcG9pbnQpOw0K ICAgICAgICAgICAgc291cmNlID0gd2dzODQ7DQogICAgICAgIH0NCg0KICAgICAg ICAvLyBUcmFuc2Zvcm0gc291cmNlIHBvaW50cyB0byBsb25nL2xhdCwgaWYgdGhl eSBhcmVuJ3QgYWxyZWFkeS4NCiAgICAgICAgaWYgKCBzb3VyY2UucHJvak5hbWU9 PSJsb25nbGF0Iikgew0KICAgICAgICAgICAgcG9pbnQueCAqPSBQcm9qNGpzLmNv bW1vbi5EMlI7ICAvLyBjb252ZXJ0IGRlZ3JlZXMgdG8gcmFkaWFucw0KICAgICAg ICAgICAgcG9pbnQueSAqPSBQcm9qNGpzLmNvbW1vbi5EMlI7DQogICAgICAgIH0g ZWxzZSB7DQogICAgICAgICAgICBpZiAoc291cmNlLnRvX21ldGVyKSB7DQogICAg ICAgICAgICAgICAgcG9pbnQueCAqPSBzb3VyY2UudG9fbWV0ZXI7DQogICAgICAg ICAgICAgICAgcG9pbnQueSAqPSBzb3VyY2UudG9fbWV0ZXI7DQogICAgICAgICAg ICB9DQogICAgICAgICAgICBzb3VyY2UuaW52ZXJzZShwb2ludCk7IC8vIENvbnZl cnQgQ2FydGVzaWFuIHRvIGxvbmdsYXQNCiAgICAgICAgfQ0KDQogICAgICAgIC8v IEFkanVzdCBmb3IgdGhlIHByaW1lIG1lcmlkaWFuIGlmIG5lY2Vzc2FyeQ0KICAg ICAgICBpZiAoc291cmNlLmZyb21fZ3JlZW53aWNoKSB7IA0KICAgICAgICAgICAg cG9pbnQueCArPSBzb3VyY2UuZnJvbV9ncmVlbndpY2g7IA0KICAgICAgICB9DQoN CiAgICAgICAgLy8gQ29udmVydCBkYXR1bXMgaWYgbmVlZGVkLCBhbmQgaWYgcG9z c2libGUuDQogICAgICAgIHBvaW50ID0gdGhpcy5kYXR1bV90cmFuc2Zvcm0oIHNv dXJjZS5kYXR1bSwgZGVzdC5kYXR1bSwgcG9pbnQgKTsNCg0KICAgICAgICAvLyBB ZGp1c3QgZm9yIHRoZSBwcmltZSBtZXJpZGlhbiBpZiBuZWNlc3NhcnkNCiAgICAg ICAgaWYgKGRlc3QuZnJvbV9ncmVlbndpY2gpIHsNCiAgICAgICAgICAgIHBvaW50 LnggLT0gZGVzdC5mcm9tX2dyZWVud2ljaDsNCiAgICAgICAgfQ0KDQogICAgICAg IGlmKCBkZXN0LnByb2pOYW1lPT0ibG9uZ2xhdCIgKSB7ICAgICAgICAgICAgIA0K ICAgICAgICAgICAgLy8gY29udmVydCByYWRpYW5zIHRvIGRlY2ltYWwgZGVncmVl cw0KICAgICAgICAgICAgcG9pbnQueCAqPSBQcm9qNGpzLmNvbW1vbi5SMkQ7DQog ICAgICAgICAgICBwb2ludC55ICo9IFByb2o0anMuY29tbW9uLlIyRDsNCiAgICAg ICAgfSBlbHNlICB7ICAgICAgICAgICAgICAgLy8gZWxzZSBwcm9qZWN0DQogICAg ICAgICAgICBkZXN0LmZvcndhcmQocG9pbnQpOw0KICAgICAgICAgICAgaWYgKGRl c3QudG9fbWV0ZXIpIHsNCiAgICAgICAgICAgICAgICBwb2ludC54IC89IGRlc3Qu dG9fbWV0ZXI7DQogICAgICAgICAgICAgICAgcG9pbnQueSAvPSBkZXN0LnRvX21l dGVyOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBw b2ludDsNCiAgICB9LCAvLyB0cmFuc2Zvcm0oKQ0KDQogICAgLyoqIGRhdHVtX3Ry YW5zZm9ybSgpDQogICAgICBzb3VyY2UgY29vcmRpbmF0ZSBzeXN0ZW0gZGVmaW5p dGlvbiwNCiAgICAgIGRlc3RpbmF0aW9uIGNvb3JkaW5hdGUgc3lzdGVtIGRlZmlu aXRpb24sDQogICAgICBwb2ludCB0byB0cmFuc2Zvcm0gaW4gZ2VvZGV0aWMgY29v cmRpbmF0ZXMgKGxvbmcsIGxhdCwgaGVpZ2h0KQ0KICAgICovDQogICAgZGF0dW1f dHJhbnNmb3JtIDogZnVuY3Rpb24oIHNvdXJjZSwgZGVzdCwgcG9pbnQgKSB7DQoN CiAgICAgIC8vIFNob3J0IGN1dCBpZiB0aGUgZGF0dW1zIGFyZSBpZGVudGljYWwu DQogICAgICBpZiggc291cmNlLmNvbXBhcmVfZGF0dW1zKCBkZXN0ICkgKSB7DQog ICAgICAgICAgcmV0dXJuIHBvaW50OyAvLyBpbiB0aGlzIGNhc2UsIHplcm8gaXMg c3VjZXNzLA0KICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZWFzIGNzX2NvbXBh cmVfZGF0dW1zIHJldHVybnMgMSB0byBpbmRpY2F0ZSBUUlVFDQogICAgICAgICAg ICAgICAgICAgIC8vIGNvbmZ1c2luZywgc2hvdWxkIGZpeCB0aGlzDQogICAgICB9 DQoNCiAgICAgIC8vIEV4cGxpY2l0bHkgc2tpcCBkYXR1bSB0cmFuc2Zvcm0gYnkg c2V0dGluZyAnZGF0dW09bm9uZScgYXMgcGFyYW1ldGVyIGZvciBlaXRoZXIgc291 cmNlIG9yIGRlc3QNCiAgICAgIGlmKCBzb3VyY2UuZGF0dW1fdHlwZSA9PSBQcm9q NGpzLmNvbW1vbi5QSkRfTk9EQVRVTQ0KICAgICAgICAgIHx8IGRlc3QuZGF0dW1f dHlwZSA9PSBQcm9qNGpzLmNvbW1vbi5QSkRfTk9EQVRVTSkgew0KICAgICAgICAg IHJldHVybiBwb2ludDsNCiAgICAgIH0NCg0KICAgICAgLy8gSWYgdGhpcyBkYXR1 bSByZXF1aXJlcyBncmlkIHNoaWZ0cywgdGhlbiBhcHBseSBpdCB0byBnZW9kZXRp YyBjb29yZGluYXRlcy4NCiAgICAgIGlmKCBzb3VyY2UuZGF0dW1fdHlwZSA9PSBQ cm9qNGpzLmNvbW1vbi5QSkRfR1JJRFNISUZUICkNCiAgICAgIHsNCiAgICAgICAg YWxlcnQoIkVSUk9SOiBHcmlkIHNoaWZ0IHRyYW5zZm9ybWF0aW9ucyBhcmUgbm90 IGltcGxlbWVudGVkIHlldC4iKTsNCiAgICAgICAgLyoNCiAgICAgICAgICBwal9h cHBseV9ncmlkc2hpZnQoIHBqX3BhcmFtKHNvdXJjZS5wYXJhbXMsInNuYWRncmlk cyIpLnMsIDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9j b3VudCwgcG9pbnRfb2Zmc2V0LCB4LCB5LCB6ICk7DQogICAgICAgICAgQ0hFQ0tf UkVUVVJOOw0KDQogICAgICAgICAgc3JjX2EgPSBTUlNfV0dTODRfU0VNSU1BSk9S Ow0KICAgICAgICAgIHNyY19lcyA9IDAuMDA2Njk0Mzc5OTkwOw0KICAgICAgICAq Lw0KICAgICAgfQ0KDQogICAgICBpZiggZGVzdC5kYXR1bV90eXBlID09IFByb2o0 anMuY29tbW9uLlBKRF9HUklEU0hJRlQgKQ0KICAgICAgew0KICAgICAgICBhbGVy dCgiRVJST1I6IEdyaWQgc2hpZnQgdHJhbnNmb3JtYXRpb25zIGFyZSBub3QgaW1w bGVtZW50ZWQgeWV0LiIpOw0KICAgICAgICAvKg0KICAgICAgICAgIGRzdF9hID0g Ow0KICAgICAgICAgIGRzdF9lcyA9IDAuMDA2Njk0Mzc5OTkwOw0KICAgICAgICAq Lw0KICAgICAgfQ0KDQogICAgICAvLyBEbyB3ZSBuZWVkIHRvIGdvIHRocm91Z2gg Z2VvY2VudHJpYyBjb29yZGluYXRlcz8NCiAgICAgIGlmKCBzb3VyY2UuZXMgIT0g ZGVzdC5lcyB8fCBzb3VyY2UuYSAhPSBkZXN0LmENCiAgICAgICAgICB8fCBzb3Vy Y2UuZGF0dW1fdHlwZSA9PSBQcm9qNGpzLmNvbW1vbi5QSkRfM1BBUkFNDQogICAg ICAgICAgfHwgc291cmNlLmRhdHVtX3R5cGUgPT0gUHJvajRqcy5jb21tb24uUEpE XzdQQVJBTQ0KICAgICAgICAgIHx8IGRlc3QuZGF0dW1fdHlwZSA9PSBQcm9qNGpz LmNvbW1vbi5QSkRfM1BBUkFNDQogICAgICAgICAgfHwgZGVzdC5kYXR1bV90eXBl ID09IFByb2o0anMuY29tbW9uLlBKRF83UEFSQU0pDQogICAgICB7DQoNCiAgICAg ICAgLy8gQ29udmVydCB0byBnZW9jZW50cmljIGNvb3JkaW5hdGVzLg0KICAgICAg ICBzb3VyY2UuZ2VvZGV0aWNfdG9fZ2VvY2VudHJpYyggcG9pbnQgKTsNCiAgICAg ICAgLy8gQ0hFQ0tfUkVUVVJOOw0KDQogICAgICAgIC8vIENvbnZlcnQgYmV0d2Vl biBkYXR1bXMNCiAgICAgICAgaWYoIHNvdXJjZS5kYXR1bV90eXBlID09IFByb2o0 anMuY29tbW9uLlBKRF8zUEFSQU0gfHwgc291cmNlLmRhdHVtX3R5cGUgPT0gUHJv ajRqcy5jb21tb24uUEpEXzdQQVJBTSApIHsNCiAgICAgICAgICBzb3VyY2UuZ2Vv Y2VudHJpY190b193Z3M4NChwb2ludCk7DQogICAgICAgICAgLy8gQ0hFQ0tfUkVU VVJOOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYoIGRlc3QuZGF0dW1fdHlwZSA9 PSBQcm9qNGpzLmNvbW1vbi5QSkRfM1BBUkFNIHx8IGRlc3QuZGF0dW1fdHlwZSA9 PSBQcm9qNGpzLmNvbW1vbi5QSkRfN1BBUkFNICkgew0KICAgICAgICAgIGRlc3Qu Z2VvY2VudHJpY19mcm9tX3dnczg0KHBvaW50KTsNCiAgICAgICAgICAvLyBDSEVD S19SRVRVUk47DQogICAgICAgIH0NCg0KICAgICAgICAvLyBDb252ZXJ0IGJhY2sg dG8gZ2VvZGV0aWMgY29vcmRpbmF0ZXMNCiAgICAgICAgZGVzdC5nZW9jZW50cmlj X3RvX2dlb2RldGljKCBwb2ludCApOw0KICAgICAgICAgIC8vIENIRUNLX1JFVFVS TjsNCiAgICAgIH0NCg0KICAgICAgLy8gQXBwbHkgZ3JpZCBzaGlmdCB0byBkZXN0 aW5hdGlvbiBpZiByZXF1aXJlZA0KICAgICAgaWYoIGRlc3QuZGF0dW1fdHlwZSA9 PSBQcm9qNGpzLmNvbW1vbi5QSkRfR1JJRFNISUZUICkNCiAgICAgIHsNCiAgICAg ICAgYWxlcnQoIkVSUk9SOiBHcmlkIHNoaWZ0IHRyYW5zZm9ybWF0aW9ucyBhcmUg bm90IGltcGxlbWVudGVkIHlldC4iKTsNCiAgICAgICAgLy8gcGpfYXBwbHlfZ3Jp ZHNoaWZ0KCBwal9wYXJhbShkZXN0LnBhcmFtcywic25hZGdyaWRzIikucywgMSwg cG9pbnQpOw0KICAgICAgICAvLyBDSEVDS19SRVRVUk47DQogICAgICB9DQogICAg ICByZXR1cm4gcG9pbnQ7DQogICAgfSwgLy8gY3NfZGF0dW1fdHJhbnNmb3JtDQoN CiAgICAvKioNCiAgICAgKiBGdW5jdGlvbjogcmVwb3J0RXJyb3INCiAgICAgKiBB biBpbnRlcm5hbCBtZXRob2QgdG8gcmVwb3J0IGVycm9ycyBiYWNrIHRvIHVzZXIu IA0KICAgICAqIE92ZXJyaWRlIHRoaXMgaW4gYXBwbGljYXRpb25zIHRvIHJlcG9y dCBlcnJvciBtZXNzYWdlcyBvciB0aHJvdyBleGNlcHRpb25zLg0KICAgICAqLw0K ICAgIHJlcG9ydEVycm9yOiBmdW5jdGlvbihtc2cpIHsNCiAgICAgIC8vY29uc29s ZS5sb2cobXNnKTsNCiAgICB9LA0KDQovKioNCiAqDQogKiBUaXRsZTogUHJpdmF0 ZSBNZXRob2RzDQogKiBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYW5kIG1ldGhv ZHMgYXJlIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seS4NCiAqDQogKiBU aGlzIGlzIGEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiBKYXZhU2NyaXB0IGlu aGVyaXRhbmNlIG1ldGhvZHMgc28gdGhhdCANCiAqIFByb2o0anMgY2FuIGJlIHVz ZWQgYXMgYSBzdGFuZC1hbG9uZSBsaWJyYXJ5Lg0KICogVGhlc2UgYXJlIGNvcGll cyBvZiB0aGUgZXF1aXZhbGVudCBPcGVuTGF5ZXJzIG1ldGhvZHMgYXQgdjIuNw0K ICovDQogDQovKioNCiAqIEZ1bmN0aW9uOiBleHRlbmQNCiAqIENvcHkgYWxsIHBy b3BlcnRpZXMgb2YgYSBzb3VyY2Ugb2JqZWN0IHRvIGEgZGVzdGluYXRpb24gb2Jq ZWN0LiAgTW9kaWZpZXMNCiAqICAgICB0aGUgcGFzc2VkIGluIGRlc3RpbmF0aW9u IG9iamVjdC4gIEFueSBwcm9wZXJ0aWVzIG9uIHRoZSBzb3VyY2Ugb2JqZWN0DQog KiAgICAgdGhhdCBhcmUgc2V0IHRvIHVuZGVmaW5lZCB3aWxsIG5vdCBiZSAocmUp c2V0IG9uIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuDQogKg0KICogUGFyYW1ldGVy czoNCiAqIGRlc3RpbmF0aW9uIC0ge09iamVjdH0gVGhlIG9iamVjdCB0aGF0IHdp bGwgYmUgbW9kaWZpZWQNCiAqIHNvdXJjZSAtIHtPYmplY3R9IFRoZSBvYmplY3Qg d2l0aCBwcm9wZXJ0aWVzIHRvIGJlIHNldCBvbiB0aGUgZGVzdGluYXRpb24NCiAq DQogKiBSZXR1cm5zOg0KICoge09iamVjdH0gVGhlIGRlc3RpbmF0aW9uIG9iamVj dC4NCiAqLw0KICAgIGV4dGVuZDogZnVuY3Rpb24oZGVzdGluYXRpb24sIHNvdXJj ZSkgew0KICAgICAgZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbiB8fCB7fTsNCiAg ICAgIGlmKHNvdXJjZSkgew0KICAgICAgICAgIGZvcih2YXIgcHJvcGVydHkgaW4g c291cmNlKSB7DQogICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtwcm9w ZXJ0eV07DQogICAgICAgICAgICAgIGlmKHZhbHVlICE9PSB1bmRlZmluZWQpIHsN CiAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uW3Byb3BlcnR5XSA9IHZhbHVl Ow0KICAgICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgfQ0KICAgICAg cmV0dXJuIGRlc3RpbmF0aW9uOw0KICAgIH0sDQoNCi8qKg0KICogQ29uc3RydWN0 b3I6IENsYXNzDQogKiBCYXNlIGNsYXNzIHVzZWQgdG8gY29uc3RydWN0IGFsbCBv dGhlciBjbGFzc2VzLiBJbmNsdWRlcyBzdXBwb3J0IGZvciANCiAqICAgICBtdWx0 aXBsZSBpbmhlcml0YW5jZS4gDQogKiAgDQogKi8NCiAgICBDbGFzczogZnVuY3Rp b24oKSB7DQogICAgICB2YXIgQ2xhc3MgPSBmdW5jdGlvbigpIHsNCiAgICAgICAg ICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAg IH07DQogIA0KICAgICAgdmFyIGV4dGVuZGVkID0ge307DQogICAgICB2YXIgcGFy ZW50Ow0KICAgICAgZm9yKHZhciBpPTA7IGk8YXJndW1lbnRzLmxlbmd0aDsgKytp KSB7DQogICAgICAgICAgaWYodHlwZW9mIGFyZ3VtZW50c1tpXSA9PSAiZnVuY3Rp b24iKSB7DQogICAgICAgICAgICAgIC8vIGdldCB0aGUgcHJvdG90eXBlIG9mIHRo ZSBzdXBlcmNsYXNzDQogICAgICAgICAgICAgIHBhcmVudCA9IGFyZ3VtZW50c1tp XS5wcm90b3R5cGU7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAg Ly8gaW4gdGhpcyBjYXNlIHdlJ3JlIGV4dGVuZGluZyB3aXRoIHRoZSBwcm90b3R5 cGUNCiAgICAgICAgICAgICAgcGFyZW50ID0gYXJndW1lbnRzW2ldOw0KICAgICAg ICAgIH0NCiAgICAgICAgICBQcm9qNGpzLmV4dGVuZChleHRlbmRlZCwgcGFyZW50 KTsNCiAgICAgIH0NCiAgICAgIENsYXNzLnByb3RvdHlwZSA9IGV4dGVuZGVkOw0K ICAgICAgDQogICAgICByZXR1cm4gQ2xhc3M7DQogICAgfSwNCg0KICAgIC8qKg0K ICAgICAqIEZ1bmN0aW9uOiBiaW5kDQogICAgICogQmluZCBhIGZ1bmN0aW9uIHRv IGFuIG9iamVjdC4gIE1ldGhvZCB0byBlYXNpbHkgY3JlYXRlIGNsb3N1cmVzIHdp dGgNCiAgICAgKiAgICAgJ3RoaXMnIGFsdGVyZWQuDQogICAgICogDQogICAgICog UGFyYW1ldGVyczoNCiAgICAgKiBmdW5jIC0ge0Z1bmN0aW9ufSBJbnB1dCBmdW5j dGlvbi4NCiAgICAgKiBvYmplY3QgLSB7T2JqZWN0fSBUaGUgb2JqZWN0IHRvIGJp bmQgdG8gdGhlIGlucHV0IGZ1bmN0aW9uIChhcyB0aGlzKS4NCiAgICAgKiANCiAg ICAgKiBSZXR1cm5zOg0KICAgICAqIHtGdW5jdGlvbn0gQSBjbG9zdXJlIHdpdGgg J3RoaXMnIHNldCB0byB0aGUgcGFzc2VkIGluIG9iamVjdC4NCiAgICAgKi8NCiAg ICBiaW5kOiBmdW5jdGlvbihmdW5jLCBvYmplY3QpIHsNCiAgICAgICAgLy8gY3Jl YXRlIGEgcmVmZXJlbmNlIHRvIGFsbCBhcmd1bWVudHMgcGFzdCB0aGUgc2Vjb25k IG9uZQ0KICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5h cHBseShhcmd1bWVudHMsIFsyXSk7DQogICAgICAgIHJldHVybiBmdW5jdGlvbigp IHsNCiAgICAgICAgICAgIC8vIFB1c2ggb24gYW55IGFkZGl0aW9uYWwgYXJndW1l bnRzIGZyb20gdGhlIGFjdHVhbCBmdW5jdGlvbiBjYWxsLg0KICAgICAgICAgICAg Ly8gVGhlc2Ugd2lsbCBjb21lIGFmdGVyIHRob3NlIHNlbnQgdG8gdGhlIGJpbmQg Y2FsbC4NCiAgICAgICAgICAgIHZhciBuZXdBcmdzID0gYXJncy5jb25jYXQoDQog ICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3Vt ZW50cywgWzBdKQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIHJldHVybiBm dW5jLmFwcGx5KG9iamVjdCwgbmV3QXJncyk7DQogICAgICAgIH07DQogICAgfSwN CiAgICANCi8qKg0KICogVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFuZCBtZXRo b2RzIGhhbmRsZSBkeW5hbWljIGxvYWRpbmcgb2YgSlNPTiBvYmplY3RzLg0KICoN CiAgICAvKioNCiAgICAgKiBQcm9wZXJ0eTogc2NyaXB0TmFtZQ0KICAgICAqIHtT dHJpbmd9IFRoZSBmaWxlbmFtZSBvZiB0aGlzIHNjcmlwdCB3aXRob3V0IGFueSBw YXRoLg0KICAgICAqLw0KICAgIHNjcmlwdE5hbWU6ICJwcm9qNGpzLmpzIiwNCg0K ICAgIC8qKg0KICAgICAqIFByb3BlcnR5OiBkZWZzTG9va3VwU2VydmljZQ0KICAg ICAqIEFKQVggc2VydmljZSB0byByZXRyZWl2ZSBwcm9qZWN0aW9uIGRlZmluaXRp b24gcGFyYW1ldGVycyBmcm9tDQogICAgICovDQogICAgZGVmc0xvb2t1cFNlcnZp Y2U6ICdodHRwOi8vc3BhdGlhbHJlZmVyZW5jZS5vcmcvcmVmJywNCg0KICAgIC8q Kg0KICAgICAqIFByb3BlcnR5OiBsaWJQYXRoDQogICAgICogaW50ZXJuYWw6IGh0 dHAgc2VydmVyIHBhdGggdG8gbGlicmFyeSBjb2RlLg0KICAgICAqLw0KICAgIGxp YlBhdGg6IG51bGwsDQoNCiAgICAvKioNCiAgICAgKiBGdW5jdGlvbjogZ2V0U2Ny aXB0TG9jYXRpb24NCiAgICAgKiBSZXR1cm4gdGhlIHBhdGggdG8gdGhpcyBzY3Jp cHQuDQogICAgICoNCiAgICAgKiBSZXR1cm5zOg0KICAgICAqIFBhdGggdG8gdGhp cyBzY3JpcHQNCiAgICAgKi8NCiAgICBnZXRTY3JpcHRMb2NhdGlvbjogZnVuY3Rp b24gKCkgew0KICAgICAgICBpZiAodGhpcy5saWJQYXRoKSByZXR1cm4gdGhpcy5s aWJQYXRoOw0KICAgICAgICB2YXIgc2NyaXB0TmFtZSA9IHRoaXMuc2NyaXB0TmFt ZTsNCiAgICAgICAgdmFyIHNjcmlwdE5hbWVMZW4gPSBzY3JpcHROYW1lLmxlbmd0 aDsNCg0KICAgICAgICB2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRz QnlUYWdOYW1lKCdzY3JpcHQnKTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkg PCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgc3JjID0g c2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUoJ3NyYycpOw0KICAgICAgICAgICAgaWYg KHNyYykgew0KICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHNyYy5sYXN0SW5k ZXhPZihzY3JpcHROYW1lKTsNCiAgICAgICAgICAgICAgICAvLyBpcyBpdCBmb3Vu ZCwgYXQgdGhlIGVuZCBvZiB0aGUgVVJMPw0KICAgICAgICAgICAgICAgIGlmICgo aW5kZXggPiAtMSkgJiYgKGluZGV4ICsgc2NyaXB0TmFtZUxlbiA9PSBzcmMubGVu Z3RoKSkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmxpYlBhdGggPSBzcmMu c2xpY2UoMCwgLXNjcmlwdE5hbWVMZW4pOw0KICAgICAgICAgICAgICAgICAgICBi cmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAg IH0NCiAgICAgICAgcmV0dXJuIHRoaXMubGliUGF0aHx8IiI7DQogICAgfSwNCg0K ICAgIC8qKg0KICAgICAqIEZ1bmN0aW9uOiBsb2FkU2NyaXB0DQogICAgICogTG9h ZCBhIEpTIGZpbGUgZnJvbSBhIFVSTCBpbnRvIGEgPHNjcmlwdD4gdGFnIGluIHRo ZSBwYWdlLg0KICAgICAqIA0KICAgICAqIFBhcmFtZXRlcnM6DQogICAgICogdXJs IC0ge1N0cmluZ30gVGhlIFVSTCBjb250YWluaW5nIHRoZSBzY3JpcHQgdG8gbG9h ZA0KICAgICAqIG9ubG9hZCAtIHtGdW5jdGlvbn0gQSBtZXRob2QgdG8gYmUgZXhl Y3V0ZWQgd2hlbiB0aGUgc2NyaXB0IGxvYWRzIHN1Y2Nlc3NmdWxseQ0KICAgICAq IG9uZmFpbCAtIHtGdW5jdGlvbn0gQSBtZXRob2QgdG8gYmUgZXhlY3V0ZWQgd2hl biB0aGVyZSBpcyBhbiBlcnJvciBsb2FkaW5nIHRoZSBzY3JpcHQNCiAgICAgKiBs b2FkQ2hlY2sgLSB7RnVuY3Rpb259IEEgYm9vbGVhbiBtZXRob2QgdGhhdCBjaGVj a3MgdG8gc2VlIGlmIHRoZSBzY3JpcHQgDQogICAgICogICAgICAgICAgICBoYXMg bG9hZGVkLiAgVHlwaWNhbGx5IHRoaXMganVzdCBjaGVja3MgZm9yIHRoZSBleGlz dGFuY2Ugb2YNCiAgICAgKiAgICAgICAgICAgIGFuIG9iamVjdCBpbiB0aGUgZmls ZSBqdXN0IGxvYWRlZC4NCiAgICAgKi8NCiAgICBsb2FkU2NyaXB0OiBmdW5jdGlv bih1cmwsIG9ubG9hZCwgb25mYWlsLCBsb2FkQ2hlY2spIHsNCiAgICAgIHZhciBz Y3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsNCiAgICAg IHNjcmlwdC5kZWZlciA9IGZhbHNlOw0KICAgICAgc2NyaXB0LnR5cGUgPSAidGV4 dC9qYXZhc2NyaXB0IjsNCiAgICAgIHNjcmlwdC5pZCA9IHVybDsNCiAgICAgIHNj cmlwdC5zcmMgPSB1cmw7DQogICAgICBzY3JpcHQub25sb2FkID0gb25sb2FkOw0K ICAgICAgc2NyaXB0Lm9uZXJyb3IgPSBvbmZhaWw7DQogICAgICBzY3JpcHQubG9h ZENoZWNrID0gbG9hZENoZWNrOw0KICAgICAgaWYgKC9NU0lFLy50ZXN0KG5hdmln YXRvci51c2VyQWdlbnQpKSB7DQogICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVj aGFuZ2UgPSB0aGlzLmNoZWNrUmVhZHlTdGF0ZTsNCiAgICAgIH0NCiAgICAgIGRv Y3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hp bGQoc2NyaXB0KTsNCiAgICB9LA0KICAgIA0KICAgIC8qKg0KICAgICAqIEZ1bmN0 aW9uOiBjaGVja1JlYWR5U3RhdGUNCiAgICAgKiBJRSB3b3JrYXJvdW5kIHNpbmNl IHRoZXJlIGlzIG5vIG9uZXJyb3IgaGFuZGxlci4gIENhbGxzIHRoZSB1c2VyIGRl ZmluZWQgDQogICAgICogbG9hZENoZWNrIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYg dGhlIHNjcmlwdCBpcyBsb2FkZWQuDQogICAgICogDQogICAgICovDQogICAgY2hl Y2tSZWFkeVN0YXRlOiBmdW5jdGlvbigpIHsNCiAgICAgIGlmICh0aGlzLnJlYWR5 U3RhdGUgPT0gJ2xvYWRlZCcpIHsNCiAgICAgICAgaWYgKCF0aGlzLmxvYWRDaGVj aygpKSB7DQogICAgICAgICAgdGhpcy5vbmVycm9yKCk7DQogICAgICAgIH0gZWxz ZSB7DQogICAgICAgICAgdGhpcy5vbmxvYWQoKTsNCiAgICAgICAgfQ0KICAgICAg fQ0KICAgIH0NCn07DQoNCi8qKg0KICogQ2xhc3M6IFByb2o0anMuUHJvag0KICoN CiAqIFByb2ogb2JqZWN0cyBwcm92aWRlIHRyYW5zZm9ybWF0aW9uIG1ldGhvZHMg Zm9yIHBvaW50IGNvb3JkaW5hdGVzDQogKiBiZXR3ZWVuIGdlb2RldGljIGxhdGl0 dWRlL2xvbmdpdHVkZSBhbmQgYSBwcm9qZWN0ZWQgY29vcmRpbmF0ZSBzeXN0ZW0u IA0KICogb25jZSB0aGV5IGhhdmUgYmVlbiBpbml0aWFsaXplZCB3aXRoIGEgcHJv amVjdGlvbiBjb2RlLg0KICoNCiAqIEluaXRpYWxpemF0aW9uIG9mIFByb2ogb2Jq ZWN0cyBpcyB3aXRoIGEgcHJvamVjdGlvbiBjb2RlLCB1c3VhbGx5IEVQU0cgY29k ZXMsDQogKiB3aGljaCBpcyB0aGUga2V5IHRoYXQgd2lsbCBiZSB1c2VkIHdpdGgg dGhlIFByb2o0anMuZGVmcyBhcnJheS4NCiAqIA0KICogVGhlIGNvZGUgcGFzc2Vk IGluIHdpbGwgYmUgc3RyaXBwZWQgb2YgY29sb25zIGFuZCBjb252ZXJ0ZWQgdG8g dXBwZXJjYXNlDQogKiB0byBsb2NhdGUgcHJvamVjdGlvbiBkZWZpbml0aW9uIGZp bGVzLg0KICoNCiAqIEEgcHJvamVjdGlvbiBvYmplY3QgaGFzIHByb3BlcnRpZXMg Zm9yIHVuaXRzIGFuZCB0aXRsZSBzdHJpbmdzLg0KICovDQpQcm9qNGpzLlByb2og PSBQcm9qNGpzLkNsYXNzKHsNCg0KICAvKioNCiAgICogUHJvcGVydHk6IHJlYWR5 VG9Vc2UNCiAgICogRmxhZyB0byBpbmRpY2F0ZSBpZiBpbml0aWFsaXphdGlvbiBp cyBjb21wbGV0ZSBmb3IgdGhpcyBQcm9qIG9iamVjdA0KICAgKi8NCiAgcmVhZHlU b1VzZTogZmFsc2UsICAgDQogIA0KICAvKioNCiAgICogUHJvcGVydHk6IHRpdGxl DQogICAqIFRoZSB0aXRsZSB0byBkZXNjcmliZSB0aGUgcHJvamVjdGlvbg0KICAg Ki8NCiAgdGl0bGU6IG51bGwsICANCiAgDQogIC8qKg0KICAgKiBQcm9wZXJ0eTog cHJvak5hbWUNCiAgICogVGhlIHByb2plY3Rpb24gY2xhc3MgZm9yIHRoaXMgcHJv amVjdGlvbiwgZS5nLiBsY2MgKGxhbWJlcnQgY29uZm9ybWFsIGNvbmljLA0KICAg KiBvciBtZXJjIGZvciBtZXJjYXRvci4gIFRoZXNlIGFyZSBleGFjdGx5IGVxdWlj dmFsZW50IHRvIHRoZWlyIFByb2o0IA0KICAgKiBjb3VudGVycGFydHMuDQogICAq Lw0KICBwcm9qTmFtZTogbnVsbCwNCiAgLyoqDQogICAqIFByb3BlcnR5OiB1bml0 cw0KICAgKiBUaGUgdW5pdHMgb2YgdGhlIHByb2plY3Rpb24uICBWYWx1ZXMgaW5j bHVkZSAnbScgYW5kICdkZWdyZWVzJw0KICAgKi8NCiAgdW5pdHM6IG51bGwsDQog IC8qKg0KICAgKiBQcm9wZXJ0eTogZGF0dW0NCiAgICogVGhlIGRhdHVtIHNwZWNp ZmllZCBmb3IgdGhlIHByb2plY3Rpb24NCiAgICovDQogIGRhdHVtOiBudWxsLA0K DQogIC8qKg0KICAgKiBDb25zdHJ1Y3RvcjogaW5pdGlhbGl6ZQ0KICAgKiBDb25z dHJ1Y3RvciBmb3IgUHJvajRqcy5Qcm9qIG9iamVjdHMNCiAgKg0KICAqIFBhcmFt ZXRlcnM6DQogICogc3JzQ29kZSAtIGEgY29kZSBmb3IgbWFwIHByb2plY3Rpb24g ZGVmaW5pdGlvbiBwYXJhbWV0ZXJzLiAgVGhlc2UgYXJlIHVzdWFsbHkNCiAgKiAo YnV0IG5vdCBhbHdheXMpIEVQU0cgY29kZXMuDQogICovDQogIGluaXRpYWxpemU6 IGZ1bmN0aW9uKHNyc0NvZGUpIHsNCiAgICAgIHRoaXMuc3JzQ29kZSA9IHNyc0Nv ZGUudG9VcHBlckNhc2UoKTsNCiAgICAgIGlmICh0aGlzLnNyc0NvZGUuaW5kZXhP ZigiRVBTRyIpID09IDApIHsNCiAgICAgICAgICB0aGlzLnNyc0NvZGUgPSB0aGlz LnNyc0NvZGU7DQogICAgICAgICAgdGhpcy5zcnNBdXRoID0gJ2Vwc2cnOw0KICAg ICAgICAgIHRoaXMuc3JzUHJvak51bWJlciA9IHRoaXMuc3JzQ29kZS5zdWJzdHJp bmcoNSk7DQogICAgICAvLyBER1IgMjAwNy0xMS0yMCA6IGF1dGhvcml0eSBJR05G DQogICAgICB9IGVsc2UgaWYgKHRoaXMuc3JzQ29kZS5pbmRleE9mKCJJR05GIikg PT0gMCkgew0KICAgICAgICAgIHRoaXMuc3JzQ29kZSA9IHRoaXMuc3JzQ29kZTsN CiAgICAgICAgICB0aGlzLnNyc0F1dGggPSAnSUdORic7DQogICAgICAgICAgdGhp cy5zcnNQcm9qTnVtYmVyID0gdGhpcy5zcnNDb2RlLnN1YnN0cmluZyg1KTsNCiAg ICAgIC8vIERHUiAyMDA4LTA2LTE5IDogcHNldWRvLWF1dGhvcml0eSBDUlMgZm9y IFdNUw0KICAgICAgfSBlbHNlIGlmICh0aGlzLnNyc0NvZGUuaW5kZXhPZigiQ1JT IikgPT0gMCkgew0KICAgICAgICAgIHRoaXMuc3JzQ29kZSA9IHRoaXMuc3JzQ29k ZTsNCiAgICAgICAgICB0aGlzLnNyc0F1dGggPSAnQ1JTJzsNCiAgICAgICAgICB0 aGlzLnNyc1Byb2pOdW1iZXIgPSB0aGlzLnNyc0NvZGUuc3Vic3RyaW5nKDQpOw0K ICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzLnNyc0F1dGggPSAnJzsNCiAg ICAgICAgICB0aGlzLnNyc1Byb2pOdW1iZXIgPSB0aGlzLnNyc0NvZGU7DQogICAg ICB9DQogICAgICB0aGlzLmxvYWRQcm9qRGVmaW5pdGlvbigpOw0KICB9LA0KICAN Ci8qKg0KICogRnVuY3Rpb246IGxvYWRQcm9qRGVmaW5pdGlvbg0KICogICAgTG9h ZHMgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGluaXRpYWxpemF0aW9uIHN0cmluZyBp ZiByZXF1aXJlZC4NCiAqICAgIE5vdGUgdGhhdCBkeW5hbWljIGxvYWRpbmcgaGFw cGVucyBhc3luY2hyb25vdXNseSBzbyBhbiBhcHBsaWNhdGlvbiBtdXN0IA0KICog ICAgd2FpdCBmb3IgdGhlIHJlYWR5VG9Vc2UgcHJvcGVydHkgaXMgc2V0IHRvIHRy dWUuDQogKiAgICBUbyBwcmV2ZW50IGR5bmFtaWMgbG9hZGluZywgaW5jbHVkZSB0 aGUgZGVmcyB0aHJvdWdoIGEgc2NyaXB0IHRhZyBpbg0KICogICAgeW91ciBhcHBs aWNhdGlvbi4NCiAqDQogKi8NCiAgICBsb2FkUHJvakRlZmluaXRpb246IGZ1bmN0 aW9uKCkgew0KICAgICAgLy9jaGVjayBpbiBtZW1vcnkNCiAgICAgIGlmIChQcm9q NGpzLmRlZnNbdGhpcy5zcnNDb2RlXSkgew0KICAgICAgICB0aGlzLmRlZnNMb2Fk ZWQoKTsNCiAgICAgICAgcmV0dXJuOw0KICAgICAgfQ0KDQogICAgICAvL2Vsc2Ug Y2hlY2sgZm9yIGRlZiBvbiB0aGUgc2VydmVyDQogICAgICB2YXIgdXJsID0gUHJv ajRqcy5nZXRTY3JpcHRMb2NhdGlvbigpICsgJ2RlZnMvJyArIHRoaXMuc3JzQXV0 aC50b1VwcGVyQ2FzZSgpICsgdGhpcy5zcnNQcm9qTnVtYmVyICsgJy5qcyc7DQog ICAgICBQcm9qNGpzLmxvYWRTY3JpcHQodXJsLCANCiAgICAgICAgICAgICAgICBQ cm9qNGpzLmJpbmQodGhpcy5kZWZzTG9hZGVkLCB0aGlzKSwNCiAgICAgICAgICAg ICAgICBQcm9qNGpzLmJpbmQodGhpcy5sb2FkRnJvbVNlcnZpY2UsIHRoaXMpLA0K ICAgICAgICAgICAgICAgIFByb2o0anMuYmluZCh0aGlzLmNoZWNrRGVmc0xvYWRl ZCwgdGhpcykgKTsNCiAgICB9LA0KDQovKioNCiAqIEZ1bmN0aW9uOiBsb2FkRnJv bVNlcnZpY2UNCiAqICAgIENyZWF0ZXMgdGhlIFJFU1QgVVJMIGZvciBsb2FkaW5n IHRoZSBkZWZpbml0aW9uIGZyb20gYSB3ZWIgc2VydmljZSBhbmQgDQogKiAgICBs b2FkcyBpdC4NCiAqDQogKi8NCiAgICBsb2FkRnJvbVNlcnZpY2U6IGZ1bmN0aW9u KCkgew0KICAgICAgLy9lbHNlIGxvYWQgZnJvbSB3ZWIgc2VydmljZQ0KICAgICAg dmFyIHVybCA9IFByb2o0anMuZGVmc0xvb2t1cFNlcnZpY2UgKycvJyArIHRoaXMu c3JzQXV0aCArJy8nKyB0aGlzLnNyc1Byb2pOdW1iZXIgKyAnL3Byb2o0anMnOw0K ICAgICAgUHJvajRqcy5sb2FkU2NyaXB0KHVybCwgDQogICAgICAgICAgICBQcm9q NGpzLmJpbmQodGhpcy5kZWZzTG9hZGVkLCB0aGlzKSwNCiAgICAgICAgICAgIFBy b2o0anMuYmluZCh0aGlzLmRlZnNGYWlsZWQsIHRoaXMpLA0KICAgICAgICAgICAg UHJvajRqcy5iaW5kKHRoaXMuY2hlY2tEZWZzTG9hZGVkLCB0aGlzKSApOw0KICAg IH0sDQoNCi8qKg0KICogRnVuY3Rpb246IGRlZnNMb2FkZWQNCiAqIENvbnRpbnVl cyB0aGUgUHJvaiBvYmplY3QgaW5pdGlsaXphdGlvbiBvbmNlIHRoZSBkZWYgZmls ZSBpcyBsb2FkZWQNCiAqDQogKi8NCiAgICBkZWZzTG9hZGVkOiBmdW5jdGlvbigp IHsNCiAgICAgIHRoaXMucGFyc2VEZWZzKCk7DQogICAgICB0aGlzLmxvYWRQcm9q Q29kZSh0aGlzLnByb2pOYW1lKTsNCiAgICB9LA0KICAgIA0KLyoqDQogKiBGdW5j dGlvbjogY2hlY2tEZWZzTG9hZGVkDQogKiAgICBUaGlzIGlzIHRoZSBsb2FkQ2hl Y2sgbWV0aG9kIHRvIHNlZSBpZiB0aGUgZGVmIG9iamVjdCBleGlzdHMNCiAqDQog Ki8NCiAgICBjaGVja0RlZnNMb2FkZWQ6IGZ1bmN0aW9uKCkgew0KICAgICAgaWYg KFByb2o0anMuZGVmc1t0aGlzLnNyc0NvZGVdKSB7DQogICAgICAgIHJldHVybiB0 cnVlOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAg ICAgfQ0KICAgIH0sDQoNCiAvKioNCiAqIEZ1bmN0aW9uOiBkZWZzRmFpbGVkDQog KiAgICBSZXBvcnQgYW4gZXJyb3IgaW4gbG9hZGluZyB0aGUgZGVmcyBmaWxlLCBi dXQgY29udGludWUgb24gdXNpbmcgV0dTODQNCiAqDQogKi8NCiAgIGRlZnNGYWls ZWQ6IGZ1bmN0aW9uKCkgew0KICAgICAgUHJvajRqcy5yZXBvcnRFcnJvcignZmFp bGVkIHRvIGxvYWQgcHJvamVjdGlvbiBkZWZpbml0aW9uIGZvcjogJyt0aGlzLnNy c0NvZGUpOw0KICAgICAgUHJvajRqcy5leHRlbmQoUHJvajRqcy5kZWZzW3RoaXMu c3JzQ29kZV0sIFByb2o0anMuZGVmc1snV0dTODQnXSk7ICAvL3NldCBpdCB0byBz b21ldGhpbmcgc28gaXQgY2FuIGF0IGxlYXN0IGNvbnRpbnVlDQogICAgICB0aGlz LmRlZnNMb2FkZWQoKTsNCiAgICB9LA0KDQovKioNCiAqIEZ1bmN0aW9uOiBsb2Fk UHJvakNvZGUNCiAqICAgIExvYWRzIHByb2plY3Rpb24gY2xhc3MgY29kZSBkeW5h bWljYWxseSBpZiByZXF1aXJlZC4NCiAqICAgICBQcm9qZWN0aW9uIGNvZGUgbWF5 IGJlIGluY2x1ZGVkIGVpdGhlciB0aHJvdWdoIGEgc2NyaXB0IHRhZyBvciBpbg0K ICogICAgIGEgYnVpbHQgdmVyc2lvbiBvZiBwcm9qNGpzDQogKg0KICovDQogICAg bG9hZFByb2pDb2RlOiBmdW5jdGlvbihwcm9qTmFtZSkgew0KICAgICAgaWYgKFBy b2o0anMuUHJvaltwcm9qTmFtZV0pIHsNCiAgICAgICAgdGhpcy5pbml0VHJhbnNm b3JtcygpOw0KICAgICAgICByZXR1cm47DQogICAgICB9DQoNCiAgICAgIC8vdGhl IFVSTCBmb3IgdGhlIHByb2plY3Rpb24gY29kZQ0KICAgICAgdmFyIHVybCA9IFBy b2o0anMuZ2V0U2NyaXB0TG9jYXRpb24oKSArICdwcm9qQ29kZS8nICsgcHJvak5h bWUgKyAnLmpzJzsNCiAgICAgIFByb2o0anMubG9hZFNjcmlwdCh1cmwsIA0KICAg ICAgICAgICAgICBQcm9qNGpzLmJpbmQodGhpcy5sb2FkUHJvakNvZGVTdWNjZXNz LCB0aGlzLCBwcm9qTmFtZSksDQogICAgICAgICAgICAgIFByb2o0anMuYmluZCh0 aGlzLmxvYWRQcm9qQ29kZUZhaWx1cmUsIHRoaXMsIHByb2pOYW1lKSwgDQogICAg ICAgICAgICAgIFByb2o0anMuYmluZCh0aGlzLmNoZWNrQ29kZUxvYWRlZCwgdGhp cywgcHJvak5hbWUpICk7DQogICAgfSwNCg0KIC8qKg0KICogRnVuY3Rpb246IGxv YWRQcm9qQ29kZVN1Y2Nlc3MNCiAqICAgIExvYWRzIGFueSBwcm9qIGRlcGVuZGVu Y2llcyBvciBjb250aW51ZSBvbiB0byBmaW5hbCBpbml0aWFsaXphdGlvbi4NCiAq DQogKi8NCiAgICBsb2FkUHJvakNvZGVTdWNjZXNzOiBmdW5jdGlvbihwcm9qTmFt ZSkgew0KICAgICAgaWYgKFByb2o0anMuUHJvaltwcm9qTmFtZV0uZGVwZW5kc09u KXsNCiAgICAgICAgdGhpcy5sb2FkUHJvakNvZGUoUHJvajRqcy5Qcm9qW3Byb2pO YW1lXS5kZXBlbmRzT24pOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5p bml0VHJhbnNmb3JtcygpOw0KICAgICAgfQ0KICAgIH0sDQoNCiAvKioNCiAqIEZ1 bmN0aW9uOiBkZWZzRmFpbGVkDQogKiAgICBSZXBvcnQgYW4gZXJyb3IgaW4gbG9h ZGluZyB0aGUgcHJvaiBmaWxlLiAgSW5pdGlhbGl6YXRpb24gb2YgdGhlIFByb2oN CiAqICAgIG9iamVjdCBoYXMgZmFpbGVkIGFuZCB0aGUgcmVhZHlUb1VzZSBmbGFn IHdpbGwgbmV2ZXIgYmUgc2V0Lg0KICoNCiAqLw0KICAgIGxvYWRQcm9qQ29kZUZh aWx1cmU6IGZ1bmN0aW9uKHByb2pOYW1lKSB7DQogICAgICBQcm9qNGpzLnJlcG9y dEVycm9yKCJmYWlsZWQgdG8gZmluZCBwcm9qZWN0aW9uIGZpbGUgZm9yOiAiICsg cHJvak5hbWUpOw0KICAgICAgLy9UQkQgaW5pdGlhbGl6ZSB3aXRoIGlkZW50aXR5 IHRyYW5zZm9ybXMgc28gcHJvaiB3aWxsIHN0aWxsIHdvcms/DQogICAgfSwNCiAg ICANCi8qKg0KICogRnVuY3Rpb246IGNoZWNrQ29kZUxvYWRlZA0KICogICAgVGhp cyBpcyB0aGUgbG9hZENoZWNrIG1ldGhvZCB0byBzZWUgaWYgdGhlIHByb2plY3Rp b24gY29kZSBpcyBsb2FkZWQNCiAqDQogKi8NCiAgICBjaGVja0NvZGVMb2FkZWQ6 IGZ1bmN0aW9uKHByb2pOYW1lKSB7DQogICAgICBpZiAoUHJvajRqcy5Qcm9qW3By b2pOYW1lXSkgew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgIH0gZWxzZSB7 DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgIH0NCiAgICB9LA0KDQovKioN CiAqIEZ1bmN0aW9uOiBpbml0VHJhbnNmb3Jtcw0KICogICAgRmluYWxpemUgdGhl IGluaXRpYWxpemF0aW9uIG9mIHRoZSBQcm9qIG9iamVjdA0KICoNCiAqLw0KICAg IGluaXRUcmFuc2Zvcm1zOiBmdW5jdGlvbigpIHsNCiAgICAgIFByb2o0anMuZXh0 ZW5kKHRoaXMsIFByb2o0anMuUHJvalt0aGlzLnByb2pOYW1lXSk7DQogICAgICB0 aGlzLmluaXQoKTsNCiAgICAgIHRoaXMucmVhZHlUb1VzZSA9IHRydWU7DQogIH0s DQoNCi8qKg0KICogRnVuY3Rpb246IHBhcnNlRGVmcw0KICogUGFyc2VzIHRoZSBQ Uk9KLjQgaW5pdGlhbGl6YXRpb24gc3RyaW5nIGFuZCBzZXRzIHRoZSBhc3NvY2lh dGVkIHByb3BlcnRpZXMuDQogKg0KICovDQogIHBhcnNlRGVmczogZnVuY3Rpb24o KSB7DQogICAgICB0aGlzLmRlZkRhdGEgPSBQcm9qNGpzLmRlZnNbdGhpcy5zcnND b2RlXTsNCiAgICAgIHZhciBwYXJhbU5hbWUsIHBhcmFtVmFsOw0KICAgICAgdmFy IHBhcmFtQXJyYXk9dGhpcy5kZWZEYXRhLnNwbGl0KCIrIik7DQoNCiAgICAgIGZv ciAodmFyIHByb3A9MDsgcHJvcDxwYXJhbUFycmF5Lmxlbmd0aDsgcHJvcCsrKSB7 DQogICAgICAgICAgdmFyIHByb3BlcnR5ID0gcGFyYW1BcnJheVtwcm9wXS5zcGxp dCgiPSIpOw0KICAgICAgICAgIHBhcmFtTmFtZSA9IHByb3BlcnR5WzBdLnRvTG93 ZXJDYXNlKCk7DQogICAgICAgICAgcGFyYW1WYWwgPSBwcm9wZXJ0eVsxXTsNCg0K ICAgICAgICAgIHN3aXRjaCAocGFyYW1OYW1lLnJlcGxhY2UoL1xzL2dpLCIiKSkg eyAgLy8gdHJpbSBvdXQgc3BhY2VzDQogICAgICAgICAgICAgIGNhc2UgIiI6IGJy ZWFrOyAgIC8vIHRocm93IGF3YXkgbmFtZWxlc3MgcGFyYW1ldGVyDQogICAgICAg ICAgICAgIGNhc2UgInRpdGxlIjogIHRoaXMudGl0bGUgPSBwYXJhbVZhbDsgYnJl YWs7DQogICAgICAgICAgICAgIGNhc2UgInByb2oiOiAgIHRoaXMucHJvak5hbWUg PSAgcGFyYW1WYWwucmVwbGFjZSgvXHMvZ2ksIiIpOyBicmVhazsNCiAgICAgICAg ICAgICAgY2FzZSAidW5pdHMiOiAgdGhpcy51bml0cyA9IHBhcmFtVmFsLnJlcGxh Y2UoL1xzL2dpLCIiKTsgYnJlYWs7DQogICAgICAgICAgICAgIGNhc2UgImRhdHVt IjogIHRoaXMuZGF0dW1Db2RlID0gcGFyYW1WYWwucmVwbGFjZSgvXHMvZ2ksIiIp OyBicmVhazsNCiAgICAgICAgICAgICAgY2FzZSAibmFkZ3JpZHMiOiB0aGlzLm5h Z3JpZHMgPSBwYXJhbVZhbC5yZXBsYWNlKC9ccy9naSwiIik7IGJyZWFrOw0KICAg ICAgICAgICAgICBjYXNlICJlbGxwcyI6ICB0aGlzLmVsbHBzID0gcGFyYW1WYWwu cmVwbGFjZSgvXHMvZ2ksIiIpOyBicmVhazsNCiAgICAgICAgICAgICAgY2FzZSAi YSI6ICAgICAgdGhpcy5hID0gIHBhcnNlRmxvYXQocGFyYW1WYWwpOyBicmVhazsg IC8vIHNlbWktbWFqb3IgcmFkaXVzDQogICAgICAgICAgICAgIGNhc2UgImIiOiAg ICAgIHRoaXMuYiA9ICBwYXJzZUZsb2F0KHBhcmFtVmFsKTsgYnJlYWs7ICAvLyBz ZW1pLW1pbm9yIHJhZGl1cw0KICAgICAgICAgICAgICAvLyBER1IgMjAwNy0xMS0y MA0KICAgICAgICAgICAgICBjYXNlICJyZiI6ICAgICB0aGlzLnJmID0gcGFyc2VG bG9hdChwYXJhbVZhbCk7IGJyZWFrOyAvLyBpbnZlcnNlIGZsYXR0ZW5pbmcgcmY9 IGEvKGEtYikNCiAgICAgICAgICAgICAgY2FzZSAibGF0XzAiOiAgdGhpcy5sYXQw ID0gcGFyYW1WYWwqUHJvajRqcy5jb21tb24uRDJSOyBicmVhazsgICAgICAgIC8v IHBoaTAsIGNlbnRyYWwgbGF0aXR1ZGUNCiAgICAgICAgICAgICAgY2FzZSAibGF0 XzEiOiAgdGhpcy5sYXQxID0gcGFyYW1WYWwqUHJvajRqcy5jb21tb24uRDJSOyBi cmVhazsgICAgICAgIC8vc3RhbmRhcmQgcGFyYWxsZWwgMQ0KICAgICAgICAgICAg ICBjYXNlICJsYXRfMiI6ICB0aGlzLmxhdDIgPSBwYXJhbVZhbCpQcm9qNGpzLmNv bW1vbi5EMlI7IGJyZWFrOyAgICAgICAgLy9zdGFuZGFyZCBwYXJhbGxlbCAyDQog ICAgICAgICAgICAgIGNhc2UgImxhdF90cyI6IHRoaXMubGF0X3RzID0gcGFyYW1W YWwqUHJvajRqcy5jb21tb24uRDJSOyBicmVhazsgICAgICAvLyB1c2VkIGluIG1l cmMgYW5kIGVxYw0KICAgICAgICAgICAgICBjYXNlICJsb25fMCI6ICB0aGlzLmxv bmcwID0gcGFyYW1WYWwqUHJvajRqcy5jb21tb24uRDJSOyBicmVhazsgICAgICAg Ly8gbGFtMCwgY2VudHJhbCBsb25naXR1ZGUNCiAgICAgICAgICAgICAgY2FzZSAi YWxwaGEiOiAgdGhpcy5hbHBoYSA9ICBwYXJzZUZsb2F0KHBhcmFtVmFsKSpQcm9q NGpzLmNvbW1vbi5EMlI7IGJyZWFrOyAgLy9mb3Igc29tZXJjIHByb2plY3Rpb24N CiAgICAgICAgICAgICAgY2FzZSAibG9uYyI6ICAgdGhpcy5sb25nYyA9IHBhcmFt VmFsKlByb2o0anMuY29tbW9uLkQyUjsgYnJlYWs7ICAgICAgIC8vZm9yIHNvbWVy YyBwcm9qZWN0aW9uDQogICAgICAgICAgICAgIGNhc2UgInhfMCI6ICAgIHRoaXMu eDAgPSBwYXJzZUZsb2F0KHBhcmFtVmFsKTsgYnJlYWs7ICAvLyBmYWxzZSBlYXN0 aW5nDQogICAgICAgICAgICAgIGNhc2UgInlfMCI6ICAgIHRoaXMueTAgPSBwYXJz ZUZsb2F0KHBhcmFtVmFsKTsgYnJlYWs7ICAvLyBmYWxzZSBub3J0aGluZw0KICAg ICAgICAgICAgICBjYXNlICJrXzAiOiAgICB0aGlzLmswID0gcGFyc2VGbG9hdChw YXJhbVZhbCk7IGJyZWFrOyAgLy8gcHJvamVjdGlvbiBzY2FsZSBmYWN0b3INCiAg ICAgICAgICAgICAgY2FzZSAiayI6ICAgICAgdGhpcy5rMCA9IHBhcnNlRmxvYXQo cGFyYW1WYWwpOyBicmVhazsgIC8vIGJvdGggZm9ybXMgcmV0dXJuZWQNCiAgICAg ICAgICAgICAgY2FzZSAiUl9BIjogICAgdGhpcy5SID0gdHJ1ZTsgYnJlYWs7ICAg Ly9TcGhlcm9pZCByYWRpdXMgDQogICAgICAgICAgICAgIGNhc2UgInpvbmUiOiAg IHRoaXMuem9uZSA9IHBhcnNlSW50KHBhcmFtVmFsKTsgYnJlYWs7ICAvLyBVVE0g Wm9uZQ0KICAgICAgICAgICAgICBjYXNlICJzb3V0aCI6ICAgdGhpcy51dG1Tb3V0 aCA9IHRydWU7IGJyZWFrOyAgLy8gVVRNIG5vcnRoL3NvdXRoDQogICAgICAgICAg ICAgIGNhc2UgInRvd2dzODQiOnRoaXMuZGF0dW1fcGFyYW1zID0gcGFyYW1WYWwu c3BsaXQoIiwiKTsgYnJlYWs7DQogICAgICAgICAgICAgIGNhc2UgInRvX21ldGVy IjogdGhpcy50b19tZXRlciA9IHBhcnNlRmxvYXQocGFyYW1WYWwpOyBicmVhazsg Ly8gY2FydGVzaWFuIHNjYWxpbmcNCiAgICAgICAgICAgICAgY2FzZSAiZnJvbV9n cmVlbndpY2giOiB0aGlzLmZyb21fZ3JlZW53aWNoID0gcGFyYW1WYWwqUHJvajRq cy5jb21tb24uRDJSOyBicmVhazsNCiAgICAgICAgICAgICAgLy8gREdSIDIwMDgt MDctMDkgOiBpZiBwbSBpcyBub3QgYSB3ZWxsLWtub3duIHByaW1lIG1lcmlkaWFu IHRha2UNCiAgICAgICAgICAgICAgLy8gdGhlIHZhbHVlIGluc3RlYWQgb2YgMC4w LCB0aGVuIGNvbnZlcnQgdG8gcmFkaWFucw0KICAgICAgICAgICAgICBjYXNlICJw bSI6ICAgICBwYXJhbVZhbCA9IHBhcmFtVmFsLnJlcGxhY2UoL1xzL2dpLCIiKTsN CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mcm9tX2dyZWVud2lj aCA9IFByb2o0anMuUHJpbWVNZXJpZGlhbltwYXJhbVZhbF0gPw0KICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBQcm9qNGpzLlByaW1lTWVyaWRpYW5bcGFy YW1WYWxdIDogcGFyc2VGbG9hdChwYXJhbVZhbCk7DQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHRoaXMuZnJvbV9ncmVlbndpY2ggKj0gUHJvajRqcy5jb21t b24uRDJSOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQog ICAgICAgICAgICAgIGNhc2UgIm5vX2RlZnMiOiBicmVhazsgDQogICAgICAgICAg ICAgIGRlZmF1bHQ6IC8vYWxlcnQoIlVucmVjb2duaXplZCBwYXJhbWV0ZXI6ICIg KyBwYXJhbU5hbWUpOw0KICAgICAgICAgIH0gLy8gc3dpdGNoKCkNCiAgICAgIH0g Ly8gZm9yIHBhcmFtQXJyYXkNCiAgICAgIHRoaXMuZGVyaXZlQ29uc3RhbnRzKCk7 DQogIH0sDQoNCi8qKg0KICogRnVuY3Rpb246IGRlcml2ZUNvbnN0YW50cw0KICog U2V0cyBzZXZlcmFsIGRlcml2ZWQgY29uc3RhbnQgdmFsdWVzIGFuZCBpbml0aWFs aXphdGlvbiBvZiBkYXR1bSBhbmQgZWxsaXBzZQ0KICogICAgIHBhcmFtZXRlcnMu DQogKg0KICovDQogIGRlcml2ZUNvbnN0YW50czogZnVuY3Rpb24oKSB7DQogICAg ICBpZiAodGhpcy5uYWdyaWRzID09ICdAbnVsbCcpIHRoaXMuZGF0dW1Db2RlID0g J25vbmUnOw0KICAgICAgaWYgKHRoaXMuZGF0dW1Db2RlICYmIHRoaXMuZGF0dW1D b2RlICE9ICdub25lJykgew0KICAgICAgICB2YXIgZGF0dW1EZWYgPSBQcm9qNGpz LkRhdHVtW3RoaXMuZGF0dW1Db2RlXTsNCiAgICAgICAgaWYgKGRhdHVtRGVmKSB7 DQogICAgICAgICAgdGhpcy5kYXR1bV9wYXJhbXMgPSBkYXR1bURlZi50b3dnczg0 LnNwbGl0KCcsJyk7DQogICAgICAgICAgdGhpcy5lbGxwcyA9IGRhdHVtRGVmLmVs bGlwc2U7DQogICAgICAgICAgdGhpcy5kYXR1bU5hbWUgPSBkYXR1bURlZi5kYXR1 bU5hbWUgPyBkYXR1bURlZi5kYXR1bU5hbWUgOiB0aGlzLmRhdHVtQ29kZTsNCiAg ICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKCF0aGlzLmEpIHsgICAgLy8gZG8g d2UgaGF2ZSBhbiBlbGxpcHNvaWQ/DQogICAgICAgICAgdmFyIGVsbGlwc2UgPSBQ cm9qNGpzLkVsbGlwc29pZFt0aGlzLmVsbHBzXSA/IFByb2o0anMuRWxsaXBzb2lk W3RoaXMuZWxscHNdIDogUHJvajRqcy5FbGxpcHNvaWRbJ1dHUzg0J107DQogICAg ICAgICAgUHJvajRqcy5leHRlbmQodGhpcywgZWxsaXBzZSk7DQogICAgICB9DQog ICAgICBpZiAodGhpcy5yZiAmJiAhdGhpcy5iKSB0aGlzLmIgPSAoMS4wIC0gMS4w L3RoaXMucmYpICogdGhpcy5hOw0KICAgICAgaWYgKE1hdGguYWJzKHRoaXMuYSAt IHRoaXMuYik8UHJvajRqcy5jb21tb24uRVBTTE4pIHsNCiAgICAgICAgdGhpcy5z cGhlcmUgPSB0cnVlOw0KICAgICAgICB0aGlzLmI9IHRoaXMuYTsNCiAgICAgIH0N CiAgICAgIHRoaXMuYTIgPSB0aGlzLmEgKiB0aGlzLmE7ICAgICAgICAgIC8vIHVz ZWQgaW4gZ2VvY2VudHJpYw0KICAgICAgdGhpcy5iMiA9IHRoaXMuYiAqIHRoaXMu YjsgICAgICAgICAgLy8gdXNlZCBpbiBnZW9jZW50cmljDQogICAgICB0aGlzLmVz ID0gKHRoaXMuYTItdGhpcy5iMikvdGhpcy5hMjsgIC8vIGUgXiAyDQogICAgICB0 aGlzLmUgPSBNYXRoLnNxcnQodGhpcy5lcyk7ICAgICAgICAvLyBlY2NlbnRyaWNp dHkNCiAgICAgIGlmICh0aGlzLlJfQSkgew0KICAgICAgICB0aGlzLmEgKj0gMS4g LSB0aGlzLmVzICogKFByb2o0anMuY29tbW9uLlNJWFRIICsgdGhpcy5lcyAqIChQ cm9qNGpzLlJBNCArIHRoaXMuZXMgKiBQcm9qNGpzLlJBNikpOw0KICAgICAgICB0 aGlzLmEyID0gdGhpcy5hICogdGhpcy5hOw0KICAgICAgICB0aGlzLmIyID0gdGhp cy5iICogdGhpcy5iOw0KICAgICAgICB0aGlzLmVzID0gMC47DQogICAgICB9DQog ICAgICB0aGlzLmVwMj0odGhpcy5hMi10aGlzLmIyKS90aGlzLmIyOyAvLyB1c2Vk IGluIGdlb2NlbnRyaWMNCiAgICAgIGlmICghdGhpcy5rMCkgdGhpcy5rMCA9IDEu MDsgICAgLy9kZWZhdWx0IHZhbHVlDQoNCiAgICAgIHRoaXMuZGF0dW0gPSBuZXcg UHJvajRqcy5kYXR1bSh0aGlzKTsNCiAgfQ0KfSk7DQoNClByb2o0anMuUHJvai5s b25nbGF0ID0gew0KICBpbml0OiBmdW5jdGlvbigpIHsNCiAgICAvL25vLW9wIGZv ciBsb25nbGF0DQogIH0sDQogIGZvcndhcmQ6IGZ1bmN0aW9uKHB0KSB7DQogICAg Ly9pZGVudGl0eSB0cmFuc2Zvcm0NCiAgICByZXR1cm4gcHQ7DQogIH0sDQogIGlu dmVyc2U6IGZ1bmN0aW9uKHB0KSB7DQogICAgLy9pZGVudGl0eSB0cmFuc2Zvcm0N CiAgICByZXR1cm4gcHQ7DQogIH0NCn07DQoNCi8qKg0KICBQcm9qNGpzLmRlZnMg aXMgYSBjb2xsZWN0aW9uIG9mIGNvb3JkaW5hdGUgc3lzdGVtIGRlZmluaXRpb24g b2JqZWN0cyBpbiB0aGUgDQogIFBST0ouNCBjb21tYW5kIGxpbmUgZm9ybWF0Lg0K ICBHZW5lcmFsbHkgYSBkZWYgaXMgYWRkZWQgYnkgbWVhbnMgb2YgYSBzZXBhcmF0 ZSAuanMgZmlsZSBmb3IgZXhhbXBsZToNCg0KICAgIDxTQ1JJUFQgdHlwZT0idGV4 dC9qYXZhc2NyaXB0IiBzcmM9ImRlZnMvRVBTRzI2OTEyLmpzIj48L1NDUklQVD4N Cg0KICBkZWYgaXMgYSBDUyBkZWZpbml0aW9uIGluIFBST0ouNCBXS1QgZm9ybWF0 LCBmb3IgZXhhbXBsZToNCiAgICArcHJvaj0idG1lcmMiICAgLy9sb25nbGF0LCBl dGMuDQogICAgK2E9bWFqb3JSYWRpdXMNCiAgICArYj1taW5vclJhZGl1cw0KICAg ICtsYXQwPXNvbWVudW1iZXINCiAgICArbG9uZz1zb21lbnVtYmVyDQoqLw0KUHJv ajRqcy5kZWZzID0gew0KICAvLyBUaGVzZSBhcmUgc28gd2lkZWx5IHVzZWQsIHdl J2xsIGdvIGFoZWFkIGFuZCB0aHJvdyB0aGVtIGluDQogIC8vIHdpdGhvdXQgcmVx dWlyaW5nIGEgc2VwYXJhdGUgLmpzIGZpbGUNCiAgJ1dHUzg0JzogIit0aXRsZT1s b25nL2xhdDpXR1M4NCArcHJvaj1sb25nbGF0ICtlbGxwcz1XR1M4NCArZGF0dW09 V0dTODQgK3VuaXRzPWRlZ3JlZXMiLA0KICAnRVBTRzo0MzI2JzogIit0aXRsZT1s b25nL2xhdDpXR1M4NCArcHJvaj1sb25nbGF0ICthPTYzNzgxMzcuMCArYj02MzU2 NzUyLjMxNDI0NTE4ICtlbGxwcz1XR1M4NCArZGF0dW09V0dTODQgK3VuaXRzPWRl Z3JlZXMiLA0KICAnRVBTRzo0MjY5JzogIit0aXRsZT1sb25nL2xhdDpOQUQ4MyAr cHJvaj1sb25nbGF0ICthPTYzNzgxMzcuMCArYj02MzU2NzUyLjMxNDE0MDM2ICtl bGxwcz1HUlM4MCArZGF0dW09TkFEODMgK3VuaXRzPWRlZ3JlZXMiIA0KfTsNCi8v K2E9NjM3ODEzNy4wICtiPTYzNTY3NTIuMzE0MjQ1MTggK2VsbHBzPVdHUzg0ICtk YXR1bT1XR1M4NCIsDQpQcm9qNGpzLmNvbW1vbiA9IHsNCiAgUEkgOiAzLjE0MTU5 MjY1MzU4OTc5MzIzOCwgLy9NYXRoLlBJLA0KICBIQUxGX1BJIDogMS41NzA3OTYz MjY3OTQ4OTY2MTksIC8vTWF0aC5QSSowLjUsDQogIFRXT19QSSA6IDYuMjgzMTg1 MzA3MTc5NTg2NDc3LCAvL01hdGguUEkqMiwNCiAgRk9SVFBJIDogMC43ODUzOTgx NjMzOTc0NDgzMywNCiAgUjJEIDogNTcuMjk1Nzc5NTEzMDgyMzIwODgsDQogIEQy UiA6IDAuMDE3NDUzMjkyNTE5OTQzMjk1NzcsDQogIFNFQ19UT19SQUQgOiA0Ljg0 ODEzNjgxMTA5NTM1OTkzNTg5OTE0MTAyMzU3ZS02LCAvKiBTRUNfVE9fUkFEID0g UGkvMTgwLzM2MDAgKi8NCiAgRVBTTE4gOiAxLjBlLTEwLA0KICBNQVhfSVRFUiA6 IDIwLA0KICAvLyBmb2xsb3dpbmcgY29uc3RhbnRzIGZyb20gZ2VvY2VudC5jDQog IENPU182N1A1IDogMC4zODI2ODM0MzIzNjUwODk3NywgIC8qIGNvc2luZSBvZiA2 Ny41IGRlZ3JlZXMgKi8NCiAgQURfQyA6IDEuMDAyNjAwMCwgICAgICAgICAgICAg ICAgLyogVG9tcyByZWdpb24gMSBjb25zdGFudCAqLw0KDQogIC8qIGRhdHVtX3R5 cGUgdmFsdWVzICovDQogIFBKRF9VTktOT1dOICA6IDAsDQogIFBKRF8zUEFSQU0g ICA6IDEsDQogIFBKRF83UEFSQU0gICA6IDIsDQogIFBKRF9HUklEU0hJRlQ6IDMs DQogIFBKRF9XR1M4NCAgICA6IDQsICAgLy8gV0dTODQgb3IgZXF1aXZhbGVudA0K ICBQSkRfTk9EQVRVTSAgOiA1LCAgIC8vIFdHUzg0IG9yIGVxdWl2YWxlbnQNCiAg U1JTX1dHUzg0X1NFTUlNQUpPUiA6IDYzNzgxMzcuMCwgIC8vIG9ubHkgdXNlZCBp biBncmlkIHNoaWZ0IHRyYW5zZm9ybXMNCg0KICAvLyBlbGxpcG9pZCBwal9zZXRf ZWxsLmMNCiAgU0lYVEggOiAuMTY2NjY2NjY2NjY2NjY2NjY2NywgLyogMS82ICov DQogIFJBNCAgIDogLjA0NzIyMjIyMjIyMjIyMjIyMjIyLCAvKiAxNy8zNjAgKi8N CiAgUkE2ICAgOiAuMDIyMTU2MDg0NjU2MDg0NjU2MDgsIC8qIDY3LzMwMjQgKi8N CiAgUlY0ICAgOiAuMDY5NDQ0NDQ0NDQ0NDQ0NDQ0NDQsIC8qIDUvNzIgKi8NCiAg UlY2ICAgOiAuMDQyNDM4MjcxNjA0OTM4MjcxNjAsIC8qIDU1LzEyOTYgKi8NCg0K Ly8gRnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgY29uc3RhbnQgc21hbGwgbSB3aGlj aCBpcyB0aGUgcmFkaXVzIG9mDQovLyAgIGEgcGFyYWxsZWwgb2YgbGF0aXR1ZGUs IHBoaSwgZGl2aWRlZCBieSB0aGUgc2VtaW1ham9yIGF4aXMuDQovLyAtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQ0KICBtc2ZueiA6IGZ1bmN0aW9uKGVjY2VudCwgc2lucGhpLCBj b3NwaGkpIHsNCiAgICAgIHZhciBjb24gPSBlY2NlbnQgKiBzaW5waGk7DQogICAg ICByZXR1cm4gY29zcGhpLyhNYXRoLnNxcnQoMS4wIC0gY29uICogY29uKSk7DQog IH0sDQoNCi8vIEZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIGNvbnN0YW50IHNtYWxs IHQgZm9yIHVzZSBpbiB0aGUgZm9yd2FyZA0KLy8gICBjb21wdXRhdGlvbnMgaW4g dGhlIExhbWJlcnQgQ29uZm9ybWFsIENvbmljIGFuZCB0aGUgUG9sYXINCi8vICAg U3RlcmVvZ3JhcGhpYyBwcm9qZWN0aW9ucy4NCi8vIC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t DQogIHRzZm56IDogZnVuY3Rpb24oZWNjZW50LCBwaGksIHNpbnBoaSkgew0KICAg IHZhciBjb24gPSBlY2NlbnQgKiBzaW5waGk7DQogICAgdmFyIGNvbSA9IC41ICog ZWNjZW50Ow0KICAgIGNvbiA9IE1hdGgucG93KCgoMS4wIC0gY29uKSAvICgxLjAg KyBjb24pKSwgY29tKTsNCiAgICByZXR1cm4gKE1hdGgudGFuKC41ICogKHRoaXMu SEFMRl9QSSAtIHBoaSkpL2Nvbik7DQogIH0sDQoNCi8vIEZ1bmN0aW9uIHRvIGNv bXB1dGUgdGhlIGxhdGl0dWRlIGFuZ2xlLCBwaGkyLCBmb3IgdGhlIGludmVyc2Ug b2YgdGhlDQovLyAgIExhbWJlcnQgQ29uZm9ybWFsIENvbmljIGFuZCBQb2xhciBT dGVyZW9ncmFwaGljIHByb2plY3Rpb25zLg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K ICBwaGkyeiA6IGZ1bmN0aW9uKGVjY2VudCwgdHMpIHsNCiAgICB2YXIgZWNjbnRo ID0gLjUgKiBlY2NlbnQ7DQogICAgdmFyIGNvbiwgZHBoaTsNCiAgICB2YXIgcGhp ID0gdGhpcy5IQUxGX1BJIC0gMiAqIE1hdGguYXRhbih0cyk7DQogICAgZm9yIChp ID0gMDsgaSA8PSAxNTsgaSsrKSB7DQogICAgICBjb24gPSBlY2NlbnQgKiBNYXRo LnNpbihwaGkpOw0KICAgICAgZHBoaSA9IHRoaXMuSEFMRl9QSSAtIDIgKiBNYXRo LmF0YW4odHMgKihNYXRoLnBvdygoKDEuMCAtIGNvbikvKDEuMCArIGNvbikpLGVj Y250aCkpKSAtIHBoaTsNCiAgICAgIHBoaSArPSBkcGhpOw0KICAgICAgaWYgKE1h dGguYWJzKGRwaGkpIDw9IC4wMDAwMDAwMDAxKSByZXR1cm4gcGhpOw0KICAgIH0N CiAgICBhbGVydCgicGhpMnogaGFzIE5vQ29udmVyZ2VuY2UiKTsNCiAgICByZXR1 cm4gKC05OTk5KTsNCiAgfSwNCg0KLyogRnVuY3Rpb24gdG8gY29tcHV0ZSBjb25z dGFudCBzbWFsbCBxIHdoaWNoIGlzIHRoZSByYWRpdXMgb2YgYSANCiAgIHBhcmFs bGVsIG9mIGxhdGl0dWRlLCBwaGksIGRpdmlkZWQgYnkgdGhlIHNlbWltYWpvciBh eGlzLiANCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIHFzZm56IDogZnVuY3Rpb24oZWNjZW50 LHNpbnBoaSxjb3NwaGkpIHsNCiAgICB2YXIgY29uOw0KICAgIGlmIChlY2NlbnQg PiAxLjBlLTcpIHsNCiAgICAgIGNvbiA9IGVjY2VudCAqIHNpbnBoaTsNCiAgICAg IHJldHVybiAoKCAxLjAtIGVjY2VudCAqIGVjY2VudCkgKiAoc2lucGhpIC8oMS4w IC0gY29uICogY29uKSAtICguNS9lY2NlbnQpKk1hdGgubG9nKCgxLjAgLSBjb24p LygxLjAgKyBjb24pKSkpOw0KICAgIH0gZWxzZSB7DQogICAgICByZXR1cm4oMi4w ICogc2lucGhpKTsNCiAgICB9DQogIH0sDQoNCi8qIEZ1bmN0aW9uIHRvIGVsaW1p bmF0ZSByb3VuZG9mZiBlcnJvcnMgaW4gYXNpbg0KLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIGFzaW56IDogZnVuY3Rp b24oeCkgew0KICAgIGlmIChNYXRoLmFicyh4KT4xLjApIHsNCiAgICAgIHg9KHg+ MS4wKT8xLjA6LTEuMDsNCiAgICB9DQogICAgcmV0dXJuIE1hdGguYXNpbih4KTsN CiAgfSwNCg0KLy8gZm9sbG93aW5nIGZ1bmN0aW9ucyBmcm9tIGdjdHBjIGNwcm9q LmMgZm9yIHRyYW5zdmVyc2UgbWVyY2F0b3IgcHJvamVjdGlvbnMNCiAgZTBmbiA6 IGZ1bmN0aW9uKHgpIHtyZXR1cm4oMS4wLTAuMjUqeCooMS4wK3gvMTYuMCooMy4w KzEuMjUqeCkpKTt9LA0KICBlMWZuIDogZnVuY3Rpb24oeCkge3JldHVybigwLjM3 NSp4KigxLjArMC4yNSp4KigxLjArMC40Njg3NSp4KSkpO30sDQogIGUyZm4gOiBm dW5jdGlvbih4KSB7cmV0dXJuKDAuMDU4NTkzNzUqeCp4KigxLjArMC43NSp4KSk7 fSwNCiAgZTNmbiA6IGZ1bmN0aW9uKHgpIHtyZXR1cm4oeCp4KngqKDM1LjAvMzA3 Mi4wKSk7fSwNCiAgbWxmbiA6IGZ1bmN0aW9uKGUwLGUxLGUyLGUzLHBoaSkge3Jl dHVybihlMCpwaGktZTEqTWF0aC5zaW4oMi4wKnBoaSkrZTIqTWF0aC5zaW4oNC4w KnBoaSktZTMqTWF0aC5zaW4oNi4wKnBoaSkpO30sDQoNCiAgc3JhdCA6IGZ1bmN0 aW9uKGVzaW5wLCBleHApIHsNCiAgICByZXR1cm4oTWF0aC5wb3coKDEuMC1lc2lu cCkvKDEuMCtlc2lucCksIGV4cCkpOw0KICB9LA0KDQovLyBGdW5jdGlvbiB0byBy ZXR1cm4gdGhlIHNpZ24gb2YgYW4gYXJndW1lbnQNCiAgc2lnbiA6IGZ1bmN0aW9u KHgpIHsgaWYgKHggPCAwLjApIHJldHVybigtMSk7IGVsc2UgcmV0dXJuKDEpO30s DQoNCi8vIEZ1bmN0aW9uIHRvIGFkanVzdCBsb25naXR1ZGUgdG8gLTE4MCB0byAx ODA7IGlucHV0IGluIHJhZGlhbnMNCiAgYWRqdXN0X2xvbiA6IGZ1bmN0aW9uKHgp IHsNCiAgICB4ID0gKE1hdGguYWJzKHgpIDwgdGhpcy5QSSkgPyB4OiAoeCAtICh0 aGlzLnNpZ24oeCkqdGhpcy5UV09fUEkpICk7DQogICAgcmV0dXJuIHg7DQogIH0s DQoNCi8vIElHTkYgLSBER1IgOiBhbGdvcml0aG1zIHVzZWQgYnkgSUdOIEZyYW5j ZQ0KDQovLyBGdW5jdGlvbiB0byBhZGp1c3QgbGF0aXR1ZGUgdG8gLTkwIHRvIDkw OyBpbnB1dCBpbiByYWRpYW5zDQogIGFkanVzdF9sYXQgOiBmdW5jdGlvbih4KSB7 DQogICAgeD0gKE1hdGguYWJzKHgpIDwgdGhpcy5IQUxGX1BJKSA/IHg6ICh4IC0g KHRoaXMuc2lnbih4KSp0aGlzLlBJKSApOw0KICAgIHJldHVybiB4Ow0KICB9LA0K DQovLyBMYXRpdHVkZSBJc29tZXRyaXF1ZSAtIGNsb3NlIHRvIHRzZm56IC4uLg0K ICBsYXRpc28gOiBmdW5jdGlvbihlY2NlbnQsIHBoaSwgc2lucGhpKQ0KICB7DQog ICAgaWYgKE1hdGguYWJzKHBoaSkgPiB0aGlzLkhBTEZfUEkpIHJldHVybiArTnVt YmVyLk5hTjsNCiAgICBpZiAocGhpPT10aGlzLkhBTEZfUEkpIHJldHVybiBOdW1i ZXIuUE9TSVRJVkVfSU5GSU5JVFk7DQogICAgaWYgKHBoaT09LTEuMCp0aGlzLkhB TEZfUEkpIHJldHVybiAtMS4wKk51bWJlci5QT1NJVElWRV9JTkZJTklUWTsNCg0K ICAgIHZhciBjb249IGVjY2VudCpzaW5waGk7DQogICAgcmV0dXJuIE1hdGgubG9n KE1hdGgudGFuKCh0aGlzLkhBTEZfUEkrcGhpKS8yLjApKStlY2NlbnQqTWF0aC5s b2coKDEuMC1jb24pLygxLjArY29uKSkvMi4wOw0KICB9LA0KDQogIGZMIDogZnVu Y3Rpb24oeCxMKSB7DQogICAgcmV0dXJuIDIuMCpNYXRoLmF0YW4oeCpNYXRoLmV4 cChMKSkgLSB0aGlzLkhBTEZfUEk7DQogIH0sDQoNCi8vIEludmVyc2UgTGF0aXR1 ZGUgSXNvbWV0cmlxdWUgLSBjbG9zZSB0byBwaDJ6DQogIGludmxhdGlzbyA6IGZ1 bmN0aW9uKGVjY2VudCwgdHMpIHsNCiAgICB2YXIgcGhpPSB0aGlzLmZMKDEuMCx0 cyk7DQogICAgdmFyIElwaGk9IDAuMDsNCiAgICB2YXIgY29uPSAwLjA7DQogICAg ZG8gew0KICAgICAgSXBoaT0gcGhpOw0KICAgICAgY29uPSBlY2NlbnQqTWF0aC5z aW4oSXBoaSk7DQogICAgICBwaGk9IHRoaXMuZkwoTWF0aC5leHAoZWNjZW50Kk1h dGgubG9nKCgxLjArY29uKS8oMS4wLWNvbikpLzIuMCksdHMpDQogICAgfSB3aGls ZSAoTWF0aC5hYnMocGhpLUlwaGkpPjEuMGUtMTIpOw0KICAgIHJldHVybiBwaGk7 DQogIH0sDQoNCi8vIE5lZWRlZCBmb3IgR2F1c3MgTGFib3JkZQ0KLy8gT3JpZ2lu YWw6ICBEZW5pcyBNYWthcm92IChpbmZvQGJpbmFyeXRoaW5ncy5jb20pDQovLyBX ZWIgU2l0ZTogIGh0dHA6Ly93d3cuYmluYXJ5dGhpbmdzLmNvbQ0KICBzaW5oIDog ZnVuY3Rpb24oeCkNCiAgew0KICAgIHZhciByPSBNYXRoLmV4cCh4KTsNCiAgICBy PSAoci0xLjAvcikvMi4wOw0KICAgIHJldHVybiByOw0KICB9LA0KDQogIGNvc2gg OiBmdW5jdGlvbih4KQ0KICB7DQogICAgdmFyIHI9IE1hdGguZXhwKHgpOw0KICAg IHI9IChyKzEuMC9yKS8yLjA7DQogICAgcmV0dXJuIHI7DQogIH0sDQoNCiAgdGFu aCA6IGZ1bmN0aW9uKHgpDQogIHsNCiAgICB2YXIgcj0gTWF0aC5leHAoeCk7DQog ICAgcj0gKHItMS4wL3IpLyhyKzEuMC9yKTsNCiAgICByZXR1cm4gcjsNCiAgfSwN Cg0KICBhc2luaCA6IGZ1bmN0aW9uKHgpDQogIHsNCiAgICB2YXIgcz0gKHg+PSAw PyAxLjA6LTEuMCk7DQogICAgcmV0dXJuIHMqKE1hdGgubG9nKCBNYXRoLmFicyh4 KSArIE1hdGguc3FydCh4KngrMS4wKSApKTsNCiAgfSwNCg0KICBhY29zaCA6IGZ1 bmN0aW9uKHgpDQogIHsNCiAgICByZXR1cm4gMi4wKk1hdGgubG9nKE1hdGguc3Fy dCgoeCsxLjApLzIuMCkgKyBNYXRoLnNxcnQoKHgtMS4wKS8yLjApKTsNCiAgfSwN Cg0KICBhdGFuaCA6IGZ1bmN0aW9uKHgpDQogIHsNCiAgICByZXR1cm4gTWF0aC5s b2coKHgtMS4wKS8oeCsxLjApKS8yLjA7DQogIH0sDQoNCi8vIEdyYW5kZSBOb3Jt YWxlDQogIGdOIDogZnVuY3Rpb24oYSxlLHNpbnBoaSkNCiAgew0KICAgIHZhciB0 ZW1wPSBlKnNpbnBoaTsNCiAgICByZXR1cm4gYS9NYXRoLnNxcnQoMS4wIC0gdGVt cCp0ZW1wKTsNCiAgfQ0KDQp9Ow0KDQovKiogZGF0dW0gb2JqZWN0DQoqLw0KUHJv ajRqcy5kYXR1bSA9IFByb2o0anMuQ2xhc3Moew0KDQogIGluaXRpYWxpemUgOiBm dW5jdGlvbihwcm9qKSB7DQogICAgdGhpcy5kYXR1bV90eXBlID0gUHJvajRqcy5j b21tb24uUEpEX1dHUzg0OyAgIC8vZGVmYXVsdCBzZXR0aW5nDQogICAgaWYgKHBy b2ouZGF0dW1Db2RlICYmIHByb2ouZGF0dW1Db2RlID09ICdub25lJykgew0KICAg ICAgdGhpcy5kYXR1bV90eXBlID0gUHJvajRqcy5jb21tb24uUEpEX05PREFUVU07 DQogICAgfQ0KICAgIGlmIChwcm9qICYmIHByb2ouZGF0dW1fcGFyYW1zKSB7DQog ICAgICBmb3IgKHZhciBpPTA7IGk8cHJvai5kYXR1bV9wYXJhbXMubGVuZ3RoOyBp KyspIHsNCiAgICAgICAgcHJvai5kYXR1bV9wYXJhbXNbaV09cGFyc2VGbG9hdChw cm9qLmRhdHVtX3BhcmFtc1tpXSk7DQogICAgICB9DQogICAgICBpZiAocHJvai5k YXR1bV9wYXJhbXNbMF0gIT0gMCB8fCBwcm9qLmRhdHVtX3BhcmFtc1sxXSAhPSAw IHx8IHByb2ouZGF0dW1fcGFyYW1zWzJdICE9IDAgKSB7DQogICAgICAgIHRoaXMu ZGF0dW1fdHlwZSA9IFByb2o0anMuY29tbW9uLlBKRF8zUEFSQU07DQogICAgICB9 DQogICAgICBpZiAocHJvai5kYXR1bV9wYXJhbXMubGVuZ3RoID4gMykgew0KICAg ICAgICBpZiAocHJvai5kYXR1bV9wYXJhbXNbM10gIT0gMCB8fCBwcm9qLmRhdHVt X3BhcmFtc1s0XSAhPSAwIHx8DQogICAgICAgICAgICBwcm9qLmRhdHVtX3BhcmFt c1s1XSAhPSAwIHx8IHByb2ouZGF0dW1fcGFyYW1zWzZdICE9IDAgKSB7DQogICAg ICAgICAgdGhpcy5kYXR1bV90eXBlID0gUHJvajRqcy5jb21tb24uUEpEXzdQQVJB TTsNCiAgICAgICAgICBwcm9qLmRhdHVtX3BhcmFtc1szXSAqPSBQcm9qNGpzLmNv bW1vbi5TRUNfVE9fUkFEOw0KICAgICAgICAgIHByb2ouZGF0dW1fcGFyYW1zWzRd ICo9IFByb2o0anMuY29tbW9uLlNFQ19UT19SQUQ7DQogICAgICAgICAgcHJvai5k YXR1bV9wYXJhbXNbNV0gKj0gUHJvajRqcy5jb21tb24uU0VDX1RPX1JBRDsNCiAg ICAgICAgICBwcm9qLmRhdHVtX3BhcmFtc1s2XSA9IChwcm9qLmRhdHVtX3BhcmFt c1s2XS8xMDAwMDAwLjApICsgMS4wOw0KICAgICAgICB9DQogICAgICB9DQogICAg fQ0KICAgIGlmIChwcm9qKSB7DQogICAgICB0aGlzLmEgPSBwcm9qLmE7ICAgIC8v ZGF0dW0gb2JqZWN0IGFsc28gdXNlcyB0aGVzZSB2YWx1ZXMNCiAgICAgIHRoaXMu YiA9IHByb2ouYjsNCiAgICAgIHRoaXMuZXMgPSBwcm9qLmVzOw0KICAgICAgdGhp cy5lcDIgPSBwcm9qLmVwMjsNCiAgICAgIHRoaXMuZGF0dW1fcGFyYW1zID0gcHJv ai5kYXR1bV9wYXJhbXM7DQogICAgfQ0KICB9LA0KDQogIC8qKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqLw0KICAvLyBjc19jb21wYXJlX2RhdHVtcygpDQogIC8vICAgUmV0dXJucyAx IChUUlVFKSBpZiB0aGUgdHdvIGRhdHVtcyBtYXRjaCwgb3RoZXJ3aXNlIDAgKEZB TFNFKS4NCiAgY29tcGFyZV9kYXR1bXMgOiBmdW5jdGlvbiggZGVzdCApIHsNCiAg ICBpZiggdGhpcy5kYXR1bV90eXBlICE9IGRlc3QuZGF0dW1fdHlwZSApIHsNCiAg ICAgIHJldHVybiBmYWxzZTsgLy8gZmFsc2UsIGRhdHVtcyBhcmUgbm90IGVxdWFs DQogICAgfSBlbHNlIGlmKCB0aGlzLmEgIT0gZGVzdC5hIHx8IE1hdGguYWJzKHRo aXMuZXMtZGVzdC5lcykgPiAwLjAwMDAwMDAwMDA1MCApIHsNCiAgICAgIC8vIHRo ZSB0b2xlcmVuY2UgZm9yIGVzIGlzIHRvIGVuc3VyZSB0aGF0IEdSUzgwIGFuZCBX R1M4NA0KICAgICAgLy8gYXJlIGNvbnNpZGVyZWQgaWRlbnRpY2FsDQogICAgICBy ZXR1cm4gZmFsc2U7DQogICAgfSBlbHNlIGlmKCB0aGlzLmRhdHVtX3R5cGUgPT0g UHJvajRqcy5jb21tb24uUEpEXzNQQVJBTSApIHsNCiAgICAgIHJldHVybiAodGhp cy5kYXR1bV9wYXJhbXNbMF0gPT0gZGVzdC5kYXR1bV9wYXJhbXNbMF0NCiAgICAg ICAgICAgICAgJiYgdGhpcy5kYXR1bV9wYXJhbXNbMV0gPT0gZGVzdC5kYXR1bV9w YXJhbXNbMV0NCiAgICAgICAgICAgICAgJiYgdGhpcy5kYXR1bV9wYXJhbXNbMl0g PT0gZGVzdC5kYXR1bV9wYXJhbXNbMl0pOw0KICAgIH0gZWxzZSBpZiggdGhpcy5k YXR1bV90eXBlID09IFByb2o0anMuY29tbW9uLlBKRF83UEFSQU0gKSB7DQogICAg ICByZXR1cm4gKHRoaXMuZGF0dW1fcGFyYW1zWzBdID09IGRlc3QuZGF0dW1fcGFy YW1zWzBdDQogICAgICAgICAgICAgICYmIHRoaXMuZGF0dW1fcGFyYW1zWzFdID09 IGRlc3QuZGF0dW1fcGFyYW1zWzFdDQogICAgICAgICAgICAgICYmIHRoaXMuZGF0 dW1fcGFyYW1zWzJdID09IGRlc3QuZGF0dW1fcGFyYW1zWzJdDQogICAgICAgICAg ICAgICYmIHRoaXMuZGF0dW1fcGFyYW1zWzNdID09IGRlc3QuZGF0dW1fcGFyYW1z WzNdDQogICAgICAgICAgICAgICYmIHRoaXMuZGF0dW1fcGFyYW1zWzRdID09IGRl c3QuZGF0dW1fcGFyYW1zWzRdDQogICAgICAgICAgICAgICYmIHRoaXMuZGF0dW1f cGFyYW1zWzVdID09IGRlc3QuZGF0dW1fcGFyYW1zWzVdDQogICAgICAgICAgICAg ICYmIHRoaXMuZGF0dW1fcGFyYW1zWzZdID09IGRlc3QuZGF0dW1fcGFyYW1zWzZd KTsNCiAgICB9IGVsc2UgaWYoIHRoaXMuZGF0dW1fdHlwZSA9PSBQcm9qNGpzLmNv bW1vbi5QSkRfR1JJRFNISUZUICkgew0KICAgICAgcmV0dXJuIHN0cmNtcCggcGpf cGFyYW0odGhpcy5wYXJhbXMsInNuYWRncmlkcyIpLnMsDQogICAgICAgICAgICAg ICAgICAgICBwal9wYXJhbShkZXN0LnBhcmFtcywic25hZGdyaWRzIikucyApID09 IDA7DQogICAgfSBlbHNlIHsNCiAgICAgIHJldHVybiB0cnVlOyAvLyBkYXR1bXMg YXJlIGVxdWFsDQogICAgfQ0KICB9LCAvLyBjc19jb21wYXJlX2RhdHVtcygpDQoN CiAgLyoNCiAgICogVGhlIGZ1bmN0aW9uIENvbnZlcnRfR2VvZGV0aWNfVG9fR2Vv Y2VudHJpYyBjb252ZXJ0cyBnZW9kZXRpYyBjb29yZGluYXRlcw0KICAgKiAobGF0 aXR1ZGUsIGxvbmdpdHVkZSwgYW5kIGhlaWdodCkgdG8gZ2VvY2VudHJpYyBjb29y ZGluYXRlcyAoWCwgWSwgWiksDQogICAqIGFjY29yZGluZyB0byB0aGUgY3VycmVu dCBlbGxpcHNvaWQgcGFyYW1ldGVycy4NCiAgICoNCiAgICogICAgTGF0aXR1ZGUg IDogR2VvZGV0aWMgbGF0aXR1ZGUgaW4gcmFkaWFucyAgICAgICAgICAgICAgICAg ICAgIChpbnB1dCkNCiAgICogICAgTG9uZ2l0dWRlIDogR2VvZGV0aWMgbG9uZ2l0 dWRlIGluIHJhZGlhbnMgICAgICAgICAgICAgICAgICAgIChpbnB1dCkNCiAgICog ICAgSGVpZ2h0ICAgIDogR2VvZGV0aWMgaGVpZ2h0LCBpbiBtZXRlcnMgICAgICAg ICAgICAgICAgICAgICAgIChpbnB1dCkNCiAgICogICAgWCAgICAgICAgIDogQ2Fs Y3VsYXRlZCBHZW9jZW50cmljIFggY29vcmRpbmF0ZSwgaW4gbWV0ZXJzICAgIChv dXRwdXQpDQogICAqICAgIFkgICAgICAgICA6IENhbGN1bGF0ZWQgR2VvY2VudHJp YyBZIGNvb3JkaW5hdGUsIGluIG1ldGVycyAgICAob3V0cHV0KQ0KICAgKiAgICBa ICAgICAgICAgOiBDYWxjdWxhdGVkIEdlb2NlbnRyaWMgWiBjb29yZGluYXRlLCBp biBtZXRlcnMgICAgKG91dHB1dCkNCiAgICoNCiAgICovDQogIGdlb2RldGljX3Rv X2dlb2NlbnRyaWMgOiBmdW5jdGlvbihwKSB7DQogICAgdmFyIExvbmdpdHVkZSA9 IHAueDsNCiAgICB2YXIgTGF0aXR1ZGUgPSBwLnk7DQogICAgdmFyIEhlaWdodCA9 IHAueiA/IHAueiA6IDA7ICAgLy9aIHZhbHVlIG5vdCBhbHdheXMgc3VwcGxpZWQN CiAgICB2YXIgWDsgIC8vIG91dHB1dA0KICAgIHZhciBZOw0KICAgIHZhciBaOw0K DQogICAgdmFyIEVycm9yX0NvZGU9MDsgIC8vICBHRU9DRU5UX05PX0VSUk9SOw0K ICAgIHZhciBSbjsgICAgICAgICAgICAvKiAgRWFydGggcmFkaXVzIGF0IGxvY2F0 aW9uICAqLw0KICAgIHZhciBTaW5fTGF0OyAgICAgICAvKiAgTWF0aC5zaW4oTGF0 aXR1ZGUpICAqLw0KICAgIHZhciBTaW4yX0xhdDsgICAgICAvKiAgU3F1YXJlIG9m IE1hdGguc2luKExhdGl0dWRlKSAgKi8NCiAgICB2YXIgQ29zX0xhdDsgICAgICAg LyogIE1hdGguY29zKExhdGl0dWRlKSAgKi8NCg0KICAgIC8qDQogICAgKiogRG9u J3QgYmxvdyB1cCBpZiBMYXRpdHVkZSBpcyBqdXN0IGEgbGl0dGxlIG91dCBvZiB0 aGUgdmFsdWUNCiAgICAqKiByYW5nZSBhcyBpdCBtYXkganVzdCBiZSBhIHJvdW5k aW5nIGlzc3VlLiAgQWxzbyByZW1vdmVkIGxvbmdpdHVkZQ0KICAgICoqIHRlc3Qs IGl0IHNob3VsZCBiZSB3cmFwcGVkIGJ5IE1hdGguY29zKCkgYW5kIE1hdGguc2lu KCkuICBORlcgZm9yIFBST0ouNCwgU2VwLzIwMDEuDQogICAgKi8NCiAgICBpZigg TGF0aXR1ZGUgPCAtUHJvajRqcy5jb21tb24uSEFMRl9QSSAmJiBMYXRpdHVkZSA+ IC0xLjAwMSAqIFByb2o0anMuY29tbW9uLkhBTEZfUEkgKSB7DQogICAgICAgIExh dGl0dWRlID0gLVByb2o0anMuY29tbW9uLkhBTEZfUEk7DQogICAgfSBlbHNlIGlm KCBMYXRpdHVkZSA+IFByb2o0anMuY29tbW9uLkhBTEZfUEkgJiYgTGF0aXR1ZGUg PCAxLjAwMSAqIFByb2o0anMuY29tbW9uLkhBTEZfUEkgKSB7DQogICAgICAgIExh dGl0dWRlID0gUHJvajRqcy5jb21tb24uSEFMRl9QSTsNCiAgICB9IGVsc2UgaWYg KChMYXRpdHVkZSA8IC1Qcm9qNGpzLmNvbW1vbi5IQUxGX1BJKSB8fCAoTGF0aXR1 ZGUgPiBQcm9qNGpzLmNvbW1vbi5IQUxGX1BJKSkgew0KICAgICAgLyogTGF0aXR1 ZGUgb3V0IG9mIHJhbmdlICovDQogICAgICBQcm9qNGpzLnJlcG9ydEVycm9yKCdn ZW9jZW50OmxhdCBvdXQgb2YgcmFuZ2U6JytMYXRpdHVkZSk7DQogICAgICByZXR1 cm4gbnVsbDsNCiAgICB9DQoNCiAgICBpZiAoTG9uZ2l0dWRlID4gUHJvajRqcy5j b21tb24uUEkpIExvbmdpdHVkZSAtPSAoMipQcm9qNGpzLmNvbW1vbi5QSSk7DQog ICAgU2luX0xhdCA9IE1hdGguc2luKExhdGl0dWRlKTsNCiAgICBDb3NfTGF0ID0g TWF0aC5jb3MoTGF0aXR1ZGUpOw0KICAgIFNpbjJfTGF0ID0gU2luX0xhdCAqIFNp bl9MYXQ7DQogICAgUm4gPSB0aGlzLmEgLyAoTWF0aC5zcXJ0KDEuMGUwIC0gdGhp cy5lcyAqIFNpbjJfTGF0KSk7DQogICAgWCA9IChSbiArIEhlaWdodCkgKiBDb3Nf TGF0ICogTWF0aC5jb3MoTG9uZ2l0dWRlKTsNCiAgICBZID0gKFJuICsgSGVpZ2h0 KSAqIENvc19MYXQgKiBNYXRoLnNpbihMb25naXR1ZGUpOw0KICAgIFogPSAoKFJu ICogKDEgLSB0aGlzLmVzKSkgKyBIZWlnaHQpICogU2luX0xhdDsNCg0KICAgIHAu eCA9IFg7DQogICAgcC55ID0gWTsNCiAgICBwLnogPSBaOw0KICAgIHJldHVybiBF cnJvcl9Db2RlOw0KICB9LCAvLyBjc19nZW9kZXRpY190b19nZW9jZW50cmljKCkN Cg0KDQogIGdlb2NlbnRyaWNfdG9fZ2VvZGV0aWMgOiBmdW5jdGlvbiAocCkgew0K LyogbG9jYWwgZGVmaW50aW9ucyBhbmQgdmFyaWFibGVzICovDQovKiBlbmQtY3Jp dGVyaXVtIG9mIGxvb3AsIGFjY3VyYWN5IG9mIHNpbihMYXRpdHVkZSkgKi8NCnZh ciBnZW5hdSA9IDEuRS0xMjsNCnZhciBnZW5hdTIgPSAoZ2VuYXUqZ2VuYXUpOw0K dmFyIG1heGl0ZXIgPSAzMDsNCg0KICAgIHZhciBQOyAgICAgICAgLyogZGlzdGFu Y2UgYmV0d2VlbiBzZW1pLW1pbm9yIGF4aXMgYW5kIGxvY2F0aW9uICovDQogICAg dmFyIFJSOyAgICAgICAvKiBkaXN0YW5jZSBiZXR3ZWVuIGNlbnRlciBhbmQgbG9j YXRpb24gKi8NCiAgICB2YXIgQ1Q7ICAgICAgIC8qIHNpbiBvZiBnZW9jZW50cmlj IGxhdGl0dWRlICovDQogICAgdmFyIFNUOyAgICAgICAvKiBjb3Mgb2YgZ2VvY2Vu dHJpYyBsYXRpdHVkZSAqLw0KICAgIHZhciBSWDsNCiAgICB2YXIgUks7DQogICAg dmFyIFJOOyAgICAgICAvKiBFYXJ0aCByYWRpdXMgYXQgbG9jYXRpb24gKi8NCiAg ICB2YXIgQ1BISTA7ICAgIC8qIGNvcyBvZiBzdGFydCBvciBvbGQgZ2VvZGV0aWMg bGF0aXR1ZGUgaW4gaXRlcmF0aW9ucyAqLw0KICAgIHZhciBTUEhJMDsgICAgLyog c2luIG9mIHN0YXJ0IG9yIG9sZCBnZW9kZXRpYyBsYXRpdHVkZSBpbiBpdGVyYXRp b25zICovDQogICAgdmFyIENQSEk7ICAgICAvKiBjb3Mgb2Ygc2VhcmNoZWQgZ2Vv ZGV0aWMgbGF0aXR1ZGUgKi8NCiAgICB2YXIgU1BISTsgICAgIC8qIHNpbiBvZiBz ZWFyY2hlZCBnZW9kZXRpYyBsYXRpdHVkZSAqLw0KICAgIHZhciBTRFBISTsgICAg LyogZW5kLWNyaXRlcml1bTogYWRkaXRpb24tdGhlb3JlbSBvZiBzaW4oTGF0aXR1 ZGUoaXRlciktTGF0aXR1ZGUoaXRlci0xKSkgKi8NCiAgICB2YXIgQXRfUG9sZTsg ICAgIC8qIGluZGljYXRlcyBsb2NhdGlvbiBpcyBpbiBwb2xhciByZWdpb24gKi8N CiAgICB2YXIgaXRlcjsgICAgICAgIC8qICMgb2YgY29udGlub3VzIGl0ZXJhdGlv biwgbWF4LiAzMCBpcyBhbHdheXMgZW5vdWdoIChzLmEuKSAqLw0KDQogICAgdmFy IFggPSBwLng7DQogICAgdmFyIFkgPSBwLnk7DQogICAgdmFyIFogPSBwLnogPyBw LnogOiAwLjA7ICAgLy9aIHZhbHVlIG5vdCBhbHdheXMgc3VwcGxpZWQNCiAgICB2 YXIgTG9uZ2l0dWRlOw0KICAgIHZhciBMYXRpdHVkZTsNCiAgICB2YXIgSGVpZ2h0 Ow0KDQogICAgQXRfUG9sZSA9IGZhbHNlOw0KICAgIFAgPSBNYXRoLnNxcnQoWCpY K1kqWSk7DQogICAgUlIgPSBNYXRoLnNxcnQoWCpYK1kqWStaKlopOw0KDQovKiAg ICAgIHNwZWNpYWwgY2FzZXMgZm9yIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgKi8N CiAgICBpZiAoUC90aGlzLmEgPCBnZW5hdSkgew0KDQovKiAgc3BlY2lhbCBjYXNl LCBpZiBQPTAuIChYPTAuLCBZPTAuKSAqLw0KICAgICAgICBBdF9Qb2xlID0gdHJ1 ZTsNCiAgICAgICAgTG9uZ2l0dWRlID0gMC4wOw0KDQovKiAgaWYgKFgsWSxaKT0o MC4sMC4sMC4pIHRoZW4gSGVpZ2h0IGJlY29tZXMgc2VtaS1taW5vciBheGlzDQog KiAgb2YgZWxsaXBzb2lkICg9Y2VudGVyIG9mIG1hc3MpLCBMYXRpdHVkZSBiZWNv bWVzIFBJLzIgKi8NCiAgICAgICAgaWYgKFJSL3RoaXMuYSA8IGdlbmF1KSB7DQog ICAgICAgICAgICBMYXRpdHVkZSA9IFByb2o0anMuY29tbW9uLkhBTEZfUEk7DQog ICAgICAgICAgICBIZWlnaHQgICA9IC10aGlzLmI7DQogICAgICAgICAgICByZXR1 cm47DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KLyogIGVsbGlwc29pZGFsIChn ZW9kZXRpYykgbG9uZ2l0dWRlDQogKiAgaW50ZXJ2YWw6IC1QSSA8IExvbmdpdHVk ZSA8PSArUEkgKi8NCiAgICAgICAgTG9uZ2l0dWRlPU1hdGguYXRhbjIoWSxYKTsN CiAgICB9DQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiBGb2xsb3dpbmcgaXRlcmF0 aXZlIGFsZ29yaXRobSB3YXMgZGV2ZWxvcHBlZCBieQ0KICogIkluc3RpdHV0IGb8 ciBFcmRtZXNzdW5nIiwgVW5pdmVyc2l0eSBvZiBIYW5ub3ZlciwgSnVseSAxOTg4 Lg0KICogSW50ZXJuZXQ6IHd3dy5pZmUudW5pLWhhbm5vdmVyLmRlDQogKiBJdGVy YXRpdmUgY29tcHV0YXRpb24gb2YgQ1BISSxTUEhJIGFuZCBIZWlnaHQuDQogKiBJ dGVyYXRpb24gb2YgQ1BISSBhbmQgU1BISSB0byAxMCoqLTEyIHJhZGlhbiByZXNw Lg0KICogMioxMCoqLTcgYXJjc2VjLg0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqLw0K ICAgIENUID0gWi9SUjsNCiAgICBTVCA9IFAvUlI7DQogICAgUlggPSAxLjAvTWF0 aC5zcXJ0KDEuMC10aGlzLmVzKigyLjAtdGhpcy5lcykqU1QqU1QpOw0KICAgIENQ SEkwID0gU1QqKDEuMC10aGlzLmVzKSpSWDsNCiAgICBTUEhJMCA9IENUKlJYOw0K ICAgIGl0ZXIgPSAwOw0KDQovKiBsb29wIHRvIGZpbmQgc2luKExhdGl0dWRlKSBy ZXNwLiBMYXRpdHVkZQ0KICogdW50aWwgfHNpbihMYXRpdHVkZShpdGVyKS1MYXRp dHVkZShpdGVyLTEpKXwgPCBnZW5hdSAqLw0KICAgIGRvDQogICAgew0KICAgICAg ICBpdGVyKys7DQogICAgICAgIFJOID0gdGhpcy5hL01hdGguc3FydCgxLjAtdGhp cy5lcypTUEhJMCpTUEhJMCk7DQoNCi8qICBlbGxpcHNvaWRhbCAoZ2VvZGV0aWMp IGhlaWdodCAqLw0KICAgICAgICBIZWlnaHQgPSBQKkNQSEkwK1oqU1BISTAtUk4q KDEuMC10aGlzLmVzKlNQSEkwKlNQSEkwKTsNCg0KICAgICAgICBSSyA9IHRoaXMu ZXMqUk4vKFJOK0hlaWdodCk7DQogICAgICAgIFJYID0gMS4wL01hdGguc3FydCgx LjAtUksqKDIuMC1SSykqU1QqU1QpOw0KICAgICAgICBDUEhJID0gU1QqKDEuMC1S SykqUlg7DQogICAgICAgIFNQSEkgPSBDVCpSWDsNCiAgICAgICAgU0RQSEkgPSBT UEhJKkNQSEkwLUNQSEkqU1BISTA7DQogICAgICAgIENQSEkwID0gQ1BISTsNCiAg ICAgICAgU1BISTAgPSBTUEhJOw0KICAgIH0NCiAgICB3aGlsZSAoU0RQSEkqU0RQ SEkgPiBnZW5hdTIgJiYgaXRlciA8IG1heGl0ZXIpOw0KDQovKiAgICAgIGVsbGlw c29pZGFsIChnZW9kZXRpYykgbGF0aXR1ZGUgKi8NCiAgICBMYXRpdHVkZT1NYXRo LmF0YW4oU1BISS9NYXRoLmFicyhDUEhJKSk7DQoNCiAgICBwLnggPSBMb25naXR1 ZGU7DQogICAgcC55ID0gTGF0aXR1ZGU7DQogICAgcC56ID0gSGVpZ2h0Ow0KICAg IHJldHVybiBwOw0KICB9LCAvLyBjc19nZW9jZW50cmljX3RvX2dlb2RldGljKCkN Cg0KICAvKiogQ29udmVydF9HZW9jZW50cmljX1RvX0dlb2RldGljDQogICAqIFRo ZSBtZXRob2QgdXNlZCBoZXJlIGlzIGRlcml2ZWQgZnJvbSAnQW4gSW1wcm92ZWQg QWxnb3JpdGhtIGZvcg0KICAgKiBHZW9jZW50cmljIHRvIEdlb2RldGljIENvb3Jk aW5hdGUgQ29udmVyc2lvbicsIGJ5IFJhbHBoIFRvbXMsIEZlYiAxOTk2DQogICAq Lw0KICBnZW9jZW50cmljX3RvX2dlb2RldGljX25vbml0ZXIgOiBmdW5jdGlvbiAo cCkgew0KICAgIHZhciBYID0gcC54Ow0KICAgIHZhciBZID0gcC55Ow0KICAgIHZh ciBaID0gcC56ID8gcC56IDogMDsgICAvL1ogdmFsdWUgbm90IGFsd2F5cyBzdXBw bGllZA0KICAgIHZhciBMb25naXR1ZGU7DQogICAgdmFyIExhdGl0dWRlOw0KICAg IHZhciBIZWlnaHQ7DQoNCiAgICB2YXIgVzsgICAgICAgIC8qIGRpc3RhbmNlIGZy b20gWiBheGlzICovDQogICAgdmFyIFcyOyAgICAgICAvKiBzcXVhcmUgb2YgZGlz dGFuY2UgZnJvbSBaIGF4aXMgKi8NCiAgICB2YXIgVDA7ICAgICAgIC8qIGluaXRp YWwgZXN0aW1hdGUgb2YgdmVydGljYWwgY29tcG9uZW50ICovDQogICAgdmFyIFQx OyAgICAgICAvKiBjb3JyZWN0ZWQgZXN0aW1hdGUgb2YgdmVydGljYWwgY29tcG9u ZW50ICovDQogICAgdmFyIFMwOyAgICAgICAvKiBpbml0aWFsIGVzdGltYXRlIG9m IGhvcml6b250YWwgY29tcG9uZW50ICovDQogICAgdmFyIFMxOyAgICAgICAvKiBj b3JyZWN0ZWQgZXN0aW1hdGUgb2YgaG9yaXpvbnRhbCBjb21wb25lbnQgKi8NCiAg ICB2YXIgU2luX0IwOyAgIC8qIE1hdGguc2luKEIwKSwgQjAgaXMgZXN0aW1hdGUg b2YgQm93cmluZyBhdXggdmFyaWFibGUgKi8NCiAgICB2YXIgU2luM19CMDsgIC8q IGN1YmUgb2YgTWF0aC5zaW4oQjApICovDQogICAgdmFyIENvc19CMDsgICAvKiBN YXRoLmNvcyhCMCkgKi8NCiAgICB2YXIgU2luX3AxOyAgIC8qIE1hdGguc2luKHBo aTEpLCBwaGkxIGlzIGVzdGltYXRlZCBsYXRpdHVkZSAqLw0KICAgIHZhciBDb3Nf cDE7ICAgLyogTWF0aC5jb3MocGhpMSkgKi8NCiAgICB2YXIgUm47ICAgICAgIC8q IEVhcnRoIHJhZGl1cyBhdCBsb2NhdGlvbiAqLw0KICAgIHZhciBTdW07ICAgICAg LyogbnVtZXJhdG9yIG9mIE1hdGguY29zKHBoaTEpICovDQogICAgdmFyIEF0X1Bv bGU7ICAvKiBpbmRpY2F0ZXMgbG9jYXRpb24gaXMgaW4gcG9sYXIgcmVnaW9uICov DQoNCiAgICBYID0gcGFyc2VGbG9hdChYKTsgIC8vIGNhc3QgZnJvbSBzdHJpbmcg dG8gZmxvYXQNCiAgICBZID0gcGFyc2VGbG9hdChZKTsNCiAgICBaID0gcGFyc2VG bG9hdChaKTsNCg0KICAgIEF0X1BvbGUgPSBmYWxzZTsNCiAgICBpZiAoWCAhPSAw LjApDQogICAgew0KICAgICAgICBMb25naXR1ZGUgPSBNYXRoLmF0YW4yKFksWCk7 DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIGlmIChZID4gMCkNCiAg ICAgICAgew0KICAgICAgICAgICAgTG9uZ2l0dWRlID0gUHJvajRqcy5jb21tb24u SEFMRl9QSTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChZIDwgMCkNCiAg ICAgICAgew0KICAgICAgICAgICAgTG9uZ2l0dWRlID0gLVByb2o0anMuY29tbW9u LkhBTEZfUEk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQog ICAgICAgICAgICBBdF9Qb2xlID0gdHJ1ZTsNCiAgICAgICAgICAgIExvbmdpdHVk ZSA9IDAuMDsNCiAgICAgICAgICAgIGlmIChaID4gMC4wKQ0KICAgICAgICAgICAg eyAgLyogbm9ydGggcG9sZSAqLw0KICAgICAgICAgICAgICAgIExhdGl0dWRlID0g UHJvajRqcy5jb21tb24uSEFMRl9QSTsNCiAgICAgICAgICAgIH0NCiAgICAgICAg ICAgIGVsc2UgaWYgKFogPCAwLjApDQogICAgICAgICAgICB7ICAvKiBzb3V0aCBw b2xlICovDQogICAgICAgICAgICAgICAgTGF0aXR1ZGUgPSAtUHJvajRqcy5jb21t b24uSEFMRl9QSTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAg ICAgICAgICAgIHsgIC8qIGNlbnRlciBvZiBlYXJ0aCAqLw0KICAgICAgICAgICAg ICAgIExhdGl0dWRlID0gUHJvajRqcy5jb21tb24uSEFMRl9QSTsNCiAgICAgICAg ICAgICAgICBIZWlnaHQgPSAtdGhpcy5iOw0KICAgICAgICAgICAgICAgIHJldHVy bjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBXMiA9IFgq WCArIFkqWTsNCiAgICBXID0gTWF0aC5zcXJ0KFcyKTsNCiAgICBUMCA9IFogKiBQ cm9qNGpzLmNvbW1vbi5BRF9DOw0KICAgIFMwID0gTWF0aC5zcXJ0KFQwICogVDAg KyBXMik7DQogICAgU2luX0IwID0gVDAgLyBTMDsNCiAgICBDb3NfQjAgPSBXIC8g UzA7DQogICAgU2luM19CMCA9IFNpbl9CMCAqIFNpbl9CMCAqIFNpbl9CMDsNCiAg ICBUMSA9IFogKyB0aGlzLmIgKiB0aGlzLmVwMiAqIFNpbjNfQjA7DQogICAgU3Vt ID0gVyAtIHRoaXMuYSAqIHRoaXMuZXMgKiBDb3NfQjAgKiBDb3NfQjAgKiBDb3Nf QjA7DQogICAgUzEgPSBNYXRoLnNxcnQoVDEqVDEgKyBTdW0gKiBTdW0pOw0KICAg IFNpbl9wMSA9IFQxIC8gUzE7DQogICAgQ29zX3AxID0gU3VtIC8gUzE7DQogICAg Um4gPSB0aGlzLmEgLyBNYXRoLnNxcnQoMS4wIC0gdGhpcy5lcyAqIFNpbl9wMSAq IFNpbl9wMSk7DQogICAgaWYgKENvc19wMSA+PSBQcm9qNGpzLmNvbW1vbi5DT1Nf NjdQNSkNCiAgICB7DQogICAgICAgIEhlaWdodCA9IFcgLyBDb3NfcDEgLSBSbjsN CiAgICB9DQogICAgZWxzZSBpZiAoQ29zX3AxIDw9IC1Qcm9qNGpzLmNvbW1vbi5D T1NfNjdQNSkNCiAgICB7DQogICAgICAgIEhlaWdodCA9IFcgLyAtQ29zX3AxIC0g Um47DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIEhlaWdodCA9IFog LyBTaW5fcDEgKyBSbiAqICh0aGlzLmVzIC0gMS4wKTsNCiAgICB9DQogICAgaWYg KEF0X1BvbGUgPT0gZmFsc2UpDQogICAgew0KICAgICAgICBMYXRpdHVkZSA9IE1h dGguYXRhbihTaW5fcDEgLyBDb3NfcDEpOw0KICAgIH0NCg0KICAgIHAueCA9IExv bmdpdHVkZTsNCiAgICBwLnkgPSBMYXRpdHVkZTsNCiAgICBwLnogPSBIZWlnaHQ7 DQogICAgcmV0dXJuIHA7DQogIH0sIC8vIGdlb2NlbnRyaWNfdG9fZ2VvZGV0aWNf bm9uaXRlcigpDQoNCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogIC8vIHBqX2dlb2Nl bnRpY190b193Z3M4NCggcCApDQogIC8vICBwID0gcG9pbnQgdG8gdHJhbnNmb3Jt IGluIGdlb2NlbnRyaWMgY29vcmRpbmF0ZXMgKHgseSx6KQ0KICBnZW9jZW50cmlj X3RvX3dnczg0IDogZnVuY3Rpb24gKCBwICkgew0KDQogICAgaWYoIHRoaXMuZGF0 dW1fdHlwZSA9PSBQcm9qNGpzLmNvbW1vbi5QSkRfM1BBUkFNICkNCiAgICB7DQog ICAgICAvLyBpZiggeFtpb10gPT0gSFVHRV9WQUwgKQ0KICAgICAgLy8gICAgY29u dGludWU7DQogICAgICBwLnggKz0gdGhpcy5kYXR1bV9wYXJhbXNbMF07DQogICAg ICBwLnkgKz0gdGhpcy5kYXR1bV9wYXJhbXNbMV07DQogICAgICBwLnogKz0gdGhp cy5kYXR1bV9wYXJhbXNbMl07DQoNCiAgICB9DQogICAgZWxzZSBpZiAodGhpcy5k YXR1bV90eXBlID09IFByb2o0anMuY29tbW9uLlBKRF83UEFSQU0pDQogICAgew0K ICAgICAgdmFyIER4X0JGID10aGlzLmRhdHVtX3BhcmFtc1swXTsNCiAgICAgIHZh ciBEeV9CRiA9dGhpcy5kYXR1bV9wYXJhbXNbMV07DQogICAgICB2YXIgRHpfQkYg PXRoaXMuZGF0dW1fcGFyYW1zWzJdOw0KICAgICAgdmFyIFJ4X0JGID10aGlzLmRh dHVtX3BhcmFtc1szXTsNCiAgICAgIHZhciBSeV9CRiA9dGhpcy5kYXR1bV9wYXJh bXNbNF07DQogICAgICB2YXIgUnpfQkYgPXRoaXMuZGF0dW1fcGFyYW1zWzVdOw0K ICAgICAgdmFyIE1fQkYgID10aGlzLmRhdHVtX3BhcmFtc1s2XTsNCiAgICAgIC8v IGlmKCB4W2lvXSA9PSBIVUdFX1ZBTCApDQogICAgICAvLyAgICBjb250aW51ZTsN CiAgICAgIHZhciB4X291dCA9IE1fQkYqKCAgICAgICBwLnggLSBSel9CRipwLnkg KyBSeV9CRipwLnopICsgRHhfQkY7DQogICAgICB2YXIgeV9vdXQgPSBNX0JGKigg UnpfQkYqcC54ICsgICAgICAgcC55IC0gUnhfQkYqcC56KSArIER5X0JGOw0KICAg ICAgdmFyIHpfb3V0ID0gTV9CRiooLVJ5X0JGKnAueCArIFJ4X0JGKnAueSArICAg ICAgIHAueikgKyBEel9CRjsNCiAgICAgIHAueCA9IHhfb3V0Ow0KICAgICAgcC55 ID0geV9vdXQ7DQogICAgICBwLnogPSB6X291dDsNCiAgICB9DQogIH0sIC8vIGNz X2dlb2NlbnRyaWNfdG9fd2dzODQNCg0KICAvKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiAg Ly8gcGpfZ2VvY2VudGljX2Zyb21fd2dzODQoKQ0KICAvLyAgY29vcmRpbmF0ZSBz eXN0ZW0gZGVmaW5pdGlvbiwNCiAgLy8gIHBvaW50IHRvIHRyYW5zZm9ybSBpbiBn ZW9jZW50cmljIGNvb3JkaW5hdGVzICh4LHkseikNCiAgZ2VvY2VudHJpY19mcm9t X3dnczg0IDogZnVuY3Rpb24oIHAgKSB7DQoNCiAgICBpZiggdGhpcy5kYXR1bV90 eXBlID09IFByb2o0anMuY29tbW9uLlBKRF8zUEFSQU0gKQ0KICAgIHsNCiAgICAg IC8vaWYoIHhbaW9dID09IEhVR0VfVkFMICkNCiAgICAgIC8vICAgIGNvbnRpbnVl Ow0KICAgICAgcC54IC09IHRoaXMuZGF0dW1fcGFyYW1zWzBdOw0KICAgICAgcC55 IC09IHRoaXMuZGF0dW1fcGFyYW1zWzFdOw0KICAgICAgcC56IC09IHRoaXMuZGF0 dW1fcGFyYW1zWzJdOw0KDQogICAgfQ0KICAgIGVsc2UgaWYgKHRoaXMuZGF0dW1f dHlwZSA9PSBQcm9qNGpzLmNvbW1vbi5QSkRfN1BBUkFNKQ0KICAgIHsNCiAgICAg IHZhciBEeF9CRiA9dGhpcy5kYXR1bV9wYXJhbXNbMF07DQogICAgICB2YXIgRHlf QkYgPXRoaXMuZGF0dW1fcGFyYW1zWzFdOw0KICAgICAgdmFyIER6X0JGID10aGlz LmRhdHVtX3BhcmFtc1syXTsNCiAgICAgIHZhciBSeF9CRiA9dGhpcy5kYXR1bV9w YXJhbXNbM107DQogICAgICB2YXIgUnlfQkYgPXRoaXMuZGF0dW1fcGFyYW1zWzRd Ow0KICAgICAgdmFyIFJ6X0JGID10aGlzLmRhdHVtX3BhcmFtc1s1XTsNCiAgICAg IHZhciBNX0JGICA9dGhpcy5kYXR1bV9wYXJhbXNbNl07DQogICAgICB2YXIgeF90 bXAgPSAocC54IC0gRHhfQkYpIC8gTV9CRjsNCiAgICAgIHZhciB5X3RtcCA9IChw LnkgLSBEeV9CRikgLyBNX0JGOw0KICAgICAgdmFyIHpfdG1wID0gKHAueiAtIER6 X0JGKSAvIE1fQkY7DQogICAgICAvL2lmKCB4W2lvXSA9PSBIVUdFX1ZBTCApDQog ICAgICAvLyAgICBjb250aW51ZTsNCg0KICAgICAgcC54ID0gICAgICAgIHhfdG1w ICsgUnpfQkYqeV90bXAgLSBSeV9CRip6X3RtcDsNCiAgICAgIHAueSA9IC1Sel9C Rip4X3RtcCArICAgICAgIHlfdG1wICsgUnhfQkYqel90bXA7DQogICAgICBwLnog PSAgUnlfQkYqeF90bXAgLSBSeF9CRip5X3RtcCArICAgICAgIHpfdG1wOw0KICAg IH0gLy9jc19nZW9jZW50cmljX2Zyb21fd2dzODQoKQ0KICB9DQp9KTsNCg0KLyoq IHBvaW50IG9iamVjdCwgbm90aGluZyBmYW5jeSwganVzdCBhbGxvd3MgdmFsdWVz IHRvIGJlDQogICAgcGFzc2VkIGJhY2sgYW5kIGZvcnRoIGJ5IHJlZmVyZW5jZSBy YXRoZXIgdGhhbiBieSB2YWx1ZS4NCiAgICBPdGhlciBwb2ludCBjbGFzc2VzIG1h eSBiZSB1c2VkIGFzIGxvbmcgYXMgdGhleSBoYXZlDQogICAgeCBhbmQgeSBwcm9w ZXJ0aWVzLCB3aGljaCB3aWxsIGdldCBtb2RpZmllZCBpbiB0aGUgdHJhbnNmb3Jt IG1ldGhvZC4NCiovDQpQcm9qNGpzLlBvaW50ID0gUHJvajRqcy5DbGFzcyh7DQoN CiAgICAvKioNCiAgICAgKiBDb25zdHJ1Y3RvciEgUHJvajRqcy5Qb2ludA0KICAg ICAqDQogICAgICogUGFyYW1ldGVyczoNCiAgICAgKiAtIHgge2Zsb2F0fSBvciB7 QXJyYXl9IGVpdGhlciB0aGUgZmlyc3QgY29vcmRpbmF0ZXMgY29tcG9uZW50IG9y DQogICAgICogICAgIHRoZSBmdWxsIGNvb3JkaW5hdGVzDQogICAgICogLSB5IHtm bG9hdH0gdGhlIHNlY29uZCBjb21wb25lbnQNCiAgICAgKiAtIHoge2Zsb2F0fSB0 aGUgdGhpcmQgY29tcG9uZW50LCBvcHRpb25hbC4NCiAgICAgKi8NCiAgICBpbml0 aWFsaXplIDogZnVuY3Rpb24oeCx5LHopIHsNCiAgICAgIGlmICh0eXBlb2YgeCA9 PSAnb2JqZWN0Jykgew0KICAgICAgICB0aGlzLnggPSB4WzBdOw0KICAgICAgICB0 aGlzLnkgPSB4WzFdOw0KICAgICAgICB0aGlzLnogPSB4WzJdIHx8IDAuMDsNCiAg ICAgIH0gZWxzZSBpZiAodHlwZW9mIHggPT0gJ3N0cmluZycpIHsNCiAgICAgICAg dmFyIGNvb3JkcyA9IHguc3BsaXQoJywnKTsNCiAgICAgICAgdGhpcy54ID0gcGFy c2VGbG9hdChjb29yZHNbMF0pOw0KICAgICAgICB0aGlzLnkgPSBwYXJzZUZsb2F0 KGNvb3Jkc1sxXSk7DQogICAgICAgIHRoaXMueiA9IHBhcnNlRmxvYXQoY29vcmRz WzJdKSB8fCAwLjA7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLnggPSB4 Ow0KICAgICAgICB0aGlzLnkgPSB5Ow0KICAgICAgICB0aGlzLnogPSB6IHx8IDAu MDsNCiAgICAgIH0NCiAgICB9LA0KDQogICAgLyoqDQogICAgICogQVBJTWV0aG9k OiBjbG9uZQ0KICAgICAqIEJ1aWxkIGEgY29weSBvZiBhIFByb2o0anMuUG9pbnQg b2JqZWN0Lg0KICAgICAqDQogICAgICogUmV0dXJuOg0KICAgICAqIHtQcm9qNGpz fS5Qb2ludCB0aGUgY2xvbmVkIHBvaW50Lg0KICAgICAqLw0KICAgIGNsb25lIDog ZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gbmV3IFByb2o0anMuUG9pbnQodGhp cy54LCB0aGlzLnksIHRoaXMueik7DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAq IEFQSU1ldGhvZDogdG9TdHJpbmcNCiAgICAgKiBSZXR1cm4gYSByZWFkYWJsZSBz dHJpbmcgdmVyc2lvbiBvZiB0aGUgcG9pbnQNCiAgICAgKg0KICAgICAqIFJldHVy bjoNCiAgICAgKiB7U3RyaW5nfSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgUHJv ajRqcy5Qb2ludCBvYmplY3QuIA0KICAgICAqICAgICAgICAgICAoZXguIDxpPiJ4 PTUseT00MiI8L2k+KQ0KICAgICAqLw0KICAgIHRvU3RyaW5nIDogZnVuY3Rpb24o KSB7DQogICAgICAgIHJldHVybiAoIng9IiArIHRoaXMueCArICIseT0iICsgdGhp cy55KTsNCiAgICB9LA0KDQogICAgLyoqIA0KICAgICAqIEFQSU1ldGhvZDogdG9T aG9ydFN0cmluZw0KICAgICAqIFJldHVybiBhIHNob3J0IHN0cmluZyB2ZXJzaW9u IG9mIHRoZSBwb2ludC4NCiAgICAgKg0KICAgICAqIFJldHVybjoNCiAgICAgKiB7 U3RyaW5nfSBTaG9ydGVuZWQgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIFByb2o0 anMuUG9pbnQgb2JqZWN0LiANCiAgICAgKiAgICAgICAgIChleC4gPGk+IjUsIDQy IjwvaT4pDQogICAgICovDQogICAgdG9TaG9ydFN0cmluZyA6IGZ1bmN0aW9uKCkg ew0KICAgICAgICByZXR1cm4gKHRoaXMueCArICIsICIgKyB0aGlzLnkpOw0KICAg IH0NCn0pOw0KDQpQcm9qNGpzLlByaW1lTWVyaWRpYW4gPSB7DQogICAgImdyZWVu d2ljaCI6IDAuMCwgICAgICAgICAgICAgICAvLyIwZEUiLA0KICAgICJsaXNib24i OiAgICAgLTkuMTMxOTA2MTExMTExLCAgIC8vIjlkMDcnNTQuODYyXCJXIiwNCiAg ICAicGFyaXMiOiAgICAgICAyLjMzNzIyOTE2NjY2NywgICAvLyIyZDIwJzE0LjAy NVwiRSIsDQogICAgImJvZ290YSI6ICAgIC03NC4wODA5MTY2NjY2NjcsICAvLyI3 NGQwNCc1MS4zXCJXIiwNCiAgICAibWFkcmlkIjogICAgIC0zLjY4NzkzODg4ODg4 OSwgIC8vIjNkNDEnMTYuNThcIlciLA0KICAgICJyb21lIjogICAgICAgMTIuNDUy MzMzMzMzMzMzLCAgLy8iMTJkMjcnOC40XCJFIiwNCiAgICAiYmVybiI6ICAgICAg ICA3LjQzOTU4MzMzMzMzMywgIC8vIjdkMjYnMjIuNVwiRSIsDQogICAgImpha2Fy dGEiOiAgIDEwNi44MDc3MTk0NDQ0NDQsICAvLyIxMDZkNDgnMjcuNzlcIkUiLA0K ICAgICJmZXJybyI6ICAgICAtMTcuNjY2NjY2NjY2NjY3LCAgLy8iMTdkNDAnVyIs DQogICAgImJydXNzZWxzIjogICAgNC4zNjc5NzUsICAgICAgICAvLyI0ZDIyJzQu NzFcIkUiLA0KICAgICJzdG9ja2hvbG0iOiAgMTguMDU4Mjc3Nzc3Nzc4LCAgLy8i MThkMycyOS44XCJFIiwNCiAgICAiYXRoZW5zIjogICAgIDIzLjcxNjMzNzUsICAg ICAgIC8vIjIzZDQyJzU4LjgxNVwiRSIsDQogICAgIm9zbG8iOiAgICAgICAxMC43 MjI5MTY2NjY2NjcgICAvLyIxMGQ0MycyMi41XCJFIg0KfTsNCg0KUHJvajRqcy5F bGxpcHNvaWQgPSB7DQogICJNRVJJVCI6IHthOjYzNzgxMzcuMCwgcmY6Mjk4LjI1 NywgZWxsaXBzZU5hbWU6Ik1FUklUIDE5ODMifSwNCiAgIlNHUzg1Ijoge2E6NjM3 ODEzNi4wLCByZjoyOTguMjU3LCBlbGxpcHNlTmFtZToiU292aWV0IEdlb2RldGlj IFN5c3RlbSA4NSJ9LA0KICAiR1JTODAiOiB7YTo2Mzc4MTM3LjAsIHJmOjI5OC4y NTcyMjIxMDEsIGVsbGlwc2VOYW1lOiJHUlMgMTk4MChJVUdHLCAxOTgwKSJ9LA0K ICAiSUFVNzYiOiB7YTo2Mzc4MTQwLjAsIHJmOjI5OC4yNTcsIGVsbGlwc2VOYW1l OiJJQVUgMTk3NiJ9LA0KICAiYWlyeSI6IHthOjYzNzc1NjMuMzk2LCBiOjYzNTYy NTYuOTEwLCBlbGxpcHNlTmFtZToiQWlyeSAxODMwIn0sDQogICJBUEw0LiI6IHth OjYzNzgxMzcsIHJmOjI5OC4yNSwgZWxsaXBzZU5hbWU6IkFwcGwuIFBoeXNpY3Mu IDE5NjUifSwNCiAgIk5XTDlEIjoge2E6NjM3ODE0NS4wLCByZjoyOTguMjUsIGVs bGlwc2VOYW1lOiJOYXZhbCBXZWFwb25zIExhYi4sIDE5NjUifSwNCiAgIm1vZF9h aXJ5Ijoge2E6NjM3NzM0MC4xODksIGI6NjM1NjAzNC40NDYsIGVsbGlwc2VOYW1l OiJNb2RpZmllZCBBaXJ5In0sDQogICJhbmRyYWUiOiB7YTo2Mzc3MTA0LjQzLCBy ZjozMDAuMCwgZWxsaXBzZU5hbWU6IkFuZHJhZSAxODc2IChEZW4uLCBJY2xuZC4p In0sDQogICJhdXN0X1NBIjoge2E6NjM3ODE2MC4wLCByZjoyOTguMjUsIGVsbGlw c2VOYW1lOiJBdXN0cmFsaWFuIE5hdGwgJiBTLiBBbWVyLiAxOTY5In0sDQogICJH UlM2NyI6IHthOjYzNzgxNjAuMCwgcmY6Mjk4LjI0NzE2NzQyNzAsIGVsbGlwc2VO YW1lOiJHUlMgNjcoSVVHRyAxOTY3KSJ9LA0KICAiYmVzc2VsIjoge2E6NjM3NzM5 Ny4xNTUsIHJmOjI5OS4xNTI4MTI4LCBlbGxpcHNlTmFtZToiQmVzc2VsIDE4NDEi fSwNCiAgImJlc3NfbmFtIjoge2E6NjM3NzQ4My44NjUsIHJmOjI5OS4xNTI4MTI4 LCBlbGxpcHNlTmFtZToiQmVzc2VsIDE4NDEgKE5hbWliaWEpIn0sDQogICJjbHJr NjYiOiB7YTo2Mzc4MjA2LjQsIGI6NjM1NjU4My44LCBlbGxpcHNlTmFtZToiQ2xh cmtlIDE4NjYifSwNCiAgImNscms4MCI6IHthOjYzNzgyNDkuMTQ1LCByZjoyOTMu NDY2MywgZWxsaXBzZU5hbWU6IkNsYXJrZSAxODgwIG1vZC4ifSwNCiAgIkNQTSI6 IHthOjYzNzU3MzguNywgcmY6MzM0LjI5LCBlbGxpcHNlTmFtZToiQ29tbS4gZGVz IFBvaWRzIGV0IE1lc3VyZXMgMTc5OSJ9LA0KICAiZGVsbWJyIjoge2E6NjM3NjQy OC4wLCByZjozMTEuNSwgZWxsaXBzZU5hbWU6IkRlbGFtYnJlIDE4MTAgKEJlbGdp dW0pIn0sDQogICJlbmdlbGlzIjoge2E6NjM3ODEzNi4wNSwgcmY6Mjk4LjI1NjYs IGVsbGlwc2VOYW1lOiJFbmdlbGlzIDE5ODUifSwNCiAgImV2cnN0MzAiOiB7YTo2 Mzc3Mjc2LjM0NSwgcmY6MzAwLjgwMTcsIGVsbGlwc2VOYW1lOiJFdmVyZXN0IDE4 MzAifSwNCiAgImV2cnN0NDgiOiB7YTo2Mzc3MzA0LjA2MywgcmY6MzAwLjgwMTcs IGVsbGlwc2VOYW1lOiJFdmVyZXN0IDE5NDgifSwNCiAgImV2cnN0NTYiOiB7YTo2 Mzc3MzAxLjI0MywgcmY6MzAwLjgwMTcsIGVsbGlwc2VOYW1lOiJFdmVyZXN0IDE5 NTYifSwNCiAgImV2cnN0NjkiOiB7YTo2Mzc3Mjk1LjY2NCwgcmY6MzAwLjgwMTcs IGVsbGlwc2VOYW1lOiJFdmVyZXN0IDE5NjkifSwNCiAgImV2cnN0U1MiOiB7YTo2 Mzc3Mjk4LjU1NiwgcmY6MzAwLjgwMTcsIGVsbGlwc2VOYW1lOiJFdmVyZXN0IChT YWJhaCAmIFNhcmF3YWspIn0sDQogICJmc2NocjYwIjoge2E6NjM3ODE2Ni4wLCBy ZjoyOTguMywgZWxsaXBzZU5hbWU6IkZpc2NoZXIgKE1lcmN1cnkgRGF0dW0pIDE5 NjAifSwNCiAgImZzY2hyNjBtIjoge2E6NjM3ODE1NS4wLCByZjoyOTguMywgZWxs aXBzZU5hbWU6IkZpc2NoZXIgMTk2MCJ9LA0KICAiZnNjaHI2OCI6IHthOjYzNzgx NTAuMCwgcmY6Mjk4LjMsIGVsbGlwc2VOYW1lOiJGaXNjaGVyIDE5NjgifSwNCiAg ImhlbG1lcnQiOiB7YTo2Mzc4MjAwLjAsIHJmOjI5OC4zLCBlbGxpcHNlTmFtZToi SGVsbWVydCAxOTA2In0sDQogICJob3VnaCI6IHthOjYzNzgyNzAuMCwgcmY6Mjk3 LjAsIGVsbGlwc2VOYW1lOiJIb3VnaCJ9LA0KICAiaW50bCI6IHthOjYzNzgzODgu MCwgcmY6Mjk3LjAsIGVsbGlwc2VOYW1lOiJJbnRlcm5hdGlvbmFsIDE5MDkgKEhh eWZvcmQpIn0sDQogICJrYXVsYSI6IHthOjYzNzgxNjMuMCwgcmY6Mjk4LjI0LCBl bGxpcHNlTmFtZToiS2F1bGEgMTk2MSJ9LA0KICAibGVyY2giOiB7YTo2Mzc4MTM5 LjAsIHJmOjI5OC4yNTcsIGVsbGlwc2VOYW1lOiJMZXJjaCAxOTc5In0sDQogICJt cHJ0cyI6IHthOjYzOTczMDAuMCwgcmY6MTkxLjAsIGVsbGlwc2VOYW1lOiJNYXVw ZXJ0aXVzIDE3MzgifSwNCiAgIm5ld19pbnRsIjoge2E6NjM3ODE1Ny41LCBiOjYz NTY3NzIuMiwgZWxsaXBzZU5hbWU6Ik5ldyBJbnRlcm5hdGlvbmFsIDE5NjcifSwN CiAgInBsZXNzaXMiOiB7YTo2Mzc2NTIzLjAsIHJmOjYzNTU4NjMuMCwgZWxsaXBz ZU5hbWU6IlBsZXNzaXMgMTgxNyAoRnJhbmNlKSJ9LA0KICAia3Jhc3MiOiB7YTo2 Mzc4MjQ1LjAsIHJmOjI5OC4zLCBlbGxpcHNlTmFtZToiS3Jhc3NvdnNreSwgMTk0 MiJ9LA0KICAiU0Vhc2lhIjoge2E6NjM3ODE1NS4wLCBiOjYzNTY3NzMuMzIwNSwg ZWxsaXBzZU5hbWU6IlNvdXRoZWFzdCBBc2lhIn0sDQogICJ3YWxiZWNrIjoge2E6 NjM3Njg5Ni4wLCBiOjYzNTU4MzQuODQ2NywgZWxsaXBzZU5hbWU6IldhbGJlY2si fSwNCiAgIldHUzYwIjoge2E6NjM3ODE2NS4wLCByZjoyOTguMywgZWxsaXBzZU5h bWU6IldHUyA2MCJ9LA0KICAiV0dTNjYiOiB7YTo2Mzc4MTQ1LjAsIHJmOjI5OC4y NSwgZWxsaXBzZU5hbWU6IldHUyA2NiJ9LA0KICAiV0dTNzIiOiB7YTo2Mzc4MTM1 LjAsIHJmOjI5OC4yNiwgZWxsaXBzZU5hbWU6IldHUyA3MiJ9LA0KICAiV0dTODQi OiB7YTo2Mzc4MTM3LjAsIHJmOjI5OC4yNTcyMjM1NjMsIGVsbGlwc2VOYW1lOiJX R1MgODQifSwNCiAgInNwaGVyZSI6IHthOjYzNzA5OTcuMCwgYjo2MzcwOTk3LjAs IGVsbGlwc2VOYW1lOiJOb3JtYWwgU3BoZXJlIChyPTYzNzA5OTcpIn0NCn07DQoN ClByb2o0anMuRGF0dW0gPSB7DQogICJXR1M4NCI6IHt0b3dnczg0OiAiMCwwLDAi LCBlbGxpcHNlOiAiV0dTODQiLCBkYXR1bU5hbWU6ICJXR1M4NCJ9LA0KICAiR0dS Uzg3Ijoge3Rvd2dzODQ6ICItMTk5Ljg3LDc0Ljc5LDI0Ni42MiIsIGVsbGlwc2U6 ICJHUlM4MCIsIGRhdHVtTmFtZTogIkdyZWVrX0dlb2RldGljX1JlZmVyZW5jZV9T eXN0ZW1fMTk4NyJ9LA0KICAiTkFEODMiOiB7dG93Z3M4NDogIjAsMCwwIiwgZWxs aXBzZTogIkdSUzgwIiwgZGF0dW1OYW1lOiAiTm9ydGhfQW1lcmljYW5fRGF0dW1f MTk4MyJ9LA0KICAiTkFEMjciOiB7bmFkZ3JpZHM6ICJAY29udXMsQGFsYXNrYSxA bnR2Ml8wLmdzYixAbnR2MV9jYW4uZGF0IiwgZWxsaXBzZTogImNscms2NiIsIGRh dHVtTmFtZTogIk5vcnRoX0FtZXJpY2FuX0RhdHVtXzE5MjcifSwNCiAgInBvdHNk YW0iOiB7dG93Z3M4NDogIjYwNi4wLDIzLjAsNDEzLjAiLCBlbGxpcHNlOiAiYmVz c2VsIiwgZGF0dW1OYW1lOiAiUG90c2RhbSBSYXVlbmJlcmcgMTk1MCBESEROIn0s DQogICJjYXJ0aGFnZSI6IHt0b3dnczg0OiAiLTI2My4wLDYuMCw0MzEuMCIsIGVs bGlwc2U6ICJjbGFyazgwIiwgZGF0dW1OYW1lOiAiQ2FydGhhZ2UgMTkzNCBUdW5p c2lhIn0sDQogICJoZXJtYW5uc2tvZ2VsIjoge3Rvd2dzODQ6ICI2NTMuMCwtMjEy LjAsNDQ5LjAiLCBlbGxpcHNlOiAiYmVzc2VsIiwgZGF0dW1OYW1lOiAiSGVybWFu bnNrb2dlbCJ9LA0KICAiaXJlNjUiOiB7dG93Z3M4NDogIjQ4Mi41MzAsLTEzMC41 OTYsNTY0LjU1NywtMS4wNDIsLTAuMjE0LC0wLjYzMSw4LjE1IiwgZWxsaXBzZTog Im1vZF9haXJ5IiwgZGF0dW1OYW1lOiAiSXJlbGFuZCAxOTY1In0sDQogICJuemdk NDkiOiB7dG93Z3M4NDogIjU5LjQ3LC01LjA0LDE4Ny40NCwwLjQ3LC0wLjEsMS4w MjQsLTQuNTk5MyIsIGVsbGlwc2U6ICJpbnRsIiwgZGF0dW1OYW1lOiAiTmV3IFpl YWxhbmQgR2VvZGV0aWMgRGF0dW0gMTk0OSJ9LA0KICAiT1NHQjM2Ijoge3Rvd2dz ODQ6ICI0NDYuNDQ4LC0xMjUuMTU3LDU0Mi4wNjAsMC4xNTAyLDAuMjQ3MCwwLjg0 MjEsLTIwLjQ4OTQiLCBlbGxpcHNlOiAiYWlyeSIsIGRhdHVtTmFtZTogIkFpcnkg MTgzMCJ9DQp9Ow0KDQpQcm9qNGpzLldHUzg0ID0gbmV3IFByb2o0anMuUHJvaign V0dTODQnKTsNClByb2o0anMuRGF0dW1bJ09TQjM2J10gPSBQcm9qNGpzLkRhdHVt WydPU0dCMzYnXTsgLy9hcyByZXR1cm5lZCBmcm9tIHNwYXRpYWxyZWZlcmVuY2Uu b3JnDQo= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=tmerc.js Content-Type: application/javascript; charset=utf-8; name=tmerc.js Content-Location: http://www.icc.cat/vissir3/lib/proj4js/projCode/tmerc.js Content-Transfer-Encoding: Base64 LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKTkFNRSAgICAgICAgICAg ICAgICAgICAgICAgICAgICBUUkFOU1ZFUlNFIE1FUkNBVE9SCgpQVVJQT1NFOglU cmFuc2Zvcm1zIGlucHV0IGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgdG8gRWFzdGlu ZyBhbmQKCQlOb3J0aGluZyBmb3IgdGhlIFRyYW5zdmVyc2UgTWVyY2F0b3IgcHJv amVjdGlvbi4gIFRoZQoJCWxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgbXVzdCBiZSBp biByYWRpYW5zLiAgVGhlIEVhc3RpbmcKCQlhbmQgTm9ydGhpbmcgdmFsdWVzIHdp bGwgYmUgcmV0dXJuZWQgaW4gbWV0ZXJzLgoKQUxHT1JJVEhNIFJFRkVSRU5DRVMK CjEuICBTbnlkZXIsIEpvaG4gUC4sICJNYXAgUHJvamVjdGlvbnMtLUEgV29ya2lu ZyBNYW51YWwiLCBVLlMuIEdlb2xvZ2ljYWwKICAgIFN1cnZleSBQcm9mZXNzaW9u YWwgUGFwZXIgMTM5NSAoU3VwZXJzZWRlcyBVU0dTIEJ1bGxldGluIDE1MzIpLCBV bml0ZWQKICAgIFN0YXRlIEdvdmVybm1lbnQgUHJpbnRpbmcgT2ZmaWNlLCBXYXNo aW5ndG9uIEQuQy4sIDE5ODcuCgoyLiAgU255ZGVyLCBKb2huIFAuIGFuZCBWb3hs YW5kLCBQaGlsaXAgTS4sICJBbiBBbGJ1bSBvZiBNYXAgUHJvamVjdGlvbnMiLAog ICAgVS5TLiBHZW9sb2dpY2FsIFN1cnZleSBQcm9mZXNzaW9uYWwgUGFwZXIgMTQ1 MyAsIFVuaXRlZCBTdGF0ZSBHb3Zlcm5tZW50CiAgICBQcmludGluZyBPZmZpY2Us IFdhc2hpbmd0b24gRC5DLiwgMTk4OS4KKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKi8KCgovKioKICBJbml0aWFsaXplIFRyYW5zdmVyc2UgTWVyY2F0b3Ig cHJvamVjdGlvbgoqLwoKUHJvajRqcy5Qcm9qLnRtZXJjID0gewogIGluaXQgOiBm dW5jdGlvbigpIHsKICAgIHRoaXMuZTAgPSBQcm9qNGpzLmNvbW1vbi5lMGZuKHRo aXMuZXMpOwogICAgdGhpcy5lMSA9IFByb2o0anMuY29tbW9uLmUxZm4odGhpcy5l cyk7CiAgICB0aGlzLmUyID0gUHJvajRqcy5jb21tb24uZTJmbih0aGlzLmVzKTsK ICAgIHRoaXMuZTMgPSBQcm9qNGpzLmNvbW1vbi5lM2ZuKHRoaXMuZXMpOwogICAg dGhpcy5tbDAgPSB0aGlzLmEgKiBQcm9qNGpzLmNvbW1vbi5tbGZuKHRoaXMuZTAs IHRoaXMuZTEsIHRoaXMuZTIsIHRoaXMuZTMsIHRoaXMubGF0MCk7CiAgfSwKCiAg LyoqCiAgICBUcmFuc3ZlcnNlIE1lcmNhdG9yIEZvcndhcmQgIC0gbG9uZy9sYXQg dG8geC95CiAgICBsb25nL2xhdCBpbiByYWRpYW5zCiAgKi8KICBmb3J3YXJkIDog ZnVuY3Rpb24ocCkgewogICAgdmFyIGxvbiA9IHAueDsKICAgIHZhciBsYXQgPSBw Lnk7CgogICAgdmFyIGRlbHRhX2xvbiA9IFByb2o0anMuY29tbW9uLmFkanVzdF9s b24obG9uIC0gdGhpcy5sb25nMCk7IC8vIERlbHRhIGxvbmdpdHVkZQogICAgdmFy IGNvbjsgICAgLy8gY29uZSBjb25zdGFudAogICAgdmFyIHgsIHk7CiAgICB2YXIg c2luX3BoaT1NYXRoLnNpbihsYXQpOwogICAgdmFyIGNvc19waGk9TWF0aC5jb3Mo bGF0KTsKCiAgICBpZiAodGhpcy5zcGhlcmUpIHsgIC8qIHNwaGVyaWNhbCBmb3Jt ICovCiAgICAgIHZhciBiID0gY29zX3BoaSAqIE1hdGguc2luKGRlbHRhX2xvbik7 CiAgICAgIGlmICgoTWF0aC5hYnMoTWF0aC5hYnMoYikgLSAxLjApKSA8IC4wMDAw MDAwMDAxKSAgewogICAgICAgIFByb2o0anMucmVwb3J0RXJyb3IoInRtZXJjOmZv cndhcmQ6IFBvaW50IHByb2plY3RzIGludG8gaW5maW5pdHkiKTsKICAgICAgICBy ZXR1cm4oOTMpOwogICAgICB9IGVsc2UgewogICAgICAgIHggPSAuNSAqIHRoaXMu YSAqIHRoaXMuazAgKiBNYXRoLmxvZygoMS4wICsgYikvKDEuMCAtIGIpKTsKICAg ICAgICBjb24gPSBNYXRoLmFjb3MoY29zX3BoaSAqIE1hdGguY29zKGRlbHRhX2xv bikvTWF0aC5zcXJ0KDEuMCAtIGIqYikpOw0KICAgICAgICBpZiAobGF0IDwgMCkg Y29uID0gLSBjb247CiAgICAgICAgeSA9IHRoaXMuYSAqIHRoaXMuazAgKiAoY29u IC0gdGhpcy5sYXQwKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGFs ICA9IGNvc19waGkgKiBkZWx0YV9sb247CiAgICAgIHZhciBhbHMgPSBNYXRoLnBv dyhhbCwyKTsKICAgICAgdmFyIGMgICA9IHRoaXMuZXAyICogTWF0aC5wb3coY29z X3BoaSwyKTsKICAgICAgdmFyIHRxICA9IE1hdGgudGFuKGxhdCk7CiAgICAgIHZh ciB0ICAgPSBNYXRoLnBvdyh0cSwyKTsKICAgICAgY29uID0gMS4wIC0gdGhpcy5l cyAqIE1hdGgucG93KHNpbl9waGksMik7CiAgICAgIHZhciBuICAgPSB0aGlzLmEg LyBNYXRoLnNxcnQoY29uKTsKICAgICAgdmFyIG1sICA9IHRoaXMuYSAqIFByb2o0 anMuY29tbW9uLm1sZm4odGhpcy5lMCwgdGhpcy5lMSwgdGhpcy5lMiwgdGhpcy5l MywgbGF0KTsKCiAgICAgIHggPSB0aGlzLmswICogbiAqIGFsICogKDEuMCArIGFs cyAvIDYuMCAqICgxLjAgLSB0ICsgYyArIGFscyAvIDIwLjAgKiAoNS4wIC0gMTgu MCAqIHQgKyBNYXRoLnBvdyh0LDIpICsgNzIuMCAqIGMgLSA1OC4wICogdGhpcy5l cDIpKSkgKyB0aGlzLngwOwogICAgICB5ID0gdGhpcy5rMCAqIChtbCAtIHRoaXMu bWwwICsgbiAqIHRxICogKGFscyAqICgwLjUgKyBhbHMgLyAyNC4wICogKDUuMCAt IHQgKyA5LjAgKiBjICsgNC4wICogTWF0aC5wb3coYywyKSArIGFscyAvIDMwLjAg KiAoNjEuMCAtIDU4LjAgKiB0ICsgTWF0aC5wb3codCwyKSArIDYwMC4wICogYyAt IDMzMC4wICogdGhpcy5lcDIpKSkpKSArIHRoaXMueTA7CgogICAgfQogICAgcC54 ID0geDsgcC55ID0geTsKICAgIHJldHVybiBwOwogIH0sIC8vIHRtZXJjRndkKCkK CiAgLyoqCiAgICBUcmFuc3ZlcnNlIE1lcmNhdG9yIEludmVyc2UgIC0gIHgveSB0 byBsb25nL2xhdAogICovCiAgaW52ZXJzZSA6IGZ1bmN0aW9uKHApIHsKICAgIHZh ciBjb24sIHBoaTsgIC8qIHRlbXBvcmFyeSBhbmdsZXMgICAgICAgKi8KICAgIHZh ciBkZWx0YV9waGk7IC8qIGRpZmZlcmVuY2UgYmV0d2VlbiBsb25naXR1ZGVzICAg ICovCiAgICB2YXIgaTsKICAgIHZhciBtYXhfaXRlciA9IDY7ICAgICAgLyogbWF4 aW11biBudW1iZXIgb2YgaXRlcmF0aW9ucyAqLwogICAgdmFyIGxhdCwgbG9uOwoK ICAgIGlmICh0aGlzLnNwaGVyZSkgeyAgIC8qIHNwaGVyaWNhbCBmb3JtICovCiAg ICAgIHZhciBmID0gTWF0aC5leHAocC54Lyh0aGlzLmEgKiB0aGlzLmswKSk7CiAg ICAgIHZhciBnID0gLjUgKiAoZiAtIDEvZik7CiAgICAgIHZhciB0ZW1wID0gdGhp cy5sYXQwICsgcC55Lyh0aGlzLmEgKiB0aGlzLmswKTsKICAgICAgdmFyIGggPSBN YXRoLmNvcyh0ZW1wKTsKICAgICAgY29uID0gTWF0aC5zcXJ0KCgxLjAgLSBoICog aCkvKDEuMCArIGcgKiBnKSk7CiAgICAgIGxhdCA9IE1hdGguYXNpbnooY29uKTsK ICAgICAgaWYgKHRlbXAgPCAwKQogICAgICAgIGxhdCA9IC1sYXQ7CiAgICAgIGlm ICgoZyA9PSAwKSAmJiAoaCA9PSAwKSkgewogICAgICAgIGxvbiA9IHRoaXMubG9u ZzA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbG9uID0gUHJvajRqcy5jb21tb24u YWRqdXN0X2xvbihNYXRoLmF0YW4yKGcsaCkgKyB0aGlzLmxvbmcwKTsKICAgICAg fQogICAgfSBlbHNlIHsgICAgLy8gZWxsaXBzb2lkYWwgZm9ybQogICAgICB2YXIg eCA9IHAueCAtIHRoaXMueDA7CiAgICAgIHZhciB5ID0gcC55IC0gdGhpcy55MDsK CiAgICAgIGNvbiA9ICh0aGlzLm1sMCArIHkgLyB0aGlzLmswKSAvIHRoaXMuYTsK ICAgICAgcGhpID0gY29uOwogICAgICBmb3IgKGk9MDs7aSsrKSB7CiAgICAgICAg ZGVsdGFfcGhpPSgoY29uICsgdGhpcy5lMSAqIE1hdGguc2luKDIuMCpwaGkpIC0g dGhpcy5lMiAqIE1hdGguc2luKDQuMCpwaGkpICsgdGhpcy5lMyAqIE1hdGguc2lu KDYuMCpwaGkpKSAvIHRoaXMuZTApIC0gcGhpOwogICAgICAgIHBoaSArPSBkZWx0 YV9waGk7CiAgICAgICAgaWYgKE1hdGguYWJzKGRlbHRhX3BoaSkgPD0gUHJvajRq cy5jb21tb24uRVBTTE4pIGJyZWFrOwogICAgICAgIGlmIChpID49IG1heF9pdGVy KSB7CiAgICAgICAgICBQcm9qNGpzLnJlcG9ydEVycm9yKCJ0bWVyYzppbnZlcnNl OiBMYXRpdHVkZSBmYWlsZWQgdG8gY29udmVyZ2UiKTsKICAgICAgICAgIHJldHVy big5NSk7CiAgICAgICAgfQogICAgICB9IC8vIGZvcigpCiAgICAgIGlmIChNYXRo LmFicyhwaGkpIDwgUHJvajRqcy5jb21tb24uSEFMRl9QSSkgewogICAgICAgIC8v IHNpbmNvcyhwaGksICZzaW5fcGhpLCAmY29zX3BoaSk7CiAgICAgICAgdmFyIHNp bl9waGk9TWF0aC5zaW4ocGhpKTsKICAgICAgICB2YXIgY29zX3BoaT1NYXRoLmNv cyhwaGkpOwogICAgICAgIHZhciB0YW5fcGhpID0gTWF0aC50YW4ocGhpKTsKICAg ICAgICB2YXIgYyA9IHRoaXMuZXAyICogTWF0aC5wb3coY29zX3BoaSwyKTsKICAg ICAgICB2YXIgY3MgPSBNYXRoLnBvdyhjLDIpOwogICAgICAgIHZhciB0ID0gTWF0 aC5wb3codGFuX3BoaSwyKTsKICAgICAgICB2YXIgdHMgPSBNYXRoLnBvdyh0LDIp OwogICAgICAgIGNvbiA9IDEuMCAtIHRoaXMuZXMgKiBNYXRoLnBvdyhzaW5fcGhp LDIpOwogICAgICAgIHZhciBuID0gdGhpcy5hIC8gTWF0aC5zcXJ0KGNvbik7CiAg ICAgICAgdmFyIHIgPSBuICogKDEuMCAtIHRoaXMuZXMpIC8gY29uOwogICAgICAg IHZhciBkID0geCAvIChuICogdGhpcy5rMCk7CiAgICAgICAgdmFyIGRzID0gTWF0 aC5wb3coZCwyKTsKICAgICAgICBsYXQgPSBwaGkgLSAobiAqIHRhbl9waGkgKiBk cyAvIHIpICogKDAuNSAtIGRzIC8gMjQuMCAqICg1LjAgKyAzLjAgKiB0ICsgMTAu MCAqIGMgLSA0LjAgKiBjcyAtIDkuMCAqIHRoaXMuZXAyIC0gZHMgLyAzMC4wICog KDYxLjAgKyA5MC4wICogdCArIDI5OC4wICogYyArIDQ1LjAgKiB0cyAtIDI1Mi4w ICogdGhpcy5lcDIgLSAzLjAgKiBjcykpKTsKICAgICAgICBsb24gPSBQcm9qNGpz LmNvbW1vbi5hZGp1c3RfbG9uKHRoaXMubG9uZzAgKyAoZCAqICgxLjAgLSBkcyAv IDYuMCAqICgxLjAgKyAyLjAgKiB0ICsgYyAtIGRzIC8gMjAuMCAqICg1LjAgLSAy LjAgKiBjICsgMjguMCAqIHQgLSAzLjAgKiBjcyArIDguMCAqIHRoaXMuZXAyICsg MjQuMCAqIHRzKSkpIC8gY29zX3BoaSkpOwogICAgICB9IGVsc2UgewogICAgICAg IGxhdCA9IFByb2o0anMuY29tbW9uLkhBTEZfUEkgKiBQcm9qNGpzLmNvbW1vbi5z aWduKHkpOwogICAgICAgIGxvbiA9IHRoaXMubG9uZzA7CiAgICAgIH0KICAgIH0K ICAgIHAueCA9IGxvbjsKICAgIHAueSA9IGxhdDsKICAgIHJldHVybiBwOwogIH0g Ly8gdG1lcmNJbnYoKQp9Ow== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=merc.js Content-Type: application/javascript; charset=utf-8; name=merc.js Content-Location: http://www.icc.cat/vissir3/lib/proj4js/projCode/merc.js Content-Transfer-Encoding: Base64 LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKTkFNRSAgICAgICAgICAg ICAgICAgICAgICAgICAgICBNRVJDQVRPUgoKUFVSUE9TRToJVHJhbnNmb3JtcyBp bnB1dCBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIHRvIEVhc3RpbmcgYW5kCgkJTm9y dGhpbmcgZm9yIHRoZSBNZXJjYXRvciBwcm9qZWN0aW9uLiAgVGhlCgkJbG9uZ2l0 dWRlIGFuZCBsYXRpdHVkZSBtdXN0IGJlIGluIHJhZGlhbnMuICBUaGUgRWFzdGlu ZwoJCWFuZCBOb3J0aGluZyB2YWx1ZXMgd2lsbCBiZSByZXR1cm5lZCBpbiBtZXRl cnMuCgpQUk9HUkFNTUVSICAgICAgICAgICAgICBEQVRFCi0tLS0tLS0tLS0gICAg ICAgICAgICAgIC0tLS0KRC4gU3RlaW53YW5kLCBFUk9TICAgICAgTm92LCAxOTkx ClQuIE1pdHRhbgkJTWFyLCAxOTkzCgpBTEdPUklUSE0gUkVGRVJFTkNFUwoKMS4g IFNueWRlciwgSm9obiBQLiwgIk1hcCBQcm9qZWN0aW9ucy0tQSBXb3JraW5nIE1h bnVhbCIsIFUuUy4gR2VvbG9naWNhbAogICAgU3VydmV5IFByb2Zlc3Npb25hbCBQ YXBlciAxMzk1IChTdXBlcnNlZGVzIFVTR1MgQnVsbGV0aW4gMTUzMiksIFVuaXRl ZAogICAgU3RhdGUgR292ZXJubWVudCBQcmludGluZyBPZmZpY2UsIFdhc2hpbmd0 b24gRC5DLiwgMTk4Ny4KCjIuICBTbnlkZXIsIEpvaG4gUC4gYW5kIFZveGxhbmQs IFBoaWxpcCBNLiwgIkFuIEFsYnVtIG9mIE1hcCBQcm9qZWN0aW9ucyIsCiAgICBV LlMuIEdlb2xvZ2ljYWwgU3VydmV5IFByb2Zlc3Npb25hbCBQYXBlciAxNDUzICwg VW5pdGVkIFN0YXRlIEdvdmVybm1lbnQKICAgIFByaW50aW5nIE9mZmljZSwgV2Fz aGluZ3RvbiBELkMuLCAxOTg5LgoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqLwoKLy9zdGF0aWMgZG91YmxlIHJfbWFqb3IgPSBhOwkJICAgLyogbWFqb3Ig YXhpcyAJCQkJKi8KLy9zdGF0aWMgZG91YmxlIHJfbWlub3IgPSBiOwkJICAgLyog bWlub3IgYXhpcyAJCQkJKi8KLy9zdGF0aWMgZG91YmxlIGxvbl9jZW50ZXIgPSBs b25nMDsJICAgLyogQ2VudGVyIGxvbmdpdHVkZSAocHJvamVjdGlvbiBjZW50ZXIp ICovCi8vc3RhdGljIGRvdWJsZSBsYXRfb3JpZ2luID0gIGxhdDA7CSAgIC8qIGNl bnRlciBsYXRpdHVkZQkJCSovCi8vc3RhdGljIGRvdWJsZSBlLGVzOwkJICAgICAg ICAgICAvKiBlY2NlbnRyaWNpdHkgY29uc3RhbnRzCQkqLwovL3N0YXRpYyBkb3Vi bGUgbTE7CQkgICAgICAgICAgICAgICAvKiBzbWFsbCB2YWx1ZSBtCQkJKi8KLy9z dGF0aWMgZG91YmxlIGZhbHNlX25vcnRoaW5nID0geTA7ICAgLyogeSBvZmZzZXQg aW4gbWV0ZXJzCQkJKi8KLy9zdGF0aWMgZG91YmxlIGZhbHNlX2Vhc3RpbmcgPSB4 MDsJICAgLyogeCBvZmZzZXQgaW4gbWV0ZXJzCQkJKi8KLy9zY2FsZV9mYWN0ID0g azAgCgpQcm9qNGpzLlByb2oubWVyYyA9IHsKICBpbml0IDogZnVuY3Rpb24oKSB7 CgkvLz90aGlzLnRlbXAgPSB0aGlzLnJfbWlub3IgLyB0aGlzLnJfbWFqb3I7Cgkv L3RoaXMudGVtcCA9IHRoaXMuYiAvIHRoaXMuYTsKCS8vdGhpcy5lcyA9IDEuMCAt IE1hdGguc3FydCh0aGlzLnRlbXApOwoJLy90aGlzLmUgPSBNYXRoLnNxcnQoIHRo aXMuZXMgKTsKCS8vP3RoaXMubTEgPSBNYXRoLmNvcyh0aGlzLmxhdF9vcmlnaW4p IC8gKE1hdGguc3FydCggMS4wIC0gdGhpcy5lcyAqIE1hdGguc2luKHRoaXMubGF0 X29yaWdpbikgKiBNYXRoLnNpbih0aGlzLmxhdF9vcmlnaW4pKSk7CgkvL3RoaXMu bTEgPSBNYXRoLmNvcygwLjApIC8gKE1hdGguc3FydCggMS4wIC0gdGhpcy5lcyAq IE1hdGguc2luKDAuMCkgKiBNYXRoLnNpbigwLjApKSk7CiAgICBpZiAodGhpcy5s YXRfdHMpIHsKICAgICAgaWYgKHRoaXMuc3BoZXJlKSB7CiAgICAgICAgdGhpcy5r MCA9IE1hdGguY29zKHRoaXMubGF0X3RzKTsKICAgICAgfSBlbHNlIHsKICAgICAg ICB0aGlzLmswID0gUHJvajRqcy5jb21tb24ubXNmbnoodGhpcy5lcywgTWF0aC5z aW4odGhpcy5sYXRfdHMpLCBNYXRoLmNvcyh0aGlzLmxhdF90cykpOwogICAgICB9 CiAgICB9CiAgfSwKCi8qIE1lcmNhdG9yIGZvcndhcmQgZXF1YXRpb25zLS1tYXBw aW5nIGxhdCxsb25nIHRvIHgseQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgZm9yd2FyZCA6IGZ1bmN0aW9u KHApIHsJCiAgICAvL2FsZXJ0KCJsbDJtIGNvb3JkcyA6ICIrY29vcmRzKTsKICAg IHZhciBsb24gPSBwLng7CiAgICB2YXIgbGF0ID0gcC55OwogICAgLy8gY29udmVy dCB0byByYWRpYW5zCiAgICBpZiAoIGxhdCpQcm9qNGpzLmNvbW1vbi5SMkQgPiA5 MC4wICYmIAogICAgICAgICAgbGF0KlByb2o0anMuY29tbW9uLlIyRCA8IC05MC4w ICYmIAogICAgICAgICAgbG9uKlByb2o0anMuY29tbW9uLlIyRCA+IDE4MC4wICYm IAogICAgICAgICAgbG9uKlByb2o0anMuY29tbW9uLlIyRCA8IC0xODAuMCkgewog ICAgICBQcm9qNGpzLnJlcG9ydEVycm9yKCJtZXJjOmZvcndhcmQ6IGxsSW5wdXRP dXRPZlJhbmdlOiAiKyBsb24gKyIgOiAiICsgbGF0KTsKICAgICAgcmV0dXJuIG51 bGw7CiAgICB9CgogICAgdmFyIHgseTsKICAgIGlmKE1hdGguYWJzKCBNYXRoLmFi cyhsYXQpIC0gUHJvajRqcy5jb21tb24uSEFMRl9QSSkgIDw9IFByb2o0anMuY29t bW9uLkVQU0xOKSB7CiAgICAgIFByb2o0anMucmVwb3J0RXJyb3IoIm1lcmM6Zm9y d2FyZDogbGwybUF0UG9sZXMiKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVs c2UgewogICAgICBpZiAodGhpcy5zcGhlcmUpIHsKICAgICAgICB4ID0gdGhpcy54 MCArIHRoaXMuYSAqIHRoaXMuazAgKiBQcm9qNGpzLmNvbW1vbi5hZGp1c3RfbG9u KGxvbiAtIHRoaXMubG9uZzApOwogICAgICAgIHkgPSB0aGlzLnkwICsgdGhpcy5h ICogdGhpcy5rMCAqIE1hdGgubG9nKE1hdGgudGFuKFByb2o0anMuY29tbW9uLkZP UlRQSSArIDAuNSpsYXQpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgc2lu cGhpID0gTWF0aC5zaW4obGF0KTsKICAgICAgICB2YXIgdHMgPSBQcm9qNGpzLmNv bW1vbi50c2Zueih0aGlzLmUsbGF0LHNpbnBoaSk7CiAgICAgICAgeCA9IHRoaXMu eDAgKyB0aGlzLmEgKiB0aGlzLmswICogUHJvajRqcy5jb21tb24uYWRqdXN0X2xv bihsb24gLSB0aGlzLmxvbmcwKTsKICAgICAgICB5ID0gdGhpcy55MCAtIHRoaXMu YSAqIHRoaXMuazAgKiBNYXRoLmxvZyh0cyk7CiAgICAgIH0KICAgICAgcC54ID0g eDsgCiAgICAgIHAueSA9IHk7CiAgICAgIHJldHVybiBwOwogICAgfQogIH0sCgoK ICAvKiBNZXJjYXRvciBpbnZlcnNlIGVxdWF0aW9ucy0tbWFwcGluZyB4LHkgdG8g bGF0L2xvbmcKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLSovCiAgaW52ZXJzZSA6IGZ1bmN0aW9uKHApIHsJCgogICAg dmFyIHggPSBwLnggLSB0aGlzLngwOwogICAgdmFyIHkgPSBwLnkgLSB0aGlzLnkw OwogICAgdmFyIGxvbixsYXQ7CgogICAgaWYgKHRoaXMuc3BoZXJlKSB7CiAgICAg IGxhdCA9IFByb2o0anMuY29tbW9uLkhBTEZfUEkgLSAyLjAgKiBNYXRoLmF0YW4o TWF0aC5leHAoLXkgLyB0aGlzLmEgKiB0aGlzLmswKSk7CiAgICB9IGVsc2Ugewog ICAgICB2YXIgdHMgPSBNYXRoLmV4cCgteSAvICh0aGlzLmEgKiB0aGlzLmswKSk7 CiAgICAgIGxhdCA9IFByb2o0anMuY29tbW9uLnBoaTJ6KHRoaXMuZSx0cyk7CiAg ICAgIGlmKGxhdCA9PSAtOTk5OSkgewogICAgICAgIFByb2o0anMucmVwb3J0RXJy b3IoIm1lcmM6aW52ZXJzZTogbGF0ID0gLTk5OTkiKTsKICAgICAgICByZXR1cm4g bnVsbDsKICAgICAgfQogICAgfQogICAgbG9uID0gUHJvajRqcy5jb21tb24uYWRq dXN0X2xvbih0aGlzLmxvbmcwKyB4IC8gKHRoaXMuYSAqIHRoaXMuazApKTsKCiAg ICBwLnggPSBsb247CiAgICBwLnkgPSBsYXQ7CiAgICByZXR1cm4gcDsKICB9Cn07 CgoK ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=EPSG23031.js Content-Type: application/javascript; charset=utf-8; name=EPSG23031.js Content-Location: http://www.icc.cat/vissir3/lib/proj4js/defs/EPSG23031.js Content-Transfer-Encoding: Base64 UHJvajRqcy5kZWZzWyJFUFNHOjIzMDMxIl0gPSAiK3Byb2o9dXRtICt6b25lPTMx ICtlbGxwcz1pbnRsICt0b3dnczg0PS0xMzYuNjU1NDksLTE0MS40NjU4LC0xNjcu Mjk4NDgsLTIuMDkzMTExLC0wLjAwMTQwNTUsLTAuMTA3NzA5OCwxMS41NDYxMSAr dW5pdHM9bSArbm9fZGVmcyI7Cg== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=EPSG23030.js Content-Type: application/javascript; charset=utf-8; name=EPSG23030.js Content-Location: http://www.icc.cat/vissir3/lib/proj4js/defs/EPSG23030.js Content-Transfer-Encoding: Base64 UHJvajRqcy5kZWZzWyJFUFNHOjIzMDMwIl0gPSAiK3Byb2o9dXRtICt6b25lPTMw ICtlbGxwcz1pbnRsICt0b3dnczg0PS0xMzYuNjU1NDksLTE0MS40NjU4LC0xNjcu Mjk4NDgsLTIuMDkzMTExLC0wLjAwMTQwNTUsLTAuMTA3NzA5OCwxMS41NDYxMSAr dW5pdHM9bSArbm9fZGVmcyI7DQo= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=visualitzador.js Content-Type: application/javascript; charset=utf-8; name=visualitzador.js Content-Location: http://www.icc.cat/vissir3/lib/js/visualitzador.js Content-Transfer-Encoding: Base64 DQpmdW5jdGlvbiBvcGVuQ0RNKCl7DQoJdmFyIG1hcCA9IEFwcC5sYXlvdXQuZ2V0 TWFwKCk7DQoJdmFyIHpvb20gPSBtYXAuZ2V0Wm9vbSgpOw0KCWlmKHpvb208NSkg YWxlcnQoQ0RNYWxlcnQpOw0KCWVsc2V7DQoJICAJdmFyIGJib3ggPSBtYXAuZ2V0 RXh0ZW50KCkudG9BcnJheSgpOw0KCSAgCVZpc3Npci5jZG0uZ2V0SU5FYnliYm94 KGJib3gpOw0KCX0NCn0NCg0KZnVuY3Rpb24gbmF2ZWdhcmhpKHpvb20sYmFzZSl7 DQoJdmFyIG1hcCA9IEFwcC5sYXlvdXQuZ2V0TWFwKCk7DQoJaWYoYmFzZSA9PSAn dG9wbycpew0KCQl2YXIgYnNMeXIgPSBtYXAuZ2V0TGF5ZXJzQnlOYW1lKGx5clRv cG8pWzBdOyAvLyBFcyBmb3Lvv71hIHF1ZSBsYSBjYXBhIGJhc2UgaW5pY2lhbCBz aWd1aSBlbCBUb3BvDQoJfWVsc2UgaWYoYmFzZSA9PSAnb3J0bycpew0KCQl2YXIg YnNMeXIgPSBtYXAuZ2V0TGF5ZXJzQnlOYW1lKGx5ck9ydG8pWzBdOyAvLyBFcyBm b3Lvv71hIHF1ZSBsYSBjYXBhIGJhc2UgaW5pY2lhbCBzaWd1aSBlbCBUb3BvDQoJ fQ0KCW1hcC5zZXRCYXNlTGF5ZXIoYnNMeXIpOw0KCW1hcC56b29tVG8oem9vbSkN Cn0NCg0KZnVuY3Rpb24gbW9zdHJhIChpZGJveCxvcCkgew0KDQogIHN3aXRjaChp ZGJveCl7DQoJY2FzZSAncHJvZF9tYXBlcyc6DQoJCUFwcC5sYXlvdXQuYmFzZSA9 ICd0b3BvJzsNCglicmVhazsNCgljYXNlICdwcm9kX2Flcmllcyc6DQoJCUFwcC5s YXlvdXQuYmFzZSA9ICdvcnRvJzsNCglicmVhazsNCgljYXNlICdwcm9kX21ldCc6 DQoJCUFwcC5sYXlvdXQuYmFzZSA9ICdtZXQnOw0KCQlBcHAubGF5b3V0LnByb2R1 Y3QgPSAnbWV0MTUnOw0KCWJyZWFrOw0KCWNhc2UgJ3Byb2RfbXAyMCc6DQoJCUFw cC5sYXlvdXQuYmFzZSA9ICdtcDIwJzsNCgkJQXBwLmxheW91dC5wcm9kdWN0ID0g J21wMjAnOw0KCWJyZWFrOw0KCWNhc2UgJ3Byb2RfYnQ1bSc6DQoJCUFwcC5sYXlv dXQuYmFzZSA9ICd0b3BvJzsNCgkJQXBwLmxheW91dC5wcm9kdWN0ID0gJ2J0NW0n Ow0KCWJyZWFrOw0KCWNhc2UgJ3Byb2RfbXQxMG0nOg0KCQlBcHAubGF5b3V0LmJh c2UgPSAndG9wbyc7DQoJCUFwcC5sYXlvdXQucHJvZHVjdCA9ICdtdDEwbSc7DQoJ YnJlYWs7DQoJY2FzZSAncHJvZF9idDI1bSc6DQoJCUFwcC5sYXlvdXQuYmFzZSA9 ICd0b3BvJzsNCgkJQXBwLmxheW91dC5wcm9kdWN0ID0gJ2J0MjVtJzsNCglicmVh azsNCgljYXNlICdwcm9kX2J0NTBtJzoNCgkJQXBwLmxheW91dC5iYXNlID0gJ3Rv cG8nOw0KCQlBcHAubGF5b3V0LnByb2R1Y3QgPSAnYnQ1MG0nOw0KCWJyZWFrOw0K CWNhc2UgJ3Byb2RfY29tNTBtJzoNCgkJQXBwLmxheW91dC5iYXNlID0gJ3RvcG8n Ow0KCQlBcHAubGF5b3V0LnByb2R1Y3QgPSAnY29tNTBtJzsNCglicmVhazsNCglj YXNlICdwcm9kX210YzI1MG0nOg0KCQlBcHAubGF5b3V0LmJhc2UgPSAndG9wbyc7 DQoJCUFwcC5sYXlvdXQucHJvZHVjdCA9ICdtdGMyNTBtJzsNCglicmVhazsNCglj YXNlICdwcm9kX210YzUwMG0nOg0KCQlBcHAubGF5b3V0LmJhc2UgPSAndG9wbyc7 DQoJCUFwcC5sYXlvdXQucHJvZHVjdCA9ICdtdGM1MDBtJzsNCglicmVhazsNCglj YXNlICdwcm9kX210YzEwMDBtJzoNCgkJQXBwLmxheW91dC5iYXNlID0gJ3RvcG8n Ow0KCQlBcHAubGF5b3V0LnByb2R1Y3QgPSAnbXRjMTAwMG0nOw0KCWJyZWFrOw0K CWNhc2UgJ3Byb2Rfb2YyJzoNCgkJQXBwLmxheW91dC5iYXNlID0gJ29ydG8nOw0K CQlBcHAubGF5b3V0LnByb2R1Y3QgPSAnb2YyNWMnOw0KCWJyZWFrOw0KCWNhc2Ug J3Byb2Rfb2Y1JzoNCgkJQXBwLmxheW91dC5iYXNlID0gJ29ydG8nOw0KCQlBcHAu bGF5b3V0LnByb2R1Y3QgPSAnb2Y1bSc7DQoJYnJlYWs7DQoJY2FzZSAncHJvZF9v ZjI1JzoNCgkJQXBwLmxheW91dC5iYXNlID0gJ29ydG8nOw0KCQlBcHAubGF5b3V0 LnByb2R1Y3QgPSAnb2YyNW0nOw0KCWJyZWFrOw0KCWNhc2UgJ3Byb2RfcDEwMDAn Og0KCQlBcHAubGF5b3V0LmJhc2UgPSAncDEwMDAnOw0KCQlBcHAubGF5b3V0LnBy b2R1Y3QgPSAnY3QxbSc7DQoJYnJlYWs7DQoJY2FzZSAncHJvZF9wb2xpbmQnOg0K CQlBcHAubGF5b3V0LmJhc2UgPSAncG9saW5kJzsNCgkJQXBwLmxheW91dC5wcm9k dWN0ID0gJ2JkZ3BvbGluZCc7DQoJYnJlYWs7DQoJY2FzZSAncHJvZF90YWxscyc6 DQoJCUFwcC5sYXlvdXQuYmFzZSA9ICd0YWxscyc7DQoJCUFwcC5sYXlvdXQucHJv ZHVjdCA9ICd0YWxscyc7DQoJYnJlYWs7DQoJY2FzZSAncHJvZF9ibTUwbSc6DQoJ CUFwcC5sYXlvdXQuYmFzZSA9ICdibSc7DQoJCUFwcC5sYXlvdXQucHJvZHVjdCA9 ICdibSc7DQoJYnJlYWs7DQoJY2FzZSAncHJvZF9ibTI1MG0nOg0KCQlBcHAubGF5 b3V0LmJhc2UgPSAnYm0nOw0KCQlBcHAubGF5b3V0LnByb2R1Y3QgPSAnYm0nOw0K CWJyZWFrOw0KCWNhc2UgJ3Byb2RfYm0xMDAwbSc6DQoJCUFwcC5sYXlvdXQuYmFz ZSA9ICdibSc7DQoJCUFwcC5sYXlvdXQucHJvZHVjdCA9ICdibSc7DQoJYnJlYWs7 DQoJY2FzZSAncHJvZF9jbGljayc6DQoJCWlmKG9wID09IDApew0KCQkJYW1hZ2Fy TWFyY2EoKTsNCgkJCXZhciBzdGF0dXNCYXJUZXh0ID0gZG9jdW1lbnQuZ2V0RWxl bWVudEJ5SWQoJ21lYXN1cmVJbmZvJyk7DQoJCQlzdGF0dXNCYXJUZXh0LmlubmVy SFRNTCA9ICIiOw0KCQl9DQoJYnJlYWs7DQogIH0NCg0KICB2YXIgYm94ID0gZG9j dW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWRib3gpOw0KICANCiAgaWYob3AgPT0gbnVs bCl7DQogICAgaWYgKGJveC5zdHlsZS5kaXNwbGF5ID09ICdub25lJyB8fCBib3gu c3R5bGUuZGlzcGxheSA9PSAnJykgYm94LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2sn Ow0KICAgIGVsc2UgYm94LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogIH1lbHNl ew0KICAgIGlmIChvcCA9PSAwKSBib3guc3R5bGUuZGlzcGxheSA9ICdub25lJzsN CiAgICBlbHNlIGJveC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCiAgfQ0KfQ0K DQpmdW5jdGlvbiBhbWFnYXJUb3QoKXsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZCgicHJvZF9pbmRleCIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQoJZG9jdW1l bnQuZ2V0RWxlbWVudEJ5SWQoInByb2RfbWFwZXMiKS5zdHlsZS5kaXNwbGF5ID0g Im5vbmUiOw0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwcm9kX2J0NW0iKS5z dHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlk KCJwcm9kX210MTBtIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCglkb2N1bWVu dC5nZXRFbGVtZW50QnlJZCgicHJvZF9idDI1bSIpLnN0eWxlLmRpc3BsYXkgPSAi bm9uZSI7DQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2RfYnQ1MG0iKS5z dHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlk KCJwcm9kX2NvbTUwbSIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQoJZG9jdW1l bnQuZ2V0RWxlbWVudEJ5SWQoInByb2RfbXRjMjUwbSIpLnN0eWxlLmRpc3BsYXkg PSAibm9uZSI7DQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2RfbXRjNTAw bSIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQoJZG9jdW1lbnQuZ2V0RWxlbWVu dEJ5SWQoInByb2RfbXRjMTAwMG0iKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0K CWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwcm9kX2FlcmllcyIpLnN0eWxlLmRp c3BsYXkgPSAibm9uZSI7DQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2Rf b2YyIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCglkb2N1bWVudC5nZXRFbGVt ZW50QnlJZCgicHJvZF9vZjUiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KCWRv Y3VtZW50LmdldEVsZW1lbnRCeUlkKCJwcm9kX29mMjUiKS5zdHlsZS5kaXNwbGF5 ID0gIm5vbmUiOw0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZXNjYXJyZWdh Iikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCglkb2N1bWVudC5nZXRFbGVtZW50 QnlJZCgicHJvZF9tZXQiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KCWRvY3Vt ZW50LmdldEVsZW1lbnRCeUlkKCJwcm9kX2FsdHJlcyIpLnN0eWxlLmRpc3BsYXkg PSAibm9uZSI7DQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2RfbXAyMCIp LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 SWQoInByb2RfYm01MG0iKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KCWRvY3Vt ZW50LmdldEVsZW1lbnRCeUlkKCJwcm9kX2JtMjUwbSIpLnN0eWxlLmRpc3BsYXkg PSAibm9uZSI7DQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2RfYm0xMDAw bSIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQoJZG9jdW1lbnQuZ2V0RWxlbWVu dEJ5SWQoInByb2RfcDEwMDAiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KCWRv Y3VtZW50LmdldEVsZW1lbnRCeUlkKCJwcm9kX2NsaWNrIikuc3R5bGUuZGlzcGxh eSA9ICJub25lIjsNCglhbWFnYXJNYXJjYSgpOw0KfQ0KDQpmdW5jdGlvbiBhbWFn YXJNYXJjYSgpew0KCXZhciBtYXAgPSBBcHAubGF5b3V0LmdldE1hcCgpOw0KCS8v IEVzIGRldGVjdGEgc2kgcydoYSBjcmVhdCBsYSBtYXJjYQ0KCXZhciBsYXllck1h cmtlZCA9IG1hcC5nZXRMYXllcnNCeU5hbWUoIm1hcmNhIilbMF07DQoJLy8gU2kg bWFyY2EgY3JlYWRhLCBzJ2VsaW1pbmEuDQoJaWYobGF5ZXJNYXJrZWQgIT0gbnVs bCkgbGF5ZXJNYXJrZWQuZGVzdHJveSgpOw0KfQ0KDQpmdW5jdGlvbiBzaG93VGV4 dFNlbGVjdChpZCl7DQoJLy8gTmV0ZWphIGRlIGRpdiBjYW5kaWRhdHMNCglkb2N1 bWVudC5nZXRFbGVtZW50QnlJZCgidG9wb25pbWNhbmRpZGF0cyIpLmlubmVySFRN TCA9ICIiOw0KCS8vIE5ldGVqYSBkZSBpbnB1dCBkZSBjZXJjYQ0KCWRvY3VtZW50 LmdldEVsZW1lbnRCeUlkKCJ0b3BvbmltaW5wdXQiKS52YWx1ZSA9ICIiOw0KCQ0K CS8vIFMnb2N1bHRlbiB0b3RlcyBsZXMgY2FwZXMgaSBwb3N0ZXJpb3JtZW50IGVz IGZhIHZpc2libGUgbGEgcXVlIHRvY2ENCglkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZCgiZGl2VGV4dFRvcG9uaW0iKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KCWRv Y3VtZW50LmdldEVsZW1lbnRCeUlkKCJkaXZUZXh0Q2FycmVyIikuc3R5bGUuZGlz cGxheSA9ICJub25lIjsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGl2VGV4 dEVENTAiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KCWRvY3VtZW50LmdldEVs ZW1lbnRCeUlkKCJkaXZUZXh0RVRSUzg5Iikuc3R5bGUuZGlzcGxheSA9ICJub25l IjsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGl2VGV4dFdHUzg0Iikuc3R5 bGUuZGlzcGxheSA9ICJub25lIjsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgi ZGl2VGV4dFBLIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCglkb2N1bWVudC5n ZXRFbGVtZW50QnlJZCgiZGl2VGV4dEZ1bGwiKS5zdHlsZS5kaXNwbGF5ID0gIm5v bmUiOw0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkaXZUZXh0U2VueWFscyIp LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 SWQoImRpdlRleHRTaWdwYWMiKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KDQoJ ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnN0eWxlLmRpc3BsYXkgPSAiYmxv Y2siOw0KCQ0KCWlmKGlkPT0iZGl2VGV4dFNpZ3BhYyIpew0KCQlkb2N1bWVudC5n ZXRFbGVtZW50QnlJZCgidG9wb25pbWZvcm0iKS5zdHlsZS5kaXNwbGF5ID0gIm5v bmUiOw0KCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidG9wb25pbWNhbmRpZGF0 cyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CQ0KCX1lbHNlew0KCQlkb2N1bWVu dC5nZXRFbGVtZW50QnlJZCgidG9wb25pbWZvcm0iKS5zdHlsZS5kaXNwbGF5ID0g ImJsb2NrIjsNCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRvcG9uaW1jYW5k aWRhdHMiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsNCgl9DQoJDQp9DQoNCmZ1 bmN0aW9uIG1vc3RyYXNlY2NpbyAoaWRzZWNjaW8pIHsNCiAgdmFyIGlkc2VjY2lv bnMgPSBbJ2NlcmNhJywncHJvZHVjdGVzJywnZWRpdG9yJywnbG9naW4nLCdkZXNj YXJyZWdhJywnZW5sbGFjYXInLCdjb21wYXJhcicsJ25vdGlmaWNhcicsJ2FxdWlx dWVoaWhhJywnaW5mb19wcm9kdWN0ZSddOw0KICB2YXIgc2VjY2lvLCB0aXRvbF9z ZWNjaW87DQogIA0KICBmb3IgKGk9MDtpPGlkc2VjY2lvbnMubGVuZ3RoO2krKykg ew0KICAgIA0KICAgIHNlY2NpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlk c2VjY2lvbnNbaV0pOw0KICAgIHRpdG9sX3NlY2NpbyA9IGRvY3VtZW50LmdldEVs ZW1lbnRCeUlkKCJhXyIraWRzZWNjaW9uc1tpXSk7DQogICAgDQogICAgaWYgKGlk c2VjY2lvbnNbaV0gPT0gaWRzZWNjaW8pIHsgICAgICANCiAgICAgIG1vc3RyYShp ZHNlY2Npb25zW2ldLDEpOw0KICAgICAgaWYgKHRpdG9sX3NlY2NpbyAhPSBudWxs KSB7DQogICAgICAgIHRpdG9sX3NlY2Npby5zdHlsZS5jb2xvciA9ICcjMDAwMDAw JzsNCiAgICAgICAgdGl0b2xfc2VjY2lvLnN0eWxlLnRleHREZWNvcmF0aW9uID0g J25vbmUnOw0KICAgICAgICB0aXRvbF9zZWNjaW8uc3R5bGUuZm9udFdlaWdodCA9 ICdib2xkJzsNCiAgICAgIH0NCiAgICB9DQogICAgZWxzZSB7DQogICAgICBtb3N0 cmEoaWRzZWNjaW9uc1tpXSwwKTsNCiAgICAgIGlmICh0aXRvbF9zZWNjaW8gIT0g bnVsbCkgew0KICAgICAgICB0aXRvbF9zZWNjaW8uc3R5bGUuY29sb3IgPSAnIzAw MDBmZic7DQogICAgICAgIHRpdG9sX3NlY2Npby5zdHlsZS50ZXh0RGVjb3JhdGlv biA9ICd1bmRlcmxpbmUnOw0KICAgICAgICB0aXRvbF9zZWNjaW8uc3R5bGUuZm9u dFdlaWdodCA9ICdub3JtYWwnOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQpm dW5jdGlvbiBzZWxlY2Npb25hX3Byb2R1Y3RlIChpZHByb2Qsb3ApIHsNCiAgDQog IHZhciBpZHByb2RzID0gWydidDVtJywnbXQxMG0nLCdidDI1bScsJ2J0NTBtJywn bXQ1MG0nLCdtdDI1MG0nLCdtdDUwMG0nLCdtdDEwMDBtJ107DQogIHZhciBwcm9k LCBwb3B1cDsNCiAgICANCiAgLyogRkFMVEEgRkVSIEVMIEhPVkVSICovDQogIGZv ciAoaT0wO2k8aWRwcm9kcy5sZW5ndGg7aSsrKSB7DQogICAgDQogICAgaWYgKG9w ID09IDEpIHByb2QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGVzY18iK2lk cHJvZHNbaV0pOw0KICAgIGVsc2UgcHJvZCA9IGRvY3VtZW50LmdldEVsZW1lbnRC eUlkKGlkcHJvZHNbaV0pOw0KICAgIA0KICAgIGlmIChpZHByb2RzW2ldID09IGlk cHJvZCkgew0KICAgICAgcHJvZC5zdHlsZS5ib3JkZXIgPSAnMnB4IHNvbGlkICNh YWFhYWEnOw0KICAgICAgcHJvZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2Rk ZGRkZCc7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgaWYgKGlkcHJvZHNbaV0g IT0gJ210MjUwbScgfHwgb3AgIT0gMSkgcHJvZC5zdHlsZS5ib3JkZXIgPSAnMXB4 IHNvbGlkICNkZGRkZGQnOw0KICAgICAgcHJvZC5zdHlsZS5iYWNrZ3JvdW5kQ29s b3IgPSAnI2ZmZmZmZic7DQogICAgfQ0KICB9DQogIA0KICBpZiAob3AgPT0gMSkg ew0KICAgIHBvcHVwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BvcHVwJyk7 DQogICAgaWYgKGlkcHJvZCAhPSAnbXQyNTBtJyAmJiAocG9wdXAuc3R5bGUuZGlz cGxheSA9PSAnJyB8fCBwb3B1cC5zdHlsZS5kaXNwbGF5ID09ICdub25lJykpIHBv cHVwLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgIGVsc2UgaWYgKGlkcHJv ZCA9PSAnbXQyNTBtJykgcG9wdXAuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAg fQ0KICBlbHNlIHsNCiAgICAvL2FsZXJ0KCdFcyBmYSB6b29tIGFsIHByb2R1Y3Rl IHNlbGVjY2lvbmF0IHBlcu+/vSBubyBkZSBjb3Agc2lu77+9IHByb2dyZXNzaXUs IGkgZXMgbW9zdHJlbiBlbHMgZW5sbGHvv71vcyBhIGluZm8gYWRkaWNpb25hbCAo bGxlZ2VuZGEuLi4pIGRcJ2FxdWVzdCBwcm9kdWN0ZSwgZGVzYXBhcmVpeGVudCBl bHMgZGUgbFwnYWJhbnMgc2VsZWNjaW9uYXQuJyk7DQogIH0NCiAgDQp9DQoNCmZ1 bmN0aW9uIGNhbnZpYV9jb2xvciAoY29sb3IpIHsNCiAgDQogIHZhciBlbGVtZW50 cyA9IFsnbWVudV9zdXAnLCdpZGlvbWVzJywncGV1J107DQogIA0KICBzd2l0Y2gg KGNvbG9yKSB7DQogICAgY2FzZSAiYmxhbmMiOg0KICAgICAgZm9yIChpPTA7aTxl bGVtZW50cy5sZW5ndGg7aSsrKSB7DQogICAgICAgIGRvY3VtZW50LmdldEVsZW1l bnRCeUlkKGVsZW1lbnRzW2ldKS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2Zm ZmZmZic7DQogICAgICB9DQogICAgYnJlYWs7DQogICAgY2FzZSAiYmxhdSI6DQog ICAgICBmb3IgKGk9MDtpPGVsZW1lbnRzLmxlbmd0aDtpKyspIHsNCiAgICAgICAg ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudHNbaV0pLnN0eWxlLmJhY2tn cm91bmRDb2xvciA9ICdyZ2IoMjEzLDIyMSwyNDMpJzsNCiAgICAgIH0NCiAgICBi cmVhazsNCiAgICBjYXNlICJncmlzIjoNCiAgICAgIGZvciAoaT0wO2k8ZWxlbWVu dHMubGVuZ3RoO2krKykgew0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZChlbGVtZW50c1tpXSkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNkZGRkZGQn Ow0KICAgICAgfQ0KICAgIGJyZWFrOw0KICAgIGNhc2UgImVzcGVjaWFsIjoNCiAg ICAgIGZvciAoaT0wO2k8ZWxlbWVudHMubGVuZ3RoO2krKykgew0KICAgICAgICBk b2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50c1tpXSkuc3R5bGUuYmFja2dy b3VuZEltYWdlID0gJ3VybChpbWcvcXVhZHJldHMucG5nKSc7DQogICAgICB9DQog ICAgYnJlYWs7DQogICAgZGVmYXVsdDoNCiAgICAgIGZvciAoaT0wO2k8ZWxlbWVu dHMubGVuZ3RoO2krKykgew0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZChlbGVtZW50c1tpXSkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3JnYigyNTUs MjEwLDApJzsNCiAgICAgIH0NCiAgICBicmVhazsNCiAgfQ0KfQ0KDQpmdW5jdGlv biBjb21wYXJhckNhcGEobHlyKXsNCgl2YXIgYWN0aXZlTHlyID0gbWFwLmdldExh eWVyc0J5TmFtZShseXIpWzBdOw0KCWFjdGl2ZUx5ci5zZXRWaXNpYmlsaXR5KHRy dWUpOw0KCWFjdGl2ZU92ZXJsYXkgPSBseXI7DQp9 ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=FileUploadField.js Content-Type: application/javascript; charset=utf-8; name=FileUploadField.js Content-Location: http://www.icc.cat/vissir3/lib/js/FileUploadField.js Content-Transfer-Encoding: Base64 LyohCiAqIEV4dCBKUyBMaWJyYXJ5IDMuMy4wCiAqIENvcHlyaWdodChjKSAyMDA2 LTIwMTAgRXh0IEpTLCBJbmMuCiAqIGxpY2Vuc2luZ0BleHRqcy5jb20KICogaHR0 cDovL3d3dy5leHRqcy5jb20vbGljZW5zZQogKi8KRXh0Lm5zKCdFeHQudXguZm9y bScpOwoKLyoqCiAqIEBjbGFzcyBFeHQudXguZm9ybS5GaWxlVXBsb2FkRmllbGQK ICogQGV4dGVuZHMgRXh0LmZvcm0uVGV4dEZpZWxkCiAqIENyZWF0ZXMgYSBmaWxl IHVwbG9hZCBmaWVsZC4KICogQHh0eXBlIGZpbGV1cGxvYWRmaWVsZAogKi8KRXh0 LnV4LmZvcm0uRmlsZVVwbG9hZEZpZWxkID0gRXh0LmV4dGVuZChFeHQuZm9ybS5U ZXh0RmllbGQsICB7CiAgICAvKioKICAgICAqIEBjZmcge1N0cmluZ30gYnV0dG9u VGV4dCBUaGUgYnV0dG9uIHRleHQgdG8gZGlzcGxheSBvbiB0aGUgdXBsb2FkIGJ1 dHRvbiAoZGVmYXVsdHMgdG8KICAgICAqICdCcm93c2UuLi4nKS4gIE5vdGUgdGhh dCBpZiB5b3Ugc3VwcGx5IGEgdmFsdWUgZm9yIHtAbGluayAjYnV0dG9uQ2ZnfSwg dGhlIGJ1dHRvbkNmZy50ZXh0CiAgICAgKiB2YWx1ZSB3aWxsIGJlIHVzZWQgaW5z dGVhZCBpZiBhdmFpbGFibGUuCiAgICAgKi8KICAgIGJ1dHRvblRleHQ6ICdCcm93 c2UuLi4nLAogICAgLyoqCiAgICAgKiBAY2ZnIHtCb29sZWFufSBidXR0b25Pbmx5 IFRydWUgdG8gZGlzcGxheSB0aGUgZmlsZSB1cGxvYWQgZmllbGQgYXMgYSBidXR0 b24gd2l0aCBubyB2aXNpYmxlCiAgICAgKiB0ZXh0IGZpZWxkIChkZWZhdWx0cyB0 byBmYWxzZSkuICBJZiB0cnVlLCBhbGwgaW5oZXJpdGVkIFRleHRGaWVsZCBtZW1i ZXJzIHdpbGwgc3RpbGwgYmUgYXZhaWxhYmxlLgogICAgICovCiAgICBidXR0b25P bmx5OiBmYWxzZSwKICAgIC8qKgogICAgICogQGNmZyB7TnVtYmVyfSBidXR0b25P ZmZzZXQgVGhlIG51bWJlciBvZiBwaXhlbHMgb2Ygc3BhY2UgcmVzZXJ2ZWQgYmV0 d2VlbiB0aGUgYnV0dG9uIGFuZCB0aGUgdGV4dCBmaWVsZAogICAgICogKGRlZmF1 bHRzIHRvIDMpLiAgTm90ZSB0aGF0IHRoaXMgb25seSBhcHBsaWVzIGlmIHtAbGlu ayAjYnV0dG9uT25seX0gPSBmYWxzZS4KICAgICAqLwogICAgYnV0dG9uT2Zmc2V0 OiAzLAogICAgLyoqCiAgICAgKiBAY2ZnIHtPYmplY3R9IGJ1dHRvbkNmZyBBIHN0 YW5kYXJkIHtAbGluayBFeHQuQnV0dG9ufSBjb25maWcgb2JqZWN0LgogICAgICov CgogICAgLy8gcHJpdmF0ZQogICAgcmVhZE9ubHk6IHRydWUsCgogICAgLyoqCiAg ICAgKiBAaGlkZQogICAgICogQG1ldGhvZCBhdXRvU2l6ZQogICAgICovCiAgICBh dXRvU2l6ZTogRXh0LmVtcHR5Rm4sCgogICAgLy8gcHJpdmF0ZQogICAgaW5pdENv bXBvbmVudDogZnVuY3Rpb24oKXsKICAgICAgICBFeHQudXguZm9ybS5GaWxlVXBs b2FkRmllbGQuc3VwZXJjbGFzcy5pbml0Q29tcG9uZW50LmNhbGwodGhpcyk7Cgog ICAgICAgIHRoaXMuYWRkRXZlbnRzKAogICAgICAgICAgICAvKioKICAgICAgICAg ICAgICogQGV2ZW50IGZpbGVzZWxlY3RlZAogICAgICAgICAgICAgKiBGaXJlcyB3 aGVuIHRoZSB1bmRlcmx5aW5nIGZpbGUgaW5wdXQgZmllbGQncyB2YWx1ZSBoYXMg Y2hhbmdlZCBmcm9tIHRoZSB1c2VyCiAgICAgICAgICAgICAqIHNlbGVjdGluZyBh IG5ldyBmaWxlIGZyb20gdGhlIHN5c3RlbSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cu CiAgICAgICAgICAgICAqIEBwYXJhbSB7RXh0LnV4LmZvcm0uRmlsZVVwbG9hZEZp ZWxkfSB0aGlzCiAgICAgICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSBU aGUgZmlsZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgdW5kZXJseWluZyBmaWxlIGlu cHV0IGZpZWxkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAnZmlsZXNlbGVj dGVkJwogICAgICAgICk7CiAgICB9LAoKICAgIC8vIHByaXZhdGUKICAgIG9uUmVu ZGVyIDogZnVuY3Rpb24oY3QsIHBvc2l0aW9uKXsKICAgICAgICBFeHQudXguZm9y bS5GaWxlVXBsb2FkRmllbGQuc3VwZXJjbGFzcy5vblJlbmRlci5jYWxsKHRoaXMs IGN0LCBwb3NpdGlvbik7CgogICAgICAgIHRoaXMud3JhcCA9IHRoaXMuZWwud3Jh cCh7Y2xzOid4LWZvcm0tZmllbGQtd3JhcCB4LWZvcm0tZmlsZS13cmFwJ30pOwog ICAgICAgIHRoaXMuZWwuYWRkQ2xhc3MoJ3gtZm9ybS1maWxlLXRleHQnKTsKICAg ICAgICB0aGlzLmVsLmRvbS5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsKICAgICAg ICB0aGlzLmNyZWF0ZUZpbGVJbnB1dCgpOwoKICAgICAgICB2YXIgYnRuQ2ZnID0g RXh0LmFwcGx5SWYodGhpcy5idXR0b25DZmcgfHwge30sIHsKICAgICAgICAgICAg dGV4dDogdGhpcy5idXR0b25UZXh0CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5i dXR0b24gPSBuZXcgRXh0LkJ1dHRvbihFeHQuYXBwbHkoYnRuQ2ZnLCB7CiAgICAg ICAgICAgIHJlbmRlclRvOiB0aGlzLndyYXAsCiAgICAgICAgICAgIGNsczogJ3gt Zm9ybS1maWxlLWJ0bicgKyAoYnRuQ2ZnLmljb25DbHMgPyAnIHgtYnRuLWljb24n IDogJycpCiAgICAgICAgfSkpOwoKICAgICAgICBpZih0aGlzLmJ1dHRvbk9ubHkp ewogICAgICAgICAgICB0aGlzLmVsLmhpZGUoKTsKICAgICAgICAgICAgdGhpcy53 cmFwLnNldFdpZHRoKHRoaXMuYnV0dG9uLmdldEVsKCkuZ2V0V2lkdGgoKSk7CiAg ICAgICAgfQoKICAgICAgICB0aGlzLmJpbmRMaXN0ZW5lcnMoKTsKICAgICAgICB0 aGlzLnJlc2l6ZUVsID0gdGhpcy5wb3NpdGlvbkVsID0gdGhpcy53cmFwOwogICAg fSwKICAgIAogICAgYmluZExpc3RlbmVyczogZnVuY3Rpb24oKXsKICAgICAgICB0 aGlzLmZpbGVJbnB1dC5vbih7CiAgICAgICAgICAgIHNjb3BlOiB0aGlzLAogICAg ICAgICAgICBtb3VzZWVudGVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAg IHRoaXMuYnV0dG9uLmFkZENsYXNzKFsneC1idG4tb3ZlcicsJ3gtYnRuLWZvY3Vz J10pCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG1vdXNlbGVhdmU6IGZ1bmN0 aW9uKCl7CiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbi5yZW1vdmVDbGFzcyhb J3gtYnRuLW92ZXInLCd4LWJ0bi1mb2N1cycsJ3gtYnRuLWNsaWNrJ10pCiAgICAg ICAgICAgIH0sCiAgICAgICAgICAgIG1vdXNlZG93bjogZnVuY3Rpb24oKXsKICAg ICAgICAgICAgICAgIHRoaXMuYnV0dG9uLmFkZENsYXNzKCd4LWJ0bi1jbGljaycp CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG1vdXNldXA6IGZ1bmN0aW9uKCl7 CiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbi5yZW1vdmVDbGFzcyhbJ3gtYnRu LW92ZXInLCd4LWJ0bi1mb2N1cycsJ3gtYnRuLWNsaWNrJ10pCiAgICAgICAgICAg IH0sCiAgICAgICAgICAgIGNoYW5nZTogZnVuY3Rpb24oKXsKICAgICAgICAgICAg ICAgIHZhciB2ID0gdGhpcy5maWxlSW5wdXQuZG9tLnZhbHVlOwogICAgICAgICAg ICAgICAgdGhpcy5zZXRWYWx1ZSh2KTsKICAgICAgICAgICAgICAgIHRoaXMuZmly ZUV2ZW50KCdmaWxlc2VsZWN0ZWQnLCB0aGlzLCB2KTsgICAgCiAgICAgICAgICAg IH0KICAgICAgICB9KTsgCiAgICB9LAogICAgCiAgICBjcmVhdGVGaWxlSW5wdXQg OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmZpbGVJbnB1dCA9IHRoaXMud3Jh cC5jcmVhdGVDaGlsZCh7CiAgICAgICAgICAgIGlkOiB0aGlzLmdldEZpbGVJbnB1 dElkKCksCiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZXx8dGhpcy5nZXRJZCgp LAogICAgICAgICAgICBjbHM6ICd4LWZvcm0tZmlsZScsCiAgICAgICAgICAgIHRh ZzogJ2lucHV0JywKICAgICAgICAgICAgdHlwZTogJ2ZpbGUnLAogICAgICAgICAg ICBzaXplOiAxCiAgICAgICAgfSk7CiAgICB9LAogICAgCiAgICByZXNldCA6IGZ1 bmN0aW9uKCl7CiAgICAgICAgdGhpcy5maWxlSW5wdXQucmVtb3ZlKCk7CiAgICAg ICAgdGhpcy5jcmVhdGVGaWxlSW5wdXQoKTsKICAgICAgICB0aGlzLmJpbmRMaXN0 ZW5lcnMoKTsKICAgICAgICBFeHQudXguZm9ybS5GaWxlVXBsb2FkRmllbGQuc3Vw ZXJjbGFzcy5yZXNldC5jYWxsKHRoaXMpOwogICAgfSwKCiAgICAvLyBwcml2YXRl CiAgICBnZXRGaWxlSW5wdXRJZDogZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4g dGhpcy5pZCArICctZmlsZSc7CiAgICB9LAoKICAgIC8vIHByaXZhdGUKICAgIG9u UmVzaXplIDogZnVuY3Rpb24odywgaCl7CiAgICAgICAgRXh0LnV4LmZvcm0uRmls ZVVwbG9hZEZpZWxkLnN1cGVyY2xhc3Mub25SZXNpemUuY2FsbCh0aGlzLCB3LCBo KTsKCiAgICAgICAgdGhpcy53cmFwLnNldFdpZHRoKHcpOwoKICAgICAgICBpZigh dGhpcy5idXR0b25Pbmx5KXsKICAgICAgICAgICAgdmFyIHcgPSB0aGlzLndyYXAu Z2V0V2lkdGgoKSAtIHRoaXMuYnV0dG9uLmdldEVsKCkuZ2V0V2lkdGgoKSAtIHRo aXMuYnV0dG9uT2Zmc2V0OwogICAgICAgICAgICB0aGlzLmVsLnNldFdpZHRoKHcp OwogICAgICAgIH0KICAgIH0sCgogICAgLy8gcHJpdmF0ZQogICAgb25EZXN0cm95 OiBmdW5jdGlvbigpewogICAgICAgIEV4dC51eC5mb3JtLkZpbGVVcGxvYWRGaWVs ZC5zdXBlcmNsYXNzLm9uRGVzdHJveS5jYWxsKHRoaXMpOwogICAgICAgIEV4dC5k ZXN0cm95KHRoaXMuZmlsZUlucHV0LCB0aGlzLmJ1dHRvbiwgdGhpcy53cmFwKTsK ICAgIH0sCiAgICAKICAgIG9uRGlzYWJsZTogZnVuY3Rpb24oKXsKICAgICAgICBF eHQudXguZm9ybS5GaWxlVXBsb2FkRmllbGQuc3VwZXJjbGFzcy5vbkRpc2FibGUu Y2FsbCh0aGlzKTsKICAgICAgICB0aGlzLmRvRGlzYWJsZSh0cnVlKTsKICAgIH0s CiAgICAKICAgIG9uRW5hYmxlOiBmdW5jdGlvbigpewogICAgICAgIEV4dC51eC5m b3JtLkZpbGVVcGxvYWRGaWVsZC5zdXBlcmNsYXNzLm9uRW5hYmxlLmNhbGwodGhp cyk7CiAgICAgICAgdGhpcy5kb0Rpc2FibGUoZmFsc2UpOwoKICAgIH0sCiAgICAK ICAgIC8vIHByaXZhdGUKICAgIGRvRGlzYWJsZTogZnVuY3Rpb24oZGlzYWJsZWQp ewogICAgICAgIHRoaXMuZmlsZUlucHV0LmRvbS5kaXNhYmxlZCA9IGRpc2FibGVk OwogICAgICAgIHRoaXMuYnV0dG9uLnNldERpc2FibGVkKGRpc2FibGVkKTsKICAg IH0sCgoKICAgIC8vIHByaXZhdGUKICAgIHByZUZvY3VzIDogRXh0LmVtcHR5Rm4s CgogICAgLy8gcHJpdmF0ZQogICAgYWxpZ25FcnJvckljb24gOiBmdW5jdGlvbigp ewogICAgICAgIHRoaXMuZXJyb3JJY29uLmFsaWduVG8odGhpcy53cmFwLCAndGwt dHInLCBbMiwgMF0pOwogICAgfQoKfSk7CgpFeHQucmVnKCdmaWxldXBsb2FkZmll bGQnLCBFeHQudXguZm9ybS5GaWxlVXBsb2FkRmllbGQpOwoKLy8gYmFja3dhcmRz IGNvbXBhdApFeHQuZm9ybS5GaWxlVXBsb2FkRmllbGQgPSBFeHQudXguZm9ybS5G aWxlVXBsb2FkRmllbGQ7Cg== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=Ext.ux.ColorField.js Content-Type: application/javascript; charset=utf-8; name=Ext.ux.ColorField.js Content-Location: http://www.icc.cat/vissir3/lib/ux/ColorField/Ext.ux.ColorField.js Content-Transfer-Encoding: Base64 RXh0Lm5hbWVzcGFjZSgnRXh0LnV4Jyk7CgpFeHQudXguQ29sb3JGaWVsZCA9IEV4 dC5leHRlbmQoRXh0LmZvcm0uVHJpZ2dlckZpZWxkLCAgewoKICAgIHRyaWdnZXJD b25maWc6IHsKICAgICAgICBzcmM6IEV4dC5CTEFOS19JTUFHRV9VUkwsCiAgICAg ICAgdGFnOiAiaW1nIiwKICAgICAgICBjbHM6ICJ4LWZvcm0tdHJpZ2dlciB4LWZv cm0tY29sb3ItdHJpZ2dlciIKICAgIH0sCiAgICBpbnZhbGlkVGV4dCA6ICJDb2xv cnMgbXVzdCBiZSBpbiBhIHRoZSBoZXggZm9ybWF0ICNGRkZGRkYuIiwKICAgIHJl Z2V4OiAvXlwjWzAtOUEtRl17Nn0kL2ksCiAgICBhbGxvd0JsYW5rOiBmYWxzZSwK CiAgICBpbml0Q29tcG9uZW50IDogZnVuY3Rpb24oKXsKICAgICAgICBFeHQudXgu Q29sb3JGaWVsZC5zdXBlcmNsYXNzLmluaXRDb21wb25lbnQuY2FsbCh0aGlzKTsK ICAgICAgICB0aGlzLmFkZEV2ZW50cygnc2VsZWN0Jyk7CiAgICAgICAgdGhpcy5v bignY2hhbmdlJywgZnVuY3Rpb24oYywgdil7CiAgICAgICAgICAgIHRoaXMub25T ZWxlY3QoYywgdik7CiAgICAgICAgfSwgdGhpcyk7CiAgICB9LAoKICAgIC8vIHBy aXZhdGUKICAgIG9uRGVzdHJveSA6IGZ1bmN0aW9uKCl7CgkJRXh0LmRlc3Ryb3ko dGhpcy5tZW51KTsKICAgICAgICBFeHQudXguQ29sb3JGaWVsZC5zdXBlcmNsYXNz Lm9uRGVzdHJveS5jYWxsKHRoaXMpOwogICAgfSwKICAgIAogICAgLy8gcHJpdmF0 ZQogICAgYWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uKCl7CiAgICAgICAgRXh0LnV4LkNv bG9yRmllbGQuc3VwZXJjbGFzcy5hZnRlclJlbmRlci5jYWxsKHRoaXMpOwogICAg ICAgIHRoaXMuZWwuc2V0U3R5bGUoJ2JhY2tncm91bmQnLCB0aGlzLnZhbHVlKTsK ICAgICAgICB0aGlzLmRldGVjdEZvbnRDb2xvcigpOyAgICAgICAgCiAgICB9LAoK ICAgIC8qKgogICAgICogQG1ldGhvZCBvblRyaWdnZXJDbGljawogICAgICogQGhp ZGUKICAgICAqLwogICAgLy8gcHJpdmF0ZQogICAgb25UcmlnZ2VyQ2xpY2sgOiBm dW5jdGlvbigpewoJCWlmKHRoaXMuZGlzYWJsZWQpewogICAgICAgICAgICByZXR1 cm47CiAgICAgICAgfQogICAgICAgIGlmKHRoaXMubWVudSA9PSBudWxsKXsKICAg ICAgICAgICAgdGhpcy5tZW51ID0gbmV3IEV4dC51eC5Db2xvck1lbnUoewogICAg ICAgICAgICAgICAgaGlkZU9uQ2xpY2s6IGZhbHNlLAogICAgICAgICAgICAgICAg ZmFsbGJhY2s6IHRoaXMuZmFsbGJhY2sKICAgICAgICAgICAgfSk7CiAgICAgICAg fQogICAgICAgIHRoaXMub25Gb2N1cygpOwogICAgICAgIHRoaXMubWVudS5waWNr ZXIuc2V0VmFsdWUodGhpcy5nZXRWYWx1ZSgpIHx8ICcjRkZGRkZGJyk7CiAgICAg ICAgdGhpcy5tZW51LnNob3codGhpcy5lbCwgInRsLWJsPyIpOwogICAgICAgIHRo aXMubWVudUV2ZW50cygnb24nKTsKICAgIH0sCiAgICAKICAgIC8vcHJpdmF0ZQog ICAgbWVudUV2ZW50czogZnVuY3Rpb24obWV0aG9kKXsKICAgICAgICB0aGlzLm1l bnVbbWV0aG9kXSgnc2VsZWN0JywgdGhpcy5vblNlbGVjdCwgdGhpcyk7CiAgICAg ICAgdGhpcy5tZW51W21ldGhvZF0oJ2hpZGUnLCB0aGlzLm9uTWVudUhpZGUsIHRo aXMpOwogICAgICAgIHRoaXMubWVudVttZXRob2RdKCdzaG93JywgdGhpcy5vbkZv Y3VzLCB0aGlzKTsKICAgIH0sCiAgICAKICAgIG9uU2VsZWN0OiBmdW5jdGlvbiht LCBkKXsKCQl0aGlzLnNldFZhbHVlKGQpOwogICAgICAgIHRoaXMuZmlyZUV2ZW50 KCdzZWxlY3QnLCB0aGlzLCBkKTsKICAgICAgICB0aGlzLmVsLnNldFN0eWxlKCdi YWNrZ3JvdW5kJywgZCk7CiAgICAgICAgdGhpcy5kZXRlY3RGb250Q29sb3IoKTsK CQl0aGlzLm1lbnVFdmVudHMoJ2hpZGUnKTsKICAgIH0sCiAgICAKICAgIC8vIHBy aXZhdGUKICAgIC8vIERldGVjdHMgd2hldGhlciB0aGUgZm9udCBjb2xvciBzaG91 bGQgYmUgd2hpdGUgb3IgYmxhY2ssIGFjY29yZGluZyB0byB0aGUKICAgIC8vIGN1 cnJlbnQgY29sb3Igb2YgdGhlIGJhY2tncm91bmQKICAgIGRldGVjdEZvbnRDb2xv ciA6IGZ1bmN0aW9uKCl7CgkgICAgaWYoIXRoaXMubWVudSB8fCAhdGhpcy5tZW51 LnBpY2tlci5yYXdWYWx1ZSl7CiAgICAgICAgICAgIGlmKCF0aGlzLnZhbHVlKQog ICAgICAgICAgICAgICAgdmFsdWUgPSAnRkZGRkZGJzsKICAgICAgICAgICAgZWxz ZXsKICAgICAgICAgICAgICAgIHZhciBoMmQgPSBmdW5jdGlvbihkKXsgcmV0dXJu IHBhcnNlSW50KGQsIDE2KTsgfQogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0g WwogICAgICAgICAgICAgICAgICAgIGgyZCh0aGlzLnZhbHVlLnNsaWNlKDEsIDMp KSwKICAgICAgICAgICAgICAgICAgICBoMmQodGhpcy52YWx1ZS5zbGljZSgzLCA1 KSksCiAgICAgICAgICAgICAgICAgICAgaDJkKHRoaXMudmFsdWUuc2xpY2UoNSkp CiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICB9CiAgICAgICAgfWVsc2UK ICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5tZW51LnBpY2tlci5yYXdWYWx1 ZTsKICAgICAgICB2YXIgYXZnID0gKHZhbHVlWzBdICsgdmFsdWVbMV0gKyB2YWx1 ZVsyXSkgLyAzOwogICAgICAgIHRoaXMuZWwuc2V0U3R5bGUoJ2NvbG9yJywgKGF2 ZyA+IDEyOCkgPyAnIzAwMCcgOiAnI0ZGRicpOwogICAgfSwgICAgCiAgICAKICAg IG9uTWVudUhpZGU6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5mb2N1cyhmYWxz ZSwgNjApOwogICAgICAgIHRoaXMubWVudUV2ZW50cygndW4nKTsKICAgIH0KICAg IAp9KTsgICAgCgpFeHQudXguQ29sb3JNZW51ID0gRXh0LmV4dGVuZChFeHQubWVu dS5NZW51LCB7CgogICBlbmFibGVTY3JvbGxpbmc6IGZhbHNlLAoKICAgaW5pdENv bXBvbmVudDogZnVuY3Rpb24oKXsKICAgICAgIAogICAgICAgRXh0LmFwcGx5KHRo aXMsIHsKICAgICAgICAgICBwbGFpbjogdHJ1ZSwKICAgICAgICAgICBzaG93U2Vw YXJhdG9yOiBmYWxzZSwKICAgICAgICAgICBpdGVtczogdGhpcy5waWNrZXIgPSBu ZXcgRXh0LnV4LkNvbG9yUGlja2VyKEV4dC5hcHBseSh7CiAgICAgICAgICAgICAg IGludGVybmFsUmVuZGVyOiB0aGlzLnN0cmljdCB8fCAhRXh0LmlzSUUsCiAgICAg ICAgICAgICAgIHdoZWVsSW1hZ2U6IHRoaXMud2hlZWxJbWFnZSwKICAgICAgICAg ICAgICAgZ3JhZGllbnRJbWFnZTogdGhpcy5ncmFkaWVudEltYWdlLAogICAgICAg ICAgICAgICBmYWxsYmFjazogdGhpcy5mYWxsYmFjawogICAgICAgICAgIH0sIHRo aXMuaW5pdGlhbENvbmZpZykpCiAgICAgICB9KTsKICAgICAgIHRoaXMucGlja2Vy LnB1cmdlTGlzdGVuZXJzKCk7CiAgICAgICBFeHQudXguQ29sb3JNZW51LnN1cGVy Y2xhc3MuaW5pdENvbXBvbmVudC5jYWxsKHRoaXMpOwogICAgICAgdGhpcy5yZWxh eUV2ZW50cyh0aGlzLnBpY2tlciwgWyJzZWxlY3QiXSk7CiAgICAgICB0aGlzLm9u KCdzZWxlY3QnLCB0aGlzLm1lbnVIaWRlLCB0aGlzKTsKICAgICAgIGlmKHRoaXMu aGFuZGxlcil7CiAgICAgICAgICAgdGhpcy5vbignc2VsZWN0JywgdGhpcy5oYW5k bGVyLCB0aGlzLnNjb3BlIHx8IHRoaXMpOwogICAgICAgfQogICB9LAoKICAgbWVu dUhpZGU6IGZ1bmN0aW9uKCkgewogICAgICAgaWYodGhpcy5oaWRlT25DbGljayl7 CiAgICAgICAgICAgdGhpcy5oaWRlKHRydWUpOwogICAgICAgfQogICB9LAogICAK ICAgZG9MYXlvdXQ6IGZ1bmN0aW9uKHNoYWxsb3csIGZvcmNlKXsKICAgICAgIEV4 dC51eC5Db2xvck1lbnUuc3VwZXJjbGFzcy5kb0xheW91dC5jYWxsKHRoaXMsIHNo YWxsb3csIGZvcmNlKTsKICAgICAgIHRoaXMuZ2V0RWwoKS5zZXRaSW5kZXgoMzAw MDApOwogICB9CiAgIAp9KTsKCi8qIFByZWxvYWQgdGhlIHBpY2tlciBpbWFnZXMg c28gdGhleSdyZSBhdmFpbGFibGUgYXQgcmVuZGVyIHRpbWUgKi8KRXh0LnV4LkNv bG9yTWVudS5wcm90b3R5cGUud2hlZWxJbWFnZSA9IChmdW5jdGlvbigpewogICAg dmFyIHdoZWVsSW1hZ2UgPSBuZXcgSW1hZ2UoKTsKICAgIHdoZWVsSW1hZ2Uub25s b2FkID0gRXh0LmVtcHR5Rm47CiAgICB3aGVlbEltYWdlLnNyYyA9ICdsaWIvdXgv Q29sb3JGaWVsZC9pbWFnZXMvd2hlZWwucG5nJzsKICAgIHJldHVybiB3aGVlbElt YWdlOwp9KSgpOwoKRXh0LnV4LkNvbG9yTWVudS5wcm90b3R5cGUuZ3JhZGllbnRJ bWFnZSA9IChmdW5jdGlvbigpewogICAgdmFyIGdyYWRpZW50SW1hZ2UgPSBuZXcg SW1hZ2UoKTsKICAgIGdyYWRpZW50SW1hZ2Uub25sb2FkID0gRXh0LmVtcHR5Rm47 CiAgICBncmFkaWVudEltYWdlLnNyYyA9ICdsaWIvdXgvQ29sb3JGaWVsZC9pbWFn ZXMvZ3JhZGllbnQucG5nJzsKICAgIHJldHVybiBncmFkaWVudEltYWdlOwp9KSgp OwoKRXh0LnV4LkNvbG9yUGlja2VyID0gZnVuY3Rpb24oY29uZmlnKXsKICAgIEV4 dC51eC5Db2xvclBpY2tlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhp cywgY29uZmlnKTsKICAgIHRoaXMuYWRkRXZlbnRzKAogICAgICAgIC8qKgoJICAg ICAqIEBldmVudCBzZWxlY3QKCSAgICAgKiBGaXJlcyB3aGVuIGEgY29sb3IgaXMg c2VsZWN0ZWQKCSAgICAgKiBAcGFyYW0ge0NvbG9yUGFsZXR0ZX0gdGhpcwoJICAg ICAqIEBwYXJhbSB7U3RyaW5nfSBjb2xvciBUaGUgNi1kaWdpdCBjb2xvciBoZXgg Y29kZSAod2l0aG91dCB0aGUgIyBzeW1ib2wpCgkgICAgICovCiAgICAgICAgJ3Nl bGVjdCcKICAgICk7CiAgICAKICAgIGlmKCF0aGlzLnZhbHVlKQogICAgICAgIHRo aXMudmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZTsKCiAgICBpZih0aGlzLmhhbmRs ZXIpewogICAgICAgIHRoaXMub24oInNlbGVjdCIsIHRoaXMuaGFuZGxlciwgdGhp cy5zY29wZSwgdHJ1ZSk7CiAgICB9CiAgICAKfTsKRXh0LmV4dGVuZChFeHQudXgu Q29sb3JQaWNrZXIsIEV4dC5Db2xvclBhbGV0dGUsIHsKICAgIGNhbnZhc1N1cHBv cnRlZDogdHJ1ZSwKICAgIGl0ZW1DbHM6ICd4LWNvbG9yLXBpY2tlcicsCiAgICBk ZWZhdWx0VmFsdWU6ICIjMDAwMEZGIiwKICAgIHdpZHRoOiAyMDAsCiAgICAvLyBw cml2YXRlCiAgICBvblJlbmRlciA6IGZ1bmN0aW9uKGNvbnRhaW5lciwgcG9zaXRp b24pewogICAgICAgIGlmKCF0aGlzLnZhbHVlKQogICAgICAgICAgICB0aGlzLnZh bHVlID0gdGhpcy5kZWZhdWx0VmFsdWU7CiAgICAgICAgdmFyIGVsID0gZG9jdW1l bnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgZWwuY2xhc3NOYW1lID0g dGhpcy5pdGVtQ2xzOwogICAgICAgIGNvbnRhaW5lci5kb20uaW5zZXJ0QmVmb3Jl KGVsLCBwb3NpdGlvbik7CiAgICAgICAgRXh0LmdldChlbCkuc2V0V2lkdGgodGhp cy53aWR0aCk7CiAgICAgICAgdGhpcy5jYW52YXNkaXYgPSBFeHQuZ2V0KGVsKS5j cmVhdGVDaGlsZCh7CiAgICAgICAgICAgIHRhZzogJ2RpdicKICAgICAgICB9KTsK ICAgICAgICB0aGlzLndoZWVsID0gdGhpcy5jYW52YXNkaXYuZG9tLmFwcGVuZENo aWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpKTsKICAgICAgICB0 aGlzLndoZWVsLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMjAwJyk7CiAgICAgICAg dGhpcy53aGVlbC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcyMDAnKTsKICAgICAg ICB0aGlzLndoZWVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAneC1jb2xvci1waWNr ZXItd2hlZWwnKTsKICAgICAgICAKICAgICAgICBpZih0aGlzLmZhbGxiYWNrIHx8 ICF0aGlzLndoZWVsLmdldENvbnRleHQgfHwgIXRoaXMud2hlZWwuZ2V0Q29udGV4 dCgnMmQnKS5nZXRJbWFnZURhdGEpewogICAgICAgICAgICB0aGlzLmNhbnZhc1N1 cHBvcnRlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLml0ZW1DbHMgPSAneC1j b2xvci1wYWxldHRlJzsKICAgICAgICAgICAgd2hpbGUoY29udGFpbmVyLmRvbS5m aXJzdENoaWxkKXsgY29udGFpbmVyLmRvbS5yZW1vdmVDaGlsZChjb250YWluZXIu ZG9tLmZpcnN0Q2hpbGQpOyB9CiAgICAgICAgICAgIEV4dC51eC5Db2xvclBpY2tl ci5zdXBlcmNsYXNzLm9uUmVuZGVyLmNhbGwodGhpcywgY29udGFpbmVyLCBwb3Np dGlvbik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgCiAg ICAgICAgLyogRHJhdyB0aGUgd2hlZWwgaW1hZ2Ugb250byB0aGUgY29udGFpbmVy ICovCgkJdGhpcy5kcmF3V2hlZWwodGhpcy53aGVlbC5nZXRDb250ZXh0KCcyZCcp LGNvbnRhaW5lcixwb3NpdGlvbik7CgkJLy90aGlzLndoZWVsLmdldENvbnRleHQo JzJkJykuZHJhd0ltYWdlKHRoaXMud2hlZWxJbWFnZSwgMCwgMCk7CiAgICAgICAg dGhpcy5kcmF3R3JhZGllbnQoKTsKICAgICAgICAKICAgICAgICBFeHQuZ2V0KHRo aXMud2hlZWwpLm9uKCdjbGljaycsIHRoaXMuc2VsZWN0LCB0aGlzKTsKICAgICAg ICAKICAgICAgICB0aGlzLmVsID0gRXh0LmdldChlbCk7CiAgICB9LAogICAgCglk cmF3V2hlZWwgOiBmdW5jdGlvbiAoY29udGV4dCxjb250YWluZXIscG9zaXRpb24p ewoJICAgLy8gdmFyIHdoZWVsSW1hZ2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgi aW1nIik7CgkJLy93aGVlbEltYWdlLnNyYyA9ICdleHQtdXgvQ29sb3JGaWVsZC9p bWFnZXMvd2hlZWwucG5nJzsKCSAgICAvL2NvbnRhaW5lci5kb20uaW5zZXJ0QmVm b3JlKHdoZWVsSW1hZ2UsIHBvc2l0aW9uKTsKCSAgICB2YXIgd2hlZWxJbWFnZSA9 IG5ldyBJbWFnZSgpOwoJCXdoZWVsSW1hZ2Uub25sb2FkID0gZnVuY3Rpb24oKSB7 IGNvbnRleHQuZHJhd0ltYWdlKHdoZWVsSW1hZ2UsIDAsIDApO30KCQl3aGVlbElt YWdlLnNyYyA9ICdsaWIvdXgvQ29sb3JGaWVsZC9pbWFnZXMvd2hlZWwucG5nJzsK CQkvL2NvbnRleHQuZHJhd0ltYWdlKHdoZWVsSW1hZ2UsIDAsIDApOwoJfSAsCgkK ICAgIC8vIHByaXZhdGUKICAgIGFmdGVyUmVuZGVyIDogZnVuY3Rpb24oKXsKICAg ICAgICBFeHQuQ29sb3JQYWxldHRlLnN1cGVyY2xhc3MuYWZ0ZXJSZW5kZXIuY2Fs bCh0aGlzKTsKICAgICAgICBpZighdGhpcy5jYW52YXNTdXBwb3J0ZWQpIHJldHVy bjsKICAgICAgICAvKiBGaXJlIHNlbGVjdGlvbiBldmVudHMgb24gZHJhZyAqLwog ICAgICAgIHZhciB0ID0gbmV3IEV4dC5kZC5EcmFnRHJvcCh0aGlzLndoZWVsKTsK ICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgdC5vbkRyYWcgPSBmdW5j dGlvbihlLCB0KXsKICAgICAgICAgICAgc2VsZi5zZWxlY3QoZSwgdGhpcy5ERE0u Y3VycmVudFRhcmdldCk7CiAgICAgICAgfTsKICAgIH0sCiAgICAKICAgIHNlbGVj dCA6IGZ1bmN0aW9uKGUsIHQpewogICAgICAgIGlmKCF0aGlzLmNhbnZhc1N1cHBv cnRlZCl7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBlOwogICAgICAgICAgICBF eHQudXguQ29sb3JQaWNrZXIuc3VwZXJjbGFzcy5zZWxlY3QuY2FsbCh0aGlzLCBl KTsKICAgICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ3NlbGVjdCcsIHRoaXMsICcj Jyt0aGlzLnZhbHVlKTsgCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAg ICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLndoZWVsLmdldENvbnRleHQoJzJkJyk7 CiAgICAgICAgdmFyIGNvb3JkcyA9IFsKICAgICAgICAgICAgZS54eVswXSAtIEV4 dC5nZXQodCkuZ2V0TGVmdCgpLAogICAgICAgICAgICBlLnh5WzFdIC0gRXh0Lmdl dCh0KS5nZXRUb3AoKQogICAgICAgIF07CiAgICAgICAgCiAgICAgICAgdHJ5ewog ICAgICAgICAgICB2YXIgZGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKGNvb3Jk c1swXSwgY29vcmRzWzFdLCAxLCAxKTsKICAgICAgICB9Y2F0Y2goZSl7IHJldHVy bjsgfSAvLyBUaGUgdXNlciBzZWxlY3RlZCBhbiBhcmVhIG91dHNpZGUgdGhlIDxj YW52YXM+CiAgICAgICAgCiAgICAgICAgLy8gRGlzYWxsb3cgc2VsZWN0aW5nIHRy YW5zcGFyZW50IHJlZ2lvbnMKICAgICAgICBpZihkYXRhLmRhdGFbM10gPT0gMCl7 CiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5ncmFkaWVudC5nZXRDb250 ZXh0KCcyZCcpOwogICAgICAgICAgICB2YXIgZGF0YSA9IGNvbnRleHQuZ2V0SW1h Z2VEYXRhKGNvb3Jkc1swXSwgY29vcmRzWzFdLCAxLCAxKTsKICAgICAgICAgICAg aWYoZGF0YS5kYXRhWzNdID09IDApIHJldHVybjsKICAgICAgICAgICAgCiAgICAg ICAgICAgIHRoaXMucmF3VmFsdWUgPSBkYXRhLmRhdGE7CiAgICAgICAgICAgIHRo aXMudmFsdWUgPSB0aGlzLmhleFZhbHVlKGRhdGEuZGF0YVswXSwgZGF0YS5kYXRh WzFdLCBkYXRhLmRhdGFbMl0pOwogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgn c2VsZWN0JywgdGhpcywgdGhpcy52YWx1ZSk7CiAgICAgICAgfWVsc2V7CiAgICAg ICAgICAgIHRoaXMucmF3VmFsdWUgPSBkYXRhLmRhdGE7CiAgICAgICAgICAgIHRo aXMudmFsdWUgPSB0aGlzLmhleFZhbHVlKGRhdGEuZGF0YVswXSwgZGF0YS5kYXRh WzFdLCBkYXRhLmRhdGFbMl0pOwogICAgICAgICAgICB0aGlzLmRyYXdHcmFkaWVu dCgpOwogICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgnc2VsZWN0JywgdGhpcywg dGhpcy52YWx1ZSk7CiAgICAgICAgfQogICAgfSwKICAgIAogICAgLy8gcHJpdmF0 ZQogICAgZHJhd0dyYWRpZW50IDogZnVuY3Rpb24oKXsKICAgICAgICBpZighdGhp cy5ncmFkaWVudCl7CiAgICAgICAgICAgIHRoaXMuZ3JhZGllbnQgPSB0aGlzLmNh bnZhc2Rpdi5kb20uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgi Y2FudmFzIikpOwogICAgICAgICAgICB0aGlzLmdyYWRpZW50LnNldEF0dHJpYnV0 ZSgnd2lkdGgnLCAnMjAwJyk7CiAgICAgICAgICAgIHRoaXMuZ3JhZGllbnQuc2V0 QXR0cmlidXRlKCdoZWlnaHQnLCAnMjAwJyk7CiAgICAgICAgICAgIHRoaXMuZ3Jh ZGllbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsICd4LWNvbG9yLXBpY2tlci1ncmFk aWVudCcpOwogICAgICAgICAgICBpZih0eXBlb2YgR192bWxDYW52YXNNYW5hZ2Vy ICE9ICd1bmRlZmluZWQnKSAKICAgICAgICAgICAgICAgIHRoaXMuZ3JhZGllbnQg PSBHX3ZtbENhbnZhc01hbmFnZXIuaW5pdEVsZW1lbnQodGhpcy5ncmFkaWVudCk7 CiAgICAgICAgICAgIEV4dC5nZXQodGhpcy5ncmFkaWVudCkub24oJ2NsaWNrJywg dGhpcy5zZWxlY3QsIHRoaXMpOwogICAgICAgIH0KICAgICAgICB2YXIgY29udGV4 dCA9IHRoaXMuZ3JhZGllbnQuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICB2YXIg Y2VudGVyID0gWzk3LjUsIDk4XTsKICAgICAgICAKICAgICAgICAvLyBDbGVhciB0 aGUgY2FudmFzIGZpcnN0CiAgICAgICAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwg dGhpcy5ncmFkaWVudC53aWR0aCwgdGhpcy5ncmFkaWVudC5oZWlnaHQpCiAgICAg ICAgCiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTsKICAgICAgICBjb250ZXh0 LmZpbGxTdHlsZSA9IHRoaXMudmFsdWU7CiAgICAgICAgY29udGV4dC5zdHJva2VT dHlsZSA9IHRoaXMudmFsdWU7CiAgICAgICAgY29udGV4dC5hcmMoY2VudGVyWzBd LCBjZW50ZXJbMF0sIDY1LCAwLCAyKk1hdGguUEksIGZhbHNlKTsKICAgIAljb250 ZXh0LmNsb3NlUGF0aCgpOwogICAgCWNvbnRleHQuZmlsbCgpOwogICAgCQogICAg ICAgIC8qIERyYXcgdGhlIHdoZWVsIGltYWdlIG9udG8gdGhlIGNvbnRhaW5lciAq LwoJCSAgLy90aGlzLmdyYWRpZW50LmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdl KHRoaXMuZ3JhZGllbnRJbWFnZSwgMzMsIDMyKTsKCQl0aGlzLmRyYXdHcmFkKGNv bnRleHQpOwogICAgICAgIAogICAgfSwKICAgIAoJZHJhd0dyYWQgOiBmdW5jdGlv biAoY29udGV4dCl7CgkJdmFyIGdyYWRpZW50SW1hZ2UgPSBuZXcgSW1hZ2UoKTsK CQlncmFkaWVudEltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uKCkgeyBjb250ZXh0LmRy YXdJbWFnZShncmFkaWVudEltYWdlLCAzMywgMzIpO30KCQlncmFkaWVudEltYWdl LnNyYyA9ICdsaWIvdXgvQ29sb3JGaWVsZC9pbWFnZXMvZ3JhZGllbnQucG5nJzsK CQkKCQkvL2NvbnRleHQuZHJhd0ltYWdlKGdyYWRpZW50SW1hZ2UsIDMzLCAzMik7 Cgl9LAoJCiAgICAvLyBwcml2YXRlCiAgICBoZXhWYWx1ZSA6IGZ1bmN0aW9uKHIs ZyxiKXsKICAgICAgICB2YXIgY2hhcnMgPSAnMDEyMzQ1Njc4OUFCQ0RFRic7CiAg ICAgICAgcmV0dXJuICcjJysoCiAgICAgICAgICAgIGNoYXJzW3BhcnNlSW50KHIv MTYpXSArIGNoYXJzW3BhcnNlSW50KHIlMTYpXSArCiAgICAgICAgICAgIGNoYXJz W3BhcnNlSW50KGcvMTYpXSArIGNoYXJzW3BhcnNlSW50KGclMTYpXSArCiAgICAg ICAgICAgIGNoYXJzW3BhcnNlSW50KGIvMTYpXSArIGNoYXJzW3BhcnNlSW50KGIl MTYpXQogICAgICAgICk7CiAgICB9LAogICAgCiAgICBnZXRWYWx1ZTogZnVuY3Rp b24oKXsKICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgIH0sCiAgICAKICAg IHNldFZhbHVlOiBmdW5jdGlvbih2KXsKICAgICAgICB0aGlzLnZhbHVlID0gdjsK ICAgIH0KfSk7CkV4dC5yZWcoJ2NvbG9yZmllbGQnLCBFeHQudXguQ29sb3JGaWVs ZCk7 ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=Ext.ux.ColorField.css Content-Type: text/css; charset=utf-8; name=Ext.ux.ColorField.css Content-Location: http://www.icc.cat/vissir3/lib/ux/ColorField/Ext.ux.ColorField.css Content-Transfer-Encoding: 8bit .x-color-picker, .x-color-picker { height: 195px; position: relative; overflow: hidden; } .x-color-picker div canvas { position: absolute; top: 0; left: 0; cursor: pointer; } .x-color-picker-wheel { z-index: 1; } .x-color-picker-gradient { z-index: 0; } ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=inc.descarrega.js Content-Type: application/javascript; charset=utf-8; name=inc.descarrega.js Content-Location: http://www.icc.cat/vissir3/app/lib/App/inc.descarrega.js Content-Transfer-Encoding: Base64 dmFyIGRlc2NhcnJlZ3Vlc0hUTUw9ZnVuY3Rpb24oKXtzd2l0Y2goQXBwLmxheW91 dC5pZGlvbWEpe2Nhc2UiY2F0Ijp2YXIgYT0nPGRpdiBpZD0icHJvZF9pbmRleCI+ ICAgIDxkaXYgY2xhc3M9ImVudW5jaWF0Ij48c3BhbiBzdHlsZT0iZm9udC13ZWln aHQ6Ym9sZCI+UHJvZHVjdGVzPC9zcGFuPjwvZGl2PiAgICA8aHIgc3R5bGU9ImJv cmRlcjoxcHggc29saWQgI2FhYTsiLz4gIDxkaXYgY2xhc3M9InRpdG9sX3Byb2Qi PkJhaXhhIHJlc29sdWNpJm9hY3V0ZTs6PC9kaXY+ICAgIDxmb3JtIG5hbWU9ImZv cm1zbmFwIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iL3NlcnZlaXNHdWlhQ2FycmVy cy9tYXBTbmFwc2hvdCIgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj48aW5wdXQgdHlw ZT0iaGlkZGVuIiBuYW1lPSJwb3N0Qm9keSIgLz48cCBjbGFzcz0icGxpc3QiPiYj ODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpnZXRTbmFwc2hvdChcJ2Zvcm1zbmFw XCcpO2phdmFzY3JpcHQ6X2dhcS5wdXNoKFtcJ190cmFja0V2ZW50XCcsIFwndmlz c2lyXCcsIFwnc25hcHNob3RcJ10pOyI+VmlzdGEgYWN0dWFsPC9hPiA8c3BhbiBz dHlsZT0iZm9udC1zaXplOjEwcHgiPihGb3JtYXQganBnLiBTaXMuIFJlZi4gRUQ1 MCk8L3NwYW4+PC9wPjwvZm9ybT4gIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4g IDxkaXYgY2xhc3M9InRpdG9sX3Byb2QiPkFsdGEgcmVzb2x1Y2kmb2FjdXRlOzo8 L2Rpdj4gIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4gIDxkaXYgY2xhc3M9ImVu dW5jaWF0Ij5Ub3BvZ3ImYWdyYXZlO2ZpY3M8L2Rpdj4gICA8cCBjbGFzcz0icGxp c3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2lu ZGV4XCcsMCk7bW9zdHJhKFwncHJvZF9wMTAwMFwnLDEpOyI+Q2FydG9ncmFmaWEg dG9wb2dyJmFncmF2ZTtmaWNhIDE6MS4wMDA8L2E+PC9wPiAgIDxwIGNsYXNzPSJw bGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2Rf aW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX2J0NW1cJywxKTsiPkJhc2UgdG9wb2dy JmFncmF2ZTtmaWNhIDE6NS4wMDA8L2E+PC9saT4gICA8cCBjbGFzcz0icGxpc3Qi PiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4 XCcsMCk7bW9zdHJhKFwncHJvZF9tdDEwbVwnLDEpOyI+TWFwYSB0b3BvZ3ImYWdy YXZlO2ZpYyAxOjEwLjAwMDwvYT48L3A+ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgy MjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDAp O21vc3RyYShcJ3Byb2RfYnQyNW1cJywxKTsiPkJhc2UgdG9wb2dyJmFncmF2ZTtm aWNhIDE6MjUuMDAwPC9hPjwvcD4gICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsg PGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMCk7bW9z dHJhKFwncHJvZF9idDUwbVwnLDEpOyI+QmFzZSB0b3BvZ3ImYWdyYXZlO2ZpY2Eg MTo1MC4wMDA8L2E+PC9wPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBo cmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEo XCdwcm9kX2NvbTUwbVwnLDEpOyI+TWFwYSBjb21hcmNhbCAodG9wb2dyJmFncmF2 ZTtmaWMpIDE6NTAuMDAwPC9hPjwvcD4gICA8cCBjbGFzcz0icGxpc3QiPiYjODIy NjsgPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMCk7 bW9zdHJhKFwncHJvZF9tdGMyNTBtXCcsMSk7Ij5NYXBhIHRvcG9nciZhZ3JhdmU7 ZmljIDE6MjUwLjAwMDwvYT48L3A+ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7 IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDApO21v c3RyYShcJ3Byb2RfbXRjNTAwbVwnLDEpOyI+TWFwYSB0b3BvZ3ImYWdyYXZlO2Zp YyAxOjUwMC4wMDA8L2E+PC9wPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8 YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0 cmEoXCdwcm9kX210YzEwMDBtXCcsMSk7Ij5NYXBhIHRvcG9nciZhZ3JhdmU7Zmlj IDE6MS4wMDAuMDAwPC9hPjwvcD4gIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4g IDxkaXYgY2xhc3M9ImVudW5jaWF0Ij5PcnRvZm90b3M8L2Rpdj4gICA8cCBjbGFz cz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdw cm9kX2luZGV4XCcsMCk7bW9zdHJhKFwncHJvZF9vZjJcJywxKTsiPk9ydG9mb3Rv IDI1IGNtIHZpZ2VudDwvYT48L2xpPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2 OyA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywwKTtt b3N0cmEoXCdwcm9kX29mNVwnLDEpOyI+T3J0b2ZvdG8gNTAgY20gdmlnZW50PC9h PjwvcD4gICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNj cmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMCk7bW9zdHJhKFwncHJvZF9vZjI1 XCcsMSk7Ij5PcnRvZm90byAyLDUgbSB2aWdlbnQ8L2E+PC9wPiAgPGRpdiBjbGFz cz0ic2VwMTUiPjwvZGl2PiAgPGRpdiBjbGFzcz0iZW51bmNpYXQiPk1ERTwvZGl2 PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlw dDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMCk7bW9zdHJhKFwncHJvZF9tZXRcJywx KTsiPk1ERSAxNXgxNTwvYT48L3A+ICA8ZGl2IGNsYXNzPSJzZXAxNSI+PC9kaXY+ ICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+VGVtJmFncmF2ZTt0aWNzPC9kaXY+ICAg IDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om1v c3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX21wMjBcJywxKTsi Pk1hcGEgZGVscyBzJm9ncmF2ZTtscyBkZSBwZW5kZW50ID4gMjAgJTwvYT48L3A+ ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0 Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX2JtNTBtXCcs MSk7Ij5CYXNlIG11bmljaXBhbCAxOjUwLjAwMDwvYT48L3A+ICAgIDxwIGNsYXNz PSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3By b2RfaW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX2JtMjUwbVwnLDEpOyI+QmFzZSBt dW5pY2lwYWwgMToyNTAuMDAwPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4m IzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwn LDApO21vc3RyYShcJ3Byb2RfYm0xMDAwbVwnLDEpOyI+QmFzZSBtdW5pY2lwYWwg MToxLjAwMC4wMDA8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsg PGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMCk7bW9z dHJhKFwncHJvZF90YWxsc1wnLDEpOyI+VGFsbHM8L2E+PC9wPiAgICA8cCBjbGFz cz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdw cm9kX2luZGV4XCcsMCk7bW9zdHJhKFwncHJvZF9wb2xpbmRcJywxKTsiPkJhc2Ug Z2VvZXNwYWNpYWwgZGVscyBwb2wmaWFjdXRlO2dvbnMgaW5kdXN0cmlhbHM8L2E+ PC9wPiAgPGRpdiBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgPGRpdiBjbGFzcz0iZW51 bmNpYXQiPkF0bGVzPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8 YSBocmVmPSJodHRwOi8vd3d3LmF0bGVzbmFjaW9uYWwuY2F0L2ljYy9hdGxlcy1u YWNpb25hbC8iIHRhcmdldD0iYXRsZXNuYWNpb25hbCI+QXRsZXMgTmFjaW9uYWwg ZGUgQ2F0YWx1bnlhPC9hPjwvcD4gIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4g IDxkaXYgY2xhc3M9ImVudW5jaWF0Ij5NYXBlcyBhbnRpY3M8L2Rpdj4gICAgPHAg Y2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlbkNE TSgpIj5NYXBlcyBhbnRpY3M8L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjox cHggc29saWQgI2FhYTsiLz4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxh IGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jb25kaWNpb25zIiB0YXJnZXQ9ImNv bmRpY2lvbnMiPkNvbmRpY2lvbnMgZFwnJnVhY3V0ZTtzPC9hPjwvcD48L2Rpdj48 ZGl2IGlkPSJwcm9kX21hcGVzIj48L2Rpdj48ZGl2IGlkPSJwcm9kX2J0NW0iPiAg PGRpdiBjbGFzcz0idGl0b2xfcHJvZCI+QmFzZSB0b3BvZ3ImYWdyYXZlO2ZpY2Eg MTo1LjAwMDwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJl Zj0iamF2YXNjcmlwdDpuYXZlZ2FyaGkoOSxcJ3RvcG9cJyk7Ij5OYXZlZ2FyLWhp PC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imph dmFzY3JpcHQ6QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDEsXCd0NVwnKTsiPkRl c2NhcnJlZ2FyPC9hPiZuYnNwOzxzcGFuIGNsYXNzPSJ0b29sdGlwX2Rlc2MiPihF c2NvbGxpdSB1biBmdWxsKTwvc3Bhbj48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+ JiM4MjI2OyA8YSBocmVmPSJsbGVnZW5kZXMvbXRjNW0ucGRmIiB0YXJnZXQ9Imxs ZWdlbmRhIj5MbGVnZW5kYTwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4 MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0OkFwcC5sYXlvdXQuc2hvd1dpbmRvdyhc J2J0NW1cJyk7Ij5EaXNwb25pYmlsaXRhdDwvYT48L3A+ICAgIDxwIGNsYXNzPSJw bGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvZ2Vvc2Vy dmVpcyIgdGFyZ2V0PSJ3bXMiPldNUzwvYT48L3A+ICAgPGRpdiBjbGFzcz0ic2Vw MTUiPjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+QXJ4aXVzIGNvbXBs ZW1lbnRhcmlzPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBo cmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvMTgx OS83MTIyL2ZpbGUvYnQ1bXYyMGR4MV8wMWNhLnppcCI+UGVyIGEgRFhGPC9hPjwv cD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93 d3cuaWNjLmNhdC9jYXQvY29udGVudC9kb3dubG9hZC8xODIwLzcxMjYvZmlsZS9i dDVtdjIwZGcxXzAxY2EuemlwIj5QZXIgYSBER048L2E+PC9wPiAgICA8cCBjbGFz cz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2Nh dC9jb250ZW50L2Rvd25sb2FkLzE4MjEvNzEzMC9maWxlL2J0NW12MjBzaDBfMDFj YS56aXAiPlBlciBhIFNIUDwvYT48L3A+ICA8ZGl2IGNsYXNzPSJzZXAxNSI+PC9k aXY+ICAgIDxkaXYgY2xhc3M9ImVudW5jaWF0Ij5Fc3BlY2lmaWNhY2lvbnMgdCZl Z3JhdmU7Y25pcXVlczwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsg PGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9jb250ZW50L2Rvd25sb2Fk LzcxOC8yNzk4L2ZpbGUvYnQ1bXYyMGVzcF8wNGNhLnBkZiIgdGFyZ2V0PSJlc3Bl YyI+RXNwZWNpZmljYWNpb25zIHQmZWdyYXZlO2NuaXF1ZXM8L2E+PC9wPiAgICA8 cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2Mu Y2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzcxOS8yODAyL2ZpbGUvYnQ1bXYyMGRp Y18wNGNhLnBkZiIgdGFyZ2V0PSJkaWMiPkRpY2Npb25hcmkgZGUgZGFkZXM8L2E+ PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDov L3d3dy5pY2MuY2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzk5ODkvMzI1ODgvZmls ZS9idDVtdjIwZHgxXzAxY2EucGRmIiB0YXJnZXQ9ImVzcGVjZHhmIj5Fc3BlY2lm aWNhY2lvbnMgZGUgRFhGPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgy MjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvY29udGVudC9kb3du bG9hZC85OTg1LzMyNTY4L2ZpbGUvYnQ1bXYyMGRnMV8wMWNhLnBkZiIgdGFyZ2V0 PSJlc3BlY2RnbiI+RXNwZWNpZmljYWNpb25zIGRlIERHTjwvYT48L3A+ICAgIDxw IGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5j YXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvOTk5MS8zMjU5OC9maWxlL2J0NW12MjBz aDBfMDFjYS5wZGYiIHRhcmdldD0iZXNwZWNzaHAiPkVzcGVjaWZpY2FjaW9ucyBk ZSBTSFA8L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2Fh YTsiLz4gICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDov L3d3dy5pY2MuY2F0L2NvbmRpY2lvbnMiIHRhcmdldD0iY29uZGljaW9ucyI+Q29u ZGljaW9ucyBkXCcmdWFjdXRlO3M8L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRl cjoxcHggc29saWQgI2FhYTsiLz4gICZuYnNwOzxpbWcgc3JjPSJpbWcvYmFjay5n aWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiIC8+IDxhIGhyZWY9Imph dmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDEpO21vc3RyYShcJ3Byb2Rf YnQ1bVwnLDApO0FwcC5sYXlvdXQuc2V0V01TVmlzaWJsZSgwLFwndDVcJykiPlRv dHMgZWxzIHByb2R1Y3RlczwvYT4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJwcm9kX210 MTBtIj4gIDxkaXYgY2xhc3M9InRpdG9sX3Byb2QiPk1hcGEgdG9wb2dyJmFncmF2 ZTtmaWMgMToxMC4wMDA8L2Rpdj4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7 IDxhIGhyZWY9ImphdmFzY3JpcHQ6bmF2ZWdhcmhpKDgsXCd0b3BvXCcpOyI+TmF2 ZWdhci1oaTwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBo cmVmPSJqYXZhc2NyaXB0OkFwcC5sYXlvdXQuc2V0V01TVmlzaWJsZSgxLFwndDEw XCcpOyI+RGVzY2FycmVnYXI8L2E+Jm5ic3A7PHNwYW4gY2xhc3M9InRvb2x0aXBf ZGVzYyI+KEVzY29sbGl1IHVuIGZ1bGwpPC9zcGFuPjwvcD4gICAgPHAgY2xhc3M9 InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImxsZWdlbmRlcy9tdGMxMG0ucGRmIiB0 YXJnZXQ9ImxsZWdlbmRhIj5MbGVnZW5kYTwvYT48L3A+ICAgIDxwIGNsYXNzPSJw bGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0OkFwcC5sYXlvdXQuc2hv d1dpbmRvdyhcJ210YzEwbVwnKTsiPkRpc3BvbmliaWxpdGF0PC9hPjwvcD4gICAg PHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNj LmNhdC9nZW9zZXJ2ZWlzIiB0YXJnZXQ9IndtcyI+V01TPC9hPjwvcD4gICA8ZGl2 IGNsYXNzPSJzZXAxNSI+PC9kaXY+ICAgIDxkaXYgY2xhc3M9ImVudW5jaWF0Ij5F c3BlY2lmaWNhY2lvbnMgdCZlZ3JhdmU7Y25pcXVlczwvZGl2PiAgICA8cCBjbGFz cz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2Nh dC9jb250ZW50L2Rvd25sb2FkLzQ2NzIxLzMyNjY0Ny9maWxlL210MTBtdjExZXNw XzAxY2EucGRmIiB0YXJnZXQ9ImVzcGVjIj5Fc3BlY2lmaWNhY2lvbnMgdCZlZ3Jh dmU7Y25pcXVlczwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xp ZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJo dHRwOi8vd3d3LmljYy5jYXQvY29uZGljaW9ucyIgdGFyZ2V0PSJjb25kaWNpb25z Ij5Db25kaWNpb25zIGRcJyZ1YWN1dGU7czwvYT48L3A+ICAgIDxociBzdHlsZT0i Ym9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgJm5ic3A7PGltZyBzcmM9ImltZy9i YWNrLmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIgLz4gPGEgaHJl Zj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMSk7bW9zdHJhKFwn cHJvZF9tdDEwbVwnLDApO0FwcC5sYXlvdXQuc2V0V01TVmlzaWJsZSgwLFwndDEw XCcpIj5Ub3RzIGVscyBwcm9kdWN0ZXM8L2E+Jm5ic3A7PC9kaXY+PGRpdiBpZD0i cHJvZF9idDI1bSI+ICA8ZGl2IGNsYXNzPSJ0aXRvbF9wcm9kIj5CYXNlIHRvcG9n ciZhZ3JhdmU7ZmljYSAxOjI1LjAwMDwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3Qi PiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpuYXZlZ2FyaGkoNyxcJ3RvcG9c Jyk7Ij5OYXZlZ2FyLWhpPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgy MjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6QXBwLmxheW91dC5zZXRXTVNWaXNpYmxl KDEsXCd0MjVcJyk7Ij5EZXNjYXJyZWdhcjwvYT4mbmJzcDs8c3BhbiBjbGFzcz0i dG9vbHRpcF9kZXNjIj4oRXNjb2xsaXUgdW4gZnVsbCk8L3NwYW4+PC9wPiAgICA8 cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0ibGxlZ2VuZGVzL210YzI1 bS5wZGYiIHRhcmdldD0ibGxlZ2VuZGEiPkxsZWdlbmRhPC9hPjwvcD4gICAgPHAg Y2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6QXBwLmxh eW91dC5zaG93V2luZG93KFwnYnQyNW1cJyk7Ij5EaXNwb25pYmlsaXRhdDwvYT48 L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8v d3d3LmljYy5jYXQvZ2Vvc2VydmVpcyIgdGFyZ2V0PSJ3bXMiPldNUzwvYT48L3A+ ICAgPGRpdiBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVu Y2lhdCI+QXJ4aXVzIGNvbXBsZW1lbnRhcmlzPC9kaXY+ICAgIDxwIGNsYXNzPSJw bGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L2Nv bnRlbnQvZG93bmxvYWQvMTM1MjQvNDQwODkvZmlsZS9idDI1bXYxMGR4MF8wMmNh LnppcCI+UGVyIGEgRFhGPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgy MjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvY29udGVudC9kb3du bG9hZC8xODIzLzcxMzgvZmlsZS9idDI1bXYxMGRnMV8wMmNhLnppcCI+UGVyIGEg REdOPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9 Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvY29udGVudC9kb3dubG9hZC8xMzUyNi80 NDEwNi9maWxlL2J0MjVtdjEwc2gwXzAyY2EuemlwIj5QZXIgYSBTSFA8L2E+PC9w PiAgPGRpdiBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVu Y2lhdCI+RXNwZWNpZmljYWNpb25zIHQmZWdyYXZlO2NuaXF1ZXM8L2Rpdj4gICAg PHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNj LmNhdC9jYXQvY29udGVudC9kb3dubG9hZC85NzAwLzMwNjUyL2ZpbGUvYnQyNW12 MTBlc3BfMDJjYS5wZGYiIHRhcmdldD0iZXNwZWMiPkVzcGVjaWZpY2FjaW9ucyB0 JmVncmF2ZTtjbmlxdWVzPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgy MjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvY29udGVudC9kb3du bG9hZC85NzAxLzMwNjU3L2ZpbGUvYnQyNW12MTBkaWNfMDJjYS5wZGYiIHRhcmdl dD0iZGljIj5EaWNjaW9uYXJpIGRlIGRhZGVzPC9hPjwvcD4gICAgPHAgY2xhc3M9 InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQv Y29udGVudC9kb3dubG9hZC8xMzUxOS80NDA2NC9maWxlL2J0MjVtdjEwZHgwXzAy Y2EucGRmIiB0YXJnZXQ9ImVzcGVjZHhmIj5Fc3BlY2lmaWNhY2lvbnMgZGUgRFhG PC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0 dHA6Ly93d3cuaWNjLmNhdC9jYXQvY29udGVudC9kb3dubG9hZC85OTg2LzMyNTcz L2ZpbGUvYnQyNW12MTBkZzFfMDJjYS5wZGYiIHRhcmdldD0iZXNwZWNkZ24iPkVz cGVjaWZpY2FjaW9ucyBkZSBER048L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3Qi PiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9jb250ZW50 L2Rvd25sb2FkLzk5ODYvMzI1NzMvZmlsZS9idDI1bXYxMGRnMV8wMmNhLnBkZiIg dGFyZ2V0PSJlc3BlY3NocCI+RXNwZWNpZmljYWNpb25zIGRlIFNIUDwvYT48L3A+ ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNs YXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQv Y29uZGljaW9ucyIgdGFyZ2V0PSJjb25kaWNpb25zIj5Db25kaWNpb25zIGRcJyZ1 YWN1dGU7czwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAj YWFhOyIvPiAgJm5ic3A7PGltZyBzcmM9ImltZy9iYWNrLmdpZiIgc3R5bGU9InZl cnRpY2FsLWFsaWduOm1pZGRsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0 cmEoXCdwcm9kX2luZGV4XCcsMSk7bW9zdHJhKFwncHJvZF9idDI1bVwnLDApO0Fw cC5sYXlvdXQuc2V0V01TVmlzaWJsZSgwLFwndDI1XCcpIj5Ub3RzIGVscyBwcm9k dWN0ZXM8L2E+Jm5ic3A7PC9kaXY+PGRpdiBpZD0icHJvZF9idDUwbSI+ICA8ZGl2 IGNsYXNzPSJ0aXRvbF9wcm9kIj5CYXNlIHRvcG9nciZhZ3JhdmU7ZmljYSAxOjUw LjAwMDwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0i amF2YXNjcmlwdDpuYXZlZ2FyaGkoNixcJ3RvcG9cJyk7Ij5OYXZlZ2FyLWhpPC9h PjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFz Y3JpcHQ6QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDEsXCd0NTBcJyk7Ij5EZXNj YXJyZWdhcjwvYT4mbmJzcDs8c3BhbiBjbGFzcz0idG9vbHRpcF9kZXNjIj4oRXNj b2xsaXUgdW4gZnVsbCk8L3NwYW4+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYj ODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2dlb3NlcnZlaXMiIHRh cmdldD0id21zIj5XTVM8L2E+PC9wPiAgIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rp dj4gICAgPGRpdiBjbGFzcz0iZW51bmNpYXQiPkFyeGl1cyBjb21wbGVtZW50YXJp czwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0 cDovL3d3dy5pY2MuY2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzE4MjQvNzE0Mi9m aWxlL2J0NTBtdjMxZHgxXzAxY2EuemlwIj5QZXIgYSBEWEY8L2E+PC9wPiAgICA8 cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2Mu Y2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzE4MjUvNzE0Ni9maWxlL2J0NTBtdjMx ZGcxXzAxY2EuemlwIj5QZXIgYSBER048L2E+PC9wPiAgPGRpdiBjbGFzcz0ic2Vw MTUiPjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+RXNwZWNpZmljYWNp b25zIHQmZWdyYXZlO2NuaXF1ZXM8L2Rpdj4gICAgPHAgY2xhc3M9InBsaXN0Ij4m IzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvY29udGVudC9k b3dubG9hZC83MjAvMjgwNi9maWxlL2J0NTBtdjMxZXNwXzAyY2EucGRmIiB0YXJn ZXQ9ImVzcGVjIj5Fc3BlY2lmaWNhY2lvbnMgdCZlZ3JhdmU7Y25pcXVlczwvYT48 L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8v d3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvNzIxLzI4MTAvZmlsZS9i dDUwbXYzMWRpY18wMWNhLnBkZiIgdGFyZ2V0PSJkaWMiPkRpY2Npb25hcmkgZGUg ZGFkZXM8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJl Zj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzk5OTMv MzI2MDgvZmlsZS9idDUwbXYzMWR4MV8wMWNhLnBkZiIgdGFyZ2V0PSJlc3BlY2R4 ZiI+RXNwZWNpZmljYWNpb25zIGRlIERYRjwvYT48L3A+ICAgIDxwIGNsYXNzPSJw bGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L2Nv bnRlbnQvZG93bmxvYWQvOTk4Ny8zMjU3OC9maWxlL2J0NTBtdjMxZGcxXzAxY2Eu cGRmIiB0YXJnZXQ9ImVzcGVjZGduIj5Fc3BlY2lmaWNhY2lvbnMgZGUgREdOPC9h PjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAg PHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNj LmNhdC9jb25kaWNpb25zIiB0YXJnZXQ9ImNvbmRpY2lvbnMiPkNvbmRpY2lvbnMg ZFwnJnVhY3V0ZTtzPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNv bGlkICNhYWE7Ii8+ICAmbmJzcDs8aW1nIHNyYz0iaW1nL2JhY2suZ2lmIiBzdHls ZT0idmVydGljYWwtYWxpZ246bWlkZGxlIiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0 Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywxKTttb3N0cmEoXCdwcm9kX2J0NTBtXCcs MCk7QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDAsXCd0NTBcJykiPlRvdHMgZWxz IHByb2R1Y3RlczwvYT4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJwcm9kX2NvbTUwbSI+ ICA8ZGl2IGNsYXNzPSJ0aXRvbF9wcm9kIj5NYXBhIGNvbWFyY2FsICh0b3BvZ3Im YWdyYXZlO2ZpYykgMTo1MC4wMDA8L2Rpdj4gICAgPHAgY2xhc3M9InBsaXN0Ij4m IzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6bmF2ZWdhcmhpKDYsXCd0b3BvXCcp OyI+TmF2ZWdhci1oaTwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2 OyA8YSBocmVmPSJqYXZhc2NyaXB0OkFwcC5sYXlvdXQuc2V0V01TVmlzaWJsZSgx LFwnY29tYXJjYWxcJyk7Ij5EZXNjYXJyZWdhcjwvYT4mbmJzcDs8c3BhbiBjbGFz cz0idG9vbHRpcF9kZXNjIj4oRXNjb2xsaXItbmUgdW5hKTwvc3Bhbj48L3A+ICAg IDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJsbGVnZW5kZXMvbXRj NTBtLnBkZiIgdGFyZ2V0PSJsbGVnZW5kYSI+TGxlZ2VuZGE8L2E+PC9wPiAgICA8 cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2Mu Y2F0L2dlb3NlcnZlaXMiIHRhcmdldD0id21zIj5XTVM8L2E+PC9wPiAgICAgPGhy IHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAgPHAgY2xhc3M9InBs aXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jb25kaWNp b25zIiB0YXJnZXQ9ImNvbmRpY2lvbnMiPkNvbmRpY2lvbnMgZFwnJnVhY3V0ZTtz PC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ ICAmbmJzcDs8aW1nIHNyYz0iaW1nL2JhY2suZ2lmIiBzdHlsZT0idmVydGljYWwt YWxpZ246bWlkZGxlIiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3By b2RfaW5kZXhcJywxKTttb3N0cmEoXCdwcm9kX2NvbTUwbVwnLDApO0FwcC5sYXlv dXQuc2V0V01TVmlzaWJsZSgwLFwnY29tYXJjYWxcJykiPlRvdHMgZWxzIHByb2R1 Y3RlczwvYT4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJwcm9kX210YzI1MG0iPiAgPGRp diBjbGFzcz0idGl0b2xfcHJvZCI+TWFwYSB0b3BvZ3ImYWdyYXZlO2ZpYyAxOjI1 MC4wMDA8L2Rpdj4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9 ImphdmFzY3JpcHQ6bmF2ZWdhcmhpKDQsXCd0b3BvXCcpOyI+TmF2ZWdhci1oaTwv YT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZh c2NyaXB0OmR3bFByb2R1Y3QoXCdtdGMyNTBtXCcpIj5EZXNjYXJyZWdhcjwvYT4m bmJzcDs8c3BhbiBjbGFzcz0idG9vbHRpcF9kZXNjIj48L3NwYW4+PC9wPiAgICA8 cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0ibGxlZ2VuZGVzL210YzI1 MG0ucGRmIiB0YXJnZXQ9ImxsZWdlbmRhIj5MbGVnZW5kYTwvYT48L3A+ICAgIDxw IGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5j YXQvZ2Vvc2VydmVpcyIgdGFyZ2V0PSJ3bXMiPldNUzwvYT48L3A+ICAgICA8aHIg c3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICA8cCBjbGFzcz0icGxp c3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NvbmRpY2lv bnMiIHRhcmdldD0iY29uZGljaW9ucyI+Q29uZGljaW9ucyBkXCcmdWFjdXRlO3M8 L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4g ICZuYnNwOzxpbWcgc3JjPSJpbWcvYmFjay5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1h bGlnbjptaWRkbGUiIC8+IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJv ZF9pbmRleFwnLDEpO21vc3RyYShcJ3Byb2RfbXRjMjUwbVwnLDApOyI+VG90cyBl bHMgcHJvZHVjdGVzPC9hPiZuYnNwOzwvZGl2PjxkaXYgaWQ9InByb2RfbXRjNTAw bSI+ICA8ZGl2IGNsYXNzPSJ0aXRvbF9wcm9kIj5NYXBhIHRvcG9nciZhZ3JhdmU7 ZmljIDE6NTAwLjAwMDwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsg PGEgaHJlZj0iamF2YXNjcmlwdDpuYXZlZ2FyaGkoMyxcJ3RvcG9cJyk7Ij5OYXZl Z2FyLWhpPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhy ZWY9ImphdmFzY3JpcHQ6ZHdsUHJvZHVjdChcJ210YzUwMG1cJykiPkRlc2NhcnJl Z2FyPC9hPiZuYnNwOzxzcGFuIGNsYXNzPSJ0b29sdGlwX2Rlc2MiPjwvc3Bhbj48 L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJsbGVnZW5k ZXMvbXRjNTAwbS5wZGYiIHRhcmdldD0ibGxlZ2VuZGEiPkxsZWdlbmRhPC9hPjwv cD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93 d3cuaWNjLmNhdC9nZW9zZXJ2ZWlzIiB0YXJnZXQ9IndtcyI+V01TPC9hPjwvcD4g ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNs YXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQv Y29uZGljaW9ucyIgdGFyZ2V0PSJjb25kaWNpb25zIj5Db25kaWNpb25zIGRcJyZ1 YWN1dGU7czwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAj YWFhOyIvPiAgJm5ic3A7PGltZyBzcmM9ImltZy9iYWNrLmdpZiIgc3R5bGU9InZl cnRpY2FsLWFsaWduOm1pZGRsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0 cmEoXCdwcm9kX2luZGV4XCcsMSk7bW9zdHJhKFwncHJvZF9tdGM1MDBtXCcsMCk7 Ij5Ub3RzIGVscyBwcm9kdWN0ZXM8L2E+Jm5ic3A7PC9kaXY+PGRpdiBpZD0icHJv ZF9tdGMxMDAwbSI+ICA8ZGl2IGNsYXNzPSJ0aXRvbF9wcm9kIj5NYXBhIHRvcG9n ciZhZ3JhdmU7ZmljIDE6MDAwLjAwMDwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3Qi PiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpuYXZlZ2FyaGkoMSxcJ3RvcG9c Jyk7Ij5OYXZlZ2FyLWhpPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgy MjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6ZHdsUHJvZHVjdChcJ210YzEwMDBtXCcp Ij5EZXNjYXJyZWdhcjwvYT4mbmJzcDs8c3BhbiBjbGFzcz0idG9vbHRpcF9kZXNj Ij48L3NwYW4+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJl Zj0ibGxlZ2VuZGVzL210YzEwMDBtLnBkZiIgdGFyZ2V0PSJsbGVnZW5kYSI+TGxl Z2VuZGE8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJl Zj0iaHR0cDovL3d3dy5pY2MuY2F0L2dlb3NlcnZlaXMiIHRhcmdldD0id21zIj5X TVM8L2E+PC9wPiAgICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7 Ii8+ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93 d3cuaWNjLmNhdC9jb25kaWNpb25zIiB0YXJnZXQ9ImNvbmRpY2lvbnMiPkNvbmRp Y2lvbnMgZFwnJnVhY3V0ZTtzPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6 MXB4IHNvbGlkICNhYWE7Ii8+ICAmbmJzcDs8aW1nIHNyYz0iaW1nL2JhY2suZ2lm IiBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIiAvPiA8YSBocmVmPSJqYXZh c2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywxKTttb3N0cmEoXCdwcm9kX210 YzEwMDBtXCcsMCk7Ij5Ub3RzIGVscyBwcm9kdWN0ZXM8L2E+Jm5ic3A7PC9kaXY+ PGRpdiBpZD0icHJvZF9hZXJpZXMiPjwvZGl2PjxkaXYgaWQ9InByb2Rfb2YyIj4g IDxkaXYgY2xhc3M9InRpdG9sX3Byb2QiPk9ydG9mb3RvIDI1IGNtIHZpZ2VudDwv ZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNj cmlwdDpuYXZlZ2FyaGkoMTAsXCdvcnRvXCcpOyI+TmF2ZWdhci1oaTwvYT48L3A+ ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0 OkFwcC5sYXlvdXQuc2V0V01TVmlzaWJsZSgxLFwndDJcJyk7Ij5EZXNjYXJyZWdh cjwvYT4mbmJzcDs8c3BhbiBjbGFzcz0idG9vbHRpcF9kZXNjIj4oRXNjb2xsaXUg dW4gZnVsbCk8L3NwYW4+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsg PGEgaHJlZj0iamF2YXNjcmlwdDpBcHAubGF5b3V0LnNob3dXaW5kb3coXCdvZjI1 Y1wnKTsiPkRpc3BvbmliaWxpdGF0PC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0 Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9nZW9zZXJ2ZWlz IiB0YXJnZXQ9IndtcyI+V01TPC9hPjwvcD4gICA8ZGl2IGNsYXNzPSJzZXAxNSI+ PC9kaXY+ICAgIDxkaXYgY2xhc3M9ImVudW5jaWF0Ij5Fc3BlY2lmaWNhY2lvbnMg dCZlZ3JhdmU7Y25pcXVlczwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIy NjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9jb250ZW50L2Rvd25s b2FkLzEyMzQwLzQxNDUxL2ZpbGUvb2YyNWN2MzNlc3BfMDNjYS5wZGYiIHRhcmdl dD0iZXNwZWMiPkVzcGVjaWZpY2FjaW9ucyB0JmVncmF2ZTtjbmlxdWVzPC9hPjwv cD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAgPHAg Y2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNh dC9jb25kaWNpb25zIiB0YXJnZXQ9ImNvbmRpY2lvbnMiPkNvbmRpY2lvbnMgZFwn JnVhY3V0ZTtzPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlk ICNhYWE7Ii8+ICAmbmJzcDs8aW1nIHNyYz0iaW1nL2JhY2suZ2lmIiBzdHlsZT0i dmVydGljYWwtYWxpZ246bWlkZGxlIiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om1v c3RyYShcJ3Byb2RfaW5kZXhcJywxKTttb3N0cmEoXCdwcm9kX29mMlwnLDApO0Fw cC5sYXlvdXQuc2V0V01TVmlzaWJsZSgwLFwndDJcJykiPlRvdHMgZWxzIHByb2R1 Y3RlczwvYT4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJwcm9kX29mNSI+ICA8ZGl2IGNs YXNzPSJ0aXRvbF9wcm9kIj5PcnRvZm90byA1MCBjbSB2aWdlbnQ8L2Rpdj4gICAg PHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6bmF2 ZWdhcmhpKDksXCdvcnRvXCcpOyI+TmF2ZWdhci1oaTwvYT48L3A+ICAgIDxwIGNs YXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0OkFwcC5sYXlv dXQuc2V0V01TVmlzaWJsZSgxLFwndDVcJyk7Ij5EZXNjYXJyZWdhcjwvYT4mbmJz cDs8c3BhbiBjbGFzcz0idG9vbHRpcF9kZXNjIj4oRXNjb2xsaXUgdW4gZnVsbCk8 L3NwYW4+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0i amF2YXNjcmlwdDpBcHAubGF5b3V0LnNob3dXaW5kb3coXCdvZjVtXCcpOyI+RGlz cG9uaWJpbGl0YXQ8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsg PGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2dlb3NlcnZlaXMiIHRhcmdldD0i d21zIj5XTVM8L2E+PC9wPiAgICAgPGRpdiBjbGFzcz0iZW51bmNpYXQiPkVzcGVj aWZpY2FjaW9ucyB0JmVncmF2ZTtjbmlxdWVzPC9kaXY+ICAgIDxwIGNsYXNzPSJw bGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L2Nv bnRlbnQvZG93bmxvYWQvMjEzNDkvNjc2MjEvZmlsZS9vZjVtdjYwZXNwXzAxY2Eu cGRmIiB0YXJnZXQ9ImVzcGVjIj5Fc3BlY2lmaWNhY2lvbnMgdCZlZ3JhdmU7Y25p cXVlczwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFh OyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8v d3d3LmljYy5jYXQvY29uZGljaW9ucyIgdGFyZ2V0PSJjb25kaWNpb25zIj5Db25k aWNpb25zIGRcJyZ1YWN1dGU7czwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVy OjFweCBzb2xpZCAjYWFhOyIvPiAgJm5ic3A7PGltZyBzcmM9ImltZy9iYWNrLmdp ZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIgLz4gPGEgaHJlZj0iamF2 YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMSk7bW9zdHJhKFwncHJvZF9v ZjVcJywwKTtBcHAubGF5b3V0LnNldFdNU1Zpc2libGUoMCxcJ3Q1XCcpIj5Ub3Rz IGVscyBwcm9kdWN0ZXM8L2E+Jm5ic3A7PC9kaXY+PGRpdiBpZD0icHJvZF9vZjI1 Ij4gIDxkaXYgY2xhc3M9InRpdG9sX3Byb2QiPk9ydG9mb3RvIDIsNSBtIHZpZ2Vu dDwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2 YXNjcmlwdDpuYXZlZ2FyaGkoNyxcJ29ydG9cJyk7Ij5OYXZlZ2FyLWhpPC9hPjwv cD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3Jp cHQ6QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDEsXCd0MjVcJyk7Ij5EZXNjYXJy ZWdhcjwvYT4mbmJzcDs8c3BhbiBjbGFzcz0idG9vbHRpcF9kZXNjIj4oRXNjb2xs aXUgdW4gZnVsbCk8L3NwYW4+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIy NjsgPGEgaHJlZj0iamF2YXNjcmlwdDpBcHAubGF5b3V0LnNob3dXaW5kb3coXCdv ZjI1bVwnKTsiPkRpc3BvbmliaWxpdGF0PC9hPjwvcD4gICAgPHAgY2xhc3M9InBs aXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9nZW9zZXJ2 ZWlzIiB0YXJnZXQ9IndtcyI+V01TPC9hPjwvcD4gICAgIDxkaXYgY2xhc3M9ImVu dW5jaWF0Ij5Fc3BlY2lmaWNhY2lvbnMgdCZlZ3JhdmU7Y25pcXVlczwvZGl2PiAg ICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5p Y2MuY2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzIxMzUwLzY3NjI2L2ZpbGUvb2Yy NW12NjFlc3BfMDFjYS5wZGYiIHRhcmdldD0iZXNwZWMiPkVzcGVjaWZpY2FjaW9u cyB0JmVncmF2ZTtjbmlxdWVzPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6 MXB4IHNvbGlkICNhYWE7Ii8+ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxh IGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jb25kaWNpb25zIiB0YXJnZXQ9ImNv bmRpY2lvbnMiPkNvbmRpY2lvbnMgZFwnJnVhY3V0ZTtzPC9hPjwvcD4gICAgPGhy IHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAmbmJzcDs8aW1nIHNy Yz0iaW1nL2JhY2suZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIiAv PiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywxKTtt b3N0cmEoXCdwcm9kX29mMjVcJywwKTtBcHAubGF5b3V0LnNldFdNU1Zpc2libGUo MCxcJ3QyNVwnKSI+VG90cyBlbHMgcHJvZHVjdGVzPC9hPiZuYnNwOzwvZGl2Pjxk aXYgaWQ9ImRlc2NhcnJlZ2EiPiAgPGRpdiBjbGFzcz0iZW51bmNpYXQiPkhldSBz ZWxlY2Npb25hdCBwZXIgZGVzY2FycmVnYXI6PC9kaXY+ICA8ZGl2IGlkPSJ0aXRv bF9wcm9kdWN0ZSIgY2xhc3M9InRpdG9sX3Byb2QiPiA8L2Rpdj4JCTxkaXYgaWQ9 ImlkX3JlbCI+JiM4MjI2O0Z1bGw6PC9kaXY+ICAgICA8ZGl2IGlkPSJub21fZnVs bCI+JiM4MjI2O05vbTo8L2Rpdj48YnIgLz4gICAgIDxkaXYgaWQ9ImZvcm1hdHNk aXNwb25pYmxlcyIgY2xhc3M9ImVudW5jaWF0X3Byb2QiPkZvcm1hdHMgZGlzcG9u aWJsZXM6PC9kaXY+CQk8ZGl2IGlkPSJyYWRpb19kb3dubG9hZF90b3BvIj48L2Rp dj4gICAgIDxkaXYgY2xhc3M9ImVudW5jaWF0X3Byb2QiPlNpc3RlbWEgZGUgcmVm ZXImZWdyYXZlO25jaWE6PC9kaXY+CQk8ZGl2IGlkPSJyYWRpb19zaXNyZWYiPjwv ZGl2PgkJPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9ImZ1bGxEZXNjIiB2YWx1ZT0i Ij4gIDxkaXYgY2xhc3M9InNlcFN1cGVyaW9yIj4mbmJzcDs8aW1nIHNyYz0iaW1n L2R3bGRfaWNvbi5qcGciIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiIC8+ Jm5ic3A7PGEgaWQ9Imxpbmtsb2tfdG9wbyIgaHJlZj0iamF2YXNjcmlwdDpnZXRS YWRpbygpOyI+RGVzY2FycmVnYXI8L2E+PGJyLz48L2Rpdj4gICAgPGhyIHN0eWxl PSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAgPHAgY2xhc3M9InBsaXN0Ij4m IzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jb25kaWNpb25zIiB0 YXJnZXQ9ImNvbmRpY2lvbnMiPkNvbmRpY2lvbnMgZFwnJnVhY3V0ZTtzPC9hPjwv cD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAmbmJz cDs8aW1nIHNyYz0iaW1nL2JhY2suZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246 bWlkZGxlIiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ2Rlc2NhcnJl Z2FcJywwKTttb3N0cmEoXCdwcm9kX2luZGV4XCcsMSk7QXBwLmxheW91dC5zZXRX TVNWaXNpYmxlKDAsXCdcJyk7Ij5TZWxlY2Npb25hciB1biBhbHRyZSBwcm9kdWN0 ZTwvYT4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJwcm9kX21ldCI+ICA8ZGl2IGNsYXNz PSJlbnVuY2lhdCI+TW9kZWxzIGRcJ2VsZXZhY2lvbnM8L2Rpdj4gICAgPHAgY2xh c3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6QXBwLmxheW91 dC5zZXRXTVNWaXNpYmxlKDEsXCd0NTBcJyk7Ij5EZXNjYXJyZWdhcjwvYT4mbmJz cDs8c3BhbiBjbGFzcz0idG9vbHRpcF9kZXNjIj4oRXNjb2xsaXUgdW4gZnVsbCk8 L3NwYW4+PC9wPiAgPGRpdiBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgICA8ZGl2IGNs YXNzPSJlbnVuY2lhdCI+RXNwZWNpZmljYWNpb25zIHQmZWdyYXZlO2NuaXF1ZXM8 L2Rpdj4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6 Ly93d3cuaWNjLmNhdC9jYXQvY29udGVudC9kb3dubG9hZC8xMjMzOS80MTQ0Ni9m aWxlL21ldDE1djIwZXNwXzAyY2EucGRmIiB0YXJnZXQ9ImVzcGVjIj5Fc3BlY2lm aWNhY2lvbnMgdCZlZ3JhdmU7Y25pcXVlczwvYT48L3A+ICAgIDxociBzdHlsZT0i Ym9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4 MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGljaW9ucyIgdGFy Z2V0PSJjb25kaWNpb25zIj5Db25kaWNpb25zIGRcJyZ1YWN1dGU7czwvYT48L3A+ ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgJm5ic3A7 PGltZyBzcmM9ImltZy9iYWNrLmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1p ZGRsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4 XCcsMSk7bW9zdHJhKFwncHJvZF9tZXRcJywwKTtBcHAubGF5b3V0LnNldFdNU1Zp c2libGUoMCxcJ3Q1MFwnKSI+VG90cyBlbHMgcHJvZHVjdGVzPC9hPiZuYnNwOzwv ZGl2PjxkaXYgaWQ9InByb2RfYWx0cmVzIj48L2Rpdj48ZGl2IGlkPSJwcm9kX21w MjAiPiAgPGRpdiBjbGFzcz0idGl0b2xfcHJvZCI+TWFwYSBkZWxzIHMmb2dyYXZl O2xzIGRlIHBlbmRlbnQgJmd0OyAyMCAmIzM3OzwvZGl2PiAgICA8cCBjbGFzcz0i cGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpBcHAubGF5b3V0LnNl dFdNU1Zpc2libGUoMSxcJ3Q1XCcpOyI+RGVzY2FycmVnYXI8L2E+Jm5ic3A7PHNw YW4gY2xhc3M9InRvb2x0aXBfZGVzYyI+KEVzY29sbGl1IHVuIGZ1bGwpPC9zcGFu PjwvcD4gIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4gICAgPGRpdiBjbGFzcz0i ZW51bmNpYXQiPkVzcGVjaWZpY2FjaW9ucyB0JmVncmF2ZTtjbmlxdWVzPC9kaXY+ ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3 LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvMTE3MjAvNDAyNDUvZmlsZS9t cDIwcHYxMGRnMF8wMWNhLnBkZiI+RXNwZWNpZmljYWNpb25zIGRlIERHTjwvYT48 L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxw IGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5j YXQvY29uZGljaW9ucyIgdGFyZ2V0PSJjb25kaWNpb25zIj5Db25kaWNpb25zIGRc JyZ1YWN1dGU7czwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xp ZCAjYWFhOyIvPiAgJm5ic3A7PGltZyBzcmM9ImltZy9iYWNrLmdpZiIgc3R5bGU9 InZlcnRpY2FsLWFsaWduOm1pZGRsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpt b3N0cmEoXCdwcm9kX2luZGV4XCcsMSk7bW9zdHJhKFwncHJvZF9tcDIwXCcsMCk7 QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDAsXCd0NVwnKSI+VG90cyBlbHMgcHJv ZHVjdGVzPC9hPiZuYnNwOzwvZGl2PjxkaXYgaWQ9InByb2RfYm01MG0iPiAgPGRp diBjbGFzcz0idGl0b2xfcHJvZCI+QmFzZSBtdW5pY2lwYWwgNTAuMDAwPC9kaXY+ ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0 OmR3bFByb2R1Y3QoXCdibTUwbXNocFwnKTsiPkRlc2NhcnJlZ2FyPC9hPiZuYnNw OzwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6 Ly93d3cuaWNjLmNhdC9nZW9zZXJ2ZWlzIiB0YXJnZXQ9IndtcyI+V01TPC9hPjwv cD4gICA8ZGl2IGNsYXNzPSJzZXAxNSI+PC9kaXY+ICAgIDxkaXYgY2xhc3M9ImVu dW5jaWF0Ij5Fc3BlY2lmaWNhY2lvbnMgdCZlZ3JhdmU7Y25pcXVlczwvZGl2PiAg ICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5p Y2MuY2F0L2NhdC9Ib21lLUlDQy9NYXBlcy1mb3Rvcy1hZXJpZXMvU29icmUtbGEt Y2FydG9ncmFmaWEtSUNDIiB0YXJnZXQ9ImVzcHRlYyI+RXNwZWNpZmljYWNpb25z IHQmZWdyYXZlO2NuaXF1ZXM8L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjox cHggc29saWQgI2FhYTsiLz4gICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEg aHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NvbmRpY2lvbnMiIHRhcmdldD0iY29u ZGljaW9ucyI+Q29uZGljaW9ucyBkXCcmdWFjdXRlO3M8L2E+PC9wPiAgICA8aHIg c3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICZuYnNwOzxpbWcgc3Jj PSJpbWcvYmFjay5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiIC8+ IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDEpO21v c3RyYShcJ3Byb2RfYm01MG1cJywwKTsiPlRvdHMgZWxzIHByb2R1Y3RlczwvYT4m bmJzcDs8L2Rpdj48ZGl2IGlkPSJwcm9kX2JtMjUwbSI+ICA8ZGl2IGNsYXNzPSJ0 aXRvbF9wcm9kIj5CYXNlIG11bmljaXBhbCAyNTAuMDAwPC9kaXY+ICAgIDxwIGNs YXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0OmR3bFByb2R1 Y3QoXCdibTI1MG1zaHBcJyk7Ij5EZXNjYXJyZWdhcjwvYT4mbmJzcDs8L3A+ICAg IDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3Lmlj Yy5jYXQvZ2Vvc2VydmVpcyIgdGFyZ2V0PSJ3bXMiPldNUzwvYT48L3A+ICAgPGRp diBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+ RXNwZWNpZmljYWNpb25zIHQmZWdyYXZlO2NuaXF1ZXM8L2Rpdj4gICAgPHAgY2xh c3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9j YXQvSG9tZS1JQ0MvTWFwZXMtZm90b3MtYWVyaWVzL1NvYnJlLWxhLWNhcnRvZ3Jh ZmlhLUlDQyIgdGFyZ2V0PSJlc3B0ZWMiPkVzcGVjaWZpY2FjaW9ucyB0JmVncmF2 ZTtjbmlxdWVzPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlk ICNhYWE7Ii8+ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0 dHA6Ly93d3cuaWNjLmNhdC9jb25kaWNpb25zIiB0YXJnZXQ9ImNvbmRpY2lvbnMi PkNvbmRpY2lvbnMgZFwnJnVhY3V0ZTtzPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJi b3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAmbmJzcDs8aW1nIHNyYz0iaW1nL2Jh Y2suZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIiAvPiA8YSBocmVm PSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywxKTttb3N0cmEoXCdw cm9kX2JtMjUwbVwnLDApOyI+VG90cyBlbHMgcHJvZHVjdGVzPC9hPiZuYnNwOzwv ZGl2PjxkaXYgaWQ9InByb2RfYm0xMDAwbSI+ICA8ZGl2IGNsYXNzPSJ0aXRvbF9w cm9kIj5CYXNlIG11bmljaXBhbCAxLjAwMC4wMDA8L2Rpdj4gICAgPHAgY2xhc3M9 InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6ZHdsUHJvZHVjdChc J2JtMTAwMG1zaHBcJyk7Ij5EZXNjYXJyZWdhcjwvYT4mbmJzcDs8L3A+ICAgIDxw IGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5j YXQvZ2Vvc2VydmVpcyIgdGFyZ2V0PSJ3bXMiPldNUzwvYT48L3A+ICAgPGRpdiBj bGFzcz0ic2VwMTUiPjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+RXNw ZWNpZmljYWNpb25zIHQmZWdyYXZlO2NuaXF1ZXM8L2Rpdj4gICAgPHAgY2xhc3M9 InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQv SG9tZS1JQ0MvTWFwZXMtZm90b3MtYWVyaWVzL1NvYnJlLWxhLWNhcnRvZ3JhZmlh LUlDQyIgdGFyZ2V0PSJlc3B0ZWMiPkVzcGVjaWZpY2FjaW9ucyB0JmVncmF2ZTtj bmlxdWVzPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNh YWE7Ii8+ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6 Ly93d3cuaWNjLmNhdC9jb25kaWNpb25zIiB0YXJnZXQ9ImNvbmRpY2lvbnMiPkNv bmRpY2lvbnMgZFwnJnVhY3V0ZTtzPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3Jk ZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAmbmJzcDs8aW1nIHNyYz0iaW1nL2JhY2su Z2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIiAvPiA8YSBocmVmPSJq YXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywxKTttb3N0cmEoXCdwcm9k X2JtMTAwMG1cJywwKTsiPlRvdHMgZWxzIHByb2R1Y3RlczwvYT4mbmJzcDs8L2Rp dj48ZGl2IGlkPSJwcm9kX3RhbGxzIj4gIDxkaXYgY2xhc3M9InRpdG9sX3Byb2Qi PlRhbGxzPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVm PSJqYXZhc2NyaXB0OmR3bFByb2R1Y3QoXCd0YWxsc1wnKTsiPkRlc2NhcnJlZ2Fy PC9hPiZuYnNwOzwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhy ZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9nZW9zZXJ2ZWlzIiB0YXJnZXQ9IndtcyI+ V01TPC9hPjwvcD4gICA8ZGl2IGNsYXNzPSJzZXAxNSI+PC9kaXY+ICAgIDxociBz dHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlz dCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGljaW9u cyIgdGFyZ2V0PSJjb25kaWNpb25zIj5Db25kaWNpb25zIGRcJyZ1YWN1dGU7czwv YT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAg Jm5ic3A7PGltZyBzcmM9ImltZy9iYWNrLmdpZiIgc3R5bGU9InZlcnRpY2FsLWFs aWduOm1pZGRsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9k X2luZGV4XCcsMSk7bW9zdHJhKFwncHJvZF90YWxsc1wnLDApOyI+VG90cyBlbHMg cHJvZHVjdGVzPC9hPiZuYnNwOzwvZGl2PjxkaXYgaWQ9InByb2RfcG9saW5kIj4g IDxkaXYgY2xhc3M9InRpdG9sX3Byb2QiPkJhc2UgZ2VvZXNwYWNpYWwgZGVscyBw b2wmaWFjdXRlO2dvbnMgaW5kdXN0cmlhbHM8L2Rpdj4gICAgPHAgY2xhc3M9InBs aXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6ZHdsUHJvZHVjdChcJ2Jk Z3BvbGluZFwnKTsiPkRlc2NhcnJlZ2FyPC9hPiZuYnNwOzwvcD4gICAgPHAgY2xh c3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9n ZW9zZXJ2ZWlzIiB0YXJnZXQ9IndtcyI+V01TPC9hPjwvcD4gICA8ZGl2IGNsYXNz PSJzZXAxNSI+PC9kaXY+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAj YWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRw Oi8vd3d3LmljYy5jYXQvY29uZGljaW9ucyIgdGFyZ2V0PSJjb25kaWNpb25zIj5D b25kaWNpb25zIGRcJyZ1YWN1dGU7czwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9y ZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgJm5ic3A7PGltZyBzcmM9ImltZy9iYWNr LmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIgLz4gPGEgaHJlZj0i amF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMSk7bW9zdHJhKFwncHJv ZF9wb2xpbmRcJywwKTtBcHAubGF5b3V0LnNldFdNU1Zpc2libGUoMCxcJ3Q1XCcp Ij5Ub3RzIGVscyBwcm9kdWN0ZXM8L2E+Jm5ic3A7PC9kaXY+PGRpdiBpZD0icHJv ZF9wMTAwMCI+ICA8ZGl2IGNsYXNzPSJ0aXRvbF9wcm9kIj5DYXJ0b2dyYWZpYSB0 b3BvZ3ImYWdyYXZlO2ZpY2EgMToxMDAwPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlz dCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om5hdmVnYXJoaSgxMCxcJ3Rv cG9cJyk7Ij5OYXZlZ2FyLWhpPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4m IzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6QXBwLmxheW91dC5zZXRXTVNWaXNp YmxlKDEsXCdwMTAwMFwnKTsiPkRlc2NhcnJlZ2FyPC9hPiZuYnNwOzxzcGFuIGNs YXNzPSJ0b29sdGlwX2Rlc2MiPihFc2NvbGxpciB1biBwcm9qZWN0ZSk8L3NwYW4+ PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNj cmlwdDpBcHAubGF5b3V0LnNob3dXaW5kb3coXCdjdDFtXCcpOyI+RGlzcG9uaWJp bGl0YXQ8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJl Zj0iaHR0cDovL3d3dy5pY2MuY2F0L2dlb3NlcnZlaXMiIHRhcmdldD0id21zIj5X TVM8L2E+PC9wPiAgIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4gICAgPGRpdiBj bGFzcz0iZW51bmNpYXQiPkFyeGl1cyBjb21wbGVtZW50YXJpczwvZGl2PiAgICA8 cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2Mu Y2F0L2NhdC9Ib21lLUlDQy9NYXBlcy1mb3Rvcy1hZXJpZXMvU29icmUtbGEtY2Fy dG9ncmFmaWEtSUNDIiB0YXJnZXQ9ImFyeGNvbSI+UGVyIGEgRFhGPC9hPjwvcD4g ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cu aWNjLmNhdC9jYXQvSG9tZS1JQ0MvTWFwZXMtZm90b3MtYWVyaWVzL1NvYnJlLWxh LWNhcnRvZ3JhZmlhLUlDQyIgdGFyZ2V0PSJhcnhjb20iPlBlciBhIERHTjwvYT48 L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8v d3d3LmljYy5jYXQvY2F0L0hvbWUtSUNDL01hcGVzLWZvdG9zLWFlcmllcy9Tb2Jy ZS1sYS1jYXJ0b2dyYWZpYS1JQ0MiIHRhcmdldD0iYXJ4Y29tIj5QZXIgYSBTSFA8 L2E+PC9wPiAgPGRpdiBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgICA8ZGl2IGNsYXNz PSJlbnVuY2lhdCI+RXNwZWNpZmljYWNpb25zIHQmZWdyYXZlO2NuaXF1ZXM8L2Rp dj4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93 d3cuaWNjLmNhdC9jYXQvSG9tZS1JQ0MvTWFwZXMtZm90b3MtYWVyaWVzL1NvYnJl LWxhLWNhcnRvZ3JhZmlhLUlDQyIgdGFyZ2V0PSJlc3B0ZWMiPkVzcGVjaWZpY2Fj aW9ucyB0JmVncmF2ZTtjbmlxdWVzPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0 Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvSG9tZS1J Q0MvTWFwZXMtZm90b3MtYWVyaWVzL1NvYnJlLWxhLWNhcnRvZ3JhZmlhLUlDQyIg dGFyZ2V0PSJkaWMiPkRpY2Npb25hcmkgZGUgZGFkZXM8L2E+PC9wPiAgICA8cCBj bGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0 L2NhdC9Ib21lLUlDQy9NYXBlcy1mb3Rvcy1hZXJpZXMvU29icmUtbGEtY2FydG9n cmFmaWEtSUNDIiB0YXJnZXQ9ImVzcHRlYyI+RXNwZWNpZmljYWNpb25zIGRlIERY RjwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJo dHRwOi8vd3d3LmljYy5jYXQvY2F0L0hvbWUtSUNDL01hcGVzLWZvdG9zLWFlcmll cy9Tb2JyZS1sYS1jYXJ0b2dyYWZpYS1JQ0MiIHRhcmdldD0iZXNwdGVjIj5Fc3Bl Y2lmaWNhY2lvbnMgZGUgREdOPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4m IzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvSG9tZS1JQ0Mv TWFwZXMtZm90b3MtYWVyaWVzL1NvYnJlLWxhLWNhcnRvZ3JhZmlhLUlDQyIgdGFy Z2V0PSJlc3B0ZWMiPkVzcGVjaWZpY2FjaW9ucyBkZSBTSFA8L2E+PC9wPiAgICA8 aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICA8cCBjbGFzcz0i cGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NvbmRp Y2lvbnMiIHRhcmdldD0iY29uZGljaW9ucyI+Q29uZGljaW9ucyBkXCcmdWFjdXRl O3M8L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsi Lz4gICZuYnNwOzxpbWcgc3JjPSJpbWcvYmFjay5naWYiLz4gPGEgaHJlZj0iamF2 YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMSk7bW9zdHJhKFwncHJvZF9w MTAwMFwnLDApO0FwcC5sYXlvdXQuc2V0V01TVmlzaWJsZSgwLFwncDEwMDBcJyki PlRvdHMgZWxzIHByb2R1Y3RlczwvYT4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJwcm9k X2NsaWNrIj48L2Rpdj4nO2JyZWFrO2Nhc2UiZXNsIjp2YXIgYT0nPGRpdiBpZD0i cHJvZF9pbmRleCI+ICAgIDxkaXYgY2xhc3M9ImVudW5jaWF0Ij48c3BhbiBzdHls ZT0iZm9udC13ZWlnaHQ6Ym9sZCI+UHJvZHVjdG9zPC9zcGFuPjwvZGl2PiAgICA8 aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gIDxkaXYgY2xhc3M9 InRpdG9sX3Byb2QiPkJhamEgcmVzb2x1Y2kmb2FjdXRlO246PC9kaXY+ICAgIDxm b3JtIG5hbWU9ImZvcm1zbmFwIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iL3NlcnZl aXNHdWlhQ2FycmVycy9tYXBTbmFwc2hvdCIgc3R5bGU9ImRpc3BsYXk6aW5saW5l Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwb3N0Qm9keSIgLz48cCBjbGFz cz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpnZXRTbmFwc2hv dChcJ2Zvcm1zbmFwXCcpO2phdmFzY3JpcHQ6X2dhcS5wdXNoKFtcJ190cmFja0V2 ZW50XCcsIFwndmlzc2lyXCcsIFwnc25hcHNob3RcJ10pOyI+VmlzdGEgYWN0dWFs PC9hPiA8c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwcHgiPihGb3JtYXQganBnLiBT aXMuIFJlZi4gRUQ1MCk8L3NwYW4+PC9wPjwvZm9ybT4gIDxkaXYgY2xhc3M9InNl cDE1Ij48L2Rpdj4gIDxkaXYgY2xhc3M9InRpdG9sX3Byb2QiPkFsdGEgcmVzb2x1 Y2kmb2FjdXRlO246PC9kaXY+ICA8ZGl2IGNsYXNzPSJzZXAxNSI+PC9kaXY+ICA8 ZGl2IGNsYXNzPSJlbnVuY2lhdCI+VG9wb2dyJmFhY3V0ZTtmaWNvczwvZGl2PiAg IDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om1v c3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX3AxMDAwXCcsMSk7 Ij5DYXJ0b2dyYWYmaWFjdXRlO2EgdG9wb2dyJmFhY3V0ZTtmaWNhIDE6MS4wMDA8 L2E+PC9wPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZh c2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX2J0 NW1cJywxKTsiPkJhc2UgdG9wb2dyJmFhY3V0ZTtmaWNhIDE6NS4wMDA8L2E+PC9s aT4gICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlw dDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMCk7bW9zdHJhKFwncHJvZF9tdDEwbVwn LDEpOyI+TWFwYSB0b3BvZ3ImYWFjdXRlO2ZpY28gMToxMC4wMDA8L2E+PC9wPiAg IDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om1v c3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX2J0MjVtXCcsMSk7 Ij5CYXNlIHRvcG9nciZhYWN1dGU7ZmljYSAxOjI1LjAwMDwvYT48L3A+ICAgPHAg Y2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJh KFwncHJvZF9pbmRleFwnLDApO21vc3RyYShcJ3Byb2RfYnQ1MG1cJywxKTsiPkJh c2UgdG9wb2dyJmFhY3V0ZTtmaWNhIDE6NTAuMDAwPC9hPjwvcD4gICA8cCBjbGFz cz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdw cm9kX2luZGV4XCcsMCk7bW9zdHJhKFwncHJvZF9jb201MG1cJywxKTsiPk1hcGEg Y29tYXJjYWwgKHRvcG9nciZhYWN1dGU7ZmljbykgMTo1MC4wMDA8L2E+PC9wPiAg IDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om1v c3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX210YzI1MG1cJywx KTsiPk1hcGEgdG9wb2dyJmFhY3V0ZTtmaWNvIDE6MjUwLjAwMDwvYT48L3A+ICAg PHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9z dHJhKFwncHJvZF9pbmRleFwnLDApO21vc3RyYShcJ3Byb2RfbXRjNTAwbVwnLDEp OyI+TWFwYSB0b3BvZ3ImYWFjdXRlO2ZpY28gMTo1MDAuMDAwPC9hPjwvcD4gICA8 cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0 cmEoXCdwcm9kX2luZGV4XCcsMCk7bW9zdHJhKFwncHJvZF9tdGMxMDAwbVwnLDEp OyI+TWFwYSB0b3BvZ3ImYWFjdXRlO2ZpY28gMToxLjAwMC4wMDA8L2E+PC9wPiAg PGRpdiBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgPGRpdiBjbGFzcz0iZW51bmNpYXQi Pk9ydG9mb3RvczwvZGl2PiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBo cmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEo XCdwcm9kX29mMlwnLDEpOyI+T3J0b2ZvdG8gMjUgY20gdmlnZW50ZTwvYT48L2xp PiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0 Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX29mNVwnLDEp OyI+T3J0b2ZvdG8gNTAgY20gdmlnZW50ZTwvYT48L3A+ICAgPHAgY2xhc3M9InBs aXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9p bmRleFwnLDApO21vc3RyYShcJ3Byb2Rfb2YyNVwnLDEpOyI+T3J0b2ZvdG8gMiw1 IG0gdmlnZW50ZTwvYT48L3A+ICA8ZGl2IGNsYXNzPSJzZXAxNSI+PC9kaXY+ICA8 ZGl2IGNsYXNzPSJlbnVuY2lhdCI+TURFPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlz dCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5k ZXhcJywwKTttb3N0cmEoXCdwcm9kX21ldFwnLDEpOyI+TURFIDE1eDE1PC9hPjwv cD4gIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4gIDxkaXYgY2xhc3M9ImVudW5j aWF0Ij5UZW0mYWdyYXZlO3RpY3M8L2Rpdj4gICAgPHAgY2xhc3M9InBsaXN0Ij4m IzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwn LDApO21vc3RyYShcJ3Byb2RfbXAyMFwnLDEpOyI+TWFwYSBkZWxzIHMmb2dyYXZl O2xzIGRlIHBlbmRlbnQgPiAyMCAlPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0 Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRl eFwnLDApO21vc3RyYShcJ3Byb2RfYm01MG1cJywxKTsiPkJhc2UgbXVuaWNpcGFs IDE6NTAuMDAwPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxh IGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDApO21vc3Ry YShcJ3Byb2RfYm01MG1cJywxKTsiPkJhc2UgbXVuaWNpcGFsIDE6NTAuMDAwPC9h PjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFz Y3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDApO21vc3RyYShcJ3Byb2RfYm0y NTBtXCcsMSk7Ij5CYXNlIG11bmljaXBhbCAxOjI1MC4wMDA8L2E+PC9wPiAgICA8 cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0 cmEoXCdwcm9kX2luZGV4XCcsMCk7bW9zdHJhKFwncHJvZF9ibTEwMDBtXCcsMSk7 Ij5CYXNlIG11bmljaXBhbCAxOjEuMDAwLjAwMDwvYT48L3A+ICAgIDxwIGNsYXNz PSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3By b2RfaW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX3RhbGxzXCcsMSk7Ij5UYWxsczwv YT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZh c2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX3Bv bGluZFwnLDEpOyI+QmFzZSBnZW9lc3BhY2lhbCBkZWxzIHBvbCZpYWN1dGU7Z29u cyBpbmR1c3RyaWFsczwvYT48L3A+ICA8ZGl2IGNsYXNzPSJzZXAxNSI+PC9kaXY+ ICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+QXRsZXM8L2Rpdj4gICAgPHAgY2xhc3M9 InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXRsZXNuYWNpb25h bC5jYXQvaWNjL2F0bGVzLW5hY2lvbmFsLyIgdGFyZ2V0PSJhdGxlc25hY2lvbmFs Ij5BdGxlcyBOYWNpb25hbCBkZSBDYXRhbHVueWE8L2E+PC9wPiAgPGRpdiBjbGFz cz0ic2VwMTUiPjwvZGl2PiAgPGRpdiBjbGFzcz0iZW51bmNpYXQiPk1hcGVzIGFu dGljczwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0i amF2YXNjcmlwdDpvcGVuQ0RNKCkiPk1hcGFzIGFudGlndW9zPC9hPjwvcD4gICAg PGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAgIDxwIGNsYXNz PSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvZXNs L0hvbWUtSUNDL0luaWNpL0NvbmRpY2lvbnMtZC11cyIgdGFyZ2V0PSJjb25kaWNp b25zIj5Db25kaWNpb25lcyBkZSB1c288L2E+PC9wPjwvZGl2PjxkaXYgaWQ9InBy b2RfbWFwZXMiPjwvZGl2PjxkaXYgaWQ9InByb2RfYnQ1bSI+ICA8ZGl2IGNsYXNz PSJ0aXRvbF9wcm9kIj5CYXNlIHRvcG9nciZhYWN1dGU7ZmljYSAxOjUuMDAwPC9k aXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2Ny aXB0Om5hdmVnYXJoaSg5LFwndG9wb1wnKTsiPk5hdmVnYXI8L2E+PC9wPiAgICA8 cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpBcHAu bGF5b3V0LnNldFdNU1Zpc2libGUoMSxcJ3Q1XCcpOyI+RGVzY2FyZ2FyPC9hPiZu YnNwOzxzcGFuIGNsYXNzPSJ0b29sdGlwX2Rlc2MiPihFc2NvZ2VyIHVuYSBob2ph KTwvc3Bhbj48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVm PSJsbGVnZW5kZXMvbXRjNW0ucGRmIiB0YXJnZXQ9ImxsZWdlbmRhIj5MZXllbmRh PC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imph dmFzY3JpcHQ6QXBwLmxheW91dC5zaG93V2luZG93KFwnYnQ1bVwnKTsiPkRpc3Bv bmliaWxpZGFkPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxh IGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9lc2wvSG9tZS1JQ0MvSW5pY2kvQ2Fy dG9ncmFmaWEvU2VydmVpcy1kZS1tYXBlcy1lbi1saW5pYS9TZXJ2ZWlzLU9HQyIg dGFyZ2V0PSJ3bXMiPldNUzwvYT48L3A+ICAgPGRpdiBjbGFzcz0ic2VwMTUiPjwv ZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+QXJjaGl2b3MgY29tcGxlbWVu dGFyaW9zPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVm PSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvMTgxOS83 MTIyL2ZpbGUvYnQ1bXYyMGR4MV8wMWNhLnppcCI+UGFyYSBEWEY8L2E+PC9wPiAg ICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5p Y2MuY2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzE4MjAvNzEyNi9maWxlL2J0NW12 MjBkZzFfMDFjYS56aXAiPlBhcmEgREdOPC9hPjwvcD4gICAgPHAgY2xhc3M9InBs aXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvY29u dGVudC9kb3dubG9hZC8xODIxLzcxMzAvZmlsZS9idDVtdjIwc2gwXzAxY2Euemlw Ij5QYXJhIFNIUDwvYT48L3A+ICA8ZGl2IGNsYXNzPSJzZXAxNSI+PC9kaXY+ICAg IDxkaXYgY2xhc3M9ImVudW5jaWF0Ij5Fc3BlY2lmaWNhY2lvbmVzIHQmZWFjdXRl O2NuaWNhczwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJl Zj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzcxOC8y Nzk4L2ZpbGUvYnQ1bXYyMGVzcF8wNGNhLnBkZiIgdGFyZ2V0PSJlc3BlYyI+RXNw ZWNpZmljYWNpb25lcyB0JmVhY3V0ZTtjbmljYXM8L2E+PC9wPiAgICA8cCBjbGFz cz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2Nh dC9jb250ZW50L2Rvd25sb2FkLzcxOS8yODAyL2ZpbGUvYnQ1bXYyMGRpY18wNGNh LnBkZiIgdGFyZ2V0PSJkaWMiPkRpY2Npb25hcmlvIGRlIGRhdG9zPC9hPjwvcD4g ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cu aWNjLmNhdC9jYXQvY29udGVudC9kb3dubG9hZC85OTg5LzMyNTg4L2ZpbGUvYnQ1 bXYyMGR4MV8wMWNhLnBkZiIgdGFyZ2V0PSJlc3BlY2R4ZiI+RXNwZWNpZmljYWNp b25lcyBkZSBEWEY8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsg PGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9jb250ZW50L2Rvd25sb2Fk Lzk5ODUvMzI1NjgvZmlsZS9idDVtdjIwZGcxXzAxY2EucGRmIiB0YXJnZXQ9ImVz cGVjZGduIj5Fc3BlY2lmaWNhY2lvbmVzIGRlIERHTjwvYT48L3A+ICAgIDxwIGNs YXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQv Y2F0L2NvbnRlbnQvZG93bmxvYWQvOTk5MS8zMjU5OC9maWxlL2J0NW12MjBzaDBf MDFjYS5wZGYiIHRhcmdldD0iZXNwZWNzaHAiPkVzcGVjaWZpY2FjaW9uZXMgZGUg U0hQPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7 Ii8+ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93 d3cuaWNjLmNhdC9jb25kaWNpb25zIiB0YXJnZXQ9ImNvbmRpY2lvbnMiPkNvbmRp Y2lvbmVzIGRlIHVzbzwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBz b2xpZCAjYWFhOyIvPiAgJm5ic3A7PGltZyBzcmM9ImltZy9iYWNrLmdpZiIgc3R5 bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlw dDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMSk7bW9zdHJhKFwncHJvZF9idDVtXCcs MCk7QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDAsXCd0NVwnKSI+VG9kb3MgbG9z IHByb2R1Y3RvczwvYT4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJwcm9kX210MTBtIj4g IDxkaXYgY2xhc3M9InRpdG9sX3Byb2QiPk1hcGEgdG9wb2dyJmFhY3V0ZTtmaWNv IDE6MTAuMDAwPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBo cmVmPSJqYXZhc2NyaXB0Om5hdmVnYXJoaSg4LFwndG9wb1wnKTsiPk5hdmVnYXI8 L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2 YXNjcmlwdDpBcHAubGF5b3V0LnNldFdNU1Zpc2libGUoMSxcJ3QxMFwnKTsiPkRl c2NhcmdhcjwvYT4mbmJzcDs8c3BhbiBjbGFzcz0idG9vbHRpcF9kZXNjIj4oRXNj b2dlciB1bmEgaG9qYSk8L3NwYW4+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYj ODIyNjsgPGEgaHJlZj0ibGxlZ2VuZGVzL210YzEwbS5wZGYiIHRhcmdldD0ibGxl Z2VuZGEiPkxleWVuZGE8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIy NjsgPGEgaHJlZj0iamF2YXNjcmlwdDpBcHAubGF5b3V0LnNob3dXaW5kb3coXCdt dGMxMG1cJyk7Ij5EaXNwb25pYmlsaWRhZDwvYT48L3A+ICAgIDxwIGNsYXNzPSJw bGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvZ2Vvc2Vy dmVpcyIgdGFyZ2V0PSJ3bXMiPldNUzwvYT48L3A+ICAgPGRpdiBjbGFzcz0ic2Vw MTUiPjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+RXNwZWNpZmljYWNp b25lcyB0JmVhY3V0ZTtjbmljYXM8L2Rpdj4gICAgPHAgY2xhc3M9InBsaXN0Ij4m IzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvY29udGVudC9k b3dubG9hZC80NjcyMS8zMjY2NDcvZmlsZS9tdDEwbXYxMWVzcF8wMWNhLnBkZiIg dGFyZ2V0PSJlc3BlYyI+RXNwZWNpZmljYWNpb25lcyB0JmVhY3V0ZTtjbmljYXM8 L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4g ICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5p Y2MuY2F0L2NvbmRpY2lvbnMiIHRhcmdldD0iY29uZGljaW9ucyI+Q29uZGljaW9u ZXMgZGUgdXNvPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlk ICNhYWE7Ii8+ICAmbmJzcDs8aW1nIHNyYz0iaW1nL2JhY2suZ2lmIiBzdHlsZT0i dmVydGljYWwtYWxpZ246bWlkZGxlIiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om1v c3RyYShcJ3Byb2RfaW5kZXhcJywxKTttb3N0cmEoXCdwcm9kX210MTBtXCcsMCk7 QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDAsXCd0MTBcJykiPlRvZG9zIGxvcyBw cm9kdWN0b3M8L2E+Jm5ic3A7PC9kaXY+PGRpdiBpZD0icHJvZF9idDI1bSI+ICA8 ZGl2IGNsYXNzPSJ0aXRvbF9wcm9kIj5CYXNlIHRvcG9nciZhYWN1dGU7ZmljYSAx OjI1LjAwMDwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJl Zj0iamF2YXNjcmlwdDpuYXZlZ2FyaGkoNyxcJ3RvcG9cJyk7Ij5OYXZlZ2FyPC9h PjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFz Y3JpcHQ6QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDEsXCd0MjVcJyk7Ij5EZXNj YXJnYXI8L2E+Jm5ic3A7PHNwYW4gY2xhc3M9InRvb2x0aXBfZGVzYyI+KEVzY29n ZXIgdW5hIGhvamEpPC9zcGFuPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgy MjY7IDxhIGhyZWY9ImxsZWdlbmRlcy9tdGMyNW0ucGRmIiB0YXJnZXQ9ImxsZWdl bmRhIj5MZXllbmRhPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7 IDxhIGhyZWY9ImphdmFzY3JpcHQ6QXBwLmxheW91dC5zaG93V2luZG93KFwnYnQy NW1cJyk7Ij5EaXNwb25pYmlsaWRhZDwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlz dCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvZ2Vvc2VydmVp cyIgdGFyZ2V0PSJ3bXMiPldNUzwvYT48L3A+ICAgPGRpdiBjbGFzcz0ic2VwMTUi PjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+QXJjaGl2b3MgY29tcGxl bWVudGFyaW9zPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBo cmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvMTM1 MjQvNDQwODkvZmlsZS9idDI1bXYxMGR4MF8wMmNhLnppcCI+UGFyYSBEWEY8L2E+ PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDov L3d3dy5pY2MuY2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzE4MjMvNzEzOC9maWxl L2J0MjVtdjEwZGcxXzAyY2EuemlwIj5QYXJhIERHTjwvYT48L3A+ICAgIDxwIGNs YXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQv Y2F0L2NvbnRlbnQvZG93bmxvYWQvMTM1MjYvNDQxMDYvZmlsZS9idDI1bXYxMHNo MF8wMmNhLnppcCI+UGFyYSBTSFA8L2E+PC9wPiAgPGRpdiBjbGFzcz0ic2VwMTUi PjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+RXNwZWNpZmljYWNpb25l cyB0JmVhY3V0ZTtjbmlxdWVzPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4 MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93 bmxvYWQvOTcwMC8zMDY1Mi9maWxlL2J0MjVtdjEwZXNwXzAyY2EucGRmIiB0YXJn ZXQ9ImVzcGVjIj5Fc3BlY2lmaWNhY2lvbmVzIHQmZWFjdXRlO2NuaXF1ZXM8L2E+ PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDov L3d3dy5pY2MuY2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzk3MDEvMzA2NTcvZmls ZS9idDI1bXYxMGRpY18wMmNhLnBkZiIgdGFyZ2V0PSJkaWMiPkRpY2Npb25hcmlv IGRlIGRhdG9zPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxh IGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvY29udGVudC9kb3dubG9hZC8x MzUxOS80NDA2NC9maWxlL2J0MjVtdjEwZHgwXzAyY2EucGRmIiB0YXJnZXQ9ImVz cGVjZHhmIj5Fc3BlY2lmaWNhY2lvbmVzIGRlIERYRjwvYT48L3A+ICAgIDxwIGNs YXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQv Y2F0L2NvbnRlbnQvZG93bmxvYWQvOTk4Ni8zMjU3My9maWxlL2J0MjVtdjEwZGcx XzAyY2EucGRmIiB0YXJnZXQ9ImVzcGVjZGduIj5Fc3BlY2lmaWNhY2lvbmVzIGRl IERHTjwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVm PSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvOTk4Ni8z MjU3My9maWxlL2J0MjVtdjEwZGcxXzAyY2EucGRmIiB0YXJnZXQ9ImVzcGVjc2hw Ij5Fc3BlY2lmaWNhY2lvbmVzIGRlIFNIUDwvYT48L3A+ICAgIDxociBzdHlsZT0i Ym9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4 MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGljaW9ucyIgdGFy Z2V0PSJjb25kaWNpb25zIj5Db25kaWNpb25lcyBkZSB1c288L2E+PC9wPiAgICA8 aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICZuYnNwOzxpbWcg c3JjPSJpbWcvYmFjay5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUi IC8+IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDEp O21vc3RyYShcJ3Byb2RfYnQyNW1cJywwKTtBcHAubGF5b3V0LnNldFdNU1Zpc2li bGUoMCxcJ3QyNVwnKSI+VG9kb3MgbG9zIHByb2R1Y3RvczwvYT4mbmJzcDs8L2Rp dj48ZGl2IGlkPSJwcm9kX2J0NTBtIj4gIDxkaXYgY2xhc3M9InRpdG9sX3Byb2Qi PkJhc2UgdG9wb2dyJmFhY3V0ZTtmaWNhIDE6NTAuMDAwPC9kaXY+ICAgIDxwIGNs YXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om5hdmVnYXJo aSg2LFwndG9wb1wnKTsiPk5hdmVnYXI8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxp c3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpBcHAubGF5b3V0LnNldFdN U1Zpc2libGUoMSxcJ3Q1MFwnKTsiPkRlc2NhcmdhcjwvYT4mbmJzcDs8c3BhbiBj bGFzcz0idG9vbHRpcF9kZXNjIj4oRXNjb2dlciB1bmEgaG9qYSk8L3NwYW4+PC9w PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3 dy5pY2MuY2F0L2dlb3NlcnZlaXMiIHRhcmdldD0id21zIj5XTVM8L2E+PC9wPiAg IDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4gICAgPGRpdiBjbGFzcz0iZW51bmNp YXQiPkFyY2hpdm9zIGNvbXBsZW1lbnRhcmlvczwvZGl2PiAgICA8cCBjbGFzcz0i cGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9j b250ZW50L2Rvd25sb2FkLzE4MjQvNzE0Mi9maWxlL2J0NTBtdjMxZHgxXzAxY2Eu emlwIj5QYXJhIERYRjwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2 OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxv YWQvMTgyNS83MTQ2L2ZpbGUvYnQ1MG12MzFkZzFfMDFjYS56aXAiPlBhcmEgREdO PC9hPjwvcD4gIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4gICAgPGRpdiBjbGFz cz0iZW51bmNpYXQiPkVzcGVjaWZpY2FjaW9uZXMgdCZlYWN1dGU7Y25pY2FzPC9k aXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8v d3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvNzIwLzI4MDYvZmlsZS9i dDUwbXYzMWVzcF8wMmNhLnBkZiIgdGFyZ2V0PSJlc3BlYyI+RXNwZWNpZmljYWNp b25lcyB0JmVhY3V0ZTtjbmljYXM8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3Qi PiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9jb250ZW50 L2Rvd25sb2FkLzcyMS8yODEwL2ZpbGUvYnQ1MG12MzFkaWNfMDFjYS5wZGYiIHRh cmdldD0iZGljIj5EaWNjaW9uYXJpbyBkZSBkYXRvczwvYT48L3A+ICAgIDxwIGNs YXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQv Y2F0L2NvbnRlbnQvZG93bmxvYWQvOTk5My8zMjYwOC9maWxlL2J0NTBtdjMxZHgx XzAxY2EucGRmIiB0YXJnZXQ9ImVzcGVjZHhmIj5Fc3BlY2lmaWNhY2lvbmVzIGRl IERYRjwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVm PSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvOTk4Ny8z MjU3OC9maWxlL2J0NTBtdjMxZGcxXzAxY2EucGRmIiB0YXJnZXQ9ImVzcGVjZGdu Ij5Fc3BlY2lmaWNhY2lvbmVzIGRlIERHTjwvYT48L3A+ICAgIDxociBzdHlsZT0i Ym9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4 MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGljaW9ucyIgdGFy Z2V0PSJjb25kaWNpb25zIj5Db25kaWNpb25lcyBkZSB1c288L2E+PC9wPiAgICA8 aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICZuYnNwOzxpbWcg c3JjPSJpbWcvYmFjay5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUi IC8+IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDEp O21vc3RyYShcJ3Byb2RfYnQ1MG1cJywwKTtBcHAubGF5b3V0LnNldFdNU1Zpc2li bGUoMCxcJ3Q1MFwnKSI+VG9kb3MgbG9zIHByb2R1Y3RvczwvYT4mbmJzcDs8L2Rp dj48ZGl2IGlkPSJwcm9kX2NvbTUwbSI+ICA8ZGl2IGNsYXNzPSJ0aXRvbF9wcm9k Ij5NYXBhIGNvbWFyY2FsICh0b3BvZ3ImYWFjdXRlO2ZpYykgMTo1MC4wMDA8L2Rp dj4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3Jp cHQ6bmF2ZWdhcmhpKDYsXCd0b3BvXCcpOyI+TmF2ZWdhcjwvYT48L3A+ICAgIDxw IGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0OkFwcC5s YXlvdXQuc2V0V01TVmlzaWJsZSgxLFwnY29tYXJjYWxcJyk7Ij5EZXNjYXJnYXI8 L2E+Jm5ic3A7PHNwYW4gY2xhc3M9InRvb2x0aXBfZGVzYyI+KEVzY29nZXIgdW5h KTwvc3Bhbj48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVm PSJsbGVnZW5kZXMvbXRjNTBtLnBkZiIgdGFyZ2V0PSJsbGVnZW5kYSI+TGV5ZW5k YTwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJo dHRwOi8vd3d3LmljYy5jYXQvZ2Vvc2VydmVpcyIgdGFyZ2V0PSJ3bXMiPldNUzwv YT48L3A+ICAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4g ICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5p Y2MuY2F0L2NvbmRpY2lvbnMiIHRhcmdldD0iY29uZGljaW9ucyI+Q29uZGljaW9u ZXMgZGUgdXNvPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlk ICNhYWE7Ii8+ICAmbmJzcDs8aW1nIHNyYz0iaW1nL2JhY2suZ2lmIiBzdHlsZT0i dmVydGljYWwtYWxpZ246bWlkZGxlIiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om1v c3RyYShcJ3Byb2RfaW5kZXhcJywxKTttb3N0cmEoXCdwcm9kX2NvbTUwbVwnLDAp O0FwcC5sYXlvdXQuc2V0V01TVmlzaWJsZSgwLFwndDUwXCcpIj5Ub2RvcyBsb3Mg cHJvZHVjdG9zPC9hPiZuYnNwOzwvZGl2PjxkaXYgaWQ9InByb2RfbXRjMjUwbSI+ ICA8ZGl2IGNsYXNzPSJ0aXRvbF9wcm9kIj5NYXBhIHRvcG9nciZhYWN1dGU7Zmlj IDE6MjUwLjAwMDwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEg aHJlZj0iamF2YXNjcmlwdDpuYXZlZ2FyaGkoNCxcJ3RvcG9cJyk7Ij5OYXZlZ2Fy PC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imph dmFzY3JpcHQ6ZHdsUHJvZHVjdChcJ210YzI1MG1cJykiPkRlc2NhcmdhcjwvYT4m bmJzcDs8c3BhbiBjbGFzcz0idG9vbHRpcF9kZXNjIj48L3NwYW4+PC9wPiAgICA8 cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0ibGxlZ2VuZGVzL210YzI1 MG0ucGRmIiB0YXJnZXQ9ImxsZWdlbmRhIj5MZXllbmRhPC9hPjwvcD4gICAgPHAg Y2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNh dC9nZW9zZXJ2ZWlzIiB0YXJnZXQ9IndtcyI+V01TPC9hPjwvcD4gICAgIDxociBz dHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlz dCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGljaW9u cyIgdGFyZ2V0PSJjb25kaWNpb25zIj5Db25kaWNpb25lcyBkZSB1c288L2E+PC9w PiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICZuYnNw OzxpbWcgc3JjPSJpbWcvYmFjay5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjpt aWRkbGUiIC8+IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRl eFwnLDEpO21vc3RyYShcJ3Byb2RfbXRjMjUwbVwnLDApOyI+VG9kb3MgbG9zIHBy b2R1Y3RvczwvYT4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJwcm9kX210YzUwMG0iPiAg PGRpdiBjbGFzcz0idGl0b2xfcHJvZCI+TWFwYSB0b3BvZ3ImYWFjdXRlO2ZpYyAx OjUwMC4wMDA8L2Rpdj4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhy ZWY9ImphdmFzY3JpcHQ6bmF2ZWdhcmhpKDMsXCd0b3BvXCcpOyI+TmF2ZWdhcjwv YT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZh c2NyaXB0OmR3bFByb2R1Y3QoXCdtdGM1MDBtXCcpIj5EZXNjYXJnYXI8L2E+Jm5i c3A7PHNwYW4gY2xhc3M9InRvb2x0aXBfZGVzYyI+PC9zcGFuPjwvcD4gICAgPHAg Y2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImxsZWdlbmRlcy9tdGM1MDBt LnBkZiIgdGFyZ2V0PSJsbGVnZW5kYSI+TGV5ZW5kYTwvYT48L3A+ICAgIDxwIGNs YXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQv Z2Vvc2VydmVpcyIgdGFyZ2V0PSJ3bXMiPldNUzwvYT48L3A+ICAgICA8aHIgc3R5 bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICA8cCBjbGFzcz0icGxpc3Qi PiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NvbmRpY2lvbnMi IHRhcmdldD0iY29uZGljaW9ucyI+Q29uZGljaW9uZXMgZGUgdXNvPC9hPjwvcD4g ICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAmbmJzcDs8 aW1nIHNyYz0iaW1nL2JhY2suZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246bWlk ZGxlIiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhc JywxKTttb3N0cmEoXCdwcm9kX210YzUwMG1cJywwKTsiPlRvZG9zIGxvcyBwcm9k dWN0b3M8L2E+Jm5ic3A7PC9kaXY+PGRpdiBpZD0icHJvZF9tdGMxMDAwbSI+ICA8 ZGl2IGNsYXNzPSJ0aXRvbF9wcm9kIj5NYXBhIHRvcG9nciZhYWN1dGU7ZmljIDE6 MDAwLjAwMDwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJl Zj0iamF2YXNjcmlwdDpuYXZlZ2FyaGkoMSxcJ3RvcG9cJyk7Ij5OYXZlZ2FyPC9h PjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFz Y3JpcHQ6ZHdsUHJvZHVjdChcJ210YzEwMDBtXCcpIj5EZXNjYXJnYXI8L2E+Jm5i c3A7PHNwYW4gY2xhc3M9InRvb2x0aXBfZGVzYyI+PC9zcGFuPjwvcD4gICAgPHAg Y2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImxsZWdlbmRlcy9tdGMxMDAw bS5wZGYiIHRhcmdldD0ibGxlZ2VuZGEiPkxleWVuZGE8L2E+PC9wPiAgICA8cCBj bGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0 L2dlb3NlcnZlaXMiIHRhcmdldD0id21zIj5XTVM8L2E+PC9wPiAgICAgPGhyIHN0 eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAgPHAgY2xhc3M9InBsaXN0 Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jb25kaWNpb25z IiB0YXJnZXQ9ImNvbmRpY2lvbnMiPkNvbmRpY2lvbmVzIGRlIHVzbzwvYT48L3A+ ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgJm5ic3A7 PGltZyBzcmM9ImltZy9iYWNrLmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1p ZGRsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4 XCcsMSk7bW9zdHJhKFwncHJvZF9tdGMxMDAwbVwnLDApOyI+VG9kb3MgbG9zIHBy b2R1Y3RvczwvYT4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJwcm9kX2FlcmllcyI+PC9k aXY+PGRpdiBpZD0icHJvZF9vZjIiPiAgPGRpdiBjbGFzcz0idGl0b2xfcHJvZCI+ T3J0b2ZvdG8gMjUgY20gdmlnZW50ZTwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3Qi PiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpuYXZlZ2FyaGkoMTAsXCdvcnRv XCcpOyI+TmF2ZWdhcjwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2 OyA8YSBocmVmPSJqYXZhc2NyaXB0OkFwcC5sYXlvdXQuc2V0V01TVmlzaWJsZSgx LFwndDJcJyk7Ij5EZXNjYXJnYXI8L2E+Jm5ic3A7PHNwYW4gY2xhc3M9InRvb2x0 aXBfZGVzYyI+KEVzY29nZXIgdW5hIGhvamEpPC9zcGFuPjwvcD4gICAgPHAgY2xh c3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6QXBwLmxheW91 dC5zaG93V2luZG93KFwnb2YyNWNcJyk7Ij5EaXNwb25pYmlsaWRhZDwvYT48L3A+ ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3 LmljYy5jYXQvZ2Vvc2VydmVpcyIgdGFyZ2V0PSJ3bXMiPldNUzwvYT48L3A+ICAg PGRpdiBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVuY2lh dCI+RXNwZWNpZmljYWNpb25lcyB0JmVhY3V0ZTtjbmljYXM8L2Rpdj4gICAgPHAg Y2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNh dC9jYXQvY29udGVudC9kb3dubG9hZC8xMjM0MC80MTQ1MS9maWxlL29mMjVjdjMz ZXNwXzAzY2EucGRmIiB0YXJnZXQ9ImVzcGVjIj5Fc3BlY2lmaWNhY2lvbmVzIHQm ZWFjdXRlO2NuaWNhczwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBz b2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVm PSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGljaW9ucyIgdGFyZ2V0PSJjb25kaWNp b25zIj5Db25kaWNpb25lcyBkZSB1c288L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJv cmRlcjoxcHggc29saWQgI2FhYTsiLz4gICZuYnNwOzxpbWcgc3JjPSJpbWcvYmFj ay5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiIC8+IDxhIGhyZWY9 ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDEpO21vc3RyYShcJ3By b2Rfb2YyXCcsMCk7QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDAsXCd0MlwnKSI+ VG9kb3MgZWxzIHByb2R1Y3RvczwvYT4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJwcm9k X29mNSI+ICA8ZGl2IGNsYXNzPSJ0aXRvbF9wcm9kIj5PcnRvZm90byA1MCBjbSB2 aWdlbnRlPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVm PSJqYXZhc2NyaXB0Om5hdmVnYXJoaSg5LFwnb3J0b1wnKTsiPk5hdmVnYXI8L2E+ PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNj cmlwdDpBcHAubGF5b3V0LnNldFdNU1Zpc2libGUoMSxcJ3Q1XCcpOyI+RGVzY2Fy Z2FyPC9hPiZuYnNwOzxzcGFuIGNsYXNzPSJ0b29sdGlwX2Rlc2MiPihFc2NvZ2Vy IHVuYSBob2phKTwvc3Bhbj48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2 OyA8YSBocmVmPSJqYXZhc2NyaXB0OkFwcC5sYXlvdXQuc2hvd1dpbmRvdyhcJ29m NW1cJyk7Ij5EaXNwb25pYmlsaWRhZDwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlz dCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvZ2Vvc2VydmVp cyIgdGFyZ2V0PSJ3bXMiPldNUzwvYT48L3A+ICAgICA8ZGl2IGNsYXNzPSJlbnVu Y2lhdCI+RXNwZWNpZmljYWNpb25lcyB0JmVhY3V0ZTtjbmljYXNzPC9kaXY+ICAg IDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3Lmlj Yy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvMjEzNDkvNjc2MjEvZmlsZS9vZjVt djYwZXNwXzAxY2EucGRmIiB0YXJnZXQ9ImVzcGVjIj5Fc3BlY2lmaWNhY2lvbmVz IHQmZWFjdXRlO2NuaWNhczwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFw eCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBo cmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGljaW9ucyIgdGFyZ2V0PSJjb25k aWNpb25zIj5Db25kaWNpb25lcyBkZSB1c288L2E+PC9wPiAgICA8aHIgc3R5bGU9 ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICZuYnNwOzxpbWcgc3JjPSJpbWcv YmFjay5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiIC8+IDxhIGhy ZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDEpO21vc3RyYShc J3Byb2Rfb2Y1XCcsMCk7QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDAsXCd0NVwn KSI+VG9kb3MgbG9zIHByb2R1Y3RvczwvYT4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJw cm9kX29mMjUiPiAgPGRpdiBjbGFzcz0idGl0b2xfcHJvZCI+T3J0b2ZvdG8gMiw1 IG0gdmlnZW50ZTwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEg aHJlZj0iamF2YXNjcmlwdDpuYXZlZ2FyaGkoNyxcJ29ydG9cJyk7Ij5OYXZlZ2Fy PC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imph dmFzY3JpcHQ6QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDEsXCd0MjVcJyk7Ij5E ZXNjYXJnYXI8L2E+Jm5ic3A7PHNwYW4gY2xhc3M9InRvb2x0aXBfZGVzYyI+KEVz Y29nZXIgdW5hIGhvamEpPC9zcGFuPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4m IzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6QXBwLmxheW91dC5zaG93V2luZG93 KFwnb2YyNW1cJyk7Ij5EaXNwb25pYmlsaWRhZDwvYT48L3A+ICAgIDxwIGNsYXNz PSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvZ2Vv c2VydmVpcyIgdGFyZ2V0PSJ3bXMiPldNUzwvYT48L3A+ICAgICA8ZGl2IGNsYXNz PSJlbnVuY2lhdCI+RXNwZWNpZmljYWNpb25lcyB0JmVhY3V0ZTtjbmljYXM8L2Rp dj4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93 d3cuaWNjLmNhdC9jYXQvY29udGVudC9kb3dubG9hZC8yMTM1MC82NzYyNi9maWxl L29mMjVtdjYxZXNwXzAxY2EucGRmIiB0YXJnZXQ9ImVzcGVjIj5Fc3BlY2lmaWNh Y2lvbmVzIHQmZWFjdXRlO2NuaXF1ZXM8L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJv cmRlcjoxcHggc29saWQgI2FhYTsiLz4gICA8cCBjbGFzcz0icGxpc3QiPiYjODIy NjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NvbmRpY2lvbnMiIHRhcmdl dD0iY29uZGljaW9ucyI+Q29uZGljaW9uZXMgZGUgdXNvPC9hPjwvcD4gICAgPGhy IHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAmbmJzcDs8aW1nIHNy Yz0iaW1nL2JhY2suZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIiAv PiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywxKTtt b3N0cmEoXCdwcm9kX29mMjVcJywwKTtBcHAubGF5b3V0LnNldFdNU1Zpc2libGUo MCxcJ3QyNVwnKSI+VG9kb3MgbG9zIHByb2R1Y3RvczwvYT4mbmJzcDs8L2Rpdj48 ZGl2IGlkPSJkZXNjYXJyZWdhIj4gIDxkaXYgY2xhc3M9ImVudW5jaWF0Ij5IYSBz ZWxlY2Npb25hZG8gcGFyYSBkZXNjYXJnYXI6PC9kaXY+ICA8ZGl2IGlkPSJ0aXRv bF9wcm9kdWN0ZSIgY2xhc3M9InRpdG9sX3Byb2QiPiA8L2Rpdj4JCTxkaXYgaWQ9 ImlkX3JlbCI+JiM4MjI2O0hvamE6PC9kaXY+ICAgICA8ZGl2IGlkPSJub21fZnVs bCI+JiM4MjI2O05vbWJyZTo8L2Rpdj48YnIgLz4gICAgIDxkaXYgaWQ9ImZvcm1h dHNkaXNwb25pYmxlcyIgY2xhc3M9ImVudW5jaWF0X3Byb2QiPkZvcm1hdG9zIGRp c3BvbmlibGVzOjwvZGl2PgkJPGRpdiBpZD0icmFkaW9fZG93bmxvYWRfdG9wbyI+ PC9kaXY+ICAgICA8ZGl2IGNsYXNzPSJlbnVuY2lhdF9wcm9kIj5TaXN0ZW1hIGRl IHJlZmVyZW5jaWE6PC9kaXY+CQk8ZGl2IGlkPSJyYWRpb19zaXNyZWYiPjwvZGl2 PgkJPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9ImZ1bGxEZXNjIiB2YWx1ZT0iIj4g IDxkaXYgY2xhc3M9InNlcFN1cGVyaW9yIj4mbmJzcDs8aW1nIHNyYz0iaW1nL2R3 bGRfaWNvbi5qcGciIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiIC8+Jm5i c3A7PGEgaWQ9Imxpbmtsb2tfdG9wbyIgaHJlZj0iamF2YXNjcmlwdDpnZXRSYWRp bygpOyI+RGVzY2FyZ2FyPC9hPjxici8+PC9kaXY+ICAgIDxociBzdHlsZT0iYm9y ZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2 OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGljaW9ucyIgdGFyZ2V0 PSJjb25kaWNpb25zIj5Db25kaWNpb25lcyBkZSB1c288L2E+PC9wPiAgICA8aHIg c3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICZuYnNwOzxpbWcgc3Jj PSJpbWcvYmFjay5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiIC8+ IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwnZGVzY2FycmVnYVwnLDApO21v c3RyYShcJ3Byb2RfaW5kZXhcJywxKTtBcHAubGF5b3V0LnNldFdNU1Zpc2libGUo MCxcJ1wnKTsiPlNlbGVjY2lvbmFyIG90cm8gcHJvZHVjdG88L2E+Jm5ic3A7PC9k aXY+PGRpdiBpZD0icHJvZF9tZXQiPiAgPGRpdiBjbGFzcz0iZW51bmNpYXQiPk1v ZGVsbyBkZSBlbGV2YWNpb25lczwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYj ODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpBcHAubGF5b3V0LnNldFdNU1Zpc2li bGUoMSxcJ3Q1MFwnKTsiPkRlc2NhcmdhcjwvYT4mbmJzcDs8c3BhbiBjbGFzcz0i dG9vbHRpcF9kZXNjIj4oRXNjb2dlciB1bmEgaG9qYSk8L3NwYW4+PC9wPiAgPGRp diBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+ RXNwZWNpZmljYWNpb25lcyB0JmVhY3V0ZTtjbmljYXM8L2Rpdj4gICAgPHAgY2xh c3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9j YXQvY29udGVudC9kb3dubG9hZC8xMjMzOS80MTQ0Ni9maWxlL21ldDE1djIwZXNw XzAyY2EucGRmIiB0YXJnZXQ9ImVzcGVjIj5Fc3BlY2lmaWNhY2lvbmVzIHQmZWFj dXRlO2NuaWNhczwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xp ZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJo dHRwOi8vd3d3LmljYy5jYXQvY29uZGljaW9ucyIgdGFyZ2V0PSJjb25kaWNpb25z Ij5Db25kaWNpb25lcyBkZSB1c288L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRl cjoxcHggc29saWQgI2FhYTsiLz4gICZuYnNwOzxpbWcgc3JjPSJpbWcvYmFjay5n aWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiIC8+IDxhIGhyZWY9Imph dmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDEpO21vc3RyYShcJ3Byb2Rf bWV0XCcsMCk7QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDAsXCd0NTBcJykiPlRv ZG9zIGxvcyBwcm9kdWN0b3M8L2E+Jm5ic3A7PC9kaXY+PGRpdiBpZD0icHJvZF9h bHRyZXMiPjwvZGl2PjxkaXYgaWQ9InByb2RfbXAyMCI+ICA8ZGl2IGNsYXNzPSJ0 aXRvbF9wcm9kIj5NYXBhIGRlbHMgcyZvZ3JhdmU7bHMgZGUgcGVuZGVudCAmZ3Q7 IDIwICYjMzc7PC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBo cmVmPSJqYXZhc2NyaXB0OkFwcC5sYXlvdXQuc2V0V01TVmlzaWJsZSgxLFwndDVc Jyk7Ij5EZXNjYXJnYXI8L2E+Jm5ic3A7PHNwYW4gY2xhc3M9InRvb2x0aXBfZGVz YyI+KEVzY29nZXIgdW5hIGhvamEpPC9zcGFuPjwvcD4gIDxkaXYgY2xhc3M9InNl cDE1Ij48L2Rpdj4gIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4gICAgPGRpdiBj bGFzcz0iZW51bmNpYXQiPkVzcGVjaWZpY2FjaW9uZXMgdCZlYWN1dGU7Y25pY2Fz PC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRw Oi8vd3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvMTE3MjAvNDAyNDUv ZmlsZS9tcDIwcHYxMGRnMF8wMWNhLnBkZiI+RXNwZWNpZmljYWNpb25lcyBkZSBE R048L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsi Lz4gICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3 dy5pY2MuY2F0L2NvbmRpY2lvbnMiIHRhcmdldD0iY29uZGljaW9ucyI+Q29uZGlj aW9uZXMgZGUgdXNvPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNv bGlkICNhYWE7Ii8+ICAmbmJzcDs8aW1nIHNyYz0iaW1nL2JhY2suZ2lmIiBzdHls ZT0idmVydGljYWwtYWxpZ246bWlkZGxlIiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0 Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywxKTttb3N0cmEoXCdwcm9kX21wMjBcJyww KTtBcHAubGF5b3V0LnNldFdNU1Zpc2libGUoMCxcJ3Q1XCcpIj5Ub2RvcyBsb3Mg cHJvZHVjdG9zPC9hPiZuYnNwOzwvZGl2PjxkaXYgaWQ9InByb2RfYm01MG0iPiAg PGRpdiBjbGFzcz0idGl0b2xfcHJvZCI+QmFzZSBtdW5pY2lwYWwgMTo1MC4wMDA8 L2Rpdj4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFz Y3JpcHQ6ZHdsUHJvZHVjdChcJ2JtNTBtc2hwXCcpOyI+RGVzY2FyZ2FyPC9hPiZu YnNwOzwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0 dHA6Ly93d3cuaWNjLmNhdC9nZW9zZXJ2ZWlzIiB0YXJnZXQ9IndtcyI+V01TPC9h PjwvcD4gICA8ZGl2IGNsYXNzPSJzZXAxNSI+PC9kaXY+ICA8ZGl2IGNsYXNzPSJz ZXAxNSI+PC9kaXY+ICAgIDxkaXYgY2xhc3M9ImVudW5jaWF0Ij5Fc3BlY2lmaWNh Y2lvbmVzIHQmZWFjdXRlO2NuaWNhczwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3Qi PiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9Ib21lLUlD Qy9NYXBlcy1mb3Rvcy1hZXJpZXMvU29icmUtbGEtY2FydG9ncmFmaWEtSUNDIiB0 YXJnZXQ9ImVzcHRlYyI+RXNwZWNpZmljYWNpb25lcyB0JmVhY3V0ZTtjbmljYXM8 L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4g ICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5p Y2MuY2F0L2NvbmRpY2lvbnMiIHRhcmdldD0iY29uZGljaW9ucyI+Q29uZGljaW9u ZXMgZGUgdXNvPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlk ICNhYWE7Ii8+ICAmbmJzcDs8aW1nIHNyYz0iaW1nL2JhY2suZ2lmIiBzdHlsZT0i dmVydGljYWwtYWxpZ246bWlkZGxlIiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om1v c3RyYShcJ3Byb2RfaW5kZXhcJywxKTttb3N0cmEoXCdwcm9kX2JtNTBtXCcsMCk7 Ij5Ub2RvcyBsb3MgcHJvZHVjdG9zPC9hPiZuYnNwOzwvZGl2PjxkaXYgaWQ9InBy b2RfYm0yNTBtIj4gIDxkaXYgY2xhc3M9InRpdG9sX3Byb2QiPkJhc2UgbXVuaWNp cGFsIDE6MjUwLjAwMDwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsg PGEgaHJlZj0iamF2YXNjcmlwdDpkd2xQcm9kdWN0KFwnYm0yNTBtc2hwXCcpOyI+ RGVzY2FyZ2FyPC9hPiZuYnNwOzwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgy MjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9nZW9zZXJ2ZWlzIiB0YXJn ZXQ9IndtcyI+V01TPC9hPjwvcD4gICA8ZGl2IGNsYXNzPSJzZXAxNSI+PC9kaXY+ ICA8ZGl2IGNsYXNzPSJzZXAxNSI+PC9kaXY+ICAgIDxkaXYgY2xhc3M9ImVudW5j aWF0Ij5Fc3BlY2lmaWNhY2lvbmVzIHQmZWFjdXRlO2NuaWNhczwvZGl2PiAgICA8 cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2Mu Y2F0L2NhdC9Ib21lLUlDQy9NYXBlcy1mb3Rvcy1hZXJpZXMvU29icmUtbGEtY2Fy dG9ncmFmaWEtSUNDIiB0YXJnZXQ9ImVzcHRlYyI+RXNwZWNpZmljYWNpb25lcyB0 JmVhY3V0ZTtjbmljYXM8L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHgg c29saWQgI2FhYTsiLz4gICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJl Zj0iaHR0cDovL3d3dy5pY2MuY2F0L2NvbmRpY2lvbnMiIHRhcmdldD0iY29uZGlj aW9ucyI+Q29uZGljaW9uZXMgZGUgdXNvPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJi b3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAmbmJzcDs8aW1nIHNyYz0iaW1nL2Jh Y2suZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIiAvPiA8YSBocmVm PSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywxKTttb3N0cmEoXCdw cm9kX2JtMjUwbVwnLDApOyI+VG9kb3MgbG9zIHByb2R1Y3RvczwvYT4mbmJzcDs8 L2Rpdj48ZGl2IGlkPSJwcm9kX2JtMTAwMG0iPiAgPGRpdiBjbGFzcz0idGl0b2xf cHJvZCI+QmFzZSBtdW5pY2lwYWwgMToxLjAwMC4wMDA8L2Rpdj4gICAgPHAgY2xh c3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6ZHdsUHJvZHVj dChcJ2JtMTAwMG1zaHBcJyk7Ij5EZXNjYXJnYXI8L2E+Jm5ic3A7PC9wPiAgICA8 cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2Mu Y2F0L2dlb3NlcnZlaXMiIHRhcmdldD0id21zIj5XTVM8L2E+PC9wPiAgIDxkaXYg Y2xhc3M9InNlcDE1Ij48L2Rpdj4gIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4g ICAgPGRpdiBjbGFzcz0iZW51bmNpYXQiPkVzcGVjaWZpY2FjaW9uZXMgdCZlYWN1 dGU7Y25pY2FzPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBo cmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L0hvbWUtSUNDL01hcGVzLWZvdG9z LWFlcmllcy9Tb2JyZS1sYS1jYXJ0b2dyYWZpYS1JQ0MiIHRhcmdldD0iZXNwdGVj Ij5Fc3BlY2lmaWNhY2lvbmVzIHQmZWFjdXRlO2NuaWNhczwvYT48L3A+ICAgIDxo ciBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJw bGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGlj aW9ucyIgdGFyZ2V0PSJjb25kaWNpb25zIj5Db25kaWNpb25lcyBkZSB1c288L2E+ PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICZu YnNwOzxpbWcgc3JjPSJpbWcvYmFjay5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGln bjptaWRkbGUiIC8+IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9p bmRleFwnLDEpO21vc3RyYShcJ3Byb2RfYm0xMDAwbVwnLDApOyI+VG9kb3MgbG9z IHByb2R1Y3RvczwvYT4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJwcm9kX3RhbGxzIj4g IDxkaXYgY2xhc3M9InRpdG9sX3Byb2QiPlRhbGxzPC9kaXY+ICAgIDxwIGNsYXNz PSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0OmR3bFByb2R1Y3Qo XCd0YWxsc1wnKTsiPkRlc2NhcmdhcjwvYT4mbmJzcDs8L3A+ICAgIDxwIGNsYXNz PSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvZ2Vv c2VydmVpcyIgdGFyZ2V0PSJ3bXMiPldNUzwvYT48L3A+ICAgPGRpdiBjbGFzcz0i c2VwMTUiPjwvZGl2PiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2Fh YTsiLz4gICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDov L3d3dy5pY2MuY2F0L2NvbmRpY2lvbnMiIHRhcmdldD0iY29uZGljaW9ucyI+Q29u ZGljaW9uZXMgZGUgdXNvPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4 IHNvbGlkICNhYWE7Ii8+ICAmbmJzcDs8aW1nIHNyYz0iaW1nL2JhY2suZ2lmIiBz dHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIiAvPiA8YSBocmVmPSJqYXZhc2Ny aXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywxKTttb3N0cmEoXCdwcm9kX3RhbGxz XCcsMCk7QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDAsXCd0NVwnKSI+VG9kb3Mg bG9zIHByb2R1Y3RvczwvYT4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJwcm9kX3BvbGlu ZCI+ICA8ZGl2IGNsYXNzPSJ0aXRvbF9wcm9kIj5CYXNlIGdlb2VzcGFjaWFsIGRl bHMgcG9sJmlhY3V0ZTtnb25zIGluZHVzdHJpYWxzPC9kaXY+ICAgIDxwIGNsYXNz PSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0OmR3bFByb2R1Y3Qo XCdiZGdwb2xpbmRcJyk7Ij5EZXNjYXJnYXI8L2E+Jm5ic3A7PC9wPiAgICA8cCBj bGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0 L2dlb3NlcnZlaXMiIHRhcmdldD0id21zIj5XTVM8L2E+PC9wPiAgIDxkaXYgY2xh c3M9InNlcDE1Ij48L2Rpdj4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlk ICNhYWE7Ii8+ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0 dHA6Ly93d3cuaWNjLmNhdC9jb25kaWNpb25zIiB0YXJnZXQ9ImNvbmRpY2lvbnMi PkNvbmRpY2lvbmVzIGRlIHVzbzwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVy OjFweCBzb2xpZCAjYWFhOyIvPiAgJm5ic3A7PGltZyBzcmM9ImltZy9iYWNrLmdp ZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIgLz4gPGEgaHJlZj0iamF2 YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMSk7bW9zdHJhKFwncHJvZF9w b2xpbmRcJywwKTtBcHAubGF5b3V0LnNldFdNU1Zpc2libGUoMCxcJ3Q1XCcpIj5U b2RvcyBsb3MgcHJvZHVjdG9zPC9hPiZuYnNwOzwvZGl2PjxkaXYgaWQ9InByb2Rf cDEwMDAiPiAgPGRpdiBjbGFzcz0idGl0b2xfcHJvZCI+Q2FydG9ncmFmaWEgdG9w b2dyJmFncmF2ZTtmaWNhIDE6MTAwMDwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3Qi PiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpuYXZlZ2FyaGkoMTAsXCd0b3Bv XCcpOyI+TmF2ZWdhcjwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2 OyA8YSBocmVmPSJqYXZhc2NyaXB0OkFwcC5sYXlvdXQuc2V0V01TVmlzaWJsZSgx LFwncDEwMDBcJyk7Ij5EZXNjYXJyZWdhcjwvYT4mbmJzcDs8c3BhbiBjbGFzcz0i dG9vbHRpcF9kZXNjIj4oRXNjb2dlciB1biBwcm95ZWN0byk8L3NwYW4+PC9wPiAg ICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpB cHAubGF5b3V0LnNob3dXaW5kb3coXCdjdDFtXCcpOyI+RGlzcG9uaWJpbGlkYWQ8 L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0 cDovL3d3dy5pY2MuY2F0L2dlb3NlcnZlaXMiIHRhcmdldD0id21zIj5XTVM8L2E+ PC9wPiAgIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4gICAgPGRpdiBjbGFzcz0i ZW51bmNpYXQiPkFyY2hpdm9zIGNvbXBsZW1lbnRhcmlvczwvZGl2PiAgICA8cCBj bGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0 L2NhdC9Ib21lLUlDQy9NYXBlcy1mb3Rvcy1hZXJpZXMvU29icmUtbGEtY2FydG9n cmFmaWEtSUNDIiB0YXJnZXQ9ImFyeGNvbSI+UGFyYSBEWEY8L2E+PC9wPiAgICA8 cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2Mu Y2F0L2NhdC9Ib21lLUlDQy9NYXBlcy1mb3Rvcy1hZXJpZXMvU29icmUtbGEtY2Fy dG9ncmFmaWEtSUNDIiB0YXJnZXQ9ImFyeGNvbSI+UGFyYSBER048L2E+PC9wPiAg ICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5p Y2MuY2F0L2NhdC9Ib21lLUlDQy9NYXBlcy1mb3Rvcy1hZXJpZXMvU29icmUtbGEt Y2FydG9ncmFmaWEtSUNDIiB0YXJnZXQ9ImFyeGNvbSI+UGFyYSBTSFA8L2E+PC9w PiAgPGRpdiBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVu Y2lhdCI+RXNwZWNpZmljYWNpb25lcyB0JmVhY3V0ZTtjbmljYXM8L2Rpdj4gICAg PHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNj LmNhdC9jYXQvSG9tZS1JQ0MvTWFwZXMtZm90b3MtYWVyaWVzL1NvYnJlLWxhLWNh cnRvZ3JhZmlhLUlDQyIgdGFyZ2V0PSJlc3B0ZWMiPkVzcGVjaWZpY2FjaW9uZXMg dCZlYWN1dGU7Y25pY2FzPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgy MjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvSG9tZS1JQ0MvTWFw ZXMtZm90b3MtYWVyaWVzL1NvYnJlLWxhLWNhcnRvZ3JhZmlhLUlDQyIgdGFyZ2V0 PSJkaWMiPkRpY2Npb25hcmlvIGRlIGRhdG9zPC9hPjwvcD4gICAgPHAgY2xhc3M9 InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQv SG9tZS1JQ0MvTWFwZXMtZm90b3MtYWVyaWVzL1NvYnJlLWxhLWNhcnRvZ3JhZmlh LUlDQyIgdGFyZ2V0PSJlc3B0ZWMiPkVzcGVjaWZpY2FjaW9uZXMgZGUgRFhGPC9h PjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6 Ly93d3cuaWNjLmNhdC9jYXQvSG9tZS1JQ0MvTWFwZXMtZm90b3MtYWVyaWVzL1Nv YnJlLWxhLWNhcnRvZ3JhZmlhLUlDQyIgdGFyZ2V0PSJlc3B0ZWMiPkVzcGVjaWZp Y2FjaW9uZXMgZGUgREdOPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgy MjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvSG9tZS1JQ0MvTWFw ZXMtZm90b3MtYWVyaWVzL1NvYnJlLWxhLWNhcnRvZ3JhZmlhLUlDQyIgdGFyZ2V0 PSJlc3B0ZWMiPkVzcGVjaWZpY2FjaW9uZXMgZGUgU0hQPC9hPjwvcD4gICAgPGhy IHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAgPHAgY2xhc3M9InBs aXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jb25kaWNp b25zIiB0YXJnZXQ9ImNvbmRpY2lvbnMiPkNvbmRpY2lvbmVzIGRlIHVzbzwvYT48 L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgJm5i c3A7PGltZyBzcmM9ImltZy9iYWNrLmdpZiIvPiA8YSBocmVmPSJqYXZhc2NyaXB0 Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywxKTttb3N0cmEoXCdwcm9kX3AxMDAwXCcs MCk7QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDAsXCdwMTAwMFwnKSI+VG9kb3Mg bG9zIHByb2R1Y3RvczwvYT4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJwcm9kX2NsaWNr Ij48L2Rpdj4nO2JyZWFrO2Nhc2UiZW5nIjp2YXIgYT0nPGRpdiBpZD0icHJvZF9p bmRleCI+ICAgIDxkaXYgY2xhc3M9ImVudW5jaWF0Ij48c3BhbiBzdHlsZT0iZm9u dC13ZWlnaHQ6Ym9sZCI+UHJvZHVjdHM8L3NwYW4+PC9kaXY+ICAgIDxociBzdHls ZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgPGRpdiBjbGFzcz0idGl0b2xf cHJvZCI+TG93IHJlc29sdXRpb246PC9kaXY+ICAgIDxmb3JtIG5hbWU9ImZvcm1z bmFwIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iL3NlcnZlaXNHdWlhQ2FycmVycy9t YXBTbmFwc2hvdCIgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj48aW5wdXQgdHlwZT0i aGlkZGVuIiBuYW1lPSJwb3N0Qm9keSIgLz48cCBjbGFzcz0icGxpc3QiPiYjODIy NjsgPGEgaHJlZj0iamF2YXNjcmlwdDpnZXRTbmFwc2hvdChcJ2Zvcm1zbmFwXCcp O2phdmFzY3JpcHQ6X2dhcS5wdXNoKFtcJ190cmFja0V2ZW50XCcsIFwndmlzc2ly XCcsIFwnc25hcHNob3RcJ10pOyI+Q3VycmVudCB2aWV3PC9hPiA8c3BhbiBzdHls ZT0iZm9udC1zaXplOjEwcHgiPihKUEcgRm9ybWF0IFNpcy4gUmVmLiBFRDUwKTwv c3Bhbj48L3A+PC9mb3JtPiAgPGRpdiBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgPGRp diBjbGFzcz0idGl0b2xfcHJvZCI+SGlnaCByZXNvbHV0aW9uOjwvZGl2PiAgPGRp diBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgPGRpdiBjbGFzcz0iZW51bmNpYXQiPlRv cG9ncmFwaGljPC9kaXY+ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhy ZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDApO21vc3RyYShc J3Byb2RfcDEwMDBcJywxKTsiPlRvcG9ncmFwaGljIGNhcnRvZ3JhcGh5IDE6MS4w MDA8L2E+PC9wPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJq YXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEoXCdwcm9k X2J0NW1cJywxKTsiPlRvcG9ncmFwaGljIGJhc2UgMTo1LjAwMDwvYT48L2xpPiAg IDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om1v c3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX210MTBtXCcsMSk7 Ij5Ub3BvZ3JhcGhpYyBtYXAgMToxMC4wMDA8L2E+PC9wPiAgIDxwIGNsYXNzPSJw bGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2Rf aW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX2J0MjVtXCcsMSk7Ij5Ub3BvZ3JhcGhp YyBiYXNlIDE6MjUuMDAwPC9hPjwvcD4gICA8cCBjbGFzcz0icGxpc3QiPiYjODIy NjsgPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMCk7 bW9zdHJhKFwncHJvZF9idDUwbVwnLDEpOyI+VG9wb2dyYXBoaWMgYmFzZSAxOjUw LjAwMDwvYT48L3A+ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9 ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDApO21vc3RyYShcJ3By b2RfY29tNTBtXCcsMSk7Ij5NYXBhIGNvbWFyY2FsIChUb3BvZ3JhcGhpYykgMTo1 MC4wMDA8L2E+PC9wPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVm PSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEoXCdw cm9kX210YzI1MG1cJywxKTsiPlRvcG9ncmFwaGljIG1hcCAxOjI1MC4wMDA8L2E+ PC9wPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2Ny aXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX210YzUw MG1cJywxKTsiPlRvcG9ncmFwaGljIG1hcCAxOjUwMC4wMDA8L2E+PC9wPiAgIDxw IGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3Ry YShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX210YzEwMDBtXCcsMSk7 Ij5Ub3BvZ3JhcGhpYyBtYXAgMToxLjAwMC4wMDA8L2E+PC9wPiAgPGRpdiBjbGFz cz0ic2VwMTUiPjwvZGl2PiAgPGRpdiBjbGFzcz0iZW51bmNpYXQiPk9ydG9waG90 b3M8L2Rpdj4gICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2 YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMCk7bW9zdHJhKFwncHJvZF9v ZjJcJywxKTsiPk9ydG9waG90byAyNSBjbSBjdXJyZW50PC9hPjwvbGk+ICAgPHAg Y2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJh KFwncHJvZF9pbmRleFwnLDApO21vc3RyYShcJ3Byb2Rfb2Y1XCcsMSk7Ij5PcnRv cGhvdG8gNTAgY20gY3VycmVudDwvYT48L3A+ICAgPHAgY2xhc3M9InBsaXN0Ij4m IzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwn LDApO21vc3RyYShcJ3Byb2Rfb2YyNVwnLDEpOyI+T3J0b3Bob3RvIDIuNSBtIGN1 cnJlbnQ8L2E+PC9wPiAgPGRpdiBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgPGRpdiBj bGFzcz0iZW51bmNpYXQiPkRFTTwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYj ODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcs MCk7bW9zdHJhKFwncHJvZF9tZXRcJywxKTsiPkRFTSAxNXgxNTwvYT48L3A+ICA8 ZGl2IGNsYXNzPSJzZXAxNSI+PC9kaXY+ICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+ T3RoZXJzPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVm PSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEoXCdw cm9kX21wMjBcJywxKTsiPk1hcGEgZGVscyBzJm9ncmF2ZTtscyBkZSBwZW5kZW50 ID4gMjAgJTwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBo cmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEo XCdwcm9kX2JtNTBtXCcsMSk7Ij5CYXNlIG11bmljaXBhbCAxOjUwLjAwMDwvYT48 L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2Ny aXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywwKTttb3N0cmEoXCdwcm9kX3RhbGxz XCcsMSk7Ij5UYWxsczwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2 OyA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywwKTtt b3N0cmEoXCdwcm9kX3BvbGluZFwnLDEpOyI+QmFzZSBnZW9lc3BhY2lhbCBkZWxz IHBvbCZpYWN1dGU7Z29ucyBpbmR1c3RyaWFsczwvYT48L3A+ICA8ZGl2IGNsYXNz PSJzZXAxNSI+PC9kaXY+ICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+QXRsZXM8L2Rp dj4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93 d3cuYXRsZXNuYWNpb25hbC5jYXQvaWNjL2F0bGVzLW5hY2lvbmFsLyIgdGFyZ2V0 PSJhdGxlc25hY2lvbmFsIj5BdGxlcyBOYWNpb25hbCBkZSBDYXRhbHVueWE8L2E+ PC9wPiAgPGRpdiBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgPGRpdiBjbGFzcz0iZW51 bmNpYXQiPkFuY2llbnQgbWFwczwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYj ODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpvcGVuQ0RNKCkiPkFuY2llbnQgbWFw czwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIv PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3 dy5pY2MuY2F0L2NvbmRpY2lvbnMiIHRhcmdldD0iY29uZGljaW9ucyI+VXNlIGNv bmRpdGlvbnM8L2E+PC9wPjwvZGl2PjxkaXYgaWQ9InByb2RfbWFwZXMiPjwvZGl2 PjxkaXYgaWQ9InByb2RfYnQ1bSI+ICA8ZGl2IGNsYXNzPSJ0aXRvbF9wcm9kIj5U b3BvZ3JhcGhpYyBiYXNlIDE6NS4wMDA8L2Rpdj4gICAgPHAgY2xhc3M9InBsaXN0 Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6bmF2ZWdhcmhpKDksXCd0b3Bv XCcpOyI+TmF2aWdhdGU8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIy NjsgPGEgaHJlZj0iamF2YXNjcmlwdDpBcHAubGF5b3V0LnNldFdNU1Zpc2libGUo MSxcJ3Q1XCcpOyI+RG93bmxvYWQ8L2E+Jm5ic3A7PHNwYW4gY2xhc3M9InRvb2x0 aXBfZGVzYyI+KENob29zZSBhIHNoZWV0KTwvc3Bhbj48L3A+ICAgIDxwIGNsYXNz PSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJsbGVnZW5kZXMvbXRjNW0ucGRmIiB0 YXJnZXQ9ImxsZWdlbmRhIj5MZWdlbmQ8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxp c3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpBcHAubGF5b3V0LnNob3dX aW5kb3coXCdidDVtXCcpOyI+QXZhaWxhYmlsaXR5PC9hPjwvcD4gICAgPHAgY2xh c3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9n ZW9zZXJ2ZWlzIiB0YXJnZXQ9IndtcyI+V01TPC9hPjwvcD4gICA8ZGl2IGNsYXNz PSJzZXAxNSI+PC9kaXY+ICAgIDxkaXYgY2xhc3M9ImVudW5jaWF0Ij5BZGRpdGlv bmFsIGZpbGVzPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBo cmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvMTgx OS83MTIyL2ZpbGUvYnQ1bXYyMGR4MV8wMWNhLnppcCI+VG8gRFhGPC9hPjwvcD4g ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cu aWNjLmNhdC9jYXQvY29udGVudC9kb3dubG9hZC8xODIwLzcxMjYvZmlsZS9idDVt djIwZGcxXzAxY2EuemlwIj5UbyBER048L2E+PC9wPiAgICA8cCBjbGFzcz0icGxp c3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9jb250 ZW50L2Rvd25sb2FkLzE4MjEvNzEzMC9maWxlL2J0NW12MjBzaDBfMDFjYS56aXAi PlRvIFNIUDwvYT48L3A+ICA8ZGl2IGNsYXNzPSJzZXAxNSI+PC9kaXY+ICAgIDxk aXYgY2xhc3M9ImVudW5jaWF0Ij5UZWNobmljYWwgc3BlY2lmaWNhdGlvbnM8L2Rp dj4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93 d3cuaWNjLmNhdC9jYXQvY29udGVudC9kb3dubG9hZC83MTgvMjc5OC9maWxlL2J0 NW12MjBlc3BfMDRjYS5wZGYiIHRhcmdldD0iZXNwZWMiPlRlY2huaWNhbCBzcGVj aWZpY2F0aW9uczwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8 YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQv NzE5LzI4MDIvZmlsZS9idDVtdjIwZGljXzA0Y2EucGRmIiB0YXJnZXQ9ImRpYyI+ RGljdGlvbmFyeTwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8 YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQv OTk4OS8zMjU4OC9maWxlL2J0NW12MjBkeDFfMDFjYS5wZGYiIHRhcmdldD0iZXNw ZWNkeGYiPkRYRiBzcGVjaWZpY2F0aW9uPC9hPjwvcD4gICAgPHAgY2xhc3M9InBs aXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvY29u dGVudC9kb3dubG9hZC85OTg1LzMyNTY4L2ZpbGUvYnQ1bXYyMGRnMV8wMWNhLnBk ZiIgdGFyZ2V0PSJlc3BlY2RnbiI+REdOIHNwZWNpZmljYXRpb248L2E+PC9wPiAg ICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5p Y2MuY2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzk5OTEvMzI1OTgvZmlsZS9idDVt djIwc2gwXzAxY2EucGRmIiB0YXJnZXQ9ImVzcGVjc2hwIj5TSFAgc3BlY2lmaWNh dGlvbjwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFh OyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8v d3d3LmljYy5jYXQvY29uZGljaW9ucyIgdGFyZ2V0PSJjb25kaWNpb25zIj5Vc2Ug Y29uZGl0aW9uczwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xp ZCAjYWFhOyIvPiAgJm5ic3A7PGltZyBzcmM9ImltZy9iYWNrLmdpZiIgc3R5bGU9 InZlcnRpY2FsLWFsaWduOm1pZGRsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpt b3N0cmEoXCdwcm9kX2luZGV4XCcsMSk7bW9zdHJhKFwncHJvZF9idDVtXCcsMCk7 QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDAsXCd0NVwnKSI+QWxsIHByb2R1Y3Rz PC9hPiZuYnNwOzwvZGl2PjxkaXYgaWQ9InByb2RfbXQxMG0iPiAgPGRpdiBjbGFz cz0idGl0b2xfcHJvZCI+VG9wb2dyYXBoaWMgbWFwIDE6MTAuMDAwPC9kaXY+ICAg IDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om5h dmVnYXJoaSg4LFwndG9wb1wnKTsiPk5hdmlnYXRlPC9hPjwvcD4gICAgPHAgY2xh c3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6QXBwLmxheW91 dC5zZXRXTVNWaXNpYmxlKDEsXCd0MTBcJyk7Ij5Eb3dubG9hZDwvYT4mbmJzcDs8 c3BhbiBjbGFzcz0idG9vbHRpcF9kZXNjIj4oQ2hvb3NlIGEgc2hlZXQpPC9zcGFu PjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImxsZWdl bmRlcy9tdGMxMG0ucGRmIiB0YXJnZXQ9ImxsZWdlbmRhIj5MZWdlbmQ8L2E+PC9w PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlw dDpBcHAubGF5b3V0LnNob3dXaW5kb3coXCdtdGMxMG1cJyk7Ij5BdmFpbGFiaWxp dHk8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0i aHR0cDovL3d3dy5pY2MuY2F0L2dlb3NlcnZlaXMiIHRhcmdldD0id21zIj5XTVM8 L2E+PC9wPiAgIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4gICAgPGRpdiBjbGFz cz0iZW51bmNpYXQiPlRlY2huaWNhbCBzcGVjaWZpY2F0aW9uczwvZGl2PiAgICA8 cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2Mu Y2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzQ2NzIxLzMyNjY0Ny9maWxlL210MTBt djExZXNwXzAxY2EucGRmIiB0YXJnZXQ9ImVzcGVjIj5UZWNobmljYWwgc3BlY2lm aWNhdGlvbnM8L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQg I2FhYTsiLz4gICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0 cDovL3d3dy5pY2MuY2F0L2NvbmRpY2lvbnMiIHRhcmdldD0iY29uZGljaW9ucyI+ VXNlIGNvbmRpdGlvbnM8L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHgg c29saWQgI2FhYTsiLz4gICZuYnNwOzxpbWcgc3JjPSJpbWcvYmFjay5naWYiIHN0 eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiIC8+IDxhIGhyZWY9ImphdmFzY3Jp cHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDEpO21vc3RyYShcJ3Byb2RfbXQxMG1c JywwKTtBcHAubGF5b3V0LnNldFdNU1Zpc2libGUoMCxcJ3QxMFwnKSI+QWxsIHBy b2R1Y3RzPC9hPiZuYnNwOzwvZGl2PjxkaXYgaWQ9InByb2RfYnQyNW0iPiAgPGRp diBjbGFzcz0idGl0b2xfcHJvZCI+VG9wb2dyYXBoaWMgYmFzZSAxOjI1LjAwMDwv ZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNj cmlwdDpuYXZlZ2FyaGkoNyxcJ3RvcG9cJyk7Ij5OYXZpZ2F0ZTwvYT48L3A+ICAg IDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0OkFw cC5sYXlvdXQuc2V0V01TVmlzaWJsZSgxLFwndDI1XCcpOyI+RG93bmxvYWQ8L2E+ Jm5ic3A7PHNwYW4gY2xhc3M9InRvb2x0aXBfZGVzYyI+KENob29zZSBhIHNoZWV0 KTwvc3Bhbj48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVm PSJsbGVnZW5kZXMvbXRjMjVtLnBkZiIgdGFyZ2V0PSJsbGVnZW5kYSI+TGVnZW5k PC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imph dmFzY3JpcHQ6QXBwLmxheW91dC5zaG93V2luZG93KFwnYnQyNW1cJyk7Ij5BdmFp bGFiaWxpdHk8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEg aHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2dlb3NlcnZlaXMiIHRhcmdldD0id21z Ij5XTVM8L2E+PC9wPiAgIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4gICAgPGRp diBjbGFzcz0iZW51bmNpYXQiPkFkZGl0aW9uYWwgZmlsZXM8L2Rpdj4gICAgPHAg Y2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNh dC9jYXQvY29udGVudC9kb3dubG9hZC8xMzUyNC80NDA4OS9maWxlL2J0MjVtdjEw ZHgwXzAyY2EuemlwIj5UbyBEWEY8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3Qi PiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9jb250ZW50 L2Rvd25sb2FkLzE4MjMvNzEzOC9maWxlL2J0MjVtdjEwZGcxXzAyY2EuemlwIj5U byBER048L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJl Zj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzEzNTI2 LzQ0MTA2L2ZpbGUvYnQyNW12MTBzaDBfMDJjYS56aXAiPlRvIFNIUDwvYT48L3A+ ICA8ZGl2IGNsYXNzPSJzZXAxNSI+PC9kaXY+ICAgIDxkaXYgY2xhc3M9ImVudW5j aWF0Ij5UZWNobmljYWwgc3BlY2lmaWNhdGlvbnM8L2Rpdj4gICAgPHAgY2xhc3M9 InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQv Y29udGVudC9kb3dubG9hZC85NzAwLzMwNjUyL2ZpbGUvYnQyNW12MTBlc3BfMDJj YS5wZGYiIHRhcmdldD0iZXNwZWMiPlRlY2huaWNhbCBzcGVjaWZpY2F0aW9uczwv YT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRw Oi8vd3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvOTcwMS8zMDY1Ny9m aWxlL2J0MjVtdjEwZGljXzAyY2EucGRmIiB0YXJnZXQ9ImRpYyI+RGljdGlvbmFy eTwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJo dHRwOi8vd3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvMTM1MTkvNDQw NjQvZmlsZS9idDI1bXYxMGR4MF8wMmNhLnBkZiIgdGFyZ2V0PSJlc3BlY2R4ZiI+ RFhGIHNwZWNpZmljYXRpb25zPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4m IzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvY29udGVudC9k b3dubG9hZC85OTg2LzMyNTczL2ZpbGUvYnQyNW12MTBkZzFfMDJjYS5wZGYiIHRh cmdldD0iZXNwZWNkZ24iPkRHTiBzcGVjaWZpY2F0aW9uczwvYT48L3A+ICAgIDxw IGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5j YXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvOTk4Ni8zMjU3My9maWxlL2J0MjVtdjEw ZGcxXzAyY2EucGRmIiB0YXJnZXQ9ImVzcGVjc2hwIj5TSFAgc3BlY2lmaWNhdGlv bnM8L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsi Lz4gICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3 dy5pY2MuY2F0L2NvbmRpY2lvbnMiIHRhcmdldD0iY29uZGljaW9ucyI+VXNlIGNv bmRpdGlvbnM8L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQg I2FhYTsiLz4gICZuYnNwOzxpbWcgc3JjPSJpbWcvYmFjay5naWYiIHN0eWxlPSJ2 ZXJ0aWNhbC1hbGlnbjptaWRkbGUiIC8+IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9z dHJhKFwncHJvZF9pbmRleFwnLDEpO21vc3RyYShcJ3Byb2RfYnQyNW1cJywwKTtB cHAubGF5b3V0LnNldFdNU1Zpc2libGUoMCxcJ3QyNVwnKSI+QWxsIHByb2R1Y3Rz PC9hPiZuYnNwOzwvZGl2PjxkaXYgaWQ9InByb2RfYnQ1MG0iPiAgPGRpdiBjbGFz cz0idGl0b2xfcHJvZCI+VG9wb2dyYXBoaWMgYmFzZSAxOjUwLjAwMDwvZGl2PiAg ICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpu YXZlZ2FyaGkoNixcJ3RvcG9cJyk7Ij5OYXZpZ2F0ZTwvYT48L3A+ICAgIDxwIGNs YXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0OkFwcC5sYXlv dXQuc2V0V01TVmlzaWJsZSgxLFwndDUwXCcpOyI+RG93bmxvYWQ8L2E+Jm5ic3A7 PHNwYW4gY2xhc3M9InRvb2x0aXBfZGVzYyI+KENob29zZSBhIHNoZWV0KTwvc3Bh bj48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRw Oi8vd3d3LmljYy5jYXQvZ2Vvc2VydmVpcyIgdGFyZ2V0PSJ3bXMiPldNUzwvYT48 L3A+ICAgPGRpdiBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJl bnVuY2lhdCI+QWRkaXRpb25hbCBmaWxlczwvZGl2PiAgICA8cCBjbGFzcz0icGxp c3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9jb250 ZW50L2Rvd25sb2FkLzE4MjQvNzE0Mi9maWxlL2J0NTBtdjMxZHgxXzAxY2Euemlw Ij5UbyBEWEY8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEg aHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzE4 MjUvNzE0Ni9maWxlL2J0NTBtdjMxZGcxXzAxY2EuemlwIj5UbyBER048L2E+PC9w PiAgPGRpdiBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVu Y2lhdCI+VGVjaG5pY2FsIHNwZWNpZmljYXRpb25zPC9kaXY+ICAgIDxwIGNsYXNz PSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY2F0 L2NvbnRlbnQvZG93bmxvYWQvNzIwLzI4MDYvZmlsZS9idDUwbXYzMWVzcF8wMmNh LnBkZiIgdGFyZ2V0PSJlc3BlYyI+VGVjaG5pY2FsIHNwZWNpZmljYXRpb25zPC9h PjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6 Ly93d3cuaWNjLmNhdC9jYXQvY29udGVudC9kb3dubG9hZC83MjEvMjgxMC9maWxl L2J0NTBtdjMxZGljXzAxY2EucGRmIiB0YXJnZXQ9ImRpYyI+RGljdGlvbmFyeTwv YT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRw Oi8vd3d3LmljYy5jYXQvY2F0L2NvbnRlbnQvZG93bmxvYWQvOTk5My8zMjYwOC9m aWxlL2J0NTBtdjMxZHgxXzAxY2EucGRmIiB0YXJnZXQ9ImVzcGVjZHhmIj5EWEYg c3BlY2lmaWNhdGlvbnM8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIy NjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9jb250ZW50L2Rvd25s b2FkLzk5ODcvMzI1NzgvZmlsZS9idDUwbXYzMWRnMV8wMWNhLnBkZiIgdGFyZ2V0 PSJlc3BlY2RnbiI+REdOIHNwZWNpZmljYXRpb25zPC9hPjwvcD4gICAgPGhyIHN0 eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAgPHAgY2xhc3M9InBsaXN0 Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jb25kaWNpb25z IiB0YXJnZXQ9ImNvbmRpY2lvbnMiPlVzZSBjb25kaXRpb25zPC9hPjwvcD4gICAg PGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAmbmJzcDs8aW1n IHNyYz0iaW1nL2JhY2suZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxl IiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywx KTttb3N0cmEoXCdwcm9kX2J0NTBtXCcsMCk7QXBwLmxheW91dC5zZXRXTVNWaXNp YmxlKDAsXCd0NTBcJykiPkFsbCBwcm9kdWN0czwvYT4mbmJzcDs8L2Rpdj48ZGl2 IGlkPSJwcm9kX2NvbTUwbSI+ICA8ZGl2IGNsYXNzPSJ0aXRvbF9wcm9kIj5NYXBh IGNvbWFyY2FsIChUb3BvZ3JhcGhpYykgMTo1MC4wMDA8L2Rpdj4gICAgPHAgY2xh c3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6bmF2ZWdhcmhp KDYsXCd0b3BvXCcpOyI+TmF2aWdhdGU8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxp c3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpBcHAubGF5b3V0LnNldFdN U1Zpc2libGUoMSxcJ2NvbWFyY2FsXCcpOyI+RG93bmxvYWQ8L2E+Jm5ic3A7PHNw YW4gY2xhc3M9InRvb2x0aXBfZGVzYyI+KENob29zZSBhIHNoZWV0KTwvc3Bhbj48 L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJsbGVnZW5k ZXMvbXRjNTBtLnBkZiIgdGFyZ2V0PSJsbGVnZW5kYSI+TGVnZW5kPC9hPjwvcD4g ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cu aWNjLmNhdC9nZW9zZXJ2ZWlzIiB0YXJnZXQ9IndtcyI+V01TPC9hPjwvcD4gICAg IDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNz PSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29u ZGljaW9ucyIgdGFyZ2V0PSJjb25kaWNpb25zIj5Vc2UgY29uZGl0aW9uczwvYT48 L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgJm5i c3A7PGltZyBzcmM9ImltZy9iYWNrLmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWdu Om1pZGRsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2lu ZGV4XCcsMSk7bW9zdHJhKFwncHJvZF9jb201MG1cJywwKTtBcHAubGF5b3V0LnNl dFdNU1Zpc2libGUoMCxcJ2NvbWFyY2FsXCcpIj5BbGwgcHJvZHVjdHM8L2E+Jm5i c3A7PC9kaXY+PGRpdiBpZD0icHJvZF9tdGMyNTBtIj4gIDxkaXYgY2xhc3M9InRp dG9sX3Byb2QiPlRvcG9ncmFwaGljIG1hcCAxOjI1MC4wMDA8L2Rpdj4gICAgPHAg Y2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6bmF2ZWdh cmhpKDQsXCd0b3BvXCcpOyI+TmF2aWdhdGU8L2E+PC9wPiAgICA8cCBjbGFzcz0i cGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpkd2xQcm9kdWN0KFwn bXRjMjUwbVwnKSI+RG93bmxvYWQ8L2E+Jm5ic3A7PHNwYW4gY2xhc3M9InRvb2x0 aXBfZGVzYyI+PC9zcGFuPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7 IDxhIGhyZWY9ImxsZWdlbmRlcy9tdGMyNTBtLnBkZiIgdGFyZ2V0PSJsbGVnZW5k YSI+TGVnZW5kPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxh IGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9nZW9zZXJ2ZWlzIiB0YXJnZXQ9Indt cyI+V01TPC9hPjwvcD4gICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAj YWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRw Oi8vd3d3LmljYy5jYXQvY29uZGljaW9ucyIgdGFyZ2V0PSJjb25kaWNpb25zIj5V c2UgY29uZGl0aW9uczwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBz b2xpZCAjYWFhOyIvPiAgJm5ic3A7PGltZyBzcmM9ImltZy9iYWNrLmdpZiIgc3R5 bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlw dDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMSk7bW9zdHJhKFwncHJvZF9tdGMyNTBt XCcsMCk7Ij5BbGwgcHJvZHVjdHM8L2E+Jm5ic3A7PC9kaXY+PGRpdiBpZD0icHJv ZF9tdGM1MDBtIj4gIDxkaXYgY2xhc3M9InRpdG9sX3Byb2QiPlRvcG9ncmFwaGlj IG1hcCAxOjUwMC4wMDA8L2Rpdj4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7 IDxhIGhyZWY9ImphdmFzY3JpcHQ6bmF2ZWdhcmhpKDMsXCd0b3BvXCcpOyI+TmF2 aWdhdGU8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJl Zj0iamF2YXNjcmlwdDpkd2xQcm9kdWN0KFwnbXRjNTAwbVwnKSI+RG93bmxvYWQ8 L2E+Jm5ic3A7PHNwYW4gY2xhc3M9InRvb2x0aXBfZGVzYyI+PC9zcGFuPjwvcD4g ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImxsZWdlbmRlcy9t dGM1MDBtLnBkZiIgdGFyZ2V0PSJsbGVnZW5kYSI+TGVnZW5kPC9hPjwvcD4gICAg PHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNj LmNhdC9nZW9zZXJ2ZWlzIiB0YXJnZXQ9IndtcyI+V01TPC9hPjwvcD4gICAgIDxo ciBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJw bGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGlj aW9ucyIgdGFyZ2V0PSJjb25kaWNpb25zIj5Vc2UgY29uZGl0aW9uczwvYT48L3A+ ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgJm5ic3A7 PGltZyBzcmM9ImltZy9iYWNrLmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1p ZGRsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4 XCcsMSk7bW9zdHJhKFwncHJvZF9tdGM1MDBtXCcsMCk7Ij5BbGwgcHJvZHVjdHM8 L2E+Jm5ic3A7PC9kaXY+PGRpdiBpZD0icHJvZF9tdGMxMDAwbSI+ICA8ZGl2IGNs YXNzPSJ0aXRvbF9wcm9kIj5Ub3BvZ3JhcGhpYyBtYXAgMTowMDAuMDAwPC9kaXY+ ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0 Om5hdmVnYXJoaSgxLFwndG9wb1wnKTsiPk5hdmlnYXRlPC9hPjwvcD4gICAgPHAg Y2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6ZHdsUHJv ZHVjdChcJ210YzEwMDBtXCcpIj5Eb3dubG9hZDwvYT4mbmJzcDs8c3BhbiBjbGFz cz0idG9vbHRpcF9kZXNjIj48L3NwYW4+PC9wPiAgICA8cCBjbGFzcz0icGxpc3Qi PiYjODIyNjsgPGEgaHJlZj0ibGxlZ2VuZGVzL210YzEwMDBtLnBkZiIgdGFyZ2V0 PSJsbGVnZW5kYSI+TGVnZW5kPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4m IzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9nZW9zZXJ2ZWlzIiB0 YXJnZXQ9IndtcyI+V01TPC9hPjwvcD4gICAgIDxociBzdHlsZT0iYm9yZGVyOjFw eCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBo cmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGljaW9ucyIgdGFyZ2V0PSJjb25k aWNpb25zIj5Vc2UgY29uZGl0aW9uczwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9y ZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgJm5ic3A7PGltZyBzcmM9ImltZy9iYWNr LmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIgLz4gPGEgaHJlZj0i amF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMSk7bW9zdHJhKFwncHJv ZF9tdGMxMDAwbVwnLDApOyI+QWxsIHByb2R1Y3RzPC9hPiZuYnNwOzwvZGl2Pjxk aXYgaWQ9InByb2RfYWVyaWVzIj48L2Rpdj48ZGl2IGlkPSJwcm9kX29mMiI+ICA8 ZGl2IGNsYXNzPSJ0aXRvbF9wcm9kIj5PcnRvcGhvdG8gMjUgY20gY3VycmVudDwv ZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNj cmlwdDpuYXZlZ2FyaGkoMTAsXCdvcnRvXCcpOyI+TmF2aWdhdGU8L2E+PC9wPiAg ICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iamF2YXNjcmlwdDpB cHAubGF5b3V0LnNldFdNU1Zpc2libGUoMSxcJ3QyXCcpOyI+RG93bmxvYWQ8L2E+ Jm5ic3A7PHNwYW4gY2xhc3M9InRvb2x0aXBfZGVzYyI+KENob29zZSBhIHNoZWV0 KTwvc3Bhbj48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVm PSJqYXZhc2NyaXB0OkFwcC5sYXlvdXQuc2hvd1dpbmRvdyhcJ29mMjVjXCcpOyI+ QXZhaWxhYmlsaXR5PC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7 IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9nZW9zZXJ2ZWlzIiB0YXJnZXQ9 IndtcyI+V01TPC9hPjwvcD4gICA8ZGl2IGNsYXNzPSJzZXAxNSI+PC9kaXY+ICAg IDxkaXYgY2xhc3M9ImVudW5jaWF0Ij5UZWNobmljYWwgc3BlY2lmaWNhdGlvbnM8 L2Rpdj4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6 Ly93d3cuaWNjLmNhdC9jYXQvY29udGVudC9kb3dubG9hZC8xMjM0MC80MTQ1MS9m aWxlL29mMjVjdjMzZXNwXzAzY2EucGRmIiB0YXJnZXQ9ImVzcGVjIj5UZWNobmlj YWwgc3BlY2lmaWNhdGlvbnM8L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjox cHggc29saWQgI2FhYTsiLz4gICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEg aHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NvbmRpY2lvbnMiIHRhcmdldD0iY29u ZGljaW9ucyI+VXNlIGNvbmRpdGlvbnM8L2E+PC9wPiAgICA8aHIgc3R5bGU9ImJv cmRlcjoxcHggc29saWQgI2FhYTsiLz4gICZuYnNwOzxpbWcgc3JjPSJpbWcvYmFj ay5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiIC8+IDxhIGhyZWY9 ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDEpO21vc3RyYShcJ3By b2Rfb2YyXCcsMCk7QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDAsXCd0MlwnKSI+ QWxsIHByb2R1Y3RzPC9hPiZuYnNwOzwvZGl2PjxkaXYgaWQ9InByb2Rfb2Y1Ij4g IDxkaXYgY2xhc3M9InRpdG9sX3Byb2QiPk9ydG9waG90byA1MCBjbSBjdXJyZW50 PC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZh c2NyaXB0Om5hdmVnYXJoaSg5LFwnb3J0b1wnKTsiPk5hdmlnYXRlPC9hPjwvcD4g ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6 QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDEsXCd0NVwnKTsiPkRvd25sb2FkPC9h PiZuYnNwOzxzcGFuIGNsYXNzPSJ0b29sdGlwX2Rlc2MiPihDaG9vc2UgYSBzaGVl dCk8L3NwYW4+PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJl Zj0iamF2YXNjcmlwdDpBcHAubGF5b3V0LnNob3dXaW5kb3coXCdvZjVtXCcpOyI+ QXZhaWxhYmlsaXR5PC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7 IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9nZW9zZXJ2ZWlzIiB0YXJnZXQ9 IndtcyI+V01TPC9hPjwvcD4gICAgIDxkaXYgY2xhc3M9ImVudW5jaWF0Ij5UZWNo bmljYWwgc3BlY2lmaWNhdGlvbnM8L2Rpdj4gICAgPHAgY2xhc3M9InBsaXN0Ij4m IzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvY29udGVudC9k b3dubG9hZC8yMTM0OS82NzYyMS9maWxlL29mNW12NjBlc3BfMDFjYS5wZGYiIHRh cmdldD0iZXNwZWMiPlRlY2huaWNhbCBzcGVjaWZpY2F0aW9uczwvYT48L3A+ICAg IDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNz PSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29u ZGljaW9ucyIgdGFyZ2V0PSJjb25kaWNpb25zIj5Vc2UgY29uZGl0aW9uczwvYT48 L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgJm5i c3A7PGltZyBzcmM9ImltZy9iYWNrLmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWdu Om1pZGRsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2lu ZGV4XCcsMSk7bW9zdHJhKFwncHJvZF9vZjVcJywwKTtBcHAubGF5b3V0LnNldFdN U1Zpc2libGUoMCxcJ3Q1XCcpIj5BbGwgcHJvZHVjdHM8L2E+Jm5ic3A7PC9kaXY+ PGRpdiBpZD0icHJvZF9vZjI1Ij4gIDxkaXYgY2xhc3M9InRpdG9sX3Byb2QiPk9y dG9waG90byAyLDUgbSBjdXJyZW50PC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+ JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om5hdmVnYXJoaSg3LFwnb3J0b1wn KTsiPk5hdmlnYXRlPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7 IDxhIGhyZWY9ImphdmFzY3JpcHQ6QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDEs XCd0MjVcJyk7Ij5Eb3dubG9hZDwvYT4mbmJzcDs8c3BhbiBjbGFzcz0idG9vbHRp cF9kZXNjIj4oQ2hvb3NlIGEgc2hlZXQpPC9zcGFuPjwvcD4gICAgPHAgY2xhc3M9 InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6QXBwLmxheW91dC5z aG93V2luZG93KFwnb2YyNW1cJyk7Ij5BdmFpbGFiaWxpdHk8L2E+PC9wPiAgICA8 cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2Mu Y2F0L2dlb3NlcnZlaXMiIHRhcmdldD0id21zIj5XTVM8L2E+PC9wPiAgICAgPGRp diBjbGFzcz0iZW51bmNpYXQiPlRlY2huaWNhbCBzcGVjaWZpY2F0aW9uczwvZGl2 PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3 dy5pY2MuY2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzIxMzUwLzY3NjI2L2ZpbGUv b2YyNW12NjFlc3BfMDFjYS5wZGYiIHRhcmdldD0iZXNwZWMiPlRlY2huaWNhbCBz cGVjaWZpY2F0aW9uczwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBz b2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVm PSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGljaW9ucyIgdGFyZ2V0PSJjb25kaWNp b25zIj5Vc2UgY29uZGl0aW9uczwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVy OjFweCBzb2xpZCAjYWFhOyIvPiAgJm5ic3A7PGltZyBzcmM9ImltZy9iYWNrLmdp ZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIgLz4gPGEgaHJlZj0iamF2 YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMSk7bW9zdHJhKFwncHJvZF9v ZjI1XCcsMCk7QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDAsXCd0MjVcJykiPkFs bCBwcm9kdWN0czwvYT4mbmJzcDs8L2Rpdj48ZGl2IGlkPSJkZXNjYXJyZWdhIj4g IDxkaXYgY2xhc3M9ImVudW5jaWF0Ij5Zb3UgaGF2ZSBzZWxlY3RlZCB0byBkb3du bG9hZDo8L2Rpdj4gIDxkaXYgaWQ9InRpdG9sX3Byb2R1Y3RlIiBjbGFzcz0idGl0 b2xfcHJvZCI+IDwvZGl2PgkJPGRpdiBpZD0iaWRfcmVsIj4mIzgyMjY7U2hlZXQ6 PC9kaXY+ICAgICA8ZGl2IGlkPSJub21fZnVsbCI+JiM4MjI2O05hbWU6PC9kaXY+ PGJyIC8+ICAgICA8ZGl2IGlkPSJmb3JtYXRzZGlzcG9uaWJsZXMiIGNsYXNzPSJl bnVuY2lhdF9wcm9kIj5BdmFpbGFibGUgZm9ybWF0czo8L2Rpdj4JCTxkaXYgaWQ9 InJhZGlvX2Rvd25sb2FkX3RvcG8iPjwvZGl2PiAgICAgPGRpdiBjbGFzcz0iZW51 bmNpYXRfcHJvZCI+UmVmZXJlbmNlIHN5c3RlbTo8L2Rpdj4JCTxkaXYgaWQ9InJh ZGlvX3Npc3JlZiI+PC9kaXY+CQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iZnVs bERlc2MiIHZhbHVlPSIiPiAgPGRpdiBjbGFzcz0ic2VwU3VwZXJpb3IiPiZuYnNw OzxpbWcgc3JjPSJpbWcvZHdsZF9pY29uLmpwZyIgc3R5bGU9InZlcnRpY2FsLWFs aWduOm1pZGRsZSIgLz4mbmJzcDs8YSBpZD0ibGlua2xva190b3BvIiBocmVmPSJq YXZhc2NyaXB0OmdldFJhZGlvKCk7Ij5Eb3dubG9hZDwvYT48YnIvPjwvZGl2PiAg ICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICA8cCBjbGFz cz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2Nv bmRpY2lvbnMiIHRhcmdldD0iY29uZGljaW9ucyI+VXNlIGNvbmRpdGlvbnM8L2E+ PC9wPiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICZu YnNwOzxpbWcgc3JjPSJpbWcvYmFjay5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGln bjptaWRkbGUiIC8+IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwnZGVzY2Fy cmVnYVwnLDApO21vc3RyYShcJ3Byb2RfaW5kZXhcJywxKTtBcHAubGF5b3V0LnNl dFdNU1Zpc2libGUoMCxcJ1wnKTsiPlNlbGVjdCBvdGhlciBwcm9kdWN0PC9hPiZu YnNwOzwvZGl2PjxkaXYgaWQ9InByb2RfbWV0Ij4gIDxkaXYgY2xhc3M9ImVudW5j aWF0Ij5ERU08L2Rpdj4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhy ZWY9ImphdmFzY3JpcHQ6QXBwLmxheW91dC5zZXRXTVNWaXNpYmxlKDEsXCd0NTBc Jyk7Ij5Eb3dubG9hZDwvYT4mbmJzcDs8c3BhbiBjbGFzcz0idG9vbHRpcF9kZXNj Ij4oQ2hvb3NlIGEgc2hlZXQpPC9zcGFuPjwvcD4gIDxkaXYgY2xhc3M9InNlcDE1 Ij48L2Rpdj4gICAgPGRpdiBjbGFzcz0iZW51bmNpYXQiPlRlY2huaWNhbCBzcGVj aWZpY2F0aW9uczwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEg aHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9jb250ZW50L2Rvd25sb2FkLzEy MzM5LzQxNDQ2L2ZpbGUvbWV0MTV2MjBlc3BfMDJjYS5wZGYiIHRhcmdldD0iZXNw ZWMiPlRlY2huaWNhbCBzcGVjaWZpY2F0aW9uczwvYT48L3A+ICAgIDxociBzdHls ZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+ JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGljaW9ucyIg dGFyZ2V0PSJjb25kaWNpb25zIj5Vc2UgY29uZGl0aW9uczwvYT48L3A+ICAgIDxo ciBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgJm5ic3A7PGltZyBz cmM9ImltZy9iYWNrLmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIg Lz4gPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcsMSk7 bW9zdHJhKFwncHJvZF9tZXRcJywwKTtBcHAubGF5b3V0LnNldFdNU1Zpc2libGUo MCxcJ3Q1MFwnKSI+QWxsIHByb2R1Y3RzPC9hPiZuYnNwOzwvZGl2PjxkaXYgaWQ9 InByb2RfYWx0cmVzIj48L2Rpdj48ZGl2IGlkPSJwcm9kX21wMjAiPiAgPGRpdiBj bGFzcz0idGl0b2xfcHJvZCI+TWFwYSBkZWxzIHMmb2dyYXZlO2xzIGRlIHBlbmRl bnQgJmd0OyAyMCAmIzM3OzwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIy NjsgPGEgaHJlZj0iamF2YXNjcmlwdDpBcHAubGF5b3V0LnNldFdNU1Zpc2libGUo MSxcJ3Q1XCcpOyI+RG93bmxvYWQ8L2E+Jm5ic3A7PHNwYW4gY2xhc3M9InRvb2x0 aXBfZGVzYyI+KENob29zZSBhIHNoZWV0KTwvc3Bhbj48L3A+ICA8ZGl2IGNsYXNz PSJzZXAxNSI+PC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBo cmVmPSIjIj5UZWNobmljYWwgc3BlY2lmaWNhdGlvbnM8L2E+PC9wPiAgICA8cCBj bGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0 L2NhdC9jb250ZW50L2Rvd25sb2FkLzExNzIwLzQwMjQ1L2ZpbGUvbXAyMHB2MTBk ZzBfMDFjYS5wZGYiPkRHTiBzcGVjaWZpY2F0aW9uczwvYT48L3A+ICAgIDxociBz dHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlz dCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGljaW9u cyIgdGFyZ2V0PSJjb25kaWNpb25zIj5Vc2UgY29uZGl0aW9uczwvYT48L3A+ICAg IDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgJm5ic3A7PGlt ZyBzcmM9ImltZy9iYWNrLmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRs ZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4XCcs MSk7bW9zdHJhKFwncHJvZF9tcDIwXCcsMCk7QXBwLmxheW91dC5zZXRXTVNWaXNp YmxlKDAsXCd0NVwnKSI+QWxsIHByb2R1Y3RzPC9hPiZuYnNwOzwvZGl2PjxkaXYg aWQ9InByb2RfYm01MG0iPiAgPGRpdiBjbGFzcz0idGl0b2xfcHJvZCI+QmFzZSBt dW5pY2lwYWwgMTo1MC4wMDA8L2Rpdj4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgy MjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6ZHdsUHJvZHVjdChcJ2JtNTBtc2hwXCcp OyI+RG93bmxvYWQ8L2E+Jm5ic3A7PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYj ODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2dlb3NlcnZlaXMiIHRh cmdldD0id21zIj5XTVM8L2E+PC9wPiAgIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rp dj4gIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4gICAgPGRpdiBjbGFzcz0iZW51 bmNpYXQiPlRlY2huaWNhbCBzcGVjaWZpY2F0aW9uczwvZGl2PiAgICA8cCBjbGFz cz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2Nh dC9Ib21lLUlDQy9NYXBlcy1mb3Rvcy1hZXJpZXMvU29icmUtbGEtY2FydG9ncmFm aWEtSUNDIiB0YXJnZXQ9ImVzcHRlYyI+VGVjaG5pY2FsIHNwZWNpZmljYXRpb25z PC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ ICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cu aWNjLmNhdC9jb25kaWNpb25zIiB0YXJnZXQ9ImNvbmRpY2lvbnMiPlVzZSBjb25k aXRpb25zPC9hPjwvcD4gICAgPGhyIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNh YWE7Ii8+ICAmbmJzcDs8aW1nIHNyYz0iaW1nL2JhY2suZ2lmIiBzdHlsZT0idmVy dGljYWwtYWxpZ246bWlkZGxlIiAvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3Ry YShcJ3Byb2RfaW5kZXhcJywxKTttb3N0cmEoXCdwcm9kX2JtNTBtXCcsMCk7Ij5B bGwgcHJvZHVjdHM8L2E+Jm5ic3A7PC9kaXY+PGRpdiBpZD0icHJvZF9ibTI1MG0i PiAgPGRpdiBjbGFzcz0idGl0b2xfcHJvZCI+QmFzZSBtdW5pY2lwYWwgMToyNTAu MDAwPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJq YXZhc2NyaXB0OmR3bFByb2R1Y3QoXCdibTI1MG1zaHBcJyk7Ij5Eb3dubG9hZDwv YT4mbmJzcDs8L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVm PSJodHRwOi8vd3d3LmljYy5jYXQvZ2Vvc2VydmVpcyIgdGFyZ2V0PSJ3bXMiPldN UzwvYT48L3A+ICAgPGRpdiBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgPGRpdiBjbGFz cz0ic2VwMTUiPjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+VGVjaG5p Y2FsIHNwZWNpZmljYXRpb25zPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4 MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L0hvbWUtSUNDL01h cGVzLWZvdG9zLWFlcmllcy9Tb2JyZS1sYS1jYXJ0b2dyYWZpYS1JQ0MiIHRhcmdl dD0iZXNwdGVjIj5UZWNobmljYWwgc3BlY2lmaWNhdGlvbnM8L2E+PC9wPiAgICA8 aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICA8cCBjbGFzcz0i cGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NvbmRp Y2lvbnMiIHRhcmdldD0iY29uZGljaW9ucyI+VXNlIGNvbmRpdGlvbnM8L2E+PC9w PiAgICA8aHIgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICZuYnNw OzxpbWcgc3JjPSJpbWcvYmFjay5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjpt aWRkbGUiIC8+IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRl eFwnLDEpO21vc3RyYShcJ3Byb2RfYm0yNTBtXCcsMCk7Ij5BbGwgcHJvZHVjdHM8 L2E+Jm5ic3A7PC9kaXY+PGRpdiBpZD0icHJvZF9ibTEwMDBtIj4gIDxkaXYgY2xh c3M9InRpdG9sX3Byb2QiPkJhc2UgbXVuaWNpcGFsIDE6MS4wMDAuMDAwPC9kaXY+ ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0 OmR3bFByb2R1Y3QoXCdibTEwMDBtc2hwXCcpOyI+RG93bmxvYWQ8L2E+Jm5ic3A7 PC9wPiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDov L3d3dy5pY2MuY2F0L2dlb3NlcnZlaXMiIHRhcmdldD0id21zIj5XTVM8L2E+PC9w PiAgIDxkaXYgY2xhc3M9InNlcDE1Ij48L2Rpdj4gIDxkaXYgY2xhc3M9InNlcDE1 Ij48L2Rpdj4gICAgPGRpdiBjbGFzcz0iZW51bmNpYXQiPlRlY2huaWNhbCBzcGVj aWZpY2F0aW9uczwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEg aHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9Ib21lLUlDQy9NYXBlcy1mb3Rv cy1hZXJpZXMvU29icmUtbGEtY2FydG9ncmFmaWEtSUNDIiB0YXJnZXQ9ImVzcHRl YyI+VGVjaG5pY2FsIHNwZWNpZmljYXRpb25zPC9hPjwvcD4gICAgPGhyIHN0eWxl PSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAgPHAgY2xhc3M9InBsaXN0Ij4m IzgyMjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jb25kaWNpb25zIiB0 YXJnZXQ9ImNvbmRpY2lvbnMiPlVzZSBjb25kaXRpb25zPC9hPjwvcD4gICAgPGhy IHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNhYWE7Ii8+ICAmbmJzcDs8aW1nIHNy Yz0iaW1nL2JhY2suZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIiAv PiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhcJywxKTtt b3N0cmEoXCdwcm9kX2JtMTAwMG1cJywwKTsiPkFsbCBwcm9kdWN0czwvYT4mbmJz cDs8L2Rpdj48ZGl2IGlkPSJwcm9kX3RhbGxzIj4gIDxkaXYgY2xhc3M9InRpdG9s X3Byb2QiPlRhbGxzPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8 YSBocmVmPSJqYXZhc2NyaXB0OmR3bFByb2R1Y3QoXCd0YWxsc1wnKTsiPkRvd25s b2FkPC9hPiZuYnNwOzwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxh IGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9nZW9zZXJ2ZWlzIiB0YXJnZXQ9Indt cyI+V01TPC9hPjwvcD4gICA8ZGl2IGNsYXNzPSJzZXAxNSI+PC9kaXY+ICAgIDxo ciBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJw bGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGlj aW9ucyIgdGFyZ2V0PSJjb25kaWNpb25zIj5Vc2UgY29uZGl0aW9uczwvYT48L3A+ ICAgIDxociBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgJm5ic3A7 PGltZyBzcmM9ImltZy9iYWNrLmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1p ZGRsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDptb3N0cmEoXCdwcm9kX2luZGV4 XCcsMSk7bW9zdHJhKFwncHJvZF90YWxsc1wnLDApO0FwcC5sYXlvdXQuc2V0V01T VmlzaWJsZSgwLFwndDVcJykiPkFsbCBwcm9kdWN0czwvYT4mbmJzcDs8L2Rpdj48 ZGl2IGlkPSJwcm9kX3BvbGluZCI+ICA8ZGl2IGNsYXNzPSJ0aXRvbF9wcm9kIj5C YXNlIGdlb2VzcGFjaWFsIGRlbHMgcG9sJmlhY3V0ZTtnb25zIGluZHVzdHJpYWxz PC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJqYXZh c2NyaXB0OmR3bFByb2R1Y3QoXCdiZGdwb2xpbmRcJyk7Ij5Eb3dubG9hZDwvYT4m bmJzcDs8L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJo dHRwOi8vd3d3LmljYy5jYXQvZ2Vvc2VydmVpcyIgdGFyZ2V0PSJ3bXMiPldNUzwv YT48L3A+ICAgPGRpdiBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgICA8aHIgc3R5bGU9 ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICA8cCBjbGFzcz0icGxpc3QiPiYj ODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NvbmRpY2lvbnMiIHRh cmdldD0iY29uZGljaW9ucyI+VXNlIGNvbmRpdGlvbnM8L2E+PC9wPiAgICA8aHIg c3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2FhYTsiLz4gICZuYnNwOzxpbWcgc3Jj PSJpbWcvYmFjay5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiIC8+ IDxhIGhyZWY9ImphdmFzY3JpcHQ6bW9zdHJhKFwncHJvZF9pbmRleFwnLDEpO21v c3RyYShcJ3Byb2RfcG9saW5kXCcsMCk7QXBwLmxheW91dC5zZXRXTVNWaXNpYmxl KDAsXCd0NVwnKSI+QWxsIHByb2R1Y3RzPC9hPiZuYnNwOzwvZGl2PjxkaXYgaWQ9 InByb2RfcDEwMDAiPiAgPGRpdiBjbGFzcz0idGl0b2xfcHJvZCI+VG9wb2dyYXBo aWMgY2FydG9ncmFwaHkgMToxMDAwPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+ JiM4MjI2OyA8YSBocmVmPSJqYXZhc2NyaXB0Om5hdmVnYXJoaSgxMCxcJ3RvcG9c Jyk7Ij5OYXZpZ2F0ZTwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2 OyA8YSBocmVmPSJqYXZhc2NyaXB0OkFwcC5sYXlvdXQuc2V0V01TVmlzaWJsZSgx LFwncDEwMDBcJyk7Ij5Eb3dubG9hZDwvYT4mbmJzcDs8c3BhbiBjbGFzcz0idG9v bHRpcF9kZXNjIj4oQ2hvb3NlIGEgc2hlZXQpPC9zcGFuPjwvcD4gICAgPHAgY2xh c3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9ImphdmFzY3JpcHQ6QXBwLmxheW91 dC5zaG93V2luZG93KFwnY3QxbVwnKTsiPkF2YWlsYWJpbGl0eTwvYT48L3A+ICAg IDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3Lmlj Yy5jYXQvZ2Vvc2VydmVpcyIgdGFyZ2V0PSJ3bXMiPldNUzwvYT48L3A+ICAgPGRp diBjbGFzcz0ic2VwMTUiPjwvZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+ QWRkaXRpb25hbCBmaWxlczwvZGl2PiAgICA8cCBjbGFzcz0icGxpc3QiPiYjODIy NjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9Ib21lLUlDQy9NYXBl cy1mb3Rvcy1hZXJpZXMvU29icmUtbGEtY2FydG9ncmFmaWEtSUNDIiB0YXJnZXQ9 ImFyeGNvbSI+VG8gRFhGPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgy MjY7IDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvSG9tZS1JQ0MvTWFw ZXMtZm90b3MtYWVyaWVzL1NvYnJlLWxhLWNhcnRvZ3JhZmlhLUlDQyIgdGFyZ2V0 PSJhcnhjb20iPlRvIERHTjwvYT48L3A+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4 MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L0hvbWUtSUNDL01h cGVzLWZvdG9zLWFlcmllcy9Tb2JyZS1sYS1jYXJ0b2dyYWZpYS1JQ0MiIHRhcmdl dD0iYXJ4Y29tIj5UbyBTSFA8L2E+PC9wPiAgPGRpdiBjbGFzcz0ic2VwMTUiPjwv ZGl2PiAgICA8ZGl2IGNsYXNzPSJlbnVuY2lhdCI+VGVjaG5pY2FsIHNwZWNpZmlj YXRpb25zPC9kaXY+ICAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBocmVm PSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L0hvbWUtSUNDL01hcGVzLWZvdG9zLWFl cmllcy9Tb2JyZS1sYS1jYXJ0b2dyYWZpYS1JQ0MiIHRhcmdldD0iZXNwdGVjIj5U ZWNobmljYWwgc3BlY2lmaWNhdGlvbnM8L2E+PC9wPiAgICA8cCBjbGFzcz0icGxp c3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5pY2MuY2F0L2NhdC9Ib21l LUlDQy9NYXBlcy1mb3Rvcy1hZXJpZXMvU29icmUtbGEtY2FydG9ncmFmaWEtSUND IiB0YXJnZXQ9ImRpYyI+RGljdGlvbmFyeTwvYT48L3A+ICAgIDxwIGNsYXNzPSJw bGlzdCI+JiM4MjI2OyA8YSBocmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY2F0L0hv bWUtSUNDL01hcGVzLWZvdG9zLWFlcmllcy9Tb2JyZS1sYS1jYXJ0b2dyYWZpYS1J Q0MiIHRhcmdldD0iZXNwdGVjIj5EWEYgc3BlY2lmaWNhdGlvbnM8L2E+PC9wPiAg ICA8cCBjbGFzcz0icGxpc3QiPiYjODIyNjsgPGEgaHJlZj0iaHR0cDovL3d3dy5p Y2MuY2F0L2NhdC9Ib21lLUlDQy9NYXBlcy1mb3Rvcy1hZXJpZXMvU29icmUtbGEt Y2FydG9ncmFmaWEtSUNDIiB0YXJnZXQ9ImVzcHRlYyI+REdOIHNwZWNpZmljYXRp b25zPC9hPjwvcD4gICAgPHAgY2xhc3M9InBsaXN0Ij4mIzgyMjY7IDxhIGhyZWY9 Imh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvSG9tZS1JQ0MvTWFwZXMtZm90b3MtYWVy aWVzL1NvYnJlLWxhLWNhcnRvZ3JhZmlhLUlDQyIgdGFyZ2V0PSJlc3B0ZWMiPlNI UCBzcGVjaWZpY2F0aW9uczwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9yZGVyOjFw eCBzb2xpZCAjYWFhOyIvPiAgIDxwIGNsYXNzPSJwbGlzdCI+JiM4MjI2OyA8YSBo cmVmPSJodHRwOi8vd3d3LmljYy5jYXQvY29uZGljaW9ucyIgdGFyZ2V0PSJjb25k aWNpb25zIj5Vc2UgY29uZGl0aW9uczwvYT48L3A+ICAgIDxociBzdHlsZT0iYm9y ZGVyOjFweCBzb2xpZCAjYWFhOyIvPiAgJm5ic3A7PGltZyBzcmM9ImltZy9iYWNr LmdpZiIvPiA8YSBocmVmPSJqYXZhc2NyaXB0Om1vc3RyYShcJ3Byb2RfaW5kZXhc JywxKTttb3N0cmEoXCdwcm9kX3AxMDAwXCcsMCk7QXBwLmxheW91dC5zZXRXTVNW aXNpYmxlKDAsXCdwMTAwMFwnKSI+QWxsIHByb2R1Y3RzPC9hPiZuYnNwOzwvZGl2 PjxkaXYgaWQ9InByb2RfY2xpY2siPjwvZGl2Pic7YnJlYWt9cmV0dXJuIGF9Ow== ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=layout.js Content-Type: application/javascript; charset=utf-8; name=layout.js Content-Location: http://www.icc.cat/vissir3/app/lib/App/layout.js Content-Transfer-Encoding: Base64 RXh0Lm5hbWVzcGFjZSgiQXBwIik7QXBwLmxheW91dD0oZnVuY3Rpb24oKXt2YXIg Y3JlYXRlTWFwPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBPcGVuTGF5ZXJzLk1hcCh7 cHJvamVjdGlvbjoiRVBTRzoyMzAzMSIsdW5pdHM6Im0iLGNvbnRyb2xzOltdLG1h eEV4dGVudDpuZXcgT3BlbkxheWVycy5Cb3VuZHMoMjU4MDAwLDQ0ODUwMDAsNTM2 MDAwLDQ3NTIwMDApLHJlc29sdXRpb25zOls1NTAsMjc1LDEwMCw1MCwyNSwxMCw1 LDIsMSwwLjUsMC4yNV0sYWxsT3ZlcmxheXM6ZmFsc2Usem9vbToxLHRoZW1lOm51 bGx9KX07dmFyIGNyZWF0ZUxheWVycz1mdW5jdGlvbigpe3JldHVybltuZXcgT3Bl bkxheWVycy5MYXllci5XTVMobHlyVG9wbyxBcHAudGlsZXNlcnZlcix7bGF5ZXJz OiJ0b3BvIixmb3JtYXQ6ImltYWdlL2pwZWciLGV4Y2VwdGlvbnM6ImFwcGxpY2F0 aW9uL3ZuZC5vZ2Muc2VfeG1sIn0se2J1ZmZlcjowLHRyYW5zaXRpb25FZmZlY3Q6 InJlc2l6ZSIsaXNCYXNlTGF5ZXI6dHJ1ZSxyZXNvbHV0aW9uczpbNTUwLDI3NSwx MDAsNTAsMjUsMTAsNSwyLDEsMC41LDAuMjUsMC4xXX0pLG5ldyBPcGVuTGF5ZXJz LkxheWVyLldNUyhseXJPcnRvLEFwcC50aWxlc2VydmVyLHtsYXllcnM6Im9ydG8i LGZvcm1hdDoiaW1hZ2UvanBlZyIsZXhjZXB0aW9uczoiYXBwbGljYXRpb24vdm5k Lm9nYy5zZV94bWwifSx7YnVmZmVyOjAsdHJhbnNpdGlvbkVmZmVjdDoicmVzaXpl Iixpc0Jhc2VMYXllcjp0cnVlLHJlc29sdXRpb25zOls1NTAsMjc1LDEwMCw1MCwy NSwxMCw1LDIsMSwwLjUsMC4yNSwwLjFdfSksbmV3IE9wZW5MYXllcnMuTGF5ZXIu V01TKCJub2Rpc3AiLEFwcC5BcmNHaXNTZXJ2ZXIrIi9hcmNnaXMvc2VydmljZXMv aWNjX2N0MW1fdmlzc2lyX3Zfci9NYXBTZXJ2ZXIvV01TU2VydmVyIix7bGF5ZXJz OlsiOCJdLGZvcm1hdDoiaW1hZ2UvcG5nIixiZ2NvbG9yOiIweEZGRkZGRiIsdHJh bnNwYXJlbnQ6dHJ1ZX0se2J1ZmZlcjowLGRpc3BsYXlJbkxheWVyU3dpdGNoZXI6 ZmFsc2UsdmlzaWJpbGl0eTpmYWxzZSx0aWxlU2l6ZTpuZXcgT3BlbkxheWVycy5T aXplKDc2OCw3NjgpfSksbmV3IE9wZW5MYXllcnMuTGF5ZXIuV01TKCJXTVNQMTAw MCIsQXBwLkFyY0dpc1NlcnZlcisiL2FyY2dpcy9zZXJ2aWNlcy9pY2NfY3QxbV92 aXNzaXJfdl9yL01hcFNlcnZlci9XTVNTZXJ2ZXIiLHtsYXllcnM6WyIwLDMsNCw1 LDciXSxmb3JtYXQ6ImltYWdlL3BuZyIsYmdjb2xvcjoiMHhGRkZGRkYiLHRyYW5z cGFyZW50OnRydWV9LHtidWZmZXI6MCxkaXNwbGF5SW5MYXllclN3aXRjaGVyOmZh bHNlLHZpc2liaWxpdHk6ZmFsc2UsdGlsZVNpemU6bmV3IE9wZW5MYXllcnMuU2l6 ZSg3NjgsNzY4KX0pLG5ldyBPcGVuTGF5ZXJzLkxheWVyLldNUygiV01TUDEwMDBQ T0xZRyIsQXBwLkFyY0dpc1NlcnZlcisiL2FyY2dpcy9zZXJ2aWNlcy9pY2NfY3Qx bV92aXNzaXJfdl9yL01hcFNlcnZlci9XTVNTZXJ2ZXIiLHtsYXllcnM6WyIxIl0s Zm9ybWF0OiJpbWFnZS9wbmciLGJnY29sb3I6IjB4RkZGRkZGIix0cmFuc3BhcmVu dDp0cnVlfSx7YnVmZmVyOjAsZGlzcGxheUluTGF5ZXJTd2l0Y2hlcjpmYWxzZSx2 aXNpYmlsaXR5OmZhbHNlLHRpbGVTaXplOm5ldyBPcGVuTGF5ZXJzLlNpemUoNzY4 LDc2OCksb3BhY2l0eTowLjh9KSxuZXcgT3BlbkxheWVycy5MYXllci5XTVMoImdl b2wiLCJodHRwOi8vc2l1cmFuYS5pZ2MuY2F0L2FyY2dpcy9zZXJ2aWNlcy9CYXNl L01HQ19NYXBhQmFzZS9NYXBTZXJ2ZXIvV01TU2VydmVyIix7bGF5ZXJzOiIwLDEi LGZvcm1hdDoiaW1hZ2UvanBlZyIsZXhjZXB0aW9uczoiYXBwbGljYXRpb24vdm5k Lm9nYy5zZV94bWwifSx7YnVmZmVyOjAsaXNCYXNlTGF5ZXI6ZmFsc2UsdmlzaWJp bGl0eTpmYWxzZSxyZXNvbHV0aW9uczpbNTUwLDI3NSwxMDAsNTAsMjUsMTAsNSwy LDEsMC41LDAuMjUsMC4xXX0pLG5ldyBPcGVuTGF5ZXJzLkxheWVyLldNUygib3Zl cmxheV9vcnRvX2hpc3QiLCJodHRwOi8vc2hhZ3JhdC5pY2MuY2F0L2xpemFyZHRl Y2gvaXNlcnYvb3dzPyIse2xheWVyczoib3J0bzI1bTIwMDksIixmb3JtYXQ6Imlt YWdlL2pwZWciLGV4Y2VwdGlvbnM6ImFwcGxpY2F0aW9uL3ZuZC5vZ2Muc2VfeG1s IixiZ2NvbG9yOiIweDAwMDAwMCIsdHJhbnNwYXJlbnQ6InRydWUifSx7aXNCYXNl TGF5ZXI6ZmFsc2UsdmlzaWJpbGl0eTpmYWxzZSxvcGFjaXR5OjEsZGlzcGxheUlu TGF5ZXJTd2l0Y2hlcjpmYWxzZX0pLG5ldyBPcGVuTGF5ZXJzLkxheWVyLldNUygi b3ZlcmxheV9vcnRvX3NpZ3JpZCIsImh0dHA6Ly93d3cub3J0b3hwcmVzLmNhdC9z ZXJ2ZXIvc2dkd21zLmRsbC9XTVM/Iix7bGF5ZXJzOiJDYXRhbHVueWEgMjVjbS4g MjAxMSIsc3R5bGVzOiJTR0RfVmlld09wdGlvbnM6OlZlY3RvckludmlzaWJsZU9m ZnxTR0RfU3RlcmVvTW9kZWw6OlNob3dBbmFnbHlwaGljT2ZmfFNHRF9TdGVyZW9N b2RlbDo6T3J0aG9PblRoZUZseU9ufHx8Iixmb3JtYXQ6ImltYWdlL2pwZWciLGV4 Y2VwdGlvbnM6ImFwcGxpY2F0aW9uL3ZuZC5vZ2Muc2VfaW5pbWFnZSIsdHJhbnNw YXJlbnQ6InRydWUifSx7YnVmZmVyOjAsdmlzaWJpbGl0eTpmYWxzZSxvcGFjaXR5 OjEsZGlzcGxheUluTGF5ZXJTd2l0Y2hlcjpmYWxzZSx0aWxlU2l6ZTpuZXcgT3Bl bkxheWVycy5TaXplKDEyODAsMTI4MCl9KSxuZXcgT3BlbkxheWVycy5MYXllci5X TVMoIm92ZXJsYXlfdHJhbnNfb3J0byIsQXBwLnRpbGVzZXJ2ZXIse2xheWVyczoi b3J0byIsZm9ybWF0OiJpbWFnZS9qcGVnIn0se2lzQmFzZUxheWVyOmZhbHNlLHZp c2liaWxpdHk6ZmFsc2Usb3BhY2l0eTowLGRpc3BsYXlJbkxheWVyU3dpdGNoZXI6 ZmFsc2V9KSxuZXcgT3BlbkxheWVycy5MYXllci5XTVMoIm92ZXJsYXlfdHJhbnNf b3J0b19oaXN0IiwiaHR0cDovL3NoYWdyYXQuaWNjLmNhdC9saXphcmR0ZWNoL2lz ZXJ2L293cz8iLHtsYXllcnM6Im9ydG8yNW0yMDA5LCIsZm9ybWF0OiJpbWFnZS9q cGVnIixleGNlcHRpb25zOiJhcHBsaWNhdGlvbi92bmQub2djLnNlX3htbCIsYmdj b2xvcjoiMHgwMDAwMDAiLHRyYW5zcGFyZW50OiJ0cnVlIn0se2lzQmFzZUxheWVy OmZhbHNlLHZpc2liaWxpdHk6ZmFsc2Usb3BhY2l0eToxLGRpc3BsYXlJbkxheWVy U3dpdGNoZXI6ZmFsc2V9KSxuZXcgT3BlbkxheWVycy5MYXllci5XTVMoImluZnJh cm9pZyIsImh0dHA6Ly9zaGFncmF0LmljYy5jYXQvbGl6YXJkdGVjaC9pc2Vydi9v d3M/Iix7bGF5ZXJzOiJvcnRvaTI1bSwiLGZvcm1hdDoiaW1hZ2UvanBlZyIsZXhj ZXB0aW9uczoiYXBwbGljYXRpb24vdm5kLm9nYy5zZV94bWwiLGJnY29sb3I6IjB4 RkZGRkZGIix0cmFuc3BhcmVudDoidHJ1ZSJ9LHtpc0Jhc2VMYXllcjpmYWxzZSx2 aXNpYmlsaXR5OmZhbHNlLG9wYWNpdHk6MSxkaXNwbGF5SW5MYXllclN3aXRjaGVy OmZhbHNlfSksbmV3IE9wZW5MYXllcnMuTGF5ZXIuV01TKCJvdmVybGF5X3RyYW5z X29ydG9fc2lncmlkIiwiaHR0cDovL3d3dy5vcnRveHByZXMuY2F0L3NlcnZlci9z Z2R3bXMuZGxsL1dNUz8iLHtsYXllcnM6IkNhdGFsdW55YSAyNWNtLiAyMDExIixz dHlsZXM6IlNHRF9WaWV3T3B0aW9uczo6VmVjdG9ySW52aXNpYmxlT2ZmfFNHRF9T dGVyZW9Nb2RlbDo6U2hvd0FuYWdseXBoaWNPZmZ8U0dEX1N0ZXJlb01vZGVsOjpP cnRob09uVGhlRmx5T258fHwiLGZvcm1hdDoiaW1hZ2UvanBlZyIsZXhjZXB0aW9u czoiYXBwbGljYXRpb24vdm5kLm9nYy5zZV9pbmltYWdlIix0cmFuc3BhcmVudDoi dHJ1ZSJ9LHtidWZmZXI6MCx2aXNpYmlsaXR5OmZhbHNlLG9wYWNpdHk6MSxkaXNw bGF5SW5MYXllclN3aXRjaGVyOmZhbHNlLHRpbGVTaXplOm5ldyBPcGVuTGF5ZXJz LlNpemUoMTI4MCwxMjgwKX0pLG5ldyBPcGVuTGF5ZXJzLkxheWVyLldNUygiZ2Vv bF90cmFucyIsImh0dHA6Ly9zaXVyYW5hLmlnYy5jYXQvYXJjZ2lzL3NlcnZpY2Vz L0Jhc2UvTUdDX01hcGFCYXNlL01hcFNlcnZlci9XTVNTZXJ2ZXIiLHtsYXllcnM6 IjAsMSIsZm9ybWF0OiJpbWFnZS9qcGVnIixleGNlcHRpb25zOiJhcHBsaWNhdGlv bi92bmQub2djLnNlX3htbCJ9LHtidWZmZXI6MCxpc0Jhc2VMYXllcjpmYWxzZSx2 aXNpYmlsaXR5OmZhbHNlLHJlc29sdXRpb25zOls1NTAsMjc1LDEwMCw1MCwyNSwx MCw1LDIsMSwwLjUsMC4yNSwwLjFdfSksbmV3IE9wZW5MYXllcnMuTGF5ZXIuV01T KCJuZHZpIiwiaHR0cDovL3d3dy5pY2MuY2F0L05EVkkvTkRWSVNlcnZsZXRXTVM/ Iix7bGF5ZXJzOiJDYXRhbHVueWEgTkRWSS4gMjAxMSIsdHJhbnNwYXJlbnQ6InRy dWUiLGZvcm1hdDoiaW1hZ2UvcG5nIix0aXB1czoiY29sb3IiLGV4Y2VwdGlvbnM6 ImFwcGxpY2F0aW9uL3ZuZC5vZ2Muc2VfeG1sIn0se2J1ZmZlcjowLGlzQmFzZUxh eWVyOmZhbHNlLHZpc2liaWxpdHk6ZmFsc2UsdGlsZVNpemU6bmV3IE9wZW5MYXll cnMuU2l6ZSgxMjgwLDEyODApLG9wYWNpdHk6MSxyZXNvbHV0aW9uczpbNTUwLDI3 NSwxMDAsNTAsMjUsMTAsNSwyLDEsMC41LDAuMjUsMC4xXX0pLG5ldyBPcGVuTGF5 ZXJzLkxheWVyLldNUygib3ZlcmxheV90cmFuc190b3BvIixBcHAudGlsZXNlcnZl cix7bGF5ZXJzOiJ0b3BvIixmb3JtYXQ6ImltYWdlL2pwZWcifSx7aXNCYXNlTGF5 ZXI6ZmFsc2UsdmlzaWJpbGl0eTpmYWxzZSxvcGFjaXR5OjAsZGlzcGxheUluTGF5 ZXJTd2l0Y2hlcjpmYWxzZX0pLG5ldyBPcGVuTGF5ZXJzLkxheWVyLldNUygib3Zl cmxheV90cmFuc190b3BvMW0iLEFwcC5BcmNHaXNTZXJ2ZXIrIi9hcmNnaXMvc2Vy dmljZXMvaWNjX2N0MW1fdmlzc2lyX3Zfci9NYXBTZXJ2ZXIvV01TU2VydmVyIix7 bGF5ZXJzOlsiMCwzLDQsNSw3Il0sZm9ybWF0OiJpbWFnZS9wbmciLGJnY29sb3I6 IjB4RkZGRkZGIix0cmFuc3BhcmVudDp0cnVlfSx7YnVmZmVyOjAsZGlzcGxheUlu TGF5ZXJTd2l0Y2hlcjpmYWxzZSx2aXNpYmlsaXR5OmZhbHNlLHRpbGVTaXplOm5l dyBPcGVuTGF5ZXJzLlNpemUoNzY4LDc2OCkscmVzb2x1dGlvbnM6WzAuMjUsMC4x XX0pLG5ldyBPcGVuTGF5ZXJzLkxheWVyLldNUygidG9wb29ydG8iLEFwcC5BcmNH aXNTZXJ2ZXIrIi9hcmNnaXMvc2VydmljZXMvaWNjX3RvcG9uaW01bV92X3IvTWFw U2VydmVyL1dNU1NlcnZlcj8iLHtsYXllcnM6IjEsMiwzIixmb3JtYXQ6ImltYWdl L3BuZyIsZXhjZXB0aW9uczoiYXBwbGljYXRpb24vdm5kLm9nYy5zZV94bWwiLGJn Y29sb3I6IjB4RkZGRkZGIix0cmFuc3BhcmVudDoidHJ1ZSJ9LHtidWZmZXI6MCxp c0Jhc2VMYXllcjpmYWxzZSx2aXNpYmlsaXR5OmZhbHNlLHNpbmdsZVRpbGU6dHJ1 ZSxvcGFjaXR5OjF9KSxuZXcgT3BlbkxheWVycy5MYXllci5XTVMoIlRhbGw1MCIs QXBwLnRhbGxzU2V2ZXIse2xheWVyczpbIjEyLDE0Il0sc3R5bGVzOiJUQUxMNTAs VEFMTDUwQSIsc2xkOkFwcC5BcmNHaXNTZXJ2ZXIrIi9zbGQvdGFsbHMueG1sIixm b3JtYXQ6ImltYWdlL3BuZyIsYmdjb2xvcjoiMHhGRkZGRkYiLHRyYW5zcGFyZW50 OnRydWV9LHtidWZmZXI6MCxkaXNwbGF5SW5MYXllclN3aXRjaGVyOmZhbHNlLHZp c2liaWxpdHk6ZmFsc2UsdGlsZVNpemU6bmV3IE9wZW5MYXllcnMuU2l6ZSg3Njgs NzY4KSxvcGFjaXR5OjAuOH0pLG5ldyBPcGVuTGF5ZXJzLkxheWVyLldNUygiVGFs bDI1IixBcHAudGFsbHNTZXZlcix7bGF5ZXJzOlsiOSwxMSJdLHN0eWxlczoiVEFM TDI1LFRBTEwyNUEiLHNsZDpBcHAuQXJjR2lzU2VydmVyKyIvc2xkL3RhbGxzLnht bCIsZm9ybWF0OiJpbWFnZS9wbmciLGJnY29sb3I6IjB4RkZGRkZGIix0cmFuc3Bh cmVudDp0cnVlfSx7YnVmZmVyOjAsZGlzcGxheUluTGF5ZXJTd2l0Y2hlcjpmYWxz ZSx2aXNpYmlsaXR5OmZhbHNlLHRpbGVTaXplOm5ldyBPcGVuTGF5ZXJzLlNpemUo NzY4LDc2OCksb3BhY2l0eTowLjh9KSxuZXcgT3BlbkxheWVycy5MYXllci5XTVMo IlRhbGwxMCIsQXBwLnRhbGxzU2V2ZXIse2xheWVyczpbIjYsOCJdLHN0eWxlczoi VEFMTDEwLFRBTEwxMEEiLHNsZDpBcHAuQXJjR2lzU2VydmVyKyIvc2xkL3RhbGxz LnhtbCIsZm9ybWF0OiJpbWFnZS9wbmciLGJnY29sb3I6IjB4RkZGRkZGIix0cmFu c3BhcmVudDp0cnVlfSx7YnVmZmVyOjAsZGlzcGxheUluTGF5ZXJTd2l0Y2hlcjpm YWxzZSx2aXNpYmlsaXR5OmZhbHNlLHRpbGVTaXplOm5ldyBPcGVuTGF5ZXJzLlNp emUoNzY4LDc2OCksb3BhY2l0eTowLjh9KSxuZXcgT3BlbkxheWVycy5MYXllci5X TVMoIlRhbGw1IixBcHAudGFsbHNTZXZlcix7bGF5ZXJzOlsiMyw1Il0sc3R5bGVz OiJUQUxMNSxUQUxMNUEiLHNsZDpBcHAuQXJjR2lzU2VydmVyKyIvc2xkL3RhbGxz LnhtbCIsZm9ybWF0OiJpbWFnZS9wbmciLGJnY29sb3I6IjB4RkZGRkZGIix0cmFu c3BhcmVudDp0cnVlfSx7YnVmZmVyOjAsZGlzcGxheUluTGF5ZXJTd2l0Y2hlcjpm YWxzZSx2aXNpYmlsaXR5OmZhbHNlLHRpbGVTaXplOm5ldyBPcGVuTGF5ZXJzLlNp emUoNzY4LDc2OCksb3BhY2l0eTowLjh9KSxuZXcgT3BlbkxheWVycy5MYXllci5X TVMoInNlbnlhbHNnZW8iLEFwcC5BcmNHaXNTZXJ2ZXIrIi9hcmNnaXMvc2Vydmlj ZXMvaWNjX3ZlcnRleHNfdl9yL01hcFNlcnZlci9XTVNTZXJ2ZXIiLHtsYXllcnM6 IjIsMSwwIixmb3JtYXQ6ImltYWdlL3BuZyIsYmdjb2xvcjoiMHhGRkZGRkYiLHRy YW5zcGFyZW50OiJ0cnVlIn0se2J1ZmZlcjowLGlzQmFzZUxheWVyOmZhbHNlLHZp c2liaWxpdHk6ZmFsc2UsdGlsZVNpemU6bmV3IE9wZW5MYXllcnMuU2l6ZSg1MTIs NTEyKSxvcGFjaXR5OjAuOH0pLG5ldyBPcGVuTGF5ZXJzLkxheWVyLldNUygiZGF0 YXZvbCIsQXBwLkFyY0dpc1NlcnZlcisiL2FyY2dpcy9zZXJ2aWNlcy9pY2NfaW5k ZXhzX3Zfci9NYXBTZXJ2ZXIvV01TU2VydmVyIix7bGF5ZXJzOiIyMCwyMSIsc3R5 bGVzOiJUQUxMMjUwLCIsc2xkOkFwcC5BcmNHaXNTZXJ2ZXIrIi9zbGQvaW5kZXhz LnhtbCIsZm9ybWF0OiJpbWFnZS9wbmciLGJnY29sb3I6IjB4RkZGRkZGIix0cmFu c3BhcmVudDoidHJ1ZSJ9LHtidWZmZXI6MCxpc0Jhc2VMYXllcjpmYWxzZSx2aXNp YmlsaXR5OmZhbHNlLHRpbGVTaXplOm5ldyBPcGVuTGF5ZXJzLlNpemUoNzY4LDc2 OCksb3BhY2l0eTowLjh9KSxuZXcgT3BlbkxheWVycy5MYXllci5XTVMoImNhZGFz dHJlIiwiaHR0cDovL292Yy5jYXRhc3Ryby5tZWguZXMvQ2FydG9ncmFmaWEvV01T L1NlcnZpZG9yV01TLmFzcHgiLHtsYXllcnM6IkNhdGFzdHJvIixmb3JtYXQ6Imlt YWdlL3BuZyIsdHJhbnNwYXJlbnQ6InRydWUifSx7YnVmZmVyOjAsaXNCYXNlTGF5 ZXI6ZmFsc2UsdmlzaWJpbGl0eTpmYWxzZSx0aWxlU2l6ZTpuZXcgT3BlbkxheWVy cy5TaXplKDc2OCw3NjgpfSksbmV3IE9wZW5MYXllcnMuTGF5ZXIuV01TKCJzaWdw YWMiLCJodHRwOi8vbWFncmFuYS5nZW5jYXQuY2F0L1NJR193cy9QVUJMSUNfT0dD L01hcFNlcnZlci9XTVNTZXJ2ZXI/Iix7bGF5ZXJzOiI1LDYiLGZvcm1hdDoiaW1h Z2UvcG5nIix0cmFuc3BhcmVudDoidHJ1ZSJ9LHtidWZmZXI6MCxpc0Jhc2VMYXll cjpmYWxzZSx2aXNpYmlsaXR5OmZhbHNlLHRpbGVTaXplOm5ldyBPcGVuTGF5ZXJz LlNpemUoNzY4LDc2OCl9KSxuZXcgT3BlbkxheWVycy5MYXllci5XTVMoImxpbWFk bWluIiwiaHR0cDovL2dhbGlsZW8uaWNjLmNhdC9hcmNnaXMvc2VydmljZXMvaWNj X2xpbWFkbWluX3Zfci9NYXBTZXJ2ZXIvV01TU2VydmVyPyIse2xheWVyczoiMSwy LDMsNCw1Iixmb3JtYXQ6ImltYWdlL3BuZyIsZXhjZXB0aW9uczoiYXBwbGljYXRp b24vdm5kLm9nYy5zZV94bWwiLGJnY29sb3I6IjB4RkZGRkZGIix0cmFuc3BhcmVu dDoidHJ1ZSJ9LHtidWZmZXI6MCxpc0Jhc2VMYXllcjpmYWxzZSx2aXNpYmlsaXR5 OmZhbHNlLHNpbmdsZVRpbGU6dHJ1ZSxvcGFjaXR5OjF9KSxuZXcgT3BlbkxheWVy cy5MYXllci5XTVMoIkNpbXMiLEFwcC5BcmNHaXNTZXJ2ZXIrIi9hcmNnaXMvc2Vy dmljZXMvaWNjXzEwMGNpbXNfdl9yL01hcFNlcnZlci9XTVNTZXJ2ZXIiLHtsYXll cnM6IjAiLGZvcm1hdDoiaW1hZ2UvcG5nIixiZ2NvbG9yOiIweEZGRkZGRiIsdHJh bnNwYXJlbnQ6InRydWUifSx7YnVmZmVyOjAsaXNCYXNlTGF5ZXI6ZmFsc2Usdmlz aWJpbGl0eTpmYWxzZSxzaW5nbGVUaWxlOmZhbHNlLHRpbGVTaXplOm5ldyBPcGVu TGF5ZXJzLlNpemUoNTEyLDUxMiksb3BhY2l0eTowLjh9KV19O3ZhciBjcmVhdGVM YXllclN0b3JlPWZ1bmN0aW9uKG1hcCxsYXllcnMpe3JldHVybiBuZXcgR2VvRXh0 LmRhdGEuTGF5ZXJTdG9yZSh7bWFwOm1hcCxsYXllcnM6bGF5ZXJzfSl9O3ZhciBz eW1ib2xpemVyPU9wZW5MYXllcnMuVXRpbC5hcHBseURlZmF1bHRzKHtzdHJva2VD b2xvcjoiI2VlOTkwMCIsc3Ryb2tlV2lkdGg6NCxmaWxsQ29sb3I6IiNlZTk5MDAi LGZpbGxPcGFjaXR5OjAuNCxwb2ludFJhZGl1czo2fSxPcGVuTGF5ZXJzLkZlYXR1 cmUuVmVjdG9yLnN0eWxlWyJkZWZhdWx0Il0pO3ZhciBzdHlsZU1hcD1uZXcgT3Bl bkxheWVycy5TdHlsZU1hcCh7ImRlZmF1bHQiOnN5bWJvbGl6ZXIsc2VsZWN0Ontz dHJva2VDb2xvcjoiYmx1ZSIsZmlsbENvbG9yOiJibHVlIn19KTt2YXIgY3JlYXRl VmVjdG9yTGF5ZXI9ZnVuY3Rpb24obWFwKXt2ZWN0b3JMYXllcj1uZXcgT3Blbkxh eWVycy5MYXllci5WZWN0b3IoInZlY3RvciIse2Rpc3BsYXlJbkxheWVyU3dpdGNo ZXI6ZmFsc2Usc3R5bGVNYXA6c3R5bGVNYXB9KTttYXAuYWRkTGF5ZXIodmVjdG9y TGF5ZXIpO3ZlY3RvckxheWVyLmV2ZW50cy5yZWdpc3RlcigiZmVhdHVyZWFkZGVk Iix2ZWN0b3JMYXllcixmdW5jdGlvbigpe3ZhciBsPXRoaXMuZmVhdHVyZXMubGVu Z3RoO3ZhciBtc2c9KGw9PTEpPyIgIitoaWhhZmlndXJhOmhpaGErIiAiK2wrIiAi K2ZpZ3VyZXNtYXBhO0FwcC5sYXlvdXQuc2V0U3RhdHVzKG1zZyl9KTtyZXR1cm4g dmVjdG9yTGF5ZXJ9O3ZhciBjcmVhdGVXTVNMYXllcj1mdW5jdGlvbihtYXApe3dt c0xheWVyPW5ldyBPcGVuTGF5ZXJzLkxheWVyLldNUygiV01TIixBcHAudGFsbHNT ZXZlcix7bGF5ZXJzOlsiMyJdLHN0eWxlczoiVEFMTDUiLHNsZDpBcHAuQXJjR2lz U2VydmVyKyIvc2xkL3RhbGxzLnhtbCIsZm9ybWF0OiJpbWFnZS9wbmciLGJnY29s b3I6IjB4RkZGRkZGIix0cmFuc3BhcmVudDp0cnVlfSx7YnVmZmVyOjAsZGlzcGxh eUluTGF5ZXJTd2l0Y2hlcjpmYWxzZSx2aXNpYmlsaXR5OmZhbHNlLHRpbGVTaXpl Om5ldyBPcGVuTGF5ZXJzLlNpemUoNzY4LDc2OCksb3BhY2l0eTowLjh9KTttYXAu YWRkTGF5ZXIod21zTGF5ZXIpfTt2YXIgY3JlYXRlV01TTGF5ZXIyPWZ1bmN0aW9u KG1hcCl7d21zTGF5ZXI9bmV3IE9wZW5MYXllcnMuTGF5ZXIuV01TKCJXTVMyIixB cHAud21zMix7bGF5ZXJzOiIxMiIsc3R5bGVzOiJUQUxMIixzbGQ6QXBwLlNMRFNl cnZlcisiP3BhcmFtcz0wLDYsMCxUQUxMIixmb3JtYXQ6ImltYWdlL3BuZyIsYmdj b2xvcjoiMHhGRkZGRkYiLHRyYW5zcGFyZW50OnRydWV9LHtidWZmZXI6MCxkaXNw bGF5SW5MYXllclN3aXRjaGVyOmZhbHNlLHZpc2liaWxpdHk6ZmFsc2UsdGlsZVNp emU6bmV3IE9wZW5MYXllcnMuU2l6ZSg3NjgsNzY4KSxvcGFjaXR5OjAuOH0pO21h cC5hZGRMYXllcih3bXNMYXllcil9O3ZhciBjcmVhdGVXTVNMYXllckNvbWFyY2Fs PWZ1bmN0aW9uKG1hcCl7d21zTGF5ZXI9bmV3IE9wZW5MYXllcnMuTGF5ZXIuV01T KCJXTVNDT00iLEFwcC5BcmNHaXNTZXJ2ZXIrIi9hcmNnaXMvc2VydmljZXMvaWNj X2xpbWFkbWluX3Zfci9NYXBTZXJ2ZXIvV01TU2VydmVyIix7bGF5ZXJzOlsiNSJd LGZvcm1hdDoiaW1hZ2UvcG5nIixiZ2NvbG9yOiIweEZGRkZGRiIsdHJhbnNwYXJl bnQ6dHJ1ZX0se2J1ZmZlcjowLGRpc3BsYXlJbkxheWVyU3dpdGNoZXI6ZmFsc2Us dmlzaWJpbGl0eTpmYWxzZSx0aWxlU2l6ZTpuZXcgT3BlbkxheWVycy5TaXplKDc2 OCw3NjgpLG9wYWNpdHk6MC44fSk7bWFwLmFkZExheWVyKHdtc0xheWVyKX07dmFy IGNyZWF0ZVdNU0xheWVyQ29tYXJjYWwyPWZ1bmN0aW9uKG1hcCl7d21zTGF5ZXI9 bmV3IE9wZW5MYXllcnMuTGF5ZXIuV01TKCJXTVNDT00yIixBcHAuQXJjR2lzU2Vy dmVyKyIvYXJjZ2lzL3NlcnZpY2VzL2ljY19saW1hZG1pbl92X3IvTWFwU2VydmVy L1dNU1NlcnZlciIse2xheWVyczoiNSIsc3R5bGVzOiJDT01BUkNBIixzbGQ6QXBw LlNMRFNlcnZlcisiP3BhcmFtcz0wLDAsQ09NQVJDQSxDT01BUkNBIixmb3JtYXQ6 ImltYWdlL3BuZyIsYmdjb2xvcjoiMHhGRkZGRkYiLHRyYW5zcGFyZW50OnRydWV9 LHtidWZmZXI6MCxkaXNwbGF5SW5MYXllclN3aXRjaGVyOmZhbHNlLHZpc2liaWxp dHk6ZmFsc2UsdGlsZVNpemU6bmV3IE9wZW5MYXllcnMuU2l6ZSg3NjgsNzY4KSxv cGFjaXR5OjAuOH0pO21hcC5hZGRMYXllcih3bXNMYXllcil9O3ZhciBhZGRNYXBD b250cm9scz1mdW5jdGlvbihtYXApe3ZhciBuYXZDb250cm9sPW5ldyBPcGVuTGF5 ZXJzLkNvbnRyb2wuTmF2aWdhdGlvbih7dHlwZTpPcGVuTGF5ZXJzLkNvbnRyb2wu VFlQRV9UT0dHTEUsem9vbVdoZWVsRW5hYmxlZDp0cnVlLG1vdXNlV2hlZWxPcHRp b25zOntpbnRlcnZhbDoyMCxjdW11bGF0aXZlOmZhbHNlfX0pO3ZhciBvdmVydmll d01hcFNpemU9bmV3IE9wZW5MYXllcnMuU2l6ZSgxMjgsMTIzKTt2YXIgYm91bmRz PW5ldyBPcGVuTGF5ZXJzLkJvdW5kcygyNTgwMDAsNDQ4NTAwMCw1MzYwMDAsNDc1 MjAwMCk7dmFyIGdlbmVyaWNNYXBPcHRpb25zPXtwcm9qZWN0aW9uOiJFUFNHOjIz MDMxIix1bml0czoibSIsbWF4RXh0ZW50OmJvdW5kc307dmFyIHJlZmVyZW5jaWE9 bmV3IE9wZW5MYXllcnMuTGF5ZXIuSW1hZ2UoIk92ZXJ2aWV3IiwiLi9hcHAvaW1n L21hcGFfcmVmLmpwZyIsYm91bmRzLG92ZXJ2aWV3TWFwU2l6ZSk7dmFyIG92ZXJ2 aWV3T3B0aW9ucz17bWFwT3B0aW9uczpnZW5lcmljTWFwT3B0aW9ucyxzaXplOm92 ZXJ2aWV3TWFwU2l6ZSxkaXY6JCgib3ZlcnZpZXciKSxsYXllcnM6W3JlZmVyZW5j aWFdfTt2YXIgb3ZDb250cm9sPW5ldyBPcGVuTGF5ZXJzLkNvbnRyb2wuT3ZlcnZp ZXdNYXAob3ZlcnZpZXdPcHRpb25zKTtvdkNvbnRyb2wuaXNTdWl0YWJsZU92ZXJ2 aWV3PWZ1bmN0aW9uKCl7cmV0dXJuIHRydWV9O3ZhciBtb3VzZVBvc2l0aW9uT3B0 aW9ucz17bnVtRGlnaXRzOjEscHJlZml4OiJFIChYKTogIixzZXBhcmF0b3I6IiBt IC0gTiAoWSk6ICIsc3VmZml4OiIgbSAifTt2YXIgc2NhbGVsaW5lPW5ldyBPcGVu TGF5ZXJzLkNvbnRyb2wuU2NhbGVMaW5lKHtib3R0b21PdXRVbml0czoiIn0pO3Zh ciBtb3VzZVBvc2l0aW9uPW5ldyBWaXNzaXIuTW91c2VQb3NpdGlvbihtb3VzZVBv c2l0aW9uT3B0aW9ucyk7dmFyIG1hcENsaWNrPW5ldyBWaXNzaXIuQ2xpY2soKTt2 YXIgbWFwQ2xpY2tNYXA9bmV3IFZpc3Npci5DbGlja01hcCgpO3ZhciBtYXBDbGlj a1ZlcnRleD1uZXcgVmlzc2lyLkNsaWNrVmVydGV4KCk7dmFyIG1hcENsaWNrQ2lt cz1uZXcgVmlzc2lyLkNsaWNrQ2ltcygpO3ZhciBtYXBDbGlja0Nvb3Jkcz1uZXcg Vmlzc2lyLkNsaWNrTWFwQ29vcmRzKCk7dmFyIGltcEtNTD1uZXcgVmlzc2lyLklt cG9ydEtNTCgpO3ZhciBleHBLTUw9bmV3IFZpc3Npci5FeHBvcnRLTUwoKTttYXAu YWRkQ29udHJvbChuYXZDb250cm9sKTttYXAuYWRkQ29udHJvbChvdkNvbnRyb2wp O21hcC5nZXRDb250cm9sc0J5Q2xhc3MoIk9wZW5MYXllcnMuQ29udHJvbC5PdmVy dmlld01hcCIpWzBdLm1heGltaXplQ29udHJvbCgpO21hcC5hZGRDb250cm9sKGlt cEtNTCk7bWFwLmFkZENvbnRyb2woZXhwS01MKTttYXAuYWRkQ29udHJvbChzY2Fs ZWxpbmUpO21hcC5hZGRDb250cm9sKG1vdXNlUG9zaXRpb24pO21hcC5hZGRDb250 cm9sKG1hcENsaWNrKTttYXAuYWRkQ29udHJvbChtYXBDbGlja01hcCk7bWFwLmFk ZENvbnRyb2wobWFwQ2xpY2tWZXJ0ZXgpO21hcC5hZGRDb250cm9sKG1hcENsaWNr Q2ltcyk7bWFwLmFkZENvbnRyb2wobWFwQ2xpY2tDb29yZHMpO25hdkNvbnRyb2wu YWN0aXZhdGUoKX07dmFyIGNyZWF0ZUJ1dHRvbnNFZGl0PWZ1bmN0aW9uKG1hcCl7 dmFyIGFjdGlvbnM9W107dmFyIGNyZWF0ZVNlcGFyYXRvcj1mdW5jdGlvbigpe2Fj dGlvbnMucHVzaCgiIil9O3ZhciBoYW5kbGVNZWFzdXJlbWVudEZyZWVoYW5kPWZ1 bmN0aW9uKGV2ZW50KXt2YXIgZ2VvbWV0cnk9ZXZlbnQuZ2VvbWV0cnk7dmFyIHVu aXRzPWV2ZW50LnVuaXRzO3ZhciBvcmRlcj1ldmVudC5vcmRlcjt2YXIgbWVhc3Vy ZT1ldmVudC5tZWFzdXJlO3ZhciBlbGVtZW50PWRvY3VtZW50LmdldEVsZW1lbnRC eUlkKCJtZWFzdXJlSW5mbyIpO3ZhciBjZW50cm9pZD1ldmVudC5nZW9tZXRyeS5n ZXRDZW50cm9pZCgpO2NlbnRyb2lkPWNlbnRyb2lkLngudG9GaXhlZCgyKSsiLCIr Y2VudHJvaWQueS50b0ZpeGVkKDIpO3ZhciBvdXQ9IiI7dmFyIGNvdGFBdXg9IiI7 aWYob3JkZXI9PTEpe291dCs9bG9uZ2l0dWQrIjogIittZWFzdXJlLnRvRml4ZWQo MikrIiAiK3VuaXRzKyIgIjt2YXIgaT1nZW9tZXRyeS5jb21wb25lbnRzLmxlbmd0 aC0xO3ZhciB4PWdlb21ldHJ5LmNvbXBvbmVudHNbaV0ueDt2YXIgeT1nZW9tZXRy eS5jb21wb25lbnRzW2ldLnk7T3BlbkxheWVycy5SZXF1ZXN0LkdFVCh7dXJsOiIv dmlzc2lyMy9waHAvcmVhZFdDUy5waHAiLHBhcmFtczp7eDp4LHk6eX0sY2FsbGJh Y2s6ZnVuY3Rpb24ocmVzcCl7dmFyIGNvdGE9cGFyc2VJbnQocmVzcC5yZXNwb25z ZVRleHQpO2RkLnB1c2goe2Nvb3Jkczp4KyIsIit5LEg6Y290YX0pO2lmKCF3aW5E VE0uaXNWaXNpYmxlKCkpe3dpbkRUTS5zaG93KCl9ZWxzZXt3aW5EVE0uaGlkZSgp O3dpbkRUTS5zaG93KCl9fX0pO3ZhciBmZWF0dXJlPW5ldyBPcGVuTGF5ZXJzLkZl YXR1cmUuVmVjdG9yKGdlb21ldHJ5KTt2ZWN0b3JMYXllci5hZGRGZWF0dXJlcyhb ZmVhdHVyZV0pO291dCs9RXh0LmdldENtcCgic3RhdHVzQmFyIikuYm9keS5kb20u Y2hpbGROb2Rlc1swXS50ZXh0Q29udGVudDtlbGVtZW50LmlubmVySFRNTD1vdXQ7 dGhpcy5oYW5kbGVyLmZyZWVoYW5kPXRydWV9fTt2YXIgaGFuZGxlTWVhc3VyZW1l bnQ9ZnVuY3Rpb24oZXZlbnQpe3ZhciBnZW9tZXRyeT1ldmVudC5nZW9tZXRyeTt2 YXIgdW5pdHM9ZXZlbnQudW5pdHM7dmFyIG9yZGVyPWV2ZW50Lm9yZGVyO3ZhciBt ZWFzdXJlPWV2ZW50Lm1lYXN1cmU7dmFyIGVsZW1lbnQ9ZG9jdW1lbnQuZ2V0RWxl bWVudEJ5SWQoIm1lYXN1cmVJbmZvIik7dmFyIGNlbnRyb2lkPWV2ZW50Lmdlb21l dHJ5LmdldENlbnRyb2lkKCk7Y2VudHJvaWQ9Y2VudHJvaWQueC50b0ZpeGVkKDIp KyIsIitjZW50cm9pZC55LnRvRml4ZWQoMik7dmFyIG91dD0iIjt2YXIgY290YUF1 eD0iIjtpZihvcmRlcj09MSl7b3V0Kz0iPGltZyBzcmM9J2FwcC9pbWcvbGluZXZl Y3Rvcmx5ci5wbmcnIC8+ICIrbG9uZ2l0dWQrIjogIittZWFzdXJlLnRvRml4ZWQo MikrIiAiK3VuaXRzKyIgIjt2YXIgaT1nZW9tZXRyeS5jb21wb25lbnRzLmxlbmd0 aC0xO3ZhciB4PWdlb21ldHJ5LmNvbXBvbmVudHNbaV0ueDt2YXIgeT1nZW9tZXRy eS5jb21wb25lbnRzW2ldLnk7dmFyIGZlYXR1cmU9bmV3IE9wZW5MYXllcnMuRmVh dHVyZS5WZWN0b3IoZ2VvbWV0cnkpO3ZlY3RvckxheWVyLmFkZEZlYXR1cmVzKFtm ZWF0dXJlXSk7b3V0Kz1FeHQuZ2V0Q21wKCJzdGF0dXNCYXIiKS5ib2R5LmRvbS5j aGlsZE5vZGVzWzBdLnRleHRDb250ZW50O2VsZW1lbnQuaW5uZXJIVE1MPW91dH1l bHNle2lmKGV2ZW50Lmdlb21ldHJ5LkNMQVNTX05BTUUhPSJPcGVuTGF5ZXJzLkdl b21ldHJ5LlBvaW50Iil7b3V0Kz0iPGltZyBzcmM9J2FwcC9pbWcvcG9seXZlY3Rv cmx5ci5wbmcnIC8+ICIrYXJlYVQrIjogIittZWFzdXJlLnRvRml4ZWQoMikrIiAi K3VuaXRzKyI8c3VwPjI8L3N1cD4gLSAiK2NlbnRyb2lkZSsiOiAiK2NlbnRyb2lk KyIgLSAiO3ZhciBmZWF0dXJlPW5ldyBPcGVuTGF5ZXJzLkZlYXR1cmUuVmVjdG9y KGdlb21ldHJ5KTt2ZWN0b3JMYXllci5hZGRGZWF0dXJlcyhbZmVhdHVyZV0pO291 dCs9RXh0LmdldENtcCgic3RhdHVzQmFyIikuYm9keS5kb20uY2hpbGROb2Rlc1sw XS50ZXh0Q29udGVudDtlbGVtZW50LmlubmVySFRNTD1vdXR9ZWxzZXtvdXQrPWNl bnRyb2lkZSsiOiAiK2NlbnRyb2lkKyIgLSAiO3ZhciB4PWdlb21ldHJ5Lng7dmFy IHk9Z2VvbWV0cnkueTt2YXIgZmVhdHVyZT1uZXcgT3BlbkxheWVycy5GZWF0dXJl LlZlY3RvcihnZW9tZXRyeSk7dmVjdG9yTGF5ZXIuYWRkRmVhdHVyZXMoW2ZlYXR1 cmVdKTtvdXQrPUV4dC5nZXRDbXAoInN0YXR1c0JhciIpLmJvZHkuZG9tLmNoaWxk Tm9kZXNbMF0udGV4dENvbnRlbnQ7ZWxlbWVudC5pbm5lckhUTUw9b3V0fX19O3Zh ciBoYW5kbGVNZWFzdXJlbWVudHM9ZnVuY3Rpb24oZXZlbnQpe3ZhciBnZW9tZXRy eT1ldmVudC5nZW9tZXRyeTt2YXIgdW5pdHM9ZXZlbnQudW5pdHM7dmFyIG9yZGVy PWV2ZW50Lm9yZGVyO3ZhciBtZWFzdXJlPWV2ZW50Lm1lYXN1cmU7dmFyIGVsZW1l bnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1lYXN1cmVJbmZvIik7dmFyIG91 dD0iIjtvdXQ9RXh0LmdldENtcCgic3RhdHVzQmFyIikuYm9keS5kb20uY2hpbGRO b2Rlc1swXS50ZXh0Q29udGVudDtpZihvcmRlcj09MSl7b3V0PSI8aW1nIHNyYz0n YXBwL2ltZy9saW5ldmVjdG9ybHlyLnBuZycgLz4gIitsb25naXR1ZCsiOiAiK21l YXN1cmUudG9GaXhlZCgyKSsiICIrdW5pdHMrIiAiO3ZhciBpPWdlb21ldHJ5LmNv bXBvbmVudHMubGVuZ3RoLTE7dmFyIHg9Z2VvbWV0cnkuY29tcG9uZW50c1tpXS54 O3ZhciB5PWdlb21ldHJ5LmNvbXBvbmVudHNbaV0ueX1lbHNle291dD0iPGltZyBz cmM9J2FwcC9pbWcvcG9seXZlY3Rvcmx5ci5wbmcnIC8+ICIrYXJlYVQrIjogIitt ZWFzdXJlLnRvRml4ZWQoMikrIiAiK3VuaXRzKyI8c3VwPjI8L3N1cD4gIn1lbGVt ZW50LmlubmVySFRNTD1vdXR9O3ZhciBoYW5kbGVNZWFzdXJlbWVudHNNb2RpZnll ZD1mdW5jdGlvbihldmVudCl7dmFyIGxlbmd0aD1ldmVudC5mZWF0dXJlLmdlb21l dHJ5LmdldExlbmd0aCgpO3ZhciBhcmVhPWV2ZW50LmZlYXR1cmUuZ2VvbWV0cnku Z2V0QXJlYSgpO3ZhciBjZW50cm9pZD1ldmVudC5mZWF0dXJlLmdlb21ldHJ5Lmdl dENlbnRyb2lkKCk7Y2VudHJvaWQ9Y2VudHJvaWQueC50b0ZpeGVkKDIpKyIsIitj ZW50cm9pZC55LnRvRml4ZWQoMik7dmFyIGVsZW1lbnQ9ZG9jdW1lbnQuZ2V0RWxl bWVudEJ5SWQoIm1lYXN1cmVJbmZvIik7dmFyIG91dD0iIjtpZihsZW5ndGghPTAp e291dD0iPGltZyBzcmM9J2FwcC9pbWcvbGluZXZlY3Rvcmx5ci5wbmcnIC8+ICIr bG9uZ2l0dWQrIjogIitsZW5ndGgudG9GaXhlZCgyKSsiICIrZXZlbnQub2JqZWN0 LnVuaXRzfWlmKGFyZWEhPTApe291dD0iPGltZyBzcmM9J2FwcC9pbWcvcG9seXZl Y3Rvcmx5ci5wbmcnIC8+ICIrYXJlYVQrIjogIithcmVhLnRvRml4ZWQoMikrIiAi K2V2ZW50Lm9iamVjdC51bml0cysiIDxzdXA+Mjwvc3VwPiAtICIrY2VudHJvaWRl KyI6ICIrY2VudHJvaWR9ZWxlbWVudC5pbm5lckhUTUw9b3V0fTtwb2ludGN0cmw9 bmV3IE9wZW5MYXllcnMuQ29udHJvbC5NZWFzdXJlKE9wZW5MYXllcnMuSGFuZGxl ci5Qb2ludCx7cGVyc2lzdDp0cnVlfSk7YWN0aW9uPW5ldyBHZW9FeHQuQWN0aW9u KHtjb250cm9sOnBvaW50Y3RybCx0b29sdGlwOmRpYnVpeGFyUFQsbWFwOm1hcCxp Y29uQ2xzOiJkcmF3cG9pbnQiLHRvZ2dsZUdyb3VwOiJlZGl0QnV0Iix0b2dnbGVI YW5kbGVyOmZ1bmN0aW9uKGFjdGlvbk9iaixjaGVja2VkKXtpZihjaGVja2VkKXtp bmZvY3RybC5kZWFjdGl2YXRlKCl9fX0pO2FjdGlvbi5jb250cm9sLmV2ZW50cy5v bih7bWVhc3VyZTpoYW5kbGVNZWFzdXJlbWVudCxtZWFzdXJlcGFydGlhbDpoYW5k bGVNZWFzdXJlbWVudHN9KTthY3Rpb25zLnB1c2goYWN0aW9uKTt2YXIgc2tldGNo U3ltYm9saXplcnM9e1BvaW50Ontwb2ludFJhZGl1czo2fSxMaW5lOntzdHJva2VX aWR0aDozLHN0cm9rZUNvbG9yOiIjMDBCOEJGIn0sUG9seWdvbjp7c3Ryb2tlV2lk dGg6Mn19O3ZhciBzdHlsZT1uZXcgT3BlbkxheWVycy5TdHlsZSgpO3N0eWxlLmFk ZFJ1bGVzKFtuZXcgT3BlbkxheWVycy5SdWxlKHtzeW1ib2xpemVyOnNrZXRjaFN5 bWJvbGl6ZXJzfSldKTt2YXIgc3R5bGVNb2RpPW5ldyBPcGVuTGF5ZXJzLlN0eWxl TWFwKHsiZGVmYXVsdCI6c3R5bGV9KTtjcmVhdGVTZXBhcmF0b3IoKTtsaW5lY3Ry bD1uZXcgT3BlbkxheWVycy5Db250cm9sLk1lYXN1cmUoT3BlbkxheWVycy5IYW5k bGVyLlBhdGgse3BlcnNpc3Q6dHJ1ZSxoYW5kbGVyT3B0aW9uczp7bGF5ZXJPcHRp b25zOntzdHlsZU1hcDpzdHlsZU1vZGl9fX0pO2FjdGlvbj1uZXcgR2VvRXh0LkFj dGlvbih7Y29udHJvbDpsaW5lY3RybCx0b29sdGlwOmRpYnVpeGFyTCxtYXA6bWFw LGljb25DbHM6ImRyYXdsaW5lIixpdGVtSWQ6ImJ1dExpbmUiLHRvZ2dsZUdyb3Vw OiJlZGl0QnV0Iix0b2dnbGVIYW5kbGVyOmZ1bmN0aW9uKGFjdGlvbk9iaixjaGVj a2VkKXtpZihjaGVja2VkKXtpbmZvY3RybC5kZWFjdGl2YXRlKCl9fX0pO2FjdGlv bi5jb250cm9sLmV2ZW50cy5vbih7bWVhc3VyZTpoYW5kbGVNZWFzdXJlbWVudCxt ZWFzdXJlcGFydGlhbDpoYW5kbGVNZWFzdXJlbWVudHN9KTthY3Rpb25zLnB1c2go YWN0aW9uKTtjcmVhdGVTZXBhcmF0b3IoKTtwb2x5Y3RybD1uZXcgT3BlbkxheWVy cy5Db250cm9sLk1lYXN1cmUoT3BlbkxheWVycy5IYW5kbGVyLlBvbHlnb24se3Bl cnNpc3Q6dHJ1ZX0pO2FjdGlvbj1uZXcgR2VvRXh0LkFjdGlvbih7Y29udHJvbDpw b2x5Y3RybCx0b29sdGlwOmRpYnVpeGFyUCxtYXA6bWFwLGljb25DbHM6ImRyYXdw b2x5Z29uIix0b2dnbGVHcm91cDoiZWRpdEJ1dCIsdG9nZ2xlSGFuZGxlcjpmdW5j dGlvbihhY3Rpb25PYmosY2hlY2tlZCl7aWYoY2hlY2tlZCl7aW5mb2N0cmwuZGVh Y3RpdmF0ZSgpfX19KTthY3Rpb24uY29udHJvbC5ldmVudHMub24oe21lYXN1cmU6 aGFuZGxlTWVhc3VyZW1lbnQsbWVhc3VyZXBhcnRpYWw6aGFuZGxlTWVhc3VyZW1l bnRzfSk7YWN0aW9ucy5wdXNoKGFjdGlvbik7Y3JlYXRlU2VwYXJhdG9yKCk7dmVj dG9yTGF5ZXIuZXZlbnRzLm9uKHthZnRlcmZlYXR1cmVtb2RpZmllZDpoYW5kbGVN ZWFzdXJlbWVudHNNb2RpZnllZCxmZWF0dXJlbW9kaWZpZWQ6aGFuZGxlTWVhc3Vy ZW1lbnRzTW9kaWZ5ZWR9KTt2YXIgbW9kaWZ5T3B0aW9ucz17bW9kZTpPcGVuTGF5 ZXJzLkNvbnRyb2wuTW9kaWZ5RmVhdHVyZS5SRVNIQVBFfE9wZW5MYXllcnMuQ29u dHJvbC5Nb2RpZnlGZWF0dXJlLkRSQUd8T3BlbkxheWVycy5Db250cm9sLk1vZGlm eUZlYXR1cmUuUk9UQVRFfTt2YXIgZXZlbnRMaXN0ZW5lcnM9e2FjdGl2YXRlOnRo aXMuY29udHJvbEFjdGl2YXRlZCxzY29wZTp0aGlzfTttb2R5Y3RybD1uZXcgT3Bl bkxheWVycy5Db250cm9sLk1vZGlmeUZlYXR1cmUodmVjdG9yTGF5ZXIse2V2ZW50 TGlzdGVuZXJzOmV2ZW50TGlzdGVuZXJzfSxtb2RpZnlPcHRpb25zKTthY3Rpb249 bmV3IEdlb0V4dC5BY3Rpb24oe2NvbnRyb2w6bW9keWN0cmwsdG9vbHRpcDptb2Rp ZmljYXJGLG1hcDptYXAsaWNvbkNsczoibW9kaWZ5ZmVhdHVyZSIsdG9nZ2xlR3Jv dXA6ImVkaXRCdXQiLHRvZ2dsZUhhbmRsZXI6ZnVuY3Rpb24oYWN0aW9uT2JqLGNo ZWNrZWQpe2lmKGNoZWNrZWQpe2luZm9jdHJsLmRlYWN0aXZhdGUoKX19fSk7YWN0 aW9ucy5wdXNoKGFjdGlvbik7Y3JlYXRlU2VwYXJhdG9yKCk7dmFyIGNvbnRyb2xP cHRpb25zPXtkaWFsZWc6bnVsbH07YWN0aW9uPW5ldyBHZW9FeHQuQWN0aW9uKHtj b250cm9sOm5ldyBWaXNzaXIuVGV4dGUodmVjdG9yTGF5ZXIsY29udHJvbE9wdGlv bnMpLHRvb2x0aXA6dG9vbHRpcFRleHRDb250cm9sLG1hcDptYXAsaWNvbkNsczoi dGV4dGZlYXR1cmUiLHRvZ2dsZUdyb3VwOiJlZGl0QnV0In0pO2FjdGlvbnMucHVz aChhY3Rpb24pO2NyZWF0ZVNlcGFyYXRvcigpO3ZhciBldmVudExpc3RlbmVycz17 YWN0aXZhdGU6dGhpcy5jb250cm9sQWN0aXZhdGVkLHNjb3BlOnRoaXN9O2RlbGV0 ZWN0cmw9bmV3IFZpc3Npci5Fc2JvcnJhKHZlY3RvckxheWVyLHtldmVudExpc3Rl bmVyczpldmVudExpc3RlbmVyc30pO2FjdGlvbj1uZXcgR2VvRXh0LkFjdGlvbih7 Y29udHJvbDpkZWxldGVjdHJsLHRvb2x0aXA6ZXNib3JyYXJGLG1hcDptYXAsaWNv bkNsczoicmVtb3ZlZmVhdHVyZSIsdG9nZ2xlR3JvdXA6ImVkaXRCdXQiLHRvZ2ds ZUhhbmRsZXI6ZnVuY3Rpb24oYWN0aW9uT2JqLGNoZWNrZWQpe2lmKGNoZWNrZWQp e2luZm9jdHJsLmRlYWN0aXZhdGUoKX19fSk7YWN0aW9ucy5wdXNoKGFjdGlvbik7 cmV0dXJuIGFjdGlvbnN9O3ZhciBjcmVhdGVCdXR0b25zRWRpdDI9ZnVuY3Rpb24o bWFwKXt2YXIgYWN0aW9ucz1bXTt2YXIgY3JlYXRlU2VwYXJhdG9yPWZ1bmN0aW9u KCl7YWN0aW9ucy5wdXNoKCIiKX07dmFyIGV2ZW50TGlzdGVuZXJzPXthY3RpdmF0 ZTp0aGlzLmNvbnRyb2xBY3RpdmF0ZWQsc2NvcGU6dGhpc307ZGVsZXRlY3RybD1u ZXcgVmlzc2lyLkVzYm9ycmEodmVjdG9yTGF5ZXIse2V2ZW50TGlzdGVuZXJzOmV2 ZW50TGlzdGVuZXJzfSk7YWN0aW9uPW5ldyBHZW9FeHQuQWN0aW9uKHtjb250cm9s OmRlbGV0ZWN0cmwsdG9vbHRpcDplc2JvcnJhckYsbWFwOm1hcCxpY29uQ2xzOiJy ZW1vdmVmZWF0dXJlIix0b2dnbGVHcm91cDoiZWRpdEJ1dCIsdG9nZ2xlSGFuZGxl cjpmdW5jdGlvbihhY3Rpb25PYmosY2hlY2tlZCl7aWYoY2hlY2tlZCl7aW5mb2N0 cmwuZGVhY3RpdmF0ZSgpfX19KTthY3Rpb25zLnB1c2goYWN0aW9uKTtyZXR1cm4g YWN0aW9uc307dmFyIGNyZWF0ZVRiYXJJdGVtcz1mdW5jdGlvbihtYXApe3ZhciBh Y3Rpb25zPVtdO3ZhciBjcmVhdGVTZXBhcmF0b3I9ZnVuY3Rpb24oKXthY3Rpb25z LnB1c2goIiAiKTthY3Rpb25zLnB1c2goIi0iKTthY3Rpb25zLnB1c2goIiAiKX07 YWN0aW9ucy5wdXNoKG5ldyBHZW9FeHQuQWN0aW9uKHtjb250cm9sOm5ldyBPcGVu TGF5ZXJzLkNvbnRyb2wuWm9vbVRvTWF4RXh0ZW50KCksbWFwOm1hcCxpY29uQ2xz OiJ6b29tZnVsbCIsdG9vbHRpcDp2aXN0YUl9KSk7Y3JlYXRlU2VwYXJhdG9yKCk7 YWN0aW9ucy5wdXNoKG5ldyBHZW9FeHQuQWN0aW9uKHtpY29uQ2xzOiJwYW4iLG1h cDptYXAscHJlc3NlZDp0cnVlLHRvZ2dsZUdyb3VwOiJ0b29scyIsYWxsb3dEZXBy ZXNzOnRydWUsdG9vbHRpcDpuYXZlZ2FyLGNvbnRyb2w6bmV3IE9wZW5MYXllcnMu Q29udHJvbCgpfSkpO2FjdGlvbnMucHVzaChuZXcgR2VvRXh0LkFjdGlvbih7aWNv bkNsczoiem9vbWluIixtYXA6bWFwLHRvZ2dsZUdyb3VwOiJ0b29scyIsYWxsb3dE ZXByZXNzOnRydWUsdG9vbHRpcDp6b29taW4sY29udHJvbDpuZXcgT3BlbkxheWVy cy5Db250cm9sLlpvb21Cb3goe291dDpmYWxzZX0pfSkpO2FjdGlvbnMucHVzaChu ZXcgR2VvRXh0LkFjdGlvbih7aWNvbkNsczoiem9vbW91dCIsbWFwOm1hcCx0b2dn bGVHcm91cDoidG9vbHMiLGFsbG93RGVwcmVzczp0cnVlLHRvb2x0aXA6em9vbW91 dCxjb250cm9sOm5ldyBPcGVuTGF5ZXJzLkNvbnRyb2wuWm9vbUJveCh7b3V0OnRy dWV9KX0pKTt2YXIgY3RybD1uZXcgT3BlbkxheWVycy5Db250cm9sLk5hdmlnYXRp b25IaXN0b3J5KCk7bWFwLmFkZENvbnRyb2woY3RybCk7YWN0aW9ucy5wdXNoKG5l dyBHZW9FeHQuQWN0aW9uKHtjb250cm9sOmN0cmwucHJldmlvdXMsaWNvbkNsczoi YmFjayIsdG9vbHRpcDp2aXN0YUEsZGlzYWJsZWQ6dHJ1ZX0pKTthY3Rpb25zLnB1 c2gobmV3IEdlb0V4dC5BY3Rpb24oe2NvbnRyb2w6Y3RybC5uZXh0LGljb25DbHM6 Im5leHQiLHRvb2x0aXA6dmlzdGFTLGRpc2FibGVkOnRydWV9KSk7Y3JlYXRlU2Vw YXJhdG9yKCk7ZG93bGRjdHJsPW5ldyBPcGVuTGF5ZXJzLkNvbnRyb2woKTthY3Rp b249bmV3IEdlb0V4dC5BY3Rpb24oe2NvbnRyb2w6ZG93bGRjdHJsLHRvb2x0aXA6 ZGVzY2FycmVnYSxpZDoiZHdsYnRuIixtYXA6bWFwLGljb25DbHM6ImRvd2xkYnV0 dG9uIix0b2dnbGVHcm91cDoidG9vbHMiLHRvZ2dsZUhhbmRsZXI6ZnVuY3Rpb24o YWN0aW9uT2JqLGNoZWNrZWQpe2lmKGNoZWNrZWQpe3ZhciBkaXNwbGF5PUV4dC5n ZXQoInByb2RfY2xpY2siKS5nZXRTdHlsZSgiZGlzcGxheSIpO2lmKGRpc3BsYXk9 PSJibG9jayIpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwcm9kX2NsaWNrIiku c3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBy b2RfaW5kZXgiKS5zdHlsZS5kaXNwbGF5PSJibG9jayJ9bWFwLmdldENvbnRyb2xz QnlDbGFzcygiVmlzc2lyLkNsaWNrIilbMF0uZGVhY3RpdmF0ZSgpO21hcC5nZXRD b250cm9sc0J5Q2xhc3MoIlZpc3Npci5DbGlja01hcCIpWzBdLmFjdGl2YXRlKCk7 RXh0LmdldENtcCgid2VzdC1wYW5lbCIpLml0ZW1zLmtleSgiZG93bmxvYWQtZGl2 IikuZXhwYW5kKCl9ZWxzZXttYXAuZ2V0Q29udHJvbHNCeUNsYXNzKCJWaXNzaXIu Q2xpY2siKVswXS5kZWFjdGl2YXRlKCk7bWFwLmdldENvbnRyb2xzQnlDbGFzcygi Vmlzc2lyLkNsaWNrTWFwIilbMF0uZGVhY3RpdmF0ZSgpfX19KTthY3Rpb25zLnB1 c2goYWN0aW9uKTtpbmZvY3RybD1uZXcgT3BlbkxheWVycy5Db250cm9sKCk7YWN0 aW9uPW5ldyBHZW9FeHQuQWN0aW9uKHtjb250cm9sOmluZm9jdHJsLHRvb2x0aXA6 aW5mb3Rvb2x0aXAsaWQ6ImluZm9idG4iLG1hcDptYXAsaWNvbkNsczoiaW5mb2J1 dHRvbiIsdG9nZ2xlR3JvdXA6InRvb2xzIix0b2dnbGVIYW5kbGVyOmZ1bmN0aW9u KGFjdGlvbk9iaixjaGVja2VkKXt2YXIgc3RhdHVzQmFyVGV4dD1kb2N1bWVudC5n ZXRFbGVtZW50QnlJZCgibWVhc3VyZUluZm8iKTtpZihjaGVja2VkKXt2YXIgbHly U0c9bWFwLmdldExheWVyc0J5TmFtZSgic2VueWFsc2dlbyIpWzBdO2lmKGx5clNH LnZpc2liaWxpdHkpe21hcC5nZXRDb250cm9sc0J5Q2xhc3MoIlZpc3Npci5DbGlj a1ZlcnRleCIpWzBdLmFjdGl2YXRlKCk7c3RhdHVzQmFyVGV4dC5pbm5lckhUTUw9 IiI7c3RhdHVzQmFyVGV4dC5pbm5lckhUTUw9IjxpbWcgc3JjPSdpbWcvdHJlZUlj b25zL3B1bnRzX2dlby5wbmcnIGNsYXNzPSdpbWdTdGF0dXNCYXInIC8+Jm5ic3A7 Iittc2dWZXJ0ZXhzSW5mb0NsaWNrO3BvaW50Y3RybC5kZWFjdGl2YXRlKCk7bGlu ZWN0cmwuZGVhY3RpdmF0ZSgpO3BvbHljdHJsLmRlYWN0aXZhdGUoKTttb2R5Y3Ry bC5kZWFjdGl2YXRlKCk7ZGVsZXRlY3RybC5kZWFjdGl2YXRlKCl9dmFyIGx5ckM9 bWFwLmdldExheWVyc0J5TmFtZSgiQ2ltcyIpWzBdO2lmKGx5ckMudmlzaWJpbGl0 eSl7bWFwLmdldENvbnRyb2xzQnlDbGFzcygiVmlzc2lyLkNsaWNrQ2ltcyIpWzBd LmFjdGl2YXRlKCk7c3RhdHVzQmFyVGV4dC5pbm5lckhUTUw9IiI7c3RhdHVzQmFy VGV4dC5pbm5lckhUTUw9IjxpbWcgc3JjPSdpbWcvdHJlZUljb25zL2NpbXMucG5n JyBjbGFzcz0naW1nU3RhdHVzQmFyJyAvPiZuYnNwOyIrbXNnQ2ltc0luZm9DbGlj a31pZighbHlyQy52aXNpYmlsaXR5JiYhbHlyU0cudmlzaWJpbGl0eSl7bWFwLmdl dENvbnRyb2xzQnlDbGFzcygiVmlzc2lyLkNsaWNrTWFwQ29vcmRzIilbMF0uYWN0 aXZhdGUoKX19ZWxzZXttYXAuZ2V0Q29udHJvbHNCeUNsYXNzKCJWaXNzaXIuQ2xp Y2tWZXJ0ZXgiKVswXS5kZWFjdGl2YXRlKCk7bWFwLmdldENvbnRyb2xzQnlDbGFz cygiVmlzc2lyLkNsaWNrQ2ltcyIpWzBdLmRlYWN0aXZhdGUoKTttYXAuZ2V0Q29u dHJvbHNCeUNsYXNzKCJWaXNzaXIuQ2xpY2tNYXBDb29yZHMiKVswXS5kZWFjdGl2 YXRlKCk7c3RhdHVzQmFyVGV4dC5pbm5lckhUTUw9IiJ9fX0pO2FjdGlvbnMucHVz aChhY3Rpb24pO2FjdGlvbj1uZXcgR2VvRXh0LkFjdGlvbih7dG9vbHRpcDpub3Rp ZmljYXJFLGljb25DbHM6InJlcG9ydF9lcnJvciIsaGFuZGxlcjpmdW5jdGlvbigp e19nYXEucHVzaChbIl90cmFja0V2ZW50Iiwidmlzc2lyIiwicmVwb3J0RXJyb3Ii XSk7dmFyIGRhZGVzX25vdGlmaWNhckxsaXN0YVJlbGFjaW9ucz1bWyJwcm9waWV0 YXJpIixwcm9waWV0YXJpXSxbInZlw60iLHZlaV0sWyJjb25laXhlZG9yIixjb25l aXhlZG9yXSxbImFsdHJlcyIsYWx0cmVzXV07dmFyIG5vdGlmaWNhckxsaXN0YVJl bGFjaW9ucz1uZXcgRXh0LmRhdGEuU2ltcGxlU3RvcmUoe2ZpZWxkczpbImlkIiwi ZGVzIl0sZGF0YTpkYWRlc19ub3RpZmljYXJMbGlzdGFSZWxhY2lvbnN9KTt2YXIg Zm9ybVBhbmVsPW5ldyBFeHQuRm9ybVBhbmVsKHt4dHlwZToiZm9ybSIsYm9keVN0 eWxlOiJwYWRkaW5nOjE1cHgiLGF1dG9TY3JvbGw6dHJ1ZSxpZDoiZm9ybXBhbmVs IixkZWZhdWx0VHlwZToiZmllbGQiLGZyYW1lOnRydWUsaXRlbXM6W3t4dHlwZToi Ym94IixhdXRvRWw6e3RhZzoiZGl2IixodG1sOmRlc2NyaXBOb3RpZmljYXJ9fSx7 eHR5cGU6ImhpZGRlbiIsbmFtZToiZXJyb3JYIix2YWx1ZToiIn0se3h0eXBlOiJo aWRkZW4iLG5hbWU6ImVycm9yWSIsdmFsdWU6IiJ9LHt4dHlwZToiaGlkZGVuIixu YW1lOiJzZXJpZSIsdmFsdWU6IiJ9LHt4dHlwZToiaGlkZGVuIixuYW1lOiJ0byIs dmFsdWU6IiJ9LHtmaWVsZExhYmVsOm5vbWNvZ25vbSx3aWR0aDoiMTUwIixuYW1l OiJ0eHROb20iLHZhbHVlOiIifSx7eHR5cGU6ImNvbWJvIixzdG9yZTpub3RpZmlj YXJMbGlzdGFSZWxhY2lvbnMsZGlzcGxheUZpZWxkOiJkZXMiLGZpZWxkTGFiZWw6 cmVsYWNpb0luZHJldCx0eXBlQWhlYWQ6dHJ1ZSxtb2RlOiJsb2NhbCIsdHJpZ2dl ckFjdGlvbjoiYWxsIixuYW1lOiJzZWxSZWxhY2lvIn0se2ZpZWxkTGFiZWw6IkUt bWFpbCIsd2lkdGg6IjE1MCIsbmFtZToiZnJvbSJ9LHtmaWVsZExhYmVsOmRlc2Ny aXBFcnJvcix4dHlwZToidGV4dGFyZWEiLG5hbWU6InR4dFJlcG9ydCIsaGVpZ2h0 OiI1MCIsYW5jaG9yOiIxMDAlIn1dLGJ1dHRvbnM6W3t0ZXh0OmVzYm9ycmFyLGhh bmRsZXI6ZnVuY3Rpb24oKXtmb3JtUGFuZWwuZ2V0Rm9ybSgpLnJlc2V0KCl9fSx7 dGV4dDplbnZpYXIsaGFuZGxlcjpzdWJtaXRGb3JtUmVwb3J0RXJyb3J9XX0pO3Zh ciBub3RpZmljYXJEaWFsb2c9bmV3IEV4dC5XaW5kb3coe2lkOiJub3RpZmljYXJE aWFsb2ciLHRpdGxlOm5vdGlmaWNhckVycm9yLGF1dG9IZWlnaHQ6dHJ1ZSx3aWR0 aDozNTAsaW5pdENlbnRlcjpmYWxzZSx4OjEwMCx5OjEwMCxsaXN0ZW5lcnM6e3No b3c6ZnVuY3Rpb24oKXthZmVnaXJJY29uYU5vdGlmaWNhckVycm9yKCl9LGhpZGU6 ZnVuY3Rpb24oKXttYXAucmVtb3ZlQ29udHJvbChtYXAuZ2V0Q29udHJvbHNCeUNs YXNzKCJPcGVuTGF5ZXJzLkNvbnRyb2wuRHJhZ0ZlYXR1cmUiKVswXSk7bWFwLnJl bW92ZUxheWVyKG1hcC5nZXRMYXllcnNCeU5hbWUoImx5TWFya2VyIilbMF0pfX0s aXRlbXM6W2Zvcm1QYW5lbF19KTtub3RpZmljYXJEaWFsb2cuc2hvdygpfX0pO2Fj dGlvbnMucHVzaChhY3Rpb24pO2Z1bmN0aW9uIHJlbW92ZURpYWNyaXRpY3Mocyl7 dmFyIGRpYWNyaXRpY3M9W1svW1wzMDAtXDMwNl0vZywiQSJdLFsvW1wzNDAtXDM0 Nl0vZywiYSJdLFsvW1wzMTAtXDMxM10vZywiRSJdLFsvW1wzNTAtXDM1M10vZywi ZSJdLFsvW1wzMTQtXDMxN10vZywiSSJdLFsvW1wzNTQtXDM1N10vZywiaSJdLFsv W1wzMjItXDMzMF0vZywiTyJdLFsvW1wzNjItXDM3MF0vZywibyJdLFsvW1wzMzEt XDMzNF0vZywiVSJdLFsvW1wzNzEtXDM3NF0vZywidSJdLFsvW1wzMjFdL2csIk4i XSxbL1tcMzYxXS9nLCJuIl0sWy9bXDMwN10vZywiQyJdLFsvW1wzNDddL2csImMi XSxdO2Zvcih2YXIgaT0wO2k8ZGlhY3JpdGljcy5sZW5ndGgtMTtpKyspe3M9cy5y ZXBsYWNlKGRpYWNyaXRpY3NbaV1bMF0sZGlhY3JpdGljc1tpXVsxXSl9cmV0dXJu IHN9aWYocHJpbnRDYXBhYmlsaXRpZXMpe2NyZWF0ZVNlcGFyYXRvcigpO2FjdGlv bj1uZXcgR2VvRXh0LkFjdGlvbih7dG9vbHRpcDppbXByaW1pcixpY29uQ2xzOiJw cmludCIsaGFuZGxlcjpmdW5jdGlvbigpe19nYXEucHVzaChbIl90cmFja0V2ZW50 Iiwidmlzc2lyIiwicHJpbnQiXSk7dmFyIHByaW50RGlhbG9nPW5ldyBFeHQuV2lu ZG93KHt0aXRsZTp0aXRsZVByaW50LGF1dG9IZWlnaHQ6ZmFsc2Usd2lkdGg6MzUw LGhlaWdodDoxNzAscmVzaXphYmxlOmZhbHNlLGxpc3RlbmVyczp7aGlkZTpmdW5j dGlvbigpe3BhZ2VMYXllci5zZXRWaXNpYmlsaXR5KGZhbHNlKX19LGl0ZW1zOlt7 aHRtbDpub3Rlc30se3h0eXBlOiJ0ZXh0YXJlYSIsb3ZlcmZsb3c6ImhpZGRlbiIs bmFtZToiY29tbWVudCIsdmFsdWU6IiIsd2lkdGg6IjM2MCIsaGVpZ2h0OiI2MCIs cGx1Z2luczpuZXcgR2VvRXh0LnBsdWdpbnMuUHJpbnRQYWdlRmllbGQoe3ByaW50 UGFnZTpwcmludFBhZ2V9KX0se2h0bWw6cm90YX0se3h0eXBlOiJ0ZXh0ZmllbGQi LG5hbWU6InJvdGF0aW9uIixmaWVsZExhYmVsOnJvdGFjaW8sdmFsdWU6IjAiLHBs dWdpbnM6bmV3IEdlb0V4dC5wbHVnaW5zLlByaW50UGFnZUZpZWxkKHtwcmludFBh Z2U6cHJpbnRQYWdlfSl9XSxiYmFyOlt7dGV4dDpnZW5lcmFyUERGLGhhbmRsZXI6 ZnVuY3Rpb24oKXtsaW5lY3RybC5kZWFjdGl2YXRlKCk7cG9seWN0cmwuZGVhY3Rp dmF0ZSgpO3ByaW50UGFnZS5maXQobWFwUGFuZWwse21vZGU6InNjcmVlbiJ9KTt2 YXIgcz1wcmludFBhZ2UuY3VzdG9tUGFyYW1zLmNvbW1lbnQ7cHJpbnRQYWdlLmN1 c3RvbVBhcmFtcy5jb21tZW50PXJlbW92ZURpYWNyaXRpY3Mocyk7cHJpbnRQcm92 aWRlci5wcmludChtYXBQYW5lbCxwcmludFBhZ2UpfX1dfSk7cHJpbnRQYWdlLmZp dChtYXBQYW5lbCx7bW9kZToic2NyZWVuIn0pO3BhZ2VMYXllci5zZXRWaXNpYmls aXR5KHRydWUpO3ByaW50RGlhbG9nLnNob3coKX19KTthY3Rpb25zLnB1c2goYWN0 aW9uKX1hY3Rpb249bmV3IEdlb0V4dC5BY3Rpb24oe3Rvb2x0aXA6ZW5sbGFjYXIs aWNvbkNsczoicGVybWFsaW5rQ29udHJvbCIsbWFwOm1hcCxoYW5kbGVyOmZ1bmN0 aW9uKCl7X2dhcS5wdXNoKFsiX3RyYWNrRXZlbnQiLCJ2aXNzaXIiLCJwZXJtYWxp bmsiXSk7cGVybWFsaW5rX3dpbi5zaG93KCl9fSk7YWN0aW9ucy5wdXNoKGFjdGlv bik7YWN0aW9uPW5ldyBHZW9FeHQuQWN0aW9uKHt0b29sdGlwOmhlbHAsaWNvbkNs czoiaGVscENvbnRyb2wiLG1hcDptYXAsaGFuZGxlcjpmdW5jdGlvbigpe19nYXEu cHVzaChbIl90cmFja0V2ZW50Iiwidmlzc2lyIiwiYWp1ZGEiLEFwcC5sYXlvdXQu aWRpb21hXSk7d2luZG93Lm9wZW4oImh0dHA6Ly93d3cuaWNjLmNhdC9jYXQvSG9t ZS1JQ0MvTWFwZXMtZm90b3MtYWVyaWVzL1ZldXJlLWktZGVzY2FycmVnYXIvQWp1 ZGEtVklTU0lSMyIsImFqdWRhIil9fSk7YWN0aW9ucy5wdXNoKGFjdGlvbik7cmV0 dXJuIGFjdGlvbnN9O3ZhciBzZW55YWxzQU5EY2ltc0lzSGlkZT1mdW5jdGlvbigp e3ZhciBseT1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJzZW55YWxzZ2VvIilbMF07dmFy IGx5Q2ltcz1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJDaW1zIilbMF07aWYoIWx5LnZp c2liaWxpdHkmJiFseUNpbXMudmlzaWJpbGl0eSl7cmV0dXJuIHRydWV9fTt2YXIg ZGQ9W107dmFyIHN0b3JlPW5ldyBFeHQuZGF0YS5Kc29uU3RvcmUoe2ZpZWxkczpb ImNvb3JkcyIsIkgiXSxkYXRhOmRkfSk7dmFyIGxpbmVDaGFydERUTT1uZXcgRXh0 LlBhbmVsKHt3aWR0aDo0NTAsaGVpZ2h0OjI1MCxsYXlvdXQ6ImZpdCIsaXRlbXM6 e3h0eXBlOiJsaW5lY2hhcnQiLHN0b3JlOnN0b3JlLHhGaWVsZDoiY29vcmRzIix5 RmllbGQ6IkgiLHRpcFJlbmRlcmVyOmZ1bmN0aW9uKGNoYXJ0LHJlY29yZCl7cmV0 dXJuIkNvb3JkZW5hZGE6ICIrcmVjb3JkLmRhdGEuY29vcmRzKyJcbkNvdGE6ICIr cmVjb3JkLmRhdGEuSCsiIG0uIn0sY2hhcnRTdHlsZTp7cGFkZGluZzoxMCxhbmlt YXRpb25FbmFibGVkOnRydWUsZm9udDp7Y29sb3I6NDQ3MzkyNCxzaXplOjExfSxk YXRhVGlwOntwYWRkaW5nOjUsYm9yZGVyOntjb2xvcjoiIzAwQjhCRiIsc2l6ZTox fSxiYWNrZ3JvdW5kOntjb2xvcjoxNDAyNDQ0NyxhbHBoYTowLjl9LGZvbnQ6e2Nv bG9yOjI1NzAyLHNpemU6MTAsYm9sZDp0cnVlfX0seEF4aXM6e2NvbG9yOjY5MjUy NTYsbWFqb3JUaWNrczp7Y29sb3I6NjkyNTI1NixsZW5ndGg6NH0sbWlub3JUaWNr czp7Y29sb3I6MTUyMDAwNjcsbGVuZ3RoOjJ9LG1pbm9yR3JpZExpbmVzOntzaXpl OjEsY29sb3I6MjU1fSxzaG93TGFiZWxzOnRydWUsbGFiZWxSb3RhdGlvbjo0NX0s eUF4aXM6e2NvbG9yOjY5MjUyNTYsbWFqb3JUaWNrczp7Y29sb3I6NjkyNTI1Nixs ZW5ndGg6NH0sbWlub3JUaWNrczp7Y29sb3I6NjkyNTI1NixsZW5ndGg6Mn0sbWFq b3JHcmlkTGluZXM6e3NpemU6Mixjb2xvcjoxNDY3NDE2Nn0sbWlub3JHcmlkTGlu ZXM6e3NpemU6MSxjb2xvcjoxNDY3NDE2Nn19fSxzZXJpZXM6W3t0eXBlOiJsaW5l IixzdHlsZTp7Y29sb3I6IiMwMEI4QkYiLHNpemU6NH19XX19KTt2YXIgd2luRFRN PW5ldyBFeHQuV2luZG93KHtsYXlvdXQ6ImZpdCIsY2xvc2VBY3Rpb246ImhpZGUi LHBsYWluOnRydWUsaXRlbXM6W2xpbmVDaGFydERUTV0saGVpZ2h0OjMwMCx3aWR0 aDo0NzAseTo0MDAsdGl0bGU6IkNvdGEgYWx0aW0mIzIzMjt0cmljYSAoSCkiLGxp c3RlbmVyczp7c2hvdzpmdW5jdGlvbigpe3N0b3JlLmxvYWREYXRhKGRkKTtkZC5s ZW5ndGg9MH0saGlkZTpmdW5jdGlvbigpe319fSk7dmFyIHNob3dMZWdlbmQ9ZnVu Y3Rpb24oKXt2YXIgd2luRGlzcG9uaWJsZXM9bmV3IEV4dC5XaW5kb3coe2F1dG9I ZWlnaHQ6ZmFsc2Usd2lkdGg6MTAwMCxoZWlnaHQ6MzgwLHJlc2l6YWJsZTpmYWxz ZSxjbG9zZUFjdGlvbjoiaGlkZSIsaXRlbXM6W3todG1sOic8aWZyYW1lIHdpZHRo PSI0MjUiIGhlaWdodD0iMzUwIiBmcmFtZWJvcmRlcj0iMCIgc2Nyb2xsaW5nPSJu byIgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMCIgc3JjPSJodHRwOi8v d3d3LmljYy5jYXQvbXNwcm9kdWNjaW8vaW5kZXguaHRtbD96b29tPTAmbGF0PTQ2 MTg1MDAmbG9uPTM5NzAwMCZsYXllcnM9QjBGVEZGRkZGRkYmZW1iZWRkZWQ9dHJ1 ZSIgPjwvaWZyYW1lPid9XX0pO3dpbkRpc3BvbmlibGVzLnNob3coKX07dmFyIGNs aWNrTGlzdGVuZXI9ZnVuY3Rpb24oKXt9O3ZhciBhZmVnaXJJY29uYU5vdGlmaWNh ckVycm9yPWZ1bmN0aW9uKCl7bGF5ZXJNYXJrZXI9bmV3IE9wZW5MYXllcnMuTGF5 ZXIuVmVjdG9yKCJseU1hcmtlciIse3N0eWxlTWFwOm5ldyBPcGVuTGF5ZXJzLlN0 eWxlTWFwKHtleHRlcm5hbEdyYXBoaWM6Ii4vYXBwL2ltZy9tYXJrZXItZ29sZC5w bmciLGJhY2tncm91bmRHcmFwaGljOiIuL2FwcC9pbWcvbWFya2VyX3NoYWRvdy5w bmciLGJhY2tncm91bmRYT2Zmc2V0OjAsYmFja2dyb3VuZFlPZmZzZXQ6LTcscG9p bnRSYWRpdXM6MTh9KSxkaXNwbGF5SW5MYXllclN3aXRjaGVyOmZhbHNlfSk7bWFw LmFkZExheWVycyhbbGF5ZXJNYXJrZXJdKTt2YXIgZHJhZ0ZlYXR1cmU9bmV3IE9w ZW5MYXllcnMuQ29udHJvbC5EcmFnRmVhdHVyZShsYXllck1hcmtlcik7bWFwLmFk ZENvbnRyb2woZHJhZ0ZlYXR1cmUpO2RyYWdGZWF0dXJlLmFjdGl2YXRlKCk7bGF5 ZXJNYXJrZXIucmVtb3ZlRmVhdHVyZXMobGF5ZXJNYXJrZXIuZmVhdHVyZXMpO3Zh ciBjZW50ZXI9bWFwLmdldFZpZXdQb3J0UHhGcm9tTG9uTGF0KG1hcC5nZXRDZW50 ZXIoKSk7dmFyIHBpeGVsPW5ldyBPcGVuTGF5ZXJzLlBpeGVsKGNlbnRlci54LGNl bnRlci55KTt2YXIgbG9uTGF0TWFya2VyPW1hcC5nZXRMb25MYXRGcm9tVmlld1Bv cnRQeChwaXhlbCk7dmFyIHBvaW50RmVhdHVyZT1uZXcgT3BlbkxheWVycy5GZWF0 dXJlLlZlY3RvcihuZXcgT3BlbkxheWVycy5HZW9tZXRyeS5Qb2ludChsb25MYXRN YXJrZXIubG9uLGxvbkxhdE1hcmtlci5sYXQpKTtsYXllck1hcmtlci5hZGRGZWF0 dXJlcyhbcG9pbnRGZWF0dXJlXSl9O3ZhciBzdWJtaXRGb3JtUmVwb3J0RXJyb3I9 ZnVuY3Rpb24oKXt2YXIgdl90eHROb209RXh0LmdldENtcCgiZm9ybXBhbmVsIiku Z2V0Rm9ybSgpLmZpbmRGaWVsZCgidHh0Tm9tIikuZ2V0VmFsdWUoKTt2YXIgdl9m cm9tPUV4dC5nZXRDbXAoImZvcm1wYW5lbCIpLmdldEZvcm0oKS5maW5kRmllbGQo ImZyb20iKS5nZXRWYWx1ZSgpO3ZhciB2X3R4dFJlcG9ydD1FeHQuZ2V0Q21wKCJm b3JtcGFuZWwiKS5nZXRGb3JtKCkuZmluZEZpZWxkKCJ0eHRSZXBvcnQiKS5nZXRW YWx1ZSgpO3ZhciB2X3RvPUV4dC5nZXRDbXAoImZvcm1wYW5lbCIpLmdldEZvcm0o KS5maW5kRmllbGQoInRvIikuZ2V0VmFsdWUoKTt2YXIgdl9zZWxSZWxhY2lvPUV4 dC5nZXRDbXAoImZvcm1wYW5lbCIpLmdldEZvcm0oKS5maW5kRmllbGQoInNlbFJl bGFjaW8iKS5nZXRWYWx1ZSgpO2lmKHZfdHh0Tm9tIT0iIiYmdl9mcm9tIT0iIiYm dl90eHRSZXBvcnQhPSIiKXt2YXIgc2NlbmVJbmZvVGV4dD1tYXAuZ2V0Q29udHJv bHNCeUNsYXNzKCJWaXNzaXIuU2NlbmVJbmZvIilbMF0uaW5mb1swXTt2YXIgZGZD b250cm9sPW1hcC5nZXRDb250cm9sc0J5Q2xhc3MoIk9wZW5MYXllcnMuQ29udHJv bC5EcmFnRmVhdHVyZSIpWzBdO2lmKGRmQ29udHJvbC5sYXN0UGl4ZWwhPW51bGwp e3ZhciBFcnJvclhZPW1hcC5nZXRMb25MYXRGcm9tUGl4ZWwoZGZDb250cm9sLmxh c3RQaXhlbCl9ZWxzZXt2YXIgRXJyb3JYWT1tYXAuZ2V0Q2VudGVyKCl9dmFyIHBh cj17dG86dl90byx0eHROb206dl90eHROb20sc2VsUmVsYWNpbzp2X3NlbFJlbGFj aW8sZnJvbTp2X2Zyb20sdHh0UmVwb3J0OnZfdHh0UmVwb3J0LGVycm9yWDpFcnJv clhZLmxvbixlcnJvclk6RXJyb3JYWS5sYXQsc2VyaWU6c2NlbmVJbmZvVGV4dC5u b219O3ZhciB1cmw9Ii92aXNzaXIyc2VydmVpcy9TZW5kTWFpbFNlcnZsZXQiO25l dyBPcGVuTGF5ZXJzLkFqYXguUmVxdWVzdCh1cmwse21ldGhvZDoicG9zdCIsY29u dGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIscGFy YW1ldGVyczpwYXIsb25TdWNjZXNzOmZ1bmN0aW9uKHJlc3Ape3ZhciBzSFRNTD0n PGRpdiBzdHlsZT0icGFkZGluZzoxMHB4OyI+PHN0cm9uZz5MJiMzOTtlbnZpYW1l bnQgcyYjMzk7aGEgZWZlY3R1YXQgY29ycmVjdGFtZW50Ljwvc3Ryb25nPjxiciAv PjxiciAvPlVzIGFncmEmaXVtbDttIGxhIHZvc3RyYSBjb2wmbWlkZG90O2xhYm9y YWNpJm9hY3V0ZTsuJztFeHQuTXNnLmFsZXJ0KCJOb3RpZmljYXIgZXJyb3IgY2Fy dG9nciZhZ3JhdmU7ZmljIixzSFRNTCk7dmFyIG53PUV4dC5nZXRDbXAoIm5vdGlm aWNhckRpYWxvZyIpO253LmNsb3NlKCl9LG9uRmFpbHVyZTpmdW5jdGlvbihyZXNw KXt2YXIgc0hUTUw9JzxkaXYgc3R5bGU9InBhZGRpbmc6MTBweDsiPjxzdHJvbmc+ UyYjMzk7aGEgcHJvZHUmaXVtbDt0IHVuIGVycm9yIGVuIGwmIzM5O2VudmlhbWVu dC48L3N0cm9uZz48YnIgLz48YnIgLz5TaSB1cyBwbGF1LCByZXBldGl1IGwmIzM5 O2VudmlhbWVudC4nO0V4dC5Nc2cuYWxlcnQoIk5vdGlmaWNhciBlcnJvciBjYXJ0 b2dyJmFncmF2ZTtmaWMiLHNIVE1MKTt2YXIgbnc9RXh0LmdldENtcCgibm90aWZp Y2FyRGlhbG9nIik7bncuY2xvc2UoKX19KX1lbHNle2FsZXJ0KCJDYWwgb21wbGly IHRvdHMgZWxzIGNhbXBzLiIpfX07dmFyIGhpZGVMYXllcnM9ZnVuY3Rpb24oKXtt YXAuZ2V0TGF5ZXJzQnlOYW1lKCJXTVMyIilbMF0uc2V0VmlzaWJpbGl0eShmYWxz ZSk7bWFwLmdldExheWVyc0J5TmFtZSgiV01TQ09NMiIpWzBdLnNldFZpc2liaWxp dHkoZmFsc2UpO21hcC5nZXRMYXllcnNCeU5hbWUoIlRhbGw1MCIpWzBdLnNldFZp c2liaWxpdHkoZmFsc2UpO21hcC5nZXRMYXllcnNCeU5hbWUoIlRhbGwyNSIpWzBd LnNldFZpc2liaWxpdHkoZmFsc2UpO21hcC5nZXRMYXllcnNCeU5hbWUoIlRhbGwx MCIpWzBdLnNldFZpc2liaWxpdHkoZmFsc2UpO21hcC5nZXRMYXllcnNCeU5hbWUo IlRhbGw1IilbMF0uc2V0VmlzaWJpbGl0eShmYWxzZSk7bWFwLmdldExheWVyc0J5 TmFtZSgiV01TQ09NIilbMF0uc2V0VmlzaWJpbGl0eShmYWxzZSk7bWFwLmdldExh eWVyc0J5TmFtZSgiV01TUDEwMDBQT0xZRyIpWzBdLnNldFZpc2liaWxpdHkoZmFs c2UpfTtyZXR1cm57aWRpb21hOm51bGwsdGl0bGVMYW5nOm51bGwsdmVjdG9yOm51 bGwsbWFwOm51bGwsd21zOm51bGwsd21zMjpudWxsLHdtc0NvbTpudWxsLHdtc0Nv bTI6bnVsbCxiYXNlOm51bGwscHJvZHVjdDpudWxsLGluZm9jdHJsOm51bGwsZG93 bGRjdHJsOm51bGwscG9pbnRjdHJsOm51bGwsbGluZWN0cmw6bnVsbCxsaW5lY3Ry bGZyZWVoYW5kOm51bGwscG9seWN0cmw6bnVsbCxkZWxldGVjdHJsOm51bGwsbW9k eWN0cmw6bnVsbCxseXJUcmFuczpudWxsLGx5clRyYW5zMjpudWxsLGluZGV4VGFi THlyQ29tcGFyZTowLGluZGV4dGFic0NvbXBhcmVPcnRvOjAsdXJpU0xEOiJodHRw Oi8vd3d3LmljYy5jYXQvVklTU0lSX1NMRC9zbGRfZnVsbC5qc3A/cGFyYW1zPSIs dXJpR2V0UHJvZDoiaHR0cDovL3d3dy5pY2MuY2F0L3Byb2R1Y3Rzc2VhcmNoMi9n ZXRQcm9kdWN0ZXM/Iix1cmlHZXRNdW5pOiJodHRwOi8vd3d3LmljYy5jYXQvc3Bh dGlhbHNlYXJjaC9nZXREYXRhU3BhdGlhbE1hdGNoPyIsZ2V0UHJvamVjdGVzMWs6 Imh0dHA6Ly93d3cuaWNjLmNhdC9wcm9kdWN0c3NlYXJjaDIvZ2V0UHJvZHVjdGVz PyIsdXJsR2VvQ2FsYzI6Imh0dHA6Ly93d3cuaWNjLmNhdC9nZW9jYWxjMi9nZW9j YWxjMi5pY2MiLHByZXZDZW50ZXI6bnVsbCxwYW5weEhvcjpudWxsLHNldFN0YXR1 czpmdW5jdGlvbih0ZXh0KXtFeHQuZ2V0Q21wKCJzdGF0dXNCYXIiKS5ib2R5LmRv bS5jaGlsZE5vZGVzWzBdLnRleHRDb250ZW50PXRleHR9LGxvYWRqc2Nzc2ZpbGU6 ZnVuY3Rpb24oZmlsZW5hbWUsZmlsZXR5cGUpe2lmKGZpbGV0eXBlPT0ianMiKXt2 YXIgZmlsZXJlZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtmaWxl cmVmLnNldEF0dHJpYnV0ZSgidHlwZSIsInRleHQvamF2YXNjcmlwdCIpO2ZpbGVy ZWYuc2V0QXR0cmlidXRlKCJzcmMiLGZpbGVuYW1lKX1lbHNle2lmKGZpbGV0eXBl PT0iY3NzIil7dmFyIGZpbGVyZWY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGlu ayIpO2ZpbGVyZWYuc2V0QXR0cmlidXRlKCJyZWwiLCJzdHlsZXNoZWV0Iik7Zmls ZXJlZi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJ0ZXh0L2NzcyIpO2ZpbGVyZWYuc2V0 QXR0cmlidXRlKCJocmVmIixmaWxlbmFtZSl9fWlmKHR5cGVvZiBmaWxlcmVmIT0i dW5kZWZpbmVkIil7ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQi KVswXS5hcHBlbmRDaGlsZChmaWxlcmVmKX19LGdldElkaW9tYTpmdW5jdGlvbigp e3ZhciB1cmw9RXh0LnVybERlY29kZShsb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5n KDEpKTtpZih1cmwubGFuZz09PXVuZGVmaW5lZCl7QXBwLmxheW91dC5pZGlvbWE9 ImNhdCJ9ZWxzZXtBcHAubGF5b3V0LmlkaW9tYT11cmwubGFuZ31pZihBcHAubGF5 b3V0LmlkaW9tYT09ImNhX0VTIil7QXBwLmxheW91dC5pZGlvbWE9ImNhdCJ9aWYo QXBwLmxheW91dC5pZGlvbWE9PSJlc19FUyIpe0FwcC5sYXlvdXQuaWRpb21hPSJl c2wifWlmKEFwcC5sYXlvdXQuaWRpb21hPT0iZW5fVUsiKXtBcHAubGF5b3V0Lmlk aW9tYT0iZW5nIn1zd2l0Y2goQXBwLmxheW91dC5pZGlvbWEpe2Nhc2UiY2F0IjpB cHAubGF5b3V0LnRpdGxlTGFuZz0nPGRpdiBzdHlsZT0iaGVpZ2h0OjMwcHg7YmFj a2dyb3VuZC1pbWFnZTp1cmwoaW1nL2ZvbnMuZ2lmKTttYXJnaW4tbGVmdDotNXB4 O21hcmdpbi1yaWdodDotNXB4O21hcmdpbi1ib3R0b206LTVweDtvdmVyZmxvdzpo aWRkZW47Ij48ZGl2IGlkPSJpZGlvbWVzIiBzdHlsZT0icG9zdGlvbjpmaXhlZDty aWdodDo1MHB4Ij48YSBocmVmPSJpbmRleC5odG1sP2xhbmc9ZXNsIj5DYXN0ZWxs YW5vPC9hPiZuYnNwOyZuYnNwOzxhIGhyZWY9ImluZGV4Lmh0bWw/bGFuZz1lbmci PkVuZ2xpc2g8L2E+PC9kaXY+PC9kaXY+JzticmVhaztjYXNlImVzbCI6QXBwLmxh eW91dC50aXRsZUxhbmc9JzxkaXYgc3R5bGU9ImhlaWdodDozMHB4O2JhY2tncm91 bmQtaW1hZ2U6dXJsKGltZy9mb25zLmdpZik7bWFyZ2luLWxlZnQ6LTVweDttYXJn aW4tcmlnaHQ6LTVweDttYXJnaW4tYm90dG9tOi01cHg7b3ZlcmZsb3c6aGlkZGVu OyI+PGRpdiBpZD0iaWRpb21lcyIgc3R5bGU9InBvc3Rpb246Zml4ZWQ7cmlnaHQ6 NTBweCI+PGEgaHJlZj0iaW5kZXguaHRtbD9sYW5nPWNhdCI+Q2F0YWwmYWdyYXZl OzwvYT4mbmJzcDsmbmJzcDs8YSBocmVmPSJpbmRleC5odG1sP2xhbmc9ZW5nIj5F bmdsaXNoPC9hPjwvZGl2PjwvZGl2Pic7YnJlYWs7Y2FzZSJlbmciOkFwcC5sYXlv dXQudGl0bGVMYW5nPSc8ZGl2IHN0eWxlPSJoZWlnaHQ6MzBweDtiYWNrZ3JvdW5k LWltYWdlOnVybChpbWcvZm9ucy5naWYpO21hcmdpbi1sZWZ0Oi01cHg7bWFyZ2lu LXJpZ2h0Oi01cHg7bWFyZ2luLWJvdHRvbTotNXB4O292ZXJmbG93OmhpZGRlbjsi PjxkaXYgaWQ9ImlkaW9tZXMiIHN0eWxlPSJwb3N0aW9uOmZpeGVkO3JpZ2h0OjUw cHgiPjxhIGhyZWY9ImluZGV4Lmh0bWw/bGFuZz1jYXQiPkNhdGFsJmFncmF2ZTs8 L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iaW5kZXguaHRtbD9sYW5nPWVzbCI+Q2Fz dGVsbGFubzwvYT48L2Rpdj48L2Rpdj4nO2JyZWFrO2Nhc2UiY2FfRVMiOkFwcC5s YXlvdXQudGl0bGVMYW5nPSc8ZGl2IHN0eWxlPSJoZWlnaHQ6MzBweDtiYWNrZ3Jv dW5kLWltYWdlOnVybChpbWcvZm9ucy5naWYpO21hcmdpbi1sZWZ0Oi01cHg7bWFy Z2luLXJpZ2h0Oi01cHg7bWFyZ2luLWJvdHRvbTotNXB4O292ZXJmbG93OmhpZGRl bjsiPjxkaXYgaWQ9ImlkaW9tZXMiIHN0eWxlPSJwb3N0aW9uOmZpeGVkO3JpZ2h0 OjUwcHgiPjxhIGhyZWY9ImluZGV4Lmh0bWw/bGFuZz1lc2wiPkNhc3RlbGxhbm88 L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iaW5kZXguaHRtbD9sYW5nPWVuZyI+RW5n bGlzaDwvYT48L2Rpdj48L2Rpdj4nO2JyZWFrO2Nhc2UiZXNfRVMiOkFwcC5sYXlv dXQudGl0bGVMYW5nPSc8ZGl2IHN0eWxlPSJoZWlnaHQ6MzBweDtiYWNrZ3JvdW5k LWltYWdlOnVybChpbWcvZm9ucy5naWYpO21hcmdpbi1sZWZ0Oi01cHg7bWFyZ2lu LXJpZ2h0Oi01cHg7bWFyZ2luLWJvdHRvbTotNXB4O292ZXJmbG93OmhpZGRlbjsi PjxkaXYgaWQ9ImlkaW9tZXMiIHN0eWxlPSJwb3N0aW9uOmZpeGVkO3JpZ2h0OjUw cHgiPjxhIGhyZWY9ImluZGV4Lmh0bWw/bGFuZz1jYXQiPkNhdGFsJmFncmF2ZTs8 L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iaW5kZXguaHRtbD9sYW5nPWVuZyI+RW5n bGlzaDwvYT48L2Rpdj48L2Rpdj4nO2JyZWFrO2Nhc2UiZW5fVUsiOkFwcC5sYXlv dXQudGl0bGVMYW5nPSc8ZGl2IHN0eWxlPSJoZWlnaHQ6MzBweDtiYWNrZ3JvdW5k LWltYWdlOnVybChpbWcvZm9ucy5naWYpO21hcmdpbi1sZWZ0Oi01cHg7bWFyZ2lu LXJpZ2h0Oi01cHg7bWFyZ2luLWJvdHRvbTotNXB4O292ZXJmbG93OmhpZGRlbjsi PjxkaXYgaWQ9ImlkaW9tZXMiIHN0eWxlPSJwb3N0aW9uOmZpeGVkO3JpZ2h0OjUw cHgiPjxhIGhyZWY9ImluZGV4Lmh0bWw/bGFuZz1jYXQiPkNhdGFsJmFncmF2ZTs8 L2E+Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iaW5kZXguaHRtbD9sYW5nPWVzbCI+Q2Fz dGVsbGFubzwvYT48L2Rpdj48L2Rpdj4nO2JyZWFrO2RlZmF1bHQ6QXBwLmxheW91 dC50aXRsZUxhbmc9JzxkaXYgc3R5bGU9ImhlaWdodDozMHB4O2JhY2tncm91bmQt aW1hZ2U6dXJsKGltZy9mb25zLmdpZik7bWFyZ2luLWxlZnQ6LTVweDttYXJnaW4t cmlnaHQ6LTVweDttYXJnaW4tYm90dG9tOi01cHg7b3ZlcmZsb3c6aGlkZGVuOyI+ PGRpdiBpZD0iaWRpb21lcyIgc3R5bGU9InBvc3Rpb246Zml4ZWQ7cmlnaHQ6NTBw eCI+PGEgaHJlZj0iaW5kZXguaHRtbD9sYW5nPWVzbCI+Q2FzdGVsbGFubzwvYT4m bmJzcDsmbmJzcDs8YSBocmVmPSJpbmRleC5odG1sP2xhbmc9ZW5nIj5FbmdsaXNo PC9hPjwvZGl2PjwvZGl2Pic7YnJlYWt9fSxpbml0OmZ1bmN0aW9uKCl7T3Blbkxh eWVycy5Qcm94eUhvc3Q9Ii9jZ2ktYmluL3Byb3h5LmNnaT91cmw9IjttYXA9Y3Jl YXRlTWFwKCk7dmFyIGxheWVycz1jcmVhdGVMYXllcnMoKTt2YXIgbGF5ZXJTdG9y ZT1jcmVhdGVMYXllclN0b3JlKG1hcCxsYXllcnMpO3RoaXMudmVjdG9yPWNyZWF0 ZVZlY3RvckxheWVyKG1hcCk7dGhpcy53bXM9Y3JlYXRlV01TTGF5ZXIobWFwKTt0 aGlzLndtczI9Y3JlYXRlV01TTGF5ZXIyKG1hcCk7dGhpcy53bXNDb209Y3JlYXRl V01TTGF5ZXJDb21hcmNhbChtYXApO3RoaXMud21zQ29tMj1jcmVhdGVXTVNMYXll ckNvbWFyY2FsMihtYXApO2FkZE1hcENvbnRyb2xzKG1hcCk7dmFyIHRpdGxlRHJh d2luZ1Rvb2xzPXtpZDoidGl0bGUtcGFuZWwtZHJhdy10b29scyIsYm9keVN0eWxl OiJib3JkZXI6MHB4O2JhY2tncm91bmQ6I2ZmZjsiLGh0bWw6ZHJhd0Rlc2NyaXB0 fTt2YXIgYnV0dG9uc0VkaXQ9bmV3IEV4dC5QYW5lbCh7ZnJhbWU6ZmFsc2UsYm9y ZGVyOmZhbHNlLHRiYXI6Y3JlYXRlQnV0dG9uc0VkaXQobWFwKSxpZDoiYnRuRWRp dCJ9KTt2YXIgYnV0dG9uc0VkaXQyPW5ldyBFeHQuUGFuZWwoe2ZyYW1lOmZhbHNl LGJvcmRlcjpmYWxzZSx0YmFyOmNyZWF0ZUJ1dHRvbnNFZGl0MihtYXApLGlkOiJi dG5FZGl0MiJ9KTt2YXIgbXNnPWZ1bmN0aW9uKHRpdGxlLG1zZyl7RXh0Lk1zZy5z aG93KHt0aXRsZTp0aXRsZSxtc2c6bXNnLG1pbldpZHRoOjIwMCxtb2RhbDp0cnVl LGljb246RXh0Lk1zZy5JTkZPLGJ1dHRvbnM6RXh0Lk1zZy5PS30pfTt2YXIgd2lu TGVnZW5kTkRWST1uZXcgRXh0LldpbmRvdyh7aWQ6Indpbk5EVkljb250cm9sTGVn ZW5kIixhdXRvSGVpZ2h0OmZhbHNlLHdpZHRoOjM3MCxoZWlnaHQ6MjIwLHk6OTAs eDoyNTAscmVzaXphYmxlOmZhbHNlLGNsb3NhYmxlOmZhbHNlLGNsb3NlQWN0aW9u OiJoaWRlIix0aXRsZTp0b29sdGlwTkRWSTIsaXRlbXM6W3t4dHlwZToicGFuZWwi LHRpdGxlOk5EVklMZWdlbmQsaGVpZ2h0OjEyNSxodG1sOk5EVklodG1sfSx7eHR5 cGU6InBhbmVsIix0aXRsZTpORFZJTGVnZW5kMisnPGEgaHJlZj0iLi9sbGVnZW5k ZXMvTkRWSWRpc3AuanBnIiB0YXJnZXQ9InBkZmxsZWdlbmRhIj48aW1nIGNsYXNz PSJwb3NQREZJbWciIHNyYz0iLi9pbWcvcGRmX2ljb24uZ2lmIiAvPjwvYT4nLGhl aWdodDoxMH1dfSk7dmFyIGZwPW5ldyBFeHQuRm9ybVBhbmVsKHtmaWxlVXBsb2Fk OnRydWUsd2lkdGg6MTgwLGZyYW1lOnRydWUsZGVmYXVsdHM6e2FsbG93Qmxhbms6 ZmFsc2UsbXNnVGFyZ2V0OiJzaWRlIn0saXRlbXM6W3t4dHlwZToiZmlsZXVwbG9h ZGZpZWxkIixpZDoiZm9ybS1maWxlIixoaWRlTGFiZWw6dHJ1ZSxuYW1lOiJkYXRh ZmlsZSIsYnV0dG9uVGV4dDoiIixidXR0b25DZmc6e2ljb25DbHM6InVwbG9hZC1p Y29uIn19XSxidXR0b25zOlt7dGV4dDppbXBvcnRhcixoYW5kbGVyOmZ1bmN0aW9u KCl7aWYoZnAuZ2V0Rm9ybSgpLmlzVmFsaWQoKSl7ZnAuZ2V0Rm9ybSgpLnN1Ym1p dCh7dXJsOkFwcC53ZWJTZXJ2ZXIrQXBwLlZpc3NpclZlcnNpb24rIi9waHAvcHV0 S01MLnBocCIsc3VjY2VzczpmdW5jdGlvbihmcCxvKXt9fSl9fX0se3RleHQ6cmVz ZXQsaGFuZGxlcjpmdW5jdGlvbigpe2ZwLmdldEZvcm0oKS5yZXNldCgpfX1dfSk7 dmFyIHRpdGxlSW1wb3J0PXtpZDoidGl0bGUtcGFuZWwtaW1wb3J0Iixib2R5U3R5 bGU6ImJvcmRlcjowcHg7YmFja2dyb3VuZDojZmZmO21hcmdpbi1ib3R0b206MTBw eDsiLGh0bWw6aW1wb3J0RGVzY3JpcHR9O3ZhciB0aXRsZUV4cG9ydD17aWQ6InRp dGxlLXBhbmVsLWV4cG9ydCIsYm9keVN0eWxlOiJib3JkZXI6MHB4O2JhY2tncm91 bmQ6I2ZmZjttYXJnaW4tYm90dG9tOjEwcHg7IixodG1sOmV4cG9ydERlc2NyaXB0 fTt2YXIgdGl0bGVOZXdzPXtpZDoidGl0bGUtcGFuZWwtbmV3cyIsYm9keVN0eWxl OiJib3JkZXI6MHB4O2JhY2tncm91bmQ6I2ZmZjttYXJnaW4tYm90dG9tOjEwcHg7 IixodG1sOm5ld3NEZXNjcmlwdH07dmFyIHRhYnMyPW5ldyBFeHQuVGFiUGFuZWwo e2FjdGl2ZVRhYjowLGF1dG9XaWR0aDp0cnVlLGhlaWdodDozNTAscGFkZGluZzoy LHBsYWluOnRydWUsYm9yZGVyOmZhbHNlLGJvZHlCb3JkZXI6ZmFsc2UsZGVmYXVs dHM6e2F1dG9TY3JvbGw6dHJ1ZX0saXRlbXM6W3t0aXRsZTp0aXRvbE5vdmV0YXRz LGF1dG9Mb2FkOkFwcC5sYXlvdXQuaWRpb21hKyIvbmV3cy5odG1sIn0se3RpdGxl OmhlbHAsYXV0b0xvYWQ6QXBwLmxheW91dC5pZGlvbWErIi9oZWxwLmh0bWwifV19 KTt2YXIgaW1hZ2VJY29uQ2hrRGF0YVZvbD1uZXcgRXh0LkJveENvbXBvbmVudCh7 YXV0b0VsOnt0YWc6ImltZyIsc3JjOiJpbWcvdHJlZUljb25zL2RhdGFfdm9sLnBu ZyJ9LHN0eWxlOnttYXJnaW5SaWdodDoiNXB4In19KTt2YXIgY2hlY2tCb3hEYXRh Vm9sPW5ldyBFeHQuZm9ybS5DaGVja2JveCh7aWQ6ImNoa0RhdGFWb2wiLGJveExh YmVsOmRhdGFWb2wsY3RDbHM6ImNoZWNrQm94SGlzdCIsaGFuZGxlcjpmdW5jdGlv bigpe3ZhciBseXJkYXRhdm9sPW1hcC5nZXRMYXllcnNCeU5hbWUoImRhdGF2b2wi KVswXTtpZih0aGlzLmNoZWNrZWQpe2x5cmRhdGF2b2wuc2V0VmlzaWJpbGl0eSh0 cnVlKX1lbHNle2x5cmRhdGF2b2wuc2V0VmlzaWJpbGl0eShmYWxzZSl9fX0pO3Zh ciBwYW5lbENoazFUb3BvQWRkaT1uZXcgRXh0LlBhbmVsKHtib3JkZXI6ZmFsc2Us bGF5b3V0OiJjb2x1bW4iLGl0ZW1zOltpbWFnZUljb25DaGtEYXRhVm9sLGNoZWNr Qm94RGF0YVZvbF19KTt2YXIgaW1hZ2VJY29uQ2hrVmVydGV4cz1uZXcgRXh0LkJv eENvbXBvbmVudCh7YXV0b0VsOnt0YWc6ImltZyIsc3JjOiJpbWcvdHJlZUljb25z L3B1bnRzX2dlby5wbmcifSxzdHlsZTp7bWFyZ2luUmlnaHQ6IjVweCJ9fSk7dmFy IGNoZWNrQm94VmVydGV4cz1uZXcgRXh0LmZvcm0uQ2hlY2tib3goe2lkOiJjaGtW ZXJ0ZXhzIixib3hMYWJlbDpzZW55YWxzRyxjdENsczoiY2hlY2tCb3hIaXN0Iixo YW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGx5cnNlbnlhbHM9bWFwLmdldExheWVyc0J5 TmFtZSgic2VueWFsc2dlbyIpWzBdO2lmKHRoaXMuY2hlY2tlZCl7bHlyc2VueWFs cy5zZXRWaXNpYmlsaXR5KHRydWUpfWVsc2V7bHlyc2VueWFscy5zZXRWaXNpYmls aXR5KGZhbHNlKX19fSk7dmFyIHBhbmVsQ2hrMlRvcG9BZGRpPW5ldyBFeHQuUGFu ZWwoe2JvcmRlcjpmYWxzZSxsYXlvdXQ6ImNvbHVtbiIsaXRlbXM6W2ltYWdlSWNv bkNoa1ZlcnRleHMsY2hlY2tCb3hWZXJ0ZXhzXX0pO3ZhciBpbWFnZUljb25DaGtD aW1zPW5ldyBFeHQuQm94Q29tcG9uZW50KHthdXRvRWw6e3RhZzoiaW1nIixzcmM6 ImltZy90cmVlSWNvbnMvY2ltcy5wbmcifSxzdHlsZTp7bWFyZ2luUmlnaHQ6IjVw eCJ9fSk7dmFyIGNoZWNrQm94Q2ltcz1uZXcgRXh0LmZvcm0uQ2hlY2tib3goe2lk OiJjaGtDaW1zIixib3hMYWJlbDpjaW1zLGN0Q2xzOiJjaGVja0JveEhpc3QiLGhh bmRsZXI6ZnVuY3Rpb24oKXt2YXIgbHlyY2ltcz1tYXAuZ2V0TGF5ZXJzQnlOYW1l KCJDaW1zIilbMF07aWYodGhpcy5jaGVja2VkKXtseXJjaW1zLnNldFZpc2liaWxp dHkodHJ1ZSl9ZWxzZXtseXJjaW1zLnNldFZpc2liaWxpdHkoZmFsc2UpfX19KTt2 YXIgcGFuZWxDaGszVG9wb0FkZGk9bmV3IEV4dC5QYW5lbCh7Ym9yZGVyOmZhbHNl LGxheW91dDoiY29sdW1uIixpdGVtczpbaW1hZ2VJY29uQ2hrQ2ltcyxjaGVja0Jv eENpbXNdfSk7dmFyIEFkZGl0aW9uYWxJQ0NUb3BvTGF5ZXJzPXtpZDoiY29udGFp bmVyRGF0YVZvbCIsYmFzZUNsczoieC1wbGFpbiIsYm9keVN0eWxlOiJwYWRkaW5n LWxlZnQ6NXB4O21hcmdpbjozcHg7IixpdGVtczpbcGFuZWxDaGsxVG9wb0FkZGld fTt2YXIgaW1hZ2VJY29uQ2hrQ2FkYXN0cmU9bmV3IEV4dC5Cb3hDb21wb25lbnQo e2F1dG9FbDp7dGFnOiJpbWciLHNyYzoiaW1nL3RyZWVJY29ucy9jYWRhc3RyZS5w bmcifSxzdHlsZTp7bWFyZ2luUmlnaHQ6IjVweCJ9fSk7dmFyIGNoZWNrQm94Q2Fk YXN0cmU9bmV3IEV4dC5mb3JtLkNoZWNrYm94KHtpZDoiY2hrQ2FkYXN0cmUiLGJv eExhYmVsOmNhZGFzdHJlLGN0Q2xzOiJjaGVja0JveEhpc3QiLGhhbmRsZXI6ZnVu Y3Rpb24oKXt2YXIgbHlyY2FkYXN0cmU9bWFwLmdldExheWVyc0J5TmFtZSgiY2Fk YXN0cmUiKVswXTtpZih0aGlzLmNoZWNrZWQpe2x5cmNhZGFzdHJlLnNldFZpc2li aWxpdHkodHJ1ZSl9ZWxzZXtseXJjYWRhc3RyZS5zZXRWaXNpYmlsaXR5KGZhbHNl KX19fSk7dmFyIHBhbmVsQ2hrMVRvcG9BbHRyZXNBZGRpPW5ldyBFeHQuUGFuZWwo e2JvcmRlcjpmYWxzZSxsYXlvdXQ6ImNvbHVtbiIsaXRlbXM6W2ltYWdlSWNvbkNo a0NhZGFzdHJlLGNoZWNrQm94Q2FkYXN0cmVdfSk7dmFyIGltYWdlSWNvbkNoa1Np Z3BhYz1uZXcgRXh0LkJveENvbXBvbmVudCh7YXV0b0VsOnt0YWc6ImltZyIsc3Jj OiJpbWcvdHJlZUljb25zL3NpZ3BhYy5naWYifSxzdHlsZTp7bWFyZ2luUmlnaHQ6 IjVweCJ9fSk7dmFyIGNoZWNrQm94U2lncGFjPW5ldyBFeHQuZm9ybS5DaGVja2Jv eCh7aWQ6ImNoa1NpZ3BhYyIsYm94TGFiZWw6c2lncGFjLGN0Q2xzOiJjaGVja0Jv eEhpc3QiLGhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgbHlyc2lncGFjPW1hcC5nZXRM YXllcnNCeU5hbWUoInNpZ3BhYyIpWzBdO2lmKHRoaXMuY2hlY2tlZCl7bHlyc2ln cGFjLnNldFZpc2liaWxpdHkodHJ1ZSl9ZWxzZXtseXJzaWdwYWMuc2V0VmlzaWJp bGl0eShmYWxzZSl9fX0pO3ZhciBwYW5lbENoazJUb3BvQWx0cmVzQWRkaT1uZXcg RXh0LlBhbmVsKHtib3JkZXI6ZmFsc2UsbGF5b3V0OiJjb2x1bW4iLGl0ZW1zOltp bWFnZUljb25DaGtTaWdwYWMsY2hlY2tCb3hTaWdwYWNdfSk7dmFyIGNvbnRhaW5l ckFkZHRpb25hbHNMeXI9e2lkOiJjb250YWluZXJBZGRzTHlyc0RpdiIsYmFzZUNs czoieC1wbGFpbiIsaXRlbXM6W3BhbmVsQ2hrMlRvcG9BZGRpLHBhbmVsQ2hrM1Rv cG9BZGRpLHBhbmVsQ2hrMVRvcG9BbHRyZXNBZGRpLHBhbmVsQ2hrMlRvcG9BbHRy ZXNBZGRpXX07dmFyIHRhYnNDb21wYXJlVG9wbz1uZXcgRXh0LlRhYlBhbmVsKHtp ZDoidGFic0NvbXBhcmVUb3BvIixhY3RpdmVUYWI6MCxhdXRvV2lkdGg6dHJ1ZSxo ZWlnaHQ6MzUwLHBhZGRpbmc6MCxwbGFpbjp0cnVlLGJvcmRlcjp0cnVlLGJvZHlC b3JkZXI6dHJ1ZSxkZWZhdWx0czp7YXV0b1Njcm9sbDp0cnVlfSxpdGVtczpbe3Rp dGxlOmx5ck9ydG8saXRlbXM6W3BhbmVsUmFkaW9Hcm91cFNlbGVjdENvbXBMYXll cixjb21wYXJlUmFkaW9zQ29udGFpbmVyXSxsaXN0ZW5lcnM6e3Nob3c6ZnVuY3Rp b24oKXtBcHAubGF5b3V0LmluZGV4VGFiTHlyQ29tcGFyZT0wO3ZhciB0cmFuc3Bh cmVuY2lhPUV4dC5nZXRDbXAoInNsaWRlcl9jb21wYXJhY2lvIikuZ2V0VmFsdWUo KTtpZih0cmFuc3BhcmVuY2lhPjk4KXt0cmFuc3BhcmVuY2lhPTk4fWlmKHRyYW5z cGFyZW5jaWE8Mil7dHJhbnNwYXJlbmNpYT0yfUV4dC5nZXRDbXAoInNsaWRlcl9j b21wYXJhY2lvIikuc2V0VmFsdWUodHJhbnNwYXJlbmNpYSsxLGZhbHNlKX0saGlk ZTpmdW5jdGlvbigpe21hcC5nZXRMYXllcnNCeU5hbWUoIm92ZXJsYXlfdHJhbnNf b3J0byIpWzBdLnNldFZpc2liaWxpdHkoZmFsc2UpO21hcC5nZXRMYXllcnNCeU5h bWUoIm92ZXJsYXlfdHJhbnNfb3J0b19zaWdyaWQiKVswXS5zZXRWaXNpYmlsaXR5 KGZhbHNlKTttYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5zX29ydG9f aGlzdCIpWzBdLnNldFZpc2liaWxpdHkoZmFsc2UpfX19LHt0aXRsZTphbHRyZXMs aXRlbXM6W3BhbmVsQ2hrSW5mcmFyb2lnLHBhbmVsQ2hrTkRWSSxwYW5lbENoa0dl b2wsY29tcGFyZVJhZGlvc0NvbnRhaW5lckdlb2xdLGxpc3RlbmVyczp7c2hvdzpm dW5jdGlvbigpe0FwcC5sYXlvdXQuaW5kZXhUYWJMeXJDb21wYXJlPTF9LGhpZGU6 ZnVuY3Rpb24oKXtFeHQuZ2V0Q21wKCJjaGtJbmZyYXJvaWciKS5zZXRWYWx1ZShm YWxzZSk7RXh0LmdldENtcCgiY2hrTkRWSSIpLnNldFZhbHVlKGZhbHNlKTtFeHQu Z2V0Q21wKCJjaGtHZW9sIikuc2V0VmFsdWUoZmFsc2UpfX19XX0pO3ZhciBjb21w YXJlVG9wb1BhbmVsPW5ldyBFeHQuUGFuZWwoe2lkOiJwbmxDb21wYXJlVG9wb09y dG8iLGJvcmRlcjpmYWxzZSxjbHM6Im15LWhlYWRlcjMiLHRpdGxlOmNvbXBhcmUs aWNvbkNsczoibXktaWNvbi1jb21wYXJlIixjb2xsYXBzaWJsZTp0cnVlLGJvZHlT dHlsZToicGFkZGluZy1sZWZ0OjBweDttYXJnaW46MnB4OyIsaXRlbXM6W3RhYnND b21wYXJlVG9wb10sbGlzdGVuZXJzOntiZWZvcmVleHBhbmQ6ZnVuY3Rpb24oKXt2 YXIgc2xkckhpc3RDb21wPUV4dC5nZXRDbXAoInNsaWRlcmNvbXBhcmV0b3Bvb3J0 byIpO3ZhciB2YWw9c2xkckhpc3RDb21wLmdldFZhbHVlKCk7c3dpdGNoKHZhbCl7 Y2FzZSA1MDpBcHAubGF5b3V0Lmx5clRyYW5zPW1hcC5nZXRMYXllcnNCeU5hbWUo Im92ZXJsYXlfdHJhbnNfb3J0byIpWzBdO21hcC5nZXRMYXllcnNCeU5hbWUoIm92 ZXJsYXlfdHJhbnNfb3J0b19zaWdyaWQiKVswXS5zZXRWaXNpYmlsaXR5KGZhbHNl KTttYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5zX29ydG9faGlzdCIp WzBdLnNldFZpc2liaWxpdHkoZmFsc2UpO0FwcC5sYXlvdXQuZm9yY2VDaGFuZ2VT bGlkZXJPcGFjaXR5KCJzbGlkZXJfY29tcGFyYWNpbyIpO3ZhciB5ZWFyPSIwIjti cmVhaztjYXNlIDQwOnZhciB5ZWFyPSIyMDExIjtfZ2FxLnB1c2goWyJfdHJhY2tF dmVudCIsInZpc3NpciIsIlNpZ3JpZDIwMTEiXSk7YnJlYWs7Y2FzZSAzMDp2YXIg eWVhcj0iMjAxMCI7X2dhcS5wdXNoKFsiX3RyYWNrRXZlbnQiLCJ2aXNzaXIiLCJT aGFncmF0MjAxMCJdKTticmVhaztjYXNlIDIwOnZhciB5ZWFyPSIyMDA5IjtfZ2Fx LnB1c2goWyJfdHJhY2tFdmVudCIsInZpc3NpciIsIlNoYWdyYXQyMDA5Il0pO2Jy ZWFrO2Nhc2UgMTA6dmFyIHllYXI9IjIwMDgiO19nYXEucHVzaChbIl90cmFja0V2 ZW50Iiwidmlzc2lyIiwiU2hhZ3JhdDIwMDgiXSk7YnJlYWs7Y2FzZSAwOnZhciB5 ZWFyPSIxOTU2IjtfZ2FxLnB1c2goWyJfdHJhY2tFdmVudCIsInZpc3NpciIsIlNo YWdyYXQxOTU2Il0pO2JyZWFrfWlmKHllYXIhPSIwIiYmeWVhciE9IiIpe3ZhciBt YXBab29tPW1hcC5nZXRab29tKCk7T3BlbkxheWVycy5SZXF1ZXN0LkdFVCh7dXJs OkFwcC5IaXN0b3JpY3NTZXJ2ZXIscGFyYW1zOnthbnk6eWVhcixuaXZlbGw6bWFw Wm9vbX0sY2FsbGJhY2s6QXBwLmxheW91dC5oYW5kbGVyT3J0b0hpc3RDb21wfSl9 fSxleHBhbmQ6ZnVuY3Rpb24oKXtFeHQuZ2V0Q21wKCJzbGlkZXJfY29tcGFyYWNp byIpLnNldFZhbHVlKDQ5LGZhbHNlKTtFeHQuZ2V0Q21wKCJ0YWJzQ29tcGFyZVRv cG8iKS5zZXRBY3RpdmVUYWIoMCl9LGNvbGxhcHNlOmZ1bmN0aW9uKCl7dmFyIGx5 clRyYW5zPW1hcC5nZXRMYXllcnNCeU5hbWUoIm92ZXJsYXlfdHJhbnNfb3J0byIp WzBdO2x5clRyYW5zLnNldFZpc2liaWxpdHkoZmFsc2UpO3ZhciBseXJUcmFucz1t YXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5zX29ydG9faGlzdCIpWzBd O2x5clRyYW5zLnNldFZpc2liaWxpdHkoZmFsc2UpO3ZhciBseXJUcmFucz1tYXAu Z2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5zX29ydG9fc2lncmlkIilbMF07 bHlyVHJhbnMuc2V0VmlzaWJpbGl0eShmYWxzZSk7RXh0LmdldENtcCgiY2hrSW5m cmFyb2lnIikuc2V0VmFsdWUoZmFsc2UpO0V4dC5nZXRDbXAoImNoa05EVkkiKS5z ZXRWYWx1ZShmYWxzZSk7RXh0LmdldENtcCgiY2hrR2VvbCIpLnNldFZhbHVlKGZh bHNlKX19fSk7dmFyIHNwYWNlcj1uZXcgRXh0LkNvbnRhaW5lcih7aGlkZUJvcmRl cnM6dHJ1ZSxsYXlvdXQ6ImZpdCIsaXRlbXM6e2h0bWw6IiZuYnNwOyJ9fSk7dmFy IHRhYnNCYXNlTGF5ZXJzPW5ldyBFeHQuVGFiUGFuZWwoe2lkOiJ0YWJMYXllcnMi LGFjdGl2ZVRhYjowLGF1dG9XaWR0aDp0cnVlLHBhZGRpbmc6MCxwbGFpbjp0cnVl LGJvcmRlcjpmYWxzZSxib2R5Qm9yZGVyOmZhbHNlLGRlZmF1bHRzOnthdXRvU2Ny b2xsOnRydWV9LGhlaWdodDo2MDAsaXRlbXM6W3t0aXRsZTpseXJUb3BvLGlkOiJ0 b3BvdGFiIixpdGVtczpbQWRkaXRpb25hbElDQ1RvcG9MYXllcnMsc3BhY2VyLGNv bXBhcmVUb3BvUGFuZWxdLGxpc3RlbmVyczp7c2hvdzpmdW5jdGlvbigpe3ZhciBs eXJiYXNlPW1hcC5nZXRMYXllcnNCeU5hbWUobHlyVG9wbylbMF07bWFwLnNldEJh c2VMYXllcihseXJiYXNlKTtseXJiYXNlLnNldFZpc2liaWxpdHkodHJ1ZSl9LGhp ZGU6ZnVuY3Rpb24oKXt2YXIgbHlyYmFzZT1tYXAuZ2V0TGF5ZXJzQnlOYW1lKGx5 clRvcG8pWzBdO2x5cmJhc2Uuc2V0VmlzaWJpbGl0eShmYWxzZSk7RXh0LmdldENt cCgiY2hrRGF0YVZvbCIpLnNldFZhbHVlKGZhbHNlKTtFeHQuZ2V0Q21wKCJjaGtJ bmZyYXJvaWciKS5zZXRWYWx1ZShmYWxzZSk7RXh0LmdldENtcCgiY2hrTkRWSSIp LnNldFZhbHVlKGZhbHNlKTtFeHQuZ2V0Q21wKCJjaGtHZW9sIikuc2V0VmFsdWUo ZmFsc2UpO0V4dC5nZXRDbXAoInBubENvbXBhcmVUb3BvT3J0byIpLmNvbGxhcHNl KGZhbHNlKX19fSx7dGl0bGU6bHlyT3J0byxpZDoib3J0b3RhYiIsaXRlbXM6W2Nv bnRhaW5lck9ydG9MeXIsc3BhY2VyLGNvbXBhcmVPcnRvUGFuZWxdLGxpc3RlbmVy czp7c2hvdzpmdW5jdGlvbigpe3ZhciBseXJiYXNlPW1hcC5nZXRMYXllcnNCeU5h bWUobHlyT3J0bylbMF07bWFwLnNldEJhc2VMYXllcihseXJiYXNlKTtseXJiYXNl LnNldFZpc2liaWxpdHkodHJ1ZSl9LGJlZm9yZWhpZGU6ZnVuY3Rpb24oKXtFeHQu Z2V0Q21wKCJoaXN0X3NsaWRlcl9jb21wMiIpLnNldFZhbHVlKDUwLGZhbHNlKX0s aGlkZTpmdW5jdGlvbigpe3ZhciBseXJiYXNlPW1hcC5nZXRMYXllcnNCeU5hbWUo bHlyT3J0bylbMF07bHlyYmFzZS5zZXRWaXNpYmlsaXR5KGZhbHNlKTttYXAuZ2V0 TGF5ZXJzQnlOYW1lKCJvdmVybGF5X29ydG9faGlzdCIpWzBdLnNldFZpc2liaWxp dHkoZmFsc2UpO21hcC5nZXRMYXllcnNCeU5hbWUoIm92ZXJsYXlfb3J0b19zaWdy aWQiKVswXS5zZXRWaXNpYmlsaXR5KGZhbHNlKTtFeHQuZ2V0Q21wKCJjaGtEYXRh Vm9sT3J0byIpLnNldFZhbHVlKGZhbHNlKTtFeHQuZ2V0Q21wKCJjaGtEYXRhVm9s T3J0byIpLnNldERpc2FibGVkKGZhbHNlKTtFeHQuZ2V0Q21wKCJjaGtUb3BPcnRv Iikuc2V0VmFsdWUoZmFsc2UpO0V4dC5nZXRDbXAoImNoa1RvcE9ydG8iKS5zZXRE aXNhYmxlZChmYWxzZSk7RXh0LmdldENtcCgiY2hrTGltQWRtaW5PcnRvIikuc2V0 VmFsdWUoZmFsc2UpO0V4dC5nZXRDbXAoInBubENvbXBhcmVPcnRvIikuY29sbGFw c2UoZmFsc2UpfX19LHt0aXRsZTpseXJBbHRyZXMsaWQ6ImFsdHJlc3RhYiIsYm9k eVN0eWxlOiJib3JkZXI6MHB4O2JhY2tncm91bmQ6I2ZmZjttYXJnaW4tbGVmdDo1 cHgiLGl0ZW1zOltjb250YWluZXJBbHRyZXNMeXIsc3BhY2VyXSxsaXN0ZW5lcnM6 e3Nob3c6ZnVuY3Rpb24oKXtFeHQuZ2V0Q21wKCJjaGtJbmZyYXJvaWdBbHRyZXMi KS5zZXRWYWx1ZSh0cnVlKX0saGlkZTpmdW5jdGlvbigpe0V4dC5nZXRDbXAoImNo a0luZnJhcm9pZ0FsdHJlcyIpLnNldFZhbHVlKGZhbHNlKTtFeHQuZ2V0Q21wKCJj aGtORFZJYWx0cmVzIikuc2V0VmFsdWUoZmFsc2UpO0V4dC5nZXRDbXAoImNoa0dl b2xBbHRyZXMiKS5zZXRWYWx1ZShmYWxzZSl9fX1dfSk7cGVybWFsaW5rUHJvdmlk ZXI9bmV3IEdlb0V4dC5zdGF0ZS5QZXJtYWxpbmtQcm92aWRlcigpO0V4dC5zdGF0 ZS5NYW5hZ2VyLnNldFByb3ZpZGVyKHBlcm1hbGlua1Byb3ZpZGVyKTtuZXcgRXh0 LlZpZXdwb3J0KHtsYXlvdXQ6ImJvcmRlciIsaXRlbXM6W3t0aXRsZTpBcHAubGF5 b3V0LnRpdGxlTGFuZyxyZWdpb246ImNlbnRlciIseHR5cGU6Imd4X21hcHBhbmVs IixpZDoibXAiLG1hcDptYXAsbGF5ZXJzOmxheWVyU3RvcmUsem9vbToxMSxzdGF0 ZUlkOiJtcCIscHJldHR5U3RhdGVLZXlzOnRydWUsaXRlbXM6W3t4dHlwZToiZ3hf em9vbXNsaWRlciIsYWdncmVzc2l2ZTp0cnVlLHZlcnRpY2FsOnRydWUsaGVpZ2h0 OjEwMCx4OjEwLHk6MjAscGx1Z2luczpuZXcgR2VvRXh0Llpvb21TbGlkZXJUaXAo e3RlbXBsYXRlOiJab29tOiB7em9vbX0ifSl9XSx0YmFyOmNyZWF0ZVRiYXJJdGVt cyhtYXApfSx7dGl0bGU6JzxpbWcgc3JjPSJpbWcvdHJhbnNwYXJlbnQyMi5wbmci Lz5WaXNzaXIgdjMuMycscmVnaW9uOiJ3ZXN0IixpZDoid2VzdC1wYW5lbCIsc3Bs aXQ6dHJ1ZSx3aWR0aDoyMTAsbWluU2l6ZToyMTAsbWF4U2l6ZTozMDAsY29sbGFw c2libGU6dHJ1ZSxtYXJnaW5zOiIwIDAgMCAwIixsYXlvdXQ6ImFjY29yZGlvbiIs ZGVmYXVsdHM6e2JvZHlTdHlsZToicGFkZGluZzo1cHgifSxsYXlvdXRDb25maWc6 e2FuaW1hdGU6dHJ1ZX0saXRlbXM6W3t0aXRsZTpjYXBlcyxpZDoibGF5ZXJzLXRh YnMiLGF1dG9TY3JvbGw6ZmFsc2UsYm9yZGVyOnRydWUsY29sbGFwc2VGaXJzdDpm YWxzZSxmcmFtZTpmYWxzZSxwYWRkaW5nOiI1cHggMHB4IDJweCAwcHgiLGl0ZW1z Olt7aWQ6InBhbmVsLWxheWVycyIsYm9keVN0eWxlOiJib3JkZXI6MHB4O2JhY2tn cm91bmQ6I2ZmZjsiLGl0ZW1zOlt0YWJzQmFzZUxheWVyc119XX0se3RpdGxlOmFk ZGljaW9uYWxzLGlkOiJsYXllcnMtYWRkcyIsYXV0b1Njcm9sbDp0cnVlLGJvcmRl cjp0cnVlLGNvbGxhcHNlRmlyc3Q6ZmFsc2UsZnJhbWU6ZmFsc2UscGFkZGluZzoi NXB4IDBweCAycHggMHB4IixpdGVtczpbe2lkOiJwYW5lbC1sYXllcnMtYWRkcyIs Ym9keVN0eWxlOiJib3JkZXI6MHB4O2JhY2tncm91bmQ6I2ZmZjttYXJnaW4tbGVm dDo1cHgiLGl0ZW1zOltjb250YWluZXJBZGR0aW9uYWxzTHlyXX1dfSx7dGl0bGU6 Y2VyY2EsaWQ6ImNlcmNhIixib3JkZXI6ZmFsc2UsZXhwYW5kZWQ6dHJ1ZSxodG1s Oic8ZGl2IGlkPSJ0b3BvbmltIj48L2Rpdj4nfSx7dGl0bGU6ZGVzY2FycmVnYSxp ZDoiZG93bmxvYWQtZGl2IixhdXRvU2Nyb2xsOnRydWUsYm9yZGVyOmZhbHNlLGh0 bWw6ZGVzY2FycmVndWVzSFRNTCgpfSx7dGl0bGU6ZWRpdCxpZDoiZWRpdC1kaXYi LGJvcmRlcjpmYWxzZSxpdGVtczpbe2lkOiJidXR0b25zLWdlb21ldHJ5Iixib2R5 U3R5bGU6InBhZGRpbmc6M3B4O2JhY2tncm91bmQ6I2ZmZjttYXJnaW4tYm90dG9t OjVweDsiLGl0ZW1zOlt0aXRsZURyYXdpbmdUb29scyxidXR0b25zRWRpdF19LHtp ZDoiZGV0YWlscy1wYW5lbC1pbXAiLGJvZHlTdHlsZToicGFkZGluZzozcHg7YmFj a2dyb3VuZDojZmZmOyIsaXRlbXM6W3RpdGxlSW1wb3J0LGZwXX0se2lkOiJkZXRh aWxzLXBhbmVsLWV4cCIsYm9keVN0eWxlOiJwYWRkaW5nOjNweDtiYWNrZ3JvdW5k OiNmZmY7bWFyZ2luLXRvcDo1cHg7IixpdGVtczpbdGl0bGVFeHBvcnRdfV19LHt0 aXRsZTp0aXRvbE5vdmV0YXRzLGlkOiJuZXdzLWRpdiIsYXV0b1Njcm9sbDp0cnVl LGJvcmRlcjpmYWxzZSxmcmFtZTpmYWxzZSxpdGVtczpbe2lkOiJkZXRhaWxzLXBh bmVsLW5ld3MiLGJvZHlTdHlsZToiYmFja2dyb3VuZDojZmZmOyIsaXRlbXM6W3Rh YnMyXX1dfV19LHtyZWdpb246InNvdXRoIixpZDoic3RhdHVzQmFyIixib3JkZXI6 ZmFsc2UsYm9keVN0eWxlOiJ0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzowcHg7Iixo ZWlnaHQ6MzAsbWFyZ2luczoiNSAwIDAgMCIsZnJhbWU6dHJ1ZSxodG1sOic8ZGl2 IGlkPSJtZWFzdXJlSW5mbyI+PC9kaXY+PGRpdiBpZD0ic2NlbmVJbmZvIj48L2Rp dj4nfV19KTtpZihwcmludENhcGFiaWxpdGllcyl7cHJpbnRQcm92aWRlcj1uZXcg R2VvRXh0LmRhdGEuUHJpbnRQcm92aWRlcih7bWV0aG9kOiJQT1NUIixjYXBhYmls aXRpZXM6cHJpbnRDYXBhYmlsaXRpZXMsY3VzdG9tUGFyYW1zOnttYXBUaXRsZTpp bXByaW1pcn19KTtwcmludFBhZ2U9bmV3IEdlb0V4dC5kYXRhLlByaW50UGFnZSh7 cHJpbnRQcm92aWRlcjpwcmludFByb3ZpZGVyfSk7bWFwUGFuZWw9RXh0LmdldENt cCgibXAiKTtwYWdlTGF5ZXI9bmV3IE9wZW5MYXllcnMuTGF5ZXIuVmVjdG9yKCJh bWJpdF9pbXByZXNzaW8iLHtkaXNwbGF5SW5MYXllclN3aXRjaGVyOmZhbHNlLHZp c2liaWxpdHk6ZmFsc2V9KTtwcmludFBhZ2UuZml0KG1hcFBhbmVsKTtwYWdlTGF5 ZXIuYWRkRmVhdHVyZXMocHJpbnRQYWdlLmZlYXR1cmUpO21hcC5hZGRMYXllcihw YWdlTGF5ZXIpO21hcC5ldmVudHMucmVnaXN0ZXIoIm1vdmVlbmQiLG1hcCxmdW5j dGlvbigpe3ByaW50UGFnZS5maXQobWFwUGFuZWwpfSl9dmFyIHRpdGxlTGlua0Nv cHk9e2lkOiJ0aXRsZS1wYW5lbC1saW5rQ29weSIsYm9keVN0eWxlOiJib3JkZXI6 MHB4O2JhY2tncm91bmQ6I2VmZWZlZjtwYWRkaW5nOjVweCIsaHRtbDp0aXRsZURl c2NyaXB0TGlua0NvcHl9O3ZhciB0aXRsZUxpbmtDb3B5Mj17aWQ6InRpdGxlLXBh bmVsLWxpbmtDb3B5MiIsYm9keVN0eWxlOiJib3JkZXI6MHB4O2JhY2tncm91bmQ6 I2VmZWZlZjtwYWRkaW5nOjVweCIsaHRtbDppbnNlcmlyTWFwYX07dmFyIHRleHRB cmVhMT17eHR5cGU6InRleHRhcmVhIixvdmVyZmxvdzoiaGlkZGVuIixsYWJlbFN0 eWxlOiJmb250LXNpemU6MTRweDsiLG5hbWU6InBlcm1hbG5rIixpZDoidHh0X3Bl cm1hbG5rIix2YWx1ZToiIix3aWR0aDoiNDkwIn07dmFyIHRleHRBcmVhMj17eHR5 cGU6InRleHRhcmVhIixvdmVyZmxvdzoiaGlkZGVuIixuYW1lOiJpZnJhbWVsaW5r IixpZDoidHh0X2lmcmFtZWxuayIsdmFsdWU6IiIsd2lkdGg6IjQ5MCJ9O3Blcm1h bGlua193aW49bmV3IEV4dC5XaW5kb3coe2Nsb3NlQWN0aW9uOiJoaWRlIixwbGFp bjp0cnVlLGl0ZW1zOlt0aXRsZUxpbmtDb3B5LHRleHRBcmVhMSx0aXRsZUxpbmtD b3B5Mix0ZXh0QXJlYTJdLHdpZHRoOjUxMCx5OjcwLHRpdGxlOmVubGxhY2FyLHJl c2l6YWJsZTpmYWxzZX0pO3Blcm1hbGlua193aW4ub24oInNob3ciLGZ1bmN0aW9u KGMpe30pO3ZhciBzY2VuZUluZj1uZXcgVmlzc2lyLlNjZW5lSW5mbyh7ZGl2OiQo InNjZW5lSW5mbyIpLGJhc2VVUkw6Ii92aXNzaXIyc2VydmVpcy9nZXRTY2VuZUlu Zm8ifSk7bWFwLmFkZENvbnRyb2woc2NlbmVJbmYpO3ZhciB0b3Bvbmltcz1uZXcg Vmlzc2lyLkNlcmNhZG9yVG9wb25pbXMoe2RpdjokKCJ0b3BvbmltIiksZW5kUG9p bnQ6Ii9nZW9jb2RpZmljYWRvci9qc29uP29yZHJlPXN1Z2dlc3QmbWF4cmVzdWx0 YXRzPTI1Jm1ldG9kZT1sb2NhbGl0emFUb3BvbmltIn0pO21hcC5hZGRDb250cm9s KHRvcG9uaW1zKTttYXAuem9vbVRvKDApO3Blcm1hbGlua1Byb3ZpZGVyLm9uKHtz dGF0ZWNoYW5nZTpmdW5jdGlvbihwcm92aWRlcixuYW1lLHZhbHVlKXt2YXIgbGlu az1wcm92aWRlci5nZXRMaW5rKCk7dmFyIHBvc09ydG9WaXNWYWx1ZT1saW5rLmlu ZGV4T2YoIiZtcF9vcGFjaXR5X09ydG9mb3RvIik7aWYocG9zT3J0b1Zpc1ZhbHVl PT0tMSl7cG9zT3J0b1Zpc1ZhbHVlPWxpbmsuaW5kZXhPZigiJm1wX29wYWNpdHlf T3J0b3Bob3RvIil9bGluaz1saW5rLnN1YnN0cmluZygwLHBvc09ydG9WaXNWYWx1 ZSk7aWYoIXBlcm1hbGlua193aW4uYm9keSl7cGVybWFsaW5rX3dpbi5pdGVtcy5p dGVtc1sxXS52YWx1ZT1saW5rO3Blcm1hbGlua193aW4uaXRlbXMuaXRlbXNbM10u dmFsdWU9JzxpZnJhbWUgd2lkdGg9IjQyNSIgaGVpZ2h0PSIzNTAiIGZyYW1lYm9y ZGVyPSIwIiBzY3JvbGxpbmc9Im5vIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndp ZHRoPSIwIiBzcmM9Imh0dHA6Ly93d3cuaWNjLmNhdC92aXNzaXIzL2VtYmVkZGVk Lmh0bWwiID48L2lmcmFtZT4nfWVsc2V7cGVybWFsaW5rX3dpbi5ib2R5LmRvbS5j aGlsZE5vZGVzWzFdLnZhbHVlPWxpbms7cGVybWFsaW5rX3dpbi5ib2R5LmRvbS5j aGlsZE5vZGVzWzNdLnZhbHVlPSc8aWZyYW1lIHdpZHRoPSI0MjUiIGhlaWdodD0i MzUwIiBmcmFtZWJvcmRlcj0iMCIgc2Nyb2xsaW5nPSJubyIgbWFyZ2luaGVpZ2h0 PSIwIiBtYXJnaW53aWR0aD0iMCIgc3JjPSJodHRwOi8vd3d3LmljYy5jYXQvdmlz c2lyMy9lbWJlZGRlZC5odG1sIiA+PC9pZnJhbWU+J319fSk7dmFyIGx5PW1hcC5n ZXRMYXllcnNCeU5hbWUoInNlbnlhbHNnZW8iKVswXTtseS5ldmVudHMucmVnaXN0 ZXIoInZpc2liaWxpdHljaGFuZ2VkIix0aGlzLGZ1bmN0aW9uKGUpe3ZhciBzdGF0 dXNCYXJUZXh0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtZWFzdXJlSW5mbyIp O2lmKGx5LnZpc2liaWxpdHkpe21hcC5nZXRDb250cm9sc0J5Q2xhc3MoIlZpc3Np ci5DbGlja1ZlcnRleCIpWzBdLmFjdGl2YXRlKCk7bWFwLmdldENvbnRyb2xzQnlD bGFzcygiVmlzc2lyLkNsaWNrTWFwQ29vcmRzIilbMF0uZGVhY3RpdmF0ZSgpO2lu Zm9jdHJsLmFjdGl2YXRlKCk7RXh0Lk1lc3NhZ2VCb3guc2hvdyh7dGl0bGU6aW5m byxtc2c6dmVydGV4SW5mbyxidXR0b25zOkV4dC5NZXNzYWdlQm94Lk9LLGljb246 RXh0Lk1lc3NhZ2VCb3guUVVFU1RJT059KTtzdGF0dXNCYXJUZXh0LmlubmVySFRN TD0iIjtzdGF0dXNCYXJUZXh0LmlubmVySFRNTD0iPGltZyBzcmM9J2ltZy90cmVl SWNvbnMvcHVudHNfZ2VvLnBuZycgY2xhc3M9J2ltZ1N0YXR1c0JhcicgLz4mbmJz cDsiK21zZ1ZlcnRleHNJbmZvQ2xpY2t9ZWxzZXttYXAuZ2V0Q29udHJvbHNCeUNs YXNzKCJWaXNzaXIuQ2xpY2tWZXJ0ZXgiKVswXS5kZWFjdGl2YXRlKCk7aWYoc2Vu eWFsc0FORGNpbXNJc0hpZGUoKSl7aW5mb2N0cmwuZGVhY3RpdmF0ZSgpfXN0YXR1 c0JhclRleHQuaW5uZXJIVE1MPSIifX0pO3ZhciBseUNpbXM9bWFwLmdldExheWVy c0J5TmFtZSgiQ2ltcyIpWzBdO2x5Q2ltcy5ldmVudHMucmVnaXN0ZXIoInZpc2li aWxpdHljaGFuZ2VkIix0aGlzLGZ1bmN0aW9uKGUpe3ZhciBzdGF0dXNCYXJUZXh0 PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtZWFzdXJlSW5mbyIpO2lmKGx5Q2lt cy52aXNpYmlsaXR5KXttYXAuZ2V0Q29udHJvbHNCeUNsYXNzKCJWaXNzaXIuQ2xp Y2tDaW1zIilbMF0uYWN0aXZhdGUoKTttYXAuZ2V0Q29udHJvbHNCeUNsYXNzKCJW aXNzaXIuQ2xpY2tNYXBDb29yZHMiKVswXS5kZWFjdGl2YXRlKCk7aW5mb2N0cmwu YWN0aXZhdGUoKTtzdGF0dXNCYXJUZXh0LmlubmVySFRNTD0iIjtzdGF0dXNCYXJU ZXh0LmlubmVySFRNTD0iPGltZyBzcmM9J2ltZy90cmVlSWNvbnMvY2ltcy5wbmcn IGNsYXNzPSdpbWdTdGF0dXNCYXInIC8+Jm5ic3A7Iittc2dDaW1zSW5mb0NsaWNr fWVsc2V7bWFwLmdldENvbnRyb2xzQnlDbGFzcygiVmlzc2lyLkNsaWNrQ2ltcyIp WzBdLmRlYWN0aXZhdGUoKTtpZihzZW55YWxzQU5EY2ltc0lzSGlkZSgpKXtpbmZv Y3RybC5kZWFjdGl2YXRlKCl9c3RhdHVzQmFyVGV4dC5pbm5lckhUTUw9IiJ9fSk7 dmFyIGdhTHlyVG9wbz1tYXAuZ2V0TGF5ZXJzQnlOYW1lKGx5clRvcG8pWzBdO2dh THlyVG9wby5ldmVudHMucmVnaXN0ZXIoInZpc2liaWxpdHljaGFuZ2VkIix0aGlz LGZ1bmN0aW9uKGUpe2lmKGdhTHlyVG9wby52aXNpYmlsaXR5KXtfZ2FxLnB1c2go WyJfdHJhY2tFdmVudCIsInZpc3NpciIsInRvcG9ncmFmaWMiXSl9fSk7dmFyIGdh THlyT3J0bz1tYXAuZ2V0TGF5ZXJzQnlOYW1lKGx5ck9ydG8pWzBdO2dhTHlyT3J0 by5ldmVudHMucmVnaXN0ZXIoInZpc2liaWxpdHljaGFuZ2VkIix0aGlzLGZ1bmN0 aW9uKGUpe2lmKGdhTHlyT3J0by52aXNpYmlsaXR5KXtfZ2FxLnB1c2goWyJfdHJh Y2tFdmVudCIsInZpc3NpciIsIm9ydG9mb3RvIl0pfX0pO3ZhciBnYUx5clZvbD1t YXAuZ2V0TGF5ZXJzQnlOYW1lKCJkYXRhdm9sIilbMF07Z2FMeXJWb2wuZXZlbnRz LnJlZ2lzdGVyKCJ2aXNpYmlsaXR5Y2hhbmdlZCIsdGhpcyxmdW5jdGlvbihlKXtp ZihnYUx5clZvbC52aXNpYmlsaXR5KXtfZ2FxLnB1c2goWyJfdHJhY2tFdmVudCIs InZpc3NpciIsImRhdGF2b2wiXSl9fSk7dmFyIGdhTHlyR2VvbD1tYXAuZ2V0TGF5 ZXJzQnlOYW1lKCJnZW9sIilbMF07Z2FMeXJHZW9sLmV2ZW50cy5yZWdpc3Rlcigi dmlzaWJpbGl0eWNoYW5nZWQiLHRoaXMsZnVuY3Rpb24oZSl7aWYoZ2FMeXJHZW9s LnZpc2liaWxpdHkpe19nYXEucHVzaChbIl90cmFja0V2ZW50Iiwidmlzc2lyIiwi Z2VvbCJdKX19KTt2YXIgZ2FMeXJTZW55YWxzPW1hcC5nZXRMYXllcnNCeU5hbWUo InNlbnlhbHNnZW8iKVswXTtnYUx5clNlbnlhbHMuZXZlbnRzLnJlZ2lzdGVyKCJ2 aXNpYmlsaXR5Y2hhbmdlZCIsdGhpcyxmdW5jdGlvbihlKXtpZihnYUx5clNlbnlh bHMudmlzaWJpbGl0eSl7X2dhcS5wdXNoKFsiX3RyYWNrRXZlbnQiLCJ2aXNzaXIi LCJzZW55YWxzZ2VvIl0pfX0pO3ZhciBnYUx5ckNpbXM9bWFwLmdldExheWVyc0J5 TmFtZSgiQ2ltcyIpWzBdO2dhTHlyQ2ltcy5ldmVudHMucmVnaXN0ZXIoInZpc2li aWxpdHljaGFuZ2VkIix0aGlzLGZ1bmN0aW9uKGUpe2lmKGdhTHlyQ2ltcy52aXNp YmlsaXR5KXtfZ2FxLnB1c2goWyJfdHJhY2tFdmVudCIsInZpc3NpciIsIkNpbXMi XSl9fSk7dmFyIGdhTHlyUDEwMDA9bWFwLmdldExheWVyc0J5TmFtZSgiV01TUDEw MDAiKVswXTtnYUx5clAxMDAwLmV2ZW50cy5yZWdpc3RlcigidmlzaWJpbGl0eWNo YW5nZWQiLHRoaXMsZnVuY3Rpb24oZSl7aWYoZ2FMeXJQMTAwMC52aXNpYmlsaXR5 KXtfZ2FxLnB1c2goWyJfdHJhY2tFdmVudCIsInZpc3NpciIsIldNU1AxMDAwIl0p fX0pO3ZhciBnYUx5cnRvcG9vcnRvPW1hcC5nZXRMYXllcnNCeU5hbWUoInRvcG9v cnRvIilbMF07Z2FMeXJ0b3Bvb3J0by5ldmVudHMucmVnaXN0ZXIoInZpc2liaWxp dHljaGFuZ2VkIix0aGlzLGZ1bmN0aW9uKGUpe2lmKGdhTHlydG9wb29ydG8udmlz aWJpbGl0eSl7X2dhcS5wdXNoKFsiX3RyYWNrRXZlbnQiLCJ2aXNzaXIiLCJ0b3Bv b3J0byJdKX19KTt2YXIgZ2FMeXJsaW1hZG1pbj1tYXAuZ2V0TGF5ZXJzQnlOYW1l KCJsaW1hZG1pbiIpWzBdO2dhTHlybGltYWRtaW4uZXZlbnRzLnJlZ2lzdGVyKCJ2 aXNpYmlsaXR5Y2hhbmdlZCIsdGhpcyxmdW5jdGlvbihlKXtpZihnYUx5cmxpbWFk bWluLnZpc2liaWxpdHkpe19nYXEucHVzaChbIl90cmFja0V2ZW50Iiwidmlzc2ly IiwibGltYWRtaW4iXSl9fSk7dmFyIGdhTHlyU2lncGFjPW1hcC5nZXRMYXllcnNC eU5hbWUoInNpZ3BhYyIpWzBdO2dhTHlyU2lncGFjLmV2ZW50cy5yZWdpc3Rlcigi dmlzaWJpbGl0eWNoYW5nZWQiLHRoaXMsZnVuY3Rpb24oZSl7aWYoZ2FMeXJTaWdw YWMudmlzaWJpbGl0eSl7X2dhcS5wdXNoKFsiX3RyYWNrRXZlbnQiLCJ2aXNzaXIi LCJzaWdwYWMiXSl9fSk7dmFyIGdhTHlyQ2FkYXN0cmU9bWFwLmdldExheWVyc0J5 TmFtZSgiY2FkYXN0cmUiKVswXTtnYUx5ckNhZGFzdHJlLmV2ZW50cy5yZWdpc3Rl cigidmlzaWJpbGl0eWNoYW5nZWQiLHRoaXMsZnVuY3Rpb24oZSl7aWYoZ2FMeXJD YWRhc3RyZS52aXNpYmlsaXR5KXtfZ2FxLnB1c2goWyJfdHJhY2tFdmVudCIsInZp c3NpciIsImNhZGFzdHJlIl0pfX0pO3ZhciBnYUx5cm5kdmk9bWFwLmdldExheWVy c0J5TmFtZSgibmR2aSIpWzBdO2dhTHlybmR2aS5ldmVudHMucmVnaXN0ZXIoInZp c2liaWxpdHljaGFuZ2VkIix0aGlzLGZ1bmN0aW9uKGUpe2lmKGdhTHlybmR2aS52 aXNpYmlsaXR5KXtfZ2FxLnB1c2goWyJfdHJhY2tFdmVudCIsInZpc3NpciIsIm5k dmkiXSl9fSk7dmFyIGdhTHlySW5mcmFSPW1hcC5nZXRMYXllcnNCeU5hbWUoImlu ZnJhcm9pZyIpWzBdO2dhTHlySW5mcmFSLmV2ZW50cy5yZWdpc3RlcigidmlzaWJp bGl0eWNoYW5nZWQiLHRoaXMsZnVuY3Rpb24oZSl7aWYoZ2FMeXJJbmZyYVIudmlz aWJpbGl0eSl7X2dhcS5wdXNoKFsiX3RyYWNrRXZlbnQiLCJ2aXNzaXIiLCJpbmZy YXJvaWciXSl9fSk7RXh0LmdldENtcCgid2VzdC1wYW5lbCIpLml0ZW1zLmtleSgi Y2VyY2EiKS5leHBhbmQoKTt2YXIgd3A9RXh0LmdldENtcCgid2VzdC1wYW5lbCIp O3ZhciBvbldQY2hhbmdlPWZ1bmN0aW9uKHByb3ZpZGVyKXtoaWRlTGF5ZXJzKCk7 QXBwLmxheW91dC5zZXRTdGF0dXMoIiIpfTt3cC5vbih7YWZ0ZXJsYXlvdXQ6b25X UGNoYW5nZX0pO3ZhciBkd2xkRGl2PUV4dC5nZXRDbXAoIndlc3QtcGFuZWwiKS5p dGVtcy5rZXkoImRvd25sb2FkLWRpdiIpO2R3bGREaXYub24oImV4cGFuZCIsZnVu Y3Rpb24oKXthbWFnYXJUb3QoKTtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJv ZF9pbmRleCIpLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtkb3dsZGN0cmwuYWN0aXZh dGUoKX0pO2R3bGREaXYub24oImNvbGxhcHNlIixmdW5jdGlvbigpe2Rvd2xkY3Ry bC5kZWFjdGl2YXRlKCk7aGlkZUxheWVycygpO2FtYWdhclRvdCgpO2RvY3VtZW50 LmdldEVsZW1lbnRCeUlkKCJwcm9kX2luZGV4Iikuc3R5bGUuZGlzcGxheT0iYmxv Y2sifSk7bWFwLmV2ZW50cy5yZWdpc3RlcigibW92ZWVuZCIsbWFwLGZ1bmN0aW9u KCl7dmFyIG5ab29tPW1hcC5nZXRab29tKCk7dmFyIGx5cmNhcnRvMTAwMD1tYXAu Z2V0TGF5ZXJzQnlOYW1lKCJXTVNQMTAwMCIpWzBdO3ZhciBseXJub2Rpc3A9bWFw LmdldExheWVyc0J5TmFtZSgibm9kaXNwIilbMF07aWYobWFwLmJhc2VMYXllci5u YW1lPT0iVG9wb2dyYXBoaWMifHxtYXAuYmFzZUxheWVyLm5hbWU9PSJUb3BvZ3Im YWFjdXRlO2ZpY2EifHxtYXAuYmFzZUxheWVyLm5hbWU9PSJUb3BvZ3ImYWdyYXZl O2ZpYyIpe2lmKG5ab29tPj0xMCl7bHlyY2FydG8xMDAwLnNldFZpc2liaWxpdHko dHJ1ZSl9ZWxzZXtseXJjYXJ0bzEwMDAuc2V0VmlzaWJpbGl0eShmYWxzZSl9aWYo blpvb209PTExKXtseXJub2Rpc3Auc2V0VmlzaWJpbGl0eSh0cnVlKX1lbHNle2x5 cm5vZGlzcC5zZXRWaXNpYmlsaXR5KGZhbHNlKX1pZihtYXAuZ2V0TGF5ZXJzQnlO YW1lKCJvdmVybGF5X3RyYW5zX29ydG9faGlzdCIpWzBdLmdldFZpc2liaWxpdHko KXx8bWFwLmdldExheWVyc0J5TmFtZSgib3ZlcmxheV90cmFuc19vcnRvIilbMF0u Z2V0VmlzaWJpbGl0eSgpfHxtYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3Ry YW5zX29ydG9fc2lncmlkIilbMF0uZ2V0VmlzaWJpbGl0eSgpKXt2YXIgc2xkckhp c3Q9RXh0LmdldENtcCgic2xpZGVyY29tcGFyZXRvcG9vcnRvIik7dmFyIHNsZHJW YWx1ZT1zbGRySGlzdC5nZXRWYWx1ZSgpO3ZhciBtYXBab29tPW1hcC5nZXRab29t KCk7aWYoc2xkclZhbHVlIT0wKXtzd2l0Y2goc2xkclZhbHVlKXtjYXNlIDA6dmFy IHllYXI9IjE5NTYiO2JyZWFrO2Nhc2UgNDA6dmFyIHllYXI9IjIwMTEiO2JyZWFr O2Nhc2UgMzA6dmFyIHllYXI9IjIwMTAiO2JyZWFrO2Nhc2UgMjA6dmFyIHllYXI9 IjIwMDkiO2JyZWFrO2Nhc2UgMTA6dmFyIHllYXI9IjIwMDgiO2JyZWFrO2Nhc2Ug NTA6dmFyIHllYXI9IjAiO2JyZWFrO2RlZmF1bHQ6dmFyIHllYXI9IjAiO2JyZWFr fWlmKHllYXIhPSIwIiYmeWVhciE9IiIpe09wZW5MYXllcnMuUmVxdWVzdC5HRVQo e3VybDpBcHAuSGlzdG9yaWNzU2VydmVyLHBhcmFtczp7YW55OnllYXIsbml2ZWxs Om1hcFpvb219LGNhbGxiYWNrOkFwcC5sYXlvdXQuaGFuZGxlck9ydG9IaXN0Q29t cH0pfX19fWVsc2V7bHlyY2FydG8xMDAwLnNldFZpc2liaWxpdHkoZmFsc2UpO2x5 cm5vZGlzcC5zZXRWaXNpYmlsaXR5KGZhbHNlKTtBcHAubGF5b3V0Lmx5clRyYW5z Mj1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5zX3RvcG8iKVswXTtp ZihBcHAubGF5b3V0LmluZGV4dGFic0NvbXBhcmVPcnRvPT0wKXtpZihuWm9vbT49 MTApe0FwcC5sYXlvdXQubHlyVHJhbnM9bWFwLmdldExheWVyc0J5TmFtZSgib3Zl cmxheV90cmFuc190b3BvMW0iKVswXTtBcHAubGF5b3V0Lmx5clRyYW5zLnJlZHJh dygpfWVsc2V7QXBwLmxheW91dC5seXJUcmFucz1tYXAuZ2V0TGF5ZXJzQnlOYW1l KCJvdmVybGF5X3RyYW5zX3RvcG8iKVswXTtBcHAubGF5b3V0Lmx5clRyYW5zLnJl ZHJhdygpfX12YXIgc2xkckhpc3Q9RXh0LmdldENtcCgiaGlzdF9zbGlkZXJfY29t cDIiKTt2YXIgc2xkclZhbHVlPXNsZHJIaXN0LmdldFZhbHVlKCk7aWYoc2xkclZh bHVlPDUwKXtzd2l0Y2goc2xkclZhbHVlKXtjYXNlIDQwOnZhciB5ZWFyPSIyMDEx IjticmVhaztjYXNlIDMwOnZhciB5ZWFyPSIyMDEwIjticmVhaztjYXNlIDIwOnZh ciB5ZWFyPSIyMDA5IjticmVhaztjYXNlIDEwOnZhciB5ZWFyPSIyMDA4IjticmVh aztjYXNlIDA6dmFyIHllYXI9IjE5NTYiO2JyZWFrfU9wZW5MYXllcnMuUmVxdWVz dC5HRVQoe3VybDpBcHAuSGlzdG9yaWNzU2VydmVyLHBhcmFtczp7YW55OnllYXIs bml2ZWxsOm5ab29tfSxjYWxsYmFjazpBcHAubGF5b3V0LmhhbmRsZXJPcnRvSGlz dH0pfX1BcHAubGF5b3V0LnJlc2V0Q2xpcDIoKX0pO21hcC5ldmVudHMucmVnaXN0 ZXIoInpvb21lbmQiLG1hcCxmdW5jdGlvbigpe3ZhciBjaGtJbmZSb2lnPUV4dC5n ZXRDbXAoImNoa0luZnJhcm9pZyIpLmdldFZhbHVlKCk7dmFyIGNoa0luZlJvaWdB bHRyZXM9RXh0LmdldENtcCgiY2hrSW5mcmFyb2lnQWx0cmVzIikuZ2V0VmFsdWUo KTt2YXIgY2hrSW5mUm9pZ09ydG89RXh0LmdldENtcCgiY2hrSW5mcmFyb2lnT3J0 byIpLmdldFZhbHVlKCk7aWYoY2hrSW5mUm9pZ3x8Y2hrSW5mUm9pZ09ydG98fGNo a0luZlJvaWdBbHRyZXMpe0FwcC5sYXlvdXQuaGFuZGxlck9ydG9JbmZyYVJvaWco KX12YXIgbWFwWm9vbT1tYXAuZ2V0Wm9vbSgpO3ZhciBub2RlTGltQWRtaW49RXh0 LmdldENtcCgiY2hrTGltQWRtaW5PcnRvIik7aWYobWFwWm9vbT41KXtpZihFeHQu aXNEZWZpbmVkKG5vZGVMaW1BZG1pbikpe25vZGVMaW1BZG1pbi5zZXRWYWx1ZShm YWxzZSk7bm9kZUxpbUFkbWluLmRpc2FibGUoKX19ZWxzZXtpZihtYXAuYmFzZUxh eWVyLm5hbWUhPSJUb3BvZ3JhcGhpYyImJm1hcC5iYXNlTGF5ZXIubmFtZSE9IlRv cG9nciZhYWN1dGU7ZmljYSImJm1hcC5iYXNlTGF5ZXIubmFtZSE9IlRvcG9nciZh Z3JhdmU7ZmljIil7aWYoRXh0LmlzRGVmaW5lZChub2RlTGltQWRtaW4pKXtub2Rl TGltQWRtaW4uZW5hYmxlKCl9fX19KTtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgi c2NlbmVJbmZvIikuaW5uZXJIVE1MPSdNYXBhIHRvcG9nciZhZ3JhdmU7ZmljIDE6 MS4wMDAuMDAwIFs8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0ibGxlZ2VuZGVzL210 YzEwMDBtLnBkZiI+TGxlZ2VuZGE8L2E+XSd9LHJlc2V0Q2xpcDpmdW5jdGlvbihw ZXJjZW50KXt2YXIgYmJveD1BcHAubGF5b3V0Lmx5clRyYW5zLmdldEV4dGVudCgp O3ZhciBiYm94Mj1iYm94LnRvQXJyYXkoKTt2YXIgcHg9bmV3IE9wZW5MYXllcnMu TG9uTGF0KGJib3gyWzJdLGJib3gyWzFdKTt2YXIgYm90dG9tQ2xpcD1BcHAubGF5 b3V0Lmx5clRyYW5zLmdldFZpZXdQb3J0UHhGcm9tTG9uTGF0KHB4KTt2YXIgbW92 ZUNsaXBZPShwZXJjZW50KmJvdHRvbUNsaXAueSkvMTAwO21vdmVDbGlwWT1wYXJz ZUludChib3R0b21DbGlwLnktbW92ZUNsaXBZKTt2YXIgbHlyVHJhbnMxPW1hcC5n ZXRMYXllcnNCeU5hbWUoIm92ZXJsYXlfdHJhbnNfb3J0byIpWzBdO3ZhciBseXJU cmFuczI9bWFwLmdldExheWVyc0J5TmFtZSgib3ZlcmxheV90cmFuc190b3BvIilb MF07dmFyIGx5clRyYW5zMz1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJnZW9sX3RyYW5z IilbMF07dmFyIGx5clRyYW5zND1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5 X3RyYW5zX3RvcG8xbSIpWzBdO3ZhciBseXJUcmFuczU9bWFwLmdldExheWVyc0J5 TmFtZSgib3ZlcmxheV90cmFuc19vcnRvX3NpZ3JpZCIpWzBdO3ZhciBseXJUcmFu czY9bWFwLmdldExheWVyc0J5TmFtZSgib3ZlcmxheV90cmFuc19vcnRvX2hpc3Qi KVswXTt2YXIgbHlyVHJhbnM3PW1hcC5nZXRMYXllcnNCeU5hbWUoIm5kdmkiKVsw XTt2YXIgbHlyVHJhbnM4PW1hcC5nZXRMYXllcnNCeU5hbWUoImluZnJhcm9pZyIp WzBdO3ZhciBvdmw9QXBwLmxheW91dC5seXJUcmFucy5kaXY7b3ZsLnN0eWxlLmNs aXA9InJlY3QoMHB4LCIrYm90dG9tQ2xpcC54KyJweCwiK21vdmVDbGlwWSsicHgs MHB4KSI7dmFyIG92bDE9bHlyVHJhbnMxLmRpdjtvdmwxLnN0eWxlLmNsaXA9InJl Y3QoMHB4LCIrYm90dG9tQ2xpcC54KyJweCwiK21vdmVDbGlwWSsicHgsMHB4KSI7 dmFyIG92bDI9bHlyVHJhbnMyLmRpdjtvdmwyLnN0eWxlLmNsaXA9InJlY3QoMHB4 LCIrYm90dG9tQ2xpcC54KyJweCwiK21vdmVDbGlwWSsicHgsMHB4KSI7dmFyIG92 bDM9bHlyVHJhbnMzLmRpdjtvdmwzLnN0eWxlLmNsaXA9InJlY3QoMHB4LCIrYm90 dG9tQ2xpcC54KyJweCwiK21vdmVDbGlwWSsicHgsMHB4KSI7dmFyIG92bDQ9bHly VHJhbnM0LmRpdjtvdmw0LnN0eWxlLmNsaXA9InJlY3QoMHB4LCIrYm90dG9tQ2xp cC54KyJweCwiK21vdmVDbGlwWSsicHgsMHB4KSI7dmFyIG92bDU9bHlyVHJhbnM1 LmRpdjtvdmw1LnN0eWxlLmNsaXA9InJlY3QoMHB4LCIrYm90dG9tQ2xpcC54KyJw eCwiK21vdmVDbGlwWSsicHgsMHB4KSI7dmFyIG92bDY9bHlyVHJhbnM2LmRpdjtv dmw2LnN0eWxlLmNsaXA9InJlY3QoMHB4LCIrYm90dG9tQ2xpcC54KyJweCwiK21v dmVDbGlwWSsicHgsMHB4KSI7dmFyIG92bDc9bHlyVHJhbnM3LmRpdjtvdmw3LnN0 eWxlLmNsaXA9InJlY3QoMHB4LCIrYm90dG9tQ2xpcC54KyJweCwiK21vdmVDbGlw WSsicHgsMHB4KSI7dmFyIG92bDg9bHlyVHJhbnM4LmRpdjtvdmw4LnN0eWxlLmNs aXA9InJlY3QoMHB4LCIrYm90dG9tQ2xpcC54KyJweCwiK21vdmVDbGlwWSsicHgs MHB4KSJ9LHJlc2V0Q2xpcDI6ZnVuY3Rpb24ocGVyY2VudCl7dmFyIGNudHI9bWFw LmdldENlbnRlcigpO3ZhciB6PW1hcC5nZXRab29tKCk7bWFwLnNldENlbnRlcihj bnRyLHosdHJ1ZSx0cnVlKTt2YXIgbHlyVmVjdG9yPW1hcC5nZXRMYXllcnNCeU5h bWUoInZlY3RvciIpWzBdO2x5clZlY3Rvci5yZWRyYXcoKX0sZ2V0THlyVG9Db21w YXJlOmZ1bmN0aW9uKCl7aWYoQXBwLmxheW91dC5pbmRleFRhYkx5ckNvbXBhcmU9 PTAmJm1hcC5iYXNlTGF5ZXIubmFtZT09bHlyVG9wbyl7QXBwLmxheW91dC5seXJU cmFucz1BcHAubGF5b3V0LmdldFllYXJGcm9tU2xpZGVyQ29tcEhpc3QoMSl9aWYo bWFwLmJhc2VMYXllci5uYW1lPT1seXJPcnRvKXtBcHAubGF5b3V0Lmx5clRyYW5z PUFwcC5sYXlvdXQuZ2V0WWVhckZyb21TbGlkZXJDb21wSGlzdCgyKX19LGdldFll YXJGcm9tU2xpZGVyQ29tcEhpc3Q6ZnVuY3Rpb24ob3Ape2lmKG9wPT0xKXt2YXIg c2xkckhpc3RDb21wPUV4dC5nZXRDbXAoInNsaWRlcmNvbXBhcmV0b3Bvb3J0byIp fWVsc2V7dmFyIHNsZHJIaXN0Q29tcD1FeHQuZ2V0Q21wKCJzbGlkZXJjb21wYXJl b3J0b29ydG8iKX1zd2l0Y2goc2xkckhpc3RDb21wLmdldFZhbHVlKCkpe2Nhc2Ug NTA6bHlyVHJhbnM9bWFwLmdldExheWVyc0J5TmFtZSgib3ZlcmxheV90cmFuc19v cnRvIilbMF07YnJlYWs7Y2FzZSA0MDpseXJUcmFucz1tYXAuZ2V0TGF5ZXJzQnlO YW1lKCJvdmVybGF5X3RyYW5zX29ydG9fc2lncmlkIilbMF07YnJlYWs7Y2FzZSAz MDpseXJUcmFucz1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5zX29y dG9faGlzdCIpWzBdO2JyZWFrO2Nhc2UgMjA6bHlyVHJhbnM9bWFwLmdldExheWVy c0J5TmFtZSgib3ZlcmxheV90cmFuc19vcnRvX2hpc3QiKVswXTticmVhaztjYXNl IDEwOmx5clRyYW5zPW1hcC5nZXRMYXllcnNCeU5hbWUoIm92ZXJsYXlfdHJhbnNf b3J0b19oaXN0IilbMF07YnJlYWs7Y2FzZSAwOmx5clRyYW5zPW1hcC5nZXRMYXll cnNCeU5hbWUoIm92ZXJsYXlfdHJhbnNfb3J0b19oaXN0IilbMF07YnJlYWs7ZGVm YXVsdDpseXJUcmFucz1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5z X29ydG8iKVswXX1yZXR1cm4gbHlyVHJhbnN9LGZvcmNlQ2hhbmdlU2xpZGVyT3Bh Y2l0eTpmdW5jdGlvbihzbGlkZXIpe3ZhciBzbGRDaGFuZ2VPcGFjaXR5PUV4dC5n ZXRDbXAoc2xpZGVyKTt2YXIgdmFsdWVGcm9tc2xkQ2hhbmdlT3BhY2l0eT1zbGRD aGFuZ2VPcGFjaXR5LmdldFZhbHVlKCk7dmFsdWVGcm9tc2xkQ2hhbmdlT3BhY2l0 eT12YWx1ZUZyb21zbGRDaGFuZ2VPcGFjaXR5KzE7c2xkQ2hhbmdlT3BhY2l0eS5z ZXRWYWx1ZSh2YWx1ZUZyb21zbGRDaGFuZ2VPcGFjaXR5LGZhbHNlKTt2YWx1ZUZy b21zbGRDaGFuZ2VPcGFjaXR5PXZhbHVlRnJvbXNsZENoYW5nZU9wYWNpdHktMTtz bGRDaGFuZ2VPcGFjaXR5LnNldFZhbHVlKHZhbHVlRnJvbXNsZENoYW5nZU9wYWNp dHksZmFsc2UpfSxoYW5kbGVyT3J0b0hpc3Q6ZnVuY3Rpb24ocmVzcCl7dmFyIGlu Zm9IaXN0PWV2YWwoIigiK3Jlc3AucmVzcG9uc2VUZXh0KyIpIik7c3dpdGNoKGlu Zm9IaXN0WzBdLnNlcnZpZG9yKXtjYXNlInNoYWdyYXQiOnZhciBvcnRvaGlzdG9y aWNhPW1hcC5nZXRMYXllcnNCeU5hbWUoIm92ZXJsYXlfb3J0b19oaXN0IilbMF07 b3J0b2hpc3RvcmljYS5tZXJnZU5ld1BhcmFtcyh7bGF5ZXJzOmluZm9IaXN0WzBd LmNhcGErIiwiLGZvcm1hdDoiaW1hZ2UvanBlZyJ9KTticmVhaztjYXNlIm9ydG94 cHJlcyI6dmFyIG9ydG9oaXN0b3JpY2E9bWFwLmdldExheWVyc0J5TmFtZSgib3Zl cmxheV9vcnRvX3NpZ3JpZCIpWzBdO29ydG9oaXN0b3JpY2EubWVyZ2VOZXdQYXJh bXMoe2xheWVyczppbmZvSGlzdFswXS5jYXBhLGZvcm1hdDoiaW1hZ2UvanBlZyJ9 KTticmVha31kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2NlbmVJbmZvIikuaW5u ZXJIVE1MPWluZm9IaXN0WzBdLmRlc2NyaXBjaW99LGhhbmRsZXJPcnRvSGlzdENv bXA6ZnVuY3Rpb24ocmVzcCl7dmFyIGluZm9IaXN0PWV2YWwoIigiK3Jlc3AucmVz cG9uc2VUZXh0KyIpIik7bWFwLmdldExheWVyc0J5TmFtZSgib3ZlcmxheV90cmFu c19vcnRvIilbMF0uc2V0VmlzaWJpbGl0eShmYWxzZSk7c3dpdGNoKGluZm9IaXN0 WzBdLnNlcnZpZG9yKXtjYXNlInNoYWdyYXQiOm1hcC5nZXRMYXllcnNCeU5hbWUo Im92ZXJsYXlfdHJhbnNfb3J0b19zaWdyaWQiKVswXS5zZXRWaXNpYmlsaXR5KGZh bHNlKTtseXJUcmFucz1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5z X29ydG9faGlzdCIpWzBdO2x5clRyYW5zLm1lcmdlTmV3UGFyYW1zKHtsYXllcnM6 aW5mb0hpc3RbMF0uY2FwYSsiLCIsZm9ybWF0OiJpbWFnZS9qcGVnIn0pO2JyZWFr O2Nhc2Uib3J0b3hwcmVzIjptYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3Ry YW5zX29ydG9faGlzdCIpWzBdLnNldFZpc2liaWxpdHkoZmFsc2UpO2x5clRyYW5z PW1hcC5nZXRMYXllcnNCeU5hbWUoIm92ZXJsYXlfdHJhbnNfb3J0b19zaWdyaWQi KVswXTtseXJUcmFucy5tZXJnZU5ld1BhcmFtcyh7bGF5ZXJzOmluZm9IaXN0WzBd LmNhcGEsZm9ybWF0OiJpbWFnZS9qcGVnIn0pO2JyZWFrfUFwcC5sYXlvdXQuZm9y Y2VDaGFuZ2VTbGlkZXJPcGFjaXR5KCJzbGlkZXJfY29tcGFyYWNpbyIpfSxoYW5k bGVyT3J0b0hpc3RDb21wT3J0bzpmdW5jdGlvbihyZXNwKXt2YXIgaW5mb0hpc3Q9 ZXZhbCgiKCIrcmVzcC5yZXNwb25zZVRleHQrIikiKTttYXAuZ2V0TGF5ZXJzQnlO YW1lKCJvdmVybGF5X3RyYW5zX29ydG8iKVswXS5zZXRWaXNpYmlsaXR5KGZhbHNl KTtzd2l0Y2goaW5mb0hpc3RbMF0uc2Vydmlkb3Ipe2Nhc2Uic2hhZ3JhdCI6bWFw LmdldExheWVyc0J5TmFtZSgib3ZlcmxheV90cmFuc19vcnRvX3NpZ3JpZCIpWzBd LnNldFZpc2liaWxpdHkoZmFsc2UpO0FwcC5sYXlvdXQubHlyVHJhbnM9bWFwLmdl dExheWVyc0J5TmFtZSgib3ZlcmxheV90cmFuc19vcnRvX2hpc3QiKVswXTtBcHAu bGF5b3V0Lmx5clRyYW5zLm1lcmdlTmV3UGFyYW1zKHtsYXllcnM6aW5mb0hpc3Rb MF0uY2FwYSsiLCIsZm9ybWF0OiJpbWFnZS9qcGVnIn0pO2JyZWFrO2Nhc2Uib3J0 b3hwcmVzIjptYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5zX29ydG9f aGlzdCIpWzBdLnNldFZpc2liaWxpdHkoZmFsc2UpO0FwcC5sYXlvdXQubHlyVHJh bnM9bWFwLmdldExheWVyc0J5TmFtZSgib3ZlcmxheV90cmFuc19vcnRvX3NpZ3Jp ZCIpWzBdO0FwcC5sYXlvdXQubHlyVHJhbnMubWVyZ2VOZXdQYXJhbXMoe2xheWVy czppbmZvSGlzdFswXS5jYXBhLGZvcm1hdDoiaW1hZ2UvanBlZyJ9KTticmVha31B cHAubGF5b3V0LmZvcmNlQ2hhbmdlU2xpZGVyT3BhY2l0eSgic2xpZGVyX2NvbXBh cmFjaW9fb3J0byIpfSxoYW5kbGVyT3J0b0luZnJhUm9pZzpmdW5jdGlvbigpe3Zh ciBtYXBab29tPW1hcC5nZXRab29tKCk7aWYobWFwWm9vbTw3KXtseXJUcmFucz1t YXAuZ2V0TGF5ZXJzQnlOYW1lKCJpbmZyYXJvaWciKVswXTtseXJUcmFucy5tZXJn ZU5ld1BhcmFtcyh7bGF5ZXJzOiJvcnRvaTI1bSwifSk7ZG9jdW1lbnQuZ2V0RWxl bWVudEJ5SWQoInNjZW5lSW5mbyIpLmlubmVySFRNTD1zY2VuZUluZm9JRlIyNW07 X2dhcS5wdXNoKFsiX3RyYWNrRXZlbnQiLCJ2aXNzaXIiLCJpbmZyYXJvaWcyNW0i XSl9aWYobWFwWm9vbT42JiZtYXBab29tPDEwKXtseXJUcmFucz1tYXAuZ2V0TGF5 ZXJzQnlOYW1lKCJpbmZyYXJvaWciKVswXTtseXJUcmFucy5tZXJnZU5ld1BhcmFt cyh7bGF5ZXJzOiJvcnRvaTVtLCJ9KTtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgi c2NlbmVJbmZvIikuaW5uZXJIVE1MPXNjZW5lSW5mb0lGUjVtO19nYXEucHVzaChb Il90cmFja0V2ZW50Iiwidmlzc2lyIiwiaW5mcmFyb2lnNW0iXSl9aWYobWFwWm9v bT45KXtseXJUcmFucz1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJpbmZyYXJvaWciKVsw XTtseXJUcmFucy5tZXJnZU5ld1BhcmFtcyh7bGF5ZXJzOiJvcnRvaTI1YywifSk7 ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNjZW5lSW5mbyIpLmlubmVySFRNTD1z Y2VuZUluZm9JRlIyNWM7X2dhcS5wdXNoKFsiX3RyYWNrRXZlbnQiLCJ2aXNzaXIi LCJpbmZyYXJvaWcyNWMiXSl9fSxoYW5kbGVyQ2hlY2tCb3hPdGhlcnNPcnRvSGlz dDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLmlkKXtjYXNlImFsdGNhbXAiOnZhciBh bHRyZXN2b2xzPW1hcC5nZXRMYXllcnNCeU5hbWUoIm92ZXJsYXlfb3J0b19zaWdy aWQiKVswXTt2YXIgb3J0b2Jhc2U9bWFwLmdldExheWVyc0J5TmFtZShseXJPcnRv KVswXTtpZih0aGlzLmdldFZhbHVlKCk9PXRydWUpe0V4dC5nZXRDbXAoImdyYWZp YyIpLnNldERpc2FibGVkKGZhbHNlKTtFeHQuZ2V0Q21wKCJlc3RlcmVvIikuc2V0 RGlzYWJsZWQoZmFsc2UpO0V4dC5nZXRDbXAoImZhbHNjb2xvciIpLnNldERpc2Fi bGVkKGZhbHNlKTtFeHQuZ2V0Q21wKCJoaXN0X3NsaWRlciIpLnNldERpc2FibGVk KHRydWUpO2FsdHJlc3ZvbHMubWVyZ2VOZXdQYXJhbXMoe2xheWVyczoiQWx0IENh bXAgMTIuNWNtLiAyMDEwIn0pO2FsdHJlc3ZvbHMuc2V0VmlzaWJpbGl0eSh0cnVl KTtvcnRvYmFzZS5zZXRWaXNpYmlsaXR5KGZhbHNlKX1lbHNle0V4dC5nZXRDbXAo ImZhbHNjb2xvciIpLnNldERpc2FibGVkKHRydWUpO0V4dC5nZXRDbXAoImdyYWZp YyIpLnNldERpc2FibGVkKHRydWUpO0V4dC5nZXRDbXAoImVzdGVyZW8iKS5zZXRE aXNhYmxlZCh0cnVlKTtFeHQuZ2V0Q21wKCJoaXN0X3NsaWRlciIpLnNldERpc2Fi bGVkKGZhbHNlKTthbHRyZXN2b2xzLnNldFZpc2liaWxpdHkoZmFsc2UpO29ydG9i YXNlLnNldFZpc2liaWxpdHkodHJ1ZSl9YnJlYWt9fSxoYW5kbGVyQ2hlY2tCb3hP dGhlcnNPcnRvSGlzdFR5cGVWaWV3ZXI6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5p ZCl7Y2FzZSJncmFmaWMiOnZhciBhbHRyZXN2b2xzPW1hcC5nZXRMYXllcnNCeU5h bWUoIm92ZXJsYXlfb3J0b19zaWdyaWQiKVswXTt2YXIgb3J0b2Jhc2U9bWFwLmdl dExheWVyc0J5TmFtZShseXJPcnRvKVswXTtpZih0aGlzLmdldFZhbHVlKCk9PXRy dWUpe2FsdHJlc3ZvbHMubWVyZ2VOZXdQYXJhbXMoe3N0eWxlczoiU0dEX1ZpZXdP cHRpb25zOjpWZWN0b3JJbnZpc2libGVPbiJ9KX1lbHNle2FsdHJlc3ZvbHMubWVy Z2VOZXdQYXJhbXMoe3N0eWxlczoiU0dEX1ZpZXdPcHRpb25zOjpWZWN0b3JJbnZp c2libGVPZmYifSl9YnJlYWt9fSxoYW5kbGVyVmVydGljYWxDdXJ0YWluOmZ1bmN0 aW9uKHNsZCl7QXBwLmxheW91dC5seXJUcmFucy5zZXRPcGFjaXR5KDEpO3ZhciBi Ym94PUFwcC5sYXlvdXQubHlyVHJhbnMuZ2V0RXh0ZW50KCk7dmFyIGJib3gyPWJi b3gudG9BcnJheSgpO3ZhciBweD1uZXcgT3BlbkxheWVycy5Mb25MYXQoYmJveDJb Ml0sYmJveDJbMV0pO3ZhciBib3R0b21DbGlwPUFwcC5sYXlvdXQubHlyVHJhbnMu Z2V0Vmlld1BvcnRQeEZyb21Mb25MYXQocHgpO3ZhciBzbGRWYWx1ZT1FeHQuZ2V0 Q21wKHNsZCk7dmFyIHNsaWRlclZhbHVlSW52ZXJzZT0xMDAtc2xkVmFsdWUuZ2V0 VmFsdWUoKTt2YXIgbW92ZUNsaXA9KHNsaWRlclZhbHVlSW52ZXJzZSpib3R0b21D bGlwLnkpLzEwMDttb3ZlQ2xpcD1wYXJzZUludChib3R0b21DbGlwLnktbW92ZUNs aXApO3ZhciBvdmw9QXBwLmxheW91dC5seXJUcmFucy5kaXY7b3ZsLnN0eWxlLmNs aXA9InJlY3QoMHB4LCIrYm90dG9tQ2xpcC54KyJweCwiK21vdmVDbGlwKyJweCww cHgpIjt2YXIgbnVtWm9vbT1tYXAuZ2V0Wm9vbSgpO2lmKG51bVpvb20+PTEwJiZt YXAuYmFzZUxheWVyLm5hbWU9PWx5ck9ydG8pe3ZhciBvdmwyPUFwcC5sYXlvdXQu bHlyVHJhbnMyLmRpdjtvdmwyLnN0eWxlLmNsaXA9InJlY3QoMHB4LCIrYm90dG9t Q2xpcC54KyJweCwiK21vdmVDbGlwKyJweCwwcHgpIn19LGhhbmRsZXJIb3Jpem9u dGFsQ3VydGFpbjpmdW5jdGlvbihzbGQpe0FwcC5sYXlvdXQubHlyVHJhbnMuc2V0 T3BhY2l0eSgxKTt2YXIgYmJveD1BcHAubGF5b3V0Lmx5clRyYW5zLmdldEV4dGVu dCgpO3ZhciBiYm94Mj1iYm94LnRvQXJyYXkoKTt2YXIgcHg9bmV3IE9wZW5MYXll cnMuTG9uTGF0KGJib3gyWzJdLGJib3gyWzFdKTt2YXIgYm90dG9tQ2xpcD1BcHAu bGF5b3V0Lmx5clRyYW5zLmdldFZpZXdQb3J0UHhGcm9tTG9uTGF0KHB4KTt2YXIg c2xkVmFsdWU9RXh0LmdldENtcChzbGQpO3ZhciBzbGlkZXJWYWx1ZUludmVyc2U9 MTAwLXNsZFZhbHVlLmdldFZhbHVlKCk7dmFyIG1vdmVDbGlwPShzbGlkZXJWYWx1 ZUludmVyc2UqYm90dG9tQ2xpcC54KS8xMDA7bW92ZUNsaXA9cGFyc2VJbnQoYm90 dG9tQ2xpcC54LW1vdmVDbGlwKTt2YXIgb3ZsPUFwcC5sYXlvdXQubHlyVHJhbnMu ZGl2O292bC5zdHlsZS5jbGlwPSJyZWN0KDBweCwiK21vdmVDbGlwKyJweCwiK2Jv dHRvbUNsaXAueSsicHgsMHB4KSI7dmFyIG51bVpvb209bWFwLmdldFpvb20oKTtp ZihudW1ab29tPj0xMCYmbWFwLmJhc2VMYXllci5uYW1lPT1seXJPcnRvKXt2YXIg b3ZsMj1BcHAubGF5b3V0Lmx5clRyYW5zMi5kaXY7b3ZsMi5zdHlsZS5jbGlwPSJy ZWN0KDBweCwiK21vdmVDbGlwKyJweCwiK2JvdHRvbUNsaXAueSsicHgsMHB4KSJ9 fSxkaXNhYmxlU2xpZGVyT3RoZXJzT25Ub3BvOmZ1bmN0aW9uKCl7dmFyIGNoa0dl b2w9RXh0LmdldENtcCgiY2hrR2VvbCIpO3ZhciBjaGtJbmZMeXI9RXh0LmdldENt cCgiY2hrSW5mcmFyb2lnIik7dmFyIGNoa05kdmlMeXI9RXh0LmdldENtcCgiY2hr TkRWSSIpO3ZhciBzbGRyT3RoZXJzT25Ub3BvPUV4dC5nZXRDbXAoInNsaWRlcl9j b21wYXJhY2lvX2dlb2wiKTtpZighY2hrR2VvbC5nZXRWYWx1ZSgpJiYhY2hrSW5m THlyLmdldFZhbHVlKCkmJiFjaGtOZHZpTHlyLmdldFZhbHVlKCkpe3NsZHJPdGhl cnNPblRvcG8uc2V0RGlzYWJsZWQodHJ1ZSl9fSxnZXRNYXA6ZnVuY3Rpb24oKXty ZXR1cm4gbWFwfSxzZXRXTVNWaXNpYmxlOmZ1bmN0aW9uKG9wLHRhbGwpe3N3aXRj aCh0YWxsKXtjYXNlInQyIjp2YXIgbHlyV01TPW1hcC5nZXRMYXllcnNCeU5hbWUo IlRhbGw1IilbMF07YnJlYWs7Y2FzZSJ0NSI6dmFyIGx5cldNUz1tYXAuZ2V0TGF5 ZXJzQnlOYW1lKCJUYWxsNSIpWzBdO2JyZWFrO2Nhc2UidDEwIjp2YXIgbHlyV01T PW1hcC5nZXRMYXllcnNCeU5hbWUoIlRhbGwxMCIpWzBdO2JyZWFrO2Nhc2UidDI1 Ijp2YXIgbHlyV01TPW1hcC5nZXRMYXllcnNCeU5hbWUoIlRhbGwyNSIpWzBdO2Jy ZWFrO2Nhc2UidDUwIjp2YXIgbHlyV01TPW1hcC5nZXRMYXllcnNCeU5hbWUoIlRh bGw1MCIpWzBdO2JyZWFrO2Nhc2UiY29tYXJjYWwiOnZhciBseXJXTVM9bWFwLmdl dExheWVyc0J5TmFtZSgiV01TQ09NIilbMF07YnJlYWs7Y2FzZSJwMTAwMCI6dmFy IGx5cldNUz1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJXTVNQMTAwMFBPTFlHIilbMF07 YnJlYWt9dmFyIHN0YXR1c0JhclRleHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo Im1lYXN1cmVJbmZvIik7aWYobHlyV01TPT09dW5kZWZpbmVkKXtpZihvcD09MSl7 aWYoQXBwLmxheW91dC5iYXNlPT0idG9wbyIpe3N3aXRjaCh0YWxsKXtjYXNlInQ1 Ijp2YXIgcnNlcmllPSJidDVtc2lkIjticmVhaztjYXNlInQxMCI6dmFyIHJzZXJp ZT0ibXQxMG0iO2JyZWFrO2Nhc2UidDI1Ijp2YXIgcnNlcmllPSJidDI1bXNpZCI7 YnJlYWs7Y2FzZSJ0NTAiOnZhciByc2VyaWU9ImJ0NTBtZGduIjticmVhaztjYXNl ImNvbWFyY2FsIjp2YXIgcnNlcmllPSJtdGM1MG0iO2JyZWFrfX1lbHNle2lmKEFw cC5sYXlvdXQuYmFzZT09Im9ydG8iKXtzd2l0Y2godGFsbCl7Y2FzZSJ0MiI6dmFy IHJzZXJpZT0ib3J0bzI1YyI7YnJlYWs7Y2FzZSJ0NSI6dmFyIHJzZXJpZT0ib3J0 bzVtIjticmVhaztjYXNlInQyNSI6dmFyIHJzZXJpZT0ib3J0bzI1bSI7YnJlYWt9 fWVsc2V7aWYoQXBwLmxheW91dC5iYXNlPT0ibWV0Iil7aWYodGFsbD09InQ1MCIp e3ZhciByc2VyaWU9Im1ldDE1dHh0In19ZWxzZXtpZihBcHAubGF5b3V0LmJhc2U9 PSJtcDIwIil7aWYodGFsbD09InQ1Iil7dmFyIHJzZXJpZT0ibXAyMHA1bWRnbiJ9 fX19fXZhciBtYXBDZW50ZXI9bWFwLmdldENlbnRlcigpO09wZW5MYXllcnMubG9h ZFVSTCh0aGlzLnVyaUdldFByb2QsIj94PSIrcGFyc2VJbnQobWFwQ2VudGVyLmxv bikrIiZ5PSIrcGFyc2VJbnQobWFwQ2VudGVyLmxhdCkrIiZyc2VyaWU9Iityc2Vy aWUsdGhpcyx0aGlzLnByb2Nlc3NEYXRhLHRoaXMuc2hvd0Vycm9yKX1lbHNle3N3 aXRjaChBcHAubGF5b3V0LnByb2R1Y3Qpe2Nhc2UiYnQ1bSI6dmFyIGx5cldNUz1t YXAuZ2V0TGF5ZXJzQnlOYW1lKCJUYWxsNSIpWzBdO2JyZWFrO2Nhc2UibXQxMG0i OnZhciBseXJXTVM9bWFwLmdldExheWVyc0J5TmFtZSgiVGFsbDEwIilbMF07YnJl YWs7Y2FzZSJidDI1bSI6dmFyIGx5cldNUz1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJU YWxsMjUiKVswXTticmVhaztjYXNlImJ0NTBtIjp2YXIgbHlyV01TPW1hcC5nZXRM YXllcnNCeU5hbWUoIlRhbGw1MCIpWzBdO2JyZWFrO2Nhc2UiY29tNTBtIjp2YXIg bHlyV01TPW1hcC5nZXRMYXllcnNCeU5hbWUoIldNU0NPTSIpWzBdO2JyZWFrO2Nh c2Uib2YyNWMiOnZhciBseXJXTVM9bWFwLmdldExheWVyc0J5TmFtZSgiVGFsbDUi KVswXTticmVhaztjYXNlIm9mNW0iOnZhciBseXJXTVM9bWFwLmdldExheWVyc0J5 TmFtZSgiVGFsbDUiKVswXTticmVhaztjYXNlIm9mMjVtIjp2YXIgbHlyV01TPW1h cC5nZXRMYXllcnNCeU5hbWUoIlRhbGwyNSIpWzBdO2JyZWFrO2Nhc2UibWV0MTUi OnZhciBseXJXTVM9bWFwLmdldExheWVyc0J5TmFtZSgiVGFsbDUwIilbMF07YnJl YWs7Y2FzZSJjdDFtIjp2YXIgbHlyV01TPW1hcC5nZXRMYXllcnNCeU5hbWUoIldN U1AxMDAwUE9MWUciKVswXTticmVhaztjYXNlIm1wMjAiOnZhciBseXJXTVM9bWFw LmdldExheWVyc0J5TmFtZSgiVGFsbDUiKVswXTticmVha31pZihBcHAubGF5b3V0 LnByb2R1Y3QhPW51bGwpe3ZhciBuWj1tYXAuZ2V0Wm9vbSgpO2lmKG5aPT0xMCYm QXBwLmxheW91dC5wcm9kdWN0PT0iY3QxbSIpe2x5cldNUy5zZXRWaXNpYmlsaXR5 KHRydWUpfWVsc2V7aWYoQXBwLmxheW91dC5wcm9kdWN0IT0ibXRjMjUwbSImJkFw cC5sYXlvdXQucHJvZHVjdCE9Im10YzUwMG0iJiZBcHAubGF5b3V0LnByb2R1Y3Qh PSJtdGMxMDAwbSIpe2lmKGx5cldNUyE9PXVuZGVmaW5lZCl7bHlyV01TLnNldFZp c2liaWxpdHkoZmFsc2UpfXZhciBseXJXTVMyPW1hcC5nZXRMYXllcnNCeU5hbWUo IldNUzIiKVswXTtseXJXTVMyLnNldFZpc2liaWxpdHkoZmFsc2UpO3ZhciBseXJX TVNDT00yPW1hcC5nZXRMYXllcnNCeU5hbWUoIldNU0NPTTIiKVswXTtseXJXTVND T00yLnNldFZpc2liaWxpdHkoZmFsc2UpfX19c3RhdHVzQmFyVGV4dC5pbm5lckhU TUw9IiI7bWFwLmdldENvbnRyb2xzQnlDbGFzcygiVmlzc2lyLkNsaWNrIilbMF0u ZGVhY3RpdmF0ZSgpO21hcC5nZXRDb250cm9sc0J5Q2xhc3MoIlZpc3Npci5DbGlj a01hcCIpWzBdLmFjdGl2YXRlKCl9fWVsc2V7aWYodGFsbCE9InAxMDAwIil7aWYo b3A9PTEpe2x5cldNUy5zZXRWaXNpYmlsaXR5KHRydWUpO2lmKHRhbGw9PSJjb21h cmNhbCIpe3N0YXR1c0JhclRleHQuaW5uZXJIVE1MPXNlbGVjY2lvbmFyQ31lbHNl e3N0YXR1c0JhclRleHQuaW5uZXJIVE1MPXNlbGVjY2lvbmFyRn1tYXAuZ2V0Q29u dHJvbHNCeUNsYXNzKCJWaXNzaXIuQ2xpY2siKVswXS5hY3RpdmF0ZSgpO21hcC5n ZXRDb250cm9sc0J5Q2xhc3MoIlZpc3Npci5DbGlja01hcCIpWzBdLmRlYWN0aXZh dGUoKX1lbHNle2x5cldNUy5zZXRWaXNpYmlsaXR5KGZhbHNlKTt2YXIgbHlyV01T Mj1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJXTVMyIilbMF07bHlyV01TMi5zZXRWaXNp YmlsaXR5KGZhbHNlKTtzdGF0dXNCYXJUZXh0LmlubmVySFRNTD0iIjttYXAuZ2V0 Q29udHJvbHNCeUNsYXNzKCJWaXNzaXIuQ2xpY2siKVswXS5kZWFjdGl2YXRlKCk7 bWFwLmdldENvbnRyb2xzQnlDbGFzcygiVmlzc2lyLkNsaWNrTWFwIilbMF0uYWN0 aXZhdGUoKX19ZWxzZXtpZih0YWxsPT0icDEwMDAiJiZvcD09MSl7dmFyIGx5cldN U1AxMDAwPW1hcC5nZXRMYXllcnNCeU5hbWUoIldNU1AxMDAwUE9MWUciKVswXTts eXJXTVNQMTAwMC5zZXRWaXNpYmlsaXR5KHRydWUpO3N0YXR1c0JhclRleHQuaW5u ZXJIVE1MPXNlbGVjY2lvbmFyUDttYXAuZ2V0Q29udHJvbHNCeUNsYXNzKCJWaXNz aXIuQ2xpY2siKVswXS5hY3RpdmF0ZSgpO21hcC5nZXRDb250cm9sc0J5Q2xhc3Mo IlZpc3Npci5DbGlja01hcCIpWzBdLmRlYWN0aXZhdGUoKX1lbHNle2lmKHRhbGw9 PSJwMTAwMCImJm9wPT0wKXt2YXIgblpvb209bWFwLmdldFpvb20oKTt2YXIgY2Fy dG8xMDAwPW1hcC5nZXRMYXllcnNCeU5hbWUoIldNU1AxMDAwUE9MWUciKVswXTtp ZihuWm9vbT09MTApe2NhcnRvMTAwMC5zZXRWaXNpYmlsaXR5KHRydWUpfWVsc2V7 Y2FydG8xMDAwLnNldFZpc2liaWxpdHkoZmFsc2UpfX1lbHNle2x5cldNUy5zZXRW aXNpYmlsaXR5KGZhbHNlKTt2YXIgbHlyV01TQ09NPW1hcC5nZXRMYXllcnNCeU5h bWUoIldNU0NPTSIpWzBdO2x5cldNU0NPTS5zZXRWaXNpYmlsaXR5KGZhbHNlKTt2 YXIgbHlyV01TQ09NMj1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJXTVNDT00yIilbMF07 bHlyV01TQ09NMi5zZXRWaXNpYmlsaXR5KGZhbHNlKTt2YXIgbHlyV01TUDEwMDA9 bWFwLmdldExheWVyc0J5TmFtZSgiV01TUDEwMDBQT0xZRyIpWzBdO2x5cldNU1Ax MDAwLnNldFZpc2liaWxpdHkoZmFsc2UpO3N0YXR1c0JhclRleHQuaW5uZXJIVE1M PSIifX19aWYob3A9PTAmJnRhbGw9PSIiKXt2YXIgbHlyV01TQ09NPW1hcC5nZXRM YXllcnNCeU5hbWUoIldNU0NPTSIpWzBdO2x5cldNU0NPTS5zZXRWaXNpYmlsaXR5 KGZhbHNlKTt2YXIgbHlyV01TQ09NMj1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJXTVND T00yIilbMF07bHlyV01TQ09NMi5zZXRWaXNpYmlsaXR5KGZhbHNlKX19fSxwcm9j ZXNzRGF0YTpmdW5jdGlvbihyZXNwKXt2YXIgZGFkZXM9ZXZhbCgiKCIrcmVzcC5y ZXNwb25zZVRleHQrIikiKTtpZihkYWRlcy5sZW5ndGghPTApe3ZhciByc2VyaWU9 ZGFkZXNbMF0ucnNlcmllLnN1YnN0cmluZygwLDQpO2lmKHJzZXJpZT09Im9ydG8i KXtzd2l0Y2goZGFkZXNbMF0ucnNlcmllKXtjYXNlIm9ydG8yNWMiOm1vc3RyYSgi cHJvZF9vZjIiLDApO2JyZWFrO2Nhc2Uib3J0bzVtIjptb3N0cmEoInByb2Rfb2Y1 IiwwKTticmVhaztjYXNlIm9ydG8yNW0iOm1vc3RyYSgicHJvZF9vZjI1IiwwKTti cmVha31tb3N0cmEoImRlc2NhcnJlZ2Ffb3J0byIsMSk7ZG9jdW1lbnQuZ2V0RWxl bWVudEJ5SWQoInRpdG9sX3Byb2R1Y3RlIikuaW5uZXJIVE1MPWRhZGVzWzBdLnNl cmllO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJub21fZnVsbCIpLmlubmVySFRN TD0iJiM4MjI2OyIrbm9tKyI6ICIrZGFkZXNbMF0ubm9tO2RvY3VtZW50LmdldEVs ZW1lbnRCeUlkKCJpZF9yZWwiKS5pbm5lckhUTUw9IiYjODIyNjtJZC4gUmVsLjog IitkYWRlc1swXS5mdWxsO3ZhciBSbGlua3M9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 SWQoInJhZGlvX2Rvd25sb2FkX3RvcG8iKX1lbHNle3N3aXRjaChyc2VyaWUpe2Nh c2UiYnQ1bSI6bW9zdHJhKCJwcm9kX2J0NW0iLDApO2JyZWFrO2Nhc2UibXQxMCI6 bW9zdHJhKCJwcm9kX210MTBtIiwwKTticmVhaztjYXNlImJ0MjUiOm1vc3RyYSgi cHJvZF9idDI1bSIsMCk7YnJlYWs7Y2FzZSJidDUwIjptb3N0cmEoInByb2RfYnQ1 MG0iLDApO2JyZWFrO2Nhc2UibXRjNSI6bW9zdHJhKCJwcm9kX2NvbTUwbSIsMCk7 YnJlYWt9bW9zdHJhKCJkZXNjYXJyZWdhIiwxKTtkb2N1bWVudC5nZXRFbGVtZW50 QnlJZCgidGl0b2xfcHJvZHVjdGUiKS5pbm5lckhUTUw9ZGFkZXNbMF0uc2VyaWU7 ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5vbV9mdWxsIikuaW5uZXJIVE1MPSIm IzgyMjY7Iitub20rIjogIitkYWRlc1swXS5ub207ZG9jdW1lbnQuZ2V0RWxlbWVu dEJ5SWQoImlkX3JlbCIpLmlubmVySFRNTD0iJiM4MjI2O0lkLiBSZWwuOiAiK2Rh ZGVzWzBdLmZ1bGw7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZ1bGxEZXNjIiku dmFsdWU9ZGFkZXNbMF0uZnVsbDt2YXIgUmxpbmtzPWRvY3VtZW50LmdldEVsZW1l bnRCeUlkKCJyYWRpb19kb3dubG9hZF90b3BvIil9dmFyIHNIVE1MPSIiO2Zvcih2 YXIgaT0wO2k8ZGFkZXMubGVuZ3RoO2krKyl7c0hUTUwrPSc8bGFiZWwgZm9yPSJp ZHJhZF8iJytpKyciPjxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0icmFkR3JvdXAi IGlkPSJpZHJhZF8nK2krJyIgdmFsdWU9IicrZGFkZXNbaV0ucGF0aG5hbWUrJyIn O2lmKGk9PTApe3NIVE1MKz0iIGNoZWNrZWQgIn1zSFRNTCs9Ij4iK2RhZGVzW2ld LmZvcm1hdCsiPC9sYWJlbD48YnIvPiJ9UmxpbmtzLmlubmVySFRNTD1zSFRNTH19 LHNob3dXaW5kb3c6ZnVuY3Rpb24ocnNlcmllKXt2YXIgd2luRGlzcG9uaWJsZXM9 bmV3IEV4dC5XaW5kb3coe2F1dG9IZWlnaHQ6ZmFsc2Usd2lkdGg6NTIwLGhlaWdo dDo2MDAscmVzaXphYmxlOmZhbHNlLGNsb3NlQWN0aW9uOiJoaWRlIix0aXRsZTpk aXNwb25pYmlsaXRhdCxpdGVtczpbe2h0bWw6JzxpZnJhbWUgd2lkdGg9IjUwMCIg aGVpZ2h0PSI0OTAiIGZyYW1lYm9yZGVyPSIwIiBzY3JvbGxpbmc9Im5vIiBtYXJn aW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIwIiBzcmM9Ii92aXNzaXIzL21zcHJv ZHVjY2lvL2luZGV4Lmh0bWw/em9vbT0wJmxhdD00NjE4NTAwJmxvbj0zOTcwMDAm bGF5ZXJzPUIwRlRGRkZGRkZGIiA+PC9pZnJhbWU+J30se3h0eXBlOiJwYW5lbCIs dGl0bGU6RGlzcG9MZWdlbmQsaGVpZ2h0Ojc1LGh0bWw6IiJ9XX0pO3ZhciBwcmVV cmw9JzxpZnJhbWUgd2lkdGg9IjUwMCIgaGVpZ2h0PSI0OTAiIGZyYW1lYm9yZGVy PSIwIiBzY3JvbGxpbmc9Im5vIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRo PSIwIiBzcmM9Ii92aXNzaXIzNy9tc3Byb2R1Y2Npby9pbmRleC5odG1sP3pvb209 MCZsYXQ9NDYxODUwMCZsb249Mzk3MDAwJzt2YXIgc3VmVXJsPSciPjwvaWZyYW1l Pic7dmFyIGlkaW9tYT1FeHQudXJsRGVjb2RlKGxvY2F0aW9uLnNlYXJjaC5zdWJz dHJpbmcoMSkpO2lmKGlkaW9tYS5sYW5nPT09dW5kZWZpbmVkKXtpZGlvbWEubGFu Zz0iY2F0In1zdWZVcmw9IiZsYW5nPSIraWRpb21hLmxhbmcrc3VmVXJsO3ZhciBp ZGlvbWE9RXh0LnVybERlY29kZShsb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEp KTtpZihpZGlvbWEubGFuZz09PXVuZGVmaW5lZCl7aWRpb21hLmxhbmc9ImNhdCJ9 c3VmVXJsPSImbGFuZz0iK2lkaW9tYS5sYW5nK3N1ZlVybDtzd2l0Y2gocnNlcmll KXtjYXNlImN0MW0iOndpbkRpc3BvbmlibGVzLml0ZW1zLml0ZW1zWzBdLmh0bWw9 cHJlVXJsKyImbGF5ZXJzPUIwRkZGRkZGRkZGVEYiK3N1ZlVybDt3aW5EaXNwb25p Ymxlcy5zZXRUaXRsZShkaXNwb2N0MW0pO3dpbkRpc3BvbmlibGVzLml0ZW1zLml0 ZW1zWzFdLnNldFZpc2libGUoZmFsc2UpO2JyZWFrO2Nhc2UiYnQ1bSI6d2luRGlz cG9uaWJsZXMuaXRlbXMuaXRlbXNbMF0uaHRtbD1wcmVVcmwrIiZsYXllcnM9QjBU RkZGRkZGRkZGRiIrc3VmVXJsO3dpbkRpc3BvbmlibGVzLnNldFRpdGxlKGRpc3Bv YnQ1bStkaXNwb25pYmlsaXRhdCk7d2luRGlzcG9uaWJsZXMuaXRlbXMuaXRlbXNb MV0uc2V0VGl0bGUoRGlzcG9MZWdlbmQrIjogICIrVGl0TGVnVG9wbyk7d2luRGlz cG9uaWJsZXMuaXRlbXMuaXRlbXNbMV0uaHRtbD1CdDVtTGVnO2JyZWFrO2Nhc2Ui bXRjMTBtIjp3aW5EaXNwb25pYmxlcy5pdGVtcy5pdGVtc1swXS5odG1sPXByZVVy bCsiJmxheWVycz1CMEZURkZGRkZGRkZGIitzdWZVcmw7d2luRGlzcG9uaWJsZXMu c2V0VGl0bGUoZGlzcG9tdGMxMG0rZGlzcG9uaWJpbGl0YXQpO3dpbkRpc3Bvbmli bGVzLml0ZW1zLml0ZW1zWzFdLnNldFRpdGxlKERpc3BvTGVnZW5kKyI6ICAiK1Rp dExlZ1RvcG8pO3dpbkRpc3BvbmlibGVzLml0ZW1zLml0ZW1zWzFdLmh0bWw9TXRj MTBMZWc7YnJlYWs7Y2FzZSJidDI1bSI6d2luRGlzcG9uaWJsZXMuaXRlbXMuaXRl bXNbMF0uaHRtbD1wcmVVcmwrIiZsYXllcnM9QjBGRlRGRkZGRkZGRiIrc3VmVXJs O3dpbkRpc3BvbmlibGVzLnNldFRpdGxlKGRpc3BvYnQyNW0rZGlzcG9uaWJpbGl0 YXQpO3dpbkRpc3BvbmlibGVzLml0ZW1zLml0ZW1zWzFdLnNldFRpdGxlKERpc3Bv TGVnZW5kKyI6ICAiK1RpdExlZ1RvcG8pO3dpbkRpc3BvbmlibGVzLml0ZW1zLml0 ZW1zWzFdLmh0bWw9QnQyNW1MZWc7YnJlYWs7Y2FzZSJvZjI1YyI6d2luRGlzcG9u aWJsZXMuaXRlbXMuaXRlbXNbMF0uaHRtbD1wcmVVcmwrIiZsYXllcnM9QjBGRkZU RkZGRkZGRiIrc3VmVXJsO3dpbkRpc3BvbmlibGVzLnNldFRpdGxlKGRpc3Bvb2Yy NWMrZGlzcG9uaWJpbGl0YXQpO3dpbkRpc3BvbmlibGVzLml0ZW1zLml0ZW1zWzFd LnNldFRpdGxlKERpc3BvTGVnZW5kKyI6ICAiK1RpdExlZ09ydG8pO3dpbkRpc3Bv bmlibGVzLml0ZW1zLml0ZW1zWzFdLmh0bWw9T3J0b0xlZzticmVhaztjYXNlIm9m NW0iOndpbkRpc3BvbmlibGVzLml0ZW1zLml0ZW1zWzBdLmh0bWw9cHJlVXJsKyIm bGF5ZXJzPUIwRkZGRkZURkZGRkYiK3N1ZlVybDt3aW5EaXNwb25pYmxlcy5zZXRU aXRsZShkaXNwb29mNW0rZGlzcG9uaWJpbGl0YXQpO3dpbkRpc3BvbmlibGVzLml0 ZW1zLml0ZW1zWzFdLnNldFRpdGxlKERpc3BvTGVnZW5kKyI6ICAiK1RpdExlZ09y dG8pO3dpbkRpc3BvbmlibGVzLml0ZW1zLml0ZW1zWzFdLmh0bWw9T3J0b0xlZzti cmVhaztjYXNlIm9mMjVtIjp3aW5EaXNwb25pYmxlcy5pdGVtcy5pdGVtc1swXS5o dG1sPXByZVVybCsiJmxheWVycz1CMEZGRkZGRkZURkZGIitzdWZVcmw7d2luRGlz cG9uaWJsZXMuc2V0VGl0bGUoZGlzcG9vZjI1bStkaXNwb25pYmlsaXRhdCk7d2lu RGlzcG9uaWJsZXMuaXRlbXMuaXRlbXNbMV0uc2V0VGl0bGUoRGlzcG9MZWdlbmQr IjogICIrVGl0TGVnT3J0byk7d2luRGlzcG9uaWJsZXMuaXRlbXMuaXRlbXNbMV0u aHRtbD1PcnRvTGVnO2JyZWFrO2Nhc2Uib3J0bzEwYyI6d2luRGlzcG9uaWJsZXMu aXRlbXMuaXRlbXNbMF0uaHRtbD1wcmVVcmwrIiZsYXllcnM9QjBGRkZGRkZGRkZG VCIrc3VmVXJsO3dpbkRpc3BvbmlibGVzLnNldFRpdGxlKGRpc3Bvb2YxMGMrZGlz cG9uaWJpbGl0YXQpO3dpbkRpc3BvbmlibGVzLml0ZW1zLml0ZW1zWzFdLnNldFRp dGxlKERpc3BvTGVnZW5kKyI6ICAiK1RpdExlZ09ydG8pO3dpbkRpc3BvbmlibGVz Lml0ZW1zLml0ZW1zWzFdLmh0bWw9T3J0b0xlZzticmVha313aW5EaXNwb25pYmxl cy5zaG93KCl9LHNob3dXaW5kb3dHTVM6ZnVuY3Rpb24oKXt2YXIgdGhlZm9ybT1u ZXcgRXh0LkZvcm1QYW5lbCh7bGFiZWxBbGlnbjoidG9wIixmcmFtZTp0cnVlLHRp dGxlOmNvbnZlcnNpb0dNUyxib2R5U3R5bGU6InBhZGRpbmc6NXB4IDVweCAwIix3 aWR0aDozMDAsaXRlbXM6W3tsYXlvdXQ6ImNvbHVtbiIsaXRlbXM6W3tjb2x1bW5X aWR0aDowLjI1LGxheW91dDoiY29sdW1uIixpdGVtczpbe3h0eXBlOiJsYWJlbCIs aHRtbDoiPHN0cm9uZz4iK2xvbmdpdHVkKyI6PC9zdHJvbmc+IixuYW1lOiJsb25n aXR1ZCJ9LHt4dHlwZToibGFiZWwiLGh0bWw6Ijxici8+PGJyLz48YnIvPjxzdHJv bmc+IitsYXRpdHVkKyI6PC9zdHJvbmc+IixuYW1lOiJsYXRpdHVkIn1dfSx7Y29s dW1uV2lkdGg6MC4yNSxsYXlvdXQ6ImZvcm0iLGl0ZW1zOlt7eHR5cGU6InRleHRm aWVsZCIsZmllbGRMYWJlbDpncmF1cyxpZDoiZ2xvbiIsbmFtZToiZ2xvbiIsYW5j aG9yOiIzNSUifSx7eHR5cGU6InRleHRmaWVsZCIsZmllbGRMYWJlbDpncmF1cyxp ZDoiZ2xhdCIsbmFtZToiZ2xhdCIsYW5jaG9yOiIzNSUifV19LHtjb2x1bW5XaWR0 aDowLjI1LGxheW91dDoiZm9ybSIsaXRlbXM6W3t4dHlwZToidGV4dGZpZWxkIixm aWVsZExhYmVsOm1pbnV0cyxpZDoibWxvbiIsbmFtZToibWxvbiIsYW5jaG9yOiIz NSUifSx7eHR5cGU6InRleHRmaWVsZCIsZmllbGRMYWJlbDptaW51dHMsaWQ6Im1s YXQiLG5hbWU6Im1sYXQiLGFuY2hvcjoiMzUlIn1dfSx7Y29sdW1uV2lkdGg6MC4y NSxsYXlvdXQ6ImZvcm0iLGl0ZW1zOlt7eHR5cGU6InRleHRmaWVsZCIsZmllbGRM YWJlbDpzZWdvbnMsaWQ6InNsb24iLG5hbWU6InNsb24iLGFuY2hvcjoiMzUlIn0s e3h0eXBlOiJ0ZXh0ZmllbGQiLGZpZWxkTGFiZWw6c2Vnb25zLGlkOiJzbGF0Iixu YW1lOiJzbGF0IixhbmNob3I6IjM1JSJ9XX1dfV0sYnV0dG9uczpbe3RleHQ6IlRy YW5zZm9ybWFyIixoYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGdyYXVzbG9uPUV4dC5n ZXREb20oImdsb24iKTt2YXIgbWlubG9uPUV4dC5nZXREb20oIm1sb24iKTt2YXIg c2VnbG9uPUV4dC5nZXREb20oInNsb24iKTt2YXIgZ3JhdXNsYXQ9RXh0LmdldERv bSgiZ2xhdCIpO3ZhciBtaW5sYXQ9RXh0LmdldERvbSgibWxhdCIpO3ZhciBzZWds YXQ9RXh0LmdldERvbSgic2xhdCIpO2lmKGdyYXVzbG9uLnZhbHVlIT0iIiYmZ3Jh dXNsb24udmFsdWUhPW51bGwmJm1pbmxvbi52YWx1ZSE9IiImJm1pbmxvbi52YWx1 ZSE9bnVsbCYmc2VnbG9uLnZhbHVlIT0iIiYmc2VnbG9uLnZhbHVlIT1udWxsJiZn cmF1c2xhdC52YWx1ZSE9IiImJmdyYXVzbGF0LnZhbHVlIT1udWxsJiZtaW5sb24u dmFsdWUhPSIiJiZtaW5sb24udmFsdWUhPW51bGwmJnNlZ2xvbi52YWx1ZSE9IiIm JnNlZ2xvbi52YWx1ZSE9bnVsbCl7aWYoZ3JhdXNsb24udmFsdWU8MHx8Z3JhdXNs b24udmFsdWU+M3x8bWlubG9uLnZhbHVlPDB8fG1pbmxvbi52YWx1ZT41OXx8c2Vn bG9uLnZhbHVlPDB8fHNlZ2xvbi52YWx1ZT41OXx8Z3JhdXNsYXQudmFsdWU8NDB8 fGdyYXVzbGF0LnZhbHVlPjQyfHxtaW5sb24udmFsdWU8MHx8bWlubG9uLnZhbHVl PjU5fHxzZWdsb24udmFsdWU8MHx8c2VnbG9uLnZhbHVlPjU5KXtFeHQuTXNnLnNo b3coe3RpdGxlOiJFcnJvciIsbXNnOm1zZ0Vycm9yQ29vcmRzLG1pbldpZHRoOjIw MCxtb2RhbDp0cnVlLGljb246RXh0Lk1zZy5JTkZPLGJ1dHRvbnM6RXh0Lk1zZy5P S30pO3JldHVybiBmYWxzZX1lbHNle2lmKG1pbmxvbi52YWx1ZS5sZW5ndGg9PTEp e21pbmxvbi52YWx1ZT0iMCIrbWlubG9uLnZhbHVlfWlmKG1pbmxhdC52YWx1ZS5s ZW5ndGg9PTEpe21pbmxhdC52YWx1ZT0iMCIrbWlubGF0LnZhbHVlfWlmKHNlZ2xv bi52YWx1ZS5sZW5ndGg9PTEpe3NlZ2xvbi52YWx1ZT0iMCIrc2VnbG9uLnZhbHVl fWlmKHNlZ2xhdC52YWx1ZS5sZW5ndGg9PTEpe3NlZ2xhdC52YWx1ZT0iMCIrc2Vn bGF0LnZhbHVlfWlmKGdyYXVzbG9uLnZhbHVlLmxlbmd0aD09MSl7Z3JhdXNsb24u dmFsdWU9IjAwIitncmF1c2xvbi52YWx1ZX1pZihncmF1c2xvbi52YWx1ZS5sZW5n dGg9PTIpe2dyYXVzbG9uLnZhbHVlPSIwIitncmF1c2xvbi52YWx1ZX12YXIgZ21z bG9uPWdyYXVzbG9uLnZhbHVlKyIgIittaW5sb24udmFsdWUrIiAiK3NlZ2xvbi52 YWx1ZTt2YXIgZ2Rsb249Vmlzc2lyLlV0aWwuZG1zVG9EZWcoZ21zbG9uKTt2YXIg Z21zbGF0PSIwIitncmF1c2xhdC52YWx1ZSsiICIrbWlubGF0LnZhbHVlKyIgIitz ZWdsYXQudmFsdWU7dmFyIGdkbGF0PVZpc3Npci5VdGlsLmRtc1RvRGVnKGdtc2xh dCk7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRvcG9uaW1pbnB1dCIpLnZhbHVl PWdkbG9uLnRvRml4ZWQoNikrIiwiK2dkbGF0LnRvRml4ZWQoNSk7bWFwLmdldENv bnRyb2xzQnlDbGFzcygiVmlzc2lyLkNlcmNhZG9yVG9wb25pbXMiKVswXS5sb2Nh bGl0emEoKX19ZWxzZXthbGVydChvbXBsaXIpfX19XX0pO3ZhciBteVdpbj1uZXcg RXh0LldpbmRvdyh7aWQ6Im15V2luIixoZWlnaHQ6MjAwLHdpZHRoOjMwMCxpdGVt czpbdGhlZm9ybV19KTtteVdpbi5zaG93KCl9LHNob3dXaW5kb3dIZWxwSW1wb3J0 OmZ1bmN0aW9uKCl7dmFyIHRleHQ9e2lkOiJ0ZXh0LXRvb2x0aXAtaW1wb3J0Iixi b2R5U3R5bGU6ImJvcmRlcjowcHg7YmFja2dyb3VuZDojZmZmO21hcmdpbi1ib3R0 b206MTBweDsiLGh0bWw6dGV4dEhlbHBJbXBvcnR9O3ZhciB0YWJsZT1uZXcgRXh0 LlBhbmVsKHtsYXlvdXQ6InRhYmxlIixsYXlvdXRDb25maWc6e2NvbHVtbnM6Myxl eHRyYUNsczoic2VyaWVzX3RhYmxlIn0saXRlbXM6W3todG1sOmltcG9ydENhcCxj ZWxsQ2xzOiJoaWdobGlnaHQifSx7aHRtbDppbXBvcnREZXMsY2VsbENsczoiaGln aGxpZ2h0In0se2h0bWw6aW1wb3J0RXgsY2VsbENsczoiaGlnaGxpZ2h0In0se2h0 bWw6JzxwIGNsYXNzPSJwYWRkaW5nNSI+bGF0PC9wPid9LHtodG1sOic8cCBjbGFz cz0icGFkZGluZzUiPk5vcnRoaW5nIFVUTSBFRDUwIChZKTwvcD4nfSx7aHRtbDon PHAgY2xhc3M9InBhZGRpbmc1Ij40NjIwNDgwPC9wPid9LHtodG1sOic8cCBjbGFz cz0icGFkZGluZzUiPmxvbjwvcD4nfSx7aHRtbDonPHAgY2xhc3M9InBhZGRpbmc1 Ij5FYXN0aW5nIFVUTSBFRDUwIChYKTwvcD4nfSx7aHRtbDonPHAgY2xhc3M9InBh ZGRpbmc1Ij40MDI1MDk8L3A+J30se2h0bWw6JzxwIGNsYXNzPSJwYWRkaW5nNSI+ dGl0bGU8L3A+J30se2h0bWw6JzxwIGNsYXNzPSJwYWRkaW5nNSI+VCZpYWN1dGU7 dG9sIGRlbCBwdW50IChvcGNpb25hbCk8L3A+J30se2h0bWw6JzxwIGNsYXNzPSJw YWRkaW5nNSI+TWFucmVzYTwvcD4nfSx7aHRtbDonPHAgY2xhc3M9InBhZGRpbmc1 Ij5kZXNjcmlwdGlvbjwvcD4nfSx7aHRtbDonPHAgY2xhc3M9InBhZGRpbmc1Ij5E ZXNjcmlwY2kmb2FjdXRlOyBkZWwgcHVudCAob3BjaW9uYWwpPC9wPid9LHtodG1s Oic8cCBjbGFzcz0icGFkZGluZzUiPkNhcGl0YWwgZGVsIEJhZ2VzPC9wPid9LHto dG1sOic8cCBjbGFzcz0icGFkZGluZzUiPmljb24gPGJyLz4mbmJzcDs8L3A+J30s e2h0bWw6JzxwIGNsYXNzPSJwYWRkaW5nNSI+SWNvbmEgKG9wY2lvbmFsKTxici8+ Jm5ic3A7PC9wPid9LHtodG1sOic8cCBjbGFzcz0icGFkZGluZzUiPmh0dHA6Ly93 d3cuaWNjLmNhdC92aXNzaXIzL2xpYi9vcGVubGF5ZXJzL2ltZy9tYXJrZXItZ29s ZC5wbmcgPGJyLz4obWFya2VyLWdyZWVuLnBuZywgbWFya2VyLWJsdWUucG5nLCBt YXJrZXIucG5nKTwvcD4nfSx7aHRtbDp0ZXh0SGVscEltcG9ydDIsY29sc3Bhbjoz fV19KTt2YXIgbXlXaW49bmV3IEV4dC5XaW5kb3coe2lkOiJteVdpbiIsaGVpZ2h0 OjI2NSx3aWR0aDo1NjAsaXRlbXM6W3RleHQsdGFibGVdfSk7bXlXaW4uc2hvdygp fSxzaG93V2luZG93TGVnZW5kczpmdW5jdGlvbihzZXJpZSl7c3dpdGNoKHNlcmll KXtjYXNlImdlb2wiOnZhciB0YWJsZT1uZXcgRXh0LlBhbmVsKHtsYXlvdXQ6InRh YmxlIixsYXlvdXRDb25maWc6e2NvbHVtbnM6MixleHRyYUNsczoic2VyaWVzX3Rh YmxlIn0saXRlbXM6W3todG1sOic8cCBjbGFzcz0icGFkZGluZzUiPk1hcGEgR2Vv bCZvZ3JhdmU7Z2ljIGRlIENhdGFsdW55YSAxOjI1MC4wMDA8YnIvPjxzcGFuIGNs YXNzPSJjZW50ZXJUZXh0R2VvbExlZ2VuZCI+KERlbCBuaXZlbGwgZGUgem9vbSAw IGEgNCk8L3NwYW4+PC9wPid9LHtodG1sOic8cCBjbGFzcz0icGFkZGluZzUiPk1h cGEgR2VvbCZvZ3JhdmU7Z2ljIGRlIENhdGFsdW55YSAxOjUwLjAwMDxici8+PHNw YW4gY2xhc3M9ImNlbnRlclRleHRHZW9sTGVnZW5kIj4oTml2ZWxsIGRlIHpvb20g NSBpIDYpPC9zcGFuPjwvcD4nfSx7aHRtbDonPHAgY2xhc3M9InBhZGRpbmc1Ij48 aW1nIHNyYz0iLi9pbWcvc2VwYXJhZG9yX3BkZl9nZW9sLnBuZyIgLz48YSBocmVm PSIuL2xsZWdlbmRlcy9tZ2MyNTBtLnBkZiIgdGFyZ2V0PSJwZGZsbGVnZW5kYSI+ PGltZyBjbGFzcz0icG9zUERGSW1nIiBzcmM9Ii4vaW1nL3BkZl9pY29uLmdpZiIg Lz48L2E+PC9wPid9LHtodG1sOic8cCBjbGFzcz0icGFkZGluZzUiPjxpbWcgc3Jj PSIuL2ltZy9zZXBhcmFkb3JfcGRmX2dlb2wucG5nIiAvPjxhIGhyZWY9Ii4vbGxl Z2VuZGVzL21nYzUwbS5wZGYiIHRhcmdldD0icGRmbGxlZ2VuZGEiPjxpbWcgY2xh c3M9InBvc1BERkltZyIgc3JjPSIuL2ltZy9wZGZfaWNvbi5naWYiIC8+PC9hPjwv cD4nfV19KTt2YXIgd2luTGVnZW5kcz1uZXcgRXh0LldpbmRvdyh7YXV0b0hlaWdo dDpmYWxzZSx3aWR0aDo0MTUsaGVpZ2h0OjEwMCxyZXNpemFibGU6ZmFsc2UsY2xv c2VBY3Rpb246ImhpZGUiLHRpdGxlOmdlb2xMZWdlbmQsaXRlbXM6W3RhYmxlXX0p O2JyZWFrO2Nhc2Uic2VueWFscyI6dmFyIHRhYmxlPW5ldyBFeHQuUGFuZWwoe2xh eW91dDoidGFibGUiLGxheW91dENvbmZpZzp7Y29sdW1uczoxLGV4dHJhQ2xzOiJz ZXJpZXNfdGFibGUifSxpdGVtczpbe2h0bWw6JzxwIGNsYXNzPSJwYWRkaW5nNSI+ PGltZyBzcmM9Ii4vbGxlZ2VuZGVzL3RyaWFuZ2xlX2JsYXUuZ2lmIiBzdHlsZT0i dmVydGljYWwtYWxpZ246bWlkZGxlIiAvPiAnK3RleHRMZWdlbmRTZW55YWxzMSsi PC9wPiJ9LHtodG1sOic8cCBjbGFzcz0icGFkZGluZzUiPjxpbWcgc3JjPSIuL2xs ZWdlbmRlcy90cmlhbmdsZV92ZXJkLmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWdu Om1pZGRsZSIgLz4gJyt0ZXh0TGVnZW5kU2VueWFsczIrIjwvcD4ifSx7aHRtbDon PHAgY2xhc3M9InBhZGRpbmc1Ij48aW1nIHNyYz0iLi9sbGVnZW5kZXMvdHJpYW5n bGVfdmVybWVsbC5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiIC8+ ICcrdGV4dExlZ2VuZFNlbnlhbHMzKyI8L3A+In1dLGJvcmRlcjpmYWxzZX0pO3Zh ciB3aW5MZWdlbmRzPW5ldyBFeHQuV2luZG93KHthdXRvSGVpZ2h0OmZhbHNlLHdp ZHRoOjI2NixoZWlnaHQ6MTEwLHJlc2l6YWJsZTpmYWxzZSxjbG9zZUFjdGlvbjoi aGlkZSIsdGl0bGU6c2VueWFsc0xlZ2VuZCxpdGVtczpbdGFibGVdfSk7YnJlYWt9 d2luTGVnZW5kcy5zaG93KCl9LHNob3dFcnJvcjpmdW5jdGlvbigpe2FsZXJ0KGNv bm5lY3RFcnJvcil9LHNob3dXaW5kb3dUZXh0RmVhdHVyZTpmdW5jdGlvbihldnQp e3ZhciBjb2xvclQ9IiMwMDAwMDAiO3ZhciBtaWRhPSIzIjt2YXIgZmc9bmV3IEV4 dC51eC5Db2xvckZpZWxkKHtmaWVsZExhYmVsOiJGb3JlZ3JvdW5kIENvbG9yIix2 YWx1ZToiIzAwMDAwMCIsbXNnVGFyZ2V0OiJxdGlwIn0pO2ZnLm9uKCJzZWxlY3Qi LGZ1bmN0aW9uKGZpZWxkLGNvbG9yKXtjb2xvclQ9Y29sb3J9KTt2YXIgbWlkZXNf bGxldHJhPVtbIjEwcHgiLCIxMHB4Il0sWyIxMnB4IiwiMTJweCJdLFsiMTRweCIs IjE0cHgiXSxbIjE2cHgiLCIxNnB4Il0sWyIxOHB4IiwiMThweCJdLFsiMjBweCIs IjIwcHgiXSxbIjI0cHgiLCIyNHB4Il1dO3ZhciBtaWRhTGxldHJhTGxpc3RhPW5l dyBFeHQuZGF0YS5TaW1wbGVTdG9yZSh7ZmllbGRzOlsiaWQiLCJkZXMiXSxkYXRh Om1pZGVzX2xsZXRyYX0pO3ZhciBjb21ib01pZGE9bmV3IEV4dC5mb3JtLkNvbWJv Qm94KHt2YWx1ZToiMTBweCIsc3RvcmU6bWlkYUxsZXRyYUxsaXN0YSxkaXNwbGF5 RmllbGQ6ImRlcyIsbW9kZToibG9jYWwiLHRyaWdnZXJBY3Rpb246ImFsbCIsbmFt ZToic2VsRm9udCIsaWQ6InNlbEZvbnQifSk7dmFyIHRoZUZvcm09bmV3IEV4dC5G b3JtUGFuZWwoe2xhYmVsQWxpZ246InRvcCIsZnJhbWU6dHJ1ZSx3aWR0aDoyMDAs aXRlbXM6W3tsYXlvdXQ6ImNvbHVtbiIsaXRlbXM6W3tsYXlvdXQ6ImNvbHVtbiIs aXRlbXM6W3t4dHlwZToibGFiZWwiLGh0bWw6bGFiZWxUZXh0Q29udHJvbCxuYW1l OiJpbnNlcmVpeCJ9XX0se2xheW91dDoiZm9ybSIsaXRlbXM6W3t4dHlwZToidGV4 dGZpZWxkIixpZDoidGV4dEludHIiLG5hbWU6InRleHRJbnRyIn1dfSx7bGF5b3V0 OiJjb2x1bW4iLGl0ZW1zOlt7bGF5b3V0OiJjb2x1bW4iLGl0ZW1zOlt7eHR5cGU6 ImxhYmVsIixodG1sOmxhYmVsQ29sb3JUZXh0Q29udHJvbCxuYW1lOiJjb2xvciJ9 XX0se2xheW91dDoiY29sdW1uIixpdGVtczpbZmddfV19LHtsYXlvdXQ6ImNvbHVt biIsaXRlbXM6W3tsYXlvdXQ6ImNvbHVtbiIsaXRlbXM6W3t4dHlwZToibGFiZWwi LGh0bWw6bGFiZWxTaXplVGV4dENvbnRyb2wsbmFtZToibWlkYSJ9XX0se2xheW91 dDoiY29sdW1uIixpdGVtczpbY29tYm9NaWRhXX1dfV19XSxidXR0b25zOlt7dGV4 dDoiSW5zZXJpciBldGlxdWV0YSIsaGFuZGxlcjpmdW5jdGlvbigpe3ZhciBldGlx dWV0YT1FeHQuZ2V0RG9tKCJ0ZXh0SW50ciIpLnZhbHVlO21pZGE9RXh0LmdldERv bSgic2VsRm9udCIpLnZhbHVlO21hcC5nZXRDb250cm9sc0J5Q2xhc3MoIlZpc3Np ci5UZXh0ZSIpWzBdLmluc2VyZWl4KGV0aXF1ZXRhLGV2dC54eSxjb2xvclQsbWlk YSl9fV19KTtBcHAubGF5b3V0Lm15V2luVGV4dD1uZXcgRXh0LldpbmRvdyh7aWQ6 Im15V2luVGV4dCIsdGl0bGU6d2luVGV4dFRpdGxlLGhlaWdodDoyMzUsd2lkdGg6 MjAwLGl0ZW1zOlt0aGVGb3JtXX0pO0FwcC5sYXlvdXQubXlXaW5UZXh0LnNob3co KX0scmVhZFN1Ym1pdHRlZERhdGE6ZnVuY3Rpb24obm9tQXJ4aXUpe21hcC5nZXRD b250cm9sc0J5Q2xhc3MoIlZpc3Npci5JbXBvcnRLTUwiKVswXS5yZWFkS01MKG5v bUFyeGl1KX0sZ2V0S01MOmZ1bmN0aW9uKCl7dmFyIGhpaGFEaWJ1aXg9ZmFsc2U7 Zm9yKHZhciBseXI9MDtseXI8bWFwLmxheWVycy5sZW5ndGg7KytseXIpe3ZhciBs YXllcj1tYXAubGF5ZXJzW2x5cl07aWYobGF5ZXIubmFtZT09InZlY3RvciImJmxh eWVyLmZlYXR1cmVzLmxlbmd0aD4wKXtoaWhhRGlidWl4PXRydWV9fWlmKGhpaGFE aWJ1aXgpe21hcC5nZXRDb250cm9sc0J5Q2xhc3MoIlZpc3Npci5FeHBvcnRLTUwi KVswXS5jcmVhdGVLTUwoKTt2YXIgY29udGluZ3V0PW1hcC5nZXRDb250cm9sc0J5 Q2xhc3MoIlZpc3Npci5FeHBvcnRLTUwiKVswXS5rbWw7ZG9jdW1lbnQuZXhwb3J0 a21sZm9ybS5wb3N0Qm9keS52YWx1ZT1jb250aW5ndXQ7ZG9jdW1lbnQuZXhwb3J0 a21sZm9ybS5zdWJtaXQoKX1lbHNle2FsZXJ0KGRpYnVpeGFyUHJpbWVyKX19LGRp c2FibGVTdGF0ZVN5c1JlZjpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRC eUlkKCJpZHJhZHNpc3JlZkVUUlM4OSIpLmRpc2FibGVkPXRydWU7ZG9jdW1lbnQu Z2V0RWxlbWVudEJ5SWQoImlkcmFkc2lzcmVmRUQ1MCIpLmRpc2FibGVkPXRydWV9 LGVuYWJsZVN0YXRlU3lzUmVmOmZ1bmN0aW9uKCl7ZG9jdW1lbnQuZ2V0RWxlbWVu dEJ5SWQoImlkcmFkc2lzcmVmRVRSUzg5IikuZGlzYWJsZWQ9ZmFsc2U7ZG9jdW1l bnQuZ2V0RWxlbWVudEJ5SWQoImlkcmFkc2lzcmVmRUQ1MCIpLmRpc2FibGVkPWZh bHNlfX19KSgpOwo= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=main.js Content-Type: application/javascript; charset=utf-8; name=main.js Content-Location: http://www.icc.cat/vissir3/app/lib/App/main.js Content-Transfer-Encoding: Base64 Ci8qCiAqIEBpbmNsdWRlIEFwcC9sYXlvdXQuanMKICovCgpFeHQubmFtZXNwYWNl KCJBcHAiKTsKCihmdW5jdGlvbigpIHsKCS8qCglpZihFeHQuaXNJRTYpewoJCUV4 dC5NZXNzYWdlQm94LnNob3coewoJCQl0aXRsZTogIiIsCgkJCW1zZzogIkVsIHZv c3RyZSBuYXZlZ2Fkb3Igbm8gcGVybWV0IGNhcnJlZ2FyIGwnYXBsaWNhY2kmb2Fj dXRlOy48YnIvPkNhbCBxdWUgbCdhY3R1YWxpdHpldSBhIHVuYSB2ZXJzaSZvYWN1 dGU7IG0mZWFjdXRlO3MgbW9kZXJuYSIsCgkJCWJ1dHRvbnM6IEV4dC5NZXNzYWdl Qm94Lk9LLAoJCQlmbjogZnVuY3Rpb24oY2hvaWNlKSB7IHJlZGlyZWN0SUU2KCk7 IH0sCgkJCWljb246IEV4dC5NZXNzYWdlQm94LldBUk5JTkcKCQl9KTsKCX0KCQog ICAgdmFyIHJlZGlyZWN0SUU2ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgd2luZG93 LmxvY2F0aW9uID0gImh0dHA6Ly93d3cuaWNjLmNhdCI7CiAgICB9CgkqLwoJCgkv LyBnbG9iYWwgc2V0dGluZ3MKCQoJLy8gRGVzZW52LgoJLy9BcHAudGlsZXNlcnZl ciA9ICJodHRwOi8vd3d3LmljYy5jYXQvdGlsZWNhY2hlXzJfMTAvdGlsZWNhY2hl LnB5PyI7aHR0cDovL3NhZ2l0YXJpLmljYy5jYXQvdGlsZWNhY2hlL3RpbGVjYWNo ZS5weT8KCUFwcC50aWxlc2VydmVyID0gImh0dHA6Ly9zYWdpdGFyaS5pY2MuY2F0 L3RpbGVjYWNoZS90aWxlY2FjaGUucHk/IjsKCUFwcC5BcmNHaXNTZXJ2ZXIgPSAi aHR0cDovL2dhbGlsZW8uaWNjLmNhdCI7CgkvL0FwcC5BcmNHaXNTZXJ2ZXIgPSAi aHR0cDovL2dhbGlsZW8uaWNjLmNhdCI7CgkvL0FwcC53bXMyID0gImh0dHA6Ly9n YWxpbGVvLmljYy5jYXQvYXJjZ2lzL3NlcnZpY2VzL2ljY190YWxsczJfdl9yL01h cFNlcnZlci9XTVNTZXJ2ZXIiOwoJQXBwLndtczIgPSAiaHR0cDovL2dhbGlsZW8u aWNjLmNhdC9hcmNnaXMvc2VydmljZXMvaWNjX3RhbGxzX3Zfci9NYXBTZXJ2ZXIv V01TU2VydmVyIjsKCUFwcC5TTERTZXJ2ZXIgPSAiaHR0cDovL3d3dy5pY2MuY2F0 L1ZJU1NJUl9TTEQvc2xkX2Z1bGwuanNwIjsKCUFwcC5BcHBTZXJ2ZXIgPSAiaHR0 cDovL3d3dy5pY2MuY2F0IjsKCUFwcC50YWxsc1NldmVyID0gImh0dHA6Ly9nYWxp bGVvLmljYy5jYXQvYXJjZ2lzL3NlcnZpY2VzL2ljY190YWxsc192X3IvTWFwU2Vy dmVyL1dNU1NlcnZlciI7CgkvL0FwcC50YWxsc1NldmVyID0gImh0dHA6Ly9nYWxp bGVvLmljYy5jYXQvYXJjZ2lzL3NlcnZpY2VzL2ljY190YWxsc192X3IvTWFwU2Vy dmVyL1dNU1NlcnZlciI7CglBcHAud2ViU2VydmVyID0gJ2h0dHA6Ly8nK3dpbmRv dy5sb2NhdGlvbi5ob3N0OwoJQXBwLlZpc3NpclZlcnNpb24gPSAnL3Zpc3NpcjMv JwoJQXBwLmRvd25sb2FkU2VydmVyID0gImh0dHA6Ly9hdXJpZ2EuaWNjLmNhdCI7 CglBcHAuSGlzdG9yaWNzU2VydmVyID0gImh0dHA6Ly93d3cuaWNjLmNhdC9oaXN0 b3JpY3NzZWFyY2gvZ2V0SGlzdG9yaWNzIjsKCgkvLyBQcm9kdWNjaW8KCS8vQXBw LkFyY0dpc1NlcnZlciA9ICJodHRwOi8vZ2FsaWxlby5pY2MuY2F0IjsKCS8vQXBw LndtczIgPSAiaHR0cDovL2dhbGlsZW8uaWNjLmNhdC9hcmNnaXMvc2VydmljZXMv aWNjX3RhbGxzX3Zfci9NYXBTZXJ2ZXIvV01TU2VydmVyIjsKCS8vQXBwLlNMRFNl cnZlciA9ICJodHRwOi8vd3d3LmljYy5jYXQvVklTU0lSX1NMRC9zbGRfZnVsbC5q c3AiOwoJCglBcHAubGF5b3V0LmdldElkaW9tYSgpOwogICAgCglPcGVuTGF5ZXJz LkltZ1BhdGggPSAibGliL29wZW5sYXllcnMvaW1nLyI7CiAgICBFeHQuUXVpY2tU aXBzLmluaXQoKTsKCQogICAgLy8gcnVuIEFwcC5sYXlvdXQuaW5pdCgpIHdoZW4g dGhlIHBhZ2UKICAgIC8vIGlzIHJlYWR5CgkKCS8vIFBlcm1hbGluawoJdmFyIHBl cm1hbGlua1Byb3ZpZGVyOwogICAgRXh0Lm9uUmVhZHkoZnVuY3Rpb24oKSB7CgkJ CgkJLy8gRGV0ZWNjae+/vSBlbWJlZGRlZAoJICAgIGlmKE9wZW5MYXllcnMuVXRp bC5nZXRQYXJhbWV0ZXJzKCkuZW1iZWRkZWQpIHsKCSAgICAgCgkJCXZhciBwZW1i ZCA9IE9wZW5MYXllcnMuVXRpbC5nZXRQYXJhbWV0ZXJzKCk7CgkgICAgCXZhciBw YXJhbWV0ZXJzU3RyaW5nID0gIj96b29tPSIrcGVtYmQuem9vbSsiJmxvbj0iK3Bl bWJkLmxvbisiJmxhdD0iK3BlbWJkLmxhdCsiJmxheWVycz0iK3BlbWJkLmxheWVy czsKCSAgICAgICAgLy8gUmVkaXJlY2Np77+9IGEgZW1iZWRkZWQuaHRtbAoJICAg ICAgICB3aW5kb3cubG9jYXRpb24gPSAiZW1iZWRkZWQuaHRtbCIrcGFyYW1ldGVy c1N0cmluZzsKCSAgICB9CgkJCgkJQXBwLmxheW91dC5pbml0KCk7CgkJCQoJCQkv L2FsZXJ0KCJBcXVlc3RhIHZlcnNpw7MgZW5jYXJhIGVzdMOgIGVuIHByb3ZlcyBp IG5vIMOpcyBlc3RhYmxlIik7CgkJCXZhciBsb2FkaW5nTWFzayA9IEV4dC5nZXQo J2xvYWRpbmctbWFzaycpOwoJCQl2YXIgbG9hZGluZyA9IEV4dC5nZXQoJ2xvYWRp bmcnKTsKCgkJCS8vCUhpZGUgbG9hZGluZyBtZXNzYWdlCQkJCgkJCWxvYWRpbmcu ZmFkZU91dCh7IGR1cmF0aW9uOiAxLjAsIHJlbW92ZTogdHJ1ZSB9KTsKCQkJCgkJ CS8vCUhpZGUgbG9hZGluZyBtYXNrCgkJCWxvYWRpbmdNYXNrLnNldE9wYWNpdHko MC45KTsKCQkJbG9hZGluZ01hc2suc2hpZnQoewoJCQkJeHk6IGxvYWRpbmcuZ2V0 WFkoKSwKCQkJCXdpZHRoOiBsb2FkaW5nLmdldFdpZHRoKCksCgkJCQloZWlnaHQ6 IGxvYWRpbmcuZ2V0SGVpZ2h0KCksCgkJCQlyZW1vdmU6IHRydWUsCgkJCQlkdXJh dGlvbjogMSwKCQkJCW9wYWNpdHk6IDAuMSwKCQkJCWVhc2luZzogJ2JvdW5jZU91 dCcsCgkJCQljYWxsYmFjazogZnVuY3Rpb24oY2hvaWNlKSB7IGNoZWNrQ29vcmRz KCk7IH0KCQkJfSk7CgkJCQoJCQkvLyBCdWc6IENhbCBmZXIgZXhwYW5kIHBlciBk ZWZlY3RlIGQnYXF1ZXN0IGNvbnRyb2wgaSBjb2xsYXBzZSBxdWFuIGphIGhhIGNh cnJlZ2F0IHRvdCBlbCBjb2RpLCBzaW5vIHRlIHVuIGNvbXBvcnRhbWVudCBlc3Ry YW55CgkJCUV4dC5nZXRDbXAoJ3BubENvbXBhcmVUb3BvT3J0bycpLmNvbGxhcHNl KGZhbHNlKTsKCQkJCgkJCS8vIFF1YW4gYWNhYmEgZGUgY2FycmVnYXIgbWlyYSBz aSBoaSBoYSBwYXJhbXMuIGRlIGNvb3Jkcy4KCQkJLy8gaWYgeWVzLCBjZW50cmEg ZW4gZWwgcHVudCBpbmRpY2F0CgkJCXZhciBjaGVja0Nvb3JkcyA9IGZ1bmN0aW9u KCkgewoJCQkJdmFyIGFyZ3MgPSBPcGVuTGF5ZXJzLlV0aWwuZ2V0UGFyYW1ldGVy cygpOwoJCQkJCgkJCQl2YXIgbWFwID0gQXBwLmxheW91dC5nZXRNYXAoKTsKCQkJ CWlmKGFyZ3MuZXRyczg5eCkgewoJCQkJCXZhciBjdHJsQ1QgPSBtYXAuZ2V0Q29u dHJvbHNCeUNsYXNzKCJWaXNzaXIuQ2VyY2Fkb3JUb3BvbmltcyIpWzBdOwoJCQkJ CWN0cmxDVC5zZWxlY3Rvci5zZWxlY3RlZEluZGV4ID0gNDsKCQkJCQlzaG93VGV4 dFNlbGVjdCgiZGl2VGV4dFdHUzg0Iik7CgkJCQkJY3RybENULmlucHV0LnZhbHVl ID0gIiI7CgkJCQkJY3RybENULmlucHV0LnZhbHVlID0gYXJncy5ldHJzODl4Kycs JythcmdzLmV0cnM4OXk7CgkJCQkJdmFyIGxvbGEgPSBjdHJsQ1QuY2hlY2tHZW8o YXJncy5ldHJzODl4KycsJythcmdzLmV0cnM4OXkpOwoJCQkJCWN0cmxDVC5jZW50 cmFyTWFwYShsb2xhKTsKCQkJCX0KCQkJCQoJCQkJLy8gQ2FudmkgQWZlZ2l0IHBl ciBtb3N0cmFyIG1pc3NhdGdlIGFsIGNhcnJlZ2FyIGFwbGljYWNpbwoJCQkJdmFy IGluZm9Jbml0VGV4dCA9ICJMZXMgbWlkZXMgZGUgbGEgZmluZXN0cmEgZGVsIHZv c3RyZSBuYXZlZ2Fkb3Igbm8gcGVybWV0IGNhcnJlZ2FyIGFsZ3VuZXMgY2FwZXMu IFJlZHUmaXVtbDt1LWxhIHBlciBldml0YXIgY2FwIHJlc3RyaWNjaSZvYWN1dGU7 LiI7CgkJCQlpZihhcmdzLmxhbmcgPT0gImNhdCIpIGluZm9Jbml0VGV4dCA9ICJM ZXMgbWlkZXMgZGUgbGEgZmluZXN0cmEgZGVsIHZvc3RyZSBuYXZlZ2Fkb3Igbm8g cGVybWV0IGNhcnJlZ2FyIGFsZ3VuZXMgY2FwZXMuIFJlZHUmaXVtbDt1LWxhIHBl ciBldml0YXIgY2FwIHJlc3RyaWNjaSZvYWN1dGU7LiI7CgkJCQllbHNlIGlmKGFy Z3MubGFuZyA9PSAiZXNsIikgaW5mb0luaXRUZXh0ID0gIkxhcyBtZWRpZGFzIGRl IGxhIHZlbnRhbmEgZGVsIG5hdmVnYWRvciBubyBwZXJtaXRlbiBjYXJnYXIgYWxn dW5hcyBjYXBhcy4gUmVkJnVhY3V0ZTt6Y2FsYSBwYXJhIGV2aXRhciBsYSByZXN0 cmljaSZvYWN1dGU7bi4iOwoJCQkJZWxzZSBpZihhcmdzLmxhbmcgPT0gImVuZyIp IGluZm9Jbml0VGV4dCA9ICJZb3VyIGJyb3dzZXIgd2luZG93cyBzaXplIGRvZXMg bm90IGFsbG93IHRvIGxvYWQgc29tZSBsYXllcnMuIFJlZHVjZSBpdCB0byBhdm9p ZCB0aGlzIHJlc3RyaWN0aW9uLiI7CgkJCQkKCQkJCWlmIChzZWxmLmlubmVySGVp Z2h0KSAvLyBhbGwgZXhjZXB0IEV4cGxvcmVyCgkJCQl7CgkJCQkJd0ZpbmVzdHJh ID0gc2VsZi5pbm5lcldpZHRoOwoJCQkJCWhGaW5lc3RyYSA9IHNlbGYuaW5uZXJI ZWlnaHQ7CgkJCQl9ZWxzZSBpZiAoZG9jdW1lbnQuYm9keSkgLy8gb3RoZXIgRXhw bG9yZXJzCgkJCQl7CgkJCQkJd0ZpbmVzdHJhID0gZG9jdW1lbnQuYm9keS5jbGll bnRXaWR0aDsKCQkJCQloRmluZXN0cmEgPSBkb2N1bWVudC5ib2R5LmNsaWVudEhl aWdodDsKCQkJCX0gCgkJCQkKCQkJCS8vIExlcyBmaW5lc3JlcyBkZSBuYXZlZ2Fk b3IgbWFqb3JzIGRlIDIyMDAgc3VwZXJlbiBlbCBsaW1pdCBkZWwgc2Vydmlkb3Ig dmVjdG9yaWFsCgkJCQlpZih3RmluZXN0cmEgPiAyMjAwKXsKCQkJCQlFeHQuTWVz c2FnZUJveC5zaG93KHsKCQkJCQkJdGl0bGU6ICIiLAoJCQkJCQltaW5XaWR0aDog NzAwLAoJCQkJCQltYXhXaWR0aDogODAwLAoJCQkJCQltc2c6IGluZm9Jbml0VGV4 dCwKCQkJCQkJYnV0dG9uczogRXh0Lk1lc3NhZ2VCb3guT0ssCgkJCQkJCWljb246 IEV4dC5NZXNzYWdlQm94LldBUk5JTkcKCQkJCQl9KTsKCQkJCX0KCQkJCS8vRmkg Y2FudmkKCQkJCS8vKioqIENoYXB1emEgcGVyIHNvbHVjaW9uYXIgUGVybWFsaW5r IG5vIHZhLCBzb2xhbWVudCBmdW5jaW9uYSBjZW50ZXIgYSB4IGkgeQoJCQkJLy8g YWxtZW55cyBmdW5jaW9uYSBlbCB6b29vbSBpIHNpIGVzIHZvbCBvcnRvZm90byBj b20gYSBjYXBhIGJhc2UKCQkJCWlmKGFyZ3MubXBfem9vbSkgewoJCQkJCXZhciB6 b29tUGFyVXJsID0gYXJncy5tcF96b29tOwoJCQkJCW1hcC56b29tVG8oem9vbVBh clVybC5zdWJzdHJpbmcoMikpOwoJCQkJfQoJCQkJaWYoYXJncy5tcF92aXNpYmls aXR5X09ydG9mb3RvKSB7CgkJCQkJdmFyIHpvb21QYXJVcmxPcnRvVmlzID0gYXJn cy5tcF92aXNpYmlsaXR5X09ydG9mb3RvOwoJCQkJCWlmKHpvb21QYXJVcmxPcnRv VmlzLnN1YnN0cmluZygyKT09MSl7CgkJCQkJCUV4dC5nZXRDbXAoJ3dlc3QtcGFu ZWwnKS5pdGVtcy5rZXkoJ2xheWVycy10YWJzJykuZXhwYW5kKCk7CgkJCQkJCUV4 dC5nZXRDbXAoJ3RhYkxheWVycycpLnNldEFjdGl2ZVRhYigxKTsKCQkJCQkJLy9F eHQuZ2V0Q21wKCdoaXN0X3NsaWRlcl9jb21wMicpLnNldFZhbHVlKDUwKTsKCQkJ CQkJdmFyIGx5cmJhc2UgPSBtYXAuZ2V0TGF5ZXJzQnlOYW1lKGx5ck9ydG8pWzBd OwoJCQkJCQltYXAuc2V0QmFzZUxheWVyKGx5cmJhc2UpOwoJCQkJCQlseXJiYXNl LnNldFZpc2liaWxpdHkodHJ1ZSk7CgkJCQkJfQoJCQkJfQoJCQkJLy8qKioKCQkJ CQoJCQl9CgogICAgfSk7CgkKfSkoKTsK ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=vissir.js Content-Type: application/javascript; charset=utf-8; name=vissir.js Content-Location: http://www.icc.cat/vissir3/lib/vissir/vissir.js Content-Transfer-Encoding: Base64 LyoNCkNhcnJlZ28gdG90cyBlbHMgZml0eGVycyAuanMgZGVmaW5pdHMgbcOpcyBh dmFsbCAoYXJyYXkganNmaWxlcykNCiovDQoNCihmdW5jdGlvbigpIHsNCiAgICB3 aW5kb3cuVmlzc2lyID0gew0KICAgICAgICBfc2NyaXB0TmFtZTogInZpc3Npci5q cyIsDQogICAgICAgIF9nZXRTY3JpcHRMb2NhdGlvbjogZnVuY3Rpb24gKCkgew0K ICAgICAgICAgICAgdmFyIHNjcmlwdExvY2F0aW9uID0gIiI7DQogICAgICAgICAg ICB2YXIgc2NyaXB0TmFtZSA9IFZpc3Npci5fc2NyaXB0TmFtZTsNCiAgICAgICAg IA0KICAgICAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50 c0J5VGFnTmFtZSgnc2NyaXB0Jyk7DQogICAgICAgICAgICBmb3IgKHZhciBpID0g MDsgaSA8IHNjcmlwdHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2 YXIgc3JjID0gc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUoJ3NyYycpOw0KICAgICAg ICAgICAgICAgIGlmIChzcmMpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGlu ZGV4ID0gc3JjLmxhc3RJbmRleE9mKHNjcmlwdE5hbWUpOyANCiAgICAgICAgICAg ICAgICAgICAgLy8gaXMgaXQgZm91bmQsIGF0IHRoZSBlbmQgb2YgdGhlIFVSTD8N CiAgICAgICAgICAgICAgICAgICAgaWYgKChpbmRleCA+IC0xKSAmJiAoaW5kZXgg KyBzY3JpcHROYW1lLmxlbmd0aCA9PSBzcmMubGVuZ3RoKSkgeyAgDQogICAgICAg ICAgICAgICAgICAgICAgICBzY3JpcHRMb2NhdGlvbiA9IHNyYy5zbGljZSgwLCAt c2NyaXB0TmFtZS5sZW5ndGgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJl YWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQog ICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gc2NyaXB0TG9jYXRpb247 DQogICAgICAgICB9DQogICAgfTsNCg0KCXZhciBqc2ZpbGVzID0gbmV3IEFycmF5 KA0KCQkvLyJHZW9BZG1pblBlcm1hbGluay5qcyIsDQoJCSJLTUwuY2xhc3MuanMi LA0KCQkiRXhwb3J0S01MLmNsYXNzLmpzIiwNCgkJIkltcG9ydEtNTC5jbGFzcy5q cyIsDQoJCSJWaXNzaXIuVXRpbC5qcyIsDQoJCSJDZXJjYWRvclRvcG9uaW1zLmNs YXNzLmpzIiwNCgkJIlNjZW5lSW5mby5jbGFzcy5qcyIsDQoJCSJDZXJjYWRvclZl cnRleHMuY2xhc3MuanMiLA0KCQkiQ2VyY2Fkb3JGdWxscy5jbGFzcy5qcyIsDQoJ CSJEZXNjYXJyZWd1ZXMuY2xhc3MuanMiLA0KCQkiZnVuY3Rpb25zLmpzIiwNCgkJ Ly8iUGVybWFsaW5rV2luZG93LkNsYXNzLmpzIiwNCgkJIkVzYm9ycmEuY2xhc3Mu anMiLA0KCQkiU25hcHNob3QuY2xhc3MuanMiLA0KCQkiVGV4dC5jbGFzcy5qcyIs DQoJCSJUZXh0ZS5jbGFzcy5qcyIsDQoJCS8vIkNhbGN1bGFkb3Jlc0lDQy5jbGFz cy5qcyIsDQoJCSJDRE0uY2xhc3MuanMiLA0KCQkiRHJhd1BvaW50LmNsYXNzLmpz IiwNCgkJIkNsaWNrLmNsYXNzLmpzIiwNCgkJIkNsaWNrVmVydGV4LmNsYXNzLmpz IiwNCgkJIkNsaWNrUHJvamVjdGVzLmNsYXNzLmpzIiwNCgkJIkNsaWNrTWFwLmNs YXNzLmpzIiwNCgkJIkNsaWNrQ2ltcy5jbGFzcy5qcyIsDQoJCSJDbGlja01hcENv b3Jkcy5jbGFzcy5qcyIsDQoJCSJMb2FkaW5nUGFuZWwuanMiLA0KCQkiTW91c2VQ b3NpdGlvbi5jbGFzcy5qcyINCgkJLy8iTW91c2VQb3NpdGlvbi5jbGFzcy5qcyIN CgkpOyAvLyBldGMuDQoJDQoJLy8gU2Vnb25zIGlkaW9tYSBhY3RpdSBjYXJyZWdh IHVucyB0ZXh0b3MNCgkNCglzd2l0Y2goQXBwLmxheW91dC5pZGlvbWEpew0KCQlj YXNlICJjYXQiOg0KCQlqc2ZpbGVzLnB1c2goInRyYW5zY2F0LmpzIik7DQoJCWJy ZWFrOw0KCQljYXNlICJlc2wiOg0KCQlqc2ZpbGVzLnB1c2goInRyYW5zZXNsLmpz Iik7DQoJCWJyZWFrOw0KCQljYXNlICJlbmciOg0KCQlqc2ZpbGVzLnB1c2goInRy YW5zZW5nLmpzIik7DQoJCWJyZWFrOw0KCQljYXNlICJjYV9FUyI6DQoJCWpzZmls ZXMucHVzaCgidHJhbnNjYXQuanMiKTsNCgkJYnJlYWs7DQoJCWNhc2UgImVzX0VT IjoNCgkJanNmaWxlcy5wdXNoKCJ0cmFuc2VzbC5qcyIpOw0KCQlicmVhazsNCgkJ Y2FzZSAiZW5fVUsiOg0KCQlqc2ZpbGVzLnB1c2goInRyYW5zZW5nLmpzIik7DQoJ CWJyZWFrOw0KCX0NCgkNCgl2YXIgYWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50 Ow0KCXZhciBkb2NXcml0ZSA9IChhZ2VudC5tYXRjaCgiTVNJRSIpIHx8IGFnZW50 Lm1hdGNoKCJTYWZhcmkiKSB8fCBhZ2VudC5tYXRjaCAoIk1vemlsbGEiKSk7DQoJ aWYoZG9jV3JpdGUpIHsNCgkJdmFyIGFsbFNjcmlwdFRhZ3MgPSBuZXcgQXJyYXko anNmaWxlcy5sZW5ndGgpOw0KCX0NCgl2YXIgaG9zdCA9IFZpc3Npci5fZ2V0U2Ny aXB0TG9jYXRpb24oKTsNCglmb3IgKHZhciBpID0gMDsgaSA8IGpzZmlsZXMubGVu Z3RoOyBpKyspIHsNCgkJaWYgKGRvY1dyaXRlKSB7DQoJCQlhbGxTY3JpcHRUYWdz W2ldID0gIjxzY3JpcHQgc3JjPSciICsgaG9zdCArIGpzZmlsZXNbaV0gKw0KCQkJ CQkJCSAgICInPjwvc2NyaXB0PiI7IA0KCQl9IGVsc2Ugew0KCQkJdmFyIHMgPSBk b2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsNCgkJCXMuc3JjID0gaG9z dCArIGpzZmlsZXNbaV07DQoJCQl2YXIgaCA9IGRvY3VtZW50LmdldEVsZW1lbnRz QnlUYWdOYW1lKCJoZWFkIikubGVuZ3RoID8gDQoJCQkJCSAgIGRvY3VtZW50Lmdl dEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0gOiANCgkJCQkJICAgZG9jdW1l bnQuYm9keTsNCgkJCWguYXBwZW5kQ2hpbGQocyk7DQoJCX0NCgl9DQoJaWYgKGRv Y1dyaXRlKSB7DQoJCWRvY3VtZW50LndyaXRlKGFsbFNjcmlwdFRhZ3Muam9pbigi IikpOw0KCX0NCn0pKCk7DQo= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=controls.js Content-Type: application/javascript; charset=utf-8; name=controls.js Content-Location: http://www.icc.cat/vissir3/app/lib/App/controls.js Content-Transfer-Encoding: Base64 dmFyIGRmZ19zbGlkZXJfaGlzdF9jb21wPW5ldyBFeHQuU2xpZGVyKHtpZDoic2xp ZGVyY29tcGFyZXRvcG9vcnRvIix3aWR0aDoxODgsaW5jcmVtZW50OjEwLG1pblZh bHVlOjAsbWF4VmFsdWU6NTAsdmFsdWU6NTAsbGlzdGVuZXJzOntjaGFuZ2Vjb21w bGV0ZTpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLmdldFZhbHVlKCkpe2Nhc2UgNTA6 QXBwLmxheW91dC5seXJUcmFucz1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5 X3RyYW5zX29ydG8iKVswXTttYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3Ry YW5zX29ydG9fc2lncmlkIilbMF0uc2V0VmlzaWJpbGl0eShmYWxzZSk7bWFwLmdl dExheWVyc0J5TmFtZSgib3ZlcmxheV90cmFuc19vcnRvX2hpc3QiKVswXS5zZXRW aXNpYmlsaXR5KGZhbHNlKTtBcHAubGF5b3V0LmZvcmNlQ2hhbmdlU2xpZGVyT3Bh Y2l0eSgic2xpZGVyX2NvbXBhcmFjaW8iKTt2YXIgYT0iMCI7YnJlYWs7Y2FzZSA0 MDpBcHAubGF5b3V0LmZvcmNlQ2hhbmdlU2xpZGVyT3BhY2l0eSgic2xpZGVyX2Nv bXBhcmFjaW8iKTt2YXIgYT0iMjAxMSI7X2dhcS5wdXNoKFsiX3RyYWNrRXZlbnQi LCJ2aXNzaXIiLCJTaWdyaWQyMDExIl0pO2JyZWFrO2Nhc2UgMzA6QXBwLmxheW91 dC5mb3JjZUNoYW5nZVNsaWRlck9wYWNpdHkoInNsaWRlcl9jb21wYXJhY2lvIik7 dmFyIGE9IjIwMTAiO19nYXEucHVzaChbIl90cmFja0V2ZW50Iiwidmlzc2lyIiwi U2hhZ3JhdDIwMTAiXSk7YnJlYWs7Y2FzZSAyMDpBcHAubGF5b3V0LmZvcmNlQ2hh bmdlU2xpZGVyT3BhY2l0eSgic2xpZGVyX2NvbXBhcmFjaW8iKTt2YXIgYT0iMjAw OSI7X2dhcS5wdXNoKFsiX3RyYWNrRXZlbnQiLCJ2aXNzaXIiLCJTaGFncmF0MjAw OSJdKTticmVhaztjYXNlIDEwOkFwcC5sYXlvdXQuZm9yY2VDaGFuZ2VTbGlkZXJP cGFjaXR5KCJzbGlkZXJfY29tcGFyYWNpbyIpO3ZhciBhPSIyMDA4IjtfZ2FxLnB1 c2goWyJfdHJhY2tFdmVudCIsInZpc3NpciIsIlNoYWdyYXQyMDA4Il0pO2JyZWFr O2Nhc2UgMDpBcHAubGF5b3V0LmZvcmNlQ2hhbmdlU2xpZGVyT3BhY2l0eSgic2xp ZGVyX2NvbXBhcmFjaW8iKTt2YXIgYT0iMTk1NiI7X2dhcS5wdXNoKFsiX3RyYWNr RXZlbnQiLCJ2aXNzaXIiLCJTaGFncmF0MTk1NiJdKTticmVha31pZihhIT0iMCIm JmEhPSIiKXt2YXIgYj1tYXAuZ2V0Wm9vbSgpO09wZW5MYXllcnMuUmVxdWVzdC5H RVQoe3VybDpBcHAuSGlzdG9yaWNzU2VydmVyLHBhcmFtczp7YW55OmEsbml2ZWxs OmJ9LGNhbGxiYWNrOkFwcC5sYXlvdXQuaGFuZGxlck9ydG9IaXN0Q29tcH0pfX19 fSk7dmFyIHllYXJzU2NhbGVDb21wPXtpZDoieWVhcnNTY2FsZS1pbWctY29tcCIs Ym9keVN0eWxlOiJib3JkZXI6MHB4OyIsaHRtbDonPGltZyBzcmM9ImFwcC9pbWcv dGlja3MucG5nIiAvPid9O3ZhciBwYW5lbFJhZGlvR3JvdXBTZWxlY3RDb21wTGF5 ZXI9bmV3IEV4dC5QYW5lbCh7Ym9yZGVyOmZhbHNlLGl0ZW1zOlt5ZWFyc1NjYWxl Q29tcCxkZmdfc2xpZGVyX2hpc3RfY29tcF19KTt2YXIgZGZnX3NsaWRlcl9oaXN0 X2NvbXBfb3J0bz1uZXcgRXh0LlNsaWRlcih7aWQ6InNsaWRlcmNvbXBhcmVvcnRv b3J0byIsd2lkdGg6MTg4LGluY3JlbWVudDoxMCxtaW5WYWx1ZTowLG1heFZhbHVl OjUwLHZhbHVlOjAsbGlzdGVuZXJzOntjaGFuZ2Vjb21wbGV0ZTpmdW5jdGlvbigp e3N3aXRjaCh0aGlzLmdldFZhbHVlKCkpe2Nhc2UgNTA6QXBwLmxheW91dC5seXJU cmFucz1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5zX29ydG8iKVsw XTttYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5zX29ydG9fc2lncmlk IilbMF0uc2V0VmlzaWJpbGl0eShmYWxzZSk7bWFwLmdldExheWVyc0J5TmFtZSgi b3ZlcmxheV90cmFuc19vcnRvX2hpc3QiKVswXS5zZXRWaXNpYmlsaXR5KGZhbHNl KTtBcHAubGF5b3V0LmZvcmNlQ2hhbmdlU2xpZGVyT3BhY2l0eSgic2xpZGVyX2Nv bXBhcmFjaW9fb3J0byIpO3ZhciBhPSIwIjticmVhaztjYXNlIDQwOkFwcC5sYXlv dXQuZm9yY2VDaGFuZ2VTbGlkZXJPcGFjaXR5KCJzbGlkZXJfY29tcGFyYWNpb19v cnRvIik7dmFyIGE9IjIwMTEiO19nYXEucHVzaChbIl90cmFja0V2ZW50Iiwidmlz c2lyIiwiU2lncmlkMjAxMSJdKTticmVhaztjYXNlIDMwOkFwcC5sYXlvdXQuZm9y Y2VDaGFuZ2VTbGlkZXJPcGFjaXR5KCJzbGlkZXJfY29tcGFyYWNpb19vcnRvIik7 dmFyIGE9IjIwMTAiO19nYXEucHVzaChbIl90cmFja0V2ZW50Iiwidmlzc2lyIiwi U2hhZ3JhdDIwMTAiXSk7YnJlYWs7Y2FzZSAyMDpBcHAubGF5b3V0LmZvcmNlQ2hh bmdlU2xpZGVyT3BhY2l0eSgic2xpZGVyX2NvbXBhcmFjaW9fb3J0byIpO3ZhciBh PSIyMDA5IjtfZ2FxLnB1c2goWyJfdHJhY2tFdmVudCIsInZpc3NpciIsIlNoYWdy YXQyMDA5Il0pO2JyZWFrO2Nhc2UgMTA6QXBwLmxheW91dC5mb3JjZUNoYW5nZVNs aWRlck9wYWNpdHkoInNsaWRlcl9jb21wYXJhY2lvX29ydG8iKTt2YXIgYT0iMjAw OCI7X2dhcS5wdXNoKFsiX3RyYWNrRXZlbnQiLCJ2aXNzaXIiLCJTaGFncmF0MjAw OCJdKTticmVhaztjYXNlIDA6QXBwLmxheW91dC5mb3JjZUNoYW5nZVNsaWRlck9w YWNpdHkoInNsaWRlcl9jb21wYXJhY2lvX29ydG8iKTt2YXIgYT0iMTk1NiI7X2dh cS5wdXNoKFsiX3RyYWNrRXZlbnQiLCJ2aXNzaXIiLCJTaGFncmF0MTk1NiJdKTti cmVha31pZihhIT0iMCImJmEhPSIiKXt2YXIgYj1tYXAuZ2V0Wm9vbSgpO09wZW5M YXllcnMuUmVxdWVzdC5HRVQoe3VybDpBcHAuSGlzdG9yaWNzU2VydmVyLHBhcmFt czp7YW55OmEsbml2ZWxsOmJ9LGNhbGxiYWNrOkFwcC5sYXlvdXQuaGFuZGxlck9y dG9IaXN0Q29tcE9ydG99KX19fX0pO3ZhciB5ZWFyc1NjYWxlQ29tcE9ydG89e2lk OiJ5ZWFyc1NjYWxlLWltZy1jb21wLW9ydG9vcnRvIixib2R5U3R5bGU6ImJvcmRl cjowcHg7IixodG1sOic8aW1nIHNyYz0iYXBwL2ltZy90aWNrcy5wbmciIC8+J307 dmFyIHBhbmVsUmFkaW9Hcm91cFNlbGVjdENvbXBMYXllck9ydG89bmV3IEV4dC5Q YW5lbCh7Ym9yZGVyOmZhbHNlLGl0ZW1zOlt5ZWFyc1NjYWxlQ29tcE9ydG8sZGZn X3NsaWRlcl9oaXN0X2NvbXBfb3J0b119KTt2YXIgcmFkaW9Hcm91cD1uZXcgRXh0 LmZvcm0uUmFkaW9Hcm91cCh7aWQ6InJhZGlvR3JvdXBDb21wYXJhZG9yIixjb2x1 bW5zOjEsY3RDbHM6InJhZGlvR3JvdXBDb21wIixpdGVtczpbe2JveExhYmVsOm9w YWNpdGF0LGN0Q2xzOiJjaGVja0JveEhpc3QiLG5hbWU6Im1ldG9kZUNvbXAiLGlu cHV0VmFsdWU6MSxjaGVja2VkOnRydWUsaGFuZGxlcjpmdW5jdGlvbigpe0FwcC5s YXlvdXQucmVzZXRDbGlwKDApO0FwcC5sYXlvdXQuZm9yY2VDaGFuZ2VTbGlkZXJP cGFjaXR5KCJzbGlkZXJfY29tcGFyYWNpbyIpfX0se2JveExhYmVsOmVzY29tYnJh dFYsY3RDbHM6ImNoZWNrQm94SGlzdCIsbmFtZToibWV0b2RlQ29tcCIsaW5wdXRW YWx1ZToyLGhhbmRsZXI6ZnVuY3Rpb24oKXtBcHAubGF5b3V0LmZvcmNlQ2hhbmdl U2xpZGVyT3BhY2l0eSgic2xpZGVyX2NvbXBhcmFjaW8iKX19LHtib3hMYWJlbDpl c2NvbWJyYXRILGN0Q2xzOiJjaGVja0JveEhpc3QiLG5hbWU6Im1ldG9kZUNvbXAi LGlucHV0VmFsdWU6MyxoYW5kbGVyOmZ1bmN0aW9uKCl7QXBwLmxheW91dC5mb3Jj ZUNoYW5nZVNsaWRlck9wYWNpdHkoInNsaWRlcl9jb21wYXJhY2lvIil9fV19KTt2 YXIgcmFkaW9Hcm91cE9ydG89bmV3IEV4dC5mb3JtLlJhZGlvR3JvdXAoe2lkOiJy YWRpb0dyb3VwQ29tcGFyYWRvck9ydG8iLGNvbHVtbnM6MSxjdENsczoicmFkaW9H cm91cENvbXAiLGl0ZW1zOlt7Ym94TGFiZWw6b3BhY2l0YXQsY3RDbHM6ImNoZWNr Qm94SGlzdCIsbmFtZToibWV0b2RlQ29tcE9ydG8iLGlucHV0VmFsdWU6MSxjaGVj a2VkOnRydWUsaGFuZGxlcjpmdW5jdGlvbigpe0FwcC5sYXlvdXQucmVzZXRDbGlw KDApO0FwcC5sYXlvdXQuZm9yY2VDaGFuZ2VTbGlkZXJPcGFjaXR5KCJzbGlkZXJf Y29tcGFyYWNpb19vcnRvIil9fSx7Ym94TGFiZWw6ZXNjb21icmF0VixjdENsczoi Y2hlY2tCb3hIaXN0IixuYW1lOiJtZXRvZGVDb21wT3J0byIsaW5wdXRWYWx1ZToy LGhhbmRsZXI6ZnVuY3Rpb24oKXtBcHAubGF5b3V0LmZvcmNlQ2hhbmdlU2xpZGVy T3BhY2l0eSgic2xpZGVyX2NvbXBhcmFjaW9fb3J0byIpfX0se2JveExhYmVsOmVz Y29tYnJhdEgsY3RDbHM6ImNoZWNrQm94SGlzdCIsbmFtZToibWV0b2RlQ29tcE9y dG8iLGlucHV0VmFsdWU6MyxoYW5kbGVyOmZ1bmN0aW9uKCl7QXBwLmxheW91dC5m b3JjZUNoYW5nZVNsaWRlck9wYWNpdHkoInNsaWRlcl9jb21wYXJhY2lvX29ydG8i KX19XX0pO3ZhciByYWRpb0dyb3VwR2VvbD1uZXcgRXh0LmZvcm0uUmFkaW9Hcm91 cCh7aWQ6InJhZGlvR3JvdXBDb21wYXJhZG9yR2VvbCIsY29sdW1uczoxLGN0Q2xz OiJyYWRpb0dyb3VwQ29tcCIsaXRlbXM6W3tib3hMYWJlbDpvcGFjaXRhdCxjdENs czoiY2hlY2tCb3hIaXN0IixuYW1lOiJtZXRvZGVDb21wR2VvbCIsaW5wdXRWYWx1 ZToxLGNoZWNrZWQ6dHJ1ZSxoYW5kbGVyOmZ1bmN0aW9uKCl7QXBwLmxheW91dC5y ZXNldENsaXAoMCk7QXBwLmxheW91dC5mb3JjZUNoYW5nZVNsaWRlck9wYWNpdHko InNsaWRlcl9jb21wYXJhY2lvX2dlb2wiKX19LHtib3hMYWJlbDplc2NvbWJyYXRW LGN0Q2xzOiJjaGVja0JveEhpc3QiLG5hbWU6Im1ldG9kZUNvbXBHZW9sIixpbnB1 dFZhbHVlOjIsaGFuZGxlcjpmdW5jdGlvbigpe0FwcC5sYXlvdXQuZm9yY2VDaGFu Z2VTbGlkZXJPcGFjaXR5KCJzbGlkZXJfY29tcGFyYWNpb19nZW9sIil9fSx7Ym94 TGFiZWw6ZXNjb21icmF0SCxjdENsczoiY2hlY2tCb3hIaXN0IixuYW1lOiJtZXRv ZGVDb21wR2VvbCIsaW5wdXRWYWx1ZTozLGhhbmRsZXI6ZnVuY3Rpb24oKXtBcHAu bGF5b3V0LmZvcmNlQ2hhbmdlU2xpZGVyT3BhY2l0eSgic2xpZGVyX2NvbXBhcmFj aW9fZ2VvbCIpfX1dfSk7dmFyIHJhZGlvR3JvdXBUb3BvPW5ldyBFeHQuZm9ybS5S YWRpb0dyb3VwKHtpZDoicmFkaW9Hcm91cENvbXBhcmFkb3JUb3BvIixjb2x1bW5z OjEsY3RDbHM6InJhZGlvR3JvdXBDb21wIixpdGVtczpbe2JveExhYmVsOm9wYWNp dGF0LGN0Q2xzOiJjaGVja0JveEhpc3QiLG5hbWU6Im1ldG9kZUNvbXBUb3BvIixp bnB1dFZhbHVlOjEsY2hlY2tlZDp0cnVlLGhhbmRsZXI6ZnVuY3Rpb24oKXtBcHAu bGF5b3V0LnJlc2V0Q2xpcCgwKTtBcHAubGF5b3V0LmZvcmNlQ2hhbmdlU2xpZGVy T3BhY2l0eSgic2xpZGVyX2NvbXBhcmFjaW9fdG9wbyIpfX0se2JveExhYmVsOmVz Y29tYnJhdFYsY3RDbHM6ImNoZWNrQm94SGlzdCIsbmFtZToibWV0b2RlQ29tcFRv cG8iLGlucHV0VmFsdWU6MixoYW5kbGVyOmZ1bmN0aW9uKCl7QXBwLmxheW91dC5m b3JjZUNoYW5nZVNsaWRlck9wYWNpdHkoInNsaWRlcl9jb21wYXJhY2lvX3RvcG8i KX19LHtib3hMYWJlbDplc2NvbWJyYXRILGN0Q2xzOiJjaGVja0JveEhpc3QiLG5h bWU6Im1ldG9kZUNvbXBUb3BvIixpbnB1dFZhbHVlOjMsaGFuZGxlcjpmdW5jdGlv bigpe0FwcC5sYXlvdXQuZm9yY2VDaGFuZ2VTbGlkZXJPcGFjaXR5KCJzbGlkZXJf Y29tcGFyYWNpb190b3BvIil9fV19KTt2YXIgcmFkaW9Hcm91cEdlb2xPcnRvPW5l dyBFeHQuZm9ybS5SYWRpb0dyb3VwKHtpZDoicmFkaW9Hcm91cENvbXBhcmFkb3JH ZW9sT3J0byIsY29sdW1uczoxLGN0Q2xzOiJyYWRpb0dyb3VwQ29tcCIsaXRlbXM6 W3tib3hMYWJlbDpvcGFjaXRhdCxjdENsczoiY2hlY2tCb3hIaXN0IixuYW1lOiJt ZXRvZGVDb21wR2VvbE9ydG8iLGlucHV0VmFsdWU6MSxjaGVja2VkOnRydWUsaGFu ZGxlcjpmdW5jdGlvbigpe0FwcC5sYXlvdXQucmVzZXRDbGlwKDApO0FwcC5sYXlv dXQuZm9yY2VDaGFuZ2VTbGlkZXJPcGFjaXR5KCJzbGlkZXJfY29tcGFyYWNpb19n ZW9sX29ydG8iKX19LHtib3hMYWJlbDplc2NvbWJyYXRWLGN0Q2xzOiJjaGVja0Jv eEhpc3QiLG5hbWU6Im1ldG9kZUNvbXBHZW9sT3J0byIsaW5wdXRWYWx1ZToyLGhh bmRsZXI6ZnVuY3Rpb24oKXtBcHAubGF5b3V0LmZvcmNlQ2hhbmdlU2xpZGVyT3Bh Y2l0eSgic2xpZGVyX2NvbXBhcmFjaW9fZ2VvbF9vcnRvIil9fSx7Ym94TGFiZWw6 ZXNjb21icmF0SCxjdENsczoiY2hlY2tCb3hIaXN0IixuYW1lOiJtZXRvZGVDb21w R2VvbE9ydG8iLGlucHV0VmFsdWU6MyxoYW5kbGVyOmZ1bmN0aW9uKCl7QXBwLmxh eW91dC5mb3JjZUNoYW5nZVNsaWRlck9wYWNpdHkoInNsaWRlcl9jb21wYXJhY2lv X2dlb2xfb3J0byIpfX1dfSk7dmFyIHRpdGxlUmFkaW9Hcm91cD17Ym9keVN0eWxl OiJib3JkZXI6MHB4O2JhY2tncm91bmQ6I2ZmZjtmb250LXNpemU6MTFweDsiLGh0 bWw6c2VsZWN0TWV0ZH07dmFyIHBhbmVsUmFkaW9Hcm91cD1uZXcgRXh0LlBhbmVs KHtpdGVtczpbdGl0bGVSYWRpb0dyb3VwLHJhZGlvR3JvdXBdfSk7dmFyIHBhbmVs UmFkaW9Hcm91cE9ydG89bmV3IEV4dC5QYW5lbCh7aXRlbXM6W3RpdGxlUmFkaW9H cm91cCxyYWRpb0dyb3VwT3J0b119KTt2YXIgcGFuZWxSYWRpb0dyb3VwR2VvbD1u ZXcgRXh0LlBhbmVsKHtpdGVtczpbdGl0bGVSYWRpb0dyb3VwLHJhZGlvR3JvdXBH ZW9sXX0pO3ZhciBwYW5lbFJhZGlvR3JvdXBUb3BvPW5ldyBFeHQuUGFuZWwoe2l0 ZW1zOlt0aXRsZVJhZGlvR3JvdXAscmFkaW9Hcm91cFRvcG9dfSk7dmFyIHBhbmVs UmFkaW9Hcm91cEdlb2xPcnRvPW5ldyBFeHQuUGFuZWwoe2l0ZW1zOlt0aXRsZVJh ZGlvR3JvdXAscmFkaW9Hcm91cEdlb2xPcnRvXX0pO3ZhciBzbGlkZXJDb21wYXJh Y2lvPW5ldyBFeHQuU2xpZGVyKHtpZDoic2xpZGVyX2NvbXBhcmFjaW8iLG1pblZh bHVlOjAsbWF4VmFsdWU6MTAwLHZhbHVlOjUwLHdpZHRoOjE4MCxsaXN0ZW5lcnM6 e2JlZm9yZWNoYW5nZTpmdW5jdGlvbigpe0FwcC5sYXlvdXQuZ2V0THlyVG9Db21w YXJlKCk7aWYoIUFwcC5sYXlvdXQubHlyVHJhbnMudmlzaWJpbGl0eSl7QXBwLmxh eW91dC5seXJUcmFucy5zZXRWaXNpYmlsaXR5KHRydWUpfX0sY2hhbmdlOmZ1bmN0 aW9uKCl7dmFyIGI9bWFwLmdldFpvb20oKTt2YXIgYz1FeHQuZ2V0Q21wKCJyYWRp b0dyb3VwQ29tcGFyYWRvciIpO3ZhciBhPWMuZ2V0VmFsdWUoKTtzd2l0Y2goYS5p bnB1dFZhbHVlKXtjYXNlIDE6QXBwLmxheW91dC5seXJUcmFucy5zZXRPcGFjaXR5 KHRoaXMuZ2V0VmFsdWUoKS8xMDApO2JyZWFrO2Nhc2UgMjpBcHAubGF5b3V0Lmhh bmRsZXJWZXJ0aWNhbEN1cnRhaW4oInNsaWRlcl9jb21wYXJhY2lvIik7YnJlYWs7 Y2FzZSAzOkFwcC5sYXlvdXQuaGFuZGxlckhvcml6b250YWxDdXJ0YWluKCJzbGlk ZXJfY29tcGFyYWNpbyIpO2JyZWFrfX19fSk7dmFyIHNsaWRlckNvbXBhcmFjaW9P cnRvPW5ldyBFeHQuU2xpZGVyKHtpZDoic2xpZGVyX2NvbXBhcmFjaW9fb3J0byIs bWluVmFsdWU6MCxtYXhWYWx1ZToxMDAsdmFsdWU6NTAsd2lkdGg6MTgwLGxpc3Rl bmVyczp7YmVmb3JlY2hhbmdlOmZ1bmN0aW9uKCl7aWYoIUFwcC5sYXlvdXQubHly VHJhbnMudmlzaWJpbGl0eSl7QXBwLmxheW91dC5seXJUcmFucy5zZXRWaXNpYmls aXR5KHRydWUpfX0sY2hhbmdlOmZ1bmN0aW9uKCl7dmFyIGI9RXh0LmdldENtcCgi cmFkaW9Hcm91cENvbXBhcmFkb3JPcnRvIik7dmFyIGE9Yi5nZXRWYWx1ZSgpO3N3 aXRjaChhLmlucHV0VmFsdWUpe2Nhc2UgMTpBcHAubGF5b3V0Lmx5clRyYW5zLnNl dE9wYWNpdHkodGhpcy5nZXRWYWx1ZSgpLzEwMCk7YnJlYWs7Y2FzZSAyOkFwcC5s YXlvdXQuaGFuZGxlclZlcnRpY2FsQ3VydGFpbigic2xpZGVyX2NvbXBhcmFjaW9f b3J0byIpO2JyZWFrO2Nhc2UgMzpBcHAubGF5b3V0LmhhbmRsZXJIb3Jpem9udGFs Q3VydGFpbigic2xpZGVyX2NvbXBhcmFjaW9fb3J0byIpO2JyZWFrfX19fSk7dmFy IHNsaWRlckNvbXBhcmFjaW9HZW9sPW5ldyBFeHQuU2xpZGVyKHtpZDoic2xpZGVy X2NvbXBhcmFjaW9fZ2VvbCIsZGlzYWJsZWQ6dHJ1ZSxtaW5WYWx1ZTowLG1heFZh bHVlOjEwMCx2YWx1ZTo1MCx3aWR0aDoxODAsbGlzdGVuZXJzOntiZWZvcmVjaGFu Z2U6ZnVuY3Rpb24oKXt2YXIgYj1FeHQuZ2V0Q21wKCJjaGtHZW9sIik7dmFyIGE9 RXh0LmdldENtcCgiY2hrSW5mcmFyb2lnIik7dmFyIGM9RXh0LmdldENtcCgiY2hr TkRWSSIpO2lmKGIuZ2V0VmFsdWUoKSl7QXBwLmxheW91dC5seXJUcmFucz1tYXAu Z2V0TGF5ZXJzQnlOYW1lKCJnZW9sX3RyYW5zIilbMF19aWYoYS5nZXRWYWx1ZSgp KXtBcHAubGF5b3V0Lmx5clRyYW5zPW1hcC5nZXRMYXllcnNCeU5hbWUoImluZnJh cm9pZyIpWzBdfWlmKGMuZ2V0VmFsdWUoKSl7QXBwLmxheW91dC5seXJUcmFucz1t YXAuZ2V0TGF5ZXJzQnlOYW1lKCJuZHZpIilbMF19aWYoIUFwcC5sYXlvdXQubHly VHJhbnMudmlzaWJpbGl0eSl7QXBwLmxheW91dC5seXJUcmFucy5zZXRWaXNpYmls aXR5KHRydWUpfX0sY2hhbmdlOmZ1bmN0aW9uKCl7dmFyIGI9bWFwLmdldFpvb20o KTt2YXIgYz1FeHQuZ2V0Q21wKCJyYWRpb0dyb3VwQ29tcGFyYWRvckdlb2wiKTt2 YXIgYT1jLmdldFZhbHVlKCk7c3dpdGNoKGEuaW5wdXRWYWx1ZSl7Y2FzZSAxOkFw cC5sYXlvdXQubHlyVHJhbnMuc2V0T3BhY2l0eSh0aGlzLmdldFZhbHVlKCkvMTAw KTticmVhaztjYXNlIDI6QXBwLmxheW91dC5oYW5kbGVyVmVydGljYWxDdXJ0YWlu KCJzbGlkZXJfY29tcGFyYWNpb19nZW9sIik7YnJlYWs7Y2FzZSAzOkFwcC5sYXlv dXQuaGFuZGxlckhvcml6b250YWxDdXJ0YWluKCJzbGlkZXJfY29tcGFyYWNpb19n ZW9sIik7YnJlYWt9fX19KTt2YXIgc2xpZGVyQ29tcGFyYWNpb1RvcG89bmV3IEV4 dC5TbGlkZXIoe2lkOiJzbGlkZXJfY29tcGFyYWNpb190b3BvIixtaW5WYWx1ZTow LG1heFZhbHVlOjEwMCx2YWx1ZTo1MCx3aWR0aDoxODAsbGlzdGVuZXJzOntiZWZv cmVjaGFuZ2U6ZnVuY3Rpb24oKXt2YXIgYT1tYXAuZ2V0Wm9vbSgpO2lmKCFBcHAu bGF5b3V0Lmx5clRyYW5zLnZpc2liaWxpdHkpe0FwcC5sYXlvdXQubHlyVHJhbnMu c2V0VmlzaWJpbGl0eSh0cnVlKX1pZihhPj0xMCYmIUFwcC5sYXlvdXQubHlyVHJh bnMyLnZpc2liaWxpdHkpe0FwcC5sYXlvdXQubHlyVHJhbnMyLnNldFZpc2liaWxp dHkodHJ1ZSl9fSxjaGFuZ2U6ZnVuY3Rpb24oKXt2YXIgYj1tYXAuZ2V0Wm9vbSgp O3ZhciBjPUV4dC5nZXRDbXAoInJhZGlvR3JvdXBDb21wYXJhZG9yVG9wbyIpO3Zh ciBhPWMuZ2V0VmFsdWUoKTtzd2l0Y2goYS5pbnB1dFZhbHVlKXtjYXNlIDE6QXBw LmxheW91dC5seXJUcmFucy5zZXRPcGFjaXR5KHRoaXMuZ2V0VmFsdWUoKS8xMDAp O2lmKGI+PTEwKXtBcHAubGF5b3V0Lmx5clRyYW5zMi5zZXRPcGFjaXR5KHRoaXMu Z2V0VmFsdWUoKS8xMDApfWJyZWFrO2Nhc2UgMjpBcHAubGF5b3V0LmhhbmRsZXJW ZXJ0aWNhbEN1cnRhaW4oInNsaWRlcl9jb21wYXJhY2lvX3RvcG8iKTticmVhaztj YXNlIDM6QXBwLmxheW91dC5oYW5kbGVySG9yaXpvbnRhbEN1cnRhaW4oInNsaWRl cl9jb21wYXJhY2lvX3RvcG8iKTticmVha319fX0pO3ZhciBzbGlkZXJDb21wYXJh Y2lvR2VvbE9ydG89bmV3IEV4dC5TbGlkZXIoe2lkOiJzbGlkZXJfY29tcGFyYWNp b19nZW9sX29ydG8iLG1pblZhbHVlOjAsbWF4VmFsdWU6MTAwLHZhbHVlOjUwLHdp ZHRoOjE4MCxsaXN0ZW5lcnM6e2JlZm9yZWNoYW5nZTpmdW5jdGlvbigpe3ZhciBi PUV4dC5nZXRDbXAoImNoa0dlb2xPcnRvIik7dmFyIGE9RXh0LmdldENtcCgiY2hr SW5mcmFyb2lnT3J0byIpO3ZhciBjPUV4dC5nZXRDbXAoImNoa05EVklvcnRvIik7 aWYoYi5nZXRWYWx1ZSgpfHxhLmdldFZhbHVlKCl8fGMuZ2V0VmFsdWUoKSl7aWYo IUFwcC5sYXlvdXQubHlyVHJhbnMudmlzaWJpbGl0eSl7QXBwLmxheW91dC5seXJU cmFucy5zZXRWaXNpYmlsaXR5KHRydWUpfX1lbHNle0FwcC5sYXlvdXQubHlyVHJh bnMuc2V0VmlzaWJpbGl0eShmYWxzZSl9fSxjaGFuZ2U6ZnVuY3Rpb24oKXt2YXIg Yj1tYXAuZ2V0Wm9vbSgpO3ZhciBjPUV4dC5nZXRDbXAoInJhZGlvR3JvdXBDb21w YXJhZG9yR2VvbE9ydG8iKTt2YXIgYT1jLmdldFZhbHVlKCk7c3dpdGNoKGEuaW5w dXRWYWx1ZSl7Y2FzZSAxOkFwcC5sYXlvdXQubHlyVHJhbnMuc2V0T3BhY2l0eSh0 aGlzLmdldFZhbHVlKCkvMTAwKTticmVhaztjYXNlIDI6QXBwLmxheW91dC5oYW5k bGVyVmVydGljYWxDdXJ0YWluKCJzbGlkZXJfY29tcGFyYWNpb19nZW9sX29ydG8i KTticmVhaztjYXNlIDM6QXBwLmxheW91dC5oYW5kbGVySG9yaXpvbnRhbEN1cnRh aW4oInNsaWRlcl9jb21wYXJhY2lvX2dlb2xfb3J0byIpO2JyZWFrfX19fSk7dmFy IHNlcGFyYXRvcj1uZXcgRXh0LkJveENvbXBvbmVudCh7YXV0b0VsOnt0YWc6ImJy In19KTt2YXIgaW1hZ2VJY29uQ2hrSW5mcmFyb2lnPW5ldyBFeHQuQm94Q29tcG9u ZW50KHthdXRvRWw6e3RhZzoiaW1nIixzcmM6ImltZy90cmVlSWNvbnMvaW5mcmFy ZWQucG5nIn0sc3R5bGU6e21hcmdpblJpZ2h0OiI1cHgifX0pO3ZhciBjaGVja0Jv eEluZnJhcm9pZz1uZXcgRXh0LmZvcm0uQ2hlY2tib3goe2lkOiJjaGtJbmZyYXJv aWciLGJveExhYmVsOnRleHRJbmZyYXJvaWcsY3RDbHM6ImNoZWNrQm94SGlzdCIs aGFuZGxlcjpmdW5jdGlvbigpe3ZhciBiPW1hcC5nZXRMYXllcnNCeU5hbWUoImlu ZnJhcm9pZyIpWzBdO2lmKHRoaXMuY2hlY2tlZCl7RXh0LmdldENtcCgiY2hrTkRW SSIpLnNldFZhbHVlKGZhbHNlKTtFeHQuZ2V0Q21wKCJjaGtHZW9sIikuc2V0VmFs dWUoZmFsc2UpO0FwcC5sYXlvdXQuaGFuZGxlck9ydG9JbmZyYVJvaWcoKTt2YXIg YT1FeHQuZ2V0Q21wKCJzbGlkZXJfY29tcGFyYWNpb19nZW9sIik7YS5zZXREaXNh YmxlZChmYWxzZSk7Yi5zZXRWaXNpYmlsaXR5KHRydWUpO0FwcC5sYXlvdXQuZm9y Y2VDaGFuZ2VTbGlkZXJPcGFjaXR5KCJzbGlkZXJfY29tcGFyYWNpb19nZW9sIil9 ZWxzZXtiLnNldFZpc2liaWxpdHkoZmFsc2UpO0FwcC5sYXlvdXQuZGlzYWJsZVNs aWRlck90aGVyc09uVG9wbygpfX19KTt2YXIgcGFuZWxDaGtJbmZyYXJvaWc9bmV3 IEV4dC5QYW5lbCh7cGFkZGluZzoiMnB4Iixib3JkZXI6ZmFsc2UsbGF5b3V0OiJj b2x1bW4iLGl0ZW1zOltpbWFnZUljb25DaGtJbmZyYXJvaWcsY2hlY2tCb3hJbmZy YXJvaWddfSk7dmFyIGltYWdlSWNvbkNoa05EVkk9bmV3IEV4dC5Cb3hDb21wb25l bnQoe2F1dG9FbDp7dGFnOiJpbWciLHNyYzoiaW1nL3RyZWVJY29ucy9pY29uTmR2 aS5wbmcifSxzdHlsZTp7bWFyZ2luUmlnaHQ6IjVweCJ9fSk7dmFyIGNoZWNrQm94 TkRWST1uZXcgRXh0LmZvcm0uQ2hlY2tib3goe2lkOiJjaGtORFZJIixib3hMYWJl bDp0ZXh0TkRWSSxjdENsczoiY2hlY2tCb3hIaXN0IixoYW5kbGVyOmZ1bmN0aW9u KCl7dmFyIGI9bWFwLmdldExheWVyc0J5TmFtZSgibmR2aSIpWzBdO2lmKHRoaXMu Y2hlY2tlZCl7RXh0LmdldENtcCgiY2hrSW5mcmFyb2lnIikuc2V0VmFsdWUoZmFs c2UpO0V4dC5nZXRDbXAoImNoa0dlb2wiKS5zZXRWYWx1ZShmYWxzZSk7dmFyIGE9 RXh0LmdldENtcCgic2xpZGVyX2NvbXBhcmFjaW9fZ2VvbCIpO2Euc2V0RGlzYWJs ZWQoZmFsc2UpO2Iuc2V0VmlzaWJpbGl0eSh0cnVlKTtFeHQuZ2V0Q21wKCJ3aW5O RFZJY29udHJvbExlZ2VuZCIpLnNob3coKTtBcHAubGF5b3V0LmZvcmNlQ2hhbmdl U2xpZGVyT3BhY2l0eSgic2xpZGVyX2NvbXBhcmFjaW9fZ2VvbCIpfWVsc2V7Yi5z ZXRWaXNpYmlsaXR5KGZhbHNlKTtFeHQuZ2V0Q21wKCJ3aW5ORFZJY29udHJvbExl Z2VuZCIpLmhpZGUoKTtBcHAubGF5b3V0LmRpc2FibGVTbGlkZXJPdGhlcnNPblRv cG8oKX19fSk7dmFyIHBhbmVsQ2hrTkRWST1uZXcgRXh0LlBhbmVsKHtwYWRkaW5n OiIycHgiLGJvcmRlcjpmYWxzZSxsYXlvdXQ6ImNvbHVtbiIsaXRlbXM6W2ltYWdl SWNvbkNoa05EVkksY2hlY2tCb3hORFZJXX0pO3ZhciBpbWFnZUljb25DaGtHZW9s PW5ldyBFeHQuQm94Q29tcG9uZW50KHthdXRvRWw6e3RhZzoiaW1nIixzcmM6Imlt Zy90cmVlSWNvbnMvZ2VvbG9naWMucG5nIn0sc3R5bGU6e21hcmdpblJpZ2h0OiI1 cHgifX0pO3ZhciBjaGVja0JveEdlb2w9bmV3IEV4dC5mb3JtLkNoZWNrYm94KHtp ZDoiY2hrR2VvbCIsYm94TGFiZWw6Z2VvbHdpdGhUb29sdGlwLGN0Q2xzOiJjaGVj a0JveEhpc3QiLGhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgYj1tYXAuZ2V0TGF5ZXJz QnlOYW1lKCJnZW9sX3RyYW5zIilbMF07aWYodGhpcy5jaGVja2VkKXtFeHQuZ2V0 Q21wKCJjaGtJbmZyYXJvaWciKS5zZXRWYWx1ZShmYWxzZSk7RXh0LmdldENtcCgi Y2hrTkRWSSIpLnNldFZhbHVlKGZhbHNlKTt2YXIgYT1FeHQuZ2V0Q21wKCJzbGlk ZXJfY29tcGFyYWNpb19nZW9sIik7YS5zZXREaXNhYmxlZChmYWxzZSk7Yi5zZXRW aXNpYmlsaXR5KHRydWUpO0FwcC5sYXlvdXQuZm9yY2VDaGFuZ2VTbGlkZXJPcGFj aXR5KCJzbGlkZXJfY29tcGFyYWNpb19nZW9sIil9ZWxzZXtiLnNldFZpc2liaWxp dHkoZmFsc2UpO0FwcC5sYXlvdXQuZGlzYWJsZVNsaWRlck90aGVyc09uVG9wbygp fX19KTt2YXIgcGFuZWxDaGtHZW9sPW5ldyBFeHQuUGFuZWwoe3BhZGRpbmc6IjJw eCIsYm9yZGVyOmZhbHNlLGxheW91dDoiY29sdW1uIixpdGVtczpbaW1hZ2VJY29u Q2hrR2VvbCxjaGVja0JveEdlb2xdfSk7dmFyIG90aGVyc0NvbnRhaW5lcj1uZXcg RXh0LlBhbmVsKHtwYWRkaW5nOiIycHgiLGJvcmRlcjpmYWxzZSxjbHM6Im15LWhl YWRlciIsdGl0bGU6Ik9wY2lvbnMiLGNvbGxhcHNpYmxlOnRydWUsaXRlbXM6W3Bh bmVsQ2hrR2VvbF19KTt2YXIgY29tcGFyZVJhZGlvc0NvbnRhaW5lcj1uZXcgRXh0 LlBhbmVsKHtwYWRkaW5nOiIycHgiLGJvcmRlcjpmYWxzZSxpdGVtczpbcGFuZWxS YWRpb0dyb3VwLHNsaWRlckNvbXBhcmFjaW8sc2VwYXJhdG9yXX0pO3ZhciBjb21w YXJlUmFkaW9zQ29udGFpbmVyT3J0bz1uZXcgRXh0LlBhbmVsKHtwYWRkaW5nOiIy cHgiLGJvcmRlcjpmYWxzZSxpdGVtczpbcGFuZWxSYWRpb0dyb3VwT3J0byxzbGlk ZXJDb21wYXJhY2lvT3J0byxzZXBhcmF0b3JdfSk7dmFyIGNvbXBhcmVSYWRpb3ND b250YWluZXJHZW9sPW5ldyBFeHQuUGFuZWwoe3BhZGRpbmc6IjJweCIsYm9yZGVy OmZhbHNlLGl0ZW1zOltwYW5lbFJhZGlvR3JvdXBHZW9sLHNsaWRlckNvbXBhcmFj aW9HZW9sLHNlcGFyYXRvcl19KTt2YXIgY29tcGFyZVJhZGlvc0NvbnRhaW5lclRv cG89bmV3IEV4dC5QYW5lbCh7cGFkZGluZzoiMnB4Iixib3JkZXI6ZmFsc2UsaXRl bXM6W3BhbmVsUmFkaW9Hcm91cFRvcG8sc2xpZGVyQ29tcGFyYWNpb1RvcG8sc2Vw YXJhdG9yXX0pO3ZhciBjb21wYXJlUmFkaW9zQ29udGFpbmVyR2VvbE9ydG89bmV3 IEV4dC5QYW5lbCh7cGFkZGluZzoiMnB4Iixib3JkZXI6ZmFsc2UsaXRlbXM6W3Bh bmVsUmFkaW9Hcm91cEdlb2xPcnRvLHNsaWRlckNvbXBhcmFjaW9HZW9sT3J0byxz ZXBhcmF0b3JdfSk7dmFyIHNsaWRlcl9vcnRvX2hpc3Q9bmV3IEV4dC5TbGlkZXIo e2lkOiJoaXN0X3NsaWRlcl9jb21wMiIsd2lkdGg6MTg4LGluY3JlbWVudDoxMCxt aW5WYWx1ZTowLG1heFZhbHVlOjUwLHZhbHVlOjUwLHBsdWdpbnM6bmV3IEdlb0V4 dC5TbGlkZXJUaXAoe2dldFRleHQ6ZnVuY3Rpb24oYSl7aWYoYS52YWx1ZT09MCl7 cmV0dXJuIHR4dG9ydG81Nn1pZihhLnZhbHVlPT0xMCl7cmV0dXJuIHR4dG9ydG8w OH1pZihhLnZhbHVlPT0yMCl7cmV0dXJuIHR4dG9ydG8wOX1pZihhLnZhbHVlPT0z MCl7cmV0dXJuIHR4dG9ydG8xMH1pZihhLnZhbHVlPT00MCl7cmV0dXJuIHR4dG9y dG8xMX1pZihhLnZhbHVlPT01MCl7cmV0dXJuIHR4dG9ydG92aWdlbnR9fX0pLGxp c3RlbmVyczp7Y2hhbmdlY29tcGxldGU6ZnVuY3Rpb24oKXt2YXIgYT1tYXAuZ2V0 TGF5ZXJzQnlOYW1lKCJvdmVybGF5X29ydG9faGlzdCIpWzBdO3ZhciBiPW1hcC5n ZXRMYXllcnNCeU5hbWUoIm92ZXJsYXlfb3J0b19zaWdyaWQiKVswXTt2YXIgZD1t YXAuZ2V0TGF5ZXJzQnlOYW1lKGx5ck9ydG8pWzBdO3N3aXRjaCh0aGlzLmdldFZh bHVlKCkpe2Nhc2UgNTA6ZC5zZXRWaXNpYmlsaXR5KHRydWUpO2Iuc2V0VmlzaWJp bGl0eShmYWxzZSk7YS5zZXRWaXNpYmlsaXR5KGZhbHNlKTt2YXIgYz0iMCI7RXh0 LmdldENtcCgiY2hrRGF0YVZvbE9ydG8iKS5zZXREaXNhYmxlZChmYWxzZSk7RXh0 LmdldENtcCgiY2hrVG9wT3J0byIpLnNldERpc2FibGVkKGZhbHNlKTtpZihtYXAu Z2V0Q29udHJvbHNCeUNsYXNzKCJWaXNzaXIuU2NlbmVJbmZvIilbMF0pe21hcC5n ZXRDb250cm9sc0J5Q2xhc3MoIlZpc3Npci5TY2VuZUluZm8iKVswXS5yZXF1ZXN0 U2NlbmVJbmZvKCl9YnJlYWs7Y2FzZSA0MDpiLnNldFZpc2liaWxpdHkodHJ1ZSk7 YS5zZXRWaXNpYmlsaXR5KGZhbHNlKTtkLnNldFZpc2liaWxpdHkoZmFsc2UpO3Zh ciBjPSIyMDExIjtFeHQuZ2V0Q21wKCJjaGtEYXRhVm9sT3J0byIpLnNldERpc2Fi bGVkKHRydWUpO0V4dC5nZXRDbXAoImNoa0RhdGFWb2xPcnRvIikuc2V0VmFsdWUo ZmFsc2UpO0V4dC5nZXRDbXAoImNoa1RvcE9ydG8iKS5zZXREaXNhYmxlZCh0cnVl KTtFeHQuZ2V0Q21wKCJjaGtUb3BPcnRvIikuc2V0VmFsdWUoZmFsc2UpO19nYXEu cHVzaChbIl90cmFja0V2ZW50Iiwidmlzc2lyIiwiU2lncmlkMjAxMSJdKTticmVh aztjYXNlIDMwOmEuc2V0VmlzaWJpbGl0eSh0cnVlKTtiLnNldFZpc2liaWxpdHko ZmFsc2UpO2Quc2V0VmlzaWJpbGl0eShmYWxzZSk7dmFyIGM9IjIwMTAiO0V4dC5n ZXRDbXAoImNoa0RhdGFWb2xPcnRvIikuc2V0RGlzYWJsZWQodHJ1ZSk7RXh0Lmdl dENtcCgiY2hrRGF0YVZvbE9ydG8iKS5zZXRWYWx1ZShmYWxzZSk7RXh0LmdldENt cCgiY2hrVG9wT3J0byIpLnNldERpc2FibGVkKHRydWUpO0V4dC5nZXRDbXAoImNo a1RvcE9ydG8iKS5zZXRWYWx1ZShmYWxzZSk7X2dhcS5wdXNoKFsiX3RyYWNrRXZl bnQiLCJ2aXNzaXIiLCJTaGFncmF0MjAxMCJdKTticmVhaztjYXNlIDIwOmEuc2V0 VmlzaWJpbGl0eSh0cnVlKTtiLnNldFZpc2liaWxpdHkoZmFsc2UpO2Quc2V0Vmlz aWJpbGl0eShmYWxzZSk7dmFyIGM9IjIwMDkiO0V4dC5nZXRDbXAoImNoa0RhdGFW b2xPcnRvIikuc2V0RGlzYWJsZWQodHJ1ZSk7RXh0LmdldENtcCgiY2hrRGF0YVZv bE9ydG8iKS5zZXRWYWx1ZShmYWxzZSk7RXh0LmdldENtcCgiY2hrVG9wT3J0byIp LnNldERpc2FibGVkKHRydWUpO0V4dC5nZXRDbXAoImNoa1RvcE9ydG8iKS5zZXRW YWx1ZShmYWxzZSk7X2dhcS5wdXNoKFsiX3RyYWNrRXZlbnQiLCJ2aXNzaXIiLCJT aGFncmF0MjAwOSJdKTticmVhaztjYXNlIDEwOmEuc2V0VmlzaWJpbGl0eSh0cnVl KTtiLnNldFZpc2liaWxpdHkoZmFsc2UpO2Quc2V0VmlzaWJpbGl0eShmYWxzZSk7 dmFyIGM9IjIwMDgiO0V4dC5nZXRDbXAoImNoa0RhdGFWb2xPcnRvIikuc2V0RGlz YWJsZWQodHJ1ZSk7RXh0LmdldENtcCgiY2hrRGF0YVZvbE9ydG8iKS5zZXRWYWx1 ZShmYWxzZSk7RXh0LmdldENtcCgiY2hrVG9wT3J0byIpLnNldERpc2FibGVkKHRy dWUpO0V4dC5nZXRDbXAoImNoa1RvcE9ydG8iKS5zZXRWYWx1ZShmYWxzZSk7X2dh cS5wdXNoKFsiX3RyYWNrRXZlbnQiLCJ2aXNzaXIiLCJTaGFncmF0MjAwOCJdKTti cmVhaztjYXNlIDA6YS5zZXRWaXNpYmlsaXR5KHRydWUpO2Iuc2V0VmlzaWJpbGl0 eShmYWxzZSk7ZC5zZXRWaXNpYmlsaXR5KGZhbHNlKTt2YXIgYz0iMTk1NiI7RXh0 LmdldENtcCgiY2hrRGF0YVZvbE9ydG8iKS5zZXREaXNhYmxlZCh0cnVlKTtFeHQu Z2V0Q21wKCJjaGtEYXRhVm9sT3J0byIpLnNldFZhbHVlKGZhbHNlKTtFeHQuZ2V0 Q21wKCJjaGtUb3BPcnRvIikuc2V0RGlzYWJsZWQodHJ1ZSk7RXh0LmdldENtcCgi Y2hrVG9wT3J0byIpLnNldFZhbHVlKGZhbHNlKTtfZ2FxLnB1c2goWyJfdHJhY2tF dmVudCIsInZpc3NpciIsIlNoYWdyYXQxOTU2Il0pO2JyZWFrfWlmKGMhPSIwIiYm YyE9IiIpe3ZhciBlPW1hcC5nZXRab29tKCk7T3BlbkxheWVycy5SZXF1ZXN0LkdF VCh7dXJsOkFwcC5IaXN0b3JpY3NTZXJ2ZXIscGFyYW1zOnthbnk6YyxuaXZlbGw6 ZX0sY2FsbGJhY2s6QXBwLmxheW91dC5oYW5kbGVyT3J0b0hpc3R9KX19fX0pO3Zh ciB5ZWFyc1NjYWxlT3J0b0hpc3Q9e2lkOiJ5ZWFyc1NjYWxlLWltZyIsYm9keVN0 eWxlOiJib3JkZXI6MHB4OyIsaHRtbDppbWdzY2FsZXllYXJzfTt2YXIgcGFuZWxT bGlkZXJPcnRvSGlzdD1uZXcgRXh0LlBhbmVsKHtwYWRkaW5nOiIycHgiLGJvcmRl cjpmYWxzZSxpdGVtczpbeWVhcnNTY2FsZU9ydG9IaXN0LHNsaWRlcl9vcnRvX2hp c3RdfSk7dmFyIGltYWdlSWNvbkNoa0RhdGFWb2xPcnRvPW5ldyBFeHQuQm94Q29t cG9uZW50KHthdXRvRWw6e3RhZzoiaW1nIixzcmM6ImltZy90cmVlSWNvbnMvZGF0 YV92b2wucG5nIn0sc3R5bGU6e21hcmdpblJpZ2h0OiI1cHgifX0pO3ZhciBjaGVj a0JveERhdGFWb2xPcnRvPW5ldyBFeHQuZm9ybS5DaGVja2JveCh7aWQ6ImNoa0Rh dGFWb2xPcnRvIixib3hMYWJlbDpkYXRhVm9sLGN0Q2xzOiJjaGVja0JveEhpc3Qi LGhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgYT1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJk YXRhdm9sIilbMF07aWYodGhpcy5jaGVja2VkKXthLnNldFZpc2liaWxpdHkodHJ1 ZSl9ZWxzZXthLnNldFZpc2liaWxpdHkoZmFsc2UpfX19KTt2YXIgcGFuZWxDaGsx VG9wb0FkZGlPcnRvPW5ldyBFeHQuUGFuZWwoe2JvcmRlcjpmYWxzZSxsYXlvdXQ6 ImNvbHVtbiIsaXRlbXM6W2ltYWdlSWNvbkNoa0RhdGFWb2xPcnRvLGNoZWNrQm94 RGF0YVZvbE9ydG9dfSk7dmFyIGNoZWNrQm94VG9wb25pbU9ydG89bmV3IEV4dC5m b3JtLkNoZWNrYm94KHtpZDoiY2hrVG9wT3J0byIsYm94TGFiZWw6bHlyVG9wb29y dG8sY3RDbHM6ImNoZWNrQm94SGlzdCIsaGFuZGxlcjpmdW5jdGlvbigpe2lmKHRo aXMuY2hlY2tlZCl7dmFyIGE9bWFwLmdldExheWVyc0J5TmFtZSgidG9wb29ydG8i KVswXTthLnNldFZpc2liaWxpdHkodHJ1ZSl9ZWxzZXt2YXIgYT1tYXAuZ2V0TGF5 ZXJzQnlOYW1lKCJ0b3Bvb3J0byIpWzBdO2Euc2V0VmlzaWJpbGl0eShmYWxzZSl9 fX0pO3ZhciBpbWFnZUljb25DaGtUcG5PcnQ9bmV3IEV4dC5Cb3hDb21wb25lbnQo e2F1dG9FbDp7dGFnOiJpbWciLHNyYzoiaW1nL3RyZWVJY29ucy90b3BvbmltaWEu anBnIn0sc3R5bGU6e21hcmdpblJpZ2h0OiI1cHgifX0pO3ZhciBwYW5lbENoazRU b3BvbmltT3J0bz1uZXcgRXh0LlBhbmVsKHtsYXlvdXQ6ImNvbHVtbiIsYm9yZGVy OmZhbHNlLGl0ZW1zOltpbWFnZUljb25DaGtUcG5PcnQsY2hlY2tCb3hUb3Bvbmlt T3J0b119KTt2YXIgY2hlY2tCb3hMaW1BZG1pbk9ydG89bmV3IEV4dC5mb3JtLkNo ZWNrYm94KHtpZDoiY2hrTGltQWRtaW5PcnRvIixib3hMYWJlbDpFeHRUb29sdGlw TGltQWRtaW4sY3RDbHM6ImNoZWNrQm94SGlzdCIsaGFuZGxlcjpmdW5jdGlvbigp e2lmKHRoaXMuY2hlY2tlZCl7bWFwLmdldExheWVyc0J5TmFtZSgibGltYWRtaW4i KVswXS5zZXRWaXNpYmlsaXR5KHRydWUpfWVsc2V7bWFwLmdldExheWVyc0J5TmFt ZSgibGltYWRtaW4iKVswXS5zZXRWaXNpYmlsaXR5KGZhbHNlKX19fSk7dmFyIGlt YWdlSWNvbkNoa0xpbUFkbWluPW5ldyBFeHQuQm94Q29tcG9uZW50KHthdXRvRWw6 e3RhZzoiaW1nIixzcmM6ImltZy90cmVlSWNvbnMvZGVzY2FycmVnYV9jb21hcnF1 ZXMucG5nIn0sc3R5bGU6e21hcmdpblJpZ2h0OiI1cHgifX0pO3ZhciBwYW5lbENo azVMaW1BZG1pbk9ydG89bmV3IEV4dC5QYW5lbCh7bGF5b3V0OiJjb2x1bW4iLGJv cmRlcjpmYWxzZSxpdGVtczpbaW1hZ2VJY29uQ2hrTGltQWRtaW4sY2hlY2tCb3hM aW1BZG1pbk9ydG9dfSk7dmFyIEFkZGl0aW9uYWxJQ0NPcnRvTGF5ZXJzPW5ldyBF eHQuUGFuZWwoe2lkOiJhZGRMeXJPcnRvIixiYXNlQ2xzOiJ4LXBsYWluIixib2R5 U3R5bGU6InBhZGRpbmctbGVmdDo1cHg7bWFyZ2luOjNweDsiLGl0ZW1zOltwYW5l bENoazRUb3BvbmltT3J0byxwYW5lbENoazVMaW1BZG1pbk9ydG8scGFuZWxDaGsx VG9wb0FkZGlPcnRvXX0pO3ZhciBjb250YWluZXJPcnRvTHlyPXtpZDoiY29udGFp bmVyT3J0b0x5ckRpdiIsaXRlbXM6W3BhbmVsU2xpZGVyT3J0b0hpc3QsQWRkaXRp b25hbElDQ09ydG9MYXllcnNdfTt2YXIgaW1hZ2VJY29uQ2hrSW5mcmFyb2lnT3J0 bz1uZXcgRXh0LkJveENvbXBvbmVudCh7YXV0b0VsOnt0YWc6ImltZyIsc3JjOiJp bWcvdHJlZUljb25zL2luZnJhcmVkLnBuZyJ9LHN0eWxlOnttYXJnaW5SaWdodDoi NXB4In19KTt2YXIgY2hlY2tCb3hJbmZyYXJvaWdPcnRvPW5ldyBFeHQuZm9ybS5D aGVja2JveCh7aWQ6ImNoa0luZnJhcm9pZ09ydG8iLGJveExhYmVsOnRleHRJbmZy YXJvaWcsY3RDbHM6ImNoZWNrQm94SGlzdCIsaGFuZGxlcjpmdW5jdGlvbigpe2lm KHRoaXMuY2hlY2tlZCl7RXh0LmdldENtcCgiY2hrTkRWSW9ydG8iKS5zZXRWYWx1 ZShmYWxzZSk7RXh0LmdldENtcCgiY2hrR2VvbE9ydG8iKS5zZXRWYWx1ZShmYWxz ZSk7QXBwLmxheW91dC5seXJUcmFucz1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJpbmZy YXJvaWciKVswXTtBcHAubGF5b3V0LmhhbmRsZXJPcnRvSW5mcmFSb2lnKCk7QXBw LmxheW91dC5seXJUcmFucy5zZXRWaXNpYmlsaXR5KHRydWUpO0FwcC5sYXlvdXQu Zm9yY2VDaGFuZ2VTbGlkZXJPcGFjaXR5KCJzbGlkZXJfY29tcGFyYWNpb19nZW9s X29ydG8iKX1lbHNle0FwcC5sYXlvdXQubHlyVHJhbnMuc2V0VmlzaWJpbGl0eShm YWxzZSl9fX0pO3ZhciBwYW5lbENoa0luZnJhcm9pZ09ydG89bmV3IEV4dC5QYW5l bCh7cGFkZGluZzoiMnB4Iixib3JkZXI6ZmFsc2UsbGF5b3V0OiJjb2x1bW4iLGl0 ZW1zOltpbWFnZUljb25DaGtJbmZyYXJvaWdPcnRvLGNoZWNrQm94SW5mcmFyb2ln T3J0b119KTt2YXIgaW1hZ2VJY29uQ2hrTkRWSW9ydG89bmV3IEV4dC5Cb3hDb21w b25lbnQoe2F1dG9FbDp7dGFnOiJpbWciLHNyYzoiaW1nL3RyZWVJY29ucy9pY29u TmR2aS5wbmcifSxzdHlsZTp7bWFyZ2luUmlnaHQ6IjVweCJ9fSk7dmFyIGNoZWNr Qm94TkRWSW9ydG89bmV3IEV4dC5mb3JtLkNoZWNrYm94KHtpZDoiY2hrTkRWSW9y dG8iLGJveExhYmVsOnRleHRORFZJLGN0Q2xzOiJjaGVja0JveEhpc3QiLGhhbmRs ZXI6ZnVuY3Rpb24oKXt2YXIgYT1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJuZHZpIilb MF07aWYodGhpcy5jaGVja2VkKXtFeHQuZ2V0Q21wKCJjaGtJbmZyYXJvaWdPcnRv Iikuc2V0VmFsdWUoZmFsc2UpO0V4dC5nZXRDbXAoImNoa0dlb2xPcnRvIikuc2V0 VmFsdWUoZmFsc2UpO0FwcC5sYXlvdXQubHlyVHJhbnM9bWFwLmdldExheWVyc0J5 TmFtZSgibmR2aSIpWzBdO0FwcC5sYXlvdXQubHlyVHJhbnMuc2V0VmlzaWJpbGl0 eSh0cnVlKTtFeHQuZ2V0Q21wKCJ3aW5ORFZJY29udHJvbExlZ2VuZCIpLnNob3co KTtBcHAubGF5b3V0LmZvcmNlQ2hhbmdlU2xpZGVyT3BhY2l0eSgic2xpZGVyX2Nv bXBhcmFjaW9fZ2VvbF9vcnRvIil9ZWxzZXtBcHAubGF5b3V0Lmx5clRyYW5zLnNl dFZpc2liaWxpdHkoZmFsc2UpO0V4dC5nZXRDbXAoIndpbk5EVkljb250cm9sTGVn ZW5kIikuaGlkZSgpfX19KTt2YXIgcGFuZWxDaGtORFZJb3J0bz1uZXcgRXh0LlBh bmVsKHtwYWRkaW5nOiIycHgiLGJvcmRlcjpmYWxzZSxsYXlvdXQ6ImNvbHVtbiIs aXRlbXM6W2ltYWdlSWNvbkNoa05EVklvcnRvLGNoZWNrQm94TkRWSW9ydG9dfSk7 dmFyIGltYWdlSWNvbkNoa0dlb2xPcnRvPW5ldyBFeHQuQm94Q29tcG9uZW50KHth dXRvRWw6e3RhZzoiaW1nIixzcmM6ImltZy90cmVlSWNvbnMvZ2VvbG9naWMucG5n In0sc3R5bGU6e21hcmdpblJpZ2h0OiI1cHgifX0pO3ZhciBjaGVja0JveEdlb2xP cnRvPW5ldyBFeHQuZm9ybS5DaGVja2JveCh7aWQ6ImNoa0dlb2xPcnRvIixib3hM YWJlbDpnZW9sd2l0aFRvb2x0aXAsY3RDbHM6ImNoZWNrQm94SGlzdCIsaGFuZGxl cjpmdW5jdGlvbigpe2lmKHRoaXMuY2hlY2tlZCl7RXh0LmdldENtcCgiY2hrSW5m cmFyb2lnT3J0byIpLnNldFZhbHVlKGZhbHNlKTtFeHQuZ2V0Q21wKCJjaGtORFZJ b3J0byIpLnNldFZhbHVlKGZhbHNlKTtBcHAubGF5b3V0Lmx5clRyYW5zPW1hcC5n ZXRMYXllcnNCeU5hbWUoImdlb2xfdHJhbnMiKVswXTtBcHAubGF5b3V0Lmx5clRy YW5zLnNldFZpc2liaWxpdHkodHJ1ZSk7QXBwLmxheW91dC5mb3JjZUNoYW5nZVNs aWRlck9wYWNpdHkoInNsaWRlcl9jb21wYXJhY2lvX2dlb2xfb3J0byIpfWVsc2V7 QXBwLmxheW91dC5seXJUcmFucy5zZXRWaXNpYmlsaXR5KGZhbHNlKX19fSk7dmFy IHBhbmVsQ2hrR2VvbE9ydG89bmV3IEV4dC5QYW5lbCh7cGFkZGluZzoiMnB4Iixi b3JkZXI6ZmFsc2UsbGF5b3V0OiJjb2x1bW4iLGl0ZW1zOltpbWFnZUljb25DaGtH ZW9sT3J0byxjaGVja0JveEdlb2xPcnRvXX0pO3ZhciB0YWJzQ29tcGFyZU9ydG89 bmV3IEV4dC5UYWJQYW5lbCh7aWQ6InRhYnNDb21wYXJlT3J0byIsYWN0aXZlVGFi OjAsYXV0b1dpZHRoOnRydWUsaGVpZ2h0OjMwMCxwYWRkaW5nOjAscGxhaW46dHJ1 ZSxib3JkZXI6dHJ1ZSxib2R5Qm9yZGVyOnRydWUsZGVmYXVsdHM6e2F1dG9TY3Jv bGw6dHJ1ZX0saXRlbXM6W3t0aXRsZTpseXJUb3BvLGl0ZW1zOltjb21wYXJlUmFk aW9zQ29udGFpbmVyVG9wb10sbGlzdGVuZXJzOntzaG93OmZ1bmN0aW9uKCl7QXBw LmxheW91dC5pbmRleHRhYnNDb21wYXJlT3J0bz0wO0V4dC5nZXRDbXAoImNoa0dl b2xPcnRvIikuc2V0VmFsdWUoZmFsc2UpO21hcC5nZXRMYXllcnNCeU5hbWUoIm92 ZXJsYXlfdHJhbnNfdG9wbyIpWzBdLnNldFZpc2liaWxpdHkodHJ1ZSk7QXBwLmxh eW91dC5seXJUcmFucz1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5z X3RvcG8iKVswXTtBcHAubGF5b3V0Lmx5clRyYW5zMj1tYXAuZ2V0TGF5ZXJzQnlO YW1lKCJvdmVybGF5X3RyYW5zX3RvcG8xbSIpWzBdO2lmKG1hcC5nZXRab29tKCk+ PTEwKXtBcHAubGF5b3V0Lmx5clRyYW5zMi5zZXRWaXNpYmlsaXR5KHRydWUpfWVs c2V7QXBwLmxheW91dC5seXJUcmFuczIuc2V0VmlzaWJpbGl0eShmYWxzZSl9fSxo aWRlOmZ1bmN0aW9uKCl7bWFwLmdldExheWVyc0J5TmFtZSgib3ZlcmxheV90cmFu c190b3BvMW0iKVswXS5zZXRWaXNpYmlsaXR5KGZhbHNlKTttYXAuZ2V0TGF5ZXJz QnlOYW1lKCJvdmVybGF5X3RyYW5zX3RvcG8iKVswXS5zZXRWaXNpYmlsaXR5KGZh bHNlKX19fSx7dGl0bGU6bHlyT3J0byxpdGVtczpbcGFuZWxSYWRpb0dyb3VwU2Vs ZWN0Q29tcExheWVyT3J0byxjb21wYXJlUmFkaW9zQ29udGFpbmVyT3J0b10sbGlz dGVuZXJzOntzaG93OmZ1bmN0aW9uKCl7QXBwLmxheW91dC5pbmRleHRhYnNDb21w YXJlT3J0bz0xO3ZhciBiPUV4dC5nZXRDbXAoInNsaWRlcmNvbXBhcmVvcnRvb3J0 byIpO2Iuc2V0VmFsdWUoMCxmYWxzZSk7QXBwLmxheW91dC5seXJUcmFucz1tYXAu Z2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5zX29ydG9faGlzdCIpWzBdO0Fw cC5sYXlvdXQubHlyVHJhbnMubWVyZ2VOZXdQYXJhbXMoe2xheWVyczoib3ZhYjVt LCJ9KTt2YXIgYT1FeHQuZ2V0Q21wKCJzbGlkZXJfY29tcGFyYWNpb19vcnRvIiku Z2V0VmFsdWUoKTtBcHAubGF5b3V0Lmx5clRyYW5zLnNldE9wYWNpdHkoYS8xMDAp O0FwcC5sYXlvdXQubHlyVHJhbnMuc2V0VmlzaWJpbGl0eSh0cnVlKX0saGlkZTpm dW5jdGlvbigpe21hcC5nZXRMYXllcnNCeU5hbWUoIm92ZXJsYXlfdHJhbnNfb3J0 byIpWzBdLnNldFZpc2liaWxpdHkoZmFsc2UpO21hcC5nZXRMYXllcnNCeU5hbWUo Im92ZXJsYXlfdHJhbnNfb3J0b19zaWdyaWQiKVswXS5zZXRWaXNpYmlsaXR5KGZh bHNlKTttYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5zX29ydG9faGlz dCIpWzBdLnNldFZpc2liaWxpdHkoZmFsc2UpfX19LHt0aXRsZTphbHRyZXMsaXRl bXM6W3BhbmVsQ2hrSW5mcmFyb2lnT3J0byxwYW5lbENoa05EVklvcnRvLHBhbmVs Q2hrR2VvbE9ydG8sY29tcGFyZVJhZGlvc0NvbnRhaW5lckdlb2xPcnRvXSxsaXN0 ZW5lcnM6e3Nob3c6ZnVuY3Rpb24oKXtBcHAubGF5b3V0LmluZGV4dGFic0NvbXBh cmVPcnRvPTJ9LGhpZGU6ZnVuY3Rpb24oKXtFeHQuZ2V0Q21wKCJjaGtJbmZyYXJv aWdPcnRvIikuc2V0VmFsdWUoZmFsc2UpO0V4dC5nZXRDbXAoImNoa05EVklvcnRv Iikuc2V0VmFsdWUoZmFsc2UpO0V4dC5nZXRDbXAoImNoa0dlb2xPcnRvIikuc2V0 VmFsdWUoZmFsc2UpfX19XX0pO3ZhciBjb21wYXJlT3J0b1BhbmVsPW5ldyBFeHQu UGFuZWwoe2lkOiJwbmxDb21wYXJlT3J0byIsYm9yZGVyOmZhbHNlLGNsczoibXkt aGVhZGVyMyIsdGl0bGU6Y29tcGFyZSxpY29uQ2xzOiJteS1pY29uLWNvbXBhcmUi LGNvbGxhcHNpYmxlOnRydWUsY29sbGFwc2VkOnRydWUsYm9keVN0eWxlOiJwYWRk aW5nLWxlZnQ6MHB4O21hcmdpbjoycHg7IixpdGVtczpbdGFic0NvbXBhcmVPcnRv XSxsaXN0ZW5lcnM6e2JlZm9yZWV4cGFuZDpmdW5jdGlvbigpe21hcC5nZXRMYXll cnNCeU5hbWUoIm92ZXJsYXlfdHJhbnNfdG9wbyIpWzBdLnNldFZpc2liaWxpdHko dHJ1ZSk7QXBwLmxheW91dC5seXJUcmFucz1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJv dmVybGF5X3RyYW5zX3RvcG8iKVswXTtBcHAubGF5b3V0Lmx5clRyYW5zMj1tYXAu Z2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5zX3RvcG8xbSIpWzBdO2lmKG1h cC5nZXRab29tKCk+PTEwKXtBcHAubGF5b3V0Lmx5clRyYW5zMi5zZXRWaXNpYmls aXR5KHRydWUpfWVsc2V7QXBwLmxheW91dC5seXJUcmFuczIuc2V0VmlzaWJpbGl0 eShmYWxzZSl9fSxleHBhbmQ6ZnVuY3Rpb24oKXtBcHAubGF5b3V0LmZvcmNlQ2hh bmdlU2xpZGVyT3BhY2l0eSgic2xpZGVyX2NvbXBhcmFjaW9fdG9wbyIpO0V4dC5n ZXRDbXAoInRhYnNDb21wYXJlT3J0byIpLnNldEFjdGl2ZVRhYigwKX0sY29sbGFw c2U6ZnVuY3Rpb24oKXttYXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5z X3RvcG8iKVswXS5zZXRWaXNpYmlsaXR5KGZhbHNlKTttYXAuZ2V0TGF5ZXJzQnlO YW1lKCJvdmVybGF5X3RyYW5zX3RvcG8xbSIpWzBdLnNldFZpc2liaWxpdHkoZmFs c2UpO21hcC5nZXRMYXllcnNCeU5hbWUoIm92ZXJsYXlfdHJhbnNfb3J0byIpWzBd LnNldFZpc2liaWxpdHkoZmFsc2UpO21hcC5nZXRMYXllcnNCeU5hbWUoIm92ZXJs YXlfdHJhbnNfb3J0b19zaWdyaWQiKVswXS5zZXRWaXNpYmlsaXR5KGZhbHNlKTtt YXAuZ2V0TGF5ZXJzQnlOYW1lKCJvdmVybGF5X3RyYW5zX29ydG9faGlzdCIpWzBd LnNldFZpc2liaWxpdHkoZmFsc2UpO0V4dC5nZXRDbXAoImNoa0luZnJhcm9pZ09y dG8iKS5zZXRWYWx1ZShmYWxzZSk7RXh0LmdldENtcCgiY2hrTkRWSW9ydG8iKS5z ZXRWYWx1ZShmYWxzZSk7RXh0LmdldENtcCgiY2hrR2VvbE9ydG8iKS5zZXRWYWx1 ZShmYWxzZSl9fX0pO3ZhciBpbWFnZUljb25DaGtJbmZyYXJvaWdBbHRyZXM9bmV3 IEV4dC5Cb3hDb21wb25lbnQoe2F1dG9FbDp7dGFnOiJpbWciLHNyYzoiaW1nL3Ry ZWVJY29ucy9pbmZyYXJlZC5wbmcifSxzdHlsZTp7bWFyZ2luUmlnaHQ6IjVweCJ9 fSk7dmFyIGNoZWNrQm94SW5mcmFyb2lnQWx0cmVzPW5ldyBFeHQuZm9ybS5DaGVj a2JveCh7aWQ6ImNoa0luZnJhcm9pZ0FsdHJlcyIsYm94TGFiZWw6dGV4dEluZnJh cm9pZyxjdENsczoiY2hlY2tCb3hIaXN0IixoYW5kbGVyOmZ1bmN0aW9uKCl7dmFy IGE9bWFwLmdldExheWVyc0J5TmFtZSgiaW5mcmFyb2lnIilbMF07YS5zZXRPcGFj aXR5KDEpO0FwcC5sYXlvdXQucmVzZXRDbGlwKDApO2lmKHRoaXMuY2hlY2tlZCl7 bWFwLnNldEJhc2VMYXllcihhKTtFeHQuZ2V0Q21wKCJjaGtORFZJYWx0cmVzIiku c2V0VmFsdWUoZmFsc2UpO0V4dC5nZXRDbXAoImNoa0dlb2xBbHRyZXMiKS5zZXRW YWx1ZShmYWxzZSk7QXBwLmxheW91dC5oYW5kbGVyT3J0b0luZnJhUm9pZygpO2Eu c2V0VmlzaWJpbGl0eSh0cnVlKX1lbHNle2Euc2V0VmlzaWJpbGl0eShmYWxzZSl9 fX0pO3ZhciBwYW5lbENoa0luZnJhcm9pZ0FsdHJlcz1uZXcgRXh0LlBhbmVsKHtw YWRkaW5nOiIycHgiLGJvcmRlcjpmYWxzZSxsYXlvdXQ6ImNvbHVtbiIsaXRlbXM6 W2ltYWdlSWNvbkNoa0luZnJhcm9pZ0FsdHJlcyxjaGVja0JveEluZnJhcm9pZ0Fs dHJlc119KTt2YXIgaW1hZ2VJY29uQ2hrTkRWSWFsdHJlcz1uZXcgRXh0LkJveENv bXBvbmVudCh7YXV0b0VsOnt0YWc6ImltZyIsc3JjOiJpbWcvdHJlZUljb25zL2lj b25OZHZpLnBuZyJ9LHN0eWxlOnttYXJnaW5SaWdodDoiNXB4In19KTt2YXIgY2hl Y2tCb3hORFZJYWx0cmVzPW5ldyBFeHQuZm9ybS5DaGVja2JveCh7aWQ6ImNoa05E VklhbHRyZXMiLGJveExhYmVsOnRleHRORFZJLGN0Q2xzOiJjaGVja0JveEhpc3Qi LGhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgYT1tYXAuZ2V0TGF5ZXJzQnlOYW1lKCJu ZHZpIilbMF07QXBwLmxheW91dC5yZXNldENsaXAoMCk7aWYodGhpcy5jaGVja2Vk KXtFeHQuZ2V0Q21wKCJjaGtJbmZyYXJvaWdBbHRyZXMiKS5zZXRWYWx1ZShmYWxz ZSk7RXh0LmdldENtcCgiY2hrR2VvbEFsdHJlcyIpLnNldFZhbHVlKGZhbHNlKTth LnNldE9wYWNpdHkoMSk7YS5zZXRWaXNpYmlsaXR5KHRydWUpO2RvY3VtZW50Lmdl dEVsZW1lbnRCeUlkKCJzY2VuZUluZm8iKS5pbm5lckhUTUw9Ik5EVkkgMjAxMSI7 RXh0LmdldENtcCgid2luTkRWSWNvbnRyb2xMZWdlbmQiKS5zaG93KCl9ZWxzZXth PW1hcC5nZXRMYXllcnNCeU5hbWUoIm5kdmkiKVswXTthLnNldFZpc2liaWxpdHko ZmFsc2UpO0V4dC5nZXRDbXAoIndpbk5EVkljb250cm9sTGVnZW5kIikuaGlkZSgp fX19KTt2YXIgcGFuZWxDaGtORFZJYWx0cmVzPW5ldyBFeHQuUGFuZWwoe3BhZGRp bmc6IjJweCIsYm9yZGVyOmZhbHNlLGxheW91dDoiY29sdW1uIixpdGVtczpbaW1h Z2VJY29uQ2hrTkRWSWFsdHJlcyxjaGVja0JveE5EVklhbHRyZXNdfSk7dmFyIGlt YWdlSWNvbkNoa0dlb2xBbHRyZXM9bmV3IEV4dC5Cb3hDb21wb25lbnQoe2F1dG9F bDp7dGFnOiJpbWciLHNyYzoiaW1nL3RyZWVJY29ucy9nZW9sb2dpYy5wbmcifSxz dHlsZTp7bWFyZ2luUmlnaHQ6IjVweCJ9fSk7dmFyIGNoZWNrQm94R2VvbEFsdHJl cz1uZXcgRXh0LmZvcm0uQ2hlY2tib3goe2lkOiJjaGtHZW9sQWx0cmVzIixib3hM YWJlbDpnZW9sVGV4dCxjdENsczoiY2hlY2tCb3hIaXN0IixoYW5kbGVyOmZ1bmN0 aW9uKCl7dmFyIGE9bWFwLmdldExheWVyc0J5TmFtZSgiZ2VvbCIpWzBdO2lmKHRo aXMuY2hlY2tlZCl7bWFwLnNldEJhc2VMYXllcihhKTtFeHQuZ2V0Q21wKCJjaGtJ bmZyYXJvaWdBbHRyZXMiKS5zZXRWYWx1ZShmYWxzZSk7RXh0LmdldENtcCgiY2hr TkRWSWFsdHJlcyIpLnNldFZhbHVlKGZhbHNlKTthLnNldFZpc2liaWxpdHkodHJ1 ZSl9ZWxzZXthLnNldFZpc2liaWxpdHkoZmFsc2UpfX19KTt2YXIgcGFuZWxDaGtH ZW9sQWx0cmVzPW5ldyBFeHQuUGFuZWwoe3BhZGRpbmc6IjJweCIsYm9yZGVyOmZh bHNlLGxheW91dDoiY29sdW1uIixpdGVtczpbaW1hZ2VJY29uQ2hrR2VvbEFsdHJl cyxjaGVja0JveEdlb2xBbHRyZXNdfSk7dmFyIGNvbnRhaW5lckFsdHJlc0x5cj17 aWQ6ImNvbnRhaW5lckFsdHJlc0x5ckRpdiIsYmFzZUNsczoieC1wbGFpbiIsaXRl bXM6W3BhbmVsQ2hrSW5mcmFyb2lnQWx0cmVzLHBhbmVsQ2hrTkRWSWFsdHJlcyxw YW5lbENoa0dlb2xBbHRyZXNdfTs= ------------ZDBq1DU4GzMIFwsUruRx8y Content-Disposition: inline; filename=vissir.css Content-Type: text/css; charset=utf-8; name=vissir.css Content-Location: http://www.icc.cat/vissir3/lib/vissir/vissir.css Content-Transfer-Encoding: 8bit body { font-family: Helvetica, Verdana, Arial; font-size: 12px; } #sceneInfo { position: absolute; top: 0px; right: 3px; } #idiomes { position: absolute; right: 10px; top: 10px; } #measureInfo { width: 70%; } #toponim form { margin: 2px; } #toponim form input { font-size: 12px; border: 1px solid gray; padding: 2px; width: 170px; margin-left:5px; } #vertex form input { font-size: 12px; border: 1px solid gray; padding: 2px; width: 170px; margin-left:5px; } #full form input { font-size: 12px; border: 1px solid gray; padding: 2px; width: 170px; margin-left:5px; } div.locs { overflow: auto; height: 220px; border-bottom: 1px solid gray; } div.locsV { overflow: auto; max-height: 160px; } div.loc { margin: 0px; } div.loc_sel { border: 1px solid black; margin: 0px; background-color: #e5fecc; cursor: pointer; } ul.loc_detall { display: none; } div.loc_sel ul.loc_detall { display: block; margin: 0; font-size: 10px; padding-left: 15px; list-style-type: none; } div.olControlOverviewMapExtentRectangle { cursor: move; border: 2px dotted red; /*background-color: #FF2B2B;*/ filter: alpha(opacity = 70); -moz-opacity: 0.7; -khtml-opacity: 0.7; opacity: 0.7; } #refsysteminfo{ font-size: 10px; margin-top: 5px; } /******************/ /* Mapa */ /******************/ div.olMapViewport { background-color: #000; } /******************/ /* Escala */ /******************/ .olControlScaleLine { background: white; padding: 5px; filter: alpha(opacity = 70); -moz-opacity: 0.7; -khtml-opacity: 0.7; opacity: 0.7; left: 0px; bottom: 0px; } /******************/ /* MousePosition */ /******************/ .olControlMousePosition { background: white; padding: 5px; filter: alpha(opacity = 80); -moz-opacity: 0.8; -khtml-opacity: 0.8; opacity: 0.8; font-size: 12px; font-weight: bold; width: 380px; } .VissirMousePosition { bottom: 0em; right: 0px; display: block; position: absolute; background: white; padding: 5px; filter: alpha(opacity = 80); -moz-opacity: 0.8; -khtml-opacity: 0.8; opacity: 0.8; font-size: 11px; font-weight: bold; } .olControlOverviewMapElement { background-color: gray; } .tooltip { vertical-align:bottom; } .tooltip_desc{ font-size: 10px; } .checkBoxHist{ font-size: 10px; } .radioGroupComp{ border:0px; } .series_table{ font-size: 11px; } #coords_table{ font-size: 11px; border-collapse:collapse; } #coords_table td, #coords_table th{ border:1px solid #C0C0C0; padding:4px; } #etrs89wgs84info,#ohinfo{ font-size: 10px; } .highlight{ font-weight:bold; } .padding5{ padding:4px; } .imgStatusBar{ height: 14px; width: 14px; } #divTextCarrer{ display:none; } #divTextED50{ display:none; } #divTextETRS89{ display:none; } #divTextWGS84{ display:none; } #divTextPK{ display:none; } #divTextFull{ display:none; } #divTextSenyals{ display:none; } #divTextSigpac{ display:none; } /************************/ /* Mascara de carregant */ /************************/ #loading-mask { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: #fff; z-index: 1; } #loading { position: absolute; top: 40%; left: 33%; z-index: 2; } #loading SPAN { /*background: url('./img/loader.gif') no-repeat left center;*/ font-family: Verdana, Arial; font-size: 11px; font-weight: bold; padding: 5px 150px; display: block; } .loadingLogo { /*border: 1px solid #999;*/ margin-bottom: 10px; } .posTextImg { vertical-align:middle; } .posTextImgSmall{ font-family: Verdana, Arial; font-size: 10px; } .posPDFImg { border:0px; } .centerTextGeolLegend { font-size: 10px; margin-left: 20%; } .centerIMG { display: block; margin-left: auto; margin-right: auto; } .lyrLink{ text-decoration:none; color: #000; } ------------ZDBq1DU4GzMIFwsUruRx8y--