IiIiUHl0aG9uU2xhdmUucHkKQW4gYXBwbGljYXRpb24gdGhhdCByZXNwb25kcyB0byB0aHJlZSB0eXBlcyBvZiBhcHBsZSBldmVudDogCgkncHl0aCcvJ0VYRUMnOiAJZXhlY3V0ZSBkaXJlY3QgcGFyYW1ldGVyIGFzIFB5dGhvbgoJJ2FldnQnLCAncXVpdCc6CXF1aXQKCSdhZXZ0JywgJ29kb2MnOglwZXJmb3JtIHB5dGhvbiBzY3JpcHRzCgpDb3B5cmlnaHQgqSAxOTk2LCBKdXN0IHZhbiBSb3NzdW0sIExldHRlcnJvcgoiIiIKCl9fdmVyc2lvbl9fID0gIjAuMS4zIgoKaW1wb3J0IEZyYW1lV29yawppbXBvcnQgc3lzCmltcG9ydCB0cmFjZWJhY2sKaW1wb3J0IGFldG9vbHMKaW1wb3J0IHN0cmluZwpmcm9tIENhcmJvbiBpbXBvcnQgQUUKaW1wb3J0IEVhc3lEaWFsb2dzCmltcG9ydCBvcwpmcm9tIENhcmJvbiBpbXBvcnQgUWQKZnJvbSB0eXBlcyBpbXBvcnQgKgpmcm9tIENhcmJvbi5FdmVudHMgaW1wb3J0IGNoYXJDb2RlTWFzaywgY21kS2V5CmltcG9ydCBNYWNPUwpmcm9tIENhcmJvbiBpbXBvcnQgRXZ0CgpkZWYgZHVtbXlmdW5jKCk6IHBhc3MKCm1vZHVsZWZpbGVuYW1lID0gZHVtbXlmdW5jLmZ1bmNfY29kZS5jb19maWxlbmFtZQoKZGVmIEludGVyYWN0KHRpbWVvdXQgPSA1MDAwMDAwMCk6CQkJIyB0aW1lb3V0IGFmdGVyIDEwIGRheXMuLi4KCUFFLkFFSW50ZXJhY3RXaXRoVXNlcih0aW1lb3V0KQoKCmNsYXNzIFB5dGhvblNsYXZlKEZyYW1lV29yay5BcHBsaWNhdGlvbik6CglkZWYgX19pbml0X18oc2VsZik6CgkJRnJhbWVXb3JrLkFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYpCgkJQUUuQUVJbnN0YWxsRXZlbnRIYW5kbGVyKCdweXRoJywgJ0VYRUMnLCBFeGVjSGFuZGxlcikKCQlBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoJ2FldnQnLCAncXVpdCcsIFF1aXRIYW5kbGVyKQoJCUFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcignYWV2dCcsICdvZG9jJywgT3BlbkRvY3VtZW50SGFuZGxlcikKCQoJZGVmIG1ha2V1c2VybWVudXMoc2VsZik6CgkJc2VsZi5maWxlbWVudSA9IG0gPSBGcmFtZVdvcmsuTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKCQlzZWxmLl9xdWl0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5fcXVpdCkKCQoJZGVmIGRvX2tIaWdoTGV2ZWxFdmVudChzZWxmLCBldmVudCk6CgkJKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKCQl0cnk6CgkJCUFFLkFFUHJvY2Vzc0FwcGxlRXZlbnQoZXZlbnQpCgkJZXhjZXB0IEFFLkVycm9yLCBkZXRhaWw6CgkJCXByaW50ICJBcHBsZSBFdmVudCB3YXMgbm90IGhhbmRsZWQsIGVycm9yOiIsIGRldGFpbAoJCglkZWYgZG9fa2V5KHNlbGYsIGV2ZW50KToKCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAoJCWMgPSBjaHIobWVzc2FnZSAmIGNoYXJDb2RlTWFzaykKCQlpZiBtb2RpZmllcnMgJiBjbWRLZXkgYW5kIGMgPT0gJy4nOgoJCQlyZXR1cm4KCQlGcmFtZVdvcmsuQXBwbGljYXRpb24uZG9fa2V5KHNlbGYsIGV2ZW50KQoJCglkZWYgaWRsZShzZWxmLCBldmVudCk6CgkJUWQuSW5pdEN1cnNvcigpCgkKCWRlZiBxdWl0KHNlbGYsICphcmdzKToKCQlyYWlzZSBzZWxmCgkKCWRlZiBnZXRhYm91dHRleHQoc2VsZik6CgkJcmV0dXJuICJBYm91dCBQeXRob25TbGF2ZYMiCgkKCWRlZiBkb19hYm91dChzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6CgkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiUHl0aG9uU2xhdmUgIiArIF9fdmVyc2lvbl9fICsgIlxyQ29weXJpZ2h0IKkgMTk5NiwgTGV0dGVycm9yLCBKdlIiKQoJCgpkZWYgRXhlY0hhbmRsZXIodGhlQXBwbGVFdmVudCwgdGhlUmVwbHkpOgoJcGFyYW1ldGVycywgYXJncyA9IGFldG9vbHMudW5wYWNrZXZlbnQodGhlQXBwbGVFdmVudCkKCWlmIHBhcmFtZXRlcnMuaGFzX2tleSgnLS0tLScpOgoJCWlmIHBhcmFtZXRlcnMuaGFzX2tleSgnTkFNRScpOgoJCQlwcmludCAnLS0tIGV4ZWN1dGluZyAiJyArIHBhcmFtZXRlcnNbJ05BTUUnXSArICciIC0tLScKCQllbHNlOgoJCQlwcmludCAnLS0tIGV4ZWN1dGluZyAiPHVua25vd24+IiAtLS0nCgkJc3R1ZmYgPSBwYXJhbWV0ZXJzWyctLS0tJ10KCQlNeUV4ZWMoc3R1ZmYgKyAiXG4iKQkJCSMgZXhlY3V0ZSBpbnB1dAoJCXByaW50ICctLS0gZG9uZSAtLS0nCglyZXR1cm4gMAoKZGVmIE15RXhlYyhzdHVmZik6CglzdHVmZiA9IHN0cmluZy5zcGxpdGZpZWxkcyhzdHVmZiwgJ1xyJykJIyBjb252ZXJ0IHJldHVybiBjaGFycwoJc3R1ZmYgPSBzdHJpbmcuam9pbmZpZWxkcyhzdHVmZiwgJ1xuJykJIyB0byBuZXdsaW5lIGNoYXJzCglJbnRlcmFjdCgpCglzYXZleWllbGQgPSBNYWNPUy5FbmFibGVBcHBzd2l0Y2goMSkKCXRyeToKCQlleGVjIHN0dWZmIGluIHt9CglleGNlcHQ6CgkJTWFjT1MuRW5hYmxlQXBwc3dpdGNoKHNhdmV5aWVsZCkKCQl0cmFjZWJhY2sucHJpbnRfZXhjKCkKCU1hY09TLkVuYWJsZUFwcHN3aXRjaChzYXZleWllbGQpCgpkZWYgT3BlbkRvY3VtZW50SGFuZGxlcih0aGVBcHBsZUV2ZW50LCB0aGVSZXBseSk6CglwYXJhbWV0ZXJzLCBhcmdzID0gYWV0b29scy51bnBhY2tldmVudCh0aGVBcHBsZUV2ZW50KQoJZG9jcyA9IHBhcmFtZXRlcnNbJy0tLS0nXQoJaWYgdHlwZShkb2NzKSA8PiBMaXN0VHlwZToKCQlkb2NzID0gW2RvY3NdCglmb3IgZG9jIGluIGRvY3M6CgkJZnNzLCBhID0gZG9jLlJlc29sdmUoKQoJCXBhdGggPSBmc3MuYXNfcGF0aG5hbWUoKQoJCWlmIHBhdGggPD4gbW9kdWxlZmlsZW5hbWU6CgkJCU15RXhlY0ZpbGUocGF0aCkKCXJldHVybiAwCgpkZWYgTXlFeGVjRmlsZShwYXRoKToKCXNhdmV5aWVsZCA9IE1hY09TLkVuYWJsZUFwcHN3aXRjaCgxKQoJc2F2ZXdkID0gb3MuZ2V0Y3dkKCkKCW9zLmNoZGlyKG9zLnBhdGguc3BsaXQocGF0aClbMF0pCglwcmludCAnLS0tIEV4ZWN1dGluZyBmaWxlICInICsgb3MucGF0aC5zcGxpdChwYXRoKVsxXSArICciJwoJdHJ5OgoJCWV4ZWNmaWxlKHBhdGgsIHsiX19uYW1lX18iOiAiX19tYWluX18ifSkKCWV4Y2VwdDoKCQl0cmFjZWJhY2sucHJpbnRfZXhjKCkKCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2goc2F2ZXlpZWxkKQoJTWFjT1MuRW5hYmxlQXBwc3dpdGNoKHNhdmV5aWVsZCkKCW9zLmNoZGlyKHNhdmV3ZCkKCXByaW50ICItLS0gZG9uZSAtLS0iCgpkZWYgUXVpdEhhbmRsZXIodGhlQXBwbGVFdmVudCwgdGhlUmVwbHkpOgoJc2xhdmUucXVpdCgpCglyZXR1cm4gMAoKCnNsYXZlID0gUHl0aG9uU2xhdmUoKQpwcmludCAiUHl0aG9uU2xhdmUiLCBfX3ZlcnNpb25fXywgInJlYWR5LiIKc2xhdmUubWFpbmxvb3AoKQo=