I21zZnNoZWxsY29kZeS4iue6v+a1geeoi+WIhuaekAoxLueUn+aIkOacqOmprApgYGBiYXNoCm1zZnZlbm9tIC1wIGphdmEvbWV0ZXJwcmV0ZXIvcmV2ZXJzZV90Y3AgTEhPU1Q9MTAuMC4zLjQgTFBPUlQ9NDQ0NCAmZ3Q7IDEuamFyCmBgYAoKIVtdKGh0dHBzOi8vbmMwLmNkbi56a2FxLmNuL21kLzEyODk4L2RlZmE2MzRjODZmZDlkZmI4MGU1NWE0NGIwNTVjODViXzQ3NTE4LnBuZykKMi7mi5bliLDmnKzmnLrvvIzlj43nvJbor5HkuIDkuIsKCiFbXShodHRwczovL25jMC5jZG4uemthcS5jbi9tZC8xMjg5OC8zMGY2MzNkMDQ1MTQ5MjcyY2Q2NWJmYmQxMjk1MWY0OV8zNDA4NS5wbmcpCmBjbWQg77yaamF2YSAtamFyIGpkLWd1aS0xLjYuNi5qYXJgCgohW10oaHR0cHM6Ly9uYzAuY2RuLnprYXEuY24vbWQvMTI4OTgvM2E5NWNjM2M3ZjA5OWEzYzFlZjkzYjQwMjQyZTcwNWZfNDY2NTYucG5nKQrlj6/ku6XnnIvliLDmnInkuInkuKrmlofku7YKIyNNQU5JRkVTVC5NRgpgYGBqYXZhCk1hbmlmZXN0LVZlcnNpb246IDEuMApNYWluLUNsYXNzOiBtZXRhc3Bsb2l0LlBheWxvYWQgLy/lrprkuYnkuoZqYXLljIXku47ov5nkuKrlnLDmlrnlvIDlp4vliqDovb0KUGVybWlzc2lvbnM6IGFsbC1wZXJtaXNzaW9ucwoKTmFtZTogbWV0YXNwbG9pdC5kYXQKCk5hbWU6IG1ldGFzcGxvaXQvUGF5bG9hZC5jbGFzcwpgYGAKIyNtZXRhc3Bsb2l0LmRhdApgYGBqYXZhClNwYXduPTIKTEhPU1Q9MTAuMC4zLjQgIOWbnui/nmlw5Zyw5Z2ACkxQT1JUPTQ0NDQgICAgICDlm57ov57nq6/lj6MKCmBgYAojI3BheWxvYWQuY2xhc3MKYGBgamF2YQpwYWNrYWdlIG1ldGFzcGxvaXQ7CgppbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwppbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwppbXBvcnQgamF2YS5uZXQuU29ja2V0OwppbXBvcnQgamF2YS5uZXQuVVJMOwppbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKaW1wb3J0IGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKaW1wb3J0IGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZTsKaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbnM7CmltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW47CmltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CmltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwppbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CmltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CmltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwoKcHVibGljIGNsYXNzIFBheWxvYWQgZXh0ZW5kcyBDbGFzc0xvYWRlciB7CgkvL+iOt+WPluW9k+WJjeeahOaTjeS9nOezu+e7nyAgd2luZG93czEwCiAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX05BTUUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CiAgIC8v6I635Y+W6Lev5b6E55qE5YiG5Ymy56ymICDvvJsKICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9TRVAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIik7CiAgIC8v5Yik5pat5piv5ZCm5pivQUlY77yI5piv5ZCm5Z+65LqOdW5peO+8iSAgZmFsc2UKICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0FJWCA9ICJhaXgiLmVxdWFscyhPU19OQU1FKTsKICAvL+WIpOaWrei3r+W+hOeahOWIhuWJsuespuaYr+WQpuaYryDvvJsgIHRydWUKICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0RPUyA9IFBBVEhfU0VQLmVxdWFscygiOyIpOwogIC8vIOiOt+WPlmphdmHnmoTlronoo4Xot6/lvoQgQzpcUHJvZ3JhbSBGaWxlc1xKYXZhXGpyZTEuOC4wXzIxMQogIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0hPTUUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpOwogIAogIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIHBhcmFtQXJyYXlPZlN0cmluZykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAvL+ivu+WGmemFjee9ruaWh+S7tgogICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKICAgIC8v6YCa6L+H5Y+N5bCE6I635Y+WcGF5bG9hZOexuyAgIGNsYXp6OidjbGFzcyBtZXRhc3Bsb2l0LnBheWxvYWQnIOeci+aIquWbvuWPr+S7peeci+WIsHBheWxvYWTnsbvlnKhtZXRhc3Bsb2l05LiL6Z2iCiAgICBDbGFzcyBjbGF6eiA9IFBheWxvYWQuY2xhc3M7CiAgICAvL+WumuS5ieS4gOS4qnN0cjHvvIzlgLzkuLrkuIrpnaLnmoQgbWV0YXNwbG9pdC5wYXlsb2Fk77yM54S25ZCO5oqKLuWPmOaIkC/vvIzmiormlofku7blkI7nvIDmlLnkuLouY2xhc3PjgIIgc3RyMe+8midtZXRhc3Bsb2l0XHBheWxvYWQuY2xhc3MnLOWunumZheaYr+iOt+WPluaWh+S7tueahOi3r+W+hAogICAgU3RyaW5nIHN0cjEgPSBjbGF6ei5nZXROYW1lKCkucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsKICAgIC8v5Yib5bu6aW/liqDovb3phY3nva7mlofku7Zwcm9wZXJ0aWVz77yM5Lmf5bCx5piv5oqKbWV0YXNwbG9pdC5kYXTph4zpnaLnmoTlhoXlrrnor7vliLBpbnB1dHN0cmVhbemHjOmdouOAggogICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvbWV0YXNwbG9pdC5kYXQiKTsKICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7ICAvL2RhdOaWh+S7tuWtmOWcqO+8jOS4jeetieS6juepugogICAgICBwcm9wZXJ0aWVzLmxvYWQoaW5wdXRTdHJlYW0pOyAvL+aKimlucHV0c3RyZWFt5rWB6YeM6Z2i55qE5YaF5a656K+75YiwcHJvcGVydGllc+i/meS4quWvueixoemHjOmdogogICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOyAvL+WFs+mXrWlv5rWBCiAgICB9IAogICAg5LiK6Z2i5bCx5YGa5LqG5LiA5Lu25LqL77yM5oqKZGF05paH5Lu255qE5YaF5a656YCa6L+HaW/mtYHljrvor7vliLBwcm9wZXJ0aWVz6YeM6Z2i44CCCgogICAgLy/lrprkuYnkuIDkuKpzdHIy77yM5oqKZGF05paH5Lu26YeMRXhlY3V0YWJsZeWtl+autei1i+WAvOe7meWug+OAguS9huaYr+eci2RhdOaWh+S7tumHjOeahOWGheWuueWPkeeOsOayoeaciei/meS4quWtl+aute+8jOaJgOS7pXN0cjIgPSBudWxsCiAgICBTdHJpbmcgc3RyMiA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIkV4ZWN1dGFibGUiKTsKICAgIGlmIChzdHIyICE9IG51bGwpIHsgICAgIC8v5Yik5patc3RyMuS4jeS4uuepuiAgIGZhbHNlCiAgICAgLy/liJvlu7rkuIDkuKrliY3nvIDkuLp+c3Bhd27vvIzlkI7nvIDkuLoudG1w55qE5paH5Lu2ZmlsZTHvvIggRmlsZS5jcmVhdGVUZW1wRmlsZeaYr2pka+iHquW4pkFQSe+8jOS9nOeUqOaYr+iOt+WPluezu+e7n+eahHRtcOebruW9le+8iQogICAgICBGaWxlIGZpbGUxID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgifnNwYXduIiwgIi50bXAiKTsKICAgICAgZmlsZTEuZGVsZXRlKCk7ICAvL+WIoOmZpGZpbGUx77yf77yf77yfCiAgICAgIEZpbGUgZmlsZTIgPSBuZXcgRmlsZShmaWxlMS5nZXRBYnNvbHV0ZVBhdGgoKSArICIuZGlyIik7ICAgLy/liJvlu7rkuIDkuKpmaWxlMu+8jOiOt+WPlmZpbGUx55qE57ud5a+56Lev5b6E5Yqg5LiK5ZCO57yALmRpcu+8jGZpbGUyOn5zcGF3blhYWFgudG1wLmRpcgogICAgICBmaWxlMi5ta2RpcigpOy8v5Yib5bu6ZmlsZTIKICAgICAgRmlsZSBmaWxlMyA9IG5ldyBGaWxlKGZpbGUyLCBzdHIyKTsgIC8v5LiL6Z2i5LiN5oOz5YiG5p6Q5LqG77yM5Y+N5q2j6L+Z5LiqaWbkuZ/otbDkuI3ov5vmnaXjgILjgILjgIIKICAgICAgd3JpdGVFbWJlZGRlZEZpbGUoY2xhenosIHN0cjIsIGZpbGUzKTsKICAgICAgcHJvcGVydGllcy5yZW1vdmUoIkV4ZWN1dGFibGUiKTsvL+WIoOmZpEV4ZWN1dGFibGXlrZfmrrUKICAgICAgcHJvcGVydGllcy5wdXQoIkRyb3BwZWRFeGVjdXRhYmxlIiwgZmlsZTMuZ2V0Q2Fub25pY2FsUGF0aCgpKTsvL+WKoOS4gOS4quaWsOeahEV4ZWN1dGFibGXov5vmnaXvvIzov5Tlm55maWxlM+eahOe7neWvuei3r+W+hAogICAgfSAKICAgIC8vIOiOt+WPlumFjee9ruaWh+S7tuS4rXNwYXdu55qE5YC877yM546w5Zyoc3Bhd249Mu+8jOayoeacieiOt+WPluWIsOeahOaXtuWAmeaYrzDvvIxpbnQgaSA9IDIKICAgIGludCBpID0gSW50ZWdlci5wYXJzZUludChwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJTcGF3biIsICIwIikpOwogICAgLy9zdHIy5LiN5Li656m66LWw5LqGaWbmiY3mnIlzdHIz77yM5omA5Lul546w5Zyoc3RyM+S4uuepugogICAgU3RyaW5nIHN0cjMgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJEcm9wcGVkRXhlY3V0YWJsZSIpOwogICAgaWYgKGkgJmd0OyAwKSB7ICAvLyDlpoLmnpxp5LiN5Li6MO+8jGk9MiZndDswCiAgICAgLy/miorphY3nva7mlofku7bkuK1zcGF3bueahOWAvOWHj+S4gOWGjeaUvuWbnuWOu++8jHNwYXduPTEKICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgiU3Bhd24iLCBTdHJpbmcudmFsdWVPZihpIC0gMSkpOwogICAgIC8v5YaNdG1w55uu5b2V5LiL5Yib5bu6ZmlsZTHvvIx+c3Bhd25YWFgudG1wCiAgICAgIEZpbGUgZmlsZTEgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ+c3Bhd24iLCAiLnRtcCIpOwogICAgICBmaWxlMS5kZWxldGUoKTsgLy/liKDpmaRmaWxlMQogICAgIC8v6I635Y+WZmlsZTHkuZ/lsLHmmK90ZW1w55uu5b2V55qE57ud5a+56Lev5b6E77yM5Yib5bu6ZmlsZTLvvJpjOlx0ZW1wXH5zcGF3blhYWFgudG1wLmRpcgogICAgICBGaWxlIGZpbGUyID0gbmV3IEZpbGUoZmlsZTEuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLmRpciIpOwogICAgIC8v5b6AZmlsZTLph4zliJvlu7rkuIDkuKpmaWxlM++8jGZpbGUzPWM6XHRlbXBcfnNwYXduWFhYWC50bXAuZGlyXG1ldGFzcGxvaXQuZGF0CiAgICAgIEZpbGUgZmlsZTMgPSBuZXcgRmlsZShmaWxlMiwgIm1ldGFzcGxvaXQuZGF0Iik7CiAgICAgLy/lvoBmaWxlMumHjOmdouWIm+W7uuS4gOS4qmZpbGU077yM5Y+W5YmN6Z2i5a6a5LmJ55qEc3RyMeeahOWAvO+8jGZpbGU0PWM6XHRlbXBcfnNwYXduWFhYWC50bXAuZGlyXG1ldGFzcGxvaXRccGF5bG9hZC5jbGFzcwogICAgICBGaWxlIGZpbGU0ID0gbmV3IEZpbGUoZmlsZTIsIHN0cjEpOwogICAgICAKICAgICAgZmlsZTQuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOy8v5Yib5bu65paH5Lu25aS5CiAgICAgIHdyaXRlRW1iZWRkZWRGaWxlKGNsYXp6LCBzdHIxLCBmaWxlNCk7Ly/lhpnmlofku7bov5vljrsKICAgICAgLy/oh7PmraTkuIrpnaLnmoTpg6jliIblsLHmmK/lnKjkuLTml7bmlofku7bnm67lvZXliJvlu7rkuobkuIDkuKrkuIDmqKHkuIDmoLfnmoTmlofku7blpLnvvIzmiopwYXlsb2TlkoxkYXTlpI3liLbkuobov4fljrvvvIznhLblkI5kYXTmlofku7bkuK1zcGF3bueahOWAvOeUsTLlj5jmiJDkuoYx44CCCiAgICAgIGlmIChwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJVUkwiLCAiIikuc3RhcnRzV2l0aCgiaHR0cHM6IikpLy/phY3nva7mlofku7ZkYXTkuK3msqHmnIlVUkzvvIzkuI3ov5vov5nkuKppZgogICAgICAgIHdyaXRlRW1iZWRkZWRGaWxlKGNsYXp6LCAibWV0YXNwbG9pdC9QYXlsb2FkVHJ1c3RNYW5hZ2VyLmNsYXNzIiwgbmV3IEZpbGUoZmlsZTQuZ2V0UGFyZW50RmlsZSgpLCAiUGF5bG9hZFRydXN0TWFuYWdlci5jbGFzcyIpKTsgCiAgICAgIGlmIChwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJBRVNQYXNzd29yZCIsIChTdHJpbmcpbnVsbCkgIT0gbnVsbCkvL+mFjee9ruaWh+S7tuS4reS5n+ayoeaciWFlc3Bhc3N3b3Jk77yM5LiN6L+b6L+Z5LiqaWYKICAgICAgICB3cml0ZUVtYmVkZGVkRmlsZShjbGF6eiwgIm1ldGFzcGxvaXQvQUVTRW5jcnlwdGlvbi5jbGFzcyIsIG5ldyBGaWxlKGZpbGU0LmdldFBhcmVudEZpbGUoKSwgIkFFU0VuY3J5cHRpb24uY2xhc3MiKSk7IAogICAgICBGaWxlT3V0cHV0U3RyZWFtIGZpbGVPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlMyk7CiAgICAgIHByb3BlcnRpZXMuc3RvcmUoZmlsZU91dHB1dFN0cmVhbSwgIiIpOwogICAgICBmaWxlT3V0cHV0U3RyZWFtLmNsb3NlKCk7CiAgICAgLy/osIPnlKhydW50aW1l5o6l5Y+j5omn6KGM57O757uf5ZG95Luk77yM5a6a5LmJ5LiA5Liq5paw55qE5pWw57uEW2phdmEgLWNsYXNzcGF0aCBmaWxlMueahOe7neWvuei3r+W+hO+8iGM6XHRlbXBcfnNwYXduWFhYWC50bXAuZGly77yJIGNsYXp655qE5ZCN5a2X77yIbWV0YXNwbG9pdFxwYXlsb2FkLmNsYXNz77yJXe+8jAogICAgIC8v5Lmf5bCx5piv6K6p57O757uf5Y675omn6KGM5LqGImphdmEgLWNsYXNzcGF0aCBjOlx0ZW1wXH5zcGF3blhYWFgudG1wLmRpclxtZXRhc3Bsb2l0XHBheWxvYWQuY2xhc3MiIOi/meagt+S4gOS4quWRveS7pO+8jOWOu+i/kOihjHBheWxvYWQuY2xhc3PjgIIKICAgICAgUHJvY2VzcyBwcm9jZXNzID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhuZXcgU3RyaW5nW10geyBnZXRKcmVFeGVjdXRhYmxlKCJqYXZhIiksICItY2xhc3NwYXRoIiwgZmlsZTIuZ2V0QWJzb2x1dGVQYXRoKCksIGNsYXp6LmdldE5hbWUoKSB9KTsKICAgICAgcHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpLmNsb3NlKCk7CiAgICAgIHByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKS5jbG9zZSgpOwogICAgICAvL+iHs+atpOi/m+eoi+e7k+adn++8jOacqOmprOaWh+S7tuiHquadgO+8jOS9huaYr+WcqOatu+WJjeWPiOi/kOihjOS6huaLt+i0neWIsOS4tOaXtuaWh+S7tuS4i+eahOS4gOaooeS4gOagt+eahOiHquW3sSzllK/kuIDlj5jljJbmmK/phY3nva7mlofku7ZkYXTkuK3nmoRzcGF3buWPmOaIkOS6hjHjgIIKYGBgCuesrOS6jOasoei/kOihjOWIhuaekApgYGBqYXZhCnBhY2thZ2UgbWV0YXNwbG9pdDsKCmltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CmltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CmltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CmltcG9ydCBqYXZhLm5ldC5VUkw7CmltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwppbXBvcnQgamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOwppbXBvcnQgamF2YS5zZWN1cml0eS5Db2RlU291cmNlOwppbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uczsKaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbjsKaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CmltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKaW1wb3J0IGphdmEudXRpbC5TdGFjazsKaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CgpwdWJsaWMgY2xhc3MgUGF5bG9hZCBleHRlbmRzIENsYXNzTG9hZGVyIHsKCS8v6I635Y+W5b2T5YmN55qE5pON5L2c57O757ufICB3aW5kb3dzMTAKICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NfTkFNRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKICAgLy/ojrflj5bot6/lvoTnmoTliIblibLnrKYgIO+8mwogIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1NFUCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicGF0aC5zZXBhcmF0b3IiKTsKICAgLy/liKTmlq3mmK/lkKbmmK9BSVjvvIjmmK/lkKbln7rkuo51bml477yJICBmYWxzZQogIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfQUlYID0gImFpeCIuZXF1YWxzKE9TX05BTUUpOwogIC8v5Yik5pat6Lev5b6E55qE5YiG5Ymy56ym5piv5ZCm5pivIO+8myAgdHJ1ZQogIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfRE9TID0gUEFUSF9TRVAuZXF1YWxzKCI7Iik7CiAgLy8g6I635Y+WamF2YeeahOWuieijhei3r+W+hCBDOlxQcm9ncmFtIEZpbGVzXEphdmFcanJlMS44LjBfMjExCiAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfSE9NRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7CiAgCiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gcGFyYW1BcnJheU9mU3RyaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgIC8v6K+75YaZ6YWN572u5paH5Lu2CiAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwogICAgLy/pgJrov4flj43lsITojrflj5ZwYXlsb2Fk57G7ICAgY2xheno6J2NsYXNzIG1ldGFzcGxvaXQucGF5bG9hZCcg55yL5oiq5Zu+5Y+v5Lul55yL5YiwcGF5bG9hZOexu+WcqG1ldGFzcGxvaXTkuIvpnaIKICAgIENsYXNzIGNsYXp6ID0gUGF5bG9hZC5jbGFzczsKICAgIC8v5a6a5LmJ5LiA5Liqc3RyMe+8jOWAvOS4uuS4iumdoueahCBtZXRhc3Bsb2l0LnBheWxvYWTvvIznhLblkI7mioou5Y+Y5oiQL++8jOaKiuaWh+S7tuWQjue8gOaUueS4ui5jbGFzc+OAgiBzdHIx77yaJ21ldGFzcGxvaXRccGF5bG9hZC5jbGFzcycs5a6e6ZmF5piv6I635Y+W5paH5Lu255qE6Lev5b6ECiAgICBTdHJpbmcgc3RyMSA9IGNsYXp6LmdldE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOwogICAgLy/liJvlu7ppb+WKoOi9vemFjee9ruaWh+S7tnByb3BlcnRpZXPvvIzkuZ/lsLHmmK/mioptZXRhc3Bsb2l0LmRhdOmHjOmdoueahOWGheWuueivu+WIsGlucHV0c3RyZWFt6YeM6Z2i44CCCiAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0oIi9tZXRhc3Bsb2l0LmRhdCIpOwogICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsgIC8vZGF05paH5Lu25a2Y5Zyo77yM5LiN562J5LqO56m6CiAgICAgIHByb3BlcnRpZXMubG9hZChpbnB1dFN0cmVhbSk7IC8v5oqKaW5wdXRzdHJlYW3mtYHph4zpnaLnmoTlhoXlrrnor7vliLBwcm9wZXJ0aWVz6L+Z5Liq5a+56LGh6YeM6Z2iCiAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7IC8v5YWz6ZetaW/mtYEKICAgIH0gCiAgICDkuIrpnaLlsLHlgZrkuobkuIDku7bkuovvvIzmiopkYXTmlofku7bnmoTlhoXlrrnpgJrov4dpb+a1geWOu+ivu+WIsHByb3BlcnRpZXPph4zpnaLjgIIKCiAgICAvL+WumuS5ieS4gOS4qnN0cjLvvIzmiopkYXTmlofku7bph4xFeGVjdXRhYmxl5a2X5q616LWL5YC857uZ5a6D44CC5L2G5piv55yLZGF05paH5Lu26YeM55qE5YaF5a655Y+R546w5rKh5pyJ6L+Z5Liq5a2X5q6177yM5omA5Lulc3RyMiA9IG51bGwKICAgIFN0cmluZyBzdHIyID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgiRXhlY3V0YWJsZSIpOwogICAgaWYgKHN0cjIgIT0gbnVsbCkgeyAgICAgLy/liKTmlq1zdHIy5LiN5Li656m6ICAgZmFsc2UKICAgICAvL+WIm+W7uuS4gOS4quWJjee8gOS4un5zcGF3bu+8jOWQjue8gOS4ui50bXDnmoTmlofku7ZmaWxlMe+8iCBGaWxlLmNyZWF0ZVRlbXBGaWxl5pivamRr6Ieq5bimQVBJ77yM5L2c55So5piv6I635Y+W57O757uf55qEdG1w55uu5b2V77yJCiAgICAgIEZpbGUgZmlsZTEgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ+c3Bhd24iLCAiLnRtcCIpOwogICAgICBmaWxlMS5kZWxldGUoKTsgIC8v5Yig6ZmkZmlsZTHvvJ/vvJ/vvJ8KICAgICAgRmlsZSBmaWxlMiA9IG5ldyBGaWxlKGZpbGUxLmdldEFic29sdXRlUGF0aCgpICsgIi5kaXIiKTsgICAvL+WIm+W7uuS4gOS4qmZpbGUy77yM6I635Y+WZmlsZTHnmoTnu53lr7not6/lvoTliqDkuIrlkI7nvIAuZGly77yMZmlsZTI6fnNwYXduWFhYWC50bXAuZGlyCiAgICAgIGZpbGUyLm1rZGlyKCk7Ly/liJvlu7pmaWxlMgogICAgICBGaWxlIGZpbGUzID0gbmV3IEZpbGUoZmlsZTIsIHN0cjIpOyAgLy/kuIvpnaLkuI3mg7PliIbmnpDkuobvvIzlj43mraPov5nkuKppZuS5n+i1sOS4jei/m+adpeOAguOAguOAggogICAgICB3cml0ZUVtYmVkZGVkRmlsZShjbGF6eiwgc3RyMiwgZmlsZTMpOwogICAgICBwcm9wZXJ0aWVzLnJlbW92ZSgiRXhlY3V0YWJsZSIpOy8v5Yig6ZmkRXhlY3V0YWJsZeWtl+autQogICAgICBwcm9wZXJ0aWVzLnB1dCgiRHJvcHBlZEV4ZWN1dGFibGUiLCBmaWxlMy5nZXRDYW5vbmljYWxQYXRoKCkpOy8v5Yqg5LiA5Liq5paw55qERXhlY3V0YWJsZei/m+adpe+8jOi/lOWbnmZpbGUz55qE57ud5a+56Lev5b6ECiAgICB9IAogICAgLy8g6I635Y+W6YWN572u5paH5Lu25Litc3Bhd27nmoTlgLzvvIznjrDlnKhzcGF3bj0x77yM5rKh5pyJ6I635Y+W5Yiw55qE5pe25YCZ5pivMO+8jGludCBpID0gMQogICAgaW50IGkgPSBJbnRlZ2VyLnBhcnNlSW50KHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIlNwYXduIiwgIjAiKSk7CiAgICAvL3N0cjLkuI3kuLrnqbrotbDkuoZpZuaJjeaciXN0cjPvvIzmiYDku6XnjrDlnKhzdHIz5Li656m6CiAgICBTdHJpbmcgc3RyMyA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIkRyb3BwZWRFeGVjdXRhYmxlIik7CiAgICBpZiAoaSAmZ3Q7IDApIHsgIC8vIOWmguaenGnkuI3kuLow77yMaT0xJmd0OzAKICAgICAvL+aKiumFjee9ruaWh+S7tuS4rXNwYXdu55qE5YC85YeP5LiA5YaN5pS+5Zue5Y6777yMc3Bhd249MAogICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJTcGF3biIsIFN0cmluZy52YWx1ZU9mKGkgLSAxKSk7CiAgICAgLy/lho10bXDnm67lvZXkuIvliJvlu7pmaWxlMe+8jH5zcGF3blhYWC50bXAKICAgICAgRmlsZSBmaWxlMSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIn5zcGF3biIsICIudG1wIik7CiAgICAgIGZpbGUxLmRlbGV0ZSgpOyAvL+WIoOmZpGZpbGUxCiAgICAgLy/ojrflj5ZmaWxlMeS5n+WwseaYr3RlbXDnm67lvZXnmoTnu53lr7not6/lvoTvvIzliJvlu7pmaWxlMu+8mmM6XHRlbXBcfnNwYXduWFhYWC50bXAuZGlyCiAgICAgIEZpbGUgZmlsZTIgPSBuZXcgRmlsZShmaWxlMS5nZXRBYnNvbHV0ZVBhdGgoKSArICIuZGlyIik7CiAgICAgLy/lvoBmaWxlMumHjOWIm+W7uuS4gOS4qmZpbGUz77yMZmlsZTM9YzpcdGVtcFx+c3Bhd25YWFhYLnRtcC5kaXJcbWV0YXNwbG9pdC5kYXQKICAgICAgRmlsZSBmaWxlMyA9IG5ldyBGaWxlKGZpbGUyLCAibWV0YXNwbG9pdC5kYXQiKTsKICAgICAvL+W+gGZpbGUy6YeM6Z2i5Yib5bu65LiA5LiqZmlsZTTvvIzlj5bliY3pnaLlrprkuYnnmoRzdHIx55qE5YC877yMZmlsZTQ9YzpcdGVtcFx+c3Bhd25YWFhYLnRtcC5kaXJcbWV0YXNwbG9pdFxwYXlsb2FkLmNsYXNzCiAgICAgIEZpbGUgZmlsZTQgPSBuZXcgRmlsZShmaWxlMiwgc3RyMSk7CiAgICAgIAogICAgICBmaWxlNC5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ly/liJvlu7rmlofku7blpLkKICAgICAgd3JpdGVFbWJlZGRlZEZpbGUoY2xhenosIHN0cjEsIGZpbGU0KTsvL+WGmeaWh+S7tui/m+WOuwogICAgICAvL+iHs+atpOS4iumdoueahOmDqOWIhuWwseaYr+WcqOS4tOaXtuaWh+S7tuebruW9leWIm+W7uuS6huS4gOS4quS4gOaooeS4gOagt+eahOaWh+S7tuWkue+8jOaKinBheWxvZOWSjGRhdOWkjeWItuS6hui/h+WOu++8jOeEtuWQjmRhdOaWh+S7tuS4rXNwYXdu55qE5YC855SxMuWPmOaIkOS6hjHjgIIKICAgICAgaWYgKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIlVSTCIsICIiKS5zdGFydHNXaXRoKCJodHRwczoiKSkvL+mFjee9ruaWh+S7tmRhdOS4reayoeaciVVSTO+8jOS4jei/m+i/meS4qmlmCiAgICAgICAgd3JpdGVFbWJlZGRlZEZpbGUoY2xhenosICJtZXRhc3Bsb2l0L1BheWxvYWRUcnVzdE1hbmFnZXIuY2xhc3MiLCBuZXcgRmlsZShmaWxlNC5nZXRQYXJlbnRGaWxlKCksICJQYXlsb2FkVHJ1c3RNYW5hZ2VyLmNsYXNzIikpOyAKICAgICAgaWYgKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIkFFU1Bhc3N3b3JkIiwgKFN0cmluZyludWxsKSAhPSBudWxsKS8v6YWN572u5paH5Lu25Lit5Lmf5rKh5pyJYWVzcGFzc3dvcmTvvIzkuI3ov5vov5nkuKppZgogICAgICAgIHdyaXRlRW1iZWRkZWRGaWxlKGNsYXp6LCAibWV0YXNwbG9pdC9BRVNFbmNyeXB0aW9uLmNsYXNzIiwgbmV3IEZpbGUoZmlsZTQuZ2V0UGFyZW50RmlsZSgpLCAiQUVTRW5jcnlwdGlvbi5jbGFzcyIpKTsgCiAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZmlsZU91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUzKTsKICAgICAgcHJvcGVydGllcy5zdG9yZShmaWxlT3V0cHV0U3RyZWFtLCAiIik7CiAgICAgIGZpbGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKICAgICAvL+iwg+eUqHJ1bnRpbWXmjqXlj6PmiafooYzns7vnu5/lkb3ku6TvvIzlrprkuYnkuIDkuKrmlrDnmoTmlbDnu4RbamF2YSAtY2xhc3NwYXRoIGZpbGUy55qE57ud5a+56Lev5b6E77yIYzpcdGVtcFx+c3Bhd25YWFhYLnRtcC5kaXLvvIkgY2xhenrnmoTlkI3lrZfvvIhtZXRhc3Bsb2l0XHBheWxvYWQuY2xhc3PvvIld77yMCiAgICAgLy/kuZ/lsLHmmK/orqnns7vnu5/ljrvmiafooYzkuoYiamF2YSAtY2xhc3NwYXRoIGM6XHRlbXBcfnNwYXduWFhYWC50bXAuZGlyXG1ldGFzcGxvaXRccGF5bG9hZC5jbGFzcyIg6L+Z5qC35LiA5Liq5ZG95Luk77yM5Y676L+Q6KGMcGF5bG9hZC5jbGFzc+OAggogICAgICBQcm9jZXNzIHByb2Nlc3MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKG5ldyBTdHJpbmdbXSB7IGdldEpyZUV4ZWN1dGFibGUoImphdmEiKSwgIi1jbGFzc3BhdGgiLCBmaWxlMi5nZXRBYnNvbHV0ZVBhdGgoKSwgY2xhenouZ2V0TmFtZSgpIH0pOwogICAgICBwcm9jZXNzLmdldElucHV0U3RyZWFtKCkuY2xvc2UoKTsKICAgICAgcHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpLmNsb3NlKCk7CiAgICAgIAogICAgICBUaHJlYWQuc2xlZXAoMjAwMEwpOwogICAgICBGaWxlW10gYXJyYXlPZkZpbGUgPSB7IGZpbGU0LCBmaWxlNC5nZXRQYXJlbnRGaWxlKCksIGZpbGUzLCBmaWxlMiB9OwogICAgICBmb3IgKGJ5dGUgYiA9IDA7IGIgIGNsYXp6ID0gUGF5bG9hZC5jbGFzczsKICAgIC8v5a6a5LmJ5LiA5Liqc3RyMe+8jOWAvOS4uuS4iumdoueahCBtZXRhc3Bsb2l0LnBheWxvYWTvvIznhLblkI7mioou5Y+Y5oiQL++8jOaKiuaWh+S7tuWQjue8gOaUueS4ui5jbGFzc+OAgiBzdHIx77yaJ21ldGFzcGxvaXRccGF5bG9hZC5jbGFzcycs5a6e6ZmF5piv6I635Y+W5paH5Lu255qE6Lev5b6ECiAgICBTdHJpbmcgc3RyMSA9IGNsYXp6LmdldE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOwogICAgLy/liJvlu7ppb+WKoOi9vemFjee9ruaWh+S7tnByb3BlcnRpZXPvvIzkuZ/lsLHmmK/mioptZXRhc3Bsb2l0LmRhdOmHjOmdoueahOWGheWuueivu+WIsGlucHV0c3RyZWFt6YeM6Z2i44CCCiAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0oIi9tZXRhc3Bsb2l0LmRhdCIpOwogICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsgIC8vZGF05paH5Lu25a2Y5Zyo77yM5LiN562J5LqO56m6CiAgICAgIHByb3BlcnRpZXMubG9hZChpbnB1dFN0cmVhbSk7IC8v5oqKaW5wdXRzdHJlYW3mtYHph4zpnaLnmoTlhoXlrrnor7vliLBwcm9wZXJ0aWVz6L+Z5Liq5a+56LGh6YeM6Z2iCiAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7IC8v5YWz6ZetaW/mtYEKICAgIH0gCiAgICDkuIrpnaLlsLHlgZrkuobkuIDku7bkuovvvIzmiopkYXTmlofku7bnmoTlhoXlrrnpgJrov4dpb+a1geWOu+ivu+WIsHByb3BlcnRpZXPph4zpnaLjgIIKCiAgICAvL+WumuS5ieS4gOS4qnN0cjLvvIzmiopkYXTmlofku7bph4xFeGVjdXRhYmxl5a2X5q616LWL5YC857uZ5a6D44CC5L2G5piv55yLZGF05paH5Lu26YeM55qE5YaF5a655Y+R546w5rKh5pyJ6L+Z5Liq5a2X5q6177yM5omA5Lulc3RyMiA9IG51bGwKICAgIFN0cmluZyBzdHIyID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgiRXhlY3V0YWJsZSIpOwogICAgaWYgKHN0cjIgIT0gbnVsbCkgeyAgICAgLy/liKTmlq1zdHIy5LiN5Li656m6ICAgZmFsc2UKICAgICAvL+WIm+W7uuS4gOS4quWJjee8gOS4un5zcGF3bu+8jOWQjue8gOS4ui50bXDnmoTmlofku7ZmaWxlMe+8iCBGaWxlLmNyZWF0ZVRlbXBGaWxl5pivamRr6Ieq5bimQVBJ77yM5L2c55So5piv6I635Y+W57O757uf55qEdG1w55uu5b2V77yJCiAgICAgIEZpbGUgZmlsZTEgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ+c3Bhd24iLCAiLnRtcCIpOwogICAgICBmaWxlMS5kZWxldGUoKTsgIC8v5Yig6ZmkZmlsZTHvvJ/vvJ/vvJ8KICAgICAgRmlsZSBmaWxlMiA9IG5ldyBGaWxlKGZpbGUxLmdldEFic29sdXRlUGF0aCgpICsgIi5kaXIiKTsgICAvL+WIm+W7uuS4gOS4qmZpbGUy77yM6I635Y+WZmlsZTHnmoTnu53lr7not6/lvoTliqDkuIrlkI7nvIAuZGly77yMZmlsZTI6fnNwYXduWFhYWC50bXAuZGlyCiAgICAgIGZpbGUyLm1rZGlyKCk7Ly/liJvlu7pmaWxlMgogICAgICBGaWxlIGZpbGUzID0gbmV3IEZpbGUoZmlsZTIsIHN0cjIpOyAgLy/kuIvpnaLkuI3mg7PliIbmnpDkuobvvIzlj43mraPov5nkuKppZuS5n+i1sOS4jei/m+adpeOAguOAguOAggogICAgICB3cml0ZUVtYmVkZGVkRmlsZShjbGF6eiwgc3RyMiwgZmlsZTMpOwogICAgICBwcm9wZXJ0aWVzLnJlbW92ZSgiRXhlY3V0YWJsZSIpOy8v5Yig6ZmkRXhlY3V0YWJsZeWtl+autQogICAgICBwcm9wZXJ0aWVzLnB1dCgiRHJvcHBlZEV4ZWN1dGFibGUiLCBmaWxlMy5nZXRDYW5vbmljYWxQYXRoKCkpOy8v5Yqg5LiA5Liq5paw55qERXhlY3V0YWJsZei/m+adpe+8jOi/lOWbnmZpbGUz55qE57ud5a+56Lev5b6ECiAgICB9IAogICAgLy8g6I635Y+W6YWN572u5paH5Lu25Litc3Bhd27nmoTlgLzvvIznjrDlnKhzcGF3bj0w77yM5rKh5pyJ6I635Y+W5Yiw55qE5pe25YCZ5pivMO+8jGludCBpID0gMAogICAgaW50IGkgPSBJbnRlZ2VyLnBhcnNlSW50KHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIlNwYXduIiwgIjAiKSk7CiAgICAvL3N0cjLkuI3kuLrnqbrotbDkuoZpZuaJjeaciXN0cjPvvIzmiYDku6XnjrDlnKhzdHIz5Li656m6CiAgICBTdHJpbmcgc3RyMyA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIkRyb3BwZWRFeGVjdXRhYmxlIik7CiAgICBpZiAoaSAmZ3Q7IDApIHsgIC8vIOWmguaenGnkuI3kuLow77yMaT0wIO+8gSZndDsgMAogICAgIC8v5LiN6L+b5YWlaWbkuoYKICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgiU3Bhd24iLCBTdHJpbmcudmFsdWVPZihpIC0gMSkpOwogICAgICBGaWxlIGZpbGUxID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgifnNwYXduIiwgIi50bXAiKTsKICAgICAgZmlsZTEuZGVsZXRlKCk7IAogICAgICBGaWxlIGZpbGUyID0gbmV3IEZpbGUoZmlsZTEuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLmRpciIpOwogICAgICBGaWxlIGZpbGUzID0gbmV3IEZpbGUoZmlsZTIsICJtZXRhc3Bsb2l0LmRhdCIpOwogICAgICBGaWxlIGZpbGU0ID0gbmV3IEZpbGUoZmlsZTIsIHN0cjEpOwogICAgICBmaWxlNC5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7CiAgICAgIHdyaXRlRW1iZWRkZWRGaWxlKGNsYXp6LCBzdHIxLCBmaWxlNCk7CiAgICAgIGlmIChwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJVUkwiLCAiIikuc3RhcnRzV2l0aCgiaHR0cHM6IikpCiAgICAgICAgd3JpdGVFbWJlZGRlZEZpbGUoY2xhenosICJtZXRhc3Bsb2l0L1BheWxvYWRUcnVzdE1hbmFnZXIuY2xhc3MiLCBuZXcgRmlsZShmaWxlNC5nZXRQYXJlbnRGaWxlKCksICJQYXlsb2FkVHJ1c3RNYW5hZ2VyLmNsYXNzIikpOyAKICAgICAgaWYgKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIkFFU1Bhc3N3b3JkIiwgKFN0cmluZyludWxsKSAhPSBudWxsKQogICAgICAgIHdyaXRlRW1iZWRkZWRGaWxlKGNsYXp6LCAibWV0YXNwbG9pdC9BRVNFbmNyeXB0aW9uLmNsYXNzIiwgbmV3IEZpbGUoZmlsZTQuZ2V0UGFyZW50RmlsZSgpLCAiQUVTRW5jcnlwdGlvbi5jbGFzcyIpKTsgCiAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZmlsZU91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUzKTsKICAgICAgcHJvcGVydGllcy5zdG9yZShmaWxlT3V0cHV0U3RyZWFtLCAiIik7CiAgICAgIGZpbGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKICAgICAgUHJvY2VzcyBwcm9jZXNzID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhuZXcgU3RyaW5nW10geyBnZXRKcmVFeGVjdXRhYmxlKCJqYXZhIiksICItY2xhc3NwYXRoIiwgZmlsZTIuZ2V0QWJzb2x1dGVQYXRoKCksIGNsYXp6LmdldE5hbWUoKSB9KTsKICAgICAgcHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpLmNsb3NlKCk7CiAgICAgIHByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKS5jbG9zZSgpOwogICAgICBUaHJlYWQuc2xlZXAoMjAwMEwpOwogICAgICBGaWxlW10gYXJyYXlPZkZpbGUgPSB7IGZpbGU0LCBmaWxlNC5nZXRQYXJlbnRGaWxlKCksIGZpbGUzLCBmaWxlMiB9OwogICAgICBmb3IgKGJ5dGUgYiA9IDA7IGIgIGVudW1lcmF0aW9uID0gcGFyYW1Qcm9wZXJ0aWVzLnByb3BlcnR5TmFtZXMoKTsKICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewogICAgICBPYmplY3Qgb2JqZWN0ID0gZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewogICAgICAgIFN0cmluZyBzdHIgPSAoU3RyaW5nKW9iamVjdDsKICAgICAgICBpZiAoc3RyLnN0YXJ0c1dpdGgoIkhlYWRlciIpKQogICAgICAgICAgcGFyYW1VUkxDb25uZWN0aW9uLmFkZFJlcXVlc3RQcm9wZXJ0eShzdHIuc3Vic3RyaW5nKDYpLCBwYXJhbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoc3RyKSk7IAogICAgICB9IAogICAgfSAKICB9CiAgCiAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUVtYmVkZGVkRmlsZShDbGFzcyBwYXJhbUNsYXNzLCBTdHJpbmcgcGFyYW1TdHJpbmcsIEZpbGUgcGFyYW1GaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHBhcmFtQ2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiLyIgKyBwYXJhbVN0cmluZyk7CiAgICBGaWxlT3V0cHV0U3RyZWFtIGZpbGVPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYXJhbUZpbGUpOwogICAgYnl0ZVtdIGFycmF5T2ZCeXRlID0gbmV3IGJ5dGVbNDA5Nl07CiAgICBpbnQgaTsKICAgIHdoaWxlICgoaSA9IGlucHV0U3RyZWFtLnJlYWQoYXJyYXlPZkJ5dGUpKSAhPSAtMSkKICAgICAgZmlsZU91dHB1dFN0cmVhbS53cml0ZShhcnJheU9mQnl0ZSwgMCwgaSk7IAogICAgZmlsZU91dHB1dFN0cmVhbS5jbG9zZSgpOwogIH0KICAKICBwcml2YXRlIGZpbmFsIHZvaWQgYm9vdHN0cmFwKElucHV0U3RyZWFtIHBhcmFtSW5wdXRTdHJlYW0sIE91dHB1dFN0cmVhbSBwYXJhbU91dHB1dFN0cmVhbSwgU3RyaW5nIHBhcmFtU3RyaW5nLCBTdHJpbmdbXSBwYXJhbUFycmF5T2ZTdHJpbmcpIHRocm93cyBFeGNlcHRpb24gewogICAgdHJ5IHsKICAgICAgQ2xhc3MgY2xheno7CiAgICAgIERhdGFJbnB1dFN0cmVhbSBkYXRhSW5wdXRTdHJlYW0gPSBuZXcgRGF0YUlucHV0U3RyZWFtKHBhcmFtSW5wdXRTdHJlYW0pOwogICAgICBQZXJtaXNzaW9ucyBwZXJtaXNzaW9ucyA9IG5ldyBQZXJtaXNzaW9ucygpOwogICAgICBwZXJtaXNzaW9ucy5hZGQobmV3IEFsbFBlcm1pc3Npb24oKSk7CiAgICAgIFByb3RlY3Rpb25Eb21haW4gcHJvdGVjdGlvbkRvbWFpbiA9IG5ldyBQcm90ZWN0aW9uRG9tYWluKG5ldyBDb2RlU291cmNlKG5ldyBVUkwoImZpbGU6Ly8vIiksIG5ldyBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbMF0pLCBwZXJtaXNzaW9ucyk7CiAgICAgIGlmIChwYXJhbVN0cmluZyA9PSBudWxsKSB7CiAgICAgICAgaW50IGkgPSBkYXRhSW5wdXRTdHJlYW0ucmVhZEludCgpOwogICAgICAgIGRvIHsKICAgICAgICAgIGJ5dGVbXSBhcnJheU9mQnl0ZSA9IG5ldyBieXRlW2ldOwogICAgICAgICAgZGF0YUlucHV0U3RyZWFtLnJlYWRGdWxseShhcnJheU9mQnl0ZSk7CiAgICAgICAgICByZXNvbHZlQ2xhc3MoY2xhenogPSBkZWZpbmVDbGFzcyhudWxsLCBhcnJheU9mQnl0ZSwgMCwgaSwgcHJvdGVjdGlvbkRvbWFpbikpOwogICAgICAgICAgaSA9IGRhdGFJbnB1dFN0cmVhbS5yZWFkSW50KCk7CiAgICAgICAgfSB3aGlsZSAoaSAmZ3Q7IDApOwogICAgICB9IGVsc2UgewogICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSgiamF2YXBheWxvYWQuc3RhZ2UuIiArIHBhcmFtU3RyaW5nKTsKICAgICAgfSAKICAgICAgT2JqZWN0IG9iamVjdCA9IGNsYXp6Lm5ld0luc3RhbmNlKCk7CiAgICAgIGNsYXp6LmdldE1ldGhvZCgic3RhcnQiLCBuZXcgQ2xhc3NbXSB7IERhdGFJbnB1dFN0cmVhbS5jbGFzcywgT3V0cHV0U3RyZWFtLmNsYXNzLCBTdHJpbmdbXS5jbGFzcyB9KS5pbnZva2Uob2JqZWN0LCBuZXcgT2JqZWN0W10geyBkYXRhSW5wdXRTdHJlYW0sIHBhcmFtT3V0cHV0U3RyZWFtLCBwYXJhbUFycmF5T2ZTdHJpbmcgfSk7CiAgICB9IGNhdGNoIChUaHJvd2FibGUgdGhyb3dhYmxlKSB7CiAgICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50U3RyZWFtKHBhcmFtT3V0cHV0U3RyZWFtKSk7CiAgICB9IAogIH0KICAKICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SnJlRXhlY3V0YWJsZShTdHJpbmcgcGFyYW1TdHJpbmcpIHsKICAgIEZpbGUgZmlsZSA9IG51bGw7CiAgICBpZiAoSVNfQUlYKQogICAgICBmaWxlID0gZmluZEluRGlyKEpBVkFfSE9NRSArICIvc2giLCBwYXJhbVN0cmluZyk7IAogICAgaWYgKGZpbGUgPT0gbnVsbCkKICAgICAgZmlsZSA9IGZpbmRJbkRpcihKQVZBX0hPTUUgKyAiL2JpbiIsIHBhcmFtU3RyaW5nKTsgCiAgICByZXR1cm4gKGZpbGUgIT0gbnVsbCkgPyBmaWxlLmdldEFic29sdXRlUGF0aCgpIDogYWRkRXh0ZW5zaW9uKHBhcmFtU3RyaW5nKTsKICB9CiAgCiAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFkZEV4dGVuc2lvbihTdHJpbmcgcGFyYW1TdHJpbmcpIHsKICAgIHJldHVybiBwYXJhbVN0cmluZyArIChJU19ET1MgPyAiLmV4ZSIgOiAiIik7CiAgfQogIAogIHByaXZhdGUgc3RhdGljIEZpbGUgZmluZEluRGlyKFN0cmluZyBwYXJhbVN0cmluZzEsIFN0cmluZyBwYXJhbVN0cmluZzIpIHsKICAgIEZpbGUgZmlsZTEgPSBub3JtYWxpemUocGFyYW1TdHJpbmcxKTsKICAgIEZpbGUgZmlsZTIgPSBudWxsOwogICAgaWYgKGZpbGUxLmV4aXN0cygpKSB7CiAgICAgIGZpbGUyID0gbmV3IEZpbGUoZmlsZTEsIGFkZEV4dGVuc2lvbihwYXJhbVN0cmluZzIpKTsKICAgICAgaWYgKCFmaWxlMi5leGlzdHMoKSkKICAgICAgICBmaWxlMiA9IG51bGw7IAogICAgfSAKICAgIHJldHVybiBmaWxlMjsKICB9CiAgCiAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBub3JtYWxpemUoU3RyaW5nIHBhcmFtU3RyaW5nKSB7CiAgICBTdGFjayBzdGFjayA9IG5ldyBTdGFjaygpOwogICAgU3RyaW5nW10gYXJyYXlPZlN0cmluZyA9IGRpc3NlY3QocGFyYW1TdHJpbmcpOwogICAgc3RhY2sucHVzaChhcnJheU9mU3RyaW5nWzBdKTsKICAgIFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGFycmF5T2ZTdHJpbmdbMV0sIEZpbGUuc2VwYXJhdG9yKTsKICAgIHdoaWxlIChzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CiAgICAgIFN0cmluZyBzdHIgPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCk7CiAgICAgIGlmICgiLiIuZXF1YWxzKHN0cikpCiAgICAgICAgY29udGludWU7IAogICAgICBpZiAoIi4uIi5lcXVhbHMoc3RyKSkgewogICAgICAgIGlmIChzdGFjay5zaXplKCkgIDEpCiAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoRmlsZS5zZXBhcmF0b3JDaGFyKTsgCiAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKHN0YWNrLmVsZW1lbnRBdChiKSk7CiAgICB9IAogICAgcmV0dXJuIG5ldyBGaWxlKHN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKSk7CiAgfQogIAogIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGRpc3NlY3QoU3RyaW5nIHBhcmFtU3RyaW5nKSB7CiAgICBjaGFyIGMgPSBGaWxlLnNlcGFyYXRvckNoYXI7CiAgICBwYXJhbVN0cmluZyA9IHBhcmFtU3RyaW5nLnJlcGxhY2UoJy8nLCBjKS5yZXBsYWNlKCdcXCcsIGMpOwogICAgU3RyaW5nIHN0ciA9IG51bGw7CiAgICBpbnQgaSA9IHBhcmFtU3RyaW5nLmluZGV4T2YoJzonKTsKICAgIGlmIChpICZndDsgMCAmYW1wOyZhbXA7IElTX0RPUykgewogICAgICBpbnQgaiA9IGkgKyAxOwogICAgICBzdHIgPSBwYXJhbVN0cmluZy5zdWJzdHJpbmcoMCwgaik7CiAgICAgIGNoYXJbXSBhcnJheU9mQ2hhciA9IHBhcmFtU3RyaW5nLnRvQ2hhckFycmF5KCk7CiAgICAgIHN0ciA9IHN0ciArIGM7CiAgICAgIGogPSAoYXJyYXlPZkNoYXJbal0gPT0gYykgPyAoaiArIDEpIDogajsKICAgICAgU3RyaW5nQnVpbGRlciBzdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgZm9yIChpbnQgayA9IGo7IGsgIDEgJmFtcDsmYW1wOyBwYXJhbVN0cmluZy5jaGFyQXQoMSkgPT0gYykgewogICAgICBpbnQgaiA9IHBhcmFtU3RyaW5nLmluZGV4T2YoYywgMik7CiAgICAgIGogPSBwYXJhbVN0cmluZy5pbmRleE9mKGMsIGogKyAxKTsKICAgICAgc3RyID0gKGogJmd0OyAyKSA/IHBhcmFtU3RyaW5nLnN1YnN0cmluZygwLCBqICsgMSkgOiBwYXJhbVN0cmluZzsKICAgICAgcGFyYW1TdHJpbmcgPSBwYXJhbVN0cmluZy5zdWJzdHJpbmcoc3RyLmxlbmd0aCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0ciA9IEZpbGUuc2VwYXJhdG9yOwogICAgICBwYXJhbVN0cmluZyA9IHBhcmFtU3RyaW5nLnN1YnN0cmluZygxKTsKICAgIH0gCiAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgc3RyLCBwYXJhbVN0cmluZyB9OwogIH0KfQoKCi8qIExvY2F0aW9uOiAgICAgICAgICAgICAgRjpc5YWN5p2AXGphdmHlj43nvJbor5FcMS5qYXIhXG1ldGFzcGxvaXRcUGF5bG9hZC5jbGFzcwogKiBKYXZhIGNvbXBpbGVyIHZlcnNpb246IDUgKDQ5LjApCiAqIEpELUNvcmUgVmVyc2lvbjogICAgICAgMS4xLjMKICovCmBgYArliLDmraTliIbmnpDku6PnoIHliIbmnpDnu5PmnZ/vvIzpgqPkuYjov5vooYzkuInmrKHlhoXlrZjlvqrnjq/nmoTmhI/kuYnlnKjlk6rlkaLvvJ8K6Lqy6YG/5p2A6L2v77ya5aaC5p6c5LiA5LiK5p2l5bCx5bu656uLc29ja2V06L+e5o6l77yM5aSn6ams5ouJ5Zue5p2l5LiK57q/6IKv5a6a6KaB6KKr5p2A44CCCuWGheWtmOW+queOr+S4ieasoeeahOaEj+S5ieaYr+S4uuS6hui6sumBv+adgOi9r+WGheWtmOeahOi/vei4quOAggrlsI/pqazmi4nlpKfpqazvvJoKMS7lsL3ph4/lh4/lsJHnibnlvoEKMi7mlofku7blsI/vvIjlpoLmnpzmiorlpKfpqaznmoTmoLjlv4PpgLvovpHlhpnliLDlsI/pqazph4zpnaLvvIzmlofku7blsLHkvJrlvojlpKfvvIzkvYbmmK/pgJrov4flsI/pqazlu7rnq4tzb2NrZXTov57mjqXlho3ku47mnI3liqHlmajkuIrmiorlpKfpqazmi4nlm57mnaXkvZPnp6/lsLHkvJrlvojlsI/vvIkKCuWPjee8luivkeWlveeahOWOi+e8qeWMheaUvumZhOS7tuS6hu+8jOebtOaOpWV2ZXJ5ZWRpdOaJk+W8gOWwseihjOOAgg==
| 用户名 | 金币 | 积分 | 时间 | 理由 |
| Track-劲夫 |
100.00 |
0 |
2022-06-06 19:07:11 |
一个受益终生的帖子~~ |