BAhJIgLbHjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSIvamF2YXNjcmlwdC9aZXJvQ2xpcGJvYXJkLTEuMS43Lm1pbi5qcyI+PC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICAgICAKICAgICAgWmVyb0NsaXBib2FyZC5zZXREZWZhdWx0cyggeyBtb3ZpZVBhdGg6ICcvamF2YXNjcmlwdC9aZXJvQ2xpcGJvYXJkLTEuMS43LnN3ZicgfSApOwogICAgICB2YXIgY2xpcCA9IG5ldyBaZXJvQ2xpcGJvYXJkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjbWRMaW5lQ29weSIpKTsKICAgICAgY2xpcC5vbiggJ25vZmxhc2gnLCBmdW5jdGlvbiAoIGNsaWVudCwgYXJncyApIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY21kTGluZUNvcHkiKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICB9KTsKICAgICAgY2xpcC5vbiggJ3dyb25nZmxhc2gnLCBmdW5jdGlvbiAoIGNsaWVudCwgYXJncyApIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY21kTGluZUNvcHkiKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICB9KTsKICAgICAgJChkb2N1bWVudCkucmVzaXplKGZ1bmN0aW9uKCkgewogICAgICAgIGNsaXAucmVwb3NpdGlvbigpOwogICAgICB9KTsKICAgIH0pOwoKICAgIGZ1bmN0aW9uIGNoYW5nZUl0KCkKICAgIHsKCQl2YXIgZ3JvdXBJZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncm91cElkIikudmFsdWU7CgkJdmFyIGFydGlmYWN0SWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYXJ0aWZhY3RJZCIpLnZhbHVlOwoJCXZhciB2ZXJzaW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZlcnNpb24iKS52YWx1ZTsKCQl2YXIgYXBwc2VydmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFwcHNlcnZlciIpLnZhbHVlOwoJCXZhciBjbWQ7CgkJCQkKCQlpZih2ZXJzaW9uLm1hdGNoKC9eMVwuWzM0XS8pKQoJCQljbWQgPSAnbXZuIGFyY2hldHlwZTpjcmVhdGUgLURhcmNoZXR5cGVHcm91cElkPW9yZy5hcGFjaGUud2lja2V0IC1EYXJjaGV0eXBlQXJ0aWZhY3RJZD13aWNrZXQtYXJjaGV0eXBlLXF1aWNrc3RhcnQgLURhcmNoZXR5cGVWZXJzaW9uPScgKyB2ZXJzaW9uICsgJyAtRGdyb3VwSWQ9JyArIGdyb3VwSWQgKyAnIC1EYXJ0aWZhY3RJZD0nICsgYXJ0aWZhY3RJZDsJCQkJCQkKCQllbHNlIGlmKHZlcnNpb24ubWF0Y2goLy4qU05BUFNIT1QvKSkKCQkJY21kID0gJ212biBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tYXJjaGV0eXBlLXBsdWdpbjoyLjQ6Z2VuZXJhdGUgLURhcmNoZXR5cGVHcm91cElkPW9yZy5hcGFjaGUud2lja2V0IC1EYXJjaGV0eXBlQXJ0aWZhY3RJZD13aWNrZXQtYXJjaGV0eXBlLXF1aWNrc3RhcnQgLURhcmNoZXR5cGVWZXJzaW9uPScgKyB2ZXJzaW9uICsgJyAtRGdyb3VwSWQ9JyArIGdyb3VwSWQgKyAnIC1EYXJ0aWZhY3RJZD0nICsgYXJ0aWZhY3RJZDsJCQoJCWVsc2UKCQkJY21kID0gJ212biBhcmNoZXR5cGU6Z2VuZXJhdGUgLURhcmNoZXR5cGVHcm91cElkPW9yZy5hcGFjaGUud2lja2V0IC1EYXJjaGV0eXBlQXJ0aWZhY3RJZD13aWNrZXQtYXJjaGV0eXBlLXF1aWNrc3RhcnQgLURhcmNoZXR5cGVWZXJzaW9uPScgKyB2ZXJzaW9uICsgJyAtRGdyb3VwSWQ9JyArIGdyb3VwSWQgKyAnIC1EYXJ0aWZhY3RJZD0nICsgYXJ0aWZhY3RJZDsJCQkKCgkJaWYgKHZlcnNpb24ubWF0Y2goLy4qU05BUFNIT1QvKSkKCQkJY21kICs9ICcgLURhcmNoZXR5cGVSZXBvc2l0b3J5PWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL2NvbnRlbnQvcmVwb3NpdG9yaWVzL3NuYXBzaG90cy8nOwoJCWVsc2UKCQkJY21kICs9ICcgLURhcmNoZXR5cGVSZXBvc2l0b3J5PWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnLyc7CgoJCWlmIChhcHBzZXJ2ZXIgPT09ICd3aWxkZmx5JykKCQkJY21kICs9ICcgLURsb2c0ai5wcm9wZXJ0aWVzPXdpbGRmbHktZG9lc250LW5lZWQtbG9nNGoucHJvcGVydGllcyc7CgoJCWNtZCArPSAnIC1EaW50ZXJhY3RpdmVNb2RlPWZhbHNlJzsgCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNtZExpbmUiKS52YWx1ZSA9IGNtZDsKICAgIH0KICA8L3NjcmlwdD4KCjxoMiBpZD0iYmVmb3JlLXlvdS1zdGFydCI+QmVmb3JlIHlvdSBzdGFydDwvaDI+Cgo8cD5UaGUgUXVpY2sgU3RhcnQgV2l6YXJkIHVzZXMgPGEgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmciPkFwYWNoZSBNYXZlbjwvYT4gdG8KbWFrZSBpdCByZWFsbHkgZmFzdCB0byBnZXQgc3RhcnRlZC4gWW91IHNob3VsZCBoYXZlIE1hdmVuIGluc3RhbGxlZCBhbmQKd29ya2luZyBiZWZvcmUgeW91IGNhbiB1c2UgdGhlIFF1aWNrIFN0YXJ0IHdpemFyZC48L3A+Cgo8aDIgaWQ9IjUtc21hbGwtc3RlcHMtdG8tYS13ZWItYXBwbGljYXRpb24iPjUgc21hbGwgc3RlcHMgdG8gYSB3ZWIgYXBwbGljYXRpb248L2gyPgoKPHA+VXNlIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gcXVpY2tseSBnZW5lcmF0ZSBhIHByb2plY3QgdG8gZ2V0IHlvdQpzdGFydGVkOjwvcD4KCjxvbD4KICA8bGk+RmlsbCBpbiB0aGUgTWF2ZW4gY29vcmRpbmF0ZXMgZm9yIHlvdXIgcHJvamVjdCBpbiB0aGUgd2l6YXJkIGFuZCAKc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBXaWNrZXQgdmVyc2lvbjwvbGk+CiAgPGxpPkNvcHkgdGhlIGdlbmVyYXRlZCBjb21tYW5kbGluZSB0byB5b3VyIGNsaXBib2FyZCBhbmQgcGFzdGUgaXQgaW4gYSAKdGVybWluYWwgKG9yIGEgRE9TIGJveCk8L2xpPgogIDxsaT5PcGVuIHRoZSBwcm9qZWN0IGluIHlvdXIgSURFIG9mIGNob2ljZTwvbGk+CiAgPGxpPlN0YXJ0IHRoZSA8Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtcGxhaW50ZXh0IGhpZ2hsaWdodGVyLXJvdWdlIj5TdGFydDwvY29kZT4gY2xhc3MgaW4gdGhlIDxlbT5zcmMvdGVzdC9qYXZhPC9lbT4gZm9sZGVyPC9saT4KICA8bGk+T3BlbiB5b3VyIGJyb3dzZXIgdG8gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCI+aHR0cDovL2xvY2FsaG9zdDo4MDgwPC9hPjwvbGk+Cjwvb2w+Cgo8cD5BbmQgeW914oCZcmUgZG9uZSE8L3A+Cgo8aDIgaWQ9InF1aWNrLXN0YXJ0LXdpemFyZCI+UXVpY2sgU3RhcnQgV2l6YXJkPC9oMj4KCjxwPkZpbGwgaW4geW91ciBwcm9qZWN0IGRldGFpbHMgaW4gdGhlIHdpemFyZCBiZWxvdyBhbmQgY29weSB0aGUgZ2VuZXJhdGVkCmNvbW1hbmQgbGluZSB0byB5b3VyIGNsaXBib2FyZC48L3A+Cgo8ZGl2IGNsYXNzPSJsLWJ1dHRvbi10YWJsZSI+CiAgPGRpdiBjbGFzcz0ibC10d28tdGhpcmQiPgogICAgPGRpdiBjbGFzcz0icXVpY2tzdGFydC13aXphcmQiPgogICAgICA8ZGl2PgogICAgICAgIDxsYWJlbCB0aXRsZT0iQmFzZSBQYWNrYWdlIiBmb3I9Imdyb3VwSWQiPkdyb3VwIElEPC9sYWJlbD4KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgdmFsdWU9ImNvbS5teWNvbXBhbnkiIG9ua2V5dXA9ImNoYW5nZUl0KCk7IiBpZD0iZ3JvdXBJZCIgLz4KICAgICAgPC9kaXY+CiAgICAgIDxkaXY+CiAgICAgICAgPGxhYmVsIHRpdGxlPSJQcm9qZWN0IE5hbWUiIGZvcj0iYXJ0aWZhY3RJZCI+QXJ0aWZhY3QgSUQ8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiB2YWx1ZT0ibXlwcm9qZWN0IiBvbmtleXVwPSJjaGFuZ2VJdCgpOyIgaWQ9ImFydGlmYWN0SWQiIC8+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2PgogICAgICAgIDxsYWJlbCB0aXRsZT0iV2lja2V0IFZlcnNpb24iIGZvcj0idmVyc2lvbiI+V2lja2V0IFZlcnNpb248L2xhYmVsPgogICAgICAgIDxzZWxlY3Qgb25jaGFuZ2U9ImNoYW5nZUl0KCk7IiBpZD0idmVyc2lvbiI+CiAgICAKICAgIAogICAgCTxvcHRpb24gdmFsdWU9IjkuMC4wLU02LVNOQVBTSE9UIj45LjAuMC1NNi1TTkFQU0hPVDwvb3B0aW9uPgogICAgCiAgICAKICAgIAogICAgCTxvcHRpb24gdmFsdWU9IjguOS4wLVNOQVBTSE9UIj44LjkuMC1TTkFQU0hPVDwvb3B0aW9uPgogICAgCiAgICAKICAgIAogICAgCTxvcHRpb24gdmFsdWU9IjcuMTcuMC1TTkFQU0hPVCI+Ny4xNy4wLVNOQVBTSE9UPC9vcHRpb24+CiAgICAKICAgIAogICAgCiAgICAJPG9wdGlvbiB2YWx1ZT0iNi4zMS4wLVNOQVBTSE9UIj42LjMxLjAtU05BUFNIT1Q8L29wdGlvbj4KICAgIAogICAgCiAgICAKICAgIAk8b3B0aW9uIHZhbHVlPSIxLjUtU05BUFNIT1QiPjEuNS1TTkFQU0hPVDwvb3B0aW9uPgogICAgCiAgICAKICAgIAogICAgCTxvcHRpb24gdmFsdWU9IjkuMC4wLU01Ij45LjAuMC1NNTwvb3B0aW9uPgogICAgCiAgICAKICAgIAogICAgCTxvcHRpb24gdmFsdWU9IjguOC4wIiBzZWxlY3RlZD0ic2VsZWN0ZWQiPjguOC4wPC9vcHRpb24+CiAgICAKICAgIAogICAgCiAgICAJPG9wdGlvbiB2YWx1ZT0iNy4xNi4wIj43LjE2LjA8L29wdGlvbj4KICAgIAogICAgCiAgICAKICAgIAk8b3B0aW9uIHZhbHVlPSIxLjQuMjMiPjEuNC4yMzwvb3B0aW9uPgogICAgCiAgICAKICAgIAogICAgCTxvcHRpb24gdmFsdWU9IjEuNS4xNiI+MS41LjE2PC9vcHRpb24+CiAgICAKICAgIAogICAgCiAgICAJPG9wdGlvbiB2YWx1ZT0iNi4zMC4wIj42LjMwLjA8L29wdGlvbj4KICAgIAogICAgCiAgICAgICAgPC9zZWxlY3Q+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2PgogICAgPGxhYmVsIGZvcj0iYXBwc2VydmVyIiB0aXRsZT0iU2VydmVyIHRvIGRlcGxveSBvbiI+U2VydmVyIHRvIGRlcGxveSBvbjwvbGFiZWw+CiAgICA8c2VsZWN0IGlkPSJhcHBzZXJ2ZXIiIG9uY2hhbmdlPSJjaGFuZ2VJdCgpOyI+CiAgICAJPG9wdGlvbiB2YWx1ZT0iYW55IiBzZWxlY3RlZD0ic2VsZWN0ZWQiPkFueSBidXQgV2lsZCBGbHk8L29wdGlvbj4KICAgIAk8b3B0aW9uIHZhbHVlPSJ3aWxkZmx5Ij5XaWxkIEZseSAoSkJvc3MgOC54KTwvb3B0aW9uPgogICAgPC9zZWxlY3Q+CiAgICA8L2Rpdj4KICAgICAgPGRpdj4KICAgICAgICA8bGFiZWwgaWQ9ImNtZExhYmVsIiBmb3I9ImNtZExpbmUiPmdlbmVyYXRlZCBjb21tYW5kIGxpbmU8L2xhYmVsPgogICAgICAgIDx0ZXh0YXJlYSBvbmZvY3VzPSJ0aGlzLnNlbGVjdCgpOyIgaWQ9ImNtZExpbmUiIHN0eWxlPSJyZXNpemU6IHZlcnRpY2FsOyI+PC90ZXh0YXJlYT4KICAgICAgICA8c2NyaXB0PmNoYW5nZUl0KCk7PC9zY3JpcHQ+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2PgogICAgICAgIDxidXR0b24gZGF0YS1jbGlwYm9hcmQtdGFyZ2V0PSJjbWRMaW5lIiBjbGFzcz0iY2xpcF9idXR0b24iIGlkPSJjbWRMaW5lQ29weSI+Y29weSB0byBjbGlwYm9hcmQ8L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC9kaXY+Cgo8cD5XaXRoIHRoZSBnZW5lcmF0ZWQgY29tbWFuZCBsaW5lIG9uIHlvdXIgY2xpcGJvYXJkIG9wZW4gdXAgYSB0ZXJtaW5hbAp3aW5kb3cgKG9yIERPUyBib3gpIGFuZCBuYXZpZ2F0ZSB0byB3aGVyZSB5b3Ugd2FudCB0aGUgcHJvamVjdCB0byBiZQpnZW5lcmF0ZWQgKGUuZy4gZm9yIEVjbGlwc2UgdXNlcnMgdGhpcyB3b3VsZCBiZSB5b3VyIHdvcmtzcGFjZSBmb2xkZXIpLgpQYXN0ZSB0aGUgY29tbWFuZCBsaW5lIGludG8geW91ciB0ZXJtaW5hbCB3aW5kb3cgYW5kIHByZXNzIMKrZW50ZXLCuyB0bwpleGVjdXRlIHRoZSBjb21tYW5kLjwvcD4KCjxoNCBpZD0icmVzdWx0LW9mLXRoZS1tYXZlbi1jb21tYW5kIj5SZXN1bHQgb2YgdGhlIE1hdmVuIGNvbW1hbmQ8L2g0PgoKPHA+RXhlY3V0aW5nIHRoZSBNYXZlbiBjb21tYW5kIGxpbmUgd2lsbCByZXN1bHQgdGhlIGZvbGxvd2luZyBkaXJlY3RvcnkKc3RydWN0dXJlOjwvcD4KCjxkaXYgY2xhc3M9Imxhbmd1YWdlLXBsYWludGV4dCBoaWdobGlnaHRlci1yb3VnZSI+PGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij48cHJlIGNsYXNzPSJoaWdobGlnaHQiPjxjb2RlPi5cbXlwcm9qZWN0CiAgICB8ICAgcG9tLnhtbAogICAgfAogICAgXC0tLXNyYwogICAgICAgICstLS1tYWluCiAgICAgICAgfCAgICstLS1qYXZhCiAgICAgICAgfCAgIHwgICBcLS0tY29tCiAgICAgICAgfCAgIHwgICAgICAgXC0tLW15Y29tcGFueQogICAgICAgIHwgICB8ICAgICAgICAgICAgICAgSG9tZVBhZ2UuaHRtbAogICAgICAgIHwgICB8ICAgICAgICAgICAgICAgSG9tZVBhZ2UuamF2YQogICAgICAgIHwgICB8ICAgICAgICAgICAgICAgV2lja2V0QXBwbGljYXRpb24uamF2YQogICAgICAgIHwgICB8CiAgICAgICAgfCAgICstLS1yZXNvdXJjZXMKICAgICAgICB8ICAgfCAgICAgICBsb2c0ai5wcm9wZXJ0aWVzCiAgICAgICAgfCAgIHwKICAgICAgICB8ICAgXC0tLXdlYmFwcAogICAgICAgIHwgICAgICAgXC0tLVdFQi1JTkYKICAgICAgICB8ICAgICAgICAgICAgICAgd2ViLnhtbAogICAgICAgIHwKICAgICAgICBcLS0tdGVzdAogICAgICAgICAgICBcLS0tamF2YQogICAgICAgICAgICAgICAgXC0tLWNvbQogICAgICAgICAgICAgICAgICAgIFwtLS1teWNvbXBhbnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0LmphdmEKPC9jb2RlPjwvcHJlPjwvZGl2PjwvZGl2PgoKPHA+SXQgbWlnaHQgYmUgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB5b3VyIHNldHRpbmdzIChhbmQgdmVyc2lvbiBvZgpXaWNrZXQpLCBidXQgdGhpcyBpcyBiYXNpY2FsbHkgdGhlIHN0YW5kYXJkIGxheW91dCBmb3Igd2ViIHByb2plY3RzLjwvcD4KCjxoMiBpZD0iaW1wb3J0LXRoZS1xdWljay1zdGFydC1pbi15b3VyLWlkZSI+SW1wb3J0IHRoZSBRdWljayBTdGFydCBpbiB5b3VyIElERTwvaDI+Cgo8cD5UaGUgV2lja2V0IFF1aWNrIFN0YXJ0IHVzZXMgQXBhY2hlIE1hdmVuIHRvIG1ha2UgaXQgcmVhbGx5IGZhc3QgdG8gZ2V0CnN0YXJ0ZWQuIFlvdSBzaG91bGQgaGF2ZSBNYXZlbiBpbnN0YWxsZWQgYW5kIHdvcmtpbmcgYmVmb3JlIHlvdSBjYW4gdXNlCnRoZSBRdWljayBTdGFydCB3aXphcmQuPC9wPgoKPGgzIGlkPSJlY2xpcHNlIj5FY2xpcHNlPC9oMz4KCjxwPkZvciBFY2xpcHNlIHlvdSBzaG91bGQgZ2VuZXJhdGUgdGhlIFF1aWNrIFN0YXJ0IHByb2plY3Qgd2l0aGluIHlvdXIKd29ya3NwYWNlIGZvbGRlci4gWW91IGFsc28gbmVlZCB0byBlbnN1cmUgdGhhdCB5b3UgaGF2ZSBtMmVjbGlwc2UKaW5zdGFsbGVkIGluIG9yZGVyIHRvIGltcG9ydCB0aGUgcHJvamVjdC4gVG8gaW1wb3J0IHRoZSBwcm9qZWN0IHlvdQpzZWxlY3Qg4oCcSW1wb3J0IGV4aXN0aW5nIHByb2plY3TigJ0gZnJvbSB0aGUgRmlsZSBtZW51LCBhbmQgc2VsZWN0IHRoZQpmb2xkZXIgb2YgeW91ciBnZW5lcmF0ZWQgUXVpY2sgU3RhcnQgcHJvamVjdC48L3A+Cgo8aDMgaWQ9ImludGVsbGlqLWlkZWEiPkludGVsbGlKIElERUE8L2gzPgoKPHA+SW50ZWxsaUogSURFQSBoYXMgbmF0aXZlIHN1cHBvcnQgZm9yIE1hdmVuIHByb2plY3RzLiBZb3UganVzdCBwb2ludCB0aGUKb3BlbiBwcm9qZWN0IGRpYWxvZyB0byB0aGUgcGxhY2Ugd2hlcmUgeW91IGdlbmVyYXRlZCB0aGUgUXVpY2sgU3RhcnQKcHJvamVjdCBhbmQgb3BlbiB0aGUgcG9tLnhtbCBmaWxlLiBJREVBIHdpbGwgdGhlbiBvcGVuIHRoZSBwcm9qZWN0IGFzCmFueSBvdGhlciBKYXZhIHByb2plY3QuPC9wPgoKPGgzIGlkPSJuZXRiZWFucyI+TmV0YmVhbnM8L2gzPgoKPHA+TmV0YmVhbnMgaGFzIG5hdGl2ZSBzdXBwb3J0IGZvciBNYXZlbiBwcm9qZWN0cy4gWW91IGp1c3QgcG9pbnQgdGhlIG9wZW4KcHJvamVjdCBkaWFsb2cgdG8gdGhlIHBsYWNlIHdoZXJlIHlvdSBnZW5lcmF0ZWQgdGhlIFF1aWNrIFN0YXJ0IHByb2plY3QKYW5kIG9wZW4gdGhlIHBvbS54bWwgZmlsZS4gTmV0YmVhbnMgd2lsbCB0aGVuIG9wZW4gdGhlIHByb2plY3QgYXMgYW55Cm90aGVyIEphdmEgcHJvamVjdC48L3A+CgY6BkVU